From 105965c947dec19458ff07cf265a87eb971792e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=97=AD?= <34770031+Blinue@users.noreply.github.com> Date: Mon, 5 Jun 2023 18:58:44 +0800 Subject: [PATCH 001/155] =?UTF-8?q?refactor:=20=E9=87=8D=E5=91=BD=E5=90=8D?= =?UTF-8?q?=E9=83=A8=E5=88=86=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Magpie.App/App.cpp | 6 +- src/Magpie.App/CaptionButtonsControl.idl | 1 - src/Magpie.App/HomeViewModel.cpp | 60 ++++++++--------- src/Magpie.App/HomeViewModel.h | 8 +-- src/Magpie.App/Magpie.App.vcxproj | 4 +- src/Magpie.App/Magpie.App.vcxproj.filters | 4 +- src/Magpie.App/ProfileViewModel.cpp | 4 +- .../{MagService.cpp => ScalingService.cpp} | 66 +++++++++---------- .../{MagService.h => ScalingService.h} | 18 ++--- src/Magpie.App/SettingsViewModel.cpp | 4 +- src/Magpie.Core/FrameSourceBase.cpp | 2 +- src/Magpie.Core/Magpie.Core.vcxproj | 4 +- src/Magpie.Core/Magpie.Core.vcxproj.filters | 4 +- .../{MagRuntime.cpp => ScalingRuntime.cpp} | 17 +++-- .../{MagRuntime.h => ScalingRuntime.h} | 8 +-- src/Magpie.Core/include/Magpie.Core.h | 2 +- 16 files changed, 105 insertions(+), 107 deletions(-) rename src/Magpie.App/{MagService.cpp => ScalingService.cpp} (79%) rename src/Magpie.App/{MagService.h => ScalingService.h} (90%) rename src/Magpie.Core/{MagRuntime.cpp => ScalingRuntime.cpp} (82%) rename src/Magpie.Core/{MagRuntime.h => ScalingRuntime.h} (90%) diff --git a/src/Magpie.App/App.cpp b/src/Magpie.App/App.cpp index e9ef56d2a..a2be34947 100644 --- a/src/Magpie.App/App.cpp +++ b/src/Magpie.App/App.cpp @@ -24,7 +24,7 @@ #include "ShortcutService.h" #include "AppSettings.h" #include "CommonSharedConstants.h" -#include "MagService.h" +#include "ScalingService.h" #include #include #include "EffectsService.h" @@ -100,14 +100,14 @@ StartUpOptions App::Initialize(int) { LocalizationService::Get().Initialize(); ShortcutService::Get().Initialize(); - MagService::Get().Initialize(); + ScalingService::Get().Initialize(); UpdateService::Get().Initialize(); return result; } void App::Uninitialize() { - MagService::Get().Uninitialize(); + ScalingService::Get().Uninitialize(); // 不显示托盘图标的情况下关闭主窗口仍会在后台驻留数秒,推测和 XAML Islands 有关 // 这里提前取消热键注册,这样关闭 Magpie 后立即重新打开不会注册热键失败 ShortcutService::Get().Uninitialize(); diff --git a/src/Magpie.App/CaptionButtonsControl.idl b/src/Magpie.App/CaptionButtonsControl.idl index ccc90ed69..e3e14de69 100644 --- a/src/Magpie.App/CaptionButtonsControl.idl +++ b/src/Magpie.App/CaptionButtonsControl.idl @@ -1,5 +1,4 @@ namespace Magpie.App { - // 为简单起见,确保这些值与 WM_NCHITTEST 所使用的值相同 enum CaptionButton { Minimize = 8, // HTMINBUTTON Maximize = 9, // HTMAXBUTTON diff --git a/src/Magpie.App/HomeViewModel.cpp b/src/Magpie.App/HomeViewModel.cpp index 69d18596c..fb4656111 100644 --- a/src/Magpie.App/HomeViewModel.cpp +++ b/src/Magpie.App/HomeViewModel.cpp @@ -4,7 +4,7 @@ #include "HomeViewModel.g.cpp" #endif #include "AppSettings.h" -#include "MagService.h" +#include "ScalingService.h" #include "Win32Utils.h" #include "StrUtils.h" #include "UpdateService.h" @@ -12,16 +12,16 @@ namespace winrt::Magpie::App::implementation { HomeViewModel::HomeViewModel() { - MagService& magService = MagService::Get(); + ScalingService& ScalingService = ScalingService::Get(); - _isRunningChangedRevoker = magService.IsRunningChanged( - auto_revoke, { this, &HomeViewModel::_MagService_IsRunningChanged }); - _isTimerOnRevoker = magService.IsTimerOnChanged( - auto_revoke, { this, &HomeViewModel::_MagService_IsTimerOnChanged }); - _timerTickRevoker = magService.TimerTick( - auto_revoke, { this, &HomeViewModel::_MagService_TimerTick }); - _wndToRestoreChangedRevoker = magService.WndToRestoreChanged( - auto_revoke, { this, &HomeViewModel::_MagService_WndToRestoreChanged }); + _isRunningChangedRevoker = ScalingService.IsRunningChanged( + auto_revoke, { this, &HomeViewModel::_ScalingService_IsRunningChanged }); + _isTimerOnRevoker = ScalingService.IsTimerOnChanged( + auto_revoke, { this, &HomeViewModel::_ScalingService_IsTimerOnChanged }); + _timerTickRevoker = ScalingService.TimerTick( + auto_revoke, { this, &HomeViewModel::_ScalingService_TimerTick }); + _wndToRestoreChangedRevoker = ScalingService.WndToRestoreChanged( + auto_revoke, { this, &HomeViewModel::_ScalingService_WndToRestoreChanged }); UpdateService& updateService = UpdateService::Get(); _showUpdateCard = updateService.IsShowOnHomePage(); @@ -36,23 +36,23 @@ HomeViewModel::HomeViewModel() { } bool HomeViewModel::IsTimerOn() const noexcept { - return MagService::Get().IsTimerOn(); + return ScalingService::Get().IsTimerOn(); } double HomeViewModel::TimerProgressRingValue() const noexcept { - MagService& magService = MagService::Get(); - return magService.IsTimerOn() ? magService.TimerProgress() : 1.0f; + ScalingService& ScalingService = ScalingService::Get(); + return ScalingService.IsTimerOn() ? ScalingService.TimerProgress() : 1.0f; } hstring HomeViewModel::TimerLabelText() const noexcept { - MagService& magService = MagService::Get(); - return to_hstring((int)std::ceil(magService.SecondsLeft())); + ScalingService& ScalingService = ScalingService::Get(); + return to_hstring((int)std::ceil(ScalingService.SecondsLeft())); } hstring HomeViewModel::TimerButtonText() const noexcept { - MagService& magService = MagService::Get(); + ScalingService& ScalingService = ScalingService::Get(); ResourceLoader resourceLoader = ResourceLoader::GetForCurrentView(); - if (magService.IsTimerOn()) { + if (ScalingService.IsTimerOn()) { return resourceLoader.GetString(L"Home_Timer_Cancel"); } else { hstring fmtStr = resourceLoader.GetString(L"Home_Timer_ButtonText"); @@ -64,15 +64,15 @@ hstring HomeViewModel::TimerButtonText() const noexcept { } bool HomeViewModel::IsNotRunning() const noexcept { - return !MagService::Get().IsRunning(); + return !ScalingService::Get().IsRunning(); } void HomeViewModel::ToggleTimer() const noexcept { - MagService& magService = MagService::Get(); - if (magService.IsTimerOn()) { - magService.StopTimer(); + ScalingService& ScalingService = ScalingService::Get(); + if (ScalingService.IsTimerOn()) { + ScalingService.StopTimer(); } else { - magService.StartTimer(); + ScalingService.StartTimer(); } } @@ -102,22 +102,22 @@ void HomeViewModel::IsAutoRestore(bool value) { } bool HomeViewModel::IsWndToRestore() const noexcept { - return (bool)MagService::Get().WndToRestore(); + return (bool)ScalingService::Get().WndToRestore(); } void HomeViewModel::ActivateRestore() const noexcept { - HWND wndToRestore = (HWND)MagService::Get().WndToRestore(); + HWND wndToRestore = (HWND)ScalingService::Get().WndToRestore(); if (wndToRestore) { Win32Utils::SetForegroundWindow(wndToRestore); } } void HomeViewModel::ClearRestore() const { - MagService::Get().ClearWndToRestore(); + ScalingService::Get().ClearWndToRestore(); } hstring HomeViewModel::RestoreWndDesc() const noexcept { - HWND wndToRestore = (HWND)MagService::Get().WndToRestore(); + HWND wndToRestore = (HWND)ScalingService::Get().WndToRestore(); if (!wndToRestore) { return L""; } @@ -181,7 +181,7 @@ void HomeViewModel::RemindMeLater() { ShowUpdateCard(false); } -void HomeViewModel::_MagService_IsTimerOnChanged(bool value) { +void HomeViewModel::_ScalingService_IsTimerOnChanged(bool value) { if (!value) { _propertyChangedEvent(*this, PropertyChangedEventArgs(L"TimerProgressRingValue")); } @@ -192,16 +192,16 @@ void HomeViewModel::_MagService_IsTimerOnChanged(bool value) { _propertyChangedEvent(*this, PropertyChangedEventArgs(L"IsTimerOn")); } -void HomeViewModel::_MagService_TimerTick(double) { +void HomeViewModel::_ScalingService_TimerTick(double) { _propertyChangedEvent(*this, PropertyChangedEventArgs(L"TimerProgressRingValue")); _propertyChangedEvent(*this, PropertyChangedEventArgs(L"TimerLabelText")); } -void HomeViewModel::_MagService_IsRunningChanged(bool) { +void HomeViewModel::_ScalingService_IsRunningChanged(bool) { _propertyChangedEvent(*this, PropertyChangedEventArgs(L"IsNotRunning")); } -void HomeViewModel::_MagService_WndToRestoreChanged(HWND) { +void HomeViewModel::_ScalingService_WndToRestoreChanged(HWND) { _propertyChangedEvent(*this, PropertyChangedEventArgs(L"IsWndToRestore")); _propertyChangedEvent(*this, PropertyChangedEventArgs(L"RestoreWndDesc")); } diff --git a/src/Magpie.App/HomeViewModel.h b/src/Magpie.App/HomeViewModel.h index 0c07bb42b..b4efdbddb 100644 --- a/src/Magpie.App/HomeViewModel.h +++ b/src/Magpie.App/HomeViewModel.h @@ -58,13 +58,13 @@ struct HomeViewModel : HomeViewModelT { void RemindMeLater(); private: - void _MagService_IsTimerOnChanged(bool value); + void _ScalingService_IsTimerOnChanged(bool value); - void _MagService_TimerTick(double); + void _ScalingService_TimerTick(double); - void _MagService_IsRunningChanged(bool); + void _ScalingService_IsRunningChanged(bool); - void _MagService_WndToRestoreChanged(HWND); + void _ScalingService_WndToRestoreChanged(HWND); event _propertyChangedEvent; diff --git a/src/Magpie.App/Magpie.App.vcxproj b/src/Magpie.App/Magpie.App.vcxproj index 0996df7a4..06a4f4f7b 100644 --- a/src/Magpie.App/Magpie.App.vcxproj +++ b/src/Magpie.App/Magpie.App.vcxproj @@ -154,7 +154,7 @@ - + NewProfileViewModel.idl Code @@ -308,7 +308,7 @@ - + NewProfileViewModel.idl Code diff --git a/src/Magpie.App/Magpie.App.vcxproj.filters b/src/Magpie.App/Magpie.App.vcxproj.filters index 96a0186b6..99177fb12 100644 --- a/src/Magpie.App/Magpie.App.vcxproj.filters +++ b/src/Magpie.App/Magpie.App.vcxproj.filters @@ -18,7 +18,7 @@ Helpers - + Services @@ -70,7 +70,7 @@ Helpers - + Services diff --git a/src/Magpie.App/ProfileViewModel.cpp b/src/Magpie.App/ProfileViewModel.cpp index 0d0da8ec6..bb4b5dad3 100644 --- a/src/Magpie.App/ProfileViewModel.cpp +++ b/src/Magpie.App/ProfileViewModel.cpp @@ -14,7 +14,7 @@ #include "Logger.h" #include "ScalingMode.h" #include -#include "MagService.h" +#include "ScalingService.h" #include "FileDialogHelper.h" using namespace winrt; @@ -454,7 +454,7 @@ void ProfileViewModel::IsAutoScale(bool value) { if (value) { // 立即检查前台窗口是否应自动缩放 - MagService::Get().CheckForeground(); + ScalingService::Get().CheckForeground(); } } diff --git a/src/Magpie.App/MagService.cpp b/src/Magpie.App/ScalingService.cpp similarity index 79% rename from src/Magpie.App/MagService.cpp rename to src/Magpie.App/ScalingService.cpp index 502da8012..33c261a74 100644 --- a/src/Magpie.App/MagService.cpp +++ b/src/Magpie.App/ScalingService.cpp @@ -1,5 +1,5 @@ #include "pch.h" -#include "MagService.h" +#include "ScalingService.h" #include "ShortcutService.h" #include "Win32Utils.h" #include "AppSettings.h" @@ -15,36 +15,36 @@ using namespace Windows::System::Threading; namespace winrt::Magpie::App { -void MagService::Initialize() { +void ScalingService::Initialize() { _dispatcher = CoreWindow::GetForCurrentThread().Dispatcher(); _countDownTimer.Interval(25ms); - _countDownTimer.Tick({ this, &MagService::_CountDownTimer_Tick }); + _countDownTimer.Tick({ this, &ScalingService::_CountDownTimer_Tick }); _checkForegroundTimer = ThreadPoolTimer::CreatePeriodicTimer( - { this, &MagService::_CheckForegroundTimer_Tick }, + { this, &ScalingService::_CheckForegroundTimer_Tick }, 50ms ); - AppSettings::Get().IsAutoRestoreChanged({ this, &MagService::_Settings_IsAutoRestoreChanged }); - _magRuntime.emplace(); - _magRuntime->IsRunningChanged({ this, &MagService::_MagRuntime_IsRunningChanged }); + AppSettings::Get().IsAutoRestoreChanged({ this, &ScalingService::_Settings_IsAutoRestoreChanged }); + _ScalingRuntime.emplace(); + _ScalingRuntime->IsRunningChanged({ this, &ScalingService::_ScalingRuntime_IsRunningChanged }); ShortcutService::Get().ShortcutActivated( - { this, &MagService::_ShortcutService_ShortcutPressed } + { this, &ScalingService::_ShortcutService_ShortcutPressed } ); // 立即检查前台窗口 _CheckForegroundTimer_Tick(nullptr); } -void MagService::Uninitialize() { +void ScalingService::Uninitialize() { _checkForegroundTimer.Cancel(); _countDownTimer.Stop(); - _magRuntime.reset(); + _ScalingRuntime.reset(); } -void MagService::StartTimer() { +void ScalingService::StartTimer() { if (_curCountdownSeconds != 0) { return; } @@ -55,7 +55,7 @@ void MagService::StartTimer() { _isTimerOnChangedEvent(true); } -void MagService::StopTimer() { +void ScalingService::StopTimer() { if (_curCountdownSeconds == 0) { return; } @@ -65,7 +65,7 @@ void MagService::StopTimer() { _isTimerOnChangedEvent(false); } -double MagService::SecondsLeft() const noexcept { +double ScalingService::SecondsLeft() const noexcept { using namespace std::chrono; if (!IsTimerOn()) { @@ -78,16 +78,16 @@ double MagService::SecondsLeft() const noexcept { return msLeft / 1000.0; } -void MagService::ClearWndToRestore() { +void ScalingService::ClearWndToRestore() { _WndToRestore(NULL); } -void MagService::CheckForeground() { +void ScalingService::CheckForeground() { _hwndChecked = NULL; _CheckForegroundTimer_Tick(nullptr); } -void MagService::_WndToRestore(HWND value) { +void ScalingService::_WndToRestore(HWND value) { if (_hwndToRestore == value) { return; } @@ -96,16 +96,16 @@ void MagService::_WndToRestore(HWND value) { _wndToRestoreChangedEvent(_hwndToRestore); } -void MagService::_ShortcutService_ShortcutPressed(ShortcutAction action) { - if (!_magRuntime) { +void ScalingService::_ShortcutService_ShortcutPressed(ShortcutAction action) { + if (!_ScalingRuntime) { return; } switch (action) { case ShortcutAction::Scale: { - if (_magRuntime->IsRunning()) { - _magRuntime->Stop(); + if (_ScalingRuntime->IsRunning()) { + _ScalingRuntime->Stop(); return; } @@ -114,8 +114,8 @@ void MagService::_ShortcutService_ShortcutPressed(ShortcutAction action) { } case ShortcutAction::Overlay: { - if (_magRuntime->IsRunning()) { - _magRuntime->ToggleOverlay(); + if (_ScalingRuntime->IsRunning()) { + _ScalingRuntime->ToggleOverlay(); return; } break; @@ -125,7 +125,7 @@ void MagService::_ShortcutService_ShortcutPressed(ShortcutAction action) { } } -void MagService::_CountDownTimer_Tick(IInspectable const&, IInspectable const&) { +void ScalingService::_CountDownTimer_Tick(IInspectable const&, IInspectable const&) { double timeLeft = SecondsLeft(); // 剩余时间在 10 ms 以内计时结束 @@ -138,8 +138,8 @@ void MagService::_CountDownTimer_Tick(IInspectable const&, IInspectable const&) _timerTickEvent(timeLeft); } -fire_and_forget MagService::_CheckForegroundTimer_Tick(ThreadPoolTimer const& timer) { - if (!_magRuntime || _magRuntime->IsRunning()) { +fire_and_forget ScalingService::_CheckForegroundTimer_Tick(ThreadPoolTimer const& timer) { + if (!_ScalingRuntime || _ScalingRuntime->IsRunning()) { co_return; } @@ -185,17 +185,17 @@ fire_and_forget MagService::_CheckForegroundTimer_Tick(ThreadPoolTimer const& ti _hwndChecked = hwndFore; } -void MagService::_Settings_IsAutoRestoreChanged(bool) { +void ScalingService::_Settings_IsAutoRestoreChanged(bool) { if (AppSettings::Get().IsAutoRestore()) { // 立即生效,即使正处于缩放状态 - _hwndCurSrc = _magRuntime->HwndSrc(); + _hwndCurSrc = _ScalingRuntime->HwndSrc(); } else { _hwndCurSrc = NULL; _WndToRestore(NULL); } } -fire_and_forget MagService::_MagRuntime_IsRunningChanged(bool isRunning) { +fire_and_forget ScalingService::_ScalingRuntime_IsRunningChanged(bool isRunning) { co_await _dispatcher; if (isRunning) { @@ -205,7 +205,7 @@ fire_and_forget MagService::_MagRuntime_IsRunningChanged(bool isRunning) { _WndToRestore(NULL); } - _hwndCurSrc = _magRuntime->HwndSrc(); + _hwndCurSrc = _ScalingRuntime->HwndSrc(); } else { HWND curSrcWnd = _hwndCurSrc; _hwndCurSrc = NULL; @@ -238,7 +238,7 @@ fire_and_forget MagService::_MagRuntime_IsRunningChanged(bool isRunning) { _isRunningChangedEvent(isRunning); } -bool MagService::_StartScale(HWND hWnd, const Profile& profile) { +bool ScalingService::_StartScale(HWND hWnd, const Profile& profile) { if (profile.scalingMode < 0) { return false; } @@ -316,11 +316,11 @@ bool MagService::_StartScale(HWND hWnd, const Profile& profile) { options.IsSimulateExclusiveFullscreen(settings.IsSimulateExclusiveFullscreen()); _isAutoScaling = profile.isAutoScale; - _magRuntime->Run(hWnd, options); + _ScalingRuntime->Start(hWnd, options); return true; } -void MagService::_ScaleForegroundWindow() { +void ScalingService::_ScaleForegroundWindow() { HWND hWnd = GetForegroundWindow(); if (!_CheckSrcWnd(hWnd)) { return; @@ -330,7 +330,7 @@ void MagService::_ScaleForegroundWindow() { _StartScale(hWnd, profile); } -bool MagService::_CheckSrcWnd(HWND hWnd) noexcept { +bool ScalingService::_CheckSrcWnd(HWND hWnd) noexcept { if (!hWnd || !IsWindow(hWnd)) { return false; } diff --git a/src/Magpie.App/MagService.h b/src/Magpie.App/ScalingService.h similarity index 90% rename from src/Magpie.App/MagService.h rename to src/Magpie.App/ScalingService.h index 3d520fba9..24f8ff377 100644 --- a/src/Magpie.App/MagService.h +++ b/src/Magpie.App/ScalingService.h @@ -7,15 +7,15 @@ namespace winrt::Magpie::App { struct Profile; -class MagService { +class ScalingService { public: - static MagService& Get() noexcept { - static MagService instance; + static ScalingService& Get() noexcept { + static ScalingService instance; return instance; } - MagService(const MagService&) = delete; - MagService(MagService&&) = delete; + ScalingService(const ScalingService&) = delete; + ScalingService(ScalingService&&) = delete; void Initialize(); @@ -102,14 +102,14 @@ class MagService { } bool IsRunning() const noexcept { - return _magRuntime->IsRunning(); + return _ScalingRuntime->IsRunning(); } // 强制重新检查前台窗口 void CheckForeground(); private: - MagService() = default; + ScalingService() = default; void _WndToRestore(HWND value); @@ -121,7 +121,7 @@ class MagService { void _Settings_IsAutoRestoreChanged(bool); - fire_and_forget _MagRuntime_IsRunningChanged(bool isRunning); + fire_and_forget _ScalingRuntime_IsRunningChanged(bool isRunning); bool _StartScale(HWND hWnd, const Profile& profile); @@ -129,7 +129,7 @@ class MagService { bool _CheckSrcWnd(HWND hWnd) noexcept; - std::optional<::Magpie::Core::MagRuntime> _magRuntime; + std::optional<::Magpie::Core::ScalingRuntime> _ScalingRuntime; CoreDispatcher _dispatcher{ nullptr }; DispatcherTimer _countDownTimer; diff --git a/src/Magpie.App/SettingsViewModel.cpp b/src/Magpie.App/SettingsViewModel.cpp index 50b6de7f5..e3de4c8a1 100644 --- a/src/Magpie.App/SettingsViewModel.cpp +++ b/src/Magpie.App/SettingsViewModel.cpp @@ -8,7 +8,7 @@ #include "Win32Utils.h" #include "CommonSharedConstants.h" #include "LocalizationService.h" -#include "MagService.h" +#include "ScalingService.h" namespace winrt::Magpie::App::implementation { @@ -178,7 +178,7 @@ void SettingsViewModel::IsAllowScalingMaximized(bool value) noexcept { AppSettings::Get().IsAllowScalingMaximized(value); if (value) { - MagService::Get().CheckForeground(); + ScalingService::Get().CheckForeground(); } } diff --git a/src/Magpie.Core/FrameSourceBase.cpp b/src/Magpie.Core/FrameSourceBase.cpp index fa24945c7..31a19d94b 100644 --- a/src/Magpie.Core/FrameSourceBase.cpp +++ b/src/Magpie.Core/FrameSourceBase.cpp @@ -29,7 +29,7 @@ FrameSourceBase::~FrameSourceBase() { // 还原窗口大小调整 if (_windowResizingDisabled) { // 缩放 Magpie 主窗口时会在 SetWindowLongPtr 中卡住,似乎是 Win11 的 bug - // 将在 MagService::_MagRuntime_IsRunningChanged 还原主窗口样式 + // 将在 ScalingService::_ScalingRuntime_IsRunningChanged 还原主窗口样式 if (Win32Utils::GetWndClassName(hwndSrc) != CommonSharedConstants::MAIN_WINDOW_CLASS_NAME) { LONG_PTR style = GetWindowLongPtr(hwndSrc, GWL_STYLE); if (!(style & WS_THICKFRAME)) { diff --git a/src/Magpie.Core/Magpie.Core.vcxproj b/src/Magpie.Core/Magpie.Core.vcxproj index c1e203618..e3c9a31e0 100644 --- a/src/Magpie.Core/Magpie.Core.vcxproj +++ b/src/Magpie.Core/Magpie.Core.vcxproj @@ -104,7 +104,7 @@ - + @@ -137,7 +137,7 @@ Create - + diff --git a/src/Magpie.Core/Magpie.Core.vcxproj.filters b/src/Magpie.Core/Magpie.Core.vcxproj.filters index cbd551017..ca10b8ce8 100644 --- a/src/Magpie.Core/Magpie.Core.vcxproj.filters +++ b/src/Magpie.Core/Magpie.Core.vcxproj.filters @@ -27,7 +27,7 @@ Include - + @@ -97,7 +97,7 @@ - + diff --git a/src/Magpie.Core/MagRuntime.cpp b/src/Magpie.Core/ScalingRuntime.cpp similarity index 82% rename from src/Magpie.Core/MagRuntime.cpp rename to src/Magpie.Core/ScalingRuntime.cpp index 7a534d652..68684cd3a 100644 --- a/src/Magpie.Core/MagRuntime.cpp +++ b/src/Magpie.Core/ScalingRuntime.cpp @@ -1,16 +1,15 @@ #include "pch.h" #include #include "MagApp.h" -#include "MagRuntime.h" +#include "ScalingRuntime.h" #include "Logger.h" - namespace Magpie::Core { -MagRuntime::MagRuntime() : _magWindThread(std::bind(&MagRuntime::_MagWindThreadProc, this)) { +ScalingRuntime::ScalingRuntime() : _magWindThread(std::bind(&ScalingRuntime::_MagWindThreadProc, this)) { } -MagRuntime::~MagRuntime() { +ScalingRuntime::~ScalingRuntime() { Stop(); if (_magWindThread.joinable()) { @@ -23,7 +22,7 @@ MagRuntime::~MagRuntime() { } } -void MagRuntime::Run(HWND hwndSrc, const MagOptions& options) { +void ScalingRuntime::Start(HWND hwndSrc, const MagOptions& options) { if (_running) { return; } @@ -38,7 +37,7 @@ void MagRuntime::Run(HWND hwndSrc, const MagOptions& options) { }); } -void MagRuntime::ToggleOverlay() { +void ScalingRuntime::ToggleOverlay() { if (!_running) { return; } @@ -49,7 +48,7 @@ void MagRuntime::ToggleOverlay() { }); } -void MagRuntime::Stop() { +void ScalingRuntime::Stop() { if (!_running) { return; } @@ -60,7 +59,7 @@ void MagRuntime::Stop() { }); } -void MagRuntime::_MagWindThreadProc() noexcept { +void ScalingRuntime::_MagWindThreadProc() noexcept { winrt::init_apartment(winrt::apartment_type::single_threaded); DispatcherQueueOptions dqOptions{}; @@ -111,7 +110,7 @@ void MagRuntime::_MagWindThreadProc() noexcept { } } -void MagRuntime::_EnsureDispatcherQueue() const noexcept { +void ScalingRuntime::_EnsureDispatcherQueue() const noexcept { while (!_dqc) { Sleep(1); } diff --git a/src/Magpie.Core/MagRuntime.h b/src/Magpie.Core/ScalingRuntime.h similarity index 90% rename from src/Magpie.Core/MagRuntime.h rename to src/Magpie.Core/ScalingRuntime.h index b3109acaa..90ebb0fc1 100644 --- a/src/Magpie.Core/MagRuntime.h +++ b/src/Magpie.Core/ScalingRuntime.h @@ -9,16 +9,16 @@ namespace Magpie::Core { struct MagOptions; -class API_DECLSPEC MagRuntime { +class API_DECLSPEC ScalingRuntime { public: - MagRuntime(); - ~MagRuntime(); + ScalingRuntime(); + ~ScalingRuntime(); HWND HwndSrc() const { return _running ? _hwndSrc : 0; } - void Run(HWND hwndSrc, const MagOptions& options); + void Start(HWND hwndSrc, const MagOptions& options); void ToggleOverlay(); diff --git a/src/Magpie.Core/include/Magpie.Core.h b/src/Magpie.Core/include/Magpie.Core.h index 5b660027d..9305660bf 100644 --- a/src/Magpie.Core/include/Magpie.Core.h +++ b/src/Magpie.Core/include/Magpie.Core.h @@ -1,6 +1,6 @@ #pragma once #include "../MagOptions.h" -#include "../MagRuntime.h" +#include "../ScalingRuntime.h" #include "../LoggerHelper.h" #include "../EffectCompiler.h" #include "../EffectDesc.h" From a9d85dde440bc2563d1c6da698318f3e4d171082 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=97=AD?= <34770031+Blinue@users.noreply.github.com> Date: Mon, 5 Jun 2023 19:39:27 +0800 Subject: [PATCH 002/155] =?UTF-8?q?chore:=20=E5=88=A0=E9=99=A4=E7=8E=B0?= =?UTF-8?q?=E6=9C=89=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Magpie.Core/CursorManager.cpp | 896 ------------- src/Magpie.Core/CursorManager.h | 107 -- .../DesktopDuplicationFrameSource.cpp | 389 ------ .../DesktopDuplicationFrameSource.h | 63 - src/Magpie.Core/DeviceResources.cpp | 446 ------- src/Magpie.Core/DeviceResources.h | 78 -- .../DwmSharedSurfaceFrameSource.cpp | 107 -- src/Magpie.Core/DwmSharedSurfaceFrameSource.h | 46 - src/Magpie.Core/EffectDrawer.cpp | 457 ------- src/Magpie.Core/EffectDrawer.h | 57 - src/Magpie.Core/ExclModeHack.cpp | 65 - src/Magpie.Core/ExclModeHack.h | 16 - src/Magpie.Core/FrameSourceBase.cpp | 301 ----- src/Magpie.Core/FrameSourceBase.h | 63 - src/Magpie.Core/GDIFrameSource.cpp | 112 -- src/Magpie.Core/GDIFrameSource.h | 37 - src/Magpie.Core/GPUTimer.cpp | 170 --- src/Magpie.Core/GPUTimer.h | 84 -- .../GraphicsCaptureFrameSource.cpp | 413 ------ src/Magpie.Core/GraphicsCaptureFrameSource.h | 65 - src/Magpie.Core/ImGuiBackend.cpp | 416 ------ src/Magpie.Core/ImGuiBackend.h | 40 - src/Magpie.Core/ImGuiImpl.cpp | 336 ----- src/Magpie.Core/ImGuiImpl.h | 36 - src/Magpie.Core/MagApp.cpp | 582 --------- src/Magpie.Core/MagApp.h | 126 -- src/Magpie.Core/Magpie.Core.vcxproj | 30 - src/Magpie.Core/Magpie.Core.vcxproj.filters | 62 - src/Magpie.Core/OverlayDrawer.cpp | 1154 ----------------- src/Magpie.Core/OverlayDrawer.h | 77 -- src/Magpie.Core/Renderer.cpp | 509 -------- src/Magpie.Core/Renderer.h | 72 - src/Magpie.Core/ScalingRuntime.cpp | 35 +- src/Magpie.Core/ScalingRuntime.h | 2 +- src/Magpie.Core/TextureLoader.cpp | 21 +- 35 files changed, 37 insertions(+), 7433 deletions(-) delete mode 100644 src/Magpie.Core/CursorManager.cpp delete mode 100644 src/Magpie.Core/CursorManager.h delete mode 100644 src/Magpie.Core/DesktopDuplicationFrameSource.cpp delete mode 100644 src/Magpie.Core/DesktopDuplicationFrameSource.h delete mode 100644 src/Magpie.Core/DeviceResources.cpp delete mode 100644 src/Magpie.Core/DeviceResources.h delete mode 100644 src/Magpie.Core/DwmSharedSurfaceFrameSource.cpp delete mode 100644 src/Magpie.Core/DwmSharedSurfaceFrameSource.h delete mode 100644 src/Magpie.Core/EffectDrawer.cpp delete mode 100644 src/Magpie.Core/EffectDrawer.h delete mode 100644 src/Magpie.Core/ExclModeHack.cpp delete mode 100644 src/Magpie.Core/ExclModeHack.h delete mode 100644 src/Magpie.Core/FrameSourceBase.cpp delete mode 100644 src/Magpie.Core/FrameSourceBase.h delete mode 100644 src/Magpie.Core/GDIFrameSource.cpp delete mode 100644 src/Magpie.Core/GDIFrameSource.h delete mode 100644 src/Magpie.Core/GPUTimer.cpp delete mode 100644 src/Magpie.Core/GPUTimer.h delete mode 100644 src/Magpie.Core/GraphicsCaptureFrameSource.cpp delete mode 100644 src/Magpie.Core/GraphicsCaptureFrameSource.h delete mode 100644 src/Magpie.Core/ImGuiBackend.cpp delete mode 100644 src/Magpie.Core/ImGuiBackend.h delete mode 100644 src/Magpie.Core/ImGuiImpl.cpp delete mode 100644 src/Magpie.Core/ImGuiImpl.h delete mode 100644 src/Magpie.Core/MagApp.cpp delete mode 100644 src/Magpie.Core/MagApp.h delete mode 100644 src/Magpie.Core/OverlayDrawer.cpp delete mode 100644 src/Magpie.Core/OverlayDrawer.h delete mode 100644 src/Magpie.Core/Renderer.cpp delete mode 100644 src/Magpie.Core/Renderer.h diff --git a/src/Magpie.Core/CursorManager.cpp b/src/Magpie.Core/CursorManager.cpp deleted file mode 100644 index b9c2deee2..000000000 --- a/src/Magpie.Core/CursorManager.cpp +++ /dev/null @@ -1,896 +0,0 @@ -#include "pch.h" -#include "CursorManager.h" -#include "MagApp.h" -#include "FrameSourceBase.h" -#include "Renderer.h" -#include "Logger.h" -#include "Win32Utils.h" -#include "DeviceResources.h" -#include "GraphicsCaptureFrameSource.h" -#include "WindowHelper.h" -#include "Utils.h" -#include - -#pragma comment(lib, "Magnification.lib") - - -namespace Magpie::Core { - -// 将源窗口的光标位置映射到缩放后的光标位置 -// 当光标位于源窗口之外,与源窗口的距离不会缩放 -static POINT SrcToHost(POINT pt, bool screenCoord) { - const RECT& srcFrameRect = MagApp::Get().GetFrameSource().GetSrcFrameRect(); - const RECT& virtualOutputRect = MagApp::Get().GetRenderer().GetVirtualOutputRect(); - const RECT& hostRect = MagApp::Get().GetHostWndRect(); - - POINT result; - if (screenCoord) { - result = { hostRect.left, hostRect.top }; - } else { - result = {}; - } - - if (pt.x >= srcFrameRect.right) { - result.x += hostRect.right - hostRect.left + pt.x - srcFrameRect.right; - } else if (pt.x < srcFrameRect.left) { - result.x += pt.x - srcFrameRect.left; - } else { - double pos = double(pt.x - srcFrameRect.left) / (srcFrameRect.right - srcFrameRect.left - 1); - result.x += std::lround(pos * (virtualOutputRect.right - virtualOutputRect.left - 1)) + virtualOutputRect.left; - } - - if (pt.y >= srcFrameRect.bottom) { - result.y += hostRect.bottom - hostRect.top + pt.y - srcFrameRect.bottom; - } else if (pt.y < srcFrameRect.top) { - result.y += pt.y - srcFrameRect.top; - } else { - double pos = double(pt.y - srcFrameRect.top) / (srcFrameRect.bottom - srcFrameRect.top - 1); - result.y += std::lround(pos * (virtualOutputRect.bottom - virtualOutputRect.top - 1)) + virtualOutputRect.top; - } - - return result; -} - -// 将缩放后的光标位置映射到源窗口 -static POINT HostToSrc(POINT pt) { - const RECT& srcFrameRect = MagApp::Get().GetFrameSource().GetSrcFrameRect(); - const RECT& hostRect = MagApp::Get().GetHostWndRect(); - const RECT& virtualOutputRect = MagApp::Get().GetRenderer().GetVirtualOutputRect(); - RECT outputRect = MagApp::Get().GetRenderer().GetOutputRect(); - - const SIZE srcFrameSize = Win32Utils::GetSizeOfRect(srcFrameRect); - const SIZE virtualOutputSize = Win32Utils::GetSizeOfRect(virtualOutputRect); - const SIZE outputSize = Win32Utils::GetSizeOfRect(outputRect); - - pt.x -= hostRect.left; - pt.y -= hostRect.top; - - POINT result = { srcFrameRect.left, srcFrameRect.top }; - - if (pt.x >= outputRect.right) { - result.x += srcFrameSize.cx + pt.x - outputRect.right; - } else if (pt.x < outputRect.left) { - result.x += pt.x - outputRect.left; - } else { - double pos = double(pt.x - virtualOutputRect.left) / (virtualOutputSize.cx - 1); - result.x += std::lround(pos * (srcFrameSize.cx - 1)); - } - - if (pt.y >= outputRect.bottom) { - result.y += srcFrameSize.cx + pt.y - outputRect.bottom; - } else if (pt.y < outputRect.top) { - result.y += pt.y - outputRect.top; - } else { - double pos = double(pt.y - virtualOutputRect.top) / (virtualOutputSize.cy - 1); - result.y += std::lround(pos * (srcFrameSize.cy - 1)); - } - - return result; -} - -CursorManager::~CursorManager() { - if (_curClips != RECT{}) { - ClipCursor(nullptr); - } - - if (_isUnderCapture) { - POINT pt{}; - if (!::GetCursorPos(&pt)) { - Logger::Get().Win32Error("GetCursorPos 失败"); - } - _StopCapture(pt, true); - } - - MagApp::Get().UnregisterWndProcHandler(_handlerId); -} - -static std::optional HostWndProc(HWND /*hWnd*/, UINT message, WPARAM /*wParam*/, LPARAM /*lParam*/) { - if (MagApp::Get().GetOptions().Is3DGameMode() && MagApp::Get().GetRenderer().IsUIVisiable()) { - return std::nullopt; - } - - if (message == WM_LBUTTONDOWN || message == WM_RBUTTONDOWN) { - // 主窗口会在非常特定的情况下收到光标消息: - // 1. 未处于捕获状态 - // 2. 缩放后的位置未被遮挡而缩放前的位置被遮挡 - // 或用户操作 UI 时 - HWND hwndSrc = MagApp::Get().GetHwndSrc(); - HWND hwndForground = GetForegroundWindow(); - if (hwndForground != hwndSrc) { - if (!Win32Utils::SetForegroundWindow(hwndSrc)) { - // 设置前台窗口失败,可能是因为前台窗口是开始菜单 - if (WindowHelper::IsStartMenu(hwndForground)) { - using namespace std::chrono; - - // 限制触发频率 - static steady_clock::time_point prevTimePoint{}; - auto now = steady_clock::now(); - if (duration_cast(now - prevTimePoint).count() >= 1000) { - prevTimePoint = now; - - // 模拟按键关闭开始菜单 - INPUT inputs[4]{}; - inputs[0].type = INPUT_KEYBOARD; - inputs[0].ki.wVk = VK_LWIN; - inputs[1].type = INPUT_KEYBOARD; - inputs[1].ki.wVk = VK_LWIN; - inputs[1].ki.dwFlags = KEYEVENTF_KEYUP; - SendInput((UINT)std::size(inputs), inputs, sizeof(INPUT)); - - // 等待系统处理 - Sleep(1); - } - - SetForegroundWindow(hwndSrc); - } - } - - return 0; - } - - if (!MagApp::Get().GetOptions().IsDebugMode()) { - SetWindowPos(MagApp::Get().GetHwndHost(), HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOREDRAW); - } - } - - return std::nullopt; -} - -bool CursorManager::Initialize() { - _handlerId = MagApp::Get().RegisterWndProcHandler(HostWndProc); - - if (MagApp::Get().GetOptions().Is3DGameMode()) { - POINT cursorPos; - ::GetCursorPos(&cursorPos); - _StartCapture(cursorPos); - } - - Logger::Get().Info("CursorManager 初始化完成"); - return true; -} - -// 检测光标位于哪个窗口上,是否检测缩放窗口由 clickThroughHost 指定 -static HWND WindowFromPoint(POINT pt, bool clickThroughHost) { - struct EnumData { - HWND result; - POINT pt; - bool clickThroughHost; - } data{ NULL, pt, clickThroughHost }; - - EnumWindows([](HWND hWnd, LPARAM lParam) { - EnumData& data = *(EnumData*)lParam; - if (hWnd == MagApp::Get().GetHwndHost()) { - if (PtInRect(&MagApp::Get().GetHostWndRect(), data.pt) && !data.clickThroughHost) { - data.result = hWnd; - return FALSE; - } else { - return TRUE; - } - } - - // 跳过不可见的窗口 - if (!(GetWindowLongPtr(hWnd, GWL_STYLE) & WS_VISIBLE)) { - return TRUE; - } - - // 跳过透明窗口 - if (GetWindowLongPtr(hWnd, GWL_EXSTYLE) & WS_EX_TRANSPARENT) { - return TRUE; - } - - // 跳过被冻结的窗口 - UINT isCloaked{}; - DwmGetWindowAttribute(hWnd, DWMWA_CLOAKED, &isCloaked, sizeof(isCloaked)); - if (isCloaked != 0) { - return TRUE; - } - - // 对于分层窗口(Layered Window),没有公开的 API 可以检测某个像素是否透明。 - // ChildWindowFromPointEx 是一个替代方案,当命中透明像素时它将返回 NULL。 - // Windows 内部有 LayerHitTest (https://github.com/tongzx/nt5src/blob/daad8a087a4e75422ec96b7911f1df4669989611/Source/XPSP1/NT/windows/core/ntuser/kernel/winwhere.c#L21) 方法用于对分层窗口执行命中测试,虽然它没有被公开,但 ChildWindowFromPointEx 使用了它 - // 在比 Magpie 权限更高的窗口上使用会失败,失败则假设不是分层窗口 - POINT clientPt = data.pt; - ScreenToClient(hWnd, &clientPt); - SetLastError(0); - if (!ChildWindowFromPointEx(hWnd, clientPt, CWP_SKIPDISABLED | CWP_SKIPINVISIBLE | CWP_SKIPTRANSPARENT)) { - if (GetLastError() == 0) { - // 命中了透明像素 - return TRUE; - } - - // 源窗口的权限比 Magpie 更高,回落到 GetWindowRect - RECT windowRect{}; - if (!GetWindowRect(hWnd, &windowRect) || !PtInRect(&windowRect, data.pt)) { - return TRUE; - } - } - - data.result = hWnd; - return FALSE; - }, (LPARAM)&data); - - return data.result; -} - -void CursorManager::OnBeginFrame() { - _UpdateCursorClip(); - - if (!MagApp::Get().GetOptions().IsDrawCursor() || !_isShowCursor || !_isUnderCapture) { - // 不绘制光标 - _curCursor = NULL; - return; - } - - if (MagApp::Get().GetOptions().Is3DGameMode()) { - HWND hwndFore = GetForegroundWindow(); - if (hwndFore != MagApp::Get().GetHwndHost() && hwndFore != MagApp::Get().GetHwndSrc()) { - _curCursor = NULL; - return; - } - } - - CURSORINFO ci{}; - ci.cbSize = sizeof(ci); - if (!::GetCursorInfo(&ci)) { - Logger::Get().Win32Error("GetCursorInfo 失败"); - return; - } - - if (!ci.hCursor || ci.flags != CURSOR_SHOWING) { - _curCursor = NULL; - return; - } - - if (!_ResolveCursor(ci.hCursor, false)) { - Logger::Get().Error("解析光标失败"); - _curCursor = NULL; - return; - } - - _curCursorPos = SrcToHost(ci.ptScreenPos, false); - _curCursor = ci.hCursor; -} - -bool CursorManager::GetCursorTexture(ID3D11Texture2D** texture, CursorManager::CursorType& cursorType) { - if (_curCursorInfo->texture) { - *texture = _curCursorInfo->texture.get(); - cursorType = _curCursorInfo->type; - return true; - } - - if (!_ResolveCursor(_curCursor, true)) { - return false; - } else { - const char* cursorTypes[] = { "Color", "Masked Color", "Monochrome" }; - Logger::Get().Info(fmt::format("已解析光标:{}\n\t类型:{}", - (void*)_curCursor, cursorTypes[(int)_curCursorInfo->type])); - } - - *texture = _curCursorInfo->texture.get(); - cursorType = _curCursorInfo->type; - return true; -} - -void CursorManager::OnCursorCapturedOnOverlay() { - _isCapturedOnOverlay = true; - - // 用户拖动 UI 时将光标限制在输出区域内 - const RECT& outputRect = MagApp::Get().GetRenderer().GetOutputRect(); - const RECT& hostRect = MagApp::Get().GetHostWndRect(); - _curClips = { - outputRect.left + hostRect.left, - outputRect.top + hostRect.top, - outputRect.right + hostRect.left, - outputRect.bottom + hostRect.top - }; - ClipCursor(&_curClips); -} - -void CursorManager::OnCursorReleasedOnOverlay() { - _isCapturedOnOverlay = false; - _UpdateCursorClip(); -} - -void CursorManager::OnCursorHoverOverlay() { - _isOnOverlay = true; - _UpdateCursorClip(); -} - -void CursorManager::OnCursorLeaveOverlay() { - _isOnOverlay = false; - _UpdateCursorClip(); -} - -static void ShowSystemCursor(bool show) { - static void (WINAPI* const showSystemCursor)(BOOL bShow) = []()->void(WINAPI*)(BOOL) { - HMODULE lib = LoadLibrary(L"user32.dll"); - if (!lib) { - return nullptr; - } - - return (void(WINAPI*)(BOOL))GetProcAddress(lib, "ShowSystemCursor"); - }(); - - if (showSystemCursor) { - showSystemCursor((BOOL)show); - } else { - // 获取 ShowSystemCursor 失败则回落到 Magnification API - static bool initialized = []() { - if (!MagInitialize()) { - Logger::Get().Win32Error("MagInitialize 失败"); - return false; - } - - return true; - }(); - - if (initialized) { - MagShowSystemCursor(show); - } - } - - if (show) { - MagApp::Get().Dispatcher().TryEnqueue([]() { - if (!MagApp::Get().GetHwndHost()) { - return; - } - - // 修复有时不会立即显示光标的问题 - FrameSourceBase& frameSource = MagApp::Get().GetFrameSource(); - if (frameSource.GetName() == GraphicsCaptureFrameSource::NAME) { - GraphicsCaptureFrameSource& wgc = (GraphicsCaptureFrameSource&)frameSource; - // WGC 需要重启捕获 - // 没有用户报告这个问题,只在我的电脑上出现,可能和驱动有关 - wgc.StopCapture(); - wgc.StartCapture(); - } else { - SystemParametersInfo(SPI_SETCURSORS, 0, 0, 0); - } - }); - } -} - -void CursorManager::_StartCapture(POINT cursorPt) { - if (_isUnderCapture) { - return; - } - - // 在以下情况下进入捕获状态: - // 1. 当前未捕获 - // 2. 光标进入全屏区域 - // - // 进入捕获状态时: - // 1. 调整光标速度,全局隐藏光标 - // 2. 将光标移到源窗口的对应位置 - // - // 在有黑边的情况下自动将光标调整到画面内 - - // 全局隐藏光标 - ShowSystemCursor(false); - - const RECT& srcFrameRect = MagApp::Get().GetFrameSource().GetSrcFrameRect(); - const RECT& hostRect = MagApp::Get().GetHostWndRect(); - const RECT& outputRect = MagApp::Get().GetRenderer().GetOutputRect(); - - SIZE srcFrameSize = Win32Utils::GetSizeOfRect(srcFrameRect); - SIZE outputSize = Win32Utils::GetSizeOfRect(outputRect); - - if (MagApp::Get().GetOptions().IsAdjustCursorSpeed()) { - _AdjustCursorSpeed(); - } - - // 移动光标位置 - - // 跳过黑边 - cursorPt.x = std::clamp(cursorPt.x, hostRect.left + outputRect.left, hostRect.left + outputRect.right - 1); - cursorPt.y = std::clamp(cursorPt.y, hostRect.top + outputRect.top, hostRect.top + outputRect.bottom - 1); - - POINT newCursorPos = HostToSrc(cursorPt); - SetCursorPos(newCursorPos.x, newCursorPos.y); - - _isUnderCapture = true; -} - -void CursorManager::_StopCapture(POINT cursorPos, bool onDestroy) { - if (!_isUnderCapture) { - return; - } - - if (_curClips != RECT{}) { - _curClips = {}; - ClipCursor(nullptr); - } - - // 在以下情况下离开捕获状态: - // 1. 当前处于捕获状态 - // 2. 光标离开源窗口客户区 - // 3. 目标位置存在屏幕 - // - // 离开捕获状态时 - // 1. 还原光标速度,全局显示光标 - // 2. 将光标移到全屏窗口外的对应位置 - // - // 在有黑边的情况下自动将光标调整到全屏窗口外 - - POINT newCursorPos = SrcToHost(cursorPos, true); - - if (onDestroy || MonitorFromPoint(newCursorPos, MONITOR_DEFAULTTONULL)) { - SetCursorPos(newCursorPos.x, newCursorPos.y); - - if (MagApp::Get().GetOptions().IsAdjustCursorSpeed()) { - SystemParametersInfo(SPI_SETMOUSESPEED, 0, (PVOID)(intptr_t)_cursorSpeed, 0); - } - - ShowSystemCursor(true); - _isUnderCapture = false; - } else { - // 目标位置不存在屏幕,则将光标限制在源窗口内 - const RECT& srcFrameRect = MagApp::Get().GetFrameSource().GetSrcFrameRect(); - SetCursorPos( - std::clamp(cursorPos.x, srcFrameRect.left, srcFrameRect.right - 1), - std::clamp(cursorPos.y, srcFrameRect.top, srcFrameRect.bottom - 1) - ); - } -} - -bool CursorManager::_ResolveCursor(HCURSOR hCursor, bool resolveTexture) { - auto it = _cursorInfos.find(hCursor); - if (it != _cursorInfos.end() && (!resolveTexture || (resolveTexture && _curCursorInfo->texture))) { - _curCursorInfo = &it->second; - return true; - } - - ICONINFO ii{}; - if (!GetIconInfo(hCursor, &ii)) { - Logger::Get().Win32Error("GetIconInfo 失败"); - return false; - } - - Utils::ScopeExit se([&ii]() { - if (ii.hbmColor) { - DeleteBitmap(ii.hbmColor); - } - DeleteBitmap(ii.hbmMask); - }); - - BITMAP bmp{}; - if (!GetObject(ii.hbmMask, sizeof(bmp), &bmp)) { - Logger::Get().Win32Error("GetObject 失败"); - return false; - } - - _curCursorInfo = it == _cursorInfos.end() ? &_cursorInfos[hCursor] : &it->second; - - _curCursorInfo->hotSpot = { (LONG)ii.xHotspot, (LONG)ii.yHotspot }; - // 单色光标的 hbmMask 高度为实际高度的两倍 - _curCursorInfo->size = { bmp.bmWidth, ii.hbmColor ? bmp.bmHeight : bmp.bmHeight / 2 }; - - if (!resolveTexture) { - return true; - } - - auto& dr = MagApp::Get().GetDeviceResources(); - - BITMAPINFO bi{}; - bi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); - bi.bmiHeader.biWidth = bmp.bmWidth; - bi.bmiHeader.biHeight = -bmp.bmHeight; - bi.bmiHeader.biPlanes = 1; - bi.bmiHeader.biCompression = BI_RGB; - bi.bmiHeader.biBitCount = 32; - bi.bmiHeader.biSizeImage = bmp.bmWidth * bmp.bmHeight * 4; - - if (ii.hbmColor == NULL) { - // 单色光标 - _curCursorInfo->type = CursorType::Monochrome; - - std::unique_ptr pixels(new BYTE[bi.bmiHeader.biSizeImage]); - HDC hdc = GetDC(NULL); - if (GetDIBits(hdc, ii.hbmMask, 0, bmp.bmHeight, pixels.get(), &bi, DIB_RGB_COLORS) != bmp.bmHeight) { - Logger::Get().Win32Error("GetDIBits 失败"); - ReleaseDC(NULL, hdc); - return false; - } - ReleaseDC(NULL, hdc); - - // 红色通道是 AND 掩码,绿色通道是 XOR 掩码 - // 这里将下半部分的 XOR 掩码复制到上半部分的绿色通道中 - const int halfSize = bi.bmiHeader.biSizeImage / 8; - BYTE* upPtr = &pixels[1]; - BYTE* downPtr = &pixels[static_cast(halfSize) * 4]; - for (int i = 0; i < halfSize; ++i) { - *upPtr = *downPtr; - - upPtr += 4; - downPtr += 4; - } - - D3D11_SUBRESOURCE_DATA initData{}; - initData.pSysMem = pixels.get(); - initData.SysMemPitch = bmp.bmWidth * 4; - - _curCursorInfo->texture = dr.CreateTexture2D( - DXGI_FORMAT_R8G8B8A8_UNORM, - bmp.bmWidth, - bmp.bmHeight / 2, - D3D11_BIND_SHADER_RESOURCE, - D3D11_USAGE_IMMUTABLE, - 0, - &initData - ); - if (!_curCursorInfo->texture) { - Logger::Get().Error("创建纹理失败"); - return false; - } - - return true; - } - - std::unique_ptr pixels(new BYTE[bi.bmiHeader.biSizeImage]); - HDC hdc = GetDC(NULL); - if (GetDIBits(hdc, ii.hbmColor, 0, bmp.bmHeight, pixels.get(), &bi, DIB_RGB_COLORS) != bmp.bmHeight) { - Logger::Get().Win32Error("GetDIBits 失败"); - ReleaseDC(NULL, hdc); - return false; - } - ReleaseDC(NULL, hdc); - - // 若颜色掩码有 A 通道,则是彩色光标,否则是彩色掩码光标 - bool hasAlpha = false; - for (UINT i = 3; i < bi.bmiHeader.biSizeImage; i += 4) { - if (pixels[i] != 0) { - hasAlpha = true; - break; - } - } - - if (hasAlpha) { - // 彩色光标 - _curCursorInfo->type = CursorType::Color; - - for (size_t i = 0; i < bi.bmiHeader.biSizeImage; i += 4) { - // 预乘 Alpha 通道 - double alpha = pixels[i + 3] / 255.0f; - - BYTE b = (BYTE)std::lround(pixels[i] * alpha); - pixels[i] = (BYTE)std::lround(pixels[i + 2] * alpha); - pixels[i + 1] = (BYTE)std::lround(pixels[i + 1] * alpha); - pixels[i + 2] = b; - - pixels[i + 3] = 255 - pixels[i + 3]; - } - } else { - // 彩色掩码光标 - _curCursorInfo->type = CursorType::MaskedColor; - - std::unique_ptr maskPixels(new BYTE[bi.bmiHeader.biSizeImage]); - hdc = GetDC(NULL); - if (GetDIBits(hdc, ii.hbmMask, 0, bmp.bmHeight, maskPixels.get(), &bi, DIB_RGB_COLORS) != bmp.bmHeight) { - Logger::Get().Win32Error("GetDIBits 失败"); - ReleaseDC(NULL, hdc); - return false; - } - ReleaseDC(NULL, hdc); - - // 将 XOR 掩码复制到透明通道中 - for (size_t i = 0; i < bi.bmiHeader.biSizeImage; i += 4) { - std::swap(pixels[i], pixels[i + 2]); - pixels[i + 3] = maskPixels[i]; - } - } - - D3D11_SUBRESOURCE_DATA initData{}; - initData.pSysMem = &pixels[0]; - initData.SysMemPitch = bmp.bmWidth * 4; - - _curCursorInfo->texture = dr.CreateTexture2D( - DXGI_FORMAT_R8G8B8A8_UNORM, - bmp.bmWidth, - bmp.bmHeight, - D3D11_BIND_SHADER_RESOURCE, - D3D11_USAGE_IMMUTABLE, - 0, - &initData - ); - if (!_curCursorInfo->texture) { - Logger::Get().Error("创建纹理失败"); - return false; - } - - return true; -} - -void CursorManager::_AdjustCursorSpeed() { - if (!SystemParametersInfo(SPI_GETMOUSESPEED, 0, &_cursorSpeed, 0)) { - Logger::Get().Win32Error("获取光标移速失败"); - return; - } - - // 鼠标加速默认打开 - bool isMouseAccelerationOn = true; - { - std::array values{}; - if (SystemParametersInfo(SPI_GETMOUSE, 0, values.data(), 0)) { - isMouseAccelerationOn = values[2]; - } else { - Logger::Get().Win32Error("检索鼠标加速失败"); - } - } - - SIZE srcFrameSize = Win32Utils::GetSizeOfRect(MagApp::Get().GetFrameSource().GetSrcFrameRect()); - SIZE virtualOutputSize = Win32Utils::GetSizeOfRect(MagApp::Get().GetRenderer().GetVirtualOutputRect()); - double scale = ((double)virtualOutputSize.cx / srcFrameSize.cx + (double)virtualOutputSize.cy / srcFrameSize.cy) / 2; - - INT newSpeed = 0; - - // “提高指针精确度”(鼠标加速)打开时光标移速的调整为线性,否则为非线性 - // 参见 https://liquipedia.net/counterstrike/Mouse_Settings#Windows_Sensitivity - if (isMouseAccelerationOn) { - newSpeed = std::clamp((INT)lround(_cursorSpeed / scale), 1, 20); - } else { - static constexpr std::array SENSITIVITIES = { - 0.03125, 0.0625, 0.125, 0.25, 0.375, 0.5, 0.625, 0.75, 0.875, - 1.0, 1.25, 1.5, 1.75, 2, 2.25, 2.5, 2.75, 3, 3.25, 3.5 - }; - - _cursorSpeed = std::clamp(_cursorSpeed, 1, 20); - double newSensitivity = SENSITIVITIES[static_cast(_cursorSpeed) - 1] / scale; - - auto it = std::lower_bound(SENSITIVITIES.begin(), SENSITIVITIES.end(), newSensitivity - 1e-6); - newSpeed = INT(it - SENSITIVITIES.begin()) + 1; - - if (it != SENSITIVITIES.begin() && it != SENSITIVITIES.end()) { - // 找到两侧最接近的数值 - if (std::abs(*it - newSensitivity) > std::abs(*(it - 1) - newSensitivity)) { - --newSpeed; - } - } - } - - if (!SystemParametersInfo(SPI_SETMOUSESPEED, 0, (PVOID)(intptr_t)newSpeed, 0)) { - Logger::Get().Win32Error("设置光标移速失败"); - } -} - -void CursorManager::_UpdateCursorClip() { - // 优先级: - // 1. 断点模式:不限制,捕获/取消捕获,支持 UI - // 2. 在 3D 游戏中限制光标:每帧都限制一次,不退出捕获,因此无法使用 UI,不支持多屏幕 - // 3. 常规:根据多屏幕限制光标,捕获/取消捕获,支持 UI 和多屏幕 - - const RECT& srcFrameRect = MagApp::Get().GetFrameSource().GetSrcFrameRect(); - - if (!MagApp::Get().GetOptions().IsDebugMode() && MagApp::Get().GetOptions().Is3DGameMode()) { - // 开启“在 3D 游戏中限制光标”则每帧都限制一次光标 - _curClips = srcFrameRect; - ClipCursor(&srcFrameRect); - return; - } - - if (_isCapturedOnOverlay) { - // 已在 OnCursorCapturedOnOverlay 中限制光标 - return; - } - - const HWND hwndHost = MagApp::Get().GetHwndHost(); - const HWND hwndSrc = MagApp::Get().GetHwndSrc(); - const RECT& hostRect = MagApp::Get().GetHostWndRect(); - - const RECT& outputRect = MagApp::Get().GetRenderer().GetOutputRect(); - const RECT& virtualOutputRect = MagApp::Get().GetRenderer().GetVirtualOutputRect(); - - const SIZE outputSize = Win32Utils::GetSizeOfRect(outputRect); - const SIZE srcFrameSize = Win32Utils::GetSizeOfRect(srcFrameRect); - const SIZE virtualOutputSize = Win32Utils::GetSizeOfRect(virtualOutputRect); - - INT_PTR style = GetWindowLongPtr(hwndHost, GWL_EXSTYLE); - - POINT cursorPos; - if (!::GetCursorPos(&cursorPos)) { - Logger::Get().Win32Error("GetCursorPos 失败"); - return; - } - - if (_isUnderCapture) { - /////////////////////////////////////////////////////////// - // - // 处于捕获状态 - // -------------------------------------------------------- - // | 虚拟位置被遮挡 | 虚拟位置未被遮挡 - // -------------------------------------------------------- - // 实际位置被遮挡 | 退出捕获 | 退出捕获,主窗口不透明 - // -------------------------------------------------------- - // 实际位置未被遮挡 | 退出捕获 | 无操作 - // -------------------------------------------------------- - // - /////////////////////////////////////////////////////////// - - HWND hwndCur = WindowFromPoint(SrcToHost(cursorPos, true), false); - - if (hwndCur != hwndHost) { - // 主窗口被遮挡 - if (style | WS_EX_TRANSPARENT) { - SetWindowLongPtr(hwndHost, GWL_EXSTYLE, style & ~WS_EX_TRANSPARENT); - } - - _StopCapture(cursorPos); - } else { - // 主窗口未被遮挡 - bool stopCapture = _isOnOverlay; - - if (!stopCapture) { - // 判断源窗口是否被遮挡 - hwndCur = WindowFromPoint(cursorPos, true); - stopCapture = hwndCur != hwndSrc && (!IsChild(hwndSrc, hwndCur) || !((GetWindowStyle(hwndCur) & WS_CHILD))); - } - - if (stopCapture) { - if (style | WS_EX_TRANSPARENT) { - SetWindowLongPtr(hwndHost, GWL_EXSTYLE, style & ~WS_EX_TRANSPARENT); - } - - _StopCapture(cursorPos); - } else { - if (!(style & WS_EX_TRANSPARENT)) { - SetWindowLongPtr(hwndHost, GWL_EXSTYLE, style | WS_EX_TRANSPARENT); - } - } - } - } else { - ///////////////////////////////////////////////////////// - // - // 未处于捕获状态 - // ----------------------------------------------------- - // | 虚拟位置被遮挡 | 虚拟位置未被遮挡 - // ------------------------------------------------------ - // 实际位置被遮挡 | 无操作 | 主窗口不透明 - // ------------------------------------------------------ - // 实际位置未被遮挡 | 无操作 | 开始捕获,主窗口透明 - // ------------------------------------------------------ - // - ///////////////////////////////////////////////////////// - - HWND hwndCur = WindowFromPoint(cursorPos, false); - - if (hwndCur == hwndHost) { - // 主窗口未被遮挡 - POINT newCursorPos = HostToSrc(cursorPos); - - if (!PtInRect(&srcFrameRect, newCursorPos)) { - // 跳过黑边 - if (_isOnOverlay) { - // 从内部移到外部 - // 此时有 UI 贴边 - if (newCursorPos.x >= srcFrameRect.right) { - cursorPos.x += hostRect.right - hostRect.left - outputRect.right; - } else if (newCursorPos.x < srcFrameRect.left) { - cursorPos.x -= outputRect.left; - } - - if (newCursorPos.y >= srcFrameRect.bottom) { - cursorPos.y += hostRect.bottom - hostRect.top - outputRect.bottom; - } else if (newCursorPos.y < srcFrameRect.top) { - cursorPos.y -= outputRect.top; - } - - if (MonitorFromPoint(cursorPos, MONITOR_DEFAULTTONULL)) { - SetCursorPos(cursorPos.x, cursorPos.y); - } else { - // 目标位置不存在屏幕,则将光标限制在输出区域内 - SetCursorPos( - std::clamp(cursorPos.x, hostRect.left + outputRect.left, hostRect.left + outputRect.right - 1), - std::clamp(cursorPos.y, hostRect.top + outputRect.top, hostRect.top + outputRect.bottom - 1) - ); - } - } else { - // 从外部移到内部 - - POINT clampedPos = { - std::clamp(cursorPos.x, hostRect.left + outputRect.left, hostRect.left + outputRect.right - 1), - std::clamp(cursorPos.y, hostRect.top + outputRect.top, hostRect.top + outputRect.bottom - 1) - }; - - if (WindowFromPoint(clampedPos, false) == hwndHost) { - if (!(style & WS_EX_TRANSPARENT)) { - SetWindowLongPtr(hwndHost, GWL_EXSTYLE, style | WS_EX_TRANSPARENT); - } - - _StartCapture(cursorPos); - } else { - // 要跳跃的位置被遮挡 - if (style | WS_EX_TRANSPARENT) { - SetWindowLongPtr(hwndHost, GWL_EXSTYLE, style & ~WS_EX_TRANSPARENT); - } - } - } - } else { - bool startCapture = !_isOnOverlay; - - if (startCapture) { - // 判断源窗口是否被遮挡 - hwndCur = WindowFromPoint(newCursorPos, true); - startCapture = hwndCur == hwndSrc || ((IsChild(hwndSrc, hwndCur) && (GetWindowStyle(hwndCur) & WS_CHILD))); - } - - if (startCapture) { - if (!(style & WS_EX_TRANSPARENT)) { - SetWindowLongPtr(hwndHost, GWL_EXSTYLE, style | WS_EX_TRANSPARENT); - } - - _StartCapture(cursorPos); - } else { - if (style | WS_EX_TRANSPARENT) { - SetWindowLongPtr(hwndHost, GWL_EXSTYLE, style & ~WS_EX_TRANSPARENT); - } - } - } - } - } - - if (MagApp::Get().GetOptions().IsDebugMode()) { - return; - } - - if (!_isOnOverlay && !_isUnderCapture) { - return; - } - - // 根据当前光标位置的四个方向有无屏幕来确定应该在哪些方向限制光标,但这无法 - // 处理屏幕之间存在间隙的情况。解决办法是 _StopCapture 只在目标位置存在屏幕时才取消捕获, - // 当光标试图移动到间隙中时将被挡住。如果光标的速度足以跨越间隙,则它依然可以在屏幕间移动。 - ::GetCursorPos(&cursorPos); - POINT hostPos = _isOnOverlay ? cursorPos : SrcToHost(cursorPos, true); - - RECT clips{ LONG_MIN, LONG_MIN, LONG_MAX, LONG_MAX }; - - // left - RECT rect{ LONG_MIN, hostPos.y, hostRect.left, hostPos.y + 1 }; - if (!MonitorFromRect(&rect, MONITOR_DEFAULTTONULL)) { - clips.left = _isOnOverlay ? outputRect.left + hostRect.left : srcFrameRect.left; - } - - // top - rect = { hostPos.x, LONG_MIN, hostPos.x + 1,hostRect.top }; - if (!MonitorFromRect(&rect, MONITOR_DEFAULTTONULL)) { - clips.top = _isOnOverlay ? outputRect.top + hostRect.top : srcFrameRect.top; - } - - // right - rect = { hostRect.right, hostPos.y, LONG_MAX, hostPos.y + 1 }; - if (!MonitorFromRect(&rect, MONITOR_DEFAULTTONULL)) { - clips.right = _isOnOverlay ? outputRect.right + hostRect.left : srcFrameRect.right; - } - - // bottom - rect = { hostPos.x, hostRect.bottom, hostPos.x + 1, LONG_MAX }; - if (!MonitorFromRect(&rect, MONITOR_DEFAULTTONULL)) { - clips.bottom = _isOnOverlay ? outputRect.bottom + hostRect.top : srcFrameRect.bottom; - } - - if (clips != _curClips) { - _curClips = clips; - ClipCursor(&clips); - } -} - -} diff --git a/src/Magpie.Core/CursorManager.h b/src/Magpie.Core/CursorManager.h deleted file mode 100644 index e83c08001..000000000 --- a/src/Magpie.Core/CursorManager.h +++ /dev/null @@ -1,107 +0,0 @@ -#pragma once -#include - -namespace Magpie::Core { - -class CursorManager { -public: - CursorManager() = default; - CursorManager(const CursorManager&) = delete; - CursorManager(CursorManager&&) = delete; - - ~CursorManager(); - - bool Initialize(); - - void OnBeginFrame(); - - bool HasCursor() const { - return !!_curCursor; - } - - const POINT* GetCursorPos() const { - return _curCursor ? &_curCursorPos : nullptr; - } - - struct CursorInfo { - POINT hotSpot{}; - SIZE size{}; - }; - const CursorInfo* GetCursorInfo() const { - return _curCursor ? _curCursorInfo : nullptr; - } - - enum class CursorType { - // 彩色光标,此时纹理中 RGB 通道已预乘 A 通道(premultiplied alpha),A 通道已预先取反 - // 这是为了减少着色器的计算量以及确保(可能进行的)双线性差值的准确性 - // 计算公式:FinalColor = ScreenColor * CursorColor.a + CursorColor.rgb - Color = 0, - // 彩色掩码光标,此时 A 通道可能为 0 或 255 - // 为 0 时表示 RGB 通道取代屏幕颜色,为 255 时表示 RGB 通道和屏幕颜色进行异或操作 - MaskedColor, - // 单色光标,此时 R 通道为 AND 掩码,G 通道为 XOR 掩码,其他通道不使用 - // RG 通道的值只能是 0 或 255 - Monochrome - }; - bool GetCursorTexture(ID3D11Texture2D** texture, CursorManager::CursorType& cursorType); - - void OnCursorCapturedOnOverlay(); - - void OnCursorReleasedOnOverlay(); - - void OnCursorHoverOverlay(); - - void OnCursorLeaveOverlay(); - - bool IsCursorCapturedOnOverlay() const noexcept { - return _isCapturedOnOverlay; - } - - bool IsCursorOnOverlay() const noexcept { - return _isOnOverlay; - } - - void Show() { - _isShowCursor = true; - } - - void Hide() { - _isShowCursor = false; - } - -private: - void _StartCapture(POINT cursorPos); - - void _StopCapture(POINT cursorPos, bool onDestroy = false); - - bool _ResolveCursor(HCURSOR hCursor, bool resolveTexture); - - void _AdjustCursorSpeed(); - - void _UpdateCursorClip(); - - uint32_t _handlerId = 0; - bool _isShowCursor = true; - - bool _isUnderCapture = false; - RECT _curClips{}; - - bool _isCapturedOnOverlay = false; - bool _isOnOverlay = false; - - INT _cursorSpeed = 0; - - // 当前帧的光标,光标不可见则为 NULL - HCURSOR _curCursor = NULL; - POINT _curCursorPos{}; - - struct _CursorInfo : CursorInfo { - winrt::com_ptr texture = nullptr; - CursorType type = CursorType::Color; - }; - _CursorInfo* _curCursorInfo = nullptr; - - phmap::flat_hash_map _cursorInfos; -}; - -} diff --git a/src/Magpie.Core/DesktopDuplicationFrameSource.cpp b/src/Magpie.Core/DesktopDuplicationFrameSource.cpp deleted file mode 100644 index cf1f29351..000000000 --- a/src/Magpie.Core/DesktopDuplicationFrameSource.cpp +++ /dev/null @@ -1,389 +0,0 @@ -#include "pch.h" -#include "DesktopDuplicationFrameSource.h" -#include "MagApp.h" -#include "DeviceResources.h" -#include "Logger.h" -#include "Win32Utils.h" -#include "SmallVector.h" - - -namespace Magpie::Core { - -static winrt::com_ptr FindMonitor(IDXGIAdapter1* adapter, HMONITOR hMonitor) { - winrt::com_ptr output; - - for (UINT adapterIndex = 0; - SUCCEEDED(adapter->EnumOutputs(adapterIndex, output.put())); - ++adapterIndex - ) { - DXGI_OUTPUT_DESC desc; - HRESULT hr = output->GetDesc(&desc); - if (FAILED(hr)) { - Logger::Get().ComError("GetDesc 失败", hr); - continue; - } - - if (desc.Monitor == hMonitor) { - winrt::com_ptr output1 = output.try_as(); - if (!output1) { - Logger::Get().Error("从 IDXGIOutput 获取 IDXGIOutput1 失败"); - return nullptr; - } - - return output1; - } - } - - return nullptr; -} - -// 根据显示器句柄查找 IDXGIOutput1 -static winrt::com_ptr GetDXGIOutput(HMONITOR hMonitor) { - auto& dr = MagApp::Get().GetDeviceResources(); - IDXGIAdapter1* curAdapter = dr.GetGraphicsAdapter(); - - // 首先在当前使用的图形适配器上查询显示器 - winrt::com_ptr output = FindMonitor(curAdapter, hMonitor); - if (output) { - return output; - } - - // 未找到则在所有图形适配器上查找 - winrt::com_ptr adapter; - IDXGIFactory5* dxgiFactory = dr.GetDXGIFactory(); - for (UINT adapterIndex = 0; - SUCCEEDED(dxgiFactory->EnumAdapters1(adapterIndex, adapter.put())); - ++adapterIndex - ) { - if (adapter.get() == curAdapter) { - continue; - } - - output = FindMonitor(adapter.get(), hMonitor); - if (output) { - return output; - } - } - - return nullptr; -} - -DesktopDuplicationFrameSource::~DesktopDuplicationFrameSource() { - _exiting = true; - WaitForSingleObject(_hDDPThread, 1000); -} - -bool DesktopDuplicationFrameSource::Initialize() { - if (!FrameSourceBase::Initialize()) { - Logger::Get().Error("初始化 FrameSourceBase 失败"); - return false; - } - - // WDA_EXCLUDEFROMCAPTURE 只在 Win10 20H1 及更新版本中可用 - if (!Win32Utils::GetOSVersion().Is20H1OrNewer()) { - Logger::Get().Error("当前操作系统无法使用 Desktop Duplication"); - return false; - } - - HWND hwndSrc = MagApp::Get().GetHwndSrc(); - - HMONITOR hMonitor = MonitorFromWindow(hwndSrc, MONITOR_DEFAULTTONEAREST); - if (!hMonitor) { - Logger::Get().Win32Error("MonitorFromWindow 失败"); - return false; - } - - MONITORINFO mi{}; - mi.cbSize = sizeof(mi); - if (!GetMonitorInfo(hMonitor, &mi)) { - Logger::Get().Win32Error("GetMonitorInfo 失败"); - return false; - } - - if (!_CenterWindowIfNecessary(hwndSrc, mi.rcWork)) { - Logger::Get().Error("居中源窗口失败"); - return false; - } - - if (!_UpdateSrcFrameRect()) { - Logger::Get().Error("_UpdateSrcFrameRect 失败"); - return false; - } - - auto& dr = MagApp::Get().GetDeviceResources(); - - _output = dr.CreateTexture2D( - DXGI_FORMAT_B8G8R8A8_UNORM, - _srcFrameRect.right - _srcFrameRect.left, - _srcFrameRect.bottom - _srcFrameRect.top, - D3D11_BIND_SHADER_RESOURCE - ); - if (!_output) { - Logger::Get().Error("创建 Texture2D 失败"); - return false; - } - - // 创建共享纹理 - _sharedTex = dr.CreateTexture2D( - DXGI_FORMAT_B8G8R8A8_UNORM, - _srcFrameRect.right - _srcFrameRect.left, - _srcFrameRect.bottom - _srcFrameRect.top, - D3D11_BIND_SHADER_RESOURCE, - D3D11_USAGE_DEFAULT, - D3D11_RESOURCE_MISC_SHARED_KEYEDMUTEX - ); - if (!_sharedTex) { - Logger::Get().Error("创建 Texture2D 失败"); - return false; - } - - _sharedTexMutex = _sharedTex.try_as(); - if (!_sharedTexMutex) { - Logger::Get().Error("检索 IDXGIKeyedMutex 失败"); - return false; - } - - winrt::com_ptr sharedDxgiRes = _sharedTex.try_as(); - if (!sharedDxgiRes) { - Logger::Get().Error("检索 IDXGIResource 失败"); - return false; - } - - HANDLE hSharedTex = NULL; - HRESULT hr = sharedDxgiRes->GetSharedHandle(&hSharedTex); - if (FAILED(hr)) { - Logger::Get().Error("GetSharedHandle 失败"); - return false; - } - - if (!_InitializeDdpD3D(hSharedTex)) { - Logger::Get().Error("初始化 D3D 失败"); - return false; - } - - winrt::com_ptr output = GetDXGIOutput(hMonitor); - if (!output) { - Logger::Get().Error("无法找到 IDXGIOutput"); - return false; - } - - hr = output->DuplicateOutput(_ddpD3dDevice.get(), _outputDup.put()); - if (FAILED(hr)) { - Logger::Get().ComError("DuplicateOutput 失败", hr); - return false; - } - - // 计算源窗口客户区在该屏幕上的位置,用于计算新帧是否有更新 - _srcClientInMonitor = { - _srcFrameRect.left - mi.rcMonitor.left, - _srcFrameRect.top - mi.rcMonitor.top, - _srcFrameRect.right - mi.rcMonitor.left, - _srcFrameRect.bottom - mi.rcMonitor.top - }; - - _frameInMonitor = { - (UINT)_srcClientInMonitor.left, - (UINT)_srcClientInMonitor.top, - 0, - (UINT)_srcClientInMonitor.right, - (UINT)_srcClientInMonitor.bottom, - 1 - }; - - // 使全屏窗口无法被捕获到 - if (!SetWindowDisplayAffinity(MagApp::Get().GetHwndHost(), WDA_EXCLUDEFROMCAPTURE)) { - Logger::Get().Win32Error("SetWindowDisplayAffinity 失败"); - return false; - } - - - _hDDPThread = CreateThread(nullptr, 0, _DDPThreadProc, this, 0, nullptr); - if (!_hDDPThread) { - return false; - } - - Logger::Get().Info("DesktopDuplicationFrameSource 初始化完成"); - return true; -} - - -FrameSourceBase::UpdateState DesktopDuplicationFrameSource::Update() { - UINT newFrameState = _newFrameState.load(); - if (newFrameState == 2) { - // 第一帧之前不渲染 - return UpdateState::Waiting; - } else if (newFrameState == 0) { - return UpdateState::NoUpdate; - } - - // 不必等待,当 newFrameState 变化时 DDP 线程已将锁释放 - HRESULT hr = _sharedTexMutex->AcquireSync(1, 0); - if (hr == static_cast(WAIT_TIMEOUT)) { - return UpdateState::Waiting; - } - - if (FAILED(hr)) { - Logger::Get().ComError("AcquireSync 失败", hr); - return UpdateState::Error; - } - - _newFrameState.store(0); - - MagApp::Get().GetDeviceResources().GetD3DDC()->CopyResource(_output.get(), _sharedTex.get()); - - _sharedTexMutex->ReleaseSync(0); - - return UpdateState::NewFrame; -} - -bool DesktopDuplicationFrameSource::_InitializeDdpD3D(HANDLE hSharedTex) { - UINT createDeviceFlags = D3D11_CREATE_DEVICE_BGRA_SUPPORT; - if (DeviceResources::IsDebugLayersAvailable()) { - // 在 DEBUG 配置启用调试层 - createDeviceFlags |= D3D11_CREATE_DEVICE_DEBUG; - } - - D3D_FEATURE_LEVEL featureLevels[] = { - D3D_FEATURE_LEVEL_11_1, - D3D_FEATURE_LEVEL_11_0 - }; - UINT nFeatureLevels = ARRAYSIZE(featureLevels); - - // 使用和 Renderer 相同的图像适配器以避免 GPU 间的纹理拷贝 - HRESULT hr = D3D11CreateDevice( - MagApp::Get().GetDeviceResources().GetGraphicsAdapter(), - D3D_DRIVER_TYPE_UNKNOWN, - nullptr, - createDeviceFlags, - featureLevels, - nFeatureLevels, - D3D11_SDK_VERSION, - _ddpD3dDevice.put(), - nullptr, - _ddpD3dDC.put() - ); - - if (FAILED(hr)) { - Logger::Get().ComError("D3D11CreateDevice 失败", hr); - return false; - } - - // 获取共享纹理 - hr = _ddpD3dDevice->OpenSharedResource(hSharedTex, IID_PPV_ARGS(_ddpSharedTex.put())); - if (FAILED(hr)) { - Logger::Get().ComError("OpenSharedResource 失败", hr); - return false; - } - - _ddpSharedTexMutex = _ddpSharedTex.try_as(); - if (!_ddpSharedTexMutex) { - Logger::Get().Error("检索 IDXGIKeyedMutex 失败"); - return false; - } - - return true; -} - -DWORD WINAPI DesktopDuplicationFrameSource::_DDPThreadProc(LPVOID lpThreadParameter) { - DesktopDuplicationFrameSource& that = *(DesktopDuplicationFrameSource*)lpThreadParameter; - - DXGI_OUTDUPL_FRAME_INFO info{}; - winrt::com_ptr dxgiRes; - SmallVector dupMetaData; - - while (!that._exiting.load()) { - if (dxgiRes) { - that._outputDup->ReleaseFrame(); - } - HRESULT hr = that._outputDup->AcquireNextFrame(500, &info, dxgiRes.put()); - if (hr == DXGI_ERROR_WAIT_TIMEOUT) { - continue; - } - - if (FAILED(hr)) { - Logger::Get().ComError("AcquireNextFrame 失败", hr); - continue; - } - - bool noUpdate = true; - - // 检索 move rects 和 dirty rects - // 这些区域如果和窗口客户区有重叠则表明画面有变化 - if (info.TotalMetadataBufferSize) { - if (info.TotalMetadataBufferSize > dupMetaData.size()) { - dupMetaData.resize(info.TotalMetadataBufferSize); - } - - UINT bufSize = info.TotalMetadataBufferSize; - - // move rects - hr = that._outputDup->GetFrameMoveRects(bufSize, (DXGI_OUTDUPL_MOVE_RECT*)dupMetaData.data(), &bufSize); - if (FAILED(hr)) { - Logger::Get().ComError("GetFrameMoveRects 失败", hr); - continue; - } - - UINT nRect = bufSize / sizeof(DXGI_OUTDUPL_MOVE_RECT); - for (UINT i = 0; i < nRect; ++i) { - const DXGI_OUTDUPL_MOVE_RECT& rect = ((DXGI_OUTDUPL_MOVE_RECT*)dupMetaData.data())[i]; - if (Win32Utils::CheckOverlap(that._srcClientInMonitor, rect.DestinationRect)) { - noUpdate = false; - break; - } - } - - if (noUpdate) { - bufSize = info.TotalMetadataBufferSize; - - // dirty rects - hr = that._outputDup->GetFrameDirtyRects(bufSize, (RECT*)dupMetaData.data(), &bufSize); - if (FAILED(hr)) { - Logger::Get().ComError("GetFrameDirtyRects 失败", hr); - continue; - } - - nRect = bufSize / sizeof(RECT); - for (UINT i = 0; i < nRect; ++i) { - const RECT& rect = ((RECT*)dupMetaData.data())[i]; - if (Win32Utils::CheckOverlap(that._srcClientInMonitor, rect)) { - noUpdate = false; - break; - } - } - } - } - - if (noUpdate) { - continue; - } - - winrt::com_ptr d3dRes = dxgiRes.try_as(); - if (!d3dRes) { - Logger::Get().Error("从 IDXGIResource 检索 ID3D11Resource 失败"); - continue; - } - - hr = that._ddpSharedTexMutex->AcquireSync(0, 100); - while (hr == static_cast(WAIT_TIMEOUT)) { - if (that._exiting.load()) { - return 0; - } - - hr = that._ddpSharedTexMutex->AcquireSync(0, 100); - } - - if (FAILED(hr)) { - Logger::Get().ComError("AcquireSync 失败", hr); - continue; - } - - - that._ddpD3dDC->CopySubresourceRegion(that._ddpSharedTex.get(), 0, 0, 0, 0, d3dRes.get(), 0, &that._frameInMonitor); - that._ddpSharedTexMutex->ReleaseSync(1); - that._newFrameState.store(1); - } - - return 0; -} - -} diff --git a/src/Magpie.Core/DesktopDuplicationFrameSource.h b/src/Magpie.Core/DesktopDuplicationFrameSource.h deleted file mode 100644 index af1d370e9..000000000 --- a/src/Magpie.Core/DesktopDuplicationFrameSource.h +++ /dev/null @@ -1,63 +0,0 @@ -#pragma once -#include "FrameSourceBase.h" - -namespace Magpie::Core { - -// 使用 Desktop Duplication API 捕获窗口 -// 在单独的线程中接收屏幕帧以避免丢帧 -class DesktopDuplicationFrameSource : public FrameSourceBase { -public: - DesktopDuplicationFrameSource() {}; - virtual ~DesktopDuplicationFrameSource(); - - bool Initialize() override; - - UpdateState Update() override; - - bool IsScreenCapture() override { - return true; - } - - const char* GetName() const noexcept override { - return "Desktop Duplication"; - } - -protected: - bool _HasRoundCornerInWin11() override { - return true; - } - - bool _CanCaptureTitleBar() override { - return true; - } - -private: - bool _InitializeDdpD3D(HANDLE hSharedTex); - - static DWORD WINAPI _DDPThreadProc(LPVOID lpThreadParameter); - - winrt::com_ptr _outputDup; - - HANDLE _hDDPThread = NULL; - std::atomic _exiting = false; - // 0: 等待新帧 - // 1: 新帧到达 - // 2: 等待第一帧 - std::atomic _newFrameState = 2; - - // DDP 线程使用的 D3D 设备 - winrt::com_ptr _ddpD3dDevice; - winrt::com_ptr _ddpD3dDC; - - // 这些均指向同一个纹理 - // 用于在 D3D Device 间同步对该纹理的访问 - winrt::com_ptr _sharedTex; - winrt::com_ptr _sharedTexMutex; - winrt::com_ptr _ddpSharedTex; - winrt::com_ptr _ddpSharedTexMutex; - - RECT _srcClientInMonitor{}; - D3D11_BOX _frameInMonitor{}; -}; - -} diff --git a/src/Magpie.Core/DeviceResources.cpp b/src/Magpie.Core/DeviceResources.cpp deleted file mode 100644 index 23a2bf519..000000000 --- a/src/Magpie.Core/DeviceResources.cpp +++ /dev/null @@ -1,446 +0,0 @@ -#include "pch.h" -#include "DeviceResources.h" -#include "MagApp.h" -#include "StrUtils.h" -#include "Logger.h" - -namespace Magpie::Core { - -bool DeviceResources::Initialize() { -#ifdef _DEBUG - UINT flag = DXGI_CREATE_FACTORY_DEBUG; -#else - UINT flag = 0; -#endif // _DEBUG - - HRESULT hr = CreateDXGIFactory2(flag, IID_PPV_ARGS(_dxgiFactory.put())); - if (FAILED(hr)) { - Logger::Get().ComError("CreateDXGIFactory2 失败", hr); - return false; - } - - // 检查可变帧率支持 - BOOL supportTearing = FALSE; - - hr = _dxgiFactory->CheckFeatureSupport(DXGI_FEATURE_PRESENT_ALLOW_TEARING, &supportTearing, sizeof(supportTearing)); - if (FAILED(hr)) { - Logger::Get().ComWarn("CheckFeatureSupport 失败", hr); - } - _supportTearing = !!supportTearing; - - Logger::Get().Info(fmt::format("可变刷新率支持:{}", supportTearing ? "是" : "否")); - - if (!MagApp::Get().GetOptions().IsVSync() && !supportTearing) { - Logger::Get().Error("当前显示器不支持可变刷新率"); - //MagApp::Get().SetErrorMsg(ErrorMessages::VSYNC_OFF_NOT_SUPPORTED); - return false; - } - - if(!_ObtainGraphicsAdapterAndD3DDevice()) { - Logger::Get().Error("找不到可用的图形适配器"); - return false; - } - - if (!_CreateSwapChain()) { - Logger::Get().Error("_CreateSwapChain 失败"); - return false; - } - - return true; -} - -winrt::com_ptr DeviceResources::CreateTexture2D( - DXGI_FORMAT format, - UINT width, - UINT height, - UINT bindFlags, - D3D11_USAGE usage, - UINT miscFlags, - const D3D11_SUBRESOURCE_DATA* pInitialData -) { - D3D11_TEXTURE2D_DESC desc{}; - desc.Format = format; - desc.Width = width; - desc.Height = height; - desc.MipLevels = 1; - desc.ArraySize = 1; - desc.SampleDesc.Count = 1; - desc.SampleDesc.Quality = 0; - desc.BindFlags = bindFlags; - desc.Usage = usage; - desc.MiscFlags = miscFlags; - - winrt::com_ptr result; - HRESULT hr = _d3dDevice->CreateTexture2D(&desc, pInitialData, result.put()); - if (FAILED(hr)) { - Logger::Get().ComError("CreateTexture2D 失败", hr); - return nullptr; - } - - return result; -} - -void DeviceResources::BeginFrame() { - WaitForSingleObjectEx(_frameLatencyWaitableObject.get(), 1000, TRUE); - _d3dDC->ClearState(); -} - -void DeviceResources::EndFrame() { - if (MagApp::Get().GetOptions().IsVSync()) { - _swapChain->Present(1, 0); - } else { - _swapChain->Present(0, DXGI_PRESENT_ALLOW_TEARING); - } -} - -static void LogAdapter(const DXGI_ADAPTER_DESC1& adapterDesc) { - Logger::Get().Info(fmt::format("当前图形适配器:\n\tVendorId:{:#x}\n\tDeviceId:{:#x}\n\t描述:{}", - adapterDesc.VendorId, adapterDesc.DeviceId, StrUtils::UTF16ToUTF8(adapterDesc.Description))); -} - -bool DeviceResources::IsDebugLayersAvailable() noexcept { -#ifdef _DEBUG - static std::optional result = std::nullopt; - - if (!result.has_value()) { - HRESULT hr = D3D11CreateDevice( - nullptr, - D3D_DRIVER_TYPE_NULL, // There is no need to create a real hardware device. - nullptr, - D3D11_CREATE_DEVICE_DEBUG, // Check for the SDK layers. - nullptr, // Any feature level will do. - 0, - D3D11_SDK_VERSION, - nullptr, // No need to keep the D3D device reference. - nullptr, // No need to know the feature level. - nullptr // No need to keep the D3D device context reference. - ); - - result = SUCCEEDED(hr); - } - - return result.value_or(false); -#else - // Relaese 配置不使用调试层 - return false; -#endif -} - -bool DeviceResources::_ObtainGraphicsAdapterAndD3DDevice() noexcept { - winrt::com_ptr adapter; - - int adapterIdx = MagApp::Get().GetOptions().graphicsCard; - if (adapterIdx >= 0) { - HRESULT hr = _dxgiFactory->EnumAdapters1(adapterIdx, adapter.put()); - if (SUCCEEDED(hr)) { - DXGI_ADAPTER_DESC1 desc; - hr = adapter->GetDesc1(&desc); - if (SUCCEEDED(hr)) { - if (desc.Flags & DXGI_ADAPTER_FLAG_SOFTWARE) { - Logger::Get().Warn("用户指定的显示卡为 WARP,已忽略"); - } else if (_TryCreateD3DDevice(adapter.get())) { - LogAdapter(desc); - return true; - } else { - Logger::Get().Warn("用户指定的显示卡不支持 FL 11"); - } - } else { - Logger::Get().Error("GetDesc1 失败"); - } - } else { - Logger::Get().Warn("未找到用户指定的显示卡"); - } - } - - // 枚举查找第一个支持 D3D11 的图形适配器 - for (UINT adapterIndex = 0; - SUCCEEDED(_dxgiFactory->EnumAdapters1(adapterIndex, adapter.put())); - ++adapterIndex - ) { - DXGI_ADAPTER_DESC1 desc; - HRESULT hr = adapter->GetDesc1(&desc); - if (FAILED(hr)) { - continue; - } - - // 忽略 WARP - if (desc.Flags & DXGI_ADAPTER_FLAG_SOFTWARE) { - continue; - } - - if (_TryCreateD3DDevice(adapter.get())) { - LogAdapter(desc); - return true; - } - } - - // 作为最后手段,回落到 Basic Render Driver Adapter(WARP) - // https://docs.microsoft.com/en-us/windows/win32/direct3darticles/directx-warp - HRESULT hr = _dxgiFactory->EnumWarpAdapter(IID_PPV_ARGS(&adapter)); - if (FAILED(hr)) { - Logger::Get().ComError("创建 WARP 设备失败", hr); - return false; - } - - Logger::Get().Info("已创建 WARP 设备"); - return true; -} - -bool DeviceResources::_TryCreateD3DDevice(IDXGIAdapter1* adapter) noexcept { - D3D_FEATURE_LEVEL featureLevels[] = { - D3D_FEATURE_LEVEL_11_1, - D3D_FEATURE_LEVEL_11_0 - }; - UINT nFeatureLevels = ARRAYSIZE(featureLevels); - - UINT createDeviceFlags = D3D11_CREATE_DEVICE_BGRA_SUPPORT; - if (IsDebugLayersAvailable()) { - // 在 DEBUG 配置启用调试层 - createDeviceFlags |= D3D11_CREATE_DEVICE_DEBUG; - } - - winrt::com_ptr d3dDevice; - winrt::com_ptr d3dDC; - HRESULT hr = D3D11CreateDevice( - adapter, - D3D_DRIVER_TYPE_UNKNOWN, - nullptr, - createDeviceFlags, - featureLevels, - nFeatureLevels, - D3D11_SDK_VERSION, - d3dDevice.put(), - &_featureLevel, - d3dDC.put() - ); - - if (FAILED(hr)) { - Logger::Get().ComError("D3D11CreateDevice 失败", hr); - return false; - } - - std::string_view fl; - switch (_featureLevel) { - case D3D_FEATURE_LEVEL_11_1: - fl = "11.1"; - break; - case D3D_FEATURE_LEVEL_11_0: - fl = "11.0"; - break; - default: - fl = "未知"; - break; - } - Logger::Get().Info(fmt::format("已创建 D3D Device\n\t功能级别:{}", fl)); - - _d3dDevice = d3dDevice.try_as(); - if (!_d3dDevice) { - Logger::Get().Error("获取 ID3D11Device1 失败"); - return false; - } - - _d3dDC = d3dDC.try_as(); - if (!_d3dDC) { - Logger::Get().Error("获取 ID3D11DeviceContext1 失败"); - return false; - } - - _dxgiDevice = _d3dDevice.try_as(); - if (!_dxgiDevice) { - Logger::Get().Error("获取 IDXGIDevice 失败"); - return false; - } - - hr = adapter->QueryInterface(_graphicsAdapter.put()); - if (FAILED(hr)) { - Logger::Get().ComError("获取 IDXGIAdapter4 失败", hr); - return false; - } - - return true; -} - -bool DeviceResources::_CreateSwapChain() { - const RECT& hostWndRect = MagApp::Get().GetHostWndRect(); - const MagOptions& options = MagApp::Get().GetOptions(); - - DXGI_SWAP_CHAIN_DESC1 sd = {}; - sd.Width = hostWndRect.right - hostWndRect.left; - sd.Height = hostWndRect.bottom - hostWndRect.top; - sd.Format = DXGI_FORMAT_R8G8B8A8_UNORM; - sd.AlphaMode = DXGI_ALPHA_MODE_UNSPECIFIED; - sd.SampleDesc.Count = 1; - sd.SampleDesc.Quality = 0; - sd.Scaling = DXGI_SCALING_NONE; - sd.BufferUsage = DXGI_USAGE_UNORDERED_ACCESS | DXGI_USAGE_RENDER_TARGET_OUTPUT; - sd.BufferCount = (options.IsTripleBuffering() || !options.IsVSync()) ? 3 : 2; - // 渲染每帧之前都会清空后缓冲区,因此无需 DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL - sd.SwapEffect = DXGI_SWAP_EFFECT_FLIP_DISCARD; - // 只要显卡支持始终启用 DXGI_SWAP_CHAIN_FLAG_ALLOW_TEARING - sd.Flags = (_supportTearing ? DXGI_SWAP_CHAIN_FLAG_ALLOW_TEARING : 0) - | DXGI_SWAP_CHAIN_FLAG_FRAME_LATENCY_WAITABLE_OBJECT; - - winrt::com_ptr dxgiSwapChain = nullptr; - HRESULT hr = _dxgiFactory->CreateSwapChainForHwnd( - _d3dDevice.get(), - MagApp::Get().GetHwndHost(), - &sd, - nullptr, - nullptr, - dxgiSwapChain.put() - ); - if (FAILED(hr)) { - Logger::Get().ComError("创建交换链失败", hr); - return false; - } - - _swapChain = dxgiSwapChain.try_as(); - if (!_swapChain) { - Logger::Get().Error("获取 IDXGISwapChain2 失败"); - return false; - } - - // 关闭低延迟模式或关闭垂直同步时将最大延迟设为 2 以使 CPU 和 GPU 并行执行 - _swapChain->SetMaximumFrameLatency(options.IsTripleBuffering() || !options.IsVSync() ? 2 : 1); - - _frameLatencyWaitableObject.reset(_swapChain->GetFrameLatencyWaitableObject()); - if (!_frameLatencyWaitableObject) { - Logger::Get().Error("GetFrameLatencyWaitableObject 失败"); - return false; - } - - hr = _dxgiFactory->MakeWindowAssociation(MagApp::Get().GetHwndHost(), DXGI_MWA_NO_ALT_ENTER); - if (FAILED(hr)) { - Logger::Get().ComError("MakeWindowAssociation 失败", hr); - } - - // 检查 Multiplane Overlay 和 Hardware Composition 支持 - BOOL supportMPO = FALSE; - BOOL supportHardwareComposition = FALSE; - winrt::com_ptr output; - hr = _swapChain->GetContainingOutput(output.put()); - if (FAILED(hr)) { - Logger::Get().ComError("获取 IDXGIOutput 失败", hr); - } else { - winrt::com_ptr output2 = output.try_as(); - if (!output2) { - Logger::Get().Info("获取 IDXGIOutput2 失败"); - } else { - supportMPO = output2->SupportsOverlays(); - } - - winrt::com_ptr output6 = output.try_as(); - if (!output6) { - Logger::Get().Info("获取 IDXGIOutput6 失败"); - } else { - UINT flags; - hr = output6->CheckHardwareCompositionSupport(&flags); - if (FAILED(hr)) { - Logger::Get().ComError("CheckHardwareCompositionSupport 失败", hr); - } else { - supportHardwareComposition = flags & DXGI_HARDWARE_COMPOSITION_SUPPORT_FLAG_WINDOWED; - } - } - } - - Logger::Get().Info(StrUtils::Concat("Hardware Composition 支持:", supportHardwareComposition ? "是" : "否")); - Logger::Get().Info(StrUtils::Concat("Multiplane Overlay 支持:", supportMPO ? "是" : "否")); - - hr = _swapChain->GetBuffer(0, IID_PPV_ARGS(_backBuffer.put())); - if (FAILED(hr)) { - Logger::Get().ComError("获取后缓冲区失败", hr); - return false; - } - - return true; -} - -bool DeviceResources::GetShaderResourceView(ID3D11Texture2D* texture, ID3D11ShaderResourceView** result) { - auto it = _srvMap.find(texture); - if (it != _srvMap.end()) { - *result = it->second.get(); - return true; - } - - winrt::com_ptr& r = _srvMap[texture]; - HRESULT hr = _d3dDevice->CreateShaderResourceView(texture, nullptr, r.put()); - if (FAILED(hr)) { - Logger::Get().ComError("CreateShaderResourceView 失败", hr); - return false; - } else { - *result = r.get(); - return true; - } -} - -bool DeviceResources::GetUnorderedAccessView(ID3D11Texture2D* texture, ID3D11UnorderedAccessView** result) { - auto it = _uavMap.find(texture); - if (it != _uavMap.end()) { - *result = it->second.get(); - return true; - } - - winrt::com_ptr& r = _uavMap[texture]; - - D3D11_UNORDERED_ACCESS_VIEW_DESC desc{}; - desc.ViewDimension = D3D11_UAV_DIMENSION_TEXTURE2D; - desc.Texture2D.MipSlice = 0; - - HRESULT hr = _d3dDevice->CreateUnorderedAccessView(texture, &desc, r.put()); - if (FAILED(hr)) { - Logger::Get().ComError("CreateUnorderedAccessView 失败", hr); - return false; - } else { - *result = r.get(); - return true; - } -} - -bool DeviceResources::GetRenderTargetView(ID3D11Texture2D* texture, ID3D11RenderTargetView** result) { - auto it = _rtvMap.find(texture); - if (it != _rtvMap.end()) { - *result = it->second.get(); - return true; - } - - winrt::com_ptr& r = _rtvMap[texture]; - HRESULT hr = _d3dDevice->CreateRenderTargetView(texture, nullptr, r.put()); - if (FAILED(hr)) { - Logger::Get().ComError("CreateRenderTargetView 失败", hr); - return false; - } else { - *result = r.get(); - return true; - } -} - -bool DeviceResources::GetSampler(D3D11_FILTER filterMode, D3D11_TEXTURE_ADDRESS_MODE addressMode, ID3D11SamplerState** result) { - auto key = std::make_pair(filterMode, addressMode); - auto it = _samMap.find(key); - if (it != _samMap.end()) { - *result = it->second.get(); - return true; - } - - winrt::com_ptr sam; - - D3D11_SAMPLER_DESC desc{}; - desc.Filter = filterMode; - desc.AddressU = addressMode; - desc.AddressV = addressMode; - desc.AddressW = addressMode; - desc.ComparisonFunc = D3D11_COMPARISON_NEVER; - desc.MinLOD = 0; - desc.MaxLOD = 0; - HRESULT hr = _d3dDevice->CreateSamplerState(&desc, sam.put()); - if (FAILED(hr)) { - Logger::Get().ComError("创建 ID3D11SamplerState 出错", hr); - return false; - } - - *result = sam.get(); - _samMap.emplace(key, std::move(sam)); - return true; -} - -} diff --git a/src/Magpie.Core/DeviceResources.h b/src/Magpie.Core/DeviceResources.h deleted file mode 100644 index ecdf25632..000000000 --- a/src/Magpie.Core/DeviceResources.h +++ /dev/null @@ -1,78 +0,0 @@ -#pragma once -#include "Win32Utils.h" -#include - -namespace Magpie::Core { - -class DeviceResources { -public: - DeviceResources() = default; - DeviceResources(const DeviceResources&) = delete; - DeviceResources(DeviceResources&&) = delete; - - bool Initialize(); - - static bool IsDebugLayersAvailable() noexcept; - - winrt::com_ptr CreateTexture2D( - DXGI_FORMAT format, - UINT width, - UINT height, - UINT bindFlags, - D3D11_USAGE usage = D3D11_USAGE_DEFAULT, - UINT miscFlags = 0, - const D3D11_SUBRESOURCE_DATA* pInitialData = nullptr - ); - - bool GetSampler(D3D11_FILTER filterMode, D3D11_TEXTURE_ADDRESS_MODE addressMode, ID3D11SamplerState** result); - - bool GetRenderTargetView(ID3D11Texture2D* texture, ID3D11RenderTargetView** result); - - bool GetShaderResourceView(ID3D11Texture2D* texture, ID3D11ShaderResourceView** result); - - bool GetUnorderedAccessView(ID3D11Texture2D* texture, ID3D11UnorderedAccessView** result); - - ID3D11Device5* GetD3DDevice() const noexcept { return _d3dDevice.get(); } - D3D_FEATURE_LEVEL GetFeatureLevel() const noexcept { return _featureLevel; } - ID3D11DeviceContext4* GetD3DDC() const noexcept { return _d3dDC.get(); } - IDXGISwapChain4* GetSwapChain() const noexcept { return _swapChain.get(); }; - ID3D11Texture2D* GetBackBuffer() const noexcept { return _backBuffer.get(); } - IDXGIFactory7* GetDXGIFactory() const noexcept { return _dxgiFactory.get(); } - IDXGIDevice4* GetDXGIDevice() const noexcept { return _dxgiDevice.get(); } - IDXGIAdapter4* GetGraphicsAdapter() const noexcept { return _graphicsAdapter.get(); } - - void BeginFrame(); - - void EndFrame(); - -private: - bool _ObtainGraphicsAdapterAndD3DDevice() noexcept; - - bool _TryCreateD3DDevice(IDXGIAdapter1* adapter) noexcept; - - bool _CreateSwapChain(); - - winrt::com_ptr _dxgiFactory; - winrt::com_ptr _dxgiDevice; - winrt::com_ptr _swapChain; - winrt::com_ptr _graphicsAdapter; - winrt::com_ptr _d3dDevice; - winrt::com_ptr _d3dDC; - - Win32Utils::ScopedHandle _frameLatencyWaitableObject; - bool _supportTearing = false; - D3D_FEATURE_LEVEL _featureLevel = D3D_FEATURE_LEVEL_10_0; - - winrt::com_ptr _backBuffer; - - phmap::flat_hash_map> _rtvMap; - phmap::flat_hash_map> _srvMap; - phmap::flat_hash_map> _uavMap; - - phmap::flat_hash_map< - std::pair, - winrt::com_ptr - > _samMap; -}; - -} diff --git a/src/Magpie.Core/DwmSharedSurfaceFrameSource.cpp b/src/Magpie.Core/DwmSharedSurfaceFrameSource.cpp deleted file mode 100644 index c74279c58..000000000 --- a/src/Magpie.Core/DwmSharedSurfaceFrameSource.cpp +++ /dev/null @@ -1,107 +0,0 @@ -#include "pch.h" -#include "DwmSharedSurfaceFrameSource.h" -#include "MagApp.h" -#include "DeviceResources.h" -#include "Logger.h" - - -namespace Magpie::Core { - -bool DwmSharedSurfaceFrameSource::Initialize() { - if (!FrameSourceBase::Initialize()) { - Logger::Get().Error("初始化 FrameSourceBase 失败"); - return false; - } - - HMODULE hUser32 = GetModuleHandle(L"user32.dll"); - if (!hUser32) { - Logger::Get().Win32Error("获取 User32.dll 模块句柄失败"); - return false; - } - _dwmGetDxSharedSurface = (_DwmGetDxSharedSurfaceFunc*)GetProcAddress(hUser32, "DwmGetDxSharedSurface"); - - if (!_dwmGetDxSharedSurface) { - Logger::Get().Win32Error("获取函数 DwmGetDxSharedSurface 地址失败"); - return false; - } - - if (!_UpdateSrcFrameRect()) { - Logger::Get().Error("_UpdateSrcFrameRect 失败"); - return false; - } - - HWND hwndSrc = MagApp::Get().GetHwndSrc(); - - double a, bx, by; - if (!_GetMapToOriginDPI(hwndSrc, a, bx, by)) { - Logger::Get().Error("_GetMapToOriginDPI 失败"); - //MagApp::Get().SetErrorMsg(ErrorMessages::FAILED_TO_CAPTURE); - return false; - } - - Logger::Get().Info(fmt::format("源窗口 DPI 缩放为 {}", 1 / a)); - - RECT frameRect = { - std::lround(_srcFrameRect.left * a + bx), - std::lround(_srcFrameRect.top * a + by), - std::lround(_srcFrameRect.right * a + bx), - std::lround(_srcFrameRect.bottom * a + by) - }; - if (frameRect.left < 0 || frameRect.top < 0 || frameRect.right < 0 - || frameRect.bottom < 0 || frameRect.right - frameRect.left <= 0 - || frameRect.bottom - frameRect.top <= 0 - ) { - Logger::Get().Error("裁剪失败"); - //MagApp::Get().SetErrorMsg(ErrorMessages::FAILED_TO_CROP); - return false; - } - - _frameInWnd = { - (UINT)frameRect.left, - (UINT)frameRect.top, - 0, - (UINT)frameRect.right, - (UINT)frameRect.bottom, - 1 - }; - - _output = MagApp::Get().GetDeviceResources().CreateTexture2D( - DXGI_FORMAT_B8G8R8A8_UNORM, - frameRect.right - frameRect.left, - frameRect.bottom - frameRect.top, - D3D11_BIND_SHADER_RESOURCE - ); - if (!_output) { - Logger::Get().Error("创建 Texture2D 失败"); - return false; - } - - Logger::Get().Info("DwmSharedSurfaceFrameSource 初始化完成"); - return true; -} - -FrameSourceBase::UpdateState DwmSharedSurfaceFrameSource::Update() { - HANDLE sharedTextureHandle = NULL; - if (!_dwmGetDxSharedSurface(MagApp::Get().GetHwndSrc(), - &sharedTextureHandle, nullptr, nullptr, nullptr, nullptr) - || !sharedTextureHandle - ) { - Logger::Get().Win32Error("DwmGetDxSharedSurface 失败"); - return UpdateState::Error; - } - - winrt::com_ptr sharedTexture; - HRESULT hr = MagApp::Get().GetDeviceResources().GetD3DDevice() - ->OpenSharedResource(sharedTextureHandle, IID_PPV_ARGS(&sharedTexture)); - if (FAILED(hr)) { - Logger::Get().ComError("OpenSharedResource 失败", hr); - return UpdateState::Error; - } - - MagApp::Get().GetDeviceResources().GetD3DDC() - ->CopySubresourceRegion(_output.get(), 0, 0, 0, 0, sharedTexture.get(), 0, &_frameInWnd); - - return UpdateState::NewFrame; -} - -} diff --git a/src/Magpie.Core/DwmSharedSurfaceFrameSource.h b/src/Magpie.Core/DwmSharedSurfaceFrameSource.h deleted file mode 100644 index 283ac6309..000000000 --- a/src/Magpie.Core/DwmSharedSurfaceFrameSource.h +++ /dev/null @@ -1,46 +0,0 @@ -#pragma once -#include "FrameSourceBase.h" - -namespace Magpie::Core { - -class DwmSharedSurfaceFrameSource : public FrameSourceBase { -public: - DwmSharedSurfaceFrameSource() {} - virtual ~DwmSharedSurfaceFrameSource() {} - - bool Initialize() override; - - UpdateState Update() override; - - bool IsScreenCapture() override { - return false; - } - - const char* GetName() const noexcept override { - return "DwmSharedSurface"; - } - -protected: - bool _HasRoundCornerInWin11() override { - return false; - } - - bool _CanCaptureTitleBar() override { - return false; - } - -private: - using _DwmGetDxSharedSurfaceFunc = bool( - HWND hWnd, - HANDLE* phSurface, - LUID* pAdapterLuid, - ULONG* pFmtWindow, - ULONG* pPresentFlags, - ULONGLONG* pWin32KUpdateId - ); - _DwmGetDxSharedSurfaceFunc* _dwmGetDxSharedSurface = nullptr; - - D3D11_BOX _frameInWnd{}; -}; - -} diff --git a/src/Magpie.Core/EffectDrawer.cpp b/src/Magpie.Core/EffectDrawer.cpp deleted file mode 100644 index 156e761c6..000000000 --- a/src/Magpie.Core/EffectDrawer.cpp +++ /dev/null @@ -1,457 +0,0 @@ -#include "pch.h" -#include "EffectDrawer.h" -#include "Logger.h" -#include "Win32Utils.h" -#include "MagApp.h" -#include "DeviceResources.h" -#include "TextureLoader.h" -#include "StrUtils.h" -#include "Renderer.h" -#include "CursorManager.h" -#include "GPUTimer.h" -#include "EffectHelper.h" - -#pragma push_macro("_UNICODE") -// Conan 的 muparser 不含 UNICODE 支持 -#undef _UNICODE -#pragma warning(push) -#pragma warning(disable: 4310) // 类型强制转换截断常量值 -#include -#pragma warning(push) -#pragma pop_macro("_UNICODE") - - -namespace Magpie::Core { - -bool EffectDrawer::Initialize( - const EffectDesc& desc, - const EffectOption& option, - ID3D11Texture2D* inputTex, - RECT* outputRect, - RECT* virtualOutputRect -) { - _desc = desc; - - SIZE inputSize{}; - { - D3D11_TEXTURE2D_DESC inputDesc; - inputTex->GetDesc(&inputDesc); - inputSize = { (LONG)inputDesc.Width, (LONG)inputDesc.Height }; - } - - const SIZE hostSize = Win32Utils::GetSizeOfRect(MagApp::Get().GetHostWndRect());; - bool isLastEffect = desc.flags & EffectFlags::LastEffect; - bool isInlineParams = desc.flags & EffectFlags::InlineParams; - - DeviceResources& dr = MagApp::Get().GetDeviceResources(); - auto d3dDevice = dr.GetD3DDevice(); - - static mu::Parser exprParser; - exprParser.DefineConst("INPUT_WIDTH", inputSize.cx); - exprParser.DefineConst("INPUT_HEIGHT", inputSize.cy); - - SIZE outputSize{}; - - if (desc.outSizeExpr.first.empty()) { - switch (option.scalingType) { - case ScalingType::Normal: - { - outputSize.cx = std::lroundf(inputSize.cx * option.scale.first); - outputSize.cy = std::lroundf(inputSize.cy * option.scale.second); - break; - } - case ScalingType::Fit: - { - float fillScale = std::min(float(hostSize.cx) / inputSize.cx, float(hostSize.cy) / inputSize.cy); - outputSize.cx = std::lroundf(inputSize.cx * fillScale * option.scale.first); - outputSize.cy = std::lroundf(inputSize.cy * fillScale * option.scale.second); - break; - } - case ScalingType::Absolute: - { - outputSize.cx = std::lroundf(option.scale.first); - outputSize.cy = std::lroundf(option.scale.second); - break; - } - case ScalingType::Fill: - { - outputSize = hostSize; - break; - } - } - } else { - assert(!desc.outSizeExpr.second.empty()); - - try { - exprParser.SetExpr(desc.outSizeExpr.first); - outputSize.cx = std::lround(exprParser.Eval()); - - exprParser.SetExpr(desc.outSizeExpr.second); - outputSize.cy = std::lround(exprParser.Eval()); - } catch (const mu::ParserError& e) { - Logger::Get().Error(fmt::format("计算输出尺寸 {} 失败:{}", e.GetExpr(), e.GetMsg())); - return false; - } - } - - if (outputSize.cx <= 0 || outputSize.cy <= 0) { - Logger::Get().Error("非法的输出尺寸"); - return false; - } - - exprParser.DefineConst("OUTPUT_WIDTH", outputSize.cx); - exprParser.DefineConst("OUTPUT_HEIGHT", outputSize.cy); - - _samplers.resize(desc.samplers.size()); - for (UINT i = 0; i < _samplers.size(); ++i) { - const EffectSamplerDesc& samDesc = desc.samplers[i]; - if (!dr.GetSampler( - samDesc.filterType == EffectSamplerFilterType::Linear ? D3D11_FILTER_MIN_MAG_MIP_LINEAR : D3D11_FILTER_MIN_MAG_MIP_POINT, - samDesc.addressType == EffectSamplerAddressType::Clamp ? D3D11_TEXTURE_ADDRESS_CLAMP : D3D11_TEXTURE_ADDRESS_WRAP, - &_samplers[i]) - ) { - Logger::Get().Error(fmt::format("创建采样器 {} 失败", samDesc.name)); - return false; - } - } - - // 创建中间纹理 - // 第一个为 INPUT,最后一个为 OUTPUT - _textures.resize(desc.textures.size() + 1); - _textures[0].copy_from(inputTex); - for (size_t i = 1; i < desc.textures.size(); ++i) { - const EffectIntermediateTextureDesc& texDesc = desc.textures[i]; - - if (!texDesc.source.empty()) { - // 从文件加载纹理 - size_t delimPos = desc.name.find_last_of('\\'); - std::string texPath = delimPos == std::string::npos - ? StrUtils::Concat("effects\\", texDesc.source) - : StrUtils::Concat("effects\\", std::string_view(desc.name.c_str(), delimPos + 1), texDesc.source); - _textures[i] = TextureLoader::Load(StrUtils::UTF8ToUTF16(texPath).c_str()); - if (!_textures[i]) { - Logger::Get().Error(fmt::format("加载纹理 {} 失败", texDesc.source)); - return false; - } - - if (texDesc.format != EffectIntermediateTextureFormat::UNKNOWN) { - // 检查纹理格式是否匹配 - D3D11_TEXTURE2D_DESC srcDesc{}; - _textures[i]->GetDesc(&srcDesc); - if (srcDesc.Format != EffectHelper::FORMAT_DESCS[(UINT)texDesc.format].dxgiFormat) { - Logger::Get().Error("SOURCE 纹理格式不匹配"); - return false; - } - } - - } else { - SIZE texSize{}; - try { - exprParser.SetExpr(texDesc.sizeExpr.first); - texSize.cx = std::lround(exprParser.Eval()); - exprParser.SetExpr(texDesc.sizeExpr.second); - texSize.cy = std::lround(exprParser.Eval()); - } catch (const mu::ParserError& e) { - Logger::Get().Error(fmt::format("计算中间纹理尺寸 {} 失败:{}", e.GetExpr(), e.GetMsg())); - return false; - } - - if (texSize.cx <= 0 || texSize.cy <= 0) { - Logger::Get().Error("非法的中间纹理尺寸"); - return false; - } - - _textures[i] = dr.CreateTexture2D( - EffectHelper::FORMAT_DESCS[(UINT)texDesc.format].dxgiFormat, - texSize.cx, - texSize.cy, - D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_UNORDERED_ACCESS - ); - if (!_textures[i]) { - Logger::Get().Error("创建纹理失败"); - return false; - } - } - } - - if (!isLastEffect) { - // 创建输出纹理 - _textures.back() = dr.CreateTexture2D( - DXGI_FORMAT_R8G8B8A8_UNORM, - outputSize.cx, - outputSize.cy, - D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_UNORDERED_ACCESS - ); - - if (!_textures.back()) { - Logger::Get().Error("创建纹理失败"); - return false; - } - } else { - _textures.back().copy_from(dr.GetBackBuffer()); - } - - _shaders.resize(desc.passes.size()); - _srvs.resize(desc.passes.size()); - _uavs.resize(desc.passes.size()); - for (UINT i = 0; i < _shaders.size(); ++i) { - const EffectPassDesc& passDesc = desc.passes[i]; - - HRESULT hr = d3dDevice->CreateComputeShader( - passDesc.cso->GetBufferPointer(), passDesc.cso->GetBufferSize(), nullptr, _shaders[i].put()); - if (FAILED(hr)) { - Logger::Get().ComError("创建计算着色器失败", hr); - return false; - } - - _srvs[i].resize(passDesc.inputs.size()); - for (UINT j = 0; j < passDesc.inputs.size(); ++j) { - if (!dr.GetShaderResourceView(_textures[passDesc.inputs[j]].get(), &_srvs[i][j])) { - Logger::Get().Error("GetShaderResourceView 失败"); - return false; - } - } - - if (!passDesc.outputs.empty()) { - _uavs[i].resize(passDesc.outputs.size() * 2); - for (UINT j = 0; j < passDesc.outputs.size(); ++j) { - if (!dr.GetUnorderedAccessView(_textures[passDesc.outputs[j]].get(), &_uavs[i][j])) { - Logger::Get().Error("GetUnorderedAccessView 失败"); - return false; - } - } - - D3D11_TEXTURE2D_DESC outputDesc; - _textures[passDesc.outputs[0]]->GetDesc(&outputDesc); - _dispatches.emplace_back( - (outputDesc.Width + passDesc.blockSize.first - 1) / passDesc.blockSize.first, - (outputDesc.Height + passDesc.blockSize.second - 1) / passDesc.blockSize.second - ); - } else { - // 最后一个 pass 输出到 OUTPUT - _uavs[i].resize(2); - if (!dr.GetUnorderedAccessView(_textures.back().get(), &_uavs[i][0])) { - Logger::Get().Error("GetUnorderedAccessView 失败"); - return false; - } - - D3D11_TEXTURE2D_DESC lastDesc; - _textures.back()->GetDesc(&lastDesc); - - _dispatches.emplace_back( - (std::min(lastDesc.Width, (UINT)outputSize.cx) + passDesc.blockSize.first - 1) / passDesc.blockSize.first, - (std::min(lastDesc.Height, (UINT)outputSize.cy) + passDesc.blockSize.second - 1) / passDesc.blockSize.second - ); - } - } - - if (isLastEffect) { - // 为光标渲染预留空间 - _srvs.back().push_back(nullptr); - - if (!dr.GetSampler( - MagApp::Get().GetOptions().cursorInterpolationMode == CursorInterpolationMode::NearestNeighbor ? D3D11_FILTER_MIN_MAG_MIP_POINT : D3D11_FILTER_MIN_MAG_MIP_LINEAR, - D3D11_TEXTURE_ADDRESS_CLAMP, - &_samplers.emplace_back(nullptr) - )) { - Logger::Get().Error("GetSampler 失败"); - return false; - } - } - - // 大小必须为 4 的倍数 - size_t builtinConstantCount = isLastEffect ? 16 : 12; - size_t psStylePassParams = 0; - for (UINT i = 0, end = (UINT)desc.passes.size() - 1; i < end; ++i) { - if (desc.passes[i].isPSStyle) { - psStylePassParams += 4; - } - } - _constants.resize((builtinConstantCount + psStylePassParams + (isInlineParams ? 0 : desc.params.size()) + 3) / 4 * 4); - // cbuffer __CB2 : register(b1) { - // uint2 __inputSize; - // uint2 __outputSize; - // float2 __inputPt; - // float2 __outputPt; - // float2 __scale; - // int2 __viewport; - // [uint4 __offset;] - // [PARAMETERS...] - // ); - _constants[0].uintVal = inputSize.cx; - _constants[1].uintVal = inputSize.cy; - _constants[2].uintVal = outputSize.cx; - _constants[3].uintVal = outputSize.cy; - _constants[4].floatVal = 1.0f / inputSize.cx; - _constants[5].floatVal = 1.0f / inputSize.cy; - _constants[6].floatVal = 1.0f / outputSize.cx; - _constants[7].floatVal = 1.0f / outputSize.cy; - _constants[8].floatVal = outputSize.cx / (FLOAT)inputSize.cx; - _constants[9].floatVal = outputSize.cy / (FLOAT)inputSize.cy; - - // 输出尺寸可能比主窗口更大 - RECT virtualOutputRect1{}; - RECT outputRect1{}; - - if (isLastEffect) { - virtualOutputRect1.left = (hostSize.cx - outputSize.cx) / 2; - virtualOutputRect1.top = (hostSize.cy - outputSize.cy) / 2; - virtualOutputRect1.right = virtualOutputRect1.left + outputSize.cx; - virtualOutputRect1.bottom = virtualOutputRect1.top + outputSize.cy; - - outputRect1 = RECT{ - std::max(0L, virtualOutputRect1.left), - std::max(0L, virtualOutputRect1.top), - std::min(hostSize.cx, virtualOutputRect1.right), - std::min(hostSize.cy, virtualOutputRect1.bottom) - }; - - _constants[12].intVal = -std::min(0L, virtualOutputRect1.left); - _constants[13].intVal = -std::min(0L, virtualOutputRect1.top); - _constants[10].intVal = outputRect1.right - outputRect1.left + _constants[12].intVal; - _constants[11].intVal = outputRect1.bottom - outputRect1.top + _constants[13].intVal; - _constants[14].intVal = outputRect1.left - _constants[12].intVal; - _constants[15].intVal = outputRect1.top - _constants[13].intVal; - } else { - outputRect1 = RECT{ 0, 0, outputSize.cx, outputSize.cy }; - virtualOutputRect1 = outputRect1; - - _constants[10].intVal = outputSize.cx; - _constants[11].intVal = outputSize.cy; - } - - if (outputRect) { - *outputRect = outputRect1; - } - if (virtualOutputRect) { - *virtualOutputRect = virtualOutputRect1; - } - - // PS 样式的通道需要的参数 - EffectHelper::Constant32* pCurParam = _constants.data() + builtinConstantCount; - if (psStylePassParams > 0) { - for (UINT i = 0, end = (UINT)desc.passes.size() - 1; i < end; ++i) { - if (desc.passes[i].isPSStyle) { - D3D11_TEXTURE2D_DESC outputDesc; - _textures[desc.passes[i].outputs[0]]->GetDesc(&outputDesc); - pCurParam->uintVal = outputDesc.Width; - ++pCurParam; - pCurParam->uintVal = outputDesc.Height; - ++pCurParam; - pCurParam->floatVal = 1.0f / outputDesc.Width; - ++pCurParam; - pCurParam->floatVal = 1.0f / outputDesc.Height; - ++pCurParam; - } - } - } - - if (!isInlineParams) { - for (UINT i = 0; i < desc.params.size(); ++i) { - const auto& paramDesc = desc.params[i]; - auto it = option.parameters.find(StrUtils::UTF8ToUTF16(paramDesc.name)); - - if (paramDesc.constant.index() == 0) { - const EffectConstant& constant = std::get<0>(paramDesc.constant); - float value = constant.defaultValue; - - if (it != option.parameters.end()) { - value = it->second; - - if (value < constant.minValue || value > constant.maxValue) { - Logger::Get().Error(fmt::format("参数 {} 的值非法", paramDesc.name)); - return false; - } - } - - pCurParam->floatVal = value; - } else { - const EffectConstant& constant = std::get<1>(paramDesc.constant); - int value = constant.defaultValue; - - if (it != option.parameters.end()) { - value = (int)std::lroundf(it->second); - - if ((value < constant.minValue) || (value > constant.maxValue)) { - Logger::Get().Error(StrUtils::Concat("参数 ", paramDesc.name, " 的值非法")); - return false; - } - } - - pCurParam->intVal = value; - } - - ++pCurParam; - } - } - - D3D11_BUFFER_DESC bd{}; - bd.Usage = D3D11_USAGE_DEFAULT; - bd.ByteWidth = 4 * (UINT)_constants.size(); - bd.BindFlags = D3D11_BIND_CONSTANT_BUFFER; - - D3D11_SUBRESOURCE_DATA initData{}; - initData.pSysMem = _constants.data(); - - HRESULT hr = dr.GetD3DDevice()->CreateBuffer(&bd, &initData, _constantBuffer.put()); - if (FAILED(hr)) { - Logger::Get().ComError("CreateBuffer 失败", hr); - return false; - } - - return true; -} - -void EffectDrawer::Draw(UINT& idx, bool noUpdate) { - auto d3dDC = MagApp::Get().GetDeviceResources().GetD3DDC(); - auto& gpuTimer = MagApp::Get().GetRenderer().GetGPUTimer(); - - { - ID3D11Buffer* t = _constantBuffer.get(); - d3dDC->CSSetConstantBuffers(1, 1, &t); - } - d3dDC->CSSetSamplers(0, (UINT)_samplers.size(), _samplers.data()); - - for (UINT i = 0; i < _dispatches.size(); ++i) { - // noUpdate 为真则只渲染最后一个通道 - if (!noUpdate || i == UINT(_dispatches.size() - 1)) { - _DrawPass(i); - } - - // 不渲染的通道也在 GPUTimer 中记录 - gpuTimer.OnEndPass(idx++); - } -} - -void EffectDrawer::_DrawPass(UINT i) { - auto d3dDC = MagApp::Get().GetDeviceResources().GetD3DDC(); - d3dDC->CSSetShader(_shaders[i].get(), nullptr, 0); - - if ((_desc.flags & EffectFlags::LastEffect) && i == _dispatches.size() - 1) { - // 最后一个效果的最后一个通道负责渲染光标 - - // 光标纹理 - CursorManager& cm = MagApp::Get().GetCursorManager(); - if (cm.HasCursor()) { - ID3D11Texture2D* cursorTex; - CursorManager::CursorType ct; - if (cm.GetCursorTexture(&cursorTex, ct)) { - if (!MagApp::Get().GetDeviceResources().GetShaderResourceView(cursorTex, &_srvs[i].back())) { - Logger::Get().Error("GetShaderResourceView 出错"); - } - } else { - Logger::Get().Error("GetCursorTexture 出错"); - } - } - } - - d3dDC->CSSetShaderResources(0, (UINT)_srvs[i].size(), _srvs[i].data()); - UINT uavCount = (UINT)_uavs[i].size() / 2; - d3dDC->CSSetUnorderedAccessViews(0, uavCount, _uavs[i].data(), nullptr); - - d3dDC->Dispatch(_dispatches[i].first, _dispatches[i].second, 1); - - d3dDC->CSSetUnorderedAccessViews(0, uavCount, _uavs[i].data() + uavCount, nullptr); -} - -} diff --git a/src/Magpie.Core/EffectDrawer.h b/src/Magpie.Core/EffectDrawer.h deleted file mode 100644 index 995542da9..000000000 --- a/src/Magpie.Core/EffectDrawer.h +++ /dev/null @@ -1,57 +0,0 @@ -#pragma once -#include "EffectDesc.h" -#include "SmallVector.h" -#include "EffectHelper.h" - -namespace Magpie::Core { - -struct EffectOption; - -class EffectDrawer { -public: - EffectDrawer() = default; - EffectDrawer(const EffectDrawer&) = delete; - EffectDrawer(EffectDrawer&&) = default; - - bool Initialize( - const EffectDesc& desc, - const EffectOption& option, - ID3D11Texture2D* inputTex, - RECT* outputRect = nullptr, - RECT* virtualOutputRect = nullptr - ); - - void Draw(UINT& idx, bool noUpdate = false); - - bool IsUseDynamic() const noexcept { - return _desc.flags & EffectFlags::UseDynamic; - } - - const EffectDesc& GetDesc() const noexcept { - return _desc; - } - - ID3D11Texture2D* GetOutputTexture() const noexcept { - return _textures.empty() ? nullptr : _textures.back().get(); - } - -private: - void _DrawPass(UINT i); - - EffectDesc _desc; - - SmallVector _samplers; - SmallVector> _textures; - std::vector> _srvs; - // 后半部分为空,用于解绑 - std::vector> _uavs; - - SmallVector _constants; - winrt::com_ptr _constantBuffer; - - SmallVector> _shaders; - - SmallVector> _dispatches; -}; - -} diff --git a/src/Magpie.Core/ExclModeHack.cpp b/src/Magpie.Core/ExclModeHack.cpp deleted file mode 100644 index dc24145ac..000000000 --- a/src/Magpie.Core/ExclModeHack.cpp +++ /dev/null @@ -1,65 +0,0 @@ -#include "pch.h" -#include "ExclModeHack.h" -#include "MagApp.h" -#include "Logger.h" - - -namespace Magpie::Core { - -// 模拟 D3D 独占全屏模式,以起到免打扰的效果 -// SHQueryUserNotificationState 通常被用来检测是否有 D3D 游戏独占全屏,以确定是否应该向用户推送通知/弹窗 -// 此函数内部使用名为 __DDrawExclMode__ 的 mutex 检测独占全屏,因此这里直接获取该 mutex 以模拟独占全屏 -// 感谢 @codehz 提供的思路 https://github.com/Blinue/Magpie/issues/245 -ExclModeHack::ExclModeHack() { - QUERY_USER_NOTIFICATION_STATE state; - HRESULT hr = SHQueryUserNotificationState(&state); - if (FAILED(hr)) { - Logger::Get().ComError("SHQueryUserNotificationState 失败", hr); - return; - } - - // 操作系统将 Magpie 的缩放窗口视为全屏应用程序,可能已经启用了“请勿打扰”,即 QUNS_BUSY。 - // 但我们想要的是 QUNS_RUNNING_D3D_FULL_SCREEN - if (state == QUNS_RUNNING_D3D_FULL_SCREEN) { - Logger::Get().Info("已处于免打扰状态"); - return; - } - - _exclModeMutex.reset(Win32Utils::SafeHandle( - OpenMutex(SYNCHRONIZE, FALSE, L"__DDrawExclMode__"))); - if (!_exclModeMutex) { - Logger::Get().Win32Error("OpenMutex 失败"); - return; - } - - DWORD result = WaitForSingleObject(_exclModeMutex.get(), 0); - if (result != WAIT_OBJECT_0) { - Logger::Get().Error("获取 __DDrawExclMode__ 失败"); - _exclModeMutex.reset(); - return; - } - - hr = SHQueryUserNotificationState(&state); - if (FAILED(hr)) { - Logger::Get().ComError("SHQueryUserNotificationState 失败", hr); - ReleaseMutex(_exclModeMutex.get()); - _exclModeMutex.reset(); - return; - } - if (state != QUNS_RUNNING_D3D_FULL_SCREEN) { - Logger::Get().Error("模拟独占全屏失败"); - ReleaseMutex(_exclModeMutex.get()); - _exclModeMutex.reset(); - return; - } - - Logger::Get().Info("模拟独占全屏成功"); -} - -ExclModeHack::~ExclModeHack() { - if (_exclModeMutex) { - ReleaseMutex(_exclModeMutex.get()); - } -} - -} diff --git a/src/Magpie.Core/ExclModeHack.h b/src/Magpie.Core/ExclModeHack.h deleted file mode 100644 index 9561f64e3..000000000 --- a/src/Magpie.Core/ExclModeHack.h +++ /dev/null @@ -1,16 +0,0 @@ -#pragma once -#include "Win32Utils.h" - -namespace Magpie::Core { - -class ExclModeHack { -public: - ExclModeHack(); - - ~ExclModeHack(); - -private: - Win32Utils::ScopedHandle _exclModeMutex; -}; - -} diff --git a/src/Magpie.Core/FrameSourceBase.cpp b/src/Magpie.Core/FrameSourceBase.cpp deleted file mode 100644 index 31a19d94b..000000000 --- a/src/Magpie.Core/FrameSourceBase.cpp +++ /dev/null @@ -1,301 +0,0 @@ -#include "pch.h" -#include "FrameSourceBase.h" -#include "Win32Utils.h" -#include "Utils.h" -#include "MagApp.h" -#include "Logger.h" -#include "CommonSharedConstants.h" -#include "SmallVector.h" - - -namespace Magpie::Core { - -FrameSourceBase::~FrameSourceBase() { - HWND hwndSrc = MagApp::Get().GetHwndSrc(); - - // 还原窗口圆角 - if (_roundCornerDisabled) { - _roundCornerDisabled = false; - - INT attr = DWMWCP_DEFAULT; - HRESULT hr = DwmSetWindowAttribute(hwndSrc, DWMWA_WINDOW_CORNER_PREFERENCE, &attr, sizeof(attr)); - if (FAILED(hr)) { - Logger::Get().ComError("取消禁用窗口圆角失败", hr); - } else { - Logger::Get().Info("已取消禁用窗口圆角"); - } - } - - // 还原窗口大小调整 - if (_windowResizingDisabled) { - // 缩放 Magpie 主窗口时会在 SetWindowLongPtr 中卡住,似乎是 Win11 的 bug - // 将在 ScalingService::_ScalingRuntime_IsRunningChanged 还原主窗口样式 - if (Win32Utils::GetWndClassName(hwndSrc) != CommonSharedConstants::MAIN_WINDOW_CLASS_NAME) { - LONG_PTR style = GetWindowLongPtr(hwndSrc, GWL_STYLE); - if (!(style & WS_THICKFRAME)) { - if (SetWindowLongPtr(hwndSrc, GWL_STYLE, style | WS_THICKFRAME)) { - if (!SetWindowPos(hwndSrc, 0, 0, 0, 0, 0, - SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED)) { - Logger::Get().Win32Error("SetWindowPos 失败"); - } - - Logger::Get().Info("已取消禁用窗口大小调整"); - } else { - Logger::Get().Win32Error("取消禁用窗口大小调整失败"); - } - } - } - } -} - -bool FrameSourceBase::Initialize() { - HWND hwndSrc = MagApp::Get().GetHwndSrc(); - - // 禁用窗口大小调整 - if (MagApp::Get().GetOptions().IsDisableWindowResizing()) { - LONG_PTR style = GetWindowLongPtr(hwndSrc, GWL_STYLE); - if (style & WS_THICKFRAME) { - if (SetWindowLongPtr(hwndSrc, GWL_STYLE, style ^ WS_THICKFRAME)) { - // 不重绘边框,以防某些窗口状态不正确 - // if (!SetWindowPos(hwndSrc, 0, 0, 0, 0, 0, - // SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED)) { - // SPDLOG_LOGGER_ERROR(logger, MakeWin32ErrorMsg("SetWindowPos 失败")); - // } - - Logger::Get().Info("已禁用窗口大小调整"); - _windowResizingDisabled = true; - } else { - Logger::Get().Win32Error("禁用窗口大小调整失败"); - } - } - } - - // 禁用窗口圆角 - if (_HasRoundCornerInWin11()) { - if (Win32Utils::GetOSVersion().IsWin11()) { - INT attr = DWMWCP_DONOTROUND; - HRESULT hr = DwmSetWindowAttribute(hwndSrc, DWMWA_WINDOW_CORNER_PREFERENCE, &attr, sizeof(attr)); - if (FAILED(hr)) { - Logger::Get().ComError("禁用窗口圆角失败", hr); - } else { - Logger::Get().Info("已禁用窗口圆角"); - _roundCornerDisabled = true; - } - } - } - - return true; -} - -bool FrameSourceBase::_GetMapToOriginDPI(HWND hWnd, double& a, double& bx, double& by) { - // HDC 中的 HBITMAP 尺寸为窗口的原始尺寸 - // 通过 GetWindowRect 获得的尺寸为窗口的 DPI 缩放后尺寸 - // 它们的商即为窗口的 DPI 缩放 - HDC hdcWindow = GetDCEx(hWnd, NULL, DCX_LOCKWINDOWUPDATE | DCX_WINDOW); - if (!hdcWindow) { - Logger::Get().Win32Error("GetDCEx 失败"); - return false; - } - - HDC hdcClient = GetDCEx(hWnd, NULL, DCX_LOCKWINDOWUPDATE); - if (!hdcClient) { - Logger::Get().Win32Error("GetDCEx 失败"); - ReleaseDC(hWnd, hdcWindow); - return false; - } - - Utils::ScopeExit se([hWnd, hdcWindow, hdcClient]() { - ReleaseDC(hWnd, hdcWindow); - ReleaseDC(hWnd, hdcClient); - }); - - HGDIOBJ hBmpWindow = GetCurrentObject(hdcWindow, OBJ_BITMAP); - if (!hBmpWindow) { - Logger::Get().Win32Error("GetCurrentObject 失败"); - return false; - } - - if (GetObjectType(hBmpWindow) != OBJ_BITMAP) { - Logger::Get().Error("无法获取窗口的重定向表面"); - return false; - } - - BITMAP bmp{}; - if (!GetObject(hBmpWindow, sizeof(bmp), &bmp)) { - Logger::Get().Win32Error("GetObject 失败"); - return false; - } - - RECT rect; - if (!GetWindowRect(hWnd, &rect)) { - Logger::Get().Win32Error("GetWindowRect 失败"); - return false; - } - - a = bmp.bmWidth / double(rect.right - rect.left); - - // 使用 DPI 缩放无法可靠计算出窗口客户区的位置 - // 这里使用窗口 HDC 和客户区 HDC 的原点坐标差值 - // GetDCOrgEx 获得的是 DC 原点的屏幕坐标 - - POINT ptClient{}, ptWindow{}; - if (!GetDCOrgEx(hdcClient, &ptClient)) { - Logger::Get().Win32Error("GetDCOrgEx 失败"); - return false; - } - if (!GetDCOrgEx(hdcWindow, &ptWindow)) { - Logger::Get().Win32Error("GetDCOrgEx 失败"); - return false; - } - - if (!Win32Utils::GetClientScreenRect(hWnd, rect)) { - Logger::Get().Error("GetClientScreenRect 失败"); - return false; - } - - // 以窗口的客户区左上角为基准 - // 该点在坐标系 1 中坐标为 (rect.left, rect.top) - // 在坐标系 2 中坐标为 (ptClient.x - ptWindow.x, ptClient.y - ptWindow.y) - // 由此计算出 b - bx = ptClient.x - ptWindow.x - rect.left * a; - by = ptClient.y - ptWindow.y - rect.top * a; - - return true; -} - -bool FrameSourceBase::_CenterWindowIfNecessary(HWND hWnd, const RECT& rcWork) { - RECT srcRect; - if (!GetWindowRect(hWnd, &srcRect)) { - Logger::Get().Win32Error("GetWindowRect 失败"); - return false; - } - - if (srcRect.left < rcWork.left || srcRect.top < rcWork.top - || srcRect.right > rcWork.right || srcRect.bottom > rcWork.bottom) { - // 源窗口超越边界,将源窗口移到屏幕中央 - SIZE srcSize = { srcRect.right - srcRect.left, srcRect.bottom - srcRect.top }; - SIZE rcWorkSize = { rcWork.right - rcWork.left, rcWork.bottom - rcWork.top }; - if (srcSize.cx > rcWorkSize.cx || srcSize.cy > rcWorkSize.cy) { - // 源窗口无法被当前屏幕容纳,因此无法捕获 - //MagApp::Get().SetErrorMsg(ErrorMessages::SRC_TOO_LARGE); - return false; - } - - if (!SetWindowPos( - hWnd, - 0, - rcWork.left + (rcWorkSize.cx - srcSize.cx) / 2, - rcWork.top + (rcWorkSize.cy - srcSize.cy) / 2, - 0, - 0, - SWP_NOSIZE | SWP_NOZORDER - )) { - Logger::Get().Win32Error("SetWindowPos 失败"); - } - } - - return true; -} - -struct EnumChildWndParam { - const wchar_t* clientWndClassName = nullptr; - SmallVector childWindows; -}; - -static BOOL CALLBACK EnumChildProc( - _In_ HWND hwnd, - _In_ LPARAM lParam -) { - std::wstring className = Win32Utils::GetWndClassName(hwnd); - - EnumChildWndParam* param = (EnumChildWndParam*)lParam; - if (className == param->clientWndClassName) { - param->childWindows.push_back(hwnd); - } - - return TRUE; -} - -static HWND FindClientWindow(HWND hwndSrc, const wchar_t* clientWndClassName) { - // 查找所有窗口类名为 ApplicationFrameInputSinkWindow 的子窗口 - // 该子窗口一般为客户区 - EnumChildWndParam param{}; - param.clientWndClassName = clientWndClassName; - EnumChildWindows(hwndSrc, EnumChildProc, (LPARAM)¶m); - - if (param.childWindows.empty()) { - // 未找到符合条件的子窗口 - return hwndSrc; - } - - if (param.childWindows.size() == 1) { - return param.childWindows[0]; - } - - // 如果有多个匹配的子窗口,取最大的(一般不会出现) - int maxSize = 0, maxIdx = 0; - for (int i = 0; i < param.childWindows.size(); ++i) { - RECT rect; - if (!GetClientRect(param.childWindows[i], &rect)) { - continue; - } - - int size = rect.right - rect.left + rect.bottom - rect.top; - if (size > maxSize) { - maxSize = size; - maxIdx = i; - } - } - - return param.childWindows[maxIdx]; -} - -bool FrameSourceBase::_UpdateSrcFrameRect() { - _srcFrameRect = {}; - - HWND hwndSrc = MagApp::Get().GetHwndSrc(); - - if (MagApp::Get().GetOptions().IsCaptureTitleBar() && _CanCaptureTitleBar()) { - if (!Win32Utils::GetWindowFrameRect(hwndSrc, _srcFrameRect)) { - Logger::Get().Win32Error("GetClientScreenRect 失败"); - return false; - } - } else { - std::wstring className = Win32Utils::GetWndClassName(hwndSrc); - if (className == L"ApplicationFrameWindow" || className == L"Windows.UI.Core.CoreWindow") { - // "Modern App" - // 客户区窗口类名为 ApplicationFrameInputSinkWindow - HWND hwndClient = FindClientWindow(hwndSrc, L"ApplicationFrameInputSinkWindow"); - if (hwndClient) { - if (!Win32Utils::GetClientScreenRect(hwndClient, _srcFrameRect)) { - Logger::Get().Win32Error("GetClientScreenRect 失败"); - } - } - } - - if (_srcFrameRect == RECT{}) { - if (!Win32Utils::GetClientScreenRect(hwndSrc, _srcFrameRect)) { - Logger::Get().Win32Error("GetClientScreenRect 失败"); - return false; - } - } - } - - const Cropping& cropping = MagApp::Get().GetOptions().cropping; - _srcFrameRect = { - std::lround(_srcFrameRect.left + cropping.Left), - std::lround(_srcFrameRect.top + cropping.Top), - std::lround(_srcFrameRect.right - cropping.Right), - std::lround(_srcFrameRect.bottom - cropping.Bottom) - }; - - if (_srcFrameRect.right - _srcFrameRect.left <= 0 || _srcFrameRect.bottom - _srcFrameRect.top <= 0) { - //App::Get().SetErrorMsg(ErrorMessages::FAILED_TO_CROP); - Logger::Get().Error("裁剪窗口失败"); - return false; - } - - return true; -} - -} diff --git a/src/Magpie.Core/FrameSourceBase.h b/src/Magpie.Core/FrameSourceBase.h deleted file mode 100644 index 6978103af..000000000 --- a/src/Magpie.Core/FrameSourceBase.h +++ /dev/null @@ -1,63 +0,0 @@ -#pragma once - -namespace Magpie::Core { - -class FrameSourceBase { -public: - FrameSourceBase() {} - - virtual ~FrameSourceBase(); - - // 不可复制,不可移动 - FrameSourceBase(const FrameSourceBase&) = delete; - FrameSourceBase(FrameSourceBase&&) = delete; - - virtual bool Initialize(); - - enum class UpdateState { - NewFrame, - NoUpdate, - Waiting, - Error - }; - - virtual UpdateState Update() = 0; - - virtual bool IsScreenCapture() = 0; - - // 注意:此函数返回源窗口作为输入部分的位置,但可能和 GetOutput 获取到的纹理尺寸不同 - const RECT& GetSrcFrameRect() const noexcept { return _srcFrameRect; } - - ID3D11Texture2D* GetOutput() { - return _output.get(); - } - - virtual const char* GetName() const noexcept = 0; - -protected: - virtual bool _HasRoundCornerInWin11() = 0; - - virtual bool _CanCaptureTitleBar() = 0; - - // 获取坐标系 1 到坐标系 2 的映射关系 - // 坐标系 1:屏幕坐标系,即虚拟化后的坐标系。原点为屏幕左上角 - // 坐标系 2:虚拟化前的坐标系,即窗口所见的坐标系,原点为窗口左上角 - // 两坐标系为线性映射,a 和 b 返回该映射的参数 - // 如果窗口本身支持高 DPI,则 a 为 1,否则 a 为 DPI 缩放的倒数 - // 此函数是为了将屏幕上的点映射到窗口坐标系中,并且无视 DPI 虚拟化 - // 坐标系 1 中的 (x1, y1) 映射到 (x1 * a + bx, x2 * a + by) - static bool _GetMapToOriginDPI(HWND hWnd, double& a, double& bx, double& by); - - static bool _CenterWindowIfNecessary(HWND hWnd, const RECT& rcWork); - - bool _UpdateSrcFrameRect(); - - RECT _srcFrameRect{}; - - winrt::com_ptr _output; - - bool _roundCornerDisabled = false; - bool _windowResizingDisabled = false; -}; - -} diff --git a/src/Magpie.Core/GDIFrameSource.cpp b/src/Magpie.Core/GDIFrameSource.cpp deleted file mode 100644 index efe5ed7d3..000000000 --- a/src/Magpie.Core/GDIFrameSource.cpp +++ /dev/null @@ -1,112 +0,0 @@ -#include "pch.h" -#include "GDIFrameSource.h" -#include "MagApp.h" -#include "DeviceResources.h" -#include "Logger.h" - - -namespace Magpie::Core { - -bool GDIFrameSource::Initialize() { - if (!FrameSourceBase::Initialize()) { - Logger::Get().Error("初始化 FrameSourceBase 失败"); - return false; - } - - if (!_UpdateSrcFrameRect()) { - Logger::Get().Error("_UpdateSrcFrameRect 失败"); - return false; - } - - HWND hwndSrc = MagApp::Get().GetHwndSrc(); - - double a, bx, by; - if (_GetMapToOriginDPI(hwndSrc, a, bx, by)) { - Logger::Get().Info(fmt::format("源窗口 DPI 缩放为 {}", 1 / a)); - - _frameRect = { - std::lround(_srcFrameRect.left * a + bx), - std::lround(_srcFrameRect.top * a + by), - std::lround(_srcFrameRect.right * a + bx), - std::lround(_srcFrameRect.bottom * a + by) - }; - } else { - Logger::Get().Error("_GetMapToOriginDPI 失败"); - - // _GetMapToOriginDPI 失败则假设 DPI 缩放为 1 - RECT srcWindowRect; - if (!GetWindowRect(hwndSrc, &srcWindowRect)) { - Logger::Get().Win32Error("GetWindowRect 失败"); - return false; - } - - _frameRect = { - _srcFrameRect.left - srcWindowRect.left, - _srcFrameRect.top - srcWindowRect.top, - _srcFrameRect.right - srcWindowRect.left, - _srcFrameRect.bottom - srcWindowRect.top - }; - } - - if (_frameRect.left < 0 || _frameRect.top < 0 || _frameRect.right < 0 - || _frameRect.bottom < 0 || _frameRect.right - _frameRect.left <= 0 - || _frameRect.bottom - _frameRect.top <= 0 - ) { - //App::Get().SetErrorMsg(ErrorMessages::FAILED_TO_CROP); - Logger::Get().Error("裁剪失败"); - return false; - } - - _output = MagApp::Get().GetDeviceResources().CreateTexture2D( - DXGI_FORMAT_B8G8R8A8_UNORM, - _frameRect.right - _frameRect.left, - _frameRect.bottom - _frameRect.top, - D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_RENDER_TARGET, - D3D11_USAGE_DEFAULT, - D3D11_RESOURCE_MISC_GDI_COMPATIBLE - ); - if (!_output) { - Logger::Get().Error("创建纹理失败"); - return false; - } - - _dxgiSurface = _output.try_as(); - if (!_dxgiSurface) { - Logger::Get().Error("从 Texture2D 获取 IDXGISurface1 失败"); - return false; - } - - Logger::Get().Info("GDIFrameSource 初始化完成"); - return true; -} - -FrameSourceBase::UpdateState GDIFrameSource::Update() { - HWND hwndSrc = MagApp::Get().GetHwndSrc(); - - HDC hdcDest; - HRESULT hr = _dxgiSurface->GetDC(TRUE, &hdcDest); - if (FAILED(hr)) { - Logger::Get().ComError("从 Texture2D 获取 IDXGISurface1 失败", hr); - return UpdateState::Error; - } - - HDC hdcSrc = GetDCEx(hwndSrc, NULL, DCX_LOCKWINDOWUPDATE | DCX_WINDOW); - if (!hdcSrc) { - Logger::Get().Win32Error("GetDC 失败"); - _dxgiSurface->ReleaseDC(nullptr); - return UpdateState::Error; - } - - if (!BitBlt(hdcDest, 0, 0, _frameRect.right - _frameRect.left, _frameRect.bottom - _frameRect.top, - hdcSrc, _frameRect.left, _frameRect.top, SRCCOPY) - ) { - Logger::Get().Win32Error("BitBlt 失败"); - } - - ReleaseDC(hwndSrc, hdcSrc); - _dxgiSurface->ReleaseDC(nullptr); - - return UpdateState::NewFrame; -} - -} diff --git a/src/Magpie.Core/GDIFrameSource.h b/src/Magpie.Core/GDIFrameSource.h deleted file mode 100644 index 02abc1beb..000000000 --- a/src/Magpie.Core/GDIFrameSource.h +++ /dev/null @@ -1,37 +0,0 @@ -#pragma once -#include "FrameSourceBase.h" - -namespace Magpie::Core { - -class GDIFrameSource : public FrameSourceBase { -public: - GDIFrameSource() {}; - virtual ~GDIFrameSource() {} - - bool Initialize() override; - - UpdateState Update() override; - - bool IsScreenCapture() override { - return false; - } - - const char* GetName() const noexcept override { - return "GDI"; - } - -protected: - bool _HasRoundCornerInWin11() override { - return false; - } - - bool _CanCaptureTitleBar() override { - return false; - } - -private: - RECT _frameRect{}; - winrt::com_ptr _dxgiSurface; -}; - -} diff --git a/src/Magpie.Core/GPUTimer.cpp b/src/Magpie.Core/GPUTimer.cpp deleted file mode 100644 index 15b0094d6..000000000 --- a/src/Magpie.Core/GPUTimer.cpp +++ /dev/null @@ -1,170 +0,0 @@ -#include "pch.h" -#include "GPUTimer.h" -#include "MagApp.h" -#include "DeviceResources.h" - - -namespace Magpie::Core { - -void GPUTimer::OnBeginFrame() { - auto now = std::chrono::high_resolution_clock::now(); - - _elapsedTime = now - _lastTimePoint; - _lastTimePoint = now; - - _totalTime += _elapsedTime; - - // 更新当前帧率 - ++_framesThisSecond; - ++_frameCount; - - _fpsCounter += _elapsedTime; - if (_fpsCounter >= 1s) { - _framesPerSecond = _framesThisSecond; - _framesThisSecond = 0; - _fpsCounter %= 1s; - } -} - -void GPUTimer::StartProfiling(std::chrono::microseconds updateInterval, UINT passCount) { - assert(passCount > 0); - - _curQueryIdx = 0; - _updateProfilingTime = updateInterval; - _profilingCounter = {}; - - _queries[0].passes.resize(passCount); - if (MagApp::Get().GetOptions().IsTripleBuffering()) { - _queries[1].passes.resize(passCount); - } - _passesTimings.resize(passCount); - _gpuTimings.passes.resize(passCount); - _firstProfilingFrame = true; -} - -void GPUTimer::StopProfiling() { - _curQueryIdx = -1; - _updateProfilingTime = {}; - _profilingCounter = {}; - - _queries = {}; - _passesTimings = {}; - _gpuTimings = {}; -} - -void GPUTimer::OnBeginEffects() { - if (_curQueryIdx < 0) { - return; - } - - _UpdateGPUTimings(); - - auto d3dDC = MagApp::Get().GetDeviceResources().GetD3DDC(); - d3dDC->Begin(_queries[_curQueryIdx].disjoint.get()); - d3dDC->End(_queries[_curQueryIdx].start.get()); -} - -void GPUTimer::OnEndPass(UINT idx) { - if (_curQueryIdx < 0) { - return; - } - - MagApp::Get().GetDeviceResources().GetD3DDC()->End(_queries[_curQueryIdx].passes[idx].get()); -} - -void GPUTimer::OnEndEffects() { - if (_curQueryIdx < 0) { - return; - } - - MagApp::Get().GetDeviceResources().GetD3DDC()->End(_queries[_curQueryIdx].disjoint.get()); -} - -template -static T GetQueryData(ID3D11DeviceContext3* d3dDC, ID3D11Query* query) { - T data{}; - while (S_OK != d3dDC->GetData(query, &data, sizeof(data), 0)) { - Sleep(0); - } - return data; -} - -void GPUTimer::_UpdateGPUTimings() { - if (_curQueryIdx < 0) { - return; - } - - if (MagApp::Get().GetOptions().IsTripleBuffering()) { - _curQueryIdx = 1 - _curQueryIdx; - } - - auto& curQueryInfo = _queries[_curQueryIdx]; - - if (curQueryInfo.disjoint) { - auto d3dDC = MagApp::Get().GetDeviceResources().GetD3DDC(); - - D3D11_QUERY_DATA_TIMESTAMP_DISJOINT disjointData = - GetQueryData(d3dDC, curQueryInfo.disjoint.get()); - - if (!disjointData.Disjoint) { - const float toMS = 1000.0f / disjointData.Frequency; - - UINT64 startTimestamp = GetQueryData(d3dDC, curQueryInfo.start.get()); - - for (size_t i = 0; i < curQueryInfo.passes.size(); ++i) { - UINT64 timestamp = GetQueryData(d3dDC, curQueryInfo.passes[i].get()); - - float t = (timestamp - startTimestamp) * toMS; - if (t > 0.01) { - _passesTimings[i].first += t; - ++_passesTimings[i].second; - } - startTimestamp = timestamp; - } - } else { - // 查询的值不可靠 - -#ifdef _DEBUG - // 依然执行查询,否则调试层将发出警告 - GetQueryData(d3dDC, curQueryInfo.disjoint.get()); - for (auto& query : curQueryInfo.passes) { - GetQueryData(d3dDC, query.get()); - } -#endif // _DEBUG - } - - _profilingCounter += _elapsedTime; - - if (_firstProfilingFrame) { - _firstProfilingFrame = false; - - // 在第一帧更新一次 - for (UINT i = 0; i < _passesTimings.size(); ++i) { - _gpuTimings.passes[i] = _passesTimings[i].first; - } - } else if (_profilingCounter >= _updateProfilingTime) { - // 更新渲染用时 - for (UINT i = 0; i < _passesTimings.size(); ++i) { - _gpuTimings.passes[i] = _passesTimings[i].second == 0 ? - 0.0f : _passesTimings[i].first / _passesTimings[i].second; - } - - std::fill(_passesTimings.begin(), _passesTimings.end(), std::pair()); - - _profilingCounter %= _updateProfilingTime; - } - } else { - auto d3dDevice = MagApp::Get().GetDeviceResources().GetD3DDevice(); - - D3D11_QUERY_DESC desc{ D3D11_QUERY_TIMESTAMP_DISJOINT, 0 }; - d3dDevice->CreateQuery(&desc, curQueryInfo.disjoint.put()); - - desc.Query = D3D11_QUERY_TIMESTAMP; - d3dDevice->CreateQuery(&desc, curQueryInfo.start.put()); - for (UINT j = 0; j < curQueryInfo.passes.size(); ++j) { - d3dDevice->CreateQuery(&desc, curQueryInfo.passes[j].put()); - } - } -} - -} diff --git a/src/Magpie.Core/GPUTimer.h b/src/Magpie.Core/GPUTimer.h deleted file mode 100644 index c24173ceb..000000000 --- a/src/Magpie.Core/GPUTimer.h +++ /dev/null @@ -1,84 +0,0 @@ -#pragma once -#include "SmallVector.h" - -namespace Magpie::Core { - -// 用于记录帧率和 GPU 时间 -class GPUTimer { -public: - // 上一帧的渲染时间 - std::chrono::nanoseconds GetElapsedTime() const noexcept { return _elapsedTime; } - - // 经过的总时间 - std::chrono::nanoseconds GetTotalTime() const noexcept { return _totalTime; } - - // 经过的总帧数 - UINT GetFrameCount() const noexcept { return _frameCount; } - - // 上一秒的帧数 - UINT GetFramesPerSecond() const noexcept { return _framesPerSecond; } - - // 在每帧开始时调用,用于记录帧率和检索渲染用时 - void OnBeginFrame(); - - struct GPUTimings { - SmallVector passes; - // float overlay = 0.0f; - }; - - // 所有元素的处理时间,单位为 ms - const GPUTimings& GetGPUTimings() const noexcept { - return _gpuTimings; - } - - // updateInterval 为更新渲染用时的间隔 - // 可为 0,即每帧都更新 - void StartProfiling(std::chrono::microseconds updateInterval, UINT passCount); - - void StopProfiling(); - - void OnBeginEffects(); - - // 每个通道结束后调用 - void OnEndPass(UINT idx); - - void OnEndEffects(); - -private: - void _UpdateGPUTimings(); - - std::chrono::time_point _lastTimePoint; - - std::chrono::nanoseconds _elapsedTime{}; - std::chrono::nanoseconds _totalTime{}; - - UINT _frameCount = 0; - UINT _framesPerSecond = 0; - UINT _framesThisSecond = 0; - std::chrono::nanoseconds _fpsCounter{}; - - GPUTimings _gpuTimings; - // 记录的第一帧首先更新一次,而不是等待更新间隔 - bool _firstProfilingFrame = true; - // 更新渲染用时的间隔 - std::chrono::nanoseconds _updateProfilingTime{}; - std::chrono::nanoseconds _profilingCounter{}; - - struct _QueryInfo { - winrt::com_ptr disjoint; - winrt::com_ptr start; - std::vector> passes; - }; - // [(disjoint, [timestamp])] - // 允许额外的延迟时需保存两帧的数据 - std::array<_QueryInfo, 2> _queries; - // -1:无需统计渲染时间 - // 否则为当前帧在 _queries 中的位置 - int _curQueryIdx = -1; - - // 用于保存渲染时间 - // (总计用时, 已统计帧数) - SmallVector, 0> _passesTimings; -}; - -} diff --git a/src/Magpie.Core/GraphicsCaptureFrameSource.cpp b/src/Magpie.Core/GraphicsCaptureFrameSource.cpp deleted file mode 100644 index 31d12490c..000000000 --- a/src/Magpie.Core/GraphicsCaptureFrameSource.cpp +++ /dev/null @@ -1,413 +0,0 @@ -#include "pch.h" -#include "GraphicsCaptureFrameSource.h" -#include "MagApp.h" -#include "StrUtils.h" -#include "Utils.h" -#include "DeviceResources.h" -#include "Logger.h" -#include - - -namespace winrt { -using namespace Windows::Graphics; -using namespace Windows::Graphics::Capture; -using namespace Windows::Graphics::DirectX; -using namespace Windows::Graphics::DirectX::Direct3D11; -} - - -namespace Magpie::Core { - -bool GraphicsCaptureFrameSource::Initialize() { - if (!FrameSourceBase::Initialize()) { - Logger::Get().Error("初始化 FrameSourceBase 失败"); - return false; - } - - //App::Get().SetErrorMsg(ErrorMessages::FAILED_TO_CAPTURE); - - HRESULT hr; - - winrt::com_ptr interop; - try { - if (!winrt::GraphicsCaptureSession::IsSupported()) { - Logger::Get().Error("当前不支持 WinRT 捕获"); - return false; - } - - hr = CreateDirect3D11DeviceFromDXGIDevice( - MagApp::Get().GetDeviceResources().GetDXGIDevice(), - reinterpret_cast<::IInspectable**>(winrt::put_abi(_wrappedD3DDevice)) - ); - if (FAILED(hr)) { - Logger::Get().ComError("创建 IDirect3DDevice 失败", hr); - return false; - } - - // 从窗口句柄获取 GraphicsCaptureItem - interop = winrt::get_activation_factory(); - if (!interop) { - Logger::Get().Error("获取 IGraphicsCaptureItemInterop 失败"); - return false; - } - } catch (const winrt::hresult_error& e) { - Logger::Get().Error(StrUtils::Concat("初始化 WinRT 失败:", StrUtils::UTF16ToUTF8(e.message()))); - return false; - } - - if (!_CaptureWindow(interop.get())) { - Logger::Get().Info("窗口捕获失败,回落到屏幕捕获"); - - if (_CaptureMonitor(interop.get())) { - _isScreenCapture = true; - } else { - Logger::Get().Error("屏幕捕获失败"); - return false; - } - } - - _output = MagApp::Get().GetDeviceResources().CreateTexture2D( - DXGI_FORMAT_B8G8R8A8_UNORM, - _frameBox.right - _frameBox.left, - _frameBox.bottom - _frameBox.top, - D3D11_BIND_SHADER_RESOURCE - ); - if (!_output) { - Logger::Get().Error("创建纹理失败"); - return false; - } - - if (!StartCapture()) { - Logger::Get().Error("_StartCapture 失败"); - return false; - } - - //App::Get().SetErrorMsg(ErrorMessages::GENERIC); - Logger::Get().Info("GraphicsCaptureFrameSource 初始化完成"); - return true; -} - -FrameSourceBase::UpdateState GraphicsCaptureFrameSource::Update() { - if (!_captureSession) { - return UpdateState::Waiting; - } - - winrt::Direct3D11CaptureFrame frame = _captureFramePool.TryGetNextFrame(); - if (!frame) { - // 缓冲池没有帧则等待新的帧 - // 因为已通过 FrameArrived 注册回调,所以每当有新帧时会有新消息到达 - WaitMessage(); - return UpdateState::Waiting; - } - - // 从帧获取 IDXGISurface - winrt::IDirect3DSurface d3dSurface = frame.Surface(); - - winrt::com_ptr<::Windows::Graphics::DirectX::Direct3D11::IDirect3DDxgiInterfaceAccess> dxgiInterfaceAccess( - d3dSurface.as<::Windows::Graphics::DirectX::Direct3D11::IDirect3DDxgiInterfaceAccess>() - ); - - winrt::com_ptr withFrame; - HRESULT hr = dxgiInterfaceAccess->GetInterface(IID_PPV_ARGS(&withFrame)); - if (FAILED(hr)) { - Logger::Get().ComError("从获取 IDirect3DSurface 获取 ID3D11Texture2D 失败", hr); - return UpdateState::Error; - } - - MagApp::Get().GetDeviceResources().GetD3DDC() - ->CopySubresourceRegion(_output.get(), 0, 0, 0, 0, withFrame.get(), 0, &_frameBox); - - frame.Close(); - return UpdateState::NewFrame; -} - -bool GraphicsCaptureFrameSource::_CaptureWindow(IGraphicsCaptureItemInterop* interop) { - // DwmGetWindowAttribute 和 Graphics.Capture 无法应用于子窗口 - HWND hwndSrc = MagApp::Get().GetHwndSrc(); - - // 包含边框的窗口尺寸 - RECT srcRect{}; - if (!Win32Utils::GetWindowFrameRect(hwndSrc, srcRect)) { - Logger::Get().Error("GetWindowFrameRect 失败"); - return false; - } - - if (!_UpdateSrcFrameRect()) { - Logger::Get().Error("UpdateSrcFrameRect 失败"); - return false; - } - - // 在源窗口存在 DPI 缩放时有时会有一像素的偏移(取决于窗口在屏幕上的位置) - // 可能是 DwmGetWindowAttribute 的 bug - _frameBox = { - UINT(_srcFrameRect.left - srcRect.left), - UINT(_srcFrameRect.top - srcRect.top), - 0, - UINT(_srcFrameRect.right - srcRect.left), - UINT(_srcFrameRect.bottom - srcRect.top), - 1 - }; - - if (_TryCreateGraphicsCaptureItem(interop, hwndSrc)) { - return true; - } - - // 尝试设置源窗口样式,因为 WGC 只能捕获位于 Alt+Tab 列表中的窗口 - LONG_PTR srcExStyle = GetWindowLongPtr(hwndSrc, GWL_EXSTYLE); - if ((srcExStyle & WS_EX_APPWINDOW) == 0) { - // 添加 WS_EX_APPWINDOW 样式,确保源窗口可被 Alt+Tab 选中 - if (SetWindowLongPtr(hwndSrc, GWL_EXSTYLE, srcExStyle | WS_EX_APPWINDOW)) { - Logger::Get().Info("已改变源窗口样式"); - _originalSrcExStyle = srcExStyle; - - if (_TryCreateGraphicsCaptureItem(interop, hwndSrc)) { - _RemoveOwnerFromAltTabList(hwndSrc); - return true; - } - } else { - Logger::Get().Win32Error("SetWindowLongPtr 失败"); - } - } - - // 如果窗口使用 ITaskbarList 隐藏了任务栏图标也不会出现在 Alt+Tab 列表。这种情况很罕见 - _taskbarList = winrt::try_create_instance(CLSID_TaskbarList); - if (_taskbarList && SUCCEEDED(_taskbarList->HrInit())) { - HRESULT hr = _taskbarList->AddTab(hwndSrc); - if (SUCCEEDED(hr)) { - Logger::Get().Info("已添加任务栏图标"); - - if (_TryCreateGraphicsCaptureItem(interop, hwndSrc)) { - _RemoveOwnerFromAltTabList(hwndSrc); - return true; - } - } else { - _taskbarList = nullptr; - Logger::Get().Error("ITaskbarList::AddTab 失败"); - } - } else { - _taskbarList = nullptr; - Logger::Get().Error("创建 ITaskbarList 失败"); - } - - // 上面的尝试失败了则还原更改 - if (_taskbarList) { - _taskbarList->DeleteTab(hwndSrc); - _taskbarList = nullptr; - } - if (_originalSrcExStyle) { - // 首先还原所有者窗口的样式以压制任务栏的动画 - if (_originalOwnerExStyle) { - SetWindowLongPtr(GetWindowOwner(hwndSrc), GWL_EXSTYLE, _originalOwnerExStyle); - _originalOwnerExStyle = 0; - } - - SetWindowLongPtr(hwndSrc, GWL_EXSTYLE, _originalSrcExStyle); - _originalSrcExStyle = 0; - } - - return false; -} - -bool GraphicsCaptureFrameSource::_TryCreateGraphicsCaptureItem(IGraphicsCaptureItemInterop* interop, HWND hwndSrc) noexcept { - try { - HRESULT hr = interop->CreateForWindow( - hwndSrc, - winrt::guid_of(), - winrt::put_abi(_captureItem) - ); - if (FAILED(hr)) { - Logger::Get().ComError("创建 GraphicsCaptureItem 失败", hr); - return false; - } - } catch (const winrt::hresult_error& e) { - Logger::Get().Info(StrUtils::Concat("源窗口无法使用窗口捕获:", StrUtils::UTF16ToUTF8(e.message()))); - return false; - } - - return true; -} - -// 部分使用 Kirikiri 引擎的游戏有着这样的架构:游戏窗口并非根窗口,它被一个尺寸为 0 的窗口 -// 所有。此时 Alt+Tab 列表中的窗口和任务栏图标实际上是所有者窗口,这会导致 WGC 捕获游戏窗 -// 口时失败。_CaptureWindow 在初次捕获失败后会将 WS_EX_APPWINDOW 样式添加到游戏窗口,这 -// 可以工作,但也导致所有者窗口和游戏窗口同时出现在 Alt+Tab 列表中,引起用户的困惑。 -// -// 此函数检测这种情况并改变所有者窗口的样式将它从 Alt+Tab 列表中移除。 -void GraphicsCaptureFrameSource::_RemoveOwnerFromAltTabList(HWND hwndSrc) noexcept { - HWND hwndOwner = GetWindowOwner(hwndSrc); - if (!hwndOwner) { - return; - } - - RECT ownerRect{}; - if (!GetWindowRect(hwndOwner, &ownerRect)) { - Logger::Get().Win32Error("GetWindowRect 失败"); - return; - } - - // 检查所有者窗口尺寸 - if (ownerRect.right != ownerRect.left || ownerRect.bottom != ownerRect.top) { - return; - } - - LONG_PTR ownerExStyle = GetWindowLongPtr(hwndOwner, GWL_EXSTYLE); - if (ownerExStyle == 0) { - Logger::Get().Win32Error("GetWindowLongPtr 失败"); - return; - } - - if (!SetWindowLongPtr(hwndOwner, GWL_EXSTYLE, ownerExStyle | WS_EX_TOOLWINDOW)) { - Logger::Get().Win32Error("SetWindowLongPtr 失败"); - return; - } - - _originalOwnerExStyle = ownerExStyle; -} - -bool GraphicsCaptureFrameSource::_CaptureMonitor(IGraphicsCaptureItemInterop* interop) { - // Win10 无法隐藏黄色边框,因此只在 Win11 中回落到屏幕捕获 - if (!Win32Utils::GetOSVersion().IsWin11()) { - Logger::Get().Error("无法使用屏幕捕获"); - return false; - } - - // 使全屏窗口无法被捕获到 - // WDA_EXCLUDEFROMCAPTURE 只在 Win10 20H1 及更新版本中可用 - if (!SetWindowDisplayAffinity(MagApp::Get().GetHwndHost(), WDA_EXCLUDEFROMCAPTURE)) { - Logger::Get().Win32Error("SetWindowDisplayAffinity 失败"); - return false; - } - - HWND hwndSrc = MagApp::Get().GetHwndSrc(); - HMONITOR hMonitor = MonitorFromWindow(hwndSrc, MONITOR_DEFAULTTONEAREST); - if (!hMonitor) { - Logger::Get().Win32Error("MonitorFromWindow 失败"); - return false; - } - - MONITORINFO mi{}; - mi.cbSize = sizeof(mi); - if (!GetMonitorInfo(hMonitor, &mi)) { - Logger::Get().Win32Error("GetMonitorInfo 失败"); - return false; - } - - // 放在屏幕左上角而不是中间可以提高帧率,这里是为了和 DesktopDuplication 保持一致 - if (!_CenterWindowIfNecessary(hwndSrc, mi.rcWork)) { - Logger::Get().Error("居中源窗口失败"); - return false; - } - - if (!_UpdateSrcFrameRect()) { - Logger::Get().Error("UpdateSrcFrameRect 失败"); - return false; - } - - _frameBox = { - UINT(_srcFrameRect.left - mi.rcMonitor.left), - UINT(_srcFrameRect.top - mi.rcMonitor.top), - 0, - UINT(_srcFrameRect.right - mi.rcMonitor.left), - UINT(_srcFrameRect.bottom - mi.rcMonitor.top), - 1 - }; - - try { - HRESULT hr = interop->CreateForMonitor( - hMonitor, - winrt::guid_of(), - winrt::put_abi(_captureItem) - ); - if (FAILED(hr)) { - Logger::Get().ComError("创建 GraphicsCaptureItem 失败", hr); - return false; - } - } catch (const winrt::hresult_error& e) { - Logger::Get().Info(StrUtils::Concat("捕获屏幕失败:", StrUtils::UTF16ToUTF8(e.message()))); - return false; - } - - return true; -} - -bool GraphicsCaptureFrameSource::StartCapture() { - if (_captureSession) { - return true; - } - - try { - // 创建帧缓冲池 - // 帧的尺寸和 _captureItem.Size() 不同 - _captureFramePool = winrt::Direct3D11CaptureFramePool::Create( - _wrappedD3DDevice, - winrt::DirectXPixelFormat::B8G8R8A8UIntNormalized, - 1, // 帧的缓存数量 - { (int)_frameBox.right, (int)_frameBox.bottom } // 帧的尺寸为包含源窗口的最小尺寸 - ); - - // 注册回调是为了确保每当有新的帧时会向当前线程发送消息 - // 回调中什么也不做 - _captureFramePool.FrameArrived([](const auto&, const auto&) {}); - - _captureSession = _captureFramePool.CreateCaptureSession(_captureItem); - - // 不捕获光标 - if (winrt::ApiInformation::IsPropertyPresent( - winrt::name_of(), - L"IsCursorCaptureEnabled" - )) { - // 从 v2004 开始提供 - _captureSession.IsCursorCaptureEnabled(false); - } - - // 不显示黄色边框 - if (winrt::ApiInformation::IsPropertyPresent( - winrt::name_of(), - L"IsBorderRequired" - )) { - // 从 Win10 v2104 开始提供 - // Win32 应用中无需请求权限 - _captureSession.IsBorderRequired(false); - } - - _captureSession.StartCapture(); - } catch (const winrt::hresult_error& e) { - Logger::Get().Info(StrUtils::Concat("Graphics Capture 失败:", StrUtils::UTF16ToUTF8(e.message()))); - return false; - } - - return true; -} - -void GraphicsCaptureFrameSource::StopCapture() { - if (_captureSession) { - _captureSession.Close(); - _captureSession = nullptr; - } - if (_captureFramePool) { - _captureFramePool.Close(); - _captureFramePool = nullptr; - } -} - -GraphicsCaptureFrameSource::~GraphicsCaptureFrameSource() { - StopCapture(); - - HWND hwndSrc = MagApp::Get().GetHwndSrc(); - - if (_taskbarList) { - _taskbarList->DeleteTab(hwndSrc); - } - - // 还原源窗口样式 - if (_originalSrcExStyle) { - // 首先还原所有者窗口的样式以压制任务栏的动画 - if (_originalOwnerExStyle) { - SetWindowLongPtr(GetWindowOwner(hwndSrc), GWL_EXSTYLE, _originalOwnerExStyle); - } - - SetWindowLongPtr(hwndSrc, GWL_EXSTYLE, _originalSrcExStyle); - } -} - -} diff --git a/src/Magpie.Core/GraphicsCaptureFrameSource.h b/src/Magpie.Core/GraphicsCaptureFrameSource.h deleted file mode 100644 index bd94e04dc..000000000 --- a/src/Magpie.Core/GraphicsCaptureFrameSource.h +++ /dev/null @@ -1,65 +0,0 @@ -#pragma once -#include "FrameSourceBase.h" -#include -#include - -namespace Magpie::Core { - -// 使用 Window Runtime 的 Windows.Graphics.Capture API 抓取窗口 -// 见 https://docs.microsoft.com/en-us/windows/uwp/audio-video-camera/screen-capture -class GraphicsCaptureFrameSource : public FrameSourceBase { -public: - GraphicsCaptureFrameSource() {}; - virtual ~GraphicsCaptureFrameSource(); - - bool Initialize() override; - - UpdateState Update() override; - - bool IsScreenCapture() override { - return _isScreenCapture; - } - - const char* GetName() const noexcept override { - return NAME; - } - - bool StartCapture(); - - void StopCapture(); - - static constexpr const char* NAME = "Graphics Capture"; - -protected: - bool _HasRoundCornerInWin11() override { - return true; - } - - bool _CanCaptureTitleBar() override { - return true; - } - -private: - bool _CaptureWindow(IGraphicsCaptureItemInterop* interop); - - bool _CaptureMonitor(IGraphicsCaptureItemInterop* interop); - - bool _TryCreateGraphicsCaptureItem(IGraphicsCaptureItemInterop* interop, HWND hwndSrc) noexcept; - - void _RemoveOwnerFromAltTabList(HWND hwndSrc) noexcept; - - LONG_PTR _originalSrcExStyle = 0; - LONG_PTR _originalOwnerExStyle = 0; - winrt::com_ptr _taskbarList; - - D3D11_BOX _frameBox{}; - - bool _isScreenCapture = false; - - winrt::Windows::Graphics::Capture::GraphicsCaptureItem _captureItem{ nullptr }; - winrt::Windows::Graphics::Capture::Direct3D11CaptureFramePool _captureFramePool{ nullptr }; - winrt::Windows::Graphics::Capture::GraphicsCaptureSession _captureSession{ nullptr }; - winrt::Windows::Graphics::DirectX::Direct3D11::IDirect3DDevice _wrappedD3DDevice{ nullptr }; -}; - -} diff --git a/src/Magpie.Core/ImGuiBackend.cpp b/src/Magpie.Core/ImGuiBackend.cpp deleted file mode 100644 index 0b26773ae..000000000 --- a/src/Magpie.Core/ImGuiBackend.cpp +++ /dev/null @@ -1,416 +0,0 @@ -// 原始文件: https://github.com/ocornut/imgui/blob/e489e40a853426767de9ce0637bc0c9ceb431c1e/backends/imgui_impl_dx11.cpp - -#include "pch.h" -#include "ImGuiBackend.h" -#include -#include -#include "MagApp.h" -#include "DeviceResources.h" -#include "StrUtils.h" -#include "Logger.h" - -namespace Magpie::Core { - -static constexpr const char* VERTEX_SHADER = R"( -cbuffer vertexBuffer : register(b0) { - float4x4 ProjectionMatrix; -}; - -struct VS_INPUT { - float2 pos : POSITION; - float4 col : COLOR0; - float2 uv : TEXCOORD0; -}; - -struct PS_INPUT { - float4 pos : SV_POSITION; - float4 col : COLOR0; - float2 uv : TEXCOORD0; -}; - -PS_INPUT main(VS_INPUT input) { - PS_INPUT output; - output.pos = mul( ProjectionMatrix, float4(input.pos.xy, 0.f, 1.f)); - output.col = input.col; - output.uv = input.uv; - return output; -})"; - -static constexpr const char* PIXEL_SHADER = R"( -struct PS_INPUT { - float4 pos : SV_POSITION; - float4 col : COLOR0; - float2 uv : TEXCOORD0; -}; - -sampler sampler0; -Texture2D texture0; - -float4 main(PS_INPUT input) : SV_Target { - return input.col * float4(1, 1, 1, texture0.Sample(sampler0, input.uv).r); -})"; - -struct VERTEX_CONSTANT_BUFFER_DX11 { - float mvp[4][4]; -}; - -void ImGuiBackend::_SetupRenderState(ImDrawData* drawData, ID3D11DeviceContext* ctx) noexcept { - D3D11_VIEWPORT vp{}; - vp.Width = drawData->DisplaySize.x; - vp.Height = drawData->DisplaySize.y; - vp.MinDepth = 0.0f; - vp.MaxDepth = 1.0f; - ctx->RSSetViewports(1, &vp); - - ctx->IASetInputLayout(_inputLayout.get()); - { - unsigned int stride = sizeof(ImDrawVert); - unsigned int offset = 0; - - ID3D11Buffer* t = _vertexBuffer.get(); - ctx->IASetVertexBuffers(0, 1, &t, &stride, &offset); - } - - ctx->IASetIndexBuffer(_indexBuffer.get(), sizeof(ImDrawIdx) == 2 ? DXGI_FORMAT_R16_UINT : DXGI_FORMAT_R32_UINT, 0); - ctx->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); - ctx->VSSetShader(_vertexShader.get(), nullptr, 0); - { - ID3D11Buffer* t = _vertexConstantBuffer.get(); - ctx->VSSetConstantBuffers(0, 1, &t); - } - ctx->PSSetShader(_pixelShader.get(), nullptr, 0); - { - ID3D11SamplerState* t = _fontSampler.get(); - ctx->PSSetSamplers(0, 1, &t); - } - - const float blend_factor[4]{}; - ctx->OMSetBlendState(_blendState.get(), blend_factor, 0xffffffff); - ctx->RSSetState(_rasterizerState.get()); -} - -void ImGuiBackend::RenderDrawData(ImDrawData* drawData) noexcept { - // Avoid rendering when minimized - if (drawData->DisplaySize.x <= 0.0f || drawData->DisplaySize.y <= 0.0f) { - return; - } - - DeviceResources& dr = MagApp::Get().GetDeviceResources(); - ID3D11DeviceContext4* ctx = dr.GetD3DDC(); - ID3D11Device5* d3dDevice = dr.GetD3DDevice(); - - HRESULT hr; - - // Create and grow vertex/index buffers if needed - if (!_vertexBuffer || _vertexBufferSize < drawData->TotalVtxCount) { - _vertexBufferSize = drawData->TotalVtxCount + 5000; - D3D11_BUFFER_DESC desc{}; - desc.Usage = D3D11_USAGE_DYNAMIC; - desc.ByteWidth = _vertexBufferSize * sizeof(ImDrawVert); - desc.BindFlags = D3D11_BIND_VERTEX_BUFFER; - desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; - hr = d3dDevice->CreateBuffer(&desc, nullptr, _vertexBuffer.put()); - if (FAILED(hr)) { - Logger::Get().ComError("CreateBuffer 失败", hr); - return; - } - } - if (!_indexBuffer || _indexBufferSize < drawData->TotalIdxCount) { - _indexBufferSize = drawData->TotalIdxCount + 10000; - D3D11_BUFFER_DESC desc{}; - desc.Usage = D3D11_USAGE_DYNAMIC; - desc.ByteWidth = _indexBufferSize * sizeof(ImDrawIdx); - desc.BindFlags = D3D11_BIND_INDEX_BUFFER; - desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; - hr = d3dDevice->CreateBuffer(&desc, nullptr, _indexBuffer.put()); - if (FAILED(hr)) { - Logger::Get().ComError("CreateBuffer 失败", hr); - return; - } - } - - // Upload vertex/index data into a single contiguous GPU buffer - D3D11_MAPPED_SUBRESOURCE vtxResource, idxResource; - hr = ctx->Map(_vertexBuffer.get(), 0, D3D11_MAP_WRITE_DISCARD, 0, &vtxResource); - if (FAILED(hr)) { - Logger::Get().ComError("Map 失败", hr); - return; - } - - hr = ctx->Map(_indexBuffer.get(), 0, D3D11_MAP_WRITE_DISCARD, 0, &idxResource); - if (FAILED(hr)) { - Logger::Get().ComError("Map 失败", hr); - return; - } - - ImDrawVert* vtxDst = (ImDrawVert*)vtxResource.pData; - ImDrawIdx* idxDst = (ImDrawIdx*)idxResource.pData; - for (int n = 0; n < drawData->CmdListsCount; ++n) { - const ImDrawList* cmdList = drawData->CmdLists[n]; - std::memcpy(vtxDst, cmdList->VtxBuffer.Data, cmdList->VtxBuffer.Size * sizeof(ImDrawVert)); - std::memcpy(idxDst, cmdList->IdxBuffer.Data, cmdList->IdxBuffer.Size * sizeof(ImDrawIdx)); - vtxDst += cmdList->VtxBuffer.Size; - idxDst += cmdList->IdxBuffer.Size; - } - ctx->Unmap(_vertexBuffer.get(), 0); - ctx->Unmap(_indexBuffer.get(), 0); - - // Setup orthographic projection matrix into our constant buffer - // Our visible imgui space lies from drawData->DisplayPos (top left) to drawData->DisplayPos+data_data->DisplaySize (bottom right). DisplayPos is (0,0) for single viewport apps. - { - D3D11_MAPPED_SUBRESOURCE mappedResource; - hr = ctx->Map(_vertexConstantBuffer.get(), 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource); - if (FAILED(hr)) { - Logger::Get().ComError("Map 失败", hr); - return; - } - - VERTEX_CONSTANT_BUFFER_DX11* constant_buffer = (VERTEX_CONSTANT_BUFFER_DX11*)mappedResource.pData; - float left = drawData->DisplayPos.x; - float right = drawData->DisplayPos.x + drawData->DisplaySize.x; - float top = drawData->DisplayPos.y; - float bottom = drawData->DisplayPos.y + drawData->DisplaySize.y; - float mvp[4][4] = { - { 2.0f / (right - left), 0.0f, 0.0f, 0.0f }, - { 0.0f, 2.0f / (top - bottom), 0.0f, 0.0f }, - { 0.0f, 0.0f, 0.5f, 0.0f }, - { (right + left) / (left - right), (top + bottom) / (bottom - top), 0.5f, 1.0f }, - }; - std::memcpy(&constant_buffer->mvp, mvp, sizeof(mvp)); - ctx->Unmap(_vertexConstantBuffer.get(), 0); - } - - // Setup desired DX state - _SetupRenderState(drawData, ctx); - - // Render command lists - // (Because we merged all buffers into a single one, we maintain our own offset into them) - int globalIdxOffset = 0; - int globalVtxOffset = 0; - ImVec2 clip_off = drawData->DisplayPos; - for (int n = 0; n < drawData->CmdListsCount; n++) { - const ImDrawList* cmdList = drawData->CmdLists[n]; - for (int cmd_i = 0; cmd_i < cmdList->CmdBuffer.Size; cmd_i++) { - const ImDrawCmd* pcmd = &cmdList->CmdBuffer[cmd_i]; - if (pcmd->UserCallback != nullptr) { - // User callback, registered via ImDrawList::AddCallback() - // (ImDrawCallback_ResetRenderState is a special callback value used by the user to request the renderer to reset render state.) - if (pcmd->UserCallback == ImDrawCallback_ResetRenderState) - _SetupRenderState(drawData, ctx); - else - pcmd->UserCallback(cmdList, pcmd); - } else { - // Project scissor/clipping rectangles into framebuffer space - ImVec2 clipMin(pcmd->ClipRect.x - clip_off.x, pcmd->ClipRect.y - clip_off.y); - ImVec2 clipMax(pcmd->ClipRect.z - clip_off.x, pcmd->ClipRect.w - clip_off.y); - if (clipMax.x <= clipMin.x || clipMax.y <= clipMin.y) - continue; - - // Apply scissor/clipping rectangle - const D3D11_RECT r = { (LONG)clipMin.x, (LONG)clipMin.y, (LONG)clipMax.x, (LONG)clipMax.y }; - ctx->RSSetScissorRects(1, &r); - - // Bind texture, Draw - ID3D11ShaderResourceView* textureSrv = (ID3D11ShaderResourceView*)pcmd->GetTexID(); - ctx->PSSetShaderResources(0, 1, &textureSrv); - ctx->DrawIndexed(pcmd->ElemCount, pcmd->IdxOffset + globalIdxOffset, pcmd->VtxOffset + globalVtxOffset); - } - } - globalIdxOffset += cmdList->IdxBuffer.Size; - globalVtxOffset += cmdList->VtxBuffer.Size; - } -} - -bool ImGuiBackend::_CreateFontsTexture() noexcept { - ImGuiIO& io = ImGui::GetIO(); - ID3D11Device5* d3dDevice = MagApp::Get().GetDeviceResources().GetD3DDevice(); - - HRESULT hr; - - // 字体纹理使用 R8_UNORM 格式 - unsigned char* pixels; - int width, height; - io.Fonts->GetTexDataAsAlpha8(&pixels, &width, &height); - - // Upload texture to graphics system - { - D3D11_TEXTURE2D_DESC desc{}; - desc.Width = width; - desc.Height = height; - desc.MipLevels = 1; - desc.ArraySize = 1; - desc.Format = DXGI_FORMAT_R8_UNORM; - desc.SampleDesc.Count = 1; - desc.Usage = D3D11_USAGE_DEFAULT; - desc.BindFlags = D3D11_BIND_SHADER_RESOURCE; - - winrt::com_ptr texture = nullptr; - D3D11_SUBRESOURCE_DATA subResource{}; - subResource.pSysMem = pixels; - subResource.SysMemPitch = width; - hr = d3dDevice->CreateTexture2D(&desc, &subResource, texture.put()); - if (FAILED(hr)) { - Logger::Get().ComError("CreateTexture2D 失败", hr); - return false; - } - - // Create texture view - D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc{}; - srvDesc.Format = desc.Format; - srvDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D; - srvDesc.Texture2D.MipLevels = desc.MipLevels; - hr = d3dDevice->CreateShaderResourceView(texture.get(), &srvDesc, _fontTextureView.put()); - if (FAILED(hr)) { - Logger::Get().ComError("CreateShaderResourceView 失败", hr); - return false; - } - } - - // Store our identifier - io.Fonts->SetTexID((ImTextureID)_fontTextureView.get()); - - // Create texture sampler - // (Bilinear sampling is required by default. Set 'io.Fonts->Flags |= ImFontAtlasFlags_NoBakedLines' or 'style.AntiAliasedLinesUseTex = false' to allow point/nearest sampling) - { - D3D11_SAMPLER_DESC desc{}; - desc.Filter = D3D11_FILTER_MIN_MAG_MIP_LINEAR; - desc.AddressU = D3D11_TEXTURE_ADDRESS_WRAP; - desc.AddressV = D3D11_TEXTURE_ADDRESS_WRAP; - desc.AddressW = D3D11_TEXTURE_ADDRESS_WRAP; - desc.ComparisonFunc = D3D11_COMPARISON_ALWAYS; - hr = d3dDevice->CreateSamplerState(&desc, _fontSampler.put()); - if (FAILED(hr)) { - Logger::Get().ComError("CreateSamplerState 失败", hr); - return false; - } - } - - // 清理不再需要的数据降低内存占用 - io.Fonts->ClearTexData(); - - return true; -} - -bool ImGuiBackend::_CreateDeviceObjects() noexcept { - ID3D11Device5* d3dDevice = MagApp::Get().GetDeviceResources().GetD3DDevice(); - - HRESULT hr; - - static winrt::com_ptr vertexShaderBlob; - if (!vertexShaderBlob) { - hr = D3DCompile(VERTEX_SHADER, StrUtils::StrLen(VERTEX_SHADER), - nullptr, nullptr, nullptr, "main", "vs_5_0", 0, 0, vertexShaderBlob.put(), nullptr); - if (FAILED(hr)) { - Logger::Get().ComError("编译顶点着色器失败", hr); - return false; - } - } - - hr = d3dDevice->CreateVertexShader( - vertexShaderBlob->GetBufferPointer(), - vertexShaderBlob->GetBufferSize(), - nullptr, - _vertexShader.put() - ); - if (FAILED(hr)) { - Logger::Get().ComError("CreateVertexShader 失败", hr); - return false; - } - - static constexpr D3D11_INPUT_ELEMENT_DESC LOCAL_LAYOUT[] = { - { "POSITION", 0, DXGI_FORMAT_R32G32_FLOAT, 0, (UINT)IM_OFFSETOF(ImDrawVert, pos), D3D11_INPUT_PER_VERTEX_DATA, 0 }, - { "TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, (UINT)IM_OFFSETOF(ImDrawVert, uv), D3D11_INPUT_PER_VERTEX_DATA, 0 }, - { "COLOR", 0, DXGI_FORMAT_R8G8B8A8_UNORM, 0, (UINT)IM_OFFSETOF(ImDrawVert, col), D3D11_INPUT_PER_VERTEX_DATA, 0 }, - }; - hr = d3dDevice->CreateInputLayout(LOCAL_LAYOUT, 3, - vertexShaderBlob->GetBufferPointer(), vertexShaderBlob->GetBufferSize(), _inputLayout.put()); - if (FAILED(hr)) { - Logger::Get().ComError("CreateInputLayout 失败", hr); - return false; - } - - { - D3D11_BUFFER_DESC desc{}; - desc.ByteWidth = sizeof(VERTEX_CONSTANT_BUFFER_DX11); - desc.Usage = D3D11_USAGE_DYNAMIC; - desc.BindFlags = D3D11_BIND_CONSTANT_BUFFER; - desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; - d3dDevice->CreateBuffer(&desc, nullptr, _vertexConstantBuffer.put()); - } - - static winrt::com_ptr pixelShaderBlob; - if (!pixelShaderBlob) { - hr = D3DCompile(PIXEL_SHADER, StrUtils::StrLen(PIXEL_SHADER), - nullptr, nullptr, nullptr, "main", "ps_5_0", 0, 0, pixelShaderBlob.put(), nullptr); - if (FAILED(hr)) { - Logger::Get().ComError("编译像素着色器失败", hr); - return false; - } - } - - hr = d3dDevice->CreatePixelShader( - pixelShaderBlob->GetBufferPointer(), - pixelShaderBlob->GetBufferSize(), - nullptr, - _pixelShader.put() - ); - if (FAILED(hr)) { - Logger::Get().ComError("CreatePixelShader 失败", hr); - return false; - } - - { - D3D11_BLEND_DESC desc{}; - desc.AlphaToCoverageEnable = false; - desc.RenderTarget[0].BlendEnable = true; - desc.RenderTarget[0].SrcBlend = D3D11_BLEND_SRC_ALPHA; - desc.RenderTarget[0].DestBlend = D3D11_BLEND_INV_SRC_ALPHA; - desc.RenderTarget[0].BlendOp = D3D11_BLEND_OP_ADD; - desc.RenderTarget[0].SrcBlendAlpha = D3D11_BLEND_ONE; - desc.RenderTarget[0].DestBlendAlpha = D3D11_BLEND_INV_SRC_ALPHA; - desc.RenderTarget[0].BlendOpAlpha = D3D11_BLEND_OP_ADD; - desc.RenderTarget[0].RenderTargetWriteMask = D3D11_COLOR_WRITE_ENABLE_ALL; - hr = d3dDevice->CreateBlendState(&desc, _blendState.put()); - if (FAILED(hr)) { - Logger::Get().ComError("CreateBlendState 失败", hr); - return false; - } - } - - // Create the rasterizer state - { - D3D11_RASTERIZER_DESC desc{}; - desc.FillMode = D3D11_FILL_SOLID; - desc.CullMode = D3D11_CULL_NONE; - desc.ScissorEnable = true; - hr = d3dDevice->CreateRasterizerState(&desc, _rasterizerState.put()); - if (FAILED(hr)) { - Logger::Get().ComError("CreateRasterizerState 失败", hr); - return false; - } - } - - if (!_CreateFontsTexture()) { - Logger::Get().Error("_CreateFontsTexture 失败"); - return false; - } - - return true; -} - -void ImGuiBackend::NewFrame() noexcept { - if (!_fontSampler) { - _CreateDeviceObjects(); - } -} - -bool ImGuiBackend::Initialize() noexcept { - // Setup backend capabilities flags - ImGuiIO& io = ImGui::GetIO(); - io.BackendRendererName = "Magpie"; - io.BackendFlags |= ImGuiBackendFlags_RendererHasVtxOffset; // We can honor the ImDrawCmd::VtxOffset field, allowing for large meshes. - - return true; -} - -} diff --git a/src/Magpie.Core/ImGuiBackend.h b/src/Magpie.Core/ImGuiBackend.h deleted file mode 100644 index f9a722591..000000000 --- a/src/Magpie.Core/ImGuiBackend.h +++ /dev/null @@ -1,40 +0,0 @@ -#pragma once - -struct ImDrawData; - -namespace Magpie::Core { - -class ImGuiBackend { -public: - ImGuiBackend() = default; - ImGuiBackend(const ImGuiBackend&) = delete; - ImGuiBackend(ImGuiBackend&&) = delete; - - bool Initialize() noexcept; - - void NewFrame() noexcept; - void RenderDrawData(ImDrawData* drawData) noexcept; - -private: - bool _CreateDeviceObjects() noexcept; - - void _SetupRenderState(ImDrawData* drawData, ID3D11DeviceContext* ctx) noexcept; - bool _CreateFontsTexture() noexcept; - - winrt::com_ptr _vertexBuffer; - int _vertexBufferSize = 5000; - - winrt::com_ptr _indexBuffer; - int _indexBufferSize = 10000; - - winrt::com_ptr _vertexShader; - winrt::com_ptr _inputLayout; - winrt::com_ptr _vertexConstantBuffer; - winrt::com_ptr _pixelShader; - winrt::com_ptr _fontSampler; - winrt::com_ptr _fontTextureView; - winrt::com_ptr _blendState; - winrt::com_ptr _rasterizerState; -}; - -} diff --git a/src/Magpie.Core/ImGuiImpl.cpp b/src/Magpie.Core/ImGuiImpl.cpp deleted file mode 100644 index cf9c36095..000000000 --- a/src/Magpie.Core/ImGuiImpl.cpp +++ /dev/null @@ -1,336 +0,0 @@ -#include "pch.h" -#include "ImGuiImpl.h" -#include -#include -#include "ImGuiBackend.h" -#include "MagApp.h" -#include "CursorManager.h" -#include "DeviceResources.h" -#include "Renderer.h" -#include "Logger.h" -#include "Win32Utils.h" - -namespace Magpie::Core { - -ImGuiImpl::ImGuiImpl() {} - -ImGuiImpl::~ImGuiImpl() { - MagApp::Get().UnregisterWndProcHandler(_handlerId); - - if (_hHookThread) { - PostThreadMessage(_hookThreadId, WM_QUIT, 0, 0); - WaitForSingleObject(_hHookThread, 1000); - } - - _backend.reset(); - ImGui::DestroyContext(); -} - -static std::optional WndProcHandler(HWND hwnd, UINT msg, WPARAM wParam, LPARAM /*lParam*/) { - ImGuiIO& io = ImGui::GetIO(); - - if (!io.WantCaptureMouse) { - if (msg == WM_LBUTTONDOWN && MagApp::Get().GetOptions().Is3DGameMode()) { - MagApp::Get().GetRenderer().SetUIVisibility(false); - } - return std::nullopt; - } - - switch (msg) { - case WM_LBUTTONDOWN: case WM_LBUTTONDBLCLK: - case WM_RBUTTONDOWN: case WM_RBUTTONDBLCLK: - case WM_MBUTTONDOWN: case WM_MBUTTONDBLCLK: - case WM_XBUTTONDOWN: case WM_XBUTTONDBLCLK: - { - int button = 0; - if (msg == WM_LBUTTONDOWN || msg == WM_LBUTTONDBLCLK) { button = 0; } - if (msg == WM_RBUTTONDOWN || msg == WM_RBUTTONDBLCLK) { button = 1; } - if (msg == WM_MBUTTONDOWN || msg == WM_MBUTTONDBLCLK) { button = 2; } - if (msg == WM_XBUTTONDOWN || msg == WM_XBUTTONDBLCLK) { button = (GET_XBUTTON_WPARAM(wParam) == XBUTTON1) ? 3 : 4; } - - if (!ImGui::IsAnyMouseDown()) { - if (!GetCapture()) { - SetCapture(hwnd); - } - MagApp::Get().GetCursorManager().OnCursorCapturedOnOverlay(); - } - - io.MouseDown[button] = true; - break; - } - case WM_LBUTTONUP: - case WM_RBUTTONUP: - case WM_MBUTTONUP: - case WM_XBUTTONUP: - { - int button = 0; - if (msg == WM_LBUTTONUP) { button = 0; } - if (msg == WM_RBUTTONUP) { button = 1; } - if (msg == WM_MBUTTONUP) { button = 2; } - if (msg == WM_XBUTTONUP) { button = (GET_XBUTTON_WPARAM(wParam) == XBUTTON1) ? 3 : 4; } - - io.MouseDown[button] = false; - - if (!ImGui::IsAnyMouseDown()) { - if (GetCapture() == hwnd) { - ReleaseCapture(); - } - MagApp::Get().GetCursorManager().OnCursorReleasedOnOverlay(); - } - - break; - } - case WM_MOUSEWHEEL: - io.MouseWheel += (float)GET_WHEEL_DELTA_WPARAM(wParam) / (float)WHEEL_DELTA; - break; - case WM_MOUSEHWHEEL: - io.MouseWheelH += (float)GET_WHEEL_DELTA_WPARAM(wParam) / (float)WHEEL_DELTA; - break; - } - - return std::nullopt; -} - -static LRESULT CALLBACK LowLevelMouseProc( - _In_ int nCode, - _In_ WPARAM wParam, - _In_ LPARAM lParam -) { - if (nCode != HC_ACTION || !ImGui::GetIO().WantCaptureMouse) { - return CallNextHookEx(NULL, nCode, wParam, lParam); - } - - if (wParam == WM_MOUSEWHEEL || wParam == WM_MOUSEHWHEEL) { - // 向主线程发送滚动数据 - // 使用 Windows 消息进行线程同步 - PostMessage(MagApp::Get().GetHwndHost(), (UINT)wParam, ((MSLLHOOKSTRUCT*)lParam)->mouseData, 0); - - // 阻断滚轮消息,防止传给源窗口 - return -1; - } else if (wParam >= WM_LBUTTONDOWN && wParam <= WM_RBUTTONUP) { - PostMessage(MagApp::Get().GetHwndHost(), (UINT)wParam, 0, 0); - - // 阻断点击消息,防止传给源窗口 - return -1; - } else { - return CallNextHookEx(NULL, nCode, wParam, lParam); - } -} - -static DWORD WINAPI ThreadProc(LPVOID /*lpThreadParameter*/) { - HHOOK hook = SetWindowsHookEx(WH_MOUSE_LL, LowLevelMouseProc, NULL, 0); - if (!hook) { - Logger::Get().Win32Error("注册鼠标钩子失败"); - return 1; - } - - Logger::Get().Info("已注册鼠标钩子"); - - // 鼠标钩子需要消息循环 - MSG msg; - while (GetMessage(&msg, NULL, 0, 0)) { - TranslateMessage(&msg); - DispatchMessage(&msg); - } - - UnhookWindowsHookEx(hook); - Logger::Get().Info("已销毁鼠标钩子"); - return 0; -} - -bool ImGuiImpl::Initialize() { -#ifdef _DEBUG - // 检查 ImGUI 版本是否匹配 - if (!IMGUI_CHECKVERSION()) { - Logger::Get().Error("ImGui 的头文件与链接库版本不同"); - return false; - } -#endif // _DEBUG - - ImGui::CreateContext(); - - // Setup backend capabilities flags - ImGuiIO& io = ImGui::GetIO(); - io.BackendPlatformUserData = nullptr; - io.BackendPlatformName = "Magpie"; - io.ImeWindowHandle = MagApp::Get().GetHwndHost(); - io.ConfigFlags |= ImGuiConfigFlags_NavNoCaptureKeyboard | ImGuiConfigFlags_NoMouseCursorChange; - - _backend = std::make_unique(); - _backend->Initialize(); - - auto& dr = MagApp::Get().GetDeviceResources(); - if (!dr.GetRenderTargetView(dr.GetBackBuffer(), &_rtv)) { - Logger::Get().Error("GetRenderTargetView 失败"); - return false; - } - - _handlerId = MagApp::Get().RegisterWndProcHandler(WndProcHandler); - - // 断点模式下不注册鼠标钩子,否则调试时鼠标无法使用 - if (!MagApp::Get().GetOptions().IsDebugMode() && !MagApp::Get().GetOptions().Is3DGameMode()) { - _hHookThread = CreateThread(nullptr, 0, ThreadProc, nullptr, 0, &_hookThreadId); - if (!_hHookThread) { - Logger::Get().Win32Error("创建线程失败"); - } - } - - return true; -} - -static void UpdateMousePos() { - ImGuiIO& io = ImGui::GetIO(); - - if (MagApp::Get().GetOptions().Is3DGameMode() && !MagApp::Get().GetRenderer().IsUIVisiable()) { - io.MousePos = ImVec2(-FLT_MAX, -FLT_MAX); - return; - } - - POINT pos; - CursorManager& cm = MagApp::Get().GetCursorManager(); - if (cm.HasCursor()) { - pos = *cm.GetCursorPos(); - } else { - GetCursorPos(&pos); - - if (WindowFromPoint(pos) != MagApp::Get().GetHwndHost()) { - io.MousePos = ImVec2(-FLT_MAX, -FLT_MAX); - return; - } - - const RECT& hostRect = MagApp::Get().GetHostWndRect(); - pos.x -= hostRect.left; - pos.y -= hostRect.top; - } - - const RECT& outputRect = MagApp::Get().GetRenderer().GetOutputRect(); - pos.x -= outputRect.left; - pos.y -= outputRect.top; - - io.MousePos = ImVec2((float)pos.x, (float)pos.y); -} - -void ImGuiImpl::NewFrame() { - ImGuiIO& io = ImGui::GetIO(); - - // Setup display size (every frame to accommodate for window resizing) - const RECT& outputRect = MagApp::Get().GetRenderer().GetOutputRect(); - io.DisplaySize = ImVec2((float)(outputRect.right - outputRect.left), (float)(outputRect.bottom - outputRect.top)); - - // Update OS mouse position - UpdateMousePos(); - - // 不接受键盘输入 - if (io.WantCaptureKeyboard) { - io.AddKeyEvent(ImGuiKey_Enter, true); - io.AddKeyEvent(ImGuiKey_Enter, false); - } - - bool originWantCaptureMouse = io.WantCaptureMouse; - - _backend->NewFrame(); - ImGui::NewFrame(); - - // 将所有 ImGUI 窗口限制在视口内 - SIZE outputSize = Win32Utils::GetSizeOfRect(MagApp::Get().GetRenderer().GetOutputRect()); - for (ImGuiWindow* window : ImGui::GetCurrentContext()->Windows) { - if (window->Flags & ImGuiWindowFlags_Tooltip) { - continue; - } - - ImVec2 pos = window->Pos; - - if (outputSize.cx > window->Size.x) { - pos.x = std::clamp(pos.x, 0.0f, outputSize.cx - window->Size.x); - } else { - pos.x = 0; - } - - if (outputSize.cy > window->Size.y) { - pos.y = std::clamp(pos.y, 0.0f, outputSize.cy - window->Size.y); - } else { - pos.y = 0; - } - - ImGui::SetWindowPos(window, pos); - } - - CursorManager& cm = MagApp::Get().GetCursorManager(); - - if (io.WantCaptureMouse) { - if (!originWantCaptureMouse) { - cm.OnCursorHoverOverlay(); - } - } else { - if (originWantCaptureMouse) { - cm.OnCursorLeaveOverlay(); - } - } -} - -void ImGuiImpl::EndFrame() { - const RECT& outputRect = MagApp::Get().GetRenderer().GetOutputRect(); - ImGui::GetDrawData()->DisplayPos = ImVec2(float(-outputRect.left), float(-outputRect.top)); - ImGui::GetDrawData()->DisplaySize = ImVec2((float)(outputRect.right), (float)(outputRect.bottom)); - - auto d3dDC = MagApp::Get().GetDeviceResources().GetD3DDC(); - d3dDC->OMSetRenderTargets(1, &_rtv, NULL); - _backend->RenderDrawData(ImGui::GetDrawData()); -} - -void ImGuiImpl::Tooltip(const char* content, float maxWidth) { - ImVec2 padding = ImGui::GetStyle().WindowPadding; - ImVec2 contentSize = ImGui::CalcTextSize(content, nullptr, false, maxWidth - 2 * padding.x); - ImVec2 windowSize(contentSize.x + 2 * padding.x, contentSize.y + 2 * padding.y); - ImGui::SetNextWindowSize(windowSize); - - ImVec2 windowPos = ImGui::GetMousePos(); - windowPos.x += 16 * ImGui::GetStyle().MouseCursorScale; - windowPos.y += 8 * ImGui::GetStyle().MouseCursorScale; - - SIZE outputSize = Win32Utils::GetSizeOfRect(MagApp::Get().GetRenderer().GetOutputRect()); - windowPos.x = std::clamp(windowPos.x, 0.0f, outputSize.cx - windowSize.x); - windowPos.y = std::clamp(windowPos.y, 0.0f, outputSize.cy - windowSize.y); - - ImGui::SetNextWindowPos(windowPos); - - ImGui::SetNextWindowBgAlpha(ImGui::GetStyle().Colors[ImGuiCol_PopupBg].w); - ImGui::Begin("tooltip", NULL, ImGuiWindowFlags_NoInputs | ImGuiWindowFlags_NoDecoration | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoSavedSettings | ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoFocusOnAppearing); - - ImGui::PushTextWrapPos(maxWidth - padding.x); - ImGui::TextUnformatted(content); - ImGui::PopTextWrapPos(); - - ImGui::BringWindowToDisplayFront(ImGui::GetCurrentWindow()); - ImGui::End(); -} - -void ImGuiImpl::ClearStates() { - ImGuiIO& io = ImGui::GetIO(); - io.MousePos = ImVec2(-FLT_MAX, -FLT_MAX); - std::fill(std::begin(io.MouseDown), std::end(io.MouseDown), false); - - auto& cm = MagApp::Get().GetCursorManager(); - if (cm.IsCursorCapturedOnOverlay()) { - if (GetCapture() == MagApp::Get().GetHwndHost()) { - ReleaseCapture(); - } - cm.OnCursorReleasedOnOverlay(); - } - - if (cm.IsCursorOnOverlay()) { - cm.OnCursorLeaveOverlay(); - } - - // 更新状态 - ImGui::NewFrame(); - ImGui::EndFrame(); - - if (io.WantCaptureMouse) { - // 拖拽时隐藏 UI 需渲染两帧才能重置 WantCaptureMouse - ImGui::NewFrame(); - ImGui::EndFrame(); - } -} - -} diff --git a/src/Magpie.Core/ImGuiImpl.h b/src/Magpie.Core/ImGuiImpl.h deleted file mode 100644 index 213dd3e69..000000000 --- a/src/Magpie.Core/ImGuiImpl.h +++ /dev/null @@ -1,36 +0,0 @@ -#pragma once - -namespace Magpie::Core { - -class ImGuiBackend; - -class ImGuiImpl { -public: - ImGuiImpl(); - ImGuiImpl(const ImGuiImpl&) = delete; - ImGuiImpl(ImGuiImpl&&) = delete; - - ~ImGuiImpl(); - - bool Initialize(); - - void NewFrame(); - - void EndFrame(); - - void ClearStates(); - - // 将提示窗口限制在屏幕内 - static void Tooltip(const char* content, float maxWidth = -1.0f); -private: - std::unique_ptr _backend; - - ID3D11RenderTargetView* _rtv = nullptr; - uint32_t _handlerId = 0; - - HANDLE _hHookThread = NULL; - DWORD _hookThreadId = 0; - std::atomic _wheelData = 0; -}; - -} diff --git a/src/Magpie.Core/MagApp.cpp b/src/Magpie.Core/MagApp.cpp deleted file mode 100644 index 7bd25030f..000000000 --- a/src/Magpie.Core/MagApp.cpp +++ /dev/null @@ -1,582 +0,0 @@ -#include "pch.h" -#include "MagApp.h" -#include "Logger.h" -#include "Win32Utils.h" -#include "ExclModeHack.h" -#include "DeviceResources.h" -#include "GraphicsCaptureFrameSource.h" -#include "DesktopDuplicationFrameSource.h" -#include "GDIFrameSource.h" -#include "DwmSharedSurfaceFrameSource.h" -#include "StrUtils.h" -#include "CursorManager.h" -#include "Renderer.h" -#include "GPUTimer.h" -#include "WindowHelper.h" - -namespace Magpie::Core { - -static constexpr const wchar_t* HOST_WINDOW_CLASS_NAME = L"Window_Magpie_967EB565-6F73-4E94-AE53-00CC42592A22"; -static constexpr const wchar_t* DDF_WINDOW_CLASS_NAME = L"Window_Magpie_C322D752-C866-4630-91F5-32CB242A8930"; - - -static LRESULT DDFWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { - if (msg == WM_DESTROY) { - return 0; - } - - return DefWindowProc(hWnd, msg, wParam, lParam); -} - -static LRESULT CALLBACK LowLevelKeyboardProc( - _In_ int nCode, - _In_ WPARAM wParam, - _In_ LPARAM lParam -) { - if (nCode != HC_ACTION || wParam != WM_KEYDOWN) { - return CallNextHookEx(NULL, nCode, wParam, lParam); - } - - KBDLLHOOKSTRUCT* info = (KBDLLHOOKSTRUCT*)lParam; - if (info->vkCode == VK_SNAPSHOT) { - ([]()->winrt::fire_and_forget { - MagApp& app = MagApp::Get(); - - if (!app.GetOptions().IsDrawCursor()) { - co_return; - } - - // 暂时隐藏光标 - app.GetCursorManager().Hide(); - app.GetRenderer().Render(true); - - winrt::DispatcherQueue dispatcher = app.Dispatcher(); - - co_await 400ms; - co_await dispatcher; - - if (app.GetHwndHost()) { - app.GetCursorManager().Show(); - } - })(); - } - - return CallNextHookEx(NULL, nCode, wParam, lParam); -} - -MagApp::MagApp() : - _hInst(GetModuleHandle(nullptr)), - _dispatcher(winrt::DispatcherQueue::GetForCurrentThread()) -{ -} - -MagApp::~MagApp() {} - -static bool CheckSrcWindow(HWND hwndSrc, bool isAllowScalingMaximized) { - if (!WindowHelper::IsValidSrcWindow(hwndSrc)) { - Logger::Get().Info("禁止缩放系统窗口"); - return false; - } - - // 不缩放最大化和最小化的窗口 - if (UINT showCmd = Win32Utils::GetWindowShowCmd(hwndSrc); showCmd != SW_NORMAL) { - if (showCmd != SW_SHOWMAXIMIZED || !isAllowScalingMaximized) { - Logger::Get().Info(StrUtils::Concat("源窗口已", - showCmd == SW_SHOWMAXIMIZED ? "最大化" : "最小化")); - return false; - } - } - - // 不缩放过小的窗口 - RECT clientRect{}; - GetClientRect(hwndSrc, &clientRect); - SIZE clientSize = Win32Utils::GetSizeOfRect(clientRect); - if (clientSize.cx < 5 || clientSize.cy < 5) { - Logger::Get().Info("源窗口尺寸过小"); - return false; - } - -#if _DEBUG - OutputDebugString(fmt::format(L"可执行文件路径:{}\n窗口类:{}\n", - Win32Utils::GetPathOfWnd(hwndSrc), Win32Utils::GetWndClassName(hwndSrc)).c_str()); -#endif // _DEBUG - - return true; -} - -bool MagApp::Start(HWND hwndSrc, MagOptions&& options) { - if (_hwndHost) { - return false; - } - - if (!CheckSrcWindow(hwndSrc, options.IsAllowScalingMaximized())) { - return false; - } - - _hwndSrc = hwndSrc; - _options = options; - - _RegisterWndClasses(); - - if (!_CreateHostWnd()) { - _hwndSrc = NULL; - return false; - } - - _deviceResources = std::make_unique(); - if (!_deviceResources->Initialize()) { - Logger::Get().Error("初始化 DeviceResources 失败"); - Stop(); - return false; - } - - if (!_InitFrameSource()) { - Logger::Get().Error("_InitFrameSource 失败"); - Stop(); - return false; - } - - _renderer = std::make_unique(); - if (!_renderer->Initialize()) { - Logger::Get().Error("初始化 Renderer 失败"); - Stop(); - return false; - } - - _cursorManager = std::make_unique(); - if (!_cursorManager->Initialize()) { - Logger::Get().Error("初始化 CursorManager 失败"); - Stop(); - return false; - } - - if (_options.IsDisableDirectFlip() && !_options.IsDebugMode()) { - // 在此处创建的 DDF 窗口不会立刻显示 - if (!_DisableDirectFlip()) { - Logger::Get().Error("_DisableDirectFlip 失败"); - } - } - - _hKeyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, NULL, 0); - - assert(_hwndHost); - // SW_SHOWMAXIMIZED 使 Wallpaper Engine 可以在缩放时暂停动态壁纸 - // GH#502 - ShowWindow(_hwndHost, SW_SHOWMAXIMIZED); - - // 模拟独占全屏 - if (MagApp::Get().GetOptions().IsSimulateExclusiveFullscreen()) { - // 延迟 1s 以避免干扰游戏的初始化,见 #495 - ([](HWND hwndHost)->winrt::fire_and_forget { - co_await 1s; - MagApp::Get()._dispatcher.TryEnqueue([hwndHost]() { - MagApp& app = MagApp::Get(); - // 缩放窗口句柄相同就认为中途没有退出缩放。 - // 实践中很难创建出两个句柄相同的窗口,见 https://stackoverflow.com/a/65617844 - if (app._hwndHost == hwndHost && app._options.IsSimulateExclusiveFullscreen() && !app._exclModeHack) { - app._exclModeHack = std::make_unique(); - } - }); - })(_hwndHost); - }; - - return true; -} - -winrt::fire_and_forget MagApp::_WaitForSrcMovingOrSizing() { - HWND hwndSrc = _hwndSrc; - while (true) { - if (!IsWindow(hwndSrc) || GetForegroundWindow() != hwndSrc) { - break; - } else if (UINT showCmd = Win32Utils::GetWindowShowCmd(hwndSrc); showCmd != SW_NORMAL) { - if (showCmd != SW_SHOWMAXIMIZED || !MagApp::Get().GetOptions().IsAllowScalingMaximized()) { - break; - } - } - - // 检查源窗口是否正在调整大小或移动 - GUITHREADINFO guiThreadInfo{}; - guiThreadInfo.cbSize = sizeof(GUITHREADINFO); - if (!GetGUIThreadInfo(GetWindowThreadProcessId(hwndSrc, nullptr), &guiThreadInfo)) { - Logger::Get().Win32Error("GetGUIThreadInfo 失败"); - break; - } - - if (guiThreadInfo.flags & GUI_INMOVESIZE) { - co_await 10ms; - } else { - _dispatcher.TryEnqueue([this]() { - _isWaitingForSrcMovingOrSizing = false; - Start(_hwndSrc, std::move(_options)); - }); - co_return; - } - } - - _dispatcher.TryEnqueue([this]() { - _isWaitingForSrcMovingOrSizing = false; - }); -} - -void MagApp::Stop(bool isSrcMovingOrSizing) { - if (_hwndHost) { - _dispatcher.TryEnqueue([this, isSrcMovingOrSizing]() { - _isWaitingForSrcMovingOrSizing = isSrcMovingOrSizing; - - DestroyWindow(_hwndHost); - - if(isSrcMovingOrSizing) { - // 源窗口的大小或位置不再改变时重新缩放 - _WaitForSrcMovingOrSizing(); - } - }); - } -} - -void MagApp::ToggleOverlay() { - _renderer->SetUIVisibility(!_renderer->IsUIVisiable()); -} - -uint32_t MagApp::RegisterWndProcHandler(std::function(HWND, UINT, WPARAM, LPARAM)> handler) noexcept { - uint32_t id = _nextWndProcHandlerID++; - _wndProcHandlers.emplace_back(std::move(handler), id); - return id; -} - -bool MagApp::UnregisterWndProcHandler(uint32_t id) noexcept { - if (id == 0) { - return false; - } - - // 从后向前查找,因为后注册的回调更可能先取消注册 - for (int i = (int)_wndProcHandlers.size() - 1; i >= 0; --i) { - if (_wndProcHandlers[i].second == id) { - _wndProcHandlers.erase(_wndProcHandlers.begin() + i); - return true; - } - } - - return false; -} - -bool MagApp::MessageLoop() { - if (!_hwndHost) { - return true; - } - - while (true) { - MSG msg; - while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { - if (msg.message == WM_QUIT) { - Stop(); - return false; - } - - TranslateMessage(&msg); - DispatchMessage(&msg); - } - - if (!_hwndHost) { - if (_isWaitingForSrcMovingOrSizing) { - // 防止 CPU 占用过高 - WaitMessage(); - continue; - } else { - return true; - } - } - - _renderer->Render(); - - // 第二帧(等待时或完成后)显示 DDF 窗口 - // 如果在 Run 中创建会有短暂的灰屏 - // 选择第二帧的原因:当 GetFrameCount() 返回 1 时第一帧可能处于等待状态而没有渲染,见 Renderer::Render() - if (_renderer->GetGPUTimer().GetFrameCount() == 2 && _hwndDDF) { - ShowWindow(_hwndDDF, SW_NORMAL); - - if (!SetWindowPos(_hwndDDF, _hwndHost, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_NOREDRAW)) { - Logger::Get().Win32Error("SetWindowPos 失败"); - } - } - } - - return true; -} - -void MagApp::_RegisterWndClasses() const { - static bool registered = false; - if (!registered) { - registered = true; - - WNDCLASSEX wcex = {}; - wcex.cbSize = sizeof(WNDCLASSEX); - wcex.lpfnWndProc = _HostWndProcStatic; - wcex.hInstance = _hInst; - wcex.hCursor = LoadCursor(NULL, IDC_ARROW); - wcex.lpszClassName = HOST_WINDOW_CLASS_NAME; - - if (!RegisterClassEx(&wcex)) { - // 忽略此错误,因为可能是重复注册产生的错误 - Logger::Get().Win32Error("注册缩放窗口类失败"); - } - - wcex.lpfnWndProc = DDFWndProc; - wcex.hbrBackground = (HBRUSH)GetStockObject(GRAY_BRUSH); - wcex.lpszClassName = DDF_WINDOW_CLASS_NAME; - - if (!RegisterClassEx(&wcex)) { - Logger::Get().Win32Error("注册 DDF 窗口类失败"); - } - } -} - -static BOOL CALLBACK MonitorEnumProc(HMONITOR, HDC, LPRECT monitorRect, LPARAM data) { - RECT* params = (RECT*)data; - - if (Win32Utils::CheckOverlap(params[0], *monitorRect)) { - UnionRect(¶ms[1], monitorRect, ¶ms[1]); - } - - return TRUE; -} - -static bool CalcHostWndRect(HWND hWnd, MultiMonitorUsage multiMonitorUsage, RECT& result) { - switch (multiMonitorUsage) { - case MultiMonitorUsage::Closest: - { - // 使用距离源窗口最近的显示器 - HMONITOR hMonitor = MonitorFromWindow(hWnd, MONITOR_DEFAULTTONEAREST); - if (!hMonitor) { - Logger::Get().Win32Error("MonitorFromWindow 失败"); - return false; - } - - MONITORINFO mi{}; - mi.cbSize = sizeof(mi); - if (!GetMonitorInfo(hMonitor, &mi)) { - Logger::Get().Win32Error("GetMonitorInfo 失败"); - return false; - } - result = mi.rcMonitor; - - break; - } - case MultiMonitorUsage::Intersected: - { - // 使用源窗口跨越的所有显示器 - - // [0] 存储源窗口坐标,[1] 存储计算结果 - RECT params[2]{}; - - if (!Win32Utils::GetWindowFrameRect(hWnd, params[0])) { - Logger::Get().Error("GetWindowFrameRect 失败"); - return false; - } - - if (!EnumDisplayMonitors(NULL, NULL, MonitorEnumProc, (LPARAM)¶ms)) { - Logger::Get().Win32Error("EnumDisplayMonitors 失败"); - return false; - } - - result = params[1]; - if (result.right - result.left <= 0 || result.bottom - result.top <= 0) { - Logger::Get().Error("计算缩放窗口坐标失败"); - return false; - } - - break; - } - case MultiMonitorUsage::All: - { - // 使用所有显示器(Virtual Screen) - int vsWidth = GetSystemMetrics(SM_CXVIRTUALSCREEN); - int vsHeight = GetSystemMetrics(SM_CYVIRTUALSCREEN); - int vsX = GetSystemMetrics(SM_XVIRTUALSCREEN); - int vsY = GetSystemMetrics(SM_YVIRTUALSCREEN); - result = { vsX, vsY, vsX + vsWidth, vsY + vsHeight }; - - break; - } - default: - return false; - } - - return true; -} - -// 创建缩放窗口 -bool MagApp::_CreateHostWnd() { - if (FindWindow(HOST_WINDOW_CLASS_NAME, nullptr)) { - Logger::Get().Error("已存在缩放窗口"); - return false; - } - - if (!CalcHostWndRect(_hwndSrc, _options.multiMonitorUsage, _hostWndRect)) { - Logger::Get().Error("CalcHostWndRect 失败"); - return false; - } - - if (!_options.IsAllowScalingMaximized()) { - // 源窗口和缩放窗口重合则不缩放,此时源窗口可能是无边框全屏窗口 - RECT srcRect; - if (!Win32Utils::GetWindowFrameRect(_hwndSrc, srcRect)) { - Win32Utils::GetClientScreenRect(_hwndSrc, srcRect); - } - - if (srcRect == _hostWndRect) { - Logger::Get().Info("源窗口已全屏"); - return false; - } - } - - // WS_EX_NOREDIRECTIONBITMAP 可以避免 WS_EX_LAYERED 导致的额外内存开销 - _hwndHost = CreateWindowEx( - (_options.IsDebugMode() ? 0 : WS_EX_TOPMOST) | WS_EX_NOACTIVATE - | WS_EX_LAYERED | WS_EX_NOREDIRECTIONBITMAP | WS_EX_TRANSPARENT | WS_EX_TOOLWINDOW, - HOST_WINDOW_CLASS_NAME, - NULL, // 标题为空,否则会被添加新配置页面列为候选窗口 - WS_POPUP, - _hostWndRect.left, - _hostWndRect.top, - _hostWndRect.right - _hostWndRect.left, - _hostWndRect.bottom - _hostWndRect.top, - NULL, - NULL, - _hInst, - NULL - ); - if (!_hwndHost) { - Logger::Get().Win32Error("创建缩放窗口失败"); - return false; - } - - Logger::Get().Info(fmt::format("缩放窗口尺寸:{}x{}", - _hostWndRect.right - _hostWndRect.left, _hostWndRect.bottom - _hostWndRect.top)); - - // 设置窗口不透明 - // 不完全透明时可关闭 DirectFlip - if (!SetLayeredWindowAttributes(_hwndHost, 0, _options.IsDisableDirectFlip() ? 254 : 255, LWA_ALPHA)) { - Logger::Get().Win32Error("SetLayeredWindowAttributes 失败"); - } - - return true; -} - -bool MagApp::_InitFrameSource() { - switch (_options.captureMethod) { - case CaptureMethod::GraphicsCapture: - _frameSource = std::make_unique(); - break; - case CaptureMethod::DesktopDuplication: - _frameSource = std::make_unique(); - break; - case CaptureMethod::GDI: - _frameSource = std::make_unique(); - break; - case CaptureMethod::DwmSharedSurface: - _frameSource = std::make_unique(); - break; - default: - Logger::Get().Critical("未知的捕获模式"); - return false; - } - - Logger::Get().Info(StrUtils::Concat("当前捕获模式:", _frameSource->GetName())); - - if (!_frameSource->Initialize()) { - Logger::Get().Critical("初始化 FrameSource 失败"); - return false; - } - - const RECT& frameRect = _frameSource->GetSrcFrameRect(); - Logger::Get().Info(fmt::format("源窗口尺寸:{}x{}", - frameRect.right - frameRect.left, frameRect.bottom - frameRect.top)); - - return true; -} - -bool MagApp::_DisableDirectFlip() { - // 没有显式关闭 DirectFlip 的方法 - // 将全屏窗口设为稍微透明,以灰色全屏窗口为背景 - _hwndDDF = CreateWindowEx( - WS_EX_NOACTIVATE | WS_EX_LAYERED | WS_EX_TRANSPARENT, - DDF_WINDOW_CLASS_NAME, - NULL, - WS_POPUP, - _hostWndRect.left, - _hostWndRect.top, - _hostWndRect.right - _hostWndRect.left, - _hostWndRect.bottom - _hostWndRect.top, - NULL, - NULL, - _hInst, - NULL - ); - - if (!_hwndDDF) { - Logger::Get().Win32Error("创建 DDF 窗口失败"); - return false; - } - - // 设置窗口不透明 - if (!SetLayeredWindowAttributes(_hwndDDF, 0, 255, LWA_ALPHA)) { - Logger::Get().Win32Error("SetLayeredWindowAttributes 失败"); - } - - if (_frameSource->IsScreenCapture()) { - if (Win32Utils::GetOSVersion().Is20H1OrNewer()) { - // 使 DDF 窗口无法被捕获到 - if (!SetWindowDisplayAffinity(_hwndDDF, WDA_EXCLUDEFROMCAPTURE)) { - Logger::Get().Win32Error("SetWindowDisplayAffinity 失败"); - } - } - } - - return true; -} - -LRESULT MagApp::_HostWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { - // 以反向调用回调 - for (auto it = _wndProcHandlers.rbegin(); it != _wndProcHandlers.rend(); ++it) { - const auto& result = it->first(hWnd, msg, wParam, lParam); - if (result.has_value()) { - return *result; - } - } - - switch (msg) { - case WM_DESTROY: - { - _OnQuit(); - - if (_hwndDDF) { - DestroyWindow(_hwndDDF); - _hwndDDF = NULL; - } - - _hwndHost = NULL; - return 0; - } - } - - return DefWindowProc(hWnd, msg, wParam, lParam); -} - -void MagApp::_OnQuit() { - if (_hKeyboardHook) { - UnhookWindowsHookEx(_hKeyboardHook); - _hKeyboardHook = NULL; - } - - // 释放资源 - _exclModeHack.reset(); - _cursorManager.reset(); - _renderer.reset(); - _frameSource.reset(); - _deviceResources.reset(); - - _nextWndProcHandlerID = 1; - _wndProcHandlers.clear(); -} - -} diff --git a/src/Magpie.Core/MagApp.h b/src/Magpie.Core/MagApp.h deleted file mode 100644 index bf334479f..000000000 --- a/src/Magpie.Core/MagApp.h +++ /dev/null @@ -1,126 +0,0 @@ -#pragma once -#include "MagOptions.h" -#include - -namespace Magpie::Core { - -class DeviceResources; -class Renderer; -class FrameSourceBase; -class CursorManager; -class ExclModeHack; - -class MagApp { -public: - ~MagApp(); - - static MagApp& Get() noexcept { - static MagApp instance; - return instance; - } - - bool Start(HWND hwndSrc, MagOptions&& options); - - void Stop(bool isSrcMovingOrSizing = false); - - void ToggleOverlay(); - - HINSTANCE GetHInstance() const noexcept { - return _hInst; - } - - HWND GetHwndSrc() const noexcept { - return _hwndSrc; - } - - HWND GetHwndHost() const noexcept { - return _hwndHost; - } - - const RECT& GetHostWndRect() const noexcept { - return _hostWndRect; - } - - DeviceResources& GetDeviceResources() noexcept { - return *_deviceResources; - } - - Renderer& GetRenderer() noexcept { - return *_renderer; - } - - FrameSourceBase& GetFrameSource() noexcept { - return *_frameSource; - } - - CursorManager& GetCursorManager() noexcept { - return *_cursorManager; - } - - MagOptions& GetOptions() noexcept { - return _options; - } - - winrt::DispatcherQueue Dispatcher() const noexcept { - return _dispatcher; - } - - // 注册消息回调,回调函数如果不阻断消息应返回空 - // 返回 ID,不会为 0 - uint32_t RegisterWndProcHandler(std::function(HWND, UINT, WPARAM, LPARAM)> handler) noexcept; - bool UnregisterWndProcHandler(uint32_t id) noexcept; - - bool MessageLoop(); - -private: - MagApp(); - - void _RegisterWndClasses() const; - - // 创建主窗口 - bool _CreateHostWnd(); - - bool _InitFrameSource(); - - bool _DisableDirectFlip(); - - static LRESULT CALLBACK _HostWndProcStatic(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { - return Get()._HostWndProc(hWnd, msg, wParam, lParam); - } - - LRESULT _HostWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); - - void _OnQuit(); - - winrt::fire_and_forget _WaitForSrcMovingOrSizing(); - - const winrt::DispatcherQueue _dispatcher{ nullptr }; - - HINSTANCE _hInst = NULL; - HWND _hwndSrc = NULL; - HWND _hwndHost = NULL; - - // 关闭 DirectFlip 时的背景全屏窗口 - HWND _hwndDDF = NULL; - - RECT _hostWndRect{}; - - std::unique_ptr _deviceResources; - std::unique_ptr _renderer; - std::unique_ptr _frameSource; - std::unique_ptr _cursorManager; - std::unique_ptr _exclModeHack; - MagOptions _options; - - HHOOK _hKeyboardHook = NULL; - - SmallVector(HWND, UINT, WPARAM, LPARAM)>, uint32_t>, 2> _wndProcHandlers; - uint32_t _nextWndProcHandlerID = 1; - - bool _windowResizingDisabled = false; - bool _roundCornerDisabled = false; - - bool _isWaitingForSrcMovingOrSizing = false; -}; - -} diff --git a/src/Magpie.Core/Magpie.Core.vcxproj b/src/Magpie.Core/Magpie.Core.vcxproj index e3c9a31e0..cab558ff8 100644 --- a/src/Magpie.Core/Magpie.Core.vcxproj +++ b/src/Magpie.Core/Magpie.Core.vcxproj @@ -78,67 +78,37 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Create - diff --git a/src/Magpie.Core/Magpie.Core.vcxproj.filters b/src/Magpie.Core/Magpie.Core.vcxproj.filters index ca10b8ce8..953eda6d6 100644 --- a/src/Magpie.Core/Magpie.Core.vcxproj.filters +++ b/src/Magpie.Core/Magpie.Core.vcxproj.filters @@ -28,40 +28,9 @@ - - - - - - - - - Capture - - - Capture - - - Capture - - - Capture - - - Capture - - - Overlay - - - Overlay - - - Overlay - TextureLoader @@ -100,39 +69,8 @@ - - - - - - - - - Capture - - - Capture - - - Capture - - - Capture - - - Capture - - - Overlay - - - Overlay - - - Overlay - TextureLoader diff --git a/src/Magpie.Core/OverlayDrawer.cpp b/src/Magpie.Core/OverlayDrawer.cpp deleted file mode 100644 index 67fdff363..000000000 --- a/src/Magpie.Core/OverlayDrawer.cpp +++ /dev/null @@ -1,1154 +0,0 @@ -#include "pch.h" -#include "OverlayDrawer.h" -#include "MagApp.h" -#include "DeviceResources.h" -#include "ImGuiImpl.h" -#include "Renderer.h" -#include "GPUTimer.h" -#include "Logger.h" -#include "StrUtils.h" -#include "Win32Utils.h" -#include "FrameSourceBase.h" -#include "CommonSharedConstants.h" -#include "EffectDesc.h" -#include // std::bit_ceil -#include -#include "ImGuiHelper.h" -#include "ImGuiFontsCacheManager.h" - -namespace Magpie::Core { - -static const std::wstring& GetSystemFontsFolder() noexcept { - static std::wstring result; - - if (result.empty()) { - wchar_t* fontsFolder = nullptr; - HRESULT hr = SHGetKnownFolderPath(FOLDERID_Fonts, 0, NULL, &fontsFolder); - if (FAILED(hr)) { - CoTaskMemFree(fontsFolder); - Logger::Get().ComError("SHGetKnownFolderPath 失败", hr); - return result; - } - - result = fontsFolder; - CoTaskMemFree(fontsFolder); - } - - return result; -} - -OverlayDrawer::OverlayDrawer() noexcept { - HWND hwndSrc = MagApp::Get().GetHwndSrc(); - _isSrcMainWnd = Win32Utils::GetWndClassName(hwndSrc) == CommonSharedConstants::MAIN_WINDOW_CLASS_NAME; -} - -OverlayDrawer::~OverlayDrawer() { - if (MagApp::Get().GetOptions().Is3DGameMode() && IsUIVisiable()) { - _EnableSrcWnd(true); - } -} - -static const ImColor TIMELINE_COLORS[] = { - {229,57,53,255}, - {156,39,176,255}, - {63,81,181,255}, - {30,136,229,255}, - {0,137,123,255}, - {121,85,72,255}, - {117,117,117,255} -}; - -static UINT GetSeed() { - Renderer& renderer = MagApp::Get().GetRenderer(); - UINT nEffect = renderer.GetEffectCount(); - - UINT result = 0; - for (UINT i = 0; i < nEffect; ++i) { - result ^= (UINT)std::hash()(renderer.GetEffectDesc(i).name); - } - return result; -} - -static SmallVector GenerateTimelineColors() { - Renderer& renderer = MagApp::Get().GetRenderer(); - - const UINT nEffect = renderer.GetEffectCount(); - UINT totalColors = nEffect > 1 ? nEffect : 0; - for (UINT i = 0; i < nEffect; ++i) { - UINT nPass = (UINT)renderer.GetEffectDesc(i).passes.size(); - if (nPass > 1) { - totalColors += nPass; - } - } - - if (totalColors == 0) { - return {}; - } - - constexpr UINT nColors = (UINT)std::size(TIMELINE_COLORS); - - std::default_random_engine randomEngine(GetSeed()); - SmallVector result; - - if (totalColors <= nColors) { - result.resize(nColors); - for (UINT i = 0; i < nColors; ++i) { - result[i] = i; - } - std::shuffle(result.begin(), result.end(), randomEngine); - - result.resize(totalColors); - } else { - // 相邻通道颜色不同,相邻效果颜色不同 - result.resize(totalColors); - std::uniform_int_distribution uniformDst(0, nColors - 1); - - if (nEffect <= nColors) { - if (nEffect > 1) { - // 确保效果的颜色不重复 - std::array effectColors{}; - for (UINT i = 0; i < nColors; ++i) { - effectColors[i] = i; - } - std::shuffle(effectColors.begin(), effectColors.end(), randomEngine); - - UINT i = 0; - for (UINT j = 0; j < nEffect; ++j) { - result[i] = effectColors[j]; - ++i; - - UINT nPass = (UINT)renderer.GetEffectDesc(j).passes.size(); - if (nPass > 1) { - i += nPass; - } - } - } - } else { - // 仅确保与前一个效果颜色不同 - UINT prevColor = UINT_MAX; - UINT i = 0; - for (UINT j = 0; j < nEffect; ++j) { - UINT c = uniformDst(randomEngine); - while (c == prevColor) { - c = uniformDst(randomEngine); - } - - result[i] = c; - prevColor = c; - ++i; - - UINT nPass = (UINT)renderer.GetEffectDesc(j).passes.size(); - if (nPass > 1) { - i += nPass; - } - } - } - - // 生成通道的颜色 - size_t idx = 0; - for (UINT i = 0; i < nEffect; ++i) { - UINT nPass = (UINT)renderer.GetEffectDesc(i).passes.size(); - - if (nEffect > 1) { - ++idx; - - if (nPass == 1) { - continue; - } - } - - for (UINT j = 0; j < nPass; ++j) { - UINT c = uniformDst(randomEngine); - - if (i > 0 || j > 0) { - UINT prevColor = (i > 0 && j == 0) ? result[idx - 2] : result[idx - 1]; - - if (j + 1 == nPass && i + 1 != nEffect && - renderer.GetEffectDesc(i + 1).passes.size() == 1) { - // 当前效果的最后一个通道且下一个效果只有一个通道 - UINT nextColor = result[idx + 1]; - while (c == prevColor || c == nextColor) { - c = uniformDst(randomEngine); - } - } else { - while (c == prevColor) { - c = uniformDst(randomEngine); - } - } - } - - result[idx] = c; - ++idx; - } - } - } - - return result; -} - -bool OverlayDrawer::Initialize() noexcept { - _imguiImpl.reset(new ImGuiImpl()); - if (!_imguiImpl->Initialize()) { - Logger::Get().Error("初始化 ImGuiImpl 失败"); - return false; - } - - _dpiScale = GetDpiForWindow(MagApp::Get().GetHwndHost()) / 96.0f; - - ImGui::StyleColorsDark(); - ImGuiStyle& style = ImGui::GetStyle(); - style.PopupRounding = style.WindowRounding = 6; - style.FrameBorderSize = 1; - style.FrameRounding = 2; - style.WindowMinSize = ImVec2(10, 10); - style.ScaleAllSizes(_dpiScale); - - if (!_BuildFonts()) { - Logger::Get().Error("_BuildFonts 失败"); - return false; - } - - _RetrieveHardwareInfo(); - _timelineColors = GenerateTimelineColors(); - - // 将 _fontUI 设为默认字体 - ImGui::GetIO().FontDefault = _fontUI; - - return true; -} - -void OverlayDrawer::Draw() noexcept { - bool isShowFPS = MagApp::Get().GetOptions().IsShowFPS(); - - if (!_isUIVisiable && !isShowFPS) { - return; - } - - _imguiImpl->NewFrame(); - - if (isShowFPS) { - _DrawFPS(); - } - - if (_isUIVisiable) { - _DrawUI(); - } - - ImGui::Render(); - _imguiImpl->EndFrame(); -} - -void OverlayDrawer::SetUIVisibility(bool value) noexcept { - if (_isUIVisiable == value) { - return; - } - _isUIVisiable = value; - - if (value) { - if (MagApp::Get().GetOptions().Is3DGameMode()) { - // 使全屏窗口不透明且可以接收焦点 - HWND hwndHost = MagApp::Get().GetHwndHost(); - INT_PTR style = GetWindowLongPtr(hwndHost, GWL_EXSTYLE); - SetWindowLongPtr(hwndHost, GWL_EXSTYLE, style & ~(WS_EX_TRANSPARENT | WS_EX_NOACTIVATE)); - Win32Utils::SetForegroundWindow(hwndHost); - - // 使源窗口无法接收用户输入 - _EnableSrcWnd(false); - // 由 ImGui 绘制光标 - ImGui::GetIO().MouseDrawCursor = true; - } - - Logger::Get().Info("已开启覆盖层"); - } else { - _validFrames = 0; - std::fill(_frameTimes.begin(), _frameTimes.end(), 0.0f); - - if (!MagApp::Get().GetOptions().IsShowFPS()) { - _imguiImpl->ClearStates(); - } - - if (MagApp::Get().GetOptions().Is3DGameMode()) { - // 还原全屏窗口样式 - HWND hwndHost = MagApp::Get().GetHwndHost(); - INT_PTR style = GetWindowLongPtr(hwndHost, GWL_EXSTYLE); - SetWindowLongPtr(hwndHost, GWL_EXSTYLE, style | (WS_EX_TRANSPARENT | WS_EX_NOACTIVATE)); - - // 重新激活源窗口 - _EnableSrcWnd(true); - - ImGui::GetIO().MouseDrawCursor = false; - } - - Logger::Get().Info("已关闭覆盖层"); - } -} - -static const std::wstring& GetAppLanguage() noexcept { - static std::wstring language; - if (language.empty()) { - winrt::ResourceContext resourceContext = winrt::ResourceContext::GetForViewIndependentUse(); - language = resourceContext.QualifierValues().Lookup(L"Language"); - StrUtils::ToLowerCase(language); - } - return language; -} - -bool OverlayDrawer::_BuildFonts() noexcept { - const std::wstring& language = GetAppLanguage(); - - ImFontAtlas& fontAtlas = *ImGui::GetIO().Fonts; - - bool fontCacheDisabled = MagApp::Get().GetOptions().IsDisableFontCache(); - if (!fontCacheDisabled && ImGuiFontsCacheManager::Get().Load(language, fontAtlas)) { - _fontUI = fontAtlas.Fonts[0]; - _fontMonoNumbers = fontAtlas.Fonts[1]; - _fontFPS = fontAtlas.Fonts[2]; - return true; - } - - fontAtlas.Flags |= ImFontAtlasFlags_NoPowerOfTwoHeight; - if (!MagApp::Get().GetOptions().Is3DGameMode()) { - // 非 3D 游戏模式无需 ImGui 绘制光标 - fontAtlas.Flags |= ImFontAtlasFlags_NoMouseCursors; - } - - std::wstring fontPath = GetSystemFontsFolder(); - if (Win32Utils::GetOSVersion().IsWin11()) { - fontPath += L"\\SegUIVar.ttf"; - } else { - fontPath += L"\\segoeui.ttf"; - } - - std::vector fontData; - if (!Win32Utils::ReadFile(fontPath.c_str(), fontData)) { - Logger::Get().Error("读取字体文件失败"); - return false; - } - - // 构建字体前 uiRanges 不能析构,因为 ImGui 只保存了指针 - ImVector uiRanges; - _BuildFontUI(language, fontData, uiRanges); - _BuildFontFPS(fontData); - - if (!fontAtlas.Build()) { - Logger::Get().Error("构建字体失败"); - return false; - } - - if (!fontCacheDisabled) { - ImGuiFontsCacheManager::Get().Save(language, fontAtlas); - } - - return true; -} - -void OverlayDrawer::_BuildFontUI(std::wstring_view language, const std::vector& fontData, ImVector& uiRanges) noexcept { - ImFontAtlas& fontAtlas = *ImGui::GetIO().Fonts; - - std::string extraFontPath; - const ImWchar* extraRanges = nullptr; - int extraFontNo = 0; - - ImFontGlyphRangesBuilder builder; - - if (language == L"en-us") { - builder.AddRanges(ImGuiHelper::ENGLISH_RANGES); - } else if (language == L"es" || language == L"pt-br") { - // Basic Latin + Latin-1 Supplement - // 参见 https://en.wikipedia.org/wiki/Latin-1_Supplement - builder.AddRanges(fontAtlas.GetGlyphRangesDefault()); - } else if (language == L"ru" || language == L"uk") { - builder.AddRanges(fontAtlas.GetGlyphRangesCyrillic()); - } else if (language == L"tr") { - builder.AddRanges(ImGuiHelper::TURKISH_RANGES); - } else { - builder.AddRanges(fontAtlas.GetGlyphRangesDefault()); - - // 一些语言需要加载额外的字体: - // 简体中文 -> Microsoft YaHei UI - // 繁体中文 -> Microsoft JhengHei UI - // 日语 -> Yu Gothic UI - // 韩语/朝鲜语 -> Malgun Gothic - // 参见 https://learn.microsoft.com/en-us/windows/apps/design/style/typography#fonts-for-non-latin-languages - - extraFontPath = StrUtils::UTF16ToUTF8(GetSystemFontsFolder()); - extraFontPath.push_back(L'\\'); - if (language == L"zh-hans") { - // msyh.ttc: 0 是微软雅黑,1 是 Microsoft YaHei UI - extraFontPath += "msyh.ttc"; - extraFontNo = 1; - extraRanges = ImGuiHelper::GetGlyphRangesChineseSimplifiedOfficial(); - } else if (language == L"zh-hant") { - // msjh.ttc: 0 是 Microsoft JhengHei,1 是 Microsoft JhengHei UI - extraFontPath += "msjh.ttc"; - extraFontNo = 1; - extraRanges = ImGuiHelper::GetGlyphRangesChineseTraditionalOfficial(); - } else if (language == L"ja") { - // YuGothM.ttc: 0 是 Yu Gothic Medium,1 是 Yu Gothic UI - extraFontPath += "YuGothM.ttc"; - extraFontNo = 1; - extraRanges = fontAtlas.GetGlyphRangesJapanese(); - } else if (language == L"ko") { - extraFontPath += "malgun.ttf"; - extraRanges = fontAtlas.GetGlyphRangesKorean(); - } - } - builder.SetBit(L'■'); - builder.BuildRanges(&uiRanges); - - ImFontConfig config; - config.FontDataOwnedByAtlas = false; - - const float fontSize = 18 * _dpiScale; - - ////////////////////////////////////////////////////////// - // - // uiRanges (+ extraRanges) -> _fontUI - // - ////////////////////////////////////////////////////////// - - -#ifdef _DEBUG - std::char_traits::copy(config.Name, "_fontUI", std::size(config.Name)); -#endif - - _fontUI = fontAtlas.AddFontFromMemoryTTF( - (void*)fontData.data(), (int)fontData.size(), fontSize, &config, uiRanges.Data); - - if (extraRanges) { - assert(Win32Utils::FileExists(StrUtils::UTF8ToUTF16(extraFontPath).c_str())); - - // 在 MergeMode 下已有字符会跳过而不是覆盖 - config.MergeMode = true; - config.FontNo = extraFontNo; - // 额外字体数据由 ImGui 管理,退出缩放时释放 - config.FontDataOwnedByAtlas = true; - fontAtlas.AddFontFromFileTTF(extraFontPath.c_str(), fontSize, &config, extraRanges); - config.FontDataOwnedByAtlas = false; - config.FontNo = 0; - config.MergeMode = false; - } - - ////////////////////////////////////////////////////////// - // - // NUMBER_RANGES + NOT_NUMBER_RANGES -> _fontMonoNumbers - // - ////////////////////////////////////////////////////////// - -#ifdef _DEBUG - std::char_traits::copy(config.Name, "_fontMonoNumbers", std::size(config.Name)); -#endif - - // 等宽的数字字符 - config.GlyphMinAdvanceX = config.GlyphMaxAdvanceX = fontSize * 0.42f; - _fontMonoNumbers = fontAtlas.AddFontFromMemoryTTF( - (void*)fontData.data(), (int)fontData.size(), fontSize, &config, ImGuiHelper::NUMBER_RANGES); - - // 其他不等宽的字符 - config.MergeMode = true; - config.GlyphMinAdvanceX = 0; - config.GlyphMaxAdvanceX = std::numeric_limits::max(); - fontAtlas.AddFontFromMemoryTTF( - (void*)fontData.data(), (int)fontData.size(), fontSize, &config, ImGuiHelper::NOT_NUMBER_RANGES); -} - -void OverlayDrawer::_BuildFontFPS(const std::vector& fontData) noexcept { - ImFontAtlas& fontAtlas = *ImGui::GetIO().Fonts; - - ImFontConfig config; - config.FontDataOwnedByAtlas = false; - - const float fpsSize = 24 * _dpiScale; - - ////////////////////////////////////////////////////////// - // - // NUMBER_RANGES + " FPS" -> _fontFPS - // - ////////////////////////////////////////////////////////// - -#ifdef _DEBUG - std::char_traits::copy(config.Name, "_fontFPS", std::size(config.Name)); -#endif - - // 等宽的数字字符 - config.MergeMode = false; - config.GlyphMinAdvanceX = config.GlyphMaxAdvanceX = fpsSize * 0.42f; - _fontFPS = fontAtlas.AddFontFromMemoryTTF( - (void*)fontData.data(), (int)fontData.size(), fpsSize, &config, ImGuiHelper::NUMBER_RANGES); - - // 其他不等宽的字符 - config.MergeMode = true; - config.GlyphMinAdvanceX = 0; - config.GlyphMaxAdvanceX = std::numeric_limits::max(); - fontAtlas.AddFontFromMemoryTTF( - (void*)fontData.data(), (int)fontData.size(), fpsSize, &config, (const ImWchar*)L" FFPPSS"); -} - -static std::string_view GetEffectDisplayName(const EffectDesc* desc) noexcept { - auto delimPos = desc->name.find_last_of('\\'); - if (delimPos == std::string::npos) { - return desc->name; - } else { - return std::string_view(desc->name.begin() + delimPos + 1, desc->name.end()); - } -} - -static void DrawTextWithFont(const char* text, ImFont* font) noexcept { - ImGui::PushFont(font); - ImGui::TextUnformatted(text); - ImGui::PopFont(); -} - -// 返回鼠标悬停的项的序号,未悬停于任何项返回 -1 -int OverlayDrawer::_DrawEffectTimings( - const _EffectTimings& et, - bool showPasses, - float maxWindowWidth, - std::span colors, - bool singleEffect -) noexcept { - ImGui::TableNextRow(); - ImGui::TableNextColumn(); - - int result = -1; - - if (!singleEffect && (et.passTimings.size() == 1 || !showPasses)) { - ImGui::Selectable("", false, ImGuiSelectableFlags_SpanAllColumns); - if (ImGui::IsItemHovered()) { - result = 0; - } - ImGui::SameLine(0, 0); - - ImGui::PushStyleColor(ImGuiCol_Text, (ImU32)colors[0]); - ImGui::TextUnformatted("■"); - ImGui::PopStyleColor(); - ImGui::SameLine(0, 3); - } - - ImGui::TextUnformatted(std::string(GetEffectDisplayName(et.desc)).c_str()); - - ImGui::TableNextColumn(); - - const float rightAlignSpace = ImGui::CalcTextSize("0").x; - - if (et.passTimings.size() > 1) { - if (showPasses) { - ImGui::PushStyleColor(ImGuiCol_Text, ImVec4(1, 1, 1, 0.5f)); - } - - if (et.totalTime < 10) { - // 右对齐 - ImGui::Dummy(ImVec2(rightAlignSpace, 0)); - ImGui::SameLine(0, 0); - } - DrawTextWithFont(fmt::format("{:.3f} ms", et.totalTime).c_str(), _fontMonoNumbers); - - if (showPasses) { - ImGui::PopStyleColor(); - } - - if (showPasses) { - for (size_t j = 0; j < et.passTimings.size(); ++j) { - ImGui::TableNextRow(); - ImGui::TableNextColumn(); - - ImGui::Indent(20); - - float fontHeight = ImGui::GetFont()->FontSize; - std::string time = fmt::format("{:.3f} ms", et.passTimings[j]); - // 手动计算布局 - // 运行到此处时还无法确定是否需要滚动条,这里始终减去滚动条的宽度,否则展开时可能会有一帧的跳跃 - float descWrap = maxWindowWidth - ImGui::CalcTextSize(time.c_str()).x - ImGui::GetStyle().WindowPadding.x - ImGui::GetStyle().ScrollbarSize - ImGui::GetStyle().CellPadding.x * 2; - float descHeight = ImGui::CalcTextSize(et.desc->passes[j].desc.c_str(), nullptr, false, descWrap - ImGui::GetCursorPos().x - ImGui::CalcTextSize("■").x - 3).y; - - ImGui::PushStyleColor(ImGuiCol_Text, (ImU32)colors[j]); - if (descHeight >= fontHeight * 2) { - // 不知为何 SetCursorPos 不起作用 - // 所以这里使用占位竖直居中颜色框 - ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2()); - ImGui::BeginGroup(); - ImGui::Dummy(ImVec2(0, (descHeight - fontHeight) / 2)); - ImGui::TextUnformatted("■"); - ImGui::EndGroup(); - ImGui::PopStyleVar(); - } else { - ImGui::TextUnformatted("■"); - } - - ImGui::PopStyleColor(); - ImGui::SameLine(0, 3); - - ImGui::PushTextWrapPos(descWrap); - ImGui::TextUnformatted(et.desc->passes[j].desc.c_str()); - ImGui::PopTextWrapPos(); - ImGui::Unindent(20); - - ImGui::SameLine(0, 0); - ImGui::Selectable("", false, ImGuiSelectableFlags_SpanAllColumns, ImVec2(0, descHeight)); - if (ImGui::IsItemHovered()) { - result = (int)j; - } - - ImGui::TableNextColumn(); - // 描述过长导致换行时竖直居中时间 - if (descHeight >= fontHeight * 2) { - ImGui::SetCursorPosY(ImGui::GetCursorPosY() + (descHeight - fontHeight) / 2); - } - - if (et.passTimings[j] < 10) { - ImGui::Dummy(ImVec2(rightAlignSpace, 0)); - ImGui::SameLine(0, 0); - } - DrawTextWithFont(time.c_str(), _fontMonoNumbers); - } - } - } else { - if (et.totalTime < 10) { - ImGui::Dummy(ImVec2(rightAlignSpace, 0)); - ImGui::SameLine(0, 0); - } - DrawTextWithFont(fmt::format("{:.3f} ms", et.totalTime).c_str(), _fontMonoNumbers); - } - - return result; -} - -void OverlayDrawer::_DrawTimelineItem(ImU32 color, float dpiScale, std::string_view name, float time, float effectsTotalTime, bool selected) { - ImGui::TableSetBgColor(ImGuiTableBgTarget_CellBg, color); - ImGui::PushStyleColor(ImGuiCol_HeaderActive, color); - ImGui::PushStyleColor(ImGuiCol_HeaderHovered, color); - ImGui::PushStyleColor(ImGuiCol_Header, color); - ImGui::Selectable("", selected); - ImGui::PopStyleColor(3); - - if (ImGui::IsItemHovered() || ImGui::IsItemClicked()) { - std::string content = fmt::format("{}\n{:.3f} ms\n{}%", name, time, std::lroundf(time / effectsTotalTime * 100)); - ImGui::PushFont(_fontMonoNumbers); - ImGuiImpl::Tooltip(content.c_str(), 500 * dpiScale); - ImGui::PopFont(); - } - - // 空间足够时显示文字 - std::string text; - if (selected) { - text = fmt::format("{}%", std::lroundf(time / effectsTotalTime * 100)); - } else { - text.assign(name); - } - - float textWidth = ImGui::CalcTextSize(text.c_str()).x; - float itemWidth = ImGui::GetItemRectSize().x; - float itemSpacing = ImGui::GetStyle().ItemSpacing.x; - if (itemWidth - (selected ? 0 : itemSpacing) > textWidth + 4 * _dpiScale) { - ImGui::SameLine(0, 0); - ImGui::SetCursorPosX(ImGui::GetCursorPosX() + (itemWidth - textWidth - itemSpacing) / 2); - ImGui::TextUnformatted(text.c_str()); - } -} - -void OverlayDrawer::_DrawFPS() noexcept { - static float oldOpacity = 0.0f; - static float opacity = 0.0f; - static bool isLocked = false; - // 背景透明时绘制阴影 - const bool drawShadow = opacity < 1e-5f; - - static constexpr float PADDING_X = 5; - static constexpr float PADDING_Y = 1; - - ImGui::SetNextWindowPos(ImVec2(10, 10), ImGuiCond_FirstUseEver); - ImGui::SetNextWindowBgAlpha(opacity); - - ImGui::PushStyleVar(ImGuiStyleVar_WindowBorderSize, 0.0f); - ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, drawShadow ? ImVec2() : ImVec2(PADDING_X, PADDING_Y)); - if (!ImGui::Begin("FPS", nullptr, ImGuiWindowFlags_NoNav | ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoDecoration | ImGuiWindowFlags_NoFocusOnAppearing | (isLocked ? ImGuiWindowFlags_NoMove : 0) | (drawShadow ? ImGuiWindowFlags_NoBackground : 0))) { - // Early out if the window is collapsed, as an optimization. - ImGui::End(); - return; - } - - if (oldOpacity != opacity) { - // 透明时无边距,确保文字位置不变 - if (oldOpacity < 1e-5f) { - if (opacity >= 1e-5f) { - ImVec2 windowPos = ImGui::GetWindowPos(); - ImGui::SetWindowPos(ImVec2(windowPos.x - PADDING_X, windowPos.y - PADDING_Y)); - } - } else { - if (opacity < 1e-5f) { - ImVec2 windowPos = ImGui::GetWindowPos(); - ImGui::SetWindowPos(ImVec2(windowPos.x + PADDING_X, windowPos.y + PADDING_Y)); - } - } - oldOpacity = opacity; - } - - ImGui::PushFont(_fontFPS); - - ImVec2 cursorPos = ImGui::GetCursorPos(); - // 不知为何文字无法竖直居中,因此这里调整位置 - cursorPos.y -= 3; - ImGui::SetCursorPosY(cursorPos.y); - - std::string fps = fmt::format("{} FPS", MagApp::Get().GetRenderer().GetGPUTimer().GetFramesPerSecond()); - if (drawShadow) { - ImGui::SetCursorPos(ImVec2(cursorPos.x + 1.0f, cursorPos.y + 1.0f)); - ImGui::PushStyleColor(ImGuiCol_Text, ImVec4(0.0f, 0.0f, 0.0f, 0.8f)); - ImGui::TextUnformatted(fps.c_str()); - ImGui::PopStyleColor(); - - ImGui::SetCursorPos(cursorPos); - ImGui::PushStyleColor(ImGuiCol_Text, ImVec4(0.0f, 0.0f, 0.0f, 0.6f)); - ImGui::TextUnformatted(fps.c_str()); - ImGui::PopStyleColor(); - - ImGui::SetCursorPos(cursorPos); - } - ImGui::TextUnformatted(fps.c_str()); - - ImGui::PopFont(); - - ImGui::PopStyleVar(); - - if (ImGui::BeginPopupContextWindow()) { - ImGui::PushItemWidth(150 * _dpiScale); - ImGui::PushFont(_fontMonoNumbers); - ImGui::SliderFloat("##FPS_Opacity", &opacity, 0.0f, 1.0f); - ImGui::PopFont(); - ImGui::SameLine(); - ImGui::TextUnformatted(_GetResourceString(L"Overlay_FPS_Opacity").c_str()); - ImGui::Separator(); - const std::string& lockStr = _GetResourceString(isLocked ? L"Overlay_FPS_Unlock" : L"Overlay_FPS_Lock"); - if (ImGui::MenuItem(lockStr.c_str(), nullptr, nullptr)) { - isLocked = !isLocked; - } - ImGui::PopItemWidth(); - - ImGui::EndPopup(); - } - - ImGui::End(); - ImGui::PopStyleVar(); -} - -// 自定义提示 -static void MyPlotLines(float(*values_getter)(void* data, int idx), void* data, int values_count, int values_offset, const char* overlay_text, float scale_min, float scale_max, ImVec2 graph_size) { - // 通过改变光标位置避免绘制提示窗口 - const ImVec2 mousePos = ImGui::GetIO().MousePos; - ImGui::GetIO().MousePos = ImVec2(-FLT_MAX, -FLT_MAX); - ImGui::PlotLines("", values_getter, data, values_count, values_offset, overlay_text, scale_min, scale_max, graph_size); - ImGui::GetIO().MousePos = mousePos; - - ImVec2 framePadding = ImGui::GetStyle().FramePadding; - ImVec2 graphRectMin = ImGui::GetItemRectMin(); - ImVec2 graphRectMax = ImGui::GetItemRectMax(); - - float innerRectLeft = graphRectMin.x + framePadding.x; - float innerRectTop = graphRectMin.y + framePadding.y; - float innerRectRight = graphRectMax.x - framePadding.x; - float innerRectBottom = graphRectMax.y - framePadding.y; - - // 检查光标是否在图表上 - if (mousePos.x < innerRectLeft || mousePos.y < innerRectTop || - mousePos.x >= innerRectRight || mousePos.y >= innerRectBottom) { - return; - } - - // 获取光标位置对应的值 - float t = std::clamp((mousePos.x - innerRectLeft) / (innerRectRight - innerRectLeft), 0.0f, 0.9999f); - int v_idx = (int)(t * values_count); - float v0 = values_getter(data, (v_idx + values_offset) % values_count); - - ImGuiImpl::Tooltip(fmt::format("{:.1f}", v0).c_str()); -} - -void OverlayDrawer::_DrawUI() noexcept { - auto& settings = MagApp::Get().GetOptions(); - auto& renderer = MagApp::Get().GetRenderer(); - auto& gpuTimer = renderer.GetGPUTimer(); - -#ifdef _DEBUG - ImGui::ShowDemoWindow(); -#endif - - const float maxWindowWidth = 400 * _dpiScale; - ImGui::SetNextWindowSizeConstraints(ImVec2(), ImVec2(maxWindowWidth, 500 * _dpiScale)); - - static float initPosX = Win32Utils::GetSizeOfRect(MagApp::Get().GetRenderer().GetOutputRect()).cx - maxWindowWidth; - ImGui::SetNextWindowPos(ImVec2(initPosX, 20), ImGuiCond_FirstUseEver); - - std::string profilerStr = _GetResourceString(L"Overlay_Profiler"); - if (!ImGui::Begin(profilerStr.c_str(), nullptr, ImGuiWindowFlags_NoNav | ImGuiWindowFlags_AlwaysAutoResize)) { - ImGui::End(); - return; - } - - // 始终为滚动条预留空间 - ImGui::PushTextWrapPos(maxWindowWidth - ImGui::GetStyle().WindowPadding.x - ImGui::GetStyle().ScrollbarSize); - ImGui::TextUnformatted(StrUtils::Concat("GPU: ", _hardwareInfo.gpuName).c_str()); - const std::string& vSyncStr = _GetResourceString(L"Overlay_Profiler_VSync"); - const std::string& stateStr = _GetResourceString(settings.IsVSync() ? L"ToggleSwitch/OnContent" : L"ToggleSwitch/OffContent"); - ImGui::TextUnformatted(StrUtils::Concat(vSyncStr, ": ", stateStr).c_str()); - const std::string& captureMethodStr = _GetResourceString(L"Overlay_Profiler_CaptureMethod"); - ImGui::TextUnformatted(StrUtils::Concat(captureMethodStr.c_str(), ": ", MagApp::Get().GetFrameSource().GetName()).c_str()); - ImGui::PopTextWrapPos(); - - ImGui::Spacing(); - - static constexpr UINT nSamples = 180; - - if (_frameTimes.size() >= nSamples) { - _frameTimes.erase(_frameTimes.begin(), _frameTimes.begin() + (_frameTimes.size() - nSamples + 1)); - } else if (_frameTimes.size() < nSamples) { - _frameTimes.insert(_frameTimes.begin(), nSamples - _frameTimes.size() - 1, 0); - } - _frameTimes.push_back(std::chrono::duration_cast>(gpuTimer.GetElapsedTime()).count()); - _validFrames = std::min(_validFrames + 1, nSamples); - - // 帧率统计,支持在渲染时间和 FPS 间切换 - const std::string& frameStatisticsStr = _GetResourceString(L"Overlay_Profiler_FrameStatistics"); - if (ImGui::CollapsingHeader(frameStatisticsStr.c_str(), ImGuiTreeNodeFlags_DefaultOpen)) { - static bool showFrameRates = true; - - ImGui::Spacing(); - const std::string& buttonStr = _GetResourceString(showFrameRates - ? L"Overlay_Profiler_FrameStatistics_SwitchToFrameTimings" - : L"Overlay_Profiler_FrameStatistics_SwitchToFrameRates"); - if (ImGui::Button(buttonStr.c_str())) { - showFrameRates = !showFrameRates; - } - ImGui::Spacing(); - - ImGui::PushFont(_fontMonoNumbers); - - if (showFrameRates) { - float totalTime = 0; - float minTime = FLT_MAX; - float minTime2 = FLT_MAX; - for (UINT i = nSamples - _validFrames; i < nSamples; ++i) { - totalTime += _frameTimes[i]; - - if (_frameTimes[i] <= minTime) { - minTime2 = minTime; - minTime = _frameTimes[i]; - } else if (_frameTimes[i] < minTime2) { - minTime2 = _frameTimes[i]; - } - } - - if (minTime2 == FLT_MAX) { - minTime2 = minTime; - } - - // 减少抖动 - // 1. 使用第二小的值以缓解尖峰导致的抖动 - // 2. 以 30 为最小变化单位 - const float maxFPS = std::bit_ceil((UINT)std::ceilf((1000 / minTime2 - 10) / 30)) * 30 * 1.7f; - - MyPlotLines([](void* data, int idx) { - float time = (*(std::deque*)data)[idx]; - return time < 1e-6 ? 0 : 1000 / time; - }, &_frameTimes, (int)_frameTimes.size(), 0, fmt::format("avg: {:.1f} FPS", _validFrames * 1000 / totalTime).c_str(), 0, maxFPS, ImVec2(250 * _dpiScale, 80 * _dpiScale)); - } else { - float totalTime = 0; - float maxTime = 0; - float maxTime2 = 0; - for (UINT i = nSamples - _validFrames; i < nSamples; ++i) { - totalTime += _frameTimes[i]; - - if (_frameTimes[i] >= maxTime) { - maxTime2 = maxTime; - maxTime = _frameTimes[i]; - } else if (_frameTimes[i] > maxTime2) { - maxTime2 = _frameTimes[i]; - } - } - - if (maxTime2 == 0) { - maxTime2 = maxTime; - } - - // 使用第二大的值以缓解尖峰导致的抖动 - MyPlotLines([](void* data, int idx) { - return (*(std::deque*)data)[idx]; - }, &_frameTimes, (int)_frameTimes.size(), 0, - fmt::format("avg: {:.1f} ms", totalTime / _validFrames).c_str(), - 0, maxTime2 * 1.7f, ImVec2(250 * _dpiScale, 80 * _dpiScale)); - } - - ImGui::PopFont(); - } - - ImGui::Spacing(); - const std::string& timingsStr = _GetResourceString(L"Overlay_Profiler_Timings"); - if (ImGui::CollapsingHeader(timingsStr.c_str(), ImGuiTreeNodeFlags_DefaultOpen)) { - const auto& gpuTimings = gpuTimer.GetGPUTimings(); - const UINT nEffect = renderer.GetEffectCount(); - - SmallVector<_EffectTimings, 4> effectTimings(nEffect); - - { - UINT idx = 0; - for (UINT i = 0; i < nEffect; ++i) { - auto& effectTiming = effectTimings[i]; - effectTiming.desc = &renderer.GetEffectDesc(i); - - UINT nPass = (UINT)effectTiming.desc->passes.size(); - effectTiming.passTimings = { gpuTimings.passes.begin() + idx, nPass }; - idx += nPass; - - for (float t : effectTiming.passTimings) { - effectTiming.totalTime += t; - } - } - } - - float effectsTotalTime = 0.0f; - for (const auto& et : effectTimings) { - effectsTotalTime += et.totalTime; - } - - static bool showPasses = false; - if (nEffect == 1) { - showPasses = effectTimings[0].passTimings.size() > 1; - } else { - for (const auto& et : effectTimings) { - // 某个效果有多个通道,显示切换按钮 - if (et.passTimings.size() > 1) { - ImGui::Spacing(); - const std::string& buttonStr = _GetResourceString(showPasses - ? L"Overlay_Profiler_Timings_SwitchToEffects" - : L"Overlay_Profiler_Timings_SwitchToPasses"); - if (ImGui::Button(buttonStr.c_str())) { - showPasses = !showPasses; - } - break; - } - } - } - - SmallVector colors; - colors.reserve(_timelineColors.size()); - if (nEffect == 1) { - colors.resize(_timelineColors.size()); - for (size_t i = 0; i < _timelineColors.size(); ++i) { - colors[i] = TIMELINE_COLORS[_timelineColors[i]]; - } - } else if (showPasses) { - UINT i = 0; - for (const auto& et : effectTimings) { - if (et.passTimings.size() == 1) { - colors.push_back(TIMELINE_COLORS[_timelineColors[i]]); - ++i; - continue; - } - - ++i; - for (UINT j = 0; j < et.passTimings.size(); ++j) { - colors.push_back(TIMELINE_COLORS[_timelineColors[i]]); - ++i; - } - } - } else { - size_t i = 0; - for (const auto& et : effectTimings) { - colors.push_back(TIMELINE_COLORS[_timelineColors[i]]); - - ++i; - if (et.passTimings.size() > 1) { - i += et.passTimings.size(); - } - } - } - - static int selectedIdx = -1; - - if (nEffect > 1 || showPasses) { - ImGui::Spacing(); - ImGui::PushStyleVar(ImGuiStyleVar_CellPadding, ImVec2(0, 0)); - ImGui::PushStyleVar(ImGuiStyleVar_SelectableTextAlign, ImVec2(0.5f, 0.5f)); - ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(5, 5)); - ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(0, 0)); - - if (effectsTotalTime > 0) { - if (showPasses) { - if (ImGui::BeginTable("timeline", (int)gpuTimings.passes.size())) { - for (UINT i = 0; i < gpuTimings.passes.size(); ++i) { - if (gpuTimings.passes[i] < 1e-5f) { - continue; - } - - ImGui::TableSetupColumn( - std::to_string(i).c_str(), - ImGuiTableColumnFlags_WidthStretch | ImGuiTableColumnFlags_NoResize | ImGuiTableColumnFlags_NoReorder, - gpuTimings.passes[i] / effectsTotalTime - ); - } - - ImGui::TableNextRow(); - - UINT i = 0; - for (const _EffectTimings& et : effectTimings) { - for (UINT j = 0, end = (UINT)et.passTimings.size(); j < end; ++j) { - if (et.passTimings[j] < 1e-5f) { - continue; - } - - ImGui::TableNextColumn(); - - std::string name; - if (et.passTimings.size() == 1) { - name = std::string(GetEffectDisplayName(et.desc)); - } else if (nEffect == 1) { - name = et.desc->passes[j].desc; - } else { - name = StrUtils::Concat(GetEffectDisplayName(et.desc), "/", et.desc->passes[j].desc); - } - - _DrawTimelineItem(colors[i], _dpiScale, name, et.passTimings[j], effectsTotalTime, selectedIdx == (int)i); - - ++i; - } - } - - ImGui::EndTable(); - } - } else { - if (ImGui::BeginTable("timeline", nEffect)) { - for (UINT i = 0; i < nEffect; ++i) { - if (effectTimings[i].totalTime < 1e-5f) { - continue; - } - - ImGui::TableSetupColumn( - std::to_string(i).c_str(), - ImGuiTableColumnFlags_WidthStretch | ImGuiTableColumnFlags_NoResize | ImGuiTableColumnFlags_NoReorder, - effectTimings[i].totalTime / effectsTotalTime - ); - } - - ImGui::TableNextRow(); - - for (UINT i = 0; i < nEffect; ++i) { - auto& et = effectTimings[i]; - if (et.totalTime < 1e-5f) { - continue; - } - - ImGui::TableNextColumn(); - _DrawTimelineItem(colors[i], _dpiScale, GetEffectDisplayName(et.desc), et.totalTime, effectsTotalTime, selectedIdx == (int)i); - } - - ImGui::EndTable(); - } - } - } else { - // 还未统计出时间时渲染占位 - if (ImGui::BeginTable("timeline", 1)) { - ImGui::TableSetupColumn("0", ImGuiTableColumnFlags_WidthStretch | ImGuiTableColumnFlags_NoResize | ImGuiTableColumnFlags_NoReorder); - ImGui::TableNextRow(); - ImGui::TableNextColumn(); - - ImU32 color = ImColor(); - ImGui::PushStyleColor(ImGuiCol_HeaderActive, color); - ImGui::PushStyleColor(ImGuiCol_HeaderHovered, color); - ImGui::Selectable(""); - ImGui::PopStyleColor(2); - - ImGui::EndTable(); - } - } - - ImGui::PopStyleVar(4); - - ImGui::Spacing(); - } - - selectedIdx = -1; - - ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(ImGui::GetStyle().ItemSpacing.x, ImGui::GetStyle().CellPadding.y * 2)); - if (ImGui::BeginTable("timings", 2, ImGuiTableFlags_PadOuterX)) { - ImGui::TableSetupColumn("name", ImGuiTableColumnFlags_WidthStretch | ImGuiTableColumnFlags_NoResize | ImGuiTableColumnFlags_NoReorder); - ImGui::TableSetupColumn("time", ImGuiTableColumnFlags_WidthFixed | ImGuiTableColumnFlags_NoResize | ImGuiTableColumnFlags_NoReorder); - - if (nEffect == 1) { - const auto& et = effectTimings[0]; - int hovered = _DrawEffectTimings(et, true, maxWindowWidth, colors, true); - if (hovered >= 0) { - selectedIdx = hovered; - } - } else { - size_t idx = 0; - for (const auto& et : effectTimings) { - int idxBegin = (int)idx; - - std::span colorSpan; - if (!showPasses || et.passTimings.size() == 1) { - colorSpan = std::span(colors.begin() + idx, colors.begin() + idx + 1); - ++idx; - } else { - colorSpan = std::span(colors.begin() + idx, colors.begin() + idx + et.passTimings.size()); - idx += et.passTimings.size(); - } - - int hovered = _DrawEffectTimings(et, showPasses, maxWindowWidth, colorSpan, false); - if (hovered >= 0) { - selectedIdx = idxBegin + hovered; - } - } - } - - ImGui::EndTable(); - } - - if (nEffect > 1) { - ImGui::Separator(); - - if (ImGui::BeginTable("total", 2, ImGuiTableFlags_PadOuterX)) { - ImGui::TableSetupColumn("name", ImGuiTableColumnFlags_WidthStretch | ImGuiTableColumnFlags_NoResize | ImGuiTableColumnFlags_NoReorder); - ImGui::TableSetupColumn("time", ImGuiTableColumnFlags_WidthFixed | ImGuiTableColumnFlags_NoResize | ImGuiTableColumnFlags_NoReorder); - - ImGui::TableNextRow(); - ImGui::TableNextColumn(); - const std::string& totalStr = _GetResourceString(L"Overlay_Profiler_Timings_Total"); - ImGui::TextUnformatted(totalStr.c_str()); - ImGui::TableNextColumn(); - DrawTextWithFont(fmt::format("{:.3f} ms", effectsTotalTime).c_str(), _fontMonoNumbers); - - ImGui::EndTable(); - } - } - ImGui::PopStyleVar(); - } - - ImGui::End(); -} - -void OverlayDrawer::_RetrieveHardwareInfo() noexcept { - DXGI_ADAPTER_DESC desc{}; - HRESULT hr = MagApp::Get().GetDeviceResources().GetGraphicsAdapter()->GetDesc(&desc); - _hardwareInfo.gpuName = SUCCEEDED(hr) ? StrUtils::UTF16ToUTF8(desc.Description) : "UNAVAILABLE"; -} - -void OverlayDrawer::_EnableSrcWnd(bool enable) noexcept { - HWND hwndSrc = MagApp::Get().GetHwndSrc(); - if (!_isSrcMainWnd) { - // 如果源窗口是 Magpie 主窗口会卡死 - EnableWindow(hwndSrc, TRUE); - } - if (enable) { - SetForegroundWindow(hwndSrc); - } -} - -const std::string& OverlayDrawer::_GetResourceString(const std::wstring_view& key) noexcept { - static phmap::flat_hash_map cache; - - if (auto it = cache.find(key); it != cache.end()) { - return it->second; - } - - return cache[key] = StrUtils::UTF16ToUTF8(_resourceLoader.GetString(key)); -} - -} diff --git a/src/Magpie.Core/OverlayDrawer.h b/src/Magpie.Core/OverlayDrawer.h deleted file mode 100644 index fdfc9b859..000000000 --- a/src/Magpie.Core/OverlayDrawer.h +++ /dev/null @@ -1,77 +0,0 @@ -#pragma once -#include -#include "SmallVector.h" -#include - -namespace Magpie::Core { - -struct EffectDesc; -class ImGuiImpl; - -class OverlayDrawer { -public: - OverlayDrawer() noexcept; - OverlayDrawer(const OverlayDrawer&) = delete; - OverlayDrawer(OverlayDrawer&&) = delete; - - ~OverlayDrawer(); - - bool Initialize() noexcept; - - void Draw() noexcept; - - bool IsUIVisiable() const noexcept { - return _isUIVisiable; - } - - void SetUIVisibility(bool value) noexcept; - -private: - bool _BuildFonts() noexcept; - void _BuildFontUI(std::wstring_view language, const std::vector& fontData, ImVector& uiRanges) noexcept; - void _BuildFontFPS(const std::vector& fontData) noexcept; - - struct _EffectTimings { - const EffectDesc* desc = nullptr; - std::span passTimings; - float totalTime = 0.0f; - }; - - int _DrawEffectTimings(const _EffectTimings& et, bool showPasses, float maxWindowWidth, std::span colors, bool singleEffect) noexcept; - - void _DrawTimelineItem(ImU32 color, float dpiScale, std::string_view name, float time, float effectsTotalTime, bool selected = false); - - void _DrawFPS() noexcept; - - void _DrawUI() noexcept; - - void _RetrieveHardwareInfo() noexcept; - - void _EnableSrcWnd(bool enable) noexcept; - - const std::string& _GetResourceString(const std::wstring_view& key) noexcept; - - float _dpiScale = 1.0f; - - ImFont* _fontUI = nullptr; // 普通 UI 文字 - ImFont* _fontMonoNumbers = nullptr; // 普通 UI 文字,但数字部分是等宽的,只支持 ASCII - ImFont* _fontFPS = nullptr; // FPS - - std::deque _frameTimes; - UINT _validFrames = 0; - - SmallVector _timelineColors; - - struct { - std::string gpuName; - } _hardwareInfo; - - std::unique_ptr _imguiImpl; - - winrt::ResourceLoader _resourceLoader = winrt::ResourceLoader::GetForViewIndependentUse(); - - bool _isUIVisiable = false; - bool _isSrcMainWnd = false; -}; - -} diff --git a/src/Magpie.Core/Renderer.cpp b/src/Magpie.Core/Renderer.cpp deleted file mode 100644 index 98d7c4cea..000000000 --- a/src/Magpie.Core/Renderer.cpp +++ /dev/null @@ -1,509 +0,0 @@ -#include "pch.h" -#include "Renderer.h" -#include "MagApp.h" -#include "Win32Utils.h" -#include "StrUtils.h" -#include "EffectCompiler.h" -#include "FrameSourceBase.h" -#include "DeviceResources.h" -#include "GPUTimer.h" -#include "EffectDrawer.h" -#include "OverlayDrawer.h" -#include "Logger.h" -#include "CursorManager.h" -#include "WindowHelper.h" -#include "Utils.h" - -namespace Magpie::Core { - -Renderer::Renderer() {} - -Renderer::~Renderer() {} - -bool Renderer::Initialize() { - _gpuTimer.reset(new GPUTimer()); - - if (!GetWindowRect(MagApp::Get().GetHwndSrc(), &_srcWndRect)) { - Logger::Get().Win32Error("GetWindowRect 失败"); - return false; - } - - if (!_BuildEffects()) { - Logger::Get().Error("_BuildEffects 失败"); - return false; - } - - if (MagApp::Get().GetOptions().IsShowFPS()) { - _overlayDrawer.reset(new OverlayDrawer()); - if (!_overlayDrawer->Initialize()) { - _overlayDrawer.reset(); - Logger::Get().Error("初始化 OverlayDrawer 失败"); - } - } - - // 初始化所有效果共用的动态常量缓冲区 - D3D11_BUFFER_DESC bd{}; - bd.Usage = D3D11_USAGE_DYNAMIC; - bd.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; - bd.ByteWidth = 4 * (UINT)_dynamicConstants.size(); - bd.BindFlags = D3D11_BIND_CONSTANT_BUFFER; - - HRESULT hr = MagApp::Get().GetDeviceResources().GetD3DDevice() - ->CreateBuffer(&bd, nullptr, _dynamicCB.put()); - if (FAILED(hr)) { - Logger::Get().ComError("CreateBuffer 失败", hr); - return false; - } - - return true; -} - - -void Renderer::Render(bool onPrint) { - int srcState = _CheckSrcState(); - if (srcState != 0) { - Logger::Get().Info("源窗口状态改变,退出全屏"); - MagApp::Get().Stop(srcState == 2); - return; - } - - DeviceResources& dr = MagApp::Get().GetDeviceResources(); - - if (!_waitingForNextFrame) { - dr.BeginFrame(); - _gpuTimer->OnBeginFrame(); - } - - // 首先处理配置改变产生的回调 - // MagApp::Get().GetOptions().OnBeginFrame(); - - auto state = onPrint ? FrameSourceBase::UpdateState::NoUpdate : MagApp::Get().GetFrameSource().Update(); - _waitingForNextFrame = state == FrameSourceBase::UpdateState::Waiting - || state == FrameSourceBase::UpdateState::Error; - if (_waitingForNextFrame) { - return; - } - - MagApp::Get().GetCursorManager().OnBeginFrame(); - - if (!_UpdateDynamicConstants()) { - Logger::Get().Error("_UpdateDynamicConstants 失败"); - } - - auto d3dDC = dr.GetD3DDC(); - - { - ID3D11Buffer* t = _dynamicCB.get(); - d3dDC->CSSetConstantBuffers(0, 1, &t); - } - - { - SIZE outputSize = Win32Utils::GetSizeOfRect(_outputRect); - SIZE hostSize = Win32Utils::GetSizeOfRect(MagApp::Get().GetHostWndRect()); - if (outputSize.cx < hostSize.cx || outputSize.cy < hostSize.cy) { - // 存在黑边时渲染每帧前清空后缓冲区 - ID3D11UnorderedAccessView* backBufferUAV = nullptr; - dr.GetUnorderedAccessView(dr.GetBackBuffer(), &backBufferUAV); - static const UINT black[4] = { 0,0,0,255 }; - d3dDC->ClearUnorderedAccessViewUint(backBufferUAV, black); - } - } - - _gpuTimer->OnBeginEffects(); - - uint32_t idx = 0; - if (state == FrameSourceBase::UpdateState::NoUpdate) { - // 此帧内容无变化 - // 从第一个使用动态常量的效果开始渲染 - // 如果没有则只渲染最后一个效果的最后一个通道 - - size_t i = 0; - for (size_t end = _effects.size() - 1; i < end; ++i) { - if (_effects[i].IsUseDynamic()) { - break; - } else { - for (uint32_t j = (uint32_t)_effects[i].GetDesc().passes.size(); j > 0; --j) { - _gpuTimer->OnEndPass(idx++); - } - } - } - - if (i == _effects.size()) { - // 只渲染最后一个 Effect 的最后一个 pass - _effects.back().Draw(idx, true); - } else { - for (; i < _effects.size(); ++i) { - _effects[i].Draw(idx); - } - } - } else { - for (auto& effect : _effects) { - effect.Draw(idx); - } - } - - _gpuTimer->OnEndEffects(); - - if (_overlayDrawer) { - _overlayDrawer->Draw(); - } - - dr.EndFrame(); -} - -bool Renderer::IsUIVisiable() const noexcept { - return _overlayDrawer ? _overlayDrawer->IsUIVisiable() : false; -} - -void Renderer::SetUIVisibility(bool value) { - if (!value) { - if (_overlayDrawer && _overlayDrawer->IsUIVisiable()) { - _overlayDrawer->SetUIVisibility(false); - _gpuTimer->StopProfiling(); - } - return; - } - - if (!_overlayDrawer) { - _overlayDrawer.reset(new OverlayDrawer()); - if (!_overlayDrawer->Initialize()) { - _overlayDrawer.reset(); - Logger::Get().Error("初始化 OverlayDrawer 失败"); - return; - } - } - - if (!_overlayDrawer->IsUIVisiable()) { - _overlayDrawer->SetUIVisibility(true); - - uint32_t passCount = 0; - for (const auto& effect : _effects) { - passCount += (uint32_t)effect.GetDesc().passes.size(); - } - - // StartProfiling 必须在 OnBeginFrame 之前调用 - _gpuTimer->StartProfiling(500ms, passCount); - } -} - -bool CheckForeground(HWND hwndForeground) { - std::wstring className = Win32Utils::GetWndClassName(hwndForeground); - - if (!WindowHelper::IsValidSrcWindow(hwndForeground)) { - return true; - } - - RECT rectForground{}; - - // 如果捕获模式可以捕获到弹窗,则允许小的弹窗 - if (MagApp::Get().GetFrameSource().IsScreenCapture() - && GetWindowStyle(hwndForeground) & (WS_POPUP | WS_CHILD) - ) { - if (!Win32Utils::GetWindowFrameRect(hwndForeground, rectForground)) { - Logger::Get().Error("GetWindowFrameRect 失败"); - return false; - } - - // 弹窗如果完全在源窗口客户区内则不退出全屏 - const RECT& srcFrameRect = MagApp::Get().GetFrameSource().GetSrcFrameRect(); - if (rectForground.left >= srcFrameRect.left - && rectForground.right <= srcFrameRect.right - && rectForground.top >= srcFrameRect.top - && rectForground.bottom <= srcFrameRect.bottom - ) { - return true; - } - } - - if (rectForground == RECT{}) { - if (!Win32Utils::GetWindowFrameRect(hwndForeground, rectForground)) { - Logger::Get().Error("GetWindowFrameRect 失败"); - return false; - } - } - - IntersectRect(&rectForground, &MagApp::Get().GetHostWndRect(), &rectForground); - - // 允许稍微重叠,否则前台窗口最大化时会意外退出 - return rectForground.right - rectForground.left < 10 || rectForground.right - rectForground.top < 10; -} - -uint32_t Renderer::GetEffectCount() const noexcept { - return (uint32_t)_effects.size(); -} - -const EffectDesc& Renderer::GetEffectDesc(uint32_t idx) const noexcept { - assert(idx < _effects.size()); - return _effects[idx].GetDesc(); -} - -// 0 -> 可继续缩放 -// 1 -> 前台窗口改变或源窗口最大化(如果不允许缩放最大化的窗口)/最小化 -// 2 -> 源窗口大小或位置改变或最大化(如果允许缩放最大化的窗口) -int Renderer::_CheckSrcState() { - HWND hwndSrc = MagApp::Get().GetHwndSrc(); - const MagOptions& options = MagApp::Get().GetOptions(); - - if (!options.IsDebugMode()) { - HWND hwndForeground = GetForegroundWindow(); - // 在 3D 游戏模式下打开游戏内叠加层则全屏窗口可以接收焦点 - if (!options.Is3DGameMode() || !IsUIVisiable() || hwndForeground != MagApp::Get().GetHwndHost()) { - if (hwndForeground && hwndForeground != hwndSrc && !CheckForeground(hwndForeground)) { - Logger::Get().Info("前台窗口已改变"); - return 1; - } - } - } - - UINT showCmd = Win32Utils::GetWindowShowCmd(hwndSrc); - if (showCmd != SW_NORMAL && (showCmd != SW_SHOWMAXIMIZED || !options.IsAllowScalingMaximized())) { - Logger::Get().Info("源窗口显示状态改变"); - return 1; - } - - RECT rect; - if (!GetWindowRect(hwndSrc, &rect)) { - Logger::Get().Error("GetWindowRect 失败"); - return 1; - } - - if (_srcWndRect != rect) { - Logger::Get().Info("源窗口位置或大小改变"); - return 2; - } - - return 0; -} - -static bool CompileEffect(bool isLastEffect, const EffectOption& option, EffectDesc& result) { - result.name = StrUtils::UTF16ToUTF8(option.name); - // 将文件夹分隔符统一为 '\' - for (char& c : result.name) { - if (c == '/') { - c = '\\'; - } - } - - result.flags = isLastEffect ? EffectFlags::LastEffect : 0; - - if (option.flags & EffectOptionFlags::InlineParams) { - result.flags |= EffectFlags::InlineParams; - } - if (option.flags & EffectOptionFlags::FP16) { - result.flags |= EffectFlags::FP16; - } - - uint32_t compileFlag = 0; - MagOptions& options = MagApp::Get().GetOptions(); - if (options.IsDisableEffectCache()) { - compileFlag |= EffectCompilerFlags::NoCache; - } - if (options.IsSaveEffectSources()) { - compileFlag |= EffectCompilerFlags::SaveSources; - } - if (options.IsWarningsAreErrors()) { - compileFlag |= EffectCompilerFlags::WarningsAreErrors; - } - - bool success = true; - int duration = Utils::Measure([&]() { - success = !EffectCompiler::Compile(result, compileFlag, &option.parameters); - }); - - if (success) { - Logger::Get().Info(fmt::format("编译 {}.hlsl 用时 {} 毫秒", StrUtils::UTF16ToUTF8(option.name), duration / 1000.0f)); - } else { - Logger::Get().Error(StrUtils::Concat("编译 ", StrUtils::UTF16ToUTF8(option.name), ".hlsl 失败")); - } - return success; -} - -bool Renderer::_BuildEffects() { - const std::vector& effectsOption = MagApp::Get().GetOptions().effects; - uint32_t effectCount = (int)effectsOption.size(); - if (effectCount == 0) { - return false; - } - - // 并行编译所有效果 - std::vector effectDescs(effectsOption.size()); - std::atomic allSuccess = true; - - int duration = Utils::Measure([&]() { - Win32Utils::RunParallel([&](uint32_t id) { - if (!CompileEffect(id == effectCount - 1, effectsOption[id], effectDescs[id])) { - allSuccess = false; - } - }, effectCount); - }); - - if (!allSuccess) { - return false; - } - - if (effectCount > 1) { - Logger::Get().Info(fmt::format("编译着色器总计用时 {} 毫秒", duration / 1000.0f)); - } - - ID3D11Texture2D* effectInput = MagApp::Get().GetFrameSource().GetOutput(); - - DownscalingEffect& downscalingEffect = MagApp::Get().GetOptions().downscalingEffect; - if (!downscalingEffect.name.empty()) { - _effects.reserve(effectsOption.size() + 1); - } - _effects.resize(effectsOption.size()); - - for (uint32_t i = 0; i < effectCount; ++i) { - bool isLastEffect = i == effectCount - 1; - - if (!_effects[i].Initialize( - effectDescs[i], effectsOption[i], effectInput, - isLastEffect ? &_outputRect : nullptr, - isLastEffect ? &_virtualOutputRect : nullptr - )) { - Logger::Get().Error(fmt::format("初始化效果#{} ({}) 失败", i, StrUtils::UTF16ToUTF8(effectsOption[i].name))); - return false; - } - - effectInput = _effects[i].GetOutputTexture(); - } - - if (!downscalingEffect.name.empty()) { - const SIZE hostSize = Win32Utils::GetSizeOfRect(MagApp::Get().GetHostWndRect()); - const SIZE outputSize = Win32Utils::GetSizeOfRect(_virtualOutputRect); - if (outputSize.cx > hostSize.cx || outputSize.cy > hostSize.cy) { - // 需降采样 - EffectOption downscalingEffectOption; - downscalingEffectOption.name = downscalingEffect.name; - downscalingEffectOption.parameters = downscalingEffect.parameters; - downscalingEffectOption.scalingType = ScalingType::Fit; - downscalingEffectOption.flags = EffectOptionFlags::InlineParams; // 内联参数 - - EffectDesc downscalingEffectDesc; - - // 最后一个效果需重新编译 - // 在分离光标渲染逻辑后这里可优化 - duration = Utils::Measure([&]() { - Win32Utils::RunParallel([&](uint32_t id) { - if (!CompileEffect( - id == 1, - id == 0 ? effectsOption.back() : downscalingEffectOption, - id == 0 ? effectDescs.back() : downscalingEffectDesc - )) { - allSuccess = false; - } - }, 2); - }); - - if (!allSuccess) { - return false; - } - - Logger::Get().Info(fmt::format("编译降采样着色器用时 {} 毫秒", duration / 1000.0f)); - - _effects.pop_back(); - if (_effects.empty()) { - effectInput = MagApp::Get().GetFrameSource().GetOutput(); - } else { - effectInput = _effects.back().GetOutputTexture(); - } - - _effects.resize(_effects.size() + 2); - - // 重新构建最后一个效果 - const size_t originLastEffectIdx = _effects.size() - 2; - if (!_effects[originLastEffectIdx].Initialize(effectDescs.back(), effectsOption.back(), - effectInput, nullptr, nullptr) - ) { - Logger::Get().Error(fmt::format("初始化效果#{} ({}) 失败", - originLastEffectIdx, StrUtils::UTF16ToUTF8(effectsOption.back().name))); - return false; - } - effectInput = _effects[originLastEffectIdx].GetOutputTexture(); - - // 构建降采样效果 - if (!_effects.back().Initialize(downscalingEffectDesc, downscalingEffectOption, - effectInput, &_outputRect, &_virtualOutputRect - )) { - Logger::Get().Error(fmt::format("初始化降采样效果 ({}) 失败", - StrUtils::UTF16ToUTF8(downscalingEffect.name))); - } - } - } - - return true; -} - -bool Renderer::_UpdateDynamicConstants() { - // cbuffer __CB1 : register(b0) { - // int4 __cursorRect; - // float2 __cursorPt; - // uint2 __cursorPos; - // uint __cursorType; - // uint __frameCount; - // }; - - CursorManager& cursorManager = MagApp::Get().GetCursorManager(); - if (cursorManager.HasCursor() && !(MagApp::Get().GetOptions().Is3DGameMode() && IsUIVisiable())) { - const POINT* pos = cursorManager.GetCursorPos(); - const CursorManager::CursorInfo* ci = cursorManager.GetCursorInfo(); - - ID3D11Texture2D* cursorTex; - CursorManager::CursorType cursorType = CursorManager::CursorType::Color; - if (!cursorManager.GetCursorTexture(&cursorTex, cursorType)) { - Logger::Get().Error("GetCursorTexture 失败"); - } - assert(pos && ci); - - float cursorScaling = (float)MagApp::Get().GetOptions().cursorScaling; - if (cursorScaling < 1e-5) { - SIZE srcFrameSize = Win32Utils::GetSizeOfRect(MagApp::Get().GetFrameSource().GetSrcFrameRect()); - SIZE virtualOutputSize = Win32Utils::GetSizeOfRect(_virtualOutputRect); - cursorScaling = (((float)virtualOutputSize.cx / srcFrameSize.cx) - + ((float)virtualOutputSize.cy / srcFrameSize.cy)) / 2; - } - - SIZE cursorSize = { - std::lroundf(ci->size.cx * cursorScaling), - std::lroundf(ci->size.cy * cursorScaling) - }; - - _dynamicConstants[0].intVal = pos->x - std::lroundf(ci->hotSpot.x * cursorScaling); - _dynamicConstants[1].intVal = pos->y - std::lroundf(ci->hotSpot.y * cursorScaling); - _dynamicConstants[2].intVal = _dynamicConstants[0].intVal + cursorSize.cx; - _dynamicConstants[3].intVal = _dynamicConstants[1].intVal + cursorSize.cy; - - _dynamicConstants[4].floatVal = 1.0f / cursorSize.cx; - _dynamicConstants[5].floatVal = 1.0f / cursorSize.cy; - - _dynamicConstants[6].uintVal = pos->x; - _dynamicConstants[7].uintVal = pos->y; - - _dynamicConstants[8].uintVal = (uint32_t)cursorType; - } else { - _dynamicConstants[0].intVal = INT_MAX; - _dynamicConstants[1].intVal = INT_MAX; - _dynamicConstants[2].intVal = INT_MAX; - _dynamicConstants[3].intVal = INT_MAX; - _dynamicConstants[6].uintVal = UINT_MAX; - _dynamicConstants[7].uintVal = UINT_MAX; - } - - _dynamicConstants[9].uintVal = _gpuTimer->GetFrameCount(); - - auto d3dDC = MagApp::Get().GetDeviceResources().GetD3DDC(); - - D3D11_MAPPED_SUBRESOURCE ms; - HRESULT hr = d3dDC->Map(_dynamicCB.get(), 0, D3D11_MAP_WRITE_DISCARD, 0, &ms); - if (SUCCEEDED(hr)) { - std::memcpy(ms.pData, _dynamicConstants.data(), _dynamicConstants.size() * 4); - d3dDC->Unmap(_dynamicCB.get(), 0); - } else { - Logger::Get().ComError("Map 失败", hr); - return false; - } - - return true; -} - -} diff --git a/src/Magpie.Core/Renderer.h b/src/Magpie.Core/Renderer.h deleted file mode 100644 index 2752ef4ce..000000000 --- a/src/Magpie.Core/Renderer.h +++ /dev/null @@ -1,72 +0,0 @@ -#pragma once -#include "EffectHelper.h" - -namespace Magpie::Core { - -class GPUTimer; -class OverlayDrawer; -class CursorManager; -class EffectDrawer; -struct EffectDesc; - -class Renderer { -public: - Renderer(); - Renderer(const Renderer&) = delete; - Renderer(Renderer&&) = delete; - - ~Renderer(); - - bool Initialize(); - - void Render(bool onPrint = false); - - GPUTimer& GetGPUTimer() { - return *_gpuTimer; - } - - // 可能为空 - OverlayDrawer* GetOverlayDrawer() { - return _overlayDrawer.get(); - } - - bool IsUIVisiable() const noexcept; - - void SetUIVisibility(bool value); - - const RECT& GetOutputRect() const noexcept { - return _outputRect; - } - - const RECT& GetVirtualOutputRect() const noexcept { - return _virtualOutputRect; - } - - uint32_t GetEffectCount() const noexcept; - - const EffectDesc& GetEffectDesc(uint32_t idx) const noexcept; - -private: - int _CheckSrcState(); - - bool _BuildEffects(); - - bool _UpdateDynamicConstants(); - - RECT _srcWndRect{}; - RECT _outputRect{}; - // 尺寸可能大于主窗口 - RECT _virtualOutputRect{}; - - bool _waitingForNextFrame = false; - - std::vector _effects; - std::array _dynamicConstants; - winrt::com_ptr _dynamicCB; - - std::unique_ptr _overlayDrawer; - - std::unique_ptr _gpuTimer; -}; - -} diff --git a/src/Magpie.Core/ScalingRuntime.cpp b/src/Magpie.Core/ScalingRuntime.cpp index 68684cd3a..0946d1f91 100644 --- a/src/Magpie.Core/ScalingRuntime.cpp +++ b/src/Magpie.Core/ScalingRuntime.cpp @@ -1,24 +1,25 @@ #include "pch.h" #include -#include "MagApp.h" +//#include "MagApp.h" #include "ScalingRuntime.h" #include "Logger.h" +#include "MagOptions.h" namespace Magpie::Core { -ScalingRuntime::ScalingRuntime() : _magWindThread(std::bind(&ScalingRuntime::_MagWindThreadProc, this)) { +ScalingRuntime::ScalingRuntime() : _scalingWndThread(std::bind(&ScalingRuntime::_MagWindThreadProc, this)) { } ScalingRuntime::~ScalingRuntime() { Stop(); - if (_magWindThread.joinable()) { - DWORD magWndThreadId = GetThreadId(_magWindThread.native_handle()); - // 持续尝试直到 _magWindThread 创建了消息队列 + if (_scalingWndThread.joinable()) { + DWORD magWndThreadId = GetThreadId(_scalingWndThread.native_handle()); + // 持续尝试直到 _scalingWndThread 创建了消息队列 while (!PostThreadMessage(magWndThreadId, WM_QUIT, 0, 0)) { Sleep(1); } - _magWindThread.join(); + _scalingWndThread.join(); } } @@ -33,7 +34,7 @@ void ScalingRuntime::Start(HWND hwndSrc, const MagOptions& options) { _EnsureDispatcherQueue(); _dqc.DispatcherQueue().TryEnqueue([this, hwndSrc, options(options)]() mutable { - MagApp::Get().Start(hwndSrc, std::move(options)); + //MagApp::Get().Start(hwndSrc, std::move(options)); }); } @@ -44,7 +45,7 @@ void ScalingRuntime::ToggleOverlay() { _EnsureDispatcherQueue(); _dqc.DispatcherQueue().TryEnqueue([]() { - MagApp::Get().ToggleOverlay(); + //MagApp::Get().ToggleOverlay(); }); } @@ -55,7 +56,7 @@ void ScalingRuntime::Stop() { _EnsureDispatcherQueue(); _dqc.DispatcherQueue().TryEnqueue([]() { - MagApp::Get().Stop(); + //MagApp::Get().Stop(); }); } @@ -75,7 +76,19 @@ void ScalingRuntime::_MagWindThreadProc() noexcept { return; } - MagApp& app = MagApp::Get(); + while (true) { + MSG msg; + while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { + if (msg.message == WM_QUIT) { + return; + } + + TranslateMessage(&msg); + DispatchMessage(&msg); + } + } + + /*MagApp& app = MagApp::Get(); while (true) { if (app.GetHwndHost()) { @@ -107,7 +120,7 @@ void ScalingRuntime::_MagWindThreadProc() noexcept { DispatchMessage(&msg); } } - } + }*/ } void ScalingRuntime::_EnsureDispatcherQueue() const noexcept { diff --git a/src/Magpie.Core/ScalingRuntime.h b/src/Magpie.Core/ScalingRuntime.h index 90ebb0fc1..3bd11655a 100644 --- a/src/Magpie.Core/ScalingRuntime.h +++ b/src/Magpie.Core/ScalingRuntime.h @@ -50,7 +50,7 @@ class API_DECLSPEC ScalingRuntime { // 确保 _dqc 完成初始化 void _EnsureDispatcherQueue() const noexcept; - std::thread _magWindThread; + std::thread _scalingWndThread; std::atomic _running = false; HWND _hwndSrc = 0; winrt::Windows::System::DispatcherQueueController _dqc{ nullptr }; diff --git a/src/Magpie.Core/TextureLoader.cpp b/src/Magpie.Core/TextureLoader.cpp index 7b811e152..ba7211fa1 100644 --- a/src/Magpie.Core/TextureLoader.cpp +++ b/src/Magpie.Core/TextureLoader.cpp @@ -1,7 +1,7 @@ #include "pch.h" #include "TextureLoader.h" -#include "DeviceResources.h" -#include "MagApp.h" +//#include "DeviceResources.h" +//#include "MagApp.h" #include "Logger.h" #include "DDS.h" #include "DDSLoderHelpers.h" @@ -801,10 +801,12 @@ winrt::com_ptr LoadImg(const wchar_t* fileName) { return nullptr; } - D3D11_SUBRESOURCE_DATA initData{}; + return {}; + + /*D3D11_SUBRESOURCE_DATA initData{}; initData.pSysMem = buf.get(); initData.SysMemPitch = stride; - + winrt::com_ptr result = MagApp::Get().GetDeviceResources().CreateTexture2D( useFloatFormat ? DXGI_FORMAT_R16G16B16A16_FLOAT : DXGI_FORMAT_R8G8B8A8_UNORM, width, @@ -819,12 +821,13 @@ winrt::com_ptr LoadImg(const wchar_t* fileName) { return nullptr; } - return result; + return result;*/ } -winrt::com_ptr LoadDDS(const wchar_t* fileName) { - winrt::com_ptr result; - +winrt::com_ptr LoadDDS(const wchar_t* /*fileName*/) { + return {}; + /*winrt::com_ptr result; + DDS_ALPHA_MODE alphaMode = DDS_ALPHA_MODE_STRAIGHT; HRESULT hr = CreateDDSTextureFromFileEx( MagApp::Get().GetDeviceResources().GetD3DDevice(), @@ -850,7 +853,7 @@ winrt::com_ptr LoadDDS(const wchar_t* fileName) { return nullptr; } - return tex; + return tex;*/ } winrt::com_ptr TextureLoader::Load(const wchar_t* fileName) { From 03a1acee1a014c1bfd0058336eb2d2071036409c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=97=AD?= <34770031+Blinue@users.noreply.github.com> Date: Mon, 5 Jun 2023 20:24:19 +0800 Subject: [PATCH 003/155] =?UTF-8?q?chore:=20=E9=87=8D=E5=91=BD=E5=90=8D?= =?UTF-8?q?=E9=83=A8=E5=88=86=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Magpie.App/ScalingService.cpp | 2 +- src/Magpie.Core/Magpie.Core.vcxproj | 2 +- src/Magpie.Core/Magpie.Core.vcxproj.filters | 2 +- src/Magpie.Core/{MagOptions.h => ScalingOptions.h} | 2 +- src/Magpie.Core/ScalingRuntime.cpp | 6 +++--- src/Magpie.Core/ScalingRuntime.h | 4 ++-- src/Magpie.Core/include/Magpie.Core.h | 2 +- 7 files changed, 10 insertions(+), 10 deletions(-) rename src/Magpie.Core/{MagOptions.h => ScalingOptions.h} (99%) diff --git a/src/Magpie.App/ScalingService.cpp b/src/Magpie.App/ScalingService.cpp index 33c261a74..92594a259 100644 --- a/src/Magpie.App/ScalingService.cpp +++ b/src/Magpie.App/ScalingService.cpp @@ -243,7 +243,7 @@ bool ScalingService::_StartScale(HWND hWnd, const Profile& profile) { return false; } - MagOptions options; + ScalingOptions options; options.effects = ScalingModesService::Get().GetScalingMode(profile.scalingMode).effects; if (options.effects.empty()) { return false; diff --git a/src/Magpie.Core/Magpie.Core.vcxproj b/src/Magpie.Core/Magpie.Core.vcxproj index cab558ff8..2e23d4b2d 100644 --- a/src/Magpie.Core/Magpie.Core.vcxproj +++ b/src/Magpie.Core/Magpie.Core.vcxproj @@ -90,7 +90,7 @@ - + diff --git a/src/Magpie.Core/Magpie.Core.vcxproj.filters b/src/Magpie.Core/Magpie.Core.vcxproj.filters index 953eda6d6..6317c99e7 100644 --- a/src/Magpie.Core/Magpie.Core.vcxproj.filters +++ b/src/Magpie.Core/Magpie.Core.vcxproj.filters @@ -26,7 +26,7 @@ Include - + diff --git a/src/Magpie.Core/MagOptions.h b/src/Magpie.Core/ScalingOptions.h similarity index 99% rename from src/Magpie.Core/MagOptions.h rename to src/Magpie.Core/ScalingOptions.h index 70aa79f9b..a55b8be05 100644 --- a/src/Magpie.Core/MagOptions.h +++ b/src/Magpie.Core/ScalingOptions.h @@ -77,7 +77,7 @@ struct EffectOption { } }; -struct MagOptions { +struct ScalingOptions { DEFINE_FLAG_ACCESSOR(IsDisableWindowResizing, MagFlags::DisableWindowResizing, flags) DEFINE_FLAG_ACCESSOR(IsDebugMode, MagFlags::BreakpointMode, flags) DEFINE_FLAG_ACCESSOR(IsDisableEffectCache, MagFlags::DisableEffectCache, flags) diff --git a/src/Magpie.Core/ScalingRuntime.cpp b/src/Magpie.Core/ScalingRuntime.cpp index 0946d1f91..65e5b4b06 100644 --- a/src/Magpie.Core/ScalingRuntime.cpp +++ b/src/Magpie.Core/ScalingRuntime.cpp @@ -3,7 +3,7 @@ //#include "MagApp.h" #include "ScalingRuntime.h" #include "Logger.h" -#include "MagOptions.h" +#include "ScalingOptions.h" namespace Magpie::Core { @@ -23,7 +23,7 @@ ScalingRuntime::~ScalingRuntime() { } } -void ScalingRuntime::Start(HWND hwndSrc, const MagOptions& options) { +void ScalingRuntime::Start(HWND hwndSrc, const ScalingOptions& options) { if (_running) { return; } @@ -125,7 +125,7 @@ void ScalingRuntime::_MagWindThreadProc() noexcept { void ScalingRuntime::_EnsureDispatcherQueue() const noexcept { while (!_dqc) { - Sleep(1); + Sleep(0); } } diff --git a/src/Magpie.Core/ScalingRuntime.h b/src/Magpie.Core/ScalingRuntime.h index 3bd11655a..a948ec7f9 100644 --- a/src/Magpie.Core/ScalingRuntime.h +++ b/src/Magpie.Core/ScalingRuntime.h @@ -7,7 +7,7 @@ namespace Magpie::Core { -struct MagOptions; +struct ScalingOptions; class API_DECLSPEC ScalingRuntime { public: @@ -18,7 +18,7 @@ class API_DECLSPEC ScalingRuntime { return _running ? _hwndSrc : 0; } - void Start(HWND hwndSrc, const MagOptions& options); + void Start(HWND hwndSrc, const ScalingOptions& options); void ToggleOverlay(); diff --git a/src/Magpie.Core/include/Magpie.Core.h b/src/Magpie.Core/include/Magpie.Core.h index 9305660bf..7509f2881 100644 --- a/src/Magpie.Core/include/Magpie.Core.h +++ b/src/Magpie.Core/include/Magpie.Core.h @@ -1,5 +1,5 @@ #pragma once -#include "../MagOptions.h" +#include "../ScalingOptions.h" #include "../ScalingRuntime.h" #include "../LoggerHelper.h" #include "../EffectCompiler.h" From 6be826057a35220184d0524bcc123cf94c87d6f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=97=AD?= Date: Tue, 6 Jun 2023 14:17:32 +0800 Subject: [PATCH 004/155] =?UTF-8?q?feat:=20=E5=88=9B=E5=BB=BA=E7=BC=A9?= =?UTF-8?q?=E6=94=BE=E7=AA=97=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Magpie.Core/Magpie.Core.vcxproj | 3 + src/Magpie.Core/Magpie.Core.vcxproj.filters | 3 + src/Magpie.Core/ScalingRuntime.cpp | 77 ++++++++------------- src/Magpie.Core/ScalingRuntime.h | 20 ++++-- src/Magpie.Core/ScalingWindow.cpp | 53 ++++++++++++++ src/Magpie.Core/ScalingWindow.h | 15 ++++ src/Magpie.Core/WindowBase.h | 58 ++++++++++++++++ src/Shared/CommonSharedConstants.h | 1 + 8 files changed, 176 insertions(+), 54 deletions(-) create mode 100644 src/Magpie.Core/ScalingWindow.cpp create mode 100644 src/Magpie.Core/ScalingWindow.h create mode 100644 src/Magpie.Core/WindowBase.h diff --git a/src/Magpie.Core/Magpie.Core.vcxproj b/src/Magpie.Core/Magpie.Core.vcxproj index 2e23d4b2d..516ed40d5 100644 --- a/src/Magpie.Core/Magpie.Core.vcxproj +++ b/src/Magpie.Core/Magpie.Core.vcxproj @@ -93,7 +93,9 @@ + + @@ -109,6 +111,7 @@ Create + diff --git a/src/Magpie.Core/Magpie.Core.vcxproj.filters b/src/Magpie.Core/Magpie.Core.vcxproj.filters index 6317c99e7..e676888b3 100644 --- a/src/Magpie.Core/Magpie.Core.vcxproj.filters +++ b/src/Magpie.Core/Magpie.Core.vcxproj.filters @@ -64,6 +64,8 @@ Helpers + + @@ -89,6 +91,7 @@ Overlay + diff --git a/src/Magpie.Core/ScalingRuntime.cpp b/src/Magpie.Core/ScalingRuntime.cpp index 65e5b4b06..275ad787e 100644 --- a/src/Magpie.Core/ScalingRuntime.cpp +++ b/src/Magpie.Core/ScalingRuntime.cpp @@ -1,45 +1,44 @@ #include "pch.h" #include -//#include "MagApp.h" #include "ScalingRuntime.h" #include "Logger.h" #include "ScalingOptions.h" +#include "ScalingWindow.h" namespace Magpie::Core { -ScalingRuntime::ScalingRuntime() : _scalingWndThread(std::bind(&ScalingRuntime::_MagWindThreadProc, this)) { +ScalingRuntime::ScalingRuntime() : _scalingThread(std::bind(&ScalingRuntime::_ScalingThreadProc, this)) { } ScalingRuntime::~ScalingRuntime() { Stop(); - if (_scalingWndThread.joinable()) { - DWORD magWndThreadId = GetThreadId(_scalingWndThread.native_handle()); - // 持续尝试直到 _scalingWndThread 创建了消息队列 + if (_scalingThread.joinable()) { + DWORD magWndThreadId = GetThreadId(_scalingThread.native_handle()); + // 持续尝试直到 _scalingThread 创建了消息队列 while (!PostThreadMessage(magWndThreadId, WM_QUIT, 0, 0)) { Sleep(1); } - _scalingWndThread.join(); + _scalingThread.join(); } } void ScalingRuntime::Start(HWND hwndSrc, const ScalingOptions& options) { - if (_running) { + if (_isRunning) { return; } - _hwndSrc = hwndSrc; - _running = true; - _isRunningChangedEvent(true); + _IsRunning(true); _EnsureDispatcherQueue(); _dqc.DispatcherQueue().TryEnqueue([this, hwndSrc, options(options)]() mutable { - //MagApp::Get().Start(hwndSrc, std::move(options)); + _scalingWindow = std::make_unique(); + _scalingWindow->Create(GetModuleHandle(nullptr)); }); } void ScalingRuntime::ToggleOverlay() { - if (!_running) { + if (!_isRunning) { return; } @@ -50,17 +49,17 @@ void ScalingRuntime::ToggleOverlay() { } void ScalingRuntime::Stop() { - if (!_running) { + if (!_isRunning) { return; } _EnsureDispatcherQueue(); - _dqc.DispatcherQueue().TryEnqueue([]() { - //MagApp::Get().Stop(); + _dqc.DispatcherQueue().TryEnqueue([this]() { + _scalingWindow.reset(); }); } -void ScalingRuntime::_MagWindThreadProc() noexcept { +void ScalingRuntime::_ScalingThreadProc() noexcept { winrt::init_apartment(winrt::apartment_type::single_threaded); DispatcherQueueOptions dqOptions{}; @@ -80,47 +79,22 @@ void ScalingRuntime::_MagWindThreadProc() noexcept { MSG msg; while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { if (msg.message == WM_QUIT) { + _scalingWindow.reset(); + _IsRunning(false); return; } TranslateMessage(&msg); DispatchMessage(&msg); } - } - - /*MagApp& app = MagApp::Get(); - - while (true) { - if (app.GetHwndHost()) { - // 缩放时使用不同的消息循环 - bool quiting = !app.MessageLoop(); - _running = false; - _isRunningChangedEvent(false); - - if (quiting) { - return; - } + if (_scalingWindow) { + _scalingWindow->Render(); } else { - if (_running) { - // 缩放失败 - _running = false; - _isRunningChangedEvent(false); - } - + _IsRunning(false); WaitMessage(); - - MSG msg; - while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { - if (msg.message == WM_QUIT) { - return; - } - - TranslateMessage(&msg); - DispatchMessage(&msg); - } } - }*/ + } } void ScalingRuntime::_EnsureDispatcherQueue() const noexcept { @@ -129,4 +103,13 @@ void ScalingRuntime::_EnsureDispatcherQueue() const noexcept { } } +void ScalingRuntime::_IsRunning(bool value) { + if (_isRunning == value) { + return; + } + + _isRunning = value; + _isRunningChangedEvent(value); +} + } diff --git a/src/Magpie.Core/ScalingRuntime.h b/src/Magpie.Core/ScalingRuntime.h index a948ec7f9..289733358 100644 --- a/src/Magpie.Core/ScalingRuntime.h +++ b/src/Magpie.Core/ScalingRuntime.h @@ -8,6 +8,7 @@ namespace Magpie::Core { struct ScalingOptions; +class ScalingWindow; class API_DECLSPEC ScalingRuntime { public: @@ -15,7 +16,7 @@ class API_DECLSPEC ScalingRuntime { ~ScalingRuntime(); HWND HwndSrc() const { - return _running ? _hwndSrc : 0; + return _isRunning ? _hwndSrc : 0; } void Start(HWND hwndSrc, const ScalingOptions& options); @@ -24,8 +25,8 @@ class API_DECLSPEC ScalingRuntime { void Stop(); - bool IsRunning() const { - return _running; + bool IsRunning() const noexcept { + return _isRunning; } // 调用者应处理线程同步 @@ -45,17 +46,22 @@ class API_DECLSPEC ScalingRuntime { } private: - void _MagWindThreadProc() noexcept; + void _ScalingThreadProc() noexcept; // 确保 _dqc 完成初始化 void _EnsureDispatcherQueue() const noexcept; - std::thread _scalingWndThread; - std::atomic _running = false; + void _IsRunning(bool value); + HWND _hwndSrc = 0; + std::atomic _isRunning = false; + winrt::event> _isRunningChangedEvent; + + std::thread _scalingThread; winrt::Windows::System::DispatcherQueueController _dqc{ nullptr }; - winrt::event> _isRunningChangedEvent; + // 只能由 _scalingThread 访问 + std::unique_ptr _scalingWindow; }; } diff --git a/src/Magpie.Core/ScalingWindow.cpp b/src/Magpie.Core/ScalingWindow.cpp new file mode 100644 index 000000000..6753d2612 --- /dev/null +++ b/src/Magpie.Core/ScalingWindow.cpp @@ -0,0 +1,53 @@ +#include "pch.h" +#include "ScalingWindow.h" +#include "CommonSharedConstants.h" +#include "Logger.h" + +namespace Magpie::Core { + +bool ScalingWindow::Create(HINSTANCE hInstance) noexcept { + static const int _ = [](HINSTANCE hInstance) { + WNDCLASSEXW wcex{}; + wcex.cbSize = sizeof(wcex); + wcex.lpfnWndProc = _WndProc; + wcex.hInstance = hInstance; + wcex.hCursor = LoadCursor(nullptr, IDC_ARROW); + wcex.lpszClassName = CommonSharedConstants::SCALING_WINDOW_CLASS_NAME; + RegisterClassEx(&wcex); + + return 0; + }(hInstance); + + // Win11 22H2 中为了使用 Mica 背景需指定 WS_EX_NOREDIRECTIONBITMAP + CreateWindowEx( + WS_EX_NOACTIVATE | WS_EX_LAYERED | WS_EX_NOREDIRECTIONBITMAP | WS_EX_TRANSPARENT | WS_EX_TOOLWINDOW, + CommonSharedConstants::SCALING_WINDOW_CLASS_NAME, + L"Magpie", + WS_OVERLAPPED, + CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, + NULL, + NULL, + hInstance, + this + ); + + if (!Handle()) { + return false; + } + + // 设置窗口不透明 + // 不完全透明时可关闭 DirectFlip + if (!SetLayeredWindowAttributes(Handle(), 0, 255, LWA_ALPHA)) { + Logger::Get().Win32Error("SetLayeredWindowAttributes 失败"); + } + + ShowWindow(Handle(), SW_SHOWMAXIMIZED); + + return true; +} + +void ScalingWindow::Render() noexcept { + +} + +} diff --git a/src/Magpie.Core/ScalingWindow.h b/src/Magpie.Core/ScalingWindow.h new file mode 100644 index 000000000..9598697b2 --- /dev/null +++ b/src/Magpie.Core/ScalingWindow.h @@ -0,0 +1,15 @@ +#pragma once +#include "WindowBase.h" + +namespace Magpie::Core { + +class ScalingWindow : public WindowBase { + friend class base_type; + +public: + bool Create(HINSTANCE hInstance) noexcept; + + void Render() noexcept; +}; + +} diff --git a/src/Magpie.Core/WindowBase.h b/src/Magpie.Core/WindowBase.h new file mode 100644 index 000000000..240fa5720 --- /dev/null +++ b/src/Magpie.Core/WindowBase.h @@ -0,0 +1,58 @@ +#pragma once + +namespace Magpie::Core { + +template +class WindowBase { +public: + virtual ~WindowBase() { + Destroy(); + } + + HWND Handle() const noexcept { + return _hWnd; + } + + operator bool() const noexcept { + return _hWnd; + } + + void Destroy() const noexcept { + if (_hWnd) { + DestroyWindow(_hWnd); + } + } + +protected: + using base_type = WindowBase; + + static LRESULT CALLBACK _WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) noexcept { + if (msg == WM_NCCREATE) { + WindowBase* that = (WindowBase*)(((CREATESTRUCT*)lParam)->lpCreateParams); + assert(that && !that->_hWnd); + that->_hWnd = hWnd; + SetWindowLongPtr(hWnd, GWLP_USERDATA, (LONG_PTR)that); + } else if (T* that = (T*)GetWindowLongPtr(hWnd, GWLP_USERDATA)) { + return that->_MessageHandler(msg, wParam, lParam); + } + + return DefWindowProc(hWnd, msg, wParam, lParam); + } + + LRESULT _MessageHandler(UINT msg, WPARAM wParam, LPARAM lParam) noexcept { + switch (msg) { + case WM_DESTROY: + { + _hWnd = NULL; + return 0; + } + } + + return DefWindowProc(_hWnd, msg, wParam, lParam); + } + +private: + HWND _hWnd = NULL; +}; + +} diff --git a/src/Shared/CommonSharedConstants.h b/src/Shared/CommonSharedConstants.h index cc6696d10..0bb205e29 100644 --- a/src/Shared/CommonSharedConstants.h +++ b/src/Shared/CommonSharedConstants.h @@ -5,6 +5,7 @@ struct CommonSharedConstants { static constexpr const wchar_t* TITLE_BAR_WINDOW_CLASS_NAME = L"Magpie_TitleBar"; static constexpr const wchar_t* NOTIFY_ICON_WINDOW_CLASS_NAME = L"Magpie_NotifyIcon"; static constexpr const wchar_t* HOTKEY_WINDOW_CLASS_NAME = L"Magpie_Hotkey"; + static constexpr const wchar_t* SCALING_WINDOW_CLASS_NAME = L"Window_Magpie_967EB565-6F73-4E94-AE53-00CC42592A22"; static constexpr const COLORREF LIGHT_TINT_COLOR = RGB(243, 243, 243); static constexpr const COLORREF DARK_TINT_COLOR = RGB(32, 32, 32); From f07972be3d3dcfab1a8611dd256ce6cf66fc5f98 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=97=AD?= Date: Tue, 6 Jun 2023 14:54:09 +0800 Subject: [PATCH 005/155] =?UTF-8?q?fix:=20=E4=BC=98=E5=8C=96=E7=BC=A9?= =?UTF-8?q?=E6=94=BE=E7=AA=97=E5=8F=A3=E6=A0=B7=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Magpie.Core/ScalingWindow.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/Magpie.Core/ScalingWindow.cpp b/src/Magpie.Core/ScalingWindow.cpp index 6753d2612..45cbadf75 100644 --- a/src/Magpie.Core/ScalingWindow.cpp +++ b/src/Magpie.Core/ScalingWindow.cpp @@ -18,12 +18,11 @@ bool ScalingWindow::Create(HINSTANCE hInstance) noexcept { return 0; }(hInstance); - // Win11 22H2 中为了使用 Mica 背景需指定 WS_EX_NOREDIRECTIONBITMAP CreateWindowEx( - WS_EX_NOACTIVATE | WS_EX_LAYERED | WS_EX_NOREDIRECTIONBITMAP | WS_EX_TRANSPARENT | WS_EX_TOOLWINDOW, + WS_EX_TOPMOST | WS_EX_NOACTIVATE | WS_EX_LAYERED | WS_EX_NOREDIRECTIONBITMAP | WS_EX_TRANSPARENT | WS_EX_TOOLWINDOW, CommonSharedConstants::SCALING_WINDOW_CLASS_NAME, L"Magpie", - WS_OVERLAPPED, + WS_POPUP, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, From a68083c68ff775d3ff02d192ea25a9c2abfe5c07 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=97=AD?= <34770031+Blinue@users.noreply.github.com> Date: Tue, 6 Jun 2023 19:28:20 +0800 Subject: [PATCH 006/155] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=20Renderer?= =?UTF-8?q?=20=E5=92=8C=20DeviceResources?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Magpie.App/ScalingService.cpp | 2 +- src/Magpie.Core/DeviceResources.cpp | 32 +++++++++++++++++++++ src/Magpie.Core/DeviceResources.h | 18 ++++++++++++ src/Magpie.Core/Magpie.Core.vcxproj | 4 +++ src/Magpie.Core/Magpie.Core.vcxproj.filters | 4 +++ src/Magpie.Core/Renderer.cpp | 24 ++++++++++++++++ src/Magpie.Core/Renderer.h | 24 ++++++++++++++++ src/Magpie.Core/ScalingRuntime.cpp | 6 ++-- src/Magpie.Core/ScalingRuntime.h | 2 +- src/Magpie.Core/ScalingWindow.cpp | 20 +++++++++---- src/Magpie.Core/ScalingWindow.h | 11 ++++++- src/Magpie.Core/WindowBase.h | 7 +++-- 12 files changed, 141 insertions(+), 13 deletions(-) create mode 100644 src/Magpie.Core/DeviceResources.cpp create mode 100644 src/Magpie.Core/DeviceResources.h create mode 100644 src/Magpie.Core/Renderer.cpp create mode 100644 src/Magpie.Core/Renderer.h diff --git a/src/Magpie.App/ScalingService.cpp b/src/Magpie.App/ScalingService.cpp index 92594a259..5c5f5c835 100644 --- a/src/Magpie.App/ScalingService.cpp +++ b/src/Magpie.App/ScalingService.cpp @@ -316,7 +316,7 @@ bool ScalingService::_StartScale(HWND hWnd, const Profile& profile) { options.IsSimulateExclusiveFullscreen(settings.IsSimulateExclusiveFullscreen()); _isAutoScaling = profile.isAutoScale; - _ScalingRuntime->Start(hWnd, options); + _ScalingRuntime->Start(hWnd, std::move(options)); return true; } diff --git a/src/Magpie.Core/DeviceResources.cpp b/src/Magpie.Core/DeviceResources.cpp new file mode 100644 index 000000000..2ac506f41 --- /dev/null +++ b/src/Magpie.Core/DeviceResources.cpp @@ -0,0 +1,32 @@ +#include "pch.h" +#include "DeviceResources.h" +#include "ScalingOptions.h" + +namespace Magpie::Core { + +bool DeviceResources::Initialize(HWND /*hwndScaling*/, const ScalingOptions& /*options*/) noexcept { + return true; +} + +bool DeviceResources::IsDebugLayersAvailable() noexcept { +#ifdef _DEBUG + static bool result = SUCCEEDED(D3D11CreateDevice( + nullptr, + D3D_DRIVER_TYPE_NULL, // There is no need to create a real hardware device. + nullptr, + D3D11_CREATE_DEVICE_DEBUG, // Check for the SDK layers. + nullptr, // Any feature level will do. + 0, + D3D11_SDK_VERSION, + nullptr, // No need to keep the D3D device reference. + nullptr, // No need to know the feature level. + nullptr // No need to keep the D3D device context reference. + )); + return result; +#else + // Relaese 配置不使用调试层 + return false; +#endif +} + +} diff --git a/src/Magpie.Core/DeviceResources.h b/src/Magpie.Core/DeviceResources.h new file mode 100644 index 000000000..c2841a8ae --- /dev/null +++ b/src/Magpie.Core/DeviceResources.h @@ -0,0 +1,18 @@ +#pragma once + +namespace Magpie::Core { + +struct ScalingOptions; + +class DeviceResources { +public: + DeviceResources() noexcept = default; + DeviceResources(const DeviceResources&) = delete; + DeviceResources(DeviceResources&&) noexcept = default; + + bool Initialize(HWND hwndScaling, const ScalingOptions& options) noexcept; + + static bool IsDebugLayersAvailable() noexcept; +}; + +} diff --git a/src/Magpie.Core/Magpie.Core.vcxproj b/src/Magpie.Core/Magpie.Core.vcxproj index 516ed40d5..70dd37528 100644 --- a/src/Magpie.Core/Magpie.Core.vcxproj +++ b/src/Magpie.Core/Magpie.Core.vcxproj @@ -80,6 +80,7 @@ + @@ -90,6 +91,7 @@ + @@ -100,6 +102,7 @@ + @@ -110,6 +113,7 @@ Create + diff --git a/src/Magpie.Core/Magpie.Core.vcxproj.filters b/src/Magpie.Core/Magpie.Core.vcxproj.filters index e676888b3..3ac97d454 100644 --- a/src/Magpie.Core/Magpie.Core.vcxproj.filters +++ b/src/Magpie.Core/Magpie.Core.vcxproj.filters @@ -66,6 +66,8 @@ + + @@ -92,6 +94,8 @@ Overlay + + diff --git a/src/Magpie.Core/Renderer.cpp b/src/Magpie.Core/Renderer.cpp new file mode 100644 index 000000000..c37cbf04b --- /dev/null +++ b/src/Magpie.Core/Renderer.cpp @@ -0,0 +1,24 @@ +#include "pch.h" +#include "Renderer.h" +#include "DeviceResources.h" +#include "ScalingOptions.h" + +namespace Magpie::Core { + +Renderer::Renderer() noexcept {} + +Renderer::~Renderer() noexcept {} + +bool Renderer::Initialize(HWND hwndScaling, const ScalingOptions& options) noexcept { + _deviceResources = std::make_unique(); + if (!_deviceResources->Initialize(hwndScaling, options)) { + return false; + } + + return true; +} + +void Renderer::Render() noexcept { +} + +} diff --git a/src/Magpie.Core/Renderer.h b/src/Magpie.Core/Renderer.h new file mode 100644 index 000000000..d99f652e2 --- /dev/null +++ b/src/Magpie.Core/Renderer.h @@ -0,0 +1,24 @@ +#pragma once + +namespace Magpie::Core { + +struct ScalingOptions; +class DeviceResources; + +class Renderer { +public: + Renderer() noexcept; + ~Renderer() noexcept; + + Renderer(const Renderer&) = delete; + Renderer(Renderer&&) noexcept = default; + + bool Initialize(HWND hwndScaling, const ScalingOptions& options) noexcept; + + void Render() noexcept; + +private: + std::unique_ptr _deviceResources; +}; + +} diff --git a/src/Magpie.Core/ScalingRuntime.cpp b/src/Magpie.Core/ScalingRuntime.cpp index 275ad787e..727e81b8c 100644 --- a/src/Magpie.Core/ScalingRuntime.cpp +++ b/src/Magpie.Core/ScalingRuntime.cpp @@ -23,7 +23,7 @@ ScalingRuntime::~ScalingRuntime() { } } -void ScalingRuntime::Start(HWND hwndSrc, const ScalingOptions& options) { +void ScalingRuntime::Start(HWND hwndSrc, ScalingOptions&& options) { if (_isRunning) { return; } @@ -31,9 +31,9 @@ void ScalingRuntime::Start(HWND hwndSrc, const ScalingOptions& options) { _IsRunning(true); _EnsureDispatcherQueue(); - _dqc.DispatcherQueue().TryEnqueue([this, hwndSrc, options(options)]() mutable { + _dqc.DispatcherQueue().TryEnqueue([this, hwndSrc, options(std::move(options))]() mutable { _scalingWindow = std::make_unique(); - _scalingWindow->Create(GetModuleHandle(nullptr)); + _scalingWindow->Create(GetModuleHandle(nullptr), std::move(options)); }); } diff --git a/src/Magpie.Core/ScalingRuntime.h b/src/Magpie.Core/ScalingRuntime.h index 289733358..caf73f587 100644 --- a/src/Magpie.Core/ScalingRuntime.h +++ b/src/Magpie.Core/ScalingRuntime.h @@ -19,7 +19,7 @@ class API_DECLSPEC ScalingRuntime { return _isRunning ? _hwndSrc : 0; } - void Start(HWND hwndSrc, const ScalingOptions& options); + void Start(HWND hwndSrc, ScalingOptions&& options); void ToggleOverlay(); diff --git a/src/Magpie.Core/ScalingWindow.cpp b/src/Magpie.Core/ScalingWindow.cpp index 45cbadf75..1cb9cf4d0 100644 --- a/src/Magpie.Core/ScalingWindow.cpp +++ b/src/Magpie.Core/ScalingWindow.cpp @@ -2,10 +2,15 @@ #include "ScalingWindow.h" #include "CommonSharedConstants.h" #include "Logger.h" +#include "Renderer.h" namespace Magpie::Core { -bool ScalingWindow::Create(HINSTANCE hInstance) noexcept { +ScalingWindow::ScalingWindow() noexcept {} + +ScalingWindow::~ScalingWindow() noexcept {} + +bool ScalingWindow::Create(HINSTANCE hInstance, ScalingOptions&& options) noexcept { static const int _ = [](HINSTANCE hInstance) { WNDCLASSEXW wcex{}; wcex.cbSize = sizeof(wcex); @@ -30,23 +35,28 @@ bool ScalingWindow::Create(HINSTANCE hInstance) noexcept { this ); - if (!Handle()) { + if (!_hWnd) { return false; } // 设置窗口不透明 // 不完全透明时可关闭 DirectFlip - if (!SetLayeredWindowAttributes(Handle(), 0, 255, LWA_ALPHA)) { + if (!SetLayeredWindowAttributes(_hWnd, 0, 255, LWA_ALPHA)) { Logger::Get().Win32Error("SetLayeredWindowAttributes 失败"); } - ShowWindow(Handle(), SW_SHOWMAXIMIZED); + _renderer = std::make_unique(); + if (!_renderer->Initialize(_hWnd, options)) { + return false; + } + + ShowWindow(_hWnd, SW_SHOWMAXIMIZED); return true; } void ScalingWindow::Render() noexcept { - + _renderer->Render(); } } diff --git a/src/Magpie.Core/ScalingWindow.h b/src/Magpie.Core/ScalingWindow.h index 9598697b2..776bf81df 100644 --- a/src/Magpie.Core/ScalingWindow.h +++ b/src/Magpie.Core/ScalingWindow.h @@ -3,13 +3,22 @@ namespace Magpie::Core { +struct ScalingOptions; +class Renderer; + class ScalingWindow : public WindowBase { friend class base_type; public: - bool Create(HINSTANCE hInstance) noexcept; + ScalingWindow() noexcept; + ~ScalingWindow() noexcept; + + bool Create(HINSTANCE hInstance, ScalingOptions&& options) noexcept; void Render() noexcept; + +private: + std::unique_ptr _renderer; }; } diff --git a/src/Magpie.Core/WindowBase.h b/src/Magpie.Core/WindowBase.h index 240fa5720..1d01a1016 100644 --- a/src/Magpie.Core/WindowBase.h +++ b/src/Magpie.Core/WindowBase.h @@ -5,7 +5,11 @@ namespace Magpie::Core { template class WindowBase { public: - virtual ~WindowBase() { + WindowBase() noexcept = default; + WindowBase(const WindowBase&) = delete; + WindowBase(WindowBase&&) noexcept = default; + + virtual ~WindowBase() noexcept { Destroy(); } @@ -51,7 +55,6 @@ class WindowBase { return DefWindowProc(_hWnd, msg, wParam, lParam); } -private: HWND _hWnd = NULL; }; From df9813caaecb46798de446e7973005f0e0e32da8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=97=AD?= <34770031+Blinue@users.noreply.github.com> Date: Tue, 6 Jun 2023 21:06:45 +0800 Subject: [PATCH 007/155] =?UTF-8?q?feat:=20=E5=88=9B=E5=BB=BA=20D3D=20?= =?UTF-8?q?=E8=AE=BE=E5=A4=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Magpie.Core/DeviceResources.cpp | 177 +++++++++++++++++++++++++--- src/Magpie.Core/DeviceResources.h | 10 +- src/Magpie.Core/DirectXHelper.cpp | 21 ++++ src/Magpie.Core/DirectXHelper.h | 2 + src/Magpie.Core/Renderer.cpp | 1 + src/Magpie.Core/ScalingRuntime.cpp | 13 +- src/Magpie.Core/ScalingWindow.cpp | 15 +++ src/Magpie.Core/ScalingWindow.h | 3 + 8 files changed, 219 insertions(+), 23 deletions(-) diff --git a/src/Magpie.Core/DeviceResources.cpp b/src/Magpie.Core/DeviceResources.cpp index 2ac506f41..2c546af52 100644 --- a/src/Magpie.Core/DeviceResources.cpp +++ b/src/Magpie.Core/DeviceResources.cpp @@ -1,32 +1,173 @@ #include "pch.h" #include "DeviceResources.h" #include "ScalingOptions.h" +#include "Logger.h" +#include "StrUtils.h" +#include "DirectXHelper.h" namespace Magpie::Core { -bool DeviceResources::Initialize(HWND /*hwndScaling*/, const ScalingOptions& /*options*/) noexcept { +bool DeviceResources::Initialize(HWND /*hwndScaling*/, const ScalingOptions& options) noexcept { +#ifdef _DEBUG + UINT flag = DXGI_CREATE_FACTORY_DEBUG; +#else + UINT flag = 0; +#endif // _DEBUG + + winrt::com_ptr dxgiFactory; + HRESULT hr = CreateDXGIFactory2(flag, IID_PPV_ARGS(dxgiFactory.put())); + if (FAILED(hr)) { + Logger::Get().ComError("CreateDXGIFactory2 失败", hr); + return false; + } + + // 检查可变帧率支持 + BOOL supportTearing = FALSE; + hr = dxgiFactory->CheckFeatureSupport(DXGI_FEATURE_PRESENT_ALLOW_TEARING, &supportTearing, sizeof(supportTearing)); + if (FAILED(hr)) { + Logger::Get().ComWarn("CheckFeatureSupport 失败", hr); + } + + Logger::Get().Info(fmt::format("可变刷新率支持:{}", supportTearing ? "是" : "否")); + + if (!options.IsVSync() && !supportTearing) { + Logger::Get().Error("当前显示器不支持可变刷新率"); + return false; + } + + if (!_ObtainAdapterAndDevice(dxgiFactory.get(), options.graphicsCard)) { + Logger::Get().Error("找不到可用的图形适配器"); + return false; + } + return true; } -bool DeviceResources::IsDebugLayersAvailable() noexcept { -#ifdef _DEBUG - static bool result = SUCCEEDED(D3D11CreateDevice( - nullptr, - D3D_DRIVER_TYPE_NULL, // There is no need to create a real hardware device. +static void LogAdapter(const DXGI_ADAPTER_DESC1& adapterDesc) noexcept { + Logger::Get().Info(fmt::format("当前图形适配器:\n\tVendorId:{:#x}\n\tDeviceId:{:#x}\n\t描述:{}", + adapterDesc.VendorId, adapterDesc.DeviceId, StrUtils::UTF16ToUTF8(adapterDesc.Description))); +} + +bool DeviceResources::_ObtainAdapterAndDevice(IDXGIFactory7* dxgiFactory, int adapterIdx) noexcept { + winrt::com_ptr adapter; + + if (adapterIdx >= 0) { + HRESULT hr = dxgiFactory->EnumAdapters1(adapterIdx, adapter.put()); + if (SUCCEEDED(hr)) { + DXGI_ADAPTER_DESC1 desc; + hr = adapter->GetDesc1(&desc); + if (SUCCEEDED(hr)) { + if (desc.Flags & DXGI_ADAPTER_FLAG_SOFTWARE) { + Logger::Get().Warn("用户指定的显示卡为 WARP,已忽略"); + } else if (_TryCreateD3DDevice(adapter)) { + LogAdapter(desc); + return true; + } else { + Logger::Get().Warn("用户指定的显示卡不支持 FL 11"); + } + } else { + Logger::Get().Error("GetDesc1 失败"); + } + } else { + Logger::Get().Warn("未找到用户指定的显示卡"); + } + } + + // 枚举查找第一个支持 D3D11 的图形适配器 + for (UINT adapterIndex = 0; + SUCCEEDED(dxgiFactory->EnumAdapters1(adapterIndex, adapter.put())); + ++adapterIndex + ) { + DXGI_ADAPTER_DESC1 desc; + HRESULT hr = adapter->GetDesc1(&desc); + if (FAILED(hr)) { + continue; + } + + // 忽略 WARP + if (desc.Flags & DXGI_ADAPTER_FLAG_SOFTWARE) { + continue; + } + + if (_TryCreateD3DDevice(adapter)) { + LogAdapter(desc); + return true; + } + } + + // 作为最后手段,回落到 Basic Render Driver Adapter(WARP) + // https://docs.microsoft.com/en-us/windows/win32/direct3darticles/directx-warp + HRESULT hr = dxgiFactory->EnumWarpAdapter(IID_PPV_ARGS(&adapter)); + if (FAILED(hr)) { + Logger::Get().ComError("创建 WARP 设备失败", hr); + return false; + } + + Logger::Get().Info("已创建 WARP 设备"); + return true; +} + +bool DeviceResources::_TryCreateD3DDevice(const winrt::com_ptr& adapter) noexcept { + D3D_FEATURE_LEVEL featureLevels[] = { + D3D_FEATURE_LEVEL_11_1, + D3D_FEATURE_LEVEL_11_0 + }; + UINT nFeatureLevels = ARRAYSIZE(featureLevels); + + UINT createDeviceFlags = D3D11_CREATE_DEVICE_BGRA_SUPPORT; + if (DirectXHelper::IsDebugLayersAvailable()) { + // 在 DEBUG 配置启用调试层 + createDeviceFlags |= D3D11_CREATE_DEVICE_DEBUG; + } + + winrt::com_ptr d3dDevice; + winrt::com_ptr d3dDC; + D3D_FEATURE_LEVEL featureLevel; + HRESULT hr = D3D11CreateDevice( + adapter.get(), + D3D_DRIVER_TYPE_UNKNOWN, nullptr, - D3D11_CREATE_DEVICE_DEBUG, // Check for the SDK layers. - nullptr, // Any feature level will do. - 0, + createDeviceFlags, + featureLevels, + nFeatureLevels, D3D11_SDK_VERSION, - nullptr, // No need to keep the D3D device reference. - nullptr, // No need to know the feature level. - nullptr // No need to keep the D3D device context reference. - )); - return result; -#else - // Relaese 配置不使用调试层 - return false; -#endif + d3dDevice.put(), + &featureLevel, + d3dDC.put() + ); + + if (FAILED(hr)) { + Logger::Get().ComError("D3D11CreateDevice 失败", hr); + return false; + } + + std::string_view fl; + switch (featureLevel) { + case D3D_FEATURE_LEVEL_11_1: + fl = "11.1"; + break; + case D3D_FEATURE_LEVEL_11_0: + fl = "11.0"; + break; + default: + fl = "未知"; + break; + } + Logger::Get().Info(fmt::format("已创建 D3D Device\n\t功能级别:{}", fl)); + + _d3dDevice = d3dDevice.try_as(); + if (!_d3dDevice) { + Logger::Get().Error("获取 ID3D11Device1 失败"); + return false; + } + + _graphicsAdapter = adapter.try_as(); + if (!_graphicsAdapter) { + Logger::Get().ComError("获取 IDXGIAdapter4 失败", hr); + return false; + } + + return true; } } diff --git a/src/Magpie.Core/DeviceResources.h b/src/Magpie.Core/DeviceResources.h index c2841a8ae..52592531a 100644 --- a/src/Magpie.Core/DeviceResources.h +++ b/src/Magpie.Core/DeviceResources.h @@ -12,7 +12,15 @@ class DeviceResources { bool Initialize(HWND hwndScaling, const ScalingOptions& options) noexcept; - static bool IsDebugLayersAvailable() noexcept; + ID3D11Device5* GetD3DDevice() const noexcept { return _d3dDevice.get(); } + IDXGIAdapter4* GetGraphicsAdapter() const noexcept { return _graphicsAdapter.get(); } + +private: + bool _ObtainAdapterAndDevice(IDXGIFactory7* dxgiFactory, int adapterIdx) noexcept; + bool _TryCreateD3DDevice(const winrt::com_ptr& adapter) noexcept; + + winrt::com_ptr _graphicsAdapter; + winrt::com_ptr _d3dDevice; }; } diff --git a/src/Magpie.Core/DirectXHelper.cpp b/src/Magpie.Core/DirectXHelper.cpp index 85ce03d5e..95c30e1b4 100644 --- a/src/Magpie.Core/DirectXHelper.cpp +++ b/src/Magpie.Core/DirectXHelper.cpp @@ -51,4 +51,25 @@ bool DirectXHelper::CompileComputeShader( return true; } +bool DirectXHelper::IsDebugLayersAvailable() noexcept { +#ifdef _DEBUG + static bool result = SUCCEEDED(D3D11CreateDevice( + nullptr, + D3D_DRIVER_TYPE_NULL, // There is no need to create a real hardware device. + nullptr, + D3D11_CREATE_DEVICE_DEBUG, // Check for the SDK layers. + nullptr, // Any feature level will do. + 0, + D3D11_SDK_VERSION, + nullptr, // No need to keep the D3D device reference. + nullptr, // No need to know the feature level. + nullptr // No need to keep the D3D device context reference. + )); + return result; +#else + // Relaese 配置不使用调试层 + return false; +#endif +} + } diff --git a/src/Magpie.Core/DirectXHelper.h b/src/Magpie.Core/DirectXHelper.h index 451ada361..376e10ebf 100644 --- a/src/Magpie.Core/DirectXHelper.h +++ b/src/Magpie.Core/DirectXHelper.h @@ -12,6 +12,8 @@ struct DirectXHelper { const std::vector>& macros = {}, bool warningsAreErrors = false ); + + static bool IsDebugLayersAvailable() noexcept; }; } diff --git a/src/Magpie.Core/Renderer.cpp b/src/Magpie.Core/Renderer.cpp index c37cbf04b..527c57fd0 100644 --- a/src/Magpie.Core/Renderer.cpp +++ b/src/Magpie.Core/Renderer.cpp @@ -19,6 +19,7 @@ bool Renderer::Initialize(HWND hwndScaling, const ScalingOptions& options) noexc } void Renderer::Render() noexcept { + WaitMessage(); } } diff --git a/src/Magpie.Core/ScalingRuntime.cpp b/src/Magpie.Core/ScalingRuntime.cpp index 727e81b8c..a2b23a331 100644 --- a/src/Magpie.Core/ScalingRuntime.cpp +++ b/src/Magpie.Core/ScalingRuntime.cpp @@ -32,7 +32,10 @@ void ScalingRuntime::Start(HWND hwndSrc, ScalingOptions&& options) { _EnsureDispatcherQueue(); _dqc.DispatcherQueue().TryEnqueue([this, hwndSrc, options(std::move(options))]() mutable { - _scalingWindow = std::make_unique(); + if (!_scalingWindow) { + _scalingWindow = std::make_unique(); + } + _scalingWindow->Create(GetModuleHandle(nullptr), std::move(options)); }); } @@ -55,7 +58,9 @@ void ScalingRuntime::Stop() { _EnsureDispatcherQueue(); _dqc.DispatcherQueue().TryEnqueue([this]() { - _scalingWindow.reset(); + if (_scalingWindow) { + _scalingWindow->Destroy(); + } }); } @@ -79,7 +84,7 @@ void ScalingRuntime::_ScalingThreadProc() noexcept { MSG msg; while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { if (msg.message == WM_QUIT) { - _scalingWindow.reset(); + _scalingWindow->Destroy(); _IsRunning(false); return; } @@ -88,7 +93,7 @@ void ScalingRuntime::_ScalingThreadProc() noexcept { DispatchMessage(&msg); } - if (_scalingWindow) { + if (_scalingWindow && *_scalingWindow) { _scalingWindow->Render(); } else { _IsRunning(false); diff --git a/src/Magpie.Core/ScalingWindow.cpp b/src/Magpie.Core/ScalingWindow.cpp index 1cb9cf4d0..4b9df0415 100644 --- a/src/Magpie.Core/ScalingWindow.cpp +++ b/src/Magpie.Core/ScalingWindow.cpp @@ -11,6 +11,10 @@ ScalingWindow::ScalingWindow() noexcept {} ScalingWindow::~ScalingWindow() noexcept {} bool ScalingWindow::Create(HINSTANCE hInstance, ScalingOptions&& options) noexcept { + if (_hWnd) { + return false; + } + static const int _ = [](HINSTANCE hInstance) { WNDCLASSEXW wcex{}; wcex.cbSize = sizeof(wcex); @@ -59,4 +63,15 @@ void ScalingWindow::Render() noexcept { _renderer->Render(); } +LRESULT ScalingWindow::_MessageHandler(UINT msg, WPARAM wParam, LPARAM lParam) noexcept { + switch (msg) { + case WM_DESTROY: + { + _renderer.reset(); + break; + } + } + return base_type::_MessageHandler(msg, wParam, lParam); +} + } diff --git a/src/Magpie.Core/ScalingWindow.h b/src/Magpie.Core/ScalingWindow.h index 776bf81df..d849fca57 100644 --- a/src/Magpie.Core/ScalingWindow.h +++ b/src/Magpie.Core/ScalingWindow.h @@ -17,6 +17,9 @@ class ScalingWindow : public WindowBase { void Render() noexcept; +protected: + LRESULT _MessageHandler(UINT msg, WPARAM wParam, LPARAM lParam) noexcept; + private: std::unique_ptr _renderer; }; From 65d1f62425031fc6386256f4e34b6c859bf4d18f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=97=AD?= <34770031+Blinue@users.noreply.github.com> Date: Tue, 6 Jun 2023 21:18:02 +0800 Subject: [PATCH 008/155] =?UTF-8?q?refactor:=20=E9=99=8D=E4=BD=8E=E8=80=A6?= =?UTF-8?q?=E5=90=88=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Magpie.App/ScalingService.cpp | 29 +++++++++++++++++------------ src/Magpie.App/ScalingService.h | 11 ++++++----- src/Magpie.Core/ScalingRuntime.cpp | 16 +++++----------- src/Magpie.Core/ScalingRuntime.h | 4 ++-- 4 files changed, 30 insertions(+), 30 deletions(-) diff --git a/src/Magpie.App/ScalingService.cpp b/src/Magpie.App/ScalingService.cpp index 5c5f5c835..81286e863 100644 --- a/src/Magpie.App/ScalingService.cpp +++ b/src/Magpie.App/ScalingService.cpp @@ -8,6 +8,7 @@ #include "ScalingMode.h" #include "Logger.h" #include "EffectsService.h" +#include using namespace ::Magpie::Core; using namespace winrt; @@ -27,8 +28,8 @@ void ScalingService::Initialize() { ); AppSettings::Get().IsAutoRestoreChanged({ this, &ScalingService::_Settings_IsAutoRestoreChanged }); - _ScalingRuntime.emplace(); - _ScalingRuntime->IsRunningChanged({ this, &ScalingService::_ScalingRuntime_IsRunningChanged }); + _scalingRuntime = std::make_unique(); + _scalingRuntime->IsRunningChanged({ this, &ScalingService::_ScalingRuntime_IsRunningChanged }); ShortcutService::Get().ShortcutActivated( { this, &ScalingService::_ShortcutService_ShortcutPressed } @@ -41,7 +42,7 @@ void ScalingService::Initialize() { void ScalingService::Uninitialize() { _checkForegroundTimer.Cancel(); _countDownTimer.Stop(); - _ScalingRuntime.reset(); + _scalingRuntime.reset(); } void ScalingService::StartTimer() { @@ -82,6 +83,10 @@ void ScalingService::ClearWndToRestore() { _WndToRestore(NULL); } +bool ScalingService::IsRunning() const noexcept { + return _scalingRuntime->IsRunning(); +} + void ScalingService::CheckForeground() { _hwndChecked = NULL; _CheckForegroundTimer_Tick(nullptr); @@ -97,15 +102,15 @@ void ScalingService::_WndToRestore(HWND value) { } void ScalingService::_ShortcutService_ShortcutPressed(ShortcutAction action) { - if (!_ScalingRuntime) { + if (!_scalingRuntime) { return; } switch (action) { case ShortcutAction::Scale: { - if (_ScalingRuntime->IsRunning()) { - _ScalingRuntime->Stop(); + if (_scalingRuntime->IsRunning()) { + _scalingRuntime->Stop(); return; } @@ -114,8 +119,8 @@ void ScalingService::_ShortcutService_ShortcutPressed(ShortcutAction action) { } case ShortcutAction::Overlay: { - if (_ScalingRuntime->IsRunning()) { - _ScalingRuntime->ToggleOverlay(); + if (_scalingRuntime->IsRunning()) { + _scalingRuntime->ToggleOverlay(); return; } break; @@ -139,7 +144,7 @@ void ScalingService::_CountDownTimer_Tick(IInspectable const&, IInspectable cons } fire_and_forget ScalingService::_CheckForegroundTimer_Tick(ThreadPoolTimer const& timer) { - if (!_ScalingRuntime || _ScalingRuntime->IsRunning()) { + if (!_scalingRuntime || _scalingRuntime->IsRunning()) { co_return; } @@ -188,7 +193,7 @@ fire_and_forget ScalingService::_CheckForegroundTimer_Tick(ThreadPoolTimer const void ScalingService::_Settings_IsAutoRestoreChanged(bool) { if (AppSettings::Get().IsAutoRestore()) { // 立即生效,即使正处于缩放状态 - _hwndCurSrc = _ScalingRuntime->HwndSrc(); + _hwndCurSrc = _scalingRuntime->HwndSrc(); } else { _hwndCurSrc = NULL; _WndToRestore(NULL); @@ -205,7 +210,7 @@ fire_and_forget ScalingService::_ScalingRuntime_IsRunningChanged(bool isRunning) _WndToRestore(NULL); } - _hwndCurSrc = _ScalingRuntime->HwndSrc(); + _hwndCurSrc = _scalingRuntime->HwndSrc(); } else { HWND curSrcWnd = _hwndCurSrc; _hwndCurSrc = NULL; @@ -316,7 +321,7 @@ bool ScalingService::_StartScale(HWND hWnd, const Profile& profile) { options.IsSimulateExclusiveFullscreen(settings.IsSimulateExclusiveFullscreen()); _isAutoScaling = profile.isAutoScale; - _ScalingRuntime->Start(hWnd, std::move(options)); + _scalingRuntime->Start(hWnd, std::move(options)); return true; } diff --git a/src/Magpie.App/ScalingService.h b/src/Magpie.App/ScalingService.h index 24f8ff377..3501dee8b 100644 --- a/src/Magpie.App/ScalingService.h +++ b/src/Magpie.App/ScalingService.h @@ -1,8 +1,11 @@ #pragma once #include -#include #include "WinRTUtils.h" +namespace Magpie::Core { +class ScalingRuntime; +} + namespace winrt::Magpie::App { struct Profile; @@ -101,9 +104,7 @@ class ScalingService { _isRunningChangedEvent.remove(token); } - bool IsRunning() const noexcept { - return _ScalingRuntime->IsRunning(); - } + bool IsRunning() const noexcept; // 强制重新检查前台窗口 void CheckForeground(); @@ -129,7 +130,7 @@ class ScalingService { bool _CheckSrcWnd(HWND hWnd) noexcept; - std::optional<::Magpie::Core::ScalingRuntime> _ScalingRuntime; + std::unique_ptr<::Magpie::Core::ScalingRuntime> _scalingRuntime; CoreDispatcher _dispatcher{ nullptr }; DispatcherTimer _countDownTimer; diff --git a/src/Magpie.Core/ScalingRuntime.cpp b/src/Magpie.Core/ScalingRuntime.cpp index a2b23a331..a9f91b55b 100644 --- a/src/Magpie.Core/ScalingRuntime.cpp +++ b/src/Magpie.Core/ScalingRuntime.cpp @@ -32,11 +32,7 @@ void ScalingRuntime::Start(HWND hwndSrc, ScalingOptions&& options) { _EnsureDispatcherQueue(); _dqc.DispatcherQueue().TryEnqueue([this, hwndSrc, options(std::move(options))]() mutable { - if (!_scalingWindow) { - _scalingWindow = std::make_unique(); - } - - _scalingWindow->Create(GetModuleHandle(nullptr), std::move(options)); + _scalingWindow.Create(GetModuleHandle(nullptr), std::move(options)); }); } @@ -58,9 +54,7 @@ void ScalingRuntime::Stop() { _EnsureDispatcherQueue(); _dqc.DispatcherQueue().TryEnqueue([this]() { - if (_scalingWindow) { - _scalingWindow->Destroy(); - } + _scalingWindow.Destroy(); }); } @@ -84,7 +78,7 @@ void ScalingRuntime::_ScalingThreadProc() noexcept { MSG msg; while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { if (msg.message == WM_QUIT) { - _scalingWindow->Destroy(); + _scalingWindow.Destroy(); _IsRunning(false); return; } @@ -93,8 +87,8 @@ void ScalingRuntime::_ScalingThreadProc() noexcept { DispatchMessage(&msg); } - if (_scalingWindow && *_scalingWindow) { - _scalingWindow->Render(); + if (_scalingWindow) { + _scalingWindow.Render(); } else { _IsRunning(false); WaitMessage(); diff --git a/src/Magpie.Core/ScalingRuntime.h b/src/Magpie.Core/ScalingRuntime.h index caf73f587..c63739c6f 100644 --- a/src/Magpie.Core/ScalingRuntime.h +++ b/src/Magpie.Core/ScalingRuntime.h @@ -4,11 +4,11 @@ #include #include #include +#include "ScalingWindow.h" namespace Magpie::Core { struct ScalingOptions; -class ScalingWindow; class API_DECLSPEC ScalingRuntime { public: @@ -61,7 +61,7 @@ class API_DECLSPEC ScalingRuntime { winrt::Windows::System::DispatcherQueueController _dqc{ nullptr }; // 只能由 _scalingThread 访问 - std::unique_ptr _scalingWindow; + ScalingWindow _scalingWindow; }; } From d65b810d62ae97e4dae2714e18521cc27daf1dc8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=97=AD?= <34770031+Blinue@users.noreply.github.com> Date: Wed, 7 Jun 2023 21:22:15 +0800 Subject: [PATCH 009/155] =?UTF-8?q?feat:=20=E6=A3=80=E6=9F=A5=E5=89=8D?= =?UTF-8?q?=E5=8F=B0=E7=AA=97=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Magpie.Core/Renderer.cpp | 43 +++++++++--- src/Magpie.Core/Renderer.h | 10 ++- src/Magpie.Core/ScalingRuntime.cpp | 25 +++++-- src/Magpie.Core/ScalingRuntime.h | 4 +- src/Magpie.Core/ScalingWindow.cpp | 104 ++++++++++++++++++++++++++++- src/Magpie.Core/ScalingWindow.h | 12 +++- 6 files changed, 175 insertions(+), 23 deletions(-) diff --git a/src/Magpie.Core/Renderer.cpp b/src/Magpie.Core/Renderer.cpp index 527c57fd0..fa78d8ed7 100644 --- a/src/Magpie.Core/Renderer.cpp +++ b/src/Magpie.Core/Renderer.cpp @@ -2,24 +2,51 @@ #include "Renderer.h" #include "DeviceResources.h" #include "ScalingOptions.h" +#include "Logger.h" +#include "Win32Utils.h" namespace Magpie::Core { Renderer::Renderer() noexcept {} -Renderer::~Renderer() noexcept {} +Renderer::~Renderer() noexcept { + if (_backendThread.joinable()) { + DWORD backendThreadId = GetThreadId(_backendThread.native_handle()); + // 持续尝试直到 _backendThread 创建了消息队列 + while (!PostThreadMessage(backendThreadId, WM_QUIT, 0, 0)) { + Sleep(1); + } + _backendThread.join(); + } +} + +bool Renderer::Initialize(HWND /*hwndSrc*/, HWND hwndScaling, const ScalingOptions& options) noexcept { + _backendThread = std::thread(std::bind(&Renderer::_BackendThreadProc, this, hwndScaling, options)); -bool Renderer::Initialize(HWND hwndScaling, const ScalingOptions& options) noexcept { - _deviceResources = std::make_unique(); - if (!_deviceResources->Initialize(hwndScaling, options)) { - return false; - } + _frontendResources = std::make_unique(); + if (!_frontendResources->Initialize(hwndScaling, options)) { + return false; + } - return true; + return true; } void Renderer::Render() noexcept { - WaitMessage(); + +} + +void Renderer::_BackendThreadProc(HWND hwndScaling, const ScalingOptions& options) noexcept { + winrt::init_apartment(winrt::apartment_type::single_threaded); + + DeviceResources deviceResources; + if (!deviceResources.Initialize(hwndScaling, options)) { + return; + } + + MSG msg; + while (GetMessage(&msg, NULL, 0, 0)) { + DispatchMessage(&msg); + } } } diff --git a/src/Magpie.Core/Renderer.h b/src/Magpie.Core/Renderer.h index d99f652e2..afe805596 100644 --- a/src/Magpie.Core/Renderer.h +++ b/src/Magpie.Core/Renderer.h @@ -13,12 +13,18 @@ class Renderer { Renderer(const Renderer&) = delete; Renderer(Renderer&&) noexcept = default; - bool Initialize(HWND hwndScaling, const ScalingOptions& options) noexcept; + bool Initialize(HWND hwndSrc, HWND hwndScaling, const ScalingOptions& options) noexcept; void Render() noexcept; private: - std::unique_ptr _deviceResources; + int _CheckSrcState(); + + void _BackendThreadProc(HWND hwndScaling, const ScalingOptions& options) noexcept; + + std::unique_ptr _frontendResources; + + std::thread _backendThread; }; } diff --git a/src/Magpie.Core/ScalingRuntime.cpp b/src/Magpie.Core/ScalingRuntime.cpp index a9f91b55b..64cb184e2 100644 --- a/src/Magpie.Core/ScalingRuntime.cpp +++ b/src/Magpie.Core/ScalingRuntime.cpp @@ -1,9 +1,7 @@ #include "pch.h" -#include #include "ScalingRuntime.h" +#include #include "Logger.h" -#include "ScalingOptions.h" -#include "ScalingWindow.h" namespace Magpie::Core { @@ -32,7 +30,7 @@ void ScalingRuntime::Start(HWND hwndSrc, ScalingOptions&& options) { _EnsureDispatcherQueue(); _dqc.DispatcherQueue().TryEnqueue([this, hwndSrc, options(std::move(options))]() mutable { - _scalingWindow.Create(GetModuleHandle(nullptr), std::move(options)); + _scalingWindow.Create(GetModuleHandle(nullptr), hwndSrc, std::move(options)); }); } @@ -74,8 +72,8 @@ void ScalingRuntime::_ScalingThreadProc() noexcept { return; } + MSG msg; while (true) { - MSG msg; while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { if (msg.message == WM_QUIT) { _scalingWindow.Destroy(); @@ -83,7 +81,6 @@ void ScalingRuntime::_ScalingThreadProc() noexcept { return; } - TranslateMessage(&msg); DispatchMessage(&msg); } @@ -91,9 +88,23 @@ void ScalingRuntime::_ScalingThreadProc() noexcept { _scalingWindow.Render(); } else { _IsRunning(false); - WaitMessage(); } + + // 等待新消息 1ms + MsgWaitForMultipleObjectsEx(0, nullptr, 1, QS_ALLINPUT, MWMO_INPUTAVAILABLE); + } +} + +bool ScalingRuntime::_BumpMessages() noexcept { + MSG msg; + while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { + if (msg.message == WM_QUIT) { + return true; + } + + DispatchMessage(&msg); } + return false; } void ScalingRuntime::_EnsureDispatcherQueue() const noexcept { diff --git a/src/Magpie.Core/ScalingRuntime.h b/src/Magpie.Core/ScalingRuntime.h index c63739c6f..bfb0cd492 100644 --- a/src/Magpie.Core/ScalingRuntime.h +++ b/src/Magpie.Core/ScalingRuntime.h @@ -8,8 +8,6 @@ namespace Magpie::Core { -struct ScalingOptions; - class API_DECLSPEC ScalingRuntime { public: ScalingRuntime(); @@ -48,6 +46,8 @@ class API_DECLSPEC ScalingRuntime { private: void _ScalingThreadProc() noexcept; + bool _BumpMessages() noexcept; + // 确保 _dqc 完成初始化 void _EnsureDispatcherQueue() const noexcept; diff --git a/src/Magpie.Core/ScalingWindow.cpp b/src/Magpie.Core/ScalingWindow.cpp index 4b9df0415..a43336310 100644 --- a/src/Magpie.Core/ScalingWindow.cpp +++ b/src/Magpie.Core/ScalingWindow.cpp @@ -3,6 +3,8 @@ #include "CommonSharedConstants.h" #include "Logger.h" #include "Renderer.h" +#include "Win32Utils.h" +#include "WindowHelper.h" namespace Magpie::Core { @@ -10,11 +12,19 @@ ScalingWindow::ScalingWindow() noexcept {} ScalingWindow::~ScalingWindow() noexcept {} -bool ScalingWindow::Create(HINSTANCE hInstance, ScalingOptions&& options) noexcept { +bool ScalingWindow::Create(HINSTANCE hInstance, HWND hwndSrc, ScalingOptions&& options) noexcept { if (_hWnd) { return false; } + _hwndSrc = hwndSrc; + // 缩放结束后才失效 + _options = std::move(options); + + if (!GetWindowRect(hwndSrc, &_srcWndRect)) { + return false; + } + static const int _ = [](HINSTANCE hInstance) { WNDCLASSEXW wcex{}; wcex.cbSize = sizeof(wcex); @@ -50,7 +60,7 @@ bool ScalingWindow::Create(HINSTANCE hInstance, ScalingOptions&& options) noexce } _renderer = std::make_unique(); - if (!_renderer->Initialize(_hWnd, options)) { + if (!_renderer->Initialize(hwndSrc, _hWnd, _options)) { return false; } @@ -60,6 +70,14 @@ bool ScalingWindow::Create(HINSTANCE hInstance, ScalingOptions&& options) noexce } void ScalingWindow::Render() noexcept { + int srcState = _CheckSrcState(); + if (srcState != 0) { + Logger::Get().Info("源窗口状态改变,退出全屏"); + Destroy(); + //MagApp::Get().Stop(srcState == 2); + return; + } + _renderer->Render(); } @@ -68,10 +86,92 @@ LRESULT ScalingWindow::_MessageHandler(UINT msg, WPARAM wParam, LPARAM lParam) n case WM_DESTROY: { _renderer.reset(); + _options = {}; + _hwndSrc = NULL; + _srcWndRect = {}; break; } } return base_type::_MessageHandler(msg, wParam, lParam); } +// 0 -> 可继续缩放 +// 1 -> 前台窗口改变或源窗口最大化(如果不允许缩放最大化的窗口)/最小化 +// 2 -> 源窗口大小或位置改变或最大化(如果允许缩放最大化的窗口) +int ScalingWindow::_CheckSrcState() const noexcept { + if (!_options.IsDebugMode()) { + HWND hwndForeground = GetForegroundWindow(); + // 在 3D 游戏模式下打开游戏内叠加层则全屏窗口可以接收焦点 + if (!_options.Is3DGameMode() /*|| !IsUIVisiable()*/|| hwndForeground != _hWnd) { + if (hwndForeground && hwndForeground != _hwndSrc && !_CheckForeground(hwndForeground)) { + Logger::Get().Info("前台窗口已改变"); + return 1; + } + } + } + + UINT showCmd = Win32Utils::GetWindowShowCmd(_hwndSrc); + if (showCmd != SW_NORMAL && (showCmd != SW_SHOWMAXIMIZED || !_options.IsAllowScalingMaximized())) { + Logger::Get().Info("源窗口显示状态改变"); + return 1; + } + + RECT rect; + if (!GetWindowRect(_hwndSrc, &rect)) { + Logger::Get().Error("GetWindowRect 失败"); + return 1; + } + + if (_srcWndRect != rect) { + Logger::Get().Info("源窗口位置或大小改变"); + return 2; + } + + return 0; +} + +bool ScalingWindow::_CheckForeground(HWND hwndForeground) const noexcept { + std::wstring className = Win32Utils::GetWndClassName(hwndForeground); + + if (!WindowHelper::IsValidSrcWindow(hwndForeground)) { + return true; + } + + RECT rectForground{}; + + // 如果捕获模式可以捕获到弹窗,则允许小的弹窗 + /*if (MagApp::Get().GetFrameSource().IsScreenCapture() + && GetWindowStyle(hwndForeground) & (WS_POPUP | WS_CHILD) + ) { + if (!Win32Utils::GetWindowFrameRect(hwndForeground, rectForground)) { + Logger::Get().Error("GetWindowFrameRect 失败"); + return false; + } + + // 弹窗如果完全在源窗口客户区内则不退出全屏 + const RECT& srcFrameRect = MagApp::Get().GetFrameSource().GetSrcFrameRect(); + if (rectForground.left >= srcFrameRect.left + && rectForground.right <= srcFrameRect.right + && rectForground.top >= srcFrameRect.top + && rectForground.bottom <= srcFrameRect.bottom + ) { + return true; + } + }*/ + + if (rectForground == RECT{}) { + if (!Win32Utils::GetWindowFrameRect(hwndForeground, rectForground)) { + Logger::Get().Error("GetWindowFrameRect 失败"); + return false; + } + } + + RECT scalingWndRect; + GetWindowRect(_hWnd, &scalingWndRect); + IntersectRect(&rectForground, &scalingWndRect, &rectForground); + + // 允许稍微重叠,否则前台窗口最大化时会意外退出 + return rectForground.right - rectForground.left < 10 || rectForground.right - rectForground.top < 10; +} + } diff --git a/src/Magpie.Core/ScalingWindow.h b/src/Magpie.Core/ScalingWindow.h index d849fca57..507f78a95 100644 --- a/src/Magpie.Core/ScalingWindow.h +++ b/src/Magpie.Core/ScalingWindow.h @@ -1,9 +1,9 @@ #pragma once #include "WindowBase.h" +#include "ScalingOptions.h" namespace Magpie::Core { -struct ScalingOptions; class Renderer; class ScalingWindow : public WindowBase { @@ -13,7 +13,7 @@ class ScalingWindow : public WindowBase { ScalingWindow() noexcept; ~ScalingWindow() noexcept; - bool Create(HINSTANCE hInstance, ScalingOptions&& options) noexcept; + bool Create(HINSTANCE hInstance, HWND hwndSrc, ScalingOptions&& options) noexcept; void Render() noexcept; @@ -21,7 +21,15 @@ class ScalingWindow : public WindowBase { LRESULT _MessageHandler(UINT msg, WPARAM wParam, LPARAM lParam) noexcept; private: + int _CheckSrcState() const noexcept; + + bool _CheckForeground(HWND hwndForeground) const noexcept; + + ScalingOptions _options; std::unique_ptr _renderer; + + HWND _hwndSrc = NULL; + RECT _srcWndRect{}; }; } From 3e80bf56a56e7942f932461ac3a288489eeb1071 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=97=AD?= <34770031+Blinue@users.noreply.github.com> Date: Sun, 11 Jun 2023 16:57:37 +0800 Subject: [PATCH 010/155] feat: MagpieFX v4 --- docs/MagpieFX.md | 51 ++-- src/Effects/Bicubic.hlsl | 29 +- src/Magpie.App/EffectsService.cpp | 2 +- src/Magpie.Core/EffectCacheManager.cpp | 4 +- src/Magpie.Core/EffectCompiler.cpp | 380 +++++++++---------------- src/Magpie.Core/EffectCompiler.h | 3 - src/Magpie.Core/EffectDesc.h | 10 +- src/Magpie.Core/ScalingRuntime.cpp | 12 - src/Magpie.Core/ScalingRuntime.h | 2 - 9 files changed, 182 insertions(+), 311 deletions(-) diff --git a/docs/MagpieFX.md b/docs/MagpieFX.md index b447d65fa..af9911877 100644 --- a/docs/MagpieFX.md +++ b/docs/MagpieFX.md @@ -2,23 +2,14 @@ MagpieFX 基于 DirectX 11 计算着色器 ``` hlsl //!MAGPIE EFFECT -//!VERSION 3 -//!OUTPUT_WIDTH INPUT_WIDTH * 2 -//!OUTPUT_HEIGHT INPUT_HEIGHT * 2 -// 若要使用 GetFrameCount 或 GetCursorPos 需指定 USE_DYNAMIC +//!VERSION 4 +// 若要使用 GetFrameCount 需指定 USE_DYNAMIC //!USE_DYNAMIC // GENERIC_DOWNSCALER 表示此效果可以作为“默认降采样效果” //!GENERIC_DOWNSCALER // 使用 SORT_NAME 指定排序时使用的名字,否则按照文件名排序 //!SORT_NAME test1 -// 不指定 OUTPUT_WIDTH 和 OUTPUT_HEIGHT 表示此效果支持输出任意尺寸 -// 计算纹理尺寸时可以使用一些预定义常量 -// INPUT_WIDTH -// INPUT_HEIGHT -// OUTPUT_WIDTH -// OUTPUT_HEIGHT - // 参数定义 //!PARAMETER @@ -33,13 +24,25 @@ float sharpness; // 纹理定义 -// INPUT 是特殊关键字 -// INPUT 不能作为通道的输出 -// 定义 INPUT 是可选的,但为了保持语义的完整性,建议显式定义 +// INPUT、OUTPUT 是特殊关键字 +// INPUT 不能作为通道的输出,但 OUTPUT 可以作为通道的输入 +// 定义 INPUT 和 OUTPUT 是可选的,但为了保持语义的完整性,建议显式定义 +// OUTPUT 的尺寸即为此效果的输出尺寸,不指定则表示支持任意尺寸的输出 //!TEXTURE Texture2D INPUT; +//!TEXTURE +//!WIDTH INPUT_WIDTH * 2 +//!HEIGHT INPUT_HEIGHT * 2 +Texture2D OUTPUT; + +// 计算纹理尺寸时可以使用一些预定义常量 +// INPUT_WIDTH +// INPUT_HEIGHT +// OUTPUT_WIDTH +// OUTPUT_HEIGHT + // 支持的纹理格式: // R32G32B32A32_FLOAT // R16G16B16A16_FLOAT @@ -109,31 +112,25 @@ float4 Pass1(float2 pos) { return float4(1, 1, 1, 1); } -// 最后一个通道不能指定 OUT -// 如果是 CS 风格必须使用 WriteToOutput 输出结果 - //!PASS 2 //!IN INPUT, tex1 +// 最后一个通道的输出只能是 OUTPUT +//!OUT OUTPUT // BLOCK_SIZE 指定一次 dispatch 处理多大的区域 // 可以只有一维,即同时指定长和高 //!BLOCK_SIZE 16, 16 -// NUM_THREADS 指定一次 dispatch 有多少并行线程 +// NUM_THREADS 指定一次 dispatch 有多少并行线 // 可以少于三维,缺少的维数默认为 1 //!NUM_THREADS 64, 1, 1 void Pass2(uint2 blockStart, uint3 threadId) { - // 渲染光标并写入 OUPUT - // 只在最后一个通道中可用 - WriteToOutput(blockStart, float3(1,1,1)); + // 写入 OUPUT + OUTPUT[blockStart] = float4(1,1,1,1); } ``` ### 预定义函数 -**void WriteToOutput(uint2 pos, float3 color)**:只在最后一个通道(Pass)中可用,用于将结果写入到输出纹理。 - -**bool CheckViewport(uint2 pos)**:只在最后一个通道中可用,检查输出坐标是否位于视口内。 - **uint2 GetInputSize()**:获取输入纹理尺寸。 **float2 GetInputPt()**:获取输入纹理每个像素的尺寸。 @@ -146,8 +143,6 @@ void Pass2(uint2 blockStart, uint3 threadId) { **uint GetFrameCount()**:获取当前总计帧数。使用此函数时必须指定 "USE_DYNAMIC"。 -**uint2 GetCursorPos()**:获取当前光标位置。使用此函数时必须指定 "USE_DYNAMIC"。 - **uint2 Rmp8x8(uint id)**:将 0~63 的值以 swizzle 顺序映射到 8x8 的正方形内的坐标,用以提高纹理缓存的命中率。 @@ -165,8 +160,6 @@ void Pass2(uint2 blockStart, uint3 threadId) { **MP_LAST_PASS**:当前通道是否是当前效果的最后一个通道 -**MP_LAST_EFFECT**:当前效果是否是当前缩放模式的最后一个效果(最后一个效果要处理视口和光标渲染) - **MP_FP16**:当前是否使用半精度浮点数(由用户指定) **MF、MF1、MF2、...、MF4x4**:遵守 fp16 参数的浮点数类型。当未指定 fp16,它们为 float... 的别名,否则为 min16float... 的别名 diff --git a/src/Effects/Bicubic.hlsl b/src/Effects/Bicubic.hlsl index 14450415f..d87ae58a3 100644 --- a/src/Effects/Bicubic.hlsl +++ b/src/Effects/Bicubic.hlsl @@ -2,7 +2,7 @@ // 移植自 https://github.com/ActualMandM/cemu_graphic_packs/blob/468d165cf27dae13a06e8bdc3d588d0af775ad91/Filters/Bicubic/output.glsl //!MAGPIE EFFECT -//!VERSION 3 +//!VERSION 4 //!GENERIC_DOWNSCALER @@ -27,6 +27,9 @@ float paramC; //!TEXTURE Texture2D INPUT; +//!TEXTURE +Texture2D OUTPUT; + //!SAMPLER //!FILTER LINEAR SamplerState sam; @@ -35,7 +38,7 @@ SamplerState sam; //!PASS 1 //!STYLE PS //!IN INPUT - +//!OUT OUTPUT float weight(float x) { const float B = paramB; @@ -93,20 +96,20 @@ float4 Pass1(float2 pos) { int2 coord_top_left = int2(max(uv0 * inputSize, 0.5)); int2 coord_bottom_right = int2(min(uv3 * inputSize, inputSize - 0.5)); - float4 top = INPUT.Load(int3(coord_top_left, 0)) * rowtaps.x; - top += INPUT.SampleLevel(sam, float2(u_middle, uv0.y), 0) * u_weight_sum; - top += INPUT.Load(int3(coord_bottom_right.x, coord_top_left.y, 0)) * rowtaps.w; - float4 total = top * coltaps.x; + float3 top = INPUT.Load(int3(coord_top_left, 0)).rgb * rowtaps.x; + top += INPUT.SampleLevel(sam, float2(u_middle, uv0.y), 0).rgb * u_weight_sum; + top += INPUT.Load(int3(coord_bottom_right.x, coord_top_left.y, 0)).rgb * rowtaps.w; + float3 total = top * coltaps.x; - float4 middle = INPUT.SampleLevel(sam, float2(uv0.x, v_middle), 0) * rowtaps.x; - middle += INPUT.SampleLevel(sam, float2(u_middle, v_middle), 0) * u_weight_sum; - middle += INPUT.SampleLevel(sam, float2(uv3.x, v_middle), 0) * rowtaps.w; + float3 middle = INPUT.SampleLevel(sam, float2(uv0.x, v_middle), 0).rgb * rowtaps.x; + middle += INPUT.SampleLevel(sam, float2(u_middle, v_middle), 0).rgb * u_weight_sum; + middle += INPUT.SampleLevel(sam, float2(uv3.x, v_middle), 0).rgb * rowtaps.w; total += middle * v_weight_sum; - float4 bottom = INPUT.Load(int3(coord_top_left.x, coord_bottom_right.y, 0)) * rowtaps.x; - bottom += INPUT.SampleLevel(sam, float2(u_middle, uv3.y), 0) * u_weight_sum; - bottom += INPUT.Load(int3(coord_bottom_right, 0)) * rowtaps.w; + float3 bottom = INPUT.Load(int3(coord_top_left.x, coord_bottom_right.y, 0)).rgb * rowtaps.x; + bottom += INPUT.SampleLevel(sam, float2(u_middle, uv3.y), 0).rgb * u_weight_sum; + bottom += INPUT.Load(int3(coord_bottom_right, 0)).rgb * rowtaps.w; total += bottom * coltaps.w; - return total; + return float4(total, 1); } diff --git a/src/Magpie.App/EffectsService.cpp b/src/Magpie.App/EffectsService.cpp index 76cfa1680..e389697ac 100644 --- a/src/Magpie.App/EffectsService.cpp +++ b/src/Magpie.App/EffectsService.cpp @@ -89,7 +89,7 @@ fire_and_forget EffectsService::StartInitialize() { } effect.params = std::move(effectDesc.params); - if (effectDesc.outSizeExpr.first.empty()) { + if (effectDesc.GetOutputSizeExpr().first.empty()) { effect.flags |= EffectInfoFlags::CanScale; } if (effectDesc.flags & EffectFlags::GenericDownscaler) { diff --git a/src/Magpie.Core/EffectCacheManager.cpp b/src/Magpie.Core/EffectCacheManager.cpp index 79d35a821..1c1fec04d 100644 --- a/src/Magpie.Core/EffectCacheManager.cpp +++ b/src/Magpie.Core/EffectCacheManager.cpp @@ -70,14 +70,14 @@ void serialize(Archive& ar, EffectPassDesc& o) { template void serialize(Archive& ar, EffectDesc& o) { - ar& o.name& o.outSizeExpr& o.params& o.textures& o.samplers& o.passes& o.flags; + ar& o.name& o.params& o.textures& o.samplers& o.passes& o.flags; } static constexpr const uint32_t MAX_CACHE_COUNT = 127; // 缓存版本 // 当缓存文件结构有更改时更新它,使旧缓存失效 -static constexpr const uint32_t EFFECT_CACHE_VERSION = 12; +static constexpr const uint32_t EFFECT_CACHE_VERSION = 13; static std::wstring GetLinearEffectName(std::wstring_view effectName) { diff --git a/src/Magpie.Core/EffectCompiler.cpp b/src/Magpie.Core/EffectCompiler.cpp index a4afe34e3..9d0ec0d51 100644 --- a/src/Magpie.Core/EffectCompiler.cpp +++ b/src/Magpie.Core/EffectCompiler.cpp @@ -15,8 +15,10 @@ namespace Magpie::Core { -static const char* META_INDICATOR = "//!"; +// 当前 MagpieFX 版本 +static constexpr uint32_t MAGPIE_FX_VERSION = 4; +static const char* META_INDICATOR = "//!"; class PassInclude : public ID3DInclude { public: @@ -57,7 +59,7 @@ class PassInclude : public ID3DInclude { std::wstring _localDir; }; -static UINT RemoveComments(std::string& source) { +static uint32_t RemoveComments(std::string& source) { // 确保以换行符结尾 if (source.back() != '\n') { source.push_back('\n'); @@ -149,7 +151,7 @@ static bool CheckNextToken(std::string_view& source, std::string_view token) { } template -static UINT GetNextToken(std::string_view& source, std::string_view& value) { +static uint32_t GetNextToken(std::string_view& source, std::string_view& value) { RemoveLeadingBlanks(source); if (source.empty()) { @@ -204,7 +206,7 @@ static bool CheckMagic(std::string_view& source) { return true; } -static UINT GetNextString(std::string_view& source, std::string_view& value) { +static uint32_t GetNextString(std::string_view& source, std::string_view& value) { RemoveLeadingBlanks(source); size_t pos = source.find('\n'); @@ -219,7 +221,7 @@ static UINT GetNextString(std::string_view& source, std::string_view& value) { } template -static UINT GetNextNumber(std::string_view& source, T& value) { +static uint32_t GetNextNumber(std::string_view& source, T& value) { RemoveLeadingBlanks(source); if (source.empty()) { @@ -236,7 +238,7 @@ static UINT GetNextNumber(std::string_view& source, T& value) { return 0; } -static UINT GetNextExpr(std::string_view& source, std::string& expr) { +static uint32_t GetNextExpr(std::string_view& source, std::string& expr) { RemoveLeadingBlanks(source); size_t size = std::min(source.find('\n') + 1, source.size()); @@ -260,11 +262,11 @@ static UINT GetNextExpr(std::string_view& source, std::string& expr) { return 0; } -static UINT ResolveHeader(std::string_view block, EffectDesc& desc, bool noCompile) { +static uint32_t ResolveHeader(std::string_view block, EffectDesc& desc, bool noCompile) { // 必需的选项:VERSION - // 可选的选项:OUTPUT_WIDTH, OUTPUT_HEIGHT, USE_DYNAMIC, GENERIC_DOWNSCALER, BUILT_INT + // 可选的选项:USE_DYNAMIC, GENERIC_DOWNSCALER, SORT_NAME - std::bitset<6> processed; + std::bitset<4> processed; std::string_view token; @@ -284,52 +286,34 @@ static UINT ResolveHeader(std::string_view block, EffectDesc& desc, bool noCompi } processed[0] = true; - UINT version; + uint32_t version; if (GetNextNumber(block, version)) { return 1; } - if (version != EffectCompiler::VERSION) { + if (version != MAGPIE_FX_VERSION) { return 1; } if (GetNextToken(block, token) != 2) { return 1; } - } else if (t == "OUTPUT_WIDTH") { + } else if (t == "USE_DYNAMIC") { if (processed[1]) { return 1; } processed[1] = true; - if (GetNextExpr(block, desc.outSizeExpr.first)) { - return 1; - } - } else if (t == "OUTPUT_HEIGHT") { - if (processed[2]) { - return 1; - } - processed[2] = true; - - if (GetNextExpr(block, desc.outSizeExpr.second)) { - return 1; - } - } else if (t == "USE_DYNAMIC") { - if (processed[3]) { - return 1; - } - processed[3] = true; - if (GetNextToken(block, token) != 2) { return 1; } desc.flags |= EffectFlags::UseDynamic; } else if (t == "GENERIC_DOWNSCALER") { - if (processed[4]) { + if (processed[2]) { return 1; } - processed[4] = true; + processed[2] = true; if (GetNextToken(block, token) != 2) { return 1; @@ -337,10 +321,10 @@ static UINT ResolveHeader(std::string_view block, EffectDesc& desc, bool noCompi desc.flags |= EffectFlags::GenericDownscaler; } else if (t == "SORT_NAME") { - if (processed[5]) { + if (processed[3]) { return 1; } - processed[5] = true; + processed[3] = true; std::string_view sortName; if (GetNextString(block, sortName)) { @@ -360,19 +344,14 @@ static UINT ResolveHeader(std::string_view block, EffectDesc& desc, bool noCompi return 1; } - if (!processed[0] || processed[1] != processed[2]) { - return 1; - } - - // GENERIC_DOWNSCALER 和 OUTPUT_WIDTH/OUTPUT_HEIGHT 冲突 - if (processed[4] && processed[1]) { + if (!processed[0]) { return 1; } return 0; } -static UINT ResolveParameter(std::string_view block, EffectDesc& desc) { +static uint32_t ResolveParameter(std::string_view block, EffectDesc& desc) { // 必需的选项:DEFAULT, MIN, MAX, STEP // 可选的选项:LABEL @@ -530,8 +509,9 @@ static UINT ResolveParameter(std::string_view block, EffectDesc& desc) { } -static UINT ResolveTexture(std::string_view block, EffectDesc& desc) { +static uint32_t ResolveTexture(std::string_view block, EffectDesc& desc) { // 如果名称为 INPUT 不能有任何选项,含 SOURCE 时不能有任何其他选项 + // 如果名称为 OUTPUT 只能有 WIDTH 或 HEIGHT // 否则必需的选项:FORMAT // 可选的选项:WIDTH, HEIGHT @@ -642,12 +622,25 @@ static UINT ResolveTexture(std::string_view block, EffectDesc& desc) { } if (token == "INPUT") { - if (processed[1] || processed[2]) { + if (processed.any()) { return 1; } // INPUT 已为第一个元素 desc.textures.pop_back(); + } else if (token == "OUTPUT") { + if (processed[0] || processed[1]) { + return 1; + } + + // GENERIC_DOWNSCALER 和指定尺寸冲突 + if (desc.flags & EffectFlags::GenericDownscaler && processed[2]) { + return 1; + } + + // OUTPUT 已为第二个元素 + desc.textures[1].sizeExpr = std::move(texDesc.sizeExpr); + desc.textures.pop_back(); } else { texDesc.name = token; } @@ -663,7 +656,7 @@ static UINT ResolveTexture(std::string_view block, EffectDesc& desc) { return 0; } -static UINT ResolveSampler(std::string_view block, EffectDesc& desc) { +static uint32_t ResolveSampler(std::string_view block, EffectDesc& desc) { // 必选项:FILTER // 可选项:ADDRESS @@ -764,7 +757,7 @@ static UINT ResolveSampler(std::string_view block, EffectDesc& desc) { return 0; } -static UINT ResolveCommon(std::string_view& block) { +static uint32_t ResolveCommon(std::string_view& block) { // 无选项 if (!CheckNextToken(block, META_INDICATOR)) { @@ -782,7 +775,7 @@ static UINT ResolveCommon(std::string_view& block) { return 0; } -static UINT ResolvePasses( +static uint32_t ResolvePasses( SmallVector& blocks, EffectDesc& desc ) { @@ -795,10 +788,10 @@ static UINT ResolvePasses( // 首先解析通道序号 // first 为 Pass 序号,second 为在 blocks 中的位置 - SmallVector> passNumbers; + SmallVector> passNumbers; passNumbers.reserve(blocks.size()); - for (UINT i = 0; i < blocks.size(); ++i) { + for (uint32_t i = 0; i < blocks.size(); ++i) { std::string_view& block = blocks[i]; if (!CheckNextToken(block, META_INDICATOR)) { @@ -809,7 +802,7 @@ static UINT ResolvePasses( return 1; } - UINT index; + uint32_t index; if (GetNextNumber(block, index)) { return 1; } @@ -820,32 +813,35 @@ static UINT ResolvePasses( passNumbers.emplace_back(index, i); } + // 以通道序号排序 std::sort( passNumbers.begin(), passNumbers.end(), - [](const std::pair& l, const std::pair& r) {return l.first < r.first; } + [](const auto& l, const auto& r) {return l.first < r.first; } ); - SmallVector temp = blocks; - for (UINT i = 0; i < blocks.size(); ++i) { - if (passNumbers[i].first != i + 1) { - // PASS 序号不连续 - return 1; - } + { + SmallVector temp = blocks; + for (uint32_t i = 0; i < blocks.size(); ++i) { + if (passNumbers[i].first != i + 1) { + // PASS 序号不连续 + return 1; + } - blocks[i] = temp[passNumbers[i].second]; + blocks[i] = temp[passNumbers[i].second]; + } } desc.passes.resize(blocks.size()); - for (UINT i = 0; i < blocks.size(); ++i) { + for (uint32_t i = 0; i < blocks.size(); ++i) { std::string_view& block = blocks[i]; auto& passDesc = desc.passes[i]; // 用于检查输入和输出中重复的纹理 - phmap::flat_hash_map texNames; + phmap::flat_hash_map texNames; texNames.reserve(desc.textures.size()); - for (UINT j = 0; j < desc.textures.size(); ++j) { + for (uint32_t j = 0; j < desc.textures.size(); ++j) { texNames.emplace(desc.textures[j].name, j); } @@ -868,12 +864,12 @@ static UINT ResolvePasses( } processed[0] = true; - std::string_view binds; - if (GetNextString(block, binds)) { + std::string_view inputsStr; + if (GetNextString(block, inputsStr)) { return 1; } - for (std::string_view& input : StrUtils::Split(binds, ',')) { + for (std::string_view& input : StrUtils::Split(inputsStr, ',')) { StrUtils::Trim(input); auto it = texNames.find(input); @@ -891,33 +887,42 @@ static UINT ResolvePasses( } processed[1] = true; - std::string_view saves; - if (GetNextString(block, saves)) { - return 1; - } - - SmallVector outputs = StrUtils::Split(saves, ','); - if (outputs.size() > 8) { - // 最多 8 个输出 + std::string_view outputsStr; + if (GetNextString(block, outputsStr)) { return 1; } - for (std::string_view& output : outputs) { - StrUtils::Trim(output); - - auto it = texNames.find(output); - if (it == texNames.end()) { - // 未找到纹理名称 + if (i == blocks.size() - 1) { + // 最后一个通道的输出只能是 OUTPUT + if (outputsStr != "OUTPUT") { return 1; } - if (it->second == 0 || !desc.textures[it->second].source.empty()) { - // INPUT 和从文件读取的纹理不能作为输出 + passDesc.outputs.push_back(1); + } else { + SmallVector outputs = StrUtils::Split(outputsStr, ','); + if (outputs.size() > 8) { + // 最多 8 个输出 return 1; } - passDesc.outputs.push_back(it->second); - texNames.erase(it); + for (std::string_view& output : outputs) { + StrUtils::Trim(output); + + auto it = texNames.find(output); + if (it == texNames.end()) { + // 未找到纹理名称 + return 1; + } + + if (it->second == 0 || !desc.textures[it->second].source.empty()) { + // INPUT 和从文件读取的纹理不能作为输出 + return 1; + } + + passDesc.outputs.push_back(it->second); + texNames.erase(it); + } } } else if (t == "BLOCK_SIZE") { if (processed[2]) { @@ -935,7 +940,7 @@ static UINT ResolvePasses( return 1; } - UINT num; + uint32_t num; if (GetNextNumber(split[0], num) || num == 0) { return 1; } @@ -974,8 +979,8 @@ static UINT ResolvePasses( return 1; } - for (UINT j = 0; j < 3; ++j) { - UINT num = 1; + for (uint32_t j = 0; j < 3; ++j) { + uint32_t num = 1; if (split.size() > j) { if (GetNextNumber(split[j], num)) { return 1; @@ -1043,10 +1048,9 @@ static UINT ResolvePasses( return 0; } - -static UINT GeneratePassSource( +static uint32_t GeneratePassSource( const EffectDesc& desc, - UINT passIdx, + uint32_t passIdx, std::string_view cbHlsl, const SmallVector& commonBlocks, std::string_view passBlock, @@ -1054,8 +1058,6 @@ static UINT GeneratePassSource( std::string& result, std::vector>& macros ) { - bool isLastEffect = desc.flags & EffectFlags::LastEffect; - bool isLastPass = passIdx == desc.passes.size(); bool isInlineParams = desc.flags & EffectFlags::InlineParams; const EffectPassDesc& passDesc = desc.passes[(size_t)passIdx - 1]; @@ -1082,31 +1084,16 @@ static UINT GeneratePassSource( // SRV for (int i = 0; i < passDesc.inputs.size(); ++i) { auto& texDesc = desc.textures[passDesc.inputs[i]]; - result.append(fmt::format("Texture2D<{}> {} : register(t{});\n", EffectHelper::FORMAT_DESCS[(UINT)texDesc.format].srvTexelType, texDesc.name, i)); - } - - if (isLastEffect && isLastPass) { - result.append(fmt::format("Texture2D __CURSOR : register(t{});\n", passDesc.inputs.size())); + result.append(fmt::format("Texture2D<{}> {} : register(t{});\n", EffectHelper::FORMAT_DESCS[(uint32_t)texDesc.format].srvTexelType, texDesc.name, i)); } // UAV - if (passDesc.outputs.empty()) { - if (!isLastPass) { - return 1; - } - - result.append("RWTexture2D __OUTPUT : register(u0);\n"); - } else { - if (isLastPass) { - return 1; - } - - for (int i = 0; i < passDesc.outputs.size(); ++i) { - auto& texDesc = desc.textures[passDesc.outputs[i]]; - result.append(fmt::format("RWTexture2D<{}> {} : register(u{});\n", EffectHelper::FORMAT_DESCS[(UINT)texDesc.format].uavTexelType, texDesc.name, i)); - } + for (int i = 0; i < passDesc.outputs.size(); ++i) { + auto& texDesc = desc.textures[passDesc.outputs[i]]; + result.append(fmt::format("RWTexture2D<{}> {} : register(u{});\n", EffectHelper::FORMAT_DESCS[(uint32_t)texDesc.format].uavTexelType, texDesc.name, i)); } + if (!desc.samplers.empty()) { // 采样器 for (int i = 0; i < desc.samplers.size(); ++i) { @@ -1114,11 +1101,6 @@ static UINT GeneratePassSource( } } - if (isLastEffect) { - // 绘制光标使用的采样器 - result.append(fmt::format("SamplerState __CURSOR_SAMPLER : register(s{});\n", desc.samplers.size())); - } - result.push_back('\n'); //////////////////////////////////////////////////////////////////////////////////////////////////////// @@ -1141,14 +1123,6 @@ static UINT GeneratePassSource( macros.emplace_back("MP_INLINE_PARAMS", ""); } - if (isLastPass) { - macros.emplace_back("MP_LAST_PASS", ""); - } - - if (isLastEffect) { - macros.emplace_back("MP_LAST_EFFECT", ""); - } - #ifdef _DEBUG macros.emplace_back("MP_DEBUG", ""); #endif @@ -1159,20 +1133,20 @@ static UINT GeneratePassSource( macros.emplace_back("MP_FP16", ""); macros.emplace_back("MF", "min16float"); - for (UINT i = 0; i < 4; ++i) { + for (uint32_t i = 0; i < 4; ++i) { macros.emplace_back(StrUtils::Concat("MF", numbers[i]), StrUtils::Concat("min16float", numbers[i])); - for (UINT j = 0; j < 4; ++j) { + for (uint32_t j = 0; j < 4; ++j) { macros.emplace_back(StrUtils::Concat("MF", numbers[i], "x", numbers[j]), StrUtils::Concat("min16float", numbers[i], "x", numbers[j])); } } } else { macros.emplace_back("MF", "float"); - for (UINT i = 0; i < 4; ++i) { + for (uint32_t i = 0; i < 4; ++i) { macros.emplace_back(StrUtils::Concat("MF", numbers[i]), StrUtils::Concat("float", numbers[i])); - for (UINT j = 0; j < 4; ++j) { + for (uint32_t j = 0; j < 4; ++j) { macros.emplace_back(StrUtils::Concat("MF", numbers[i], "x", numbers[j]), StrUtils::Concat("float", numbers[i], "x", numbers[j])); } } @@ -1218,46 +1192,6 @@ static UINT GeneratePassSource( // 内置函数 // //////////////////////////////////////////////////////////////////////////////////////////////////////// - if (isLastPass) { - result.append("bool CheckViewport(int2 pos) { return pos.x < __viewport.x && pos.y < __viewport.y; }\n"); - - if (isLastEffect) { - // 255.001953 的由来见 https://stackoverflow.com/questions/52103720/why-does-d3dcolortoubyte4-multiplies-components-by-255-001953f - result.append(R"(void WriteToOutput(uint2 pos, float3 color) { - color = saturate(color); - pos += __offset.zw; - if ((int)pos.x >= __cursorRect.x && (int)pos.y >= __cursorRect.y && (int)pos.x < __cursorRect.z && (int)pos.y < __cursorRect.w) { - float4 mask = __CURSOR.SampleLevel(__CURSOR_SAMPLER, (pos - __cursorRect.xy + 0.5f) * __cursorPt, 0); - if (__cursorType == 0){ - color = color * mask.a + mask.rgb; - } else if (__cursorType == 1) { - if (mask.a < 0.5f){ - color = mask.rgb; - } else { - color = (uint3(round(color * 255.0f)) ^ uint3(mask.rgb * 255.001953f)) / 255.0f; - } - } else { - if( mask.x > 0.5f) { - if (mask.y > 0.5f) { - color = 1 - color; - } - } else { - if (mask.y > 0.5f) { - color = float3(1, 1, 1); - } else { - color = float3(0, 0, 0); - } - } - } - } - __OUTPUT[pos] = float4(color, 1); -} -)"); - } else { - result.append("#define WriteToOutput(pos,color) __OUTPUT[pos] = float4(color, 1)\n"); - } - } - result.append(R"(uint __Bfe(uint src, uint off, uint bits) { uint mask = (1u << bits) - 1; return (src >> off) & mask; } uint __BfiM(uint src, uint ins, uint bits) { uint mask = (1u << bits) - 1; return (ins & mask) | (src & (~mask)); } uint2 Rmp8x8(uint a) { return uint2(__Bfe(a, 1u, 3u), __BfiM(__Bfe(a, 3u, 3u), a, 1u)); } @@ -1270,7 +1204,6 @@ float2 GetScale() { return __scale; } if (desc.flags & EffectFlags::UseDynamic) { result.append(R"(uint GetFrameCount() { return __frameCount; } -uint2 GetCursorPos() { return __cursorPos; } )"); } else { @@ -1297,40 +1230,7 @@ uint2 GetCursorPos() { return __cursorPos; } //////////////////////////////////////////////////////////////////////////////////////////////////////// if (passDesc.isPSStyle) { if (passDesc.outputs.size() <= 1) { - if (isLastPass) { - result.append(fmt::format(R"([numthreads(64, 1, 1)] -void __M(uint3 tid : SV_GroupThreadID, uint3 gid : SV_GroupID) {{ - uint2 gxy = Rmp8x8(tid.x) + (gid.xy << 4u){0}; - float2 pos = (gxy + 0.5f) * __outputPt; - float2 step = 8 * __outputPt; - - if (!CheckViewport(gxy)) {{ - return; - }}; - - WriteToOutput(gxy, Pass{1}(pos).rgb); - - gxy.x += 8u; - pos.x += step.x; - if (CheckViewport(gxy)) {{ - WriteToOutput(gxy, Pass{1}(pos).rgb); - }}; - - gxy.y += 8u; - pos.y += step.y; - if (CheckViewport(gxy)) {{ - WriteToOutput(gxy, Pass{1}(pos).rgb); - }}; - - gxy.x -= 8u; - pos.x -= step.x; - if (CheckViewport(gxy)) {{ - WriteToOutput(gxy, Pass{1}(pos).rgb); - }}; -}} -)", isLastEffect ? " + __offset.xy" : "", passIdx)); - } else { - result.append(fmt::format(R"([numthreads(64, 1, 1)] + result.append(fmt::format(R"([numthreads(64, 1, 1)] void __M(uint3 tid : SV_GroupThreadID, uint3 gid : SV_GroupID) {{ uint2 gxy = Rmp8x8(tid.x) + (gid.xy << 4u); if (gxy.x >= __pass{0}OutputSize.x || gxy.y >= __pass{0}OutputSize.y) {{ @@ -1360,13 +1260,8 @@ void __M(uint3 tid : SV_GroupThreadID, uint3 gid : SV_GroupID) {{ }} }} )", passIdx, desc.textures[passDesc.outputs[0]].name)); - } } else { // 多渲染目标 - if (isLastPass) { - return 1; - } - result.append(fmt::format(R"([numthreads(64, 1, 1)] void __M(uint3 tid : SV_GroupThreadID, uint3 gid : SV_GroupID) {{ uint2 gxy = Rmp8x8(tid.x) + (gid.xy << 4u); @@ -1379,7 +1274,7 @@ void __M(uint3 tid : SV_GroupThreadID, uint3 gid : SV_GroupID) {{ for (int i = 0; i < passDesc.outputs.size(); ++i) { auto& texDesc = desc.textures[passDesc.outputs[i]]; result.append(fmt::format("\t{} c{};\n", - EffectHelper::FORMAT_DESCS[(UINT)texDesc.format].srvTexelType, i)); + EffectHelper::FORMAT_DESCS[(uint32_t)texDesc.format].srvTexelType, i)); } std::string callPass = fmt::format("\tPass{}(pos, ", passIdx); @@ -1417,7 +1312,7 @@ void __M(uint3 tid : SV_GroupThreadID, uint3 gid : SV_GroupID) {{ // 大部分情况下 BLOCK_SIZE 都是 2 的整数次幂,这时将乘法转换为位移 std::string blockStartExpr; if (passDesc.blockSize.first == passDesc.blockSize.second && std::has_single_bit(passDesc.blockSize.first)) { - UINT nShift = std::lroundf(std::log2f((float)passDesc.blockSize.first)); + uint32_t nShift = std::lroundf(std::log2f((float)passDesc.blockSize.first)); blockStartExpr = fmt::format("(gid.xy << {})", nShift); } else { blockStartExpr = fmt::format("gid.xy * uint2({}, {})", passDesc.blockSize.first, passDesc.blockSize.second); @@ -1425,15 +1320,15 @@ void __M(uint3 tid : SV_GroupThreadID, uint3 gid : SV_GroupID) {{ result.append(fmt::format(R"([numthreads({}, {}, {})] void __M(uint3 tid : SV_GroupThreadID, uint3 gid : SV_GroupID) {{ - Pass{}({}{}, tid); + Pass{}({}, tid); }} -)", passDesc.numThreads[0], passDesc.numThreads[1], passDesc.numThreads[2], passIdx, blockStartExpr, isLastEffect && isLastPass ? " + __offset.xy" : "")); +)", passDesc.numThreads[0], passDesc.numThreads[1], passDesc.numThreads[2], passIdx, blockStartExpr)); } return 0; } -static UINT CompilePasses( +static uint32_t CompilePasses( EffectDesc& desc, uint32_t flags, const SmallVector& commonBlocks, @@ -1447,29 +1342,16 @@ static UINT CompilePasses( //////////////////////////////////////////////////////////////////////////////////////////////////////// std::string cbHlsl = R"(cbuffer __CB1 : register(b0) { - int4 __cursorRect; - float2 __cursorPt; - uint2 __cursorPos; - uint __cursorType; - uint __frameCount; -}; -cbuffer __CB2 : register(b1) { uint2 __inputSize; uint2 __outputSize; float2 __inputPt; float2 __outputPt; float2 __scale; - int2 __viewport; )"; - if (desc.flags & EffectFlags::LastEffect) { - // 指定输出到屏幕的位置 - cbHlsl.append("\tint4 __offset;\n"); - } - // PS 样式需要获知输出纹理的尺寸 // 最后一个通道不需要 - for (UINT i = 0, end = (UINT)desc.passes.size() - 1; i < end; ++i) { + for (uint32_t i = 0, end = (uint32_t)desc.passes.size() - 1; i < end; ++i) { if (desc.passes[i].isPSStyle) { cbHlsl.append(fmt::format("\tuint2 __pass{0}OutputSize;\n\tfloat2 __pass{0}OutputPt;\n", i + 1)); } @@ -1484,7 +1366,11 @@ cbuffer __CB2 : register(b1) { } } - cbHlsl.append("};\n\n"); + cbHlsl.append("};\n"); + + if (desc.flags & EffectFlags::UseDynamic) { + cbHlsl.append("cbuffer __CB2 : register(b1) { uint __frameCount; };\n\n"); + } if ((flags & EffectCompilerFlags::SaveSources) && !Win32Utils::DirExists(CommonSharedConstants::SOURCES_DIR)) { if (!CreateDirectory(CommonSharedConstants::SOURCES_DIR, nullptr)) { @@ -1498,7 +1384,7 @@ cbuffer __CB2 : register(b1) { : L"effects\\" + StrUtils::UTF8ToUTF16(std::string_view(desc.name.c_str(), delimPos + 1))); // 并行生成代码和编译 - Win32Utils::RunParallel([&](UINT id) { + Win32Utils::RunParallel([&](uint32_t id) { std::string source; std::vector> macros; if (GeneratePassSource(desc, id + 1, cbHlsl, commonBlocks, passBlocks[id], inlineParams, source, macros)) { @@ -1521,7 +1407,7 @@ cbuffer __CB2 : register(b1) { ) { Logger::Get().Error(fmt::format("编译 Pass{} 失败", id + 1)); } - }, (UINT)passBlocks.size()); + }, (uint32_t)passBlocks.size()); // 检查编译结果 for (const EffectPassDesc& d : desc.passes) { @@ -1687,24 +1573,30 @@ uint32_t EffectCompiler::Compile( } } - if (!noCompile) { - desc.textures.clear(); - // 纹理第一个元素为 INPUT - { - auto& texDesc = desc.textures.emplace_back(); - texDesc.name = "INPUT"; - texDesc.format = EffectIntermediateTextureFormat::R8G8B8A8_UNORM; - texDesc.sizeExpr.first = "INPUT_WIDTH"; - texDesc.sizeExpr.second = "INPUT_HEIGHT"; - } - - for (size_t i = 0; i < textureBlocks.size(); ++i) { - if (ResolveTexture(textureBlocks[i], desc)) { - Logger::Get().Error(fmt::format("解析 Texture#{} 块失败", i + 1)); - return 1; - } + desc.textures.clear(); + // 第一个元素为 INPUT + { + auto& inputDesc = desc.textures.emplace_back(); + inputDesc.name = "INPUT"; + inputDesc.format = EffectIntermediateTextureFormat::R8G8B8A8_UNORM; + inputDesc.sizeExpr.first = "INPUT_WIDTH"; + inputDesc.sizeExpr.second = "INPUT_HEIGHT"; + } + // 第二个元素为 OUTPUT + { + auto& outputDesc = desc.textures.emplace_back(); + outputDesc.name = "OUTPUT"; + outputDesc.format = EffectIntermediateTextureFormat::R8G8B8A8_UNORM; + } + + for (size_t i = 0; i < textureBlocks.size(); ++i) { + if (ResolveTexture(textureBlocks[i], desc)) { + Logger::Get().Error(fmt::format("解析 Texture#{} 块失败", i + 1)); + return 1; } + } + if (!noCompile) { desc.samplers.clear(); for (size_t i = 0; i < samplerBlocks.size(); ++i) { if (ResolveSampler(samplerBlocks[i], desc)) { diff --git a/src/Magpie.Core/EffectCompiler.h b/src/Magpie.Core/EffectCompiler.h index c4640ab07..9cd8035e1 100644 --- a/src/Magpie.Core/EffectCompiler.h +++ b/src/Magpie.Core/EffectCompiler.h @@ -21,9 +21,6 @@ struct API_DECLSPEC EffectCompiler { uint32_t flags, // EffectCompilerFlags const phmap::flat_hash_map* inlineParams = nullptr ); - - // 当前 MagpieFX 版本 - static constexpr UINT VERSION = 3; }; } diff --git a/src/Magpie.Core/EffectDesc.h b/src/Magpie.Core/EffectDesc.h index a084f7320..ab1d8bd11 100644 --- a/src/Magpie.Core/EffectDesc.h +++ b/src/Magpie.Core/EffectDesc.h @@ -80,9 +80,8 @@ struct EffectPassDesc { struct EffectFlags { // 输入 - static constexpr const uint32_t LastEffect = 0x1; - static constexpr const uint32_t InlineParams = 0x2; - static constexpr const uint32_t FP16 = 0x4; + static constexpr const uint32_t InlineParams = 0x1; + static constexpr const uint32_t FP16 = 0x2; // 输出 // 此效果需要帧数和鼠标位置 static constexpr const uint32_t UseDynamic = 0x10; @@ -94,8 +93,9 @@ struct EffectDesc { std::string name; std::string sortName; // 仅供 UI 使用 - // 用于计算效果的输出,空值表示支持任意大小的输出 - std::pair outSizeExpr; + const std::pair& GetOutputSizeExpr() const noexcept { + return textures[1].sizeExpr; + } std::vector params; std::vector textures; diff --git a/src/Magpie.Core/ScalingRuntime.cpp b/src/Magpie.Core/ScalingRuntime.cpp index 64cb184e2..cef8d09cd 100644 --- a/src/Magpie.Core/ScalingRuntime.cpp +++ b/src/Magpie.Core/ScalingRuntime.cpp @@ -95,18 +95,6 @@ void ScalingRuntime::_ScalingThreadProc() noexcept { } } -bool ScalingRuntime::_BumpMessages() noexcept { - MSG msg; - while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { - if (msg.message == WM_QUIT) { - return true; - } - - DispatchMessage(&msg); - } - return false; -} - void ScalingRuntime::_EnsureDispatcherQueue() const noexcept { while (!_dqc) { Sleep(0); diff --git a/src/Magpie.Core/ScalingRuntime.h b/src/Magpie.Core/ScalingRuntime.h index bfb0cd492..863ff214d 100644 --- a/src/Magpie.Core/ScalingRuntime.h +++ b/src/Magpie.Core/ScalingRuntime.h @@ -46,8 +46,6 @@ class API_DECLSPEC ScalingRuntime { private: void _ScalingThreadProc() noexcept; - bool _BumpMessages() noexcept; - // 确保 _dqc 完成初始化 void _EnsureDispatcherQueue() const noexcept; From 68b9656192e7425b517799b8ca64fffbf739992d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=97=AD?= <34770031+Blinue@users.noreply.github.com> Date: Sun, 11 Jun 2023 18:10:30 +0800 Subject: [PATCH 011/155] =?UTF-8?q?feat:=20=E7=BC=96=E8=AF=91=E6=95=88?= =?UTF-8?q?=E6=9E=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Magpie.App/ScalingService.cpp | 2 +- src/Magpie.Core/EffectCompiler.cpp | 33 ++++-- src/Magpie.Core/EffectDesc.h | 3 + src/Magpie.Core/EffectDrawer.cpp | 17 +++ src/Magpie.Core/EffectDrawer.h | 34 ++++++ src/Magpie.Core/Magpie.Core.vcxproj | 2 + src/Magpie.Core/Renderer.cpp | 175 ++++++++++++++++++++++++++++ src/Magpie.Core/Renderer.h | 2 - src/Magpie.Core/ScalingWindow.cpp | 3 +- 9 files changed, 256 insertions(+), 15 deletions(-) create mode 100644 src/Magpie.Core/EffectDrawer.cpp create mode 100644 src/Magpie.Core/EffectDrawer.h diff --git a/src/Magpie.App/ScalingService.cpp b/src/Magpie.App/ScalingService.cpp index 81286e863..68fb4cc47 100644 --- a/src/Magpie.App/ScalingService.cpp +++ b/src/Magpie.App/ScalingService.cpp @@ -84,7 +84,7 @@ void ScalingService::ClearWndToRestore() { } bool ScalingService::IsRunning() const noexcept { - return _scalingRuntime->IsRunning(); + return _scalingRuntime && _scalingRuntime->IsRunning(); } void ScalingService::CheckForeground() { diff --git a/src/Magpie.Core/EffectCompiler.cpp b/src/Magpie.Core/EffectCompiler.cpp index 9d0ec0d51..487774834 100644 --- a/src/Magpie.Core/EffectCompiler.cpp +++ b/src/Magpie.Core/EffectCompiler.cpp @@ -1230,36 +1230,47 @@ float2 GetScale() { return __scale; } //////////////////////////////////////////////////////////////////////////////////////////////////////// if (passDesc.isPSStyle) { if (passDesc.outputs.size() <= 1) { + std::string outputSize; + std::string outputPt; + if (passIdx == desc.passes.size()) { + // 最后一个通道 + outputSize = "__outputSize"; + outputPt = "__outputPt"; + } else { + outputSize = fmt::format("__pass{}OutputSize", passIdx); + outputPt = fmt::format("__pass{}OutputPt", passIdx); + } + result.append(fmt::format(R"([numthreads(64, 1, 1)] void __M(uint3 tid : SV_GroupThreadID, uint3 gid : SV_GroupID) {{ uint2 gxy = Rmp8x8(tid.x) + (gid.xy << 4u); - if (gxy.x >= __pass{0}OutputSize.x || gxy.y >= __pass{0}OutputSize.y) {{ + if (gxy.x >= {1}.x || gxy.y >= {1}.y) {{ return; }} - float2 pos = (gxy + 0.5f) * __pass{0}OutputPt; - float2 step = 8 * __pass{0}OutputPt; + float2 pos = (gxy + 0.5f) * {2}; + float2 step = 8 * {2}; - {1}[gxy] = Pass{0}(pos); + {3}[gxy] = Pass{0}(pos); gxy.x += 8u; pos.x += step.x; - if (gxy.x < __pass{0}OutputSize.x && gxy.y < __pass{0}OutputSize.y) {{ - {1}[gxy] = Pass{0}(pos); + if (gxy.x < {1}.x && gxy.y < {1}.y) {{ + {3}[gxy] = Pass{0}(pos); }} gxy.y += 8u; pos.y += step.y; - if (gxy.x < __pass{0}OutputSize.x && gxy.y < __pass{0}OutputSize.y) {{ - {1}[gxy] = Pass{0}(pos); + if (gxy.x < {1}.x && gxy.y < {1}.y) {{ + {3}[gxy] = Pass{0}(pos); }} gxy.x -= 8u; pos.x -= step.x; - if (gxy.x < __pass{0}OutputSize.x && gxy.y < __pass{0}OutputSize.y) {{ - {1}[gxy] = Pass{0}(pos); + if (gxy.x < {1}.x && gxy.y < {1}.y) {{ + {3}[gxy] = Pass{0}(pos); }} }} -)", passIdx, desc.textures[passDesc.outputs[0]].name)); +)", passIdx, outputSize, outputPt, desc.textures[passDesc.outputs[0]].name)); } else { // 多渲染目标 result.append(fmt::format(R"([numthreads(64, 1, 1)] diff --git a/src/Magpie.Core/EffectDesc.h b/src/Magpie.Core/EffectDesc.h index ab1d8bd11..87765f206 100644 --- a/src/Magpie.Core/EffectDesc.h +++ b/src/Magpie.Core/EffectDesc.h @@ -98,6 +98,9 @@ struct EffectDesc { } std::vector params; + // 0: INPUT + // 1: OUTPUT + // > 1: 中间纹理 std::vector textures; std::vector samplers; std::vector passes; diff --git a/src/Magpie.Core/EffectDrawer.cpp b/src/Magpie.Core/EffectDrawer.cpp new file mode 100644 index 000000000..579a13f96 --- /dev/null +++ b/src/Magpie.Core/EffectDrawer.cpp @@ -0,0 +1,17 @@ +#include "pch.h" +#include "EffectDrawer.h" +#include "ScalingOptions.h" + +namespace Magpie::Core { + +bool EffectDrawer::Initialize( + const EffectDesc& /*desc*/, + const EffectOption& /*option*/, + ID3D11Texture2D* /*inputTex*/, + RECT* /*outputRect*/, + RECT* /*virtualOutputRect*/ +) noexcept { + return true; +} + +} diff --git a/src/Magpie.Core/EffectDrawer.h b/src/Magpie.Core/EffectDrawer.h new file mode 100644 index 000000000..b94c8c5b6 --- /dev/null +++ b/src/Magpie.Core/EffectDrawer.h @@ -0,0 +1,34 @@ +#pragma once +#include "EffectDesc.h" + +namespace Magpie::Core { + +struct EffectOption; + +class EffectDrawer { +public: + EffectDrawer() noexcept = default; + EffectDrawer(const EffectDrawer&) = delete; + EffectDrawer(EffectDrawer&&) noexcept = default; + + bool Initialize( + const EffectDesc& desc, + const EffectOption& option, + ID3D11Texture2D* inputTex, + RECT* outputRect = nullptr, + RECT* virtualOutputRect = nullptr + ) noexcept; + + ID3D11Texture2D* GetOutputTexture() const noexcept { + return _textures.empty() ? nullptr : _textures.back().get(); + } + +private: + SmallVector _samplers; + SmallVector> _textures; + std::vector> _srvs; + // 后半部分为空,用于解绑 + std::vector> _uavs; +}; + +} diff --git a/src/Magpie.Core/Magpie.Core.vcxproj b/src/Magpie.Core/Magpie.Core.vcxproj index 70dd37528..412b9f47b 100644 --- a/src/Magpie.Core/Magpie.Core.vcxproj +++ b/src/Magpie.Core/Magpie.Core.vcxproj @@ -85,6 +85,7 @@ + @@ -107,6 +108,7 @@ + diff --git a/src/Magpie.Core/Renderer.cpp b/src/Magpie.Core/Renderer.cpp index fa78d8ed7..4a1fd0282 100644 --- a/src/Magpie.Core/Renderer.cpp +++ b/src/Magpie.Core/Renderer.cpp @@ -4,6 +4,10 @@ #include "ScalingOptions.h" #include "Logger.h" #include "Win32Utils.h" +#include "EffectDrawer.h" +#include "StrUtils.h" +#include "Utils.h" +#include "EffectCompiler.h" namespace Magpie::Core { @@ -35,6 +39,173 @@ void Renderer::Render() noexcept { } +static std::optional CompileEffect( + const ScalingOptions& scalingOptions, + const EffectOption& effectOption +) noexcept { + EffectDesc result; + + result.name = StrUtils::UTF16ToUTF8(effectOption.name); + + if (effectOption.flags & EffectOptionFlags::InlineParams) { + result.flags |= EffectFlags::InlineParams; + } + if (effectOption.flags & EffectOptionFlags::FP16) { + result.flags |= EffectFlags::FP16; + } + + uint32_t compileFlag = 0; + if (scalingOptions.IsDisableEffectCache()) { + compileFlag |= EffectCompilerFlags::NoCache; + } + if (scalingOptions.IsSaveEffectSources()) { + compileFlag |= EffectCompilerFlags::SaveSources; + } + if (scalingOptions.IsWarningsAreErrors()) { + compileFlag |= EffectCompilerFlags::WarningsAreErrors; + } + + bool success = true; + int duration = Utils::Measure([&]() { + success = !EffectCompiler::Compile(result, compileFlag, &effectOption.parameters); + }); + + if (success) { + Logger::Get().Info(fmt::format("编译 {}.hlsl 用时 {} 毫秒", + StrUtils::UTF16ToUTF8(effectOption.name), duration / 1000.0f)); + return result; + } else { + Logger::Get().Error(StrUtils::Concat("编译 ", + StrUtils::UTF16ToUTF8(effectOption.name), ".hlsl 失败")); + return std::nullopt; + } +} + +static std::vector BuildEffects( + const ScalingOptions& scalingOptions, + RECT& outputRect, + RECT& virtualOutputRect +) noexcept { + assert(!scalingOptions.effects.empty()); + + std::vector effectDrawers; + + const uint32_t effectCount = (uint32_t)scalingOptions.effects.size(); + + // 并行编译所有效果 + std::vector effectDescs(scalingOptions.effects.size()); + std::atomic allSuccess = true; + + int duration = Utils::Measure([&]() { + Win32Utils::RunParallel([&](uint32_t id) { + std::optional desc = CompileEffect(scalingOptions, scalingOptions.effects[id]); + if (desc) { + effectDescs[id] = std::move(*desc); + } else { + allSuccess = false; + } + }, effectCount); + }); + + if (!allSuccess) { + return {}; + } + + if (effectCount > 1) { + Logger::Get().Info(fmt::format("编译着色器总计用时 {} 毫秒", duration / 1000.0f)); + } + + ID3D11Texture2D* effectInput = nullptr; + + /*DownscalingEffect& downscalingEffect = MagApp::Get().GetOptions().downscalingEffect; + if (!downscalingEffect.name.empty()) { + _effects.reserve(effectsOption.size() + 1); + }*/ + effectDrawers.resize(scalingOptions.effects.size()); + + for (uint32_t i = 0; i < effectCount; ++i) { + bool isLastEffect = i == effectCount - 1; + + if (!effectDrawers[i].Initialize( + effectDescs[i], + scalingOptions.effects[i], + effectInput, + isLastEffect ? &outputRect : nullptr, + isLastEffect ? &virtualOutputRect : nullptr + )) { + Logger::Get().Error(fmt::format("初始化效果#{} ({}) 失败", i, StrUtils::UTF16ToUTF8(scalingOptions.effects[i].name))); + return {}; + } + + effectInput = effectDrawers[i].GetOutputTexture(); + } + + /*if (!downscalingEffect.name.empty()) { + const SIZE hostSize = Win32Utils::GetSizeOfRect(MagApp::Get().GetHostWndRect()); + const SIZE outputSize = Win32Utils::GetSizeOfRect(_virtualOutputRect); + if (outputSize.cx > hostSize.cx || outputSize.cy > hostSize.cy) { + // 需降采样 + EffectOption downscalingEffectOption; + downscalingEffectOption.name = downscalingEffect.name; + downscalingEffectOption.parameters = downscalingEffect.parameters; + downscalingEffectOption.scalingType = ScalingType::Fit; + downscalingEffectOption.flags = EffectOptionFlags::InlineParams; // 内联参数 + + EffectDesc downscalingEffectDesc; + + // 最后一个效果需重新编译 + // 在分离光标渲染逻辑后这里可优化 + duration = Utils::Measure([&]() { + Win32Utils::RunParallel([&](uint32_t id) { + if (!CompileEffect( + id == 1, + id == 0 ? effectsOption.back() : downscalingEffectOption, + id == 0 ? effectDescs.back() : downscalingEffectDesc + )) { + allSuccess = false; + } + }, 2); + }); + + if (!allSuccess) { + return false; + } + + Logger::Get().Info(fmt::format("编译降采样着色器用时 {} 毫秒", duration / 1000.0f)); + + _effects.pop_back(); + if (_effects.empty()) { + effectInput = MagApp::Get().GetFrameSource().GetOutput(); + } else { + effectInput = _effects.back().GetOutputTexture(); + } + + _effects.resize(_effects.size() + 2); + + // 重新构建最后一个效果 + const size_t originLastEffectIdx = _effects.size() - 2; + if (!_effects[originLastEffectIdx].Initialize(effectDescs.back(), effectsOption.back(), + effectInput, nullptr, nullptr) + ) { + Logger::Get().Error(fmt::format("初始化效果#{} ({}) 失败", + originLastEffectIdx, StrUtils::UTF16ToUTF8(effectsOption.back().name))); + return false; + } + effectInput = _effects[originLastEffectIdx].GetOutputTexture(); + + // 构建降采样效果 + if (!_effects.back().Initialize(downscalingEffectDesc, downscalingEffectOption, + effectInput, &_outputRect, &_virtualOutputRect + )) { + Logger::Get().Error(fmt::format("初始化降采样效果 ({}) 失败", + StrUtils::UTF16ToUTF8(downscalingEffect.name))); + } + } + }*/ + + return effectDrawers; +} + void Renderer::_BackendThreadProc(HWND hwndScaling, const ScalingOptions& options) noexcept { winrt::init_apartment(winrt::apartment_type::single_threaded); @@ -43,6 +214,10 @@ void Renderer::_BackendThreadProc(HWND hwndScaling, const ScalingOptions& option return; } + RECT outputRect; + RECT virtualOutputRect; + std::vector effectDrawers = BuildEffects(options, outputRect, virtualOutputRect); + MSG msg; while (GetMessage(&msg, NULL, 0, 0)) { DispatchMessage(&msg); diff --git a/src/Magpie.Core/Renderer.h b/src/Magpie.Core/Renderer.h index afe805596..29f75125e 100644 --- a/src/Magpie.Core/Renderer.h +++ b/src/Magpie.Core/Renderer.h @@ -18,8 +18,6 @@ class Renderer { void Render() noexcept; private: - int _CheckSrcState(); - void _BackendThreadProc(HWND hwndScaling, const ScalingOptions& options) noexcept; std::unique_ptr _frontendResources; diff --git a/src/Magpie.Core/ScalingWindow.cpp b/src/Magpie.Core/ScalingWindow.cpp index a43336310..bd1e0cde5 100644 --- a/src/Magpie.Core/ScalingWindow.cpp +++ b/src/Magpie.Core/ScalingWindow.cpp @@ -38,7 +38,8 @@ bool ScalingWindow::Create(HINSTANCE hInstance, HWND hwndSrc, ScalingOptions&& o }(hInstance); CreateWindowEx( - WS_EX_TOPMOST | WS_EX_NOACTIVATE | WS_EX_LAYERED | WS_EX_NOREDIRECTIONBITMAP | WS_EX_TRANSPARENT | WS_EX_TOOLWINDOW, + (_options.IsDebugMode() ? 0 : WS_EX_TOPMOST) | WS_EX_NOACTIVATE + | WS_EX_LAYERED | WS_EX_NOREDIRECTIONBITMAP | WS_EX_TRANSPARENT | WS_EX_TOOLWINDOW, CommonSharedConstants::SCALING_WINDOW_CLASS_NAME, L"Magpie", WS_POPUP, From 3ed697cba03e085859bfbf09ddef621515367ae8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=97=AD?= <34770031+Blinue@users.noreply.github.com> Date: Sun, 11 Jun 2023 20:39:29 +0800 Subject: [PATCH 012/155] feat: Graphics Capture --- src/Magpie.App/NewProfileViewModel.cpp | 7 +- src/Magpie.Core/DirectXHelper.cpp | 32 ++ src/Magpie.Core/DirectXHelper.h | 11 + src/Magpie.Core/FrameSourceBase.cpp | 295 +++++++++++++ src/Magpie.Core/FrameSourceBase.h | 59 +++ .../GraphicsCaptureFrameSource.cpp | 414 ++++++++++++++++++ src/Magpie.Core/GraphicsCaptureFrameSource.h | 65 +++ src/Magpie.Core/Magpie.Core.vcxproj | 4 + src/Magpie.Core/ScalingWindow.cpp | 6 +- src/Shared/Win32Utils.cpp | 11 - src/Shared/Win32Utils.h | 2 - 11 files changed, 889 insertions(+), 17 deletions(-) create mode 100644 src/Magpie.Core/FrameSourceBase.cpp create mode 100644 src/Magpie.Core/FrameSourceBase.h create mode 100644 src/Magpie.Core/GraphicsCaptureFrameSource.cpp create mode 100644 src/Magpie.Core/GraphicsCaptureFrameSource.h diff --git a/src/Magpie.App/NewProfileViewModel.cpp b/src/Magpie.App/NewProfileViewModel.cpp index 301caeb9d..43ccecf37 100644 --- a/src/Magpie.App/NewProfileViewModel.cpp +++ b/src/Magpie.App/NewProfileViewModel.cpp @@ -16,8 +16,11 @@ static bool IsCandidateWindow(HWND hWnd) { return false; } - RECT frameRect; - if (!Win32Utils::GetWindowFrameRect(hWnd, frameRect)) { + RECT frameRect{}; + + HRESULT hr = DwmGetWindowAttribute(hWnd, + DWMWA_EXTENDED_FRAME_BOUNDS, &frameRect, sizeof(frameRect)); + if (FAILED(hr)) { return false; } diff --git a/src/Magpie.Core/DirectXHelper.cpp b/src/Magpie.Core/DirectXHelper.cpp index 95c30e1b4..eb182acc2 100644 --- a/src/Magpie.Core/DirectXHelper.cpp +++ b/src/Magpie.Core/DirectXHelper.cpp @@ -72,4 +72,36 @@ bool DirectXHelper::IsDebugLayersAvailable() noexcept { #endif } +winrt::com_ptr DirectXHelper::CreateTexture2D( + ID3D11Device* d3dDevice, + DXGI_FORMAT format, + UINT width, + UINT height, + UINT bindFlags, + D3D11_USAGE usage, + UINT miscFlags, + const D3D11_SUBRESOURCE_DATA* pInitialData +) noexcept { + D3D11_TEXTURE2D_DESC desc{}; + desc.Format = format; + desc.Width = width; + desc.Height = height; + desc.MipLevels = 1; + desc.ArraySize = 1; + desc.SampleDesc.Count = 1; + desc.SampleDesc.Quality = 0; + desc.BindFlags = bindFlags; + desc.Usage = usage; + desc.MiscFlags = miscFlags; + + winrt::com_ptr result; + HRESULT hr = d3dDevice->CreateTexture2D(&desc, pInitialData, result.put()); + if (FAILED(hr)) { + Logger::Get().ComError("CreateTexture2D 失败", hr); + return nullptr; + } + + return result; +} + } diff --git a/src/Magpie.Core/DirectXHelper.h b/src/Magpie.Core/DirectXHelper.h index 376e10ebf..380e1548f 100644 --- a/src/Magpie.Core/DirectXHelper.h +++ b/src/Magpie.Core/DirectXHelper.h @@ -14,6 +14,17 @@ struct DirectXHelper { ); static bool IsDebugLayersAvailable() noexcept; + + static winrt::com_ptr CreateTexture2D( + ID3D11Device* d3dDevice, + DXGI_FORMAT format, + UINT width, + UINT height, + UINT bindFlags, + D3D11_USAGE usage = D3D11_USAGE_DEFAULT, + UINT miscFlags = 0, + const D3D11_SUBRESOURCE_DATA* pInitialData = nullptr + ) noexcept; }; } diff --git a/src/Magpie.Core/FrameSourceBase.cpp b/src/Magpie.Core/FrameSourceBase.cpp new file mode 100644 index 000000000..a9c621866 --- /dev/null +++ b/src/Magpie.Core/FrameSourceBase.cpp @@ -0,0 +1,295 @@ +#include "pch.h" +#include "FrameSourceBase.h" +#include "ScalingOptions.h" +#include "Logger.h" +#include "Win32Utils.h" +#include "CommonSharedConstants.h" +#include "Utils.h" +#include "SmallVector.h" + +namespace Magpie::Core { + +FrameSourceBase::~FrameSourceBase() noexcept { + // 还原窗口圆角 + if (_roundCornerDisabled) { + _roundCornerDisabled = false; + + INT attr = DWMWCP_DEFAULT; + HRESULT hr = DwmSetWindowAttribute(_hwndSrc, DWMWA_WINDOW_CORNER_PREFERENCE, &attr, sizeof(attr)); + if (FAILED(hr)) { + Logger::Get().ComError("取消禁用窗口圆角失败", hr); + } else { + Logger::Get().Info("已取消禁用窗口圆角"); + } + } + + // 还原窗口大小调整 + if (_windowResizingDisabled) { + // 缩放 Magpie 主窗口时会在 SetWindowLongPtr 中卡住,似乎是 Win11 的 bug + // 将在 MagService::_MagRuntime_IsRunningChanged 还原主窗口样式 + if (Win32Utils::GetWndClassName(_hwndSrc) != CommonSharedConstants::MAIN_WINDOW_CLASS_NAME) { + LONG_PTR style = GetWindowLongPtr(_hwndSrc, GWL_STYLE); + if (!(style & WS_THICKFRAME)) { + if (SetWindowLongPtr(_hwndSrc, GWL_STYLE, style | WS_THICKFRAME)) { + if (!SetWindowPos(_hwndSrc, 0, 0, 0, 0, 0, + SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED)) { + Logger::Get().Win32Error("SetWindowPos 失败"); + } + + Logger::Get().Info("已取消禁用窗口大小调整"); + } else { + Logger::Get().Win32Error("取消禁用窗口大小调整失败"); + } + } + } + } +} + +bool FrameSourceBase::Initialize(HWND hwndSrc, HWND /*hwndScaling*/, const ScalingOptions& options, ID3D11Device5* d3dDevice) noexcept { + _hwndSrc = hwndSrc; + _d3dDevice = d3dDevice; + + // 禁用窗口大小调整 + if (options.IsDisableWindowResizing()) { + LONG_PTR style = GetWindowLongPtr(hwndSrc, GWL_STYLE); + if (style & WS_THICKFRAME) { + if (SetWindowLongPtr(hwndSrc, GWL_STYLE, style ^ WS_THICKFRAME)) { + // 不重绘边框,以防某些窗口状态不正确 + // if (!SetWindowPos(hwndSrc, 0, 0, 0, 0, 0, + // SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED)) { + // SPDLOG_LOGGER_ERROR(logger, MakeWin32ErrorMsg("SetWindowPos 失败")); + // } + + Logger::Get().Info("已禁用窗口大小调整"); + _windowResizingDisabled = true; + } else { + Logger::Get().Win32Error("禁用窗口大小调整失败"); + } + } + } + + // 禁用窗口圆角 + if (_HasRoundCornerInWin11()) { + if (Win32Utils::GetOSVersion().IsWin11()) { + INT attr = DWMWCP_DONOTROUND; + HRESULT hr = DwmSetWindowAttribute(hwndSrc, DWMWA_WINDOW_CORNER_PREFERENCE, &attr, sizeof(attr)); + if (FAILED(hr)) { + Logger::Get().ComError("禁用窗口圆角失败", hr); + } else { + Logger::Get().Info("已禁用窗口圆角"); + _roundCornerDisabled = true; + } + } + } + + return true; +} + +struct EnumChildWndParam { + const wchar_t* clientWndClassName = nullptr; + SmallVector childWindows; +}; + +static BOOL CALLBACK EnumChildProc( + _In_ HWND hwnd, + _In_ LPARAM lParam +) { + std::wstring className = Win32Utils::GetWndClassName(hwnd); + + EnumChildWndParam* param = (EnumChildWndParam*)lParam; + if (className == param->clientWndClassName) { + param->childWindows.push_back(hwnd); + } + + return TRUE; +} + +static HWND FindClientWindowOfUWP(HWND hwndSrc, const wchar_t* clientWndClassName) { + // 查找所有窗口类名为 ApplicationFrameInputSinkWindow 的子窗口 + // 该子窗口一般为客户区 + EnumChildWndParam param{}; + param.clientWndClassName = clientWndClassName; + EnumChildWindows(hwndSrc, EnumChildProc, (LPARAM)¶m); + + if (param.childWindows.empty()) { + // 未找到符合条件的子窗口 + return hwndSrc; + } + + if (param.childWindows.size() == 1) { + return param.childWindows[0]; + } + + // 如果有多个匹配的子窗口,取最大的(一般不会出现) + int maxSize = 0, maxIdx = 0; + for (int i = 0; i < param.childWindows.size(); ++i) { + RECT rect; + if (!GetClientRect(param.childWindows[i], &rect)) { + continue; + } + + int size = rect.right - rect.left + rect.bottom - rect.top; + if (size > maxSize) { + maxSize = size; + maxIdx = i; + } + } + + return param.childWindows[maxIdx]; +} + +RECT FrameSourceBase::_GetSrcFrameRect(const Cropping& cropping, bool isCaptureTitleBar) noexcept { + RECT result{}; + + if (isCaptureTitleBar && _CanCaptureTitleBar()) { + HRESULT hr = DwmGetWindowAttribute(_hwndSrc, + DWMWA_EXTENDED_FRAME_BOUNDS, &result, sizeof(result)); + if (FAILED(hr)) { + Logger::Get().ComError("DwmGetWindowAttribute 失败", hr); + } + } else { + std::wstring className = Win32Utils::GetWndClassName(_hwndSrc); + if (className == L"ApplicationFrameWindow" || className == L"Windows.UI.Core.CoreWindow") { + // "Modern App" + // 客户区窗口类名为 ApplicationFrameInputSinkWindow + HWND hwndClient = FindClientWindowOfUWP(_hwndSrc, L"ApplicationFrameInputSinkWindow"); + if (hwndClient) { + if (!Win32Utils::GetClientScreenRect(hwndClient, result)) { + Logger::Get().Win32Error("GetClientScreenRect 失败"); + } + } + } + } + + if (result == RECT{}) { + if (!Win32Utils::GetClientScreenRect(_hwndSrc, result)) { + Logger::Get().Win32Error("GetClientScreenRect 失败"); + return {}; + } + } + + result = { + std::lround(result.left + cropping.Left), + std::lround(result.top + cropping.Top), + std::lround(result.right - cropping.Right), + std::lround(result.bottom - cropping.Bottom) + }; + + if (result.right - result.left <= 0 || result.bottom - result.top <= 0) { + Logger::Get().Error("裁剪窗口失败"); + return {}; + } + + return result; +} + +bool FrameSourceBase::_GetMapToOriginDPI(HWND hWnd, double& a, double& bx, double& by) noexcept { + // HDC 中的 HBITMAP 尺寸为窗口的原始尺寸 + // 通过 GetWindowRect 获得的尺寸为窗口的 DPI 缩放后尺寸 + // 它们的商即为窗口的 DPI 缩放 + HDC hdcWindow = GetDCEx(hWnd, NULL, DCX_LOCKWINDOWUPDATE | DCX_WINDOW); + if (!hdcWindow) { + Logger::Get().Win32Error("GetDCEx 失败"); + return false; + } + + HDC hdcClient = GetDCEx(hWnd, NULL, DCX_LOCKWINDOWUPDATE); + if (!hdcClient) { + Logger::Get().Win32Error("GetDCEx 失败"); + ReleaseDC(hWnd, hdcWindow); + return false; + } + + Utils::ScopeExit se([hWnd, hdcWindow, hdcClient]() { + ReleaseDC(hWnd, hdcWindow); + ReleaseDC(hWnd, hdcClient); + }); + + HGDIOBJ hBmpWindow = GetCurrentObject(hdcWindow, OBJ_BITMAP); + if (!hBmpWindow) { + Logger::Get().Win32Error("GetCurrentObject 失败"); + return false; + } + + if (GetObjectType(hBmpWindow) != OBJ_BITMAP) { + Logger::Get().Error("无法获取窗口的重定向表面"); + return false; + } + + BITMAP bmp{}; + if (!GetObject(hBmpWindow, sizeof(bmp), &bmp)) { + Logger::Get().Win32Error("GetObject 失败"); + return false; + } + + RECT rect; + if (!GetWindowRect(hWnd, &rect)) { + Logger::Get().Win32Error("GetWindowRect 失败"); + return false; + } + + a = bmp.bmWidth / double(rect.right - rect.left); + + // 使用 DPI 缩放无法可靠计算出窗口客户区的位置 + // 这里使用窗口 HDC 和客户区 HDC 的原点坐标差值 + // GetDCOrgEx 获得的是 DC 原点的屏幕坐标 + + POINT ptClient{}, ptWindow{}; + if (!GetDCOrgEx(hdcClient, &ptClient)) { + Logger::Get().Win32Error("GetDCOrgEx 失败"); + return false; + } + if (!GetDCOrgEx(hdcWindow, &ptWindow)) { + Logger::Get().Win32Error("GetDCOrgEx 失败"); + return false; + } + + if (!Win32Utils::GetClientScreenRect(hWnd, rect)) { + Logger::Get().Error("GetClientScreenRect 失败"); + return false; + } + + // 以窗口的客户区左上角为基准 + // 该点在坐标系 1 中坐标为 (rect.left, rect.top) + // 在坐标系 2 中坐标为 (ptClient.x - ptWindow.x, ptClient.y - ptWindow.y) + // 由此计算出 b + bx = ptClient.x - ptWindow.x - rect.left * a; + by = ptClient.y - ptWindow.y - rect.top * a; + + return true; +} + +bool FrameSourceBase::_CenterWindowIfNecessary(HWND hWnd, const RECT& rcWork) noexcept { + RECT srcRect; + if (!GetWindowRect(hWnd, &srcRect)) { + Logger::Get().Win32Error("GetWindowRect 失败"); + return false; + } + + if (srcRect.left < rcWork.left || srcRect.top < rcWork.top + || srcRect.right > rcWork.right || srcRect.bottom > rcWork.bottom) { + // 源窗口超越边界,将源窗口移到屏幕中央 + SIZE srcSize = { srcRect.right - srcRect.left, srcRect.bottom - srcRect.top }; + SIZE rcWorkSize = { rcWork.right - rcWork.left, rcWork.bottom - rcWork.top }; + if (srcSize.cx > rcWorkSize.cx || srcSize.cy > rcWorkSize.cy) { + // 源窗口无法被当前屏幕容纳,因此无法捕获 + return false; + } + + if (!SetWindowPos( + hWnd, + 0, + rcWork.left + (rcWorkSize.cx - srcSize.cx) / 2, + rcWork.top + (rcWorkSize.cy - srcSize.cy) / 2, + 0, + 0, + SWP_NOSIZE | SWP_NOZORDER + )) { + Logger::Get().Win32Error("SetWindowPos 失败"); + } + } + + return true; +} + +} diff --git a/src/Magpie.Core/FrameSourceBase.h b/src/Magpie.Core/FrameSourceBase.h new file mode 100644 index 000000000..07b5d1aff --- /dev/null +++ b/src/Magpie.Core/FrameSourceBase.h @@ -0,0 +1,59 @@ +#pragma once + +namespace Magpie::Core { + +struct ScalingOptions; +struct Cropping; + +class FrameSourceBase { +public: + FrameSourceBase() noexcept {} + + virtual ~FrameSourceBase() noexcept; + + // 不可复制,不可移动 + FrameSourceBase(const FrameSourceBase&) = delete; + FrameSourceBase(FrameSourceBase&&) = delete; + + virtual bool Initialize(HWND hwndSrc, HWND hwndScaling, const ScalingOptions& options, ID3D11Device5* d3dDevice) noexcept; + + enum class UpdateState { + NewFrame, + Waiting, + Error + }; + + virtual UpdateState Update() noexcept = 0; + + virtual const char* GetName() const noexcept = 0; + + virtual bool IsScreenCapture() = 0; + +protected: + virtual bool _HasRoundCornerInWin11() noexcept = 0; + + virtual bool _CanCaptureTitleBar() noexcept = 0; + + RECT _GetSrcFrameRect(const Cropping& cropping, bool isCaptureTitleBar) noexcept; + + // 获取坐标系 1 到坐标系 2 的映射关系 + // 坐标系 1:屏幕坐标系,即虚拟化后的坐标系。原点为屏幕左上角 + // 坐标系 2:虚拟化前的坐标系,即源窗口所见的坐标系,原点为窗口左上角 + // 两坐标系为线性映射,a 和 b 返回该映射的参数 + // 如果窗口本身支持高 DPI,则 a 为 1,否则 a 为 DPI 缩放的倒数 + // 此函数是为了将屏幕上的点映射到窗口坐标系中,并且无视 DPI 虚拟化 + // 坐标系 1 中的 (x1, y1) 映射到 (x1 * a + bx, x2 * a + by) + static bool _GetMapToOriginDPI(HWND hWnd, double& a, double& bx, double& by) noexcept; + + static bool _CenterWindowIfNecessary(HWND hWnd, const RECT& rcWork) noexcept; + + HWND _hwndSrc = NULL; + + ID3D11Device5* _d3dDevice = nullptr; + winrt::com_ptr _output; + + bool _roundCornerDisabled = false; + bool _windowResizingDisabled = false; +}; + +} diff --git a/src/Magpie.Core/GraphicsCaptureFrameSource.cpp b/src/Magpie.Core/GraphicsCaptureFrameSource.cpp new file mode 100644 index 000000000..c3e80e005 --- /dev/null +++ b/src/Magpie.Core/GraphicsCaptureFrameSource.cpp @@ -0,0 +1,414 @@ +#include "pch.h" +#include "GraphicsCaptureFrameSource.h" +#include "StrUtils.h" +#include "Utils.h" +#include "DeviceResources.h" +#include "Logger.h" +#include +#include "Win32Utils.h" +#include "DirectXHelper.h" +#include "ScalingOptions.h" + +namespace winrt { +using namespace Windows::Graphics; +using namespace Windows::Graphics::Capture; +using namespace Windows::Graphics::DirectX; +using namespace Windows::Graphics::DirectX::Direct3D11; +} + +namespace Magpie::Core { + +bool GraphicsCaptureFrameSource::Initialize(HWND hwndSrc, HWND hwndScaling, const ScalingOptions& options, ID3D11Device5* d3dDevice) noexcept { + if (!FrameSourceBase::Initialize(hwndSrc, hwndScaling, options, d3dDevice)) { + Logger::Get().Error("初始化 FrameSourceBase 失败"); + return false; + } + + HRESULT hr; + + winrt::com_ptr interop; + try { + if (!winrt::GraphicsCaptureSession::IsSupported()) { + Logger::Get().Error("当前不支持 WinRT 捕获"); + return false; + } + + winrt::com_ptr dxgiDevice; + _d3dDevice->QueryInterface(dxgiDevice.put()); + + hr = CreateDirect3D11DeviceFromDXGIDevice( + dxgiDevice.get(), + reinterpret_cast<::IInspectable**>(winrt::put_abi(_wrappedD3DDevice)) + ); + if (FAILED(hr)) { + Logger::Get().ComError("创建 IDirect3DDevice 失败", hr); + return false; + } + + // 从窗口句柄获取 GraphicsCaptureItem + interop = winrt::get_activation_factory(); + if (!interop) { + Logger::Get().Error("获取 IGraphicsCaptureItemInterop 失败"); + return false; + } + } catch (const winrt::hresult_error& e) { + Logger::Get().Error(StrUtils::Concat("初始化 WinRT 失败:", StrUtils::UTF16ToUTF8(e.message()))); + return false; + } + + if (!_CaptureWindow(interop.get(), options)) { + Logger::Get().Info("窗口捕获失败,回落到屏幕捕获"); + + if (_CaptureMonitor(interop.get(), options, hwndScaling)) { + _isScreenCapture = true; + } else { + Logger::Get().Error("屏幕捕获失败"); + return false; + } + } + + _output = DirectXHelper::CreateTexture2D( + d3dDevice, + DXGI_FORMAT_B8G8R8A8_UNORM, + _frameBox.right - _frameBox.left, + _frameBox.bottom - _frameBox.top, + D3D11_BIND_SHADER_RESOURCE + ); + if (!_output) { + Logger::Get().Error("创建纹理失败"); + return false; + } + + if (!StartCapture()) { + Logger::Get().Error("_StartCapture 失败"); + return false; + } + + Logger::Get().Info("GraphicsCaptureFrameSource 初始化完成"); + return true; +} + +FrameSourceBase::UpdateState GraphicsCaptureFrameSource::Update() noexcept { + if (!_captureSession) { + return UpdateState::Waiting; + } + + winrt::Direct3D11CaptureFrame frame = _captureFramePool.TryGetNextFrame(); + if (!frame) { + // 因为已通过 FrameArrived 注册回调,所以每当有新帧时会有新消息到达 + return UpdateState::Waiting; + } + + // 从帧获取 IDXGISurface + winrt::IDirect3DSurface d3dSurface = frame.Surface(); + + winrt::com_ptr<::Windows::Graphics::DirectX::Direct3D11::IDirect3DDxgiInterfaceAccess> dxgiInterfaceAccess( + d3dSurface.as<::Windows::Graphics::DirectX::Direct3D11::IDirect3DDxgiInterfaceAccess>() + ); + + winrt::com_ptr withFrame; + HRESULT hr = dxgiInterfaceAccess->GetInterface(IID_PPV_ARGS(&withFrame)); + if (FAILED(hr)) { + Logger::Get().ComError("从获取 IDirect3DSurface 获取 ID3D11Texture2D 失败", hr); + return UpdateState::Error; + } + + winrt::com_ptr d3dDC; + _d3dDevice->GetImmediateContext(d3dDC.put()); + + d3dDC->CopySubresourceRegion(_output.get(), 0, 0, 0, 0, withFrame.get(), 0, &_frameBox); + + frame.Close(); + return UpdateState::NewFrame; +} + +bool GraphicsCaptureFrameSource::_CaptureWindow(IGraphicsCaptureItemInterop* interop, const ScalingOptions& options) { + // DwmGetWindowAttribute 和 Graphics.Capture 无法应用于子窗口 + + // 包含边框的窗口尺寸 + RECT srcFrameBounds{}; + HRESULT hr = DwmGetWindowAttribute(_hwndSrc, + DWMWA_EXTENDED_FRAME_BOUNDS, &srcFrameBounds, sizeof(srcFrameBounds)); + if (FAILED(hr)) { + Logger::Get().ComError("DwmGetWindowAttribute 失败", hr); + return false; + } + + RECT srcFrameRect = _GetSrcFrameRect(options.cropping, options.IsCaptureTitleBar()); + if (srcFrameRect == RECT{}) { + Logger::Get().Error("_GetSrcFrameRect 失败"); + return false; + } + + // 在源窗口存在 DPI 缩放时有时会有一像素的偏移(取决于窗口在屏幕上的位置) + // 可能是 DwmGetWindowAttribute 的 bug + _frameBox = { + UINT(srcFrameRect.left - srcFrameBounds.left), + UINT(srcFrameRect.top - srcFrameBounds.top), + 0, + UINT(srcFrameRect.right - srcFrameBounds.left), + UINT(srcFrameRect.bottom - srcFrameBounds.top), + 1 + }; + + if (_TryCreateGraphicsCaptureItem(interop, _hwndSrc)) { + return true; + } + + // 尝试设置源窗口样式,因为 WGC 只能捕获位于 Alt+Tab 列表中的窗口 + LONG_PTR srcExStyle = GetWindowLongPtr(_hwndSrc, GWL_EXSTYLE); + if ((srcExStyle & WS_EX_APPWINDOW) == 0) { + // 添加 WS_EX_APPWINDOW 样式,确保源窗口可被 Alt+Tab 选中 + if (SetWindowLongPtr(_hwndSrc, GWL_EXSTYLE, srcExStyle | WS_EX_APPWINDOW)) { + Logger::Get().Info("已改变源窗口样式"); + _originalSrcExStyle = srcExStyle; + + if (_TryCreateGraphicsCaptureItem(interop, _hwndSrc)) { + _RemoveOwnerFromAltTabList(_hwndSrc); + return true; + } + } else { + Logger::Get().Win32Error("SetWindowLongPtr 失败"); + } + } + + // 如果窗口使用 ITaskbarList 隐藏了任务栏图标也不会出现在 Alt+Tab 列表。这种情况很罕见 + _taskbarList = winrt::try_create_instance(CLSID_TaskbarList); + if (_taskbarList && SUCCEEDED(_taskbarList->HrInit())) { + HRESULT hr = _taskbarList->AddTab(_hwndSrc); + if (SUCCEEDED(hr)) { + Logger::Get().Info("已添加任务栏图标"); + + if (_TryCreateGraphicsCaptureItem(interop, _hwndSrc)) { + _RemoveOwnerFromAltTabList(_hwndSrc); + return true; + } + } else { + _taskbarList = nullptr; + Logger::Get().Error("ITaskbarList::AddTab 失败"); + } + } else { + _taskbarList = nullptr; + Logger::Get().Error("创建 ITaskbarList 失败"); + } + + // 上面的尝试失败了则还原更改 + if (_taskbarList) { + _taskbarList->DeleteTab(_hwndSrc); + _taskbarList = nullptr; + } + if (_originalSrcExStyle) { + // 首先还原所有者窗口的样式以压制任务栏的动画 + if (_originalOwnerExStyle) { + SetWindowLongPtr(GetWindowOwner(_hwndSrc), GWL_EXSTYLE, _originalOwnerExStyle); + _originalOwnerExStyle = 0; + } + + SetWindowLongPtr(_hwndSrc, GWL_EXSTYLE, _originalSrcExStyle); + _originalSrcExStyle = 0; + } + + return false; +} + +bool GraphicsCaptureFrameSource::_TryCreateGraphicsCaptureItem(IGraphicsCaptureItemInterop* interop, HWND hwndSrc) noexcept { + try { + HRESULT hr = interop->CreateForWindow( + hwndSrc, + winrt::guid_of(), + winrt::put_abi(_captureItem) + ); + if (FAILED(hr)) { + Logger::Get().ComError("创建 GraphicsCaptureItem 失败", hr); + return false; + } + } catch (const winrt::hresult_error& e) { + Logger::Get().Info(StrUtils::Concat("源窗口无法使用窗口捕获:", StrUtils::UTF16ToUTF8(e.message()))); + return false; + } + + return true; +} + +// 部分使用 Kirikiri 引擎的游戏有着这样的架构:游戏窗口并非根窗口,它被一个尺寸为 0 的窗口 +// 所有。此时 Alt+Tab 列表中的窗口和任务栏图标实际上是所有者窗口,这会导致 WGC 捕获游戏窗 +// 口时失败。_CaptureWindow 在初次捕获失败后会将 WS_EX_APPWINDOW 样式添加到游戏窗口,这 +// 可以工作,但也导致所有者窗口和游戏窗口同时出现在 Alt+Tab 列表中,引起用户的困惑。 +// +// 此函数检测这种情况并改变所有者窗口的样式将它从 Alt+Tab 列表中移除。 +void GraphicsCaptureFrameSource::_RemoveOwnerFromAltTabList(HWND hwndSrc) noexcept { + HWND hwndOwner = GetWindowOwner(hwndSrc); + if (!hwndOwner) { + return; + } + + RECT ownerRect{}; + if (!GetWindowRect(hwndOwner, &ownerRect)) { + Logger::Get().Win32Error("GetWindowRect 失败"); + return; + } + + // 检查所有者窗口尺寸 + if (ownerRect.right != ownerRect.left || ownerRect.bottom != ownerRect.top) { + return; + } + + LONG_PTR ownerExStyle = GetWindowLongPtr(hwndOwner, GWL_EXSTYLE); + if (ownerExStyle == 0) { + Logger::Get().Win32Error("GetWindowLongPtr 失败"); + return; + } + + if (!SetWindowLongPtr(hwndOwner, GWL_EXSTYLE, ownerExStyle | WS_EX_TOOLWINDOW)) { + Logger::Get().Win32Error("SetWindowLongPtr 失败"); + return; + } + + _originalOwnerExStyle = ownerExStyle; +} + +bool GraphicsCaptureFrameSource::_CaptureMonitor(IGraphicsCaptureItemInterop* interop, const ScalingOptions& options, HWND hwndScaling) { + // Win10 无法隐藏黄色边框,因此只在 Win11 中回落到屏幕捕获 + if (!Win32Utils::GetOSVersion().IsWin11()) { + Logger::Get().Error("无法使用屏幕捕获"); + return false; + } + + // 使全屏窗口无法被捕获到 + // WDA_EXCLUDEFROMCAPTURE 只在 Win10 20H1 及更新版本中可用 + if (!SetWindowDisplayAffinity(hwndScaling, WDA_EXCLUDEFROMCAPTURE)) { + Logger::Get().Win32Error("SetWindowDisplayAffinity 失败"); + return false; + } + + HMONITOR hMonitor = MonitorFromWindow(_hwndSrc, MONITOR_DEFAULTTONEAREST); + if (!hMonitor) { + Logger::Get().Win32Error("MonitorFromWindow 失败"); + return false; + } + + MONITORINFO mi{}; + mi.cbSize = sizeof(mi); + if (!GetMonitorInfo(hMonitor, &mi)) { + Logger::Get().Win32Error("GetMonitorInfo 失败"); + return false; + } + + // 放在屏幕左上角而不是中间可以提高帧率,这里是为了和 DesktopDuplication 保持一致 + if (!_CenterWindowIfNecessary(_hwndSrc, mi.rcWork)) { + Logger::Get().Error("居中源窗口失败"); + return false; + } + + RECT srcFrameRect = _GetSrcFrameRect(options.cropping, options.IsCaptureTitleBar()); + if (srcFrameRect == RECT{}) { + Logger::Get().Error("_GetSrcFrameRect 失败"); + return false; + } + + _frameBox = { + UINT(srcFrameRect.left - mi.rcMonitor.left), + UINT(srcFrameRect.top - mi.rcMonitor.top), + 0, + UINT(srcFrameRect.right - mi.rcMonitor.left), + UINT(srcFrameRect.bottom - mi.rcMonitor.top), + 1 + }; + + try { + HRESULT hr = interop->CreateForMonitor( + hMonitor, + winrt::guid_of(), + winrt::put_abi(_captureItem) + ); + if (FAILED(hr)) { + Logger::Get().ComError("创建 GraphicsCaptureItem 失败", hr); + return false; + } + } catch (const winrt::hresult_error& e) { + Logger::Get().Info(StrUtils::Concat("捕获屏幕失败:", StrUtils::UTF16ToUTF8(e.message()))); + return false; + } + + return true; +} + +bool GraphicsCaptureFrameSource::StartCapture() { + if (_captureSession) { + return true; + } + + try { + // 创建帧缓冲池 + // 帧的尺寸和 _captureItem.Size() 不同 + _captureFramePool = winrt::Direct3D11CaptureFramePool::Create( + _wrappedD3DDevice, + winrt::DirectXPixelFormat::B8G8R8A8UIntNormalized, + 1, // 帧的缓存数量 + { (int)_frameBox.right, (int)_frameBox.bottom } // 帧的尺寸为包含源窗口的最小尺寸 + ); + + // 注册回调是为了确保每当有新的帧时会向当前线程发送消息 + // 回调中什么也不做 + _captureFramePool.FrameArrived([](const auto&, const auto&) {}); + + _captureSession = _captureFramePool.CreateCaptureSession(_captureItem); + + // 不捕获光标 + if (winrt::ApiInformation::IsPropertyPresent( + winrt::name_of(), + L"IsCursorCaptureEnabled" + )) { + // 从 v2004 开始提供 + _captureSession.IsCursorCaptureEnabled(false); + } + + // 不显示黄色边框 + if (winrt::ApiInformation::IsPropertyPresent( + winrt::name_of(), + L"IsBorderRequired" + )) { + // 从 Win10 v2104 开始提供 + // Win32 应用中无需请求权限 + _captureSession.IsBorderRequired(false); + } + + _captureSession.StartCapture(); + } catch (const winrt::hresult_error& e) { + Logger::Get().Info(StrUtils::Concat("Graphics Capture 失败:", StrUtils::UTF16ToUTF8(e.message()))); + return false; + } + + return true; +} + +void GraphicsCaptureFrameSource::StopCapture() { + if (_captureSession) { + _captureSession.Close(); + _captureSession = nullptr; + } + if (_captureFramePool) { + _captureFramePool.Close(); + _captureFramePool = nullptr; + } +} + +GraphicsCaptureFrameSource::~GraphicsCaptureFrameSource() { + StopCapture(); + + if (_taskbarList) { + _taskbarList->DeleteTab(_hwndSrc); + } + + // 还原源窗口样式 + if (_originalSrcExStyle) { + // 首先还原所有者窗口的样式以压制任务栏的动画 + if (_originalOwnerExStyle) { + SetWindowLongPtr(GetWindowOwner(_hwndSrc), GWL_EXSTYLE, _originalOwnerExStyle); + } + + SetWindowLongPtr(_hwndSrc, GWL_EXSTYLE, _originalSrcExStyle); + } +} + +} diff --git a/src/Magpie.Core/GraphicsCaptureFrameSource.h b/src/Magpie.Core/GraphicsCaptureFrameSource.h new file mode 100644 index 000000000..f58d05b94 --- /dev/null +++ b/src/Magpie.Core/GraphicsCaptureFrameSource.h @@ -0,0 +1,65 @@ +#pragma once +#include "FrameSourceBase.h" +#include +#include + +namespace Magpie::Core { + +// 使用 Window Runtime 的 Windows.Graphics.Capture API 抓取窗口 +// 见 https://docs.microsoft.com/en-us/windows/uwp/audio-video-camera/screen-capture +class GraphicsCaptureFrameSource : public FrameSourceBase { +public: + GraphicsCaptureFrameSource() {}; + virtual ~GraphicsCaptureFrameSource(); + + bool Initialize(HWND hwndSrc, HWND hwndScaling, const ScalingOptions& options, ID3D11Device5* d3dDevice) noexcept override; + + UpdateState Update() noexcept override; + + bool IsScreenCapture() override { + return _isScreenCapture; + } + + const char* GetName() const noexcept override { + return NAME; + } + + bool StartCapture(); + + void StopCapture(); + + static constexpr const char* NAME = "Graphics Capture"; + +protected: + bool _HasRoundCornerInWin11() noexcept override { + return true; + } + + bool _CanCaptureTitleBar() noexcept override { + return true; + } + +private: + bool _CaptureWindow(IGraphicsCaptureItemInterop* interop, const ScalingOptions& options); + + bool _CaptureMonitor(IGraphicsCaptureItemInterop* interop, const ScalingOptions& options, HWND hwndScaling); + + bool _TryCreateGraphicsCaptureItem(IGraphicsCaptureItemInterop* interop, HWND hwndSrc) noexcept; + + void _RemoveOwnerFromAltTabList(HWND hwndSrc) noexcept; + + LONG_PTR _originalSrcExStyle = 0; + LONG_PTR _originalOwnerExStyle = 0; + winrt::com_ptr _taskbarList; + + D3D11_BOX _frameBox{}; + + bool _isScreenCapture = false; + + winrt::Windows::Graphics::Capture::GraphicsCaptureItem _captureItem{ nullptr }; + winrt::Windows::Graphics::Capture::Direct3D11CaptureFramePool _captureFramePool{ nullptr }; + winrt::Windows::Graphics::Capture::GraphicsCaptureSession _captureSession{ nullptr }; + winrt::Windows::Graphics::DirectX::Direct3D11::IDirect3DDevice _wrappedD3DDevice{ nullptr }; +}; + +} diff --git a/src/Magpie.Core/Magpie.Core.vcxproj b/src/Magpie.Core/Magpie.Core.vcxproj index 412b9f47b..980504f03 100644 --- a/src/Magpie.Core/Magpie.Core.vcxproj +++ b/src/Magpie.Core/Magpie.Core.vcxproj @@ -88,6 +88,8 @@ + + @@ -109,6 +111,8 @@ + + diff --git a/src/Magpie.Core/ScalingWindow.cpp b/src/Magpie.Core/ScalingWindow.cpp index bd1e0cde5..7b9b3a232 100644 --- a/src/Magpie.Core/ScalingWindow.cpp +++ b/src/Magpie.Core/ScalingWindow.cpp @@ -161,8 +161,10 @@ bool ScalingWindow::_CheckForeground(HWND hwndForeground) const noexcept { }*/ if (rectForground == RECT{}) { - if (!Win32Utils::GetWindowFrameRect(hwndForeground, rectForground)) { - Logger::Get().Error("GetWindowFrameRect 失败"); + HRESULT hr = DwmGetWindowAttribute(hwndForeground, + DWMWA_EXTENDED_FRAME_BOUNDS, &rectForground, sizeof(rectForground)); + if (FAILED(hr)) { + Logger::Get().ComError("DwmGetWindowAttribute 失败", hr); return false; } } diff --git a/src/Shared/Win32Utils.cpp b/src/Shared/Win32Utils.cpp index 9c3108808..d616fbf37 100644 --- a/src/Shared/Win32Utils.cpp +++ b/src/Shared/Win32Utils.cpp @@ -105,17 +105,6 @@ bool Win32Utils::GetClientScreenRect(HWND hWnd, RECT& rect) { return true; } -bool Win32Utils::GetWindowFrameRect(HWND hWnd, RECT& result) { - HRESULT hr = DwmGetWindowAttribute(hWnd, - DWMWA_EXTENDED_FRAME_BOUNDS, &result, sizeof(result)); - if (FAILED(hr)) { - return false; - } - - return true; -} - - bool Win32Utils::ReadFile(const wchar_t* fileName, std::vector& result) { Logger::Get().Info(StrUtils::Concat("读取文件:", StrUtils::UTF16ToUTF8(fileName))); diff --git a/src/Shared/Win32Utils.h b/src/Shared/Win32Utils.h index e994ea48c..199ff3cef 100644 --- a/src/Shared/Win32Utils.h +++ b/src/Shared/Win32Utils.h @@ -20,8 +20,6 @@ struct Win32Utils { static bool GetClientScreenRect(HWND hWnd, RECT& rect); - static bool GetWindowFrameRect(HWND hWnd, RECT& result); - static bool ReadFile(const wchar_t* fileName, std::vector& result); static bool ReadTextFile(const wchar_t* fileName, std::string& result); From 11f9f6999c3bc3733a848a165ec393254fd9f5cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=97=AD?= <34770031+Blinue@users.noreply.github.com> Date: Sun, 11 Jun 2023 20:57:46 +0800 Subject: [PATCH 013/155] =?UTF-8?q?feat:=20=E5=88=9D=E5=A7=8B=E5=8C=96?= =?UTF-8?q?=E6=8D=95=E8=8E=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Magpie.Core/FrameSourceBase.h | 4 ++ .../GraphicsCaptureFrameSource.cpp | 2 +- src/Magpie.Core/Renderer.cpp | 59 +++++++++++++++++-- src/Magpie.Core/Renderer.h | 2 +- 4 files changed, 60 insertions(+), 7 deletions(-) diff --git a/src/Magpie.Core/FrameSourceBase.h b/src/Magpie.Core/FrameSourceBase.h index 07b5d1aff..34bacd1ce 100644 --- a/src/Magpie.Core/FrameSourceBase.h +++ b/src/Magpie.Core/FrameSourceBase.h @@ -25,6 +25,10 @@ class FrameSourceBase { virtual UpdateState Update() noexcept = 0; + ID3D11Texture2D* GetOutput() noexcept { + return _output.get(); + } + virtual const char* GetName() const noexcept = 0; virtual bool IsScreenCapture() = 0; diff --git a/src/Magpie.Core/GraphicsCaptureFrameSource.cpp b/src/Magpie.Core/GraphicsCaptureFrameSource.cpp index c3e80e005..90acc44b3 100644 --- a/src/Magpie.Core/GraphicsCaptureFrameSource.cpp +++ b/src/Magpie.Core/GraphicsCaptureFrameSource.cpp @@ -175,7 +175,7 @@ bool GraphicsCaptureFrameSource::_CaptureWindow(IGraphicsCaptureItemInterop* int // 如果窗口使用 ITaskbarList 隐藏了任务栏图标也不会出现在 Alt+Tab 列表。这种情况很罕见 _taskbarList = winrt::try_create_instance(CLSID_TaskbarList); if (_taskbarList && SUCCEEDED(_taskbarList->HrInit())) { - HRESULT hr = _taskbarList->AddTab(_hwndSrc); + hr = _taskbarList->AddTab(_hwndSrc); if (SUCCEEDED(hr)) { Logger::Get().Info("已添加任务栏图标"); diff --git a/src/Magpie.Core/Renderer.cpp b/src/Magpie.Core/Renderer.cpp index 4a1fd0282..b1fba90d2 100644 --- a/src/Magpie.Core/Renderer.cpp +++ b/src/Magpie.Core/Renderer.cpp @@ -8,6 +8,7 @@ #include "StrUtils.h" #include "Utils.h" #include "EffectCompiler.h" +#include "GraphicsCaptureFrameSource.h" namespace Magpie::Core { @@ -24,8 +25,8 @@ Renderer::~Renderer() noexcept { } } -bool Renderer::Initialize(HWND /*hwndSrc*/, HWND hwndScaling, const ScalingOptions& options) noexcept { - _backendThread = std::thread(std::bind(&Renderer::_BackendThreadProc, this, hwndScaling, options)); +bool Renderer::Initialize(HWND hwndSrc, HWND hwndScaling, const ScalingOptions& options) noexcept { + _backendThread = std::thread(std::bind(&Renderer::_BackendThreadProc, this, hwndSrc, hwndScaling, options)); _frontendResources = std::make_unique(); if (!_frontendResources->Initialize(hwndScaling, options)) { @@ -39,6 +40,46 @@ void Renderer::Render() noexcept { } +static std::unique_ptr _InitFrameSource( + HWND hwndSrc, + HWND hwndScaling, + const ScalingOptions& options, + ID3D11Device5* d3dDevice +) noexcept { + std::unique_ptr frameSource; + + switch (options.captureMethod) { + case CaptureMethod::GraphicsCapture: + frameSource = std::make_unique(); + break; + /*case CaptureMethod::DesktopDuplication: + frameSource = std::make_unique(); + break; + case CaptureMethod::GDI: + frameSource = std::make_unique(); + break; + case CaptureMethod::DwmSharedSurface: + frameSource = std::make_unique(); + break;*/ + default: + Logger::Get().Error("未知的捕获模式"); + return {}; + } + + Logger::Get().Info(StrUtils::Concat("当前捕获模式:", frameSource->GetName())); + + if (!frameSource->Initialize(hwndSrc, hwndScaling, options, d3dDevice)) { + Logger::Get().Error("初始化 FrameSource 失败"); + return {}; + } + + D3D11_TEXTURE2D_DESC desc; + frameSource->GetOutput()->GetDesc(&desc); + Logger::Get().Info(fmt::format("源窗口尺寸:{}x{}", desc.Width, desc.Height)); + + return frameSource; +} + static std::optional CompileEffect( const ScalingOptions& scalingOptions, const EffectOption& effectOption @@ -83,6 +124,7 @@ static std::optional CompileEffect( static std::vector BuildEffects( const ScalingOptions& scalingOptions, + ID3D11Texture2D* inputTex, RECT& outputRect, RECT& virtualOutputRect ) noexcept { @@ -115,7 +157,7 @@ static std::vector BuildEffects( Logger::Get().Info(fmt::format("编译着色器总计用时 {} 毫秒", duration / 1000.0f)); } - ID3D11Texture2D* effectInput = nullptr; + ID3D11Texture2D* effectInput = inputTex; /*DownscalingEffect& downscalingEffect = MagApp::Get().GetOptions().downscalingEffect; if (!downscalingEffect.name.empty()) { @@ -206,7 +248,7 @@ static std::vector BuildEffects( return effectDrawers; } -void Renderer::_BackendThreadProc(HWND hwndScaling, const ScalingOptions& options) noexcept { +void Renderer::_BackendThreadProc(HWND hwndSrc, HWND hwndScaling, const ScalingOptions& options) noexcept { winrt::init_apartment(winrt::apartment_type::single_threaded); DeviceResources deviceResources; @@ -214,9 +256,16 @@ void Renderer::_BackendThreadProc(HWND hwndScaling, const ScalingOptions& option return; } + std::unique_ptr frameSource = + _InitFrameSource(hwndSrc, hwndScaling, options, deviceResources.GetD3DDevice()); + if (!frameSource) { + return; + } + RECT outputRect; RECT virtualOutputRect; - std::vector effectDrawers = BuildEffects(options, outputRect, virtualOutputRect); + std::vector effectDrawers = + BuildEffects(options, frameSource->GetOutput(), outputRect, virtualOutputRect); MSG msg; while (GetMessage(&msg, NULL, 0, 0)) { diff --git a/src/Magpie.Core/Renderer.h b/src/Magpie.Core/Renderer.h index 29f75125e..5645513a7 100644 --- a/src/Magpie.Core/Renderer.h +++ b/src/Magpie.Core/Renderer.h @@ -18,7 +18,7 @@ class Renderer { void Render() noexcept; private: - void _BackendThreadProc(HWND hwndScaling, const ScalingOptions& options) noexcept; + void _BackendThreadProc(HWND hwndSrc, HWND hwndScaling, const ScalingOptions& options) noexcept; std::unique_ptr _frontendResources; From c05720bb15c5254ee1d14eb1a40994428fa4149e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=97=AD?= <34770031+Blinue@users.noreply.github.com> Date: Sun, 11 Jun 2023 23:46:17 +0800 Subject: [PATCH 014/155] feat: EffectDrawer --- src/Magpie.Core/DeviceResources.cpp | 79 +++++++ src/Magpie.Core/DeviceResources.h | 18 ++ src/Magpie.Core/EffectCompiler.cpp | 11 +- src/Magpie.Core/EffectDrawer.cpp | 325 +++++++++++++++++++++++++++- src/Magpie.Core/EffectDrawer.h | 14 +- src/Magpie.Core/Renderer.cpp | 25 ++- src/Magpie.Core/TextureLoader.cpp | 230 +++++--------------- src/Magpie.Core/TextureLoader.h | 2 +- 8 files changed, 508 insertions(+), 196 deletions(-) diff --git a/src/Magpie.Core/DeviceResources.cpp b/src/Magpie.Core/DeviceResources.cpp index 2c546af52..a7bba703f 100644 --- a/src/Magpie.Core/DeviceResources.cpp +++ b/src/Magpie.Core/DeviceResources.cpp @@ -43,6 +43,85 @@ bool DeviceResources::Initialize(HWND /*hwndScaling*/, const ScalingOptions& opt return true; } +ID3D11SamplerState* DeviceResources::GetSampler(D3D11_FILTER filterMode, D3D11_TEXTURE_ADDRESS_MODE addressMode) noexcept { + auto key = std::make_pair(filterMode, addressMode); + auto it = _samMap.find(key); + if (it != _samMap.end()) { + return it->second.get(); + } + + winrt::com_ptr sam; + + D3D11_SAMPLER_DESC desc{}; + desc.Filter = filterMode; + desc.AddressU = addressMode; + desc.AddressV = addressMode; + desc.AddressW = addressMode; + desc.ComparisonFunc = D3D11_COMPARISON_NEVER; + desc.MinLOD = 0; + desc.MaxLOD = 0; + HRESULT hr = _d3dDevice->CreateSamplerState(&desc, sam.put()); + if (FAILED(hr)) { + Logger::Get().ComError("创建 ID3D11SamplerState 出错", hr); + return nullptr; + } + + return _samMap.emplace(key, std::move(sam)).first->second.get(); +} + +ID3D11RenderTargetView* DeviceResources::GetRenderTargetView(ID3D11Texture2D* texture) noexcept { + auto it = _rtvMap.find(texture); + if (it != _rtvMap.end()) { + return it->second.get(); + } + + winrt::com_ptr rtv; + HRESULT hr = _d3dDevice->CreateRenderTargetView(texture, nullptr, rtv.put()); + if (FAILED(hr)) { + Logger::Get().ComError("CreateRenderTargetView 失败", hr); + return nullptr; + } + + return _rtvMap.emplace(texture, std::move(rtv)).first->second.get(); +} + +ID3D11ShaderResourceView* DeviceResources::GetShaderResourceView(ID3D11Texture2D* texture) noexcept { + auto it = _srvMap.find(texture); + if (it != _srvMap.end()) { + return it->second.get(); + } + + winrt::com_ptr srv; + HRESULT hr = _d3dDevice->CreateShaderResourceView(texture, nullptr, srv.put()); + if (FAILED(hr)) { + Logger::Get().ComError("CreateShaderResourceView 失败", hr); + return nullptr; + } + + return _srvMap.emplace(texture, std::move(srv)).first->second.get(); +} + +ID3D11UnorderedAccessView* DeviceResources::GetUnorderedAccessView(ID3D11Texture2D* texture) noexcept { + auto it = _uavMap.find(texture); + if (it != _uavMap.end()) { + return it->second.get(); + } + + winrt::com_ptr uav; + + D3D11_UNORDERED_ACCESS_VIEW_DESC desc{}; + desc.ViewDimension = D3D11_UAV_DIMENSION_TEXTURE2D; + desc.Texture2D.MipSlice = 0; + + HRESULT hr = _d3dDevice->CreateUnorderedAccessView(texture, &desc, uav.put()); + if (FAILED(hr)) { + Logger::Get().ComError("CreateUnorderedAccessView 失败", hr); + return nullptr; + } + + return _uavMap.emplace(texture, std::move(uav)).first->second.get(); +} + static void LogAdapter(const DXGI_ADAPTER_DESC1& adapterDesc) noexcept { Logger::Get().Info(fmt::format("当前图形适配器:\n\tVendorId:{:#x}\n\tDeviceId:{:#x}\n\t描述:{}", adapterDesc.VendorId, adapterDesc.DeviceId, StrUtils::UTF16ToUTF8(adapterDesc.Description))); diff --git a/src/Magpie.Core/DeviceResources.h b/src/Magpie.Core/DeviceResources.h index 52592531a..624f3d40b 100644 --- a/src/Magpie.Core/DeviceResources.h +++ b/src/Magpie.Core/DeviceResources.h @@ -1,4 +1,5 @@ #pragma once +#include namespace Magpie::Core { @@ -15,12 +16,29 @@ class DeviceResources { ID3D11Device5* GetD3DDevice() const noexcept { return _d3dDevice.get(); } IDXGIAdapter4* GetGraphicsAdapter() const noexcept { return _graphicsAdapter.get(); } + ID3D11SamplerState* GetSampler(D3D11_FILTER filterMode, D3D11_TEXTURE_ADDRESS_MODE addressMode) noexcept; + + ID3D11RenderTargetView* GetRenderTargetView(ID3D11Texture2D* texture) noexcept; + + ID3D11ShaderResourceView* GetShaderResourceView(ID3D11Texture2D* texture) noexcept; + + ID3D11UnorderedAccessView* GetUnorderedAccessView(ID3D11Texture2D* texture) noexcept; + private: bool _ObtainAdapterAndDevice(IDXGIFactory7* dxgiFactory, int adapterIdx) noexcept; bool _TryCreateD3DDevice(const winrt::com_ptr& adapter) noexcept; winrt::com_ptr _graphicsAdapter; winrt::com_ptr _d3dDevice; + + phmap::flat_hash_map> _rtvMap; + phmap::flat_hash_map> _srvMap; + phmap::flat_hash_map> _uavMap; + + phmap::flat_hash_map< + std::pair, + winrt::com_ptr + > _samMap; }; } diff --git a/src/Magpie.Core/EffectCompiler.cpp b/src/Magpie.Core/EffectCompiler.cpp index 487774834..f565bab86 100644 --- a/src/Magpie.Core/EffectCompiler.cpp +++ b/src/Magpie.Core/EffectCompiler.cpp @@ -779,8 +779,8 @@ static uint32_t ResolvePasses( SmallVector& blocks, EffectDesc& desc ) { - // 必选项:IN - // 可选项:OUT, BLOCK_SIZE, NUM_THREADS, STYLE + // 必选项:IN, OUT + // 可选项:BLOCK_SIZE, NUM_THREADS, STYLE // STYLE 为 PS 时不能有 BLOCK_SIZE 或 NUM_THREADS std::string_view token; @@ -817,7 +817,7 @@ static uint32_t ResolvePasses( std::sort( passNumbers.begin(), passNumbers.end(), - [](const auto& l, const auto& r) {return l.first < r.first; } + [](const auto& l, const auto& r) { return l.first < r.first; } ); { @@ -1030,6 +1030,11 @@ static uint32_t ResolvePasses( } } + // 必须指定 INPUT 和 OUTPUT + if (!processed[0] || !processed[1]) { + return 1; + } + if (passDesc.isPSStyle) { if (processed[2] || processed[3]) { return 1; diff --git a/src/Magpie.Core/EffectDrawer.cpp b/src/Magpie.Core/EffectDrawer.cpp index 579a13f96..1022e42b8 100644 --- a/src/Magpie.Core/EffectDrawer.cpp +++ b/src/Magpie.Core/EffectDrawer.cpp @@ -1,16 +1,331 @@ #include "pch.h" #include "EffectDrawer.h" #include "ScalingOptions.h" +#include "Win32Utils.h" +#include "Logger.h" +#include "DeviceResources.h" +#include "StrUtils.h" +#include "TextureLoader.h" +#include "EffectHelper.h" +#include "DirectXHelper.h" + +#pragma push_macro("_UNICODE") +// Conan 的 muparser 不含 UNICODE 支持 +#undef _UNICODE +#pragma warning(push) +#pragma warning(disable: 4310) // 类型强制转换截断常量值 +#include +#pragma warning(push) +#pragma pop_macro("_UNICODE") namespace Magpie::Core { bool EffectDrawer::Initialize( - const EffectDesc& /*desc*/, - const EffectOption& /*option*/, - ID3D11Texture2D* /*inputTex*/, - RECT* /*outputRect*/, - RECT* /*virtualOutputRect*/ + const EffectDesc& desc, + const EffectOption& option, + ID3D11Texture2D* inputTex, + DeviceResources& deviceResources, + SIZE scalingWndSize ) noexcept { + SIZE inputSize{}; + { + D3D11_TEXTURE2D_DESC inputDesc; + inputTex->GetDesc(&inputDesc); + inputSize = { (LONG)inputDesc.Width, (LONG)inputDesc.Height }; + } + + const bool isInlineParams = desc.flags & EffectFlags::InlineParams; + + static mu::Parser exprParser; + exprParser.DefineConst("INPUT_WIDTH", inputSize.cx); + exprParser.DefineConst("INPUT_HEIGHT", inputSize.cy); + + SIZE outputSize{}; + + const auto& outputSizeExpr = desc.GetOutputSizeExpr(); + + if (outputSizeExpr.first.empty()) { + switch (option.scalingType) { + case ScalingType::Normal: + { + outputSize.cx = std::lroundf(inputSize.cx * option.scale.first); + outputSize.cy = std::lroundf(inputSize.cy * option.scale.second); + break; + } + case ScalingType::Fit: + { + float fillScale = std::min( + float(scalingWndSize.cx) / inputSize.cx, + float(scalingWndSize.cy) / inputSize.cy + ); + outputSize.cx = std::lroundf(inputSize.cx * fillScale * option.scale.first); + outputSize.cy = std::lroundf(inputSize.cy * fillScale * option.scale.second); + break; + } + case ScalingType::Absolute: + { + outputSize.cx = std::lroundf(option.scale.first); + outputSize.cy = std::lroundf(option.scale.second); + break; + } + case ScalingType::Fill: + { + outputSize = scalingWndSize; + break; + } + } + } else { + assert(!outputSizeExpr.second.empty()); + + try { + exprParser.SetExpr(outputSizeExpr.first); + outputSize.cx = std::lround(exprParser.Eval()); + + exprParser.SetExpr(outputSizeExpr.second); + outputSize.cy = std::lround(exprParser.Eval()); + } catch (const mu::ParserError& e) { + Logger::Get().Error(fmt::format("计算输出尺寸 {} 失败:{}", e.GetExpr(), e.GetMsg())); + return false; + } + } + + if (outputSize.cx <= 0 || outputSize.cy <= 0) { + Logger::Get().Error("非法的输出尺寸"); + return false; + } + + exprParser.DefineConst("OUTPUT_WIDTH", outputSize.cx); + exprParser.DefineConst("OUTPUT_HEIGHT", outputSize.cy); + + _samplers.resize(desc.samplers.size()); + for (UINT i = 0; i < _samplers.size(); ++i) { + const EffectSamplerDesc& samDesc = desc.samplers[i]; + _samplers[i] = deviceResources.GetSampler( + samDesc.filterType == EffectSamplerFilterType::Linear ? D3D11_FILTER_MIN_MAG_MIP_LINEAR : D3D11_FILTER_MIN_MAG_MIP_POINT, + samDesc.addressType == EffectSamplerAddressType::Clamp ? D3D11_TEXTURE_ADDRESS_CLAMP : D3D11_TEXTURE_ADDRESS_WRAP + ); + + if (!_samplers[i]) { + Logger::Get().Error(fmt::format("创建采样器 {} 失败", samDesc.name)); + return false; + } + } + + // 创建中间纹理 + // 第一个为 INPUT,第二个为 OUTPUT + _textures.resize(desc.textures.size()); + _textures[0].copy_from(inputTex); + + // 创建输出纹理 + _textures.back() = DirectXHelper::CreateTexture2D( + deviceResources.GetD3DDevice(), + DXGI_FORMAT_R8G8B8A8_UNORM, + outputSize.cx, + outputSize.cy, + D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_UNORDERED_ACCESS + ); + + if (!_textures.back()) { + Logger::Get().Error("创建纹理失败"); + return false; + } + + for (size_t i = 2; i < desc.textures.size(); ++i) { + const EffectIntermediateTextureDesc& texDesc = desc.textures[i]; + + if (!texDesc.source.empty()) { + // 从文件加载纹理 + size_t delimPos = desc.name.find_last_of('\\'); + std::string texPath = delimPos == std::string::npos + ? StrUtils::Concat("effects\\", texDesc.source) + : StrUtils::Concat("effects\\", std::string_view(desc.name.c_str(), delimPos + 1), texDesc.source); + _textures[i] = TextureLoader::Load( + StrUtils::UTF8ToUTF16(texPath).c_str(), deviceResources.GetD3DDevice()); + if (!_textures[i]) { + Logger::Get().Error(fmt::format("加载纹理 {} 失败", texDesc.source)); + return false; + } + + if (texDesc.format != EffectIntermediateTextureFormat::UNKNOWN) { + // 检查纹理格式是否匹配 + D3D11_TEXTURE2D_DESC srcDesc{}; + _textures[i]->GetDesc(&srcDesc); + if (srcDesc.Format != EffectHelper::FORMAT_DESCS[(UINT)texDesc.format].dxgiFormat) { + Logger::Get().Error("SOURCE 纹理格式不匹配"); + return false; + } + } + + } else { + SIZE texSize{}; + try { + exprParser.SetExpr(texDesc.sizeExpr.first); + texSize.cx = std::lround(exprParser.Eval()); + exprParser.SetExpr(texDesc.sizeExpr.second); + texSize.cy = std::lround(exprParser.Eval()); + } catch (const mu::ParserError& e) { + Logger::Get().Error(fmt::format("计算中间纹理尺寸 {} 失败:{}", e.GetExpr(), e.GetMsg())); + return false; + } + + if (texSize.cx <= 0 || texSize.cy <= 0) { + Logger::Get().Error("非法的中间纹理尺寸"); + return false; + } + + _textures[i] = DirectXHelper::CreateTexture2D( + deviceResources.GetD3DDevice(), + EffectHelper::FORMAT_DESCS[(UINT)texDesc.format].dxgiFormat, + texSize.cx, + texSize.cy, + D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_UNORDERED_ACCESS + ); + if (!_textures[i]) { + Logger::Get().Error("创建纹理失败"); + return false; + } + } + } + + _shaders.resize(desc.passes.size()); + _srvs.resize(desc.passes.size()); + _uavs.resize(desc.passes.size()); + for (UINT i = 0; i < _shaders.size(); ++i) { + const EffectPassDesc& passDesc = desc.passes[i]; + + HRESULT hr = deviceResources.GetD3DDevice()->CreateComputeShader( + passDesc.cso->GetBufferPointer(), passDesc.cso->GetBufferSize(), nullptr, _shaders[i].put()); + if (FAILED(hr)) { + Logger::Get().ComError("创建计算着色器失败", hr); + return false; + } + + _srvs[i].resize(passDesc.inputs.size()); + for (UINT j = 0; j < passDesc.inputs.size(); ++j) { + auto srv = _srvs[i][j] = deviceResources.GetShaderResourceView(_textures[passDesc.inputs[j]].get()); + if (!srv) { + Logger::Get().Error("GetShaderResourceView 失败"); + return false; + } + } + + _uavs[i].resize(passDesc.outputs.size() * 2); + for (UINT j = 0; j < passDesc.outputs.size(); ++j) { + auto uav = _uavs[i][j] = deviceResources.GetUnorderedAccessView(_textures[passDesc.outputs[j]].get()); + if (!uav) { + Logger::Get().Error("GetUnorderedAccessView 失败"); + return false; + } + } + + D3D11_TEXTURE2D_DESC outputDesc; + _textures[passDesc.outputs[0]]->GetDesc(&outputDesc); + _dispatches.emplace_back( + (outputDesc.Width + passDesc.blockSize.first - 1) / passDesc.blockSize.first, + (outputDesc.Height + passDesc.blockSize.second - 1) / passDesc.blockSize.second + ); + } + + // 大小必须为 4 的倍数 + const size_t builtinConstantCount = 10; + size_t psStylePassParams = 0; + for (UINT i = 0, end = (UINT)desc.passes.size() - 1; i < end; ++i) { + if (desc.passes[i].isPSStyle) { + psStylePassParams += 4; + } + } + _constants.resize((builtinConstantCount + psStylePassParams + (isInlineParams ? 0 : desc.params.size()) + 3) / 4 * 4); + // cbuffer __CB2 : register(b1) { + // uint2 __inputSize; + // uint2 __outputSize; + // float2 __inputPt; + // float2 __outputPt; + // float2 __scale; + // [PARAMETERS...] + // ); + _constants[0].uintVal = inputSize.cx; + _constants[1].uintVal = inputSize.cy; + _constants[2].uintVal = outputSize.cx; + _constants[3].uintVal = outputSize.cy; + _constants[4].floatVal = 1.0f / inputSize.cx; + _constants[5].floatVal = 1.0f / inputSize.cy; + _constants[6].floatVal = 1.0f / outputSize.cx; + _constants[7].floatVal = 1.0f / outputSize.cy; + _constants[8].floatVal = outputSize.cx / (FLOAT)inputSize.cx; + _constants[9].floatVal = outputSize.cy / (FLOAT)inputSize.cy; + + // PS 样式的通道需要的参数 + EffectHelper::Constant32* pCurParam = _constants.data() + builtinConstantCount; + if (psStylePassParams > 0) { + for (UINT i = 0, end = (UINT)desc.passes.size() - 1; i < end; ++i) { + if (desc.passes[i].isPSStyle) { + D3D11_TEXTURE2D_DESC outputDesc; + _textures[desc.passes[i].outputs[0]]->GetDesc(&outputDesc); + pCurParam->uintVal = outputDesc.Width; + ++pCurParam; + pCurParam->uintVal = outputDesc.Height; + ++pCurParam; + pCurParam->floatVal = 1.0f / outputDesc.Width; + ++pCurParam; + pCurParam->floatVal = 1.0f / outputDesc.Height; + ++pCurParam; + } + } + } + + if (!isInlineParams) { + for (UINT i = 0; i < desc.params.size(); ++i) { + const auto& paramDesc = desc.params[i]; + auto it = option.parameters.find(StrUtils::UTF8ToUTF16(paramDesc.name)); + + if (paramDesc.constant.index() == 0) { + const EffectConstant& constant = std::get<0>(paramDesc.constant); + float value = constant.defaultValue; + + if (it != option.parameters.end()) { + value = it->second; + + if (value < constant.minValue || value > constant.maxValue) { + Logger::Get().Error(fmt::format("参数 {} 的值非法", paramDesc.name)); + return false; + } + } + + pCurParam->floatVal = value; + } else { + const EffectConstant& constant = std::get<1>(paramDesc.constant); + int value = constant.defaultValue; + + if (it != option.parameters.end()) { + value = (int)std::lroundf(it->second); + + if ((value < constant.minValue) || (value > constant.maxValue)) { + Logger::Get().Error(StrUtils::Concat("参数 ", paramDesc.name, " 的值非法")); + return false; + } + } + + pCurParam->intVal = value; + } + + ++pCurParam; + } + } + + D3D11_BUFFER_DESC bd{}; + bd.Usage = D3D11_USAGE_DEFAULT; + bd.ByteWidth = 4 * (UINT)_constants.size(); + bd.BindFlags = D3D11_BIND_CONSTANT_BUFFER; + + D3D11_SUBRESOURCE_DATA initData{}; + initData.pSysMem = _constants.data(); + + HRESULT hr = deviceResources.GetD3DDevice()->CreateBuffer(&bd, &initData, _constantBuffer.put()); + if (FAILED(hr)) { + Logger::Get().ComError("CreateBuffer 失败", hr); + return false; + } + return true; } diff --git a/src/Magpie.Core/EffectDrawer.h b/src/Magpie.Core/EffectDrawer.h index b94c8c5b6..8601d6d91 100644 --- a/src/Magpie.Core/EffectDrawer.h +++ b/src/Magpie.Core/EffectDrawer.h @@ -1,9 +1,12 @@ #pragma once #include "EffectDesc.h" +#include "SmallVector.h" +#include "EffectHelper.h" namespace Magpie::Core { struct EffectOption; +class DeviceResources; class EffectDrawer { public: @@ -15,8 +18,8 @@ class EffectDrawer { const EffectDesc& desc, const EffectOption& option, ID3D11Texture2D* inputTex, - RECT* outputRect = nullptr, - RECT* virtualOutputRect = nullptr + DeviceResources& deviceResources, + SIZE scalingWndSize ) noexcept; ID3D11Texture2D* GetOutputTexture() const noexcept { @@ -29,6 +32,13 @@ class EffectDrawer { std::vector> _srvs; // 后半部分为空,用于解绑 std::vector> _uavs; + + SmallVector _constants; + winrt::com_ptr _constantBuffer; + + SmallVector> _shaders; + + SmallVector> _dispatches; }; } diff --git a/src/Magpie.Core/Renderer.cpp b/src/Magpie.Core/Renderer.cpp index b1fba90d2..d8712b8c6 100644 --- a/src/Magpie.Core/Renderer.cpp +++ b/src/Magpie.Core/Renderer.cpp @@ -124,9 +124,9 @@ static std::optional CompileEffect( static std::vector BuildEffects( const ScalingOptions& scalingOptions, + DeviceResources& deviceResources, ID3D11Texture2D* inputTex, - RECT& outputRect, - RECT& virtualOutputRect + const RECT& scalingWndRect ) noexcept { assert(!scalingOptions.effects.empty()); @@ -165,15 +165,15 @@ static std::vector BuildEffects( }*/ effectDrawers.resize(scalingOptions.effects.size()); - for (uint32_t i = 0; i < effectCount; ++i) { - bool isLastEffect = i == effectCount - 1; + SIZE scalingWndSize = Win32Utils::GetSizeOfRect(scalingWndRect); + for (uint32_t i = 0; i < effectCount; ++i) { if (!effectDrawers[i].Initialize( effectDescs[i], scalingOptions.effects[i], effectInput, - isLastEffect ? &outputRect : nullptr, - isLastEffect ? &virtualOutputRect : nullptr + deviceResources, + scalingWndSize )) { Logger::Get().Error(fmt::format("初始化效果#{} ({}) 失败", i, StrUtils::UTF16ToUTF8(scalingOptions.effects[i].name))); return {}; @@ -262,10 +262,15 @@ void Renderer::_BackendThreadProc(HWND hwndSrc, HWND hwndScaling, const ScalingO return; } - RECT outputRect; - RECT virtualOutputRect; - std::vector effectDrawers = - BuildEffects(options, frameSource->GetOutput(), outputRect, virtualOutputRect); + RECT scalingWndRect; + GetWindowRect(hwndScaling, &scalingWndRect); + + std::vector effectDrawers = BuildEffects( + options, + deviceResources, + frameSource->GetOutput(), + scalingWndRect + ); MSG msg; while (GetMessage(&msg, NULL, 0, 0)) { diff --git a/src/Magpie.Core/TextureLoader.cpp b/src/Magpie.Core/TextureLoader.cpp index ba7211fa1..7ef8ded28 100644 --- a/src/Magpie.Core/TextureLoader.cpp +++ b/src/Magpie.Core/TextureLoader.cpp @@ -1,13 +1,11 @@ #include "pch.h" #include "TextureLoader.h" -//#include "DeviceResources.h" -//#include "MagApp.h" #include "Logger.h" #include "DDS.h" #include "DDSLoderHelpers.h" #include "Utils.h" #include - +#include "DirectXHelper.h" /////////////////////////////////////////////////////////////////// // 读取 DDS 文件的代码取自 https://github.com/microsoft/DirectXTK // @@ -16,7 +14,7 @@ namespace Magpie::Core { -HRESULT CreateD3DResources( +static HRESULT CreateD3DResources( _In_ ID3D11Device* d3dDevice, _In_ uint32_t resDim, _In_ size_t width, @@ -211,7 +209,7 @@ HRESULT CreateD3DResources( return hr; } -HRESULT FillInitData( +static HRESULT FillInitData( _In_ size_t width, _In_ size_t height, _In_ size_t depth, @@ -295,9 +293,8 @@ HRESULT FillInitData( return (index > 0) ? S_OK : E_FAIL; } -HRESULT CreateTextureFromDDS( +static HRESULT CreateTextureFromDDS( _In_ ID3D11Device* d3dDevice, - _In_opt_ ID3D11DeviceContext* d3dContext, _In_ const DDS_HEADER* header, _In_reads_bytes_(bitSize) const uint8_t* bitData, _In_ size_t bitSize, @@ -479,163 +476,48 @@ HRESULT CreateTextureFromDDS( return HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED); } - bool autogen = false; - if (mipCount == 1 && d3dContext && textureView) // Must have context and shader-view to auto generate mipmaps - { - // See if format is supported for auto-gen mipmaps (varies by feature level) - UINT fmtSupport = 0; - hr = d3dDevice->CheckFormatSupport(format, &fmtSupport); - if (SUCCEEDED(hr) && (fmtSupport & D3D11_FORMAT_SUPPORT_MIP_AUTOGEN)) { - // 10level9 feature levels do not support auto-gen mipgen for volume textures - if ((resDim != D3D11_RESOURCE_DIMENSION_TEXTURE3D) - || (d3dDevice->GetFeatureLevel() >= D3D_FEATURE_LEVEL_10_0)) { - autogen = true; - } - } + // Create the texture + std::unique_ptr initData(new (std::nothrow) D3D11_SUBRESOURCE_DATA[mipCount * arraySize]); + if (!initData) { + return E_OUTOFMEMORY; } - if (autogen) { - // Create texture with auto-generated mipmaps - ID3D11Resource* tex = nullptr; + size_t skipMip = 0; + size_t twidth = 0; + size_t theight = 0; + size_t tdepth = 0; + hr = FillInitData(width, height, depth, mipCount, arraySize, format, + maxsize, bitSize, bitData, + twidth, theight, tdepth, skipMip, initData.get()); + + if (SUCCEEDED(hr)) { hr = CreateD3DResources(d3dDevice, - resDim, width, height, depth, 0, arraySize, + resDim, twidth, theight, tdepth, mipCount - skipMip, arraySize, format, - usage, - bindFlags | D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_RENDER_TARGET, - cpuAccessFlags, - miscFlags | D3D11_RESOURCE_MISC_GENERATE_MIPS, forceSRGB, + usage, bindFlags, cpuAccessFlags, miscFlags, + forceSRGB, isCubeMap, - nullptr, - &tex, textureView); - if (SUCCEEDED(hr)) { - size_t numBytes = 0; - size_t rowBytes = 0; - hr = GetSurfaceInfo(width, height, format, &numBytes, &rowBytes, nullptr); - if (FAILED(hr)) - return hr; - - if (numBytes > bitSize) { - (*textureView)->Release(); - *textureView = nullptr; - tex->Release(); - return HRESULT_FROM_WIN32(ERROR_HANDLE_EOF); - } - - if (numBytes > UINT32_MAX || rowBytes > UINT32_MAX) - return HRESULT_FROM_WIN32(ERROR_ARITHMETIC_OVERFLOW); - - D3D11_SHADER_RESOURCE_VIEW_DESC desc = {}; - (*textureView)->GetDesc(&desc); - - UINT mipLevels = 1; - - switch (desc.ViewDimension) { - case D3D_SRV_DIMENSION_TEXTURE1D: mipLevels = desc.Texture1D.MipLevels; break; - case D3D_SRV_DIMENSION_TEXTURE1DARRAY: mipLevels = desc.Texture1DArray.MipLevels; break; - case D3D_SRV_DIMENSION_TEXTURE2D: mipLevels = desc.Texture2D.MipLevels; break; - case D3D_SRV_DIMENSION_TEXTURE2DARRAY: mipLevels = desc.Texture2DArray.MipLevels; break; - case D3D_SRV_DIMENSION_TEXTURECUBE: mipLevels = desc.TextureCube.MipLevels; break; - case D3D_SRV_DIMENSION_TEXTURECUBEARRAY:mipLevels = desc.TextureCubeArray.MipLevels; break; - case D3D_SRV_DIMENSION_TEXTURE3D: mipLevels = desc.Texture3D.MipLevels; break; - default: - (*textureView)->Release(); - *textureView = nullptr; - tex->Release(); - return E_UNEXPECTED; - } - - if (arraySize > 1) { - const uint8_t* pSrcBits = bitData; - const uint8_t* pEndBits = bitData + bitSize; - for (UINT item = 0; item < arraySize; ++item) { - if ((pSrcBits + numBytes) > pEndBits) { - (*textureView)->Release(); - *textureView = nullptr; - tex->Release(); - return HRESULT_FROM_WIN32(ERROR_HANDLE_EOF); - } - - const UINT res = D3D11CalcSubresource(0, item, mipLevels); - d3dContext->UpdateSubresource(tex, res, nullptr, pSrcBits, static_cast(rowBytes), static_cast(numBytes)); - pSrcBits += numBytes; - } - } else { - d3dContext->UpdateSubresource(tex, 0, nullptr, bitData, static_cast(rowBytes), static_cast(numBytes)); - } - - d3dContext->GenerateMips(*textureView); - - if (texture) { - *texture = tex; - } else { - tex->Release(); - } - } - } else { - // Create the texture - std::unique_ptr initData(new (std::nothrow) D3D11_SUBRESOURCE_DATA[mipCount * arraySize]); - if (!initData) { - return E_OUTOFMEMORY; - } - - size_t skipMip = 0; - size_t twidth = 0; - size_t theight = 0; - size_t tdepth = 0; - hr = FillInitData(width, height, depth, mipCount, arraySize, format, - maxsize, bitSize, bitData, - twidth, theight, tdepth, skipMip, initData.get()); - - if (SUCCEEDED(hr)) { - hr = CreateD3DResources(d3dDevice, - resDim, twidth, theight, tdepth, mipCount - skipMip, arraySize, - format, - usage, bindFlags, cpuAccessFlags, miscFlags, - forceSRGB, - isCubeMap, - initData.get(), - texture, textureView); - - if (FAILED(hr) && !maxsize && (mipCount > 1)) { - // Retry with a maxsize determined by feature level - switch (d3dDevice->GetFeatureLevel()) { - case D3D_FEATURE_LEVEL_9_1: - case D3D_FEATURE_LEVEL_9_2: - if (isCubeMap) { - maxsize = 512u /*D3D_FL9_1_REQ_TEXTURECUBE_DIMENSION*/; - } else { - maxsize = (resDim == D3D11_RESOURCE_DIMENSION_TEXTURE3D) - ? 256u /*D3D_FL9_1_REQ_TEXTURE3D_U_V_OR_W_DIMENSION*/ - : 2048u /*D3D_FL9_1_REQ_TEXTURE2D_U_OR_V_DIMENSION*/; - } - break; - - case D3D_FEATURE_LEVEL_9_3: - maxsize = (resDim == D3D11_RESOURCE_DIMENSION_TEXTURE3D) - ? 256u /*D3D_FL9_1_REQ_TEXTURE3D_U_V_OR_W_DIMENSION*/ - : 4096u /*D3D_FL9_3_REQ_TEXTURE2D_U_OR_V_DIMENSION*/; - break; - - default: // D3D_FEATURE_LEVEL_10_0 & D3D_FEATURE_LEVEL_10_1 - maxsize = (resDim == D3D11_RESOURCE_DIMENSION_TEXTURE3D) - ? 2048u /*D3D10_REQ_TEXTURE3D_U_V_OR_W_DIMENSION*/ - : 8192u /*D3D10_REQ_TEXTURE2D_U_OR_V_DIMENSION*/; - break; - } - - hr = FillInitData(width, height, depth, mipCount, arraySize, format, - maxsize, bitSize, bitData, - twidth, theight, tdepth, skipMip, initData.get()); - if (SUCCEEDED(hr)) { - hr = CreateD3DResources(d3dDevice, - resDim, twidth, theight, tdepth, mipCount - skipMip, arraySize, - format, - usage, bindFlags, cpuAccessFlags, miscFlags, - forceSRGB, - isCubeMap, - initData.get(), - texture, textureView); - } + initData.get(), + texture, textureView); + + if (FAILED(hr) && !maxsize && (mipCount > 1)) { + // Retry with a maxsize determined by feature level + maxsize = (resDim == D3D11_RESOURCE_DIMENSION_TEXTURE3D) + ? D3D11_REQ_TEXTURE3D_U_V_OR_W_DIMENSION + : D3D11_REQ_TEXTURE2D_U_OR_V_DIMENSION; + + hr = FillInitData(width, height, depth, mipCount, arraySize, format, + maxsize, bitSize, bitData, + twidth, theight, tdepth, skipMip, initData.get()); + if (SUCCEEDED(hr)) { + hr = CreateD3DResources(d3dDevice, + resDim, twidth, theight, tdepth, mipCount - skipMip, arraySize, + format, + usage, bindFlags, cpuAccessFlags, miscFlags, + forceSRGB, + isCubeMap, + initData.get(), + texture, textureView); } } } @@ -643,7 +525,7 @@ HRESULT CreateTextureFromDDS( return hr; } -HRESULT CreateDDSTextureFromFileEx( +static HRESULT CreateDDSTextureFromFileEx( ID3D11Device* d3dDevice, const wchar_t* fileName, size_t maxsize, @@ -688,7 +570,7 @@ HRESULT CreateDDSTextureFromFileEx( return hr; } - hr = CreateTextureFromDDS(d3dDevice, nullptr, + hr = CreateTextureFromDDS(d3dDevice, header, bitData, bitSize, maxsize, usage, bindFlags, cpuAccessFlags, miscFlags, @@ -703,7 +585,7 @@ HRESULT CreateDDSTextureFromFileEx( return hr; } -winrt::com_ptr LoadImg(const wchar_t* fileName) { +static winrt::com_ptr LoadImg(const wchar_t* fileName, ID3D11Device* d3dDevice) noexcept { winrt::com_ptr wicImgFactory = winrt::try_create_instance(CLSID_WICImagingFactory); if (!wicImgFactory) { @@ -801,13 +683,12 @@ winrt::com_ptr LoadImg(const wchar_t* fileName) { return nullptr; } - return {}; - - /*D3D11_SUBRESOURCE_DATA initData{}; + D3D11_SUBRESOURCE_DATA initData{}; initData.pSysMem = buf.get(); initData.SysMemPitch = stride; - winrt::com_ptr result = MagApp::Get().GetDeviceResources().CreateTexture2D( + winrt::com_ptr result = DirectXHelper::CreateTexture2D( + d3dDevice, useFloatFormat ? DXGI_FORMAT_R16G16B16A16_FLOAT : DXGI_FORMAT_R8G8B8A8_UNORM, width, height, @@ -821,16 +702,15 @@ winrt::com_ptr LoadImg(const wchar_t* fileName) { return nullptr; } - return result;*/ + return result; } -winrt::com_ptr LoadDDS(const wchar_t* /*fileName*/) { - return {}; - /*winrt::com_ptr result; +static winrt::com_ptr LoadDDS(const wchar_t* fileName, ID3D11Device* d3dDevice) noexcept { + winrt::com_ptr result; DDS_ALPHA_MODE alphaMode = DDS_ALPHA_MODE_STRAIGHT; HRESULT hr = CreateDDSTextureFromFileEx( - MagApp::Get().GetDeviceResources().GetD3DDevice(), + d3dDevice, fileName, 0, D3D11_USAGE_IMMUTABLE, @@ -853,10 +733,10 @@ winrt::com_ptr LoadDDS(const wchar_t* /*fileName*/) { return nullptr; } - return tex;*/ + return tex; } -winrt::com_ptr TextureLoader::Load(const wchar_t* fileName) { +winrt::com_ptr TextureLoader::Load(const wchar_t* fileName, ID3D11Device* d3dDevice) noexcept { std::wstring_view sv(fileName); size_t npos = sv.find_last_of(L'.'); if (npos == std::wstring_view::npos) { @@ -867,13 +747,13 @@ winrt::com_ptr TextureLoader::Load(const wchar_t* fileName) { std::wstring_view suffix = sv.substr(npos + 1); if (suffix == L"dds") { - return LoadDDS(fileName); + return LoadDDS(fileName, d3dDevice); } if (suffix == L"bmp" || suffix == L"jpg" || suffix == L"jpeg" || suffix == L"png" || suffix == L"tif" || suffix == L"tiff" ) { - return LoadImg(fileName); + return LoadImg(fileName, d3dDevice); } return nullptr; diff --git a/src/Magpie.Core/TextureLoader.h b/src/Magpie.Core/TextureLoader.h index d3d561ef1..78ec723a2 100644 --- a/src/Magpie.Core/TextureLoader.h +++ b/src/Magpie.Core/TextureLoader.h @@ -4,7 +4,7 @@ namespace Magpie::Core { class TextureLoader { public: - static winrt::com_ptr Load(const wchar_t* fileName); + static winrt::com_ptr Load(const wchar_t* fileName, ID3D11Device* d3dDevice) noexcept; }; } From 5755edd0ff25e8eeca17a2b6f66adfdb98a499f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=97=AD?= <34770031+Blinue@users.noreply.github.com> Date: Sun, 11 Jun 2023 23:53:30 +0800 Subject: [PATCH 015/155] =?UTF-8?q?chore:=20=E4=BF=AE=E6=AD=A3=E6=B3=A8?= =?UTF-8?q?=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Magpie.Core/EffectDrawer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Magpie.Core/EffectDrawer.cpp b/src/Magpie.Core/EffectDrawer.cpp index 1022e42b8..525155e7a 100644 --- a/src/Magpie.Core/EffectDrawer.cpp +++ b/src/Magpie.Core/EffectDrawer.cpp @@ -235,7 +235,7 @@ bool EffectDrawer::Initialize( } } _constants.resize((builtinConstantCount + psStylePassParams + (isInlineParams ? 0 : desc.params.size()) + 3) / 4 * 4); - // cbuffer __CB2 : register(b1) { + // cbuffer __CB1 : register(b0) { // uint2 __inputSize; // uint2 __outputSize; // float2 __inputPt; From 8453f717eac767f4a9cf00c4d39eb6af75fead74 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=97=AD?= Date: Mon, 12 Jun 2023 12:00:42 +0800 Subject: [PATCH 016/155] =?UTF-8?q?refactor:=20=E6=8B=86=E5=88=86=20Effect?= =?UTF-8?q?Drawer::Initialize?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/MagpieFX.md | 4 +- src/Magpie.Core/EffectDrawer.cpp | 71 ++++++++++++++++++++++---------- src/Magpie.Core/EffectDrawer.h | 8 ++++ 3 files changed, 58 insertions(+), 25 deletions(-) diff --git a/docs/MagpieFX.md b/docs/MagpieFX.md index af9911877..021b857b3 100644 --- a/docs/MagpieFX.md +++ b/docs/MagpieFX.md @@ -119,7 +119,7 @@ float4 Pass1(float2 pos) { // BLOCK_SIZE 指定一次 dispatch 处理多大的区域 // 可以只有一维,即同时指定长和高 //!BLOCK_SIZE 16, 16 -// NUM_THREADS 指定一次 dispatch 有多少并行线 +// NUM_THREADS 指定一次 dispatch 有多少并行线程 // 可以少于三维,缺少的维数默认为 1 //!NUM_THREADS 64, 1, 1 @@ -158,8 +158,6 @@ void Pass2(uint2 blockStart, uint3 threadId) { **MP_DEBUG**:当前是否为调试模式(调试模式下编译的着色器不进行优化且含有调试信息) -**MP_LAST_PASS**:当前通道是否是当前效果的最后一个通道 - **MP_FP16**:当前是否使用半精度浮点数(由用户指定) **MF、MF1、MF2、...、MF4x4**:遵守 fp16 参数的浮点数类型。当未指定 fp16,它们为 float... 的别名,否则为 min16float... 的别名 diff --git a/src/Magpie.Core/EffectDrawer.cpp b/src/Magpie.Core/EffectDrawer.cpp index 525155e7a..4cebdc0dd 100644 --- a/src/Magpie.Core/EffectDrawer.cpp +++ b/src/Magpie.Core/EffectDrawer.cpp @@ -20,30 +20,15 @@ namespace Magpie::Core { -bool EffectDrawer::Initialize( - const EffectDesc& desc, +static SIZE CalcOutputSize( + const std::pair& outputSizeExpr, const EffectOption& option, - ID3D11Texture2D* inputTex, - DeviceResources& deviceResources, - SIZE scalingWndSize + SIZE scalingWndSize, + SIZE inputSize, + mu::Parser& exprParser ) noexcept { - SIZE inputSize{}; - { - D3D11_TEXTURE2D_DESC inputDesc; - inputTex->GetDesc(&inputDesc); - inputSize = { (LONG)inputDesc.Width, (LONG)inputDesc.Height }; - } - - const bool isInlineParams = desc.flags & EffectFlags::InlineParams; - - static mu::Parser exprParser; - exprParser.DefineConst("INPUT_WIDTH", inputSize.cx); - exprParser.DefineConst("INPUT_HEIGHT", inputSize.cy); - SIZE outputSize{}; - const auto& outputSizeExpr = desc.GetOutputSizeExpr(); - if (outputSizeExpr.first.empty()) { switch (option.scalingType) { case ScalingType::Normal: @@ -54,7 +39,7 @@ bool EffectDrawer::Initialize( } case ScalingType::Fit: { - float fillScale = std::min( + const float fillScale = std::min( float(scalingWndSize.cx) / inputSize.cx, float(scalingWndSize.cy) / inputSize.cy ); @@ -73,6 +58,9 @@ bool EffectDrawer::Initialize( outputSize = scalingWndSize; break; } + default: + assert(false); + break; } } else { assert(!outputSizeExpr.second.empty()); @@ -85,10 +73,32 @@ bool EffectDrawer::Initialize( outputSize.cy = std::lround(exprParser.Eval()); } catch (const mu::ParserError& e) { Logger::Get().Error(fmt::format("计算输出尺寸 {} 失败:{}", e.GetExpr(), e.GetMsg())); - return false; + return {}; } } + return outputSize; +} + +bool EffectDrawer::Initialize( + const EffectDesc& desc, + const EffectOption& option, + ID3D11Texture2D* inputTex, + DeviceResources& deviceResources, + SIZE scalingWndSize +) noexcept { + SIZE inputSize{}; + { + D3D11_TEXTURE2D_DESC inputDesc; + inputTex->GetDesc(&inputDesc); + inputSize = { (LONG)inputDesc.Width, (LONG)inputDesc.Height }; + } + + static mu::Parser exprParser; + exprParser.DefineConst("INPUT_WIDTH", inputSize.cx); + exprParser.DefineConst("INPUT_HEIGHT", inputSize.cy); + + const SIZE outputSize = CalcOutputSize(desc.GetOutputSizeExpr(), option, scalingWndSize, inputSize, exprParser); if (outputSize.cx <= 0 || outputSize.cy <= 0) { Logger::Get().Error("非法的输出尺寸"); return false; @@ -226,6 +236,23 @@ bool EffectDrawer::Initialize( ); } + if (!_InitializeConstants(desc, option, deviceResources, inputSize, outputSize)) { + Logger::Get().Error("_InitializeConstants 失败"); + return false; + } + + return true; +} + +bool EffectDrawer::_InitializeConstants( + const EffectDesc& desc, + const EffectOption& option, + DeviceResources& deviceResources, + SIZE inputSize, + SIZE outputSize +) noexcept { + const bool isInlineParams = desc.flags & EffectFlags::InlineParams; + // 大小必须为 4 的倍数 const size_t builtinConstantCount = 10; size_t psStylePassParams = 0; diff --git a/src/Magpie.Core/EffectDrawer.h b/src/Magpie.Core/EffectDrawer.h index 8601d6d91..23c598990 100644 --- a/src/Magpie.Core/EffectDrawer.h +++ b/src/Magpie.Core/EffectDrawer.h @@ -27,6 +27,14 @@ class EffectDrawer { } private: + bool _InitializeConstants( + const EffectDesc& desc, + const EffectOption& option, + DeviceResources& deviceResources, + SIZE inputSize, + SIZE outputSize + ) noexcept; + SmallVector _samplers; SmallVector> _textures; std::vector> _srvs; From 09251b28a9f4d589b036a29ae6363fb12c061ddf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=97=AD?= Date: Mon, 12 Jun 2023 17:07:48 +0800 Subject: [PATCH 017/155] =?UTF-8?q?feat:=20=E5=90=8E=E7=AB=AF=E6=B8=B2?= =?UTF-8?q?=E6=9F=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Magpie.Core/EffectDrawer.cpp | 39 ++++++-- src/Magpie.Core/EffectDrawer.h | 12 +-- src/Magpie.Core/Renderer.cpp | 156 +++++++++++++++++++------------ src/Magpie.Core/Renderer.h | 27 +++++- 4 files changed, 159 insertions(+), 75 deletions(-) diff --git a/src/Magpie.Core/EffectDrawer.cpp b/src/Magpie.Core/EffectDrawer.cpp index 4cebdc0dd..47248b6c9 100644 --- a/src/Magpie.Core/EffectDrawer.cpp +++ b/src/Magpie.Core/EffectDrawer.cpp @@ -83,14 +83,14 @@ static SIZE CalcOutputSize( bool EffectDrawer::Initialize( const EffectDesc& desc, const EffectOption& option, - ID3D11Texture2D* inputTex, DeviceResources& deviceResources, - SIZE scalingWndSize + SIZE scalingWndSize, + ID3D11Texture2D** inOutTexture ) noexcept { SIZE inputSize{}; { D3D11_TEXTURE2D_DESC inputDesc; - inputTex->GetDesc(&inputDesc); + (*inOutTexture)->GetDesc(&inputDesc); inputSize = { (LONG)inputDesc.Width, (LONG)inputDesc.Height }; } @@ -124,10 +124,10 @@ bool EffectDrawer::Initialize( // 创建中间纹理 // 第一个为 INPUT,第二个为 OUTPUT _textures.resize(desc.textures.size()); - _textures[0].copy_from(inputTex); + _textures[0].copy_from(*inOutTexture); // 创建输出纹理 - _textures.back() = DirectXHelper::CreateTexture2D( + _textures[1] = DirectXHelper::CreateTexture2D( deviceResources.GetD3DDevice(), DXGI_FORMAT_R8G8B8A8_UNORM, outputSize.cx, @@ -135,8 +135,9 @@ bool EffectDrawer::Initialize( D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_UNORDERED_ACCESS ); - if (!_textures.back()) { - Logger::Get().Error("创建纹理失败"); + *inOutTexture = _textures[1].get(); + if (!*inOutTexture) { + Logger::Get().Error("创建输出纹理失败"); return false; } @@ -244,6 +245,30 @@ bool EffectDrawer::Initialize( return true; } +void EffectDrawer::Draw(ID3D11DeviceContext* d3dDC) const noexcept { + { + ID3D11Buffer* t = _constantBuffer.get(); + d3dDC->CSSetConstantBuffers(0, 1, &t); + } + d3dDC->CSSetSamplers(0, (UINT)_samplers.size(), _samplers.data()); + + for (uint32_t i = 0; i < _dispatches.size(); ++i) { + _DrawPass(i, d3dDC); + } +} + +void EffectDrawer::_DrawPass(uint32_t i, ID3D11DeviceContext* d3dDC) const noexcept { + d3dDC->CSSetShader(_shaders[i].get(), nullptr, 0); + + d3dDC->CSSetShaderResources(0, (UINT)_srvs[i].size(), _srvs[i].data()); + UINT uavCount = (UINT)_uavs[i].size() / 2; + d3dDC->CSSetUnorderedAccessViews(0, uavCount, _uavs[i].data(), nullptr); + + d3dDC->Dispatch(_dispatches[i].first, _dispatches[i].second, 1); + + d3dDC->CSSetUnorderedAccessViews(0, uavCount, _uavs[i].data() + uavCount, nullptr); +} + bool EffectDrawer::_InitializeConstants( const EffectDesc& desc, const EffectOption& option, diff --git a/src/Magpie.Core/EffectDrawer.h b/src/Magpie.Core/EffectDrawer.h index 23c598990..2d6f6159c 100644 --- a/src/Magpie.Core/EffectDrawer.h +++ b/src/Magpie.Core/EffectDrawer.h @@ -17,14 +17,12 @@ class EffectDrawer { bool Initialize( const EffectDesc& desc, const EffectOption& option, - ID3D11Texture2D* inputTex, DeviceResources& deviceResources, - SIZE scalingWndSize + SIZE scalingWndSize, + ID3D11Texture2D** inOutTexture ) noexcept; - ID3D11Texture2D* GetOutputTexture() const noexcept { - return _textures.empty() ? nullptr : _textures.back().get(); - } + void Draw(ID3D11DeviceContext* d3dDC) const noexcept; private: bool _InitializeConstants( @@ -35,6 +33,8 @@ class EffectDrawer { SIZE outputSize ) noexcept; + void _DrawPass(uint32_t i, ID3D11DeviceContext* d3dDC) const noexcept; + SmallVector _samplers; SmallVector> _textures; std::vector> _srvs; @@ -46,7 +46,7 @@ class EffectDrawer { SmallVector> _shaders; - SmallVector> _dispatches; + SmallVector> _dispatches; }; } diff --git a/src/Magpie.Core/Renderer.cpp b/src/Magpie.Core/Renderer.cpp index d8712b8c6..6a06c0167 100644 --- a/src/Magpie.Core/Renderer.cpp +++ b/src/Magpie.Core/Renderer.cpp @@ -26,10 +26,12 @@ Renderer::~Renderer() noexcept { } bool Renderer::Initialize(HWND hwndSrc, HWND hwndScaling, const ScalingOptions& options) noexcept { - _backendThread = std::thread(std::bind(&Renderer::_BackendThreadProc, this, hwndSrc, hwndScaling, options)); + _hwndSrc = hwndSrc; + _hwndScaling = hwndScaling; - _frontendResources = std::make_unique(); - if (!_frontendResources->Initialize(hwndScaling, options)) { + _backendThread = std::thread(std::bind(&Renderer::_BackendThreadProc, this, options)); + + if (!_frontendResources.Initialize(hwndScaling, options)) { return false; } @@ -40,17 +42,10 @@ void Renderer::Render() noexcept { } -static std::unique_ptr _InitFrameSource( - HWND hwndSrc, - HWND hwndScaling, - const ScalingOptions& options, - ID3D11Device5* d3dDevice -) noexcept { - std::unique_ptr frameSource; - +bool Renderer::_InitFrameSource(const ScalingOptions& options) noexcept { switch (options.captureMethod) { case CaptureMethod::GraphicsCapture: - frameSource = std::make_unique(); + _frameSource = std::make_unique(); break; /*case CaptureMethod::DesktopDuplication: frameSource = std::make_unique(); @@ -63,21 +58,22 @@ static std::unique_ptr _InitFrameSource( break;*/ default: Logger::Get().Error("未知的捕获模式"); - return {}; + return false; } - Logger::Get().Info(StrUtils::Concat("当前捕获模式:", frameSource->GetName())); + Logger::Get().Info(StrUtils::Concat("当前捕获模式:", _frameSource->GetName())); - if (!frameSource->Initialize(hwndSrc, hwndScaling, options, d3dDevice)) { + ID3D11Device5* d3dDevice = _backendDeviceResources.GetD3DDevice(); + if (!_frameSource->Initialize(_hwndSrc, _hwndScaling, options, d3dDevice)) { Logger::Get().Error("初始化 FrameSource 失败"); - return {}; + return false; } D3D11_TEXTURE2D_DESC desc; - frameSource->GetOutput()->GetDesc(&desc); + _frameSource->GetOutput()->GetDesc(&desc); Logger::Get().Info(fmt::format("源窗口尺寸:{}x{}", desc.Width, desc.Height)); - return frameSource; + return true; } static std::optional CompileEffect( @@ -122,25 +118,18 @@ static std::optional CompileEffect( } } -static std::vector BuildEffects( - const ScalingOptions& scalingOptions, - DeviceResources& deviceResources, - ID3D11Texture2D* inputTex, - const RECT& scalingWndRect -) noexcept { - assert(!scalingOptions.effects.empty()); - - std::vector effectDrawers; +bool Renderer::_BuildEffects(const ScalingOptions& options) noexcept { + assert(!options.effects.empty()); - const uint32_t effectCount = (uint32_t)scalingOptions.effects.size(); + const uint32_t effectCount = (uint32_t)options.effects.size(); // 并行编译所有效果 - std::vector effectDescs(scalingOptions.effects.size()); + std::vector effectDescs(options.effects.size()); std::atomic allSuccess = true; int duration = Utils::Measure([&]() { Win32Utils::RunParallel([&](uint32_t id) { - std::optional desc = CompileEffect(scalingOptions, scalingOptions.effects[id]); + std::optional desc = CompileEffect(options, options.effects[id]); if (desc) { effectDescs[id] = std::move(*desc); } else { @@ -150,36 +139,35 @@ static std::vector BuildEffects( }); if (!allSuccess) { - return {}; + return false; } if (effectCount > 1) { Logger::Get().Info(fmt::format("编译着色器总计用时 {} 毫秒", duration / 1000.0f)); } - ID3D11Texture2D* effectInput = inputTex; - /*DownscalingEffect& downscalingEffect = MagApp::Get().GetOptions().downscalingEffect; if (!downscalingEffect.name.empty()) { _effects.reserve(effectsOption.size() + 1); }*/ - effectDrawers.resize(scalingOptions.effects.size()); + _effectDrawers.resize(options.effects.size()); + RECT scalingWndRect; + GetWindowRect(_hwndScaling, &scalingWndRect); SIZE scalingWndSize = Win32Utils::GetSizeOfRect(scalingWndRect); + ID3D11Texture2D* inOutTexture = _frameSource->GetOutput(); for (uint32_t i = 0; i < effectCount; ++i) { - if (!effectDrawers[i].Initialize( + if (!_effectDrawers[i].Initialize( effectDescs[i], - scalingOptions.effects[i], - effectInput, - deviceResources, - scalingWndSize + options.effects[i], + _backendDeviceResources, + scalingWndSize, + &inOutTexture )) { - Logger::Get().Error(fmt::format("初始化效果#{} ({}) 失败", i, StrUtils::UTF16ToUTF8(scalingOptions.effects[i].name))); - return {}; + Logger::Get().Error(fmt::format("初始化效果#{} ({}) 失败", i, StrUtils::UTF16ToUTF8(options.effects[i].name))); + return false; } - - effectInput = effectDrawers[i].GetOutputTexture(); } /*if (!downscalingEffect.name.empty()) { @@ -245,37 +233,85 @@ static std::vector BuildEffects( } }*/ - return effectDrawers; + return true; } -void Renderer::_BackendThreadProc(HWND hwndSrc, HWND hwndScaling, const ScalingOptions& options) noexcept { +void Renderer::_BackendThreadProc(const ScalingOptions& options) noexcept { winrt::init_apartment(winrt::apartment_type::single_threaded); - DeviceResources deviceResources; - if (!deviceResources.Initialize(hwndScaling, options)) { + if (!_backendDeviceResources.Initialize(_hwndScaling, options)) { return; } - std::unique_ptr frameSource = - _InitFrameSource(hwndSrc, hwndScaling, options, deviceResources.GetD3DDevice()); - if (!frameSource) { + ID3D11Device5* d3dDevice = _backendDeviceResources.GetD3DDevice(); + + if (!_InitFrameSource(options)) { return; } - RECT scalingWndRect; - GetWindowRect(hwndScaling, &scalingWndRect); + if (!_BuildEffects(options)) { + return; + } + + HRESULT hr = d3dDevice->CreateFence(_fenceValue, D3D11_FENCE_FLAG_NONE, IID_PPV_ARGS(&_d3dFence)); + if (FAILED(hr)) { + Logger::Get().ComError("CreateFence 失败", hr); + return; + } - std::vector effectDrawers = BuildEffects( - options, - deviceResources, - frameSource->GetOutput(), - scalingWndRect - ); + _fenceEvent.reset(Win32Utils::SafeHandle(CreateEvent(nullptr, FALSE, FALSE, nullptr))); + if (!_fenceEvent) { + Logger::Get().Win32Error("CreateEvent 失败"); + return; + } MSG msg; - while (GetMessage(&msg, NULL, 0, 0)) { - DispatchMessage(&msg); + while (true) { + while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { + if (msg.message == WM_QUIT) { + // 不能在前台线程释放 + _frameSource.reset(); + return; + } + + DispatchMessage(&msg); + } + + _BackendRender(); + + // 等待新消息 1ms + MsgWaitForMultipleObjectsEx(0, nullptr, 1, QS_ALLINPUT, MWMO_INPUTAVAILABLE); + } +} + +void Renderer::_BackendRender() noexcept { + FrameSourceBase::UpdateState updateState = _frameSource->Update(); + if (updateState != FrameSourceBase::UpdateState::NewFrame) { + return; } + + winrt::com_ptr d3dDC; + { + winrt::com_ptr t; + _backendDeviceResources.GetD3DDevice()->GetImmediateContext(t.put()); + d3dDC = t.try_as(); + } + + for (const EffectDrawer& effectDrawer : _effectDrawers) { + effectDrawer.Draw(d3dDC.get()); + } + + // 等待渲染完成 + HRESULT hr = d3dDC->Signal(_d3dFence.get(), ++_fenceValue); + if (FAILED(hr)) { + return; + } + hr = _d3dFence->SetEventOnCompletion(_fenceValue, _fenceEvent.get()); + if (FAILED(hr)) { + return; + } + + WaitForSingleObject(_fenceEvent.get(), INFINITE); } } diff --git a/src/Magpie.Core/Renderer.h b/src/Magpie.Core/Renderer.h index 5645513a7..0ad854fa7 100644 --- a/src/Magpie.Core/Renderer.h +++ b/src/Magpie.Core/Renderer.h @@ -1,9 +1,13 @@ #pragma once +#include "DeviceResources.h" +#include "EffectDrawer.h" +#include "Win32Utils.h" namespace Magpie::Core { struct ScalingOptions; class DeviceResources; +class FrameSourceBase; class Renderer { public: @@ -18,11 +22,30 @@ class Renderer { void Render() noexcept; private: - void _BackendThreadProc(HWND hwndSrc, HWND hwndScaling, const ScalingOptions& options) noexcept; + void _BackendThreadProc(const ScalingOptions& options) noexcept; - std::unique_ptr _frontendResources; + bool _InitFrameSource(const ScalingOptions& options) noexcept; + + bool _BuildEffects(const ScalingOptions& options) noexcept; + + void _BackendRender() noexcept; + + // 只能由前台线程访问 + DeviceResources _frontendResources; std::thread _backendThread; + + // 只能由后台线程访问 + DeviceResources _backendResources; + std::unique_ptr _frameSource; + std::vector _effectDrawers; + winrt::com_ptr _d3dFence; + UINT64 _fenceValue = 0; + Win32Utils::ScopedHandle _fenceEvent; + + // 可由所有线程访问 + HWND _hwndSrc = NULL; + HWND _hwndScaling = NULL; }; } From 1e8c4c790c6abb15169ee3440af85affd8efbd42 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=97=AD?= Date: Mon, 12 Jun 2023 17:17:29 +0800 Subject: [PATCH 018/155] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E7=BC=96?= =?UTF-8?q?=E8=AF=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Magpie.Core/Renderer.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/Magpie.Core/Renderer.cpp b/src/Magpie.Core/Renderer.cpp index 6a06c0167..32681477f 100644 --- a/src/Magpie.Core/Renderer.cpp +++ b/src/Magpie.Core/Renderer.cpp @@ -63,7 +63,7 @@ bool Renderer::_InitFrameSource(const ScalingOptions& options) noexcept { Logger::Get().Info(StrUtils::Concat("当前捕获模式:", _frameSource->GetName())); - ID3D11Device5* d3dDevice = _backendDeviceResources.GetD3DDevice(); + ID3D11Device5* d3dDevice = _backendResources.GetD3DDevice(); if (!_frameSource->Initialize(_hwndSrc, _hwndScaling, options, d3dDevice)) { Logger::Get().Error("初始化 FrameSource 失败"); return false; @@ -161,7 +161,7 @@ bool Renderer::_BuildEffects(const ScalingOptions& options) noexcept { if (!_effectDrawers[i].Initialize( effectDescs[i], options.effects[i], - _backendDeviceResources, + _backendResources, scalingWndSize, &inOutTexture )) { @@ -239,11 +239,11 @@ bool Renderer::_BuildEffects(const ScalingOptions& options) noexcept { void Renderer::_BackendThreadProc(const ScalingOptions& options) noexcept { winrt::init_apartment(winrt::apartment_type::single_threaded); - if (!_backendDeviceResources.Initialize(_hwndScaling, options)) { + if (!_backendResources.Initialize(_hwndScaling, options)) { return; } - ID3D11Device5* d3dDevice = _backendDeviceResources.GetD3DDevice(); + ID3D11Device5* d3dDevice = _backendResources.GetD3DDevice(); if (!_InitFrameSource(options)) { return; @@ -293,7 +293,7 @@ void Renderer::_BackendRender() noexcept { winrt::com_ptr d3dDC; { winrt::com_ptr t; - _backendDeviceResources.GetD3DDevice()->GetImmediateContext(t.put()); + _backendResources.GetD3DDevice()->GetImmediateContext(t.put()); d3dDC = t.try_as(); } From 3b03cdf2f7c35e7e92d8a432e523962e786e8724 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=97=AD?= <34770031+Blinue@users.noreply.github.com> Date: Mon, 12 Jun 2023 21:29:38 +0800 Subject: [PATCH 019/155] =?UTF-8?q?feat:=20=E5=89=8D=E7=AB=AF=E6=B8=B2?= =?UTF-8?q?=E6=9F=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Magpie.Core/DeviceResources.cpp | 24 ++-- src/Magpie.Core/DeviceResources.h | 14 +- src/Magpie.Core/Renderer.cpp | 208 +++++++++++++++++++++++++--- src/Magpie.Core/Renderer.h | 26 +++- src/Magpie.Core/ScalingWindow.cpp | 109 ++++++++++++++- 5 files changed, 345 insertions(+), 36 deletions(-) diff --git a/src/Magpie.Core/DeviceResources.cpp b/src/Magpie.Core/DeviceResources.cpp index a7bba703f..635cefbd4 100644 --- a/src/Magpie.Core/DeviceResources.cpp +++ b/src/Magpie.Core/DeviceResources.cpp @@ -7,15 +7,14 @@ namespace Magpie::Core { -bool DeviceResources::Initialize(HWND /*hwndScaling*/, const ScalingOptions& options) noexcept { +bool DeviceResources::Initialize(const ScalingOptions& options) noexcept { #ifdef _DEBUG UINT flag = DXGI_CREATE_FACTORY_DEBUG; #else UINT flag = 0; #endif // _DEBUG - winrt::com_ptr dxgiFactory; - HRESULT hr = CreateDXGIFactory2(flag, IID_PPV_ARGS(dxgiFactory.put())); + HRESULT hr = CreateDXGIFactory2(flag, IID_PPV_ARGS(_dxgiFactory.put())); if (FAILED(hr)) { Logger::Get().ComError("CreateDXGIFactory2 失败", hr); return false; @@ -23,11 +22,12 @@ bool DeviceResources::Initialize(HWND /*hwndScaling*/, const ScalingOptions& opt // 检查可变帧率支持 BOOL supportTearing = FALSE; - hr = dxgiFactory->CheckFeatureSupport(DXGI_FEATURE_PRESENT_ALLOW_TEARING, &supportTearing, sizeof(supportTearing)); + hr = _dxgiFactory->CheckFeatureSupport(DXGI_FEATURE_PRESENT_ALLOW_TEARING, &supportTearing, sizeof(supportTearing)); if (FAILED(hr)) { Logger::Get().ComWarn("CheckFeatureSupport 失败", hr); } + _isSupportTearing = supportTearing; Logger::Get().Info(fmt::format("可变刷新率支持:{}", supportTearing ? "是" : "否")); if (!options.IsVSync() && !supportTearing) { @@ -35,7 +35,7 @@ bool DeviceResources::Initialize(HWND /*hwndScaling*/, const ScalingOptions& opt return false; } - if (!_ObtainAdapterAndDevice(dxgiFactory.get(), options.graphicsCard)) { + if (!_ObtainAdapterAndDevice(options.graphicsCard)) { Logger::Get().Error("找不到可用的图形适配器"); return false; } @@ -127,11 +127,11 @@ static void LogAdapter(const DXGI_ADAPTER_DESC1& adapterDesc) noexcept { adapterDesc.VendorId, adapterDesc.DeviceId, StrUtils::UTF16ToUTF8(adapterDesc.Description))); } -bool DeviceResources::_ObtainAdapterAndDevice(IDXGIFactory7* dxgiFactory, int adapterIdx) noexcept { +bool DeviceResources::_ObtainAdapterAndDevice(int adapterIdx) noexcept { winrt::com_ptr adapter; if (adapterIdx >= 0) { - HRESULT hr = dxgiFactory->EnumAdapters1(adapterIdx, adapter.put()); + HRESULT hr = _dxgiFactory->EnumAdapters1(adapterIdx, adapter.put()); if (SUCCEEDED(hr)) { DXGI_ADAPTER_DESC1 desc; hr = adapter->GetDesc1(&desc); @@ -154,7 +154,7 @@ bool DeviceResources::_ObtainAdapterAndDevice(IDXGIFactory7* dxgiFactory, int ad // 枚举查找第一个支持 D3D11 的图形适配器 for (UINT adapterIndex = 0; - SUCCEEDED(dxgiFactory->EnumAdapters1(adapterIndex, adapter.put())); + SUCCEEDED(_dxgiFactory->EnumAdapters1(adapterIndex, adapter.put())); ++adapterIndex ) { DXGI_ADAPTER_DESC1 desc; @@ -176,7 +176,7 @@ bool DeviceResources::_ObtainAdapterAndDevice(IDXGIFactory7* dxgiFactory, int ad // 作为最后手段,回落到 Basic Render Driver Adapter(WARP) // https://docs.microsoft.com/en-us/windows/win32/direct3darticles/directx-warp - HRESULT hr = dxgiFactory->EnumWarpAdapter(IID_PPV_ARGS(&adapter)); + HRESULT hr = _dxgiFactory->EnumWarpAdapter(IID_PPV_ARGS(&adapter)); if (FAILED(hr)) { Logger::Get().ComError("创建 WARP 设备失败", hr); return false; @@ -239,6 +239,12 @@ bool DeviceResources::_TryCreateD3DDevice(const winrt::com_ptr& a Logger::Get().Error("获取 ID3D11Device1 失败"); return false; } + + _d3dDC = d3dDC.try_as(); + if (!_d3dDC) { + Logger::Get().Error("获取 ID3D11DeviceContext4 失败"); + return false; + } _graphicsAdapter = adapter.try_as(); if (!_graphicsAdapter) { diff --git a/src/Magpie.Core/DeviceResources.h b/src/Magpie.Core/DeviceResources.h index 624f3d40b..eadcd6970 100644 --- a/src/Magpie.Core/DeviceResources.h +++ b/src/Magpie.Core/DeviceResources.h @@ -11,11 +11,17 @@ class DeviceResources { DeviceResources(const DeviceResources&) = delete; DeviceResources(DeviceResources&&) noexcept = default; - bool Initialize(HWND hwndScaling, const ScalingOptions& options) noexcept; + bool Initialize(const ScalingOptions& options) noexcept; + IDXGIFactory7* GetDXGIFactory() const noexcept { return _dxgiFactory.get(); } ID3D11Device5* GetD3DDevice() const noexcept { return _d3dDevice.get(); } + ID3D11DeviceContext4* GetD3DDC() const noexcept { return _d3dDC.get(); } IDXGIAdapter4* GetGraphicsAdapter() const noexcept { return _graphicsAdapter.get(); } + bool IsSupportTearing() const noexcept { + return _isSupportTearing; + } + ID3D11SamplerState* GetSampler(D3D11_FILTER filterMode, D3D11_TEXTURE_ADDRESS_MODE addressMode) noexcept; ID3D11RenderTargetView* GetRenderTargetView(ID3D11Texture2D* texture) noexcept; @@ -25,11 +31,13 @@ class DeviceResources { ID3D11UnorderedAccessView* GetUnorderedAccessView(ID3D11Texture2D* texture) noexcept; private: - bool _ObtainAdapterAndDevice(IDXGIFactory7* dxgiFactory, int adapterIdx) noexcept; + bool _ObtainAdapterAndDevice(int adapterIdx) noexcept; bool _TryCreateD3DDevice(const winrt::com_ptr& adapter) noexcept; + winrt::com_ptr _dxgiFactory; winrt::com_ptr _graphicsAdapter; winrt::com_ptr _d3dDevice; + winrt::com_ptr _d3dDC; phmap::flat_hash_map> _rtvMap; phmap::flat_hash_map> _srvMap; @@ -39,6 +47,8 @@ class DeviceResources { std::pair, winrt::com_ptr > _samMap; + + bool _isSupportTearing = false; }; } diff --git a/src/Magpie.Core/Renderer.cpp b/src/Magpie.Core/Renderer.cpp index 32681477f..8259fcb7b 100644 --- a/src/Magpie.Core/Renderer.cpp +++ b/src/Magpie.Core/Renderer.cpp @@ -9,6 +9,7 @@ #include "Utils.h" #include "EffectCompiler.h" #include "GraphicsCaptureFrameSource.h" +#include "DirectXHelper.h" namespace Magpie::Core { @@ -31,15 +32,133 @@ bool Renderer::Initialize(HWND hwndSrc, HWND hwndScaling, const ScalingOptions& _backendThread = std::thread(std::bind(&Renderer::_BackendThreadProc, this, options)); - if (!_frontendResources.Initialize(hwndScaling, options)) { + if (!_frontendResources.Initialize(options)) { + Logger::Get().Error("初始化前端资源失败"); + return false; + } + + if (!_CreateSwapChain(options)) { + Logger::Get().Error("_CreateSwapChain 失败"); return false; } return true; } +bool Renderer::_CreateSwapChain(const ScalingOptions& options) noexcept { + RECT scalingWndRect; + GetWindowRect(_hwndScaling, &scalingWndRect); + + DXGI_SWAP_CHAIN_DESC1 sd {}; + sd.Width = scalingWndRect.right - scalingWndRect.left; + sd.Height = scalingWndRect.bottom - scalingWndRect.top; + sd.Format = DXGI_FORMAT_R8G8B8A8_UNORM; + sd.AlphaMode = DXGI_ALPHA_MODE_UNSPECIFIED; + sd.SampleDesc.Count = 1; + sd.Scaling = DXGI_SCALING_NONE; + sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; + sd.BufferCount = (options.IsTripleBuffering() || !options.IsVSync()) ? 3 : 2; + // 渲染每帧之前都会清空后缓冲区,因此无需 DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL + sd.SwapEffect = DXGI_SWAP_EFFECT_FLIP_DISCARD; + // 只要显卡支持始终启用 DXGI_SWAP_CHAIN_FLAG_ALLOW_TEARING 以支持可变刷新率 + sd.Flags = (_frontendResources.IsSupportTearing() ? DXGI_SWAP_CHAIN_FLAG_ALLOW_TEARING : 0) + | DXGI_SWAP_CHAIN_FLAG_FRAME_LATENCY_WAITABLE_OBJECT; + + winrt::com_ptr dxgiSwapChain = nullptr; + HRESULT hr = _frontendResources.GetDXGIFactory()->CreateSwapChainForHwnd( + _frontendResources.GetD3DDevice(), + _hwndScaling, + &sd, + nullptr, + nullptr, + dxgiSwapChain.put() + ); + if (FAILED(hr)) { + Logger::Get().ComError("创建交换链失败", hr); + return false; + } + + _swapChain = dxgiSwapChain.try_as(); + if (!_swapChain) { + Logger::Get().Error("获取 IDXGISwapChain2 失败"); + return false; + } + + _swapChain->SetMaximumFrameLatency(1); + + _frameLatencyWaitableObject.reset(_swapChain->GetFrameLatencyWaitableObject()); + if (!_frameLatencyWaitableObject) { + Logger::Get().Error("GetFrameLatencyWaitableObject 失败"); + return false; + } + + hr = _frontendResources.GetDXGIFactory()->MakeWindowAssociation(_hwndScaling, DXGI_MWA_NO_ALT_ENTER); + if (FAILED(hr)) { + Logger::Get().ComError("MakeWindowAssociation 失败", hr); + } + + hr = _swapChain->GetBuffer(0, IID_PPV_ARGS(_backBuffer.put())); + if (FAILED(hr)) { + Logger::Get().ComError("获取后缓冲区失败", hr); + return false; + } + return true; +} + +bool Renderer::_ObtainSharedTexture() noexcept { + // 获取共享纹理 + HRESULT hr = _frontendResources.GetD3DDevice()->OpenSharedResource( + _sharedTextureHandle, IID_PPV_ARGS(_frontendSharedTexture.put())); + if (FAILED(hr)) { + Logger::Get().ComError("OpenSharedResource 失败", hr); + return false; + } + + _frontendSharedTextureMutex = _frontendSharedTexture.try_as(); + + D3D11_TEXTURE2D_DESC desc; + _frontendSharedTexture->GetDesc(&desc); + _sharedTextureSize = { (LONG)desc.Width,(LONG)desc.Height }; + + return true; +} + void Renderer::Render() noexcept { - + if (_sharedTextureMutexKey == 0) { + // 第一帧尚未渲染完成 + return; + } + + if (!_frontendSharedTexture) { + if (!_ObtainSharedTexture()) { + Logger::Get().Error("_ObtainSharedTexture 失败"); + return; + } + } + + WaitForSingleObjectEx(_frameLatencyWaitableObject.get(), 1000, TRUE); + + ID3D11DeviceContext4* d3dDC = _frontendResources.GetD3DDC(); + d3dDC->ClearState(); + + ID3D11RenderTargetView* backBufferRtv = _frontendResources.GetRenderTargetView(_backBuffer.get()); + static constexpr FLOAT black[4] = { 0.0f,0.0f,0.0f,1.0f }; + d3dDC->ClearRenderTargetView(backBufferRtv, black); + + const uint64_t key = ++_sharedTextureMutexKey; + HRESULT hr = _frontendSharedTextureMutex->AcquireSync(key - 1, INFINITE); + if (FAILED(hr)) { + return; + } + + d3dDC->CopyResource(_backBuffer.get(), _frontendSharedTexture.get()); + + _frontendSharedTextureMutex->ReleaseSync(key); + + _swapChain->Present(1, 0); + + // 丢弃渲染目标的内容。仅当现有内容将被完全覆盖时,此操作才有效 + d3dDC->DiscardView(backBufferRtv); } bool Renderer::_InitFrameSource(const ScalingOptions& options) noexcept { @@ -118,7 +237,7 @@ static std::optional CompileEffect( } } -bool Renderer::_BuildEffects(const ScalingOptions& options) noexcept { +ID3D11Texture2D* Renderer::_BuildEffects(const ScalingOptions& options) noexcept { assert(!options.effects.empty()); const uint32_t effectCount = (uint32_t)options.effects.size(); @@ -139,7 +258,7 @@ bool Renderer::_BuildEffects(const ScalingOptions& options) noexcept { }); if (!allSuccess) { - return false; + return nullptr; } if (effectCount > 1) { @@ -166,10 +285,12 @@ bool Renderer::_BuildEffects(const ScalingOptions& options) noexcept { &inOutTexture )) { Logger::Get().Error(fmt::format("初始化效果#{} ({}) 失败", i, StrUtils::UTF16ToUTF8(options.effects[i].name))); - return false; + return nullptr; } } + return inOutTexture; + /*if (!downscalingEffect.name.empty()) { const SIZE hostSize = Win32Utils::GetSizeOfRect(MagApp::Get().GetHostWndRect()); const SIZE outputSize = Win32Utils::GetSizeOfRect(_virtualOutputRect); @@ -232,6 +353,37 @@ bool Renderer::_BuildEffects(const ScalingOptions& options) noexcept { } } }*/ +} + +bool Renderer::_CreateSharedTexture(ID3D11Texture2D* effectsOutput) noexcept { + D3D11_TEXTURE2D_DESC desc; + effectsOutput->GetDesc(&desc); + SIZE textureSize = { (LONG)desc.Width, (LONG)desc.Height }; + + // 创建共享纹理 + _backendSharedTexture = DirectXHelper::CreateTexture2D( + _backendResources.GetD3DDevice(), + DXGI_FORMAT_R8G8B8A8_UNORM, + textureSize.cx, + textureSize.cy, + D3D11_BIND_SHADER_RESOURCE, + D3D11_USAGE_DEFAULT, + D3D11_RESOURCE_MISC_SHARED_KEYEDMUTEX + ); + if (!_backendSharedTexture) { + Logger::Get().Error("创建 Texture2D 失败"); + return false; + } + + _backendSharedTextureMutex = _backendSharedTexture.try_as(); + + winrt::com_ptr sharedDxgiRes = _backendSharedTexture.try_as(); + + HRESULT hr = sharedDxgiRes->GetSharedHandle(&_sharedTextureHandle); + if (FAILED(hr)) { + Logger::Get().Error("GetSharedHandle 失败"); + return false; + } return true; } @@ -239,7 +391,7 @@ bool Renderer::_BuildEffects(const ScalingOptions& options) noexcept { void Renderer::_BackendThreadProc(const ScalingOptions& options) noexcept { winrt::init_apartment(winrt::apartment_type::single_threaded); - if (!_backendResources.Initialize(_hwndScaling, options)) { + if (!_backendResources.Initialize(options)) { return; } @@ -249,7 +401,8 @@ void Renderer::_BackendThreadProc(const ScalingOptions& options) noexcept { return; } - if (!_BuildEffects(options)) { + ID3D11Texture2D* outputTexture = _BuildEffects(options); + if (!outputTexture) { return; } @@ -265,11 +418,16 @@ void Renderer::_BackendThreadProc(const ScalingOptions& options) noexcept { return; } + if (!_CreateSharedTexture(outputTexture)) { + Logger::Get().Win32Error("_CreateSharedTexture 失败"); + return; + } + MSG msg; while (true) { while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { if (msg.message == WM_QUIT) { - // 不能在前台线程释放 + // 不能在前端线程释放 _frameSource.reset(); return; } @@ -277,32 +435,36 @@ void Renderer::_BackendThreadProc(const ScalingOptions& options) noexcept { DispatchMessage(&msg); } - _BackendRender(); + _BackendRender(outputTexture); // 等待新消息 1ms MsgWaitForMultipleObjectsEx(0, nullptr, 1, QS_ALLINPUT, MWMO_INPUTAVAILABLE); } } -void Renderer::_BackendRender() noexcept { +void Renderer::_BackendRender(ID3D11Texture2D* effectsOutput) noexcept { FrameSourceBase::UpdateState updateState = _frameSource->Update(); if (updateState != FrameSourceBase::UpdateState::NewFrame) { return; } - winrt::com_ptr d3dDC; - { - winrt::com_ptr t; - _backendResources.GetD3DDevice()->GetImmediateContext(t.put()); - d3dDC = t.try_as(); - } + ID3D11DeviceContext4* d3dDC = _backendResources.GetD3DDC(); for (const EffectDrawer& effectDrawer : _effectDrawers) { - effectDrawer.Draw(d3dDC.get()); + effectDrawer.Draw(d3dDC); } - // 等待渲染完成 - HRESULT hr = d3dDC->Signal(_d3dFence.get(), ++_fenceValue); + const uint64_t key = ++_sharedTextureMutexKey; + HRESULT hr = _backendSharedTextureMutex->AcquireSync(key - 1, INFINITE); + if (FAILED(hr)) { + return; + } + + d3dDC->CopyResource(_backendSharedTexture.get(), effectsOutput); + + _backendSharedTextureMutex->ReleaseSync(key); + + hr = d3dDC->Signal(_d3dFence.get(), ++_fenceValue); if (FAILED(hr)) { return; } @@ -310,8 +472,14 @@ void Renderer::_BackendRender() noexcept { if (FAILED(hr)) { return; } - + + d3dDC->Flush(); + + // 等待渲染完成 WaitForSingleObject(_fenceEvent.get(), INFINITE); + + // 唤醒前端线程 + PostMessage(_hwndScaling, WM_NULL, 0, 0); } } diff --git a/src/Magpie.Core/Renderer.h b/src/Magpie.Core/Renderer.h index 0ad854fa7..eda837d95 100644 --- a/src/Magpie.Core/Renderer.h +++ b/src/Magpie.Core/Renderer.h @@ -22,16 +22,29 @@ class Renderer { void Render() noexcept; private: + bool _CreateSwapChain(const ScalingOptions& options) noexcept; + + bool _ObtainSharedTexture() noexcept; + void _BackendThreadProc(const ScalingOptions& options) noexcept; bool _InitFrameSource(const ScalingOptions& options) noexcept; - bool _BuildEffects(const ScalingOptions& options) noexcept; + ID3D11Texture2D* _BuildEffects(const ScalingOptions& options) noexcept; - void _BackendRender() noexcept; + bool _CreateSharedTexture(ID3D11Texture2D* effectsOutput) noexcept; + + void _BackendRender(ID3D11Texture2D* effectsOutput) noexcept; // 只能由前台线程访问 DeviceResources _frontendResources; + winrt::com_ptr _swapChain; + Win32Utils::ScopedHandle _frameLatencyWaitableObject; + winrt::com_ptr _backBuffer; + + winrt::com_ptr _frontendSharedTexture; + winrt::com_ptr _frontendSharedTextureMutex; + SIZE _sharedTextureSize{}; std::thread _backendThread; @@ -39,13 +52,20 @@ class Renderer { DeviceResources _backendResources; std::unique_ptr _frameSource; std::vector _effectDrawers; + winrt::com_ptr _d3dFence; - UINT64 _fenceValue = 0; + uint64_t _fenceValue = 0; Win32Utils::ScopedHandle _fenceEvent; + winrt::com_ptr _backendSharedTexture; + winrt::com_ptr _backendSharedTextureMutex; + // 可由所有线程访问 HWND _hwndSrc = NULL; HWND _hwndScaling = NULL; + + HANDLE _sharedTextureHandle = NULL; + std::atomic _sharedTextureMutexKey = 0; }; } diff --git a/src/Magpie.Core/ScalingWindow.cpp b/src/Magpie.Core/ScalingWindow.cpp index 7b9b3a232..131f984bf 100644 --- a/src/Magpie.Core/ScalingWindow.cpp +++ b/src/Magpie.Core/ScalingWindow.cpp @@ -12,6 +12,82 @@ ScalingWindow::ScalingWindow() noexcept {} ScalingWindow::~ScalingWindow() noexcept {} +static BOOL CALLBACK MonitorEnumProc(HMONITOR, HDC, LPRECT monitorRect, LPARAM data) noexcept { + RECT* params = (RECT*)data; + + if (Win32Utils::CheckOverlap(params[0], *monitorRect)) { + UnionRect(¶ms[1], monitorRect, ¶ms[1]); + } + + return TRUE; +} + +static bool CalcHostWndRect(HWND hWnd, MultiMonitorUsage multiMonitorUsage, RECT& result) noexcept { + switch (multiMonitorUsage) { + case MultiMonitorUsage::Closest: + { + // 使用距离源窗口最近的显示器 + HMONITOR hMonitor = MonitorFromWindow(hWnd, MONITOR_DEFAULTTONEAREST); + if (!hMonitor) { + Logger::Get().Win32Error("MonitorFromWindow 失败"); + return false; + } + + MONITORINFO mi{}; + mi.cbSize = sizeof(mi); + if (!GetMonitorInfo(hMonitor, &mi)) { + Logger::Get().Win32Error("GetMonitorInfo 失败"); + return false; + } + result = mi.rcMonitor; + + break; + } + case MultiMonitorUsage::Intersected: + { + // 使用源窗口跨越的所有显示器 + + // [0] 存储源窗口坐标,[1] 存储计算结果 + RECT params[2]{}; + + HRESULT hr = DwmGetWindowAttribute(hWnd, + DWMWA_EXTENDED_FRAME_BOUNDS, ¶ms[0], sizeof(params[0])); + if (FAILED(hr)) { + Logger::Get().ComError("DwmGetWindowAttribute 失败", hr); + return false; + } + + if (!EnumDisplayMonitors(NULL, NULL, MonitorEnumProc, (LPARAM)¶ms)) { + Logger::Get().Win32Error("EnumDisplayMonitors 失败"); + return false; + } + + result = params[1]; + if (result.right - result.left <= 0 || result.bottom - result.top <= 0) { + Logger::Get().Error("计算缩放窗口坐标失败"); + return false; + } + + break; + } + case MultiMonitorUsage::All: + { + // 使用所有显示器(Virtual Screen) + int vsWidth = GetSystemMetrics(SM_CXVIRTUALSCREEN); + int vsHeight = GetSystemMetrics(SM_CYVIRTUALSCREEN); + int vsX = GetSystemMetrics(SM_XVIRTUALSCREEN); + int vsY = GetSystemMetrics(SM_YVIRTUALSCREEN); + result = { vsX, vsY, vsX + vsWidth, vsY + vsHeight }; + + break; + } + default: + return false; + } + + return true; +} + bool ScalingWindow::Create(HINSTANCE hInstance, HWND hwndSrc, ScalingOptions&& options) noexcept { if (_hWnd) { return false; @@ -21,10 +97,32 @@ bool ScalingWindow::Create(HINSTANCE hInstance, HWND hwndSrc, ScalingOptions&& o // 缩放结束后才失效 _options = std::move(options); - if (!GetWindowRect(hwndSrc, &_srcWndRect)) { + if (FindWindow(CommonSharedConstants::SCALING_WINDOW_CLASS_NAME, nullptr)) { + Logger::Get().Error("已存在缩放窗口"); return false; } + RECT wndRect; + if (!CalcHostWndRect(_hwndSrc, _options.multiMonitorUsage, wndRect)) { + Logger::Get().Error("CalcHostWndRect 失败"); + return false; + } + + if (!_options.IsAllowScalingMaximized()) { + // 源窗口和缩放窗口重合则不缩放,此时源窗口可能是无边框全屏窗口 + RECT srcRect{}; + HRESULT hr = DwmGetWindowAttribute(_hwndSrc, + DWMWA_EXTENDED_FRAME_BOUNDS, &srcRect, sizeof(srcRect)); + if (FAILED(hr)) { + Win32Utils::GetClientScreenRect(_hwndSrc, srcRect); + } + + if (srcRect == wndRect) { + Logger::Get().Info("源窗口已全屏"); + return false; + } + } + static const int _ = [](HINSTANCE hInstance) { WNDCLASSEXW wcex{}; wcex.cbSize = sizeof(wcex); @@ -43,7 +141,10 @@ bool ScalingWindow::Create(HINSTANCE hInstance, HWND hwndSrc, ScalingOptions&& o CommonSharedConstants::SCALING_WINDOW_CLASS_NAME, L"Magpie", WS_POPUP, - CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, + wndRect.left, + wndRect.top, + wndRect.right - wndRect.left, + wndRect.bottom - wndRect.top, NULL, NULL, hInstance, @@ -60,6 +161,10 @@ bool ScalingWindow::Create(HINSTANCE hInstance, HWND hwndSrc, ScalingOptions&& o Logger::Get().Win32Error("SetLayeredWindowAttributes 失败"); } + if (!GetWindowRect(hwndSrc, &_srcWndRect)) { + return false; + } + _renderer = std::make_unique(); if (!_renderer->Initialize(hwndSrc, _hWnd, _options)) { return false; From 3a5c8a65b8b6bca2da7634e073bc2636b2180951 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=97=AD?= <34770031+Blinue@users.noreply.github.com> Date: Tue, 13 Jun 2023 20:26:22 +0800 Subject: [PATCH 020/155] =?UTF-8?q?feat:=20=E5=86=85=E7=BD=AE=20Nearest=20?= =?UTF-8?q?=E5=92=8C=20Bilinear?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Effects/Bilinear.hlsl | 20 ------------ src/Effects/Effects.vcxproj | 6 ---- src/Effects/Effects.vcxproj.filters | 4 +-- src/Effects/Nearest.hlsl | 20 ------------ src/Magpie.App/EffectsService.cpp | 9 ++++++ src/Magpie.Core/EffectCompiler.cpp | 47 ++++++++++++++++++++++++----- src/Magpie.Core/EffectCompiler.h | 5 ++- src/Magpie.Core/Renderer.cpp | 40 +++++++++++++++--------- src/Magpie.Core/Renderer.h | 1 + src/Shared/Win32Utils.h | 4 +++ 10 files changed, 84 insertions(+), 72 deletions(-) delete mode 100644 src/Effects/Bilinear.hlsl delete mode 100644 src/Effects/Nearest.hlsl diff --git a/src/Effects/Bilinear.hlsl b/src/Effects/Bilinear.hlsl deleted file mode 100644 index c7b7f44da..000000000 --- a/src/Effects/Bilinear.hlsl +++ /dev/null @@ -1,20 +0,0 @@ -//!MAGPIE EFFECT -//!VERSION 3 -//!GENERIC_DOWNSCALER - - -//!TEXTURE -Texture2D INPUT; - -//!SAMPLER -//!FILTER LINEAR -SamplerState sam; - - -//!PASS 1 -//!STYLE PS -//!IN INPUT - -float4 Pass1(float2 pos) { - return INPUT.SampleLevel(sam, pos, 0); -} diff --git a/src/Effects/Effects.vcxproj b/src/Effects/Effects.vcxproj index fa2613e3e..519def59a 100644 --- a/src/Effects/Effects.vcxproj +++ b/src/Effects/Effects.vcxproj @@ -55,12 +55,6 @@ Document - - Document - - - Document - Document diff --git a/src/Effects/Effects.vcxproj.filters b/src/Effects/Effects.vcxproj.filters index 003398507..22983cdec 100644 --- a/src/Effects/Effects.vcxproj.filters +++ b/src/Effects/Effects.vcxproj.filters @@ -5,8 +5,6 @@ - - @@ -59,7 +57,7 @@ Anime4K - + Anime4K diff --git a/src/Effects/Nearest.hlsl b/src/Effects/Nearest.hlsl deleted file mode 100644 index 15cc67754..000000000 --- a/src/Effects/Nearest.hlsl +++ /dev/null @@ -1,20 +0,0 @@ -//!MAGPIE EFFECT -//!VERSION 3 -//!GENERIC_DOWNSCALER - - -//!TEXTURE -Texture2D INPUT; - -//!SAMPLER -//!FILTER POINT -SamplerState sam; - - -//!PASS 1 -//!STYLE PS -//!IN INPUT - -float4 Pass1(float2 pos) { - return INPUT.SampleLevel(sam, pos, 0); -} diff --git a/src/Magpie.App/EffectsService.cpp b/src/Magpie.App/EffectsService.cpp index e389697ac..fad0cf53c 100644 --- a/src/Magpie.App/EffectsService.cpp +++ b/src/Magpie.App/EffectsService.cpp @@ -53,6 +53,14 @@ fire_and_forget EffectsService::StartInitialize() { std::vector effectNames; ListEffects(effectNames); + + // 内置效果 + effectNames.insert( + effectNames.end(), + std::begin(EffectCompiler::BUILTIN_EFFECTS), + std::end(EffectCompiler::BUILTIN_EFFECTS) + ); + uint32_t nEffect = (uint32_t)effectNames.size(); std::vector descs(nEffect); @@ -64,6 +72,7 @@ fire_and_forget EffectsService::StartInitialize() { }, nEffect); _effectsMap.reserve(nEffect); + for (uint32_t i = 0; i < nEffect; ++i) { EffectDesc& effectDesc = descs[i]; if (effectDesc.name.empty()) { diff --git a/src/Magpie.Core/EffectCompiler.cpp b/src/Magpie.Core/EffectCompiler.cpp index f565bab86..718aa2331 100644 --- a/src/Magpie.Core/EffectCompiler.cpp +++ b/src/Magpie.Core/EffectCompiler.cpp @@ -1435,23 +1435,54 @@ static uint32_t CompilePasses( return 0; } +static std::string ReadEffectSource(const std::wstring& effectName) noexcept { + std::string source; + + if (effectName == L"Nearest" || effectName == L"Bilinear") { + source.reserve(160); + + source = R"(//!MAGPIE EFFECT +//!VERSION 4 +//!GENERIC_DOWNSCALER + +//!SAMPLER +//!FILTER )"; + if (effectName == L"Nearest") { + source += "POINT"; + } else { + source += "LINEAR"; + } + + source += R"( +SamplerState sam; + +//!PASS 1 +//!STYLE PS +//!IN INPUT +//!OUT OUTPUT +float4 Pass1(float2 pos) { return INPUT.SampleLevel(sam, pos, 0); })"; + return source; + } else { + std::wstring fileName = StrUtils::ConcatW(CommonSharedConstants::EFFECTS_DIR, effectName, L".hlsl"); + + if (!Win32Utils::ReadTextFile(fileName.c_str(), source)) { + Logger::Get().Error("读取源文件失败"); + return {}; + } + return source; + } +} uint32_t EffectCompiler::Compile( EffectDesc& desc, uint32_t flags, const phmap::flat_hash_map* inlineParams -) { +) noexcept { bool noCompile = flags & EffectCompilerFlags::NoCompile; bool noCache = noCompile || (flags & EffectCompilerFlags::NoCache); std::wstring effectName = StrUtils::UTF8ToUTF16(desc.name); - std::wstring fileName = StrUtils::ConcatW(CommonSharedConstants::EFFECTS_DIR, effectName, L".hlsl"); - - std::string source; - if (!Win32Utils::ReadTextFile(fileName.c_str(), source)) { - Logger::Get().Error("读取源文件失败"); - return 1; - } + std::string source = ReadEffectSource(effectName); if (source.empty()) { Logger::Get().Error("源文件为空"); diff --git a/src/Magpie.Core/EffectCompiler.h b/src/Magpie.Core/EffectCompiler.h index 9cd8035e1..52f643ba3 100644 --- a/src/Magpie.Core/EffectCompiler.h +++ b/src/Magpie.Core/EffectCompiler.h @@ -20,7 +20,10 @@ struct API_DECLSPEC EffectCompiler { EffectDesc& desc, uint32_t flags, // EffectCompilerFlags const phmap::flat_hash_map* inlineParams = nullptr - ); + ) noexcept; + + // 将这些效果内置防止没有默认降采样效果 + static constexpr const wchar_t* BUILTIN_EFFECTS[] = { L"Nearest", L"Bilinear" }; }; } diff --git a/src/Magpie.Core/Renderer.cpp b/src/Magpie.Core/Renderer.cpp index 8259fcb7b..6abcdde65 100644 --- a/src/Magpie.Core/Renderer.cpp +++ b/src/Magpie.Core/Renderer.cpp @@ -30,6 +30,10 @@ bool Renderer::Initialize(HWND hwndSrc, HWND hwndScaling, const ScalingOptions& _hwndSrc = hwndSrc; _hwndScaling = hwndScaling; + RECT scalingWndRect; + GetWindowRect(_hwndScaling, &scalingWndRect); + _scalingWndSize = Win32Utils::GetSizeOfRect(scalingWndRect); + _backendThread = std::thread(std::bind(&Renderer::_BackendThreadProc, this, options)); if (!_frontendResources.Initialize(options)) { @@ -46,12 +50,9 @@ bool Renderer::Initialize(HWND hwndSrc, HWND hwndScaling, const ScalingOptions& } bool Renderer::_CreateSwapChain(const ScalingOptions& options) noexcept { - RECT scalingWndRect; - GetWindowRect(_hwndScaling, &scalingWndRect); - DXGI_SWAP_CHAIN_DESC1 sd {}; - sd.Width = scalingWndRect.right - scalingWndRect.left; - sd.Height = scalingWndRect.bottom - scalingWndRect.top; + sd.Width = _scalingWndSize.cx; + sd.Height = _scalingWndSize.cy; sd.Format = DXGI_FORMAT_R8G8B8A8_UNORM; sd.AlphaMode = DXGI_ALPHA_MODE_UNSPECIFIED; sd.SampleDesc.Count = 1; @@ -141,9 +142,11 @@ void Renderer::Render() noexcept { ID3D11DeviceContext4* d3dDC = _frontendResources.GetD3DDC(); d3dDC->ClearState(); - ID3D11RenderTargetView* backBufferRtv = _frontendResources.GetRenderTargetView(_backBuffer.get()); - static constexpr FLOAT black[4] = { 0.0f,0.0f,0.0f,1.0f }; - d3dDC->ClearRenderTargetView(backBufferRtv, black); + if (_sharedTextureSize != _scalingWndSize) { + ID3D11RenderTargetView* backBufferRtv = _frontendResources.GetRenderTargetView(_backBuffer.get()); + static constexpr FLOAT black[4] = { 0.0f,0.0f,0.0f,1.0f }; + d3dDC->ClearRenderTargetView(backBufferRtv, black); + } const uint64_t key = ++_sharedTextureMutexKey; HRESULT hr = _frontendSharedTextureMutex->AcquireSync(key - 1, INFINITE); @@ -151,10 +154,23 @@ void Renderer::Render() noexcept { return; } - d3dDC->CopyResource(_backBuffer.get(), _frontendSharedTexture.get()); + if (_sharedTextureSize == _scalingWndSize) { + d3dDC->CopyResource(_backBuffer.get(), _frontendSharedTexture.get()); + } else { + assert(_sharedTextureSize.cx <= _scalingWndSize.cx && _sharedTextureSize.cy <= _scalingWndSize.cy); + + const POINT outputPos = { + (_scalingWndSize.cx - _sharedTextureSize.cx) / 2, + (_scalingWndSize.cy - _sharedTextureSize.cy) / 2 + }; + d3dDC->CopySubresourceRegion(_backBuffer.get(), 0, outputPos.x, outputPos.y, 0, + _frontendSharedTexture.get(), 0, nullptr); + } _frontendSharedTextureMutex->ReleaseSync(key); + ID3D11RenderTargetView* backBufferRtv = _frontendResources.GetRenderTargetView(_backBuffer.get()); + _swapChain->Present(1, 0); // 丢弃渲染目标的内容。仅当现有内容将被完全覆盖时,此操作才有效 @@ -271,17 +287,13 @@ ID3D11Texture2D* Renderer::_BuildEffects(const ScalingOptions& options) noexcept }*/ _effectDrawers.resize(options.effects.size()); - RECT scalingWndRect; - GetWindowRect(_hwndScaling, &scalingWndRect); - SIZE scalingWndSize = Win32Utils::GetSizeOfRect(scalingWndRect); - ID3D11Texture2D* inOutTexture = _frameSource->GetOutput(); for (uint32_t i = 0; i < effectCount; ++i) { if (!_effectDrawers[i].Initialize( effectDescs[i], options.effects[i], _backendResources, - scalingWndSize, + _scalingWndSize, &inOutTexture )) { Logger::Get().Error(fmt::format("初始化效果#{} ({}) 失败", i, StrUtils::UTF16ToUTF8(options.effects[i].name))); diff --git a/src/Magpie.Core/Renderer.h b/src/Magpie.Core/Renderer.h index eda837d95..98aa19bdd 100644 --- a/src/Magpie.Core/Renderer.h +++ b/src/Magpie.Core/Renderer.h @@ -63,6 +63,7 @@ class Renderer { // 可由所有线程访问 HWND _hwndSrc = NULL; HWND _hwndScaling = NULL; + SIZE _scalingWndSize{}; HANDLE _sharedTextureHandle = NULL; std::atomic _sharedTextureMutexKey = 0; diff --git a/src/Shared/Win32Utils.h b/src/Shared/Win32Utils.h index 199ff3cef..f145ae871 100644 --- a/src/Shared/Win32Utils.h +++ b/src/Shared/Win32Utils.h @@ -256,3 +256,7 @@ struct Win32Utils { // 不应在主线程调用 static bool OpenFolderAndSelectFile(const wchar_t* fileName); }; + +constexpr bool operator==(const SIZE& l, const SIZE& r) noexcept { + return l.cx == r.cx && l.cy == r.cy; +} From a051caa398128efcd7f1db729653e1d374110c8b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=97=AD?= <34770031+Blinue@users.noreply.github.com> Date: Tue, 13 Jun 2023 21:42:35 +0800 Subject: [PATCH 021/155] =?UTF-8?q?feat:=20=E5=86=85=E7=BD=AE=20Bicubic?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Effects/Bilinear.hlsl | 24 +++++++++++ src/Effects/Effects.vcxproj | 11 +++-- src/Effects/Effects.vcxproj.filters | 3 +- src/Effects/Nearest.hlsl | 24 +++++++++++ src/Magpie.App/EffectsService.cpp | 7 +++- .../BicubicEffect.h} | 5 +++ src/Magpie.Core/EffectCompiler.cpp | 42 +++++-------------- src/Magpie.Core/EffectCompiler.h | 2 +- src/Magpie.Core/Magpie.Core.vcxproj | 1 + 9 files changed, 81 insertions(+), 38 deletions(-) create mode 100644 src/Effects/Bilinear.hlsl create mode 100644 src/Effects/Nearest.hlsl rename src/{Effects/Bicubic.hlsl => Magpie.Core/BicubicEffect.h} (97%) diff --git a/src/Effects/Bilinear.hlsl b/src/Effects/Bilinear.hlsl new file mode 100644 index 000000000..d27f8be68 --- /dev/null +++ b/src/Effects/Bilinear.hlsl @@ -0,0 +1,24 @@ +//!MAGPIE EFFECT +//!VERSION 4 +//!GENERIC_DOWNSCALER + + +//!TEXTURE +Texture2D INPUT; + +//!TEXTURE +Texture2D OUTPUT; + +//!SAMPLER +//!FILTER LINEAR +SamplerState sam; + + +//!PASS 1 +//!STYLE PS +//!IN INPUT +//!OUT OUTPUT + +float4 Pass1(float2 pos) { + return INPUT.SampleLevel(sam, pos, 0); +} diff --git a/src/Effects/Effects.vcxproj b/src/Effects/Effects.vcxproj index 519def59a..b4a390d05 100644 --- a/src/Effects/Effects.vcxproj +++ b/src/Effects/Effects.vcxproj @@ -46,9 +46,6 @@ Document - - Document - Document @@ -297,5 +294,13 @@ Document + + + Document + + + Document + + \ No newline at end of file diff --git a/src/Effects/Effects.vcxproj.filters b/src/Effects/Effects.vcxproj.filters index 22983cdec..de510a730 100644 --- a/src/Effects/Effects.vcxproj.filters +++ b/src/Effects/Effects.vcxproj.filters @@ -2,7 +2,6 @@ - @@ -212,6 +211,8 @@ Pixel Art + + diff --git a/src/Effects/Nearest.hlsl b/src/Effects/Nearest.hlsl new file mode 100644 index 000000000..1dc6604bc --- /dev/null +++ b/src/Effects/Nearest.hlsl @@ -0,0 +1,24 @@ +//!MAGPIE EFFECT +//!VERSION 4 +//!GENERIC_DOWNSCALER + + +//!TEXTURE +Texture2D INPUT; + +//!TEXTURE +Texture2D OUTPUT; + +//!SAMPLER +//!FILTER POINT +SamplerState sam; + + +//!PASS 1 +//!STYLE PS +//!IN INPUT +//!OUT OUTPUT + +float4 Pass1(float2 pos) { + return INPUT.SampleLevel(sam, pos, 0); +} diff --git a/src/Magpie.App/EffectsService.cpp b/src/Magpie.App/EffectsService.cpp index fad0cf53c..46461ab48 100644 --- a/src/Magpie.App/EffectsService.cpp +++ b/src/Magpie.App/EffectsService.cpp @@ -39,7 +39,12 @@ static void ListEffects(std::vector& result, std::wstring_view pre continue; } - result.emplace_back(StrUtils::ConcatW(prefix, fileName.substr(0, fileName.size() - 5))); + std::wstring effectName = StrUtils::ConcatW(prefix, fileName.substr(0, fileName.size() - 5)); + if (std::find(std::begin(EffectCompiler::BUILTIN_EFFECTS), std::end(EffectCompiler::BUILTIN_EFFECTS), + effectName) == std::end(EffectCompiler::BUILTIN_EFFECTS)) + { + result.emplace_back(std::move(effectName)); + } } while (FindNextFile(hFind, &findData)); FindClose(hFind); diff --git a/src/Effects/Bicubic.hlsl b/src/Magpie.Core/BicubicEffect.h similarity index 97% rename from src/Effects/Bicubic.hlsl rename to src/Magpie.Core/BicubicEffect.h index d87ae58a3..868a9fe6f 100644 --- a/src/Effects/Bicubic.hlsl +++ b/src/Magpie.Core/BicubicEffect.h @@ -1,3 +1,6 @@ +#pragma once + +constexpr const char* BICUBIC_EFFECT_SOURCE = R"( // Bicubic 插值算法 // 移植自 https://github.com/ActualMandM/cemu_graphic_packs/blob/468d165cf27dae13a06e8bdc3d588d0af775ad91/Filters/Bicubic/output.glsl @@ -113,3 +116,5 @@ float4 Pass1(float2 pos) { return float4(total, 1); } + +)"; diff --git a/src/Magpie.Core/EffectCompiler.cpp b/src/Magpie.Core/EffectCompiler.cpp index 718aa2331..a5a82fc0a 100644 --- a/src/Magpie.Core/EffectCompiler.cpp +++ b/src/Magpie.Core/EffectCompiler.cpp @@ -12,6 +12,7 @@ #include "EffectHelper.h" #include "Win32Utils.h" #include "EffectDesc.h" +#include "BicubicEffect.h" namespace Magpie::Core { @@ -1436,41 +1437,18 @@ static uint32_t CompilePasses( } static std::string ReadEffectSource(const std::wstring& effectName) noexcept { - std::string source; - - if (effectName == L"Nearest" || effectName == L"Bilinear") { - source.reserve(160); - - source = R"(//!MAGPIE EFFECT -//!VERSION 4 -//!GENERIC_DOWNSCALER - -//!SAMPLER -//!FILTER )"; - if (effectName == L"Nearest") { - source += "POINT"; - } else { - source += "LINEAR"; - } + if (effectName == EffectCompiler::BUILTIN_EFFECTS[0]) { + return BICUBIC_EFFECT_SOURCE; + } - source += R"( -SamplerState sam; + std::wstring fileName = StrUtils::ConcatW(CommonSharedConstants::EFFECTS_DIR, effectName, L".hlsl"); -//!PASS 1 -//!STYLE PS -//!IN INPUT -//!OUT OUTPUT -float4 Pass1(float2 pos) { return INPUT.SampleLevel(sam, pos, 0); })"; - return source; - } else { - std::wstring fileName = StrUtils::ConcatW(CommonSharedConstants::EFFECTS_DIR, effectName, L".hlsl"); - - if (!Win32Utils::ReadTextFile(fileName.c_str(), source)) { - Logger::Get().Error("读取源文件失败"); - return {}; - } - return source; + std::string source; + if (!Win32Utils::ReadTextFile(fileName.c_str(), source)) { + Logger::Get().Error("读取源文件失败"); + return {}; } + return source; } uint32_t EffectCompiler::Compile( diff --git a/src/Magpie.Core/EffectCompiler.h b/src/Magpie.Core/EffectCompiler.h index 52f643ba3..eaa1d9beb 100644 --- a/src/Magpie.Core/EffectCompiler.h +++ b/src/Magpie.Core/EffectCompiler.h @@ -23,7 +23,7 @@ struct API_DECLSPEC EffectCompiler { ) noexcept; // 将这些效果内置防止没有默认降采样效果 - static constexpr const wchar_t* BUILTIN_EFFECTS[] = { L"Nearest", L"Bilinear" }; + static constexpr const wchar_t* BUILTIN_EFFECTS[] = { L"Bicubic" }; }; } diff --git a/src/Magpie.Core/Magpie.Core.vcxproj b/src/Magpie.Core/Magpie.Core.vcxproj index 980504f03..ba2505b55 100644 --- a/src/Magpie.Core/Magpie.Core.vcxproj +++ b/src/Magpie.Core/Magpie.Core.vcxproj @@ -78,6 +78,7 @@ + From 20886bb88704d5b6d2aa91eebcfa81f5bb59ce3b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=97=AD?= <34770031+Blinue@users.noreply.github.com> Date: Tue, 13 Jun 2023 22:14:46 +0800 Subject: [PATCH 022/155] =?UTF-8?q?feat:=20=E5=88=A0=E9=99=A4=E9=BB=98?= =?UTF-8?q?=E8=AE=A4=E9=99=8D=E9=87=87=E6=A0=B7=E6=95=88=E6=9E=9C=E9=80=89?= =?UTF-8?q?=E9=A1=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Magpie.App/AppSettings.cpp | 44 ------------ src/Magpie.App/AppSettings.h | 5 -- src/Magpie.App/EffectParametersViewModel.cpp | 17 +---- src/Magpie.App/EffectParametersViewModel.h | 4 -- src/Magpie.App/Resources.language-en-US.resw | 21 +++--- src/Magpie.App/ScalingConfigurationPage.xaml | 41 +---------- .../ScalingConfigurationViewModel.cpp | 72 ------------------- .../ScalingConfigurationViewModel.h | 22 ------ .../ScalingConfigurationViewModel.idl | 5 -- src/Magpie.App/ScalingModeEffectItem.h | 2 +- src/Magpie.App/ScalingService.cpp | 1 - src/Magpie.Core/ScalingOptions.h | 7 -- 12 files changed, 13 insertions(+), 228 deletions(-) diff --git a/src/Magpie.App/AppSettings.cpp b/src/Magpie.App/AppSettings.cpp index 3fba276fe..13a8fb77a 100644 --- a/src/Magpie.App/AppSettings.cpp +++ b/src/Magpie.App/AppSettings.cpp @@ -521,23 +521,6 @@ bool AppSettings::_Save(const _AppSettingsData& data) noexcept { writer.Key("updateCheckDate"); writer.Int64(data._updateCheckDate.time_since_epoch().count()); - if (!data._downscalingEffect.name.empty()) { - writer.Key("downscalingEffect"); - writer.StartObject(); - writer.Key("name"); - writer.String(StrUtils::UTF16ToUTF8(data._downscalingEffect.name).c_str()); - if (!data._downscalingEffect.parameters.empty()) { - writer.Key("parameters"); - writer.StartObject(); - for (const auto& [name, value] : data._downscalingEffect.parameters) { - writer.Key(StrUtils::UTF16ToUTF8(name).c_str()); - writer.Double(value); - } - writer.EndObject(); - } - writer.EndObject(); - } - ScalingModesService::Get().Export(writer); writer.Key("profiles"); @@ -663,28 +646,6 @@ void AppSettings::_LoadSettings(const rapidjson::GenericObjectvalue.IsObject()) { - auto downscalingEffectObj = downscalingEffectNode->value.GetObj(); - - JsonHelper::ReadString(downscalingEffectObj, "name", _downscalingEffect.name); - if (!_downscalingEffect.name.empty()) { - auto parametersNode = downscalingEffectObj.FindMember("parameters"); - if (parametersNode != downscalingEffectObj.MemberEnd() && parametersNode->value.IsObject()) { - auto paramsObj = parametersNode->value.GetObj(); - _downscalingEffect.parameters.reserve(paramsObj.MemberCount()); - for (const auto& param : paramsObj) { - if (!param.value.IsNumber()) { - continue; - } - - std::wstring name = StrUtils::UTF8ToUTF16(param.name.GetString()); - _downscalingEffect.parameters[name] = param.value.GetFloat(); - } - } - } - } - [[maybe_unused]] bool result = ScalingModesService::Get().Import(root, true); assert(result); @@ -947,11 +908,6 @@ void AppSettings::_SetDefaultScalingModes() { nearest.scale = { 2.0f,2.0f }; } - // 降采样效果默认为 Bicubic (B=0, C=0.5) - _downscalingEffect.name = L"Bicubic"; - _downscalingEffect.parameters[L"paramB"] = 0.0f; - _downscalingEffect.parameters[L"paramC"] = 0.5f; - // 全局缩放模式默认为 Lanczos _defaultProfile.scalingMode = 0; } diff --git a/src/Magpie.App/AppSettings.h b/src/Magpie.App/AppSettings.h index a3816b93e..032cd6fbe 100644 --- a/src/Magpie.App/AppSettings.h +++ b/src/Magpie.App/AppSettings.h @@ -23,7 +23,6 @@ struct _AppSettingsData { std::array _shortcuts; - ::Magpie::Core::DownscalingEffect _downscalingEffect; std::vector _scalingModes; Profile _defaultProfile; @@ -292,10 +291,6 @@ class AppSettings : private _AppSettingsData { SaveAsync(); } - ::Magpie::Core::DownscalingEffect& DownscalingEffect() noexcept { - return _downscalingEffect; - } - std::vector& ScalingModes() noexcept { return _scalingModes; } diff --git a/src/Magpie.App/EffectParametersViewModel.cpp b/src/Magpie.App/EffectParametersViewModel.cpp index 9e953a335..2d8694336 100644 --- a/src/Magpie.App/EffectParametersViewModel.cpp +++ b/src/Magpie.App/EffectParametersViewModel.cpp @@ -59,17 +59,8 @@ static fire_and_forget LazySaveAppSettings() { EffectParametersViewModel::EffectParametersViewModel(uint32_t scalingModeIdx, uint32_t effectIdx) : _scalingModeIdx(scalingModeIdx), _effectIdx(effectIdx) { - std::wstring_view effectName; - if (_IsDefaultDownscalingEffect()) { - effectName = AppSettings::Get().DownscalingEffect().name; - if (effectName.empty()) { - return; - } - } else { - ScalingMode& scalingMode = ScalingModesService::Get().GetScalingMode(_scalingModeIdx); - effectName = scalingMode.effects[_effectIdx].name; - } - _effectInfo = EffectsService::Get().GetEffect(effectName); + ScalingMode& scalingMode = ScalingModesService::Get().GetScalingMode(_scalingModeIdx); + _effectInfo = EffectsService::Get().GetEffect(scalingMode.effects[_effectIdx].name); phmap::flat_hash_map& params = _Data(); @@ -163,10 +154,6 @@ void EffectParametersViewModel::_ScalingModeFloatParameter_PropertyChanged( } phmap::flat_hash_map& EffectParametersViewModel::_Data() { - if (_IsDefaultDownscalingEffect()) { - return AppSettings::Get().DownscalingEffect().parameters; - } - ScalingMode& scalingMode = ScalingModesService::Get().GetScalingMode(_scalingModeIdx); return scalingMode.effects[_effectIdx].parameters; } diff --git a/src/Magpie.App/EffectParametersViewModel.h b/src/Magpie.App/EffectParametersViewModel.h index 7f5a6aec0..311a2fd00 100644 --- a/src/Magpie.App/EffectParametersViewModel.h +++ b/src/Magpie.App/EffectParametersViewModel.h @@ -151,10 +151,6 @@ struct EffectParametersViewModel : EffectParametersViewModelT& _Data(); - bool _IsDefaultDownscalingEffect() const noexcept { - return _scalingModeIdx == std::numeric_limits::max(); - } - IVector _boolParams{ nullptr }; IVector _floatParams{ nullptr }; diff --git a/src/Magpie.App/Resources.language-en-US.resw b/src/Magpie.App/Resources.language-en-US.resw index 90b2f25aa..0554e9853 100644 --- a/src/Magpie.App/Resources.language-en-US.resw +++ b/src/Magpie.App/Resources.language-en-US.resw @@ -279,15 +279,6 @@ Launch - - General - - - Automatically applied when output image is too large to fit on the screen - - - Default downscaling effect - Export @@ -339,9 +330,6 @@ Github repository - - None - Parameters @@ -844,4 +832,13 @@ Scale the foreground window or stop scaling + + Export + + + Import + + + Import ScaleModels.json + \ No newline at end of file diff --git a/src/Magpie.App/ScalingConfigurationPage.xaml b/src/Magpie.App/ScalingConfigurationPage.xaml index f486371f6..b3367eed6 100644 --- a/src/Magpie.App/ScalingConfigurationPage.xaml +++ b/src/Magpie.App/ScalingConfigurationPage.xaml @@ -128,47 +128,8 @@ IsOpen="{x:Bind ViewModel.ShowErrorMessage, Mode=TwoWay}" Severity="Error" Visibility="{x:Bind ViewModel.ShowErrorMessage, Mode=OneWay}" /> - - - - - - - - - - - - - - - downscalingEffects; - downscalingEffects.reserve(7); - - ResourceLoader resourceLoader = ResourceLoader::GetForCurrentView(); - downscalingEffects.push_back(box_value(resourceLoader.GetString( - L"ScalingConfiguration_General_DefaultDownscalingEffect_None"))); - - _downscalingEffectNames.reserve(6); - for (const EffectInfo& effectInfo : EffectsService::Get().Effects()) { - if (effectInfo.IsGenericDownscaler()) { - _downscalingEffectNames.emplace_back(effectInfo.name, - StrUtils::ToLowerCase(EffectHelper::GetDisplayName(effectInfo.name))); - } - } - - // 根据显示名排序,不区分大小写 - std::sort(_downscalingEffectNames.begin(), _downscalingEffectNames.end(), - [](const auto& l, const auto& r) { return l.second < r.second; }); - for (const auto& pair : _downscalingEffectNames) { - downscalingEffects.push_back(box_value(EffectHelper::GetDisplayName(pair.first))); - } - _downscalingEffects = single_threaded_vector(std::move(downscalingEffects)); - - DownscalingEffect& downscalingEffect = AppSettings::Get().DownscalingEffect(); - if (!downscalingEffect.name.empty()) { - auto it = std::lower_bound( - _downscalingEffectNames.begin(), - _downscalingEffectNames.end(), - downscalingEffect.name, - [](const auto& l, const std::wstring& r) { return l.first < r; } - ); - - if (it == _downscalingEffectNames.end() || it->first != downscalingEffect.name) { - Logger::Get().Warn(fmt::format("降采样效果 {} 不存在", - StrUtils::UTF16ToUTF8(downscalingEffect.name))); - downscalingEffect.name.clear(); - downscalingEffect.parameters.clear(); - } else { - _downscalingEffectIndex = int(it - _downscalingEffectNames.begin() + 1); - } - } _AddScalingModes(); @@ -159,36 +117,6 @@ void ScalingConfigurationViewModel::_Import(bool legacy) { } } -void ScalingConfigurationViewModel::DownscalingEffectIndex(int value) { - if (_downscalingEffectIndex == value) { - return; - } - _downscalingEffectIndex = value; - - DownscalingEffect& downscalingEffect = AppSettings::Get().DownscalingEffect(); - downscalingEffect.parameters.clear(); - if (value <= 0) { - downscalingEffect.name.clear(); - } else { - downscalingEffect.name = _downscalingEffectNames[(size_t)value - 1].first; - } - - _propertyChangedEvent(*this, PropertyChangedEventArgs(L"DownscalingEffectIndex")); - _propertyChangedEvent(*this, PropertyChangedEventArgs(L"DownscalingEffectHasParameters")); - _propertyChangedEvent(*this, PropertyChangedEventArgs(L"DownscalingEffectParameters")); - - AppSettings::Get().SaveAsync(); -} - -bool ScalingConfigurationViewModel::DownscalingEffectHasParameters() noexcept { - if (_downscalingEffectIndex == 0) { - return false; - } - - const std::wstring& effectName = _downscalingEffectNames[(size_t)_downscalingEffectIndex - 1].first; - return !EffectsService::Get().GetEffect(effectName)->params.empty(); -} - void ScalingConfigurationViewModel::PrepareForAdd() { std::vector copyFromList; diff --git a/src/Magpie.App/ScalingConfigurationViewModel.h b/src/Magpie.App/ScalingConfigurationViewModel.h index 4216a9acb..e5535049c 100644 --- a/src/Magpie.App/ScalingConfigurationViewModel.h +++ b/src/Magpie.App/ScalingConfigurationViewModel.h @@ -35,24 +35,6 @@ struct ScalingConfigurationViewModel : ScalingConfigurationViewModelT DownscalingEffects() const noexcept { - return _downscalingEffects; - } - - int DownscalingEffectIndex() const noexcept { - return _downscalingEffectIndex; - } - - void DownscalingEffectIndex(int value); - - bool DownscalingEffectHasParameters() noexcept; - - Magpie::App::EffectParametersViewModel DownscalingEffectParameters() const noexcept { - // 默认构造表示降采样效果参数 - // 每次调用都返回一个新的实例,因为此时降采样效果已更改 - return {}; - } - Animation::TransitionCollection ScalingModesListTransitions() const noexcept { return _scalingModesListTransitions; } @@ -103,9 +85,6 @@ struct ScalingConfigurationViewModel : ScalingConfigurationViewModelT _downscalingEffects{ nullptr }; - // (FullName, 小写 DisplayName) - std::vector> _downscalingEffectNames; IObservableVector _scalingModes = single_threaded_observable_vector(); WinRTUtils::EventRevoker _scalingModeAddedRevoker; @@ -116,7 +95,6 @@ struct ScalingConfigurationViewModel : ScalingConfigurationViewModelT _newScalingModeCopyFromList{ nullptr }; int _newScalingModeCopyFrom = 0; - int _downscalingEffectIndex = 0; bool _showErrorMessage = false; bool _addingScalingModes = false; diff --git a/src/Magpie.App/ScalingConfigurationViewModel.idl b/src/Magpie.App/ScalingConfigurationViewModel.idl index 1964bb9bd..aab597138 100644 --- a/src/Magpie.App/ScalingConfigurationViewModel.idl +++ b/src/Magpie.App/ScalingConfigurationViewModel.idl @@ -7,11 +7,6 @@ namespace Magpie.App { void ImportLegacy(); Boolean ShowErrorMessage; - - IVector DownscalingEffects { get; }; - Int32 DownscalingEffectIndex; - Boolean DownscalingEffectHasParameters { get; }; - EffectParametersViewModel DownscalingEffectParameters { get; }; Windows.UI.Xaml.Media.Animation.TransitionCollection ScalingModesListTransitions { get; }; IObservableVector ScalingModes { get; }; diff --git a/src/Magpie.App/ScalingModeEffectItem.h b/src/Magpie.App/ScalingModeEffectItem.h index da1009869..aa7b8ef8c 100644 --- a/src/Magpie.App/ScalingModeEffectItem.h +++ b/src/Magpie.App/ScalingModeEffectItem.h @@ -106,7 +106,7 @@ struct ScalingModeEffectItem : ScalingModeEffectItemT { event> _removedEvent; event> _movedEvent; - Magpie::App::EffectParametersViewModel _parametersViewModel; + Magpie::App::EffectParametersViewModel _parametersViewModel{ nullptr }; }; } diff --git a/src/Magpie.App/ScalingService.cpp b/src/Magpie.App/ScalingService.cpp index 68fb4cc47..5ed399831 100644 --- a/src/Magpie.App/ScalingService.cpp +++ b/src/Magpie.App/ScalingService.cpp @@ -311,7 +311,6 @@ bool ScalingService::_StartScale(HWND hWnd, const Profile& profile) { } } - options.downscalingEffect = settings.DownscalingEffect(); options.IsDebugMode(settings.IsDebugMode()); options.IsDisableEffectCache(settings.IsDisableEffectCache()); options.IsDisableFontCache(settings.IsDisableFontCache()); diff --git a/src/Magpie.Core/ScalingOptions.h b/src/Magpie.Core/ScalingOptions.h index a55b8be05..a3b42a9ba 100644 --- a/src/Magpie.Core/ScalingOptions.h +++ b/src/Magpie.Core/ScalingOptions.h @@ -47,11 +47,6 @@ struct MagFlags { static constexpr const uint32_t AllowScalingMaximized = 0x8000; }; -struct DownscalingEffect { - std::wstring name; - phmap::flat_hash_map parameters; -}; - enum class ScalingType { Normal, // Scale 表示缩放倍数 Fit, // Scale 表示相对于屏幕能容纳的最大等比缩放的比例 @@ -103,8 +98,6 @@ struct ScalingOptions { MultiMonitorUsage multiMonitorUsage = MultiMonitorUsage::Closest; CursorInterpolationMode cursorInterpolationMode = CursorInterpolationMode::NearestNeighbor; - DownscalingEffect downscalingEffect; - std::vector effects; }; From 019b065f4ba8cd49b1f14fe2084f1fcb049e4ac6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=97=AD?= <34770031+Blinue@users.noreply.github.com> Date: Tue, 13 Jun 2023 22:45:08 +0800 Subject: [PATCH 023/155] =?UTF-8?q?feat:=20=E9=BB=98=E8=AE=A4=E9=99=8D?= =?UTF-8?q?=E9=87=87=E6=A0=B7=E6=95=88=E6=9E=9C=E5=A7=8B=E7=BB=88=E4=B8=BA?= =?UTF-8?q?=20Catmull-Rom?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Magpie.App/Resources.language-en-US.resw | 9 -- src/Magpie.App/Resources.language-es.resw | 12 --- src/Magpie.App/Resources.language-ja.resw | 12 --- src/Magpie.App/Resources.language-ko.resw | 73 ++++++++++--- src/Magpie.App/Resources.language-pt-BR.resw | 73 ++++++++++--- src/Magpie.App/Resources.language-ru.resw | 12 --- src/Magpie.App/Resources.language-tr.resw | 12 --- src/Magpie.App/Resources.language-uk.resw | 12 --- .../Resources.language-zh-Hans.resw | 12 --- .../Resources.language-zh-Hant.resw | 12 --- src/Magpie.Core/Renderer.cpp | 100 ++++++------------ 11 files changed, 154 insertions(+), 185 deletions(-) diff --git a/src/Magpie.App/Resources.language-en-US.resw b/src/Magpie.App/Resources.language-en-US.resw index 0554e9853..1ec92c7db 100644 --- a/src/Magpie.App/Resources.language-en-US.resw +++ b/src/Magpie.App/Resources.language-en-US.resw @@ -832,13 +832,4 @@ Scale the foreground window or stop scaling - - Export - - - Import - - - Import ScaleModels.json - \ No newline at end of file diff --git a/src/Magpie.App/Resources.language-es.resw b/src/Magpie.App/Resources.language-es.resw index 91a30a09b..4ee0c0f66 100644 --- a/src/Magpie.App/Resources.language-es.resw +++ b/src/Magpie.App/Resources.language-es.resw @@ -255,9 +255,6 @@ Lanzamiento - - General - Exportar @@ -591,18 +588,12 @@ Atajo para la superposición en el juego - - Se aplica automáticamente cuando la imagen de salida es demasiado grande para caber en la pantalla - Mover hacia abajo Renombrar - - Efecto de reducción de escala predeterminado - Importar @@ -612,9 +603,6 @@ Necesita ejecutar como administrador para usar esta configuración - - Ninguno - Está siendo utilizado por los siguientes perfiles: diff --git a/src/Magpie.App/Resources.language-ja.resw b/src/Magpie.App/Resources.language-ja.resw index bd55f79f7..3aae359c6 100644 --- a/src/Magpie.App/Resources.language-ja.resw +++ b/src/Magpie.App/Resources.language-ja.resw @@ -288,9 +288,6 @@ 立ち上げ - - デフォルトのダウンサンプリング効果 - エクスポート @@ -333,9 +330,6 @@ Githubリポジトリ - - なし - パラメータ @@ -631,12 +625,6 @@ ゲーム内オーバーレイのショートカット - - 一般設定 - - - 出力画像が画面に収まりきらない場合、自動的にこの効果が適用されます - この設定を使用するには、管理者として実行する必要があります diff --git a/src/Magpie.App/Resources.language-ko.resw b/src/Magpie.App/Resources.language-ko.resw index 90a306274..68cc41977 100644 --- a/src/Magpie.App/Resources.language-ko.resw +++ b/src/Magpie.App/Resources.language-ko.resw @@ -1,6 +1,65 @@ - + + @@ -244,12 +303,6 @@ 실행 - - 일반 - - - 기본 다운스케일링 효과 - 내보내기 @@ -505,9 +558,6 @@ 포터블 모드 - - 없음 - 매개변수 @@ -758,9 +808,6 @@ 프레임 통계 - - 출력 이미지가 너무 커서 화면에 맞지 않을 때 자동으로 적용됩니다(특징을 한눈에 이해할 수 있도록 원문에 없는 아이콘을 추가했습니다. 해당 번역은 다음 버전에 추가됩니다. 무거운 알고리즘일수록 각진 부분을 뭉개서 부드럽게 합니다. 원문은 알파벳순으로 정렬되어 있습니다.) - 폰트 캐시 비활성화 diff --git a/src/Magpie.App/Resources.language-pt-BR.resw b/src/Magpie.App/Resources.language-pt-BR.resw index b1ce3d240..583387a59 100644 --- a/src/Magpie.App/Resources.language-pt-BR.resw +++ b/src/Magpie.App/Resources.language-pt-BR.resw @@ -1,6 +1,65 @@ - + + @@ -151,9 +210,6 @@ Ativado - - Efeito de redimensionamento padrão - Exportar @@ -178,9 +234,6 @@ Repositório no GitHub - - Nenhum - Parâmetros @@ -406,12 +459,6 @@ Inicialização - - Geral - - - Aplicado automaticamente quando a imagem de saída é muito grande para caber na tela - Importar ScaleModels.json diff --git a/src/Magpie.App/Resources.language-ru.resw b/src/Magpie.App/Resources.language-ru.resw index 2c1e655f1..84da3ea20 100644 --- a/src/Magpie.App/Resources.language-ru.resw +++ b/src/Magpie.App/Resources.language-ru.resw @@ -126,9 +126,6 @@ Очистить - - Ничего - Параметры @@ -327,15 +324,6 @@ Запуск - - Общие - - - Автоматически применяется, когда выходное изображение слишком велико, чтобы уместиться на экране - - - Эффект уменьшения по умолчанию - Экспорт diff --git a/src/Magpie.App/Resources.language-tr.resw b/src/Magpie.App/Resources.language-tr.resw index 09bce72e3..2ba0eccfe 100644 --- a/src/Magpie.App/Resources.language-tr.resw +++ b/src/Magpie.App/Resources.language-tr.resw @@ -312,12 +312,6 @@ Başlat - - Genel - - - Varsayılan ölçek küçültme efekti - Dışarı aktar @@ -742,9 +736,6 @@ Ölçek - - Çıktı görüntüsü ekrana sığmayacak kadar büyük olduğunda otomatik uygulanır - Katkı kuralları @@ -754,9 +745,6 @@ Ölçek - - Yok - Yeni ölçek kipi diff --git a/src/Magpie.App/Resources.language-uk.resw b/src/Magpie.App/Resources.language-uk.resw index 4b008a031..7526cdaf2 100644 --- a/src/Magpie.App/Resources.language-uk.resw +++ b/src/Magpie.App/Resources.language-uk.resw @@ -234,12 +234,6 @@ Запуск - - Загальні - - - Ефект зменшення масштабу за замовчуванням - Експорт @@ -276,9 +270,6 @@ Рекомендації щодо внеску - - Немає - Параметри @@ -646,9 +637,6 @@ Повідомити про помилку - - Автоматично застосовується, коли вихідне зображення занадто велике, щоб поміститися на екрані - Імпорт diff --git a/src/Magpie.App/Resources.language-zh-Hans.resw b/src/Magpie.App/Resources.language-zh-Hans.resw index 117f20e66..9ff61aa4d 100644 --- a/src/Magpie.App/Resources.language-zh-Hans.resw +++ b/src/Magpie.App/Resources.language-zh-Hans.resw @@ -279,15 +279,6 @@ 启动 - - 通用 - - - 输出图像太大无法被屏幕容纳时将自动应用此效果 - - - 默认降采样效果 - 导出 @@ -339,9 +330,6 @@ Github 仓库 - - - 参数 diff --git a/src/Magpie.App/Resources.language-zh-Hant.resw b/src/Magpie.App/Resources.language-zh-Hant.resw index 0ea3f9468..acbe365bf 100644 --- a/src/Magpie.App/Resources.language-zh-Hant.resw +++ b/src/Magpie.App/Resources.language-zh-Hant.resw @@ -264,15 +264,6 @@ 啟動 - - 一般資訊 - - - 輸出影像大於螢幕本身解析度時將自動套用此效果 - - - 預設縮小效果 - 匯出 @@ -336,9 +327,6 @@ Github 倉庫 - - - 更多設定 diff --git a/src/Magpie.Core/Renderer.cpp b/src/Magpie.Core/Renderer.cpp index 6abcdde65..38dcd5dfc 100644 --- a/src/Magpie.Core/Renderer.cpp +++ b/src/Magpie.Core/Renderer.cpp @@ -281,10 +281,6 @@ ID3D11Texture2D* Renderer::_BuildEffects(const ScalingOptions& options) noexcept Logger::Get().Info(fmt::format("编译着色器总计用时 {} 毫秒", duration / 1000.0f)); } - /*DownscalingEffect& downscalingEffect = MagApp::Get().GetOptions().downscalingEffect; - if (!downscalingEffect.name.empty()) { - _effects.reserve(effectsOption.size() + 1); - }*/ _effectDrawers.resize(options.effects.size()); ID3D11Texture2D* inOutTexture = _frameSource->GetOutput(); @@ -301,70 +297,42 @@ ID3D11Texture2D* Renderer::_BuildEffects(const ScalingOptions& options) noexcept } } - return inOutTexture; - - /*if (!downscalingEffect.name.empty()) { - const SIZE hostSize = Win32Utils::GetSizeOfRect(MagApp::Get().GetHostWndRect()); - const SIZE outputSize = Win32Utils::GetSizeOfRect(_virtualOutputRect); - if (outputSize.cx > hostSize.cx || outputSize.cy > hostSize.cy) { - // 需降采样 - EffectOption downscalingEffectOption; - downscalingEffectOption.name = downscalingEffect.name; - downscalingEffectOption.parameters = downscalingEffect.parameters; - downscalingEffectOption.scalingType = ScalingType::Fit; - downscalingEffectOption.flags = EffectOptionFlags::InlineParams; // 内联参数 - - EffectDesc downscalingEffectDesc; - - // 最后一个效果需重新编译 - // 在分离光标渲染逻辑后这里可优化 - duration = Utils::Measure([&]() { - Win32Utils::RunParallel([&](uint32_t id) { - if (!CompileEffect( - id == 1, - id == 0 ? effectsOption.back() : downscalingEffectOption, - id == 0 ? effectDescs.back() : downscalingEffectDesc - )) { - allSuccess = false; - } - }, 2); - }); - - if (!allSuccess) { - return false; - } - - Logger::Get().Info(fmt::format("编译降采样着色器用时 {} 毫秒", duration / 1000.0f)); - - _effects.pop_back(); - if (_effects.empty()) { - effectInput = MagApp::Get().GetFrameSource().GetOutput(); - } else { - effectInput = _effects.back().GetOutputTexture(); - } - - _effects.resize(_effects.size() + 2); + // 输出尺寸大于缩放窗口尺寸则需要降采样 + D3D11_TEXTURE2D_DESC desc; + inOutTexture->GetDesc(&desc); + if ((LONG)desc.Width > _scalingWndSize.cx || (LONG)desc.Height > _scalingWndSize.cy) { + std::optional bicubicDesc; + + EffectOption bicubicOption; + bicubicOption.name = L"Bicubic"; + bicubicOption.parameters[L"paramB"] = 0.0f; + bicubicOption.parameters[L"paramC"] = 0.5f; + bicubicOption.scalingType = ScalingType::Fit; + // 参数不会改变,因此可以内联 + bicubicOption.flags = EffectOptionFlags::InlineParams; + + duration = Utils::Measure([&]() { + bicubicDesc = CompileEffect(options, bicubicOption); + }); + + if (!bicubicDesc) { + return nullptr; + } - // 重新构建最后一个效果 - const size_t originLastEffectIdx = _effects.size() - 2; - if (!_effects[originLastEffectIdx].Initialize(effectDescs.back(), effectsOption.back(), - effectInput, nullptr, nullptr) - ) { - Logger::Get().Error(fmt::format("初始化效果#{} ({}) 失败", - originLastEffectIdx, StrUtils::UTF16ToUTF8(effectsOption.back().name))); - return false; - } - effectInput = _effects[originLastEffectIdx].GetOutputTexture(); - - // 构建降采样效果 - if (!_effects.back().Initialize(downscalingEffectDesc, downscalingEffectOption, - effectInput, &_outputRect, &_virtualOutputRect - )) { - Logger::Get().Error(fmt::format("初始化降采样效果 ({}) 失败", - StrUtils::UTF16ToUTF8(downscalingEffect.name))); - } + EffectDrawer& bicubicDrawer = _effectDrawers.emplace_back(); + if (!bicubicDrawer.Initialize( + *bicubicDesc, + bicubicOption, + _backendResources, + _scalingWndSize, + &inOutTexture + )) { + Logger::Get().Error("初始化降采样效果失败"); + return nullptr; } - }*/ + } + + return inOutTexture; } bool Renderer::_CreateSharedTexture(ID3D11Texture2D* effectsOutput) noexcept { From d2a2432d5e632ba3bc774a0f31b9b9e627c6b7d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=97=AD?= <34770031+Blinue@users.noreply.github.com> Date: Tue, 13 Jun 2023 23:30:59 +0800 Subject: [PATCH 024/155] =?UTF-8?q?fix:=20=E7=A8=8D=E5=BE=AE=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Magpie.Core/Renderer.cpp | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/Magpie.Core/Renderer.cpp b/src/Magpie.Core/Renderer.cpp index 38dcd5dfc..2e46549f8 100644 --- a/src/Magpie.Core/Renderer.cpp +++ b/src/Magpie.Core/Renderer.cpp @@ -301,8 +301,6 @@ ID3D11Texture2D* Renderer::_BuildEffects(const ScalingOptions& options) noexcept D3D11_TEXTURE2D_DESC desc; inOutTexture->GetDesc(&desc); if ((LONG)desc.Width > _scalingWndSize.cx || (LONG)desc.Height > _scalingWndSize.cy) { - std::optional bicubicDesc; - EffectOption bicubicOption; bicubicOption.name = L"Bicubic"; bicubicOption.parameters[L"paramB"] = 0.0f; @@ -311,11 +309,9 @@ ID3D11Texture2D* Renderer::_BuildEffects(const ScalingOptions& options) noexcept // 参数不会改变,因此可以内联 bicubicOption.flags = EffectOptionFlags::InlineParams; - duration = Utils::Measure([&]() { - bicubicDesc = CompileEffect(options, bicubicOption); - }); - + std::optional bicubicDesc = CompileEffect(options, bicubicOption); if (!bicubicDesc) { + Logger::Get().Error("编译降采样效果失败"); return nullptr; } From 1e5c702e8bec65b60a15c60bd81825081b5b0161 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=97=AD?= <34770031+Blinue@users.noreply.github.com> Date: Wed, 14 Jun 2023 21:26:19 +0800 Subject: [PATCH 025/155] =?UTF-8?q?perf:=20=E9=99=8D=E4=BD=8E=E6=B8=B2?= =?UTF-8?q?=E6=9F=93=E5=BB=B6=E8=BF=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Magpie.Core/Renderer.cpp | 40 +++++++++++++++++++++--------- src/Magpie.Core/Renderer.h | 5 +++- src/Magpie.Core/ScalingRuntime.cpp | 5 ++-- 3 files changed, 34 insertions(+), 16 deletions(-) diff --git a/src/Magpie.Core/Renderer.cpp b/src/Magpie.Core/Renderer.cpp index 2e46549f8..9eec8ff52 100644 --- a/src/Magpie.Core/Renderer.cpp +++ b/src/Magpie.Core/Renderer.cpp @@ -10,6 +10,7 @@ #include "EffectCompiler.h" #include "GraphicsCaptureFrameSource.h" #include "DirectXHelper.h" +#include namespace Magpie::Core { @@ -49,8 +50,8 @@ bool Renderer::Initialize(HWND hwndSrc, HWND hwndScaling, const ScalingOptions& return true; } -bool Renderer::_CreateSwapChain(const ScalingOptions& options) noexcept { - DXGI_SWAP_CHAIN_DESC1 sd {}; +bool Renderer::_CreateSwapChain(const ScalingOptions& /*options*/) noexcept { + DXGI_SWAP_CHAIN_DESC1 sd{}; sd.Width = _scalingWndSize.cx; sd.Height = _scalingWndSize.cy; sd.Format = DXGI_FORMAT_R8G8B8A8_UNORM; @@ -58,7 +59,7 @@ bool Renderer::_CreateSwapChain(const ScalingOptions& options) noexcept { sd.SampleDesc.Count = 1; sd.Scaling = DXGI_SCALING_NONE; sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; - sd.BufferCount = (options.IsTripleBuffering() || !options.IsVSync()) ? 3 : 2; + sd.BufferCount = 4; // 渲染每帧之前都会清空后缓冲区,因此无需 DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL sd.SwapEffect = DXGI_SWAP_EFFECT_FLIP_DISCARD; // 只要显卡支持始终启用 DXGI_SWAP_CHAIN_FLAG_ALLOW_TEARING 以支持可变刷新率 @@ -85,7 +86,7 @@ bool Renderer::_CreateSwapChain(const ScalingOptions& options) noexcept { return false; } - _swapChain->SetMaximumFrameLatency(1); + _swapChain->SetMaximumFrameLatency(3); _frameLatencyWaitableObject.reset(_swapChain->GetFrameLatencyWaitableObject()); if (!_frameLatencyWaitableObject) { @@ -103,6 +104,7 @@ bool Renderer::_CreateSwapChain(const ScalingOptions& options) noexcept { Logger::Get().ComError("获取后缓冲区失败", hr); return false; } + return true; } @@ -125,8 +127,8 @@ bool Renderer::_ObtainSharedTexture() noexcept { } void Renderer::Render() noexcept { - if (_sharedTextureMutexKey == 0) { - // 第一帧尚未渲染完成 + if (_lastAccessMutexKey == _sharedTextureMutexKey) { + // 后端没有渲染新的帧 return; } @@ -148,8 +150,8 @@ void Renderer::Render() noexcept { d3dDC->ClearRenderTargetView(backBufferRtv, black); } - const uint64_t key = ++_sharedTextureMutexKey; - HRESULT hr = _frontendSharedTextureMutex->AcquireSync(key - 1, INFINITE); + _lastAccessMutexKey = ++_sharedTextureMutexKey; + HRESULT hr = _frontendSharedTextureMutex->AcquireSync(_lastAccessMutexKey - 1, INFINITE); if (FAILED(hr)) { return; } @@ -167,11 +169,11 @@ void Renderer::Render() noexcept { _frontendSharedTexture.get(), 0, nullptr); } - _frontendSharedTextureMutex->ReleaseSync(key); + _frontendSharedTextureMutex->ReleaseSync(_lastAccessMutexKey); ID3D11RenderTargetView* backBufferRtv = _frontendResources.GetRenderTargetView(_backBuffer.get()); - _swapChain->Present(1, 0); + _swapChain->Present(0, 0); // 丢弃渲染目标的内容。仅当现有内容将被完全覆盖时,此操作才有效 d3dDC->DiscardView(backBufferRtv); @@ -342,7 +344,7 @@ bool Renderer::_CreateSharedTexture(ID3D11Texture2D* effectsOutput) noexcept { DXGI_FORMAT_R8G8B8A8_UNORM, textureSize.cx, textureSize.cy, - D3D11_BIND_SHADER_RESOURCE, + 0, D3D11_USAGE_DEFAULT, D3D11_RESOURCE_MISC_SHARED_KEYEDMUTEX ); @@ -367,6 +369,20 @@ bool Renderer::_CreateSharedTexture(ID3D11Texture2D* effectsOutput) noexcept { void Renderer::_BackendThreadProc(const ScalingOptions& options) noexcept { winrt::init_apartment(winrt::apartment_type::single_threaded); + // 创建 DispatcherQueue + DispatcherQueueOptions dqOptions{}; + dqOptions.dwSize = sizeof(DispatcherQueueOptions); + dqOptions.threadType = DQTYPE_THREAD_CURRENT; + + HRESULT hr = CreateDispatcherQueueController( + dqOptions, + (PDISPATCHERQUEUECONTROLLER*)winrt::put_abi(_backendThreadDqc) + ); + if (FAILED(hr)) { + Logger::Get().ComError("CreateDispatcherQueueController 失败", hr); + return; + } + if (!_backendResources.Initialize(options)) { return; } @@ -382,7 +398,7 @@ void Renderer::_BackendThreadProc(const ScalingOptions& options) noexcept { return; } - HRESULT hr = d3dDevice->CreateFence(_fenceValue, D3D11_FENCE_FLAG_NONE, IID_PPV_ARGS(&_d3dFence)); + hr = d3dDevice->CreateFence(_fenceValue, D3D11_FENCE_FLAG_NONE, IID_PPV_ARGS(&_d3dFence)); if (FAILED(hr)) { Logger::Get().ComError("CreateFence 失败", hr); return; diff --git a/src/Magpie.Core/Renderer.h b/src/Magpie.Core/Renderer.h index 98aa19bdd..94313df60 100644 --- a/src/Magpie.Core/Renderer.h +++ b/src/Magpie.Core/Renderer.h @@ -41,13 +41,14 @@ class Renderer { winrt::com_ptr _swapChain; Win32Utils::ScopedHandle _frameLatencyWaitableObject; winrt::com_ptr _backBuffer; + uint64_t _lastAccessMutexKey = 0; winrt::com_ptr _frontendSharedTexture; winrt::com_ptr _frontendSharedTextureMutex; SIZE _sharedTextureSize{}; std::thread _backendThread; - + // 只能由后台线程访问 DeviceResources _backendResources; std::unique_ptr _frameSource; @@ -65,6 +66,8 @@ class Renderer { HWND _hwndScaling = NULL; SIZE _scalingWndSize{}; + winrt::Windows::System::DispatcherQueueController _backendThreadDqc{ nullptr }; + HANDLE _sharedTextureHandle = NULL; std::atomic _sharedTextureMutexKey = 0; }; diff --git a/src/Magpie.Core/ScalingRuntime.cpp b/src/Magpie.Core/ScalingRuntime.cpp index cef8d09cd..b04a45413 100644 --- a/src/Magpie.Core/ScalingRuntime.cpp +++ b/src/Magpie.Core/ScalingRuntime.cpp @@ -26,10 +26,9 @@ void ScalingRuntime::Start(HWND hwndSrc, ScalingOptions&& options) { return; } - _IsRunning(true); - _EnsureDispatcherQueue(); _dqc.DispatcherQueue().TryEnqueue([this, hwndSrc, options(std::move(options))]() mutable { + _IsRunning(true); _scalingWindow.Create(GetModuleHandle(nullptr), hwndSrc, std::move(options)); }); } @@ -91,7 +90,7 @@ void ScalingRuntime::_ScalingThreadProc() noexcept { } // 等待新消息 1ms - MsgWaitForMultipleObjectsEx(0, nullptr, 1, QS_ALLINPUT, MWMO_INPUTAVAILABLE); + MsgWaitForMultipleObjectsEx(0, nullptr, 2, QS_ALLINPUT, MWMO_INPUTAVAILABLE); } } From 58085a166df60cc5d10d022d54062f139b4fedac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=97=AD?= <34770031+Blinue@users.noreply.github.com> Date: Wed, 14 Jun 2023 22:03:47 +0800 Subject: [PATCH 026/155] =?UTF-8?q?feat:=20=E7=A7=BB=E5=8A=A8=E5=85=89?= =?UTF-8?q?=E6=A0=87=E5=88=99=E7=BB=98=E5=88=B6=E6=96=B0=E7=9A=84=E5=B8=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Magpie.Core/Renderer.cpp | 16 ++++++++++++++-- src/Magpie.Core/Renderer.h | 1 + 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/src/Magpie.Core/Renderer.cpp b/src/Magpie.Core/Renderer.cpp index 9eec8ff52..49e0b3014 100644 --- a/src/Magpie.Core/Renderer.cpp +++ b/src/Magpie.Core/Renderer.cpp @@ -128,8 +128,20 @@ bool Renderer::_ObtainSharedTexture() noexcept { void Renderer::Render() noexcept { if (_lastAccessMutexKey == _sharedTextureMutexKey) { - // 后端没有渲染新的帧 - return; + if (_lastAccessMutexKey == 0) { + // 第一帧尚未完成 + return; + } + + // 后端没有渲染新的帧,检查光标位置 + POINT cp; + GetCursorPos(&cp); + bool noMove = cp.x == _lastCursorPos.x && cp.y == _lastCursorPos.y; + _lastCursorPos = cp; + if (noMove) { + // 光标没有移动 + return; + } } if (!_frontendSharedTexture) { diff --git a/src/Magpie.Core/Renderer.h b/src/Magpie.Core/Renderer.h index 94313df60..a20c1db4d 100644 --- a/src/Magpie.Core/Renderer.h +++ b/src/Magpie.Core/Renderer.h @@ -42,6 +42,7 @@ class Renderer { Win32Utils::ScopedHandle _frameLatencyWaitableObject; winrt::com_ptr _backBuffer; uint64_t _lastAccessMutexKey = 0; + POINT _lastCursorPos{ std::numeric_limits::max(), std::numeric_limits::max() }; winrt::com_ptr _frontendSharedTexture; winrt::com_ptr _frontendSharedTextureMutex; From 89334033957905d8ed249db60ed15b05f7b17795 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=97=AD?= Date: Thu, 15 Jun 2023 16:49:46 +0800 Subject: [PATCH 027/155] =?UTF-8?q?feat:=20MagpieFX=20=E4=B8=8D=E5=86=8D?= =?UTF-8?q?=E6=94=AF=E6=8C=81=20GENERIC=5FDOWNSCALER?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/MagpieFX.md | 2 -- src/Magpie.App/EffectsService.cpp | 3 --- src/Magpie.App/EffectsService.h | 7 +------ src/Magpie.Core/EffectCompiler.cpp | 22 +++------------------- src/Magpie.Core/EffectCompiler.h | 8 ++++---- src/Magpie.Core/EffectDesc.h | 8 +++----- 6 files changed, 11 insertions(+), 39 deletions(-) diff --git a/docs/MagpieFX.md b/docs/MagpieFX.md index 021b857b3..a6c98b067 100644 --- a/docs/MagpieFX.md +++ b/docs/MagpieFX.md @@ -5,8 +5,6 @@ MagpieFX 基于 DirectX 11 计算着色器 //!VERSION 4 // 若要使用 GetFrameCount 需指定 USE_DYNAMIC //!USE_DYNAMIC -// GENERIC_DOWNSCALER 表示此效果可以作为“默认降采样效果” -//!GENERIC_DOWNSCALER // 使用 SORT_NAME 指定排序时使用的名字,否则按照文件名排序 //!SORT_NAME test1 diff --git a/src/Magpie.App/EffectsService.cpp b/src/Magpie.App/EffectsService.cpp index 46461ab48..4522be876 100644 --- a/src/Magpie.App/EffectsService.cpp +++ b/src/Magpie.App/EffectsService.cpp @@ -106,9 +106,6 @@ fire_and_forget EffectsService::StartInitialize() { if (effectDesc.GetOutputSizeExpr().first.empty()) { effect.flags |= EffectInfoFlags::CanScale; } - if (effectDesc.flags & EffectFlags::GenericDownscaler) { - effect.flags |= EffectInfoFlags::GenericDownscaler; - } _effectsMap.emplace(effect.name, (uint32_t)_effects.size() - 1); } diff --git a/src/Magpie.App/EffectsService.h b/src/Magpie.App/EffectsService.h index a72030265..720841063 100644 --- a/src/Magpie.App/EffectsService.h +++ b/src/Magpie.App/EffectsService.h @@ -8,8 +8,7 @@ struct EffectParameterDesc; namespace winrt::Magpie::App { struct EffectInfoFlags { - static constexpr const uint32_t CanScale = 0x1; - static constexpr const uint32_t GenericDownscaler = 0x2; + static constexpr const uint32_t CanScale = 1; }; struct EffectInfo { @@ -24,10 +23,6 @@ struct EffectInfo { bool CanScale() const noexcept { return flags & EffectInfoFlags::CanScale; } - - bool IsGenericDownscaler() const noexcept { - return flags & EffectInfoFlags::GenericDownscaler; - } }; class EffectsService { diff --git a/src/Magpie.Core/EffectCompiler.cpp b/src/Magpie.Core/EffectCompiler.cpp index a5a82fc0a..07302a2d5 100644 --- a/src/Magpie.Core/EffectCompiler.cpp +++ b/src/Magpie.Core/EffectCompiler.cpp @@ -265,9 +265,9 @@ static uint32_t GetNextExpr(std::string_view& source, std::string& expr) { static uint32_t ResolveHeader(std::string_view block, EffectDesc& desc, bool noCompile) { // 必需的选项:VERSION - // 可选的选项:USE_DYNAMIC, GENERIC_DOWNSCALER, SORT_NAME + // 可选的选项:USE_DYNAMIC, SORT_NAME - std::bitset<4> processed; + std::bitset<3> processed; std::string_view token; @@ -310,23 +310,12 @@ static uint32_t ResolveHeader(std::string_view block, EffectDesc& desc, bool noC } desc.flags |= EffectFlags::UseDynamic; - } else if (t == "GENERIC_DOWNSCALER") { + } else if (t == "SORT_NAME") { if (processed[2]) { return 1; } processed[2] = true; - if (GetNextToken(block, token) != 2) { - return 1; - } - - desc.flags |= EffectFlags::GenericDownscaler; - } else if (t == "SORT_NAME") { - if (processed[3]) { - return 1; - } - processed[3] = true; - std::string_view sortName; if (GetNextString(block, sortName)) { return 1; @@ -634,11 +623,6 @@ static uint32_t ResolveTexture(std::string_view block, EffectDesc& desc) { return 1; } - // GENERIC_DOWNSCALER 和指定尺寸冲突 - if (desc.flags & EffectFlags::GenericDownscaler && processed[2]) { - return 1; - } - // OUTPUT 已为第二个元素 desc.textures[1].sizeExpr = std::move(texDesc.sizeExpr); desc.textures.pop_back(); diff --git a/src/Magpie.Core/EffectCompiler.h b/src/Magpie.Core/EffectCompiler.h index eaa1d9beb..36ff28754 100644 --- a/src/Magpie.Core/EffectCompiler.h +++ b/src/Magpie.Core/EffectCompiler.h @@ -7,11 +7,11 @@ namespace Magpie::Core { struct EffectDesc; struct EffectCompilerFlags { - static constexpr const uint32_t NoCache = 0x1; - static constexpr const uint32_t SaveSources = 0x2; - static constexpr const uint32_t WarningsAreErrors = 0x4; + static constexpr const uint32_t NoCache = 1; + static constexpr const uint32_t SaveSources = 1 << 1; + static constexpr const uint32_t WarningsAreErrors = 1 << 2; // 只解析输出尺寸和参数,供用户界面使用 - static constexpr const uint32_t NoCompile = 0x8; + static constexpr const uint32_t NoCompile = 1 << 3; }; struct API_DECLSPEC EffectCompiler { diff --git a/src/Magpie.Core/EffectDesc.h b/src/Magpie.Core/EffectDesc.h index 87765f206..be8d89107 100644 --- a/src/Magpie.Core/EffectDesc.h +++ b/src/Magpie.Core/EffectDesc.h @@ -80,13 +80,11 @@ struct EffectPassDesc { struct EffectFlags { // 输入 - static constexpr const uint32_t InlineParams = 0x1; - static constexpr const uint32_t FP16 = 0x2; + static constexpr const uint32_t InlineParams = 1; + static constexpr const uint32_t FP16 = 1 << 1; // 输出 // 此效果需要帧数和鼠标位置 - static constexpr const uint32_t UseDynamic = 0x10; - // 可作为通用的降采样效果 - static constexpr const uint32_t GenericDownscaler = 0x20; + static constexpr const uint32_t UseDynamic = 1 << 4; }; struct EffectDesc { From 0d0111f20d7f56753618a110e7eb0c9d6522a3fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=97=AD?= <34770031+Blinue@users.noreply.github.com> Date: Thu, 15 Jun 2023 18:24:36 +0800 Subject: [PATCH 028/155] =?UTF-8?q?feat:=20=E6=A3=80=E6=B5=8B=20MPO=20?= =?UTF-8?q?=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Effects/Bilinear.hlsl | 4 ---- src/Effects/Nearest.hlsl | 4 ---- src/Magpie.Core/BicubicEffect.h | 1 - src/Magpie.Core/Renderer.cpp | 21 +++++++++++++++++++++ 4 files changed, 21 insertions(+), 9 deletions(-) diff --git a/src/Effects/Bilinear.hlsl b/src/Effects/Bilinear.hlsl index d27f8be68..d8a3dd0db 100644 --- a/src/Effects/Bilinear.hlsl +++ b/src/Effects/Bilinear.hlsl @@ -1,7 +1,5 @@ //!MAGPIE EFFECT //!VERSION 4 -//!GENERIC_DOWNSCALER - //!TEXTURE Texture2D INPUT; @@ -13,12 +11,10 @@ Texture2D OUTPUT; //!FILTER LINEAR SamplerState sam; - //!PASS 1 //!STYLE PS //!IN INPUT //!OUT OUTPUT - float4 Pass1(float2 pos) { return INPUT.SampleLevel(sam, pos, 0); } diff --git a/src/Effects/Nearest.hlsl b/src/Effects/Nearest.hlsl index 1dc6604bc..702119f3c 100644 --- a/src/Effects/Nearest.hlsl +++ b/src/Effects/Nearest.hlsl @@ -1,7 +1,5 @@ //!MAGPIE EFFECT //!VERSION 4 -//!GENERIC_DOWNSCALER - //!TEXTURE Texture2D INPUT; @@ -13,12 +11,10 @@ Texture2D OUTPUT; //!FILTER POINT SamplerState sam; - //!PASS 1 //!STYLE PS //!IN INPUT //!OUT OUTPUT - float4 Pass1(float2 pos) { return INPUT.SampleLevel(sam, pos, 0); } diff --git a/src/Magpie.Core/BicubicEffect.h b/src/Magpie.Core/BicubicEffect.h index 868a9fe6f..48164df3a 100644 --- a/src/Magpie.Core/BicubicEffect.h +++ b/src/Magpie.Core/BicubicEffect.h @@ -6,7 +6,6 @@ constexpr const char* BICUBIC_EFFECT_SOURCE = R"( //!MAGPIE EFFECT //!VERSION 4 -//!GENERIC_DOWNSCALER //!PARAMETER diff --git a/src/Magpie.Core/Renderer.cpp b/src/Magpie.Core/Renderer.cpp index 49e0b3014..5e11c2813 100644 --- a/src/Magpie.Core/Renderer.cpp +++ b/src/Magpie.Core/Renderer.cpp @@ -50,6 +50,23 @@ bool Renderer::Initialize(HWND hwndSrc, HWND hwndScaling, const ScalingOptions& return true; } +static bool CheckMultiplaneOverlaySupport(IDXGISwapChain4* swapChain) noexcept { + winrt::com_ptr output; + HRESULT hr = swapChain->GetContainingOutput(output.put()); + if (FAILED(hr)) { + Logger::Get().ComError("获取 IDXGIOutput 失败", hr); + return false; + } + + winrt::com_ptr output2 = output.try_as(); + if (!output2) { + Logger::Get().Info("获取 IDXGIOutput2 失败"); + return false; + } + + return output2->SupportsOverlays(); +} + bool Renderer::_CreateSwapChain(const ScalingOptions& /*options*/) noexcept { DXGI_SWAP_CHAIN_DESC1 sd{}; sd.Width = _scalingWndSize.cx; @@ -105,6 +122,10 @@ bool Renderer::_CreateSwapChain(const ScalingOptions& /*options*/) noexcept { return false; } + // 检查 Multiplane Overlay 和 Hardware Composition 支持 + const bool supportMPO = CheckMultiplaneOverlaySupport(_swapChain.get()); + Logger::Get().Info(StrUtils::Concat("Multiplane Overlay 支持:", supportMPO ? "是" : "否")); + return true; } From 5bd1cb6abd6745da9f7ae79f9d968f8f005fd910 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=97=AD?= <34770031+Blinue@users.noreply.github.com> Date: Thu, 15 Jun 2023 18:37:45 +0800 Subject: [PATCH 029/155] =?UTF-8?q?chore:=20=E6=B7=BB=E5=8A=A0=E6=B3=A8?= =?UTF-8?q?=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Magpie.Core/Renderer.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/Magpie.Core/Renderer.cpp b/src/Magpie.Core/Renderer.cpp index 5e11c2813..97dac62d9 100644 --- a/src/Magpie.Core/Renderer.cpp +++ b/src/Magpie.Core/Renderer.cpp @@ -76,6 +76,7 @@ bool Renderer::_CreateSwapChain(const ScalingOptions& /*options*/) noexcept { sd.SampleDesc.Count = 1; sd.Scaling = DXGI_SCALING_NONE; sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; + // 为了降低延迟,两个垂直同步之间允许渲染 3 帧 sd.BufferCount = 4; // 渲染每帧之前都会清空后缓冲区,因此无需 DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL sd.SwapEffect = DXGI_SWAP_EFFECT_FLIP_DISCARD; @@ -103,6 +104,7 @@ bool Renderer::_CreateSwapChain(const ScalingOptions& /*options*/) noexcept { return false; } + // 允许提前渲染 3 帧 _swapChain->SetMaximumFrameLatency(3); _frameLatencyWaitableObject.reset(_swapChain->GetFrameLatencyWaitableObject()); @@ -122,7 +124,7 @@ bool Renderer::_CreateSwapChain(const ScalingOptions& /*options*/) noexcept { return false; } - // 检查 Multiplane Overlay 和 Hardware Composition 支持 + // 检查 Multiplane Overlay 支持 const bool supportMPO = CheckMultiplaneOverlaySupport(_swapChain.get()); Logger::Get().Info(StrUtils::Concat("Multiplane Overlay 支持:", supportMPO ? "是" : "否")); @@ -206,6 +208,7 @@ void Renderer::Render() noexcept { ID3D11RenderTargetView* backBufferRtv = _frontendResources.GetRenderTargetView(_backBuffer.get()); + // 两个垂直同步之间允许渲染数帧,SyncInterval = 0 只呈现最新的一帧,旧帧被丢弃 _swapChain->Present(0, 0); // 丢弃渲染目标的内容。仅当现有内容将被完全覆盖时,此操作才有效 From b6b12d10ef5a5590e891adeb426acee2bd48c502 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=97=AD?= Date: Fri, 16 Jun 2023 16:48:12 +0800 Subject: [PATCH 030/155] =?UTF-8?q?feat:=20=E6=9B=B4=E6=96=B0=E5=87=A0?= =?UTF-8?q?=E4=B8=AA=E6=95=88=E6=9E=9C=E4=B8=BAv4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Effects/ACNet.hlsl | 23 +++++++++++------------ src/Effects/Deband.hlsl | 10 +++++++--- src/Effects/ImageAdjustment.hlsl | 10 +++++++--- src/Effects/Jinc.hlsl | 13 +++++++++---- src/Effects/Lanczos.hlsl | 7 +++++-- 5 files changed, 39 insertions(+), 24 deletions(-) diff --git a/src/Effects/ACNet.hlsl b/src/Effects/ACNet.hlsl index 5de3abefc..a80823aca 100644 --- a/src/Effects/ACNet.hlsl +++ b/src/Effects/ACNet.hlsl @@ -3,14 +3,17 @@ //!MAGPIE EFFECT -//!VERSION 3 -//!OUTPUT_WIDTH INPUT_WIDTH * 2 -//!OUTPUT_HEIGHT INPUT_HEIGHT * 2 +//!VERSION 4 //!TEXTURE Texture2D INPUT; +//!TEXTURE +//!WIDTH INPUT_WIDTH * 2 +//!HEIGHT INPUT_HEIGHT * 2 +Texture2D OUTPUT; + //!TEXTURE //!WIDTH INPUT_WIDTH //!HEIGHT INPUT_HEIGHT @@ -3741,6 +3744,7 @@ void Pass8(uint2 blockStart, uint3 threadId) { //!PASS 9 //!DESC L9, L10 //!IN INPUT, tex3, tex4 +//!OUT OUTPUT //!BLOCK_SIZE 16 //!NUM_THREADS 64 @@ -3978,8 +3982,9 @@ const static float3x3 yuv2rgb = { void Pass9(uint2 blockStart, uint3 threadId) { uint2 gxy = (Rmp8x8(threadId.x) << 1) + blockStart; - - if (!CheckViewport(gxy)) { + + const uint2 outputSize = GetOutputSize(); + if (gxy.x >= outputSize.x || gxy.y >= outputSize.y) { return; } @@ -4277,12 +4282,6 @@ void Pass9(uint2 blockStart, uint3 threadId) { for (uint j = 0; j <= 1; ++j) { uint2 destPos = gxy + uint2(i, j); - if (i != 0 || j != 0) { - if (!CheckViewport(destPos)) { - continue; - } - } - uint index = j * 2 + i; float luma = clamp( target1.x * kernelsL10[0 + index] + @@ -4295,7 +4294,7 @@ void Pass9(uint2 blockStart, uint3 threadId) { target2.w * kernelsL10[28 + index], 0.0f, 1.0f); float2 originUV = mul(rgb2uv, INPUT.SampleLevel(sam1, (destPos + 0.5f) * outputPt, 0).rgb); - WriteToOutput(destPos, mul(yuv2rgb, float3(luma, originUV))); + OUTPUT[destPos] = float4(mul(yuv2rgb, float3(luma, originUV)), 1); } } } diff --git a/src/Effects/Deband.hlsl b/src/Effects/Deband.hlsl index e3340750e..9de323cdc 100644 --- a/src/Effects/Deband.hlsl +++ b/src/Effects/Deband.hlsl @@ -2,9 +2,7 @@ // Port from https://github.com/haasn/gentoo-conf/blob/xor/home/nand/.mpv/shaders/deband.glsl //!MAGPIE EFFECT -//!VERSION 3 -//!OUTPUT_WIDTH INPUT_WIDTH -//!OUTPUT_HEIGHT INPUT_HEIGHT +//!VERSION 4 //!PARAMETER //!LABEL Threshold @@ -54,6 +52,11 @@ float grain; //!TEXTURE Texture2D INPUT; +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +Texture2D OUTPUT; + //!SAMPLER //!FILTER LINEAR SamplerState sam; @@ -66,6 +69,7 @@ SamplerState sam1; //!PASS 1 //!STYLE PS //!IN INPUT +//!OUT OUTPUT // Wide usage friendly PRNG, shamelessly stolen from a GLSL tricks forum post float mod289(float x) { return x - floor(x / 289.0) * 289.0; } diff --git a/src/Effects/ImageAdjustment.hlsl b/src/Effects/ImageAdjustment.hlsl index b25438471..0472f19e8 100644 --- a/src/Effects/ImageAdjustment.hlsl +++ b/src/Effects/ImageAdjustment.hlsl @@ -1,9 +1,7 @@ // 移植自 https://github.com/libretro/slang-shaders/blob/3f67e1870dbd5be74ae2f09eaed0eeadce6abd15/misc/image-adjustment.slang //!MAGPIE EFFECT -//!VERSION 3 -//!OUTPUT_WIDTH INPUT_WIDTH -//!OUTPUT_HEIGHT INPUT_HEIGHT +//!VERSION 4 //!PARAMETER @@ -89,6 +87,11 @@ float b; //!TEXTURE Texture2D INPUT; +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +Texture2D OUTPUT; + //!SAMPLER //!FILTER POINT SamplerState sam; @@ -97,6 +100,7 @@ SamplerState sam; //!PASS 1 //!STYLE PS //!IN INPUT +//!OUT OUTPUT float3 RGBtoHSV(float3 c) { float4 K = float4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0); diff --git a/src/Effects/Jinc.hlsl b/src/Effects/Jinc.hlsl index a4d2bfa9b..b6cf0cd0e 100644 --- a/src/Effects/Jinc.hlsl +++ b/src/Effects/Jinc.hlsl @@ -10,8 +10,7 @@ // B = 0.825 to get rid of dithering. Increase B to get a fine sharpness, though dithering returns. //!MAGPIE EFFECT -//!VERSION 3 -//!GENERIC_DOWNSCALER +//!VERSION 4 //!PARAMETER @@ -41,6 +40,9 @@ float ARStrength; //!TEXTURE Texture2D INPUT; +//!TEXTURE +Texture2D OUTPUT; + //!SAMPLER //!FILTER POINT SamplerState sam; @@ -48,6 +50,7 @@ SamplerState sam; //!PASS 1 //!IN INPUT +//!OUT OUTPUT //!BLOCK_SIZE 8 //!NUM_THREADS 64 @@ -70,7 +73,9 @@ float4 resampler(float4 x, float wa, float wb) { void Pass1(uint2 blockStart, uint3 threadId) { uint2 gxy = Rmp8x8(threadId.x) + blockStart; - if (!CheckViewport(gxy)) { + + const uint2 outputSize = GetOutputSize(); + if (gxy.x >= outputSize.x || gxy.y >= outputSize.y) { return; } @@ -126,5 +131,5 @@ void Pass1(uint2 blockStart, uint3 threadId) { color = lerp(color, clamp(color, min_sample, max_sample), ARStrength); // final sum and weight normalization - WriteToOutput(gxy, color); + OUTPUT[gxy] = float4(color, 1); } diff --git a/src/Effects/Lanczos.hlsl b/src/Effects/Lanczos.hlsl index 3a32e81fd..ed980933b 100644 --- a/src/Effects/Lanczos.hlsl +++ b/src/Effects/Lanczos.hlsl @@ -2,8 +2,7 @@ // 移植自 https://github.com/libretro/common-shaders/blob/master/windowed/shaders/lanczos6.cg //!MAGPIE EFFECT -//!VERSION 3 -//!GENERIC_DOWNSCALER +//!VERSION 4 //!PARAMETER @@ -17,6 +16,9 @@ float ARStrength; //!TEXTURE Texture2D INPUT; +//!TEXTURE +Texture2D OUTPUT; + //!SAMPLER //!FILTER POINT SamplerState sam; @@ -25,6 +27,7 @@ SamplerState sam; //!PASS 1 //!STYLE PS //!IN INPUT +//!OUT OUTPUT #define FIX(c) max(abs(c), 1e-5) #define PI 3.14159265359 From c82c0dde7ebfc5365d12b4afff7b7c13e4303050 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=97=AD?= <34770031+Blinue@users.noreply.github.com> Date: Fri, 16 Jun 2023 20:32:26 +0800 Subject: [PATCH 031/155] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=20CursorMana?= =?UTF-8?q?ger?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Magpie.Core/CursorManager.cpp | 189 ++++++++++++++++++ src/Magpie.Core/CursorManager.h | 48 +++++ src/Magpie.Core/FrameSourceBase.cpp | 30 ++- src/Magpie.Core/FrameSourceBase.h | 9 +- .../GraphicsCaptureFrameSource.cpp | 45 +++-- src/Magpie.Core/GraphicsCaptureFrameSource.h | 6 +- src/Magpie.Core/Magpie.Core.vcxproj | 2 + src/Magpie.Core/Magpie.Core.vcxproj.filters | 9 + src/Magpie.Core/Renderer.cpp | 128 +++++++----- src/Magpie.Core/Renderer.h | 22 +- src/Magpie.Core/ScalingRuntime.cpp | 2 +- src/Magpie.Core/ScalingWindow.cpp | 10 + src/Magpie.Core/ScalingWindow.h | 2 + 13 files changed, 397 insertions(+), 105 deletions(-) create mode 100644 src/Magpie.Core/CursorManager.cpp create mode 100644 src/Magpie.Core/CursorManager.h diff --git a/src/Magpie.Core/CursorManager.cpp b/src/Magpie.Core/CursorManager.cpp new file mode 100644 index 000000000..28cd98123 --- /dev/null +++ b/src/Magpie.Core/CursorManager.cpp @@ -0,0 +1,189 @@ +#include "pch.h" +#include "CursorManager.h" +#include "Logger.h" +#include +#include "Win32Utils.h" +#include "ScalingOptions.h" + +#pragma comment(lib, "Magnification.lib") + +namespace Magpie::Core { + +CursorManager::~CursorManager() noexcept { +} + +bool CursorManager::Initialize( + const RECT& srcRect, + const RECT& scalingWndRect, + const RECT& destRect, + const ScalingOptions& options +) noexcept { + _srcRect = srcRect; + _scalingWndRect = scalingWndRect; + _destRect = destRect; + _isAdjustCursorSpeed = options.IsAdjustCursorSpeed(); + + return true; +} + +void CursorManager::Update() noexcept { + _UpdateCursorClip(); +} + +void CursorManager::_AdjustCursorSpeed() noexcept { +} + +void CursorManager::_UpdateCursorClip() noexcept { +} + +static void ShowSystemCursor(bool show) noexcept { + static void (WINAPI* const showSystemCursor)(BOOL bShow) = []()->void(WINAPI*)(BOOL) { + HMODULE lib = LoadLibrary(L"user32.dll"); + if (!lib) { + return nullptr; + } + + return (void(WINAPI*)(BOOL))GetProcAddress(lib, "ShowSystemCursor"); + }(); + + if (showSystemCursor) { + showSystemCursor((BOOL)show); + } else { + // 获取 ShowSystemCursor 失败则回落到 Magnification API + static bool initialized = []() { + if (!MagInitialize()) { + Logger::Get().Win32Error("MagInitialize 失败"); + return false; + } + + return true; + }(); + + if (initialized) { + MagShowSystemCursor(show); + } + } + + if (show) { + /*MagApp::Get().Dispatcher().TryEnqueue([]() { + if (!MagApp::Get().GetHwndHost()) { + return; + } + + // 修复有时不会立即显示光标的问题 + FrameSourceBase& frameSource = MagApp::Get().GetFrameSource(); + if (frameSource.GetName() == GraphicsCaptureFrameSource::NAME) { + GraphicsCaptureFrameSource& wgc = (GraphicsCaptureFrameSource&)frameSource; + // WGC 需要重启捕获 + // 没有用户报告这个问题,只在我的电脑上出现,可能和驱动有关 + wgc.StopCapture(); + wgc.StartCapture(); + } else { + SystemParametersInfo(SPI_SETCURSORS, 0, 0, 0); + } + });*/ + } +} + +void CursorManager::_StartCapture(POINT cursorPos) noexcept { + if (_isUnderCapture) { + return; + } + + // 在以下情况下进入捕获状态: + // 1. 当前未捕获 + // 2. 光标进入全屏区域 + // + // 进入捕获状态时: + // 1. 调整光标速度,全局隐藏光标 + // 2. 将光标移到源窗口的对应位置 + // + // 在有黑边的情况下自动将光标调整到画面内 + + // 全局隐藏光标 + ShowSystemCursor(false); + + SIZE srcFrameSize = Win32Utils::GetSizeOfRect(_srcRect); + SIZE outputSize = Win32Utils::GetSizeOfRect(_destRect); + + if (_isAdjustCursorSpeed) { + _AdjustCursorSpeed(); + } + + // 移动光标位置 + + // 跳过黑边 + cursorPos.x = std::clamp(cursorPos.x, _scalingWndRect.left + _destRect.left, _scalingWndRect.left + _destRect.right - 1); + cursorPos.y = std::clamp(cursorPos.y, _scalingWndRect.top + _destRect.top, _scalingWndRect.top + _destRect.bottom - 1); + + POINT newCursorPos = _ScalingToSrc(cursorPos); + SetCursorPos(newCursorPos.x, newCursorPos.y); + + _isUnderCapture = true; +} + +void CursorManager::_StopCapture(POINT cursorPos, bool onDestroy) noexcept { +} + +// 将源窗口的光标位置映射到缩放后的光标位置 +// 当光标位于源窗口之外,与源窗口的距离不会缩放 +POINT CursorManager::_SrcToScaling(POINT pt, bool screenCoord) noexcept { + POINT result; + if (screenCoord) { + result = { _scalingWndRect.left, _scalingWndRect.top }; + } else { + result = {}; + } + + if (pt.x >= _srcRect.right) { + result.x += _scalingWndRect.right - _scalingWndRect.left + pt.x - _srcRect.right; + } else if (pt.x < _srcRect.left) { + result.x += pt.x - _srcRect.left; + } else { + double pos = double(pt.x - _srcRect.left) / (_srcRect.right - _srcRect.left - 1); + result.x += std::lround(pos * (_destRect.right - _destRect.left - 1)) + _destRect.left; + } + + if (pt.y >= _srcRect.bottom) { + result.y += _scalingWndRect.bottom - _scalingWndRect.top + pt.y - _srcRect.bottom; + } else if (pt.y < _srcRect.top) { + result.y += pt.y - _srcRect.top; + } else { + double pos = double(pt.y - _srcRect.top) / (_srcRect.bottom - _srcRect.top - 1); + result.y += std::lround(pos * (_destRect.bottom - _destRect.top - 1)) + _destRect.top; + } + + return result; +} + +POINT CursorManager::_ScalingToSrc(POINT pt) noexcept { + const SIZE srcSize = Win32Utils::GetSizeOfRect(_srcRect); + const SIZE destSize = Win32Utils::GetSizeOfRect(_destRect); + + pt.x -= _scalingWndRect.left; + pt.y -= _scalingWndRect.top; + + POINT result = { _srcRect.left, _srcRect.top }; + + if (pt.x >= _destRect.right) { + result.x += srcSize.cx + pt.x - _destRect.right; + } else if (pt.x < _destRect.left) { + result.x += pt.x - _destRect.left; + } else { + double pos = double(pt.x - _destRect.left) / (destSize.cx - 1); + result.x += std::lround(pos * (srcSize.cx - 1)); + } + + if (pt.y >= _destRect.bottom) { + result.y += srcSize.cx + pt.y - _destRect.bottom; + } else if (pt.y < _destRect.top) { + result.y += pt.y - _destRect.top; + } else { + double pos = double(pt.y - _destRect.top) / (destSize.cy - 1); + result.y += std::lround(pos * (srcSize.cy - 1)); + } + + return result; +} + +} diff --git a/src/Magpie.Core/CursorManager.h b/src/Magpie.Core/CursorManager.h new file mode 100644 index 000000000..c1e6f4292 --- /dev/null +++ b/src/Magpie.Core/CursorManager.h @@ -0,0 +1,48 @@ +#pragma once + +namespace Magpie::Core { + +struct ScalingOptions; + +class CursorManager { +public: + CursorManager() noexcept = default; + CursorManager(const CursorManager&) = delete; + CursorManager(CursorManager&&) = delete; + + ~CursorManager() noexcept; + + bool Initialize( + const RECT& srcRect, + const RECT& scalingWndRect, + const RECT& destRect, + const ScalingOptions& options + ) noexcept; + + void Update() noexcept; + +private: + void _AdjustCursorSpeed() noexcept; + + void _UpdateCursorClip() noexcept; + + void _StartCapture(POINT cursorPos) noexcept; + + void _StopCapture(POINT cursorPos, bool onDestroy = false) noexcept; + + POINT _SrcToScaling(POINT pt, bool screenCoord) noexcept; + POINT _ScalingToSrc(POINT pt) noexcept; + + RECT _srcRect; + RECT _scalingWndRect; + RECT _destRect; + + // 当前帧的光标,光标不可见则为 NULL + HCURSOR _curCursor = NULL; + POINT _curCursorPos{ std::numeric_limits::max(), std::numeric_limits::max() }; + + bool _isUnderCapture = false; + bool _isAdjustCursorSpeed = false; +}; + +} diff --git a/src/Magpie.Core/FrameSourceBase.cpp b/src/Magpie.Core/FrameSourceBase.cpp index a9c621866..3c05622ee 100644 --- a/src/Magpie.Core/FrameSourceBase.cpp +++ b/src/Magpie.Core/FrameSourceBase.cpp @@ -138,12 +138,10 @@ static HWND FindClientWindowOfUWP(HWND hwndSrc, const wchar_t* clientWndClassNam return param.childWindows[maxIdx]; } -RECT FrameSourceBase::_GetSrcFrameRect(const Cropping& cropping, bool isCaptureTitleBar) noexcept { - RECT result{}; - +bool FrameSourceBase::_CalcSrcRect(const Cropping& cropping, bool isCaptureTitleBar) noexcept { if (isCaptureTitleBar && _CanCaptureTitleBar()) { HRESULT hr = DwmGetWindowAttribute(_hwndSrc, - DWMWA_EXTENDED_FRAME_BOUNDS, &result, sizeof(result)); + DWMWA_EXTENDED_FRAME_BOUNDS, &_srcRect, sizeof(_srcRect)); if (FAILED(hr)) { Logger::Get().ComError("DwmGetWindowAttribute 失败", hr); } @@ -154,33 +152,33 @@ RECT FrameSourceBase::_GetSrcFrameRect(const Cropping& cropping, bool isCaptureT // 客户区窗口类名为 ApplicationFrameInputSinkWindow HWND hwndClient = FindClientWindowOfUWP(_hwndSrc, L"ApplicationFrameInputSinkWindow"); if (hwndClient) { - if (!Win32Utils::GetClientScreenRect(hwndClient, result)) { + if (!Win32Utils::GetClientScreenRect(hwndClient, _srcRect)) { Logger::Get().Win32Error("GetClientScreenRect 失败"); } } } } - if (result == RECT{}) { - if (!Win32Utils::GetClientScreenRect(_hwndSrc, result)) { + if (_srcRect == RECT{}) { + if (!Win32Utils::GetClientScreenRect(_hwndSrc, _srcRect)) { Logger::Get().Win32Error("GetClientScreenRect 失败"); - return {}; + return false; } } - result = { - std::lround(result.left + cropping.Left), - std::lround(result.top + cropping.Top), - std::lround(result.right - cropping.Right), - std::lround(result.bottom - cropping.Bottom) + _srcRect = { + std::lround(_srcRect.left + cropping.Left), + std::lround(_srcRect.top + cropping.Top), + std::lround(_srcRect.right - cropping.Right), + std::lround(_srcRect.bottom - cropping.Bottom) }; - if (result.right - result.left <= 0 || result.bottom - result.top <= 0) { + if (_srcRect.right - _srcRect.left <= 0 || _srcRect.bottom - _srcRect.top <= 0) { Logger::Get().Error("裁剪窗口失败"); - return {}; + return false; } - return result; + return true; } bool FrameSourceBase::_GetMapToOriginDPI(HWND hWnd, double& a, double& bx, double& by) noexcept { diff --git a/src/Magpie.Core/FrameSourceBase.h b/src/Magpie.Core/FrameSourceBase.h index 34bacd1ce..cb48c1b01 100644 --- a/src/Magpie.Core/FrameSourceBase.h +++ b/src/Magpie.Core/FrameSourceBase.h @@ -29,7 +29,11 @@ class FrameSourceBase { return _output.get(); } - virtual const char* GetName() const noexcept = 0; + // 注意:返回源窗口作为输入部分的位置,但可能和 GetOutput 获取到的纹理尺寸不同, + // 因为源窗口可能存在 DPI 缩放,而某些捕获方法无视 DPI 缩放 + const RECT& SrcRect() const noexcept { return _srcRect; } + + virtual const char* Name() const noexcept = 0; virtual bool IsScreenCapture() = 0; @@ -38,7 +42,7 @@ class FrameSourceBase { virtual bool _CanCaptureTitleBar() noexcept = 0; - RECT _GetSrcFrameRect(const Cropping& cropping, bool isCaptureTitleBar) noexcept; + bool _CalcSrcRect(const Cropping& cropping, bool isCaptureTitleBar) noexcept; // 获取坐标系 1 到坐标系 2 的映射关系 // 坐标系 1:屏幕坐标系,即虚拟化后的坐标系。原点为屏幕左上角 @@ -52,6 +56,7 @@ class FrameSourceBase { static bool _CenterWindowIfNecessary(HWND hWnd, const RECT& rcWork) noexcept; HWND _hwndSrc = NULL; + RECT _srcRect{}; ID3D11Device5* _d3dDevice = nullptr; winrt::com_ptr _output; diff --git a/src/Magpie.Core/GraphicsCaptureFrameSource.cpp b/src/Magpie.Core/GraphicsCaptureFrameSource.cpp index 90acc44b3..260980f00 100644 --- a/src/Magpie.Core/GraphicsCaptureFrameSource.cpp +++ b/src/Magpie.Core/GraphicsCaptureFrameSource.cpp @@ -56,7 +56,12 @@ bool GraphicsCaptureFrameSource::Initialize(HWND hwndSrc, HWND hwndScaling, cons return false; } - if (!_CaptureWindow(interop.get(), options)) { + if (!_CalcSrcRect(options.cropping, options.IsCaptureTitleBar())) { + Logger::Get().Error("_CalcSrcRect 失败"); + return false; + } + + if (!_CaptureWindow(interop.get())) { Logger::Get().Info("窗口捕获失败,回落到屏幕捕获"); if (_CaptureMonitor(interop.get(), options, hwndScaling)) { @@ -122,9 +127,7 @@ FrameSourceBase::UpdateState GraphicsCaptureFrameSource::Update() noexcept { return UpdateState::NewFrame; } -bool GraphicsCaptureFrameSource::_CaptureWindow(IGraphicsCaptureItemInterop* interop, const ScalingOptions& options) { - // DwmGetWindowAttribute 和 Graphics.Capture 无法应用于子窗口 - +bool GraphicsCaptureFrameSource::_CaptureWindow(IGraphicsCaptureItemInterop* interop) noexcept { // 包含边框的窗口尺寸 RECT srcFrameBounds{}; HRESULT hr = DwmGetWindowAttribute(_hwndSrc, @@ -134,20 +137,14 @@ bool GraphicsCaptureFrameSource::_CaptureWindow(IGraphicsCaptureItemInterop* int return false; } - RECT srcFrameRect = _GetSrcFrameRect(options.cropping, options.IsCaptureTitleBar()); - if (srcFrameRect == RECT{}) { - Logger::Get().Error("_GetSrcFrameRect 失败"); - return false; - } - // 在源窗口存在 DPI 缩放时有时会有一像素的偏移(取决于窗口在屏幕上的位置) // 可能是 DwmGetWindowAttribute 的 bug _frameBox = { - UINT(srcFrameRect.left - srcFrameBounds.left), - UINT(srcFrameRect.top - srcFrameBounds.top), + UINT(_srcRect.left - srcFrameBounds.left), + UINT(_srcRect.top - srcFrameBounds.top), 0, - UINT(srcFrameRect.right - srcFrameBounds.left), - UINT(srcFrameRect.bottom - srcFrameBounds.top), + UINT(_srcRect.right - srcFrameBounds.left), + UINT(_srcRect.bottom - srcFrameBounds.top), 1 }; @@ -267,7 +264,11 @@ void GraphicsCaptureFrameSource::_RemoveOwnerFromAltTabList(HWND hwndSrc) noexce _originalOwnerExStyle = ownerExStyle; } -bool GraphicsCaptureFrameSource::_CaptureMonitor(IGraphicsCaptureItemInterop* interop, const ScalingOptions& options, HWND hwndScaling) { +bool GraphicsCaptureFrameSource::_CaptureMonitor( + IGraphicsCaptureItemInterop* interop, + const ScalingOptions& options, + HWND hwndScaling +) noexcept { // Win10 无法隐藏黄色边框,因此只在 Win11 中回落到屏幕捕获 if (!Win32Utils::GetOSVersion().IsWin11()) { Logger::Get().Error("无法使用屏幕捕获"); @@ -300,18 +301,18 @@ bool GraphicsCaptureFrameSource::_CaptureMonitor(IGraphicsCaptureItemInterop* in return false; } - RECT srcFrameRect = _GetSrcFrameRect(options.cropping, options.IsCaptureTitleBar()); - if (srcFrameRect == RECT{}) { - Logger::Get().Error("_GetSrcFrameRect 失败"); + // 重新计算捕获位置 + if (!_CalcSrcRect(options.cropping, options.IsCaptureTitleBar())) { + Logger::Get().Error("_CalcSrcRect 失败"); return false; } _frameBox = { - UINT(srcFrameRect.left - mi.rcMonitor.left), - UINT(srcFrameRect.top - mi.rcMonitor.top), + UINT(_srcRect.left - mi.rcMonitor.left), + UINT(_srcRect.top - mi.rcMonitor.top), 0, - UINT(srcFrameRect.right - mi.rcMonitor.left), - UINT(srcFrameRect.bottom - mi.rcMonitor.top), + UINT(_srcRect.right - mi.rcMonitor.left), + UINT(_srcRect.bottom - mi.rcMonitor.top), 1 }; diff --git a/src/Magpie.Core/GraphicsCaptureFrameSource.h b/src/Magpie.Core/GraphicsCaptureFrameSource.h index f58d05b94..d0e4cb21b 100644 --- a/src/Magpie.Core/GraphicsCaptureFrameSource.h +++ b/src/Magpie.Core/GraphicsCaptureFrameSource.h @@ -20,7 +20,7 @@ class GraphicsCaptureFrameSource : public FrameSourceBase { return _isScreenCapture; } - const char* GetName() const noexcept override { + const char* Name() const noexcept override { return NAME; } @@ -40,9 +40,9 @@ class GraphicsCaptureFrameSource : public FrameSourceBase { } private: - bool _CaptureWindow(IGraphicsCaptureItemInterop* interop, const ScalingOptions& options); + bool _CaptureWindow(IGraphicsCaptureItemInterop* interop) noexcept; - bool _CaptureMonitor(IGraphicsCaptureItemInterop* interop, const ScalingOptions& options, HWND hwndScaling); + bool _CaptureMonitor(IGraphicsCaptureItemInterop* interop, const ScalingOptions& options, HWND hwndScaling) noexcept; bool _TryCreateGraphicsCaptureItem(IGraphicsCaptureItemInterop* interop, HWND hwndSrc) noexcept; diff --git a/src/Magpie.Core/Magpie.Core.vcxproj b/src/Magpie.Core/Magpie.Core.vcxproj index ba2505b55..74c73bc2e 100644 --- a/src/Magpie.Core/Magpie.Core.vcxproj +++ b/src/Magpie.Core/Magpie.Core.vcxproj @@ -79,6 +79,7 @@ + @@ -106,6 +107,7 @@ + diff --git a/src/Magpie.Core/Magpie.Core.vcxproj.filters b/src/Magpie.Core/Magpie.Core.vcxproj.filters index 3ac97d454..793997e34 100644 --- a/src/Magpie.Core/Magpie.Core.vcxproj.filters +++ b/src/Magpie.Core/Magpie.Core.vcxproj.filters @@ -68,6 +68,11 @@ + + + + + @@ -96,6 +101,10 @@ + + + + diff --git a/src/Magpie.Core/Renderer.cpp b/src/Magpie.Core/Renderer.cpp index 97dac62d9..14c84712e 100644 --- a/src/Magpie.Core/Renderer.cpp +++ b/src/Magpie.Core/Renderer.cpp @@ -42,11 +42,40 @@ bool Renderer::Initialize(HWND hwndSrc, HWND hwndScaling, const ScalingOptions& return false; } - if (!_CreateSwapChain(options)) { + if (!_CreateSwapChain()) { Logger::Get().Error("_CreateSwapChain 失败"); return false; } + // 等待后端初始化完成 + while (true) { + { + std::scoped_lock lk(_mutex); + if (_sharedTextureHandle) { + break; + } + } + Sleep(0); + } + + // 获取共享纹理 + HRESULT hr = _frontendResources.GetD3DDevice()->OpenSharedResource( + _sharedTextureHandle, IID_PPV_ARGS(_frontendSharedTexture.put())); + if (FAILED(hr)) { + Logger::Get().ComError("OpenSharedResource 失败", hr); + return false; + } + + _frontendSharedTextureMutex = _frontendSharedTexture.try_as(); + + D3D11_TEXTURE2D_DESC desc; + _frontendSharedTexture->GetDesc(&desc); + + _destRect.left = scalingWndRect.left + (_scalingWndSize.cx - desc.Width) / 2; + _destRect.top = scalingWndRect.top + (_scalingWndSize.cy - desc.Height) / 2; + _destRect.right = _destRect.left + desc.Width; + _destRect.bottom = _destRect.top + desc.Height; + return true; } @@ -67,7 +96,7 @@ static bool CheckMultiplaneOverlaySupport(IDXGISwapChain4* swapChain) noexcept { return output2->SupportsOverlays(); } -bool Renderer::_CreateSwapChain(const ScalingOptions& /*options*/) noexcept { +bool Renderer::_CreateSwapChain() noexcept { DXGI_SWAP_CHAIN_DESC1 sd{}; sd.Width = _scalingWndSize.cx; sd.Height = _scalingWndSize.cy; @@ -131,24 +160,6 @@ bool Renderer::_CreateSwapChain(const ScalingOptions& /*options*/) noexcept { return true; } -bool Renderer::_ObtainSharedTexture() noexcept { - // 获取共享纹理 - HRESULT hr = _frontendResources.GetD3DDevice()->OpenSharedResource( - _sharedTextureHandle, IID_PPV_ARGS(_frontendSharedTexture.put())); - if (FAILED(hr)) { - Logger::Get().ComError("OpenSharedResource 失败", hr); - return false; - } - - _frontendSharedTextureMutex = _frontendSharedTexture.try_as(); - - D3D11_TEXTURE2D_DESC desc; - _frontendSharedTexture->GetDesc(&desc); - _sharedTextureSize = { (LONG)desc.Width,(LONG)desc.Height }; - - return true; -} - void Renderer::Render() noexcept { if (_lastAccessMutexKey == _sharedTextureMutexKey) { if (_lastAccessMutexKey == 0) { @@ -167,19 +178,17 @@ void Renderer::Render() noexcept { } } - if (!_frontendSharedTexture) { - if (!_ObtainSharedTexture()) { - Logger::Get().Error("_ObtainSharedTexture 失败"); - return; - } - } - WaitForSingleObjectEx(_frameLatencyWaitableObject.get(), 1000, TRUE); ID3D11DeviceContext4* d3dDC = _frontendResources.GetD3DDC(); d3dDC->ClearState(); - if (_sharedTextureSize != _scalingWndSize) { + // 输出画面是否占满屏幕 + const SIZE destSize{ _destRect.right - _destRect.left, _destRect.bottom - _destRect.top }; + const bool isFill = destSize.cx == _scalingWndSize.cx && destSize.cy == _scalingWndSize.cy; + + if (!isFill) { + // 以黑色填充背景,因为我们指定了 DXGI_SWAP_EFFECT_FLIP_DISCARD,同时也是为了和 RTSS 兼容 ID3D11RenderTargetView* backBufferRtv = _frontendResources.GetRenderTargetView(_backBuffer.get()); static constexpr FLOAT black[4] = { 0.0f,0.0f,0.0f,1.0f }; d3dDC->ClearRenderTargetView(backBufferRtv, black); @@ -191,16 +200,16 @@ void Renderer::Render() noexcept { return; } - if (_sharedTextureSize == _scalingWndSize) { + if (isFill) { d3dDC->CopyResource(_backBuffer.get(), _frontendSharedTexture.get()); } else { - assert(_sharedTextureSize.cx <= _scalingWndSize.cx && _sharedTextureSize.cy <= _scalingWndSize.cy); + assert(destSize.cx <= _scalingWndSize.cx && destSize.cy <= _scalingWndSize.cy); - const POINT outputPos = { - (_scalingWndSize.cx - _sharedTextureSize.cx) / 2, - (_scalingWndSize.cy - _sharedTextureSize.cy) / 2 + const POINT destPos = { + (_scalingWndSize.cx - destSize.cx) / 2, + (_scalingWndSize.cy - destSize.cy) / 2 }; - d3dDC->CopySubresourceRegion(_backBuffer.get(), 0, outputPos.x, outputPos.y, 0, + d3dDC->CopySubresourceRegion(_backBuffer.get(), 0, destPos.x, destPos.y, 0, _frontendSharedTexture.get(), 0, nullptr); } @@ -234,7 +243,7 @@ bool Renderer::_InitFrameSource(const ScalingOptions& options) noexcept { return false; } - Logger::Get().Info(StrUtils::Concat("当前捕获模式:", _frameSource->GetName())); + Logger::Get().Info(StrUtils::Concat("当前捕获模式:", _frameSource->Name())); ID3D11Device5* d3dDevice = _backendResources.GetD3DDevice(); if (!_frameSource->Initialize(_hwndSrc, _hwndScaling, options, d3dDevice)) { @@ -369,7 +378,7 @@ ID3D11Texture2D* Renderer::_BuildEffects(const ScalingOptions& options) noexcept return inOutTexture; } -bool Renderer::_CreateSharedTexture(ID3D11Texture2D* effectsOutput) noexcept { +HANDLE Renderer::_CreateSharedTexture(ID3D11Texture2D* effectsOutput) noexcept { D3D11_TEXTURE2D_DESC desc; effectsOutput->GetDesc(&desc); SIZE textureSize = { (LONG)desc.Width, (LONG)desc.Height }; @@ -386,45 +395,46 @@ bool Renderer::_CreateSharedTexture(ID3D11Texture2D* effectsOutput) noexcept { ); if (!_backendSharedTexture) { Logger::Get().Error("创建 Texture2D 失败"); - return false; + return NULL; } _backendSharedTextureMutex = _backendSharedTexture.try_as(); winrt::com_ptr sharedDxgiRes = _backendSharedTexture.try_as(); - HRESULT hr = sharedDxgiRes->GetSharedHandle(&_sharedTextureHandle); + HANDLE sharedHandle = NULL; + HRESULT hr = sharedDxgiRes->GetSharedHandle(&sharedHandle); if (FAILED(hr)) { Logger::Get().Error("GetSharedHandle 失败"); - return false; + return NULL; } - return true; + return sharedHandle; } void Renderer::_BackendThreadProc(const ScalingOptions& options) noexcept { winrt::init_apartment(winrt::apartment_type::single_threaded); // 创建 DispatcherQueue - DispatcherQueueOptions dqOptions{}; - dqOptions.dwSize = sizeof(DispatcherQueueOptions); - dqOptions.threadType = DQTYPE_THREAD_CURRENT; - - HRESULT hr = CreateDispatcherQueueController( - dqOptions, - (PDISPATCHERQUEUECONTROLLER*)winrt::put_abi(_backendThreadDqc) - ); - if (FAILED(hr)) { - Logger::Get().ComError("CreateDispatcherQueueController 失败", hr); - return; + { + DispatcherQueueOptions dqOptions{}; + dqOptions.dwSize = sizeof(DispatcherQueueOptions); + dqOptions.threadType = DQTYPE_THREAD_CURRENT; + + HRESULT hr = CreateDispatcherQueueController( + dqOptions, + (PDISPATCHERQUEUECONTROLLER*)winrt::put_abi(_backendThreadDqc) + ); + if (FAILED(hr)) { + Logger::Get().ComError("CreateDispatcherQueueController 失败", hr); + return; + } } if (!_backendResources.Initialize(options)) { return; } - ID3D11Device5* d3dDevice = _backendResources.GetD3DDevice(); - if (!_InitFrameSource(options)) { return; } @@ -434,7 +444,8 @@ void Renderer::_BackendThreadProc(const ScalingOptions& options) noexcept { return; } - hr = d3dDevice->CreateFence(_fenceValue, D3D11_FENCE_FLAG_NONE, IID_PPV_ARGS(&_d3dFence)); + HRESULT hr = _backendResources.GetD3DDevice()->CreateFence( + _fenceValue, D3D11_FENCE_FLAG_NONE, IID_PPV_ARGS(&_d3dFence)); if (FAILED(hr)) { Logger::Get().ComError("CreateFence 失败", hr); return; @@ -446,11 +457,18 @@ void Renderer::_BackendThreadProc(const ScalingOptions& options) noexcept { return; } - if (!_CreateSharedTexture(outputTexture)) { + HANDLE sharedHandle = _CreateSharedTexture(outputTexture); + if (!sharedHandle) { Logger::Get().Win32Error("_CreateSharedTexture 失败"); return; } + { + std::scoped_lock lk(_mutex); + _sharedTextureHandle = sharedHandle; + _srcRect = _frameSource->SrcRect(); + } + MSG msg; while (true) { while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { diff --git a/src/Magpie.Core/Renderer.h b/src/Magpie.Core/Renderer.h index a20c1db4d..4bd50d79a 100644 --- a/src/Magpie.Core/Renderer.h +++ b/src/Magpie.Core/Renderer.h @@ -21,10 +21,16 @@ class Renderer { void Render() noexcept; -private: - bool _CreateSwapChain(const ScalingOptions& options) noexcept; + const RECT& SrcRect() const noexcept { + return _srcRect; + } + + const RECT& DestRect() const noexcept { + return _destRect; + } - bool _ObtainSharedTexture() noexcept; +private: + bool _CreateSwapChain() noexcept; void _BackendThreadProc(const ScalingOptions& options) noexcept; @@ -32,7 +38,7 @@ class Renderer { ID3D11Texture2D* _BuildEffects(const ScalingOptions& options) noexcept; - bool _CreateSharedTexture(ID3D11Texture2D* effectsOutput) noexcept; + HANDLE _CreateSharedTexture(ID3D11Texture2D* effectsOutput) noexcept; void _BackendRender(ID3D11Texture2D* effectsOutput) noexcept; @@ -46,7 +52,7 @@ class Renderer { winrt::com_ptr _frontendSharedTexture; winrt::com_ptr _frontendSharedTextureMutex; - SIZE _sharedTextureSize{}; + RECT _destRect{}; std::thread _backendThread; @@ -69,8 +75,12 @@ class Renderer { winrt::Windows::System::DispatcherQueueController _backendThreadDqc{ nullptr }; - HANDLE _sharedTextureHandle = NULL; std::atomic _sharedTextureMutexKey = 0; + + HANDLE _sharedTextureHandle = NULL; + RECT _srcRect{}; + // 用于在初始化时同步对 _sharedTextureHandle 和 _srcRect 的访问 + Win32Utils::SRWMutex _mutex; }; } diff --git a/src/Magpie.Core/ScalingRuntime.cpp b/src/Magpie.Core/ScalingRuntime.cpp index b04a45413..b1a4c7649 100644 --- a/src/Magpie.Core/ScalingRuntime.cpp +++ b/src/Magpie.Core/ScalingRuntime.cpp @@ -89,7 +89,7 @@ void ScalingRuntime::_ScalingThreadProc() noexcept { _IsRunning(false); } - // 等待新消息 1ms + // 等待新消息 2ms,即我们每隔 2ms 检查一次光标位置 MsgWaitForMultipleObjectsEx(0, nullptr, 2, QS_ALLINPUT, MWMO_INPUTAVAILABLE); } } diff --git a/src/Magpie.Core/ScalingWindow.cpp b/src/Magpie.Core/ScalingWindow.cpp index 131f984bf..5333bef1f 100644 --- a/src/Magpie.Core/ScalingWindow.cpp +++ b/src/Magpie.Core/ScalingWindow.cpp @@ -5,6 +5,7 @@ #include "Renderer.h" #include "Win32Utils.h" #include "WindowHelper.h" +#include "CursorManager.h" namespace Magpie::Core { @@ -162,11 +163,19 @@ bool ScalingWindow::Create(HINSTANCE hInstance, HWND hwndSrc, ScalingOptions&& o } if (!GetWindowRect(hwndSrc, &_srcWndRect)) { + Logger::Get().Win32Error("GetWindowRect 失败"); return false; } _renderer = std::make_unique(); if (!_renderer->Initialize(hwndSrc, _hWnd, _options)) { + Logger::Get().Error("初始化 Renderer 失败"); + return false; + } + + _cursorManager = std::make_unique(); + if (!_cursorManager->Initialize(_renderer->SrcRect(), wndRect, _renderer->DestRect(), options)) { + Logger::Get().Error("初始化 CursorManager 失败"); return false; } @@ -184,6 +193,7 @@ void ScalingWindow::Render() noexcept { return; } + _cursorManager->Update(); _renderer->Render(); } diff --git a/src/Magpie.Core/ScalingWindow.h b/src/Magpie.Core/ScalingWindow.h index 507f78a95..cba352372 100644 --- a/src/Magpie.Core/ScalingWindow.h +++ b/src/Magpie.Core/ScalingWindow.h @@ -5,6 +5,7 @@ namespace Magpie::Core { class Renderer; +class CursorManager; class ScalingWindow : public WindowBase { friend class base_type; @@ -27,6 +28,7 @@ class ScalingWindow : public WindowBase { ScalingOptions _options; std::unique_ptr _renderer; + std::unique_ptr _cursorManager; HWND _hwndSrc = NULL; RECT _srcWndRect{}; From 78a35a0b868d16557ab51ba88e5e782777364f50 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=97=AD?= <34770031+Blinue@users.noreply.github.com> Date: Fri, 16 Jun 2023 21:17:40 +0800 Subject: [PATCH 032/155] =?UTF-8?q?feat:=20=E6=8D=95=E8=8E=B7=E5=85=89?= =?UTF-8?q?=E6=A0=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Magpie.Core/CursorManager.cpp | 405 ++++++++++++++++++++++++++++-- src/Magpie.Core/CursorManager.h | 9 + src/Magpie.Core/Renderer.cpp | 6 +- src/Magpie.Core/ScalingWindow.cpp | 3 +- 4 files changed, 402 insertions(+), 21 deletions(-) diff --git a/src/Magpie.Core/CursorManager.cpp b/src/Magpie.Core/CursorManager.cpp index 28cd98123..7004b7957 100644 --- a/src/Magpie.Core/CursorManager.cpp +++ b/src/Magpie.Core/CursorManager.cpp @@ -10,18 +10,36 @@ namespace Magpie::Core { CursorManager::~CursorManager() noexcept { + if (_curClips != RECT{}) { + ClipCursor(nullptr); + } + + if (_isUnderCapture) { + POINT pt{}; + if (!::GetCursorPos(&pt)) { + Logger::Get().Win32Error("GetCursorPos 失败"); + } + _curClips = {}; + _StopCapture(pt, true); + } } bool CursorManager::Initialize( + HWND hwndSrc, + HWND hwndScaling, const RECT& srcRect, const RECT& scalingWndRect, const RECT& destRect, const ScalingOptions& options ) noexcept { + _hwndSrc = hwndSrc; + _hwndScaling = hwndScaling; _srcRect = srcRect; _scalingWndRect = scalingWndRect; _destRect = destRect; _isAdjustCursorSpeed = options.IsAdjustCursorSpeed(); + _isDebugMode = options.IsDebugMode(); + _is3DGameMode = options.Is3DGameMode(); return true; } @@ -31,9 +49,327 @@ void CursorManager::Update() noexcept { } void CursorManager::_AdjustCursorSpeed() noexcept { + if (!SystemParametersInfo(SPI_GETMOUSESPEED, 0, &_originCursorSpeed, 0)) { + Logger::Get().Win32Error("获取光标移速失败"); + return; + } + + // 鼠标加速默认打开 + bool isMouseAccelerationOn = true; + { + std::array values{}; + if (SystemParametersInfo(SPI_GETMOUSE, 0, values.data(), 0)) { + isMouseAccelerationOn = values[2]; + } else { + Logger::Get().Win32Error("检索鼠标加速失败"); + } + } + + const SIZE srcSize = Win32Utils::GetSizeOfRect(_srcRect); + const SIZE destSize = Win32Utils::GetSizeOfRect(_destRect); + const double scale = ((double)destSize.cx / srcSize.cx + (double)destSize.cy / srcSize.cy) / 2; + + INT newSpeed = 0; + + // “提高指针精确度”(鼠标加速)打开时光标移速的调整为线性,否则为非线性 + // 参见 https://liquipedia.net/counterstrike/Mouse_Settings#Windows_Sensitivity + if (isMouseAccelerationOn) { + newSpeed = std::clamp((INT)lround(_originCursorSpeed / scale), 1, 20); + } else { + static constexpr std::array SENSITIVITIES = { + 0.03125, 0.0625, 0.125, 0.25, 0.375, 0.5, 0.625, 0.75, 0.875, + 1.0, 1.25, 1.5, 1.75, 2, 2.25, 2.5, 2.75, 3, 3.25, 3.5 + }; + + _originCursorSpeed = std::clamp(_originCursorSpeed, 1, 20); + double newSensitivity = SENSITIVITIES[static_cast(_originCursorSpeed) - 1] / scale; + + auto it = std::lower_bound(SENSITIVITIES.begin(), SENSITIVITIES.end(), newSensitivity - 1e-6); + newSpeed = INT(it - SENSITIVITIES.begin()) + 1; + + if (it != SENSITIVITIES.begin() && it != SENSITIVITIES.end()) { + // 找到两侧最接近的数值 + if (std::abs(*it - newSensitivity) > std::abs(*(it - 1) - newSensitivity)) { + --newSpeed; + } + } + } + + if (!SystemParametersInfo(SPI_SETMOUSESPEED, 0, (PVOID)(intptr_t)newSpeed, 0)) { + Logger::Get().Win32Error("设置光标移速失败"); + } +} + +// 检测光标位于哪个窗口上,是否检测缩放窗口由 clickThroughHost 指定 +static HWND WindowFromPoint(HWND hwndScaling, const RECT& scalingWndRect, POINT pt, bool clickThroughHost) noexcept { + struct EnumData { + HWND result; + HWND hwndScaling; + RECT scalingWndRect; + POINT pt; + bool clickThroughHost; + } data{ NULL, hwndScaling, scalingWndRect, pt, clickThroughHost }; + + EnumWindows([](HWND hWnd, LPARAM lParam) { + EnumData& data = *(EnumData*)lParam; + if (hWnd == data.hwndScaling) { + if (PtInRect(&data.scalingWndRect, data.pt) && !data.clickThroughHost) { + data.result = hWnd; + return FALSE; + } else { + return TRUE; + } + } + + // 跳过不可见的窗口 + if (!(GetWindowLongPtr(hWnd, GWL_STYLE) & WS_VISIBLE)) { + return TRUE; + } + + // 跳过透明窗口 + if (GetWindowLongPtr(hWnd, GWL_EXSTYLE) & WS_EX_TRANSPARENT) { + return TRUE; + } + + // 跳过被冻结的窗口 + UINT isCloaked{}; + DwmGetWindowAttribute(hWnd, DWMWA_CLOAKED, &isCloaked, sizeof(isCloaked)); + if (isCloaked != 0) { + return TRUE; + } + + // 对于分层窗口(Layered Window),没有公开的 API 可以检测某个像素是否透明。 + // ChildWindowFromPointEx 是一个替代方案,当命中透明像素时它将返回 NULL。 + // Windows 内部有 LayerHitTest (https://github.com/tongzx/nt5src/blob/daad8a087a4e75422ec96b7911f1df4669989611/Source/XPSP1/NT/windows/core/ntuser/kernel/winwhere.c#L21) 方法用于对分层窗口执行命中测试,虽然它没有被公开,但 ChildWindowFromPointEx 使用了它 + // 在比 Magpie 权限更高的窗口上使用会失败,失败则假设不是分层窗口 + POINT clientPt = data.pt; + ScreenToClient(hWnd, &clientPt); + SetLastError(0); + if (!ChildWindowFromPointEx(hWnd, clientPt, CWP_SKIPDISABLED | CWP_SKIPINVISIBLE | CWP_SKIPTRANSPARENT)) { + if (GetLastError() == 0) { + // 命中了透明像素 + return TRUE; + } + + // 源窗口的权限比 Magpie 更高,回落到 GetWindowRect + RECT windowRect{}; + if (!GetWindowRect(hWnd, &windowRect) || !PtInRect(&windowRect, data.pt)) { + return TRUE; + } + } + + data.result = hWnd; + return FALSE; + }, (LPARAM)&data); + + return data.result; } void CursorManager::_UpdateCursorClip() noexcept { + // 优先级: + // 1. 断点模式:不限制,捕获/取消捕获,支持 UI + // 2. 在 3D 游戏中限制光标:每帧都限制一次,不退出捕获,因此无法使用 UI,不支持多屏幕 + // 3. 常规:根据多屏幕限制光标,捕获/取消捕获,支持 UI 和多屏幕 + + if (!_isDebugMode && _is3DGameMode) { + // 开启“在 3D 游戏中限制光标”则每帧都限制一次光标 + _curClips = _srcRect; + ClipCursor(&_srcRect); + return; + } + + const SIZE srcSize = Win32Utils::GetSizeOfRect(_srcRect); + const SIZE destSize = Win32Utils::GetSizeOfRect(_destRect); + + + INT_PTR style = GetWindowLongPtr(_hwndScaling, GWL_EXSTYLE); + + POINT cursorPos; + if (!GetCursorPos(&cursorPos)) { + Logger::Get().Win32Error("GetCursorPos 失败"); + return; + } + + if (_isUnderCapture) { + /////////////////////////////////////////////////////////// + // + // 处于捕获状态 + // -------------------------------------------------------- + // | 虚拟位置被遮挡 | 虚拟位置未被遮挡 + // -------------------------------------------------------- + // 实际位置被遮挡 | 退出捕获 | 退出捕获,主窗口不透明 + // -------------------------------------------------------- + // 实际位置未被遮挡 | 退出捕获 | 无操作 + // -------------------------------------------------------- + // + /////////////////////////////////////////////////////////// + + HWND hwndCur = WindowFromPoint(_hwndScaling, _scalingWndRect, _SrcToScaling(cursorPos, true), false); + + if (hwndCur != _hwndScaling) { + // 主窗口被遮挡 + if (style | WS_EX_TRANSPARENT) { + SetWindowLongPtr(_hwndScaling, GWL_EXSTYLE, style & ~WS_EX_TRANSPARENT); + } + + _StopCapture(cursorPos); + } else { + // 主窗口未被遮挡 + bool stopCapture = false; + + if (!stopCapture) { + // 判断源窗口是否被遮挡 + hwndCur = WindowFromPoint(_hwndScaling, _scalingWndRect, cursorPos, true); + stopCapture = hwndCur != _hwndSrc && (!IsChild(_hwndSrc, hwndCur) || !((GetWindowStyle(hwndCur) & WS_CHILD))); + } + + if (stopCapture) { + if (style | WS_EX_TRANSPARENT) { + SetWindowLongPtr(_hwndScaling, GWL_EXSTYLE, style & ~WS_EX_TRANSPARENT); + } + + _StopCapture(cursorPos); + } else { + if (!(style & WS_EX_TRANSPARENT)) { + SetWindowLongPtr(_hwndScaling, GWL_EXSTYLE, style | WS_EX_TRANSPARENT); + } + } + } + } else { + ///////////////////////////////////////////////////////// + // + // 未处于捕获状态 + // ----------------------------------------------------- + // | 虚拟位置被遮挡 | 虚拟位置未被遮挡 + // ------------------------------------------------------ + // 实际位置被遮挡 | 无操作 | 主窗口不透明 + // ------------------------------------------------------ + // 实际位置未被遮挡 | 无操作 | 开始捕获,主窗口透明 + // ------------------------------------------------------ + // + ///////////////////////////////////////////////////////// + + HWND hwndCur = WindowFromPoint(_hwndScaling, _scalingWndRect, cursorPos, false); + + if (hwndCur == _hwndScaling) { + // 主窗口未被遮挡 + POINT newCursorPos = _ScalingToSrc(cursorPos); + + if (!PtInRect(&_srcRect, newCursorPos)) { + // 跳过黑边 + if (false) { + // 从内部移到外部 + // 此时有 UI 贴边 + /*if (newCursorPos.x >= _srcRect.right) { + cursorPos.x += _scalingWndRect.right - _scalingWndRect.left - outputRect.right; + } else if (newCursorPos.x < _srcRect.left) { + cursorPos.x -= outputRect.left; + } + + if (newCursorPos.y >= _srcRect.bottom) { + cursorPos.y += _scalingWndRect.bottom - _scalingWndRect.top - outputRect.bottom; + } else if (newCursorPos.y < _srcRect.top) { + cursorPos.y -= outputRect.top; + } + + if (MonitorFromPoint(cursorPos, MONITOR_DEFAULTTONULL)) { + SetCursorPos(cursorPos.x, cursorPos.y); + } else { + // 目标位置不存在屏幕,则将光标限制在输出区域内 + SetCursorPos( + std::clamp(cursorPos.x, _scalingWndRect.left + outputRect.left, _scalingWndRect.left + outputRect.right - 1), + std::clamp(cursorPos.y, _scalingWndRect.top + outputRect.top, _scalingWndRect.top + outputRect.bottom - 1) + ); + }*/ + } else { + // 从外部移到内部 + + POINT clampedPos = { + std::clamp(cursorPos.x, _destRect.left, _destRect.right - 1), + std::clamp(cursorPos.y, _destRect.top, _destRect.bottom - 1) + }; + + if (WindowFromPoint(_hwndScaling, _scalingWndRect, clampedPos, false) == _hwndScaling) { + if (!(style & WS_EX_TRANSPARENT)) { + SetWindowLongPtr(_hwndScaling, GWL_EXSTYLE, style | WS_EX_TRANSPARENT); + } + + _StartCapture(cursorPos); + } else { + // 要跳跃的位置被遮挡 + if (style | WS_EX_TRANSPARENT) { + SetWindowLongPtr(_hwndScaling, GWL_EXSTYLE, style & ~WS_EX_TRANSPARENT); + } + } + } + } else { + bool startCapture = true; + + if (startCapture) { + // 判断源窗口是否被遮挡 + hwndCur = WindowFromPoint(_hwndScaling, _scalingWndRect, newCursorPos, true); + startCapture = hwndCur == _hwndSrc || ((IsChild(_hwndSrc, hwndCur) && (GetWindowStyle(hwndCur) & WS_CHILD))); + } + + if (startCapture) { + if (!(style & WS_EX_TRANSPARENT)) { + SetWindowLongPtr(_hwndScaling, GWL_EXSTYLE, style | WS_EX_TRANSPARENT); + } + + _StartCapture(cursorPos); + } else { + if (style | WS_EX_TRANSPARENT) { + SetWindowLongPtr(_hwndScaling, GWL_EXSTYLE, style & ~WS_EX_TRANSPARENT); + } + } + } + } + } + + if (_isDebugMode) { + return; + } + + if (!false && !_isUnderCapture) { + return; + } + + // 根据当前光标位置的四个方向有无屏幕来确定应该在哪些方向限制光标,但这无法 + // 处理屏幕之间存在间隙的情况。解决办法是 _StopCapture 只在目标位置存在屏幕时才取消捕获, + // 当光标试图移动到间隙中时将被挡住。如果光标的速度足以跨越间隙,则它依然可以在屏幕间移动。 + ::GetCursorPos(&cursorPos); + POINT hostPos = false ? cursorPos : _SrcToScaling(cursorPos, true); + + RECT clips{ LONG_MIN, LONG_MIN, LONG_MAX, LONG_MAX }; + + // left + RECT rect{ LONG_MIN, hostPos.y, _scalingWndRect.left, hostPos.y + 1 }; + if (!MonitorFromRect(&rect, MONITOR_DEFAULTTONULL)) { + clips.left = false ? _destRect.left : _srcRect.left; + } + + // top + rect = { hostPos.x, LONG_MIN, hostPos.x + 1,_scalingWndRect.top }; + if (!MonitorFromRect(&rect, MONITOR_DEFAULTTONULL)) { + clips.top = false ? _destRect.top : _srcRect.top; + } + + // right + rect = { _scalingWndRect.right, hostPos.y, LONG_MAX, hostPos.y + 1 }; + if (!MonitorFromRect(&rect, MONITOR_DEFAULTTONULL)) { + clips.right = false ? _destRect.right : _srcRect.right; + } + + // bottom + rect = { hostPos.x, _scalingWndRect.bottom, hostPos.x + 1, LONG_MAX }; + if (!MonitorFromRect(&rect, MONITOR_DEFAULTTONULL)) { + clips.bottom = false ? _destRect.bottom : _srcRect.bottom; + } + + if (clips != _curClips) { + _curClips = clips; + ClipCursor(&clips); + } } static void ShowSystemCursor(bool show) noexcept { @@ -66,7 +402,7 @@ static void ShowSystemCursor(bool show) noexcept { if (show) { /*MagApp::Get().Dispatcher().TryEnqueue([]() { - if (!MagApp::Get().GetHwndHost()) { + if (!MagApp::Get().Get_hwndScaling()) { return; } @@ -113,8 +449,8 @@ void CursorManager::_StartCapture(POINT cursorPos) noexcept { // 移动光标位置 // 跳过黑边 - cursorPos.x = std::clamp(cursorPos.x, _scalingWndRect.left + _destRect.left, _scalingWndRect.left + _destRect.right - 1); - cursorPos.y = std::clamp(cursorPos.y, _scalingWndRect.top + _destRect.top, _scalingWndRect.top + _destRect.bottom - 1); + cursorPos.x = std::clamp(cursorPos.x, _destRect.left, _destRect.right - 1); + cursorPos.y = std::clamp(cursorPos.y, _destRect.top, _destRect.bottom - 1); POINT newCursorPos = _ScalingToSrc(cursorPos); SetCursorPos(newCursorPos.x, newCursorPos.y); @@ -123,34 +459,72 @@ void CursorManager::_StartCapture(POINT cursorPos) noexcept { } void CursorManager::_StopCapture(POINT cursorPos, bool onDestroy) noexcept { + if (!_isUnderCapture) { + return; + } + + if (_curClips != RECT{}) { + _curClips = {}; + ClipCursor(nullptr); + } + + // 在以下情况下离开捕获状态: + // 1. 当前处于捕获状态 + // 2. 光标离开源窗口客户区 + // 3. 目标位置存在屏幕 + // + // 离开捕获状态时 + // 1. 还原光标速度,全局显示光标 + // 2. 将光标移到全屏窗口外的对应位置 + // + // 在有黑边的情况下自动将光标调整到全屏窗口外 + + POINT newCursorPos = _SrcToScaling(cursorPos, true); + + if (onDestroy || MonitorFromPoint(newCursorPos, MONITOR_DEFAULTTONULL)) { + SetCursorPos(newCursorPos.x, newCursorPos.y); + + if (_isAdjustCursorSpeed) { + SystemParametersInfo(SPI_SETMOUSESPEED, 0, (PVOID)(intptr_t)_originCursorSpeed, 0); + } + + ShowSystemCursor(true); + _isUnderCapture = false; + } else { + // 目标位置不存在屏幕,则将光标限制在源窗口内 + SetCursorPos( + std::clamp(cursorPos.x, _srcRect.left, _srcRect.right - 1), + std::clamp(cursorPos.y, _srcRect.top, _srcRect.bottom - 1) + ); + } } // 将源窗口的光标位置映射到缩放后的光标位置 // 当光标位于源窗口之外,与源窗口的距离不会缩放 POINT CursorManager::_SrcToScaling(POINT pt, bool screenCoord) noexcept { POINT result; - if (screenCoord) { - result = { _scalingWndRect.left, _scalingWndRect.top }; - } else { - result = {}; - } if (pt.x >= _srcRect.right) { - result.x += _scalingWndRect.right - _scalingWndRect.left + pt.x - _srcRect.right; + result.x = _scalingWndRect.right + pt.x - _srcRect.right; } else if (pt.x < _srcRect.left) { - result.x += pt.x - _srcRect.left; + result.x = _scalingWndRect.left + pt.x - _srcRect.left; } else { double pos = double(pt.x - _srcRect.left) / (_srcRect.right - _srcRect.left - 1); - result.x += std::lround(pos * (_destRect.right - _destRect.left - 1)) + _destRect.left; + result.x = std::lround(pos * (_destRect.right - _destRect.left - 1)) + _destRect.left; } if (pt.y >= _srcRect.bottom) { - result.y += _scalingWndRect.bottom - _scalingWndRect.top + pt.y - _srcRect.bottom; + result.y = _scalingWndRect.bottom + pt.y - _srcRect.bottom; } else if (pt.y < _srcRect.top) { - result.y += pt.y - _srcRect.top; + result.y = _scalingWndRect.top + pt.y - _srcRect.top; } else { double pos = double(pt.y - _srcRect.top) / (_srcRect.bottom - _srcRect.top - 1); - result.y += std::lround(pos * (_destRect.bottom - _destRect.top - 1)) + _destRect.top; + result.y = std::lround(pos * (_destRect.bottom - _destRect.top - 1)) + _destRect.top; + } + + if (!screenCoord) { + result.x -= _scalingWndRect.left; + result.y -= _scalingWndRect.top; } return result; @@ -160,9 +534,6 @@ POINT CursorManager::_ScalingToSrc(POINT pt) noexcept { const SIZE srcSize = Win32Utils::GetSizeOfRect(_srcRect); const SIZE destSize = Win32Utils::GetSizeOfRect(_destRect); - pt.x -= _scalingWndRect.left; - pt.y -= _scalingWndRect.top; - POINT result = { _srcRect.left, _srcRect.top }; if (pt.x >= _destRect.right) { diff --git a/src/Magpie.Core/CursorManager.h b/src/Magpie.Core/CursorManager.h index c1e6f4292..29a6f2749 100644 --- a/src/Magpie.Core/CursorManager.h +++ b/src/Magpie.Core/CursorManager.h @@ -13,6 +13,8 @@ class CursorManager { ~CursorManager() noexcept; bool Initialize( + HWND hwndSrc, + HWND hwndScaling, const RECT& srcRect, const RECT& scalingWndRect, const RECT& destRect, @@ -33,6 +35,8 @@ class CursorManager { POINT _SrcToScaling(POINT pt, bool screenCoord) noexcept; POINT _ScalingToSrc(POINT pt) noexcept; + HWND _hwndSrc; + HWND _hwndScaling; RECT _srcRect; RECT _scalingWndRect; RECT _destRect; @@ -41,8 +45,13 @@ class CursorManager { HCURSOR _curCursor = NULL; POINT _curCursorPos{ std::numeric_limits::max(), std::numeric_limits::max() }; + RECT _curClips{}; + int _originCursorSpeed = 0; + bool _isUnderCapture = false; bool _isAdjustCursorSpeed = false; + bool _isDebugMode = false; + bool _is3DGameMode = false; }; } diff --git a/src/Magpie.Core/Renderer.cpp b/src/Magpie.Core/Renderer.cpp index 14c84712e..49304c0c2 100644 --- a/src/Magpie.Core/Renderer.cpp +++ b/src/Magpie.Core/Renderer.cpp @@ -183,15 +183,15 @@ void Renderer::Render() noexcept { ID3D11DeviceContext4* d3dDC = _frontendResources.GetD3DDC(); d3dDC->ClearState(); - // 输出画面是否占满屏幕 const SIZE destSize{ _destRect.right - _destRect.left, _destRect.bottom - _destRect.top }; + // 输出画面是否充满缩放窗口 const bool isFill = destSize.cx == _scalingWndSize.cx && destSize.cy == _scalingWndSize.cy; if (!isFill) { // 以黑色填充背景,因为我们指定了 DXGI_SWAP_EFFECT_FLIP_DISCARD,同时也是为了和 RTSS 兼容 + static constexpr FLOAT BLACK[4] = { 0.0f,0.0f,0.0f,1.0f }; ID3D11RenderTargetView* backBufferRtv = _frontendResources.GetRenderTargetView(_backBuffer.get()); - static constexpr FLOAT black[4] = { 0.0f,0.0f,0.0f,1.0f }; - d3dDC->ClearRenderTargetView(backBufferRtv, black); + d3dDC->ClearRenderTargetView(backBufferRtv, BLACK); } _lastAccessMutexKey = ++_sharedTextureMutexKey; diff --git a/src/Magpie.Core/ScalingWindow.cpp b/src/Magpie.Core/ScalingWindow.cpp index 5333bef1f..2bad9b7dc 100644 --- a/src/Magpie.Core/ScalingWindow.cpp +++ b/src/Magpie.Core/ScalingWindow.cpp @@ -174,7 +174,7 @@ bool ScalingWindow::Create(HINSTANCE hInstance, HWND hwndSrc, ScalingOptions&& o } _cursorManager = std::make_unique(); - if (!_cursorManager->Initialize(_renderer->SrcRect(), wndRect, _renderer->DestRect(), options)) { + if (!_cursorManager->Initialize(hwndSrc, _hWnd, _renderer->SrcRect(), wndRect, _renderer->DestRect(), options)) { Logger::Get().Error("初始化 CursorManager 失败"); return false; } @@ -201,6 +201,7 @@ LRESULT ScalingWindow::_MessageHandler(UINT msg, WPARAM wParam, LPARAM lParam) n switch (msg) { case WM_DESTROY: { + _cursorManager.reset(); _renderer.reset(); _options = {}; _hwndSrc = NULL; From 8ccf7b4d361c9879a4d3d857d9fe0cb19a5fd72b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=97=AD?= <34770031+Blinue@users.noreply.github.com> Date: Fri, 16 Jun 2023 22:01:47 +0800 Subject: [PATCH 033/155] =?UTF-8?q?fix:=20=E6=98=BE=E7=A4=BA=E5=85=89?= =?UTF-8?q?=E6=A0=87=E6=97=B6=E9=87=8D=E5=90=AF=E6=8D=95=E8=8E=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Magpie.Core/CursorManager.cpp | 84 ++++++++----------- src/Magpie.Core/CursorManager.h | 20 +++++ src/Magpie.Core/FrameSourceBase.h | 4 +- .../GraphicsCaptureFrameSource.cpp | 16 +++- src/Magpie.Core/GraphicsCaptureFrameSource.h | 14 ++-- src/Magpie.Core/Renderer.cpp | 6 ++ src/Magpie.Core/Renderer.h | 2 + src/Magpie.Core/ScalingWindow.cpp | 4 + 8 files changed, 87 insertions(+), 63 deletions(-) diff --git a/src/Magpie.Core/CursorManager.cpp b/src/Magpie.Core/CursorManager.cpp index 7004b7957..28369cd92 100644 --- a/src/Magpie.Core/CursorManager.cpp +++ b/src/Magpie.Core/CursorManager.cpp @@ -48,6 +48,37 @@ void CursorManager::Update() noexcept { _UpdateCursorClip(); } +void CursorManager::_ShowSystemCursor(bool show) { + static void (WINAPI* const showSystemCursor)(BOOL bShow) = []()->void(WINAPI*)(BOOL) { + HMODULE lib = LoadLibrary(L"user32.dll"); + if (!lib) { + return nullptr; + } + + return (void(WINAPI*)(BOOL))GetProcAddress(lib, "ShowSystemCursor"); + }(); + + if (showSystemCursor) { + showSystemCursor((BOOL)show); + } else { + // 获取 ShowSystemCursor 失败则回落到 Magnification API + static bool initialized = []() { + if (!MagInitialize()) { + Logger::Get().Win32Error("MagInitialize 失败"); + return false; + } + + return true; + }(); + + if (initialized) { + MagShowSystemCursor(show); + } + } + + _cursorVisibilityChangedEvent(show); +} + void CursorManager::_AdjustCursorSpeed() noexcept { if (!SystemParametersInfo(SPI_GETMOUSESPEED, 0, &_originCursorSpeed, 0)) { Logger::Get().Win32Error("获取光标移速失败"); @@ -372,55 +403,6 @@ void CursorManager::_UpdateCursorClip() noexcept { } } -static void ShowSystemCursor(bool show) noexcept { - static void (WINAPI* const showSystemCursor)(BOOL bShow) = []()->void(WINAPI*)(BOOL) { - HMODULE lib = LoadLibrary(L"user32.dll"); - if (!lib) { - return nullptr; - } - - return (void(WINAPI*)(BOOL))GetProcAddress(lib, "ShowSystemCursor"); - }(); - - if (showSystemCursor) { - showSystemCursor((BOOL)show); - } else { - // 获取 ShowSystemCursor 失败则回落到 Magnification API - static bool initialized = []() { - if (!MagInitialize()) { - Logger::Get().Win32Error("MagInitialize 失败"); - return false; - } - - return true; - }(); - - if (initialized) { - MagShowSystemCursor(show); - } - } - - if (show) { - /*MagApp::Get().Dispatcher().TryEnqueue([]() { - if (!MagApp::Get().Get_hwndScaling()) { - return; - } - - // 修复有时不会立即显示光标的问题 - FrameSourceBase& frameSource = MagApp::Get().GetFrameSource(); - if (frameSource.GetName() == GraphicsCaptureFrameSource::NAME) { - GraphicsCaptureFrameSource& wgc = (GraphicsCaptureFrameSource&)frameSource; - // WGC 需要重启捕获 - // 没有用户报告这个问题,只在我的电脑上出现,可能和驱动有关 - wgc.StopCapture(); - wgc.StartCapture(); - } else { - SystemParametersInfo(SPI_SETCURSORS, 0, 0, 0); - } - });*/ - } -} - void CursorManager::_StartCapture(POINT cursorPos) noexcept { if (_isUnderCapture) { return; @@ -437,7 +419,7 @@ void CursorManager::_StartCapture(POINT cursorPos) noexcept { // 在有黑边的情况下自动将光标调整到画面内 // 全局隐藏光标 - ShowSystemCursor(false); + _ShowSystemCursor(false); SIZE srcFrameSize = Win32Utils::GetSizeOfRect(_srcRect); SIZE outputSize = Win32Utils::GetSizeOfRect(_destRect); @@ -488,7 +470,7 @@ void CursorManager::_StopCapture(POINT cursorPos, bool onDestroy) noexcept { SystemParametersInfo(SPI_SETMOUSESPEED, 0, (PVOID)(intptr_t)_originCursorSpeed, 0); } - ShowSystemCursor(true); + _ShowSystemCursor(true); _isUnderCapture = false; } else { // 目标位置不存在屏幕,则将光标限制在源窗口内 diff --git a/src/Magpie.Core/CursorManager.h b/src/Magpie.Core/CursorManager.h index 29a6f2749..f0d7321e8 100644 --- a/src/Magpie.Core/CursorManager.h +++ b/src/Magpie.Core/CursorManager.h @@ -1,4 +1,5 @@ #pragma once +#include "WinRTUtils.h" namespace Magpie::Core { @@ -23,7 +24,24 @@ class CursorManager { void Update() noexcept; + winrt::event_token CursorVisibilityChanged(winrt::delegate const& handler) { + return _cursorVisibilityChangedEvent.add(handler); + } + + WinRTUtils::EventRevoker CursorVisibilityChanged(winrt::auto_revoke_t, winrt::delegate const& handler) { + winrt::event_token token = CursorVisibilityChanged(handler); + return WinRTUtils::EventRevoker([this, token]() { + CursorVisibilityChanged(token); + }); + } + + void CursorVisibilityChanged(winrt::event_token const& token) { + _cursorVisibilityChangedEvent.remove(token); + } + private: + void _ShowSystemCursor(bool show); + void _AdjustCursorSpeed() noexcept; void _UpdateCursorClip() noexcept; @@ -41,6 +59,8 @@ class CursorManager { RECT _scalingWndRect; RECT _destRect; + winrt::event> _cursorVisibilityChangedEvent; + // 当前帧的光标,光标不可见则为 NULL HCURSOR _curCursor = NULL; POINT _curCursorPos{ std::numeric_limits::max(), std::numeric_limits::max() }; diff --git a/src/Magpie.Core/FrameSourceBase.h b/src/Magpie.Core/FrameSourceBase.h index cb48c1b01..436d4a682 100644 --- a/src/Magpie.Core/FrameSourceBase.h +++ b/src/Magpie.Core/FrameSourceBase.h @@ -35,7 +35,9 @@ class FrameSourceBase { virtual const char* Name() const noexcept = 0; - virtual bool IsScreenCapture() = 0; + virtual bool IsScreenCapture() const noexcept = 0; + + virtual void OnCursorVisibilityChanged(bool /*isVisible*/) noexcept {}; protected: virtual bool _HasRoundCornerInWin11() noexcept = 0; diff --git a/src/Magpie.Core/GraphicsCaptureFrameSource.cpp b/src/Magpie.Core/GraphicsCaptureFrameSource.cpp index 260980f00..13ec7394a 100644 --- a/src/Magpie.Core/GraphicsCaptureFrameSource.cpp +++ b/src/Magpie.Core/GraphicsCaptureFrameSource.cpp @@ -84,7 +84,7 @@ bool GraphicsCaptureFrameSource::Initialize(HWND hwndSrc, HWND hwndScaling, cons return false; } - if (!StartCapture()) { + if (!_StartCapture()) { Logger::Get().Error("_StartCapture 失败"); return false; } @@ -127,6 +127,14 @@ FrameSourceBase::UpdateState GraphicsCaptureFrameSource::Update() noexcept { return UpdateState::NewFrame; } +void GraphicsCaptureFrameSource::OnCursorVisibilityChanged(bool isVisible) noexcept { + // 显示光标时必须重启捕获 + /*if (isVisible) { + _StopCapture(); + _StartCapture(); + }*/ +} + bool GraphicsCaptureFrameSource::_CaptureWindow(IGraphicsCaptureItemInterop* interop) noexcept { // 包含边框的窗口尺寸 RECT srcFrameBounds{}; @@ -334,7 +342,7 @@ bool GraphicsCaptureFrameSource::_CaptureMonitor( return true; } -bool GraphicsCaptureFrameSource::StartCapture() { +bool GraphicsCaptureFrameSource::_StartCapture() noexcept { if (_captureSession) { return true; } @@ -383,7 +391,7 @@ bool GraphicsCaptureFrameSource::StartCapture() { return true; } -void GraphicsCaptureFrameSource::StopCapture() { +void GraphicsCaptureFrameSource::_StopCapture() noexcept { if (_captureSession) { _captureSession.Close(); _captureSession = nullptr; @@ -395,7 +403,7 @@ void GraphicsCaptureFrameSource::StopCapture() { } GraphicsCaptureFrameSource::~GraphicsCaptureFrameSource() { - StopCapture(); + _StopCapture(); if (_taskbarList) { _taskbarList->DeleteTab(_hwndSrc); diff --git a/src/Magpie.Core/GraphicsCaptureFrameSource.h b/src/Magpie.Core/GraphicsCaptureFrameSource.h index d0e4cb21b..3165bd216 100644 --- a/src/Magpie.Core/GraphicsCaptureFrameSource.h +++ b/src/Magpie.Core/GraphicsCaptureFrameSource.h @@ -16,19 +16,15 @@ class GraphicsCaptureFrameSource : public FrameSourceBase { UpdateState Update() noexcept override; - bool IsScreenCapture() override { + bool IsScreenCapture() const noexcept override { return _isScreenCapture; } const char* Name() const noexcept override { - return NAME; + return "Graphics Capture"; } - bool StartCapture(); - - void StopCapture(); - - static constexpr const char* NAME = "Graphics Capture"; + void OnCursorVisibilityChanged(bool isVisible) noexcept override; protected: bool _HasRoundCornerInWin11() noexcept override { @@ -40,6 +36,10 @@ class GraphicsCaptureFrameSource : public FrameSourceBase { } private: + bool _StartCapture() noexcept; + + void _StopCapture() noexcept; + bool _CaptureWindow(IGraphicsCaptureItemInterop* interop) noexcept; bool _CaptureMonitor(IGraphicsCaptureItemInterop* interop, const ScalingOptions& options, HWND hwndScaling) noexcept; diff --git a/src/Magpie.Core/Renderer.cpp b/src/Magpie.Core/Renderer.cpp index 49304c0c2..23dae1321 100644 --- a/src/Magpie.Core/Renderer.cpp +++ b/src/Magpie.Core/Renderer.cpp @@ -96,6 +96,12 @@ static bool CheckMultiplaneOverlaySupport(IDXGISwapChain4* swapChain) noexcept { return output2->SupportsOverlays(); } +void Renderer::OnCursorVisibilityChanged(bool isVisible) { + _backendThreadDqc.DispatcherQueue().TryEnqueue([this, isVisible]() { + _frameSource->OnCursorVisibilityChanged(isVisible); + }); +} + bool Renderer::_CreateSwapChain() noexcept { DXGI_SWAP_CHAIN_DESC1 sd{}; sd.Width = _scalingWndSize.cx; diff --git a/src/Magpie.Core/Renderer.h b/src/Magpie.Core/Renderer.h index 4bd50d79a..996de0c32 100644 --- a/src/Magpie.Core/Renderer.h +++ b/src/Magpie.Core/Renderer.h @@ -29,6 +29,8 @@ class Renderer { return _destRect; } + void OnCursorVisibilityChanged(bool isVisible); + private: bool _CreateSwapChain() noexcept; diff --git a/src/Magpie.Core/ScalingWindow.cpp b/src/Magpie.Core/ScalingWindow.cpp index 2bad9b7dc..46a1ae099 100644 --- a/src/Magpie.Core/ScalingWindow.cpp +++ b/src/Magpie.Core/ScalingWindow.cpp @@ -179,6 +179,10 @@ bool ScalingWindow::Create(HINSTANCE hInstance, HWND hwndSrc, ScalingOptions&& o return false; } + _cursorManager->CursorVisibilityChanged([this](bool isVisible) { + _renderer->OnCursorVisibilityChanged(isVisible); + }); + ShowWindow(_hWnd, SW_SHOWMAXIMIZED); return true; From 607ff8896564a33f4df1d48edddf9c4f6ca40afb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=97=AD?= <34770031+Blinue@users.noreply.github.com> Date: Fri, 16 Jun 2023 22:19:10 +0800 Subject: [PATCH 034/155] =?UTF-8?q?chore:=20=E4=BF=AE=E5=A4=8D=E7=BC=96?= =?UTF-8?q?=E8=AF=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Magpie.Core/GraphicsCaptureFrameSource.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Magpie.Core/GraphicsCaptureFrameSource.cpp b/src/Magpie.Core/GraphicsCaptureFrameSource.cpp index 13ec7394a..a0d15aa36 100644 --- a/src/Magpie.Core/GraphicsCaptureFrameSource.cpp +++ b/src/Magpie.Core/GraphicsCaptureFrameSource.cpp @@ -129,10 +129,10 @@ FrameSourceBase::UpdateState GraphicsCaptureFrameSource::Update() noexcept { void GraphicsCaptureFrameSource::OnCursorVisibilityChanged(bool isVisible) noexcept { // 显示光标时必须重启捕获 - /*if (isVisible) { + if (isVisible) { _StopCapture(); _StartCapture(); - }*/ + } } bool GraphicsCaptureFrameSource::_CaptureWindow(IGraphicsCaptureItemInterop* interop) noexcept { From bced075fa074885b1bbe70dda37bd20fc04c3042 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=97=AD?= <34770031+Blinue@users.noreply.github.com> Date: Sun, 18 Jun 2023 10:58:40 +0800 Subject: [PATCH 035/155] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=20CursorDraw?= =?UTF-8?q?er?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Magpie.Core/CursorDrawer.cpp | 311 ++++++++++++++++++ src/Magpie.Core/CursorDrawer.h | 62 ++++ src/Magpie.Core/CursorManager.cpp | 34 +- src/Magpie.Core/CursorManager.h | 17 +- src/Magpie.Core/Magpie.Core.vcxproj | 19 ++ src/Magpie.Core/Magpie.Core.vcxproj.filters | 13 + src/Magpie.Core/Renderer.cpp | 75 +++-- src/Magpie.Core/Renderer.h | 10 +- src/Magpie.Core/ScalingWindow.cpp | 40 +-- src/Magpie.Core/shaders/.gitignore | 1 + .../shaders/SimplePixelShader.hlsl | 6 + .../shaders/SimpleVertexShader.hlsl | 9 + src/Shared/Win32Utils.h | 4 + 13 files changed, 527 insertions(+), 74 deletions(-) create mode 100644 src/Magpie.Core/CursorDrawer.cpp create mode 100644 src/Magpie.Core/CursorDrawer.h create mode 100644 src/Magpie.Core/shaders/.gitignore create mode 100644 src/Magpie.Core/shaders/SimplePixelShader.hlsl create mode 100644 src/Magpie.Core/shaders/SimpleVertexShader.hlsl diff --git a/src/Magpie.Core/CursorDrawer.cpp b/src/Magpie.Core/CursorDrawer.cpp new file mode 100644 index 000000000..ce6e662c6 --- /dev/null +++ b/src/Magpie.Core/CursorDrawer.cpp @@ -0,0 +1,311 @@ +#include "pch.h" +#include "CursorDrawer.h" +#include "DeviceResources.h" +#include "Logger.h" +#include "Utils.h" +#include "DirectXHelper.h" +#include "ScalingOptions.h" +#include "shaders/SimpleVertexShader.h" +#include "shaders/SimplePixelShader.h" +#include + +using namespace DirectX; + +namespace Magpie::Core { + +struct VertexPositionTexture { + VertexPositionTexture() = default; + + VertexPositionTexture(const VertexPositionTexture&) = default; + VertexPositionTexture& operator=(const VertexPositionTexture&) = default; + + VertexPositionTexture(VertexPositionTexture&&) = default; + VertexPositionTexture& operator=(VertexPositionTexture&&) = default; + + VertexPositionTexture(XMFLOAT3 const& iposition, XMFLOAT2 const& itextureCoordinate) noexcept + : position(iposition), textureCoordinate(itextureCoordinate) { + } + + VertexPositionTexture(FXMVECTOR iposition, FXMVECTOR itextureCoordinate) noexcept { + XMStoreFloat3(&this->position, iposition); + XMStoreFloat2(&this->textureCoordinate, itextureCoordinate); + } + + XMFLOAT3 position; + XMFLOAT2 textureCoordinate; + + static constexpr unsigned int InputElementCount = 2; + static constexpr D3D11_INPUT_ELEMENT_DESC InputElements[InputElementCount] = + { + { "SV_Position", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 }, + { "TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 }, + }; +}; + +bool CursorDrawer::Initialize( + DeviceResources& deviceResources, + ID3D11Texture2D* backBuffer, + const RECT& viewportRect, + const ScalingOptions& options +) noexcept { + _deviceResources = &deviceResources; + _backBuffer = backBuffer; + _viewportRect = viewportRect; + _cursorScaling = options.cursorScaling; + _interpolationMode = options.cursorInterpolationMode; + + ID3D11Device* d3dDevice = deviceResources.GetD3DDevice(); + + HRESULT hr = d3dDevice->CreateVertexShader( + SimpleVertexShader, std::size(SimpleVertexShader), nullptr, _simpleVS.put()); + if (FAILED(hr)) { + Logger::Get().ComError("创建 SimpleVS 失败", hr); + return false; + } + + hr = d3dDevice->CreateInputLayout( + VertexPositionTexture::InputElements, + VertexPositionTexture::InputElementCount, + SimpleVertexShader, + std::size(SimpleVertexShader), + _simpleIL.put() + ); + if (FAILED(hr)) { + Logger::Get().ComError("创建 SimpleVS 输入布局失败", hr); + return false; + } + + D3D11_BUFFER_DESC bd{}; + bd.Usage = D3D11_USAGE_DYNAMIC; + bd.ByteWidth = sizeof(VertexPositionTexture) * 4; + bd.BindFlags = D3D11_BIND_VERTEX_BUFFER; + bd.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; + + hr = d3dDevice->CreateBuffer(&bd, nullptr, _vtxBuffer.put()); + if (FAILED(hr)) { + Logger::Get().ComError("创建顶点缓冲区失败", hr); + return false; + } + + return true; +} + +void CursorDrawer::Draw(HCURSOR hCursor, POINT cursorPos, ID3D11DeviceContext* d3dDC) noexcept { + if (!hCursor) { + return; + } + + const _CursorInfo* ci = _ResolveCursor(hCursor); + if (!ci) { + return; + } + + const SIZE cursorSize = { lroundf(ci->size.cx * _cursorScaling), lroundf(ci->size.cy * _cursorScaling) }; + const POINT cursorTopLeft = { + lroundf(cursorPos.x - ci->hotSpot.x * _cursorScaling), + lroundf(cursorPos.y - ci->hotSpot.y * _cursorScaling) + }; + + if (cursorTopLeft.x + cursorSize.cx <= _viewportRect.left || + cursorTopLeft.y + cursorSize.cy <= _viewportRect.top || + cursorTopLeft.x >= _viewportRect.right || + cursorTopLeft.y >= _viewportRect.bottom + ) { + // 光标在窗口外,不应发生这种情况 + return; + } + + float left = (cursorTopLeft.x - _viewportRect.left) / float(_viewportRect.right - _viewportRect.left) * 2 - 1.0f; + float top = 1.0f - (cursorTopLeft.y - _viewportRect.top) / float(_viewportRect.bottom - _viewportRect.top) * 2; + float right = left + cursorSize.cx / float(_viewportRect.right - _viewportRect.left) * 2; + float bottom = top - cursorSize.cy / float(_viewportRect.bottom - _viewportRect.top) * 2; + + d3dDC->IASetInputLayout(_simpleIL.get()); + d3dDC->VSSetShader(_simpleVS.get(), nullptr, 0); + + if (ci->type == _CursorType::Color) { + D3D11_MAPPED_SUBRESOURCE ms; + HRESULT hr = d3dDC->Map(_vtxBuffer.get(), 0, D3D11_MAP_WRITE_DISCARD, 0, &ms); + if (FAILED(hr)) { + Logger::Get().ComError("Map 失败", hr); + return; + } + + VertexPositionTexture* data = (VertexPositionTexture*)ms.pData; + data[0] = { XMFLOAT3(left, top, 0.5f), XMFLOAT2(0.0f, 0.0f) }; + data[1] = { XMFLOAT3(right, top, 0.5f), XMFLOAT2(1.0f, 0.0f) }; + data[2] = { XMFLOAT3(left, bottom, 0.5f), XMFLOAT2(0.0f, 1.0f) }; + data[3] = { XMFLOAT3(right, bottom, 0.5f), XMFLOAT2(1.0f, 1.0f) }; + + d3dDC->Unmap(_vtxBuffer.get(), 0); + + { + ID3D11Buffer* vtxBuffer = _vtxBuffer.get(); + UINT stride = sizeof(VertexPositionTexture); + UINT offset = 0; + d3dDC->IASetVertexBuffers(0, 1, &vtxBuffer, &stride, &offset); + } + } +} + +const CursorDrawer::_CursorInfo* CursorDrawer::_ResolveCursor(HCURSOR hCursor) noexcept { + auto it = _cursorInfos.find(hCursor); + if (it != _cursorInfos.end()) { + return &it->second; + } + + ICONINFO ii{}; + if (!GetIconInfo(hCursor, &ii)) { + Logger::Get().Win32Error("GetIconInfo 失败"); + return nullptr; + } + + Utils::ScopeExit se([&ii]() { + if (ii.hbmColor) { + DeleteBitmap(ii.hbmColor); + } + DeleteBitmap(ii.hbmMask); + }); + + BITMAP bmp{}; + if (!GetObject(ii.hbmMask, sizeof(bmp), &bmp)) { + Logger::Get().Win32Error("GetObject 失败"); + return nullptr; + } + + _CursorInfo& ci = _cursorInfos[hCursor]; + + ci.hotSpot = { (LONG)ii.xHotspot, (LONG)ii.yHotspot }; + // 单色光标的 hbmMask 高度为实际高度的两倍 + ci.size = { bmp.bmWidth, ii.hbmColor ? bmp.bmHeight : bmp.bmHeight / 2 }; + + BITMAPINFO bi{}; + bi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); + bi.bmiHeader.biWidth = bmp.bmWidth; + bi.bmiHeader.biHeight = -bmp.bmHeight; + bi.bmiHeader.biPlanes = 1; + bi.bmiHeader.biCompression = BI_RGB; + bi.bmiHeader.biBitCount = 32; + bi.bmiHeader.biSizeImage = bmp.bmWidth * bmp.bmHeight * 4; + + if (ii.hbmColor == NULL) { + // 单色光标 + ci.type = _CursorType::Monochrome; + + std::unique_ptr pixels(new BYTE[bi.bmiHeader.biSizeImage]); + HDC hdc = GetDC(NULL); + if (GetDIBits(hdc, ii.hbmMask, 0, bmp.bmHeight, pixels.get(), &bi, DIB_RGB_COLORS) != bmp.bmHeight) { + Logger::Get().Win32Error("GetDIBits 失败"); + ReleaseDC(NULL, hdc); + return nullptr; + } + ReleaseDC(NULL, hdc); + + // 红色通道是 AND 掩码,绿色通道是 XOR 掩码 + // 这里将下半部分的 XOR 掩码复制到上半部分的绿色通道中 + const int halfSize = bi.bmiHeader.biSizeImage / 8; + BYTE* upPtr = &pixels[1]; + BYTE* downPtr = &pixels[static_cast(halfSize) * 4]; + for (int i = 0; i < halfSize; ++i) { + *upPtr = *downPtr; + + upPtr += 4; + downPtr += 4; + } + + D3D11_SUBRESOURCE_DATA initData{}; + initData.pSysMem = pixels.get(); + initData.SysMemPitch = bmp.bmWidth * 4; + + ci.texture = DirectXHelper::CreateTexture2D( + _deviceResources->GetD3DDevice(), + DXGI_FORMAT_R8G8B8A8_UNORM, + bmp.bmWidth, + bmp.bmHeight / 2, + D3D11_BIND_SHADER_RESOURCE, + D3D11_USAGE_IMMUTABLE, + 0, + &initData + ); + if (!ci.texture) { + Logger::Get().Error("创建纹理失败"); + return nullptr; + } + + return &ci; + } + + std::unique_ptr pixels(new BYTE[bi.bmiHeader.biSizeImage]); + HDC hdc = GetDC(NULL); + if (GetDIBits(hdc, ii.hbmColor, 0, bmp.bmHeight, pixels.get(), &bi, DIB_RGB_COLORS) != bmp.bmHeight) { + Logger::Get().Win32Error("GetDIBits 失败"); + ReleaseDC(NULL, hdc); + return nullptr; + } + ReleaseDC(NULL, hdc); + + // 若颜色掩码有 A 通道,则是彩色光标,否则是彩色掩码光标 + bool hasAlpha = false; + for (uint32_t i = 3; i < bi.bmiHeader.biSizeImage; i += 4) { + if (pixels[i] != 0) { + hasAlpha = true; + break; + } + } + + if (hasAlpha) { + // 彩色光标 + ci.type = _CursorType::Color; + + for (size_t i = 0; i < bi.bmiHeader.biSizeImage; i += 4) { + // 预乘 Alpha 通道 + double alpha = pixels[i + 3] / 255.0f; + + BYTE b = (BYTE)std::lround(pixels[i] * alpha); + pixels[i] = (BYTE)std::lround(pixels[i + 2] * alpha); + pixels[i + 1] = (BYTE)std::lround(pixels[i + 1] * alpha); + pixels[i + 2] = b; + } + } else { + // 彩色掩码光标 + ci.type = _CursorType::MaskedColor; + + std::unique_ptr maskPixels(new BYTE[bi.bmiHeader.biSizeImage]); + hdc = GetDC(NULL); + if (GetDIBits(hdc, ii.hbmMask, 0, bmp.bmHeight, maskPixels.get(), &bi, DIB_RGB_COLORS) != bmp.bmHeight) { + Logger::Get().Win32Error("GetDIBits 失败"); + ReleaseDC(NULL, hdc); + return nullptr; + } + ReleaseDC(NULL, hdc); + + // 将 XOR 掩码复制到透明通道中 + for (size_t i = 0; i < bi.bmiHeader.biSizeImage; i += 4) { + std::swap(pixels[i], pixels[i + 2]); + pixels[i + 3] = maskPixels[i]; + } + } + + D3D11_SUBRESOURCE_DATA initData{}; + initData.pSysMem = &pixels[0]; + initData.SysMemPitch = bmp.bmWidth * 4; + + ci.texture = DirectXHelper::CreateTexture2D( + _deviceResources->GetD3DDevice(), + DXGI_FORMAT_R8G8B8A8_UNORM, + bmp.bmWidth, + bmp.bmHeight, + D3D11_BIND_SHADER_RESOURCE, + D3D11_USAGE_IMMUTABLE, + 0, + &initData + ); + if (!ci.texture) { + Logger::Get().Error("创建纹理失败"); + return nullptr; + } + + return &ci; +} + +} diff --git a/src/Magpie.Core/CursorDrawer.h b/src/Magpie.Core/CursorDrawer.h new file mode 100644 index 000000000..18dc82dc6 --- /dev/null +++ b/src/Magpie.Core/CursorDrawer.h @@ -0,0 +1,62 @@ +#pragma once +#include +#include "ScalingOptions.h" + +namespace Magpie::Core { + +class DeviceResources; + +class CursorDrawer { +public: + CursorDrawer() noexcept = default; + CursorDrawer(const CursorDrawer&) = delete; + CursorDrawer(CursorDrawer&&) = delete; + + bool Initialize( + DeviceResources& deviceResources, + ID3D11Texture2D* backBuffer, + const RECT& viewportRect, + const ScalingOptions& options + ) noexcept; + + void Draw(HCURSOR hCursor, POINT cursorPos, ID3D11DeviceContext* d3dDC) noexcept; + +private: + enum class _CursorType { + // 彩色光标,此时纹理中 RGB 通道已预乘 A 通道(premultiplied alpha),A 通道已预先取反 + // 这是为了减少着色器的计算量以及确保(可能进行的)双线性差值的准确性 + // 计算公式:FinalColor = ScreenColor * (1 - CursorColor.a) + CursorColor + Color = 0, + // 彩色掩码光标,此时 A 通道可能为 0 或 255 + // 为 0 时表示 RGB 通道取代屏幕颜色,为 255 时表示 RGB 通道和屏幕颜色进行异或操作 + MaskedColor, + // 单色光标,此时 R 通道为 AND 掩码,G 通道为 XOR 掩码,其他通道不使用 + // RG 通道的值只能是 0 或 255 + Monochrome + }; + + struct _CursorInfo { + POINT hotSpot{}; + SIZE size{}; + winrt::com_ptr texture = nullptr; + _CursorType type = _CursorType::Color; + }; + + const _CursorInfo* _ResolveCursor(HCURSOR hCursor) noexcept; + + DeviceResources* _deviceResources = nullptr; + ID3D11Texture2D* _backBuffer = nullptr; + + RECT _viewportRect{}; + + float _cursorScaling = 1.0f; + CursorInterpolationMode _interpolationMode = CursorInterpolationMode::NearestNeighbor; + + phmap::flat_hash_map _cursorInfos; + + winrt::com_ptr _simpleVS; + winrt::com_ptr _simpleIL; + winrt::com_ptr _vtxBuffer; +}; + +} diff --git a/src/Magpie.Core/CursorManager.cpp b/src/Magpie.Core/CursorManager.cpp index 28369cd92..cc28b3cca 100644 --- a/src/Magpie.Core/CursorManager.cpp +++ b/src/Magpie.Core/CursorManager.cpp @@ -40,12 +40,43 @@ bool CursorManager::Initialize( _isAdjustCursorSpeed = options.IsAdjustCursorSpeed(); _isDebugMode = options.IsDebugMode(); _is3DGameMode = options.Is3DGameMode(); + _isDrawCursor = options.IsDrawCursor(); return true; } -void CursorManager::Update() noexcept { +std::pair CursorManager::Update() noexcept { _UpdateCursorClip(); + + std::pair result{NULL, + { std::numeric_limits::max(), std::numeric_limits::max() }}; + + if (!_isDrawCursor || !_isUnderCapture) { + // 不绘制光标 + return result; + } + + if (_is3DGameMode) { + HWND hwndFore = GetForegroundWindow(); + if (hwndFore != _hwndScaling && hwndFore != _hwndSrc) { + return result; + } + } + + CURSORINFO ci{ sizeof(CURSORINFO) }; + if (!GetCursorInfo(&ci)) { + Logger::Get().Win32Error("GetCursorPos 失败"); + return result; + } + + if (ci.hCursor && ci.flags != CURSOR_SHOWING) { + return result; + } + + result.first = ci.hCursor; + result.second = _SrcToScaling(ci.ptScreenPos, false); + + return result; } void CursorManager::_ShowSystemCursor(bool show) { @@ -212,7 +243,6 @@ void CursorManager::_UpdateCursorClip() noexcept { const SIZE srcSize = Win32Utils::GetSizeOfRect(_srcRect); const SIZE destSize = Win32Utils::GetSizeOfRect(_destRect); - INT_PTR style = GetWindowLongPtr(_hwndScaling, GWL_EXSTYLE); POINT cursorPos; diff --git a/src/Magpie.Core/CursorManager.h b/src/Magpie.Core/CursorManager.h index f0d7321e8..e9e3a0846 100644 --- a/src/Magpie.Core/CursorManager.h +++ b/src/Magpie.Core/CursorManager.h @@ -22,7 +22,7 @@ class CursorManager { const ScalingOptions& options ) noexcept; - void Update() noexcept; + std::pair Update() noexcept; winrt::event_token CursorVisibilityChanged(winrt::delegate const& handler) { return _cursorVisibilityChangedEvent.add(handler); @@ -53,18 +53,14 @@ class CursorManager { POINT _SrcToScaling(POINT pt, bool screenCoord) noexcept; POINT _ScalingToSrc(POINT pt) noexcept; - HWND _hwndSrc; - HWND _hwndScaling; - RECT _srcRect; - RECT _scalingWndRect; - RECT _destRect; + HWND _hwndSrc = NULL; + HWND _hwndScaling = NULL; + RECT _srcRect{}; + RECT _scalingWndRect{}; + RECT _destRect{}; winrt::event> _cursorVisibilityChangedEvent; - // 当前帧的光标,光标不可见则为 NULL - HCURSOR _curCursor = NULL; - POINT _curCursorPos{ std::numeric_limits::max(), std::numeric_limits::max() }; - RECT _curClips{}; int _originCursorSpeed = 0; @@ -72,6 +68,7 @@ class CursorManager { bool _isAdjustCursorSpeed = false; bool _isDebugMode = false; bool _is3DGameMode = false; + bool _isDrawCursor = false; }; } diff --git a/src/Magpie.Core/Magpie.Core.vcxproj b/src/Magpie.Core/Magpie.Core.vcxproj index 74c73bc2e..252e95657 100644 --- a/src/Magpie.Core/Magpie.Core.vcxproj +++ b/src/Magpie.Core/Magpie.Core.vcxproj @@ -60,6 +60,15 @@ Windows true + + 5.0 + true + true + %(Filename) + %(RelativeDir)%(Filename).h + + + @@ -80,6 +89,7 @@ + @@ -108,6 +118,7 @@ + @@ -139,6 +150,14 @@ false + + + Pixel + + + Vertex + + diff --git a/src/Magpie.Core/Magpie.Core.vcxproj.filters b/src/Magpie.Core/Magpie.Core.vcxproj.filters index 793997e34..85449bb2f 100644 --- a/src/Magpie.Core/Magpie.Core.vcxproj.filters +++ b/src/Magpie.Core/Magpie.Core.vcxproj.filters @@ -20,6 +20,9 @@ {34fd6af4-f461-43ae-81e0-c663a89c2d2a} + + {1956ae10-07ad-4b77-a37f-25f7fe10654b} + @@ -73,6 +76,7 @@ + @@ -105,6 +109,7 @@ + @@ -117,4 +122,12 @@ + + + Shaders + + + Shaders + + \ No newline at end of file diff --git a/src/Magpie.Core/Renderer.cpp b/src/Magpie.Core/Renderer.cpp index 23dae1321..a6fe9dc55 100644 --- a/src/Magpie.Core/Renderer.cpp +++ b/src/Magpie.Core/Renderer.cpp @@ -31,9 +31,7 @@ bool Renderer::Initialize(HWND hwndSrc, HWND hwndScaling, const ScalingOptions& _hwndSrc = hwndSrc; _hwndScaling = hwndScaling; - RECT scalingWndRect; - GetWindowRect(_hwndScaling, &scalingWndRect); - _scalingWndSize = Win32Utils::GetSizeOfRect(scalingWndRect); + GetWindowRect(_hwndScaling, &_scalingWndRect); _backendThread = std::thread(std::bind(&Renderer::_BackendThreadProc, this, options)); @@ -71,11 +69,22 @@ bool Renderer::Initialize(HWND hwndSrc, HWND hwndScaling, const ScalingOptions& D3D11_TEXTURE2D_DESC desc; _frontendSharedTexture->GetDesc(&desc); - _destRect.left = scalingWndRect.left + (_scalingWndSize.cx - desc.Width) / 2; - _destRect.top = scalingWndRect.top + (_scalingWndSize.cy - desc.Height) / 2; + _destRect.left = (_scalingWndRect.left + _scalingWndRect.right - desc.Width) / 2; + _destRect.top = (_scalingWndRect.top + _scalingWndRect.bottom - desc.Height) / 2; _destRect.right = _destRect.left + desc.Width; _destRect.bottom = _destRect.top + desc.Height; + RECT viewportRect{ + _destRect.left - _scalingWndRect.left, + _destRect.top - _scalingWndRect.top, + _destRect.right - _scalingWndRect.left, + _destRect.bottom - _scalingWndRect.top + }; + if (!_cursorDrawer.Initialize(_frontendResources, _backBuffer.get(), viewportRect, options)) { + Logger::Get().ComError("初始化 CursorDrawer 失败", hr); + return false; + } + return true; } @@ -104,8 +113,8 @@ void Renderer::OnCursorVisibilityChanged(bool isVisible) { bool Renderer::_CreateSwapChain() noexcept { DXGI_SWAP_CHAIN_DESC1 sd{}; - sd.Width = _scalingWndSize.cx; - sd.Height = _scalingWndSize.cy; + sd.Width = _scalingWndRect.right - _scalingWndRect.left; + sd.Height = _scalingWndRect.bottom - _scalingWndRect.top; sd.Format = DXGI_FORMAT_R8G8B8A8_UNORM; sd.AlphaMode = DXGI_ALPHA_MODE_UNSPECIFIED; sd.SampleDesc.Count = 1; @@ -166,7 +175,8 @@ bool Renderer::_CreateSwapChain() noexcept { return true; } -void Renderer::Render() noexcept { +void Renderer::Render(HCURSOR hCursor, POINT cursorPos) noexcept { + // 有新帧或光标改变则渲染新的帧 if (_lastAccessMutexKey == _sharedTextureMutexKey) { if (_lastAccessMutexKey == 0) { // 第一帧尚未完成 @@ -174,29 +184,31 @@ void Renderer::Render() noexcept { } // 后端没有渲染新的帧,检查光标位置 - POINT cp; - GetCursorPos(&cp); - bool noMove = cp.x == _lastCursorPos.x && cp.y == _lastCursorPos.y; - _lastCursorPos = cp; - if (noMove) { + if (hCursor == _lastCursorHandle && cursorPos == _lastCursorPos) { // 光标没有移动 return; } } + _lastCursorHandle = hCursor; + _lastCursorPos = cursorPos; + WaitForSingleObjectEx(_frameLatencyWaitableObject.get(), 1000, TRUE); ID3D11DeviceContext4* d3dDC = _frontendResources.GetD3DDC(); d3dDC->ClearState(); - const SIZE destSize{ _destRect.right - _destRect.left, _destRect.bottom - _destRect.top }; + // 所有渲染都使用三角形带拓扑 + d3dDC->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP); + + ID3D11RenderTargetView* backBufferRtv = _frontendResources.GetRenderTargetView(_backBuffer.get()); + // 输出画面是否充满缩放窗口 - const bool isFill = destSize.cx == _scalingWndSize.cx && destSize.cy == _scalingWndSize.cy; + const bool isFill = _destRect == _scalingWndRect; if (!isFill) { // 以黑色填充背景,因为我们指定了 DXGI_SWAP_EFFECT_FLIP_DISCARD,同时也是为了和 RTSS 兼容 static constexpr FLOAT BLACK[4] = { 0.0f,0.0f,0.0f,1.0f }; - ID3D11RenderTargetView* backBufferRtv = _frontendResources.GetRenderTargetView(_backBuffer.get()); d3dDC->ClearRenderTargetView(backBufferRtv, BLACK); } @@ -209,19 +221,22 @@ void Renderer::Render() noexcept { if (isFill) { d3dDC->CopyResource(_backBuffer.get(), _frontendSharedTexture.get()); } else { - assert(destSize.cx <= _scalingWndSize.cx && destSize.cy <= _scalingWndSize.cy); - - const POINT destPos = { - (_scalingWndSize.cx - destSize.cx) / 2, - (_scalingWndSize.cy - destSize.cy) / 2 - }; - d3dDC->CopySubresourceRegion(_backBuffer.get(), 0, destPos.x, destPos.y, 0, - _frontendSharedTexture.get(), 0, nullptr); + d3dDC->CopySubresourceRegion( + _backBuffer.get(), + 0, + _destRect.left - _scalingWndRect.left, + _destRect.top-_scalingWndRect.top, + 0, + _frontendSharedTexture.get(), + 0, + nullptr + ); } _frontendSharedTextureMutex->ReleaseSync(_lastAccessMutexKey); - ID3D11RenderTargetView* backBufferRtv = _frontendResources.GetRenderTargetView(_backBuffer.get()); + // 绘制光标 + _cursorDrawer.Draw(hCursor, cursorPos, d3dDC); // 两个垂直同步之间允许渲染数帧,SyncInterval = 0 只呈现最新的一帧,旧帧被丢弃 _swapChain->Present(0, 0); @@ -334,6 +349,8 @@ ID3D11Texture2D* Renderer::_BuildEffects(const ScalingOptions& options) noexcept Logger::Get().Info(fmt::format("编译着色器总计用时 {} 毫秒", duration / 1000.0f)); } + const SIZE scalingWndSize = Win32Utils::GetSizeOfRect(_scalingWndRect); + _effectDrawers.resize(options.effects.size()); ID3D11Texture2D* inOutTexture = _frameSource->GetOutput(); @@ -342,7 +359,7 @@ ID3D11Texture2D* Renderer::_BuildEffects(const ScalingOptions& options) noexcept effectDescs[i], options.effects[i], _backendResources, - _scalingWndSize, + scalingWndSize, &inOutTexture )) { Logger::Get().Error(fmt::format("初始化效果#{} ({}) 失败", i, StrUtils::UTF16ToUTF8(options.effects[i].name))); @@ -353,7 +370,7 @@ ID3D11Texture2D* Renderer::_BuildEffects(const ScalingOptions& options) noexcept // 输出尺寸大于缩放窗口尺寸则需要降采样 D3D11_TEXTURE2D_DESC desc; inOutTexture->GetDesc(&desc); - if ((LONG)desc.Width > _scalingWndSize.cx || (LONG)desc.Height > _scalingWndSize.cy) { + if ((LONG)desc.Width > scalingWndSize.cx || (LONG)desc.Height > scalingWndSize.cy) { EffectOption bicubicOption; bicubicOption.name = L"Bicubic"; bicubicOption.parameters[L"paramB"] = 0.0f; @@ -373,7 +390,7 @@ ID3D11Texture2D* Renderer::_BuildEffects(const ScalingOptions& options) noexcept *bicubicDesc, bicubicOption, _backendResources, - _scalingWndSize, + scalingWndSize, &inOutTexture )) { Logger::Get().Error("初始化降采样效果失败"); @@ -395,7 +412,7 @@ HANDLE Renderer::_CreateSharedTexture(ID3D11Texture2D* effectsOutput) noexcept { DXGI_FORMAT_R8G8B8A8_UNORM, textureSize.cx, textureSize.cy, - 0, + D3D11_BIND_SHADER_RESOURCE, D3D11_USAGE_DEFAULT, D3D11_RESOURCE_MISC_SHARED_KEYEDMUTEX ); diff --git a/src/Magpie.Core/Renderer.h b/src/Magpie.Core/Renderer.h index 996de0c32..fc6ad2fc8 100644 --- a/src/Magpie.Core/Renderer.h +++ b/src/Magpie.Core/Renderer.h @@ -2,11 +2,11 @@ #include "DeviceResources.h" #include "EffectDrawer.h" #include "Win32Utils.h" +#include "CursorDrawer.h" namespace Magpie::Core { struct ScalingOptions; -class DeviceResources; class FrameSourceBase; class Renderer { @@ -19,7 +19,7 @@ class Renderer { bool Initialize(HWND hwndSrc, HWND hwndScaling, const ScalingOptions& options) noexcept; - void Render() noexcept; + void Render(HCURSOR hCursor, POINT cursorPos) noexcept; const RECT& SrcRect() const noexcept { return _srcRect; @@ -50,6 +50,10 @@ class Renderer { Win32Utils::ScopedHandle _frameLatencyWaitableObject; winrt::com_ptr _backBuffer; uint64_t _lastAccessMutexKey = 0; + + CursorDrawer _cursorDrawer; + + HCURSOR _lastCursorHandle = NULL; POINT _lastCursorPos{ std::numeric_limits::max(), std::numeric_limits::max() }; winrt::com_ptr _frontendSharedTexture; @@ -73,7 +77,7 @@ class Renderer { // 可由所有线程访问 HWND _hwndSrc = NULL; HWND _hwndScaling = NULL; - SIZE _scalingWndSize{}; + RECT _scalingWndRect{}; winrt::Windows::System::DispatcherQueueController _backendThreadDqc{ nullptr }; diff --git a/src/Magpie.Core/ScalingWindow.cpp b/src/Magpie.Core/ScalingWindow.cpp index 46a1ae099..518a3a05d 100644 --- a/src/Magpie.Core/ScalingWindow.cpp +++ b/src/Magpie.Core/ScalingWindow.cpp @@ -164,18 +164,21 @@ bool ScalingWindow::Create(HINSTANCE hInstance, HWND hwndSrc, ScalingOptions&& o if (!GetWindowRect(hwndSrc, &_srcWndRect)) { Logger::Get().Win32Error("GetWindowRect 失败"); + Destroy(); return false; } _renderer = std::make_unique(); if (!_renderer->Initialize(hwndSrc, _hWnd, _options)) { Logger::Get().Error("初始化 Renderer 失败"); + Destroy(); return false; } _cursorManager = std::make_unique(); if (!_cursorManager->Initialize(hwndSrc, _hWnd, _renderer->SrcRect(), wndRect, _renderer->DestRect(), options)) { Logger::Get().Error("初始化 CursorManager 失败"); + Destroy(); return false; } @@ -197,8 +200,8 @@ void ScalingWindow::Render() noexcept { return; } - _cursorManager->Update(); - _renderer->Render(); + std::pair cursorInfo = _cursorManager->Update(); + _renderer->Render(cursorInfo.first, cursorInfo.second); } LRESULT ScalingWindow::_MessageHandler(UINT msg, WPARAM wParam, LPARAM lParam) noexcept { @@ -259,34 +262,11 @@ bool ScalingWindow::_CheckForeground(HWND hwndForeground) const noexcept { } RECT rectForground{}; - - // 如果捕获模式可以捕获到弹窗,则允许小的弹窗 - /*if (MagApp::Get().GetFrameSource().IsScreenCapture() - && GetWindowStyle(hwndForeground) & (WS_POPUP | WS_CHILD) - ) { - if (!Win32Utils::GetWindowFrameRect(hwndForeground, rectForground)) { - Logger::Get().Error("GetWindowFrameRect 失败"); - return false; - } - - // 弹窗如果完全在源窗口客户区内则不退出全屏 - const RECT& srcFrameRect = MagApp::Get().GetFrameSource().GetSrcFrameRect(); - if (rectForground.left >= srcFrameRect.left - && rectForground.right <= srcFrameRect.right - && rectForground.top >= srcFrameRect.top - && rectForground.bottom <= srcFrameRect.bottom - ) { - return true; - } - }*/ - - if (rectForground == RECT{}) { - HRESULT hr = DwmGetWindowAttribute(hwndForeground, - DWMWA_EXTENDED_FRAME_BOUNDS, &rectForground, sizeof(rectForground)); - if (FAILED(hr)) { - Logger::Get().ComError("DwmGetWindowAttribute 失败", hr); - return false; - } + HRESULT hr = DwmGetWindowAttribute(hwndForeground, + DWMWA_EXTENDED_FRAME_BOUNDS, &rectForground, sizeof(rectForground)); + if (FAILED(hr)) { + Logger::Get().ComError("DwmGetWindowAttribute 失败", hr); + return false; } RECT scalingWndRect; diff --git a/src/Magpie.Core/shaders/.gitignore b/src/Magpie.Core/shaders/.gitignore new file mode 100644 index 000000000..424c745c1 --- /dev/null +++ b/src/Magpie.Core/shaders/.gitignore @@ -0,0 +1 @@ +*.h diff --git a/src/Magpie.Core/shaders/SimplePixelShader.hlsl b/src/Magpie.Core/shaders/SimplePixelShader.hlsl new file mode 100644 index 000000000..bd91e2ace --- /dev/null +++ b/src/Magpie.Core/shaders/SimplePixelShader.hlsl @@ -0,0 +1,6 @@ +Texture2D tex : register(t0); +SamplerState sam : register(s0); + +float4 main(float2 coord : TEXCOORD) : SV_Target { + return tex.Sample(sam, coord); +} diff --git a/src/Magpie.Core/shaders/SimpleVertexShader.hlsl b/src/Magpie.Core/shaders/SimpleVertexShader.hlsl new file mode 100644 index 000000000..1e00246ba --- /dev/null +++ b/src/Magpie.Core/shaders/SimpleVertexShader.hlsl @@ -0,0 +1,9 @@ +void main( + float4 pos : SV_POSITION, + float2 coord : TEXCOORD, + out float4 outPos : SV_POSITION, + out float2 outCoord : TEXCOORD +) { + outPos = pos; + outCoord = coord; +} diff --git a/src/Shared/Win32Utils.h b/src/Shared/Win32Utils.h index f145ae871..8d3d481a5 100644 --- a/src/Shared/Win32Utils.h +++ b/src/Shared/Win32Utils.h @@ -260,3 +260,7 @@ struct Win32Utils { constexpr bool operator==(const SIZE& l, const SIZE& r) noexcept { return l.cx == r.cx && l.cy == r.cy; } + +constexpr bool operator==(const POINT& l, const POINT& r) noexcept { + return l.x == r.x && l.y == r.y; +} From 4608dc7f6d621c416a2c08d7bf937689abddfac4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=97=AD?= <34770031+Blinue@users.noreply.github.com> Date: Sun, 18 Jun 2023 12:08:37 +0800 Subject: [PATCH 036/155] =?UTF-8?q?feat:=20=E5=AE=9E=E7=8E=B0=E5=BD=A9?= =?UTF-8?q?=E8=89=B2=E5=85=89=E6=A0=87=E7=BB=98=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Magpie.Core/CursorDrawer.cpp | 130 +++++++++++++++--- src/Magpie.Core/CursorDrawer.h | 10 +- src/Magpie.Core/EffectDrawer.cpp | 22 +-- src/Magpie.Core/EffectDrawer.h | 6 +- src/Magpie.Core/Renderer.cpp | 5 +- .../shaders/SimpleVertexShader.hlsl | 4 +- 6 files changed, 143 insertions(+), 34 deletions(-) diff --git a/src/Magpie.Core/CursorDrawer.cpp b/src/Magpie.Core/CursorDrawer.cpp index ce6e662c6..eae1ed701 100644 --- a/src/Magpie.Core/CursorDrawer.cpp +++ b/src/Magpie.Core/CursorDrawer.cpp @@ -59,7 +59,7 @@ bool CursorDrawer::Initialize( HRESULT hr = d3dDevice->CreateVertexShader( SimpleVertexShader, std::size(SimpleVertexShader), nullptr, _simpleVS.put()); if (FAILED(hr)) { - Logger::Get().ComError("创建 SimpleVS 失败", hr); + Logger::Get().ComError("创建顶点着色器失败", hr); return false; } @@ -71,7 +71,7 @@ bool CursorDrawer::Initialize( _simpleIL.put() ); if (FAILED(hr)) { - Logger::Get().ComError("创建 SimpleVS 输入布局失败", hr); + Logger::Get().ComError("创建输入布局失败", hr); return false; } @@ -90,7 +90,7 @@ bool CursorDrawer::Initialize( return true; } -void CursorDrawer::Draw(HCURSOR hCursor, POINT cursorPos, ID3D11DeviceContext* d3dDC) noexcept { +void CursorDrawer::Draw(HCURSOR hCursor, POINT cursorPos) noexcept { if (!hCursor) { return; } @@ -120,31 +120,72 @@ void CursorDrawer::Draw(HCURSOR hCursor, POINT cursorPos, ID3D11DeviceContext* d float right = left + cursorSize.cx / float(_viewportRect.right - _viewportRect.left) * 2; float bottom = top - cursorSize.cy / float(_viewportRect.bottom - _viewportRect.top) * 2; + ID3D11DeviceContext* d3dDC = _deviceResources->GetD3DDC(); d3dDC->IASetInputLayout(_simpleIL.get()); d3dDC->VSSetShader(_simpleVS.get(), nullptr, 0); if (ci->type == _CursorType::Color) { - D3D11_MAPPED_SUBRESOURCE ms; - HRESULT hr = d3dDC->Map(_vtxBuffer.get(), 0, D3D11_MAP_WRITE_DISCARD, 0, &ms); - if (FAILED(hr)) { - Logger::Get().ComError("Map 失败", hr); - return; - } + // 配置顶点缓冲区 + { + D3D11_MAPPED_SUBRESOURCE ms; + HRESULT hr = d3dDC->Map(_vtxBuffer.get(), 0, D3D11_MAP_WRITE_DISCARD, 0, &ms); + if (FAILED(hr)) { + Logger::Get().ComError("Map 失败", hr); + return; + } - VertexPositionTexture* data = (VertexPositionTexture*)ms.pData; - data[0] = { XMFLOAT3(left, top, 0.5f), XMFLOAT2(0.0f, 0.0f) }; - data[1] = { XMFLOAT3(right, top, 0.5f), XMFLOAT2(1.0f, 0.0f) }; - data[2] = { XMFLOAT3(left, bottom, 0.5f), XMFLOAT2(0.0f, 1.0f) }; - data[3] = { XMFLOAT3(right, bottom, 0.5f), XMFLOAT2(1.0f, 1.0f) }; + VertexPositionTexture* data = (VertexPositionTexture*)ms.pData; + data[0] = { XMFLOAT3(left, top, 0.5f), XMFLOAT2(0.0f, 0.0f) }; + data[1] = { XMFLOAT3(right, top, 0.5f), XMFLOAT2(1.0f, 0.0f) }; + data[2] = { XMFLOAT3(left, bottom, 0.5f), XMFLOAT2(0.0f, 1.0f) }; + data[3] = { XMFLOAT3(right, bottom, 0.5f), XMFLOAT2(1.0f, 1.0f) }; - d3dDC->Unmap(_vtxBuffer.get(), 0); + d3dDC->Unmap(_vtxBuffer.get(), 0); - { ID3D11Buffer* vtxBuffer = _vtxBuffer.get(); UINT stride = sizeof(VertexPositionTexture); UINT offset = 0; d3dDC->IASetVertexBuffers(0, 1, &vtxBuffer, &stride, &offset); } + + // 配置像素着色器 + if (!_SetSimplePS(ci->texture.get())) { + return; + } + + { + d3dDC->PSSetShader(_simplePS.get(), nullptr, 0); + d3dDC->PSSetConstantBuffers(0, 0, nullptr); + ID3D11ShaderResourceView* cursorSRV = _deviceResources->GetShaderResourceView(ci->texture.get()); + d3dDC->PSSetShaderResources(0, 1, &cursorSRV); + ID3D11SamplerState* cursorSampler = _deviceResources->GetSampler( + _interpolationMode == CursorInterpolationMode::NearestNeighbor + ? D3D11_FILTER_MIN_MAG_MIP_POINT + : D3D11_FILTER_MIN_MAG_MIP_LINEAR, + D3D11_TEXTURE_ADDRESS_CLAMP); + d3dDC->PSSetSamplers(0, 1, &cursorSampler); + } + + // 配置渲染目标和视口 + { + ID3D11RenderTargetView* rtv = _deviceResources->GetRenderTargetView(_backBuffer); + + d3dDC->OMSetRenderTargets(1, &rtv, nullptr); + D3D11_VIEWPORT vp{ + (float)_viewportRect.left, + (float)_viewportRect.top, + float(_viewportRect.right - _viewportRect.left), + float(_viewportRect.bottom - _viewportRect.top), + 0.0f, + 1.0f + }; + d3dDC->RSSetViewports(1, &vp); + } + + // 预乘 alpha + _SetPremultipliedAlphaBlend(true); + + d3dDC->Draw(4, 0); } } @@ -265,6 +306,7 @@ const CursorDrawer::_CursorInfo* CursorDrawer::_ResolveCursor(HCURSOR hCursor) n pixels[i] = (BYTE)std::lround(pixels[i + 2] * alpha); pixels[i + 1] = (BYTE)std::lround(pixels[i + 1] * alpha); pixels[i + 2] = b; + pixels[i + 3] = 255 - pixels[i + 3]; } } else { // 彩色掩码光标 @@ -308,4 +350,60 @@ const CursorDrawer::_CursorInfo* CursorDrawer::_ResolveCursor(HCURSOR hCursor) n return &ci; } +bool CursorDrawer::_SetSimplePS(ID3D11Texture2D* cursorTexture) noexcept { + if (!_simplePS) { + HRESULT hr = _deviceResources->GetD3DDevice()->CreatePixelShader( + SimplePixelShader, sizeof(SimplePixelShader), nullptr, _simplePS.put()); + if (FAILED(hr)) { + Logger::Get().ComError("创建像素着色器失败", hr); + return false; + } + } + + ID3D11DeviceContext* d3dDC = _deviceResources->GetD3DDC(); + d3dDC->PSSetShader(_simplePS.get(), nullptr, 0); + d3dDC->PSSetConstantBuffers(0, 0, nullptr); + ID3D11ShaderResourceView* cursorSRV = _deviceResources->GetShaderResourceView(cursorTexture); + d3dDC->PSSetShaderResources(0, 1, &cursorSRV); + ID3D11SamplerState* cursorSampler = _deviceResources->GetSampler( + _interpolationMode == CursorInterpolationMode::NearestNeighbor + ? D3D11_FILTER_MIN_MAG_MIP_POINT + : D3D11_FILTER_MIN_MAG_MIP_LINEAR, + D3D11_TEXTURE_ADDRESS_CLAMP); + d3dDC->PSSetSamplers(0, 1, &cursorSampler); + + return true; +} + +bool CursorDrawer::_SetPremultipliedAlphaBlend(bool enable) noexcept { + ID3D11DeviceContext* d3dDC = _deviceResources->GetD3DDC(); + + if (!enable) { + d3dDC->OMSetBlendState(nullptr, nullptr, 0xffffffff); + return true; + } + + if (!premultipliedAlphaBlendBlendState) { + // FinalColor = ScreenColor * CursorColor.a + CursorColor + D3D11_BLEND_DESC desc{}; + desc.RenderTarget[0].BlendEnable = TRUE; + desc.RenderTarget[0].SrcBlend = D3D11_BLEND_ONE; + desc.RenderTarget[0].SrcBlendAlpha = D3D11_BLEND_ONE; + desc.RenderTarget[0].DestBlend = D3D11_BLEND_SRC_ALPHA; + desc.RenderTarget[0].DestBlendAlpha = D3D11_BLEND_ZERO; + desc.RenderTarget[0].BlendOp = desc.RenderTarget[0].BlendOpAlpha = D3D11_BLEND_OP_ADD; + desc.RenderTarget[0].RenderTargetWriteMask = D3D11_COLOR_WRITE_ENABLE_ALL; + + HRESULT hr = _deviceResources->GetD3DDevice()->CreateBlendState( + &desc, premultipliedAlphaBlendBlendState.put()); + if (FAILED(hr)) { + Logger::Get().ComError("创建混合状态失败", hr); + return false; + } + } + + d3dDC->OMSetBlendState(premultipliedAlphaBlendBlendState.get(), nullptr, 0xffffffff); + return true; +} + } diff --git a/src/Magpie.Core/CursorDrawer.h b/src/Magpie.Core/CursorDrawer.h index 18dc82dc6..9014669d6 100644 --- a/src/Magpie.Core/CursorDrawer.h +++ b/src/Magpie.Core/CursorDrawer.h @@ -19,13 +19,13 @@ class CursorDrawer { const ScalingOptions& options ) noexcept; - void Draw(HCURSOR hCursor, POINT cursorPos, ID3D11DeviceContext* d3dDC) noexcept; + void Draw(HCURSOR hCursor, POINT cursorPos) noexcept; private: enum class _CursorType { // 彩色光标,此时纹理中 RGB 通道已预乘 A 通道(premultiplied alpha),A 通道已预先取反 // 这是为了减少着色器的计算量以及确保(可能进行的)双线性差值的准确性 - // 计算公式:FinalColor = ScreenColor * (1 - CursorColor.a) + CursorColor + // 计算公式:FinalColor = ScreenColor * CursorColor.a + CursorColor Color = 0, // 彩色掩码光标,此时 A 通道可能为 0 或 255 // 为 0 时表示 RGB 通道取代屏幕颜色,为 255 时表示 RGB 通道和屏幕颜色进行异或操作 @@ -44,6 +44,10 @@ class CursorDrawer { const _CursorInfo* _ResolveCursor(HCURSOR hCursor) noexcept; + bool _SetSimplePS(ID3D11Texture2D* cursorTexture) noexcept; + + bool _SetPremultipliedAlphaBlend(bool enable) noexcept; + DeviceResources* _deviceResources = nullptr; ID3D11Texture2D* _backBuffer = nullptr; @@ -57,6 +61,8 @@ class CursorDrawer { winrt::com_ptr _simpleVS; winrt::com_ptr _simpleIL; winrt::com_ptr _vtxBuffer; + winrt::com_ptr _simplePS; + winrt::com_ptr premultipliedAlphaBlendBlendState; }; } diff --git a/src/Magpie.Core/EffectDrawer.cpp b/src/Magpie.Core/EffectDrawer.cpp index 47248b6c9..5ed27be27 100644 --- a/src/Magpie.Core/EffectDrawer.cpp +++ b/src/Magpie.Core/EffectDrawer.cpp @@ -87,6 +87,8 @@ bool EffectDrawer::Initialize( SIZE scalingWndSize, ID3D11Texture2D** inOutTexture ) noexcept { + _d3dDC = deviceResources.GetD3DDC(); + SIZE inputSize{}; { D3D11_TEXTURE2D_DESC inputDesc; @@ -245,28 +247,28 @@ bool EffectDrawer::Initialize( return true; } -void EffectDrawer::Draw(ID3D11DeviceContext* d3dDC) const noexcept { +void EffectDrawer::Draw() const noexcept { { ID3D11Buffer* t = _constantBuffer.get(); - d3dDC->CSSetConstantBuffers(0, 1, &t); + _d3dDC->CSSetConstantBuffers(0, 1, &t); } - d3dDC->CSSetSamplers(0, (UINT)_samplers.size(), _samplers.data()); + _d3dDC->CSSetSamplers(0, (UINT)_samplers.size(), _samplers.data()); for (uint32_t i = 0; i < _dispatches.size(); ++i) { - _DrawPass(i, d3dDC); + _DrawPass(i); } } -void EffectDrawer::_DrawPass(uint32_t i, ID3D11DeviceContext* d3dDC) const noexcept { - d3dDC->CSSetShader(_shaders[i].get(), nullptr, 0); +void EffectDrawer::_DrawPass(uint32_t i) const noexcept { + _d3dDC->CSSetShader(_shaders[i].get(), nullptr, 0); - d3dDC->CSSetShaderResources(0, (UINT)_srvs[i].size(), _srvs[i].data()); + _d3dDC->CSSetShaderResources(0, (UINT)_srvs[i].size(), _srvs[i].data()); UINT uavCount = (UINT)_uavs[i].size() / 2; - d3dDC->CSSetUnorderedAccessViews(0, uavCount, _uavs[i].data(), nullptr); + _d3dDC->CSSetUnorderedAccessViews(0, uavCount, _uavs[i].data(), nullptr); - d3dDC->Dispatch(_dispatches[i].first, _dispatches[i].second, 1); + _d3dDC->Dispatch(_dispatches[i].first, _dispatches[i].second, 1); - d3dDC->CSSetUnorderedAccessViews(0, uavCount, _uavs[i].data() + uavCount, nullptr); + _d3dDC->CSSetUnorderedAccessViews(0, uavCount, _uavs[i].data() + uavCount, nullptr); } bool EffectDrawer::_InitializeConstants( diff --git a/src/Magpie.Core/EffectDrawer.h b/src/Magpie.Core/EffectDrawer.h index 2d6f6159c..faa0a76f5 100644 --- a/src/Magpie.Core/EffectDrawer.h +++ b/src/Magpie.Core/EffectDrawer.h @@ -22,7 +22,7 @@ class EffectDrawer { ID3D11Texture2D** inOutTexture ) noexcept; - void Draw(ID3D11DeviceContext* d3dDC) const noexcept; + void Draw() const noexcept; private: bool _InitializeConstants( @@ -33,7 +33,9 @@ class EffectDrawer { SIZE outputSize ) noexcept; - void _DrawPass(uint32_t i, ID3D11DeviceContext* d3dDC) const noexcept; + void _DrawPass(uint32_t i) const noexcept; + + ID3D11DeviceContext* _d3dDC = nullptr; SmallVector _samplers; SmallVector> _textures; diff --git a/src/Magpie.Core/Renderer.cpp b/src/Magpie.Core/Renderer.cpp index a6fe9dc55..2e1df0aa5 100644 --- a/src/Magpie.Core/Renderer.cpp +++ b/src/Magpie.Core/Renderer.cpp @@ -236,7 +236,7 @@ void Renderer::Render(HCURSOR hCursor, POINT cursorPos) noexcept { _frontendSharedTextureMutex->ReleaseSync(_lastAccessMutexKey); // 绘制光标 - _cursorDrawer.Draw(hCursor, cursorPos, d3dDC); + _cursorDrawer.Draw(hCursor, cursorPos); // 两个垂直同步之间允许渲染数帧,SyncInterval = 0 只呈现最新的一帧,旧帧被丢弃 _swapChain->Present(0, 0); @@ -518,9 +518,10 @@ void Renderer::_BackendRender(ID3D11Texture2D* effectsOutput) noexcept { } ID3D11DeviceContext4* d3dDC = _backendResources.GetD3DDC(); + d3dDC->ClearState(); for (const EffectDrawer& effectDrawer : _effectDrawers) { - effectDrawer.Draw(d3dDC); + effectDrawer.Draw(); } const uint64_t key = ++_sharedTextureMutexKey; diff --git a/src/Magpie.Core/shaders/SimpleVertexShader.hlsl b/src/Magpie.Core/shaders/SimpleVertexShader.hlsl index 1e00246ba..8967a461d 100644 --- a/src/Magpie.Core/shaders/SimpleVertexShader.hlsl +++ b/src/Magpie.Core/shaders/SimpleVertexShader.hlsl @@ -1,8 +1,8 @@ void main( float4 pos : SV_POSITION, float2 coord : TEXCOORD, - out float4 outPos : SV_POSITION, - out float2 outCoord : TEXCOORD + out float2 outCoord : TEXCOORD, + out float4 outPos : SV_POSITION ) { outPos = pos; outCoord = coord; From 93641136568b68a400f89a7e88b0e4147ccbbbf4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=97=AD?= <34770031+Blinue@users.noreply.github.com> Date: Sun, 18 Jun 2023 13:40:25 +0800 Subject: [PATCH 037/155] =?UTF-8?q?perf:=20=E4=BC=98=E5=8C=96=E4=BD=8E?= =?UTF-8?q?=E5=B8=A7=E7=8E=87=E7=9A=84=E6=B5=81=E7=95=85=E5=BA=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Magpie.Core/Renderer.cpp | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/src/Magpie.Core/Renderer.cpp b/src/Magpie.Core/Renderer.cpp index 2e1df0aa5..d360c1239 100644 --- a/src/Magpie.Core/Renderer.cpp +++ b/src/Magpie.Core/Renderer.cpp @@ -524,17 +524,7 @@ void Renderer::_BackendRender(ID3D11Texture2D* effectsOutput) noexcept { effectDrawer.Draw(); } - const uint64_t key = ++_sharedTextureMutexKey; - HRESULT hr = _backendSharedTextureMutex->AcquireSync(key - 1, INFINITE); - if (FAILED(hr)) { - return; - } - - d3dDC->CopyResource(_backendSharedTexture.get(), effectsOutput); - - _backendSharedTextureMutex->ReleaseSync(key); - - hr = d3dDC->Signal(_d3dFence.get(), ++_fenceValue); + HRESULT hr = d3dDC->Signal(_d3dFence.get(), ++_fenceValue); if (FAILED(hr)) { return; } @@ -548,6 +538,19 @@ void Renderer::_BackendRender(ID3D11Texture2D* effectsOutput) noexcept { // 等待渲染完成 WaitForSingleObject(_fenceEvent.get(), INFINITE); + // 渲染完成后再更新 _sharedTextureMutexKey,否则前端必须等待,会大幅降低帧率 + const uint64_t key = ++_sharedTextureMutexKey; + hr = _backendSharedTextureMutex->AcquireSync(key - 1, INFINITE); + if (FAILED(hr)) { + return; + } + + d3dDC->CopyResource(_backendSharedTexture.get(), effectsOutput); + + _backendSharedTextureMutex->ReleaseSync(key); + + d3dDC->Flush(); + // 唤醒前端线程 PostMessage(_hwndScaling, WM_NULL, 0, 0); } From 80ae6e3187a0eb2fba39c03d78a34acdd0c9cc87 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=97=AD?= <34770031+Blinue@users.noreply.github.com> Date: Sun, 18 Jun 2023 20:46:43 +0800 Subject: [PATCH 038/155] =?UTF-8?q?feat:=20=E5=AE=9E=E7=8E=B0=E5=BD=A9?= =?UTF-8?q?=E8=89=B2=E6=8E=A9=E7=A0=81=E5=85=89=E6=A0=87=E5=92=8C=E5=8D=95?= =?UTF-8?q?=E8=89=B2=E5=85=89=E6=A0=87=E7=9A=84=E6=B8=B2=E6=9F=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Effects/Anime4K/Anime4K_Restore_UL.hlsl | 12 +- src/Magpie.Core/CursorDrawer.cpp | 273 +++++++++++------- src/Magpie.Core/CursorDrawer.h | 13 +- src/Magpie.Core/Magpie.Core.vcxproj | 10 +- src/Magpie.Core/Magpie.Core.vcxproj.filters | 10 +- src/Magpie.Core/shaders/MaskedCursorPS.hlsl | 16 + .../shaders/MonochromeCursorPS.hlsl | 24 ++ .../{SimplePixelShader.hlsl => SimplePS.hlsl} | 0 ...{SimpleVertexShader.hlsl => SimpleVS.hlsl} | 0 9 files changed, 237 insertions(+), 121 deletions(-) create mode 100644 src/Magpie.Core/shaders/MaskedCursorPS.hlsl create mode 100644 src/Magpie.Core/shaders/MonochromeCursorPS.hlsl rename src/Magpie.Core/shaders/{SimplePixelShader.hlsl => SimplePS.hlsl} (100%) rename src/Magpie.Core/shaders/{SimpleVertexShader.hlsl => SimpleVS.hlsl} (100%) diff --git a/src/Effects/Anime4K/Anime4K_Restore_UL.hlsl b/src/Effects/Anime4K/Anime4K_Restore_UL.hlsl index 3e12a7feb..880e505a1 100644 --- a/src/Effects/Anime4K/Anime4K_Restore_UL.hlsl +++ b/src/Effects/Anime4K/Anime4K_Restore_UL.hlsl @@ -2,15 +2,18 @@ // Ported from https://github.com/bloc97/Anime4K/blob/4ba94b179a144200cb6b3052e690fe2ca5c6914c/glsl/Restore/Anime4K_Restore_CNN_UL.glsl //!MAGPIE EFFECT -//!VERSION 3 -//!OUTPUT_WIDTH INPUT_WIDTH -//!OUTPUT_HEIGHT INPUT_HEIGHT +//!VERSION 4 //!SORT_NAME Anime4K_Restore_3 //!TEXTURE Texture2D INPUT; +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +Texture2D OUTPUT; + //!SAMPLER //!FILTER POINT SamplerState sam; @@ -1879,6 +1882,7 @@ void Pass7(uint2 blockStart, uint3 threadId) { //!PASS 8 //!DESC Conv-4x3x3x24, Conv-3x1x1x120 //!IN INPUT, tex1, tex2, tex3, tex7 +//!OUT OUTPUT //!BLOCK_SIZE 8 //!NUM_THREADS 64 @@ -2169,5 +2173,5 @@ void Pass8(uint2 blockStart, uint3 threadId) { result += float3(-0.0071146404, 0.005606682, 0.010180816); result += INPUT.SampleLevel(sam, pos, 0).rgb; - WriteToOutput(gxy, result.rgb); + OUTPUT[gxy] = float4(result, 1); } diff --git a/src/Magpie.Core/CursorDrawer.cpp b/src/Magpie.Core/CursorDrawer.cpp index eae1ed701..e3f55dae7 100644 --- a/src/Magpie.Core/CursorDrawer.cpp +++ b/src/Magpie.Core/CursorDrawer.cpp @@ -5,9 +5,12 @@ #include "Utils.h" #include "DirectXHelper.h" #include "ScalingOptions.h" -#include "shaders/SimpleVertexShader.h" -#include "shaders/SimplePixelShader.h" +#include "shaders/SimpleVS.h" +#include "shaders/SimplePS.h" +#include "shaders/MaskedCursorPS.h" +#include "shaders/MonochromeCursorPS.h" #include +#include "Win32Utils.h" using namespace DirectX; @@ -57,7 +60,7 @@ bool CursorDrawer::Initialize( ID3D11Device* d3dDevice = deviceResources.GetD3DDevice(); HRESULT hr = d3dDevice->CreateVertexShader( - SimpleVertexShader, std::size(SimpleVertexShader), nullptr, _simpleVS.put()); + SimpleVS, std::size(SimpleVS), nullptr, _simpleVS.put()); if (FAILED(hr)) { Logger::Get().ComError("创建顶点着色器失败", hr); return false; @@ -66,8 +69,8 @@ bool CursorDrawer::Initialize( hr = d3dDevice->CreateInputLayout( VertexPositionTexture::InputElements, VertexPositionTexture::InputElementCount, - SimpleVertexShader, - std::size(SimpleVertexShader), + SimpleVS, + std::size(SimpleVS), _simpleIL.put() ); if (FAILED(hr)) { @@ -100,93 +103,173 @@ void CursorDrawer::Draw(HCURSOR hCursor, POINT cursorPos) noexcept { return; } - const SIZE cursorSize = { lroundf(ci->size.cx * _cursorScaling), lroundf(ci->size.cy * _cursorScaling) }; - const POINT cursorTopLeft = { - lroundf(cursorPos.x - ci->hotSpot.x * _cursorScaling), - lroundf(cursorPos.y - ci->hotSpot.y * _cursorScaling) - }; - - if (cursorTopLeft.x + cursorSize.cx <= _viewportRect.left || - cursorTopLeft.y + cursorSize.cy <= _viewportRect.top || - cursorTopLeft.x >= _viewportRect.right || - cursorTopLeft.y >= _viewportRect.bottom + SIZE cursorSize{ lroundf(ci->size.cx * _cursorScaling), lroundf(ci->size.cy * _cursorScaling) }; + RECT cursorRect; + cursorRect.left = lroundf(cursorPos.x - ci->hotSpot.x * _cursorScaling); + cursorRect.top = lroundf(cursorPos.y - ci->hotSpot.y * _cursorScaling); + cursorRect.right = cursorRect.left + cursorSize.cx; + cursorRect.bottom = cursorRect.top + cursorSize.cy; + + if (cursorRect.left >= _viewportRect.right || + cursorRect.top >= _viewportRect.bottom || + cursorRect.right <= _viewportRect.left || + cursorRect.bottom <= _viewportRect.top ) { // 光标在窗口外,不应发生这种情况 return; } - float left = (cursorTopLeft.x - _viewportRect.left) / float(_viewportRect.right - _viewportRect.left) * 2 - 1.0f; - float top = 1.0f - (cursorTopLeft.y - _viewportRect.top) / float(_viewportRect.bottom - _viewportRect.top) * 2; - float right = left + cursorSize.cx / float(_viewportRect.right - _viewportRect.left) * 2; - float bottom = top - cursorSize.cy / float(_viewportRect.bottom - _viewportRect.top) * 2; + const SIZE viewportSize = Win32Utils::GetSizeOfRect(_viewportRect); + float left = (cursorRect.left - _viewportRect.left) / (float)viewportSize.cx * 2 - 1.0f; + float top = 1.0f - (cursorRect.top - _viewportRect.top) / (float)viewportSize.cy * 2; + float right = left + cursorSize.cx / (float)viewportSize.cx * 2; + float bottom = top - cursorSize.cy / (float)viewportSize.cy * 2; ID3D11DeviceContext* d3dDC = _deviceResources->GetD3DDC(); d3dDC->IASetInputLayout(_simpleIL.get()); d3dDC->VSSetShader(_simpleVS.get(), nullptr, 0); + // 配置顶点缓冲区 + { + D3D11_MAPPED_SUBRESOURCE ms; + HRESULT hr = d3dDC->Map(_vtxBuffer.get(), 0, D3D11_MAP_WRITE_DISCARD, 0, &ms); + if (FAILED(hr)) { + Logger::Get().ComError("Map 失败", hr); + return; + } + + VertexPositionTexture* data = (VertexPositionTexture*)ms.pData; + data[0] = { XMFLOAT3(left, top, 0.5f), XMFLOAT2(0.0f, 0.0f) }; + data[1] = { XMFLOAT3(right, top, 0.5f), XMFLOAT2(1.0f, 0.0f) }; + data[2] = { XMFLOAT3(left, bottom, 0.5f), XMFLOAT2(0.0f, 1.0f) }; + data[3] = { XMFLOAT3(right, bottom, 0.5f), XMFLOAT2(1.0f, 1.0f) }; + + d3dDC->Unmap(_vtxBuffer.get(), 0); + + ID3D11Buffer* vtxBuffer = _vtxBuffer.get(); + UINT stride = sizeof(VertexPositionTexture); + UINT offset = 0; + d3dDC->IASetVertexBuffers(0, 1, &vtxBuffer, &stride, &offset); + } + + // 配置渲染目标和视口 + { + ID3D11RenderTargetView* rtv = _deviceResources->GetRenderTargetView(_backBuffer); + d3dDC->OMSetRenderTargets(1, &rtv, nullptr); + + D3D11_VIEWPORT vp{ + (float)_viewportRect.left, + (float)_viewportRect.top, + (float)viewportSize.cx, + (float)viewportSize.cy, + 0.0f, + 1.0f + }; + d3dDC->RSSetViewports(1, &vp); + } + if (ci->type == _CursorType::Color) { - // 配置顶点缓冲区 - { - D3D11_MAPPED_SUBRESOURCE ms; - HRESULT hr = d3dDC->Map(_vtxBuffer.get(), 0, D3D11_MAP_WRITE_DISCARD, 0, &ms); + // 配置像素着色器 + if (!_simplePS) { + HRESULT hr = _deviceResources->GetD3DDevice()->CreatePixelShader( + SimplePS, sizeof(SimplePS), nullptr, _simplePS.put()); if (FAILED(hr)) { - Logger::Get().ComError("Map 失败", hr); + Logger::Get().ComError("创建像素着色器失败", hr); return; } + } - VertexPositionTexture* data = (VertexPositionTexture*)ms.pData; - data[0] = { XMFLOAT3(left, top, 0.5f), XMFLOAT2(0.0f, 0.0f) }; - data[1] = { XMFLOAT3(right, top, 0.5f), XMFLOAT2(1.0f, 0.0f) }; - data[2] = { XMFLOAT3(left, bottom, 0.5f), XMFLOAT2(0.0f, 1.0f) }; - data[3] = { XMFLOAT3(right, bottom, 0.5f), XMFLOAT2(1.0f, 1.0f) }; - - d3dDC->Unmap(_vtxBuffer.get(), 0); + d3dDC->PSSetShader(_simplePS.get(), nullptr, 0); + d3dDC->PSSetConstantBuffers(0, 0, nullptr); + ID3D11ShaderResourceView* cursorSRV = _deviceResources->GetShaderResourceView(ci->texture.get()); + d3dDC->PSSetShaderResources(0, 1, &cursorSRV); + ID3D11SamplerState* cursorSampler = _deviceResources->GetSampler( + _interpolationMode == CursorInterpolationMode::NearestNeighbor + ? D3D11_FILTER_MIN_MAG_MIP_POINT + : D3D11_FILTER_MIN_MAG_MIP_LINEAR, + D3D11_TEXTURE_ADDRESS_CLAMP); + d3dDC->PSSetSamplers(0, 1, &cursorSampler); - ID3D11Buffer* vtxBuffer = _vtxBuffer.get(); - UINT stride = sizeof(VertexPositionTexture); - UINT offset = 0; - d3dDC->IASetVertexBuffers(0, 1, &vtxBuffer, &stride, &offset); + // 预乘 alpha + _SetPremultipliedAlphaBlend(); + } else { + if (_tempCursorTextureSize != cursorSize) { + // 创建临时纹理,如果光标尺寸变了则重新创建 + _tempCursorTexture = DirectXHelper::CreateTexture2D( + _deviceResources->GetD3DDevice(), + DXGI_FORMAT_R8G8B8A8_UNORM, + cursorSize.cx, + cursorSize.cy, + D3D11_BIND_SHADER_RESOURCE + ); + if (!_tempCursorTexture) { + return; + } + _tempCursorTextureSize = cursorSize; } - // 配置像素着色器 - if (!_SetSimplePS(ci->texture.get())) { - return; - } + D3D11_BOX srcBox{ + (UINT)std::max(cursorRect.left, _viewportRect.left), + (UINT)std::max(cursorRect.top, _viewportRect.top), + 0, + (UINT)std::min(cursorRect.right, _viewportRect.right), + (UINT)std::min(cursorRect.bottom, _viewportRect.bottom), + 1 + }; + d3dDC->CopySubresourceRegion( + _tempCursorTexture.get(), + 0, + srcBox.left - cursorRect.left, + srcBox.top - cursorRect.top, + 0, + _backBuffer, + 0, + &srcBox + ); - { - d3dDC->PSSetShader(_simplePS.get(), nullptr, 0); - d3dDC->PSSetConstantBuffers(0, 0, nullptr); - ID3D11ShaderResourceView* cursorSRV = _deviceResources->GetShaderResourceView(ci->texture.get()); - d3dDC->PSSetShaderResources(0, 1, &cursorSRV); - ID3D11SamplerState* cursorSampler = _deviceResources->GetSampler( - _interpolationMode == CursorInterpolationMode::NearestNeighbor - ? D3D11_FILTER_MIN_MAG_MIP_POINT - : D3D11_FILTER_MIN_MAG_MIP_LINEAR, - D3D11_TEXTURE_ADDRESS_CLAMP); - d3dDC->PSSetSamplers(0, 1, &cursorSampler); - } - - // 配置渲染目标和视口 - { - ID3D11RenderTargetView* rtv = _deviceResources->GetRenderTargetView(_backBuffer); - - d3dDC->OMSetRenderTargets(1, &rtv, nullptr); - D3D11_VIEWPORT vp{ - (float)_viewportRect.left, - (float)_viewportRect.top, - float(_viewportRect.right - _viewportRect.left), - float(_viewportRect.bottom - _viewportRect.top), - 0.0f, - 1.0f - }; - d3dDC->RSSetViewports(1, &vp); + if (ci->type == _CursorType::MaskedColor) { + if (!_maskedCursorPS) { + HRESULT hr = _deviceResources->GetD3DDevice()->CreatePixelShader( + MaskedCursorPS, sizeof(MaskedCursorPS), nullptr, _maskedCursorPS.put()); + if (FAILED(hr)) { + Logger::Get().ComError("创建像素着色器失败", hr); + return; + } + } + d3dDC->PSSetShader(_maskedCursorPS.get(), nullptr, 0); + } else { + if (!_monochromeCursorPS) { + HRESULT hr = _deviceResources->GetD3DDevice()->CreatePixelShader( + MonochromeCursorPS, sizeof(MonochromeCursorPS), nullptr, _monochromeCursorPS.put()); + if (FAILED(hr)) { + Logger::Get().ComError("创建像素着色器失败", hr); + return; + } + } + d3dDC->PSSetShader(_monochromeCursorPS.get(), nullptr, 0); } - // 预乘 alpha - _SetPremultipliedAlphaBlend(true); - - d3dDC->Draw(4, 0); + d3dDC->PSSetConstantBuffers(0, 0, nullptr); + + ID3D11ShaderResourceView* srvs[2]{ + _deviceResources->GetShaderResourceView(_tempCursorTexture.get()), + _deviceResources->GetShaderResourceView(ci->texture.get()) + }; + d3dDC->PSSetShaderResources(0, 2, srvs); + + ID3D11SamplerState* samplers[2]; + samplers[0] = _deviceResources->GetSampler( + D3D11_FILTER_MIN_MAG_MIP_POINT, D3D11_TEXTURE_ADDRESS_CLAMP); + if (_interpolationMode == CursorInterpolationMode::NearestNeighbor) { + samplers[1] = samplers[0]; + } else { + samplers[1] = _deviceResources->GetSampler( + D3D11_FILTER_MIN_MAG_MIP_LINEAR, D3D11_TEXTURE_ADDRESS_CLAMP); + } + d3dDC->PSSetSamplers(0, 2, samplers); } + + d3dDC->Draw(4, 0); } const CursorDrawer::_CursorInfo* CursorDrawer::_ResolveCursor(HCURSOR hCursor) noexcept { @@ -243,12 +326,14 @@ const CursorDrawer::_CursorInfo* CursorDrawer::_ResolveCursor(HCURSOR hCursor) n ReleaseDC(NULL, hdc); // 红色通道是 AND 掩码,绿色通道是 XOR 掩码 - // 这里将下半部分的 XOR 掩码复制到上半部分的绿色通道中 + // 构造 DXGI_FORMAT_R8G8_UNORM 的初始数据 const int halfSize = bi.bmiHeader.biSizeImage / 8; - BYTE* upPtr = &pixels[1]; - BYTE* downPtr = &pixels[static_cast(halfSize) * 4]; + BYTE* upPtr = &pixels[0]; + BYTE* downPtr = &pixels[(size_t)halfSize * 4]; + uint8_t* targetPtr = &pixels[0]; for (int i = 0; i < halfSize; ++i) { - *upPtr = *downPtr; + *targetPtr++ = *upPtr; + *targetPtr++ = *downPtr; upPtr += 4; downPtr += 4; @@ -256,11 +341,11 @@ const CursorDrawer::_CursorInfo* CursorDrawer::_ResolveCursor(HCURSOR hCursor) n D3D11_SUBRESOURCE_DATA initData{}; initData.pSysMem = pixels.get(); - initData.SysMemPitch = bmp.bmWidth * 4; + initData.SysMemPitch = bmp.bmWidth * 2; ci.texture = DirectXHelper::CreateTexture2D( _deviceResources->GetD3DDevice(), - DXGI_FORMAT_R8G8B8A8_UNORM, + DXGI_FORMAT_R8G8_UNORM, bmp.bmWidth, bmp.bmHeight / 2, D3D11_BIND_SHADER_RESOURCE, @@ -350,39 +435,7 @@ const CursorDrawer::_CursorInfo* CursorDrawer::_ResolveCursor(HCURSOR hCursor) n return &ci; } -bool CursorDrawer::_SetSimplePS(ID3D11Texture2D* cursorTexture) noexcept { - if (!_simplePS) { - HRESULT hr = _deviceResources->GetD3DDevice()->CreatePixelShader( - SimplePixelShader, sizeof(SimplePixelShader), nullptr, _simplePS.put()); - if (FAILED(hr)) { - Logger::Get().ComError("创建像素着色器失败", hr); - return false; - } - } - - ID3D11DeviceContext* d3dDC = _deviceResources->GetD3DDC(); - d3dDC->PSSetShader(_simplePS.get(), nullptr, 0); - d3dDC->PSSetConstantBuffers(0, 0, nullptr); - ID3D11ShaderResourceView* cursorSRV = _deviceResources->GetShaderResourceView(cursorTexture); - d3dDC->PSSetShaderResources(0, 1, &cursorSRV); - ID3D11SamplerState* cursorSampler = _deviceResources->GetSampler( - _interpolationMode == CursorInterpolationMode::NearestNeighbor - ? D3D11_FILTER_MIN_MAG_MIP_POINT - : D3D11_FILTER_MIN_MAG_MIP_LINEAR, - D3D11_TEXTURE_ADDRESS_CLAMP); - d3dDC->PSSetSamplers(0, 1, &cursorSampler); - - return true; -} - -bool CursorDrawer::_SetPremultipliedAlphaBlend(bool enable) noexcept { - ID3D11DeviceContext* d3dDC = _deviceResources->GetD3DDC(); - - if (!enable) { - d3dDC->OMSetBlendState(nullptr, nullptr, 0xffffffff); - return true; - } - +bool CursorDrawer::_SetPremultipliedAlphaBlend() noexcept { if (!premultipliedAlphaBlendBlendState) { // FinalColor = ScreenColor * CursorColor.a + CursorColor D3D11_BLEND_DESC desc{}; @@ -402,7 +455,7 @@ bool CursorDrawer::_SetPremultipliedAlphaBlend(bool enable) noexcept { } } - d3dDC->OMSetBlendState(premultipliedAlphaBlendBlendState.get(), nullptr, 0xffffffff); + _deviceResources->GetD3DDC()->OMSetBlendState(premultipliedAlphaBlendBlendState.get(), nullptr, 0xffffffff); return true; } diff --git a/src/Magpie.Core/CursorDrawer.h b/src/Magpie.Core/CursorDrawer.h index 9014669d6..fbe3de616 100644 --- a/src/Magpie.Core/CursorDrawer.h +++ b/src/Magpie.Core/CursorDrawer.h @@ -26,12 +26,15 @@ class CursorDrawer { // 彩色光标,此时纹理中 RGB 通道已预乘 A 通道(premultiplied alpha),A 通道已预先取反 // 这是为了减少着色器的计算量以及确保(可能进行的)双线性差值的准确性 // 计算公式:FinalColor = ScreenColor * CursorColor.a + CursorColor + // 纹理格式:DXGI_FORMAT_R8G8B8A8_UNORM Color = 0, // 彩色掩码光标,此时 A 通道可能为 0 或 255 // 为 0 时表示 RGB 通道取代屏幕颜色,为 255 时表示 RGB 通道和屏幕颜色进行异或操作 + // 纹理格式:DXGI_FORMAT_R8G8B8A8_UNORM MaskedColor, // 单色光标,此时 R 通道为 AND 掩码,G 通道为 XOR 掩码,其他通道不使用 // RG 通道的值只能是 0 或 255 + // 纹理格式:DXGI_FORMAT_R8G8_UNORM Monochrome }; @@ -44,9 +47,7 @@ class CursorDrawer { const _CursorInfo* _ResolveCursor(HCURSOR hCursor) noexcept; - bool _SetSimplePS(ID3D11Texture2D* cursorTexture) noexcept; - - bool _SetPremultipliedAlphaBlend(bool enable) noexcept; + bool _SetPremultipliedAlphaBlend() noexcept; DeviceResources* _deviceResources = nullptr; ID3D11Texture2D* _backBuffer = nullptr; @@ -63,6 +64,12 @@ class CursorDrawer { winrt::com_ptr _vtxBuffer; winrt::com_ptr _simplePS; winrt::com_ptr premultipliedAlphaBlendBlendState; + winrt::com_ptr _maskedCursorPS; + winrt::com_ptr _monochromeCursorPS; + + // 用于渲染彩色掩码光标和单色光标的临时纹理 + winrt::com_ptr _tempCursorTexture; + SIZE _tempCursorTextureSize{}; }; } diff --git a/src/Magpie.Core/Magpie.Core.vcxproj b/src/Magpie.Core/Magpie.Core.vcxproj index 252e95657..9583ad932 100644 --- a/src/Magpie.Core/Magpie.Core.vcxproj +++ b/src/Magpie.Core/Magpie.Core.vcxproj @@ -151,10 +151,16 @@ - + Pixel - + + Pixel + + + Pixel + + Vertex diff --git a/src/Magpie.Core/Magpie.Core.vcxproj.filters b/src/Magpie.Core/Magpie.Core.vcxproj.filters index 85449bb2f..ae499634f 100644 --- a/src/Magpie.Core/Magpie.Core.vcxproj.filters +++ b/src/Magpie.Core/Magpie.Core.vcxproj.filters @@ -123,10 +123,16 @@ - + Shaders - + + Shaders + + + Shaders + + Shaders diff --git a/src/Magpie.Core/shaders/MaskedCursorPS.hlsl b/src/Magpie.Core/shaders/MaskedCursorPS.hlsl new file mode 100644 index 000000000..4d2cd84d9 --- /dev/null +++ b/src/Magpie.Core/shaders/MaskedCursorPS.hlsl @@ -0,0 +1,16 @@ +Texture2D originTex : register(t0); +Texture2D cursorTex : register(t1); +SamplerState originSampler : register(s0); +SamplerState cursorSampler : register(s1); + +float4 main(float2 coord : TEXCOORD) : SV_TARGET { + float4 mask = cursorTex.Sample(cursorSampler, coord); + + if (mask.a < 0.5f) { + return float4(mask.rgb, 1); + } else { + float3 origin = originTex.Sample(originSampler, coord).rgb; + // 255.001953 的由来见 https://stackoverflow.com/questions/52103720/why-does-d3dcolortoubyte4-multiplies-components-by-255-001953f + return float4((uint3(origin * 255.001953f) ^ uint3(mask.rgb * 255.001953f)) / 255.0f, 1); + } +} diff --git a/src/Magpie.Core/shaders/MonochromeCursorPS.hlsl b/src/Magpie.Core/shaders/MonochromeCursorPS.hlsl new file mode 100644 index 000000000..20a3fecee --- /dev/null +++ b/src/Magpie.Core/shaders/MonochromeCursorPS.hlsl @@ -0,0 +1,24 @@ +Texture2D originTex : register(t0); +Texture2D cursorTex : register(t1); +SamplerState originSampler : register(s0); +SamplerState cursorSampler : register(s1); + +float4 main(float2 coord : TEXCOORD) : SV_TARGET { + float2 mask = cursorTex.Sample(cursorSampler, coord); + + if (mask.x > 0.5f) { + float3 origin = originTex.Sample(originSampler, coord).rgb; + + if (mask.y > 0.5f) { + return float4(1 - origin, 1); + } else { + return float4(origin, 1); + } + } else { + if (mask.y > 0.5f) { + return float4(1, 1, 1, 1); + } else { + return float4(0, 0, 0, 1); + } + } +} diff --git a/src/Magpie.Core/shaders/SimplePixelShader.hlsl b/src/Magpie.Core/shaders/SimplePS.hlsl similarity index 100% rename from src/Magpie.Core/shaders/SimplePixelShader.hlsl rename to src/Magpie.Core/shaders/SimplePS.hlsl diff --git a/src/Magpie.Core/shaders/SimpleVertexShader.hlsl b/src/Magpie.Core/shaders/SimpleVS.hlsl similarity index 100% rename from src/Magpie.Core/shaders/SimpleVertexShader.hlsl rename to src/Magpie.Core/shaders/SimpleVS.hlsl From f0ce6ffad4604f15362c0a7f87d1806ca7629e6c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=97=AD?= <34770031+Blinue@users.noreply.github.com> Date: Mon, 19 Jun 2023 22:36:46 +0800 Subject: [PATCH 039/155] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=20StepTimer?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Anime4K/Anime4K_Restore_Soft_M.hlsl | 20 ++++---- .../Anime4K/Anime4K_Upscale_GAN_x2_S.hlsl | 13 ++++-- src/Magpie.Core/CursorManager.h | 2 +- src/Magpie.Core/DeviceResources.h | 4 +- src/Magpie.Core/EffectDrawer.h | 4 +- src/Magpie.Core/Magpie.Core.vcxproj | 2 + src/Magpie.Core/Magpie.Core.vcxproj.filters | 2 + src/Magpie.Core/Renderer.cpp | 25 +++++++--- src/Magpie.Core/Renderer.h | 5 +- src/Magpie.Core/ScalingRuntime.cpp | 2 +- src/Magpie.Core/StepTimer.cpp | 46 +++++++++++++++++++ src/Magpie.Core/StepTimer.h | 30 ++++++++++++ 12 files changed, 128 insertions(+), 27 deletions(-) create mode 100644 src/Magpie.Core/StepTimer.cpp create mode 100644 src/Magpie.Core/StepTimer.h diff --git a/src/Effects/Anime4K/Anime4K_Restore_Soft_M.hlsl b/src/Effects/Anime4K/Anime4K_Restore_Soft_M.hlsl index 508b01ae4..5b026e47e 100644 --- a/src/Effects/Anime4K/Anime4K_Restore_Soft_M.hlsl +++ b/src/Effects/Anime4K/Anime4K_Restore_Soft_M.hlsl @@ -2,18 +2,17 @@ // 移植自 https://github.com/bloc97/Anime4K/blob/master/glsl/Restore/Anime4K_Restore_CNN_Soft_M.glsl //!MAGPIE EFFECT -//!VERSION 3 -//!OUTPUT_WIDTH INPUT_WIDTH -//!OUTPUT_HEIGHT INPUT_HEIGHT +//!VERSION 4 //!SORT_NAME Anime4K_Restore_Soft_0 //!TEXTURE Texture2D INPUT; -//!SAMPLER -//!FILTER POINT -SamplerState sam; +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +Texture2D OUTPUT; //!TEXTURE //!WIDTH INPUT_WIDTH @@ -51,6 +50,10 @@ Texture2D tex5; //!FORMAT R16G16B16A16_FLOAT Texture2D tex6; +//!SAMPLER +//!FILTER POINT +SamplerState sam; + //!PASS 1 //!DESC Conv-4x3x3x3 @@ -495,13 +498,14 @@ void Pass6(uint2 blockStart, uint3 threadId) { //!PASS 7 //!DESC Conv-4x3x3x8, Conv-3x1x1x56 //!IN INPUT, tex1, tex2, tex3, tex4, tex5, tex6 +//!OUT OUTPUT //!BLOCK_SIZE 8 //!NUM_THREADS 64 void Pass7(uint2 blockStart, uint3 threadId) { uint2 gxy = Rmp8x8(threadId.x) + blockStart; uint2 inputSize = GetInputSize(); - if (!CheckViewport(gxy)) { + if (gxy.x >= inputSize.x || gxy.y >= inputSize.y) { return; } float2 inputPt = GetInputPt(); @@ -564,5 +568,5 @@ void Pass7(uint2 blockStart, uint3 threadId) { result += mul(max(-src7, 0), float4x3(0.09681486, 0.113604136, 0.10416855, -0.08199983, -0.09013433, -0.08562243, 0.041304465, 0.048315883, 0.042945288, -0.09863276, -0.117853515, -0.09870226)); result += float3(-0.0039074384, -0.0085585555, -0.0132283475); - WriteToOutput(gxy, result + origin); + OUTPUT[gxy] = float4(result + origin, 1); } diff --git a/src/Effects/Anime4K/Anime4K_Upscale_GAN_x2_S.hlsl b/src/Effects/Anime4K/Anime4K_Upscale_GAN_x2_S.hlsl index 1331fb58b..d65f592f6 100644 --- a/src/Effects/Anime4K/Anime4K_Upscale_GAN_x2_S.hlsl +++ b/src/Effects/Anime4K/Anime4K_Upscale_GAN_x2_S.hlsl @@ -2,14 +2,16 @@ // 移植自 https://github.com/bloc97/Anime4K/blob/master/glsl/Upscale/Anime4K_Upscale_GAN_x2_S.glsl //!MAGPIE EFFECT -//!VERSION 3 -//!OUTPUT_WIDTH INPUT_WIDTH * 2 -//!OUTPUT_HEIGHT INPUT_HEIGHT * 2 - +//!VERSION 4 //!TEXTURE Texture2D INPUT; +//!TEXTURE +//!WIDTH INPUT_WIDTH * 2 +//!HEIGHT INPUT_HEIGHT * 2 +Texture2D OUTPUT; + //!SAMPLER //!FILTER POINT SamplerState sam; @@ -696,6 +698,7 @@ void Pass6(uint2 blockStart, uint3 threadId) { //!PASS 7 //!DESC Conv-3x3x3x16 //!IN tex6, tex8, INPUT +//!OUT OUTPUT //!BLOCK_SIZE 8 //!NUM_THREADS 64 @@ -810,5 +813,5 @@ void Pass7(uint2 blockStart, uint3 threadId) { result += mul(ni2, float4x3(0.068098865, 0.07742245, 0.04117883, -0.07239023, -0.0048315763, -0.0029638975, -0.053049978, 0.121163346, 0.048760712, -0.033619802, -0.010043663, -0.012648383)); result += float3(0.00016753975, -0.00019302216, -0.0001663917); - WriteToOutput(gxy, result + INPUT.SampleLevel(sam1, pos, 0).rgb); + OUTPUT[gxy] = float4(result + INPUT.SampleLevel(sam1, pos, 0).rgb, 1); } diff --git a/src/Magpie.Core/CursorManager.h b/src/Magpie.Core/CursorManager.h index e9e3a0846..b3a345b3b 100644 --- a/src/Magpie.Core/CursorManager.h +++ b/src/Magpie.Core/CursorManager.h @@ -7,7 +7,7 @@ struct ScalingOptions; class CursorManager { public: - CursorManager() noexcept = default; + CursorManager() = default; CursorManager(const CursorManager&) = delete; CursorManager(CursorManager&&) = delete; diff --git a/src/Magpie.Core/DeviceResources.h b/src/Magpie.Core/DeviceResources.h index eadcd6970..a24c65de9 100644 --- a/src/Magpie.Core/DeviceResources.h +++ b/src/Magpie.Core/DeviceResources.h @@ -7,9 +7,9 @@ struct ScalingOptions; class DeviceResources { public: - DeviceResources() noexcept = default; + DeviceResources() = default; DeviceResources(const DeviceResources&) = delete; - DeviceResources(DeviceResources&&) noexcept = default; + DeviceResources(DeviceResources&&) = default; bool Initialize(const ScalingOptions& options) noexcept; diff --git a/src/Magpie.Core/EffectDrawer.h b/src/Magpie.Core/EffectDrawer.h index faa0a76f5..b010e8682 100644 --- a/src/Magpie.Core/EffectDrawer.h +++ b/src/Magpie.Core/EffectDrawer.h @@ -10,9 +10,9 @@ class DeviceResources; class EffectDrawer { public: - EffectDrawer() noexcept = default; + EffectDrawer() = default; EffectDrawer(const EffectDrawer&) = delete; - EffectDrawer(EffectDrawer&&) noexcept = default; + EffectDrawer(EffectDrawer&&) = default; bool Initialize( const EffectDesc& desc, diff --git a/src/Magpie.Core/Magpie.Core.vcxproj b/src/Magpie.Core/Magpie.Core.vcxproj index 9583ad932..04324fe68 100644 --- a/src/Magpie.Core/Magpie.Core.vcxproj +++ b/src/Magpie.Core/Magpie.Core.vcxproj @@ -111,6 +111,7 @@ + @@ -136,6 +137,7 @@ + diff --git a/src/Magpie.Core/Magpie.Core.vcxproj.filters b/src/Magpie.Core/Magpie.Core.vcxproj.filters index ae499634f..918d02a38 100644 --- a/src/Magpie.Core/Magpie.Core.vcxproj.filters +++ b/src/Magpie.Core/Magpie.Core.vcxproj.filters @@ -77,6 +77,7 @@ + @@ -110,6 +111,7 @@ + diff --git a/src/Magpie.Core/Renderer.cpp b/src/Magpie.Core/Renderer.cpp index d360c1239..e97617391 100644 --- a/src/Magpie.Core/Renderer.cpp +++ b/src/Magpie.Core/Renderer.cpp @@ -53,6 +53,7 @@ bool Renderer::Initialize(HWND hwndSrc, HWND hwndScaling, const ScalingOptions& break; } } + // 将时间片让给后端线程 Sleep(0); } @@ -454,6 +455,8 @@ void Renderer::_BackendThreadProc(const ScalingOptions& options) noexcept { } } + _stepTimer.Initialize(30.0f); + if (!_backendResources.Initialize(options)) { return; } @@ -492,6 +495,8 @@ void Renderer::_BackendThreadProc(const ScalingOptions& options) noexcept { _srcRect = _frameSource->SrcRect(); } + bool nextFrame = false; + MSG msg; while (true) { while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { @@ -503,8 +508,19 @@ void Renderer::_BackendThreadProc(const ScalingOptions& options) noexcept { DispatchMessage(&msg); } - - _BackendRender(outputTexture); + + if (!nextFrame) { + if (!_stepTimer.NewFrame()) { + Sleep(0); + continue; + } + nextFrame = true; + } + + if (_frameSource->Update() == FrameSourceBase::UpdateState::NewFrame) { + nextFrame = false; + _BackendRender(outputTexture); + } // 等待新消息 1ms MsgWaitForMultipleObjectsEx(0, nullptr, 1, QS_ALLINPUT, MWMO_INPUTAVAILABLE); @@ -512,11 +528,6 @@ void Renderer::_BackendThreadProc(const ScalingOptions& options) noexcept { } void Renderer::_BackendRender(ID3D11Texture2D* effectsOutput) noexcept { - FrameSourceBase::UpdateState updateState = _frameSource->Update(); - if (updateState != FrameSourceBase::UpdateState::NewFrame) { - return; - } - ID3D11DeviceContext4* d3dDC = _backendResources.GetD3DDC(); d3dDC->ClearState(); diff --git a/src/Magpie.Core/Renderer.h b/src/Magpie.Core/Renderer.h index fc6ad2fc8..3fa0f8dff 100644 --- a/src/Magpie.Core/Renderer.h +++ b/src/Magpie.Core/Renderer.h @@ -3,6 +3,7 @@ #include "EffectDrawer.h" #include "Win32Utils.h" #include "CursorDrawer.h" +#include "StepTimer.h" namespace Magpie::Core { @@ -15,7 +16,7 @@ class Renderer { ~Renderer() noexcept; Renderer(const Renderer&) = delete; - Renderer(Renderer&&) noexcept = default; + Renderer(Renderer&&) = delete; bool Initialize(HWND hwndSrc, HWND hwndScaling, const ScalingOptions& options) noexcept; @@ -67,6 +68,8 @@ class Renderer { std::unique_ptr _frameSource; std::vector _effectDrawers; + StepTimer _stepTimer; + winrt::com_ptr _d3dFence; uint64_t _fenceValue = 0; Win32Utils::ScopedHandle _fenceEvent; diff --git a/src/Magpie.Core/ScalingRuntime.cpp b/src/Magpie.Core/ScalingRuntime.cpp index b1a4c7649..3e4f971a9 100644 --- a/src/Magpie.Core/ScalingRuntime.cpp +++ b/src/Magpie.Core/ScalingRuntime.cpp @@ -90,7 +90,7 @@ void ScalingRuntime::_ScalingThreadProc() noexcept { } // 等待新消息 2ms,即我们每隔 2ms 检查一次光标位置 - MsgWaitForMultipleObjectsEx(0, nullptr, 2, QS_ALLINPUT, MWMO_INPUTAVAILABLE); + //MsgWaitForMultipleObjectsEx(0, nullptr, 2, QS_ALLINPUT, MWMO_INPUTAVAILABLE); } } diff --git a/src/Magpie.Core/StepTimer.cpp b/src/Magpie.Core/StepTimer.cpp new file mode 100644 index 000000000..b98ea322e --- /dev/null +++ b/src/Magpie.Core/StepTimer.cpp @@ -0,0 +1,46 @@ +#include "pch.h" +#include "StepTimer.h" + +using namespace std::chrono; + +namespace Magpie::Core { + +void StepTimer::Initialize(std::optional maxFrameRate) noexcept { + if (maxFrameRate) { + _minInterval = duration_cast(duration(1 / *maxFrameRate)); + } +} + +bool StepTimer::NewFrame() noexcept { + auto now = high_resolution_clock::now(); + + if (_minInterval) { + const nanoseconds delta = now - _lastFrameTime; + if (delta >= *_minInterval) { + _elapsedTime = delta; + } else { + return false; + } + } else { + _elapsedTime = now - _lastFrameTime; + } + + _lastFrameTime = now; + + // 更新当前帧率 + ++_framesThisSecond; + ++_frameCount; + + _fpsCounter += _elapsedTime; + if (_fpsCounter >= 1s) { + _framesPerSecond = _framesThisSecond; + _framesThisSecond = 0; + _fpsCounter %= 1s; + + OutputDebugString(fmt::format(L"{}\n", _framesPerSecond).c_str()); + } + + return true; +} + +} diff --git a/src/Magpie.Core/StepTimer.h b/src/Magpie.Core/StepTimer.h new file mode 100644 index 000000000..5936787c8 --- /dev/null +++ b/src/Magpie.Core/StepTimer.h @@ -0,0 +1,30 @@ +#pragma once + +namespace Magpie::Core { + +class StepTimer { +public: + StepTimer() = default; + + StepTimer(const StepTimer&) = delete; + StepTimer(StepTimer&&) = delete; + + void Initialize(std::optional maxFrameRate) noexcept; + + bool NewFrame() noexcept; + +private: + std::optional _minInterval; + + std::chrono::time_point _lastFrameTime; + // 上一帧的渲染时间 + std::chrono::nanoseconds _elapsedTime{}; + + uint32_t _frameCount = 0; + uint32_t _framesPerSecond = 0; + uint32_t _framesThisSecond = 0; + std::chrono::nanoseconds _fpsCounter{}; + +}; + +} From 0b43a4219728ed35dbda1f79e77ea0020bd3f2ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=97=AD?= <34770031+Blinue@users.noreply.github.com> Date: Tue, 20 Jun 2023 00:34:13 +0800 Subject: [PATCH 040/155] =?UTF-8?q?perf:=20=E4=BC=98=E5=8C=96=E6=B8=B2?= =?UTF-8?q?=E6=9F=93=E5=BB=B6=E8=BF=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Magpie.Core/Renderer.cpp | 44 ++++++++++++++++++++++++++++-------- src/Magpie.Core/Renderer.h | 10 +++++--- 2 files changed, 41 insertions(+), 13 deletions(-) diff --git a/src/Magpie.Core/Renderer.cpp b/src/Magpie.Core/Renderer.cpp index e97617391..bf84ff8fc 100644 --- a/src/Magpie.Core/Renderer.cpp +++ b/src/Magpie.Core/Renderer.cpp @@ -45,6 +45,19 @@ bool Renderer::Initialize(HWND hwndSrc, HWND hwndScaling, const ScalingOptions& return false; } + HRESULT hr = _frontendResources.GetD3DDevice()->CreateFence( + _frontendFenceValue, D3D11_FENCE_FLAG_NONE, IID_PPV_ARGS(&_frontendD3dFence)); + if (FAILED(hr)) { + Logger::Get().ComError("CreateFence 失败", hr); + return false; + } + + _frontendFenceEvent.reset(Win32Utils::SafeHandle(CreateEvent(nullptr, FALSE, FALSE, nullptr))); + if (!_frontendFenceEvent) { + Logger::Get().Win32Error("CreateEvent 失败"); + return false; + } + // 等待后端初始化完成 while (true) { { @@ -58,7 +71,7 @@ bool Renderer::Initialize(HWND hwndSrc, HWND hwndScaling, const ScalingOptions& } // 获取共享纹理 - HRESULT hr = _frontendResources.GetD3DDevice()->OpenSharedResource( + hr = _frontendResources.GetD3DDevice()->OpenSharedResource( _sharedTextureHandle, IID_PPV_ARGS(_frontendSharedTexture.put())); if (FAILED(hr)) { Logger::Get().ComError("OpenSharedResource 失败", hr); @@ -244,6 +257,18 @@ void Renderer::Render(HCURSOR hCursor, POINT cursorPos) noexcept { // 丢弃渲染目标的内容。仅当现有内容将被完全覆盖时,此操作才有效 d3dDC->DiscardView(backBufferRtv); + + hr = d3dDC->Signal(_frontendD3dFence.get(), ++_frontendFenceValue); + if (FAILED(hr)) { + return; + } + hr = _frontendD3dFence->SetEventOnCompletion(_frontendFenceValue, _frontendFenceEvent.get()); + if (FAILED(hr)) { + return; + } + + // 等待渲染完成以最大程度的降低延迟。前端渲染非常廉价,相比性能我们更关心延迟 + WaitForSingleObject(_frontendFenceEvent.get(), INFINITE); } bool Renderer::_InitFrameSource(const ScalingOptions& options) noexcept { @@ -471,14 +496,14 @@ void Renderer::_BackendThreadProc(const ScalingOptions& options) noexcept { } HRESULT hr = _backendResources.GetD3DDevice()->CreateFence( - _fenceValue, D3D11_FENCE_FLAG_NONE, IID_PPV_ARGS(&_d3dFence)); + _backendFenceValue, D3D11_FENCE_FLAG_NONE, IID_PPV_ARGS(&_backendD3dFence)); if (FAILED(hr)) { Logger::Get().ComError("CreateFence 失败", hr); return; } - _fenceEvent.reset(Win32Utils::SafeHandle(CreateEvent(nullptr, FALSE, FALSE, nullptr))); - if (!_fenceEvent) { + _backendFenceEvent.reset(Win32Utils::SafeHandle(CreateEvent(nullptr, FALSE, FALSE, nullptr))); + if (!_backendFenceEvent) { Logger::Get().Win32Error("CreateEvent 失败"); return; } @@ -535,11 +560,11 @@ void Renderer::_BackendRender(ID3D11Texture2D* effectsOutput) noexcept { effectDrawer.Draw(); } - HRESULT hr = d3dDC->Signal(_d3dFence.get(), ++_fenceValue); + HRESULT hr = d3dDC->Signal(_backendD3dFence.get(), ++_backendFenceValue); if (FAILED(hr)) { return; } - hr = _d3dFence->SetEventOnCompletion(_fenceValue, _fenceEvent.get()); + hr = _backendD3dFence->SetEventOnCompletion(_backendFenceValue, _backendFenceEvent.get()); if (FAILED(hr)) { return; } @@ -547,7 +572,7 @@ void Renderer::_BackendRender(ID3D11Texture2D* effectsOutput) noexcept { d3dDC->Flush(); // 等待渲染完成 - WaitForSingleObject(_fenceEvent.get(), INFINITE); + WaitForSingleObject(_backendFenceEvent.get(), INFINITE); // 渲染完成后再更新 _sharedTextureMutexKey,否则前端必须等待,会大幅降低帧率 const uint64_t key = ++_sharedTextureMutexKey; @@ -560,10 +585,9 @@ void Renderer::_BackendRender(ID3D11Texture2D* effectsOutput) noexcept { _backendSharedTextureMutex->ReleaseSync(key); + // 根据 https://learn.microsoft.com/en-us/windows/win32/api/d3d11/nf-d3d11-id3d11device-opensharedresource, + // 更新共享纹理后必须调用 Flush d3dDC->Flush(); - - // 唤醒前端线程 - PostMessage(_hwndScaling, WM_NULL, 0, 0); } } diff --git a/src/Magpie.Core/Renderer.h b/src/Magpie.Core/Renderer.h index 3fa0f8dff..340eac49a 100644 --- a/src/Magpie.Core/Renderer.h +++ b/src/Magpie.Core/Renderer.h @@ -57,6 +57,10 @@ class Renderer { HCURSOR _lastCursorHandle = NULL; POINT _lastCursorPos{ std::numeric_limits::max(), std::numeric_limits::max() }; + winrt::com_ptr _frontendD3dFence; + uint64_t _frontendFenceValue = 0; + Win32Utils::ScopedHandle _frontendFenceEvent; + winrt::com_ptr _frontendSharedTexture; winrt::com_ptr _frontendSharedTextureMutex; RECT _destRect{}; @@ -70,9 +74,9 @@ class Renderer { StepTimer _stepTimer; - winrt::com_ptr _d3dFence; - uint64_t _fenceValue = 0; - Win32Utils::ScopedHandle _fenceEvent; + winrt::com_ptr _backendD3dFence; + uint64_t _backendFenceValue = 0; + Win32Utils::ScopedHandle _backendFenceEvent; winrt::com_ptr _backendSharedTexture; winrt::com_ptr _backendSharedTextureMutex; From b073d1667284695e4bac8acff3b2791866010e47 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=97=AD?= Date: Tue, 20 Jun 2023 09:03:24 +0800 Subject: [PATCH 041/155] =?UTF-8?q?Revert=20"perf:=20=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E6=B8=B2=E6=9F=93=E5=BB=B6=E8=BF=9F"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit 0b43a4219728ed35dbda1f79e77ea0020bd3f2ea. 某些情况下导致卡顿 --- src/Magpie.Core/Renderer.cpp | 39 +++++++----------------------------- src/Magpie.Core/Renderer.h | 10 +++------ 2 files changed, 10 insertions(+), 39 deletions(-) diff --git a/src/Magpie.Core/Renderer.cpp b/src/Magpie.Core/Renderer.cpp index bf84ff8fc..3bf64823f 100644 --- a/src/Magpie.Core/Renderer.cpp +++ b/src/Magpie.Core/Renderer.cpp @@ -45,19 +45,6 @@ bool Renderer::Initialize(HWND hwndSrc, HWND hwndScaling, const ScalingOptions& return false; } - HRESULT hr = _frontendResources.GetD3DDevice()->CreateFence( - _frontendFenceValue, D3D11_FENCE_FLAG_NONE, IID_PPV_ARGS(&_frontendD3dFence)); - if (FAILED(hr)) { - Logger::Get().ComError("CreateFence 失败", hr); - return false; - } - - _frontendFenceEvent.reset(Win32Utils::SafeHandle(CreateEvent(nullptr, FALSE, FALSE, nullptr))); - if (!_frontendFenceEvent) { - Logger::Get().Win32Error("CreateEvent 失败"); - return false; - } - // 等待后端初始化完成 while (true) { { @@ -71,7 +58,7 @@ bool Renderer::Initialize(HWND hwndSrc, HWND hwndScaling, const ScalingOptions& } // 获取共享纹理 - hr = _frontendResources.GetD3DDevice()->OpenSharedResource( + HRESULT hr = _frontendResources.GetD3DDevice()->OpenSharedResource( _sharedTextureHandle, IID_PPV_ARGS(_frontendSharedTexture.put())); if (FAILED(hr)) { Logger::Get().ComError("OpenSharedResource 失败", hr); @@ -257,18 +244,6 @@ void Renderer::Render(HCURSOR hCursor, POINT cursorPos) noexcept { // 丢弃渲染目标的内容。仅当现有内容将被完全覆盖时,此操作才有效 d3dDC->DiscardView(backBufferRtv); - - hr = d3dDC->Signal(_frontendD3dFence.get(), ++_frontendFenceValue); - if (FAILED(hr)) { - return; - } - hr = _frontendD3dFence->SetEventOnCompletion(_frontendFenceValue, _frontendFenceEvent.get()); - if (FAILED(hr)) { - return; - } - - // 等待渲染完成以最大程度的降低延迟。前端渲染非常廉价,相比性能我们更关心延迟 - WaitForSingleObject(_frontendFenceEvent.get(), INFINITE); } bool Renderer::_InitFrameSource(const ScalingOptions& options) noexcept { @@ -496,14 +471,14 @@ void Renderer::_BackendThreadProc(const ScalingOptions& options) noexcept { } HRESULT hr = _backendResources.GetD3DDevice()->CreateFence( - _backendFenceValue, D3D11_FENCE_FLAG_NONE, IID_PPV_ARGS(&_backendD3dFence)); + _fenceValue, D3D11_FENCE_FLAG_NONE, IID_PPV_ARGS(&_d3dFence)); if (FAILED(hr)) { Logger::Get().ComError("CreateFence 失败", hr); return; } - _backendFenceEvent.reset(Win32Utils::SafeHandle(CreateEvent(nullptr, FALSE, FALSE, nullptr))); - if (!_backendFenceEvent) { + _fenceEvent.reset(Win32Utils::SafeHandle(CreateEvent(nullptr, FALSE, FALSE, nullptr))); + if (!_fenceEvent) { Logger::Get().Win32Error("CreateEvent 失败"); return; } @@ -560,11 +535,11 @@ void Renderer::_BackendRender(ID3D11Texture2D* effectsOutput) noexcept { effectDrawer.Draw(); } - HRESULT hr = d3dDC->Signal(_backendD3dFence.get(), ++_backendFenceValue); + HRESULT hr = d3dDC->Signal(_d3dFence.get(), ++_fenceValue); if (FAILED(hr)) { return; } - hr = _backendD3dFence->SetEventOnCompletion(_backendFenceValue, _backendFenceEvent.get()); + hr = _d3dFence->SetEventOnCompletion(_fenceValue, _fenceEvent.get()); if (FAILED(hr)) { return; } @@ -572,7 +547,7 @@ void Renderer::_BackendRender(ID3D11Texture2D* effectsOutput) noexcept { d3dDC->Flush(); // 等待渲染完成 - WaitForSingleObject(_backendFenceEvent.get(), INFINITE); + WaitForSingleObject(_fenceEvent.get(), INFINITE); // 渲染完成后再更新 _sharedTextureMutexKey,否则前端必须等待,会大幅降低帧率 const uint64_t key = ++_sharedTextureMutexKey; diff --git a/src/Magpie.Core/Renderer.h b/src/Magpie.Core/Renderer.h index 340eac49a..3fa0f8dff 100644 --- a/src/Magpie.Core/Renderer.h +++ b/src/Magpie.Core/Renderer.h @@ -57,10 +57,6 @@ class Renderer { HCURSOR _lastCursorHandle = NULL; POINT _lastCursorPos{ std::numeric_limits::max(), std::numeric_limits::max() }; - winrt::com_ptr _frontendD3dFence; - uint64_t _frontendFenceValue = 0; - Win32Utils::ScopedHandle _frontendFenceEvent; - winrt::com_ptr _frontendSharedTexture; winrt::com_ptr _frontendSharedTextureMutex; RECT _destRect{}; @@ -74,9 +70,9 @@ class Renderer { StepTimer _stepTimer; - winrt::com_ptr _backendD3dFence; - uint64_t _backendFenceValue = 0; - Win32Utils::ScopedHandle _backendFenceEvent; + winrt::com_ptr _d3dFence; + uint64_t _fenceValue = 0; + Win32Utils::ScopedHandle _fenceEvent; winrt::com_ptr _backendSharedTexture; winrt::com_ptr _backendSharedTextureMutex; From 3254aea2673e0bfc343c4fcf7ab01e16ec2f8718 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=97=AD?= Date: Tue, 20 Jun 2023 15:17:12 +0800 Subject: [PATCH 042/155] =?UTF-8?q?feat:=20=E5=88=A0=E9=99=A4=E5=9E=82?= =?UTF-8?q?=E7=9B=B4=E5=90=8C=E6=AD=A5=E9=80=89=E9=A1=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Magpie.App/AppSettings.cpp | 22 +++--- src/Magpie.App/Profile.h | 20 +++--- src/Magpie.App/ProfilePage.xaml | 29 -------- src/Magpie.App/ProfileViewModel.cpp | 30 -------- src/Magpie.App/ProfileViewModel.h | 6 -- src/Magpie.App/ProfileViewModel.idl | 2 - src/Magpie.App/Resources.language-en-US.resw | 6 -- src/Magpie.App/Resources.language-es.resw | 8 +-- src/Magpie.App/Resources.language-ja.resw | 8 +-- src/Magpie.App/Resources.language-ko.resw | 6 -- src/Magpie.App/Resources.language-pt-BR.resw | 6 -- src/Magpie.App/Resources.language-ru.resw | 8 +-- src/Magpie.App/Resources.language-tr.resw | 8 +-- src/Magpie.App/Resources.language-uk.resw | 8 +-- .../Resources.language-zh-Hans.resw | 8 +-- .../Resources.language-zh-Hant.resw | 8 +-- src/Magpie.Core/DeviceResources.cpp | 5 -- src/Magpie.Core/ScalingOptions.h | 68 +++++++++---------- 18 files changed, 55 insertions(+), 201 deletions(-) diff --git a/src/Magpie.App/AppSettings.cpp b/src/Magpie.App/AppSettings.cpp index 13a8fb77a..8358bc52a 100644 --- a/src/Magpie.App/AppSettings.cpp +++ b/src/Magpie.App/AppSettings.cpp @@ -89,10 +89,6 @@ static void WriteProfile(rapidjson::PrettyWriter& write writer.Bool(profile.Is3DGameMode()); writer.Key("showFPS"); writer.Bool(profile.IsShowFPS()); - writer.Key("VSync"); - writer.Bool(profile.IsVSync()); - writer.Key("tripleBuffering"); - writer.Bool(profile.IsTripleBuffering()); writer.Key("captureTitleBar"); writer.Bool(profile.IsCaptureTitleBar()); writer.Key("adjustCursorSpeed"); @@ -758,18 +754,16 @@ bool AppSettings::_LoadProfile( profile.graphicsCard = (int)graphicsAdater - 1; } - JsonHelper::ReadBoolFlag(profileObj, "disableWindowResizing", MagFlags::DisableWindowResizing, profile.flags); - JsonHelper::ReadBoolFlag(profileObj, "3DGameMode", MagFlags::Is3DGameMode, profile.flags); - JsonHelper::ReadBoolFlag(profileObj, "showFPS", MagFlags::ShowFPS, profile.flags); - JsonHelper::ReadBoolFlag(profileObj, "VSync", MagFlags::VSync, profile.flags); - JsonHelper::ReadBoolFlag(profileObj, "tripleBuffering", MagFlags::TripleBuffering, profile.flags); - if (!JsonHelper::ReadBoolFlag(profileObj, "captureTitleBar", MagFlags::CaptureTitleBar, profile.flags, true)) { + JsonHelper::ReadBoolFlag(profileObj, "disableWindowResizing", ScalingFlags::DisableWindowResizing, profile.flags); + JsonHelper::ReadBoolFlag(profileObj, "3DGameMode", ScalingFlags::Is3DGameMode, profile.flags); + JsonHelper::ReadBoolFlag(profileObj, "showFPS", ScalingFlags::ShowFPS, profile.flags); + if (!JsonHelper::ReadBoolFlag(profileObj, "captureTitleBar", ScalingFlags::CaptureTitleBar, profile.flags, true)) { // v0.10.0-preview1 使用 reserveTitleBar - JsonHelper::ReadBoolFlag(profileObj, "reserveTitleBar", MagFlags::CaptureTitleBar, profile.flags); + JsonHelper::ReadBoolFlag(profileObj, "reserveTitleBar", ScalingFlags::CaptureTitleBar, profile.flags); } - JsonHelper::ReadBoolFlag(profileObj, "adjustCursorSpeed", MagFlags::AdjustCursorSpeed, profile.flags); - JsonHelper::ReadBoolFlag(profileObj, "drawCursor", MagFlags::DrawCursor, profile.flags); - JsonHelper::ReadBoolFlag(profileObj, "disableDirectFlip", MagFlags::DisableDirectFlip, profile.flags); + JsonHelper::ReadBoolFlag(profileObj, "adjustCursorSpeed", ScalingFlags::AdjustCursorSpeed, profile.flags); + JsonHelper::ReadBoolFlag(profileObj, "drawCursor", ScalingFlags::DrawCursor, profile.flags); + JsonHelper::ReadBoolFlag(profileObj, "disableDirectFlip", ScalingFlags::DisableDirectFlip, profile.flags); { uint32_t cursorScaling = (uint32_t)CursorScaling::NoScaling; diff --git a/src/Magpie.App/Profile.h b/src/Magpie.App/Profile.h index 135aa0f51..f9284acd8 100644 --- a/src/Magpie.App/Profile.h +++ b/src/Magpie.App/Profile.h @@ -31,15 +31,13 @@ struct Profile { flags = other.flags; } - DEFINE_FLAG_ACCESSOR(IsDisableWindowResizing, ::Magpie::Core::MagFlags::DisableWindowResizing, flags) - DEFINE_FLAG_ACCESSOR(Is3DGameMode, ::Magpie::Core::MagFlags::Is3DGameMode, flags) - DEFINE_FLAG_ACCESSOR(IsShowFPS, ::Magpie::Core::MagFlags::ShowFPS, flags) - DEFINE_FLAG_ACCESSOR(IsVSync, ::Magpie::Core::MagFlags::VSync, flags) - DEFINE_FLAG_ACCESSOR(IsTripleBuffering, ::Magpie::Core::MagFlags::TripleBuffering, flags) - DEFINE_FLAG_ACCESSOR(IsCaptureTitleBar, ::Magpie::Core::MagFlags::CaptureTitleBar, flags) - DEFINE_FLAG_ACCESSOR(IsAdjustCursorSpeed, ::Magpie::Core::MagFlags::AdjustCursorSpeed, flags) - DEFINE_FLAG_ACCESSOR(IsDrawCursor, ::Magpie::Core::MagFlags::DrawCursor, flags) - DEFINE_FLAG_ACCESSOR(IsDisableDirectFlip, ::Magpie::Core::MagFlags::DisableDirectFlip, flags) + DEFINE_FLAG_ACCESSOR(IsDisableWindowResizing, ::Magpie::Core::ScalingFlags::DisableWindowResizing, flags) + DEFINE_FLAG_ACCESSOR(Is3DGameMode, ::Magpie::Core::ScalingFlags::Is3DGameMode, flags) + DEFINE_FLAG_ACCESSOR(IsShowFPS, ::Magpie::Core::ScalingFlags::ShowFPS, flags) + DEFINE_FLAG_ACCESSOR(IsCaptureTitleBar, ::Magpie::Core::ScalingFlags::CaptureTitleBar, flags) + DEFINE_FLAG_ACCESSOR(IsAdjustCursorSpeed, ::Magpie::Core::ScalingFlags::AdjustCursorSpeed, flags) + DEFINE_FLAG_ACCESSOR(IsDrawCursor, ::Magpie::Core::ScalingFlags::DrawCursor, flags) + DEFINE_FLAG_ACCESSOR(IsDisableDirectFlip, ::Magpie::Core::ScalingFlags::DisableDirectFlip, flags) std::wstring name; @@ -65,9 +63,7 @@ struct Profile { std::wstring launchParameters; - uint32_t flags = ::Magpie::Core::MagFlags::VSync - | ::Magpie::Core::MagFlags::AdjustCursorSpeed - | ::Magpie::Core::MagFlags::DrawCursor; + uint32_t flags = ::Magpie::Core::ScalingFlags::AdjustCursorSpeed | ::Magpie::Core::ScalingFlags::DrawCursor; bool isPackaged = false; bool isCroppingEnabled = false; diff --git a/src/Magpie.App/ProfilePage.xaml b/src/Magpie.App/ProfilePage.xaml index 37d1ba4da..5ac3ec740 100644 --- a/src/Magpie.App/ProfilePage.xaml +++ b/src/Magpie.App/ProfilePage.xaml @@ -252,35 +252,6 @@ - - - - - - - - - - - - - - - - - - - - - diff --git a/src/Magpie.App/ProfileViewModel.cpp b/src/Magpie.App/ProfileViewModel.cpp index bb4b5dad3..98f6eb4f5 100644 --- a/src/Magpie.App/ProfileViewModel.cpp +++ b/src/Magpie.App/ProfileViewModel.cpp @@ -551,36 +551,6 @@ void ProfileViewModel::IsShowFPS(bool value) { AppSettings::Get().SaveAsync(); } -bool ProfileViewModel::IsVSync() const noexcept { - return _data->IsVSync(); -} - -void ProfileViewModel::IsVSync(bool value) { - if (_data->IsVSync() == value) { - return; - } - - _data->IsVSync(value); - _propertyChangedEvent(*this, PropertyChangedEventArgs(L"IsVSync")); - - AppSettings::Get().SaveAsync(); -} - -bool ProfileViewModel::IsTripleBuffering() const noexcept { - return _data->IsTripleBuffering(); -} - -void ProfileViewModel::IsTripleBuffering(bool value) { - if (_data->IsTripleBuffering() == value) { - return; - } - - _data->IsTripleBuffering(value); - _propertyChangedEvent(*this, PropertyChangedEventArgs(L"IsTripleBuffering")); - - AppSettings::Get().SaveAsync(); -} - bool ProfileViewModel::IsDisableWindowResizing() const noexcept { return _data->IsDisableWindowResizing(); } diff --git a/src/Magpie.App/ProfileViewModel.h b/src/Magpie.App/ProfileViewModel.h index 501a8fe93..b681b9d8d 100644 --- a/src/Magpie.App/ProfileViewModel.h +++ b/src/Magpie.App/ProfileViewModel.h @@ -97,12 +97,6 @@ struct ProfileViewModel : ProfileViewModelT { bool IsShowFPS() const noexcept; void IsShowFPS(bool value); - bool IsVSync() const noexcept; - void IsVSync(bool value); - - bool IsTripleBuffering() const noexcept; - void IsTripleBuffering(bool value); - bool IsDisableWindowResizing() const noexcept; void IsDisableWindowResizing(bool value); diff --git a/src/Magpie.App/ProfileViewModel.idl b/src/Magpie.App/ProfileViewModel.idl index f02dab9ce..2e58f2743 100644 --- a/src/Magpie.App/ProfileViewModel.idl +++ b/src/Magpie.App/ProfileViewModel.idl @@ -42,8 +42,6 @@ namespace Magpie.App { Boolean IsShowGraphicsCardSettingsCard { get; }; Boolean IsShowFPS; - Boolean IsVSync; - Boolean IsTripleBuffering; Boolean IsDisableWindowResizing; Boolean IsCaptureTitleBar; Boolean CanCaptureTitleBar { get; }; diff --git a/src/Magpie.App/Resources.language-en-US.resw b/src/Magpie.App/Resources.language-en-US.resw index 1ec92c7db..d707d36df 100644 --- a/src/Magpie.App/Resources.language-en-US.resw +++ b/src/Magpie.App/Resources.language-en-US.resw @@ -522,12 +522,6 @@ Display FPS counter - - Allow extra latency to improve performance - - - VSync - Feedback diff --git a/src/Magpie.App/Resources.language-es.resw b/src/Magpie.App/Resources.language-es.resw index 918c4a95e..ca39e1587 100644 --- a/src/Magpie.App/Resources.language-es.resw +++ b/src/Magpie.App/Resources.language-es.resw @@ -59,7 +59,7 @@ : using a System.ComponentModel.TypeConverter : and then encoded with base64 encoding. --> - + @@ -411,12 +411,6 @@ Mostrar contador de FPS - - Permitir latencia adicional para mejorar el rendimiento - - - VSync - Reportar un error diff --git a/src/Magpie.App/Resources.language-ja.resw b/src/Magpie.App/Resources.language-ja.resw index 3aae359c6..249631493 100644 --- a/src/Magpie.App/Resources.language-ja.resw +++ b/src/Magpie.App/Resources.language-ja.resw @@ -59,7 +59,7 @@ : using a System.ComponentModel.TypeConverter : and then encoded with base64 encoding. --> - + @@ -441,12 +441,6 @@ フレームレートを表示する - - 遅延を許容してパフォーマンスを向上させる - - - 垂直同期 - フィードバック diff --git a/src/Magpie.App/Resources.language-ko.resw b/src/Magpie.App/Resources.language-ko.resw index 68cc41977..b4385a351 100644 --- a/src/Magpie.App/Resources.language-ko.resw +++ b/src/Magpie.App/Resources.language-ko.resw @@ -126,9 +126,6 @@ 삭제 - - 수직동기화 - 버그 제보 @@ -664,9 +661,6 @@ 너비(픽셀) - - 지연 시간이 늘어나지만 성능 향상 - 업데이트를 자동으로 확인 diff --git a/src/Magpie.App/Resources.language-pt-BR.resw b/src/Magpie.App/Resources.language-pt-BR.resw index 9b5b240ff..08ebae975 100644 --- a/src/Magpie.App/Resources.language-pt-BR.resw +++ b/src/Magpie.App/Resources.language-pt-BR.resw @@ -342,9 +342,6 @@ Exibir contador de FPS - - Permitir latência extra em troca de melhor desempenho - Feedback @@ -564,9 +561,6 @@ Mover para baixo - - VSync - Falha ao procurar por atualizações, tente novamente mais tarde diff --git a/src/Magpie.App/Resources.language-ru.resw b/src/Magpie.App/Resources.language-ru.resw index 84da3ea20..c6fd04488 100644 --- a/src/Magpie.App/Resources.language-ru.resw +++ b/src/Magpie.App/Resources.language-ru.resw @@ -59,7 +59,7 @@ : using a System.ComponentModel.TypeConverter : and then encoded with base64 encoding. --> - + @@ -486,9 +486,6 @@ Монитор, ближайший к исходному окну - - Разрешить дополнительную задержку для повышения производительности - Мониторы, пересекаемые исходным окном @@ -549,9 +546,6 @@ Показать счётчик кадров в секунду - - Вертикальная синхронизация - Обратная связь diff --git a/src/Magpie.App/Resources.language-tr.resw b/src/Magpie.App/Resources.language-tr.resw index 2ba0eccfe..e98c3b4d0 100644 --- a/src/Magpie.App/Resources.language-tr.resw +++ b/src/Magpie.App/Resources.language-tr.resw @@ -59,7 +59,7 @@ : using a System.ComponentModel.TypeConverter : and then encoded with base64 encoding. --> - + @@ -171,9 +171,6 @@ Sağ - - VSync dikey eşitleyici - Aktivasyon @@ -504,9 +501,6 @@ FPS sayacını görüntüle - - Performansı artırmak için fazladan gecikmeye izin ver - Geri bildirim diff --git a/src/Magpie.App/Resources.language-uk.resw b/src/Magpie.App/Resources.language-uk.resw index a741de79c..906967e1c 100644 --- a/src/Magpie.App/Resources.language-uk.resw +++ b/src/Magpie.App/Resources.language-uk.resw @@ -59,7 +59,7 @@ : using a System.ComponentModel.TypeConverter : and then encoded with base64 encoding. --> - + @@ -426,12 +426,6 @@ Відображення лічильника FPS - - Дозволити додаткову затримку для підвищення продуктивності - - - Вертикальна синхронізація - Зворотній зв'язок diff --git a/src/Magpie.App/Resources.language-zh-Hans.resw b/src/Magpie.App/Resources.language-zh-Hans.resw index 9ff61aa4d..c40f58daf 100644 --- a/src/Magpie.App/Resources.language-zh-Hans.resw +++ b/src/Magpie.App/Resources.language-zh-Hans.resw @@ -59,7 +59,7 @@ : using a System.ComponentModel.TypeConverter : and then encoded with base64 encoding. --> - + @@ -522,12 +522,6 @@ 显示帧率 - - 允许额外的延迟以提高性能 - - - 垂直同步 - 反馈 diff --git a/src/Magpie.App/Resources.language-zh-Hant.resw b/src/Magpie.App/Resources.language-zh-Hant.resw index acbe365bf..35699d7e7 100644 --- a/src/Magpie.App/Resources.language-zh-Hant.resw +++ b/src/Magpie.App/Resources.language-zh-Hant.resw @@ -59,7 +59,7 @@ : using a System.ComponentModel.TypeConverter : and then encoded with base64 encoding. --> - + @@ -468,12 +468,6 @@ 顯示畫面幀數 - - 允許額外的延遲以提高效能 - - - 垂直同步 - 回饋 diff --git a/src/Magpie.Core/DeviceResources.cpp b/src/Magpie.Core/DeviceResources.cpp index 635cefbd4..e96c070c8 100644 --- a/src/Magpie.Core/DeviceResources.cpp +++ b/src/Magpie.Core/DeviceResources.cpp @@ -30,11 +30,6 @@ bool DeviceResources::Initialize(const ScalingOptions& options) noexcept { _isSupportTearing = supportTearing; Logger::Get().Info(fmt::format("可变刷新率支持:{}", supportTearing ? "是" : "否")); - if (!options.IsVSync() && !supportTearing) { - Logger::Get().Error("当前显示器不支持可变刷新率"); - return false; - } - if (!_ObtainAdapterAndDevice(options.graphicsCard)) { Logger::Get().Error("找不到可用的图形适配器"); return false; diff --git a/src/Magpie.Core/ScalingOptions.h b/src/Magpie.Core/ScalingOptions.h index a3b42a9ba..a0d430f6c 100644 --- a/src/Magpie.Core/ScalingOptions.h +++ b/src/Magpie.Core/ScalingOptions.h @@ -28,23 +28,21 @@ struct Cropping { float Bottom; }; -struct MagFlags { - static constexpr const uint32_t DisableWindowResizing = 0x1; - static constexpr const uint32_t BreakpointMode = 0x2; - static constexpr const uint32_t DisableEffectCache = 0x4; - static constexpr const uint32_t SaveEffectSources = 0x8; - static constexpr const uint32_t WarningsAreErrors = 0x10; - static constexpr const uint32_t SimulateExclusiveFullscreen = 0x20; - static constexpr const uint32_t Is3DGameMode = 0x40; - static constexpr const uint32_t ShowFPS = 0x80; - static constexpr const uint32_t VSync = 0x100; - static constexpr const uint32_t TripleBuffering = 0x200; - static constexpr const uint32_t CaptureTitleBar = 0x400; - static constexpr const uint32_t AdjustCursorSpeed = 0x800; - static constexpr const uint32_t DrawCursor = 0x1000; - static constexpr const uint32_t DisableDirectFlip = 0x2000; - static constexpr const uint32_t DisableFontCache = 0x4000; - static constexpr const uint32_t AllowScalingMaximized = 0x8000; +struct ScalingFlags { + static constexpr const uint32_t DisableWindowResizing = 1; + static constexpr const uint32_t BreakpointMode = 1 << 1; + static constexpr const uint32_t DisableEffectCache = 1 << 2; + static constexpr const uint32_t SaveEffectSources = 1 << 3; + static constexpr const uint32_t WarningsAreErrors = 1 << 4; + static constexpr const uint32_t SimulateExclusiveFullscreen = 1 << 5; + static constexpr const uint32_t Is3DGameMode = 1 << 6; + static constexpr const uint32_t ShowFPS = 1 << 7; + static constexpr const uint32_t CaptureTitleBar = 1 << 10; + static constexpr const uint32_t AdjustCursorSpeed = 1 << 11; + static constexpr const uint32_t DrawCursor = 1 << 12; + static constexpr const uint32_t DisableDirectFlip = 1 << 13; + static constexpr const uint32_t DisableFontCache = 1 << 14; + static constexpr const uint32_t AllowScalingMaximized = 1 << 15; }; enum class ScalingType { @@ -55,8 +53,8 @@ enum class ScalingType { }; struct EffectOptionFlags { - static constexpr const uint32_t InlineParams = 0x1; - static constexpr const uint32_t FP16 = 0x2; + static constexpr const uint32_t InlineParams = 1; + static constexpr const uint32_t FP16 = 1 << 1; }; struct EffectOption { @@ -73,25 +71,23 @@ struct EffectOption { }; struct ScalingOptions { - DEFINE_FLAG_ACCESSOR(IsDisableWindowResizing, MagFlags::DisableWindowResizing, flags) - DEFINE_FLAG_ACCESSOR(IsDebugMode, MagFlags::BreakpointMode, flags) - DEFINE_FLAG_ACCESSOR(IsDisableEffectCache, MagFlags::DisableEffectCache, flags) - DEFINE_FLAG_ACCESSOR(IsDisableFontCache, MagFlags::DisableFontCache, flags) - DEFINE_FLAG_ACCESSOR(IsSaveEffectSources, MagFlags::SaveEffectSources, flags) - DEFINE_FLAG_ACCESSOR(IsWarningsAreErrors, MagFlags::WarningsAreErrors, flags) - DEFINE_FLAG_ACCESSOR(IsAllowScalingMaximized, MagFlags::AllowScalingMaximized, flags) - DEFINE_FLAG_ACCESSOR(IsSimulateExclusiveFullscreen, MagFlags::SimulateExclusiveFullscreen, flags) - DEFINE_FLAG_ACCESSOR(Is3DGameMode, MagFlags::Is3DGameMode, flags) - DEFINE_FLAG_ACCESSOR(IsShowFPS, MagFlags::ShowFPS, flags) - DEFINE_FLAG_ACCESSOR(IsVSync, MagFlags::VSync, flags) - DEFINE_FLAG_ACCESSOR(IsTripleBuffering, MagFlags::TripleBuffering, flags) - DEFINE_FLAG_ACCESSOR(IsCaptureTitleBar, MagFlags::CaptureTitleBar, flags) - DEFINE_FLAG_ACCESSOR(IsAdjustCursorSpeed, MagFlags::AdjustCursorSpeed, flags) - DEFINE_FLAG_ACCESSOR(IsDrawCursor, MagFlags::DrawCursor, flags) - DEFINE_FLAG_ACCESSOR(IsDisableDirectFlip, MagFlags::DisableDirectFlip, flags) + DEFINE_FLAG_ACCESSOR(IsDisableWindowResizing, ScalingFlags::DisableWindowResizing, flags) + DEFINE_FLAG_ACCESSOR(IsDebugMode, ScalingFlags::BreakpointMode, flags) + DEFINE_FLAG_ACCESSOR(IsDisableEffectCache, ScalingFlags::DisableEffectCache, flags) + DEFINE_FLAG_ACCESSOR(IsDisableFontCache, ScalingFlags::DisableFontCache, flags) + DEFINE_FLAG_ACCESSOR(IsSaveEffectSources, ScalingFlags::SaveEffectSources, flags) + DEFINE_FLAG_ACCESSOR(IsWarningsAreErrors, ScalingFlags::WarningsAreErrors, flags) + DEFINE_FLAG_ACCESSOR(IsAllowScalingMaximized, ScalingFlags::AllowScalingMaximized, flags) + DEFINE_FLAG_ACCESSOR(IsSimulateExclusiveFullscreen, ScalingFlags::SimulateExclusiveFullscreen, flags) + DEFINE_FLAG_ACCESSOR(Is3DGameMode, ScalingFlags::Is3DGameMode, flags) + DEFINE_FLAG_ACCESSOR(IsShowFPS, ScalingFlags::ShowFPS, flags) + DEFINE_FLAG_ACCESSOR(IsCaptureTitleBar, ScalingFlags::CaptureTitleBar, flags) + DEFINE_FLAG_ACCESSOR(IsAdjustCursorSpeed, ScalingFlags::AdjustCursorSpeed, flags) + DEFINE_FLAG_ACCESSOR(IsDrawCursor, ScalingFlags::DrawCursor, flags) + DEFINE_FLAG_ACCESSOR(IsDisableDirectFlip, ScalingFlags::DisableDirectFlip, flags) Cropping cropping{}; - uint32_t flags = MagFlags::VSync | MagFlags::AdjustCursorSpeed | MagFlags::DrawCursor; // MagFlags + uint32_t flags = ScalingFlags::AdjustCursorSpeed | ScalingFlags::DrawCursor; // ScalingFlags int graphicsCard = -1; float cursorScaling = 1.0f; CaptureMethod captureMethod = CaptureMethod::GraphicsCapture; From 5e3a206af44c58695cbd8c46f239d5a198d7f7fd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=97=AD?= <34770031+Blinue@users.noreply.github.com> Date: Tue, 20 Jun 2023 20:06:11 +0800 Subject: [PATCH 043/155] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E5=B8=A7?= =?UTF-8?q?=E7=8E=87=E9=99=90=E5=88=B6=E9=80=89=E9=A1=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Magpie.App/ProfilePage.xaml | 30 +++++++++++++++++++ src/Magpie.App/Resources.language-en-US.resw | 6 ++++ .../Resources.language-zh-Hans.resw | 6 ++++ 3 files changed, 42 insertions(+) diff --git a/src/Magpie.App/ProfilePage.xaml b/src/Magpie.App/ProfilePage.xaml index 5ac3ec740..92dac8597 100644 --- a/src/Magpie.App/ProfilePage.xaml +++ b/src/Magpie.App/ProfilePage.xaml @@ -252,6 +252,36 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/Magpie.App/Resources.language-en-US.resw b/src/Magpie.App/Resources.language-en-US.resw index d707d36df..098d50694 100644 --- a/src/Magpie.App/Resources.language-en-US.resw +++ b/src/Magpie.App/Resources.language-en-US.resw @@ -826,4 +826,10 @@ Scale the foreground window or stop scaling + + Frame rate limiter + + + Maximum frame rate + \ No newline at end of file diff --git a/src/Magpie.App/Resources.language-zh-Hans.resw b/src/Magpie.App/Resources.language-zh-Hans.resw index c40f58daf..fdf598ce7 100644 --- a/src/Magpie.App/Resources.language-zh-Hans.resw +++ b/src/Magpie.App/Resources.language-zh-Hans.resw @@ -826,4 +826,10 @@ 缩放前台窗口或停止缩放 + + 帧率限制 + + + 最大帧率 + \ No newline at end of file From 900cadf0952a0be6d18ab833bc3ee7484f073215 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=97=AD?= <34770031+Blinue@users.noreply.github.com> Date: Tue, 20 Jun 2023 21:37:57 +0800 Subject: [PATCH 044/155] =?UTF-8?q?feat:=20=E5=AE=9E=E7=8E=B0=E5=B8=A7?= =?UTF-8?q?=E7=8E=87=E9=99=90=E5=88=B6=E9=80=89=E9=A1=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Magpie.App/AppSettings.cpp | 11 +++ src/Magpie.App/Profile.h | 6 ++ src/Magpie.App/ProfilePage.xaml | 12 ++- src/Magpie.App/ProfileViewModel.cpp | 111 ++++++++++++++++++---------- src/Magpie.App/ProfileViewModel.h | 6 ++ src/Magpie.App/ProfileViewModel.idl | 3 + src/Magpie.App/ScalingService.cpp | 3 + src/Magpie.Core/Renderer.cpp | 2 +- src/Magpie.Core/ScalingOptions.h | 1 + 9 files changed, 112 insertions(+), 43 deletions(-) diff --git a/src/Magpie.App/AppSettings.cpp b/src/Magpie.App/AppSettings.cpp index 8358bc52a..2e1e4f2cc 100644 --- a/src/Magpie.App/AppSettings.cpp +++ b/src/Magpie.App/AppSettings.cpp @@ -80,8 +80,13 @@ static void WriteProfile(rapidjson::PrettyWriter& write writer.Uint((uint32_t)profile.captureMethod); writer.Key("multiMonitorUsage"); writer.Uint((uint32_t)profile.multiMonitorUsage); + writer.Key("graphicsCard"); writer.Int(profile.graphicsCard); + writer.Key("frameRateLimiterEnabled"); + writer.Bool(profile.isFrameRateLimiterEnabled); + writer.Key("maxFrameRate"); + writer.Double(profile.maxFrameRate); writer.Key("disableWindowResizing"); writer.Bool(profile.IsDisableWindowResizing()); @@ -754,6 +759,12 @@ bool AppSettings::_LoadProfile( profile.graphicsCard = (int)graphicsAdater - 1; } + JsonHelper::ReadBool(profileObj, "frameRateLimiterEnabled", profile.isFrameRateLimiterEnabled); + JsonHelper::ReadFloat(profileObj, "maxFrameRate", profile.maxFrameRate); + if (profile.maxFrameRate < 10.0f || profile.maxFrameRate > 1000.0f) { + profile.maxFrameRate = 60.0f; + } + JsonHelper::ReadBoolFlag(profileObj, "disableWindowResizing", ScalingFlags::DisableWindowResizing, profile.flags); JsonHelper::ReadBoolFlag(profileObj, "3DGameMode", ScalingFlags::Is3DGameMode, profile.flags); JsonHelper::ReadBoolFlag(profileObj, "showFPS", ScalingFlags::ShowFPS, profile.flags); diff --git a/src/Magpie.App/Profile.h b/src/Magpie.App/Profile.h index f9284acd8..ccd5d74d9 100644 --- a/src/Magpie.App/Profile.h +++ b/src/Magpie.App/Profile.h @@ -25,6 +25,8 @@ struct Profile { cropping = other.cropping; captureMethod = other.captureMethod; graphicsCard = other.graphicsCard; + isFrameRateLimiterEnabled = other.isFrameRateLimiterEnabled; + maxFrameRate = other.maxFrameRate; multiMonitorUsage = other.multiMonitorUsage; cursorInterpolationMode = other.cursorInterpolationMode; launchParameters = other.launchParameters; @@ -61,6 +63,9 @@ struct Profile { ::Magpie::Core::MultiMonitorUsage multiMonitorUsage = ::Magpie::Core::MultiMonitorUsage::Closest; ::Magpie::Core::CursorInterpolationMode cursorInterpolationMode = ::Magpie::Core::CursorInterpolationMode::NearestNeighbor; + // 10~1000 + float maxFrameRate = 60.0f; + std::wstring launchParameters; uint32_t flags = ::Magpie::Core::ScalingFlags::AdjustCursorSpeed | ::Magpie::Core::ScalingFlags::DrawCursor; @@ -68,6 +73,7 @@ struct Profile { bool isPackaged = false; bool isCroppingEnabled = false; bool isAutoScale = false; + bool isFrameRateLimiterEnabled = false; }; } diff --git a/src/Magpie.App/ProfilePage.xaml b/src/Magpie.App/ProfilePage.xaml index 92dac8597..e50b6f9a4 100644 --- a/src/Magpie.App/ProfilePage.xaml +++ b/src/Magpie.App/ProfilePage.xaml @@ -254,6 +254,7 @@ - + @@ -274,7 +276,13 @@ Spacing="8"> + LargeChange="10" + Maximum="1000" + Minimum="10" + NumberFormatter="{x:Bind local:ProfilePage.NumberFormatter, Mode=OneTime}" + SmallChange="1" + SpinButtonPlacementMode="Inline" + Value="{x:Bind ViewModel.MaxFrameRate, Mode=TwoWay}" /> diff --git a/src/Magpie.App/ProfileViewModel.cpp b/src/Magpie.App/ProfileViewModel.cpp index 98f6eb4f5..7f86b015a 100644 --- a/src/Magpie.App/ProfileViewModel.cpp +++ b/src/Magpie.App/ProfileViewModel.cpp @@ -404,9 +404,9 @@ int ProfileViewModel::ScalingMode() const noexcept { void ProfileViewModel::ScalingMode(int value) { _data->scalingMode = value - 1; - _propertyChangedEvent(*this, PropertyChangedEventArgs(L"ScalingMode")); - AppSettings::Get().SaveAsync(); + + _propertyChangedEvent(*this, PropertyChangedEventArgs(L"ScalingMode")); } int ProfileViewModel::CaptureMethod() const noexcept { @@ -448,10 +448,10 @@ void ProfileViewModel::IsAutoScale(bool value) { } _data->isAutoScale = value; - _propertyChangedEvent(*this, PropertyChangedEventArgs(L"IsAutoScale")); - AppSettings::Get().SaveAsync(); + _propertyChangedEvent(*this, PropertyChangedEventArgs(L"IsAutoScale")); + if (value) { // 立即检查前台窗口是否应自动缩放 ScalingService::Get().CheckForeground(); @@ -468,9 +468,9 @@ void ProfileViewModel::Is3DGameMode(bool value) { } _data->Is3DGameMode(value); - _propertyChangedEvent(*this, PropertyChangedEventArgs(L"Is3DGameMode")); - AppSettings::Get().SaveAsync(); + + _propertyChangedEvent(*this, PropertyChangedEventArgs(L"Is3DGameMode")); } bool ProfileViewModel::HasMultipleMonitors() const noexcept { @@ -492,9 +492,9 @@ void ProfileViewModel::MultiMonitorUsage(int value) { } _data->multiMonitorUsage = multiMonitorUsage; - _propertyChangedEvent(*this, PropertyChangedEventArgs(L"MultiMonitorUsage")); - AppSettings::Get().SaveAsync(); + + _propertyChangedEvent(*this, PropertyChangedEventArgs(L"MultiMonitorUsage")); } IVector ProfileViewModel::GraphicsCards() const noexcept { @@ -527,15 +527,46 @@ void ProfileViewModel::GraphicsCard(int value) { } _data->graphicsCard = value; - _propertyChangedEvent(*this, PropertyChangedEventArgs(L"GraphicsCard")); - AppSettings::Get().SaveAsync(); + + _propertyChangedEvent(*this, PropertyChangedEventArgs(L"GraphicsCard")); } bool ProfileViewModel::IsShowGraphicsCardSettingsCard() const noexcept { return _graphicsCards.size() > 1; } +bool ProfileViewModel::IsFrameRateLimiterEnabled() const noexcept { + return _data->isFrameRateLimiterEnabled; +} + +void ProfileViewModel::IsFrameRateLimiterEnabled(bool value) { + if (_data->isFrameRateLimiterEnabled == value) { + return; + } + + _data->isFrameRateLimiterEnabled = value; + AppSettings::Get().SaveAsync(); + + _propertyChangedEvent(*this, PropertyChangedEventArgs(L"IsFrameRateLimiterEnabled")); +} + +double ProfileViewModel::MaxFrameRate() const noexcept { + return _data->maxFrameRate; +} + +void ProfileViewModel::MaxFrameRate(double value) { + if (_data->maxFrameRate == value) { + return; + } + + // 用户已清空数字框则重置为 60 + _data->maxFrameRate = std::isnan(value) ? 60.0f : (float)value; + AppSettings::Get().SaveAsync(); + + _propertyChangedEvent(*this, PropertyChangedEventArgs(L"MaxFrameRate")); +} + bool ProfileViewModel::IsShowFPS() const noexcept { return _data->IsShowFPS(); } @@ -546,9 +577,9 @@ void ProfileViewModel::IsShowFPS(bool value) { } _data->IsShowFPS(value); - _propertyChangedEvent(*this, PropertyChangedEventArgs(L"IsShowFPS")); - AppSettings::Get().SaveAsync(); + + _propertyChangedEvent(*this, PropertyChangedEventArgs(L"IsShowFPS")); } bool ProfileViewModel::IsDisableWindowResizing() const noexcept { @@ -561,9 +592,9 @@ void ProfileViewModel::IsDisableWindowResizing(bool value) { } _data->IsDisableWindowResizing(value); - _propertyChangedEvent(*this, PropertyChangedEventArgs(L"IsDisableWindowResizing")); - AppSettings::Get().SaveAsync(); + + _propertyChangedEvent(*this, PropertyChangedEventArgs(L"IsDisableWindowResizing")); } bool ProfileViewModel::IsCaptureTitleBar() const noexcept { @@ -576,9 +607,9 @@ void ProfileViewModel::IsCaptureTitleBar(bool value) { } _data->IsCaptureTitleBar(value); - _propertyChangedEvent(*this, PropertyChangedEventArgs(L"IsCaptureTitleBar")); - AppSettings::Get().SaveAsync(); + + _propertyChangedEvent(*this, PropertyChangedEventArgs(L"IsCaptureTitleBar")); } bool ProfileViewModel::CanCaptureTitleBar() const noexcept { @@ -596,9 +627,9 @@ void ProfileViewModel::IsCroppingEnabled(bool value) { } _data->isCroppingEnabled = value; - _propertyChangedEvent(*this, PropertyChangedEventArgs(L"IsCroppingEnabled")); - AppSettings::Get().SaveAsync(); + + _propertyChangedEvent(*this, PropertyChangedEventArgs(L"IsCroppingEnabled")); } double ProfileViewModel::CroppingLeft() const noexcept { @@ -611,9 +642,9 @@ void ProfileViewModel::CroppingLeft(double value) { } _data->cropping.Left = std::isnan(value) ? 0.0f : (float)value; - _propertyChangedEvent(*this, PropertyChangedEventArgs(L"CroppingLeft")); - AppSettings::Get().SaveAsync(); + + _propertyChangedEvent(*this, PropertyChangedEventArgs(L"CroppingLeft")); } double ProfileViewModel::CroppingTop() const noexcept { @@ -627,9 +658,9 @@ void ProfileViewModel::CroppingTop(double value) { // 用户已清空数字框则重置为 0 _data->cropping.Top = std::isnan(value) ? 0.0f : (float)value; - _propertyChangedEvent(*this, PropertyChangedEventArgs(L"CroppingTop")); - AppSettings::Get().SaveAsync(); + + _propertyChangedEvent(*this, PropertyChangedEventArgs(L"CroppingTop")); } double ProfileViewModel::CroppingRight() const noexcept { @@ -642,9 +673,9 @@ void ProfileViewModel::CroppingRight(double value) { } _data->cropping.Right = std::isnan(value) ? 0.0f : (float)value; - _propertyChangedEvent(*this, PropertyChangedEventArgs(L"CroppingRight")); - AppSettings::Get().SaveAsync(); + + _propertyChangedEvent(*this, PropertyChangedEventArgs(L"CroppingRight")); } double ProfileViewModel::CroppingBottom() const noexcept { @@ -657,9 +688,9 @@ void ProfileViewModel::CroppingBottom(double value) { } _data->cropping.Bottom = std::isnan(value) ? 0.0f : (float)value; - _propertyChangedEvent(*this, PropertyChangedEventArgs(L"CroppingBottom")); - AppSettings::Get().SaveAsync(); + + _propertyChangedEvent(*this, PropertyChangedEventArgs(L"CroppingBottom")); } bool ProfileViewModel::IsAdjustCursorSpeed() const noexcept { @@ -672,9 +703,9 @@ void ProfileViewModel::IsAdjustCursorSpeed(bool value) { } _data->IsAdjustCursorSpeed(value); - _propertyChangedEvent(*this, PropertyChangedEventArgs(L"IsAdjustCursorSpeed")); - AppSettings::Get().SaveAsync(); + + _propertyChangedEvent(*this, PropertyChangedEventArgs(L"IsAdjustCursorSpeed")); } bool ProfileViewModel::IsDrawCursor() const noexcept { @@ -687,9 +718,9 @@ void ProfileViewModel::IsDrawCursor(bool value) { } _data->IsDrawCursor(value); - _propertyChangedEvent(*this, PropertyChangedEventArgs(L"IsDrawCursor")); - AppSettings::Get().SaveAsync(); + + _propertyChangedEvent(*this, PropertyChangedEventArgs(L"IsDrawCursor")); } int ProfileViewModel::CursorScaling() const noexcept { @@ -707,9 +738,9 @@ void ProfileViewModel::CursorScaling(int value) { } _data->cursorScaling = cursorScaling; - _propertyChangedEvent(*this, PropertyChangedEventArgs(L"CursorScaling")); - AppSettings::Get().SaveAsync(); + + _propertyChangedEvent(*this, PropertyChangedEventArgs(L"CursorScaling")); } double ProfileViewModel::CustomCursorScaling() const noexcept { @@ -722,9 +753,9 @@ void ProfileViewModel::CustomCursorScaling(double value) { } _data->customCursorScaling = std::isnan(value) ? 1.0f : (float)value; - _propertyChangedEvent(*this, PropertyChangedEventArgs(L"CustomCursorScaling")); - AppSettings::Get().SaveAsync(); + + _propertyChangedEvent(*this, PropertyChangedEventArgs(L"CustomCursorScaling")); } int ProfileViewModel::CursorInterpolationMode() const noexcept { @@ -742,9 +773,9 @@ void ProfileViewModel::CursorInterpolationMode(int value) { } _data->cursorInterpolationMode = cursorInterpolationMode; - _propertyChangedEvent(*this, PropertyChangedEventArgs(L"CursorInterpolationMode")); - AppSettings::Get().SaveAsync(); + + _propertyChangedEvent(*this, PropertyChangedEventArgs(L"CursorInterpolationMode")); } hstring ProfileViewModel::LaunchParameters() const noexcept { @@ -755,9 +786,9 @@ void ProfileViewModel::LaunchParameters(const hstring& value) { std::wstring_view trimmed(value); StrUtils::Trim(trimmed); _data->launchParameters = trimmed; - _propertyChangedEvent(*this, PropertyChangedEventArgs(L"LaunchParameters")); - AppSettings::Get().SaveAsync(); + + _propertyChangedEvent(*this, PropertyChangedEventArgs(L"LaunchParameters")); } void ProfileViewModel::IsEditingLaunchParameters(bool value) { @@ -779,9 +810,9 @@ void ProfileViewModel::IsDisableDirectFlip(bool value) { } _data->IsDisableDirectFlip(value); - _propertyChangedEvent(*this, PropertyChangedEventArgs(L"IsDisableDirectFlip")); - AppSettings::Get().SaveAsync(); + + _propertyChangedEvent(*this, PropertyChangedEventArgs(L"IsDisableDirectFlip")); } fire_and_forget ProfileViewModel::_LoadIcon(FrameworkElement const& mainPage) { diff --git a/src/Magpie.App/ProfileViewModel.h b/src/Magpie.App/ProfileViewModel.h index b681b9d8d..44a1b45fc 100644 --- a/src/Magpie.App/ProfileViewModel.h +++ b/src/Magpie.App/ProfileViewModel.h @@ -94,6 +94,12 @@ struct ProfileViewModel : ProfileViewModelT { bool IsShowGraphicsCardSettingsCard() const noexcept; + bool IsFrameRateLimiterEnabled() const noexcept; + void IsFrameRateLimiterEnabled(bool value); + + double MaxFrameRate() const noexcept; + void MaxFrameRate(double value); + bool IsShowFPS() const noexcept; void IsShowFPS(bool value); diff --git a/src/Magpie.App/ProfileViewModel.idl b/src/Magpie.App/ProfileViewModel.idl index 2e58f2743..cdf10410f 100644 --- a/src/Magpie.App/ProfileViewModel.idl +++ b/src/Magpie.App/ProfileViewModel.idl @@ -42,6 +42,9 @@ namespace Magpie.App { Boolean IsShowGraphicsCardSettingsCard { get; }; Boolean IsShowFPS; + Boolean IsFrameRateLimiterEnabled; + Double MaxFrameRate; + Boolean IsDisableWindowResizing; Boolean IsCaptureTitleBar; Boolean CanCaptureTitleBar { get; }; diff --git a/src/Magpie.App/ScalingService.cpp b/src/Magpie.App/ScalingService.cpp index 5ed399831..9a3cbe16c 100644 --- a/src/Magpie.App/ScalingService.cpp +++ b/src/Magpie.App/ScalingService.cpp @@ -263,6 +263,9 @@ bool ScalingService::_StartScale(HWND hWnd, const Profile& profile) { options.graphicsCard = profile.graphicsCard; options.captureMethod = profile.captureMethod; + if (profile.isFrameRateLimiterEnabled) { + options.maxFrameRate = profile.maxFrameRate; + } options.multiMonitorUsage = profile.multiMonitorUsage; options.cursorInterpolationMode = profile.cursorInterpolationMode; options.flags = profile.flags; diff --git a/src/Magpie.Core/Renderer.cpp b/src/Magpie.Core/Renderer.cpp index 3bf64823f..07df54761 100644 --- a/src/Magpie.Core/Renderer.cpp +++ b/src/Magpie.Core/Renderer.cpp @@ -455,7 +455,7 @@ void Renderer::_BackendThreadProc(const ScalingOptions& options) noexcept { } } - _stepTimer.Initialize(30.0f); + _stepTimer.Initialize(options.maxFrameRate); if (!_backendResources.Initialize(options)) { return; diff --git a/src/Magpie.Core/ScalingOptions.h b/src/Magpie.Core/ScalingOptions.h index a0d430f6c..55de385c8 100644 --- a/src/Magpie.Core/ScalingOptions.h +++ b/src/Magpie.Core/ScalingOptions.h @@ -89,6 +89,7 @@ struct ScalingOptions { Cropping cropping{}; uint32_t flags = ScalingFlags::AdjustCursorSpeed | ScalingFlags::DrawCursor; // ScalingFlags int graphicsCard = -1; + std::optional maxFrameRate; float cursorScaling = 1.0f; CaptureMethod captureMethod = CaptureMethod::GraphicsCapture; MultiMonitorUsage multiMonitorUsage = MultiMonitorUsage::Closest; From 00f56312c3f451b9e3e24fa9a4106384e396f1c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=97=AD?= <34770031+Blinue@users.noreply.github.com> Date: Thu, 22 Jun 2023 16:20:22 +0800 Subject: [PATCH 045/155] =?UTF-8?q?feat:=20=E6=9B=B4=E6=96=B0=E9=83=A8?= =?UTF-8?q?=E5=88=86=E6=95=88=E6=9E=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Anime4K/Anime4K_3D_AA_Upscale_US.hlsl | 28 ++--- .../Anime4K/Anime4K_3D_Upscale_US.hlsl | 28 ++--- .../Anime4K_Denoise_Bilateral_Mean.hlsl | 22 ++-- .../Anime4K_Denoise_Bilateral_Median.hlsl | 19 ++-- .../Anime4K_Denoise_Bilateral_Mode.hlsl | 28 ++--- src/Effects/Anime4K/Anime4K_Restore_L.hlsl | 103 +++++++++--------- src/Effects/Anime4K/Anime4K_Restore_M.hlsl | 24 ++-- .../Anime4K/Anime4K_Restore_Soft_L.hlsl | 103 +++++++++--------- .../Anime4K/Anime4K_Restore_Soft_M.hlsl | 6 +- .../Anime4K/Anime4K_Restore_Soft_UL.hlsl | 24 ++-- src/Effects/SSimDownscaler.hlsl | 18 ++- src/Magpie.App/ProfilePage.cpp | 2 +- src/Magpie.App/ProfilePage.h | 1 - 13 files changed, 216 insertions(+), 190 deletions(-) diff --git a/src/Effects/Anime4K/Anime4K_3D_AA_Upscale_US.hlsl b/src/Effects/Anime4K/Anime4K_3D_AA_Upscale_US.hlsl index ab3e80dbb..e4dff9cf4 100644 --- a/src/Effects/Anime4K/Anime4K_3D_AA_Upscale_US.hlsl +++ b/src/Effects/Anime4K/Anime4K_3D_AA_Upscale_US.hlsl @@ -2,15 +2,18 @@ // 移植自 https://github.com/bloc97/Anime4K/blob/master/glsl/Upscale/Anime4K_3DGraphics_AA_Upscale_x2_US.glsl //!MAGPIE EFFECT -//!VERSION 3 -//!OUTPUT_WIDTH INPUT_WIDTH * 2 -//!OUTPUT_HEIGHT INPUT_HEIGHT * 2 +//!VERSION 4 //!SORT_NAME Anime4K_3D_Upscale_1 //!TEXTURE Texture2D INPUT; +//!TEXTURE +//!WIDTH INPUT_WIDTH * 2 +//!HEIGHT INPUT_HEIGHT * 2 +Texture2D OUTPUT; + //!SAMPLER //!FILTER POINT SamplerState sam; @@ -175,13 +178,15 @@ void Pass2(uint2 blockStart, uint3 threadId) { //!PASS 3 //!DESC Conv-4x3x3x4, Depth-to-Space //!IN INPUT, tex2 +//!OUT OUTPUT //!BLOCK_SIZE 16 //!NUM_THREADS 64 void Pass3(uint2 blockStart, uint3 threadId) { uint2 gxy = (Rmp8x8(threadId.x) << 1) + blockStart; - if (!CheckViewport(gxy)) { + const uint2 outputSize = GetOutputSize(); + if (gxy.x >= outputSize.x || gxy.y >= outputSize.y) { return; } @@ -221,24 +226,19 @@ void Pass3(uint2 blockStart, uint3 threadId) { result += float4(-3.1127936e-05, 3.3726166e-05, 4.8580805e-05, -9.541029e-06); pos -= 0.5f * outputPt; - WriteToOutput(gxy, result.x + INPUT.SampleLevel(sam1, pos, 0).rgb); + OUTPUT[gxy] = float4(result.x + INPUT.SampleLevel(sam1, pos, 0).rgb, 1); ++gxy.x; pos.x += outputPt.x; - if (CheckViewport(gxy)) { - WriteToOutput(gxy, result.y + INPUT.SampleLevel(sam1, pos, 0).rgb); - } + OUTPUT[gxy] = float4(result.y + INPUT.SampleLevel(sam1, pos, 0).rgb, 1); + ++gxy.y; pos.y += outputPt.y; - if (CheckViewport(gxy)) { - WriteToOutput(gxy, result.w + INPUT.SampleLevel(sam1, pos, 0).rgb); - } + OUTPUT[gxy] = float4(result.w + INPUT.SampleLevel(sam1, pos, 0).rgb, 1); --gxy.x; pos.x -= outputPt.x; - if (CheckViewport(gxy)) { - WriteToOutput(gxy, result.z + INPUT.SampleLevel(sam1, pos, 0).rgb); - } + OUTPUT[gxy] = float4(result.z + INPUT.SampleLevel(sam1, pos, 0).rgb, 1); } diff --git a/src/Effects/Anime4K/Anime4K_3D_Upscale_US.hlsl b/src/Effects/Anime4K/Anime4K_3D_Upscale_US.hlsl index 783052c3f..03bed730a 100644 --- a/src/Effects/Anime4K/Anime4K_3D_Upscale_US.hlsl +++ b/src/Effects/Anime4K/Anime4K_3D_Upscale_US.hlsl @@ -2,15 +2,18 @@ // 移植自 https://github.com/bloc97/Anime4K/blob/master/glsl/Upscale/Anime4K_3DGraphics_Upscale_x2_US.glsl //!MAGPIE EFFECT -//!VERSION 3 -//!OUTPUT_WIDTH INPUT_WIDTH * 2 -//!OUTPUT_HEIGHT INPUT_HEIGHT * 2 +//!VERSION 4 //!SORT_NAME Anime4K_3D_Upscale_0 //!TEXTURE Texture2D INPUT; +//!TEXTURE +//!WIDTH INPUT_WIDTH * 2 +//!HEIGHT INPUT_HEIGHT * 2 +Texture2D OUTPUT; + //!SAMPLER //!FILTER POINT SamplerState sam; @@ -176,13 +179,15 @@ void Pass2(uint2 blockStart, uint3 threadId) { //!PASS 3 //!DESC Conv-4x3x3x4, Depth-to-Space //!IN INPUT, tex2 +//!OUT OUTPUT //!BLOCK_SIZE 16 //!NUM_THREADS 64 void Pass3(uint2 blockStart, uint3 threadId) { uint2 gxy = (Rmp8x8(threadId.x) << 1) + blockStart; - if (!CheckViewport(gxy)) { + const uint2 outputSize = GetOutputSize(); + if (gxy.x >= outputSize.x || gxy.y >= outputSize.y) { return; } @@ -222,23 +227,18 @@ void Pass3(uint2 blockStart, uint3 threadId) { result += float4(-0.00016697648, -0.00015957489, 0.00017437353, -0.00019393339); pos -= 0.5f * outputPt; - WriteToOutput(gxy, result.x + INPUT.SampleLevel(sam1, pos, 0).rgb); + OUTPUT[gxy] = float4(result.x + INPUT.SampleLevel(sam1, pos, 0).rgb, 1); ++gxy.x; pos.x += outputPt.x; - if (CheckViewport(gxy)) { - WriteToOutput(gxy, result.y + INPUT.SampleLevel(sam1, pos, 0).rgb); - } + OUTPUT[gxy] = float4(result.y + INPUT.SampleLevel(sam1, pos, 0).rgb, 1); + ++gxy.y; pos.y += outputPt.y; - if (CheckViewport(gxy)) { - WriteToOutput(gxy, result.w + INPUT.SampleLevel(sam1, pos, 0).rgb); - } + OUTPUT[gxy] = float4(result.w + INPUT.SampleLevel(sam1, pos, 0).rgb, 1); --gxy.x; pos.x -= outputPt.x; - if (CheckViewport(gxy)) { - WriteToOutput(gxy, result.z + INPUT.SampleLevel(sam1, pos, 0).rgb); - } + OUTPUT[gxy] = float4(result.z + INPUT.SampleLevel(sam1, pos, 0).rgb, 1); } diff --git a/src/Effects/Anime4K/Anime4K_Denoise_Bilateral_Mean.hlsl b/src/Effects/Anime4K/Anime4K_Denoise_Bilateral_Mean.hlsl index de0cba4a5..e6a70f689 100644 --- a/src/Effects/Anime4K/Anime4K_Denoise_Bilateral_Mean.hlsl +++ b/src/Effects/Anime4K/Anime4K_Denoise_Bilateral_Mean.hlsl @@ -3,9 +3,7 @@ //!MAGPIE EFFECT -//!VERSION 3 -//!OUTPUT_WIDTH INPUT_WIDTH -//!OUTPUT_HEIGHT INPUT_HEIGHT +//!VERSION 4 //!PARAMETER @@ -19,6 +17,11 @@ float intensitySigma; //!TEXTURE Texture2D INPUT; +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +Texture2D OUTPUT; + //!SAMPLER //!FILTER POINT SamplerState sam; @@ -26,6 +29,7 @@ SamplerState sam; //!PASS 1 //!IN INPUT +//!OUT OUTPUT //!BLOCK_SIZE 16 //!NUM_THREADS 64 @@ -52,7 +56,9 @@ float gaussian(float x, float rcpS, float m) { void Pass1(uint2 blockStart, uint3 threadId) { uint2 gxy = (Rmp8x8(threadId.x) << 1) + blockStart; - if (!CheckViewport(gxy)) { + + const uint2 outputSize = GetOutputSize(); + if (gxy.x >= outputSize.x || gxy.y >= outputSize.y) { return; } @@ -93,12 +99,6 @@ void Pass1(uint2 blockStart, uint3 threadId) { for (j = 0; j <= 1; ++j) { uint2 destPos = gxy + uint2(i, j); - if (i != 0 || j != 0) { - if (!CheckViewport(gxy)) { - continue; - } - } - float3 sum = 0; float3 n = 0; @@ -118,7 +118,7 @@ void Pass1(uint2 blockStart, uint3 threadId) { } } - WriteToOutput(destPos, sum / n); + OUTPUT[destPos] = float4(sum / n, 1); } } } diff --git a/src/Effects/Anime4K/Anime4K_Denoise_Bilateral_Median.hlsl b/src/Effects/Anime4K/Anime4K_Denoise_Bilateral_Median.hlsl index 57930a710..2cd812b4c 100644 --- a/src/Effects/Anime4K/Anime4K_Denoise_Bilateral_Median.hlsl +++ b/src/Effects/Anime4K/Anime4K_Denoise_Bilateral_Median.hlsl @@ -2,9 +2,7 @@ //!MAGPIE EFFECT -//!VERSION 3 -//!OUTPUT_WIDTH INPUT_WIDTH -//!OUTPUT_HEIGHT INPUT_HEIGHT +//!VERSION 4 //!PARAMETER @@ -18,14 +16,19 @@ float intensitySigma; //!TEXTURE Texture2D INPUT; +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +Texture2D OUTPUT; + //!SAMPLER //!FILTER POINT SamplerState sam; - //!PASS 1 //!IN INPUT +//!OUT OUTPUT //!BLOCK_SIZE 8 //!NUM_THREADS 64 @@ -77,7 +80,9 @@ float3 getMedian(float3 v[KERNELLEN], float w[KERNELLEN], float n) { void Pass1(uint2 blockStart, uint3 threadId) { uint2 gxy = Rmp8x8(threadId.x) + blockStart; - if (!CheckViewport(gxy)) { + + const uint2 outputSize = GetOutputSize(); + if (gxy.x >= outputSize.x || gxy.y >= outputSize.y) { return; } @@ -126,9 +131,9 @@ void Pass1(uint2 blockStart, uint3 threadId) { n += histogram_wn[i]; } - WriteToOutput(gxy, getMedian(histogram_v, histogram_wn, n)); + OUTPUT[gxy] = float4(getMedian(histogram_v, histogram_wn, n), 1); return; } - WriteToOutput(gxy, getMedian(histogram_v, histogram_w, n)); + OUTPUT[gxy] = float4(getMedian(histogram_v, histogram_w, n), 1); } diff --git a/src/Effects/Anime4K/Anime4K_Denoise_Bilateral_Mode.hlsl b/src/Effects/Anime4K/Anime4K_Denoise_Bilateral_Mode.hlsl index 1f2ae5a37..579e3b295 100644 --- a/src/Effects/Anime4K/Anime4K_Denoise_Bilateral_Mode.hlsl +++ b/src/Effects/Anime4K/Anime4K_Denoise_Bilateral_Mode.hlsl @@ -3,14 +3,9 @@ //!MAGPIE EFFECT -//!VERSION 3 -//!OUTPUT_WIDTH INPUT_WIDTH -//!OUTPUT_HEIGHT INPUT_HEIGHT +//!VERSION 4 -//!TEXTURE -Texture2D INPUT; - //!PARAMETER //!LABEL Strength //!DEFAULT 0.1 @@ -19,6 +14,14 @@ Texture2D INPUT; //!STEP 0.01 float intensitySigma; +//!TEXTURE +Texture2D INPUT; + +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +Texture2D OUTPUT; + //!SAMPLER //!FILTER POINT SamplerState sam; @@ -26,6 +29,7 @@ SamplerState sam; //!PASS 1 //!IN INPUT +//!OUT OUTPUT //!BLOCK_SIZE 16 //!NUM_THREADS 64 @@ -52,7 +56,9 @@ float gaussian(float x, float s, float m) { void Pass1(uint2 blockStart, uint3 threadId) { uint2 gxy = (Rmp8x8(threadId.x) << 1) + blockStart; - if (!CheckViewport(gxy)) { + + const uint2 outputSize = GetOutputSize(); + if (gxy.x >= outputSize.x || gxy.y >= outputSize.y) { return; } @@ -84,12 +90,6 @@ void Pass1(uint2 blockStart, uint3 threadId) { for (j = 0; j <= 1; ++j) { const uint2 destPos = gxy + uint2(i, j); - if (i != 0 || j != 0) { - if (!CheckViewport(gxy)) { - continue; - } - } - float3 histogram_v[KERNELLEN]; float histogram_l[KERNELLEN]; float histogram_w[KERNELLEN]; @@ -132,7 +132,7 @@ void Pass1(uint2 blockStart, uint3 threadId) { } } - WriteToOutput(destPos, maxv); + OUTPUT[destPos] = float4(maxv, 1); } } } diff --git a/src/Effects/Anime4K/Anime4K_Restore_L.hlsl b/src/Effects/Anime4K/Anime4K_Restore_L.hlsl index 41a79c1df..8398e2fb3 100644 --- a/src/Effects/Anime4K/Anime4K_Restore_L.hlsl +++ b/src/Effects/Anime4K/Anime4K_Restore_L.hlsl @@ -1,18 +1,17 @@ // 移植自 https://github.com/bloc97/Anime4K/blob/master/glsl/Restore/Anime4K_Restore_CNN_L.glsl //!MAGPIE EFFECT -//!VERSION 3 -//!OUTPUT_WIDTH INPUT_WIDTH -//!OUTPUT_HEIGHT INPUT_HEIGHT +//!VERSION 4 //!SORT_NAME Anime4K_Restore_1 //!TEXTURE Texture2D INPUT; -//!SAMPLER -//!FILTER POINT -SamplerState sam; +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +Texture2D OUTPUT; //!TEXTURE //!WIDTH INPUT_WIDTH @@ -38,6 +37,10 @@ Texture2D tex3; //!FORMAT R16G16B16A16_FLOAT Texture2D tex4; +//!SAMPLER +//!FILTER POINT +SamplerState sam; + //!PASS 1 //!DESC Conv-4x3x3x3 @@ -602,13 +605,15 @@ void Pass4(uint2 blockStart, uint3 threadId) { //!PASS 5 //!DESC Conv-3x3x3x16 //!IN INPUT, tex3, tex4 +//!OUT OUTPUT //!BLOCK_SIZE 8 //!NUM_THREADS 64 void Pass5(uint2 blockStart, uint3 threadId) { uint2 gxy = Rmp8x8(threadId.x) + blockStart; - uint2 inputSize = GetInputSize(); - if (!CheckViewport(gxy)) { + + const uint2 outputSize = GetOutputSize(); + if (gxy.x >= outputSize.x || gxy.y >= outputSize.y) { return; } @@ -638,45 +643,45 @@ void Pass5(uint2 blockStart, uint3 threadId) { float4 h2 = tex4.SampleLevel(sam, pos + float2(inputPt.x, 0), 0); float4 i2 = tex4.SampleLevel(sam, pos + float2(inputPt.x, inputPt.y), 0); - float4 result = mul(max(a1, 0), float4x4(0.012102164, 0.01385959, 0.018815203, 0.0, -0.017435113, -0.04530735, -0.051318135, 0.0, 0.01267727, 0.01400136, 0.017735276, 0.0, 0.012681183, 0.035241637, 0.03990959, 0.0)); - result += mul(max(b1, 0), float4x4(0.16069227, 0.098007366, 0.076831706, 0.0, 0.081593364, 0.017831434, 0.010174303, 0.0, 0.014732323, 0.02229113, 0.029828338, 0.0, 0.0048171813, 0.051809076, 0.055740006, 0.0)); - result += mul(max(c1, 0), float4x4(0.0347963, -0.014327445, -0.024176419, 0.0, 0.003463003, -0.050532356, -0.06565927, 0.0, 0.082851514, 0.10950989, 0.12022889, 0.0, -0.038950548, -0.015094648, -0.0119305095, 0.0)); - result += mul(max(d1, 0), float4x4(-0.11845135, -0.08067485, -0.06981454, 0.0, 0.00058037776, 0.01160575, 0.014900963, 0.0, -0.0374349, -0.052966926, -0.044557698, 0.0, 0.017439643, 0.005496974, -0.0024181441, 0.0)); - result += mul(max(e1, 0), float4x4(-0.1084345, -0.18271221, -0.18795776, 0.0, 0.110637866, 0.08913364, 0.09161146, 0.0, -0.19889367, -0.17172937, -0.1600661, 0.0, -0.03789556, -0.028977778, -0.029903485, 0.0)); - result += mul(max(f1, 0), float4x4(0.017774954, -0.048732057, -0.061161697, 0.0, 0.022389695, -0.013317256, -0.019972157, 0.0, 0.051979035, 0.08774837, 0.09633588, 0.0, -0.047462203, -0.033091765, -0.028352588, 0.0)); - result += mul(max(g1, 0), float4x4(0.022178177, 0.05031684, 0.05802219, 0.0, -0.027539665, -0.020904189, -0.01800042, 0.0, 0.0019531948, 0.00019749763, -0.0013961957, 0.0, 0.024253767, -0.00058503833, 0.0006474611, 0.0)); - result += mul(max(h1, 0), float4x4(0.06707921, 0.0817431, 0.07561426, 0.0, -0.04157211, -0.006174012, -0.003754037, 0.0, 0.0031168605, 0.02320992, 0.026471246, 0.0, 0.0029530525, -0.004939263, -0.0070194793, 0.0)); - result += mul(max(i1, 0), float4x4(0.03383418, 0.042321067, 0.04266926, 0.0, -0.043634403, -0.0182769, -0.011314871, 0.0, -0.050008457, -0.003527757, 0.0035165092, 0.0, -0.00016610099, 0.019936454, 0.022199173, 0.0)); - result += mul(max(a2, 0), float4x4(-0.055203374, -0.03910439, -0.03778927, 0.0, 0.027640847, 0.019469904, 0.0277834, 0.0, -0.026225597, 0.04481541, 0.047454204, 0.0, 0.031545334, 0.019874612, 0.011878432, 0.0)); - result += mul(max(b2, 0), float4x4(0.016088601, -0.045959134, -0.048793618, 0.0, -0.009834776, 0.0077799167, 0.00873151, 0.0, 0.031265914, 0.09698676, 0.10005417, 0.0, 0.039120086, 0.0005542848, -0.0049420255, 0.0)); - result += mul(max(c2, 0), float4x4(0.028432969, -0.014792921, -0.026881924, 0.0, -0.00586326, 0.013427183, 0.018215714, 0.0, -0.013559131, 0.017704675, 0.024854776, 0.0, -0.09087544, -0.104627624, -0.0921747, 0.0)); - result += mul(max(d2, 0), float4x4(-0.022899037, 0.026374351, 0.03145993, 0.0, -0.008008749, -0.0013132087, -0.003957525, 0.0, -0.02490554, 0.0020362549, 0.006453752, 0.0, 0.031494617, 0.049864545, 0.04702567, 0.0)); - result += mul(max(e2, 0), float4x4(-0.12318068, -0.121377476, -0.11615006, 0.0, -0.1321696, -0.078085914, -0.07868927, 0.0, -0.072339885, 0.0012095685, 0.010923645, 0.0, 0.10844834, 0.10038668, 0.09919817, 0.0)); - result += mul(max(f2, 0), float4x4(0.058991943, 0.018824834, 0.01659209, 0.0, -0.041878223, 0.013176531, 0.023566704, 0.0, -0.010507848, 0.02042605, 0.028884022, 0.0, -0.1193022, -0.10676289, -0.096668206, 0.0)); - result += mul(max(g2, 0), float4x4(0.023510003, 0.06057355, 0.052194174, 0.0, 0.02304783, 0.031745855, 0.025863871, 0.0, -0.01060811, -0.043136407, -0.03569961, 0.0, -0.022243036, 0.014206766, 0.0032128936, 0.0)); - result += mul(max(h2, 0), float4x4(0.025120225, 0.07386707, 0.07916389, 0.0, -0.020202598, 0.010854587, 0.009825397, 0.0, -0.043466344, -0.049230598, -0.038344223, 0.0, 0.006438127, 0.041072655, 0.036958262, 0.0)); - result += mul(max(i2, 0), float4x4(0.027640026, 0.04239058, 0.055017423, 0.0, -0.002110394, 0.040088017, 0.045239322, 0.0, -0.020238828, -0.01711292, -0.014726791, 0.0, -0.029621653, -0.007380026, -0.002073584, 0.0)); - result += mul(max(-a1, 0), float4x4(0.008071638, 0.0034274645, -0.0016181463, 0.0, 0.044838928, 0.06936641, 0.072150804, 0.0, 0.0006324625, -0.02223834, -0.021122342, 0.0, 0.043963037, 0.047561962, 0.026419055, 0.0)); - result += mul(max(-b1, 0), float4x4(-0.06605246, -0.011649812, -0.0022502556, 0.0, -0.09256232, -0.06281528, -0.055003755, 0.0, 0.032296494, -0.011113339, -0.015790787, 0.0, 0.05214882, 0.022887057, 0.013746634, 0.0)); - result += mul(max(-c1, 0), float4x4(-0.03587372, 0.018986767, 0.03229596, 0.0, 0.008917248, 0.050303612, 0.06147115, 0.0, 0.01872278, -0.011048741, -0.017369485, 0.0, 0.030770298, 0.0063107815, 0.003187433, 0.0)); - result += mul(max(-d1, 0), float4x4(0.087662674, 0.048391398, 0.042332277, 0.0, 0.0043635606, 0.02438183, 0.020213395, 0.0, -0.023863237, -0.0051179314, -0.0060627074, 0.0, 0.06292237, 0.05821987, 0.051667042, 0.0)); - result += mul(max(-e1, 0), float4x4(-0.048478693, 0.008368922, 0.016874269, 0.0, -0.19261299, -0.1848583, -0.18258469, 0.0, 0.112302095, 0.061518673, 0.058282077, 0.0, 0.024626324, 0.0058449907, 0.006936535, 0.0)); - result += mul(max(-f1, 0), float4x4(-0.04468695, 0.0099176075, 0.025094027, 0.0, 0.05447911, 0.08220857, 0.08161316, 0.0, -0.0007933787, -0.03090106, -0.040217776, 0.0, -0.028044306, -0.050590593, -0.05027328, 0.0)); - result += mul(max(-g1, 0), float4x4(0.029733973, -0.0129855955, -0.019776886, 0.0, 0.01860655, 0.017793713, 0.020113358, 0.0, -0.023667783, -0.0013290358, -0.004159268, 0.0, -0.01960303, -0.012806444, -0.016549494, 0.0)); - result += mul(max(-h1, 0), float4x4(-0.00952229, -0.007181503, -0.0061082463, 0.0, 0.04292393, 0.01510459, 0.0062862537, 0.0, -0.016540393, -0.023619318, -0.02633423, 0.0, -0.06652295, -0.06933143, -0.063913494, 0.0)); - result += mul(max(-i1, 0), float4x4(-0.015281855, -0.012470513, -0.008184894, 0.0, 0.045862548, 0.023707546, 0.014719574, 0.0, 0.032412887, -0.0038218168, -0.0065955487, 0.0, -0.027728679, -0.04009727, -0.018856067, 0.0)); - result += mul(max(-a2, 0), float4x4(0.042844415, 0.00673587, 0.0038338478, 0.0, -0.031152235, -0.06649269, -0.065986395, 0.0, 0.005666899, -0.015819343, -0.012795757, 0.0, -0.0007617308, 0.021531299, 0.026071105, 0.0)); - result += mul(max(-b2, 0), float4x4(-0.118266046, -0.07211513, -0.058381762, 0.0, 0.02361942, 0.012819485, 0.010511434, 0.0, 0.077196896, 0.003424893, 0.001927401, 0.0, -0.03160996, -0.0034473129, -0.00444674, 0.0)); - result += mul(max(-c2, 0), float4x4(-0.06548674, -0.018152835, 0.0034779215, 0.0, -0.006173449, 0.008357867, -0.0033986098, 0.0, 0.021622533, -0.03722321, -0.045832597, 0.0, -0.011835129, 0.0109178, 0.010480887, 0.0)); - result += mul(max(-d2, 0), float4x4(0.041682176, -0.008985459, -0.018538723, 0.0, -0.054624356, -0.09495616, -0.090484254, 0.0, -0.0060466817, -0.017551763, -0.014151624, 0.0, -0.015683241, -0.012590141, -0.014278323, 0.0)); - result += mul(max(-e2, 0), float4x4(0.073194094, 0.055347454, 0.060976587, 0.0, 0.18175459, 0.13776664, 0.13139476, 0.0, 0.14047755, 0.061971992, 0.056503728, 0.0, 0.0068531767, -0.011873265, -0.016871026, 0.0)); - result += mul(max(-f2, 0), float4x4(-0.041848205, -0.009582, -0.0076929387, 0.0, 0.044274334, 0.04011985, 0.03085897, 0.0, 0.009403278, -0.03346772, -0.04463548, 0.0, 0.04548978, 0.014613167, 0.0055232802, 0.0)); - result += mul(max(-g2, 0), float4x4(0.019901669, -0.0011372451, -0.007423424, 0.0, -0.053240675, -0.07105105, -0.07122227, 0.0, -0.01892976, -0.019795185, -0.019204788, 0.0, 0.01228504, -0.005040437, -0.0010069044, 0.0)); - result += mul(max(-h2, 0), float4x4(0.032843515, 0.014947385, 0.007550199, 0.0, -0.0006476342, -0.020907652, -0.030297596, 0.0, -0.015617971, -0.029182931, -0.038677275, 0.0, 0.037908908, -0.018132487, -0.020226713, 0.0)); - result += mul(max(-i2, 0), float4x4(0.03232915, 0.02915194, 0.014929652, 0.0, 0.016676396, 0.004807404, -0.0008906752, 0.0, 0.0076904814, 0.00541351, -0.0048240838, 0.0, 0.03459369, -0.012969539, -0.024712864, 0.0)); - result += float4(-0.0096404655, 0.0022038757, 0.0035988842, 0.0); - - result += INPUT.SampleLevel(sam, pos, 0); - - WriteToOutput(gxy, result.rgb); + float3 result = mul(max(a1, 0), float4x3(0.012102164, 0.01385959, 0.018815203, -0.017435113, -0.04530735, -0.051318135, 0.01267727, 0.01400136, 0.017735276, 0.012681183, 0.035241637, 0.03990959)); + result += mul(max(b1, 0), float4x3(0.16069227, 0.098007366, 0.076831706, 0.081593364, 0.017831434, 0.010174303, 0.014732323, 0.02229113, 0.029828338, 0.0048171813, 0.051809076, 0.055740006)); + result += mul(max(c1, 0), float4x3(0.0347963, -0.014327445, -0.024176419, 0.003463003, -0.050532356, -0.06565927, 0.082851514, 0.10950989, 0.12022889, -0.038950548, -0.015094648, -0.0119305095)); + result += mul(max(d1, 0), float4x3(-0.11845135, -0.08067485, -0.06981454, 0.00058037776, 0.01160575, 0.014900963, -0.0374349, -0.052966926, -0.044557698, 0.017439643, 0.005496974, -0.0024181441)); + result += mul(max(e1, 0), float4x3(-0.1084345, -0.18271221, -0.18795776, 0.110637866, 0.08913364, 0.09161146, -0.19889367, -0.17172937, -0.1600661, -0.03789556, -0.028977778, -0.029903485)); + result += mul(max(f1, 0), float4x3(0.017774954, -0.048732057, -0.061161697, 0.022389695, -0.013317256, -0.019972157, 0.051979035, 0.08774837, 0.09633588, -0.047462203, -0.033091765, -0.028352588)); + result += mul(max(g1, 0), float4x3(0.022178177, 0.05031684, 0.05802219, -0.027539665, -0.020904189, -0.01800042, 0.0019531948, 0.00019749763, -0.0013961957, 0.024253767, -0.00058503833, 0.0006474611)); + result += mul(max(h1, 0), float4x3(0.06707921, 0.0817431, 0.07561426, -0.04157211, -0.006174012, -0.003754037, 0.0031168605, 0.02320992, 0.026471246, 0.0029530525, -0.004939263, -0.0070194793)); + result += mul(max(i1, 0), float4x3(0.03383418, 0.042321067, 0.04266926, -0.043634403, -0.0182769, -0.011314871, -0.050008457, -0.003527757, 0.0035165092, -0.00016610099, 0.019936454, 0.022199173)); + result += mul(max(a2, 0), float4x3(-0.055203374, -0.03910439, -0.03778927, 0.027640847, 0.019469904, 0.0277834, -0.026225597, 0.04481541, 0.047454204, 0.031545334, 0.019874612, 0.011878432)); + result += mul(max(b2, 0), float4x3(0.016088601, -0.045959134, -0.048793618, -0.009834776, 0.0077799167, 0.00873151, 0.031265914, 0.09698676, 0.10005417, 0.039120086, 0.0005542848, -0.0049420255)); + result += mul(max(c2, 0), float4x3(0.028432969, -0.014792921, -0.026881924, -0.00586326, 0.013427183, 0.018215714, -0.013559131, 0.017704675, 0.024854776, -0.09087544, -0.104627624, -0.0921747)); + result += mul(max(d2, 0), float4x3(-0.022899037, 0.026374351, 0.03145993, -0.008008749, -0.0013132087, -0.003957525, -0.02490554, 0.0020362549, 0.006453752, 0.031494617, 0.049864545, 0.04702567)); + result += mul(max(e2, 0), float4x3(-0.12318068, -0.121377476, -0.11615006, -0.1321696, -0.078085914, -0.07868927, -0.072339885, 0.0012095685, 0.010923645, 0.10844834, 0.10038668, 0.09919817)); + result += mul(max(f2, 0), float4x3(0.058991943, 0.018824834, 0.01659209, -0.041878223, 0.013176531, 0.023566704, -0.010507848, 0.02042605, 0.028884022, -0.1193022, -0.10676289, -0.096668206)); + result += mul(max(g2, 0), float4x3(0.023510003, 0.06057355, 0.052194174, 0.02304783, 0.031745855, 0.025863871, -0.01060811, -0.043136407, -0.03569961, -0.022243036, 0.014206766, 0.0032128936)); + result += mul(max(h2, 0), float4x3(0.025120225, 0.07386707, 0.07916389, -0.020202598, 0.010854587, 0.009825397, -0.043466344, -0.049230598, -0.038344223, 0.006438127, 0.041072655, 0.036958262)); + result += mul(max(i2, 0), float4x3(0.027640026, 0.04239058, 0.055017423, -0.002110394, 0.040088017, 0.045239322, -0.020238828, -0.01711292, -0.014726791, -0.029621653, -0.007380026, -0.002073584)); + result += mul(max(-a1, 0), float4x3(0.008071638, 0.0034274645, -0.0016181463, 0.044838928, 0.06936641, 0.072150804, 0.0006324625, -0.02223834, -0.021122342, 0.043963037, 0.047561962, 0.026419055)); + result += mul(max(-b1, 0), float4x3(-0.06605246, -0.011649812, -0.0022502556, -0.09256232, -0.06281528, -0.055003755, 0.032296494, -0.011113339, -0.015790787, 0.05214882, 0.022887057, 0.013746634)); + result += mul(max(-c1, 0), float4x3(-0.03587372, 0.018986767, 0.03229596, 0.008917248, 0.050303612, 0.06147115, 0.01872278, -0.011048741, -0.017369485, 0.030770298, 0.0063107815, 0.003187433)); + result += mul(max(-d1, 0), float4x3(0.087662674, 0.048391398, 0.042332277, 0.0043635606, 0.02438183, 0.020213395, -0.023863237, -0.0051179314, -0.0060627074, 0.06292237, 0.05821987, 0.051667042)); + result += mul(max(-e1, 0), float4x3(-0.048478693, 0.008368922, 0.016874269, -0.19261299, -0.1848583, -0.18258469, 0.112302095, 0.061518673, 0.058282077, 0.024626324, 0.0058449907, 0.006936535)); + result += mul(max(-f1, 0), float4x3(-0.04468695, 0.0099176075, 0.025094027, 0.05447911, 0.08220857, 0.08161316, -0.0007933787, -0.03090106, -0.040217776, -0.028044306, -0.050590593, -0.05027328)); + result += mul(max(-g1, 0), float4x3(0.029733973, -0.0129855955, -0.019776886, 0.01860655, 0.017793713, 0.020113358, -0.023667783, -0.0013290358, -0.004159268, -0.01960303, -0.012806444, -0.016549494)); + result += mul(max(-h1, 0), float4x3(-0.00952229, -0.007181503, -0.0061082463, 0.04292393, 0.01510459, 0.0062862537, -0.016540393, -0.023619318, -0.02633423, -0.06652295, -0.06933143, -0.063913494)); + result += mul(max(-i1, 0), float4x3(-0.015281855, -0.012470513, -0.008184894, 0.045862548, 0.023707546, 0.014719574, 0.032412887, -0.0038218168, -0.0065955487, -0.027728679, -0.04009727, -0.018856067)); + result += mul(max(-a2, 0), float4x3(0.042844415, 0.00673587, 0.0038338478, -0.031152235, -0.06649269, -0.065986395, 0.005666899, -0.015819343, -0.012795757, -0.0007617308, 0.021531299, 0.026071105)); + result += mul(max(-b2, 0), float4x3(-0.118266046, -0.07211513, -0.058381762, 0.02361942, 0.012819485, 0.010511434, 0.077196896, 0.003424893, 0.001927401, -0.03160996, -0.0034473129, -0.00444674)); + result += mul(max(-c2, 0), float4x3(-0.06548674, -0.018152835, 0.0034779215, -0.006173449, 0.008357867, -0.0033986098, 0.021622533, -0.03722321, -0.045832597, -0.011835129, 0.0109178, 0.010480887)); + result += mul(max(-d2, 0), float4x3(0.041682176, -0.008985459, -0.018538723, -0.054624356, -0.09495616, -0.090484254, -0.0060466817, -0.017551763, -0.014151624, -0.015683241, -0.012590141, -0.014278323)); + result += mul(max(-e2, 0), float4x3(0.073194094, 0.055347454, 0.060976587, 0.18175459, 0.13776664, 0.13139476, 0.14047755, 0.061971992, 0.056503728, 0.0068531767, -0.011873265, -0.016871026)); + result += mul(max(-f2, 0), float4x3(-0.041848205, -0.009582, -0.0076929387, 0.044274334, 0.04011985, 0.03085897, 0.009403278, -0.03346772, -0.04463548, 0.04548978, 0.014613167, 0.0055232802)); + result += mul(max(-g2, 0), float4x3(0.019901669, -0.0011372451, -0.007423424, -0.053240675, -0.07105105, -0.07122227, -0.01892976, -0.019795185, -0.019204788, 0.01228504, -0.005040437, -0.0010069044)); + result += mul(max(-h2, 0), float4x3(0.032843515, 0.014947385, 0.007550199, -0.0006476342, -0.020907652, -0.030297596, -0.015617971, -0.029182931, -0.038677275, 0.037908908, -0.018132487, -0.020226713)); + result += mul(max(-i2, 0), float4x3(0.03232915, 0.02915194, 0.014929652, 0.016676396, 0.004807404, -0.0008906752, 0.0076904814, 0.00541351, -0.0048240838, 0.03459369, -0.012969539, -0.024712864)); + result += float3(-0.0096404655, 0.0022038757, 0.0035988842); + + result += INPUT.SampleLevel(sam, pos, 0).rgb; + + OUTPUT[gxy] = float4(result, 1); } diff --git a/src/Effects/Anime4K/Anime4K_Restore_M.hlsl b/src/Effects/Anime4K/Anime4K_Restore_M.hlsl index 6e8e03345..b751ed550 100644 --- a/src/Effects/Anime4K/Anime4K_Restore_M.hlsl +++ b/src/Effects/Anime4K/Anime4K_Restore_M.hlsl @@ -2,18 +2,17 @@ // 移植自 https://github.com/bloc97/Anime4K/blob/master/glsl/Restore/Anime4K_Restore_CNN_M.glsl //!MAGPIE EFFECT -//!VERSION 3 -//!OUTPUT_WIDTH INPUT_WIDTH -//!OUTPUT_HEIGHT INPUT_HEIGHT +//!VERSION 4 //!SORT_NAME Anime4K_Restore_0 //!TEXTURE Texture2D INPUT; -//!SAMPLER -//!FILTER POINT -SamplerState sam; +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +Texture2D OUTPUT; //!TEXTURE //!WIDTH INPUT_WIDTH @@ -51,6 +50,10 @@ Texture2D tex5; //!FORMAT R16G16B16A16_FLOAT Texture2D tex6; +//!SAMPLER +//!FILTER POINT +SamplerState sam; + //!PASS 1 //!DESC Conv-4x3x3x3 @@ -495,15 +498,18 @@ void Pass6(uint2 blockStart, uint3 threadId) { //!PASS 7 //!DESC Conv-4x3x3x8, Conv-3x1x1x56 //!IN INPUT, tex1, tex2, tex3, tex4, tex5, tex6 +//!OUT OUTPUT //!BLOCK_SIZE 8 //!NUM_THREADS 64 void Pass7(uint2 blockStart, uint3 threadId) { uint2 gxy = Rmp8x8(threadId.x) + blockStart; - uint2 inputSize = GetInputSize(); - if (!CheckViewport(gxy)) { + + const uint2 outputSize = GetOutputSize(); + if (gxy.x >= outputSize.x || gxy.y >= outputSize.y) { return; } + float2 inputPt = GetInputPt(); float2 pos = (gxy + 0.5f) * inputPt; @@ -564,5 +570,5 @@ void Pass7(uint2 blockStart, uint3 threadId) { result += mul(max(-src7, 0), float4x3(0.10676299, 0.118409514, 0.10618478, -0.05880252, -0.06488367, -0.06432695, 0.019221924, 0.017602798, 0.017413978, -0.07512528, -0.080483615, -0.066218294)); result += float3(-0.010478934, -0.008364784, -0.010246552); - WriteToOutput(gxy, result + origin); + OUTPUT[gxy] = float4(result + origin, 1); } diff --git a/src/Effects/Anime4K/Anime4K_Restore_Soft_L.hlsl b/src/Effects/Anime4K/Anime4K_Restore_Soft_L.hlsl index c63ff483b..1e576a16b 100644 --- a/src/Effects/Anime4K/Anime4K_Restore_Soft_L.hlsl +++ b/src/Effects/Anime4K/Anime4K_Restore_Soft_L.hlsl @@ -1,18 +1,17 @@ // 移植自 https://github.com/bloc97/Anime4K/blob/master/glsl/Restore/Anime4K_Restore_CNN_Soft_L.glsl //!MAGPIE EFFECT -//!VERSION 3 -//!OUTPUT_WIDTH INPUT_WIDTH -//!OUTPUT_HEIGHT INPUT_HEIGHT +//!VERSION 4 //!SORT_NAME Anime4K_Restore_Soft_1 //!TEXTURE Texture2D INPUT; -//!SAMPLER -//!FILTER POINT -SamplerState sam; +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +Texture2D OUTPUT; //!TEXTURE //!WIDTH INPUT_WIDTH @@ -38,6 +37,10 @@ Texture2D tex3; //!FORMAT R16G16B16A16_FLOAT Texture2D tex4; +//!SAMPLER +//!FILTER POINT +SamplerState sam; + //!PASS 1 //!DESC Conv-4x3x3x3 @@ -602,13 +605,15 @@ void Pass4(uint2 blockStart, uint3 threadId) { //!PASS 5 //!DESC Conv-3x3x3x16 //!IN INPUT, tex3, tex4 +//!OUT OUTPUT //!BLOCK_SIZE 8 //!NUM_THREADS 64 void Pass5(uint2 blockStart, uint3 threadId) { uint2 gxy = Rmp8x8(threadId.x) + blockStart; - uint2 inputSize = GetInputSize(); - if (!CheckViewport(gxy)) { + + const uint2 outputSize = GetOutputSize(); + if (gxy.x >= outputSize.x || gxy.y >= outputSize.y) { return; } @@ -638,45 +643,45 @@ void Pass5(uint2 blockStart, uint3 threadId) { float4 h2 = tex4.SampleLevel(sam, pos + float2(inputPt.x, 0), 0); float4 i2 = tex4.SampleLevel(sam, pos + float2(inputPt.x, inputPt.y), 0); - float4 result = mul(max(a1, 0), float4x4(-0.01858372, 0.017144108, 0.02794388, 0.0, 0.0129101565, -0.0073674284, -0.011766938, 0.0, 0.01970984, 0.01209068, 0.009530311, 0.0, -0.009190449, -0.006996753, -0.0038750458, 0.0)); - result += mul(max(b1, 0), float4x4(0.15856947, 0.10162126, 0.08489005, 0.0, 0.038381726, -0.017771017, -0.03226132, 0.0, -0.011787879, -0.0152445, -0.007564454, 0.0, 0.055921376, 0.08389841, 0.08452836, 0.0)); - result += mul(max(c1, 0), float4x4(0.026705442, -0.0070655374, -0.018199183, 0.0, 0.016254421, -0.025398912, -0.03461042, 0.0, 0.03950644, 0.06586101, 0.0707467, 0.0, -0.03793455, -0.04957139, -0.04777402, 0.0)); - result += mul(max(d1, 0), float4x4(-0.115341224, -0.04463122, -0.016549354, 0.0, -0.059433736, -0.04303295, -0.042805545, 0.0, 0.010830498, -0.011057443, -0.0141014, 0.0, 0.067396216, 0.06553637, 0.06705378, 0.0)); - result += mul(max(e1, 0), float4x4(-0.12767975, -0.19935511, -0.20109995, 0.0, 0.11554901, 0.11426503, 0.11161185, 0.0, -0.22092125, -0.22041021, -0.2142712, 0.0, -0.06326996, -0.061314825, -0.059039716, 0.0)); - result += mul(max(f1, 0), float4x4(0.007717391, -0.046238754, -0.056983955, 0.0, 0.021419598, 0.0036924274, -0.00033630748, 0.0, 0.053556852, 0.0824714, 0.08295022, 0.0, -0.09881205, -0.043157153, -0.040801782, 0.0)); - result += mul(max(g1, 0), float4x4(0.0052828738, 0.049702674, 0.056108, 0.0, 0.009478552, 0.010345037, 0.0094180945, 0.0, -0.010412882, 0.0006965096, 0.0021917222, 0.0, -0.010701383, -0.023212843, -0.024252625, 0.0)); - result += mul(max(h1, 0), float4x4(0.07542127, 0.0739301, 0.06642962, 0.0, -0.08054489, -0.037553925, -0.026762033, 0.0, 0.09727509, 0.102272816, 0.097533874, 0.0, 0.01325714, -0.004582272, -0.006647532, 0.0)); - result += mul(max(i1, 0), float4x4(0.03005975, 0.017012767, 0.007840201, 0.0, -0.028650383, -0.0019064787, 0.01083078, 0.0, -0.071352504, -0.019919744, -0.008299795, 0.0, 0.023253804, 0.042413715, 0.04681489, 0.0)); - result += mul(max(a2, 0), float4x4(-0.052201163, -0.021727808, -0.020888992, 0.0, 0.008365179, -0.016546093, -0.0111018475, 0.0, -0.06236095, -0.019278256, -0.021443967, 0.0, 0.0029381379, -0.0033039588, -0.006425339, 0.0)); - result += mul(max(b2, 0), float4x4(0.02397296, -0.041659098, -0.050882675, 0.0, -0.013487, 0.0067506596, 0.005435185, 0.0, 0.066447854, 0.13331215, 0.13754861, 0.0, 0.028300207, -0.0048033795, -0.010058485, 0.0)); - result += mul(max(c2, 0), float4x4(0.08140248, 0.018564016, 0.0036607496, 0.0, -0.0112075955, 0.0022339798, 0.0045722146, 0.0, -0.045716517, -0.0076076477, -0.0016939791, 0.0, -0.030486025, -0.07539711, -0.07185734, 0.0)); - result += mul(max(d2, 0), float4x4(-0.0155724995, 0.048904862, 0.059412133, 0.0, -0.013894624, -0.0061430936, -0.011662488, 0.0, -0.0052947477, -0.0176474, -0.018611705, 0.0, 0.022075793, 0.031703226, 0.026735537, 0.0)); - result += mul(max(e2, 0), float4x4(-0.18287502, -0.18703277, -0.18331653, 0.0, -0.08616293, -0.011741755, -0.009296464, 0.0, -0.054274965, 0.016794622, 0.022522328, 0.0, 0.06965258, 0.08260611, 0.08285337, 0.0)); - result += mul(max(f2, 0), float4x4(0.08107809, 0.0336241, 0.025449684, 0.0, -0.031931, 0.01179566, 0.019694995, 0.0, 0.025930194, 0.042288166, 0.04673656, 0.0, -0.14357394, -0.11003491, -0.094090074, 0.0)); - result += mul(max(g2, 0), float4x4(0.007188181, 0.050626095, 0.050705966, 0.0, -0.008030409, -0.018670242, -0.019766346, 0.0, 0.014874803, -0.03657919, -0.034044486, 0.0, -0.011178416, -0.004358302, -0.013611815, 0.0)); - result += mul(max(h2, 0), float4x4(0.07987872, 0.11399873, 0.12089382, 0.0, -0.01514355, 0.0068139364, 0.010206274, 0.0, -0.0005701044, -0.011158322, 0.006484812, 0.0, 0.002018227, 0.043359682, 0.042987905, 0.0)); - result += mul(max(i2, 0), float4x4(0.0017806455, -0.0015697709, -0.0018252691, 0.0, 0.0058658062, 0.021681193, 0.028615465, 0.0, -0.054827355, -0.04541651, -0.027485048, 0.0, -0.017649114, 0.017717479, 0.027309911, 0.0)); - result += mul(max(-a1, 0), float4x4(0.02555098, -0.0028983613, -0.005134733, 0.0, -0.0029332284, 0.015552135, 0.022189403, 0.0, -0.019786593, -0.0031676649, -0.0014604586, 0.0, 0.06648065, 0.0672302, 0.04586375, 0.0)); - result += mul(max(-b1, 0), float4x4(-0.06674696, 0.002328631, 0.014039355, 0.0, -0.03636718, 0.014560653, 0.028076636, 0.0, 0.042305287, 0.015249338, 0.0136925895, 0.0, 0.033586804, 0.00701501, -0.011588751, 0.0)); - result += mul(max(-c1, 0), float4x4(-0.039022632, 0.015240631, 0.02699061, 0.0, -0.02614261, 0.0051843156, 0.012590042, 0.0, 0.015304643, -0.022641543, -0.030434309, 0.0, 0.016862666, 0.020819275, 0.022333218, 0.0)); - result += mul(max(-d1, 0), float4x4(0.08056982, 0.026592938, 0.009744146, 0.0, 0.08762212, 0.10150359, 0.09662005, 0.0, -0.044551965, -0.016349116, -0.014629014, 0.0, -0.014341297, -0.030914815, -0.038747486, 0.0)); - result += mul(max(-e1, 0), float4x4(-0.048734166, 0.019775594, 0.03124684, 0.0, -0.2345022, -0.23639877, -0.22958128, 0.0, 0.12412277, 0.10245112, 0.10389806, 0.0, -0.0030797734, -0.01989389, -0.02020691, 0.0)); - result += mul(max(-f1, 0), float4x4(-0.0133485105, 0.029644802, 0.041630358, 0.0, 0.041081797, 0.059993293, 0.060033485, 0.0, -0.02155099, -0.035306025, -0.03838472, 0.0, 0.017466968, -0.01866363, -0.004764589, 0.0)); - result += mul(max(-g1, 0), float4x4(0.0030783121, -0.04064586, -0.04504904, 0.0, -0.023528632, -0.029308239, -0.022441925, 0.0, 0.020095564, 0.018979732, 0.015117934, 0.0, 0.008429918, 0.021180628, 0.020137152, 0.0)); - result += mul(max(-h1, 0), float4x4(0.0012200709, 0.013313984, 0.014122978, 0.0, 0.08750284, 0.038747437, 0.027102578, 0.0, -0.09627132, -0.09706183, -0.09405641, 0.0, -0.05180081, -0.03555434, -0.021694236, 0.0)); - result += mul(max(-i1, 0), float4x4(-0.022396728, -0.018316073, -0.01250564, 0.0, 0.045423746, 0.025315331, 0.010639915, 0.0, 0.05618814, 0.022210265, 0.014195103, 0.0, -0.014828652, -0.010245087, 0.0020570823, 0.0)); - result += mul(max(-a2, 0), float4x4(0.046651457, 0.001333767, -0.003572458, 0.0, -0.0077845114, -0.012861641, -0.015116351, 0.0, 0.01338984, 0.029198132, 0.026183384, 0.0, 0.0014878022, 0.020025207, 0.024829973, 0.0)); - result += mul(max(-b2, 0), float4x4(-0.09506711, -0.06541528, -0.051106647, 0.0, 0.02552611, 0.01181497, 0.0020236392, 0.0, 0.03234602, -0.03153924, -0.035502207, 0.0, -0.034516744, 0.00018784113, 0.0085376045, 0.0)); - result += mul(max(-c2, 0), float4x4(-0.05945615, -0.0046793907, 0.011128929, 0.0, -0.0061961384, -0.0040663416, -0.010319631, 0.0, 0.044197917, -0.033448357, -0.04109943, 0.0, -0.04109929, 0.006773195, 0.016976412, 0.0)); - result += mul(max(-d2, 0), float4x4(0.02855516, -0.033051047, -0.04864978, 0.0, -0.06393814, -0.082921155, -0.0730681, 0.0, -0.058905125, -0.038639963, -0.027698845, 0.0, -0.013616608, -0.007876684, -0.006182652, 0.0)); - result += mul(max(-e2, 0), float4x4(0.15423118, 0.14667909, 0.14534634, 0.0, 0.1485341, 0.096721016, 0.0820024, 0.0, 0.1263968, 0.088775866, 0.083860956, 0.0, 0.04213644, 0.020989005, 0.010447147, 0.0)); - result += mul(max(-f2, 0), float4x4(-0.068275765, -0.018390667, -0.011452603, 0.0, 0.03738383, 0.019398715, 0.005998161, 0.0, -0.0011161854, -0.039955888, -0.04444185, 0.0, 0.052985556, 0.017621813, 0.009551621, 0.0)); - result += mul(max(-g2, 0), float4x4(0.01387326, -0.0033411914, -0.009420935, 0.0, -0.034494568, -0.019219222, -0.009562797, 0.0, 0.0074023325, 0.022065453, 0.027121471, 0.0, 0.00019609048, -0.0042242454, 2.0403608e-05, 0.0)); - result += mul(max(-h2, 0), float4x4(-0.015793918, -0.024342488, -0.037188973, 0.0, 0.004534637, -0.025236975, -0.028567247, 0.0, -0.055682972, -0.054670315, -0.06584981, 0.0, 0.043045517, -0.0075941198, -0.014196169, 0.0)); - result += mul(max(-i2, 0), float4x4(0.0132598495, 0.01775289, 0.017206183, 0.0, 0.010604703, -0.007352816, -0.017301153, 0.0, 0.030967329, 0.027615465, 0.0145311365, 0.0, 0.008636854, -0.033379406, -0.042725433, 0.0)); - result += float4(-0.0056639817, -0.0017339308, -0.0011913306, 0.0); - - result += INPUT.SampleLevel(sam, pos, 0); - - WriteToOutput(gxy, result.rgb); + float3 result = mul(max(a1, 0), float4x3(-0.01858372, 0.017144108, 0.02794388, 0.0129101565, -0.0073674284, -0.011766938, 0.01970984, 0.01209068, 0.009530311, -0.009190449, -0.006996753, -0.0038750458)); + result += mul(max(b1, 0), float4x3(0.15856947, 0.10162126, 0.08489005, 0.038381726, -0.017771017, -0.03226132, -0.011787879, -0.0152445, -0.007564454, 0.055921376, 0.08389841, 0.08452836)); + result += mul(max(c1, 0), float4x3(0.026705442, -0.0070655374, -0.018199183, 0.016254421, -0.025398912, -0.03461042, 0.03950644, 0.06586101, 0.0707467, -0.03793455, -0.04957139, -0.04777402)); + result += mul(max(d1, 0), float4x3(-0.115341224, -0.04463122, -0.016549354, -0.059433736, -0.04303295, -0.042805545, 0.010830498, -0.011057443, -0.0141014, 0.067396216, 0.06553637, 0.06705378)); + result += mul(max(e1, 0), float4x3(-0.12767975, -0.19935511, -0.20109995, 0.11554901, 0.11426503, 0.11161185, -0.22092125, -0.22041021, -0.2142712, -0.06326996, -0.061314825, -0.059039716)); + result += mul(max(f1, 0), float4x3(0.007717391, -0.046238754, -0.056983955, 0.021419598, 0.0036924274, -0.00033630748, 0.053556852, 0.0824714, 0.08295022, -0.09881205, -0.043157153, -0.040801782)); + result += mul(max(g1, 0), float4x3(0.0052828738, 0.049702674, 0.056108, 0.009478552, 0.010345037, 0.0094180945, -0.010412882, 0.0006965096, 0.0021917222, -0.010701383, -0.023212843, -0.024252625)); + result += mul(max(h1, 0), float4x3(0.07542127, 0.0739301, 0.06642962, -0.08054489, -0.037553925, -0.026762033, 0.09727509, 0.102272816, 0.097533874, 0.01325714, -0.004582272, -0.006647532)); + result += mul(max(i1, 0), float4x3(0.03005975, 0.017012767, 0.007840201, -0.028650383, -0.0019064787, 0.01083078, -0.071352504, -0.019919744, -0.008299795, 0.023253804, 0.042413715, 0.04681489)); + result += mul(max(a2, 0), float4x3(-0.052201163, -0.021727808, -0.020888992, 0.008365179, -0.016546093, -0.0111018475, -0.06236095, -0.019278256, -0.021443967, 0.0029381379, -0.0033039588, -0.006425339)); + result += mul(max(b2, 0), float4x3(0.02397296, -0.041659098, -0.050882675, -0.013487, 0.0067506596, 0.005435185, 0.066447854, 0.13331215, 0.13754861, 0.028300207, -0.0048033795, -0.010058485)); + result += mul(max(c2, 0), float4x3(0.08140248, 0.018564016, 0.0036607496, -0.0112075955, 0.0022339798, 0.0045722146, -0.045716517, -0.0076076477, -0.0016939791, -0.030486025, -0.07539711, -0.07185734)); + result += mul(max(d2, 0), float4x3(-0.0155724995, 0.048904862, 0.059412133, -0.013894624, -0.0061430936, -0.011662488, -0.0052947477, -0.0176474, -0.018611705, 0.022075793, 0.031703226, 0.026735537)); + result += mul(max(e2, 0), float4x3(-0.18287502, -0.18703277, -0.18331653, -0.08616293, -0.011741755, -0.009296464, -0.054274965, 0.016794622, 0.022522328, 0.06965258, 0.08260611, 0.08285337)); + result += mul(max(f2, 0), float4x3(0.08107809, 0.0336241, 0.025449684, -0.031931, 0.01179566, 0.019694995, 0.025930194, 0.042288166, 0.04673656, -0.14357394, -0.11003491, -0.094090074)); + result += mul(max(g2, 0), float4x3(0.007188181, 0.050626095, 0.050705966, -0.008030409, -0.018670242, -0.019766346, 0.014874803, -0.03657919, -0.034044486, -0.011178416, -0.004358302, -0.013611815)); + result += mul(max(h2, 0), float4x3(0.07987872, 0.11399873, 0.12089382, -0.01514355, 0.0068139364, 0.010206274, -0.0005701044, -0.011158322, 0.006484812, 0.002018227, 0.043359682, 0.042987905)); + result += mul(max(i2, 0), float4x3(0.0017806455, -0.0015697709, -0.0018252691, 0.0058658062, 0.021681193, 0.028615465, -0.054827355, -0.04541651, -0.027485048, -0.017649114, 0.017717479, 0.027309911)); + result += mul(max(-a1, 0), float4x3(0.02555098, -0.0028983613, -0.005134733, -0.0029332284, 0.015552135, 0.022189403, -0.019786593, -0.0031676649, -0.0014604586, 0.06648065, 0.0672302, 0.04586375)); + result += mul(max(-b1, 0), float4x3(-0.06674696, 0.002328631, 0.014039355, -0.03636718, 0.014560653, 0.028076636, 0.042305287, 0.015249338, 0.0136925895, 0.033586804, 0.00701501, -0.011588751)); + result += mul(max(-c1, 0), float4x3(-0.039022632, 0.015240631, 0.02699061, -0.02614261, 0.0051843156, 0.012590042, 0.015304643, -0.022641543, -0.030434309, 0.016862666, 0.020819275, 0.022333218)); + result += mul(max(-d1, 0), float4x3(0.08056982, 0.026592938, 0.009744146, 0.08762212, 0.10150359, 0.09662005, -0.044551965, -0.016349116, -0.014629014, -0.014341297, -0.030914815, -0.038747486)); + result += mul(max(-e1, 0), float4x3(-0.048734166, 0.019775594, 0.03124684, -0.2345022, -0.23639877, -0.22958128, 0.12412277, 0.10245112, 0.10389806, -0.0030797734, -0.01989389, -0.02020691)); + result += mul(max(-f1, 0), float4x3(-0.0133485105, 0.029644802, 0.041630358, 0.041081797, 0.059993293, 0.060033485, -0.02155099, -0.035306025, -0.03838472, 0.017466968, -0.01866363, -0.004764589)); + result += mul(max(-g1, 0), float4x3(0.0030783121, -0.04064586, -0.04504904, -0.023528632, -0.029308239, -0.022441925, 0.020095564, 0.018979732, 0.015117934, 0.008429918, 0.021180628, 0.020137152)); + result += mul(max(-h1, 0), float4x3(0.0012200709, 0.013313984, 0.014122978, 0.08750284, 0.038747437, 0.027102578, -0.09627132, -0.09706183, -0.09405641, -0.05180081, -0.03555434, -0.021694236)); + result += mul(max(-i1, 0), float4x3(-0.022396728, -0.018316073, -0.01250564, 0.045423746, 0.025315331, 0.010639915, 0.05618814, 0.022210265, 0.014195103, -0.014828652, -0.010245087, 0.0020570823)); + result += mul(max(-a2, 0), float4x3(0.046651457, 0.001333767, -0.003572458, -0.0077845114, -0.012861641, -0.015116351, 0.01338984, 0.029198132, 0.026183384, 0.0014878022, 0.020025207, 0.024829973)); + result += mul(max(-b2, 0), float4x3(-0.09506711, -0.06541528, -0.051106647, 0.02552611, 0.01181497, 0.0020236392, 0.03234602, -0.03153924, -0.035502207, -0.034516744, 0.00018784113, 0.0085376045)); + result += mul(max(-c2, 0), float4x3(-0.05945615, -0.0046793907, 0.011128929, -0.0061961384, -0.0040663416, -0.010319631, 0.044197917, -0.033448357, -0.04109943, -0.04109929, 0.006773195, 0.016976412)); + result += mul(max(-d2, 0), float4x3(0.02855516, -0.033051047, -0.04864978, -0.06393814, -0.082921155, -0.0730681, -0.058905125, -0.038639963, -0.027698845, -0.013616608, -0.007876684, -0.006182652)); + result += mul(max(-e2, 0), float4x3(0.15423118, 0.14667909, 0.14534634, 0.1485341, 0.096721016, 0.0820024, 0.1263968, 0.088775866, 0.083860956, 0.04213644, 0.020989005, 0.010447147)); + result += mul(max(-f2, 0), float4x3(-0.068275765, -0.018390667, -0.011452603, 0.03738383, 0.019398715, 0.005998161, -0.0011161854, -0.039955888, -0.04444185, 0.052985556, 0.017621813, 0.009551621)); + result += mul(max(-g2, 0), float4x3(0.01387326, -0.0033411914, -0.009420935, -0.034494568, -0.019219222, -0.009562797, 0.0074023325, 0.022065453, 0.027121471, 0.00019609048, -0.0042242454, 2.0403608e-05)); + result += mul(max(-h2, 0), float4x3(-0.015793918, -0.024342488, -0.037188973, 0.004534637, -0.025236975, -0.028567247, -0.055682972, -0.054670315, -0.06584981, 0.043045517, -0.0075941198, -0.014196169)); + result += mul(max(-i2, 0), float4x3(0.0132598495, 0.01775289, 0.017206183, 0.010604703, -0.007352816, -0.017301153, 0.030967329, 0.027615465, 0.0145311365, 0.008636854, -0.033379406, -0.042725433)); + result += float3(-0.0056639817, -0.0017339308, -0.0011913306); + + result += INPUT.SampleLevel(sam, pos, 0).rgb; + + OUTPUT[gxy] = float4(result, 1); } diff --git a/src/Effects/Anime4K/Anime4K_Restore_Soft_M.hlsl b/src/Effects/Anime4K/Anime4K_Restore_Soft_M.hlsl index 5b026e47e..7284cb18a 100644 --- a/src/Effects/Anime4K/Anime4K_Restore_Soft_M.hlsl +++ b/src/Effects/Anime4K/Anime4K_Restore_Soft_M.hlsl @@ -504,10 +504,12 @@ void Pass6(uint2 blockStart, uint3 threadId) { void Pass7(uint2 blockStart, uint3 threadId) { uint2 gxy = Rmp8x8(threadId.x) + blockStart; - uint2 inputSize = GetInputSize(); - if (gxy.x >= inputSize.x || gxy.y >= inputSize.y) { + + const uint2 outputSize = GetOutputSize(); + if (gxy.x >= outputSize.x || gxy.y >= outputSize.y) { return; } + float2 inputPt = GetInputPt(); float2 pos = (gxy + 0.5f) * inputPt; diff --git a/src/Effects/Anime4K/Anime4K_Restore_Soft_UL.hlsl b/src/Effects/Anime4K/Anime4K_Restore_Soft_UL.hlsl index 88982a215..488fa3a5a 100644 --- a/src/Effects/Anime4K/Anime4K_Restore_Soft_UL.hlsl +++ b/src/Effects/Anime4K/Anime4K_Restore_Soft_UL.hlsl @@ -2,18 +2,17 @@ // Ported from https://github.com/bloc97/Anime4K/blob/4ba94b179a144200cb6b3052e690fe2ca5c6914c/glsl/Restore/Anime4K_Restore_CNN_Soft_UL.glsl //!MAGPIE EFFECT -//!VERSION 3 -//!OUTPUT_WIDTH INPUT_WIDTH -//!OUTPUT_HEIGHT INPUT_HEIGHT +//!VERSION 4 //!SORT_NAME Anime4K_Restore_Soft_3 //!TEXTURE Texture2D INPUT; -//!SAMPLER -//!FILTER POINT -SamplerState sam; +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +Texture2D OUTPUT; //!TEXTURE //!WIDTH INPUT_WIDTH @@ -63,6 +62,11 @@ Texture2D tex7; //!FORMAT R16G16B16A16_FLOAT Texture2D tex8; +//!SAMPLER +//!FILTER POINT +SamplerState sam; + + //!PASS 1 //!DESC Conv-4x3x3x3 //!IN INPUT @@ -1879,13 +1883,15 @@ void Pass7(uint2 blockStart, uint3 threadId) { //!PASS 8 //!DESC Conv-4x3x3x24, Conv-3x1x1x120 //!IN INPUT, tex1, tex2, tex3, tex7 +//!OUT OUTPUT //!BLOCK_SIZE 8 //!NUM_THREADS 64 void Pass8(uint2 blockStart, uint3 threadId) { uint2 gxy = Rmp8x8(threadId.x) + blockStart; - uint2 inputSize = GetInputSize(); - if (gxy.x >= inputSize.x || gxy.y >= inputSize.y) { + + const uint2 outputSize = GetOutputSize(); + if (gxy.x >= outputSize.x || gxy.y >= outputSize.y) { return; } @@ -2169,5 +2175,5 @@ void Pass8(uint2 blockStart, uint3 threadId) { result += float3(-0.0036656514, 0.006677459, 0.007698717); result += INPUT.SampleLevel(sam, pos, 0).rgb; - WriteToOutput(gxy, result.rgb); + OUTPUT[gxy] = float4(result, 1); } diff --git a/src/Effects/SSimDownscaler.hlsl b/src/Effects/SSimDownscaler.hlsl index 16811854e..f683ca150 100644 --- a/src/Effects/SSimDownscaler.hlsl +++ b/src/Effects/SSimDownscaler.hlsl @@ -4,8 +4,7 @@ //!MAGPIE EFFECT -//!VERSION 3 -//!GENERIC_DOWNSCALER +//!VERSION 4 //!PARAMETER //!LABEL Oversharp @@ -18,6 +17,9 @@ float oversharp; //!TEXTURE Texture2D INPUT; +//!TEXTURE +Texture2D OUTPUT; + //!TEXTURE //!WIDTH INPUT_WIDTH //!HEIGHT OUTPUT_HEIGHT @@ -295,6 +297,7 @@ void Pass4(uint2 blockStart, uint3 threadId) { //!PASS 5 //!DESC final pass //!IN MR, POSTKERNEL +//!OUT OUTPUT //!BLOCK_SIZE 16 //!NUM_THREADS 64 @@ -307,7 +310,8 @@ void Pass4(uint2 blockStart, uint3 threadId) { void Pass5(uint2 blockStart, uint3 threadId) { const uint2 gxy = (Rmp8x8(threadId.x) << 1) + blockStart; - if (!CheckViewport(gxy)) { + const uint2 outputSize = GetOutputSize(); + if (gxy.x >= outputSize.x || gxy.y >= outputSize.y) { return; } @@ -359,12 +363,6 @@ void Pass5(uint2 blockStart, uint3 threadId) { for (j = 0; j <= 1; ++j) { uint2 destPos = gxy + uint2(i, j); - if (i != 0 || j != 0) { - if (!CheckViewport(destPos)) { - continue; - } - } - float W = 0; float3x3 avg = 0; @@ -386,7 +384,7 @@ void Pass5(uint2 blockStart, uint3 threadId) { } avg /= W; - WriteToOutput(destPos, avg[1] + avg[2] * src2[i][j] - avg[0]); + OUTPUT[destPos] = float4(avg[1] + avg[2] * src2[i][j] - avg[0], 1); } } } diff --git a/src/Magpie.App/ProfilePage.cpp b/src/Magpie.App/ProfilePage.cpp index 88fe472fd..4c28956db 100644 --- a/src/Magpie.App/ProfilePage.cpp +++ b/src/Magpie.App/ProfilePage.cpp @@ -54,7 +54,7 @@ INumberFormatter2 ProfilePage::NumberFormatter() noexcept { DecimalFormatter result; IncrementNumberRounder rounder; // 保留五位小数 - rounder.Increment(0.1); + rounder.Increment(0.00001); result.NumberRounder(rounder); result.FractionDigits(0); return result; diff --git a/src/Magpie.App/ProfilePage.h b/src/Magpie.App/ProfilePage.h index 2b4789d6f..1ccd43644 100644 --- a/src/Magpie.App/ProfilePage.h +++ b/src/Magpie.App/ProfilePage.h @@ -40,7 +40,6 @@ struct ProfilePage : ProfilePageT { private: Magpie::App::ProfileViewModel _viewModel{ nullptr }; - Windows::Globalization::NumberFormatting::DecimalFormatter _numberFormatter; }; } From 338dae18e184bfb33c4137f3148fb533036b000d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=97=AD?= <34770031+Blinue@users.noreply.github.com> Date: Thu, 22 Jun 2023 22:12:06 +0800 Subject: [PATCH 046/155] =?UTF-8?q?feat:=20=E6=9B=B4=E6=96=B0=E6=9B=B4?= =?UTF-8?q?=E5=A4=9A=E6=95=88=E6=9E=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Anime4K/Anime4K_Restore_Soft_VL.hlsl | 23 ++++---- src/Effects/Anime4K/Anime4K_Restore_UL.hlsl | 14 ++--- src/Effects/Anime4K/Anime4K_Restore_VL.hlsl | 23 ++++---- src/Effects/Anime4K/Anime4K_Thin_HQ.hlsl | 23 ++++---- .../Anime4K/Anime4K_Upscale_Denoise_L.hlsl | 50 +++++++++--------- .../Anime4K/Anime4K_Upscale_Denoise_S.hlsl | 37 +++++++------ .../Anime4K/Anime4K_Upscale_Denoise_UL.hlsl | 52 +++++++++---------- .../Anime4K/Anime4K_Upscale_Denoise_VL.hlsl | 51 +++++++++--------- .../Anime4K/Anime4K_Upscale_GAN_x2_S.hlsl | 3 +- src/Effects/Anime4K/Anime4K_Upscale_L.hlsl | 48 ++++++++--------- src/Effects/Anime4K/Anime4K_Upscale_S.hlsl | 37 +++++++------ src/Effects/Anime4K/Anime4K_Upscale_UL.hlsl | 51 +++++++++--------- src/Effects/Anime4K/Anime4K_Upscale_VL.hlsl | 51 +++++++++--------- 13 files changed, 238 insertions(+), 225 deletions(-) diff --git a/src/Effects/Anime4K/Anime4K_Restore_Soft_VL.hlsl b/src/Effects/Anime4K/Anime4K_Restore_Soft_VL.hlsl index 113453ced..4e70771cf 100644 --- a/src/Effects/Anime4K/Anime4K_Restore_Soft_VL.hlsl +++ b/src/Effects/Anime4K/Anime4K_Restore_Soft_VL.hlsl @@ -2,18 +2,17 @@ // Ported from https://github.com/bloc97/Anime4K/blob/4ba94b179a144200cb6b3052e690fe2ca5c6914c/glsl/Restore/Anime4K_Restore_CNN_Soft_VL.glsl //!MAGPIE EFFECT -//!VERSION 3 -//!OUTPUT_WIDTH INPUT_WIDTH -//!OUTPUT_HEIGHT INPUT_HEIGHT +//!VERSION 4 //!SORT_NAME Anime4K_Restore_Soft_2 //!TEXTURE Texture2D INPUT; -//!SAMPLER -//!FILTER POINT -SamplerState sam; +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +Texture2D OUTPUT; //!TEXTURE //!WIDTH INPUT_WIDTH @@ -51,6 +50,10 @@ Texture2D tex5; //!FORMAT R16G16B16A16_FLOAT Texture2D tex6; +//!SAMPLER +//!FILTER POINT +SamplerState sam; + //!PASS 1 //!DESC Conv-4x3x3x3 //!IN INPUT @@ -1125,13 +1128,15 @@ void Pass7(uint2 blockStart, uint3 threadId) { //!PASS 8 //!DESC Conv-4x3x3x16, Conv-3x1x1x112 //!IN INPUT, tex1, tex2, tex5 +//!OUT OUTPUT //!BLOCK_SIZE 8 //!NUM_THREADS 64 void Pass8(uint2 blockStart, uint3 threadId) { uint2 gxy = Rmp8x8(threadId.x) + blockStart; - uint2 inputSize = GetInputSize(); - if (gxy.x >= inputSize.x || gxy.y >= inputSize.y) { + + const uint2 outputSize = GetOutputSize(); + if (gxy.x >= outputSize.x || gxy.y >= outputSize.y) { return; } @@ -1289,5 +1294,5 @@ void Pass8(uint2 blockStart, uint3 threadId) { result += float3(0.018580848, -0.022256816, -0.0266178); result += INPUT.SampleLevel(sam, pos, 0).rgb; - WriteToOutput(gxy, result); + OUTPUT[gxy] = float4(result, 1); } diff --git a/src/Effects/Anime4K/Anime4K_Restore_UL.hlsl b/src/Effects/Anime4K/Anime4K_Restore_UL.hlsl index 880e505a1..e2c60c3e3 100644 --- a/src/Effects/Anime4K/Anime4K_Restore_UL.hlsl +++ b/src/Effects/Anime4K/Anime4K_Restore_UL.hlsl @@ -14,10 +14,6 @@ Texture2D INPUT; //!HEIGHT INPUT_HEIGHT Texture2D OUTPUT; -//!SAMPLER -//!FILTER POINT -SamplerState sam; - //!TEXTURE //!WIDTH INPUT_WIDTH //!HEIGHT INPUT_HEIGHT @@ -66,6 +62,11 @@ Texture2D tex7; //!FORMAT R16G16B16A16_FLOAT Texture2D tex8; +//!SAMPLER +//!FILTER POINT +SamplerState sam; + + //!PASS 1 //!DESC Conv-4x3x3x3 //!IN INPUT @@ -1888,8 +1889,9 @@ void Pass7(uint2 blockStart, uint3 threadId) { void Pass8(uint2 blockStart, uint3 threadId) { uint2 gxy = Rmp8x8(threadId.x) + blockStart; - uint2 inputSize = GetInputSize(); - if (gxy.x >= inputSize.x || gxy.y >= inputSize.y) { + + const uint2 outputSize = GetOutputSize(); + if (gxy.x >= outputSize.x || gxy.y >= outputSize.y) { return; } diff --git a/src/Effects/Anime4K/Anime4K_Restore_VL.hlsl b/src/Effects/Anime4K/Anime4K_Restore_VL.hlsl index 4109710a9..78c02bf7e 100644 --- a/src/Effects/Anime4K/Anime4K_Restore_VL.hlsl +++ b/src/Effects/Anime4K/Anime4K_Restore_VL.hlsl @@ -2,18 +2,17 @@ // 移植自 https://github.com/bloc97/Anime4K/blob/master/glsl/Restore/Anime4K_Restore_CNN_VL.glsl //!MAGPIE EFFECT -//!VERSION 3 -//!OUTPUT_WIDTH INPUT_WIDTH -//!OUTPUT_HEIGHT INPUT_HEIGHT +//!VERSION 4 //!SORT_NAME Anime4K_Restore_2 //!TEXTURE Texture2D INPUT; -//!SAMPLER -//!FILTER POINT -SamplerState sam; +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +Texture2D OUTPUT; //!TEXTURE //!WIDTH INPUT_WIDTH @@ -51,6 +50,10 @@ Texture2D tex5; //!FORMAT R16G16B16A16_FLOAT Texture2D tex6; +//!SAMPLER +//!FILTER POINT +SamplerState sam; + //!PASS 1 //!DESC Conv-4x3x3x3 @@ -1132,13 +1135,15 @@ void Pass7(uint2 blockStart, uint3 threadId) { //!PASS 8 //!DESC Conv-4x3x3x16, Conv-3x1x1x112 //!IN INPUT, tex1, tex2, tex5 +//!OUT OUTPUT //!BLOCK_SIZE 8 //!NUM_THREADS 64 void Pass8(uint2 blockStart, uint3 threadId) { uint2 gxy = Rmp8x8(threadId.x) + blockStart; - uint2 inputSize = GetInputSize(); - if (gxy.x >= inputSize.x || gxy.y >= inputSize.y) { + + const uint2 outputSize = GetOutputSize(); + if (gxy.x >= outputSize.x || gxy.y >= outputSize.y) { return; } @@ -1296,5 +1301,5 @@ void Pass8(uint2 blockStart, uint3 threadId) { result += float3(0.047567394, -0.02504617, -0.028163986); result += INPUT.SampleLevel(sam, pos, 0).rgb; - WriteToOutput(gxy, result); + OUTPUT[gxy] = float4(result, 1); } diff --git a/src/Effects/Anime4K/Anime4K_Thin_HQ.hlsl b/src/Effects/Anime4K/Anime4K_Thin_HQ.hlsl index 270224f8d..bf03e9ed5 100644 --- a/src/Effects/Anime4K/Anime4K_Thin_HQ.hlsl +++ b/src/Effects/Anime4K/Anime4K_Thin_HQ.hlsl @@ -2,9 +2,7 @@ // 移植自 https://github.com/bloc97/Anime4K/blob/master/glsl/Experimental-Effects/Anime4K_Thin_HQ.glsl //!MAGPIE EFFECT -//!VERSION 3 -//!OUTPUT_WIDTH INPUT_WIDTH -//!OUTPUT_HEIGHT INPUT_HEIGHT +//!VERSION 4 //!PARAMETER @@ -30,6 +28,11 @@ int iterations; //!TEXTURE Texture2D INPUT; +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +Texture2D OUTPUT; + //!TEXTURE //!WIDTH INPUT_WIDTH //!HEIGHT INPUT_HEIGHT @@ -280,13 +283,15 @@ void Pass4(uint2 blockStart, uint3 threadId) { //!PASS 5 //!DESC Warp //!IN tex1, INPUT +//!OUT OUTPUT //!BLOCK_SIZE 16 //!NUM_THREADS 64 void Pass5(uint2 blockStart, uint3 threadId) { const uint2 gxy = (Rmp8x8(threadId.x) << 1) + blockStart; - const uint2 inputSize = GetInputSize(); - if (!CheckViewport(gxy)) { + + const uint2 outputSize = GetOutputSize(); + if (gxy.x >= outputSize.x || gxy.y >= outputSize.y) { return; } @@ -299,12 +304,6 @@ void Pass5(uint2 blockStart, uint3 threadId) { for (uint j = 0; j <= 1; ++j) { const uint2 destPos = gxy + uint2(i, j); - if (i != 0 || j != 0) { - if (!CheckViewport(destPos)) { - continue; - } - } - float2 pos = (destPos + 0.5f) * inputPt; for (int i = 0; i < iterations; ++i) { @@ -313,7 +312,7 @@ void Pass5(uint2 blockStart, uint3 threadId) { pos -= dd; } - WriteToOutput(destPos, INPUT.SampleLevel(sam1, pos, 0).rgb); + OUTPUT[destPos] = INPUT.SampleLevel(sam1, pos, 0); } } } diff --git a/src/Effects/Anime4K/Anime4K_Upscale_Denoise_L.hlsl b/src/Effects/Anime4K/Anime4K_Upscale_Denoise_L.hlsl index c6128c8f4..3f81a0da3 100644 --- a/src/Effects/Anime4K/Anime4K_Upscale_Denoise_L.hlsl +++ b/src/Effects/Anime4K/Anime4K_Upscale_Denoise_L.hlsl @@ -2,22 +2,17 @@ // 移植自 https://github.com/bloc97/Anime4K/blob/master/glsl/Upscale%2BDenoise/Anime4K_Upscale_Denoise_CNN_x2_L.glsl //!MAGPIE EFFECT -//!VERSION 3 -//!OUTPUT_WIDTH INPUT_WIDTH * 2 -//!OUTPUT_HEIGHT INPUT_HEIGHT * 2 +//!VERSION 4 //!SORT_NAME Anime4K_Upscale_Denoise_1 //!TEXTURE Texture2D INPUT; -//!SAMPLER -//!FILTER POINT -SamplerState sam; - -//!SAMPLER -//!FILTER LINEAR -SamplerState sam1; +//!TEXTURE +//!WIDTH INPUT_WIDTH * 2 +//!HEIGHT INPUT_HEIGHT * 2 +Texture2D OUTPUT; //!TEXTURE //!WIDTH INPUT_WIDTH @@ -43,6 +38,14 @@ Texture2D tex3; //!FORMAT R16G16B16A16_FLOAT Texture2D tex4; +//!SAMPLER +//!FILTER POINT +SamplerState sam; + +//!SAMPLER +//!FILTER LINEAR +SamplerState sam1; + //!PASS 1 //!DESC Conv-4x3x3x3 @@ -446,12 +449,15 @@ void Pass3(uint2 blockStart, uint3 threadId) { //!PASS 4 //!DESC Conv-4x3x3x16, Depth-to-Space //!IN INPUT, tex1, tex2 +//!OUT OUTPUT //!BLOCK_SIZE 16 //!NUM_THREADS 64 void Pass4(uint2 blockStart, uint3 threadId) { uint2 gxy = (Rmp8x8(threadId.x) << 1) + blockStart; - if (!CheckViewport(gxy)) { + + const uint2 outputSize = GetOutputSize(); + if (gxy.x >= outputSize.x || gxy.y >= outputSize.y) { return; } @@ -638,23 +644,17 @@ void Pass4(uint2 blockStart, uint3 threadId) { float2 outputPt = GetOutputPt(); pos -= 0.5f * outputPt; - WriteToOutput(gxy, float3(target1.x, target2.x, target3.x) + INPUT.SampleLevel(sam1, pos, 0).rgb); + OUTPUT[gxy] = float4(float3(target1.x, target2.x, target3.x) + INPUT.SampleLevel(sam1, pos, 0).rgb, 1); - gxy.x += 1u; + ++gxy.x; pos.x += outputPt.x; - if (CheckViewport(gxy)) { - WriteToOutput(gxy, float3(target1.y, target2.y, target3.y) + INPUT.SampleLevel(sam1, pos, 0).rgb); - } - - gxy.y += 1u; + OUTPUT[gxy] = float4(float3(target1.y, target2.y, target3.y) + INPUT.SampleLevel(sam1, pos, 0).rgb, 1); + + ++gxy.y; pos.y += outputPt.y; - if (CheckViewport(gxy)) { - WriteToOutput(gxy, float3(target1.w, target2.w, target3.w) + INPUT.SampleLevel(sam1, pos, 0).rgb); - } + OUTPUT[gxy] = float4(float3(target1.w, target2.w, target3.w) + INPUT.SampleLevel(sam1, pos, 0).rgb, 1); - gxy.x -= 1u; + --gxy.x; pos.x -= outputPt.x; - if (CheckViewport(gxy)) { - WriteToOutput(gxy, float3(target1.z, target2.z, target3.z) + INPUT.SampleLevel(sam1, pos, 0).rgb); - } + OUTPUT[gxy] = float4(float3(target1.z, target2.z, target3.z) + INPUT.SampleLevel(sam1, pos, 0).rgb, 1); } diff --git a/src/Effects/Anime4K/Anime4K_Upscale_Denoise_S.hlsl b/src/Effects/Anime4K/Anime4K_Upscale_Denoise_S.hlsl index 93b420991..82cd19430 100644 --- a/src/Effects/Anime4K/Anime4K_Upscale_Denoise_S.hlsl +++ b/src/Effects/Anime4K/Anime4K_Upscale_Denoise_S.hlsl @@ -2,15 +2,18 @@ // 移植自 https://github.com/bloc97/Anime4K/blob/master/glsl/Upscale%2BDenoise/Anime4K_Upscale_Denoise_CNN_x2_S.glsl //!MAGPIE EFFECT -//!VERSION 3 -//!OUTPUT_WIDTH INPUT_WIDTH * 2 -//!OUTPUT_HEIGHT INPUT_HEIGHT * 2 +//!VERSION 4 //!SORT_NAME Anime4K_Upscale_Denoise_0 //!TEXTURE Texture2D INPUT; +//!TEXTURE +//!WIDTH INPUT_WIDTH * 2 +//!HEIGHT INPUT_HEIGHT * 2 +Texture2D OUTPUT; + //!TEXTURE //!WIDTH INPUT_WIDTH //!HEIGHT INPUT_HEIGHT @@ -238,6 +241,7 @@ void Pass3(uint2 blockStart, uint3 threadId) { //!PASS 4 //!DESC Conv-4x3x3x8, Depth-to-Space //!IN INPUT, tex1 +//!OUT OUTPUT //!BLOCK_SIZE 16 //!NUM_THREADS 64 @@ -282,7 +286,8 @@ float4 A4KS4(float2 pos) { void Pass4(uint2 blockStart, uint3 threadId) { uint2 gxy = (Rmp8x8(threadId.x) << 1) + blockStart; - if (!CheckViewport(gxy)) { + const uint2 outputSize = GetOutputSize(); + if (gxy.x >= outputSize.x || gxy.y >= outputSize.y) { return; } @@ -291,25 +296,19 @@ void Pass4(uint2 blockStart, uint3 threadId) { float2 pos = ((gxy >> 1) + 0.5f) * inputPt; float4 c = A4KS4(pos); - + pos -= 0.5f * outputPt; - WriteToOutput(gxy, c.x + INPUT.SampleLevel(sam1, pos, 0).rgb); + OUTPUT[gxy] = float4(c.x + INPUT.SampleLevel(sam1, pos, 0).rgb, 1); - gxy.x += 1u; + ++gxy.x; pos.x += outputPt.x; - if (CheckViewport(gxy)) { - WriteToOutput(gxy, c.y + INPUT.SampleLevel(sam1, pos, 0).rgb); - } - - gxy.y += 1u; + OUTPUT[gxy] = float4(c.y + INPUT.SampleLevel(sam1, pos, 0).rgb, 1); + + ++gxy.y; pos.y += outputPt.y; - if (CheckViewport(gxy)) { - WriteToOutput(gxy, c.w + INPUT.SampleLevel(sam1, pos, 0).rgb); - } + OUTPUT[gxy] = float4(c.w + INPUT.SampleLevel(sam1, pos, 0).rgb, 1); - gxy.x -= 1u; + --gxy.x; pos.x -= outputPt.x; - if (CheckViewport(gxy)) { - WriteToOutput(gxy, c.z + INPUT.SampleLevel(sam1, pos, 0).rgb); - } + OUTPUT[gxy] = float4(c.z + INPUT.SampleLevel(sam1, pos, 0).rgb, 1); } diff --git a/src/Effects/Anime4K/Anime4K_Upscale_Denoise_UL.hlsl b/src/Effects/Anime4K/Anime4K_Upscale_Denoise_UL.hlsl index b475b20c4..3298de5b5 100644 --- a/src/Effects/Anime4K/Anime4K_Upscale_Denoise_UL.hlsl +++ b/src/Effects/Anime4K/Anime4K_Upscale_Denoise_UL.hlsl @@ -2,22 +2,17 @@ // 移植自 https://github.com/bloc97/Anime4K/blob/78e4f78f65b772e94bae6e7db5c49af1e889f784/glsl/Upscale%2BDenoise/Anime4K_Upscale_Denoise_CNN_x2_UL.glsl //!MAGPIE EFFECT -//!VERSION 3 -//!OUTPUT_WIDTH INPUT_WIDTH * 2 -//!OUTPUT_HEIGHT INPUT_HEIGHT * 2 +//!VERSION 4 //!SORT_NAME Anime4K_Upscale_Denoise_3 //!TEXTURE Texture2D INPUT; -//!SAMPLER -//!FILTER POINT -SamplerState sam; - -//!SAMPLER -//!FILTER LINEAR -SamplerState sam1; +//!TEXTURE +//!WIDTH INPUT_WIDTH * 2 +//!HEIGHT INPUT_HEIGHT * 2 +Texture2D OUTPUT; //!TEXTURE //!WIDTH INPUT_WIDTH @@ -145,6 +140,14 @@ Texture2D conv2d_6_tf1; //!FORMAT R16G16B16A16_FLOAT Texture2D conv2d_6_tf2; +//!SAMPLER +//!FILTER POINT +SamplerState sam; + +//!SAMPLER +//!FILTER LINEAR +SamplerState sam1; + //!PASS 1 //!DESC Conv-4x3x3x3 //!IN INPUT @@ -1929,12 +1932,15 @@ void Pass7(uint2 blockStart, uint3 threadId) { //!PASS 8 //!DESC Conv-4x1x1x120, Depth-to-Space //!IN INPUT, conv2d_2_tf, conv2d_2_tf1, conv2d_2_tf2, conv2d_3_tf, conv2d_3_tf1, conv2d_3_tf2, conv2d_4_tf, conv2d_4_tf1, conv2d_4_tf2, conv2d_5_tf, conv2d_5_tf1, conv2d_5_tf2, conv2d_6_tf, conv2d_6_tf1, conv2d_6_tf2 +//!OUT OUTPUT //!BLOCK_SIZE 16 //!NUM_THREADS 64 void Pass8(uint2 blockStart, uint3 threadId) { uint2 gxy = (Rmp8x8(threadId.x) << 1) + blockStart; - if (!CheckViewport(gxy)) { + + const uint2 outputSize = GetOutputSize(); + if (gxy.x >= outputSize.x || gxy.y >= outputSize.y) { return; } @@ -2086,25 +2092,19 @@ void Pass8(uint2 blockStart, uint3 threadId) { target3 += float4(0.00428531, -0.011541925, 0.00898425, -0.01374321); float2 outputPt = GetOutputPt(); - + pos -= 0.5f * outputPt; - WriteToOutput(gxy, float3(target1.x, target2.x, target3.x) + INPUT.SampleLevel(sam1, pos, 0).rgb); + OUTPUT[gxy] = float4(float3(target1.x, target2.x, target3.x) + INPUT.SampleLevel(sam1, pos, 0).rgb, 1); - gxy.x += 1u; + ++gxy.x; pos.x += outputPt.x; - if (CheckViewport(gxy)) { - WriteToOutput(gxy, float3(target1.y, target2.y, target3.y) + INPUT.SampleLevel(sam1, pos, 0).rgb); - } - - gxy.y += 1u; + OUTPUT[gxy] = float4(float3(target1.y, target2.y, target3.y) + INPUT.SampleLevel(sam1, pos, 0).rgb, 1); + + ++gxy.y; pos.y += outputPt.y; - if (CheckViewport(gxy)) { - WriteToOutput(gxy, float3(target1.w, target2.w, target3.w) + INPUT.SampleLevel(sam1, pos, 0).rgb); - } + OUTPUT[gxy] = float4(float3(target1.w, target2.w, target3.w) + INPUT.SampleLevel(sam1, pos, 0).rgb, 1); - gxy.x -= 1u; + --gxy.x; pos.x -= outputPt.x; - if (CheckViewport(gxy)) { - WriteToOutput(gxy, float3(target1.z, target2.z, target3.z) + INPUT.SampleLevel(sam1, pos, 0).rgb); - } + OUTPUT[gxy] = float4(float3(target1.z, target2.z, target3.z) + INPUT.SampleLevel(sam1, pos, 0).rgb, 1); } diff --git a/src/Effects/Anime4K/Anime4K_Upscale_Denoise_VL.hlsl b/src/Effects/Anime4K/Anime4K_Upscale_Denoise_VL.hlsl index 8b6852ecf..202939f90 100644 --- a/src/Effects/Anime4K/Anime4K_Upscale_Denoise_VL.hlsl +++ b/src/Effects/Anime4K/Anime4K_Upscale_Denoise_VL.hlsl @@ -2,22 +2,17 @@ // 移植自 https://github.com/bloc97/Anime4K/blob/78e4f78f65b772e94bae6e7db5c49af1e889f784/glsl/Upscale%2BDenoise/Anime4K_Upscale_Denoise_CNN_x2_VL.glsl //!MAGPIE EFFECT -//!VERSION 3 -//!OUTPUT_WIDTH INPUT_WIDTH * 2 -//!OUTPUT_HEIGHT INPUT_HEIGHT * 2 +//!VERSION 4 //!SORT_NAME Anime4K_Upscale_Denoise_2 //!TEXTURE Texture2D INPUT; -//!SAMPLER -//!FILTER POINT -SamplerState sam; - -//!SAMPLER -//!FILTER LINEAR -SamplerState sam1; +//!TEXTURE +//!WIDTH INPUT_WIDTH * 2 +//!HEIGHT INPUT_HEIGHT * 2 +Texture2D OUTPUT; //!TEXTURE //!WIDTH INPUT_WIDTH @@ -103,6 +98,15 @@ Texture2D conv2d_6_tf; //!FORMAT R16G16B16A16_FLOAT Texture2D conv2d_6_tf1; +//!SAMPLER +//!FILTER POINT +SamplerState sam; + +//!SAMPLER +//!FILTER LINEAR +SamplerState sam1; + + //!PASS 1 //!DESC Conv-4x3x3x3 //!IN INPUT @@ -1143,12 +1147,15 @@ void Pass7(uint2 blockStart, uint3 threadId) { //!PASS 8 //!DESC Conv-4x1x1x112, Depth-to-Space //!IN INPUT, conv2d_tf, conv2d_tf1, conv2d_1_tf, conv2d_1_tf1, conv2d_2_tf, conv2d_2_tf1, conv2d_3_tf, conv2d_3_tf1, conv2d_4_tf, conv2d_4_tf1, conv2d_5_tf, conv2d_5_tf1, conv2d_6_tf, conv2d_6_tf1 +//!OUT OUTPUT //!BLOCK_SIZE 16 //!NUM_THREADS 64 void Pass8(uint2 blockStart, uint3 threadId) { uint2 gxy = (Rmp8x8(threadId.x) << 1) + blockStart; - if (!CheckViewport(gxy)) { + + const uint2 outputSize = GetOutputSize(); + if (gxy.x >= outputSize.x || gxy.y >= outputSize.y) { return; } @@ -1293,23 +1300,17 @@ void Pass8(uint2 blockStart, uint3 threadId) { float2 outputPt = GetOutputPt(); pos -= 0.5f * outputPt; - WriteToOutput(gxy, float3(target1.x, target2.x, target3.x) + INPUT.SampleLevel(sam1, pos, 0).rgb); + OUTPUT[gxy] = float4(float3(target1.x, target2.x, target3.x) + INPUT.SampleLevel(sam1, pos, 0).rgb, 1); - gxy.x += 1u; + ++gxy.x; pos.x += outputPt.x; - if (CheckViewport(gxy)) { - WriteToOutput(gxy, float3(target1.y, target2.y, target3.y) + INPUT.SampleLevel(sam1, pos, 0).rgb); - } - - gxy.y += 1u; + OUTPUT[gxy] = float4(float3(target1.y, target2.y, target3.y) + INPUT.SampleLevel(sam1, pos, 0).rgb, 1); + + ++gxy.y; pos.y += outputPt.y; - if (CheckViewport(gxy)) { - WriteToOutput(gxy, float3(target1.w, target2.w, target3.w) + INPUT.SampleLevel(sam1, pos, 0).rgb); - } + OUTPUT[gxy] = float4(float3(target1.w, target2.w, target3.w) + INPUT.SampleLevel(sam1, pos, 0).rgb, 1); - gxy.x -= 1u; + --gxy.x; pos.x -= outputPt.x; - if (CheckViewport(gxy)) { - WriteToOutput(gxy, float3(target1.z, target2.z, target3.z) + INPUT.SampleLevel(sam1, pos, 0).rgb); - } + OUTPUT[gxy] = float4(float3(target1.z, target2.z, target3.z) + INPUT.SampleLevel(sam1, pos, 0).rgb, 1); } diff --git a/src/Effects/Anime4K/Anime4K_Upscale_GAN_x2_S.hlsl b/src/Effects/Anime4K/Anime4K_Upscale_GAN_x2_S.hlsl index d65f592f6..f9d49cf48 100644 --- a/src/Effects/Anime4K/Anime4K_Upscale_GAN_x2_S.hlsl +++ b/src/Effects/Anime4K/Anime4K_Upscale_GAN_x2_S.hlsl @@ -704,7 +704,8 @@ void Pass6(uint2 blockStart, uint3 threadId) { void Pass7(uint2 blockStart, uint3 threadId) { uint2 gxy = Rmp8x8(threadId.x) + blockStart; - uint2 outputSize = GetOutputSize(); + + const uint2 outputSize = GetOutputSize(); if (gxy.x >= outputSize.x || gxy.y >= outputSize.y) { return; } diff --git a/src/Effects/Anime4K/Anime4K_Upscale_L.hlsl b/src/Effects/Anime4K/Anime4K_Upscale_L.hlsl index 55f6c9ed7..6147b1063 100644 --- a/src/Effects/Anime4K/Anime4K_Upscale_L.hlsl +++ b/src/Effects/Anime4K/Anime4K_Upscale_L.hlsl @@ -2,22 +2,17 @@ // 移植自 https://github.com/bloc97/Anime4K/blob/master/glsl/Upscale/Anime4K_Upscale_CNN_x2_L.glsl //!MAGPIE EFFECT -//!VERSION 3 -//!OUTPUT_WIDTH INPUT_WIDTH * 2 -//!OUTPUT_HEIGHT INPUT_HEIGHT * 2 +//!VERSION 4 //!SORT_NAME Anime4K_Upscale_1 //!TEXTURE Texture2D INPUT; -//!SAMPLER -//!FILTER POINT -SamplerState sam; - -//!SAMPLER -//!FILTER LINEAR -SamplerState sam1; +//!TEXTURE +//!WIDTH INPUT_WIDTH * 2 +//!HEIGHT INPUT_HEIGHT * 2 +Texture2D OUTPUT; //!TEXTURE //!WIDTH INPUT_WIDTH @@ -43,6 +38,14 @@ Texture2D tex3; //!FORMAT R16G16B16A16_FLOAT Texture2D tex4; +//!SAMPLER +//!FILTER POINT +SamplerState sam; + +//!SAMPLER +//!FILTER LINEAR +SamplerState sam1; + //!PASS 1 //!DESC Conv-4x3x3x3 @@ -446,12 +449,15 @@ void Pass3(uint2 blockStart, uint3 threadId) { //!PASS 4 //!DESC Conv-4x3x3x16, Depth-to-Space //!IN INPUT, tex1, tex2 +//!OUT OUTPUT //!BLOCK_SIZE 16 //!NUM_THREADS 64 void Pass4(uint2 blockStart, uint3 threadId) { uint2 gxy = (Rmp8x8(threadId.x) << 1) + blockStart; - if (!CheckViewport(gxy)) { + + const uint2 outputSize = GetOutputSize(); + if (gxy.x >= outputSize.x || gxy.y >= outputSize.y) { return; } @@ -638,23 +644,17 @@ void Pass4(uint2 blockStart, uint3 threadId) { float2 outputPt = GetOutputPt(); pos -= 0.5f * outputPt; - WriteToOutput(gxy, float3(target1.x, target2.x, target3.x) + INPUT.SampleLevel(sam1, pos, 0).rgb); + OUTPUT[gxy] = float4(float3(target1.x, target2.x, target3.x) + INPUT.SampleLevel(sam1, pos, 0).rgb, 1); - gxy.x += 1u; + ++gxy.x; pos.x += outputPt.x; - if (CheckViewport(gxy)) { - WriteToOutput(gxy, float3(target1.y, target2.y, target3.y) + INPUT.SampleLevel(sam1, pos, 0).rgb); - } + OUTPUT[gxy] = float4(float3(target1.y, target2.y, target3.y) + INPUT.SampleLevel(sam1, pos, 0).rgb, 1); - gxy.y += 1u; + ++gxy.y; pos.y += outputPt.y; - if (CheckViewport(gxy)) { - WriteToOutput(gxy, float3(target1.w, target2.w, target3.w) + INPUT.SampleLevel(sam1, pos, 0).rgb); - } + OUTPUT[gxy] = float4(float3(target1.w, target2.w, target3.w) + INPUT.SampleLevel(sam1, pos, 0).rgb, 1); - gxy.x -= 1u; + --gxy.x; pos.x -= outputPt.x; - if (CheckViewport(gxy)) { - WriteToOutput(gxy, float3(target1.z, target2.z, target3.z) + INPUT.SampleLevel(sam1, pos, 0).rgb); - } + OUTPUT[gxy] = float4(float3(target1.z, target2.z, target3.z) + INPUT.SampleLevel(sam1, pos, 0).rgb, 1); } diff --git a/src/Effects/Anime4K/Anime4K_Upscale_S.hlsl b/src/Effects/Anime4K/Anime4K_Upscale_S.hlsl index 4c9cb9b83..4030ed2f1 100644 --- a/src/Effects/Anime4K/Anime4K_Upscale_S.hlsl +++ b/src/Effects/Anime4K/Anime4K_Upscale_S.hlsl @@ -2,15 +2,18 @@ // 移植自 https://github.com/bloc97/Anime4K/blob/master/glsl/Upscale/Anime4K_Upscale_CNN_x2_S.glsl //!MAGPIE EFFECT -//!VERSION 3 -//!OUTPUT_WIDTH INPUT_WIDTH * 2 -//!OUTPUT_HEIGHT INPUT_HEIGHT * 2 +//!VERSION 4 //!SORT_NAME Anime4K_Upscale_0 //!TEXTURE Texture2D INPUT; +//!TEXTURE +//!WIDTH INPUT_WIDTH * 2 +//!HEIGHT INPUT_HEIGHT * 2 +Texture2D OUTPUT; + //!TEXTURE //!WIDTH INPUT_WIDTH //!HEIGHT INPUT_HEIGHT @@ -238,6 +241,7 @@ void Pass3(uint2 blockStart, uint3 threadId) { //!PASS 4 //!DESC Conv-4x3x3x8, Depth-to-Space //!IN INPUT, tex1 +//!OUT OUTPUT //!BLOCK_SIZE 16 //!NUM_THREADS 64 @@ -282,7 +286,8 @@ float4 A4KS4(float2 pos) { void Pass4(uint2 blockStart, uint3 threadId) { uint2 gxy = (Rmp8x8(threadId.x) << 1) + blockStart; - if (!CheckViewport(gxy)) { + const uint2 outputSize = GetOutputSize(); + if (gxy.x >= outputSize.x || gxy.y >= outputSize.y) { return; } @@ -293,23 +298,17 @@ void Pass4(uint2 blockStart, uint3 threadId) { float4 c = A4KS4(pos); pos -= 0.5f * outputPt; - WriteToOutput(gxy, c.x + INPUT.SampleLevel(sam1, pos, 0).rgb); - - gxy.x += 1u; + OUTPUT[gxy] = float4(c.x + INPUT.SampleLevel(sam1, pos, 0).rgb, 1); + + ++gxy.x; pos.x += outputPt.x; - if (CheckViewport(gxy)) { - WriteToOutput(gxy, c.y + INPUT.SampleLevel(sam1, pos, 0).rgb); - } + OUTPUT[gxy] = float4(c.y + INPUT.SampleLevel(sam1, pos, 0).rgb, 1); - gxy.y += 1u; + ++gxy.y; pos.y += outputPt.y; - if (CheckViewport(gxy)) { - WriteToOutput(gxy, c.w + INPUT.SampleLevel(sam1, pos, 0).rgb); - } - - gxy.x -= 1u; + OUTPUT[gxy] = float4(c.w + INPUT.SampleLevel(sam1, pos, 0).rgb, 1); + + --gxy.x; pos.x -= outputPt.x; - if (CheckViewport(gxy)) { - WriteToOutput(gxy, c.z + INPUT.SampleLevel(sam1, pos, 0).rgb); - } + OUTPUT[gxy] = float4(c.z + INPUT.SampleLevel(sam1, pos, 0).rgb, 1); } diff --git a/src/Effects/Anime4K/Anime4K_Upscale_UL.hlsl b/src/Effects/Anime4K/Anime4K_Upscale_UL.hlsl index f03ee4d64..c65991785 100644 --- a/src/Effects/Anime4K/Anime4K_Upscale_UL.hlsl +++ b/src/Effects/Anime4K/Anime4K_Upscale_UL.hlsl @@ -2,22 +2,17 @@ // 移植自 https://github.com/bloc97/Anime4K/blob/78e4f78f65b772e94bae6e7db5c49af1e889f784/glsl/Upscale/Anime4K_Upscale_CNN_x2_UL.glsl //!MAGPIE EFFECT -//!VERSION 3 -//!OUTPUT_WIDTH INPUT_WIDTH * 2 -//!OUTPUT_HEIGHT INPUT_HEIGHT * 2 +//!VERSION 4 //!SORT_NAME Anime4K_Upscale_3 //!TEXTURE Texture2D INPUT; -//!SAMPLER -//!FILTER POINT -SamplerState sam; - -//!SAMPLER -//!FILTER LINEAR -SamplerState sam1; +//!TEXTURE +//!WIDTH INPUT_WIDTH * 2 +//!HEIGHT INPUT_HEIGHT * 2 +Texture2D OUTPUT; //!TEXTURE //!WIDTH INPUT_WIDTH @@ -145,6 +140,15 @@ Texture2D conv2d_6_tf1; //!FORMAT R16G16B16A16_FLOAT Texture2D conv2d_6_tf2; +//!SAMPLER +//!FILTER POINT +SamplerState sam; + +//!SAMPLER +//!FILTER LINEAR +SamplerState sam1; + + //!PASS 1 //!DESC Conv-4x3x3x3 //!IN INPUT @@ -1929,12 +1933,15 @@ void Pass7(uint2 blockStart, uint3 threadId) { //!PASS 8 //!DESC Conv-4x1x1x120, Depth-to-Space //!IN INPUT, conv2d_2_tf, conv2d_2_tf1, conv2d_2_tf2, conv2d_3_tf, conv2d_3_tf1, conv2d_3_tf2, conv2d_4_tf, conv2d_4_tf1, conv2d_4_tf2, conv2d_5_tf, conv2d_5_tf1, conv2d_5_tf2, conv2d_6_tf, conv2d_6_tf1, conv2d_6_tf2 +//!OUT OUTPUT //!BLOCK_SIZE 16 //!NUM_THREADS 64 void Pass8(uint2 blockStart, uint3 threadId) { uint2 gxy = (Rmp8x8(threadId.x) << 1) + blockStart; - if (!CheckViewport(gxy)) { + + const uint2 outputSize = GetOutputSize(); + if (gxy.x >= outputSize.x || gxy.y >= outputSize.y) { return; } @@ -2088,23 +2095,17 @@ void Pass8(uint2 blockStart, uint3 threadId) { float2 outputPt = GetOutputPt(); pos -= 0.5f * outputPt; - WriteToOutput(gxy, float3(target1.x, target2.x, target3.x) + INPUT.SampleLevel(sam1, pos, 0).rgb); + OUTPUT[gxy] = float4(float3(target1.x, target2.x, target3.x) + INPUT.SampleLevel(sam1, pos, 0).rgb, 1); - gxy.x += 1u; + ++gxy.x; pos.x += outputPt.x; - if (CheckViewport(gxy)) { - WriteToOutput(gxy, float3(target1.y, target2.y, target3.y) + INPUT.SampleLevel(sam1, pos, 0).rgb); - } - - gxy.y += 1u; + OUTPUT[gxy] = float4(float3(target1.y, target2.y, target3.y) + INPUT.SampleLevel(sam1, pos, 0).rgb, 1); + + ++gxy.y; pos.y += outputPt.y; - if (CheckViewport(gxy)) { - WriteToOutput(gxy, float3(target1.w, target2.w, target3.w) + INPUT.SampleLevel(sam1, pos, 0).rgb); - } + OUTPUT[gxy] = float4(float3(target1.w, target2.w, target3.w) + INPUT.SampleLevel(sam1, pos, 0).rgb, 1); - gxy.x -= 1u; + --gxy.x; pos.x -= outputPt.x; - if (CheckViewport(gxy)) { - WriteToOutput(gxy, float3(target1.z, target2.z, target3.z) + INPUT.SampleLevel(sam1, pos, 0).rgb); - } + OUTPUT[gxy] = float4(float3(target1.z, target2.z, target3.z) + INPUT.SampleLevel(sam1, pos, 0).rgb, 1); } diff --git a/src/Effects/Anime4K/Anime4K_Upscale_VL.hlsl b/src/Effects/Anime4K/Anime4K_Upscale_VL.hlsl index a0337884d..bb8f1ca78 100644 --- a/src/Effects/Anime4K/Anime4K_Upscale_VL.hlsl +++ b/src/Effects/Anime4K/Anime4K_Upscale_VL.hlsl @@ -2,22 +2,17 @@ // 移植自 https://github.com/bloc97/Anime4K/blob/78e4f78f65b772e94bae6e7db5c49af1e889f784/glsl/Upscale/Anime4K_Upscale_CNN_x2_VL.glsl //!MAGPIE EFFECT -//!VERSION 3 -//!OUTPUT_WIDTH INPUT_WIDTH * 2 -//!OUTPUT_HEIGHT INPUT_HEIGHT * 2 +//!VERSION 4 //!SORT_NAME Anime4K_Upscale_2 //!TEXTURE Texture2D INPUT; -//!SAMPLER -//!FILTER POINT -SamplerState sam; - -//!SAMPLER -//!FILTER LINEAR -SamplerState sam1; +//!TEXTURE +//!WIDTH INPUT_WIDTH * 2 +//!HEIGHT INPUT_HEIGHT * 2 +Texture2D OUTPUT; //!TEXTURE //!WIDTH INPUT_WIDTH @@ -103,6 +98,15 @@ Texture2D conv2d_6_tf; //!FORMAT R16G16B16A16_FLOAT Texture2D conv2d_6_tf1; +//!SAMPLER +//!FILTER POINT +SamplerState sam; + +//!SAMPLER +//!FILTER LINEAR +SamplerState sam1; + + //!PASS 1 //!DESC Conv-4x3x3x3 //!IN INPUT @@ -1143,12 +1147,15 @@ void Pass7(uint2 blockStart, uint3 threadId) { //!PASS 8 //!DESC Conv-4x1x1x112, Depth-to-Space //!IN INPUT, conv2d_tf, conv2d_tf1, conv2d_1_tf, conv2d_1_tf1, conv2d_2_tf, conv2d_2_tf1, conv2d_3_tf, conv2d_3_tf1, conv2d_4_tf, conv2d_4_tf1, conv2d_5_tf, conv2d_5_tf1, conv2d_6_tf, conv2d_6_tf1 +//!OUT OUTPUT //!BLOCK_SIZE 16 //!NUM_THREADS 64 void Pass8(uint2 blockStart, uint3 threadId) { uint2 gxy = (Rmp8x8(threadId.x) << 1) + blockStart; - if (!CheckViewport(gxy)) { + + const uint2 outputSize = GetOutputSize(); + if (gxy.x >= outputSize.x || gxy.y >= outputSize.y) { return; } @@ -1293,23 +1300,17 @@ void Pass8(uint2 blockStart, uint3 threadId) { float2 outputPt = GetOutputPt(); pos -= 0.5f * outputPt; - WriteToOutput(gxy, float3(target1.x, target2.x, target3.x) + INPUT.SampleLevel(sam1, pos, 0).rgb); + OUTPUT[gxy] = float4(float3(target1.x, target2.x, target3.x) + INPUT.SampleLevel(sam1, pos, 0).rgb, 1); - gxy.x += 1u; + ++gxy.x; pos.x += outputPt.x; - if (CheckViewport(gxy)) { - WriteToOutput(gxy, float3(target1.y, target2.y, target3.y) + INPUT.SampleLevel(sam1, pos, 0).rgb); - } - - gxy.y += 1u; + OUTPUT[gxy] = float4(float3(target1.y, target2.y, target3.y) + INPUT.SampleLevel(sam1, pos, 0).rgb, 1); + + ++gxy.y; pos.y += outputPt.y; - if (CheckViewport(gxy)) { - WriteToOutput(gxy, float3(target1.w, target2.w, target3.w) + INPUT.SampleLevel(sam1, pos, 0).rgb); - } + OUTPUT[gxy] = float4(float3(target1.w, target2.w, target3.w) + INPUT.SampleLevel(sam1, pos, 0).rgb, 1); - gxy.x -= 1u; + --gxy.x; pos.x -= outputPt.x; - if (CheckViewport(gxy)) { - WriteToOutput(gxy, float3(target1.z, target2.z, target3.z) + INPUT.SampleLevel(sam1, pos, 0).rgb); - } + OUTPUT[gxy] = float4(float3(target1.z, target2.z, target3.z) + INPUT.SampleLevel(sam1, pos, 0).rgb, 1); } From 45ec72133b632669a65a2cc7e3296494f9833b33 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=97=AD?= <34770031+Blinue@users.noreply.github.com> Date: Fri, 23 Jun 2023 19:03:24 +0800 Subject: [PATCH 047/155] =?UTF-8?q?feat:=20=E6=9B=B4=E6=96=B0=E5=87=A0?= =?UTF-8?q?=E4=B8=AA=E6=95=88=E6=9E=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Effects/CAS/CAS.hlsl | 417 +++++++++++++++--------------- src/Effects/CAS/CAS_Scaling.hlsl | 24 +- src/Effects/CRT/CRT_Easymode.hlsl | 6 +- src/Effects/SSimDownscaler.hlsl | 1 + 4 files changed, 224 insertions(+), 224 deletions(-) diff --git a/src/Effects/CAS/CAS.hlsl b/src/Effects/CAS/CAS.hlsl index 0f09c154e..fc38bebb3 100644 --- a/src/Effects/CAS/CAS.hlsl +++ b/src/Effects/CAS/CAS.hlsl @@ -1,9 +1,8 @@ // 移植自 https://github.com/GPUOpen-Effects/FidelityFX-CAS/blob/master/ffx-cas/ffx_cas.h //!MAGPIE EFFECT -//!VERSION 3 -//!OUTPUT_WIDTH INPUT_WIDTH -//!OUTPUT_HEIGHT INPUT_HEIGHT +//!VERSION 4 + //!PARAMETER //!LABEL Sharpness @@ -16,6 +15,11 @@ float sharpness; //!TEXTURE Texture2D INPUT; +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +Texture2D OUTPUT; + //!SAMPLER //!FILTER POINT SamplerState sam; @@ -23,6 +27,7 @@ SamplerState sam; //!PASS 1 //!IN INPUT +//!OUT OUTPUT //!BLOCK_SIZE 16 //!NUM_THREADS 64 @@ -35,254 +40,244 @@ SamplerState sam; #ifdef MP_FP16 void CasFilterH( - MF3 src[4][4], - uint pos, - MF peak, - // Output values are for 2 8x8 tiles in a 16x8 region. - // pix.x = right 8x8 tile - // pix.y = left 8x8 tile - // This enables later processing to easily be packed as well. - out MF2 pixR, - out MF2 pixG, - out MF2 pixB + MF3 src[4][4], + uint pos, + MF peak, + // Output values are for 2 8x8 tiles in a 16x8 region. + // pix.x = right 8x8 tile + // pix.y = left 8x8 tile + // This enables later processing to easily be packed as well. + out MF2 pixR, + out MF2 pixG, + out MF2 pixB ) { - // AOS to SOA conversion. - MF2 aR = MF2(src[0][pos + 0].r, src[1][pos + 0].r); - MF2 aG = MF2(src[0][pos + 0].g, src[1][pos + 0].g); - MF2 aB = MF2(src[0][pos + 0].b, src[1][pos + 0].b); - MF2 bR = MF2(src[1][pos + 0].r, src[2][pos + 0].r); - MF2 bG = MF2(src[1][pos + 0].g, src[2][pos + 0].g); - MF2 bB = MF2(src[1][pos + 0].b, src[2][pos + 0].b); - MF2 cR = MF2(src[2][pos + 0].r, src[3][pos + 0].r); - MF2 cG = MF2(src[2][pos + 0].g, src[3][pos + 0].g); - MF2 cB = MF2(src[2][pos + 0].b, src[3][pos + 0].b); - MF2 dR = MF2(src[0][pos + 1].r, src[1][pos + 1].r); - MF2 dG = MF2(src[0][pos + 1].g, src[1][pos + 1].g); - MF2 dB = MF2(src[0][pos + 1].b, src[1][pos + 1].b); - MF2 eR = MF2(src[1][pos + 1].r, src[2][pos + 1].r); - MF2 eG = MF2(src[1][pos + 1].g, src[2][pos + 1].g); - MF2 eB = MF2(src[1][pos + 1].b, src[2][pos + 1].b); - MF2 fR = MF2(src[2][pos + 1].r, src[3][pos + 1].r); - MF2 fG = MF2(src[2][pos + 1].g, src[3][pos + 1].g); - MF2 fB = MF2(src[2][pos + 1].b, src[3][pos + 1].b); - MF2 gR = MF2(src[0][pos + 2].r, src[1][pos + 2].r); - MF2 gG = MF2(src[0][pos + 2].g, src[1][pos + 2].g); - MF2 gB = MF2(src[0][pos + 2].b, src[1][pos + 2].b); - MF2 hR = MF2(src[1][pos + 2].r, src[2][pos + 2].r); - MF2 hG = MF2(src[1][pos + 2].g, src[2][pos + 2].g); - MF2 hB = MF2(src[1][pos + 2].b, src[2][pos + 2].b); - MF2 iR = MF2(src[2][pos + 2].r, src[3][pos + 2].r); - MF2 iG = MF2(src[2][pos + 2].g, src[3][pos + 2].g); - MF2 iB = MF2(src[2][pos + 2].b, src[3][pos + 2].b); - - // Soft min and max. - MF2 mnR = min(min(fR, hR), min(min(bR, dR), eR)); - MF2 mnG = min(min(fG, hG), min(min(bG, dG), eG)); - MF2 mnB = min(min(fB, hB), min(min(bB, dB), eB)); + // AOS to SOA conversion. + MF2 aR = MF2(src[0][pos + 0].r, src[1][pos + 0].r); + MF2 aG = MF2(src[0][pos + 0].g, src[1][pos + 0].g); + MF2 aB = MF2(src[0][pos + 0].b, src[1][pos + 0].b); + MF2 bR = MF2(src[1][pos + 0].r, src[2][pos + 0].r); + MF2 bG = MF2(src[1][pos + 0].g, src[2][pos + 0].g); + MF2 bB = MF2(src[1][pos + 0].b, src[2][pos + 0].b); + MF2 cR = MF2(src[2][pos + 0].r, src[3][pos + 0].r); + MF2 cG = MF2(src[2][pos + 0].g, src[3][pos + 0].g); + MF2 cB = MF2(src[2][pos + 0].b, src[3][pos + 0].b); + MF2 dR = MF2(src[0][pos + 1].r, src[1][pos + 1].r); + MF2 dG = MF2(src[0][pos + 1].g, src[1][pos + 1].g); + MF2 dB = MF2(src[0][pos + 1].b, src[1][pos + 1].b); + MF2 eR = MF2(src[1][pos + 1].r, src[2][pos + 1].r); + MF2 eG = MF2(src[1][pos + 1].g, src[2][pos + 1].g); + MF2 eB = MF2(src[1][pos + 1].b, src[2][pos + 1].b); + MF2 fR = MF2(src[2][pos + 1].r, src[3][pos + 1].r); + MF2 fG = MF2(src[2][pos + 1].g, src[3][pos + 1].g); + MF2 fB = MF2(src[2][pos + 1].b, src[3][pos + 1].b); + MF2 gR = MF2(src[0][pos + 2].r, src[1][pos + 2].r); + MF2 gG = MF2(src[0][pos + 2].g, src[1][pos + 2].g); + MF2 gB = MF2(src[0][pos + 2].b, src[1][pos + 2].b); + MF2 hR = MF2(src[1][pos + 2].r, src[2][pos + 2].r); + MF2 hG = MF2(src[1][pos + 2].g, src[2][pos + 2].g); + MF2 hB = MF2(src[1][pos + 2].b, src[2][pos + 2].b); + MF2 iR = MF2(src[2][pos + 2].r, src[3][pos + 2].r); + MF2 iG = MF2(src[2][pos + 2].g, src[3][pos + 2].g); + MF2 iB = MF2(src[2][pos + 2].b, src[3][pos + 2].b); + + // Soft min and max. + MF2 mnR = min(min(fR, hR), min(min(bR, dR), eR)); + MF2 mnG = min(min(fG, hG), min(min(bG, dG), eG)); + MF2 mnB = min(min(fB, hB), min(min(bB, dB), eB)); #ifdef CAS_BETTER_DIAGONALS - MF2 mnR2 = min(min(gR, iR), min(min(aR, cR), mnR)); - MF2 mnG2 = min(min(gG, iG), min(min(aG, cG), mnG)); - MF2 mnB2 = min(min(gB, iB), min(min(aB, cB), mnB)); - mnR = mnR + mnR2; - mnG = mnG + mnG2; - mnB = mnB + mnB2; + MF2 mnR2 = min(min(gR, iR), min(min(aR, cR), mnR)); + MF2 mnG2 = min(min(gG, iG), min(min(aG, cG), mnG)); + MF2 mnB2 = min(min(gB, iB), min(min(aB, cB), mnB)); + mnR = mnR + mnR2; + mnG = mnG + mnG2; + mnB = mnB + mnB2; #endif - MF2 mxR = max(max(fR, hR), max(max(bR, dR), eR)); - MF2 mxG = max(max(fG, hG), max(max(bG, dG), eG)); - MF2 mxB = max(max(fB, hB), max(max(bB, dB), eB)); + MF2 mxR = max(max(fR, hR), max(max(bR, dR), eR)); + MF2 mxG = max(max(fG, hG), max(max(bG, dG), eG)); + MF2 mxB = max(max(fB, hB), max(max(bB, dB), eB)); #ifdef CAS_BETTER_DIAGONALS - MF2 mxR2 = max(max(gR, iR), max(max(aR, cR), mxR)); - MF2 mxG2 = max(max(gG, iG), max(max(aG, cG), mxG)); - MF2 mxB2 = max(max(gB, iB), max(max(aB, cB), mxB)); - mxR = mxR + mxR2; - mxG = mxG + mxG2; - mxB = mxB + mxB2; + MF2 mxR2 = max(max(gR, iR), max(max(aR, cR), mxR)); + MF2 mxG2 = max(max(gG, iG), max(max(aG, cG), mxG)); + MF2 mxB2 = max(max(gB, iB), max(max(aB, cB), mxB)); + mxR = mxR + mxR2; + mxG = mxG + mxG2; + mxB = mxB + mxB2; #endif - // Smooth minimum distance to signal limit divided by smooth max. - MF2 rcpMR = rcp(mxR); - MF2 rcpMG = rcp(mxG); - MF2 rcpMB = rcp(mxB); + // Smooth minimum distance to signal limit divided by smooth max. + MF2 rcpMR = rcp(mxR); + MF2 rcpMG = rcp(mxG); + MF2 rcpMB = rcp(mxB); #ifdef CAS_BETTER_DIAGONALS - MF2 ampR = saturate(min(mnR, 2.0 - mxR) * rcpMR); - MF2 ampG = saturate(min(mnG, 2.0 - mxG) * rcpMG); - MF2 ampB = saturate(min(mnB, 2.0 - mxB) * rcpMB); + MF2 ampR = saturate(min(mnR, 2.0 - mxR) * rcpMR); + MF2 ampG = saturate(min(mnG, 2.0 - mxG) * rcpMG); + MF2 ampB = saturate(min(mnB, 2.0 - mxB) * rcpMB); #else - MF2 ampR = saturate(min(mnR, 1.0 - mxR) * rcpMR); - MF2 ampG = saturate(min(mnG, 1.0 - mxG) * rcpMG); - MF2 ampB = saturate(min(mnB, 1.0 - mxB) * rcpMB); + MF2 ampR = saturate(min(mnR, 1.0 - mxR) * rcpMR); + MF2 ampG = saturate(min(mnG, 1.0 - mxG) * rcpMG); + MF2 ampB = saturate(min(mnB, 1.0 - mxB) * rcpMB); #endif - // Shaping amount of sharpening. + // Shaping amount of sharpening. - ampR = sqrt(ampR); - ampG = sqrt(ampG); - ampB = sqrt(ampB); + ampR = sqrt(ampR); + ampG = sqrt(ampG); + ampB = sqrt(ampB); - // Filter shape. - MF2 wR = ampR * peak; - MF2 wG = ampG * peak; - MF2 wB = ampB * peak; - // Filter. + // Filter shape. + MF2 wR = ampR * peak; + MF2 wG = ampG * peak; + MF2 wB = ampB * peak; + // Filter. - MF2 rcpWeight = rcp(1.0 + 4.0 * wG); + MF2 rcpWeight = rcp(1.0 + 4.0 * wG); - pixR = saturate((bR * wG + dR * wG + fR * wG + hR * wG + eR) * rcpWeight); - pixG = saturate((bG * wG + dG * wG + fG * wG + hG * wG + eG) * rcpWeight); - pixB = saturate((bB * wG + dB * wG + fB * wG + hB * wG + eB) * rcpWeight); + pixR = saturate((bR * wG + dR * wG + fR * wG + hR * wG + eR) * rcpWeight); + pixG = saturate((bG * wG + dG * wG + fG * wG + hG * wG + eG) * rcpWeight); + pixB = saturate((bB * wG + dB * wG + fB * wG + hB * wG + eB) * rcpWeight); } #else MF3 CasFilter(MF3 src[4][4], uint2 pos, MF peak) { - // a b c - // d e f - // g h i - MF3 a = src[pos.x - 1][pos.y - 1]; - MF3 b = src[pos.x][pos.y - 1]; - MF3 c = src[pos.x + 1][pos.y - 1]; - MF3 d = src[pos.x - 1][pos.y]; - MF3 e = src[pos.x][pos.y]; - MF3 f = src[pos.x + 1][pos.y]; - MF3 g = src[pos.x - 1][pos.y + 1]; - MF3 h = src[pos.x][pos.y + 1]; - MF3 i = src[pos.x + 1][pos.y + 1]; - - // Soft min and max. - // a b c b - // d e f * 0.5 + d e f * 0.5 - // g h i h - // These are 2.0x bigger (factored out the extra multiply). - MF mnR = min3(min3(d.r, e.r, f.r), b.r, h.r); - MF mnG = min3(min3(d.g, e.g, f.g), b.g, h.g); - MF mnB = min3(min3(d.b, e.b, f.b), b.b, h.b); + // a b c + // d e f + // g h i + MF3 a = src[pos.x - 1][pos.y - 1]; + MF3 b = src[pos.x][pos.y - 1]; + MF3 c = src[pos.x + 1][pos.y - 1]; + MF3 d = src[pos.x - 1][pos.y]; + MF3 e = src[pos.x][pos.y]; + MF3 f = src[pos.x + 1][pos.y]; + MF3 g = src[pos.x - 1][pos.y + 1]; + MF3 h = src[pos.x][pos.y + 1]; + MF3 i = src[pos.x + 1][pos.y + 1]; + + // Soft min and max. + // a b c b + // d e f * 0.5 + d e f * 0.5 + // g h i h + // These are 2.0x bigger (factored out the extra multiply). + MF mnR = min3(min3(d.r, e.r, f.r), b.r, h.r); + MF mnG = min3(min3(d.g, e.g, f.g), b.g, h.g); + MF mnB = min3(min3(d.b, e.b, f.b), b.b, h.b); #ifdef CAS_BETTER_DIAGONALS - MF mnR2 = min3(min3(mnR, a.r, c.r), g.r, i.r); - MF mnG2 = min3(min3(mnG, a.g, c.g), g.g, i.g); - MF mnB2 = min3(min3(mnB, a.b, c.b), g.b, i.b); - mnR = mnR + mnR2; - mnG = mnG + mnG2; - mnB = mnB + mnB2; + MF mnR2 = min3(min3(mnR, a.r, c.r), g.r, i.r); + MF mnG2 = min3(min3(mnG, a.g, c.g), g.g, i.g); + MF mnB2 = min3(min3(mnB, a.b, c.b), g.b, i.b); + mnR = mnR + mnR2; + mnG = mnG + mnG2; + mnB = mnB + mnB2; #endif - MF mxR = max3(max3(d.r, e.r, f.r), b.r, h.r); - MF mxG = max3(max3(d.g, e.g, f.g), b.g, h.g); - MF mxB = max3(max3(d.b, e.b, f.b), b.b, h.b); + MF mxR = max3(max3(d.r, e.r, f.r), b.r, h.r); + MF mxG = max3(max3(d.g, e.g, f.g), b.g, h.g); + MF mxB = max3(max3(d.b, e.b, f.b), b.b, h.b); #ifdef CAS_BETTER_DIAGONALS - MF mxR2 = max3(max3(mxR, a.r, c.r), g.r, i.r); - MF mxG2 = max3(max3(mxG, a.g, c.g), g.g, i.g); - MF mxB2 = max3(max3(mxB, a.b, c.b), g.b, i.b); - mxR = mxR + mxR2; - mxG = mxG + mxG2; - mxB = mxB + mxB2; + MF mxR2 = max3(max3(mxR, a.r, c.r), g.r, i.r); + MF mxG2 = max3(max3(mxG, a.g, c.g), g.g, i.g); + MF mxB2 = max3(max3(mxB, a.b, c.b), g.b, i.b); + mxR = mxR + mxR2; + mxG = mxG + mxG2; + mxB = mxB + mxB2; #endif - // Smooth minimum distance to signal limit divided by smooth max. + // Smooth minimum distance to signal limit divided by smooth max. - MF rcpMR = rcp(mxR); - MF rcpMG = rcp(mxG); - MF rcpMB = rcp(mxB); + MF rcpMR = rcp(mxR); + MF rcpMG = rcp(mxG); + MF rcpMB = rcp(mxB); #ifdef CAS_BETTER_DIAGONALS - MF ampR = saturate(min(mnR, 2.0 - mxR) * rcpMR); - MF ampG = saturate(min(mnG, 2.0 - mxG) * rcpMG); - MF ampB = saturate(min(mnB, 2.0 - mxB) * rcpMB); + MF ampR = saturate(min(mnR, 2.0 - mxR) * rcpMR); + MF ampG = saturate(min(mnG, 2.0 - mxG) * rcpMG); + MF ampB = saturate(min(mnB, 2.0 - mxB) * rcpMB); #else - MF ampR = saturate(min(mnR, 1.0 - mxR) * rcpMR); - MF ampG = saturate(min(mnG, 1.0 - mxG) * rcpMG); - MF ampB = saturate(min(mnB, 1.0 - mxB) * rcpMB); + MF ampR = saturate(min(mnR, 1.0 - mxR) * rcpMR); + MF ampG = saturate(min(mnG, 1.0 - mxG) * rcpMG); + MF ampB = saturate(min(mnB, 1.0 - mxB) * rcpMB); #endif - // Shaping amount of sharpening. - ampR = sqrt(ampR); - ampG = sqrt(ampG); - ampB = sqrt(ampB); - - // Filter shape. - // 0 w 0 - // w 1 w - // 0 w 0 - MF wR = ampR * peak; - MF wG = ampG * peak; - MF wB = ampB * peak; - // Filter. - // Using green coef only, depending on dead code removal to strip out the extra overhead. - MF rcpWeight = rcp(1.0 + 4.0 * wG); - - return MF3( - saturate((b.r * wG + d.r * wG + f.r * wG + h.r * wG + e.r) * rcpWeight), - saturate((b.g * wG + d.g * wG + f.g * wG + h.g * wG + e.g) * rcpWeight), - saturate((b.b * wG + d.b * wG + f.b * wG + h.b * wG + e.b) * rcpWeight) - ); + // Shaping amount of sharpening. + ampR = sqrt(ampR); + ampG = sqrt(ampG); + ampB = sqrt(ampB); + + // Filter shape. + // 0 w 0 + // w 1 w + // 0 w 0 + MF wR = ampR * peak; + MF wG = ampG * peak; + MF wB = ampB * peak; + // Filter. + // Using green coef only, depending on dead code removal to strip out the extra overhead. + MF rcpWeight = rcp(1.0 + 4.0 * wG); + + return MF3( + saturate((b.r * wG + d.r * wG + f.r * wG + h.r * wG + e.r) * rcpWeight), + saturate((b.g * wG + d.g * wG + f.g * wG + h.g * wG + e.g) * rcpWeight), + saturate((b.b * wG + d.b * wG + f.b * wG + h.b * wG + e.b) * rcpWeight) + ); } #endif void Pass1(uint2 blockStart, uint3 threadId) { - uint2 gxy = blockStart + (Rmp8x8(threadId.x) << 1); - if (!CheckViewport(gxy)) { - return; - } - - float2 inputPt = GetInputPt(); - uint i, j; - - MF3 src[4][4]; - [unroll] - for (i = 0; i < 3; i += 2) { - [unroll] - for (j = 0; j < 3; j += 2) { - float2 tpos = (gxy + uint2(i, j)) * inputPt; - const MF4 sr = (MF4)INPUT.GatherRed(sam, tpos); - const MF4 sg = (MF4)INPUT.GatherGreen(sam, tpos); - const MF4 sb = (MF4)INPUT.GatherBlue(sam, tpos); - - // w z - // x y - src[i][j] = MF3(sr.w, sg.w, sb.w); - src[i][j + 1] = MF3(sr.x, sg.x, sb.x); - src[i + 1][j] = MF3(sr.z, sg.z, sb.z); - src[i + 1][j + 1] = MF3(sr.y, sg.y, sb.y); - } - } - - const MF peak = -rcp(lerp(8.0, 5.0, (MF)sharpness)); + uint2 gxy = blockStart + (Rmp8x8(threadId.x) << 1); + + const uint2 outputSize = GetOutputSize(); + if (gxy.x >= outputSize.x || gxy.y >= outputSize.y) { + return; + } + + float2 inputPt = GetInputPt(); + uint i, j; + + MF3 src[4][4]; + [unroll] + for (i = 0; i < 3; i += 2) { + [unroll] + for (j = 0; j < 3; j += 2) { + float2 tpos = (gxy + uint2(i, j)) * inputPt; + const MF4 sr = (MF4)INPUT.GatherRed(sam, tpos); + const MF4 sg = (MF4)INPUT.GatherGreen(sam, tpos); + const MF4 sb = (MF4)INPUT.GatherBlue(sam, tpos); + + // w z + // x y + src[i][j] = MF3(sr.w, sg.w, sb.w); + src[i][j + 1] = MF3(sr.x, sg.x, sb.x); + src[i + 1][j] = MF3(sr.z, sg.z, sb.z); + src[i + 1][j + 1] = MF3(sr.y, sg.y, sb.y); + } + } + + const MF peak = -rcp(lerp(8.0, 5.0, (MF)sharpness)); #ifdef MP_FP16 - MF2 pixR, pixG, pixB; - CasFilterH(src, 0, peak, pixR, pixG, pixB); + MF2 pixR, pixG, pixB; + CasFilterH(src, 0, peak, pixR, pixG, pixB); - WriteToOutput(gxy, float3(pixR.x, pixG.x, pixB.x)); + OUTPUT[gxy] = float4(float3(pixR.x, pixG.x, pixB.x), 1); - ++gxy.x; - if (CheckViewport(gxy)) { - WriteToOutput(gxy, float3(pixR.y, pixG.y, pixB.y)); - } + ++gxy.x; + OUTPUT[gxy] = float4(float3(pixR.y, pixG.y, pixB.y), 1); - CasFilterH(src, 1, peak, pixR, pixG, pixB); + CasFilterH(src, 1, peak, pixR, pixG, pixB); - ++gxy.y; - if (CheckViewport(gxy)) { - WriteToOutput(gxy, float3(pixR.y, pixG.y, pixB.y)); - } + ++gxy.y; + OUTPUT[gxy] = float4(float3(pixR.y, pixG.y, pixB.y), 1); - --gxy.x; - if (CheckViewport(gxy)) { - WriteToOutput(gxy, float3(pixR.x, pixG.x, pixB.x)); - } + --gxy.x; + OUTPUT[gxy] = float4(float3(pixR.x, pixG.x, pixB.x), 1); #else - WriteToOutput(gxy, CasFilter(src, uint2(1, 1), peak)); - - ++gxy.x; - if (CheckViewport(gxy)) { - WriteToOutput(gxy, CasFilter(src, uint2(2, 1), peak)); - } - - ++gxy.y; - if (CheckViewport(gxy)) { - WriteToOutput(gxy, CasFilter(src, uint2(2, 2), peak)); - } - - --gxy.x; - if (CheckViewport(gxy)) { - WriteToOutput(gxy, CasFilter(src, uint2(1, 2), peak)); - } + OUTPUT[gxy] = float4(CasFilter(src, uint2(1, 1), peak), 1); + + ++gxy.x; + OUTPUT[gxy] = float4(CasFilter(src, uint2(2, 1), peak), 1); + + ++gxy.y; + OUTPUT[gxy] = float4(CasFilter(src, uint2(2, 2), peak), 1); + + --gxy.x; + OUTPUT[gxy] = float4(CasFilter(src, uint2(1, 2), peak), 1); #endif } diff --git a/src/Effects/CAS/CAS_Scaling.hlsl b/src/Effects/CAS/CAS_Scaling.hlsl index b09503739..f296aa4ce 100644 --- a/src/Effects/CAS/CAS_Scaling.hlsl +++ b/src/Effects/CAS/CAS_Scaling.hlsl @@ -1,7 +1,7 @@ // 移植自 https://github.com/GPUOpen-Effects/FidelityFX-CAS/blob/master/ffx-cas/ffx_cas.h //!MAGPIE EFFECT -//!VERSION 3 +//!VERSION 4 //!PARAMETER //!LABEL Sharpness @@ -14,9 +14,13 @@ float sharpness; //!TEXTURE Texture2D INPUT; +//!TEXTURE +Texture2D OUTPUT; + //!PASS 1 //!IN INPUT +//!OUT OUTPUT //!BLOCK_SIZE 16 //!NUM_THREADS 64 @@ -307,7 +311,9 @@ float3 CasFilter(uint2 ip, float4 const0, float peak) { void Pass1(uint2 blockStart, uint3 threadId) { uint2 gxy = blockStart + Rmp8x8(threadId.x); - if (!CheckViewport(gxy)) { + + const uint2 outputSize = GetOutputSize(); + if (gxy.x >= outputSize.x || gxy.y >= outputSize.y) { return; } @@ -317,20 +323,14 @@ void Pass1(uint2 blockStart, uint3 threadId) { const float peak = -rcp(lerp(8.0, 5.0, sharpness)); - WriteToOutput(gxy, CasFilter(gxy, const0, peak)); + OUTPUT[gxy] = float4(CasFilter(gxy, const0, peak), 1); gxy.x += 8u; - if (CheckViewport(gxy)) { - WriteToOutput(gxy, CasFilter(gxy, const0, peak)); - } + OUTPUT[gxy] = float4(CasFilter(gxy, const0, peak), 1); gxy.y += 8u; - if (CheckViewport(gxy)) { - WriteToOutput(gxy, CasFilter(gxy, const0, peak)); - } + OUTPUT[gxy] = float4(CasFilter(gxy, const0, peak), 1); gxy.x -= 8u; - if (CheckViewport(gxy)) { - WriteToOutput(gxy, CasFilter(gxy, const0, peak)); - } + OUTPUT[gxy] = float4(CasFilter(gxy, const0, peak), 1); } diff --git a/src/Effects/CRT/CRT_Easymode.hlsl b/src/Effects/CRT/CRT_Easymode.hlsl index fc9a96020..3be2608c1 100644 --- a/src/Effects/CRT/CRT_Easymode.hlsl +++ b/src/Effects/CRT/CRT_Easymode.hlsl @@ -31,7 +31,7 @@ */ //!MAGPIE EFFECT -//!VERSION 3 +//!VERSION 4 //!PARAMETER @@ -173,6 +173,9 @@ int dilation; //!TEXTURE Texture2D INPUT; +//!TEXTURE +Texture2D OUTPUT; + //!SAMPLER //!FILTER POINT SamplerState sam; @@ -181,6 +184,7 @@ SamplerState sam; //!PASS 1 //!STYLE PS //!IN INPUT +//!OUT OUTPUT #pragma warning(disable: 3571) // X3571: pow(f, e) will not work for negative f, use abs(f) or conditionally handle negative values if you expect them diff --git a/src/Effects/SSimDownscaler.hlsl b/src/Effects/SSimDownscaler.hlsl index f683ca150..b40f8d84a 100644 --- a/src/Effects/SSimDownscaler.hlsl +++ b/src/Effects/SSimDownscaler.hlsl @@ -310,6 +310,7 @@ void Pass4(uint2 blockStart, uint3 threadId) { void Pass5(uint2 blockStart, uint3 threadId) { const uint2 gxy = (Rmp8x8(threadId.x) << 1) + blockStart; + const uint2 outputSize = GetOutputSize(); if (gxy.x >= outputSize.x || gxy.y >= outputSize.y) { return; From 9ebfc35fc0e075aaf551fed137ff9d1b65a39486 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=97=AD?= <34770031+Blinue@users.noreply.github.com> Date: Fri, 23 Jun 2023 20:21:24 +0800 Subject: [PATCH 048/155] =?UTF-8?q?feat:=20=E5=A4=84=E7=90=86=E5=90=8E?= =?UTF-8?q?=E7=AB=AF=E5=88=9D=E5=A7=8B=E5=8C=96=E5=A4=B1=E8=B4=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Magpie.Core/Renderer.cpp | 101 ++++++++++++++++++----------- src/Magpie.Core/Renderer.h | 3 + src/Magpie.Core/ScalingRuntime.cpp | 4 +- 3 files changed, 67 insertions(+), 41 deletions(-) diff --git a/src/Magpie.Core/Renderer.cpp b/src/Magpie.Core/Renderer.cpp index 07df54761..504ab3b62 100644 --- a/src/Magpie.Core/Renderer.cpp +++ b/src/Magpie.Core/Renderer.cpp @@ -50,6 +50,10 @@ bool Renderer::Initialize(HWND hwndSrc, HWND hwndScaling, const ScalingOptions& { std::scoped_lock lk(_mutex); if (_sharedTextureHandle) { + if (_sharedTextureHandle == INVALID_HANDLE_VALUE) { + Logger::Get().Error("后端初始化失败"); + return false; + } break; } } @@ -439,6 +443,56 @@ HANDLE Renderer::_CreateSharedTexture(ID3D11Texture2D* effectsOutput) noexcept { void Renderer::_BackendThreadProc(const ScalingOptions& options) noexcept { winrt::init_apartment(winrt::apartment_type::single_threaded); + ID3D11Texture2D* outputTexture = _InitBackend(options); + if (!outputTexture) { + _frameSource.reset(); + // 通知前端初始化失败 + { + std::scoped_lock lk(_mutex); + _sharedTextureHandle = INVALID_HANDLE_VALUE; + } + + // 即使失败也要创建消息循环,否则前端线程将一直等待 + MSG msg; + while (GetMessage(&msg, NULL, 0, 0)) { + DispatchMessage(&msg); + } + return; + } + + bool nextFrame = false; + + MSG msg; + while (true) { + while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { + if (msg.message == WM_QUIT) { + // 不能在前端线程释放 + _frameSource.reset(); + return; + } + + DispatchMessage(&msg); + } + + if (!nextFrame) { + if (!_stepTimer.NewFrame()) { + Sleep(0); + continue; + } + nextFrame = true; + } + + if (_frameSource->Update() == FrameSourceBase::UpdateState::NewFrame) { + nextFrame = false; + _BackendRender(outputTexture); + } + + // 等待新消息 + MsgWaitForMultipleObjectsEx(0, nullptr, INFINITE, QS_ALLINPUT, MWMO_INPUTAVAILABLE); + } +} + +ID3D11Texture2D* Renderer::_InitBackend(const ScalingOptions& options) noexcept { // 创建 DispatcherQueue { DispatcherQueueOptions dqOptions{}; @@ -451,42 +505,42 @@ void Renderer::_BackendThreadProc(const ScalingOptions& options) noexcept { ); if (FAILED(hr)) { Logger::Get().ComError("CreateDispatcherQueueController 失败", hr); - return; + return nullptr; } } _stepTimer.Initialize(options.maxFrameRate); if (!_backendResources.Initialize(options)) { - return; + return nullptr; } if (!_InitFrameSource(options)) { - return; + return nullptr; } ID3D11Texture2D* outputTexture = _BuildEffects(options); if (!outputTexture) { - return; + return nullptr; } - + HRESULT hr = _backendResources.GetD3DDevice()->CreateFence( _fenceValue, D3D11_FENCE_FLAG_NONE, IID_PPV_ARGS(&_d3dFence)); if (FAILED(hr)) { Logger::Get().ComError("CreateFence 失败", hr); - return; + return nullptr; } _fenceEvent.reset(Win32Utils::SafeHandle(CreateEvent(nullptr, FALSE, FALSE, nullptr))); if (!_fenceEvent) { Logger::Get().Win32Error("CreateEvent 失败"); - return; + return nullptr; } HANDLE sharedHandle = _CreateSharedTexture(outputTexture); if (!sharedHandle) { Logger::Get().Win32Error("_CreateSharedTexture 失败"); - return; + return nullptr; } { @@ -495,36 +549,7 @@ void Renderer::_BackendThreadProc(const ScalingOptions& options) noexcept { _srcRect = _frameSource->SrcRect(); } - bool nextFrame = false; - - MSG msg; - while (true) { - while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { - if (msg.message == WM_QUIT) { - // 不能在前端线程释放 - _frameSource.reset(); - return; - } - - DispatchMessage(&msg); - } - - if (!nextFrame) { - if (!_stepTimer.NewFrame()) { - Sleep(0); - continue; - } - nextFrame = true; - } - - if (_frameSource->Update() == FrameSourceBase::UpdateState::NewFrame) { - nextFrame = false; - _BackendRender(outputTexture); - } - - // 等待新消息 1ms - MsgWaitForMultipleObjectsEx(0, nullptr, 1, QS_ALLINPUT, MWMO_INPUTAVAILABLE); - } + return outputTexture; } void Renderer::_BackendRender(ID3D11Texture2D* effectsOutput) noexcept { diff --git a/src/Magpie.Core/Renderer.h b/src/Magpie.Core/Renderer.h index 3fa0f8dff..7f837b1a9 100644 --- a/src/Magpie.Core/Renderer.h +++ b/src/Magpie.Core/Renderer.h @@ -37,6 +37,8 @@ class Renderer { void _BackendThreadProc(const ScalingOptions& options) noexcept; + ID3D11Texture2D* _InitBackend(const ScalingOptions& options) noexcept; + bool _InitFrameSource(const ScalingOptions& options) noexcept; ID3D11Texture2D* _BuildEffects(const ScalingOptions& options) noexcept; @@ -86,6 +88,7 @@ class Renderer { std::atomic _sharedTextureMutexKey = 0; + // INVALID_HANDLE_VALUE 表示后端初始化失败 HANDLE _sharedTextureHandle = NULL; RECT _srcRect{}; // 用于在初始化时同步对 _sharedTextureHandle 和 _srcRect 的访问 diff --git a/src/Magpie.Core/ScalingRuntime.cpp b/src/Magpie.Core/ScalingRuntime.cpp index 3e4f971a9..049358a05 100644 --- a/src/Magpie.Core/ScalingRuntime.cpp +++ b/src/Magpie.Core/ScalingRuntime.cpp @@ -87,10 +87,8 @@ void ScalingRuntime::_ScalingThreadProc() noexcept { _scalingWindow.Render(); } else { _IsRunning(false); + MsgWaitForMultipleObjectsEx(0, nullptr, INFINITE, QS_ALLINPUT, MWMO_INPUTAVAILABLE); } - - // 等待新消息 2ms,即我们每隔 2ms 检查一次光标位置 - //MsgWaitForMultipleObjectsEx(0, nullptr, 2, QS_ALLINPUT, MWMO_INPUTAVAILABLE); } } From 885b3b6a7a60e19a19e8d572f752501335031e27 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=97=AD?= <34770031+Blinue@users.noreply.github.com> Date: Sat, 24 Jun 2023 18:52:23 +0800 Subject: [PATCH 049/155] =?UTF-8?q?chore:=20=E6=9B=B4=E6=96=B0=E4=BE=9D?= =?UTF-8?q?=E8=B5=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Magpie.App/Magpie.App.vcxproj | 12 ++++++------ src/Magpie.App/packages.config | 4 ++-- src/Magpie.Core/Magpie.Core.vcxproj | 14 +++++++------- src/Magpie.Core/Magpie.Core.vcxproj.filters | 6 +++--- src/Magpie.Core/Renderer.cpp | 11 +++-------- src/Magpie.Core/packages.config | 4 ++-- src/Magpie/Magpie.vcxproj | 12 ++++++------ src/Magpie/packages.config | 4 ++-- 8 files changed, 31 insertions(+), 36 deletions(-) diff --git a/src/Magpie.App/Magpie.App.vcxproj b/src/Magpie.App/Magpie.App.vcxproj index 06a4f4f7b..562b3b61a 100644 --- a/src/Magpie.App/Magpie.App.vcxproj +++ b/src/Magpie.App/Magpie.App.vcxproj @@ -1,6 +1,6 @@ - + true @@ -592,8 +592,8 @@ - - + + @@ -601,8 +601,8 @@ - - - + + + \ No newline at end of file diff --git a/src/Magpie.App/packages.config b/src/Magpie.App/packages.config index b95621d37..fddd0f7a7 100644 --- a/src/Magpie.App/packages.config +++ b/src/Magpie.App/packages.config @@ -1,6 +1,6 @@  - - + + \ No newline at end of file diff --git a/src/Magpie.Core/Magpie.Core.vcxproj b/src/Magpie.Core/Magpie.Core.vcxproj index 04324fe68..be25a4b75 100644 --- a/src/Magpie.Core/Magpie.Core.vcxproj +++ b/src/Magpie.Core/Magpie.Core.vcxproj @@ -1,6 +1,6 @@ - + Debug @@ -144,9 +144,6 @@ - - - false @@ -166,15 +163,18 @@ Vertex + + + - + 这台计算机上缺少此项目引用的 NuGet 程序包。使用“NuGet 程序包还原”可下载这些程序包。有关更多信息,请参见 http://go.microsoft.com/fwlink/?LinkID=322105。缺少的文件是 {0}。 - - + + \ No newline at end of file diff --git a/src/Magpie.Core/Magpie.Core.vcxproj.filters b/src/Magpie.Core/Magpie.Core.vcxproj.filters index 918d02a38..da2103c4f 100644 --- a/src/Magpie.Core/Magpie.Core.vcxproj.filters +++ b/src/Magpie.Core/Magpie.Core.vcxproj.filters @@ -118,9 +118,6 @@ 资源文件 - - - @@ -138,4 +135,7 @@ Shaders + + + \ No newline at end of file diff --git a/src/Magpie.Core/Renderer.cpp b/src/Magpie.Core/Renderer.cpp index 504ab3b62..829a99155 100644 --- a/src/Magpie.Core/Renderer.cpp +++ b/src/Magpie.Core/Renderer.cpp @@ -183,14 +183,9 @@ bool Renderer::_CreateSwapChain() noexcept { void Renderer::Render(HCURSOR hCursor, POINT cursorPos) noexcept { // 有新帧或光标改变则渲染新的帧 if (_lastAccessMutexKey == _sharedTextureMutexKey) { - if (_lastAccessMutexKey == 0) { - // 第一帧尚未完成 - return; - } - - // 后端没有渲染新的帧,检查光标位置 - if (hCursor == _lastCursorHandle && cursorPos == _lastCursorPos) { - // 光标没有移动 + if (_lastAccessMutexKey == 0 || (hCursor == _lastCursorHandle && cursorPos == _lastCursorPos)) { + // 第一帧尚未完成或光标没有移动 + Sleep(0); return; } } diff --git a/src/Magpie.Core/packages.config b/src/Magpie.Core/packages.config index cb22c8c8d..0002a2e3a 100644 --- a/src/Magpie.Core/packages.config +++ b/src/Magpie.Core/packages.config @@ -1,4 +1,4 @@ - + - + \ No newline at end of file diff --git a/src/Magpie/Magpie.vcxproj b/src/Magpie/Magpie.vcxproj index c921aeadd..5ce0261bf 100644 --- a/src/Magpie/Magpie.vcxproj +++ b/src/Magpie/Magpie.vcxproj @@ -1,6 +1,6 @@ - + @@ -130,8 +130,8 @@ - - + + @@ -139,8 +139,8 @@ - - - + + + \ No newline at end of file diff --git a/src/Magpie/packages.config b/src/Magpie/packages.config index b95621d37..fddd0f7a7 100644 --- a/src/Magpie/packages.config +++ b/src/Magpie/packages.config @@ -1,6 +1,6 @@  - - + + \ No newline at end of file From 8a8522f663973c36708e37295001a15786cfeeaf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=97=AD?= <34770031+Blinue@users.noreply.github.com> Date: Sun, 25 Jun 2023 19:28:34 +0800 Subject: [PATCH 050/155] =?UTF-8?q?perf:=20=E6=8F=90=E9=AB=98=E6=97=B6?= =?UTF-8?q?=E9=92=9F=E7=B2=BE=E5=BA=A6=EF=BC=8C=E9=99=8D=E4=BD=8E=20CPU=20?= =?UTF-8?q?=E5=8D=A0=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Magpie.Core/Renderer.cpp | 4 +++- src/Magpie.Core/ScalingRuntime.cpp | 3 ++- src/Magpie.Core/ScalingWindow.cpp | 7 +++++++ src/Magpie.Core/StepTimer.cpp | 2 +- 4 files changed, 13 insertions(+), 3 deletions(-) diff --git a/src/Magpie.Core/Renderer.cpp b/src/Magpie.Core/Renderer.cpp index 829a99155..dc1210e0b 100644 --- a/src/Magpie.Core/Renderer.cpp +++ b/src/Magpie.Core/Renderer.cpp @@ -185,7 +185,6 @@ void Renderer::Render(HCURSOR hCursor, POINT cursorPos) noexcept { if (_lastAccessMutexKey == _sharedTextureMutexKey) { if (_lastAccessMutexKey == 0 || (hCursor == _lastCursorHandle && cursorPos == _lastCursorPos)) { // 第一帧尚未完成或光标没有移动 - Sleep(0); return; } } @@ -583,6 +582,9 @@ void Renderer::_BackendRender(ID3D11Texture2D* effectsOutput) noexcept { // 根据 https://learn.microsoft.com/en-us/windows/win32/api/d3d11/nf-d3d11-id3d11device-opensharedresource, // 更新共享纹理后必须调用 Flush d3dDC->Flush(); + + // 唤醒前台线程 + PostMessage(_hwndScaling, WM_NULL, 0, 0); } } diff --git a/src/Magpie.Core/ScalingRuntime.cpp b/src/Magpie.Core/ScalingRuntime.cpp index 049358a05..26bde3e53 100644 --- a/src/Magpie.Core/ScalingRuntime.cpp +++ b/src/Magpie.Core/ScalingRuntime.cpp @@ -85,9 +85,10 @@ void ScalingRuntime::_ScalingThreadProc() noexcept { if (_scalingWindow) { _scalingWindow.Render(); + MsgWaitForMultipleObjectsEx(0, nullptr, 1, QS_ALLINPUT, MWMO_INPUTAVAILABLE); } else { _IsRunning(false); - MsgWaitForMultipleObjectsEx(0, nullptr, INFINITE, QS_ALLINPUT, MWMO_INPUTAVAILABLE); + WaitMessage(); } } } diff --git a/src/Magpie.Core/ScalingWindow.cpp b/src/Magpie.Core/ScalingWindow.cpp index 518a3a05d..9952b3841 100644 --- a/src/Magpie.Core/ScalingWindow.cpp +++ b/src/Magpie.Core/ScalingWindow.cpp @@ -6,6 +6,7 @@ #include "Win32Utils.h" #include "WindowHelper.h" #include "CursorManager.h" +#include namespace Magpie::Core { @@ -103,6 +104,9 @@ bool ScalingWindow::Create(HINSTANCE hInstance, HWND hwndSrc, ScalingOptions&& o return false; } + // 提高时钟精度,默认为 15.6ms + timeBeginPeriod(1); + RECT wndRect; if (!CalcHostWndRect(_hwndSrc, _options.multiMonitorUsage, wndRect)) { Logger::Get().Error("CalcHostWndRect 失败"); @@ -213,6 +217,9 @@ LRESULT ScalingWindow::_MessageHandler(UINT msg, WPARAM wParam, LPARAM lParam) n _options = {}; _hwndSrc = NULL; _srcWndRect = {}; + + // 还原时钟精度 + timeEndPeriod(1); break; } } diff --git a/src/Magpie.Core/StepTimer.cpp b/src/Magpie.Core/StepTimer.cpp index b98ea322e..6e2b8ce34 100644 --- a/src/Magpie.Core/StepTimer.cpp +++ b/src/Magpie.Core/StepTimer.cpp @@ -37,7 +37,7 @@ bool StepTimer::NewFrame() noexcept { _framesThisSecond = 0; _fpsCounter %= 1s; - OutputDebugString(fmt::format(L"{}\n", _framesPerSecond).c_str()); + OutputDebugString(fmt::format(L"fps: {}\n", _framesPerSecond).c_str()); } return true; From 698fd50c5c8b61e5fa98698259a7e2ee6d9615c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=97=AD?= <34770031+Blinue@users.noreply.github.com> Date: Sun, 25 Jun 2023 22:24:21 +0800 Subject: [PATCH 051/155] =?UTF-8?q?perf:=20=E4=BC=98=E5=8C=96=E6=B5=81?= =?UTF-8?q?=E7=95=85=E5=BA=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Magpie.Core/Renderer.cpp | 29 ++++++++++++++++++++++++++--- src/Magpie.Core/StepTimer.cpp | 29 +++++++++++++++++++---------- src/Magpie.Core/StepTimer.h | 3 +++ 3 files changed, 48 insertions(+), 13 deletions(-) diff --git a/src/Magpie.Core/Renderer.cpp b/src/Magpie.Core/Renderer.cpp index dc1210e0b..87cad6f33 100644 --- a/src/Magpie.Core/Renderer.cpp +++ b/src/Magpie.Core/Renderer.cpp @@ -470,7 +470,6 @@ void Renderer::_BackendThreadProc(const ScalingOptions& options) noexcept { if (!nextFrame) { if (!_stepTimer.NewFrame()) { - Sleep(0); continue; } nextFrame = true; @@ -482,7 +481,7 @@ void Renderer::_BackendThreadProc(const ScalingOptions& options) noexcept { } // 等待新消息 - MsgWaitForMultipleObjectsEx(0, nullptr, INFINITE, QS_ALLINPUT, MWMO_INPUTAVAILABLE); + WaitMessage(); } } @@ -503,7 +502,31 @@ ID3D11Texture2D* Renderer::_InitBackend(const ScalingOptions& options) noexcept } } - _stepTimer.Initialize(options.maxFrameRate); + { + std::optional frameRateLimit; + // 渲染帧率最大为屏幕刷新率,这是某些捕获方法的要求,也可以提高 Graphics Capture 的流畅度 + if (HMONITOR hMon = MonitorFromWindow(_hwndSrc, MONITOR_DEFAULTTONEAREST)) { + MONITORINFOEX mi{ sizeof(MONITORINFOEX) }; + GetMonitorInfo(hMon, &mi); + + DEVMODE dm{}; + dm.dmSize = sizeof(DEVMODE); + EnumDisplaySettings(mi.szDevice, ENUM_CURRENT_SETTINGS, &dm); + + if (dm.dmDisplayFrequency > 0) { + Logger::Get().Info(fmt::format("屏幕刷新率:{}", dm.dmDisplayFrequency)); + frameRateLimit = (float)dm.dmDisplayFrequency; + } + } + + if (options.maxFrameRate) { + if (!frameRateLimit || *options.maxFrameRate < *frameRateLimit) { + frameRateLimit = options.maxFrameRate; + } + } + + _stepTimer.Initialize(frameRateLimit); + } if (!_backendResources.Initialize(options)) { return nullptr; diff --git a/src/Magpie.Core/StepTimer.cpp b/src/Magpie.Core/StepTimer.cpp index 6e2b8ce34..7c7bfe441 100644 --- a/src/Magpie.Core/StepTimer.cpp +++ b/src/Magpie.Core/StepTimer.cpp @@ -8,30 +8,39 @@ namespace Magpie::Core { void StepTimer::Initialize(std::optional maxFrameRate) noexcept { if (maxFrameRate) { _minInterval = duration_cast(duration(1 / *maxFrameRate)); + _hTimer.reset(CreateWaitableTimerEx(nullptr, nullptr, + CREATE_WAITABLE_TIMER_HIGH_RESOLUTION, TIMER_ALL_ACCESS)); } } bool StepTimer::NewFrame() noexcept { - auto now = high_resolution_clock::now(); - - if (_minInterval) { - const nanoseconds delta = now - _lastFrameTime; - if (delta >= *_minInterval) { - _elapsedTime = delta; + const auto now = high_resolution_clock::now(); + const nanoseconds delta = now - _lastFrameTime; + + if (_minInterval && delta < *_minInterval) { + const nanoseconds rest = *_minInterval - delta; + if (rest > 1ms) { + // Sleep 精度太低,我们使用 WaitableTimer 睡眠 + LARGE_INTEGER liDueTime; + liDueTime.QuadPart = (rest - 1ms).count() / -100; + SetWaitableTimerEx(_hTimer.get(), &liDueTime, 0, NULL, NULL, 0, 0); + WaitForSingleObject(_hTimer.get(), INFINITE); } else { - return false; + // 剩余时间在 1ms 以内则“忙等待” + Sleep(0); } - } else { - _elapsedTime = now - _lastFrameTime; + + return false; } + _elapsedTime = delta; _lastFrameTime = now; // 更新当前帧率 ++_framesThisSecond; ++_frameCount; - _fpsCounter += _elapsedTime; + _fpsCounter += delta; if (_fpsCounter >= 1s) { _framesPerSecond = _framesThisSecond; _framesThisSecond = 0; diff --git a/src/Magpie.Core/StepTimer.h b/src/Magpie.Core/StepTimer.h index 5936787c8..0d11313f0 100644 --- a/src/Magpie.Core/StepTimer.h +++ b/src/Magpie.Core/StepTimer.h @@ -1,4 +1,5 @@ #pragma once +#include "Win32Utils.h" namespace Magpie::Core { @@ -25,6 +26,8 @@ class StepTimer { uint32_t _framesThisSecond = 0; std::chrono::nanoseconds _fpsCounter{}; + Win32Utils::ScopedHandle _hTimer; + }; } From 281a511d5857641d31a11085859e1ecebc9c72f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=97=AD?= <34770031+Blinue@users.noreply.github.com> Date: Sun, 25 Jun 2023 23:04:07 +0800 Subject: [PATCH 052/155] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=20GDI=20?= =?UTF-8?q?=E6=8D=95=E8=8E=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Magpie.Core/GDIFrameSource.cpp | 108 +++++++++++++++++++ src/Magpie.Core/GDIFrameSource.h | 37 +++++++ src/Magpie.Core/GraphicsCaptureFrameSource.h | 1 - src/Magpie.Core/Magpie.Core.vcxproj | 2 + src/Magpie.Core/Magpie.Core.vcxproj.filters | 22 +++- src/Magpie.Core/Renderer.cpp | 13 +-- 6 files changed, 172 insertions(+), 11 deletions(-) create mode 100644 src/Magpie.Core/GDIFrameSource.cpp create mode 100644 src/Magpie.Core/GDIFrameSource.h diff --git a/src/Magpie.Core/GDIFrameSource.cpp b/src/Magpie.Core/GDIFrameSource.cpp new file mode 100644 index 000000000..591eeebc8 --- /dev/null +++ b/src/Magpie.Core/GDIFrameSource.cpp @@ -0,0 +1,108 @@ +#include "pch.h" +#include "GDIFrameSource.h" +#include "Logger.h" +#include "ScalingOptions.h" +#include "DirectXHelper.h" + +namespace Magpie::Core { + +bool GDIFrameSource::Initialize(HWND hwndSrc, HWND hwndScaling, const ScalingOptions& options, ID3D11Device5* d3dDevice) noexcept { + if (!FrameSourceBase::Initialize(hwndSrc, hwndScaling, options, d3dDevice)) { + Logger::Get().Error("初始化 FrameSourceBase 失败"); + return false; + } + + if (!_CalcSrcRect(options.cropping, options.IsCaptureTitleBar())) { + return false; + } + + _hwndSrc = hwndSrc; + + double a, bx, by; + if (_GetMapToOriginDPI(hwndSrc, a, bx, by)) { + Logger::Get().Info(fmt::format("源窗口 DPI 缩放为 {}", 1 / a)); + + _frameRect = { + std::lround(_srcRect.left * a + bx), + std::lround(_srcRect.top * a + by), + std::lround(_srcRect.right * a + bx), + std::lround(_srcRect.bottom * a + by) + }; + } else { + Logger::Get().Error("_GetMapToOriginDPI 失败"); + + // _GetMapToOriginDPI 失败则假设 DPI 缩放为 1 + RECT srcWindowRect; + if (!GetWindowRect(hwndSrc, &srcWindowRect)) { + Logger::Get().Win32Error("GetWindowRect 失败"); + return false; + } + + _frameRect = { + _srcRect.left - srcWindowRect.left, + _srcRect.top - srcWindowRect.top, + _srcRect.right - srcWindowRect.left, + _srcRect.bottom - srcWindowRect.top + }; + } + + if (_frameRect.left < 0 || _frameRect.top < 0 || _frameRect.right < 0 + || _frameRect.bottom < 0 || _frameRect.right - _frameRect.left <= 0 + || _frameRect.bottom - _frameRect.top <= 0 + ) { + Logger::Get().Error("裁剪失败"); + return false; + } + + _output = DirectXHelper::CreateTexture2D( + d3dDevice, + DXGI_FORMAT_B8G8R8A8_UNORM, + _frameRect.right - _frameRect.left, + _frameRect.bottom - _frameRect.top, + D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_RENDER_TARGET, + D3D11_USAGE_DEFAULT, + D3D11_RESOURCE_MISC_GDI_COMPATIBLE + ); + if (!_output) { + Logger::Get().Error("创建纹理失败"); + return false; + } + + _dxgiSurface = _output.try_as(); + if (!_dxgiSurface) { + Logger::Get().Error("从 Texture2D 获取 IDXGISurface1 失败"); + return false; + } + + Logger::Get().Info("GDIFrameSource 初始化完成"); + return true; +} + +FrameSourceBase::UpdateState GDIFrameSource::Update() noexcept { + HDC hdcDest; + HRESULT hr = _dxgiSurface->GetDC(TRUE, &hdcDest); + if (FAILED(hr)) { + Logger::Get().ComError("从 Texture2D 获取 IDXGISurface1 失败", hr); + return UpdateState::Error; + } + + HDC hdcSrc = GetDCEx(_hwndSrc, NULL, DCX_LOCKWINDOWUPDATE | DCX_WINDOW); + if (!hdcSrc) { + Logger::Get().Win32Error("GetDC 失败"); + _dxgiSurface->ReleaseDC(nullptr); + return UpdateState::Error; + } + + if (!BitBlt(hdcDest, 0, 0, _frameRect.right - _frameRect.left, _frameRect.bottom - _frameRect.top, + hdcSrc, _frameRect.left, _frameRect.top, SRCCOPY) + ) { + Logger::Get().Win32Error("BitBlt 失败"); + } + + ReleaseDC(_hwndSrc, hdcSrc); + _dxgiSurface->ReleaseDC(nullptr); + + return UpdateState::NewFrame; +} + +} diff --git a/src/Magpie.Core/GDIFrameSource.h b/src/Magpie.Core/GDIFrameSource.h new file mode 100644 index 000000000..0d4ae83d1 --- /dev/null +++ b/src/Magpie.Core/GDIFrameSource.h @@ -0,0 +1,37 @@ +#pragma once +#include "FrameSourceBase.h" + +namespace Magpie::Core { + +class GDIFrameSource : public FrameSourceBase { +public: + virtual ~GDIFrameSource() {} + + bool Initialize(HWND hwndSrc, HWND hwndScaling, const ScalingOptions& options, ID3D11Device5* d3dDevice) noexcept override; + + UpdateState Update() noexcept override; + + bool IsScreenCapture() const noexcept override { + return false; + } + + const char* Name() const noexcept override { + return "GDI"; + } + +protected: + bool _HasRoundCornerInWin11() noexcept override { + return false; + } + + bool _CanCaptureTitleBar() noexcept override { + return false; + } + +private: + HWND _hwndSrc = NULL; + RECT _frameRect{}; + winrt::com_ptr _dxgiSurface; +}; + +} diff --git a/src/Magpie.Core/GraphicsCaptureFrameSource.h b/src/Magpie.Core/GraphicsCaptureFrameSource.h index 3165bd216..8d49cfd85 100644 --- a/src/Magpie.Core/GraphicsCaptureFrameSource.h +++ b/src/Magpie.Core/GraphicsCaptureFrameSource.h @@ -9,7 +9,6 @@ namespace Magpie::Core { // 见 https://docs.microsoft.com/en-us/windows/uwp/audio-video-camera/screen-capture class GraphicsCaptureFrameSource : public FrameSourceBase { public: - GraphicsCaptureFrameSource() {}; virtual ~GraphicsCaptureFrameSource(); bool Initialize(HWND hwndSrc, HWND hwndScaling, const ScalingOptions& options, ID3D11Device5* d3dDevice) noexcept override; diff --git a/src/Magpie.Core/Magpie.Core.vcxproj b/src/Magpie.Core/Magpie.Core.vcxproj index be25a4b75..62571817f 100644 --- a/src/Magpie.Core/Magpie.Core.vcxproj +++ b/src/Magpie.Core/Magpie.Core.vcxproj @@ -101,6 +101,7 @@ + @@ -127,6 +128,7 @@ + diff --git a/src/Magpie.Core/Magpie.Core.vcxproj.filters b/src/Magpie.Core/Magpie.Core.vcxproj.filters index da2103c4f..da5b0f890 100644 --- a/src/Magpie.Core/Magpie.Core.vcxproj.filters +++ b/src/Magpie.Core/Magpie.Core.vcxproj.filters @@ -73,11 +73,18 @@ - - + + Capture + + + Capture + + + Capture + @@ -107,11 +114,18 @@ - - + + Capture + + + Capture + + + Capture + diff --git a/src/Magpie.Core/Renderer.cpp b/src/Magpie.Core/Renderer.cpp index 87cad6f33..c7c9586af 100644 --- a/src/Magpie.Core/Renderer.cpp +++ b/src/Magpie.Core/Renderer.cpp @@ -9,6 +9,7 @@ #include "Utils.h" #include "EffectCompiler.h" #include "GraphicsCaptureFrameSource.h" +#include "GDIFrameSource.h" #include "DirectXHelper.h" #include @@ -251,11 +252,11 @@ bool Renderer::_InitFrameSource(const ScalingOptions& options) noexcept { break; /*case CaptureMethod::DesktopDuplication: frameSource = std::make_unique(); - break; + break;*/ case CaptureMethod::GDI: - frameSource = std::make_unique(); + _frameSource = std::make_unique(); break; - case CaptureMethod::DwmSharedSurface: + /*case CaptureMethod::DwmSharedSurface: frameSource = std::make_unique(); break;*/ default: @@ -478,10 +479,10 @@ void Renderer::_BackendThreadProc(const ScalingOptions& options) noexcept { if (_frameSource->Update() == FrameSourceBase::UpdateState::NewFrame) { nextFrame = false; _BackendRender(outputTexture); + } else { + // 等待新消息 + WaitMessage(); } - - // 等待新消息 - WaitMessage(); } } From 848069ce4c05cb7a03c64c766c081c04235668a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=97=AD?= Date: Mon, 26 Jun 2023 11:33:16 +0800 Subject: [PATCH 053/155] =?UTF-8?q?feat:=20=E5=AE=9E=E7=8E=B0=20USE=5FDYNA?= =?UTF-8?q?MIC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Effects/CRT/CRT_Geom.hlsl | 6 ++++- src/Magpie.Core/Renderer.cpp | 48 +++++++++++++++++++++++++++++++++++ src/Magpie.Core/Renderer.h | 4 +++ src/Magpie.Core/StepTimer.h | 4 +++ 4 files changed, 61 insertions(+), 1 deletion(-) diff --git a/src/Effects/CRT/CRT_Geom.hlsl b/src/Effects/CRT/CRT_Geom.hlsl index bc2010b6f..1555cb504 100644 --- a/src/Effects/CRT/CRT_Geom.hlsl +++ b/src/Effects/CRT/CRT_Geom.hlsl @@ -24,7 +24,7 @@ */ //!MAGPIE EFFECT -//!VERSION 3 +//!VERSION 4 //!USE_DYNAMIC @@ -160,6 +160,9 @@ int interlace; //!TEXTURE Texture2D INPUT; +//!TEXTURE +Texture2D OUTPUT; + //!SAMPLER //!FILTER POINT SamplerState sam; @@ -168,6 +171,7 @@ SamplerState sam; //!PASS 1 //!STYLE PS //!IN INPUT +//!OUT OUTPUT #pragma warning(disable: 3571) // X3571: pow(f, e) will not work for negative f, use abs(f) or conditionally handle negative values if you expect them diff --git a/src/Magpie.Core/Renderer.cpp b/src/Magpie.Core/Renderer.cpp index c7c9586af..364a830bd 100644 --- a/src/Magpie.Core/Renderer.cpp +++ b/src/Magpie.Core/Renderer.cpp @@ -398,6 +398,31 @@ ID3D11Texture2D* Renderer::_BuildEffects(const ScalingOptions& options) noexcept } } + // 初始化所有效果共用的动态常量缓冲区 + { + bool isUseDynamic = false; + for (const EffectDesc& ed : effectDescs) { + if (ed.flags & EffectFlags::UseDynamic) { + isUseDynamic = true; + break; + } + } + + if (isUseDynamic) { + D3D11_BUFFER_DESC bd{}; + bd.Usage = D3D11_USAGE_DYNAMIC; + bd.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; + bd.ByteWidth = 16; // 只用 4 个字节 + bd.BindFlags = D3D11_BIND_CONSTANT_BUFFER; + + HRESULT hr = _backendResources.GetD3DDevice()->CreateBuffer(&bd, nullptr, _dynamicCB.put()); + if (FAILED(hr)) { + Logger::Get().ComError("CreateBuffer 失败", hr); + return nullptr; + } + } + } + return inOutTexture; } @@ -574,6 +599,11 @@ void Renderer::_BackendRender(ID3D11Texture2D* effectsOutput) noexcept { ID3D11DeviceContext4* d3dDC = _backendResources.GetD3DDC(); d3dDC->ClearState(); + if (ID3D11Buffer* t = _dynamicCB.get()) { + _UpdateDynamicConstants(); + d3dDC->CSSetConstantBuffers(1, 1, &t); + } + for (const EffectDrawer& effectDrawer : _effectDrawers) { effectDrawer.Draw(); } @@ -611,4 +641,22 @@ void Renderer::_BackendRender(ID3D11Texture2D* effectsOutput) noexcept { PostMessage(_hwndScaling, WM_NULL, 0, 0); } +bool Renderer::_UpdateDynamicConstants() const noexcept { + // cbuffer __CB2 : register(b1) { uint __frameCount; }; + + ID3D11DeviceContext4* d3dDC = _backendResources.GetD3DDC(); + + D3D11_MAPPED_SUBRESOURCE ms; + HRESULT hr = d3dDC->Map(_dynamicCB.get(), 0, D3D11_MAP_WRITE_DISCARD, 0, &ms); + if (SUCCEEDED(hr)) { + *(uint32_t*)ms.pData = _stepTimer.FrameCount(); + d3dDC->Unmap(_dynamicCB.get(), 0); + } else { + Logger::Get().ComError("Map 失败", hr); + return false; + } + + return true; +} + } diff --git a/src/Magpie.Core/Renderer.h b/src/Magpie.Core/Renderer.h index 7f837b1a9..f2225ae75 100644 --- a/src/Magpie.Core/Renderer.h +++ b/src/Magpie.Core/Renderer.h @@ -47,6 +47,8 @@ class Renderer { void _BackendRender(ID3D11Texture2D* effectsOutput) noexcept; + bool _UpdateDynamicConstants() const noexcept; + // 只能由前台线程访问 DeviceResources _frontendResources; winrt::com_ptr _swapChain; @@ -79,6 +81,8 @@ class Renderer { winrt::com_ptr _backendSharedTexture; winrt::com_ptr _backendSharedTextureMutex; + winrt::com_ptr _dynamicCB; + // 可由所有线程访问 HWND _hwndSrc = NULL; HWND _hwndScaling = NULL; diff --git a/src/Magpie.Core/StepTimer.h b/src/Magpie.Core/StepTimer.h index 0d11313f0..80dad7ea5 100644 --- a/src/Magpie.Core/StepTimer.h +++ b/src/Magpie.Core/StepTimer.h @@ -14,6 +14,10 @@ class StepTimer { bool NewFrame() noexcept; + uint32_t FrameCount() const noexcept { + return _frameCount; + } + private: std::optional _minInterval; From caf48fe791550f82ef2aed215dc3770891bd3c49 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=97=AD?= Date: Mon, 26 Jun 2023 16:20:02 +0800 Subject: [PATCH 054/155] =?UTF-8?q?feat:=20=E6=9B=B4=E6=96=B0=E9=83=A8?= =?UTF-8?q?=E5=88=86=E6=95=88=E6=9E=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Effects/CRT/CRT_Hyllian.hlsl | 6 +++- src/Effects/CRT/CRT_Lottes.hlsl | 15 ++++++--- src/Effects/CRT/GTU_v050.hlsl | 6 +++- src/Effects/FSR/FSR_EASU.hlsl | 24 ++++++++------ src/Effects/FSR/FSR_RCAS.hlsl | 29 ++++++++++------- src/Effects/FSRCNNX/FSRCNNX.hlsl | 21 ++++++------- src/Effects/FSRCNNX/FSRCNNX_LineArt.hlsl | 21 ++++++------- src/Effects/FXAA/FXAA_High.hlsl | 23 +++++++------- src/Effects/FXAA/FXAA_Medium.hlsl | 23 +++++++------- src/Effects/FXAA/FXAA_Ultra.hlsl | 23 +++++++------- src/Magpie.Core/EffectCompiler.cpp | 40 ++++++++++++------------ 11 files changed, 126 insertions(+), 105 deletions(-) diff --git a/src/Effects/CRT/CRT_Hyllian.hlsl b/src/Effects/CRT/CRT_Hyllian.hlsl index 9d8ff7b76..eb4f8d85e 100644 --- a/src/Effects/CRT/CRT_Hyllian.hlsl +++ b/src/Effects/CRT/CRT_Hyllian.hlsl @@ -28,7 +28,7 @@ */ //!MAGPIE EFFECT -//!VERSION 3 +//!VERSION 4 //!PARAMETER @@ -138,6 +138,9 @@ float crtAntiRinging; //!TEXTURE Texture2D INPUT; +//!TEXTURE +Texture2D OUTPUT; + //!SAMPLER //!FILTER POINT SamplerState sam; @@ -146,6 +149,7 @@ SamplerState sam; //!PASS 1 //!STYLE PS //!IN INPUT +//!OUT OUTPUT #pragma warning(disable: 3571) // X3571: pow(f, e) will not work for negative f, use abs(f) or conditionally handle negative values if you expect them diff --git a/src/Effects/CRT/CRT_Lottes.hlsl b/src/Effects/CRT/CRT_Lottes.hlsl index 52a9f8781..d3e24afe0 100644 --- a/src/Effects/CRT/CRT_Lottes.hlsl +++ b/src/Effects/CRT/CRT_Lottes.hlsl @@ -17,7 +17,7 @@ //!MAGPIE EFFECT -//!VERSION 3 +//!VERSION 4 //!PARAMETER //!LABEL Scanline Hardness @@ -119,6 +119,9 @@ float shape; //!TEXTURE Texture2D INPUT; +//!TEXTURE +Texture2D OUTPUT; + //!SAMPLER //!FILTER POINT SamplerState sam; @@ -126,6 +129,7 @@ SamplerState sam; //!PASS 1 //!IN INPUT +//!OUT OUTPUT //!BLOCK_SIZE 8 //!NUM_THREADS 64 @@ -303,7 +307,9 @@ float3 Mask(float2 pos) { void Pass1(uint2 blockStart, uint3 threadId) { uint2 gxy = Rmp8x8(threadId.x) + blockStart; - if (!CheckViewport(gxy)) { + + const uint2 outputSize = GetOutputSize(); + if (gxy.x >= outputSize.x || gxy.y >= outputSize.y) { return; } @@ -318,8 +324,9 @@ void Pass1(uint2 blockStart, uint3 threadId) { outColor.rgb += Bloom(pos1, inputSize) * bloomAmount; #endif - if (shadowMask) + if (shadowMask) { outColor.rgb *= Mask(gxy + 0.5f); + } - WriteToOutput(gxy, pow(outColor.rgb, 1.0f / 2.2f)); + OUTPUT[gxy] = float4(pow(outColor.rgb, 1.0f / 2.2f), 1); } diff --git a/src/Effects/CRT/GTU_v050.hlsl b/src/Effects/CRT/GTU_v050.hlsl index cba83c707..06230f7e1 100644 --- a/src/Effects/CRT/GTU_v050.hlsl +++ b/src/Effects/CRT/GTU_v050.hlsl @@ -9,7 +9,7 @@ //!MAGPIE EFFECT -//!VERSION 3 +//!VERSION 4 //!PARAMETER @@ -80,6 +80,9 @@ float contrast; //!TEXTURE Texture2D INPUT; +//!TEXTURE +Texture2D OUTPUT; + //!TEXTURE //!WIDTH OUTPUT_WIDTH //!HEIGHT INPUT_HEIGHT @@ -153,6 +156,7 @@ float4 Pass1(float2 pos) { //!PASS 2 //!STYLE PS //!IN tex1 +//!OUT OUTPUT #define pi 3.14159265358 #define normalGauss(x) ((exp(-(x)*(x)*0.5))/sqrt(2.0*pi)) diff --git a/src/Effects/FSR/FSR_EASU.hlsl b/src/Effects/FSR/FSR_EASU.hlsl index aedd94126..c6419b9eb 100644 --- a/src/Effects/FSR/FSR_EASU.hlsl +++ b/src/Effects/FSR/FSR_EASU.hlsl @@ -2,11 +2,13 @@ // 移植自 https://github.com/GPUOpen-Effects/FidelityFX-FSR/blob/master/ffx-fsr/ffx_fsr1.h //!MAGPIE EFFECT -//!VERSION 3 +//!VERSION 4 //!TEXTURE Texture2D INPUT; +//!TEXTURE +Texture2D OUTPUT; //!SAMPLER //!FILTER POINT @@ -15,6 +17,7 @@ SamplerState sam; //!PASS 1 //!IN INPUT +//!OUT OUTPUT //!BLOCK_SIZE 16 //!NUM_THREADS 64 @@ -228,12 +231,13 @@ float3 FsrEasuF(uint2 pos, float4 con0, float4 con1, float4 con2, float2 con3) { void Pass1(uint2 blockStart, uint3 threadId) { uint2 gxy = blockStart + Rmp8x8(threadId.x); - if (!CheckViewport(gxy)) { + + const uint2 outputSize = GetOutputSize(); + if (gxy.x >= outputSize.x || gxy.y >= outputSize.y) { return; } uint2 inputSize = GetInputSize(); - uint2 outputSize = GetOutputSize(); float2 inputPt = GetInputPt(); float4 con0, con1, con2; @@ -271,20 +275,20 @@ void Pass1(uint2 blockStart, uint3 threadId) { con3[0] = 0; con3[1] = 4.0f * inputPt.y; - WriteToOutput(gxy, FsrEasuF(gxy, con0, con1, con2, con3)); + OUTPUT[gxy] = float4(FsrEasuF(gxy, con0, con1, con2, con3), 1); gxy.x += 8u; - if (CheckViewport(gxy)) { - WriteToOutput(gxy, FsrEasuF(gxy, con0, con1, con2, con3)); + if (gxy.x < outputSize.x && gxy.y < outputSize.y) { + OUTPUT[gxy] = float4(FsrEasuF(gxy, con0, con1, con2, con3), 1); } gxy.y += 8u; - if (CheckViewport(gxy)) { - WriteToOutput(gxy, FsrEasuF(gxy, con0, con1, con2, con3)); + if (gxy.x < outputSize.x && gxy.y < outputSize.y) { + OUTPUT[gxy] = float4(FsrEasuF(gxy, con0, con1, con2, con3), 1); } gxy.x -= 8u; - if (CheckViewport(gxy)) { - WriteToOutput(gxy, FsrEasuF(gxy, con0, con1, con2, con3)); + if (gxy.x < outputSize.x && gxy.y < outputSize.y) { + OUTPUT[gxy] = float4(FsrEasuF(gxy, con0, con1, con2, con3), 1); } } diff --git a/src/Effects/FSR/FSR_RCAS.hlsl b/src/Effects/FSR/FSR_RCAS.hlsl index 6409c7229..6750fbde9 100644 --- a/src/Effects/FSR/FSR_RCAS.hlsl +++ b/src/Effects/FSR/FSR_RCAS.hlsl @@ -2,9 +2,7 @@ // 移植自 https://github.com/GPUOpen-Effects/FidelityFX-FSR/blob/master/ffx-fsr/ffx_fsr1.h //!MAGPIE EFFECT -//!VERSION 3 -//!OUTPUT_WIDTH INPUT_WIDTH -//!OUTPUT_HEIGHT INPUT_HEIGHT +//!VERSION 4 //!PARAMETER @@ -18,12 +16,19 @@ float sharpness; //!TEXTURE Texture2D INPUT; +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +Texture2D OUTPUT; + //!SAMPLER //!FILTER POINT SamplerState sam; + //!PASS 1 //!IN INPUT +//!OUT OUTPUT //!BLOCK_SIZE 16 //!NUM_THREADS 64 @@ -108,7 +113,9 @@ float3 FsrRcasF(float3 b, float3 d, float3 e, float3 f, float3 h) { void Pass1(uint2 blockStart, uint3 threadId) { uint2 gxy = blockStart + (Rmp8x8(threadId.x) << 1); - if (!CheckViewport(gxy)) { + + const uint2 outputSize = GetOutputSize(); + if (gxy.x >= outputSize.x || gxy.y >= outputSize.y) { return; } @@ -126,20 +133,20 @@ void Pass1(uint2 blockStart, uint3 threadId) { src[3][1] = INPUT.Load(int3(gxy.x + 2, gxy.y, 0)).rgb; src[3][2] = INPUT.Load(int3(gxy.x + 2, gxy.y + 1, 0)).rgb; - WriteToOutput(gxy, FsrRcasF(src[1][0], src[0][1], src[1][1], src[2][1], src[1][2])); + OUTPUT[gxy] = float4(FsrRcasF(src[1][0], src[0][1], src[1][1], src[2][1], src[1][2]), 1); ++gxy.x; - if (CheckViewport(gxy)) { - WriteToOutput(gxy, FsrRcasF(src[2][0], src[1][1], src[2][1], src[3][1], src[2][2])); + if (gxy.x < outputSize.x && gxy.y < outputSize.y) { + OUTPUT[gxy] = float4(FsrRcasF(src[2][0], src[1][1], src[2][1], src[3][1], src[2][2]), 1); } ++gxy.y; - if (CheckViewport(gxy)) { - WriteToOutput(gxy, FsrRcasF(src[2][1], src[1][2], src[2][2], src[3][2], src[2][3])); + if (gxy.x < outputSize.x && gxy.y < outputSize.y) { + OUTPUT[gxy] = float4(FsrRcasF(src[2][1], src[1][2], src[2][2], src[3][2], src[2][3]), 1); } --gxy.x; - if (CheckViewport(gxy)) { - WriteToOutput(gxy, FsrRcasF(src[1][1], src[0][2], src[1][2], src[2][2], src[1][3])); + if (gxy.x < outputSize.x && gxy.y < outputSize.y) { + OUTPUT[gxy] = float4(FsrRcasF(src[1][1], src[0][2], src[1][2], src[2][2], src[1][3]), 1); } } diff --git a/src/Effects/FSRCNNX/FSRCNNX.hlsl b/src/Effects/FSRCNNX/FSRCNNX.hlsl index 4a2e33a91..7c0088e31 100644 --- a/src/Effects/FSRCNNX/FSRCNNX.hlsl +++ b/src/Effects/FSRCNNX/FSRCNNX.hlsl @@ -3,14 +3,17 @@ //!MAGPIE EFFECT -//!VERSION 3 -//!OUTPUT_WIDTH INPUT_WIDTH * 2 -//!OUTPUT_HEIGHT INPUT_HEIGHT * 2 +//!VERSION 4 //!TEXTURE Texture2D INPUT; +//!TEXTURE +//!WIDTH INPUT_WIDTH * 2 +//!HEIGHT INPUT_HEIGHT * 2 +Texture2D OUTPUT; + //!TEXTURE //!WIDTH INPUT_WIDTH //!HEIGHT INPUT_HEIGHT @@ -534,6 +537,7 @@ void Pass5(uint2 blockStart, uint3 threadId) { //!PASS 6 //!DESC sub-pixel convolution, aggregation //!IN tex3, tex4, INPUT +//!OUT OUTPUT //!BLOCK_SIZE 16 //!NUM_THREADS 64 @@ -551,7 +555,8 @@ const static float3x3 yuv2rgb = { void Pass6(uint2 blockStart, uint3 threadId) { uint2 gxy = (Rmp8x8(threadId.x) << 1) + blockStart; - if (!CheckViewport(gxy)) { + const uint2 outputSize = GetOutputSize(); + if (gxy.x >= outputSize.x || gxy.y >= outputSize.y) { return; } @@ -609,15 +614,9 @@ void Pass6(uint2 blockStart, uint3 threadId) { for (uint j = 0; j <= 1; ++j) { const uint2 destPos = gxy + uint2(i, j); - if (i != 0 || j != 0) { - if (!CheckViewport(destPos)) { - continue; - } - } - float2 originUV = mul(rgb2uv, INPUT.SampleLevel(sam1, (destPos + 0.5f) * outputPt, 0).rgb); const uint index = i * 2 + j; - WriteToOutput(destPos, mul(yuv2rgb, float3(result[index], originUV))); + OUTPUT[destPos] = float4(mul(yuv2rgb, float3(result[index], originUV)), 1); } } } diff --git a/src/Effects/FSRCNNX/FSRCNNX_LineArt.hlsl b/src/Effects/FSRCNNX/FSRCNNX_LineArt.hlsl index fdc760c52..459ac5b8a 100644 --- a/src/Effects/FSRCNNX/FSRCNNX_LineArt.hlsl +++ b/src/Effects/FSRCNNX/FSRCNNX_LineArt.hlsl @@ -2,14 +2,17 @@ // 移植自 https://github.com/igv/FSRCNN-TensorFlow //!MAGPIE EFFECT -//!VERSION 3 -//!OUTPUT_WIDTH INPUT_WIDTH * 2 -//!OUTPUT_HEIGHT INPUT_HEIGHT * 2 +//!VERSION 4 //!TEXTURE Texture2D INPUT; +//!TEXTURE +//!WIDTH INPUT_WIDTH * 2 +//!HEIGHT INPUT_HEIGHT * 2 +Texture2D OUTPUT; + //!TEXTURE //!WIDTH INPUT_WIDTH //!HEIGHT INPUT_HEIGHT @@ -531,6 +534,7 @@ void Pass5(uint2 blockStart, uint3 threadId) { //!PASS 6 //!DESC sub-pixel convolution, aggregation //!IN tex3, tex4, INPUT +//!OUT OUTPUT //!BLOCK_SIZE 16 //!NUM_THREADS 64 @@ -548,7 +552,8 @@ const static float3x3 yuv2rgb = { void Pass6(uint2 blockStart, uint3 threadId) { uint2 gxy = (Rmp8x8(threadId.x) << 1) + blockStart; - if (!CheckViewport(gxy)) { + const uint2 outputSize = GetOutputSize(); + if (gxy.x >= outputSize.x || gxy.y >= outputSize.y) { return; } @@ -606,15 +611,9 @@ void Pass6(uint2 blockStart, uint3 threadId) { for (uint j = 0; j <= 1; ++j) { const uint2 destPos = gxy + uint2(i, j); - if (i != 0 || j != 0) { - if (!CheckViewport(destPos)) { - continue; - } - } - float2 originUV = mul(rgb2uv, INPUT.SampleLevel(sam1, (destPos + 0.5f) * outputPt, 0).rgb); const uint index = i * 2 + j; - WriteToOutput(destPos, mul(yuv2rgb, float3(result[index], originUV))); + OUTPUT[destPos] = float4(mul(yuv2rgb, float3(result[index], originUV)), 1); } } } diff --git a/src/Effects/FXAA/FXAA_High.hlsl b/src/Effects/FXAA/FXAA_High.hlsl index 6d0257add..2cd9115a4 100644 --- a/src/Effects/FXAA/FXAA_High.hlsl +++ b/src/Effects/FXAA/FXAA_High.hlsl @@ -1,15 +1,18 @@ // 移植自 https://github.com/libretro/slang-shaders/blob/master/anti-aliasing/shaders/fxaa.slang //!MAGPIE EFFECT -//!VERSION 3 -//!OUTPUT_WIDTH INPUT_WIDTH -//!OUTPUT_HEIGHT INPUT_HEIGHT +//!VERSION 4 //!SORT_NAME FXAA_1 //!TEXTURE Texture2D INPUT; +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +Texture2D OUTPUT; + //!SAMPLER //!FILTER LINEAR SamplerState sam; @@ -17,6 +20,7 @@ SamplerState sam; //!PASS 1 //!IN INPUT +//!OUT OUTPUT //!BLOCK_SIZE 16 //!NUM_THREADS 64 @@ -26,7 +30,9 @@ SamplerState sam; void Pass1(uint2 blockStart, uint3 threadId) { uint2 gxy = (Rmp8x8(threadId.x) << 1) + blockStart; - if (!CheckViewport(gxy)) { + + const uint2 outputSize = GetOutputSize(); + if (gxy.x >= outputSize.x || gxy.y >= outputSize.y) { return; } @@ -57,14 +63,7 @@ void Pass1(uint2 blockStart, uint3 threadId) { [unroll] for (j = 0; j <= 1; ++j) { uint2 destPos = gxy + uint2(i, j); - - if (i != 0 || j != 0) { - if (!CheckViewport(gxy)) { - return; - } - } - - WriteToOutput(destPos, FXAA(src, i + 1, j + 1, INPUT, sam, (destPos + 0.5f) * inputPt, inputPt)); + OUTPUT[destPos] = float4(FXAA(src, i + 1, j + 1, INPUT, sam, (destPos + 0.5f) * inputPt, inputPt), 1); } } } diff --git a/src/Effects/FXAA/FXAA_Medium.hlsl b/src/Effects/FXAA/FXAA_Medium.hlsl index 5e8c4ae7d..f5c67268e 100644 --- a/src/Effects/FXAA/FXAA_Medium.hlsl +++ b/src/Effects/FXAA/FXAA_Medium.hlsl @@ -1,15 +1,18 @@ // 移植自 https://github.com/libretro/slang-shaders/blob/master/anti-aliasing/shaders/fxaa.slang //!MAGPIE EFFECT -//!VERSION 3 -//!OUTPUT_WIDTH INPUT_WIDTH -//!OUTPUT_HEIGHT INPUT_HEIGHT +//!VERSION 4 //!SORT_NAME FXAA_0 //!TEXTURE Texture2D INPUT; +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +Texture2D OUTPUT; + //!SAMPLER //!FILTER LINEAR SamplerState sam; @@ -17,6 +20,7 @@ SamplerState sam; //!PASS 1 //!IN INPUT +//!OUT OUTPUT //!BLOCK_SIZE 16 //!NUM_THREADS 64 @@ -26,7 +30,9 @@ SamplerState sam; void Pass1(uint2 blockStart, uint3 threadId) { uint2 gxy = (Rmp8x8(threadId.x) << 1) + blockStart; - if (!CheckViewport(gxy)) { + + const uint2 outputSize = GetOutputSize(); + if (gxy.x >= outputSize.x || gxy.y >= outputSize.y) { return; } @@ -57,14 +63,7 @@ void Pass1(uint2 blockStart, uint3 threadId) { [unroll] for (j = 0; j <= 1; ++j) { uint2 destPos = gxy + uint2(i, j); - - if (i != 0 || j != 0) { - if (!CheckViewport(gxy)) { - return; - } - } - - WriteToOutput(destPos, FXAA(src, i + 1, j + 1, INPUT, sam, (destPos + 0.5f) * inputPt, inputPt)); + OUTPUT[destPos] = float4(FXAA(src, i + 1, j + 1, INPUT, sam, (destPos + 0.5f) * inputPt, inputPt), 1); } } } diff --git a/src/Effects/FXAA/FXAA_Ultra.hlsl b/src/Effects/FXAA/FXAA_Ultra.hlsl index 3a748f99c..ff3c1235c 100644 --- a/src/Effects/FXAA/FXAA_Ultra.hlsl +++ b/src/Effects/FXAA/FXAA_Ultra.hlsl @@ -1,15 +1,18 @@ // 移植自 https://github.com/libretro/slang-shaders/blob/master/anti-aliasing/shaders/fxaa.slang //!MAGPIE EFFECT -//!VERSION 3 -//!OUTPUT_WIDTH INPUT_WIDTH -//!OUTPUT_HEIGHT INPUT_HEIGHT +//!VERSION 4 //!SORT_NAME FXAA_2 //!TEXTURE Texture2D INPUT; +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +Texture2D OUTPUT; + //!SAMPLER //!FILTER LINEAR SamplerState sam; @@ -17,6 +20,7 @@ SamplerState sam; //!PASS 1 //!IN INPUT +//!OUT OUTPUT //!BLOCK_SIZE 16 //!NUM_THREADS 64 @@ -26,7 +30,9 @@ SamplerState sam; void Pass1(uint2 blockStart, uint3 threadId) { uint2 gxy = (Rmp8x8(threadId.x) << 1) + blockStart; - if (!CheckViewport(gxy)) { + + const uint2 outputSize = GetOutputSize(); + if (gxy.x >= outputSize.x || gxy.y >= outputSize.y) { return; } @@ -57,14 +63,7 @@ void Pass1(uint2 blockStart, uint3 threadId) { [unroll] for (j = 0; j <= 1; ++j) { uint2 destPos = gxy + uint2(i, j); - - if (i != 0 || j != 0) { - if (!CheckViewport(gxy)) { - return; - } - } - - WriteToOutput(destPos, FXAA(src, i + 1, j + 1, INPUT, sam, (destPos + 0.5f) * inputPt, inputPt)); + OUTPUT[destPos] = float4(FXAA(src, i + 1, j + 1, INPUT, sam, (destPos + 0.5f) * inputPt, inputPt), 1); } } } diff --git a/src/Magpie.Core/EffectCompiler.cpp b/src/Magpie.Core/EffectCompiler.cpp index 07302a2d5..096dd1999 100644 --- a/src/Magpie.Core/EffectCompiler.cpp +++ b/src/Magpie.Core/EffectCompiler.cpp @@ -1496,28 +1496,28 @@ uint32_t EffectCompiler::Compile( size_t curBlockOff = 0; auto completeCurrentBlock = [&](size_t len, BlockType newBlockType) { - if (curBlockType == BlockType::Header) { + switch (curBlockType) { + case BlockType::Header: headerBlock = sourceView.substr(curBlockOff, len); - } else if (curBlockType == BlockType::Parameter) { + break; + case BlockType::Parameter: paramBlocks.push_back(sourceView.substr(curBlockOff, len)); - } else if (!noCompile) { - switch (curBlockType) { - case BlockType::Texture: - textureBlocks.push_back(sourceView.substr(curBlockOff, len)); - break; - case BlockType::Sampler: - samplerBlocks.push_back(sourceView.substr(curBlockOff, len)); - break; - case BlockType::Common: - commonBlocks.push_back(sourceView.substr(curBlockOff, len)); - break; - case BlockType::Pass: - passBlocks.push_back(sourceView.substr(curBlockOff, len)); - break; - default: - assert(false); - break; - } + break; + case BlockType::Texture: + textureBlocks.push_back(sourceView.substr(curBlockOff, len)); + break; + case BlockType::Sampler: + samplerBlocks.push_back(sourceView.substr(curBlockOff, len)); + break; + case BlockType::Common: + commonBlocks.push_back(sourceView.substr(curBlockOff, len)); + break; + case BlockType::Pass: + passBlocks.push_back(sourceView.substr(curBlockOff, len)); + break; + default: + assert(false); + break; } curBlockType = newBlockType; From b0598f3823bded9a870cbd722c6e5635494aa693 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=97=AD?= <34770031+Blinue@users.noreply.github.com> Date: Mon, 26 Jun 2023 22:53:23 +0800 Subject: [PATCH 055/155] =?UTF-8?q?fix:=20=E6=8F=90=E9=AB=98=20StepTimer?= =?UTF-8?q?=20=E7=9A=84=E7=B2=BE=E5=BA=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Magpie.Core/StepTimer.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/Magpie.Core/StepTimer.cpp b/src/Magpie.Core/StepTimer.cpp index 7c7bfe441..e2b0928e1 100644 --- a/src/Magpie.Core/StepTimer.cpp +++ b/src/Magpie.Core/StepTimer.cpp @@ -34,7 +34,11 @@ bool StepTimer::NewFrame() noexcept { } _elapsedTime = delta; - _lastFrameTime = now; + if (_minInterval) { + _lastFrameTime = now - delta % *_minInterval; + } else { + _lastFrameTime = now; + } // 更新当前帧率 ++_framesThisSecond; From d6ef27a74695496f2b9cf90ea93424ead880cbee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=97=AD?= <34770031+Blinue@users.noreply.github.com> Date: Tue, 27 Jun 2023 20:39:22 +0800 Subject: [PATCH 056/155] =?UTF-8?q?feat:=20=E6=A3=80=E6=B5=8B=E9=87=8D?= =?UTF-8?q?=E5=A4=8D=E5=B8=A7=EF=BC=8C=E5=92=8C=E5=89=8D=E4=B8=80=E9=98=B5?= =?UTF-8?q?=E7=9B=B8=E5=90=8C=E6=97=B6=E4=B8=8D=E5=86=8D=E9=87=8D=E5=A4=8D?= =?UTF-8?q?=E6=B8=B2=E6=9F=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Magpie.Core/DeviceResources.cpp | 27 +++- src/Magpie.Core/DeviceResources.h | 7 +- src/Magpie.Core/EffectCompiler.cpp | 4 +- src/Magpie.Core/FrameSourceBase.cpp | 121 +++++++++++++++++- src/Magpie.Core/FrameSourceBase.h | 23 +++- src/Magpie.Core/GDIFrameSource.cpp | 18 +-- src/Magpie.Core/GDIFrameSource.h | 8 +- .../GraphicsCaptureFrameSource.cpp | 16 +-- src/Magpie.Core/GraphicsCaptureFrameSource.h | 8 +- src/Magpie.Core/Magpie.Core.vcxproj | 3 + src/Magpie.Core/Magpie.Core.vcxproj.filters | 3 + src/Magpie.Core/Renderer.cpp | 8 +- .../shaders/DuplicateFramesCS.hlsl | 18 +++ 13 files changed, 219 insertions(+), 45 deletions(-) create mode 100644 src/Magpie.Core/shaders/DuplicateFramesCS.hlsl diff --git a/src/Magpie.Core/DeviceResources.cpp b/src/Magpie.Core/DeviceResources.cpp index e96c070c8..4d9753914 100644 --- a/src/Magpie.Core/DeviceResources.cpp +++ b/src/Magpie.Core/DeviceResources.cpp @@ -106,7 +106,6 @@ ID3D11UnorderedAccessView* DeviceResources::GetUnorderedAccessView(ID3D11Texture D3D11_UNORDERED_ACCESS_VIEW_DESC desc{}; desc.ViewDimension = D3D11_UAV_DIMENSION_TEXTURE2D; - desc.Texture2D.MipSlice = 0; HRESULT hr = _d3dDevice->CreateUnorderedAccessView(texture, &desc, uav.put()); if (FAILED(hr)) { @@ -117,6 +116,32 @@ ID3D11UnorderedAccessView* DeviceResources::GetUnorderedAccessView(ID3D11Texture return _uavMap.emplace(texture, std::move(uav)).first->second.get(); } +ID3D11UnorderedAccessView* DeviceResources::GetUnorderedAccessView( + ID3D11Buffer* buffer, + uint32_t numElements, + DXGI_FORMAT format +) noexcept { + auto it = _uavMap.find(buffer); + if (it != _uavMap.end()) { + return it->second.get(); + } + + winrt::com_ptr uav; + + D3D11_UNORDERED_ACCESS_VIEW_DESC desc{}; + desc.Format = format; + desc.ViewDimension = D3D11_UAV_DIMENSION_BUFFER; + desc.Buffer.NumElements = numElements; + + HRESULT hr = _d3dDevice->CreateUnorderedAccessView(buffer, &desc, uav.put()); + if (FAILED(hr)) { + Logger::Get().ComError("CreateUnorderedAccessView 失败", hr); + return nullptr; + } + + return _uavMap.emplace(buffer, std::move(uav)).first->second.get(); +} + static void LogAdapter(const DXGI_ADAPTER_DESC1& adapterDesc) noexcept { Logger::Get().Info(fmt::format("当前图形适配器:\n\tVendorId:{:#x}\n\tDeviceId:{:#x}\n\t描述:{}", adapterDesc.VendorId, adapterDesc.DeviceId, StrUtils::UTF16ToUTF8(adapterDesc.Description))); diff --git a/src/Magpie.Core/DeviceResources.h b/src/Magpie.Core/DeviceResources.h index a24c65de9..8ee8d9817 100644 --- a/src/Magpie.Core/DeviceResources.h +++ b/src/Magpie.Core/DeviceResources.h @@ -29,6 +29,11 @@ class DeviceResources { ID3D11ShaderResourceView* GetShaderResourceView(ID3D11Texture2D* texture) noexcept; ID3D11UnorderedAccessView* GetUnorderedAccessView(ID3D11Texture2D* texture) noexcept; + ID3D11UnorderedAccessView* GetUnorderedAccessView( + ID3D11Buffer* buffer, + uint32_t numElements, + DXGI_FORMAT format = DXGI_FORMAT_UNKNOWN + ) noexcept; private: bool _ObtainAdapterAndDevice(int adapterIdx) noexcept; @@ -41,7 +46,7 @@ class DeviceResources { phmap::flat_hash_map> _rtvMap; phmap::flat_hash_map> _srvMap; - phmap::flat_hash_map> _uavMap; + phmap::flat_hash_map> _uavMap; phmap::flat_hash_map< std::pair, diff --git a/src/Magpie.Core/EffectCompiler.cpp b/src/Magpie.Core/EffectCompiler.cpp index 096dd1999..2f589e3eb 100644 --- a/src/Magpie.Core/EffectCompiler.cpp +++ b/src/Magpie.Core/EffectCompiler.cpp @@ -1233,7 +1233,7 @@ float2 GetScale() { return __scale; } result.append(fmt::format(R"([numthreads(64, 1, 1)] void __M(uint3 tid : SV_GroupThreadID, uint3 gid : SV_GroupID) {{ - uint2 gxy = Rmp8x8(tid.x) + (gid.xy << 4u); + uint2 gxy = (gid.xy << 4u) + Rmp8x8(tid.x); if (gxy.x >= {1}.x || gxy.y >= {1}.y) {{ return; }} @@ -1265,7 +1265,7 @@ void __M(uint3 tid : SV_GroupThreadID, uint3 gid : SV_GroupID) {{ // 多渲染目标 result.append(fmt::format(R"([numthreads(64, 1, 1)] void __M(uint3 tid : SV_GroupThreadID, uint3 gid : SV_GroupID) {{ - uint2 gxy = Rmp8x8(tid.x) + (gid.xy << 4u); + uint2 gxy = (gid.xy << 4u) + Rmp8x8(tid.x); if (gxy.x >= __pass{0}OutputSize.x || gxy.y >= __pass{0}OutputSize.y) {{ return; }} diff --git a/src/Magpie.Core/FrameSourceBase.cpp b/src/Magpie.Core/FrameSourceBase.cpp index 3c05622ee..edd7bf9b6 100644 --- a/src/Magpie.Core/FrameSourceBase.cpp +++ b/src/Magpie.Core/FrameSourceBase.cpp @@ -6,6 +6,9 @@ #include "CommonSharedConstants.h" #include "Utils.h" #include "SmallVector.h" +#include "DirectXHelper.h" +#include "DeviceResources.h" +#include "shaders/DuplicateFramesCS.h" namespace Magpie::Core { @@ -15,7 +18,8 @@ FrameSourceBase::~FrameSourceBase() noexcept { _roundCornerDisabled = false; INT attr = DWMWCP_DEFAULT; - HRESULT hr = DwmSetWindowAttribute(_hwndSrc, DWMWA_WINDOW_CORNER_PREFERENCE, &attr, sizeof(attr)); + HRESULT hr = DwmSetWindowAttribute( + _hwndSrc, DWMWA_WINDOW_CORNER_PREFERENCE, &attr, sizeof(attr)); if (FAILED(hr)) { Logger::Get().ComError("取消禁用窗口圆角失败", hr); } else { @@ -45,9 +49,14 @@ FrameSourceBase::~FrameSourceBase() noexcept { } } -bool FrameSourceBase::Initialize(HWND hwndSrc, HWND /*hwndScaling*/, const ScalingOptions& options, ID3D11Device5* d3dDevice) noexcept { +bool FrameSourceBase::Initialize( + HWND hwndSrc, + HWND hwndScaling, + const ScalingOptions& options, + DeviceResources& deviceResources +) noexcept { _hwndSrc = hwndSrc; - _d3dDevice = d3dDevice; + _deviceResources = &deviceResources; // 禁用窗口大小调整 if (options.IsDisableWindowResizing()) { @@ -72,7 +81,8 @@ bool FrameSourceBase::Initialize(HWND hwndSrc, HWND /*hwndScaling*/, const Scali if (_HasRoundCornerInWin11()) { if (Win32Utils::GetOSVersion().IsWin11()) { INT attr = DWMWCP_DONOTROUND; - HRESULT hr = DwmSetWindowAttribute(hwndSrc, DWMWA_WINDOW_CORNER_PREFERENCE, &attr, sizeof(attr)); + HRESULT hr = DwmSetWindowAttribute( + hwndSrc, DWMWA_WINDOW_CORNER_PREFERENCE, &attr, sizeof(attr)); if (FAILED(hr)) { Logger::Get().ComError("禁用窗口圆角失败", hr); } else { @@ -82,9 +92,112 @@ bool FrameSourceBase::Initialize(HWND hwndSrc, HWND /*hwndScaling*/, const Scali } } + if (!_Initialize(hwndScaling, options)) { + Logger::Get().Error("_Initialize 失败"); + return false; + } + return true; } +FrameSourceBase::UpdateState FrameSourceBase::Update() noexcept { + UpdateState state = _Update(); + if (state != UpdateState::NewFrame) { + return state; + } + + ID3D11Device5* d3dDevice = _deviceResources->GetD3DDevice(); + ID3D11DeviceContext4* d3dDC = _deviceResources->GetD3DDC(); + + if (_prevFrame) { + // 检查是否和前一帧相同 + ID3D11ShaderResourceView* srvs[]{ + _deviceResources->GetShaderResourceView(_output.get()), + _deviceResources->GetShaderResourceView(_prevFrame.get()) + }; + d3dDC->CSSetShaderResources(0, 2, srvs); + + ID3D11SamplerState* sam = _deviceResources->GetSampler( + D3D11_FILTER_MIN_MAG_MIP_POINT, D3D11_TEXTURE_ADDRESS_CLAMP); + d3dDC->CSSetSamplers(0, 1, &sam); + + ID3D11UnorderedAccessView* uav = _deviceResources->GetUnorderedAccessView( + _resultBuffer.get(), 1, DXGI_FORMAT_R32_UINT); + // 将缓冲区置零 + static constexpr UINT ZERO[4]{}; + d3dDC->ClearUnorderedAccessViewUint(uav, ZERO); + d3dDC->CSSetUnorderedAccessViews(0, 1, &uav, nullptr); + + d3dDC->CSSetShader(_dupFrameCS.get(), nullptr, 0); + + d3dDC->Dispatch(_dispatchCount.first, _dispatchCount.second, 1); + + // 取回结果 + d3dDC->CopyResource(_readBackBuffer.get(), _resultBuffer.get()); + + uint32_t result = 1; + { + D3D11_MAPPED_SUBRESOURCE ms; + HRESULT hr = d3dDC->Map(_readBackBuffer.get(), 0, D3D11_MAP_READ, 0, &ms); + if (SUCCEEDED(hr)) { + result = *(uint32_t*)ms.pData; + d3dDC->Unmap(_readBackBuffer.get(), 0); + } + } + if (result == 0) { + // 和前一帧相同 + return UpdateState::Waiting; + } + } else { + D3D11_TEXTURE2D_DESC td; + _output->GetDesc(&td); + + _prevFrame = DirectXHelper::CreateTexture2D( + d3dDevice, td.Format, td.Width, td.Height, D3D11_BIND_SHADER_RESOURCE); + + if (!_prevFrame) { + return UpdateState::NewFrame; + } + + D3D11_BUFFER_DESC bd{}; + bd.ByteWidth = 4; + bd.StructureByteStride = 4; + bd.Usage = D3D11_USAGE_DEFAULT; + bd.BindFlags = D3D11_BIND_UNORDERED_ACCESS; + HRESULT hr = d3dDevice->CreateBuffer(&bd, nullptr, _resultBuffer.put()); + if (FAILED(hr)) { + Logger::Get().ComError("CreateBuffer 失败", hr); + _prevFrame = nullptr; + return UpdateState::NewFrame; + } + + bd.Usage = D3D11_USAGE_STAGING; + bd.CPUAccessFlags = D3D11_CPU_ACCESS_READ; + bd.BindFlags = 0; + hr = d3dDevice->CreateBuffer(&bd, nullptr, _readBackBuffer.put()); + if (FAILED(hr)) { + Logger::Get().ComError("CreateBuffer 失败", hr); + _prevFrame = nullptr; + return UpdateState::NewFrame; + } + + hr = d3dDevice->CreateComputeShader( + DuplicateFramesCS, sizeof(DuplicateFramesCS), nullptr, _dupFrameCS.put()); + if (FAILED(hr)) { + Logger::Get().ComError("CreateComputeShader 失败", hr); + _prevFrame = nullptr; + return UpdateState::NewFrame; + } + + static constexpr std::pair BLOCK_SIZE{8, 8}; + _dispatchCount.first = (td.Width + BLOCK_SIZE.first - 1) / BLOCK_SIZE.first; + _dispatchCount.second = (td.Height + BLOCK_SIZE.second - 1) / BLOCK_SIZE.second; + } + + d3dDC->CopyResource(_prevFrame.get(), _output.get()); + return UpdateState::NewFrame; +} + struct EnumChildWndParam { const wchar_t* clientWndClassName = nullptr; SmallVector childWindows; diff --git a/src/Magpie.Core/FrameSourceBase.h b/src/Magpie.Core/FrameSourceBase.h index 436d4a682..a87078416 100644 --- a/src/Magpie.Core/FrameSourceBase.h +++ b/src/Magpie.Core/FrameSourceBase.h @@ -4,6 +4,7 @@ namespace Magpie::Core { struct ScalingOptions; struct Cropping; +class DeviceResources; class FrameSourceBase { public: @@ -15,7 +16,12 @@ class FrameSourceBase { FrameSourceBase(const FrameSourceBase&) = delete; FrameSourceBase(FrameSourceBase&&) = delete; - virtual bool Initialize(HWND hwndSrc, HWND hwndScaling, const ScalingOptions& options, ID3D11Device5* d3dDevice) noexcept; + bool Initialize( + HWND hwndSrc, + HWND hwndScaling, + const ScalingOptions& options, + DeviceResources& deviceResources + ) noexcept; enum class UpdateState { NewFrame, @@ -23,7 +29,7 @@ class FrameSourceBase { Error }; - virtual UpdateState Update() noexcept = 0; + UpdateState Update() noexcept; ID3D11Texture2D* GetOutput() noexcept { return _output.get(); @@ -40,6 +46,10 @@ class FrameSourceBase { virtual void OnCursorVisibilityChanged(bool /*isVisible*/) noexcept {}; protected: + virtual bool _Initialize(HWND hwndScaling, const ScalingOptions& options) noexcept = 0; + + virtual UpdateState _Update() noexcept = 0; + virtual bool _HasRoundCornerInWin11() noexcept = 0; virtual bool _CanCaptureTitleBar() noexcept = 0; @@ -60,9 +70,16 @@ class FrameSourceBase { HWND _hwndSrc = NULL; RECT _srcRect{}; - ID3D11Device5* _d3dDevice = nullptr; + DeviceResources* _deviceResources = nullptr; winrt::com_ptr _output; + // 用于检查重复帧 + winrt::com_ptr _prevFrame; + winrt::com_ptr _resultBuffer; + winrt::com_ptr _readBackBuffer; + winrt::com_ptr _dupFrameCS; + std::pair _dispatchCount; + bool _roundCornerDisabled = false; bool _windowResizingDisabled = false; }; diff --git a/src/Magpie.Core/GDIFrameSource.cpp b/src/Magpie.Core/GDIFrameSource.cpp index 591eeebc8..6b6a288cb 100644 --- a/src/Magpie.Core/GDIFrameSource.cpp +++ b/src/Magpie.Core/GDIFrameSource.cpp @@ -3,23 +3,17 @@ #include "Logger.h" #include "ScalingOptions.h" #include "DirectXHelper.h" +#include "DeviceResources.h" namespace Magpie::Core { -bool GDIFrameSource::Initialize(HWND hwndSrc, HWND hwndScaling, const ScalingOptions& options, ID3D11Device5* d3dDevice) noexcept { - if (!FrameSourceBase::Initialize(hwndSrc, hwndScaling, options, d3dDevice)) { - Logger::Get().Error("初始化 FrameSourceBase 失败"); - return false; - } - +bool GDIFrameSource::_Initialize(HWND /*hwndScaling*/, const ScalingOptions& options) noexcept { if (!_CalcSrcRect(options.cropping, options.IsCaptureTitleBar())) { return false; } - _hwndSrc = hwndSrc; - double a, bx, by; - if (_GetMapToOriginDPI(hwndSrc, a, bx, by)) { + if (_GetMapToOriginDPI(_hwndSrc, a, bx, by)) { Logger::Get().Info(fmt::format("源窗口 DPI 缩放为 {}", 1 / a)); _frameRect = { @@ -33,7 +27,7 @@ bool GDIFrameSource::Initialize(HWND hwndSrc, HWND hwndScaling, const ScalingOpt // _GetMapToOriginDPI 失败则假设 DPI 缩放为 1 RECT srcWindowRect; - if (!GetWindowRect(hwndSrc, &srcWindowRect)) { + if (!GetWindowRect(_hwndSrc, &srcWindowRect)) { Logger::Get().Win32Error("GetWindowRect 失败"); return false; } @@ -55,7 +49,7 @@ bool GDIFrameSource::Initialize(HWND hwndSrc, HWND hwndScaling, const ScalingOpt } _output = DirectXHelper::CreateTexture2D( - d3dDevice, + _deviceResources->GetD3DDevice(), DXGI_FORMAT_B8G8R8A8_UNORM, _frameRect.right - _frameRect.left, _frameRect.bottom - _frameRect.top, @@ -78,7 +72,7 @@ bool GDIFrameSource::Initialize(HWND hwndSrc, HWND hwndScaling, const ScalingOpt return true; } -FrameSourceBase::UpdateState GDIFrameSource::Update() noexcept { +FrameSourceBase::UpdateState GDIFrameSource::_Update() noexcept { HDC hdcDest; HRESULT hr = _dxgiSurface->GetDC(TRUE, &hdcDest); if (FAILED(hr)) { diff --git a/src/Magpie.Core/GDIFrameSource.h b/src/Magpie.Core/GDIFrameSource.h index 0d4ae83d1..8fa57ed33 100644 --- a/src/Magpie.Core/GDIFrameSource.h +++ b/src/Magpie.Core/GDIFrameSource.h @@ -7,10 +7,6 @@ class GDIFrameSource : public FrameSourceBase { public: virtual ~GDIFrameSource() {} - bool Initialize(HWND hwndSrc, HWND hwndScaling, const ScalingOptions& options, ID3D11Device5* d3dDevice) noexcept override; - - UpdateState Update() noexcept override; - bool IsScreenCapture() const noexcept override { return false; } @@ -20,6 +16,10 @@ class GDIFrameSource : public FrameSourceBase { } protected: + bool _Initialize(HWND hwndScaling, const ScalingOptions& options) noexcept override; + + UpdateState _Update() noexcept override; + bool _HasRoundCornerInWin11() noexcept override { return false; } diff --git a/src/Magpie.Core/GraphicsCaptureFrameSource.cpp b/src/Magpie.Core/GraphicsCaptureFrameSource.cpp index a0d15aa36..65618e6f0 100644 --- a/src/Magpie.Core/GraphicsCaptureFrameSource.cpp +++ b/src/Magpie.Core/GraphicsCaptureFrameSource.cpp @@ -18,11 +18,8 @@ using namespace Windows::Graphics::DirectX::Direct3D11; namespace Magpie::Core { -bool GraphicsCaptureFrameSource::Initialize(HWND hwndSrc, HWND hwndScaling, const ScalingOptions& options, ID3D11Device5* d3dDevice) noexcept { - if (!FrameSourceBase::Initialize(hwndSrc, hwndScaling, options, d3dDevice)) { - Logger::Get().Error("初始化 FrameSourceBase 失败"); - return false; - } +bool GraphicsCaptureFrameSource::_Initialize(HWND hwndScaling, const ScalingOptions& options) noexcept { + ID3D11Device5* d3dDevice = _deviceResources->GetD3DDevice(); HRESULT hr; @@ -34,7 +31,7 @@ bool GraphicsCaptureFrameSource::Initialize(HWND hwndSrc, HWND hwndScaling, cons } winrt::com_ptr dxgiDevice; - _d3dDevice->QueryInterface(dxgiDevice.put()); + d3dDevice->QueryInterface(dxgiDevice.put()); hr = CreateDirect3D11DeviceFromDXGIDevice( dxgiDevice.get(), @@ -93,7 +90,7 @@ bool GraphicsCaptureFrameSource::Initialize(HWND hwndSrc, HWND hwndScaling, cons return true; } -FrameSourceBase::UpdateState GraphicsCaptureFrameSource::Update() noexcept { +FrameSourceBase::UpdateState GraphicsCaptureFrameSource::_Update() noexcept { if (!_captureSession) { return UpdateState::Waiting; } @@ -118,10 +115,7 @@ FrameSourceBase::UpdateState GraphicsCaptureFrameSource::Update() noexcept { return UpdateState::Error; } - winrt::com_ptr d3dDC; - _d3dDevice->GetImmediateContext(d3dDC.put()); - - d3dDC->CopySubresourceRegion(_output.get(), 0, 0, 0, 0, withFrame.get(), 0, &_frameBox); + _deviceResources->GetD3DDC()->CopySubresourceRegion(_output.get(), 0, 0, 0, 0, withFrame.get(), 0, &_frameBox); frame.Close(); return UpdateState::NewFrame; diff --git a/src/Magpie.Core/GraphicsCaptureFrameSource.h b/src/Magpie.Core/GraphicsCaptureFrameSource.h index 8d49cfd85..d24963be2 100644 --- a/src/Magpie.Core/GraphicsCaptureFrameSource.h +++ b/src/Magpie.Core/GraphicsCaptureFrameSource.h @@ -11,10 +11,6 @@ class GraphicsCaptureFrameSource : public FrameSourceBase { public: virtual ~GraphicsCaptureFrameSource(); - bool Initialize(HWND hwndSrc, HWND hwndScaling, const ScalingOptions& options, ID3D11Device5* d3dDevice) noexcept override; - - UpdateState Update() noexcept override; - bool IsScreenCapture() const noexcept override { return _isScreenCapture; } @@ -35,6 +31,10 @@ class GraphicsCaptureFrameSource : public FrameSourceBase { } private: + bool _Initialize(HWND hwndScaling, const ScalingOptions& options) noexcept override; + + UpdateState _Update() noexcept override; + bool _StartCapture() noexcept; void _StopCapture() noexcept; diff --git a/src/Magpie.Core/Magpie.Core.vcxproj b/src/Magpie.Core/Magpie.Core.vcxproj index 62571817f..28b18b757 100644 --- a/src/Magpie.Core/Magpie.Core.vcxproj +++ b/src/Magpie.Core/Magpie.Core.vcxproj @@ -152,6 +152,9 @@ + + Compute + Pixel diff --git a/src/Magpie.Core/Magpie.Core.vcxproj.filters b/src/Magpie.Core/Magpie.Core.vcxproj.filters index da5b0f890..e97a3a984 100644 --- a/src/Magpie.Core/Magpie.Core.vcxproj.filters +++ b/src/Magpie.Core/Magpie.Core.vcxproj.filters @@ -148,6 +148,9 @@ Shaders + + Shaders + diff --git a/src/Magpie.Core/Renderer.cpp b/src/Magpie.Core/Renderer.cpp index 364a830bd..be870ac28 100644 --- a/src/Magpie.Core/Renderer.cpp +++ b/src/Magpie.Core/Renderer.cpp @@ -266,8 +266,7 @@ bool Renderer::_InitFrameSource(const ScalingOptions& options) noexcept { Logger::Get().Info(StrUtils::Concat("当前捕获模式:", _frameSource->Name())); - ID3D11Device5* d3dDevice = _backendResources.GetD3DDevice(); - if (!_frameSource->Initialize(_hwndSrc, _hwndScaling, options, d3dDevice)) { + if (!_frameSource->Initialize(_hwndSrc, _hwndScaling, options, _backendResources)) { Logger::Get().Error("初始化 FrameSource 失败"); return false; } @@ -649,7 +648,10 @@ bool Renderer::_UpdateDynamicConstants() const noexcept { D3D11_MAPPED_SUBRESOURCE ms; HRESULT hr = d3dDC->Map(_dynamicCB.get(), 0, D3D11_MAP_WRITE_DISCARD, 0, &ms); if (SUCCEEDED(hr)) { - *(uint32_t*)ms.pData = _stepTimer.FrameCount(); + // 避免使用 *(uint32_t*)ms.pData,见 + // https://learn.microsoft.com/en-us/windows/win32/api/d3d11/nf-d3d11-id3d11devicecontext-map + const uint32_t frameCount = _stepTimer.FrameCount(); + std::memcpy(ms.pData, &frameCount, 4); d3dDC->Unmap(_dynamicCB.get(), 0); } else { Logger::Get().ComError("Map 失败", hr); diff --git a/src/Magpie.Core/shaders/DuplicateFramesCS.hlsl b/src/Magpie.Core/shaders/DuplicateFramesCS.hlsl new file mode 100644 index 000000000..bad2135e4 --- /dev/null +++ b/src/Magpie.Core/shaders/DuplicateFramesCS.hlsl @@ -0,0 +1,18 @@ +RWBuffer result : register(u0); + +Texture2D tex1 : register(t0); +Texture2D tex2 : register(t1); + +SamplerState sam : register(s0); + +[numthreads(8, 8, 1)] +void main(uint3 tid : SV_GroupThreadID, uint3 gid : SV_GroupID) { + if (result[0]) { + return; + } + + int3 gxy = { (gid.xy << 3u) + tid.xy, 0 }; + if (any(tex1.Load(gxy).rgb != tex2.Load(gxy, 0).rgb)) { + result[0] = 1u; + } +} From 74d241b4ca0fd41c45daed576b3ceff66f84954c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=97=AD?= <34770031+Blinue@users.noreply.github.com> Date: Tue, 27 Jun 2023 21:40:01 +0800 Subject: [PATCH 057/155] =?UTF-8?q?perf:=20=E4=BC=98=E5=8C=96=E6=A3=80?= =?UTF-8?q?=E6=B5=8B=E9=87=8D=E5=A4=8D=E5=B8=A7=E7=9A=84=E6=80=A7=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Magpie.Core/FrameSourceBase.cpp | 6 +----- .../shaders/DuplicateFramesCS.hlsl | 20 +++++++++++++++---- 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/src/Magpie.Core/FrameSourceBase.cpp b/src/Magpie.Core/FrameSourceBase.cpp index edd7bf9b6..31bc619e5 100644 --- a/src/Magpie.Core/FrameSourceBase.cpp +++ b/src/Magpie.Core/FrameSourceBase.cpp @@ -117,10 +117,6 @@ FrameSourceBase::UpdateState FrameSourceBase::Update() noexcept { }; d3dDC->CSSetShaderResources(0, 2, srvs); - ID3D11SamplerState* sam = _deviceResources->GetSampler( - D3D11_FILTER_MIN_MAG_MIP_POINT, D3D11_TEXTURE_ADDRESS_CLAMP); - d3dDC->CSSetSamplers(0, 1, &sam); - ID3D11UnorderedAccessView* uav = _deviceResources->GetUnorderedAccessView( _resultBuffer.get(), 1, DXGI_FORMAT_R32_UINT); // 将缓冲区置零 @@ -189,7 +185,7 @@ FrameSourceBase::UpdateState FrameSourceBase::Update() noexcept { return UpdateState::NewFrame; } - static constexpr std::pair BLOCK_SIZE{8, 8}; + static constexpr std::pair BLOCK_SIZE{16, 16}; _dispatchCount.first = (td.Width + BLOCK_SIZE.first - 1) / BLOCK_SIZE.first; _dispatchCount.second = (td.Height + BLOCK_SIZE.second - 1) / BLOCK_SIZE.second; } diff --git a/src/Magpie.Core/shaders/DuplicateFramesCS.hlsl b/src/Magpie.Core/shaders/DuplicateFramesCS.hlsl index bad2135e4..324a0607e 100644 --- a/src/Magpie.Core/shaders/DuplicateFramesCS.hlsl +++ b/src/Magpie.Core/shaders/DuplicateFramesCS.hlsl @@ -3,16 +3,28 @@ RWBuffer result : register(u0); Texture2D tex1 : register(t0); Texture2D tex2 : register(t1); -SamplerState sam : register(s0); +uint Bfe(uint src, uint off, uint bits) { + uint mask = (1u << bits) - 1; + return (src >> off) & mask; +} + +uint BfiM(uint src, uint ins, uint bits) { + uint mask = (1u << bits) - 1; + return (ins & mask) | (src & (~mask)); +} + +uint2 Rmp8x8(uint a) { + return uint2(Bfe(a, 1u, 3u), BfiM(Bfe(a, 3u, 3u), a, 1u)); +} -[numthreads(8, 8, 1)] +[numthreads(64, 1, 1)] void main(uint3 tid : SV_GroupThreadID, uint3 gid : SV_GroupID) { if (result[0]) { return; } - int3 gxy = { (gid.xy << 3u) + tid.xy, 0 }; - if (any(tex1.Load(gxy).rgb != tex2.Load(gxy, 0).rgb)) { + const int3 pos = { (gid.xy << 3u) + Rmp8x8(tid.x) << 2, 0 }; + if (any(tex1.Load(pos).rgb != tex2.Load(pos, 0).rgb)) { result[0] = 1u; } } From ebaadad08042fff946010b0bfed509059bc89073 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=97=AD?= <34770031+Blinue@users.noreply.github.com> Date: Tue, 27 Jun 2023 22:12:16 +0800 Subject: [PATCH 058/155] =?UTF-8?q?perf:=20=E4=BC=98=E5=8C=96=E6=A3=80?= =?UTF-8?q?=E6=B5=8B=E9=87=8D=E5=A4=8D=E5=B8=A7=E7=9A=84=E6=80=A7=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Magpie.Core/FrameSourceBase.cpp | 4 ++++ .../shaders/DuplicateFramesCS.hlsl | 21 +++++++++++++++++-- 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/src/Magpie.Core/FrameSourceBase.cpp b/src/Magpie.Core/FrameSourceBase.cpp index 31bc619e5..7f34dfe05 100644 --- a/src/Magpie.Core/FrameSourceBase.cpp +++ b/src/Magpie.Core/FrameSourceBase.cpp @@ -117,6 +117,10 @@ FrameSourceBase::UpdateState FrameSourceBase::Update() noexcept { }; d3dDC->CSSetShaderResources(0, 2, srvs); + ID3D11SamplerState* sam = _deviceResources->GetSampler( + D3D11_FILTER_MIN_MAG_MIP_POINT, D3D11_TEXTURE_ADDRESS_CLAMP); + d3dDC->CSSetSamplers(0, 1, &sam); + ID3D11UnorderedAccessView* uav = _deviceResources->GetUnorderedAccessView( _resultBuffer.get(), 1, DXGI_FORMAT_R32_UINT); // 将缓冲区置零 diff --git a/src/Magpie.Core/shaders/DuplicateFramesCS.hlsl b/src/Magpie.Core/shaders/DuplicateFramesCS.hlsl index 324a0607e..298c3e773 100644 --- a/src/Magpie.Core/shaders/DuplicateFramesCS.hlsl +++ b/src/Magpie.Core/shaders/DuplicateFramesCS.hlsl @@ -3,6 +3,8 @@ RWBuffer result : register(u0); Texture2D tex1 : register(t0); Texture2D tex2 : register(t1); +SamplerState sam : register(s0); + uint Bfe(uint src, uint off, uint bits) { uint mask = (1u << bits) - 1; return (src >> off) & mask; @@ -23,8 +25,23 @@ void main(uint3 tid : SV_GroupThreadID, uint3 gid : SV_GroupID) { return; } - const int3 pos = { (gid.xy << 3u) + Rmp8x8(tid.x) << 2, 0 }; - if (any(tex1.Load(pos).rgb != tex2.Load(pos, 0).rgb)) { + const int2 gxy = { (gid.xy << 4) + (Rmp8x8(tid.x) << 1) }; + + uint width, height; + tex1.GetDimensions(width, height); + float2 pos = (gxy + 1) / float2(width, height); + + if (any(tex1.GatherRed(sam, pos) != tex2.GatherRed(sam, pos))) { + result[0] = 1u; + return; + } + + if (any(tex1.GatherGreen(sam, pos) != tex2.GatherGreen(sam, pos))) { + result[0] = 1u; + return; + } + + if (any(tex1.GatherBlue(sam, pos) != tex2.GatherBlue(sam, pos))) { result[0] = 1u; } } From 2e844d0ebdd35064d8a8948b8377e89f1a691763 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=97=AD?= <34770031+Blinue@users.noreply.github.com> Date: Tue, 27 Jun 2023 23:04:31 +0800 Subject: [PATCH 059/155] =?UTF-8?q?perf:=20=E7=A8=8D=E5=BE=AE=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E7=9D=80=E8=89=B2=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../shaders/DuplicateFramesCS.hlsl | 21 +++++-------------- 1 file changed, 5 insertions(+), 16 deletions(-) diff --git a/src/Magpie.Core/shaders/DuplicateFramesCS.hlsl b/src/Magpie.Core/shaders/DuplicateFramesCS.hlsl index 298c3e773..99494b6e9 100644 --- a/src/Magpie.Core/shaders/DuplicateFramesCS.hlsl +++ b/src/Magpie.Core/shaders/DuplicateFramesCS.hlsl @@ -1,3 +1,4 @@ +// 无需同步 RWBuffer result : register(u0); Texture2D tex1 : register(t0); @@ -5,31 +6,19 @@ Texture2D tex2 : register(t1); SamplerState sam : register(s0); -uint Bfe(uint src, uint off, uint bits) { - uint mask = (1u << bits) - 1; - return (src >> off) & mask; -} - -uint BfiM(uint src, uint ins, uint bits) { - uint mask = (1u << bits) - 1; - return (ins & mask) | (src & (~mask)); -} - -uint2 Rmp8x8(uint a) { - return uint2(Bfe(a, 1u, 3u), BfiM(Bfe(a, 3u, 3u), a, 1u)); -} -[numthreads(64, 1, 1)] +[numthreads(8, 8, 1)] void main(uint3 tid : SV_GroupThreadID, uint3 gid : SV_GroupID) { if (result[0]) { return; } - const int2 gxy = { (gid.xy << 4) + (Rmp8x8(tid.x) << 1) }; + const int2 gxy = (gid.xy << 4) + (tid.xy << 1); + // 不知为何这比通过 cbuffer 传入更快 uint width, height; tex1.GetDimensions(width, height); - float2 pos = (gxy + 1) / float2(width, height); + const float2 pos = (gxy + 1) / float2(width, height); if (any(tex1.GatherRed(sam, pos) != tex2.GatherRed(sam, pos))) { result[0] = 1u; From e4728e1290ac8b37ceff41c5660b9e844243f685 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=97=AD?= <34770031+Blinue@users.noreply.github.com> Date: Tue, 27 Jun 2023 23:11:21 +0800 Subject: [PATCH 060/155] chore: DuplicateFramesCS->DuplicateFrameCS --- src/Magpie.Core/FrameSourceBase.cpp | 4 ++-- src/Magpie.Core/Magpie.Core.vcxproj | 2 +- src/Magpie.Core/Magpie.Core.vcxproj.filters | 2 +- .../shaders/{DuplicateFramesCS.hlsl => DuplicateFrameCS.hlsl} | 0 4 files changed, 4 insertions(+), 4 deletions(-) rename src/Magpie.Core/shaders/{DuplicateFramesCS.hlsl => DuplicateFrameCS.hlsl} (100%) diff --git a/src/Magpie.Core/FrameSourceBase.cpp b/src/Magpie.Core/FrameSourceBase.cpp index 7f34dfe05..54e98276b 100644 --- a/src/Magpie.Core/FrameSourceBase.cpp +++ b/src/Magpie.Core/FrameSourceBase.cpp @@ -8,7 +8,7 @@ #include "SmallVector.h" #include "DirectXHelper.h" #include "DeviceResources.h" -#include "shaders/DuplicateFramesCS.h" +#include "shaders/DuplicateFrameCS.h" namespace Magpie::Core { @@ -182,7 +182,7 @@ FrameSourceBase::UpdateState FrameSourceBase::Update() noexcept { } hr = d3dDevice->CreateComputeShader( - DuplicateFramesCS, sizeof(DuplicateFramesCS), nullptr, _dupFrameCS.put()); + DuplicateFrameCS, sizeof(DuplicateFrameCS), nullptr, _dupFrameCS.put()); if (FAILED(hr)) { Logger::Get().ComError("CreateComputeShader 失败", hr); _prevFrame = nullptr; diff --git a/src/Magpie.Core/Magpie.Core.vcxproj b/src/Magpie.Core/Magpie.Core.vcxproj index 28b18b757..eb621755c 100644 --- a/src/Magpie.Core/Magpie.Core.vcxproj +++ b/src/Magpie.Core/Magpie.Core.vcxproj @@ -152,7 +152,7 @@ - + Compute diff --git a/src/Magpie.Core/Magpie.Core.vcxproj.filters b/src/Magpie.Core/Magpie.Core.vcxproj.filters index e97a3a984..9f4db9830 100644 --- a/src/Magpie.Core/Magpie.Core.vcxproj.filters +++ b/src/Magpie.Core/Magpie.Core.vcxproj.filters @@ -148,7 +148,7 @@ Shaders - + Shaders diff --git a/src/Magpie.Core/shaders/DuplicateFramesCS.hlsl b/src/Magpie.Core/shaders/DuplicateFrameCS.hlsl similarity index 100% rename from src/Magpie.Core/shaders/DuplicateFramesCS.hlsl rename to src/Magpie.Core/shaders/DuplicateFrameCS.hlsl From 7329ac34780af2ccf18ecbd94d9856d7ff17ef77 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=97=AD?= Date: Wed, 28 Jun 2023 14:22:24 +0800 Subject: [PATCH 061/155] =?UTF-8?q?feat:=20=E9=80=82=E9=85=8D=E5=8A=A8?= =?UTF-8?q?=E6=80=81=E6=95=88=E6=9E=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Magpie.Core/FrameSourceBase.cpp | 2 +- src/Magpie.Core/FrameSourceBase.h | 1 + src/Magpie.Core/Renderer.cpp | 32 ++++++++++++++++++++--------- src/Magpie.Core/Renderer.h | 3 ++- 4 files changed, 26 insertions(+), 12 deletions(-) diff --git a/src/Magpie.Core/FrameSourceBase.cpp b/src/Magpie.Core/FrameSourceBase.cpp index 54e98276b..55e331814 100644 --- a/src/Magpie.Core/FrameSourceBase.cpp +++ b/src/Magpie.Core/FrameSourceBase.cpp @@ -146,7 +146,7 @@ FrameSourceBase::UpdateState FrameSourceBase::Update() noexcept { } if (result == 0) { // 和前一帧相同 - return UpdateState::Waiting; + return UpdateState::NoChange; } } else { D3D11_TEXTURE2D_DESC td; diff --git a/src/Magpie.Core/FrameSourceBase.h b/src/Magpie.Core/FrameSourceBase.h index a87078416..bba0bc8f5 100644 --- a/src/Magpie.Core/FrameSourceBase.h +++ b/src/Magpie.Core/FrameSourceBase.h @@ -25,6 +25,7 @@ class FrameSourceBase { enum class UpdateState { NewFrame, + NoChange, Waiting, Error }; diff --git a/src/Magpie.Core/Renderer.cpp b/src/Magpie.Core/Renderer.cpp index be870ac28..017752e05 100644 --- a/src/Magpie.Core/Renderer.cpp +++ b/src/Magpie.Core/Renderer.cpp @@ -399,15 +399,14 @@ ID3D11Texture2D* Renderer::_BuildEffects(const ScalingOptions& options) noexcept // 初始化所有效果共用的动态常量缓冲区 { - bool isUseDynamic = false; - for (const EffectDesc& ed : effectDescs) { - if (ed.flags & EffectFlags::UseDynamic) { - isUseDynamic = true; + for (uint32_t i = 0; i < effectDescs.size(); ++i) { + if(effectDescs[i].flags & EffectFlags::UseDynamic) { + _firstDynamicEffectIdx = i; break; } } - if (isUseDynamic) { + if (_firstDynamicEffectIdx != std::numeric_limits::max()) { D3D11_BUFFER_DESC bd{}; bd.Usage = D3D11_USAGE_DYNAMIC; bd.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; @@ -500,9 +499,10 @@ void Renderer::_BackendThreadProc(const ScalingOptions& options) noexcept { nextFrame = true; } - if (_frameSource->Update() == FrameSourceBase::UpdateState::NewFrame) { + FrameSourceBase::UpdateState state = _frameSource->Update(); + if (state == FrameSourceBase::UpdateState::NewFrame || state == FrameSourceBase::UpdateState::NoChange) { nextFrame = false; - _BackendRender(outputTexture); + _BackendRender(outputTexture, state == FrameSourceBase::UpdateState::NoChange); } else { // 等待新消息 WaitMessage(); @@ -594,7 +594,12 @@ ID3D11Texture2D* Renderer::_InitBackend(const ScalingOptions& options) noexcept return outputTexture; } -void Renderer::_BackendRender(ID3D11Texture2D* effectsOutput) noexcept { +void Renderer::_BackendRender(ID3D11Texture2D* effectsOutput, bool noChange) noexcept { + if (noChange && !_dynamicCB) { + // 源窗口内容不变,也没有动态效果则跳过渲染 + return; + } + ID3D11DeviceContext4* d3dDC = _backendResources.GetD3DDC(); d3dDC->ClearState(); @@ -603,8 +608,15 @@ void Renderer::_BackendRender(ID3D11Texture2D* effectsOutput) noexcept { d3dDC->CSSetConstantBuffers(1, 1, &t); } - for (const EffectDrawer& effectDrawer : _effectDrawers) { - effectDrawer.Draw(); + if (noChange) { + // 源窗口内容不变则从第一个动态效果开始渲染 + for (uint32_t i = _firstDynamicEffectIdx; i < _effectDrawers.size(); ++i) { + _effectDrawers[i].Draw(); + } + } else { + for (const EffectDrawer& effectDrawer : _effectDrawers) { + effectDrawer.Draw(); + } } HRESULT hr = d3dDC->Signal(_d3dFence.get(), ++_fenceValue); diff --git a/src/Magpie.Core/Renderer.h b/src/Magpie.Core/Renderer.h index f2225ae75..e1429b27f 100644 --- a/src/Magpie.Core/Renderer.h +++ b/src/Magpie.Core/Renderer.h @@ -45,7 +45,7 @@ class Renderer { HANDLE _CreateSharedTexture(ID3D11Texture2D* effectsOutput) noexcept; - void _BackendRender(ID3D11Texture2D* effectsOutput) noexcept; + void _BackendRender(ID3D11Texture2D* effectsOutput, bool noChange) noexcept; bool _UpdateDynamicConstants() const noexcept; @@ -82,6 +82,7 @@ class Renderer { winrt::com_ptr _backendSharedTextureMutex; winrt::com_ptr _dynamicCB; + uint32_t _firstDynamicEffectIdx = std::numeric_limits::max(); // 可由所有线程访问 HWND _hwndSrc = NULL; From f84571c3e77cfbd8c21bae17f092de5aa36ccfa8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=97=AD?= <34770031+Blinue@users.noreply.github.com> Date: Wed, 28 Jun 2023 18:49:30 +0800 Subject: [PATCH 062/155] =?UTF-8?q?fix:=20=E9=87=8D=E5=A4=8D=E5=B8=A7?= =?UTF-8?q?=E4=B8=8D=E8=AE=A1=E5=85=A5=E5=B8=A7=E7=8E=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Magpie.Core/Renderer.cpp | 42 +++++++++++++++++++++++------------ src/Magpie.Core/StepTimer.cpp | 10 +++++---- src/Magpie.Core/StepTimer.h | 2 +- 3 files changed, 35 insertions(+), 19 deletions(-) diff --git a/src/Magpie.Core/Renderer.cpp b/src/Magpie.Core/Renderer.cpp index 017752e05..dc8be14e9 100644 --- a/src/Magpie.Core/Renderer.cpp +++ b/src/Magpie.Core/Renderer.cpp @@ -478,7 +478,11 @@ void Renderer::_BackendThreadProc(const ScalingOptions& options) noexcept { return; } - bool nextFrame = false; + enum { + WaitForStepTimer, + WaitForFrameSource, + DuplicateFrame + } renderState = WaitForStepTimer; MSG msg; while (true) { @@ -492,20 +496,35 @@ void Renderer::_BackendThreadProc(const ScalingOptions& options) noexcept { DispatchMessage(&msg); } - if (!nextFrame) { - if (!_stepTimer.NewFrame()) { + if (renderState != WaitForFrameSource) { + // 实际上向 StepTimer 汇报重复帧有一帧的滞后,不过无伤大雅 + if (!_stepTimer.NewFrame(renderState == DuplicateFrame)) { continue; } - nextFrame = true; + renderState = WaitForFrameSource; } - FrameSourceBase::UpdateState state = _frameSource->Update(); - if (state == FrameSourceBase::UpdateState::NewFrame || state == FrameSourceBase::UpdateState::NoChange) { - nextFrame = false; - _BackendRender(outputTexture, state == FrameSourceBase::UpdateState::NoChange); - } else { + switch (_frameSource->Update()) { + case FrameSourceBase::UpdateState::NewFrame: + _BackendRender(outputTexture, false); + renderState = WaitForStepTimer; + break; + case FrameSourceBase::UpdateState::NoChange: + // 源窗口内容不变,也没有动态效果则跳过渲染 + if (_dynamicCB) { + _BackendRender(outputTexture, true); + renderState = WaitForStepTimer; + } else { + renderState = DuplicateFrame; + } + break; + case FrameSourceBase::UpdateState::Waiting: // 等待新消息 WaitMessage(); + break; + default: + renderState = WaitForStepTimer; + break; } } } @@ -595,11 +614,6 @@ ID3D11Texture2D* Renderer::_InitBackend(const ScalingOptions& options) noexcept } void Renderer::_BackendRender(ID3D11Texture2D* effectsOutput, bool noChange) noexcept { - if (noChange && !_dynamicCB) { - // 源窗口内容不变,也没有动态效果则跳过渲染 - return; - } - ID3D11DeviceContext4* d3dDC = _backendResources.GetD3DDC(); d3dDC->ClearState(); diff --git a/src/Magpie.Core/StepTimer.cpp b/src/Magpie.Core/StepTimer.cpp index e2b0928e1..d36490daa 100644 --- a/src/Magpie.Core/StepTimer.cpp +++ b/src/Magpie.Core/StepTimer.cpp @@ -13,7 +13,7 @@ void StepTimer::Initialize(std::optional maxFrameRate) noexcept { } } -bool StepTimer::NewFrame() noexcept { +bool StepTimer::NewFrame(bool isDupFrame) noexcept { const auto now = high_resolution_clock::now(); const nanoseconds delta = now - _lastFrameTime; @@ -40,9 +40,11 @@ bool StepTimer::NewFrame() noexcept { _lastFrameTime = now; } - // 更新当前帧率 - ++_framesThisSecond; - ++_frameCount; + // 更新当前帧率,不计重复帧 + if (!isDupFrame) { + ++_framesThisSecond; + ++_frameCount; + } _fpsCounter += delta; if (_fpsCounter >= 1s) { diff --git a/src/Magpie.Core/StepTimer.h b/src/Magpie.Core/StepTimer.h index 80dad7ea5..d0b692b4a 100644 --- a/src/Magpie.Core/StepTimer.h +++ b/src/Magpie.Core/StepTimer.h @@ -12,7 +12,7 @@ class StepTimer { void Initialize(std::optional maxFrameRate) noexcept; - bool NewFrame() noexcept; + bool NewFrame(bool isDupFrame) noexcept; uint32_t FrameCount() const noexcept { return _frameCount; From 773395de3607aab7b281c7a96d7b2d02cc2403f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=97=AD?= <34770031+Blinue@users.noreply.github.com> Date: Wed, 28 Jun 2023 18:54:04 +0800 Subject: [PATCH 063/155] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=20GDI=20?= =?UTF-8?q?=E6=8D=95=E8=8E=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Magpie.Core/GDIFrameSource.h | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Magpie.Core/GDIFrameSource.h b/src/Magpie.Core/GDIFrameSource.h index 8fa57ed33..81389689f 100644 --- a/src/Magpie.Core/GDIFrameSource.h +++ b/src/Magpie.Core/GDIFrameSource.h @@ -29,7 +29,6 @@ class GDIFrameSource : public FrameSourceBase { } private: - HWND _hwndSrc = NULL; RECT _frameRect{}; winrt::com_ptr _dxgiSurface; }; From 4900d57c1d7ec422b11a6a5908f6341807b00517 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=97=AD?= <34770031+Blinue@users.noreply.github.com> Date: Mon, 3 Jul 2023 22:47:34 +0800 Subject: [PATCH 064/155] =?UTF-8?q?refactor:=20ScalingWindow=20=E4=BD=9C?= =?UTF-8?q?=E4=B8=BA=E5=85=A8=E5=B1=80=E7=8A=B6=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Magpie.Core/CursorDrawer.cpp | 39 ++- src/Magpie.Core/CursorDrawer.h | 10 +- src/Magpie.Core/CursorManager.cpp | 274 +++++++++--------- src/Magpie.Core/CursorManager.h | 24 +- src/Magpie.Core/DeviceResources.cpp | 5 +- src/Magpie.Core/DeviceResources.h | 4 +- src/Magpie.Core/EffectCompiler.h | 4 +- src/Magpie.Core/EffectDrawer.cpp | 3 +- src/Magpie.Core/EffectDrawer.h | 1 - src/Magpie.Core/FrameSourceBase.cpp | 52 ++-- src/Magpie.Core/FrameSourceBase.h | 14 +- src/Magpie.Core/GDIFrameSource.cpp | 16 +- src/Magpie.Core/GDIFrameSource.h | 2 +- .../GraphicsCaptureFrameSource.cpp | 60 ++-- src/Magpie.Core/GraphicsCaptureFrameSource.h | 6 +- src/Magpie.Core/Renderer.cpp | 146 +++++----- src/Magpie.Core/Renderer.h | 17 +- src/Magpie.Core/ScalingRuntime.cpp | 13 +- src/Magpie.Core/ScalingRuntime.h | 6 +- src/Magpie.Core/ScalingWindow.cpp | 25 +- src/Magpie.Core/ScalingWindow.h | 38 ++- 21 files changed, 376 insertions(+), 383 deletions(-) diff --git a/src/Magpie.Core/CursorDrawer.cpp b/src/Magpie.Core/CursorDrawer.cpp index e3f55dae7..6f952fd7c 100644 --- a/src/Magpie.Core/CursorDrawer.cpp +++ b/src/Magpie.Core/CursorDrawer.cpp @@ -11,6 +11,8 @@ #include "shaders/MonochromeCursorPS.h" #include #include "Win32Utils.h" +#include "ScalingWindow.h" +#include "Renderer.h" using namespace DirectX; @@ -40,22 +42,24 @@ struct VertexPositionTexture { static constexpr unsigned int InputElementCount = 2; static constexpr D3D11_INPUT_ELEMENT_DESC InputElements[InputElementCount] = { - { "SV_Position", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 }, - { "TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 }, + { "SV_Position", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 }, + { "TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 }, }; }; -bool CursorDrawer::Initialize( - DeviceResources& deviceResources, - ID3D11Texture2D* backBuffer, - const RECT& viewportRect, - const ScalingOptions& options -) noexcept { +bool CursorDrawer::Initialize(DeviceResources& deviceResources, ID3D11Texture2D* backBuffer) noexcept { _deviceResources = &deviceResources; _backBuffer = backBuffer; - _viewportRect = viewportRect; - _cursorScaling = options.cursorScaling; - _interpolationMode = options.cursorInterpolationMode; + + const RECT& scalingWndRect = ScalingWindow::Get().WndRect(); + const RECT& destRect = ScalingWindow::Get().Renderer().DestRect(); + + _viewportRect = { + destRect.left - scalingWndRect.left, + destRect.top - scalingWndRect.top, + destRect.right - scalingWndRect.left, + destRect.bottom - scalingWndRect.top + }; ID3D11Device* d3dDevice = deviceResources.GetD3DDevice(); @@ -103,10 +107,11 @@ void CursorDrawer::Draw(HCURSOR hCursor, POINT cursorPos) noexcept { return; } - SIZE cursorSize{ lroundf(ci->size.cx * _cursorScaling), lroundf(ci->size.cy * _cursorScaling) }; + const float cursorScaling = ScalingWindow::Get().Options().cursorScaling; + SIZE cursorSize{ lroundf(ci->size.cx * cursorScaling), lroundf(ci->size.cy * cursorScaling) }; RECT cursorRect; - cursorRect.left = lroundf(cursorPos.x - ci->hotSpot.x * _cursorScaling); - cursorRect.top = lroundf(cursorPos.y - ci->hotSpot.y * _cursorScaling); + cursorRect.left = lroundf(cursorPos.x - ci->hotSpot.x * cursorScaling); + cursorRect.top = lroundf(cursorPos.y - ci->hotSpot.y * cursorScaling); cursorRect.right = cursorRect.left + cursorSize.cx; cursorRect.bottom = cursorRect.top + cursorSize.cy; @@ -168,6 +173,8 @@ void CursorDrawer::Draw(HCURSOR hCursor, POINT cursorPos) noexcept { d3dDC->RSSetViewports(1, &vp); } + CursorInterpolationMode interpolationMode = ScalingWindow::Get().Options().cursorInterpolationMode; + if (ci->type == _CursorType::Color) { // 配置像素着色器 if (!_simplePS) { @@ -184,7 +191,7 @@ void CursorDrawer::Draw(HCURSOR hCursor, POINT cursorPos) noexcept { ID3D11ShaderResourceView* cursorSRV = _deviceResources->GetShaderResourceView(ci->texture.get()); d3dDC->PSSetShaderResources(0, 1, &cursorSRV); ID3D11SamplerState* cursorSampler = _deviceResources->GetSampler( - _interpolationMode == CursorInterpolationMode::NearestNeighbor + interpolationMode == CursorInterpolationMode::NearestNeighbor ? D3D11_FILTER_MIN_MAG_MIP_POINT : D3D11_FILTER_MIN_MAG_MIP_LINEAR, D3D11_TEXTURE_ADDRESS_CLAMP); @@ -260,7 +267,7 @@ void CursorDrawer::Draw(HCURSOR hCursor, POINT cursorPos) noexcept { ID3D11SamplerState* samplers[2]; samplers[0] = _deviceResources->GetSampler( D3D11_FILTER_MIN_MAG_MIP_POINT, D3D11_TEXTURE_ADDRESS_CLAMP); - if (_interpolationMode == CursorInterpolationMode::NearestNeighbor) { + if (interpolationMode == CursorInterpolationMode::NearestNeighbor) { samplers[1] = samplers[0]; } else { samplers[1] = _deviceResources->GetSampler( diff --git a/src/Magpie.Core/CursorDrawer.h b/src/Magpie.Core/CursorDrawer.h index fbe3de616..6789d81e2 100644 --- a/src/Magpie.Core/CursorDrawer.h +++ b/src/Magpie.Core/CursorDrawer.h @@ -12,12 +12,7 @@ class CursorDrawer { CursorDrawer(const CursorDrawer&) = delete; CursorDrawer(CursorDrawer&&) = delete; - bool Initialize( - DeviceResources& deviceResources, - ID3D11Texture2D* backBuffer, - const RECT& viewportRect, - const ScalingOptions& options - ) noexcept; + bool Initialize(DeviceResources& deviceResources, ID3D11Texture2D* backBuffer) noexcept; void Draw(HCURSOR hCursor, POINT cursorPos) noexcept; @@ -54,9 +49,6 @@ class CursorDrawer { RECT _viewportRect{}; - float _cursorScaling = 1.0f; - CursorInterpolationMode _interpolationMode = CursorInterpolationMode::NearestNeighbor; - phmap::flat_hash_map _cursorInfos; winrt::com_ptr _simpleVS; diff --git a/src/Magpie.Core/CursorManager.cpp b/src/Magpie.Core/CursorManager.cpp index cc28b3cca..d904dcb1e 100644 --- a/src/Magpie.Core/CursorManager.cpp +++ b/src/Magpie.Core/CursorManager.cpp @@ -4,11 +4,80 @@ #include #include "Win32Utils.h" #include "ScalingOptions.h" +#include "ScalingWindow.h" +#include "Renderer.h" #pragma comment(lib, "Magnification.lib") namespace Magpie::Core { +// 将源窗口的光标位置映射到缩放后的光标位置 +// 当光标位于源窗口之外,与源窗口的距离不会缩放 +static POINT SrcToScaling(POINT pt, bool screenCoord) noexcept { + const Renderer& renderer = ScalingWindow::Get().Renderer(); + const RECT& srcRect = renderer.SrcRect(); + const RECT& destRect = renderer.DestRect(); + const RECT& scalingRect = ScalingWindow::Get().WndRect(); + + POINT result; + + if (pt.x >= srcRect.right) { + result.x = scalingRect.right + pt.x - srcRect.right; + } else if (pt.x < srcRect.left) { + result.x = scalingRect.left + pt.x - srcRect.left; + } else { + double pos = double(pt.x - srcRect.left) / (srcRect.right - srcRect.left - 1); + result.x = std::lround(pos * (destRect.right - destRect.left - 1)) + destRect.left; + } + + if (pt.y >= srcRect.bottom) { + result.y = scalingRect.bottom + pt.y - srcRect.bottom; + } else if (pt.y < srcRect.top) { + result.y = scalingRect.top + pt.y - srcRect.top; + } else { + double pos = double(pt.y - srcRect.top) / (srcRect.bottom - srcRect.top - 1); + result.y = std::lround(pos * (destRect.bottom - destRect.top - 1)) + destRect.top; + } + + if (!screenCoord) { + result.x -= scalingRect.left; + result.y -= scalingRect.top; + } + + return result; +} + +static POINT ScalingToSrc(POINT pt) noexcept { + const Renderer& renderer = ScalingWindow::Get().Renderer(); + const RECT& srcRect = renderer.SrcRect(); + const RECT& destRect = renderer.DestRect(); + + const SIZE srcSize = Win32Utils::GetSizeOfRect(srcRect); + const SIZE destSize = Win32Utils::GetSizeOfRect(destRect); + + POINT result = { srcRect.left, srcRect.top }; + + if (pt.x >= destRect.right) { + result.x += srcSize.cx + pt.x - destRect.right; + } else if (pt.x < destRect.left) { + result.x += pt.x - destRect.left; + } else { + double pos = double(pt.x - destRect.left) / (destSize.cx - 1); + result.x += std::lround(pos * (srcSize.cx - 1)); + } + + if (pt.y >= destRect.bottom) { + result.y += srcSize.cx + pt.y - destRect.bottom; + } else if (pt.y < destRect.top) { + result.y += pt.y - destRect.top; + } else { + double pos = double(pt.y - destRect.top) / (destSize.cy - 1); + result.y += std::lround(pos * (srcSize.cy - 1)); + } + + return result; +} + CursorManager::~CursorManager() noexcept { if (_curClips != RECT{}) { ClipCursor(nullptr); @@ -16,7 +85,7 @@ CursorManager::~CursorManager() noexcept { if (_isUnderCapture) { POINT pt{}; - if (!::GetCursorPos(&pt)) { + if (!GetCursorPos(&pt)) { Logger::Get().Win32Error("GetCursorPos 失败"); } _curClips = {}; @@ -24,24 +93,14 @@ CursorManager::~CursorManager() noexcept { } } -bool CursorManager::Initialize( - HWND hwndSrc, - HWND hwndScaling, - const RECT& srcRect, - const RECT& scalingWndRect, - const RECT& destRect, - const ScalingOptions& options -) noexcept { - _hwndSrc = hwndSrc; - _hwndScaling = hwndScaling; - _srcRect = srcRect; - _scalingWndRect = scalingWndRect; - _destRect = destRect; - _isAdjustCursorSpeed = options.IsAdjustCursorSpeed(); - _isDebugMode = options.IsDebugMode(); - _is3DGameMode = options.Is3DGameMode(); - _isDrawCursor = options.IsDrawCursor(); +bool CursorManager::Initialize() noexcept { + if (ScalingWindow::Get().Options().Is3DGameMode()) { + POINT cursorPos; + GetCursorPos(&cursorPos); + _StartCapture(cursorPos); + } + Logger::Get().Info("CursorManager 初始化完成"); return true; } @@ -51,18 +110,13 @@ std::pair CursorManager::Update() noexcept { std::pair result{NULL, { std::numeric_limits::max(), std::numeric_limits::max() }}; - if (!_isDrawCursor || !_isUnderCapture) { + const ScalingOptions& options = ScalingWindow::Get().Options(); + + if (!options.IsDrawCursor() || !_isUnderCapture) { // 不绘制光标 return result; } - if (_is3DGameMode) { - HWND hwndFore = GetForegroundWindow(); - if (hwndFore != _hwndScaling && hwndFore != _hwndSrc) { - return result; - } - } - CURSORINFO ci{ sizeof(CURSORINFO) }; if (!GetCursorInfo(&ci)) { Logger::Get().Win32Error("GetCursorPos 失败"); @@ -74,7 +128,7 @@ std::pair CursorManager::Update() noexcept { } result.first = ci.hCursor; - result.second = _SrcToScaling(ci.ptScreenPos, false); + result.second = SrcToScaling(ci.ptScreenPos, false); return result; } @@ -127,8 +181,9 @@ void CursorManager::_AdjustCursorSpeed() noexcept { } } - const SIZE srcSize = Win32Utils::GetSizeOfRect(_srcRect); - const SIZE destSize = Win32Utils::GetSizeOfRect(_destRect); + const Renderer& renderer = ScalingWindow::Get().Renderer(); + const SIZE srcSize = Win32Utils::GetSizeOfRect(renderer.SrcRect()); + const SIZE destSize = Win32Utils::GetSizeOfRect(renderer.DestRect()); const double scale = ((double)destSize.cx / srcSize.cx + (double)destSize.cy / srcSize.cy) / 2; INT newSpeed = 0; @@ -228,22 +283,28 @@ static HWND WindowFromPoint(HWND hwndScaling, const RECT& scalingWndRect, POINT } void CursorManager::_UpdateCursorClip() noexcept { + const Renderer& renderer = ScalingWindow::Get().Renderer(); + const RECT& srcRect = renderer.SrcRect(); + const RECT& destRect = renderer.DestRect(); + // 优先级: // 1. 断点模式:不限制,捕获/取消捕获,支持 UI // 2. 在 3D 游戏中限制光标:每帧都限制一次,不退出捕获,因此无法使用 UI,不支持多屏幕 // 3. 常规:根据多屏幕限制光标,捕获/取消捕获,支持 UI 和多屏幕 - if (!_isDebugMode && _is3DGameMode) { + const ScalingOptions& options = ScalingWindow::Get().Options(); + if (!options.IsDebugMode() && options.Is3DGameMode()) { // 开启“在 3D 游戏中限制光标”则每帧都限制一次光标 - _curClips = _srcRect; - ClipCursor(&_srcRect); + _curClips = srcRect; + ClipCursor(&srcRect); return; } - const SIZE srcSize = Win32Utils::GetSizeOfRect(_srcRect); - const SIZE destSize = Win32Utils::GetSizeOfRect(_destRect); + const HWND hwndScaling = ScalingWindow::Get().Handle(); + const RECT scalingRect = ScalingWindow::Get().WndRect(); + const HWND hwndSrc = ScalingWindow::Get().HwndSrc(); - INT_PTR style = GetWindowLongPtr(_hwndScaling, GWL_EXSTYLE); + INT_PTR style = GetWindowLongPtr(hwndScaling, GWL_EXSTYLE); POINT cursorPos; if (!GetCursorPos(&cursorPos)) { @@ -265,12 +326,12 @@ void CursorManager::_UpdateCursorClip() noexcept { // /////////////////////////////////////////////////////////// - HWND hwndCur = WindowFromPoint(_hwndScaling, _scalingWndRect, _SrcToScaling(cursorPos, true), false); + HWND hwndCur = WindowFromPoint(hwndScaling, scalingRect, SrcToScaling(cursorPos, true), false); - if (hwndCur != _hwndScaling) { + if (hwndCur != hwndScaling) { // 主窗口被遮挡 if (style | WS_EX_TRANSPARENT) { - SetWindowLongPtr(_hwndScaling, GWL_EXSTYLE, style & ~WS_EX_TRANSPARENT); + SetWindowLongPtr(hwndScaling, GWL_EXSTYLE, style & ~WS_EX_TRANSPARENT); } _StopCapture(cursorPos); @@ -280,19 +341,19 @@ void CursorManager::_UpdateCursorClip() noexcept { if (!stopCapture) { // 判断源窗口是否被遮挡 - hwndCur = WindowFromPoint(_hwndScaling, _scalingWndRect, cursorPos, true); - stopCapture = hwndCur != _hwndSrc && (!IsChild(_hwndSrc, hwndCur) || !((GetWindowStyle(hwndCur) & WS_CHILD))); + hwndCur = WindowFromPoint(hwndScaling, scalingRect, cursorPos, true); + stopCapture = hwndCur != hwndSrc && (!IsChild(hwndSrc, hwndCur) || !((GetWindowStyle(hwndCur) & WS_CHILD))); } if (stopCapture) { if (style | WS_EX_TRANSPARENT) { - SetWindowLongPtr(_hwndScaling, GWL_EXSTYLE, style & ~WS_EX_TRANSPARENT); + SetWindowLongPtr(hwndScaling, GWL_EXSTYLE, style & ~WS_EX_TRANSPARENT); } _StopCapture(cursorPos); } else { if (!(style & WS_EX_TRANSPARENT)) { - SetWindowLongPtr(_hwndScaling, GWL_EXSTYLE, style | WS_EX_TRANSPARENT); + SetWindowLongPtr(hwndScaling, GWL_EXSTYLE, style | WS_EX_TRANSPARENT); } } } @@ -310,13 +371,13 @@ void CursorManager::_UpdateCursorClip() noexcept { // ///////////////////////////////////////////////////////// - HWND hwndCur = WindowFromPoint(_hwndScaling, _scalingWndRect, cursorPos, false); + HWND hwndCur = WindowFromPoint(hwndScaling, scalingRect, cursorPos, false); - if (hwndCur == _hwndScaling) { + if (hwndCur == hwndScaling) { // 主窗口未被遮挡 - POINT newCursorPos = _ScalingToSrc(cursorPos); + POINT newCursorPos = ScalingToSrc(cursorPos); - if (!PtInRect(&_srcRect, newCursorPos)) { + if (!PtInRect(&srcRect, newCursorPos)) { // 跳过黑边 if (false) { // 从内部移到外部 @@ -346,20 +407,20 @@ void CursorManager::_UpdateCursorClip() noexcept { // 从外部移到内部 POINT clampedPos = { - std::clamp(cursorPos.x, _destRect.left, _destRect.right - 1), - std::clamp(cursorPos.y, _destRect.top, _destRect.bottom - 1) + std::clamp(cursorPos.x, destRect.left, destRect.right - 1), + std::clamp(cursorPos.y, destRect.top, destRect.bottom - 1) }; - if (WindowFromPoint(_hwndScaling, _scalingWndRect, clampedPos, false) == _hwndScaling) { + if (WindowFromPoint(hwndScaling, scalingRect, clampedPos, false) == hwndScaling) { if (!(style & WS_EX_TRANSPARENT)) { - SetWindowLongPtr(_hwndScaling, GWL_EXSTYLE, style | WS_EX_TRANSPARENT); + SetWindowLongPtr(hwndScaling, GWL_EXSTYLE, style | WS_EX_TRANSPARENT); } _StartCapture(cursorPos); } else { // 要跳跃的位置被遮挡 if (style | WS_EX_TRANSPARENT) { - SetWindowLongPtr(_hwndScaling, GWL_EXSTYLE, style & ~WS_EX_TRANSPARENT); + SetWindowLongPtr(hwndScaling, GWL_EXSTYLE, style & ~WS_EX_TRANSPARENT); } } } @@ -368,26 +429,26 @@ void CursorManager::_UpdateCursorClip() noexcept { if (startCapture) { // 判断源窗口是否被遮挡 - hwndCur = WindowFromPoint(_hwndScaling, _scalingWndRect, newCursorPos, true); - startCapture = hwndCur == _hwndSrc || ((IsChild(_hwndSrc, hwndCur) && (GetWindowStyle(hwndCur) & WS_CHILD))); + hwndCur = WindowFromPoint(hwndScaling, scalingRect, newCursorPos, true); + startCapture = hwndCur == hwndSrc || ((IsChild(hwndSrc, hwndCur) && (GetWindowStyle(hwndCur) & WS_CHILD))); } if (startCapture) { if (!(style & WS_EX_TRANSPARENT)) { - SetWindowLongPtr(_hwndScaling, GWL_EXSTYLE, style | WS_EX_TRANSPARENT); + SetWindowLongPtr(hwndScaling, GWL_EXSTYLE, style | WS_EX_TRANSPARENT); } _StartCapture(cursorPos); } else { if (style | WS_EX_TRANSPARENT) { - SetWindowLongPtr(_hwndScaling, GWL_EXSTYLE, style & ~WS_EX_TRANSPARENT); + SetWindowLongPtr(hwndScaling, GWL_EXSTYLE, style & ~WS_EX_TRANSPARENT); } } } } } - if (_isDebugMode) { + if (options.IsDebugMode()) { return; } @@ -399,32 +460,32 @@ void CursorManager::_UpdateCursorClip() noexcept { // 处理屏幕之间存在间隙的情况。解决办法是 _StopCapture 只在目标位置存在屏幕时才取消捕获, // 当光标试图移动到间隙中时将被挡住。如果光标的速度足以跨越间隙,则它依然可以在屏幕间移动。 ::GetCursorPos(&cursorPos); - POINT hostPos = false ? cursorPos : _SrcToScaling(cursorPos, true); + POINT hostPos = false ? cursorPos : SrcToScaling(cursorPos, true); RECT clips{ LONG_MIN, LONG_MIN, LONG_MAX, LONG_MAX }; // left - RECT rect{ LONG_MIN, hostPos.y, _scalingWndRect.left, hostPos.y + 1 }; + RECT rect{ LONG_MIN, hostPos.y, scalingRect.left, hostPos.y + 1 }; if (!MonitorFromRect(&rect, MONITOR_DEFAULTTONULL)) { - clips.left = false ? _destRect.left : _srcRect.left; + clips.left = false ? destRect.left : srcRect.left; } // top - rect = { hostPos.x, LONG_MIN, hostPos.x + 1,_scalingWndRect.top }; + rect = { hostPos.x, LONG_MIN, hostPos.x + 1,scalingRect.top }; if (!MonitorFromRect(&rect, MONITOR_DEFAULTTONULL)) { - clips.top = false ? _destRect.top : _srcRect.top; + clips.top = false ? destRect.top : srcRect.top; } // right - rect = { _scalingWndRect.right, hostPos.y, LONG_MAX, hostPos.y + 1 }; + rect = { scalingRect.right, hostPos.y, LONG_MAX, hostPos.y + 1 }; if (!MonitorFromRect(&rect, MONITOR_DEFAULTTONULL)) { - clips.right = false ? _destRect.right : _srcRect.right; + clips.right = false ? destRect.right : srcRect.right; } // bottom - rect = { hostPos.x, _scalingWndRect.bottom, hostPos.x + 1, LONG_MAX }; + rect = { hostPos.x, scalingRect.bottom, hostPos.x + 1, LONG_MAX }; if (!MonitorFromRect(&rect, MONITOR_DEFAULTTONULL)) { - clips.bottom = false ? _destRect.bottom : _srcRect.bottom; + clips.bottom = false ? destRect.bottom : srcRect.bottom; } if (clips != _curClips) { @@ -438,6 +499,10 @@ void CursorManager::_StartCapture(POINT cursorPos) noexcept { return; } + const Renderer& renderer = ScalingWindow::Get().Renderer(); + const RECT& srcRect = renderer.SrcRect(); + const RECT& destRect = renderer.DestRect(); + // 在以下情况下进入捕获状态: // 1. 当前未捕获 // 2. 光标进入全屏区域 @@ -451,20 +516,20 @@ void CursorManager::_StartCapture(POINT cursorPos) noexcept { // 全局隐藏光标 _ShowSystemCursor(false); - SIZE srcFrameSize = Win32Utils::GetSizeOfRect(_srcRect); - SIZE outputSize = Win32Utils::GetSizeOfRect(_destRect); + SIZE srcFrameSize = Win32Utils::GetSizeOfRect(srcRect); + SIZE outputSize = Win32Utils::GetSizeOfRect(destRect); - if (_isAdjustCursorSpeed) { + if (ScalingWindow::Get().Options().IsAdjustCursorSpeed()) { _AdjustCursorSpeed(); } // 移动光标位置 // 跳过黑边 - cursorPos.x = std::clamp(cursorPos.x, _destRect.left, _destRect.right - 1); - cursorPos.y = std::clamp(cursorPos.y, _destRect.top, _destRect.bottom - 1); + cursorPos.x = std::clamp(cursorPos.x, destRect.left, destRect.right - 1); + cursorPos.y = std::clamp(cursorPos.y, destRect.top, destRect.bottom - 1); - POINT newCursorPos = _ScalingToSrc(cursorPos); + POINT newCursorPos = ScalingToSrc(cursorPos); SetCursorPos(newCursorPos.x, newCursorPos.y); _isUnderCapture = true; @@ -491,12 +556,12 @@ void CursorManager::_StopCapture(POINT cursorPos, bool onDestroy) noexcept { // // 在有黑边的情况下自动将光标调整到全屏窗口外 - POINT newCursorPos = _SrcToScaling(cursorPos, true); + POINT newCursorPos = SrcToScaling(cursorPos, true); if (onDestroy || MonitorFromPoint(newCursorPos, MONITOR_DEFAULTTONULL)) { SetCursorPos(newCursorPos.x, newCursorPos.y); - if (_isAdjustCursorSpeed) { + if (ScalingWindow::Get().Options().IsAdjustCursorSpeed()) { SystemParametersInfo(SPI_SETMOUSESPEED, 0, (PVOID)(intptr_t)_originCursorSpeed, 0); } @@ -504,69 +569,12 @@ void CursorManager::_StopCapture(POINT cursorPos, bool onDestroy) noexcept { _isUnderCapture = false; } else { // 目标位置不存在屏幕,则将光标限制在源窗口内 + const RECT& srcRect = ScalingWindow::Get().Renderer().SrcRect(); SetCursorPos( - std::clamp(cursorPos.x, _srcRect.left, _srcRect.right - 1), - std::clamp(cursorPos.y, _srcRect.top, _srcRect.bottom - 1) + std::clamp(cursorPos.x, srcRect.left, srcRect.right - 1), + std::clamp(cursorPos.y, srcRect.top, srcRect.bottom - 1) ); } } -// 将源窗口的光标位置映射到缩放后的光标位置 -// 当光标位于源窗口之外,与源窗口的距离不会缩放 -POINT CursorManager::_SrcToScaling(POINT pt, bool screenCoord) noexcept { - POINT result; - - if (pt.x >= _srcRect.right) { - result.x = _scalingWndRect.right + pt.x - _srcRect.right; - } else if (pt.x < _srcRect.left) { - result.x = _scalingWndRect.left + pt.x - _srcRect.left; - } else { - double pos = double(pt.x - _srcRect.left) / (_srcRect.right - _srcRect.left - 1); - result.x = std::lround(pos * (_destRect.right - _destRect.left - 1)) + _destRect.left; - } - - if (pt.y >= _srcRect.bottom) { - result.y = _scalingWndRect.bottom + pt.y - _srcRect.bottom; - } else if (pt.y < _srcRect.top) { - result.y = _scalingWndRect.top + pt.y - _srcRect.top; - } else { - double pos = double(pt.y - _srcRect.top) / (_srcRect.bottom - _srcRect.top - 1); - result.y = std::lround(pos * (_destRect.bottom - _destRect.top - 1)) + _destRect.top; - } - - if (!screenCoord) { - result.x -= _scalingWndRect.left; - result.y -= _scalingWndRect.top; - } - - return result; -} - -POINT CursorManager::_ScalingToSrc(POINT pt) noexcept { - const SIZE srcSize = Win32Utils::GetSizeOfRect(_srcRect); - const SIZE destSize = Win32Utils::GetSizeOfRect(_destRect); - - POINT result = { _srcRect.left, _srcRect.top }; - - if (pt.x >= _destRect.right) { - result.x += srcSize.cx + pt.x - _destRect.right; - } else if (pt.x < _destRect.left) { - result.x += pt.x - _destRect.left; - } else { - double pos = double(pt.x - _destRect.left) / (destSize.cx - 1); - result.x += std::lround(pos * (srcSize.cx - 1)); - } - - if (pt.y >= _destRect.bottom) { - result.y += srcSize.cx + pt.y - _destRect.bottom; - } else if (pt.y < _destRect.top) { - result.y += pt.y - _destRect.top; - } else { - double pos = double(pt.y - _destRect.top) / (destSize.cy - 1); - result.y += std::lround(pos * (srcSize.cy - 1)); - } - - return result; -} - } diff --git a/src/Magpie.Core/CursorManager.h b/src/Magpie.Core/CursorManager.h index b3a345b3b..ad94a04c9 100644 --- a/src/Magpie.Core/CursorManager.h +++ b/src/Magpie.Core/CursorManager.h @@ -3,8 +3,6 @@ namespace Magpie::Core { -struct ScalingOptions; - class CursorManager { public: CursorManager() = default; @@ -13,14 +11,7 @@ class CursorManager { ~CursorManager() noexcept; - bool Initialize( - HWND hwndSrc, - HWND hwndScaling, - const RECT& srcRect, - const RECT& scalingWndRect, - const RECT& destRect, - const ScalingOptions& options - ) noexcept; + bool Initialize() noexcept; std::pair Update() noexcept; @@ -50,25 +41,12 @@ class CursorManager { void _StopCapture(POINT cursorPos, bool onDestroy = false) noexcept; - POINT _SrcToScaling(POINT pt, bool screenCoord) noexcept; - POINT _ScalingToSrc(POINT pt) noexcept; - - HWND _hwndSrc = NULL; - HWND _hwndScaling = NULL; - RECT _srcRect{}; - RECT _scalingWndRect{}; - RECT _destRect{}; - winrt::event> _cursorVisibilityChangedEvent; RECT _curClips{}; int _originCursorSpeed = 0; bool _isUnderCapture = false; - bool _isAdjustCursorSpeed = false; - bool _isDebugMode = false; - bool _is3DGameMode = false; - bool _isDrawCursor = false; }; } diff --git a/src/Magpie.Core/DeviceResources.cpp b/src/Magpie.Core/DeviceResources.cpp index 4d9753914..6dda993ad 100644 --- a/src/Magpie.Core/DeviceResources.cpp +++ b/src/Magpie.Core/DeviceResources.cpp @@ -4,10 +4,11 @@ #include "Logger.h" #include "StrUtils.h" #include "DirectXHelper.h" +#include "ScalingWindow.h" namespace Magpie::Core { -bool DeviceResources::Initialize(const ScalingOptions& options) noexcept { +bool DeviceResources::Initialize() noexcept { #ifdef _DEBUG UINT flag = DXGI_CREATE_FACTORY_DEBUG; #else @@ -30,7 +31,7 @@ bool DeviceResources::Initialize(const ScalingOptions& options) noexcept { _isSupportTearing = supportTearing; Logger::Get().Info(fmt::format("可变刷新率支持:{}", supportTearing ? "是" : "否")); - if (!_ObtainAdapterAndDevice(options.graphicsCard)) { + if (!_ObtainAdapterAndDevice(ScalingWindow::Get().Options().graphicsCard)) { Logger::Get().Error("找不到可用的图形适配器"); return false; } diff --git a/src/Magpie.Core/DeviceResources.h b/src/Magpie.Core/DeviceResources.h index 8ee8d9817..01b3953f0 100644 --- a/src/Magpie.Core/DeviceResources.h +++ b/src/Magpie.Core/DeviceResources.h @@ -3,15 +3,13 @@ namespace Magpie::Core { -struct ScalingOptions; - class DeviceResources { public: DeviceResources() = default; DeviceResources(const DeviceResources&) = delete; DeviceResources(DeviceResources&&) = default; - bool Initialize(const ScalingOptions& options) noexcept; + bool Initialize() noexcept; IDXGIFactory7* GetDXGIFactory() const noexcept { return _dxgiFactory.get(); } ID3D11Device5* GetD3DDevice() const noexcept { return _d3dDevice.get(); } diff --git a/src/Magpie.Core/EffectCompiler.h b/src/Magpie.Core/EffectCompiler.h index 36ff28754..88961c8ba 100644 --- a/src/Magpie.Core/EffectCompiler.h +++ b/src/Magpie.Core/EffectCompiler.h @@ -4,8 +4,6 @@ namespace Magpie::Core { -struct EffectDesc; - struct EffectCompilerFlags { static constexpr const uint32_t NoCache = 1; static constexpr const uint32_t SaveSources = 1 << 1; @@ -17,7 +15,7 @@ struct EffectCompilerFlags { struct API_DECLSPEC EffectCompiler { // 调用者需填入 desc 中的 name 和 flags static uint32_t Compile( - EffectDesc& desc, + struct EffectDesc& desc, uint32_t flags, // EffectCompilerFlags const phmap::flat_hash_map* inlineParams = nullptr ) noexcept; diff --git a/src/Magpie.Core/EffectDrawer.cpp b/src/Magpie.Core/EffectDrawer.cpp index 5ed27be27..34acbeb86 100644 --- a/src/Magpie.Core/EffectDrawer.cpp +++ b/src/Magpie.Core/EffectDrawer.cpp @@ -8,6 +8,7 @@ #include "TextureLoader.h" #include "EffectHelper.h" #include "DirectXHelper.h" +#include "ScalingWindow.h" #pragma push_macro("_UNICODE") // Conan 的 muparser 不含 UNICODE 支持 @@ -84,7 +85,6 @@ bool EffectDrawer::Initialize( const EffectDesc& desc, const EffectOption& option, DeviceResources& deviceResources, - SIZE scalingWndSize, ID3D11Texture2D** inOutTexture ) noexcept { _d3dDC = deviceResources.GetD3DDC(); @@ -100,6 +100,7 @@ bool EffectDrawer::Initialize( exprParser.DefineConst("INPUT_WIDTH", inputSize.cx); exprParser.DefineConst("INPUT_HEIGHT", inputSize.cy); + const SIZE scalingWndSize = Win32Utils::GetSizeOfRect(ScalingWindow::Get().WndRect()); const SIZE outputSize = CalcOutputSize(desc.GetOutputSizeExpr(), option, scalingWndSize, inputSize, exprParser); if (outputSize.cx <= 0 || outputSize.cy <= 0) { Logger::Get().Error("非法的输出尺寸"); diff --git a/src/Magpie.Core/EffectDrawer.h b/src/Magpie.Core/EffectDrawer.h index b010e8682..45479c13b 100644 --- a/src/Magpie.Core/EffectDrawer.h +++ b/src/Magpie.Core/EffectDrawer.h @@ -18,7 +18,6 @@ class EffectDrawer { const EffectDesc& desc, const EffectOption& option, DeviceResources& deviceResources, - SIZE scalingWndSize, ID3D11Texture2D** inOutTexture ) noexcept; diff --git a/src/Magpie.Core/FrameSourceBase.cpp b/src/Magpie.Core/FrameSourceBase.cpp index 55e331814..0bffac3dd 100644 --- a/src/Magpie.Core/FrameSourceBase.cpp +++ b/src/Magpie.Core/FrameSourceBase.cpp @@ -9,17 +9,20 @@ #include "DirectXHelper.h" #include "DeviceResources.h" #include "shaders/DuplicateFrameCS.h" +#include "ScalingWindow.h" namespace Magpie::Core { FrameSourceBase::~FrameSourceBase() noexcept { + const HWND hwndSrc = ScalingWindow::Get().HwndSrc(); + // 还原窗口圆角 if (_roundCornerDisabled) { _roundCornerDisabled = false; INT attr = DWMWCP_DEFAULT; HRESULT hr = DwmSetWindowAttribute( - _hwndSrc, DWMWA_WINDOW_CORNER_PREFERENCE, &attr, sizeof(attr)); + hwndSrc, DWMWA_WINDOW_CORNER_PREFERENCE, &attr, sizeof(attr)); if (FAILED(hr)) { Logger::Get().ComError("取消禁用窗口圆角失败", hr); } else { @@ -31,11 +34,11 @@ FrameSourceBase::~FrameSourceBase() noexcept { if (_windowResizingDisabled) { // 缩放 Magpie 主窗口时会在 SetWindowLongPtr 中卡住,似乎是 Win11 的 bug // 将在 MagService::_MagRuntime_IsRunningChanged 还原主窗口样式 - if (Win32Utils::GetWndClassName(_hwndSrc) != CommonSharedConstants::MAIN_WINDOW_CLASS_NAME) { - LONG_PTR style = GetWindowLongPtr(_hwndSrc, GWL_STYLE); + if (Win32Utils::GetWndClassName(hwndSrc) != CommonSharedConstants::MAIN_WINDOW_CLASS_NAME) { + LONG_PTR style = GetWindowLongPtr(hwndSrc, GWL_STYLE); if (!(style & WS_THICKFRAME)) { - if (SetWindowLongPtr(_hwndSrc, GWL_STYLE, style | WS_THICKFRAME)) { - if (!SetWindowPos(_hwndSrc, 0, 0, 0, 0, 0, + if (SetWindowLongPtr(hwndSrc, GWL_STYLE, style | WS_THICKFRAME)) { + if (!SetWindowPos(hwndSrc, 0, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED)) { Logger::Get().Win32Error("SetWindowPos 失败"); } @@ -49,22 +52,18 @@ FrameSourceBase::~FrameSourceBase() noexcept { } } -bool FrameSourceBase::Initialize( - HWND hwndSrc, - HWND hwndScaling, - const ScalingOptions& options, - DeviceResources& deviceResources -) noexcept { - _hwndSrc = hwndSrc; +bool FrameSourceBase::Initialize(DeviceResources& deviceResources) noexcept { _deviceResources = &deviceResources; + HWND hwndSrc = ScalingWindow::Get().HwndSrc(); + // 禁用窗口大小调整 - if (options.IsDisableWindowResizing()) { + if (ScalingWindow::Get().Options().IsDisableWindowResizing()) { LONG_PTR style = GetWindowLongPtr(hwndSrc, GWL_STYLE); if (style & WS_THICKFRAME) { if (SetWindowLongPtr(hwndSrc, GWL_STYLE, style ^ WS_THICKFRAME)) { // 不重绘边框,以防某些窗口状态不正确 - // if (!SetWindowPos(hwndSrc, 0, 0, 0, 0, 0, + // if (!SetWindowPos(HwndSrc, 0, 0, 0, 0, 0, // SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED)) { // SPDLOG_LOGGER_ERROR(logger, MakeWin32ErrorMsg("SetWindowPos 失败")); // } @@ -92,7 +91,7 @@ bool FrameSourceBase::Initialize( } } - if (!_Initialize(hwndScaling, options)) { + if (!_Initialize()) { Logger::Get().Error("_Initialize 失败"); return false; } @@ -251,19 +250,22 @@ static HWND FindClientWindowOfUWP(HWND hwndSrc, const wchar_t* clientWndClassNam return param.childWindows[maxIdx]; } -bool FrameSourceBase::_CalcSrcRect(const Cropping& cropping, bool isCaptureTitleBar) noexcept { - if (isCaptureTitleBar && _CanCaptureTitleBar()) { - HRESULT hr = DwmGetWindowAttribute(_hwndSrc, +bool FrameSourceBase::_CalcSrcRect() noexcept { + const ScalingOptions& options = ScalingWindow::Get().Options(); + const HWND hwndSrc = ScalingWindow::Get().HwndSrc(); + + if (options.IsCaptureTitleBar() && _CanCaptureTitleBar()) { + HRESULT hr = DwmGetWindowAttribute(hwndSrc, DWMWA_EXTENDED_FRAME_BOUNDS, &_srcRect, sizeof(_srcRect)); if (FAILED(hr)) { Logger::Get().ComError("DwmGetWindowAttribute 失败", hr); } } else { - std::wstring className = Win32Utils::GetWndClassName(_hwndSrc); + std::wstring className = Win32Utils::GetWndClassName(hwndSrc); if (className == L"ApplicationFrameWindow" || className == L"Windows.UI.Core.CoreWindow") { // "Modern App" // 客户区窗口类名为 ApplicationFrameInputSinkWindow - HWND hwndClient = FindClientWindowOfUWP(_hwndSrc, L"ApplicationFrameInputSinkWindow"); + HWND hwndClient = FindClientWindowOfUWP(hwndSrc, L"ApplicationFrameInputSinkWindow"); if (hwndClient) { if (!Win32Utils::GetClientScreenRect(hwndClient, _srcRect)) { Logger::Get().Win32Error("GetClientScreenRect 失败"); @@ -273,17 +275,17 @@ bool FrameSourceBase::_CalcSrcRect(const Cropping& cropping, bool isCaptureTitle } if (_srcRect == RECT{}) { - if (!Win32Utils::GetClientScreenRect(_hwndSrc, _srcRect)) { + if (!Win32Utils::GetClientScreenRect(hwndSrc, _srcRect)) { Logger::Get().Win32Error("GetClientScreenRect 失败"); return false; } } _srcRect = { - std::lround(_srcRect.left + cropping.Left), - std::lround(_srcRect.top + cropping.Top), - std::lround(_srcRect.right - cropping.Right), - std::lround(_srcRect.bottom - cropping.Bottom) + std::lround(_srcRect.left + options.cropping.Left), + std::lround(_srcRect.top + options.cropping.Top), + std::lround(_srcRect.right - options.cropping.Right), + std::lround(_srcRect.bottom - options.cropping.Bottom) }; if (_srcRect.right - _srcRect.left <= 0 || _srcRect.bottom - _srcRect.top <= 0) { diff --git a/src/Magpie.Core/FrameSourceBase.h b/src/Magpie.Core/FrameSourceBase.h index bba0bc8f5..a0b34592d 100644 --- a/src/Magpie.Core/FrameSourceBase.h +++ b/src/Magpie.Core/FrameSourceBase.h @@ -2,8 +2,6 @@ namespace Magpie::Core { -struct ScalingOptions; -struct Cropping; class DeviceResources; class FrameSourceBase { @@ -16,12 +14,7 @@ class FrameSourceBase { FrameSourceBase(const FrameSourceBase&) = delete; FrameSourceBase(FrameSourceBase&&) = delete; - bool Initialize( - HWND hwndSrc, - HWND hwndScaling, - const ScalingOptions& options, - DeviceResources& deviceResources - ) noexcept; + bool Initialize(DeviceResources& deviceResources) noexcept; enum class UpdateState { NewFrame, @@ -47,7 +40,7 @@ class FrameSourceBase { virtual void OnCursorVisibilityChanged(bool /*isVisible*/) noexcept {}; protected: - virtual bool _Initialize(HWND hwndScaling, const ScalingOptions& options) noexcept = 0; + virtual bool _Initialize() noexcept = 0; virtual UpdateState _Update() noexcept = 0; @@ -55,7 +48,7 @@ class FrameSourceBase { virtual bool _CanCaptureTitleBar() noexcept = 0; - bool _CalcSrcRect(const Cropping& cropping, bool isCaptureTitleBar) noexcept; + bool _CalcSrcRect() noexcept; // 获取坐标系 1 到坐标系 2 的映射关系 // 坐标系 1:屏幕坐标系,即虚拟化后的坐标系。原点为屏幕左上角 @@ -68,7 +61,6 @@ class FrameSourceBase { static bool _CenterWindowIfNecessary(HWND hWnd, const RECT& rcWork) noexcept; - HWND _hwndSrc = NULL; RECT _srcRect{}; DeviceResources* _deviceResources = nullptr; diff --git a/src/Magpie.Core/GDIFrameSource.cpp b/src/Magpie.Core/GDIFrameSource.cpp index 6b6a288cb..6cf1532d7 100644 --- a/src/Magpie.Core/GDIFrameSource.cpp +++ b/src/Magpie.Core/GDIFrameSource.cpp @@ -4,16 +4,19 @@ #include "ScalingOptions.h" #include "DirectXHelper.h" #include "DeviceResources.h" +#include "ScalingWindow.h" namespace Magpie::Core { -bool GDIFrameSource::_Initialize(HWND /*hwndScaling*/, const ScalingOptions& options) noexcept { - if (!_CalcSrcRect(options.cropping, options.IsCaptureTitleBar())) { +bool GDIFrameSource::_Initialize() noexcept { + if (!_CalcSrcRect()) { return false; } + const HWND hwndSrc = ScalingWindow::Get().HwndSrc(); + double a, bx, by; - if (_GetMapToOriginDPI(_hwndSrc, a, bx, by)) { + if (_GetMapToOriginDPI(hwndSrc, a, bx, by)) { Logger::Get().Info(fmt::format("源窗口 DPI 缩放为 {}", 1 / a)); _frameRect = { @@ -27,7 +30,7 @@ bool GDIFrameSource::_Initialize(HWND /*hwndScaling*/, const ScalingOptions& opt // _GetMapToOriginDPI 失败则假设 DPI 缩放为 1 RECT srcWindowRect; - if (!GetWindowRect(_hwndSrc, &srcWindowRect)) { + if (!GetWindowRect(hwndSrc, &srcWindowRect)) { Logger::Get().Win32Error("GetWindowRect 失败"); return false; } @@ -80,7 +83,8 @@ FrameSourceBase::UpdateState GDIFrameSource::_Update() noexcept { return UpdateState::Error; } - HDC hdcSrc = GetDCEx(_hwndSrc, NULL, DCX_LOCKWINDOWUPDATE | DCX_WINDOW); + const HWND hwndSrc = ScalingWindow::Get().HwndSrc(); + HDC hdcSrc = GetDCEx(hwndSrc, NULL, DCX_LOCKWINDOWUPDATE | DCX_WINDOW); if (!hdcSrc) { Logger::Get().Win32Error("GetDC 失败"); _dxgiSurface->ReleaseDC(nullptr); @@ -93,7 +97,7 @@ FrameSourceBase::UpdateState GDIFrameSource::_Update() noexcept { Logger::Get().Win32Error("BitBlt 失败"); } - ReleaseDC(_hwndSrc, hdcSrc); + ReleaseDC(hwndSrc, hdcSrc); _dxgiSurface->ReleaseDC(nullptr); return UpdateState::NewFrame; diff --git a/src/Magpie.Core/GDIFrameSource.h b/src/Magpie.Core/GDIFrameSource.h index 81389689f..d3ba09353 100644 --- a/src/Magpie.Core/GDIFrameSource.h +++ b/src/Magpie.Core/GDIFrameSource.h @@ -16,7 +16,7 @@ class GDIFrameSource : public FrameSourceBase { } protected: - bool _Initialize(HWND hwndScaling, const ScalingOptions& options) noexcept override; + bool _Initialize() noexcept override; UpdateState _Update() noexcept override; diff --git a/src/Magpie.Core/GraphicsCaptureFrameSource.cpp b/src/Magpie.Core/GraphicsCaptureFrameSource.cpp index 65618e6f0..4359d43ed 100644 --- a/src/Magpie.Core/GraphicsCaptureFrameSource.cpp +++ b/src/Magpie.Core/GraphicsCaptureFrameSource.cpp @@ -8,6 +8,7 @@ #include "Win32Utils.h" #include "DirectXHelper.h" #include "ScalingOptions.h" +#include "ScalingWindow.h" namespace winrt { using namespace Windows::Graphics; @@ -18,7 +19,7 @@ using namespace Windows::Graphics::DirectX::Direct3D11; namespace Magpie::Core { -bool GraphicsCaptureFrameSource::_Initialize(HWND hwndScaling, const ScalingOptions& options) noexcept { +bool GraphicsCaptureFrameSource::_Initialize() noexcept { ID3D11Device5* d3dDevice = _deviceResources->GetD3DDevice(); HRESULT hr; @@ -53,7 +54,7 @@ bool GraphicsCaptureFrameSource::_Initialize(HWND hwndScaling, const ScalingOpti return false; } - if (!_CalcSrcRect(options.cropping, options.IsCaptureTitleBar())) { + if (!_CalcSrcRect()) { Logger::Get().Error("_CalcSrcRect 失败"); return false; } @@ -61,7 +62,7 @@ bool GraphicsCaptureFrameSource::_Initialize(HWND hwndScaling, const ScalingOpti if (!_CaptureWindow(interop.get())) { Logger::Get().Info("窗口捕获失败,回落到屏幕捕获"); - if (_CaptureMonitor(interop.get(), options, hwndScaling)) { + if (_CaptureMonitor(interop.get())) { _isScreenCapture = true; } else { Logger::Get().Error("屏幕捕获失败"); @@ -130,9 +131,11 @@ void GraphicsCaptureFrameSource::OnCursorVisibilityChanged(bool isVisible) noexc } bool GraphicsCaptureFrameSource::_CaptureWindow(IGraphicsCaptureItemInterop* interop) noexcept { + const HWND hwndSrc = ScalingWindow::Get().HwndSrc(); + // 包含边框的窗口尺寸 RECT srcFrameBounds{}; - HRESULT hr = DwmGetWindowAttribute(_hwndSrc, + HRESULT hr = DwmGetWindowAttribute(hwndSrc, DWMWA_EXTENDED_FRAME_BOUNDS, &srcFrameBounds, sizeof(srcFrameBounds)); if (FAILED(hr)) { Logger::Get().ComError("DwmGetWindowAttribute 失败", hr); @@ -150,20 +153,20 @@ bool GraphicsCaptureFrameSource::_CaptureWindow(IGraphicsCaptureItemInterop* int 1 }; - if (_TryCreateGraphicsCaptureItem(interop, _hwndSrc)) { + if (_TryCreateGraphicsCaptureItem(interop)) { return true; } // 尝试设置源窗口样式,因为 WGC 只能捕获位于 Alt+Tab 列表中的窗口 - LONG_PTR srcExStyle = GetWindowLongPtr(_hwndSrc, GWL_EXSTYLE); + LONG_PTR srcExStyle = GetWindowLongPtr(hwndSrc, GWL_EXSTYLE); if ((srcExStyle & WS_EX_APPWINDOW) == 0) { // 添加 WS_EX_APPWINDOW 样式,确保源窗口可被 Alt+Tab 选中 - if (SetWindowLongPtr(_hwndSrc, GWL_EXSTYLE, srcExStyle | WS_EX_APPWINDOW)) { + if (SetWindowLongPtr(hwndSrc, GWL_EXSTYLE, srcExStyle | WS_EX_APPWINDOW)) { Logger::Get().Info("已改变源窗口样式"); _originalSrcExStyle = srcExStyle; - if (_TryCreateGraphicsCaptureItem(interop, _hwndSrc)) { - _RemoveOwnerFromAltTabList(_hwndSrc); + if (_TryCreateGraphicsCaptureItem(interop)) { + _RemoveOwnerFromAltTabList(hwndSrc); return true; } } else { @@ -174,12 +177,12 @@ bool GraphicsCaptureFrameSource::_CaptureWindow(IGraphicsCaptureItemInterop* int // 如果窗口使用 ITaskbarList 隐藏了任务栏图标也不会出现在 Alt+Tab 列表。这种情况很罕见 _taskbarList = winrt::try_create_instance(CLSID_TaskbarList); if (_taskbarList && SUCCEEDED(_taskbarList->HrInit())) { - hr = _taskbarList->AddTab(_hwndSrc); + hr = _taskbarList->AddTab(hwndSrc); if (SUCCEEDED(hr)) { Logger::Get().Info("已添加任务栏图标"); - if (_TryCreateGraphicsCaptureItem(interop, _hwndSrc)) { - _RemoveOwnerFromAltTabList(_hwndSrc); + if (_TryCreateGraphicsCaptureItem(interop)) { + _RemoveOwnerFromAltTabList(hwndSrc); return true; } } else { @@ -193,27 +196,27 @@ bool GraphicsCaptureFrameSource::_CaptureWindow(IGraphicsCaptureItemInterop* int // 上面的尝试失败了则还原更改 if (_taskbarList) { - _taskbarList->DeleteTab(_hwndSrc); + _taskbarList->DeleteTab(hwndSrc); _taskbarList = nullptr; } if (_originalSrcExStyle) { // 首先还原所有者窗口的样式以压制任务栏的动画 if (_originalOwnerExStyle) { - SetWindowLongPtr(GetWindowOwner(_hwndSrc), GWL_EXSTYLE, _originalOwnerExStyle); + SetWindowLongPtr(GetWindowOwner(hwndSrc), GWL_EXSTYLE, _originalOwnerExStyle); _originalOwnerExStyle = 0; } - SetWindowLongPtr(_hwndSrc, GWL_EXSTYLE, _originalSrcExStyle); + SetWindowLongPtr(hwndSrc, GWL_EXSTYLE, _originalSrcExStyle); _originalSrcExStyle = 0; } return false; } -bool GraphicsCaptureFrameSource::_TryCreateGraphicsCaptureItem(IGraphicsCaptureItemInterop* interop, HWND hwndSrc) noexcept { +bool GraphicsCaptureFrameSource::_TryCreateGraphicsCaptureItem(IGraphicsCaptureItemInterop* interop) noexcept { try { HRESULT hr = interop->CreateForWindow( - hwndSrc, + ScalingWindow::Get().HwndSrc(), winrt::guid_of(), winrt::put_abi(_captureItem) ); @@ -266,11 +269,7 @@ void GraphicsCaptureFrameSource::_RemoveOwnerFromAltTabList(HWND hwndSrc) noexce _originalOwnerExStyle = ownerExStyle; } -bool GraphicsCaptureFrameSource::_CaptureMonitor( - IGraphicsCaptureItemInterop* interop, - const ScalingOptions& options, - HWND hwndScaling -) noexcept { +bool GraphicsCaptureFrameSource::_CaptureMonitor(IGraphicsCaptureItemInterop* interop) noexcept { // Win10 无法隐藏黄色边框,因此只在 Win11 中回落到屏幕捕获 if (!Win32Utils::GetOSVersion().IsWin11()) { Logger::Get().Error("无法使用屏幕捕获"); @@ -279,12 +278,13 @@ bool GraphicsCaptureFrameSource::_CaptureMonitor( // 使全屏窗口无法被捕获到 // WDA_EXCLUDEFROMCAPTURE 只在 Win10 20H1 及更新版本中可用 - if (!SetWindowDisplayAffinity(hwndScaling, WDA_EXCLUDEFROMCAPTURE)) { + if (!SetWindowDisplayAffinity(ScalingWindow::Get().Handle(), WDA_EXCLUDEFROMCAPTURE)) { Logger::Get().Win32Error("SetWindowDisplayAffinity 失败"); return false; } - HMONITOR hMonitor = MonitorFromWindow(_hwndSrc, MONITOR_DEFAULTTONEAREST); + const HWND hwndSrc = ScalingWindow::Get().HwndSrc(); + HMONITOR hMonitor = MonitorFromWindow(hwndSrc, MONITOR_DEFAULTTONEAREST); if (!hMonitor) { Logger::Get().Win32Error("MonitorFromWindow 失败"); return false; @@ -298,13 +298,13 @@ bool GraphicsCaptureFrameSource::_CaptureMonitor( } // 放在屏幕左上角而不是中间可以提高帧率,这里是为了和 DesktopDuplication 保持一致 - if (!_CenterWindowIfNecessary(_hwndSrc, mi.rcWork)) { + if (!_CenterWindowIfNecessary(hwndSrc, mi.rcWork)) { Logger::Get().Error("居中源窗口失败"); return false; } // 重新计算捕获位置 - if (!_CalcSrcRect(options.cropping, options.IsCaptureTitleBar())) { + if (!_CalcSrcRect()) { Logger::Get().Error("_CalcSrcRect 失败"); return false; } @@ -399,18 +399,20 @@ void GraphicsCaptureFrameSource::_StopCapture() noexcept { GraphicsCaptureFrameSource::~GraphicsCaptureFrameSource() { _StopCapture(); + const HWND hwndSrc = ScalingWindow::Get().HwndSrc(); + if (_taskbarList) { - _taskbarList->DeleteTab(_hwndSrc); + _taskbarList->DeleteTab(hwndSrc); } // 还原源窗口样式 if (_originalSrcExStyle) { // 首先还原所有者窗口的样式以压制任务栏的动画 if (_originalOwnerExStyle) { - SetWindowLongPtr(GetWindowOwner(_hwndSrc), GWL_EXSTYLE, _originalOwnerExStyle); + SetWindowLongPtr(GetWindowOwner(hwndSrc), GWL_EXSTYLE, _originalOwnerExStyle); } - SetWindowLongPtr(_hwndSrc, GWL_EXSTYLE, _originalSrcExStyle); + SetWindowLongPtr(hwndSrc, GWL_EXSTYLE, _originalSrcExStyle); } } diff --git a/src/Magpie.Core/GraphicsCaptureFrameSource.h b/src/Magpie.Core/GraphicsCaptureFrameSource.h index d24963be2..ceeafb23e 100644 --- a/src/Magpie.Core/GraphicsCaptureFrameSource.h +++ b/src/Magpie.Core/GraphicsCaptureFrameSource.h @@ -31,7 +31,7 @@ class GraphicsCaptureFrameSource : public FrameSourceBase { } private: - bool _Initialize(HWND hwndScaling, const ScalingOptions& options) noexcept override; + bool _Initialize() noexcept override; UpdateState _Update() noexcept override; @@ -41,9 +41,9 @@ class GraphicsCaptureFrameSource : public FrameSourceBase { bool _CaptureWindow(IGraphicsCaptureItemInterop* interop) noexcept; - bool _CaptureMonitor(IGraphicsCaptureItemInterop* interop, const ScalingOptions& options, HWND hwndScaling) noexcept; + bool _CaptureMonitor(IGraphicsCaptureItemInterop* interop) noexcept; - bool _TryCreateGraphicsCaptureItem(IGraphicsCaptureItemInterop* interop, HWND hwndSrc) noexcept; + bool _TryCreateGraphicsCaptureItem(IGraphicsCaptureItemInterop* interop) noexcept; void _RemoveOwnerFromAltTabList(HWND hwndSrc) noexcept; diff --git a/src/Magpie.Core/Renderer.cpp b/src/Magpie.Core/Renderer.cpp index dc8be14e9..5f1cfcabc 100644 --- a/src/Magpie.Core/Renderer.cpp +++ b/src/Magpie.Core/Renderer.cpp @@ -12,6 +12,7 @@ #include "GDIFrameSource.h" #include "DirectXHelper.h" #include +#include "ScalingWindow.h" namespace Magpie::Core { @@ -28,15 +29,10 @@ Renderer::~Renderer() noexcept { } } -bool Renderer::Initialize(HWND hwndSrc, HWND hwndScaling, const ScalingOptions& options) noexcept { - _hwndSrc = hwndSrc; - _hwndScaling = hwndScaling; +bool Renderer::Initialize() noexcept { + _backendThread = std::thread(std::bind(&Renderer::_BackendThreadProc, this)); - GetWindowRect(_hwndScaling, &_scalingWndRect); - - _backendThread = std::thread(std::bind(&Renderer::_BackendThreadProc, this, options)); - - if (!_frontendResources.Initialize(options)) { + if (!_frontendResources.Initialize()) { Logger::Get().Error("初始化前端资源失败"); return false; } @@ -75,18 +71,13 @@ bool Renderer::Initialize(HWND hwndSrc, HWND hwndScaling, const ScalingOptions& D3D11_TEXTURE2D_DESC desc; _frontendSharedTexture->GetDesc(&desc); - _destRect.left = (_scalingWndRect.left + _scalingWndRect.right - desc.Width) / 2; - _destRect.top = (_scalingWndRect.top + _scalingWndRect.bottom - desc.Height) / 2; + const RECT& scalingWndRect = ScalingWindow::Get().WndRect(); + _destRect.left = (scalingWndRect.left + scalingWndRect.right - desc.Width) / 2; + _destRect.top = (scalingWndRect.top + scalingWndRect.bottom - desc.Height) / 2; _destRect.right = _destRect.left + desc.Width; _destRect.bottom = _destRect.top + desc.Height; - RECT viewportRect{ - _destRect.left - _scalingWndRect.left, - _destRect.top - _scalingWndRect.top, - _destRect.right - _scalingWndRect.left, - _destRect.bottom - _scalingWndRect.top - }; - if (!_cursorDrawer.Initialize(_frontendResources, _backBuffer.get(), viewportRect, options)) { + if (!_cursorDrawer.Initialize(_frontendResources, _backBuffer.get())) { Logger::Get().ComError("初始化 CursorDrawer 失败", hr); return false; } @@ -119,8 +110,9 @@ void Renderer::OnCursorVisibilityChanged(bool isVisible) { bool Renderer::_CreateSwapChain() noexcept { DXGI_SWAP_CHAIN_DESC1 sd{}; - sd.Width = _scalingWndRect.right - _scalingWndRect.left; - sd.Height = _scalingWndRect.bottom - _scalingWndRect.top; + const RECT& scalingWndRect = ScalingWindow::Get().WndRect(); + sd.Width = scalingWndRect.right - scalingWndRect.left; + sd.Height = scalingWndRect.bottom - scalingWndRect.top; sd.Format = DXGI_FORMAT_R8G8B8A8_UNORM; sd.AlphaMode = DXGI_ALPHA_MODE_UNSPECIFIED; sd.SampleDesc.Count = 1; @@ -137,7 +129,7 @@ bool Renderer::_CreateSwapChain() noexcept { winrt::com_ptr dxgiSwapChain = nullptr; HRESULT hr = _frontendResources.GetDXGIFactory()->CreateSwapChainForHwnd( _frontendResources.GetD3DDevice(), - _hwndScaling, + ScalingWindow::Get().Handle(), &sd, nullptr, nullptr, @@ -163,7 +155,8 @@ bool Renderer::_CreateSwapChain() noexcept { return false; } - hr = _frontendResources.GetDXGIFactory()->MakeWindowAssociation(_hwndScaling, DXGI_MWA_NO_ALT_ENTER); + hr = _frontendResources.GetDXGIFactory()->MakeWindowAssociation( + ScalingWindow::Get().Handle(), DXGI_MWA_NO_ALT_ENTER); if (FAILED(hr)) { Logger::Get().ComError("MakeWindowAssociation 失败", hr); } @@ -204,7 +197,8 @@ void Renderer::Render(HCURSOR hCursor, POINT cursorPos) noexcept { ID3D11RenderTargetView* backBufferRtv = _frontendResources.GetRenderTargetView(_backBuffer.get()); // 输出画面是否充满缩放窗口 - const bool isFill = _destRect == _scalingWndRect; + const RECT& scalingWndRect = ScalingWindow::Get().WndRect(); + const bool isFill = _destRect == scalingWndRect; if (!isFill) { // 以黑色填充背景,因为我们指定了 DXGI_SWAP_EFFECT_FLIP_DISCARD,同时也是为了和 RTSS 兼容 @@ -224,8 +218,8 @@ void Renderer::Render(HCURSOR hCursor, POINT cursorPos) noexcept { d3dDC->CopySubresourceRegion( _backBuffer.get(), 0, - _destRect.left - _scalingWndRect.left, - _destRect.top-_scalingWndRect.top, + _destRect.left - scalingWndRect.left, + _destRect.top- scalingWndRect.top, 0, _frontendSharedTexture.get(), 0, @@ -245,8 +239,8 @@ void Renderer::Render(HCURSOR hCursor, POINT cursorPos) noexcept { d3dDC->DiscardView(backBufferRtv); } -bool Renderer::_InitFrameSource(const ScalingOptions& options) noexcept { - switch (options.captureMethod) { +bool Renderer::_InitFrameSource() noexcept { + switch (ScalingWindow::Get().Options().captureMethod) { case CaptureMethod::GraphicsCapture: _frameSource = std::make_unique(); break; @@ -266,7 +260,7 @@ bool Renderer::_InitFrameSource(const ScalingOptions& options) noexcept { Logger::Get().Info(StrUtils::Concat("当前捕获模式:", _frameSource->Name())); - if (!_frameSource->Initialize(_hwndSrc, _hwndScaling, options, _backendResources)) { + if (!_frameSource->Initialize(_backendResources)) { Logger::Get().Error("初始化 FrameSource 失败"); return false; } @@ -278,10 +272,7 @@ bool Renderer::_InitFrameSource(const ScalingOptions& options) noexcept { return true; } -static std::optional CompileEffect( - const ScalingOptions& scalingOptions, - const EffectOption& effectOption -) noexcept { +static std::optional CompileEffect(const EffectOption& effectOption) noexcept { EffectDesc result; result.name = StrUtils::UTF16ToUTF8(effectOption.name); @@ -294,6 +285,7 @@ static std::optional CompileEffect( } uint32_t compileFlag = 0; + const ScalingOptions& scalingOptions = ScalingWindow::Get().Options(); if (scalingOptions.IsDisableEffectCache()) { compileFlag |= EffectCompilerFlags::NoCache; } @@ -320,18 +312,19 @@ static std::optional CompileEffect( } } -ID3D11Texture2D* Renderer::_BuildEffects(const ScalingOptions& options) noexcept { - assert(!options.effects.empty()); +ID3D11Texture2D* Renderer::_BuildEffects() noexcept { + const std::vector& effects = ScalingWindow::Get().Options().effects; + assert(!effects.empty()); - const uint32_t effectCount = (uint32_t)options.effects.size(); + const uint32_t effectCount = (uint32_t)effects.size(); // 并行编译所有效果 - std::vector effectDescs(options.effects.size()); + std::vector effectDescs(effects.size()); std::atomic allSuccess = true; int duration = Utils::Measure([&]() { Win32Utils::RunParallel([&](uint32_t id) { - std::optional desc = CompileEffect(options, options.effects[id]); + std::optional desc = CompileEffect(effects[id]); if (desc) { effectDescs[id] = std::move(*desc); } else { @@ -348,52 +341,51 @@ ID3D11Texture2D* Renderer::_BuildEffects(const ScalingOptions& options) noexcept Logger::Get().Info(fmt::format("编译着色器总计用时 {} 毫秒", duration / 1000.0f)); } - const SIZE scalingWndSize = Win32Utils::GetSizeOfRect(_scalingWndRect); - - _effectDrawers.resize(options.effects.size()); + _effectDrawers.resize(effects.size()); ID3D11Texture2D* inOutTexture = _frameSource->GetOutput(); for (uint32_t i = 0; i < effectCount; ++i) { if (!_effectDrawers[i].Initialize( effectDescs[i], - options.effects[i], + effects[i], _backendResources, - scalingWndSize, &inOutTexture )) { - Logger::Get().Error(fmt::format("初始化效果#{} ({}) 失败", i, StrUtils::UTF16ToUTF8(options.effects[i].name))); + Logger::Get().Error(fmt::format("初始化效果#{} ({}) 失败", i, StrUtils::UTF16ToUTF8(effects[i].name))); return nullptr; } } // 输出尺寸大于缩放窗口尺寸则需要降采样 - D3D11_TEXTURE2D_DESC desc; - inOutTexture->GetDesc(&desc); - if ((LONG)desc.Width > scalingWndSize.cx || (LONG)desc.Height > scalingWndSize.cy) { - EffectOption bicubicOption; - bicubicOption.name = L"Bicubic"; - bicubicOption.parameters[L"paramB"] = 0.0f; - bicubicOption.parameters[L"paramC"] = 0.5f; - bicubicOption.scalingType = ScalingType::Fit; - // 参数不会改变,因此可以内联 - bicubicOption.flags = EffectOptionFlags::InlineParams; - - std::optional bicubicDesc = CompileEffect(options, bicubicOption); - if (!bicubicDesc) { - Logger::Get().Error("编译降采样效果失败"); - return nullptr; - } + { + D3D11_TEXTURE2D_DESC desc; + inOutTexture->GetDesc(&desc); + const SIZE scalingWndSize = Win32Utils::GetSizeOfRect(ScalingWindow::Get().WndRect()); + if ((LONG)desc.Width > scalingWndSize.cx || (LONG)desc.Height > scalingWndSize.cy) { + EffectOption bicubicOption; + bicubicOption.name = L"Bicubic"; + bicubicOption.parameters[L"paramB"] = 0.0f; + bicubicOption.parameters[L"paramC"] = 0.5f; + bicubicOption.scalingType = ScalingType::Fit; + // 参数不会改变,因此可以内联 + bicubicOption.flags = EffectOptionFlags::InlineParams; + + std::optional bicubicDesc = CompileEffect(bicubicOption); + if (!bicubicDesc) { + Logger::Get().Error("编译降采样效果失败"); + return nullptr; + } - EffectDrawer& bicubicDrawer = _effectDrawers.emplace_back(); - if (!bicubicDrawer.Initialize( - *bicubicDesc, - bicubicOption, - _backendResources, - scalingWndSize, - &inOutTexture - )) { - Logger::Get().Error("初始化降采样效果失败"); - return nullptr; + EffectDrawer& bicubicDrawer = _effectDrawers.emplace_back(); + if (!bicubicDrawer.Initialize( + *bicubicDesc, + bicubicOption, + _backendResources, + &inOutTexture + )) { + Logger::Get().Error("初始化降采样效果失败"); + return nullptr; + } } } @@ -458,10 +450,10 @@ HANDLE Renderer::_CreateSharedTexture(ID3D11Texture2D* effectsOutput) noexcept { return sharedHandle; } -void Renderer::_BackendThreadProc(const ScalingOptions& options) noexcept { +void Renderer::_BackendThreadProc() noexcept { winrt::init_apartment(winrt::apartment_type::single_threaded); - ID3D11Texture2D* outputTexture = _InitBackend(options); + ID3D11Texture2D* outputTexture = _InitBackend(); if (!outputTexture) { _frameSource.reset(); // 通知前端初始化失败 @@ -529,7 +521,7 @@ void Renderer::_BackendThreadProc(const ScalingOptions& options) noexcept { } } -ID3D11Texture2D* Renderer::_InitBackend(const ScalingOptions& options) noexcept { +ID3D11Texture2D* Renderer::_InitBackend() noexcept { // 创建 DispatcherQueue { DispatcherQueueOptions dqOptions{}; @@ -549,7 +541,8 @@ ID3D11Texture2D* Renderer::_InitBackend(const ScalingOptions& options) noexcept { std::optional frameRateLimit; // 渲染帧率最大为屏幕刷新率,这是某些捕获方法的要求,也可以提高 Graphics Capture 的流畅度 - if (HMONITOR hMon = MonitorFromWindow(_hwndSrc, MONITOR_DEFAULTTONEAREST)) { + const HWND hwndSrc = ScalingWindow::Get().HwndSrc(); + if (HMONITOR hMon = MonitorFromWindow(hwndSrc, MONITOR_DEFAULTTONEAREST)) { MONITORINFOEX mi{ sizeof(MONITORINFOEX) }; GetMonitorInfo(hMon, &mi); @@ -563,6 +556,7 @@ ID3D11Texture2D* Renderer::_InitBackend(const ScalingOptions& options) noexcept } } + const ScalingOptions& options = ScalingWindow::Get().Options(); if (options.maxFrameRate) { if (!frameRateLimit || *options.maxFrameRate < *frameRateLimit) { frameRateLimit = options.maxFrameRate; @@ -572,15 +566,15 @@ ID3D11Texture2D* Renderer::_InitBackend(const ScalingOptions& options) noexcept _stepTimer.Initialize(frameRateLimit); } - if (!_backendResources.Initialize(options)) { + if (!_backendResources.Initialize()) { return nullptr; } - if (!_InitFrameSource(options)) { + if (!_InitFrameSource()) { return nullptr; } - ID3D11Texture2D* outputTexture = _BuildEffects(options); + ID3D11Texture2D* outputTexture = _BuildEffects(); if (!outputTexture) { return nullptr; } @@ -663,7 +657,7 @@ void Renderer::_BackendRender(ID3D11Texture2D* effectsOutput, bool noChange) noe d3dDC->Flush(); // 唤醒前台线程 - PostMessage(_hwndScaling, WM_NULL, 0, 0); + PostMessage(ScalingWindow::Get().Handle(), WM_NULL, 0, 0); } bool Renderer::_UpdateDynamicConstants() const noexcept { diff --git a/src/Magpie.Core/Renderer.h b/src/Magpie.Core/Renderer.h index e1429b27f..8348406c1 100644 --- a/src/Magpie.Core/Renderer.h +++ b/src/Magpie.Core/Renderer.h @@ -8,7 +8,6 @@ namespace Magpie::Core { struct ScalingOptions; -class FrameSourceBase; class Renderer { public: @@ -18,7 +17,7 @@ class Renderer { Renderer(const Renderer&) = delete; Renderer(Renderer&&) = delete; - bool Initialize(HWND hwndSrc, HWND hwndScaling, const ScalingOptions& options) noexcept; + bool Initialize() noexcept; void Render(HCURSOR hCursor, POINT cursorPos) noexcept; @@ -35,13 +34,13 @@ class Renderer { private: bool _CreateSwapChain() noexcept; - void _BackendThreadProc(const ScalingOptions& options) noexcept; + void _BackendThreadProc() noexcept; - ID3D11Texture2D* _InitBackend(const ScalingOptions& options) noexcept; + ID3D11Texture2D* _InitBackend() noexcept; - bool _InitFrameSource(const ScalingOptions& options) noexcept; + bool _InitFrameSource() noexcept; - ID3D11Texture2D* _BuildEffects(const ScalingOptions& options) noexcept; + ID3D11Texture2D* _BuildEffects() noexcept; HANDLE _CreateSharedTexture(ID3D11Texture2D* effectsOutput) noexcept; @@ -69,7 +68,7 @@ class Renderer { // 只能由后台线程访问 DeviceResources _backendResources; - std::unique_ptr _frameSource; + std::unique_ptr _frameSource; std::vector _effectDrawers; StepTimer _stepTimer; @@ -85,10 +84,6 @@ class Renderer { uint32_t _firstDynamicEffectIdx = std::numeric_limits::max(); // 可由所有线程访问 - HWND _hwndSrc = NULL; - HWND _hwndScaling = NULL; - RECT _scalingWndRect{}; - winrt::Windows::System::DispatcherQueueController _backendThreadDqc{ nullptr }; std::atomic _sharedTextureMutexKey = 0; diff --git a/src/Magpie.Core/ScalingRuntime.cpp b/src/Magpie.Core/ScalingRuntime.cpp index 26bde3e53..23a4a6455 100644 --- a/src/Magpie.Core/ScalingRuntime.cpp +++ b/src/Magpie.Core/ScalingRuntime.cpp @@ -2,6 +2,7 @@ #include "ScalingRuntime.h" #include #include "Logger.h" +#include "ScalingWindow.h" namespace Magpie::Core { @@ -29,7 +30,7 @@ void ScalingRuntime::Start(HWND hwndSrc, ScalingOptions&& options) { _EnsureDispatcherQueue(); _dqc.DispatcherQueue().TryEnqueue([this, hwndSrc, options(std::move(options))]() mutable { _IsRunning(true); - _scalingWindow.Create(GetModuleHandle(nullptr), hwndSrc, std::move(options)); + ScalingWindow::Get().Create(GetModuleHandle(nullptr), hwndSrc, std::move(options)); }); } @@ -51,7 +52,7 @@ void ScalingRuntime::Stop() { _EnsureDispatcherQueue(); _dqc.DispatcherQueue().TryEnqueue([this]() { - _scalingWindow.Destroy(); + ScalingWindow::Get().Destroy(); }); } @@ -71,11 +72,13 @@ void ScalingRuntime::_ScalingThreadProc() noexcept { return; } + ScalingWindow& scalingWindow = ScalingWindow::Get(); + MSG msg; while (true) { while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { if (msg.message == WM_QUIT) { - _scalingWindow.Destroy(); + scalingWindow.Destroy(); _IsRunning(false); return; } @@ -83,8 +86,8 @@ void ScalingRuntime::_ScalingThreadProc() noexcept { DispatchMessage(&msg); } - if (_scalingWindow) { - _scalingWindow.Render(); + if (scalingWindow) { + scalingWindow.Render(); MsgWaitForMultipleObjectsEx(0, nullptr, 1, QS_ALLINPUT, MWMO_INPUTAVAILABLE); } else { _IsRunning(false); diff --git a/src/Magpie.Core/ScalingRuntime.h b/src/Magpie.Core/ScalingRuntime.h index 863ff214d..b5cc13341 100644 --- a/src/Magpie.Core/ScalingRuntime.h +++ b/src/Magpie.Core/ScalingRuntime.h @@ -4,7 +4,6 @@ #include #include #include -#include "ScalingWindow.h" namespace Magpie::Core { @@ -17,7 +16,7 @@ class API_DECLSPEC ScalingRuntime { return _isRunning ? _hwndSrc : 0; } - void Start(HWND hwndSrc, ScalingOptions&& options); + void Start(HWND hwndSrc, struct ScalingOptions&& options); void ToggleOverlay(); @@ -57,9 +56,6 @@ class API_DECLSPEC ScalingRuntime { std::thread _scalingThread; winrt::Windows::System::DispatcherQueueController _dqc{ nullptr }; - - // 只能由 _scalingThread 访问 - ScalingWindow _scalingWindow; }; } diff --git a/src/Magpie.Core/ScalingWindow.cpp b/src/Magpie.Core/ScalingWindow.cpp index 9952b3841..097b4d904 100644 --- a/src/Magpie.Core/ScalingWindow.cpp +++ b/src/Magpie.Core/ScalingWindow.cpp @@ -24,7 +24,7 @@ static BOOL CALLBACK MonitorEnumProc(HMONITOR, HDC, LPRECT monitorRect, LPARAM d return TRUE; } -static bool CalcHostWndRect(HWND hWnd, MultiMonitorUsage multiMonitorUsage, RECT& result) noexcept { +static bool CalcRect(HWND hWnd, MultiMonitorUsage multiMonitorUsage, RECT& result) noexcept { switch (multiMonitorUsage) { case MultiMonitorUsage::Closest: { @@ -107,9 +107,8 @@ bool ScalingWindow::Create(HINSTANCE hInstance, HWND hwndSrc, ScalingOptions&& o // 提高时钟精度,默认为 15.6ms timeBeginPeriod(1); - RECT wndRect; - if (!CalcHostWndRect(_hwndSrc, _options.multiMonitorUsage, wndRect)) { - Logger::Get().Error("CalcHostWndRect 失败"); + if (!CalcRect(_hwndSrc, _options.multiMonitorUsage, _wndRect)) { + Logger::Get().Error("CalcRect 失败"); return false; } @@ -122,7 +121,7 @@ bool ScalingWindow::Create(HINSTANCE hInstance, HWND hwndSrc, ScalingOptions&& o Win32Utils::GetClientScreenRect(_hwndSrc, srcRect); } - if (srcRect == wndRect) { + if (srcRect == _wndRect) { Logger::Get().Info("源窗口已全屏"); return false; } @@ -146,10 +145,10 @@ bool ScalingWindow::Create(HINSTANCE hInstance, HWND hwndSrc, ScalingOptions&& o CommonSharedConstants::SCALING_WINDOW_CLASS_NAME, L"Magpie", WS_POPUP, - wndRect.left, - wndRect.top, - wndRect.right - wndRect.left, - wndRect.bottom - wndRect.top, + _wndRect.left, + _wndRect.top, + _wndRect.right - _wndRect.left, + _wndRect.bottom - _wndRect.top, NULL, NULL, hInstance, @@ -172,15 +171,15 @@ bool ScalingWindow::Create(HINSTANCE hInstance, HWND hwndSrc, ScalingOptions&& o return false; } - _renderer = std::make_unique(); - if (!_renderer->Initialize(hwndSrc, _hWnd, _options)) { + _renderer = std::make_unique(); + if (!_renderer->Initialize()) { Logger::Get().Error("初始化 Renderer 失败"); Destroy(); return false; } - _cursorManager = std::make_unique(); - if (!_cursorManager->Initialize(hwndSrc, _hWnd, _renderer->SrcRect(), wndRect, _renderer->DestRect(), options)) { + _cursorManager = std::make_unique(); + if (!_cursorManager->Initialize()) { Logger::Get().Error("初始化 CursorManager 失败"); Destroy(); return false; diff --git a/src/Magpie.Core/ScalingWindow.h b/src/Magpie.Core/ScalingWindow.h index cba352372..7b30f352a 100644 --- a/src/Magpie.Core/ScalingWindow.h +++ b/src/Magpie.Core/ScalingWindow.h @@ -4,31 +4,55 @@ namespace Magpie::Core { -class Renderer; -class CursorManager; - class ScalingWindow : public WindowBase { friend class base_type; public: - ScalingWindow() noexcept; - ~ScalingWindow() noexcept; + static ScalingWindow& Get() noexcept { + static ScalingWindow instance; + return instance; + } bool Create(HINSTANCE hInstance, HWND hwndSrc, ScalingOptions&& options) noexcept; void Render() noexcept; + const RECT& WndRect() const noexcept { + return _wndRect; + } + + const ScalingOptions& Options() const noexcept { + return _options; + } + + HWND HwndSrc() const noexcept { + return _hwndSrc; + } + + class Renderer& Renderer() noexcept { + return *_renderer; + } + + class CursorManager& CursorManager() noexcept { + return *_cursorManager; + } + protected: LRESULT _MessageHandler(UINT msg, WPARAM wParam, LPARAM lParam) noexcept; private: + ScalingWindow() noexcept; + ~ScalingWindow() noexcept; + int _CheckSrcState() const noexcept; bool _CheckForeground(HWND hwndForeground) const noexcept; + RECT _wndRect; + ScalingOptions _options; - std::unique_ptr _renderer; - std::unique_ptr _cursorManager; + std::unique_ptr _renderer; + std::unique_ptr _cursorManager; HWND _hwndSrc = NULL; RECT _srcWndRect{}; From 636817f5b4cc813431c85363a2a2c9b670d633fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=97=AD?= <34770031+Blinue@users.noreply.github.com> Date: Sun, 9 Jul 2023 18:39:15 +0800 Subject: [PATCH 065/155] =?UTF-8?q?feat:=20=E5=8F=A0=E5=8A=A0=E5=B1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Magpie.Core/CursorDrawer.cpp | 5 +- src/Magpie.Core/CursorManager.cpp | 2 +- src/Magpie.Core/CursorManager.h | 18 - src/Magpie.Core/ImGuiBackend.cpp | 418 ++++++++++++++++++++ src/Magpie.Core/ImGuiBackend.h | 43 ++ src/Magpie.Core/ImGuiFontsCacheManager.h | 3 +- src/Magpie.Core/ImGuiImpl.cpp | 338 ++++++++++++++++ src/Magpie.Core/ImGuiImpl.h | 38 ++ src/Magpie.Core/Magpie.Core.vcxproj | 6 + src/Magpie.Core/Magpie.Core.vcxproj.filters | 18 + src/Magpie.Core/OverlayDrawer.cpp | 332 ++++++++++++++++ src/Magpie.Core/OverlayDrawer.h | 71 ++++ src/Magpie.Core/Renderer.cpp | 38 ++ src/Magpie.Core/Renderer.h | 8 +- src/Magpie.Core/ScalingRuntime.cpp | 2 +- src/Magpie.Core/ScalingWindow.cpp | 8 +- src/Magpie.Core/ScalingWindow.h | 2 + 17 files changed, 1318 insertions(+), 32 deletions(-) create mode 100644 src/Magpie.Core/ImGuiBackend.cpp create mode 100644 src/Magpie.Core/ImGuiBackend.h create mode 100644 src/Magpie.Core/ImGuiImpl.cpp create mode 100644 src/Magpie.Core/ImGuiImpl.h create mode 100644 src/Magpie.Core/OverlayDrawer.cpp create mode 100644 src/Magpie.Core/OverlayDrawer.h diff --git a/src/Magpie.Core/CursorDrawer.cpp b/src/Magpie.Core/CursorDrawer.cpp index 6f952fd7c..cf637a061 100644 --- a/src/Magpie.Core/CursorDrawer.cpp +++ b/src/Magpie.Core/CursorDrawer.cpp @@ -157,11 +157,8 @@ void CursorDrawer::Draw(HCURSOR hCursor, POINT cursorPos) noexcept { d3dDC->IASetVertexBuffers(0, 1, &vtxBuffer, &stride, &offset); } - // 配置渲染目标和视口 + // 配置渲染视口 { - ID3D11RenderTargetView* rtv = _deviceResources->GetRenderTargetView(_backBuffer); - d3dDC->OMSetRenderTargets(1, &rtv, nullptr); - D3D11_VIEWPORT vp{ (float)_viewportRect.left, (float)_viewportRect.top, diff --git a/src/Magpie.Core/CursorManager.cpp b/src/Magpie.Core/CursorManager.cpp index d904dcb1e..beeeb51a8 100644 --- a/src/Magpie.Core/CursorManager.cpp +++ b/src/Magpie.Core/CursorManager.cpp @@ -161,7 +161,7 @@ void CursorManager::_ShowSystemCursor(bool show) { } } - _cursorVisibilityChangedEvent(show); + ScalingWindow::Get().Renderer().OnCursorVisibilityChanged(show); } void CursorManager::_AdjustCursorSpeed() noexcept { diff --git a/src/Magpie.Core/CursorManager.h b/src/Magpie.Core/CursorManager.h index ad94a04c9..69ee463cd 100644 --- a/src/Magpie.Core/CursorManager.h +++ b/src/Magpie.Core/CursorManager.h @@ -1,5 +1,4 @@ #pragma once -#include "WinRTUtils.h" namespace Magpie::Core { @@ -15,21 +14,6 @@ class CursorManager { std::pair Update() noexcept; - winrt::event_token CursorVisibilityChanged(winrt::delegate const& handler) { - return _cursorVisibilityChangedEvent.add(handler); - } - - WinRTUtils::EventRevoker CursorVisibilityChanged(winrt::auto_revoke_t, winrt::delegate const& handler) { - winrt::event_token token = CursorVisibilityChanged(handler); - return WinRTUtils::EventRevoker([this, token]() { - CursorVisibilityChanged(token); - }); - } - - void CursorVisibilityChanged(winrt::event_token const& token) { - _cursorVisibilityChangedEvent.remove(token); - } - private: void _ShowSystemCursor(bool show); @@ -41,8 +25,6 @@ class CursorManager { void _StopCapture(POINT cursorPos, bool onDestroy = false) noexcept; - winrt::event> _cursorVisibilityChangedEvent; - RECT _curClips{}; int _originCursorSpeed = 0; diff --git a/src/Magpie.Core/ImGuiBackend.cpp b/src/Magpie.Core/ImGuiBackend.cpp new file mode 100644 index 000000000..16e5dbb96 --- /dev/null +++ b/src/Magpie.Core/ImGuiBackend.cpp @@ -0,0 +1,418 @@ +// 原始文件: https://github.com/ocornut/imgui/blob/e489e40a853426767de9ce0637bc0c9ceb431c1e/backends/imgui_impl_dx11.cpp + +#include "pch.h" +#include "ImGuiBackend.h" +#include +#include +#include "DeviceResources.h" +#include "StrUtils.h" +#include "Logger.h" + +namespace Magpie::Core { + +static constexpr const char* VERTEX_SHADER = R"( +cbuffer vertexBuffer : register(b0) { + float4x4 ProjectionMatrix; +}; + +struct VS_INPUT { + float2 pos : POSITION; + float4 col : COLOR0; + float2 uv : TEXCOORD0; +}; + +struct PS_INPUT { + float4 pos : SV_POSITION; + float4 col : COLOR0; + float2 uv : TEXCOORD0; +}; + +PS_INPUT main(VS_INPUT input) { + PS_INPUT output; + output.pos = mul( ProjectionMatrix, float4(input.pos.xy, 0.f, 1.f)); + output.col = input.col; + output.uv = input.uv; + return output; +})"; + +static constexpr const char* PIXEL_SHADER = R"( +struct PS_INPUT { + float4 pos : SV_POSITION; + float4 col : COLOR0; + float2 uv : TEXCOORD0; +}; + +sampler sampler0; +Texture2D texture0; + +float4 main(PS_INPUT input) : SV_Target { + return input.col * float4(1, 1, 1, texture0.Sample(sampler0, input.uv).r); +})"; + +struct VERTEX_CONSTANT_BUFFER_DX11 { + float mvp[4][4]; +}; + +bool ImGuiBackend::Initialize(DeviceResources* deviceResources) noexcept { + _deviceResources = deviceResources; + + ImGuiIO& io = ImGui::GetIO(); + io.BackendRendererName = "Magpie"; + // 支持 ImDrawCmd::VtxOffset + io.BackendFlags |= ImGuiBackendFlags_RendererHasVtxOffset; + + return true; +} + +void ImGuiBackend::_SetupRenderState(ImDrawData* drawData) noexcept { + ID3D11DeviceContext4* d3dDC = _deviceResources->GetD3DDC(); + + D3D11_VIEWPORT vp{}; + vp.Width = drawData->DisplaySize.x; + vp.Height = drawData->DisplaySize.y; + vp.MinDepth = 0.0f; + vp.MaxDepth = 1.0f; + d3dDC->RSSetViewports(1, &vp); + + d3dDC->IASetInputLayout(_inputLayout.get()); + { + unsigned int stride = sizeof(ImDrawVert); + unsigned int offset = 0; + + ID3D11Buffer* t = _vertexBuffer.get(); + d3dDC->IASetVertexBuffers(0, 1, &t, &stride, &offset); + } + + d3dDC->IASetIndexBuffer(_indexBuffer.get(), sizeof(ImDrawIdx) == 2 ? DXGI_FORMAT_R16_UINT : DXGI_FORMAT_R32_UINT, 0); + d3dDC->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); + d3dDC->VSSetShader(_vertexShader.get(), nullptr, 0); + { + ID3D11Buffer* t = _vertexConstantBuffer.get(); + d3dDC->VSSetConstantBuffers(0, 1, &t); + } + d3dDC->PSSetShader(_pixelShader.get(), nullptr, 0); + { + ID3D11SamplerState* t = _fontSampler.get(); + d3dDC->PSSetSamplers(0, 1, &t); + } + + const float blend_factor[4]{}; + d3dDC->OMSetBlendState(_blendState.get(), blend_factor, 0xffffffff); + d3dDC->RSSetState(_rasterizerState.get()); +} + +void ImGuiBackend::RenderDrawData(ImDrawData* drawData) noexcept { + // Avoid rendering when minimized + if (drawData->DisplaySize.x <= 0.0f || drawData->DisplaySize.y <= 0.0f) { + return; + } + + ID3D11DeviceContext4* d3dDC = _deviceResources->GetD3DDC(); + ID3D11Device5* d3dDevice = _deviceResources->GetD3DDevice(); + + HRESULT hr; + + // Create and grow vertex/index buffers if needed + if (!_vertexBuffer || _vertexBufferSize < drawData->TotalVtxCount) { + _vertexBufferSize = drawData->TotalVtxCount + 5000; + D3D11_BUFFER_DESC desc{}; + desc.Usage = D3D11_USAGE_DYNAMIC; + desc.ByteWidth = _vertexBufferSize * sizeof(ImDrawVert); + desc.BindFlags = D3D11_BIND_VERTEX_BUFFER; + desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; + hr = d3dDevice->CreateBuffer(&desc, nullptr, _vertexBuffer.put()); + if (FAILED(hr)) { + Logger::Get().ComError("CreateBuffer 失败", hr); + return; + } + } + if (!_indexBuffer || _indexBufferSize < drawData->TotalIdxCount) { + _indexBufferSize = drawData->TotalIdxCount + 10000; + D3D11_BUFFER_DESC desc{}; + desc.Usage = D3D11_USAGE_DYNAMIC; + desc.ByteWidth = _indexBufferSize * sizeof(ImDrawIdx); + desc.BindFlags = D3D11_BIND_INDEX_BUFFER; + desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; + hr = d3dDevice->CreateBuffer(&desc, nullptr, _indexBuffer.put()); + if (FAILED(hr)) { + Logger::Get().ComError("CreateBuffer 失败", hr); + return; + } + } + + // Upload vertex/index data into a single contiguous GPU buffer + D3D11_MAPPED_SUBRESOURCE vtxResource, idxResource; + hr = d3dDC->Map(_vertexBuffer.get(), 0, D3D11_MAP_WRITE_DISCARD, 0, &vtxResource); + if (FAILED(hr)) { + Logger::Get().ComError("Map 失败", hr); + return; + } + + hr = d3dDC->Map(_indexBuffer.get(), 0, D3D11_MAP_WRITE_DISCARD, 0, &idxResource); + if (FAILED(hr)) { + Logger::Get().ComError("Map 失败", hr); + return; + } + + ImDrawVert* vtxDst = (ImDrawVert*)vtxResource.pData; + ImDrawIdx* idxDst = (ImDrawIdx*)idxResource.pData; + for (int n = 0; n < drawData->CmdListsCount; ++n) { + const ImDrawList* cmdList = drawData->CmdLists[n]; + std::memcpy(vtxDst, cmdList->VtxBuffer.Data, cmdList->VtxBuffer.Size * sizeof(ImDrawVert)); + std::memcpy(idxDst, cmdList->IdxBuffer.Data, cmdList->IdxBuffer.Size * sizeof(ImDrawIdx)); + vtxDst += cmdList->VtxBuffer.Size; + idxDst += cmdList->IdxBuffer.Size; + } + d3dDC->Unmap(_vertexBuffer.get(), 0); + d3dDC->Unmap(_indexBuffer.get(), 0); + + // Setup orthographic projection matrix into our constant buffer + // Our visible imgui space lies from drawData->DisplayPos (top left) to drawData->DisplayPos+data_data->DisplaySize (bottom right). DisplayPos is (0,0) for single viewport apps. + { + D3D11_MAPPED_SUBRESOURCE mappedResource; + hr = d3dDC->Map(_vertexConstantBuffer.get(), 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource); + if (FAILED(hr)) { + Logger::Get().ComError("Map 失败", hr); + return; + } + + VERTEX_CONSTANT_BUFFER_DX11* constant_buffer = (VERTEX_CONSTANT_BUFFER_DX11*)mappedResource.pData; + float left = drawData->DisplayPos.x; + float right = drawData->DisplayPos.x + drawData->DisplaySize.x; + float top = drawData->DisplayPos.y; + float bottom = drawData->DisplayPos.y + drawData->DisplaySize.y; + float mvp[4][4] = { + { 2.0f / (right - left), 0.0f, 0.0f, 0.0f }, + { 0.0f, 2.0f / (top - bottom), 0.0f, 0.0f }, + { 0.0f, 0.0f, 0.5f, 0.0f }, + { (right + left) / (left - right), (top + bottom) / (bottom - top), 0.5f, 1.0f }, + }; + std::memcpy(&constant_buffer->mvp, mvp, sizeof(mvp)); + d3dDC->Unmap(_vertexConstantBuffer.get(), 0); + } + + // Setup desired DX state + _SetupRenderState(drawData); + + // Render command lists + // (Because we merged all buffers into a single one, we maintain our own offset into them) + int globalIdxOffset = 0; + int globalVtxOffset = 0; + ImVec2 clip_off = drawData->DisplayPos; + for (int n = 0; n < drawData->CmdListsCount; n++) { + const ImDrawList* cmdList = drawData->CmdLists[n]; + for (int cmd_i = 0; cmd_i < cmdList->CmdBuffer.Size; cmd_i++) { + const ImDrawCmd* pcmd = &cmdList->CmdBuffer[cmd_i]; + if (pcmd->UserCallback != nullptr) { + // User callback, registered via ImDrawList::AddCallback() + // (ImDrawCallback_ResetRenderState is a special callback value used by the user to request the renderer to reset render state.) + if (pcmd->UserCallback == ImDrawCallback_ResetRenderState) + _SetupRenderState(drawData); + else + pcmd->UserCallback(cmdList, pcmd); + } else { + // Project scissor/clipping rectangles into framebuffer space + ImVec2 clipMin(pcmd->ClipRect.x - clip_off.x, pcmd->ClipRect.y - clip_off.y); + ImVec2 clipMax(pcmd->ClipRect.z - clip_off.x, pcmd->ClipRect.w - clip_off.y); + if (clipMax.x <= clipMin.x || clipMax.y <= clipMin.y) + continue; + + // Apply scissor/clipping rectangle + const D3D11_RECT r = { (LONG)clipMin.x, (LONG)clipMin.y, (LONG)clipMax.x, (LONG)clipMax.y }; + d3dDC->RSSetScissorRects(1, &r); + + // Bind texture, Draw + ID3D11ShaderResourceView* textureSrv = (ID3D11ShaderResourceView*)pcmd->GetTexID(); + d3dDC->PSSetShaderResources(0, 1, &textureSrv); + d3dDC->DrawIndexed(pcmd->ElemCount, pcmd->IdxOffset + globalIdxOffset, pcmd->VtxOffset + globalVtxOffset); + } + } + globalIdxOffset += cmdList->IdxBuffer.Size; + globalVtxOffset += cmdList->VtxBuffer.Size; + } +} + +bool ImGuiBackend::_CreateFontsTexture() noexcept { + ImGuiIO& io = ImGui::GetIO(); + ID3D11Device5* d3dDevice = _deviceResources->GetD3DDevice(); + + HRESULT hr; + + // 字体纹理使用 R8_UNORM 格式 + unsigned char* pixels; + int width, height; + io.Fonts->GetTexDataAsAlpha8(&pixels, &width, &height); + + // Upload texture to graphics system + { + D3D11_TEXTURE2D_DESC desc{}; + desc.Width = width; + desc.Height = height; + desc.MipLevels = 1; + desc.ArraySize = 1; + desc.Format = DXGI_FORMAT_R8_UNORM; + desc.SampleDesc.Count = 1; + desc.Usage = D3D11_USAGE_DEFAULT; + desc.BindFlags = D3D11_BIND_SHADER_RESOURCE; + + winrt::com_ptr texture = nullptr; + D3D11_SUBRESOURCE_DATA subResource{}; + subResource.pSysMem = pixels; + subResource.SysMemPitch = width; + hr = d3dDevice->CreateTexture2D(&desc, &subResource, texture.put()); + if (FAILED(hr)) { + Logger::Get().ComError("CreateTexture2D 失败", hr); + return false; + } + + // Create texture view + D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc{}; + srvDesc.Format = desc.Format; + srvDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D; + srvDesc.Texture2D.MipLevels = desc.MipLevels; + hr = d3dDevice->CreateShaderResourceView(texture.get(), &srvDesc, _fontTextureView.put()); + if (FAILED(hr)) { + Logger::Get().ComError("CreateShaderResourceView 失败", hr); + return false; + } + } + + // Store our identifier + io.Fonts->SetTexID((ImTextureID)_fontTextureView.get()); + + // Create texture sampler + // (Bilinear sampling is required by default. Set 'io.Fonts->Flags |= ImFontAtlasFlags_NoBakedLines' or 'style.AntiAliasedLinesUseTex = false' to allow point/nearest sampling) + { + D3D11_SAMPLER_DESC desc{}; + desc.Filter = D3D11_FILTER_MIN_MAG_MIP_LINEAR; + desc.AddressU = D3D11_TEXTURE_ADDRESS_WRAP; + desc.AddressV = D3D11_TEXTURE_ADDRESS_WRAP; + desc.AddressW = D3D11_TEXTURE_ADDRESS_WRAP; + desc.ComparisonFunc = D3D11_COMPARISON_ALWAYS; + hr = d3dDevice->CreateSamplerState(&desc, _fontSampler.put()); + if (FAILED(hr)) { + Logger::Get().ComError("CreateSamplerState 失败", hr); + return false; + } + } + + // 清理不再需要的数据降低内存占用 + io.Fonts->ClearTexData(); + + return true; +} + +bool ImGuiBackend::_CreateDeviceObjects() noexcept { + ID3D11Device5* d3dDevice = _deviceResources->GetD3DDevice(); + + HRESULT hr; + + static winrt::com_ptr vertexShaderBlob; + if (!vertexShaderBlob) { + hr = D3DCompile(VERTEX_SHADER, StrUtils::StrLen(VERTEX_SHADER), + nullptr, nullptr, nullptr, "main", "vs_5_0", 0, 0, vertexShaderBlob.put(), nullptr); + if (FAILED(hr)) { + Logger::Get().ComError("编译顶点着色器失败", hr); + return false; + } + } + + hr = d3dDevice->CreateVertexShader( + vertexShaderBlob->GetBufferPointer(), + vertexShaderBlob->GetBufferSize(), + nullptr, + _vertexShader.put() + ); + if (FAILED(hr)) { + Logger::Get().ComError("CreateVertexShader 失败", hr); + return false; + } + + static constexpr D3D11_INPUT_ELEMENT_DESC LOCAL_LAYOUT[] = { + { "POSITION", 0, DXGI_FORMAT_R32G32_FLOAT, 0, (UINT)IM_OFFSETOF(ImDrawVert, pos), D3D11_INPUT_PER_VERTEX_DATA, 0 }, + { "TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, (UINT)IM_OFFSETOF(ImDrawVert, uv), D3D11_INPUT_PER_VERTEX_DATA, 0 }, + { "COLOR", 0, DXGI_FORMAT_R8G8B8A8_UNORM, 0, (UINT)IM_OFFSETOF(ImDrawVert, col), D3D11_INPUT_PER_VERTEX_DATA, 0 }, + }; + hr = d3dDevice->CreateInputLayout(LOCAL_LAYOUT, 3, + vertexShaderBlob->GetBufferPointer(), vertexShaderBlob->GetBufferSize(), _inputLayout.put()); + if (FAILED(hr)) { + Logger::Get().ComError("CreateInputLayout 失败", hr); + return false; + } + + { + D3D11_BUFFER_DESC desc{}; + desc.ByteWidth = sizeof(VERTEX_CONSTANT_BUFFER_DX11); + desc.Usage = D3D11_USAGE_DYNAMIC; + desc.BindFlags = D3D11_BIND_CONSTANT_BUFFER; + desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; + d3dDevice->CreateBuffer(&desc, nullptr, _vertexConstantBuffer.put()); + } + + static winrt::com_ptr pixelShaderBlob; + if (!pixelShaderBlob) { + hr = D3DCompile(PIXEL_SHADER, StrUtils::StrLen(PIXEL_SHADER), + nullptr, nullptr, nullptr, "main", "ps_5_0", 0, 0, pixelShaderBlob.put(), nullptr); + if (FAILED(hr)) { + Logger::Get().ComError("编译像素着色器失败", hr); + return false; + } + } + + hr = d3dDevice->CreatePixelShader( + pixelShaderBlob->GetBufferPointer(), + pixelShaderBlob->GetBufferSize(), + nullptr, + _pixelShader.put() + ); + if (FAILED(hr)) { + Logger::Get().ComError("CreatePixelShader 失败", hr); + return false; + } + + { + D3D11_BLEND_DESC desc{}; + desc.AlphaToCoverageEnable = false; + desc.RenderTarget[0].BlendEnable = true; + desc.RenderTarget[0].SrcBlend = D3D11_BLEND_SRC_ALPHA; + desc.RenderTarget[0].DestBlend = D3D11_BLEND_INV_SRC_ALPHA; + desc.RenderTarget[0].BlendOp = D3D11_BLEND_OP_ADD; + desc.RenderTarget[0].SrcBlendAlpha = D3D11_BLEND_ONE; + desc.RenderTarget[0].DestBlendAlpha = D3D11_BLEND_INV_SRC_ALPHA; + desc.RenderTarget[0].BlendOpAlpha = D3D11_BLEND_OP_ADD; + desc.RenderTarget[0].RenderTargetWriteMask = D3D11_COLOR_WRITE_ENABLE_ALL; + hr = d3dDevice->CreateBlendState(&desc, _blendState.put()); + if (FAILED(hr)) { + Logger::Get().ComError("CreateBlendState 失败", hr); + return false; + } + } + + // Create the rasterizer state + { + D3D11_RASTERIZER_DESC desc{}; + desc.FillMode = D3D11_FILL_SOLID; + desc.CullMode = D3D11_CULL_NONE; + desc.ScissorEnable = true; + hr = d3dDevice->CreateRasterizerState(&desc, _rasterizerState.put()); + if (FAILED(hr)) { + Logger::Get().ComError("CreateRasterizerState 失败", hr); + return false; + } + } + + if (!_CreateFontsTexture()) { + Logger::Get().Error("_CreateFontsTexture 失败"); + return false; + } + + return true; +} + +void ImGuiBackend::BeginFrame() noexcept { + if (!_fontSampler) { + _CreateDeviceObjects(); + } +} + +} diff --git a/src/Magpie.Core/ImGuiBackend.h b/src/Magpie.Core/ImGuiBackend.h new file mode 100644 index 000000000..3c9c1c3aa --- /dev/null +++ b/src/Magpie.Core/ImGuiBackend.h @@ -0,0 +1,43 @@ +#pragma once +#include + +namespace Magpie::Core { + +class DeviceResources; + +class ImGuiBackend { +public: + ImGuiBackend() = default; + ImGuiBackend(const ImGuiBackend&) = delete; + ImGuiBackend(ImGuiBackend&&) = delete; + + bool Initialize(DeviceResources* deviceResources) noexcept; + + void BeginFrame() noexcept; + void RenderDrawData(ImDrawData* drawData) noexcept; + +private: + bool _CreateDeviceObjects() noexcept; + + void _SetupRenderState(ImDrawData* drawData) noexcept; + bool _CreateFontsTexture() noexcept; + + class DeviceResources* _deviceResources = nullptr; + + winrt::com_ptr _vertexBuffer; + int _vertexBufferSize = 5000; + + winrt::com_ptr _indexBuffer; + int _indexBufferSize = 10000; + + winrt::com_ptr _vertexShader; + winrt::com_ptr _inputLayout; + winrt::com_ptr _vertexConstantBuffer; + winrt::com_ptr _pixelShader; + winrt::com_ptr _fontSampler; + winrt::com_ptr _fontTextureView; + winrt::com_ptr _blendState; + winrt::com_ptr _rasterizerState; +}; + +} diff --git a/src/Magpie.Core/ImGuiFontsCacheManager.h b/src/Magpie.Core/ImGuiFontsCacheManager.h index 0e8616e47..7b502794c 100644 --- a/src/Magpie.Core/ImGuiFontsCacheManager.h +++ b/src/Magpie.Core/ImGuiFontsCacheManager.h @@ -1,6 +1,5 @@ #pragma once - -struct ImFontAtlas; +#include namespace Magpie::Core { diff --git a/src/Magpie.Core/ImGuiImpl.cpp b/src/Magpie.Core/ImGuiImpl.cpp new file mode 100644 index 000000000..120e6294f --- /dev/null +++ b/src/Magpie.Core/ImGuiImpl.cpp @@ -0,0 +1,338 @@ +#include "pch.h" +#include "ImGuiImpl.h" +#include +#include +#include "ImGuiBackend.h" +#include "CursorManager.h" +#include "DeviceResources.h" +#include "Renderer.h" +#include "Logger.h" +#include "Win32Utils.h" +#include "ScalingWindow.h" + +namespace Magpie::Core { + +ImGuiImpl::~ImGuiImpl() noexcept { + /*MagApp::Get().UnregisterWndProcHandler(_handlerId); + + if (_hHookThread) { + PostThreadMessage(_hookThreadId, WM_QUIT, 0, 0); + WaitForSingleObject(_hHookThread, 1000); + }*/ + + if (ImGui::GetCurrentContext()) { + ImGui::DestroyContext(); + } +} +/* +static std::optional WndProcHandler(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { + ImGuiIO& io = ImGui::GetIO(); + + if (!io.WantCaptureMouse) { + if (msg == WM_LBUTTONDOWN && MagApp::Get().GetOptions().Is3DGameMode()) { + MagApp::Get().GetRenderer().SetUIVisibility(false); + } + return std::nullopt; + } + + switch (msg) { + case WM_LBUTTONDOWN: case WM_LBUTTONDBLCLK: + case WM_RBUTTONDOWN: case WM_RBUTTONDBLCLK: + case WM_MBUTTONDOWN: case WM_MBUTTONDBLCLK: + case WM_XBUTTONDOWN: case WM_XBUTTONDBLCLK: + { + int button = 0; + if (msg == WM_LBUTTONDOWN || msg == WM_LBUTTONDBLCLK) { button = 0; } + if (msg == WM_RBUTTONDOWN || msg == WM_RBUTTONDBLCLK) { button = 1; } + if (msg == WM_MBUTTONDOWN || msg == WM_MBUTTONDBLCLK) { button = 2; } + if (msg == WM_XBUTTONDOWN || msg == WM_XBUTTONDBLCLK) { button = (GET_XBUTTON_WPARAM(wParam) == XBUTTON1) ? 3 : 4; } + + if (!ImGui::IsAnyMouseDown()) { + if (!GetCapture()) { + SetCapture(hwnd); + } + MagApp::Get().GetCursorManager().OnCursorCapturedOnOverlay(); + } + + io.MouseDown[button] = true; + break; + } + case WM_LBUTTONUP: + case WM_RBUTTONUP: + case WM_MBUTTONUP: + case WM_XBUTTONUP: + { + int button = 0; + if (msg == WM_LBUTTONUP) { button = 0; } + if (msg == WM_RBUTTONUP) { button = 1; } + if (msg == WM_MBUTTONUP) { button = 2; } + if (msg == WM_XBUTTONUP) { button = (GET_XBUTTON_WPARAM(wParam) == XBUTTON1) ? 3 : 4; } + + io.MouseDown[button] = false; + + if (!ImGui::IsAnyMouseDown()) { + if (GetCapture() == hwnd) { + ReleaseCapture(); + } + MagApp::Get().GetCursorManager().OnCursorReleasedOnOverlay(); + } + + break; + } + case WM_MOUSEWHEEL: + io.MouseWheel += (float)GET_WHEEL_DELTA_WPARAM(wParam) / (float)WHEEL_DELTA; + break; + case WM_MOUSEHWHEEL: + io.MouseWheelH += (float)GET_WHEEL_DELTA_WPARAM(wParam) / (float)WHEEL_DELTA; + break; + } + + return std::nullopt; +} + +static LRESULT CALLBACK LowLevelMouseProc( + _In_ int nCode, + _In_ WPARAM wParam, + _In_ LPARAM lParam +) { + if (nCode != HC_ACTION || !ImGui::GetIO().WantCaptureMouse) { + return CallNextHookEx(NULL, nCode, wParam, lParam); + } + + if (wParam == WM_MOUSEWHEEL || wParam == WM_MOUSEHWHEEL) { + // 向主线程发送滚动数据 + // 使用 Windows 消息进行线程同步 + PostMessage(MagApp::Get().GetHwndHost(), (UINT)wParam, ((MSLLHOOKSTRUCT*)lParam)->mouseData, 0); + + // 阻断滚轮消息,防止传给源窗口 + return -1; + } else if (wParam >= WM_LBUTTONDOWN && wParam <= WM_RBUTTONUP) { + PostMessage(MagApp::Get().GetHwndHost(), (UINT)wParam, 0, 0); + + // 阻断点击消息,防止传给源窗口 + return -1; + } else { + return CallNextHookEx(NULL, nCode, wParam, lParam); + } +} + +static DWORD WINAPI ThreadProc(LPVOID lpThreadParameter) { + HHOOK hook = SetWindowsHookEx(WH_MOUSE_LL, LowLevelMouseProc, NULL, 0); + if (!hook) { + Logger::Get().Win32Error("注册鼠标钩子失败"); + return 1; + } + + Logger::Get().Info("已注册鼠标钩子"); + + // 鼠标钩子需要消息循环 + MSG msg; + while (GetMessage(&msg, NULL, 0, 0)) { + TranslateMessage(&msg); + DispatchMessage(&msg); + } + + UnhookWindowsHookEx(hook); + Logger::Get().Info("已销毁鼠标钩子"); + return 0; +} +*/ +bool ImGuiImpl::Initialize(DeviceResources* deviceResources) noexcept { +#ifdef _DEBUG + // 检查 ImGUI 版本是否匹配 + if (!IMGUI_CHECKVERSION()) { + Logger::Get().Error("ImGui 的头文件与链接库版本不同"); + return false; + } +#endif // _DEBUG + + ImGui::CreateContext(); + + // Setup backend capabilities flags + ImGuiIO& io = ImGui::GetIO(); + io.BackendPlatformUserData = nullptr; + io.BackendPlatformName = "Magpie"; + io.ImeWindowHandle = ScalingWindow::Get().Handle(); + io.ConfigFlags |= ImGuiConfigFlags_NavNoCaptureKeyboard | ImGuiConfigFlags_NoMouseCursorChange; + + if (!_backend.Initialize(deviceResources)) { + Logger::Get().Error("初始化 ImGuiBackend 失败"); + return false; + } + + /*_handlerId = MagApp::Get().RegisterWndProcHandler(WndProcHandler); + + // 断点模式下不注册鼠标钩子,否则调试时鼠标无法使用 + if (!MagApp::Get().GetOptions().IsDebugMode() && !MagApp::Get().GetOptions().Is3DGameMode()) { + _hHookThread = CreateThread(nullptr, 0, ThreadProc, nullptr, 0, &_hookThreadId); + if (!_hHookThread) { + Logger::Get().Win32Error("创建线程失败"); + } + }*/ + + return true; +} + +void ImGuiImpl::BeginFrame() { + ImGuiIO& io = ImGui::GetIO(); + + // Setup display size (every frame to accommodate for window resizing) + const SIZE outputSize = Win32Utils::GetSizeOfRect(ScalingWindow::Get().Renderer().DestRect()); + io.DisplaySize = ImVec2((float)outputSize.cx, (float)outputSize.cy); + + // Update OS mouse position + _UpdateMousePos(); + + // 不接受键盘输入 + if (io.WantCaptureKeyboard) { + io.AddKeyEvent(ImGuiKey_Enter, true); + io.AddKeyEvent(ImGuiKey_Enter, false); + } + + bool originWantCaptureMouse = io.WantCaptureMouse; + + _backend.BeginFrame(); + ImGui::NewFrame(); + + // 将所有 ImGUI 窗口限制在视口内 + for (ImGuiWindow* window : ImGui::GetCurrentContext()->Windows) { + if (window->Flags & ImGuiWindowFlags_Tooltip) { + continue; + } + + ImVec2 pos = window->Pos; + + if (outputSize.cx > window->Size.x) { + pos.x = std::clamp(pos.x, 0.0f, outputSize.cx - window->Size.x); + } else { + pos.x = 0; + } + + if (outputSize.cy > window->Size.y) { + pos.y = std::clamp(pos.y, 0.0f, outputSize.cy - window->Size.y); + } else { + pos.y = 0; + } + + ImGui::SetWindowPos(window, pos); + } + + /*CursorManager& cm = MagApp::Get().GetCursorManager(); + + if (io.WantCaptureMouse) { + if (!originWantCaptureMouse) { + cm.OnCursorHoverOverlay(); + } + } else { + if (originWantCaptureMouse) { + cm.OnCursorLeaveOverlay(); + } + }*/ +} + +void ImGuiImpl::EndFrame() { + ImGui::Render(); + + const RECT& scalingRect = ScalingWindow::Get().WndRect(); + const RECT& destRect = ScalingWindow::Get().Renderer().DestRect(); + + ImGui::GetDrawData()->DisplayPos = ImVec2( + float(scalingRect.left - destRect.left), + float(scalingRect.top - destRect.top) + ); + ImGui::GetDrawData()->DisplaySize = ImVec2( + float(destRect.right - scalingRect.left), + float(destRect.bottom - scalingRect.top) + ); + + _backend.RenderDrawData(ImGui::GetDrawData()); +} + +void ImGuiImpl::Tooltip(const char* content, float maxWidth) { + /*ImVec2 padding = ImGui::GetStyle().WindowPadding; + ImVec2 contentSize = ImGui::CalcTextSize(content, nullptr, false, maxWidth - 2 * padding.x); + ImVec2 windowSize(contentSize.x + 2 * padding.x, contentSize.y + 2 * padding.y); + ImGui::SetNextWindowSize(windowSize); + + ImVec2 windowPos = ImGui::GetMousePos(); + windowPos.x += 16 * ImGui::GetStyle().MouseCursorScale; + windowPos.y += 8 * ImGui::GetStyle().MouseCursorScale; + + SIZE outputSize = Win32Utils::GetSizeOfRect(MagApp::Get().GetRenderer().GetOutputRect()); + windowPos.x = std::clamp(windowPos.x, 0.0f, outputSize.cx - windowSize.x); + windowPos.y = std::clamp(windowPos.y, 0.0f, outputSize.cy - windowSize.y); + + ImGui::SetNextWindowPos(windowPos); + + ImGui::SetNextWindowBgAlpha(ImGui::GetStyle().Colors[ImGuiCol_PopupBg].w); + ImGui::Begin("tooltip", NULL, ImGuiWindowFlags_NoInputs | ImGuiWindowFlags_NoDecoration | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoSavedSettings | ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoFocusOnAppearing); + + ImGui::PushTextWrapPos(maxWidth - padding.x); + ImGui::TextUnformatted(content); + ImGui::PopTextWrapPos(); + + ImGui::BringWindowToDisplayFront(ImGui::GetCurrentWindow()); + ImGui::End();*/ +} + +void ImGuiImpl::_UpdateMousePos() noexcept { + /*ImGuiIO& io = ImGui::GetIO(); + + if (MagApp::Get().GetOptions().Is3DGameMode() && !MagApp::Get().GetRenderer().IsUIVisiable()) { + io.MousePos = ImVec2(-FLT_MAX, -FLT_MAX); + return; + } + + POINT pos; + CursorManager& cm = MagApp::Get().GetCursorManager(); + if (cm.HasCursor()) { + pos = *cm.GetCursorPos(); + } else { + GetCursorPos(&pos); + + if (WindowFromPoint(pos) != MagApp::Get().GetHwndHost()) { + io.MousePos = ImVec2(-FLT_MAX, -FLT_MAX); + return; + } + + const RECT& hostRect = MagApp::Get().GetHostWndRect(); + pos.x -= hostRect.left; + pos.y -= hostRect.top; + } + + const RECT& outputRect = MagApp::Get().GetRenderer().GetOutputRect(); + pos.x -= outputRect.left; + pos.y -= outputRect.top; + + io.MousePos = ImVec2((float)pos.x, (float)pos.y);*/ +} + +void ImGuiImpl::ClearStates() { + /*ImGuiIO& io = ImGui::GetIO(); + io.MousePos = ImVec2(-FLT_MAX, -FLT_MAX); + std::fill(std::begin(io.MouseDown), std::end(io.MouseDown), false); + + auto& cm = ScalingWindow::Get().CursorManager(); + if (cm.IsCursorCapturedOnOverlay()) { + if (GetCapture() == MagApp::Get().GetHwndHost()) { + ReleaseCapture(); + } + cm.OnCursorReleasedOnOverlay(); + } + + if (cm.IsCursorOnOverlay()) { + cm.OnCursorLeaveOverlay(); + } + + // 更新状态 + ImGui::BeginFrame(); + ImGui::EndFrame(); + + if (io.WantCaptureMouse) { + // 拖拽时隐藏 UI 需渲染两帧才能重置 WantCaptureMouse + ImGui::BeginFrame(); + ImGui::EndFrame(); + }*/ +} + +} diff --git a/src/Magpie.Core/ImGuiImpl.h b/src/Magpie.Core/ImGuiImpl.h new file mode 100644 index 000000000..8640d8717 --- /dev/null +++ b/src/Magpie.Core/ImGuiImpl.h @@ -0,0 +1,38 @@ +#pragma once +#include "ImGuiBackend.h" + +namespace Magpie::Core { + +class DeviceResources; + +class ImGuiImpl { +public: + ImGuiImpl() = default; + ImGuiImpl(const ImGuiImpl&) = delete; + ImGuiImpl(ImGuiImpl&&) = delete; + + ~ImGuiImpl() noexcept; + + bool Initialize(DeviceResources* deviceResource) noexcept; + + void BeginFrame(); + + void EndFrame(); + + void ClearStates(); + + // 将提示窗口限制在屏幕内 + static void Tooltip(const char* content, float maxWidth = -1.0f); +private: + void _UpdateMousePos() noexcept; + + ImGuiBackend _backend; + + uint32_t _handlerId = 0; + + HANDLE _hHookThread = NULL; + DWORD _hookThreadId = 0; + std::atomic _wheelData = 0; +}; + +} diff --git a/src/Magpie.Core/Magpie.Core.vcxproj b/src/Magpie.Core/Magpie.Core.vcxproj index eb621755c..366c579f0 100644 --- a/src/Magpie.Core/Magpie.Core.vcxproj +++ b/src/Magpie.Core/Magpie.Core.vcxproj @@ -103,10 +103,13 @@ + + + @@ -130,9 +133,12 @@ + + + Create diff --git a/src/Magpie.Core/Magpie.Core.vcxproj.filters b/src/Magpie.Core/Magpie.Core.vcxproj.filters index 9f4db9830..0747ff831 100644 --- a/src/Magpie.Core/Magpie.Core.vcxproj.filters +++ b/src/Magpie.Core/Magpie.Core.vcxproj.filters @@ -85,6 +85,15 @@ Capture + + Overlay + + + Overlay + + + Overlay + @@ -126,6 +135,15 @@ Capture + + Overlay + + + Overlay + + + Overlay + diff --git a/src/Magpie.Core/OverlayDrawer.cpp b/src/Magpie.Core/OverlayDrawer.cpp new file mode 100644 index 000000000..0042b0400 --- /dev/null +++ b/src/Magpie.Core/OverlayDrawer.cpp @@ -0,0 +1,332 @@ +#include "pch.h" +#include "OverlayDrawer.h" +#include "DeviceResources.h" +#include "Renderer.h" +#include "StepTimer.h" +#include "Logger.h" +#include "StrUtils.h" +#include "Win32Utils.h" +#include "FrameSourceBase.h" +#include "CommonSharedConstants.h" +#include "EffectDesc.h" +#include // std::bit_ceil +#include +#include "ImGuiHelper.h" +#include "ImGuiFontsCacheManager.h" +#include "ScalingWindow.h" + +namespace Magpie::Core { + +bool OverlayDrawer::Initialize(DeviceResources* deviceResources) noexcept { + HWND hwndSrc = ScalingWindow::Get().HwndSrc(); + _isSrcMainWnd = Win32Utils::GetWndClassName(hwndSrc) == CommonSharedConstants::MAIN_WINDOW_CLASS_NAME; + + if (!_imguiImpl.Initialize(deviceResources)) { + Logger::Get().Error("初始化 ImGuiImpl 失败"); + return false; + } + + _dpiScale = GetDpiForWindow(ScalingWindow::Get().Handle()) / 96.0f; + + ImGui::StyleColorsDark(); + ImGuiStyle& style = ImGui::GetStyle(); + style.PopupRounding = style.WindowRounding = 6; + style.FrameBorderSize = 1; + style.FrameRounding = 2; + style.WindowMinSize = ImVec2(10, 10); + style.ScaleAllSizes(_dpiScale); + + if (!_BuildFonts()) { + Logger::Get().Error("_BuildFonts 失败"); + return false; + } + + // 获取硬件信息 + DXGI_ADAPTER_DESC desc{}; + HRESULT hr = deviceResources->GetGraphicsAdapter()->GetDesc(&desc); + _hardwareInfo.gpuName = SUCCEEDED(hr) ? StrUtils::UTF16ToUTF8(desc.Description) : "UNAVAILABLE"; + + // 将 _fontUI 设为默认字体 + ImGui::GetIO().FontDefault = _fontUI; + + return true; +} + +void OverlayDrawer::Draw() noexcept { + bool isShowFPS = ScalingWindow::Get().Options().IsShowFPS(); + + if (!_isUIVisiable && !isShowFPS) { + return; + } + + _imguiImpl.BeginFrame(); + + ImGui::ShowDemoWindow(); + + if (isShowFPS) { + _DrawFPS(); + } + + if (_isUIVisiable) { + _DrawUI(); + } + + _imguiImpl.EndFrame(); +} + +void OverlayDrawer::SetUIVisibility(bool value) noexcept { + if (_isUIVisiable == value) { + return; + } + _isUIVisiable = value; + + +} + +static const std::wstring& GetAppLanguage() noexcept { + static std::wstring language; + if (language.empty()) { + winrt::ResourceContext resourceContext = winrt::ResourceContext::GetForViewIndependentUse(); + language = resourceContext.QualifierValues().Lookup(L"Language"); + StrUtils::ToLowerCase(language); + } + return language; +} + +static const std::wstring& GetSystemFontsFolder() noexcept { + static std::wstring result; + + if (result.empty()) { + wchar_t* fontsFolder = nullptr; + HRESULT hr = SHGetKnownFolderPath(FOLDERID_Fonts, 0, NULL, &fontsFolder); + if (FAILED(hr)) { + CoTaskMemFree(fontsFolder); + Logger::Get().ComError("SHGetKnownFolderPath 失败", hr); + return result; + } + + result = fontsFolder; + CoTaskMemFree(fontsFolder); + } + + return result; +} + +bool OverlayDrawer::_BuildFonts() noexcept { + const std::wstring& language = GetAppLanguage(); + + ImFontAtlas& fontAtlas = *ImGui::GetIO().Fonts; + + bool fontCacheDisabled = ScalingWindow::Get().Options().IsDisableFontCache(); + if (!fontCacheDisabled && ImGuiFontsCacheManager::Get().Load(language, fontAtlas)) { + _fontUI = fontAtlas.Fonts[0]; + _fontMonoNumbers = fontAtlas.Fonts[1]; + _fontFPS = fontAtlas.Fonts[2]; + return true; + } + + fontAtlas.Flags |= ImFontAtlasFlags_NoPowerOfTwoHeight; + if (!ScalingWindow::Get().Options().Is3DGameMode()) { + // 非 3D 游戏模式无需 ImGui 绘制光标 + fontAtlas.Flags |= ImFontAtlasFlags_NoMouseCursors; + } + + std::wstring fontPath = GetSystemFontsFolder(); + if (Win32Utils::GetOSVersion().IsWin11()) { + fontPath += L"\\SegUIVar.ttf"; + } else { + fontPath += L"\\segoeui.ttf"; + } + + std::vector fontData; + if (!Win32Utils::ReadFile(fontPath.c_str(), fontData)) { + Logger::Get().Error("读取字体文件失败"); + return false; + } + + // 构建字体前 uiRanges 不能析构,因为 ImGui 只保存了指针 + ImVector uiRanges; + _BuildFontUI(language, fontData, uiRanges); + _BuildFontFPS(fontData); + + if (!fontAtlas.Build()) { + Logger::Get().Error("构建字体失败"); + return false; + } + + if (!fontCacheDisabled) { + ImGuiFontsCacheManager::Get().Save(language, fontAtlas); + } + + return true; +} + +void OverlayDrawer::_BuildFontUI( + std::wstring_view language, + const std::vector& fontData, + ImVector& uiRanges +) noexcept { + ImFontAtlas& fontAtlas = *ImGui::GetIO().Fonts; + + std::string extraFontPath; + const ImWchar* extraRanges = nullptr; + int extraFontNo = 0; + + ImFontGlyphRangesBuilder builder; + + if (language == L"en-us") { + builder.AddRanges(ImGuiHelper::ENGLISH_RANGES); + } else if (language == L"es" || language == L"pt-br") { + // Basic Latin + Latin-1 Supplement + // 参见 https://en.wikipedia.org/wiki/Latin-1_Supplement + builder.AddRanges(fontAtlas.GetGlyphRangesDefault()); + } else if (language == L"ru" || language == L"uk") { + builder.AddRanges(fontAtlas.GetGlyphRangesCyrillic()); + } else if (language == L"tr") { + builder.AddRanges(ImGuiHelper::TURKISH_RANGES); + } else { + builder.AddRanges(fontAtlas.GetGlyphRangesDefault()); + + // 一些语言需要加载额外的字体: + // 简体中文 -> Microsoft YaHei UI + // 繁体中文 -> Microsoft JhengHei UI + // 日语 -> Yu Gothic UI + // 韩语/朝鲜语 -> Malgun Gothic + // 参见 https://learn.microsoft.com/en-us/windows/apps/design/style/typography#fonts-for-non-latin-languages + + extraFontPath = StrUtils::UTF16ToUTF8(GetSystemFontsFolder()); + extraFontPath.push_back(L'\\'); + if (language == L"zh-hans") { + // msyh.ttc: 0 是微软雅黑,1 是 Microsoft YaHei UI + extraFontPath += "msyh.ttc"; + extraFontNo = 1; + extraRanges = ImGuiHelper::GetGlyphRangesChineseSimplifiedOfficial(); + } else if (language == L"zh-hant") { + // msjh.ttc: 0 是 Microsoft JhengHei,1 是 Microsoft JhengHei UI + extraFontPath += "msjh.ttc"; + extraFontNo = 1; + extraRanges = ImGuiHelper::GetGlyphRangesChineseTraditionalOfficial(); + } else if (language == L"ja") { + // YuGothM.ttc: 0 是 Yu Gothic Medium,1 是 Yu Gothic UI + extraFontPath += "YuGothM.ttc"; + extraFontNo = 1; + extraRanges = fontAtlas.GetGlyphRangesJapanese(); + } else if (language == L"ko") { + extraFontPath += "malgun.ttf"; + extraRanges = fontAtlas.GetGlyphRangesKorean(); + } + } + builder.SetBit(L'■'); + builder.BuildRanges(&uiRanges); + + ImFontConfig config; + config.FontDataOwnedByAtlas = false; + + const float fontSize = 18 * _dpiScale; + + ////////////////////////////////////////////////////////// + // + // uiRanges (+ extraRanges) -> _fontUI + // + ////////////////////////////////////////////////////////// + + +#ifdef _DEBUG + std::char_traits::copy(config.Name, "_fontUI", std::size(config.Name)); +#endif + + _fontUI = fontAtlas.AddFontFromMemoryTTF( + (void*)fontData.data(), (int)fontData.size(), fontSize, &config, uiRanges.Data); + + if (extraRanges) { + assert(Win32Utils::FileExists(StrUtils::UTF8ToUTF16(extraFontPath).c_str())); + + // 在 MergeMode 下已有字符会跳过而不是覆盖 + config.MergeMode = true; + config.FontNo = extraFontNo; + // 额外字体数据由 ImGui 管理,退出缩放时释放 + config.FontDataOwnedByAtlas = true; + fontAtlas.AddFontFromFileTTF(extraFontPath.c_str(), fontSize, &config, extraRanges); + config.FontDataOwnedByAtlas = false; + config.FontNo = 0; + config.MergeMode = false; + } + + ////////////////////////////////////////////////////////// + // + // NUMBER_RANGES + NOT_NUMBER_RANGES -> _fontMonoNumbers + // + ////////////////////////////////////////////////////////// + +#ifdef _DEBUG + std::char_traits::copy(config.Name, "_fontMonoNumbers", std::size(config.Name)); +#endif + + // 等宽的数字字符 + config.GlyphMinAdvanceX = config.GlyphMaxAdvanceX = fontSize * 0.42f; + _fontMonoNumbers = fontAtlas.AddFontFromMemoryTTF( + (void*)fontData.data(), (int)fontData.size(), fontSize, &config, ImGuiHelper::NUMBER_RANGES); + + // 其他不等宽的字符 + config.MergeMode = true; + config.GlyphMinAdvanceX = 0; + config.GlyphMaxAdvanceX = std::numeric_limits::max(); + fontAtlas.AddFontFromMemoryTTF( + (void*)fontData.data(), (int)fontData.size(), fontSize, &config, ImGuiHelper::NOT_NUMBER_RANGES); +} + +void OverlayDrawer::_BuildFontFPS(const std::vector& fontData) noexcept { + ImFontAtlas& fontAtlas = *ImGui::GetIO().Fonts; + + ImFontConfig config; + config.FontDataOwnedByAtlas = false; + + const float fpsSize = 24 * _dpiScale; + + ////////////////////////////////////////////////////////// + // + // NUMBER_RANGES + " FPS" -> _fontFPS + // + ////////////////////////////////////////////////////////// + +#ifdef _DEBUG + std::char_traits::copy(config.Name, "_fontFPS", std::size(config.Name)); +#endif + + // 等宽的数字字符 + config.MergeMode = false; + config.GlyphMinAdvanceX = config.GlyphMaxAdvanceX = fpsSize * 0.42f; + _fontFPS = fontAtlas.AddFontFromMemoryTTF( + (void*)fontData.data(), (int)fontData.size(), fpsSize, &config, ImGuiHelper::NUMBER_RANGES); + + // 其他不等宽的字符 + config.MergeMode = true; + config.GlyphMinAdvanceX = 0; + config.GlyphMaxAdvanceX = std::numeric_limits::max(); + fontAtlas.AddFontFromMemoryTTF( + (void*)fontData.data(), (int)fontData.size(), fpsSize, &config, (const ImWchar*)L" FFPPSS"); +} + +int OverlayDrawer::_DrawEffectTimings(const _EffectTimings& et, bool showPasses, float maxWindowWidth, std::span colors, bool singleEffect) noexcept { + return 0; +} + +void OverlayDrawer::_DrawTimelineItem(ImU32 color, float dpiScale, std::string_view name, float time, float effectsTotalTime, bool selected) { +} + +void OverlayDrawer::_DrawFPS() noexcept { +} + +void OverlayDrawer::_DrawUI() noexcept { +} + +void OverlayDrawer::_EnableSrcWnd(bool enable) noexcept { +} + +const std::string& OverlayDrawer::_GetResourceString(const std::wstring_view& key) noexcept { + // TODO: 在此处插入 return 语句 + static std::string t; + return t; +} + +} diff --git a/src/Magpie.Core/OverlayDrawer.h b/src/Magpie.Core/OverlayDrawer.h new file mode 100644 index 000000000..e20fd89d4 --- /dev/null +++ b/src/Magpie.Core/OverlayDrawer.h @@ -0,0 +1,71 @@ +#pragma once +#include +#include "SmallVector.h" +#include +#include "ImGuiImpl.h" + +namespace Magpie::Core { + +class OverlayDrawer { +public: + OverlayDrawer() = default; + OverlayDrawer(const OverlayDrawer&) = delete; + OverlayDrawer(OverlayDrawer&&) = delete; + + bool Initialize(DeviceResources* deviceResources) noexcept; + + void Draw() noexcept; + + bool IsUIVisiable() const noexcept { + return _isUIVisiable; + } + + void SetUIVisibility(bool value) noexcept; + +private: + bool _BuildFonts() noexcept; + void _BuildFontUI(std::wstring_view language, const std::vector& fontData, ImVector& uiRanges) noexcept; + void _BuildFontFPS(const std::vector& fontData) noexcept; + + struct _EffectTimings { + const struct EffectDesc* desc = nullptr; + std::span passTimings; + float totalTime = 0.0f; + }; + + int _DrawEffectTimings(const _EffectTimings& et, bool showPasses, float maxWindowWidth, std::span colors, bool singleEffect) noexcept; + + void _DrawTimelineItem(ImU32 color, float dpiScale, std::string_view name, float time, float effectsTotalTime, bool selected = false); + + void _DrawFPS() noexcept; + + void _DrawUI() noexcept; + + void _EnableSrcWnd(bool enable) noexcept; + + const std::string& _GetResourceString(const std::wstring_view& key) noexcept; + + float _dpiScale = 1.0f; + + ImFont* _fontUI = nullptr; // 普通 UI 文字 + ImFont* _fontMonoNumbers = nullptr; // 普通 UI 文字,但数字部分是等宽的,只支持 ASCII + ImFont* _fontFPS = nullptr; // FPS + + std::deque _frameTimes; + uint32_t _validFrames = 0; + + SmallVector _timelineColors; + + struct { + std::string gpuName; + } _hardwareInfo; + + ImGuiImpl _imguiImpl; + + winrt::ResourceLoader _resourceLoader = winrt::ResourceLoader::GetForViewIndependentUse(); + + bool _isUIVisiable = false; + bool _isSrcMainWnd = false; +}; + +} diff --git a/src/Magpie.Core/Renderer.cpp b/src/Magpie.Core/Renderer.cpp index 5f1cfcabc..c505ab9a8 100644 --- a/src/Magpie.Core/Renderer.cpp +++ b/src/Magpie.Core/Renderer.cpp @@ -13,6 +13,7 @@ #include "DirectXHelper.h" #include #include "ScalingWindow.h" +#include "OverlayDrawer.h" namespace Magpie::Core { @@ -82,6 +83,14 @@ bool Renderer::Initialize() noexcept { return false; } + if (ScalingWindow::Get().Options().IsShowFPS()) { + _overlayDrawer.reset(new OverlayDrawer()); + if (!_overlayDrawer->Initialize(&_frontendResources)) { + Logger::Get().Error("初始化 OverlayDrawer 失败"); + return false; + } + } + return true; } @@ -229,6 +238,14 @@ void Renderer::Render(HCURSOR hCursor, POINT cursorPos) noexcept { _frontendSharedTextureMutex->ReleaseSync(_lastAccessMutexKey); + // 叠加层和光标都绘制到 back buffer + d3dDC->OMSetRenderTargets(1, &backBufferRtv, nullptr); + + // 绘制叠加层 + if (_overlayDrawer) { + _overlayDrawer->Draw(); + } + // 绘制光标 _cursorDrawer.Draw(hCursor, cursorPos); @@ -239,6 +256,27 @@ void Renderer::Render(HCURSOR hCursor, POINT cursorPos) noexcept { d3dDC->DiscardView(backBufferRtv); } +void Renderer::ToggleOverlay() noexcept { + if (!_overlayDrawer) { + _overlayDrawer = std::make_unique(); + if (!_overlayDrawer->Initialize(&_frontendResources)) { + _overlayDrawer.reset(); + Logger::Get().Error("初始化 OverlayDrawer 失败"); + return; + } + } + + if (_overlayDrawer->IsUIVisiable()) { + _overlayDrawer->SetUIVisibility(false); + } else { + _overlayDrawer->SetUIVisibility(true); + } +} + +bool Renderer::IsOverlayVisible() noexcept { + return _overlayDrawer && _overlayDrawer->IsUIVisiable(); +} + bool Renderer::_InitFrameSource() noexcept { switch (ScalingWindow::Get().Options().captureMethod) { case CaptureMethod::GraphicsCapture: diff --git a/src/Magpie.Core/Renderer.h b/src/Magpie.Core/Renderer.h index 8348406c1..affd15455 100644 --- a/src/Magpie.Core/Renderer.h +++ b/src/Magpie.Core/Renderer.h @@ -7,8 +7,6 @@ namespace Magpie::Core { -struct ScalingOptions; - class Renderer { public: Renderer() noexcept; @@ -21,10 +19,15 @@ class Renderer { void Render(HCURSOR hCursor, POINT cursorPos) noexcept; + void ToggleOverlay() noexcept; + + bool IsOverlayVisible() noexcept; + const RECT& SrcRect() const noexcept { return _srcRect; } + // 屏幕坐标而不是窗口局部坐标 const RECT& DestRect() const noexcept { return _destRect; } @@ -56,6 +59,7 @@ class Renderer { uint64_t _lastAccessMutexKey = 0; CursorDrawer _cursorDrawer; + std::unique_ptr _overlayDrawer; HCURSOR _lastCursorHandle = NULL; POINT _lastCursorPos{ std::numeric_limits::max(), std::numeric_limits::max() }; diff --git a/src/Magpie.Core/ScalingRuntime.cpp b/src/Magpie.Core/ScalingRuntime.cpp index 23a4a6455..61add0da2 100644 --- a/src/Magpie.Core/ScalingRuntime.cpp +++ b/src/Magpie.Core/ScalingRuntime.cpp @@ -41,7 +41,7 @@ void ScalingRuntime::ToggleOverlay() { _EnsureDispatcherQueue(); _dqc.DispatcherQueue().TryEnqueue([]() { - //MagApp::Get().ToggleOverlay(); + ScalingWindow::Get().ToggleOverlay(); }); } diff --git a/src/Magpie.Core/ScalingWindow.cpp b/src/Magpie.Core/ScalingWindow.cpp index 097b4d904..3fb74a89f 100644 --- a/src/Magpie.Core/ScalingWindow.cpp +++ b/src/Magpie.Core/ScalingWindow.cpp @@ -185,10 +185,6 @@ bool ScalingWindow::Create(HINSTANCE hInstance, HWND hwndSrc, ScalingOptions&& o return false; } - _cursorManager->CursorVisibilityChanged([this](bool isVisible) { - _renderer->OnCursorVisibilityChanged(isVisible); - }); - ShowWindow(_hWnd, SW_SHOWMAXIMIZED); return true; @@ -207,6 +203,10 @@ void ScalingWindow::Render() noexcept { _renderer->Render(cursorInfo.first, cursorInfo.second); } +void ScalingWindow::ToggleOverlay() noexcept { + _renderer->ToggleOverlay(); +} + LRESULT ScalingWindow::_MessageHandler(UINT msg, WPARAM wParam, LPARAM lParam) noexcept { switch (msg) { case WM_DESTROY: diff --git a/src/Magpie.Core/ScalingWindow.h b/src/Magpie.Core/ScalingWindow.h index 7b30f352a..e8b71e53d 100644 --- a/src/Magpie.Core/ScalingWindow.h +++ b/src/Magpie.Core/ScalingWindow.h @@ -17,6 +17,8 @@ class ScalingWindow : public WindowBase { void Render() noexcept; + void ToggleOverlay() noexcept; + const RECT& WndRect() const noexcept { return _wndRect; } From 9b16c5254924082fb9b5bc8ba0b14bc615afee4a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=97=AD?= <34770031+Blinue@users.noreply.github.com> Date: Sun, 9 Jul 2023 18:55:21 +0800 Subject: [PATCH 066/155] =?UTF-8?q?chore:=20=E6=9B=B4=E6=96=B0=E4=BE=9D?= =?UTF-8?q?=E8=B5=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Magpie.App/Magpie.App.vcxproj | 8 ++++---- src/Magpie.App/packages.config | 2 +- src/Magpie.Core/ImGuiImpl.cpp | 4 ++-- src/Magpie.Core/Magpie.Core.vcxproj | 8 ++++---- src/Magpie.Core/OverlayDrawer.cpp | 8 ++++---- src/Magpie.Core/packages.config | 2 +- src/Magpie/Magpie.vcxproj | 8 ++++---- src/Magpie/packages.config | 2 +- 8 files changed, 21 insertions(+), 21 deletions(-) diff --git a/src/Magpie.App/Magpie.App.vcxproj b/src/Magpie.App/Magpie.App.vcxproj index 562b3b61a..e827ac7ed 100644 --- a/src/Magpie.App/Magpie.App.vcxproj +++ b/src/Magpie.App/Magpie.App.vcxproj @@ -1,6 +1,6 @@ - + true @@ -593,7 +593,7 @@ - + @@ -602,7 +602,7 @@ - - + + \ No newline at end of file diff --git a/src/Magpie.App/packages.config b/src/Magpie.App/packages.config index fddd0f7a7..fe1a84260 100644 --- a/src/Magpie.App/packages.config +++ b/src/Magpie.App/packages.config @@ -2,5 +2,5 @@ - + \ No newline at end of file diff --git a/src/Magpie.Core/ImGuiImpl.cpp b/src/Magpie.Core/ImGuiImpl.cpp index 120e6294f..042085147 100644 --- a/src/Magpie.Core/ImGuiImpl.cpp +++ b/src/Magpie.Core/ImGuiImpl.cpp @@ -189,7 +189,7 @@ void ImGuiImpl::BeginFrame() { io.AddKeyEvent(ImGuiKey_Enter, false); } - bool originWantCaptureMouse = io.WantCaptureMouse; + //bool originWantCaptureMouse = io.WantCaptureMouse; _backend.BeginFrame(); ImGui::NewFrame(); @@ -248,7 +248,7 @@ void ImGuiImpl::EndFrame() { _backend.RenderDrawData(ImGui::GetDrawData()); } -void ImGuiImpl::Tooltip(const char* content, float maxWidth) { +void ImGuiImpl::Tooltip(const char* /*content*/, float /*maxWidth*/) { /*ImVec2 padding = ImGui::GetStyle().WindowPadding; ImVec2 contentSize = ImGui::CalcTextSize(content, nullptr, false, maxWidth - 2 * padding.x); ImVec2 windowSize(contentSize.x + 2 * padding.x, contentSize.y + 2 * padding.y); diff --git a/src/Magpie.Core/Magpie.Core.vcxproj b/src/Magpie.Core/Magpie.Core.vcxproj index 366c579f0..a1d63e868 100644 --- a/src/Magpie.Core/Magpie.Core.vcxproj +++ b/src/Magpie.Core/Magpie.Core.vcxproj @@ -1,6 +1,6 @@ - + Debug @@ -179,13 +179,13 @@ - + 这台计算机上缺少此项目引用的 NuGet 程序包。使用“NuGet 程序包还原”可下载这些程序包。有关更多信息,请参见 http://go.microsoft.com/fwlink/?LinkID=322105。缺少的文件是 {0}。 - - + + \ No newline at end of file diff --git a/src/Magpie.Core/OverlayDrawer.cpp b/src/Magpie.Core/OverlayDrawer.cpp index 0042b0400..ddf85cc88 100644 --- a/src/Magpie.Core/OverlayDrawer.cpp +++ b/src/Magpie.Core/OverlayDrawer.cpp @@ -307,11 +307,11 @@ void OverlayDrawer::_BuildFontFPS(const std::vector& fontData) noexcept (void*)fontData.data(), (int)fontData.size(), fpsSize, &config, (const ImWchar*)L" FFPPSS"); } -int OverlayDrawer::_DrawEffectTimings(const _EffectTimings& et, bool showPasses, float maxWindowWidth, std::span colors, bool singleEffect) noexcept { +int OverlayDrawer::_DrawEffectTimings(const _EffectTimings& /*et*/, bool /*showPasses*/, float /*maxWindowWidth*/, std::span /*colors*/, bool /*singleEffect*/) noexcept { return 0; } -void OverlayDrawer::_DrawTimelineItem(ImU32 color, float dpiScale, std::string_view name, float time, float effectsTotalTime, bool selected) { +void OverlayDrawer::_DrawTimelineItem(ImU32 /*color*/, float /*dpiScale*/, std::string_view /*name*/, float /*time*/, float /*effectsTotalTime*/, bool /*selected*/) { } void OverlayDrawer::_DrawFPS() noexcept { @@ -320,10 +320,10 @@ void OverlayDrawer::_DrawFPS() noexcept { void OverlayDrawer::_DrawUI() noexcept { } -void OverlayDrawer::_EnableSrcWnd(bool enable) noexcept { +void OverlayDrawer::_EnableSrcWnd(bool /*enable*/) noexcept { } -const std::string& OverlayDrawer::_GetResourceString(const std::wstring_view& key) noexcept { +const std::string& OverlayDrawer::_GetResourceString(const std::wstring_view& /*key*/) noexcept { // TODO: 在此处插入 return 语句 static std::string t; return t; diff --git a/src/Magpie.Core/packages.config b/src/Magpie.Core/packages.config index 0002a2e3a..1b8cfbd96 100644 --- a/src/Magpie.Core/packages.config +++ b/src/Magpie.Core/packages.config @@ -1,4 +1,4 @@  - + \ No newline at end of file diff --git a/src/Magpie/Magpie.vcxproj b/src/Magpie/Magpie.vcxproj index 5ce0261bf..3ceac028f 100644 --- a/src/Magpie/Magpie.vcxproj +++ b/src/Magpie/Magpie.vcxproj @@ -1,6 +1,6 @@ - + @@ -131,7 +131,7 @@ - + @@ -140,7 +140,7 @@ - - + + \ No newline at end of file diff --git a/src/Magpie/packages.config b/src/Magpie/packages.config index fddd0f7a7..fe1a84260 100644 --- a/src/Magpie/packages.config +++ b/src/Magpie/packages.config @@ -2,5 +2,5 @@ - + \ No newline at end of file From fd06ecc6a96a807ed5bdf5b02a9ebea8e67f8d4c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=97=AD?= <34770031+Blinue@users.noreply.github.com> Date: Sun, 9 Jul 2023 19:57:38 +0800 Subject: [PATCH 067/155] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E5=8F=A0?= =?UTF-8?q?=E5=8A=A0=E5=B1=82=E4=B8=8D=E4=BC=9A=E7=AB=8B=E5=88=BB=E6=98=BE?= =?UTF-8?q?=E7=A4=BA=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Magpie.Core/OverlayDrawer.cpp | 6 ++++++ src/Magpie.Core/OverlayDrawer.h | 2 ++ src/Magpie.Core/Renderer.cpp | 35 ++++++++++++++++++------------- src/Magpie.Core/Renderer.h | 2 ++ src/Magpie.Core/conanfile.txt | 1 - 5 files changed, 31 insertions(+), 15 deletions(-) diff --git a/src/Magpie.Core/OverlayDrawer.cpp b/src/Magpie.Core/OverlayDrawer.cpp index ddf85cc88..199e231cb 100644 --- a/src/Magpie.Core/OverlayDrawer.cpp +++ b/src/Magpie.Core/OverlayDrawer.cpp @@ -59,6 +59,12 @@ void OverlayDrawer::Draw() noexcept { return; } + if (_isFirstFrame) { + // ImGui 的第一帧不会显示,我们连续渲染两帧 + _isFirstFrame = false; + Draw(); + } + _imguiImpl.BeginFrame(); ImGui::ShowDemoWindow(); diff --git a/src/Magpie.Core/OverlayDrawer.h b/src/Magpie.Core/OverlayDrawer.h index e20fd89d4..faa5d20d5 100644 --- a/src/Magpie.Core/OverlayDrawer.h +++ b/src/Magpie.Core/OverlayDrawer.h @@ -66,6 +66,8 @@ class OverlayDrawer { bool _isUIVisiable = false; bool _isSrcMainWnd = false; + + bool _isFirstFrame = true; }; } diff --git a/src/Magpie.Core/Renderer.cpp b/src/Magpie.Core/Renderer.cpp index c505ab9a8..87672b2de 100644 --- a/src/Magpie.Core/Renderer.cpp +++ b/src/Magpie.Core/Renderer.cpp @@ -183,18 +183,7 @@ bool Renderer::_CreateSwapChain() noexcept { return true; } -void Renderer::Render(HCURSOR hCursor, POINT cursorPos) noexcept { - // 有新帧或光标改变则渲染新的帧 - if (_lastAccessMutexKey == _sharedTextureMutexKey) { - if (_lastAccessMutexKey == 0 || (hCursor == _lastCursorHandle && cursorPos == _lastCursorPos)) { - // 第一帧尚未完成或光标没有移动 - return; - } - } - - _lastCursorHandle = hCursor; - _lastCursorPos = cursorPos; - +void Renderer::_FrontendRender() noexcept { WaitForSingleObjectEx(_frameLatencyWaitableObject.get(), 1000, TRUE); ID3D11DeviceContext4* d3dDC = _frontendResources.GetD3DDC(); @@ -228,7 +217,7 @@ void Renderer::Render(HCURSOR hCursor, POINT cursorPos) noexcept { _backBuffer.get(), 0, _destRect.left - scalingWndRect.left, - _destRect.top- scalingWndRect.top, + _destRect.top - scalingWndRect.top, 0, _frontendSharedTexture.get(), 0, @@ -247,7 +236,7 @@ void Renderer::Render(HCURSOR hCursor, POINT cursorPos) noexcept { } // 绘制光标 - _cursorDrawer.Draw(hCursor, cursorPos); + _cursorDrawer.Draw(_lastCursorHandle, _lastCursorPos); // 两个垂直同步之间允许渲染数帧,SyncInterval = 0 只呈现最新的一帧,旧帧被丢弃 _swapChain->Present(0, 0); @@ -256,6 +245,21 @@ void Renderer::Render(HCURSOR hCursor, POINT cursorPos) noexcept { d3dDC->DiscardView(backBufferRtv); } +void Renderer::Render(HCURSOR hCursor, POINT cursorPos) noexcept { + // 有新帧或光标改变则渲染新的帧 + if (_lastAccessMutexKey == _sharedTextureMutexKey) { + if (_lastAccessMutexKey == 0 || (hCursor == _lastCursorHandle && cursorPos == _lastCursorPos)) { + // 第一帧尚未完成或光标没有移动 + return; + } + } + + _lastCursorHandle = hCursor; + _lastCursorPos = cursorPos; + + _FrontendRender(); +} + void Renderer::ToggleOverlay() noexcept { if (!_overlayDrawer) { _overlayDrawer = std::make_unique(); @@ -271,6 +275,9 @@ void Renderer::ToggleOverlay() noexcept { } else { _overlayDrawer->SetUIVisibility(true); } + + // 立即渲染一帧 + _FrontendRender(); } bool Renderer::IsOverlayVisible() noexcept { diff --git a/src/Magpie.Core/Renderer.h b/src/Magpie.Core/Renderer.h index affd15455..cb57b740c 100644 --- a/src/Magpie.Core/Renderer.h +++ b/src/Magpie.Core/Renderer.h @@ -37,6 +37,8 @@ class Renderer { private: bool _CreateSwapChain() noexcept; + void _FrontendRender() noexcept; + void _BackendThreadProc() noexcept; ID3D11Texture2D* _InitBackend() noexcept; diff --git a/src/Magpie.Core/conanfile.txt b/src/Magpie.Core/conanfile.txt index 91d9a0bda..9908f7232 100644 --- a/src/Magpie.Core/conanfile.txt +++ b/src/Magpie.Core/conanfile.txt @@ -13,4 +13,3 @@ visual_studio fmt:header_only=True spdlog:header_only=True spdlog:no_exceptions=True - From e293bcd1b28d774fbfd5af303d9ececdee82426d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=97=AD?= <34770031+Blinue@users.noreply.github.com> Date: Sun, 9 Jul 2023 23:16:50 +0800 Subject: [PATCH 068/155] =?UTF-8?q?refactor:=20=E4=BD=BF=E7=94=A8=20Cursor?= =?UTF-8?q?Manager=20=E8=8E=B7=E5=8F=96=E5=85=89=E6=A0=87=E4=BF=A1?= =?UTF-8?q?=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Magpie.Core/CursorDrawer.cpp | 11 +++++++++-- src/Magpie.Core/CursorDrawer.h | 2 +- src/Magpie.Core/CursorManager.cpp | 33 +++++++++++++------------------ src/Magpie.Core/CursorManager.h | 14 ++++++++++++- src/Magpie.Core/ImGuiImpl.cpp | 22 +++++++++++++++------ src/Magpie.Core/Renderer.cpp | 18 +++++++++++++---- src/Magpie.Core/Renderer.h | 2 +- src/Magpie.Core/ScalingWindow.cpp | 4 ++-- src/Magpie.Core/ScalingWindow.h | 4 +++- 9 files changed, 73 insertions(+), 37 deletions(-) diff --git a/src/Magpie.Core/CursorDrawer.cpp b/src/Magpie.Core/CursorDrawer.cpp index cf637a061..fc7413388 100644 --- a/src/Magpie.Core/CursorDrawer.cpp +++ b/src/Magpie.Core/CursorDrawer.cpp @@ -13,6 +13,7 @@ #include "Win32Utils.h" #include "ScalingWindow.h" #include "Renderer.h" +#include "CursorManager.h" using namespace DirectX; @@ -97,7 +98,10 @@ bool CursorDrawer::Initialize(DeviceResources& deviceResources, ID3D11Texture2D* return true; } -void CursorDrawer::Draw(HCURSOR hCursor, POINT cursorPos) noexcept { +void CursorDrawer::Draw() noexcept { + const CursorManager& cursorManager = ScalingWindow::Get().CursorManager(); + const HCURSOR hCursor = cursorManager.Cursor(); + if (!hCursor) { return; } @@ -107,8 +111,10 @@ void CursorDrawer::Draw(HCURSOR hCursor, POINT cursorPos) noexcept { return; } + const POINT cursorPos = cursorManager.CursorPos(); + const float cursorScaling = ScalingWindow::Get().Options().cursorScaling; - SIZE cursorSize{ lroundf(ci->size.cx * cursorScaling), lroundf(ci->size.cy * cursorScaling) }; + const SIZE cursorSize{ lroundf(ci->size.cx * cursorScaling), lroundf(ci->size.cy * cursorScaling) }; RECT cursorRect; cursorRect.left = lroundf(cursorPos.x - ci->hotSpot.x * cursorScaling); cursorRect.top = lroundf(cursorPos.y - ci->hotSpot.y * cursorScaling); @@ -168,6 +174,7 @@ void CursorDrawer::Draw(HCURSOR hCursor, POINT cursorPos) noexcept { 1.0f }; d3dDC->RSSetViewports(1, &vp); + d3dDC->RSSetState(nullptr); } CursorInterpolationMode interpolationMode = ScalingWindow::Get().Options().cursorInterpolationMode; diff --git a/src/Magpie.Core/CursorDrawer.h b/src/Magpie.Core/CursorDrawer.h index 6789d81e2..3c961fec2 100644 --- a/src/Magpie.Core/CursorDrawer.h +++ b/src/Magpie.Core/CursorDrawer.h @@ -14,7 +14,7 @@ class CursorDrawer { bool Initialize(DeviceResources& deviceResources, ID3D11Texture2D* backBuffer) noexcept; - void Draw(HCURSOR hCursor, POINT cursorPos) noexcept; + void Draw() noexcept; private: enum class _CursorType { diff --git a/src/Magpie.Core/CursorManager.cpp b/src/Magpie.Core/CursorManager.cpp index beeeb51a8..1b25c28a2 100644 --- a/src/Magpie.Core/CursorManager.cpp +++ b/src/Magpie.Core/CursorManager.cpp @@ -13,7 +13,7 @@ namespace Magpie::Core { // 将源窗口的光标位置映射到缩放后的光标位置 // 当光标位于源窗口之外,与源窗口的距离不会缩放 -static POINT SrcToScaling(POINT pt, bool screenCoord) noexcept { +static POINT SrcToScaling(POINT pt) noexcept { const Renderer& renderer = ScalingWindow::Get().Renderer(); const RECT& srcRect = renderer.SrcRect(); const RECT& destRect = renderer.DestRect(); @@ -39,11 +39,6 @@ static POINT SrcToScaling(POINT pt, bool screenCoord) noexcept { result.y = std::lround(pos * (destRect.bottom - destRect.top - 1)) + destRect.top; } - if (!screenCoord) { - result.x -= scalingRect.left; - result.y -= scalingRect.top; - } - return result; } @@ -104,33 +99,33 @@ bool CursorManager::Initialize() noexcept { return true; } -std::pair CursorManager::Update() noexcept { +void CursorManager::Update() noexcept { _UpdateCursorClip(); - std::pair result{NULL, - { std::numeric_limits::max(), std::numeric_limits::max() }}; + _hCursor = NULL; const ScalingOptions& options = ScalingWindow::Get().Options(); if (!options.IsDrawCursor() || !_isUnderCapture) { // 不绘制光标 - return result; + return; } CURSORINFO ci{ sizeof(CURSORINFO) }; if (!GetCursorInfo(&ci)) { Logger::Get().Win32Error("GetCursorPos 失败"); - return result; + return; } if (ci.hCursor && ci.flags != CURSOR_SHOWING) { - return result; + return; } - result.first = ci.hCursor; - result.second = SrcToScaling(ci.ptScreenPos, false); - - return result; + _hCursor = ci.hCursor; + _cursorPos = SrcToScaling(ci.ptScreenPos); + const RECT& scalingRect = ScalingWindow::Get().WndRect(); + _cursorPos.x -= scalingRect.left; + _cursorPos.y -= scalingRect.top; } void CursorManager::_ShowSystemCursor(bool show) { @@ -326,7 +321,7 @@ void CursorManager::_UpdateCursorClip() noexcept { // /////////////////////////////////////////////////////////// - HWND hwndCur = WindowFromPoint(hwndScaling, scalingRect, SrcToScaling(cursorPos, true), false); + HWND hwndCur = WindowFromPoint(hwndScaling, scalingRect, SrcToScaling(cursorPos), false); if (hwndCur != hwndScaling) { // 主窗口被遮挡 @@ -460,7 +455,7 @@ void CursorManager::_UpdateCursorClip() noexcept { // 处理屏幕之间存在间隙的情况。解决办法是 _StopCapture 只在目标位置存在屏幕时才取消捕获, // 当光标试图移动到间隙中时将被挡住。如果光标的速度足以跨越间隙,则它依然可以在屏幕间移动。 ::GetCursorPos(&cursorPos); - POINT hostPos = false ? cursorPos : SrcToScaling(cursorPos, true); + POINT hostPos = false ? cursorPos : SrcToScaling(cursorPos); RECT clips{ LONG_MIN, LONG_MIN, LONG_MAX, LONG_MAX }; @@ -556,7 +551,7 @@ void CursorManager::_StopCapture(POINT cursorPos, bool onDestroy) noexcept { // // 在有黑边的情况下自动将光标调整到全屏窗口外 - POINT newCursorPos = SrcToScaling(cursorPos, true); + POINT newCursorPos = SrcToScaling(cursorPos); if (onDestroy || MonitorFromPoint(newCursorPos, MONITOR_DEFAULTTONULL)) { SetCursorPos(newCursorPos.x, newCursorPos.y); diff --git a/src/Magpie.Core/CursorManager.h b/src/Magpie.Core/CursorManager.h index 69ee463cd..a5e61ee64 100644 --- a/src/Magpie.Core/CursorManager.h +++ b/src/Magpie.Core/CursorManager.h @@ -12,7 +12,16 @@ class CursorManager { bool Initialize() noexcept; - std::pair Update() noexcept; + void Update() noexcept; + + HCURSOR Cursor() const noexcept { + return _hCursor; + } + + // 缩放窗口局部坐标 + POINT CursorPos() const noexcept { + return _cursorPos; + } private: void _ShowSystemCursor(bool show); @@ -25,6 +34,9 @@ class CursorManager { void _StopCapture(POINT cursorPos, bool onDestroy = false) noexcept; + HCURSOR _hCursor = NULL; + POINT _cursorPos{}; + RECT _curClips{}; int _originCursorSpeed = 0; diff --git a/src/Magpie.Core/ImGuiImpl.cpp b/src/Magpie.Core/ImGuiImpl.cpp index 042085147..b7fcda279 100644 --- a/src/Magpie.Core/ImGuiImpl.cpp +++ b/src/Magpie.Core/ImGuiImpl.cpp @@ -9,6 +9,7 @@ #include "Logger.h" #include "Win32Utils.h" #include "ScalingWindow.h" +#include "CursorManager.h" namespace Magpie::Core { @@ -276,9 +277,9 @@ void ImGuiImpl::Tooltip(const char* /*content*/, float /*maxWidth*/) { } void ImGuiImpl::_UpdateMousePos() noexcept { - /*ImGuiIO& io = ImGui::GetIO(); + ImGuiIO& io = ImGui::GetIO(); - if (MagApp::Get().GetOptions().Is3DGameMode() && !MagApp::Get().GetRenderer().IsUIVisiable()) { + /*if (ScalingWindow::Get().Options().Is3DGameMode() && !MagApp::Get().GetRenderer().IsUIVisiable()) { io.MousePos = ImVec2(-FLT_MAX, -FLT_MAX); return; } @@ -298,13 +299,22 @@ void ImGuiImpl::_UpdateMousePos() noexcept { const RECT& hostRect = MagApp::Get().GetHostWndRect(); pos.x -= hostRect.left; pos.y -= hostRect.top; + }*/ + + const CursorManager& cursorManager = ScalingWindow::Get().CursorManager(); + if (!cursorManager.Cursor()) { + io.MousePos = ImVec2(-FLT_MAX, -FLT_MAX); + return; } - const RECT& outputRect = MagApp::Get().GetRenderer().GetOutputRect(); - pos.x -= outputRect.left; - pos.y -= outputRect.top; + const POINT cursorPos = cursorManager.CursorPos(); + const RECT& scalingRect = ScalingWindow::Get().WndRect(); + const RECT& destRect = ScalingWindow::Get().Renderer().DestRect(); - io.MousePos = ImVec2((float)pos.x, (float)pos.y);*/ + io.MousePos = ImVec2( + float(cursorPos.x + scalingRect.left - destRect.left), + float(cursorPos.y + scalingRect.top - destRect.top) + ); } void ImGuiImpl::ClearStates() { diff --git a/src/Magpie.Core/Renderer.cpp b/src/Magpie.Core/Renderer.cpp index 87672b2de..dc3c34317 100644 --- a/src/Magpie.Core/Renderer.cpp +++ b/src/Magpie.Core/Renderer.cpp @@ -14,6 +14,7 @@ #include #include "ScalingWindow.h" #include "OverlayDrawer.h" +#include "CursorManager.h" namespace Magpie::Core { @@ -236,7 +237,7 @@ void Renderer::_FrontendRender() noexcept { } // 绘制光标 - _cursorDrawer.Draw(_lastCursorHandle, _lastCursorPos); + _cursorDrawer.Draw(); // 两个垂直同步之间允许渲染数帧,SyncInterval = 0 只呈现最新的一帧,旧帧被丢弃 _swapChain->Present(0, 0); @@ -245,11 +246,20 @@ void Renderer::_FrontendRender() noexcept { d3dDC->DiscardView(backBufferRtv); } -void Renderer::Render(HCURSOR hCursor, POINT cursorPos) noexcept { +void Renderer::Render() noexcept { + const CursorManager& cursorManager = ScalingWindow::Get().CursorManager(); + const HCURSOR hCursor = cursorManager.Cursor(); + const POINT cursorPos = cursorManager.CursorPos(); + // 有新帧或光标改变则渲染新的帧 if (_lastAccessMutexKey == _sharedTextureMutexKey) { - if (_lastAccessMutexKey == 0 || (hCursor == _lastCursorHandle && cursorPos == _lastCursorPos)) { - // 第一帧尚未完成或光标没有移动 + if (_lastAccessMutexKey == 0) { + // 第一帧尚未完成 + return; + } + + if (hCursor == _lastCursorHandle && (!hCursor || cursorPos == _lastCursorPos)) { + // 光标没有移动 return; } } diff --git a/src/Magpie.Core/Renderer.h b/src/Magpie.Core/Renderer.h index cb57b740c..b37fa1a0d 100644 --- a/src/Magpie.Core/Renderer.h +++ b/src/Magpie.Core/Renderer.h @@ -17,7 +17,7 @@ class Renderer { bool Initialize() noexcept; - void Render(HCURSOR hCursor, POINT cursorPos) noexcept; + void Render() noexcept; void ToggleOverlay() noexcept; diff --git a/src/Magpie.Core/ScalingWindow.cpp b/src/Magpie.Core/ScalingWindow.cpp index 3fb74a89f..ee1ccc45d 100644 --- a/src/Magpie.Core/ScalingWindow.cpp +++ b/src/Magpie.Core/ScalingWindow.cpp @@ -199,8 +199,8 @@ void ScalingWindow::Render() noexcept { return; } - std::pair cursorInfo = _cursorManager->Update(); - _renderer->Render(cursorInfo.first, cursorInfo.second); + _cursorManager->Update(); + _renderer->Render(); } void ScalingWindow::ToggleOverlay() noexcept { diff --git a/src/Magpie.Core/ScalingWindow.h b/src/Magpie.Core/ScalingWindow.h index e8b71e53d..28717eeeb 100644 --- a/src/Magpie.Core/ScalingWindow.h +++ b/src/Magpie.Core/ScalingWindow.h @@ -4,6 +4,8 @@ namespace Magpie::Core { +class CursorManager; + class ScalingWindow : public WindowBase { friend class base_type; @@ -35,7 +37,7 @@ class ScalingWindow : public WindowBase { return *_renderer; } - class CursorManager& CursorManager() noexcept { + CursorManager& CursorManager() noexcept { return *_cursorManager; } From a9414a603de1c7d863204ac5b7623b0ecccd2387 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=97=AD?= <34770031+Blinue@users.noreply.github.com> Date: Mon, 10 Jul 2023 20:48:06 +0800 Subject: [PATCH 069/155] =?UTF-8?q?feat:=20=E4=BC=98=E5=8C=96=E5=85=89?= =?UTF-8?q?=E6=A0=87=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Magpie.Core/CursorManager.cpp | 106 ++++++++++++++---------------- src/Magpie.Core/CursorManager.h | 9 ++- src/Magpie.Core/ImGuiImpl.cpp | 14 ++-- src/Magpie.Core/Renderer.cpp | 2 +- src/Magpie.Core/ScalingWindow.cpp | 39 +++++++++++ 5 files changed, 104 insertions(+), 66 deletions(-) diff --git a/src/Magpie.Core/CursorManager.cpp b/src/Magpie.Core/CursorManager.cpp index 1b25c28a2..d2af946b7 100644 --- a/src/Magpie.Core/CursorManager.cpp +++ b/src/Magpie.Core/CursorManager.cpp @@ -103,14 +103,21 @@ void CursorManager::Update() noexcept { _UpdateCursorClip(); _hCursor = NULL; + _cursorPos = { std::numeric_limits::max(),std::numeric_limits::max() }; const ScalingOptions& options = ScalingWindow::Get().Options(); - if (!options.IsDrawCursor() || !_isUnderCapture) { - // 不绘制光标 + if (!options.IsDrawCursor()) { return; } + if (!_isUnderCapture) { + // 不处于捕获状态如果叠加层已开启也更新光标位置 + if (!(_isOnScalingWindow && ScalingWindow::Get().Renderer().IsOverlayVisible())) { + return; + } + } + CURSORINFO ci{ sizeof(CURSORINFO) }; if (!GetCursorInfo(&ci)) { Logger::Get().Win32Error("GetCursorPos 失败"); @@ -121,13 +128,24 @@ void CursorManager::Update() noexcept { return; } - _hCursor = ci.hCursor; - _cursorPos = SrcToScaling(ci.ptScreenPos); + // 不处于捕获状态置为 NULL + _hCursor = _isUnderCapture ? ci.hCursor : NULL; + _cursorPos = _isUnderCapture ? SrcToScaling(ci.ptScreenPos) : ci.ptScreenPos; const RECT& scalingRect = ScalingWindow::Get().WndRect(); _cursorPos.x -= scalingRect.left; _cursorPos.y -= scalingRect.top; } +void CursorManager::OnCursorHoverOverlay() noexcept { + _isOnOverlay = true; + _UpdateCursorClip(); +} + +void CursorManager::OnCursorLeaveOverlay() noexcept { + _isOnOverlay = false; + _UpdateCursorClip(); +} + void CursorManager::_ShowSystemCursor(bool show) { static void (WINAPI* const showSystemCursor)(BOOL bShow) = []()->void(WINAPI*)(BOOL) { HMODULE lib = LoadLibrary(L"user32.dll"); @@ -322,33 +340,34 @@ void CursorManager::_UpdateCursorClip() noexcept { /////////////////////////////////////////////////////////// HWND hwndCur = WindowFromPoint(hwndScaling, scalingRect, SrcToScaling(cursorPos), false); + _isOnScalingWindow = hwndCur == hwndScaling; - if (hwndCur != hwndScaling) { - // 主窗口被遮挡 + if (!_isOnScalingWindow) { + // 缩放窗口被遮挡 if (style | WS_EX_TRANSPARENT) { SetWindowLongPtr(hwndScaling, GWL_EXSTYLE, style & ~WS_EX_TRANSPARENT); } _StopCapture(cursorPos); } else { - // 主窗口未被遮挡 - bool stopCapture = false; - - if (!stopCapture) { - // 判断源窗口是否被遮挡 - hwndCur = WindowFromPoint(hwndScaling, scalingRect, cursorPos, true); - stopCapture = hwndCur != hwndSrc && (!IsChild(hwndSrc, hwndCur) || !((GetWindowStyle(hwndCur) & WS_CHILD))); - } + // 判断源窗口是否被遮挡 + hwndCur = WindowFromPoint(hwndScaling, scalingRect, cursorPos, true); - if (stopCapture) { + if (hwndCur != hwndSrc && (!IsChild(hwndSrc, hwndCur) || !((GetWindowStyle(hwndCur) & WS_CHILD)))) { if (style | WS_EX_TRANSPARENT) { SetWindowLongPtr(hwndScaling, GWL_EXSTYLE, style & ~WS_EX_TRANSPARENT); } _StopCapture(cursorPos); } else { - if (!(style & WS_EX_TRANSPARENT)) { - SetWindowLongPtr(hwndScaling, GWL_EXSTYLE, style | WS_EX_TRANSPARENT); + if (_isOnOverlay) { + if (style | WS_EX_TRANSPARENT) { + SetWindowLongPtr(hwndScaling, GWL_EXSTYLE, style & ~WS_EX_TRANSPARENT); + } + } else { + if (!(style & WS_EX_TRANSPARENT)) { + SetWindowLongPtr(hwndScaling, GWL_EXSTYLE, style | WS_EX_TRANSPARENT); + } } } } @@ -367,56 +386,29 @@ void CursorManager::_UpdateCursorClip() noexcept { ///////////////////////////////////////////////////////// HWND hwndCur = WindowFromPoint(hwndScaling, scalingRect, cursorPos, false); + _isOnScalingWindow = hwndCur == hwndScaling; - if (hwndCur == hwndScaling) { + if (_isOnScalingWindow) { // 主窗口未被遮挡 POINT newCursorPos = ScalingToSrc(cursorPos); if (!PtInRect(&srcRect, newCursorPos)) { // 跳过黑边 - if (false) { - // 从内部移到外部 - // 此时有 UI 贴边 - /*if (newCursorPos.x >= _srcRect.right) { - cursorPos.x += _scalingWndRect.right - _scalingWndRect.left - outputRect.right; - } else if (newCursorPos.x < _srcRect.left) { - cursorPos.x -= outputRect.left; - } + POINT clampedPos = { + std::clamp(cursorPos.x, destRect.left, destRect.right - 1), + std::clamp(cursorPos.y, destRect.top, destRect.bottom - 1) + }; - if (newCursorPos.y >= _srcRect.bottom) { - cursorPos.y += _scalingWndRect.bottom - _scalingWndRect.top - outputRect.bottom; - } else if (newCursorPos.y < _srcRect.top) { - cursorPos.y -= outputRect.top; + if (WindowFromPoint(hwndScaling, scalingRect, clampedPos, false) == hwndScaling) { + if (!(style & WS_EX_TRANSPARENT)) { + SetWindowLongPtr(hwndScaling, GWL_EXSTYLE, style | WS_EX_TRANSPARENT); } - if (MonitorFromPoint(cursorPos, MONITOR_DEFAULTTONULL)) { - SetCursorPos(cursorPos.x, cursorPos.y); - } else { - // 目标位置不存在屏幕,则将光标限制在输出区域内 - SetCursorPos( - std::clamp(cursorPos.x, _scalingWndRect.left + outputRect.left, _scalingWndRect.left + outputRect.right - 1), - std::clamp(cursorPos.y, _scalingWndRect.top + outputRect.top, _scalingWndRect.top + outputRect.bottom - 1) - ); - }*/ + _StartCapture(cursorPos); } else { - // 从外部移到内部 - - POINT clampedPos = { - std::clamp(cursorPos.x, destRect.left, destRect.right - 1), - std::clamp(cursorPos.y, destRect.top, destRect.bottom - 1) - }; - - if (WindowFromPoint(hwndScaling, scalingRect, clampedPos, false) == hwndScaling) { - if (!(style & WS_EX_TRANSPARENT)) { - SetWindowLongPtr(hwndScaling, GWL_EXSTYLE, style | WS_EX_TRANSPARENT); - } - - _StartCapture(cursorPos); - } else { - // 要跳跃的位置被遮挡 - if (style | WS_EX_TRANSPARENT) { - SetWindowLongPtr(hwndScaling, GWL_EXSTYLE, style & ~WS_EX_TRANSPARENT); - } + // 要跳跃的位置被遮挡 + if (style | WS_EX_TRANSPARENT) { + SetWindowLongPtr(hwndScaling, GWL_EXSTYLE, style & ~WS_EX_TRANSPARENT); } } } else { diff --git a/src/Magpie.Core/CursorManager.h b/src/Magpie.Core/CursorManager.h index a5e61ee64..5a04d853b 100644 --- a/src/Magpie.Core/CursorManager.h +++ b/src/Magpie.Core/CursorManager.h @@ -23,6 +23,10 @@ class CursorManager { return _cursorPos; } + void OnCursorHoverOverlay() noexcept; + + void OnCursorLeaveOverlay() noexcept; + private: void _ShowSystemCursor(bool show); @@ -35,12 +39,15 @@ class CursorManager { void _StopCapture(POINT cursorPos, bool onDestroy = false) noexcept; HCURSOR _hCursor = NULL; - POINT _cursorPos{}; + POINT _cursorPos { std::numeric_limits::max(),std::numeric_limits::max() }; RECT _curClips{}; int _originCursorSpeed = 0; bool _isUnderCapture = false; + bool _isOnScalingWindow = false; + + bool _isOnOverlay = false; }; } diff --git a/src/Magpie.Core/ImGuiImpl.cpp b/src/Magpie.Core/ImGuiImpl.cpp index b7fcda279..62d381156 100644 --- a/src/Magpie.Core/ImGuiImpl.cpp +++ b/src/Magpie.Core/ImGuiImpl.cpp @@ -190,7 +190,7 @@ void ImGuiImpl::BeginFrame() { io.AddKeyEvent(ImGuiKey_Enter, false); } - //bool originWantCaptureMouse = io.WantCaptureMouse; + bool originWantCaptureMouse = io.WantCaptureMouse; _backend.BeginFrame(); ImGui::NewFrame(); @@ -218,7 +218,7 @@ void ImGuiImpl::BeginFrame() { ImGui::SetWindowPos(window, pos); } - /*CursorManager& cm = MagApp::Get().GetCursorManager(); + CursorManager& cm = ScalingWindow::Get().CursorManager(); if (io.WantCaptureMouse) { if (!originWantCaptureMouse) { @@ -228,7 +228,7 @@ void ImGuiImpl::BeginFrame() { if (originWantCaptureMouse) { cm.OnCursorLeaveOverlay(); } - }*/ + } } void ImGuiImpl::EndFrame() { @@ -301,13 +301,13 @@ void ImGuiImpl::_UpdateMousePos() noexcept { pos.y -= hostRect.top; }*/ - const CursorManager& cursorManager = ScalingWindow::Get().CursorManager(); - if (!cursorManager.Cursor()) { + const POINT cursorPos = ScalingWindow::Get().CursorManager().CursorPos(); + if (cursorPos.x == std::numeric_limits::max()) { + // 无光标 io.MousePos = ImVec2(-FLT_MAX, -FLT_MAX); return; } - - const POINT cursorPos = cursorManager.CursorPos(); + const RECT& scalingRect = ScalingWindow::Get().WndRect(); const RECT& destRect = ScalingWindow::Get().Renderer().DestRect(); diff --git a/src/Magpie.Core/Renderer.cpp b/src/Magpie.Core/Renderer.cpp index dc3c34317..53d91b0bb 100644 --- a/src/Magpie.Core/Renderer.cpp +++ b/src/Magpie.Core/Renderer.cpp @@ -258,7 +258,7 @@ void Renderer::Render() noexcept { return; } - if (hCursor == _lastCursorHandle && (!hCursor || cursorPos == _lastCursorPos)) { + if (hCursor == _lastCursorHandle && cursorPos == _lastCursorPos) { // 光标没有移动 return; } diff --git a/src/Magpie.Core/ScalingWindow.cpp b/src/Magpie.Core/ScalingWindow.cpp index ee1ccc45d..2b7659f0b 100644 --- a/src/Magpie.Core/ScalingWindow.cpp +++ b/src/Magpie.Core/ScalingWindow.cpp @@ -209,6 +209,45 @@ void ScalingWindow::ToggleOverlay() noexcept { LRESULT ScalingWindow::_MessageHandler(UINT msg, WPARAM wParam, LPARAM lParam) noexcept { switch (msg) { + case WM_LBUTTONDOWN: + case WM_RBUTTONDOWN: + { + // 在以下情况下会收到光标消息: + // 1、未捕获光标且缩放后的位置未被遮挡而缩放前的位置被遮挡 + // 2、光标位于叠加层上 + const HWND hwndForground = GetForegroundWindow(); + if (hwndForground != _hwndSrc) { + if (!Win32Utils::SetForegroundWindow(_hwndSrc)) { + // 设置前台窗口失败,可能是因为前台窗口是开始菜单 + if (WindowHelper::IsStartMenu(hwndForground)) { + using namespace std::chrono; + + // 限制触发频率 + static steady_clock::time_point prevTimePoint{}; + auto now = steady_clock::now(); + if (duration_cast(now - prevTimePoint).count() >= 1000) { + prevTimePoint = now; + + // 模拟按键关闭开始菜单 + INPUT inputs[4]{}; + inputs[0].type = INPUT_KEYBOARD; + inputs[0].ki.wVk = VK_LWIN; + inputs[1].type = INPUT_KEYBOARD; + inputs[1].ki.wVk = VK_LWIN; + inputs[1].ki.dwFlags = KEYEVENTF_KEYUP; + SendInput((UINT)std::size(inputs), inputs, sizeof(INPUT)); + + // 等待系统处理 + Sleep(1); + } + + SetForegroundWindow(_hwndSrc); + } + } + } + + break; + } case WM_DESTROY: { _cursorManager.reset(); From 1d8b8564d4ae371b93f93b0cb53e1ed67dcab060 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=97=AD?= <34770031+Blinue@users.noreply.github.com> Date: Mon, 10 Jul 2023 23:12:31 +0800 Subject: [PATCH 070/155] =?UTF-8?q?feat:=20=E5=8F=A0=E5=8A=A0=E5=B1=82?= =?UTF-8?q?=E5=88=9D=E6=AD=A5=E6=94=AF=E6=8C=81=E9=BC=A0=E6=A0=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Magpie.Core/ImGuiImpl.cpp | 129 +++++++++++++++--------------- src/Magpie.Core/ImGuiImpl.h | 2 + src/Magpie.Core/OverlayDrawer.cpp | 4 + src/Magpie.Core/OverlayDrawer.h | 2 + src/Magpie.Core/Renderer.cpp | 10 +++ src/Magpie.Core/Renderer.h | 2 + src/Magpie.Core/ScalingWindow.cpp | 5 +- 7 files changed, 89 insertions(+), 65 deletions(-) diff --git a/src/Magpie.Core/ImGuiImpl.cpp b/src/Magpie.Core/ImGuiImpl.cpp index 62d381156..e5f23f74d 100644 --- a/src/Magpie.Core/ImGuiImpl.cpp +++ b/src/Magpie.Core/ImGuiImpl.cpp @@ -26,70 +26,6 @@ ImGuiImpl::~ImGuiImpl() noexcept { } } /* -static std::optional WndProcHandler(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { - ImGuiIO& io = ImGui::GetIO(); - - if (!io.WantCaptureMouse) { - if (msg == WM_LBUTTONDOWN && MagApp::Get().GetOptions().Is3DGameMode()) { - MagApp::Get().GetRenderer().SetUIVisibility(false); - } - return std::nullopt; - } - - switch (msg) { - case WM_LBUTTONDOWN: case WM_LBUTTONDBLCLK: - case WM_RBUTTONDOWN: case WM_RBUTTONDBLCLK: - case WM_MBUTTONDOWN: case WM_MBUTTONDBLCLK: - case WM_XBUTTONDOWN: case WM_XBUTTONDBLCLK: - { - int button = 0; - if (msg == WM_LBUTTONDOWN || msg == WM_LBUTTONDBLCLK) { button = 0; } - if (msg == WM_RBUTTONDOWN || msg == WM_RBUTTONDBLCLK) { button = 1; } - if (msg == WM_MBUTTONDOWN || msg == WM_MBUTTONDBLCLK) { button = 2; } - if (msg == WM_XBUTTONDOWN || msg == WM_XBUTTONDBLCLK) { button = (GET_XBUTTON_WPARAM(wParam) == XBUTTON1) ? 3 : 4; } - - if (!ImGui::IsAnyMouseDown()) { - if (!GetCapture()) { - SetCapture(hwnd); - } - MagApp::Get().GetCursorManager().OnCursorCapturedOnOverlay(); - } - - io.MouseDown[button] = true; - break; - } - case WM_LBUTTONUP: - case WM_RBUTTONUP: - case WM_MBUTTONUP: - case WM_XBUTTONUP: - { - int button = 0; - if (msg == WM_LBUTTONUP) { button = 0; } - if (msg == WM_RBUTTONUP) { button = 1; } - if (msg == WM_MBUTTONUP) { button = 2; } - if (msg == WM_XBUTTONUP) { button = (GET_XBUTTON_WPARAM(wParam) == XBUTTON1) ? 3 : 4; } - - io.MouseDown[button] = false; - - if (!ImGui::IsAnyMouseDown()) { - if (GetCapture() == hwnd) { - ReleaseCapture(); - } - MagApp::Get().GetCursorManager().OnCursorReleasedOnOverlay(); - } - - break; - } - case WM_MOUSEWHEEL: - io.MouseWheel += (float)GET_WHEEL_DELTA_WPARAM(wParam) / (float)WHEEL_DELTA; - break; - case WM_MOUSEHWHEEL: - io.MouseWheelH += (float)GET_WHEEL_DELTA_WPARAM(wParam) / (float)WHEEL_DELTA; - break; - } - - return std::nullopt; -} static LRESULT CALLBACK LowLevelMouseProc( _In_ int nCode, @@ -345,4 +281,69 @@ void ImGuiImpl::ClearStates() { }*/ } +void ImGuiImpl::MessageHandler(UINT msg, WPARAM wParam, LPARAM lParam) noexcept { + ImGuiIO& io = ImGui::GetIO(); + + /*if (!io.WantCaptureMouse) { + if (msg == WM_LBUTTONDOWN && MagApp::Get().GetOptions().Is3DGameMode()) { + MagApp::Get().GetRenderer().SetUIVisibility(false); + } + return std::nullopt; + }*/ + + switch (msg) { + case WM_LBUTTONDOWN: case WM_LBUTTONDBLCLK: + case WM_RBUTTONDOWN: case WM_RBUTTONDBLCLK: + case WM_MBUTTONDOWN: case WM_MBUTTONDBLCLK: + case WM_XBUTTONDOWN: case WM_XBUTTONDBLCLK: + { + int button = 0; + if (msg == WM_LBUTTONDOWN || msg == WM_LBUTTONDBLCLK) { button = 0; } + if (msg == WM_RBUTTONDOWN || msg == WM_RBUTTONDBLCLK) { button = 1; } + if (msg == WM_MBUTTONDOWN || msg == WM_MBUTTONDBLCLK) { button = 2; } + if (msg == WM_XBUTTONDOWN || msg == WM_XBUTTONDBLCLK) { button = (GET_XBUTTON_WPARAM(wParam) == XBUTTON1) ? 3 : 4; } + + if (!ImGui::IsAnyMouseDown()) { + if (!GetCapture()) { + SetCapture(ScalingWindow::Get().Handle()); + } + //MagApp::Get().GetCursorManager().OnCursorCapturedOnOverlay(); + } + + io.MouseDown[button] = true; + break; + } + case WM_LBUTTONUP: + case WM_RBUTTONUP: + case WM_MBUTTONUP: + case WM_XBUTTONUP: + { + int button = 0; + if (msg == WM_LBUTTONUP) { button = 0; } + if (msg == WM_RBUTTONUP) { button = 1; } + if (msg == WM_MBUTTONUP) { button = 2; } + if (msg == WM_XBUTTONUP) { button = (GET_XBUTTON_WPARAM(wParam) == XBUTTON1) ? 3 : 4; } + + io.MouseDown[button] = false; + + if (!ImGui::IsAnyMouseDown()) { + if (GetCapture() == ScalingWindow::Get().Handle()) { + ReleaseCapture(); + } + //MagApp::Get().GetCursorManager().OnCursorReleasedOnOverlay(); + } + + break; + } + case WM_MOUSEWHEEL: + io.MouseWheel += (float)GET_WHEEL_DELTA_WPARAM(wParam) / (float)WHEEL_DELTA; + break; + case WM_MOUSEHWHEEL: + io.MouseWheelH += (float)GET_WHEEL_DELTA_WPARAM(wParam) / (float)WHEEL_DELTA; + break; + } + + +} + } diff --git a/src/Magpie.Core/ImGuiImpl.h b/src/Magpie.Core/ImGuiImpl.h index 8640d8717..81e82c0c0 100644 --- a/src/Magpie.Core/ImGuiImpl.h +++ b/src/Magpie.Core/ImGuiImpl.h @@ -21,6 +21,8 @@ class ImGuiImpl { void ClearStates(); + void MessageHandler(UINT msg, WPARAM wParam, LPARAM lParam) noexcept; + // 将提示窗口限制在屏幕内 static void Tooltip(const char* content, float maxWidth = -1.0f); private: diff --git a/src/Magpie.Core/OverlayDrawer.cpp b/src/Magpie.Core/OverlayDrawer.cpp index 199e231cb..1171ff225 100644 --- a/src/Magpie.Core/OverlayDrawer.cpp +++ b/src/Magpie.Core/OverlayDrawer.cpp @@ -89,6 +89,10 @@ void OverlayDrawer::SetUIVisibility(bool value) noexcept { } +void OverlayDrawer::MessageHandler(UINT msg, WPARAM wParam, LPARAM lParam) noexcept { + _imguiImpl.MessageHandler(msg, wParam, lParam); +} + static const std::wstring& GetAppLanguage() noexcept { static std::wstring language; if (language.empty()) { diff --git a/src/Magpie.Core/OverlayDrawer.h b/src/Magpie.Core/OverlayDrawer.h index faa5d20d5..00b02eced 100644 --- a/src/Magpie.Core/OverlayDrawer.h +++ b/src/Magpie.Core/OverlayDrawer.h @@ -22,6 +22,8 @@ class OverlayDrawer { void SetUIVisibility(bool value) noexcept; + void MessageHandler(UINT msg, WPARAM wParam, LPARAM lParam) noexcept; + private: bool _BuildFonts() noexcept; void _BuildFontUI(std::wstring_view language, const std::vector& fontData, ImVector& uiRanges) noexcept; diff --git a/src/Magpie.Core/Renderer.cpp b/src/Magpie.Core/Renderer.cpp index 53d91b0bb..9e174410f 100644 --- a/src/Magpie.Core/Renderer.cpp +++ b/src/Magpie.Core/Renderer.cpp @@ -118,6 +118,16 @@ void Renderer::OnCursorVisibilityChanged(bool isVisible) { }); } +void Renderer::MessageHandler(UINT msg, WPARAM wParam, LPARAM lParam) noexcept { + if (_overlayDrawer) { + _overlayDrawer->MessageHandler(msg, wParam, lParam); + if (msg == WM_LBUTTONDOWN || msg == WM_LBUTTONUP || msg == WM_LBUTTONDBLCLK || msg == WM_MOUSEWHEEL || msg == WM_MOUSEHWHEEL) { + _FrontendRender(); + _FrontendRender(); + } + } +} + bool Renderer::_CreateSwapChain() noexcept { DXGI_SWAP_CHAIN_DESC1 sd{}; const RECT& scalingWndRect = ScalingWindow::Get().WndRect(); diff --git a/src/Magpie.Core/Renderer.h b/src/Magpie.Core/Renderer.h index b37fa1a0d..de29080c9 100644 --- a/src/Magpie.Core/Renderer.h +++ b/src/Magpie.Core/Renderer.h @@ -34,6 +34,8 @@ class Renderer { void OnCursorVisibilityChanged(bool isVisible); + void MessageHandler(UINT msg, WPARAM wParam, LPARAM lParam) noexcept; + private: bool _CreateSwapChain() noexcept; diff --git a/src/Magpie.Core/ScalingWindow.cpp b/src/Magpie.Core/ScalingWindow.cpp index 2b7659f0b..9c6f3cedf 100644 --- a/src/Magpie.Core/ScalingWindow.cpp +++ b/src/Magpie.Core/ScalingWindow.cpp @@ -208,6 +208,10 @@ void ScalingWindow::ToggleOverlay() noexcept { } LRESULT ScalingWindow::_MessageHandler(UINT msg, WPARAM wParam, LPARAM lParam) noexcept { + if (_renderer) { + _renderer->MessageHandler(msg, wParam, lParam); + } + switch (msg) { case WM_LBUTTONDOWN: case WM_RBUTTONDOWN: @@ -245,7 +249,6 @@ LRESULT ScalingWindow::_MessageHandler(UINT msg, WPARAM wParam, LPARAM lParam) n } } } - break; } case WM_DESTROY: From 55e1f4a9bea698939f6edcee40326587087c4d35 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=97=AD?= <34770031+Blinue@users.noreply.github.com> Date: Tue, 18 Jul 2023 21:05:50 +0800 Subject: [PATCH 071/155] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E7=BC=96?= =?UTF-8?q?=E8=AF=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Magpie.App/Resources.language-it.resw | 79 +++++++++++++++++------ src/Magpie.Core/ImGuiImpl.cpp | 2 +- 2 files changed, 61 insertions(+), 20 deletions(-) diff --git a/src/Magpie.App/Resources.language-it.resw b/src/Magpie.App/Resources.language-it.resw index 924328324..2770e3df6 100644 --- a/src/Magpie.App/Resources.language-it.resw +++ b/src/Magpie.App/Resources.language-it.resw @@ -1,6 +1,65 @@ - + + @@ -163,12 +222,6 @@ Avvia - - Generali - - - Applicato automaticamente quando l'immagine di output è troppo grande per entrare nello schermo - Esporta @@ -211,12 +264,6 @@ Linee guida per contribuire - - Effetto di ridimensionamento predefinito - - - Nessuno - Cancella @@ -331,12 +378,6 @@ Cancella - - Consenti ulteriore latenza per migliorare le prestazioni - - - VSync - Feedback diff --git a/src/Magpie.Core/ImGuiImpl.cpp b/src/Magpie.Core/ImGuiImpl.cpp index e5f23f74d..a34eaca6b 100644 --- a/src/Magpie.Core/ImGuiImpl.cpp +++ b/src/Magpie.Core/ImGuiImpl.cpp @@ -281,7 +281,7 @@ void ImGuiImpl::ClearStates() { }*/ } -void ImGuiImpl::MessageHandler(UINT msg, WPARAM wParam, LPARAM lParam) noexcept { +void ImGuiImpl::MessageHandler(UINT msg, WPARAM wParam, LPARAM /*lParam*/) noexcept { ImGuiIO& io = ImGui::GetIO(); /*if (!io.WantCaptureMouse) { From 16f6e095ec77883c142ea6d300fdf885aa744a1e Mon Sep 17 00:00:00 2001 From: Xu <34770031+Blinue@users.noreply.github.com> Date: Sun, 19 Nov 2023 22:03:28 +0800 Subject: [PATCH 072/155] =?UTF-8?q?chore:=20=E4=BF=AE=E5=A4=8D=E7=BC=96?= =?UTF-8?q?=E8=AF=91=E8=AD=A6=E5=91=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Magpie.App/Resources.language-fr.resw | 70 +++++++++++++++++--- src/Magpie.App/Resources.language-id.resw | 79 +++++++++++++++++------ src/Magpie.App/Resources.language-vi.resw | 18 ------ 3 files changed, 120 insertions(+), 47 deletions(-) diff --git a/src/Magpie.App/Resources.language-fr.resw b/src/Magpie.App/Resources.language-fr.resw index 211e5316d..5f7f2e54f 100644 --- a/src/Magpie.App/Resources.language-fr.resw +++ b/src/Magpie.App/Resources.language-fr.resw @@ -1,6 +1,65 @@ - + + @@ -112,12 +171,6 @@ Thème - - Général - - - Effet de réduction d'échelle par défaut - Importer ScaleModels.json @@ -265,9 +318,6 @@ Lancez - - Appliquer automatiquement lorsque l'image de sortie est trop grande pour l'écran - Importer diff --git a/src/Magpie.App/Resources.language-id.resw b/src/Magpie.App/Resources.language-id.resw index 68ec00be5..473d36b57 100644 --- a/src/Magpie.App/Resources.language-id.resw +++ b/src/Magpie.App/Resources.language-id.resw @@ -1,6 +1,65 @@ - + + @@ -172,15 +231,6 @@ Jalankan - - Umum - - - Otomatis diterapkan ketika gambar ouput terlalu besar untuk muat di layar - - - Efek downscaling bawaan - Ekspor @@ -250,9 +300,6 @@ Repositori Github - - Tidak ada - Parameter @@ -475,12 +522,6 @@ Tampilkan penghitung FPS - - Izinkan latensi tambahan untuk meningkatkan performa - - - VSync - Umpan balik diff --git a/src/Magpie.App/Resources.language-vi.resw b/src/Magpie.App/Resources.language-vi.resw index e23fa6328..6280e2677 100644 --- a/src/Magpie.App/Resources.language-vi.resw +++ b/src/Magpie.App/Resources.language-vi.resw @@ -523,12 +523,6 @@ Hiển thị bộ đếm FPS - - VSync - - - Thêm độ trễ để cải thiện hiệu năng - Cửa sổ nguồn @@ -559,18 +553,6 @@ Vô hiệu hóa thay đổi cỡ cửa sổ - - Chung - - - Được sử dụng khi kích thước hình ảnh lớn hơn màn hình - - - Chế độ downscale mặc định - - - Không - Xuất From 5b3cf0d6443c0ebdbb9b6a15b7a9bfef1bb6204e Mon Sep 17 00:00:00 2001 From: Xu <34770031+Blinue@users.noreply.github.com> Date: Tue, 21 Nov 2023 22:29:37 +0800 Subject: [PATCH 073/155] =?UTF-8?q?chore:=20=E5=88=A0=E9=99=A4=20Magpie.Co?= =?UTF-8?q?re=20=E7=9A=84=20conanfile?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Magpie.Core/conanfile.txt | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 src/Magpie.Core/conanfile.txt diff --git a/src/Magpie.Core/conanfile.txt b/src/Magpie.Core/conanfile.txt deleted file mode 100644 index e69de29bb..000000000 From 5cd6360ff13eddd408275bde37add53b07089273 Mon Sep 17 00:00:00 2001 From: Xu <34770031+Blinue@users.noreply.github.com> Date: Sun, 3 Dec 2023 14:01:17 +0800 Subject: [PATCH 074/155] =?UTF-8?q?chore:=20=E6=9B=B4=E6=96=B0=E4=BE=9D?= =?UTF-8?q?=E8=B5=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Magpie.App/conanfile.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Magpie.App/conanfile.txt b/src/Magpie.App/conanfile.txt index 7938c0351..56dccf36c 100644 --- a/src/Magpie.App/conanfile.txt +++ b/src/Magpie.App/conanfile.txt @@ -2,11 +2,11 @@ fmt/10.1.1 spdlog/1.12.0 parallel-hashmap/1.37 -rapidjson/cci.20220822 +rapidjson/cci.20230929 kuba-zip/0.2.6 muparser/2.3.4 yas/7.1.0 -imgui/1.89.9 +imgui/1.90 [generators] MSBuildDeps From cd22e966b6085d325a9d62e319eaa0c16e318f60 Mon Sep 17 00:00:00 2001 From: Xu <34770031+Blinue@users.noreply.github.com> Date: Sun, 3 Dec 2023 14:51:11 +0800 Subject: [PATCH 075/155] =?UTF-8?q?perf:=20=E4=BC=98=E5=8C=96=20ScalingRun?= =?UTF-8?q?time=20=E7=9A=84=E5=8E=9F=E5=AD=90=E6=93=8D=E4=BD=9C=E6=80=A7?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Magpie.Core/ScalingRuntime.cpp | 38 +++++++++++++++--------------- src/Magpie.Core/ScalingRuntime.h | 10 ++++---- 2 files changed, 23 insertions(+), 25 deletions(-) diff --git a/src/Magpie.Core/ScalingRuntime.cpp b/src/Magpie.Core/ScalingRuntime.cpp index 61add0da2..86b1f721e 100644 --- a/src/Magpie.Core/ScalingRuntime.cpp +++ b/src/Magpie.Core/ScalingRuntime.cpp @@ -13,29 +13,31 @@ ScalingRuntime::~ScalingRuntime() { Stop(); if (_scalingThread.joinable()) { - DWORD magWndThreadId = GetThreadId(_scalingThread.native_handle()); + const DWORD magWndThreadId = GetThreadId(_scalingThread.native_handle()); // 持续尝试直到 _scalingThread 创建了消息队列 while (!PostThreadMessage(magWndThreadId, WM_QUIT, 0, 0)) { - Sleep(1); + Sleep(0); } _scalingThread.join(); } } void ScalingRuntime::Start(HWND hwndSrc, ScalingOptions&& options) { - if (_isRunning) { + HWND expected = NULL; + if (!_hwndSrc.compare_exchange_strong(expected, hwndSrc, std::memory_order_relaxed)) { return; } + _isRunningChangedEvent(true); + _EnsureDispatcherQueue(); - _dqc.DispatcherQueue().TryEnqueue([this, hwndSrc, options(std::move(options))]() mutable { - _IsRunning(true); + _dqc.DispatcherQueue().TryEnqueue([hwndSrc, options(std::move(options))]() mutable { ScalingWindow::Get().Create(GetModuleHandle(nullptr), hwndSrc, std::move(options)); }); } void ScalingRuntime::ToggleOverlay() { - if (!_isRunning) { + if (!IsRunning()) { return; } @@ -46,12 +48,12 @@ void ScalingRuntime::ToggleOverlay() { } void ScalingRuntime::Stop() { - if (!_isRunning) { + if (!IsRunning()) { return; } _EnsureDispatcherQueue(); - _dqc.DispatcherQueue().TryEnqueue([this]() { + _dqc.DispatcherQueue().TryEnqueue([]() { ScalingWindow::Get().Destroy(); }); } @@ -79,7 +81,11 @@ void ScalingRuntime::_ScalingThreadProc() noexcept { while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { if (msg.message == WM_QUIT) { scalingWindow.Destroy(); - _IsRunning(false); + + if (_hwndSrc.exchange(NULL, std::memory_order_relaxed)) { + _isRunningChangedEvent(false); + } + return; } @@ -90,7 +96,10 @@ void ScalingRuntime::_ScalingThreadProc() noexcept { scalingWindow.Render(); MsgWaitForMultipleObjectsEx(0, nullptr, 1, QS_ALLINPUT, MWMO_INPUTAVAILABLE); } else { - _IsRunning(false); + if (_hwndSrc.exchange(NULL, std::memory_order_relaxed)) { + // 缩放失败或立即退出缩放 + _isRunningChangedEvent(false); + } WaitMessage(); } } @@ -102,13 +111,4 @@ void ScalingRuntime::_EnsureDispatcherQueue() const noexcept { } } -void ScalingRuntime::_IsRunning(bool value) { - if (_isRunning == value) { - return; - } - - _isRunning = value; - _isRunningChangedEvent(value); -} - } diff --git a/src/Magpie.Core/ScalingRuntime.h b/src/Magpie.Core/ScalingRuntime.h index af3b8d9d8..dd78bd774 100644 --- a/src/Magpie.Core/ScalingRuntime.h +++ b/src/Magpie.Core/ScalingRuntime.h @@ -12,7 +12,7 @@ class ScalingRuntime { ~ScalingRuntime(); HWND HwndSrc() const { - return _isRunning ? _hwndSrc : 0; + return _hwndSrc.load(std::memory_order_relaxed); } void Start(HWND hwndSrc, struct ScalingOptions&& options); @@ -22,7 +22,7 @@ class ScalingRuntime { void Stop(); bool IsRunning() const noexcept { - return _isRunning; + return HwndSrc(); } // 调用者应处理线程同步 @@ -47,10 +47,8 @@ class ScalingRuntime { // 确保 _dqc 完成初始化 void _EnsureDispatcherQueue() const noexcept; - void _IsRunning(bool value); - - HWND _hwndSrc = 0; - std::atomic _isRunning = false; + // 主线程使用 DispatcherQueue 和缩放线程沟通,因此无需约束内存定序,只需确保原子性即可 + std::atomic _hwndSrc; winrt::event> _isRunningChangedEvent; std::thread _scalingThread; From 0a9cabdad3e7ecabca7e98ee42cf5ebbab98e09e Mon Sep 17 00:00:00 2001 From: Xu <34770031+Blinue@users.noreply.github.com> Date: Fri, 8 Dec 2023 20:42:54 +0800 Subject: [PATCH 076/155] =?UTF-8?q?=E4=BC=98=E5=8C=96=E7=AA=97=E5=8F=A3?= =?UTF-8?q?=E6=A1=86=E6=9E=B6=20(#773)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix: 修复 Windows10 中最大化和还原窗口时闪烁的问题 * fix: 修复 Win11 中窗口化状态下标题栏上部被边框遮挡的问题 --- src/Magpie/XamlWindow.h | 70 ++++++++++++++++++++--------------------- 1 file changed, 35 insertions(+), 35 deletions(-) diff --git a/src/Magpie/XamlWindow.h b/src/Magpie/XamlWindow.h index 9d3f7eb1c..8d4fb2dc7 100644 --- a/src/Magpie/XamlWindow.h +++ b/src/Magpie/XamlWindow.h @@ -140,9 +140,28 @@ class XamlWindowT { { _currentDpi = GetDpiForWindow(_hWnd); - _UpdateFrameMargins(); - if (!Win32Utils::GetOSVersion().IsWin11()) { + // 在 Win10 中,移除标题栏时上边框也被没了。我们的解决方案是:使用 DwmExtendFrameIntoClientArea + // 将边框扩展到客户区,然后在顶部绘制了一个黑色实线来显示系统原始边框(这种情况下操作系统将黑色视 + // 为透明)。因此我们有**完美**的上边框! + // 见 https://docs.microsoft.com/en-us/windows/win32/dwm/customframe#extending-the-client-frame + // + // 有的软件自己绘制了假的上边框,如 Chromium 系、WinUI 3 等,但窗口失去焦点时边框是半透明的,无法 + // 完美模拟。 + // + // 我们选择扩展到标题栏高度,这是最好的选择。一个自然的想法是,既然上边框只有一个像素高,我们扩展一 + // 个像素即可,可惜因为 DWM 的 bug,这会使窗口失去焦点时上边框变为透明。那么能否传一个负值,让边框 + // 扩展到整个客户区?这大部分情况下可以工作,有一个小 bug:不显示边框颜色的设置下深色模式的边框会变 + // 为纯黑而不是半透明。 + // + // 最大化时不要调用 DwmExtendFrameIntoClientArea 还原边框,会导致窗口闪烁。 + RECT frame{}; + AdjustWindowRectExForDpi(&frame, GetWindowStyle(_hWnd), FALSE, 0, _currentDpi); + MARGINS margins{ + .cyTopHeight = -frame.top + }; + DwmExtendFrameIntoClientArea(_hWnd, &margins); + // 初始化双缓冲绘图 static const int _ = []() { BufferedPaintInit(); @@ -259,7 +278,7 @@ class XamlWindowT { const int topBorderHeight = (int)_GetTopBorderHeight(); - // 在顶部绘制黑色实线以显示系统原始边框,见 _UpdateFrameMargins + // 在顶部绘制黑色实线以显示系统原始边框,见 WM_CREATE if (ps.rcPaint.top < topBorderHeight) { RECT rcTopBorder = ps.rcPaint; rcTopBorder.bottom = topBorderHeight; @@ -410,8 +429,6 @@ class XamlWindowT { } } - _UpdateFrameMargins(); - return 0; } case WM_DESTROY: @@ -441,10 +458,17 @@ class XamlWindowT { } uint32_t _GetTopBorderHeight() const noexcept { - static constexpr uint32_t TOP_BORDER_HEIGHT = 1; + // 最大化时没有上边框 + if (_isMaximized) { + return 0; + } - // Win11 或最大化时没有上边框 - return (Win32Utils::GetOSVersion().IsWin11() || _isMaximized) ? 0 : TOP_BORDER_HEIGHT; + // Win10 中窗口边框始终只有一个像素宽,Win11 中的窗口边框宽度和 DPI 缩放有关 + if (Win32Utils::GetOSVersion().IsWin11()) { + return (_currentDpi + USER_DEFAULT_SCREEN_DPI / 2) / USER_DEFAULT_SCREEN_DPI; + } else { + return 1; + } } int _GetResizeHandleHeight() noexcept { @@ -478,7 +502,9 @@ class XamlWindowT { } } - int topBorderHeight = _GetTopBorderHeight(); + // Win10 中上边框被涂黑来显示系统原始边框,Win11 中 DWM 绘制的上边框也位于客户区内, + // 很可能是为了和 Win10 兼容。XAML Islands 不应该和上边框重叠。 + const int topBorderHeight = (int)_GetTopBorderHeight(); // SWP_NOZORDER 确保 XAML Islands 窗口始终在标题栏窗口下方,否则主窗口在调整大小时会闪烁 SetWindowPos( @@ -499,32 +525,6 @@ class XamlWindowT { } } - void _UpdateFrameMargins() const noexcept { - if (Win32Utils::GetOSVersion().IsWin11()) { - return; - } - - MARGINS margins{}; - if (_GetTopBorderHeight() > 0) { - // 在 Win10 中,移除标题栏时上边框也被没了。我们的解决方案是:使用 DwmExtendFrameIntoClientArea - // 将边框扩展到客户区,然后在顶部绘制了一个黑色实线来显示系统原始边框(这种情况下操作系统将黑色视 - // 为透明)。因此我们有**完美**的上边框! - // 见 https://docs.microsoft.com/en-us/windows/win32/dwm/customframe#extending-the-client-frame - // - // 有的软件自己绘制了假的上边框,如 Chromium 系、WinUI 3 等,但窗口失去焦点时边框是半透明的,无法 - // 完美模拟。 - // - // 我们选择扩展到标题栏高度,这是最好的选择。一个自然的想法是,既然上边框只有一个像素高,我们扩展一 - // 个像素即可,可惜因为 DWM 的 bug,这会使窗口失去焦点时上边框变为透明。那么能否传一个负值,让边框 - // 扩展到整个客户区?这大部分情况下可以工作,有一个小 bug:不显示边框颜色的设置下深色模式的边框会变 - // 为纯黑而不是半透明。 - RECT frame{}; - AdjustWindowRectExForDpi(&frame, GetWindowStyle(_hWnd), FALSE, 0, _currentDpi); - margins.cyTopHeight = -frame.top; - } - DwmExtendFrameIntoClientArea(_hWnd, &margins); - } - winrt::event> _destroyedEvent; HWND _hwndXamlIsland = NULL; From 490a4ea16d3d4b60c93a4f76cf69aa5663e63f5f Mon Sep 17 00:00:00 2001 From: Xu <34770031+Blinue@users.noreply.github.com> Date: Tue, 12 Dec 2023 18:03:41 +0800 Subject: [PATCH 077/155] =?UTF-8?q?=E7=A7=BB=E6=A4=8D=20SettingsControls?= =?UTF-8?q?=20(#771)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: 移植 SettingsCard 1 * feat: 移植 SettingsCard 2 * feat: 移植 SettingsCard 3 * feat: 移植 SettingsCard 4 * feat: 移植 SettingsCard 5 * feat: 更多设置项迁移到新版 SettingsCard * feat: 添加 IsEqualStateTrigger 和 IsNullStateTrigger * feat: 移植 ControlSizeTrigger * fix: 修复 SettinsCard 在程序启动时错误展示动画的问题 * fix: 修复内存泄露问题 * feat: SettingsCard 不再支持宽度较窄时切换到垂直布局 * Revert "feat: SettingsCard 不再支持宽度较窄时切换到垂直布局" This reverts commit a5fadae06b88a33a24daac142a5f52591313658b. * feat: 只对特定SettingsCard启用自动切换布局的功能 * UI: PageFrame 在宽度较小时减小边距 * UI: 使 InfoBar 和 SettingsCard 对齐 * feat: 添加 SettingsExpander * feat: 移植 SettingsExpander 1 * feat: 移植 SettingsExpander 2 * feat: 移植 SettingsExpander 3 * feat: 移植 SettingsExpander 4 * feat: 删除旧版控件 * fix: 修复缩放配置页面崩溃 * feat: SettingsGroup.Title 改名为 Header * UI: 修复裁剪选项禁用状态文字颜色 * refactor: 优化缩放配置页面布局 使用 SettingsExpander 中的 ListView * UI: 修复裁剪选项 * UI: 简化启动参数选项 UI * UI: 简化启动参数选项 UI * fix: 修复 SettingsExcpander.Items 中的 SettingsCard 对于鼠标点击会错误设置焦点的问题 * chore: 清理 --- src/Magpie.App/AboutPage.xaml | 95 +- src/Magpie.App/App.idl | 8 + src/Magpie.App/App.xaml | 724 +---------- src/Magpie.App/ControlSizeTrigger.cpp | 91 ++ src/Magpie.App/ControlSizeTrigger.h | 102 ++ src/Magpie.App/ControlSizeTrigger.idl | 19 + src/Magpie.App/EffectParametersViewModel.cpp | 4 +- src/Magpie.App/HomePage.xaml | 181 ++- src/Magpie.App/IsEqualStateTrigger.cpp | 61 + src/Magpie.App/IsEqualStateTrigger.h | 47 + src/Magpie.App/IsEqualStateTrigger.idl | 11 + src/Magpie.App/IsNullStateTrigger.cpp | 28 + src/Magpie.App/IsNullStateTrigger.h | 36 + src/Magpie.App/IsNullStateTrigger.idl | 8 + src/Magpie.App/KeyVisual.cpp | 25 +- src/Magpie.App/KeyVisual.h | 32 +- src/Magpie.App/KeyVisual.idl | 4 + src/Magpie.App/Magpie.App.vcxproj | 72 +- src/Magpie.App/Magpie.App.vcxproj.filters | 27 +- src/Magpie.App/PageFrame.cpp | 40 +- src/Magpie.App/PageFrame.h | 2 + src/Magpie.App/PageFrame.xaml | 12 +- src/Magpie.App/ProfilePage.cpp | 10 - src/Magpie.App/ProfilePage.h | 4 - src/Magpie.App/ProfilePage.xaml | 532 ++++---- src/Magpie.App/ProfileViewModel.cpp | 11 +- src/Magpie.App/ProfileViewModel.h | 7 - src/Magpie.App/ProfileViewModel.idl | 1 - src/Magpie.App/Resources.language-de.resw | 4 +- src/Magpie.App/Resources.language-en-US.resw | 119 +- src/Magpie.App/Resources.language-es.resw | 113 +- src/Magpie.App/Resources.language-fr.resw | 37 +- src/Magpie.App/Resources.language-hu.resw | 95 +- src/Magpie.App/Resources.language-id.resw | 104 +- src/Magpie.App/Resources.language-it.resw | 113 +- src/Magpie.App/Resources.language-ja.resw | 113 +- src/Magpie.App/Resources.language-ko.resw | 113 +- src/Magpie.App/Resources.language-pt-BR.resw | 113 +- src/Magpie.App/Resources.language-ru.resw | 115 +- src/Magpie.App/Resources.language-tr.resw | 113 +- src/Magpie.App/Resources.language-uk.resw | 113 +- src/Magpie.App/Resources.language-vi.resw | 113 +- .../Resources.language-zh-Hans.resw | 119 +- .../Resources.language-zh-Hant.resw | 111 +- src/Magpie.App/RootPage.xaml | 2 +- src/Magpie.App/ScalingConfigurationPage.xaml | 702 +++++----- src/Magpie.App/SettingsCard.cpp | 335 ++++- src/Magpie.App/SettingsCard.h | 124 +- src/Magpie.App/SettingsCard.idl | 52 +- src/Magpie.App/SettingsCard.xaml | 1157 +++++++++++++++-- src/Magpie.App/SettingsExpander.cpp | 160 +++ src/Magpie.App/SettingsExpander.h | 128 ++ src/Magpie.App/SettingsExpander.idl | 42 + src/Magpie.App/SettingsExpander.xaml | 578 ++++++++ src/Magpie.App/SettingsGroup.cpp | 30 +- src/Magpie.App/SettingsGroup.h | 28 +- src/Magpie.App/SettingsGroup.idl | 4 +- src/Magpie.App/SettingsGroup.xaml | 7 +- src/Magpie.App/SettingsPage.xaml | 214 ++- src/Magpie.App/ShortcutControl.cpp | 8 +- src/Magpie.App/TextBlockHelper.cpp | 2 +- src/Magpie.App/UpdateService.cpp | 1 + src/Magpie.App/WrapPanel.cpp | 12 +- src/Magpie.App/pch.h | 2 +- src/Magpie/MainWindow.cpp | 14 +- src/Shared/XamlUtils.cpp | 4 +- 66 files changed, 4589 insertions(+), 2819 deletions(-) create mode 100644 src/Magpie.App/ControlSizeTrigger.cpp create mode 100644 src/Magpie.App/ControlSizeTrigger.h create mode 100644 src/Magpie.App/ControlSizeTrigger.idl create mode 100644 src/Magpie.App/IsEqualStateTrigger.cpp create mode 100644 src/Magpie.App/IsEqualStateTrigger.h create mode 100644 src/Magpie.App/IsEqualStateTrigger.idl create mode 100644 src/Magpie.App/IsNullStateTrigger.cpp create mode 100644 src/Magpie.App/IsNullStateTrigger.h create mode 100644 src/Magpie.App/IsNullStateTrigger.idl create mode 100644 src/Magpie.App/SettingsExpander.cpp create mode 100644 src/Magpie.App/SettingsExpander.h create mode 100644 src/Magpie.App/SettingsExpander.idl create mode 100644 src/Magpie.App/SettingsExpander.xaml diff --git a/src/Magpie.App/AboutPage.xaml b/src/Magpie.App/AboutPage.xaml index b0d00cf1f..e8afa9c79 100644 --- a/src/Magpie.App/AboutPage.xaml +++ b/src/Magpie.App/AboutPage.xaml @@ -125,70 +125,51 @@ - + - - - - + + - + - - - - + + - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - 12 - - - @@ -678,57 +39,8 @@ - 6,16,16,16 - 16,0,0,0 - - - - - 0 - 56, 8, 40, 8 - - Transparent - - - - - 0,0,8,0 - - - - - - - - + 0,16,22,16 + 20,0,0,0 Firebrick 1 - - - - - - 2 - - - - - - - diff --git a/src/Magpie.App/ControlSizeTrigger.cpp b/src/Magpie.App/ControlSizeTrigger.cpp new file mode 100644 index 000000000..5fb45afbc --- /dev/null +++ b/src/Magpie.App/ControlSizeTrigger.cpp @@ -0,0 +1,91 @@ +// 移植自 https://github.com/CommunityToolkit/Windows/blob/bef863ca70bb1edf8c940198dd5cc74afa5d2aab/components/Triggers/src/ControlSizeTrigger.cs + +#include "pch.h" +#include "ControlSizeTrigger.h" +#if __has_include("ControlSizeTrigger.g.cpp") +#include "ControlSizeTrigger.g.cpp" +#endif + +namespace winrt::Magpie::App::implementation { + +const DependencyProperty ControlSizeTrigger::_canTriggerProperty = DependencyProperty::Register( + L"CanTrigger", + xaml_typename(), + xaml_typename(), + PropertyMetadata(box_value(true), &ControlSizeTrigger::_OnPropertyChanged) +); + +const DependencyProperty ControlSizeTrigger::_maxWidthProperty = DependencyProperty::Register( + L"MaxWidth", + xaml_typename(), + xaml_typename(), + PropertyMetadata(box_value(std::numeric_limits::infinity()), &ControlSizeTrigger::_OnPropertyChanged) +); + +const DependencyProperty ControlSizeTrigger::_minWidthProperty = DependencyProperty::Register( + L"MinWidth", + xaml_typename(), + xaml_typename(), + PropertyMetadata(box_value(0.0), &ControlSizeTrigger::_OnPropertyChanged) +); + +const DependencyProperty ControlSizeTrigger::_maxHeightProperty = DependencyProperty::Register( + L"MaxHeight", + xaml_typename(), + xaml_typename(), + PropertyMetadata(box_value(std::numeric_limits::infinity()), &ControlSizeTrigger::_OnPropertyChanged) +); + +const DependencyProperty ControlSizeTrigger::_minHeightProperty = DependencyProperty::Register( + L"MinHeight", + xaml_typename(), + xaml_typename(), + PropertyMetadata(box_value(0.0), &ControlSizeTrigger::_OnPropertyChanged) +); + +const DependencyProperty ControlSizeTrigger::_targetElementProperty = DependencyProperty::Register( + L"TargetElement", + xaml_typename(), + xaml_typename(), + PropertyMetadata(nullptr, &ControlSizeTrigger::_OnTargetElementChanged) +); + +void ControlSizeTrigger::_OnPropertyChanged(DependencyObject const& sender, DependencyPropertyChangedEventArgs const&) { + get_self(sender.as())->_UpdateTrigger(); +} + +void ControlSizeTrigger::_OnTargetElementChanged(DependencyObject const& sender, DependencyPropertyChangedEventArgs const& e) { + ControlSizeTrigger* that = get_self(sender.as()); + + that->_targetElementSizeChangedRevoker.revoke(); + + if (IInspectable newValue = e.NewValue()) { + that->_targetElementSizeChangedRevoker = newValue.as().SizeChanged(auto_revoke, + [that](IInspectable const&, SizeChangedEventArgs const&) { + that->_UpdateTrigger(); + } + ); + } + + that->_UpdateTrigger(); +} + +void ControlSizeTrigger::_UpdateTrigger() { + const FrameworkElement targetElement = TargetElement(); + + if (!targetElement || !CanTrigger()) { + SetActive(false); + return; + } + + const double actualWidth = targetElement.ActualWidth(); + const double actualHeight = targetElement.ActualHeight(); + SetActive( + actualWidth >= MinWidth() && + actualWidth < MaxWidth() && + actualHeight >= MinHeight() && + actualHeight < MaxHeight() + ); +} + +} diff --git a/src/Magpie.App/ControlSizeTrigger.h b/src/Magpie.App/ControlSizeTrigger.h new file mode 100644 index 000000000..4cf0e0943 --- /dev/null +++ b/src/Magpie.App/ControlSizeTrigger.h @@ -0,0 +1,102 @@ +#pragma once +#include "ControlSizeTrigger.g.h" + +namespace winrt::Magpie::App::implementation { + +struct ControlSizeTrigger : ControlSizeTriggerT { + bool CanTrigger() { + return GetValue(_canTriggerProperty).as(); + } + + void CanTrigger(bool value) { + SetValue(_canTriggerProperty, box_value(value)); + } + + double MaxWidth() { + return GetValue(_maxWidthProperty).as(); + } + + void MaxWidth(double value) { + SetValue(_maxWidthProperty, box_value(value)); + } + + double MinWidth() { + return GetValue(_minWidthProperty).as(); + } + + void MinWidth(double value) { + SetValue(_minWidthProperty, box_value(value)); + } + + double MaxHeight() { + return GetValue(_maxHeightProperty).as(); + } + + void MaxHeight(double value) { + SetValue(_maxHeightProperty, box_value(value)); + } + + double MinHeight() { + return GetValue(_minHeightProperty).as(); + } + + void MinHeight(double value) { + SetValue(_minHeightProperty, box_value(value)); + } + + FrameworkElement TargetElement() { + return GetValue(_targetElementProperty).as(); + } + + void TargetElement(FrameworkElement const& value) { + SetValue(_targetElementProperty, box_value(value)); + } + + static DependencyProperty CanTriggerProperty() { + return _canTriggerProperty; + } + + static DependencyProperty MaxWidthProperty() { + return _maxWidthProperty; + } + + static DependencyProperty MinWidthProperty() { + return _minWidthProperty; + } + + static DependencyProperty MaxHeightProperty() { + return _maxHeightProperty; + } + + static DependencyProperty MinHeightProperty() { + return _minHeightProperty; + } + + static DependencyProperty TargetElementProperty() { + return _targetElementProperty; + } + +private: + static const DependencyProperty _canTriggerProperty; + static const DependencyProperty _maxWidthProperty; + static const DependencyProperty _minWidthProperty; + static const DependencyProperty _maxHeightProperty; + static const DependencyProperty _minHeightProperty; + static const DependencyProperty _targetElementProperty; + + static void _OnPropertyChanged(DependencyObject const& sender, DependencyPropertyChangedEventArgs const&); + static void _OnTargetElementChanged(DependencyObject const& sender, DependencyPropertyChangedEventArgs const& ); + + void _UpdateTrigger(); + + FrameworkElement::SizeChanged_revoker _targetElementSizeChangedRevoker; +}; + +} + +namespace winrt::Magpie::App::factory_implementation { + +struct ControlSizeTrigger : ControlSizeTriggerT { +}; + +} diff --git a/src/Magpie.App/ControlSizeTrigger.idl b/src/Magpie.App/ControlSizeTrigger.idl new file mode 100644 index 000000000..f4d9c0f63 --- /dev/null +++ b/src/Magpie.App/ControlSizeTrigger.idl @@ -0,0 +1,19 @@ +namespace Magpie.App { + runtimeclass ControlSizeTrigger : Windows.UI.Xaml.StateTriggerBase { + ControlSizeTrigger(); + + Boolean CanTrigger; + Double MaxWidth; + Double MinWidth; + Double MaxHeight; + Double MinHeight; + Windows.UI.Xaml.FrameworkElement TargetElement; + + static Windows.UI.Xaml.DependencyProperty CanTriggerProperty { get; }; + static Windows.UI.Xaml.DependencyProperty MaxWidthProperty { get; }; + static Windows.UI.Xaml.DependencyProperty MinWidthProperty { get; }; + static Windows.UI.Xaml.DependencyProperty MaxHeightProperty { get; }; + static Windows.UI.Xaml.DependencyProperty MinHeightProperty { get; }; + static Windows.UI.Xaml.DependencyProperty TargetElementProperty{ get; }; + } +} diff --git a/src/Magpie.App/EffectParametersViewModel.cpp b/src/Magpie.App/EffectParametersViewModel.cpp index 2d8694336..23f7bbc1e 100644 --- a/src/Magpie.App/EffectParametersViewModel.cpp +++ b/src/Magpie.App/EffectParametersViewModel.cpp @@ -130,7 +130,7 @@ void EffectParametersViewModel::_ScalingModeBoolParameter_PropertyChanged( } ScalingModeBoolParameter* boolParamImpl = - get_self(sender.as>()); + get_self(sender.as()); const std::string& effectName = _effectInfo->params[boolParamImpl->Index()].name; _Data()[StrUtils::UTF8ToUTF16(effectName)] = (float)boolParamImpl->Value(); @@ -146,7 +146,7 @@ void EffectParametersViewModel::_ScalingModeFloatParameter_PropertyChanged( } ScalingModeFloatParameter* floatParamImpl = - get_self(sender.as>()); + get_self(sender.as()); const std::string& effectName = _effectInfo->params[floatParamImpl->Index()].name; _Data()[StrUtils::UTF8ToUTF16(effectName)] = (float)floatParamImpl->Value(); diff --git a/src/Magpie.App/HomePage.xaml b/src/Magpie.App/HomePage.xaml index 1b6d75600..dc87bd394 100644 --- a/src/Magpie.App/HomePage.xaml +++ b/src/Magpie.App/HomePage.xaml @@ -36,123 +36,98 @@ - - + + - - - - - Scale - - - + + + + Scale + + - - + + - - - - - Overlay - - - + + + + Overlay + + - - - - - - - - - - - - - - - - - + + - - - + diff --git a/src/Magpie.App/ProfileViewModel.cpp b/src/Magpie.App/ProfileViewModel.cpp index f5bd168e9..68a6cecbf 100644 --- a/src/Magpie.App/ProfileViewModel.cpp +++ b/src/Magpie.App/ProfileViewModel.cpp @@ -158,7 +158,7 @@ fire_and_forget ProfileViewModel::OpenProgramLocation() const noexcept { Win32Utils::OpenFolderAndSelectFile(programLocation.c_str()); } -std::wstring GetStartFolderForSettingLauncher(const Profile& profile) noexcept { +static std::wstring GetStartFolderForSettingLauncher(const Profile& profile) noexcept { if (profile.launcherPath.empty()) { // 没有指定启动器 size_t delimPos = profile.pathRule.find_last_of(L'\\'); @@ -791,15 +791,6 @@ void ProfileViewModel::LaunchParameters(const hstring& value) { _propertyChangedEvent(*this, PropertyChangedEventArgs(L"LaunchParameters")); } -void ProfileViewModel::IsEditingLaunchParameters(bool value) { - if (_isEditingLaunchParameters == value) { - return; - } - - _isEditingLaunchParameters = value; - _propertyChangedEvent(*this, PropertyChangedEventArgs(L"IsEditingLaunchParameters")); -} - bool ProfileViewModel::IsDisableDirectFlip() const noexcept { return _data->IsDisableDirectFlip(); } diff --git a/src/Magpie.App/ProfileViewModel.h b/src/Magpie.App/ProfileViewModel.h index 2d8fdc066..5bb433983 100644 --- a/src/Magpie.App/ProfileViewModel.h +++ b/src/Magpie.App/ProfileViewModel.h @@ -144,12 +144,6 @@ struct ProfileViewModel : ProfileViewModelT { hstring LaunchParameters() const noexcept; void LaunchParameters(const hstring& value); - bool IsEditingLaunchParameters() const noexcept { - return _isEditingLaunchParameters; - } - - void IsEditingLaunchParameters(bool value); - bool IsDisableDirectFlip() const noexcept; void IsDisableDirectFlip(bool value); @@ -179,7 +173,6 @@ struct ProfileViewModel : ProfileViewModelT { const bool _isDefaultProfile = true; bool _isRenameConfirmButtonEnabled = false; - bool _isEditingLaunchParameters = false; }; } diff --git a/src/Magpie.App/ProfileViewModel.idl b/src/Magpie.App/ProfileViewModel.idl index cdf10410f..1ee5de450 100644 --- a/src/Magpie.App/ProfileViewModel.idl +++ b/src/Magpie.App/ProfileViewModel.idl @@ -62,7 +62,6 @@ namespace Magpie.App { Int32 CursorInterpolationMode; String LaunchParameters; - Boolean IsEditingLaunchParameters; Boolean IsDisableDirectFlip; } } diff --git a/src/Magpie.App/Resources.language-de.resw b/src/Magpie.App/Resources.language-de.resw index 156ce15f5..650a7a1b3 100644 --- a/src/Magpie.App/Resources.language-de.resw +++ b/src/Magpie.App/Resources.language-de.resw @@ -58,7 +58,7 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + Aktivierung @@ -82,7 +82,7 @@ Automatisch skalieren, sobald das Fenster zum Vordergrund zurück kehrt. - + Verspätetes skalieren diff --git a/src/Magpie.App/Resources.language-en-US.resw b/src/Magpie.App/Resources.language-en-US.resw index d0fe941c8..6f533db84 100644 --- a/src/Magpie.App/Resources.language-en-US.resw +++ b/src/Magpie.App/Resources.language-en-US.resw @@ -120,13 +120,13 @@ About - + Activation Scale automatically when the window returns to foreground - + Auto restore @@ -147,7 +147,7 @@ Scale the foreground window when timer ends - + Delayed scaling @@ -156,7 +156,7 @@ Cancel - + Delay in seconds @@ -216,34 +216,34 @@ Scaling configuration - + Advanced - + General - + Language Windows default - + Portable mode Open configuration file location - + Run at startup Magpie will continue to run in the background after the main window is closed - + Display the app on the system tray - + Theme @@ -261,22 +261,22 @@ On - + Shortcuts - + In-game overlay In-game overlay shortcut - + Scale Scale shortcut - + Launch @@ -291,13 +291,13 @@ More options - + Scaling modes You need to run as administrator to use this setting - + Always run as administrator @@ -315,7 +315,7 @@ {} is available - + Other links @@ -441,19 +441,19 @@ Set the scaling factor after filling the screen with proportional scaling - + General - + 3D game mode - + Auto scale when in foreground - + Capture method - + Preferred monitors @@ -465,7 +465,7 @@ Monitors intersected by the source window - + Scaling mode @@ -513,34 +513,34 @@ None - + Performance - + Graphics card - + Display FPS counter - + Feedback - + Discussions - + Report a bug - + Request a feature Version - + Check for preview updates - + Check for updates automatically @@ -579,22 +579,22 @@ Installing - + Advanced - + Disable DirectFlip - + Cursor - + Draw cursor - + Adjust cursor speed while scaled - + Interpolation algorithm @@ -603,7 +603,7 @@ Nearest-neighbor - + Scaling factor @@ -618,52 +618,52 @@ Default - + Source window Limited to Graphics Capture and Desktop Duplication - + Capture title bar - + Custom cropping - + Bottom - + Left px - + Right - + Top - + Disable window resizing while scaled Gives a small performance boost. However, effects must be recompiled each time their parameters are changed - + Make effect parameters inline Notifications and pop-ups from certain applications will be blocked - + Simulate exclusive fullscreen when scaling You need to turn on "Display the app on the system tray" to use this setting - + Minimize to system tray at startup @@ -693,7 +693,7 @@ These settings are for development use only - + Developer options @@ -751,18 +751,15 @@ Import ScaleModels.json - + Update settings Version - + Launch parameters - - Edit - Profiler @@ -805,7 +802,7 @@ Disable font cache - + Allow scaling maximized or fullscreen windows @@ -826,10 +823,10 @@ Scale the foreground window or stop scaling - + Frame rate limiter - + Maximum frame rate @@ -838,4 +835,4 @@ Developer mode is enabled. - + \ No newline at end of file diff --git a/src/Magpie.App/Resources.language-es.resw b/src/Magpie.App/Resources.language-es.resw index 1d84843f3..e002b6cb2 100644 --- a/src/Magpie.App/Resources.language-es.resw +++ b/src/Magpie.App/Resources.language-es.resw @@ -129,10 +129,10 @@ Abre una nueva ventana para crear un perfil - + Activación - + Restauración automática @@ -150,7 +150,7 @@ Escale la ventana de primer plano cuando finalice el temporizador - + Escalado retrasado @@ -159,7 +159,7 @@ Cancelar - + Espera en segundos @@ -201,16 +201,16 @@ Configuración de escalado - + Avanzado - + General - + Idioma - + Modo portable @@ -219,13 +219,13 @@ Abrir la ubicación del archivo de configuración - + Ejecutar en el arranque Magpie continuará ejecutándose en segundo plano después de cerrar la ventana principal - + Mostrar la aplicación en la bandeja del sistema @@ -240,19 +240,19 @@ Encendido - + Atajos - + Superposición en el juego - + Escalado Atajo para el escalado - + Lanzamiento @@ -264,10 +264,10 @@ Mas opciones - + Modos de escalado - + Ejecutar siempre como administrador @@ -348,13 +348,13 @@ Adaptar - + General - + Modo de juego 3D - + Escalar de manera automática cuando está en primer plano @@ -363,7 +363,7 @@ Monitores intersectados por la ventana de origen - + Modo de escalado @@ -402,22 +402,22 @@ Ninguno - + Rendimiento - + Tarjeta grafica - + Mostrar contador de FPS - + Reportar un error Versión - + Buscar actualizaciones de vista previa @@ -444,22 +444,22 @@ Descargando - + Avanzado - + Deshabilitar DirectFlip - + Ajustar la velocidad del cursor mientras se escala - + Algoritmo de interpolación Bilineal - + Factor de escalado @@ -468,28 +468,28 @@ Por defecto - + Ventana de origen - + Recorte personalizado - + Abajo px - + Izquierda - + Arriba - + Hacer que los parámetros de efecto estén en línea - + Simule pantalla completa exclusiva al escalar @@ -549,7 +549,7 @@ Importar ScaleModels.json - + Ajustes de actualizaciones @@ -573,7 +573,7 @@ Configuración de escalado - + Tema @@ -591,7 +591,7 @@ Importar - + Revisar actualizaciones automaticamente @@ -618,7 +618,7 @@ Escalado - + Otros enlaces @@ -654,13 +654,13 @@ Establecer el factor de escala después de llenar la pantalla con escala proporcional - + Método de captura Llena la pantalla, la imagen puede estirarse - + Monitores preferidos @@ -669,19 +669,19 @@ Reordenar - + Solicitar una característica - + Cursor Instalando - + Feedback - + Dibujar cursor @@ -693,13 +693,13 @@ Limitado a captura de gráficos y duplicación de escritorio - + Capturar barra de título El archivo de configuración global proviene de una versión desconocida y es posible que no se analice correctamente. - + Discusiones @@ -717,10 +717,10 @@ Debe activar "Mostrar la aplicación en la bandeja del sistema" para usar esta configuración - + Derecha - + Deshabilitar el cambio de tamaño de la ventana mientras se escala @@ -729,7 +729,7 @@ Se bloquearán las notificaciones y ventanas emergentes de ciertas aplicaciones - + Minimizar a la bandeja del sistema al inicio @@ -741,7 +741,7 @@ Continuar - + Opciones de desarrollador @@ -757,12 +757,9 @@ Es necesario reiniciar para que el cambio surta efecto - + Parámetros del lanzador - - Editar - Monitor de rendimiento @@ -811,7 +808,7 @@ Archivo ejecutable - + Permitir escalar ventanas maximizadas o de pantalla completa diff --git a/src/Magpie.App/Resources.language-fr.resw b/src/Magpie.App/Resources.language-fr.resw index 412812faa..217eb8143 100644 --- a/src/Magpie.App/Resources.language-fr.resw +++ b/src/Magpie.App/Resources.language-fr.resw @@ -120,7 +120,7 @@ Remise a l'échelle automatique lors du retour de la fenêtre au premier plan - + Restaurer automatiquement @@ -165,10 +165,10 @@ Configuration de mise a l'échelle - + Afficher l'application sur la barre d'état système - + Thème @@ -183,10 +183,10 @@ Importer ScaleModels.json - + Mettre à jour les paramètres - + Paramètres de lancement @@ -207,7 +207,7 @@ Basculer vers les fréquences d'images - + Activation @@ -222,7 +222,7 @@ A propos - + Délai en secondes @@ -231,7 +231,7 @@ Activer - + Mise à l'échelle retardée @@ -270,28 +270,28 @@ Configuration de mise a l'échelle - + Avancée - + Général - + Langues Fenêtre par defaut - + Lancer au démarrage Magpie continuera à fonctionner en arrière-plan après la fermeture de la fenêtre principale - + Raccourcis - + Mode portable @@ -312,10 +312,10 @@ On - + Superposition en jeu - + Lancez @@ -327,7 +327,7 @@ Raccourci de superposition en jeu - + Echelle @@ -376,9 +376,6 @@ Exporter les modes de mise à l'échelle - - Editer - Profiler diff --git a/src/Magpie.App/Resources.language-hu.resw b/src/Magpie.App/Resources.language-hu.resw index 1389a9e23..4b629ea32 100644 --- a/src/Magpie.App/Resources.language-hu.resw +++ b/src/Magpie.App/Resources.language-hu.resw @@ -1,6 +1,65 @@ - + + @@ -61,7 +120,7 @@ Aktiválás - + Haladó @@ -88,7 +147,7 @@ Kilépés - + Automatikus visszaállítás @@ -97,7 +156,7 @@ Skálázás {}mp után - + Hiba jelentése @@ -113,7 +172,7 @@ Időzítések - + Aktiválás @@ -134,7 +193,7 @@ Folytatás - + Funkció kérése @@ -146,7 +205,7 @@ Nincs - + Egyéb linkek @@ -155,7 +214,7 @@ Kezdőlap - + Téma @@ -167,7 +226,7 @@ Ablak kiválasztása - + Nyelv @@ -182,19 +241,19 @@ Verzió - + Késleltetett méretezés Rólunk - + Késleltetés másodpercben Mentés - + Bal @@ -245,7 +304,7 @@ Új profil - + Beszélgetések @@ -266,7 +325,7 @@ Másolás innen - + Frissítések automatikus keresése @@ -275,7 +334,7 @@ Mégse - + Visszajelzés @@ -284,7 +343,7 @@ Folytatás - + Kísérleti frissítések keresése @@ -299,10 +358,10 @@ Figyelmeztetés - + Beállítások frissítése - + Méretarány diff --git a/src/Magpie.App/Resources.language-id.resw b/src/Magpie.App/Resources.language-id.resw index dbdd8fb16..83e108766 100644 --- a/src/Magpie.App/Resources.language-id.resw +++ b/src/Magpie.App/Resources.language-id.resw @@ -168,34 +168,34 @@ Konfigurasi penskalaan - + Lebih lanjut - + Umum - + Bahasa Bawaan Windows - + Mode portable Buka lokasi file konfigurasi - + Jalankan saat startup Magpie akan tetap berjalan di belakang saat window utama ditutup - + Munculkan app di system tray - + Tema @@ -213,22 +213,22 @@ Nyala - + Pintasan - + Overlay di game Pintasan overlay di game - + Skala Pintasan skala - + Jalankan @@ -243,16 +243,16 @@ Opsi lainnya - + Mode penskalaan - + Selalu jalan sebagai administrator Anda harus jalan sebagai administrator untuk menggunakan pengaturan ini - + Aktivasi @@ -264,7 +264,7 @@ Beranda - + Tunda dalam detik @@ -285,7 +285,7 @@ {} tersedia - + Tautan lainnya @@ -390,25 +390,25 @@ Atur faktor penskalaan setelah mengisi layar dengan penskalaan proporsional - + Umum - + Mode 3D game - + Skala otomatis ketika berada di latar depan - + Metode penangkapan - + Monitor preferensi Monitor yang berpotongan dengan window sumber - + Mode penskalaan @@ -456,7 +456,7 @@ Skalakan otomatis ketika jendela kembali ke latar depan - + Restore otomatis @@ -465,7 +465,7 @@ Skalakan window latar depan saat timer berakhir - + Tunda penskalaan @@ -513,34 +513,34 @@ Tidak ada - + Perfoma - + Kartu grafis - + Tampilkan penghitung FPS - + Umpan balik - + Diskusi - + Laporkan bug - + Minta fitur Versi - + Cek pembaruan preview - + Cek pembaruan otomatis @@ -579,22 +579,22 @@ Menginstal - + Tingkat lanjut - + Matikan DirectFlip - + Kursor - + Gambar kursor - + Sesuaikan kecepatan kursor saat diskalakan - + Algoritma interpolasi @@ -603,7 +603,7 @@ Nearest-neighbor - + Faktor penskalaan @@ -618,46 +618,46 @@ Bawaan - + Window sumber Terbatas untuk Graphics Capture dan Desktop Duplication - + Tangkap title bar - + Cropping kustom - + Bawah - + Kiri px - + Kanan - + Atas - + Nonaktifkan pengubahan ukuran window saat diskalakan Memberikan sedikit peningkatan performa. Namun, efek harus dikompilasi ulang setiap kali parameternya diubah - + Membuat parameter efek sejajar Pemberitahuan dan pop-up dari aplikasi tertentu akan diblokir - + Mensimulasikan layar penuh eksklusif saat melakukan penskalaan @@ -666,7 +666,7 @@ Pengaturan ini hanya untuk penggunaan pengembangan - + Meminimalkan ke baki sistem di startup @@ -693,7 +693,7 @@ File konfigurasi lokal berasal dari versi yang tidak dikenal dan mungkin tidak diuraikan dengan benar. - + Pilihan pengembang diff --git a/src/Magpie.App/Resources.language-it.resw b/src/Magpie.App/Resources.language-it.resw index 482c7c4c0..5f83a277b 100644 --- a/src/Magpie.App/Resources.language-it.resw +++ b/src/Magpie.App/Resources.language-it.resw @@ -129,10 +129,10 @@ Già in uso - + Attivazione - + Ripristino automatico @@ -150,13 +150,13 @@ Ridimensiona la finestra in primo piano allo scadere del timer - + Ridimensionamento ritardato Ridimensiona dopo {}s - + Ritardo in secondi @@ -198,28 +198,28 @@ Configurazione del ridimensionamento - + Avanzate Predefinita di Windows - + Modalità portabile - + Esegui all'avvio - + Mostra l'app nell'area di notifica Scorciatoia di ridimensionamento - + Ridimensionamento - + Avvia @@ -234,13 +234,13 @@ Altre opzioni - + Modalità di ridimensionamento Devi eseguire l'app come amministratore per usare questa impostazione - + Esegui sempre come amministratore @@ -258,7 +258,7 @@ {} è disponibile - + Altri link @@ -351,16 +351,16 @@ Adatta - + Generale - + Modalità gioco 3D Imposta il fattore di ridimensionamento dopo aver riempito lo schermo con il ridimensionamento proporzionale - + Monitor preferito @@ -378,25 +378,25 @@ Elimina - + Feedback - + Discussioni - + Segnala un bug - + Richiedi una feature Versione - + Controlla gli aggiornamenti in anteprima - + Controlla gli aggiornamenti automaticamente @@ -426,13 +426,13 @@ Installazione - + Mostra cursore - + Regola la velocità del cursore durante il ridimensionamento - + Algoritmo di interpolazione @@ -441,7 +441,7 @@ Vicino più ravvicinato - + Fattore di scala @@ -456,31 +456,31 @@ Predefinito - + Finestra di origine Limitato all'acquisizione grafica e alla duplicazione del desktop - + Cattura barra del titolo - + Ritaglio personalizzato - + Parte inferiore - + Sinistra pixel - + Destra - + Parte superiore @@ -489,7 +489,7 @@ Devi attivare "Visualizza l'app nell'area notifiche" per utilizzare questa impostazione - + Riduci a icona nella barra delle notifiche all'avvio @@ -498,13 +498,13 @@ Continua - + Mette i parametri dell'effetto in linea - + Simula lo schermo intero esclusivo durante il ridimensionamento - + Disabilita il ridimensionamento della finestra durante il ridimensionamento @@ -559,15 +559,12 @@ Importa ScaleModels.json - + Impostazioni aggiornamenti Versione - - Modifica - Metodo di cattura @@ -634,7 +631,7 @@ Ridimensiona automaticamente quando la finestra torna in primo piano - + Generali @@ -646,10 +643,10 @@ Configurazione del ridimensionamento - + Lingua - + Tema @@ -658,7 +655,7 @@ Scuro - + Scorciatoie @@ -676,7 +673,7 @@ Disattivato - + Sovrapposizione in-gioco @@ -712,16 +709,16 @@ Aggiungi effetto - + Performance - + Mostra il contatore FPS - + Ridimensionamento automatico quando in primo piano - + Metodo di cattura @@ -733,7 +730,7 @@ Apri il percorso del programma - + Modalità di ridimensionamento @@ -757,7 +754,7 @@ Sposta in alto - + Scheda grafica @@ -775,13 +772,13 @@ Riprova - + Avanzate - + Disabilita DirectFlip - + Cursore @@ -796,7 +793,7 @@ Attenzione - + Impostazioni sviluppatore @@ -808,7 +805,7 @@ Riavvia Magpie - + Parametri di avvio @@ -820,7 +817,7 @@ Opacità - + Consenti il ridimensionamento di finestre ingrandite o a schermo intero diff --git a/src/Magpie.App/Resources.language-ja.resw b/src/Magpie.App/Resources.language-ja.resw index aaf7478b1..04db4be94 100644 --- a/src/Magpie.App/Resources.language-ja.resw +++ b/src/Magpie.App/Resources.language-ja.resw @@ -120,7 +120,7 @@ 現在のウィンドウ - + アクティベーション @@ -135,13 +135,13 @@ ホーム - + タイマー {}秒後にスケーリング - + カウントダウンタイム @@ -180,34 +180,34 @@ スケーリング設定 - + 高度な設定 - + 一般設定 - + 言語 Windowsデフォルト - + ポータブルモード 設定ファイルの場所を開きます - + スタートアップ時に実行 - + カーソル - + スケーリング時カーソル速度を調整する - + 補間アルゴリズム @@ -228,13 +228,13 @@ スケーリング設定 - + DirectFlipを無効にする - + カーソルを描く - + スケーリングウィンドウの復元 @@ -255,10 +255,10 @@ 作成 - + システムトレイにアプリを表示 - + テーマ @@ -276,16 +276,16 @@ オン - + ゲーム内オーバーレイ - + スケーリング スケーリングのショートカット - + 立ち上げ @@ -300,7 +300,7 @@ その他のオプション - + スケーリングモード @@ -318,7 +318,7 @@ {} が利用できます - + 関連リンク @@ -396,7 +396,7 @@ 最適化 - + キャプチャ方式 @@ -408,7 +408,7 @@ ソースウィンドウがまたがっている全てのモニター - + スケーリングモード @@ -438,16 +438,16 @@ なし - + フレームレートを表示する - + フィードバック - + バグ報告 - + 機能のリクエスト @@ -486,43 +486,43 @@ インストール中 - + 高度な設定 デフォルト - + ソースウィンドウ - + タイトルバーをキャプチャ - + - + ピクセル - + - + 内部効果パラメーター - + スケーリング時に排他的な全画面表示をシミュレーションする - + スケーリング時のウィンドウサイズ変更を無効にする 特定アプリからの通知とポップアップをブロックできます - + 起動時、システムトレイに最小化 @@ -583,7 +583,7 @@ 古いバージョンのScaleModels.jsonをインポートする - + スケーリング倍率 @@ -592,10 +592,10 @@ ソースウィンドウと同じ - + カスタムクロップ - + @@ -613,7 +613,7 @@ メインウィンドウを閉じた後も、Magpie は引き続きバックグラウンドで実行されます - + ショートカット @@ -622,7 +622,7 @@ この設定を使用するには、管理者として実行する必要があります - + 常に管理者として実行する @@ -673,16 +673,16 @@ モニタいっぱいに表示されます、縦横比は無視 - + 一般設定 - + 3Dゲームモード - + 最前面時自動スケーリング - + 優先モニター @@ -700,16 +700,16 @@ 確定 - + パフォーマンス 上へ移動 - + グラフィックスカード - + フォーラム @@ -724,7 +724,7 @@ これらの設定は、開発用としてのみ使用できます - + 開発者向けオプション @@ -745,22 +745,19 @@ アップデートを確認する - + アップデートを自動的に確認する - + プレビューの更新を確認する - + アップデート設定 バージョン - - 編集 - - + 起動時のパラメータ @@ -805,7 +802,7 @@ フォントキャッシュの無効化 - + 最大化またはフルスクリーン画面のスケーリングを許可 diff --git a/src/Magpie.App/Resources.language-ko.resw b/src/Magpie.App/Resources.language-ko.resw index 8d7646ee3..b7a3df29d 100644 --- a/src/Magpie.App/Resources.language-ko.resw +++ b/src/Magpie.App/Resources.language-ko.resw @@ -117,19 +117,19 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + 포그라운드일 때 자동으로 스케일 - + 선호 모니터 삭제 - + 버그 제보 - + 스케일링 모드 @@ -177,13 +177,13 @@ 정보 - + 활성화 창이 포그라운드로 돌아올 때 자동으로 스케일 - + 자동 복원 @@ -204,7 +204,7 @@ 타이머가 끝날 때 포그라운드 창을 스케일 - + 타이머 @@ -213,7 +213,7 @@ 취소 - + 카운트다운(초) @@ -249,22 +249,22 @@ 스케일링 구성 - + 고급 - + 일반 - + 언어 메인 창이 닫힌 후 Magpie가 백그라운드에서 계속 실행됩니다 - + 시스템 트레이에 앱 표시 - + 테마 @@ -282,22 +282,22 @@ 켜짐 - + 바로 가기 - + 인게임 오버레이 인게임 오버레이 바로 가기 - + 스케일 스케일 바로 가기 - + 실행 @@ -348,10 +348,10 @@ 비례 스케일링으로 화면을 채운 후에 스케일링 인수를 설정합니다 - + 일반 - + 3D 게임 모드 @@ -378,16 +378,16 @@ 없음 - + 성능 - + 그래픽 카드 - + FPS 카운터 표시 - + 피드백 @@ -399,10 +399,10 @@ 다운로드 및 설치 - + 스케일 된 동안 커서 속도 조정 - + 보간 알고리즘 @@ -411,7 +411,7 @@ 〈 쌍선형 - + 스케일링 인수 @@ -426,37 +426,37 @@ [그래픽 캡처]와 [데스크탑 복제] 한정 - + 제목 표시줄 캡처 - + 자르기 사용자 지정 - + 하단 px - + 오른쪽 - + 상단 - + 스케일 된 동안 창 크기 조절 사용 안 함 약간의 성능 증가를 가져옵니다. 하지만 매개변수가 변경될 때마다 효과를 재컴파일해야 합니다 - + 효과 매개변수를 인라인으로 만듦 특정 응용 프로그램에서의 알림 및 팝업이 차단됩니다 - + 스케일링 할 때 단독 전체 화면 시뮬레이션 @@ -465,7 +465,7 @@ 소스 창과 동일 - + 소스 창 @@ -483,9 +483,6 @@ 끝내기 - - 편집 - 프로파일러 @@ -516,7 +513,7 @@ 이름 바꾸기 - + 캡처 방식 @@ -552,7 +549,7 @@ 다음에서 복사 - + 포터블 모드 @@ -564,7 +561,7 @@ 다음에서 복사 - + 부팅 시 실행 @@ -579,19 +576,19 @@ 구성 파일 위치 열기 - + 고급 ScaleModels.json 가져오기 - + 스케일링 모드 깃허브 저장소 - + 항상 관리자 권한으로 실행 @@ -610,7 +607,7 @@ 구성 파일 위치: {} - + 기타 링크 @@ -655,13 +652,13 @@ 이름 - + 개발자 옵션 너비(픽셀) - + 업데이트를 자동으로 확인 @@ -670,16 +667,16 @@ 업데이트 확인 - + 논의 - + 기능 제안 버전 - + 미리 보기 업데이트 확인 @@ -694,16 +691,16 @@ 릴리즈 노트 - + 커서 - + 커서 그리기 다운로드 실패 - + DirectFlip 사용 안 함 @@ -718,13 +715,13 @@ 구성 파일 구문분석에 실패했습니다 - + 왼쪽 이 설정은 개발 전용입니다 - + 부팅 시 시스템 트레이로 최소화 @@ -784,13 +781,13 @@ ScaleModels.json 가져오기 - + 업데이트 설정 버전 - + 실행 매개변수 @@ -805,7 +802,7 @@ 폰트 캐시 비활성화 - + 최대화 또는 전체 화면 창을 스케일링 하도록 허용 diff --git a/src/Magpie.App/Resources.language-pt-BR.resw b/src/Magpie.App/Resources.language-pt-BR.resw index 3b58f8016..22ea8f053 100644 --- a/src/Magpie.App/Resources.language-pt-BR.resw +++ b/src/Magpie.App/Resources.language-pt-BR.resw @@ -117,10 +117,10 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + Ativação - + Restaurar automaticamente @@ -132,10 +132,10 @@ Janela atual: - + Redimensionamento com atraso - + Tempo de atraso em segundos @@ -171,22 +171,22 @@ Configuração de redimensionamento - + Avançado - + Idioma - + Modo "portable" Abrir local do arquivo de configuração - + Executar na inicialização - + Exibir o aplicativo na área de notificação @@ -198,10 +198,10 @@ Desativado - + Sobreposição em jogo - + Redimensionar @@ -225,7 +225,7 @@ Registro de alterações - + Outros links @@ -288,19 +288,19 @@ Definir o fator de redimensionamento após preencher a tela com escalonamento proporcional - + Redimensionar automaticamente quando em primeiro plano - + Método de captura - + Monitores preferidos Monitor mais próximo da janela de origem - + Modo de redimensionamento @@ -333,31 +333,31 @@ Nenhum - + Desempenho - + Placa de vídeo - + Exibir contador de FPS - + Feedback - + Discussões - + Reportar um bug - + Solicitar um novo recurso Versão - + Verificar atualizações de versão de teste @@ -384,13 +384,13 @@ Instalando - + Avançado - + Desativar DirectFlip - + Cursor do mouse @@ -435,7 +435,7 @@ Atalho inválido - + Tema @@ -444,16 +444,16 @@ Perfis - + Geral Padrão do Windows - + Atalhos - + Inicialização @@ -462,13 +462,13 @@ Mais opções - + Modos de redimensionamento É necessário executar como administrador para utilizar essa configuração - + Executar sempre como administrador @@ -522,7 +522,7 @@ Novo modo de redimensionamento - + Geral @@ -540,7 +540,7 @@ Todos os monitores - + Procurar por atualizações automaticamente @@ -573,16 +573,16 @@ Falha no download - + Exibir cursor Bilinear - + Modificar a velocidade do cursor ao ser redimensionado - + Algoritmo de interpolação @@ -600,10 +600,10 @@ Notificações e pop-ups de determinados aplicativos serão bloqueados - + Minimizar para a área de notificação na inicialização - + Simular tela cheia exclusiva durante o redimensionamento @@ -639,7 +639,7 @@ Importar modos de redimensionamento - + Configurações de Atualização @@ -648,12 +648,9 @@ Versão - + Parâmetros de inicialização - - Editar - Método de captura @@ -669,7 +666,7 @@ Sem redimensionamento - + Fator de redimensionamento @@ -684,10 +681,10 @@ Desativar cache de efeito - + Capturar barra de título - + Janela de origem @@ -696,16 +693,16 @@ Limitado à Captura Gráfica e Duplicação de Área de Trabalho - + Corte personalizado - + Direita - + Parte superior - + Desativar redimensionamento da janela durante o escalonamento @@ -729,7 +726,7 @@ Absoluto - + Modo de jogo 3D @@ -738,10 +735,10 @@ Personalizado - + Parte inferior - + Esquerda @@ -750,7 +747,7 @@ Oferece um pequeno ganho no desempenho. No entanto, os efeitos devem ser recompilados sempre que seus parâmetros são alterados - + Incorporar os parâmetros do efeito @@ -768,7 +765,7 @@ Essas configurações são exclusivas para desenvolvimento - + Opções do desenvolvedor @@ -805,7 +802,7 @@ Alternar para passos - + Permitir redimensionamento de janelas maximizadas ou em tela cheia diff --git a/src/Magpie.App/Resources.language-ru.resw b/src/Magpie.App/Resources.language-ru.resw index 411d40601..abce3c22f 100644 --- a/src/Magpie.App/Resources.language-ru.resw +++ b/src/Magpie.App/Resources.language-ru.resw @@ -120,7 +120,7 @@ О программе - + Активация @@ -150,13 +150,13 @@ Установка - + Расширенные - + Курсор - + Множитель масштабирования @@ -180,7 +180,7 @@ Автоматическое масштабирование при возвращении окна на передний план - + Автоматическое восстановление @@ -198,7 +198,7 @@ Масштабирование переднего окна после задержки - + Отложенное масштабирование @@ -207,7 +207,7 @@ Отмена - + Задержка в секундах @@ -267,34 +267,34 @@ Настройки масштабирования - + Расширенные - + Общие - + Язык Windows (по умолчанию) - + Портативный режим Открыть расположение файла настроек - + Запускать при включении системы Magpie продолжит работать в фоне после закрытия главного окна - + Отображение приложения на панели задач - + Тема @@ -306,22 +306,22 @@ Светлая - + Горячие клавиши - + Внутриигровой оверлей Клавиша внутриигрового оверлея - + Масштабировать Клавиша масштабирования - + Запуск @@ -336,13 +336,13 @@ Больше настроек - + Режимы масштабирования Для использования этой настройки нужно запустить приложение от имени администратора - + Всегда запускать приложение от имени администратора @@ -360,7 +360,7 @@ {} доступно - + Другие ссылки @@ -468,19 +468,19 @@ Выставить множитель масштабирования после заполнения экрана пропорциональным масштабированием - + Общие - + Режим 3D игры - + Автоматическое масштабирование когда на переднем плане - + Способ захвата - + Предпочтительные мониторы @@ -489,7 +489,7 @@ Пересекаемые исходным окном мониторы - + Режим масштабирования @@ -537,34 +537,34 @@ Ничего - + Производительность - + Видеокарта - + Отображать счётчик FPS - + Обратная связь - + Обсуждения - + Сообщить об ошибке - + Запросить функцию Версия - + Проверить наличие обновлений предварительного просмотра - + Автоматически проверять наличие обновлений @@ -600,16 +600,16 @@ Скачивание - + Отключить DirectFlip - + Отображать курсор - + Подогнать скорость курсора при масштабировании - + Алгоритм интерполяции @@ -627,52 +627,52 @@ По умолчанию - + Исходное окно Ограничено захватом графики и дупликации рабочего стола - + Заголовок захвата - + Пользовательская обрезка - + Снизу - + Слева пкс. - + Справа - + Сверху - + Выключить изменение размера окна при масштабировании Даёт небольшой прирост производительности. Однако эффекты должны быть перекомпилированы при каждом изменении их параметров - + Сделать параметры эффекта встроенными Уведомления и всплывающие окна некоторых приложений будут заблокированы - + Симуляция эксклюзивного полного экрана при масштабировании Для использования этой настройки, включите "Отображать приложение в панели задач" - + Сворачивать на панель задач при запуске @@ -702,7 +702,7 @@ Эти настройки предназначены только для разработчиков - + Настройки разработчика @@ -754,13 +754,10 @@ Версия - + Обновить настройки - - Изменить - - + Параметры запуска @@ -805,7 +802,7 @@ Выключить кэш шрифтов - + Разрешить масштабирование развёрнутых или полноэкранных окон @@ -832,4 +829,4 @@ Включен режим разработчика. - + \ No newline at end of file diff --git a/src/Magpie.App/Resources.language-tr.resw b/src/Magpie.App/Resources.language-tr.resw index f7e0fdf3d..339c69cd3 100644 --- a/src/Magpie.App/Resources.language-tr.resw +++ b/src/Magpie.App/Resources.language-tr.resw @@ -126,10 +126,10 @@ Tamam - + Gelişmiş - + Tercih edilen monitörler @@ -144,7 +144,7 @@ Adlandır - + Grafik kartı @@ -165,16 +165,16 @@ Özel - + Sol - + Sağ - + Aktivasyon - + Otomatik geri yükle @@ -192,7 +192,7 @@ Zamanlayıcı sona erdiğinde ön plandaki pencereyi ölçeklendir - + Gecikmeli ölçek @@ -201,7 +201,7 @@ İptal - + Gecikme saniyesi @@ -249,31 +249,31 @@ Ölçek yapılandırması - + Gelişmiş - + Genel - + Dil Windows varsayılanı - + Taşınabilir kip Yapılandırma dosyası konumunu aç - + Başlangıçta çalıştır - + Uygulamayı sistem tepsisinde görüntüle - + Tema @@ -297,7 +297,7 @@ Başlangıç - + Oyun içi arayüz @@ -306,7 +306,7 @@ Ölçek kısayolu - + Başlat @@ -321,13 +321,13 @@ Diğer seçenekler - + Ölçek kipleri Bu ayarı kullanmak için yönetici olarak çalıştırmak gerekir - + Her zaman yönetici olarak çalıştır @@ -345,7 +345,7 @@ {} mevcut - + Diğer bağlantılar @@ -450,16 +450,16 @@ Sığdır - + Genel - + 3D oyun kipi - + Ön planda otomatik ölçeklendir - + Yakalama yöntemi @@ -468,7 +468,7 @@ Kaynak pencereyle kesişen monitör - + Ölçek kipi @@ -486,7 +486,7 @@ Yok - + Performans @@ -498,19 +498,19 @@ Sırala - + FPS sayacını görüntüle - + Geri bildirim - + Tartışmalar - + Bir hata bildir - + Özellik iste @@ -546,19 +546,19 @@ Kuruluyor - + DirectFlip devre dışı bırak - + İmleç - + İmleci göster - + Ölçek sonrası imleç hızını ayarla - + İnterpolasyon algoritması @@ -567,7 +567,7 @@ En yakın - + Ölçek etkeni @@ -579,46 +579,46 @@ Varsayılan - + Kaynak pencere Grafik Yakalama ve Masaüstü Çoğaltma ile Sınırlı - + Başlık çubuğunu yakala - + Özel kırpma - + Alt pk - + Üst - + Ölçeklendirme sonrası pencereyi yeniden boyutlandırma Küçük bir performans artışı sağlar. Ancak, parametreleri her değiştirildiğinde efektlerin yeniden derlenmesi gerekir - + Efekt parametrelerini satır içi yap Belirli uygulamalardan gelen bildirimler ve açılır pencereler engellenir - + Ölçekleme sırasında orjinal tam ekranı taklit edin Bu ayarı kullanmak için "Uygulamayı sistem tepsisinde görüntüle" özelliğini açmanız gerekir - + Başlangıçta sistem tepsisine küçült @@ -648,7 +648,7 @@ Bu ayarlar yalnızca geliştirme amaçlı kullanım içindir - + Geliştirici seçenekleri @@ -724,10 +724,10 @@ Magpie, ana pencere kapatıldıktan sonra arka planda çalışmaya devam edecek - + Kısayollar - + Ölçek @@ -745,24 +745,21 @@ Güncellemeleri kontrol et - + Güncellemeleri otomatik kontrol et - + Önizleme güncellemelerini kontrol et - + Güncelleme ayarları Sürüm - + Başlatma parametreleri - - Düzenle - Profil oluştur @@ -805,7 +802,7 @@ Yazı tipi önbelleği etkisizleştir - + Ekranı kaplayan veya tam ekran pencere ölçeğine izin ver diff --git a/src/Magpie.App/Resources.language-uk.resw b/src/Magpie.App/Resources.language-uk.resw index af3ca219f..815ac4e7f 100644 --- a/src/Magpie.App/Resources.language-uk.resw +++ b/src/Magpie.App/Resources.language-uk.resw @@ -120,16 +120,16 @@ Про застосунок - + Мова - + Запуск під час запуску системи - + Активація - + Автоматичне відновлення @@ -147,10 +147,10 @@ Масштабування вікна переднього плану після закінчення таймера - + Відкладене масштабування - + Затримка в секундах @@ -195,10 +195,10 @@ Конфігурація масштабування - + Розширені - + Загальні @@ -216,22 +216,22 @@ Ввімкнено - + Гарячі клавіші - + Внутрішньоігрове накладання Внутрішньоігрова клавіша накладання - + Масштаб Клавіша масштабування - + Запуск @@ -243,13 +243,13 @@ Додаткові параметри - + Режими масштабування Щоб скористатися цим параметром, вам потрібно запустити від імені адміністратора - + Завжди запускати від імені адміністратора @@ -264,7 +264,7 @@ {} доступний - + Інші посилання @@ -363,19 +363,19 @@ Підігнати - + Загальні - + Режим 3D гри - + Автоматичне масштабування на передньому плані - + Метод захоплення - + Бажані монітори @@ -420,25 +420,25 @@ Немає - + Продуктивність - + Відображення лічильника FPS - + Зворотній зв'язок - + Запросити функцію Версія - + Перевірити наявність оновлень попереднього перегляду - + Автоматична перевірка оновлень @@ -468,19 +468,19 @@ Встановлення - + Розширені - + Вимкнути DirectFlip - + Курсор - + Намалювати курсор - + Алгоритм інтерполяції @@ -489,7 +489,7 @@ Найближчий сусід - + Коефіцієнт масштабування @@ -501,22 +501,22 @@ За замовчуванням - + Захопити рядок заголовка - + Обрізати вручну - + Низ - + Ліворуч пікс - + Праворуч @@ -528,7 +528,7 @@ Для використання цього параметра потрібно ввімкнути "Відображати застосунок в системному треї" - + Згортання в системний трей під час запуску @@ -552,7 +552,7 @@ Ці налаштування призначені лише для використання під час розробки - + Параметри розробника @@ -613,22 +613,22 @@ Перемістити вгору - + Портативний режим Magpie продовжить працювати у фоновому режимі після закриття головного вікна - + Відображення застосунку в системному треї - + Тема - + Обговорення - + Повідомити про помилку @@ -670,10 +670,10 @@ Встановити коефіцієнт масштабування після заповнення екрана за допомогою пропорційного масштабування - + Відеокарта - + Режим масштабування @@ -688,25 +688,25 @@ Без масштабування - + Регулювання швидкості курсору під час масштабування - + Вихідне вікно Обмежено захопленням графіки та дублюванням робочого столу - + Зробити параметри ефекту вбудованими - + Верх - + Вимкнути зміну розміру вікна під час масштабування - + Імітація ексклюзивного повноекранного режиму при масштабуванні @@ -751,16 +751,13 @@ Імпорт ScaleModels.json - + Оновлення налаштувань Версія - - Редагувати - - + Параметри запуску @@ -805,7 +802,7 @@ Вимкнути кеш шрифтів - + Дозволити масштабування розгорнутих або повноекранних вікон diff --git a/src/Magpie.App/Resources.language-vi.resw b/src/Magpie.App/Resources.language-vi.resw index d2d79cdab..43d792c4a 100644 --- a/src/Magpie.App/Resources.language-vi.resw +++ b/src/Magpie.App/Resources.language-vi.resw @@ -117,19 +117,19 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + Phản hồi - + Diễn đàn - + Báo lỗi - + Yêu cầu tính năng - + Các liên kết khác @@ -174,13 +174,13 @@ Đã có bản cập nhật {} - + Cài đặt cập nhật - + Kiểm tra cập nhật tự động - + Kiểm tra các cập nhật thử nghiệm @@ -247,13 +247,13 @@ File JSON - + Kích hoạt Tự động scale cửa sổ trên cùng - + Tự động scale @@ -271,16 +271,16 @@ Chính - + Phím tắt - + Overlay trong ứng dụng Phím tắt overlay - + Scale @@ -289,7 +289,7 @@ Scale cửa sổ trên cùng khi hết thời gian - + Thời gian chờ Scale @@ -298,7 +298,7 @@ Hủy - + Thời gian bằng giây @@ -397,28 +397,25 @@ VSync - + Nâng cao - + Tắt DirectFlip - + Thông số khởi chạy - - Sửa - - + Con trỏ chuột - + Vẽ con trỏ chuột - + Thay đổi tốc độ con trỏ khi scale - + Thuật toán @@ -427,7 +424,7 @@ Nearest-neighbor - + Mức độ Scale @@ -439,22 +436,22 @@ Như cửa sổ gốc - + Chung - + Chế độ game 3D - + Tự động scale cửa sổ trên cùng - + Phương pháp lấy cửa sổ Mặc định - + Màn hình ưu tiên @@ -466,7 +463,7 @@ Màn hình hiển thị cửa sổ gốc - + Chế độ Scale @@ -514,43 +511,43 @@ Đổi thứ tự - + Hiệu năng - + Card đồ họa - + Hiển thị bộ đếm FPS - + Cửa sổ nguồn Chỉ sử dụng được với Graphics Capture và Desktop Duplication - + Lấy cả thanh tiêu đề - + Lề cửa sổ tùy chỉnh - + Dưới - + Trái px - + Phải - + Trên - + Vô hiệu hóa thay đổi cỡ cửa sổ @@ -574,7 +571,7 @@ Phân giải thất bại - + Các chế độ scale @@ -694,28 +691,28 @@ Chọn file chạy của chương trình - + Nâng cao - + Cho phép scale cửa sổ toàn màn hình Cải thiện hiệu năng. Tuy nhiên các hiệu ứng phải được biên dịch lại khi các thông số của chúng đươc chỉnh - + Đặt thông số hiệu ứng trực tiếp Các thông báo và pop-up từ một số ứng dụng sẽ bị chặn - + Giả lập chế độ toàn màn hình độc lập Những cài đặt này chỉ dành cho mục đích phát triển - + Cài đặt nhà phát triển @@ -733,16 +730,16 @@ Đặt cảnh bảo như lỗi khi đọc hiệu ứng - + Chung - + Ngôn ngữ Mặc định Windows - + Chế độ Portable @@ -757,10 +754,10 @@ Magpie sẽ tiếp tục chạy kể cả khi cửa sổ chính bị đóng - + Hiển thị trên thanh tác vụ - + Màu @@ -772,22 +769,22 @@ Mặc định Windows - + Chạy Bạn cần mở với quyền quản trị viên để thay đổi cài đặt này - + Luôn chạy với quyền quản trị viên - + Chạy khi khởi động Bạn cần bật "Hiển thị trên thanh tác vụ" để sử dụng cài đặt này - + Thu nhỏ về thanh tác vụ khi khởi động diff --git a/src/Magpie.App/Resources.language-zh-Hans.resw b/src/Magpie.App/Resources.language-zh-Hans.resw index 50c03bb11..21b66b3cd 100644 --- a/src/Magpie.App/Resources.language-zh-Hans.resw +++ b/src/Magpie.App/Resources.language-zh-Hans.resw @@ -120,13 +120,13 @@ 关于 - + 激活 当该窗口回到前台时将自动缩放 - + 记忆缩放窗口 @@ -147,7 +147,7 @@ 计时结束后缩放前台窗口 - + 定时器 @@ -156,7 +156,7 @@ 取消 - + 倒计时时长 @@ -216,34 +216,34 @@ 缩放配置 - + 高级 - + 常规 - + 语言 Windows 默认 - + 便携模式 打开配置文件位置 - + 开机启动 主窗口被关闭后 Magpie 将在后台继续运行 - + 在系统托盘上显示应用程序 - + 主题 @@ -261,22 +261,22 @@ - + 快捷键 - + 游戏内叠加层 游戏内叠加层快捷键 - + 缩放 缩放快捷键 - + 启动 @@ -291,13 +291,13 @@ 更多选项 - + 缩放模式 以管理员身份运行时才能使用此选项 - + 始终以管理员身份运行 @@ -315,7 +315,7 @@ {} 可用 - + 其他链接 @@ -441,19 +441,19 @@ 指定等比缩放到充满屏幕后的缩放倍数 - + 常规 - + 3D 游戏模式 - + 位于前台时自动缩放 - + 捕获方式 - + 首选的显示器 @@ -465,7 +465,7 @@ 源窗口跨越的所有显示器 - + 缩放模式 @@ -513,34 +513,34 @@ - + 性能 - + 显示卡 - + 显示帧率 - + 反馈 - + 讨论区 - + 报告错误 - + 建议功能 程序版本 - + 检查预览版更新 - + 自动检查更新 @@ -579,22 +579,22 @@ 安装中 - + 高级 - + 禁用 DirectFlip - + 光标 - + 绘制光标 - + 缩放时调整光标速度 - + 插值算法 @@ -603,7 +603,7 @@ 最近邻 - + 缩放系数 @@ -618,52 +618,52 @@ 默认 - + 源窗口 仅在 Graphics Capture 和 Desktop Duplication 捕获方式下可用 - + 捕获标题栏 - + 自定义裁剪 - + - + 像素 - + - + - + 缩放时禁用窗口大小调整 稍微提高性能,但每次修改效果的参数都需重新编译该效果 - + 内联效果参数 可以阻止某些应用的通知和弹窗 - + 缩放时模拟独占全屏 启用了“在系统托盘上显示应用程序”时才能使用此选项 - + 启动时最小化到系统托盘 @@ -693,7 +693,7 @@ 这些设置仅供开发使用 - + 开发者选项 @@ -751,18 +751,15 @@ 导入旧版程序的 ScaleModels.json - + 更新设置 版本 - + 启动参数 - - 编辑 - 性能分析器 @@ -805,7 +802,7 @@ 禁用字体缓存 - + 允许缩放最大化或全屏的窗口 @@ -826,10 +823,10 @@ 缩放前台窗口或停止缩放 - + 帧率限制 - + 最大帧率 @@ -838,4 +835,4 @@ 开发者模式已启用。 - + \ No newline at end of file diff --git a/src/Magpie.App/Resources.language-zh-Hant.resw b/src/Magpie.App/Resources.language-zh-Hant.resw index 77349e802..58fb89a52 100644 --- a/src/Magpie.App/Resources.language-zh-Hant.resw +++ b/src/Magpie.App/Resources.language-zh-Hant.resw @@ -120,13 +120,13 @@ 關於 - + 啟用 當該視窗回到前景時將自動縮放 - + 記住縮放視窗 @@ -144,7 +144,7 @@ 首頁 - + 計時器 @@ -156,7 +156,7 @@ 取消 - + 倒數計時延遲 @@ -207,31 +207,31 @@ 縮放設定 - + 進階設定 - + 語言 Windows 預設 - + 可攜模式 打開組態檔案位置 - + 開機啟動 主視窗被關閉後 Magpie 將在背景繼續執行 - + 一般資訊 - + 主題 @@ -246,22 +246,22 @@ 已停用 - + 鍵盤快速鍵 - + 遊戲內遮罩 遊戲內遮罩的鍵盤快速鍵 - + 縮放 縮放的鍵盤快速鍵 - + 啟動 @@ -285,7 +285,7 @@ 開啟新視窗以新增設定檔 - + 工具列圖示 @@ -294,13 +294,13 @@ 更多設定 - + 縮放模式 以管理員身份執行時才能使用此選項 - + 始終以管理員身份執行 @@ -315,7 +315,7 @@ 以後再提醒我 - + 其他連結 @@ -423,16 +423,16 @@ 指定等比縮放到填滿螢幕後的縮放倍數 - + 一般資訊 - + 3D 遊戲模式 - + 前景時自動縮放 - + 偏好顯示器 @@ -459,25 +459,25 @@ 剖析失敗 - + 效能 - + 顯示卡 - + 顯示畫面幀數 - + 回饋 - + 建議功能 程式版本 - + 檢查預覽版更新 @@ -516,28 +516,28 @@ 安裝中 - + 進階設定 - + 停用 DirectFlip - + 游標 - + 繪製游標 - + 縮放時調整游標速度 - + 插值算法 最近相鄰 - + 縮放係數 @@ -552,40 +552,40 @@ 僅在 Graphics Capture 與 Desktop Duplication 擷取方式下可用 - + 自訂裁切 - + - + 像素 - + - + - + 縮放時停用視窗大小調整 稍微提高效能,但每次修改效果的參數都需重新編譯該效果 - + 內聯效果參數 啟用了“工具列圖示”時才能使用此選項 - + 啟動時最小化到工具列圖示 - + 縮放時模擬獨占全螢幕 @@ -612,7 +612,7 @@ 這些設置僅供開發使用 - + 開發者選項 @@ -694,10 +694,10 @@ 重新排列 - + 縮放模式 - + 截取方式 @@ -724,16 +724,16 @@ - + 討論版 - + 報告錯誤 - + 自動檢查更新 - + 擷取標題欄 @@ -745,7 +745,7 @@ 自訂 - + 來源視窗 @@ -754,15 +754,12 @@ 程式版本 - + 更新設定 - + 啟動參數 - - 編輯 - 截取方式 diff --git a/src/Magpie.App/RootPage.xaml b/src/Magpie.App/RootPage.xaml index 0103d806d..4468f4c26 100644 --- a/src/Magpie.App/RootPage.xaml +++ b/src/Magpie.App/RootPage.xaml @@ -21,7 +21,7 @@ Canvas.ZIndex="0" CompactModeThresholdWidth="0" DisplayModeChanged="NavigationView_DisplayModeChanged" - ExpandedModeThresholdWidth="950" + ExpandedModeThresholdWidth="920" IsBackButtonVisible="Collapsed" ItemInvoked="NavigationView_ItemInvoked" PaneClosing="NavigationView_PaneClosing" diff --git a/src/Magpie.App/ScalingConfigurationPage.xaml b/src/Magpie.App/ScalingConfigurationPage.xaml index 5a768e93d..0c736277b 100644 --- a/src/Magpie.App/ScalingConfigurationPage.xaml +++ b/src/Magpie.App/ScalingConfigurationPage.xaml @@ -136,7 +136,8 @@ + SelectionMode="None" + TabNavigation="Local"> + + + + + + + + + + + + + + + + - - - - - - - + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + - - - + + + + + + + + + + + + + + + + + @@ -586,4 +566,4 @@ - + \ No newline at end of file diff --git a/src/Magpie.App/SettingsCard.cpp b/src/Magpie.App/SettingsCard.cpp index 45aca58ad..9b6469b6f 100644 --- a/src/Magpie.App/SettingsCard.cpp +++ b/src/Magpie.App/SettingsCard.cpp @@ -1,98 +1,323 @@ +// 移植自 https://github.com/CommunityToolkit/Windows/tree/bef863ca70bb1edf8c940198dd5cc74afa5d2aab/components/SettingsControls/src/SettingsCard + #include "pch.h" #include "SettingsCard.h" #if __has_include("SettingsCard.g.cpp") #include "SettingsCard.g.cpp" #endif +#include using namespace winrt; +using namespace Windows::UI::Xaml; using namespace Windows::UI::Xaml::Controls; -using namespace Windows::UI::Xaml::Data; +using namespace Windows::UI::Xaml::Input; namespace winrt::Magpie::App::implementation { -DependencyProperty SettingsCard::RawTitleProperty = DependencyProperty::Register( - L"RawTitle", - xaml_typename(), - xaml_typename(), - PropertyMetadata(nullptr, _OnTitleChanged) -); +static constexpr const wchar_t* CommonStates = L"CommonStates"; +static constexpr const wchar_t* NormalState = L"Normal"; +static constexpr const wchar_t* PointerOverState = L"PointerOver"; +static constexpr const wchar_t* PressedState = L"Pressed"; +static constexpr const wchar_t* DisabledState = L"Disabled"; -DependencyProperty SettingsCard::TitleProperty = DependencyProperty::Register( - L"Title", - xaml_typename(), - xaml_typename(), - PropertyMetadata(box_value(L""), _OnTitleChanged) +static constexpr const wchar_t* ContentAlignmentStates = L"ContentAlignmentStates"; +static constexpr const wchar_t* RightState = L"Right"; +static constexpr const wchar_t* RightWrappedState = L"RightWrapped"; +static constexpr const wchar_t* RightWrappedNoIconState = L"RightWrappedNoIcon"; +static constexpr const wchar_t* LeftState = L"Left"; +static constexpr const wchar_t* VerticalState = L"Vertical"; + +static constexpr const wchar_t* ContentSpacingStates = L"ContentSpacingStates"; +static constexpr const wchar_t* NoContentSpacingState = L"NoContentSpacing"; +static constexpr const wchar_t* ContentSpacingState = L"ContentSpacing"; + +static constexpr const wchar_t* RootGrid = L"PART_RootGrid"; +static constexpr const wchar_t* ActionIconPresenterHolder = L"PART_ActionIconPresenterHolder"; +static constexpr const wchar_t* HeaderPresenter = L"PART_HeaderPresenter"; +static constexpr const wchar_t* DescriptionPresenter = L"PART_DescriptionPresenter"; +static constexpr const wchar_t* HeaderIconPresenterHolder = L"PART_HeaderIconPresenterHolder"; + +static constexpr const wchar_t* RightWrappedTrigger = L"RightWrappedTrigger"; +static constexpr const wchar_t* RightWrappedNoIconTrigger = L"RightWrappedNoIconTrigger"; + +const DependencyProperty SettingsCard::_headerProperty = DependencyProperty::Register( + L"Header", + xaml_typename(), + xaml_typename(), + PropertyMetadata(nullptr, &SettingsCard::_OnHeaderChanged) ); -DependencyProperty SettingsCard::DescriptionProperty = DependencyProperty::Register( +const DependencyProperty SettingsCard::_descriptionProperty = DependencyProperty::Register( L"Description", xaml_typename(), - xaml_typename(), + xaml_typename(), PropertyMetadata(nullptr, &SettingsCard::_OnDescriptionChanged) ); -DependencyProperty SettingsCard::IconProperty = DependencyProperty::Register( - L"Icon", - xaml_typename(), - xaml_typename(), - PropertyMetadata(nullptr, &SettingsCard::_OnIconChanged) +const DependencyProperty SettingsCard::_headerIconProperty = DependencyProperty::Register( + L"HeaderIcon", + xaml_typename(), + xaml_typename(), + PropertyMetadata(nullptr, &SettingsCard::_OnHeaderIconChanged) ); -DependencyProperty SettingsCard::ActionContentProperty = DependencyProperty::Register( - L"ActionContent", - xaml_typename(), - xaml_typename(), - PropertyMetadata(nullptr, &SettingsCard::_OnActionContentChanged) +const DependencyProperty SettingsCard::_actionIconProperty = DependencyProperty::Register( + L"ActionIcon", + xaml_typename(), + xaml_typename(), + PropertyMetadata(box_value(L"\ue974")) +); + +const DependencyProperty SettingsCard::_actionIconToolTipProperty = DependencyProperty::Register( + L"ActionIconToolTip", + xaml_typename(), + xaml_typename(), + nullptr +); + +const DependencyProperty SettingsCard::_isClickEnabledProperty = DependencyProperty::Register( + L"IsClickEnabled", + xaml_typename(), + xaml_typename(), + PropertyMetadata(box_value(false), &SettingsCard::_OnIsClickEnabledChanged) ); -void SettingsCard::_OnRawTitleChanged(DependencyObject const& sender, DependencyPropertyChangedEventArgs const&) { - SettingsCard* that = get_self(sender.as>()); - that->_Update(); - that->_propertyChangedEvent(*that, PropertyChangedEventArgs{ L"RawTitle" }); +const DependencyProperty SettingsCard::_contentAlignmentProperty = DependencyProperty::Register( + L"ContentAlignment", + xaml_typename(), + xaml_typename(), + PropertyMetadata(box_value(ContentAlignment::Right)) +); + +const DependencyProperty SettingsCard::_isActionIconVisibleProperty = DependencyProperty::Register( + L"IsActionIconVisible", + xaml_typename(), + xaml_typename(), + PropertyMetadata(box_value(true), &SettingsCard::_OnIsActionIconVisibleChanged) +); + +const DependencyProperty SettingsCard::_isWrapEnabledProperty = DependencyProperty::Register( + L"IsWrapEnabled", + xaml_typename(), + xaml_typename(), + PropertyMetadata(box_value(false), &SettingsCard::_OnIsWrapEnabledChanged) +); + +SettingsCard::SettingsCard() { + DefaultStyleKey(box_value(GetRuntimeClassName())); +} + +SettingsCard::~SettingsCard() { + // 不知为何必须手动释放 StateTriggers,否则会内存泄露 + if (auto stateGroup = GetTemplateChild(ContentAlignmentStates)) { + for (VisualState state : stateGroup.as().States()) { + state.StateTriggers().Clear(); + } + } } -void SettingsCard::_OnTitleChanged(DependencyObject const& sender, DependencyPropertyChangedEventArgs const&) { - SettingsCard* that = get_self(sender.as>()); - that->_Update(); - that->_propertyChangedEvent(*that, PropertyChangedEventArgs{ L"Title" }); +void SettingsCard::OnApplyTemplate() { + base_type::OnApplyTemplate(); + + // https://github.com/microsoft/microsoft-ui-xaml/issues/7792 + // 对于 Content,模板中的样式不起作用 + auto resources = Resources(); + for (const auto& [key, value] : GetTemplateChild(RootGrid).as().Resources()) { + resources.Insert(key, value); + } + + _OnIsWrapEnabledChanged(); + + _contentAlignmentStatesChangedRevoker.revoke(); + _sizeChangedRevoker.revoke(); + _isEnabledChangedRevoker.revoke(); + + _OnActionIconChanged(); + _OnHeaderChanged(); + _OnHeaderIconChanged(); + _OnDescriptionChanged(); + _OnIsClickEnabledChanged(); + + VisualStateGroup contentAlignmentStatesGroup = GetTemplateChild(ContentAlignmentStates).as(); + _contentAlignmentStatesChangedRevoker = contentAlignmentStatesGroup.CurrentStateChanged(auto_revoke, [this](IInspectable const&, VisualStateChangedEventArgs const& args) { + _CheckVerticalSpacingState(args.NewState()); + }); + + // 修复启动时的动画错误 + _sizeChangedRevoker = SizeChanged(auto_revoke, [this, contentAlignmentStatesGroup(std::move(contentAlignmentStatesGroup))](IInspectable const&, SizeChangedEventArgs const&) { + _CheckVerticalSpacingState(contentAlignmentStatesGroup.CurrentState()); + }); + + VisualStateManager::GoToState(*this, IsEnabled() ? NormalState : DisabledState, true); + _isEnabledChangedRevoker = IsEnabledChanged(auto_revoke, [this](IInspectable const&, DependencyPropertyChangedEventArgs const&) { + VisualStateManager::GoToState(*this, IsEnabled() ? NormalState : DisabledState, true); + }); +} + +void SettingsCard::OnPointerPressed(PointerRoutedEventArgs const& args) { + // 忽略鼠标右键 + if (IsClickEnabled() && !(args.Pointer().PointerDeviceType() == Windows::Devices::Input::PointerDeviceType::Mouse && args.GetCurrentPoint(*this).Properties().PointerUpdateKind() == Windows::UI::Input::PointerUpdateKind::RightButtonPressed)) { + base_type::OnPointerPressed(args); + VisualStateManager::GoToState(*this, PressedState, true); + + _isCursorCaptured = true; + } +} + +void SettingsCard::OnPointerReleased(PointerRoutedEventArgs const& args) { + if (_isCursorCaptured && IsClickEnabled()) { + base_type::OnPointerReleased(args); + VisualStateManager::GoToState(*this, _isCursorOnControl ? PointerOverState : NormalState, true); + } else { + // 修复 SettingsExcpander.Items 中的 SettingsCard 对于鼠标点击会错误设置焦点的问题 + Dispatcher().TryRunAsync(CoreDispatcherPriority::Normal, [this]() { + for (auto parent = VisualTreeHelper::GetParent(*this); parent; parent = VisualTreeHelper::GetParent(parent)) { + Control control = parent.try_as(); + if (control && control.IsTabStop()) { + control.Focus(FocusState::Pointer); + break; + } + } + }); + } + + _isCursorCaptured = false; +} + +void SettingsCard::_OnHeaderChanged(DependencyObject const& sender, DependencyPropertyChangedEventArgs const&) { + get_self(sender.as())->_OnHeaderChanged(); } void SettingsCard::_OnDescriptionChanged(DependencyObject const& sender, DependencyPropertyChangedEventArgs const&) { - SettingsCard* that = get_self(sender.as>()); - that->_Update(); - that->_propertyChangedEvent(*that, PropertyChangedEventArgs{ L"Description" }); + get_self(sender.as())->_OnDescriptionChanged(); +} + +void SettingsCard::_OnHeaderIconChanged(DependencyObject const& sender, DependencyPropertyChangedEventArgs const&) { + get_self(sender.as())->_OnHeaderIconChanged(); +} + +void SettingsCard::_OnIsClickEnabledChanged(DependencyObject const& sender, DependencyPropertyChangedEventArgs const&) { + get_self(sender.as())->_OnIsClickEnabledChanged(); +} + +void SettingsCard::_OnIsActionIconVisibleChanged(DependencyObject const& sender, DependencyPropertyChangedEventArgs const&) { + get_self(sender.as())->_OnActionIconChanged(); +} + +void SettingsCard::_OnIsWrapEnabledChanged(DependencyObject const& sender, DependencyPropertyChangedEventArgs const&) { + get_self(sender.as())->_OnIsWrapEnabledChanged(); } -void SettingsCard::_OnIconChanged(DependencyObject const& sender, DependencyPropertyChangedEventArgs const&) { - SettingsCard* that = get_self(sender.as>()); - that->_Update(); - that->_propertyChangedEvent(*that, PropertyChangedEventArgs{ L"Icon" }); +void SettingsCard::_OnHeaderChanged() const { + if (FrameworkElement headerPresenter = GetTemplateChild(HeaderPresenter).try_as()) { + headerPresenter.Visibility(Header() ? Visibility::Visible : Visibility::Collapsed); + } } -void SettingsCard::_OnActionContentChanged(DependencyObject const& sender, DependencyPropertyChangedEventArgs const&) { - SettingsCard* that = get_self(sender.as>()); - that->_Update(); - that->_propertyChangedEvent(*that, PropertyChangedEventArgs{ L"ActionContent" }); +void SettingsCard::_OnDescriptionChanged() const { + if (FrameworkElement descriptionPresenter = GetTemplateChild(DescriptionPresenter).try_as()) { + descriptionPresenter.Visibility(Description() ? Visibility::Visible : Visibility::Collapsed); + } } -void SettingsCard::_Update() { - RawTitlePresenter().Visibility(RawTitle() == nullptr ? Visibility::Collapsed : Visibility::Visible); - TitleTextBlock().Visibility(Title().empty() ? Visibility::Collapsed : Visibility::Visible); - DescriptionPresenter().Visibility(Description() == nullptr ? Visibility::Collapsed : Visibility::Visible); - IconPresenter().Visibility(Icon() == nullptr ? Visibility::Collapsed : Visibility::Visible); +void SettingsCard::_OnHeaderIconChanged() const { + if (FrameworkElement headerIconPresenter = GetTemplateChild(HeaderIconPresenterHolder).try_as()) { + headerIconPresenter.Visibility(HeaderIcon() ? Visibility::Visible : Visibility::Collapsed); + } } -void SettingsCard::_SetEnabledState() { - VisualStateManager::GoToState(*this, IsEnabled() ? L"Normal" : L"Disabled", true); +void SettingsCard::_OnIsClickEnabledChanged() { + _OnActionIconChanged(); + + if (IsClickEnabled()) { + _EnableButtonInteraction(); + } else { + _DisableButtonInteraction(); + } } -void SettingsCard::IsEnabledChanged(IInspectable const&, DependencyPropertyChangedEventArgs const&) { - _SetEnabledState(); +void SettingsCard::_OnActionIconChanged() const { + if (FrameworkElement actionIconPresenter = GetTemplateChild(ActionIconPresenterHolder).try_as()) { + if (IsClickEnabled() && IsActionIconVisible()) { + actionIconPresenter.Visibility(Visibility::Visible); + } else { + actionIconPresenter.Visibility(Visibility::Collapsed); + } + } +} + +void SettingsCard::_OnIsWrapEnabledChanged() const { + auto trigger1 = GetTemplateChild(RightWrappedTrigger); + auto trigger2 = GetTemplateChild(RightWrappedNoIconTrigger); + + if (trigger1 && trigger2) { + // CanTrigger 无法使用 TemplateBinding? + const bool isWrapEnabled = IsWrapEnabled(); + trigger1.as().CanTrigger(isWrapEnabled); + trigger2.as().CanTrigger(isWrapEnabled); + } +} + +void SettingsCard::_CheckVerticalSpacingState(VisualState const& s) { + // On state change, checking if the Content should be wrapped (e.g. when the card is made smaller or the ContentAlignment is set to Vertical). If the Content and the Header or Description are not null, we add spacing between the Content and the Header/Description. + + const hstring stateName = s ? s.Name() : hstring(); + if (!stateName.empty() && (stateName == RightWrappedState || stateName == RightWrappedNoIconState || + stateName == VerticalState) && Content() && (Header() || Description())) { + VisualStateManager::GoToState(*this, ContentSpacingState, true); + } else { + VisualStateManager::GoToState(*this, NoContentSpacingState, true); + } +} + +void SettingsCard::_EnableButtonInteraction() { + _DisableButtonInteraction(); + + IsTabStop(true); + + _pointerEnteredRevoker = PointerEntered(auto_revoke, [this](IInspectable const&, PointerRoutedEventArgs const&) { + VisualStateManager::GoToState(*this, _isCursorCaptured ? PressedState : PointerOverState, true); + _isCursorOnControl = true; + }); + + _pointerExitedRevoker = PointerExited(auto_revoke, [this](IInspectable const&, PointerRoutedEventArgs const&) { + VisualStateManager::GoToState(*this, NormalState, true); + _isCursorOnControl = false; + }); + + auto goToNormalState = [this](IInspectable const&, PointerRoutedEventArgs const&) { + VisualStateManager::GoToState(*this, NormalState, true); + }; + + _pointerCaptureLostRevoker = PointerCaptureLost(auto_revoke, goToNormalState); + _pointerCanceledRevoker = PointerCanceled(auto_revoke, goToNormalState); + + _previewKeyDownRevoker = PreviewKeyDown(auto_revoke, [this](IInspectable const&, KeyRoutedEventArgs const& args) { + const VirtualKey key = args.Key(); + if (key == VirtualKey::Enter || key == VirtualKey::Space || key == VirtualKey::GamepadA) { + // Check if the active focus is on the card itself - only then we show the pressed state. + if (FocusManager::GetFocusedElement(XamlRoot()) == *this) { + VisualStateManager::GoToState(*this, PressedState, true); + } + } + }); + + _previewKeyUpRevoker = PreviewKeyUp(auto_revoke, [this](IInspectable const&, KeyRoutedEventArgs const& args) { + const VirtualKey key = args.Key(); + if (key == VirtualKey::Enter || key == VirtualKey::Space || key == VirtualKey::GamepadA) { + VisualStateManager::GoToState(*this, NormalState, true); + } + }); } -void SettingsCard::Loading(FrameworkElement const&, IInspectable const&) { - _SetEnabledState(); - _Update(); +void SettingsCard::_DisableButtonInteraction() { + IsTabStop(false); + _pointerEnteredRevoker.revoke(); + _pointerExitedRevoker.revoke(); + _pointerCaptureLostRevoker.revoke(); + _pointerCanceledRevoker.revoke(); + _previewKeyDownRevoker.revoke(); + _previewKeyUpRevoker.revoke(); } } diff --git a/src/Magpie.App/SettingsCard.h b/src/Magpie.App/SettingsCard.h index 5b1f1685b..0d019be73 100644 --- a/src/Magpie.App/SettingsCard.h +++ b/src/Magpie.App/SettingsCard.h @@ -3,76 +3,98 @@ namespace winrt::Magpie::App::implementation { -struct SettingsCard : SettingsCardT { - void RawTitle(IInspectable const& value) { - SetValue(RawTitleProperty, value); - } +struct SettingsCard : SettingsCard_base { + SettingsCard(); - IInspectable RawTitle() const { - return GetValue(RawTitleProperty); - } + ~SettingsCard(); - void Title(const hstring& value) { - SetValue(TitleProperty, box_value(value)); - } + static DependencyProperty HeaderProperty() { return _headerProperty; } + static DependencyProperty DescriptionProperty() { return _descriptionProperty; } + static DependencyProperty HeaderIconProperty() { return _headerIconProperty; } + static DependencyProperty ActionIconProperty() { return _actionIconProperty; } + static DependencyProperty ActionIconToolTipProperty() { return _actionIconToolTipProperty; } + static DependencyProperty IsClickEnabledProperty() { return _isClickEnabledProperty; } + static DependencyProperty ContentAlignmentProperty() { return _contentAlignmentProperty; } + static DependencyProperty IsActionIconVisibleProperty() { return _isActionIconVisibleProperty; } + static DependencyProperty IsWrapEnabledProperty() { return _isWrapEnabledProperty; } - hstring Title() const { - return GetValue(TitleProperty).as(); - } + IInspectable Header() const { return GetValue(_headerProperty); } + void Header(IInspectable const& value) const { SetValue(_headerProperty, value); } - void Description(IInspectable const& value) { - SetValue(DescriptionProperty, value); - } + IInspectable Description() const { return GetValue(_descriptionProperty); } + void Description(IInspectable const& value) const { SetValue(_descriptionProperty, value); } - IInspectable Description() const { - return GetValue(DescriptionProperty); - } + Controls::IconElement HeaderIcon() const { return GetValue(_headerIconProperty).as(); } + void HeaderIcon(Controls::IconElement const& value) const { SetValue(_headerIconProperty, value); } - void Icon(IInspectable const& value) { - SetValue(IconProperty, value); - } + Controls::IconElement ActionIcon() const { return GetValue(_actionIconProperty).as(); } + void ActionIcon(Controls::IconElement const& value) const { SetValue(_actionIconProperty, value); } - IInspectable Icon() const { - return GetValue(IconProperty); - } + hstring ActionIconToolTip() const { return GetValue(_actionIconToolTipProperty).as(); } + void ActionIconToolTip(const hstring& value) const { SetValue(_actionIconToolTipProperty, box_value(value)); } - void ActionContent(IInspectable const& value) { - SetValue(ActionContentProperty, value); - } + bool IsClickEnabled() const { return GetValue(_isClickEnabledProperty).as(); } + void IsClickEnabled(bool value) const { SetValue(_isClickEnabledProperty, box_value(value)); } - IInspectable ActionContent() const { - return GetValue(ActionContentProperty); - } + ContentAlignment ContentAlignment() const { return GetValue(_contentAlignmentProperty).as(); } + void ContentAlignment(Magpie::App::ContentAlignment value) const { SetValue(_contentAlignmentProperty, box_value(value)); } - void IsEnabledChanged(IInspectable const&, DependencyPropertyChangedEventArgs const&); - void Loading(FrameworkElement const&, IInspectable const&); + bool IsActionIconVisible() const { return GetValue(_isActionIconVisibleProperty).as(); } + void IsActionIconVisible(bool value) const { SetValue(_isActionIconVisibleProperty, box_value(value)); } - event_token PropertyChanged(PropertyChangedEventHandler const& value) { - return _propertyChangedEvent.add(value); - } + bool IsWrapEnabled() const { return GetValue(_isWrapEnabledProperty).as(); } + void IsWrapEnabled(bool value) const { SetValue(_isWrapEnabledProperty, box_value(value)); } - void PropertyChanged(event_token const& token) { - _propertyChangedEvent.remove(token); - } + void OnApplyTemplate(); - static DependencyProperty RawTitleProperty; - static DependencyProperty TitleProperty; - static DependencyProperty DescriptionProperty; - static DependencyProperty IconProperty; - static DependencyProperty ActionContentProperty; + void OnPointerPressed(Input::PointerRoutedEventArgs const& args); + + void OnPointerReleased(Input::PointerRoutedEventArgs const& args); private: - static void _OnRawTitleChanged(DependencyObject const& sender, DependencyPropertyChangedEventArgs const&); - static void _OnTitleChanged(DependencyObject const& sender, DependencyPropertyChangedEventArgs const&); + static const DependencyProperty _headerProperty; + static const DependencyProperty _descriptionProperty; + static const DependencyProperty _headerIconProperty; + static const DependencyProperty _actionIconProperty; + static const DependencyProperty _actionIconToolTipProperty; + static const DependencyProperty _isClickEnabledProperty; + static const DependencyProperty _contentAlignmentProperty; + static const DependencyProperty _isActionIconVisibleProperty; + static const DependencyProperty _isWrapEnabledProperty; + + static void _OnHeaderChanged(DependencyObject const& sender, DependencyPropertyChangedEventArgs const&); static void _OnDescriptionChanged(DependencyObject const& sender, DependencyPropertyChangedEventArgs const&); - static void _OnIconChanged(DependencyObject const& sender, DependencyPropertyChangedEventArgs const&); - static void _OnActionContentChanged(DependencyObject const& sender, DependencyPropertyChangedEventArgs const&); + static void _OnHeaderIconChanged(DependencyObject const& sender, DependencyPropertyChangedEventArgs const&); + static void _OnIsClickEnabledChanged(DependencyObject const& sender, DependencyPropertyChangedEventArgs const&); + static void _OnIsActionIconVisibleChanged(DependencyObject const& sender, DependencyPropertyChangedEventArgs const&); + static void _OnIsWrapEnabledChanged(DependencyObject const& sender, DependencyPropertyChangedEventArgs const&); + + void _OnHeaderChanged() const; + void _OnDescriptionChanged() const; + void _OnHeaderIconChanged() const; + void _OnIsClickEnabledChanged(); + void _OnActionIconChanged() const; + void _OnIsWrapEnabledChanged() const; + + void _CheckVerticalSpacingState(VisualState const& s); + + void _EnableButtonInteraction(); + + void _DisableButtonInteraction(); - void _Update(); + IsEnabledChanged_revoker _isEnabledChangedRevoker; + VisualStateGroup::CurrentStateChanged_revoker _contentAlignmentStatesChangedRevoker; + SizeChanged_revoker _sizeChangedRevoker; - void _SetEnabledState(); + UIElement::PointerEntered_revoker _pointerEnteredRevoker; + UIElement::PointerExited_revoker _pointerExitedRevoker; + UIElement::PointerCaptureLost_revoker _pointerCaptureLostRevoker; + UIElement::PointerCanceled_revoker _pointerCanceledRevoker; + UIElement::PreviewKeyDown_revoker _previewKeyDownRevoker; + UIElement::PreviewKeyUp_revoker _previewKeyUpRevoker; - event _propertyChangedEvent; + bool _isCursorCaptured = false; + bool _isCursorOnControl = false; }; } diff --git a/src/Magpie.App/SettingsCard.idl b/src/Magpie.App/SettingsCard.idl index 1f2a17056..0e520e7bf 100644 --- a/src/Magpie.App/SettingsCard.idl +++ b/src/Magpie.App/SettingsCard.idl @@ -1,13 +1,47 @@ -namespace Magpie.App { - [Windows.UI.Xaml.Markup.ContentProperty("RawTitle")] - runtimeclass SettingsCard : Windows.UI.Xaml.Controls.UserControl, Windows.UI.Xaml.Data.INotifyPropertyChanged - { +namespace Magpie.App{ + enum ContentAlignment { + /// The Content is aligned to the right. Default state. + Right, + /// The Content is left-aligned while the Header, HeaderIcon and Description are collapsed. This is commonly used for Content types such as CheckBoxes, RadioButtons and custom layouts. + Left, + /// The Content is vertically aligned. + Vertical + }; + + [Windows.UI.Xaml.TemplateVisualState("NormalState", "CommonStates")] + [Windows.UI.Xaml.TemplateVisualState("PointerOverState", "CommonStates")] + [Windows.UI.Xaml.TemplateVisualState("PressedState", "CommonStates")] + [Windows.UI.Xaml.TemplateVisualState("DisabledState", "CommonStates")] + + [Windows.UI.Xaml.TemplateVisualState("RightState", "ContentAlignmentStates")] + [Windows.UI.Xaml.TemplateVisualState("RightWrappedState", "ContentAlignmentStates")] + [Windows.UI.Xaml.TemplateVisualState("RightWrappedNoIconState", "ContentAlignmentStates")] + [Windows.UI.Xaml.TemplateVisualState("LeftState", "ContentAlignmentStates")] + [Windows.UI.Xaml.TemplateVisualState("VerticalState", "ContentAlignmentStates")] + + [Windows.UI.Xaml.TemplateVisualState("NoContentSpacingState", "ContentSpacingStates")] + [Windows.UI.Xaml.TemplateVisualState("ContentSpacingState", "ContentSpacingStates")] + runtimeclass SettingsCard : Windows.UI.Xaml.Controls.Primitives.ButtonBase { SettingsCard(); - - Object RawTitle; - String Title; + + static Windows.UI.Xaml.DependencyProperty HeaderProperty { get; }; + static Windows.UI.Xaml.DependencyProperty DescriptionProperty { get; }; + static Windows.UI.Xaml.DependencyProperty HeaderIconProperty { get; }; + static Windows.UI.Xaml.DependencyProperty ActionIconProperty { get; }; + static Windows.UI.Xaml.DependencyProperty ActionIconToolTipProperty { get; }; + static Windows.UI.Xaml.DependencyProperty IsClickEnabledProperty { get; }; + static Windows.UI.Xaml.DependencyProperty ContentAlignmentProperty { get; }; + static Windows.UI.Xaml.DependencyProperty IsActionIconVisibleProperty { get; }; + static Windows.UI.Xaml.DependencyProperty IsWrapEnabledProperty { get; }; + + Object Header; Object Description; - Object Icon; - Object ActionContent; + Windows.UI.Xaml.Controls.IconElement HeaderIcon; + Windows.UI.Xaml.Controls.IconElement ActionIcon; + String ActionIconToolTip; + Boolean IsClickEnabled; + ContentAlignment ContentAlignment; + Boolean IsActionIconVisible; + Boolean IsWrapEnabled; } } diff --git a/src/Magpie.App/SettingsCard.xaml b/src/Magpie.App/SettingsCard.xaml index 10ceef8ca..6e96d1f58 100644 --- a/src/Magpie.App/SettingsCard.xaml +++ b/src/Magpie.App/SettingsCard.xaml @@ -1,113 +1,1048 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Left + + + + + + + + + + + + + + + + + + + Vertical + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/Magpie.App/SettingsExpander.cpp b/src/Magpie.App/SettingsExpander.cpp new file mode 100644 index 000000000..0c599ecb6 --- /dev/null +++ b/src/Magpie.App/SettingsExpander.cpp @@ -0,0 +1,160 @@ +// 移植自 https://github.com/CommunityToolkit/Windows/tree/bef863ca70bb1edf8c940198dd5cc74afa5d2aab/components/SettingsControls/src/SettingsExpander + +#include "pch.h" +#include "SettingsExpander.h" +#if __has_include("SettingsExpanderItemStyleSelector.g.cpp") +#include "SettingsExpanderItemStyleSelector.g.cpp" +#endif +#if __has_include("SettingsExpander.g.cpp") +#include "SettingsExpander.g.cpp" +#endif + +using namespace winrt; +using namespace Windows::UI::Xaml::Controls; + +namespace winrt::Magpie::App::implementation { + +Style SettingsExpanderItemStyleSelector::SelectStyleCore(IInspectable const&, DependencyObject const& container) { + if (SettingsCard settingsCard = container.try_as()) { + if (settingsCard.IsClickEnabled()) { + return _clickableStyle; + } + } + + return _defaultStyle; +} + +static constexpr const wchar_t* PART_ItemsListView = L"PART_ItemsListView"; + +const DependencyProperty SettingsExpander::_headerProperty = DependencyProperty::Register( + L"Header", + xaml_typename(), + xaml_typename(), + nullptr +); + +const DependencyProperty SettingsExpander::_descriptionProperty = DependencyProperty::Register( + L"Description", + xaml_typename(), + xaml_typename(), + nullptr +); + +const DependencyProperty SettingsExpander::_headerIconProperty = DependencyProperty::Register( + L"HeaderIcon", + xaml_typename(), + xaml_typename(), + nullptr +); + +const DependencyProperty SettingsExpander::_contentProperty = DependencyProperty::Register( + L"Content", + xaml_typename(), + xaml_typename(), + nullptr +); + +const DependencyProperty SettingsExpander::_itemsHeaderProperty = DependencyProperty::Register( + L"ItemsHeader", + xaml_typename(), + xaml_typename(), + nullptr +); + +const DependencyProperty SettingsExpander::_itemsFooterProperty = DependencyProperty::Register( + L"ItemsFooter", + xaml_typename(), + xaml_typename(), + nullptr +); + +const DependencyProperty SettingsExpander::_isExpandedProperty = DependencyProperty::Register( + L"IsExpanded", + xaml_typename(), + xaml_typename(), + PropertyMetadata(box_value(false), &SettingsExpander::_OnIsExpandedChanged) +); + +const DependencyProperty SettingsExpander::_itemsProperty = DependencyProperty::Register( + L"Items", + xaml_typename>(), + xaml_typename(), + PropertyMetadata(nullptr, &SettingsExpander::_OnItemsConnectedPropertyChanged) +); + +const DependencyProperty SettingsExpander::_itemsSourceProperty = DependencyProperty::Register( + L"ItemsSource", + xaml_typename(), + xaml_typename(), + PropertyMetadata(nullptr, &SettingsExpander::_OnItemsConnectedPropertyChanged) +); + +const DependencyProperty SettingsExpander::_itemTemplateProperty = DependencyProperty::Register( + L"ItemTemplate", + xaml_typename(), + xaml_typename(), + nullptr +); + +const DependencyProperty SettingsExpander::_itemContainerStyleSelectorProperty = DependencyProperty::Register( + L"ItemContainerStyleSelector", + xaml_typename(), + xaml_typename(), + nullptr +); + +const DependencyProperty SettingsExpander::_canReorderItemsProperty = DependencyProperty::Register( + L"CanReorderItems", + xaml_typename(), + xaml_typename(), + PropertyMetadata(box_value(false)) +); + +SettingsExpander::SettingsExpander() { + DefaultStyleKey(box_value(GetRuntimeClassName())); + Items(single_threaded_vector()); +} + +void SettingsExpander::OnApplyTemplate() { + base_type::OnApplyTemplate(); + _OnItemsConnectedPropertyChanged(); +} + +void SettingsExpander::_OnIsExpandedChanged(DependencyObject const& sender, DependencyPropertyChangedEventArgs const& args) { + SettingsExpander* that = get_self(sender.as()); + + if (args.NewValue().as()) { + that->_expandedEvent(); + } else { + that->_collapsedEvent(); + } +} + +void SettingsExpander::_OnItemsConnectedPropertyChanged(DependencyObject const& sender, DependencyPropertyChangedEventArgs const&) { + get_self(sender.as())->_OnItemsConnectedPropertyChanged(); +} + +void SettingsExpander::_OnItemsConnectedPropertyChanged() { + ListView listView = GetTemplateChild(PART_ItemsListView).as(); + if (!listView) { + return; + } + + IInspectable datasource = ItemsSource(); + listView.ItemsSource(datasource ? datasource : Items()); + + // 应用样式 + StyleSelector styleSelector = ItemContainerStyleSelector(); + for (IInspectable item : listView.Items()) { + SettingsCard element = item.try_as(); + if (!element) { + continue; + } + + if (element.ReadLocalValue(FrameworkElement::StyleProperty()) == DependencyProperty::UnsetValue()) { + element.Style(styleSelector.SelectStyle(nullptr, element)); + } + } +} + +} diff --git a/src/Magpie.App/SettingsExpander.h b/src/Magpie.App/SettingsExpander.h new file mode 100644 index 000000000..488cdc301 --- /dev/null +++ b/src/Magpie.App/SettingsExpander.h @@ -0,0 +1,128 @@ +#pragma once +#include "SettingsExpanderItemStyleSelector.g.h" +#include "SettingsExpander.g.h" + +namespace winrt::Magpie::App::implementation { + +struct SettingsExpanderItemStyleSelector : SettingsExpanderItemStyleSelectorT { + Style DefaultStyle() const { + return _defaultStyle; + } + + void DefaultStyle(Style const& value) { + _defaultStyle = value; + } + + Style ClickableStyle() const { + return _clickableStyle; + } + + void ClickableStyle(Style const& value) { + _clickableStyle = value; + } + + Style SelectStyleCore(IInspectable const&, DependencyObject const& container); + +private: + Style _defaultStyle{ nullptr }; + Style _clickableStyle{ nullptr }; +}; + +struct SettingsExpander : SettingsExpander_base { + SettingsExpander(); + + static DependencyProperty HeaderProperty() { return _headerProperty; } + static DependencyProperty DescriptionProperty() { return _descriptionProperty; } + static DependencyProperty HeaderIconProperty() { return _headerIconProperty; } + static DependencyProperty ContentProperty() { return _contentProperty; } + static DependencyProperty ItemsHeaderProperty() { return _itemsHeaderProperty; } + static DependencyProperty ItemsFooterProperty() { return _itemsFooterProperty; } + static DependencyProperty IsExpandedProperty() { return _isExpandedProperty; } + static DependencyProperty ItemsProperty() { return _itemsProperty; } + static DependencyProperty ItemsSourceProperty() { return _itemsSourceProperty; } + static DependencyProperty ItemTemplateProperty() { return _itemTemplateProperty; } + static DependencyProperty ItemContainerStyleSelectorProperty() { return _itemContainerStyleSelectorProperty; } + static DependencyProperty CanReorderItemsProperty() { return _canReorderItemsProperty; } + + IInspectable Header() const { return GetValue(_headerProperty); } + void Header(IInspectable const& value) const { SetValue(_headerProperty, value); } + + IInspectable Description() const { return GetValue(_descriptionProperty); } + void Description(IInspectable const& value) const { SetValue(_descriptionProperty, value); } + + Controls::IconElement HeaderIcon() const { return GetValue(_headerIconProperty).as(); } + void HeaderIcon(Controls::IconElement const& value)const { SetValue(_headerIconProperty, value); } + + IInspectable Content() const { return GetValue(_contentProperty); } + void Content(IInspectable const& value) const { SetValue(_contentProperty, value); } + + UIElement ItemsHeader() const { return GetValue(_itemsHeaderProperty).as(); } + void ItemsHeader(UIElement const& value) const { SetValue(_itemsHeaderProperty, value); } + + UIElement ItemsFooter() const { return GetValue(_itemsFooterProperty).as(); } + void ItemsFooter(UIElement const& value) const { SetValue(_itemsFooterProperty, value); } + + bool IsExpanded() const { return GetValue(_isExpandedProperty).as(); } + void IsExpanded(bool value) const { SetValue(_isExpandedProperty, box_value(value)); } + + event_token Expanded(SignalDelegate const& handler) { return _expandedEvent.add(handler); } + void Expanded(winrt::event_token const& token) { _expandedEvent.remove(token); } + + event_token Collapsed(SignalDelegate const& handler) { return _collapsedEvent.add(handler); } + void Collapsed(winrt::event_token const& token) { _collapsedEvent.remove(token); } + + IVector Items() const { return GetValue(_itemsProperty).as>(); } + void Items(IVector const& value) const { SetValue(_itemsProperty, value); } + + IInspectable ItemsSource() const { return GetValue(_itemsSourceProperty); } + void ItemsSource(IInspectable const& value) const { SetValue(_itemsSourceProperty, value); } + + IInspectable ItemTemplate() const { return GetValue(_itemTemplateProperty); } + void ItemTemplate(IInspectable const& value) const { SetValue(_itemTemplateProperty, value); } + + Controls::StyleSelector ItemContainerStyleSelector() const { + return GetValue(_itemContainerStyleSelectorProperty).as(); + } + void ItemContainerStyleSelector(Controls::StyleSelector const& value) const { + SetValue(_itemContainerStyleSelectorProperty, value); + } + + bool CanReorderItems() const { return GetValue(_canReorderItemsProperty).as(); } + void CanReorderItems(bool value) const { SetValue(_canReorderItemsProperty, box_value(value)); } + + void OnApplyTemplate(); + +private: + static const DependencyProperty _headerProperty; + static const DependencyProperty _descriptionProperty; + static const DependencyProperty _headerIconProperty; + static const DependencyProperty _contentProperty; + static const DependencyProperty _itemsHeaderProperty; + static const DependencyProperty _itemsFooterProperty; + static const DependencyProperty _isExpandedProperty; + static const DependencyProperty _itemsProperty; + static const DependencyProperty _itemsSourceProperty; + static const DependencyProperty _itemTemplateProperty; + static const DependencyProperty _itemContainerStyleSelectorProperty; + static const DependencyProperty _canReorderItemsProperty; + + static void _OnIsExpandedChanged(DependencyObject const& sender, DependencyPropertyChangedEventArgs const& args); + static void _OnItemsConnectedPropertyChanged(DependencyObject const& sender, DependencyPropertyChangedEventArgs const&); + + void _OnItemsConnectedPropertyChanged(); + + event _expandedEvent; + event _collapsedEvent; +}; + +} + +namespace winrt::Magpie::App::factory_implementation { + +struct SettingsExpanderItemStyleSelector : SettingsExpanderItemStyleSelectorT { +}; + +struct SettingsExpander : SettingsExpanderT { +}; + +} diff --git a/src/Magpie.App/SettingsExpander.idl b/src/Magpie.App/SettingsExpander.idl new file mode 100644 index 000000000..b1e1c8fff --- /dev/null +++ b/src/Magpie.App/SettingsExpander.idl @@ -0,0 +1,42 @@ +namespace Magpie.App { + runtimeclass SettingsExpanderItemStyleSelector : Windows.UI.Xaml.Controls.StyleSelector { + SettingsExpanderItemStyleSelector(); + + Windows.UI.Xaml.Style DefaultStyle; + Windows.UI.Xaml.Style ClickableStyle; + } + + [Windows.UI.Xaml.Markup.ContentProperty("Content")] + runtimeclass SettingsExpander : Windows.UI.Xaml.Controls.Control { + SettingsExpander(); + + static Windows.UI.Xaml.DependencyProperty HeaderProperty { get; }; + static Windows.UI.Xaml.DependencyProperty DescriptionProperty { get; }; + static Windows.UI.Xaml.DependencyProperty HeaderIconProperty { get; }; + static Windows.UI.Xaml.DependencyProperty ContentProperty { get; }; + static Windows.UI.Xaml.DependencyProperty ItemsHeaderProperty { get; }; + static Windows.UI.Xaml.DependencyProperty ItemsFooterProperty { get; }; + static Windows.UI.Xaml.DependencyProperty IsExpandedProperty { get; }; + static Windows.UI.Xaml.DependencyProperty ItemsProperty { get; }; + static Windows.UI.Xaml.DependencyProperty ItemsSourceProperty { get; }; + static Windows.UI.Xaml.DependencyProperty ItemTemplateProperty { get; }; + static Windows.UI.Xaml.DependencyProperty ItemContainerStyleSelectorProperty { get; }; + static Windows.UI.Xaml.DependencyProperty CanReorderItemsProperty { get; }; + + Object Header; + Object Description; + Windows.UI.Xaml.Controls.IconElement HeaderIcon; + Object Content; + Windows.UI.Xaml.UIElement ItemsHeader; + Windows.UI.Xaml.UIElement ItemsFooter; + Boolean IsExpanded; + IVector Items; + Object ItemsSource; + Object ItemTemplate; + Windows.UI.Xaml.Controls.StyleSelector ItemContainerStyleSelector; + Boolean CanReorderItems; + + event SignalDelegate Expanded; + event SignalDelegate Collapsed; + } +} diff --git a/src/Magpie.App/SettingsExpander.xaml b/src/Magpie.App/SettingsExpander.xaml new file mode 100644 index 000000000..603024c89 --- /dev/null +++ b/src/Magpie.App/SettingsExpander.xaml @@ -0,0 +1,578 @@ + + + + + Show all settings + 16,16,4,16 + 58,8,44,8 + 0,1,0,0 + 58,8,16,8 + 16 + 32 + 32 + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/Magpie.App/SettingsGroup.cpp b/src/Magpie.App/SettingsGroup.cpp index c1b3b0891..4a4163cc3 100644 --- a/src/Magpie.App/SettingsGroup.cpp +++ b/src/Magpie.App/SettingsGroup.cpp @@ -10,24 +10,24 @@ using namespace Windows::UI::Xaml::Data; namespace winrt::Magpie::App::implementation { -const DependencyProperty SettingsGroup::ChildrenProperty = DependencyProperty::Register( +const DependencyProperty SettingsGroup::_childrenProperty = DependencyProperty::Register( L"Children", xaml_typename(), - xaml_typename(), - PropertyMetadata(nullptr) + xaml_typename(), + nullptr ); -const DependencyProperty SettingsGroup::TitleProperty = DependencyProperty::Register( - L"Title", - xaml_typename(), - xaml_typename(), - PropertyMetadata(box_value(L""), &SettingsGroup::_OnTitleChanged) +const DependencyProperty SettingsGroup::_headerProperty = DependencyProperty::Register( + L"Header", + xaml_typename(), + xaml_typename(), + PropertyMetadata(nullptr, &SettingsGroup::_OnHeaderChanged) ); -const DependencyProperty SettingsGroup::DescriptionProperty = DependencyProperty::Register( +const DependencyProperty SettingsGroup::_descriptionProperty = DependencyProperty::Register( L"Description", xaml_typename(), - xaml_typename(), + xaml_typename(), PropertyMetadata(nullptr, &SettingsGroup::_OnDescriptionChanged) ); @@ -46,20 +46,20 @@ void SettingsGroup::Loading(FrameworkElement const&, IInspectable const&) { _Update(); } -void SettingsGroup::_OnTitleChanged(DependencyObject const& sender, DependencyPropertyChangedEventArgs const&) { - SettingsGroup* that = get_self(sender.as>()); +void SettingsGroup::_OnHeaderChanged(DependencyObject const& sender, DependencyPropertyChangedEventArgs const&) { + SettingsGroup* that = get_self(sender.as()); that->_Update(); - that->_propertyChangedEvent(*that, PropertyChangedEventArgs{ L"Title" }); + that->_propertyChangedEvent(*that, PropertyChangedEventArgs{ L"Header" }); } void SettingsGroup::_OnDescriptionChanged(DependencyObject const& sender, DependencyPropertyChangedEventArgs const&) { - SettingsGroup* that = get_self(sender.as>()); + SettingsGroup* that = get_self(sender.as()); that->_Update(); that->_propertyChangedEvent(*that, PropertyChangedEventArgs{ L"Description" }); } void SettingsGroup::_Update() { - TitleTextBlock().Visibility(Title().empty() ? Visibility::Collapsed : Visibility::Visible); + HeaderPresenter().Visibility(Header() == nullptr ? Visibility::Collapsed : Visibility::Visible); DescriptionPresenter().Visibility(Description() == nullptr ? Visibility::Collapsed : Visibility::Visible); } diff --git a/src/Magpie.App/SettingsGroup.h b/src/Magpie.App/SettingsGroup.h index e4ecd89bf..0cc490c23 100644 --- a/src/Magpie.App/SettingsGroup.h +++ b/src/Magpie.App/SettingsGroup.h @@ -6,28 +6,28 @@ namespace winrt::Magpie::App::implementation { struct SettingsGroup : SettingsGroupT { void InitializeComponent(); - void Title(const hstring& value) { - SetValue(TitleProperty, box_value(value)); + void Header(IInspectable const& value) { + SetValue(_headerProperty, value); } - hstring Title() const { - return GetValue(TitleProperty).as(); + IInspectable Header() const { + return GetValue(_headerProperty); } void Description(IInspectable value) { - SetValue(DescriptionProperty, value); + SetValue(_descriptionProperty, value); } IInspectable Description() const { - return GetValue(DescriptionProperty); + return GetValue(_descriptionProperty); } Controls::UIElementCollection Children() const { - return GetValue(ChildrenProperty).as(); + return GetValue(_childrenProperty).as(); } void Children(Controls::UIElementCollection const& value) { - SetValue(ChildrenProperty, value); + SetValue(_childrenProperty, value); } void IsEnabledChanged(IInspectable const&, DependencyPropertyChangedEventArgs const&); @@ -41,12 +41,16 @@ struct SettingsGroup : SettingsGroupT { _propertyChangedEvent.remove(token); } - static const DependencyProperty ChildrenProperty; - static const DependencyProperty TitleProperty; - static const DependencyProperty DescriptionProperty; + static hstring AsStr(IInspectable const& value) { + return value.as(); + } private: - static void _OnTitleChanged(DependencyObject const& sender, DependencyPropertyChangedEventArgs const&); + static const DependencyProperty _childrenProperty; + static const DependencyProperty _headerProperty; + static const DependencyProperty _descriptionProperty; + + static void _OnHeaderChanged(DependencyObject const& sender, DependencyPropertyChangedEventArgs const&); static void _OnDescriptionChanged(DependencyObject const& sender, DependencyPropertyChangedEventArgs const&); void _Update(); diff --git a/src/Magpie.App/SettingsGroup.idl b/src/Magpie.App/SettingsGroup.idl index dfaeec70a..40a2517a4 100644 --- a/src/Magpie.App/SettingsGroup.idl +++ b/src/Magpie.App/SettingsGroup.idl @@ -6,7 +6,9 @@ namespace Magpie.App { SettingsGroup(); Windows.UI.Xaml.Controls.UIElementCollection Children; - String Title; + Object Header; Object Description; + + String AsStr(Object value); } } diff --git a/src/Magpie.App/SettingsGroup.xaml b/src/Magpie.App/SettingsGroup.xaml index af30eab0f..5a14edf17 100644 --- a/src/Magpie.App/SettingsGroup.xaml +++ b/src/Magpie.App/SettingsGroup.xaml @@ -13,11 +13,12 @@ - + + Text="{x:Bind AsStr(Header), Mode=OneWay}" /> - + diff --git a/src/Magpie.App/SettingsPage.xaml b/src/Magpie.App/SettingsPage.xaml index 1911eabf3..e35f4bfd9 100644 --- a/src/Magpie.App/SettingsPage.xaml +++ b/src/Magpie.App/SettingsPage.xaml @@ -13,16 +13,14 @@ - - + + - - - - + + - - + + - - - - - - - - + + + + + + - + - + - - - + - + - - - - + + - - - - - - - - - - - - + + + + + + + + - - - + IsEnabled="{x:Bind ViewModel.IsMinimizeAtStartupEnabled, Mode=OneWay}"> + - - + + - + - - - - + + - + - - - - + + - + - - - - + + - + - - - - + + - - - - - - - - - + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + diff --git a/src/Magpie.App/ShortcutControl.cpp b/src/Magpie.App/ShortcutControl.cpp index 12690a20f..2847cfe4e 100644 --- a/src/Magpie.App/ShortcutControl.cpp +++ b/src/Magpie.App/ShortcutControl.cpp @@ -41,14 +41,14 @@ static IVector ToKeys(const Shortcut& shortcut, bool isError) { const DependencyProperty ShortcutControl::ActionProperty = DependencyProperty::Register( L"Action", xaml_typename(), - xaml_typename(), + xaml_typename(), PropertyMetadata(box_value(ShortcutAction::COUNT_OR_NONE), &ShortcutControl::_OnActionChanged) ); const DependencyProperty ShortcutControl::TitleProperty = DependencyProperty::Register( L"Title", xaml_typename(), - xaml_typename(), + xaml_typename(), PropertyMetadata(box_value(L""), &ShortcutControl::_OnTitleChanged) ); @@ -228,12 +228,12 @@ LRESULT ShortcutControl::_LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM } void ShortcutControl::_OnActionChanged(DependencyObject const& sender, DependencyPropertyChangedEventArgs const&) { - ShortcutControl* that = get_self(sender.as>()); + ShortcutControl* that = get_self(sender.as()); that->_UpdateShortcut(); } void ShortcutControl::_OnTitleChanged(DependencyObject const& sender, DependencyPropertyChangedEventArgs const& args) { - ShortcutControl* that = get_self(sender.as>()); + ShortcutControl* that = get_self(sender.as()); if (that->_shortcutDialog) { that->_shortcutDialog.Title(args.NewValue()); } diff --git a/src/Magpie.App/TextBlockHelper.cpp b/src/Magpie.App/TextBlockHelper.cpp index 3e95f4421..24e290690 100644 --- a/src/Magpie.App/TextBlockHelper.cpp +++ b/src/Magpie.App/TextBlockHelper.cpp @@ -15,7 +15,7 @@ namespace winrt::Magpie::App::implementation { DependencyProperty TextBlockHelper::_isAutoTooltipProperty = DependencyProperty::RegisterAttached( L"IsAutoTooltip", xaml_typename(), - xaml_typename(), + xaml_typename(), PropertyMetadata(box_value(false), _OnIsAutoTooltipChanged) ); diff --git a/src/Magpie.App/UpdateService.cpp b/src/Magpie.App/UpdateService.cpp index 03eec63e1..c9c6d1d81 100644 --- a/src/Magpie.App/UpdateService.cpp +++ b/src/Magpie.App/UpdateService.cpp @@ -17,6 +17,7 @@ using namespace Windows::Security::Cryptography::Core; using namespace Windows::Storage; using namespace Windows::Storage::Streams; using namespace Windows::System::Threading; +using namespace Windows::Web::Http; namespace winrt::Magpie::App { diff --git a/src/Magpie.App/WrapPanel.cpp b/src/Magpie.App/WrapPanel.cpp index 276bad899..2bd7d68e1 100644 --- a/src/Magpie.App/WrapPanel.cpp +++ b/src/Magpie.App/WrapPanel.cpp @@ -12,35 +12,35 @@ namespace winrt::Magpie::App::implementation { const DependencyProperty WrapPanel::HorizontalSpacingProperty = DependencyProperty::Register( L"HorizontalSpacing", xaml_typename(), - xaml_typename(), + xaml_typename(), PropertyMetadata(box_value(0.0), &WrapPanel::_OnLayoutPropertyChanged) ); const DependencyProperty WrapPanel::VerticalSpacingProperty = DependencyProperty::Register( L"VerticalSpacing", xaml_typename(), - xaml_typename(), + xaml_typename(), PropertyMetadata(box_value(0.0), &WrapPanel::_OnLayoutPropertyChanged) ); const DependencyProperty WrapPanel::OrientationProperty = DependencyProperty::Register( L"Orientation", xaml_typename(), - xaml_typename(), + xaml_typename(), PropertyMetadata(box_value(Orientation::Horizontal), &WrapPanel::_OnLayoutPropertyChanged) ); const DependencyProperty WrapPanel::PaddingProperty = DependencyProperty::Register( L"Padding", xaml_typename(), - xaml_typename(), + xaml_typename(), PropertyMetadata(box_value(Thickness{}), &WrapPanel::_OnLayoutPropertyChanged) ); const DependencyProperty WrapPanel::StretchChildProperty = DependencyProperty::Register( L"StretchChild", xaml_typename(), - xaml_typename(), + xaml_typename(), PropertyMetadata(box_value(StretchChild::None), &WrapPanel::_OnLayoutPropertyChanged) ); @@ -98,7 +98,7 @@ Size WrapPanel::ArrangeOverride(Size finalSize) { } void WrapPanel::_OnLayoutPropertyChanged(DependencyObject const& sender, DependencyPropertyChangedEventArgs const&) { - WrapPanel* that = get_self(sender.as>()); + WrapPanel* that = get_self(sender.as()); that->InvalidateMeasure(); that->InvalidateArrange(); } diff --git a/src/Magpie.App/pch.h b/src/Magpie.App/pch.h index 18f6a0ef9..e6ce05738 100644 --- a/src/Magpie.App/pch.h +++ b/src/Magpie.App/pch.h @@ -30,6 +30,7 @@ #include #include #include +#include #include #include #include @@ -37,7 +38,6 @@ namespace winrt { using namespace Windows::UI::Core; using namespace Windows::UI::Xaml::Data; -using namespace Windows::Web::Http; namespace MUXC = Microsoft::UI::Xaml::Controls; } diff --git a/src/Magpie/MainWindow.cpp b/src/Magpie/MainWindow.cpp index 329487b1e..5e5113d8c 100644 --- a/src/Magpie/MainWindow.cpp +++ b/src/Magpie/MainWindow.cpp @@ -160,7 +160,7 @@ LRESULT MainWindow::_MessageHandler(UINT msg, WPARAM wParam, LPARAM lParam) noex // 设置窗口最小尺寸 MINMAXINFO* mmi = (MINMAXINFO*)lParam; mmi->ptMinTrackSize = { - std::lroundf(550 * _currentDpi / float(USER_DEFAULT_SCREEN_DPI)), + std::lroundf(500 * _currentDpi / float(USER_DEFAULT_SCREEN_DPI)), std::lroundf(300 * _currentDpi / float(USER_DEFAULT_SCREEN_DPI)) }; return 0; @@ -169,6 +169,15 @@ LRESULT MainWindow::_MessageHandler(UINT msg, WPARAM wParam, LPARAM lParam) noex { // 我们自己处理标题栏右键,不知为何 DefWindowProc 没有作用 if (wParam == HTCAPTION) { + const POINT cursorPt{ GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) }; + + // 在标题栏上按下右键,在其他地方释放也会收到此消息。确保只有在标题栏上释放时才显示菜单 + RECT titleBarRect; + GetWindowRect(_hwndTitleBar, &titleBarRect); + if (!PtInRect(&titleBarRect, cursorPt)) { + break; + } + HMENU systemMenu = GetSystemMenu(_hWnd, FALSE); // 根据窗口状态更新选项 @@ -188,8 +197,7 @@ LRESULT MainWindow::_MessageHandler(UINT msg, WPARAM wParam, LPARAM lParam) noex setState(SC_CLOSE, true); SetMenuDefaultItem(systemMenu, UINT_MAX, FALSE); - BOOL cmd = TrackPopupMenu(systemMenu, TPM_RETURNCMD, - GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam), 0, _hWnd, nullptr); + BOOL cmd = TrackPopupMenu(systemMenu, TPM_RETURNCMD, cursorPt.x, cursorPt.y, 0, _hWnd, nullptr); if (cmd != 0) { PostMessage(_hWnd, WM_SYSCOMMAND, cmd, 0); } diff --git a/src/Shared/XamlUtils.cpp b/src/Shared/XamlUtils.cpp index 588669abb..180e4dd9f 100644 --- a/src/Shared/XamlUtils.cpp +++ b/src/Shared/XamlUtils.cpp @@ -13,7 +13,7 @@ using namespace Windows::UI::Xaml::Media; static bool IsComboBoxPopup(const Primitives::Popup& popup) { UIElement child = popup.Child(); - if (get_class_name(child) != name_of()) { + if (!child.try_as()) { return false; } @@ -27,7 +27,7 @@ static bool IsComboBoxPopup(const Primitives::Popup& popup) { for (int i = 0; i < count; ++i) { DependencyObject current = VisualTreeHelper::GetChild(elem, i); - if (get_class_name(current) == name_of()) { + if (current.try_as()) { return true; } From 14b54bbc4ed3d03480ce95587a795bd86723660d Mon Sep 17 00:00:00 2001 From: Xu <34770031+Blinue@users.noreply.github.com> Date: Tue, 12 Dec 2023 18:45:31 +0800 Subject: [PATCH 078/155] =?UTF-8?q?chore:=20=E4=BF=AE=E5=A4=8D=E7=BC=96?= =?UTF-8?q?=E8=AF=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Magpie.App/Resources.language-zh-Hant.resw | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Magpie.App/Resources.language-zh-Hant.resw b/src/Magpie.App/Resources.language-zh-Hant.resw index 2d32829cf..a5a780b94 100644 --- a/src/Magpie.App/Resources.language-zh-Hant.resw +++ b/src/Magpie.App/Resources.language-zh-Hant.resw @@ -817,10 +817,10 @@ 縮放前景視窗或停止縮放 - + 允許縮放已最大化或全螢幕的視窗 切換為影格生成時間 - + \ No newline at end of file From e6afe2a30cf9e81680beeaa095b5c9cff5c65506 Mon Sep 17 00:00:00 2001 From: Xu <34770031+Blinue@users.noreply.github.com> Date: Tue, 12 Dec 2023 21:33:28 +0800 Subject: [PATCH 079/155] =?UTF-8?q?UI:=20=E4=BC=98=E5=8C=96=20SettingsExpa?= =?UTF-8?q?nder=20=E7=9A=84=E5=8A=A8=E7=94=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Magpie.App/ScalingConfigurationPage.xaml | 6 +- src/Magpie.App/SettingsExpander.xaml | 75 ++++---------------- 2 files changed, 17 insertions(+), 64 deletions(-) diff --git a/src/Magpie.App/ScalingConfigurationPage.xaml b/src/Magpie.App/ScalingConfigurationPage.xaml index 0c736277b..4b8d00636 100644 --- a/src/Magpie.App/ScalingConfigurationPage.xaml +++ b/src/Magpie.App/ScalingConfigurationPage.xaml @@ -42,9 +42,6 @@ x:Load="{x:Bind HasFloatParams, Mode=OneTime}" ItemsSource="{x:Bind FloatParams, Mode=OneTime}" SelectionMode="None"> - - - + + + diff --git a/src/Magpie.App/SettingsExpander.xaml b/src/Magpie.App/SettingsExpander.xaml index 603024c89..58f0f1d38 100644 --- a/src/Magpie.App/SettingsExpander.xaml +++ b/src/Magpie.App/SettingsExpander.xaml @@ -110,6 +110,9 @@ + + + @@ -188,47 +191,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -256,9 +218,14 @@ - + - - - - - - - - - - - - - - @@ -346,7 +299,7 @@ Height="16" HorizontalAlignment="Center" VerticalAlignment="Center" - muxc:AnimatedIcon.State="NormalOff" + muxc:AnimatedIcon.State="PointerOverOff" Foreground="{ThemeResource ExpanderChevronForeground}" RenderTransformOrigin="0.5, 0.5"> @@ -436,7 +389,7 @@ - + @@ -482,7 +435,7 @@ - + @@ -536,7 +489,7 @@ - + @@ -559,7 +512,7 @@ - + From eb98b25a888bd6cafb713b8631fce05b66369bb1 Mon Sep 17 00:00:00 2001 From: Xu <34770031+Blinue@users.noreply.github.com> Date: Thu, 14 Dec 2023 19:43:05 +0800 Subject: [PATCH 080/155] =?UTF-8?q?=E4=BC=98=E5=8C=96=20SettingsExpander?= =?UTF-8?q?=20=E7=9A=84=E6=80=A7=E8=83=BD=20(#777)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * perf: 优化 SettingsExpander 的性能 * fix: 稍微优化样式 * perf: 删除 SettingsExpanderItemStyleSelector * UI: 修复焦点问题 --- src/Magpie.App/ScalingConfigurationPage.xaml | 396 +++++++++---------- src/Magpie.App/SettingsCard.cpp | 11 - src/Magpie.App/SettingsExpander.cpp | 50 +-- src/Magpie.App/SettingsExpander.h | 42 -- src/Magpie.App/SettingsExpander.idl | 65 ++- src/Magpie.App/SettingsExpander.xaml | 29 +- src/Magpie.App/ShortcutDialog.xaml | 3 +- 7 files changed, 240 insertions(+), 356 deletions(-) diff --git a/src/Magpie.App/ScalingConfigurationPage.xaml b/src/Magpie.App/ScalingConfigurationPage.xaml index 4b8d00636..cd23e02ea 100644 --- a/src/Magpie.App/ScalingConfigurationPage.xaml +++ b/src/Magpie.App/ScalingConfigurationPage.xaml @@ -10,56 +10,32 @@ - - - - - - - - + + - - - - - - - - - - + + + + - - + + @@ -84,8 +60,8 @@ Value="{x:Bind Value, Mode=TwoWay}" /> - - + + @@ -149,11 +125,9 @@ - + IsExpanded="{x:Bind IsInitialExpanded, Mode=OneTime}"> @@ -293,163 +267,181 @@ - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + (); - if (control && control.IsTabStop()) { - control.Focus(FocusState::Pointer); - break; - } - } - }); } _isCursorCaptured = false; diff --git a/src/Magpie.App/SettingsExpander.cpp b/src/Magpie.App/SettingsExpander.cpp index 0c599ecb6..beabf1602 100644 --- a/src/Magpie.App/SettingsExpander.cpp +++ b/src/Magpie.App/SettingsExpander.cpp @@ -2,9 +2,6 @@ #include "pch.h" #include "SettingsExpander.h" -#if __has_include("SettingsExpanderItemStyleSelector.g.cpp") -#include "SettingsExpanderItemStyleSelector.g.cpp" -#endif #if __has_include("SettingsExpander.g.cpp") #include "SettingsExpander.g.cpp" #endif @@ -14,17 +11,7 @@ using namespace Windows::UI::Xaml::Controls; namespace winrt::Magpie::App::implementation { -Style SettingsExpanderItemStyleSelector::SelectStyleCore(IInspectable const&, DependencyObject const& container) { - if (SettingsCard settingsCard = container.try_as()) { - if (settingsCard.IsClickEnabled()) { - return _clickableStyle; - } - } - - return _defaultStyle; -} - -static constexpr const wchar_t* PART_ItemsListView = L"PART_ItemsListView"; +static constexpr const wchar_t* PART_ItemsContainer = L"PART_ItemsContainer"; const DependencyProperty SettingsExpander::_headerProperty = DependencyProperty::Register( L"Header", @@ -96,20 +83,6 @@ const DependencyProperty SettingsExpander::_itemTemplateProperty = DependencyPro nullptr ); -const DependencyProperty SettingsExpander::_itemContainerStyleSelectorProperty = DependencyProperty::Register( - L"ItemContainerStyleSelector", - xaml_typename(), - xaml_typename(), - nullptr -); - -const DependencyProperty SettingsExpander::_canReorderItemsProperty = DependencyProperty::Register( - L"CanReorderItems", - xaml_typename(), - xaml_typename(), - PropertyMetadata(box_value(false)) -); - SettingsExpander::SettingsExpander() { DefaultStyleKey(box_value(GetRuntimeClassName())); Items(single_threaded_vector()); @@ -135,24 +108,27 @@ void SettingsExpander::_OnItemsConnectedPropertyChanged(DependencyObject const& } void SettingsExpander::_OnItemsConnectedPropertyChanged() { - ListView listView = GetTemplateChild(PART_ItemsListView).as(); - if (!listView) { + ItemsControl itemsContainer = GetTemplateChild(PART_ItemsContainer).as(); + if (!itemsContainer) { return; } IInspectable datasource = ItemsSource(); - listView.ItemsSource(datasource ? datasource : Items()); + itemsContainer.ItemsSource(datasource ? datasource : Items()); // 应用样式 - StyleSelector styleSelector = ItemContainerStyleSelector(); - for (IInspectable item : listView.Items()) { - SettingsCard element = item.try_as(); - if (!element) { + for (IInspectable const& item : itemsContainer.Items()) { + SettingsCard settingsCard = item.try_as(); + if (!settingsCard) { continue; } - if (element.ReadLocalValue(FrameworkElement::StyleProperty()) == DependencyProperty::UnsetValue()) { - element.Style(styleSelector.SelectStyle(nullptr, element)); + if (settingsCard.ReadLocalValue(FrameworkElement::StyleProperty()) == DependencyProperty::UnsetValue()) { + ResourceDictionary resources = Application::Current().Resources(); + const wchar_t* key = settingsCard.IsClickEnabled() + ? L"ClickableSettingsExpanderItemStyle" + : L"DefaultSettingsExpanderItemStyle"; + settingsCard.Style(resources.Lookup(box_value(key)).as()); } } } diff --git a/src/Magpie.App/SettingsExpander.h b/src/Magpie.App/SettingsExpander.h index 488cdc301..1a8e39db5 100644 --- a/src/Magpie.App/SettingsExpander.h +++ b/src/Magpie.App/SettingsExpander.h @@ -1,33 +1,8 @@ #pragma once -#include "SettingsExpanderItemStyleSelector.g.h" #include "SettingsExpander.g.h" namespace winrt::Magpie::App::implementation { -struct SettingsExpanderItemStyleSelector : SettingsExpanderItemStyleSelectorT { - Style DefaultStyle() const { - return _defaultStyle; - } - - void DefaultStyle(Style const& value) { - _defaultStyle = value; - } - - Style ClickableStyle() const { - return _clickableStyle; - } - - void ClickableStyle(Style const& value) { - _clickableStyle = value; - } - - Style SelectStyleCore(IInspectable const&, DependencyObject const& container); - -private: - Style _defaultStyle{ nullptr }; - Style _clickableStyle{ nullptr }; -}; - struct SettingsExpander : SettingsExpander_base { SettingsExpander(); @@ -41,8 +16,6 @@ struct SettingsExpander : SettingsExpander_base { static DependencyProperty ItemsProperty() { return _itemsProperty; } static DependencyProperty ItemsSourceProperty() { return _itemsSourceProperty; } static DependencyProperty ItemTemplateProperty() { return _itemTemplateProperty; } - static DependencyProperty ItemContainerStyleSelectorProperty() { return _itemContainerStyleSelectorProperty; } - static DependencyProperty CanReorderItemsProperty() { return _canReorderItemsProperty; } IInspectable Header() const { return GetValue(_headerProperty); } void Header(IInspectable const& value) const { SetValue(_headerProperty, value); } @@ -80,16 +53,6 @@ struct SettingsExpander : SettingsExpander_base { IInspectable ItemTemplate() const { return GetValue(_itemTemplateProperty); } void ItemTemplate(IInspectable const& value) const { SetValue(_itemTemplateProperty, value); } - Controls::StyleSelector ItemContainerStyleSelector() const { - return GetValue(_itemContainerStyleSelectorProperty).as(); - } - void ItemContainerStyleSelector(Controls::StyleSelector const& value) const { - SetValue(_itemContainerStyleSelectorProperty, value); - } - - bool CanReorderItems() const { return GetValue(_canReorderItemsProperty).as(); } - void CanReorderItems(bool value) const { SetValue(_canReorderItemsProperty, box_value(value)); } - void OnApplyTemplate(); private: @@ -103,8 +66,6 @@ struct SettingsExpander : SettingsExpander_base { static const DependencyProperty _itemsProperty; static const DependencyProperty _itemsSourceProperty; static const DependencyProperty _itemTemplateProperty; - static const DependencyProperty _itemContainerStyleSelectorProperty; - static const DependencyProperty _canReorderItemsProperty; static void _OnIsExpandedChanged(DependencyObject const& sender, DependencyPropertyChangedEventArgs const& args); static void _OnItemsConnectedPropertyChanged(DependencyObject const& sender, DependencyPropertyChangedEventArgs const&); @@ -119,9 +80,6 @@ struct SettingsExpander : SettingsExpander_base { namespace winrt::Magpie::App::factory_implementation { -struct SettingsExpanderItemStyleSelector : SettingsExpanderItemStyleSelectorT { -}; - struct SettingsExpander : SettingsExpanderT { }; diff --git a/src/Magpie.App/SettingsExpander.idl b/src/Magpie.App/SettingsExpander.idl index b1e1c8fff..14985dbed 100644 --- a/src/Magpie.App/SettingsExpander.idl +++ b/src/Magpie.App/SettingsExpander.idl @@ -1,42 +1,31 @@ namespace Magpie.App { - runtimeclass SettingsExpanderItemStyleSelector : Windows.UI.Xaml.Controls.StyleSelector { - SettingsExpanderItemStyleSelector(); - - Windows.UI.Xaml.Style DefaultStyle; - Windows.UI.Xaml.Style ClickableStyle; - } + [Windows.UI.Xaml.Markup.ContentProperty("Content")] + runtimeclass SettingsExpander : Windows.UI.Xaml.Controls.Control { + SettingsExpander(); + + static Windows.UI.Xaml.DependencyProperty HeaderProperty { get; }; + static Windows.UI.Xaml.DependencyProperty DescriptionProperty { get; }; + static Windows.UI.Xaml.DependencyProperty HeaderIconProperty { get; }; + static Windows.UI.Xaml.DependencyProperty ContentProperty { get; }; + static Windows.UI.Xaml.DependencyProperty ItemsHeaderProperty { get; }; + static Windows.UI.Xaml.DependencyProperty ItemsFooterProperty { get; }; + static Windows.UI.Xaml.DependencyProperty IsExpandedProperty { get; }; + static Windows.UI.Xaml.DependencyProperty ItemsProperty { get; }; + static Windows.UI.Xaml.DependencyProperty ItemsSourceProperty { get; }; + static Windows.UI.Xaml.DependencyProperty ItemTemplateProperty { get; }; - [Windows.UI.Xaml.Markup.ContentProperty("Content")] - runtimeclass SettingsExpander : Windows.UI.Xaml.Controls.Control { - SettingsExpander(); - - static Windows.UI.Xaml.DependencyProperty HeaderProperty { get; }; - static Windows.UI.Xaml.DependencyProperty DescriptionProperty { get; }; - static Windows.UI.Xaml.DependencyProperty HeaderIconProperty { get; }; - static Windows.UI.Xaml.DependencyProperty ContentProperty { get; }; - static Windows.UI.Xaml.DependencyProperty ItemsHeaderProperty { get; }; - static Windows.UI.Xaml.DependencyProperty ItemsFooterProperty { get; }; - static Windows.UI.Xaml.DependencyProperty IsExpandedProperty { get; }; - static Windows.UI.Xaml.DependencyProperty ItemsProperty { get; }; - static Windows.UI.Xaml.DependencyProperty ItemsSourceProperty { get; }; - static Windows.UI.Xaml.DependencyProperty ItemTemplateProperty { get; }; - static Windows.UI.Xaml.DependencyProperty ItemContainerStyleSelectorProperty { get; }; - static Windows.UI.Xaml.DependencyProperty CanReorderItemsProperty { get; }; + Object Header; + Object Description; + Windows.UI.Xaml.Controls.IconElement HeaderIcon; + Object Content; + Windows.UI.Xaml.UIElement ItemsHeader; + Windows.UI.Xaml.UIElement ItemsFooter; + Boolean IsExpanded; + IVector Items; + Object ItemsSource; + Object ItemTemplate; - Object Header; - Object Description; - Windows.UI.Xaml.Controls.IconElement HeaderIcon; - Object Content; - Windows.UI.Xaml.UIElement ItemsHeader; - Windows.UI.Xaml.UIElement ItemsFooter; - Boolean IsExpanded; - IVector Items; - Object ItemsSource; - Object ItemTemplate; - Windows.UI.Xaml.Controls.StyleSelector ItemContainerStyleSelector; - Boolean CanReorderItems; - - event SignalDelegate Expanded; - event SignalDelegate Collapsed; - } + event SignalDelegate Expanded; + event SignalDelegate Collapsed; + } } diff --git a/src/Magpie.App/SettingsExpander.xaml b/src/Magpie.App/SettingsExpander.xaml index 58f0f1d38..c1f5af186 100644 --- a/src/Magpie.App/SettingsExpander.xaml +++ b/src/Magpie.App/SettingsExpander.xaml @@ -34,10 +34,6 @@ - - - - - - - + diff --git a/src/Magpie.App/ShortcutDialog.xaml b/src/Magpie.App/ShortcutDialog.xaml index be25efd8b..77d570fea 100644 --- a/src/Magpie.App/ShortcutDialog.xaml +++ b/src/Magpie.App/ShortcutDialog.xaml @@ -24,7 +24,8 @@ Margin="0,64,0,0" HorizontalAlignment="Center" VerticalAlignment="Top" - HorizontalContentAlignment="Center"> + HorizontalContentAlignment="Center" + IsTabStop="False"> Date: Fri, 15 Dec 2023 21:58:23 +0800 Subject: [PATCH 081/155] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E7=A9=BA?= =?UTF-8?q?=E5=AD=97=E7=AC=A6=E4=B8=B2=E5=AF=BC=E8=87=B4=20SettingsCard=20?= =?UTF-8?q?=E5=B4=A9=E6=BA=83=E7=9A=84=E9=97=AE=E9=A2=98=20(#778)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Magpie.App/SettingsCard.cpp | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/Magpie.App/SettingsCard.cpp b/src/Magpie.App/SettingsCard.cpp index e4a05236e..37b068aa4 100644 --- a/src/Magpie.App/SettingsCard.cpp +++ b/src/Magpie.App/SettingsCard.cpp @@ -197,15 +197,25 @@ void SettingsCard::_OnIsWrapEnabledChanged(DependencyObject const& sender, Depen get_self(sender.as())->_OnIsWrapEnabledChanged(); } +static bool IsNotEmpty(IInspectable const& value) noexcept { + if (!value) { + return false; + } + + // 不知为何空字符串会导致崩溃,因此做额外的检查 + std::optional str = value.try_as(); + return !str || !str->empty(); +} + void SettingsCard::_OnHeaderChanged() const { if (FrameworkElement headerPresenter = GetTemplateChild(HeaderPresenter).try_as()) { - headerPresenter.Visibility(Header() ? Visibility::Visible : Visibility::Collapsed); + headerPresenter.Visibility(IsNotEmpty(Header()) ? Visibility::Visible : Visibility::Collapsed); } } void SettingsCard::_OnDescriptionChanged() const { if (FrameworkElement descriptionPresenter = GetTemplateChild(DescriptionPresenter).try_as()) { - descriptionPresenter.Visibility(Description() ? Visibility::Visible : Visibility::Collapsed); + descriptionPresenter.Visibility(IsNotEmpty(Description()) ? Visibility::Visible : Visibility::Collapsed); } } From 26d74f1f80545f95a5da42ab2f4cfe7ec7dba330 Mon Sep 17 00:00:00 2001 From: Xu <34770031+Blinue@users.noreply.github.com> Date: Sat, 16 Dec 2023 19:27:44 +0800 Subject: [PATCH 082/155] =?UTF-8?q?=E9=87=8D=E6=9E=84=20SettingsGroup=20(#?= =?UTF-8?q?781)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * refactor: 使 SettingsGroup 继承自 ItemsControl * style: 使间距更符合流畅设计 * refactor: SettingsGroup 改为模板化控件 * chore: 添加注释 * chore: 添加注释 --- src/Magpie.App/App.xaml | 4 +- src/Magpie.App/Button.xaml | 72 ---------- src/Magpie.App/HomePage.xaml | 2 +- src/Magpie.App/Magpie.App.vcxproj | 10 +- src/Magpie.App/Magpie.App.vcxproj.filters | 12 +- src/Magpie.App/ProfilePage.xaml | 2 +- src/Magpie.App/ScalingConfigurationPage.xaml | 2 +- src/Magpie.App/SettingsCard.cpp | 4 +- src/Magpie.App/SettingsGroup.cpp | 43 ++---- src/Magpie.App/SettingsGroup.h | 51 ++----- src/Magpie.App/SettingsGroup.idl | 9 +- src/Magpie.App/SettingsGroup.xaml | 134 ++++++++++--------- src/Magpie.App/SettingsPage.xaml | 32 +++-- src/Magpie.App/ShortcutControl.xaml | 1 + 14 files changed, 128 insertions(+), 250 deletions(-) delete mode 100644 src/Magpie.App/Button.xaml diff --git a/src/Magpie.App/App.xaml b/src/Magpie.App/App.xaml index 629b34b5b..f0f3cd78b 100644 --- a/src/Magpie.App/App.xaml +++ b/src/Magpie.App/App.xaml @@ -7,10 +7,10 @@ - + @@ -22,7 +22,7 @@ - 2 + 2 - - - diff --git a/src/Magpie.App/HomePage.xaml b/src/Magpie.App/HomePage.xaml index dc87bd394..44b4296be 100644 --- a/src/Magpie.App/HomePage.xaml +++ b/src/Magpie.App/HomePage.xaml @@ -35,7 +35,7 @@ + Margin="0,-28,0,0"> diff --git a/src/Magpie.App/Magpie.App.vcxproj b/src/Magpie.App/Magpie.App.vcxproj index acaf9c646..e3949033c 100644 --- a/src/Magpie.App/Magpie.App.vcxproj +++ b/src/Magpie.App/Magpie.App.vcxproj @@ -191,7 +191,7 @@ App.xaml - SettingsGroup.xaml + SettingsGroup.idl Code @@ -362,7 +362,7 @@ - SettingsGroup.xaml + SettingsGroup.idl Code @@ -488,8 +488,7 @@ Code - SettingsGroup.xaml - Code + Designer AboutPage.xaml @@ -524,9 +523,6 @@ Designer - - Designer - Designer diff --git a/src/Magpie.App/Magpie.App.vcxproj.filters b/src/Magpie.App/Magpie.App.vcxproj.filters index 7bf45ca67..0f988aafb 100644 --- a/src/Magpie.App/Magpie.App.vcxproj.filters +++ b/src/Magpie.App/Magpie.App.vcxproj.filters @@ -227,6 +227,9 @@ Controls + + Controls + @@ -242,9 +245,6 @@ Controls - - Controls - Controls @@ -260,9 +260,6 @@ Controls - - Styles - Controls @@ -275,6 +272,9 @@ Controls + + Controls + diff --git a/src/Magpie.App/ProfilePage.xaml b/src/Magpie.App/ProfilePage.xaml index 199929442..4d0272461 100644 --- a/src/Magpie.App/ProfilePage.xaml +++ b/src/Magpie.App/ProfilePage.xaml @@ -164,7 +164,7 @@ ChildrenTransitions="{StaticResource SettingsCardsAnimations}" Orientation="Vertical"> + Margin="0,-28,0,0"> diff --git a/src/Magpie.App/ScalingConfigurationPage.xaml b/src/Magpie.App/ScalingConfigurationPage.xaml index cd23e02ea..649743e27 100644 --- a/src/Magpie.App/ScalingConfigurationPage.xaml +++ b/src/Magpie.App/ScalingConfigurationPage.xaml @@ -107,7 +107,7 @@ Severity="Error" Visibility="{x:Bind ViewModel.ShowErrorMessage, Mode=OneWay}" /> + Margin="0,-28,0,0"> str = value.try_as(); return !str || !str->empty(); } @@ -262,7 +262,7 @@ void SettingsCard::_CheckVerticalSpacingState(VisualState const& s) { const hstring stateName = s ? s.Name() : hstring(); if (!stateName.empty() && (stateName == RightWrappedState || stateName == RightWrappedNoIconState || - stateName == VerticalState) && Content() && (Header() || Description())) { + stateName == VerticalState) && Content() && (Header() || IsNotEmpty(Description()))) { VisualStateManager::GoToState(*this, ContentSpacingState, true); } else { VisualStateManager::GoToState(*this, NoContentSpacingState, true); diff --git a/src/Magpie.App/SettingsGroup.cpp b/src/Magpie.App/SettingsGroup.cpp index 4a4163cc3..3018a46c8 100644 --- a/src/Magpie.App/SettingsGroup.cpp +++ b/src/Magpie.App/SettingsGroup.cpp @@ -10,18 +10,12 @@ using namespace Windows::UI::Xaml::Data; namespace winrt::Magpie::App::implementation { -const DependencyProperty SettingsGroup::_childrenProperty = DependencyProperty::Register( - L"Children", - xaml_typename(), - xaml_typename(), - nullptr -); - +// Header 如果为字符串类型会编译失败,见 https://github.com/microsoft/microsoft-ui-xaml/issues/5395 const DependencyProperty SettingsGroup::_headerProperty = DependencyProperty::Register( L"Header", xaml_typename(), xaml_typename(), - PropertyMetadata(nullptr, &SettingsGroup::_OnHeaderChanged) + nullptr ); const DependencyProperty SettingsGroup::_descriptionProperty = DependencyProperty::Register( @@ -31,36 +25,21 @@ const DependencyProperty SettingsGroup::_descriptionProperty = DependencyPropert PropertyMetadata(nullptr, &SettingsGroup::_OnDescriptionChanged) ); -void SettingsGroup::InitializeComponent() { - SettingsGroupT::InitializeComponent(); - - Children(ChildrenHost().Children()); -} - -void SettingsGroup::IsEnabledChanged(IInspectable const&, DependencyPropertyChangedEventArgs const&) { - _SetEnabledState(); -} +void SettingsGroup::OnApplyTemplate() { + base_type::OnApplyTemplate(); -void SettingsGroup::Loading(FrameworkElement const&, IInspectable const&) { + _isEnabledChangedRevoker = IsEnabledChanged(auto_revoke, [this](IInspectable const&, DependencyPropertyChangedEventArgs const&) { + _SetEnabledState(); + }); _SetEnabledState(); - _Update(); } -void SettingsGroup::_OnHeaderChanged(DependencyObject const& sender, DependencyPropertyChangedEventArgs const&) { +void SettingsGroup::_OnDescriptionChanged(DependencyObject const& sender, DependencyPropertyChangedEventArgs const& args) { SettingsGroup* that = get_self(sender.as()); - that->_Update(); - that->_propertyChangedEvent(*that, PropertyChangedEventArgs{ L"Header" }); -} - -void SettingsGroup::_OnDescriptionChanged(DependencyObject const& sender, DependencyPropertyChangedEventArgs const&) { - SettingsGroup* that = get_self(sender.as()); - that->_Update(); - that->_propertyChangedEvent(*that, PropertyChangedEventArgs{ L"Description" }); -} -void SettingsGroup::_Update() { - HeaderPresenter().Visibility(Header() == nullptr ? Visibility::Collapsed : Visibility::Visible); - DescriptionPresenter().Visibility(Description() == nullptr ? Visibility::Collapsed : Visibility::Visible); + if (FrameworkElement descriptionPresenter = that->GetTemplateChild(L"DescriptionPresenter").try_as()) { + descriptionPresenter.Visibility(args.NewValue() == nullptr ? Visibility::Collapsed : Visibility::Visible); + } } void SettingsGroup::_SetEnabledState() { diff --git a/src/Magpie.App/SettingsGroup.h b/src/Magpie.App/SettingsGroup.h index 0cc490c23..29e97d82e 100644 --- a/src/Magpie.App/SettingsGroup.h +++ b/src/Magpie.App/SettingsGroup.h @@ -3,61 +3,28 @@ namespace winrt::Magpie::App::implementation { -struct SettingsGroup : SettingsGroupT { - void InitializeComponent(); +struct SettingsGroup : SettingsGroup_base { + static DependencyProperty HeaderProperty() { return _headerProperty; } + static DependencyProperty DescriptionProperty() { return _descriptionProperty; } - void Header(IInspectable const& value) { - SetValue(_headerProperty, value); - } + void Header(IInspectable const& value) const { SetValue(_headerProperty, value); } + IInspectable Header() const { return GetValue(_headerProperty); } - IInspectable Header() const { - return GetValue(_headerProperty); - } + void Description(IInspectable value) const { SetValue(_descriptionProperty, value); } + IInspectable Description() const { return GetValue(_descriptionProperty); } - void Description(IInspectable value) { - SetValue(_descriptionProperty, value); - } - - IInspectable Description() const { - return GetValue(_descriptionProperty); - } - - Controls::UIElementCollection Children() const { - return GetValue(_childrenProperty).as(); - } - - void Children(Controls::UIElementCollection const& value) { - SetValue(_childrenProperty, value); - } - - void IsEnabledChanged(IInspectable const&, DependencyPropertyChangedEventArgs const&); - void Loading(FrameworkElement const&, IInspectable const&); - - event_token PropertyChanged(PropertyChangedEventHandler const& value) { - return _propertyChangedEvent.add(value); - } - - void PropertyChanged(event_token const& token) { - _propertyChangedEvent.remove(token); - } - - static hstring AsStr(IInspectable const& value) { - return value.as(); - } + void OnApplyTemplate(); private: static const DependencyProperty _childrenProperty; static const DependencyProperty _headerProperty; static const DependencyProperty _descriptionProperty; - static void _OnHeaderChanged(DependencyObject const& sender, DependencyPropertyChangedEventArgs const&); static void _OnDescriptionChanged(DependencyObject const& sender, DependencyPropertyChangedEventArgs const&); - void _Update(); - void _SetEnabledState(); - event _propertyChangedEvent; + IsEnabledChanged_revoker _isEnabledChangedRevoker; }; } diff --git a/src/Magpie.App/SettingsGroup.idl b/src/Magpie.App/SettingsGroup.idl index 40a2517a4..bbda71cac 100644 --- a/src/Magpie.App/SettingsGroup.idl +++ b/src/Magpie.App/SettingsGroup.idl @@ -1,14 +1,13 @@ namespace Magpie.App { - [Windows.UI.Xaml.Markup.ContentProperty("Children")] [Windows.UI.Xaml.TemplateVisualState("Normal", "CommonStates")] [Windows.UI.Xaml.TemplateVisualState("Disabled", "CommonStates")] - runtimeclass SettingsGroup : Windows.UI.Xaml.Controls.UserControl, Windows.UI.Xaml.Data.INotifyPropertyChanged { + runtimeclass SettingsGroup : Windows.UI.Xaml.Controls.ItemsControl { SettingsGroup(); - Windows.UI.Xaml.Controls.UIElementCollection Children; + static Windows.UI.Xaml.DependencyProperty HeaderProperty { get; }; + static Windows.UI.Xaml.DependencyProperty DescriptionProperty { get; }; + Object Header; Object Description; - - String AsStr(Object value); } } diff --git a/src/Magpie.App/SettingsGroup.xaml b/src/Magpie.App/SettingsGroup.xaml index 5a14edf17..fb4c1d8d9 100644 --- a/src/Magpie.App/SettingsGroup.xaml +++ b/src/Magpie.App/SettingsGroup.xaml @@ -1,63 +1,73 @@ - + + + - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/Magpie.App/SettingsPage.xaml b/src/Magpie.App/SettingsPage.xaml index e35f4bfd9..ce3e31b4d 100644 --- a/src/Magpie.App/SettingsPage.xaml +++ b/src/Magpie.App/SettingsPage.xaml @@ -11,31 +11,29 @@ ChildrenTransitions="{StaticResource SettingsCardsAnimations}" Orientation="Vertical"> - - - - - - - - + + + + + + + + + Severity="Warning" + Visibility="{x:Bind ViewModel.RequireRestart, Mode=OneWay}"> - - - - - - - - - - - - - - - - - - - - - - + + - + #C42B1C + + + + + + + + + diff --git a/src/Magpie.App/HomePage.xaml b/src/Magpie.App/HomePage.xaml index 44b4296be..42654cd1a 100644 --- a/src/Magpie.App/HomePage.xaml +++ b/src/Magpie.App/HomePage.xaml @@ -7,17 +7,17 @@ xmlns:muxc="using:Microsoft.UI.Xaml.Controls" mc:Ignorable="d"> - + - + - + - + @@ -65,8 +64,8 @@ - + - + @@ -96,7 +95,7 @@ - + @@ -117,19 +116,19 @@ - + - - + + @@ -119,8 +117,7 @@ - + - + - + - - + + @@ -183,64 +180,56 @@ ItemsSource="{x:Bind ViewModel.CaptureMethods, Mode=OneTime}" SelectedIndex="{x:Bind ViewModel.CaptureMethod, Mode=TwoWay}" /> - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - + + + + + + + + + + + + @@ -253,8 +242,8 @@ - + - + @@ -298,8 +287,8 @@ - + - + - + - + - + - + - + - + @@ -437,24 +426,21 @@ - - - - - - - - - - - + + + + + + + + + - + diff --git a/src/Magpie.App/RootPage.xaml b/src/Magpie.App/RootPage.xaml index 4468f4c26..16a8e85f2 100644 --- a/src/Magpie.App/RootPage.xaml +++ b/src/Magpie.App/RootPage.xaml @@ -67,27 +67,24 @@ HorizontalContentAlignment="Center" VerticalContentAlignment="Center" Visibility="{x:Bind NewProfileViewModel.IsNoCandidateWindow, Mode=OneWay}"> - + - + - + - + - + - - + + - + - + - - - + + + + + + + + + + - + @@ -193,22 +198,19 @@ - + - + - + @@ -229,7 +231,7 @@ - + - + - + - - + + - + @@ -416,8 +420,8 @@ - + - - + + @@ -455,12 +459,12 @@ - + - + @@ -505,57 +509,54 @@ + + + - - - - + \ No newline at end of file diff --git a/src/Magpie.App/SettingsCard.xaml b/src/Magpie.App/SettingsCard.xaml index 6e96d1f58..297b7cdde 100644 --- a/src/Magpie.App/SettingsCard.xaml +++ b/src/Magpie.App/SettingsCard.xaml @@ -171,11 +171,10 @@ Content="{TemplateBinding HeaderIcon}" /> - + - + - + @@ -26,7 +26,7 @@ diff --git a/src/Magpie.App/SettingsPage.xaml b/src/Magpie.App/SettingsPage.xaml index ce3e31b4d..94bdbada7 100644 --- a/src/Magpie.App/SettingsPage.xaml +++ b/src/Magpie.App/SettingsPage.xaml @@ -7,11 +7,11 @@ xmlns:muxc="using:Microsoft.UI.Xaml.Controls" mc:Ignorable="d"> - - + + @@ -114,42 +114,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - + diff --git a/src/Magpie.App/ShortcutControl.xaml b/src/Magpie.App/ShortcutControl.xaml index d6f49097a..833fe8a1e 100644 --- a/src/Magpie.App/ShortcutControl.xaml +++ b/src/Magpie.App/ShortcutControl.xaml @@ -34,16 +34,16 @@ - + - + @@ -58,6 +58,6 @@ - + diff --git a/src/Magpie.App/ShortcutDialog.xaml b/src/Magpie.App/ShortcutDialog.xaml index 77d570fea..1d8445578 100644 --- a/src/Magpie.App/ShortcutDialog.xaml +++ b/src/Magpie.App/ShortcutDialog.xaml @@ -28,8 +28,8 @@ IsTabStop="False"> - + @@ -43,11 +43,10 @@ - + - + diff --git a/src/Magpie.App/SimpleStackPanel.cpp b/src/Magpie.App/SimpleStackPanel.cpp new file mode 100644 index 000000000..44281175b --- /dev/null +++ b/src/Magpie.App/SimpleStackPanel.cpp @@ -0,0 +1,183 @@ +#include "pch.h" +#include "SimpleStackPanel.h" +#if __has_include("SimpleStackPanel.g.cpp") +#include "SimpleStackPanel.g.cpp" +#endif + +using namespace winrt; +using namespace Windows::UI::Xaml::Controls; + +namespace winrt::Magpie::App::implementation { + +const DependencyProperty SimpleStackPanel::_orientationProperty = DependencyProperty::Register( + L"Orientation", + xaml_typename(), + xaml_typename(), + PropertyMetadata(box_value(Orientation::Vertical), &SimpleStackPanel::_OnLayoutPropertyChanged) +); + +const DependencyProperty SimpleStackPanel::_paddingProperty = DependencyProperty::Register( + L"Padding", + xaml_typename(), + xaml_typename(), + PropertyMetadata(box_value(Thickness{}), &SimpleStackPanel::_OnLayoutPropertyChanged) +); + +const DependencyProperty SimpleStackPanel::_spacingProperty = DependencyProperty::Register( + L"Spacing", + xaml_typename(), + xaml_typename(), + PropertyMetadata(box_value(0.0), &SimpleStackPanel::_OnLayoutPropertyChanged) +); + +Size SimpleStackPanel::MeasureOverride(const Size& availableSize) const { + const bool isVertical = Orientation() == Orientation::Vertical; + const float spacing = (float)Spacing(); + const Thickness padding = Padding(); + const Size paddings{ (float)padding.Left + (float)padding.Right,(float)padding.Top + (float)padding.Bottom }; + + const Size childAvailableSize{ + availableSize.Width - paddings.Width, + availableSize.Height - paddings.Height + }; + + bool firstItem = true; + bool anyStretch = false; + Size finalSize{ paddings.Width, paddings.Height }; + + for (UIElement const& item : Children()) { + if (item.Visibility() == Visibility::Collapsed) { + // 不可见的子项不添加间距 + continue; + } + + item.Measure(childAvailableSize); + const Size itemSize = item.DesiredSize(); + + if (isVertical) { + finalSize.Height += itemSize.Height; + if (firstItem) { + firstItem = false; + } else { + finalSize.Height += spacing; + } + + if (anyStretch) { + continue; + } + + if (!std::isinf(availableSize.Width)) { + FrameworkElement elem = item.try_as(); + if (elem && elem.HorizontalAlignment() == HorizontalAlignment::Stretch) { + anyStretch = true; + finalSize.Width = availableSize.Width; + continue; + } + } + + if (itemSize.Height > 0) { + finalSize.Width = std::max(finalSize.Width, itemSize.Width + paddings.Width); + } + } else { + finalSize.Width += itemSize.Width; + if (firstItem) { + firstItem = false; + } else { + finalSize.Width += spacing; + } + + if (anyStretch) { + continue; + } + + if (!std::isinf(availableSize.Height)) { + FrameworkElement elem = item.try_as(); + if (elem && elem.VerticalAlignment() == VerticalAlignment::Stretch) { + anyStretch = true; + finalSize.Height = availableSize.Height; + continue; + } + } + + if (itemSize.Width > 0) { + finalSize.Height = std::max(finalSize.Height, itemSize.Height + paddings.Height); + } + } + } + + return finalSize; +} + +Size SimpleStackPanel::ArrangeOverride(Size finalSize) const { + const bool isVertical = Orientation() == Orientation::Vertical; + const Thickness padding = Padding(); + const float spacing = (float)Spacing(); + + Point position{ (float)padding.Left, (float)padding.Top }; + + for (UIElement const& item : Children()) { + if (item.Visibility() == Visibility::Collapsed) { + // 不可见的子项不添加间距 + continue; + } + + const Size itemSize = item.DesiredSize(); + Rect itemRect{ position.X, position.Y, itemSize.Width, itemSize.Height }; + + if (isVertical) { + auto alignment = HorizontalAlignment::Left; + if (FrameworkElement elem = item.try_as()) { + alignment = elem.HorizontalAlignment(); + } + + switch (alignment) { + case HorizontalAlignment::Center: + itemRect.X = position.X + (finalSize.Width - position.X - (float)padding.Right - itemRect.Width) / 2; + break; + case HorizontalAlignment::Right: + itemRect.X = finalSize.Width - (float)padding.Right - itemRect.Width; + break; + case HorizontalAlignment::Stretch: + itemRect.Width = finalSize.Width - position.X - (float)padding.Right; + break; + } + item.Arrange(itemRect); + + if (itemSize.Height > 0) { + position.Y += itemSize.Height + spacing; + } + } else { + auto alignment = VerticalAlignment::Top; + if (FrameworkElement elem = item.try_as()) { + alignment = elem.VerticalAlignment(); + } + + switch (alignment) { + case VerticalAlignment::Center: + itemRect.Y = position.Y + (finalSize.Height - position.Y - (float)padding.Bottom - itemRect.Height) / 2; + break; + case VerticalAlignment::Bottom: + itemRect.Y = finalSize.Height - (float)padding.Bottom - itemRect.Height; + break; + case VerticalAlignment::Stretch: + itemRect.Height = finalSize.Height - position.Y - (float)padding.Bottom; + break; + } + item.Arrange(itemRect); + + if (itemSize.Width > 0) { + position.X += itemSize.Width + spacing; + } + } + } + + return finalSize; +} + +void SimpleStackPanel::_OnLayoutPropertyChanged(DependencyObject const& sender, DependencyPropertyChangedEventArgs const&) { + SimpleStackPanel* that = get_self(sender.as()); + that->InvalidateMeasure(); + that->InvalidateArrange(); +} + +} diff --git a/src/Magpie.App/SimpleStackPanel.h b/src/Magpie.App/SimpleStackPanel.h new file mode 100644 index 000000000..72e5fd8b7 --- /dev/null +++ b/src/Magpie.App/SimpleStackPanel.h @@ -0,0 +1,39 @@ +#pragma once +#include "SimpleStackPanel.g.h" + +namespace winrt::Magpie::App::implementation { + +struct SimpleStackPanel : SimpleStackPanelT { + static DependencyProperty OrientationProperty() { return _orientationProperty; } + static DependencyProperty PaddingProperty() { return _paddingProperty; } + static DependencyProperty SpacingProperty() { return _spacingProperty; } + + Controls::Orientation Orientation() const { return GetValue(_orientationProperty).as(); } + void Orientation(Controls::Orientation value) const { SetValue(_orientationProperty, box_value(value)); } + + Thickness Padding() const { return GetValue(_paddingProperty).as(); } + void Padding(const Thickness& value) const { SetValue(_paddingProperty, box_value(value)); } + + double Spacing() const { return GetValue(_spacingProperty).as(); } + void Spacing(double value) const { SetValue(_spacingProperty, box_value(value)); } + + Size MeasureOverride(const Size& availableSize) const; + + Size ArrangeOverride(Size finalSize) const; + +private: + static const DependencyProperty _orientationProperty; + static const DependencyProperty _paddingProperty; + static const DependencyProperty _spacingProperty; + + static void _OnLayoutPropertyChanged(DependencyObject const& sender, DependencyPropertyChangedEventArgs const&); +}; + +} + +namespace winrt::Magpie::App::factory_implementation { + +struct SimpleStackPanel : SimpleStackPanelT { +}; + +} diff --git a/src/Magpie.App/SimpleStackPanel.idl b/src/Magpie.App/SimpleStackPanel.idl new file mode 100644 index 000000000..3c63be6bf --- /dev/null +++ b/src/Magpie.App/SimpleStackPanel.idl @@ -0,0 +1,13 @@ +namespace Magpie.App { + runtimeclass SimpleStackPanel : Windows.UI.Xaml.Controls.Panel { + SimpleStackPanel(); + + static Windows.UI.Xaml.DependencyProperty OrientationProperty { get; }; + static Windows.UI.Xaml.DependencyProperty PaddingProperty { get; }; + static Windows.UI.Xaml.DependencyProperty SpacingProperty { get; }; + + Windows.UI.Xaml.Controls.Orientation Orientation; + Windows.UI.Xaml.Thickness Padding; + Double Spacing; + } +} diff --git a/src/Magpie.App/TitlebarControl.xaml b/src/Magpie.App/TitlebarControl.xaml index 88da5eed2..d433b71ed 100644 --- a/src/Magpie.App/TitlebarControl.xaml +++ b/src/Magpie.App/TitlebarControl.xaml @@ -10,12 +10,12 @@ VerticalAlignment="Top" mc:Ignorable="d"> - - + + - + - + (), xaml_typename(), PropertyMetadata(box_value(0.0), &WrapPanel::_OnLayoutPropertyChanged) ); -const DependencyProperty WrapPanel::VerticalSpacingProperty = DependencyProperty::Register( +const DependencyProperty WrapPanel::_verticalSpacingProperty = DependencyProperty::Register( L"VerticalSpacing", xaml_typename(), xaml_typename(), PropertyMetadata(box_value(0.0), &WrapPanel::_OnLayoutPropertyChanged) ); -const DependencyProperty WrapPanel::OrientationProperty = DependencyProperty::Register( +const DependencyProperty WrapPanel::_orientationProperty = DependencyProperty::Register( L"Orientation", xaml_typename(), xaml_typename(), PropertyMetadata(box_value(Orientation::Horizontal), &WrapPanel::_OnLayoutPropertyChanged) ); -const DependencyProperty WrapPanel::PaddingProperty = DependencyProperty::Register( +const DependencyProperty WrapPanel::_paddingProperty = DependencyProperty::Register( L"Padding", xaml_typename(), xaml_typename(), PropertyMetadata(box_value(Thickness{}), &WrapPanel::_OnLayoutPropertyChanged) ); -const DependencyProperty WrapPanel::StretchChildProperty = DependencyProperty::Register( +const DependencyProperty WrapPanel::_stretchChildProperty = DependencyProperty::Register( L"StretchChild", xaml_typename(), xaml_typename(), @@ -45,13 +47,13 @@ const DependencyProperty WrapPanel::StretchChildProperty = DependencyProperty::R ); Size WrapPanel::MeasureOverride(const Size& availableSize) { - Thickness padding = Padding(); - Size childAvailableSize{ + const Thickness padding = Padding(); + const Size childAvailableSize{ availableSize.Width - (float)padding.Left - (float)padding.Right, availableSize.Height - (float)padding.Top - (float)padding.Bottom }; - for (const UIElement& child : Children()) { - child.Measure(childAvailableSize); + for (const UIElement& item : Children()) { + item.Measure(childAvailableSize); } return _UpdateRows(availableSize); @@ -63,7 +65,7 @@ Size WrapPanel::ArrangeOverride(Size finalSize) { if ((orientation == Orientation::Horizontal && finalSize.Width < desiredSize.Width) || (orientation == Orientation::Vertical && finalSize.Height < desiredSize.Height)) { - // We haven't received our desired size. We need to refresh the rows. + // 没收到 DesiredSize,重新计算布局 _UpdateRows(finalSize); } @@ -73,14 +75,13 @@ Size WrapPanel::ArrangeOverride(Size finalSize) { UIElementCollection children = Children(); - // Now that we have all the data, we do the actual arrange pass + // 更新布局 uint32_t childIndex = 0; for (const Row& row : _rows) { for (const UvRect& rect : row.childrenRects) { UIElement child = children.GetAt(childIndex++); while (child.Visibility() == Visibility::Collapsed) { - // Collapsed children are not added into the rows, - // we skip them. + // _rows 不包含不可见的子项 child = children.GetAt(childIndex++); } @@ -88,9 +89,7 @@ Size WrapPanel::ArrangeOverride(Size finalSize) { rect.position, UvMeasure(rect.size.u, row.size.v), }; - - Rect finalRect = arrangeRect.ToRect(orientation); - child.Arrange(finalRect); + child.Arrange(arrangeRect.ToRect(orientation)); } } @@ -106,72 +105,70 @@ void WrapPanel::_OnLayoutPropertyChanged(DependencyObject const& sender, Depende Size WrapPanel::_UpdateRows(Size availableSize) { _rows.clear(); - Controls::Orientation orientation = Orientation(); - Thickness padding = Padding(); + const Controls::Orientation orientation = Orientation(); + const Thickness padding = Padding(); UIElementCollection children = Children(); UvMeasure paddingStart(orientation, (float)padding.Left, (float)padding.Top); UvMeasure paddingEnd(orientation, (float)padding.Right, (float)padding.Bottom); - if (children.Size() == 0) { - paddingStart.Add(paddingEnd); - return paddingStart.ToSize(orientation); - } + if (children.Size() > 0) { + const UvMeasure parentMeasure(orientation, availableSize.Width, availableSize.Height); + const UvMeasure spacingMeasure(orientation, (float)HorizontalSpacing(), (float)VerticalSpacing()); + UvMeasure position(orientation, (float)padding.Left, (float)padding.Top); - UvMeasure parentMeasure(orientation, availableSize.Width, availableSize.Height); - UvMeasure spacingMeasure(orientation, (float)HorizontalSpacing(), (float)VerticalSpacing()); - UvMeasure position(orientation, (float)padding.Left, (float)padding.Top); + Row currentRow; + UvMeasure finalMeasure(orientation, 0.0f, 0.0f); - Row currentRow; - UvMeasure finalMeasure(orientation, 0.0f, 0.0f); + const uint32_t count = children.Size(); + for (uint32_t i = 0; i < count; ++i) { + UIElement const& item = children.GetAt(i); - auto arrange = [&](UIElement const& child, bool isLast = false) { - if (child.Visibility() == Visibility::Collapsed) { - return; // if an item is collapsed, avoid adding the spacing - } + if (item.Visibility() == Visibility::Collapsed) { + // 不可见的子项不添加间距 + continue; + } - UvMeasure desiredMeasure(orientation, child.DesiredSize()); - if ((desiredMeasure.u + position.u + paddingEnd.u) > parentMeasure.u) { - // next row! - position.u = paddingStart.u; - position.v += currentRow.size.v + spacingMeasure.v; + UvMeasure desiredMeasure(orientation, item.DesiredSize()); + if (desiredMeasure.u + position.u + paddingEnd.u > parentMeasure.u) { + finalMeasure.u = std::max(finalMeasure.u, position.u - spacingMeasure.u); - _rows.push_back(std::move(currentRow)); - currentRow = {}; - } + // 下一行 + position.u = paddingStart.u; + position.v += currentRow.size.v + spacingMeasure.v; - // Stretch the last item to fill the available space - if (isLast) { - desiredMeasure.u = parentMeasure.u - position.u; - } + _rows.push_back(std::move(currentRow)); + currentRow = {}; + } - currentRow.Add(position, desiredMeasure); + if (i == count - 1 && StretchChild() == StretchChild::Last && !std::isinf(parentMeasure.u)) { + // 让最后一个子项填满剩余空间,剩余空间必须有限才有意义 + desiredMeasure.u = parentMeasure.u - position.u; + } - // adjust the location for the next items - position.u += desiredMeasure.u + spacingMeasure.u; - finalMeasure.u = std::max(finalMeasure.u, position.u); - }; + currentRow.Add(position, desiredMeasure); - uint32_t lastIndex = children.Size() - 1; - for (uint32_t i = 0; i < lastIndex; i++) { - arrange(children.GetAt(i)); - } + // 下一个子项的位置 + position.u += desiredMeasure.u + spacingMeasure.u; + } - arrange(children.GetAt(lastIndex), StretchChild() == StretchChild::Last); - if (!currentRow.childrenRects.empty()) { - _rows.push_back(std::move(currentRow)); - } + // 添加最后一行 + if (!currentRow.childrenRects.empty()) { + finalMeasure.u = std::max(finalMeasure.u, position.u - spacingMeasure.u); + _rows.push_back(std::move(currentRow)); + } - if (_rows.empty()) { - paddingStart.Add(paddingEnd); - return paddingStart.ToSize(orientation); - } + if (!_rows.empty()) { + // 计算 finalMeasure 的 v 分量 + UvRect lastRowRect = _rows.back().Rect(); + finalMeasure.v = lastRowRect.position.v + lastRowRect.size.v; - // Get max V here before computing final rect - UvRect lastRowRect = _rows.back().Rect(); - finalMeasure.v = lastRowRect.position.v + lastRowRect.size.v; - finalMeasure.Add(paddingEnd); - return finalMeasure.ToSize(orientation); + finalMeasure.Add(paddingEnd); + return finalMeasure.ToSize(orientation); + } + } + + return UvMeasure(paddingStart.u + paddingEnd.u, paddingStart.v + paddingEnd.v).ToSize(orientation); } } diff --git a/src/Magpie.App/WrapPanel.h b/src/Magpie.App/WrapPanel.h index f74caf886..9e7e3edcb 100644 --- a/src/Magpie.App/WrapPanel.h +++ b/src/Magpie.App/WrapPanel.h @@ -4,8 +4,6 @@ namespace winrt::Magpie::App::implementation { -// 移植自 https://github.com/CommunityToolkit/WindowsCommunityToolkit/tree/77b009ddf591b78dfc5bad0088c99ce35406170b/Microsoft.Toolkit.Uwp.UI.Controls.Primitives/WrapPanel - struct UvMeasure { UvMeasure() : u(0), v(0) {} @@ -29,7 +27,7 @@ struct UvMeasure { v += measure.v; } - Size ToSize(Controls::Orientation orientation) noexcept { + Size ToSize(Controls::Orientation orientation) const noexcept { return orientation == Controls::Orientation::Horizontal ? Size(u, v) : Size(v, u); } @@ -59,69 +57,55 @@ struct Row { } } - void Add(const UvMeasure& position, const UvMeasure& size_) { + void Add(const UvMeasure& position, const UvMeasure& size_) noexcept { childrenRects.emplace_back(position, size_); size.u = position.u + size_.u; size.v = std::max(size.v, size_.v); } + void Clear() noexcept { + childrenRects.clear(); + size = {}; + } + SmallVector childrenRects; UvMeasure size; }; struct WrapPanel : WrapPanelT { - double HorizontalSpacing() const { - return GetValue(HorizontalSpacingProperty).as(); - } - - void HorizontalSpacing(double value) { - SetValue(HorizontalSpacingProperty, box_value(value)); - } - - double VerticalSpacing() const { - return GetValue(VerticalSpacingProperty).as(); - } - - void VerticalSpacing(double value) { - SetValue(VerticalSpacingProperty, box_value(value)); - } + static DependencyProperty HorizontalSpacingProperty() { return _horizontalSpacingProperty; } + static DependencyProperty VerticalSpacingProperty() { return _verticalSpacingProperty; } + static DependencyProperty OrientationProperty() { return _orientationProperty; } + static DependencyProperty PaddingProperty() { return _paddingProperty; } + static DependencyProperty StretchChildProperty() { return _stretchChildProperty; } - Controls::Orientation Orientation() const { - return GetValue(OrientationProperty).as(); - } + double HorizontalSpacing() const { return GetValue(_horizontalSpacingProperty).as(); } + void HorizontalSpacing(double value) const { SetValue(_horizontalSpacingProperty, box_value(value)); } - void Orientation(Controls::Orientation value) { - SetValue(OrientationProperty, box_value(value)); - } + double VerticalSpacing() const { return GetValue(_verticalSpacingProperty).as(); } + void VerticalSpacing(double value) const { SetValue(_verticalSpacingProperty, box_value(value)); } - Thickness Padding() const { - return GetValue(PaddingProperty).as(); - } + Controls::Orientation Orientation() const { return GetValue(_orientationProperty).as(); } + void Orientation(Controls::Orientation value) const { SetValue(_orientationProperty, box_value(value)); } - void Padding(const Thickness& value) { - SetValue(PaddingProperty, box_value(value)); - } + Thickness Padding() const { return GetValue(_paddingProperty).as(); } + void Padding(const Thickness& value) const { SetValue(_paddingProperty, box_value(value)); } - StretchChild StretchChild() const { - return GetValue(StretchChildProperty).as(); - } - - void StretchChild(Magpie::App::StretchChild value) { - SetValue(StretchChildProperty, box_value(value)); - } + StretchChild StretchChild() const { return GetValue(_stretchChildProperty).as(); } + void StretchChild(Magpie::App::StretchChild value) const { SetValue(_stretchChildProperty, box_value(value)); } Size MeasureOverride(const Size& availableSize); Size ArrangeOverride(Size finalSize); - - static const DependencyProperty HorizontalSpacingProperty; - static const DependencyProperty VerticalSpacingProperty; - static const DependencyProperty OrientationProperty; - static const DependencyProperty PaddingProperty; - static const DependencyProperty StretchChildProperty; private: + static const DependencyProperty _horizontalSpacingProperty; + static const DependencyProperty _verticalSpacingProperty; + static const DependencyProperty _orientationProperty; + static const DependencyProperty _paddingProperty; + static const DependencyProperty _stretchChildProperty; + static void _OnLayoutPropertyChanged(DependencyObject const& sender, DependencyPropertyChangedEventArgs const&); Size _UpdateRows(Size availableSize); diff --git a/src/Magpie.App/WrapPanel.idl b/src/Magpie.App/WrapPanel.idl index c34ba77bd..1ecc3a28f 100644 --- a/src/Magpie.App/WrapPanel.idl +++ b/src/Magpie.App/WrapPanel.idl @@ -1,16 +1,22 @@ namespace Magpie.App { - enum StretchChild { - None, - Last - }; + enum StretchChild { + None, + Last + }; - runtimeclass WrapPanel : Windows.UI.Xaml.Controls.Panel { - WrapPanel(); + runtimeclass WrapPanel : Windows.UI.Xaml.Controls.Panel { + WrapPanel(); - Double HorizontalSpacing; - Double VerticalSpacing; - Windows.UI.Xaml.Controls.Orientation Orientation; - Windows.UI.Xaml.Thickness Padding; - StretchChild StretchChild; - } + static Windows.UI.Xaml.DependencyProperty HorizontalSpacingProperty { get; }; + static Windows.UI.Xaml.DependencyProperty VerticalSpacingProperty { get; }; + static Windows.UI.Xaml.DependencyProperty OrientationProperty { get; }; + static Windows.UI.Xaml.DependencyProperty PaddingProperty { get; }; + static Windows.UI.Xaml.DependencyProperty StretchChildProperty { get; }; + + Double HorizontalSpacing; + Double VerticalSpacing; + Windows.UI.Xaml.Controls.Orientation Orientation; + Windows.UI.Xaml.Thickness Padding; + StretchChild StretchChild; + } } From 202e00f7519c5d0ab1a4a9585f48ea57929def21 Mon Sep 17 00:00:00 2001 From: Xu <34770031+Blinue@users.noreply.github.com> Date: Sun, 17 Dec 2023 19:48:41 +0800 Subject: [PATCH 085/155] =?UTF-8?q?chore:=20=E4=BF=AE=E5=A4=8D=E7=BC=96?= =?UTF-8?q?=E8=AF=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Magpie.App/Resources.language-fr.resw | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Magpie.App/Resources.language-fr.resw b/src/Magpie.App/Resources.language-fr.resw index 6046cf238..c620fd08c 100644 --- a/src/Magpie.App/Resources.language-fr.resw +++ b/src/Magpie.App/Resources.language-fr.resw @@ -820,10 +820,10 @@ Directives relatives aux contributions - + Vérifier les mises à jour prévue - + Rendre les paramètres d'effet en ligne \ No newline at end of file From 5b3963074aad2cee8218383a486ddde156a6d94f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=97=AD?= Date: Tue, 19 Dec 2023 11:01:04 +0800 Subject: [PATCH 086/155] =?UTF-8?q?chore:=20=E9=87=8D=E5=91=BD=E5=90=8D?= =?UTF-8?q?=E6=A8=A1=E6=9D=BF=E6=8E=A7=E4=BB=B6=E7=9A=84=E8=B5=84=E6=BA=90?= =?UTF-8?q?=E9=98=B2=E6=AD=A2=E5=86=B2=E7=AA=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Magpie.App/App.xaml | 8 ++++---- src/Magpie.App/KeyVisual.h | 2 +- .../{KeyVisual.xaml => KeyVisual_Resource.xaml} | 0 src/Magpie.App/Magpie.App.vcxproj | 8 ++++---- src/Magpie.App/Magpie.App.vcxproj.filters | 13 +++++-------- src/Magpie.App/SettingsCard.h | 2 +- ...SettingsCard.xaml => SettingsCard_Resource.xaml} | 0 src/Magpie.App/SettingsExpander.h | 2 +- ...Expander.xaml => SettingsExpander_Resource.xaml} | 0 src/Magpie.App/SettingsGroup.h | 2 +- ...ttingsGroup.xaml => SettingsGroup_Resource.xaml} | 0 11 files changed, 17 insertions(+), 20 deletions(-) rename src/Magpie.App/{KeyVisual.xaml => KeyVisual_Resource.xaml} (100%) rename src/Magpie.App/{SettingsCard.xaml => SettingsCard_Resource.xaml} (100%) rename src/Magpie.App/{SettingsExpander.xaml => SettingsExpander_Resource.xaml} (100%) rename src/Magpie.App/{SettingsGroup.xaml => SettingsGroup_Resource.xaml} (100%) diff --git a/src/Magpie.App/App.xaml b/src/Magpie.App/App.xaml index fd7249b08..4fdbfe237 100644 --- a/src/Magpie.App/App.xaml +++ b/src/Magpie.App/App.xaml @@ -7,10 +7,10 @@ - - - - + + + + diff --git a/src/Magpie.App/KeyVisual.h b/src/Magpie.App/KeyVisual.h index a6d2d067c..62a0afe6b 100644 --- a/src/Magpie.App/KeyVisual.h +++ b/src/Magpie.App/KeyVisual.h @@ -3,7 +3,7 @@ namespace winrt::Magpie::App::implementation { -struct KeyVisual : KeyVisual_base { +struct KeyVisual : KeyVisualT { KeyVisual(); void Key(int value) { diff --git a/src/Magpie.App/KeyVisual.xaml b/src/Magpie.App/KeyVisual_Resource.xaml similarity index 100% rename from src/Magpie.App/KeyVisual.xaml rename to src/Magpie.App/KeyVisual_Resource.xaml diff --git a/src/Magpie.App/Magpie.App.vcxproj b/src/Magpie.App/Magpie.App.vcxproj index 37262491d..9c4d8869b 100644 --- a/src/Magpie.App/Magpie.App.vcxproj +++ b/src/Magpie.App/Magpie.App.vcxproj @@ -543,7 +543,7 @@ Designer - + Designer @@ -555,13 +555,13 @@ Designer - + Designer - + Designer - + Designer diff --git a/src/Magpie.App/Magpie.App.vcxproj.filters b/src/Magpie.App/Magpie.App.vcxproj.filters index 4a03ae716..3cbeaff8a 100644 --- a/src/Magpie.App/Magpie.App.vcxproj.filters +++ b/src/Magpie.App/Magpie.App.vcxproj.filters @@ -128,9 +128,6 @@ {ca435698-7c9e-4784-a031-2c9db29b5fcc} - - {be3fc578-6b5a-4b23-8db1-0fc6083e1466} - {7a45d2bb-695d-4658-8fb9-a3d1f3b5aff8} @@ -248,7 +245,7 @@ Controls - + Controls @@ -269,13 +266,13 @@ Controls - + Controls - + Controls - + Controls @@ -340,4 +337,4 @@ - + \ No newline at end of file diff --git a/src/Magpie.App/SettingsCard.h b/src/Magpie.App/SettingsCard.h index 0d019be73..f89152646 100644 --- a/src/Magpie.App/SettingsCard.h +++ b/src/Magpie.App/SettingsCard.h @@ -3,7 +3,7 @@ namespace winrt::Magpie::App::implementation { -struct SettingsCard : SettingsCard_base { +struct SettingsCard : SettingsCardT { SettingsCard(); ~SettingsCard(); diff --git a/src/Magpie.App/SettingsCard.xaml b/src/Magpie.App/SettingsCard_Resource.xaml similarity index 100% rename from src/Magpie.App/SettingsCard.xaml rename to src/Magpie.App/SettingsCard_Resource.xaml diff --git a/src/Magpie.App/SettingsExpander.h b/src/Magpie.App/SettingsExpander.h index 1a8e39db5..1bf255780 100644 --- a/src/Magpie.App/SettingsExpander.h +++ b/src/Magpie.App/SettingsExpander.h @@ -3,7 +3,7 @@ namespace winrt::Magpie::App::implementation { -struct SettingsExpander : SettingsExpander_base { +struct SettingsExpander : SettingsExpanderT { SettingsExpander(); static DependencyProperty HeaderProperty() { return _headerProperty; } diff --git a/src/Magpie.App/SettingsExpander.xaml b/src/Magpie.App/SettingsExpander_Resource.xaml similarity index 100% rename from src/Magpie.App/SettingsExpander.xaml rename to src/Magpie.App/SettingsExpander_Resource.xaml diff --git a/src/Magpie.App/SettingsGroup.h b/src/Magpie.App/SettingsGroup.h index 29e97d82e..d018e49c0 100644 --- a/src/Magpie.App/SettingsGroup.h +++ b/src/Magpie.App/SettingsGroup.h @@ -3,7 +3,7 @@ namespace winrt::Magpie::App::implementation { -struct SettingsGroup : SettingsGroup_base { +struct SettingsGroup : SettingsGroupT { static DependencyProperty HeaderProperty() { return _headerProperty; } static DependencyProperty DescriptionProperty() { return _descriptionProperty; } diff --git a/src/Magpie.App/SettingsGroup.xaml b/src/Magpie.App/SettingsGroup_Resource.xaml similarity index 100% rename from src/Magpie.App/SettingsGroup.xaml rename to src/Magpie.App/SettingsGroup_Resource.xaml From c076b13cb386221ca62b867b21e6127fbdffaf3d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=97=AD?= Date: Tue, 19 Dec 2023 13:10:08 +0800 Subject: [PATCH 087/155] =?UTF-8?q?chore:=20=E4=BC=98=E5=8C=96=E9=A1=B9?= =?UTF-8?q?=E7=9B=AE=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Magpie.App/App.xaml | 8 ++++---- ...yVisual_Resource.xaml => KeyVisual.Resource.xaml} | 0 src/Magpie.App/Magpie.App.vcxproj | 12 ++++++++---- src/Magpie.App/Magpie.App.vcxproj.filters | 8 ++++---- ...Card_Resource.xaml => SettingsCard.Resource.xaml} | 0 ..._Resource.xaml => SettingsExpander.Resource.xaml} | 0 ...oup_Resource.xaml => SettingsGroup.Resource.xaml} | 0 7 files changed, 16 insertions(+), 12 deletions(-) rename src/Magpie.App/{KeyVisual_Resource.xaml => KeyVisual.Resource.xaml} (100%) rename src/Magpie.App/{SettingsCard_Resource.xaml => SettingsCard.Resource.xaml} (100%) rename src/Magpie.App/{SettingsExpander_Resource.xaml => SettingsExpander.Resource.xaml} (100%) rename src/Magpie.App/{SettingsGroup_Resource.xaml => SettingsGroup.Resource.xaml} (100%) diff --git a/src/Magpie.App/App.xaml b/src/Magpie.App/App.xaml index 4fdbfe237..2a40a70e7 100644 --- a/src/Magpie.App/App.xaml +++ b/src/Magpie.App/App.xaml @@ -7,10 +7,10 @@ - - - - + + + + diff --git a/src/Magpie.App/KeyVisual_Resource.xaml b/src/Magpie.App/KeyVisual.Resource.xaml similarity index 100% rename from src/Magpie.App/KeyVisual_Resource.xaml rename to src/Magpie.App/KeyVisual.Resource.xaml diff --git a/src/Magpie.App/Magpie.App.vcxproj b/src/Magpie.App/Magpie.App.vcxproj index 9c4d8869b..495087cc9 100644 --- a/src/Magpie.App/Magpie.App.vcxproj +++ b/src/Magpie.App/Magpie.App.vcxproj @@ -543,7 +543,8 @@ Designer - + + KeyVisual.idl Designer @@ -555,13 +556,16 @@ Designer - + + SettingsCard.idl Designer - + + SettingsExpander.idl Designer - + + SettingsGroup.idl Designer diff --git a/src/Magpie.App/Magpie.App.vcxproj.filters b/src/Magpie.App/Magpie.App.vcxproj.filters index 3cbeaff8a..8be64fbd8 100644 --- a/src/Magpie.App/Magpie.App.vcxproj.filters +++ b/src/Magpie.App/Magpie.App.vcxproj.filters @@ -245,7 +245,7 @@ Controls - + Controls @@ -266,13 +266,13 @@ Controls - + Controls - + Controls - + Controls diff --git a/src/Magpie.App/SettingsCard_Resource.xaml b/src/Magpie.App/SettingsCard.Resource.xaml similarity index 100% rename from src/Magpie.App/SettingsCard_Resource.xaml rename to src/Magpie.App/SettingsCard.Resource.xaml diff --git a/src/Magpie.App/SettingsExpander_Resource.xaml b/src/Magpie.App/SettingsExpander.Resource.xaml similarity index 100% rename from src/Magpie.App/SettingsExpander_Resource.xaml rename to src/Magpie.App/SettingsExpander.Resource.xaml diff --git a/src/Magpie.App/SettingsGroup_Resource.xaml b/src/Magpie.App/SettingsGroup.Resource.xaml similarity index 100% rename from src/Magpie.App/SettingsGroup_Resource.xaml rename to src/Magpie.App/SettingsGroup.Resource.xaml From f9a258a59d125c5ac05b5223968c8ebeaece90c8 Mon Sep 17 00:00:00 2001 From: Xu <34770031+Blinue@users.noreply.github.com> Date: Fri, 22 Dec 2023 19:54:06 +0800 Subject: [PATCH 088/155] =?UTF-8?q?=E5=8A=A8=E6=80=81=E5=86=B3=E5=AE=9A?= =?UTF-8?q?=E6=98=AF=E5=90=A6=E6=A3=80=E6=B5=8B=E9=87=8D=E5=A4=8D=E5=B8=A7?= =?UTF-8?q?=20(#787)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: 动态检查重复帧 * fix: 提高门槛 * feat: 添加两个开发者选项 * feat: 实现开发者选项 * feat: 在叠加层上显示统计数据 * chore: 优化 noexcept 声明 * chore: 清理 * fix: 稍微放松检查 * chore: 清理 * chore: 清理 * feat: 叠加层 UI 本地化 --- src/Magpie.App/AboutViewModel.cpp | 10 +- src/Magpie.App/AboutViewModel.h | 10 +- src/Magpie.App/AppSettings.cpp | 47 +++-- src/Magpie.App/AppSettings.h | 59 ++++-- src/Magpie.App/Profile.h | 4 +- src/Magpie.App/ProfilePage.xaml | 4 +- src/Magpie.App/ProfileViewModel.cpp | 24 +-- src/Magpie.App/ProfileViewModel.h | 8 +- src/Magpie.App/ProfileViewModel.idl | 4 +- src/Magpie.App/Resources.language-en-US.resw | 21 +- src/Magpie.App/Resources.language-es.resw | 3 - src/Magpie.App/Resources.language-fr.resw | 3 - src/Magpie.App/Resources.language-it.resw | 3 - src/Magpie.App/Resources.language-ja.resw | 3 - src/Magpie.App/Resources.language-ko.resw | 3 - src/Magpie.App/Resources.language-pt-BR.resw | 3 - src/Magpie.App/Resources.language-ru.resw | 3 - src/Magpie.App/Resources.language-tr.resw | 3 - src/Magpie.App/Resources.language-uk.resw | 3 - src/Magpie.App/Resources.language-vi.resw | 3 - .../Resources.language-zh-Hans.resw | 21 +- .../Resources.language-zh-Hant.resw | 3 - src/Magpie.App/ScalingService.cpp | 6 +- src/Magpie.App/ScalingService.h | 8 +- src/Magpie.App/SettingsPage.xaml | 22 ++- src/Magpie.App/SettingsViewModel.cpp | 96 +++++++--- src/Magpie.App/SettingsViewModel.h | 44 +++-- src/Magpie.App/SettingsViewModel.idl | 7 +- src/Magpie.Core/FrameSourceBase.cpp | 179 +++++++++++++----- src/Magpie.Core/FrameSourceBase.h | 17 +- src/Magpie.Core/OverlayDrawer.cpp | 56 +++++- src/Magpie.Core/Renderer.cpp | 2 +- src/Magpie.Core/Renderer.h | 8 +- src/Magpie.Core/ScalingOptions.h | 18 +- src/Shared/Win32Utils.cpp | 12 +- src/Shared/Win32Utils.h | 12 +- 36 files changed, 497 insertions(+), 235 deletions(-) diff --git a/src/Magpie.App/AboutViewModel.cpp b/src/Magpie.App/AboutViewModel.cpp index 918116181..31eb3c489 100644 --- a/src/Magpie.App/AboutViewModel.cpp +++ b/src/Magpie.App/AboutViewModel.cpp @@ -97,7 +97,7 @@ bool AboutViewModel::IsCheckForPreviewUpdates() const noexcept { return AppSettings::Get().IsCheckForPreviewUpdates(); } -void AboutViewModel::IsCheckForPreviewUpdates(bool value) noexcept { +void AboutViewModel::IsCheckForPreviewUpdates(bool value) { AppSettings::Get().IsCheckForPreviewUpdates(value); _propertyChangedEvent(*this, PropertyChangedEventArgs(L"IsCheckForPreviewUpdates")); } @@ -115,7 +115,7 @@ bool AboutViewModel::IsAutoCheckForUpdates() const noexcept { return AppSettings::Get().IsAutoCheckForUpdates(); } -void AboutViewModel::IsAutoCheckForUpdates(bool value) noexcept { +void AboutViewModel::IsAutoCheckForUpdates(bool value) { AppSettings::Get().IsAutoCheckForUpdates(value); _propertyChangedEvent(*this, PropertyChangedEventArgs(L"IsAutoCheckForUpdates")); } @@ -132,7 +132,7 @@ bool AboutViewModel::IsErrorWhileChecking() const noexcept { return UpdateService::Get().Status() == UpdateStatus::ErrorWhileChecking; } -void AboutViewModel::IsErrorWhileChecking(bool value) noexcept { +void AboutViewModel::IsErrorWhileChecking(bool value) { if (!value) { UpdateService& service = UpdateService::Get(); if (service.Status() == UpdateStatus::ErrorWhileChecking) { @@ -147,7 +147,7 @@ bool AboutViewModel::IsNoUpdate() const noexcept { return UpdateService::Get().Status() == UpdateStatus::NoUpdate; } -void AboutViewModel::IsNoUpdate(bool value) noexcept { +void AboutViewModel::IsNoUpdate(bool value) const noexcept { if (!value) { UpdateService& service = UpdateService::Get(); if (service.Status() == UpdateStatus::NoUpdate) { @@ -180,7 +180,7 @@ bool AboutViewModel::IsUpdateCardOpen() const noexcept { return UpdateService::Get().Status() >= UpdateStatus::Available; } -void AboutViewModel::IsUpdateCardOpen(bool value) noexcept { +void AboutViewModel::IsUpdateCardOpen(bool value) { if (!value) { UpdateService& service = UpdateService::Get(); UpdateStatus status = service.Status(); diff --git a/src/Magpie.App/AboutViewModel.h b/src/Magpie.App/AboutViewModel.h index f050510d3..21de65c1b 100644 --- a/src/Magpie.App/AboutViewModel.h +++ b/src/Magpie.App/AboutViewModel.h @@ -27,22 +27,22 @@ struct AboutViewModel : AboutViewModelT { fire_and_forget CheckForUpdates(); bool IsCheckForPreviewUpdates() const noexcept; - void IsCheckForPreviewUpdates(bool value) noexcept; + void IsCheckForPreviewUpdates(bool value); bool IsCheckForUpdatesButtonEnabled() const noexcept; bool IsAutoCheckForUpdates() const noexcept; - void IsAutoCheckForUpdates(bool value) noexcept; + void IsAutoCheckForUpdates(bool value); bool IsAnyUpdateStatus() const noexcept; bool IsCheckingForUpdates() const noexcept; bool IsErrorWhileChecking() const noexcept; - void IsErrorWhileChecking(bool value) noexcept; + void IsErrorWhileChecking(bool value); bool IsNoUpdate() const noexcept; - void IsNoUpdate(bool value) noexcept; + void IsNoUpdate(bool value) const noexcept; bool IsAvailable() const noexcept; @@ -52,7 +52,7 @@ struct AboutViewModel : AboutViewModelT { bool IsInstalling() const noexcept; bool IsUpdateCardOpen() const noexcept; - void IsUpdateCardOpen(bool value) noexcept; + void IsUpdateCardOpen(bool value); bool IsUpdateCardClosable() const noexcept; bool IsCancelButtonVisible() const noexcept; diff --git a/src/Magpie.App/AppSettings.cpp b/src/Magpie.App/AppSettings.cpp index f0d1b1bcd..52c4bd677 100644 --- a/src/Magpie.App/AppSettings.cpp +++ b/src/Magpie.App/AppSettings.cpp @@ -92,7 +92,7 @@ static void WriteProfile(rapidjson::PrettyWriter& write writer.Double(profile.maxFrameRate); writer.Key("disableWindowResizing"); - writer.Bool(profile.IsDisableWindowResizing()); + writer.Bool(profile.IsWindowResizingDisabled()); writer.Key("3DGameMode"); writer.Bool(profile.Is3DGameMode()); writer.Key("showFPS"); @@ -104,7 +104,7 @@ static void WriteProfile(rapidjson::PrettyWriter& write writer.Key("drawCursor"); writer.Bool(profile.IsDrawCursor()); writer.Key("disableDirectFlip"); - writer.Bool(profile.IsDisableDirectFlip()); + writer.Bool(profile.IsDirectFlipDisabled()); writer.Key("cursorScaling"); writer.Uint((uint32_t)profile.cursorScaling); @@ -206,7 +206,7 @@ static bool ShowOkCancelWarningMessage( AppSettings::~AppSettings() {} -bool AppSettings::Initialize() { +bool AppSettings::Initialize() noexcept { Logger& logger = Logger::Get(); // 若程序所在目录存在配置文件则为便携模式 @@ -313,12 +313,12 @@ bool AppSettings::Initialize() { return true; } -bool AppSettings::Save() { +bool AppSettings::Save() noexcept { _UpdateWindowPlacement(); return _Save(*this); } -fire_and_forget AppSettings::SaveAsync() { +fire_and_forget AppSettings::SaveAsync() noexcept { _UpdateWindowPlacement(); // 拷贝当前配置 @@ -328,7 +328,7 @@ fire_and_forget AppSettings::SaveAsync() { _Save(data); } -void AppSettings::IsPortableMode(bool value) { +void AppSettings::IsPortableMode(bool value) noexcept { if (_isPortableMode == value) { return; } @@ -406,10 +406,12 @@ void AppSettings::IsDeveloperMode(bool value) noexcept { if (!value) { // 关闭开发者模式则禁用所有开发者选项 _isDebugMode = false; - _isDisableEffectCache = false; - _isDisableFontCache = false; + _isEffectCacheDisabled = false; + _isFontCacheDisabled = false; _isSaveEffectSources = false; _isWarningsAreErrors = false; + _duplicateFrameDetectionMode = DuplicateFrameDetectionMode::Dynamic; + _isStatisticsForDynamicDetectionEnabled = false; } SaveAsync(); @@ -522,9 +524,9 @@ bool AppSettings::_Save(const _AppSettingsData& data) noexcept { writer.Key("debugMode"); writer.Bool(data._isDebugMode); writer.Key("disableEffectCache"); - writer.Bool(data._isDisableEffectCache); + writer.Bool(data._isEffectCacheDisabled); writer.Key("disableFontCache"); - writer.Bool(data._isDisableFontCache); + writer.Bool(data._isFontCacheDisabled); writer.Key("saveEffectSources"); writer.Bool(data._isSaveEffectSources); writer.Key("warningsAreErrors"); @@ -545,6 +547,10 @@ bool AppSettings::_Save(const _AppSettingsData& data) noexcept { writer.Bool(data._isCheckForPreviewUpdates); writer.Key("updateCheckDate"); writer.Int64(data._updateCheckDate.time_since_epoch().count()); + writer.Key("duplicateFrameDetectionMode"); + writer.Uint((uint32_t)data._duplicateFrameDetectionMode); + writer.Key("enableStatisticsForDynamicDetection"); + writer.Bool(data._isStatisticsForDynamicDetectionEnabled); ScalingModesService::Get().Export(writer); @@ -569,7 +575,7 @@ bool AppSettings::_Save(const _AppSettingsData& data) noexcept { } // 永远不会失败,遇到不合法的配置项时静默忽略 -void AppSettings::_LoadSettings(const rapidjson::GenericObject& root, uint32_t /*version*/) { +void AppSettings::_LoadSettings(const rapidjson::GenericObject& root, uint32_t /*version*/) noexcept { { std::wstring language; JsonHelper::ReadString(root, "language", language); @@ -674,8 +680,8 @@ void AppSettings::_LoadSettings(const rapidjson::GenericObject 2) { + duplicateFrameDetectionMode = (uint32_t)DuplicateFrameDetectionMode::Dynamic; + } + _duplicateFrameDetectionMode = (::Magpie::Core::DuplicateFrameDetectionMode)duplicateFrameDetectionMode; + } + JsonHelper::ReadBool(root, "enableStatisticsForDynamicDetection", _isStatisticsForDynamicDetectionEnabled); [[maybe_unused]] bool result = ScalingModesService::Get().Import(root, true); assert(result); @@ -736,7 +751,7 @@ bool AppSettings::_LoadProfile( const rapidjson::GenericObject& profileObj, Profile& profile, bool isDefault -) const { +) const noexcept { if (!isDefault) { if (!JsonHelper::ReadString(profileObj, "name", profile.name, true)) { return false; @@ -870,7 +885,7 @@ bool AppSettings::_LoadProfile( return true; } -bool AppSettings::_SetDefaultShortcuts() { +bool AppSettings::_SetDefaultShortcuts() noexcept { bool changed = false; Shortcut& scaleShortcut = _shortcuts[(size_t)ShortcutAction::Scale]; @@ -894,7 +909,7 @@ bool AppSettings::_SetDefaultShortcuts() { return changed; } -void AppSettings::_SetDefaultScalingModes() { +void AppSettings::_SetDefaultScalingModes() noexcept { _scalingModes.resize(7); // Lanczos diff --git a/src/Magpie.App/AppSettings.h b/src/Magpie.App/AppSettings.h index d15ebc1ff..30720226a 100644 --- a/src/Magpie.App/AppSettings.h +++ b/src/Magpie.App/AppSettings.h @@ -6,6 +6,7 @@ #include #include #include "Win32Utils.h" +#include namespace winrt::Magpie::App { @@ -46,13 +47,16 @@ struct _AppSettingsData { // 上一次自动检查更新的日期 std::chrono::system_clock::time_point _updateCheckDate; + + ::Magpie::Core::DuplicateFrameDetectionMode _duplicateFrameDetectionMode = + ::Magpie::Core::DuplicateFrameDetectionMode::Dynamic; bool _isPortableMode = false; bool _isAlwaysRunAsAdmin = false; bool _isDeveloperMode = false; bool _isDebugMode = false; - bool _isDisableEffectCache = false; - bool _isDisableFontCache = false; + bool _isEffectCacheDisabled = false; + bool _isFontCacheDisabled = false; bool _isSaveEffectSources = false; bool _isWarningsAreErrors = false; bool _isAllowScalingMaximized = false; @@ -63,6 +67,7 @@ struct _AppSettingsData { bool _isMainWindowMaximized = false; bool _isAutoCheckForUpdates = true; bool _isCheckForPreviewUpdates = false; + bool _isStatisticsForDynamicDetectionEnabled = false; }; class AppSettings : private _AppSettingsData { @@ -74,11 +79,11 @@ class AppSettings : private _AppSettingsData { virtual ~AppSettings(); - bool Initialize(); + bool Initialize() noexcept; - bool Save(); + bool Save() noexcept; - fire_and_forget SaveAsync(); + fire_and_forget SaveAsync() noexcept; const std::wstring& ConfigDir() const noexcept { return _configDir; @@ -88,7 +93,7 @@ class AppSettings : private _AppSettingsData { return _isPortableMode; } - void IsPortableMode(bool value); + void IsPortableMode(bool value) noexcept; int Language() const noexcept { return _language; @@ -206,21 +211,21 @@ class AppSettings : private _AppSettingsData { SaveAsync(); } - bool IsDisableEffectCache() const noexcept { - return _isDisableEffectCache; + bool IsEffectCacheDisabled() const noexcept { + return _isEffectCacheDisabled; } - void IsDisableEffectCache(bool value) noexcept { - _isDisableEffectCache = value; + void IsEffectCacheDisabled(bool value) noexcept { + _isEffectCacheDisabled = value; SaveAsync(); } - bool IsDisableFontCache() const noexcept { - return _isDisableFontCache; + bool IsFontCacheDisabled() const noexcept { + return _isFontCacheDisabled; } - void IsDisableFontCache(bool value) noexcept { - _isDisableFontCache = value; + void IsFontCacheDisabled(bool value) noexcept { + _isFontCacheDisabled = value; SaveAsync(); } @@ -350,6 +355,24 @@ class AppSettings : private _AppSettingsData { _updateCheckDate = value; } + ::Magpie::Core::DuplicateFrameDetectionMode DuplicateFrameDetectionMode() const noexcept { + return _duplicateFrameDetectionMode; + } + + void DuplicateFrameDetectionMode(::Magpie::Core::DuplicateFrameDetectionMode value) noexcept { + _duplicateFrameDetectionMode = value; + SaveAsync(); + } + + bool IsStatisticsForDynamicDetectionEnabled() const noexcept { + return _isStatisticsForDynamicDetectionEnabled; + } + + void IsStatisticsForDynamicDetectionEnabled(bool value) noexcept { + _isStatisticsForDynamicDetectionEnabled = value; + SaveAsync(); + } + private: AppSettings() = default; @@ -359,14 +382,14 @@ class AppSettings : private _AppSettingsData { void _UpdateWindowPlacement() noexcept; bool _Save(const _AppSettingsData& data) noexcept; - void _LoadSettings(const rapidjson::GenericObject& root, uint32_t version); + void _LoadSettings(const rapidjson::GenericObject& root, uint32_t version) noexcept; bool _LoadProfile( const rapidjson::GenericObject& profileObj, Profile& profile, bool isDefault = false - ) const; - bool _SetDefaultShortcuts(); - void _SetDefaultScalingModes(); + ) const noexcept; + bool _SetDefaultShortcuts() noexcept; + void _SetDefaultScalingModes() noexcept; void _UpdateConfigPath() noexcept; diff --git a/src/Magpie.App/Profile.h b/src/Magpie.App/Profile.h index ccd5d74d9..1a856f93f 100644 --- a/src/Magpie.App/Profile.h +++ b/src/Magpie.App/Profile.h @@ -33,13 +33,13 @@ struct Profile { flags = other.flags; } - DEFINE_FLAG_ACCESSOR(IsDisableWindowResizing, ::Magpie::Core::ScalingFlags::DisableWindowResizing, flags) + DEFINE_FLAG_ACCESSOR(IsWindowResizingDisabled, ::Magpie::Core::ScalingFlags::DisableWindowResizing, flags) DEFINE_FLAG_ACCESSOR(Is3DGameMode, ::Magpie::Core::ScalingFlags::Is3DGameMode, flags) DEFINE_FLAG_ACCESSOR(IsShowFPS, ::Magpie::Core::ScalingFlags::ShowFPS, flags) DEFINE_FLAG_ACCESSOR(IsCaptureTitleBar, ::Magpie::Core::ScalingFlags::CaptureTitleBar, flags) DEFINE_FLAG_ACCESSOR(IsAdjustCursorSpeed, ::Magpie::Core::ScalingFlags::AdjustCursorSpeed, flags) DEFINE_FLAG_ACCESSOR(IsDrawCursor, ::Magpie::Core::ScalingFlags::DrawCursor, flags) - DEFINE_FLAG_ACCESSOR(IsDisableDirectFlip, ::Magpie::Core::ScalingFlags::DisableDirectFlip, flags) + DEFINE_FLAG_ACCESSOR(IsDirectFlipDisabled, ::Magpie::Core::ScalingFlags::DisableDirectFlip, flags) std::wstring name; diff --git a/src/Magpie.App/ProfilePage.xaml b/src/Magpie.App/ProfilePage.xaml index c89b530cd..ea6399d77 100644 --- a/src/Magpie.App/ProfilePage.xaml +++ b/src/Magpie.App/ProfilePage.xaml @@ -265,7 +265,7 @@ + IsOn="{x:Bind ViewModel.IsWindowResizingDisabled, Mode=TwoWay}" /> @@ -438,7 +438,7 @@ + IsOn="{x:Bind ViewModel.IsDirectFlipDisabled, Mode=TwoWay}" /> diff --git a/src/Magpie.App/ProfileViewModel.cpp b/src/Magpie.App/ProfileViewModel.cpp index 68a6cecbf..bf958c112 100644 --- a/src/Magpie.App/ProfileViewModel.cpp +++ b/src/Magpie.App/ProfileViewModel.cpp @@ -582,19 +582,19 @@ void ProfileViewModel::IsShowFPS(bool value) { _propertyChangedEvent(*this, PropertyChangedEventArgs(L"IsShowFPS")); } -bool ProfileViewModel::IsDisableWindowResizing() const noexcept { - return _data->IsDisableWindowResizing(); +bool ProfileViewModel::IsWindowResizingDisabled() const noexcept { + return _data->IsWindowResizingDisabled(); } -void ProfileViewModel::IsDisableWindowResizing(bool value) { - if (_data->IsDisableWindowResizing() == value) { +void ProfileViewModel::IsWindowResizingDisabled(bool value) { + if (_data->IsWindowResizingDisabled() == value) { return; } - _data->IsDisableWindowResizing(value); + _data->IsWindowResizingDisabled(value); AppSettings::Get().SaveAsync(); - _propertyChangedEvent(*this, PropertyChangedEventArgs(L"IsDisableWindowResizing")); + _propertyChangedEvent(*this, PropertyChangedEventArgs(L"IsWindowResizingDisabled")); } bool ProfileViewModel::IsCaptureTitleBar() const noexcept { @@ -791,19 +791,19 @@ void ProfileViewModel::LaunchParameters(const hstring& value) { _propertyChangedEvent(*this, PropertyChangedEventArgs(L"LaunchParameters")); } -bool ProfileViewModel::IsDisableDirectFlip() const noexcept { - return _data->IsDisableDirectFlip(); +bool ProfileViewModel::IsDirectFlipDisabled() const noexcept { + return _data->IsDirectFlipDisabled(); } -void ProfileViewModel::IsDisableDirectFlip(bool value) { - if (_data->IsDisableDirectFlip() == value) { +void ProfileViewModel::IsDirectFlipDisabled(bool value) { + if (_data->IsDirectFlipDisabled() == value) { return; } - _data->IsDisableDirectFlip(value); + _data->IsDirectFlipDisabled(value); AppSettings::Get().SaveAsync(); - _propertyChangedEvent(*this, PropertyChangedEventArgs(L"IsDisableDirectFlip")); + _propertyChangedEvent(*this, PropertyChangedEventArgs(L"IsDirectFlipDisabled")); } fire_and_forget ProfileViewModel::_LoadIcon(FrameworkElement const& rootPage) { diff --git a/src/Magpie.App/ProfileViewModel.h b/src/Magpie.App/ProfileViewModel.h index 5bb433983..78ce07879 100644 --- a/src/Magpie.App/ProfileViewModel.h +++ b/src/Magpie.App/ProfileViewModel.h @@ -103,8 +103,8 @@ struct ProfileViewModel : ProfileViewModelT { bool IsShowFPS() const noexcept; void IsShowFPS(bool value); - bool IsDisableWindowResizing() const noexcept; - void IsDisableWindowResizing(bool value); + bool IsWindowResizingDisabled() const noexcept; + void IsWindowResizingDisabled(bool value); bool IsCaptureTitleBar() const noexcept; void IsCaptureTitleBar(bool value); @@ -144,8 +144,8 @@ struct ProfileViewModel : ProfileViewModelT { hstring LaunchParameters() const noexcept; void LaunchParameters(const hstring& value); - bool IsDisableDirectFlip() const noexcept; - void IsDisableDirectFlip(bool value); + bool IsDirectFlipDisabled() const noexcept; + void IsDirectFlipDisabled(bool value); private: fire_and_forget _LoadIcon(FrameworkElement const& rootPage); diff --git a/src/Magpie.App/ProfileViewModel.idl b/src/Magpie.App/ProfileViewModel.idl index 1ee5de450..5b2cf578b 100644 --- a/src/Magpie.App/ProfileViewModel.idl +++ b/src/Magpie.App/ProfileViewModel.idl @@ -45,7 +45,7 @@ namespace Magpie.App { Boolean IsFrameRateLimiterEnabled; Double MaxFrameRate; - Boolean IsDisableWindowResizing; + Boolean IsWindowResizingDisabled; Boolean IsCaptureTitleBar; Boolean CanCaptureTitleBar { get; }; @@ -62,6 +62,6 @@ namespace Magpie.App { Int32 CursorInterpolationMode; String LaunchParameters; - Boolean IsDisableDirectFlip; + Boolean IsDirectFlipDisabled; } } diff --git a/src/Magpie.App/Resources.language-en-US.resw b/src/Magpie.App/Resources.language-en-US.resw index 9406d55ce..9f37648de 100644 --- a/src/Magpie.App/Resources.language-en-US.resw +++ b/src/Magpie.App/Resources.language-en-US.resw @@ -763,9 +763,6 @@ Capture method - - VSync - Lock @@ -832,4 +829,22 @@ Developer mode is enabled. + + Duplicate frame detection + + + Always + + + Dynamic + + + Never + + + Enable statistics for dynamic detection + + + Dynamic detection + \ No newline at end of file diff --git a/src/Magpie.App/Resources.language-es.resw b/src/Magpie.App/Resources.language-es.resw index efb348552..46cc4b519 100644 --- a/src/Magpie.App/Resources.language-es.resw +++ b/src/Magpie.App/Resources.language-es.resw @@ -763,9 +763,6 @@ Método de captura - - VSync - Bloquear diff --git a/src/Magpie.App/Resources.language-fr.resw b/src/Magpie.App/Resources.language-fr.resw index c620fd08c..1eee1396d 100644 --- a/src/Magpie.App/Resources.language-fr.resw +++ b/src/Magpie.App/Resources.language-fr.resw @@ -192,9 +192,6 @@ Méthode de capture - - VSync - Opacitée diff --git a/src/Magpie.App/Resources.language-it.resw b/src/Magpie.App/Resources.language-it.resw index dd766b594..6880a9ee1 100644 --- a/src/Magpie.App/Resources.language-it.resw +++ b/src/Magpie.App/Resources.language-it.resw @@ -574,9 +574,6 @@ Esporta le modalità di ridimensionamento - - VSync - Blocca diff --git a/src/Magpie.App/Resources.language-ja.resw b/src/Magpie.App/Resources.language-ja.resw index 3f73e4aac..3d39234bb 100644 --- a/src/Magpie.App/Resources.language-ja.resw +++ b/src/Magpie.App/Resources.language-ja.resw @@ -760,9 +760,6 @@ キャプチャ方式 - - 垂直同期 - 不透明度 diff --git a/src/Magpie.App/Resources.language-ko.resw b/src/Magpie.App/Resources.language-ko.resw index 534bf589c..e945a3d61 100644 --- a/src/Magpie.App/Resources.language-ko.resw +++ b/src/Magpie.App/Resources.language-ko.resw @@ -489,9 +489,6 @@ 캡처 방식 - - 수직동기화 - 잠금 diff --git a/src/Magpie.App/Resources.language-pt-BR.resw b/src/Magpie.App/Resources.language-pt-BR.resw index 8d08433a6..48cbe5310 100644 --- a/src/Magpie.App/Resources.language-pt-BR.resw +++ b/src/Magpie.App/Resources.language-pt-BR.resw @@ -585,9 +585,6 @@ Desfixar - - VSync - Desativar cache de fonte diff --git a/src/Magpie.App/Resources.language-ru.resw b/src/Magpie.App/Resources.language-ru.resw index 671e10d82..6b345bde5 100644 --- a/src/Magpie.App/Resources.language-ru.resw +++ b/src/Magpie.App/Resources.language-ru.resw @@ -766,9 +766,6 @@ Способ захвата - - Вертикальная синхронизация - Заблокировать diff --git a/src/Magpie.App/Resources.language-tr.resw b/src/Magpie.App/Resources.language-tr.resw index c0d393203..9ceee3c27 100644 --- a/src/Magpie.App/Resources.language-tr.resw +++ b/src/Magpie.App/Resources.language-tr.resw @@ -793,9 +793,6 @@ Efektleri değiştir - - VSync Eşitleyici - Yazı tipi önbelleği etkisizleştir diff --git a/src/Magpie.App/Resources.language-uk.resw b/src/Magpie.App/Resources.language-uk.resw index cf36a6f58..9277feff1 100644 --- a/src/Magpie.App/Resources.language-uk.resw +++ b/src/Magpie.App/Resources.language-uk.resw @@ -757,9 +757,6 @@ Параметри запуску - - Вертикальна синхронізація - Прозорість diff --git a/src/Magpie.App/Resources.language-vi.resw b/src/Magpie.App/Resources.language-vi.resw index bf4d70856..46e058685 100644 --- a/src/Magpie.App/Resources.language-vi.resw +++ b/src/Magpie.App/Resources.language-vi.resw @@ -391,9 +391,6 @@ Tổng cộng - - VSync - Nâng cao diff --git a/src/Magpie.App/Resources.language-zh-Hans.resw b/src/Magpie.App/Resources.language-zh-Hans.resw index 2c5979602..ed50fbe59 100644 --- a/src/Magpie.App/Resources.language-zh-Hans.resw +++ b/src/Magpie.App/Resources.language-zh-Hans.resw @@ -763,9 +763,6 @@ 捕获方式 - - 垂直同步 - 不透明度 @@ -832,4 +829,22 @@ 开发者模式已启用。 + + 检测重复帧 + + + 总是检测 + + + 动态检测 + + + 从不检测 + + + 启用动态检测统计 + + + 动态检测 + \ No newline at end of file diff --git a/src/Magpie.App/Resources.language-zh-Hant.resw b/src/Magpie.App/Resources.language-zh-Hant.resw index 3e94bd926..3c56ad113 100644 --- a/src/Magpie.App/Resources.language-zh-Hant.resw +++ b/src/Magpie.App/Resources.language-zh-Hant.resw @@ -760,9 +760,6 @@ 截取方式 - - 垂直同步 - 透明度 diff --git a/src/Magpie.App/ScalingService.cpp b/src/Magpie.App/ScalingService.cpp index 9a3cbe16c..93bce4e1f 100644 --- a/src/Magpie.App/ScalingService.cpp +++ b/src/Magpie.App/ScalingService.cpp @@ -315,12 +315,14 @@ bool ScalingService::_StartScale(HWND hWnd, const Profile& profile) { } options.IsDebugMode(settings.IsDebugMode()); - options.IsDisableEffectCache(settings.IsDisableEffectCache()); - options.IsDisableFontCache(settings.IsDisableFontCache()); + options.IsEffectCacheDisabled(settings.IsEffectCacheDisabled()); + options.IsFontCacheDisabled(settings.IsFontCacheDisabled()); options.IsSaveEffectSources(settings.IsSaveEffectSources()); options.IsWarningsAreErrors(settings.IsWarningsAreErrors()); options.IsAllowScalingMaximized(settings.IsAllowScalingMaximized()); options.IsSimulateExclusiveFullscreen(settings.IsSimulateExclusiveFullscreen()); + options.duplicateFrameDetectionMode = settings.DuplicateFrameDetectionMode(); + options.IsStatisticsForDynamicDetectionEnabled(settings.IsStatisticsForDynamicDetectionEnabled()); _isAutoScaling = profile.isAutoScale; _scalingRuntime->Start(hWnd, std::move(options)); diff --git a/src/Magpie.App/ScalingService.h b/src/Magpie.App/ScalingService.h index 3501dee8b..bc390719f 100644 --- a/src/Magpie.App/ScalingService.h +++ b/src/Magpie.App/ScalingService.h @@ -43,7 +43,7 @@ class ScalingService { }); } - void IsTimerOnChanged(event_token const& token) noexcept { + void IsTimerOnChanged(event_token const& token) { _isTimerOnChangedEvent.remove(token); } @@ -64,7 +64,7 @@ class ScalingService { }); } - void TimerTick(event_token const& token) noexcept { + void TimerTick(event_token const& token) { _timerTickEvent.remove(token); } @@ -83,7 +83,7 @@ class ScalingService { }); } - void WndToRestoreChanged(event_token const& token) noexcept { + void WndToRestoreChanged(event_token const& token) { _wndToRestoreChangedEvent.remove(token); } @@ -100,7 +100,7 @@ class ScalingService { }); } - void IsRunningChanged(event_token const& token) noexcept { + void IsRunningChanged(event_token const& token) { _isRunningChangedEvent.remove(token); } diff --git a/src/Magpie.App/SettingsPage.xaml b/src/Magpie.App/SettingsPage.xaml index 94bdbada7..78ad77e8d 100644 --- a/src/Magpie.App/SettingsPage.xaml +++ b/src/Magpie.App/SettingsPage.xaml @@ -116,8 +116,8 @@ + x:Load="{x:Bind ViewModel.IsDeveloperMode, Mode=OneWay}" + IsExpanded="True"> @@ -132,11 +132,11 @@ + IsChecked="{x:Bind ViewModel.IsEffectCacheDisabled, Mode=TwoWay}" /> + IsChecked="{x:Bind ViewModel.IsFontCacheDisabled, Mode=TwoWay}" /> + + + + + + + + + + diff --git a/src/Magpie.App/SettingsViewModel.cpp b/src/Magpie.App/SettingsViewModel.cpp index 59629ff6d..2065ef63d 100644 --- a/src/Magpie.App/SettingsViewModel.cpp +++ b/src/Magpie.App/SettingsViewModel.cpp @@ -89,7 +89,7 @@ void SettingsViewModel::Theme(int value) { _propertyChangedEvent(*this, PropertyChangedEventArgs(L"Theme")); } -void SettingsViewModel::IsRunAtStartup(bool value) noexcept { +void SettingsViewModel::IsRunAtStartup(bool value) { if (value) { AutoStartHelper::EnableAutoStart( AppSettings::Get().IsAlwaysRunAsAdmin(), @@ -104,7 +104,7 @@ void SettingsViewModel::IsRunAtStartup(bool value) noexcept { _propertyChangedEvent(*this, PropertyChangedEventArgs(L"IsMinimizeAtStartupEnabled")); } -void SettingsViewModel::IsMinimizeAtStartup(bool value) noexcept { +void SettingsViewModel::IsMinimizeAtStartup(bool value) { if (!_isRunAtStartup) { return; } @@ -125,7 +125,7 @@ bool SettingsViewModel::IsPortableMode() const noexcept { return AppSettings::Get().IsPortableMode(); } -void SettingsViewModel::IsPortableMode(bool value) noexcept { +void SettingsViewModel::IsPortableMode(bool value) { AppSettings& settings = AppSettings::Get(); if (settings.IsPortableMode() == value) { @@ -146,7 +146,7 @@ bool SettingsViewModel::IsShowTrayIcon() const noexcept { return AppSettings::Get().IsShowTrayIcon(); } -void SettingsViewModel::IsShowTrayIcon(bool value) noexcept { +void SettingsViewModel::IsShowTrayIcon(bool value) { AppSettings::Get().IsShowTrayIcon(value); _propertyChangedEvent(*this, PropertyChangedEventArgs(L"IsShowTrayIcon")); @@ -166,7 +166,7 @@ bool SettingsViewModel::IsAlwaysRunAsAdmin() const noexcept { return AppSettings::Get().IsAlwaysRunAsAdmin(); } -void SettingsViewModel::IsAlwaysRunAsAdmin(bool value) noexcept { +void SettingsViewModel::IsAlwaysRunAsAdmin(bool value) { AppSettings::Get().IsAlwaysRunAsAdmin(value); } @@ -174,7 +174,7 @@ bool SettingsViewModel::IsAllowScalingMaximized() const noexcept { return AppSettings::Get().IsAllowScalingMaximized(); } -void SettingsViewModel::IsAllowScalingMaximized(bool value) noexcept { +void SettingsViewModel::IsAllowScalingMaximized(bool value) { AppSettings::Get().IsAllowScalingMaximized(value); if (value) { @@ -186,7 +186,7 @@ bool SettingsViewModel::IsSimulateExclusiveFullscreen() const noexcept { return AppSettings::Get().IsSimulateExclusiveFullscreen(); } -void SettingsViewModel::IsSimulateExclusiveFullscreen(bool value) noexcept { +void SettingsViewModel::IsSimulateExclusiveFullscreen(bool value) { AppSettings& settings = AppSettings::Get(); if (settings.IsSimulateExclusiveFullscreen() == value) { @@ -201,7 +201,7 @@ bool SettingsViewModel::IsInlineParams() const noexcept { return AppSettings::Get().IsInlineParams(); } -void SettingsViewModel::IsInlineParams(bool value) noexcept { +void SettingsViewModel::IsInlineParams(bool value) { AppSettings& settings = AppSettings::Get(); if (settings.IsInlineParams() == value) { @@ -216,7 +216,7 @@ bool SettingsViewModel::IsDeveloperMode() const noexcept { return AppSettings::Get().IsDeveloperMode(); } -void SettingsViewModel::IsDeveloperMode(bool value) noexcept { +void SettingsViewModel::IsDeveloperMode(bool value) { AppSettings& settings = AppSettings::Get(); if (settings.IsDeveloperMode() == value) { @@ -231,7 +231,7 @@ bool SettingsViewModel::IsDebugMode() const noexcept { return AppSettings::Get().IsDebugMode(); } -void SettingsViewModel::IsDebugMode(bool value) noexcept { +void SettingsViewModel::IsDebugMode(bool value) { AppSettings& settings = AppSettings::Get(); if (settings.IsDebugMode() == value) { @@ -242,41 +242,41 @@ void SettingsViewModel::IsDebugMode(bool value) noexcept { _propertyChangedEvent(*this, PropertyChangedEventArgs(L"IsDebugMode")); } -bool SettingsViewModel::IsDisableEffectCache() const noexcept { - return AppSettings::Get().IsDisableEffectCache(); +bool SettingsViewModel::IsEffectCacheDisabled() const noexcept { + return AppSettings::Get().IsEffectCacheDisabled(); } -void SettingsViewModel::IsDisableEffectCache(bool value) noexcept { +void SettingsViewModel::IsEffectCacheDisabled(bool value) { AppSettings& settings = AppSettings::Get(); - if (settings.IsDisableEffectCache() == value) { + if (settings.IsEffectCacheDisabled() == value) { return; } - settings.IsDisableEffectCache(value); - _propertyChangedEvent(*this, PropertyChangedEventArgs(L"IsDisableEffectCache")); + settings.IsEffectCacheDisabled(value); + _propertyChangedEvent(*this, PropertyChangedEventArgs(L"IsEffectCacheDisabled")); } -bool SettingsViewModel::IsDisableFontCache() const noexcept { - return AppSettings::Get().IsDisableFontCache(); +bool SettingsViewModel::IsFontCacheDisabled() const noexcept { + return AppSettings::Get().IsFontCacheDisabled(); } -void SettingsViewModel::IsDisableFontCache(bool value) noexcept { +void SettingsViewModel::IsFontCacheDisabled(bool value) { AppSettings& settings = AppSettings::Get(); - if (settings.IsDisableFontCache() == value) { + if (settings.IsFontCacheDisabled() == value) { return; } - settings.IsDisableFontCache(value); - _propertyChangedEvent(*this, PropertyChangedEventArgs(L"IsDisableFontCache")); + settings.IsFontCacheDisabled(value); + _propertyChangedEvent(*this, PropertyChangedEventArgs(L"IsFontCacheDisabled")); } bool SettingsViewModel::IsSaveEffectSources() const noexcept { return AppSettings::Get().IsSaveEffectSources(); } -void SettingsViewModel::IsSaveEffectSources(bool value) noexcept { +void SettingsViewModel::IsSaveEffectSources(bool value) { AppSettings& settings = AppSettings::Get(); if (settings.IsSaveEffectSources() == value) { @@ -291,7 +291,7 @@ bool SettingsViewModel::IsWarningsAreErrors() const noexcept { return AppSettings::Get().IsWarningsAreErrors(); } -void SettingsViewModel::IsWarningsAreErrors(bool value) noexcept { +void SettingsViewModel::IsWarningsAreErrors(bool value) { AppSettings& settings = AppSettings::Get(); if (settings.IsWarningsAreErrors() == value) { @@ -302,7 +302,53 @@ void SettingsViewModel::IsWarningsAreErrors(bool value) noexcept { _propertyChangedEvent(*this, PropertyChangedEventArgs(L"IsWarningsAreErrors")); } -void SettingsViewModel::_UpdateStartupOptions() noexcept { +int SettingsViewModel::DuplicateFrameDetectionMode() const noexcept { + return (int)AppSettings::Get().DuplicateFrameDetectionMode(); +} + +void SettingsViewModel::DuplicateFrameDetectionMode(int value) { + if (value < 0) { + return; + } + + const auto mode = (::Magpie::Core::DuplicateFrameDetectionMode)value; + + AppSettings& settings = AppSettings::Get(); + if (settings.DuplicateFrameDetectionMode() == mode) { + return; + } + + settings.DuplicateFrameDetectionMode(mode); + + _propertyChangedEvent(*this, PropertyChangedEventArgs(L"DuplicateFrameDetectionMode")); + _propertyChangedEvent(*this, PropertyChangedEventArgs(L"IsDynamicDection")); + + if (mode != ::Magpie::Core::DuplicateFrameDetectionMode::Dynamic) { + settings.IsStatisticsForDynamicDetectionEnabled(false); + _propertyChangedEvent(*this, PropertyChangedEventArgs(L"IsStatisticsForDynamicDetectionEnabled")); + } +} + +bool SettingsViewModel::IsDynamicDection() const noexcept { + return AppSettings::Get().DuplicateFrameDetectionMode() == ::Magpie::Core::DuplicateFrameDetectionMode::Dynamic; +} + +bool SettingsViewModel::IsStatisticsForDynamicDetectionEnabled() const noexcept { + return AppSettings::Get().IsStatisticsForDynamicDetectionEnabled(); +} + +void SettingsViewModel::IsStatisticsForDynamicDetectionEnabled(bool value) { + AppSettings& settings = AppSettings::Get(); + + if (settings.IsStatisticsForDynamicDetectionEnabled() == value) { + return; + } + + settings.IsStatisticsForDynamicDetectionEnabled(value); + _propertyChangedEvent(*this, PropertyChangedEventArgs(L"IsStatisticsForDynamicDetectionEnabled")); +} + +void SettingsViewModel::_UpdateStartupOptions() { std::wstring arguments; _isRunAtStartup = AutoStartHelper::IsAutoStartEnabled(arguments); if (_isRunAtStartup) { diff --git a/src/Magpie.App/SettingsViewModel.h b/src/Magpie.App/SettingsViewModel.h index eb65a398e..1da996657 100644 --- a/src/Magpie.App/SettingsViewModel.h +++ b/src/Magpie.App/SettingsViewModel.h @@ -21,66 +21,74 @@ struct SettingsViewModel : SettingsViewModelT { return _isRunAtStartup; } - void IsRunAtStartup(bool value) noexcept; + void IsRunAtStartup(bool value); bool IsMinimizeAtStartup() const noexcept { return _isMinimizeAtStartup; } - void IsMinimizeAtStartup(bool value) noexcept; + void IsMinimizeAtStartup(bool value); bool IsMinimizeAtStartupEnabled() const noexcept; bool IsPortableMode() const noexcept; - void IsPortableMode(bool value) noexcept; + void IsPortableMode(bool value); fire_and_forget OpenConfigLocation() const noexcept; bool IsShowTrayIcon() const noexcept; - void IsShowTrayIcon(bool value) noexcept; + void IsShowTrayIcon(bool value); bool IsProcessElevated() const noexcept; bool IsAlwaysRunAsAdmin() const noexcept; - void IsAlwaysRunAsAdmin(bool value) noexcept; + void IsAlwaysRunAsAdmin(bool value); bool IsAllowScalingMaximized() const noexcept; - void IsAllowScalingMaximized(bool value) noexcept; + void IsAllowScalingMaximized(bool value); bool IsSimulateExclusiveFullscreen() const noexcept; - void IsSimulateExclusiveFullscreen(bool value) noexcept; + void IsSimulateExclusiveFullscreen(bool value); bool IsInlineParams() const noexcept; - void IsInlineParams(bool value) noexcept; + void IsInlineParams(bool value); bool IsDeveloperMode() const noexcept; - void IsDeveloperMode(bool value) noexcept; + void IsDeveloperMode(bool value); bool IsDebugMode() const noexcept; - void IsDebugMode(bool value) noexcept; + void IsDebugMode(bool value); - bool IsDisableEffectCache() const noexcept; - void IsDisableEffectCache(bool value) noexcept; + bool IsEffectCacheDisabled() const noexcept; + void IsEffectCacheDisabled(bool value); - bool IsDisableFontCache() const noexcept; - void IsDisableFontCache(bool value) noexcept; + bool IsFontCacheDisabled() const noexcept; + void IsFontCacheDisabled(bool value); bool IsSaveEffectSources() const noexcept; - void IsSaveEffectSources(bool value) noexcept; + void IsSaveEffectSources(bool value); bool IsWarningsAreErrors() const noexcept; - void IsWarningsAreErrors(bool value) noexcept; + void IsWarningsAreErrors(bool value); + + int DuplicateFrameDetectionMode() const noexcept; + void DuplicateFrameDetectionMode(int value); + + bool IsDynamicDection() const noexcept; + + bool IsStatisticsForDynamicDetectionEnabled() const noexcept; + void IsStatisticsForDynamicDetectionEnabled(bool value); event_token PropertyChanged(PropertyChangedEventHandler const& handler) { return _propertyChangedEvent.add(handler); } - void PropertyChanged(event_token const& token) noexcept { + void PropertyChanged(event_token const& token) { _propertyChangedEvent.remove(token); } private: - void _UpdateStartupOptions() noexcept; + void _UpdateStartupOptions(); event _propertyChangedEvent; diff --git a/src/Magpie.App/SettingsViewModel.idl b/src/Magpie.App/SettingsViewModel.idl index 2c8b8f7f9..5d6d762d0 100644 --- a/src/Magpie.App/SettingsViewModel.idl +++ b/src/Magpie.App/SettingsViewModel.idl @@ -24,9 +24,12 @@ namespace Magpie.App { Boolean IsDeveloperMode; Boolean IsDebugMode; - Boolean IsDisableEffectCache; - Boolean IsDisableFontCache; + Boolean IsEffectCacheDisabled; + Boolean IsFontCacheDisabled; Boolean IsSaveEffectSources; Boolean IsWarningsAreErrors; + Int32 DuplicateFrameDetectionMode; + Boolean IsDynamicDection { get; }; + Boolean IsStatisticsForDynamicDetectionEnabled; } } diff --git a/src/Magpie.Core/FrameSourceBase.cpp b/src/Magpie.Core/FrameSourceBase.cpp index 0bffac3dd..13313c072 100644 --- a/src/Magpie.Core/FrameSourceBase.cpp +++ b/src/Magpie.Core/FrameSourceBase.cpp @@ -13,6 +13,13 @@ namespace Magpie::Core { +static constexpr const uint16_t INITIAL_CHECK_COUNT = 16; +static constexpr const uint16_t INITIAL_SKIP_COUNT = 1; +static constexpr const uint16_t MAX_SKIP_COUNT = 16; + +FrameSourceBase::FrameSourceBase() noexcept : + _nextSkipCount(INITIAL_SKIP_COUNT), _framesLeft(INITIAL_CHECK_COUNT) {} + FrameSourceBase::~FrameSourceBase() noexcept { const HWND hwndSrc = ScalingWindow::Get().HwndSrc(); @@ -58,7 +65,7 @@ bool FrameSourceBase::Initialize(DeviceResources& deviceResources) noexcept { HWND hwndSrc = ScalingWindow::Get().HwndSrc(); // 禁用窗口大小调整 - if (ScalingWindow::Get().Options().IsDisableWindowResizing()) { + if (ScalingWindow::Get().Options().IsWindowResizingDisabled()) { LONG_PTR style = GetWindowLongPtr(hwndSrc, GWL_STYLE); if (style & WS_THICKFRAME) { if (SetWindowLongPtr(hwndSrc, GWL_STYLE, style ^ WS_THICKFRAME)) { @@ -100,54 +107,20 @@ bool FrameSourceBase::Initialize(DeviceResources& deviceResources) noexcept { } FrameSourceBase::UpdateState FrameSourceBase::Update() noexcept { - UpdateState state = _Update(); - if (state != UpdateState::NewFrame) { + const UpdateState state = _Update(); + + const ScalingOptions& options = ScalingWindow::Get().Options(); + const auto duplicateFrameDetectionMode = options.duplicateFrameDetectionMode; + if (state != UpdateState::NewFrame || options.Is3DGameMode() || + duplicateFrameDetectionMode == DuplicateFrameDetectionMode::Never) { return state; } - ID3D11Device5* d3dDevice = _deviceResources->GetD3DDevice(); ID3D11DeviceContext4* d3dDC = _deviceResources->GetD3DDC(); - if (_prevFrame) { - // 检查是否和前一帧相同 - ID3D11ShaderResourceView* srvs[]{ - _deviceResources->GetShaderResourceView(_output.get()), - _deviceResources->GetShaderResourceView(_prevFrame.get()) - }; - d3dDC->CSSetShaderResources(0, 2, srvs); - - ID3D11SamplerState* sam = _deviceResources->GetSampler( - D3D11_FILTER_MIN_MAG_MIP_POINT, D3D11_TEXTURE_ADDRESS_CLAMP); - d3dDC->CSSetSamplers(0, 1, &sam); - - ID3D11UnorderedAccessView* uav = _deviceResources->GetUnorderedAccessView( - _resultBuffer.get(), 1, DXGI_FORMAT_R32_UINT); - // 将缓冲区置零 - static constexpr UINT ZERO[4]{}; - d3dDC->ClearUnorderedAccessViewUint(uav, ZERO); - d3dDC->CSSetUnorderedAccessViews(0, 1, &uav, nullptr); - - d3dDC->CSSetShader(_dupFrameCS.get(), nullptr, 0); - - d3dDC->Dispatch(_dispatchCount.first, _dispatchCount.second, 1); - - // 取回结果 - d3dDC->CopyResource(_readBackBuffer.get(), _resultBuffer.get()); - - uint32_t result = 1; - { - D3D11_MAPPED_SUBRESOURCE ms; - HRESULT hr = d3dDC->Map(_readBackBuffer.get(), 0, D3D11_MAP_READ, 0, &ms); - if (SUCCEEDED(hr)) { - result = *(uint32_t*)ms.pData; - d3dDC->Unmap(_readBackBuffer.get(), 0); - } - } - if (result == 0) { - // 和前一帧相同 - return UpdateState::NoChange; - } - } else { + if (!_prevFrame) { + ID3D11Device5* d3dDevice = _deviceResources->GetD3DDevice(); + D3D11_TEXTURE2D_DESC td; _output->GetDesc(&td); @@ -188,13 +161,87 @@ FrameSourceBase::UpdateState FrameSourceBase::Update() noexcept { return UpdateState::NewFrame; } - static constexpr std::pair BLOCK_SIZE{16, 16}; + static constexpr std::pair BLOCK_SIZE{ 16, 16 }; _dispatchCount.first = (td.Width + BLOCK_SIZE.first - 1) / BLOCK_SIZE.first; _dispatchCount.second = (td.Height + BLOCK_SIZE.second - 1) / BLOCK_SIZE.second; + + d3dDC->CopyResource(_prevFrame.get(), _output.get()); + return UpdateState::NewFrame; } - d3dDC->CopyResource(_prevFrame.get(), _output.get()); - return UpdateState::NewFrame; + if (duplicateFrameDetectionMode == DuplicateFrameDetectionMode::Always) { + // 总是检查重复帧 + if (_IsDuplicateFrame()) { + return UpdateState::NoChange; + } else { + d3dDC->CopyResource(_prevFrame.get(), _output.get()); + return UpdateState::NewFrame; + } + } + + /////////////////////////////////////////////// + // + // 动态检查重复帧,见 #787 + // + /////////////////////////////////////////////// + + const bool isStatisticsEnabled = options.IsStatisticsForDynamicDetectionEnabled(); + + if (_isCheckingForDuplicateFrame) { + if (--_framesLeft == 0) { + _isCheckingForDuplicateFrame = false; + _framesLeft = _nextSkipCount; + if (_nextSkipCount < MAX_SKIP_COUNT) { + // 增加下一次连续跳过检查的帧数 + ++_nextSkipCount; + } + } + + if (_IsDuplicateFrame()) { + _isCheckingForDuplicateFrame = true; + _framesLeft = INITIAL_CHECK_COUNT; + _nextSkipCount = INITIAL_SKIP_COUNT; + return UpdateState::NoChange; + } else { + if (_isCheckingForDuplicateFrame || isStatisticsEnabled) { + d3dDC->CopyResource(_prevFrame.get(), _output.get()); + } + return UpdateState::NewFrame; + } + } else { + if (--_framesLeft == 0) { + _isCheckingForDuplicateFrame = true; + // 第 2 次连续检查 10 帧,之后逐渐减少,从第 16 次开始只连续检查 2 帧 + _framesLeft = uint32_t((-4 * (int)_nextSkipCount + 78) / 7); + + if (!isStatisticsEnabled) { + // 下一帧将检查重复帧,需要复制此帧 + d3dDC->CopyResource(_prevFrame.get(), _output.get()); + } + } + + if (isStatisticsEnabled) { + const bool isDuplicate = _IsDuplicateFrame(); + if (!isDuplicate) { + d3dDC->CopyResource(_prevFrame.get(), _output.get()); + } + + std::pair statistics = _statistics.load(std::memory_order_relaxed); + if (isDuplicate) { + // 预测错误 + ++statistics.first; + } + // 总帧数 + ++statistics.second; + _statistics.store(statistics, std::memory_order_relaxed); + } + + return UpdateState::NewFrame; + } +} + +std::pair FrameSourceBase::GetStatisticsForDynamicDetection() const noexcept { + return _statistics.load(std::memory_order_relaxed); } struct EnumChildWndParam { @@ -405,4 +452,42 @@ bool FrameSourceBase::_CenterWindowIfNecessary(HWND hWnd, const RECT& rcWork) no return true; } +bool FrameSourceBase::_IsDuplicateFrame() { + // 检查是否和前一帧相同 + ID3D11DeviceContext4* d3dDC = _deviceResources->GetD3DDC(); + + ID3D11ShaderResourceView* srvs[]{ + _deviceResources->GetShaderResourceView(_output.get()), + _deviceResources->GetShaderResourceView(_prevFrame.get()) + }; + d3dDC->CSSetShaderResources(0, 2, srvs); + + ID3D11SamplerState* sam = _deviceResources->GetSampler( + D3D11_FILTER_MIN_MAG_MIP_POINT, D3D11_TEXTURE_ADDRESS_CLAMP); + d3dDC->CSSetSamplers(0, 1, &sam); + + ID3D11UnorderedAccessView* uav = _deviceResources->GetUnorderedAccessView( + _resultBuffer.get(), 1, DXGI_FORMAT_R32_UINT); + // 将缓冲区置零 + static constexpr UINT ZERO[4]{}; + d3dDC->ClearUnorderedAccessViewUint(uav, ZERO); + d3dDC->CSSetUnorderedAccessViews(0, 1, &uav, nullptr); + + d3dDC->CSSetShader(_dupFrameCS.get(), nullptr, 0); + + d3dDC->Dispatch(_dispatchCount.first, _dispatchCount.second, 1); + + // 取回结果 + d3dDC->CopyResource(_readBackBuffer.get(), _resultBuffer.get()); + + uint32_t result = 1; + D3D11_MAPPED_SUBRESOURCE ms; + HRESULT hr = d3dDC->Map(_readBackBuffer.get(), 0, D3D11_MAP_READ, 0, &ms); + if (SUCCEEDED(hr)) { + result = *(uint32_t*)ms.pData; + d3dDC->Unmap(_readBackBuffer.get(), 0); + } + return result == 0; +} + } diff --git a/src/Magpie.Core/FrameSourceBase.h b/src/Magpie.Core/FrameSourceBase.h index a0b34592d..afd9c5e3f 100644 --- a/src/Magpie.Core/FrameSourceBase.h +++ b/src/Magpie.Core/FrameSourceBase.h @@ -6,7 +6,7 @@ class DeviceResources; class FrameSourceBase { public: - FrameSourceBase() noexcept {} + FrameSourceBase() noexcept; virtual ~FrameSourceBase() noexcept; @@ -33,6 +33,8 @@ class FrameSourceBase { // 因为源窗口可能存在 DPI 缩放,而某些捕获方法无视 DPI 缩放 const RECT& SrcRect() const noexcept { return _srcRect; } + std::pair GetStatisticsForDynamicDetection() const noexcept; + virtual const char* Name() const noexcept = 0; virtual bool IsScreenCapture() const noexcept = 0; @@ -66,8 +68,6 @@ class FrameSourceBase { DeviceResources* _deviceResources = nullptr; winrt::com_ptr _output; - // 用于检查重复帧 - winrt::com_ptr _prevFrame; winrt::com_ptr _resultBuffer; winrt::com_ptr _readBackBuffer; winrt::com_ptr _dupFrameCS; @@ -75,6 +75,17 @@ class FrameSourceBase { bool _roundCornerDisabled = false; bool _windowResizingDisabled = false; + +private: + bool _IsDuplicateFrame(); + + // 用于检查重复帧 + winrt::com_ptr _prevFrame; + uint16_t _nextSkipCount; + uint16_t _framesLeft; + // (预测错误帧数, 总计跳过帧数) + std::atomic> _statistics; + bool _isCheckingForDuplicateFrame = true; }; } diff --git a/src/Magpie.Core/OverlayDrawer.cpp b/src/Magpie.Core/OverlayDrawer.cpp index 2d84c60e9..baf88efe4 100644 --- a/src/Magpie.Core/OverlayDrawer.cpp +++ b/src/Magpie.Core/OverlayDrawer.cpp @@ -67,8 +67,6 @@ void OverlayDrawer::Draw() noexcept { _imguiImpl.BeginFrame(); - ImGui::ShowDemoWindow(); - if (isShowFPS) { _DrawFPS(); } @@ -127,7 +125,7 @@ bool OverlayDrawer::_BuildFonts() noexcept { ImFontAtlas& fontAtlas = *ImGui::GetIO().Fonts; - bool fontCacheDisabled = ScalingWindow::Get().Options().IsDisableFontCache(); + bool fontCacheDisabled = ScalingWindow::Get().Options().IsFontCacheDisabled(); if (!fontCacheDisabled && ImGuiFontsCacheManager::Get().Load(language, fontAtlas)) { _fontUI = fontAtlas.Fonts[0]; _fontMonoNumbers = fontAtlas.Fonts[1]; @@ -325,15 +323,59 @@ void OverlayDrawer::_DrawFPS() noexcept { } void OverlayDrawer::_DrawUI() noexcept { + const ScalingOptions& options = ScalingWindow::Get().Options(); + const Renderer& renderer = ScalingWindow::Get().Renderer(); + //auto& gpuTimer = renderer(); + +#ifdef _DEBUG + ImGui::ShowDemoWindow(); +#endif + + const float maxWindowWidth = 400 * _dpiScale; + ImGui::SetNextWindowSizeConstraints(ImVec2(), ImVec2(maxWindowWidth, 500 * _dpiScale)); + + static float initPosX = Win32Utils::GetSizeOfRect(renderer.DestRect()).cx - maxWindowWidth; + ImGui::SetNextWindowPos(ImVec2(initPosX, 20), ImGuiCond_FirstUseEver); + + std::string profilerStr = _GetResourceString(L"Overlay_Profiler"); + if (!ImGui::Begin(profilerStr.c_str(), nullptr, ImGuiWindowFlags_NoNav | ImGuiWindowFlags_AlwaysAutoResize)) { + ImGui::End(); + return; + } + + // 始终为滚动条预留空间 + ImGui::PushTextWrapPos(maxWindowWidth - ImGui::GetStyle().WindowPadding.x - ImGui::GetStyle().ScrollbarSize); + ImGui::TextUnformatted(StrUtils::Concat("GPU: ", _hardwareInfo.gpuName).c_str()); + const std::string& captureMethodStr = _GetResourceString(L"Overlay_Profiler_CaptureMethod"); + ImGui::TextUnformatted(StrUtils::Concat(captureMethodStr.c_str(), ": ", renderer.FrameSource().Name()).c_str()); + if (options.IsStatisticsForDynamicDetectionEnabled() && + options.duplicateFrameDetectionMode == DuplicateFrameDetectionMode::Dynamic) { + const std::pair statistics = + renderer.FrameSource().GetStatisticsForDynamicDetection(); + ImGui::TextUnformatted(StrUtils::Concat(_GetResourceString(L"Overlay_Profiler_DynamicDetection"), ": ").c_str()); + ImGui::SameLine(0, 0); + ImGui::PushFont(_fontMonoNumbers); + ImGui::TextUnformatted(fmt::format("{}/{} ({:.1f}%)", statistics.first, statistics.second, + statistics.second == 0 ? 0.0f : statistics.first * 100.0f / statistics.second).c_str()); + ImGui::PopFont(); + } + ImGui::PopTextWrapPos(); + + + ImGui::End(); } void OverlayDrawer::_EnableSrcWnd(bool /*enable*/) noexcept { } -const std::string& OverlayDrawer::_GetResourceString(const std::wstring_view& /*key*/) noexcept { - // TODO: 在此处插入 return 语句 - static std::string t; - return t; +const std::string& OverlayDrawer::_GetResourceString(const std::wstring_view& key) noexcept { + static phmap::flat_hash_map cache; + + if (auto it = cache.find(key); it != cache.end()) { + return it->second; + } + + return cache[key] = StrUtils::UTF16ToUTF8(_resourceLoader.GetString(key)); } } diff --git a/src/Magpie.Core/Renderer.cpp b/src/Magpie.Core/Renderer.cpp index 68e39951a..ba090e6e2 100644 --- a/src/Magpie.Core/Renderer.cpp +++ b/src/Magpie.Core/Renderer.cpp @@ -351,7 +351,7 @@ static std::optional CompileEffect(const EffectOption& effectOption) uint32_t compileFlag = 0; const ScalingOptions& scalingOptions = ScalingWindow::Get().Options(); - if (scalingOptions.IsDisableEffectCache()) { + if (scalingOptions.IsEffectCacheDisabled()) { compileFlag |= EffectCompilerFlags::NoCache; } if (scalingOptions.IsSaveEffectSources()) { diff --git a/src/Magpie.Core/Renderer.h b/src/Magpie.Core/Renderer.h index de29080c9..0636415db 100644 --- a/src/Magpie.Core/Renderer.h +++ b/src/Magpie.Core/Renderer.h @@ -7,6 +7,8 @@ namespace Magpie::Core { +class FrameSourceBase; + class Renderer { public: Renderer() noexcept; @@ -32,6 +34,10 @@ class Renderer { return _destRect; } + const FrameSourceBase& FrameSource() const noexcept { + return *_frameSource; + } + void OnCursorVisibilityChanged(bool isVisible); void MessageHandler(UINT msg, WPARAM wParam, LPARAM lParam) noexcept; @@ -76,7 +82,7 @@ class Renderer { // 只能由后台线程访问 DeviceResources _backendResources; - std::unique_ptr _frameSource; + std::unique_ptr _frameSource; std::vector _effectDrawers; StepTimer _stepTimer; diff --git a/src/Magpie.Core/ScalingOptions.h b/src/Magpie.Core/ScalingOptions.h index 55de385c8..2ae61ebe3 100644 --- a/src/Magpie.Core/ScalingOptions.h +++ b/src/Magpie.Core/ScalingOptions.h @@ -43,6 +43,7 @@ struct ScalingFlags { static constexpr const uint32_t DisableDirectFlip = 1 << 13; static constexpr const uint32_t DisableFontCache = 1 << 14; static constexpr const uint32_t AllowScalingMaximized = 1 << 15; + static constexpr const uint32_t EnableStatisticsForDynamicDetection = 1 << 16; }; enum class ScalingType { @@ -70,11 +71,17 @@ struct EffectOption { } }; +enum class DuplicateFrameDetectionMode { + Always, + Dynamic, + Never +}; + struct ScalingOptions { - DEFINE_FLAG_ACCESSOR(IsDisableWindowResizing, ScalingFlags::DisableWindowResizing, flags) + DEFINE_FLAG_ACCESSOR(IsWindowResizingDisabled, ScalingFlags::DisableWindowResizing, flags) DEFINE_FLAG_ACCESSOR(IsDebugMode, ScalingFlags::BreakpointMode, flags) - DEFINE_FLAG_ACCESSOR(IsDisableEffectCache, ScalingFlags::DisableEffectCache, flags) - DEFINE_FLAG_ACCESSOR(IsDisableFontCache, ScalingFlags::DisableFontCache, flags) + DEFINE_FLAG_ACCESSOR(IsEffectCacheDisabled, ScalingFlags::DisableEffectCache, flags) + DEFINE_FLAG_ACCESSOR(IsFontCacheDisabled, ScalingFlags::DisableFontCache, flags) DEFINE_FLAG_ACCESSOR(IsSaveEffectSources, ScalingFlags::SaveEffectSources, flags) DEFINE_FLAG_ACCESSOR(IsWarningsAreErrors, ScalingFlags::WarningsAreErrors, flags) DEFINE_FLAG_ACCESSOR(IsAllowScalingMaximized, ScalingFlags::AllowScalingMaximized, flags) @@ -84,7 +91,8 @@ struct ScalingOptions { DEFINE_FLAG_ACCESSOR(IsCaptureTitleBar, ScalingFlags::CaptureTitleBar, flags) DEFINE_FLAG_ACCESSOR(IsAdjustCursorSpeed, ScalingFlags::AdjustCursorSpeed, flags) DEFINE_FLAG_ACCESSOR(IsDrawCursor, ScalingFlags::DrawCursor, flags) - DEFINE_FLAG_ACCESSOR(IsDisableDirectFlip, ScalingFlags::DisableDirectFlip, flags) + DEFINE_FLAG_ACCESSOR(IsDirectFlipDisabled, ScalingFlags::DisableDirectFlip, flags) + DEFINE_FLAG_ACCESSOR(IsStatisticsForDynamicDetectionEnabled, ScalingFlags::EnableStatisticsForDynamicDetection, flags) Cropping cropping{}; uint32_t flags = ScalingFlags::AdjustCursorSpeed | ScalingFlags::DrawCursor; // ScalingFlags @@ -96,6 +104,8 @@ struct ScalingOptions { CursorInterpolationMode cursorInterpolationMode = CursorInterpolationMode::NearestNeighbor; std::vector effects; + + DuplicateFrameDetectionMode duplicateFrameDetectionMode = DuplicateFrameDetectionMode::Dynamic; }; } diff --git a/src/Shared/Win32Utils.cpp b/src/Shared/Win32Utils.cpp index 85797702a..1049bbf75 100644 --- a/src/Shared/Win32Utils.cpp +++ b/src/Shared/Win32Utils.cpp @@ -135,7 +135,7 @@ bool Win32Utils::ReadFile(const wchar_t* fileName, std::vector& result) { return true; } -bool Win32Utils::ReadTextFile(const wchar_t* fileName, std::string& result) { +bool Win32Utils::ReadTextFile(const wchar_t* fileName, std::string& result) noexcept { FILE* hFile; if (_wfopen_s(&hFile, fileName, L"rt") || !hFile) { Logger::Get().Error(StrUtils::Concat("打开文件 ", StrUtils::UTF16ToUTF8(fileName), " 失败")); @@ -156,7 +156,7 @@ bool Win32Utils::ReadTextFile(const wchar_t* fileName, std::string& result) { return true; } -bool Win32Utils::WriteFile(const wchar_t* fileName, const void* buffer, size_t bufferSize) { +bool Win32Utils::WriteFile(const wchar_t* fileName, const void* buffer, size_t bufferSize) noexcept { FILE* hFile; if (_wfopen_s(&hFile, fileName, L"wb") || !hFile) { Logger::Get().Error(StrUtils::Concat("打开文件 ", StrUtils::UTF16ToUTF8(fileName), " 失败")); @@ -172,7 +172,7 @@ bool Win32Utils::WriteFile(const wchar_t* fileName, const void* buffer, size_t b return true; } -bool Win32Utils::WriteTextFile(const wchar_t* fileName, std::string_view text) { +bool Win32Utils::WriteTextFile(const wchar_t* fileName, std::string_view text) noexcept { FILE* hFile; if (_wfopen_s(&hFile, fileName, L"wt") || !hFile) { Logger::Get().Error(StrUtils::Concat("打开文件 ", StrUtils::UTF16ToUTF8(fileName), " 失败")); @@ -185,7 +185,7 @@ bool Win32Utils::WriteTextFile(const wchar_t* fileName, std::string_view text) { return true; } -bool Win32Utils::CreateDir(const std::wstring& path, bool recursive) { +bool Win32Utils::CreateDir(const std::wstring& path, bool recursive) noexcept { if (DirExists(path.c_str())) { return true; } @@ -260,7 +260,7 @@ static void CALLBACK TPCallback(PTP_CALLBACK_INSTANCE, PVOID context, PTP_WORK) #pragma warning(pop) -void Win32Utils::RunParallel(std::function func, uint32_t times) { +void Win32Utils::RunParallel(std::function func, uint32_t times) noexcept { #ifdef _DEBUG // 为了便于调试,DEBUG 模式下不使用线程池 for (UINT i = 0; i < times; ++i) { @@ -298,7 +298,7 @@ void Win32Utils::RunParallel(std::function func, uint32_t times) #endif // _DEBUG } -bool Win32Utils::SetForegroundWindow(HWND hWnd) { +bool Win32Utils::SetForegroundWindow(HWND hWnd) noexcept { if (::SetForegroundWindow(hWnd)) { return true; } diff --git a/src/Shared/Win32Utils.h b/src/Shared/Win32Utils.h index 8d3d481a5..72e423fa6 100644 --- a/src/Shared/Win32Utils.h +++ b/src/Shared/Win32Utils.h @@ -22,11 +22,11 @@ struct Win32Utils { static bool ReadFile(const wchar_t* fileName, std::vector& result); - static bool ReadTextFile(const wchar_t* fileName, std::string& result); + static bool ReadTextFile(const wchar_t* fileName, std::string& result) noexcept; - static bool WriteFile(const wchar_t* fileName, const void* buffer, size_t bufferSize); + static bool WriteFile(const wchar_t* fileName, const void* buffer, size_t bufferSize) noexcept; - static bool WriteTextFile(const wchar_t* fileName, std::string_view text); + static bool WriteTextFile(const wchar_t* fileName, std::string_view text) noexcept; static bool FileExists(const wchar_t* fileName) noexcept { DWORD attrs = GetFileAttributes(fileName); @@ -39,7 +39,7 @@ struct Win32Utils { return (attrs != INVALID_FILE_ATTRIBUTES) && (attrs & FILE_ATTRIBUTE_DIRECTORY); } - static bool CreateDir(const std::wstring& path, bool recursive = false); + static bool CreateDir(const std::wstring& path, bool recursive = false) noexcept; struct OSVersion : Version { constexpr OSVersion() {} @@ -145,10 +145,10 @@ struct Win32Utils { // 并行执行 times 次 func,并行失败时回退到单线程 // 执行完毕后返回 - static void RunParallel(std::function func, uint32_t times); + static void RunParallel(std::function func, uint32_t times) noexcept; // 强制切换前台窗口 - static bool SetForegroundWindow(HWND hWnd); + static bool SetForegroundWindow(HWND hWnd) noexcept; // 获取 Virtual Key 的名字 static const std::wstring& GetKeyName(uint8_t key); From dc66fb2cf2e0849bb633c4979b96794f8050a421 Mon Sep 17 00:00:00 2001 From: Xu <34770031+Blinue@users.noreply.github.com> Date: Fri, 22 Dec 2023 20:23:37 +0800 Subject: [PATCH 089/155] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E6=98=BE?= =?UTF-8?q?=E7=A4=BA=E5=8F=A0=E5=8A=A0=E5=B1=82=E6=97=B6=E7=9A=84=E5=85=89?= =?UTF-8?q?=E6=A0=87=E6=B8=B2=E6=9F=93=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Magpie.Core/CursorDrawer.cpp | 12 ++++--- src/Magpie.Core/ImGuiBackend.cpp | 62 +++++++++++++++++++------------- 2 files changed, 44 insertions(+), 30 deletions(-) diff --git a/src/Magpie.Core/CursorDrawer.cpp b/src/Magpie.Core/CursorDrawer.cpp index fc7413388..2a366384a 100644 --- a/src/Magpie.Core/CursorDrawer.cpp +++ b/src/Magpie.Core/CursorDrawer.cpp @@ -115,11 +115,12 @@ void CursorDrawer::Draw() noexcept { const float cursorScaling = ScalingWindow::Get().Options().cursorScaling; const SIZE cursorSize{ lroundf(ci->size.cx * cursorScaling), lroundf(ci->size.cy * cursorScaling) }; - RECT cursorRect; - cursorRect.left = lroundf(cursorPos.x - ci->hotSpot.x * cursorScaling); - cursorRect.top = lroundf(cursorPos.y - ci->hotSpot.y * cursorScaling); - cursorRect.right = cursorRect.left + cursorSize.cx; - cursorRect.bottom = cursorRect.top + cursorSize.cy; + RECT cursorRect{ + .left = lroundf(cursorPos.x - ci->hotSpot.x * cursorScaling), + .top = lroundf(cursorPos.y - ci->hotSpot.y * cursorScaling), + .right = cursorRect.left + cursorSize.cx, + .bottom = cursorRect.top + cursorSize.cy + }; if (cursorRect.left >= _viewportRect.right || cursorRect.top >= _viewportRect.bottom || @@ -137,6 +138,7 @@ void CursorDrawer::Draw() noexcept { float bottom = top - cursorSize.cy / (float)viewportSize.cy * 2; ID3D11DeviceContext* d3dDC = _deviceResources->GetD3DDC(); + d3dDC->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP); d3dDC->IASetInputLayout(_simpleIL.get()); d3dDC->VSSetShader(_simpleVS.get(), nullptr, 0); diff --git a/src/Magpie.Core/ImGuiBackend.cpp b/src/Magpie.Core/ImGuiBackend.cpp index 16e5dbb96..7fbe0bd9d 100644 --- a/src/Magpie.Core/ImGuiBackend.cpp +++ b/src/Magpie.Core/ImGuiBackend.cpp @@ -140,31 +140,42 @@ void ImGuiBackend::RenderDrawData(ImDrawData* drawData) noexcept { } } - // Upload vertex/index data into a single contiguous GPU buffer - D3D11_MAPPED_SUBRESOURCE vtxResource, idxResource; - hr = d3dDC->Map(_vertexBuffer.get(), 0, D3D11_MAP_WRITE_DISCARD, 0, &vtxResource); - if (FAILED(hr)) { - Logger::Get().ComError("Map 失败", hr); - return; - } + // 上传顶点数据 + { + D3D11_MAPPED_SUBRESOURCE vtxResource; + hr = d3dDC->Map(_vertexBuffer.get(), 0, D3D11_MAP_WRITE_DISCARD, 0, &vtxResource); + if (FAILED(hr)) { + Logger::Get().ComError("Map 失败", hr); + return; + } - hr = d3dDC->Map(_indexBuffer.get(), 0, D3D11_MAP_WRITE_DISCARD, 0, &idxResource); - if (FAILED(hr)) { - Logger::Get().ComError("Map 失败", hr); - return; + ImDrawVert* vtxDst = (ImDrawVert*)vtxResource.pData; + for (int n = 0; n < drawData->CmdListsCount; ++n) { + const ImDrawList* cmdList = drawData->CmdLists[n]; + std::memcpy(vtxDst, cmdList->VtxBuffer.Data, cmdList->VtxBuffer.Size * sizeof(ImDrawVert)); + vtxDst += cmdList->VtxBuffer.Size; + } + + d3dDC->Unmap(_vertexBuffer.get(), 0); } + // 上传索引数据 + { + D3D11_MAPPED_SUBRESOURCE idxResource; + hr = d3dDC->Map(_indexBuffer.get(), 0, D3D11_MAP_WRITE_DISCARD, 0, &idxResource); + if (FAILED(hr)) { + Logger::Get().ComError("Map 失败", hr); + return; + } - ImDrawVert* vtxDst = (ImDrawVert*)vtxResource.pData; - ImDrawIdx* idxDst = (ImDrawIdx*)idxResource.pData; - for (int n = 0; n < drawData->CmdListsCount; ++n) { - const ImDrawList* cmdList = drawData->CmdLists[n]; - std::memcpy(vtxDst, cmdList->VtxBuffer.Data, cmdList->VtxBuffer.Size * sizeof(ImDrawVert)); - std::memcpy(idxDst, cmdList->IdxBuffer.Data, cmdList->IdxBuffer.Size * sizeof(ImDrawIdx)); - vtxDst += cmdList->VtxBuffer.Size; - idxDst += cmdList->IdxBuffer.Size; + ImDrawIdx* idxDst = (ImDrawIdx*)idxResource.pData; + for (int n = 0; n < drawData->CmdListsCount; ++n) { + const ImDrawList* cmdList = drawData->CmdLists[n]; + std::memcpy(idxDst, cmdList->IdxBuffer.Data, cmdList->IdxBuffer.Size * sizeof(ImDrawIdx)); + idxDst += cmdList->IdxBuffer.Size; + } + + d3dDC->Unmap(_indexBuffer.get(), 0); } - d3dDC->Unmap(_vertexBuffer.get(), 0); - d3dDC->Unmap(_indexBuffer.get(), 0); // Setup orthographic projection matrix into our constant buffer // Our visible imgui space lies from drawData->DisplayPos (top left) to drawData->DisplayPos+data_data->DisplaySize (bottom right). DisplayPos is (0,0) for single viewport apps. @@ -176,7 +187,7 @@ void ImGuiBackend::RenderDrawData(ImDrawData* drawData) noexcept { return; } - VERTEX_CONSTANT_BUFFER_DX11* constant_buffer = (VERTEX_CONSTANT_BUFFER_DX11*)mappedResource.pData; + VERTEX_CONSTANT_BUFFER_DX11* constantBuffer = (VERTEX_CONSTANT_BUFFER_DX11*)mappedResource.pData; float left = drawData->DisplayPos.x; float right = drawData->DisplayPos.x + drawData->DisplaySize.x; float top = drawData->DisplayPos.y; @@ -187,7 +198,7 @@ void ImGuiBackend::RenderDrawData(ImDrawData* drawData) noexcept { { 0.0f, 0.0f, 0.5f, 0.0f }, { (right + left) / (left - right), (top + bottom) / (bottom - top), 0.5f, 1.0f }, }; - std::memcpy(&constant_buffer->mvp, mvp, sizeof(mvp)); + std::memcpy(&constantBuffer->mvp, mvp, sizeof(mvp)); d3dDC->Unmap(_vertexConstantBuffer.get(), 0); } @@ -206,10 +217,11 @@ void ImGuiBackend::RenderDrawData(ImDrawData* drawData) noexcept { if (pcmd->UserCallback != nullptr) { // User callback, registered via ImDrawList::AddCallback() // (ImDrawCallback_ResetRenderState is a special callback value used by the user to request the renderer to reset render state.) - if (pcmd->UserCallback == ImDrawCallback_ResetRenderState) + if (pcmd->UserCallback == ImDrawCallback_ResetRenderState){ _SetupRenderState(drawData); - else + } else { pcmd->UserCallback(cmdList, pcmd); + } } else { // Project scissor/clipping rectangles into framebuffer space ImVec2 clipMin(pcmd->ClipRect.x - clip_off.x, pcmd->ClipRect.y - clip_off.y); From 40efd1263885ab17cf111844ab45b240e61076dd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=97=AD?= Date: Tue, 26 Dec 2023 14:31:04 +0800 Subject: [PATCH 090/155] =?UTF-8?q?fix:=20=E4=BC=98=E5=8C=96=E4=B8=8A?= =?UTF-8?q?=E8=BE=B9=E6=A1=86=20=E4=BF=AE=E5=A4=8D=E4=BA=86=E4=B8=80?= =?UTF-8?q?=E4=B8=AA=E5=B0=8F=20bug=EF=BC=9A=E6=9C=80=E5=A4=A7=E5=8C=96?= =?UTF-8?q?=E6=97=B6=E6=9C=89=E6=97=B6=E4=BC=9A=E7=9C=8B=E5=88=B0=E8=A2=AB?= =?UTF-8?q?=E9=81=AE=E7=9B=96=E7=9A=84=E6=A0=87=E9=A2=98=E6=A0=8F=E3=80=82?= =?UTF-8?q?=E7=8E=B0=E5=9C=A8=E5=9C=A8=20WM=5FNCCALCSIZE=20=E4=B8=AD?= =?UTF-8?q?=E9=87=8D=E7=BD=AE=E8=BE=B9=E6=A1=86=EF=BC=8C=E5=BA=94=E8=AF=A5?= =?UTF-8?q?=E6=98=AF=E5=AE=8C=E7=BE=8E=E7=9A=84=E8=A7=A3=E5=86=B3=E6=96=B9?= =?UTF-8?q?=E6=A1=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Magpie/XamlWindow.h | 54 ++++++++++++++++++++++++----------------- 1 file changed, 32 insertions(+), 22 deletions(-) diff --git a/src/Magpie/XamlWindow.h b/src/Magpie/XamlWindow.h index 8d4fb2dc7..7b48d2850 100644 --- a/src/Magpie/XamlWindow.h +++ b/src/Magpie/XamlWindow.h @@ -141,32 +141,13 @@ class XamlWindowT { _currentDpi = GetDpiForWindow(_hWnd); if (!Win32Utils::GetOSVersion().IsWin11()) { - // 在 Win10 中,移除标题栏时上边框也被没了。我们的解决方案是:使用 DwmExtendFrameIntoClientArea - // 将边框扩展到客户区,然后在顶部绘制了一个黑色实线来显示系统原始边框(这种情况下操作系统将黑色视 - // 为透明)。因此我们有**完美**的上边框! - // 见 https://docs.microsoft.com/en-us/windows/win32/dwm/customframe#extending-the-client-frame - // - // 有的软件自己绘制了假的上边框,如 Chromium 系、WinUI 3 等,但窗口失去焦点时边框是半透明的,无法 - // 完美模拟。 - // - // 我们选择扩展到标题栏高度,这是最好的选择。一个自然的想法是,既然上边框只有一个像素高,我们扩展一 - // 个像素即可,可惜因为 DWM 的 bug,这会使窗口失去焦点时上边框变为透明。那么能否传一个负值,让边框 - // 扩展到整个客户区?这大部分情况下可以工作,有一个小 bug:不显示边框颜色的设置下深色模式的边框会变 - // 为纯黑而不是半透明。 - // - // 最大化时不要调用 DwmExtendFrameIntoClientArea 还原边框,会导致窗口闪烁。 - RECT frame{}; - AdjustWindowRectExForDpi(&frame, GetWindowStyle(_hWnd), FALSE, 0, _currentDpi); - MARGINS margins{ - .cyTopHeight = -frame.top - }; - DwmExtendFrameIntoClientArea(_hWnd, &margins); - // 初始化双缓冲绘图 static const int _ = []() { BufferedPaintInit(); return 0; }(); + + _UpdateFrameMargins(); } break; @@ -240,6 +221,9 @@ class XamlWindowT { } } + // 如果在 WM_SIZE 中处理会导致窗口闪烁 + _UpdateFrameMargins(); + return 0; } case WM_NCHITTEST: @@ -278,7 +262,7 @@ class XamlWindowT { const int topBorderHeight = (int)_GetTopBorderHeight(); - // 在顶部绘制黑色实线以显示系统原始边框,见 WM_CREATE + // 在顶部绘制黑色实线以显示系统原始边框,见 _UpdateFrameMargins if (ps.rcPaint.top < topBorderHeight) { RECT rcTopBorder = ps.rcPaint; rcTopBorder.bottom = topBorderHeight; @@ -525,6 +509,32 @@ class XamlWindowT { } } + void _UpdateFrameMargins() const noexcept { + if (Win32Utils::GetOSVersion().IsWin11()) { + return; + } + + MARGINS margins{}; + if (_GetTopBorderHeight() > 0) { + // 在 Win10 中,移除标题栏时上边框也被没了。我们的解决方案是:使用 DwmExtendFrameIntoClientArea + // 将边框扩展到客户区,然后在顶部绘制了一个黑色实线来显示系统原始边框(这种情况下操作系统将黑色视 + // 为透明)。因此我们有**完美**的上边框! + // 见 https://docs.microsoft.com/en-us/windows/win32/dwm/customframe#extending-the-client-frame + // + // 有的软件自己绘制了假的上边框,如 Chromium 系、WinUI 3 等,但窗口失去焦点时边框是半透明的,无法 + // 完美模拟。 + // + // 我们选择扩展到标题栏高度,这是最好的选择。一个自然的想法是,既然上边框只有一个像素高,我们扩展一 + // 个像素即可,可惜因为 DWM 的 bug,这会使窗口失去焦点时上边框变为透明。那么能否传一个负值,让边框 + // 扩展到整个客户区?这大部分情况下可以工作,有一个小 bug:不显示边框颜色的设置下深色模式的边框会变 + // 为纯黑而不是半透明。 + RECT frame{}; + AdjustWindowRectExForDpi(&frame, GetWindowStyle(_hWnd), FALSE, 0, _currentDpi); + margins.cyTopHeight = -frame.top; + } + DwmExtendFrameIntoClientArea(_hWnd, &margins); + } + winrt::event> _destroyedEvent; HWND _hwndXamlIsland = NULL; From 40a5e1edd6826b92dcacb9d7ad25250de8476e8b Mon Sep 17 00:00:00 2001 From: Xu <34770031+Blinue@users.noreply.github.com> Date: Fri, 29 Dec 2023 18:42:44 +0800 Subject: [PATCH 091/155] =?UTF-8?q?=E4=BC=98=E5=8C=96=E5=8F=A0=E5=8A=A0?= =?UTF-8?q?=E5=B1=82=E6=B8=B2=E6=9F=93=E6=80=A7=E8=83=BD=20(#790)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * perf: 提前编译 ImGui 后端使用的着色器 * chore: 修复编译和格式优化 * chore: 更新依赖 * refactor: 删除 DeviceResources::GetRenderTargetView * feat: 添加 BackendDescriptorStore * refactor: 重构 FrameSourceBase * refactor: 重构 ImGuiBackend * feat: 叠加层支持渲染多次 鼠标点击时 ImGui 需要渲染多次才能更新状态 * fix: 修复退出缩放时关闭叠加层可能导致崩溃的问题 * refactor: 指针改为引用 --- src/Magpie.App/Magpie.App.vcxproj | 4 +- src/Magpie.App/conanfile.txt | 2 +- src/Magpie.App/packages.config | 4 +- src/Magpie.Core/BackendDescriptorStore.cpp | 66 +++ src/Magpie.Core/BackendDescriptorStore.h | 33 ++ src/Magpie.Core/CursorDrawer.cpp | 281 ++++++------ src/Magpie.Core/CursorDrawer.h | 3 +- src/Magpie.Core/DeviceResources.cpp | 78 ---- src/Magpie.Core/DeviceResources.h | 15 - src/Magpie.Core/DirectXHelper.cpp | 25 +- src/Magpie.Core/EffectDrawer.cpp | 6 +- src/Magpie.Core/EffectDrawer.h | 2 + src/Magpie.Core/FrameSourceBase.cpp | 133 +++--- src/Magpie.Core/FrameSourceBase.h | 9 +- src/Magpie.Core/ImGuiBackend.cpp | 407 +++++++----------- src/Magpie.Core/ImGuiBackend.h | 11 +- src/Magpie.Core/ImGuiImpl.cpp | 63 ++- src/Magpie.Core/ImGuiImpl.h | 10 +- src/Magpie.Core/Magpie.Core.vcxproj | 10 +- src/Magpie.Core/Magpie.Core.vcxproj.filters | 11 +- src/Magpie.Core/OverlayDrawer.cpp | 83 ++-- src/Magpie.Core/OverlayDrawer.h | 4 +- src/Magpie.Core/Renderer.cpp | 44 +- src/Magpie.Core/Renderer.h | 5 +- src/Magpie.Core/ScalingRuntime.cpp | 49 ++- src/Magpie.Core/ScalingRuntime.h | 11 +- src/Magpie.Core/TextureLoader.cpp | 100 +---- src/Magpie.Core/shaders/DuplicateFrameCS.hlsl | 1 - src/Magpie.Core/shaders/ImGuiImplPS.hlsl | 6 + src/Magpie.Core/shaders/ImGuiImplVS.hlsl | 16 + src/Magpie/Magpie.vcxproj | 6 +- src/Magpie/packages.config | 4 +- 32 files changed, 725 insertions(+), 777 deletions(-) create mode 100644 src/Magpie.Core/BackendDescriptorStore.cpp create mode 100644 src/Magpie.Core/BackendDescriptorStore.h create mode 100644 src/Magpie.Core/shaders/ImGuiImplPS.hlsl create mode 100644 src/Magpie.Core/shaders/ImGuiImplVS.hlsl diff --git a/src/Magpie.App/Magpie.App.vcxproj b/src/Magpie.App/Magpie.App.vcxproj index 495087cc9..5805865bb 100644 --- a/src/Magpie.App/Magpie.App.vcxproj +++ b/src/Magpie.App/Magpie.App.vcxproj @@ -613,8 +613,8 @@ - + @@ -622,8 +622,8 @@ - + \ No newline at end of file diff --git a/src/Magpie.App/conanfile.txt b/src/Magpie.App/conanfile.txt index 56dccf36c..35ab241f9 100644 --- a/src/Magpie.App/conanfile.txt +++ b/src/Magpie.App/conanfile.txt @@ -3,7 +3,7 @@ fmt/10.1.1 spdlog/1.12.0 parallel-hashmap/1.37 rapidjson/cci.20230929 -kuba-zip/0.2.6 +kuba-zip/0.3.0 muparser/2.3.4 yas/7.1.0 imgui/1.90 diff --git a/src/Magpie.App/packages.config b/src/Magpie.App/packages.config index 849ecffa4..119239d90 100644 --- a/src/Magpie.App/packages.config +++ b/src/Magpie.App/packages.config @@ -1,6 +1,6 @@  - + - + \ No newline at end of file diff --git a/src/Magpie.Core/BackendDescriptorStore.cpp b/src/Magpie.Core/BackendDescriptorStore.cpp new file mode 100644 index 000000000..e0cdea689 --- /dev/null +++ b/src/Magpie.Core/BackendDescriptorStore.cpp @@ -0,0 +1,66 @@ +#include "pch.h" +#include "BackendDescriptorStore.h" +#include "Logger.h" + +namespace Magpie::Core { + +ID3D11ShaderResourceView* BackendDescriptorStore::GetShaderResourceView(ID3D11Texture2D* texture) noexcept { + if (auto it = _srvMap.find(texture); it != _srvMap.end()) { + return it->second.get(); + } + + winrt::com_ptr srv; + HRESULT hr = _d3dDevice->CreateShaderResourceView(texture, nullptr, srv.put()); + if (FAILED(hr)) { + Logger::Get().ComError("CreateShaderResourceView 失败", hr); + return nullptr; + } + + return _srvMap.emplace(texture, std::move(srv)).first->second.get(); +} + +ID3D11UnorderedAccessView* BackendDescriptorStore::GetUnorderedAccessView(ID3D11Texture2D* texture) noexcept { + if (auto it = _uavMap.find(texture); it != _uavMap.end()) { + return it->second.get(); + } + + winrt::com_ptr uav; + + D3D11_UNORDERED_ACCESS_VIEW_DESC desc{ + .ViewDimension = D3D11_UAV_DIMENSION_TEXTURE2D + }; + + HRESULT hr = _d3dDevice->CreateUnorderedAccessView(texture, &desc, uav.put()); + if (FAILED(hr)) { + Logger::Get().ComError("CreateUnorderedAccessView 失败", hr); + return nullptr; + } + + return _uavMap.emplace(texture, std::move(uav)).first->second.get(); +} + +ID3D11UnorderedAccessView* BackendDescriptorStore::GetUnorderedAccessView(ID3D11Buffer* buffer, uint32_t numElements, DXGI_FORMAT format) noexcept { + if (auto it = _uavMap.find(buffer); it != _uavMap.end()) { + return it->second.get(); + } + + winrt::com_ptr uav; + + D3D11_UNORDERED_ACCESS_VIEW_DESC desc{ + .Format = format, + .ViewDimension = D3D11_UAV_DIMENSION_BUFFER, + .Buffer{ + .NumElements = numElements + } + }; + + HRESULT hr = _d3dDevice->CreateUnorderedAccessView(buffer, &desc, uav.put()); + if (FAILED(hr)) { + Logger::Get().ComError("CreateUnorderedAccessView 失败", hr); + return nullptr; + } + + return _uavMap.emplace(buffer, std::move(uav)).first->second.get(); +} + +} diff --git a/src/Magpie.Core/BackendDescriptorStore.h b/src/Magpie.Core/BackendDescriptorStore.h new file mode 100644 index 000000000..cf2263da2 --- /dev/null +++ b/src/Magpie.Core/BackendDescriptorStore.h @@ -0,0 +1,33 @@ +#pragma once +#include + +namespace Magpie::Core { + +class BackendDescriptorStore { +public: + BackendDescriptorStore() = default; + BackendDescriptorStore(const BackendDescriptorStore&) = delete; + BackendDescriptorStore(BackendDescriptorStore&&) = default; + + void Initialize(ID3D11Device5* d3dDevice) noexcept { + _d3dDevice = d3dDevice; + } + + ID3D11ShaderResourceView* GetShaderResourceView(ID3D11Texture2D* texture) noexcept; + + ID3D11UnorderedAccessView* GetUnorderedAccessView(ID3D11Texture2D* texture) noexcept; + + ID3D11UnorderedAccessView* GetUnorderedAccessView( + ID3D11Buffer* buffer, + uint32_t numElements, + DXGI_FORMAT format = DXGI_FORMAT_UNKNOWN + ) noexcept; + +private: + ID3D11Device5* _d3dDevice = nullptr; + + phmap::flat_hash_map> _srvMap; + phmap::flat_hash_map> _uavMap; +}; + +} diff --git a/src/Magpie.Core/CursorDrawer.cpp b/src/Magpie.Core/CursorDrawer.cpp index 2a366384a..b00108934 100644 --- a/src/Magpie.Core/CursorDrawer.cpp +++ b/src/Magpie.Core/CursorDrawer.cpp @@ -28,23 +28,22 @@ struct VertexPositionTexture { VertexPositionTexture(VertexPositionTexture&&) = default; VertexPositionTexture& operator=(VertexPositionTexture&&) = default; - VertexPositionTexture(XMFLOAT3 const& iposition, XMFLOAT2 const& itextureCoordinate) noexcept + VertexPositionTexture(XMFLOAT2 const& iposition, XMFLOAT2 const& itextureCoordinate) noexcept : position(iposition), textureCoordinate(itextureCoordinate) { } VertexPositionTexture(FXMVECTOR iposition, FXMVECTOR itextureCoordinate) noexcept { - XMStoreFloat3(&this->position, iposition); + XMStoreFloat2(&this->position, iposition); XMStoreFloat2(&this->textureCoordinate, itextureCoordinate); } - XMFLOAT3 position; + XMFLOAT2 position; XMFLOAT2 textureCoordinate; - static constexpr unsigned int InputElementCount = 2; - static constexpr D3D11_INPUT_ELEMENT_DESC InputElements[InputElementCount] = + static constexpr D3D11_INPUT_ELEMENT_DESC InputElements[] = { - { "SV_Position", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 }, - { "TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 }, + { "SV_POSITION", 0, DXGI_FORMAT_R32G32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 }, + { "TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 }, }; }; @@ -73,7 +72,7 @@ bool CursorDrawer::Initialize(DeviceResources& deviceResources, ID3D11Texture2D* hr = d3dDevice->CreateInputLayout( VertexPositionTexture::InputElements, - VertexPositionTexture::InputElementCount, + (UINT)std::size(VertexPositionTexture::InputElements), SimpleVS, std::size(SimpleVS), _simpleIL.put() @@ -144,6 +143,13 @@ void CursorDrawer::Draw() noexcept { // 配置顶点缓冲区 { + const VertexPositionTexture data[] = { + { XMFLOAT2(left, top), XMFLOAT2(0.0f, 0.0f) }, + { XMFLOAT2(right, top), XMFLOAT2(1.0f, 0.0f) }, + { XMFLOAT2(left, bottom), XMFLOAT2(0.0f, 1.0f) }, + { XMFLOAT2(right, bottom), XMFLOAT2(1.0f, 1.0f) } + }; + D3D11_MAPPED_SUBRESOURCE ms; HRESULT hr = d3dDC->Map(_vtxBuffer.get(), 0, D3D11_MAP_WRITE_DISCARD, 0, &ms); if (FAILED(hr)) { @@ -151,12 +157,7 @@ void CursorDrawer::Draw() noexcept { return; } - VertexPositionTexture* data = (VertexPositionTexture*)ms.pData; - data[0] = { XMFLOAT3(left, top, 0.5f), XMFLOAT2(0.0f, 0.0f) }; - data[1] = { XMFLOAT3(right, top, 0.5f), XMFLOAT2(1.0f, 0.0f) }; - data[2] = { XMFLOAT3(left, bottom, 0.5f), XMFLOAT2(0.0f, 1.0f) }; - data[3] = { XMFLOAT3(right, bottom, 0.5f), XMFLOAT2(1.0f, 1.0f) }; - + std::memcpy(ms.pData, data, sizeof(data)); d3dDC->Unmap(_vtxBuffer.get(), 0); ID3D11Buffer* vtxBuffer = _vtxBuffer.get(); @@ -194,8 +195,8 @@ void CursorDrawer::Draw() noexcept { d3dDC->PSSetShader(_simplePS.get(), nullptr, 0); d3dDC->PSSetConstantBuffers(0, 0, nullptr); - ID3D11ShaderResourceView* cursorSRV = _deviceResources->GetShaderResourceView(ci->texture.get()); - d3dDC->PSSetShaderResources(0, 1, &cursorSRV); + ID3D11ShaderResourceView* cursorSrv = ci->textureSrv.get(); + d3dDC->PSSetShaderResources(0, 1, &cursorSrv); ID3D11SamplerState* cursorSampler = _deviceResources->GetSampler( interpolationMode == CursorInterpolationMode::NearestNeighbor ? D3D11_FILTER_MIN_MAG_MIP_POINT @@ -207,17 +208,32 @@ void CursorDrawer::Draw() noexcept { _SetPremultipliedAlphaBlend(); } else { if (_tempCursorTextureSize != cursorSize) { + _tempCursorTexture = nullptr; + _tempCursorTextureRtv = nullptr; + + ID3D11Device* d3dDevice = _deviceResources->GetD3DDevice(); + // 创建临时纹理,如果光标尺寸变了则重新创建 _tempCursorTexture = DirectXHelper::CreateTexture2D( - _deviceResources->GetD3DDevice(), + d3dDevice, DXGI_FORMAT_R8G8B8A8_UNORM, cursorSize.cx, cursorSize.cy, D3D11_BIND_SHADER_RESOURCE ); if (!_tempCursorTexture) { + Logger::Get().Error("创建光标纹理失败"); return; } + + HRESULT hr = d3dDevice->CreateShaderResourceView( + _tempCursorTexture.get(), nullptr, _tempCursorTextureRtv.put()); + if (FAILED(hr)) { + Logger::Get().ComError("CreateShaderResourceView 失败", hr); + _tempCursorTexture = nullptr; + return; + } + _tempCursorTextureSize = cursorSize; } @@ -264,10 +280,7 @@ void CursorDrawer::Draw() noexcept { d3dDC->PSSetConstantBuffers(0, 0, nullptr); - ID3D11ShaderResourceView* srvs[2]{ - _deviceResources->GetShaderResourceView(_tempCursorTexture.get()), - _deviceResources->GetShaderResourceView(ci->texture.get()) - }; + ID3D11ShaderResourceView* srvs[2]{ _tempCursorTextureRtv.get(), ci->textureSrv.get() }; d3dDC->PSSetShaderResources(0, 2, srvs); ID3D11SamplerState* samplers[2]; @@ -286,63 +299,129 @@ void CursorDrawer::Draw() noexcept { } const CursorDrawer::_CursorInfo* CursorDrawer::_ResolveCursor(HCURSOR hCursor) noexcept { - auto it = _cursorInfos.find(hCursor); - if (it != _cursorInfos.end()) { + if (auto it = _cursorInfos.find(hCursor); it != _cursorInfos.end()) { return &it->second; } - ICONINFO ii{}; - if (!GetIconInfo(hCursor, &ii)) { + ICONINFO iconInfo{}; + if (!GetIconInfo(hCursor, &iconInfo)) { Logger::Get().Win32Error("GetIconInfo 失败"); return nullptr; } - Utils::ScopeExit se([&ii]() { - if (ii.hbmColor) { - DeleteBitmap(ii.hbmColor); + Utils::ScopeExit se([&iconInfo]() { + if (iconInfo.hbmColor) { + DeleteBitmap(iconInfo.hbmColor); } - DeleteBitmap(ii.hbmMask); + DeleteBitmap(iconInfo.hbmMask); }); BITMAP bmp{}; - if (!GetObject(ii.hbmMask, sizeof(bmp), &bmp)) { + if (!GetObject(iconInfo.hbmMask, sizeof(bmp), &bmp)) { Logger::Get().Win32Error("GetObject 失败"); return nullptr; } - _CursorInfo& ci = _cursorInfos[hCursor]; + // 获取位图数据 + BITMAPINFO bi{ + .bmiHeader{ + .biSize = sizeof(BITMAPINFOHEADER), + .biWidth = bmp.bmWidth, + .biHeight = -bmp.bmHeight, + .biPlanes = 1, + .biBitCount = 32, + .biCompression = BI_RGB, + .biSizeImage = DWORD(bmp.bmWidth * bmp.bmHeight * 4) + } + }; + + std::unique_ptr pixels(std::make_unique(bi.bmiHeader.biSizeImage)); + HDC hdcScreen = GetDC(NULL); + if (GetDIBits(hdcScreen, iconInfo.hbmColor ? iconInfo.hbmColor : iconInfo.hbmMask, + 0, bmp.bmHeight, pixels.get(), &bi, DIB_RGB_COLORS) != bmp.bmHeight + ) { + Logger::Get().Win32Error("GetDIBits 失败"); + ReleaseDC(NULL, hdcScreen); + return nullptr; + } + + _CursorInfo cursorInfo{ + .hotSpot = { (LONG)iconInfo.xHotspot, (LONG)iconInfo.yHotspot }, + // 单色光标的 hbmMask 高度为实际高度的两倍 + .size = { bmp.bmWidth, iconInfo.hbmColor ? bmp.bmHeight : bmp.bmHeight / 2 } + }; + winrt::com_ptr cursorTexture; + + ID3D11Device* d3dDevice = _deviceResources->GetD3DDevice(); - ci.hotSpot = { (LONG)ii.xHotspot, (LONG)ii.yHotspot }; - // 单色光标的 hbmMask 高度为实际高度的两倍 - ci.size = { bmp.bmWidth, ii.hbmColor ? bmp.bmHeight : bmp.bmHeight / 2 }; + if (iconInfo.hbmColor) { + // 彩色光标或彩色掩码光标 - BITMAPINFO bi{}; - bi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); - bi.bmiHeader.biWidth = bmp.bmWidth; - bi.bmiHeader.biHeight = -bmp.bmHeight; - bi.bmiHeader.biPlanes = 1; - bi.bmiHeader.biCompression = BI_RGB; - bi.bmiHeader.biBitCount = 32; - bi.bmiHeader.biSizeImage = bmp.bmWidth * bmp.bmHeight * 4; + // 若颜色掩码有 A 通道,则是彩色光标,否则是彩色掩码光标 + bool hasAlpha = false; + for (DWORD i = 3; i < bi.bmiHeader.biSizeImage; i += 4) { + if (pixels[i] != 0) { + hasAlpha = true; + break; + } + } - if (ii.hbmColor == NULL) { - // 单色光标 - ci.type = _CursorType::Monochrome; - - std::unique_ptr pixels(new BYTE[bi.bmiHeader.biSizeImage]); - HDC hdc = GetDC(NULL); - if (GetDIBits(hdc, ii.hbmMask, 0, bmp.bmHeight, pixels.get(), &bi, DIB_RGB_COLORS) != bmp.bmHeight) { - Logger::Get().Win32Error("GetDIBits 失败"); - ReleaseDC(NULL, hdc); - return nullptr; + if (hasAlpha) { + // 彩色光标 + cursorInfo.type = _CursorType::Color; + + for (size_t i = 0; i < bi.bmiHeader.biSizeImage; i += 4) { + // 预乘 Alpha 通道 + double alpha = pixels[i + 3] / 255.0f; + + uint8_t b = (uint8_t)std::lround(pixels[i] * alpha); + pixels[i] = (uint8_t)std::lround(pixels[i + 2] * alpha); + pixels[i + 1] = (uint8_t)std::lround(pixels[i + 1] * alpha); + pixels[i + 2] = b; + pixels[i + 3] = 255 - pixels[i + 3]; + } + } else { + // 彩色掩码光标 + cursorInfo.type = _CursorType::MaskedColor; + + std::unique_ptr maskPixels(std::make_unique(bi.bmiHeader.biSizeImage)); + if (GetDIBits(hdcScreen, iconInfo.hbmMask, 0, bmp.bmHeight, maskPixels.get(), &bi, DIB_RGB_COLORS) != bmp.bmHeight) { + Logger::Get().Win32Error("GetDIBits 失败"); + ReleaseDC(NULL, hdcScreen); + return nullptr; + } + + // 将 XOR 掩码复制到透明通道中 + for (size_t i = 0; i < bi.bmiHeader.biSizeImage; i += 4) { + std::swap(pixels[i], pixels[i + 2]); + pixels[i + 3] = maskPixels[i]; + } } - ReleaseDC(NULL, hdc); + + const D3D11_SUBRESOURCE_DATA initData{ + .pSysMem = pixels.get(), + .SysMemPitch = UINT(bmp.bmWidth * 4) + }; + + cursorTexture = DirectXHelper::CreateTexture2D( + d3dDevice, + DXGI_FORMAT_R8G8B8A8_UNORM, + bmp.bmWidth, + bmp.bmHeight, + D3D11_BIND_SHADER_RESOURCE, + D3D11_USAGE_IMMUTABLE, + 0, + &initData + ); + } else { + // 单色光标 + cursorInfo.type = _CursorType::Monochrome; // 红色通道是 AND 掩码,绿色通道是 XOR 掩码 // 构造 DXGI_FORMAT_R8G8_UNORM 的初始数据 const int halfSize = bi.bmiHeader.biSizeImage / 8; - BYTE* upPtr = &pixels[0]; - BYTE* downPtr = &pixels[(size_t)halfSize * 4]; + uint8_t* upPtr = &pixels[0]; + uint8_t* downPtr = &pixels[(size_t)halfSize * 4]; uint8_t* targetPtr = &pixels[0]; for (int i = 0; i < halfSize; ++i) { *targetPtr++ = *upPtr; @@ -352,12 +431,13 @@ const CursorDrawer::_CursorInfo* CursorDrawer::_ResolveCursor(HCURSOR hCursor) n downPtr += 4; } - D3D11_SUBRESOURCE_DATA initData{}; - initData.pSysMem = pixels.get(); - initData.SysMemPitch = bmp.bmWidth * 2; - - ci.texture = DirectXHelper::CreateTexture2D( - _deviceResources->GetD3DDevice(), + const D3D11_SUBRESOURCE_DATA initData{ + .pSysMem = pixels.get(), + .SysMemPitch = UINT(bmp.bmWidth * 2) + }; + + cursorTexture = DirectXHelper::CreateTexture2D( + d3dDevice, DXGI_FORMAT_R8G8_UNORM, bmp.bmWidth, bmp.bmHeight / 2, @@ -366,86 +446,21 @@ const CursorDrawer::_CursorInfo* CursorDrawer::_ResolveCursor(HCURSOR hCursor) n 0, &initData ); - if (!ci.texture) { - Logger::Get().Error("创建纹理失败"); - return nullptr; - } - - return &ci; } - std::unique_ptr pixels(new BYTE[bi.bmiHeader.biSizeImage]); - HDC hdc = GetDC(NULL); - if (GetDIBits(hdc, ii.hbmColor, 0, bmp.bmHeight, pixels.get(), &bi, DIB_RGB_COLORS) != bmp.bmHeight) { - Logger::Get().Win32Error("GetDIBits 失败"); - ReleaseDC(NULL, hdc); - return nullptr; - } - ReleaseDC(NULL, hdc); - - // 若颜色掩码有 A 通道,则是彩色光标,否则是彩色掩码光标 - bool hasAlpha = false; - for (uint32_t i = 3; i < bi.bmiHeader.biSizeImage; i += 4) { - if (pixels[i] != 0) { - hasAlpha = true; - break; - } - } - - if (hasAlpha) { - // 彩色光标 - ci.type = _CursorType::Color; + ReleaseDC(NULL, hdcScreen); - for (size_t i = 0; i < bi.bmiHeader.biSizeImage; i += 4) { - // 预乘 Alpha 通道 - double alpha = pixels[i + 3] / 255.0f; - - BYTE b = (BYTE)std::lround(pixels[i] * alpha); - pixels[i] = (BYTE)std::lround(pixels[i + 2] * alpha); - pixels[i + 1] = (BYTE)std::lround(pixels[i + 1] * alpha); - pixels[i + 2] = b; - pixels[i + 3] = 255 - pixels[i + 3]; - } - } else { - // 彩色掩码光标 - ci.type = _CursorType::MaskedColor; - - std::unique_ptr maskPixels(new BYTE[bi.bmiHeader.biSizeImage]); - hdc = GetDC(NULL); - if (GetDIBits(hdc, ii.hbmMask, 0, bmp.bmHeight, maskPixels.get(), &bi, DIB_RGB_COLORS) != bmp.bmHeight) { - Logger::Get().Win32Error("GetDIBits 失败"); - ReleaseDC(NULL, hdc); - return nullptr; - } - ReleaseDC(NULL, hdc); - - // 将 XOR 掩码复制到透明通道中 - for (size_t i = 0; i < bi.bmiHeader.biSizeImage; i += 4) { - std::swap(pixels[i], pixels[i + 2]); - pixels[i + 3] = maskPixels[i]; - } + if (!cursorTexture) { + Logger::Get().Error("创建光标纹理失败"); + return nullptr; } - D3D11_SUBRESOURCE_DATA initData{}; - initData.pSysMem = &pixels[0]; - initData.SysMemPitch = bmp.bmWidth * 4; - - ci.texture = DirectXHelper::CreateTexture2D( - _deviceResources->GetD3DDevice(), - DXGI_FORMAT_R8G8B8A8_UNORM, - bmp.bmWidth, - bmp.bmHeight, - D3D11_BIND_SHADER_RESOURCE, - D3D11_USAGE_IMMUTABLE, - 0, - &initData - ); - if (!ci.texture) { - Logger::Get().Error("创建纹理失败"); + HRESULT hr = d3dDevice->CreateShaderResourceView(cursorTexture.get(), nullptr, cursorInfo.textureSrv.put()); + if (FAILED(hr)) { return nullptr; } - return &ci; + return &_cursorInfos.emplace(hCursor, std::move(cursorInfo)).first->second; } bool CursorDrawer::_SetPremultipliedAlphaBlend() noexcept { diff --git a/src/Magpie.Core/CursorDrawer.h b/src/Magpie.Core/CursorDrawer.h index 3c961fec2..4a5cee7e7 100644 --- a/src/Magpie.Core/CursorDrawer.h +++ b/src/Magpie.Core/CursorDrawer.h @@ -36,7 +36,7 @@ class CursorDrawer { struct _CursorInfo { POINT hotSpot{}; SIZE size{}; - winrt::com_ptr texture = nullptr; + winrt::com_ptr textureSrv = nullptr; _CursorType type = _CursorType::Color; }; @@ -61,6 +61,7 @@ class CursorDrawer { // 用于渲染彩色掩码光标和单色光标的临时纹理 winrt::com_ptr _tempCursorTexture; + winrt::com_ptr _tempCursorTextureRtv; SIZE _tempCursorTextureSize{}; }; diff --git a/src/Magpie.Core/DeviceResources.cpp b/src/Magpie.Core/DeviceResources.cpp index 6dda993ad..4cdf5a416 100644 --- a/src/Magpie.Core/DeviceResources.cpp +++ b/src/Magpie.Core/DeviceResources.cpp @@ -65,84 +65,6 @@ ID3D11SamplerState* DeviceResources::GetSampler(D3D11_FILTER filterMode, D3D11_T return _samMap.emplace(key, std::move(sam)).first->second.get(); } -ID3D11RenderTargetView* DeviceResources::GetRenderTargetView(ID3D11Texture2D* texture) noexcept { - auto it = _rtvMap.find(texture); - if (it != _rtvMap.end()) { - return it->second.get(); - } - - winrt::com_ptr rtv; - HRESULT hr = _d3dDevice->CreateRenderTargetView(texture, nullptr, rtv.put()); - if (FAILED(hr)) { - Logger::Get().ComError("CreateRenderTargetView 失败", hr); - return nullptr; - } - - return _rtvMap.emplace(texture, std::move(rtv)).first->second.get(); -} - -ID3D11ShaderResourceView* DeviceResources::GetShaderResourceView(ID3D11Texture2D* texture) noexcept { - auto it = _srvMap.find(texture); - if (it != _srvMap.end()) { - return it->second.get(); - } - - winrt::com_ptr srv; - HRESULT hr = _d3dDevice->CreateShaderResourceView(texture, nullptr, srv.put()); - if (FAILED(hr)) { - Logger::Get().ComError("CreateShaderResourceView 失败", hr); - return nullptr; - } - - return _srvMap.emplace(texture, std::move(srv)).first->second.get(); -} - -ID3D11UnorderedAccessView* DeviceResources::GetUnorderedAccessView(ID3D11Texture2D* texture) noexcept { - auto it = _uavMap.find(texture); - if (it != _uavMap.end()) { - return it->second.get(); - } - - winrt::com_ptr uav; - - D3D11_UNORDERED_ACCESS_VIEW_DESC desc{}; - desc.ViewDimension = D3D11_UAV_DIMENSION_TEXTURE2D; - - HRESULT hr = _d3dDevice->CreateUnorderedAccessView(texture, &desc, uav.put()); - if (FAILED(hr)) { - Logger::Get().ComError("CreateUnorderedAccessView 失败", hr); - return nullptr; - } - - return _uavMap.emplace(texture, std::move(uav)).first->second.get(); -} - -ID3D11UnorderedAccessView* DeviceResources::GetUnorderedAccessView( - ID3D11Buffer* buffer, - uint32_t numElements, - DXGI_FORMAT format -) noexcept { - auto it = _uavMap.find(buffer); - if (it != _uavMap.end()) { - return it->second.get(); - } - - winrt::com_ptr uav; - - D3D11_UNORDERED_ACCESS_VIEW_DESC desc{}; - desc.Format = format; - desc.ViewDimension = D3D11_UAV_DIMENSION_BUFFER; - desc.Buffer.NumElements = numElements; - - HRESULT hr = _d3dDevice->CreateUnorderedAccessView(buffer, &desc, uav.put()); - if (FAILED(hr)) { - Logger::Get().ComError("CreateUnorderedAccessView 失败", hr); - return nullptr; - } - - return _uavMap.emplace(buffer, std::move(uav)).first->second.get(); -} - static void LogAdapter(const DXGI_ADAPTER_DESC1& adapterDesc) noexcept { Logger::Get().Info(fmt::format("当前图形适配器:\n\tVendorId:{:#x}\n\tDeviceId:{:#x}\n\t描述:{}", adapterDesc.VendorId, adapterDesc.DeviceId, StrUtils::UTF16ToUTF8(adapterDesc.Description))); diff --git a/src/Magpie.Core/DeviceResources.h b/src/Magpie.Core/DeviceResources.h index 01b3953f0..1141be333 100644 --- a/src/Magpie.Core/DeviceResources.h +++ b/src/Magpie.Core/DeviceResources.h @@ -22,17 +22,6 @@ class DeviceResources { ID3D11SamplerState* GetSampler(D3D11_FILTER filterMode, D3D11_TEXTURE_ADDRESS_MODE addressMode) noexcept; - ID3D11RenderTargetView* GetRenderTargetView(ID3D11Texture2D* texture) noexcept; - - ID3D11ShaderResourceView* GetShaderResourceView(ID3D11Texture2D* texture) noexcept; - - ID3D11UnorderedAccessView* GetUnorderedAccessView(ID3D11Texture2D* texture) noexcept; - ID3D11UnorderedAccessView* GetUnorderedAccessView( - ID3D11Buffer* buffer, - uint32_t numElements, - DXGI_FORMAT format = DXGI_FORMAT_UNKNOWN - ) noexcept; - private: bool _ObtainAdapterAndDevice(int adapterIdx) noexcept; bool _TryCreateD3DDevice(const winrt::com_ptr& adapter) noexcept; @@ -42,10 +31,6 @@ class DeviceResources { winrt::com_ptr _d3dDevice; winrt::com_ptr _d3dDC; - phmap::flat_hash_map> _rtvMap; - phmap::flat_hash_map> _srvMap; - phmap::flat_hash_map> _uavMap; - phmap::flat_hash_map< std::pair, winrt::com_ptr diff --git a/src/Magpie.Core/DirectXHelper.cpp b/src/Magpie.Core/DirectXHelper.cpp index eb182acc2..d406b97f4 100644 --- a/src/Magpie.Core/DirectXHelper.cpp +++ b/src/Magpie.Core/DirectXHelper.cpp @@ -82,17 +82,20 @@ winrt::com_ptr DirectXHelper::CreateTexture2D( UINT miscFlags, const D3D11_SUBRESOURCE_DATA* pInitialData ) noexcept { - D3D11_TEXTURE2D_DESC desc{}; - desc.Format = format; - desc.Width = width; - desc.Height = height; - desc.MipLevels = 1; - desc.ArraySize = 1; - desc.SampleDesc.Count = 1; - desc.SampleDesc.Quality = 0; - desc.BindFlags = bindFlags; - desc.Usage = usage; - desc.MiscFlags = miscFlags; + const D3D11_TEXTURE2D_DESC desc{ + .Width = width, + .Height = height, + .MipLevels = 1, + .ArraySize = 1, + .Format = format, + .SampleDesc{ + .Count = 1, + .Quality = 0 + }, + .Usage = usage, + .BindFlags = bindFlags, + .MiscFlags = miscFlags + }; winrt::com_ptr result; HRESULT hr = d3dDevice->CreateTexture2D(&desc, pInitialData, result.put()); diff --git a/src/Magpie.Core/EffectDrawer.cpp b/src/Magpie.Core/EffectDrawer.cpp index 34acbeb86..2709ec78d 100644 --- a/src/Magpie.Core/EffectDrawer.cpp +++ b/src/Magpie.Core/EffectDrawer.cpp @@ -9,6 +9,7 @@ #include "EffectHelper.h" #include "DirectXHelper.h" #include "ScalingWindow.h" +#include "BackendDescriptorStore.h" #pragma push_macro("_UNICODE") // Conan 的 muparser 不含 UNICODE 支持 @@ -85,6 +86,7 @@ bool EffectDrawer::Initialize( const EffectDesc& desc, const EffectOption& option, DeviceResources& deviceResources, + BackendDescriptorStore& descriptorStore, ID3D11Texture2D** inOutTexture ) noexcept { _d3dDC = deviceResources.GetD3DDC(); @@ -216,7 +218,7 @@ bool EffectDrawer::Initialize( _srvs[i].resize(passDesc.inputs.size()); for (UINT j = 0; j < passDesc.inputs.size(); ++j) { - auto srv = _srvs[i][j] = deviceResources.GetShaderResourceView(_textures[passDesc.inputs[j]].get()); + auto srv = _srvs[i][j] = descriptorStore.GetShaderResourceView(_textures[passDesc.inputs[j]].get()); if (!srv) { Logger::Get().Error("GetShaderResourceView 失败"); return false; @@ -225,7 +227,7 @@ bool EffectDrawer::Initialize( _uavs[i].resize(passDesc.outputs.size() * 2); for (UINT j = 0; j < passDesc.outputs.size(); ++j) { - auto uav = _uavs[i][j] = deviceResources.GetUnorderedAccessView(_textures[passDesc.outputs[j]].get()); + auto uav = _uavs[i][j] = descriptorStore.GetUnorderedAccessView(_textures[passDesc.outputs[j]].get()); if (!uav) { Logger::Get().Error("GetUnorderedAccessView 失败"); return false; diff --git a/src/Magpie.Core/EffectDrawer.h b/src/Magpie.Core/EffectDrawer.h index 45479c13b..d69043d27 100644 --- a/src/Magpie.Core/EffectDrawer.h +++ b/src/Magpie.Core/EffectDrawer.h @@ -7,6 +7,7 @@ namespace Magpie::Core { struct EffectOption; class DeviceResources; +class BackendDescriptorStore; class EffectDrawer { public: @@ -18,6 +19,7 @@ class EffectDrawer { const EffectDesc& desc, const EffectOption& option, DeviceResources& deviceResources, + BackendDescriptorStore& descriptorStore, ID3D11Texture2D** inOutTexture ) noexcept; diff --git a/src/Magpie.Core/FrameSourceBase.cpp b/src/Magpie.Core/FrameSourceBase.cpp index 13313c072..0b4cc65b0 100644 --- a/src/Magpie.Core/FrameSourceBase.cpp +++ b/src/Magpie.Core/FrameSourceBase.cpp @@ -10,6 +10,7 @@ #include "DeviceResources.h" #include "shaders/DuplicateFrameCS.h" #include "ScalingWindow.h" +#include "BackendDescriptorStore.h" namespace Magpie::Core { @@ -59,10 +60,11 @@ FrameSourceBase::~FrameSourceBase() noexcept { } } -bool FrameSourceBase::Initialize(DeviceResources& deviceResources) noexcept { +bool FrameSourceBase::Initialize(DeviceResources& deviceResources, BackendDescriptorStore& descriptorStore) noexcept { _deviceResources = &deviceResources; + _descriptorStore = &descriptorStore; - HWND hwndSrc = ScalingWindow::Get().HwndSrc(); + const HWND hwndSrc = ScalingWindow::Get().HwndSrc(); // 禁用窗口大小调整 if (ScalingWindow::Get().Options().IsWindowResizingDisabled()) { @@ -103,6 +105,13 @@ bool FrameSourceBase::Initialize(DeviceResources& deviceResources) noexcept { return false; } + assert(_output); + _outputSrv = descriptorStore.GetShaderResourceView(_output.get()); + if (!_outputSrv) { + Logger::Get().Error("GetShaderResourceView 失败"); + return false; + } + return true; } @@ -119,53 +128,14 @@ FrameSourceBase::UpdateState FrameSourceBase::Update() noexcept { ID3D11DeviceContext4* d3dDC = _deviceResources->GetD3DDC(); if (!_prevFrame) { - ID3D11Device5* d3dDevice = _deviceResources->GetD3DDevice(); - - D3D11_TEXTURE2D_DESC td; - _output->GetDesc(&td); - - _prevFrame = DirectXHelper::CreateTexture2D( - d3dDevice, td.Format, td.Width, td.Height, D3D11_BIND_SHADER_RESOURCE); - - if (!_prevFrame) { - return UpdateState::NewFrame; - } - - D3D11_BUFFER_DESC bd{}; - bd.ByteWidth = 4; - bd.StructureByteStride = 4; - bd.Usage = D3D11_USAGE_DEFAULT; - bd.BindFlags = D3D11_BIND_UNORDERED_ACCESS; - HRESULT hr = d3dDevice->CreateBuffer(&bd, nullptr, _resultBuffer.put()); - if (FAILED(hr)) { - Logger::Get().ComError("CreateBuffer 失败", hr); - _prevFrame = nullptr; - return UpdateState::NewFrame; - } - - bd.Usage = D3D11_USAGE_STAGING; - bd.CPUAccessFlags = D3D11_CPU_ACCESS_READ; - bd.BindFlags = 0; - hr = d3dDevice->CreateBuffer(&bd, nullptr, _readBackBuffer.put()); - if (FAILED(hr)) { - Logger::Get().ComError("CreateBuffer 失败", hr); - _prevFrame = nullptr; - return UpdateState::NewFrame; - } - - hr = d3dDevice->CreateComputeShader( - DuplicateFrameCS, sizeof(DuplicateFrameCS), nullptr, _dupFrameCS.put()); - if (FAILED(hr)) { - Logger::Get().ComError("CreateComputeShader 失败", hr); + if (_InitCheckingForDuplicateFrame()) { + d3dDC->CopyResource(_prevFrame.get(), _output.get()); + } else { + Logger::Get().Error("_InitCheckingForDuplicateFrame 失败"); _prevFrame = nullptr; - return UpdateState::NewFrame; + _prevFrameSrv = nullptr; } - static constexpr std::pair BLOCK_SIZE{ 16, 16 }; - _dispatchCount.first = (td.Width + BLOCK_SIZE.first - 1) / BLOCK_SIZE.first; - _dispatchCount.second = (td.Height + BLOCK_SIZE.second - 1) / BLOCK_SIZE.second; - - d3dDC->CopyResource(_prevFrame.get(), _output.get()); return UpdateState::NewFrame; } @@ -452,26 +422,81 @@ bool FrameSourceBase::_CenterWindowIfNecessary(HWND hWnd, const RECT& rcWork) no return true; } +bool FrameSourceBase::_InitCheckingForDuplicateFrame() { + ID3D11Device5* d3dDevice = _deviceResources->GetD3DDevice(); + + D3D11_TEXTURE2D_DESC td; + _output->GetDesc(&td); + + _prevFrame = DirectXHelper::CreateTexture2D( + d3dDevice, td.Format, td.Width, td.Height, D3D11_BIND_SHADER_RESOURCE); + if (!_prevFrame) { + return false; + } + + HRESULT hr = d3dDevice->CreateShaderResourceView(_prevFrame.get(), nullptr, _prevFrameSrv.put()); + if (FAILED(hr)) { + Logger::Get().ComError("CreateShaderResourceView 失败", hr); + return false; + } + + D3D11_BUFFER_DESC bd{ + .ByteWidth = 4, + .Usage = D3D11_USAGE_DEFAULT, + .BindFlags = D3D11_BIND_UNORDERED_ACCESS, + .StructureByteStride = 4 + }; + hr = d3dDevice->CreateBuffer(&bd, nullptr, _resultBuffer.put()); + if (FAILED(hr)) { + Logger::Get().ComError("CreateBuffer 失败", hr); + return false; + } + + _resultBufferUav = _descriptorStore->GetUnorderedAccessView( + _resultBuffer.get(), 1, DXGI_FORMAT_R32_UINT); + if (!_resultBufferUav) { + Logger::Get().ComError("GetUnorderedAccessView 失败", hr); + return false; + } + + bd.Usage = D3D11_USAGE_STAGING; + bd.CPUAccessFlags = D3D11_CPU_ACCESS_READ; + bd.BindFlags = 0; + hr = d3dDevice->CreateBuffer(&bd, nullptr, _readBackBuffer.put()); + if (FAILED(hr)) { + Logger::Get().ComError("CreateBuffer 失败", hr); + return false; + } + + hr = d3dDevice->CreateComputeShader( + DuplicateFrameCS, sizeof(DuplicateFrameCS), nullptr, _dupFrameCS.put()); + if (FAILED(hr)) { + Logger::Get().ComError("CreateComputeShader 失败", hr); + return false; + } + + static constexpr std::pair BLOCK_SIZE{ 16, 16 }; + _dispatchCount.first = (td.Width + BLOCK_SIZE.first - 1) / BLOCK_SIZE.first; + _dispatchCount.second = (td.Height + BLOCK_SIZE.second - 1) / BLOCK_SIZE.second; + + return true; +} + bool FrameSourceBase::_IsDuplicateFrame() { // 检查是否和前一帧相同 ID3D11DeviceContext4* d3dDC = _deviceResources->GetD3DDC(); - ID3D11ShaderResourceView* srvs[]{ - _deviceResources->GetShaderResourceView(_output.get()), - _deviceResources->GetShaderResourceView(_prevFrame.get()) - }; + ID3D11ShaderResourceView* srvs[]{ _outputSrv, _prevFrameSrv.get() }; d3dDC->CSSetShaderResources(0, 2, srvs); ID3D11SamplerState* sam = _deviceResources->GetSampler( D3D11_FILTER_MIN_MAG_MIP_POINT, D3D11_TEXTURE_ADDRESS_CLAMP); d3dDC->CSSetSamplers(0, 1, &sam); - ID3D11UnorderedAccessView* uav = _deviceResources->GetUnorderedAccessView( - _resultBuffer.get(), 1, DXGI_FORMAT_R32_UINT); // 将缓冲区置零 static constexpr UINT ZERO[4]{}; - d3dDC->ClearUnorderedAccessViewUint(uav, ZERO); - d3dDC->CSSetUnorderedAccessViews(0, 1, &uav, nullptr); + d3dDC->ClearUnorderedAccessViewUint(_resultBufferUav, ZERO); + d3dDC->CSSetUnorderedAccessViews(0, 1, &_resultBufferUav, nullptr); d3dDC->CSSetShader(_dupFrameCS.get(), nullptr, 0); diff --git a/src/Magpie.Core/FrameSourceBase.h b/src/Magpie.Core/FrameSourceBase.h index afd9c5e3f..121161757 100644 --- a/src/Magpie.Core/FrameSourceBase.h +++ b/src/Magpie.Core/FrameSourceBase.h @@ -3,6 +3,7 @@ namespace Magpie::Core { class DeviceResources; +class BackendDescriptorStore; class FrameSourceBase { public: @@ -14,7 +15,7 @@ class FrameSourceBase { FrameSourceBase(const FrameSourceBase&) = delete; FrameSourceBase(FrameSourceBase&&) = delete; - bool Initialize(DeviceResources& deviceResources) noexcept; + bool Initialize(DeviceResources& deviceResources, BackendDescriptorStore& descriptorStore) noexcept; enum class UpdateState { NewFrame, @@ -66,9 +67,12 @@ class FrameSourceBase { RECT _srcRect{}; DeviceResources* _deviceResources = nullptr; + BackendDescriptorStore* _descriptorStore = nullptr; winrt::com_ptr _output; + ID3D11ShaderResourceView* _outputSrv; winrt::com_ptr _resultBuffer; + ID3D11UnorderedAccessView* _resultBufferUav = nullptr; winrt::com_ptr _readBackBuffer; winrt::com_ptr _dupFrameCS; std::pair _dispatchCount; @@ -77,10 +81,13 @@ class FrameSourceBase { bool _windowResizingDisabled = false; private: + bool _InitCheckingForDuplicateFrame(); + bool _IsDuplicateFrame(); // 用于检查重复帧 winrt::com_ptr _prevFrame; + winrt::com_ptr _prevFrameSrv; uint16_t _nextSkipCount; uint16_t _framesLeft; // (预测错误帧数, 总计跳过帧数) diff --git a/src/Magpie.Core/ImGuiBackend.cpp b/src/Magpie.Core/ImGuiBackend.cpp index 7fbe0bd9d..463d3493b 100644 --- a/src/Magpie.Core/ImGuiBackend.cpp +++ b/src/Magpie.Core/ImGuiBackend.cpp @@ -7,49 +7,13 @@ #include "DeviceResources.h" #include "StrUtils.h" #include "Logger.h" +#include "DirectXHelper.h" +#include "shaders/ImGuiImplVS.h" +#include "shaders/ImGuiImplPS.h" namespace Magpie::Core { -static constexpr const char* VERTEX_SHADER = R"( -cbuffer vertexBuffer : register(b0) { - float4x4 ProjectionMatrix; -}; - -struct VS_INPUT { - float2 pos : POSITION; - float4 col : COLOR0; - float2 uv : TEXCOORD0; -}; - -struct PS_INPUT { - float4 pos : SV_POSITION; - float4 col : COLOR0; - float2 uv : TEXCOORD0; -}; - -PS_INPUT main(VS_INPUT input) { - PS_INPUT output; - output.pos = mul( ProjectionMatrix, float4(input.pos.xy, 0.f, 1.f)); - output.col = input.col; - output.uv = input.uv; - return output; -})"; - -static constexpr const char* PIXEL_SHADER = R"( -struct PS_INPUT { - float4 pos : SV_POSITION; - float4 col : COLOR0; - float2 uv : TEXCOORD0; -}; - -sampler sampler0; -Texture2D texture0; - -float4 main(PS_INPUT input) : SV_Target { - return input.col * float4(1, 1, 1, texture0.Sample(sampler0, input.uv).r); -})"; - -struct VERTEX_CONSTANT_BUFFER_DX11 { +struct VERTEX_CONSTANT_BUFFER { float mvp[4][4]; }; @@ -61,29 +25,36 @@ bool ImGuiBackend::Initialize(DeviceResources* deviceResources) noexcept { // 支持 ImDrawCmd::VtxOffset io.BackendFlags |= ImGuiBackendFlags_RendererHasVtxOffset; + if (!_CreateDeviceObjects()) { + Logger::Get().Error("_CreateDeviceObjects 失败"); + return false; + } + return true; } -void ImGuiBackend::_SetupRenderState(ImDrawData* drawData) noexcept { +void ImGuiBackend::_SetupRenderState(const ImDrawData& drawData) noexcept { ID3D11DeviceContext4* d3dDC = _deviceResources->GetD3DDC(); - D3D11_VIEWPORT vp{}; - vp.Width = drawData->DisplaySize.x; - vp.Height = drawData->DisplaySize.y; - vp.MinDepth = 0.0f; - vp.MaxDepth = 1.0f; + D3D11_VIEWPORT vp{ + .Width = drawData.DisplaySize.x, + .Height = drawData.DisplaySize.y, + .MinDepth = 0.0f, + .MaxDepth = 1.0f + }; d3dDC->RSSetViewports(1, &vp); d3dDC->IASetInputLayout(_inputLayout.get()); { - unsigned int stride = sizeof(ImDrawVert); - unsigned int offset = 0; + UINT stride = sizeof(ImDrawVert); + UINT offset = 0; ID3D11Buffer* t = _vertexBuffer.get(); d3dDC->IASetVertexBuffers(0, 1, &t, &stride, &offset); } - d3dDC->IASetIndexBuffer(_indexBuffer.get(), sizeof(ImDrawIdx) == 2 ? DXGI_FORMAT_R16_UINT : DXGI_FORMAT_R32_UINT, 0); + d3dDC->IASetIndexBuffer(_indexBuffer.get(), + sizeof(ImDrawIdx) == 2 ? DXGI_FORMAT_R16_UINT : DXGI_FORMAT_R32_UINT, 0); d3dDC->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); d3dDC->VSSetShader(_vertexShader.get(), nullptr, 0); { @@ -92,48 +63,48 @@ void ImGuiBackend::_SetupRenderState(ImDrawData* drawData) noexcept { } d3dDC->PSSetShader(_pixelShader.get(), nullptr, 0); { - ID3D11SamplerState* t = _fontSampler.get(); + // 默认需要线性采样。设置 "io.Fonts->Flags |= ImFontAtlasFlags_NoBakedLines" 或 + // "style.AntiAliasedLinesUseTex = false" 来允许最近邻采样 + ID3D11SamplerState* t = _deviceResources->GetSampler( + D3D11_FILTER_MIN_MAG_MIP_LINEAR, D3D11_TEXTURE_ADDRESS_WRAP); d3dDC->PSSetSamplers(0, 1, &t); } - const float blend_factor[4]{}; - d3dDC->OMSetBlendState(_blendState.get(), blend_factor, 0xffffffff); + static constexpr float blendFactor[4]{}; + d3dDC->OMSetBlendState(_blendState.get(), blendFactor, 0xffffffff); d3dDC->RSSetState(_rasterizerState.get()); } -void ImGuiBackend::RenderDrawData(ImDrawData* drawData) noexcept { - // Avoid rendering when minimized - if (drawData->DisplaySize.x <= 0.0f || drawData->DisplaySize.y <= 0.0f) { - return; - } - +void ImGuiBackend::RenderDrawData(const ImDrawData& drawData) noexcept { ID3D11DeviceContext4* d3dDC = _deviceResources->GetD3DDC(); ID3D11Device5* d3dDevice = _deviceResources->GetD3DDevice(); - HRESULT hr; - - // Create and grow vertex/index buffers if needed - if (!_vertexBuffer || _vertexBufferSize < drawData->TotalVtxCount) { - _vertexBufferSize = drawData->TotalVtxCount + 5000; - D3D11_BUFFER_DESC desc{}; - desc.Usage = D3D11_USAGE_DYNAMIC; - desc.ByteWidth = _vertexBufferSize * sizeof(ImDrawVert); - desc.BindFlags = D3D11_BIND_VERTEX_BUFFER; - desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; - hr = d3dDevice->CreateBuffer(&desc, nullptr, _vertexBuffer.put()); + // 按需创建和增长顶点和索引缓冲区 + if (!_vertexBuffer || _vertexBufferSize < drawData.TotalVtxCount) { + _vertexBufferSize = drawData.TotalVtxCount + 5000; + + D3D11_BUFFER_DESC desc{ + .ByteWidth = _vertexBufferSize * sizeof(ImDrawVert), + .Usage = D3D11_USAGE_DYNAMIC, + .BindFlags = D3D11_BIND_VERTEX_BUFFER, + .CPUAccessFlags = D3D11_CPU_ACCESS_WRITE + }; + HRESULT hr = d3dDevice->CreateBuffer(&desc, nullptr, _vertexBuffer.put()); if (FAILED(hr)) { Logger::Get().ComError("CreateBuffer 失败", hr); return; } } - if (!_indexBuffer || _indexBufferSize < drawData->TotalIdxCount) { - _indexBufferSize = drawData->TotalIdxCount + 10000; - D3D11_BUFFER_DESC desc{}; - desc.Usage = D3D11_USAGE_DYNAMIC; - desc.ByteWidth = _indexBufferSize * sizeof(ImDrawIdx); - desc.BindFlags = D3D11_BIND_INDEX_BUFFER; - desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; - hr = d3dDevice->CreateBuffer(&desc, nullptr, _indexBuffer.put()); + if (!_indexBuffer || _indexBufferSize < drawData.TotalIdxCount) { + _indexBufferSize = drawData.TotalIdxCount + 10000; + + D3D11_BUFFER_DESC desc{ + .ByteWidth = _indexBufferSize * sizeof(ImDrawIdx), + .Usage = D3D11_USAGE_DYNAMIC, + .BindFlags = D3D11_BIND_INDEX_BUFFER, + .CPUAccessFlags = D3D11_CPU_ACCESS_WRITE + }; + HRESULT hr = d3dDevice->CreateBuffer(&desc, nullptr, _indexBuffer.put()); if (FAILED(hr)) { Logger::Get().ComError("CreateBuffer 失败", hr); return; @@ -143,15 +114,14 @@ void ImGuiBackend::RenderDrawData(ImDrawData* drawData) noexcept { // 上传顶点数据 { D3D11_MAPPED_SUBRESOURCE vtxResource; - hr = d3dDC->Map(_vertexBuffer.get(), 0, D3D11_MAP_WRITE_DISCARD, 0, &vtxResource); + HRESULT hr = d3dDC->Map(_vertexBuffer.get(), 0, D3D11_MAP_WRITE_DISCARD, 0, &vtxResource); if (FAILED(hr)) { Logger::Get().ComError("Map 失败", hr); return; } ImDrawVert* vtxDst = (ImDrawVert*)vtxResource.pData; - for (int n = 0; n < drawData->CmdListsCount; ++n) { - const ImDrawList* cmdList = drawData->CmdLists[n]; + for (const ImDrawList* cmdList : drawData.CmdLists) { std::memcpy(vtxDst, cmdList->VtxBuffer.Data, cmdList->VtxBuffer.Size * sizeof(ImDrawVert)); vtxDst += cmdList->VtxBuffer.Size; } @@ -161,15 +131,14 @@ void ImGuiBackend::RenderDrawData(ImDrawData* drawData) noexcept { // 上传索引数据 { D3D11_MAPPED_SUBRESOURCE idxResource; - hr = d3dDC->Map(_indexBuffer.get(), 0, D3D11_MAP_WRITE_DISCARD, 0, &idxResource); + HRESULT hr = d3dDC->Map(_indexBuffer.get(), 0, D3D11_MAP_WRITE_DISCARD, 0, &idxResource); if (FAILED(hr)) { Logger::Get().ComError("Map 失败", hr); return; } ImDrawIdx* idxDst = (ImDrawIdx*)idxResource.pData; - for (int n = 0; n < drawData->CmdListsCount; ++n) { - const ImDrawList* cmdList = drawData->CmdLists[n]; + for (const ImDrawList* cmdList : drawData.CmdLists) { std::memcpy(idxDst, cmdList->IdxBuffer.Data, cmdList->IdxBuffer.Size * sizeof(ImDrawIdx)); idxDst += cmdList->IdxBuffer.Size; } @@ -180,52 +149,51 @@ void ImGuiBackend::RenderDrawData(ImDrawData* drawData) noexcept { // Setup orthographic projection matrix into our constant buffer // Our visible imgui space lies from drawData->DisplayPos (top left) to drawData->DisplayPos+data_data->DisplaySize (bottom right). DisplayPos is (0,0) for single viewport apps. { - D3D11_MAPPED_SUBRESOURCE mappedResource; - hr = d3dDC->Map(_vertexConstantBuffer.get(), 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource); + const float left = drawData.DisplayPos.x; + const float right = drawData.DisplayPos.x + drawData.DisplaySize.x; + const float top = drawData.DisplayPos.y; + const float bottom = drawData.DisplayPos.y + drawData.DisplaySize.y; + const VERTEX_CONSTANT_BUFFER data{ + .mvp{ + { 2.0f / (right - left), 0.0f, 0.0f, 0.0f }, + { 0.0f, 2.0f / (top - bottom), 0.0f, 0.0f }, + { 0.0f, 0.0f, 0.5f, 0.0f }, + { (right + left) / (left - right), (top + bottom) / (bottom - top), 0.5f, 1.0f }, + } + }; + + D3D11_MAPPED_SUBRESOURCE ms; + HRESULT hr = d3dDC->Map(_vertexConstantBuffer.get(), 0, D3D11_MAP_WRITE_DISCARD, 0, &ms); if (FAILED(hr)) { Logger::Get().ComError("Map 失败", hr); return; } - - VERTEX_CONSTANT_BUFFER_DX11* constantBuffer = (VERTEX_CONSTANT_BUFFER_DX11*)mappedResource.pData; - float left = drawData->DisplayPos.x; - float right = drawData->DisplayPos.x + drawData->DisplaySize.x; - float top = drawData->DisplayPos.y; - float bottom = drawData->DisplayPos.y + drawData->DisplaySize.y; - float mvp[4][4] = { - { 2.0f / (right - left), 0.0f, 0.0f, 0.0f }, - { 0.0f, 2.0f / (top - bottom), 0.0f, 0.0f }, - { 0.0f, 0.0f, 0.5f, 0.0f }, - { (right + left) / (left - right), (top + bottom) / (bottom - top), 0.5f, 1.0f }, - }; - std::memcpy(&constantBuffer->mvp, mvp, sizeof(mvp)); + + std::memcpy(ms.pData, &data, sizeof(data)); d3dDC->Unmap(_vertexConstantBuffer.get(), 0); } - // Setup desired DX state _SetupRenderState(drawData); // Render command lists // (Because we merged all buffers into a single one, we maintain our own offset into them) int globalIdxOffset = 0; int globalVtxOffset = 0; - ImVec2 clip_off = drawData->DisplayPos; - for (int n = 0; n < drawData->CmdListsCount; n++) { - const ImDrawList* cmdList = drawData->CmdLists[n]; - for (int cmd_i = 0; cmd_i < cmdList->CmdBuffer.Size; cmd_i++) { - const ImDrawCmd* pcmd = &cmdList->CmdBuffer[cmd_i]; - if (pcmd->UserCallback != nullptr) { + const ImVec2& clipOff = drawData.DisplayPos; + for (const ImDrawList* cmdList : drawData.CmdLists) { + for (const ImDrawCmd& drawCmd : cmdList->CmdBuffer) { + if (drawCmd.UserCallback) { // User callback, registered via ImDrawList::AddCallback() // (ImDrawCallback_ResetRenderState is a special callback value used by the user to request the renderer to reset render state.) - if (pcmd->UserCallback == ImDrawCallback_ResetRenderState){ + if (drawCmd.UserCallback == ImDrawCallback_ResetRenderState) { _SetupRenderState(drawData); } else { - pcmd->UserCallback(cmdList, pcmd); + drawCmd.UserCallback(cmdList, &drawCmd); } } else { // Project scissor/clipping rectangles into framebuffer space - ImVec2 clipMin(pcmd->ClipRect.x - clip_off.x, pcmd->ClipRect.y - clip_off.y); - ImVec2 clipMax(pcmd->ClipRect.z - clip_off.x, pcmd->ClipRect.w - clip_off.y); + ImVec2 clipMin(drawCmd.ClipRect.x - clipOff.x, drawCmd.ClipRect.y - clipOff.y); + ImVec2 clipMax(drawCmd.ClipRect.z - clipOff.x, drawCmd.ClipRect.w - clipOff.y); if (clipMax.x <= clipMin.x || clipMax.y <= clipMin.y) continue; @@ -234,165 +202,69 @@ void ImGuiBackend::RenderDrawData(ImDrawData* drawData) noexcept { d3dDC->RSSetScissorRects(1, &r); // Bind texture, Draw - ID3D11ShaderResourceView* textureSrv = (ID3D11ShaderResourceView*)pcmd->GetTexID(); + ID3D11ShaderResourceView* textureSrv = (ID3D11ShaderResourceView*)drawCmd.GetTexID(); d3dDC->PSSetShaderResources(0, 1, &textureSrv); - d3dDC->DrawIndexed(pcmd->ElemCount, pcmd->IdxOffset + globalIdxOffset, pcmd->VtxOffset + globalVtxOffset); + d3dDC->DrawIndexed(drawCmd.ElemCount, drawCmd.IdxOffset + globalIdxOffset, drawCmd.VtxOffset + globalVtxOffset); } } + globalIdxOffset += cmdList->IdxBuffer.Size; globalVtxOffset += cmdList->VtxBuffer.Size; } } -bool ImGuiBackend::_CreateFontsTexture() noexcept { - ImGuiIO& io = ImGui::GetIO(); - ID3D11Device5* d3dDevice = _deviceResources->GetD3DDevice(); - - HRESULT hr; - - // 字体纹理使用 R8_UNORM 格式 - unsigned char* pixels; - int width, height; - io.Fonts->GetTexDataAsAlpha8(&pixels, &width, &height); - - // Upload texture to graphics system - { - D3D11_TEXTURE2D_DESC desc{}; - desc.Width = width; - desc.Height = height; - desc.MipLevels = 1; - desc.ArraySize = 1; - desc.Format = DXGI_FORMAT_R8_UNORM; - desc.SampleDesc.Count = 1; - desc.Usage = D3D11_USAGE_DEFAULT; - desc.BindFlags = D3D11_BIND_SHADER_RESOURCE; - - winrt::com_ptr texture = nullptr; - D3D11_SUBRESOURCE_DATA subResource{}; - subResource.pSysMem = pixels; - subResource.SysMemPitch = width; - hr = d3dDevice->CreateTexture2D(&desc, &subResource, texture.put()); - if (FAILED(hr)) { - Logger::Get().ComError("CreateTexture2D 失败", hr); - return false; - } - - // Create texture view - D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc{}; - srvDesc.Format = desc.Format; - srvDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D; - srvDesc.Texture2D.MipLevels = desc.MipLevels; - hr = d3dDevice->CreateShaderResourceView(texture.get(), &srvDesc, _fontTextureView.put()); - if (FAILED(hr)) { - Logger::Get().ComError("CreateShaderResourceView 失败", hr); - return false; - } - } - - // Store our identifier - io.Fonts->SetTexID((ImTextureID)_fontTextureView.get()); - - // Create texture sampler - // (Bilinear sampling is required by default. Set 'io.Fonts->Flags |= ImFontAtlasFlags_NoBakedLines' or 'style.AntiAliasedLinesUseTex = false' to allow point/nearest sampling) - { - D3D11_SAMPLER_DESC desc{}; - desc.Filter = D3D11_FILTER_MIN_MAG_MIP_LINEAR; - desc.AddressU = D3D11_TEXTURE_ADDRESS_WRAP; - desc.AddressV = D3D11_TEXTURE_ADDRESS_WRAP; - desc.AddressW = D3D11_TEXTURE_ADDRESS_WRAP; - desc.ComparisonFunc = D3D11_COMPARISON_ALWAYS; - hr = d3dDevice->CreateSamplerState(&desc, _fontSampler.put()); - if (FAILED(hr)) { - Logger::Get().ComError("CreateSamplerState 失败", hr); - return false; - } - } - - // 清理不再需要的数据降低内存占用 - io.Fonts->ClearTexData(); - - return true; -} - bool ImGuiBackend::_CreateDeviceObjects() noexcept { ID3D11Device5* d3dDevice = _deviceResources->GetD3DDevice(); - HRESULT hr; - - static winrt::com_ptr vertexShaderBlob; - if (!vertexShaderBlob) { - hr = D3DCompile(VERTEX_SHADER, StrUtils::StrLen(VERTEX_SHADER), - nullptr, nullptr, nullptr, "main", "vs_5_0", 0, 0, vertexShaderBlob.put(), nullptr); - if (FAILED(hr)) { - Logger::Get().ComError("编译顶点着色器失败", hr); - return false; - } - } - - hr = d3dDevice->CreateVertexShader( - vertexShaderBlob->GetBufferPointer(), - vertexShaderBlob->GetBufferSize(), - nullptr, - _vertexShader.put() - ); + HRESULT hr = d3dDevice->CreateVertexShader(ImGuiImplVS, std::size(ImGuiImplVS), nullptr, _vertexShader.put()); if (FAILED(hr)) { Logger::Get().ComError("CreateVertexShader 失败", hr); return false; } static constexpr D3D11_INPUT_ELEMENT_DESC LOCAL_LAYOUT[] = { - { "POSITION", 0, DXGI_FORMAT_R32G32_FLOAT, 0, (UINT)IM_OFFSETOF(ImDrawVert, pos), D3D11_INPUT_PER_VERTEX_DATA, 0 }, + { "SV_POSITION", 0, DXGI_FORMAT_R32G32_FLOAT, 0, (UINT)IM_OFFSETOF(ImDrawVert, pos), D3D11_INPUT_PER_VERTEX_DATA, 0 }, { "TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, (UINT)IM_OFFSETOF(ImDrawVert, uv), D3D11_INPUT_PER_VERTEX_DATA, 0 }, { "COLOR", 0, DXGI_FORMAT_R8G8B8A8_UNORM, 0, (UINT)IM_OFFSETOF(ImDrawVert, col), D3D11_INPUT_PER_VERTEX_DATA, 0 }, }; - hr = d3dDevice->CreateInputLayout(LOCAL_LAYOUT, 3, - vertexShaderBlob->GetBufferPointer(), vertexShaderBlob->GetBufferSize(), _inputLayout.put()); + hr = d3dDevice->CreateInputLayout(LOCAL_LAYOUT, 3, ImGuiImplVS, std::size(ImGuiImplVS), _inputLayout.put()); if (FAILED(hr)) { Logger::Get().ComError("CreateInputLayout 失败", hr); return false; } { - D3D11_BUFFER_DESC desc{}; - desc.ByteWidth = sizeof(VERTEX_CONSTANT_BUFFER_DX11); - desc.Usage = D3D11_USAGE_DYNAMIC; - desc.BindFlags = D3D11_BIND_CONSTANT_BUFFER; - desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; + D3D11_BUFFER_DESC desc{ + .ByteWidth = sizeof(VERTEX_CONSTANT_BUFFER), + .Usage = D3D11_USAGE_DYNAMIC, + .BindFlags = D3D11_BIND_CONSTANT_BUFFER, + .CPUAccessFlags = D3D11_CPU_ACCESS_WRITE + }; d3dDevice->CreateBuffer(&desc, nullptr, _vertexConstantBuffer.put()); } - static winrt::com_ptr pixelShaderBlob; - if (!pixelShaderBlob) { - hr = D3DCompile(PIXEL_SHADER, StrUtils::StrLen(PIXEL_SHADER), - nullptr, nullptr, nullptr, "main", "ps_5_0", 0, 0, pixelShaderBlob.put(), nullptr); - if (FAILED(hr)) { - Logger::Get().ComError("编译像素着色器失败", hr); - return false; - } - } - - hr = d3dDevice->CreatePixelShader( - pixelShaderBlob->GetBufferPointer(), - pixelShaderBlob->GetBufferSize(), - nullptr, - _pixelShader.put() - ); + hr = d3dDevice->CreatePixelShader(ImGuiImplPS, std::size(ImGuiImplPS), nullptr, _pixelShader.put()); if (FAILED(hr)) { Logger::Get().ComError("CreatePixelShader 失败", hr); return false; } { - D3D11_BLEND_DESC desc{}; - desc.AlphaToCoverageEnable = false; - desc.RenderTarget[0].BlendEnable = true; - desc.RenderTarget[0].SrcBlend = D3D11_BLEND_SRC_ALPHA; - desc.RenderTarget[0].DestBlend = D3D11_BLEND_INV_SRC_ALPHA; - desc.RenderTarget[0].BlendOp = D3D11_BLEND_OP_ADD; - desc.RenderTarget[0].SrcBlendAlpha = D3D11_BLEND_ONE; - desc.RenderTarget[0].DestBlendAlpha = D3D11_BLEND_INV_SRC_ALPHA; - desc.RenderTarget[0].BlendOpAlpha = D3D11_BLEND_OP_ADD; - desc.RenderTarget[0].RenderTargetWriteMask = D3D11_COLOR_WRITE_ENABLE_ALL; + D3D11_BLEND_DESC desc{ + .AlphaToCoverageEnable = false, + .RenderTarget{ + D3D11_RENDER_TARGET_BLEND_DESC{ + .BlendEnable = true, + .SrcBlend = D3D11_BLEND_SRC_ALPHA, + .DestBlend = D3D11_BLEND_INV_SRC_ALPHA, + .BlendOp = D3D11_BLEND_OP_ADD, + .SrcBlendAlpha = D3D11_BLEND_ONE, + .DestBlendAlpha = D3D11_BLEND_INV_SRC_ALPHA, + .BlendOpAlpha = D3D11_BLEND_OP_ADD, + .RenderTargetWriteMask = D3D11_COLOR_WRITE_ENABLE_ALL + } + } + }; hr = d3dDevice->CreateBlendState(&desc, _blendState.put()); if (FAILED(hr)) { Logger::Get().ComError("CreateBlendState 失败", hr); @@ -400,31 +272,64 @@ bool ImGuiBackend::_CreateDeviceObjects() noexcept { } } - // Create the rasterizer state - { - D3D11_RASTERIZER_DESC desc{}; - desc.FillMode = D3D11_FILL_SOLID; - desc.CullMode = D3D11_CULL_NONE; - desc.ScissorEnable = true; - hr = d3dDevice->CreateRasterizerState(&desc, _rasterizerState.put()); - if (FAILED(hr)) { - Logger::Get().ComError("CreateRasterizerState 失败", hr); - return false; - } - } - - if (!_CreateFontsTexture()) { - Logger::Get().Error("_CreateFontsTexture 失败"); + // 创建光栅化器状态对象 + D3D11_RASTERIZER_DESC desc{ + .FillMode = D3D11_FILL_SOLID, + .CullMode = D3D11_CULL_NONE, + .ScissorEnable = true + }; + hr = d3dDevice->CreateRasterizerState(&desc, _rasterizerState.put()); + if (FAILED(hr)) { + Logger::Get().ComError("CreateRasterizerState 失败", hr); return false; } return true; } -void ImGuiBackend::BeginFrame() noexcept { - if (!_fontSampler) { - _CreateDeviceObjects(); +bool ImGuiBackend::BuildFonts() noexcept { + assert(!_fontTextureView); + + ID3D11Device5* d3dDevice = _deviceResources->GetD3DDevice(); + ImGuiIO& io = ImGui::GetIO(); + + // 字体纹理使用 R8_UNORM 格式 + unsigned char* pixels; + int width, height; + io.Fonts->GetTexDataAsAlpha8(&pixels, &width, &height); + + // 上传纹理数据 + const D3D11_SUBRESOURCE_DATA initData{ + .pSysMem = pixels, + .SysMemPitch = (UINT)width + }; + winrt::com_ptr texture = DirectXHelper::CreateTexture2D( + d3dDevice, + DXGI_FORMAT_R8_UNORM, + width, + height, + D3D11_BIND_SHADER_RESOURCE, + D3D11_USAGE_DEFAULT, + 0, + &initData + ); + if (!texture) { + Logger::Get().Error("创建字体纹理失败"); + return false; + } + + HRESULT hr = d3dDevice->CreateShaderResourceView(texture.get(), nullptr, _fontTextureView.put()); + if (FAILED(hr)) { + Logger::Get().ComError("CreateShaderResourceView 失败", hr); + return false; } + + // 设置纹理 ID + io.Fonts->SetTexID((ImTextureID)_fontTextureView.get()); + + // 清理不再需要的数据降低内存占用 + io.Fonts->ClearTexData(); + return true; } } diff --git a/src/Magpie.Core/ImGuiBackend.h b/src/Magpie.Core/ImGuiBackend.h index 3c9c1c3aa..5f1afac9f 100644 --- a/src/Magpie.Core/ImGuiBackend.h +++ b/src/Magpie.Core/ImGuiBackend.h @@ -13,16 +13,16 @@ class ImGuiBackend { bool Initialize(DeviceResources* deviceResources) noexcept; - void BeginFrame() noexcept; - void RenderDrawData(ImDrawData* drawData) noexcept; + bool BuildFonts() noexcept; + + void RenderDrawData(const ImDrawData& drawData) noexcept; private: bool _CreateDeviceObjects() noexcept; - void _SetupRenderState(ImDrawData* drawData) noexcept; - bool _CreateFontsTexture() noexcept; + void _SetupRenderState(const ImDrawData& drawData) noexcept; - class DeviceResources* _deviceResources = nullptr; + DeviceResources* _deviceResources = nullptr; winrt::com_ptr _vertexBuffer; int _vertexBufferSize = 5000; @@ -34,7 +34,6 @@ class ImGuiBackend { winrt::com_ptr _inputLayout; winrt::com_ptr _vertexConstantBuffer; winrt::com_ptr _pixelShader; - winrt::com_ptr _fontSampler; winrt::com_ptr _fontTextureView; winrt::com_ptr _blendState; winrt::com_ptr _rasterizerState; diff --git a/src/Magpie.Core/ImGuiImpl.cpp b/src/Magpie.Core/ImGuiImpl.cpp index a34eaca6b..f2b75353b 100644 --- a/src/Magpie.Core/ImGuiImpl.cpp +++ b/src/Magpie.Core/ImGuiImpl.cpp @@ -110,7 +110,11 @@ bool ImGuiImpl::Initialize(DeviceResources* deviceResources) noexcept { return true; } -void ImGuiImpl::BeginFrame() { +bool ImGuiImpl::BuildFonts() noexcept { + return _backend.BuildFonts(); +} + +void ImGuiImpl::NewFrame() noexcept { ImGuiIO& io = ImGui::GetIO(); // Setup display size (every frame to accommodate for window resizing) @@ -126,9 +130,8 @@ void ImGuiImpl::BeginFrame() { io.AddKeyEvent(ImGuiKey_Enter, false); } - bool originWantCaptureMouse = io.WantCaptureMouse; + const bool originWantCaptureMouse = io.WantCaptureMouse; - _backend.BeginFrame(); ImGui::NewFrame(); // 将所有 ImGUI 窗口限制在视口内 @@ -167,26 +170,25 @@ void ImGuiImpl::BeginFrame() { } } -void ImGuiImpl::EndFrame() { - ImGui::Render(); - +void ImGuiImpl::Draw() noexcept { const RECT& scalingRect = ScalingWindow::Get().WndRect(); const RECT& destRect = ScalingWindow::Get().Renderer().DestRect(); - ImGui::GetDrawData()->DisplayPos = ImVec2( + ImDrawData& drawData = *ImGui::GetDrawData(); + drawData.DisplayPos = ImVec2( float(scalingRect.left - destRect.left), float(scalingRect.top - destRect.top) ); - ImGui::GetDrawData()->DisplaySize = ImVec2( + drawData.DisplaySize = ImVec2( float(destRect.right - scalingRect.left), float(destRect.bottom - scalingRect.top) ); - _backend.RenderDrawData(ImGui::GetDrawData()); + _backend.RenderDrawData(drawData); } -void ImGuiImpl::Tooltip(const char* /*content*/, float /*maxWidth*/) { - /*ImVec2 padding = ImGui::GetStyle().WindowPadding; +void ImGuiImpl::Tooltip(const char* content, float maxWidth) noexcept { + ImVec2 padding = ImGui::GetStyle().WindowPadding; ImVec2 contentSize = ImGui::CalcTextSize(content, nullptr, false, maxWidth - 2 * padding.x); ImVec2 windowSize(contentSize.x + 2 * padding.x, contentSize.y + 2 * padding.y); ImGui::SetNextWindowSize(windowSize); @@ -195,7 +197,7 @@ void ImGuiImpl::Tooltip(const char* /*content*/, float /*maxWidth*/) { windowPos.x += 16 * ImGui::GetStyle().MouseCursorScale; windowPos.y += 8 * ImGui::GetStyle().MouseCursorScale; - SIZE outputSize = Win32Utils::GetSizeOfRect(MagApp::Get().GetRenderer().GetOutputRect()); + SIZE outputSize = Win32Utils::GetSizeOfRect(ScalingWindow::Get().Renderer().DestRect()); windowPos.x = std::clamp(windowPos.x, 0.0f, outputSize.cx - windowSize.x); windowPos.y = std::clamp(windowPos.y, 0.0f, outputSize.cy - windowSize.y); @@ -209,7 +211,7 @@ void ImGuiImpl::Tooltip(const char* /*content*/, float /*maxWidth*/) { ImGui::PopTextWrapPos(); ImGui::BringWindowToDisplayFront(ImGui::GetCurrentWindow()); - ImGui::End();*/ + ImGui::End(); } void ImGuiImpl::_UpdateMousePos() noexcept { @@ -253,7 +255,7 @@ void ImGuiImpl::_UpdateMousePos() noexcept { ); } -void ImGuiImpl::ClearStates() { +void ImGuiImpl::ClearStates() noexcept { /*ImGuiIO& io = ImGui::GetIO(); io.MousePos = ImVec2(-FLT_MAX, -FLT_MAX); std::fill(std::begin(io.MouseDown), std::end(io.MouseDown), false); @@ -291,40 +293,25 @@ void ImGuiImpl::MessageHandler(UINT msg, WPARAM wParam, LPARAM /*lParam*/) noexc return std::nullopt; }*/ + // 缩放窗口不会收到双击消息 switch (msg) { - case WM_LBUTTONDOWN: case WM_LBUTTONDBLCLK: - case WM_RBUTTONDOWN: case WM_RBUTTONDBLCLK: - case WM_MBUTTONDOWN: case WM_MBUTTONDBLCLK: - case WM_XBUTTONDOWN: case WM_XBUTTONDBLCLK: + case WM_LBUTTONDOWN: + case WM_RBUTTONDOWN: { - int button = 0; - if (msg == WM_LBUTTONDOWN || msg == WM_LBUTTONDBLCLK) { button = 0; } - if (msg == WM_RBUTTONDOWN || msg == WM_RBUTTONDBLCLK) { button = 1; } - if (msg == WM_MBUTTONDOWN || msg == WM_MBUTTONDBLCLK) { button = 2; } - if (msg == WM_XBUTTONDOWN || msg == WM_XBUTTONDBLCLK) { button = (GET_XBUTTON_WPARAM(wParam) == XBUTTON1) ? 3 : 4; } - if (!ImGui::IsAnyMouseDown()) { if (!GetCapture()) { SetCapture(ScalingWindow::Get().Handle()); } //MagApp::Get().GetCursorManager().OnCursorCapturedOnOverlay(); } - - io.MouseDown[button] = true; + + io.MouseDown[msg == WM_LBUTTONDOWN ? 0 : 1] = true; break; } case WM_LBUTTONUP: case WM_RBUTTONUP: - case WM_MBUTTONUP: - case WM_XBUTTONUP: { - int button = 0; - if (msg == WM_LBUTTONUP) { button = 0; } - if (msg == WM_RBUTTONUP) { button = 1; } - if (msg == WM_MBUTTONUP) { button = 2; } - if (msg == WM_XBUTTONUP) { button = (GET_XBUTTON_WPARAM(wParam) == XBUTTON1) ? 3 : 4; } - - io.MouseDown[button] = false; + io.MouseDown[msg == WM_LBUTTONUP ? 0 : 1] = false; if (!ImGui::IsAnyMouseDown()) { if (GetCapture() == ScalingWindow::Get().Handle()) { @@ -336,14 +323,16 @@ void ImGuiImpl::MessageHandler(UINT msg, WPARAM wParam, LPARAM /*lParam*/) noexc break; } case WM_MOUSEWHEEL: + { io.MouseWheel += (float)GET_WHEEL_DELTA_WPARAM(wParam) / (float)WHEEL_DELTA; break; + } case WM_MOUSEHWHEEL: + { io.MouseWheelH += (float)GET_WHEEL_DELTA_WPARAM(wParam) / (float)WHEEL_DELTA; break; } - - + } } } diff --git a/src/Magpie.Core/ImGuiImpl.h b/src/Magpie.Core/ImGuiImpl.h index b5f2a66d5..9f502bd85 100644 --- a/src/Magpie.Core/ImGuiImpl.h +++ b/src/Magpie.Core/ImGuiImpl.h @@ -15,16 +15,18 @@ class ImGuiImpl { bool Initialize(DeviceResources* deviceResource) noexcept; - void BeginFrame(); + bool BuildFonts() noexcept; - void EndFrame(); + void NewFrame() noexcept; - void ClearStates(); + void Draw() noexcept; + + void ClearStates() noexcept; void MessageHandler(UINT msg, WPARAM wParam, LPARAM lParam) noexcept; // 将提示窗口限制在屏幕内 - static void Tooltip(const char* content, float maxWidth = -1.0f); + static void Tooltip(const char* content, float maxWidth = -1.0f) noexcept; private: void _UpdateMousePos() noexcept; diff --git a/src/Magpie.Core/Magpie.Core.vcxproj b/src/Magpie.Core/Magpie.Core.vcxproj index ecf5e064d..1bcbe36bc 100644 --- a/src/Magpie.Core/Magpie.Core.vcxproj +++ b/src/Magpie.Core/Magpie.Core.vcxproj @@ -42,6 +42,7 @@ + @@ -76,6 +77,7 @@ + @@ -106,6 +108,12 @@ Compute + + Pixel + + + Vertex + Pixel @@ -133,4 +141,4 @@ - + \ No newline at end of file diff --git a/src/Magpie.Core/Magpie.Core.vcxproj.filters b/src/Magpie.Core/Magpie.Core.vcxproj.filters index d801a680e..a190db757 100644 --- a/src/Magpie.Core/Magpie.Core.vcxproj.filters +++ b/src/Magpie.Core/Magpie.Core.vcxproj.filters @@ -87,11 +87,11 @@ Overlay + - @@ -137,6 +137,7 @@ Overlay + @@ -154,8 +155,14 @@ Shaders + + Shaders + + + Shaders + - + \ No newline at end of file diff --git a/src/Magpie.Core/OverlayDrawer.cpp b/src/Magpie.Core/OverlayDrawer.cpp index baf88efe4..d4dcce955 100644 --- a/src/Magpie.Core/OverlayDrawer.cpp +++ b/src/Magpie.Core/OverlayDrawer.cpp @@ -52,7 +52,7 @@ bool OverlayDrawer::Initialize(DeviceResources* deviceResources) noexcept { return true; } -void OverlayDrawer::Draw() noexcept { +void OverlayDrawer::Draw(uint32_t count) noexcept { bool isShowFPS = ScalingWindow::Get().Options().IsShowFPS(); if (!_isUIVisiable && !isShowFPS) { @@ -60,22 +60,26 @@ void OverlayDrawer::Draw() noexcept { } if (_isFirstFrame) { - // ImGui 的第一帧不会显示,我们连续渲染两帧 + // 刚显示时需连续渲染三帧:第一帧不会显示,第二帧不会将窗口限制在视口内 _isFirstFrame = false; - Draw(); + count = 3; } - _imguiImpl.BeginFrame(); + for (uint32_t i = 0; i < count; ++i) { + _imguiImpl.NewFrame(); - if (isShowFPS) { - _DrawFPS(); - } + if (isShowFPS) { + _DrawFPS(); + } - if (_isUIVisiable) { - _DrawUI(); + if (_isUIVisiable) { + _DrawUI(); + } + + ImGui::Render(); } - _imguiImpl.EndFrame(); + _imguiImpl.Draw(); } void OverlayDrawer::SetUIVisibility(bool value) noexcept { @@ -122,50 +126,51 @@ static const std::wstring& GetSystemFontsFolder() noexcept { bool OverlayDrawer::_BuildFonts() noexcept { const std::wstring& language = GetAppLanguage(); - ImFontAtlas& fontAtlas = *ImGui::GetIO().Fonts; - bool fontCacheDisabled = ScalingWindow::Get().Options().IsFontCacheDisabled(); + const bool fontCacheDisabled = ScalingWindow::Get().Options().IsFontCacheDisabled(); if (!fontCacheDisabled && ImGuiFontsCacheManager::Get().Load(language, fontAtlas)) { _fontUI = fontAtlas.Fonts[0]; _fontMonoNumbers = fontAtlas.Fonts[1]; _fontFPS = fontAtlas.Fonts[2]; - return true; - } + } else { + fontAtlas.Flags |= ImFontAtlasFlags_NoPowerOfTwoHeight | ImFontAtlasFlags_NoMouseCursors; - fontAtlas.Flags |= ImFontAtlasFlags_NoPowerOfTwoHeight; - if (!ScalingWindow::Get().Options().Is3DGameMode()) { - // 非 3D 游戏模式无需 ImGui 绘制光标 - fontAtlas.Flags |= ImFontAtlasFlags_NoMouseCursors; - } + std::wstring fontPath = GetSystemFontsFolder(); + if (Win32Utils::GetOSVersion().IsWin11()) { + fontPath += L"\\SegUIVar.ttf"; + } else { + fontPath += L"\\segoeui.ttf"; + } - std::wstring fontPath = GetSystemFontsFolder(); - if (Win32Utils::GetOSVersion().IsWin11()) { - fontPath += L"\\SegUIVar.ttf"; - } else { - fontPath += L"\\segoeui.ttf"; - } + std::vector fontData; + if (!Win32Utils::ReadFile(fontPath.c_str(), fontData)) { + Logger::Get().Error("读取字体文件失败"); + return false; + } - std::vector fontData; - if (!Win32Utils::ReadFile(fontPath.c_str(), fontData)) { - Logger::Get().Error("读取字体文件失败"); - return false; - } + { + // 构建 ImFontAtlas 前 uiRanges 不能析构,因为 ImGui 只保存了指针 + ImVector uiRanges; + _BuildFontUI(language, fontData, uiRanges); + _BuildFontFPS(fontData); + + if (!fontAtlas.Build()) { + Logger::Get().Error("构建 ImFontAtlas 失败"); + return false; + } + } - // 构建字体前 uiRanges 不能析构,因为 ImGui 只保存了指针 - ImVector uiRanges; - _BuildFontUI(language, fontData, uiRanges); - _BuildFontFPS(fontData); + if (!fontCacheDisabled) { + ImGuiFontsCacheManager::Get().Save(language, fontAtlas); + } + } - if (!fontAtlas.Build()) { + if (!_imguiImpl.BuildFonts()) { Logger::Get().Error("构建字体失败"); return false; } - if (!fontCacheDisabled) { - ImGuiFontsCacheManager::Get().Save(language, fontAtlas); - } - return true; } diff --git a/src/Magpie.Core/OverlayDrawer.h b/src/Magpie.Core/OverlayDrawer.h index 00b02eced..dd15994ad 100644 --- a/src/Magpie.Core/OverlayDrawer.h +++ b/src/Magpie.Core/OverlayDrawer.h @@ -13,8 +13,8 @@ class OverlayDrawer { OverlayDrawer(OverlayDrawer&&) = delete; bool Initialize(DeviceResources* deviceResources) noexcept; - - void Draw() noexcept; + + void Draw(uint32_t count) noexcept; bool IsUIVisiable() const noexcept { return _isUIVisiable; diff --git a/src/Magpie.Core/Renderer.cpp b/src/Magpie.Core/Renderer.cpp index ba090e6e2..f07115e39 100644 --- a/src/Magpie.Core/Renderer.cpp +++ b/src/Magpie.Core/Renderer.cpp @@ -121,14 +121,19 @@ void Renderer::OnCursorVisibilityChanged(bool isVisible) { void Renderer::MessageHandler(UINT msg, WPARAM wParam, LPARAM lParam) noexcept { if (_overlayDrawer) { _overlayDrawer->MessageHandler(msg, wParam, lParam); - if (msg == WM_LBUTTONDOWN || msg == WM_LBUTTONUP || msg == WM_LBUTTONDBLCLK || msg == WM_MOUSEWHEEL || msg == WM_MOUSEHWHEEL) { - _FrontendRender(); + + // 有些鼠标操作需要渲染 ImGui 多次,见 https://github.com/ocornut/imgui/issues/2268 + if (msg == WM_LBUTTONDOWN || msg == WM_RBUTTONDOWN || msg == WM_MOUSEWHEEL || msg == WM_MOUSEHWHEEL) { _FrontendRender(); + } else if (msg == WM_LBUTTONUP || msg == WM_RBUTTONUP) { + _FrontendRender(2); } } } bool Renderer::_CreateSwapChain() noexcept { + ID3D11Device5* d3dDevice = _frontendResources.GetD3DDevice(); + DXGI_SWAP_CHAIN_DESC1 sd{}; const RECT& scalingWndRect = ScalingWindow::Get().WndRect(); sd.Width = scalingWndRect.right - scalingWndRect.left; @@ -148,7 +153,7 @@ bool Renderer::_CreateSwapChain() noexcept { winrt::com_ptr dxgiSwapChain = nullptr; HRESULT hr = _frontendResources.GetDXGIFactory()->CreateSwapChainForHwnd( - _frontendResources.GetD3DDevice(), + d3dDevice, ScalingWindow::Get().Handle(), &sd, nullptr, @@ -187,6 +192,12 @@ bool Renderer::_CreateSwapChain() noexcept { return false; } + hr = d3dDevice->CreateRenderTargetView(_backBuffer.get(), nullptr, _backBufferRtv.put()); + if (FAILED(hr)) { + Logger::Get().ComError("CreateRenderTargetView 失败", hr); + return false; + } + // 检查 Multiplane Overlay 支持 const bool supportMPO = CheckMultiplaneOverlaySupport(_swapChain.get()); Logger::Get().Info(StrUtils::Concat("Multiplane Overlay 支持:", supportMPO ? "是" : "否")); @@ -194,7 +205,8 @@ bool Renderer::_CreateSwapChain() noexcept { return true; } -void Renderer::_FrontendRender() noexcept { +// 有些操作需要渲染 ImGui 多次 +void Renderer::_FrontendRender(uint32_t imguiFrames) noexcept { WaitForSingleObjectEx(_frameLatencyWaitableObject.get(), 1000, TRUE); ID3D11DeviceContext4* d3dDC = _frontendResources.GetD3DDC(); @@ -203,8 +215,6 @@ void Renderer::_FrontendRender() noexcept { // 所有渲染都使用三角形带拓扑 d3dDC->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP); - ID3D11RenderTargetView* backBufferRtv = _frontendResources.GetRenderTargetView(_backBuffer.get()); - // 输出画面是否充满缩放窗口 const RECT& scalingWndRect = ScalingWindow::Get().WndRect(); const bool isFill = _destRect == scalingWndRect; @@ -212,7 +222,7 @@ void Renderer::_FrontendRender() noexcept { if (!isFill) { // 以黑色填充背景,因为我们指定了 DXGI_SWAP_EFFECT_FLIP_DISCARD,同时也是为了和 RTSS 兼容 static constexpr FLOAT BLACK[4] = { 0.0f,0.0f,0.0f,1.0f }; - d3dDC->ClearRenderTargetView(backBufferRtv, BLACK); + d3dDC->ClearRenderTargetView(_backBufferRtv.get(), BLACK); } _lastAccessMutexKey = ++_sharedTextureMutexKey; @@ -239,11 +249,14 @@ void Renderer::_FrontendRender() noexcept { _frontendSharedTextureMutex->ReleaseSync(_lastAccessMutexKey); // 叠加层和光标都绘制到 back buffer - d3dDC->OMSetRenderTargets(1, &backBufferRtv, nullptr); + { + ID3D11RenderTargetView* t = _backBufferRtv.get(); + d3dDC->OMSetRenderTargets(1, &t, nullptr); + } // 绘制叠加层 if (_overlayDrawer) { - _overlayDrawer->Draw(); + _overlayDrawer->Draw(imguiFrames); } // 绘制光标 @@ -252,8 +265,8 @@ void Renderer::_FrontendRender() noexcept { // 两个垂直同步之间允许渲染数帧,SyncInterval = 0 只呈现最新的一帧,旧帧被丢弃 _swapChain->Present(0, 0); - // 丢弃渲染目标的内容。仅当现有内容将被完全覆盖时,此操作才有效 - d3dDC->DiscardView(backBufferRtv); + // 丢弃渲染目标的内容 + d3dDC->DiscardView(_backBufferRtv.get()); } void Renderer::Render() noexcept { @@ -325,7 +338,7 @@ bool Renderer::_InitFrameSource() noexcept { Logger::Get().Info(StrUtils::Concat("当前捕获模式:", _frameSource->Name())); - if (!_frameSource->Initialize(_backendResources)) { + if (!_frameSource->Initialize(_backendResources, _backendDescriptorStore)) { Logger::Get().Error("初始化 FrameSource 失败"); return false; } @@ -414,6 +427,7 @@ ID3D11Texture2D* Renderer::_BuildEffects() noexcept { effectDescs[i], effects[i], _backendResources, + _backendDescriptorStore, &inOutTexture )) { Logger::Get().Error(fmt::format("初始化效果#{} ({}) 失败", i, StrUtils::UTF16ToUTF8(effects[i].name))); @@ -446,6 +460,7 @@ ID3D11Texture2D* Renderer::_BuildEffects() noexcept { *bicubicDesc, bicubicOption, _backendResources, + _backendDescriptorStore, &inOutTexture )) { Logger::Get().Error("初始化降采样效果失败"); @@ -635,6 +650,9 @@ ID3D11Texture2D* Renderer::_InitBackend() noexcept { return nullptr; } + ID3D11Device5* d3dDevice = _backendResources.GetD3DDevice(); + _backendDescriptorStore.Initialize(d3dDevice); + if (!_InitFrameSource()) { return nullptr; } @@ -644,7 +662,7 @@ ID3D11Texture2D* Renderer::_InitBackend() noexcept { return nullptr; } - HRESULT hr = _backendResources.GetD3DDevice()->CreateFence( + HRESULT hr = d3dDevice->CreateFence( _fenceValue, D3D11_FENCE_FLAG_NONE, IID_PPV_ARGS(&_d3dFence)); if (FAILED(hr)) { Logger::Get().ComError("CreateFence 失败", hr); diff --git a/src/Magpie.Core/Renderer.h b/src/Magpie.Core/Renderer.h index 0636415db..641d0aed2 100644 --- a/src/Magpie.Core/Renderer.h +++ b/src/Magpie.Core/Renderer.h @@ -1,5 +1,6 @@ #pragma once #include "DeviceResources.h" +#include "BackendDescriptorStore.h" #include "EffectDrawer.h" #include "Win32Utils.h" #include "CursorDrawer.h" @@ -45,7 +46,7 @@ class Renderer { private: bool _CreateSwapChain() noexcept; - void _FrontendRender() noexcept; + void _FrontendRender(uint32_t imguiFrames = 1) noexcept; void _BackendThreadProc() noexcept; @@ -66,6 +67,7 @@ class Renderer { winrt::com_ptr _swapChain; Win32Utils::ScopedHandle _frameLatencyWaitableObject; winrt::com_ptr _backBuffer; + winrt::com_ptr _backBufferRtv; uint64_t _lastAccessMutexKey = 0; CursorDrawer _cursorDrawer; @@ -82,6 +84,7 @@ class Renderer { // 只能由后台线程访问 DeviceResources _backendResources; + Magpie::Core::BackendDescriptorStore _backendDescriptorStore; std::unique_ptr _frameSource; std::vector _effectDrawers; diff --git a/src/Magpie.Core/ScalingRuntime.cpp b/src/Magpie.Core/ScalingRuntime.cpp index 86b1f721e..f156fd6b1 100644 --- a/src/Magpie.Core/ScalingRuntime.cpp +++ b/src/Magpie.Core/ScalingRuntime.cpp @@ -30,8 +30,7 @@ void ScalingRuntime::Start(HWND hwndSrc, ScalingOptions&& options) { _isRunningChangedEvent(true); - _EnsureDispatcherQueue(); - _dqc.DispatcherQueue().TryEnqueue([hwndSrc, options(std::move(options))]() mutable { + _Dispatcher().TryEnqueue([hwndSrc, options(std::move(options))]() mutable { ScalingWindow::Get().Create(GetModuleHandle(nullptr), hwndSrc, std::move(options)); }); } @@ -41,9 +40,10 @@ void ScalingRuntime::ToggleOverlay() { return; } - _EnsureDispatcherQueue(); - _dqc.DispatcherQueue().TryEnqueue([]() { - ScalingWindow::Get().ToggleOverlay(); + _Dispatcher().TryEnqueue([]() { + if (ScalingWindow& scalingWindow = ScalingWindow::Get()) { + scalingWindow.ToggleOverlay(); + }; }); } @@ -52,8 +52,7 @@ void ScalingRuntime::Stop() { return; } - _EnsureDispatcherQueue(); - _dqc.DispatcherQueue().TryEnqueue([]() { + _Dispatcher().TryEnqueue([]() { ScalingWindow::Get().Destroy(); }); } @@ -61,17 +60,24 @@ void ScalingRuntime::Stop() { void ScalingRuntime::_ScalingThreadProc() noexcept { winrt::init_apartment(winrt::apartment_type::single_threaded); - DispatcherQueueOptions dqOptions{}; - dqOptions.dwSize = sizeof(DispatcherQueueOptions); - dqOptions.threadType = DQTYPE_THREAD_CURRENT; + { + winrt::DispatcherQueueController dqc{ nullptr }; + HRESULT hr = CreateDispatcherQueueController( + DispatcherQueueOptions{ + .dwSize = sizeof(DispatcherQueueOptions), + .threadType = DQTYPE_THREAD_CURRENT + }, + (PDISPATCHERQUEUECONTROLLER*)winrt::put_abi(dqc) + ); + if (FAILED(hr)) { + Logger::Get().ComError("CreateDispatcherQueueController 失败", hr); + return; + } - HRESULT hr = CreateDispatcherQueueController( - dqOptions, - (PDISPATCHERQUEUECONTROLLER*)winrt::put_abi(_dqc) - ); - if (FAILED(hr)) { - Logger::Get().ComError("CreateDispatcherQueueController 失败", hr); - return; + _dispatcher = dqc.DispatcherQueue(); + // 如果主线程正在等待则唤醒主线程 + _dispatcherInitialized.store(true, std::memory_order_release); + _dispatcherInitialized.notify_one(); } ScalingWindow& scalingWindow = ScalingWindow::Get(); @@ -105,10 +111,13 @@ void ScalingRuntime::_ScalingThreadProc() noexcept { } } -void ScalingRuntime::_EnsureDispatcherQueue() const noexcept { - while (!_dqc) { - Sleep(0); +const winrt::DispatcherQueue& ScalingRuntime::_Dispatcher() noexcept { + if (!_dispatcherInitializedCache) { + _dispatcherInitialized.wait(false, std::memory_order_acquire); + _dispatcherInitializedCache = true; } + + return _dispatcher; } } diff --git a/src/Magpie.Core/ScalingRuntime.h b/src/Magpie.Core/ScalingRuntime.h index 766194d74..3384727d0 100644 --- a/src/Magpie.Core/ScalingRuntime.h +++ b/src/Magpie.Core/ScalingRuntime.h @@ -44,15 +44,18 @@ class ScalingRuntime { private: void _ScalingThreadProc() noexcept; - // 确保 _dqc 完成初始化 - void _EnsureDispatcherQueue() const noexcept; + // 确保 _dispatcher 完成初始化 + const winrt::DispatcherQueue& _Dispatcher() noexcept; // 主线程使用 DispatcherQueue 和缩放线程沟通,因此无需约束内存定序,只需确保原子性即可 std::atomic _hwndSrc; winrt::event> _isRunningChangedEvent; - winrt::Windows::System::DispatcherQueueController _dqc{ nullptr }; - // 应在 _dqc 后初始化 + winrt::DispatcherQueue _dispatcher{ nullptr }; + std::atomic _dispatcherInitialized = false; + // 只能在主线程访问,省下检查 _dispatcherInitialized 的开销 + bool _dispatcherInitializedCache = false; + // 应在 _dispatcher 后初始化 std::thread _scalingThread; }; diff --git a/src/Magpie.Core/TextureLoader.cpp b/src/Magpie.Core/TextureLoader.cpp index 7ef8ded28..bc4ec289e 100644 --- a/src/Magpie.Core/TextureLoader.cpp +++ b/src/Magpie.Core/TextureLoader.cpp @@ -30,8 +30,7 @@ static HRESULT CreateD3DResources( _In_ bool forceSRGB, _In_ bool isCubeMap, _In_reads_opt_(mipCount* arraySize) const D3D11_SUBRESOURCE_DATA* initData, - _Outptr_opt_ ID3D11Resource** texture, - _Outptr_opt_ ID3D11ShaderResourceView** textureView) noexcept { + _Outptr_opt_ ID3D11Resource** texture) noexcept { if (!d3dDevice) return E_POINTER; @@ -60,29 +59,6 @@ static HRESULT CreateD3DResources( &tex ); if (SUCCEEDED(hr) && tex) { - if (textureView) { - D3D11_SHADER_RESOURCE_VIEW_DESC SRVDesc = {}; - SRVDesc.Format = format; - - if (arraySize > 1) { - SRVDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE1DARRAY; - SRVDesc.Texture1DArray.MipLevels = (!mipCount) ? UINT(-1) : desc.MipLevels; - SRVDesc.Texture1DArray.ArraySize = static_cast(arraySize); - } else { - SRVDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE1D; - SRVDesc.Texture1D.MipLevels = (!mipCount) ? UINT(-1) : desc.MipLevels; - } - - hr = d3dDevice->CreateShaderResourceView(tex, - &SRVDesc, - textureView - ); - if (FAILED(hr)) { - tex->Release(); - return hr; - } - } - if (texture) { *texture = tex; } else { @@ -117,40 +93,6 @@ static HRESULT CreateD3DResources( &tex ); if (SUCCEEDED(hr) && tex) { - if (textureView) { - D3D11_SHADER_RESOURCE_VIEW_DESC SRVDesc = {}; - SRVDesc.Format = format; - - if (isCubeMap) { - if (arraySize > 6) { - SRVDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURECUBEARRAY; - SRVDesc.TextureCubeArray.MipLevels = (!mipCount) ? UINT(-1) : desc.MipLevels; - - // Earlier we set arraySize to (NumCubes * 6) - SRVDesc.TextureCubeArray.NumCubes = static_cast(arraySize / 6); - } else { - SRVDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURECUBE; - SRVDesc.TextureCube.MipLevels = (!mipCount) ? UINT(-1) : desc.MipLevels; - } - } else if (arraySize > 1) { - SRVDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2DARRAY; - SRVDesc.Texture2DArray.MipLevels = (!mipCount) ? UINT(-1) : desc.MipLevels; - SRVDesc.Texture2DArray.ArraySize = static_cast(arraySize); - } else { - SRVDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D; - SRVDesc.Texture2D.MipLevels = (!mipCount) ? UINT(-1) : desc.MipLevels; - } - - hr = d3dDevice->CreateShaderResourceView(tex, - &SRVDesc, - textureView - ); - if (FAILED(hr)) { - tex->Release(); - return hr; - } - } - if (texture) { *texture = tex; } else { @@ -179,23 +121,6 @@ static HRESULT CreateD3DResources( &tex ); if (SUCCEEDED(hr) && tex) { - if (textureView) { - D3D11_SHADER_RESOURCE_VIEW_DESC SRVDesc = {}; - SRVDesc.Format = format; - - SRVDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE3D; - SRVDesc.Texture3D.MipLevels = (!mipCount) ? UINT(-1) : desc.MipLevels; - - hr = d3dDevice->CreateShaderResourceView(tex, - &SRVDesc, - textureView - ); - if (FAILED(hr)) { - tex->Release(); - return hr; - } - } - if (texture) { *texture = tex; } else { @@ -304,8 +229,7 @@ static HRESULT CreateTextureFromDDS( _In_ unsigned int cpuAccessFlags, _In_ unsigned int miscFlags, _In_ bool forceSRGB, - _Outptr_opt_ ID3D11Resource** texture, - _Outptr_opt_ ID3D11ShaderResourceView** textureView) noexcept { + _Outptr_opt_ ID3D11Resource** texture) noexcept { HRESULT hr = S_OK; const UINT width = header->width; @@ -498,7 +422,8 @@ static HRESULT CreateTextureFromDDS( forceSRGB, isCubeMap, initData.get(), - texture, textureView); + texture + ); if (FAILED(hr) && !maxsize && (mipCount > 1)) { // Retry with a maxsize determined by feature level @@ -517,7 +442,8 @@ static HRESULT CreateTextureFromDDS( forceSRGB, isCubeMap, initData.get(), - texture, textureView); + texture + ); } } } @@ -535,23 +461,15 @@ static HRESULT CreateDDSTextureFromFileEx( unsigned int miscFlags, bool forceSRGB, ID3D11Resource** texture, - ID3D11ShaderResourceView** textureView, DDS_ALPHA_MODE* alphaMode) noexcept { if (texture) { *texture = nullptr; } - if (textureView) { - *textureView = nullptr; - } if (alphaMode) { *alphaMode = DDS_ALPHA_MODE_UNKNOWN; } - if (!d3dDevice || !fileName || (!texture && !textureView)) { - return E_INVALIDARG; - } - - if (textureView && !(bindFlags & D3D11_BIND_SHADER_RESOURCE)) { + if (!d3dDevice || !fileName || !texture) { return E_INVALIDARG; } @@ -575,7 +493,8 @@ static HRESULT CreateDDSTextureFromFileEx( maxsize, usage, bindFlags, cpuAccessFlags, miscFlags, forceSRGB, - texture, textureView); + texture + ); if (SUCCEEDED(hr)) { if (alphaMode) @@ -719,7 +638,6 @@ static winrt::com_ptr LoadDDS(const wchar_t* fileName, ID3D11De 0, false, result.put(), - nullptr, &alphaMode ); if (FAILED(hr)) { diff --git a/src/Magpie.Core/shaders/DuplicateFrameCS.hlsl b/src/Magpie.Core/shaders/DuplicateFrameCS.hlsl index 99494b6e9..5de33809b 100644 --- a/src/Magpie.Core/shaders/DuplicateFrameCS.hlsl +++ b/src/Magpie.Core/shaders/DuplicateFrameCS.hlsl @@ -6,7 +6,6 @@ Texture2D tex2 : register(t1); SamplerState sam : register(s0); - [numthreads(8, 8, 1)] void main(uint3 tid : SV_GroupThreadID, uint3 gid : SV_GroupID) { if (result[0]) { diff --git a/src/Magpie.Core/shaders/ImGuiImplPS.hlsl b/src/Magpie.Core/shaders/ImGuiImplPS.hlsl new file mode 100644 index 000000000..6507bfd5e --- /dev/null +++ b/src/Magpie.Core/shaders/ImGuiImplPS.hlsl @@ -0,0 +1,6 @@ +SamplerState sam : register(s0); +Texture2D tex : register(t0); + +float4 main(float2 coord : TEXCOORD, float4 color : COLOR) : SV_Target { + return color * float4(1, 1, 1, tex.Sample(sam, coord).r); +} diff --git a/src/Magpie.Core/shaders/ImGuiImplVS.hlsl b/src/Magpie.Core/shaders/ImGuiImplVS.hlsl new file mode 100644 index 000000000..0cd3f2c2f --- /dev/null +++ b/src/Magpie.Core/shaders/ImGuiImplVS.hlsl @@ -0,0 +1,16 @@ +cbuffer vertexBuffer : register(b0) { + float4x4 projectionMatrix; +}; + +void main( + float4 pos : SV_POSITION, + float2 coord : TEXCOORD, + float4 color : COLOR, + out float2 outCoord : TEXCOORD, + out float4 outColor : COLOR, + out float4 outPos : SV_POSITION +) { + outPos = mul(projectionMatrix, float4(pos.xy, 0.f, 1.f)); + outCoord = coord; + outColor = color; +} diff --git a/src/Magpie/Magpie.vcxproj b/src/Magpie/Magpie.vcxproj index afcf8d2ef..e2ed51538 100644 --- a/src/Magpie/Magpie.vcxproj +++ b/src/Magpie/Magpie.vcxproj @@ -85,8 +85,8 @@ - + @@ -94,8 +94,8 @@ - + - + \ No newline at end of file diff --git a/src/Magpie/packages.config b/src/Magpie/packages.config index 849ecffa4..119239d90 100644 --- a/src/Magpie/packages.config +++ b/src/Magpie/packages.config @@ -1,6 +1,6 @@  - + - + \ No newline at end of file From 63b2e73296a3b855d0bd74c718a2c109c68689bc Mon Sep 17 00:00:00 2001 From: Xu <34770031+Blinue@users.noreply.github.com> Date: Sun, 31 Dec 2023 16:08:00 +0800 Subject: [PATCH 092/155] =?UTF-8?q?=E6=94=AF=E6=8C=81=20ARM64=20=E6=9E=B6?= =?UTF-8?q?=E6=9E=84=20(#795)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: 支持 ARM64 * chore: CI 编译 ARM64 * chore: CI 编译 ARM64 * chore: 发布版本包含 ARM64 包 * fix: 修复 ARM64 架构检查更新失败 * fix: 彻底解决 DllGetActivationFactory 的导出 * feat: Magpie.App 中出现未处理异常且附加了调试器则触发断点 --- .github/workflows/build.yml | 11 +- .github/workflows/release.yml | 55 ++++++- ci/release.py | 158 ++++++++++++++++++++ publish.py | 166 ++-------------------- src/Magpie.App/App.cpp | 10 ++ src/Magpie.App/App.h | 31 +++- src/Magpie.App/Magpie.App.def | 3 + src/Magpie.App/Magpie.App.vcxproj | 14 +- src/Magpie.App/Magpie.App.vcxproj.filters | 2 +- src/Magpie.App/UpdateService.cpp | 31 ++-- src/Magpie.App/app.base.h | 35 ----- src/Magpie.Core/Magpie.Core.vcxproj | 4 +- src/Magpie/Magpie.vcxproj | 14 +- src/Magpie/XamlIslands.targets | 2 +- 14 files changed, 303 insertions(+), 233 deletions(-) create mode 100644 ci/release.py create mode 100644 src/Magpie.App/Magpie.App.def delete mode 100644 src/Magpie.App/app.base.h diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 79b4ef22b..fba83fd3f 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -9,6 +9,9 @@ on: jobs: build: runs-on: windows-latest + strategy: + matrix: + platform: ["x64", "ARM64"] steps: - uses: actions/checkout@v4 @@ -24,10 +27,10 @@ jobs: uses: actions/cache@v3 with: path: ~/.conan2/p - key: ${{ runner.os }}-conan-${{ hashFiles('src/**/conanfile.txt') }} + key: Conan-${{ hashFiles('src/**/conanfile.txt') }}-${{ matrix.platform }} - name: Build - run: python publish.py + run: python publish.py ${{ matrix.platform }} - name: Save hash id: hash @@ -36,5 +39,5 @@ jobs: - name: Store build uses: actions/upload-artifact@v4 with: - name: Magpie-dev-${{ steps.hash.outputs.sha_short }} - path: ./publish + name: Magpie-dev-${{ steps.hash.outputs.sha_short }}-${{ matrix.platform }} + path: ./publish/${{ matrix.platform }} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 3c43ac018..e6d5b875a 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -24,9 +24,13 @@ on: required: true type: boolean jobs: - release: + build: runs-on: windows-latest - + outputs: + tag: ${{ steps.tag.outputs.tag }} + strategy: + matrix: + platform: ["x64", "ARM64"] steps: - uses: actions/checkout@v4 @@ -42,13 +46,50 @@ jobs: with: path: ~/.conan2/p key: ${{ runner.os }}-conan-${{ hashFiles('src/**/conanfile.txt') }} + + - name: Generate tag + id: tag + run: | + $tag = "${{ inputs.tag }}" -eq "" ? "v${{ inputs.major }}.${{ inputs.minor }}.${{ inputs.patch }}" : "${{ inputs.tag }}" + echo "tag=$tag" >> $env:GITHUB_OUTPUT - - name: Publish release - run: python publish.py + - name: Build + run: python publish.py ${{ matrix.platform }} env: MAJOR: ${{ inputs.major }} MINOR: ${{ inputs.minor }} PATCH: ${{ inputs.patch }} - TAG: ${{ inputs.tag }} - PRERELEASE: ${{ inputs.prerelease }} - ACCESS_TOKEN: ${{ secrets.CONTENTS_ACCESS_TOKEN }} + TAG: ${{ steps.tag.outputs.tag }} + + - name: Store artifacts + uses: actions/upload-artifact@v4 + with: + name: Magpie-${{ steps.tag.outputs.tag }}-${{ matrix.platform }} + path: publish/${{ matrix.platform }} + release: + runs-on: windows-latest + needs: build + steps: + - uses: actions/checkout@v4 + + - uses: actions/setup-python@v5 + with: + python-version: '3.11' + + - name: Setup Requests + run: pip install requests + + - name: Restore artifacts + uses: actions/download-artifact@v4 + with: + path: publish + + - name: Publish release + run: python ci/release.py + env: + MAJOR: ${{ inputs.major }} + MINOR: ${{ inputs.minor }} + PATCH: ${{ inputs.patch }} + TAG: ${{ needs.build.outputs.tag }} + PRERELEASE: ${{ inputs.prerelease }} + ACCESS_TOKEN: ${{ secrets.CONTENTS_ACCESS_TOKEN }} diff --git a/ci/release.py b/ci/release.py new file mode 100644 index 000000000..b872383d0 --- /dev/null +++ b/ci/release.py @@ -0,0 +1,158 @@ +import sys +import os +import subprocess +import shutil +import requests +import hashlib +import json + +try: + # https://docs.github.com/en/actions/learn-github-actions/variables + if os.environ["GITHUB_ACTIONS"].lower() == "true": + # 不知为何在 Github Actions 中运行时默认编码为 ANSI,并且 print 需刷新流才能正常显示 + for stream in [sys.stdout, sys.stderr]: + stream.reconfigure(encoding="utf-8") +except: + pass + +majorVersion = os.environ["MAJOR"] +minorVersion = os.environ["MINOR"] +patchVersion = os.environ["PATCH"] +tag = os.environ["TAG"] +isPrerelease = os.environ["PRERELEASE"].lower() == "true" +githubAccessToken = os.environ["ACCESS_TOKEN"] +repo = os.environ["GITHUB_REPOSITORY"] +actor = os.environ["GITHUB_ACTOR"] + +subprocess.run("git config user.name " + actor) +subprocess.run(f"git config user.email {actor}@users.noreply.github.com") + +subprocess.run( + f"git remote set-url origin https://{githubAccessToken}@github.com/{repo}.git" +) + +# 打标签 +if subprocess.run(f"git tag -a {tag} -m {tag}").returncode != 0: + raise Exception("打标签失败") + +if subprocess.run("git push origin " + tag).returncode != 0: + raise Exception("推送标签失败") + +print("已创建标签 " + tag, flush=True) + +headers = { + "Accept": "application/vnd.github+json", + "Authorization": "Bearer " + githubAccessToken, + "X-GitHub-Api-Version": "2022-11-28", +} + +# 获取前一个发布版本来生成默认发行说明 +prevReleaseTag = None +try: + if isPrerelease: + # 发布预发行版与最新的版本(无论是正式版还是预发行版)对比 + response = requests.get( + f"https://api.github.com/repos/{repo}/releases", + json={"per_page": 1}, + headers=headers, + ) + if response.ok: + prevReleaseTag = response.json()[0]["tag_name"] + else: + # 发布正式版则与最新的正式版对比 + # 由于可以自己选择最新版本,此接口可能不会返回时间上最新发布的版本,不是大问题 + response = requests.get( + f"https://api.github.com/repos/{repo}/releases/latest", headers=headers + ) + if response.ok: + prevReleaseTag = response.json()["tag_name"] +except: + # 忽略错误 + pass + +# 发布 release +if prevReleaseTag == None: + body = "" +else: + # 默认发行说明为比较两个 tag + body = f"https://github.com/{repo}/compare/{prevReleaseTag}...{tag}" + +response = requests.post( + f"https://api.github.com/repos/{repo}/releases", + json={ + "tag_name": tag, + "name": tag, + "prerelease": isPrerelease, + "body": body, + "discussion_category_name": "Announcements", + }, + headers=headers, +) +if not response.ok: + raise Exception("发布失败") + +uploadUrl = response.json()["upload_url"] +uploadUrl = uploadUrl[: uploadUrl.find("{")] + "?name=" + +os.chdir(os.path.dirname(__file__) + "\\..\\publish") + +pkgInfos = {} +for platform in ["x64", "ARM64"]: + # 打包成 zip + pkgName = "Magpie-" + tag + "-" + platform + shutil.make_archive(pkgName, "zip", pkgName) + pkgName += ".zip" + + # 上传资产 + with open(pkgName, "rb") as f: + # 流式上传 + # https://requests.readthedocs.io/en/latest/user/advanced/#streaming-uploads + response = requests.post( + uploadUrl + pkgName, + data=f, + headers={**headers, "Content-Type": "application/zip"}, + ) + + if not response.ok: + raise Exception("上传失败") + + # 计算哈希 + f.seek(0, os.SEEK_SET) + md5 = hashlib.file_digest(f, hashlib.md5).hexdigest() + + pkgInfos[platform] = (pkgName, md5) + +print("已发布 " + tag, flush=True) + +# 更新 version.json +# 此步应在发布版本之后,因为程序使用 version.json 检查更新 +os.chdir("..") +with open("version.json", "w", encoding="utf-8") as f: + json.dump( + { + "version": f"{majorVersion}.{minorVersion}.{patchVersion}", + "tag": tag, + "binary": { + "x64": { + "url": f"https://github.com/{repo}/releases/download/{tag}/{pkgInfos['x64'][0]}", + "hash": pkgInfos["x64"][1], + }, + "ARM64": { + "url": f"https://github.com/{repo}/releases/download/{tag}/{pkgInfos['ARM64'][0]}", + "hash": pkgInfos["ARM64"][1], + }, + }, + }, + f, + indent=4, + ) + +# 提交对 version.json 的更改 +if subprocess.run("git add version.json").returncode != 0: + raise Exception("git add 失败") + +if subprocess.run('git commit -m "Update version.json"').returncode != 0: + raise Exception("git commit 失败") + +if subprocess.run("git push").returncode != 0: + raise Exception("git push 失败") diff --git a/publish.py b/publish.py index 9831aeb6b..ab1da1722 100644 --- a/publish.py +++ b/publish.py @@ -18,31 +18,18 @@ except: pass +platform = "x64" +if len(sys.argv) == 2: + platform = sys.argv[1] + if not platform in ["x64", "ARM64"]: + raise Exception("非法参数") + if majorVersion != None: import re - import hashlib - import json - - # 使用第三方库 requests 发送 HTTP 请求,它是 Conan 的依赖项,无需单独安装 - import requests minorVersion = os.environ["MINOR"] patchVersion = os.environ["PATCH"] - - tag = "" - try: - tag = os.environ["TAG"] - except: - pass - - if tag == "": - tag = f"v{majorVersion}.{minorVersion}.{patchVersion}" - - isPrerelease = os.environ["PRERELEASE"].lower() == "true" - - githubAccessToken = os.environ["ACCESS_TOKEN"] - repo = os.environ["GITHUB_REPOSITORY"] - actor = os.environ["GITHUB_ACTOR"] + tag = os.environ["TAG"] ##################################################################### # @@ -111,7 +98,7 @@ version_props = "" p = subprocess.run( - f'"{msbuildPath}" -restore -p:RestorePackagesConfig=true;Configuration=Release;Platform=x64;OutDir={os.getcwd()}\\publish\\;CommitId={commit_id}{version_props} Magpie.sln' + f'"{msbuildPath}" -restore -p:RestorePackagesConfig=true;Configuration=Release;Platform={platform};OutDir={os.getcwd()}\\publish\\{platform}\\;CommitId={commit_id}{version_props} Magpie.sln' ) if p.returncode != 0: raise Exception("编译失败") @@ -122,7 +109,7 @@ # ##################################################################### -os.chdir("publish") +os.chdir("publish\\" + platform) # 删除文件,忽略错误 @@ -225,138 +212,3 @@ def remove_file(file): os.remove("priconfig.xml") print("已修剪 resources.pri", flush=True) - -##################################################################### -# -# 发布 -# -##################################################################### - -if majorVersion != None: - os.chdir("..") - - subprocess.run("git config user.name " + actor) - subprocess.run(f"git config user.email {actor}@users.noreply.github.com") - - subprocess.run( - f"git remote set-url origin https://{githubAccessToken}@github.com/{repo}.git" - ) - - # 打标签 - if subprocess.run(f"git tag -a {tag} -m {tag}").returncode != 0: - raise Exception("打标签失败") - - if subprocess.run("git push origin " + tag).returncode != 0: - raise Exception("推送标签失败") - - print("已创建标签 " + tag, flush=True) - - # 打包成 zip - pkgName = "Magpie-" + tag + "-x64" - shutil.make_archive(pkgName, "zip", "publish") - pkgName += ".zip" - - headers = { - "Accept": "application/vnd.github+json", - "Authorization": "Bearer " + githubAccessToken, - "X-GitHub-Api-Version": "2022-11-28", - } - - # 获取前一个发布版本来生成默认发行说明 - prevReleaseTag = None - try: - if isPrerelease: - # 发布预发行版与最新的版本(无论是正式版还是预发行版)对比 - response = requests.get( - f"https://api.github.com/repos/{repo}/releases", - json={ - "per_page": 1 - }, - headers=headers - ) - if response.ok: - prevReleaseTag = response.json()[0]["tag_name"] - else: - # 发布正式版则与最新的正式版对比 - # 由于可以自己选择最新版本,此接口可能不会返回时间上最新发布的版本,不是大问题 - response = requests.get(f"https://api.github.com/repos/{repo}/releases/latest", headers=headers) - if response.ok: - prevReleaseTag = response.json()["tag_name"] - except: - # 忽略错误 - pass - - # 发布 release - if prevReleaseTag == None: - body = "" - else: - # 默认发行说明为比较两个 tag - body = f"https://github.com/{repo}/compare/{prevReleaseTag}...{tag}" - - response = requests.post( - f"https://api.github.com/repos/{repo}/releases", - json={ - "tag_name": tag, - "name": tag, - "prerelease": isPrerelease, - "body": body, - "discussion_category_name": "Announcements", - }, - headers=headers, - ) - if not response.ok: - raise Exception("发布失败") - - upload_url = response.json()["upload_url"] - upload_url = upload_url[: upload_url.find("{")] + "?name=" + pkgName - - # 上传资产 - with open(pkgName, "rb") as f: - # 流式上传 - # https://requests.readthedocs.io/en/latest/user/advanced/#streaming-uploads - response = requests.post( - upload_url, - data=f, - headers={**headers, "Content-Type": "application/zip"}, - ) - - if not response.ok: - raise Exception("上传失败") - - # 计算哈希 - f.seek(0, os.SEEK_SET) - md5 = hashlib.file_digest(f, hashlib.md5).hexdigest() - - print("已发布 " + tag, flush=True) - - # 丢弃当前修改并更新到最新,防止编译时有新的提交 - subprocess.run("git checkout -f") - subprocess.run("git pull") - - # 更新 version.json - # 此步应在发布版本之后,因为程序使用 version.json 检查更新 - with open("version.json", "w", encoding="utf-8") as f: - json.dump( - { - "version": f"{majorVersion}.{minorVersion}.{patchVersion}", - "tag": tag, - "binary": { - "x64": { - "url": f"https://github.com/{repo}/releases/download/{tag}/{pkgName}", - "hash": md5, - } - }, - }, - f, - indent=4, - ) - - # 提交对 version.json 的更改 - if subprocess.run("git add version.json").returncode != 0: - raise Exception("git add 失败") - - if subprocess.run('git commit -m "Update version.json"').returncode != 0: - raise Exception("git commit 失败") - - if subprocess.run("git push").returncode != 0: - raise Exception("git push 失败") diff --git a/src/Magpie.App/App.cpp b/src/Magpie.App/App.cpp index 95a894d3a..043c60d4e 100644 --- a/src/Magpie.App/App.cpp +++ b/src/Magpie.App/App.cpp @@ -30,10 +30,20 @@ #include "EffectsService.h" #include "UpdateService.h" #include "LocalizationService.h" +#include "Logger.h" namespace winrt::Magpie::App::implementation { App::App() { + UnhandledException([this](IInspectable const&, UnhandledExceptionEventArgs const& e) { + Logger::Get().ComCritical("未处理的异常", e.Exception().value); + + if (IsDebuggerPresent()) { + hstring errorMessage = e.Message(); + __debugbreak(); + } + }); + EffectsService::Get().StartInitialize(); // 初始化 XAML 框架 diff --git a/src/Magpie.App/App.h b/src/Magpie.App/App.h index 24e91fe1f..3213a243c 100644 --- a/src/Magpie.App/App.h +++ b/src/Magpie.App/App.h @@ -1,11 +1,10 @@ #pragma once #include "App.g.h" -#include "App.base.h" #include namespace winrt::Magpie::App::implementation { -class App : public AppT2 { +class App : public App_base { public: App(); ~App(); @@ -61,6 +60,34 @@ class App : public AppT2 { event> _hostWndFocusChangedEvent; bool _isHostWndFocused = false; bool _isClosed = false; + + //////////////////////////////////////////////////// + // + // IXamlMetadataProvider 相关 + // + ///////////////////////////////////////////////////// +public: + Markup::IXamlType GetXamlType(Interop::TypeName const& type) { + return _AppProvider()->GetXamlType(type); + } + + Markup::IXamlType GetXamlType(hstring const& fullName) { + return _AppProvider()->GetXamlType(fullName); + } + + com_array GetXmlnsDefinitions() { + return _AppProvider()->GetXmlnsDefinitions(); + } + +private: + com_ptr _AppProvider() { + if (!_appProvider) { + _appProvider = make_self(); + } + return _appProvider; + } + + com_ptr _appProvider; }; } diff --git a/src/Magpie.App/Magpie.App.def b/src/Magpie.App/Magpie.App.def new file mode 100644 index 000000000..d04a02ea8 --- /dev/null +++ b/src/Magpie.App/Magpie.App.def @@ -0,0 +1,3 @@ +EXPORTS +DllCanUnloadNow = WINRT_CanUnloadNow PRIVATE +DllGetActivationFactory = WINRT_GetActivationFactory PRIVATE diff --git a/src/Magpie.App/Magpie.App.vcxproj b/src/Magpie.App/Magpie.App.vcxproj index 5805865bb..12afdccc3 100644 --- a/src/Magpie.App/Magpie.App.vcxproj +++ b/src/Magpie.App/Magpie.App.vcxproj @@ -12,20 +12,20 @@ true Windows Store 10.0 - 10.0.22621.0 + 10.0.22621.0 10.0.18362.0 true true Magpie.App true - x64 + $(Platform) Language=en-US false true <_NoWinAPIFamilyApp>true <_VC_Target_Library_Platform>Desktop false - $(SolutionDir)\bin\$(Platform)\$(Configuration)\ + $(SolutionDir)bin\$(Platform)\$(Configuration)\ nested @@ -51,14 +51,16 @@ - - /DWINRT_NO_MAKE_DETECTION %(AdditionalOptions) + + + _WINRT_DLL;_VSDESIGNER_DONT_LOAD_AS_DLL;%(PreprocessorDefinitions) ..\Magpie.Core\include;%(AdditionalIncludeDirectories) false Console kernel32.lib;ole32.lib;oleaut32.lib;user32.lib;gdi32.lib;$(OutDir)..\Magpie.Core.lib;%(AdditionalDependencies) + Magpie.App.def @@ -70,7 +72,6 @@ AboutViewModel.idl Code - @@ -404,6 +405,7 @@ + Designer diff --git a/src/Magpie.App/Magpie.App.vcxproj.filters b/src/Magpie.App/Magpie.App.vcxproj.filters index 8be64fbd8..1670dcc35 100644 --- a/src/Magpie.App/Magpie.App.vcxproj.filters +++ b/src/Magpie.App/Magpie.App.vcxproj.filters @@ -113,7 +113,6 @@ Helpers - Services @@ -230,6 +229,7 @@ Controls + diff --git a/src/Magpie.App/UpdateService.cpp b/src/Magpie.App/UpdateService.cpp index c9c6d1d81..2dfef3076 100644 --- a/src/Magpie.App/UpdateService.cpp +++ b/src/Magpie.App/UpdateService.cpp @@ -146,21 +146,30 @@ fire_and_forget UpdateService::CheckForUpdatesAsync(bool isAutoUpdate) { co_return; } auto binaryObj = binaryNode->value.GetObj(); - auto x64Node = binaryObj.FindMember("x64"); - if (x64Node == binaryObj.end()) { - Logger::Get().Error("找不到 x64 成员"); - _Status(UpdateStatus::ErrorWhileChecking); + const char* platform = +#ifdef _M_X64 + "x64"; +#elif defined(_M_ARM64) + "ARM64"; +#else + static_assert(false, "不支持的架构") +#endif + auto platformNode = binaryObj.FindMember(platform); + if (platformNode == binaryObj.end()) { + Logger::Get().Error(StrUtils::Concat("找不到 ", platform, "成员")); + // 还不支持此架构 + _Status(UpdateStatus::NoUpdate); co_return; } - if (!x64Node->value.IsObject()) { - Logger::Get().Error("x64 成员不是对象"); + if (!platformNode->value.IsObject()) { + Logger::Get().Error(StrUtils::Concat(platform, " 成员不是对象")); _Status(UpdateStatus::ErrorWhileChecking); co_return; } - auto x64Obj = x64Node->value.GetObj(); + auto platformObj = platformNode->value.GetObj(); - auto urlNode = x64Obj.FindMember("url"); - if (urlNode == x64Obj.end()) { + auto urlNode = platformObj.FindMember("url"); + if (urlNode == platformObj.end()) { Logger::Get().Error("找不到 url 成员"); _Status(UpdateStatus::ErrorWhileChecking); co_return; @@ -177,8 +186,8 @@ fire_and_forget UpdateService::CheckForUpdatesAsync(bool isAutoUpdate) { co_return; } - auto hashNode = x64Obj.FindMember("hash"); - if (hashNode == x64Obj.end()) { + auto hashNode = platformObj.FindMember("hash"); + if (hashNode == platformObj.end()) { Logger::Get().Error("找不到 hash 成员"); _Status(UpdateStatus::ErrorWhileChecking); co_return; diff --git a/src/Magpie.App/app.base.h b/src/Magpie.App/app.base.h deleted file mode 100644 index ab48f8452..000000000 --- a/src/Magpie.App/app.base.h +++ /dev/null @@ -1,35 +0,0 @@ -#pragma once - -namespace winrt::Magpie::App::implementation { - -template -struct App_baseWithProvider : public App_base { - using IXamlType = Windows::UI::Xaml::Markup::IXamlType; - - IXamlType GetXamlType(Windows::UI::Xaml::Interop::TypeName const& type) { - return AppProvider()->GetXamlType(type); - } - - IXamlType GetXamlType(hstring const& fullName) { - return AppProvider()->GetXamlType(fullName); - } - - com_array GetXmlnsDefinitions() { - return AppProvider()->GetXmlnsDefinitions(); - } - -private: - bool _contentLoaded{ false }; - com_ptr _appProvider; - com_ptr AppProvider() { - if (!_appProvider) { - _appProvider = make_self(); - } - return _appProvider; - } -}; - -template -using AppT2 = App_baseWithProvider; - -} diff --git a/src/Magpie.Core/Magpie.Core.vcxproj b/src/Magpie.Core/Magpie.Core.vcxproj index 1bcbe36bc..4647daba9 100644 --- a/src/Magpie.Core/Magpie.Core.vcxproj +++ b/src/Magpie.Core/Magpie.Core.vcxproj @@ -8,7 +8,7 @@ Magpie.Core 10.0.22621.0 Magpie.Core - $(SolutionDir)\bin\$(Platform)\$(Configuration)\ + $(SolutionDir)bin\$(Platform)\$(Configuration)\ @@ -24,7 +24,7 @@ - + diff --git a/src/Magpie/Magpie.vcxproj b/src/Magpie/Magpie.vcxproj index e2ed51538..92a86923e 100644 --- a/src/Magpie/Magpie.vcxproj +++ b/src/Magpie/Magpie.vcxproj @@ -8,10 +8,8 @@ {1801171b-65b6-400f-92ff-73eaf499cfb3} Magpie 10.0.22621.0 - Magpie.App - $(SolutionDir)\obj\$(Platform)\$(Configuration)\$(AppProjectName)\;$(SolutionDir)\obj\$(Platform)\$(Configuration)\$(AppProjectName)\Generated Files\; - $(SolutionDir)\bin\$(Platform)\$(Configuration)\ + $(SolutionDir)bin\$(Platform)\$(Configuration)\ true @@ -30,12 +28,9 @@ - + - - - Fast @@ -81,6 +76,11 @@ false + + + {1239537c-e5b8-427a-9e7f-ea443d1f3529} + + diff --git a/src/Magpie/XamlIslands.targets b/src/Magpie/XamlIslands.targets index e44305246..bd3066b17 100644 --- a/src/Magpie/XamlIslands.targets +++ b/src/Magpie/XamlIslands.targets @@ -1,5 +1,5 @@ - + From b60ff120e6408eb9740f1988e137ad4202d3a23e Mon Sep 17 00:00:00 2001 From: Xu <34770031+Blinue@users.noreply.github.com> Date: Sun, 31 Dec 2023 19:52:37 +0800 Subject: [PATCH 093/155] =?UTF-8?q?chore:=20=E5=AE=9A=E4=B9=89=20DISABLE?= =?UTF-8?q?=5FXAML=5FGENERATED=5FMAIN?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Magpie.App/Magpie.App.vcxproj | 2 +- src/Magpie/Magpie.vcxproj | 2 +- src/Magpie/MainWindow.cpp | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Magpie.App/Magpie.App.vcxproj b/src/Magpie.App/Magpie.App.vcxproj index 12afdccc3..0c0dadbc8 100644 --- a/src/Magpie.App/Magpie.App.vcxproj +++ b/src/Magpie.App/Magpie.App.vcxproj @@ -53,7 +53,7 @@ - _WINRT_DLL;_VSDESIGNER_DONT_LOAD_AS_DLL;%(PreprocessorDefinitions) + _WINRT_DLL;_VSDESIGNER_DONT_LOAD_AS_DLL;DISABLE_XAML_GENERATED_MAIN;%(PreprocessorDefinitions) ..\Magpie.Core\include;%(AdditionalIncludeDirectories) diff --git a/src/Magpie/Magpie.vcxproj b/src/Magpie/Magpie.vcxproj index 92a86923e..a2d2b8482 100644 --- a/src/Magpie/Magpie.vcxproj +++ b/src/Magpie/Magpie.vcxproj @@ -8,7 +8,7 @@ {1801171b-65b6-400f-92ff-73eaf499cfb3} Magpie 10.0.22621.0 - + $(SolutionDir)bin\$(Platform)\$(Configuration)\ diff --git a/src/Magpie/MainWindow.cpp b/src/Magpie/MainWindow.cpp index 5e5113d8c..069a4094b 100644 --- a/src/Magpie/MainWindow.cpp +++ b/src/Magpie/MainWindow.cpp @@ -259,7 +259,7 @@ std::pair MainWindow::_CreateWindow(HINSTANCE hInstance, winrt::Poi MONITORINFO mi{ sizeof(mi) }; GetMonitorInfo(hMon, &mi); - // 确保启动位置在屏幕工作区内。不允许启动时跨越多个屏幕。 + // 确保启动位置在屏幕工作区内。不允许启动时跨越多个屏幕 if (windowSize.cx <= mi.rcWork.right - mi.rcWork.left && windowSize.cy <= mi.rcWork.bottom - mi.rcWork.top) { windowPos.x = std::lroundf(windowCenter.X - windowSizeInPixels.Width / 2); windowPos.x = std::clamp(windowPos.x, mi.rcWork.left, mi.rcWork.right - windowSize.cx); From 8dadcfe2d2dc3e75a3d6f1a3f28becb802ca3695 Mon Sep 17 00:00:00 2001 From: Xu <34770031+Blinue@users.noreply.github.com> Date: Tue, 2 Jan 2024 22:36:16 +0800 Subject: [PATCH 094/155] =?UTF-8?q?feat:=20=E5=85=89=E6=A0=87=E7=A7=BB?= =?UTF-8?q?=E5=8A=A8=E5=88=B0=E5=8F=A0=E5=8A=A0=E5=B1=82=E6=97=B6=E9=87=8A?= =?UTF-8?q?=E6=94=BE=E6=8D=95=E8=8E=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Magpie.Core/CursorManager.cpp | 124 ++++++++++++++++++++++-------- src/Magpie.Core/CursorManager.h | 11 ++- src/Magpie.Core/ImGuiImpl.cpp | 57 ++++---------- src/Magpie.Core/OverlayDrawer.cpp | 12 ++- src/Magpie.Core/Renderer.cpp | 26 ++++--- src/Magpie.Core/Renderer.h | 3 +- src/Magpie.Core/ScalingWindow.cpp | 24 ++++-- 7 files changed, 160 insertions(+), 97 deletions(-) diff --git a/src/Magpie.Core/CursorManager.cpp b/src/Magpie.Core/CursorManager.cpp index d2af946b7..6b449c07f 100644 --- a/src/Magpie.Core/CursorManager.cpp +++ b/src/Magpie.Core/CursorManager.cpp @@ -74,6 +74,10 @@ static POINT ScalingToSrc(POINT pt) noexcept { } CursorManager::~CursorManager() noexcept { + if (_isCapturedOnOverlay) { + ReleaseCapture(); + } + if (_curClips != RECT{}) { ClipCursor(nullptr); } @@ -105,9 +109,7 @@ void CursorManager::Update() noexcept { _hCursor = NULL; _cursorPos = { std::numeric_limits::max(),std::numeric_limits::max() }; - const ScalingOptions& options = ScalingWindow::Get().Options(); - - if (!options.IsDrawCursor()) { + if (!ScalingWindow::Get().Options().IsDrawCursor()) { return; } @@ -118,31 +120,45 @@ void CursorManager::Update() noexcept { } } - CURSORINFO ci{ sizeof(CURSORINFO) }; + CURSORINFO ci{ .cbSize = sizeof(CURSORINFO) }; if (!GetCursorInfo(&ci)) { Logger::Get().Win32Error("GetCursorPos 失败"); return; } - if (ci.hCursor && ci.flags != CURSOR_SHOWING) { + if (!ci.hCursor || ci.flags != CURSOR_SHOWING) { return; } - // 不处于捕获状态置为 NULL - _hCursor = _isUnderCapture ? ci.hCursor : NULL; + _hCursor = ci.hCursor; + // 不处于捕获状态则位于叠加层上 _cursorPos = _isUnderCapture ? SrcToScaling(ci.ptScreenPos) : ci.ptScreenPos; const RECT& scalingRect = ScalingWindow::Get().WndRect(); _cursorPos.x -= scalingRect.left; _cursorPos.y -= scalingRect.top; } -void CursorManager::OnCursorHoverOverlay() noexcept { - _isOnOverlay = true; +void CursorManager::IsCursorOnOverlay(bool value) noexcept { + if (_isOnOverlay == value) { + return; + } + _isOnOverlay = value; + _UpdateCursorClip(); } -void CursorManager::OnCursorLeaveOverlay() noexcept { - _isOnOverlay = false; +void CursorManager::IsCursorCapturedOnOverlay(bool value) noexcept { + if (_isCapturedOnOverlay == value) { + return; + } + _isCapturedOnOverlay = value; + + if (value) { + SetCapture(ScalingWindow::Get().Handle()); + } else { + ReleaseCapture(); + } + _UpdateCursorClip(); } @@ -313,6 +329,13 @@ void CursorManager::_UpdateCursorClip() noexcept { return; } + if (_isCapturedOnOverlay) { + // 光标被叠加层捕获时将光标限制在输出区域内 + _curClips = destRect; + ClipCursor(&destRect); + return; + } + const HWND hwndScaling = ScalingWindow::Get().Handle(); const RECT scalingRect = ScalingWindow::Get().WndRect(); const HWND hwndSrc = ScalingWindow::Get().HwndSrc(); @@ -350,10 +373,16 @@ void CursorManager::_UpdateCursorClip() noexcept { _StopCapture(cursorPos); } else { - // 判断源窗口是否被遮挡 - hwndCur = WindowFromPoint(hwndScaling, scalingRect, cursorPos, true); + // 主窗口未被遮挡 + bool stopCapture = _isOnOverlay; + + if (!stopCapture) { + // 判断源窗口是否被遮挡 + hwndCur = WindowFromPoint(hwndScaling, scalingRect, cursorPos, true); + stopCapture = hwndCur != hwndSrc && (!IsChild(hwndSrc, hwndCur) || !((GetWindowStyle(hwndCur) & WS_CHILD))); + } - if (hwndCur != hwndSrc && (!IsChild(hwndSrc, hwndCur) || !((GetWindowStyle(hwndCur) & WS_CHILD)))) { + if (stopCapture) { if (style | WS_EX_TRANSPARENT) { SetWindowLongPtr(hwndScaling, GWL_EXSTYLE, style & ~WS_EX_TRANSPARENT); } @@ -394,25 +423,52 @@ void CursorManager::_UpdateCursorClip() noexcept { if (!PtInRect(&srcRect, newCursorPos)) { // 跳过黑边 - POINT clampedPos = { - std::clamp(cursorPos.x, destRect.left, destRect.right - 1), - std::clamp(cursorPos.y, destRect.top, destRect.bottom - 1) - }; + if (_isOnOverlay) { + // 从内部移到外部 + // 此时有 UI 贴边 + if (newCursorPos.x >= srcRect.right) { + cursorPos.x += scalingRect.right - destRect.right; + } else if (newCursorPos.x < srcRect.left) { + cursorPos.x -= destRect.left - scalingRect.left; + } - if (WindowFromPoint(hwndScaling, scalingRect, clampedPos, false) == hwndScaling) { - if (!(style & WS_EX_TRANSPARENT)) { - SetWindowLongPtr(hwndScaling, GWL_EXSTYLE, style | WS_EX_TRANSPARENT); + if (newCursorPos.y >= srcRect.bottom) { + cursorPos.y += scalingRect.bottom - destRect.bottom; + } else if (newCursorPos.y < srcRect.top) { + cursorPos.y -= destRect.top - scalingRect.top; } - _StartCapture(cursorPos); + if (MonitorFromPoint(cursorPos, MONITOR_DEFAULTTONULL)) { + SetCursorPos(cursorPos.x, cursorPos.y); + } else { + // 目标位置不存在屏幕,则将光标限制在输出区域内 + SetCursorPos( + std::clamp(cursorPos.x, destRect.left, destRect.right - 1), + std::clamp(cursorPos.y, destRect.top, destRect.bottom - 1) + ); + } } else { - // 要跳跃的位置被遮挡 - if (style | WS_EX_TRANSPARENT) { - SetWindowLongPtr(hwndScaling, GWL_EXSTYLE, style & ~WS_EX_TRANSPARENT); + // 从外部移到内部 + const POINT clampedPos { + std::clamp(cursorPos.x, destRect.left, destRect.right - 1), + std::clamp(cursorPos.y, destRect.top, destRect.bottom - 1) + }; + + if (WindowFromPoint(hwndScaling, scalingRect, clampedPos, false) == hwndScaling) { + if (!(style & WS_EX_TRANSPARENT)) { + SetWindowLongPtr(hwndScaling, GWL_EXSTYLE, style | WS_EX_TRANSPARENT); + } + + _StartCapture(cursorPos); + } else { + // 要跳跃的位置被遮挡 + if (style | WS_EX_TRANSPARENT) { + SetWindowLongPtr(hwndScaling, GWL_EXSTYLE, style & ~WS_EX_TRANSPARENT); + } } } } else { - bool startCapture = true; + bool startCapture = !_isOnOverlay; if (startCapture) { // 判断源窗口是否被遮挡 @@ -439,7 +495,7 @@ void CursorManager::_UpdateCursorClip() noexcept { return; } - if (!false && !_isUnderCapture) { + if (!_isUnderCapture && !_isOnOverlay) { return; } @@ -447,32 +503,32 @@ void CursorManager::_UpdateCursorClip() noexcept { // 处理屏幕之间存在间隙的情况。解决办法是 _StopCapture 只在目标位置存在屏幕时才取消捕获, // 当光标试图移动到间隙中时将被挡住。如果光标的速度足以跨越间隙,则它依然可以在屏幕间移动。 ::GetCursorPos(&cursorPos); - POINT hostPos = false ? cursorPos : SrcToScaling(cursorPos); + POINT hostPos = _isOnOverlay ? cursorPos : SrcToScaling(cursorPos); RECT clips{ LONG_MIN, LONG_MIN, LONG_MAX, LONG_MAX }; // left RECT rect{ LONG_MIN, hostPos.y, scalingRect.left, hostPos.y + 1 }; if (!MonitorFromRect(&rect, MONITOR_DEFAULTTONULL)) { - clips.left = false ? destRect.left : srcRect.left; + clips.left = _isOnOverlay ? destRect.left : srcRect.left; } // top rect = { hostPos.x, LONG_MIN, hostPos.x + 1,scalingRect.top }; if (!MonitorFromRect(&rect, MONITOR_DEFAULTTONULL)) { - clips.top = false ? destRect.top : srcRect.top; + clips.top = _isOnOverlay ? destRect.top : srcRect.top; } // right rect = { scalingRect.right, hostPos.y, LONG_MAX, hostPos.y + 1 }; if (!MonitorFromRect(&rect, MONITOR_DEFAULTTONULL)) { - clips.right = false ? destRect.right : srcRect.right; + clips.right = _isOnOverlay ? destRect.right : srcRect.right; } // bottom rect = { hostPos.x, scalingRect.bottom, hostPos.x + 1, LONG_MAX }; if (!MonitorFromRect(&rect, MONITOR_DEFAULTTONULL)) { - clips.bottom = false ? destRect.bottom : srcRect.bottom; + clips.bottom = _isOnOverlay ? destRect.bottom : srcRect.bottom; } if (clips != _curClips) { @@ -486,6 +542,8 @@ void CursorManager::_StartCapture(POINT cursorPos) noexcept { return; } + OutputDebugString(L"start"); + const Renderer& renderer = ScalingWindow::Get().Renderer(); const RECT& srcRect = renderer.SrcRect(); const RECT& destRect = renderer.DestRect(); @@ -527,6 +585,8 @@ void CursorManager::_StopCapture(POINT cursorPos, bool onDestroy) noexcept { return; } + OutputDebugString(L"stop"); + if (_curClips != RECT{}) { _curClips = {}; ClipCursor(nullptr); diff --git a/src/Magpie.Core/CursorManager.h b/src/Magpie.Core/CursorManager.h index 5a04d853b..ea67c41cf 100644 --- a/src/Magpie.Core/CursorManager.h +++ b/src/Magpie.Core/CursorManager.h @@ -23,9 +23,15 @@ class CursorManager { return _cursorPos; } - void OnCursorHoverOverlay() noexcept; + bool IsCursorOnOverlay() const noexcept { + return _isOnOverlay; + } + void IsCursorOnOverlay(bool value) noexcept; - void OnCursorLeaveOverlay() noexcept; + bool IsCursorCapturedOnOverlay() const noexcept { + return _isCapturedOnOverlay; + } + void IsCursorCapturedOnOverlay(bool value) noexcept; private: void _ShowSystemCursor(bool show); @@ -48,6 +54,7 @@ class CursorManager { bool _isOnScalingWindow = false; bool _isOnOverlay = false; + bool _isCapturedOnOverlay = false; }; } diff --git a/src/Magpie.Core/ImGuiImpl.cpp b/src/Magpie.Core/ImGuiImpl.cpp index f2b75353b..543a44ac0 100644 --- a/src/Magpie.Core/ImGuiImpl.cpp +++ b/src/Magpie.Core/ImGuiImpl.cpp @@ -130,8 +130,6 @@ void ImGuiImpl::NewFrame() noexcept { io.AddKeyEvent(ImGuiKey_Enter, false); } - const bool originWantCaptureMouse = io.WantCaptureMouse; - ImGui::NewFrame(); // 将所有 ImGUI 窗口限制在视口内 @@ -157,17 +155,7 @@ void ImGuiImpl::NewFrame() noexcept { ImGui::SetWindowPos(window, pos); } - CursorManager& cm = ScalingWindow::Get().CursorManager(); - - if (io.WantCaptureMouse) { - if (!originWantCaptureMouse) { - cm.OnCursorHoverOverlay(); - } - } else { - if (originWantCaptureMouse) { - cm.OnCursorLeaveOverlay(); - } - } + ScalingWindow::Get().CursorManager().IsCursorOnOverlay(io.WantCaptureMouse); } void ImGuiImpl::Draw() noexcept { @@ -256,42 +244,35 @@ void ImGuiImpl::_UpdateMousePos() noexcept { } void ImGuiImpl::ClearStates() noexcept { - /*ImGuiIO& io = ImGui::GetIO(); + ImGuiIO& io = ImGui::GetIO(); io.MousePos = ImVec2(-FLT_MAX, -FLT_MAX); std::fill(std::begin(io.MouseDown), std::end(io.MouseDown), false); - auto& cm = ScalingWindow::Get().CursorManager(); - if (cm.IsCursorCapturedOnOverlay()) { - if (GetCapture() == MagApp::Get().GetHwndHost()) { - ReleaseCapture(); - } - cm.OnCursorReleasedOnOverlay(); - } - - if (cm.IsCursorOnOverlay()) { - cm.OnCursorLeaveOverlay(); - } + CursorManager& cursorManager = ScalingWindow::Get().CursorManager(); + cursorManager.IsCursorCapturedOnOverlay(false); + cursorManager.IsCursorOnOverlay(false); // 更新状态 - ImGui::BeginFrame(); + ImGui::NewFrame(); ImGui::EndFrame(); if (io.WantCaptureMouse) { // 拖拽时隐藏 UI 需渲染两帧才能重置 WantCaptureMouse - ImGui::BeginFrame(); + ImGui::NewFrame(); ImGui::EndFrame(); - }*/ + } } void ImGuiImpl::MessageHandler(UINT msg, WPARAM wParam, LPARAM /*lParam*/) noexcept { ImGuiIO& io = ImGui::GetIO(); - /*if (!io.WantCaptureMouse) { - if (msg == WM_LBUTTONDOWN && MagApp::Get().GetOptions().Is3DGameMode()) { - MagApp::Get().GetRenderer().SetUIVisibility(false); + if (!io.WantCaptureMouse) { + // 3D 游戏模式下显示叠加层会使缩放窗口不透明,这时点击非叠加层区域应关闭叠加层 + if (msg == WM_LBUTTONDOWN && ScalingWindow::Get().Options().Is3DGameMode()) { + ScalingWindow::Get().Renderer().IsOverlayVisible(false); } - return std::nullopt; - }*/ + return; + } // 缩放窗口不会收到双击消息 switch (msg) { @@ -299,10 +280,7 @@ void ImGuiImpl::MessageHandler(UINT msg, WPARAM wParam, LPARAM /*lParam*/) noexc case WM_RBUTTONDOWN: { if (!ImGui::IsAnyMouseDown()) { - if (!GetCapture()) { - SetCapture(ScalingWindow::Get().Handle()); - } - //MagApp::Get().GetCursorManager().OnCursorCapturedOnOverlay(); + ScalingWindow::Get().CursorManager().IsCursorCapturedOnOverlay(true); } io.MouseDown[msg == WM_LBUTTONDOWN ? 0 : 1] = true; @@ -314,10 +292,7 @@ void ImGuiImpl::MessageHandler(UINT msg, WPARAM wParam, LPARAM /*lParam*/) noexc io.MouseDown[msg == WM_LBUTTONUP ? 0 : 1] = false; if (!ImGui::IsAnyMouseDown()) { - if (GetCapture() == ScalingWindow::Get().Handle()) { - ReleaseCapture(); - } - //MagApp::Get().GetCursorManager().OnCursorReleasedOnOverlay(); + ScalingWindow::Get().CursorManager().IsCursorCapturedOnOverlay(false); } break; diff --git a/src/Magpie.Core/OverlayDrawer.cpp b/src/Magpie.Core/OverlayDrawer.cpp index d4dcce955..16c04ca37 100644 --- a/src/Magpie.Core/OverlayDrawer.cpp +++ b/src/Magpie.Core/OverlayDrawer.cpp @@ -88,11 +88,21 @@ void OverlayDrawer::SetUIVisibility(bool value) noexcept { } _isUIVisiable = value; + if (value) { + Logger::Get().Info("已开启叠加层"); + } else { + if (!ScalingWindow::Get().Options().IsShowFPS()) { + _imguiImpl.ClearStates(); + } + Logger::Get().Info("已关闭叠加层"); + } } void OverlayDrawer::MessageHandler(UINT msg, WPARAM wParam, LPARAM lParam) noexcept { - _imguiImpl.MessageHandler(msg, wParam, lParam); + if (_isUIVisiable || ScalingWindow::Get().Options().IsShowFPS()) { + _imguiImpl.MessageHandler(msg, wParam, lParam); + } } static const std::wstring& GetAppLanguage() noexcept { diff --git a/src/Magpie.Core/Renderer.cpp b/src/Magpie.Core/Renderer.cpp index f07115e39..dc49cc5b8 100644 --- a/src/Magpie.Core/Renderer.cpp +++ b/src/Magpie.Core/Renderer.cpp @@ -293,20 +293,22 @@ void Renderer::Render() noexcept { _FrontendRender(); } -void Renderer::ToggleOverlay() noexcept { - if (!_overlayDrawer) { - _overlayDrawer = std::make_unique(); - if (!_overlayDrawer->Initialize(&_frontendResources)) { - _overlayDrawer.reset(); - Logger::Get().Error("初始化 OverlayDrawer 失败"); - return; +void Renderer::IsOverlayVisible(bool value) noexcept { + if (value) { + if (!_overlayDrawer) { + _overlayDrawer = std::make_unique(); + if (!_overlayDrawer->Initialize(&_frontendResources)) { + _overlayDrawer.reset(); + Logger::Get().Error("初始化 OverlayDrawer 失败"); + return; + } } - } - - if (_overlayDrawer->IsUIVisiable()) { - _overlayDrawer->SetUIVisibility(false); - } else { + _overlayDrawer->SetUIVisibility(true); + } else { + if (_overlayDrawer) { + _overlayDrawer->SetUIVisibility(false); + } } // 立即渲染一帧 diff --git a/src/Magpie.Core/Renderer.h b/src/Magpie.Core/Renderer.h index 641d0aed2..b2319f190 100644 --- a/src/Magpie.Core/Renderer.h +++ b/src/Magpie.Core/Renderer.h @@ -22,8 +22,7 @@ class Renderer { void Render() noexcept; - void ToggleOverlay() noexcept; - + void IsOverlayVisible(bool value) noexcept; bool IsOverlayVisible() noexcept; const RECT& SrcRect() const noexcept { diff --git a/src/Magpie.Core/ScalingWindow.cpp b/src/Magpie.Core/ScalingWindow.cpp index 9c6f3cedf..48c2f0a2d 100644 --- a/src/Magpie.Core/ScalingWindow.cpp +++ b/src/Magpie.Core/ScalingWindow.cpp @@ -204,7 +204,7 @@ void ScalingWindow::Render() noexcept { } void ScalingWindow::ToggleOverlay() noexcept { - _renderer->ToggleOverlay(); + _renderer->IsOverlayVisible(!_renderer->IsOverlayVisible()); } LRESULT ScalingWindow::_MessageHandler(UINT msg, WPARAM wParam, LPARAM lParam) noexcept { @@ -219,6 +219,7 @@ LRESULT ScalingWindow::_MessageHandler(UINT msg, WPARAM wParam, LPARAM lParam) n // 在以下情况下会收到光标消息: // 1、未捕获光标且缩放后的位置未被遮挡而缩放前的位置被遮挡 // 2、光标位于叠加层上 + // 这时鼠标点击将激活源窗口 const HWND hwndForground = GetForegroundWindow(); if (hwndForground != _hwndSrc) { if (!Win32Utils::SetForegroundWindow(_hwndSrc)) { @@ -233,12 +234,21 @@ LRESULT ScalingWindow::_MessageHandler(UINT msg, WPARAM wParam, LPARAM lParam) n prevTimePoint = now; // 模拟按键关闭开始菜单 - INPUT inputs[4]{}; - inputs[0].type = INPUT_KEYBOARD; - inputs[0].ki.wVk = VK_LWIN; - inputs[1].type = INPUT_KEYBOARD; - inputs[1].ki.wVk = VK_LWIN; - inputs[1].ki.dwFlags = KEYEVENTF_KEYUP; + INPUT inputs[]{ + INPUT{ + .type = INPUT_KEYBOARD, + .ki = KEYBDINPUT{ + .wVk = VK_LWIN + } + }, + INPUT{ + .type = INPUT_KEYBOARD, + .ki = KEYBDINPUT{ + .wVk = VK_LWIN, + .dwFlags = KEYEVENTF_KEYUP + } + } + }; SendInput((UINT)std::size(inputs), inputs, sizeof(INPUT)); // 等待系统处理 From 7e60cfb870433e30870ec277afbc87c2d0b05e7a Mon Sep 17 00:00:00 2001 From: Xu <34770031+Blinue@users.noreply.github.com> Date: Sat, 13 Jan 2024 15:40:35 +0800 Subject: [PATCH 095/155] =?UTF-8?q?=E6=94=AF=E6=8C=81=20XAML=20=E7=83=AD?= =?UTF-8?q?=E9=87=8D=E8=BD=BD=20(#810)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * chore: 优化项目结构 * chore: 修复闪退 * fix: 修复游戏内覆盖导致闪退 * chore: 避免硬编码 Magpie.App/Resources * chore: 修复 CI * chore: 优化格式 --- Magpie.sln | 1 - publish.py | 5 +- src/Common.Post.props | 1 + src/HybridCRT.props | 4 +- src/Magpie.App/AboutPage.cpp | 4 +- src/Magpie.App/AboutViewModel.cpp | 7 +- src/Magpie.App/App.xaml | 8 +- src/Magpie.App/AppSettings.cpp | 21 ++- src/Magpie.App/HomeViewModel.cpp | 10 +- src/Magpie.App/Magpie.App.vcxproj | 60 ++++--- src/Magpie.App/Magpie.App.vcxproj.filters | 15 +- src/Magpie.App/NewProfileViewModel.cpp | 5 +- src/Magpie.App/Package.appxmanifest | 27 ---- src/Magpie.App/ProfileViewModel.cpp | 16 +- .../ScalingConfigurationViewModel.cpp | 15 +- src/Magpie.App/ScalingModeEffectItem.cpp | 7 +- src/Magpie.App/ScalingModeItem.cpp | 7 +- src/Magpie.App/SettingsPage.cpp | 7 +- src/Magpie.App/SettingsViewModel.cpp | 3 +- src/Magpie.App/ShortcutControl.cpp | 4 +- src/Magpie.App/ShortcutDialog.cpp | 7 +- src/Magpie.App/conanfile.txt | 6 +- src/Magpie.App/dummy.exe | 1 - src/Magpie.App/make_resources_pri.py | 48 ++++++ src/Magpie.Core/OverlayDrawer.cpp | 4 + src/Magpie.Core/OverlayDrawer.h | 4 +- src/Magpie/Magpie.vcxproj | 31 +++- src/Magpie/Magpie.vcxproj.filters | 1 - src/Magpie/TrayIconService.cpp | 3 +- src/Magpie/XamlIslands.targets | 153 ------------------ src/Magpie/app.manifest | 16 +- src/Magpie/conanfile.txt | 4 +- src/Shared/CommonSharedConstants.h | 4 +- src/WinUI.props | 45 ++++-- src/_ConanDeps/build_conan_deps.py | 2 +- src/extract_winui_runtime.py | 33 ++-- src/fix_resfiles.py | 15 -- 37 files changed, 275 insertions(+), 329 deletions(-) delete mode 100644 src/Magpie.App/Package.appxmanifest delete mode 100644 src/Magpie.App/dummy.exe create mode 100644 src/Magpie.App/make_resources_pri.py delete mode 100644 src/Magpie/XamlIslands.targets delete mode 100644 src/fix_resfiles.py diff --git a/Magpie.sln b/Magpie.sln index c311fc39e..b93c7277e 100644 --- a/Magpie.sln +++ b/Magpie.sln @@ -24,7 +24,6 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution src\Common.Pre.props = src\Common.Pre.props Directory.Build.props = Directory.Build.props src\extract_winui_runtime.py = src\extract_winui_runtime.py - src\fix_resfiles.py = src\fix_resfiles.py src\HybridCRT.props = src\HybridCRT.props src\WinUI.props = src\WinUI.props EndProjectSection diff --git a/publish.py b/publish.py index ab1da1722..64ad05526 100644 --- a/publish.py +++ b/publish.py @@ -120,10 +120,9 @@ def remove_file(file): pass -for folder in ["Microsoft.UI.Xaml", "Magpie.App"]: - shutil.rmtree(folder, ignore_errors=True) +shutil.rmtree("Microsoft.UI.Xaml", ignore_errors=True) -for pattern in ["*.pdb", "*.lib", "*.exp", "*.winmd", "*.xml", "*.xbf", "dummy.*"]: +for pattern in ["*.pdb", "*.lib", "*.exp", "*.winmd", "*.xml", "*.xbf"]: for file in glob.glob(pattern): remove_file(file) diff --git a/src/Common.Post.props b/src/Common.Post.props index 085fc6495..f543ca090 100644 --- a/src/Common.Post.props +++ b/src/Common.Post.props @@ -2,6 +2,7 @@ en-US + true true true low diff --git a/src/HybridCRT.props b/src/HybridCRT.props index 703e75893..cd3aff071 100644 --- a/src/HybridCRT.props +++ b/src/HybridCRT.props @@ -5,7 +5,7 @@ - + MultiThreadedDebug @@ -16,7 +16,7 @@ - + MultiThreaded diff --git a/src/Magpie.App/AboutPage.cpp b/src/Magpie.App/AboutPage.cpp index e4bbee1c2..f04d91282 100644 --- a/src/Magpie.App/AboutPage.cpp +++ b/src/Magpie.App/AboutPage.cpp @@ -4,6 +4,7 @@ #include "AboutPage.g.cpp" #endif #include "Win32Utils.h" +#include "CommonSharedConstants.h" namespace winrt::Magpie::App::implementation { @@ -12,7 +13,8 @@ void AboutPage::VersionTextBlock_DoubleTapped(IInspectable const&, Input::Double if (!_viewModel.IsDeveloperMode() && (GetAsyncKeyState(VK_MENU) & 0x8000)) { _viewModel.IsDeveloperMode(true); - hstring message = ResourceLoader::GetForCurrentView().GetString(L"About_DeveloperModeEnabled"); + const hstring message = ResourceLoader::GetForCurrentView(CommonSharedConstants::APP_RESOURCE_MAP_ID) + .GetString(L"About_DeveloperModeEnabled"); Application::Current().as().RootPage().ShowToast(message); } } diff --git a/src/Magpie.App/AboutViewModel.cpp b/src/Magpie.App/AboutViewModel.cpp index 31eb3c489..8a2f53645 100644 --- a/src/Magpie.App/AboutViewModel.cpp +++ b/src/Magpie.App/AboutViewModel.cpp @@ -8,6 +8,7 @@ #include "AppSettings.h" #include "StrUtils.h" #include "IconHelper.h" +#include "CommonSharedConstants.h" using namespace winrt; using namespace Windows::UI::Xaml::Media::Imaging; @@ -56,7 +57,8 @@ AboutViewModel::AboutViewModel() { } hstring AboutViewModel::Version() const noexcept { - ResourceLoader resourceLoader = ResourceLoader::GetForCurrentView(); + ResourceLoader resourceLoader = + ResourceLoader::GetForCurrentView(CommonSharedConstants::APP_RESOURCE_MAP_ID); return hstring(StrUtils::Concat( resourceLoader.GetString(L"About_Version_Version"), #ifdef MAGPIE_VERSION_TAG @@ -208,7 +210,8 @@ hstring AboutViewModel::UpdateCardTitle() const noexcept { return {}; } - ResourceLoader resourceLoader = ResourceLoader::GetForCurrentView(); + ResourceLoader resourceLoader = + ResourceLoader::GetForCurrentView(CommonSharedConstants::APP_RESOURCE_MAP_ID); hstring titleFmt = resourceLoader.GetString(L"Home_UpdateCard_Title"); return hstring(fmt::format(fmt::runtime(std::wstring_view(titleFmt)), updateService.Tag())); } diff --git a/src/Magpie.App/App.xaml b/src/Magpie.App/App.xaml index 2a40a70e7..4915ea450 100644 --- a/src/Magpie.App/App.xaml +++ b/src/Magpie.App/App.xaml @@ -7,10 +7,10 @@ - - - - + + + + diff --git a/src/Magpie.App/AppSettings.cpp b/src/Magpie.App/AppSettings.cpp index 52c4bd677..6404070ba 100644 --- a/src/Magpie.App/AppSettings.cpp +++ b/src/Magpie.App/AppSettings.cpp @@ -161,8 +161,10 @@ static HRESULT CALLBACK TaskDialogCallback( } static void ShowErrorMessage(const wchar_t* mainInstruction, const wchar_t* content) noexcept { - hstring errorStr = ResourceLoader::GetForCurrentView().GetString(L"AppSettings_Dialog_Error"); - hstring exitStr = ResourceLoader::GetForCurrentView().GetString(L"AppSettings_Dialog_Exit"); + ResourceLoader resourceLoader = + ResourceLoader::GetForCurrentView(CommonSharedConstants::APP_RESOURCE_MAP_ID); + const hstring errorStr = resourceLoader.GetString(L"AppSettings_Dialog_Error"); + const hstring exitStr = resourceLoader.GetString(L"AppSettings_Dialog_Exit"); TASKDIALOGCONFIG tdc{ sizeof(TASKDIALOGCONFIG) }; tdc.dwFlags = TDF_SIZE_TO_CONTENT; @@ -186,7 +188,8 @@ static bool ShowOkCancelWarningMessage( ) noexcept { TASKDIALOGCONFIG tdc{ sizeof(TASKDIALOGCONFIG) }; tdc.dwFlags = TDF_SIZE_TO_CONTENT; - hstring warningStr = ResourceLoader::GetForCurrentView().GetString(L"AppSettings_Dialog_Warning"); + const hstring warningStr = ResourceLoader::GetForCurrentView(CommonSharedConstants::APP_RESOURCE_MAP_ID) + .GetString(L"AppSettings_Dialog_Warning"); tdc.pszWindowTitle = warningStr.c_str(); tdc.pszMainIcon = TD_WARNING_ICON; tdc.pszMainInstruction = mainInstruction; @@ -229,7 +232,8 @@ bool AppSettings::Initialize() noexcept { std::string configText; if (!Win32Utils::ReadTextFile(_configPath.c_str(), configText)) { logger.Error("读取配置文件失败"); - ResourceLoader resourceLoader = ResourceLoader::GetForCurrentView(); + ResourceLoader resourceLoader = + ResourceLoader::GetForCurrentView(CommonSharedConstants::APP_RESOURCE_MAP_ID); hstring title = resourceLoader.GetString(L"AppSettings_ErrorDialog_ReadFailed"); hstring content = resourceLoader.GetString(L"AppSettings_ErrorDialog_ConfigLocation"); ShowErrorMessage(title.c_str(), fmt::format(fmt::runtime(std::wstring_view(content)), _configPath).c_str()); @@ -248,7 +252,8 @@ bool AppSettings::Initialize() noexcept { doc.ParseInsitu(configText.data()); if (doc.HasParseError()) { Logger::Get().Error(fmt::format("解析配置失败\n\t错误码:{}", (int)doc.GetParseError())); - ResourceLoader resourceLoader = ResourceLoader::GetForCurrentView(); + ResourceLoader resourceLoader = + ResourceLoader::GetForCurrentView(CommonSharedConstants::APP_RESOURCE_MAP_ID); hstring title = resourceLoader.GetString(L"AppSettings_ErrorDialog_NotValidJson"); hstring content = resourceLoader.GetString(L"AppSettings_ErrorDialog_ConfigLocation"); ShowErrorMessage(title.c_str(), fmt::format(fmt::runtime(std::wstring_view(content)), _configPath).c_str()); @@ -257,7 +262,8 @@ bool AppSettings::Initialize() noexcept { if (!doc.IsObject()) { Logger::Get().Error("配置文件根元素不是 Object"); - ResourceLoader resourceLoader = ResourceLoader::GetForCurrentView(); + ResourceLoader resourceLoader = + ResourceLoader::GetForCurrentView(CommonSharedConstants::APP_RESOURCE_MAP_ID); hstring title = resourceLoader.GetString(L"AppSettings_ErrorDialog_ParseFailed"); hstring content = resourceLoader.GetString(L"AppSettings_ErrorDialog_ConfigLocation"); ShowErrorMessage(title.c_str(), fmt::format(fmt::runtime(std::wstring_view(content)), _configPath).c_str()); @@ -273,7 +279,8 @@ bool AppSettings::Initialize() noexcept { if (settingsVersion > SETTINGS_VERSION) { Logger::Get().Warn("未知的配置文件版本"); - ResourceLoader resourceLoader = ResourceLoader::GetForCurrentView(); + ResourceLoader resourceLoader = + ResourceLoader::GetForCurrentView(CommonSharedConstants::APP_RESOURCE_MAP_ID); if (_isPortableMode) { hstring contentStr = resourceLoader.GetString( L"AppSettings_PortableModeUnkownConfiguration_Content"); diff --git a/src/Magpie.App/HomeViewModel.cpp b/src/Magpie.App/HomeViewModel.cpp index c2b613ae2..da2559fff 100644 --- a/src/Magpie.App/HomeViewModel.cpp +++ b/src/Magpie.App/HomeViewModel.cpp @@ -8,6 +8,7 @@ #include "Win32Utils.h" #include "StrUtils.h" #include "UpdateService.h" +#include "CommonSharedConstants.h" namespace winrt::Magpie::App::implementation { @@ -51,7 +52,8 @@ hstring HomeViewModel::TimerLabelText() const noexcept { hstring HomeViewModel::TimerButtonText() const noexcept { ScalingService& ScalingService = ScalingService::Get(); - ResourceLoader resourceLoader = ResourceLoader::GetForCurrentView(); + ResourceLoader resourceLoader = + ResourceLoader::GetForCurrentView(CommonSharedConstants::APP_RESOURCE_MAP_ID); if (ScalingService.IsTimerOn()) { return resourceLoader.GetString(L"Home_Timer_Cancel"); } else { @@ -125,7 +127,8 @@ hstring HomeViewModel::RestoreWndDesc() const noexcept { std::wstring title(GetWindowTextLength(wndToRestore), L'\0'); GetWindowText(wndToRestore, title.data(), (int)title.size() + 1); - ResourceLoader resourceLoader = ResourceLoader::GetForCurrentView(); + ResourceLoader resourceLoader = + ResourceLoader::GetForCurrentView(CommonSharedConstants::APP_RESOURCE_MAP_ID); hstring curWindow = resourceLoader.GetString(L"Home_AutoRestore_CurWindow"); if (title.empty()) { hstring emptyTitle = resourceLoader.GetString(L"Home_AutoRestore_EmptyTitle"); @@ -151,7 +154,8 @@ hstring HomeViewModel::UpdateCardTitle() const noexcept { return {}; } - ResourceLoader resourceLoader = ResourceLoader::GetForCurrentView(); + ResourceLoader resourceLoader = + ResourceLoader::GetForCurrentView(CommonSharedConstants::APP_RESOURCE_MAP_ID); hstring titleFmt = resourceLoader.GetString(L"About_Version_UpdateCard_Title"); return hstring(fmt::format(fmt::runtime(std::wstring_view(titleFmt)), updateService.Tag())); } diff --git a/src/Magpie.App/Magpie.App.vcxproj b/src/Magpie.App/Magpie.App.vcxproj index 0c0dadbc8..c6e3d158e 100644 --- a/src/Magpie.App/Magpie.App.vcxproj +++ b/src/Magpie.App/Magpie.App.vcxproj @@ -14,22 +14,22 @@ 10.0 10.0.22621.0 10.0.18362.0 - true - true Magpie.App - true - $(Platform) - Language=en-US - false + $(SolutionDir)bin\$(Platform)\$(Configuration)\ + x64|arm64 + + + false + nested + + false + + false + true <_NoWinAPIFamilyApp>true <_VC_Target_Library_Platform>Desktop false - $(SolutionDir)bin\$(Platform)\$(Configuration)\ - nested - - - false @@ -59,7 +59,7 @@ false Console - kernel32.lib;ole32.lib;oleaut32.lib;user32.lib;gdi32.lib;$(OutDir)..\Magpie.Core.lib;%(AdditionalDependencies) + kernel32.lib;ole32.lib;oleaut32.lib;user32.lib;gdi32.lib;$(OutDir).\Magpie.Core.lib;%(AdditionalDependencies) Magpie.App.def @@ -234,11 +234,6 @@ Designer - - - Designer - - AboutPage.xaml @@ -406,6 +401,7 @@ + Designer @@ -527,9 +523,6 @@ - - true - @@ -613,6 +606,33 @@ + + + + + <_RelocatedAppXamlData Include="@(PackagingOutputs)" Condition="'%(Filename)' == 'App' and ('%(Extension)' == '.xaml' or '%(Extension)' == '.xbf')" /> + + + %(Filename)%(Extension) + + + + + + + + <_PrisToMerge Include="@(PackagingOutputs)" Condition="'%(Extension)' == '.pri'" KeepMetadata="DoesntExist" /> + + + + + + + + + + + diff --git a/src/Magpie.App/Magpie.App.vcxproj.filters b/src/Magpie.App/Magpie.App.vcxproj.filters index 1670dcc35..3e96dc7ee 100644 --- a/src/Magpie.App/Magpie.App.vcxproj.filters +++ b/src/Magpie.App/Magpie.App.vcxproj.filters @@ -9,9 +9,6 @@ - - Miscellaneous - Services @@ -58,6 +55,7 @@ Helpers + @@ -127,9 +125,6 @@ {ca435698-7c9e-4784-a031-2c9db29b5fcc} - - {7a45d2bb-695d-4658-8fb9-a3d1f3b5aff8} - {da249886-cfc3-4502-ac6b-a4a2b71807ce} @@ -154,9 +149,6 @@ - - Miscellaneous - Controls @@ -276,11 +268,6 @@ Controls - - - Miscellaneous - - diff --git a/src/Magpie.App/NewProfileViewModel.cpp b/src/Magpie.App/NewProfileViewModel.cpp index fe9b3563b..6b75eaec1 100644 --- a/src/Magpie.App/NewProfileViewModel.cpp +++ b/src/Magpie.App/NewProfileViewModel.cpp @@ -8,6 +8,7 @@ #include #include "ProfileService.h" #include "AppXReader.h" +#include "CommonSharedConstants.h" namespace winrt::Magpie::App::implementation { @@ -143,8 +144,8 @@ void NewProfileViewModel::PrepareForOpen(uint32_t dpi, bool isLightTheme, CoreDi } std::vector profiles; - hstring defaults = ResourceLoader::GetForCurrentView().GetString(L"Root_Defaults/Content"); - profiles.push_back(box_value(defaults)); + profiles.push_back(box_value(ResourceLoader::GetForCurrentView( + CommonSharedConstants::APP_RESOURCE_MAP_ID).GetString(L"Root_Defaults/Content"))); for (const Profile& profile : AppSettings::Get().Profiles()) { profiles.push_back(box_value(profile.name)); } diff --git a/src/Magpie.App/Package.appxmanifest b/src/Magpie.App/Package.appxmanifest deleted file mode 100644 index 22cda1e4a..000000000 --- a/src/Magpie.App/Package.appxmanifest +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - Magpie.App - Blinue - dummy.png - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/Magpie.App/ProfileViewModel.cpp b/src/Magpie.App/ProfileViewModel.cpp index bf958c112..2e4827647 100644 --- a/src/Magpie.App/ProfileViewModel.cpp +++ b/src/Magpie.App/ProfileViewModel.cpp @@ -16,6 +16,7 @@ #include #include "ScalingService.h" #include "FileDialogHelper.h" +#include "CommonSharedConstants.h" using namespace winrt; using namespace Windows::Graphics::Display; @@ -93,7 +94,8 @@ ProfileViewModel::ProfileViewModel(int profileIdx) : _isDefaultProfile(profileId _LoadIcon(rootPage); } - ResourceLoader resourceLoader = ResourceLoader::GetForCurrentView(); + ResourceLoader resourceLoader = + ResourceLoader::GetForCurrentView(CommonSharedConstants::APP_RESOURCE_MAP_ID); { std::vector scalingModes; scalingModes.push_back(box_value(resourceLoader.GetString(L"Profile_General_ScalingMode_None"))); @@ -207,10 +209,12 @@ void ProfileViewModel::ChangeExeForLaunching() const noexcept { return; } - static std::wstring titleStr(ResourceLoader::GetForCurrentView().GetString(L"SelectLauncherDialog_Title")); + ResourceLoader resourceLoader = + ResourceLoader::GetForCurrentView(CommonSharedConstants::APP_RESOURCE_MAP_ID); + static std::wstring titleStr(resourceLoader.GetString(L"SelectLauncherDialog_Title")); fileDialog->SetTitle(titleStr.c_str()); - static std::wstring exeFileStr(ResourceLoader::GetForCurrentView().GetString(L"FileDialog_ExeFile")); + static std::wstring exeFileStr(resourceLoader.GetString(L"FileDialog_ExeFile")); const COMDLG_FILTERSPEC fileType{ exeFileStr.c_str(), L"*.exe"}; fileDialog->SetFileTypes(1, &fileType); fileDialog->SetDefaultExtension(L"exe"); @@ -249,7 +253,8 @@ void ProfileViewModel::ChangeExeForLaunching() const noexcept { hstring ProfileViewModel::Name() const noexcept { if (_data->name.empty()) { - return ResourceLoader::GetForCurrentView().GetString(L"Root_Defaults/Content"); + return ResourceLoader::GetForCurrentView(CommonSharedConstants::APP_RESOURCE_MAP_ID) + .GetString(L"Root_Defaults/Content"); } else { return hstring(_data->name); } @@ -501,7 +506,8 @@ IVector ProfileViewModel::GraphicsCards() const noexcept { std::vector graphicsCards; graphicsCards.reserve(_graphicsCards.size() + 1); - ResourceLoader resourceLoader = ResourceLoader::GetForCurrentView(); + ResourceLoader resourceLoader = + ResourceLoader::GetForCurrentView(CommonSharedConstants::APP_RESOURCE_MAP_ID); hstring defaultStr = resourceLoader.GetString(L"Profile_General_CaptureMethod_Default"); graphicsCards.push_back(box_value(defaultStr)); diff --git a/src/Magpie.App/ScalingConfigurationViewModel.cpp b/src/Magpie.App/ScalingConfigurationViewModel.cpp index 95f7f3eec..eeb89cd66 100644 --- a/src/Magpie.App/ScalingConfigurationViewModel.cpp +++ b/src/Magpie.App/ScalingConfigurationViewModel.cpp @@ -11,6 +11,7 @@ #include "Win32Utils.h" #include "ScalingMode.h" #include "FileDialogHelper.h" +#include "CommonSharedConstants.h" using namespace ::Magpie::Core; @@ -33,7 +34,9 @@ ScalingConfigurationViewModel::ScalingConfigurationViewModel() { } static std::optional OpenFileDialogForJson(IFileDialog* fileDialog) noexcept { - static std::wstring jsonFileStr(ResourceLoader::GetForCurrentView().GetString(L"FileDialog_JsonFile")); + static std::wstring jsonFileStr( + ResourceLoader::GetForCurrentView(CommonSharedConstants::APP_RESOURCE_MAP_ID) + .GetString(L"FileDialog_JsonFile")); const COMDLG_FILTERSPEC fileType{ jsonFileStr.c_str(), L"*.json"}; fileDialog->SetFileTypes(1, &fileType); @@ -50,7 +53,9 @@ void ScalingConfigurationViewModel::Export() const noexcept { } fileDialog->SetFileName(L"ScalingModes"); - static std::wstring title(ResourceLoader::GetForCurrentView().GetString(L"ExportDialog_Title")); + static std::wstring title( + ResourceLoader::GetForCurrentView(CommonSharedConstants::APP_RESOURCE_MAP_ID) + .GetString(L"ExportDialog_Title")); fileDialog->SetTitle(title.c_str()); std::optional fileName = OpenFileDialogForJson(fileDialog.get()); @@ -74,7 +79,8 @@ static bool ImportImpl(bool legacy) noexcept { return false; } - ResourceLoader resourceLoader = ResourceLoader::GetForCurrentView(); + ResourceLoader resourceLoader = + ResourceLoader::GetForCurrentView(CommonSharedConstants::APP_RESOURCE_MAP_ID); hstring title = resourceLoader.GetString(legacy ? L"ImportLegacyDialog_Title" : L"ImportDialog_Title"); fileDialog->SetTitle(title.c_str()); @@ -120,7 +126,8 @@ void ScalingConfigurationViewModel::_Import(bool legacy) { void ScalingConfigurationViewModel::PrepareForAdd() { std::vector copyFromList; - ResourceLoader resourceLoader = ResourceLoader::GetForCurrentView(); + ResourceLoader resourceLoader = + ResourceLoader::GetForCurrentView(CommonSharedConstants::APP_RESOURCE_MAP_ID); copyFromList.push_back(box_value(resourceLoader.GetString( L"ScalingConfiguration_ScalingModes_NewScalingModeFlyout_CopyFrom_None"))); diff --git a/src/Magpie.App/ScalingModeEffectItem.cpp b/src/Magpie.App/ScalingModeEffectItem.cpp index 49b275fa9..d5b3ec13e 100644 --- a/src/Magpie.App/ScalingModeEffectItem.cpp +++ b/src/Magpie.App/ScalingModeEffectItem.cpp @@ -11,6 +11,7 @@ #include "Logger.h" #include "ScalingMode.h" #include "StrUtils.h" +#include "CommonSharedConstants.h" using namespace ::Magpie::Core; namespace MagpieCore = ::Magpie::Core; @@ -28,7 +29,8 @@ ScalingModeEffectItem::ScalingModeEffectItem(uint32_t scalingModeIdx, uint32_t e _name = EffectHelper::GetDisplayName(data.name); _parametersViewModel = EffectParametersViewModel(scalingModeIdx, effectIdx); } else { - ResourceLoader resourceLoader = ResourceLoader::GetForCurrentView(); + ResourceLoader resourceLoader = + ResourceLoader::GetForCurrentView(CommonSharedConstants::APP_RESOURCE_MAP_ID); _name = StrUtils::Concat( resourceLoader.GetString(L"ScalingConfiguration_ScalingModes_Description_UnknownEffect"), L" (", @@ -64,7 +66,8 @@ bool ScalingModeEffectItem::HasParameters() const noexcept { IVector ScalingModeEffectItem::ScalingTypes() noexcept { using Windows::ApplicationModel::Resources::ResourceLoader; - ResourceLoader resourceLoader = ResourceLoader::GetForCurrentView(); + ResourceLoader resourceLoader = + ResourceLoader::GetForCurrentView(CommonSharedConstants::APP_RESOURCE_MAP_ID); return single_threaded_vector(std::vector{ Magpie::App::ScalingType( diff --git a/src/Magpie.App/ScalingModeItem.cpp b/src/Magpie.App/ScalingModeItem.cpp index a56a975e8..3b8c68cd6 100644 --- a/src/Magpie.App/ScalingModeItem.cpp +++ b/src/Magpie.App/ScalingModeItem.cpp @@ -9,6 +9,7 @@ #include "AppSettings.h" #include "EffectsService.h" #include "EffectHelper.h" +#include "CommonSharedConstants.h" using namespace Magpie::Core; @@ -21,7 +22,8 @@ ScalingModeItem::ScalingModeItem(uint32_t index, bool isInitialExpanded) std::vector linkedProfiles; const Profile& defaultProfile = AppSettings::Get().DefaultProfile(); if (defaultProfile.scalingMode == (int)index) { - hstring defaults = ResourceLoader::GetForCurrentView().GetString(L"Root_Defaults/Content"); + hstring defaults = ResourceLoader::GetForCurrentView(CommonSharedConstants::APP_RESOURCE_MAP_ID) + .GetString(L"Root_Defaults/Content"); linkedProfiles.push_back(box_value(defaults)); } for (const Profile& profile : AppSettings::Get().Profiles()) { @@ -229,7 +231,8 @@ hstring ScalingModeItem::Description() const noexcept { if (const EffectInfo* effectInfo = EffectsService::Get().GetEffect(effect.name)) { result += EffectHelper::GetDisplayName(effect.name); } else { - ResourceLoader resourceLoader = ResourceLoader::GetForCurrentView(); + ResourceLoader resourceLoader = + ResourceLoader::GetForCurrentView(CommonSharedConstants::APP_RESOURCE_MAP_ID); result += L'('; result += resourceLoader.GetString(L"ScalingConfiguration_ScalingModes_Description_UnknownEffect"); result += L')'; diff --git a/src/Magpie.App/SettingsPage.cpp b/src/Magpie.App/SettingsPage.cpp index 431cbc36b..8b8aa9c80 100644 --- a/src/Magpie.App/SettingsPage.cpp +++ b/src/Magpie.App/SettingsPage.cpp @@ -5,6 +5,7 @@ #endif #include "XamlUtils.h" #include "ComboBoxHelper.h" +#include "CommonSharedConstants.h" using namespace winrt; using namespace Windows::UI::Xaml::Input; @@ -14,8 +15,10 @@ namespace winrt::Magpie::App::implementation { void SettingsPage::InitializeComponent() { SettingsPageT::InitializeComponent(); - ResourceLoader resourceLoader = ResourceLoader::GetForCurrentView(); - hstring versionStr = resourceLoader.GetString(L"ms-resource://Magpie.App/Microsoft.UI.Xaml/Resources/SettingsButtonName"); + ResourceLoader resourceLoader = + ResourceLoader::GetForCurrentView(CommonSharedConstants::APP_RESOURCE_MAP_ID); + hstring versionStr = resourceLoader. + GetString(L"ms-resource://Magpie.App/Microsoft.UI.Xaml/Resources/SettingsButtonName"); SettingsPageFrame().Title(versionStr); } diff --git a/src/Magpie.App/SettingsViewModel.cpp b/src/Magpie.App/SettingsViewModel.cpp index 2065ef63d..2344a664b 100644 --- a/src/Magpie.App/SettingsViewModel.cpp +++ b/src/Magpie.App/SettingsViewModel.cpp @@ -22,7 +22,8 @@ IVector SettingsViewModel::Languages() const { std::vector languages; languages.reserve(tags.size() + 1); - ResourceLoader resourceLoader = ResourceLoader::GetForCurrentView(); + ResourceLoader resourceLoader = + ResourceLoader::GetForCurrentView(CommonSharedConstants::APP_RESOURCE_MAP_ID); languages.push_back(box_value(resourceLoader.GetString(L"Settings_General_Language_System"))); for (const wchar_t* tag : tags) { Windows::Globalization::Language language(tag); diff --git a/src/Magpie.App/ShortcutControl.cpp b/src/Magpie.App/ShortcutControl.cpp index 2847cfe4e..e306f65d2 100644 --- a/src/Magpie.App/ShortcutControl.cpp +++ b/src/Magpie.App/ShortcutControl.cpp @@ -9,6 +9,7 @@ #include "XamlUtils.h" #include "ContentDialogHelper.h" #include "Logger.h" +#include "CommonSharedConstants.h" using namespace winrt; using namespace Windows::UI::Xaml::Controls; @@ -79,7 +80,8 @@ fire_and_forget ShortcutControl::EditButton_Click(IInspectable const&, RoutedEve _shortcutDialog.Language(Language()); _shortcutDialog.Title(GetValue(TitleProperty)); _shortcutDialog.Content(_ShortcutDialogContent); - ResourceLoader resourceLoader = ResourceLoader::GetForCurrentView(); + ResourceLoader resourceLoader = + ResourceLoader::GetForCurrentView(CommonSharedConstants::APP_RESOURCE_MAP_ID); _shortcutDialog.PrimaryButtonText(resourceLoader.GetString(L"ShortcutDialog_Save")); _shortcutDialog.CloseButtonText(resourceLoader.GetString(L"ShortcutDialog_Cancel")); _shortcutDialog.DefaultButton(ContentDialogButton::Primary); diff --git a/src/Magpie.App/ShortcutDialog.cpp b/src/Magpie.App/ShortcutDialog.cpp index c893d9cd7..755371547 100644 --- a/src/Magpie.App/ShortcutDialog.cpp +++ b/src/Magpie.App/ShortcutDialog.cpp @@ -3,6 +3,7 @@ #if __has_include("ShortcutDialog.g.cpp") #include "ShortcutDialog.g.cpp" #endif +#include "CommonSharedConstants.h" namespace winrt::Magpie::App::implementation { @@ -16,14 +17,16 @@ void ShortcutDialog::Error(ShortcutError value) { case ShortcutError::Invalid: { WarningBanner().Visibility(Visibility::Visible); - ResourceLoader resourceLoader = ResourceLoader::GetForCurrentView(); + ResourceLoader resourceLoader = + ResourceLoader::GetForCurrentView(CommonSharedConstants::APP_RESOURCE_MAP_ID); InvalidShortcutWarningLabel().Text(resourceLoader.GetString(L"ShortcutDialog_InvalidShortcut")); break; } case ShortcutError::Occupied: { WarningBanner().Visibility(Visibility::Visible); - ResourceLoader resourceLoader = ResourceLoader::GetForCurrentView(); + ResourceLoader resourceLoader = + ResourceLoader::GetForCurrentView(CommonSharedConstants::APP_RESOURCE_MAP_ID); InvalidShortcutWarningLabel().Text(resourceLoader.GetString(L"ShortcutDialog_InUse")); break; } diff --git a/src/Magpie.App/conanfile.txt b/src/Magpie.App/conanfile.txt index 35ab241f9..14884cd1e 100644 --- a/src/Magpie.App/conanfile.txt +++ b/src/Magpie.App/conanfile.txt @@ -1,9 +1,9 @@ [requires] -fmt/10.1.1 -spdlog/1.12.0 +fmt/10.2.0 +spdlog/1.13.0 parallel-hashmap/1.37 rapidjson/cci.20230929 -kuba-zip/0.3.0 +kuba-zip/0.3.1 muparser/2.3.4 yas/7.1.0 imgui/1.90 diff --git a/src/Magpie.App/dummy.exe b/src/Magpie.App/dummy.exe deleted file mode 100644 index 9c251a1a7..000000000 --- a/src/Magpie.App/dummy.exe +++ /dev/null @@ -1 +0,0 @@ -Visual Studio 需要此占位可执行文件才能正确编译项目 diff --git a/src/Magpie.App/make_resources_pri.py b/src/Magpie.App/make_resources_pri.py new file mode 100644 index 000000000..38177a825 --- /dev/null +++ b/src/Magpie.App/make_resources_pri.py @@ -0,0 +1,48 @@ +import sys +import os +import glob +import subprocess + +if len(sys.argv) != 3: + raise Exception("请勿直接运行此脚本") + +windowsSdkDir = max( + glob.glob(os.environ["ProgramFiles(x86)"] + "\\Windows Kits\\10\\bin\\10.*") +) +makepriPath = windowsSdkDir + "\\x64\\makepri.exe" +if not os.access(makepriPath, os.X_OK): + raise Exception("未找到 makepri") + +os.chdir(sys.argv[1]) + +with open("priconfig.xml", "w") as priConfig: + priConfig.write( + '\n' + ) + for priPath in sys.argv[2].split(";"): + priConfig.write( + f""" + + + + + + + + + + + + + + + + """ + ) + priConfig.write("\n") + +subprocess.run( + f'"{makepriPath}" New /pr . /cf priconfig.xml /of resources.pri /in Magpie.App /o', + capture_output=True, +) +os.remove("priconfig.xml") diff --git a/src/Magpie.Core/OverlayDrawer.cpp b/src/Magpie.Core/OverlayDrawer.cpp index d4dcce955..eb68b2651 100644 --- a/src/Magpie.Core/OverlayDrawer.cpp +++ b/src/Magpie.Core/OverlayDrawer.cpp @@ -17,6 +17,10 @@ namespace Magpie::Core { +OverlayDrawer::OverlayDrawer() : + _resourceLoader(winrt::ResourceLoader::GetForViewIndependentUse(CommonSharedConstants::APP_RESOURCE_MAP_ID)) +{} + bool OverlayDrawer::Initialize(DeviceResources* deviceResources) noexcept { HWND hwndSrc = ScalingWindow::Get().HwndSrc(); _isSrcMainWnd = Win32Utils::GetWndClassName(hwndSrc) == CommonSharedConstants::MAIN_WINDOW_CLASS_NAME; diff --git a/src/Magpie.Core/OverlayDrawer.h b/src/Magpie.Core/OverlayDrawer.h index dd15994ad..82171c07e 100644 --- a/src/Magpie.Core/OverlayDrawer.h +++ b/src/Magpie.Core/OverlayDrawer.h @@ -8,7 +8,7 @@ namespace Magpie::Core { class OverlayDrawer { public: - OverlayDrawer() = default; + OverlayDrawer(); OverlayDrawer(const OverlayDrawer&) = delete; OverlayDrawer(OverlayDrawer&&) = delete; @@ -64,7 +64,7 @@ class OverlayDrawer { ImGuiImpl _imguiImpl; - winrt::ResourceLoader _resourceLoader = winrt::ResourceLoader::GetForViewIndependentUse(); + winrt::ResourceLoader _resourceLoader{ nullptr }; bool _isUIVisiable = false; bool _isSrcMainWnd = false; diff --git a/src/Magpie/Magpie.vcxproj b/src/Magpie/Magpie.vcxproj index a2d2b8482..dd3f64b88 100644 --- a/src/Magpie/Magpie.vcxproj +++ b/src/Magpie/Magpie.vcxproj @@ -10,9 +10,6 @@ 10.0.22621.0 $(SolutionDir)bin\$(Platform)\$(Configuration)\ - - - true @@ -50,7 +47,6 @@ - @@ -82,7 +78,32 @@ - + + + + + + + <_UnpackagedWin32WinmdManifest Include="@(ReferencePath->'$(IntDir)%(FileName).manifest')" Condition="'%(ReferencePath.IsSystemReference)' != 'true' And '%(ReferencePath.WinMDFile)' == 'true' And '%(ReferencePath.ReferenceSourceTarget)' == 'ResolveAssemblyReference' And '%(ReferencePath.Implementation)' != '' And '%(FileName)' != 'Microsoft.Web.WebView2.Core'"> + %(ReferencePath.FullPath) + $([System.IO.Path]::GetFileName('%(ReferencePath.Implementation)')) + + + <_UnpackagedWin32WinmdProjectReference Condition="'%(_ResolvedNativeProjectReferencePaths.ProjectType)' != 'StaticLibrary' And '%(_ResolvedNativeProjectReferencePaths.DeploymentContent)' != 'false'" Include="@(_ResolvedNativeProjectReferencePaths->WithMetadataValue('FileType','winmd')->'%(RootDir)%(Directory)%(TargetPath)')" /> + <_UnpackagedWin32WinmdManifest Include="@(_UnpackagedWin32WinmdProjectReference->'$(IntDir)%(FileName).manifest')"> + %(Identity) + + + + + + + + + + + + diff --git a/src/Magpie/Magpie.vcxproj.filters b/src/Magpie/Magpie.vcxproj.filters index cfe3deace..d9c57a68d 100644 --- a/src/Magpie/Magpie.vcxproj.filters +++ b/src/Magpie/Magpie.vcxproj.filters @@ -27,7 +27,6 @@ - diff --git a/src/Magpie/TrayIconService.cpp b/src/Magpie/TrayIconService.cpp index 6e624f985..eeed9367b 100644 --- a/src/Magpie/TrayIconService.cpp +++ b/src/Magpie/TrayIconService.cpp @@ -97,7 +97,8 @@ LRESULT TrayIconService::_TrayIconWndProc(HWND hWnd, UINT message, WPARAM wParam } case WM_RBUTTONUP: { - winrt::ResourceLoader resourceLoader = winrt::ResourceLoader::GetForCurrentView(); + winrt::ResourceLoader resourceLoader = + winrt::ResourceLoader::GetForCurrentView(CommonSharedConstants::APP_RESOURCE_MAP_ID); winrt::hstring mainWindowText = resourceLoader.GetString(L"TrayIcon_MainWindow"); winrt::hstring exitText = resourceLoader.GetString(L"TrayIcon_Exit"); diff --git a/src/Magpie/XamlIslands.targets b/src/Magpie/XamlIslands.targets deleted file mode 100644 index bd3066b17..000000000 --- a/src/Magpie/XamlIslands.targets +++ /dev/null @@ -1,153 +0,0 @@ - - - - - - - <_DisableAppxCopy>true - - - - $(MSBuildProgramFiles32)\Windows Kits\10\bin\$(_TargetPlatformVersion)\x64\mt.exe - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -"; - var sb = new StringBuilder(); - sb.Append(headerF); - - if (!string.IsNullOrEmpty(AppxManifest)) - { - XmlDocument doc = new XmlDocument(); - doc.Load(AppxManifest); - var nsmgr = new XmlNamespaceManager(doc.NameTable); - nsmgr.AddNamespace("m", "http://schemas.microsoft.com/appx/manifest/foundation/windows10"); - var xQuery = "./m:Package/m:Extensions/m:Extension/m:InProcessServer"; - - foreach (XmlNode winRTFactory in doc.SelectNodes(xQuery, nsmgr)) - { - var dllPathNode = winRTFactory.SelectSingleNode("./m:Path", nsmgr); - var dllPath = dllPathNode.InnerText; - var typesNames = winRTFactory.SelectNodes("./m:ActivatableClass", nsmgr).OfType(); - var xmlHeader = String.Format(@" ", dllPath); - sb.Append(xmlHeader); - foreach (var typeNode in typesNames) - { - var attribs = typeNode.Attributes.OfType().ToArray(); - var typeName = attribs - .OfType() - .SingleOrDefault(x => x.Name == "ActivatableClassId") - .InnerText; - var xmlEntry = String.Format(@" - ", typeName); - sb.Append(xmlEntry); - } - var xmlFooter = @" - -"; - sb.Append(xmlFooter); - } - } - var xmlFooterF = @""; - sb.Append(xmlFooterF); - var manifestContent = sb.ToString(); - var outFileName = Path.Combine(DestinationFolder, "app.manifest"); - File.WriteAllText(outFileName, manifestContent, Encoding.UTF8); -]]> - - - - - - - - - - - - - - - - - - - diff --git a/src/Magpie/app.manifest b/src/Magpie/app.manifest index c87342ced..c52eb2ce4 100644 --- a/src/Magpie/app.manifest +++ b/src/Magpie/app.manifest @@ -1,16 +1,6 @@ - - - - - - @@ -26,8 +16,8 @@ - - + + true @@ -36,7 +26,7 @@ SegmentHeap - + diff --git a/src/Magpie/conanfile.txt b/src/Magpie/conanfile.txt index 4a214d2e0..3f2293cb8 100644 --- a/src/Magpie/conanfile.txt +++ b/src/Magpie/conanfile.txt @@ -1,6 +1,6 @@ [requires] -fmt/10.1.1 -spdlog/1.12.0 +fmt/10.2.0 +spdlog/1.13.0 parallel-hashmap/1.37 [generators] diff --git a/src/Shared/CommonSharedConstants.h b/src/Shared/CommonSharedConstants.h index 0bb205e29..d1d2c5691 100644 --- a/src/Shared/CommonSharedConstants.h +++ b/src/Shared/CommonSharedConstants.h @@ -24,7 +24,7 @@ struct CommonSharedConstants { #ifndef IDI_APP // 来自 Magpie\resource.h static constexpr const UINT IDI_APP = 101; -#endif // !IDI_APP +#endif static constexpr const UINT WM_NOTIFY_ICON = WM_USER; static constexpr const UINT WM_QUIT_MAGPIE = WM_USER + 1; @@ -32,4 +32,6 @@ struct CommonSharedConstants { static constexpr const wchar_t* WM_MAGPIE_SHOWME = L"WM_MAGPIE_SHOWME"; static constexpr const wchar_t* WM_MAGPIE_QUIT = L"WM_MAGPIE_QUIT"; + + static constexpr const wchar_t* APP_RESOURCE_MAP_ID = L"Magpie.App/Resources"; }; diff --git a/src/WinUI.props b/src/WinUI.props index d801de33e..b5f3dd9d4 100644 --- a/src/WinUI.props +++ b/src/WinUI.props @@ -1,26 +1,37 @@ - - + - - + - - + + + + + + + + + + + $(SolutionDir)obj\$(Platform)\WinUI\Microsoft.UI.Xaml.dll + - - - - false - Microsoft.UI.Xaml.dll - + + + <_ReferenceRelatedPaths Remove="@(WinUIPriReference)" /> + + <_ReferenceRelatedPaths Include="$(SolutionDir)obj\$(Platform)\WinUI\Microsoft.UI.Xaml.pri"> + %(WinUIPriReference.CopyLocal) + %(WinUIPriReference.CopyLocalSatelliteAssemblies) + %(WinUIPriReference.Implicit) + %(WinUIPriReference.OriginalItemSpec) + %(WinUIPriReference.Private) + %(WinUIPriReference.ReferenceOutputAssembly) + %(WinUIPriReference.ResolvedFrom) + %(WinUIPriReference.Version) + - - - - - diff --git a/src/_ConanDeps/build_conan_deps.py b/src/_ConanDeps/build_conan_deps.py index 3c2b324e6..209c1657d 100644 --- a/src/_ConanDeps/build_conan_deps.py +++ b/src/_ConanDeps/build_conan_deps.py @@ -45,7 +45,7 @@ # HybridCRT 要求静态链接 CRT p = subprocess.run( - f"conan install {conanfilePath} -pr:b=conanprofile.txt -pr:h=conanprofile.txt --output-folder ..\\..\\.conan\\{project} --build=missing -s build_type={configuration} -s arch={build_type} --update" + f"conan install {conanfilePath} -pr:a=conanprofile.txt --output-folder ..\\..\\.conan\\{project} --build=missing -s build_type={configuration} -s arch={build_type} --update" ) if p.returncode != 0: raise Exception("conan install 失败") diff --git a/src/extract_winui_runtime.py b/src/extract_winui_runtime.py index 5970d57c4..4edfef2bf 100644 --- a/src/extract_winui_runtime.py +++ b/src/extract_winui_runtime.py @@ -25,16 +25,25 @@ os.makedirs(intDir, exist_ok=True) os.chdir(intDir) - needExtract = True + def needExtract(): + try: + with open("version.txt") as f: + if f.read() != winuiPkg: + return True - try: - with open("version.txt") as f: - if f.read() == winuiPkg: - needExtract = False - except: - pass + for path in [ + "Microsoft.UI.Xaml.dll", + "Microsoft.UI.Xaml.pri", + "Microsoft.UI.Xaml", + ]: + if not os.access(path, os.F_OK): + return True + except: + return True - if needExtract: + return False + + if needExtract(): with zipfile.ZipFile( # 取最新的包 max( @@ -49,8 +58,14 @@ for file in appx.namelist(): if file.startswith("Microsoft.UI.Xaml/Assets"): members.append(file) - appx.extractall(members=members) + # 将 resources.pri 重命名为 Microsoft.UI.Xaml.pri + try: + os.remove("Microsoft.UI.Xaml.pri") + except: + pass + os.rename("resources.pri", "Microsoft.UI.Xaml.pri") + with open("version.txt", mode="w") as f: f.write(winuiPkg) diff --git a/src/fix_resfiles.py b/src/fix_resfiles.py deleted file mode 100644 index 0cc0ae5d2..000000000 --- a/src/fix_resfiles.py +++ /dev/null @@ -1,15 +0,0 @@ -import sys -import os - -if len(sys.argv) != 2: - raise Exception("请勿直接运行此脚本") - -with open(sys.argv[1], "r+") as f: - lines = [] - for line in f.readlines(): - if not "\\packages\\Microsoft.UI.Xaml" in line or "prerelease" in line: - lines.append(line) - - f.seek(os.SEEK_SET) - f.truncate() - f.writelines(lines) From 4f3414a3ce35b4961e8eb7104ee048138841f595 Mon Sep 17 00:00:00 2001 From: Xu <34770031+Blinue@users.noreply.github.com> Date: Sat, 13 Jan 2024 16:59:54 +0800 Subject: [PATCH 096/155] =?UTF-8?q?chore:=20=E6=9B=B4=E6=96=B0=20cppwinrt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Common.Post.props | 5 +---- src/Magpie.App/Magpie.App.vcxproj | 8 ++++---- src/Magpie.App/RootPage.cpp | 9 ++++++--- src/Magpie.App/packages.config | 2 +- src/Magpie.Core/Magpie.Core.vcxproj | 8 ++++---- src/Magpie.Core/packages.config | 2 +- src/Magpie/Magpie.vcxproj | 8 ++++---- src/Magpie/packages.config | 2 +- 8 files changed, 22 insertions(+), 22 deletions(-) diff --git a/src/Common.Post.props b/src/Common.Post.props index f543ca090..2acd03b7d 100644 --- a/src/Common.Post.props +++ b/src/Common.Post.props @@ -50,10 +50,7 @@ true true true - - - - NDEBUG;WINRT_NO_SOURCE_LOCATION;%(PreprocessorDefinitions) + NDEBUG;%(PreprocessorDefinitions) UseLinkTimeCodeGeneration diff --git a/src/Magpie.App/Magpie.App.vcxproj b/src/Magpie.App/Magpie.App.vcxproj index c6e3d158e..4b173c3bd 100644 --- a/src/Magpie.App/Magpie.App.vcxproj +++ b/src/Magpie.App/Magpie.App.vcxproj @@ -1,7 +1,7 @@ + - true true @@ -634,18 +634,18 @@ - + 这台计算机上缺少此项目引用的 NuGet 程序包。使用“NuGet 程序包还原”可下载这些程序包。有关更多信息,请参见 http://go.microsoft.com/fwlink/?LinkID=322105。缺少的文件是 {0}。 - - + + \ No newline at end of file diff --git a/src/Magpie.App/RootPage.cpp b/src/Magpie.App/RootPage.cpp index 9d3c05743..7ee83e483 100644 --- a/src/Magpie.App/RootPage.cpp +++ b/src/Magpie.App/RootPage.cpp @@ -171,7 +171,8 @@ void RootPage::NavigationView_DisplayModeChanged(MUXC::NavigationView const& nv, // !!! HACK !!! // 使导航栏的可滚动区域不会覆盖标题栏 - FrameworkElement menuItemsScrollViewer = nv.GetTemplateChild(L"MenuItemsScrollViewer").as(); + FrameworkElement menuItemsScrollViewer = nv.as() + .GetTemplateChild(L"MenuItemsScrollViewer").as(); menuItemsScrollViewer.Margin({ 0,isExpanded ? TitleBar().ActualHeight() : 0.0,0,0}); XamlUtils::UpdateThemeOfTooltips(*this, ActualTheme()); @@ -237,13 +238,15 @@ fire_and_forget RootPage::ShowToast(const hstring& message) { return; } + IControlProtected protectedAccessor = toastTeachingTip.as(); + // 隐藏关闭按钮 - if (DependencyObject closeButton = toastTeachingTip.GetTemplateChild(L"AlternateCloseButton")) { + if (DependencyObject closeButton = protectedAccessor.GetTemplateChild(L"AlternateCloseButton")) { closeButton.as().Visibility(Visibility::Collapsed); } // 减小 Flyout 尺寸 - if (DependencyObject container = toastTeachingTip.GetTemplateChild(L"TailOcclusionGrid")) { + if (DependencyObject container = protectedAccessor.GetTemplateChild(L"TailOcclusionGrid")) { container.as().MinWidth(0.0); } }); diff --git a/src/Magpie.App/packages.config b/src/Magpie.App/packages.config index 119239d90..ecd59b904 100644 --- a/src/Magpie.App/packages.config +++ b/src/Magpie.App/packages.config @@ -2,5 +2,5 @@ - + \ No newline at end of file diff --git a/src/Magpie.Core/Magpie.Core.vcxproj b/src/Magpie.Core/Magpie.Core.vcxproj index 4647daba9..8de0b640f 100644 --- a/src/Magpie.Core/Magpie.Core.vcxproj +++ b/src/Magpie.Core/Magpie.Core.vcxproj @@ -1,6 +1,6 @@ - + 16.0 Win32Proj @@ -132,13 +132,13 @@ - + 这台计算机上缺少此项目引用的 NuGet 程序包。使用“NuGet 程序包还原”可下载这些程序包。有关更多信息,请参见 http://go.microsoft.com/fwlink/?LinkID=322105。缺少的文件是 {0}。 - - + + \ No newline at end of file diff --git a/src/Magpie.Core/packages.config b/src/Magpie.Core/packages.config index 1b8cfbd96..09bfc449e 100644 --- a/src/Magpie.Core/packages.config +++ b/src/Magpie.Core/packages.config @@ -1,4 +1,4 @@  - + \ No newline at end of file diff --git a/src/Magpie/Magpie.vcxproj b/src/Magpie/Magpie.vcxproj index dd3f64b88..62ddbcbe4 100644 --- a/src/Magpie/Magpie.vcxproj +++ b/src/Magpie/Magpie.vcxproj @@ -1,7 +1,7 @@ + - 16.0 Win32Proj @@ -105,18 +105,18 @@ - + 这台计算机上缺少此项目引用的 NuGet 程序包。使用“NuGet 程序包还原”可下载这些程序包。有关更多信息,请参见 http://go.microsoft.com/fwlink/?LinkID=322105。缺少的文件是 {0}。 - - + + \ No newline at end of file diff --git a/src/Magpie/packages.config b/src/Magpie/packages.config index 119239d90..ecd59b904 100644 --- a/src/Magpie/packages.config +++ b/src/Magpie/packages.config @@ -2,5 +2,5 @@ - + \ No newline at end of file From 6ef731e26a27a9934ceaf2ecff650465adc1fbce Mon Sep 17 00:00:00 2001 From: Xu <34770031+Blinue@users.noreply.github.com> Date: Sat, 13 Jan 2024 17:59:14 +0800 Subject: [PATCH 097/155] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E8=B4=9F?= =?UTF-8?q?=E5=9D=90=E6=A0=87=E7=9A=84=20=5FdestRect=20=E8=AE=A1=E7=AE=97?= =?UTF-8?q?=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Magpie.Core/Renderer.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Magpie.Core/Renderer.cpp b/src/Magpie.Core/Renderer.cpp index f07115e39..475ffad97 100644 --- a/src/Magpie.Core/Renderer.cpp +++ b/src/Magpie.Core/Renderer.cpp @@ -74,10 +74,10 @@ bool Renderer::Initialize() noexcept { _frontendSharedTexture->GetDesc(&desc); const RECT& scalingWndRect = ScalingWindow::Get().WndRect(); - _destRect.left = (scalingWndRect.left + scalingWndRect.right - desc.Width) / 2; - _destRect.top = (scalingWndRect.top + scalingWndRect.bottom - desc.Height) / 2; - _destRect.right = _destRect.left + desc.Width; - _destRect.bottom = _destRect.top + desc.Height; + _destRect.left = (scalingWndRect.left + scalingWndRect.right - (LONG)desc.Width) / 2; + _destRect.top = (scalingWndRect.top + scalingWndRect.bottom - (LONG)desc.Height) / 2; + _destRect.right = _destRect.left + (LONG)desc.Width; + _destRect.bottom = _destRect.top + (LONG)desc.Height; if (!_cursorDrawer.Initialize(_frontendResources, _backBuffer.get())) { Logger::Get().ComError("初始化 CursorDrawer 失败", hr); From 4838a9d069662597e345d0bc9cdd0a3ab98c6382 Mon Sep 17 00:00:00 2001 From: Xu <34770031+Blinue@users.noreply.github.com> Date: Sun, 14 Jan 2024 14:18:06 +0800 Subject: [PATCH 098/155] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E8=B7=A8?= =?UTF-8?q?=E8=B6=8A=E5=A4=9A=E4=B8=AA=E5=B1=8F=E5=B9=95=E7=9A=84=E9=94=99?= =?UTF-8?q?=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Magpie.Core/ScalingWindow.cpp | 65 +++++++++++++++++++++---------- src/Magpie.Core/ScalingWindow.h | 2 +- 2 files changed, 46 insertions(+), 21 deletions(-) diff --git a/src/Magpie.Core/ScalingWindow.cpp b/src/Magpie.Core/ScalingWindow.cpp index 9c6f3cedf..477b4666a 100644 --- a/src/Magpie.Core/ScalingWindow.cpp +++ b/src/Magpie.Core/ScalingWindow.cpp @@ -24,7 +24,8 @@ static BOOL CALLBACK MonitorEnumProc(HMONITOR, HDC, LPRECT monitorRect, LPARAM d return TRUE; } -static bool CalcRect(HWND hWnd, MultiMonitorUsage multiMonitorUsage, RECT& result) noexcept { +// 返回缩放窗口跨越的屏幕数量,失败返回 0 +static uint32_t CalcWndRect(HWND hWnd, MultiMonitorUsage multiMonitorUsage, RECT& result) { switch (multiMonitorUsage) { case MultiMonitorUsage::Closest: { @@ -32,45 +33,60 @@ static bool CalcRect(HWND hWnd, MultiMonitorUsage multiMonitorUsage, RECT& resul HMONITOR hMonitor = MonitorFromWindow(hWnd, MONITOR_DEFAULTTONEAREST); if (!hMonitor) { Logger::Get().Win32Error("MonitorFromWindow 失败"); - return false; + return 0; } MONITORINFO mi{}; mi.cbSize = sizeof(mi); if (!GetMonitorInfo(hMonitor, &mi)) { Logger::Get().Win32Error("GetMonitorInfo 失败"); - return false; + return 0; } result = mi.rcMonitor; - break; + return 1; } case MultiMonitorUsage::Intersected: { // 使用源窗口跨越的所有显示器 // [0] 存储源窗口坐标,[1] 存储计算结果 - RECT params[2]{}; + struct MonitorEnumParam { + RECT srcRect; + RECT destRect; + uint32_t monitorCount; + } param{}; HRESULT hr = DwmGetWindowAttribute(hWnd, - DWMWA_EXTENDED_FRAME_BOUNDS, ¶ms[0], sizeof(params[0])); + DWMWA_EXTENDED_FRAME_BOUNDS, ¶m.srcRect, sizeof(param.srcRect)); if (FAILED(hr)) { Logger::Get().ComError("DwmGetWindowAttribute 失败", hr); - return false; + return 0; } - if (!EnumDisplayMonitors(NULL, NULL, MonitorEnumProc, (LPARAM)¶ms)) { + MONITORENUMPROC monitorEnumProc = [](HMONITOR, HDC, LPRECT monitorRect, LPARAM data) { + MonitorEnumParam* param = (MonitorEnumParam*)data; + + if (Win32Utils::CheckOverlap(param->srcRect, *monitorRect)) { + UnionRect(¶m->destRect, monitorRect, ¶m->destRect); + ++param->monitorCount; + } + + return TRUE; + }; + + if (!EnumDisplayMonitors(NULL, NULL, monitorEnumProc, (LPARAM)¶m)) { Logger::Get().Win32Error("EnumDisplayMonitors 失败"); - return false; + return 0; } - result = params[1]; + result = param.destRect; if (result.right - result.left <= 0 || result.bottom - result.top <= 0) { Logger::Get().Error("计算缩放窗口坐标失败"); - return false; + return 0; } - break; + return param.monitorCount; } case MultiMonitorUsage::All: { @@ -81,13 +97,11 @@ static bool CalcRect(HWND hWnd, MultiMonitorUsage multiMonitorUsage, RECT& resul int vsY = GetSystemMetrics(SM_YVIRTUALSCREEN); result = { vsX, vsY, vsX + vsWidth, vsY + vsHeight }; - break; + return GetSystemMetrics(SM_CMONITORS); } default: - return false; + return 0; } - - return true; } bool ScalingWindow::Create(HINSTANCE hInstance, HWND hwndSrc, ScalingOptions&& options) noexcept { @@ -107,8 +121,9 @@ bool ScalingWindow::Create(HINSTANCE hInstance, HWND hwndSrc, ScalingOptions&& o // 提高时钟精度,默认为 15.6ms timeBeginPeriod(1); - if (!CalcRect(_hwndSrc, _options.multiMonitorUsage, _wndRect)) { - Logger::Get().Error("CalcRect 失败"); + const uint32_t monitors = CalcWndRect(_hwndSrc, _options.multiMonitorUsage, _wndRect); + if (monitors == 0) { + Logger::Get().Error("CalcWndRect 失败"); return false; } @@ -144,7 +159,7 @@ bool ScalingWindow::Create(HINSTANCE hInstance, HWND hwndSrc, ScalingOptions&& o | WS_EX_LAYERED | WS_EX_NOREDIRECTIONBITMAP | WS_EX_TRANSPARENT | WS_EX_TOOLWINDOW, CommonSharedConstants::SCALING_WINDOW_CLASS_NAME, L"Magpie", - WS_POPUP, + WS_POPUP | (monitors == 1 ? WS_MAXIMIZE : 0), _wndRect.left, _wndRect.top, _wndRect.right - _wndRect.left, @@ -185,7 +200,17 @@ bool ScalingWindow::Create(HINSTANCE hInstance, HWND hwndSrc, ScalingOptions&& o return false; } - ShowWindow(_hWnd, SW_SHOWMAXIMIZED); + // 缩放窗口可能有 WS_MAXIMIZE 样式,因此使用 SetWindowsPos 而不是 ShowWindow + // 以避免 OS 更改窗口尺寸和位置。 + SetWindowPos( + _hWnd, + NULL, + _wndRect.left, + _wndRect.top, + _wndRect.right - _wndRect.left, + _wndRect.bottom - _wndRect.top, + SWP_SHOWWINDOW | SWP_NOCOPYBITS | SWP_NOREDRAW + ); return true; } diff --git a/src/Magpie.Core/ScalingWindow.h b/src/Magpie.Core/ScalingWindow.h index 28717eeeb..b2350ee87 100644 --- a/src/Magpie.Core/ScalingWindow.h +++ b/src/Magpie.Core/ScalingWindow.h @@ -52,7 +52,7 @@ class ScalingWindow : public WindowBase { bool _CheckForeground(HWND hwndForeground) const noexcept; - RECT _wndRect; + RECT _wndRect{}; ScalingOptions _options; std::unique_ptr _renderer; From e7324c9eda856fabc9e8cdf6040e603145a69502 Mon Sep 17 00:00:00 2001 From: Xu <34770031+Blinue@users.noreply.github.com> Date: Sun, 14 Jan 2024 14:24:37 +0800 Subject: [PATCH 099/155] =?UTF-8?q?chore:=20=E4=BF=AE=E5=A4=8D=E7=BC=96?= =?UTF-8?q?=E8=AF=91=E8=AD=A6=E5=91=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Magpie.Core/ScalingWindow.cpp | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/src/Magpie.Core/ScalingWindow.cpp b/src/Magpie.Core/ScalingWindow.cpp index 477b4666a..959430e7e 100644 --- a/src/Magpie.Core/ScalingWindow.cpp +++ b/src/Magpie.Core/ScalingWindow.cpp @@ -14,16 +14,6 @@ ScalingWindow::ScalingWindow() noexcept {} ScalingWindow::~ScalingWindow() noexcept {} -static BOOL CALLBACK MonitorEnumProc(HMONITOR, HDC, LPRECT monitorRect, LPARAM data) noexcept { - RECT* params = (RECT*)data; - - if (Win32Utils::CheckOverlap(params[0], *monitorRect)) { - UnionRect(¶ms[1], monitorRect, ¶ms[1]); - } - - return TRUE; -} - // 返回缩放窗口跨越的屏幕数量,失败返回 0 static uint32_t CalcWndRect(HWND hWnd, MultiMonitorUsage multiMonitorUsage, RECT& result) { switch (multiMonitorUsage) { From 611415ce1e67a7427ec2374f80d71e3ae4e8e8e7 Mon Sep 17 00:00:00 2001 From: hauuau <52239673+hauuau@users.noreply.github.com> Date: Fri, 19 Jan 2024 19:08:15 +0700 Subject: [PATCH 100/155] Fix generation of effect source files in subdirectories (#814) * Fix generation of effect source files in child directories * Fixes per PR review --- src/Magpie.Core/EffectCompiler.cpp | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/Magpie.Core/EffectCompiler.cpp b/src/Magpie.Core/EffectCompiler.cpp index ba2241ba8..e14a894cb 100644 --- a/src/Magpie.Core/EffectCompiler.cpp +++ b/src/Magpie.Core/EffectCompiler.cpp @@ -1373,8 +1373,11 @@ static uint32_t CompilePasses( cbHlsl.append("cbuffer __CB2 : register(b1) { uint __frameCount; };\n\n"); } - if ((flags & EffectCompilerFlags::SaveSources) && !Win32Utils::DirExists(CommonSharedConstants::SOURCES_DIR)) { - if (!CreateDirectory(CommonSharedConstants::SOURCES_DIR, nullptr)) { + std::wstring sourcesPathName = StrUtils::Concat(CommonSharedConstants::SOURCES_DIR, StrUtils::UTF8ToUTF16(desc.name)); + std::wstring sourcesPath = sourcesPathName.substr(0, sourcesPathName.find_last_of(L'\\')); + + if ((flags & EffectCompilerFlags::SaveSources) && !Win32Utils::DirExists(sourcesPath.c_str())) { + if (!Win32Utils::CreateDir(sourcesPath, true)) { Logger::Get().Win32Error("创建 sources 文件夹失败"); } } @@ -1395,8 +1398,8 @@ static uint32_t CompilePasses( if (flags & EffectCompilerFlags::SaveSources) { std::wstring fileName = desc.passes.size() == 1 - ? fmt::format(L"{}{}.hlsl", CommonSharedConstants::SOURCES_DIR, StrUtils::UTF8ToUTF16(desc.name)) - : fmt::format(L"{}{}_Pass{}.hlsl", CommonSharedConstants::SOURCES_DIR, StrUtils::UTF8ToUTF16(desc.name), id + 1); + ? StrUtils::Concat(sourcesPathName, L".hlsl") + : fmt::format(L"{}_Pass{}.hlsl", sourcesPathName, id + 1); if (!Win32Utils::WriteFile(fileName.c_str(), source.data(), source.size())) { Logger::Get().Error(fmt::format("保存 Pass{} 源码失败", id + 1)); From 2886841a340cd845c0a262e85ed7acaed0b63dbd Mon Sep 17 00:00:00 2001 From: hauuau <52239673+hauuau@users.noreply.github.com> Date: Mon, 22 Jan 2024 19:47:27 +0700 Subject: [PATCH 101/155] Add v4 effects from the port of mpv-prescalers (#806) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Add v4 effects generated by magpie-prescalers * chore: fix ci * Fix NNEDI3; sync RAVU-Zoom with the upstream. * Refactor common code, apply clang-format, and rename generated shaders * Update project files for generated effects * Simplify effects build system * Revert "Simplify effects build system" This reverts commit 01c1aff262d5d077fee789d1d23c7286ee418242. * Clarify scripts location * Add unroll attribute and whitespaces in NNEDI3 * Add SORT_NAME to NNEDI3; Implement bool handling in the mix function --------- Co-authored-by: 刘旭 Co-authored-by: Xu <34770031+Blinue@users.noreply.github.com> --- src/Effects/Effects.vcxproj | 117 +- src/Effects/Effects.vcxproj.filters | 139 +- src/Effects/NNEDI3/NNEDI3_nns128_win8x4.hlsl | 4024 ++++++ src/Effects/NNEDI3/NNEDI3_nns128_win8x6.hlsl | 5735 ++++++++ src/Effects/NNEDI3/NNEDI3_nns16_win8x4.hlsl | 818 +- src/Effects/NNEDI3/NNEDI3_nns16_win8x6.hlsl | 953 ++ src/Effects/NNEDI3/NNEDI3_nns256_win8x4.hlsl | 7880 +++++++++++ src/Effects/NNEDI3/NNEDI3_nns256_win8x6.hlsl | 11232 ++++++++++++++++ src/Effects/NNEDI3/NNEDI3_nns32_win8x4.hlsl | 1193 ++ src/Effects/NNEDI3/NNEDI3_nns32_win8x6.hlsl | 1643 +++ src/Effects/NNEDI3/NNEDI3_nns64_win8x4.hlsl | 2111 +++ src/Effects/NNEDI3/NNEDI3_nns64_win8x6.hlsl | 3082 ++++- src/Effects/NNEDI3/prescalers.hlsli | 73 + src/Effects/RAVU/RAVU_3x_R2.hlsl | 176 + src/Effects/RAVU/RAVU_3x_R2_RGB.hlsl | 180 + src/Effects/RAVU/RAVU_3x_R3.hlsl | 224 + src/Effects/RAVU/RAVU_3x_R3_RGB.hlsl | 224 + src/Effects/RAVU/RAVU_3x_R4.hlsl | 344 + src/Effects/RAVU/RAVU_3x_R4_RGB.hlsl | 344 + src/Effects/RAVU/RAVU_Lite_AR_R2.hlsl | 224 + src/Effects/RAVU/RAVU_Lite_AR_R3.hlsl | 268 + src/Effects/RAVU/RAVU_Lite_AR_R4.hlsl | 340 + src/Effects/RAVU/RAVU_Lite_R2.hlsl | 151 + src/Effects/RAVU/RAVU_Lite_R3.hlsl | 273 +- src/Effects/RAVU/RAVU_Lite_R4.hlsl | 239 + src/Effects/RAVU/RAVU_R2.hlsl | 449 + src/Effects/RAVU/RAVU_R2_RGB.hlsl | 450 + src/Effects/RAVU/RAVU_R3.hlsl | 536 + src/Effects/RAVU/RAVU_R3_RGB.hlsl | 537 + src/Effects/RAVU/RAVU_R4.hlsl | 851 ++ src/Effects/RAVU/RAVU_R4_RGB.hlsl | 852 ++ src/Effects/RAVU/RAVU_Zoom_AR_R2.hlsl | 325 + src/Effects/RAVU/RAVU_Zoom_AR_R2_RGB.hlsl | 335 + src/Effects/RAVU/RAVU_Zoom_AR_R3.hlsl | 373 + src/Effects/RAVU/RAVU_Zoom_AR_R3_RGB.hlsl | 399 + src/Effects/RAVU/RAVU_Zoom_R2.hlsl | 209 + src/Effects/RAVU/RAVU_Zoom_R2_RGB.hlsl | 219 + src/Effects/RAVU/RAVU_Zoom_R3.hlsl | 283 +- src/Effects/RAVU/RAVU_Zoom_R3_RGB.hlsl | 281 + src/Effects/RAVU/RAVU_Zoom_R3_Weights.dds | Bin 933248 -> 0 bytes src/Effects/RAVU/prescalers.hlsli | 73 + src/Effects/RAVU/ravu_3x_lut2_f16.dds | Bin 0 -> 17408 bytes src/Effects/RAVU/ravu_3x_lut3_f16.dds | Bin 0 -> 45056 bytes src/Effects/RAVU/ravu_3x_lut4_f16.dds | Bin 0 -> 86528 bytes src/Effects/RAVU/ravu_lite_lut2_f16.dds | Bin 0 -> 11648 bytes ..._R3_Weights.dds => ravu_lite_lut3_f16.dds} | Bin 30080 -> 30080 bytes src/Effects/RAVU/ravu_lite_lut4_f16.dds | Bin 0 -> 57728 bytes src/Effects/RAVU/ravu_lut2_f16.dds | Bin 0 -> 10496 bytes src/Effects/RAVU/ravu_lut3_f16.dds | Bin 0 -> 26048 bytes src/Effects/RAVU/ravu_lut4_f16.dds | Bin 0 -> 41600 bytes src/Effects/RAVU/ravu_zoom_lut2_ar_f16.dds | Bin 0 -> 373376 bytes src/Effects/RAVU/ravu_zoom_lut2_f16.dds | Bin 0 -> 373376 bytes src/Effects/RAVU/ravu_zoom_lut3_ar_f16.dds | Bin 0 -> 373376 bytes src/Effects/RAVU/ravu_zoom_lut3_f16.dds | Bin 0 -> 933248 bytes 54 files changed, 47503 insertions(+), 656 deletions(-) create mode 100644 src/Effects/NNEDI3/NNEDI3_nns128_win8x4.hlsl create mode 100644 src/Effects/NNEDI3/NNEDI3_nns128_win8x6.hlsl create mode 100644 src/Effects/NNEDI3/NNEDI3_nns16_win8x6.hlsl create mode 100644 src/Effects/NNEDI3/NNEDI3_nns256_win8x4.hlsl create mode 100644 src/Effects/NNEDI3/NNEDI3_nns256_win8x6.hlsl create mode 100644 src/Effects/NNEDI3/NNEDI3_nns32_win8x4.hlsl create mode 100644 src/Effects/NNEDI3/NNEDI3_nns32_win8x6.hlsl create mode 100644 src/Effects/NNEDI3/NNEDI3_nns64_win8x4.hlsl create mode 100644 src/Effects/NNEDI3/prescalers.hlsli create mode 100644 src/Effects/RAVU/RAVU_3x_R2.hlsl create mode 100644 src/Effects/RAVU/RAVU_3x_R2_RGB.hlsl create mode 100644 src/Effects/RAVU/RAVU_3x_R3.hlsl create mode 100644 src/Effects/RAVU/RAVU_3x_R3_RGB.hlsl create mode 100644 src/Effects/RAVU/RAVU_3x_R4.hlsl create mode 100644 src/Effects/RAVU/RAVU_3x_R4_RGB.hlsl create mode 100644 src/Effects/RAVU/RAVU_Lite_AR_R2.hlsl create mode 100644 src/Effects/RAVU/RAVU_Lite_AR_R3.hlsl create mode 100644 src/Effects/RAVU/RAVU_Lite_AR_R4.hlsl create mode 100644 src/Effects/RAVU/RAVU_Lite_R2.hlsl create mode 100644 src/Effects/RAVU/RAVU_Lite_R4.hlsl create mode 100644 src/Effects/RAVU/RAVU_R2.hlsl create mode 100644 src/Effects/RAVU/RAVU_R2_RGB.hlsl create mode 100644 src/Effects/RAVU/RAVU_R3.hlsl create mode 100644 src/Effects/RAVU/RAVU_R3_RGB.hlsl create mode 100644 src/Effects/RAVU/RAVU_R4.hlsl create mode 100644 src/Effects/RAVU/RAVU_R4_RGB.hlsl create mode 100644 src/Effects/RAVU/RAVU_Zoom_AR_R2.hlsl create mode 100644 src/Effects/RAVU/RAVU_Zoom_AR_R2_RGB.hlsl create mode 100644 src/Effects/RAVU/RAVU_Zoom_AR_R3.hlsl create mode 100644 src/Effects/RAVU/RAVU_Zoom_AR_R3_RGB.hlsl create mode 100644 src/Effects/RAVU/RAVU_Zoom_R2.hlsl create mode 100644 src/Effects/RAVU/RAVU_Zoom_R2_RGB.hlsl create mode 100644 src/Effects/RAVU/RAVU_Zoom_R3_RGB.hlsl delete mode 100644 src/Effects/RAVU/RAVU_Zoom_R3_Weights.dds create mode 100644 src/Effects/RAVU/prescalers.hlsli create mode 100644 src/Effects/RAVU/ravu_3x_lut2_f16.dds create mode 100644 src/Effects/RAVU/ravu_3x_lut3_f16.dds create mode 100644 src/Effects/RAVU/ravu_3x_lut4_f16.dds create mode 100644 src/Effects/RAVU/ravu_lite_lut2_f16.dds rename src/Effects/RAVU/{RAVU_Lite_R3_Weights.dds => ravu_lite_lut3_f16.dds} (99%) create mode 100644 src/Effects/RAVU/ravu_lite_lut4_f16.dds create mode 100644 src/Effects/RAVU/ravu_lut2_f16.dds create mode 100644 src/Effects/RAVU/ravu_lut3_f16.dds create mode 100644 src/Effects/RAVU/ravu_lut4_f16.dds create mode 100644 src/Effects/RAVU/ravu_zoom_lut2_ar_f16.dds create mode 100644 src/Effects/RAVU/ravu_zoom_lut2_f16.dds create mode 100644 src/Effects/RAVU/ravu_zoom_lut3_ar_f16.dds create mode 100644 src/Effects/RAVU/ravu_zoom_lut3_f16.dds diff --git a/src/Effects/Effects.vcxproj b/src/Effects/Effects.vcxproj index 0fe3f84db..41edb8bf4 100644 --- a/src/Effects/Effects.vcxproj +++ b/src/Effects/Effects.vcxproj @@ -206,24 +206,137 @@ + + Document + + + Document + + + Document + + + Document + + + Document + + + Document + + + Document + + + Document + + + Document + + + Document + + + Document + Document + + Document + + + Document + + + Document + + + Document + + + Document + + + Document + + + Document + + + Document + + + Document + + + Document + + + Document + + + Document + + + Document + Document + + Document + - - + + + + + + + + + + + + + + + Document + + + Document + Document + + Document + + + Document + + + Document + + + Document + + + Document + + + Document + Document + + Document + diff --git a/src/Effects/Effects.vcxproj.filters b/src/Effects/Effects.vcxproj.filters index f1eb5c82e..4620695f7 100644 --- a/src/Effects/Effects.vcxproj.filters +++ b/src/Effects/Effects.vcxproj.filters @@ -153,24 +153,159 @@ FXAA + + RAVU + + + RAVU + + + RAVU + + + RAVU + + + RAVU + + + RAVU + + + RAVU + + + RAVU + + + RAVU + + + RAVU + + + RAVU + + + RAVU + + + RAVU + + + RAVU + + + RAVU + + + RAVU + + + RAVU + RAVU - + + RAVU + + + RAVU + + + RAVU + + + RAVU + + + RAVU + + + RAVU + + + RAVU + + + RAVU + + + RAVU + + + RAVU + + + RAVU + + + RAVU + + + RAVU + + + RAVU + + + RAVU + + + RAVU + + + RAVU + + + RAVU + + + RAVU + + RAVU RAVU - + RAVU + + NNEDI3 + + + NNEDI3 + NNEDI3 + + NNEDI3 + + + NNEDI3 + + + NNEDI3 + + + NNEDI3 + + + NNEDI3 + + + NNEDI3 + NNEDI3 + + NNEDI3 + NIS diff --git a/src/Effects/NNEDI3/NNEDI3_nns128_win8x4.hlsl b/src/Effects/NNEDI3/NNEDI3_nns128_win8x4.hlsl new file mode 100644 index 000000000..8174df620 --- /dev/null +++ b/src/Effects/NNEDI3/NNEDI3_nns128_win8x4.hlsl @@ -0,0 +1,4024 @@ +// This file is generated by the scripts available at https://github.com/hauuau/magpie-prescalers +// Please don't edit this file directly. +// Generated by: nnedi3.py --nns 128 --win 8x4 --use-compute-shader --use-magpie +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +//!MAGPIE EFFECT +//!VERSION 4 +//!SORT_NAME NNEDI3_128_4 + +//!TEXTURE +Texture2D INPUT; + +//!SAMPLER +//!FILTER POINT +SamplerState sam_INPUT; + +//!TEXTURE +//!WIDTH INPUT_WIDTH * 1 * 2 +//!HEIGHT INPUT_HEIGHT * 2 * 1 +Texture2D OUTPUT; + +//!SAMPLER +//!FILTER LINEAR +SamplerState sam_INPUT_LINEAR; + +//!TEXTURE +//!FORMAT R16_FLOAT +//!WIDTH INPUT_WIDTH * 1 +//!HEIGHT INPUT_HEIGHT * 2 +Texture2D temp; + +//!SAMPLER +//!FILTER POINT +SamplerState sam_temp; + +//!COMMON +#include "prescalers.hlsli" + +#define LAST_PASS 2 + +//!PASS 1 +//!DESC NNEDI3 (double_y, nns128, win8x4) +//!IN INPUT +//!OUT temp +//!BLOCK_SIZE 32, 16 +//!NUM_THREADS 32, 8 +#pragma optionNV(inline none) +float nnedi3(vec4 samples[8]) { + float sum = 0.0, sumsq = 0.0; + [unroll] for (int i = 0; i < 8; i++) { + sum += dot(samples[i], vec4(1.0, 1.0, 1.0, 1.0)); + sumsq += dot(samples[i], samples[i]); + } + float mstd0 = sum / 32.0; + float mstd1 = sumsq / 32.0 - mstd0 * mstd0; + float mstd2 = mix(0.0, inversesqrt(mstd1), mstd1 >= 1.192092896e-7); + mstd1 *= mstd2; + float vsum = 0.0, wsum = 0.0, sum1, sum2; +#define T(x) intBitsToFloat(x) +#define W(i, w0, w1, w2, w3) dot(samples[i], vec4(T(w0), T(w1), T(w2), T(w3))) +#define WS(w0, w1) \ + sum1 = exp(sum1 * mstd2 + T(w0)); \ + sum2 = sum2 * mstd2 + T(w1); \ + wsum += sum1; \ + vsum += sum1 * (sum2 / (1.0 + abs(sum2))); + sum1 = W(0, -1106336704, -1104338237, 1041734649, -1112016931) + + W(1, -1134422686, -1108550970, -1135080854, -1117701445) + + W(2, -1097058997, 1036063029, 1053379177, -1099451832) + + W(3, -1096794255, 1068454954, 1068510503, -1092648385) + + W(4, -1096428577, 1045547931, -1114733521, -1101312270) + + W(5, -1108910446, -1102009308, -1146436468, -1118387353) + + W(6, -1110459731, -1122481515, -1107441476, -1118789516) + + W(7, -1101174078, 1017740065, -1113618698, -1107281979); + sum2 = W(0, -1107960738, 1034572820, -1105088633, -1147785184) + + W(1, 1022891960, 1003346080, -1103397515, 1035529310) + + W(2, -1112828174, -1096749055, 1056062200, -1105585021) + + W(3, -1099542471, 1067566060, -1127174872, 1034766166) + + W(4, 1028527356, -1090311143, 1048792675, -1117109292) + + W(5, -1124169384, 1028295012, -1106700271, -1116900804) + + W(6, 1003609248, -1101382023, 1033154740, -1121486356) + + W(7, 1019646072, -1102277943, 1037356874, -1114899026); + WS(-1075683047, -1087125913); + sum1 = W(0, 1042687663, 1052977914, -1087267578, 1041384601) + W(1, 1034752002, 1046022844, -1097639380, 1034807969) + + W(2, 1020877136, 1051043629, -1087388173, 1037740431) + W(3, 1043598702, 1049374510, -1095656786, 1044538321) + + W(4, 1032834596, 1044576234, -1108370107, -1113942663) + + W(5, 1049059763, -1108783446, -1101488315, 1043415765) + + W(6, 1041786741, -1105784362, -1111228387, 1011031587) + + W(7, 1050972591, -1089957133, -1108747496, 1034104676); + sum2 = W(0, -1129327146, -1112916736, -1109246006, -1168639863) + + W(1, -1149557934, -1120018795, 1012425107, -1122303521) + + W(2, 1027469999, -1105442406, 1044505132, -1114911422) + + W(3, -1116270499, 1056936993, 1054092693, -1109477794) + + W(4, -1107094547, 1036431709, 1015080154, -1122292075) + + W(5, -1114668504, 1029410453, -1102188513, 1038663029) + + W(6, -1136313139, -1126491682, -1123974759, -1124857486) + + W(7, -1115408970, -1112281372, -1115235380, 1004657207); + WS(1042212664, -1102203684); + sum1 = W(0, -1140902818, 1040147851, 1035472140, -1111794429) + + W(1, 1019874102, -1104962202, 1045102086, 1033944684) + + W(2, -1138465404, -1102798136, 1044852023, -1122108180) + + W(3, 1041713132, -1085739950, 1052255697, 1042129278) + W(4, 1031911135, -1090423514, 1050093153, 1026181805) + + W(5, 1032244040, -1096835716, -1114874577, 1045351411) + + W(6, -1122713961, 1015091005, -1125530488, 1045226448) + + W(7, 1032066151, -1100137137, 1025859399, 1037723887); + sum2 = W(0, 1025219442, -1109152196, 1026944460, -1136900198) + + W(1, -1119436548, -1122141349, 1040314652, -1112897189) + + W(2, 1041363772, 1032935700, -1124096755, -1144192892) + + W(3, 1026037858, -1095545125, -1132954458, 1046665648) + + W(4, -1106963956, 1029288712, 1063106013, -1112667488) + + W(5, -1148187164, 1048235476, 1044093468, -1091150222) + + W(6, -1115265228, 1017807431, -1119277141, -1098670428) + + W(7, 1027834104, -1124373883, -1115291573, -1099776205); + WS(-1106435384, 1038338229); + sum1 = W(0, 1040095954, 1057302312, -1085504617, 1038469973) + W(1, 1019822615, 1048464174, -1109673285, 1008999077) + + W(2, 1037825128, 1048602738, -1088007186, 1047759857) + W(3, 1041126536, 1046177110, -1089584127, 1042217259) + + W(4, 1042659628, -1113571175, -1112427435, -1122205838) + + W(5, 1046281616, 1010729037, -1099904421, 1042535855) + W(6, 1025627498, -1116720143, 985851280, 1020820192) + + W(7, 1052688116, -1090676327, -1109333660, 1034203799); + sum2 = W(0, 1016257202, 1059204215, 1078138204, 1045786159) + W(1, 1025056091, 1059357388, 1057901024, -1115583727) + + W(2, -1123344133, -1096239491, -1075026282, 1040463834) + + W(3, -1117490597, -1080318626, -1073900782, 1043123901) + + W(4, -1139226916, -1097775023, 1041808545, 1021989454) + + W(5, -1121712633, -1121076469, 1040778731, -1105966927) + + W(6, 1032149092, -1108589001, 1040543247, 1015040126) + + W(7, 1018740994, 1042934709, 1013253724, -1147555881); + WS(-1079558823, -1098708322); + sum1 = W(0, -1107155318, -1102044491, -1157836704, 1018716763) + + W(1, 1025234303, -1098872409, 1050456336, 1032647774) + W(2, 1015859078, -1087610848, 1055919296, 1043448582) + + W(3, 1036194249, -1086405173, 1051086989, 1041211303) + W(4, -1109510417, 1049149960, 1049231261, 1032229161) + + W(5, -1106597869, -1113006787, 1047976577, -1113988824) + + W(6, -1106784003, 1034815041, 1037659280, -1114873522) + + W(7, -1107821257, -1109243348, 1045770027, -1115826050); + sum2 = W(0, -1115121954, 1038073794, -1128914993, -1116577465) + + W(1, 1012713185, -1114116718, 1041575276, -1124395325) + + W(2, -1120959275, 1048906430, 1074552079, 1055266270) + W(3, 979525395, -1089285214, -1076455267, 1060162115) + + W(4, 1031308048, 1044939824, -1081125046, -1098098687) + W(5, 1023425822, 960279117, -1109266711, 1021768571) + + W(6, 1008898041, -1114246838, 1028966618, -1124862202) + + W(7, 1015643115, -1116674868, -1116558128, 1013382601); + WS(1045132600, -1120782135); + sum1 = W(0, -1105751784, 1057393815, -1105555137, -1117651397) + + W(1, -1105178898, 1048859946, -1097544977, 1030868229) + + W(2, -1104184899, 1059464001, -1093321826, -1113548192) + + W(3, -1114219853, 1046945589, -1096850414, -1114482291) + + W(4, -1110381909, -1115358437, 1045680426, -1100710867) + + W(5, 1038688878, -1101266388, 1054674458, -1101910270) + + W(6, -1129240105, 1006928425, 1040711722, -1109195062) + + W(7, 1028338913, 1001553277, 1051440502, -1106616547); + sum2 = + W(0, 1017265392, 1041015042, -1100279165, 1015388608) + W(1, -1109811903, 1031690548, -1110095441, -1118750728) + + W(2, 1023756444, 1041543835, -1121800962, 1018680528) + W(3, -1113627340, 1061785433, 1052269299, -1143924414) + + W(4, 1014378799, -1112539854, 1027655784, -1099334823) + + W(5, -1145950526, 1033767962, -1103181542, 1020584168) + + W(6, -1129429444, -1111764061, -1110834939, -1108053853) + + W(7, 1013677319, -1098545742, -1106577514, 1036964648); + WS(1052573852, -1122511817); + sum1 = + W(0, -1122539822, -1107197216, -1123108403, 1051517474) + W(1, 1036520122, -1104137920, 1038549849, 1023654291) + + W(2, -1150669710, -1095755763, 1032946604, 1039184399) + + W(3, -1131456914, -1089160552, 1050538028, 1041388597) + + W(4, 1027717464, -1090293588, 1052989852, -1168884669) + W(5, 1032118773, -1090056564, 1057974832, 1033029075) + + W(6, 1021054902, -1092174087, 1053464075, 1028526105) + W(7, 1030809195, -1086001910, 1057808582, 1041880934); + sum2 = W(0, -1085894681, -1108201039, 1070882268, -1081052443) + + W(1, 1038192816, -1090848333, -1093216289, -1102549623) + + W(2, -1098445483, 1052221636, 1067999858, -1087793608) + + W(3, -1102898046, 1071505414, 1073865984, -1090403840) + + W(4, 1008806191, -1098981857, 1058878464, -1095780376) + + W(5, 1050638036, -1086351349, -1083525828, 1055133376) + + W(6, -1102617523, -1096799400, -1107159037, -1096503933) + + W(7, 1057325981, -1088620184, -1083206959, 1053790412); + WS(-1073219892, -1080326418); + sum1 = W(0, -1114077580, -1101602915, 1057495924, -1151047116) + + W(1, -1142635506, -1103425331, 1053716920, -1114784094) + + W(2, -1142955026, -1090278522, 1055741332, -1111276924) + + W(3, -1123237842, -1092662145, 1051447237, -1121668701) + + W(4, 1038107057, -1091646784, 1052494629, 1000704387) + + W(5, -1103324917, -1114692451, 1049044089, -1109204280) + + W(6, 1026598572, -1101848592, 1043005848, 1010568075) + + W(7, -1095875035, 1038718196, 1047828379, -1156952092); + sum2 = + W(0, -1121663397, -1095443331, -1067370736, 1005231721) + W(1, -1116542136, 1050195534, -1071776975, 974104521) + + W(2, 1042431779, -1123573301, 1068672794, -1111985184) + W(3, 1037730633, -1100504352, 1077012119, 1047585075) + + W(4, 1010053773, 1043186658, 1070664889, 1016528922) + W(5, -1137348615, -1102861372, 1045361006, -1109020232) + + W(6, 1028087910, -1110454800, -1123945395, 1037668055) + + W(7, -1119025600, 1040229501, 1027642294, -1117277443); + WS(-1130027456, 1047744266); + sum1 = + W(0, 1030328637, -1103440100, 1050534604, -1130350917) + W(1, -1100312969, 1043447132, 1038395889, -1105733872) + + W(2, 1036569044, -1096543805, 1037345619, 1043114871) + W(3, 1044449278, -1093151398, -1106526388, 1022399622) + + W(4, -1106699970, 1024264999, -1115006287, 1020228332) + W(5, 1046212150, -1115860524, 1035372917, 1024836117) + + W(6, -1104762293, 1041344218, 980910400, -1123108872) + + W(7, -1124975021, 1032410566, 1044066628, -1112803412); + sum2 = + W(0, 1029880722, 1033391383, -1137819024, -1114516031) + W(1, -1098453144, 1041649400, -1137377888, 1025620716) + + W(2, 1029103498, -1095624145, 1040796761, 1035240799) + W(3, 1067660000, -1082091368, -1080643124, 1066795978) + + W(4, -1094604015, 1056223691, -1102259819, -1098376459) + + W(5, 1046293202, 1027973488, -1121978412, 1036814117) + + W(6, -1104816365, 1034193475, -1148596400, -1107858514) + + W(7, -1117927817, 1034286113, 1041009105, -1114981924); + WS(1049012636, 1037011386); + sum1 = W(0, -1108102978, -1097922903, 1049818257, 1041216474) + + W(1, 1042768739, -1089977373, 1052134241, -1106782690) + + W(2, 1036457352, -1083790961, 1059747641, -1120768141) + W(3, -1105146600, 1050515995, 1062551839, 975424142) + + W(4, -1100621772, 1053649082, -1088576433, 1042971413) + + W(5, -1100160944, 1044221701, -1093385002, 1047421135) + + W(6, -1149100234, 1020595485, -1108848982, -1142399358) + + W(7, -1116535239, -1110188826, -1147628986, 1034144007); + sum2 = W(0, -1130376652, -1109271051, -1098570547, 1029552052) + + W(1, -1109307779, 1040605589, -1097221185, -1097745138) + + W(2, 998991648, -1117670218, -1087670872, -1101762859) + + W(3, -1105231849, 1068278024, 1068017963, -1100990121) + + W(4, -1124853008, -1099193318, -1103240593, -1094879980) + + W(5, -1110904873, 1035466738, 1049832589, -1119653306) + + W(6, 1033926100, -1111928806, 1018913792, -1099498770) + + W(7, 1012787248, 1025845624, 1035573068, 1046656503); + WS(-1099128120, 1074104605); + sum1 = + W(0, 1001695642, 1031876531, -1106225286, 1039516460) + W(1, -1114738061, 1036082771, -1127447088, 1037331996) + + W(2, -1137881464, 1049670772, -1114090766, 1048871226) + W(3, 1035838167, 1045634202, -1084335000, 1024672505) + + W(4, 1036976671, 1039176783, -1092101927, -1111706306) + W(5, 1043227732, 1044499416, -1106295064, 1040216275) + + W(6, 1024532056, -1115296143, -1108352670, 1018355325) + + W(7, 1041576607, 1036111714, -1103209586, -1129216251); + sum2 = + W(0, -1125983803, 1057121124, -1097673861, -1097055530) + W(1, 1026289226, 1048908439, -1081617292, -1105528539) + + W(2, 1003361806, 1042597022, -1083990029, -1094090339) + W(3, 1036989304, -1101738899, 1066557847, 1060807350) + + W(4, -1121376018, -1101518001, 1050089807, 1045798092) + + W(5, -1127516251, -1114490175, 1021212715, 1007168711) + W(6, 999276462, 1032222895, -1107462587, 1021142275) + + W(7, 1020382491, -1111061815, 1048167829, 1024157832); + WS(1043392312, -1114334171); + sum1 = + W(0, 1041086874, 1046571639, -1101297859, -1108043111) + W(1, 1027676176, 1051603231, -1100311555, 1031499310) + + W(2, 1029494548, -1114765098, -1090719068, -1123479337) + + W(3, 1038182418, 1063881062, -1092551191, 1047470620) + W(4, 1033375641, 1036439434, -1093343060, 1029157954) + + W(5, 1014428948, 1039261900, -1095549099, -1113522785) + W(6, 1016176348, 1049353410, -1102133676, 1032866554) + + W(7, 1036956537, 1039119196, -1097401399, -1108903402); + sum2 = W(0, 1032922039, -1110774431, 1024080221, -1111786600) + W(1, 1034144522, 1041464609, 1024001520, 1038622987) + + W(2, 1035186417, -1089347840, -1102975683, -1098326560) + + W(3, -1106146153, 1063858171, 1062496232, -1094555153) + + W(4, 995983013, -1103182741, -1104694448, -1110476474) + + W(5, 1014708981, -1105498679, 1034761930, -1107944280) + + W(6, -1118508182, 1046443094, -1113235807, 1045574278) + + W(7, -1122673776, -1107403517, -1126790312, -1119406695); + WS(1055141020, 1060902337); + sum1 = + W(0, 1034435725, 1057965143, -1123568702, -1104499136) + W(1, -1133288704, 1052483105, -1121795134, 1006999415) + + W(2, 1026181508, 1052696320, -1094115828, -1153162900) + + W(3, 1033934442, -1122504460, -1084201687, 1029709087) + W(4, 1030709219, 1052884304, -1093347107, 1036285529) + + W(5, -1118188821, 1049027177, -1096042081, -1155692311) + + W(6, 1027652318, 1046782257, -1098441692, 1013713298) + + W(7, 1035419593, 1045790650, -1101051195, -1111952258); + sum2 = W(0, 1043194323, -1070666261, -1098866335, -1101126135) + + W(1, 1017945729, -1075189642, -1106608294, 1010301074) + W(2, 992756489, 1068575013, 1051129947, -1107911121) + + W(3, -1117717167, 1076566585, 1049134123, 1046700061) + W(4, 1023440269, 1056539999, 1047751107, 1020103457) + + W(5, -1108161809, -1098049115, -1097073139, 1026363561) + + W(6, 1034607052, 1036076910, 1011007330, 1035420194) + + W(7, -1115924363, -1112346970, 1016205049, -1137869730); + WS(-1090579868, 1070279725); + sum1 = W(0, 1032329895, 1048430680, -1101560157, -1129281319) + + W(1, -1102328821, 1050349544, -1091335294, 1012204235) + + W(2, -1113203900, 1052980239, 1039656780, 1033674783) + + W(3, -1098061089, 1057014372, -1084573078, -1115372202) + + W(4, -1105344998, 1057962188, -1103450436, -1108117804) + + W(5, 1034205973, 1038273502, 1043587871, -1111454739) + + W(6, -1106552005, 1046276062, -1098888483, -1115265901) + + W(7, 1041435478, 1049777060, 1002064136, -1109943484); + sum2 = W(0, 987673807, 1027892228, -1103141235, 1005138532) + W(1, 1036995374, -1102736131, 1049007178, 1028221332) + + W(2, -1095509641, 1034852634, -1090760003, -1123669832) + + W(3, -1094252408, 1059241808, 1060311666, -1128511149) + + W(4, -1119095571, -1103859919, -1129798465, 1032914452) + + W(5, -1103179232, 1043446486, -1100012675, 1006285508) + + W(6, 1040985329, -1109795439, 1051746582, -1122773902) + + W(7, -1114181285, 1004807604, -1113144024, 987177167); + WS(1058381774, -1086956646); + sum1 = + W(0, 1005434106, -1096145742, 1046241393, 1026532260) + W(1, -1149835360, -1100460324, 1039571170, -1120107684) + + W(2, 1034370117, -1096424577, 1054608457, -1107524072) + + W(3, 1036055789, 1033532617, -1110152984, -1123297125) + W(4, 1007595428, 1049990129, -1100950084, 1032832748) + + W(5, -1173712576, 1042033667, -1103984787, 1041584782) + + W(6, -1122685332, -1147483724, -1122634471, -1111048693) + + W(7, -1119060568, 1021597150, 1016207588, 1023439817); + sum2 = W(0, 1073050559, 1049113865, 1048373410, -1123382260) + W(1, 1069067455, 1035642194, -1101089925, 1035361564) + + W(2, -1096535796, -1105600932, 1050248373, -1105239942) + + W(3, -1073893027, -1114871718, -1113393188, 1000972215) + + W(4, -1077684470, -1104998692, 1015693919, -1112223483) + W(5, 1038335059, 1034875990, 1032989733, 987872957) + + W(6, 994568047, 1004288083, 1024635942, 1016564448) + W(7, -1109196141, 1019116562, 1041247426, 1019016937); + WS(1051792028, 1027146209); + sum1 = + W(0, -1173418992, -1096555104, 1048715847, 1037767898) + W(1, 1031492470, -1099279313, 1043543405, 1032372106) + + W(2, 1030866682, -1102472206, 1045948678, 1031937048) + W(3, -1111745573, -1086728512, 1048944276, 1030986133) + + W(4, 1037975597, -1098029143, 1053562136, 1035090980) + W(5, 1032231158, -1099704976, 1041023999, 1038793940) + + W(6, 1021051177, -1107704157, 1031959404, 1031982829) + W(7, 1029296729, -1088435526, 1046674105, 1043937550); + sum2 = + W(0, 1076285256, -1071495861, -1089164092, 1024798548) + W(1, 1067013205, -1080654015, 1044446905, -1130255717) + + W(2, 1054912747, -1092768710, -1089831336, -1111620633) + + W(3, -1103468782, 1053690657, 1049463752, -1129289568) + + W(4, -1082179927, 1062196550, -1116071286, 1022374674) + + W(5, -1086354611, 1059230433, 1055604285, -1147177200) + + W(6, -1086555076, 1065208788, -1102169042, 1008723412) + W(7, -1077304359, 1069826015, 1049830695, 990531682); + WS(-1116843232, 1041538044); + sum1 = + W(0, 1038718416, 1050813118, -1091780513, -1107356403) + W(1, 1041393778, 1048646402, -1107072481, 1032833522) + + W(2, 1023355030, 1043671731, -1097953353, -1126022145) + + W(3, 1040958951, 1037057641, -1088265503, -1185162751) + W(4, 1040537034, 1050123337, -1105750724, 1038008293) + + W(5, -1112360254, 1052799074, -1091053114, -1123581176) + + W(6, 1043346413, 1037436293, -1121572392, 1033129910) + + W(7, 1047211822, 1042212684, -1091261766, -1116284746); + sum2 = + W(0, -1127892588, -1090048491, -1076486023, 1071993665) + W(1, 1025248710, -1124324076, -1080184847, 1067215194) + + W(2, -1127740272, -1092974499, -1080442855, 1068762214) + + W(3, -1114879615, 1047668544, 1048567939, 1014309155) + W(4, -1125515678, 1042122418, 1066323214, -1079656754) + + W(5, -1135605467, 1052455522, 1068938556, -1077318729) + + W(6, 1015277154, -1102075660, 1066205534, -1083078137) + + W(7, -1118452308, 1052515578, 1058048535, -1086246531); + WS(1045082936, 1047750074); + sum1 = W(0, 1017867382, 1038967959, -1107005280, -1117189504) + + W(1, -1105827232, 1036533543, -1101431328, 1000061951) + + W(2, -1139557912, 1048524561, 1044741561, 1034808454) + + W(3, -1098507795, 1057427781, -1099209723, -1102176472) + + W(4, -1112138258, 1057555836, -1103886606, -1102736460) + + W(5, -1113781499, 1044700722, -1117912777, -1102956733) + + W(6, -1117154624, 1037485187, -1108908881, -1113728179) + + W(7, 1024003356, 1046059755, 1024367918, -1108156515); + sum2 = W(0, 1003184961, 1024857236, -1114215978, 1037587704) + W(1, 971431442, -1109323954, 1030818718, -1121823736) + + W(2, -1131894760, 1026446282, 1031262679, 1045339410) + + W(3, -1133283297, -1105665514, 1056963612, -1107079097) + + W(4, 984723076, -1116186208, 1055283667, -1090072253) + W(5, 1031831407, 1024492508, 975724297, -1102678968) + + W(6, -1125590160, -1121629964, -1116339968, -1103014356) + + W(7, 1031681833, -1148808497, 1026784592, -1123463096); + WS(1059869006, 1015916977); + sum1 = + W(0, -1111801867, -1103727218, 1051877295, -1115491581) + W(1, 1039164638, -1102716146, 1051739903, -1106752078) + + W(2, 1023424768, -1089648586, 1057614174, -1104830517) + + W(3, -1118862224, -1092420393, 1055627629, -1112797325) + + W(4, -1114194639, 1049092536, -1096079006, 1038662167) + W(5, -1099094340, 1052180160, 1008315659, 1030088557) + + W(6, -1118811114, 1032231232, -1121275805, -1131680577) + + W(7, -1096321008, 1046058153, 1039975892, -1175801754); + sum2 = + W(0, -1113427160, -1090644207, 1034414883, 1038986783) + + W(1, -1104433368, -1091764889, -1120815960, -1135559136) + + W(2, -1104169884, -1109333336, 995253792, 1033390214) + W(3, -1117600576, 1065407690, 1059846520, -1120264784) + + W(4, -1102319880, -1098732665, 1048874179, -1104270640) + + W(5, 1039627671, -1109931470, 1008884504, 1019376128) + W(6, -1097619580, 1043714297, 1021072320, -1111461786) + + W(7, 1047721667, 1041133481, -1103318888, -1142244432); + WS(1054131356, -1077482588); + sum1 = W(0, -1100136045, -1101215881, 1045307006, 1047064142) + + W(1, 989703980, -1100083265, 1039854844, -1120855287) + + W(2, -1114161471, -1091699940, 1051542530, 1042850313) + + W(3, -1117800461, -1088812180, 1056393300, -1122501592) + + W(4, 1013262449, -1095974704, 1053327664, -1118254671) + + W(5, -1112319975, 1033042241, 1059113280, -1111473941) + + W(6, 1027862775, -1095224480, 1049428707, -1119385054) + + W(7, -1103330903, -1102789769, 1055440053, -1109190398); + sum2 = W(0, -1098032416, 1063396296, 1043414797, -1093635160) + W(1, 1055692800, 1024719031, 1032661901, 1049215120) + + W(2, -1101668743, 1065491656, 1058961916, -1090478816) + + W(3, -1100435053, 1073645059, 1063424749, 1050905898) + + W(4, -1089098280, 1060161647, -1096580753, -1135528507) + + W(5, -1094416925, -1074198531, -1098776178, 1042380471) + + W(6, -1099202751, -1081296593, -1115458644, 1032695397) + + W(7, -1104551065, -1083400329, -1092624053, 1054277265); + WS(-1082679118, -1072338335); + sum1 = + W(0, -1126832308, -1092407662, 1041636256, 1032452512) + W(1, 998650886, -1099976035, 1035459839, -1118647007) + + W(2, 1029713605, -1098757312, 1053507448, -1113994637) + W(3, 1045660229, 1049242330, -1097348797, 1019901759) + + W(4, -1125245511, 1052609817, -1097111418, 1026546307) + W(5, 1001090478, 1049104969, -1099322690, 1041545965) + + W(6, -1126242526, 958956607, -1116731426, -1113342195) + + W(7, -1128346278, -1170516592, 1009511091, 1027607012); + sum2 = W(0, -1069228184, -1099529380, -1112044089, -1144476451) + + W(1, -1073602631, 1043301860, 1041147606, -1112019052) + + W(2, 1021776922, 1054858487, -1119872164, 1036271953) + W(3, 1076866983, 1044685536, -1106846135, 1018899191) + + W(4, 1069809281, 1062109344, 1042271976, -1114284680) + + W(5, -1101499289, -1097491140, 1035368326, -1126672913) + + W(6, 1013617559, -1149319294, 1025827813, -1112053703) + + W(7, 1036050969, -1113127688, -1115137330, -1146921887); + WS(-1125906880, 1029353026); + sum1 = + W(0, 1052620124, -1082830235, 1044570800, 1033131793) + W(1, 1040928385, -1087911853, 1048894344, 1031982257) + + W(2, 1053619569, -1088553290, 1054767249, -1118254573) + W(3, 1034478636, -1115166792, 1052323270, 1037418321) + + W(4, -1149501032, -1104403058, -1096342700, 1045103465) + + W(5, 1027228408, 1046902211, -1092690897, 1053685367) + W(6, 1033816441, -1140598044, -1112660402, 1032758420) + + W(7, -1143379631, -1115398454, -1089842615, 1056771243); + sum2 = W(0, 1052242091, -1123374674, -1088438592, -1109756837) + + W(1, -1105901664, 1032004261, -1109896025, -1117902306) + + W(2, 1041713460, 1057464262, -1106721416, -1106560728) + + W(3, -1098081544, 1055897675, 1057898227, -1101499608) + + W(4, -1101414896, -1108453649, 1044097375, -1114554169) + + W(5, -1140318759, -1099401944, 1041656473, 1042131382) + + W(6, -1123485994, 1039811869, 1042751001, -1104786072) + + W(7, -1108472633, -1092934450, 1033994653, 1048148308); + WS(-1080878567, 1068324028); + sum1 = W(0, -1115471279, -1095139206, 1057833304, 1032811018) + + W(1, 1019310859, -1103458412, 1049561152, -1118469827) + + W(2, -1121098697, -1090917913, 1058273109, -1107876783) + + W(3, -1115193805, -1094785898, 1054221326, -1109399058) + + W(4, -1153442440, -1100131090, 1050583410, -1121957752) + + W(5, -1104713039, -1118370765, 1048985266, -1109945243) + + W(6, 1023975060, -1102569730, 1041261354, -1125987028) + + W(7, -1094675607, 1044057356, 1045920684, -1144681671); + sum2 = W(0, -1122597644, 1052263517, 1084267296, 1037076324) + W(1, 1032420914, -1132353885, 1077171750, 1017945885) + + W(2, -1109997244, -1113437764, -1076080701, 1045994672) + + W(3, 1029919127, -1086124512, -1066836895, -1105598049) + + W(4, -1129031901, -1134522929, -1073829589, -1115453382) + + W(5, 1025876905, -1137529969, -1128728545, 1027437378) + + W(6, -1121404056, 1041285329, -1128683125, -1112127416) + + W(7, 1025649559, -1111439550, -1109934248, 1032857588); + WS(-1106960696, -1099012034); + sum1 = W(0, -1114528403, -1099071342, 1055554285, -1109121109) + + W(1, -1119077260, -1099370430, 1049964157, -1115766890) + + W(2, -1143558020, -1089278443, 1061104081, -1114965299) + + W(3, -1119877760, -1086538844, 1056629915, -1120868875) + + W(4, -1109244232, 1010994112, 1049997315, 1034547527) + + W(5, -1096650748, 1041376829, 1042073805, -1114495407) + + W(6, -1112604445, 1042854492, 1031563405, -1139584324) + + W(7, -1100402892, 1049345155, -1123516568, -1118254096); + sum2 = W(0, -1116593925, 1027806287, 1032648371, 1024756439) + + W(1, 1028908115, -1136470458, 1006654490, -1116529299) + W(2, 999050165, 1039840949, 1052059722, -1107372324) + + W(3, 1037914955, -1122048333, 1057985079, -1128153177) + + W(4, -1106109711, 1057135276, -1090440242, -1142966917) + + W(5, -1105957739, -1105275062, -1131926605, -1123338691) + + W(6, -1123834115, -1096566133, 1018741845, 1013415162) + + W(7, -1113783754, -1105721601, -1124260101, 1018182189); + WS(-1103089976, 1059868827); + sum1 = W(0, 1026631887, -1091300264, 1056895190, 1031003956) + + W(1, 1033737723, -1096562704, 1050565142, -1140469197) + + W(2, 1034000797, -1087537316, 1059766350, -1108911023) + + W(3, -1130496915, -1094386976, 1053939124, 1032926090) + + W(4, -1106694966, 1044429902, -1108577640, -1120892680) + + W(5, -1105866475, 1045093007, -1109922270, 1034482579) + + W(6, -1106727101, 1040636078, -1122075862, -1136817768) + + W(7, -1098705919, 1044615672, -1100982776, 1045052014); + sum2 = + W(0, -1114832682, 1044376552, 1052671036, -1084839384) + W(1, 1038307608, -1101986459, -1094811671, -1076225566) + + W(2, -1109268272, 1025272345, -1106762472, -1074779618) + + W(3, 1031259614, -1112738770, 1052706603, -1088390497) + W(4, -1136199018, 1014008179, 1040752903, 1066038403) + + W(5, -1118450441, 1042085570, -1100877636, 1071357616) + W(6, 1025376385, -1110075404, 1051973899, 1068318141) + + W(7, -1125957173, 1027010884, 1036345951, 1050587817); + WS(-1089897038, 998399462); + sum1 = W(0, -1100326508, -1114312802, 1049930251, -1141222070) + + W(1, -1099771006, -1109889234, 1047140918, -1114407115) + + W(2, -1103969415, -1092992143, 1060325312, -1106384368) + + W(3, 1030998252, -1098209637, 1062808044, 1017922927) + + W(4, -1111096702, -1116385180, -1128865717, 1023432554) + + W(5, -1129527451, -1096464604, 1048691588, -1125954964) + + W(6, -1115021151, -1111889198, -1137813989, -1121716413) + + W(7, -1124899748, -1109224641, 1043572929, 1020452535); + sum2 = + W(0, -1094975511, -1113696880, 1023473326, 1029862812) + W(1, -1089233591, 1032844980, 1036803698, -1117299445) + + W(2, -1089977002, 1066397244, -1129026618, 1025970568) + W(3, 1033778332, 1037917830, -1104280508, 1031377784) + + W(4, 1006981461, 1039504138, 1024702770, -1122944997) + W(5, -1137053176, 1032622380, -1121975322, 1022461928) + + W(6, -1125132764, 1021506052, 974010432, -1130740686) + W(7, 979684320, -1119563165, -1138205260, 1024270227); + WS(-1096120220, -1099720911); + sum1 = W(0, 1052677544, -1105594052, -1101878153, 990296621) + W(1, 1027883172, 1050583742, -1120505890, 1026529890) + + W(2, 1046184634, 1030711656, -1094174707, 1039246623) + W(3, 1036941212, 1050761182, -1087347673, 1031039363) + + W(4, 1037786724, 1044997418, -1091299260, 1038193547) + W(5, 1039372749, 1051859318, -1092171165, 1036921611) + + W(6, 992842790, 1041579690, -1105854769, -1115076484) + + W(7, 1040590154, 1052858474, -1087724293, 1007468831); + sum2 = + W(0, 1040381409, 1023777345, -1110031849, 1022623295) + W(1, -1131846701, -1095435966, -1146822820, -1096899181) + + W(2, 1030695069, -1111411494, -1089001391, 1049343346) + + W(3, 1015259161, -1085163747, -1074171332, -1107180310) + + W(4, 1026868853, -1100600319, -1078760233, 1043071461) + W(5, -1164136976, 1052695808, 1048168469, 1020495459) + + W(6, -1121164685, 1041440525, 1074132102, 1017314953) + W(7, -1109936403, 1051545155, 1072577306, 1050115198); + WS(-1080112807, -1111145054); + sum1 = W(0, -1103297132, 1049824404, -1133975251, 1026400021) + + W(1, -1106341774, 1049617192, -1122989109, 1042898005) + + W(2, -1098278655, 1059552348, -1086286580, 1041608840) + + W(3, 1024154699, 1031972225, -1137351813, -1145221295) + + W(4, 1037514093, -1085661228, 1056970252, -1102084285) + W(5, 1034961350, -1097823136, 992708574, 1041904442) + + W(6, -1125780682, -1114326813, 1021582000, 1038246926) + + W(7, -1109009483, -1119831648, 1040424089, 1042525799); + sum2 = + W(0, 1041258750, 989910477, -1134607603, -1109794979) + W(1, -1109734283, -1100922013, 1016064722, 1041809078) + + W(2, -1123542769, -1096844113, 1041392492, -1126381362) + W(3, -1113561957, 1051742866, 1057819912, 982123162) + + W(4, -1110564237, -1100235579, 1047439582, -1119465765) + + W(5, 1026811493, -1105813951, -1113868277, 1026735929) + + W(6, -1130694514, -1151284621, -1118083589, 1019553626) + + W(7, 1024057869, -1136706867, -1114600003, -1114678252); + WS(1043409720, -1105036943); + sum1 = + W(0, 1040191749, -1096303173, -1115184605, 1041655059) + W(1, 1033970558, -1095924673, 1041748910, 1041917006) + + W(2, 1042494496, -1093807736, 1044442592, -1160531625) + W(3, 1046767380, -1092831585, 1042876074, 1039311757) + + W(4, 972615552, -1096756208, -1140612185, 1020654492) + W(5, 1032778168, -1126846855, 1018241414, 1043700571) + + W(6, 1032217109, -1115229280, 1027878365, 1034107952) + W(7, 1032356247, -1098580285, 1034858676, 1036396440); + sum2 = W(0, 1027808259, -1139047739, 986751832, -1095774205) + W(1, 1010119787, 1043340308, 1026247831, -1093511024) + + W(2, -1111510504, -1106790738, 1065364148, -1089533357) + + W(3, -1113418759, -1096910874, 1040723354, 1053173071) + + W(4, 1032132185, 1040059331, 1038861011, -1106558855) + + W(5, -1121052855, -1115460243, -1113647147, 1027584935) + + W(6, 1014515195, 1017581734, 1041604470, -1121443175) + + W(7, 1010692603, -1120741339, -1135975307, 1014681515); + WS(1035857520, 1029952289); + sum1 = + W(0, -1143077795, 1037051011, -1110400621, -1121149466) + W(1, -1105351783, 1029971495, -1106469910, 1043652126) + + W(2, -1113811952, 1049064844, -1094483622, 1027875988) + W(3, -1106526780, 1035603988, 1058276716, 1035104701) + + W(4, 1035289215, -1083894414, 1056346487, -1114346217) + W(5, 999420801, -1098557596, 1050633420, -1123554317) + + W(6, -1129002434, -1111645039, 1042325343, -1130799743) + + W(7, -1113970285, -1130790920, 1026109447, 1025377311); + sum2 = W(0, -1118517607, 1026484093, 1039465846, 1008581907) + + W(1, -1101077931, 1046485772, 1030900361, -1114630284) + + W(2, 1029148161, -1098019518, 1048118782, -1106945018) + + W(3, -1087996420, 1071267691, 1064954318, -1097625455) + + W(4, 1047526016, -1082674625, -1084489705, -1156379726) + + W(5, -1108756119, 1032470282, -1118487613, 1024110641) + + W(6, 1038718292, -1106613565, -1112021711, 1020048570) + + W(7, 1024464693, -1113199029, -1120012731, 1036291722); + WS(1058189134, 1034857672); + sum1 = + W(0, -1171748679, 1031241360, -1100969760, 987174985) + W(1, -1105475825, 1044072484, -1094075536, 1045893176) + + W(2, -1097172873, 1057114388, -1082247827, 1042860595) + W(3, -1108837708, 1051374554, 1060030327, 1031954257) + + W(4, 1038034707, -1083662360, 1058651386, -1120638978) + + W(5, -1131134898, -1099379283, 1046921459, -1137288661) + + W(6, -1113151849, -1121036423, 1041721673, 1037681908) + + W(7, -1119273967, 1018101850, 1036514264, 1029972391); + sum2 = + W(0, 1003810984, 1020569783, -1128982694, 1043745048) + W(1, 1036204547, -1114489126, -1099380876, -1104004872) + + W(2, -1101998989, -1121260135, -1101918458, -1104165612) + + W(3, 1041029203, 1052640914, 1059611184, -1121067579) + W(4, -1098215637, 1059150102, 1040381797, -1100369008) + + W(5, 1044393168, -1098121773, -1094102036, 1032515174) + + W(6, -1110527635, 1037147118, 1028175839, -1114899975) + + W(7, 1027560485, -1110248773, -1113935142, 1000033398); + WS(-1107450480, 1040804833); + sum1 = W(0, 1040192716, 1040473489, -1095196747, -1124855402) + + W(1, 1022226221, 1047969017, -1098407451, 1020416041) + + W(2, 1002013395, 1044185574, -1087290490, -1160070647) + + W(3, -1117682794, 1060667554, -1089168888, 1045737613) + + W(4, 1001040843, 1057909434, -1111951852, -1101676720) + + W(5, 1000424795, 1049088596, -1119291421, -1103624738) + + W(6, -1120982404, 1038016429, 1031577591, -1104451167) + + W(7, 1025306833, 1042416864, -1112956481, -1115902938); + sum2 = W(0, 1014727333, -1124633329, 1026257754, -1111611661) + + W(1, -1117243126, -1107065949, -1111801245, -1136702760) + + W(2, 1029406572, 1041729284, -1084100906, -1103677442) + + W(3, 1027900147, -1094200388, 1052541581, 1050798725) + + W(4, -1112527674, -1104959017, 1070744988, -1105828213) + + W(5, -1114664521, 1040214496, -1111707080, -1111536822) + + W(6, -1111634336, 1005029260, -1127513012, -1106506739) + + W(7, -1107116047, 1049039902, -1107038609, -1140667375); + WS(-1113867888, 1064515135); + sum1 = W(0, -1113562537, 1048061265, 1011269086, -1105945126) + + W(1, -1107046062, 1043460993, -1098944190, -1148623547) + + W(2, -1103978495, 1060048584, -1107431310, -1111558073) + + W(3, -1098739202, 1062873548, 1045822761, -1114838028) + + W(4, -1122423580, -1119786749, 1025265092, -1101841139) + + W(5, 1019693149, 1023528257, -1112998912, -1117915947) + + W(6, -1116789880, -1106657727, -1142662356, -1106868487) + + W(7, 1020558520, -1137576074, -1104660585, -1122252061); + sum2 = W(0, -1145158406, 1022878354, -1111624996, 1010204019) + + W(1, 1012385731, -1129472106, 1015658802, -1123973089) + + W(2, 1016118130, 1044961455, 1040055751, -1157676569) + W(3, 1024197601, 1049544336, 1057430996, 1022031298) + + W(4, -1112179804, 1030346877, -1114498280, -1124728962) + + W(5, -1119519161, -1131221354, 1020564842, 1023003938) + + W(6, -1127326042, -1095482557, -1112131584, -1121117277) + + W(7, -1113792718, -1093377057, 1019749938, -1141925830); + WS(1051333020, -1087054195); + sum1 = + W(0, -1112042433, -1104387605, 1052246829, -1113527444) + W(1, 1019002067, -1096771599, 1048899277, -1098301717) + + W(2, -1115058903, -1102529947, 1054136106, -1095193948) + + W(3, 1046618143, -1093976551, 1044227957, 1044013586) + + W(4, -1107874438, -1089735051, 1060328029, -1107288943) + + W(5, -1148774132, -1129150690, 1046377228, 1038700845) + W(6, 1036768028, -1101876091, 1045160291, 1024370318) + + W(7, -1154881470, -1098135714, 1045432325, 1019966234); + sum2 = + W(0, -1114066012, 1041392892, 1044719218, -1097547793) + W(1, 1029900262, -1112610934, 1046575198, -1095644935) + + W(2, -1114806697, 1041587346, 1050162797, -1102972970) + + W(3, -1110038644, 1025557898, 1055420600, -1095936036) + W(4, 1036646832, 1055783298, -1099287148, 1028020818) + + W(5, -1110070018, -1102485451, -1100701871, -1113902766) + + W(6, 1020625547, 988088600, 1033323822, -1135974783) + W(7, 987867800, 1039502616, -1119304428, 1018696751); + WS(-1120103648, -1090070191); + sum1 = + W(0, -1117418940, 1049030490, -1112262737, -1114427969) + W(1, 1024592611, 1050801054, -1094705236, 1032013281) + + W(2, 1040968250, -1111205267, 1042055990, -1110419822) + + W(3, 1049918615, -1116228463, -1085341341, 1047944497) + + W(4, 1034410595, 1050512309, -1106227665, -1132367051) + W(5, 1035134604, -1102511675, 1036298997, 1025392341) + + W(6, -1119948353, 1034763283, -1138448657, -1111046724) + + W(7, -1144523437, 1039656998, -1110564136, -1120201127); + sum2 = + W(0, -1122606938, 1046354401, -1124762815, -1118515993) + W(1, -1141997982, 1040228902, -1102583710, 1036845124) + + W(2, 1027805544, -1143835982, 1052785838, -1106443071) + W(3, -1120462650, 1061896257, 1059397472, 1043676745) + + W(4, -1100560083, -1080731069, -1120768779, 995709275) + + W(5, -1105726471, -1098049024, -1126645315, -1128858827) + + W(6, 1025575588, 1026943708, 1011421951, -1112152255) + + W(7, -1113668318, 1032253740, -1122685018, -1127110207); + WS(1060158670, 1068766623); + sum1 = + W(0, -1116432453, 1056712636, -1087151539, 1040295867) + W(1, -1131098839, 1049784895, -1102593034, 1033948341) + + W(2, -1099753724, 1057908127, -1089291740, 1031077093) + W(3, 1034945056, 1044163070, -1094800699, 1027113355) + + W(4, -1122123599, 1028198895, 1036808107, -1132674679) + + W(5, 1040823512, -1122504371, -1120242995, -1117547229) + + W(6, 1040184285, -1123329903, -1127465369, 1040274980) + + W(7, 1050332416, -1096645803, -1132187055, -1137741501); + sum2 = + W(0, 1036379663, -1098232449, -1128107780, -1120677803) + W(1, -1108907739, 1058983203, 1035811659, -1120240179) + + W(2, 1070189048, 1016986873, 1040144345, 1029686139) + W(3, 1073213180, 1047923452, -1105399966, -1109097268) + + W(4, 1065321765, 1033582270, -1110681209, 1041308319) + W(5, -1076673488, 1031365639, 1039880527, -1109042515) + + W(6, -1079893128, 1038048757, -1116001167, 1034493417) + + W(7, -1072585926, -1107019906, 1018297481, -1131123922); + WS(-1112459888, 1031046963); + sum1 = W(0, -1112719265, -1128634346, 1043326546, -1115081924) + + W(1, -1129483154, -1120462421, -1103778738, -1114915140) + + W(2, -1103727283, -1112785958, 1050524372, -1104237825) + + W(3, -1091575740, 1056781779, 1067939282, -1096588493) + + W(4, -1104335643, -1153409228, 1048587330, -1108534894) + + W(5, -1155155940, -1108013960, -1132710977, -1114726045) + + W(6, -1114094348, -1118230989, -1109505653, 991235804) + + W(7, -1105426861, 1027667442, 1036777787, -1111746006); + sum2 = + W(0, -1119086167, 1037241732, -1114652243, -1131518324) + W(1, 1013020612, -1129818230, 1028260797, -1115730540) + + W(2, -1141008560, 1029187991, -1112264831, 1036245214) + + W(3, -1108719150, -1074141953, 1072760747, 1034705438) + W(4, 1023891147, 1019083994, 1042535682, -1119172530) + + W(5, -1145112744, -1124211508, -1131878972, -1133917220) + + W(6, 1018251990, -1122886966, 1037493286, -1114007324) + + W(7, -1116478859, 1027168441, -1129254230, 1018465006); + WS(-1086783566, -1086791567); + sum1 = W(0, -1115195632, -1095708330, -1123676804, 1041725033) + + W(1, -1153026662, -1093442522, 1018199561, -1121101892) + + W(2, -1134496297, -1098161001, 1037878573, 1034570216) + + W(3, -1108787789, 1044632085, 1064261167, -1103584185) + + W(4, -1119803561, -1091375169, 1057417647, -1108866704) + + W(5, -1145121243, -1107384199, 1052226946, -1122033784) + + W(6, -1131708777, -1100078210, 1046948682, -1117964907) + + W(7, -1110064394, -1104664012, 1047330733, 1022321300); + sum2 = W(0, 1031515378, -1077397139, -1134939312, -1112896962) + + W(1, -1121810184, -1079753374, -1097085111, 1035985281) + + W(2, 1010081392, 1044674665, 1052841311, -1105060263) + W(3, -1119765868, 1073378801, 1007836336, 1031953140) + + W(4, 1035546479, 1056367001, 1044809025, 1022446080) + + W(5, -1106495935, -1109376902, -1118570548, 1031289566) + W(6, 1028378344, 1035615024, 992033726, 1032016077) + + W(7, 1003402623, -1118889676, 1010750288, -1150317246); + WS(-1096711324, -1080143969); + sum1 = W(0, -1135181951, -1095339398, 1050582337, 1026786373) + + W(1, 1025399430, -1094144146, 1049483953, -1123204644) + + W(2, 1033906501, -1093853897, 1045129706, 1006467326) + W(3, 1041786535, -1089314149, 1046728732, 1031608549) + + W(4, -1133559462, -1089126233, 1045641984, -1135165794) + + W(5, 1003671004, -1110956839, 1051092970, 1017185520) + W(6, -1123695637, -1129083412, 1049638101, 996324016) + + W(7, -1105366874, -1113909272, 1057307443, 1009923752); + sum2 = + W(0, 1023911567, -1108118447, 1044892126, -1112738860) + W(1, 1004932796, -1134375038, -1138359022, 1020475455) + + W(2, -1119124867, 1035251904, 1063133445, -1102926770) + W(3, 1022775023, 1037995724, 1074655410, 1047698054) + + W(4, 1011639102, 1050162042, 1070062472, -1113839430) + W(5, 1036397588, 1037707684, -1083132698, -1117927031) + + W(6, 999444348, -1111062570, -1073510095, 1017195567) + + W(7, -1106309084, -1101285996, -1073687480, 1041743674); + WS(-1089880270, 1068594400); + sum1 = + W(0, -1114467040, -1104513741, 1050219169, -1118490053) + W(1, 1023170830, -1091458130, 1042545281, -1120682309) + + W(2, 1036273894, 1034367029, 1048674674, 1031296832) + W(3, -1107800974, -1100997781, 1042739212, -1110241363) + + W(4, 1029867434, -1095286649, 1053624831, 1034289100) + W(5, -1106779367, 1047811540, 1034908007, -1107012174) + + W(6, 1024593089, -1096228817, 1034674708, 1021221591) + + W(7, -1110449433, -1109179032, 1049808694, -1126204757); + sum2 = W(0, 1030004067, -1133064657, 1024174065, -1119836251) + + W(1, -1117028113, -1134091777, -1113615539, 1025775761) + + W(2, -1105887481, 1045929484, 1032698350, -1118489229) + + W(3, -1066126465, 1081917443, -1097201480, 1041573100) + + W(4, -1104777348, 1043726141, 1033613382, -1124268877) + + W(5, -1122550707, 1028310407, -1107697461, 1030764051) + + W(6, -1130918117, 1016764395, 1029778305, -1116797441) + + W(7, 1023720579, -1116064873, 1018371831, 1018350967); + WS(1067475431, -1126058166); + sum1 = + W(0, -1108052732, -1097851361, 1049362324, 1040199303) + W(1, 1043040440, -1108210069, 1048929252, -1109622414) + + W(2, 1048922396, -1084429932, 1054104112, 1041203782) + W(3, -1097574342, 1055911149, 1047147106, -1104274751) + + W(4, -1119673025, 1041902328, -1085779789, 1047880876) + + W(5, -1101774749, 1035827603, 1049622021, -1116198608) + + W(6, 1019400344, -1115594513, 1019477630, -1107876353) + + W(7, 1007801026, -1107003538, 1037086373, 1036701569); + sum2 = + W(0, 1013753738, 1020731454, -1120697178, 1009873360) + W(1, -1113150555, 1046742995, 1034035253, -1099358283) + + W(2, 1015248850, 1045156685, -1094710566, 1039470065) + W(3, 1042650722, -1104352239, -1128318417, 1046693145) + + W(4, 1040818978, -1089864705, 1045040370, 1036008061) + W(5, -1105652199, 1045331461, 1025091411, 1030627793) + + W(6, 1033430289, -1109224259, -1106535436, 1017876415) + + W(7, -1120377801, 1016214593, 1019751894, -1132110931); + WS(1060496974, -1099362699); + sum1 = W(0, 1054706808, -1109706041, -1098091909, -1129324363) + + W(1, 1036662868, 1041317773, -1123237413, 1015757258) + W(2, 1045895019, 1051554925, -1091928498, 1021341985) + + W(3, 1033303646, 1049334366, -1083798889, -1112852963) + + W(4, 1044095763, 1051166813, -1095315343, 1041804248) + + W(5, -1130190200, 1053590462, -1087007295, -1127492145) + + W(6, 1035564779, 1049285205, -1097088265, 1039262630) + + W(7, 1040746168, 1055551482, -1094550458, -1114905285); + sum2 = W(0, -1073385920, 1077926840, 1032559783, -1094451238) + + W(1, -1084887580, 1058818874, -1089669880, -1121878040) + + W(2, -1083140914, 1060159151, 1045764296, -1173171215) + + W(3, -1081800202, 1074845707, 1059775011, -1120435570) + + W(4, -1085954594, 1061906872, -1103860568, -1115590029) + + W(5, 1037413129, -1084431515, -1094536545, 1053315192) + + W(6, -1096433065, -1126824848, -1133232881, -1107838893) + + W(7, 1054210787, -1087315344, -1099186518, 1052978812); + WS(-1078369703, 1041267413); + sum1 = W(0, 1024386586, 1041630887, -1102607056, 1016693023) + + W(1, -1098405416, -1112635974, 1051293608, 1018393854) + + W(2, 1044040033, -1132435208, -1094040968, 1046099151) + + W(3, -1098286219, 1041292515, 1052507157, -1095618428) + + W(4, -1130684104, -1091497929, 1056853585, 1018959206) + + W(5, 1045750173, 1016159377, -1105775474, -1117949682) + + W(6, -1098338270, -1139597330, 1049412460, -1118540325) + + W(7, 1041584973, -1101611546, 1026100205, 1040982949); + sum2 = W(0, 1035615459, -1097925659, 1043665288, 1020457849) + W(1, 1028814353, 1038714809, 1033337220, -1103657321) + + W(2, 1062855981, -1077657685, 1051048913, -1109823715) + + W(3, 1052250964, -1101970047, -1113114333, 1058024935) + + W(4, 1056109526, -1098468896, -1085664062, 1056999181) + + W(5, -1106019250, -1114182260, 1040975429, -1105846491) + + W(6, 1048995011, -1104046747, -1109605260, 1042595027) + + W(7, -1115640692, -1130122971, 1034778788, -1112374505); + WS(1049151900, -1114127847); + sum1 = W(0, 1050216581, 1044969414, -1106856243, -1099359923) + + W(1, 1000015204, 1047621718, -1112471205, -1148711507) + + W(2, -1136218178, 1057314961, -1091938023, -1133921207) + + W(3, 1023136961, 1055877843, -1092033343, -1112054390) + + W(4, -1130455775, 1054358666, -1099719178, 1034273823) + + W(5, -1133465094, 1052966059, -1089783713, -1122838974) + + W(6, -1160090192, 1045850836, -1099053307, 1019980258) + + W(7, 1035991733, 1052491071, -1087984664, -1112322824); + sum2 = W(0, -1105478410, 1011113448, 1068049752, -1082501551) + + W(1, 1039552519, 1050864081, -1103020148, 1059003564) + + W(2, -1131405058, -1125310098, 1066695202, -1098156272) + + W(3, -1099466970, 1043215106, 1074596924, 1039344435) + W(4, 1049027924, 1034334973, 1067601936, -1099880092) + + W(5, -1115050596, -1095883745, -1084539788, -1107282542) + + W(6, -1129231446, 1036178144, -1075514015, -1097076855) + + W(7, 1049583286, -1088635155, -1074115054, 1042018058); + WS(-1081332839, -1093454830); + sum1 = W(0, -1109709318, 1035356975, 1039420520, -1111308088) + + W(1, -1104916884, 1037116623, -1122158672, 1014687039) + + W(2, -1108177419, -1125155242, 1053028347, -1112931654) + + W(3, -1117212646, 1030327966, -1104761999, 1020526050) + + W(4, -1119705461, 1050241163, 1032136206, -1119448076) + + W(5, 1032417267, -1103907222, -1115200780, -1112611266) + + W(6, -1118748528, 1046095669, -1115609017, -1136487898) + + W(7, 987327371, 1033262333, 1029855614, -1104533373); + sum2 = W(0, 1013207527, -1118344664, -1124997045, 1036829905) + + W(1, -1127355075, 1028266047, -1117884424, 1016171285) + + W(2, -1103159789, 1043690369, -1116887196, 1024917624) + W(3, 1040955478, 1051132935, 1047094008, 1041601336) + + W(4, 1008876024, -1108842627, 1057384051, -1127506713) + + W(5, -1116686760, 1041402295, -1100609336, 1033786361) + + W(6, 1035764738, -1105537330, -1098518151, -1114313206) + + W(7, -1154118338, -1128237045, -1089828796, -1102385561); + WS(1063446990, 1030048893); + sum1 = W(0, -1131562670, 1043069042, -1108681470, -1108650254) + + W(1, -1099483503, 1049571969, -1106599551, -1106453175) + + W(2, -1106193120, 1061428532, -1097709592, 1008661917) + + W(3, -1102405700, 1053095529, 1046689338, -1102088711) + + W(4, 1021119810, -1115069793, 1029025472, -1123233168) + + W(5, -1113568905, -1119868742, 1006738196, -1104754348) + + W(6, 1009340592, 1027160065, -1120287391, -1136963210) + + W(7, 1030255032, 1043118346, -1111789333, -1114502129); + sum2 = W(0, 1012371361, 1017109065, -1110016822, -1103671135) + + W(1, -1149491589, -1115161102, -1109821790, -1097972516) + + W(2, 1023756477, 1012418345, 1060485172, -1094449842) + + W(3, -1165255819, -1111308586, 1031379047, 1049769129) + W(4, -1111467932, 1015942947, 1046805034, 999148403) + + W(5, 1019335917, -1106016138, -1114576028, 1022790203) + + W(6, -1140694601, 1015823021, 1024897044, 1032463998) + + W(7, 1010513313, 1026481588, -1114618076, -1146831635); + WS(1060385486, 1040268319); + sum1 = W(0, -1115333181, -1105770459, 1048230464, 1022495614) + + W(1, -1113839600, -1104706211, -1122113023, -1115044751) + + W(2, 1026945989, -1085502934, 1051932092, 997701279) + W(3, 1041834949, -1112644646, 1065603891, 1044329112) + + W(4, -1100015113, -1102865873, -1105250533, 1038196649) + + W(5, 1010458454, -1112283012, 1054415097, -1113673817) + + W(6, -1113704543, -1108020290, -1122402466, -1105082025) + + W(7, -1110169699, -1115522389, 1046973419, -1115640050); + sum2 = W(0, -1115664423, 1041813775, -1142717933, -1120925434) + + W(1, -1122287706, 1041645390, -1094011677, -1119842210) + + W(2, 1044568139, -1087138046, -1124627987, -1120985148) + + W(3, -1099350461, 1067461852, 1027339570, -1113918825) + + W(4, -1102715015, -1116572542, 1045144111, -1100833175) + + W(5, 1042022920, -1109622665, 1054026149, -1101147879) + + W(6, 1031291077, -1113357449, -1122353792, -1112018489) + + W(7, 1032474264, -1110133469, 1047364150, -1109170005); + WS(1049043868, 1050086952); + sum1 = W(0, -1127858130, -1091279607, 1054362490, 1028884238) + + W(1, 1025810768, -1101354119, 1044465651, 1022883995) + W(2, 1034666762, -1089232423, 1050465752, 1032068165) + + W(3, 989092984, -1092016019, 1058690160, 1005443958) + W(4, -1115481017, -1089729669, 1053482909, 1007092039) + + W(5, -1119959429, -1104525366, 1051092259, -1149438996) + + W(6, 1012364567, -1121438163, 1019953121, -1137072337) + + W(7, -1097661520, -1160888088, 1051219071, 1017307814); + sum2 = + W(0, 1030282550, -1099759289, 1070065566, -1078832473) + W(1, 1012065197, 1050936278, 1068820850, -1076346523) + + W(2, 1049708534, 1018991152, 1068572253, -1075628240) + W(3, -1101566471, 1050588571, 1075164582, -1072955990) + + W(4, 1043525707, -1112383125, 1046261639, -1093459475) + + W(5, 1038111746, -1121285468, 1053555382, -1088795804) + W(6, 1040589253, 1039884984, 1040055978, -1099780818) + + W(7, -1106531005, -1113841779, 1058828770, -1090423367); + WS(-1083655502, 1074535575); + sum1 = W(0, 973651072, -1100106921, 1049212555, -1122472503) + W(1, 1028862937, -1096173461, 1052529147, 996549482) + + W(2, 1029517469, -1088250868, 1057957824, -1111380529) + + W(3, -1111330742, -1101351113, 1060855844, -1125410415) + + W(4, 1043404639, -1092528244, 1050267538, -1109626381) + + W(5, -1105397947, 1034877328, -1104065896, -1122247818) + + W(6, -1129726574, -1113904430, 1041335934, -1108333759) + + W(7, -1099887737, -1118418050, 1047916353, 1037233742); + sum2 = W(0, 1037582341, -1116649305, -1107051108, 1040538112) + + W(1, 1032149251, -1112916551, 1041643977, -1112067691) + + W(2, -1135487115, 1044443302, 1030763641, 1036263743) + + W(3, -1107247151, -1117703407, 1053360182, -1115814520) + + W(4, 1053968825, 1049963138, -1087331905, 1035849297) + + W(5, -1096732175, 1042101117, -1089009482, -1104153316) + + W(6, 1034930229, 1046616621, -1110671517, -1104877620) + + W(7, -1094249638, -1127010106, 1059951262, -1116847106); + WS(-1132786560, 1056578758); + sum1 = W(0, 1031072232, 1043718831, -1098888378, -1123786893) + + W(1, 1019453021, 1050053971, -1104586611, 1030360908) + + W(2, -1112153353, 1057505465, -1090760605, -1123598824) + + W(3, -1127115205, 1049535379, -1081773448, 1035671447) + + W(4, -1153314582, 1052394474, -1106021324, 1044649456) + + W(5, -1105591705, 1045418390, -1120283669, -1105554848) + W(6, 986346381, 1044283028, 1036365944, 1033186457) + + W(7, 1024604121, 1048806335, -1103287167, -1108912601); + sum2 = + W(0, 1040658557, 1011638864, 1041865287, -1109113498) + W(1, -1106354313, 1020064744, -1103147627, 1033931950) + + W(2, 1027144364, 1049840877, 1026998340, -1120927100) + W(3, -1103628435, 1050147177, 1053587315, -1102211113) + + W(4, -1123462592, -1117174472, -1118058864, 1033328738) + + W(5, -1130705048, -1105120318, 1036775410, -1101351534) + + W(6, -1126068784, -1113970774, -1104140895, 1028877580) + + W(7, 1016031184, -1135769248, 1030416564, -1112076066); + WS(1062711758, -1109562142); + sum1 = W(0, -1107075140, -1100622401, 1053288051, 1017596397) + + W(1, -1125545776, -1104747337, 1049612355, 1007433175) + + W(2, -1121788380, -1103229831, 1059638178, -1120034657) + + W(3, -1112684886, -1083301774, 1048337697, -1098025711) + + W(4, -1128625782, 1050510715, 1052952654, -1112854653) + + W(5, -1102890883, -1097610180, 1051307580, -1108240645) + + W(6, -1129119788, -1109077454, 1041285742, 1022176121) + + W(7, -1102110160, 1030737729, 1049115768, 1020667959); + sum2 = W(0, 1022257834, 977550902, -1113927342, 1036504102) + W(1, 1033804876, -1105772859, 1042844173, -1107093105) + + W(2, 1033963400, -1098748483, -1096777339, 1028160469) + + W(3, -1113268759, 1063293804, 1059312088, -1089861840) + + W(4, -1123922685, -1090033704, -1134320563, -1101525036) + + W(5, 1029999681, 1051039483, 1037687330, 1017532722) + W(6, 1015463858, -1104977553, 1024487701, -1122996995) + + W(7, -1125618402, 1022914778, 1004875175, -1116068477); + WS(1046002488, -1083997249); + sum1 = W(0, -1116203964, -1099156844, 1050076828, 1025075217) + W(1, 1044431961, 1028498222, 1049400252, 1035032656) + + W(2, 1041235242, -1096363997, 1050263757, 1032516798) + W(3, 1046371486, -1079124621, 1020370202, 1050189128) + + W(4, -1106267745, -1088685662, 1048790666, 1042510329) + + W(5, -1117705943, -1103556299, 1053355933, 1039724554) + W(6, -1122870401, 999993136, 1034829570, 1027729159) + + W(7, -1109240562, -1106798659, 1037276039, 1037249299); + sum2 = W(0, -1094982381, 1041875660, 1017839086, 1045890174) + + W(1, 1024745423, -1091311273, 1044409386, -1107764806) + W(2, -1097113645, 1042706326, 974632891, 1048260200) + + W(3, 1017043870, -1148119319, 1061393923, -1118443235) + + W(4, 1052555320, -1098101314, 1043955676, -1097368628) + + W(5, -1107563793, 1010824956, -1098402228, 1041238578) + + W(6, 1049262968, -1094774489, 1042935118, -1116185663) + + W(7, -1118735987, 1030619863, -1094515595, 1042214090); + WS(-1083255246, -1075588436); + sum1 = + W(0, -1154522904, 1026375684, -1099839750, 1037990411) + W(1, -1106371438, 1036249778, -1113752075, -1119606102) + + W(2, -1105464695, 1056687627, -1092436626, 1043935324) + W(3, 1036086422, -1097055709, 1050924256, 1036476796) + + W(4, 1023783355, -1088556578, 1056650964, -1111337285) + + W(5, -1127243930, -1108055408, 1045926824, -1110940389) + + W(6, 1030176790, -1105944807, 1039385437, -1124332025) + + W(7, 1031412139, -1123388097, 1041066449, 1021333175); + sum2 = W(0, -1117330831, 1032531181, 1043756688, 1060766869) + W(1, 1023708058, -1114369361, 1031926890, 1067300065) + + W(2, -1133288218, 1017487862, -1104593512, -1105945514) + + W(3, -1122435213, 1047518334, 1043258354, -1075696003) + + W(4, -1139180683, -1122916014, -1096895795, -1102393264) + + W(5, 1020252429, 1027012545, 1049767697, -1106946489) + W(6, 1025188082, -1103557501, 1019544307, 1020047431) + + W(7, -1109968059, 1046855474, -1112657711, -1113285900); + WS(1056055196, 1023945849); + sum1 = + W(0, -1104545849, 1036175954, 1032040419, -1111539988) + W(1, -1139517988, -1138851412, 1009002268, 1026875367) + + W(2, -1101013315, 1048468083, 1040659763, -1104005681) + + W(3, -1136100212, -1097789539, 1059870683, -1112873620) + + W(4, -1148373856, -1096999890, 1039368714, -1135793772) + + W(5, 1013350648, -1097071058, 1053644410, -1132670698) + W(6, -1120654743, 995622088, -1122818538, 1028030253) + + W(7, -1108930702, -1128233700, 1033002810, -1133516850); + sum2 = W(0, 1033182461, -1110992702, 1011638125, -1116812221) + + W(1, -1135790885, 1041801313, 976542168, -1135785781) + + W(2, 1036058972, -1115959119, -1106760241, 1013579453) + + W(3, -1145806187, -1083556559, -1068720208, 1034110873) + + W(4, 1026470367, 1047402951, 1080067579, 1048786168) + W(5, -1125994579, 1026458945, 1043021822, -1124564059) + + W(6, -1123856921, 1021989349, -1118809257, -1115658442) + + W(7, -1152817846, 1029289545, 1027196491, -1110636256); + WS(1047050040, 1036867972); + sum1 = W(0, 1031952202, 1041031945, -1098508279, -1117663192) + + W(1, 1040033213, 1050476745, -1097704487, 1033331580) + W(2, 1049413776, 1016870010, -1091275871, 1012948685) + + W(3, 1052329098, 1054273441, -1087382286, 1043041286) + + W(4, -1134253939, 1041748879, -1095309386, -1131302504) + + W(5, 1023712847, 1035493153, -1117526273, -1125396951) + + W(6, -1129317744, 1041656495, -1112254893, -1153578470) + + W(7, 1023414180, 1041394937, -1108492595, -1112644847); + sum2 = W(0, -1120609508, -1138324119, -1110367912, 1021280635) + + W(1, -1098653081, 1042859622, 1038385587, 1026624912) + W(2, -1074671298, 1072071026, 1026263792, 1026288466) + + W(3, -1081276780, 1068070176, -1107049493, -1122098825) + + W(4, -1097107702, 1044485226, 1024907208, 1040255596) + + W(5, -1110118090, 1040658983, -1122488627, -1152233050) + + W(6, -1137118351, -1118978815, 1038809437, -1126727249) + + W(7, -1119823807, 1035453187, -1111098449, 1006813455); + WS(1047287096, 1059538103); + sum1 = W(0, 1030804480, 1034749929, -1102474905, 1013951379) + + W(1, -1111595219, 1051408038, -1094490621, 1039425378) + + W(2, -1123153834, 1049213285, -1099609086, -1112788128) + + W(3, -1098057279, 1057344539, 1048597242, -1098419769) + + W(4, 1007980582, 1048793645, -1094890059, -1118093753) + + W(5, 1018775223, -1106759404, 1046324795, -1108341356) + + W(6, 1036089754, -1115115061, 1003815995, -1120388747) + + W(7, 1030691489, 1033654600, -1126686757, -1135294247); + sum2 = W(0, -1112864979, 1024004698, 1034996841, 1004307827) + + W(1, 1034721747, -1109416755, 1041661735, -1116757818) + W(2, -1108077379, 988806988, 1041642045, 1037366938) + + W(3, 1023366533, 1058238498, 1008174217, -1107547239) + + W(4, 1021246669, -1115279539, -1122858630, -1108868659) + + W(5, 1032508120, 1041332549, -1089151778, -1128614293) + + W(6, -1113986367, 1033457886, -1130797677, -1130732717) + + W(7, -1153257254, 1018109285, -1111548255, -1122125438); + WS(1066216871, -1084582294); + sum1 = + W(0, 1009745022, -1095963722, 1050775177, 1027534757) + W(1, 1023325836, -1096473834, 1046303345, -1126933960) + + W(2, 1034246149, -1087129751, 1057767679, -1118146623) + + W(3, -1103455511, -1142570129, 1064400323, -1103828265) + + W(4, 1025953385, -1094684497, 1038452388, 1018950609) + W(5, -1105242559, -1107829831, 992534739, 1030437560) + + W(6, 988118663, -1107520037, 1025316967, 1020674901) + W(7, -1107601837, -1117719279, 1044853309, 1033139589); + sum2 = + W(0, -1127013105, 1031626404, 1029958550, 1017794797) + W(1, 1018526115, -1117975133, -1113082476, 1023300847) + + W(2, -1123587641, 1062148372, 1035325186, -1145491637) + W(3, 1052346460, 1074624908, -1130733653, 1041942663) + + W(4, -1098654594, -1090512380, 1046581721, -1113152926) + + W(5, 1029804743, -1070854231, -1113725416, -1139181075) + + W(6, -1118240305, -1095518794, 1031776819, -1120299385) + + W(7, 1030491706, 1041467716, -1115594754, -1142763637); + WS(1033725552, -1082653885); + sum1 = W(0, 1027658456, -1091894661, 1054730080, 1024810077) + W(1, 1033791775, -1094613753, 1052727904, 1020875129) + + W(2, 1038169633, -1085886368, 1060322284, -1114253244) + + W(3, -1130834725, -1094605577, 1054915405, 1021660859) + + W(4, -1105755912, 1049096200, -1115316932, 1010914050) + + W(5, -1107114253, 1038006563, -1113871235, 1032412472) + + W(6, -1106878767, 1040399888, -1114082704, 1016596422) + + W(7, -1102176852, 1038046228, -1098681477, 1044096992); + sum2 = + W(0, -1126607908, -1109006144, -1093467963, 1059727060) + W(1, -1111819446, 1050929158, 1063076656, 1073053378) + + W(2, 1032709615, 1025316173, 1048889614, 1073749745) + W(3, -1119610542, -1107176811, -1090320472, 1058093447) + + W(4, 1027594385, -1123863107, 1046933317, -1079533534) + + W(5, 1029384695, -1122531221, 1051206364, -1073154062) + W(6, -1115269200, 1026796828, 997945380, -1075936158) + + W(7, 1032209203, -1115616555, -1109796884, -1088004581); + WS(-1087442510, 1045166814); + sum1 = + W(0, -1106921670, 1032009478, 1041337656, -1110338367) + W(1, 1032907600, -1127325529, -1100890040, 1042108264) + + W(2, -1111070674, -1106321881, 1060092296, -1105899594) + + W(3, 1047421629, -1085655355, 1044767811, 1027442111) + W(4, -1094092352, 1057239638, 1040377247, -1105935775) + + W(5, 1031075349, -1098381173, 1037296628, 1037469097) + + W(6, -1136240762, -1128650952, -1131454723, 1027139781) + + W(7, -1129052086, -1107389381, 1037463686, 991481919); + sum2 = W(0, -1119426781, 1040351141, -1104019881, 1015410156) + + W(1, -1109786529, 1043540747, -1106797782, 1043466418) + + W(2, 1041819143, -1105926532, -1098594115, 1048709183) + + W(3, 1018220925, -1133247980, 1066013053, -1092013542) + + W(4, -1103055916, -1096724541, -1136157126, -1109288787) + + W(5, -1124599508, 1038612076, -1097021086, 1027934232) + W(6, 986571056, 1019567362, 1025702119, -1140871148) + + W(7, 1024618671, -1143357456, 1008181894, 1027080058); + WS(1059279054, 1041683061); + sum1 = W(0, 1028823114, -1096417644, 1041071884, 1040139175) + + W(1, 1033060856, -1095251776, 1051348966, -1133443258) + + W(2, -1136683218, -1096755466, -1106154521, 1027763154) + + W(3, 1041097809, -1095420880, 1062896338, 1037083176) + + W(4, -1108712682, -1087904547, 1057053635, -1109247178) + + W(5, -1099515041, -1117180600, 1050313119, -1169250436) + + W(6, -1114499693, -1113115866, 1041134484, 1007514196) + + W(7, -1105525449, -1121084634, 1043053335, 1031868218); + sum2 = + W(0, -1104031080, 1039900182, 1028023758, -1125301559) + W(1, -1113246189, 1044206765, -1122555834, 1027754708) + + W(2, -1124792744, 1043086617, 1041018096, -1129842792) + + W(3, -1107688308, 1057123143, -1100462314, 1022410763) + + W(4, -1084040655, 1066602722, -1123151815, 1034604384) + W(5, -1089958554, 1037219700, 1032289221, 1029558442) + + W(6, -1098618924, -1111210157, 1028867168, -1139711519) + + W(7, -1098033920, 1036938090, -1143651414, -1122704124); + WS(-1093886876, -1092780259); + sum1 = W(0, 1031521076, 1034696971, -1098366291, 991412379) + W(1, 1040859655, 1027092583, -1107551117, 1023411481) + + W(2, -1123954783, 1057011018, -1084481759, 1037665034) + + W(3, -1115369432, 1055452141, -1086775792, 1037775165) + + W(4, 1027325374, 1055461116, 1050583573, -1102735091) + + W(5, -1130075936, 1043845385, -1098824964, -1106471523) + + W(6, 1017430099, 1041326696, 1032795870, -1113156096) + + W(7, 1005655277, 1045628689, -1110858724, -1108701199); + sum2 = W(0, -1099549152, -1115620025, 1042476476, -1128057356) + + W(1, -1101982776, -1110046443, -1138118945, -1104607948) + + W(2, 1039636960, 1067650764, 1056117723, -1129519972) + + W(3, 1065032135, -1096892917, -1084935200, 1039009532) + + W(4, 1046191187, -1084058149, 1043334912, 1042222420) + + W(5, -1112740199, -1089814493, -1116550886, -1114781123) + + W(6, -1120755726, 1022618460, 1030169574, 1023299940) + + W(7, -1138571865, -1106519005, -1123579094, 1029490149); + WS(-1103384376, 1050555318); + sum1 = + W(0, 990997212, 1056616014, -1113359817, -1104278389) + W(1, -1104723373, 1049493908, -1101985253, -1112669305) + + W(2, -1102560870, 1060440249, -1095607555, -1117918862) + + W(3, -1110645588, 1063537686, -1091747296, -1124628967) + + W(4, -1114771100, 1049398171, -1098384586, -1120789735) + + W(5, 1006886950, -1123261404, -1094355067, 1020875660) + W(6, 1011892746, 1042753094, -1098733239, 1029891897) + + W(7, 1041403778, 1041297647, -1099641616, -1143354303); + sum2 = + W(0, -1097904627, 1056762738, 1033294591, -1113205081) + W(1, -1102268820, 998260703, -1102966386, -1105114179) + + W(2, -1101696600, 1049156882, 1040206209, 1028552759) + W(3, -1102083058, 1055125136, 1048772561, 1023069474) + + W(4, -1100977750, 1040009482, 1004029807, -1108173489) + W(5, 1022682138, -1099421122, 1040485303, 1040370279) + + W(6, -1105396681, -1114104451, -1118051402, -1109779069) + + W(7, 1035758392, -1112582051, 1040482786, -1135668672); + WS(1042369848, -1095650924); + sum1 = + W(0, 1032801852, 1060985291, -1088222536, -1154392525) + W(1, -1124780413, 1056066249, -1093287088, 1017158008) + + W(2, -1142443027, 1059062488, -1089766974, 1041310978) + + W(3, 1031124370, 1046815795, -1084610255, -1111535759) + + W(4, 1024489633, 1051554984, -1096293908, -1118760812) + W(5, 1037041722, 1026983110, 1035048291, -1118618480) + + W(6, -1157391942, 1037131073, -1113190096, 1032589425) + + W(7, 1048283534, 1028118439, -1107690581, -1101944856); + sum2 = W(0, 1056251107, -1084477192, -1077785336, 1053829707) + + W(1, -1118435725, 1041984407, -1086371528, -1113013425) + + W(2, -1111043713, -1093515412, -1093010832, 1046411943) + + W(3, -1090037466, 1073185178, 1074151927, -1090694669) + + W(4, -1129656805, 1051712939, 1054463958, -1095714333) + + W(5, -1093926860, 1053076395, -1094829660, -1103046632) + + W(6, 1052716525, -1096065312, -1090812268, 1035367276) + + W(7, -1083761792, 1066458198, 1063500158, -1087950464); + WS(-1081634407, -1072784825); + sum1 = W(0, -1102740818, 1024862651, 1056867014, 1016622683) + + W(1, -1115394775, 1046040367, 1027952685, -1112643478) + + W(2, -1101924733, -1109613465, 1058509811, -1096240139) + + W(3, -1100839185, -1115978107, 1050187219, -1101581667) + + W(4, -1123768914, 1049722038, -1098437541, 1008822020) + + W(5, -1140848016, -1098661743, 1033615035, 1023463264) + + W(6, -1118249725, -1138059466, -1143195264, -1116668435) + + W(7, -1116477425, 1025943000, -1132571500, 1036595961); + sum2 = + W(0, -1139809909, 1046126277, -1119940899, 1040903120) + W(1, -1126178115, -1111752353, 1055245806, -1104413152) + + W(2, 1032546581, 1034216546, -1088954301, 1019748625) + W(3, -1097752958, 1042101074, 1058677046, -1089277711) + + W(4, 1042272246, 1043290796, -1087007443, 1028591970) + + W(5, -1118367610, -1112722386, 1048637958, -1139620757) + + W(6, -1138081685, 1034532478, -1140548675, 1017306737) + W(7, 1017774855, 1030093406, 1029648824, 1033828758); + WS(1050645916, 1033550915); + sum1 = W(0, -1118556120, -1107219907, 1039060494, 1030703933) + + W(1, -1108262319, 1043545243, -1145250020, -1110184190) + + W(2, 1043230361, -1086762442, 1059123936, -1110311564) + + W(3, -1094947334, -1104041435, 1057758321, -1100512367) + + W(4, -1103841584, 1058293794, -1096913490, 1044416908) + + W(5, 1018079143, -1097977901, 1039599795, -1132472896) + + W(6, 1032598742, 1041130248, -1151122424, -1147952664) + + W(7, 1008731683, -1123331655, -1123961290, 1022228292); + sum2 = W(0, 1040267615, -1112791644, 1010515766, 1024308395) + W(1, 1048409433, -1110540665, 1032365064, 1041630361) + + W(2, -1107165984, -1088877638, -1090038325, 1040244783) + + W(3, -1086251247, 1053330884, 1049266570, 1037513285) + + W(4, -1113957324, 1057377190, 1028890653, -1098504745) + + W(5, -1107976602, 1057673067, -1103454662, 1039941233) + + W(6, -1122078587, 1024512949, 1041725883, -1103661415) + + W(7, -1111525785, 1042772014, -1143554104, 1024552651); + WS(1051978908, -1102077462); + sum1 = + W(0, -1132165009, 1045761591, 1013540534, -1106078467) + W(1, -1117187439, 1051430047, -1096198150, 1014010165) + + W(2, -1108837850, 1060286099, -1130717861, -1121999817) + + W(3, 1037183202, 1046972447, -1085387922, 1030141582) + W(4, 1028473682, -1128782822, -1105434962, 1008925446) + + W(5, 1045655273, 1028047735, -1101497054, 1018887490) + + W(6, 1025240990, -1178179968, -1110960744, -1122721428) + + W(7, 1033734537, 1035331372, -1102517015, 1026996307); + sum2 = W(0, 1023072493, 974611657, -1101792417, -1112121991) + W(1, -1125531833, 1047662948, 1051899312, 1037288067) + + W(2, 1030396885, 1035351326, 1080526024, 1042102238) + + W(3, -1118880502, -1090109833, -1069022098, -1113214479) + + W(4, 1027419877, -1110942359, -1087739606, 1032127295) + + W(5, -1161271853, 1033315833, 1036440530, -1143368203) + + W(6, 1019485964, 1010290822, -1124554651, -1132377096) + + W(7, 1028708277, -1156901930, -1114394737, -1141169667); + WS(1058455886, -1096183470); + sum1 = W(0, -1105360672, -1112611850, 1060616064, -1104075433) + + W(1, -1112035684, 1032735242, 1033545283, -1111940643) + + W(2, -1105059667, 1048808633, 1051085625, -1115570744) + + W(3, -1103063975, 1042817013, -1097442806, -1097216429) + + W(4, -1112638549, 1058906409, -1102188695, -1107200030) + + W(5, -1104182327, 1047248804, -1103229812, -1108265532) + + W(6, -1106250503, 1047193699, -1106970890, -1119499692) + + W(7, -1103319623, 1057710235, -1109193562, -1106901731); + sum2 = W(0, -1135393651, -1114274101, -1117767149, -1110403581) + + W(1, -1131009665, 1016197705, -1130986601, -1136444051) + + W(2, 1004138181, -1143366053, 1026922589, -1112183743) + + W(3, -1111055824, 1051632163, 1048764370, -1121253595) + + W(4, -1134829555, -1111579981, 1036257166, 1009689523) + + W(5, -1127256265, 1038147066, -1112945554, 989872074) + + W(6, -1113946573, 1025185617, -1143942149, -1123668797) + + W(7, 1010148467, -1137859715, -1123068365, -1123716033); + WS(-1103618872, 1023577831); + sum1 = W(0, 1041702149, 1057806109, -1091063799, 1022049043) + W(1, 1032268701, 997904496, -1106010126, -1102660926) + + W(2, 1021026046, 1057675340, -1090884608, 1046995709) + + W(3, 1032012647, -1129702414, -1094077941, -1100395542) + + W(4, 1023662430, 1056283152, -1094732237, 1050214494) + + W(5, -1111766616, 1039716321, -1100869456, -1096243374) + + W(6, -1112590149, 1049875952, -1105996279, 1047647816) + + W(7, 1042231991, 1054291708, -1098425069, -1100607928); + sum2 = W(0, 1073849383, -1072987051, 1040644897, 1022236877) + + W(1, 1069429154, -1080077361, -1098556311, -1128073567) + + W(2, 1070121938, -1076996297, -1124122091, -1118780260) + + W(3, 1066905653, -1086754234, -1095882058, 1027638421) + + W(4, -1087755842, 1060194671, -1096747545, 1012182550) + + W(5, -1080359597, 1067521081, 1048551041, -1129108935) + + W(6, -1073496568, 1074652354, -1092793409, -1130588931) + + W(7, -1070245916, 1075883836, 1058695504, 1001812541); + WS(1010873216, -1100304815); + sum1 = + W(0, -1154187044, 1045945805, -1102222630, -1113759340) + W(1, 1028741017, 1051026373, -1103217414, 1022415534) + + W(2, -1114247598, 1058185854, -1097780567, -1105383733) + + W(3, -1099084427, 1059904750, -1091550752, -1111624796) + + W(4, -1104966895, 1052860588, -1108718914, -1114326870) + + W(5, 994968800, 1038231664, -1110664976, -1110217221) + W(6, -1113228468, 1040557287, 1017403508, -1108875519) + + W(7, 1028263947, 1032103905, 1017865354, -1109350878); + sum2 = W(0, -1114639192, -1100331344, 1035901690, 1012858414) + + W(1, 1039210963, 1069298433, 1043940791, -1126620651) + W(2, 1047528380, 1080352854, 1030733380, 1036529177) + + W(3, -1099502544, -1067747068, -1084572959, -1099630936) + + W(4, 1041344628, -1080996124, 1003800555, 1043527822) + + W(5, -1108972702, 1032407437, 1045939813, -1119860547) + + W(6, 1021595805, -1121090437, -1121287047, -1145664907) + + W(7, -1116883371, 1016604711, -1122259179, 1034105585); + WS(1044302648, -1104457270); + sum1 = W(0, -1115179413, 1029190781, -1108944696, -1115207128) + + W(1, -1101763748, 1045938783, -1102720380, 1013266237) + W(2, 999269803, 1034810490, 1038235218, 1025157307) + + W(3, -1106420033, 1055724168, -1101615303, -1105407492) + + W(4, 1041707045, 1053359959, -1094303566, 1045691477) + + W(5, -1128885581, -1100033022, 1043259278, -1113033137) + + W(6, -1110751840, 1037908026, 1011056201, -1114066571) + + W(7, 1029110244, 1035419021, -1123807773, -1113282394); + sum2 = + W(0, -1117238549, -1109414288, -1115125848, 1023475415) + + W(1, -1115295266, -1128441429, -1121954754, 1024122972) + + W(2, 1033754662, -1104877135, 1018153798, 1002646200) + W(3, -1095438097, 1053172955, 1038786210, -1106263750) + + W(4, -1106855439, 1056926069, -1104082080, 1034246226) + W(5, 1011060498, -1108715476, 1043675119, 1025499367) + + W(6, -1117460606, 1036225840, 1008366234, -1107090094) + + W(7, 1032653312, -1114450934, 1018894269, 1013321052); + WS(1068015911, 1043072951); + sum1 = + W(0, -1127841379, -1101991257, 1041159238, 1035382295) + W(1, 1035792844, -1091973141, 1040826438, -1098419575) + + W(2, -1155603908, -1110119406, 1052691071, 1043898844) + W(3, 1018341976, -1095315357, 1053842800, 1030324599) + + W(4, -1111053022, -1107228151, 1042506601, -1108241413) + + W(5, 1044403491, -1111437840, 1050221764, 1043481954) + + W(6, -1112313859, -1097295811, 1030249017, -1098652336) + + W(7, 1005208661, -1103670736, 1046985745, 1032196534); + sum2 = W(0, -1134315530, -1125722365, -1135384490, -1118933131) + + W(1, 1033824390, 1019923991, 998580556, 1027495017) + W(2, -1112867968, 1039464885, -1093291922, 1045077367) + + W(3, 1039862799, -1087456726, -1061395777, 1087627027) + + W(4, 1005143468, -1119378177, -1106942114, 1034637079) + + W(5, -1114969920, 1042059959, -1121281813, -1148550692) + + W(6, 1030354102, -1113780490, 1034179020, -1118611519) + + W(7, -1131720457, 1009971850, 1032010553, -1117397469); + WS(1060186318, -1131602669); + sum1 = W(0, 1022422466, 1050205114, -1099402401, -1112848707) + + W(1, -1102049002, 1052887138, -1102238785, -1106285089) + + W(2, 1050775273, 1052456073, -1100510367, 1039607513) + + W(3, -1097141731, 1049038746, -1088759247, -1098786589) + + W(4, 1056872997, 1040490435, -1122526498, 1048305743) + + W(5, -1099566807, 1039690728, -1099089908, -1104192622) + + W(6, 1025667942, 1043457059, -1102859210, 1032266998) + + W(7, 1032894309, 1045856748, -1106963501, -1118572779); + sum2 = + W(0, 989650422, -1120410947, 1047633630, -1081060940) + W(1, -1108234271, 1050158699, 1066272871, -1074101109) + + W(2, -1120122674, -1092804082, 1075424781, -1079387458) + W(3, 1045260201, 1024838498, 1061734347, 1050344942) + + W(4, -1114112879, -1125280065, -1091697647, 1043540897) + + W(5, 1037831837, -1119936776, 1003481288, 1039609275) + + W(6, -1117501250, -1114421818, 1011848513, -1131708367) + + W(7, 1024132690, 1035095434, -1106020023, 1026462111); + WS(1057810382, 986287880); + sum1 = W(0, -1105255365, -1110142276, 1041191503, 1050176972) + + W(1, 1027767677, -1106138450, 1031406779, -1130243957) + + W(2, 1037147968, -1092238936, 1027980992, 1041310918) + W(3, 1038550632, -1090210593, 1049547413, 1041377527) + + W(4, -1136315263, -1089134184, 1052451129, -1115128119) + + W(5, 1035749561, -1093055129, 1057536820, 1033537239) + + W(6, -1115075413, -1097497096, 1050343212, -1127231554) + + W(7, 1028257967, -1089420006, 1058108487, 1031965752); + sum2 = + W(0, -1099824579, 1070708271, 1075074245, -1097074436) + W(1, -1113793286, -1104040400, -1084124078, 1023561426) + + W(2, 1053512844, -1091831853, -1082668198, 1039380165) + + W(3, -1112943238, -1072548459, -1072503695, 1009216489) + + W(4, 1041834894, -1093778092, 1056090411, 1043969626) + W(5, -1099992002, 1057576575, 1053907302, -1107563771) + + W(6, -1120789532, 1064181862, 1058602971, 1034348623) + W(7, 1024916046, 1051972140, 1054786345, -1106961801); + WS(-1075707047, 1038147646); + sum1 = + W(0, 1038492938, 1050722763, -1095596015, 1040870942) + W(1, -1115961531, 1026800423, -1103730686, -1122935577) + + W(2, 1036899040, 1055626176, -1091210886, 1047700685) + W(3, 1041066756, 1052178217, -1090286882, 1036539085) + + W(4, 1038870159, 1027667391, -1094135001, -1102625947) + W(5, 1045702796, 1053246416, -1095582752, 1048523811) + + W(6, 1022987667, -1100305296, -1109653838, -1105859960) + + W(7, 1044017707, 1049962981, -1093296229, -1117734303); + sum2 = + W(0, -1145353723, 1027969677, -1115030411, 1052090154) + W(1, -1113260796, -1095928859, 1031463199, -1110261785) + + W(2, -1112198364, 1052169305, -1108227013, 1041877601) + + W(3, -1113367096, 1052353113, 1051016428, -1099630700) + + W(4, 1007958125, -1129450520, 1041462653, -1087173862) + W(5, 1047146251, 1051473061, 1045242344, -1102681887) + + W(6, -1122974002, -1091037095, 1032341221, -1095485390) + + W(7, 1021064313, 1050393555, 1020102815, -1111896409); + WS(-1102302520, 1068562064); + sum1 = W(0, -1130894152, -1101486038, 1044130034, 1031789673) + + W(1, 1029216267, -1094978851, 1029251017, -1102217970) + + W(2, 1029150351, -1104755260, 1053252560, 1042516209) + W(3, 1029804895, -1093484995, 1050941559, 1040658618) + + W(4, -1108054071, -1110271975, 1036880709, -1113036417) + + W(5, 1046304488, -1106599349, 1050863202, 1041743615) + + W(6, -1107326720, -1102131284, -1128083416, -1102226940) + + W(7, 1018120580, -1102274525, 1047248574, 1032422999); + sum2 = + W(0, 1019111797, 1022527979, -1131519898, 1029130971) + W(1, -1123809812, -1111065998, 1023737355, -1117143513) + + W(2, 1006739898, 1031759809, 1045357020, -1106220344) + W(3, 1041109085, -1095097056, 1082939698, -1064938697) + + W(4, -1126211453, 1034613952, 1027342607, -1122955245) + + W(5, 1028972357, -1107360163, 1033832936, -1112280546) + + W(6, -1118372569, 1033659253, -1112248823, 1032152906) + + W(7, 1025713585, -1118642675, -1118824157, 1028082979); + WS(1066566439, -1125753148); + sum1 = W(0, 1020091828, -1096367972, 1038767583, 1030663671) + W(1, 1041951168, -1098758994, 1048997640, 1025331919) + + W(2, -1130301450, -1093467737, -1130818632, -1108818909) + + W(3, 1052053147, -1089881409, 1064063659, 1044746920) + + W(4, -1131231944, -1092544881, -1116991019, 1022962726) + + W(5, 1033588155, -1098181717, 1042770882, 1041997189) + W(6, 1009411772, -1110070786, 1046860728, 1018371147) + + W(7, -1116682291, -1096392077, 1027361773, 1038578846); + sum2 = W(0, -1105507764, 1019815533, -1136431769, 1024962860) + + W(1, -1149004498, 1047279899, -1121679526, 1041000955) + + W(2, -1098298748, -1106660204, -1096656341, -1107413740) + + W(3, -1115729482, 1058550934, 1058580319, 1027135608) + + W(4, -1094576030, 1031191852, -1098228632, -1101441076) + + W(5, -1111478010, 1032716298, 1041490224, 1035067556) + + W(6, -1129010369, -1117054989, 1047791827, -1123460834) + + W(7, 1018600957, 1019851909, -1106522387, 1005788722); + WS(1050996380, 1066787661); + sum1 = W(0, 1042843177, -1109518091, -1098674409, -1112832565) + + W(1, -1120310187, 1043911830, -1097687209, -1133582755) + + W(2, 1033453959, 1059519229, -1096304487, -1116528532) + + W(3, -1107450543, 1061971625, -1098011863, -1105396874) + + W(4, 1017862620, 1051823058, -1095767039, 1033796902) + W(5, -1134072575, 1046601317, -1095249970, 999923683) + + W(6, 1025308393, 1042112788, -1098354285, 1030029487) + + W(7, 1033769739, 1046863997, -1098417599, -1109771063); + sum2 = + W(0, -1103321099, -1087654445, -1098379129, 1013739975) + W(1, 1033376724, -1114493691, -1096458683, 1015354012) + + W(2, -1108916223, 1049058628, 1036368268, -1121134774) + W(3, 1033194077, 1065240604, 1054396447, -1115257551) + + W(4, 1038197771, -1128335788, 1049730119, -1129699908) + + W(5, 1032881798, -1094150295, -1108472207, 1021079748) + W(6, 1017830932, 1006224046, 1031462702, -1117224382) + + W(7, -1138730935, -1112103411, -1102017203, 1038189385); + WS(1027314912, -1081149641); + sum1 = W(0, -1109480125, 1051429188, -1118844062, -1097611416) + + W(1, -1114947760, 1053252314, -1094077252, 1034118735) + + W(2, -1101195017, 1058130398, -1113091794, -1104617542) + + W(3, -1132100201, 1061393767, -1085308129, 1035982720) + + W(4, -1103759537, 1057940398, -1102037735, -1114189097) + + W(5, 1044342469, -1104522586, -1094497965, 1036294793) + + W(6, -1111893319, 1055491172, -1103334896, -1128796810) + + W(7, 1051194426, -1120202825, -1094870250, 1030785028); + sum2 = W(0, -1131039707, -1098833779, -1147567565, 1035790053) + + W(1, 1024995350, -1124760267, 1057070390, 995065627) + + W(2, -1104486127, -1078713050, -1091843304, 1037354874) + + W(3, 1015537291, -1065942779, -1081156610, -1154356731) + + W(4, 1053996441, 1047686732, -1094140189, -1107145709) + + W(5, -1103676904, 1084085461, 1060423478, 1026796886) + W(6, 1047124046, 1064521940, 1046849692, -1108476011) + + W(7, -1111129691, -1093915430, 1018309905, 1038591472); + WS(-1081542375, 1044780323); + sum1 = W(0, 1026864081, 1046719985, -1098857847, -1114219435) + + W(1, -1100303790, 1054288460, -1108679899, -1104586877) + + W(2, 1048337215, 1054459103, -1098101851, 1041408644) + + W(3, -1098110473, 1048901488, -1093175556, -1098306531) + + W(4, 1054474587, 1041639871, -1104037973, 1046672715) + + W(5, -1099969099, 1034589376, -1107626335, -1104199322) + + W(6, 1023999910, 1043694031, -1101510966, 1022681657) + + W(7, 1028627178, 1046235480, -1106600025, -1126646775); + sum2 = + W(0, 1017985090, 1024212320, -1099849981, 1067245211) + W(1, 1027847194, -1098721130, -1081468176, 1074345814) + + W(2, 1036519222, 1050387030, -1070464929, 1070597407) + + W(3, -1113167123, -1094712479, -1096550174, -1088417301) + + W(4, 1037009826, -1100822056, 1057690620, -1104880956) + + W(5, -1113380621, 1028269032, 1042714784, -1102737214) + W(6, 1031131596, 1009055356, -1145638655, 1000105719) + + W(7, -1115360802, -1113841920, 1046010973, -1112342255); + WS(1059294542, 1020616832); + sum1 = + W(0, -1157534552, -1096856701, 1050532499, -1112831597) + W(1, 1039080142, 1044861738, 1041652423, 1046540791) + + W(2, -1097783100, -1089052876, 1057029426, -1098369827) + + W(3, 1031217968, -1085780263, 1047119538, 1040272239) + W(4, -1164216296, 1044573672, 1039715347, 1024931118) + + W(5, -1138897989, -1097342660, 1043073721, -1103025619) + W(6, 1026686634, 1041475528, 1040308239, 1045404192) + + W(7, -1105498094, -1105558033, 1048391538, -1114523696); + sum2 = W(0, -1106291706, 1040318024, -1114208076, -1142193319) + + W(1, 1001372950, -1105705183, -1116263519, -1145917455) + + W(2, -1099590495, 1045484852, -1108179199, 1036599633) + + W(3, -1093748925, 1061316313, 1049891427, -1108356360) + + W(4, 1015225205, -1098311584, 1040668388, -1148092276) + + W(5, -1105937891, 1041085521, -1111581107, 1032743264) + + W(6, -1112612361, 1028378294, -1115787941, 1021281994) + + W(7, 995169980, 1035732349, -1113959318, 1024794158); + WS(1059376718, -1137270291); + sum1 = + W(0, -1118257199, 1043258576, -1114290826, -1112002778) + W(1, 1037392427, -1106073464, -1124279079, 1022160871) + + W(2, -1097794403, 1054680411, -1115190716, 1045843716) + W(3, 1035766677, -1099046488, 1052189312, 1011458515) + + W(4, 1026067385, -1088020070, 1054691490, -1110958220) + W(5, 1032186693, 1041392887, -1097245116, 1046761570) + + W(6, -1108679762, -1113652045, 1025610423, -1117145658) + + W(7, -1139304576, -1111666975, -1123561026, 1032305501); + sum2 = + W(0, 1025244035, 1033595807, 1016573022, 1002397687) + W(1, -1122852568, -1087687504, 1048825911, -1104089806) + + W(2, -1092220395, 1066421651, 1058107887, -1130145014) + + W(3, 1038019467, 1047700223, -1089540205, -1111655831) + W(4, 1048072683, -1084925862, 1045215493, 1032935415) + + W(5, -1113553750, 1050883425, -1098430697, 1015641098) + + W(6, -1119930901, -1105555859, 1041208433, 1001885951) + + W(7, -1139793711, -1146566911, -1124843514, -1131703250); + WS(1058596686, 1013962118); + sum1 = + W(0, 1000024554, 1052551424, -1088298614, 1039656505) + W(1, -1127551432, 1049056438, -1098656348, 1034731345) + + W(2, -1100000762, 1057499982, -1090756927, 1019232187) + W(3, 1035333436, 1036076760, -1097067922, 1033429441) + + W(4, -1122612871, -1127972943, 1040213184, -1125045580) + + W(5, 1044766998, -1116046252, 1015197910, -1113717771) + + W(6, 1041477861, -1118015335, -1123679237, 1037833508) + + W(7, 1051562743, -1099275107, -1122278672, -1122272135); + sum2 = + W(0, -1104434141, 1048601996, 1033271157, 1004930429) + W(1, 1029025211, -1091369704, -1119340081, 1028438774) + + W(2, -1078497608, 1052827694, 1025214064, -1106316897) + + W(3, -1079110377, -1106615386, -1109539756, 1034989376) + + W(4, -1085502108, -1115334546, 1050957039, -1108631008) + + W(5, 1066279808, 1037382016, -1106594885, 1023198169) + W(6, 1062913146, -1122817088, 1036274829, -1134348613) + + W(7, 1068620036, 1048688798, -1118139306, -1139733884); + WS(1044771128, 1023341948); + sum1 = + W(0, -1156220044, -1092336191, 1051560294, 1036528391) + W(1, 1034545464, -1098819215, 1044146859, 1029114797) + + W(2, 1033488922, -1096491302, 1051910286, 1022761170) + W(3, -1111313058, -1086850728, 1045449190, 1029767950) + + W(4, 1038420969, -1102939421, 1053458817, 1041877300) + W(5, 1008511890, -1100928894, 1038883707, 1034675856) + + W(6, 1013986230, -1115524377, 1012126018, 1037411178) + W(7, 1011084871, -1089482302, 1046748951, 1043196317); + sum2 = + W(0, -1071004894, 1076503146, 1057610169, -1122913984) + W(1, -1080574884, 1066884159, -1107351326, -1130255370) + + W(2, -1089987082, 1058011283, 1054000347, 1038970611) + W(3, 1049506323, -1098882467, -1090234844, 1014162118) + + W(4, 1065282653, -1084978169, 1030898490, -1114000490) + + W(5, 1062249589, -1088626314, -1090230279, 1022492087) + + W(6, 1060165079, -1082249713, 1044380003, -1131621088) + + W(7, 1070844945, -1077734377, -1096516163, 1013009282); + WS(-1111817840, -1134998409); + sum1 = W(0, 1022731056, -1102901203, 1029699069, 1021112442) + + W(1, 1045262352, -1094315057, 1052915216, -1107194439) + + W(2, 1044888721, -1085070720, 1058770140, -1097785743) + + W(3, 1029818259, -1111793509, 1057078063, -1117717150) + + W(4, -1105915720, 1055206544, -1095183540, 1040740592) + + W(5, -1114660906, 1046806370, -1097451385, 1036425016) + + W(6, 1027479949, -1123039746, -1112670352, 1005586201) + + W(7, 991785104, -1136267423, -1114500629, 1016465988); + sum2 = W(0, -1129690332, -1113356803, 997943457, 1015499837) + + W(1, 1030842707, 1026318374, -1119512995, -1180561029) + + W(2, -1123486113, 1041923626, 1037525758, -1144014736) + + W(3, 1054087898, -1089332833, -1088292904, 1037328869) + + W(4, -1105176966, 1068558125, 1040210770, -1107365912) + + W(5, -1097205966, -1141184456, 1050151959, -1114055561) + + W(6, -1098021434, -1107728348, 1018682892, 1009592392) + + W(7, -1106929221, -1104288342, 1006954668, 1013301204); + WS(-1100650808, 1043653943); + sum1 = W(0, 1038392637, 1044290651, -1095199164, 1033771919) + W(1, 1032036848, 1040683515, -1115398639, 1038316223) + + W(2, -1120772452, -1106266873, -1094097345, 1042896310) + + W(3, 1043637149, -1090111931, -1097393337, 1045751664) + + W(4, 1040259489, -1133467790, -1104941765, -1159203906) + + W(5, 1047398869, 1044787930, -1101572298, 1015063331) + W(6, 1038054351, 1023591523, 1016760834, 1030908740) + + W(7, 1050576478, 1037223428, -1102689443, -1125005703); + sum2 = W(0, 1018053796, 1046306039, -1101305605, 1031448374) + W(1, 1000548496, 1043541862, 1029064982, -1112893849) + + W(2, 1049079603, 1010667960, -1116813778, 1021972628) + W(3, 1039189619, 1064529690, 1038487223, -1105518867) + + W(4, -1128574308, 1047996002, -1100258391, 1037842238) + + W(5, -1118597354, -1087406141, 1048794746, 1033382833) + + W(6, -1106984497, -1095617964, -1114392997, 1021089548) + + W(7, -1104543855, -1086946593, 1045938007, -1140458600); + WS(-1121537248, 1047151836); + sum1 = W(0, -1096325448, 1052654400, 1000450324, -1116556387) + + W(1, -1113135282, 1035132488, -1110395025, 1023519458) + + W(2, -1098188693, 1046868890, -1139200797, -1111260975) + + W(3, -1112146268, -1134150082, 1049727010, -1110207458) + + W(4, -1108791588, -1129891280, 1041189572, -1104838938) + + W(5, -1117696601, -1098847494, 1056884317, -1098805187) + + W(6, -1123869651, 1032919412, 1041128337, -1146298440) + + W(7, -1114157115, -1107856679, 1058220805, -1103148146); + sum2 = W(0, -1142864271, 1043572739, -1125571574, -1107989855) + + W(1, 1021304865, 1026011378, 1028667063, -1140649559) + W(2, 1043366966, -1102859954, 1022196210, 1020722946) + + W(3, -1107584343, -1080136051, -1072538638, -1132367054) + + W(4, 1014758407, -1103597159, -1076945816, 1041979768) + + W(5, -1130465374, -1115654645, 1048815254, -1126224006) + + W(6, -1120740451, 1046511165, 1072551214, 1027667511) + W(7, 1000478551, 1053224660, 1074776028, 1048839210); + WS(-1086568910, 969651201); + sum1 = W(0, -1128189323, -1096064919, 1047521403, 1043461231) + + W(1, 1044154939, -1089612648, 1054908701, -1099266659) + + W(2, 1043534732, -1084798775, 1056987371, -1113308531) + + W(3, -1114366976, 1053159863, 1057685165, -1152040120) + + W(4, -1098469330, 1053431542, -1089249613, 1042761408) + + W(5, -1101372520, 1050787607, -1090701774, 1049635020) + + W(6, -1123038043, 1036747448, -1105030179, 1010635844) + + W(7, -1132910587, -1116020373, 1027268120, 1018344000); + sum2 = W(0, 1042932965, -1103892922, -1104364155, -1139842168) + + W(1, -1103428495, 1060495074, 1060109323, -1118896922) + W(2, 1039997403, 1052448567, 1064108701, 991756114) + + W(3, -1093583228, -1075640666, -1073056297, -1097481656) + + W(4, 1044856824, 1057723154, 1055665788, 1040659602) + W(5, -1121819542, 1057002090, 1060503917, -1099984054) + + W(6, -1177180368, -1112150955, -1116550688, 1034919451) + + W(7, 1028413178, -1118134166, -1110515035, 1041069777); + WS(-1084093518, -1116656412); + sum1 = W(0, 1002008836, 1058416208, -1096672513, -1112390467) + W(1, 959481663, 1026388179, -1109778819, 1023428581) + + W(2, -1104590931, 1059097973, -1088144465, -1112632704) + + W(3, 1050696243, 1042079029, -1096264126, 1040470858) + + W(4, -1106608235, 1041679827, -1101432288, -1102954054) + + W(5, 1047962207, 1049127990, -1100480244, 1047012782) + + W(6, 1030562773, 1031439243, -1113594772, -1112144502) + + W(7, 1015783795, 1042535660, -1093923750, -1145396437); + sum2 = W(0, 1007960967, 1027407916, -1129957403, -1132155403) + + W(1, -1110192070, 1010716935, 1018303319, -1121935910) + + W(2, 1049899326, -1097456083, 1037417999, -1137993343) + + W(3, 1056650247, -1070859565, -1094713389, -1142796285) + + W(4, 1078512141, -1068241064, -1096379657, 1039214170) + + W(5, 1081472440, -1079514242, 1043613542, -1111213656) + + W(6, 1058404171, -1094427160, 1025537830, 1032528613) + W(7, 999915485, 1030657127, -1116925932, 1024356221); + WS(1052225948, 1018668194); + sum1 = W(0, -1120453498, 1051775516, -1117579103, -1107074656) + + W(1, -1123160289, 1048325451, -1111291056, -1112742544) + + W(2, -1108654867, 1058214550, -1093397513, -1147977428) + + W(3, -1104839613, 1064670427, -1091445969, -1119335936) + + W(4, 1041378113, -1126638409, -1092047898, -1109154218) + + W(5, 1036965515, 1049967085, -1099225050, 1034167881) + + W(6, 1044186084, -1096299613, -1112850625, -1138567959) + + W(7, 1034438594, -1128237844, -1112057991, 1019177609); + sum2 = W(0, -1121001958, -1117606942, -1103097305, -1130038396) + + W(1, -1148685985, -1111847761, 1021935234, -1112487949) + + W(2, 1018483434, -1120566718, 1049895592, 1038078839) + + W(3, 1021815720, -1076982600, -1081972918, -1125812992) + + W(4, 1049361594, 1074852012, 1051964198, -1152546434) + + W(5, -1108634723, 1048076514, 1040925857, -1104919092) + + W(6, -1132118692, -1102180777, 1017568960, 1026180028) + + W(7, -1105580672, -1116866514, 1040155911, -1123068468); + WS(-1096382876, -1091051652); + sum1 = W(0, -1116126267, 1057278592, -1096000788, -1116910752) + + W(1, -1113197617, 1048826126, -1097274020, -1140807037) + + W(2, -1112424211, 1058810754, -1088739494, 1039925053) + + W(3, -1124324715, 1056304110, -1091311905, -1132679170) + + W(4, -1136579346, 1041995897, -1114916522, -1107191661) + + W(5, 1040875430, 1016295122, 1038826452, -1119450067) + + W(6, -1113905512, 1024916389, -1128507781, 1023437062) + + W(7, 1017323784, 1042534003, 1017648027, -1098370349); + sum2 = W(0, -1120311657, 1025682064, 1036682152, -1108273289) + + W(1, 1036113080, -1107470193, -1108061877, 1012612647) + + W(2, -1109045199, 1035621932, 1051542033, -1101063214) + + W(3, 1029662296, -1118009189, -1101792442, -1076098595) + + W(4, -1122358251, 1045290388, -1093646778, -1080861029) + + W(5, -1114085873, 1009830751, 1056395710, 1039398973) + W(6, 1016737279, 1035169596, -1091719234, 1065137390) + + W(7, -1115835645, 1030264440, 1052430993, 1072502688); + WS(1040082544, -1114755812); + sum1 = W(0, 1017784372, -1110974758, 1040296296, 1024480479) + + W(1, 1037505264, -1108514902, 1041424680, -1104471944) + + W(2, 1045745417, -1095324708, 1054913780, -1106439461) + + W(3, 1019379817, 1052579502, -1106396419, -1115066496) + + W(4, -1109308706, 1058051822, -1087512533, 1040857799) + + W(5, -1124056118, 1046163210, -1093666877, 1001482384) + W(6, 1025470519, 1038459986, -1106674096, 995688529) + + W(7, 1039469090, 998280780, -1109356390, -1108404770); + sum2 = W(0, -1162396366, 1045315846, 1034748092, 1035646876) + + W(1, -1117720653, -1118054954, 1034773210, -1100298043) + + W(2, -1104226850, 1057942904, 1043388435, -1097646834) + + W(3, -1105580348, 1059476362, 1067689202, -1093789486) + + W(4, -1105643813, -1090022037, -1083232471, 1040357620) + + W(5, 1031813906, 1045409162, -1101262587, -1113573448) + + W(6, 1011045214, -1106412098, -1124577575, 1012935222) + + W(7, 1018164327, 1023977529, -1102021751, 1024454049); + WS(1036525168, -1082462584); + sum1 = W(0, -1116308971, -1085123800, 1057675329, 1019612704) + + W(1, 1037298441, -1087372070, 1051660338, 1027541711) + + W(2, 1027885589, -1086414101, 1059597873, -1109257541) + + W(3, -1122874917, -1096064460, 1059581688, 1041073820) + + W(4, -1154089797, -1099879381, 1052784510, 1028059367) + + W(5, -1108384819, -1104319094, -1117339864, 1045372305) + + W(6, 1028179743, -1127380522, 1039251609, 1031554934) + + W(7, 1003463273, -1096394215, -1110971807, 1053758651); + sum2 = + W(0, 1060691160, -1081285622, -1080809247, 1052276353) + W(1, -1103295177, -1090050073, 1050684042, -1106187369) + + W(2, 1035985281, -1102851017, -1087522637, 1048638013) + + W(3, -1085964582, 1072728426, 1060852217, -1090587145) + W(4, -1105398566, 1060511611, 1058511518, 1029176048) + + W(5, -1107551093, 1033954581, 1041242888, -1094879840) + W(6, 1049030608, -1086630634, 1028348456, 1046256182) + + W(7, -1090293163, 1058069039, 1062481845, -1087039462); + WS(-1074352935, 1040600857); + sum1 = + W(0, 1042034194, 1057627204, -1090157751, 1024364622) + W(1, 1028652336, 1025049468, -1105875707, -1105990299) + + W(2, 1024054004, 1057567995, -1088931067, 1048022018) + W(3, 1030695172, 1022098295, -1095088235, -1100928004) + + W(4, 1029627411, 1052602222, -1094832321, 1049957878) + + W(5, -1117605317, 1039437212, -1104356174, -1095846092) + + W(6, -1114002447, 1049556590, -1107260676, 1047165477) + + W(7, 1041624512, 1053416947, -1101255271, -1098759166); + sum2 = W(0, -1075440350, 1073165865, -1112383192, -1148975848) + + W(1, -1079714919, 1065983198, 1048707236, -1115591486) + + W(2, -1079134350, 1068716226, -1135853868, 1038054064) + + W(3, -1081735031, 1066499710, -1098543278, -1125971282) + + W(4, 1055569671, -1095308006, 1021808504, 1040311395) + + W(5, 1066585571, -1080754250, -1108920844, -1110109816) + + W(6, 1071644179, -1074800849, 1050977418, 1035370814) + + W(7, 1075476470, -1073191304, -1090378667, -1120408347); + WS(1041022776, 1033480094); + sum1 = + W(0, -1132576057, 1026327841, -1110434490, -1119031508) + W(1, -1123321429, 1042302896, -1109312954, 1021323174) + + W(2, 1028959481, 1052457903, -1089918670, 1029242558) + W(3, -1104176578, 1063677500, 1025377120, -1118638740) + + W(4, 1046472198, -1097607903, -1090934974, 1013298461) + + W(5, -1121060138, -1123802109, 1046523967, -1106699146) + + W(6, 1027556403, -1118671609, -1112257611, 1030036314) + + W(7, -1115611836, 1039698959, 1000531209, -1116635705); + sum2 = + W(0, -1106027239, 1049930690, -1110218398, 1034564779) + W(1, -1122286155, -1127267122, -1108798456, 1018367610) + + W(2, -1102546078, 1041115945, 1058786995, -1095860458) + W(3, 1055155948, -1091935564, 1075372513, 1043590800) + + W(4, -1096754888, 1052250618, -1071163371, -1112711414) + + W(5, 1032068992, -1103388917, -1123143101, -1119323979) + + W(6, -1121774513, 1038737216, -1121707895, 1016553114) + + W(7, 1036170969, -1108790214, 1032355550, 1017858173); + WS(1055618972, -1117202987); + sum1 = + W(0, 1030962480, 1039894129, -1101932469, 1031993659) + W(1, -1101414710, 1053882576, -1089999221, 1048656807) + + W(2, -1098100923, 1057347458, -1085784352, 1043352452) + W(3, -1111740150, 1049814740, 1051098296, 1031031542) + + W(4, 1036980413, -1090053902, 1056052448, -1104607674) + + W(5, 1041005827, -1088233382, 1051763396, -1119077705) + W(6, 1021681163, -1105970903, 1044301630, 1022017143) + + W(7, -1112834597, -1117339136, 1032801282, 1039235901); + sum2 = W(0, -1114659327, -1101541229, -1107338771, 1039378885) + + W(1, -1123577690, 1043634319, 1057974128, -1111523166) + W(2, 1042921002, 1066882360, 1050113378, 1040130625) + + W(3, -1105097716, -1077668162, -1080704784, -1104122760) + + W(4, 1042773509, 1037629509, 1051155360, 1012227066) + W(5, -1093975266, 1058638399, 1052705661, -1110420726) + + W(6, 1032061179, -1108208741, 1008396554, -1125218199) + + W(7, 1000405669, -1131856909, -1111189711, 1025207949); + WS(-1091387548, -1116324289); + sum1 = W(0, 1026642697, -1112220622, 1049897926, 1027958127) + + W(1, 1044682252, -1093973688, 1047211372, -1098544270) + + W(2, 1041967213, 1046046637, 1050365286, -1112662293) + + W(3, 1032214050, -1086442024, -1112122925, -1106755108) + + W(4, -1131062694, -1099996941, 1046223135, -1116559746) + + W(5, 1015214154, 1053177927, -1132096750, 1034258897) + + W(6, -1137069945, -1098783494, 1024489425, -1111108842) + + W(7, -1110158325, 1037567917, 1042021623, 1031638516); + sum2 = + W(0, -1108095393, 1011776651, -1101257730, 1019145070) + W(1, 1016776222, 1024100809, -1105403134, 1032882678) + + W(2, 977935538, -1097248934, -1101986254, -1124027994) + + W(3, -1122468710, 1057627889, 1060632600, -1103033100) + W(4, 1019959206, 1042194141, -1090719303, 1039533068) + + W(5, 1030099429, -1117226417, 1037412790, -1110127978) + + W(6, -1104930054, 1051928720, -1109292621, -1125661478) + + W(7, 1002749526, 1041814459, -1115385474, -1108291818); + WS(1057965518, -1118811194); + sum1 = + W(0, -1104352985, -1106566686, 1052732873, -1107147458) + W(1, 1038892389, -1112643723, 1003767366, -1114250980) + + W(2, -1105058276, 1026830542, 1060358287, -1096574819) + W(3, 1042490232, -1091938531, 1019887594, 1048844541) + + W(4, -1121521774, 1058056073, -1118338013, 1024329053) + + W(5, -1099594944, -1101314965, 1042464324, -1107780158) + + W(6, 1033536020, -1098044778, 1024562028, 1032778872) + + W(7, -1095161930, 1039936570, 1046000094, -1107207172); + sum2 = + W(0, -1116205334, 993944814, 1032713731, -1106373772) + W(1, 1042905425, -1113078065, -1104977559, 1039619019) + + W(2, -1109155755, 1044406596, 1048672381, -1115343154) + W(3, 1044205280, 1040105843, -1104277422, 1048332350) + + W(4, 1035597621, 1043112037, -1103087244, 999501191) + W(5, 1008636092, -1123380436, -1153474446, -1106439836) + + W(6, 1036458751, -1105268129, 1015784078, 1021528398) + + W(7, -1092853308, 1005260887, 1036094123, -1106473413); + WS(1053420700, 1049909457); + sum1 = W(0, -1115258034, -1106165874, 1050401361, -1113250117) + + W(1, 1034071238, -1089903413, 1041332866, 1023742249) + W(2, 1027276239, 1036166247, 1049384898, -1130552842) + + W(3, -1115686559, -1100423414, 1037380859, -1120158506) + + W(4, 1041096236, -1093491554, 1052388787, 1037333727) + + W(5, -1102788144, 1049835542, 1034784425, -1103514783) + + W(6, 1034068157, -1095323722, 1031952854, 1037170040) + + W(7, -1107460367, -1110396954, 1050882791, -1114330639); + sum2 = W(0, -1112500393, 1024557142, -1136367764, 1020782048) + + W(1, 1028289272, -1165623582, 1035333264, -1122738507) + + W(2, 1049127312, -1095250820, -1114028070, 1025362120) + + W(3, 1086771603, -1062269001, -1087155359, 1034731082) + + W(4, 1048088739, -1095068995, 1022077560, -1125007838) + W(5, 1020087240, 999933935, 1034746908, -1120796207) + + W(6, 1014851096, -1135945992, -1120864651, 1026594640) + + W(7, -1146529543, 1025716258, -1127622484, -1128255426); + WS(1063806286, 1027083983); + sum1 = W(0, -1114823180, 1045480194, -1118427516, -1109705966) + + W(1, 1030313470, 1039206373, -1106496703, 1020453816) + + W(2, -1111791457, 1061885616, 1010686340, -1103432478) + + W(3, -1111977289, 1050451993, -1083830979, 1039658735) + + W(4, -1108043857, 1057912708, -1099420545, -1114670584) + + W(5, 1019729830, 1036575619, -1105267089, -1109909656) + + W(6, -1114640622, 1039765761, -1131920190, -1113587473) + + W(7, 1033983240, 1034424532, -1125840468, -1112770081); + sum2 = + W(0, 1033978022, -1122290634, 1016780797, -1164938552) + W(1, -1100194899, -1091664523, -1103111994, 1002490582) + + W(2, 1033701105, -1071413373, 1047766898, -1105595809) + W(3, 1050426550, 1075108998, -1096749849, 1051489664) + + W(4, -1104028404, 1062092502, 1027350687, -1108336227) + + W(5, 1034191613, -1103668501, -1131589290, 1021076655) + + W(6, -1141130302, 1034149895, -1131724600, -1149103768) + + W(7, 1010895851, -1140709165, 1027888251, -1131210373); + WS(1058288590, 1045994186); + sum1 = W(0, 1018135640, -1093342072, 1052167946, 1038262801) + + W(1, -1123855059, -1096797372, 1041780692, 1015346466) + + W(2, 1040223430, -1086390197, 1052872019, -1132654257) + + W(3, -1112801779, -1105293320, 1059840396, -1134794696) + + W(4, 1036317947, -1091216419, 1051866430, -1117665797) + + W(5, -1098800665, -1117054299, 1050341107, 1012611090) + + W(6, 1034707665, -1096209979, 1048652350, -1139713758) + + W(7, -1096517871, 1023470716, 1050625648, 1010858330); + sum2 = W(0, 1041114210, -1099008397, -1123917868, -1125418381) + + W(1, -1099284356, 1047276236, -1111523652, -1120564910) + + W(2, 1038292116, -1081084758, 1037708884, 1020505319) + + W(3, -1092208278, -1071665325, -1086778305, -1100128811) + + W(4, 1054381469, 1054365119, -1101037019, 1024474915) + + W(5, -1104534119, 1081581342, 1026238413, -1125603475) + + W(6, 1025804573, 1062322644, -1134916894, 1025011807) + + W(7, 1033400256, -1093538640, 1052085127, -1103707544); + WS(-1088887374, 1070119449); + sum1 = W(0, 1040460421, 1052058645, -1090595183, -1105506686) + + W(1, 1041554590, 1048371361, -1115426747, 1029097335) + + W(2, 1013850612, 1048732808, -1094790815, -1129317061) + + W(3, 1038262022, 1042754705, -1087902678, 1001782464) + W(4, 1042710919, 1047384127, -1106656361, 1038072126) + + W(5, -1106869091, 1054439312, -1090477876, -1131475029) + + W(6, 1044864290, 1032508990, -1122940954, 1028935005) + + W(7, 1046057615, 1042772520, -1091795237, -1119515740); + sum2 = + W(0, 1024604999, 1056461606, 1071685965, -1075212110) + W(1, -1112923336, 1030035123, 1066713447, -1080779344) + + W(2, 1027433809, 1050727550, 1068313262, -1078194918) + W(3, 1025504127, -1090534096, 1028028856, -1153515923) + + W(4, 1007245204, -1105339223, -1081367671, 1068056044) + + W(5, -1144581942, -1095507508, -1078816510, 1069903211) + + W(6, -1129047399, 1043793174, -1081156501, 1064173276) + + W(7, 1021294865, -1095638178, -1090770344, 1060536751); + WS(1040470840, 1011790950); + sum1 = W(0, 1015095158, 1043725275, -1105535856, -1108386992) + + W(1, -1120734562, 1051465082, -1108441440, 1030149375) + + W(2, -1116691398, 1058372660, -1095343471, -1112701741) + + W(3, -1118217942, 1055309890, -1081260869, 1026499745) + W(4, 1019898057, 1046636817, 1047492563, 1032201014) + + W(5, -1123629847, 1044874098, -1093096561, -1115283258) + + W(6, 1034607368, 1043010193, -1105294873, 1028457510) + + W(7, 1041822001, 1040878843, -1106259483, -1112399171); + sum2 = + W(0, 1022830461, -1117997331, 1037270083, 1023767946) + W(1, 1021246145, -1110014342, -1125616185, -1130403951) + + W(2, 1015115055, -1111993293, 1044158772, 1025796328) + W(3, -1114703004, 1036613835, 1073620398, 1050812248) + + W(4, -1120910531, 1023720090, -1076883688, -1112499600) + + W(5, 1015720307, -1117604953, -1087890801, 1028283916) + W(6, 983370825, -1120463052, 1025754476, -1104874229) + + W(7, -1123770073, 1036937497, -1113287589, 1033737696); + WS(1058309838, -1101980246); + sum1 = + W(0, -1118965337, -1110907254, 1038642111, 1028903966) + W(1, -1098779704, 1049643561, 1038999679, -1108240479) + + W(2, 1049071256, -1081904943, 1054751182, 1040887994) + W(3, -1113399754, 1042163763, 1056093093, -1118832415) + + W(4, 1026571427, 1052138696, -1083956910, 1046797612) + + W(5, -1110569018, -1106220306, 1050507993, -1104697276) + + W(6, -1131332475, 1025191299, -1146247429, -1123883748) + + W(7, -1128371676, -1129449041, 1030864044, 1017502086); + sum2 = W(0, -1137655511, -1111106723, 1035105104, -1112318930) + + W(1, 1043191716, 1033166752, -1112822728, 1027572041) + + W(2, -1121349336, 1033268708, -1104857525, 1035699332) + + W(3, -1097517035, 1052576386, 1055574555, -1097542777) + + W(4, 1046822141, -1107318253, -1114990789, -1110157019) + + W(5, -1129223371, -1102887232, -1121581721, 1031007843) + + W(6, -1116759551, 1040601750, -1152414880, -1157281192) + + W(7, -1124684976, 993535634, -1107957817, 1025775603); + WS(1063710542, -1111213649); + sum1 = W(0, 1039559517, 1052251350, -1101160384, -1113889808) + + W(1, -1110192145, 1049489370, -1097695264, 1031901152) + + W(2, -1107309859, 1058328276, -1093740712, -1104513406) + + W(3, -1118762901, 1061120005, -1096321197, -1097003636) + + W(4, -1108199122, 1049656673, -1097289639, -1112381384) + + W(5, 1037245627, 1033876357, -1114972772, -1176476024) + + W(6, -1139769966, 1041987905, -1102516745, 1022802380) + + W(7, 1035326852, 1045428971, -1103522251, -1115185874); + sum2 = W(0, 1026803387, -1115186477, 999853755, -1112425236) + W(1, 1021750253, 1031459540, 1031446318, -1106593609) + + W(2, 1040812059, -1116326399, 1058720440, -1086524651) + + W(3, -1107480079, 1040651083, 1071698983, -1075753828) + + W(4, 1041131835, 1020594503, 1051128601, -1096266051) + + W(5, -1115082464, 1033768858, 1034660038, -1108942599) + + W(6, 1006187407, -1132516997, 1027131696, -1123360193) + + W(7, 1001155939, 1015478283, 1041372466, -1104453127); + WS(1039772272, -1082982873); + sum1 = W(0, 1039127452, 1049032497, -1098139952, -1155633625) + + W(1, -1106264016, 1053169593, -1088020664, 1043520647) + + W(2, -1104546353, 1060522592, -1087153807, 1040400554) + + W(3, -1145518233, 1056693961, 1038834197, -1139907193) + + W(4, 1041713673, -1095982984, 1053429837, -1104883452) + + W(5, 1044410893, -1088607916, 1048228018, -1103034636) + + W(6, 1039725795, -1099512929, 1030077856, -1134131855) + + W(7, 1007790526, -1120546088, -1130616150, 1012687882); + sum2 = + W(0, 1032987173, -1092902636, 1027660911, 1032111389) + W(1, -1102803435, 1037122437, 1039508875, -1101516234) + + W(2, -1097110538, -1083842457, -1115097563, 1001644292) + + W(3, -1101871105, 1067610414, 1067552095, -1104358647) + + W(4, -1101555589, 1033006847, -1096151174, -1145661076) + + W(5, -1123533577, 1041814167, 1026567371, -1104681426) + + W(6, -1098769512, 1045724867, -1107225085, 1020958965) + W(7, 1048796624, 999019252, -1105667947, 1028203943); + WS(-1101412664, 1073047832); + sum1 = W(0, -1113880945, 1059007377, -1091904865, -1133362719) + + W(1, -1123950537, 1047579477, -1097814305, -1131741454) + + W(2, -1109995975, 1060416389, -1087199740, 1032803377) + + W(3, -1123565085, 1056063051, -1092124214, -1113780884) + + W(4, -1123728428, 1046383171, -1099567891, -1113889390) + + W(5, 1035385983, 1040643140, 1038341800, -1126485237) + + W(6, -1115318676, 1033389702, -1119557930, 1012558775) + + W(7, 1010675502, 1041003725, 1042882861, -1096461162); + sum2 = W(0, 1013686761, 1030949359, -1109223248, -1132915573) + W(1, -1123503757, 1039110679, 1035635962, 996209923) + + W(2, 1035262859, -1105775253, -1106751414, 1029135163) + + W(3, -1115490710, 1027204409, 1057425426, 1070858778) + W(4, 1025861040, 1019519396, 1043312829, 1067133266) + + W(5, 980681483, -1111394964, -1098000154, -1098902818) + + W(6, -1125276038, 1024413043, 1051287795, -1083268694) + + W(7, -1129892230, -1126757058, -1103421662, -1073095921); + WS(-1103532344, -1105840701); + sum1 = + W(0, -1106756472, -1105825052, 1050195304, 1044840709) + W(1, -1106322913, 1053932942, 1007328528, -1104890465) + + W(2, 1029810954, -1086676361, 1057202097, -1144507642) + + W(3, -1096389739, -1098358914, 1054492326, -1098185309) + + W(4, -1116067305, 1054020609, -1093369370, 1032208700) + W(5, 1035916925, -1096691570, 1012599092, 1048715303) + + W(6, -1105566449, 1051257001, 1027855335, -1100267787) + + W(7, 1034505108, 1026552303, -1101687900, 1050640157); + sum2 = W(0, -1111707317, -1101137684, -1116414033, -1103752872) + + W(1, -1119262447, -1109186725, -1107841286, 1034593530) + + W(2, 1037989791, 1049211868, 1056722210, -1110917586) + + W(3, 1056036881, -1099242284, -1094543747, 1049861706) + + W(4, -1105645897, 1038198606, 1053421235, 1030171051) + + W(5, 1006194414, -1118866635, -1104714858, -1103907620) + + W(6, -1146663095, -1109483964, -1120693058, 1032413269) + + W(7, -1129479912, -1114787638, -1115357885, 1029169157); + WS(1045178680, -1115117954); + sum1 = W(0, -1102680211, 1048681528, 1019008549, 1008490315) + + W(1, -1123018420, -1113607536, 1040296293, 1012835273) + + W(2, -1116849368, -1092105355, 1035615004, 1027033246) + + W(3, 1024407336, -1093530556, 1061339424, -1128145511) + + W(4, -1107241006, -1096193779, 1057711678, -1103222073) + + W(5, 1026392201, -1102060551, 1055864515, -1110547491) + + W(6, -1107918421, -1102337510, 1045891981, -1110097884) + + W(7, -1123314455, -1095199752, 1052562824, 1020395952); + sum2 = W(0, -1108321996, -1096948503, -1112108000, 1026091852) + + W(1, -1115537892, -1104693583, -1112710060, 1022753169) + + W(2, -1106228104, 1047339287, -1126080161, -1120501740) + + W(3, 998645667, 1055675007, 1051246853, -1105262859) + W(4, -1112292909, 1049114511, 1041989299, -1123292948) + + W(5, 1035781218, -1100682049, 1025978716, -1139782977) + + W(6, -1111036660, 1032758858, 1034053890, -1111667328) + + W(7, 1018530825, -1113969306, -1113712936, 1033000622); + WS(1044590904, 1058699692); + sum1 = W(0, 985175380, -1092606720, 1051210502, 1009220799) + W(1, 1034192409, -1090621088, 1050384326, -1109361592) + + W(2, 1020554347, -1093618783, 1055009987, -1117059707) + + W(3, 1024014533, -1113905855, 1062574818, -1128567457) + + W(4, -1115433194, -1096920415, 1054554325, 1015981863) + + W(5, -1128687821, -1112503613, 1031218808, 1039114097) + + W(6, 1008304190, -1100279725, -1105751509, -1127205548) + + W(7, -1115445028, -1101027255, -1144235755, 1035507338); + sum2 = W(0, 1036009101, -1108619644, 1010492213, -1131279719) + + W(1, -1117283755, 1041337919, -1100684466, 1035041542) + + W(2, 1033667347, 1012813669, 1015579759, -1124020763) + W(3, -1107239966, 1053310286, 1056064408, 1025470531) + + W(4, 1034685217, -1103814148, 1050883237, 1032198922) + + W(5, -1128406639, 1029066827, -1113069964, -1104788458) + + W(6, -1123321687, -1109499964, -1098878001, 1024066141) + + W(7, -1125402335, -1123197815, -1096911819, -1108347132); + WS(1044030776, -1089132931); + sum1 = W(0, 1034269487, -1093699058, 1045160768, 1040395197) + + W(1, 1032883970, -1097458090, 1050995424, -1135242887) + + W(2, 1042439154, -1086092656, 1057188990, 1040422743) + + W(3, 1044751430, -1078975458, -1096290982, 1048952172) + W(4, 1019707982, 1035194756, 1032938655, 1042217766) + + W(5, 1041434446, 1038040390, 1043682915, 1043586045) + W(6, -1133288904, -1131544335, 1022768458, 1029073256) + + W(7, -1128708109, -1101499019, 1043305900, 1044718778); + sum2 = W(0, 1043294282, -1107262777, -1132728616, -1112978295) + + W(1, -1127265324, -1107127922, -1133435576, -1101649503) + + W(2, 1035036911, 1048700262, -1115280193, -1142433873) + + W(3, 1051203976, -1114081637, 1060204569, -1138065032) + + W(4, -1092441683, 1027047222, -1096051714, 1049542158) + + W(5, 1037063919, -1087538045, 1059699424, 1027406094) + + W(6, -1095318743, 1043898666, -1091030613, 1036599707) + + W(7, -1096741875, -1114635611, 1057805441, -1117298502); + WS(-1083489614, -1078579141); + sum1 = W(0, -1113694287, -1091060438, 1048678744, 1022130309) + + W(1, 1048897616, -1104759380, 1055607032, 1045345264) + + W(2, -1104500498, -1089217572, 1025763911, -1098656951) + + W(3, 1029397720, -1096433234, 1056656214, 1045280313) + W(4, 1039983475, -1090900481, 1055730826, 1003335600) + + W(5, -1099529286, -1103761763, 1039576037, -1104729181) + + W(6, 1047818144, -1126261903, 1050842685, 1045845834) + + W(7, -1100400745, -1098862766, 1044462332, -1124798927); + sum2 = W(0, 1034867092, -1113896283, -1089397746, 1053130734) + + W(1, 1036831152, 1008734783, -1143881728, 1048547317) + + W(2, -1155378720, -1107821706, -1090933436, 1050664536) + + W(3, 1050005016, 1036439980, 1067046868, -1081990202) + + W(4, -1109019109, -1105188391, 1074023168, -1073616958) + + W(5, -1107857756, -1103852014, 1073004488, -1073650181) + + W(6, 1025727369, -1113326142, 1071596064, -1078582463) + + W(7, -1105627363, 1036502992, 1068047188, -1079035066); + WS(-1123566816, -1118788492); + sum1 = + W(0, 1034266605, -1131696345, -1102436480, 1029920799) + W(1, -1136553988, 1054570946, -1101485920, 1027694719) + + W(2, 1032767842, 1043367745, -1093672570, 1029228634) + W(3, -1119057557, 1057910725, -1081257723, 1038070160) + + W(4, 1032596498, 1051309065, -1104247863, 1041012541) + + W(5, -1138237144, 1050053561, -1097237249, -1104490509) + + W(6, 1034235800, 1044754161, -1100737384, 1036672371) + + W(7, 1038972738, 1047609962, -1118734125, -1101643609); + sum2 = W(0, 1001205015, -1108935456, -1123729961, -1151981614) + + W(1, 1006355343, 1048575251, 1037564428, -1123825361) + + W(2, 1030505158, -1114918170, -1096130861, 1015236500) + + W(3, -1119701641, -1088419213, -1068662368, -1095410362) + + W(4, 1039794598, 1032736312, 1076967646, 1049774729) + W(5, -1107202062, 1045905661, 1068403675, -1105335733) + + W(6, 1026836118, -1116946341, -1104305708, 1050153445) + + W(7, -1115440174, 1003805295, -1124006983, -1103176791); + WS(-1103567160, 1051728620); + sum1 = + W(0, 1022317012, 1037463598, -1094952698, 1033922872) + W(1, -1105517764, 1027268637, -1107670055, 1024776175) + + W(2, -1109296554, 1052072875, -1103880757, 1038888053) + W(3, 1030946149, -1094107172, 1052944567, 1043766492) + + W(4, 1032988986, -1087396213, 1057943536, -1110506946) + + W(5, -1117957958, -1098739651, 1052382091, -1108829569) + + W(6, 1025729823, -1104965205, 1036164793, -1132271979) + W(7, 1009731405, 1017302004, 1041821631, 1015545129); + sum2 = + W(0, 1031290011, -1127050317, -1113481669, -1080536402) + W(1, -1114551402, 1026829489, 1042490649, -1076466135) + + W(2, -1137203270, 1032334734, 1043198364, 1038797044) + W(3, 1025723227, -1098446681, -1127701979, 1074254195) + + W(4, 1020823723, 1041359246, 1057793899, 1035340712) + W(5, -1107112701, 1041376772, -1100591458, -1118262367) + + W(6, -1156747895, 1034398482, -1114292550, 1013380262) + + W(7, -1140368490, -1104694439, 1037536680, 1032104302); + WS(-1106439480, 1029090439); + sum1 = + W(0, 1034559195, 1042655458, -1102396839, 1026400220) + W(1, -1151887836, 1030625962, -1115609614, 1035325646) + + W(2, 1020849475, 1059377738, -1089162129, 1042909598) + W(3, 1042053132, -1084013087, -1083731653, 1039293086) + + W(4, 1043127920, -1107145304, 1052971191, 1029716960) + W(5, 1043814293, 1032281331, -1107154457, 1024778063) + + W(6, 1037260390, 1040913704, -1113717087, 1028666946) + W(7, 1043715864, 1033172451, 1017680531, -1130742978); + sum2 = + W(0, -1129107524, 1021999108, 1022835844, -1129901940) + W(1, -1123636938, -1148550480, 1016982596, -1140398984) + + W(2, -1116921954, -1104180688, 1016773924, 1030858450) + W(3, 1035143287, 1058583951, 1054454385, -1117386658) + + W(4, 1036996009, -1112895549, -1097314323, -1108156993) + + W(5, 1026655402, -1116180274, -1099699990, -1118751234) + + W(6, -1117010042, -1131502740, -1132536424, 1016259828) + + W(7, -1126794884, -1138164712, -1129763396, -1117013506); + WS(1048151864, 1059242544); + sum1 = + W(0, -1122367849, -1097114939, 1043794348, 1026875087) + W(1, -1121466768, -1097911384, 1033810391, 1014185912) + + W(2, 1042165293, -1085899247, 1063564267, -1106211614) + + W(3, -1116044868, 1042506911, 1042284551, -1111561384) + + W(4, -1105437493, 1056857214, -1089674786, 1040868541) + W(5, 1037358179, -1105063934, 1049648847, 1028107682) + + W(6, -1125163356, -1123578292, 1021855394, -1111395274) + + W(7, -1111398955, -1106114902, 1045389303, 1010402126); + sum2 = W(0, -1139648101, -1110557326, -1106733442, 1039330638) + + W(1, -1108856547, 1041627874, -1106727608, 987619817) + W(2, 1015236663, 1032833232, 1048813377, 1025349119) + + W(3, -1095822659, 1054902128, 1055403310, -1095503796) + + W(4, -1137977893, -1098765424, -1097123375, 1050144719) + + W(5, 1038373686, -1121592121, 1045561320, -1108448514) + + W(6, 1015865663, -1106594443, -1106386080, 1041979856) + + W(7, 1025690243, -1117564251, 1017823319, -1105901385); + WS(1058511566, 1043187024); + sum1 = + W(0, 1042620242, 1041476871, -1106861387, 1043942651) + W(1, 1027981614, 1044640335, -1120607404, 1040914531) + + W(2, 1037513401, 1039039385, -1101062960, 1040902562) + W(3, 1050564856, -1085132912, -1089194338, 1048598306) + + W(4, 1040390932, -1095196494, 1032203084, 1019897185) + W(5, 1044188393, -1116362934, -1134658518, 1032634704) + + W(6, 1032851398, -1107832665, 1026497359, 1027555603) + + W(7, 1043046140, -1105825814, -1105488567, 1032742569); + sum2 = W(0, -1094808435, -1083260450, 1041967320, 1026111290) + + W(1, -1132385524, -1089624726, -1102801635, 1034887813) + + W(2, -1110994277, -1098133391, 1050258559, -1123786474) + + W(3, 1039748829, 1063143581, 1037743779, 1033106845) + W(4, 1038866141, 1043371703, 1048943341, -1110363077) + + W(5, 1012861192, 1040218148, -1112998265, -1121754906) + W(6, 1030487914, 1012758152, 1031702418, 1012203560) + + W(7, -1132742376, 1052570990, -1105604919, -1111765769); + WS(-1087236686, 1061665912); + sum1 = W(0, -1115274057, 1023071688, -1107980923, -1119301463) + + W(1, -1116162424, 1030200068, -1101866270, -1128116268) + + W(2, -1104461343, 1054050807, -1092884195, -1109238785) + + W(3, -1093387666, 1067462106, 1056570668, -1095571507) + + W(4, -1113556238, 1050597447, 1044256537, -1103733247) + + W(5, -1115159031, 1031104576, -1106234576, -1111522325) + + W(6, -1126942285, -1121547516, -1128835891, -1111458030) + + W(7, -1121543315, 1042315272, -1114796114, -1109780718); + sum2 = + W(0, -1127633710, 1024134807, -1114424195, -1109129714) + W(1, 1024854732, 1020748524, -1098546148, 1025355297) + + W(2, -1123781128, -1117094752, -1079772750, -1102118069) + + W(3, 1040493279, 1065417820, 1059484680, -1114766469) + W(4, -1105896535, 1047826025, -1107504040, 1033237727) + + W(5, 1033983514, -1102101577, 1049649199, -1154145757) + + W(6, -1122459292, 1040101538, -1105983778, 1012710689) + + W(7, -1120616672, -1124130304, 1041220419, -1123999628); + WS(-1092106140, -1084163121); + sum1 = + W(0, 1036347305, 1049849489, -1101083230, -1106738110) + W(1, 1016904817, 1040213041, -1152694122, -1115216475) + + W(2, 1034414494, 1056746079, -1083169173, 1039797369) + W(3, 1040590819, 1048812489, -1107117385, 1022569263) + + W(4, 1047670567, -1084779712, 1051667767, -1112982247) + + W(5, 1030378702, 1040726752, -1109066592, -1125038036) + W(6, -1114654031, 1033236350, 1024925978, 1025136605) + + W(7, 1037868673, 1034988241, -1107106473, -1146668256); + sum2 = W(0, -1144361879, -1111008682, -1092072719, 1021883158) + + W(1, -1128843246, -1134810723, -1121102479, -1116668390) + + W(2, 1005924247, 1041181160, 1045581242, -1109114373) + + W(3, -1104940693, 1054697191, 1046555600, -1113715104) + + W(4, -1123234701, 1052731012, -1103970223, -1128555074) + + W(5, 1030348431, 1042931729, -1104348933, 1032936433) + + W(6, 1032437115, -1112071203, -1113690885, -1136719027) + + W(7, 1024671661, -1111460488, -1129885552, -1114960949); + WS(1058637774, -1109876822); + sum1 = + W(0, -1123254812, 1042623060, -1126486401, -1112485473) + W(1, 1041301297, -1105094644, -1111052512, 1037949088) + + W(2, -1108082435, 1059472952, -1094910408, 1016105496) + + W(3, -1113241451, 1043969956, -1094009726, 1038892497) + + W(4, -1110973875, -1113269955, 1058531737, -1093047519) + + W(5, 1027216056, 1026816394, -1100061186, 1032398170) + W(6, 1014894339, -1130602892, 1032486130, -1128303438) + + W(7, 1019588394, 1026167148, -1117291247, 1021704844); + sum2 = + W(0, 1019183838, -1103677237, 1041385745, -1115238116) + W(1, 1031923668, 1026573624, 1025625867, 1024201143) + + W(2, 1049015983, -1101357077, -1095136476, 1024442030) + + W(3, -1096362417, 1060010174, -1096248497, -1122837727) + + W(4, 1005830618, -1122620605, -1115221092, 1034369966) + W(5, 1036998273, -1106684685, 1049273019, 1031554545) + + W(6, -1119396253, 1023743335, -1112424814, 1004099770) + W(7, -1125844722, 970656667, 1011280453, 1010302645); + WS(1068382951, -1145853862); + sum1 = W(0, -1109092968, -1104283584, -1126224104, -1142984099) + + W(1, -1120835030, -1104742016, 1048835390, 1035504970) + + W(2, 1015957108, -1087137628, 1060142968, 1044651720) + W(3, 1033165317, -1082841532, 1050512116, 1036256010) + + W(4, 1015780402, 1048723479, 1050625794, 1040271692) + + W(5, -1098982451, -1119342334, 1046183055, -1112268532) + + W(6, -1106789039, 1037068029, 1033167819, -1115364877) + + W(7, -1105810191, 998682871, 1042826568, -1113754717); + sum2 = + W(0, 1042289605, -1105845074, -1105090355, 1041479887) + W(1, -1123754179, 1032442894, -1106552079, 1028813354) + + W(2, 1040865617, -1090127653, -1075116096, -1087510643) + + W(3, 1025996190, 1055606718, 1073431719, -1084272058) + W(4, -1100913998, -1104101067, 1067916428, 1045036562) + + W(5, -1118459936, 1026136504, 1042119939, -1131666845) + + W(6, -1114401734, 1031986833, -1112990087, 1021173748) + + W(7, -1118182115, 1045409779, 1031635830, -1131440550); + WS(-1115823328, -1115141930); + sum1 = W(0, 994860217, -1096937968, 1034643656, 1022968545) + W(1, 1043355533, -1093401724, 1045563268, -1100277972) + + W(2, 1046651158, -1082957735, 1056739037, -1106135459) + + W(3, 1031967699, 1057829358, 1053028032, -1113373017) + + W(4, -1112906011, 1054780763, -1085595451, 1036473238) + + W(5, -1139800861, 1049387203, -1100812438, 1042166401) + + W(6, 1032268536, 1029694230, -1112691098, -1109328859) + + W(7, 1021673189, 1032667294, -1163065290, 1026417494); + sum2 = + W(0, 1041009418, 1006794492, 1023178506, -1126244586) + W(1, -1106230161, 1034312638, -1120362931, 1021996758) + + W(2, -1113994011, -1108126219, -1105213924, -1131146954) + + W(3, -1100787264, 1060460225, 1054015707, 997147503) + W(4, -1102450993, -1119222967, 1053508358, -1107185372) + + W(5, -1114680808, -1097084093, -1133314452, -1126416406) + + W(6, 1031764893, -1125377404, -1141774536, -1126617106) + + W(7, -1145068408, -1105852265, -1120752408, -1131039214); + WS(1044911928, 1063248560); + sum1 = + W(0, -1117210934, -1089987573, 1050931427, -1154913199) + W(1, 1045807559, 1006551364, 1049202419, 1049427019) + + W(2, -1116245664, -1085623154, 1044690392, -1098224261) + + W(3, -1122601008, -1098705597, 1056494849, 1043742399) + W(4, 1041679280, -1089608778, 1054654497, 1009817082) + + W(5, -1102494868, -1098692501, 1047881833, -1102952115) + W(6, 1044187563, 1040126000, 1043119951, 1048685800) + + W(7, -1101059428, -1100421777, 1043071666, -1132265536); + sum2 = W(0, -1110897864, 1031814971, 1060526454, -1090228093) + + W(1, -1104703066, -1126406622, 1034850394, -1097166620) + + W(2, 1039476246, -1112535334, 1060516426, -1091926928) + + W(3, -1102025112, -1088994686, -1088701567, 1063814816) + + W(4, 1041770976, 1050082866, -1072347435, 1074296249) + W(5, 1044782005, 1038057456, -1075073775, 1073862535) + + W(6, -1112640404, 1029663347, -1077197270, 1067261757) + + W(7, 1045848501, -1098794387, -1081012351, 1067785227); + WS(-1105546040, 1026157880); + sum1 = + W(0, 1040950836, 1040614249, -1102499357, 1036650571) + W(1, 1036866652, 1043435937, 1032157499, 1032871003) + + W(2, 1045419231, 1048836647, -1088963702, 1035867609) + W(3, 1057171433, -1092874056, -1078642173, 1040635958) + + W(4, 1039696013, 1049109967, -1094603626, 1039966133) + W(5, 1040737235, 1037560064, 999044599, 1035782037) + + W(6, 1031337694, 1039556030, -1107844556, 1034875342) + W(7, 1043417390, 1020658754, -1101965321, 1029450491); + sum2 = + W(0, 999804672, 1033414560, -1131242272, -1111239120) + W(1, 965076992, -1142972544, -1152459008, -1114613368) + + W(2, 1017997216, -1117537424, 1043660652, 1024438240) + W(3, -1113573416, -1080122522, 1068973644, 1009242816) + + W(4, 1015814944, -1116987776, -1113471168, 1026341216) + W(5, 1013150208, 1009041344, 1023678672, -1111376032) + + W(6, 1004325632, 1030258512, -1115573696, -1124670336) + + W(7, -1116017408, -1123867424, 1025739248, 1011147520); + WS(-1081027239, 1060388068); + sum1 = + W(0, 1040945153, 1049191505, -1103567931, -1142725077) + W(1, 1018532824, 1052335227, -1106690587, -1126830164) + + W(2, 1048158700, 1053224518, -1098210230, 1044049241) + W(3, 1050078256, -1089652372, -1079677805, 1037048166) + + W(4, 1043330564, 1050009062, -1090769236, 1037549983) + W(5, 1045983912, 1019623144, -1102526621, -1124021470) + + W(6, 1034126717, 1043374892, -1113976903, 1031972104) + W(7, 1042366848, 1037373643, -1106920486, 1000910717); + sum2 = W(0, 1029289565, -1119356133, -1126159585, -1119814653) + + W(1, 1023484285, 1031916514, -1111485988, -1133461586) + + W(2, 1041097307, -1120749829, -1121314077, -1112201820) + + W(3, 1044843621, 1057057740, 1024531885, 1001931237) + W(4, -1101664529, 1055633817, -1102656055, 1035253182) + + W(5, -1108647964, -1098024997, 1016983721, 1019582313) + + W(6, -1111945130, 1038083406, -1105960100, 1011319026) + + W(7, -1129898257, -1101101054, 1022769465, -1110859200); + WS(-1121436896, -1083449266); + sum1 = + W(0, -1131437006, 1057845458, -1096100393, -1112818966) + W(1, -1126965659, 1026072602, -1106937331, 1025271436) + + W(2, -1106898372, 1058188821, -1089458543, -1120770471) + + W(3, 1049661628, 1047051462, -1093909527, 1039868950) + + W(4, -1110051320, 1036301673, -1105302990, -1101852248) + + W(5, 1048826500, 1049513187, -1097831955, 1048680544) + W(6, 1018834023, 1026266705, -1115312055, -1111779257) + + W(7, 1030351624, 1043516478, -1094725407, -1137214404); + sum2 = W(0, 1025140224, -1118806788, -1126785121, 1031495588) + W(1, 1016993788, 1030590564, -1118559458, 991152164) + + W(2, -1106156741, 1042721449, -1106137914, 1038491925) + + W(3, -1085967118, 1078987048, -1100137345, 1040984057) + + W(4, -1070014283, 1078555235, 1044823121, -1111978905) + + W(5, -1066270592, 1069325982, -1105174392, 1030579932) + + W(6, -1089828448, 1051485796, -1121082393, -1113499951) + + W(7, -1115300709, 1026006822, 1011662011, -1120641633); + WS(1060473294, -1125032523); + sum1 = W(0, -1118381578, 1043924207, 1028842287, -1103983036) + + W(1, -1131528546, 1048790648, -1094915206, 1032416951) + + W(2, -1103035725, 1057928103, 1048586166, -1131359957) + + W(3, 1044891665, -1096003632, -1089668066, 1041536420) + + W(4, 1017562024, -1104437021, 1048997587, -1119623443) + + W(5, 1038728371, -1127678449, -1106021950, 1026802338) + + W(6, 1013193724, -1138265298, 1016196772, -1112764523) + + W(7, 1017619335, 1019650740, -1112334062, 1028850580); + sum2 = W(0, -1124013145, 1023871771, 1041717973, 1027246941) + + W(1, -1154979909, -1104183315, -1104961174, -1105906795) + + W(2, -1113455493, 1024353365, -1071159846, -1114760758) + + W(3, 1042673063, -1099433949, 1075222357, 1048045634) + W(4, 1009341589, 1037029004, 1061754151, -1101645527) + + W(5, -1131887235, -1106752952, -1106459992, 1027783079) + + W(6, -1126494367, -1136822537, 1037905746, -1130069351) + + W(7, -1120394460, -1135604889, 1020599743, 1023779471); + WS(1063175758, 1049951270); + sum1 = W(0, 1051934199, -1084051495, 1040719576, 1028219745) + W(1, 1041620825, -1091045702, 1046456792, 1028165760) + + W(2, 1053157077, -1089200998, 1054477181, -1110307566) + + W(3, 1019501037, -1103613676, 1050464826, 1037889601) + + W(4, -1121035141, -1103906809, -1098419444, 1045652053) + + W(5, 1024394007, 1042850683, -1097805325, 1054554722) + W(6, 1034798936, -1117239270, 1011564046, 1031152711) + + W(7, 999909159, -1106705027, -1091232034, 1056053333); + sum2 = W(0, -1091471926, 1062079447, 1055700238, 1015596856) + W(1, 1042259987, -1095572989, 1041645665, 1033532620) + + W(2, -1103057728, -1089203271, 1037140407, 1035045090) + + W(3, 1049412228, -1092861102, -1093629070, 1042934527) + + W(4, 1044973062, 1034556296, -1095940003, 1032040702) + + W(5, -1116401558, 1047552828, -1106623325, -1106239816) + + W(6, 1011000463, -1110031497, -1107294450, 1033073048) + + W(7, -1130123924, 1051271629, 1053844390, -1095799213); + WS(-1085388366, -1090694979); + sum1 = W(0, -1123787314, 1044273497, -1108110651, -1115475932) + + W(1, -1119481145, -1130943626, 1041576542, -1117135031) + + W(2, 1032777214, 1047368143, -1087220302, 1040347561) + + W(3, -1112850502, 1059845268, 1027588771, -1101064470) + + W(4, 1041751591, -1095680144, 1036323946, 1037523789) + + W(5, -1125429276, 1039407200, -1111657568, -1126225621) + + W(6, -1140788444, 990533574, 1021334836, -1134357621) + + W(7, -1113892940, 1032644049, -1143449895, -1109271006); + sum2 = W(0, -1107190004, 1037736456, -1125693587, -1120404934) + + W(1, 1013881877, -1105376838, 1040619572, -1122228614) + + W(2, -1118295314, -1123416196, -1082924015, 1051908042) + + W(3, -1121103222, 1042717593, 1068021664, -1087341114) + + W(4, -1127822751, -1115549939, 1016978358, 1042189807) + + W(5, -1115317828, 1043660085, -1108863865, -1125959243) + + W(6, -1126179247, -1126402007, -1136349779, 1038966556) + + W(7, -1114801766, 1040920849, -1107267301, 1023515477); + WS(1065904679, -1122628785); + + return clamp(mstd0 + 5.0 * vsum / wsum * mstd1, 0.0, 1.0); +} + +shared float inp[429]; + +#define CURRENT_PASS 1 + +#define GET_SAMPLE(x) dot(x.rgb, rgb2y) +#define imageStore(out_image, pos, val) imageStoreOverride(pos, val.x) +void imageStoreOverride(uint2 pos, float value) { temp[pos] = (value); } + +#define INPUT_tex(pos) GET_SAMPLE(vec4(texture(INPUT, pos))) +static const float2 INPUT_size = float2(GetInputSize()); +static const float2 INPUT_pt = float2(GetInputPt()); + +#define HOOKED_tex(pos) INPUT_tex(pos) +#define HOOKED_size INPUT_size +#define HOOKED_pt INPUT_pt + +void Pass1(uint2 blockStart, uint3 threadId) { + ivec2 group_base = ivec2(gl_WorkGroupID) * ivec2(gl_WorkGroupSize); + int local_pos = int(gl_LocalInvocationID.x) * 11 + int(gl_LocalInvocationID.y); + for (int id = int(gl_LocalInvocationIndex); id < 429; id += int(gl_WorkGroupSize.x * gl_WorkGroupSize.y)) { + uint x = (uint)id / 11, y = (uint)id % 11; + inp[id] = + HOOKED_tex(HOOKED_pt * vec2(float(group_base.x + x - (3)) + 0.5, float(group_base.y + y - (1)) + 0.5)).x; + } + barrier(); + vec4 ret = vec4(0.0, 0.0, 0.0, 0.0); + vec4 ret0 = vec4(0.0, 0.0, 0.0, 0.0); + vec4 samples[8]; + samples[0][0] = inp[local_pos + 0]; + samples[0][1] = inp[local_pos + 1]; + samples[0][2] = inp[local_pos + 2]; + samples[0][3] = inp[local_pos + 3]; + samples[1][0] = inp[local_pos + 11]; + samples[1][1] = inp[local_pos + 12]; + samples[1][2] = inp[local_pos + 13]; + samples[1][3] = inp[local_pos + 14]; + samples[2][0] = inp[local_pos + 22]; + samples[2][1] = inp[local_pos + 23]; + samples[2][2] = inp[local_pos + 24]; + samples[2][3] = inp[local_pos + 25]; + samples[3][0] = inp[local_pos + 33]; + samples[3][1] = inp[local_pos + 34]; + samples[3][2] = inp[local_pos + 35]; + samples[3][3] = inp[local_pos + 36]; + samples[4][0] = inp[local_pos + 44]; + samples[4][1] = inp[local_pos + 45]; + samples[4][2] = inp[local_pos + 46]; + samples[4][3] = inp[local_pos + 47]; + samples[5][0] = inp[local_pos + 55]; + samples[5][1] = inp[local_pos + 56]; + samples[5][2] = inp[local_pos + 57]; + samples[5][3] = inp[local_pos + 58]; + samples[6][0] = inp[local_pos + 66]; + samples[6][1] = inp[local_pos + 67]; + samples[6][2] = inp[local_pos + 68]; + samples[6][3] = inp[local_pos + 69]; + samples[7][0] = inp[local_pos + 77]; + samples[7][1] = inp[local_pos + 78]; + samples[7][2] = inp[local_pos + 79]; + samples[7][3] = inp[local_pos + 80]; + ret[0] = nnedi3(samples); + ret0[0] = inp[local_pos + 34]; +#if CURRENT_PASS == LAST_PASS + uint2 destPos = blockStart + threadId.xy * 2; + uint2 outputSize = GetOutputSize(); + if (destPos.x >= outputSize.x || destPos.y >= outputSize.y) { + return; + } +#endif + imageStore(out_image, ivec2(gl_GlobalInvocationID) * ivec2(1, 2), ret0); + imageStore(out_image, ivec2(gl_GlobalInvocationID) * ivec2(1, 2) + ivec2(0, 1), ret); +} +//!PASS 2 +//!DESC NNEDI3 (double_x, nns128, win8x4) +//!IN INPUT, temp +//!OUT OUTPUT +//!BLOCK_SIZE 64, 8 +//!NUM_THREADS 32, 8 +#pragma optionNV(inline none) +float nnedi3(vec4 samples[8]) { + float sum = 0.0, sumsq = 0.0; + [unroll] for (int i = 0; i < 8; i++) { + sum += dot(samples[i], vec4(1.0, 1.0, 1.0, 1.0)); + sumsq += dot(samples[i], samples[i]); + } + float mstd0 = sum / 32.0; + float mstd1 = sumsq / 32.0 - mstd0 * mstd0; + float mstd2 = mix(0.0, inversesqrt(mstd1), mstd1 >= 1.192092896e-7); + mstd1 *= mstd2; + float vsum = 0.0, wsum = 0.0, sum1, sum2; +#define T(x) intBitsToFloat(x) +#define W(i, w0, w1, w2, w3) dot(samples[i], vec4(T(w0), T(w1), T(w2), T(w3))) +#define WS(w0, w1) \ + sum1 = exp(sum1 * mstd2 + T(w0)); \ + sum2 = sum2 * mstd2 + T(w1); \ + wsum += sum1; \ + vsum += sum1 * (sum2 / (1.0 + abs(sum2))); + sum1 = W(0, -1106336704, -1134422686, -1097058997, -1096794255) + + W(1, -1096428577, -1108910446, -1110459731, -1101174078) + + W(2, -1104338237, -1108550970, 1036063029, 1068454954) + + W(3, 1045547931, -1102009308, -1122481515, 1017740065) + + W(4, 1041734649, -1135080854, 1053379177, 1068510503) + + W(5, -1114733521, -1146436468, -1107441476, -1113618698) + + W(6, -1112016931, -1117701445, -1099451832, -1092648385) + + W(7, -1101312270, -1118387353, -1118789516, -1107281979); + sum2 = W(0, -1107960738, 1022891960, -1112828174, -1099542471) + + W(1, 1028527356, -1124169384, 1003609248, 1019646072) + W(2, 1034572820, 1003346080, -1096749055, 1067566060) + + W(3, -1090311143, 1028295012, -1101382023, -1102277943) + + W(4, -1105088633, -1103397515, 1056062200, -1127174872) + + W(5, 1048792675, -1106700271, 1033154740, 1037356874) + + W(6, -1147785184, 1035529310, -1105585021, 1034766166) + + W(7, -1117109292, -1116900804, -1121486356, -1114899026); + WS(-1075683047, -1087125913); + sum1 = W(0, 1042687663, 1034752002, 1020877136, 1043598702) + W(1, 1032834596, 1049059763, 1041786741, 1050972591) + + W(2, 1052977914, 1046022844, 1051043629, 1049374510) + + W(3, 1044576234, -1108783446, -1105784362, -1089957133) + + W(4, -1087267578, -1097639380, -1087388173, -1095656786) + + W(5, -1108370107, -1101488315, -1111228387, -1108747496) + + W(6, 1041384601, 1034807969, 1037740431, 1044538321) + W(7, -1113942663, 1043415765, 1011031587, 1034104676); + sum2 = W(0, -1129327146, -1149557934, 1027469999, -1116270499) + + W(1, -1107094547, -1114668504, -1136313139, -1115408970) + + W(2, -1112916736, -1120018795, -1105442406, 1056936993) + + W(3, 1036431709, 1029410453, -1126491682, -1112281372) + + W(4, -1109246006, 1012425107, 1044505132, 1054092693) + + W(5, 1015080154, -1102188513, -1123974759, -1115235380) + + W(6, -1168639863, -1122303521, -1114911422, -1109477794) + + W(7, -1122292075, 1038663029, -1124857486, 1004657207); + WS(1042212664, -1102203684); + sum1 = + W(0, -1140902818, 1019874102, -1138465404, 1041713132) + W(1, 1031911135, 1032244040, -1122713961, 1032066151) + + W(2, 1040147851, -1104962202, -1102798136, -1085739950) + + W(3, -1090423514, -1096835716, 1015091005, -1100137137) + W(4, 1035472140, 1045102086, 1044852023, 1052255697) + + W(5, 1050093153, -1114874577, -1125530488, 1025859399) + + W(6, -1111794429, 1033944684, -1122108180, 1042129278) + W(7, 1026181805, 1045351411, 1045226448, 1037723887); + sum2 = + W(0, 1025219442, -1119436548, 1041363772, 1026037858) + W(1, -1106963956, -1148187164, -1115265228, 1027834104) + + W(2, -1109152196, -1122141349, 1032935700, -1095545125) + + W(3, 1029288712, 1048235476, 1017807431, -1124373883) + W(4, 1026944460, 1040314652, -1124096755, -1132954458) + + W(5, 1063106013, 1044093468, -1119277141, -1115291573) + + W(6, -1136900198, -1112897189, -1144192892, 1046665648) + + W(7, -1112667488, -1091150222, -1098670428, -1099776205); + WS(-1106435384, 1038338229); + sum1 = W(0, 1040095954, 1019822615, 1037825128, 1041126536) + W(1, 1042659628, 1046281616, 1025627498, 1052688116) + + W(2, 1057302312, 1048464174, 1048602738, 1046177110) + + W(3, -1113571175, 1010729037, -1116720143, -1090676327) + + W(4, -1085504617, -1109673285, -1088007186, -1089584127) + + W(5, -1112427435, -1099904421, 985851280, -1109333660) + W(6, 1038469973, 1008999077, 1047759857, 1042217259) + + W(7, -1122205838, 1042535855, 1020820192, 1034203799); + sum2 = W(0, 1016257202, 1025056091, -1123344133, -1117490597) + + W(1, -1139226916, -1121712633, 1032149092, 1018740994) + + W(2, 1059204215, 1059357388, -1096239491, -1080318626) + + W(3, -1097775023, -1121076469, -1108589001, 1042934709) + + W(4, 1078138204, 1057901024, -1075026282, -1073900782) + W(5, 1041808545, 1040778731, 1040543247, 1013253724) + + W(6, 1045786159, -1115583727, 1040463834, 1043123901) + + W(7, 1021989454, -1105966927, 1015040126, -1147555881); + WS(-1079558823, -1098708322); + sum1 = + W(0, -1107155318, 1025234303, 1015859078, 1036194249) + W(1, -1109510417, -1106597869, -1106784003, -1107821257) + + W(2, -1102044491, -1098872409, -1087610848, -1086405173) + + W(3, 1049149960, -1113006787, 1034815041, -1109243348) + W(4, -1157836704, 1050456336, 1055919296, 1051086989) + + W(5, 1049231261, 1047976577, 1037659280, 1045770027) + W(6, 1018716763, 1032647774, 1043448582, 1041211303) + + W(7, 1032229161, -1113988824, -1114873522, -1115826050); + sum2 = W(0, -1115121954, 1012713185, -1120959275, 979525395) + W(1, 1031308048, 1023425822, 1008898041, 1015643115) + + W(2, 1038073794, -1114116718, 1048906430, -1089285214) + + W(3, 1044939824, 960279117, -1114246838, -1116674868) + + W(4, -1128914993, 1041575276, 1074552079, -1076455267) + + W(5, -1081125046, -1109266711, 1028966618, -1116558128) + + W(6, -1116577465, -1124395325, 1055266270, 1060162115) + + W(7, -1098098687, 1021768571, -1124862202, 1013382601); + WS(1045132600, -1120782135); + sum1 = W(0, -1105751784, -1105178898, -1104184899, -1114219853) + + W(1, -1110381909, 1038688878, -1129240105, 1028338913) + W(2, 1057393815, 1048859946, 1059464001, 1046945589) + + W(3, -1115358437, -1101266388, 1006928425, 1001553277) + + W(4, -1105555137, -1097544977, -1093321826, -1096850414) + + W(5, 1045680426, 1054674458, 1040711722, 1051440502) + + W(6, -1117651397, 1030868229, -1113548192, -1114482291) + + W(7, -1100710867, -1101910270, -1109195062, -1106616547); + sum2 = W(0, 1017265392, -1109811903, 1023756444, -1113627340) + + W(1, 1014378799, -1145950526, -1129429444, 1013677319) + W(2, 1041015042, 1031690548, 1041543835, 1061785433) + + W(3, -1112539854, 1033767962, -1111764061, -1098545742) + + W(4, -1100279165, -1110095441, -1121800962, 1052269299) + + W(5, 1027655784, -1103181542, -1110834939, -1106577514) + + W(6, 1015388608, -1118750728, 1018680528, -1143924414) + + W(7, -1099334823, 1020584168, -1108053853, 1036964648); + WS(1052573852, -1122511817); + sum1 = W(0, -1122539822, 1036520122, -1150669710, -1131456914) + + W(1, 1027717464, 1032118773, 1021054902, 1030809195) + + W(2, -1107197216, -1104137920, -1095755763, -1089160552) + + W(3, -1090293588, -1090056564, -1092174087, -1086001910) + + W(4, -1123108403, 1038549849, 1032946604, 1050538028) + W(5, 1052989852, 1057974832, 1053464075, 1057808582) + + W(6, 1051517474, 1023654291, 1039184399, 1041388597) + W(7, -1168884669, 1033029075, 1028526105, 1041880934); + sum2 = W(0, -1085894681, 1038192816, -1098445483, -1102898046) + + W(1, 1008806191, 1050638036, -1102617523, 1057325981) + + W(2, -1108201039, -1090848333, 1052221636, 1071505414) + + W(3, -1098981857, -1086351349, -1096799400, -1088620184) + + W(4, 1070882268, -1093216289, 1067999858, 1073865984) + + W(5, 1058878464, -1083525828, -1107159037, -1083206959) + + W(6, -1081052443, -1102549623, -1087793608, -1090403840) + + W(7, -1095780376, 1055133376, -1096503933, 1053790412); + WS(-1073219892, -1080326418); + sum1 = W(0, -1114077580, -1142635506, -1142955026, -1123237842) + + W(1, 1038107057, -1103324917, 1026598572, -1095875035) + + W(2, -1101602915, -1103425331, -1090278522, -1092662145) + + W(3, -1091646784, -1114692451, -1101848592, 1038718196) + + W(4, 1057495924, 1053716920, 1055741332, 1051447237) + W(5, 1052494629, 1049044089, 1043005848, 1047828379) + + W(6, -1151047116, -1114784094, -1111276924, -1121668701) + + W(7, 1000704387, -1109204280, 1010568075, -1156952092); + sum2 = + W(0, -1121663397, -1116542136, 1042431779, 1037730633) + W(1, 1010053773, -1137348615, 1028087910, -1119025600) + + W(2, -1095443331, 1050195534, -1123573301, -1100504352) + + W(3, 1043186658, -1102861372, -1110454800, 1040229501) + + W(4, -1067370736, -1071776975, 1068672794, 1077012119) + W(5, 1070664889, 1045361006, -1123945395, 1027642294) + + W(6, 1005231721, 974104521, -1111985184, 1047585075) + W(7, 1016528922, -1109020232, 1037668055, -1117277443); + WS(-1130027456, 1047744266); + sum1 = W(0, 1030328637, -1100312969, 1036569044, 1044449278) + + W(1, -1106699970, 1046212150, -1104762293, -1124975021) + + W(2, -1103440100, 1043447132, -1096543805, -1093151398) + + W(3, 1024264999, -1115860524, 1041344218, 1032410566) + W(4, 1050534604, 1038395889, 1037345619, -1106526388) + + W(5, -1115006287, 1035372917, 980910400, 1044066628) + W(6, -1130350917, -1105733872, 1043114871, 1022399622) + + W(7, 1020228332, 1024836117, -1123108872, -1112803412); + sum2 = W(0, 1029880722, -1098453144, 1029103498, 1067660000) + + W(1, -1094604015, 1046293202, -1104816365, -1117927817) + + W(2, 1033391383, 1041649400, -1095624145, -1082091368) + W(3, 1056223691, 1027973488, 1034193475, 1034286113) + + W(4, -1137819024, -1137377888, 1040796761, -1080643124) + + W(5, -1102259819, -1121978412, -1148596400, 1041009105) + + W(6, -1114516031, 1025620716, 1035240799, 1066795978) + + W(7, -1098376459, 1036814117, -1107858514, -1114981924); + WS(1049012636, 1037011386); + sum1 = W(0, -1108102978, 1042768739, 1036457352, -1105146600) + + W(1, -1100621772, -1100160944, -1149100234, -1116535239) + + W(2, -1097922903, -1089977373, -1083790961, 1050515995) + + W(3, 1053649082, 1044221701, 1020595485, -1110188826) + W(4, 1049818257, 1052134241, 1059747641, 1062551839) + + W(5, -1088576433, -1093385002, -1108848982, -1147628986) + + W(6, 1041216474, -1106782690, -1120768141, 975424142) + + W(7, 1042971413, 1047421135, -1142399358, 1034144007); + sum2 = W(0, -1130376652, -1109307779, 998991648, -1105231849) + + W(1, -1124853008, -1110904873, 1033926100, 1012787248) + + W(2, -1109271051, 1040605589, -1117670218, 1068278024) + + W(3, -1099193318, 1035466738, -1111928806, 1025845624) + + W(4, -1098570547, -1097221185, -1087670872, 1068017963) + + W(5, -1103240593, 1049832589, 1018913792, 1035573068) + + W(6, 1029552052, -1097745138, -1101762859, -1100990121) + + W(7, -1094879980, -1119653306, -1099498770, 1046656503); + WS(-1099128120, 1074104605); + sum1 = W(0, 1001695642, -1114738061, -1137881464, 1035838167) + W(1, 1036976671, 1043227732, 1024532056, 1041576607) + + W(2, 1031876531, 1036082771, 1049670772, 1045634202) + W(3, 1039176783, 1044499416, -1115296143, 1036111714) + + W(4, -1106225286, -1127447088, -1114090766, -1084335000) + + W(5, -1092101927, -1106295064, -1108352670, -1103209586) + + W(6, 1039516460, 1037331996, 1048871226, 1024672505) + + W(7, -1111706306, 1040216275, 1018355325, -1129216251); + sum2 = W(0, -1125983803, 1026289226, 1003361806, 1036989304) + W(1, -1121376018, -1127516251, 999276462, 1020382491) + + W(2, 1057121124, 1048908439, 1042597022, -1101738899) + + W(3, -1101518001, -1114490175, 1032222895, -1111061815) + + W(4, -1097673861, -1081617292, -1083990029, 1066557847) + + W(5, 1050089807, 1021212715, -1107462587, 1048167829) + + W(6, -1097055530, -1105528539, -1094090339, 1060807350) + + W(7, 1045798092, 1007168711, 1021142275, 1024157832); + WS(1043392312, -1114334171); + sum1 = W(0, 1041086874, 1027676176, 1029494548, 1038182418) + W(1, 1033375641, 1014428948, 1016176348, 1036956537) + + W(2, 1046571639, 1051603231, -1114765098, 1063881062) + W(3, 1036439434, 1039261900, 1049353410, 1039119196) + + W(4, -1101297859, -1100311555, -1090719068, -1092551191) + + W(5, -1093343060, -1095549099, -1102133676, -1097401399) + + W(6, -1108043111, 1031499310, -1123479337, 1047470620) + + W(7, 1029157954, -1113522785, 1032866554, -1108903402); + sum2 = W(0, 1032922039, 1034144522, 1035186417, -1106146153) + W(1, 995983013, 1014708981, -1118508182, -1122673776) + + W(2, -1110774431, 1041464609, -1089347840, 1063858171) + + W(3, -1103182741, -1105498679, 1046443094, -1107403517) + + W(4, 1024080221, 1024001520, -1102975683, 1062496232) + + W(5, -1104694448, 1034761930, -1113235807, -1126790312) + + W(6, -1111786600, 1038622987, -1098326560, -1094555153) + + W(7, -1110476474, -1107944280, 1045574278, -1119406695); + WS(1055141020, 1060902337); + sum1 = W(0, 1034435725, -1133288704, 1026181508, 1033934442) + W(1, 1030709219, -1118188821, 1027652318, 1035419593) + + W(2, 1057965143, 1052483105, 1052696320, -1122504460) + W(3, 1052884304, 1049027177, 1046782257, 1045790650) + + W(4, -1123568702, -1121795134, -1094115828, -1084201687) + + W(5, -1093347107, -1096042081, -1098441692, -1101051195) + + W(6, -1104499136, 1006999415, -1153162900, 1029709087) + + W(7, 1036285529, -1155692311, 1013713298, -1111952258); + sum2 = W(0, 1043194323, 1017945729, 992756489, -1117717167) + W(1, 1023440269, -1108161809, 1034607052, -1115924363) + + W(2, -1070666261, -1075189642, 1068575013, 1076566585) + + W(3, 1056539999, -1098049115, 1036076910, -1112346970) + + W(4, -1098866335, -1106608294, 1051129947, 1049134123) + + W(5, 1047751107, -1097073139, 1011007330, 1016205049) + + W(6, -1101126135, 1010301074, -1107911121, 1046700061) + + W(7, 1020103457, 1026363561, 1035420194, -1137869730); + WS(-1090579868, 1070279725); + sum1 = W(0, 1032329895, -1102328821, -1113203900, -1098061089) + + W(1, -1105344998, 1034205973, -1106552005, 1041435478) + W(2, 1048430680, 1050349544, 1052980239, 1057014372) + + W(3, 1057962188, 1038273502, 1046276062, 1049777060) + + W(4, -1101560157, -1091335294, 1039656780, -1084573078) + + W(5, -1103450436, 1043587871, -1098888483, 1002064136) + + W(6, -1129281319, 1012204235, 1033674783, -1115372202) + + W(7, -1108117804, -1111454739, -1115265901, -1109943484); + sum2 = + W(0, 987673807, 1036995374, -1095509641, -1094252408) + W(1, -1119095571, -1103179232, 1040985329, -1114181285) + + W(2, 1027892228, -1102736131, 1034852634, 1059241808) + W(3, -1103859919, 1043446486, -1109795439, 1004807604) + + W(4, -1103141235, 1049007178, -1090760003, 1060311666) + + W(5, -1129798465, -1100012675, 1051746582, -1113144024) + + W(6, 1005138532, 1028221332, -1123669832, -1128511149) + W(7, 1032914452, 1006285508, -1122773902, 987177167); + WS(1058381774, -1086956646); + sum1 = W(0, 1005434106, -1149835360, 1034370117, 1036055789) + + W(1, 1007595428, -1173712576, -1122685332, -1119060568) + + W(2, -1096145742, -1100460324, -1096424577, 1033532617) + + W(3, 1049990129, 1042033667, -1147483724, 1021597150) + W(4, 1046241393, 1039571170, 1054608457, -1110152984) + + W(5, -1100950084, -1103984787, -1122634471, 1016207588) + + W(6, 1026532260, -1120107684, -1107524072, -1123297125) + + W(7, 1032832748, 1041584782, -1111048693, 1023439817); + sum2 = + W(0, 1073050559, 1069067455, -1096535796, -1073893027) + W(1, -1077684470, 1038335059, 994568047, -1109196141) + + W(2, 1049113865, 1035642194, -1105600932, -1114871718) + W(3, -1104998692, 1034875990, 1004288083, 1019116562) + + W(4, 1048373410, -1101089925, 1050248373, -1113393188) + W(5, 1015693919, 1032989733, 1024635942, 1041247426) + + W(6, -1123382260, 1035361564, -1105239942, 1000972215) + W(7, -1112223483, 987872957, 1016564448, 1019016937); + WS(1051792028, 1027146209); + sum1 = W(0, -1173418992, 1031492470, 1030866682, -1111745573) + W(1, 1037975597, 1032231158, 1021051177, 1029296729) + + W(2, -1096555104, -1099279313, -1102472206, -1086728512) + + W(3, -1098029143, -1099704976, -1107704157, -1088435526) + + W(4, 1048715847, 1043543405, 1045948678, 1048944276) + W(5, 1053562136, 1041023999, 1031959404, 1046674105) + + W(6, 1037767898, 1032372106, 1031937048, 1030986133) + W(7, 1035090980, 1038793940, 1031982829, 1043937550); + sum2 = W(0, 1076285256, 1067013205, 1054912747, -1103468782) + + W(1, -1082179927, -1086354611, -1086555076, -1077304359) + + W(2, -1071495861, -1080654015, -1092768710, 1053690657) + + W(3, 1062196550, 1059230433, 1065208788, 1069826015) + W(4, -1089164092, 1044446905, -1089831336, 1049463752) + + W(5, -1116071286, 1055604285, -1102169042, 1049830695) + + W(6, 1024798548, -1130255717, -1111620633, -1129289568) + + W(7, 1022374674, -1147177200, 1008723412, 990531682); + WS(-1116843232, 1041538044); + sum1 = W(0, 1038718416, 1041393778, 1023355030, 1040958951) + W(1, 1040537034, -1112360254, 1043346413, 1047211822) + + W(2, 1050813118, 1048646402, 1043671731, 1037057641) + W(3, 1050123337, 1052799074, 1037436293, 1042212684) + + W(4, -1091780513, -1107072481, -1097953353, -1088265503) + + W(5, -1105750724, -1091053114, -1121572392, -1091261766) + + W(6, -1107356403, 1032833522, -1126022145, -1185162751) + + W(7, 1038008293, -1123581176, 1033129910, -1116284746); + sum2 = W(0, -1127892588, 1025248710, -1127740272, -1114879615) + + W(1, -1125515678, -1135605467, 1015277154, -1118452308) + + W(2, -1090048491, -1124324076, -1092974499, 1047668544) + + W(3, 1042122418, 1052455522, -1102075660, 1052515578) + + W(4, -1076486023, -1080184847, -1080442855, 1048567939) + + W(5, 1066323214, 1068938556, 1066205534, 1058048535) + W(6, 1071993665, 1067215194, 1068762214, 1014309155) + + W(7, -1079656754, -1077318729, -1083078137, -1086246531); + WS(1045082936, 1047750074); + sum1 = W(0, 1017867382, -1105827232, -1139557912, -1098507795) + + W(1, -1112138258, -1113781499, -1117154624, 1024003356) + + W(2, 1038967959, 1036533543, 1048524561, 1057427781) + W(3, 1057555836, 1044700722, 1037485187, 1046059755) + + W(4, -1107005280, -1101431328, 1044741561, -1099209723) + + W(5, -1103886606, -1117912777, -1108908881, 1024367918) + + W(6, -1117189504, 1000061951, 1034808454, -1102176472) + + W(7, -1102736460, -1102956733, -1113728179, -1108156515); + sum2 = W(0, 1003184961, 971431442, -1131894760, -1133283297) + W(1, 984723076, 1031831407, -1125590160, 1031681833) + + W(2, 1024857236, -1109323954, 1026446282, -1105665514) + + W(3, -1116186208, 1024492508, -1121629964, -1148808497) + + W(4, -1114215978, 1030818718, 1031262679, 1056963612) + W(5, 1055283667, 975724297, -1116339968, 1026784592) + + W(6, 1037587704, -1121823736, 1045339410, -1107079097) + + W(7, -1090072253, -1102678968, -1103014356, -1123463096); + WS(1059869006, 1015916977); + sum1 = W(0, -1111801867, 1039164638, 1023424768, -1118862224) + + W(1, -1114194639, -1099094340, -1118811114, -1096321008) + + W(2, -1103727218, -1102716146, -1089648586, -1092420393) + + W(3, 1049092536, 1052180160, 1032231232, 1046058153) + W(4, 1051877295, 1051739903, 1057614174, 1055627629) + + W(5, -1096079006, 1008315659, -1121275805, 1039975892) + + W(6, -1115491581, -1106752078, -1104830517, -1112797325) + + W(7, 1038662167, 1030088557, -1131680577, -1175801754); + sum2 = W(0, -1113427160, -1104433368, -1104169884, -1117600576) + + W(1, -1102319880, 1039627671, -1097619580, 1047721667) + + W(2, -1090644207, -1091764889, -1109333336, 1065407690) + + W(3, -1098732665, -1109931470, 1043714297, 1041133481) + W(4, 1034414883, -1120815960, 995253792, 1059846520) + + W(5, 1048874179, 1008884504, 1021072320, -1103318888) + + W(6, 1038986783, -1135559136, 1033390214, -1120264784) + + W(7, -1104270640, 1019376128, -1111461786, -1142244432); + WS(1054131356, -1077482588); + sum1 = + W(0, -1100136045, 989703980, -1114161471, -1117800461) + W(1, 1013262449, -1112319975, 1027862775, -1103330903) + + W(2, -1101215881, -1100083265, -1091699940, -1088812180) + + W(3, -1095974704, 1033042241, -1095224480, -1102789769) + W(4, 1045307006, 1039854844, 1051542530, 1056393300) + + W(5, 1053327664, 1059113280, 1049428707, 1055440053) + W(6, 1047064142, -1120855287, 1042850313, -1122501592) + + W(7, -1118254671, -1111473941, -1119385054, -1109190398); + sum2 = W(0, -1098032416, 1055692800, -1101668743, -1100435053) + + W(1, -1089098280, -1094416925, -1099202751, -1104551065) + + W(2, 1063396296, 1024719031, 1065491656, 1073645059) + + W(3, 1060161647, -1074198531, -1081296593, -1083400329) + + W(4, 1043414797, 1032661901, 1058961916, 1063424749) + + W(5, -1096580753, -1098776178, -1115458644, -1092624053) + + W(6, -1093635160, 1049215120, -1090478816, 1050905898) + + W(7, -1135528507, 1042380471, 1032695397, 1054277265); + WS(-1082679118, -1072338335); + sum1 = W(0, -1126832308, 998650886, 1029713605, 1045660229) + + W(1, -1125245511, 1001090478, -1126242526, -1128346278) + + W(2, -1092407662, -1099976035, -1098757312, 1049242330) + + W(3, 1052609817, 1049104969, 958956607, -1170516592) + W(4, 1041636256, 1035459839, 1053507448, -1097348797) + + W(5, -1097111418, -1099322690, -1116731426, 1009511091) + + W(6, 1032452512, -1118647007, -1113994637, 1019901759) + + W(7, 1026546307, 1041545965, -1113342195, 1027607012); + sum2 = W(0, -1069228184, -1073602631, 1021776922, 1076866983) + + W(1, 1069809281, -1101499289, 1013617559, 1036050969) + W(2, -1099529380, 1043301860, 1054858487, 1044685536) + + W(3, 1062109344, -1097491140, -1149319294, -1113127688) + + W(4, -1112044089, 1041147606, -1119872164, -1106846135) + + W(5, 1042271976, 1035368326, 1025827813, -1115137330) + + W(6, -1144476451, -1112019052, 1036271953, 1018899191) + + W(7, -1114284680, -1126672913, -1112053703, -1146921887); + WS(-1125906880, 1029353026); + sum1 = W(0, 1052620124, 1040928385, 1053619569, 1034478636) + W(1, -1149501032, 1027228408, 1033816441, -1143379631) + + W(2, -1082830235, -1087911853, -1088553290, -1115166792) + + W(3, -1104403058, 1046902211, -1140598044, -1115398454) + + W(4, 1044570800, 1048894344, 1054767249, 1052323270) + + W(5, -1096342700, -1092690897, -1112660402, -1089842615) + + W(6, 1033131793, 1031982257, -1118254573, 1037418321) + W(7, 1045103465, 1053685367, 1032758420, 1056771243); + sum2 = W(0, 1052242091, -1105901664, 1041713460, -1098081544) + + W(1, -1101414896, -1140318759, -1123485994, -1108472633) + + W(2, -1123374674, 1032004261, 1057464262, 1055897675) + + W(3, -1108453649, -1099401944, 1039811869, -1092934450) + + W(4, -1088438592, -1109896025, -1106721416, 1057898227) + + W(5, 1044097375, 1041656473, 1042751001, 1033994653) + + W(6, -1109756837, -1117902306, -1106560728, -1101499608) + + W(7, -1114554169, 1042131382, -1104786072, 1048148308); + WS(-1080878567, 1068324028); + sum1 = W(0, -1115471279, 1019310859, -1121098697, -1115193805) + + W(1, -1153442440, -1104713039, 1023975060, -1094675607) + + W(2, -1095139206, -1103458412, -1090917913, -1094785898) + + W(3, -1100131090, -1118370765, -1102569730, 1044057356) + + W(4, 1057833304, 1049561152, 1058273109, 1054221326) + W(5, 1050583410, 1048985266, 1041261354, 1045920684) + + W(6, 1032811018, -1118469827, -1107876783, -1109399058) + + W(7, -1121957752, -1109945243, -1125987028, -1144681671); + sum2 = W(0, -1122597644, 1032420914, -1109997244, 1029919127) + + W(1, -1129031901, 1025876905, -1121404056, 1025649559) + + W(2, 1052263517, -1132353885, -1113437764, -1086124512) + + W(3, -1134522929, -1137529969, 1041285329, -1111439550) + + W(4, 1084267296, 1077171750, -1076080701, -1066836895) + + W(5, -1073829589, -1128728545, -1128683125, -1109934248) + + W(6, 1037076324, 1017945885, 1045994672, -1105598049) + + W(7, -1115453382, 1027437378, -1112127416, 1032857588); + WS(-1106960696, -1099012034); + sum1 = W(0, -1114528403, -1119077260, -1143558020, -1119877760) + + W(1, -1109244232, -1096650748, -1112604445, -1100402892) + + W(2, -1099071342, -1099370430, -1089278443, -1086538844) + + W(3, 1010994112, 1041376829, 1042854492, 1049345155) + W(4, 1055554285, 1049964157, 1061104081, 1056629915) + + W(5, 1049997315, 1042073805, 1031563405, -1123516568) + + W(6, -1109121109, -1115766890, -1114965299, -1120868875) + + W(7, 1034547527, -1114495407, -1139584324, -1118254096); + sum2 = + W(0, -1116593925, 1028908115, 999050165, 1037914955) + W(1, -1106109711, -1105957739, -1123834115, -1113783754) + + W(2, 1027806287, -1136470458, 1039840949, -1122048333) + + W(3, 1057135276, -1105275062, -1096566133, -1105721601) + W(4, 1032648371, 1006654490, 1052059722, 1057985079) + + W(5, -1090440242, -1131926605, 1018741845, -1124260101) + + W(6, 1024756439, -1116529299, -1107372324, -1128153177) + + W(7, -1142966917, -1123338691, 1013415162, 1018182189); + WS(-1103089976, 1059868827); + sum1 = W(0, 1026631887, 1033737723, 1034000797, -1130496915) + + W(1, -1106694966, -1105866475, -1106727101, -1098705919) + + W(2, -1091300264, -1096562704, -1087537316, -1094386976) + + W(3, 1044429902, 1045093007, 1040636078, 1044615672) + W(4, 1056895190, 1050565142, 1059766350, 1053939124) + + W(5, -1108577640, -1109922270, -1122075862, -1100982776) + + W(6, 1031003956, -1140469197, -1108911023, 1032926090) + + W(7, -1120892680, 1034482579, -1136817768, 1045052014); + sum2 = + W(0, -1114832682, 1038307608, -1109268272, 1031259614) + W(1, -1136199018, -1118450441, 1025376385, -1125957173) + + W(2, 1044376552, -1101986459, 1025272345, -1112738770) + W(3, 1014008179, 1042085570, -1110075404, 1027010884) + + W(4, 1052671036, -1094811671, -1106762472, 1052706603) + W(5, 1040752903, -1100877636, 1051973899, 1036345951) + + W(6, -1084839384, -1076225566, -1074779618, -1088390497) + + W(7, 1066038403, 1071357616, 1068318141, 1050587817); + WS(-1089897038, 998399462); + sum1 = W(0, -1100326508, -1099771006, -1103969415, 1030998252) + + W(1, -1111096702, -1129527451, -1115021151, -1124899748) + + W(2, -1114312802, -1109889234, -1092992143, -1098209637) + + W(3, -1116385180, -1096464604, -1111889198, -1109224641) + + W(4, 1049930251, 1047140918, 1060325312, 1062808044) + W(5, -1128865717, 1048691588, -1137813989, 1043572929) + + W(6, -1141222070, -1114407115, -1106384368, 1017922927) + + W(7, 1023432554, -1125954964, -1121716413, 1020452535); + sum2 = W(0, -1094975511, -1089233591, -1089977002, 1033778332) + + W(1, 1006981461, -1137053176, -1125132764, 979684320) + W(2, -1113696880, 1032844980, 1066397244, 1037917830) + + W(3, 1039504138, 1032622380, 1021506052, -1119563165) + + W(4, 1023473326, 1036803698, -1129026618, -1104280508) + + W(5, 1024702770, -1121975322, 974010432, -1138205260) + W(6, 1029862812, -1117299445, 1025970568, 1031377784) + + W(7, -1122944997, 1022461928, -1130740686, 1024270227); + WS(-1096120220, -1099720911); + sum1 = W(0, 1052677544, 1027883172, 1046184634, 1036941212) + W(1, 1037786724, 1039372749, 992842790, 1040590154) + + W(2, -1105594052, 1050583742, 1030711656, 1050761182) + W(3, 1044997418, 1051859318, 1041579690, 1052858474) + + W(4, -1101878153, -1120505890, -1094174707, -1087347673) + + W(5, -1091299260, -1092171165, -1105854769, -1087724293) + + W(6, 990296621, 1026529890, 1039246623, 1031039363) + W(7, 1038193547, 1036921611, -1115076484, 1007468831); + sum2 = + W(0, 1040381409, -1131846701, 1030695069, 1015259161) + W(1, 1026868853, -1164136976, -1121164685, -1109936403) + + W(2, 1023777345, -1095435966, -1111411494, -1085163747) + + W(3, -1100600319, 1052695808, 1041440525, 1051545155) + + W(4, -1110031849, -1146822820, -1089001391, -1074171332) + + W(5, -1078760233, 1048168469, 1074132102, 1072577306) + W(6, 1022623295, -1096899181, 1049343346, -1107180310) + + W(7, 1043071461, 1020495459, 1017314953, 1050115198); + WS(-1080112807, -1111145054); + sum1 = W(0, -1103297132, -1106341774, -1098278655, 1024154699) + + W(1, 1037514093, 1034961350, -1125780682, -1109009483) + W(2, 1049824404, 1049617192, 1059552348, 1031972225) + + W(3, -1085661228, -1097823136, -1114326813, -1119831648) + + W(4, -1133975251, -1122989109, -1086286580, -1137351813) + + W(5, 1056970252, 992708574, 1021582000, 1040424089) + W(6, 1026400021, 1042898005, 1041608840, -1145221295) + + W(7, -1102084285, 1041904442, 1038246926, 1042525799); + sum2 = W(0, 1041258750, -1109734283, -1123542769, -1113561957) + + W(1, -1110564237, 1026811493, -1130694514, 1024057869) + + W(2, 989910477, -1100922013, -1096844113, 1051742866) + + W(3, -1100235579, -1105813951, -1151284621, -1136706867) + + W(4, -1134607603, 1016064722, 1041392492, 1057819912) + + W(5, 1047439582, -1113868277, -1118083589, -1114600003) + + W(6, -1109794979, 1041809078, -1126381362, 982123162) + + W(7, -1119465765, 1026735929, 1019553626, -1114678252); + WS(1043409720, -1105036943); + sum1 = W(0, 1040191749, 1033970558, 1042494496, 1046767380) + W(1, 972615552, 1032778168, 1032217109, 1032356247) + + W(2, -1096303173, -1095924673, -1093807736, -1092831585) + + W(3, -1096756208, -1126846855, -1115229280, -1098580285) + + W(4, -1115184605, 1041748910, 1044442592, 1042876074) + W(5, -1140612185, 1018241414, 1027878365, 1034858676) + + W(6, 1041655059, 1041917006, -1160531625, 1039311757) + W(7, 1020654492, 1043700571, 1034107952, 1036396440); + sum2 = W(0, 1027808259, 1010119787, -1111510504, -1113418759) + + W(1, 1032132185, -1121052855, 1014515195, 1010692603) + + W(2, -1139047739, 1043340308, -1106790738, -1096910874) + + W(3, 1040059331, -1115460243, 1017581734, -1120741339) + W(4, 986751832, 1026247831, 1065364148, 1040723354) + + W(5, 1038861011, -1113647147, 1041604470, -1135975307) + + W(6, -1095774205, -1093511024, -1089533357, 1053173071) + + W(7, -1106558855, 1027584935, -1121443175, 1014681515); + WS(1035857520, 1029952289); + sum1 = W(0, -1143077795, -1105351783, -1113811952, -1106526780) + + W(1, 1035289215, 999420801, -1129002434, -1113970285) + W(2, 1037051011, 1029971495, 1049064844, 1035603988) + + W(3, -1083894414, -1098557596, -1111645039, -1130790920) + + W(4, -1110400621, -1106469910, -1094483622, 1058276716) + + W(5, 1056346487, 1050633420, 1042325343, 1026109447) + W(6, -1121149466, 1043652126, 1027875988, 1035104701) + + W(7, -1114346217, -1123554317, -1130799743, 1025377311); + sum2 = W(0, -1118517607, -1101077931, 1029148161, -1087996420) + + W(1, 1047526016, -1108756119, 1038718292, 1024464693) + W(2, 1026484093, 1046485772, -1098019518, 1071267691) + + W(3, -1082674625, 1032470282, -1106613565, -1113199029) + + W(4, 1039465846, 1030900361, 1048118782, 1064954318) + + W(5, -1084489705, -1118487613, -1112021711, -1120012731) + + W(6, 1008581907, -1114630284, -1106945018, -1097625455) + + W(7, -1156379726, 1024110641, 1020048570, 1036291722); + WS(1058189134, 1034857672); + sum1 = + W(0, -1171748679, -1105475825, -1097172873, -1108837708) + + W(1, 1038034707, -1131134898, -1113151849, -1119273967) + W(2, 1031241360, 1044072484, 1057114388, 1051374554) + + W(3, -1083662360, -1099379283, -1121036423, 1018101850) + + W(4, -1100969760, -1094075536, -1082247827, 1060030327) + W(5, 1058651386, 1046921459, 1041721673, 1036514264) + + W(6, 987174985, 1045893176, 1042860595, 1031954257) + W(7, -1120638978, -1137288661, 1037681908, 1029972391); + sum2 = W(0, 1003810984, 1036204547, -1101998989, 1041029203) + + W(1, -1098215637, 1044393168, -1110527635, 1027560485) + + W(2, 1020569783, -1114489126, -1121260135, 1052640914) + + W(3, 1059150102, -1098121773, 1037147118, -1110248773) + + W(4, -1128982694, -1099380876, -1101918458, 1059611184) + + W(5, 1040381797, -1094102036, 1028175839, -1113935142) + + W(6, 1043745048, -1104004872, -1104165612, -1121067579) + + W(7, -1100369008, 1032515174, -1114899975, 1000033398); + WS(-1107450480, 1040804833); + sum1 = W(0, 1040192716, 1022226221, 1002013395, -1117682794) + W(1, 1001040843, 1000424795, -1120982404, 1025306833) + + W(2, 1040473489, 1047969017, 1044185574, 1060667554) + W(3, 1057909434, 1049088596, 1038016429, 1042416864) + + W(4, -1095196747, -1098407451, -1087290490, -1089168888) + + W(5, -1111951852, -1119291421, 1031577591, -1112956481) + + W(6, -1124855402, 1020416041, -1160070647, 1045737613) + + W(7, -1101676720, -1103624738, -1104451167, -1115902938); + sum2 = + W(0, 1014727333, -1117243126, 1029406572, 1027900147) + W(1, -1112527674, -1114664521, -1111634336, -1107116047) + + W(2, -1124633329, -1107065949, 1041729284, -1094200388) + + W(3, -1104959017, 1040214496, 1005029260, 1049039902) + W(4, 1026257754, -1111801245, -1084100906, 1052541581) + + W(5, 1070744988, -1111707080, -1127513012, -1107038609) + + W(6, -1111611661, -1136702760, -1103677442, 1050798725) + + W(7, -1105828213, -1111536822, -1106506739, -1140667375); + WS(-1113867888, 1064515135); + sum1 = W(0, -1113562537, -1107046062, -1103978495, -1098739202) + + W(1, -1122423580, 1019693149, -1116789880, 1020558520) + W(2, 1048061265, 1043460993, 1060048584, 1062873548) + + W(3, -1119786749, 1023528257, -1106657727, -1137576074) + + W(4, 1011269086, -1098944190, -1107431310, 1045822761) + + W(5, 1025265092, -1112998912, -1142662356, -1104660585) + + W(6, -1105945126, -1148623547, -1111558073, -1114838028) + + W(7, -1101841139, -1117915947, -1106868487, -1122252061); + sum2 = + W(0, -1145158406, 1012385731, 1016118130, 1024197601) + W(1, -1112179804, -1119519161, -1127326042, -1113792718) + + W(2, 1022878354, -1129472106, 1044961455, 1049544336) + + W(3, 1030346877, -1131221354, -1095482557, -1093377057) + + W(4, -1111624996, 1015658802, 1040055751, 1057430996) + W(5, -1114498280, 1020564842, -1112131584, 1019749938) + + W(6, 1010204019, -1123973089, -1157676569, 1022031298) + + W(7, -1124728962, 1023003938, -1121117277, -1141925830); + WS(1051333020, -1087054195); + sum1 = W(0, -1112042433, 1019002067, -1115058903, 1046618143) + + W(1, -1107874438, -1148774132, 1036768028, -1154881470) + + W(2, -1104387605, -1096771599, -1102529947, -1093976551) + + W(3, -1089735051, -1129150690, -1101876091, -1098135714) + + W(4, 1052246829, 1048899277, 1054136106, 1044227957) + W(5, 1060328029, 1046377228, 1045160291, 1045432325) + + W(6, -1113527444, -1098301717, -1095193948, 1044013586) + + W(7, -1107288943, 1038700845, 1024370318, 1019966234); + sum2 = W(0, -1114066012, 1029900262, -1114806697, -1110038644) + + W(1, 1036646832, -1110070018, 1020625547, 987867800) + W(2, 1041392892, -1112610934, 1041587346, 1025557898) + + W(3, 1055783298, -1102485451, 988088600, 1039502616) + W(4, 1044719218, 1046575198, 1050162797, 1055420600) + + W(5, -1099287148, -1100701871, 1033323822, -1119304428) + + W(6, -1097547793, -1095644935, -1102972970, -1095936036) + + W(7, 1028020818, -1113902766, -1135974783, 1018696751); + WS(-1120103648, -1090070191); + sum1 = + W(0, -1117418940, 1024592611, 1040968250, 1049918615) + W(1, 1034410595, 1035134604, -1119948353, -1144523437) + + W(2, 1049030490, 1050801054, -1111205267, -1116228463) + W(3, 1050512309, -1102511675, 1034763283, 1039656998) + + W(4, -1112262737, -1094705236, 1042055990, -1085341341) + + W(5, -1106227665, 1036298997, -1138448657, -1110564136) + + W(6, -1114427969, 1032013281, -1110419822, 1047944497) + + W(7, -1132367051, 1025392341, -1111046724, -1120201127); + sum2 = W(0, -1122606938, -1141997982, 1027805544, -1120462650) + + W(1, -1100560083, -1105726471, 1025575588, -1113668318) + + W(2, 1046354401, 1040228902, -1143835982, 1061896257) + + W(3, -1080731069, -1098049024, 1026943708, 1032253740) + + W(4, -1124762815, -1102583710, 1052785838, 1059397472) + + W(5, -1120768779, -1126645315, 1011421951, -1122685018) + + W(6, -1118515993, 1036845124, -1106443071, 1043676745) + + W(7, 995709275, -1128858827, -1112152255, -1127110207); + WS(1060158670, 1068766623); + sum1 = + W(0, -1116432453, -1131098839, -1099753724, 1034945056) + W(1, -1122123599, 1040823512, 1040184285, 1050332416) + + W(2, 1056712636, 1049784895, 1057908127, 1044163070) + W(3, 1028198895, -1122504371, -1123329903, -1096645803) + + W(4, -1087151539, -1102593034, -1089291740, -1094800699) + + W(5, 1036808107, -1120242995, -1127465369, -1132187055) + W(6, 1040295867, 1033948341, 1031077093, 1027113355) + + W(7, -1132674679, -1117547229, 1040274980, -1137741501); + sum2 = W(0, 1036379663, -1108907739, 1070189048, 1073213180) + + W(1, 1065321765, -1076673488, -1079893128, -1072585926) + + W(2, -1098232449, 1058983203, 1016986873, 1047923452) + W(3, 1033582270, 1031365639, 1038048757, -1107019906) + + W(4, -1128107780, 1035811659, 1040144345, -1105399966) + + W(5, -1110681209, 1039880527, -1116001167, 1018297481) + + W(6, -1120677803, -1120240179, 1029686139, -1109097268) + + W(7, 1041308319, -1109042515, 1034493417, -1131123922); + WS(-1112459888, 1031046963); + sum1 = W(0, -1112719265, -1129483154, -1103727283, -1091575740) + + W(1, -1104335643, -1155155940, -1114094348, -1105426861) + + W(2, -1128634346, -1120462421, -1112785958, 1056781779) + + W(3, -1153409228, -1108013960, -1118230989, 1027667442) + + W(4, 1043326546, -1103778738, 1050524372, 1067939282) + + W(5, 1048587330, -1132710977, -1109505653, 1036777787) + + W(6, -1115081924, -1114915140, -1104237825, -1096588493) + + W(7, -1108534894, -1114726045, 991235804, -1111746006); + sum2 = W(0, -1119086167, 1013020612, -1141008560, -1108719150) + + W(1, 1023891147, -1145112744, 1018251990, -1116478859) + + W(2, 1037241732, -1129818230, 1029187991, -1074141953) + + W(3, 1019083994, -1124211508, -1122886966, 1027168441) + + W(4, -1114652243, 1028260797, -1112264831, 1072760747) + + W(5, 1042535682, -1131878972, 1037493286, -1129254230) + + W(6, -1131518324, -1115730540, 1036245214, 1034705438) + + W(7, -1119172530, -1133917220, -1114007324, 1018465006); + WS(-1086783566, -1086791567); + sum1 = W(0, -1115195632, -1153026662, -1134496297, -1108787789) + + W(1, -1119803561, -1145121243, -1131708777, -1110064394) + + W(2, -1095708330, -1093442522, -1098161001, 1044632085) + + W(3, -1091375169, -1107384199, -1100078210, -1104664012) + + W(4, -1123676804, 1018199561, 1037878573, 1064261167) + W(5, 1057417647, 1052226946, 1046948682, 1047330733) + + W(6, 1041725033, -1121101892, 1034570216, -1103584185) + + W(7, -1108866704, -1122033784, -1117964907, 1022321300); + sum2 = W(0, 1031515378, -1121810184, 1010081392, -1119765868) + + W(1, 1035546479, -1106495935, 1028378344, 1003402623) + + W(2, -1077397139, -1079753374, 1044674665, 1073378801) + + W(3, 1056367001, -1109376902, 1035615024, -1118889676) + + W(4, -1134939312, -1097085111, 1052841311, 1007836336) + W(5, 1044809025, -1118570548, 992033726, 1010750288) + + W(6, -1112896962, 1035985281, -1105060263, 1031953140) + + W(7, 1022446080, 1031289566, 1032016077, -1150317246); + WS(-1096711324, -1080143969); + sum1 = W(0, -1135181951, 1025399430, 1033906501, 1041786535) + + W(1, -1133559462, 1003671004, -1123695637, -1105366874) + + W(2, -1095339398, -1094144146, -1093853897, -1089314149) + + W(3, -1089126233, -1110956839, -1129083412, -1113909272) + + W(4, 1050582337, 1049483953, 1045129706, 1046728732) + W(5, 1045641984, 1051092970, 1049638101, 1057307443) + + W(6, 1026786373, -1123204644, 1006467326, 1031608549) + W(7, -1135165794, 1017185520, 996324016, 1009923752); + sum2 = W(0, 1023911567, 1004932796, -1119124867, 1022775023) + W(1, 1011639102, 1036397588, 999444348, -1106309084) + + W(2, -1108118447, -1134375038, 1035251904, 1037995724) + + W(3, 1050162042, 1037707684, -1111062570, -1101285996) + + W(4, 1044892126, -1138359022, 1063133445, 1074655410) + + W(5, 1070062472, -1083132698, -1073510095, -1073687480) + + W(6, -1112738860, 1020475455, -1102926770, 1047698054) + + W(7, -1113839430, -1117927031, 1017195567, 1041743674); + WS(-1089880270, 1068594400); + sum1 = + W(0, -1114467040, 1023170830, 1036273894, -1107800974) + W(1, 1029867434, -1106779367, 1024593089, -1110449433) + + W(2, -1104513741, -1091458130, 1034367029, -1100997781) + + W(3, -1095286649, 1047811540, -1096228817, -1109179032) + W(4, 1050219169, 1042545281, 1048674674, 1042739212) + + W(5, 1053624831, 1034908007, 1034674708, 1049808694) + W(6, -1118490053, -1120682309, 1031296832, -1110241363) + + W(7, 1034289100, -1107012174, 1021221591, -1126204757); + sum2 = + W(0, 1030004067, -1117028113, -1105887481, -1066126465) + + W(1, -1104777348, -1122550707, -1130918117, 1023720579) + + W(2, -1133064657, -1134091777, 1045929484, 1081917443) + W(3, 1043726141, 1028310407, 1016764395, -1116064873) + + W(4, 1024174065, -1113615539, 1032698350, -1097201480) + W(5, 1033613382, -1107697461, 1029778305, 1018371831) + + W(6, -1119836251, 1025775761, -1118489229, 1041573100) + + W(7, -1124268877, 1030764051, -1116797441, 1018350967); + WS(1067475431, -1126058166); + sum1 = + W(0, -1108052732, 1043040440, 1048922396, -1097574342) + W(1, -1119673025, -1101774749, 1019400344, 1007801026) + + W(2, -1097851361, -1108210069, -1084429932, 1055911149) + + W(3, 1041902328, 1035827603, -1115594513, -1107003538) + W(4, 1049362324, 1048929252, 1054104112, 1047147106) + + W(5, -1085779789, 1049622021, 1019477630, 1037086373) + W(6, 1040199303, -1109622414, 1041203782, -1104274751) + + W(7, 1047880876, -1116198608, -1107876353, 1036701569); + sum2 = + W(0, 1013753738, -1113150555, 1015248850, 1042650722) + W(1, 1040818978, -1105652199, 1033430289, -1120377801) + + W(2, 1020731454, 1046742995, 1045156685, -1104352239) + W(3, -1089864705, 1045331461, -1109224259, 1016214593) + + W(4, -1120697178, 1034035253, -1094710566, -1128318417) + + W(5, 1045040370, 1025091411, -1106535436, 1019751894) + W(6, 1009873360, -1099358283, 1039470065, 1046693145) + + W(7, 1036008061, 1030627793, 1017876415, -1132110931); + WS(1060496974, -1099362699); + sum1 = W(0, 1054706808, 1036662868, 1045895019, 1033303646) + W(1, 1044095763, -1130190200, 1035564779, 1040746168) + + W(2, -1109706041, 1041317773, 1051554925, 1049334366) + W(3, 1051166813, 1053590462, 1049285205, 1055551482) + + W(4, -1098091909, -1123237413, -1091928498, -1083798889) + + W(5, -1095315343, -1087007295, -1097088265, -1094550458) + + W(6, -1129324363, 1015757258, 1021341985, -1112852963) + + W(7, 1041804248, -1127492145, 1039262630, -1114905285); + sum2 = W(0, -1073385920, -1084887580, -1083140914, -1081800202) + + W(1, -1085954594, 1037413129, -1096433065, 1054210787) + W(2, 1077926840, 1058818874, 1060159151, 1074845707) + + W(3, 1061906872, -1084431515, -1126824848, -1087315344) + + W(4, 1032559783, -1089669880, 1045764296, 1059775011) + + W(5, -1103860568, -1094536545, -1133232881, -1099186518) + + W(6, -1094451238, -1121878040, -1173171215, -1120435570) + + W(7, -1115590029, 1053315192, -1107838893, 1052978812); + WS(-1078369703, 1041267413); + sum1 = W(0, 1024386586, -1098405416, 1044040033, -1098286219) + + W(1, -1130684104, 1045750173, -1098338270, 1041584973) + + W(2, 1041630887, -1112635974, -1132435208, 1041292515) + + W(3, -1091497929, 1016159377, -1139597330, -1101611546) + + W(4, -1102607056, 1051293608, -1094040968, 1052507157) + + W(5, 1056853585, -1105775474, 1049412460, 1026100205) + W(6, 1016693023, 1018393854, 1046099151, -1095618428) + + W(7, 1018959206, -1117949682, -1118540325, 1040982949); + sum2 = W(0, 1035615459, 1028814353, 1062855981, 1052250964) + W(1, 1056109526, -1106019250, 1048995011, -1115640692) + + W(2, -1097925659, 1038714809, -1077657685, -1101970047) + + W(3, -1098468896, -1114182260, -1104046747, -1130122971) + + W(4, 1043665288, 1033337220, 1051048913, -1113114333) + + W(5, -1085664062, 1040975429, -1109605260, 1034778788) + + W(6, 1020457849, -1103657321, -1109823715, 1058024935) + + W(7, 1056999181, -1105846491, 1042595027, -1112374505); + WS(1049151900, -1114127847); + sum1 = W(0, 1050216581, 1000015204, -1136218178, 1023136961) + + W(1, -1130455775, -1133465094, -1160090192, 1035991733) + + W(2, 1044969414, 1047621718, 1057314961, 1055877843) + W(3, 1054358666, 1052966059, 1045850836, 1052491071) + + W(4, -1106856243, -1112471205, -1091938023, -1092033343) + + W(5, -1099719178, -1089783713, -1099053307, -1087984664) + + W(6, -1099359923, -1148711507, -1133921207, -1112054390) + + W(7, 1034273823, -1122838974, 1019980258, -1112322824); + sum2 = + W(0, -1105478410, 1039552519, -1131405058, -1099466970) + W(1, 1049027924, -1115050596, -1129231446, 1049583286) + + W(2, 1011113448, 1050864081, -1125310098, 1043215106) + W(3, 1034334973, -1095883745, 1036178144, -1088635155) + + W(4, 1068049752, -1103020148, 1066695202, 1074596924) + + W(5, 1067601936, -1084539788, -1075514015, -1074115054) + + W(6, -1082501551, 1059003564, -1098156272, 1039344435) + + W(7, -1099880092, -1107282542, -1097076855, 1042018058); + WS(-1081332839, -1093454830); + sum1 = W(0, -1109709318, -1104916884, -1108177419, -1117212646) + + W(1, -1119705461, 1032417267, -1118748528, 987327371) + W(2, 1035356975, 1037116623, -1125155242, 1030327966) + + W(3, 1050241163, -1103907222, 1046095669, 1033262333) + + W(4, 1039420520, -1122158672, 1053028347, -1104761999) + + W(5, 1032136206, -1115200780, -1115609017, 1029855614) + + W(6, -1111308088, 1014687039, -1112931654, 1020526050) + + W(7, -1119448076, -1112611266, -1136487898, -1104533373); + sum2 = + W(0, 1013207527, -1127355075, -1103159789, 1040955478) + W(1, 1008876024, -1116686760, 1035764738, -1154118338) + + W(2, -1118344664, 1028266047, 1043690369, 1051132935) + + W(3, -1108842627, 1041402295, -1105537330, -1128237045) + + W(4, -1124997045, -1117884424, -1116887196, 1047094008) + + W(5, 1057384051, -1100609336, -1098518151, -1089828796) + W(6, 1036829905, 1016171285, 1024917624, 1041601336) + + W(7, -1127506713, 1033786361, -1114313206, -1102385561); + WS(1063446990, 1030048893); + sum1 = W(0, -1131562670, -1099483503, -1106193120, -1102405700) + + W(1, 1021119810, -1113568905, 1009340592, 1030255032) + W(2, 1043069042, 1049571969, 1061428532, 1053095529) + + W(3, -1115069793, -1119868742, 1027160065, 1043118346) + + W(4, -1108681470, -1106599551, -1097709592, 1046689338) + + W(5, 1029025472, 1006738196, -1120287391, -1111789333) + + W(6, -1108650254, -1106453175, 1008661917, -1102088711) + + W(7, -1123233168, -1104754348, -1136963210, -1114502129); + sum2 = + W(0, 1012371361, -1149491589, 1023756477, -1165255819) + W(1, -1111467932, 1019335917, -1140694601, 1010513313) + + W(2, 1017109065, -1115161102, 1012418345, -1111308586) + W(3, 1015942947, -1106016138, 1015823021, 1026481588) + + W(4, -1110016822, -1109821790, 1060485172, 1031379047) + + W(5, 1046805034, -1114576028, 1024897044, -1114618076) + + W(6, -1103671135, -1097972516, -1094449842, 1049769129) + + W(7, 999148403, 1022790203, 1032463998, -1146831635); + WS(1060385486, 1040268319); + sum1 = W(0, -1115333181, -1113839600, 1026945989, 1041834949) + + W(1, -1100015113, 1010458454, -1113704543, -1110169699) + + W(2, -1105770459, -1104706211, -1085502934, -1112644646) + + W(3, -1102865873, -1112283012, -1108020290, -1115522389) + + W(4, 1048230464, -1122113023, 1051932092, 1065603891) + + W(5, -1105250533, 1054415097, -1122402466, 1046973419) + W(6, 1022495614, -1115044751, 997701279, 1044329112) + + W(7, 1038196649, -1113673817, -1105082025, -1115640050); + sum2 = W(0, -1115664423, -1122287706, 1044568139, -1099350461) + + W(1, -1102715015, 1042022920, 1031291077, 1032474264) + W(2, 1041813775, 1041645390, -1087138046, 1067461852) + + W(3, -1116572542, -1109622665, -1113357449, -1110133469) + + W(4, -1142717933, -1094011677, -1124627987, 1027339570) + + W(5, 1045144111, 1054026149, -1122353792, 1047364150) + + W(6, -1120925434, -1119842210, -1120985148, -1113918825) + + W(7, -1100833175, -1101147879, -1112018489, -1109170005); + WS(1049043868, 1050086952); + sum1 = + W(0, -1127858130, 1025810768, 1034666762, 989092984) + W(1, -1115481017, -1119959429, 1012364567, -1097661520) + + W(2, -1091279607, -1101354119, -1089232423, -1092016019) + + W(3, -1089729669, -1104525366, -1121438163, -1160888088) + + W(4, 1054362490, 1044465651, 1050465752, 1058690160) + W(5, 1053482909, 1051092259, 1019953121, 1051219071) + + W(6, 1028884238, 1022883995, 1032068165, 1005443958) + W(7, 1007092039, -1149438996, -1137072337, 1017307814); + sum2 = W(0, 1030282550, 1012065197, 1049708534, -1101566471) + W(1, 1043525707, 1038111746, 1040589253, -1106531005) + + W(2, -1099759289, 1050936278, 1018991152, 1050588571) + + W(3, -1112383125, -1121285468, 1039884984, -1113841779) + + W(4, 1070065566, 1068820850, 1068572253, 1075164582) + W(5, 1046261639, 1053555382, 1040055978, 1058828770) + + W(6, -1078832473, -1076346523, -1075628240, -1072955990) + + W(7, -1093459475, -1088795804, -1099780818, -1090423367); + WS(-1083655502, 1074535575); + sum1 = + W(0, 973651072, 1028862937, 1029517469, -1111330742) + W(1, 1043404639, -1105397947, -1129726574, -1099887737) + + W(2, -1100106921, -1096173461, -1088250868, -1101351113) + + W(3, -1092528244, 1034877328, -1113904430, -1118418050) + W(4, 1049212555, 1052529147, 1057957824, 1060855844) + + W(5, 1050267538, -1104065896, 1041335934, 1047916353) + W(6, -1122472503, 996549482, -1111380529, -1125410415) + + W(7, -1109626381, -1122247818, -1108333759, 1037233742); + sum2 = W(0, 1037582341, 1032149251, -1135487115, -1107247151) + + W(1, 1053968825, -1096732175, 1034930229, -1094249638) + + W(2, -1116649305, -1112916551, 1044443302, -1117703407) + + W(3, 1049963138, 1042101117, 1046616621, -1127010106) + W(4, -1107051108, 1041643977, 1030763641, 1053360182) + + W(5, -1087331905, -1089009482, -1110671517, 1059951262) + + W(6, 1040538112, -1112067691, 1036263743, -1115814520) + + W(7, 1035849297, -1104153316, -1104877620, -1116847106); + WS(-1132786560, 1056578758); + sum1 = W(0, 1031072232, 1019453021, -1112153353, -1127115205) + + W(1, -1153314582, -1105591705, 986346381, 1024604121) + W(2, 1043718831, 1050053971, 1057505465, 1049535379) + + W(3, 1052394474, 1045418390, 1044283028, 1048806335) + + W(4, -1098888378, -1104586611, -1090760605, -1081773448) + + W(5, -1106021324, -1120283669, 1036365944, -1103287167) + + W(6, -1123786893, 1030360908, -1123598824, 1035671447) + + W(7, 1044649456, -1105554848, 1033186457, -1108912601); + sum2 = + W(0, 1040658557, -1106354313, 1027144364, -1103628435) + W(1, -1123462592, -1130705048, -1126068784, 1016031184) + + W(2, 1011638864, 1020064744, 1049840877, 1050147177) + + W(3, -1117174472, -1105120318, -1113970774, -1135769248) + + W(4, 1041865287, -1103147627, 1026998340, 1053587315) + W(5, -1118058864, 1036775410, -1104140895, 1030416564) + + W(6, -1109113498, 1033931950, -1120927100, -1102211113) + + W(7, 1033328738, -1101351534, 1028877580, -1112076066); + WS(1062711758, -1109562142); + sum1 = W(0, -1107075140, -1125545776, -1121788380, -1112684886) + + W(1, -1128625782, -1102890883, -1129119788, -1102110160) + + W(2, -1100622401, -1104747337, -1103229831, -1083301774) + + W(3, 1050510715, -1097610180, -1109077454, 1030737729) + W(4, 1053288051, 1049612355, 1059638178, 1048337697) + + W(5, 1052952654, 1051307580, 1041285742, 1049115768) + W(6, 1017596397, 1007433175, -1120034657, -1098025711) + + W(7, -1112854653, -1108240645, 1022176121, 1020667959); + sum2 = + W(0, 1022257834, 1033804876, 1033963400, -1113268759) + W(1, -1123922685, 1029999681, 1015463858, -1125618402) + + W(2, 977550902, -1105772859, -1098748483, 1063293804) + W(3, -1090033704, 1051039483, -1104977553, 1022914778) + + W(4, -1113927342, 1042844173, -1096777339, 1059312088) + W(5, -1134320563, 1037687330, 1024487701, 1004875175) + + W(6, 1036504102, -1107093105, 1028160469, -1089861840) + + W(7, -1101525036, 1017532722, -1122996995, -1116068477); + WS(1046002488, -1083997249); + sum1 = W(0, -1116203964, 1044431961, 1041235242, 1046371486) + + W(1, -1106267745, -1117705943, -1122870401, -1109240562) + + W(2, -1099156844, 1028498222, -1096363997, -1079124621) + + W(3, -1088685662, -1103556299, 999993136, -1106798659) + W(4, 1050076828, 1049400252, 1050263757, 1020370202) + + W(5, 1048790666, 1053355933, 1034829570, 1037276039) + W(6, 1025075217, 1035032656, 1032516798, 1050189128) + + W(7, 1042510329, 1039724554, 1027729159, 1037249299); + sum2 = W(0, -1094982381, 1024745423, -1097113645, 1017043870) + + W(1, 1052555320, -1107563793, 1049262968, -1118735987) + + W(2, 1041875660, -1091311273, 1042706326, -1148119319) + + W(3, -1098101314, 1010824956, -1094774489, 1030619863) + W(4, 1017839086, 1044409386, 974632891, 1061393923) + + W(5, 1043955676, -1098402228, 1042935118, -1094515595) + + W(6, 1045890174, -1107764806, 1048260200, -1118443235) + + W(7, -1097368628, 1041238578, -1116185663, 1042214090); + WS(-1083255246, -1075588436); + sum1 = W(0, -1154522904, -1106371438, -1105464695, 1036086422) + + W(1, 1023783355, -1127243930, 1030176790, 1031412139) + W(2, 1026375684, 1036249778, 1056687627, -1097055709) + + W(3, -1088556578, -1108055408, -1105944807, -1123388097) + + W(4, -1099839750, -1113752075, -1092436626, 1050924256) + + W(5, 1056650964, 1045926824, 1039385437, 1041066449) + W(6, 1037990411, -1119606102, 1043935324, 1036476796) + + W(7, -1111337285, -1110940389, -1124332025, 1021333175); + sum2 = + W(0, -1117330831, 1023708058, -1133288218, -1122435213) + W(1, -1139180683, 1020252429, 1025188082, -1109968059) + + W(2, 1032531181, -1114369361, 1017487862, 1047518334) + W(3, -1122916014, 1027012545, -1103557501, 1046855474) + + W(4, 1043756688, 1031926890, -1104593512, 1043258354) + W(5, -1096895795, 1049767697, 1019544307, -1112657711) + + W(6, 1060766869, 1067300065, -1105945514, -1075696003) + + W(7, -1102393264, -1106946489, 1020047431, -1113285900); + WS(1056055196, 1023945849); + sum1 = W(0, -1104545849, -1139517988, -1101013315, -1136100212) + + W(1, -1148373856, 1013350648, -1120654743, -1108930702) + + W(2, 1036175954, -1138851412, 1048468083, -1097789539) + + W(3, -1096999890, -1097071058, 995622088, -1128233700) + W(4, 1032040419, 1009002268, 1040659763, 1059870683) + + W(5, 1039368714, 1053644410, -1122818538, 1033002810) + + W(6, -1111539988, 1026875367, -1104005681, -1112873620) + + W(7, -1135793772, -1132670698, 1028030253, -1133516850); + sum2 = + W(0, 1033182461, -1135790885, 1036058972, -1145806187) + W(1, 1026470367, -1125994579, -1123856921, -1152817846) + + W(2, -1110992702, 1041801313, -1115959119, -1083556559) + W(3, 1047402951, 1026458945, 1021989349, 1029289545) + + W(4, 1011638125, 976542168, -1106760241, -1068720208) + W(5, 1080067579, 1043021822, -1118809257, 1027196491) + + W(6, -1116812221, -1135785781, 1013579453, 1034110873) + + W(7, 1048786168, -1124564059, -1115658442, -1110636256); + WS(1047050040, 1036867972); + sum1 = W(0, 1031952202, 1040033213, 1049413776, 1052329098) + W(1, -1134253939, 1023712847, -1129317744, 1023414180) + + W(2, 1041031945, 1050476745, 1016870010, 1054273441) + W(3, 1041748879, 1035493153, 1041656495, 1041394937) + + W(4, -1098508279, -1097704487, -1091275871, -1087382286) + + W(5, -1095309386, -1117526273, -1112254893, -1108492595) + + W(6, -1117663192, 1033331580, 1012948685, 1043041286) + + W(7, -1131302504, -1125396951, -1153578470, -1112644847); + sum2 = W(0, -1120609508, -1098653081, -1074671298, -1081276780) + + W(1, -1097107702, -1110118090, -1137118351, -1119823807) + + W(2, -1138324119, 1042859622, 1072071026, 1068070176) + W(3, 1044485226, 1040658983, -1118978815, 1035453187) + + W(4, -1110367912, 1038385587, 1026263792, -1107049493) + + W(5, 1024907208, -1122488627, 1038809437, -1111098449) + + W(6, 1021280635, 1026624912, 1026288466, -1122098825) + + W(7, 1040255596, -1152233050, -1126727249, 1006813455); + WS(1047287096, 1059538103); + sum1 = W(0, 1030804480, -1111595219, -1123153834, -1098057279) + + W(1, 1007980582, 1018775223, 1036089754, 1030691489) + W(2, 1034749929, 1051408038, 1049213285, 1057344539) + + W(3, 1048793645, -1106759404, -1115115061, 1033654600) + + W(4, -1102474905, -1094490621, -1099609086, 1048597242) + + W(5, -1094890059, 1046324795, 1003815995, -1126686757) + + W(6, 1013951379, 1039425378, -1112788128, -1098419769) + + W(7, -1118093753, -1108341356, -1120388747, -1135294247); + sum2 = W(0, -1112864979, 1034721747, -1108077379, 1023366533) + + W(1, 1021246669, 1032508120, -1113986367, -1153257254) + W(2, 1024004698, -1109416755, 988806988, 1058238498) + + W(3, -1115279539, 1041332549, 1033457886, 1018109285) + W(4, 1034996841, 1041661735, 1041642045, 1008174217) + + W(5, -1122858630, -1089151778, -1130797677, -1111548255) + + W(6, 1004307827, -1116757818, 1037366938, -1107547239) + + W(7, -1108868659, -1128614293, -1130732717, -1122125438); + WS(1066216871, -1084582294); + sum1 = W(0, 1009745022, 1023325836, 1034246149, -1103455511) + W(1, 1025953385, -1105242559, 988118663, -1107601837) + + W(2, -1095963722, -1096473834, -1087129751, -1142570129) + + W(3, -1094684497, -1107829831, -1107520037, -1117719279) + + W(4, 1050775177, 1046303345, 1057767679, 1064400323) + W(5, 1038452388, 992534739, 1025316967, 1044853309) + + W(6, 1027534757, -1126933960, -1118146623, -1103828265) + + W(7, 1018950609, 1030437560, 1020674901, 1033139589); + sum2 = + W(0, -1127013105, 1018526115, -1123587641, 1052346460) + W(1, -1098654594, 1029804743, -1118240305, 1030491706) + + W(2, 1031626404, -1117975133, 1062148372, 1074624908) + + W(3, -1090512380, -1070854231, -1095518794, 1041467716) + + W(4, 1029958550, -1113082476, 1035325186, -1130733653) + + W(5, 1046581721, -1113725416, 1031776819, -1115594754) + W(6, 1017794797, 1023300847, -1145491637, 1041942663) + + W(7, -1113152926, -1139181075, -1120299385, -1142763637); + WS(1033725552, -1082653885); + sum1 = W(0, 1027658456, 1033791775, 1038169633, -1130834725) + + W(1, -1105755912, -1107114253, -1106878767, -1102176852) + + W(2, -1091894661, -1094613753, -1085886368, -1094605577) + + W(3, 1049096200, 1038006563, 1040399888, 1038046228) + W(4, 1054730080, 1052727904, 1060322284, 1054915405) + + W(5, -1115316932, -1113871235, -1114082704, -1098681477) + + W(6, 1024810077, 1020875129, -1114253244, 1021660859) + W(7, 1010914050, 1032412472, 1016596422, 1044096992); + sum2 = W(0, -1126607908, -1111819446, 1032709615, -1119610542) + + W(1, 1027594385, 1029384695, -1115269200, 1032209203) + + W(2, -1109006144, 1050929158, 1025316173, -1107176811) + + W(3, -1123863107, -1122531221, 1026796828, -1115616555) + + W(4, -1093467963, 1063076656, 1048889614, -1090320472) + W(5, 1046933317, 1051206364, 997945380, -1109796884) + + W(6, 1059727060, 1073053378, 1073749745, 1058093447) + + W(7, -1079533534, -1073154062, -1075936158, -1088004581); + WS(-1087442510, 1045166814); + sum1 = + W(0, -1106921670, 1032907600, -1111070674, 1047421629) + W(1, -1094092352, 1031075349, -1136240762, -1129052086) + + W(2, 1032009478, -1127325529, -1106321881, -1085655355) + + W(3, 1057239638, -1098381173, -1128650952, -1107389381) + + W(4, 1041337656, -1100890040, 1060092296, 1044767811) + W(5, 1040377247, 1037296628, -1131454723, 1037463686) + + W(6, -1110338367, 1042108264, -1105899594, 1027442111) + W(7, -1105935775, 1037469097, 1027139781, 991481919); + sum2 = + W(0, -1119426781, -1109786529, 1041819143, 1018220925) + W(1, -1103055916, -1124599508, 986571056, 1024618671) + + W(2, 1040351141, 1043540747, -1105926532, -1133247980) + + W(3, -1096724541, 1038612076, 1019567362, -1143357456) + + W(4, -1104019881, -1106797782, -1098594115, 1066013053) + + W(5, -1136157126, -1097021086, 1025702119, 1008181894) + W(6, 1015410156, 1043466418, 1048709183, -1092013542) + + W(7, -1109288787, 1027934232, -1140871148, 1027080058); + WS(1059279054, 1041683061); + sum1 = W(0, 1028823114, 1033060856, -1136683218, 1041097809) + + W(1, -1108712682, -1099515041, -1114499693, -1105525449) + + W(2, -1096417644, -1095251776, -1096755466, -1095420880) + + W(3, -1087904547, -1117180600, -1113115866, -1121084634) + + W(4, 1041071884, 1051348966, -1106154521, 1062896338) + W(5, 1057053635, 1050313119, 1041134484, 1043053335) + + W(6, 1040139175, -1133443258, 1027763154, 1037083176) + + W(7, -1109247178, -1169250436, 1007514196, 1031868218); + sum2 = W(0, -1104031080, -1113246189, -1124792744, -1107688308) + + W(1, -1084040655, -1089958554, -1098618924, -1098033920) + + W(2, 1039900182, 1044206765, 1043086617, 1057123143) + W(3, 1066602722, 1037219700, -1111210157, 1036938090) + + W(4, 1028023758, -1122555834, 1041018096, -1100462314) + + W(5, -1123151815, 1032289221, 1028867168, -1143651414) + + W(6, -1125301559, 1027754708, -1129842792, 1022410763) + + W(7, 1034604384, 1029558442, -1139711519, -1122704124); + WS(-1093886876, -1092780259); + sum1 = W(0, 1031521076, 1040859655, -1123954783, -1115369432) + + W(1, 1027325374, -1130075936, 1017430099, 1005655277) + W(2, 1034696971, 1027092583, 1057011018, 1055452141) + + W(3, 1055461116, 1043845385, 1041326696, 1045628689) + + W(4, -1098366291, -1107551117, -1084481759, -1086775792) + + W(5, 1050583573, -1098824964, 1032795870, -1110858724) + W(6, 991412379, 1023411481, 1037665034, 1037775165) + + W(7, -1102735091, -1106471523, -1113156096, -1108701199); + sum2 = W(0, -1099549152, -1101982776, 1039636960, 1065032135) + + W(1, 1046191187, -1112740199, -1120755726, -1138571865) + + W(2, -1115620025, -1110046443, 1067650764, -1096892917) + + W(3, -1084058149, -1089814493, 1022618460, -1106519005) + + W(4, 1042476476, -1138118945, 1056117723, -1084935200) + + W(5, 1043334912, -1116550886, 1030169574, -1123579094) + + W(6, -1128057356, -1104607948, -1129519972, 1039009532) + + W(7, 1042222420, -1114781123, 1023299940, 1029490149); + WS(-1103384376, 1050555318); + sum1 = W(0, 990997212, -1104723373, -1102560870, -1110645588) + + W(1, -1114771100, 1006886950, 1011892746, 1041403778) + W(2, 1056616014, 1049493908, 1060440249, 1063537686) + + W(3, 1049398171, -1123261404, 1042753094, 1041297647) + + W(4, -1113359817, -1101985253, -1095607555, -1091747296) + + W(5, -1098384586, -1094355067, -1098733239, -1099641616) + + W(6, -1104278389, -1112669305, -1117918862, -1124628967) + + W(7, -1120789735, 1020875660, 1029891897, -1143354303); + sum2 = W(0, -1097904627, -1102268820, -1101696600, -1102083058) + + W(1, -1100977750, 1022682138, -1105396681, 1035758392) + W(2, 1056762738, 998260703, 1049156882, 1055125136) + + W(3, 1040009482, -1099421122, -1114104451, -1112582051) + + W(4, 1033294591, -1102966386, 1040206209, 1048772561) + W(5, 1004029807, 1040485303, -1118051402, 1040482786) + + W(6, -1113205081, -1105114179, 1028552759, 1023069474) + + W(7, -1108173489, 1040370279, -1109779069, -1135668672); + WS(1042369848, -1095650924); + sum1 = W(0, 1032801852, -1124780413, -1142443027, 1031124370) + + W(1, 1024489633, 1037041722, -1157391942, 1048283534) + W(2, 1060985291, 1056066249, 1059062488, 1046815795) + + W(3, 1051554984, 1026983110, 1037131073, 1028118439) + + W(4, -1088222536, -1093287088, -1089766974, -1084610255) + + W(5, -1096293908, 1035048291, -1113190096, -1107690581) + + W(6, -1154392525, 1017158008, 1041310978, -1111535759) + + W(7, -1118760812, -1118618480, 1032589425, -1101944856); + sum2 = W(0, 1056251107, -1118435725, -1111043713, -1090037466) + + W(1, -1129656805, -1093926860, 1052716525, -1083761792) + + W(2, -1084477192, 1041984407, -1093515412, 1073185178) + + W(3, 1051712939, 1053076395, -1096065312, 1066458198) + + W(4, -1077785336, -1086371528, -1093010832, 1074151927) + + W(5, 1054463958, -1094829660, -1090812268, 1063500158) + + W(6, 1053829707, -1113013425, 1046411943, -1090694669) + + W(7, -1095714333, -1103046632, 1035367276, -1087950464); + WS(-1081634407, -1072784825); + sum1 = W(0, -1102740818, -1115394775, -1101924733, -1100839185) + + W(1, -1123768914, -1140848016, -1118249725, -1116477425) + + W(2, 1024862651, 1046040367, -1109613465, -1115978107) + + W(3, 1049722038, -1098661743, -1138059466, 1025943000) + W(4, 1056867014, 1027952685, 1058509811, 1050187219) + + W(5, -1098437541, 1033615035, -1143195264, -1132571500) + + W(6, 1016622683, -1112643478, -1096240139, -1101581667) + + W(7, 1008822020, 1023463264, -1116668435, 1036595961); + sum2 = W(0, -1139809909, -1126178115, 1032546581, -1097752958) + + W(1, 1042272246, -1118367610, -1138081685, 1017774855) + + W(2, 1046126277, -1111752353, 1034216546, 1042101074) + W(3, 1043290796, -1112722386, 1034532478, 1030093406) + + W(4, -1119940899, 1055245806, -1088954301, 1058677046) + + W(5, -1087007443, 1048637958, -1140548675, 1029648824) + + W(6, 1040903120, -1104413152, 1019748625, -1089277711) + + W(7, 1028591970, -1139620757, 1017306737, 1033828758); + WS(1050645916, 1033550915); + sum1 = + W(0, -1118556120, -1108262319, 1043230361, -1094947334) + W(1, -1103841584, 1018079143, 1032598742, 1008731683) + + W(2, -1107219907, 1043545243, -1086762442, -1104041435) + + W(3, 1058293794, -1097977901, 1041130248, -1123331655) + W(4, 1039060494, -1145250020, 1059123936, 1057758321) + + W(5, -1096913490, 1039599795, -1151122424, -1123961290) + + W(6, 1030703933, -1110184190, -1110311564, -1100512367) + + W(7, 1044416908, -1132472896, -1147952664, 1022228292); + sum2 = W(0, 1040267615, 1048409433, -1107165984, -1086251247) + + W(1, -1113957324, -1107976602, -1122078587, -1111525785) + + W(2, -1112791644, -1110540665, -1088877638, 1053330884) + + W(3, 1057377190, 1057673067, 1024512949, 1042772014) + W(4, 1010515766, 1032365064, -1090038325, 1049266570) + + W(5, 1028890653, -1103454662, 1041725883, -1143554104) + W(6, 1024308395, 1041630361, 1040244783, 1037513285) + + W(7, -1098504745, 1039941233, -1103661415, 1024552651); + WS(1051978908, -1102077462); + sum1 = W(0, -1132165009, -1117187439, -1108837850, 1037183202) + + W(1, 1028473682, 1045655273, 1025240990, 1033734537) + W(2, 1045761591, 1051430047, 1060286099, 1046972447) + + W(3, -1128782822, 1028047735, -1178179968, 1035331372) + + W(4, 1013540534, -1096198150, -1130717861, -1085387922) + + W(5, -1105434962, -1101497054, -1110960744, -1102517015) + + W(6, -1106078467, 1014010165, -1121999817, 1030141582) + + W(7, 1008925446, 1018887490, -1122721428, 1026996307); + sum2 = W(0, 1023072493, -1125531833, 1030396885, -1118880502) + + W(1, 1027419877, -1161271853, 1019485964, 1028708277) + W(2, 974611657, 1047662948, 1035351326, -1090109833) + + W(3, -1110942359, 1033315833, 1010290822, -1156901930) + + W(4, -1101792417, 1051899312, 1080526024, -1069022098) + + W(5, -1087739606, 1036440530, -1124554651, -1114394737) + + W(6, -1112121991, 1037288067, 1042102238, -1113214479) + + W(7, 1032127295, -1143368203, -1132377096, -1141169667); + WS(1058455886, -1096183470); + sum1 = W(0, -1105360672, -1112035684, -1105059667, -1103063975) + + W(1, -1112638549, -1104182327, -1106250503, -1103319623) + + W(2, -1112611850, 1032735242, 1048808633, 1042817013) + W(3, 1058906409, 1047248804, 1047193699, 1057710235) + + W(4, 1060616064, 1033545283, 1051085625, -1097442806) + + W(5, -1102188695, -1103229812, -1106970890, -1109193562) + + W(6, -1104075433, -1111940643, -1115570744, -1097216429) + + W(7, -1107200030, -1108265532, -1119499692, -1106901731); + sum2 = W(0, -1135393651, -1131009665, 1004138181, -1111055824) + + W(1, -1134829555, -1127256265, -1113946573, 1010148467) + + W(2, -1114274101, 1016197705, -1143366053, 1051632163) + + W(3, -1111579981, 1038147066, 1025185617, -1137859715) + + W(4, -1117767149, -1130986601, 1026922589, 1048764370) + + W(5, 1036257166, -1112945554, -1143942149, -1123068365) + + W(6, -1110403581, -1136444051, -1112183743, -1121253595) + + W(7, 1009689523, 989872074, -1123668797, -1123716033); + WS(-1103618872, 1023577831); + sum1 = W(0, 1041702149, 1032268701, 1021026046, 1032012647) + W(1, 1023662430, -1111766616, -1112590149, 1042231991) + + W(2, 1057806109, 997904496, 1057675340, -1129702414) + W(3, 1056283152, 1039716321, 1049875952, 1054291708) + + W(4, -1091063799, -1106010126, -1090884608, -1094077941) + + W(5, -1094732237, -1100869456, -1105996279, -1098425069) + + W(6, 1022049043, -1102660926, 1046995709, -1100395542) + + W(7, 1050214494, -1096243374, 1047647816, -1100607928); + sum2 = + W(0, 1073849383, 1069429154, 1070121938, 1066905653) + W(1, -1087755842, -1080359597, -1073496568, -1070245916) + + W(2, -1072987051, -1080077361, -1076996297, -1086754234) + + W(3, 1060194671, 1067521081, 1074652354, 1075883836) + W(4, 1040644897, -1098556311, -1124122091, -1095882058) + + W(5, -1096747545, 1048551041, -1092793409, 1058695504) + + W(6, 1022236877, -1128073567, -1118780260, 1027638421) + + W(7, 1012182550, -1129108935, -1130588931, 1001812541); + WS(1010873216, -1100304815); + sum1 = W(0, -1154187044, 1028741017, -1114247598, -1099084427) + + W(1, -1104966895, 994968800, -1113228468, 1028263947) + W(2, 1045945805, 1051026373, 1058185854, 1059904750) + + W(3, 1052860588, 1038231664, 1040557287, 1032103905) + + W(4, -1102222630, -1103217414, -1097780567, -1091550752) + + W(5, -1108718914, -1110664976, 1017403508, 1017865354) + + W(6, -1113759340, 1022415534, -1105383733, -1111624796) + + W(7, -1114326870, -1110217221, -1108875519, -1109350878); + sum2 = + W(0, -1114639192, 1039210963, 1047528380, -1099502544) + W(1, 1041344628, -1108972702, 1021595805, -1116883371) + + W(2, -1100331344, 1069298433, 1080352854, -1067747068) + + W(3, -1080996124, 1032407437, -1121090437, 1016604711) + W(4, 1035901690, 1043940791, 1030733380, -1084572959) + + W(5, 1003800555, 1045939813, -1121287047, -1122259179) + + W(6, 1012858414, -1126620651, 1036529177, -1099630936) + + W(7, 1043527822, -1119860547, -1145664907, 1034105585); + WS(1044302648, -1104457270); + sum1 = W(0, -1115179413, -1101763748, 999269803, -1106420033) + + W(1, 1041707045, -1128885581, -1110751840, 1029110244) + W(2, 1029190781, 1045938783, 1034810490, 1055724168) + + W(3, 1053359959, -1100033022, 1037908026, 1035419021) + + W(4, -1108944696, -1102720380, 1038235218, -1101615303) + + W(5, -1094303566, 1043259278, 1011056201, -1123807773) + + W(6, -1115207128, 1013266237, 1025157307, -1105407492) + + W(7, 1045691477, -1113033137, -1114066571, -1113282394); + sum2 = + W(0, -1117238549, -1115295266, 1033754662, -1095438097) + W(1, -1106855439, 1011060498, -1117460606, 1032653312) + + W(2, -1109414288, -1128441429, -1104877135, 1053172955) + + W(3, 1056926069, -1108715476, 1036225840, -1114450934) + + W(4, -1115125848, -1121954754, 1018153798, 1038786210) + W(5, -1104082080, 1043675119, 1008366234, 1018894269) + + W(6, 1023475415, 1024122972, 1002646200, -1106263750) + W(7, 1034246226, 1025499367, -1107090094, 1013321052); + WS(1068015911, 1043072951); + sum1 = W(0, -1127841379, 1035792844, -1155603908, 1018341976) + + W(1, -1111053022, 1044403491, -1112313859, 1005208661) + + W(2, -1101991257, -1091973141, -1110119406, -1095315357) + + W(3, -1107228151, -1111437840, -1097295811, -1103670736) + + W(4, 1041159238, 1040826438, 1052691071, 1053842800) + W(5, 1042506601, 1050221764, 1030249017, 1046985745) + + W(6, 1035382295, -1098419575, 1043898844, 1030324599) + + W(7, -1108241413, 1043481954, -1098652336, 1032196534); + sum2 = + W(0, -1134315530, 1033824390, -1112867968, 1039862799) + W(1, 1005143468, -1114969920, 1030354102, -1131720457) + + W(2, -1125722365, 1019923991, 1039464885, -1087456726) + + W(3, -1119378177, 1042059959, -1113780490, 1009971850) + + W(4, -1135384490, 998580556, -1093291922, -1061395777) + + W(5, -1106942114, -1121281813, 1034179020, 1032010553) + W(6, -1118933131, 1027495017, 1045077367, 1087627027) + + W(7, 1034637079, -1148550692, -1118611519, -1117397469); + WS(1060186318, -1131602669); + sum1 = W(0, 1022422466, -1102049002, 1050775273, -1097141731) + + W(1, 1056872997, -1099566807, 1025667942, 1032894309) + W(2, 1050205114, 1052887138, 1052456073, 1049038746) + + W(3, 1040490435, 1039690728, 1043457059, 1045856748) + + W(4, -1099402401, -1102238785, -1100510367, -1088759247) + + W(5, -1122526498, -1099089908, -1102859210, -1106963501) + + W(6, -1112848707, -1106285089, 1039607513, -1098786589) + + W(7, 1048305743, -1104192622, 1032266998, -1118572779); + sum2 = W(0, 989650422, -1108234271, -1120122674, 1045260201) + + W(1, -1114112879, 1037831837, -1117501250, 1024132690) + + W(2, -1120410947, 1050158699, -1092804082, 1024838498) + + W(3, -1125280065, -1119936776, -1114421818, 1035095434) + + W(4, 1047633630, 1066272871, 1075424781, 1061734347) + W(5, -1091697647, 1003481288, 1011848513, -1106020023) + + W(6, -1081060940, -1074101109, -1079387458, 1050344942) + + W(7, 1043540897, 1039609275, -1131708367, 1026462111); + WS(1057810382, 986287880); + sum1 = W(0, -1105255365, 1027767677, 1037147968, 1038550632) + + W(1, -1136315263, 1035749561, -1115075413, 1028257967) + + W(2, -1110142276, -1106138450, -1092238936, -1090210593) + + W(3, -1089134184, -1093055129, -1097497096, -1089420006) + + W(4, 1041191503, 1031406779, 1027980992, 1049547413) + W(5, 1052451129, 1057536820, 1050343212, 1058108487) + + W(6, 1050176972, -1130243957, 1041310918, 1041377527) + + W(7, -1115128119, 1033537239, -1127231554, 1031965752); + sum2 = W(0, -1099824579, -1113793286, 1053512844, -1112943238) + + W(1, 1041834894, -1099992002, -1120789532, 1024916046) + + W(2, 1070708271, -1104040400, -1091831853, -1072548459) + + W(3, -1093778092, 1057576575, 1064181862, 1051972140) + + W(4, 1075074245, -1084124078, -1082668198, -1072503695) + + W(5, 1056090411, 1053907302, 1058602971, 1054786345) + W(6, -1097074436, 1023561426, 1039380165, 1009216489) + + W(7, 1043969626, -1107563771, 1034348623, -1106961801); + WS(-1075707047, 1038147646); + sum1 = W(0, 1038492938, -1115961531, 1036899040, 1041066756) + W(1, 1038870159, 1045702796, 1022987667, 1044017707) + + W(2, 1050722763, 1026800423, 1055626176, 1052178217) + W(3, 1027667391, 1053246416, -1100305296, 1049962981) + + W(4, -1095596015, -1103730686, -1091210886, -1090286882) + + W(5, -1094135001, -1095582752, -1109653838, -1093296229) + + W(6, 1040870942, -1122935577, 1047700685, 1036539085) + + W(7, -1102625947, 1048523811, -1105859960, -1117734303); + sum2 = W(0, -1145353723, -1113260796, -1112198364, -1113367096) + + W(1, 1007958125, 1047146251, -1122974002, 1021064313) + W(2, 1027969677, -1095928859, 1052169305, 1052353113) + + W(3, -1129450520, 1051473061, -1091037095, 1050393555) + + W(4, -1115030411, 1031463199, -1108227013, 1051016428) + W(5, 1041462653, 1045242344, 1032341221, 1020102815) + + W(6, 1052090154, -1110261785, 1041877601, -1099630700) + + W(7, -1087173862, -1102681887, -1095485390, -1111896409); + WS(-1102302520, 1068562064); + sum1 = W(0, -1130894152, 1029216267, 1029150351, 1029804895) + + W(1, -1108054071, 1046304488, -1107326720, 1018120580) + + W(2, -1101486038, -1094978851, -1104755260, -1093484995) + + W(3, -1110271975, -1106599349, -1102131284, -1102274525) + + W(4, 1044130034, 1029251017, 1053252560, 1050941559) + W(5, 1036880709, 1050863202, -1128083416, 1047248574) + + W(6, 1031789673, -1102217970, 1042516209, 1040658618) + + W(7, -1113036417, 1041743615, -1102226940, 1032422999); + sum2 = + W(0, 1019111797, -1123809812, 1006739898, 1041109085) + W(1, -1126211453, 1028972357, -1118372569, 1025713585) + + W(2, 1022527979, -1111065998, 1031759809, -1095097056) + + W(3, 1034613952, -1107360163, 1033659253, -1118642675) + W(4, -1131519898, 1023737355, 1045357020, 1082939698) + + W(5, 1027342607, 1033832936, -1112248823, -1118824157) + + W(6, 1029130971, -1117143513, -1106220344, -1064938697) + + W(7, -1122955245, -1112280546, 1032152906, 1028082979); + WS(1066566439, -1125753148); + sum1 = W(0, 1020091828, 1041951168, -1130301450, 1052053147) + + W(1, -1131231944, 1033588155, 1009411772, -1116682291) + + W(2, -1096367972, -1098758994, -1093467737, -1089881409) + + W(3, -1092544881, -1098181717, -1110070786, -1096392077) + + W(4, 1038767583, 1048997640, -1130818632, 1064063659) + W(5, -1116991019, 1042770882, 1046860728, 1027361773) + + W(6, 1030663671, 1025331919, -1108818909, 1044746920) + W(7, 1022962726, 1041997189, 1018371147, 1038578846); + sum2 = W(0, -1105507764, -1149004498, -1098298748, -1115729482) + + W(1, -1094576030, -1111478010, -1129010369, 1018600957) + + W(2, 1019815533, 1047279899, -1106660204, 1058550934) + W(3, 1031191852, 1032716298, -1117054989, 1019851909) + + W(4, -1136431769, -1121679526, -1096656341, 1058580319) + + W(5, -1098228632, 1041490224, 1047791827, -1106522387) + + W(6, 1024962860, 1041000955, -1107413740, 1027135608) + + W(7, -1101441076, 1035067556, -1123460834, 1005788722); + WS(1050996380, 1066787661); + sum1 = W(0, 1042843177, -1120310187, 1033453959, -1107450543) + + W(1, 1017862620, -1134072575, 1025308393, 1033769739) + W(2, -1109518091, 1043911830, 1059519229, 1061971625) + + W(3, 1051823058, 1046601317, 1042112788, 1046863997) + + W(4, -1098674409, -1097687209, -1096304487, -1098011863) + + W(5, -1095767039, -1095249970, -1098354285, -1098417599) + + W(6, -1112832565, -1133582755, -1116528532, -1105396874) + + W(7, 1033796902, 999923683, 1030029487, -1109771063); + sum2 = W(0, -1103321099, 1033376724, -1108916223, 1033194077) + + W(1, 1038197771, 1032881798, 1017830932, -1138730935) + + W(2, -1087654445, -1114493691, 1049058628, 1065240604) + + W(3, -1128335788, -1094150295, 1006224046, -1112103411) + + W(4, -1098379129, -1096458683, 1036368268, 1054396447) + + W(5, 1049730119, -1108472207, 1031462702, -1102017203) + + W(6, 1013739975, 1015354012, -1121134774, -1115257551) + + W(7, -1129699908, 1021079748, -1117224382, 1038189385); + WS(1027314912, -1081149641); + sum1 = W(0, -1109480125, -1114947760, -1101195017, -1132100201) + + W(1, -1103759537, 1044342469, -1111893319, 1051194426) + W(2, 1051429188, 1053252314, 1058130398, 1061393767) + + W(3, 1057940398, -1104522586, 1055491172, -1120202825) + + W(4, -1118844062, -1094077252, -1113091794, -1085308129) + + W(5, -1102037735, -1094497965, -1103334896, -1094870250) + + W(6, -1097611416, 1034118735, -1104617542, 1035982720) + + W(7, -1114189097, 1036294793, -1128796810, 1030785028); + sum2 = W(0, -1131039707, 1024995350, -1104486127, 1015537291) + + W(1, 1053996441, -1103676904, 1047124046, -1111129691) + + W(2, -1098833779, -1124760267, -1078713050, -1065942779) + + W(3, 1047686732, 1084085461, 1064521940, -1093915430) + + W(4, -1147567565, 1057070390, -1091843304, -1081156610) + + W(5, -1094140189, 1060423478, 1046849692, 1018309905) + W(6, 1035790053, 995065627, 1037354874, -1154356731) + + W(7, -1107145709, 1026796886, -1108476011, 1038591472); + WS(-1081542375, 1044780323); + sum1 = W(0, 1026864081, -1100303790, 1048337215, -1098110473) + + W(1, 1054474587, -1099969099, 1023999910, 1028627178) + W(2, 1046719985, 1054288460, 1054459103, 1048901488) + + W(3, 1041639871, 1034589376, 1043694031, 1046235480) + + W(4, -1098857847, -1108679899, -1098101851, -1093175556) + + W(5, -1104037973, -1107626335, -1101510966, -1106600025) + + W(6, -1114219435, -1104586877, 1041408644, -1098306531) + + W(7, 1046672715, -1104199322, 1022681657, -1126646775); + sum2 = W(0, 1017985090, 1027847194, 1036519222, -1113167123) + + W(1, 1037009826, -1113380621, 1031131596, -1115360802) + + W(2, 1024212320, -1098721130, 1050387030, -1094712479) + + W(3, -1100822056, 1028269032, 1009055356, -1113841920) + + W(4, -1099849981, -1081468176, -1070464929, -1096550174) + + W(5, 1057690620, 1042714784, -1145638655, 1046010973) + W(6, 1067245211, 1074345814, 1070597407, -1088417301) + + W(7, -1104880956, -1102737214, 1000105719, -1112342255); + WS(1059294542, 1020616832); + sum1 = W(0, -1157534552, 1039080142, -1097783100, 1031217968) + + W(1, -1164216296, -1138897989, 1026686634, -1105498094) + + W(2, -1096856701, 1044861738, -1089052876, -1085780263) + + W(3, 1044573672, -1097342660, 1041475528, -1105558033) + W(4, 1050532499, 1041652423, 1057029426, 1047119538) + + W(5, 1039715347, 1043073721, 1040308239, 1048391538) + W(6, -1112831597, 1046540791, -1098369827, 1040272239) + + W(7, 1024931118, -1103025619, 1045404192, -1114523696); + sum2 = W(0, -1106291706, 1001372950, -1099590495, -1093748925) + + W(1, 1015225205, -1105937891, -1112612361, 995169980) + W(2, 1040318024, -1105705183, 1045484852, 1061316313) + + W(3, -1098311584, 1041085521, 1028378294, 1035732349) + + W(4, -1114208076, -1116263519, -1108179199, 1049891427) + + W(5, 1040668388, -1111581107, -1115787941, -1113959318) + + W(6, -1142193319, -1145917455, 1036599633, -1108356360) + + W(7, -1148092276, 1032743264, 1021281994, 1024794158); + WS(1059376718, -1137270291); + sum1 = + W(0, -1118257199, 1037392427, -1097794403, 1035766677) + W(1, 1026067385, 1032186693, -1108679762, -1139304576) + + W(2, 1043258576, -1106073464, 1054680411, -1099046488) + + W(3, -1088020070, 1041392887, -1113652045, -1111666975) + + W(4, -1114290826, -1124279079, -1115190716, 1052189312) + + W(5, 1054691490, -1097245116, 1025610423, -1123561026) + W(6, -1112002778, 1022160871, 1045843716, 1011458515) + + W(7, -1110958220, 1046761570, -1117145658, 1032305501); + sum2 = + W(0, 1025244035, -1122852568, -1092220395, 1038019467) + W(1, 1048072683, -1113553750, -1119930901, -1139793711) + + W(2, 1033595807, -1087687504, 1066421651, 1047700223) + + W(3, -1084925862, 1050883425, -1105555859, -1146566911) + + W(4, 1016573022, 1048825911, 1058107887, -1089540205) + W(5, 1045215493, -1098430697, 1041208433, -1124843514) + + W(6, 1002397687, -1104089806, -1130145014, -1111655831) + + W(7, 1032935415, 1015641098, 1001885951, -1131703250); + WS(1058596686, 1013962118); + sum1 = W(0, 1000024554, -1127551432, -1100000762, 1035333436) + + W(1, -1122612871, 1044766998, 1041477861, 1051562743) + W(2, 1052551424, 1049056438, 1057499982, 1036076760) + + W(3, -1127972943, -1116046252, -1118015335, -1099275107) + + W(4, -1088298614, -1098656348, -1090756927, -1097067922) + + W(5, 1040213184, 1015197910, -1123679237, -1122278672) + W(6, 1039656505, 1034731345, 1019232187, 1033429441) + + W(7, -1125045580, -1113717771, 1037833508, -1122272135); + sum2 = + W(0, -1104434141, 1029025211, -1078497608, -1079110377) + W(1, -1085502108, 1066279808, 1062913146, 1068620036) + + W(2, 1048601996, -1091369704, 1052827694, -1106615386) + + W(3, -1115334546, 1037382016, -1122817088, 1048688798) + + W(4, 1033271157, -1119340081, 1025214064, -1109539756) + + W(5, 1050957039, -1106594885, 1036274829, -1118139306) + W(6, 1004930429, 1028438774, -1106316897, 1034989376) + + W(7, -1108631008, 1023198169, -1134348613, -1139733884); + WS(1044771128, 1023341948); + sum1 = W(0, -1156220044, 1034545464, 1033488922, -1111313058) + W(1, 1038420969, 1008511890, 1013986230, 1011084871) + + W(2, -1092336191, -1098819215, -1096491302, -1086850728) + + W(3, -1102939421, -1100928894, -1115524377, -1089482302) + + W(4, 1051560294, 1044146859, 1051910286, 1045449190) + W(5, 1053458817, 1038883707, 1012126018, 1046748951) + + W(6, 1036528391, 1029114797, 1022761170, 1029767950) + W(7, 1041877300, 1034675856, 1037411178, 1043196317); + sum2 = W(0, -1071004894, -1080574884, -1089987082, 1049506323) + + W(1, 1065282653, 1062249589, 1060165079, 1070844945) + W(2, 1076503146, 1066884159, 1058011283, -1098882467) + + W(3, -1084978169, -1088626314, -1082249713, -1077734377) + + W(4, 1057610169, -1107351326, 1054000347, -1090234844) + + W(5, 1030898490, -1090230279, 1044380003, -1096516163) + + W(6, -1122913984, -1130255370, 1038970611, 1014162118) + + W(7, -1114000490, 1022492087, -1131621088, 1013009282); + WS(-1111817840, -1134998409); + sum1 = W(0, 1022731056, 1045262352, 1044888721, 1029818259) + W(1, -1105915720, -1114660906, 1027479949, 991785104) + + W(2, -1102901203, -1094315057, -1085070720, -1111793509) + + W(3, 1055206544, 1046806370, -1123039746, -1136267423) + W(4, 1029699069, 1052915216, 1058770140, 1057078063) + + W(5, -1095183540, -1097451385, -1112670352, -1114500629) + + W(6, 1021112442, -1107194439, -1097785743, -1117717150) + + W(7, 1040740592, 1036425016, 1005586201, 1016465988); + sum2 = W(0, -1129690332, 1030842707, -1123486113, 1054087898) + + W(1, -1105176966, -1097205966, -1098021434, -1106929221) + + W(2, -1113356803, 1026318374, 1041923626, -1089332833) + + W(3, 1068558125, -1141184456, -1107728348, -1104288342) + + W(4, 997943457, -1119512995, 1037525758, -1088292904) + W(5, 1040210770, 1050151959, 1018682892, 1006954668) + + W(6, 1015499837, -1180561029, -1144014736, 1037328869) + + W(7, -1107365912, -1114055561, 1009592392, 1013301204); + WS(-1100650808, 1043653943); + sum1 = + W(0, 1038392637, 1032036848, -1120772452, 1043637149) + W(1, 1040259489, 1047398869, 1038054351, 1050576478) + + W(2, 1044290651, 1040683515, -1106266873, -1090111931) + W(3, -1133467790, 1044787930, 1023591523, 1037223428) + + W(4, -1095199164, -1115398639, -1094097345, -1097393337) + + W(5, -1104941765, -1101572298, 1016760834, -1102689443) + W(6, 1033771919, 1038316223, 1042896310, 1045751664) + + W(7, -1159203906, 1015063331, 1030908740, -1125005703); + sum2 = + W(0, 1018053796, 1000548496, 1049079603, 1039189619) + W(1, -1128574308, -1118597354, -1106984497, -1104543855) + + W(2, 1046306039, 1043541862, 1010667960, 1064529690) + W(3, 1047996002, -1087406141, -1095617964, -1086946593) + + W(4, -1101305605, 1029064982, -1116813778, 1038487223) + + W(5, -1100258391, 1048794746, -1114392997, 1045938007) + + W(6, 1031448374, -1112893849, 1021972628, -1105518867) + + W(7, 1037842238, 1033382833, 1021089548, -1140458600); + WS(-1121537248, 1047151836); + sum1 = W(0, -1096325448, -1113135282, -1098188693, -1112146268) + + W(1, -1108791588, -1117696601, -1123869651, -1114157115) + + W(2, 1052654400, 1035132488, 1046868890, -1134150082) + + W(3, -1129891280, -1098847494, 1032919412, -1107856679) + + W(4, 1000450324, -1110395025, -1139200797, 1049727010) + W(5, 1041189572, 1056884317, 1041128337, 1058220805) + + W(6, -1116556387, 1023519458, -1111260975, -1110207458) + + W(7, -1104838938, -1098805187, -1146298440, -1103148146); + sum2 = + W(0, -1142864271, 1021304865, 1043366966, -1107584343) + W(1, 1014758407, -1130465374, -1120740451, 1000478551) + + W(2, 1043572739, 1026011378, -1102859954, -1080136051) + + W(3, -1103597159, -1115654645, 1046511165, 1053224660) + + W(4, -1125571574, 1028667063, 1022196210, -1072538638) + W(5, -1076945816, 1048815254, 1072551214, 1074776028) + + W(6, -1107989855, -1140649559, 1020722946, -1132367054) + + W(7, 1041979768, -1126224006, 1027667511, 1048839210); + WS(-1086568910, 969651201); + sum1 = W(0, -1128189323, 1044154939, 1043534732, -1114366976) + + W(1, -1098469330, -1101372520, -1123038043, -1132910587) + + W(2, -1096064919, -1089612648, -1084798775, 1053159863) + + W(3, 1053431542, 1050787607, 1036747448, -1116020373) + W(4, 1047521403, 1054908701, 1056987371, 1057685165) + + W(5, -1089249613, -1090701774, -1105030179, 1027268120) + + W(6, 1043461231, -1099266659, -1113308531, -1152040120) + + W(7, 1042761408, 1049635020, 1010635844, 1018344000); + sum2 = W(0, 1042932965, -1103428495, 1039997403, -1093583228) + + W(1, 1044856824, -1121819542, -1177180368, 1028413178) + + W(2, -1103892922, 1060495074, 1052448567, -1075640666) + + W(3, 1057723154, 1057002090, -1112150955, -1118134166) + + W(4, -1104364155, 1060109323, 1064108701, -1073056297) + + W(5, 1055665788, 1060503917, -1116550688, -1110515035) + + W(6, -1139842168, -1118896922, 991756114, -1097481656) + + W(7, 1040659602, -1099984054, 1034919451, 1041069777); + WS(-1084093518, -1116656412); + sum1 = W(0, 1002008836, 959481663, -1104590931, 1050696243) + W(1, -1106608235, 1047962207, 1030562773, 1015783795) + + W(2, 1058416208, 1026388179, 1059097973, 1042079029) + W(3, 1041679827, 1049127990, 1031439243, 1042535660) + + W(4, -1096672513, -1109778819, -1088144465, -1096264126) + + W(5, -1101432288, -1100480244, -1113594772, -1093923750) + + W(6, -1112390467, 1023428581, -1112632704, 1040470858) + + W(7, -1102954054, 1047012782, -1112144502, -1145396437); + sum2 = W(0, 1007960967, -1110192070, 1049899326, 1056650247) + W(1, 1078512141, 1081472440, 1058404171, 999915485) + + W(2, 1027407916, 1010716935, -1097456083, -1070859565) + + W(3, -1068241064, -1079514242, -1094427160, 1030657127) + + W(4, -1129957403, 1018303319, 1037417999, -1094713389) + + W(5, -1096379657, 1043613542, 1025537830, -1116925932) + + W(6, -1132155403, -1121935910, -1137993343, -1142796285) + + W(7, 1039214170, -1111213656, 1032528613, 1024356221); + WS(1052225948, 1018668194); + sum1 = W(0, -1120453498, -1123160289, -1108654867, -1104839613) + + W(1, 1041378113, 1036965515, 1044186084, 1034438594) + W(2, 1051775516, 1048325451, 1058214550, 1064670427) + + W(3, -1126638409, 1049967085, -1096299613, -1128237844) + + W(4, -1117579103, -1111291056, -1093397513, -1091445969) + + W(5, -1092047898, -1099225050, -1112850625, -1112057991) + + W(6, -1107074656, -1112742544, -1147977428, -1119335936) + + W(7, -1109154218, 1034167881, -1138567959, 1019177609); + sum2 = W(0, -1121001958, -1148685985, 1018483434, 1021815720) + + W(1, 1049361594, -1108634723, -1132118692, -1105580672) + + W(2, -1117606942, -1111847761, -1120566718, -1076982600) + + W(3, 1074852012, 1048076514, -1102180777, -1116866514) + + W(4, -1103097305, 1021935234, 1049895592, -1081972918) + W(5, 1051964198, 1040925857, 1017568960, 1040155911) + + W(6, -1130038396, -1112487949, 1038078839, -1125812992) + + W(7, -1152546434, -1104919092, 1026180028, -1123068468); + WS(-1096382876, -1091051652); + sum1 = W(0, -1116126267, -1113197617, -1112424211, -1124324715) + + W(1, -1136579346, 1040875430, -1113905512, 1017323784) + W(2, 1057278592, 1048826126, 1058810754, 1056304110) + + W(3, 1041995897, 1016295122, 1024916389, 1042534003) + + W(4, -1096000788, -1097274020, -1088739494, -1091311905) + + W(5, -1114916522, 1038826452, -1128507781, 1017648027) + + W(6, -1116910752, -1140807037, 1039925053, -1132679170) + + W(7, -1107191661, -1119450067, 1023437062, -1098370349); + sum2 = W(0, -1120311657, 1036113080, -1109045199, 1029662296) + + W(1, -1122358251, -1114085873, 1016737279, -1115835645) + + W(2, 1025682064, -1107470193, 1035621932, -1118009189) + W(3, 1045290388, 1009830751, 1035169596, 1030264440) + + W(4, 1036682152, -1108061877, 1051542033, -1101792442) + + W(5, -1093646778, 1056395710, -1091719234, 1052430993) + + W(6, -1108273289, 1012612647, -1101063214, -1076098595) + + W(7, -1080861029, 1039398973, 1065137390, 1072502688); + WS(1040082544, -1114755812); + sum1 = W(0, 1017784372, 1037505264, 1045745417, 1019379817) + W(1, -1109308706, -1124056118, 1025470519, 1039469090) + + W(2, -1110974758, -1108514902, -1095324708, 1052579502) + W(3, 1058051822, 1046163210, 1038459986, 998280780) + + W(4, 1040296296, 1041424680, 1054913780, -1106396419) + + W(5, -1087512533, -1093666877, -1106674096, -1109356390) + + W(6, 1024480479, -1104471944, -1106439461, -1115066496) + + W(7, 1040857799, 1001482384, 995688529, -1108404770); + sum2 = W(0, -1162396366, -1117720653, -1104226850, -1105580348) + + W(1, -1105643813, 1031813906, 1011045214, 1018164327) + W(2, 1045315846, -1118054954, 1057942904, 1059476362) + + W(3, -1090022037, 1045409162, -1106412098, 1023977529) + W(4, 1034748092, 1034773210, 1043388435, 1067689202) + + W(5, -1083232471, -1101262587, -1124577575, -1102021751) + + W(6, 1035646876, -1100298043, -1097646834, -1093789486) + + W(7, 1040357620, -1113573448, 1012935222, 1024454049); + WS(1036525168, -1082462584); + sum1 = W(0, -1116308971, 1037298441, 1027885589, -1122874917) + + W(1, -1154089797, -1108384819, 1028179743, 1003463273) + + W(2, -1085123800, -1087372070, -1086414101, -1096064460) + + W(3, -1099879381, -1104319094, -1127380522, -1096394215) + + W(4, 1057675329, 1051660338, 1059597873, 1059581688) + W(5, 1052784510, -1117339864, 1039251609, -1110971807) + + W(6, 1019612704, 1027541711, -1109257541, 1041073820) + W(7, 1028059367, 1045372305, 1031554934, 1053758651); + sum2 = + W(0, 1060691160, -1103295177, 1035985281, -1085964582) + W(1, -1105398566, -1107551093, 1049030608, -1090293163) + + W(2, -1081285622, -1090050073, -1102851017, 1072728426) + + W(3, 1060511611, 1033954581, -1086630634, 1058069039) + W(4, -1080809247, 1050684042, -1087522637, 1060852217) + + W(5, 1058511518, 1041242888, 1028348456, 1062481845) + W(6, 1052276353, -1106187369, 1048638013, -1090587145) + + W(7, 1029176048, -1094879840, 1046256182, -1087039462); + WS(-1074352935, 1040600857); + sum1 = W(0, 1042034194, 1028652336, 1024054004, 1030695172) + W(1, 1029627411, -1117605317, -1114002447, 1041624512) + + W(2, 1057627204, 1025049468, 1057567995, 1022098295) + W(3, 1052602222, 1039437212, 1049556590, 1053416947) + + W(4, -1090157751, -1105875707, -1088931067, -1095088235) + + W(5, -1094832321, -1104356174, -1107260676, -1101255271) + + W(6, 1024364622, -1105990299, 1048022018, -1100928004) + + W(7, 1049957878, -1095846092, 1047165477, -1098759166); + sum2 = W(0, -1075440350, -1079714919, -1079134350, -1081735031) + + W(1, 1055569671, 1066585571, 1071644179, 1075476470) + W(2, 1073165865, 1065983198, 1068716226, 1066499710) + + W(3, -1095308006, -1080754250, -1074800849, -1073191304) + + W(4, -1112383192, 1048707236, -1135853868, -1098543278) + + W(5, 1021808504, -1108920844, 1050977418, -1090378667) + + W(6, -1148975848, -1115591486, 1038054064, -1125971282) + + W(7, 1040311395, -1110109816, 1035370814, -1120408347); + WS(1041022776, 1033480094); + sum1 = W(0, -1132576057, -1123321429, 1028959481, -1104176578) + + W(1, 1046472198, -1121060138, 1027556403, -1115611836) + W(2, 1026327841, 1042302896, 1052457903, 1063677500) + + W(3, -1097607903, -1123802109, -1118671609, 1039698959) + + W(4, -1110434490, -1109312954, -1089918670, 1025377120) + + W(5, -1090934974, 1046523967, -1112257611, 1000531209) + + W(6, -1119031508, 1021323174, 1029242558, -1118638740) + + W(7, 1013298461, -1106699146, 1030036314, -1116635705); + sum2 = W(0, -1106027239, -1122286155, -1102546078, 1055155948) + + W(1, -1096754888, 1032068992, -1121774513, 1036170969) + + W(2, 1049930690, -1127267122, 1041115945, -1091935564) + + W(3, 1052250618, -1103388917, 1038737216, -1108790214) + + W(4, -1110218398, -1108798456, 1058786995, 1075372513) + + W(5, -1071163371, -1123143101, -1121707895, 1032355550) + + W(6, 1034564779, 1018367610, -1095860458, 1043590800) + + W(7, -1112711414, -1119323979, 1016553114, 1017858173); + WS(1055618972, -1117202987); + sum1 = W(0, 1030962480, -1101414710, -1098100923, -1111740150) + + W(1, 1036980413, 1041005827, 1021681163, -1112834597) + W(2, 1039894129, 1053882576, 1057347458, 1049814740) + + W(3, -1090053902, -1088233382, -1105970903, -1117339136) + + W(4, -1101932469, -1089999221, -1085784352, 1051098296) + + W(5, 1056052448, 1051763396, 1044301630, 1032801282) + W(6, 1031993659, 1048656807, 1043352452, 1031031542) + + W(7, -1104607674, -1119077705, 1022017143, 1039235901); + sum2 = + W(0, -1114659327, -1123577690, 1042921002, -1105097716) + W(1, 1042773509, -1093975266, 1032061179, 1000405669) + + W(2, -1101541229, 1043634319, 1066882360, -1077668162) + + W(3, 1037629509, 1058638399, -1108208741, -1131856909) + + W(4, -1107338771, 1057974128, 1050113378, -1080704784) + W(5, 1051155360, 1052705661, 1008396554, -1111189711) + + W(6, 1039378885, -1111523166, 1040130625, -1104122760) + + W(7, 1012227066, -1110420726, -1125218199, 1025207949); + WS(-1091387548, -1116324289); + sum1 = W(0, 1026642697, 1044682252, 1041967213, 1032214050) + + W(1, -1131062694, 1015214154, -1137069945, -1110158325) + + W(2, -1112220622, -1093973688, 1046046637, -1086442024) + + W(3, -1099996941, 1053177927, -1098783494, 1037567917) + + W(4, 1049897926, 1047211372, 1050365286, -1112122925) + W(5, 1046223135, -1132096750, 1024489425, 1042021623) + + W(6, 1027958127, -1098544270, -1112662293, -1106755108) + + W(7, -1116559746, 1034258897, -1111108842, 1031638516); + sum2 = W(0, -1108095393, 1016776222, 977935538, -1122468710) + W(1, 1019959206, 1030099429, -1104930054, 1002749526) + + W(2, 1011776651, 1024100809, -1097248934, 1057627889) + W(3, 1042194141, -1117226417, 1051928720, 1041814459) + + W(4, -1101257730, -1105403134, -1101986254, 1060632600) + + W(5, -1090719303, 1037412790, -1109292621, -1115385474) + + W(6, 1019145070, 1032882678, -1124027994, -1103033100) + + W(7, 1039533068, -1110127978, -1125661478, -1108291818); + WS(1057965518, -1118811194); + sum1 = W(0, -1104352985, 1038892389, -1105058276, 1042490232) + + W(1, -1121521774, -1099594944, 1033536020, -1095161930) + + W(2, -1106566686, -1112643723, 1026830542, -1091938531) + + W(3, 1058056073, -1101314965, -1098044778, 1039936570) + W(4, 1052732873, 1003767366, 1060358287, 1019887594) + + W(5, -1118338013, 1042464324, 1024562028, 1046000094) + + W(6, -1107147458, -1114250980, -1096574819, 1048844541) + + W(7, 1024329053, -1107780158, 1032778872, -1107207172); + sum2 = W(0, -1116205334, 1042905425, -1109155755, 1044205280) + + W(1, 1035597621, 1008636092, 1036458751, -1092853308) + W(2, 993944814, -1113078065, 1044406596, 1040105843) + + W(3, 1043112037, -1123380436, -1105268129, 1005260887) + + W(4, 1032713731, -1104977559, 1048672381, -1104277422) + + W(5, -1103087244, -1153474446, 1015784078, 1036094123) + + W(6, -1106373772, 1039619019, -1115343154, 1048332350) + + W(7, 999501191, -1106439836, 1021528398, -1106473413); + WS(1053420700, 1049909457); + sum1 = + W(0, -1115258034, 1034071238, 1027276239, -1115686559) + W(1, 1041096236, -1102788144, 1034068157, -1107460367) + + W(2, -1106165874, -1089903413, 1036166247, -1100423414) + + W(3, -1093491554, 1049835542, -1095323722, -1110396954) + W(4, 1050401361, 1041332866, 1049384898, 1037380859) + + W(5, 1052388787, 1034784425, 1031952854, 1050882791) + W(6, -1113250117, 1023742249, -1130552842, -1120158506) + + W(7, 1037333727, -1103514783, 1037170040, -1114330639); + sum2 = W(0, -1112500393, 1028289272, 1049127312, 1086771603) + W(1, 1048088739, 1020087240, 1014851096, -1146529543) + + W(2, 1024557142, -1165623582, -1095250820, -1062269001) + + W(3, -1095068995, 999933935, -1135945992, 1025716258) + + W(4, -1136367764, 1035333264, -1114028070, -1087155359) + + W(5, 1022077560, 1034746908, -1120864651, -1127622484) + + W(6, 1020782048, -1122738507, 1025362120, 1034731082) + + W(7, -1125007838, -1120796207, 1026594640, -1128255426); + WS(1063806286, 1027083983); + sum1 = W(0, -1114823180, 1030313470, -1111791457, -1111977289) + + W(1, -1108043857, 1019729830, -1114640622, 1033983240) + W(2, 1045480194, 1039206373, 1061885616, 1050451993) + + W(3, 1057912708, 1036575619, 1039765761, 1034424532) + + W(4, -1118427516, -1106496703, 1010686340, -1083830979) + + W(5, -1099420545, -1105267089, -1131920190, -1125840468) + + W(6, -1109705966, 1020453816, -1103432478, 1039658735) + + W(7, -1114670584, -1109909656, -1113587473, -1112770081); + sum2 = W(0, 1033978022, -1100194899, 1033701105, 1050426550) + + W(1, -1104028404, 1034191613, -1141130302, 1010895851) + + W(2, -1122290634, -1091664523, -1071413373, 1075108998) + + W(3, 1062092502, -1103668501, 1034149895, -1140709165) + + W(4, 1016780797, -1103111994, 1047766898, -1096749849) + + W(5, 1027350687, -1131589290, -1131724600, 1027888251) + + W(6, -1164938552, 1002490582, -1105595809, 1051489664) + + W(7, -1108336227, 1021076655, -1149103768, -1131210373); + WS(1058288590, 1045994186); + sum1 = + W(0, 1018135640, -1123855059, 1040223430, -1112801779) + W(1, 1036317947, -1098800665, 1034707665, -1096517871) + + W(2, -1093342072, -1096797372, -1086390197, -1105293320) + + W(3, -1091216419, -1117054299, -1096209979, 1023470716) + W(4, 1052167946, 1041780692, 1052872019, 1059840396) + + W(5, 1051866430, 1050341107, 1048652350, 1050625648) + W(6, 1038262801, 1015346466, -1132654257, -1134794696) + + W(7, -1117665797, 1012611090, -1139713758, 1010858330); + sum2 = W(0, 1041114210, -1099284356, 1038292116, -1092208278) + + W(1, 1054381469, -1104534119, 1025804573, 1033400256) + + W(2, -1099008397, 1047276236, -1081084758, -1071665325) + + W(3, 1054365119, 1081581342, 1062322644, -1093538640) + + W(4, -1123917868, -1111523652, 1037708884, -1086778305) + + W(5, -1101037019, 1026238413, -1134916894, 1052085127) + + W(6, -1125418381, -1120564910, 1020505319, -1100128811) + + W(7, 1024474915, -1125603475, 1025011807, -1103707544); + WS(-1088887374, 1070119449); + sum1 = W(0, 1040460421, 1041554590, 1013850612, 1038262022) + W(1, 1042710919, -1106869091, 1044864290, 1046057615) + + W(2, 1052058645, 1048371361, 1048732808, 1042754705) + W(3, 1047384127, 1054439312, 1032508990, 1042772520) + + W(4, -1090595183, -1115426747, -1094790815, -1087902678) + + W(5, -1106656361, -1090477876, -1122940954, -1091795237) + + W(6, -1105506686, 1029097335, -1129317061, 1001782464) + + W(7, 1038072126, -1131475029, 1028935005, -1119515740); + sum2 = + W(0, 1024604999, -1112923336, 1027433809, 1025504127) + W(1, 1007245204, -1144581942, -1129047399, 1021294865) + + W(2, 1056461606, 1030035123, 1050727550, -1090534096) + + W(3, -1105339223, -1095507508, 1043793174, -1095638178) + W(4, 1071685965, 1066713447, 1068313262, 1028028856) + + W(5, -1081367671, -1078816510, -1081156501, -1090770344) + + W(6, -1075212110, -1080779344, -1078194918, -1153515923) + + W(7, 1068056044, 1069903211, 1064173276, 1060536751); + WS(1040470840, 1011790950); + sum1 = W(0, 1015095158, -1120734562, -1116691398, -1118217942) + + W(1, 1019898057, -1123629847, 1034607368, 1041822001) + W(2, 1043725275, 1051465082, 1058372660, 1055309890) + + W(3, 1046636817, 1044874098, 1043010193, 1040878843) + + W(4, -1105535856, -1108441440, -1095343471, -1081260869) + + W(5, 1047492563, -1093096561, -1105294873, -1106259483) + + W(6, -1108386992, 1030149375, -1112701741, 1026499745) + + W(7, 1032201014, -1115283258, 1028457510, -1112399171); + sum2 = W(0, 1022830461, 1021246145, 1015115055, -1114703004) + W(1, -1120910531, 1015720307, 983370825, -1123770073) + + W(2, -1117997331, -1110014342, -1111993293, 1036613835) + + W(3, 1023720090, -1117604953, -1120463052, 1036937497) + + W(4, 1037270083, -1125616185, 1044158772, 1073620398) + + W(5, -1076883688, -1087890801, 1025754476, -1113287589) + + W(6, 1023767946, -1130403951, 1025796328, 1050812248) + + W(7, -1112499600, 1028283916, -1104874229, 1033737696); + WS(1058309838, -1101980246); + sum1 = W(0, -1118965337, -1098779704, 1049071256, -1113399754) + + W(1, 1026571427, -1110569018, -1131332475, -1128371676) + + W(2, -1110907254, 1049643561, -1081904943, 1042163763) + + W(3, 1052138696, -1106220306, 1025191299, -1129449041) + W(4, 1038642111, 1038999679, 1054751182, 1056093093) + + W(5, -1083956910, 1050507993, -1146247429, 1030864044) + + W(6, 1028903966, -1108240479, 1040887994, -1118832415) + + W(7, 1046797612, -1104697276, -1123883748, 1017502086); + sum2 = W(0, -1137655511, 1043191716, -1121349336, -1097517035) + + W(1, 1046822141, -1129223371, -1116759551, -1124684976) + + W(2, -1111106723, 1033166752, 1033268708, 1052576386) + W(3, -1107318253, -1102887232, 1040601750, 993535634) + + W(4, 1035105104, -1112822728, -1104857525, 1055574555) + + W(5, -1114990789, -1121581721, -1152414880, -1107957817) + + W(6, -1112318930, 1027572041, 1035699332, -1097542777) + + W(7, -1110157019, 1031007843, -1157281192, 1025775603); + WS(1063710542, -1111213649); + sum1 = W(0, 1039559517, -1110192145, -1107309859, -1118762901) + + W(1, -1108199122, 1037245627, -1139769966, 1035326852) + W(2, 1052251350, 1049489370, 1058328276, 1061120005) + + W(3, 1049656673, 1033876357, 1041987905, 1045428971) + + W(4, -1101160384, -1097695264, -1093740712, -1096321197) + + W(5, -1097289639, -1114972772, -1102516745, -1103522251) + + W(6, -1113889808, 1031901152, -1104513406, -1097003636) + + W(7, -1112381384, -1176476024, 1022802380, -1115185874); + sum2 = W(0, 1026803387, 1021750253, 1040812059, -1107480079) + W(1, 1041131835, -1115082464, 1006187407, 1001155939) + + W(2, -1115186477, 1031459540, -1116326399, 1040651083) + + W(3, 1020594503, 1033768858, -1132516997, 1015478283) + W(4, 999853755, 1031446318, 1058720440, 1071698983) + + W(5, 1051128601, 1034660038, 1027131696, 1041372466) + + W(6, -1112425236, -1106593609, -1086524651, -1075753828) + + W(7, -1096266051, -1108942599, -1123360193, -1104453127); + WS(1039772272, -1082982873); + sum1 = W(0, 1039127452, -1106264016, -1104546353, -1145518233) + + W(1, 1041713673, 1044410893, 1039725795, 1007790526) + W(2, 1049032497, 1053169593, 1060522592, 1056693961) + + W(3, -1095982984, -1088607916, -1099512929, -1120546088) + + W(4, -1098139952, -1088020664, -1087153807, 1038834197) + + W(5, 1053429837, 1048228018, 1030077856, -1130616150) + + W(6, -1155633625, 1043520647, 1040400554, -1139907193) + + W(7, -1104883452, -1103034636, -1134131855, 1012687882); + sum2 = W(0, 1032987173, -1102803435, -1097110538, -1101871105) + + W(1, -1101555589, -1123533577, -1098769512, 1048796624) + + W(2, -1092902636, 1037122437, -1083842457, 1067610414) + W(3, 1033006847, 1041814167, 1045724867, 999019252) + + W(4, 1027660911, 1039508875, -1115097563, 1067552095) + + W(5, -1096151174, 1026567371, -1107225085, -1105667947) + + W(6, 1032111389, -1101516234, 1001644292, -1104358647) + + W(7, -1145661076, -1104681426, 1020958965, 1028203943); + WS(-1101412664, 1073047832); + sum1 = W(0, -1113880945, -1123950537, -1109995975, -1123565085) + + W(1, -1123728428, 1035385983, -1115318676, 1010675502) + W(2, 1059007377, 1047579477, 1060416389, 1056063051) + + W(3, 1046383171, 1040643140, 1033389702, 1041003725) + + W(4, -1091904865, -1097814305, -1087199740, -1092124214) + + W(5, -1099567891, 1038341800, -1119557930, 1042882861) + + W(6, -1133362719, -1131741454, 1032803377, -1113780884) + + W(7, -1113889390, -1126485237, 1012558775, -1096461162); + sum2 = W(0, 1013686761, -1123503757, 1035262859, -1115490710) + + W(1, 1025861040, 980681483, -1125276038, -1129892230) + W(2, 1030949359, 1039110679, -1105775253, 1027204409) + + W(3, 1019519396, -1111394964, 1024413043, -1126757058) + + W(4, -1109223248, 1035635962, -1106751414, 1057425426) + + W(5, 1043312829, -1098000154, 1051287795, -1103421662) + W(6, -1132915573, 996209923, 1029135163, 1070858778) + + W(7, 1067133266, -1098902818, -1083268694, -1073095921); + WS(-1103532344, -1105840701); + sum1 = W(0, -1106756472, -1106322913, 1029810954, -1096389739) + + W(1, -1116067305, 1035916925, -1105566449, 1034505108) + + W(2, -1105825052, 1053932942, -1086676361, -1098358914) + + W(3, 1054020609, -1096691570, 1051257001, 1026552303) + W(4, 1050195304, 1007328528, 1057202097, 1054492326) + + W(5, -1093369370, 1012599092, 1027855335, -1101687900) + + W(6, 1044840709, -1104890465, -1144507642, -1098185309) + + W(7, 1032208700, 1048715303, -1100267787, 1050640157); + sum2 = W(0, -1111707317, -1119262447, 1037989791, 1056036881) + + W(1, -1105645897, 1006194414, -1146663095, -1129479912) + + W(2, -1101137684, -1109186725, 1049211868, -1099242284) + + W(3, 1038198606, -1118866635, -1109483964, -1114787638) + + W(4, -1116414033, -1107841286, 1056722210, -1094543747) + + W(5, 1053421235, -1104714858, -1120693058, -1115357885) + + W(6, -1103752872, 1034593530, -1110917586, 1049861706) + + W(7, 1030171051, -1103907620, 1032413269, 1029169157); + WS(1045178680, -1115117954); + sum1 = W(0, -1102680211, -1123018420, -1116849368, 1024407336) + + W(1, -1107241006, 1026392201, -1107918421, -1123314455) + + W(2, 1048681528, -1113607536, -1092105355, -1093530556) + + W(3, -1096193779, -1102060551, -1102337510, -1095199752) + + W(4, 1019008549, 1040296293, 1035615004, 1061339424) + W(5, 1057711678, 1055864515, 1045891981, 1052562824) + + W(6, 1008490315, 1012835273, 1027033246, -1128145511) + + W(7, -1103222073, -1110547491, -1110097884, 1020395952); + sum2 = + W(0, -1108321996, -1115537892, -1106228104, 998645667) + W(1, -1112292909, 1035781218, -1111036660, 1018530825) + + W(2, -1096948503, -1104693583, 1047339287, 1055675007) + + W(3, 1049114511, -1100682049, 1032758858, -1113969306) + + W(4, -1112108000, -1112710060, -1126080161, 1051246853) + + W(5, 1041989299, 1025978716, 1034053890, -1113712936) + W(6, 1026091852, 1022753169, -1120501740, -1105262859) + + W(7, -1123292948, -1139782977, -1111667328, 1033000622); + WS(1044590904, 1058699692); + sum1 = W(0, 985175380, 1034192409, 1020554347, 1024014533) + W(1, -1115433194, -1128687821, 1008304190, -1115445028) + + W(2, -1092606720, -1090621088, -1093618783, -1113905855) + + W(3, -1096920415, -1112503613, -1100279725, -1101027255) + + W(4, 1051210502, 1050384326, 1055009987, 1062574818) + W(5, 1054554325, 1031218808, -1105751509, -1144235755) + + W(6, 1009220799, -1109361592, -1117059707, -1128567457) + + W(7, 1015981863, 1039114097, -1127205548, 1035507338); + sum2 = W(0, 1036009101, -1117283755, 1033667347, -1107239966) + + W(1, 1034685217, -1128406639, -1123321687, -1125402335) + + W(2, -1108619644, 1041337919, 1012813669, 1053310286) + + W(3, -1103814148, 1029066827, -1109499964, -1123197815) + + W(4, 1010492213, -1100684466, 1015579759, 1056064408) + + W(5, 1050883237, -1113069964, -1098878001, -1096911819) + + W(6, -1131279719, 1035041542, -1124020763, 1025470531) + + W(7, 1032198922, -1104788458, 1024066141, -1108347132); + WS(1044030776, -1089132931); + sum1 = W(0, 1034269487, 1032883970, 1042439154, 1044751430) + W(1, 1019707982, 1041434446, -1133288904, -1128708109) + + W(2, -1093699058, -1097458090, -1086092656, -1078975458) + + W(3, 1035194756, 1038040390, -1131544335, -1101499019) + + W(4, 1045160768, 1050995424, 1057188990, -1096290982) + W(5, 1032938655, 1043682915, 1022768458, 1043305900) + + W(6, 1040395197, -1135242887, 1040422743, 1048952172) + W(7, 1042217766, 1043586045, 1029073256, 1044718778); + sum2 = W(0, 1043294282, -1127265324, 1035036911, 1051203976) + + W(1, -1092441683, 1037063919, -1095318743, -1096741875) + + W(2, -1107262777, -1107127922, 1048700262, -1114081637) + + W(3, 1027047222, -1087538045, 1043898666, -1114635611) + + W(4, -1132728616, -1133435576, -1115280193, 1060204569) + + W(5, -1096051714, 1059699424, -1091030613, 1057805441) + + W(6, -1112978295, -1101649503, -1142433873, -1138065032) + + W(7, 1049542158, 1027406094, 1036599707, -1117298502); + WS(-1083489614, -1078579141); + sum1 = W(0, -1113694287, 1048897616, -1104500498, 1029397720) + + W(1, 1039983475, -1099529286, 1047818144, -1100400745) + + W(2, -1091060438, -1104759380, -1089217572, -1096433234) + + W(3, -1090900481, -1103761763, -1126261903, -1098862766) + + W(4, 1048678744, 1055607032, 1025763911, 1056656214) + W(5, 1055730826, 1039576037, 1050842685, 1044462332) + + W(6, 1022130309, 1045345264, -1098656951, 1045280313) + + W(7, 1003335600, -1104729181, 1045845834, -1124798927); + sum2 = W(0, 1034867092, 1036831152, -1155378720, 1050005016) + + W(1, -1109019109, -1107857756, 1025727369, -1105627363) + + W(2, -1113896283, 1008734783, -1107821706, 1036439980) + + W(3, -1105188391, -1103852014, -1113326142, 1036502992) + + W(4, -1089397746, -1143881728, -1090933436, 1067046868) + + W(5, 1074023168, 1073004488, 1071596064, 1068047188) + W(6, 1053130734, 1048547317, 1050664536, -1081990202) + + W(7, -1073616958, -1073650181, -1078582463, -1079035066); + WS(-1123566816, -1118788492); + sum1 = + W(0, 1034266605, -1136553988, 1032767842, -1119057557) + W(1, 1032596498, -1138237144, 1034235800, 1038972738) + + W(2, -1131696345, 1054570946, 1043367745, 1057910725) + W(3, 1051309065, 1050053561, 1044754161, 1047609962) + + W(4, -1102436480, -1101485920, -1093672570, -1081257723) + + W(5, -1104247863, -1097237249, -1100737384, -1118734125) + + W(6, 1029920799, 1027694719, 1029228634, 1038070160) + W(7, 1041012541, -1104490509, 1036672371, -1101643609); + sum2 = W(0, 1001205015, 1006355343, 1030505158, -1119701641) + + W(1, 1039794598, -1107202062, 1026836118, -1115440174) + + W(2, -1108935456, 1048575251, -1114918170, -1088419213) + + W(3, 1032736312, 1045905661, -1116946341, 1003805295) + + W(4, -1123729961, 1037564428, -1096130861, -1068662368) + + W(5, 1076967646, 1068403675, -1104305708, -1124006983) + + W(6, -1151981614, -1123825361, 1015236500, -1095410362) + + W(7, 1049774729, -1105335733, 1050153445, -1103176791); + WS(-1103567160, 1051728620); + sum1 = W(0, 1022317012, -1105517764, -1109296554, 1030946149) + + W(1, 1032988986, -1117957958, 1025729823, 1009731405) + W(2, 1037463598, 1027268637, 1052072875, -1094107172) + + W(3, -1087396213, -1098739651, -1104965205, 1017302004) + + W(4, -1094952698, -1107670055, -1103880757, 1052944567) + + W(5, 1057943536, 1052382091, 1036164793, 1041821631) + W(6, 1033922872, 1024776175, 1038888053, 1043766492) + + W(7, -1110506946, -1108829569, -1132271979, 1015545129); + sum2 = + W(0, 1031290011, -1114551402, -1137203270, 1025723227) + W(1, 1020823723, -1107112701, -1156747895, -1140368490) + + W(2, -1127050317, 1026829489, 1032334734, -1098446681) + W(3, 1041359246, 1041376772, 1034398482, -1104694439) + + W(4, -1113481669, 1042490649, 1043198364, -1127701979) + + W(5, 1057793899, -1100591458, -1114292550, 1037536680) + + W(6, -1080536402, -1076466135, 1038797044, 1074254195) + + W(7, 1035340712, -1118262367, 1013380262, 1032104302); + WS(-1106439480, 1029090439); + sum1 = W(0, 1034559195, -1151887836, 1020849475, 1042053132) + W(1, 1043127920, 1043814293, 1037260390, 1043715864) + + W(2, 1042655458, 1030625962, 1059377738, -1084013087) + W(3, -1107145304, 1032281331, 1040913704, 1033172451) + + W(4, -1102396839, -1115609614, -1089162129, -1083731653) + + W(5, 1052971191, -1107154457, -1113717087, 1017680531) + W(6, 1026400220, 1035325646, 1042909598, 1039293086) + + W(7, 1029716960, 1024778063, 1028666946, -1130742978); + sum2 = W(0, -1129107524, -1123636938, -1116921954, 1035143287) + + W(1, 1036996009, 1026655402, -1117010042, -1126794884) + + W(2, 1021999108, -1148550480, -1104180688, 1058583951) + + W(3, -1112895549, -1116180274, -1131502740, -1138164712) + + W(4, 1022835844, 1016982596, 1016773924, 1054454385) + + W(5, -1097314323, -1099699990, -1132536424, -1129763396) + + W(6, -1129901940, -1140398984, 1030858450, -1117386658) + + W(7, -1108156993, -1118751234, 1016259828, -1117013506); + WS(1048151864, 1059242544); + sum1 = W(0, -1122367849, -1121466768, 1042165293, -1116044868) + + W(1, -1105437493, 1037358179, -1125163356, -1111398955) + + W(2, -1097114939, -1097911384, -1085899247, 1042506911) + + W(3, 1056857214, -1105063934, -1123578292, -1106114902) + + W(4, 1043794348, 1033810391, 1063564267, 1042284551) + W(5, -1089674786, 1049648847, 1021855394, 1045389303) + + W(6, 1026875087, 1014185912, -1106211614, -1111561384) + + W(7, 1040868541, 1028107682, -1111395274, 1010402126); + sum2 = W(0, -1139648101, -1108856547, 1015236663, -1095822659) + + W(1, -1137977893, 1038373686, 1015865663, 1025690243) + W(2, -1110557326, 1041627874, 1032833232, 1054902128) + + W(3, -1098765424, -1121592121, -1106594443, -1117564251) + + W(4, -1106733442, -1106727608, 1048813377, 1055403310) + + W(5, -1097123375, 1045561320, -1106386080, 1017823319) + W(6, 1039330638, 987619817, 1025349119, -1095503796) + + W(7, 1050144719, -1108448514, 1041979856, -1105901385); + WS(1058511566, 1043187024); + sum1 = W(0, 1042620242, 1027981614, 1037513401, 1050564856) + W(1, 1040390932, 1044188393, 1032851398, 1043046140) + + W(2, 1041476871, 1044640335, 1039039385, -1085132912) + + W(3, -1095196494, -1116362934, -1107832665, -1105825814) + + W(4, -1106861387, -1120607404, -1101062960, -1089194338) + + W(5, 1032203084, -1134658518, 1026497359, -1105488567) + W(6, 1043942651, 1040914531, 1040902562, 1048598306) + + W(7, 1019897185, 1032634704, 1027555603, 1032742569); + sum2 = + W(0, -1094808435, -1132385524, -1110994277, 1039748829) + W(1, 1038866141, 1012861192, 1030487914, -1132742376) + + W(2, -1083260450, -1089624726, -1098133391, 1063143581) + W(3, 1043371703, 1040218148, 1012758152, 1052570990) + + W(4, 1041967320, -1102801635, 1050258559, 1037743779) + W(5, 1048943341, -1112998265, 1031702418, -1105604919) + + W(6, 1026111290, 1034887813, -1123786474, 1033106845) + + W(7, -1110363077, -1121754906, 1012203560, -1111765769); + WS(-1087236686, 1061665912); + sum1 = W(0, -1115274057, -1116162424, -1104461343, -1093387666) + + W(1, -1113556238, -1115159031, -1126942285, -1121543315) + + W(2, 1023071688, 1030200068, 1054050807, 1067462106) + W(3, 1050597447, 1031104576, -1121547516, 1042315272) + + W(4, -1107980923, -1101866270, -1092884195, 1056570668) + + W(5, 1044256537, -1106234576, -1128835891, -1114796114) + + W(6, -1119301463, -1128116268, -1109238785, -1095571507) + + W(7, -1103733247, -1111522325, -1111458030, -1109780718); + sum2 = + W(0, -1127633710, 1024854732, -1123781128, 1040493279) + W(1, -1105896535, 1033983514, -1122459292, -1120616672) + + W(2, 1024134807, 1020748524, -1117094752, 1065417820) + W(3, 1047826025, -1102101577, 1040101538, -1124130304) + + W(4, -1114424195, -1098546148, -1079772750, 1059484680) + + W(5, -1107504040, 1049649199, -1105983778, 1041220419) + + W(6, -1109129714, 1025355297, -1102118069, -1114766469) + + W(7, 1033237727, -1154145757, 1012710689, -1123999628); + WS(-1092106140, -1084163121); + sum1 = W(0, 1036347305, 1016904817, 1034414494, 1040590819) + W(1, 1047670567, 1030378702, -1114654031, 1037868673) + + W(2, 1049849489, 1040213041, 1056746079, 1048812489) + W(3, -1084779712, 1040726752, 1033236350, 1034988241) + + W(4, -1101083230, -1152694122, -1083169173, -1107117385) + + W(5, 1051667767, -1109066592, 1024925978, -1107106473) + + W(6, -1106738110, -1115216475, 1039797369, 1022569263) + + W(7, -1112982247, -1125038036, 1025136605, -1146668256); + sum2 = W(0, -1144361879, -1128843246, 1005924247, -1104940693) + + W(1, -1123234701, 1030348431, 1032437115, 1024671661) + + W(2, -1111008682, -1134810723, 1041181160, 1054697191) + + W(3, 1052731012, 1042931729, -1112071203, -1111460488) + + W(4, -1092072719, -1121102479, 1045581242, 1046555600) + + W(5, -1103970223, -1104348933, -1113690885, -1129885552) + + W(6, 1021883158, -1116668390, -1109114373, -1113715104) + + W(7, -1128555074, 1032936433, -1136719027, -1114960949); + WS(1058637774, -1109876822); + sum1 = + W(0, -1123254812, 1041301297, -1108082435, -1113241451) + W(1, -1110973875, 1027216056, 1014894339, 1019588394) + + W(2, 1042623060, -1105094644, 1059472952, 1043969956) + W(3, -1113269955, 1026816394, -1130602892, 1026167148) + + W(4, -1126486401, -1111052512, -1094910408, -1094009726) + + W(5, 1058531737, -1100061186, 1032486130, -1117291247) + W(6, -1112485473, 1037949088, 1016105496, 1038892497) + + W(7, -1093047519, 1032398170, -1128303438, 1021704844); + sum2 = + W(0, 1019183838, 1031923668, 1049015983, -1096362417) + W(1, 1005830618, 1036998273, -1119396253, -1125844722) + + W(2, -1103677237, 1026573624, -1101357077, 1060010174) + W(3, -1122620605, -1106684685, 1023743335, 970656667) + + W(4, 1041385745, 1025625867, -1095136476, -1096248497) + + W(5, -1115221092, 1049273019, -1112424814, 1011280453) + + W(6, -1115238116, 1024201143, 1024442030, -1122837727) + W(7, 1034369966, 1031554545, 1004099770, 1010302645); + WS(1068382951, -1145853862); + sum1 = W(0, -1109092968, -1120835030, 1015957108, 1033165317) + + W(1, 1015780402, -1098982451, -1106789039, -1105810191) + + W(2, -1104283584, -1104742016, -1087137628, -1082841532) + + W(3, 1048723479, -1119342334, 1037068029, 998682871) + W(4, -1126224104, 1048835390, 1060142968, 1050512116) + + W(5, 1050625794, 1046183055, 1033167819, 1042826568) + W(6, -1142984099, 1035504970, 1044651720, 1036256010) + + W(7, 1040271692, -1112268532, -1115364877, -1113754717); + sum2 = + W(0, 1042289605, -1123754179, 1040865617, 1025996190) + W(1, -1100913998, -1118459936, -1114401734, -1118182115) + + W(2, -1105845074, 1032442894, -1090127653, 1055606718) + W(3, -1104101067, 1026136504, 1031986833, 1045409779) + + W(4, -1105090355, -1106552079, -1075116096, 1073431719) + + W(5, 1067916428, 1042119939, -1112990087, 1031635830) + W(6, 1041479887, 1028813354, -1087510643, -1084272058) + + W(7, 1045036562, -1131666845, 1021173748, -1131440550); + WS(-1115823328, -1115141930); + sum1 = W(0, 994860217, 1043355533, 1046651158, 1031967699) + W(1, -1112906011, -1139800861, 1032268536, 1021673189) + + W(2, -1096937968, -1093401724, -1082957735, 1057829358) + + W(3, 1054780763, 1049387203, 1029694230, 1032667294) + W(4, 1034643656, 1045563268, 1056739037, 1053028032) + + W(5, -1085595451, -1100812438, -1112691098, -1163065290) + + W(6, 1022968545, -1100277972, -1106135459, -1113373017) + + W(7, 1036473238, 1042166401, -1109328859, 1026417494); + sum2 = W(0, 1041009418, -1106230161, -1113994011, -1100787264) + + W(1, -1102450993, -1114680808, 1031764893, -1145068408) + + W(2, 1006794492, 1034312638, -1108126219, 1060460225) + + W(3, -1119222967, -1097084093, -1125377404, -1105852265) + + W(4, 1023178506, -1120362931, -1105213924, 1054015707) + + W(5, 1053508358, -1133314452, -1141774536, -1120752408) + + W(6, -1126244586, 1021996758, -1131146954, 997147503) + + W(7, -1107185372, -1126416406, -1126617106, -1131039214); + WS(1044911928, 1063248560); + sum1 = + W(0, -1117210934, 1045807559, -1116245664, -1122601008) + W(1, 1041679280, -1102494868, 1044187563, -1101059428) + + W(2, -1089987573, 1006551364, -1085623154, -1098705597) + + W(3, -1089608778, -1098692501, 1040126000, -1100421777) + W(4, 1050931427, 1049202419, 1044690392, 1056494849) + + W(5, 1054654497, 1047881833, 1043119951, 1043071666) + W(6, -1154913199, 1049427019, -1098224261, 1043742399) + + W(7, 1009817082, -1102952115, 1048685800, -1132265536); + sum2 = W(0, -1110897864, -1104703066, 1039476246, -1102025112) + + W(1, 1041770976, 1044782005, -1112640404, 1045848501) + + W(2, 1031814971, -1126406622, -1112535334, -1088994686) + + W(3, 1050082866, 1038057456, 1029663347, -1098794387) + W(4, 1060526454, 1034850394, 1060516426, -1088701567) + + W(5, -1072347435, -1075073775, -1077197270, -1081012351) + + W(6, -1090228093, -1097166620, -1091926928, 1063814816) + + W(7, 1074296249, 1073862535, 1067261757, 1067785227); + WS(-1105546040, 1026157880); + sum1 = W(0, 1040950836, 1036866652, 1045419231, 1057171433) + W(1, 1039696013, 1040737235, 1031337694, 1043417390) + + W(2, 1040614249, 1043435937, 1048836647, -1092874056) + W(3, 1049109967, 1037560064, 1039556030, 1020658754) + + W(4, -1102499357, 1032157499, -1088963702, -1078642173) + + W(5, -1094603626, 999044599, -1107844556, -1101965321) + W(6, 1036650571, 1032871003, 1035867609, 1040635958) + + W(7, 1039966133, 1035782037, 1034875342, 1029450491); + sum2 = W(0, 999804672, 965076992, 1017997216, -1113573416) + W(1, 1015814944, 1013150208, 1004325632, -1116017408) + + W(2, 1033414560, -1142972544, -1117537424, -1080122522) + + W(3, -1116987776, 1009041344, 1030258512, -1123867424) + + W(4, -1131242272, -1152459008, 1043660652, 1068973644) + + W(5, -1113471168, 1023678672, -1115573696, 1025739248) + + W(6, -1111239120, -1114613368, 1024438240, 1009242816) + + W(7, 1026341216, -1111376032, -1124670336, 1011147520); + WS(-1081027239, 1060388068); + sum1 = W(0, 1040945153, 1018532824, 1048158700, 1050078256) + W(1, 1043330564, 1045983912, 1034126717, 1042366848) + + W(2, 1049191505, 1052335227, 1053224518, -1089652372) + W(3, 1050009062, 1019623144, 1043374892, 1037373643) + + W(4, -1103567931, -1106690587, -1098210230, -1079677805) + + W(5, -1090769236, -1102526621, -1113976903, -1106920486) + + W(6, -1142725077, -1126830164, 1044049241, 1037048166) + + W(7, 1037549983, -1124021470, 1031972104, 1000910717); + sum2 = W(0, 1029289565, 1023484285, 1041097307, 1044843621) + + W(1, -1101664529, -1108647964, -1111945130, -1129898257) + + W(2, -1119356133, 1031916514, -1120749829, 1057057740) + + W(3, 1055633817, -1098024997, 1038083406, -1101101054) + + W(4, -1126159585, -1111485988, -1121314077, 1024531885) + + W(5, -1102656055, 1016983721, -1105960100, 1022769465) + + W(6, -1119814653, -1133461586, -1112201820, 1001931237) + + W(7, 1035253182, 1019582313, 1011319026, -1110859200); + WS(-1121436896, -1083449266); + sum1 = W(0, -1131437006, -1126965659, -1106898372, 1049661628) + + W(1, -1110051320, 1048826500, 1018834023, 1030351624) + W(2, 1057845458, 1026072602, 1058188821, 1047051462) + + W(3, 1036301673, 1049513187, 1026266705, 1043516478) + + W(4, -1096100393, -1106937331, -1089458543, -1093909527) + + W(5, -1105302990, -1097831955, -1115312055, -1094725407) + + W(6, -1112818966, 1025271436, -1120770471, 1039868950) + + W(7, -1101852248, 1048680544, -1111779257, -1137214404); + sum2 = W(0, 1025140224, 1016993788, -1106156741, -1085967118) + + W(1, -1070014283, -1066270592, -1089828448, -1115300709) + + W(2, -1118806788, 1030590564, 1042721449, 1078987048) + W(3, 1078555235, 1069325982, 1051485796, 1026006822) + + W(4, -1126785121, -1118559458, -1106137914, -1100137345) + + W(5, 1044823121, -1105174392, -1121082393, 1011662011) + W(6, 1031495588, 991152164, 1038491925, 1040984057) + + W(7, -1111978905, 1030579932, -1113499951, -1120641633); + WS(1060473294, -1125032523); + sum1 = W(0, -1118381578, -1131528546, -1103035725, 1044891665) + + W(1, 1017562024, 1038728371, 1013193724, 1017619335) + W(2, 1043924207, 1048790648, 1057928103, -1096003632) + + W(3, -1104437021, -1127678449, -1138265298, 1019650740) + + W(4, 1028842287, -1094915206, 1048586166, -1089668066) + + W(5, 1048997587, -1106021950, 1016196772, -1112334062) + + W(6, -1103983036, 1032416951, -1131359957, 1041536420) + + W(7, -1119623443, 1026802338, -1112764523, 1028850580); + sum2 = W(0, -1124013145, -1154979909, -1113455493, 1042673063) + + W(1, 1009341589, -1131887235, -1126494367, -1120394460) + + W(2, 1023871771, -1104183315, 1024353365, -1099433949) + + W(3, 1037029004, -1106752952, -1136822537, -1135604889) + + W(4, 1041717973, -1104961174, -1071159846, 1075222357) + + W(5, 1061754151, -1106459992, 1037905746, 1020599743) + + W(6, 1027246941, -1105906795, -1114760758, 1048045634) + + W(7, -1101645527, 1027783079, -1130069351, 1023779471); + WS(1063175758, 1049951270); + sum1 = W(0, 1051934199, 1041620825, 1053157077, 1019501037) + W(1, -1121035141, 1024394007, 1034798936, 999909159) + + W(2, -1084051495, -1091045702, -1089200998, -1103613676) + + W(3, -1103906809, 1042850683, -1117239270, -1106705027) + + W(4, 1040719576, 1046456792, 1054477181, 1050464826) + + W(5, -1098419444, -1097805325, 1011564046, -1091232034) + + W(6, 1028219745, 1028165760, -1110307566, 1037889601) + W(7, 1045652053, 1054554722, 1031152711, 1056053333); + sum2 = + W(0, -1091471926, 1042259987, -1103057728, 1049412228) + W(1, 1044973062, -1116401558, 1011000463, -1130123924) + + W(2, 1062079447, -1095572989, -1089203271, -1092861102) + + W(3, 1034556296, 1047552828, -1110031497, 1051271629) + W(4, 1055700238, 1041645665, 1037140407, -1093629070) + + W(5, -1095940003, -1106623325, -1107294450, 1053844390) + W(6, 1015596856, 1033532620, 1035045090, 1042934527) + + W(7, 1032040702, -1106239816, 1033073048, -1095799213); + WS(-1085388366, -1090694979); + sum1 = W(0, -1123787314, -1119481145, 1032777214, -1112850502) + + W(1, 1041751591, -1125429276, -1140788444, -1113892940) + + W(2, 1044273497, -1130943626, 1047368143, 1059845268) + W(3, -1095680144, 1039407200, 990533574, 1032644049) + + W(4, -1108110651, 1041576542, -1087220302, 1027588771) + + W(5, 1036323946, -1111657568, 1021334836, -1143449895) + + W(6, -1115475932, -1117135031, 1040347561, -1101064470) + + W(7, 1037523789, -1126225621, -1134357621, -1109271006); + sum2 = W(0, -1107190004, 1013881877, -1118295314, -1121103222) + + W(1, -1127822751, -1115317828, -1126179247, -1114801766) + + W(2, 1037736456, -1105376838, -1123416196, 1042717593) + + W(3, -1115549939, 1043660085, -1126402007, 1040920849) + + W(4, -1125693587, 1040619572, -1082924015, 1068021664) + + W(5, 1016978358, -1108863865, -1136349779, -1107267301) + + W(6, -1120404934, -1122228614, 1051908042, -1087341114) + + W(7, 1042189807, -1125959243, 1038966556, 1023515477); + WS(1065904679, -1122628785); + + return clamp(mstd0 + 5.0 * vsum / wsum * mstd1, 0.0, 1.0); +} + +shared float inp[525]; + +#define CURRENT_PASS 2 + +#define GET_SAMPLE(x) dot(x.rgb, rgb2y) +#define imageStore(out_image, pos, val) imageStoreOverride(pos, val.x) +void imageStoreOverride(uint2 pos, float value) { + float2 UV = mul(rgb2uv, INPUT.SampleLevel(sam_INPUT_LINEAR, HOOKED_map(pos), 0).rgb); + OUTPUT[pos] = float4(mul(yuv2rgb, float3(value.x, UV)), 1.0); +} + +#define INPUT_tex(pos) GET_SAMPLE(vec4(texture(INPUT, pos))) +static const float2 INPUT_size = float2(GetInputSize()); +static const float2 INPUT_pt = float2(GetInputPt()); + +#define temp_tex(pos) (float(texture(temp, pos).x)) +static const float2 temp_size = float2(GetInputSize().x * 1, GetInputSize().y * 2); +static const float2 temp_pt = float2(1.0 / (temp_size.x), 1.0 / (temp_size.y)); + +#define HOOKED_tex(pos) temp_tex(pos) +#define HOOKED_size temp_size +#define HOOKED_pt temp_pt + +void Pass2(uint2 blockStart, uint3 threadId) { + ivec2 group_base = ivec2(gl_WorkGroupID) * ivec2(gl_WorkGroupSize); + int local_pos = int(gl_LocalInvocationID.x) * 15 + int(gl_LocalInvocationID.y); + for (int id = int(gl_LocalInvocationIndex); id < 525; id += int(gl_WorkGroupSize.x * gl_WorkGroupSize.y)) { + uint x = (uint)id / 15, y = (uint)id % 15; + inp[id] = + HOOKED_tex(HOOKED_pt * vec2(float(group_base.x + x - (1)) + 0.5, float(group_base.y + y - (3)) + 0.5)).x; + } + barrier(); + vec4 ret = vec4(0.0, 0.0, 0.0, 0.0); + vec4 ret0 = vec4(0.0, 0.0, 0.0, 0.0); + vec4 samples[8]; + samples[0][0] = inp[local_pos + 0]; + samples[0][1] = inp[local_pos + 1]; + samples[0][2] = inp[local_pos + 2]; + samples[0][3] = inp[local_pos + 3]; + samples[1][0] = inp[local_pos + 4]; + samples[1][1] = inp[local_pos + 5]; + samples[1][2] = inp[local_pos + 6]; + samples[1][3] = inp[local_pos + 7]; + samples[2][0] = inp[local_pos + 15]; + samples[2][1] = inp[local_pos + 16]; + samples[2][2] = inp[local_pos + 17]; + samples[2][3] = inp[local_pos + 18]; + samples[3][0] = inp[local_pos + 19]; + samples[3][1] = inp[local_pos + 20]; + samples[3][2] = inp[local_pos + 21]; + samples[3][3] = inp[local_pos + 22]; + samples[4][0] = inp[local_pos + 30]; + samples[4][1] = inp[local_pos + 31]; + samples[4][2] = inp[local_pos + 32]; + samples[4][3] = inp[local_pos + 33]; + samples[5][0] = inp[local_pos + 34]; + samples[5][1] = inp[local_pos + 35]; + samples[5][2] = inp[local_pos + 36]; + samples[5][3] = inp[local_pos + 37]; + samples[6][0] = inp[local_pos + 45]; + samples[6][1] = inp[local_pos + 46]; + samples[6][2] = inp[local_pos + 47]; + samples[6][3] = inp[local_pos + 48]; + samples[7][0] = inp[local_pos + 49]; + samples[7][1] = inp[local_pos + 50]; + samples[7][2] = inp[local_pos + 51]; + samples[7][3] = inp[local_pos + 52]; + ret[0] = nnedi3(samples); + ret0[0] = inp[local_pos + 18]; +#if CURRENT_PASS == LAST_PASS + uint2 destPos = blockStart + threadId.xy * 2; + uint2 outputSize = GetOutputSize(); + if (destPos.x >= outputSize.x || destPos.y >= outputSize.y) { + return; + } +#endif + imageStore(out_image, ivec2(gl_GlobalInvocationID) * ivec2(2, 1), ret0); + imageStore(out_image, ivec2(gl_GlobalInvocationID) * ivec2(2, 1) + ivec2(1, 0), ret); +} diff --git a/src/Effects/NNEDI3/NNEDI3_nns128_win8x6.hlsl b/src/Effects/NNEDI3/NNEDI3_nns128_win8x6.hlsl new file mode 100644 index 000000000..c3835c5ad --- /dev/null +++ b/src/Effects/NNEDI3/NNEDI3_nns128_win8x6.hlsl @@ -0,0 +1,5735 @@ +// This file is generated by the scripts available at https://github.com/hauuau/magpie-prescalers +// Please don't edit this file directly. +// Generated by: nnedi3.py --nns 128 --win 8x6 --use-compute-shader --use-magpie +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +//!MAGPIE EFFECT +//!VERSION 4 +//!SORT_NAME NNEDI3_128_6 + +//!TEXTURE +Texture2D INPUT; + +//!SAMPLER +//!FILTER POINT +SamplerState sam_INPUT; + +//!TEXTURE +//!WIDTH INPUT_WIDTH * 1 * 2 +//!HEIGHT INPUT_HEIGHT * 2 * 1 +Texture2D OUTPUT; + +//!SAMPLER +//!FILTER LINEAR +SamplerState sam_INPUT_LINEAR; + +//!TEXTURE +//!FORMAT R16_FLOAT +//!WIDTH INPUT_WIDTH * 1 +//!HEIGHT INPUT_HEIGHT * 2 +Texture2D temp; + +//!SAMPLER +//!FILTER POINT +SamplerState sam_temp; + +//!COMMON +#include "prescalers.hlsli" + +#define LAST_PASS 2 + +//!PASS 1 +//!DESC NNEDI3 (double_y, nns128, win8x6) +//!IN INPUT +//!OUT temp +//!BLOCK_SIZE 32, 16 +//!NUM_THREADS 32, 8 +#pragma optionNV(inline none) +float nnedi3(vec4 samples[12]) { + float sum = 0.0, sumsq = 0.0; + [unroll] for (int i = 0; i < 12; i++) { + sum += dot(samples[i], vec4(1.0, 1.0, 1.0, 1.0)); + sumsq += dot(samples[i], samples[i]); + } + float mstd0 = sum / 48.0; + float mstd1 = sumsq / 48.0 - mstd0 * mstd0; + float mstd2 = mix(0.0, inversesqrt(mstd1), mstd1 >= 1.192092896e-7); + mstd1 *= mstd2; + float vsum = 0.0, wsum = 0.0, sum1, sum2; +#define T(x) intBitsToFloat(x) +#define W(i, w0, w1, w2, w3) dot(samples[i], vec4(T(w0), T(w1), T(w2), T(w3))) +#define WS(w0, w1) \ + sum1 = exp(sum1 * mstd2 + T(w0)); \ + sum2 = sum2 * mstd2 + T(w1); \ + wsum += sum1; \ + vsum += sum1 * (sum2 / (1.0 + abs(sum2))); + sum1 = W(0, -1138315554, 1017020226, 1054031418, -1098719688) + + W(1, -1110814528, -1144117236, -1151849881, -1120184142) + + W(2, 1052033568, -1094289569, 1026313661, 1029415347) + + W(3, -1130100551, -1113913797, 1057266643, -1094215666) + + W(4, -1136459684, -1122295896, -1139428474, -1137890034) + + W(5, 1050615732, -1084764287, 1037955767, -1158862002) + + W(6, -1115186183, -1105019328, 1060278709, -1093503073) + + W(7, -1125342359, -1115484761, 1024054031, 1030136834) + + W(8, 1051842684, -1122358095, -1118592012, 1027215228) + + W(9, -1123693866, -1119041199, 1049323809, -1104408867) + + W(10, -1141919603, -1148196514, -1134121575, 1009291685) + + W(11, 1050624038, -1101060057, -1117980571, -1131405947); + sum2 = + W(0, 1011608699, -1112090344, 1035039469, 1018826733) + W(1, -1130070276, -1126912052, 1021515189, 1032910614) + + W(2, -1112298310, -1103038162, 1030536589, 1027816837) + + W(3, -1133688887, -1111235489, 1068933685, 1035541017) + + W(4, 1002846254, -1119314146, -1109181339, 1050015381) + + W(5, 1079505355, -1096237270, 1047170650, -1132054353) + W(6, 1032724543, 1041065097, -1082386736, 1051919390) + + W(7, 1012706615, 1004049262, -1120491130, -1106592726) + + W(8, -1067816278, -1101133158, -1108914015, 1017068057) + + W(9, 997621755, -1112521193, -1094139890, -1120644044) + W(10, 1011888367, 1020965593, 1020760181, 1032648390) + + W(11, -1123411157, 1029904493, -1115273665, 1017829425); + WS(1038714296, 1044827315); + sum1 = W(0, 1008773074, -1137155124, 1058392080, -1100726684) + + W(1, -1097060854, 1034472653, 1000000044, -1139148008) + + W(2, 1051571686, -1106613964, 1034039029, -1136883834) + + W(3, -1125197471, -1110040196, 1058043460, -1093356205) + + W(4, -1112523275, 1033872898, -1155069097, -1114984084) + + W(5, 1059856605, -1087655353, -1137125990, -1122772178) + + W(6, -1128457331, -1117135435, 1053821137, -1093486798) + + W(7, -1134047198, -1125370043, -1147450330, 1038803511) + + W(8, 1050763009, -1088451200, -1131894321, 1027534056) + + W(9, -1142834606, -1110360429, 1046500044, -1109846237) + + W(10, 1021083253, -1126166913, -1131672268, 1046900069) + + W(11, 1049636107, -1093848946, -1108292068, 1020331091); + sum2 = W(0, -1123255245, -1116671780, 1046375724, 1061532718) + W(1, 998291536, -1094346395, 982126402, -1111301077) + + W(2, 1053914306, 1066141278, 1041257894, -1108898352) + W(3, 1020504368, 1011773496, 1013495848, 1064263836) + + W(4, 1023442398, 1023084860, 1036976721, -1102830064) + + W(5, -1106352300, 1055449836, -1101238723, 1037821947) + + W(6, -1113656730, 1031803093, -1103067006, -1076699072) + + W(7, -1103198508, -1123876988, -1157600449, 1045043848) + + W(8, -1094946683, -1085904680, 1048924521, 1041381351) + + W(9, -1129338356, 1026389126, 1036977493, -1099822488) + + W(10, -1109968297, -1109391389, 1032297389, 1022832316) + + W(11, -1098417421, -1092845936, 1053328593, 1023206676); + WS(-1087781687, -1134030789); + sum1 = + W(0, 1028179002, -1113846601, -1090428884, 1056064759) + W(1, -1116809458, -1123784128, 1037437606, -1129634048) + + W(2, -1098510574, 1049319247, -1105760812, 1016685513) + + W(3, -1106850597, 1045066941, -1095161561, 1048732210) + + W(4, 1007721067, -1105661778, 1040743460, -1108576055) + W(5, -1094444002, 1054487227, 1050640540, 1048222150) + + W(6, -1123964671, 1030205873, -1095134094, 1044300425) + + W(7, 1040160031, -1110013906, -1122790273, -1117192467) + + W(8, -1098192922, 1055338520, -1106372902, 1033480951) + W(9, 1036030878, 1027547489, -1101066654, 1034894336) + + W(10, -1109703824, -1112122819, 1027799500, -1110675758) + + W(11, -1095206484, 1053272331, -1138309939, 1033810456); + sum2 = W(0, 1023697539, -1119401943, 1010071413, 1025267901) + W(1, 988018625, -1122026299, -1134698244, 1013558867) + + W(2, -1112961274, 1033970227, -1116217767, 1005039212) + + W(3, 1018187921, -1119659280, 1019163177, 1048742053) + + W(4, -1103390691, -1115786374, 1024534132, 1038666215) + + W(5, -1097296472, 1082848284, -1064739318, 1042066180) + + W(6, -1145140771, -1120396841, 1033089456, 1060700209) + + W(7, -1086947071, 1017803659, -1142625275, 1035154544) + + W(8, -1105855221, -1115995862, 1042818438, -1115628759) + + W(9, -1141296989, -1131590401, -1156341795, 1035612397) + + W(10, -1109434149, -1150181080, 1007645751, 1021197862) + + W(11, -1120357988, -1123714371, 1029308077, 1011442501); + WS(1060770743, -1108197568); + sum1 = + W(0, 1016886775, 1029069588, -1095627128, 1046558478) + W(1, -1146067869, 1009558662, -1160198547, 1038531041) + + W(2, -1096395039, 1048524254, -1097778094, 1033422755) + W(3, 1015246637, 1041390628, -1086831062, 1058409012) + + W(4, -1098986327, 1033638277, -1139668038, 1022402527) + W(5, 1057717017, 1050284011, -1110221104, 1029754521) + + W(6, 1034731136, -1103954605, 1056693263, -1083755424) + + W(7, 1042951984, -1119102757, 1019206597, -1112398730) + + W(8, 1053908426, -1092005688, 1037994808, -1130383710) + + W(9, -1123983389, -1117714338, 1043180606, -1101033824) + + W(10, 1025216609, -1114155844, -1115649126, 1039312430) + + W(11, 1038174992, -1131529899, 1000398449, -1129441697); + sum2 = + W(0, -1104188915, 1041755532, 1039915367, 1028942726) + W(1, 1030445090, -1104654601, 1026676440, -1099902739) + + W(2, 1048552390, -1105392496, -1104867005, 1033528857) + + W(3, -1122447814, 1020538503, -1105911641, -1106738713) + + W(4, -1106850996, 989961401, 1024214572, -1096783078) + W(5, 1068731351, 1066518668, -1126700225, -1133955554) + + W(6, 1036156927, -1094671115, -1096057439, -1122053390) + + W(7, 1025639958, -1153726297, 1039804037, -1096595186) + + W(8, -1091471401, -1123632409, -1113480650, 1032072745) + + W(9, -1140508998, -1108992818, 1033306823, 1032650381) + + W(10, -1115144981, -1128986161, 1023379743, 1023478108) + + W(11, -1096750685, -1109607147, 1031767054, 1023561226); + WS(-1105940700, 1068951582); + sum1 = + W(0, 1000087558, -1126610867, 1040363554, -1103531583) + W(1, -1126498674, 1033586531, 1035444041, -1119652358) + + W(2, 1048983991, -1095183320, 1041424541, 1011542187) + W(3, 1016288952, -1105308514, -1129232537, 1035540828) + + W(4, -1116171169, 1018737568, 1033866603, 1025089333) + W(5, 1043404182, -1091977028, -1108874003, 1021129404) + + W(6, 1023501510, -1101500686, 1050470779, -1098956255) + W(7, -1107291841, 1033496245, 1030903912, 1024487034) + + W(8, 1032787659, 1016827662, -1115835365, 1023594100) + W(9, -1121882082, 1036868116, 1042688239, -1107477027) + + W(10, 1038297635, 1015384473, -1139243976, -1137536646) + + W(11, 1051055933, -1111432589, -1101253029, 1034920923); + sum2 = W(0, -1123978268, -1102554320, 1043643239, 1026913323) + + W(1, 1031431539, -1112242992, -1122059260, 1044079872) + + W(2, -1111536011, 1056944699, 1037617295, 1005844362) + + W(3, -1123592170, -1093658955, 1042723115, -1093217948) + + W(4, -1103624535, -1101249260, 1036141312, -1094337979) + + W(5, 1067907418, 1064662115, -1090550375, 1042545272) + + W(6, -1111710804, 1045282706, -1118927202, -1091166584) + + W(7, -1119161360, -1111294278, -1127043568, -1139302445) + + W(8, 1035940631, -1092135065, -1112133073, 1025042022) + W(9, 1040694361, 983065168, 1016057395, 1041761864) + + W(10, 1014979737, 1026789959, -1120657957, -1105233712) + + W(11, 1027935282, -1104693620, -1106943303, -1114223884); + WS(1061289911, -1074625008); + sum1 = + W(0, -1118986355, 1035013222, 1058027688, -1087592511) + W(1, -1107213995, 1048036382, 1042690449, -1110099132) + + W(2, 1047068971, 1013931199, 1008030621, -1106703359) + W(3, 1022020251, 1048074309, 1036127926, -1088015817) + + W(4, 1042727509, 1044183504, 1032007652, -1101544522) + W(5, 1058005973, -1099315493, -1093058723, 1029001296) + + W(6, 1040686510, -1102744618, 1048070472, -1091144488) + + W(7, 1042938237, -1106075703, -1108674269, 1043103143) + W(8, 1057593649, -1088950448, 1002612916, 1048869669) + + W(9, -1123719572, -1099009366, 1043345580, 1033106140) + + W(10, -1110941900, -1107279296, 1033202498, 1038471242) + + W(11, 1055515931, -1090129177, -1113377491, 1042195418); + sum2 = + W(0, 1034897388, 1047600068, -1092005485, 1032211690) + W(1, 1046053217, -1111289614, -1104469346, 1074182899) + + W(2, -1074957140, -1124075063, 981988140, 990179414) + W(3, -1104312342, 1080728354, -1067981267, -1100127529) + + W(4, 1036844207, -1123826485, 1033162274, 1077196082) + + W(5, -1071410100, -1093339345, 1030504779, -1109598746) + + W(6, 1001538203, 1039546617, -1101189403, 1036352485) + W(7, 1025223671, 1036519612, -1119055011, -1121476275) + + W(8, 1042351425, 1008083901, -1101604075, -1146561467) + + W(9, 1036889309, -1113609974, -1113906708, 1032631324) + + W(10, 1034478190, 1017678167, -1122390571, -1124909535) + + W(11, 1037135096, 1002134635, -1113103836, -1132393287); + WS(-1106894556, 1030995446); + sum1 = + W(0, 1025589699, 1033805806, 1034528997, -1098701288) + W(1, -1119393787, 1027839817, -1123387156, 1025291593) + + W(2, 1054610112, -1096105008, 1037953340, -1123546765) + + W(3, 1028556318, -1127599047, 1039781117, -1091536615) + + W(4, -1120434724, 1027349522, -1139656804, -1105750398) + + W(5, 1065523109, -1090836572, -1103173850, 1022652480) + W(6, 980812294, -1104274718, 1054896451, -1097995702) + + W(7, -1111869411, -1135075504, -1128131860, -1117867836) + + W(8, 1045458038, 1039238949, -1104116474, -1125284461) + + W(9, -1137342353, 1018769427, 1040199808, -1110811780) + + W(10, -1129786002, -1152753902, 1017797929, -1114245906) + + W(11, 1047692618, 1001735913, -1106977725, -1131064048); + sum2 = W(0, 1030581609, -1096073996, -1104952058, 1036583621) + + W(1, 1006888722, 1023568502, -1110091164, -1132437108) + + W(2, 1031847146, 1040176294, -1120421639, -1124563800) + W(3, 1024868796, 1051933742, 1077840619, 1056082302) + + W(4, -1114613612, 1026684617, -1124528958, 1042406776) + + W(5, -1071401906, -1080138625, 1012484405, -1114165836) + + W(6, -1175372351, -1117745155, -1108532142, 1039833458) + + W(7, 1044393926, -1139194300, 1022252519, -1117509823) + + W(8, -1107574374, 1041695761, -1112420268, 1023135287) + + W(9, -1123141270, -1110977956, 1034777920, -1119756119) + + W(10, 1028893644, -1122696127, -1123316826, 1029056744) + + W(11, 1034383482, 977900031, 1027961212, 1034470668); + WS(-1094248046, 1034739186); + sum1 = + W(0, -1121641997, 1043421097, -1090462057, 1057979744) + W(1, 1042504017, 1019430629, -1148807918, -1114752489) + + W(2, -1097763033, 1045790578, -1105205440, -1115505835) + + W(3, -1119896808, 1040593858, -1089339622, 1054873978) + W(4, 1029920941, 1008619887, -1118546659, 1043491504) + + W(5, -1089142502, 1054724534, -1114903193, 1038945077) + + W(6, -1117202258, 1033892386, -1089696734, 1056858543) + W(7, -1102740772, 1025474934, 1027770003, 1035924243) + + W(8, -1098379668, 1046524773, 1042806872, -1148381698) + + W(9, -1121511758, 1032482905, -1096843609, 1049846778) + + W(10, -1103488653, 1017864241, -1114510703, 1031829015) + + W(11, -1089945727, 1056083605, 1031492831, 1029503362); + sum2 = + W(0, 1032629114, -1111104155, -1111175727, 1069180600) + W(1, -1092657949, -1081878912, 1024571549, 1022922994) + + W(2, 1047799465, 1065968459, -1106624299, -1085703668) + + W(3, -1123705993, 1036988882, -1121840686, 1066031139) + + W(4, 1026540087, -1080884055, -1120833813, -1104365480) + + W(5, -1098359864, 1064223912, 1044325339, -1079207816) + W(6, 1031286487, 1038064580, 1008715668, 1062275672) + + W(7, 1048614780, -1083548865, -1113289848, -1119955010) + + W(8, -1115327032, 1060225053, -1117772151, -1085294305) + W(9, 1033808184, 1018164430, 1042276675, 1060364945) + + W(10, -1105153406, -1090372695, 1035572024, -1144675449) + + W(11, -1114533548, 1057151625, -1103516228, -1100806033); + WS(-1095016302, 1049780935); + sum1 = + W(0, -1140214663, 1050711943, 1044505338, -1092537964) + W(1, -1110639373, 1025322472, 1008440267, -1110792724) + + W(2, 1051364259, -1101785640, 1026645590, 1024485132) + W(3, -1137823987, 1036012635, 1051977632, -1091742968) + + W(4, -1130979716, 1018037601, 1035221148, -1104496021) + + W(5, 1058946996, -1090015552, -1106527650, 1032762847) + + W(6, 1007510683, -1145733059, 1056967247, -1090979415) + + W(7, -1146016549, 1010918699, 1029727784, -1109552317) + W(8, 1057598839, -1088424934, 1015167915, 1027572437) + + W(9, -1142229143, -1115585956, 1050931556, -1096995861) + + W(10, 1009720606, -1127055707, 1025812851, -1142816275) + + W(11, 1058283380, -1095074239, -1105047309, 1011865435); + sum2 = W(0, 1040969494, -1087779211, 1056604611, 1059045592) + W(1, -1085730308, 1035668628, 1036141535, 1033693595) + + W(2, -1095617275, 1037950807, 1051875566, -1110274633) + + W(3, -1136101349, -1096934819, 1057610078, 1059474718) + + W(4, -1104408796, -1106464684, 1015318832, 1042126031) + + W(5, 1059711341, 1079595174, 1011257519, -1106179801) + + W(6, -1112220931, 1036377831, -1098744628, 1065421414) + + W(7, -1102027272, 1035078820, -1111621316, 1046621966) + + W(8, -1088974739, -1079659864, -1097874228, 1045400280) + + W(9, 1042180910, -1129542795, -1112239718, -1077353318) + + W(10, -1123714793, -1122902412, -1115487487, 1052735842) + + W(11, -1089093989, -1076641223, -1089345613, 1057832501); + WS(-1081166556, -1096725839); + sum1 = W(0, -1146977357, -1114510289, 1050030946, -1102646113) + + W(1, -1113153825, -1114582784, -1130642485, -1119269199) + + W(2, 1045921361, -1098664649, 992772066, 1022415207) + W(3, 1032268722, 1038356317, 1039889859, 1027769520) + + W(4, 1041426283, 1025422681, -1111253552, -1095921640) + + W(5, 1057711094, -1089074675, -1107182252, -1098886685) + + W(6, 1024786511, 1038758688, 1053078718, -1098156409) + W(7, 1043642083, 1036466489, 1021187873, -1102108905) + + W(8, 1045805544, -1106011300, -1131324475, -1129952762) + + W(9, -1115200917, -1117501552, 1042557010, -1102728052) + + W(10, -1148235644, -1133449046, 1021141494, 1024092394) + + W(11, 1052716334, -1107570834, -1153593794, 1012650491); + sum2 = + W(0, -1154116071, 1032309947, -1123962703, -1133231158) + W(1, -1128886461, 1035599863, -1120032365, 1017679770) + + W(2, 1025906643, -1134787122, -1108727038, 1039832482) + + W(3, 1033357218, -1118521489, 1007375557, -1096414395) + W(4, 1020492423, 1035524914, -1132933754, 1020082264) + + W(5, -1114291801, 1064675801, -1080568363, 1059399952) + + W(6, -1165588207, -1122971142, -1114360955, -1097709607) + + W(7, -1108104258, 1040378905, 1029048100, 1015972752) + W(8, 1031540723, 1040110606, -1112615988, 1024318985) + + W(9, -1115144648, 1021714009, -1136421576, -1121524587) + + W(10, -1111963053, 1036458899, 1020455541, -1134334294) + + W(11, 1014310369, -1119507729, 1028363593, -1122706022); + WS(1058284215, -1100256461); + sum1 = W(0, -1136333391, 1042064203, 1048792691, -1108621703) + W(1, -1107171315, 1009105958, 977549609, 1017583666) + + W(2, 1037147366, -1098054746, 1036542212, -1118222526) + + W(3, 1023954799, -1103445177, 1061193316, -1084539629) + W(4, 1001865121, 1005641493, 1032458293, 1003134525) + + W(5, 1055543997, -1105743629, -1113492892, 1001049989) + + W(6, -1131855793, 1030077610, -1089393894, 1061657482) + + W(7, -1095280499, -1141919717, -1132003829, 1044505715) + + W(8, -1102389770, -1111653453, 1000070140, 1031530183) + + W(9, 1014651348, 1034368605, -1126089633, 1032593324) + + W(10, -1124982771, 957669220, 1007647892, -1109681210) + + W(11, 1030932473, -1134741175, 1012906393, -1123915241); + sum2 = + W(0, 1025749667, 1018718450, -1104497483, -1109821356) + W(1, 1032840840, 1009497507, -1112523495, 1033569638) + + W(2, -1111912018, 1026676021, -1114119398, 1017944258) + + W(3, 1034709000, -1099586256, -1087345020, -1092985416) + + W(4, 1018773778, 1033599708, 1021531102, -1096388774) + W(5, 1061077725, 1065372034, -1129773592, -1109427758) + + W(6, -1129693762, -1109846828, 1049253485, 1048850468) + + W(7, -1101038787, 1029395381, 1006685387, -1112379914) + + W(8, -1117456886, -1106255761, 1043058397, -1106769492) + + W(9, -1119027428, 1008781387, 1038233914, 1013968523) + + W(10, -1113511705, 1020319838, -1106459716, 1045287677) + + W(11, -1135366091, -1138431127, 1037121278, -1113647178); + WS(1048665454, 1062854025); + sum1 = + W(0, 1004974300, -1140401360, 1040482153, -1107105990) + W(1, -1113947114, 1004764812, 1032679478, -1099989608) + + W(2, 1038119146, -1094089019, 1043046180, -1132148363) + + W(3, 1041394910, -1108003052, 1050737065, -1084721726) + W(4, 1044891839, 1022372181, 1026224498, -1103518244) + + W(5, 1054936910, 1054691719, 1025601857, -1113753404) + W(6, -1128844481, 1044968661, -1084409495, 1057517320) + + W(7, 1022006333, 1033354242, -1137588617, 1040271757) + W(8, -1099872844, 1035416977, 1017193535, -1131287582) + + W(9, -1115578718, 1031459778, -1107158134, 1033669936) + + W(10, 1025595521, -1112957780, -1128306202, -1114933822) + + W(11, 1038726400, 1032390235, 1023203548, 1012659010); + sum2 = W(0, -1120028750, -1116919239, 1026537129, 1032246372) + + W(1, 1047938064, -1102851233, -1137390044, 1034599590) + + W(2, -1105861815, -1095438265, 1022176478, -1129352893) + + W(3, 1031876652, -1110926857, -1114848017, -1093245727) + + W(4, -1093210017, 1046245506, -1112211314, 1037510574) + + W(5, 1054207178, 1062401065, -1118385188, -1106645860) + + W(6, 1041988042, -1091078601, 1059021754, -1115099719) + + W(7, -1104427658, 1043294706, -1105672202, 1052042083) + + W(8, -1104155840, -1100501338, 1013766280, 1016480352) + + W(9, 1032816067, -1102117757, 1047757772, -1112097107) + + W(10, 1027075631, -1113418727, -1122489809, 1043447553) + + W(11, -1115066040, -1102195598, 1027463789, 1030659187); + WS(1046819548, -1112403026); + sum1 = + W(0, 1043575156, -1096536373, 1028458839, 1042563315) + W(1, -1147631681, -1134760216, -1118831073, 1040283909) + + W(2, 1047473762, -1108795847, -1115473730, 1037371629) + W(3, 1028002987, 1049135339, -1083606160, 1040849058) + + W(4, 1015994849, 1036578576, 1025124390, -1115136450) + W(5, 1052252597, 1045384892, -1102431101, -1147407721) + + W(6, 1023377962, -1127238030, 1054448495, -1081137782) + W(7, 1046487189, 1029054905, 1034880715, 1042113706) + + W(8, -1106041242, 1040945110, 1026652836, -1113175874) + + W(9, -1125071779, -1124049974, 1031800519, 1026387221) + + W(10, -1096718751, 1032040846, -1144027915, 1045174012) + + W(11, -1138801364, -1122981994, 1030118403, -1121286085); + sum2 = + W(0, -1116472244, 1036928405, 1035706238, -1121318128) + W(1, -1114868876, 1033058067, 1025044698, -1122373594) + + W(2, 1040619830, -1104861162, 1034962287, -1110745183) + + W(3, -1123391126, -1111538981, 1046111644, 1038958235) + + W(4, 1034772140, -1130393948, 1003069456, -1111848203) + W(5, 1044878634, 1050016986, -1113883437, 1005454840) + + W(6, -1129719684, 1027481573, 1017226015, 1040124875) + W(7, -1114732111, -1105702279, -1110477199, 990411281) + + W(8, 1030695866, -1116142138, -1102609372, 1029172520) + + W(9, 1023677849, -1136822924, -1114454329, -1113301330) + + W(10, 1029458562, -1112847239, 989635105, -1136314996) + + W(11, 1007553654, -1112411005, -1109652887, -1150621057); + WS(1054158702, -1098491196); + sum1 = W(0, -1129450472, -1119237644, -1101713087, 1033589815) + W(1, 1034513750, 1023147092, 983582877, 1026235385) + + W(2, -1098493798, 1048228620, -1123359016, -1173092218) + + W(3, -1121209423, 1037197666, -1083899440, 1060260620) + + W(4, -1103037013, 1035595873, -1121678922, 1031464488) + + W(5, -1103778771, 1056756834, -1122982297, 1020058530) + + W(6, 1031290553, -1099798307, 1057005120, -1093716116) + + W(7, 1049393023, -1117980637, -1119715259, -1102325483) + + W(8, 1046824098, -1102446942, 1028221304, -1124996559) + + W(9, 1032360987, -1107157175, 1037130136, -1111054172) + + W(10, 1041637742, -1115548960, -1115265987, 1036899466) + + W(11, 1011053924, -1132207900, 992781927, 995105423); + sum2 = + W(0, 1022318336, 1013555797, -1107715656, 1023151297) + W(1, 1033284778, -1133592549, -1115650269, 1016103802) + + W(2, -1119261847, -1114491928, -1130031974, -1142562170) + + W(3, 1023537352, 1041650416, 1043696631, 1042399799) + W(4, -1108010060, -1132296546, -1109544964, 1052577828) + + W(5, -1093802466, -1088107917, 1027122983, 1012286637) + + W(6, -1104797311, -1105646271, 1070961498, 1046742027) + + W(7, -1123089325, -1129646858, 1016525394, -1089308865) + + W(8, -1101461419, 1041655381, 1023301191, -1123666701) + + W(9, 1034835508, -1093424353, -1129647390, 1027817568) + + W(10, 1010592861, 1020078242, 1033208955, -1123233885) + + W(11, -1103638866, -1123805293, 1027104379, 1017326494); + WS(-1098756718, 1025257793); + sum1 = + W(0, -1170432841, 1023803110, -1090131561, 1057699745) + W(1, -1119694405, 1012926412, 992949730, -1138344011) + + W(2, -1107275570, 1040420307, -1117188674, -1123369303) + + W(3, 1001883457, 1026014126, -1096556254, 1054103406) + + W(4, -1115724526, -1127845816, 1015181254, -1121590721) + + W(5, -1096688477, 1044394251, 1029634610, 1035099253) + + W(6, -1113865961, -1118191492, -1094031636, 1054646511) + + W(7, -1140440641, -1114907963, 1025052052, -1131017933) + + W(8, -1105028073, 1053702338, -1105231572, 1041135600) + W(9, -1142935155, 992699702, -1106433523, 1018441892) + + W(10, 1028218227, -1110839852, 1028407518, -1125677724) + + W(11, -1094260670, 1056434389, -1115106656, 1033590433); + sum2 = + W(0, -1113857499, 1035336978, 1003212424, 1016146718) + W(1, -1124908942, 1007728744, 1017397942, 977119295) + + W(2, -1169985407, -1139136560, -1127032094, 1015257206) + W(3, 994248048, 1058657166, -1086726098, 1029663775) + + W(4, -1128987279, -1139895388, -1107301692, 1082282453) + + W(5, -1067974855, -1088717558, 1045162011, 989071903) + W(6, -1114604929, 1081592322, -1065596346, 1032721198) + + W(7, -1132432620, -1115423533, -1099171315, 1057428850) + + W(8, -1101606461, -1109521003, 1001306728, 1026551071) + + W(9, -1128156929, 1029982493, -1114706375, 1035913834) + + W(10, -1127893472, -1124574009, -1105825924, 1050573738) + + W(11, -1113547007, -1115579388, 1022139202, 999865176); + WS(1057488311, 1032489366); + sum1 = W(0, 998859696, -1107316871, -1130375162, 1045821468) + + W(1, 1009430200, -1127874328, -1126361486, 1034785118) + + W(2, -1098594694, 1031878554, -1137835434, -1124885440) + + W(3, 1028022609, -1114064513, -1105098668, 1057263754) + + W(4, -1104540630, -1121514949, -1139957040, 1048520075) + + W(5, -1099155379, -1127500588, 1033795278, 1026343507) + + W(6, 1015295094, -1112481238, -1109749909, 1049599048) + + W(7, -1105774078, 1007199100, -1122345661, -1154023155) + + W(8, -1112014022, 1025402492, 1046311438, -1119007402) + + W(9, -1126668079, -1133481329, -1114013594, 1034877470) + + W(10, -1109189150, 1026086402, -1129886863, -1108825451) + + W(11, -1116334683, 1046739556, -1119327433, -1138298796); + sum2 = + W(0, -1131728975, 1036764889, -1111227173, -1128881737) + W(1, 1037242625, -1122740141, 1035973522, -1115068573) + + W(2, 1022919798, 1043114423, 990889655, -1130091274) + W(3, 1044679054, -1096357732, -1128128484, -1098903856) + + W(4, 1034691185, -1126568042, 1057647035, -1081650015) + W(5, 1064645808, -1105946360, 997618289, 1036162942) + + W(6, 1029801795, 1008652352, -1094730608, -1121257166) + + W(7, -1119761613, -1145265129, -1120435503, 1020148594) + + W(8, 1034184152, -1122224678, -1123774451, 1016517254) + W(9, 1040526136, 1019038058, -1110501324, 1033879187) + + W(10, 1017411026, 1025838030, 1001204178, -1125968836) + + W(11, -1141167471, -1125677560, 1017460301, -1121815648); + WS(1059796919, -1120566973); + sum1 = + W(0, -1128913552, -1112300176, -1105877684, 1051198984) + W(1, 1031319296, -1128535084, -1121363289, 1042197939) + + W(2, -1097436160, 1044389601, -1156941767, 1024751122) + + W(3, -1114223569, 1034918960, -1084964393, 1058261945) + + W(4, -1115209492, 1025460631, -1170089852, 1019526904) + W(5, 1000497399, 1057668526, 1032065846, 1032881746) + + W(6, 1032486790, -1097594444, 1058860547, -1083919657) + W(7, 1045243539, 1010383044, 1007200827, -1109654209) + + W(8, 1031553246, -1093305914, 1041280427, 986576750) + W(9, 1031548233, -1121876014, 1038828418, -1113158982) + + W(10, 1014469175, 1034628234, 1025411673, -1114258964) + + W(11, -1106885131, 1024357474, -1128319413, 1012703988); + sum2 = W(0, -1143612781, 1030657759, -1142189493, -1116365956) + + W(1, -1108113093, -1144957229, 1024653023, -1114346787) + + W(2, -1145631357, -1122350618, -1120960689, 1013910379) + + W(3, 1031492195, -1115709916, 1041520845, -1109597137) + + W(4, -1100459142, 1028619709, -1118229715, -1122961088) + + W(5, 1058735511, 1063925227, -1102646250, 1003281301) + + W(6, 1037055061, 1023143173, -1123318690, -1097941231) + + W(7, -1097541479, 1040501280, -1103747903, 1032102149) + + W(8, -1113230658, -1096423541, -1119600722, 1015718737) + + W(9, 1027878177, 1035049663, -1107577516, 1034348655) + + W(10, 994779835, -1116733621, -1120661119, -1115297076) + + W(11, 1029140405, -1104473650, 1048901284, -1122107736); + WS(1025862512, -1097886171); + sum1 = + W(0, 1017995501, 1039868615, -1084617440, 1048852846) + W(1, 1036255511, 1003283810, 1028206791, 1039095646) + + W(2, -1095591910, 1046495341, 1032043925, 1031081728) + W(3, -1115115241, 1044724702, -1088992852, 1053236428) + + W(4, 974144948, -1128580235, 1023900364, 1040670187) + W(5, -1089161581, 1054642003, 1024473755, 1033561578) + + W(6, 973319892, 1036683863, -1092805231, 1050422468) + W(7, -1132527589, 1012484477, 1028215869, -1105649212) + + W(8, -1107053347, 1049220624, -1120787802, -1126192084) + + W(9, 1033665516, 1040757263, -1107160205, 1039010398) + W(10, 1025750940, 1035723265, 1031994596, -1101644966) + + W(11, -1102281943, 1042256548, 1034960116, -1141688154); + sum2 = W(0, 1017309480, -1113384832, 1051665642, -1106075829) + + W(1, 1041533127, -1143916576, -1115898040, -1105498372) + + W(2, 1043260681, 1041703091, -1122221676, -1119502308) + + W(3, 1026950620, -1140340528, -1109716244, -1109231476) + + W(4, 1047102067, 1032670038, -1131938440, -1101077232) + + W(5, 1039662810, 1049668212, -1109791178, -1130795288) + + W(6, -1120377052, -1114410560, -1113565360, 1032262130) + + W(7, 1039963022, -1112068676, -1147724576, 1042402941) + + W(8, -1097796100, 1040746517, -1131969000, 1031201932) + + W(9, -1108926548, -1114542528, -1108348496, -1140600496) + + W(10, 1032294606, -1108483346, -1120540424, 1040078450) + + W(11, -1097463639, 1048026467, -1107112902, 1028500076); + WS(1059594295, -1081462343); + sum1 = W(0, 1027153262, 1043504002, 1052804111, -1087238767) + W(1, 1041162890, 1012415888, 978268098, -1116748340) + + W(2, 1047257898, -1102654539, 1038115889, -1165722369) + + W(3, 1020914066, 1039643767, 1049749519, -1086204143) + W(4, 1044063108, 1033818911, 1037283618, 1038369681) + + W(5, 1054855273, -1088075529, 1037006730, 1032180390) + W(6, 1001487768, 1034058802, 1047397560, -1086503800) + + W(7, -1117492081, 991868273, 1024040629, 1040894970) + W(8, 1052275873, -1098202447, 1024505810, 1034352017) + + W(9, -1121199663, -1111840522, 1039603542, -1107277965) + + W(10, 995252542, -1131707508, 1022356543, 1036921959) + + W(11, 1026848211, -1098696769, 1036480704, -1136594828); + sum2 = W(0, 1028621181, -1120219585, 1035384087, 1034472183) + + W(1, -1123130413, -1120488613, -1110777341, -1127812186) + + W(2, -1126856730, -1129759266, -1106344343, -1132463093) + + W(3, 1027102605, -1121966109, 1038893967, -1123472797) + + W(4, -1121376361, -1111137329, 1030597213, -1109734497) + + W(5, 1046142043, 1054407172, -1110811845, 1013238549) + + W(6, -1106396561, -1139970197, -1102581665, -1114873213) + + W(7, -1147353578, -1113345499, 1041951037, 1005564394) + W(8, 1024169581, 1049042812, 1023037898, 1010521365) + + W(9, -1110468651, 1027913013, -1119264521, -1104920828) + + W(10, -1123538565, -1123696429, 1026771477, 1021745754) + + W(11, 1045072501, -1117275361, -1108801471, 934750635); + WS(1001790336, 1033193226); + sum1 = W(0, -1113292474, 1018580889, -1117909243, 1052553934) + + W(1, -1104113579, -1129785460, -1131356554, -1115176285) + + W(2, 1046326027, -1113855449, -1112351060, -1156866531) + + W(3, -1133969725, -1102427201, 1041639692, 1060794158) + + W(4, -1095014251, -1132017542, -1118664394, -1094752997) + + W(5, 1062953181, 999804065, -1105541862, -1130622370) + + W(6, 1027204153, -1105768635, 1031529696, -1122254720) + + W(7, -1102735326, 1022740922, -1111709325, -1119059021) + + W(8, 1040555139, -1110352445, 1031818996, -1121415144) + + W(9, 1024655285, -1121009370, -1115548569, 1026923705) + + W(10, 1008421480, 1008916224, -1127980619, -1131789226) + + W(11, 1030139737, -1100154756, 1016036429, -1122315305); + sum2 = + W(0, 999771042, 1019371878, 1035878909, -1106457448) + W(1, 1038257769, -1118330440, -1130012060, -1137594745) + + W(2, 991329315, 1043986431, -1108709562, -1156785507) + W(3, -1123589256, 1002965746, 1042318306, -1118271248) + + W(4, 1025444512, -1134019065, 1018901632, -1114341154) + W(5, 1053769225, 1057361082, -1113472862, 1021163648) + + W(6, -1124249760, -1115605194, 1010690665, -1102884302) + + W(7, 1015483632, -1123825168, 1017234680, 1017493044) + W(8, -1099274218, 1037230696, -1115820708, 1025071687) + + W(9, -1118367200, 1015905000, -1101115118, -1112309114) + + W(10, 1020142296, -1126466092, 1016197020, 1024661143) + + W(11, -1092869373, 1036147884, 1016005876, 1013380697); + WS(-1096043118, -1087645231); + sum1 = + W(0, -1115587665, 1029203067, 1045341850, -1106908023) + W(1, -1131991862, -1114910160, 1032694426, -1099485226) + + W(2, 1017432376, 1052615508, -1113683692, -1127306394) + + W(3, 1031441086, -1113336032, 1054321442, -1082902530) + W(4, 1050084000, 998100766, 1023546425, -1121275799) + + W(5, 1050158903, 1045376289, -1116607496, -1147820543) + + W(6, -1130229584, 1051148019, -1081266857, 1057440145) + + W(7, 1027649766, 1021215128, -1147531597, -1118364796) + W(8, 1047006846, -1118131945, -1120491559, 991663462) + + W(9, 1019733960, -1127235090, -1106232936, -1134199968) + + W(10, 1027530281, -1123554607, -1115129818, -1119188228) + + W(11, 1041137522, 1018710010, -1131853547, -1124042776); + sum2 = + W(0, -1129211209, 1023515648, 1040374834, -1110890211) + W(1, 1020265593, 1023672492, 1023861908, -1119658781) + + W(2, -1108471855, -1133136545, 1048083250, -1109425046) + + W(3, 1038235290, -1121364796, -1096619497, 1044872450) + + W(4, 1034188808, -1121333166, 1029997412, -1103304652) + + W(5, 1039720436, 1050855479, -1102257516, -1130250517) + + W(6, -1125523437, -1109858923, -1113539350, -1117035130) + + W(7, 1022698753, 1029442100, -1107362446, 1044349350) + W(8, 1038091910, -1107498682, 1024895152, -1122118916) + + W(9, -1114850415, 1032218024, -1121557752, -1130602657) + + W(10, -1162309256, 1020180841, 1013933265, 1027861436) + + W(11, 982770184, -1128608489, -1129090321, 939323929); + WS(1062090935, 1058767985); + sum1 = + W(0, 1016379967, -1111629724, -1115487571, 1040669191) + W(1, -1124650927, -1131647467, -1127587553, 1016014666) + + W(2, 1046030390, -1131263417, -1107621674, 1039946613) + + W(3, -1124869109, 1045897412, -1089079359, 1049140321) + + W(4, -1120715392, -1197661491, 1030044278, 1039181162) + W(5, -1107063038, 1046027952, 1035258018, 1033161790) + + W(6, -1135267218, -1111908667, 1056809425, -1082917799) + + W(7, 1051125844, -1129645073, 1021197901, 1032078908) + + W(8, -1100036461, 1040408361, -1117322707, -1124734374) + + W(9, -1146487047, -1129970444, 1008766834, -1115518322) + + W(10, -1115270659, 1029976235, 1001072263, 1037221664) + + W(11, -1118068997, 1034380765, -1135017032, -1119763541); + sum2 = + W(0, 1033054007, -1111327982, -1121722910, 1038740385) + W(1, -1119336676, -1124024618, -1116547758, 1041352776) + + W(2, 1034677105, -1115132829, -1124364804, 1035204548) + + W(3, -1123189128, 1032790615, 1033549613, -1092378351) + W(4, -1102497930, 1032784783, 1033469023, 1012971008) + + W(5, 1033020303, -1108961666, -1106694042, 1032253989) + + W(6, -1122818756, -1098982462, 1051050782, -1121004928) + W(7, 1035128176, 1009754028, 1026371779, 1042838787) + + W(8, -1098306997, 1045175561, 1039643256, -1118316692) + + W(9, -1136838880, -1110172088, 1034801784, 1019964530) + + W(10, 1015821086, -1125398316, -1137766108, 1004924993) + + W(11, -1120000922, 1027487385, 1017988993, 1028774587); + WS(1065136439, 1040354336); + sum1 = W(0, -1140671753, -1108811053, 1057254373, -1099781359) + + W(1, 1009251305, 1003726785, -1120274067, -1107804932) + + W(2, 1050226223, -1098842784, 1010162395, -1112753158) + + W(3, 1022747450, -1110160675, 1059609336, -1092867554) + + W(4, 1036945681, -1120831377, -1124666160, -1105899870) + + W(5, 1031464345, 1000731409, -1114655220, -1112429520) + + W(6, -1123069063, 1025125049, -1093137163, 1058399851) + + W(7, -1109467235, -1119063979, -1131113682, 1033405406) + + W(8, -1111386668, 1055942809, -1101547023, -1146511789) + + W(9, -1118356003, -1129239633, -1105328992, 1044975810) + + W(10, -1113825780, -1116155918, -1126498983, 1016924742) + + W(11, -1111235284, 1051704028, -1104493413, -1117793303); + sum2 = W(0, -1139839138, 1034041544, 1034669108, -1095769692) + W(1, -1105759439, 1039138956, 998321428, 1018598993) + + W(2, -1116818777, -1114897304, -1105398904, -1145690340) + + W(3, -1134067290, 987604943, 1007335842, -1102588486) + + W(4, -1108283066, 1018314989, 1024466364, -1102834025) + + W(5, 1061492513, 1062722215, -1098749835, 1025712340) + + W(6, 1008723794, -1131349085, -1121214551, -1107691916) + + W(7, -1108418109, 1022467761, -1119932526, -1118877643) + + W(8, -1116983417, -1117176868, 1041629273, -1121476700) + + W(9, 1028368392, 1031347596, -1114752830, 1009572226) + + W(10, -1103951670, 1033232162, -1132382549, -1113750023) + + W(11, -1103912225, 1035794880, 1046707789, -1110829011); + WS(1015535328, -1084984071); + sum1 = W(0, -1114800552, -1108603860, -1099862310, 1058689409) + + W(1, -1114937124, -1119809253, 1017574081, -1120445077) + + W(2, -1098244185, 1050368026, -1113854018, -1119794874) + + W(3, -1121052395, -1120661414, -1094435959, 1059588503) + + W(4, -1120887600, -1117398367, -1121642214, 1038434434) + + W(5, -1091868509, 1053265766, 1038069402, -1124845785) + + W(6, 1031943978, 1004694578, -1100742889, 1053762387) + W(7, 1032168457, -1126829041, -1119258038, 983354644) + + W(8, -1090330210, 1049777811, 1033335786, -1124490374) + + W(9, 1015340962, -1131668588, -1106546547, 1042220181) + + W(10, -1112611163, -1122991451, -1152091148, -1117988144) + + W(11, -1096238847, 1044693386, 1033654385, 1025017029); + sum2 = W(0, -1113763234, -1123863865, -1152383745, -1153318001) + + W(1, 1032880554, -1112434267, -1113925793, -1117743388) + + W(2, 1049718598, -1115051721, -1108241407, 1017487533) + + W(3, -1117079348, 1031541130, 1054034272, -1111062529) + + W(4, 1025815300, -1115045873, 1016562523, 1034144457) + W(5, 1045174355, 1029337732, 1040219109, -1115252534) + + W(6, -1106152769, -1108434934, 1019958281, -1107848604) + + W(7, -1122950542, -1112234054, 1021767953, 1028245712) + + W(8, 1048832333, 1036566626, 1032317223, -1144290245) + + W(9, -1110489214, -1107854239, 1037079656, -1106439039) + + W(10, -1114917041, -1111099643, -1118706081, -1131124226) + + W(11, 1041167636, -1100833945, 1023645948, -1123196065); + WS(1058837943, 1069665989); + sum1 = W(0, 962159770, -1123278397, 1059574623, -1100091288) + + W(1, -1106975399, 1026912571, -1131526763, -1133106088) + + W(2, 1052414436, -1100255560, 1034080493, 1026538575) + + W(3, -1123587520, -1111839826, 1056026369, -1090882007) + + W(4, 1026032901, -1128992103, 1016761717, -1119033369) + + W(5, 1050778647, -1089604336, 1030312842, -1142474253) + + W(6, -1116652202, -1112323118, 1057288447, -1090318286) + + W(7, -1115237492, -1126485147, 1020359383, -1123741278) + + W(8, 1051933055, -1098258189, -1123145400, 1024876312) + + W(9, -1124916236, -1111587013, 1049400292, -1098860821) + + W(10, 1023272149, -1130617057, -1120750038, 1031183749) + + W(11, 1050858601, -1113801599, -1102573630, -1147252941); + sum2 = + W(0, 1031825723, 1031898082, -1068962638, -1097279430) + W(1, -1106804175, 1033946762, -1121672345, -1123032728) + + W(2, -1070958719, 1042495248, 1004890268, 1015278793) + W(3, -1128689519, -1149677000, 1062859919, 1042236169) + + W(4, 1033261211, -1125393239, 1003655756, 1042326937) + W(5, 1079716701, -1097154173, 1047991146, -1129356209) + + W(6, -1112729716, 1016978721, 1069238165, 1043003442) + W(7, 1029430153, -1130449529, 1021714543, -1135526098) + + W(8, -1106783417, -1101596383, 1006662138, -1143028884) + + W(9, -1143241256, 1017362221, 1038638730, -1114855682) + + W(10, 1016716693, 1021676019, 1015056847, -1115756346) + + W(11, 1030095799, 1029691669, -1116617969, 1007567766); + WS(1027937136, 1051433372); + sum1 = W(0, 1024223452, 1027262836, -1095583884, 1036904555) + W(1, 1037383306, 1026871330, -1131494490, 1034970897) + + W(2, -1102510757, 1043230726, -1126475809, -1131579916) + + W(3, 1034208027, 1041574867, -1088128354, 1043513377) + W(4, 1038022750, 1022249046, -1113660825, 1051529138) + + W(5, -1082034838, -1088109312, 1049740992, -1121104697) + + W(6, 1026687777, 1043759333, -1107709564, 1040837474) + W(7, 1043020088, 1030621125, 1007645322, 1035492122) + + W(8, 1021392868, 1023668834, 1040579632, -1128113439) + W(9, 1019229306, 1025216066, -1116281753, 1033050768) + + W(10, 968839375, 1026071912, 1023660333, 1033175550) + W(11, 1019915650, 1041627229, 1040383308, 1024084817); + sum2 = W(0, -1122636491, 1019704225, 1049771287, -1108218455) + + W(1, 1003686724, 1007985666, -1114076695, 1037288383) + W(2, 1032297878, 1029534785, -1114871835, 1019192761) + + W(3, -1122337791, 1038646185, 1050229287, 1038576544) + + W(4, 1026526587, -1146139348, -1121313911, -1113812515) + + W(5, 1058219066, 1058416091, -1129529893, 1021492965) + + W(6, 1019616565, -1115379683, -1126947029, -1096957025) + + W(7, 1020162449, -1131201101, 1032037049, -1144905268) + + W(8, -1089173556, 1029636273, 1011141050, -1129337357) + + W(9, -1121846167, -1124810757, -1109798125, -1112204367) + + W(10, 1015768281, -1117257463, 1035628188, -1104091459) + + W(11, -1085784913, 1039375301, -1169657505, 1026702945); + WS(-1087300279, 1060388257); + sum1 = + W(0, -1129462823, 1023690092, -1095623283, -1106106692) + W(1, 1037669414, -1130365587, 1031115364, 1041026294) + + W(2, -1092905754, 1045171988, -1113959460, -1127843579) + + W(3, -1114720439, 1027269348, -1093094418, 1058204318) + + W(4, -1142625182, -1122973026, 1025637865, 1022155151) + W(5, -1092295181, 1060821043, 1044954958, 1027810288) + + W(6, -1150727557, 1032140389, -1091295733, 1047241920) + W(7, 1031904715, 1008074737, 1019407412, 1019365849) + + W(8, -1094422277, 1051757075, 1022315054, 1005685302) + W(9, 1005184420, 1035913085, -1097873082, 1047453654) + + W(10, -1121754201, 1011776124, -1144567588, -1142073248) + + W(11, -1089577936, 1052799910, 1027854342, 1023937224); + sum2 = W(0, -1120594034, -1166872476, 1040489823, -1102509951) + + W(1, -1086857984, 1045679794, -1141459412, 1004777140) + + W(2, -1122900789, -1110936244, -1095818924, -1104593759) + + W(3, -1136839806, -1113289360, 1021539093, 1067324619) + + W(4, -1093760272, -1110068744, 1028313984, 1013932442) + + W(5, -1095750682, 1045560576, 1065644346, -1103109579) + + W(6, -1127607807, 1019995585, 1045364618, -1096904945) + + W(7, -1123950010, 1034732462, -1122936307, -1124945717) + + W(8, 1031026044, -1100965201, 1042979309, 1018809021) + W(9, 1007613018, -1145964804, 1033830372, 1000232964) + + W(10, -1121148085, -1152320711, -1134584398, -1157638606) + + W(11, -1125456395, -1108078168, 1026162850, 980148252); + WS(-1090838638, 1050174926); + sum1 = + W(0, 1024715784, -1109115088, -1106716164, 1038102082) + W(1, -1115525408, 1016756989, 1033853293, 1049593122) + + W(2, -1120751425, 1051782073, -1136454131, 1035169257) + W(3, -1106406969, 994296459, -1094496661, 1043814476) + + W(4, -1105105482, -1108133484, 1042483832, 1045373935) + W(5, -1086184702, 1058236139, 1033520471, 1042591993) + + W(6, 1025782733, 1015694078, -1092092861, 1045378621) + + W(7, 1029286795, -1140252101, -1138965820, -1112080289) + + W(8, -1095245812, 1042079876, -1106373991, -1115290814) + + W(9, 1038488261, 1045351388, -1100690449, 1050438570) + + W(10, 1034575399, 1041627941, -1139164262, -1114987669) + + W(11, -1094326222, 1040938025, -1122199803, 1001134058); + sum2 = + W(0, 1051544715, -1087153288, -1090874159, 1047568122) + W(1, -1111412903, 1034895049, 1047565246, -1111682644) + + W(2, -1099176408, 1032035298, 1040133461, -1131191613) + + W(3, 1046232208, -1081925443, -1105576760, -1119008010) + + W(4, -1140028602, -1112144320, -1105592564, 1060283907) + + W(5, 1048906709, 1036693685, -1107739759, 1040322447) + + W(6, -1094324661, 1062548140, -1112367085, -1119206793) + + W(7, 1044620924, -1130045765, -1105924841, -1127110112) + + W(8, 1049091960, -1158298480, -1096403637, 1011461326) + W(9, 1021200095, 1051334754, -1107585156, 1036759049) + + W(10, 1046459856, 1012649582, -1103932050, 1033462267) + + W(11, 1048824237, -1114785543, -1114351857, -1111955333); + WS(1039738296, 1044009556); + sum1 = + W(0, 1031992376, -1113116036, 1058890327, -1088719167) + W(1, 1040542090, -1107110028, -1118478209, -1126664684) + + W(2, 1042459434, -1107130859, -1129453002, 1036863629) + W(3, 1036413734, 1028656912, 1054229481, -1088309806) + + W(4, 1042227988, -1133301245, 1042319122, -1095949365) + + W(5, 1057173004, -1090115281, -1127816747, -1121635021) + + W(6, 1025321013, 1046101634, 1048940614, -1090901446) + W(7, 1048439133, -1120611033, 1019779694, -1104617834) + + W(8, 1052520321, -1096019759, -1119199044, 1022364232) + + W(9, -1126468451, -1111694091, 1047137387, -1098195015) + + W(10, 1036380619, -1108092830, 1028741314, 1029160593) + + W(11, 1057385245, -1090793697, 1040359505, -1129794251); + sum2 = + W(0, -1088996856, 1009251693, 1062110924, -1115283476) + W(1, 1030923639, 1034262626, -1089163817, -1107842867) + + W(2, 1057525018, 1042234988, 1032774718, -1123202523) + + W(3, -1081345153, -1124806950, 1064189433, -1104109471) + + W(4, -1126776930, -1130902850, -1080285142, 1052635731) + + W(5, 1067630395, -1112028150, 1034769026, 1036915346) + + W(6, -1079794071, -1106464080, 1063058829, -1113992476) + + W(7, -1106165885, -1110986466, -1089981167, -1125456570) + + W(8, 1062842970, 1045262592, -1136163037, 1035294670) + W(9, -1091438196, -1115606726, 1054193960, 1042247754) + + W(10, 1032379012, -1135519157, -1099490886, -1106662163) + + W(11, 1053790298, -1104249669, -1108359351, 1024576891); + WS(-1096394862, 1050867114); + sum1 = W(0, 975777376, 1011677768, 1050217928, -1095631255) + W(1, -1105375964, 1033079080, 1035680965, -1097606072) + + W(2, 1041761501, -1108785275, 1035556439, -1107649602) + + W(3, 1017323049, 1017467204, 1059053443, -1088500104) + + W(4, 1042635014, 1020084753, -1164976624, -1122057965) + + W(5, -1098739346, -1111108333, 1025006046, -1112750027) + + W(6, -1126109949, 1039142936, -1089683010, 1062642602) + + W(7, 1038036638, -1142614292, -1117859264, -1137149130) + + W(8, -1104430516, 1040456976, 1027021261, 1017623258) + W(9, 1011370603, 1023416416, -1115445691, 1016594173) + + W(10, 1041295544, -1113983747, -1122131819, -1112401517) + + W(11, 1042596520, -1120553683, 1029575724, -1124248029); + sum2 = + W(0, -1131210775, 1029829507, 1018275001, -1122984086) + W(1, -1096338526, 1033255054, 1024840523, -1108448221) + + W(2, -1117395779, -1132016729, -1114466007, -1103146109) + + W(3, 1024067225, 1046565608, 1042461338, 1059140985) + W(4, -1107995649, -1119288636, 1022860453, -1107856867) + + W(5, -1092962046, -1089805596, -1166014069, -1099911282) + + W(6, -1125865258, 1042031083, 1053212914, 1058514952) + + W(7, 1052927486, -1113255745, -1130239171, -1106481128) + + W(8, -1102214835, 1027704725, 1041713274, -1106771914) + + W(9, 1024964869, -1127390051, -1114692565, -1118917379) + + W(10, 1037010892, -1111017176, -1117571915, -1124576676) + + W(11, 991892650, 1032905776, 1032336370, 1000523989); + WS(-1112511928, 1031640207); + sum1 = + W(0, 1037301926, -1102373753, 1058068053, -1091912761) + W(1, 1030698115, -1112730073, -1130112569, 1048837234) + + W(2, 1051625169, -1095738529, 1045615952, 1045904421) + + W(3, -1119711398, -1091456672, 1054040787, -1101742756) + + W(4, -1104227307, -1098654019, 1044751592, 1045582560) + + W(5, 1044375881, -1090186767, 1051640030, -1111879892) + + W(6, -1102628100, -1119033858, 1057193534, -1090190311) + + W(7, -1111999463, -1123401908, 1042267541, -1093436941) + + W(8, 1051238780, -1110077161, 1008998972, -1101737376) + W(9, 1021159833, 1050238014, 1045936610, -1098844722) + + W(10, 1050341641, 1043894710, -1122521821, -1100593739) + + W(11, 1058222955, -1090967581, -1108465231, -1112695488); + sum2 = + W(0, 1016218439, 1024549194, -1121292007, 1037076368) + W(1, -1112700443, 1032984152, 1009444234, -1117974589) + + W(2, -1111737758, -1110249739, 1020335555, -1112172263) + + W(3, -1111008440, 1042315856, 1047393563, -1086831522) + W(4, 1038599637, 1060801772, 1026480303, -1106327815) + + W(5, -1089871257, -1069929292, -1111547810, 1079084175) + + W(6, 1015374231, 1040022175, -1115783084, -1085683537) + W(7, 1049254465, 1057876572, -1115006890, 1025059842) + + W(8, 1043300713, 1033002057, -1118960414, 1033693800) + W(9, 1027237715, -1110870197, -1103999090, 1033912191) + + W(10, -1118358651, -1104475663, -1122692269, 1033099318) + + W(11, 1022298131, 1032775289, -1104218510, 1045399536); + WS(-1106120924, 1033431669); + sum1 = W(0, 1016553159, 1035990878, -1101729723, 1042266392) + W(1, 1024064284, 1018305971, -1146851238, 1041817850) + + W(2, 1024013341, 1027850273, 1026394008, 1021653787) + W(3, 1024375743, 1041767260, -1116899488, 977256084) + + W(4, 990294084, 996614956, 1026515514, 1047579686) + W(5, -1085522812, -1090381288, 1048833585, -1125739905) + + W(6, 1005429062, 1031819293, -1090064383, 1048109660) + W(7, 1038017843, 1016883609, 1029812010, 1026577053) + + W(8, -1118087802, -1113190325, 1040657490, -1121801815) + + W(9, 1008887700, 1014785832, -1126747713, 1024173993) + W(10, 1020235411, 1027952623, 1021177962, 1011005202) + + W(11, 1025078601, -1127218683, 1041410670, -1132785763); + sum2 = + W(0, 1032555846, -1110721648, -1094136567, 1030929664) + W(1, -1146526593, 1018020888, 1019641904, -1116342888) + + W(2, -1089264280, -1112511004, 1032788860, -1125819008) + + W(3, 1015684488, -1102693078, -1097199465, 1046449598) + W(4, 1012812816, 1004426241, -1123545328, 1027573888) + + W(5, 1056898914, 1052843165, 1033507644, -1122415072) + W(6, -1118308408, 1043950970, 1037769558, 1024674316) + + W(7, -1106559340, 1028547840, -1117707424, 1021888896) + W(8, 1041236542, -1109778580, 1017687520, 996318210) + + W(9, -1137876352, 1007632640, 1026403708, -1123597216) + + W(10, 1028523456, -1149117889, -1152988290, 1023916088) + + W(11, 1046276806, -1105717038, -1122312832, -1132920416); + WS(1034973624, 1056792353); + sum1 = W(0, -1120658336, -1130821617, -1114903379, -1130597942) + + W(1, -1109039532, -1124529164, -1121055921, -1114464179) + + W(2, -1125024178, -1102939831, -1115164458, -1124681556) + + W(3, -1128295926, -1106629009, 1008426736, -1118485143) + + W(4, -1104109440, -1138254780, 1021962732, -1093463666) + + W(5, 1062068439, 1067744046, -1094141737, 993935312) + W(6, -1127490506, -1097245927, 1050479246, 1049107361) + + W(7, -1105858697, -1132704804, -1119904327, -1132912612) + + W(8, -1107542555, 1045213129, -1119937620, -1120970067) + + W(9, -1122942113, -1118132038, 1028006365, -1113875250) + + W(10, -1141854766, -1122550700, -1119710033, -1115274080) + + W(11, 1025872901, 1036565277, -1121170098, -1120520661); + sum2 = W(0, 1020401308, -1120501349, 1037264768, -1090330474) + W(1, -1105802125, 1023925581, 1017661559, 996214904) + + W(2, -1116129767, -1084580575, 1032645479, -1119976615) + + W(3, -1129375401, -1140432422, 1035443152, -1097846115) + + W(4, -1102145888, 1025111856, -1130735541, 1024553914) + + W(5, 1051779064, 1064606263, 1038402436, -1136822486) + W(6, -1146688164, 1006774606, 1039827062, 1048687051) + + W(7, 1000828364, -1121332237, -1166762145, -1124013507) + + W(8, 1025600009, 1019182043, 1025151371, 1015612208) + + W(9, -1130185789, 1033491675, -1114545658, -1117487855) + + W(10, 1028059566, -1119338761, -1137125822, -1117903931) + + W(11, 1032817572, 1037037513, -1112238814, 999461036); + WS(-1082445367, -1085006700); + sum1 = + W(0, -1131835086, 1041974800, -1081109875, 1054173212) + W(1, 1035072463, -1137431795, 1034878908, 1043293403) + + W(2, -1092276724, 1051286356, 1034209806, 1038048136) + W(3, -1106661648, 1042063924, -1086386347, 1055927462) + + W(4, -1114712644, -1110863483, 1037617118, 1045196135) + W(5, -1094524616, 1058619216, 1036390662, 1042877649) + + W(6, -1121819052, 1037212703, -1094507255, 1050138098) + + W(7, 1015171028, -1123146704, 1022066011, -1105403448) + + W(8, -1104988703, 1028915053, -1139447658, -1114994477) + + W(9, 1036207796, 1046411795, -1105674409, 1041419787) + W(10, 1026111277, 1040360493, 1033542412, -1100599618) + + W(11, -1096619449, -1130824962, 1045523870, -1121943708); + sum2 = W(0, -1112963339, 1043137200, 1014823768, -1089890678) + + W(1, 1022229356, -1128614108, 1025676326, 1000796272) + W(2, 1031859059, -1102855534, 1031913791, 1018516204) + + W(3, -1117465202, 993751520, 1020211292, 1018575516) + + W(4, -1120060570, -1138611816, 1036266015, -1098528956) + + W(5, 1055374057, 1061198225, -1098119563, 1020738140) + W(6, -1124864900, 1032573075, 986723264, 1038055959) + + W(7, -1106568385, -1132953832, 1019242508, -1097473255) + + W(8, -1125510524, 1050136287, -1098582022, -1123833514) + + W(9, 1017632828, 1049454991, -1111044051, -1109681619) + + W(10, 1030233630, 1035860627, 1039721851, -1090503899) + + W(11, 1007293144, 1054985311, -1101215648, -1110059149); + WS(-1089141943, 1068474134); + sum1 = + W(0, 1024130588, -1121972404, 1032495505, 1036801227) + W(1, -1117579092, -1114425265, -1101143803, 1041396360) + + W(2, 1045416789, -1094238571, 1039470024, 1024684838) + W(3, 1039148539, -1105946681, -1106461946, 1057861426) + + W(4, -1113046718, -1108918837, -1124204515, 1052602058) + + W(5, -1094942270, -1098420551, 1047303536, -1127532529) + + W(6, 1026773217, -1091638882, 1059099726, 1040764762) + W(7, -1094617668, 1027200645, 1018218693, 1032280890) + + W(8, -1106993164, 1033290001, 1040300696, -1103088708) + + W(9, -1104179471, 1041946144, 1045088278, -1105244536) + + W(10, -1110195745, 1043167338, -1123573325, -1138642417) + + W(11, 1009482242, 1037819035, -1108347351, -1116739793); + sum2 = W(0, 1016644168, -1134771145, -1129326838, -1114142714) + + W(1, 1012771369, 1025799488, 998892514, -1114282184) + W(2, 1049635340, -1101404122, -1114952606, 1041138771) + + W(3, -1116049462, 1042383274, -1147070546, -1095734150) + + W(4, 1057697290, -1095991584, 1033248586, 1025008594) + + W(5, -1102476512, 1060588986, -1111850310, 1027653952) + + W(6, -1110140123, -1104878488, -1090718582, 1052949499) + + W(7, -1096580248, -1127102864, 1041609896, -1101611481) + + W(8, 1046973498, -1143476482, -1114336646, 1035005082) + + W(9, -1103095555, 1048842205, -1115539252, -1110997031) + + W(10, 1031782132, 992902692, 1030835892, -1122288558) + + W(11, 1028769716, 1022411808, -1118966953, -1120028296); + WS(1055908206, 1023803300); + sum1 = + W(0, 1033033649, -1114766205, 1059767687, -1093070812) + W(1, -1106762950, -1139512861, -1128828388, 1011459483) + + W(2, 1054454099, -1094569204, 1029622486, 1016172182) + W(3, 1027156540, -1106069078, 1057986836, -1086765600) + + W(4, 991938588, 1027600816, 1024886583, -1116675477) + W(5, 1059734148, -1090099632, -1098865153, 1027525694) + + W(6, -1122498726, -1116893112, 1056528229, -1094363024) + + W(7, -1101593593, -1135964969, 1032744244, 1045609495) + + W(8, 1043829406, -1102732570, -1139103892, 1036132330) + + W(9, -1114524705, -1113403236, 1047712168, -1103438026) + + W(10, 1022039246, -1117700205, 1005980052, 1049123968) + + W(11, 1049516377, -1098493775, -1097177334, 1035501771); + sum2 = + W(0, 1025334517, 1052224655, -1085507535, -1083097675) + W(1, -1097828858, 1062578782, -1115143239, 1029199567) + + W(2, -1092254017, -1079915962, -1092877982, 1029921983) + + W(3, -1112308287, 1050599738, -1091835304, -1078367265) + + W(4, -1101001669, 1036651638, -1115511381, -1137182696) + + W(5, 1050309385, -1085955474, 1031547399, 1017725718) + W(6, 1042864237, -1101494467, 1052849573, 1077549274) + + W(7, 974314816, -1103762806, 1031444191, -1094150391) + W(8, 1058681981, 1068550083, -1100178328, -1106558945) + + W(9, 1040795754, -1116631442, -1093246396, 1054678659) + + W(10, 1046838481, 1039431488, -1111573417, -1092627938) + + W(11, 1066882777, 1059124396, -1088438520, -1098096651); + WS(-1078207964, -1098790270); + sum1 = + W(0, -1117816013, 1017293260, 1049047675, -1100878354) + W(1, 1032784131, -1126192007, 1039615439, -1121106131) + + W(2, -1100078274, 1049964833, -1107321921, -1122801847) + + W(3, 1040159636, -1098516348, 1057717203, -1094050686) + W(4, 1040450075, 1034337038, 1032454162, -1100564368) + + W(5, 1041647209, -1119951725, -1099964381, 1014677674) + + W(6, 1029735698, -1142189601, -1090236946, 1052197359) + + W(7, -1116032848, 1028031798, 1026856980, -1115831559) + W(8, 1041839801, -1110599850, 1034137049, 1027844545) + + W(9, -1128361629, -1129405415, -1114821509, 1009705546) + + W(10, 1036993018, -1121696025, 1002339317, -1114960439) + + W(11, 1034781465, 1020602063, 993360895, -1130484229); + sum2 = + W(0, 1025029135, -1104367710, -1119205162, 1051361304) + W(1, -1097951274, 1037239658, -1115606678, -1132455965) + + W(2, 1051294613, -1090262380, 1046775583, 1027534783) + + W(3, -1098891737, 1054704406, -1118431701, -1094584814) + + W(4, -1111734067, -1137589907, -1111864983, 1035843132) + + W(5, 1040638061, 1042639742, -1115582191, -1161598998) + W(6, -1112278329, 1038310704, 1033551568, 1042180969) + + W(7, -1116801751, -1113612863, 1017169741, 1037432870) + + W(8, -1095570314, 1054301740, -1102111461, -1137659371) + + W(9, -1123958951, -1137648567, 1040693441, 1006683771) + + W(10, -1108749213, 1017443081, 1031819582, -1122384617) + + W(11, 1008777251, 1032304440, -1103720876, 1038413214); + WS(1060561207, -1110135205); + sum1 = + W(0, -1114856118, 1049197464, -1091745710, 1057921518) + W(1, 1045672489, 1021270499, -1124131449, -1108658488) + + W(2, -1095755605, 1045522218, -1100746808, -1112929307) + + W(3, -1121034566, 1041962623, -1091090769, 1055093690) + + W(4, 1019645080, -1157317541, -1112340961, 1047635080) + + W(5, -1089785676, 1056738433, -1111234056, 1036938084) + + W(6, -1112123800, 1029521634, -1088312300, 1057086969) + + W(7, -1095870350, -1148757666, 1034679769, 1045001085) + W(8, -1105390912, 1048793054, 1047514180, 1026507103) + + W(9, -1115322038, 1019494819, -1095959893, 1049205462) + + W(10, -1099214252, 1019330670, -1107671902, 1038785126) + + W(11, -1089779917, 1057170552, 1022895484, 1029094240); + sum2 = + W(0, -1110883135, 1041894205, -1114700148, -1082032478) + W(1, 1046875162, 1064081845, -1122184691, -1115970606) + + W(2, -1118217955, -1081043792, 1049320576, 1059051295) + W(3, 1008834310, 982318965, -1097954058, -1085641610) + + W(4, 982336213, 1064706681, 1033395903, 1040255170) + W(5, -1109327580, -1095688614, -1107088758, 1066526360) + + W(6, -1110716892, -1134396672, -1107386491, -1084362127) + + W(7, 1032307660, 1060847547, 1024095030, 1031402202) + W(8, -1114148625, -1093205100, -1122373488, 1058657081) + + W(9, -1113505190, -1121857157, -1116084956, -1087863650) + + W(10, 1045820748, 1055302318, -1113542640, 1031923695) + + W(11, -1128842340, -1094939475, 1044473869, 1041403755); + WS(-1088848183, -1091270356); + sum1 = W(0, -1113444636, 1022583331, -1092936920, 1050793382) + + W(1, 1035173048, -1115063927, -1127291412, 1011517178) + + W(2, -1094397598, 1055228191, -1112816343, 1007040780) + + W(3, -1131637032, 1047190142, -1092945549, 1056457416) + + W(4, 1039723405, -1118782984, -1105736260, 1040877723) + + W(5, -1086200137, 1051083611, 1039289519, -1114815627) + + W(6, 1030983166, 1035565944, -1102025475, 1056969730) + W(7, 1015654008, 998545680, -1127378047, -1097520394) + + W(8, -1104020948, 1051399464, -1108815670, -1127143385) + + W(9, 1037357901, -1114602800, -1116833526, 1044492479) + + W(10, -1116817631, 1025703109, -1115666437, -1108205485) + + W(11, -1102830535, 1047811509, 1032741190, -1123886254); + sum2 = + W(0, 1023906737, 1067295699, -1081442287, -1097077469) + W(1, 1029195957, 1026431960, -1110646223, 1065087692) + + W(2, -1085042817, 1037915281, 1015927544, -1132623721) + + W(3, -1119411664, 1065459703, -1083251842, -1096872835) + + W(4, 1018101230, 1018762696, 1010017751, -1118952488) + W(5, 1050008558, -1110920551, 1042598936, -1124571002) + + W(6, -1108429461, -1081475488, 1064700095, 1006981249) + + W(7, -1103158035, 1020104602, 1029589423, -1083105366) + W(8, 1064469883, 1036080906, 1041992018, -1114107558) + + W(9, -1110439418, -1095503285, 1057972141, -1106015672) + + W(10, -1108943564, 1036691137, -1125097343, -1083389324) + + W(11, 1061045473, 1051761632, -1114827780, -1119006739); + WS(1034259896, 1039623341); + sum1 = W(0, 1016878676, -1137539339, 1055868742, -1088089066) + W(1, 1043298073, 984347141, 1028460795, -1104998988) + + W(2, 1047938201, -1091378989, 1036240559, -1121755284) + + W(3, 1034359235, -1129847248, 1058114664, -1090213650) + W(4, 1043122195, 932956556, 1011385345, 1015052988) + + W(5, 1043619008, -1114958501, -1119276751, 1018241806) + + W(6, 1015855070, 1032818160, -1096687428, 1054476715) + W(7, -1110579607, 1026808723, 1016831138, 1044006969) + + W(8, -1092418872, 1049053750, -1101201217, 1034235663) + + W(9, -1128588247, 1033445320, -1100196186, 1040121848) + + W(10, -1106781444, 1010316760, 1025908283, 1043524531) + + W(11, -1095896370, 1044746961, 1018213241, -1120101215); + sum2 = + W(0, 951810592, -1108037836, -1092018666, -1130209970) + W(1, 1022643242, 1009312276, 1033659165, -1102042508) + + W(2, -1107310314, -1115641842, -1110096702, 1032067593) + + W(3, 1002259560, -1103529440, -1101738099, 1041635941) + + W(4, 1034513697, -1114108683, 1037243759, -1102191435) + W(5, 1066447662, 1067062587, -1100161415, 1041326077) + + W(6, -1112310958, -1111056455, 1032823775, -1098661250) + + W(7, 1027860693, -1120382671, 1034753865, -1119026649) + + W(8, 1031795157, -1099014553, -1096684817, 1026651225) + W(9, 992340497, -1101647251, 1040899047, -1117726225) + + W(10, -1114962434, 1038338139, -1114454490, 1024637657) + + W(11, 1046257437, -1111013301, -1112982645, -1106704138); + WS(-1096556910, 1067967914); + sum1 = W(0, 1032707155, -1122886335, -1095119782, 1055235700) + + W(1, -1120012638, 1031514684, 1024354487, 1031668012) + + W(2, -1103532312, 1048353625, -1105977207, -1126996321) + + W(3, -1131915011, 1021347526, -1095435756, 1044387963) + + W(4, -1105830818, -1116416117, 1043480447, 1041914807) + + W(5, -1090836352, 1053060297, -1133082414, 1043128001) + + W(6, -1118942187, 1036630543, -1091218783, 1041581564) + + W(7, 1017318739, -1110350280, -1132633269, 1034774528) + + W(8, -1104917967, 1052242886, -1121967338, 1039162573) + + W(9, 1031302952, -1125222297, -1100801113, 1033613430) + + W(10, -1130484760, -1148985233, 1031513592, -1106257250) + + W(11, -1104067043, 1050269976, -1109204860, 1034839630); + sum2 = + W(0, -1125934657, 1041393774, -1097497496, 1047775001) + W(1, -1131783044, -1122059316, -1120747465, 1032139854) + + W(2, -1114660789, -1105604596, 1018330620, -1129241452) + + W(3, -1126946517, -1107151652, -1096477783, 1048515105) + + W(4, -1096755902, -1147658728, 1019390634, 1046075673) + W(5, 1057927405, 1059160295, 1041946221, 1011994599) + + W(6, -1140291646, -1090083756, -1110210473, 1043731078) + + W(7, -1091797353, 1032850220, 1045993569, 1024325836) + W(8, -1137735680, 1039621515, 1046026631, -1126091098) + + W(9, -1110717499, -1116058677, 1033250412, -1116506490) + + W(10, -1106745231, 1009337229, 1038335355, -1097350707) + + W(11, -1127153776, 987432265, -1124643180, -1124186068); + WS(1061843767, -1077951557); + sum1 = + W(0, 1026388735, -1106366502, 1059311576, -1088217072) + W(1, 1041378862, -1102542817, -1120114128, -1131166601) + + W(2, 1043697070, -1105977039, -1130669927, 1039925540) + W(3, 1037862893, 1029755951, 1054385928, -1091419383) + + W(4, 1047467576, 989452730, 1029309653, -1091391038) + W(5, 1057568381, -1089136642, -1111164306, -1105668215) + + W(6, 1036389538, 1048316317, 1054220568, -1092475601) + + W(7, 1053509792, -1138232735, -1122000006, -1099454574) + + W(8, 1049723715, -1095416897, -1108260705, -1130981221) + + W(9, -1126306304, -1106178153, 1050234615, -1096877448) + + W(10, 1038585474, -1107228323, 1030215888, 1034019808) + + W(11, 1058416302, -1091809363, 1045917860, -1116719540); + sum2 = + W(0, 1061533858, 1041546460, -1081881922, -1104625991) + W(1, 1020257203, -1112819836, 1062451832, 1044663473) + + W(2, -1084977950, -1116240264, -1107478927, -1146254682) + + W(3, 1068272760, 1019905335, -1081565785, -1115490290) + W(4, 1038097782, 1018218872, 1070735043, -1103665132) + + W(5, -1079025547, -1094934042, -1129735749, -1108448519) + + W(6, 1070929067, 1027882908, -1082597652, 1002519540) + W(7, 1043320870, 1032555484, 1058522058, 1053579543) + + W(8, -1079765468, -1096683616, 997759194, -1111378699) + + W(9, 1059576348, 1030217484, -1088759123, -1103272320) + + W(10, -1110736144, 1018278443, 1052624489, 1042937819) + + W(11, -1090364693, 1039524167, 1041293151, -1120119454); + WS(-1084224055, -1088316584); + sum1 = + W(0, -1113613001, -1107673717, 1006747746, 1039555654) + W(1, 1033838821, -1159624430, 1003388692, 1028109079) + + W(2, -1098426505, 1048291572, 1024741190, -1124153911) + + W(3, -1106869627, 1012698375, -1088923256, 1059475506) + W(4, -1120760050, 1033833840, 1016662735, 1027116933) + + W(5, -1097246285, 1054502102, 1019707757, 1010228666) + W(6, 1022316973, -1094644889, 1057877820, -1093203288) + + W(7, 1048977331, -1114819581, -1136760929, 1023495179) + + W(8, 1033746004, -1098003683, 1036081339, -1110624834) + + W(9, 1028746387, -1107590588, 1041863252, -1105649846) + W(10, 1041797102, -1119454813, 984919127, 1024116594) + + W(11, 1022736621, -1114921814, -1127589064, -1122201606); + sum2 = W(0, 1015245257, -1113301472, -1126889814, -1122805777) + + W(1, 1024783162, -1125306444, -1113948506, -1150409563) + + W(2, 1027745966, -1121614859, 1024732276, -1120982285) + + W(3, -1130594159, -1113241340, 1053517180, 1035094088) + W(4, 1035927962, -1117285071, 1007533655, 988101766) + + W(5, -1115083078, -1117590123, 1033594898, -1115586407) + + W(6, -1122336092, -1114338752, -1120298083, 1041346715) + + W(7, -1136757529, -1179946326, -1131246557, 1042344950) + + W(8, 1009652067, 1010321235, -1112303516, -1122655190) + + W(9, -1121042747, 1024929700, 1023796132, 1022595647) + + W(10, -1107129305, 1031780006, -1112003767, 1034588627) + + W(11, 1015099871, 1021357977, -1116844702, -1109817399); + WS(1056759150, 1060224665); + sum1 = W(0, -1139374311, -1132085157, -1099925456, 1041263149) + + W(1, 1033127353, -1131329248, 995010733, 1023919167) + + W(2, -1105275165, -1143162806, 1020125661, -1128574472) + + W(3, -1111414410, 1047983919, -1089721802, 1045591848) + + W(4, 1047176279, -1124813330, -1108849608, 1035204919) + + W(5, 1047380996, 1054640011, -1109178223, -1115433611) + + W(6, 1028987391, 1044747100, -1111752399, -1086265361) + W(7, 1047077327, 1014274699, 1016981889, 1009635916) + + W(8, -1106656308, 1052567064, 1025513390, -1114033239) + + W(9, -1123115291, 1026679904, -1119632759, -1119813375) + + W(10, 1020940735, -1135589654, -1129401942, -1133052010) + + W(11, -1103728616, 1036660778, 1026259564, -1154487021); + sum2 = + W(0, 1023227060, -1114834111, -1123255684, -1111609489) + W(1, 1029177075, 1009084849, 1023565277, -1123243930) + + W(2, 1036838581, -1109001470, 1046335474, -1110362282) + + W(3, 1023373012, -1110717616, -1121973236, -1106028739) + + W(4, 1040383540, 1030364025, -1127246210, -1119831250) + + W(5, -1128787384, 1068968933, -1085459757, 1038001226) + W(6, 1035525242, 995075850, -1106791563, -1084327071) + + W(7, 1055427968, 1004844681, -1115895934, -1112704991) + + W(8, 1017209933, 1049794788, -1106438120, -1109625554) + + W(9, 1032252451, -1137853837, 1025363014, -1103092626) + + W(10, 1039281515, 1026824663, -1115664904, -1177558227) + + W(11, -1117762720, 1033559138, -1108939748, 1027051057); + WS(1059198391, -1114206899); + sum1 = + W(0, -1123230572, 1047908609, -1086695351, -1111534963) + W(1, 1041894153, -1168813170, 1033309054, -1113872057) + + W(2, 1005036838, -1127426130, 1035651728, 1029018614) + + W(3, -1136657179, -1131612168, 1053830093, -1097279138) + + W(4, -1114797926, 1015674230, 1042361008, 1032838544) + W(5, 1063074340, 1032841926, 1042266564, -1115081892) + + W(6, -1127872354, 1018582917, 1022976638, -1102974814) + W(7, 1036160183, 1022213546, 1026831155, 1025662981) + + W(8, 1048968528, -1086802103, 1043048448, -1119589535) + + W(9, 1034821095, -1122684754, 1037218004, -1094977286) + W(10, 1028546130, 1023015663, 1027013917, 1042918755) + + W(11, 1045668084, -1080167184, 1051954532, -1121567905); + sum2 = W(0, -1109294951, -1116747636, 1053044316, -1093594252) + + W(1, -1105874671, 1036768486, 1044771761, -1095594447) + + W(2, -1102224225, 1044254591, -1148207325, -1122217612) + + W(3, -1106240469, -1091993541, 1065361960, -1103264547) + + W(4, -1098859579, 1038496462, 1037653814, -1098134808) + + W(5, 1060397410, 1059446961, -1110887683, -1106764847) + + W(6, -1132138943, 1045429231, -1095097189, 1053539276) + + W(7, -1103270924, 1035231626, -1129034439, -1112675284) + + W(8, -1139768526, -1147713757, 1018090127, -1112984312) + + W(9, 1027920896, 1030264036, -1100471477, -1115698004) + + W(10, -1105560593, 1037287074, -1126749735, 1027709116) + + W(11, -1095674438, -1131922215, 1044415945, -1106415399); + WS(-1081905372, 1072993545); + sum1 = W(0, 1004609681, -1111485397, -1100618406, 1052555682) + + W(1, -1113666277, -1113131956, -1113931058, 1044870886) + + W(2, -1103601459, 1050421002, -1125853837, -1119475260) + + W(3, 1017897178, -1101161424, -1117978262, 1053397115) + + W(4, -1109207833, -1119057377, -1110350900, 1042868018) + + W(5, -1088871615, 1057434595, -1108715676, -1116054255) + + W(6, -1119842647, 1016958866, -1096217303, 1037835279) + W(7, 1041223333, 1033629886, 1029593625, 1036666966) + + W(8, -1090419947, 1054502387, -1131918060, 1019600139) + + W(9, -1114320538, 1034341084, -1105396084, 1036260396) + + W(10, 1046093262, 1034832815, 1026419555, -1123516147) + + W(11, -1100180286, 1041011339, -1108472674, 1025124935); + sum2 = + W(0, 1027207918, -1134820995, -1123507780, 1022927690) + W(1, -1148644129, -1124904791, -1131003531, 1019005665) + + W(2, 992028222, 1039006609, -1114458430, 1019252639) + W(3, -1155176792, 1018656479, 1020777698, -1108026125) + + W(4, 985006155, 1019665619, -1144704129, 1016837667) + + W(5, -1093100477, -1075529389, -1165905039, -1148497627) + + W(6, -1120277627, -1133755465, -1106617270, -1071234400) + + W(7, 1009164120, -1154476856, 1018692534, 1007330736) + W(8, 1026210395, -1098388857, 1080134310, 1041946375) + + W(9, -1122116985, 1008190855, 1015481059, 1043410538) + W(10, 1068769301, -1120913968, 1016313728, 1024160458) + + W(11, 1009441727, -1127804151, 1038162442, -1102924087); + WS(1052536174, -1151096569); + sum1 = W(0, 991116371, -1128173243, -1103836723, 1032573088) + W(1, 999976938, 1037991630, 1033302347, -1146822742) + + W(2, 1034951935, -1120898050, -1138114279, 1035558856) + + W(3, -1116642336, 1036050892, -1087917523, 1057405287) + + W(4, -1098834165, 1042054293, -1115536654, 1034768509) + + W(5, -1106200391, -1120590821, -1118223722, 986260550) + + W(6, 1020657940, -1102372039, 1061554222, -1082912644) + + W(7, 1047922098, -1130396508, -1114833734, 1030675614) + + W(8, 1041046871, 1002819162, -1107937520, 1023135729) + + W(9, 1031490598, -1114628406, 1046795201, -1124848916) + + W(10, 1038688870, -1142052488, -1158391502, 1032401267) + + W(11, 1027714602, -1124036191, -1118805976, -1177279769); + sum2 = W(0, 1035223119, 1038869307, -1108836158, -1105867416) + + W(1, -1106282608, 1028503999, -1127800761, 1034423710) + + W(2, -1116666352, -1109342419, 1047028407, -1119414296) + + W(3, 1038890181, -1109261585, -1087753137, 1027333841) + + W(4, -1148256348, -1113209005, 1028905699, -1095895125) + + W(5, 1061176216, 1057224086, -1148022324, 1010099974) + W(6, 994981383, -1098712671, -1099737664, 1049674522) + + W(7, -1103462952, 1020393479, -1127955051, 1032845262) + + W(8, -1208820627, 1011854042, 1043242553, -1115953239) + W(9, 998786660, 1030375171, -1126035264, 1017325847) + + W(10, -1121350765, 1024565993, -1121293280, -1114148994) + + W(11, 1042226462, -1120003540, -1117125009, 1001260628); + WS(1058902967, -1081860445); + sum1 = W(0, -1121371387, -1116017491, -1114517185, -1144385454) + + W(1, 1031405875, -1133995267, 1029881036, -1110722656) + + W(2, -1096281750, 1046612526, 1032371736, -1118231237) + + W(3, 992316765, -1103068528, -1110556335, 1050079932) + + W(4, -1114542190, 1037331941, -1117974353, -1120254383) + + W(5, -1087192661, 1061346066, -1113719056, -1117606232) + + W(6, 1019164800, -1111729689, -1138608617, 1054224317) + + W(7, -1147587566, 1027634660, -1115308289, -1123116948) + + W(8, -1119671953, 1023689473, -1121094047, -1114416951) + + W(9, 1031905998, -1110978129, 1026716344, 1034730016) + + W(10, 1032702160, -1150819433, -1118946572, 1027465948) + + W(11, 1026550240, 990814541, 1025765741, 1002408318); + sum2 = + W(0, -1127268449, 1017520494, 1046612660, -1104246964) + W(1, -1098833757, 1019779427, 1008157504, -1110533731) + + W(2, 1053115740, -1126879265, -1103206877, -1135658469) + + W(3, 1022079949, -1110799425, 1042237616, 1071620340) + W(4, 1047260740, -1112586418, -1129508015, 1038116680) + + W(5, -1081939523, -1082767624, 1046386206, 1021781126) + + W(6, 1023435994, -1149062134, 1046590815, -1091995420) + W(7, 1034566387, 1021597755, 987488696, -1109564641) + + W(8, 1019421448, -1133233221, -1113663072, 1025921212) + + W(9, -1149203238, 1031926637, 1025089506, -1113723868) + + W(10, -1131415815, 1022181144, 1025441916, -1140288129) + + W(11, 1002014090, 1008464055, -1120607589, -1133866981); + WS(-1118927728, -1114990634); + sum1 = + W(0, -1123938375, 1033195056, 1057535917, -1087859524) + W(1, -1107191040, 1047574307, 1040612950, -1114716774) + + W(2, 1047260544, -1132924433, 1007112943, -1106834116) + W(3, 1024746402, 1048819881, 1042772673, -1087499341) + + W(4, 1043648426, 1044210486, 1022214714, -1104426015) + W(5, 1057677234, -1097320317, -1093740782, 1028537764) + + W(6, 1038811590, -1105195831, 1045869257, -1091890215) + + W(7, 1042013107, -1106862316, -1112630087, 1042575344) + W(8, 1057533694, -1089715893, 1020754614, 1047539199) + + W(9, -1118622728, -1098438774, 1042859777, 1029276300) + + W(10, -1107815558, -1107232885, 1031232344, 1038434900) + + W(11, 1055588422, -1091230428, -1113991309, 1041569343); + sum2 = + W(0, -1117938617, -1098776947, 1052841626, -1111689798) + W(1, -1101990052, 1034353164, 1034943831, -1074997876) + + W(2, 1071950042, 1008522816, 1023979086, 1019125592) + W(3, 1047294563, -1067348911, 1078478928, 1042633900) + + W(4, -1106116215, 1021696573, -1112881764, -1073328658) + + W(5, 1075942353, -1105497105, 1040726051, 1032192788) + + W(6, -1113196518, -1106856879, 1048374094, -1100859969) + + W(7, -1128120408, -1129459590, 1017166837, 1007574096) + + W(8, -1110198115, 1027760421, 1041816709, -1114781060) + + W(9, -1119652380, 1040326435, 1016518417, -1106280857) + W(10, 1015116440, 983174391, -1122537978, 1003760381) + + W(11, -1132261857, -1146348222, 1015700123, 1019612376); + WS(1034111416, -1106797037); + sum1 = + W(0, -1127934684, -1113852291, -1096035023, 1052464285) + W(1, 1032415443, -1113420426, -1146675705, 1035613338) + + W(2, -1102929642, 1042719307, -1114220817, 1025128440) + W(3, 1006977829, 1034804131, -1090308252, 1054858571) + + W(4, 1032020487, -1114922591, -1113401378, 1037672145) + + W(5, -1089088820, 1057164897, -1123663635, -1136503085) + + W(6, 1019549798, 1044038057, -1096624416, 1050796251) + W(7, 1035431737, 1026704599, 1016064490, -1106829090) + + W(8, -1097224209, 1048920159, -1131720964, -1109868785) + + W(9, -1139061950, 1033066250, -1104516203, 1042039981) + W(10, -1114943722, 1024811962, 998716411, 995721454) + + W(11, -1095532026, 1049209393, 1041424208, -1138798477); + sum2 = + W(0, 1018373307, 1030944977, -1120549779, -1139755202) + W(1, -1101691927, 1049483493, -1117669473, 1035483586) + + W(2, -1113169149, -1114451942, -1102665013, 1049560407) + + W(3, 1036793172, -1120221588, 1031305133, 1047991436) + + W(4, -1083948126, 1057078402, -1107254646, -1138388666) + + W(5, -1118729068, 1050438576, -1083351573, 1060878230) + + W(6, 1027210469, -1119036598, -1123944089, 1058194810) + W(7, -1081291530, 1058504911, 983011887, 1026801669) + + W(8, -1136088418, -1103576008, -1106933299, 1044728114) + + W(9, -1124389554, -1120993070, 1045466087, 1037255439) + W(10, -1095248620, 1047223280, 999841656, 1036234905) + + W(11, -1110162376, -1114267729, -1124771645, 1036725012); + WS(1038841272, 1052605132); + sum1 = + W(0, 1031922765, -1100459309, 1037270288, 1026910357) + W(1, 1023447506, -1104596348, -1104568331, 1046914264) + + W(2, 1041702805, -1101939446, -1114279623, 1044685961) + + W(3, 1037544250, -1120141702, -1098675705, 1040827436) + + W(4, 1048352911, -1104877098, -1109808312, -1117060814) + + W(5, 1045728636, 1037079325, -1115507167, -1117405559) + + W(6, -1115625903, 1046551204, 1017164043, -1095425143) + W(7, 1040518727, 1032200833, 1042593752, -1097718198) + + W(8, 999474559, 1046662664, 1038294495, -1104511859) + W(9, -1105481799, 1032086688, 1031450455, -1103113592) + + W(10, -1106032688, 1039045107, 1033924054, -1112841053) + + W(11, 1034794943, 1015870568, 1041969331, -1111795079); + sum2 = W(0, -1119788132, 992683382, 1018867293, 1022669528) + W(1, 1044098145, -1102594356, 1033659476, -1104347191) + + W(2, 1020892153, 1043646320, 1022003003, -1105788334) + + W(3, -1112158198, 1044081475, -1090780387, 1053457206) + + W(4, 1053806225, -1097169858, 1008462738, 1034564598) + + W(5, -1098943438, -1103925357, 1061138285, -1089462725) + + W(6, -1128623485, 1037093866, 1024702018, -1094689316) + + W(7, 1061570617, -1090351234, -1135723434, -1118342628) + + W(8, 1037085984, -1130567667, 1042502677, -1124000960) + + W(9, 1030330775, 1008221186, -1108937272, -1111881166) + + W(10, 1045330453, -1102638867, -1125624097, -1116661382) + + W(11, 1041747819, 1006874186, 1015917808, -1119261652); + WS(1059476151, -1123203418); + sum1 = W(0, -1111725774, 1035594491, -1091810916, 1057461865) + + W(1, 1016189354, -1123857235, 1032359159, 1034919857) + W(2, -1140486487, 1048140086, 1034245225, 1028750247) + + W(3, -1110577724, -1111760306, -1084838663, 1060577506) + + W(4, -1104347695, -1113205590, -1105544893, 1046155316) + + W(5, -1086139015, 1052038472, 1027870402, -1121460986) + + W(6, -1121304930, 1044165509, -1095808892, 1057513991) + + W(7, -1103056264, -1148349487, -1115245634, 1020829292) + + W(8, -1096673622, 1053266340, -1108853472, -1113141864) + + W(9, 1036887935, 1039852002, -1127813812, 1045123672) + + W(10, 1031021091, 1036934292, -1110517831, -1120384574) + + W(11, -1090491960, 1055106407, -1133152957, 1011178567); + sum2 = + W(0, -1114868977, 1026556603, 1004734644, 1034344926) + W(1, 1040708934, -1131620842, -1107973502, -1115461868) + + W(2, -1092079110, 1042028492, -1103991549, -1105590488) + + W(3, 1044770988, -1104823400, 1059587552, 1024895663) + W(4, 1051421807, 1029419915, -1101288212, -1105554340) + + W(5, 1045430990, 1050688149, -1095880897, -1114582112) + W(6, 1025917421, 1036199790, 1037874646, 1047334362) + + W(7, -1118101029, 1015496806, 1028043472, -1116199065) + + W(8, -1137785064, -1116948841, -1122024357, -1121536685) + + W(9, -1111158861, 1020651575, -1093651456, 1044938016) + + W(10, -1099771430, -1121478353, -1123193100, -1128075734) + + W(11, -1127404110, 1042458099, 1007412048, -1127827256); + WS(-1096078190, -1082738059); + sum1 = W(0, 1007239809, -1108860284, -1100207850, 1053165251) + + W(1, -1112013420, -1115685558, -1114850361, 1046670329) + + W(2, -1101169270, 1050939564, -1126100266, -1124400725) + + W(3, -1130257143, -1103368477, -1116530972, 1051252601) + + W(4, -1112810720, -1112871192, -1112210107, 1045976117) + + W(5, -1088435015, 1056131912, -1124484747, -1117830909) + + W(6, -1118665957, 1029494103, -1092482434, 1045571555) + W(7, 1041969097, 1031308937, 1028242343, 1036298605) + + W(8, -1090334611, 1053021861, 1032260218, -1143992478) + + W(9, -1116764258, 1029804679, -1105280439, 1035862579) + + W(10, 1044490698, 1037078646, 1022403683, -1128309634) + + W(11, -1099682433, 1038809821, -1114977769, 1016808747); + sum2 = + W(0, -1133820219, 1027229337, -1115513384, 1007940354) + W(1, -1156542700, 1020775992, -1147891684, 1032424255) + + W(2, -1107406978, -1125237780, 1031863482, 994071912) + W(3, -1127336652, -1137665638, 1037916056, 1044701152) + + W(4, -1113898133, -1127018949, -1127200453, 1045946307) + + W(5, -1096925824, 1067148595, 1048747828, -1115116116) + W(6, 1020736496, -1116510358, 1031285965, 1076670751) + + W(7, -1101339101, -1122694416, 1001166860, -1145031593) + + W(8, -1138759126, 1039470145, -1070343554, -1106720041) + + W(9, 1022486646, -1116471963, 1020254812, -1109537872) + + W(10, -1082365934, 1034791139, -1135690985, -1126621635) + + W(11, -1122394148, 1025436583, -1107321525, 1039293842); + WS(1056919406, -1123699093); + sum1 = W(0, -1153021483, 985933670, -1089586019, 1058308826) + + W(1, -1122912091, -1130942473, 1016658279, -1142160193) + + W(2, -1106728023, 1043832952, -1111941676, -1162334614) + + W(3, -1169964908, 1032391598, -1095447822, 1054485203) + + W(4, -1114359010, -1115887538, -1131540465, -1109380555) + + W(5, -1095937215, 1051425640, 1038539876, 1035573952) + + W(6, -1116724456, -1112807501, -1092279079, 1057168451) + + W(7, -1129000267, -1120065804, 1018808083, -1115139838) + + W(8, -1105250414, 1053123845, -1105627696, 1037216107) + W(9, 986184318, 1023499017, -1104943256, 1034402292) + + W(10, 1011544866, -1114397383, 1026972628, -1119658051) + + W(11, -1093497009, 1056025192, -1129701482, 1031803900); + sum2 = + W(0, 1034281368, -1104410341, 1018060402, -1138447737) + W(1, 994323516, -1140256393, -1126716121, 1032410612) + + W(2, 1017706532, -1115589617, 1029627322, -1133676977) + + W(3, -1121241308, -1087414339, 1061712823, 1021983592) + + W(4, -1133709215, 1012505315, 1045372780, -1068615761) + + W(5, 1078313037, -1100339818, 1015111478, -1130902073) + + W(6, 1035929285, -1067644471, 1079888634, -1123293195) + W(7, 1023885100, 1028720332, 1047600787, -1091405946) + + W(8, 1048822788, 1030149270, -1124744731, -1123320040) + + W(9, 1004087438, -1118166494, 1023636550, -1120625820) + + W(10, 1010097407, 1022959192, 1041718259, -1097556864) + + W(11, 1035128990, 1021734756, 1009567515, -1136405679); + WS(1057577783, -1116545908); + sum1 = + W(0, -1140559047, 1023488522, 1031631673, -1127758170) + W(1, 1037581685, -1129099776, -1119858755, 1007841757) + + W(2, 1034355893, -1102068668, 1038802963, 1023940956) + W(3, 1001413734, -1099448121, 1034820815, -1139646818) + + W(4, 1020321573, 1023108226, 1019558160, -1135636631) + + W(5, -1095265297, 1043309332, -1118918103, -1133216315) + + W(6, 1027838711, -1106014610, -1133110549, 1058446926) + + W(7, -1104027725, 1027058075, -1123065945, -1112832085) + + W(8, 976310772, 1018622064, -1110623851, -1123708581) + W(9, -1133184076, -1132115376, 1031909175, 1033516923) + + W(10, -1124259695, 1025545342, -1116764451, 1007686986) + + W(11, 1033492939, 1033353766, -1114622946, -1118432359); + sum2 = + W(0, -1139693312, -1124752720, -1098950560, 999696497) + W(1, -1111434581, 1026280044, 1036960926, -1121090060) + + W(2, -1103693150, 1034222778, -1119707404, 1014405392) + + W(3, -1143311649, -1099787410, 1033289622, -1104157082) + + W(4, 1018041096, -1121205834, 990661185, -1112556974) + W(5, 1052753541, 1058657457, -1108624084, 1023217352) + + W(6, 1015972640, -1123282486, -1106573325, 1042484509) + + W(7, -1111132399, 1005957425, 1000525745, -1104610584) + W(8, 1031872996, 1044261031, -1121815492, 1017712752) + + W(9, -1129692664, 1028371280, -1115662969, 1026599244) + + W(10, 1018446608, -1139874592, 1028832752, -1104217347) + + W(11, -1115847157, 1041506121, -1129135268, 1010211304); + WS(1063874743, -1123600943); + sum1 = + W(0, 1026726381, -1110972995, -1088392527, 1060534134) + W(1, -1131352649, 1017113381, 1005084141, 1029034162) + + W(2, -1096434085, 1052968261, -1125442370, 1023149165) + + W(3, -1121313992, 1029564141, -1088422197, 1061531727) + + W(4, -1111100967, -1121647548, 1022502021, 1019350337) + W(5, -1089197156, 1048937234, 1007055431, 1028622922) + + W(6, 1010678471, 1021423943, -1089730182, 1053585019) + + W(7, -1124123103, -1132301739, 1012880846, -1112342611) + + W(8, -1099324833, 1049533342, 1037169096, -1122598880) + W(9, 1016038684, 1036724585, -1105649226, 1044791660) + + W(10, -1119334386, 1017220849, 1031948511, -1096649610) + + W(11, -1102131796, 1047748258, 1048887628, -1134858375); + sum2 = + W(0, 1041516351, -1098661524, 1065773241, 1067471192) + W(1, -1095722385, 1025030832, -1114001722, -1113317539) + + W(2, 1066164852, 1062194047, 1029392016, 1015621429) + W(3, 1031962338, 1041960143, -1094243603, -1131590099) + + W(4, 1045112423, 1033273068, -1127882717, -1113172562) + + W(5, -1071023147, -1071391818, 1027735196, -1106774969) + + W(6, 1024371132, 1057245216, -1087722937, -1082288010) + + W(7, 1047570295, 1021784721, -1116893380, -1108932190) + + W(8, 1043021464, 1036914992, -1110460182, -1147670187) + W(9, -1137233618, 1040530840, 1059923771, 1056604249) + + W(10, 1008215114, -1157997580, 1035584360, -1090505328) + + W(11, 1062948018, 1065534266, -1096088381, 1025226110); + WS(-1081605212, 1037230241); + sum1 = W(0, -1129286954, -1115600951, -1139829872, 1042245092) + + W(1, -1130516890, -1191245347, -1127382348, -1127078325) + + W(2, 1037397159, -1101819637, 1025459530, -1140137724) + + W(3, -1114123448, 1045220821, -1103957592, 1057239854) + + W(4, -1098019463, -1135821456, -1119205995, 1032978341) + + W(5, 1057561887, -1089716883, 1040837167, -1153142562) + + W(6, -1116053850, 1031622828, 1057799156, -1088291628) + + W(7, 1039979404, -1123070334, -1114061454, 1039357911) + + W(8, -1103125195, -1162281827, -1123433113, -1115244132) + + W(9, 1024011222, 1020277751, 1035843369, -1111135597) + W(10, 1008116332, 975751222, -1165173963, 1026874614) + + W(11, -1159950147, -1144308089, -1115664788, -1121723210); + sum2 = W(0, -1129847377, 1027890930, 1045384717, -1131041629) + + W(1, -1118537275, -1129495121, -1132201467, -1115667911) + + W(2, -1139027758, -1086235324, 1015945835, 1022067627) + + W(3, -1111059277, -1109124506, 1062718876, 1071241567) + + W(4, -1090110249, -1139816838, 1032250249, -1115518668) + + W(5, -1088514518, -1104078593, 1050303031, -1109320206) + + W(6, 1003251981, -1131706033, 1043614591, -1091065468) + + W(7, -1130925231, 1035917053, -1175110606, 1033851379) + + W(8, -1096199608, 1021865867, 1030828678, -1140186118) + + W(9, -1119100754, 1008685286, 1038009999, -1113376611) + + W(10, -1128909271, 1027374356, 1007928974, -1130851063) + + W(11, -1126833063, -1120766781, -1121346672, -1130315761); + WS(1048635758, -1111558989); + sum1 = W(0, -1116715915, -1114167026, 1019884197, 1046236914) + + W(1, 1023679491, -1123924777, 1007517554, -1144951432) + + W(2, -1100411873, 1042364482, 1030303424, -1115625243) + + W(3, -1125319757, 1032434734, -1082609609, 1057088310) + + W(4, 1025882348, 1018952757, -1130676803, -1116349759) + + W(5, -1099356457, 1060062511, 1027068912, -1117219752) + + W(6, 1032051720, 1007313161, -1114189151, -1105629450) + + W(7, 1046455412, -1128015465, -1122176818, 1037795522) + + W(8, -1098216348, 1032549225, 1037080648, -1117338239) + + W(9, 1019813529, 1011561671, -1118483848, -1156935944) + + W(10, 1024380849, 1001454266, -1125995833, 1022555096) + + W(11, -1115419480, 1017135051, 1020138940, 1015509889); + sum2 = + W(0, 1017200252, 1032764106, -1100965710, -1120952053) + W(1, 1023440400, 1026555164, -1128076598, 1032749056) + + W(2, 1036328960, -1105592489, 1037836738, -1121478225) + + W(3, 1020177744, 1042154489, -1079875623, -1093732085) + + W(4, -1110726007, 1032334674, 1027061114, -1091917968) + W(5, 1069362278, 1053281179, -1110949820, 1004458190) + + W(6, -1120062015, -1115647155, 1041923814, 1053015354) + + W(7, -1097734576, 1030547292, 1007295183, -1109350747) + + W(8, -1121245377, 1023497366, 1029656316, -1115087241) + W(9, 1005463470, -1136438311, 1023734232, 1044015507) + + W(10, -1107014120, 1024950244, -1120999608, -1152745757) + + W(11, -1115720719, 1040619345, 1039138178, -1107079388); + WS(1057226679, -1099093504); + sum1 = W(0, -1117743115, -1106860569, 1059123761, -1116606854) + + W(1, -1117312579, -1126837697, -1111361838, -1097721634) + + W(2, 1043835217, -1113320356, 1021938430, -1108681130) + + W(3, -1142218540, 1017711998, 1054886149, -1098795498) + + W(4, 1024346219, -1128001843, -1115584496, -1098477656) + + W(5, 1036645937, 1036044245, -1113074392, -1126342351) + + W(6, -1144474236, 1017808579, -1096319852, 1058878095) + + W(7, -1113306631, -1145404316, -1112915081, -1127808199) + + W(8, -1102898152, 1054951826, -1104150268, 1022603516) + + W(9, -1118048876, -1110778360, -1108186916, 1042821748) + + W(10, -1109837016, -1113519979, -1124754680, 988685674) + + W(11, -1103594844, 1057715322, -1104945799, -1166667748); + sum2 = + W(0, 1017552406, -1115134458, -1123239700, 1040415751) + W(1, 1024802817, -1116030864, -1121365003, -1113297695) + + W(2, 1033578978, -1119377084, -1140510683, -1154029132) + + W(3, 1024315197, -1121331284, 1032104202, 1033268884) + W(4, 1031096569, -1127078294, -1126393870, 1034056828) + + W(5, -1122610502, 1042552247, 1027588477, -1123710517) + W(6, 1006096662, -1116036592, 1042239151, 1014688747) + + W(7, -1116363642, -1142638070, 1026122801, -1122098200) + + W(8, -1128246386, 1038912262, -1106292650, 1002524342) + + W(9, -1115019758, -1138309587, -1130645774, 1011328923) + + W(10, -1119712705, -1123496021, 1010820131, -1114451237) + + W(11, 1021632898, 1013103251, -1106135611, 1026182445); + WS(-1108758968, -1120615143); + sum1 = + W(0, 1007512449, 1043847294, 1041722714, -1089504654) + W(1, 1035899020, 1021562716, -1118729201, -1115009907) + + W(2, 1047642150, -1097300100, 1024857813, -1157490338) + W(3, 1033236958, 1038269372, 1052029054, -1092318719) + + W(4, 1041772976, 1033997944, -1188181540, -1103491829) + + W(5, 1056274631, -1092329088, -1115586563, -1127937658) + + W(6, 1032455763, 1026842103, 1057598894, -1088834696) + W(7, 1037648114, 1034853541, -1139132956, 1028990457) + + W(8, 1044856958, -1094694701, 1028932916, -1139535439) + + W(9, -1126666947, -1112992067, 1049081300, -1102944265) + W(10, 1031373190, 999073631, 1028445809, 1045480960) + + W(11, 1008203541, -1095636207, 987483733, 1033314299); + sum2 = W(0, 1022601823, -1119857460, -1099325942, -1068582801) + + W(1, 1035739756, 1015907333, 1027503424, 1016942723) + + W(2, -1112391205, -1076271776, -1104095012, 1016973548) + + W(3, -1114440342, -1113768249, 1050839307, 1067690352) + + W(4, 1026494027, -1122697579, 1031020236, 1049278985) + W(5, -1097330938, 1077639092, 1047876791, 1015148595) + + W(6, -1115479573, 1023747258, 1019565806, 1061065209) + W(7, 1016405011, -1106941761, 1028798660, 1008539869) + + W(8, -1108724816, -1120523343, -1115660355, 1032414836) + + W(9, -1137878778, 1030670036, -1143955309, 1002861982) + + W(10, 1022661839, -1126087053, 973255146, -1124354630) + + W(11, -1115374863, 1029925423, 1033007729, -1124658022); + WS(-1125070560, -1096513533); + sum1 = + W(0, -1112401838, 1032850683, -1111199410, 1046757622) + W(1, 1033951818, -1110786345, -1141896047, 1035442769) + + W(2, -1105684773, 1047296038, 1013771590, -1113414691) + + W(3, -1114813980, 1027743049, -1093508577, 1061969278) + + W(4, -1100008383, -1131095256, -1125005414, 1036941992) + + W(5, -1099350541, -1107426238, 1023589122, -1114443933) + + W(6, 1026386210, -1104378805, 1060063436, -1092774776) + W(7, -1122038496, 996299870, -1115056418, 1037833707) + + W(8, -1112618105, 1028130403, -1110298148, -1117830096) + + W(9, 1012901881, 1022681350, 1035294797, -1127381572) + + W(10, 1030080099, -1140100259, -1125623196, 1033887999) + + W(11, 988362813, 1016528878, -1106008748, 1014753608); + sum2 = + W(0, -1128089453, 1024340419, -1102023306, -1103821003) + W(1, 1043342989, -1119644228, -1110645236, 1043920397) + + W(2, -1114712453, -1097377481, -1109265540, 1026656603) + + W(3, -1130916401, -1129344777, 1028225499, 972074333) + W(4, -1100613575, 1034952995, 1026446699, 1009781987) + + W(5, 1057874897, 1059140954, -1103696793, 1032660433) + W(6, -1115610756, -1102796808, 1052660862, 1038144249) + + W(7, -1116201867, -1130501689, 1032679495, 1037523581) + + W(8, -1102216434, -1107293486, -1131885037, 1029362471) + + W(9, -1114433002, 1023912055, -1127455825, 1006589878) + + W(10, -1105206442, 1013212643, -1123355757, 1026431795) + + W(11, -1128264837, -1102041035, -1127587329, 1005668278); + WS(1049867118, 1034735186); + sum1 = + W(0, -1127774262, 1029333619, 1019113028, 1024964758) + W(1, 1007980364, -1121402761, -1117373036, -1123455456) + + W(2, 1040322517, 1032014380, 1019723167, -1118901061) + W(3, 1031064438, -1105261096, 1040279186, 1048588372) + + W(4, -1114399774, -1126411220, -1112922680, -1096141178) + + W(5, -1101685436, 1050135703, -1100797936, -1110911420) + + W(6, 1012648832, -1120189874, 1044944438, 1034886579) + W(7, -1113398479, 1019321608, -1132535687, 1024540628) + + W(8, -1121818673, 1040490120, -1150021355, -1114680743) + + W(9, -1120670652, -1138107141, 1035373868, 1016312768) + + W(10, -1128775361, -1121234663, -1140537009, 1000234461) + + W(11, 1032620736, 1034120602, 1008873398, -1121766352); + sum2 = + W(0, -1161289046, -1111556088, 1038429491, 1024158411) + W(1, -1123794133, 1016121349, 1020587590, -1127668568) + + W(2, -1130067243, 1018324827, 1035096674, -1127328688) + + W(3, 1029682388, -1095922552, 1050898724, -1123472030) + + W(4, -1142905112, -1126947701, 1031608572, -1092239431) + + W(5, 1058359401, -1093717514, 1042534485, -1126252937) + + W(6, -1117304231, -1165373610, 1040200303, -1118204561) + + W(7, -1137719883, -1122434117, -1129471662, -1120133906) + + W(8, 1044552317, -1112781150, -1136196985, -1137031592) + W(9, 965398246, 1007233453, -1132308256, 1017795291) + + W(10, 1027736448, -1121369248, -1134569151, 1019046119) + + W(11, 1031851372, -1120826542, -1128305748, -1162116006); + WS(1063598519, 1040709546); + sum1 = + W(0, 989424433, -1129964132, -1092181324, 1056340507) + W(1, -1140166214, 1007420926, 1025004011, 1018517694) + + W(2, -1096845618, 1052096915, -1124688156, 1025298052) + + W(3, -1117397173, 1036280904, -1092686069, 1055848084) + W(4, 1027380346, -1114706068, 1010227902, 1042042835) + + W(5, -1082263275, -1117189370, 1041673920, 1030527159) + + W(6, -1116859551, 1025484624, -1087946945, 1053023013) + W(7, 1025279965, 1004378644, 1035862832, -1108371497) + + W(8, -1124000752, 1053676604, 1021321051, -1130325786) + W(9, 1012428267, 1028794752, 977020321, 1044581128) + + W(10, -1125256895, 1025029349, 1028295307, -1105766207) + + W(11, -1108973663, 1048031389, 1035434166, 1015026205); + sum2 = + W(0, -1128989779, 1040099849, -1100874000, 1021993174) + W(1, -1130783901, 1011642260, -1132752301, 992269838) + + W(2, 1034251701, -1130867684, 1034483450, -1123860313) + + W(3, -1121498089, 1034828720, -1104384455, -1113539068) + + W(4, -1122004711, 1016725938, -1112228563, 1034859451) + W(5, 1044543345, 1053848304, 1016645052, -1122625223) + + W(6, 1023519830, 1034954038, 1046406891, -1104908283) + W(7, 1032774629, 1011006880, -1111737432, -1122349299) + + W(8, 1028583216, -1100179639, 1016210650, -1114528083) + + W(9, 1023675120, 1019899084, -1114022376, -1111378604) + + W(10, 1033297067, 1021084026, -1134051546, -1112348174) + + W(11, 1040182737, -1097476412, 1025418184, -1141294629); + WS(1052377710, -1116561061); + sum1 = W(0, -1122160137, 1026711393, 1034438088, 1023922180) + + W(1, -1115207840, 1014756539, -1112995181, 1046449684) + + W(2, -1103073456, -1112523427, 1036366239, -1110629817) + + W(3, 1021266631, -1094207935, 1059878180, 1031595583) + W(4, -1096200621, 1025340632, 1017022397, 1051777944) + + W(5, -1091454284, -1107259466, 1043506315, -1122333286) + + W(6, 1032809511, -1105978112, -1108523806, 1059633699) + + W(7, -1105628259, -1126028515, -1105019076, 1045042328) + + W(8, -1137740923, -1094439010, 1043730779, -1114494718) + + W(9, 1019774100, -1140860791, -1113848547, 1048809290) + + W(10, -1114298535, 1024493780, -1119221338, -1140595366) + + W(11, 1015748571, 1019553093, -1117446555, -1121208702); + sum2 = W(0, -1125003387, 1023545558, 1001356924, 1019826271) + + W(1, 1029018751, -1114113554, -1110204990, -1122326332) + + W(2, 1049948311, -1106041547, -1122275300, 1028296019) + + W(3, 1008672566, 1039271760, -1104177316, 1040609653) + W(4, 1017003703, -1143932072, -1110854180, 997586352) + + W(5, -1099440370, 1057375034, -1099421810, -1122149120) + + W(6, 1015432805, 1043658401, -1101604747, -1098469549) + + W(7, 1052007058, -1118594118, 1007507570, -1126010948) + + W(8, -1112581048, 1041033112, 1018898909, -1129527698) + + W(9, -1129875419, -1128126180, 1034699764, -1108980340) + + W(10, -1118843549, 1031512617, -1145172348, 1018354299) + + W(11, -1118892801, 1026776081, -1123423040, -1147650596); + WS(1066846108, 1044745002); + sum1 = + W(0, 1019372186, 1049403789, 1042475733, -1091781177) + W(1, -1124410122, 1015897062, 978233216, -1107121557) + + W(2, 1051348497, -1100692098, 1039801345, 1009376476) + W(3, -1129136976, 1041504923, 1048713517, -1091573825) + + W(4, 1032893815, -1126291000, 1025331363, -1134682116) + W(5, 1054698948, -1089263023, 1040511932, 1006187856) + + W(6, -1142297744, 1039399714, 1049146911, -1091452887) + + W(7, -1146055296, 1016897132, 1015116199, -1122699462) + W(8, 1058118606, -1090043533, 1032222216, 1012743170) + + W(9, 1015645340, -1121336819, 1046729314, -1102394372) + + W(10, -1115550793, 1010428515, 1016287548, 1026221102) + + W(11, 1056609718, -1091564925, -1107840672, 1000566800); + sum2 = + W(0, -1121498998, 1040076187, 1040991236, -1097642453) + W(1, 1041191639, -1143069461, 1025173682, -1110698495) + + W(2, 1027215822, 1032193313, -1107046015, -1127878497) + + W(3, -1127952317, 1046879062, -1097422534, -1089335507) + + W(4, 1027648922, 1033858873, -1123064681, -1114452496) + + W(5, -1079622690, -1070315938, -1107556506, 1031644922) + + W(6, 1031325102, 1037259271, -1113150532, -1080614075) + + W(7, 1040688678, -1125227083, 1031547392, -1113826794) + W(8, 1059352243, 1063284099, 1044912350, -1135729999) + + W(9, -1116804726, -1113826560, 1032134129, 1075195474) + + W(10, -1107091577, -1112123781, 1013263415, -1114840697) + + W(11, 1048220488, 1071802337, 1050907604, -1104322253); + WS(-1083170743, 1032719415); + sum1 = + W(0, 1023701883, -1115388842, -1095142736, -1131637740) + W(1, 1043889005, 1012236805, 1027723212, 1037576352) + + W(2, -1104329709, 1047136718, -1114738168, -1143133226) + + W(3, -1122560214, 1028066352, -1093573195, 1050356544) + W(4, 1032119470, -1126174356, 989186599, 1034436696) + + W(5, -1091782714, 1058921626, 1035779088, 1024911192) + W(6, 1018265472, 1046871436, -1090370147, 1057401704) + + W(7, -1119260798, 1033076018, -1118377474, 1036384970) + + W(8, -1088395265, 1046747968, 1026791695, -1122725807) + W(9, 1034616094, 1041769608, -1092608855, 1048250192) + + W(10, 1007978244, 1033024419, -1143849572, 1033711598) + + W(11, -1085234190, 1051022467, 1035213927, 1028803056); + sum2 = + W(0, 1040592912, -1091007599, -1122569720, 1061904811) + W(1, -1096410255, -1107753434, -1148866748, 1043419584) + + W(2, -1102576481, -1110256028, -1106770914, 1043044202) + + W(3, 1032765896, -1111893630, -1114969246, 1042199718) + + W(4, -1108992598, -1138614142, -1113675298, -1100951705) + + W(5, 1060370086, 1060838438, -1088153932, -1121677972) + W(6, 1035431068, 1030657616, 1018512847, 1061366749) + + W(7, -1091610254, 1049599377, -1111525482, -1123081200) + + W(8, -1112438148, -1086083341, 1039676388, -1117594428) + W(9, 1031171080, 1009914590, 1033713452, 1029235040) + + W(10, -1104419583, -1154941432, -1111672592, 1048594219) + + W(11, -1120657004, -1090315205, 1040642594, 1041324320); + WS(-1087374135, 1068569819); + sum1 = W(0, 1034522569, 1036038485, 1051494643, -1092286050) + + W(1, 1024631242, -1124293233, -1114460210, -1134485343) + + W(2, 1048850073, -1097395434, -1155697773, 1035227470) + W(3, 1040675195, 998999958, 1055860825, -1093950865) + + W(4, 1034953465, 1022306499, -1156322949, -1102898978) + + W(5, 1058980799, -1086427635, 1036357020, -1115248568) + + W(6, -1126356143, 1032174021, 1050366134, -1097745188) + + W(7, -1115522123, 1025097211, 1038944141, 1032843110) + W(8, 1048730421, -1098221875, 1020968428, 1020281868) + + W(9, -1123272884, -1112707068, 1043911796, -1095510475) + + W(10, 1032316940, -1112095119, -1147588893, 1041667373) + + W(11, 1049367775, -1093210118, -1134843155, 1003691067); + sum2 = + W(0, 1036982689, -1101176821, 1032029724, 1031712503) + W(1, -1095262307, -1135236510, -1109420523, 1040154700) + + W(2, 1008871494, 1051308638, -1089037290, 1036178124) + W(3, 1038171016, -1103427381, 1053639476, -1103617514) + + W(4, -1077227331, 1056219784, -1114883799, 1011961296) + + W(5, -1094943648, -1090481186, -1077304111, 1063074442) + + W(6, 1032698755, -1115041464, 1046242469, 1048516585) + W(7, -1075605762, 1070767205, 1023400751, -1112162319) + + W(8, 1015257266, -1110670159, -1086532256, 1074120487) + + W(9, -1119043865, -1114657793, 1018562568, 1026474691) + + W(10, -1115849955, 1066414901, 1034471555, -1117007917) + + W(11, 1031877719, 1044794303, -1110424851, 1052188053); + WS(-1094340206, 1025238393); + sum1 = + W(0, 1025401267, 1041212259, 1051626551, -1087771683) + W(1, 1026720107, 1024873417, -1120317764, -1123694073) + + W(2, 1044638395, -1099303356, 1027277160, 1003045609) + W(3, 1029217422, 1040075594, 1051991350, -1089805402) + + W(4, 1042793877, 1025974530, 1017691154, -1128349902) + W(5, 1049159169, -1090474853, 1032035372, -1140916353) + + W(6, 1015273200, 1030937834, 1055056667, -1089928234) + W(7, 1038797403, 1026491292, 1006374863, 1030337996) + + W(8, 1045537234, -1095611655, 1028636183, -1125445197) + + W(9, -1149759301, -1112880429, 1047952828, -1103717662) + + W(10, 1034683820, 1018728702, 1023921508, 1048792866) + + W(11, -1109761292, -1097665994, 1024357062, 1024842472); + sum2 = + W(0, 1016272983, -1117564089, 1054344808, 1082928383) + W(1, 1043627742, -1113989008, -1125328223, 1007328518) + + W(2, 1047318060, 1074423709, 1037006400, -1137080694) + W(3, 1019432157, 1038058236, -1095657702, -1074337637) + + W(4, 1040243063, 1017883877, -1136495190, -1106032359) + + W(5, -1084625245, -1066615612, -1106132294, -1126758430) + + W(6, 1024638490, 1036423350, -1124414562, -1087090886) + + W(7, -1119023275, 1040797418, -1122054341, -1129861056) + + W(8, 1036648948, 1034359725, 1004167460, -1113361096) + W(9, 1016158573, -1141592892, -1120282232, 999766988) + + W(10, 1002865564, 1023713345, -1137665190, 1032273458) + + W(11, 1033205457, -1114245215, -1113153751, 1022755221); + WS(-1098231918, 1035887052); + sum1 = W(0, 1007686525, -1117693688, 1048268202, -1105099271) + + W(1, -1110112236, 1016554315, -1112046456, -1119004197) + + W(2, 1036810732, -1097653932, -1130249512, -1115219957) + + W(3, -1136641001, -1104788790, 1055375147, -1098720398) + + W(4, -1106155488, -1142876018, 1025581173, -1092353842) + + W(5, 1069647932, 1066085926, -1091717545, -1143806946) + + W(6, -1121240420, -1104580134, 1052170270, -1093227035) + + W(7, -1110987409, -1113561092, -1165513922, -1146015939) + + W(8, 1020096363, -1123833253, -1108464746, -1123809427) + + W(9, -1114143760, -1162096818, -1125578169, -1107379122) + + W(10, -1156567122, -1113074326, -1123656209, -1117522176) + + W(11, 1031911554, -1130540403, -1106840908, -1120698772); + sum2 = W(0, -1125891647, -1121500935, 1021750179, 1017645919) + + W(1, -1130193055, -1118741587, -1139529830, 1033326245) + + W(2, -1133323886, -1167588957, 1018366499, 1021086319) + + W(3, -1127048511, -1110257678, 1040835222, -1108825416) + + W(4, -1144215516, -1113356630, -1119620679, 1033808587) + + W(5, 1061147710, 1055027509, 1035778772, -1123951235) + + W(6, 1015042367, -1152963927, -1110018076, -1105425292) + + W(7, -1105010302, -1124596863, -1133002574, 1023704513) + + W(8, 1035246842, -1090179180, 1019226535, 995355927) + W(9, 1001053676, -1125968895, -1123027527, 1035235033) + + W(10, -1113493000, -1135606974, -1136336990, -1159911790) + + W(11, -1144777900, -1104047270, -1137733870, -1141401292); + WS(-1081201436, -1083122818); + sum1 = + W(0, 1024396773, -1118776317, -1090317103, 1056470156) + W(1, -1120183581, -1124728406, 1040103323, -1121204906) + + W(2, -1098486564, 1048677796, -1105729174, 1010393788) + + W(3, -1104054160, 1048678635, -1094484293, 1048629197) + + W(4, 1032093347, -1105359341, 1042893967, -1101546374) + W(5, -1101075087, 1052113969, 1048228642, 1048587688) + + W(6, -1121710378, 1036673102, -1095873942, 1033707976) + + W(7, 1044099610, -1107414311, -1122190892, -1112386175) + + W(8, -1099326495, 1057451847, -1102747354, 1034642220) + W(9, 1038539251, 1022162966, -1101153544, 1027207978) + + W(10, -1114063013, -1109685144, 1020559724, -1111471555) + + W(11, -1095630377, 1053998976, -1125760751, 1033222029); + sum2 = W(0, -1130151079, 1029357099, -1141051917, -1126143047) + + W(1, -1138853383, 1016378649, -1128601535, -1139320303) + + W(2, 1027307392, -1124015138, 1026568428, -1128887123) + + W(3, 1016586775, 1016703563, 1040480663, -1090482710) + W(4, 1051692940, 1024508650, -1116462462, 1036545095) + + W(5, -1084177500, -1061542668, 1087807110, -1109325640) + + W(6, 1006316053, 1027702761, 1027514935, -1081711054) + + W(7, 1065457143, -1115450794, -1136401487, -1115282656) + + W(8, 1033882273, 1042416533, -1101742731, 1030137534) + W(9, -1134837023, 1025282364, 975470826, -1107083018) + + W(10, 1035528582, 1016609727, 1015531121, -1128863347) + + W(11, 1013565163, 1030037156, -1123914522, -1122133136); + WS(1056806766, 1019813151); + sum1 = + W(0, -1109922347, 1038862168, -1094336356, 1045176100) + W(1, 1023835087, -1117706029, 1027672232, -1098777292) + + W(2, 1025923920, 1046907893, -1097985673, -1143840774) + + W(3, -1113027385, 1057340869, -1089223672, 1028090813) + + W(4, 1044113854, -1111671123, -1106442907, -1131946518) + W(5, 1049099726, 1060367739, 1010151151, 1025756788) + + W(6, -1119504732, 1048903346, -1102142547, -1102839017) + + W(7, 1051267347, -1111600768, -1127683323, -1100586740) + + W(8, -1122538541, 1052174932, -1093148714, 1040843731) + W(9, 1015134384, 1027127869, -1099585557, 1024110556) + + W(10, 1029024221, -1107564881, -1122196904, -1136830686) + + W(11, -1100472159, 1047790604, -1137237669, -1131252120); + sum2 = + W(0, 1016054025, -1119367753, -1115811972, 1024987046) + W(1, 1016843613, 1007599121, -1116580030, 1033363716) + + W(2, -1119979151, -1114756690, 1025664850, -1120202841) + + W(3, -1128856269, -1107794961, 1046175546, -1100926142) + + W(4, 1028330842, -1144919563, 1024017790, -1129548157) + W(5, 1051115205, 1048732221, 1029232538, -1123931557) + + W(6, -1120027976, 1034251322, -1095340379, 1044324276) + + W(7, -1105635461, -1122027017, 1003808451, 1039517400) + + W(8, -1127431641, -1104827086, 1042504965, -1118580981) + + W(9, -1120561807, 1019337653, 976018325, -1139095561) + + W(10, -1118828309, 1016896817, 1020365697, -1174223189) + + W(11, -1148320619, -1138276477, -1117203320, 1009819353); + WS(1067549148, 1061168738); + sum1 = + W(0, -1136860560, 1041916271, 1043173595, -1099729080) + W(1, 1028345500, -1117900922, 1019396970, -1102760394) + + W(2, 1046914407, -1097589844, 1036811500, -1118556558) + + W(3, 1034693791, -1100215160, 1063664325, -1085101004) + + W(4, 1044130369, -1118557363, 1031876061, -1127917744) + + W(5, 1041579695, 1044764001, -1111608196, -1148658183) + + W(6, -1126960466, 1038708237, -1084953669, 1062969721) + W(7, -1096862061, 1028601293, 1026075051, 1042570959) + + W(8, -1099553438, 1046958554, -1104831702, 1014732126) + + W(9, -1129065354, 1024557450, -1111656016, 1031927572) + + W(10, -1121741642, 999719805, -1125694250, -1114527138) + + W(11, 1036161892, -1129394940, 1028864534, -1111432076); + sum2 = + W(0, 1037988572, -1097183834, -1096111302, -1112255513) + + W(1, 1025606252, -1131066844, -1109648154, -1096035348) + + W(2, 1046143856, 1047451704, -1109281762, 1021094187) + W(3, -1115314649, -1106718097, 1065688064, 1048785443) + + W(4, 1025033440, -1118872350, -1110735622, 1044362532) + + W(5, -1100541529, -1089624797, -1124926742, 1035314838) + W(6, 1029414023, 1044653749, 1022961930, 1040629892) + + W(7, 1024229044, -1132267648, -1115532881, -1118097482) + + W(8, 1041170408, -1135819985, -1109992198, 1004115214) + + W(9, -1114457629, 1036871139, -1121640520, -1109975688) + + W(10, 1007526703, -1128646118, -1123631499, 1035597348) + + W(11, -1109551474, 1030316886, 1031542857, -1117895342); + WS(-1090126519, 1034760182); + sum1 = + W(0, 1022234099, 1038732905, -1095221408, 1049091087) + W(1, -1141106060, -1130848127, 987019599, 1040082783) + + W(2, -1096833350, 1049531159, -1100657291, 1036771650) + W(3, 1021371561, 1042926010, -1090005917, 1052645704) + + W(4, -1098472859, 1035488804, -1125185183, 1019049563) + W(5, 1049172122, 1048882035, -1113910991, 1025403478) + + W(6, 1040030303, -1101231100, 1056956325, -1086324445) + W(7, 1041783487, 1007113098, 1005824514, -1108355337) + + W(8, 1052986466, -1089320760, 1033537135, -1138596020) + + W(9, 1028122555, -1115211984, 1046568014, -1101798768) + + W(10, 1037621024, -1128732298, -1120592523, 1035983309) + + W(11, 1025899358, -1123937043, -1125397784, -1127374557); + sum2 = W(0, 1016736022, 1032939170, -1122689775, -1102551566) + + W(1, -1122487238, 1026411789, 1011977196, -1102682487) + + W(2, 1060510561, 1060805847, -1122236502, -1128029215) + + W(3, -1137999416, 1037611888, 1051792579, 1057985083) + W(4, 1036808922, 1019619350, 1019963070, -1102949496) + + W(5, -1073351999, -1073393989, -1103029047, -1125796177) + + W(6, 1030437859, 1039010410, 1059164734, 1057367527) + W(7, 1039165500, 1024266957, -1122046802, -1110345340) + + W(8, 1062467108, 1062012989, -1106860549, -1119780381) + + W(9, -1142727409, -1124097437, 1031495287, -1147452225) + + W(10, -1143421321, 1024156551, 1018753414, -1113761662) + + W(11, -1101619274, -1099879364, 1015482390, 1016465010); + WS(-1089242039, -1127205581); + sum1 = + W(0, -1124452989, 1047404342, -1086849964, -1114062493) + W(1, 1042532510, 1010360274, 1037734344, -1111320098) + + W(2, 1001557948, 998659036, 1038364441, 1032729828) + W(3, -1136469606, -1115981071, 1055753134, -1096047365) + + W(4, -1118490271, 1015888923, 1045032037, 1038279993) + W(5, 1059294849, -1107330927, 1044317529, -1118190491) + + W(6, -1131176455, 1006926037, 1006841992, -1105936042) + W(7, 1035319841, 1021147727, 1029283077, 1030509432) + + W(8, 1049404683, -1087265492, 1043122385, -1123196402) + + W(9, 1038076384, -1123275877, 1037635838, -1095492784) + W(10, 1027367204, 1027584778, 1029887056, 1043334248) + + W(11, 1044156233, -1080260267, 1053177470, -1118995315); + sum2 = + W(0, 1029897599, -1102843967, 1001547796, 1049416264) + W(1, -1120840401, -1115391670, -1114965417, 1046605828) + + W(2, 1025076963, -1100594038, 1041915682, 1020641677) + W(3, 1025776431, 1033633995, -1090433692, -1096668289) + + W(4, 1040646462, -1111492899, -1121485495, 1048791648) + W(5, 1044097140, -1117020477, 1042521794, 1034331443) + + W(6, -1140617930, -1104898739, 1042488362, -1102246327) + + W(7, -1112857889, -1115861875, -1113546368, 1031053127) + + W(8, -1118485295, 1034926551, -1109164591, -1134127978) + + W(9, 1031651703, -1108448442, 1045463546, 1047237110) + + W(10, 1015998805, -1120855845, -1117524097, -1108356905) + + W(11, 1040816680, 1044694712, -1109851905, -1124879769); + WS(-1081567068, -1085072352); + sum1 = + W(0, 1026202077, 1008391383, 1043376377, -1106037014) + W(1, -1119432853, 1015626934, 1017630556, -1102096537) + + W(2, 1035138955, -1113878797, 1041401156, -1112723700) + + W(3, 1034866076, -1105309517, 1062685095, -1091962582) + W(4, 1028045374, 995954372, -1120073907, -1113888457) + + W(5, -1088326467, -1099527071, 1036249665, -1112822301) + W(6, 990337572, 1038015146, -1087780001, 1065743931) + + W(7, -1122166240, 1036674595, -1122725732, 1010107993) + + W(8, -1095652846, 1048331161, 1030964177, -1165855255) + W(9, 1016189565, 1035371298, -1111927693, 1035819857) + + W(10, 1030882915, 1020668626, -1135328058, -1107104879) + + W(11, -1134788873, 1033560764, 1034792920, -1140134473); + sum2 = + W(0, -1101998430, 1025808817, 1026331301, 1041383807) + W(1, 1033833028, -1108635033, 1034880732, -1110518368) + + W(2, 1035202798, 1044537615, -1096440885, 1042833515) + + W(3, -1111573656, -1090739547, -1095903349, 1045506861) + + W(4, 1030373631, -1107072548, 1034691412, -1098171169) + W(5, 1068344140, 1069658374, -1094064924, 1037649108) + + W(6, 1017688506, 1047617175, -1085314459, -1090700374) + + W(7, -1106284721, -1117475933, 1032207084, -1112107064) + + W(8, -1108916250, -1135142667, -1113568166, 996218700) + + W(9, 1002612774, 1027687639, -1113844364, -1106371211) + W(10, 1043762008, -1115713024, 995363580, 1035291452) + + W(11, -1111293323, -1105384559, -1113615358, 1031725587); + WS(-1122270064, -1083487436); + sum1 = + W(0, 1022021054, -1111938972, -1089129474, 1061173530) + W(1, -1117042135, 990992466, 1000846209, 1031069285) + + W(2, -1092279467, 1053406092, -1112839626, 997371026) + W(3, -1120651002, 1035108132, -1089405705, 1061891890) + + W(4, -1115403968, -1123767278, -1133172181, -1122478547) + + W(5, -1088959911, 1046812368, 1035227362, -1136588785) + W(6, 1015175368, 1022898156, -1101358829, 1052509753) + + W(7, 983155781, 1014548513, 1008528664, -1109542844) + W(8, -1113192731, 1035774995, 1035355065, -1120262163) + + W(9, 1014262402, 1003755051, -1110785838, 1040815801) + + W(10, -1114859906, -1139309996, 1032206792, -1099224128) + + W(11, -1105614817, 1041852206, 1046440556, -1196238920); + sum2 = W(0, 1044179919, -1111986018, -1080384748, -1092393621) + W(1, 1048581079, 1031858735, 1022028328, 998943655) + + W(2, -1088604014, 1029389095, 1009323699, 1021777892) + + W(3, 1040258943, -1095034556, -1104000317, -1090514887) + + W(4, 1015383036, 1024626196, -1118974089, -1095846499) + + W(5, 1073459027, 1071708766, -1097133430, 1024702395) + + W(6, 1033279863, -1110448374, -1098039236, 1012336831) + + W(7, -1122793353, 1031448400, -1117110809, -1099083231) + + W(8, 1045892370, 1049307354, -1097759856, 1030521846) + + W(9, 1031745329, -1120681553, -1111672860, -1100485937) + + W(10, 1041920736, 1016567237, -1103290765, -1101323001) + + W(11, 1055006842, 1051814517, -1091667564, 1029007432); + WS(-1097130350, -1073679750); + sum1 = + W(0, -1154560184, -1142702368, -1095841490, 1034517635) + W(1, 1044574577, 992206103, 1025389788, 1008724804) + + W(2, -1096179481, 1053502809, -1112918112, -1143244972) + + W(3, -1145657140, 1035954194, -1095185831, 1045830013) + W(4, 1042446427, -1122388570, 1000633100, 1046084016) + + W(5, -1085973126, 1057148843, 1025817904, -1139683234) + + W(6, -1120139600, 1042008657, -1089907161, 1051926551) + W(7, 1017272605, 1018417129, 1032643785, -1106616153) + + W(8, -1096805620, 1052799826, -1123577295, 1017209342) + W(9, 1008755251, 1025929714, -1098086361, 1043469780) + + W(10, -1143679882, 1016358830, 1030414749, -1102859291) + + W(11, -1107347576, 1050172789, 1014891512, 1026775680); + sum2 = W(0, 1021941992, -1106123822, 1031547466, -1135582819) + + W(1, 1018035752, 1017098260, -1140009235, -1137197699) + + W(2, 1040410800, 1048777558, -1114989513, -1129449426) + + W(3, 1026649920, -1104678389, -1091687878, -1102399061) + + W(4, 1038853959, -1170697076, 1025391436, -1103278668) + + W(5, -1069452203, -1086654414, -1112110740, -1134437671) + + W(6, 1033557641, 1049392706, 1071493698, 1036526271) + W(7, -1155541821, 1030635558, -1110654493, 1026389826) + + W(8, 1075377385, 1051671224, -1119910153, -1127657747) + + W(9, -1117894486, 1046385471, -1093315115, 1003979070) + + W(10, -1130248744, 1010389927, 1031221238, -1107040085) + + W(11, -1101021764, 1042747507, -1119798403, 1007123883); + WS(-1110542776, 1046722292); + sum1 = + W(0, -1112464600, 1033517476, 1047470894, -1131671638) + W(1, 1005087552, -1142745264, 1016022658, -1108629467) + + W(2, -1133454244, 1032980471, -1105826521, 1026603482) + + W(3, 1027765771, -1106997347, 1053995028, -1092318054) + W(4, 1042584756, -1129658366, 981819586, -1113497042) + + W(5, -1100439522, 1042288212, -1109105451, 1017901338) + + W(6, 1026835189, -1116788199, -1093531706, 1061947018) + + W(7, -1098489206, -1142191304, 1025143735, -1106078850) + + W(8, 1048713001, -1121614518, -1105038597, 1040275689) + + W(9, -1111607705, 1041100086, -1106135867, 1012478420) + W(10, 977775992, 1016467704, 1024330241, -1124631714) + + W(11, -1115421707, 1041393523, -1114990145, 1020475210); + sum2 = W(0, 1031452303, -1132232893, -1109510079, 1018866101) + W(1, 1014551643, 1032688527, 992881643, -1116591675) + + W(2, 1032912109, -1116915567, 1024567259, -1114177042) + W(3, 978475180, 1016124301, -1114514404, 1055420465) + + W(4, -1097097100, 1042584708, -1121457613, -1114931492) + + W(5, 1032060799, 1059251768, -1118272021, -1109972047) + + W(6, 1034445399, -1094590847, 1051504728, -1088887374) + + W(7, 1048490818, 1024892699, -1130052481, 1040974964) + + W(8, -1087149232, 1044275534, 1035881493, -1108606213) + + W(9, 1032145701, -1110729382, 1039284419, -1114948355) + + W(10, 1032922179, -1121421993, -1116902843, 1035934107) + + W(11, 1032317221, -1104983612, 1032032409, -1133789139); + WS(1059165367, -1104520251); + sum1 = + W(0, 1007492796, -1108628644, -1117534006, 1041312427) + W(1, -1113108212, -1124001749, -1117692608, 1046236477) + + W(2, -1094176525, -1118419948, 1029454180, -1113899741) + + W(3, 1009135144, -1120534447, 1053590938, -1107420459) + + W(4, -1110779368, -1131761404, -1115310467, 1052736188) + + W(5, 1041258594, -1097199722, 1053879643, -1114949702) + W(6, 1014125520, -1118278150, 1001540436, 1055263011) + + W(7, -1098892966, 1025063448, -1113191163, 1036684740) + + W(8, -1106455985, -1100739533, 1045621277, -1105125705) + + W(9, -1129119585, 1015268651, -1112388022, 1040471133) + + W(10, -1126748266, -1126282358, -1118876992, 1008090175) + + W(11, -1114551242, 1020553106, 1026632706, -1127494856); + sum2 = + W(0, 1027505664, -1104527074, 1034957797, 1041601252) + W(1, -1108054404, -1122847824, -1115834059, 1048986559) + + W(2, -1098163961, -1125657446, 1041896195, 1034858548) + W(3, 1029084872, -1089420265, 1051828462, 1045110551) + + W(4, -1099714824, -1116127595, 1029257304, -1098414029) + + W(5, 1053778056, 1041501740, -1129563106, -1170669534) + + W(6, -1128264406, -1104406791, 1048509414, 1041829791) + + W(7, -1092212913, 1037831890, -1138405484, 1040673804) + + W(8, -1106881855, -1119286592, 1049994472, -1107117839) + + W(9, -1118563560, -1203758566, -1113115951, 1045914276) + + W(10, -1105182054, 1031508216, -1127212263, -1117936348) + + W(11, -1136870020, 1022365337, -1139619400, -1127498142); + WS(1064754871, 1064755352); + sum1 = + W(0, -1124996947, 1039345889, -1096693846, 1051509189) + W(1, -1110987505, 1036233792, -1126765813, 1034558935) + + W(2, -1096907004, 1048609181, -1122110878, 981607022) + W(3, -1111973122, 1025078634, -1092723587, 1055455058) + + W(4, -1103910610, 1033037628, 995438583, 1031530717) + W(5, 1042155040, 1038916133, 1036071207, 1028131846) + + W(6, -1131935965, -1102805216, 1055052309, -1085470304) + + W(7, 1036962198, -1113728073, 1011044801, -1112086641) + + W(8, 1050402072, -1096310694, 1042970795, -1155599823) + + W(9, 1017902933, -1108706152, 1045488762, -1110967031) + + W(10, 999916154, -1121653045, -1117569083, -1125705364) + + W(11, 1036105095, -1114430562, 1043170799, -1131031997); + sum2 = + W(0, -1133117125, 1035315397, 1034291601, -1093657955) + W(1, -1083656994, 1063017252, 1023646322, -1104375670) + + W(2, 1023753609, 1053589289, -1096844972, -1117431336) + + W(3, 1023723550, 1045506061, -1107539440, -1104725243) + + W(4, -1079943056, 1065218548, 1016880452, -1100884270) + + W(5, 1046403885, 1040733712, -1108767061, -1110535684) + W(6, -1128763803, 1037072250, -1123261308, 987308827) + + W(7, 1066015084, -1088643610, 1032406499, -1100571834) + W(8, 1040670310, 1047435788, 1056439411, -1092199491) + + W(9, -1112596197, 1043010850, -1109210140, -1103530057) + + W(10, 1038430454, -1140617522, 1024272758, -1106522969) + + W(11, 1037357283, 1046389911, 1050581867, -1093142505); + WS(-1141889920, -1150694570); + sum1 = + W(0, -1121776659, -1156363954, -1110656781, -1150990554) + W(1, 1001967189, 1009891810, 1035438770, 1043244278) + + W(2, -1108191526, 1049522698, 1024784007, 1026909213) + W(3, -1107472311, 1039611642, -1092681840, 1047918398) + + W(4, -1120026675, -1115519345, 1029335145, 1044045394) + W(5, -1089342271, 1044281805, 1041259438, 1032535224) + + W(6, 1032163820, 1031781705, -1107172434, -1142656241) + + W(7, 1035091531, -1156224954, -1122959321, -1113754566) + + W(8, -1110931796, -1118178969, -1114065315, -1114416227) + + W(9, 1035788170, 1041298854, -1106653204, 1044014582) + W(10, 1037418924, 1034927023, 1006930832, -1113010266) + + W(11, -1098776751, 1035377494, 968315538, -1127266575); + sum2 = + W(0, -1096670021, 1059540854, 1045575353, -1133958494) + W(1, 1031038260, -1118270456, -1102787949, 1039622534) + + W(2, 1037899964, 1013042349, -1110193614, 988987510) + W(3, -1099441746, 1064198145, 1030855272, 1040028330) + + W(4, -1117097690, 1032105974, 1043637876, -1086802625) + + W(5, -1101655681, 1036771998, -1125265460, -1117707023) + + W(6, 1052388948, -1085971065, 1033969343, 1032851236) + + W(7, -1103569731, -1134648980, 1042101483, -1113298762) + + W(8, -1105771070, -1120619083, 1049976190, 1021389004) + W(9, -1135324433, -1098667485, 1036465297, 981463467) + + W(10, -1101523135, -1119296945, 1042670443, -1104634628) + + W(11, -1104173140, 1030229840, 1035574893, 1035007302); + WS(1060329015, -1107100438); + sum1 = + W(0, -1139109867, 1016013223, 1052529520, -1098269535) + W(1, -1120993331, 1025836257, -1126768152, -1108878752) + + W(2, 1042283693, -1103310414, 1033078264, -1113589378) + + W(3, -1154508124, -1139382101, 1051369597, -1093610355) + W(4, 1033661966, 1029380042, 1024792785, 1046477388) + + W(5, 1051787130, -1088582834, 1015463488, -1124637616) + + W(6, -1145234942, 1046417836, 1040695538, -1090008057) + + W(7, 1035018943, -1127749832, -1121126338, 1044791733) + W(8, 1046651812, -1097854544, 1029328303, 1030094510) + + W(9, -1165337473, -1115375281, 1039020124, -1110993568) + + W(10, 980238373, -1117533511, -1128378904, 1030070044) + + W(11, 1046922680, -1105218789, -1121430349, 1016154976); + sum2 = + W(0, -1122821091, 1039646422, -1126218548, 1020520346) + W(1, 1030755819, 1003947528, 1016851522, -1156337616) + + W(2, -1123806894, -1105518185, 1031650855, 980292032) + W(3, -1106087013, -1131895450, 1035943528, 999070248) + + W(4, 1015158698, -1123933765, -1109184296, -1080883791) + + W(5, 1071805249, -1096231655, 1043321474, -1122746065) + + W(6, 1045004090, -1074990048, 1071092779, -1125969764) + + W(7, -1125796080, 1018391998, 1015529466, -1105476432) + + W(8, -1126394390, 1028426171, 1026097175, -1126690400) + W(9, 1026918939, -1104782698, 1031828962, 1030594487) + + W(10, -1140334484, 1018627618, -1115690469, 1022339242) + + W(11, -1122803425, -1127395662, -1110808154, -1149029768); + WS(1004067712, 1029538397); + sum1 = W(0, 1039684517, 1025050595, 1055781642, -1093421305) + + W(1, -1134522377, 1033902960, -1113057966, -1112884456) + + W(2, 1052279792, -1096595713, 1008080123, -1134909265) + + W(3, 1034662227, -1120136235, 1057037092, -1096171643) + W(4, 1038845557, 1000314570, 976341006, -1106127376) + + W(5, 1048957300, -1083333863, -1104830972, 1017566030) + + W(6, -1116361615, -1108532672, 1059667231, -1093970477) + + W(7, -1107387175, -1120056627, 1039793800, -1136083213) + + W(8, 1049781884, 1050503466, -1105145436, 1034175935) + + W(9, -1114202454, -1109109944, 1046150498, -1098876866) + + W(10, -1111371224, -1129568684, 1023346679, 1026195563) + + W(11, 1052752022, -1119746148, -1106375815, 1002478074); + sum2 = W(0, 996458418, 1023361218, 1020176326, -1105686968) + W(1, -1112170015, 1016740014, 1033154491, -1129026548) + + W(2, 1036155261, -1136279909, 1029838361, -1122796554) + + W(3, -1124552606, -1113149678, -1107309754, -1101182829) + + W(4, -1110765232, 1027141165, 983965669, -1096377075) + W(5, 1064108379, 1059185253, 1029555247, -1111484496) + + W(6, -1113544599, -1108470744, -1113642974, -1094171461) + + W(7, 1048386684, 1033692775, -1118592979, -1107366613) + + W(8, -1147140265, -1097506500, 995412594, -1108579478) + + W(9, 1024911403, 1040480632, -1123866147, 1038318571) + + W(10, 1045927904, -1126067866, -1120675710, 978762058) + + W(11, -1127049668, 1027330889, -1102738273, 1023291782); + WS(1047133404, -1079170418); + sum1 = W(0, 1009155056, -1122581460, 1042667713, 1030334583) + + W(1, -1108143194, 1027163842, -1116032717, -1127398915) + + W(2, 1041078541, -1113404572, -1123819760, -1122554086) + + W(3, -1135035740, -1111731450, 1051022508, -1111377849) + + W(4, -1112180142, 1023811915, -1132905800, -1098422622) + + W(5, 1065228285, -1104817319, -1102890728, -1133181796) + + W(6, 1006908676, -1136427723, 1042380775, -1091891141) + + W(7, -1111098047, 1001483047, -1123509635, 1019095722) + + W(8, 1050271906, -1103926112, 1023382911, -1116735535) + + W(9, -1129150906, 1037504657, -1107182030, -1121675713) + + W(10, -1136273159, 1015217807, -1147535977, 1012838771) + + W(11, 1023931745, -1123007382, -1123177070, -1130799202); + sum2 = W(0, -1151544588, 1017708852, -1147640076, 1008923057) + + W(1, 1011942449, 1018406594, -1155029688, -1121981859) + + W(2, -1129630940, 1024218233, 998377109, -1133221663) + + W(3, 1018065470, -1114670464, -1093073209, -1119653793) + + W(4, -1131988255, 1025316590, 1007239987, 1049278985) + + W(5, -1077783117, -1083801634, 1041518161, -1123603132) + + W(6, -1125453823, 1041079714, 1074285479, 1047560438) + + W(7, -1114079754, -1131599727, -1118997712, -1156221672) + + W(8, 1034878186, 1028846010, -1118519138, 1024940191) + W(9, 1007542759, -1120658712, 1016277382, 1036336794) + + W(10, -1121956184, -1131785133, -1133631258, -1113215345) + + W(11, 1033160981, 1022080564, 1027490516, -1130450701); + WS(1043550940, 1028476494); + sum1 = W(0, -1115183742, -1130981802, -1100607937, 1051762223) + + W(1, 1000007075, -1121847282, -1121780237, -1102302048) + + W(2, -1105099981, 1040535662, -1138550724, -1111548899) + + W(3, -1117842775, -1117998761, -1096882923, 1059510884) + + W(4, -1102853271, -1132334487, -1110838377, -1094318158) + + W(5, 1062548805, 1068023761, -1099046056, 1013492582) + W(6, 991794198, -1102037997, -1103616404, 1055882697) + + W(7, -1102330336, 1018468811, -1111061058, -1115328139) + + W(8, -1097580450, 1041348961, -1131654944, -1119471984) + + W(9, 1015980795, -1113105937, -1103768718, 1034161697) + + W(10, -1112888641, -1129682576, -1113960535, -1106426583) + + W(11, -1100373208, 1044552262, -1110284503, -1148988811); + sum2 = W(0, 1029690847, -1103820712, 998970743, 1028297515) + + W(1, -1122562191, -1133991676, -1115037203, 1043435491) + + W(2, -1096312501, 1046052979, -1115911439, 1007821180) + + W(3, -1127742454, -1100462798, 1044923803, -1099477234) + + W(4, 1030898927, -1113716427, 1036903221, 1028701483) + W(5, 1041049643, 1065575031, -1096910875, 1036974934) + + W(6, -1106227374, -1121926871, 1030485727, -1098681477) + + W(7, 1034498637, -1111652935, 1039025001, -1126383902) + + W(8, -1125321886, 1040854499, -1115709255, -1126914630) + + W(9, -1108879063, 1017141302, 1008577020, -1106467082) + + W(10, 1013474716, -1128843302, 1016988574, -1115441627) + + W(11, 1033537170, -1122382559, -1129067614, -1114648723); + WS(-1079050332, -1087647968); + sum1 = W(0, -1138480508, -1112879708, -1095708941, 1054719611) + + W(1, 1031575959, -1122888245, -1122115440, 1026750308) + + W(2, -1102419558, 1048762675, -1106236805, -1139407140) + + W(3, 1024624314, 1027382179, -1136300523, 1057423590) + + W(4, -1115045376, -1136279992, -1106223181, -1116109267) + + W(5, -1083772539, 1057166968, -1096438944, -1112079518) + + W(6, 1029330596, 1024806390, -1103579129, 1058690419) + + W(7, -1115914082, 1025354440, -1120448614, -1128868784) + + W(8, -1102450653, 1049252525, -1116410163, -1128866725) + + W(9, -1134294785, 1022822666, -1100406055, 1046884233) + + W(10, -1127656777, 1008311211, 1004544641, -1115751616) + + W(11, -1099401009, 1051036287, 1031406769, 1030150228); + sum2 = + W(0, 1018441725, -1121226957, 1025980595, -1143973174) + W(1, -1145354702, -1118705847, 1018735508, -1128043345) + + W(2, 1035475244, 1028848366, 1010180031, 1001175670) + W(3, -1106801879, 1036012925, -1093599779, -1119821797) + + W(4, -1106432772, -1114705464, 1042307735, -1105109021) + + W(5, 1063056253, 1055391108, -1103238145, 1024485983) + + W(6, -1108191465, 1026535678, -1097885523, -1118265757) + + W(7, -1114258989, -1109715589, -1153036923, 1024075219) + + W(8, 1035122552, 1031788992, -1114303163, 1025382280) + W(9, 1023515972, -1143871918, 1028845741, -1122707515) + + W(10, 1031455538, -1125366621, -1130614305, -1115606924) + + W(11, -1124060823, -1149779899, -1117711701, -1122890135); + WS(1061221431, 1002405371); + sum1 = + W(0, -1123061017, -1123480946, -1090405194, 1054235011) + W(1, 1026563665, 1000058490, -1109190069, 1033046959) + + W(2, -1104934581, 1044209302, -1108435303, -1121369187) + + W(3, -1111043962, 1050201177, -1102475777, 1057895846) + W(4, 1037490845, 1030151784, -1094345134, 1042710035) + + W(5, -1086823335, 1052530935, -1102625680, -1111380603) + + W(6, -1146354418, 1050099666, -1097235340, 1058601910) + W(7, 1033897294, 1040756961, -1113941840, 1026923762) + + W(8, -1091215734, 1050794548, -1126650490, -1126829850) + + W(9, -1145213652, 1032794752, -1094526523, 1041457976) + + W(10, -1110275296, 1032331475, 1017803349, 1029204218) + + W(11, -1089600016, 1055600534, 1021417496, 1033488871); + sum2 = + W(0, 1049937345, -1089706816, 1050626093, 1030967529) + W(1, -1115709839, 1039088353, 1058657690, -1087536311) + + W(2, -1106625833, -1105431871, 1036734782, -1109192755) + + W(3, 1071079778, -1078069733, 1020012689, 1044296437) + W(4, -1122006247, 1031394755, 1072348129, -1078647761) + + W(5, -1094966474, -1112600090, -1122763227, -1116226089) + + W(6, 1066389113, -1079714039, -1098171132, 1038432439) + + W(7, -1130276743, 1022577738, 1049150259, -1090508646) + W(8, 1050328795, 1044145959, 1024733405, 1012728894) + + W(9, -1119844839, 1022376790, -1105718319, -1126694997) + + W(10, 1021875579, -1123093509, -1113785170, -1103849791) + + W(11, 1052174137, 1034822829, -1112758982, 1013882918); + WS(-1092893294, -1089220584); + sum1 = W(0, 1008699951, -1127519944, 1053766130, -1103359682) + + W(1, -1104704049, 998920846, 1010493299, -1118558929) + W(2, 1051919929, -1096189801, 1032200864, 1028526614) + + W(3, -1124403149, -1106263811, 1056071340, -1097091836) + + W(4, -1111082358, -1149496748, 1025199074, -1113928672) + + W(5, 1052175436, -1086367179, 1015736929, 1019181009) + + W(6, -1117387089, -1098638288, 1062605050, -1096005139) + + W(7, -1120379023, -1115659002, 1015178277, 1041393441) + + W(8, 1047707912, -1102452900, -1123219920, 1027645503) + + W(9, -1125915034, -1112838969, 1053546873, -1101730612) + + W(10, 1019333603, -1131717807, -1130896954, 1035998582) + + W(11, 1049473086, -1095432549, -1136688761, -1136451331); + sum2 = W(0, -1143112647, 1034689803, -1115356591, -1121270233) + + W(1, 1017968792, 1021729984, 992704062, -1109431235) + W(2, 1039097516, 1048248946, -1124530814, 1005857263) + + W(3, -1124855502, 1033324328, -1073085951, -1106299172) + + W(4, 1023517229, -1126326370, 1038449046, -1098090520) + + W(5, -1063972596, -1091325299, -1113483013, 1015994888) + + W(6, -1105916124, 1038361982, 1062319475, -1090314642) + + W(7, -1141826407, 1013997779, 1035072543, 1040866773) + W(8, 1085456662, 1056006422, 1034240002, -1134900259) + + W(9, -1114904409, 1032024575, 1062308854, 1043935118) + + W(10, -1124783482, -1135264403, 1019251456, -1164332444) + + W(11, -1102205120, -1107459099, 1032935811, 1001043447); + WS(-1104754908, -1106735671); + sum1 = + W(0, 1030490103, -1117923535, -1088908700, 1033028505) + W(1, 1045999740, -1120248133, 1032595044, 1002237924) + + W(2, -1094516030, 1029213684, -1144798556, 1015682178) + + W(3, -1128810020, -1122216143, -1092804364, 1050263192) + + W(4, 1022746927, -1129595020, 1032319302, -1120462507) + + W(5, -1102093923, 1063837581, -1106958295, 1030078356) + W(6, 1019231224, 1025980110, -1088198897, 1058220138) + + W(7, -1107413149, 1021953856, 1025969502, -1123369072) + W(8, -1096286026, 1054477272, 995801516, -1153493672) + + W(9, 1016077744, 1034830735, -1102086589, 1045907999) + + W(10, -1115665070, 1019926661, 1024124136, -1104242198) + + W(11, -1103741447, 1049334234, 1030012489, 1022398552); + sum2 = W(0, -1116247065, 1035833889, -1087068607, -1107323417) + + W(1, -1109274147, 1021616338, 1015145430, -1107082251) + + W(2, -1079268655, -1102842161, 1016322550, -1133554677) + + W(3, 986051432, -1114579693, 1022672030, 1049680335) + W(4, -1111459111, 1010843781, -1117862601, 1043695503) + + W(5, 1067901888, 1032100715, 1026073955, 1017398706) + W(6, -1114715779, 1039299404, 1059152338, 1040660749) + + W(7, 992278036, 998891466, 1034116930, -1114493167) + W(8, 1008422125, -1115195239, -1173738319, -1139208557) + + W(9, -1144744186, -1120378069, 1020328850, 1018816198) + + W(10, 1033325633, -1138764845, 1026244953, 1019204162) + + W(11, -1111927269, 1021018582, -1123657301, 1016479082); + WS(-1092340590, -1082645376); + sum1 = + W(0, 1018128252, 1033191659, 1040446513, -1112709788) + W(1, 1031456758, -1113441282, 1018184990, -1106475329) + + W(2, 1036685563, -1105689791, 1040219053, -1127103440) + + W(3, 1028162329, -1101261661, 1061713267, -1086509296) + + W(4, 1042438664, -1123459213, -1117677972, -1102532636) + + W(5, 1042646693, 1038532783, -1111899057, 1018898486) + W(6, -1115495745, 1031605429, -1089327101, 1064314083) + + W(7, -1100451664, 1033438227, -1115409474, 1010011868) + + W(8, -1106573237, 1046976369, -1105951352, 1029058545) + + W(9, 1015642046, -1127814216, -1105713919, 1039016129) + + W(10, 1010066702, 1013299750, -1118723567, -1112449263) + + W(11, -1112423953, 1030956248, 1022848097, -1130132966); + sum2 = W(0, -1107775669, 1040551451, 1027302533, 1033412933) + + W(1, -1135101756, -1131050762, -1121347079, 1042459857) + + W(2, -1122087227, -1113656153, 1017950151, -1130160250) + + W(3, -1118975841, 1031184422, 1016161914, 1035641742) + + W(4, -1109563699, 1017438602, -1121125435, -1152381105) + W(5, 989383522, -1114487413, 1046120628, 987844130) + + W(6, -1123325897, -1105935240, 1045806619, 1041762467) + + W(7, -1114574520, -1117833439, 1012434826, -1115286413) + + W(8, -1125562074, 1029416951, 1035110196, -1173771715) + + W(9, -1129695564, -1124425722, -1111270899, 1028252326) + + W(10, 998528980, -1121778743, 1006663086, -1111096901) + + W(11, -1114174571, -1127668218, 997585257, -1126450718); + WS(1052284526, 1042464092); + sum1 = + W(0, 1010280196, 999914700, 1057530557, -1098111272) + W(1, -1101387838, 1027464615, -1136974408, -1110845507) + + W(2, 1046554367, -1100087104, -1110795931, -1128121686) + + W(3, 1026365340, -1109035161, 1060667985, -1090659644) + + W(4, -1102616600, 1001926272, 1020617774, -1110448219) + + W(5, 1063323154, -1094987596, -1105684762, 1025859742) + + W(6, 1023947782, -1110075532, 1043924417, -1095988958) + + W(7, -1124311688, 1017827156, -1127515216, 1038195741) + W(8, 1050039723, -1097163609, 1018127786, 1034844538) + + W(9, -1129271461, -1114945332, 1042422080, -1105136802) + + W(10, -1124435598, -1130637466, 1007810505, 1019473092) + + W(11, 1052688005, -1095692091, -1114597706, 1027019478); + sum2 = + W(0, 1025355846, -1119913429, 1034044275, -1140464466) + W(1, -1091074448, 1041357090, -1124685033, 1010871130) + + W(2, 1036346050, 1032812135, -1086522508, 1037018199) + W(3, 1029205900, 1016143206, -1128364593, 1071964190) + + W(4, -1074918519, 1033277276, 1011755468, 1033794365) + + W(5, -1133342818, 1067600837, -1089329657, -1111447139) + + W(6, -1113277680, -1140030878, 1020927778, 1039362648) + + W(7, -1106053895, -1118126225, 1035269289, 1020099653) + W(8, 1035477071, 1033733070, -1108456989, 1032003060) + + W(9, -1122502097, 991986873, 1011575434, 1008065452) + W(10, -1146528221, -1117647411, 1013457876, 1035095720) + + W(11, 1029499077, 994468553, -1106105254, 1009180302); + WS(-1085785015, -1080175544); + sum1 = W(0, 1035373246, -1103151077, 1058377668, -1091874455) + + W(1, 1025579124, -1111695537, -1125806618, 1045216768) + + W(2, 1050584367, -1094766367, 1043611260, 1043525714) + + W(3, -1118822551, -1094452856, 1054861331, -1107649205) + + W(4, -1106387815, -1102079139, 1044894533, 1039875576) + + W(5, 1046782533, -1090132878, 1049375324, -1105407270) + + W(6, -1102223008, -1151103277, 1057861265, -1090472533) + + W(7, -1115030560, -1144672552, 1041222777, -1094574331) + + W(8, 1051791466, -1111571937, -1137989279, -1102123612) + + W(9, 1023709757, 1048044105, 1043274206, -1098390656) + + W(10, 1049548184, 1041305154, -1122183565, -1103877399) + + W(11, 1058273114, -1092114299, -1106419572, -1116205169); + sum2 = + W(0, 998449416, -1118465870, -1124628345, -1148690252) + W(1, 1037770975, -1105952484, -1121990028, 1035743758) + + W(2, 1040306990, 1001004257, -1132010249, 1037805583) + W(3, 1039055377, -1103571680, -1098483719, 1060096717) + + W(4, -1108861100, -1087084008, -1115523342, 1049274722) + W(5, 964150684, 1077176219, 1047972499, -1070507600) + + W(6, -1132069983, -1106547389, 1024621733, 1060014437) + + W(7, -1098623231, -1092504349, 1032292249, -1126693677) + + W(8, -1103504000, 1016774454, 1034159573, -1105946989) + + W(9, -1128335569, 1034009109, 1043582890, -1107960970) + W(10, 1020716885, 1041667680, 998312734, -1116877357) + + W(11, -1116867442, -1139511962, 1042264637, -1102914489); + WS(1041580764, 1025947967); + sum1 = + W(0, 1032565172, 1034662848, 1053611982, -1093835868) + W(1, -1131110976, 1036244351, -1116825273, -1104706235) + + W(2, 1050747028, -1092905173, -1131069497, -1119290642) + + W(3, 1019951750, -1115255997, 1050206724, -1095669879) + W(4, 1036897764, 1017394926, 1022134396, -1107214727) + + W(5, 1063007652, -1096926641, -1105182467, 1029927621) + + W(6, -1111515158, -1098820316, 1060757006, -1089733625) + + W(7, -1098715869, -1106823604, 1034025399, 1032808736) + W(8, 1052025888, 1049974094, -1104277767, 1037476046) + + W(9, -1110133221, -1102823188, 1043880105, -1099659531) + + W(10, -1106501955, -1114565306, -1159719714, 1021100817) + + W(11, 1052817434, -1119725058, -1106408671, -1122404893); + sum2 = W(0, -1132209742, 1031078182, -1131885988, -1109418986) + W(1, 969823813, -1135041624, 986836209, 1029631070) + + W(2, 1025515900, -1129378830, 1027058278, 1012367442) + + W(3, -1121945777, -1119773491, 1029199828, -1113141662) + + W(4, 1030656895, -1116640321, -1170553346, 1020231728) + + W(5, -1120148774, 1055904551, -1099466937, 1014349374) + + W(6, -1138085578, 1023900693, -1122079840, 1057958803) + + W(7, -1089769002, 1019607807, -1127752664, -1133642976) + + W(8, 1019687015, 1044815557, -1096970616, 1019685270) + W(9, 1024317954, 1016594015, 1019770946, -1115676013) + + W(10, -1105180704, 1040370156, -1170071298, -1123929889) + + W(11, -1134784812, 1040873658, -1104818759, 1020720783); + WS(-1101021916, -1101341893); + sum1 = + W(0, 1026213188, -1104193847, -1099125811, 1055643976) + W(1, 1025577212, -1110018309, -1128959914, 1029994953) + + W(2, -1096018912, 1049220736, -1111820508, 1025253614) + + W(3, 1026395551, -1146733010, -1093634574, 1055313981) + + W(4, -1119144868, -1114303945, -1114900877, 1036038140) + + W(5, -1086773562, 1052012604, -1127551698, -1123712161) + + W(6, -1152047246, 1031817213, -1090412335, 1060627153) + + W(7, -1111302883, 1028280877, 1012420650, -1118727997) + + W(8, -1107844781, 1051291321, 1025725832, -1119269431) + W(9, 1006057769, 1021561044, -1104575744, 1049980081) + + W(10, -1112108341, 1031833384, 1026345301, -1106810537) + + W(11, -1104632714, 1047342967, 1003961523, 999050183); + sum2 = W(0, -1131988010, -1111316079, 1041465340, 1024389323) + + W(1, -1121573843, -1149117460, 1023490159, 1007442131) + + W(2, -1100903601, 1055734435, -1125698351, -1131908940) + + W(3, -1126411872, -1122871173, 1038743702, 1080207498) + + W(4, 1043717463, -1114017647, -1164111651, 1046145376) + + W(5, -1093182708, 1078445253, 1049726225, -1119425741) + + W(6, -1121501747, 1040330964, 1049859497, -1068399047) + + W(7, -1122596352, 1019240934, 1031886393, -1109560063) + + W(8, -1098635398, -1066503158, -1100760677, 1009702615) + + W(9, -1117332099, 1016982738, 1035352171, -1109489195) + + W(10, -1113462329, 1032687935, 1035364539, 1005935896) + + W(11, -1113093917, 1012210427, 1035980752, -1141270643); + WS(1046490332, 1041425064); + sum1 = W(0, 1024529499, -1116828595, -1093042204, 1043650965) + W(1, 1015429414, 1019425762, 1033054902, 1002731779) + + W(2, -1098109922, 1045029126, -1106337284, 995804238) + W(3, 1031945755, 1040980232, -1092614541, 1058500980) + + W(4, 1033182334, 1032419541, -1146773895, -1160896989) + + W(5, -1086741475, 1055608303, -1109695552, -1179835378) + + W(6, 1029605664, 1052617834, -1091564618, 1058257970) + W(7, -1174108025, 1044059953, 1004520717, 1015420456) + + W(8, -1090483479, 1019101890, 1029823567, -1127672093) + + W(9, 1031502108, 1044142352, -1094325635, 1041689704) + + W(10, -1123497953, 1032927635, 1024614604, 1032157630) + + W(11, -1086427940, 1049761551, 1041880275, 1040104968); + sum2 = W(0, -1122431319, 1026151548, -1122010793, 1049905644) + + W(1, -1102178930, -1124048569, -1114479591, -1106953243) + + W(2, 999999917, -1108260971, -1125976243, -1126306455) + W(3, 1024826864, 1048064546, 992235770, 1050719290) + + W(4, -1123774104, 1025075060, -1100833312, -1097347844) + + W(5, 1040448763, 1045454882, -1096948195, -1105554812) + W(6, 1043724086, 1037967160, 1044292364, 1049686405) + + W(7, 1038302972, 1034346164, -1109354990, -1109085075) + + W(8, 1032432738, -1111087807, -1108325988, -1114960687) + + W(9, -1130104331, -1110876131, -1143420941, -1098496523) + + W(10, -1118752296, 994535386, 1015245663, 1007980535) + + W(11, 1040568157, 1043523736, -1113347688, 1032072922); + WS(-1096079726, -1086813702); + sum1 = W(0, -1135457777, -1105268453, 1045566625, -1104980990) + + W(1, -1105625101, -1128467237, 1020632987, -1134572551) + + W(2, 1038076635, -1125909619, -1145052038, 1035122115) + + W(3, -1136898909, -1100910973, -1141635906, -1094783105) + + W(4, 1032999502, -1125440663, 1041289173, -1166801940) + W(5, 1058638213, 1057673490, 1030475041, 1035865453) + + W(6, 1012368645, 1038525034, -1104077708, -1100424110) + + W(7, -1113674176, 988204202, 1002632984, -1102504381) + + W(8, 1033251913, -1111352769, -1113040784, -1119749552) + + W(9, 1024629150, 1029902179, 1009307365, 1012100357) + W(10, 992583714, 1027550920, -1127204699, -1110256943) + + W(11, 1022942147, -1133590617, -1114381639, -1124393059); + sum2 = W(0, 1009177065, -1117003048, 1042183695, -1105766164) + + W(1, -1112946812, 1019480223, -1120740066, 1013092463) + + W(2, 1025589372, 1042721142, -1113055730, 1026018809) + + W(3, 1031366584, -1102800003, -1111208570, -1149080533) + + W(4, -1103263899, 1020058227, 1041576942, -1090661723) + W(5, 1068855162, 1040487387, 1030911277, 1007104581) + + W(6, -1100270767, 1059100650, -1085550755, 1023619821) + + W(7, -1103276630, 1029611268, 1045439690, -1097382737) + + W(8, 1044086134, -1099098175, -1114239046, -1162581429) + + W(9, -1125959183, 1022453518, 1032267243, -1126080241) + + W(10, -1107084863, 1037226018, 1033773937, -1106788899) + + W(11, 1025170288, -1106320787, 1019625936, -1116554192); + WS(1059841719, 1028884484); + sum1 = W(0, -1113543486, -1108411818, -1112074625, 1058342439) + + W(1, -1101044205, -1143395087, -1112448166, -1111506273) + + W(2, 1034453786, 1041783662, -1112657624, -1122260358) + + W(3, -1123514455, -1104706915, 1033474668, 1050338440) + + W(4, -1103529079, -1124590486, 1014814024, -1096756366) + + W(5, 1052483434, 1043430567, -1099567912, -1132902244) + + W(6, -1116573889, -1106354949, 1048710884, -1116369607) + + W(7, -1110811775, -1118491109, -1120616579, -1107115957) + + W(8, 1049505778, -1117001986, -1119641312, -1118809775) + + W(9, -1132301434, -1117349474, 1050151687, 1011608836) + + W(10, -1133908615, 996976763, -1127146586, -1105758103) + + W(11, 1056594572, -1106214629, -1113349351, -1114523384); + sum2 = W(0, -1131846847, -1142019487, -1119272484, 1043688817) + + W(1, -1110979463, -1128104285, 999597315, 973346488) + + W(2, -1113005256, -1112114230, -1112619479, 1003422803) + + W(3, 997751878, -1127636492, -1113445057, 1056371527) + + W(4, -1097247478, 1021279303, -1114921220, -1114646695) + + W(5, 1055277760, 1041350431, 1019660165, -1127196333) + W(6, 1031101790, -1098897499, 1032426103, 1038923617) + + W(7, -1105379211, -1138766624, -1115596944, 1027087956) + + W(8, 1036539833, -1123786644, 1026606310, -1129408714) + + W(9, 1024706196, -1111832500, -1114392819, -1130636099) + + W(10, 1012894502, -1130181692, -1120544321, 1029100436) + + W(11, 1010252474, -1123180191, -1125326592, -1164469676); + WS(-1092619630, -1089382730); + sum1 = + W(0, -1111364766, 1023648980, 1039669985, -1112475547) + W(1, -1102256285, 1036516737, 1043539187, 1020312451) + + W(2, -1096148415, 1048019422, 1027548272, -1110790259) + W(3, 984781533, -1115220152, 1055391282, -1085560118) + + W(4, 1048070471, 1016263062, 1030068626, -1101226428) + W(5, 1026945555, 1059189430, -1108016176, -1120756633) + + W(6, 1026274177, 1038621209, -1081505706, 1059392734) + W(7, 1040580240, 1007770772, -1111039089, -1105671421) + + W(8, 1045179252, -1105049488, 1037378816, 1034683832) + W(9, 1024515101, -1101912057, -1132720100, 1041558112) + + W(10, 1031071010, -1109624324, -1120853581, 1015856825) + + W(11, 1027675681, -1133761880, 1032748839, 1021933410); + sum2 = W(0, 1021752691, -1111677325, -1108952074, 1033183913) + + W(1, 1044091848, -1113755692, -1117827136, 1031932470) + + W(2, -1110048197, 1038437939, -1103930854, 1027358915) + + W(3, -1125983252, -1130612142, 1045228241, 1050756049) + + W(4, 1008734718, -1104619422, 990310070, -1104195843) + W(5, 1051763659, 1045197632, -1105931725, 1032921649) + + W(6, -1109957501, -1168184730, 1028013889, -1115591069) + + W(7, -1149204891, -1117367196, 1040724727, -1105272655) + + W(8, -1136328910, -1123843648, 1020655719, -1140627498) + + W(9, -1109878975, 1035492359, -1114456338, -1120329563) + + W(10, -1120613434, 1033876328, 1031887118, -1103738768) + + W(11, -1114723198, 1035246991, -1121689275, -1121880867); + WS(1051433070, 1041054969); + sum1 = W(0, 1027474774, 1025557871, -1105663671, 1035613609) + W(1, 1041537220, 1027665948, 995089009, 1019369911) + + W(2, 1032468488, 1037418314, 1036952965, -1122283488) + W(3, 1034863641, 1049084179, -1096978722, 1039456478) + + W(4, 1041156238, 1041167849, -1109189270, 1046403907) + + W(5, -1082587707, -1080639932, 1049567823, -1112387034) + + W(6, 1039503310, 1044512531, -1102025153, 1026454114) + W(7, 1040087661, 1039611744, -1126811322, 1035909664) + + W(8, -1107200379, 1042549431, 1039105725, -1137459494) + + W(9, 1033371404, 1033234174, -1104819461, 1042229543) + + W(10, -1131034584, 1031071714, 1010666397, 1028564471) + + W(11, -1106755535, 1034360184, 1031577769, 1033297350); + sum2 = + W(0, 1039097792, -1103860174, -1106228186, 1004583985) + W(1, 1031892389, -1133334119, -1128793460, -1106733661) + + W(2, 1050938198, -1097187313, 1046933969, -1107245750) + + W(3, -1140010118, 1043000544, -1100268114, 1021007203) + + W(4, -1107049139, 1039577114, 1022871695, -1106671798) + W(5, 1039252188, 1053089515, 1049075999, -1104825734) + + W(6, -1138263433, 1046664654, -1099105674, 1048715277) + + W(7, -1103930146, 1030321621, -1112923836, -1123142296) + + W(8, -1121884665, -1114597930, 1022883749, -1117968576) + + W(9, 1026478628, 1037719970, -1100173198, 1047464456) + + W(10, -1098080196, 1036807670, -1110368657, 1042580191) + + W(11, 1034926170, -1106315502, -1108178582, 1018138445); + WS(-1097236334, -1078251511); + sum1 = + W(0, -1147379729, -1107131303, -1102832418, 1058323440) + W(1, 1023750586, -1116361496, 981774949, 1007351583) + + W(2, -1125527926, 1053289720, -1121375351, -1124892056) + + W(3, -1145120489, 1033603653, -1095625930, 1056660465) + + W(4, 1026746467, -1128008098, -1112510828, 1043141838) + + W(5, -1082084799, 1032726417, 1033795604, -1117973855) + W(6, 975327689, 1029606457, -1090577043, 1058345481) + + W(7, 1025947909, -1148460889, 1008364580, 938727969) + W(8, -1093823475, 1053416161, -1131151340, -1125502955) + + W(9, -1140670990, 1020032977, -1098508888, 1046390514) + + W(10, -1119905544, 999577711, 1022969831, -1108966769) + + W(11, -1096801949, 1049766564, 1037296218, 1010324189); + sum2 = + W(0, 1024894779, -1102276353, -1120020336, -1081787381) + W(1, 1039662448, 1023553607, 1020144998, 1025017931) + + W(2, -1096890621, -1080908066, 992888305, -1118655405) + + W(3, -1118791847, -1107221556, 1050182775, -1102161510) + + W(4, -1130889346, -1120230550, 1007750652, 1046635995) + W(5, 1039741552, 1072604155, 1039835396, -1126400334) + + W(6, -1137666916, -1132306598, 1043589185, 1055213170) + W(7, -1110509653, 1020541198, 1023698735, 1023586615) + + W(8, -1108361045, -1115556916, -1122324709, 1020891302) + + W(9, 1009542396, 1030880679, -1114600836, 1037616572) + + W(10, 1000980713, -1119304668, -1129126018, 1015842286) + + W(11, 1024872627, -1105259074, -1124270218, 1033066840); + WS(-1095840110, 1065907853); + sum1 = + W(0, -1149009607, -1123781617, 1057715094, -1102734645) + W(1, -1101560548, 1034276991, 1029310442, -1130903741) + + W(2, 1048478500, 1041326469, 1036129479, 1021921030) + W(3, -1122029108, -1115466131, 1058442742, -1088947208) + + W(4, -1107277134, 1036949012, -1136794300, 964920945) + W(5, 1045634572, -1083008792, -1109559039, 1024401462) + + W(6, -1118254622, -1115351608, 1052165513, -1096684061) + + W(7, 1036543086, -1114280609, -1132243967, 1043406509) + W(8, 1053323726, -1089856222, 1024712701, 1035777670) + + W(9, -1126823604, -1116119295, 1042519141, -1127763004) + + W(10, 1009014011, -1132072137, 1010554921, 1040435870) + + W(11, 1051535704, -1095672430, -1114598742, 1024787534); + sum2 = + W(0, -1122765153, -1112086475, 1040388299, 966593378) + W(1, -1114107386, 975247631, -1119761608, -1118318168) + + W(2, 1023061820, -1102263327, -1113965021, -1137846028) + + W(3, -1115823403, -1121250504, -1128744886, -1110151426) + + W(4, 1045334069, -1111548146, -1123357438, -1119202357) + + W(5, 1057284387, 1059190541, -1118800384, 1023792011) + + W(6, -1105805209, 1024515185, -1103324019, -1106793279) + + W(7, -1164047122, -1112106446, 1031734555, -1130234658) + W(8, 1037222780, 1050053336, 1025627836, 1020007628) + + W(9, -1111986136, -1134784044, -1110952019, -1107073751) + + W(10, -1114668630, -1125560981, -1126486235, 1026675759) + + W(11, -1117543075, 1021583022, -1124432766, -1131408661); + WS(1024351088, -1094038469); + sum1 = W(0, 1016930687, 1038061004, 1052546457, -1086527812) + W(1, 1040515838, 1006605995, 1024919184, -1118029957) + + W(2, 1050276351, -1103330015, 1027568116, 1004978763) + W(3, 988693323, 1005748798, 1052906127, -1085615881) + + W(4, 1040353352, 1030413326, 1038267403, 1038925818) + W(5, 1062157201, -1097782940, -1124671689, 1031140124) + + W(6, 1001354275, 1032752795, 1055274272, -1088621706) + + W(7, -1113419105, 1009586849, -1123840710, 1034287148) + + W(8, 1050137483, -1090365828, 1017331974, 1023985459) + + W(9, -1125725377, -1110688307, 1036684158, -1108159426) + + W(10, 1018660298, -1129057942, -1120680465, 1036629872) + + W(11, -1112935826, -1098987606, 1039926041, -1120649652); + sum2 = + W(0, 1018662896, 1033363591, -1101021011, -1107389045) + W(1, 1013978472, -1120396150, -1131745232, 1031409358) + + W(2, -1109130821, 1050735765, -1122086781, 1024022584) + + W(3, -1136728576, 1036576685, -1097527529, 1043333749) + W(4, 1029525730, 1015209616, -1110788716, 1060006588) + + W(5, 1058553385, -1120731420, -1118628277, 1030135008) + + W(6, -1123530251, 1052968790, 1023922010, -1100470754) + + W(7, -1117232951, 1018906596, -1101470606, -1102632350) + + W(8, 1057288665, -1097217661, -1112638769, -1121049341) + + W(9, -1110519714, -1105224546, -1111209476, 1038218737) + + W(10, -1121310567, 1024891644, -1125138150, -1083015355) + + W(11, 1034932287, 1047940150, 1023530026, -1113292326); + WS(-1086599863, 1058406314); + sum1 = W(0, -1165120005, 1027409257, 1060099497, -1093079745) + + W(1, -1114693988, 1019186220, -1133002117, -1121445206) + + W(2, 1049800473, -1099695891, 1033258882, 1025328858) + + W(3, -1129945046, -1106007410, 1059141168, -1091476505) + + W(4, -1129815521, -1128567742, 1024249318, -1105883025) + + W(5, 1051534797, -1093891126, -1124179562, 1017248474) + + W(6, -1119162837, -1105279538, 1058010671, -1094225343) + + W(7, -1106482085, -1123837177, 1026085015, -1127421331) + + W(8, 1051659429, -1106347590, -1112036922, 1031899202) + + W(9, -1121003281, -1109094875, 1047889907, -1098091099) + + W(10, 1030868870, -1123224348, -1127955907, 1024561201) + + W(11, 1050835423, 999784785, -1097732400, -1141903913); + sum2 = W(0, -1116781913, 1031543998, 1082393585, 1050004941) + W(1, 1025243259, -1123250937, 1016621488, 1029140379) + + W(2, 1078957479, 1028477447, 1010603263, -1125975170) + + W(3, -1133566515, 1044191480, -1080327233, -1104837212) + + W(4, -1125439138, 1007793087, -1124282558, -1105795809) + + W(5, -1065075267, -1086493521, -1117319975, 1028403247) + + W(6, 1034216133, 1017978886, -1076777978, -1109285108) + + W(7, 988101688, -1125200922, -1128560494, -1175609568) + W(8, 1030943022, 1045155438, 1024551608, 1020903576) + + W(9, 991940908, -1120640387, -1110243052, 1033432207) + + W(10, -1129511338, -1119399555, 1017899660, 1019924506) + + W(11, -1113970478, -1130476854, 1020472787, 1028374268); + WS(-1102531292, -1104168529); + sum1 = + W(0, -1149508566, 1032023755, 1058049088, -1091020399) + W(1, -1123106485, 1018386839, -1156103398, -1123937923) + + W(2, 1044530702, -1093487559, 1028416434, 1022122127) + W(3, 1005530819, -1114986325, 1057825341, -1088576155) + + W(4, -1124442300, 1027828556, 1019304359, -1105594348) + + W(5, 1061967565, -1113700815, -1132463754, 1023613146) + + W(6, -1111288609, -1100927253, 1057378026, -1096522221) + + W(7, -1107169312, -1118265958, -1152861762, 1042848102) + + W(8, 1043852869, -1100187457, 1030031137, 1031835352) + + W(9, -1123770879, -1131000647, 1032195229, -1097716728) + + W(10, -1127676038, -1124424850, 992160490, 1048571064) + + W(11, 1021567685, -1095320739, 1015048992, -1151822630); + sum2 = + W(0, -1112466451, 1034684305, -1101371049, -1100658772) + W(1, 1043071493, -1119405084, -1130983341, 1035765483) + + W(2, -1113050760, -1100149859, 1039321546, -1140521940) + + W(3, 1032826781, -1117553496, -1096382267, 1042208912) + + W(4, -1131759707, -1127348451, -1114093653, -1101908611) + + W(5, 1063677104, 1062452463, -1106482074, 1028341682) + W(6, 1040752192, -1105770401, -1132405995, 1047214162) + + W(7, -1105645940, 1022142418, -1154197073, -1106309648) + + W(8, -1114901667, -1095028755, 1034888818, -1118255322) + W(9, 1026229169, 984953298, 1023704972, -1109270652) + + W(10, 1035103126, -1118485150, 1032051747, -1113409477) + + W(11, -1104964374, -1107539022, 1008251057, 1025943565); + WS(-1107552696, -1110437397); + sum1 = W(0, 994440345, -1114854865, 1038159592, -1169396004) + + W(1, -1112745281, 1003079356, -1123893979, -1115498472) + + W(2, -1143015444, -1103811554, -1176837895, -1126823399) + + W(3, -1123659045, -1107252796, 1048547885, -1102945115) + + W(4, -1113210869, -1127252913, 1033249360, -1098484960) + + W(5, 1066459081, 1054059005, -1092775086, 1036761683) + + W(6, -1115012423, -1105215024, 1050116824, -1110458371) + + W(7, -1107508006, -1117476787, 1025628848, -1113844817) + + W(8, -1114931568, 1027966800, -1115481499, -1139958260) + + W(9, -1120012907, 1015022176, -1139703834, -1137430074) + + W(10, -1123286831, -1143819946, -1138236651, -1112267573) + + W(11, 1030992175, 1038350450, -1114208046, -1119805695); + sum2 = + W(0, -1128900045, 1032112026, -1122103841, 1020429393) + W(1, -1123818335, 1025087925, -1134566747, -1121844433) + + W(2, 1023900033, 1031965476, -1168200234, -1116320886) + W(3, 1023101249, 1024457633, -1130431017, 1010339139) + + W(4, -1111989275, 1037399444, -1119409466, 1041370918) + + W(5, 1071310745, -1073631838, -1111141033, -1131868341) + + W(6, 1014344875, -1138667107, 1015570157, 1024644617) + W(7, -1128248465, 1027301561, -1124604689, 1023011873) + + W(8, 1025187637, 1038341472, 1032459330, -1118206868) + + W(9, -1135550339, -1123574415, 1029193653, -1117036677) + + W(10, 999769253, -1124415769, 1011013307, 1018662193) + + W(11, -1118001398, 1034637136, 1020580065, -1136885571); + WS(-1106869980, -1095812171); + sum1 = W(0, 998635262, 1030538232, -1104276842, 1021368885) + W(1, 1037657452, 1012233735, -1132768195, 1032306163) + + W(2, 1027943897, 1042581143, -1130589992, -1127936403) + + W(3, 1031165051, 1040655940, -1094369165, 1043839724) + W(4, 1045125152, 1030674671, -1109012795, 1049530762) + + W(5, -1079963696, -1098205560, 1052736873, -1106402911) + + W(6, 1031921458, 1035845131, -1094529094, 1041010327) + W(7, 1041646697, 1035635524, 959153786, 1029124089) + + W(8, -1138415831, 1043286153, 1033263566, -1117746707) + + W(9, 1015400066, 1034791747, -1107836910, 1040781721) + + W(10, -1127518347, 1026900011, 1020404450, -1126776961) + + W(11, -1127281161, 1032119517, 1032079673, 1007765715); + sum2 = + W(0, -1137391706, 1016897725, -1122041158, 1032188407) + W(1, 959684203, 1004755699, -1152109415, -1123613558) + + W(2, -1117579022, 1034093919, -1123954990, -1142267571) + + W(3, 1015680093, 1031100358, 1032233585, -1107212716) + W(4, -1144448755, 1020208893, -1108578627, 1031185182) + + W(5, 1068869480, -1079207220, -1112638895, -1131161181) + + W(6, 1012334874, 1018767069, 1031129926, -1118301998) + W(7, -1145613555, 1014639674, -1126811133, 1016912269) + + W(8, -1135215962, 1010098650, 1002322227, 1010341946) + + W(9, -1146463859, -1123894542, -1172726683, 1010207290) + + W(10, -1163026381, -1128211133, 1013671002, -1129388765) + + W(11, 1025914590, 998321459, -1185201771, 1014227898); + WS(-1106551004, 1058945856); + sum1 = W(0, -1136733265, 1027999917, 1036329486, 1021052191) + W(1, -1112842790, 996925861, 1029534949, -1110759309) + + W(2, 1039804839, -1090459221, 1042972690, -1126301053) + + W(3, 1040114552, -1101184472, 1055915689, -1088507490) + + W(4, -1116549941, 1035692146, 1023973738, -1136820001) + + W(5, 1045009467, -1102642413, 1048917175, -1116120689) + + W(6, 1008178533, -1120539979, -1099722578, 1057115504) + + W(7, -1103385510, 1032281663, -1121731675, 1050535890) + + W(8, -1092228133, -1141944531, 1042662182, 1025401864) + + W(9, -1122738710, 1036280349, -1110742697, 1036514925) + + W(10, -1123309658, -1122836256, 998670125, -1112884987) + + W(11, -1133144549, 1024140334, 1040183891, 1009223461); + sum2 = + W(0, -1166199047, 1029866216, -1143586281, 1016771040) + W(1, -1123676489, -1174784654, 1008667864, -1111274931) + + W(2, 1037662319, 1050961303, 1039205717, -1119230230) + W(3, -1137339492, 1026227362, 1052978055, 1073672156) + + W(4, 1048063806, -1117826448, -1142224481, -1119220040) + + W(5, -1079795268, -1075413433, 1028203090, 1028246046) + + W(6, -1152330850, 1031356244, -1109068899, 1029037052) + + W(7, -1113725553, -1160612324, 1020018908, -1116678638) + + W(8, 1041694498, 1026323256, -1115208722, 1024440460) + W(9, -1116618549, 1026327024, -1122243464, 1021575344) + + W(10, 1002430881, -1126523302, 1015962596, -1189397276) + + W(11, 1027749752, -1119692611, -1114291930, 1031666290); + WS(1045979868, -1116118129); + sum1 = W(0, 1019079208, -1115974509, 1054347779, -1096855346) + + W(1, -1118610636, -1120438410, -1124899402, -1114857165) + + W(2, 1046800787, -1098629066, 1029706377, 1017939836) + + W(3, -1142300538, -1110287856, 1053005207, -1093283235) + + W(4, 1028644213, -1131155654, 1011594153, -1099509298) + + W(5, 1063937495, -1097005655, 1015974258, -1116499825) + + W(6, -1134190949, -1112842949, 1058166871, -1090046872) + + W(7, 1040979430, -1119992573, -1132197046, -1107483943) + + W(8, 1048177899, -1104885511, -1129150352, -1120133576) + + W(9, -1116332853, -1111331677, 1047873428, -1102896822) + + W(10, 1028514810, -1118080608, -1135144470, 1018268010) + + W(11, 1056893199, -1096686406, -1118433447, -1112688517); + sum2 = + W(0, -1132220574, 1034058342, 1008450820, -1132397996) + W(1, -1105536207, 1025437040, -1115410889, -1116250603) + + W(2, -1126553639, -1097158033, -1108668742, -1118211898) + + W(3, 1017347763, 1029372102, -1105866140, 1060185134) + + W(4, -1106418349, 1034066570, -1123931551, -1101916549) + + W(5, 1053545154, 1060913993, -1104852271, -1102379864) + W(6, 1027749497, -1104316591, 1054419707, 1033775493) + + W(7, -1106993048, -1133416673, -1111299822, 1035393713) + + W(8, -1102688086, -1115290197, -1102129692, -1209279719) + + W(9, 1025854529, -1107314572, 1036131430, -1106841697) + + W(10, -1149271050, -1133826631, -1123916419, 1033668899) + + W(11, -1144517652, 990325833, -1114889391, -1129688184); + WS(1058774455, 1069380246); + sum1 = W(0, 1032626516, -1114780225, 1045065548, -1111975378) + + W(1, 1025328225, -1121960111, -1119757626, 1038823639) + + W(2, 1040221656, -1115053555, 1020222778, 1037972921) + W(3, 1033017026, -1098306133, 1021036585, 1050529784) + + W(4, -1115391173, -1112361500, 1015522813, 1034533838) + + W(5, -1082356272, -1095104409, 1045288819, -1139302935) + + W(6, -1128327131, -1103839696, 1057244812, -1133328720) + + W(7, -1116298540, 1018289699, 1036888920, -1112718001) + + W(8, 1032300191, -1111385431, 1042918995, -1110693582) + + W(9, 1032769109, -1126986782, 1043416793, -1124233691) + + W(10, 1029500622, 1027375220, -1148588495, 1012070438) + + W(11, 1045596067, -1105784401, 1037659662, -1114680879); + sum2 = + W(0, -1129789987, 1017265095, -1124616639, -1116091154) + W(1, 1033010488, 1011223606, 1019234847, -1124971531) + + W(2, -1114025560, 1022067335, -1114442452, -1117824661) + + W(3, -1128803579, 1043137983, -1132476030, -1102585265) + + W(4, 1028851843, 1031833634, -1112792165, 1047657371) + + W(5, -1114992592, 1052022695, -1115343414, -1136738894) + + W(6, 1011967806, 1034970984, -1098689491, 1033604172) + W(7, 1002830796, 988094894, 995307959, 1010908150) + + W(8, -1115509379, 1031244615, -1121158047, 1025799099) + W(9, 1018394359, -1107223361, 1006851110, 1032350856) + + W(10, -1114060980, -1118870225, -1112288614, 1027672251) + + W(11, -1128503755, 1024636851, 1027935499, -1127411999); + WS(1065814108, -1098421406); + sum1 = + W(0, 1030554015, -1104400078, -1097091133, 1050276747) + W(1, 1045406982, -1119880969, -1131576032, 1022555209) + + W(2, -1099298246, 1048827844, -1106685173, -1132305362) + + W(3, 1020712308, -1130072911, -1094842433, 1057743463) + + W(4, 1040093248, -1122176686, 1019668842, -1118231891) + W(5, -1084181571, 1051719984, 1018405640, 1026194364) + + W(6, -1178997255, 1041059117, -1098796514, 1058357819) + + W(7, -1118903138, 1004376640, 1023970854, -1115494780) + + W(8, -1094912271, 1056339293, -1115388505, 1024072531) + W(9, 1011631425, 1035736611, -1090107010, 1051879221) + + W(10, -1113309730, 1009992363, 1023862096, -1104560304) + + W(11, -1092396649, 1057941592, -1118151090, 1029155252); + sum2 = W(0, -1104337717, -1085961218, 1065899128, 1055232204) + + W(1, -1090132108, 1023963317, 1027104118, 1036459641) + + W(2, -1117484391, -1101810882, 1052764213, 1014918739) + + W(3, -1114433477, -1092980271, 1062039746, 1049041629) + + W(4, -1092098978, 1035158266, -1122138940, -1101372003) + + W(5, 1077763913, 1071302707, -1123596042, 1027553578) + + W(6, 1048327612, -1098271754, -1088377514, -1084489503) + + W(7, 1027311380, -1115760458, 1018207462, -1115566688) + + W(8, -1079225367, -1087139921, 1042626102, 1025357528) + + W(9, 1015118770, -1101224844, -1106150830, 1036291830) + + W(10, -1105072819, 1032466828, 1054676844, -1105452167) + + W(11, -1079350028, -1090077553, 1053993534, -1115160051); + WS(-1083527351, -1082119000); + sum1 = + W(0, 1025283773, -1100516229, -1103907601, 1054198743) + W(1, -1139734483, -1115248201, -1132057884, 1028453762) + + W(2, -1097545679, 1048327710, -1114897689, 1021031566) + + W(3, 1024000280, -1124447466, -1096840081, 1054350616) + + W(4, -1109407791, -1115380998, -1117776915, 1027818609) + + W(5, -1088298777, 1057412078, -1112548849, -1139302503) + W(6, 994019357, 1030853236, -1090997910, 1059405315) + + W(7, -1107996896, 1029448614, -1146975260, -1120656758) + + W(8, -1097629690, 1052404744, 1035903152, -1119316016) + W(9, 1021506300, 1023329542, -1102673054, 1051692752) + + W(10, -1110888465, 1026998601, 1016847260, -1111423375) + + W(11, -1097673748, 1047886934, 1034953432, -1149960989); + sum2 = W(0, 1023717076, 1034248479, -1110594365, -1113079527) + W(1, 1030579691, 999456782, 996584188, -1120794590) + + W(2, 1045315954, -1094151830, -1113958061, 1021526858) + + W(3, -1122858228, 1037241484, -1111180041, -1064957365) + + W(4, -1106054130, 1018369486, 1005163886, -1124781820) + + W(5, -1088752945, -1066051811, -1113733983, 1031457177) + + W(6, 1025356913, -1115274025, -1100621689, 1081496726) + + W(7, 1049150725, -1112407773, -1118691920, 1026099362) + W(8, 1052626156, 1084041658, 1032870315, 1022214782) + + W(9, 1028885707, -1121079636, -1114153113, 1034711477) + + W(10, 1042989109, -1108284893, -1114207359, 1010502519) + + W(11, 1038857859, -1115018893, -1106741724, 1023330420); + WS(1031453552, -1108810221); + sum1 = W(0, -1122540068, -1106571135, -1105389195, 1051764564) + + W(1, -1121040220, -1136080166, -1141490084, 1028200745) + + W(2, 1023785053, -1104087736, 1027661528, 1023137883) + + W(3, -1132153597, -1106394603, 1041720002, 1055195957) + + W(4, -1111907522, -1123745267, 1029503994, 1029495448) + + W(5, -1089108304, -1096098616, 1031937892, 1034024448) + + W(6, -1126370513, -1118016922, 1047749927, 1047204316) + + W(7, -1112974291, -1121356173, -1127727061, 1043712879) + + W(8, -1092241143, 1028938666, 1025162247, 1028910871) + W(9, -1132743443, 1035505061, 998106632, 1043190746) + + W(10, -1152510101, -1121641711, 1024122485, 1041979953) + + W(11, -1098695505, 1039644831, 1002213552, 1025100697); + sum2 = + W(0, 1032316109, -1117365450, 1028239450, -1106184057) + W(1, 1039709205, -1127567978, -1122133197, 1033736971) + + W(2, -1104139010, 1045998485, -1126266788, 1029398164) + + W(3, 1021061413, -1117276879, -1090538079, -1087751568) + + W(4, 1056538813, -1106793212, -1122180337, 1009179554) + W(5, 1022309577, 1065712953, -1098763613, 1016414657) + + W(6, -1115376331, 1034450077, -1125496737, -1100319643) + + W(7, 1017435581, 1032114232, -1123716599, -1100616286) + + W(8, 1059658657, -1100023584, 1022563437, -1113653553) + + W(9, 1008734994, -1130550593, 1014965154, -1115246006) + + W(10, 980175008, 1034308617, -1144451812, -1102305630) + + W(11, 1053491799, -1107982835, -1103966134, 1020870093); + WS(1060627383, -1111244297); + sum1 = + W(0, -1124372048, 1041984816, -1098607926, 1048999428) + W(1, -1110297584, 1037179887, -1124233202, 1023856878) + + W(2, -1097555068, 1050454749, -1119853981, -1124350564) + + W(3, -1115057922, 1037843884, -1092180401, 1057072683) + + W(4, -1100337986, 1037306108, -1126359548, 1013283185) + + W(5, 1035134080, 1037566628, -1117600845, -1180500637) + + W(6, -1135390133, -1106598024, 1055432750, -1088869991) + + W(7, 1045634091, -1107300041, 999175032, -1109047521) + W(8, 1050330552, -1097603878, 1040799043, -1132131255) + + W(9, -1137033126, -1108189319, 1046692025, -1106138715) + + W(10, -1129123036, -1126029544, -1120904377, -1127664786) + + W(11, 1039361415, -1115643873, 1042168959, -1132202938); + sum2 = + W(0, 1027553654, -1105419467, -1141314538, 1051401064) + W(1, 1061407816, -1086513034, -1128416633, 1035214610) + + W(2, 992160749, -1098506313, 1048701957, 1023990179) + W(3, -1120268362, -1102082588, 1039698771, 1041311911) + + W(4, 1065441970, -1083801169, 1026192109, 1034096310) + W(5, 1028842291, 1044707561, -1108357660, 1027929117) + + W(6, 1010812163, -1109637676, -1128101012, 1040877432) + + W(7, -1080219839, 1058347144, -1133939099, 1042926233) + + W(8, -1110346070, -1107620104, -1089748519, 1054974548) + + W(9, 1033310247, -1103557522, 1041169016, 1044637450) + W(10, -1106511250, 1012370076, 1007338654, 1039202903) + + W(11, -1150310139, -1101325278, -1094091750, 1054706164); + WS(1037089208, -1117319375); + sum1 = W(0, -1117307261, -1127081515, -1090315640, 1055484319) + + W(1, 1019801962, -1140393804, -1109658215, 1037266337) + + W(2, -1103803502, 1036834781, -1121027890, -1122236391) + + W(3, -1104716662, 1045840649, -1108965493, 1059715066) + + W(4, -1120952094, 1007521585, -1095157370, 1048384396) + + W(5, -1089739445, 1050929076, -1115632913, -1115666157) + + W(6, -1115283233, 1042005149, -1098438340, 1059599591) + + W(7, -1115851136, 1038771059, -1113906562, 1026318614) + + W(8, -1090508193, 1050537744, 1036887192, -1114842616) + + W(9, -1127634429, 1035073906, -1096110967, 1039184033) + + W(10, -1109698481, 1040209394, -1150522598, -1129730364) + + W(11, -1090097982, 1056916499, 994450682, 1023772594); + sum2 = W(0, -1096641595, 1051991389, -1107135642, -1120991144) + + W(1, -1123228782, -1119770484, -1086741683, 1059199896) + + W(2, 1044105651, 1025236133, 1032269711, 1020415755) + W(3, -1073585699, 1069582799, 1057042277, -1123268190) + + W(4, -1116194138, -1119862022, -1071753138, 1070628328) + + W(5, 1065961920, -1098135951, -1144560253, 1033682735) + + W(6, -1078410756, 1067042424, 1057516905, 1032298014) + + W(7, 1026966393, -1113740644, -1096289506, 1055331220) + + W(8, -1098611055, -1106950583, -1155415556, 1022995083) + + W(9, -1145261363, 1015112751, 1043415065, 1007537613) + W(10, 992611856, -1144895945, 997353903, 1024293693) + + W(11, -1101981251, 1025642916, 1011854094, -1130196038); + WS(-1089262391, 1050517969); + sum1 = W(0, -1112721887, 956356282, 1041136081, -1112851037) + W(1, -1118798326, 1033047322, 1040766980, 1032255106) + + W(2, -1099047838, -1136806893, 1044101949, -1110781188) + + W(3, -1116916633, -1115255965, 1050954387, 1047658201) + + W(4, -1099177336, 1022949658, -1109323658, 1053521294) + + W(5, -1090918435, -1090498606, 1048722524, 984126311) + + W(6, 1043853249, -1109293354, 1049475859, -1111100085) + + W(7, 1044026608, -1111349460, -1102481809, 1024224759) + + W(8, 1046323061, -1101889105, -1109421665, -1151794972) + + W(9, 1025978335, 1036451442, -1129023222, -1112184834) + + W(10, 1044252857, -1140137768, -1134508350, 998852344) + + W(11, -1126452038, 1037224108, -1113020120, -1119083507); + sum2 = + W(0, -1120544497, -1104964203, 1056285145, -1109256198) + W(1, -1107706742, 1033408182, 1042905493, -1097077111) + + W(2, -1118581415, 1026029661, 1025674690, -1118988963) + + W(3, 1045262161, -1098230931, -1079914544, 1056552993) + + W(4, -1103396776, 1021102038, -1104438232, 1057982485) + + W(5, 1057557770, -1104081201, 1048351556, -1136298684) + + W(6, 1023630957, -1106247773, 1048964135, -1114436673) + + W(7, 1018818866, -1112938187, -1122372280, 1011970003) + W(8, 1020547274, 1033190701, -1103728916, 1034200267) + + W(9, 1027866949, 1026340389, -1113753028, -1107460568) + + W(10, 1046941904, -1117493164, -1121491826, 1016978228) + + W(11, 1034078959, 1034442922, -1106194166, -1172844144); + WS(1055467886, -1126093527); + sum1 = + W(0, -1115675946, 1037777366, 1043818615, -1096353162) + W(1, -1150025924, 1035905869, 1039731987, -1126460340) + + W(2, -1103677379, 1012406341, 1031349769, -1103947080) + + W(3, -1108949528, -1145838757, 1060367897, -1088026493) + W(4, 1034695514, 1034985426, 1014043817, 1049783617) + + W(5, -1102044139, -1095567535, 1044285022, -1129716323) + W(6, 1025589529, 991251120, -1109258124, 1051881528) + + W(7, 1011738461, -1107675487, -1102050167, 1042727635) + + W(8, 1049311757, -1095440907, -1115570324, 1042590402) + + W(9, 1035820699, -1123043835, -1116399889, 1032817677) + + W(10, 1040150333, -1104125432, -1114599603, 1024161077) + + W(11, 1046137806, -1116994158, -1110796915, -1140552997); + sum2 = + W(0, -1115939175, -1111463085, 1026058510, 1015189774) + W(1, -1116961377, 1003109525, 1042939513, 1009748958) + + W(2, -1101036999, 1048391804, 1019493983, -1128500291) + + W(3, -1106984126, -1104760450, 1046231331, -1101164712) + + W(4, 1013441892, -1127287103, 1036071940, 1026404786) + W(5, 1060091622, 1059732347, -1113485706, 1036806652) + + W(6, -1133154938, 1042746589, -1109115274, -1090421446) + + W(7, -1102245299, -1110906499, -1110872047, 1018643239) + + W(8, 1042116887, -1092755101, -1104832958, 1042929180) + W(9, 1038271101, 1024219237, -1104891113, 1018386748) + + W(10, 1043357489, -1108912836, -1124388167, -1107044825) + + W(11, -1137025366, -1112446842, -1123717753, 1034520620); + WS(1062208951, 1065603754); + sum1 = + W(0, 1032466911, 1029341462, 1059167044, -1090134924) + W(1, -1133534677, 987089513, 1012820793, 1027274819) + + W(2, 1052950767, -1094303727, 1027990706, 1032570772) + W(3, 1029562264, 997585115, 1057349364, -1085543304) + + W(4, 1035990447, -1136982833, 1020285479, 1040141401) + + W(5, -1108524682, -1080037127, 1037410929, -1125543221) + W(6, 993753125, 1032063722, 1049874906, -1095616607) + + W(7, 1039846496, 1015158861, 1033268866, -1153074023) + W(8, 1048703978, -1112675170, 1023735025, -1145342854) + + W(9, -1131051261, 1015103815, 1050186639, -1111683969) + W(10, 1040888889, 1031358985, 1028903855, 1040294280) + + W(11, 1053103700, -1091636059, -1118753424, 1022936933); + sum2 = + W(0, 1035386648, 1042887622, -1086410483, -1090258329) + W(1, 1060158548, -1113981975, 1023547272, -1099060438) + + W(2, 1053956416, -1112148135, 1050315819, -1099847621) + + W(3, 1025878508, -1099619867, -1094814183, -1093316197) + + W(4, 1046080958, 1046524888, 1026832668, -1099104088) + W(5, 1069089225, 1060781490, -1103190742, -1112424275) + + W(6, 1029828312, 1048769602, 1044213412, -1091192206) + + W(7, -1105160931, 1051146364, -1098240729, -1121505868) + + W(8, 1035342184, -1105713821, -1084784918, 1019461112) + W(9, 1044150428, 1040524432, 1040447750, -1089411157) + + W(10, 1058372334, 1028619520, -1103643200, -1115369075) + + W(11, 1049544904, 1058550641, -1080579858, 1040133188); + WS(-1078970012, -1070975772); + sum1 = + W(0, 1023443287, -1111813336, -1095332548, 1048282532) + W(1, 1036630695, 999582566, 1008154783, 1034628686) + + W(2, -1098370186, 1052880922, -1109395910, -1140663171) + + W(3, 1008498119, 1020510238, -1091304148, 1054365856) + W(4, 1031904252, -1128098380, 1032996598, -1119594955) + + W(5, -1097391342, 1065196819, -1105409007, 1030941172) + + W(6, -1130007992, 1037186855, -1088889903, 1037830473) + W(7, 1022933044, 1003729918, 1026985054, -1129455456) + + W(8, -1093273302, 1040256647, 1030320779, -1138808617) + W(9, 1001505728, 1024916861, -1097878954, 1042516535) + + W(10, -1131972409, 1018809669, 1027285064, -1118416824) + + W(11, -1097408559, 1044458956, 1037289397, 1005961310); + sum2 = + W(0, -1114009537, 1019032853, 1024640816, 1029944441) + W(1, -1146945026, -1136399129, 1035366037, -1143037026) + + W(2, -1101234014, -1105571142, 1031686749, 1018164069) + + W(3, -1111463643, -1122373240, 1068131945, 1044188353) + + W(4, -1128619453, -1125359481, -1119334122, 1056620469) + W(5, 1075463933, -1093783941, 1046426762, 999713778) + + W(6, -1132366661, -1103744316, -1075751794, 1050699227) + + W(7, -1109652943, -1123073190, 1001109746, 1002774938) + + W(8, -1072865378, -1098127223, -1131952529, 1019524751) + + W(9, 1035022899, -1102405348, 1052446989, 1028903402) + W(10, -1123943246, 983357578, -1112054465, 1046894720) + + W(11, 1019415611, -1119380340, 1017598049, 1013611461); + WS(-1137905088, -1096938393); + sum1 = + W(0, -1127951952, -1116133184, -1092624022, 1045295113) + W(1, 1023908704, 1031880695, -1139830244, 1040763803) + + W(2, -1104553656, 1046745657, -1103252327, 1040451684) + + W(3, -1108742721, 1041221580, -1090149133, 1057147883) + W(4, -1103732914, 1026434167, 1019792636, 1009683312) + + W(5, 1044078592, -1112574564, -1127338650, 1007135764) + + W(6, 1018370522, -1107181880, 1058802794, -1085568476) + W(7, 1040869579, 1014113348, 1020799581, 1002965001) + + W(8, 1043495791, -1103617227, 991652540, -1125537591) + W(9, 1021418002, 1022849180, 1033578226, 1032014262) + + W(10, 1013121207, 1016284007, -1148599498, 1039287108) + + W(11, -1113073030, 1022418564, 1011288682, -1116579933); + sum2 = W(0, 1036469548, -1097965159, -1116680345, 1001756270) + + W(1, 1032969412, -1131471357, 1017461301, -1101551098) + + W(2, -1125992347, -1115644020, -1124365977, 1016380025) + + W(3, 1017339130, -1094477168, 1058922542, 1035448965) + W(4, 1040541302, 1001720584, -1095997080, 1035631286) + + W(5, -1103956246, -1105032669, -1112710338, -1115585175) + + W(6, -1099654066, 1054988432, 1040393300, 1039533461) + W(7, 1017600743, 1001178742, -1105423964, 1047389393) + + W(8, 1040203374, -1122662741, -1114085496, 1001141734) + + W(9, -1113359567, 1041958533, -1108890296, -1130070269) + + W(10, -1134082186, 1010209588, -1131580992, 1043362318) + + W(11, 1024609216, 1025676040, 1015920174, -1122393401); + WS(1017525984, 1039916017); + sum1 = + W(0, -1124853567, 1018048624, -1095739637, 1045916039) + W(1, 1035770156, 1019449355, -1147061122, -1127291978) + + W(2, -1104996150, 1043181303, 1038596810, -1118699785) + + W(3, -1129462517, 1049183858, -1085471393, 1054258797) + W(4, 1048116160, 1018729693, -1119594613, 1032566282) + + W(5, -1090223247, 1054999864, 1024906308, -1125493497) + W(6, 999306018, 1036307723, -1104470177, -1108082389) + + W(7, 1035021201, -1111613764, -1156505185, -1150114695) + + W(8, -1105492077, 1055713893, -1114305018, 1013642059) + + W(9, 1012193026, -1116656134, -1109848430, -1134406033) + + W(10, 1014226964, -1117195563, 1010192066, -1111959392) + + W(11, -1107232129, 1049351719, -1132413284, 990662981); + sum2 = + W(0, 1033095635, -1113611213, -1120605005, 1010827478) + W(1, -1096460028, 992544217, -1123818427, 1038354785) + + W(2, 1043017802, 1005632845, -1090567932, 1043858115) + W(3, 1023960168, -1136308834, 1016597499, 1067061797) + + W(4, -1078682340, 1041505996, -1115456886, 1031365710) + + W(5, -1105318511, 1065783254, -1094955795, -1104546945) + + W(6, -1130014725, -1121052824, 1032279133, 1033387493) + + W(7, -1114814318, -1114466677, -1134763238, 1037262635) + + W(8, -1129541437, 1024758296, 994121897, -1115137122) + W(9, 1020936831, -1129095405, 1028982810, -1141733133) + + W(10, -1126300988, 1007094454, 1030713030, 1030934712) + + W(11, 969324748, 973320358, -1148320949, -1122716507); + WS(1033221560, 1063777383); + sum1 = + W(0, 1019126833, -1112638616, 1057738402, -1088696201) + W(1, 1044063732, -1130166589, 1022703059, -1107233655) + + W(2, 1049316970, -1093677291, 1018619290, -1127677637) + + W(3, 1034317754, -1107419652, 1057780266, -1091493000) + + W(4, 1042363102, -1141893947, -1141147507, 1017313945) + + W(5, 1039925560, -1105678958, -1123751101, -1141892011) + + W(6, 1023815261, 1030431247, -1101232178, 1054033952) + W(7, -1103422471, 1028589441, -1145478905, 1043218964) + + W(8, -1097249286, 1050643572, -1099574259, 1032480102) + + W(9, -1139797991, 1030899327, -1105363093, 1039373871) + + W(10, -1109462943, 1000558881, 1017044691, 1042038278) + + W(11, -1097041200, 1044902925, -1143343447, -1115509735); + sum2 = + W(0, -1130982538, -1106875761, 1056618334, 1055977286) + W(1, -1102508839, 1020425242, 1021127838, 1011019608) + + W(2, 1055137831, 1058761027, -1115387544, 1013848532) + W(3, 1013698904, 1024572751, 1048771047, -1103617496) + + W(4, -1128394642, 1016018634, -1227267307, 1039986653) + + W(5, -1073860127, -1072531400, 1043687089, -1112657573) + + W(6, -1180063220, -1113103478, -1108123535, 1052255088) + + W(7, -1126700500, 1035781641, -1130392938, -1104759550) + + W(8, 1059126644, 1063802283, -1109991236, -1125248586) + W(9, -1129014326, 1035543741, 1045481337, 1048895081) + + W(10, 1031917163, -1126407949, 1032270489, -1129087757) + + W(11, 1042704754, 1016319978, -1121934766, 1030839801); + WS(-1091503470, -1126838795); + sum1 = W(0, -1124121237, -1134568843, 1047693172, -1109412515) + + W(1, -1129997061, 1024589216, -1113414670, -1126036384) + + W(2, 1049117760, -1103447906, 1034526751, -1113770234) + + W(3, 1028321829, 1033159265, -1105247938, -1096437464) + + W(4, -1143270742, 1036105485, -1111356688, 1037814911) + + W(5, 1058889082, -1098797565, 1022658271, -1114645460) + + W(6, 1026686479, 1031580097, 1012762455, -1104719461) + + W(7, -1109175079, 1023714995, -1121133649, 1040854417) + + W(8, -1120516448, -1106636212, 1042645116, -1138248951) + + W(9, -1120913068, -1106928812, 1049438209, -1129886751) + + W(10, -1104071908, -1132081196, -1126384695, 1027944427) + + W(11, 1040171928, -1106734009, 1012750451, -1145462266); + sum2 = + W(0, -1121971015, 1025966975, -1127561691, 1032121603) + W(1, -1118316871, -1147835451, -1109269766, 1042653975) + + W(2, 1038662008, -1104797770, 1018661176, 1023052754) + W(3, -1096046215, 1058579369, -1095336395, 1041625968) + + W(4, -1131103951, -1129857431, -1096349825, 1055073186) + + W(5, -1156170871, -1098327149, 1035437895, -1114991229) + + W(6, -1104467071, 1043843774, 1054347264, -1090818470) + W(7, 1042639369, 1011784142, -1105457821, 1043492169) + + W(8, -1116732629, 1028261711, -1115472379, -1157273063) + + W(9, -1114558576, -1138844670, 1043300107, -1117277405) + + W(10, -1115061521, 1024244091, -1113812495, 1035958317) + + W(11, 1025184897, -1130419167, -1130646919, -1148362739); + WS(1065968028, 1020949470); + sum1 = W(0, 1032158503, 1043191673, 1050691771, -1089572661) + W(1, 983294118, 1033006978, 1018701500, 1020082981) + + W(2, 1043953282, -1139338281, 1041437600, -1139648989) + W(3, 1028916776, 999481917, 1047062836, -1091936976) + + W(4, 1042367115, 1033705422, 1031923218, 1033906881) + W(5, 1032996498, -1081715803, 1040306653, -1132542121) + + W(6, -1143490705, -1123072324, 1057457238, -1087112685) + + W(7, 1019100064, -1138694873, 1005807263, 1012896153) + + W(8, 1057445286, -1088032573, -1123572193, 1033839136) + + W(9, 1028568398, 1015001550, 1051530049, -1100585253) + W(10, 1039280729, 1027376729, 1026731038, 1035245559) + + W(11, 1057446979, -1095410205, -1104642968, 1015844228); + sum2 = + W(0, -1107158830, -1098284578, 1059620359, 1059101624) + W(1, -1080819081, 1041045600, -1114179967, 1050997929) + + W(2, -1120628180, -1084072333, 1055292451, 1041809552) + W(3, -1106205598, 1032837846, 1056621385, 1033838752) + + W(4, -1084530179, -1150759871, -1112529879, -1138556160) + + W(5, 1064698181, 1049137220, -1118657190, 1036987884) + W(6, 1036191348, -1103494095, 1049117565, -1100194061) + + W(7, 1035375516, 1040790470, 1045048740, 1033058370) + W(8, -1087565422, -1096659207, 1055648971, -1098721116) + + W(9, -1112261511, -1109765233, 1050635491, 1042760064) + + W(10, -1101810418, 1028926760, 1045813672, 1040601336) + + W(11, -1087363324, -1087988644, 1059720072, -1118399816); + WS(-1079370588, -1069938997); + sum1 = + W(0, -1107111607, 1024046068, 1034755057, -1106911318) + W(1, 1032333322, -1122522177, 1031876694, 1040468568) + + W(2, 1048995971, -1106422470, 1043602212, -1133546645) + + W(3, -1108546779, -1110778478, 1044693184, -1092550445) + + W(4, -1124221431, -1123999146, 1007409349, 1041967908) + + W(5, 1056322870, -1089848952, 1044063648, -1129245296) + W(6, -1119937056, 1037532265, 992363881, -1115839591) + + W(7, -1137125241, -1121719236, -1110402417, 1027170100) + + W(8, -1123931633, -1098485404, 1015794334, 1009488187) + W(9, 1034313646, 1028424065, 1041273350, 1027494176) + + W(10, 1038675968, -1146748727, -1115195974, 1030920188) + + W(11, 1034999584, -1101830589, 1024639630, -1115284904); + sum2 = + W(0, -1116010697, 1044972838, -1107525170, 1025111869) + W(1, -1115770744, 1027404867, 1039856206, -1094195694) + + W(2, 1054041965, -1105218154, 1021276689, -1122132060) + W(3, 1025692273, 1041658757, -1095593913, 1047241736) + + W(4, -1113081166, 1036997767, 1047723216, -1090167008) + + W(5, 1054432792, -1103340827, 1030984707, -1109230755) + + W(6, 1054500142, -1087657974, 1048962216, -1105033641) + W(7, 1026520309, 1000189578, 1045538686, -1114739465) + + W(8, -1099510609, 1043141319, 1008623973, 949401483) + W(9, 1020883249, -1103808398, 1041852115, -1104502432) + + W(10, 1031142833, -1121181330, 1037455508, 1025495534) + + W(11, -1112321007, 1020729805, 1034321699, 989367833); + WS(1051966318, -1113875142); + sum1 = + W(0, 1035883793, 1040145278, 1051696565, -1091560996) + W(1, -1133003627, -1126824689, -1111332346, -1135399329) + + W(2, 1051177307, -1096861164, -1117751383, 1039745286) + W(3, 1045917727, 1017502534, 1054251573, -1091248610) + + W(4, -1178468754, 1020593891, 1006041029, -1096989371) + + W(5, 1061428120, -1087158964, -1126263439, 1008594943) + + W(6, -1129901007, 1043615094, 1037934795, -1098884432) + W(7, -1106662601, 1037849734, 1042663274, 1025318012) + + W(8, 1050890887, -1096301045, 1017933485, 1035118155) + + W(9, -1119690564, -1113005508, 1046007992, -1093706893) + + W(10, 1038615540, -1114145271, 1014471632, 1043398529) + + W(11, 1049249377, -1093100168, -1116546293, 1028529816); + sum2 = + W(0, -1120038729, 995641288, 1035481768, 1011267102) + W(1, 1042749492, 1026093812, 1032134121, 1034430176) + + W(2, -1099098436, -1099374838, 1055985885, -1113501317) + W(3, -1112337284, 1011533369, 960227969, 1055781369) + + W(4, 1067101038, -1095011910, 1014623636, 1032554184) + W(5, -1122840036, 1046041384, 1069533386, -1086401299) + + W(6, 1015804972, -1114631943, -1123247827, 1055178264) + + W(7, 1065618150, -1079450114, -1111055788, 1037430467) + + W(8, -1115890560, -1124103196, 1058921177, -1075689828) + W(9, 1025605092, 1022278663, 1022436109, 1039303021) + + W(10, -1106092627, -1082339747, -1118260382, 1020696197) + + W(11, 1010081074, -1116158530, -1118372702, -1095588850); + WS(-1087762743, -1114043214); + sum1 = + W(0, 1028903325, 1040067739, 1045936105, -1095653187) + W(1, -1122706133, 1029496147, -1111481047, 981566559) + + W(2, 1050679259, -1096161947, 1026181394, -1149217596) + W(3, 1010874850, 1032756947, 1052053924, -1090950614) + + W(4, 1034645023, -1132850610, -1117223539, -1130847267) + + W(5, 1055533279, -1084280212, 1030922562, -1154701224) + + W(6, -1114811697, -1123313460, 1059392176, -1097768267) + + W(7, 1030340896, -1113406339, 1027957028, -1113871531) + W(8, 1053658934, 1005713692, -1102292436, 1020850850) + + W(9, -1115120063, -1126050567, 1039338221, -1120312930) + + W(10, -1107839810, 1017761874, 1025677743, -1113266015) + + W(11, 1051823712, -1118568631, -1112577800, -1117302546); + sum2 = + W(0, 1001016005, -1150454109, 1001531747, 983352173) + W(1, -1106746798, -1157019725, -1125241033, -1111980552) + + W(2, 1031575403, -1103460210, 1036252996, 1023495862) + W(3, 1018218852, 1033028659, 1016765132, -1103428024) + + W(4, -1128273041, 1033057508, -1111720092, 1037513337) + + W(5, -1085543392, -1076627395, 1046375720, -1112606370) + + W(6, 1015413875, -1109924763, 1053354837, 1074369634) + W(7, 1055587240, 1019967806, -1140722987, -1144232926) + + W(8, 1054900052, 1051272122, -1094917738, -1107285947) + + W(9, -1138333196, -1117260807, 1041131548, -1098379064) + + W(10, -1106193524, 1012881631, 1010568725, -1113652225) + + W(11, 1045881209, -1098914955, -1098562564, 1031041657); + WS(-1090517687, -1095444575); + sum1 = + W(0, 1025742446, 1032739299, 1054789967, -1095546301) + W(1, 1033023507, 1028563508, -1111454559, -1106175885) + + W(2, 1031326631, -1101847659, -1107099097, -1117676152) + + W(3, 1040962578, -1110724347, 1052551894, -1090925684) + W(4, 1036045063, 1036888990, 1035513890, -1118213794) + + W(5, 1059778428, -1089262225, 1035395209, 1007580971) + W(6, 1025779251, -1103218657, 1045793474, -1096439373) + + W(7, -1101529212, 949923192, 1041617005, 1040368314) + W(8, 1051667296, -1099734269, 1050132438, 1037985265) + + W(9, -1106922364, -1105137317, 1040121301, -1104705805) + + W(10, -1102593253, -1113513373, 1024699903, 1024907982) + + W(11, 1052247674, -1097282993, 1016797696, 1026673059); + sum2 = + W(0, 1052208474, -1095438834, 1040952518, -1101013864) + W(1, 1045777263, -1125550479, 1035064858, -1104348375) + + W(2, -1095663473, 1048824145, -1099869349, -1127115193) + + W(3, 1064043431, -1079843968, 1060639651, -1097227129) + W(4, 1049789703, 1024044553, 1055780907, -1084432555) + + W(5, 1054823629, -1105218176, -1118379111, 972648308) + W(6, 1048070172, -1106077690, -1098542607, 1048082838) + + W(7, -1102784042, 1021849499, 1057138231, -1086965748) + W(8, 1057295667, -1106201667, 1043327775, 1016298873) + + W(9, -1100953655, 1048708391, -1095587456, 1042233875) + + W(10, -1107731485, -1116706874, 1042120650, -1106942577) + + W(11, 1035260440, -1136871967, 1006771796, 1030896448); + WS(-1115614648, 1042425791); + sum1 = W(0, -1120207204, -1115327070, -1093340989, 1053481388) + + W(1, 1030984860, -1113874973, -1124027509, 1016926292) + + W(2, -1096731140, 1053311332, -1116407641, 1010793530) + + W(3, -1144413692, 1038910502, -1096554678, 1057006919) + + W(4, 1038600290, -1116271283, -1105701711, 1037845356) + + W(5, -1085064420, 1049566369, 1043585442, -1114795809) + + W(6, 1014568102, 1042236823, -1100005974, 1056376458) + W(7, 1018535375, 992031960, -1120774251, -1105850383) + + W(8, -1098496607, 1048579325, -1122768840, -1130485552) + + W(9, 1029691462, -1134596907, -1135406214, 1042582346) + + W(10, -1120431498, 1029193328, -1119274774, -1117126533) + + W(11, -1098152617, 1043887136, 1035562443, -1140222054); + sum2 = W(0, -1127240204, -1079712608, 1066527571, 1049757184) + + W(1, -1122509441, -1120167031, 1024332524, -1082891577) + + W(2, 1063276166, 1025750476, -1127423195, 976948665) + W(3, -1145474239, -1081879450, 1065092416, 1045572932) + + W(4, -1127801782, -1123809997, -1111478947, 1047818786) + + W(5, 1033988518, -1093152038, -1126799575, 1030959654) + + W(6, 1029335642, 1066272635, -1081647719, -1129453741) + W(7, 1033523902, 995040830, -1112394176, 1064292926) + + W(8, -1085935960, -1107360776, -1109456127, 1026103880) + + W(9, 1042612281, 1048742105, -1090025738, 1042389166) + + W(10, 1029374360, -1116538748, -1152251822, 1063028070) + + W(11, -1088819358, -1095668919, -1163717821, 1033003323); + WS(1005558656, -1134386388); + + return clamp(mstd0 + 5.0 * vsum / wsum * mstd1, 0.0, 1.0); +} + +shared float inp[507]; + +#define CURRENT_PASS 1 + +#define GET_SAMPLE(x) dot(x.rgb, rgb2y) +#define imageStore(out_image, pos, val) imageStoreOverride(pos, val.x) +void imageStoreOverride(uint2 pos, float value) { temp[pos] = (value); } + +#define INPUT_tex(pos) GET_SAMPLE(vec4(texture(INPUT, pos))) +static const float2 INPUT_size = float2(GetInputSize()); +static const float2 INPUT_pt = float2(GetInputPt()); + +#define HOOKED_tex(pos) INPUT_tex(pos) +#define HOOKED_size INPUT_size +#define HOOKED_pt INPUT_pt + +void Pass1(uint2 blockStart, uint3 threadId) { + ivec2 group_base = ivec2(gl_WorkGroupID) * ivec2(gl_WorkGroupSize); + int local_pos = int(gl_LocalInvocationID.x) * 13 + int(gl_LocalInvocationID.y); + for (int id = int(gl_LocalInvocationIndex); id < 507; id += int(gl_WorkGroupSize.x * gl_WorkGroupSize.y)) { + uint x = (uint)id / 13, y = (uint)id % 13; + inp[id] = + HOOKED_tex(HOOKED_pt * vec2(float(group_base.x + x - (3)) + 0.5, float(group_base.y + y - (2)) + 0.5)).x; + } + barrier(); + vec4 ret = vec4(0.0, 0.0, 0.0, 0.0); + vec4 ret0 = vec4(0.0, 0.0, 0.0, 0.0); + vec4 samples[12]; + samples[0][0] = inp[local_pos + 0]; + samples[0][1] = inp[local_pos + 1]; + samples[0][2] = inp[local_pos + 2]; + samples[0][3] = inp[local_pos + 3]; + samples[1][0] = inp[local_pos + 4]; + samples[1][1] = inp[local_pos + 5]; + samples[1][2] = inp[local_pos + 13]; + samples[1][3] = inp[local_pos + 14]; + samples[2][0] = inp[local_pos + 15]; + samples[2][1] = inp[local_pos + 16]; + samples[2][2] = inp[local_pos + 17]; + samples[2][3] = inp[local_pos + 18]; + samples[3][0] = inp[local_pos + 26]; + samples[3][1] = inp[local_pos + 27]; + samples[3][2] = inp[local_pos + 28]; + samples[3][3] = inp[local_pos + 29]; + samples[4][0] = inp[local_pos + 30]; + samples[4][1] = inp[local_pos + 31]; + samples[4][2] = inp[local_pos + 39]; + samples[4][3] = inp[local_pos + 40]; + samples[5][0] = inp[local_pos + 41]; + samples[5][1] = inp[local_pos + 42]; + samples[5][2] = inp[local_pos + 43]; + samples[5][3] = inp[local_pos + 44]; + samples[6][0] = inp[local_pos + 52]; + samples[6][1] = inp[local_pos + 53]; + samples[6][2] = inp[local_pos + 54]; + samples[6][3] = inp[local_pos + 55]; + samples[7][0] = inp[local_pos + 56]; + samples[7][1] = inp[local_pos + 57]; + samples[7][2] = inp[local_pos + 65]; + samples[7][3] = inp[local_pos + 66]; + samples[8][0] = inp[local_pos + 67]; + samples[8][1] = inp[local_pos + 68]; + samples[8][2] = inp[local_pos + 69]; + samples[8][3] = inp[local_pos + 70]; + samples[9][0] = inp[local_pos + 78]; + samples[9][1] = inp[local_pos + 79]; + samples[9][2] = inp[local_pos + 80]; + samples[9][3] = inp[local_pos + 81]; + samples[10][0] = inp[local_pos + 82]; + samples[10][1] = inp[local_pos + 83]; + samples[10][2] = inp[local_pos + 91]; + samples[10][3] = inp[local_pos + 92]; + samples[11][0] = inp[local_pos + 93]; + samples[11][1] = inp[local_pos + 94]; + samples[11][2] = inp[local_pos + 95]; + samples[11][3] = inp[local_pos + 96]; + ret[0] = nnedi3(samples); + ret0[0] = inp[local_pos + 41]; +#if CURRENT_PASS == LAST_PASS + uint2 destPos = blockStart + threadId.xy * 2; + uint2 outputSize = GetOutputSize(); + if (destPos.x >= outputSize.x || destPos.y >= outputSize.y) { + return; + } +#endif + imageStore(out_image, ivec2(gl_GlobalInvocationID) * ivec2(1, 2), ret0); + imageStore(out_image, ivec2(gl_GlobalInvocationID) * ivec2(1, 2) + ivec2(0, 1), ret); +} +//!PASS 2 +//!DESC NNEDI3 (double_x, nns128, win8x6) +//!IN INPUT, temp +//!OUT OUTPUT +//!BLOCK_SIZE 64, 8 +//!NUM_THREADS 32, 8 +#pragma optionNV(inline none) +float nnedi3(vec4 samples[12]) { + float sum = 0.0, sumsq = 0.0; + [unroll] for (int i = 0; i < 12; i++) { + sum += dot(samples[i], vec4(1.0, 1.0, 1.0, 1.0)); + sumsq += dot(samples[i], samples[i]); + } + float mstd0 = sum / 48.0; + float mstd1 = sumsq / 48.0 - mstd0 * mstd0; + float mstd2 = mix(0.0, inversesqrt(mstd1), mstd1 >= 1.192092896e-7); + mstd1 *= mstd2; + float vsum = 0.0, wsum = 0.0, sum1, sum2; +#define T(x) intBitsToFloat(x) +#define W(i, w0, w1, w2, w3) dot(samples[i], vec4(T(w0), T(w1), T(w2), T(w3))) +#define WS(w0, w1) \ + sum1 = exp(sum1 * mstd2 + T(w0)); \ + sum2 = sum2 * mstd2 + T(w1); \ + wsum += sum1; \ + vsum += sum1 * (sum2 / (1.0 + abs(sum2))); + sum1 = W(0, -1138315554, -1151849881, -1130100551, -1139428474) + + W(1, -1115186183, 1024054031, -1123693866, -1134121575) + + W(2, 1017020226, -1120184142, -1113913797, -1137890034) + + W(3, -1105019328, 1030136834, -1119041199, 1009291685) + W(4, 1054031418, 1052033568, 1057266643, 1050615732) + + W(5, 1060278709, 1051842684, 1049323809, 1050624038) + + W(6, -1098719688, -1094289569, -1094215666, -1084764287) + + W(7, -1093503073, -1122358095, -1104408867, -1101060057) + + W(8, -1110814528, 1026313661, -1136459684, 1037955767) + + W(9, -1125342359, -1118592012, -1141919603, -1117980571) + + W(10, -1144117236, 1029415347, -1122295896, -1158862002) + + W(11, -1115484761, 1027215228, -1148196514, -1131405947); + sum2 = + W(0, 1011608699, 1021515189, -1133688887, -1109181339) + W(1, 1032724543, -1120491130, 997621755, 1020760181) + + W(2, -1112090344, 1032910614, -1111235489, 1050015381) + + W(3, 1041065097, -1106592726, -1112521193, 1032648390) + W(4, 1035039469, -1112298310, 1068933685, 1079505355) + + W(5, -1082386736, -1067816278, -1094139890, -1123411157) + + W(6, 1018826733, -1103038162, 1035541017, -1096237270) + + W(7, 1051919390, -1101133158, -1120644044, 1029904493) + W(8, -1130070276, 1030536589, 1002846254, 1047170650) + + W(9, 1012706615, -1108914015, 1011888367, -1115273665) + + W(10, -1126912052, 1027816837, -1119314146, -1132054353) + + W(11, 1004049262, 1017068057, 1020965593, 1017829425); + WS(1038714296, 1044827315); + sum1 = W(0, 1008773074, 1000000044, -1125197471, -1155069097) + + W(1, -1128457331, -1147450330, -1142834606, -1131672268) + + W(2, -1137155124, -1139148008, -1110040196, -1114984084) + + W(3, -1117135435, 1038803511, -1110360429, 1046900069) + W(4, 1058392080, 1051571686, 1058043460, 1059856605) + + W(5, 1053821137, 1050763009, 1046500044, 1049636107) + + W(6, -1100726684, -1106613964, -1093356205, -1087655353) + + W(7, -1093486798, -1088451200, -1109846237, -1093848946) + + W(8, -1097060854, 1034039029, -1112523275, -1137125990) + + W(9, -1134047198, -1131894321, 1021083253, -1108292068) + + W(10, 1034472653, -1136883834, 1033872898, -1122772178) + + W(11, -1125370043, 1027534056, -1126166913, 1020331091); + sum2 = + W(0, -1123255245, 982126402, 1020504368, 1036976721) + W(1, -1113656730, -1157600449, -1129338356, 1032297389) + + W(2, -1116671780, -1111301077, 1011773496, -1102830064) + W(3, 1031803093, 1045043848, 1026389126, 1022832316) + + W(4, 1046375724, 1053914306, 1013495848, -1106352300) + + W(5, -1103067006, -1094946683, 1036977493, -1098417421) + W(6, 1061532718, 1066141278, 1064263836, 1055449836) + + W(7, -1076699072, -1085904680, -1099822488, -1092845936) + + W(8, 998291536, 1041257894, 1023442398, -1101238723) + W(9, -1103198508, 1048924521, -1109968297, 1053328593) + + W(10, -1094346395, -1108898352, 1023084860, 1037821947) + + W(11, -1123876988, 1041381351, -1109391389, 1023206676); + WS(-1087781687, -1134030789); + sum1 = W(0, 1028179002, 1037437606, -1106850597, 1040743460) + + W(1, -1123964671, -1122790273, 1036030878, 1027799500) + + W(2, -1113846601, -1129634048, 1045066941, -1108576055) + + W(3, 1030205873, -1117192467, 1027547489, -1110675758) + + W(4, -1090428884, -1098510574, -1095161561, -1094444002) + + W(5, -1095134094, -1098192922, -1101066654, -1095206484) + + W(6, 1056064759, 1049319247, 1048732210, 1054487227) + W(7, 1044300425, 1055338520, 1034894336, 1053272331) + + W(8, -1116809458, -1105760812, 1007721067, 1050640540) + + W(9, 1040160031, -1106372902, -1109703824, -1138309939) + + W(10, -1123784128, 1016685513, -1105661778, 1048222150) + + W(11, -1110013906, 1033480951, -1112122819, 1033810456); + sum2 = W(0, 1023697539, -1134698244, 1018187921, 1024534132) + + W(1, -1145140771, -1142625275, -1141296989, 1007645751) + + W(2, -1119401943, 1013558867, -1119659280, 1038666215) + + W(3, -1120396841, 1035154544, -1131590401, 1021197862) + + W(4, 1010071413, -1112961274, 1019163177, -1097296472) + + W(5, 1033089456, -1105855221, -1156341795, -1120357988) + + W(6, 1025267901, 1033970227, 1048742053, 1082848284) + W(7, 1060700209, -1115995862, 1035612397, -1123714371) + + W(8, 988018625, -1116217767, -1103390691, -1064739318) + + W(9, -1086947071, 1042818438, -1109434149, 1029308077) + + W(10, -1122026299, 1005039212, -1115786374, 1042066180) + + W(11, 1017803659, -1115628759, -1150181080, 1011442501); + WS(1060770743, -1108197568); + sum1 = W(0, 1016886775, -1160198547, 1015246637, -1139668038) + + W(1, 1034731136, 1019206597, -1123983389, -1115649126) + W(2, 1029069588, 1038531041, 1041390628, 1022402527) + + W(3, -1103954605, -1112398730, -1117714338, 1039312430) + + W(4, -1095627128, -1096395039, -1086831062, 1057717017) + + W(5, 1056693263, 1053908426, 1043180606, 1038174992) + W(6, 1046558478, 1048524254, 1058409012, 1050284011) + + W(7, -1083755424, -1092005688, -1101033824, -1131529899) + + W(8, -1146067869, -1097778094, -1098986327, -1110221104) + + W(9, 1042951984, 1037994808, 1025216609, 1000398449) + W(10, 1009558662, 1033422755, 1033638277, 1029754521) + + W(11, -1119102757, -1130383710, -1114155844, -1129441697); + sum2 = W(0, -1104188915, 1026676440, -1122447814, 1024214572) + + W(1, 1036156927, 1039804037, -1140508998, 1023379743) + + W(2, 1041755532, -1099902739, 1020538503, -1096783078) + + W(3, -1094671115, -1096595186, -1108992818, 1023478108) + + W(4, 1039915367, 1048552390, -1105911641, 1068731351) + + W(5, -1096057439, -1091471401, 1033306823, -1096750685) + + W(6, 1028942726, -1105392496, -1106738713, 1066518668) + + W(7, -1122053390, -1123632409, 1032650381, -1109607147) + + W(8, 1030445090, -1104867005, -1106850996, -1126700225) + + W(9, 1025639958, -1113480650, -1115144981, 1031767054) + + W(10, -1104654601, 1033528857, 989961401, -1133955554) + + W(11, -1153726297, 1032072745, -1128986161, 1023561226); + WS(-1105940700, 1068951582); + sum1 = + W(0, 1000087558, 1035444041, 1016288952, 1033866603) + W(1, 1023501510, 1030903912, -1121882082, -1139243976) + + W(2, -1126610867, -1119652358, -1105308514, 1025089333) + + W(3, -1101500686, 1024487034, 1036868116, -1137536646) + W(4, 1040363554, 1048983991, -1129232537, 1043404182) + + W(5, 1050470779, 1032787659, 1042688239, 1051055933) + W(6, -1103531583, -1095183320, 1035540828, -1091977028) + + W(7, -1098956255, 1016827662, -1107477027, -1111432589) + + W(8, -1126498674, 1041424541, -1116171169, -1108874003) + + W(9, -1107291841, -1115835365, 1038297635, -1101253029) + + W(10, 1033586531, 1011542187, 1018737568, 1021129404) + W(11, 1033496245, 1023594100, 1015384473, 1034920923); + sum2 = W(0, -1123978268, -1122059260, -1123592170, 1036141312) + + W(1, -1111710804, -1127043568, 1040694361, -1120657957) + + W(2, -1102554320, 1044079872, -1093658955, -1094337979) + + W(3, 1045282706, -1139302445, 983065168, -1105233712) + W(4, 1043643239, -1111536011, 1042723115, 1067907418) + + W(5, -1118927202, 1035940631, 1016057395, 1027935282) + W(6, 1026913323, 1056944699, -1093217948, 1064662115) + + W(7, -1091166584, -1092135065, 1041761864, -1104693620) + + W(8, 1031431539, 1037617295, -1103624535, -1090550375) + + W(9, -1119161360, -1112133073, 1014979737, -1106943303) + + W(10, -1112242992, 1005844362, -1101249260, 1042545272) + + W(11, -1111294278, 1025042022, 1026789959, -1114223884); + WS(1061289911, -1074625008); + sum1 = + W(0, -1118986355, 1042690449, 1022020251, 1032007652) + W(1, 1040686510, -1108674269, -1123719572, 1033202498) + + W(2, 1035013222, -1110099132, 1048074309, -1101544522) + + W(3, -1102744618, 1043103143, -1099009366, 1038471242) + W(4, 1058027688, 1047068971, 1036127926, 1058005973) + + W(5, 1048070472, 1057593649, 1043345580, 1055515931) + W(6, -1087592511, 1013931199, -1088015817, -1099315493) + + W(7, -1091144488, -1088950448, 1033106140, -1090129177) + + W(8, -1107213995, 1008030621, 1042727509, -1093058723) + + W(9, 1042938237, 1002612916, -1110941900, -1113377491) + + W(10, 1048036382, -1106703359, 1044183504, 1029001296) + + W(11, -1106075703, 1048869669, -1107279296, 1042195418); + sum2 = + W(0, 1034897388, -1104469346, -1104312342, 1033162274) + W(1, 1001538203, -1119055011, 1036889309, -1122390571) + + W(2, 1047600068, 1074182899, 1080728354, 1077196082) + W(3, 1039546617, -1121476275, -1113609974, -1124909535) + + W(4, -1092005485, -1074957140, -1067981267, -1071410100) + + W(5, -1101189403, 1042351425, -1113906708, 1037135096) + + W(6, 1032211690, -1124075063, -1100127529, -1093339345) + W(7, 1036352485, 1008083901, 1032631324, 1002134635) + + W(8, 1046053217, 981988140, 1036844207, 1030504779) + W(9, 1025223671, -1101604075, 1034478190, -1113103836) + + W(10, -1111289614, 990179414, -1123826485, -1109598746) + + W(11, 1036519612, -1146561467, 1017678167, -1132393287); + WS(-1106894556, 1030995446); + sum1 = W(0, 1025589699, -1123387156, 1028556318, -1139656804) + + W(1, 980812294, -1128131860, -1137342353, 1017797929) + + W(2, 1033805806, 1025291593, -1127599047, -1105750398) + + W(3, -1104274718, -1117867836, 1018769427, -1114245906) + + W(4, 1034528997, 1054610112, 1039781117, 1065523109) + W(5, 1054896451, 1045458038, 1040199808, 1047692618) + + W(6, -1098701288, -1096105008, -1091536615, -1090836572) + + W(7, -1097995702, 1039238949, -1110811780, 1001735913) + + W(8, -1119393787, 1037953340, -1120434724, -1103173850) + + W(9, -1111869411, -1104116474, -1129786002, -1106977725) + + W(10, 1027839817, -1123546765, 1027349522, 1022652480) + + W(11, -1135075504, -1125284461, -1152753902, -1131064048); + sum2 = + W(0, 1030581609, -1110091164, 1024868796, -1124528958) + W(1, -1175372351, 1022252519, -1123141270, -1123316826) + + W(2, -1096073996, -1132437108, 1051933742, 1042406776) + + W(3, -1117745155, -1117509823, -1110977956, 1029056744) + + W(4, -1104952058, 1031847146, 1077840619, -1071401906) + + W(5, -1108532142, -1107574374, 1034777920, 1034383482) + W(6, 1036583621, 1040176294, 1056082302, -1080138625) + + W(7, 1039833458, 1041695761, -1119756119, 977900031) + W(8, 1006888722, -1120421639, -1114613612, 1012484405) + + W(9, 1044393926, -1112420268, 1028893644, 1027961212) + + W(10, 1023568502, -1124563800, 1026684617, -1114165836) + + W(11, -1139194300, 1023135287, -1122696127, 1034470668); + WS(-1094248046, 1034739186); + sum1 = W(0, -1121641997, -1148807918, -1119896808, -1118546659) + + W(1, -1117202258, 1027770003, -1121511758, -1114510703) + + W(2, 1043421097, -1114752489, 1040593858, 1043491504) + W(3, 1033892386, 1035924243, 1032482905, 1031829015) + + W(4, -1090462057, -1097763033, -1089339622, -1089142502) + + W(5, -1089696734, -1098379668, -1096843609, -1089945727) + + W(6, 1057979744, 1045790578, 1054873978, 1054724534) + W(7, 1056858543, 1046524773, 1049846778, 1056083605) + + W(8, 1042504017, -1105205440, 1029920941, -1114903193) + + W(9, -1102740772, 1042806872, -1103488653, 1031492831) + + W(10, 1019430629, -1115505835, 1008619887, 1038945077) + + W(11, 1025474934, -1148381698, 1017864241, 1029503362); + sum2 = W(0, 1032629114, 1024571549, -1123705993, -1120833813) + + W(1, 1031286487, -1113289848, 1033808184, 1035572024) + + W(2, -1111104155, 1022922994, 1036988882, -1104365480) + + W(3, 1038064580, -1119955010, 1018164430, -1144675449) + + W(4, -1111175727, 1047799465, -1121840686, -1098359864) + + W(5, 1008715668, -1115327032, 1042276675, -1114533548) + W(6, 1069180600, 1065968459, 1066031139, 1064223912) + + W(7, 1062275672, 1060225053, 1060364945, 1057151625) + W(8, -1092657949, -1106624299, 1026540087, 1044325339) + + W(9, 1048614780, -1117772151, -1105153406, -1103516228) + + W(10, -1081878912, -1085703668, -1080884055, -1079207816) + + W(11, -1083548865, -1085294305, -1090372695, -1100806033); + WS(-1095016302, 1049780935); + sum1 = + W(0, -1140214663, 1008440267, -1137823987, 1035221148) + W(1, 1007510683, 1029727784, -1142229143, 1025812851) + + W(2, 1050711943, -1110792724, 1036012635, -1104496021) + + W(3, -1145733059, -1109552317, -1115585956, -1142816275) + + W(4, 1044505338, 1051364259, 1051977632, 1058946996) + W(5, 1056967247, 1057598839, 1050931556, 1058283380) + + W(6, -1092537964, -1101785640, -1091742968, -1090015552) + + W(7, -1090979415, -1088424934, -1096995861, -1095074239) + + W(8, -1110639373, 1026645590, -1130979716, -1106527650) + + W(9, -1146016549, 1015167915, 1009720606, -1105047309) + W(10, 1025322472, 1024485132, 1018037601, 1032762847) + + W(11, 1010918699, 1027572437, -1127055707, 1011865435); + sum2 = + W(0, 1040969494, 1036141535, -1136101349, 1015318832) + W(1, -1112220931, -1111621316, 1042180910, -1115487487) + + W(2, -1087779211, 1033693595, -1096934819, 1042126031) + W(3, 1036377831, 1046621966, -1129542795, 1052735842) + + W(4, 1056604611, -1095617275, 1057610078, 1059711341) + + W(5, -1098744628, -1088974739, -1112239718, -1089093989) + + W(6, 1059045592, 1037950807, 1059474718, 1079595174) + W(7, 1065421414, -1079659864, -1077353318, -1076641223) + + W(8, -1085730308, 1051875566, -1104408796, 1011257519) + + W(9, -1102027272, -1097874228, -1123714793, -1089345613) + + W(10, 1035668628, -1110274633, -1106464684, -1106179801) + + W(11, 1035078820, 1045400280, -1122902412, 1057832501); + WS(-1081166556, -1096725839); + sum1 = + W(0, -1146977357, -1130642485, 1032268722, -1111253552) + W(1, 1024786511, 1021187873, -1115200917, 1021141494) + + W(2, -1114510289, -1119269199, 1038356317, -1095921640) + + W(3, 1038758688, -1102108905, -1117501552, 1024092394) + W(4, 1050030946, 1045921361, 1039889859, 1057711094) + + W(5, 1053078718, 1045805544, 1042557010, 1052716334) + W(6, -1102646113, -1098664649, 1027769520, -1089074675) + + W(7, -1098156409, -1106011300, -1102728052, -1107570834) + + W(8, -1113153825, 992772066, 1041426283, -1107182252) + + W(9, 1043642083, -1131324475, -1148235644, -1153593794) + + W(10, -1114582784, 1022415207, 1025422681, -1098886685) + + W(11, 1036466489, -1129952762, -1133449046, 1012650491); + sum2 = + W(0, -1154116071, -1120032365, 1033357218, -1132933754) + W(1, -1165588207, 1029048100, -1115144648, 1020455541) + + W(2, 1032309947, 1017679770, -1118521489, 1020082264) + W(3, -1122971142, 1015972752, 1021714009, -1134334294) + + W(4, -1123962703, 1025906643, 1007375557, -1114291801) + + W(5, -1114360955, 1031540723, -1136421576, 1014310369) + + W(6, -1133231158, -1134787122, -1096414395, 1064675801) + + W(7, -1097709607, 1040110606, -1121524587, -1119507729) + + W(8, -1128886461, -1108727038, 1020492423, -1080568363) + + W(9, -1108104258, -1112615988, -1111963053, 1028363593) + + W(10, 1035599863, 1039832482, 1035524914, 1059399952) + + W(11, 1040378905, 1024318985, 1036458899, -1122706022); + WS(1058284215, -1100256461); + sum1 = W(0, -1136333391, 977549609, 1023954799, 1032458293) + W(1, -1131855793, -1132003829, 1014651348, 1007647892) + + W(2, 1042064203, 1017583666, -1103445177, 1003134525) + W(3, 1030077610, 1044505715, 1034368605, -1109681210) + + W(4, 1048792691, 1037147366, 1061193316, 1055543997) + + W(5, -1089393894, -1102389770, -1126089633, 1030932473) + + W(6, -1108621703, -1098054746, -1084539629, -1105743629) + + W(7, 1061657482, -1111653453, 1032593324, -1134741175) + + W(8, -1107171315, 1036542212, 1001865121, -1113492892) + + W(9, -1095280499, 1000070140, -1124982771, 1012906393) + + W(10, 1009105958, -1118222526, 1005641493, 1001049989) + + W(11, -1141919717, 1031530183, 957669220, -1123915241); + sum2 = W(0, 1025749667, -1112523495, 1034709000, 1021531102) + + W(1, -1129693762, 1006685387, -1119027428, -1106459716) + + W(2, 1018718450, 1033569638, -1099586256, -1096388774) + + W(3, -1109846828, -1112379914, 1008781387, 1045287677) + + W(4, -1104497483, -1111912018, -1087345020, 1061077725) + + W(5, 1049253485, -1117456886, 1038233914, -1135366091) + + W(6, -1109821356, 1026676021, -1092985416, 1065372034) + + W(7, 1048850468, -1106255761, 1013968523, -1138431127) + + W(8, 1032840840, -1114119398, 1018773778, -1129773592) + + W(9, -1101038787, 1043058397, -1113511705, 1037121278) + + W(10, 1009497507, 1017944258, 1033599708, -1109427758) + + W(11, 1029395381, -1106769492, 1020319838, -1113647178); + WS(1048665454, 1062854025); + sum1 = + W(0, 1004974300, 1032679478, 1041394910, 1026224498) + W(1, -1128844481, -1137588617, -1115578718, -1128306202) + + W(2, -1140401360, -1099989608, -1108003052, -1103518244) + + W(3, 1044968661, 1040271757, 1031459778, -1114933822) + W(4, 1040482153, 1038119146, 1050737065, 1054936910) + + W(5, -1084409495, -1099872844, -1107158134, 1038726400) + + W(6, -1107105990, -1094089019, -1084721726, 1054691719) + W(7, 1057517320, 1035416977, 1033669936, 1032390235) + + W(8, -1113947114, 1043046180, 1044891839, 1025601857) + W(9, 1022006333, 1017193535, 1025595521, 1023203548) + + W(10, 1004764812, -1132148363, 1022372181, -1113753404) + + W(11, 1033354242, -1131287582, -1112957780, 1012659010); + sum2 = + W(0, -1120028750, -1137390044, 1031876652, -1112211314) + W(1, 1041988042, -1105672202, 1032816067, -1122489809) + + W(2, -1116919239, 1034599590, -1110926857, 1037510574) + + W(3, -1091078601, 1052042083, -1102117757, 1043447553) + + W(4, 1026537129, -1105861815, -1114848017, 1054207178) + + W(5, 1059021754, -1104155840, 1047757772, -1115066040) + + W(6, 1032246372, -1095438265, -1093245727, 1062401065) + + W(7, -1115099719, -1100501338, -1112097107, -1102195598) + + W(8, 1047938064, 1022176478, -1093210017, -1118385188) + W(9, -1104427658, 1013766280, 1027075631, 1027463789) + + W(10, -1102851233, -1129352893, 1046245506, -1106645860) + + W(11, 1043294706, 1016480352, -1113418727, 1030659187); + WS(1046819548, -1112403026); + sum1 = + W(0, 1043575156, -1118831073, 1028002987, 1025124390) + W(1, 1023377962, 1034880715, -1125071779, -1144027915) + + W(2, -1096536373, 1040283909, 1049135339, -1115136450) + + W(3, -1127238030, 1042113706, -1124049974, 1045174012) + W(4, 1028458839, 1047473762, -1083606160, 1052252597) + + W(5, 1054448495, -1106041242, 1031800519, -1138801364) + W(6, 1042563315, -1108795847, 1040849058, 1045384892) + + W(7, -1081137782, 1040945110, 1026387221, -1122981994) + + W(8, -1147631681, -1115473730, 1015994849, -1102431101) + + W(9, 1046487189, 1026652836, -1096718751, 1030118403) + + W(10, -1134760216, 1037371629, 1036578576, -1147407721) + + W(11, 1029054905, -1113175874, 1032040846, -1121286085); + sum2 = + W(0, -1116472244, 1025044698, -1123391126, 1003069456) + W(1, -1129719684, -1110477199, 1023677849, 989635105) + + W(2, 1036928405, -1122373594, -1111538981, -1111848203) + + W(3, 1027481573, 990411281, -1136822924, -1136314996) + W(4, 1035706238, 1040619830, 1046111644, 1044878634) + + W(5, 1017226015, 1030695866, -1114454329, 1007553654) + W(6, -1121318128, -1104861162, 1038958235, 1050016986) + + W(7, 1040124875, -1116142138, -1113301330, -1112411005) + + W(8, -1114868876, 1034962287, 1034772140, -1113883437) + + W(9, -1114732111, -1102609372, 1029458562, -1109652887) + + W(10, 1033058067, -1110745183, -1130393948, 1005454840) + + W(11, -1105702279, 1029172520, -1112847239, -1150621057); + WS(1054158702, -1098491196); + sum1 = W(0, -1129450472, 983582877, -1121209423, -1121678922) + + W(1, 1031290553, -1119715259, 1032360987, -1115265987) + + W(2, -1119237644, 1026235385, 1037197666, 1031464488) + + W(3, -1099798307, -1102325483, -1107157175, 1036899466) + + W(4, -1101713087, -1098493798, -1083899440, -1103778771) + + W(5, 1057005120, 1046824098, 1037130136, 1011053924) + W(6, 1033589815, 1048228620, 1060260620, 1056756834) + + W(7, -1093716116, -1102446942, -1111054172, -1132207900) + + W(8, 1034513750, -1123359016, -1103037013, -1122982297) + W(9, 1049393023, 1028221304, 1041637742, 992781927) + + W(10, 1023147092, -1173092218, 1035595873, 1020058530) + + W(11, -1117980637, -1124996559, -1115548960, 995105423); + sum2 = + W(0, 1022318336, -1115650269, 1023537352, -1109544964) + W(1, -1104797311, 1016525394, 1034835508, 1033208955) + + W(2, 1013555797, 1016103802, 1041650416, 1052577828) + + W(3, -1105646271, -1089308865, -1093424353, -1123233885) + + W(4, -1107715656, -1119261847, 1043696631, -1093802466) + + W(5, 1070961498, -1101461419, -1129647390, -1103638866) + + W(6, 1023151297, -1114491928, 1042399799, -1088107917) + W(7, 1046742027, 1041655381, 1027817568, -1123805293) + + W(8, 1033284778, -1130031974, -1108010060, 1027122983) + W(9, -1123089325, 1023301191, 1010592861, 1027104379) + + W(10, -1133592549, -1142562170, -1132296546, 1012286637) + + W(11, -1129646858, -1123666701, 1020078242, 1017326494); + WS(-1098756718, 1025257793); + sum1 = W(0, -1170432841, 992949730, 1001883457, 1015181254) + W(1, -1113865961, 1025052052, -1142935155, 1028407518) + + W(2, 1023803110, -1138344011, 1026014126, -1121590721) + + W(3, -1118191492, -1131017933, 992699702, -1125677724) + + W(4, -1090131561, -1107275570, -1096556254, -1096688477) + + W(5, -1094031636, -1105028073, -1106433523, -1094260670) + + W(6, 1057699745, 1040420307, 1054103406, 1044394251) + W(7, 1054646511, 1053702338, 1018441892, 1056434389) + + W(8, -1119694405, -1117188674, -1115724526, 1029634610) + + W(9, -1140440641, -1105231572, 1028218227, -1115106656) + + W(10, 1012926412, -1123369303, -1127845816, 1035099253) + + W(11, -1114907963, 1041135600, -1110839852, 1033590433); + sum2 = + W(0, -1113857499, 1017397942, 994248048, -1107301692) + W(1, -1114604929, -1099171315, -1128156929, -1105825924) + + W(2, 1035336978, 977119295, 1058657166, 1082282453) + W(3, 1081592322, 1057428850, 1029982493, 1050573738) + + W(4, 1003212424, -1169985407, -1086726098, -1067974855) + + W(5, -1065596346, -1101606461, -1114706375, -1113547007) + + W(6, 1016146718, -1139136560, 1029663775, -1088717558) + + W(7, 1032721198, -1109521003, 1035913834, -1115579388) + + W(8, -1124908942, -1127032094, -1128987279, 1045162011) + + W(9, -1132432620, 1001306728, -1127893472, 1022139202) + W(10, 1007728744, 1015257206, -1139895388, 989071903) + + W(11, -1115423533, 1026551071, -1124574009, 999865176); + WS(1057488311, 1032489366); + sum1 = W(0, 998859696, -1126361486, 1028022609, -1139957040) + + W(1, 1015295094, -1122345661, -1126668079, -1129886863) + + W(2, -1107316871, 1034785118, -1114064513, 1048520075) + + W(3, -1112481238, -1154023155, -1133481329, -1108825451) + + W(4, -1130375162, -1098594694, -1105098668, -1099155379) + + W(5, -1109749909, -1112014022, -1114013594, -1116334683) + + W(6, 1045821468, 1031878554, 1057263754, -1127500588) + W(7, 1049599048, 1025402492, 1034877470, 1046739556) + + W(8, 1009430200, -1137835434, -1104540630, 1033795278) + + W(9, -1105774078, 1046311438, -1109189150, -1119327433) + + W(10, -1127874328, -1124885440, -1121514949, 1026343507) + + W(11, 1007199100, -1119007402, 1026086402, -1138298796); + sum2 = W(0, -1131728975, 1035973522, 1044679054, 1057647035) + W(1, 1029801795, -1120435503, 1040526136, 1001204178) + + W(2, 1036764889, -1115068573, -1096357732, -1081650015) + + W(3, 1008652352, 1020148594, 1019038058, -1125968836) + + W(4, -1111227173, 1022919798, -1128128484, 1064645808) + + W(5, -1094730608, 1034184152, -1110501324, -1141167471) + + W(6, -1128881737, 1043114423, -1098903856, -1105946360) + + W(7, -1121257166, -1122224678, 1033879187, -1125677560) + W(8, 1037242625, 990889655, 1034691185, 997618289) + + W(9, -1119761613, -1123774451, 1017411026, 1017460301) + + W(10, -1122740141, -1130091274, -1126568042, 1036162942) + + W(11, -1145265129, 1016517254, 1025838030, -1121815648); + WS(1059796919, -1120566973); + sum1 = + W(0, -1128913552, -1121363289, -1114223569, -1170089852) + W(1, 1032486790, 1007200827, 1031548233, 1025411673) + + W(2, -1112300176, 1042197939, 1034918960, 1019526904) + + W(3, -1097594444, -1109654209, -1121876014, -1114258964) + + W(4, -1105877684, -1097436160, -1084964393, 1000497399) + + W(5, 1058860547, 1031553246, 1038828418, -1106885131) + W(6, 1051198984, 1044389601, 1058261945, 1057668526) + + W(7, -1083919657, -1093305914, -1113158982, 1024357474) + + W(8, 1031319296, -1156941767, -1115209492, 1032065846) + W(9, 1045243539, 1041280427, 1014469175, -1128319413) + + W(10, -1128535084, 1024751122, 1025460631, 1032881746) + W(11, 1010383044, 986576750, 1034628234, 1012703988); + sum2 = + W(0, -1143612781, 1024653023, 1031492195, -1118229715) + W(1, 1037055061, -1103747903, 1027878177, -1120661119) + + W(2, 1030657759, -1114346787, -1115709916, -1122961088) + + W(3, 1023143173, 1032102149, 1035049663, -1115297076) + W(4, -1142189493, -1145631357, 1041520845, 1058735511) + + W(5, -1123318690, -1113230658, -1107577516, 1029140405) + + W(6, -1116365956, -1122350618, -1109597137, 1063925227) + + W(7, -1097941231, -1096423541, 1034348655, -1104473650) + + W(8, -1108113093, -1120960689, -1100459142, -1102646250) + + W(9, -1097541479, -1119600722, 994779835, 1048901284) + W(10, -1144957229, 1013910379, 1028619709, 1003281301) + + W(11, 1040501280, 1015718737, -1116733621, -1122107736); + WS(1025862512, -1097886171); + sum1 = W(0, 1017995501, 1028206791, -1115115241, 1023900364) + W(1, 973319892, 1028215869, 1033665516, 1031994596) + + W(2, 1039868615, 1039095646, 1044724702, 1040670187) + W(3, 1036683863, -1105649212, 1040757263, -1101644966) + + W(4, -1084617440, -1095591910, -1088992852, -1089161581) + + W(5, -1092805231, -1107053347, -1107160205, -1102281943) + + W(6, 1048852846, 1046495341, 1053236428, 1054642003) + W(7, 1050422468, 1049220624, 1039010398, 1042256548) + + W(8, 1036255511, 1032043925, 974144948, 1024473755) + W(9, -1132527589, -1120787802, 1025750940, 1034960116) + + W(10, 1003283810, 1031081728, -1128580235, 1033561578) + + W(11, 1012484477, -1126192084, 1035723265, -1141688154); + sum2 = + W(0, 1017309480, -1115898040, 1026950620, -1131938440) + + W(1, -1120377052, -1147724576, -1108926548, -1120540424) + + W(2, -1113384832, -1105498372, -1140340528, -1101077232) + + W(3, -1114410560, 1042402941, -1114542528, 1040078450) + W(4, 1051665642, 1043260681, -1109716244, 1039662810) + + W(5, -1113565360, -1097796100, -1108348496, -1097463639) + + W(6, -1106075829, 1041703091, -1109231476, 1049668212) + W(7, 1032262130, 1040746517, -1140600496, 1048026467) + + W(8, 1041533127, -1122221676, 1047102067, -1109791178) + + W(9, 1039963022, -1131969000, 1032294606, -1107112902) + + W(10, -1143916576, -1119502308, 1032670038, -1130795288) + + W(11, -1112068676, 1031201932, -1108483346, 1028500076); + WS(1059594295, -1081462343); + sum1 = W(0, 1027153262, 978268098, 1020914066, 1037283618) + W(1, 1001487768, 1024040629, -1121199663, 1022356543) + + W(2, 1043504002, -1116748340, 1039643767, 1038369681) + W(3, 1034058802, 1040894970, -1111840522, 1036921959) + + W(4, 1052804111, 1047257898, 1049749519, 1054855273) + W(5, 1047397560, 1052275873, 1039603542, 1026848211) + + W(6, -1087238767, -1102654539, -1086204143, -1088075529) + + W(7, -1086503800, -1098202447, -1107277965, -1098696769) + + W(8, 1041162890, 1038115889, 1044063108, 1037006730) + W(9, -1117492081, 1024505810, 995252542, 1036480704) + + W(10, 1012415888, -1165722369, 1033818911, 1032180390) + + W(11, 991868273, 1034352017, -1131707508, -1136594828); + sum2 = W(0, 1028621181, -1110777341, 1027102605, 1030597213) + + W(1, -1106396561, 1041951037, -1110468651, 1026771477) + + W(2, -1120219585, -1127812186, -1121966109, -1109734497) + + W(3, -1139970197, 1005564394, 1027913013, 1021745754) + W(4, 1035384087, -1126856730, 1038893967, 1046142043) + + W(5, -1102581665, 1024169581, -1119264521, 1045072501) + + W(6, 1034472183, -1129759266, -1123472797, 1054407172) + + W(7, -1114873213, 1049042812, -1104920828, -1117275361) + + W(8, -1123130413, -1106344343, -1121376361, -1110811845) + + W(9, -1147353578, 1023037898, -1123538565, -1108801471) + + W(10, -1120488613, -1132463093, -1111137329, 1013238549) + + W(11, -1113345499, 1010521365, -1123696429, 934750635); + WS(1001790336, 1033193226); + sum1 = W(0, -1113292474, -1131356554, -1133969725, -1118664394) + + W(1, 1027204153, -1111709325, 1024655285, -1127980619) + + W(2, 1018580889, -1115176285, -1102427201, -1094752997) + + W(3, -1105768635, -1119059021, -1121009370, -1131789226) + + W(4, -1117909243, 1046326027, 1041639692, 1062953181) + W(5, 1031529696, 1040555139, -1115548569, 1030139737) + + W(6, 1052553934, -1113855449, 1060794158, 999804065) + + W(7, -1122254720, -1110352445, 1026923705, -1100154756) + + W(8, -1104113579, -1112351060, -1095014251, -1105541862) + + W(9, -1102735326, 1031818996, 1008421480, 1016036429) + + W(10, -1129785460, -1156866531, -1132017542, -1130622370) + + W(11, 1022740922, -1121415144, 1008916224, -1122315305); + sum2 = + W(0, 999771042, -1130012060, -1123589256, 1018901632) + W(1, -1124249760, 1017234680, -1118367200, 1016197020) + + W(2, 1019371878, -1137594745, 1002965746, -1114341154) + W(3, -1115605194, 1017493044, 1015905000, 1024661143) + + W(4, 1035878909, 991329315, 1042318306, 1053769225) + W(5, 1010690665, -1099274218, -1101115118, -1092869373) + + W(6, -1106457448, 1043986431, -1118271248, 1057361082) + + W(7, -1102884302, 1037230696, -1112309114, 1036147884) + + W(8, 1038257769, -1108709562, 1025444512, -1113472862) + W(9, 1015483632, -1115820708, 1020142296, 1016005876) + + W(10, -1118330440, -1156785507, -1134019065, 1021163648) + + W(11, -1123825168, 1025071687, -1126466092, 1013380697); + WS(-1096043118, -1087645231); + sum1 = W(0, -1115587665, 1032694426, 1031441086, 1023546425) + + W(1, -1130229584, -1147531597, 1019733960, -1115129818) + + W(2, 1029203067, -1099485226, -1113336032, -1121275799) + + W(3, 1051148019, -1118364796, -1127235090, -1119188228) + + W(4, 1045341850, 1017432376, 1054321442, 1050158903) + W(5, -1081266857, 1047006846, -1106232936, 1041137522) + + W(6, -1106908023, 1052615508, -1082902530, 1045376289) + + W(7, 1057440145, -1118131945, -1134199968, 1018710010) + + W(8, -1131991862, -1113683692, 1050084000, -1116607496) + + W(9, 1027649766, -1120491559, 1027530281, -1131853547) + + W(10, -1114910160, -1127306394, 998100766, -1147820543) + + W(11, 1021215128, 991663462, -1123554607, -1124042776); + sum2 = + W(0, -1129211209, 1023861908, 1038235290, 1029997412) + W(1, -1125523437, -1107362446, -1114850415, 1013933265) + + W(2, 1023515648, -1119658781, -1121364796, -1103304652) + + W(3, -1109858923, 1044349350, 1032218024, 1027861436) + W(4, 1040374834, -1108471855, -1096619497, 1039720436) + + W(5, -1113539350, 1038091910, -1121557752, 982770184) + W(6, -1110890211, -1133136545, 1044872450, 1050855479) + + W(7, -1117035130, -1107498682, -1130602657, -1128608489) + + W(8, 1020265593, 1048083250, 1034188808, -1102257516) + W(9, 1022698753, 1024895152, -1162309256, -1129090321) + + W(10, 1023672492, -1109425046, -1121333166, -1130250517) + + W(11, 1029442100, -1122118916, 1020180841, 939323929); + WS(1062090935, 1058767985); + sum1 = + W(0, 1016379967, -1127587553, -1124869109, 1030044278) + W(1, -1135267218, 1021197901, -1146487047, 1001072263) + + W(2, -1111629724, 1016014666, 1045897412, 1039181162) + W(3, -1111908667, 1032078908, -1129970444, 1037221664) + + W(4, -1115487571, 1046030390, -1089079359, -1107063038) + + W(5, 1056809425, -1100036461, 1008766834, -1118068997) + W(6, 1040669191, -1131263417, 1049140321, 1046027952) + + W(7, -1082917799, 1040408361, -1115518322, 1034380765) + + W(8, -1124650927, -1107621674, -1120715392, 1035258018) + + W(9, 1051125844, -1117322707, -1115270659, -1135017032) + + W(10, -1131647467, 1039946613, -1197661491, 1033161790) + + W(11, -1129645073, -1124734374, 1029976235, -1119763541); + sum2 = + W(0, 1033054007, -1116547758, -1123189128, 1033469023) + W(1, -1122818756, 1026371779, -1136838880, -1137766108) + + W(2, -1111327982, 1041352776, 1032790615, 1012971008) + W(3, -1098982462, 1042838787, -1110172088, 1004924993) + + W(4, -1121722910, 1034677105, 1033549613, 1033020303) + W(5, 1051050782, -1098306997, 1034801784, -1120000922) + + W(6, 1038740385, -1115132829, -1092378351, -1108961666) + + W(7, -1121004928, 1045175561, 1019964530, 1027487385) + + W(8, -1119336676, -1124364804, -1102497930, -1106694042) + + W(9, 1035128176, 1039643256, 1015821086, 1017988993) + W(10, -1124024618, 1035204548, 1032784783, 1032253989) + + W(11, 1009754028, -1118316692, -1125398316, 1028774587); + WS(1065136439, 1040354336); + sum1 = W(0, -1140671753, -1120274067, 1022747450, -1124666160) + + W(1, -1123069063, -1131113682, -1118356003, -1126498983) + + W(2, -1108811053, -1107804932, -1110160675, -1105899870) + + W(3, 1025125049, 1033405406, -1129239633, 1016924742) + W(4, 1057254373, 1050226223, 1059609336, 1031464345) + + W(5, -1093137163, -1111386668, -1105328992, -1111235284) + + W(6, -1099781359, -1098842784, -1092867554, 1000731409) + + W(7, 1058399851, 1055942809, 1044975810, 1051704028) + W(8, 1009251305, 1010162395, 1036945681, -1114655220) + + W(9, -1109467235, -1101547023, -1113825780, -1104493413) + + W(10, 1003726785, -1112753158, -1120831377, -1112429520) + + W(11, -1119063979, -1146511789, -1116155918, -1117793303); + sum2 = W(0, -1139839138, 998321428, -1134067290, 1024466364) + + W(1, 1008723794, -1119932526, 1028368392, -1132382549) + W(2, 1034041544, 1018598993, 987604943, -1102834025) + + W(3, -1131349085, -1118877643, 1031347596, -1113750023) + + W(4, 1034669108, -1116818777, 1007335842, 1061492513) + + W(5, -1121214551, -1116983417, -1114752830, -1103912225) + + W(6, -1095769692, -1114897304, -1102588486, 1062722215) + + W(7, -1107691916, -1117176868, 1009572226, 1035794880) + + W(8, -1105759439, -1105398904, -1108283066, -1098749835) + + W(9, -1108418109, 1041629273, -1103951670, 1046707789) + + W(10, 1039138956, -1145690340, 1018314989, 1025712340) + + W(11, 1022467761, -1121476700, 1033232162, -1110829011); + WS(1015535328, -1084984071); + sum1 = W(0, -1114800552, 1017574081, -1121052395, -1121642214) + + W(1, 1031943978, -1119258038, 1015340962, -1152091148) + + W(2, -1108603860, -1120445077, -1120661414, 1038434434) + + W(3, 1004694578, 983354644, -1131668588, -1117988144) + + W(4, -1099862310, -1098244185, -1094435959, -1091868509) + + W(5, -1100742889, -1090330210, -1106546547, -1096238847) + + W(6, 1058689409, 1050368026, 1059588503, 1053265766) + W(7, 1053762387, 1049777811, 1042220181, 1044693386) + + W(8, -1114937124, -1113854018, -1120887600, 1038069402) + + W(9, 1032168457, 1033335786, -1112611163, 1033654385) + + W(10, -1119809253, -1119794874, -1117398367, -1124845785) + + W(11, -1126829041, -1124490374, -1122991451, 1025017029); + sum2 = W(0, -1113763234, -1113925793, -1117079348, 1016562523) + + W(1, -1106152769, 1021767953, -1110489214, -1118706081) + + W(2, -1123863865, -1117743388, 1031541130, 1034144457) + + W(3, -1108434934, 1028245712, -1107854239, -1131124226) + + W(4, -1152383745, 1049718598, 1054034272, 1045174355) + W(5, 1019958281, 1048832333, 1037079656, 1041167636) + + W(6, -1153318001, -1115051721, -1111062529, 1029337732) + + W(7, -1107848604, 1036566626, -1106439039, -1100833945) + + W(8, 1032880554, -1108241407, 1025815300, 1040219109) + + W(9, -1122950542, 1032317223, -1114917041, 1023645948) + + W(10, -1112434267, 1017487533, -1115045873, -1115252534) + + W(11, -1112234054, -1144290245, -1111099643, -1123196065); + WS(1058837943, 1069665989); + sum1 = W(0, 962159770, -1131526763, -1123587520, 1016761717) + + W(1, -1116652202, 1020359383, -1124916236, -1120750038) + + W(2, -1123278397, -1133106088, -1111839826, -1119033369) + + W(3, -1112323118, -1123741278, -1111587013, 1031183749) + + W(4, 1059574623, 1052414436, 1056026369, 1050778647) + W(5, 1057288447, 1051933055, 1049400292, 1050858601) + + W(6, -1100091288, -1100255560, -1090882007, -1089604336) + + W(7, -1090318286, -1098258189, -1098860821, -1113801599) + + W(8, -1106975399, 1034080493, 1026032901, 1030312842) + + W(9, -1115237492, -1123145400, 1023272149, -1102573630) + + W(10, 1026912571, 1026538575, -1128992103, -1142474253) + + W(11, -1126485147, 1024876312, -1130617057, -1147252941); + sum2 = + W(0, 1031825723, -1121672345, -1128689519, 1003655756) + W(1, -1112729716, 1021714543, -1143241256, 1015056847) + + W(2, 1031898082, -1123032728, -1149677000, 1042326937) + + W(3, 1016978721, -1135526098, 1017362221, -1115756346) + + W(4, -1068962638, -1070958719, 1062859919, 1079716701) + W(5, 1069238165, -1106783417, 1038638730, 1030095799) + + W(6, -1097279430, 1042495248, 1042236169, -1097154173) + + W(7, 1043003442, -1101596383, -1114855682, 1029691669) + W(8, -1106804175, 1004890268, 1033261211, 1047991146) + + W(9, 1029430153, 1006662138, 1016716693, -1116617969) + + W(10, 1033946762, 1015278793, -1125393239, -1129356209) + + W(11, -1130449529, -1143028884, 1021676019, 1007567766); + WS(1027937136, 1051433372); + sum1 = W(0, 1024223452, -1131494490, 1034208027, -1113660825) + W(1, 1026687777, 1007645322, 1019229306, 1023660333) + + W(2, 1027262836, 1034970897, 1041574867, 1051529138) + W(3, 1043759333, 1035492122, 1025216066, 1033175550) + + W(4, -1095583884, -1102510757, -1088128354, -1082034838) + + W(5, -1107709564, 1021392868, -1116281753, 1019915650) + + W(6, 1036904555, 1043230726, 1043513377, -1088109312) + W(7, 1040837474, 1023668834, 1033050768, 1041627229) + + W(8, 1037383306, -1126475809, 1038022750, 1049740992) + W(9, 1043020088, 1040579632, 968839375, 1040383308) + + W(10, 1026871330, -1131579916, 1022249046, -1121104697) + + W(11, 1030621125, -1128113439, 1026071912, 1024084817); + sum2 = + W(0, -1122636491, -1114076695, -1122337791, -1121313911) + W(1, 1019616565, 1032037049, -1121846167, 1035628188) + + W(2, 1019704225, 1037288383, 1038646185, -1113812515) + + W(3, -1115379683, -1144905268, -1124810757, -1104091459) + + W(4, 1049771287, 1032297878, 1050229287, 1058219066) + + W(5, -1126947029, -1089173556, -1109798125, -1085784913) + + W(6, -1108218455, 1029534785, 1038576544, 1058416091) + W(7, -1096957025, 1029636273, -1112204367, 1039375301) + + W(8, 1003686724, -1114871835, 1026526587, -1129529893) + W(9, 1020162449, 1011141050, 1015768281, -1169657505) + + W(10, 1007985666, 1019192761, -1146139348, 1021492965) + + W(11, -1131201101, -1129337357, -1117257463, 1026702945); + WS(-1087300279, 1060388257); + sum1 = + W(0, -1129462823, 1031115364, -1114720439, 1025637865) + W(1, -1150727557, 1019407412, 1005184420, -1144567588) + + W(2, 1023690092, 1041026294, 1027269348, 1022155151) + W(3, 1032140389, 1019365849, 1035913085, -1142073248) + + W(4, -1095623283, -1092905754, -1093094418, -1092295181) + + W(5, -1091295733, -1094422277, -1097873082, -1089577936) + + W(6, -1106106692, 1045171988, 1058204318, 1060821043) + W(7, 1047241920, 1051757075, 1047453654, 1052799910) + + W(8, 1037669414, -1113959460, -1142625182, 1044954958) + W(9, 1031904715, 1022315054, -1121754201, 1027854342) + + W(10, -1130365587, -1127843579, -1122973026, 1027810288) + + W(11, 1008074737, 1005685302, 1011776124, 1023937224); + sum2 = W(0, -1120594034, -1141459412, -1136839806, 1028313984) + + W(1, -1127607807, -1122936307, 1007613018, -1134584398) + + W(2, -1166872476, 1004777140, -1113289360, 1013932442) + + W(3, 1019995585, -1124945717, -1145964804, -1157638606) + + W(4, 1040489823, -1122900789, 1021539093, -1095750682) + + W(5, 1045364618, 1031026044, 1033830372, -1125456395) + + W(6, -1102509951, -1110936244, 1067324619, 1045560576) + + W(7, -1096904945, -1100965201, 1000232964, -1108078168) + + W(8, -1086857984, -1095818924, -1093760272, 1065644346) + + W(9, -1123950010, 1042979309, -1121148085, 1026162850) + + W(10, 1045679794, -1104593759, -1110068744, -1103109579) + + W(11, 1034732462, 1018809021, -1152320711, 980148252); + WS(-1090838638, 1050174926); + sum1 = W(0, 1024715784, 1033853293, -1106406969, 1042483832) + + W(1, 1025782733, -1138965820, 1038488261, -1139164262) + W(2, -1109115088, 1049593122, 994296459, 1045373935) + + W(3, 1015694078, -1112080289, 1045351388, -1114987669) + + W(4, -1106716164, -1120751425, -1094496661, -1086184702) + + W(5, -1092092861, -1095245812, -1100690449, -1094326222) + + W(6, 1038102082, 1051782073, 1043814476, 1058236139) + W(7, 1045378621, 1042079876, 1050438570, 1040938025) + + W(8, -1115525408, -1136454131, -1105105482, 1033520471) + + W(9, 1029286795, -1106373991, 1034575399, -1122199803) + + W(10, 1016756989, 1035169257, -1108133484, 1042591993) + + W(11, -1140252101, -1115290814, 1041627941, 1001134058); + sum2 = + W(0, 1051544715, 1047565246, 1046232208, -1105592564) + W(1, -1094324661, -1105924841, 1021200095, -1103932050) + + W(2, -1087153288, -1111682644, -1081925443, 1060283907) + + W(3, 1062548140, -1127110112, 1051334754, 1033462267) + + W(4, -1090874159, -1099176408, -1105576760, 1048906709) + + W(5, -1112367085, 1049091960, -1107585156, 1048824237) + W(6, 1047568122, 1032035298, -1119008010, 1036693685) + + W(7, -1119206793, -1158298480, 1036759049, -1114785543) + + W(8, -1111412903, 1040133461, -1140028602, -1107739759) + + W(9, 1044620924, -1096403637, 1046459856, -1114351857) + + W(10, 1034895049, -1131191613, -1112144320, 1040322447) + + W(11, -1130045765, 1011461326, 1012649582, -1111955333); + WS(1039738296, 1044009556); + sum1 = W(0, 1031992376, -1118478209, 1036413734, 1042319122) + W(1, 1025321013, 1019779694, -1126468451, 1028741314) + + W(2, -1113116036, -1126664684, 1028656912, -1095949365) + + W(3, 1046101634, -1104617834, -1111694091, 1029160593) + W(4, 1058890327, 1042459434, 1054229481, 1057173004) + + W(5, 1048940614, 1052520321, 1047137387, 1057385245) + + W(6, -1088719167, -1107130859, -1088309806, -1090115281) + + W(7, -1090901446, -1096019759, -1098195015, -1090793697) + + W(8, 1040542090, -1129453002, 1042227988, -1127816747) + + W(9, 1048439133, -1119199044, 1036380619, 1040359505) + + W(10, -1107110028, 1036863629, -1133301245, -1121635021) + + W(11, -1120611033, 1022364232, -1108092830, -1129794251); + sum2 = W(0, -1088996856, -1089163817, -1081345153, -1080285142) + + W(1, -1079794071, -1089981167, -1091438196, -1099490886) + + W(2, 1009251693, -1107842867, -1124806950, 1052635731) + + W(3, -1106464080, -1125456570, -1115606726, -1106662163) + + W(4, 1062110924, 1057525018, 1064189433, 1067630395) + W(5, 1063058829, 1062842970, 1054193960, 1053790298) + + W(6, -1115283476, 1042234988, -1104109471, -1112028150) + + W(7, -1113992476, 1045262592, 1042247754, -1104249669) + + W(8, 1030923639, 1032774718, -1126776930, 1034769026) + + W(9, -1106165885, -1136163037, 1032379012, -1108359351) + + W(10, 1034262626, -1123202523, -1130902850, 1036915346) + + W(11, -1110986466, 1035294670, -1135519157, 1024576891); + WS(-1096394862, 1050867114); + sum1 = + W(0, 975777376, 1035680965, 1017323049, -1164976624) + W(1, -1126109949, -1117859264, 1011370603, -1122131819) + + W(2, 1011677768, -1097606072, 1017467204, -1122057965) + + W(3, 1039142936, -1137149130, 1023416416, -1112401517) + W(4, 1050217928, 1041761501, 1059053443, -1098739346) + + W(5, -1089683010, -1104430516, -1115445691, 1042596520) + + W(6, -1095631255, -1108785275, -1088500104, -1111108333) + + W(7, 1062642602, 1040456976, 1016594173, -1120553683) + W(8, -1105375964, 1035556439, 1042635014, 1025006046) + + W(9, 1038036638, 1027021261, 1041295544, 1029575724) + W(10, 1033079080, -1107649602, 1020084753, -1112750027) + + W(11, -1142614292, 1017623258, -1113983747, -1124248029); + sum2 = + W(0, -1131210775, 1024840523, 1024067225, 1022860453) + W(1, -1125865258, -1130239171, 1024964869, -1117571915) + + W(2, 1029829507, -1108448221, 1046565608, -1107856867) + + W(3, 1042031083, -1106481128, -1127390051, -1124576676) + + W(4, 1018275001, -1117395779, 1042461338, -1092962046) + W(5, 1053212914, -1102214835, -1114692565, 991892650) + + W(6, -1122984086, -1132016729, 1059140985, -1089805596) + + W(7, 1058514952, 1027704725, -1118917379, 1032905776) + + W(8, -1096338526, -1114466007, -1107995649, -1166014069) + + W(9, 1052927486, 1041713274, 1037010892, 1032336370) + + W(10, 1033255054, -1103146109, -1119288636, -1099911282) + + W(11, -1113255745, -1106771914, -1111017176, 1000523989); + WS(-1112511928, 1031640207); + sum1 = + W(0, 1037301926, -1130112569, -1119711398, 1044751592) + W(1, -1102628100, 1042267541, 1021159833, -1122521821) + + W(2, -1102373753, 1048837234, -1091456672, 1045582560) + + W(3, -1119033858, -1093436941, 1050238014, -1100593739) + W(4, 1058068053, 1051625169, 1054040787, 1044375881) + + W(5, 1057193534, 1051238780, 1045936610, 1058222955) + + W(6, -1091912761, -1095738529, -1101742756, -1090186767) + + W(7, -1090190311, -1110077161, -1098844722, -1090967581) + + W(8, 1030698115, 1045615952, -1104227307, 1051640030) + W(9, -1111999463, 1008998972, 1050341641, -1108465231) + + W(10, -1112730073, 1045904421, -1098654019, -1111879892) + + W(11, -1123401908, -1101737376, 1043894710, -1112695488); + sum2 = + W(0, 1016218439, 1009444234, -1111008440, 1026480303) + W(1, 1015374231, -1115006890, 1027237715, -1122692269) + + W(2, 1024549194, -1117974589, 1042315856, -1106327815) + W(3, 1040022175, 1025059842, -1110870197, 1033099318) + + W(4, -1121292007, -1111737758, 1047393563, -1089871257) + + W(5, -1115783084, 1043300713, -1103999090, 1022298131) + + W(6, 1037076368, -1110249739, -1086831522, -1069929292) + + W(7, -1085683537, 1033002057, 1033912191, 1032775289) + W(8, -1112700443, 1020335555, 1038599637, -1111547810) + + W(9, 1049254465, -1118960414, -1118358651, -1104218510) + + W(10, 1032984152, -1112172263, 1060801772, 1079084175) + + W(11, 1057876572, 1033693800, -1104475663, 1045399536); + WS(-1106120924, 1033431669); + sum1 = W(0, 1016553159, -1146851238, 1024375743, 1026515514) + W(1, 1005429062, 1029812010, 1008887700, 1021177962) + + W(2, 1035990878, 1041817850, 1041767260, 1047579686) + W(3, 1031819293, 1026577053, 1014785832, 1011005202) + + W(4, -1101729723, 1024013341, -1116899488, -1085522812) + + W(5, -1090064383, -1118087802, -1126747713, 1025078601) + + W(6, 1042266392, 1027850273, 977256084, -1090381288) + W(7, 1048109660, -1113190325, 1024173993, -1127218683) + + W(8, 1024064284, 1026394008, 990294084, 1048833585) + W(9, 1038017843, 1040657490, 1020235411, 1041410670) + + W(10, 1018305971, 1021653787, 996614956, -1125739905) + + W(11, 1016883609, -1121801815, 1027952623, -1132785763); + sum2 = + W(0, 1032555846, 1019641904, 1015684488, -1123545328) + W(1, -1118308408, -1117707424, -1137876352, -1152988290) + + W(2, -1110721648, -1116342888, -1102693078, 1027573888) + W(3, 1043950970, 1021888896, 1007632640, 1023916088) + + W(4, -1094136567, -1089264280, -1097199465, 1056898914) + W(5, 1037769558, 1041236542, 1026403708, 1046276806) + + W(6, 1030929664, -1112511004, 1046449598, 1052843165) + + W(7, 1024674316, -1109778580, -1123597216, -1105717038) + + W(8, -1146526593, 1032788860, 1012812816, 1033507644) + W(9, -1106559340, 1017687520, 1028523456, -1122312832) + + W(10, 1018020888, -1125819008, 1004426241, -1122415072) + + W(11, 1028547840, 996318210, -1149117889, -1132920416); + WS(1034973624, 1056792353); + sum1 = W(0, -1120658336, -1121055921, -1128295926, 1021962732) + + W(1, -1127490506, -1119904327, -1122942113, -1119710033) + + W(2, -1130821617, -1114464179, -1106629009, -1093463666) + + W(3, -1097245927, -1132912612, -1118132038, -1115274080) + + W(4, -1114903379, -1125024178, 1008426736, 1062068439) + + W(5, 1050479246, -1107542555, 1028006365, 1025872901) + + W(6, -1130597942, -1102939831, -1118485143, 1067744046) + + W(7, 1049107361, 1045213129, -1113875250, 1036565277) + + W(8, -1109039532, -1115164458, -1104109440, -1094141737) + + W(9, -1105858697, -1119937620, -1141854766, -1121170098) + + W(10, -1124529164, -1124681556, -1138254780, 993935312) + + W(11, -1132704804, -1120970067, -1122550700, -1120520661); + sum2 = + W(0, 1020401308, 1017661559, -1129375401, -1130735541) + + W(1, -1146688164, -1166762145, -1130185789, -1137125822) + + W(2, -1120501349, 996214904, -1140432422, 1024553914) + W(3, 1006774606, -1124013507, 1033491675, -1117903931) + + W(4, 1037264768, -1116129767, 1035443152, 1051779064) + W(5, 1039827062, 1025600009, -1114545658, 1032817572) + + W(6, -1090330474, -1084580575, -1097846115, 1064606263) + + W(7, 1048687051, 1019182043, -1117487855, 1037037513) + W(8, -1105802125, 1032645479, -1102145888, 1038402436) + + W(9, 1000828364, 1025151371, 1028059566, -1112238814) + + W(10, 1023925581, -1119976615, 1025111856, -1136822486) + + W(11, -1121332237, 1015612208, -1119338761, 999461036); + WS(-1082445367, -1085006700); + sum1 = W(0, -1131835086, 1034878908, -1106661648, 1037617118) + + W(1, -1121819052, 1022066011, 1036207796, 1033542412) + W(2, 1041974800, 1043293403, 1042063924, 1045196135) + + W(3, 1037212703, -1105403448, 1046411795, -1100599618) + + W(4, -1081109875, -1092276724, -1086386347, -1094524616) + + W(5, -1094507255, -1104988703, -1105674409, -1096619449) + + W(6, 1054173212, 1051286356, 1055927462, 1058619216) + W(7, 1050138098, 1028915053, 1041419787, -1130824962) + + W(8, 1035072463, 1034209806, -1114712644, 1036390662) + W(9, 1015171028, -1139447658, 1026111277, 1045523870) + + W(10, -1137431795, 1038048136, -1110863483, 1042877649) + + W(11, -1123146704, -1114994477, 1040360493, -1121943708); + sum2 = + W(0, -1112963339, 1025676326, -1117465202, 1036266015) + W(1, -1124864900, 1019242508, 1017632828, 1039721851) + + W(2, 1043137200, 1000796272, 993751520, -1098528956) + W(3, 1032573075, -1097473255, 1049454991, -1090503899) + + W(4, 1014823768, 1031859059, 1020211292, 1055374057) + W(5, 986723264, -1125510524, -1111044051, 1007293144) + + W(6, -1089890678, -1102855534, 1018575516, 1061198225) + W(7, 1038055959, 1050136287, -1109681619, 1054985311) + + W(8, 1022229356, 1031913791, -1120060570, -1098119563) + + W(9, -1106568385, -1098582022, 1030233630, -1101215648) + + W(10, -1128614108, 1018516204, -1138611816, 1020738140) + + W(11, -1132953832, -1123833514, 1035860627, -1110059149); + WS(-1089141943, 1068474134); + sum1 = + W(0, 1024130588, -1101143803, 1039148539, -1124204515) + W(1, 1026773217, 1018218693, -1104179471, -1123573325) + + W(2, -1121972404, 1041396360, -1105946681, 1052602058) + + W(3, -1091638882, 1032280890, 1041946144, -1138642417) + + W(4, 1032495505, 1045416789, -1106461946, -1094942270) + W(5, 1059099726, -1106993164, 1045088278, 1009482242) + + W(6, 1036801227, -1094238571, 1057861426, -1098420551) + W(7, 1040764762, 1033290001, -1105244536, 1037819035) + + W(8, -1117579092, 1039470024, -1113046718, 1047303536) + + W(9, -1094617668, 1040300696, -1110195745, -1108347351) + + W(10, -1114425265, 1024684838, -1108918837, -1127532529) + + W(11, 1027200645, -1103088708, 1043167338, -1116739793); + sum2 = W(0, 1016644168, 998892514, -1116049462, 1033248586) + W(1, -1110140123, 1041609896, -1103095555, 1030835892) + + W(2, -1134771145, -1114282184, 1042383274, 1025008594) + + W(3, -1104878488, -1101611481, 1048842205, -1122288558) + + W(4, -1129326838, 1049635340, -1147070546, -1102476512) + + W(5, -1090718582, 1046973498, -1115539252, 1028769716) + + W(6, -1114142714, -1101404122, -1095734150, 1060588986) + + W(7, 1052949499, -1143476482, -1110997031, 1022411808) + + W(8, 1012771369, -1114952606, 1057697290, -1111850310) + + W(9, -1096580248, -1114336646, 1031782132, -1118966953) + + W(10, 1025799488, 1041138771, -1095991584, 1027653952) + + W(11, -1127102864, 1035005082, 992902692, -1120028296); + WS(1055908206, 1023803300); + sum1 = W(0, 1033033649, -1128828388, 1027156540, 1024886583) + + W(1, -1122498726, 1032744244, -1114524705, 1005980052) + + W(2, -1114766205, 1011459483, -1106069078, -1116675477) + + W(3, -1116893112, 1045609495, -1113403236, 1049123968) + W(4, 1059767687, 1054454099, 1057986836, 1059734148) + + W(5, 1056528229, 1043829406, 1047712168, 1049516377) + + W(6, -1093070812, -1094569204, -1086765600, -1090099632) + + W(7, -1094363024, -1102732570, -1103438026, -1098493775) + + W(8, -1106762950, 1029622486, 991938588, -1098865153) + + W(9, -1101593593, -1139103892, 1022039246, -1097177334) + + W(10, -1139512861, 1016172182, 1027600816, 1027525694) + + W(11, -1135964969, 1036132330, -1117700205, 1035501771); + sum2 = W(0, 1025334517, -1115143239, -1112308287, -1115511381) + + W(1, 1042864237, 1031444191, 1040795754, -1111573417) + W(2, 1052224655, 1029199567, 1050599738, -1137182696) + + W(3, -1101494467, -1094150391, -1116631442, -1092627938) + + W(4, -1085507535, -1092254017, -1091835304, 1050309385) + + W(5, 1052849573, 1058681981, -1093246396, 1066882777) + + W(6, -1083097675, -1079915962, -1078367265, -1085955474) + + W(7, 1077549274, 1068550083, 1054678659, 1059124396) + + W(8, -1097828858, -1092877982, -1101001669, 1031547399) + + W(9, 974314816, -1100178328, 1046838481, -1088438520) + W(10, 1062578782, 1029921983, 1036651638, 1017725718) + + W(11, -1103762806, -1106558945, 1039431488, -1098096651); + WS(-1078207964, -1098790270); + sum1 = + W(0, -1117816013, 1039615439, 1040159636, 1032454162) + W(1, 1029735698, 1026856980, -1128361629, 1002339317) + + W(2, 1017293260, -1121106131, -1098516348, -1100564368) + + W(3, -1142189601, -1115831559, -1129405415, -1114960439) + + W(4, 1049047675, -1100078274, 1057717203, 1041647209) + W(5, -1090236946, 1041839801, -1114821509, 1034781465) + + W(6, -1100878354, 1049964833, -1094050686, -1119951725) + + W(7, 1052197359, -1110599850, 1009705546, 1020602063) + W(8, 1032784131, -1107321921, 1040450075, -1099964381) + + W(9, -1116032848, 1034137049, 1036993018, 993360895) + W(10, -1126192007, -1122801847, 1034337038, 1014677674) + + W(11, 1028031798, 1027844545, -1121696025, -1130484229); + sum2 = + W(0, 1025029135, -1115606678, -1098891737, -1111864983) + W(1, -1112278329, 1017169741, -1123958951, 1031819582) + + W(2, -1104367710, -1132455965, 1054704406, 1035843132) + + W(3, 1038310704, 1037432870, -1137648567, -1122384617) + + W(4, -1119205162, 1051294613, -1118431701, 1040638061) + W(5, 1033551568, -1095570314, 1040693441, 1008777251) + + W(6, 1051361304, -1090262380, -1094584814, 1042639742) + W(7, 1042180969, 1054301740, 1006683771, 1032304440) + + W(8, -1097951274, 1046775583, -1111734067, -1115582191) + + W(9, -1116801751, -1102111461, -1108749213, -1103720876) + + W(10, 1037239658, 1027534783, -1137589907, -1161598998) + + W(11, -1113612863, -1137659371, 1017443081, 1038413214); + WS(1060561207, -1110135205); + sum1 = W(0, -1114856118, -1124131449, -1121034566, -1112340961) + + W(1, -1112123800, 1034679769, -1115322038, -1107671902) + + W(2, 1049197464, -1108658488, 1041962623, 1047635080) + W(3, 1029521634, 1045001085, 1019494819, 1038785126) + + W(4, -1091745710, -1095755605, -1091090769, -1089785676) + + W(5, -1088312300, -1105390912, -1095959893, -1089779917) + + W(6, 1057921518, 1045522218, 1055093690, 1056738433) + W(7, 1057086969, 1048793054, 1049205462, 1057170552) + + W(8, 1045672489, -1100746808, 1019645080, -1111234056) + + W(9, -1095870350, 1047514180, -1099214252, 1022895484) + + W(10, 1021270499, -1112929307, -1157317541, 1036938084) + + W(11, -1148757666, 1026507103, 1019330670, 1029094240); + sum2 = + W(0, -1110883135, -1122184691, 1008834310, 1033395903) + W(1, -1110716892, 1024095030, -1113505190, -1113542640) + + W(2, 1041894205, -1115970606, 982318965, 1040255170) + W(3, -1134396672, 1031402202, -1121857157, 1031923695) + + W(4, -1114700148, -1118217955, -1097954058, -1109327580) + + W(5, -1107386491, -1114148625, -1116084956, -1128842340) + + W(6, -1082032478, -1081043792, -1085641610, -1095688614) + + W(7, -1084362127, -1093205100, -1087863650, -1094939475) + + W(8, 1046875162, 1049320576, 982336213, -1107088758) + W(9, 1032307660, -1122373488, 1045820748, 1044473869) + + W(10, 1064081845, 1059051295, 1064706681, 1066526360) + W(11, 1060847547, 1058657081, 1055302318, 1041403755); + WS(-1088848183, -1091270356); + sum1 = W(0, -1113444636, -1127291412, -1131637032, -1105736260) + + W(1, 1030983166, -1127378047, 1037357901, -1115666437) + W(2, 1022583331, 1011517178, 1047190142, 1040877723) + + W(3, 1035565944, -1097520394, -1114602800, -1108205485) + + W(4, -1092936920, -1094397598, -1092945549, -1086200137) + + W(5, -1102025475, -1104020948, -1116833526, -1102830535) + + W(6, 1050793382, 1055228191, 1056457416, 1051083611) + W(7, 1056969730, 1051399464, 1044492479, 1047811509) + + W(8, 1035173048, -1112816343, 1039723405, 1039289519) + + W(9, 1015654008, -1108815670, -1116817631, 1032741190) + + W(10, -1115063927, 1007040780, -1118782984, -1114815627) + + W(11, 998545680, -1127143385, 1025703109, -1123886254); + sum2 = + W(0, 1023906737, -1110646223, -1119411664, 1010017751) + W(1, -1108429461, 1029589423, -1110439418, -1125097343) + + W(2, 1067295699, 1065087692, 1065459703, -1118952488) + + W(3, -1081475488, -1083105366, -1095503285, -1083389324) + + W(4, -1081442287, -1085042817, -1083251842, 1050008558) + W(5, 1064700095, 1064469883, 1057972141, 1061045473) + + W(6, -1097077469, 1037915281, -1096872835, -1110920551) + + W(7, 1006981249, 1036080906, -1106015672, 1051761632) + W(8, 1029195957, 1015927544, 1018101230, 1042598936) + + W(9, -1103158035, 1041992018, -1108943564, -1114827780) + + W(10, 1026431960, -1132623721, 1018762696, -1124571002) + + W(11, 1020104602, -1114107558, 1036691137, -1119006739); + WS(1034259896, 1039623341); + sum1 = W(0, 1016878676, 1028460795, 1034359235, 1011385345) + W(1, 1015855070, 1016831138, -1128588247, 1025908283) + + W(2, -1137539339, -1104998988, -1129847248, 1015052988) + + W(3, 1032818160, 1044006969, 1033445320, 1043524531) + W(4, 1055868742, 1047938201, 1058114664, 1043619008) + + W(5, -1096687428, -1092418872, -1100196186, -1095896370) + + W(6, -1088089066, -1091378989, -1090213650, -1114958501) + + W(7, 1054476715, 1049053750, 1040121848, 1044746961) + W(8, 1043298073, 1036240559, 1043122195, -1119276751) + + W(9, -1110579607, -1101201217, -1106781444, 1018213241) + + W(10, 984347141, -1121755284, 932956556, 1018241806) + + W(11, 1026808723, 1034235663, 1010316760, -1120101215); + sum2 = W(0, 951810592, 1033659165, 1002259560, 1037243759) + W(1, -1112310958, 1034753865, 992340497, -1114454490) + + W(2, -1108037836, -1102042508, -1103529440, -1102191435) + + W(3, -1111056455, -1119026649, -1101647251, 1024637657) + + W(4, -1092018666, -1107310314, -1101738099, 1066447662) + + W(5, 1032823775, 1031795157, 1040899047, 1046257437) + W(6, -1130209970, -1115641842, 1041635941, 1067062587) + + W(7, -1098661250, -1099014553, -1117726225, -1111013301) + + W(8, 1022643242, -1110096702, 1034513697, -1100161415) + + W(9, 1027860693, -1096684817, -1114962434, -1112982645) + + W(10, 1009312276, 1032067593, -1114108683, 1041326077) + + W(11, -1120382671, 1026651225, 1038338139, -1106704138); + WS(-1096556910, 1067967914); + sum1 = + W(0, 1032707155, 1024354487, -1131915011, 1043480447) + W(1, -1118942187, -1132633269, 1031302952, 1031513592) + + W(2, -1122886335, 1031668012, 1021347526, 1041914807) + W(3, 1036630543, 1034774528, -1125222297, -1106257250) + + W(4, -1095119782, -1103532312, -1095435756, -1090836352) + + W(5, -1091218783, -1104917967, -1100801113, -1104067043) + + W(6, 1055235700, 1048353625, 1044387963, 1053060297) + W(7, 1041581564, 1052242886, 1033613430, 1050269976) + + W(8, -1120012638, -1105977207, -1105830818, -1133082414) + + W(9, 1017318739, -1121967338, -1130484760, -1109204860) + + W(10, 1031514684, -1126996321, -1116416117, 1043128001) + + W(11, -1110350280, 1039162573, -1148985233, 1034839630); + sum2 = W(0, -1125934657, -1120747465, -1126946517, 1019390634) + + W(1, -1140291646, 1045993569, -1110717499, 1038335355) + + W(2, 1041393774, 1032139854, -1107151652, 1046075673) + + W(3, -1090083756, 1024325836, -1116058677, -1097350707) + + W(4, -1097497496, -1114660789, -1096477783, 1057927405) + + W(5, -1110210473, -1137735680, 1033250412, -1127153776) + + W(6, 1047775001, -1105604596, 1048515105, 1059160295) + W(7, 1043731078, 1039621515, -1116506490, 987432265) + + W(8, -1131783044, 1018330620, -1096755902, 1041946221) + + W(9, -1091797353, 1046026631, -1106745231, -1124643180) + + W(10, -1122059316, -1129241452, -1147658728, 1011994599) + + W(11, 1032850220, -1126091098, 1009337229, -1124186068); + WS(1061843767, -1077951557); + sum1 = + W(0, 1026388735, -1120114128, 1037862893, 1029309653) + W(1, 1036389538, -1122000006, -1126306304, 1030215888) + + W(2, -1106366502, -1131166601, 1029755951, -1091391038) + + W(3, 1048316317, -1099454574, -1106178153, 1034019808) + W(4, 1059311576, 1043697070, 1054385928, 1057568381) + + W(5, 1054220568, 1049723715, 1050234615, 1058416302) + + W(6, -1088217072, -1105977039, -1091419383, -1089136642) + + W(7, -1092475601, -1095416897, -1096877448, -1091809363) + + W(8, 1041378862, -1130669927, 1047467576, -1111164306) + W(9, 1053509792, -1108260705, 1038585474, 1045917860) + + W(10, -1102542817, 1039925540, 989452730, -1105668215) + + W(11, -1138232735, -1130981221, -1107228323, -1116719540); + sum2 = W(0, 1061533858, 1062451832, 1068272760, 1070735043) + W(1, 1070929067, 1058522058, 1059576348, 1052624489) + + W(2, 1041546460, 1044663473, 1019905335, -1103665132) + W(3, 1027882908, 1053579543, 1030217484, 1042937819) + + W(4, -1081881922, -1084977950, -1081565785, -1079025547) + + W(5, -1082597652, -1079765468, -1088759123, -1090364693) + + W(6, -1104625991, -1116240264, -1115490290, -1094934042) + + W(7, 1002519540, -1096683616, -1103272320, 1039524167) + + W(8, 1020257203, -1107478927, 1038097782, -1129735749) + W(9, 1043320870, 997759194, -1110736144, 1041293151) + + W(10, -1112819836, -1146254682, 1018218872, -1108448519) + + W(11, 1032555484, -1111378699, 1018278443, -1120119454); + WS(-1084224055, -1088316584); + sum1 = W(0, -1113613001, 1003388692, -1106869627, 1016662735) + W(1, 1022316973, -1136760929, 1028746387, 984919127) + + W(2, -1107673717, 1028109079, 1012698375, 1027116933) + + W(3, -1094644889, 1023495179, -1107590588, 1024116594) + + W(4, 1006747746, -1098426505, -1088923256, -1097246285) + + W(5, 1057877820, 1033746004, 1041863252, 1022736621) + W(6, 1039555654, 1048291572, 1059475506, 1054502102) + + W(7, -1093203288, -1098003683, -1105649846, -1114921814) + + W(8, 1033838821, 1024741190, -1120760050, 1019707757) + W(9, 1048977331, 1036081339, 1041797102, -1127589064) + + W(10, -1159624430, -1124153911, 1033833840, 1010228666) + + W(11, -1114819581, -1110624834, -1119454813, -1122201606); + sum2 = + W(0, 1015245257, -1113948506, -1130594159, 1007533655) + + W(1, -1122336092, -1131246557, -1121042747, -1112003767) + + W(2, -1113301472, -1150409563, -1113241340, 988101766) + W(3, -1114338752, 1042344950, 1024929700, 1034588627) + + W(4, -1126889814, 1027745966, 1053517180, -1115083078) + W(5, -1120298083, 1009652067, 1023796132, 1015099871) + + W(6, -1122805777, -1121614859, 1035094088, -1117590123) + W(7, 1041346715, 1010321235, 1022595647, 1021357977) + + W(8, 1024783162, 1024732276, 1035927962, 1033594898) + + W(9, -1136757529, -1112303516, -1107129305, -1116844702) + + W(10, -1125306444, -1120982285, -1117285071, -1115586407) + + W(11, -1179946326, -1122655190, 1031780006, -1109817399); + WS(1056759150, 1060224665); + sum1 = + W(0, -1139374311, 995010733, -1111414410, -1108849608) + W(1, 1028987391, 1016981889, -1123115291, -1129401942) + + W(2, -1132085157, 1023919167, 1047983919, 1035204919) + W(3, 1044747100, 1009635916, 1026679904, -1133052010) + + W(4, -1099925456, -1105275165, -1089721802, 1047380996) + + W(5, -1111752399, -1106656308, -1119632759, -1103728616) + + W(6, 1041263149, -1143162806, 1045591848, 1054640011) + W(7, -1086265361, 1052567064, -1119813375, 1036660778) + + W(8, 1033127353, 1020125661, 1047176279, -1109178223) + W(9, 1047077327, 1025513390, 1020940735, 1026259564) + + W(10, -1131329248, -1128574472, -1124813330, -1115433611) + + W(11, 1014274699, -1114033239, -1135589654, -1154487021); + sum2 = + W(0, 1023227060, 1023565277, 1023373012, -1127246210) + W(1, 1035525242, -1115895934, 1032252451, -1115664904) + + W(2, -1114834111, -1123243930, -1110717616, -1119831250) + + W(3, 995075850, -1112704991, -1137853837, -1177558227) + + W(4, -1123255684, 1036838581, -1121973236, -1128787384) + + W(5, -1106791563, 1017209933, 1025363014, -1117762720) + + W(6, -1111609489, -1109001470, -1106028739, 1068968933) + + W(7, -1084327071, 1049794788, -1103092626, 1033559138) + W(8, 1029177075, 1046335474, 1040383540, -1085459757) + + W(9, 1055427968, -1106438120, 1039281515, -1108939748) + + W(10, 1009084849, -1110362282, 1030364025, 1038001226) + + W(11, 1004844681, -1109625554, 1026824663, 1027051057); + WS(1059198391, -1114206899); + sum1 = + W(0, -1123230572, 1033309054, -1136657179, 1042361008) + W(1, -1127872354, 1026831155, 1034821095, 1027013917) + + W(2, 1047908609, -1113872057, -1131612168, 1032838544) + W(3, 1018582917, 1025662981, -1122684754, 1042918755) + + W(4, -1086695351, 1005036838, 1053830093, 1063074340) + W(5, 1022976638, 1048968528, 1037218004, 1045668084) + + W(6, -1111534963, -1127426130, -1097279138, 1032841926) + + W(7, -1102974814, -1086802103, -1094977286, -1080167184) + + W(8, 1041894153, 1035651728, -1114797926, 1042266564) + W(9, 1036160183, 1043048448, 1028546130, 1051954532) + + W(10, -1168813170, 1029018614, 1015674230, -1115081892) + + W(11, 1022213546, -1119589535, 1023015663, -1121567905); + sum2 = W(0, -1109294951, 1044771761, -1106240469, 1037653814) + + W(1, -1132138943, -1129034439, 1027920896, -1126749735) + + W(2, -1116747636, -1095594447, -1091993541, -1098134808) + + W(3, 1045429231, -1112675284, 1030264036, 1027709116) + W(4, 1053044316, -1102224225, 1065361960, 1060397410) + + W(5, -1095097189, -1139768526, -1100471477, -1095674438) + + W(6, -1093594252, 1044254591, -1103264547, 1059446961) + + W(7, 1053539276, -1147713757, -1115698004, -1131922215) + + W(8, -1105874671, -1148207325, -1098859579, -1110887683) + + W(9, -1103270924, 1018090127, -1105560593, 1044415945) + + W(10, 1036768486, -1122217612, 1038496462, -1106764847) + + W(11, 1035231626, -1112984312, 1037287074, -1106415399); + WS(-1081905372, 1072993545); + sum1 = + W(0, 1004609681, -1113931058, 1017897178, -1110350900) + W(1, -1119842647, 1029593625, -1114320538, 1026419555) + + W(2, -1111485397, 1044870886, -1101161424, 1042868018) + W(3, 1016958866, 1036666966, 1034341084, -1123516147) + + W(4, -1100618406, -1103601459, -1117978262, -1088871615) + + W(5, -1096217303, -1090419947, -1105396084, -1100180286) + + W(6, 1052555682, 1050421002, 1053397115, 1057434595) + W(7, 1037835279, 1054502387, 1036260396, 1041011339) + + W(8, -1113666277, -1125853837, -1109207833, -1108715676) + + W(9, 1041223333, -1131918060, 1046093262, -1108472674) + + W(10, -1113131956, -1119475260, -1119057377, -1116054255) + + W(11, 1033629886, 1019600139, 1034832815, 1025124935); + sum2 = W(0, 1027207918, -1131003531, -1155176792, -1144704129) + + W(1, -1120277627, 1018692534, -1122116985, 1016313728) + + W(2, -1134820995, 1019005665, 1018656479, 1016837667) + W(3, -1133755465, 1007330736, 1008190855, 1024160458) + + W(4, -1123507780, 992028222, 1020777698, -1093100477) + W(5, -1106617270, 1026210395, 1015481059, 1009441727) + + W(6, 1022927690, 1039006609, -1108026125, -1075529389) + + W(7, -1071234400, -1098388857, 1043410538, -1127804151) + + W(8, -1148644129, -1114458430, 985006155, -1165905039) + W(9, 1009164120, 1080134310, 1068769301, 1038162442) + + W(10, -1124904791, 1019252639, 1019665619, -1148497627) + + W(11, -1154476856, 1041946375, -1120913968, -1102924087); + WS(1052536174, -1151096569); + sum1 = W(0, 991116371, 1033302347, -1116642336, -1115536654) + + W(1, 1020657940, -1114833734, 1031490598, -1158391502) + + W(2, -1128173243, -1146822742, 1036050892, 1034768509) + + W(3, -1102372039, 1030675614, -1114628406, 1032401267) + + W(4, -1103836723, 1034951935, -1087917523, -1106200391) + + W(5, 1061554222, 1041046871, 1046795201, 1027714602) + W(6, 1032573088, -1120898050, 1057405287, -1120590821) + + W(7, -1082912644, 1002819162, -1124848916, -1124036191) + + W(8, 999976938, -1138114279, -1098834165, -1118223722) + + W(9, 1047922098, -1107937520, 1038688870, -1118805976) + W(10, 1037991630, 1035558856, 1042054293, 986260550) + + W(11, -1130396508, 1023135729, -1142052488, -1177279769); + sum2 = W(0, 1035223119, -1127800761, 1038890181, 1028905699) + W(1, 994981383, -1127955051, 998786660, -1121293280) + + W(2, 1038869307, 1034423710, -1109261585, -1095895125) + + W(3, -1098712671, 1032845262, 1030375171, -1114148994) + + W(4, -1108836158, -1116666352, -1087753137, 1061176216) + + W(5, -1099737664, -1208820627, -1126035264, 1042226462) + + W(6, -1105867416, -1109342419, 1027333841, 1057224086) + + W(7, 1049674522, 1011854042, 1017325847, -1120003540) + + W(8, -1106282608, 1047028407, -1148256348, -1148022324) + + W(9, -1103462952, 1043242553, -1121350765, -1117125009) + + W(10, 1028503999, -1119414296, -1113209005, 1010099974) + + W(11, 1020393479, -1115953239, 1024565993, 1001260628); + WS(1058902967, -1081860445); + sum1 = + W(0, -1121371387, 1029881036, 992316765, -1117974353) + W(1, 1019164800, -1115308289, 1031905998, -1118946572) + + W(2, -1116017491, -1110722656, -1103068528, -1120254383) + + W(3, -1111729689, -1123116948, -1110978129, 1027465948) + + W(4, -1114517185, -1096281750, -1110556335, -1087192661) + + W(5, -1138608617, -1119671953, 1026716344, 1026550240) + W(6, -1144385454, 1046612526, 1050079932, 1061346066) + + W(7, 1054224317, 1023689473, 1034730016, 990814541) + W(8, 1031405875, 1032371736, -1114542190, -1113719056) + + W(9, -1147587566, -1121094047, 1032702160, 1025765741) + + W(10, -1133995267, -1118231237, 1037331941, -1117606232) + + W(11, 1027634660, -1114416951, -1150819433, 1002408318); + sum2 = W(0, -1127268449, 1008157504, 1022079949, -1129508015) + W(1, 1023435994, 987488696, -1149203238, 1025441916) + + W(2, 1017520494, -1110533731, -1110799425, 1038116680) + + W(3, -1149062134, -1109564641, 1031926637, -1140288129) + + W(4, 1046612660, 1053115740, 1042237616, -1081939523) + W(5, 1046590815, 1019421448, 1025089506, 1002014090) + + W(6, -1104246964, -1126879265, 1071620340, -1082767624) + + W(7, -1091995420, -1133233221, -1113723868, 1008464055) + + W(8, -1098833757, -1103206877, 1047260740, 1046386206) + + W(9, 1034566387, -1113663072, -1131415815, -1120607589) + + W(10, 1019779427, -1135658469, -1112586418, 1021781126) + + W(11, 1021597755, 1025921212, 1022181144, -1133866981); + WS(-1118927728, -1114990634); + sum1 = W(0, -1123938375, 1040612950, 1024746402, 1022214714) + + W(1, 1038811590, -1112630087, -1118622728, 1031232344) + + W(2, 1033195056, -1114716774, 1048819881, -1104426015) + + W(3, -1105195831, 1042575344, -1098438774, 1038434900) + W(4, 1057535917, 1047260544, 1042772673, 1057677234) + + W(5, 1045869257, 1057533694, 1042859777, 1055588422) + + W(6, -1087859524, -1132924433, -1087499341, -1097320317) + + W(7, -1091890215, -1089715893, 1029276300, -1091230428) + + W(8, -1107191040, 1007112943, 1043648426, -1093740782) + + W(9, 1042013107, 1020754614, -1107815558, -1113991309) + + W(10, 1047574307, -1106834116, 1044210486, 1028537764) + + W(11, -1106862316, 1047539199, -1107232885, 1041569343); + sum2 = W(0, -1117938617, 1034943831, 1047294563, -1112881764) + + W(1, -1113196518, 1017166837, -1119652380, -1122537978) + + W(2, -1098776947, -1074997876, -1067348911, -1073328658) + + W(3, -1106856879, 1007574096, 1040326435, 1003760381) + W(4, 1052841626, 1071950042, 1078478928, 1075942353) + + W(5, 1048374094, -1110198115, 1016518417, -1132261857) + + W(6, -1111689798, 1008522816, 1042633900, -1105497105) + + W(7, -1100859969, 1027760421, -1106280857, -1146348222) + + W(8, -1101990052, 1023979086, -1106116215, 1040726051) + + W(9, -1128120408, 1041816709, 1015116440, 1015700123) + W(10, 1034353164, 1019125592, 1021696573, 1032192788) + + W(11, -1129459590, -1114781060, 983174391, 1019612376); + WS(1034111416, -1106797037); + sum1 = W(0, -1127934684, -1146675705, 1006977829, -1113401378) + + W(1, 1019549798, 1016064490, -1139061950, 998716411) + W(2, -1113852291, 1035613338, 1034804131, 1037672145) + + W(3, 1044038057, -1106829090, 1033066250, 995721454) + + W(4, -1096035023, -1102929642, -1090308252, -1089088820) + + W(5, -1096624416, -1097224209, -1104516203, -1095532026) + + W(6, 1052464285, 1042719307, 1054858571, 1057164897) + W(7, 1050796251, 1048920159, 1042039981, 1049209393) + + W(8, 1032415443, -1114220817, 1032020487, -1123663635) + + W(9, 1035431737, -1131720964, -1114943722, 1041424208) + + W(10, -1113420426, 1025128440, -1114922591, -1136503085) + + W(11, 1026704599, -1109868785, 1024811962, -1138798477); + sum2 = W(0, 1018373307, -1117669473, 1036793172, -1107254646) + W(1, 1027210469, 983011887, -1124389554, 999841656) + + W(2, 1030944977, 1035483586, -1120221588, -1138388666) + + W(3, -1119036598, 1026801669, -1120993070, 1036234905) + + W(4, -1120549779, -1113169149, 1031305133, -1118729068) + + W(5, -1123944089, -1136088418, 1045466087, -1110162376) + + W(6, -1139755202, -1114451942, 1047991436, 1050438576) + + W(7, 1058194810, -1103576008, 1037255439, -1114267729) + + W(8, -1101691927, -1102665013, -1083948126, -1083351573) + + W(9, -1081291530, -1106933299, -1095248620, -1124771645) + + W(10, 1049483493, 1049560407, 1057078402, 1060878230) + + W(11, 1058504911, 1044728114, 1047223280, 1036725012); + WS(1038841272, 1052605132); + sum1 = + W(0, 1031922765, -1104568331, 1037544250, -1109808312) + W(1, -1115625903, 1042593752, -1105481799, 1033924054) + + W(2, -1100459309, 1046914264, -1120141702, -1117060814) + + W(3, 1046551204, -1097718198, 1032086688, -1112841053) + W(4, 1037270288, 1041702805, -1098675705, 1045728636) + + W(5, 1017164043, 999474559, 1031450455, 1034794943) + W(6, 1026910357, -1101939446, 1040827436, 1037079325) + + W(7, -1095425143, 1046662664, -1103113592, 1015870568) + + W(8, 1023447506, -1114279623, 1048352911, -1115507167) + W(9, 1040518727, 1038294495, -1106032688, 1041969331) + + W(10, -1104596348, 1044685961, -1104877098, -1117405559) + + W(11, 1032200833, -1104511859, 1039045107, -1111795079); + sum2 = W(0, -1119788132, 1033659476, -1112158198, 1008462738) + + W(1, -1128623485, -1135723434, 1030330775, -1125624097) + + W(2, 992683382, -1104347191, 1044081475, 1034564598) + W(3, 1037093866, -1118342628, 1008221186, -1116661382) + + W(4, 1018867293, 1020892153, -1090780387, -1098943438) + + W(5, 1024702018, 1037085984, -1108937272, 1041747819) + W(6, 1022669528, 1043646320, 1053457206, -1103925357) + + W(7, -1094689316, -1130567667, -1111881166, 1006874186) + + W(8, 1044098145, 1022003003, 1053806225, 1061138285) + W(9, 1061570617, 1042502677, 1045330453, 1015917808) + + W(10, -1102594356, -1105788334, -1097169858, -1089462725) + + W(11, -1090351234, -1124000960, -1102638867, -1119261652); + WS(1059476151, -1123203418); + sum1 = W(0, -1111725774, 1032359159, -1110577724, -1105544893) + + W(1, -1121304930, -1115245634, 1036887935, -1110517831) + + W(2, 1035594491, 1034919857, -1111760306, 1046155316) + W(3, 1044165509, 1020829292, 1039852002, -1120384574) + + W(4, -1091810916, -1140486487, -1084838663, -1086139015) + + W(5, -1095808892, -1096673622, -1127813812, -1090491960) + + W(6, 1057461865, 1048140086, 1060577506, 1052038472) + W(7, 1057513991, 1053266340, 1045123672, 1055106407) + + W(8, 1016189354, 1034245225, -1104347695, 1027870402) + + W(9, -1103056264, -1108853472, 1031021091, -1133152957) + + W(10, -1123857235, 1028750247, -1113205590, -1121460986) + + W(11, -1148349487, -1113141864, 1036934292, 1011178567); + sum2 = + W(0, -1114868977, -1107973502, 1044770988, -1101288212) + W(1, 1025917421, 1028043472, -1111158861, -1123193100) + + W(2, 1026556603, -1115461868, -1104823400, -1105554340) + + W(3, 1036199790, -1116199065, 1020651575, -1128075734) + W(4, 1004734644, -1092079110, 1059587552, 1045430990) + + W(5, 1037874646, -1137785064, -1093651456, -1127404110) + W(6, 1034344926, 1042028492, 1024895663, 1050688149) + + W(7, 1047334362, -1116948841, 1044938016, 1042458099) + W(8, 1040708934, -1103991549, 1051421807, -1095880897) + + W(9, -1118101029, -1122024357, -1099771430, 1007412048) + + W(10, -1131620842, -1105590488, 1029419915, -1114582112) + + W(11, 1015496806, -1121536685, -1121478353, -1127827256); + WS(-1096078190, -1082738059); + sum1 = + W(0, 1007239809, -1114850361, -1130257143, -1112210107) + W(1, -1118665957, 1028242343, -1116764258, 1022403683) + + W(2, -1108860284, 1046670329, -1103368477, 1045976117) + W(3, 1029494103, 1036298605, 1029804679, -1128309634) + + W(4, -1100207850, -1101169270, -1116530972, -1088435015) + + W(5, -1092482434, -1090334611, -1105280439, -1099682433) + + W(6, 1053165251, 1050939564, 1051252601, 1056131912) + W(7, 1045571555, 1053021861, 1035862579, 1038809821) + + W(8, -1112013420, -1126100266, -1112810720, -1124484747) + + W(9, 1041969097, 1032260218, 1044490698, -1114977769) + + W(10, -1115685558, -1124400725, -1112871192, -1117830909) + + W(11, 1031308937, -1143992478, 1037078646, 1016808747); + sum2 = W(0, -1133820219, -1147891684, -1127336652, -1127200453) + + W(1, 1020736496, 1001166860, 1022486646, -1135690985) + W(2, 1027229337, 1032424255, -1137665638, 1045946307) + + W(3, -1116510358, -1145031593, -1116471963, -1126621635) + + W(4, -1115513384, -1107406978, 1037916056, -1096925824) + + W(5, 1031285965, -1138759126, 1020254812, -1122394148) + + W(6, 1007940354, -1125237780, 1044701152, 1067148595) + W(7, 1076670751, 1039470145, -1109537872, 1025436583) + + W(8, -1156542700, 1031863482, -1113898133, 1048747828) + + W(9, -1101339101, -1070343554, -1082365934, -1107321525) + + W(10, 1020775992, 994071912, -1127018949, -1115116116) + + W(11, -1122694416, -1106720041, 1034791139, 1039293842); + WS(1056919406, -1123699093); + sum1 = W(0, -1153021483, 1016658279, -1169964908, -1131540465) + + W(1, -1116724456, 1018808083, 986184318, 1026972628) + W(2, 985933670, -1142160193, 1032391598, -1109380555) + + W(3, -1112807501, -1115139838, 1023499017, -1119658051) + + W(4, -1089586019, -1106728023, -1095447822, -1095937215) + + W(5, -1092279079, -1105250414, -1104943256, -1093497009) + + W(6, 1058308826, 1043832952, 1054485203, 1051425640) + W(7, 1057168451, 1053123845, 1034402292, 1056025192) + + W(8, -1122912091, -1111941676, -1114359010, 1038539876) + + W(9, -1129000267, -1105627696, 1011544866, -1129701482) + + W(10, -1130942473, -1162334614, -1115887538, 1035573952) + + W(11, -1120065804, 1037216107, -1114397383, 1031803900); + sum2 = W(0, 1034281368, -1126716121, -1121241308, 1045372780) + W(1, 1035929285, 1047600787, 1004087438, 1041718259) + + W(2, -1104410341, 1032410612, -1087414339, -1068615761) + + W(3, -1067644471, -1091405946, -1118166494, -1097556864) + + W(4, 1018060402, 1017706532, 1061712823, 1078313037) + W(5, 1079888634, 1048822788, 1023636550, 1035128990) + + W(6, -1138447737, -1115589617, 1021983592, -1100339818) + + W(7, -1123293195, 1030149270, -1120625820, 1021734756) + W(8, 994323516, 1029627322, -1133709215, 1015111478) + + W(9, 1023885100, -1124744731, 1010097407, 1009567515) + + W(10, -1140256393, -1133676977, 1012505315, -1130902073) + + W(11, 1028720332, -1123320040, 1022959192, -1136405679); + WS(1057577783, -1116545908); + sum1 = W(0, -1140559047, -1119858755, 1001413734, 1019558160) + + W(1, 1027838711, -1123065945, -1133184076, -1116764451) + + W(2, 1023488522, 1007841757, -1099448121, -1135636631) + + W(3, -1106014610, -1112832085, -1132115376, 1007686986) + + W(4, 1031631673, 1034355893, 1034820815, -1095265297) + W(5, -1133110549, 976310772, 1031909175, 1033492939) + + W(6, -1127758170, -1102068668, -1139646818, 1043309332) + + W(7, 1058446926, 1018622064, 1033516923, 1033353766) + W(8, 1037581685, 1038802963, 1020321573, -1118918103) + + W(9, -1104027725, -1110623851, -1124259695, -1114622946) + + W(10, -1129099776, 1023940956, 1023108226, -1133216315) + + W(11, 1027058075, -1123708581, 1025545342, -1118432359); + sum2 = W(0, -1139693312, 1036960926, -1143311649, 990661185) + W(1, 1015972640, 1000525745, -1129692664, 1028832752) + + W(2, -1124752720, -1121090060, -1099787410, -1112556974) + + W(3, -1123282486, -1104610584, 1028371280, -1104217347) + + W(4, -1098950560, -1103693150, 1033289622, 1052753541) + + W(5, -1106573325, 1031872996, -1115662969, -1115847157) + + W(6, 999696497, 1034222778, -1104157082, 1058657457) + W(7, 1042484509, 1044261031, 1026599244, 1041506121) + + W(8, -1111434581, -1119707404, 1018041096, -1108624084) + + W(9, -1111132399, -1121815492, 1018446608, -1129135268) + + W(10, 1026280044, 1014405392, -1121205834, 1023217352) + + W(11, 1005957425, 1017712752, -1139874592, 1010211304); + WS(1063874743, -1123600943); + sum1 = W(0, 1026726381, 1005084141, -1121313992, 1022502021) + W(1, 1010678471, 1012880846, 1016038684, 1031948511) + + W(2, -1110972995, 1029034162, 1029564141, 1019350337) + + W(3, 1021423943, -1112342611, 1036724585, -1096649610) + + W(4, -1088392527, -1096434085, -1088422197, -1089197156) + + W(5, -1089730182, -1099324833, -1105649226, -1102131796) + + W(6, 1060534134, 1052968261, 1061531727, 1048937234) + W(7, 1053585019, 1049533342, 1044791660, 1047748258) + + W(8, -1131352649, -1125442370, -1111100967, 1007055431) + + W(9, -1124123103, 1037169096, -1119334386, 1048887628) + + W(10, 1017113381, 1023149165, -1121647548, 1028622922) + + W(11, -1132301739, -1122598880, 1017220849, -1134858375); + sum2 = + W(0, 1041516351, -1114001722, 1031962338, -1127882717) + W(1, 1024371132, -1116893380, -1137233618, 1035584360) + + W(2, -1098661524, -1113317539, 1041960143, -1113172562) + + W(3, 1057245216, -1108932190, 1040530840, -1090505328) + + W(4, 1065773241, 1066164852, -1094243603, -1071023147) + W(5, -1087722937, 1043021464, 1059923771, 1062948018) + + W(6, 1067471192, 1062194047, -1131590099, -1071391818) + W(7, -1082288010, 1036914992, 1056604249, 1065534266) + + W(8, -1095722385, 1029392016, 1045112423, 1027735196) + W(9, 1047570295, -1110460182, 1008215114, -1096088381) + + W(10, 1025030832, 1015621429, 1033273068, -1106774969) + + W(11, 1021784721, -1147670187, -1157997580, 1025226110); + WS(-1081605212, 1037230241); + sum1 = W(0, -1129286954, -1127382348, -1114123448, -1119205995) + + W(1, -1116053850, -1114061454, 1024011222, -1165173963) + + W(2, -1115600951, -1127078325, 1045220821, 1032978341) + W(3, 1031622828, 1039357911, 1020277751, 1026874614) + + W(4, -1139829872, 1037397159, -1103957592, 1057561887) + + W(5, 1057799156, -1103125195, 1035843369, -1159950147) + + W(6, 1042245092, -1101819637, 1057239854, -1089716883) + + W(7, -1088291628, -1162281827, -1111135597, -1144308089) + + W(8, -1130516890, 1025459530, -1098019463, 1040837167) + + W(9, 1039979404, -1123433113, 1008116332, -1115664788) + + W(10, -1191245347, -1140137724, -1135821456, -1153142562) + + W(11, -1123070334, -1115244132, 975751222, -1121723210); + sum2 = W(0, -1129847377, -1132201467, -1111059277, 1032250249) + + W(1, 1003251981, -1175110606, -1119100754, 1007928974) + + W(2, 1027890930, -1115667911, -1109124506, -1115518668) + + W(3, -1131706033, 1033851379, 1008685286, -1130851063) + + W(4, 1045384717, -1139027758, 1062718876, -1088514518) + + W(5, 1043614591, -1096199608, 1038009999, -1126833063) + + W(6, -1131041629, -1086235324, 1071241567, -1104078593) + + W(7, -1091065468, 1021865867, -1113376611, -1120766781) + + W(8, -1118537275, 1015945835, -1090110249, 1050303031) + + W(9, -1130925231, 1030828678, -1128909271, -1121346672) + + W(10, -1129495121, 1022067627, -1139816838, -1109320206) + + W(11, 1035917053, -1140186118, 1027374356, -1130315761); + WS(1048635758, -1111558989); + sum1 = + W(0, -1116715915, 1007517554, -1125319757, -1130676803) + W(1, 1032051720, -1122176818, 1019813529, -1125995833) + + W(2, -1114167026, -1144951432, 1032434734, -1116349759) + W(3, 1007313161, 1037795522, 1011561671, 1022555096) + + W(4, 1019884197, -1100411873, -1082609609, -1099356457) + + W(5, -1114189151, -1098216348, -1118483848, -1115419480) + + W(6, 1046236914, 1042364482, 1057088310, 1060062511) + W(7, -1105629450, 1032549225, -1156935944, 1017135051) + + W(8, 1023679491, 1030303424, 1025882348, 1027068912) + W(9, 1046455412, 1037080648, 1024380849, 1020138940) + + W(10, -1123924777, -1115625243, 1018952757, -1117219752) + + W(11, -1128015465, -1117338239, 1001454266, 1015509889); + sum2 = W(0, 1017200252, -1128076598, 1020177744, 1027061114) + + W(1, -1120062015, 1007295183, 1005463470, -1120999608) + + W(2, 1032764106, 1032749056, 1042154489, -1091917968) + + W(3, -1115647155, -1109350747, -1136438311, -1152745757) + + W(4, -1100965710, 1036328960, -1079875623, 1069362278) + + W(5, 1041923814, -1121245377, 1023734232, -1115720719) + + W(6, -1120952053, -1105592489, -1093732085, 1053281179) + + W(7, 1053015354, 1023497366, 1044015507, 1040619345) + W(8, 1023440400, 1037836738, -1110726007, -1110949820) + + W(9, -1097734576, 1029656316, -1107014120, 1039138178) + + W(10, 1026555164, -1121478225, 1032334674, 1004458190) + + W(11, 1030547292, -1115087241, 1024950244, -1107079388); + WS(1057226679, -1099093504); + sum1 = W(0, -1117743115, -1111361838, -1142218540, -1115584496) + + W(1, -1144474236, -1112915081, -1118048876, -1124754680) + + W(2, -1106860569, -1097721634, 1017711998, -1098477656) + + W(3, 1017808579, -1127808199, -1110778360, 988685674) + W(4, 1059123761, 1043835217, 1054886149, 1036645937) + + W(5, -1096319852, -1102898152, -1108186916, -1103594844) + + W(6, -1116606854, -1113320356, -1098795498, 1036044245) + + W(7, 1058878095, 1054951826, 1042821748, 1057715322) + W(8, -1117312579, 1021938430, 1024346219, -1113074392) + + W(9, -1113306631, -1104150268, -1109837016, -1104945799) + + W(10, -1126837697, -1108681130, -1128001843, -1126342351) + + W(11, -1145404316, 1022603516, -1113519979, -1166667748); + sum2 = + W(0, 1017552406, -1121365003, 1024315197, -1126393870) + W(1, 1006096662, 1026122801, -1115019758, 1010820131) + + W(2, -1115134458, -1113297695, -1121331284, 1034056828) + + W(3, -1116036592, -1122098200, -1138309587, -1114451237) + + W(4, -1123239700, 1033578978, 1032104202, -1122610502) + + W(5, 1042239151, -1128246386, -1130645774, 1021632898) + W(6, 1040415751, -1119377084, 1033268884, 1042552247) + + W(7, 1014688747, 1038912262, 1011328923, 1013103251) + W(8, 1024802817, -1140510683, 1031096569, 1027588477) + + W(9, -1116363642, -1106292650, -1119712705, -1106135611) + + W(10, -1116030864, -1154029132, -1127078294, -1123710517) + + W(11, -1142638070, 1002524342, -1123496021, 1026182445); + WS(-1108758968, -1120615143); + sum1 = + W(0, 1007512449, -1118729201, 1033236958, -1188181540) + W(1, 1032455763, -1139132956, -1126666947, 1028445809) + + W(2, 1043847294, -1115009907, 1038269372, -1103491829) + W(3, 1026842103, 1028990457, -1112992067, 1045480960) + + W(4, 1041722714, 1047642150, 1052029054, 1056274631) + W(5, 1057598894, 1044856958, 1049081300, 1008203541) + + W(6, -1089504654, -1097300100, -1092318719, -1092329088) + + W(7, -1088834696, -1094694701, -1102944265, -1095636207) + + W(8, 1035899020, 1024857813, 1041772976, -1115586563) + W(9, 1037648114, 1028932916, 1031373190, 987483733) + + W(10, 1021562716, -1157490338, 1033997944, -1127937658) + + W(11, 1034853541, -1139535439, 999073631, 1033314299); + sum2 = + W(0, 1022601823, 1027503424, -1114440342, 1031020236) + W(1, -1115479573, 1028798660, -1137878778, 973255146) + + W(2, -1119857460, 1016942723, -1113768249, 1049278985) + W(3, 1023747258, 1008539869, 1030670036, -1124354630) + + W(4, -1099325942, -1112391205, 1050839307, -1097330938) + + W(5, 1019565806, -1108724816, -1143955309, -1115374863) + + W(6, -1068582801, -1076271776, 1067690352, 1077639092) + W(7, 1061065209, -1120523343, 1002861982, 1029925423) + + W(8, 1035739756, -1104095012, 1026494027, 1047876791) + W(9, 1016405011, -1115660355, 1022661839, 1033007729) + + W(10, 1015907333, 1016973548, -1122697579, 1015148595) + + W(11, -1106941761, 1032414836, -1126087053, -1124658022); + WS(-1125070560, -1096513533); + sum1 = W(0, -1112401838, -1141896047, -1114813980, -1125005414) + + W(1, 1026386210, -1115056418, 1012901881, -1125623196) + W(2, 1032850683, 1035442769, 1027743049, 1036941992) + + W(3, -1104378805, 1037833707, 1022681350, 1033887999) + + W(4, -1111199410, -1105684773, -1093508577, -1099350541) + + W(5, 1060063436, -1112618105, 1035294797, 988362813) + W(6, 1046757622, 1047296038, 1061969278, -1107426238) + + W(7, -1092774776, 1028130403, -1127381572, 1016528878) + + W(8, 1033951818, 1013771590, -1100008383, 1023589122) + + W(9, -1122038496, -1110298148, 1030080099, -1106008748) + + W(10, -1110786345, -1113414691, -1131095256, -1114443933) + + W(11, 996299870, -1117830096, -1140100259, 1014753608); + sum2 = W(0, -1128089453, -1110645236, -1130916401, 1026446699) + + W(1, -1115610756, 1032679495, -1114433002, -1123355757) + + W(2, 1024340419, 1043920397, -1129344777, 1009781987) + W(3, -1102796808, 1037523581, 1023912055, 1026431795) + + W(4, -1102023306, -1114712453, 1028225499, 1057874897) + + W(5, 1052660862, -1102216434, -1127455825, -1128264837) + + W(6, -1103821003, -1097377481, 972074333, 1059140954) + + W(7, 1038144249, -1107293486, 1006589878, -1102041035) + + W(8, 1043342989, -1109265540, -1100613575, -1103696793) + + W(9, -1116201867, -1131885037, -1105206442, -1127587329) + + W(10, -1119644228, 1026656603, 1034952995, 1032660433) + + W(11, -1130501689, 1029362471, 1013212643, 1005668278); + WS(1049867118, 1034735186); + sum1 = W(0, -1127774262, -1117373036, 1031064438, -1112922680) + + W(1, 1012648832, -1132535687, -1120670652, -1140537009) + + W(2, 1029333619, -1123455456, -1105261096, -1096141178) + + W(3, -1120189874, 1024540628, -1138107141, 1000234461) + + W(4, 1019113028, 1040322517, 1040279186, -1101685436) + W(5, 1044944438, -1121818673, 1035373868, 1032620736) + + W(6, 1024964758, 1032014380, 1048588372, 1050135703) + W(7, 1034886579, 1040490120, 1016312768, 1034120602) + + W(8, 1007980364, 1019723167, -1114399774, -1100797936) + + W(9, -1113398479, -1150021355, -1128775361, 1008873398) + + W(10, -1121402761, -1118901061, -1126411220, -1110911420) + + W(11, 1019321608, -1114680743, -1121234663, -1121766352); + sum2 = + W(0, -1161289046, 1020587590, 1029682388, 1031608572) + W(1, -1117304231, -1129471662, 965398246, -1134569151) + + W(2, -1111556088, -1127668568, -1095922552, -1092239431) + + W(3, -1165373610, -1120133906, 1007233453, 1019046119) + W(4, 1038429491, -1130067243, 1050898724, 1058359401) + + W(5, 1040200303, 1044552317, -1132308256, 1031851372) + W(6, 1024158411, 1018324827, -1123472030, -1093717514) + + W(7, -1118204561, -1112781150, 1017795291, -1120826542) + + W(8, -1123794133, 1035096674, -1142905112, 1042534485) + + W(9, -1137719883, -1136196985, 1027736448, -1128305748) + + W(10, 1016121349, -1127328688, -1126947701, -1126252937) + + W(11, -1122434117, -1137031592, -1121369248, -1162116006); + WS(1063598519, 1040709546); + sum1 = + W(0, 989424433, 1025004011, -1117397173, 1010227902) + W(1, -1116859551, 1035862832, 1012428267, 1028295307) + + W(2, -1129964132, 1018517694, 1036280904, 1042042835) + W(3, 1025484624, -1108371497, 1028794752, -1105766207) + + W(4, -1092181324, -1096845618, -1092686069, -1082263275) + + W(5, -1087946945, -1124000752, 977020321, -1108973663) + W(6, 1056340507, 1052096915, 1055848084, -1117189370) + + W(7, 1053023013, 1053676604, 1044581128, 1048031389) + W(8, -1140166214, -1124688156, 1027380346, 1041673920) + + W(9, 1025279965, 1021321051, -1125256895, 1035434166) + W(10, 1007420926, 1025298052, -1114706068, 1030527159) + + W(11, 1004378644, -1130325786, 1025029349, 1015026205); + sum2 = W(0, -1128989779, -1132752301, -1121498089, -1112228563) + + W(1, 1023519830, -1111737432, 1023675120, -1134051546) + W(2, 1040099849, 992269838, 1034828720, 1034859451) + + W(3, 1034954038, -1122349299, 1019899084, -1112348174) + + W(4, -1100874000, 1034251701, -1104384455, 1044543345) + + W(5, 1046406891, 1028583216, -1114022376, 1040182737) + + W(6, 1021993174, -1130867684, -1113539068, 1053848304) + + W(7, -1104908283, -1100179639, -1111378604, -1097476412) + + W(8, -1130783901, 1034483450, -1122004711, 1016645052) + W(9, 1032774629, 1016210650, 1033297067, 1025418184) + + W(10, 1011642260, -1123860313, 1016725938, -1122625223) + + W(11, 1011006880, -1114528083, 1021084026, -1141294629); + WS(1052377710, -1116561061); + sum1 = + W(0, -1122160137, -1112995181, 1021266631, 1017022397) + W(1, 1032809511, -1105019076, 1019774100, -1119221338) + + W(2, 1026711393, 1046449684, -1094207935, 1051777944) + + W(3, -1105978112, 1045042328, -1140860791, -1140595366) + + W(4, 1034438088, -1103073456, 1059878180, -1091454284) + + W(5, -1108523806, -1137740923, -1113848547, 1015748571) + + W(6, 1023922180, -1112523427, 1031595583, -1107259466) + W(7, 1059633699, -1094439010, 1048809290, 1019553093) + + W(8, -1115207840, 1036366239, -1096200621, 1043506315) + + W(9, -1105628259, 1043730779, -1114298535, -1117446555) + + W(10, 1014756539, -1110629817, 1025340632, -1122333286) + + W(11, -1126028515, -1114494718, 1024493780, -1121208702); + sum2 = + W(0, -1125003387, -1110204990, 1008672566, -1110854180) + W(1, 1015432805, 1007507570, -1129875419, -1145172348) + + W(2, 1023545558, -1122326332, 1039271760, 997586352) + W(3, 1043658401, -1126010948, -1128126180, 1018354299) + + W(4, 1001356924, 1049948311, -1104177316, -1099440370) + + W(5, -1101604747, -1112581048, 1034699764, -1118892801) + + W(6, 1019826271, -1106041547, 1040609653, 1057375034) + W(7, -1098469549, 1041033112, -1108980340, 1026776081) + + W(8, 1029018751, -1122275300, 1017003703, -1099421810) + + W(9, 1052007058, 1018898909, -1118843549, -1123423040) + + W(10, -1114113554, 1028296019, -1143932072, -1122149120) + + W(11, -1118594118, -1129527698, 1031512617, -1147650596); + WS(1066846108, 1044745002); + sum1 = W(0, 1019372186, 978233216, -1129136976, 1025331363) + W(1, -1142297744, 1015116199, 1015645340, 1016287548) + + W(2, 1049403789, -1107121557, 1041504923, -1134682116) + + W(3, 1039399714, -1122699462, -1121336819, 1026221102) + W(4, 1042475733, 1051348497, 1048713517, 1054698948) + + W(5, 1049146911, 1058118606, 1046729314, 1056609718) + + W(6, -1091781177, -1100692098, -1091573825, -1089263023) + + W(7, -1091452887, -1090043533, -1102394372, -1091564925) + + W(8, -1124410122, 1039801345, 1032893815, 1040511932) + + W(9, -1146055296, 1032222216, -1115550793, -1107840672) + + W(10, 1015897062, 1009376476, -1126291000, 1006187856) + + W(11, 1016897132, 1012743170, 1010428515, 1000566800); + sum2 = + W(0, -1121498998, 1025173682, -1127952317, -1123064681) + W(1, 1031325102, 1031547392, -1116804726, 1013263415) + + W(2, 1040076187, -1110698495, 1046879062, -1114452496) + + W(3, 1037259271, -1113826794, -1113826560, -1114840697) + + W(4, 1040991236, 1027215822, -1097422534, -1079622690) + W(5, -1113150532, 1059352243, 1032134129, 1048220488) + + W(6, -1097642453, 1032193313, -1089335507, -1070315938) + + W(7, -1080614075, 1063284099, 1075195474, 1071802337) + W(8, 1041191639, -1107046015, 1027648922, -1107556506) + + W(9, 1040688678, 1044912350, -1107091577, 1050907604) + + W(10, -1143069461, -1127878497, 1033858873, 1031644922) + + W(11, -1125227083, -1135729999, -1112123781, -1104322253); + WS(-1083170743, 1032719415); + sum1 = W(0, 1023701883, 1027723212, -1122560214, 989186599) + W(1, 1018265472, -1118377474, 1034616094, -1143849572) + + W(2, -1115388842, 1037576352, 1028066352, 1034436696) + W(3, 1046871436, 1036384970, 1041769608, 1033711598) + + W(4, -1095142736, -1104329709, -1093573195, -1091782714) + + W(5, -1090370147, -1088395265, -1092608855, -1085234190) + + W(6, -1131637740, 1047136718, 1050356544, 1058921626) + W(7, 1057401704, 1046747968, 1048250192, 1051022467) + + W(8, 1043889005, -1114738168, 1032119470, 1035779088) + W(9, -1119260798, 1026791695, 1007978244, 1035213927) + + W(10, 1012236805, -1143133226, -1126174356, 1024911192) + + W(11, 1033076018, -1122725807, 1033024419, 1028803056); + sum2 = + W(0, 1040592912, -1148866748, 1032765896, -1113675298) + W(1, 1035431068, -1111525482, 1031171080, -1111672592) + + W(2, -1091007599, 1043419584, -1111893630, -1100951705) + + W(3, 1030657616, -1123081200, 1009914590, 1048594219) + + W(4, -1122569720, -1102576481, -1114969246, 1060370086) + + W(5, 1018512847, -1112438148, 1033713452, -1120657004) + W(6, 1061904811, -1110256028, 1042199718, 1060838438) + + W(7, 1061366749, -1086083341, 1029235040, -1090315205) + + W(8, -1096410255, -1106770914, -1108992598, -1088153932) + + W(9, -1091610254, 1039676388, -1104419583, 1040642594) + + W(10, -1107753434, 1043044202, -1138614142, -1121677972) + + W(11, 1049599377, -1117594428, -1154941432, 1041324320); + WS(-1087374135, 1068569819); + sum1 = + W(0, 1034522569, -1114460210, 1040675195, -1156322949) + W(1, -1126356143, 1038944141, -1123272884, -1147588893) + + W(2, 1036038485, -1134485343, 998999958, -1102898978) + W(3, 1032174021, 1032843110, -1112707068, 1041667373) + + W(4, 1051494643, 1048850073, 1055860825, 1058980799) + W(5, 1050366134, 1048730421, 1043911796, 1049367775) + + W(6, -1092286050, -1097395434, -1093950865, -1086427635) + + W(7, -1097745188, -1098221875, -1095510475, -1093210118) + + W(8, 1024631242, -1155697773, 1034953465, 1036357020) + W(9, -1115522123, 1020968428, 1032316940, -1134843155) + + W(10, -1124293233, 1035227470, 1022306499, -1115248568) + + W(11, 1025097211, 1020281868, -1112095119, 1003691067); + sum2 = + W(0, 1036982689, -1109420523, 1038171016, -1114883799) + W(1, 1032698755, 1023400751, -1119043865, 1034471555) + + W(2, -1101176821, 1040154700, -1103427381, 1011961296) + + W(3, -1115041464, -1112162319, -1114657793, -1117007917) + + W(4, 1032029724, 1008871494, 1053639476, -1094943648) + W(5, 1046242469, 1015257266, 1018562568, 1031877719) + + W(6, 1031712503, 1051308638, -1103617514, -1090481186) + W(7, 1048516585, -1110670159, 1026474691, 1044794303) + + W(8, -1095262307, -1089037290, -1077227331, -1077304111) + + W(9, -1075605762, -1086532256, -1115849955, -1110424851) + + W(10, -1135236510, 1036178124, 1056219784, 1063074442) + + W(11, 1070767205, 1074120487, 1066414901, 1052188053); + WS(-1094340206, 1025238393); + sum1 = W(0, 1025401267, -1120317764, 1029217422, 1017691154) + W(1, 1015273200, 1006374863, -1149759301, 1023921508) + + W(2, 1041212259, -1123694073, 1040075594, -1128349902) + + W(3, 1030937834, 1030337996, -1112880429, 1048792866) + W(4, 1051626551, 1044638395, 1051991350, 1049159169) + + W(5, 1055056667, 1045537234, 1047952828, -1109761292) + + W(6, -1087771683, -1099303356, -1089805402, -1090474853) + + W(7, -1089928234, -1095611655, -1103717662, -1097665994) + + W(8, 1026720107, 1027277160, 1042793877, 1032035372) + W(9, 1038797403, 1028636183, 1034683820, 1024357062) + + W(10, 1024873417, 1003045609, 1025974530, -1140916353) + + W(11, 1026491292, -1125445197, 1018728702, 1024842472); + sum2 = + W(0, 1016272983, -1125328223, 1019432157, -1136495190) + W(1, 1024638490, -1122054341, 1016158573, -1137665190) + + W(2, -1117564089, 1007328518, 1038058236, -1106032359) + + W(3, 1036423350, -1129861056, -1141592892, 1032273458) + + W(4, 1054344808, 1047318060, -1095657702, -1084625245) + + W(5, -1124414562, 1036648948, -1120282232, 1033205457) + + W(6, 1082928383, 1074423709, -1074337637, -1066615612) + W(7, -1087090886, 1034359725, 999766988, -1114245215) + + W(8, 1043627742, 1037006400, 1040243063, -1106132294) + W(9, -1119023275, 1004167460, 1002865564, -1113153751) + + W(10, -1113989008, -1137080694, 1017883877, -1126758430) + + W(11, 1040797418, -1113361096, 1023713345, 1022755221); + WS(-1098231918, 1035887052); + sum1 = W(0, 1007686525, -1112046456, -1136641001, 1025581173) + + W(1, -1121240420, -1165513922, -1114143760, -1123656209) + + W(2, -1117693688, -1119004197, -1104788790, -1092353842) + + W(3, -1104580134, -1146015939, -1162096818, -1117522176) + + W(4, 1048268202, 1036810732, 1055375147, 1069647932) + W(5, 1052170270, 1020096363, -1125578169, 1031911554) + + W(6, -1105099271, -1097653932, -1098720398, 1066085926) + + W(7, -1093227035, -1123833253, -1107379122, -1130540403) + + W(8, -1110112236, -1130249512, -1106155488, -1091717545) + + W(9, -1110987409, -1108464746, -1156567122, -1106840908) + + W(10, 1016554315, -1115219957, -1142876018, -1143806946) + + W(11, -1113561092, -1123809427, -1113074326, -1120698772); + sum2 = W(0, -1125891647, -1139529830, -1127048511, -1119620679) + + W(1, 1015042367, -1133002574, 1001053676, -1136336990) + + W(2, -1121500935, 1033326245, -1110257678, 1033808587) + + W(3, -1152963927, 1023704513, -1125968895, -1159911790) + + W(4, 1021750179, -1133323886, 1040835222, 1061147710) + + W(5, -1110018076, 1035246842, -1123027527, -1144777900) + + W(6, 1017645919, -1167588957, -1108825416, 1055027509) + + W(7, -1105425292, -1090179180, 1035235033, -1104047270) + + W(8, -1130193055, 1018366499, -1144215516, 1035778772) + + W(9, -1105010302, 1019226535, -1113493000, -1137733870) + + W(10, -1118741587, 1021086319, -1113356630, -1123951235) + + W(11, -1124596863, 995355927, -1135606974, -1141401292); + WS(-1081201436, -1083122818); + sum1 = W(0, 1024396773, 1040103323, -1104054160, 1042893967) + + W(1, -1121710378, -1122190892, 1038539251, 1020559724) + + W(2, -1118776317, -1121204906, 1048678635, -1101546374) + + W(3, 1036673102, -1112386175, 1022162966, -1111471555) + + W(4, -1090317103, -1098486564, -1094484293, -1101075087) + + W(5, -1095873942, -1099326495, -1101153544, -1095630377) + + W(6, 1056470156, 1048677796, 1048629197, 1052113969) + W(7, 1033707976, 1057451847, 1027207978, 1053998976) + + W(8, -1120183581, -1105729174, 1032093347, 1048228642) + + W(9, 1044099610, -1102747354, -1114063013, -1125760751) + + W(10, -1124728406, 1010393788, -1105359341, 1048587688) + + W(11, -1107414311, 1034642220, -1109685144, 1033222029); + sum2 = + W(0, -1130151079, -1128601535, 1016586775, -1116462462) + W(1, 1006316053, -1136401487, -1134837023, 1015531121) + + W(2, 1029357099, -1139320303, 1016703563, 1036545095) + W(3, 1027702761, -1115282656, 1025282364, -1128863347) + + W(4, -1141051917, 1027307392, 1040480663, -1084177500) + W(5, 1027514935, 1033882273, 975470826, 1013565163) + + W(6, -1126143047, -1124015138, -1090482710, -1061542668) + + W(7, -1081711054, 1042416533, -1107083018, 1030037156) + W(8, -1138853383, 1026568428, 1051692940, 1087807110) + + W(9, 1065457143, -1101742731, 1035528582, -1123914522) + + W(10, 1016378649, -1128887123, 1024508650, -1109325640) + + W(11, -1115450794, 1030137534, 1016609727, -1122133136); + WS(1056806766, 1019813151); + sum1 = W(0, -1109922347, 1027672232, -1113027385, -1106442907) + + W(1, -1119504732, -1127683323, 1015134384, -1122196904) + + W(2, 1038862168, -1098777292, 1057340869, -1131946518) + + W(3, 1048903346, -1100586740, 1027127869, -1136830686) + + W(4, -1094336356, 1025923920, -1089223672, 1049099726) + + W(5, -1102142547, -1122538541, -1099585557, -1100472159) + + W(6, 1045176100, 1046907893, 1028090813, 1060367739) + W(7, -1102839017, 1052174932, 1024110556, 1047790604) + + W(8, 1023835087, -1097985673, 1044113854, 1010151151) + + W(9, 1051267347, -1093148714, 1029024221, -1137237669) + + W(10, -1117706029, -1143840774, -1111671123, 1025756788) + + W(11, -1111600768, 1040843731, -1107564881, -1131252120); + sum2 = + W(0, 1016054025, -1116580030, -1128856269, 1024017790) + W(1, -1120027976, 1003808451, -1120561807, 1020365697) + + W(2, -1119367753, 1033363716, -1107794961, -1129548157) + + W(3, 1034251322, 1039517400, 1019337653, -1174223189) + W(4, -1115811972, -1119979151, 1046175546, 1051115205) + + W(5, -1095340379, -1127431641, 976018325, -1148320619) + + W(6, 1024987046, -1114756690, -1100926142, 1048732221) + + W(7, 1044324276, -1104827086, -1139095561, -1138276477) + W(8, 1016843613, 1025664850, 1028330842, 1029232538) + + W(9, -1105635461, 1042504965, -1118828309, -1117203320) + + W(10, 1007599121, -1120202841, -1144919563, -1123931557) + + W(11, -1122027017, -1118580981, 1016896817, 1009819353); + WS(1067549148, 1061168738); + sum1 = W(0, -1136860560, 1019396970, 1034693791, 1031876061) + + W(1, -1126960466, 1026075051, -1129065354, -1125694250) + + W(2, 1041916271, -1102760394, -1100215160, -1127917744) + + W(3, 1038708237, 1042570959, 1024557450, -1114527138) + W(4, 1043173595, 1046914407, 1063664325, 1041579695) + + W(5, -1084953669, -1099553438, -1111656016, 1036161892) + + W(6, -1099729080, -1097589844, -1085101004, 1044764001) + + W(7, 1062969721, 1046958554, 1031927572, -1129394940) + W(8, 1028345500, 1036811500, 1044130369, -1111608196) + + W(9, -1096862061, -1104831702, -1121741642, 1028864534) + + W(10, -1117900922, -1118556558, -1118557363, -1148658183) + + W(11, 1028601293, 1014732126, 999719805, -1111432076); + sum2 = + W(0, 1037988572, -1109648154, -1115314649, -1110735622) + + W(1, 1029414023, -1115532881, -1114457629, -1123631499) + + W(2, -1097183834, -1096035348, -1106718097, 1044362532) + + W(3, 1044653749, -1118097482, 1036871139, 1035597348) + W(4, -1096111302, 1046143856, 1065688064, -1100541529) + + W(5, 1022961930, 1041170408, -1121640520, -1109551474) + + W(6, -1112255513, 1047451704, 1048785443, -1089624797) + + W(7, 1040629892, -1135819985, -1109975688, 1030316886) + + W(8, 1025606252, -1109281762, 1025033440, -1124926742) + W(9, 1024229044, -1109992198, 1007526703, 1031542857) + + W(10, -1131066844, 1021094187, -1118872350, 1035314838) + + W(11, -1132267648, 1004115214, -1128646118, -1117895342); + WS(-1090126519, 1034760182); + sum1 = + W(0, 1022234099, 987019599, 1021371561, -1125185183) + W(1, 1040030303, 1005824514, 1028122555, -1120592523) + + W(2, 1038732905, 1040082783, 1042926010, 1019049563) + W(3, -1101231100, -1108355337, -1115211984, 1035983309) + + W(4, -1095221408, -1096833350, -1090005917, 1049172122) + W(5, 1056956325, 1052986466, 1046568014, 1025899358) + + W(6, 1049091087, 1049531159, 1052645704, 1048882035) + + W(7, -1086324445, -1089320760, -1101798768, -1123937043) + + W(8, -1141106060, -1100657291, -1098472859, -1113910991) + + W(9, 1041783487, 1033537135, 1037621024, -1125397784) + W(10, -1130848127, 1036771650, 1035488804, 1025403478) + + W(11, 1007113098, -1138596020, -1128732298, -1127374557); + sum2 = + W(0, 1016736022, 1011977196, -1137999416, 1019963070) + W(1, 1030437859, -1122046802, -1142727409, 1018753414) + + W(2, 1032939170, -1102682487, 1037611888, -1102949496) + + W(3, 1039010410, -1110345340, -1124097437, -1113761662) + + W(4, -1122689775, 1060510561, 1051792579, -1073351999) + W(5, 1059164734, 1062467108, 1031495287, -1101619274) + + W(6, -1102551566, 1060805847, 1057985083, -1073393989) + + W(7, 1057367527, 1062012989, -1147452225, -1099879364) + + W(8, -1122487238, -1122236502, 1036808922, -1103029047) + + W(9, 1039165500, -1106860549, -1143421321, 1015482390) + + W(10, 1026411789, -1128029215, 1019619350, -1125796177) + + W(11, 1024266957, -1119780381, 1024156551, 1016465010); + WS(-1089242039, -1127205581); + sum1 = W(0, -1124452989, 1037734344, -1136469606, 1045032037) + + W(1, -1131176455, 1029283077, 1038076384, 1029887056) + + W(2, 1047404342, -1111320098, -1115981071, 1038279993) + + W(3, 1006926037, 1030509432, -1123275877, 1043334248) + W(4, -1086849964, 1001557948, 1055753134, 1059294849) + + W(5, 1006841992, 1049404683, 1037635838, 1044156233) + W(6, -1114062493, 998659036, -1096047365, -1107330927) + + W(7, -1105936042, -1087265492, -1095492784, -1080260267) + + W(8, 1042532510, 1038364441, -1118490271, 1044317529) + W(9, 1035319841, 1043122385, 1027367204, 1053177470) + + W(10, 1010360274, 1032729828, 1015888923, -1118190491) + + W(11, 1021147727, -1123196402, 1027584778, -1118995315); + sum2 = W(0, 1029897599, -1114965417, 1025776431, -1121485495) + + W(1, -1140617930, -1113546368, 1031651703, -1117524097) + + W(2, -1102843967, 1046605828, 1033633995, 1048791648) + + W(3, -1104898739, 1031053127, -1108448442, -1108356905) + + W(4, 1001547796, 1025076963, -1090433692, 1044097140) + W(5, 1042488362, -1118485295, 1045463546, 1040816680) + + W(6, 1049416264, -1100594038, -1096668289, -1117020477) + + W(7, -1102246327, 1034926551, 1047237110, 1044694712) + W(8, -1120840401, 1041915682, 1040646462, 1042521794) + + W(9, -1112857889, -1109164591, 1015998805, -1109851905) + + W(10, -1115391670, 1020641677, -1111492899, 1034331443) + + W(11, -1115861875, -1134127978, -1120855845, -1124879769); + WS(-1081567068, -1085072352); + sum1 = W(0, 1026202077, 1017630556, 1034866076, -1120073907) + W(1, 990337572, -1122725732, 1016189565, -1135328058) + + W(2, 1008391383, -1102096537, -1105309517, -1113888457) + + W(3, 1038015146, 1010107993, 1035371298, -1107104879) + W(4, 1043376377, 1035138955, 1062685095, -1088326467) + + W(5, -1087780001, -1095652846, -1111927693, -1134788873) + + W(6, -1106037014, -1113878797, -1091962582, -1099527071) + + W(7, 1065743931, 1048331161, 1035819857, 1033560764) + W(8, -1119432853, 1041401156, 1028045374, 1036249665) + + W(9, -1122166240, 1030964177, 1030882915, 1034792920) + + W(10, 1015626934, -1112723700, 995954372, -1112822301) + + W(11, 1036674595, -1165855255, 1020668626, -1140134473); + sum2 = W(0, -1101998430, 1034880732, -1111573656, 1034691412) + W(1, 1017688506, 1032207084, 1002612774, 995363580) + + W(2, 1025808817, -1110518368, -1090739547, -1098171169) + + W(3, 1047617175, -1112107064, 1027687639, 1035291452) + W(4, 1026331301, 1035202798, -1095903349, 1068344140) + + W(5, -1085314459, -1108916250, -1113844364, -1111293323) + + W(6, 1041383807, 1044537615, 1045506861, 1069658374) + + W(7, -1090700374, -1135142667, -1106371211, -1105384559) + + W(8, 1033833028, -1096440885, 1030373631, -1094064924) + + W(9, -1106284721, -1113568166, 1043762008, -1113615358) + + W(10, -1108635033, 1042833515, -1107072548, 1037649108) + + W(11, -1117475933, 996218700, -1115713024, 1031725587); + WS(-1122270064, -1083487436); + sum1 = W(0, 1022021054, 1000846209, -1120651002, -1133172181) + W(1, 1015175368, 1008528664, 1014262402, 1032206792) + + W(2, -1111938972, 1031069285, 1035108132, -1122478547) + + W(3, 1022898156, -1109542844, 1003755051, -1099224128) + + W(4, -1089129474, -1092279467, -1089405705, -1088959911) + + W(5, -1101358829, -1113192731, -1110785838, -1105614817) + + W(6, 1061173530, 1053406092, 1061891890, 1046812368) + W(7, 1052509753, 1035774995, 1040815801, 1041852206) + + W(8, -1117042135, -1112839626, -1115403968, 1035227362) + + W(9, 983155781, 1035355065, -1114859906, 1046440556) + W(10, 990992466, 997371026, -1123767278, -1136588785) + + W(11, 1014548513, -1120262163, -1139309996, -1196238920); + sum2 = + W(0, 1044179919, 1022028328, 1040258943, -1118974089) + W(1, 1033279863, -1117110809, 1031745329, -1103290765) + + W(2, -1111986018, 998943655, -1095034556, -1095846499) + + W(3, -1110448374, -1099083231, -1120681553, -1101323001) + + W(4, -1080384748, -1088604014, -1104000317, 1073459027) + + W(5, -1098039236, 1045892370, -1111672860, 1055006842) + + W(6, -1092393621, 1029389095, -1090514887, 1071708766) + W(7, 1012336831, 1049307354, -1100485937, 1051814517) + + W(8, 1048581079, 1009323699, 1015383036, -1097133430) + + W(9, -1122793353, -1097759856, 1041920736, -1091667564) + + W(10, 1031858735, 1021777892, 1024626196, 1024702395) + W(11, 1031448400, 1030521846, 1016567237, 1029007432); + WS(-1097130350, -1073679750); + sum1 = + W(0, -1154560184, 1025389788, -1145657140, 1000633100) + W(1, -1120139600, 1032643785, 1008755251, 1030414749) + + W(2, -1142702368, 1008724804, 1035954194, 1046084016) + W(3, 1042008657, -1106616153, 1025929714, -1102859291) + + W(4, -1095841490, -1096179481, -1095185831, -1085973126) + + W(5, -1089907161, -1096805620, -1098086361, -1107347576) + + W(6, 1034517635, 1053502809, 1045830013, 1057148843) + W(7, 1051926551, 1052799826, 1043469780, 1050172789) + + W(8, 1044574577, -1112918112, 1042446427, 1025817904) + W(9, 1017272605, -1123577295, -1143679882, 1014891512) + + W(10, 992206103, -1143244972, -1122388570, -1139683234) + + W(11, 1018417129, 1017209342, 1016358830, 1026775680); + sum2 = + W(0, 1021941992, -1140009235, 1026649920, 1025391436) + W(1, 1033557641, -1110654493, -1117894486, 1031221238) + + W(2, -1106123822, -1137197699, -1104678389, -1103278668) + + W(3, 1049392706, 1026389826, 1046385471, -1107040085) + W(4, 1031547466, 1040410800, -1091687878, -1069452203) + + W(5, 1071493698, 1075377385, -1093315115, -1101021764) + + W(6, -1135582819, 1048777558, -1102399061, -1086654414) + W(7, 1036526271, 1051671224, 1003979070, 1042747507) + + W(8, 1018035752, -1114989513, 1038853959, -1112110740) + + W(9, -1155541821, -1119910153, -1130248744, -1119798403) + + W(10, 1017098260, -1129449426, -1170697076, -1134437671) + + W(11, 1030635558, -1127657747, 1010389927, 1007123883); + WS(-1110542776, 1046722292); + sum1 = W(0, -1112464600, 1016022658, 1027765771, 981819586) + W(1, 1026835189, 1025143735, -1111607705, 1024330241) + + W(2, 1033517476, -1108629467, -1106997347, -1113497042) + + W(3, -1116788199, -1106078850, 1041100086, -1124631714) + + W(4, 1047470894, -1133454244, 1053995028, -1100439522) + + W(5, -1093531706, 1048713001, -1106135867, -1115421707) + + W(6, -1131671638, 1032980471, -1092318054, 1042288212) + + W(7, 1061947018, -1121614518, 1012478420, 1041393523) + + W(8, 1005087552, -1105826521, 1042584756, -1109105451) + + W(9, -1098489206, -1105038597, 977775992, -1114990145) + + W(10, -1142745264, 1026603482, -1129658366, 1017901338) + + W(11, -1142191304, 1040275689, 1016467704, 1020475210); + sum2 = W(0, 1031452303, 992881643, 978475180, -1121457613) + W(1, 1034445399, -1130052481, 1032145701, -1116902843) + + W(2, -1132232893, -1116591675, 1016124301, -1114931492) + + W(3, -1094590847, 1040974964, -1110729382, 1035934107) + + W(4, -1109510079, 1032912109, -1114514404, 1032060799) + + W(5, 1051504728, -1087149232, 1039284419, 1032317221) + W(6, 1018866101, -1116915567, 1055420465, 1059251768) + + W(7, -1088887374, 1044275534, -1114948355, -1104983612) + + W(8, 1014551643, 1024567259, -1097097100, -1118272021) + W(9, 1048490818, 1035881493, 1032922179, 1032032409) + + W(10, 1032688527, -1114177042, 1042584708, -1109972047) + + W(11, 1024892699, -1108606213, -1121421993, -1133789139); + WS(1059165367, -1104520251); + sum1 = + W(0, 1007492796, -1117692608, 1009135144, -1115310467) + W(1, 1014125520, -1113191163, -1129119585, -1118876992) + + W(2, -1108628644, 1046236477, -1120534447, 1052736188) + W(3, -1118278150, 1036684740, 1015268651, 1008090175) + + W(4, -1117534006, -1094176525, 1053590938, 1041258594) + + W(5, 1001540436, -1106455985, -1112388022, -1114551242) + + W(6, 1041312427, -1118419948, -1107420459, -1097199722) + + W(7, 1055263011, -1100739533, 1040471133, 1020553106) + W(8, -1113108212, 1029454180, -1110779368, 1053879643) + + W(9, -1098892966, 1045621277, -1126748266, 1026632706) + + W(10, -1124001749, -1113899741, -1131761404, -1114949702) + + W(11, 1025063448, -1105125705, -1126282358, -1127494856); + sum2 = W(0, 1027505664, -1115834059, 1029084872, 1029257304) + + W(1, -1128264406, -1138405484, -1118563560, -1127212263) + + W(2, -1104527074, 1048986559, -1089420265, -1098414029) + + W(3, -1104406791, 1040673804, -1203758566, -1117936348) + + W(4, 1034957797, -1098163961, 1051828462, 1053778056) + + W(5, 1048509414, -1106881855, -1113115951, -1136870020) + + W(6, 1041601252, -1125657446, 1045110551, 1041501740) + W(7, 1041829791, -1119286592, 1045914276, 1022365337) + + W(8, -1108054404, 1041896195, -1099714824, -1129563106) + + W(9, -1092212913, 1049994472, -1105182054, -1139619400) + + W(10, -1122847824, 1034858548, -1116127595, -1170669534) + + W(11, 1037831890, -1107117839, 1031508216, -1127498142); + WS(1064754871, 1064755352); + sum1 = W(0, -1124996947, -1126765813, -1111973122, 995438583) + + W(1, -1131935965, 1011044801, 1017902933, -1117569083) + W(2, 1039345889, 1034558935, 1025078634, 1031530717) + + W(3, -1102805216, -1112086641, -1108706152, -1125705364) + + W(4, -1096693846, -1096907004, -1092723587, 1042155040) + + W(5, 1055052309, 1050402072, 1045488762, 1036105095) + W(6, 1051509189, 1048609181, 1055455058, 1038916133) + + W(7, -1085470304, -1096310694, -1110967031, -1114430562) + + W(8, -1110987505, -1122110878, -1103910610, 1036071207) + W(9, 1036962198, 1042970795, 999916154, 1043170799) + + W(10, 1036233792, 981607022, 1033037628, 1028131846) + + W(11, -1113728073, -1155599823, -1121653045, -1131031997); + sum2 = + W(0, -1133117125, 1023646322, 1023723550, 1016880452) + W(1, -1128763803, 1032406499, -1112596197, 1024272758) + + W(2, 1035315397, -1104375670, 1045506061, -1100884270) + + W(3, 1037072250, -1100571834, 1043010850, -1106522969) + W(4, 1034291601, 1023753609, -1107539440, 1046403885) + + W(5, -1123261308, 1040670310, -1109210140, 1037357283) + + W(6, -1093657955, 1053589289, -1104725243, 1040733712) + W(7, 987308827, 1047435788, -1103530057, 1046389911) + + W(8, -1083656994, -1096844972, -1079943056, -1108767061) + + W(9, 1066015084, 1056439411, 1038430454, 1050581867) + W(10, 1063017252, -1117431336, 1065218548, -1110535684) + + W(11, -1088643610, -1092199491, -1140617522, -1093142505); + WS(-1141889920, -1150694570); + sum1 = + W(0, -1121776659, 1035438770, -1107472311, 1029335145) + W(1, 1032163820, -1122959321, 1035788170, 1006930832) + + W(2, -1156363954, 1043244278, 1039611642, 1044045394) + W(3, 1031781705, -1113754566, 1041298854, -1113010266) + + W(4, -1110656781, -1108191526, -1092681840, -1089342271) + + W(5, -1107172434, -1110931796, -1106653204, -1098776751) + + W(6, -1150990554, 1049522698, 1047918398, 1044281805) + W(7, -1142656241, -1118178969, 1044014582, 1035377494) + + W(8, 1001967189, 1024784007, -1120026675, 1041259438) + W(9, 1035091531, -1114065315, 1037418924, 968315538) + + W(10, 1009891810, 1026909213, -1115519345, 1032535224) + + W(11, -1156224954, -1114416227, 1034927023, -1127266575); + sum2 = W(0, -1096670021, -1102787949, -1099441746, 1043637876) + + W(1, 1052388948, 1042101483, -1135324433, 1042670443) + W(2, 1059540854, 1039622534, 1064198145, -1086802625) + + W(3, -1085971065, -1113298762, -1098667485, -1104634628) + + W(4, 1045575353, 1037899964, 1030855272, -1101655681) + + W(5, 1033969343, -1105771070, 1036465297, -1104173140) + + W(6, -1133958494, 1013042349, 1040028330, 1036771998) + W(7, 1032851236, -1120619083, 981463467, 1030229840) + + W(8, 1031038260, -1110193614, -1117097690, -1125265460) + + W(9, -1103569731, 1049976190, -1101523135, 1035574893) + + W(10, -1118270456, 988987510, 1032105974, -1117707023) + + W(11, -1134648980, 1021389004, -1119296945, 1035007302); + WS(1060329015, -1107100438); + sum1 = W(0, -1139109867, -1126768152, -1154508124, 1024792785) + + W(1, -1145234942, -1121126338, -1165337473, -1128378904) + + W(2, 1016013223, -1108878752, -1139382101, 1046477388) + + W(3, 1046417836, 1044791733, -1115375281, 1030070044) + W(4, 1052529520, 1042283693, 1051369597, 1051787130) + + W(5, 1040695538, 1046651812, 1039020124, 1046922680) + + W(6, -1098269535, -1103310414, -1093610355, -1088582834) + + W(7, -1090008057, -1097854544, -1110993568, -1105218789) + + W(8, -1120993331, 1033078264, 1033661966, 1015463488) + W(9, 1035018943, 1029328303, 980238373, -1121430349) + + W(10, 1025836257, -1113589378, 1029380042, -1124637616) + + W(11, -1127749832, 1030094510, -1117533511, 1016154976); + sum2 = + W(0, -1122821091, 1016851522, -1106087013, -1109184296) + W(1, 1045004090, 1015529466, 1026918939, -1115690469) + + W(2, 1039646422, -1156337616, -1131895450, -1080883791) + + W(3, -1074990048, -1105476432, -1104782698, 1022339242) + + W(4, -1126218548, -1123806894, 1035943528, 1071805249) + + W(5, 1071092779, -1126394390, 1031828962, -1122803425) + W(6, 1020520346, -1105518185, 999070248, -1096231655) + + W(7, -1125969764, 1028426171, 1030594487, -1127395662) + W(8, 1030755819, 1031650855, 1015158698, 1043321474) + + W(9, -1125796080, 1026097175, -1140334484, -1110808154) + + W(10, 1003947528, 980292032, -1123933765, -1122746065) + + W(11, 1018391998, -1126690400, 1018627618, -1149029768); + WS(1004067712, 1029538397); + sum1 = W(0, 1039684517, -1113057966, 1034662227, 976341006) + W(1, -1116361615, 1039793800, -1114202454, 1023346679) + + W(2, 1025050595, -1112884456, -1120136235, -1106127376) + + W(3, -1108532672, -1136083213, -1109109944, 1026195563) + + W(4, 1055781642, 1052279792, 1057037092, 1048957300) + W(5, 1059667231, 1049781884, 1046150498, 1052752022) + + W(6, -1093421305, -1096595713, -1096171643, -1083333863) + + W(7, -1093970477, 1050503466, -1098876866, -1119746148) + + W(8, -1134522377, 1008080123, 1038845557, -1104830972) + + W(9, -1107387175, -1105145436, -1111371224, -1106375815) + + W(10, 1033902960, -1134909265, 1000314570, 1017566030) + + W(11, -1120056627, 1034175935, -1129568684, 1002478074); + sum2 = W(0, 996458418, 1033154491, -1124552606, 983965669) + W(1, -1113544599, -1118592979, 1024911403, -1120675710) + + W(2, 1023361218, -1129026548, -1113149678, -1096377075) + + W(3, -1108470744, -1107366613, 1040480632, 978762058) + W(4, 1020176326, 1036155261, -1107309754, 1064108379) + + W(5, -1113642974, -1147140265, -1123866147, -1127049668) + + W(6, -1105686968, -1136279909, -1101182829, 1059185253) + + W(7, -1094171461, -1097506500, 1038318571, 1027330889) + + W(8, -1112170015, 1029838361, -1110765232, 1029555247) + W(9, 1048386684, 995412594, 1045927904, -1102738273) + + W(10, 1016740014, -1122796554, 1027141165, -1111484496) + + W(11, 1033692775, -1108579478, -1126067866, 1023291782); + WS(1047133404, -1079170418); + sum1 = W(0, 1009155056, -1116032717, -1135035740, -1132905800) + + W(1, 1006908676, -1123509635, -1129150906, -1147535977) + + W(2, -1122581460, -1127398915, -1111731450, -1098422622) + + W(3, -1136427723, 1019095722, 1037504657, 1012838771) + W(4, 1042667713, 1041078541, 1051022508, 1065228285) + + W(5, 1042380775, 1050271906, -1107182030, 1023931745) + + W(6, 1030334583, -1113404572, -1111377849, -1104817319) + + W(7, -1091891141, -1103926112, -1121675713, -1123007382) + + W(8, -1108143194, -1123819760, -1112180142, -1102890728) + + W(9, -1111098047, 1023382911, -1136273159, -1123177070) + + W(10, 1027163842, -1122554086, 1023811915, -1133181796) + + W(11, 1001483047, -1116735535, 1015217807, -1130799202); + sum2 = W(0, -1151544588, -1155029688, 1018065470, 1007239987) + + W(1, -1125453823, -1118997712, 1007542759, -1133631258) + + W(2, 1017708852, -1121981859, -1114670464, 1049278985) + + W(3, 1041079714, -1156221672, -1120658712, -1113215345) + + W(4, -1147640076, -1129630940, -1093073209, -1077783117) + + W(5, 1074285479, 1034878186, 1016277382, 1033160981) + W(6, 1008923057, 1024218233, -1119653793, -1083801634) + + W(7, 1047560438, 1028846010, 1036336794, 1022080564) + W(8, 1011942449, 998377109, -1131988255, 1041518161) + + W(9, -1114079754, -1118519138, -1121956184, 1027490516) + + W(10, 1018406594, -1133221663, 1025316590, -1123603132) + + W(11, -1131599727, 1024940191, -1131785133, -1130450701); + WS(1043550940, 1028476494); + sum1 = W(0, -1115183742, -1121780237, -1117842775, -1110838377) + + W(1, 991794198, -1111061058, 1015980795, -1113960535) + + W(2, -1130981802, -1102302048, -1117998761, -1094318158) + + W(3, -1102037997, -1115328139, -1113105937, -1106426583) + + W(4, -1100607937, -1105099981, -1096882923, 1062548805) + + W(5, -1103616404, -1097580450, -1103768718, -1100373208) + + W(6, 1051762223, 1040535662, 1059510884, 1068023761) + W(7, 1055882697, 1041348961, 1034161697, 1044552262) + + W(8, 1000007075, -1138550724, -1102853271, -1099046056) + + W(9, -1102330336, -1131654944, -1112888641, -1110284503) + + W(10, -1121847282, -1111548899, -1132334487, 1013492582) + + W(11, 1018468811, -1119471984, -1129682576, -1148988811); + sum2 = + W(0, 1029690847, -1115037203, -1127742454, 1036903221) + W(1, -1106227374, 1039025001, -1108879063, 1016988574) + + W(2, -1103820712, 1043435491, -1100462798, 1028701483) + + W(3, -1121926871, -1126383902, 1017141302, -1115441627) + W(4, 998970743, -1096312501, 1044923803, 1041049643) + + W(5, 1030485727, -1125321886, 1008577020, 1033537170) + W(6, 1028297515, 1046052979, -1099477234, 1065575031) + + W(7, -1098681477, 1040854499, -1106467082, -1122382559) + + W(8, -1122562191, -1115911439, 1030898927, -1096910875) + + W(9, 1034498637, -1115709255, 1013474716, -1129067614) + + W(10, -1133991676, 1007821180, -1113716427, 1036974934) + + W(11, -1111652935, -1126914630, -1128843302, -1114648723); + WS(-1079050332, -1087647968); + sum1 = W(0, -1138480508, -1122115440, 1024624314, -1106223181) + + W(1, 1029330596, -1120448614, -1134294785, 1004544641) + + W(2, -1112879708, 1026750308, 1027382179, -1116109267) + + W(3, 1024806390, -1128868784, 1022822666, -1115751616) + + W(4, -1095708941, -1102419558, -1136300523, -1083772539) + + W(5, -1103579129, -1102450653, -1100406055, -1099401009) + + W(6, 1054719611, 1048762675, 1057423590, 1057166968) + W(7, 1058690419, 1049252525, 1046884233, 1051036287) + + W(8, 1031575959, -1106236805, -1115045376, -1096438944) + + W(9, -1115914082, -1116410163, -1127656777, 1031406769) + + W(10, -1122888245, -1139407140, -1136279992, -1112079518) + + W(11, 1025354440, -1128866725, 1008311211, 1030150228); + sum2 = + W(0, 1018441725, 1018735508, -1106801879, 1042307735) + W(1, -1108191465, -1153036923, 1023515972, -1130614305) + + W(2, -1121226957, -1128043345, 1036012925, -1105109021) + + W(3, 1026535678, 1024075219, -1143871918, -1115606924) + W(4, 1025980595, 1035475244, -1093599779, 1063056253) + + W(5, -1097885523, 1035122552, 1028845741, -1124060823) + + W(6, -1143973174, 1028848366, -1119821797, 1055391108) + + W(7, -1118265757, 1031788992, -1122707515, -1149779899) + + W(8, -1145354702, 1010180031, -1106432772, -1103238145) + + W(9, -1114258989, -1114303163, 1031455538, -1117711701) + + W(10, -1118705847, 1001175670, -1114705464, 1024485983) + + W(11, -1109715589, 1025382280, -1125366621, -1122890135); + WS(1061221431, 1002405371); + sum1 = W(0, -1123061017, -1109190069, -1111043962, -1094345134) + + W(1, -1146354418, -1113941840, -1145213652, 1017803349) + + W(2, -1123480946, 1033046959, 1050201177, 1042710035) + W(3, 1050099666, 1026923762, 1032794752, 1029204218) + + W(4, -1090405194, -1104934581, -1102475777, -1086823335) + + W(5, -1097235340, -1091215734, -1094526523, -1089600016) + + W(6, 1054235011, 1044209302, 1057895846, 1052530935) + W(7, 1058601910, 1050794548, 1041457976, 1055600534) + + W(8, 1026563665, -1108435303, 1037490845, -1102625680) + + W(9, 1033897294, -1126650490, -1110275296, 1021417496) + + W(10, 1000058490, -1121369187, 1030151784, -1111380603) + + W(11, 1040756961, -1126829850, 1032331475, 1033488871); + sum2 = W(0, 1049937345, 1058657690, 1071079778, 1072348129) + W(1, 1066389113, 1049150259, -1119844839, -1113785170) + + W(2, -1089706816, -1087536311, -1078069733, -1078647761) + + W(3, -1079714039, -1090508646, 1022376790, -1103849791) + + W(4, 1050626093, -1106625833, 1020012689, -1094966474) + + W(5, -1098171132, 1050328795, -1105718319, 1052174137) + + W(6, 1030967529, -1105431871, 1044296437, -1112600090) + + W(7, 1038432439, 1044145959, -1126694997, 1034822829) + + W(8, -1115709839, 1036734782, -1122006247, -1122763227) + + W(9, -1130276743, 1024733405, 1021875579, -1112758982) + + W(10, 1039088353, -1109192755, 1031394755, -1116226089) + + W(11, 1022577738, 1012728894, -1123093509, 1013882918); + WS(-1092893294, -1089220584); + sum1 = W(0, 1008699951, 1010493299, -1124403149, 1025199074) + + W(1, -1117387089, 1015178277, -1125915034, -1130896954) + + W(2, -1127519944, -1118558929, -1106263811, -1113928672) + + W(3, -1098638288, 1041393441, -1112838969, 1035998582) + W(4, 1053766130, 1051919929, 1056071340, 1052175436) + + W(5, 1062605050, 1047707912, 1053546873, 1049473086) + + W(6, -1103359682, -1096189801, -1097091836, -1086367179) + + W(7, -1096005139, -1102452900, -1101730612, -1095432549) + + W(8, -1104704049, 1032200864, -1111082358, 1015736929) + + W(9, -1120379023, -1123219920, 1019333603, -1136688761) + + W(10, 998920846, 1028526614, -1149496748, 1019181009) + + W(11, -1115659002, 1027645503, -1131717807, -1136451331); + sum2 = + W(0, -1143112647, 992704062, -1124855502, 1038449046) + W(1, -1105916124, 1035072543, -1114904409, 1019251456) + + W(2, 1034689803, -1109431235, 1033324328, -1098090520) + W(3, 1038361982, 1040866773, 1032024575, -1164332444) + + W(4, -1115356591, 1039097516, -1073085951, -1063972596) + + W(5, 1062319475, 1085456662, 1062308854, -1102205120) + + W(6, -1121270233, 1048248946, -1106299172, -1091325299) + + W(7, -1090314642, 1056006422, 1043935118, -1107459099) + + W(8, 1017968792, -1124530814, 1023517229, -1113483013) + + W(9, -1141826407, 1034240002, -1124783482, 1032935811) + + W(10, 1021729984, 1005857263, -1126326370, 1015994888) + + W(11, 1013997779, -1134900259, -1135264403, 1001043447); + WS(-1104754908, -1106735671); + sum1 = W(0, 1030490103, 1032595044, -1128810020, 1032319302) + W(1, 1019231224, 1025969502, 1016077744, 1024124136) + + W(2, -1117923535, 1002237924, -1122216143, -1120462507) + + W(3, 1025980110, -1123369072, 1034830735, -1104242198) + + W(4, -1088908700, -1094516030, -1092804364, -1102093923) + + W(5, -1088198897, -1096286026, -1102086589, -1103741447) + + W(6, 1033028505, 1029213684, 1050263192, 1063837581) + W(7, 1058220138, 1054477272, 1045907999, 1049334234) + + W(8, 1045999740, -1144798556, 1022746927, -1106958295) + + W(9, -1107413149, 995801516, -1115665070, 1030012489) + + W(10, -1120248133, 1015682178, -1129595020, 1030078356) + + W(11, 1021953856, -1153493672, 1019926661, 1022398552); + sum2 = + W(0, -1116247065, 1015145430, 986051432, -1117862601) + W(1, -1114715779, 1034116930, -1144744186, 1026244953) + + W(2, 1035833889, -1107082251, -1114579693, 1043695503) + + W(3, 1039299404, -1114493167, -1120378069, 1019204162) + + W(4, -1087068607, -1079268655, 1022672030, 1067901888) + W(5, 1059152338, 1008422125, 1020328850, -1111927269) + + W(6, -1107323417, -1102842161, 1049680335, 1032100715) + W(7, 1040660749, -1115195239, 1018816198, 1021018582) + + W(8, -1109274147, 1016322550, -1111459111, 1026073955) + W(9, 992278036, -1173738319, 1033325633, -1123657301) + + W(10, 1021616338, -1133554677, 1010843781, 1017398706) + + W(11, 998891466, -1139208557, -1138764845, 1016479082); + WS(-1092340590, -1082645376); + sum1 = + W(0, 1018128252, 1018184990, 1028162329, -1117677972) + W(1, -1115495745, -1115409474, 1015642046, -1118723567) + + W(2, 1033191659, -1106475329, -1101261661, -1102532636) + + W(3, 1031605429, 1010011868, -1127814216, -1112449263) + W(4, 1040446513, 1036685563, 1061713267, 1042646693) + + W(5, -1089327101, -1106573237, -1105713919, -1112423953) + + W(6, -1112709788, -1105689791, -1086509296, 1038532783) + W(7, 1064314083, 1046976369, 1039016129, 1030956248) + + W(8, 1031456758, 1040219053, 1042438664, -1111899057) + W(9, -1100451664, -1105951352, 1010066702, 1022848097) + + W(10, -1113441282, -1127103440, -1123459213, 1018898486) + + W(11, 1033438227, 1029058545, 1013299750, -1130132966); + sum2 = + W(0, -1107775669, -1121347079, -1118975841, -1121125435) + + W(1, -1123325897, 1012434826, -1129695564, 1006663086) + W(2, 1040551451, 1042459857, 1031184422, -1152381105) + + W(3, -1105935240, -1115286413, -1124425722, -1111096901) + + W(4, 1027302533, -1122087227, 1016161914, 989383522) + W(5, 1045806619, -1125562074, -1111270899, -1114174571) + + W(6, 1033412933, -1113656153, 1035641742, -1114487413) + W(7, 1041762467, 1029416951, 1028252326, -1127668218) + + W(8, -1135101756, 1017950151, -1109563699, 1046120628) + W(9, -1114574520, 1035110196, 998528980, 997585257) + + W(10, -1131050762, -1130160250, 1017438602, 987844130) + + W(11, -1117833439, -1173771715, -1121778743, -1126450718); + WS(1052284526, 1042464092); + sum1 = W(0, 1010280196, -1136974408, 1026365340, 1020617774) + + W(1, 1023947782, -1127515216, -1129271461, 1007810505) + + W(2, 999914700, -1110845507, -1109035161, -1110448219) + + W(3, -1110075532, 1038195741, -1114945332, 1019473092) + W(4, 1057530557, 1046554367, 1060667985, 1063323154) + + W(5, 1043924417, 1050039723, 1042422080, 1052688005) + + W(6, -1098111272, -1100087104, -1090659644, -1094987596) + + W(7, -1095988958, -1097163609, -1105136802, -1095692091) + + W(8, -1101387838, -1110795931, -1102616600, -1105684762) + + W(9, -1124311688, 1018127786, -1124435598, -1114597706) + + W(10, 1027464615, -1128121686, 1001926272, 1025859742) + + W(11, 1017827156, 1034844538, -1130637466, 1027019478); + sum2 = W(0, 1025355846, -1124685033, 1029205900, 1011755468) + + W(1, -1113277680, 1035269289, -1122502097, 1013457876) + + W(2, -1119913429, 1010871130, 1016143206, 1033794365) + W(3, -1140030878, 1020099653, 991986873, 1035095720) + + W(4, 1034044275, 1036346050, -1128364593, -1133342818) + W(5, 1020927778, 1035477071, 1011575434, 1029499077) + + W(6, -1140464466, 1032812135, 1071964190, 1067600837) + W(7, 1039362648, 1033733070, 1008065452, 994468553) + + W(8, -1091074448, -1086522508, -1074918519, -1089329657) + + W(9, -1106053895, -1108456989, -1146528221, -1106105254) + + W(10, 1041357090, 1037018199, 1033277276, -1111447139) + + W(11, -1118126225, 1032003060, -1117647411, 1009180302); + WS(-1085785015, -1080175544); + sum1 = W(0, 1035373246, -1125806618, -1118822551, 1044894533) + + W(1, -1102223008, 1041222777, 1023709757, -1122183565) + + W(2, -1103151077, 1045216768, -1094452856, 1039875576) + + W(3, -1151103277, -1094574331, 1048044105, -1103877399) + + W(4, 1058377668, 1050584367, 1054861331, 1046782533) + W(5, 1057861265, 1051791466, 1043274206, 1058273114) + + W(6, -1091874455, -1094766367, -1107649205, -1090132878) + + W(7, -1090472533, -1111571937, -1098390656, -1092114299) + + W(8, 1025579124, 1043611260, -1106387815, 1049375324) + + W(9, -1115030560, -1137989279, 1049548184, -1106419572) + + W(10, -1111695537, 1043525714, -1102079139, -1105407270) + + W(11, -1144672552, -1102123612, 1041305154, -1116205169); + sum2 = + W(0, 998449416, -1121990028, 1039055377, -1115523342) + W(1, -1132069983, 1032292249, -1128335569, 998312734) + + W(2, -1118465870, 1035743758, -1103571680, 1049274722) + + W(3, -1106547389, -1126693677, 1034009109, -1116877357) + + W(4, -1124628345, 1040306990, -1098483719, 964150684) + W(5, 1024621733, -1103504000, 1043582890, -1116867442) + + W(6, -1148690252, 1001004257, 1060096717, 1077176219) + W(7, 1060014437, 1016774454, -1107960970, -1139511962) + + W(8, 1037770975, -1132010249, -1108861100, 1047972499) + W(9, -1098623231, 1034159573, 1020716885, 1042264637) + + W(10, -1105952484, 1037805583, -1087084008, -1070507600) + + W(11, -1092504349, -1105946989, 1041667680, -1102914489); + WS(1041580764, 1025947967); + sum1 = W(0, 1032565172, -1116825273, 1019951750, 1022134396) + + W(1, -1111515158, 1034025399, -1110133221, -1159719714) + + W(2, 1034662848, -1104706235, -1115255997, -1107214727) + + W(3, -1098820316, 1032808736, -1102823188, 1021100817) + W(4, 1053611982, 1050747028, 1050206724, 1063007652) + + W(5, 1060757006, 1052025888, 1043880105, 1052817434) + + W(6, -1093835868, -1092905173, -1095669879, -1096926641) + + W(7, -1089733625, 1049974094, -1099659531, -1119725058) + + W(8, -1131110976, -1131069497, 1036897764, -1105182467) + + W(9, -1098715869, -1104277767, -1106501955, -1106408671) + + W(10, 1036244351, -1119290642, 1017394926, 1029927621) + + W(11, -1106823604, 1037476046, -1114565306, -1122404893); + sum2 = + W(0, -1132209742, 986836209, -1121945777, -1170553346) + W(1, -1138085578, -1127752664, 1024317954, -1170071298) + + W(2, 1031078182, 1029631070, -1119773491, 1020231728) + W(3, 1023900693, -1133642976, 1016594015, -1123929889) + + W(4, -1131885988, 1025515900, 1029199828, -1120148774) + + W(5, -1122079840, 1019687015, 1019770946, -1134784812) + + W(6, -1109418986, -1129378830, -1113141662, 1055904551) + + W(7, 1057958803, 1044815557, -1115676013, 1040873658) + W(8, 969823813, 1027058278, 1030656895, -1099466937) + + W(9, -1089769002, -1096970616, -1105180704, -1104818759) + + W(10, -1135041624, 1012367442, -1116640321, 1014349374) + + W(11, 1019607807, 1019685270, 1040370156, 1020720783); + WS(-1101021916, -1101341893); + sum1 = W(0, 1026213188, -1128959914, 1026395551, -1114900877) + + W(1, -1152047246, 1012420650, 1006057769, 1026345301) + + W(2, -1104193847, 1029994953, -1146733010, 1036038140) + + W(3, 1031817213, -1118727997, 1021561044, -1106810537) + + W(4, -1099125811, -1096018912, -1093634574, -1086773562) + + W(5, -1090412335, -1107844781, -1104575744, -1104632714) + + W(6, 1055643976, 1049220736, 1055313981, 1052012604) + W(7, 1060627153, 1051291321, 1049980081, 1047342967) + + W(8, 1025577212, -1111820508, -1119144868, -1127551698) + + W(9, -1111302883, 1025725832, -1112108341, 1003961523) + + W(10, -1110018309, 1025253614, -1114303945, -1123712161) + + W(11, 1028280877, -1119269431, 1031833384, 999050183); + sum2 = + W(0, -1131988010, 1023490159, -1126411872, -1164111651) + W(1, -1121501747, 1031886393, -1117332099, 1035364539) + + W(2, -1111316079, 1007442131, -1122871173, 1046145376) + W(3, 1040330964, -1109560063, 1016982738, 1005935896) + + W(4, 1041465340, -1100903601, 1038743702, -1093182708) + + W(5, 1049859497, -1098635398, 1035352171, -1113093917) + W(6, 1024389323, 1055734435, 1080207498, 1078445253) + + W(7, -1068399047, -1066503158, -1109489195, 1012210427) + + W(8, -1121573843, -1125698351, 1043717463, 1049726225) + + W(9, -1122596352, -1100760677, -1113462329, 1035980752) + + W(10, -1149117460, -1131908940, -1114017647, -1119425741) + + W(11, 1019240934, 1009702615, 1032687935, -1141270643); + WS(1046490332, 1041425064); + sum1 = W(0, 1024529499, 1033054902, 1031945755, -1146773895) + W(1, 1029605664, 1004520717, 1031502108, 1024614604) + + W(2, -1116828595, 1002731779, 1040980232, -1160896989) + W(3, 1052617834, 1015420456, 1044142352, 1032157630) + + W(4, -1093042204, -1098109922, -1092614541, -1086741475) + + W(5, -1091564618, -1090483479, -1094325635, -1086427940) + + W(6, 1043650965, 1045029126, 1058500980, 1055608303) + W(7, 1058257970, 1019101890, 1041689704, 1049761551) + + W(8, 1015429414, -1106337284, 1033182334, -1109695552) + + W(9, -1174108025, 1029823567, -1123497953, 1041880275) + + W(10, 1019425762, 995804238, 1032419541, -1179835378) + + W(11, 1044059953, -1127672093, 1032927635, 1040104968); + sum2 = W(0, -1122431319, -1114479591, 1024826864, -1100833312) + + W(1, 1043724086, -1109354990, -1130104331, 1015245663) + + W(2, 1026151548, -1106953243, 1048064546, -1097347844) + + W(3, 1037967160, -1109085075, -1110876131, 1007980535) + W(4, -1122010793, 999999917, 992235770, 1040448763) + + W(5, 1044292364, 1032432738, -1143420941, 1040568157) + W(6, 1049905644, -1108260971, 1050719290, 1045454882) + + W(7, 1049686405, -1111087807, -1098496523, 1043523736) + + W(8, -1102178930, -1125976243, -1123774104, -1096948195) + + W(9, 1038302972, -1108325988, -1118752296, -1113347688) + + W(10, -1124048569, -1126306455, 1025075060, -1105554812) + + W(11, 1034346164, -1114960687, 994535386, 1032072922); + WS(-1096079726, -1086813702); + sum1 = W(0, -1135457777, 1020632987, -1136898909, 1041289173) + + W(1, 1012368645, 1002632984, 1024629150, -1127204699) + + W(2, -1105268453, -1134572551, -1100910973, -1166801940) + + W(3, 1038525034, -1102504381, 1029902179, -1110256943) + + W(4, 1045566625, 1038076635, -1141635906, 1058638213) + W(5, -1104077708, 1033251913, 1009307365, 1022942147) + + W(6, -1104980990, -1125909619, -1094783105, 1057673490) + + W(7, -1100424110, -1111352769, 1012100357, -1133590617) + + W(8, -1105625101, -1145052038, 1032999502, 1030475041) + + W(9, -1113674176, -1113040784, 992583714, -1114381639) + + W(10, -1128467237, 1035122115, -1125440663, 1035865453) + + W(11, 988204202, -1119749552, 1027550920, -1124393059); + sum2 = + W(0, 1009177065, -1120740066, 1031366584, 1041576942) + W(1, -1100270767, 1045439690, -1125959183, 1033773937) + + W(2, -1117003048, 1013092463, -1102800003, -1090661723) + + W(3, 1059100650, -1097382737, 1022453518, -1106788899) + W(4, 1042183695, 1025589372, -1111208570, 1068855162) + + W(5, -1085550755, 1044086134, 1032267243, 1025170288) + W(6, -1105766164, 1042721142, -1149080533, 1040487387) + + W(7, 1023619821, -1099098175, -1126080241, -1106320787) + + W(8, -1112946812, -1113055730, -1103263899, 1030911277) + + W(9, -1103276630, -1114239046, -1107084863, 1019625936) + + W(10, 1019480223, 1026018809, 1020058227, 1007104581) + + W(11, 1029611268, -1162581429, 1037226018, -1116554192); + WS(1059841719, 1028884484); + sum1 = W(0, -1113543486, -1112448166, -1123514455, 1014814024) + + W(1, -1116573889, -1120616579, -1132301434, -1127146586) + + W(2, -1108411818, -1111506273, -1104706915, -1096756366) + + W(3, -1106354949, -1107115957, -1117349474, -1105758103) + + W(4, -1112074625, 1034453786, 1033474668, 1052483434) + W(5, 1048710884, 1049505778, 1050151687, 1056594572) + + W(6, 1058342439, 1041783662, 1050338440, 1043430567) + + W(7, -1116369607, -1117001986, 1011608836, -1106214629) + + W(8, -1101044205, -1112657624, -1103529079, -1099567912) + + W(9, -1110811775, -1119641312, -1133908615, -1113349351) + + W(10, -1143395087, -1122260358, -1124590486, -1132902244) + + W(11, -1118491109, -1118809775, 996976763, -1114523384); + sum2 = W(0, -1131846847, 999597315, 997751878, -1114921220) + W(1, 1031101790, -1115596944, 1024706196, -1120544321) + + W(2, -1142019487, 973346488, -1127636492, -1114646695) + + W(3, -1098897499, 1027087956, -1111832500, 1029100436) + + W(4, -1119272484, -1113005256, -1113445057, 1055277760) + + W(5, 1032426103, 1036539833, -1114392819, 1010252474) + W(6, 1043688817, -1112114230, 1056371527, 1041350431) + + W(7, 1038923617, -1123786644, -1130636099, -1123180191) + + W(8, -1110979463, -1112619479, -1097247478, 1019660165) + + W(9, -1105379211, 1026606310, 1012894502, -1125326592) + + W(10, -1128104285, 1003422803, 1021279303, -1127196333) + + W(11, -1138766624, -1129408714, -1130181692, -1164469676); + WS(-1092619630, -1089382730); + sum1 = W(0, -1111364766, 1043539187, 984781533, 1030068626) + W(1, 1026274177, -1111039089, 1024515101, -1120853581) + + W(2, 1023648980, 1020312451, -1115220152, -1101226428) + + W(3, 1038621209, -1105671421, -1101912057, 1015856825) + + W(4, 1039669985, -1096148415, 1055391282, 1026945555) + + W(5, -1081505706, 1045179252, -1132720100, 1027675681) + + W(6, -1112475547, 1048019422, -1085560118, 1059189430) + + W(7, 1059392734, -1105049488, 1041558112, -1133761880) + + W(8, -1102256285, 1027548272, 1048070471, -1108016176) + W(9, 1040580240, 1037378816, 1031071010, 1032748839) + + W(10, 1036516737, -1110790259, 1016263062, -1120756633) + + W(11, 1007770772, 1034683832, -1109624324, 1021933410); + sum2 = + W(0, 1021752691, -1117827136, -1125983252, 990310070) + W(1, -1109957501, 1040724727, -1109878975, 1031887118) + + W(2, -1111677325, 1031932470, -1130612142, -1104195843) + + W(3, -1168184730, -1105272655, 1035492359, -1103738768) + + W(4, -1108952074, -1110048197, 1045228241, 1051763659) + + W(5, 1028013889, -1136328910, -1114456338, -1114723198) + W(6, 1033183913, 1038437939, 1050756049, 1045197632) + + W(7, -1115591069, -1123843648, -1120329563, 1035246991) + + W(8, 1044091848, -1103930854, 1008734718, -1105931725) + + W(9, -1149204891, 1020655719, -1120613434, -1121689275) + + W(10, -1113755692, 1027358915, -1104619422, 1032921649) + + W(11, -1117367196, -1140627498, 1033876328, -1121880867); + WS(1051433070, 1041054969); + sum1 = W(0, 1027474774, 995089009, 1034863641, -1109189270) + W(1, 1039503310, -1126811322, 1033371404, 1010666397) + + W(2, 1025557871, 1019369911, 1049084179, 1046403907) + W(3, 1044512531, 1035909664, 1033234174, 1028564471) + + W(4, -1105663671, 1032468488, -1096978722, -1082587707) + + W(5, -1102025153, -1107200379, -1104819461, -1106755535) + + W(6, 1035613609, 1037418314, 1039456478, -1080639932) + W(7, 1026454114, 1042549431, 1042229543, 1034360184) + + W(8, 1041537220, 1036952965, 1041156238, 1049567823) + W(9, 1040087661, 1039105725, -1131034584, 1031577769) + + W(10, 1027665948, -1122283488, 1041167849, -1112387034) + + W(11, 1039611744, -1137459494, 1031071714, 1033297350); + sum2 = + W(0, 1039097792, -1128793460, -1140010118, 1022871695) + W(1, -1138263433, -1112923836, 1026478628, -1110368657) + + W(2, -1103860174, -1106733661, 1043000544, -1106671798) + + W(3, 1046664654, -1123142296, 1037719970, 1042580191) + W(4, -1106228186, 1050938198, -1100268114, 1039252188) + + W(5, -1099105674, -1121884665, -1100173198, 1034926170) + + W(6, 1004583985, -1097187313, 1021007203, 1053089515) + W(7, 1048715277, -1114597930, 1047464456, -1106315502) + + W(8, 1031892389, 1046933969, -1107049139, 1049075999) + + W(9, -1103930146, 1022883749, -1098080196, -1108178582) + + W(10, -1133334119, -1107245750, 1039577114, -1104825734) + + W(11, 1030321621, -1117968576, 1036807670, 1018138445); + WS(-1097236334, -1078251511); + sum1 = W(0, -1147379729, 981774949, -1145120489, -1112510828) + W(1, 975327689, 1008364580, -1140670990, 1022969831) + + W(2, -1107131303, 1007351583, 1033603653, 1043141838) + W(3, 1029606457, 938727969, 1020032977, -1108966769) + + W(4, -1102832418, -1125527926, -1095625930, -1082084799) + + W(5, -1090577043, -1093823475, -1098508888, -1096801949) + + W(6, 1058323440, 1053289720, 1056660465, 1032726417) + W(7, 1058345481, 1053416161, 1046390514, 1049766564) + + W(8, 1023750586, -1121375351, 1026746467, 1033795604) + + W(9, 1025947909, -1131151340, -1119905544, 1037296218) + + W(10, -1116361496, -1124892056, -1128008098, -1117973855) + + W(11, -1148460889, -1125502955, 999577711, 1010324189); + sum2 = + W(0, 1024894779, 1020144998, -1118791847, 1007750652) + W(1, -1137666916, 1023698735, 1009542396, -1129126018) + + W(2, -1102276353, 1025017931, -1107221556, 1046635995) + W(3, -1132306598, 1023586615, 1030880679, 1015842286) + + W(4, -1120020336, -1096890621, 1050182775, 1039741552) + + W(5, 1043589185, -1108361045, -1114600836, 1024872627) + + W(6, -1081787381, -1080908066, -1102161510, 1072604155) + + W(7, 1055213170, -1115556916, 1037616572, -1105259074) + W(8, 1039662448, 992888305, -1130889346, 1039835396) + + W(9, -1110509653, -1122324709, 1000980713, -1124270218) + + W(10, 1023553607, -1118655405, -1120230550, -1126400334) + + W(11, 1020541198, 1020891302, -1119304668, 1033066840); + WS(-1095840110, 1065907853); + sum1 = W(0, -1149009607, 1029310442, -1122029108, -1136794300) + + W(1, -1118254622, -1132243967, -1126823604, 1010554921) + + W(2, -1123781617, -1130903741, -1115466131, 964920945) + + W(3, -1115351608, 1043406509, -1116119295, 1040435870) + W(4, 1057715094, 1048478500, 1058442742, 1045634572) + + W(5, 1052165513, 1053323726, 1042519141, 1051535704) + + W(6, -1102734645, 1041326469, -1088947208, -1083008792) + + W(7, -1096684061, -1089856222, -1127763004, -1095672430) + + W(8, -1101560548, 1036129479, -1107277134, -1109559039) + + W(9, 1036543086, 1024712701, 1009014011, -1114598742) + W(10, 1034276991, 1021921030, 1036949012, 1024401462) + + W(11, -1114280609, 1035777670, -1132072137, 1024787534); + sum2 = + W(0, -1122765153, -1119761608, -1115823403, -1123357438) + + W(1, -1105805209, 1031734555, -1111986136, -1126486235) + + W(2, -1112086475, -1118318168, -1121250504, -1119202357) + + W(3, 1024515185, -1130234658, -1134784044, 1026675759) + W(4, 1040388299, 1023061820, -1128744886, 1057284387) + + W(5, -1103324019, 1037222780, -1110952019, -1117543075) + + W(6, 966593378, -1102263327, -1110151426, 1059190541) + W(7, -1106793279, 1050053336, -1107073751, 1021583022) + + W(8, -1114107386, -1113965021, 1045334069, -1118800384) + + W(9, -1164047122, 1025627836, -1114668630, -1124432766) + + W(10, 975247631, -1137846028, -1111548146, 1023792011) + + W(11, -1112106446, 1020007628, -1125560981, -1131408661); + WS(1024351088, -1094038469); + sum1 = W(0, 1016930687, 1024919184, 988693323, 1038267403) + W(1, 1001354275, -1123840710, -1125725377, -1120680465) + + W(2, 1038061004, -1118029957, 1005748798, 1038925818) + W(3, 1032752795, 1034287148, -1110688307, 1036629872) + + W(4, 1052546457, 1050276351, 1052906127, 1062157201) + W(5, 1055274272, 1050137483, 1036684158, -1112935826) + + W(6, -1086527812, -1103330015, -1085615881, -1097782940) + + W(7, -1088621706, -1090365828, -1108159426, -1098987606) + + W(8, 1040515838, 1027568116, 1040353352, -1124671689) + W(9, -1113419105, 1017331974, 1018660298, 1039926041) + + W(10, 1006605995, 1004978763, 1030413326, 1031140124) + + W(11, 1009586849, 1023985459, -1129057942, -1120649652); + sum2 = + W(0, 1018662896, -1131745232, -1136728576, -1110788716) + + W(1, -1123530251, -1101470606, -1110519714, -1125138150) + + W(2, 1033363591, 1031409358, 1036576685, 1060006588) + W(3, 1052968790, -1102632350, -1105224546, -1083015355) + + W(4, -1101021011, -1109130821, -1097527529, 1058553385) + + W(5, 1023922010, 1057288665, -1111209476, 1034932287) + W(6, -1107389045, 1050735765, 1043333749, -1120731420) + + W(7, -1100470754, -1097217661, 1038218737, 1047940150) + + W(8, 1013978472, -1122086781, 1029525730, -1118628277) + + W(9, -1117232951, -1112638769, -1121310567, 1023530026) + + W(10, -1120396150, 1024022584, 1015209616, 1030135008) + + W(11, 1018906596, -1121049341, 1024891644, -1113292326); + WS(-1086599863, 1058406314); + sum1 = W(0, -1165120005, -1133002117, -1129945046, 1024249318) + + W(1, -1119162837, 1026085015, -1121003281, -1127955907) + + W(2, 1027409257, -1121445206, -1106007410, -1105883025) + + W(3, -1105279538, -1127421331, -1109094875, 1024561201) + + W(4, 1060099497, 1049800473, 1059141168, 1051534797) + W(5, 1058010671, 1051659429, 1047889907, 1050835423) + + W(6, -1093079745, -1099695891, -1091476505, -1093891126) + + W(7, -1094225343, -1106347590, -1098091099, 999784785) + + W(8, -1114693988, 1033258882, -1129815521, -1124179562) + + W(9, -1106482085, -1112036922, 1030868870, -1097732400) + + W(10, 1019186220, 1025328858, -1128567742, 1017248474) + + W(11, -1123837177, 1031899202, -1123224348, -1141903913); + sum2 = W(0, -1116781913, 1016621488, -1133566515, -1124282558) + + W(1, 1034216133, -1128560494, 991940908, 1017899660) + W(2, 1031543998, 1029140379, 1044191480, -1105795809) + + W(3, 1017978886, -1175609568, -1120640387, 1019924506) + + W(4, 1082393585, 1078957479, -1080327233, -1065075267) + + W(5, -1076777978, 1030943022, -1110243052, -1113970478) + + W(6, 1050004941, 1028477447, -1104837212, -1086493521) + + W(7, -1109285108, 1045155438, 1033432207, -1130476854) + + W(8, 1025243259, 1010603263, -1125439138, -1117319975) + W(9, 988101688, 1024551608, -1129511338, 1020472787) + + W(10, -1123250937, -1125975170, 1007793087, 1028403247) + + W(11, -1125200922, 1020903576, -1119399555, 1028374268); + WS(-1102531292, -1104168529); + sum1 = + W(0, -1149508566, -1156103398, 1005530819, 1019304359) + W(1, -1111288609, -1152861762, -1123770879, 992160490) + + W(2, 1032023755, -1123937923, -1114986325, -1105594348) + + W(3, -1100927253, 1042848102, -1131000647, 1048571064) + W(4, 1058049088, 1044530702, 1057825341, 1061967565) + + W(5, 1057378026, 1043852869, 1032195229, 1021567685) + + W(6, -1091020399, -1093487559, -1088576155, -1113700815) + + W(7, -1096522221, -1100187457, -1097716728, -1095320739) + + W(8, -1123106485, 1028416434, -1124442300, -1132463754) + + W(9, -1107169312, 1030031137, -1127676038, 1015048992) + W(10, 1018386839, 1022122127, 1027828556, 1023613146) + + W(11, -1118265958, 1031835352, -1124424850, -1151822630); + sum2 = + W(0, -1112466451, -1130983341, 1032826781, -1114093653) + W(1, 1040752192, -1154197073, 1026229169, 1032051747) + + W(2, 1034684305, 1035765483, -1117553496, -1101908611) + + W(3, -1105770401, -1106309648, 984953298, -1113409477) + + W(4, -1101371049, -1113050760, -1096382267, 1063677104) + + W(5, -1132405995, -1114901667, 1023704972, -1104964374) + + W(6, -1100658772, -1100149859, 1042208912, 1062452463) + + W(7, 1047214162, -1095028755, -1109270652, -1107539022) + + W(8, 1043071493, 1039321546, -1131759707, -1106482074) + W(9, -1105645940, 1034888818, 1035103126, 1008251057) + + W(10, -1119405084, -1140521940, -1127348451, 1028341682) + + W(11, 1022142418, -1118255322, -1118485150, 1025943565); + WS(-1107552696, -1110437397); + sum1 = + W(0, 994440345, -1123893979, -1123659045, 1033249360) + W(1, -1115012423, 1025628848, -1120012907, -1138236651) + + W(2, -1114854865, -1115498472, -1107252796, -1098484960) + + W(3, -1105215024, -1113844817, 1015022176, -1112267573) + + W(4, 1038159592, -1143015444, 1048547885, 1066459081) + W(5, 1050116824, -1114931568, -1139703834, 1030992175) + + W(6, -1169396004, -1103811554, -1102945115, 1054059005) + + W(7, -1110458371, 1027966800, -1137430074, 1038350450) + + W(8, -1112745281, -1176837895, -1113210869, -1092775086) + + W(9, -1107508006, -1115481499, -1123286831, -1114208046) + + W(10, 1003079356, -1126823399, -1127252913, 1036761683) + + W(11, -1117476787, -1139958260, -1143819946, -1119805695); + sum2 = + W(0, -1128900045, -1134566747, 1023101249, -1119409466) + W(1, 1014344875, -1124604689, -1135550339, 1011013307) + + W(2, 1032112026, -1121844433, 1024457633, 1041370918) + W(3, -1138667107, 1023011873, -1123574415, 1018662193) + + W(4, -1122103841, 1023900033, -1130431017, 1071310745) + W(5, 1015570157, 1025187637, 1029193653, -1118001398) + + W(6, 1020429393, 1031965476, 1010339139, -1073631838) + W(7, 1024644617, 1038341472, -1117036677, 1034637136) + + W(8, -1123818335, -1168200234, -1111989275, -1111141033) + + W(9, -1128248465, 1032459330, 999769253, 1020580065) + W(10, 1025087925, -1116320886, 1037399444, -1131868341) + + W(11, 1027301561, -1118206868, -1124415769, -1136885571); + WS(-1106869980, -1095812171); + sum1 = W(0, 998635262, -1132768195, 1031165051, -1109012795) + W(1, 1031921458, 959153786, 1015400066, 1020404450) + + W(2, 1030538232, 1032306163, 1040655940, 1049530762) + W(3, 1035845131, 1029124089, 1034791747, -1126776961) + + W(4, -1104276842, 1027943897, -1094369165, -1079963696) + + W(5, -1094529094, -1138415831, -1107836910, -1127281161) + + W(6, 1021368885, 1042581143, 1043839724, -1098205560) + W(7, 1041010327, 1043286153, 1040781721, 1032119517) + + W(8, 1037657452, -1130589992, 1045125152, 1052736873) + W(9, 1041646697, 1033263566, -1127518347, 1032079673) + + W(10, 1012233735, -1127936403, 1030674671, -1106402911) + + W(11, 1035635524, -1117746707, 1026900011, 1007765715); + sum2 = + W(0, -1137391706, -1152109415, 1015680093, -1108578627) + W(1, 1012334874, -1126811133, -1146463859, 1013671002) + + W(2, 1016897725, -1123613558, 1031100358, 1031185182) + W(3, 1018767069, 1016912269, -1123894542, -1129388765) + + W(4, -1122041158, -1117579022, 1032233585, 1068869480) + + W(5, 1031129926, -1135215962, -1172726683, 1025914590) + + W(6, 1032188407, 1034093919, -1107212716, -1079207220) + W(7, -1118301998, 1010098650, 1010207290, 998321459) + + W(8, 959684203, -1123954990, -1144448755, -1112638895) + + W(9, -1145613555, 1002322227, -1163026381, -1185201771) + + W(10, 1004755699, -1142267571, 1020208893, -1131161181) + + W(11, 1014639674, 1010341946, -1128211133, 1014227898); + WS(-1106551004, 1058945856); + sum1 = W(0, -1136733265, 1029534949, 1040114552, 1023973738) + W(1, 1008178533, -1121731675, -1122738710, 998670125) + + W(2, 1027999917, -1110759309, -1101184472, -1136820001) + + W(3, -1120539979, 1050535890, 1036280349, -1112884987) + W(4, 1036329486, 1039804839, 1055915689, 1045009467) + + W(5, -1099722578, -1092228133, -1110742697, -1133144549) + + W(6, 1021052191, -1090459221, -1088507490, -1102642413) + + W(7, 1057115504, -1141944531, 1036514925, 1024140334) + + W(8, -1112842790, 1042972690, -1116549941, 1048917175) + + W(9, -1103385510, 1042662182, -1123309658, 1040183891) + + W(10, 996925861, -1126301053, 1035692146, -1116120689) + + W(11, 1032281663, 1025401864, -1122836256, 1009223461); + sum2 = + W(0, -1166199047, 1008667864, -1137339492, -1142224481) + W(1, -1152330850, 1020018908, -1116618549, 1015962596) + + W(2, 1029866216, -1111274931, 1026227362, -1119220040) + + W(3, 1031356244, -1116678638, 1026327024, -1189397276) + + W(4, -1143586281, 1037662319, 1052978055, -1079795268) + + W(5, -1109068899, 1041694498, -1122243464, 1027749752) + W(6, 1016771040, 1050961303, 1073672156, -1075413433) + + W(7, 1029037052, 1026323256, 1021575344, -1119692611) + W(8, -1123676489, 1039205717, 1048063806, 1028203090) + + W(9, -1113725553, -1115208722, 1002430881, -1114291930) + + W(10, -1174784654, -1119230230, -1117826448, 1028246046) + + W(11, -1160612324, 1024440460, -1126523302, 1031666290); + WS(1045979868, -1116118129); + sum1 = W(0, 1019079208, -1124899402, -1142300538, 1011594153) + + W(1, -1134190949, -1132197046, -1116332853, -1135144470) + + W(2, -1115974509, -1114857165, -1110287856, -1099509298) + + W(3, -1112842949, -1107483943, -1111331677, 1018268010) + + W(4, 1054347779, 1046800787, 1053005207, 1063937495) + W(5, 1058166871, 1048177899, 1047873428, 1056893199) + + W(6, -1096855346, -1098629066, -1093283235, -1097005655) + + W(7, -1090046872, -1104885511, -1102896822, -1096686406) + + W(8, -1118610636, 1029706377, 1028644213, 1015974258) + + W(9, 1040979430, -1129150352, 1028514810, -1118433447) + + W(10, -1120438410, 1017939836, -1131155654, -1116499825) + + W(11, -1119992573, -1120133576, -1118080608, -1112688517); + sum2 = + W(0, -1132220574, -1115410889, 1017347763, -1123931551) + W(1, 1027749497, -1111299822, 1025854529, -1123916419) + + W(2, 1034058342, -1116250603, 1029372102, -1101916549) + + W(3, -1104316591, 1035393713, -1107314572, 1033668899) + + W(4, 1008450820, -1126553639, -1105866140, 1053545154) + + W(5, 1054419707, -1102688086, 1036131430, -1144517652) + + W(6, -1132397996, -1097158033, 1060185134, 1060913993) + W(7, 1033775493, -1115290197, -1106841697, 990325833) + + W(8, -1105536207, -1108668742, -1106418349, -1104852271) + + W(9, -1106993048, -1102129692, -1149271050, -1114889391) + + W(10, 1025437040, -1118211898, 1034066570, -1102379864) + + W(11, -1133416673, -1209279719, -1133826631, -1129688184); + WS(1058774455, 1069380246); + sum1 = W(0, 1032626516, -1119757626, 1033017026, 1015522813) + + W(1, -1128327131, 1036888920, 1032769109, -1148588495) + + W(2, -1114780225, 1038823639, -1098306133, 1034533838) + + W(3, -1103839696, -1112718001, -1126986782, 1012070438) + + W(4, 1045065548, 1040221656, 1021036585, -1082356272) + W(5, 1057244812, 1032300191, 1043416793, 1045596067) + + W(6, -1111975378, -1115053555, 1050529784, -1095104409) + + W(7, -1133328720, -1111385431, -1124233691, -1105784401) + + W(8, 1025328225, 1020222778, -1115391173, 1045288819) + W(9, -1116298540, 1042918995, 1029500622, 1037659662) + + W(10, -1121960111, 1037972921, -1112361500, -1139302935) + + W(11, 1018289699, -1110693582, 1027375220, -1114680879); + sum2 = W(0, -1129789987, 1019234847, -1128803579, -1112792165) + + W(1, 1011967806, 995307959, 1018394359, -1112288614) + W(2, 1017265095, -1124971531, 1043137983, 1047657371) + + W(3, 1034970984, 1010908150, -1107223361, 1027672251) + + W(4, -1124616639, -1114025560, -1132476030, -1114992592) + + W(5, -1098689491, -1115509379, 1006851110, -1128503755) + + W(6, -1116091154, 1022067335, -1102585265, 1052022695) + W(7, 1033604172, 1031244615, 1032350856, 1024636851) + + W(8, 1033010488, -1114442452, 1028851843, -1115343414) + + W(9, 1002830796, -1121158047, -1114060980, 1027935499) + + W(10, 1011223606, -1117824661, 1031833634, -1136738894) + + W(11, 988094894, 1025799099, -1118870225, -1127411999); + WS(1065814108, -1098421406); + sum1 = W(0, 1030554015, -1131576032, 1020712308, 1019668842) + W(1, -1178997255, 1023970854, 1011631425, 1023862096) + + W(2, -1104400078, 1022555209, -1130072911, -1118231891) + + W(3, 1041059117, -1115494780, 1035736611, -1104560304) + + W(4, -1097091133, -1099298246, -1094842433, -1084181571) + + W(5, -1098796514, -1094912271, -1090107010, -1092396649) + + W(6, 1050276747, 1048827844, 1057743463, 1051719984) + W(7, 1058357819, 1056339293, 1051879221, 1057941592) + + W(8, 1045406982, -1106685173, 1040093248, 1018405640) + + W(9, -1118903138, -1115388505, -1113309730, -1118151090) + + W(10, -1119880969, -1132305362, -1122176686, 1026194364) + + W(11, 1004376640, 1024072531, 1009992363, 1029155252); + sum2 = W(0, -1104337717, 1027104118, -1114433477, -1122138940) + + W(1, 1048327612, 1018207462, 1015118770, 1054676844) + + W(2, -1085961218, 1036459641, -1092980271, -1101372003) + + W(3, -1098271754, -1115566688, -1101224844, -1105452167) + + W(4, 1065899128, -1117484391, 1062039746, 1077763913) + + W(5, -1088377514, -1079225367, -1106150830, -1079350028) + + W(6, 1055232204, -1101810882, 1049041629, 1071302707) + + W(7, -1084489503, -1087139921, 1036291830, -1090077553) + + W(8, -1090132108, 1052764213, -1092098978, -1123596042) + + W(9, 1027311380, 1042626102, -1105072819, 1053993534) + W(10, 1023963317, 1014918739, 1035158266, 1027553578) + + W(11, -1115760458, 1025357528, 1032466828, -1115160051); + WS(-1083527351, -1082119000); + sum1 = W(0, 1025283773, -1132057884, 1024000280, -1117776915) + W(1, 994019357, -1146975260, 1021506300, 1016847260) + + W(2, -1100516229, 1028453762, -1124447466, 1027818609) + + W(3, 1030853236, -1120656758, 1023329542, -1111423375) + + W(4, -1103907601, -1097545679, -1096840081, -1088298777) + + W(5, -1090997910, -1097629690, -1102673054, -1097673748) + + W(6, 1054198743, 1048327710, 1054350616, 1057412078) + W(7, 1059405315, 1052404744, 1051692752, 1047886934) + + W(8, -1139734483, -1114897689, -1109407791, -1112548849) + + W(9, -1107996896, 1035903152, -1110888465, 1034953432) + + W(10, -1115248201, 1021031566, -1115380998, -1139302503) + + W(11, 1029448614, -1119316016, 1026998601, -1149960989); + sum2 = W(0, 1023717076, 996584188, -1122858228, 1005163886) + W(1, 1025356913, -1118691920, 1028885707, -1114207359) + + W(2, 1034248479, -1120794590, 1037241484, -1124781820) + + W(3, -1115274025, 1026099362, -1121079636, 1010502519) + + W(4, -1110594365, 1045315954, -1111180041, -1088752945) + + W(5, -1100621689, 1052626156, -1114153113, 1038857859) + + W(6, -1113079527, -1094151830, -1064957365, -1066051811) + + W(7, 1081496726, 1084041658, 1034711477, -1115018893) + + W(8, 1030579691, -1113958061, -1106054130, -1113733983) + + W(9, 1049150725, 1032870315, 1042989109, -1106741724) + W(10, 999456782, 1021526858, 1018369486, 1031457177) + + W(11, -1112407773, 1022214782, -1108284893, 1023330420); + WS(1031453552, -1108810221); + sum1 = + W(0, -1122540068, -1141490084, -1132153597, 1029503994) + + W(1, -1126370513, -1127727061, -1132743443, 1024122485) + + W(2, -1106571135, 1028200745, -1106394603, 1029495448) + W(3, -1118016922, 1043712879, 1035505061, 1041979953) + + W(4, -1105389195, 1023785053, 1041720002, -1089108304) + W(5, 1047749927, -1092241143, 998106632, -1098695505) + + W(6, 1051764564, -1104087736, 1055195957, -1096098616) + W(7, 1047204316, 1028938666, 1043190746, 1039644831) + + W(8, -1121040220, 1027661528, -1111907522, 1031937892) + + W(9, -1112974291, 1025162247, -1152510101, 1002213552) + + W(10, -1136080166, 1023137883, -1123745267, 1034024448) + + W(11, -1121356173, 1028910871, -1121641711, 1025100697); + sum2 = + W(0, 1032316109, -1122133197, 1021061413, -1122180337) + W(1, -1115376331, -1123716599, 1008734994, -1144451812) + + W(2, -1117365450, 1033736971, -1117276879, 1009179554) + + W(3, 1034450077, -1100616286, -1130550593, -1102305630) + + W(4, 1028239450, -1104139010, -1090538079, 1022309577) + W(5, -1125496737, 1059658657, 1014965154, 1053491799) + + W(6, -1106184057, 1045998485, -1087751568, 1065712953) + + W(7, -1100319643, -1100023584, -1115246006, -1107982835) + + W(8, 1039709205, -1126266788, 1056538813, -1098763613) + W(9, 1017435581, 1022563437, 980175008, -1103966134) + + W(10, -1127567978, 1029398164, -1106793212, 1016414657) + + W(11, 1032114232, -1113653553, 1034308617, 1020870093); + WS(1060627383, -1111244297); + sum1 = W(0, -1124372048, -1124233202, -1115057922, -1126359548) + + W(1, -1135390133, 999175032, -1137033126, -1120904377) + W(2, 1041984816, 1023856878, 1037843884, 1013283185) + + W(3, -1106598024, -1109047521, -1108189319, -1127664786) + + W(4, -1098607926, -1097555068, -1092180401, 1035134080) + + W(5, 1055432750, 1050330552, 1046692025, 1039361415) + W(6, 1048999428, 1050454749, 1057072683, 1037566628) + + W(7, -1088869991, -1097603878, -1106138715, -1115643873) + + W(8, -1110297584, -1119853981, -1100337986, -1117600845) + + W(9, 1045634091, 1040799043, -1129123036, 1042168959) + + W(10, 1037179887, -1124350564, 1037306108, -1180500637) + + W(11, -1107300041, -1132131255, -1126029544, -1132202938); + sum2 = + W(0, 1027553654, -1128416633, -1120268362, 1026192109) + W(1, 1010812163, -1133939099, 1033310247, 1007338654) + + W(2, -1105419467, 1035214610, -1102082588, 1034096310) + + W(3, -1109637676, 1042926233, -1103557522, 1039202903) + W(4, -1141314538, 992160749, 1039698771, 1028842291) + + W(5, -1128101012, -1110346070, 1041169016, -1150310139) + + W(6, 1051401064, -1098506313, 1041311911, 1044707561) + W(7, 1040877432, -1107620104, 1044637450, -1101325278) + + W(8, 1061407816, 1048701957, 1065441970, -1108357660) + + W(9, -1080219839, -1089748519, -1106511250, -1094091750) + + W(10, -1086513034, 1023990179, -1083801169, 1027929117) + + W(11, 1058347144, 1054974548, 1012370076, 1054706164); + WS(1037089208, -1117319375); + sum1 = W(0, -1117307261, -1109658215, -1104716662, -1095157370) + + W(1, -1115283233, -1113906562, -1127634429, -1150522598) + + W(2, -1127081515, 1037266337, 1045840649, 1048384396) + W(3, 1042005149, 1026318614, 1035073906, -1129730364) + + W(4, -1090315640, -1103803502, -1108965493, -1089739445) + + W(5, -1098438340, -1090508193, -1096110967, -1090097982) + + W(6, 1055484319, 1036834781, 1059715066, 1050929076) + W(7, 1059599591, 1050537744, 1039184033, 1056916499) + + W(8, 1019801962, -1121027890, -1120952094, -1115632913) + + W(9, -1115851136, 1036887192, -1109698481, 994450682) + + W(10, -1140393804, -1122236391, 1007521585, -1115666157) + + W(11, 1038771059, -1114842616, 1040209394, 1023772594); + sum2 = W(0, -1096641595, -1086741683, -1073585699, -1071753138) + + W(1, -1078410756, -1096289506, -1145261363, 997353903) + W(2, 1051991389, 1059199896, 1069582799, 1070628328) + + W(3, 1067042424, 1055331220, 1015112751, 1024293693) + W(4, -1107135642, 1044105651, 1057042277, 1065961920) + + W(5, 1057516905, -1098611055, 1043415065, -1101981251) + + W(6, -1120991144, 1025236133, -1123268190, -1098135951) + + W(7, 1032298014, -1106950583, 1007537613, 1025642916) + + W(8, -1123228782, 1032269711, -1116194138, -1144560253) + + W(9, 1026966393, -1155415556, 992611856, 1011854094) + + W(10, -1119770484, 1020415755, -1119862022, 1033682735) + + W(11, -1113740644, 1022995083, -1144895945, -1130196038); + WS(-1089262391, 1050517969); + sum1 = W(0, -1112721887, 1040766980, -1116916633, -1109323658) + + W(1, 1043853249, -1102481809, 1025978335, -1134508350) + W(2, 956356282, 1032255106, -1115255965, 1053521294) + + W(3, -1109293354, 1024224759, 1036451442, 998852344) + W(4, 1041136081, -1099047838, 1050954387, -1090918435) + + W(5, 1049475859, 1046323061, -1129023222, -1126452038) + + W(6, -1112851037, -1136806893, 1047658201, -1090498606) + + W(7, -1111100085, -1101889105, -1112184834, 1037224108) + + W(8, -1118798326, 1044101949, -1099177336, 1048722524) + + W(9, 1044026608, -1109421665, 1044252857, -1113020120) + + W(10, 1033047322, -1110781188, 1022949658, 984126311) + + W(11, -1111349460, -1151794972, -1140137768, -1119083507); + sum2 = + W(0, -1120544497, 1042905493, 1045262161, -1104438232) + W(1, 1023630957, -1122372280, 1027866949, -1121491826) + + W(2, -1104964203, -1097077111, -1098230931, 1057982485) + + W(3, -1106247773, 1011970003, 1026340389, 1016978228) + W(4, 1056285145, -1118581415, -1079914544, 1057557770) + + W(5, 1048964135, 1020547274, -1113753028, 1034078959) + W(6, -1109256198, 1026029661, 1056552993, -1104081201) + + W(7, -1114436673, 1033190701, -1107460568, 1034442922) + + W(8, -1107706742, 1025674690, -1103396776, 1048351556) + + W(9, 1018818866, -1103728916, 1046941904, -1106194166) + + W(10, 1033408182, -1118988963, 1021102038, -1136298684) + + W(11, -1112938187, 1034200267, -1117493164, -1172844144); + WS(1055467886, -1126093527); + sum1 = + W(0, -1115675946, 1039731987, -1108949528, 1014043817) + W(1, 1025589529, -1102050167, 1035820699, -1114599603) + + W(2, 1037777366, -1126460340, -1145838757, 1049783617) + W(3, 991251120, 1042727635, -1123043835, 1024161077) + + W(4, 1043818615, -1103677379, 1060367897, -1102044139) + + W(5, -1109258124, 1049311757, -1116399889, 1046137806) + + W(6, -1096353162, 1012406341, -1088026493, -1095567535) + + W(7, 1051881528, -1095440907, 1032817677, -1116994158) + W(8, -1150025924, 1031349769, 1034695514, 1044285022) + + W(9, 1011738461, -1115570324, 1040150333, -1110796915) + + W(10, 1035905869, -1103947080, 1034985426, -1129716323) + + W(11, -1107675487, 1042590402, -1104125432, -1140552997); + sum2 = W(0, -1115939175, 1042939513, -1106984126, 1036071940) + + W(1, -1133154938, -1110872047, 1038271101, -1124388167) + + W(2, -1111463085, 1009748958, -1104760450, 1026404786) + + W(3, 1042746589, 1018643239, 1024219237, -1107044825) + W(4, 1026058510, -1101036999, 1046231331, 1060091622) + + W(5, -1109115274, 1042116887, -1104891113, -1137025366) + + W(6, 1015189774, 1048391804, -1101164712, 1059732347) + + W(7, -1090421446, -1092755101, 1018386748, -1112446842) + + W(8, -1116961377, 1019493983, 1013441892, -1113485706) + + W(9, -1102245299, -1104832958, 1043357489, -1123717753) + + W(10, 1003109525, -1128500291, -1127287103, 1036806652) + + W(11, -1110906499, 1042929180, -1108912836, 1034520620); + WS(1062208951, 1065603754); + sum1 = W(0, 1032466911, 1012820793, 1029562264, 1020285479) + W(1, 993753125, 1033268866, -1131051261, 1028903855) + + W(2, 1029341462, 1027274819, 997585115, 1040141401) + W(3, 1032063722, -1153074023, 1015103815, 1040294280) + + W(4, 1059167044, 1052950767, 1057349364, -1108524682) + W(5, 1049874906, 1048703978, 1050186639, 1053103700) + + W(6, -1090134924, -1094303727, -1085543304, -1080037127) + + W(7, -1095616607, -1112675170, -1111683969, -1091636059) + + W(8, -1133534677, 1027990706, 1035990447, 1037410929) + W(9, 1039846496, 1023735025, 1040888889, -1118753424) + + W(10, 987089513, 1032570772, -1136982833, -1125543221) + + W(11, 1015158861, -1145342854, 1031358985, 1022936933); + sum2 = W(0, 1035386648, 1023547272, 1025878508, 1026832668) + W(1, 1029828312, -1098240729, 1044150428, -1103643200) + + W(2, 1042887622, -1099060438, -1099619867, -1099104088) + + W(3, 1048769602, -1121505868, 1040524432, -1115369075) + + W(4, -1086410483, 1053956416, -1094814183, 1069089225) + W(5, 1044213412, 1035342184, 1040447750, 1049544904) + + W(6, -1090258329, -1112148135, -1093316197, 1060781490) + + W(7, -1091192206, -1105713821, -1089411157, 1058550641) + + W(8, 1060158548, 1050315819, 1046080958, -1103190742) + + W(9, -1105160931, -1084784918, 1058372334, -1080579858) + + W(10, -1113981975, -1099847621, 1046524888, -1112424275) + + W(11, 1051146364, 1019461112, 1028619520, 1040133188); + WS(-1078970012, -1070975772); + sum1 = W(0, 1023443287, 1008154783, 1008498119, 1032996598) + W(1, -1130007992, 1026985054, 1001505728, 1027285064) + + W(2, -1111813336, 1034628686, 1020510238, -1119594955) + + W(3, 1037186855, -1129455456, 1024916861, -1118416824) + + W(4, -1095332548, -1098370186, -1091304148, -1097391342) + + W(5, -1088889903, -1093273302, -1097878954, -1097408559) + + W(6, 1048282532, 1052880922, 1054365856, 1065196819) + W(7, 1037830473, 1040256647, 1042516535, 1044458956) + + W(8, 1036630695, -1109395910, 1031904252, -1105409007) + + W(9, 1022933044, 1030320779, -1131972409, 1037289397) + + W(10, 999582566, -1140663171, -1128098380, 1030941172) + + W(11, 1003729918, -1138808617, 1018809669, 1005961310); + sum2 = + W(0, -1114009537, 1035366037, -1111463643, -1119334122) + W(1, -1132366661, 1001109746, 1035022899, -1112054465) + + W(2, 1019032853, -1143037026, -1122373240, 1056620469) + + W(3, -1103744316, 1002774938, -1102405348, 1046894720) + W(4, 1024640816, -1101234014, 1068131945, 1075463933) + + W(5, -1075751794, -1072865378, 1052446989, 1019415611) + + W(6, 1029944441, -1105571142, 1044188353, -1093783941) + + W(7, 1050699227, -1098127223, 1028903402, -1119380340) + + W(8, -1146945026, 1031686749, -1128619453, 1046426762) + + W(9, -1109652943, -1131952529, -1123943246, 1017598049) + + W(10, -1136399129, 1018164069, -1125359481, 999713778) + + W(11, -1123073190, 1019524751, 983357578, 1013611461); + WS(-1137905088, -1096938393); + sum1 = W(0, -1127951952, -1139830244, -1108742721, 1019792636) + + W(1, 1018370522, 1020799581, 1021418002, -1148599498) + W(2, -1116133184, 1040763803, 1041221580, 1009683312) + + W(3, -1107181880, 1002965001, 1022849180, 1039287108) + + W(4, -1092624022, -1104553656, -1090149133, 1044078592) + + W(5, 1058802794, 1043495791, 1033578226, -1113073030) + W(6, 1045295113, 1046745657, 1057147883, -1112574564) + + W(7, -1085568476, -1103617227, 1032014262, 1022418564) + + W(8, 1023908704, -1103252327, -1103732914, -1127338650) + W(9, 1040869579, 991652540, 1013121207, 1011288682) + + W(10, 1031880695, 1040451684, 1026434167, 1007135764) + + W(11, 1014113348, -1125537591, 1016284007, -1116579933); + sum2 = + W(0, 1036469548, 1017461301, 1017339130, -1095997080) + W(1, -1099654066, -1105423964, -1113359567, -1131580992) + + W(2, -1097965159, -1101551098, -1094477168, 1035631286) + W(3, 1054988432, 1047389393, 1041958533, 1043362318) + + W(4, -1116680345, -1125992347, 1058922542, -1103956246) + + W(5, 1040393300, 1040203374, -1108890296, 1024609216) + W(6, 1001756270, -1115644020, 1035448965, -1105032669) + + W(7, 1039533461, -1122662741, -1130070269, 1025676040) + + W(8, 1032969412, -1124365977, 1040541302, -1112710338) + + W(9, 1017600743, -1114085496, -1134082186, 1015920174) + + W(10, -1131471357, 1016380025, 1001720584, -1115585175) + + W(11, 1001178742, 1001141734, 1010209588, -1122393401); + WS(1017525984, 1039916017); + sum1 = W(0, -1124853567, -1147061122, -1129462517, -1119594613) + + W(1, 999306018, -1156505185, 1012193026, 1010192066) + W(2, 1018048624, -1127291978, 1049183858, 1032566282) + + W(3, 1036307723, -1150114695, -1116656134, -1111959392) + + W(4, -1095739637, -1104996150, -1085471393, -1090223247) + + W(5, -1104470177, -1105492077, -1109848430, -1107232129) + + W(6, 1045916039, 1043181303, 1054258797, 1054999864) + W(7, -1108082389, 1055713893, -1134406033, 1049351719) + + W(8, 1035770156, 1038596810, 1048116160, 1024906308) + W(9, 1035021201, -1114305018, 1014226964, -1132413284) + + W(10, 1019449355, -1118699785, 1018729693, -1125493497) + + W(11, -1111613764, 1013642059, -1117195563, 990662981); + sum2 = + W(0, 1033095635, -1123818427, 1023960168, -1115456886) + W(1, -1130014725, -1134763238, 1020936831, 1030713030) + + W(2, -1113611213, 1038354785, -1136308834, 1031365710) + + W(3, -1121052824, 1037262635, -1129095405, 1030934712) + + W(4, -1120605005, 1043017802, 1016597499, -1105318511) + W(5, 1032279133, -1129541437, 1028982810, 969324748) + + W(6, 1010827478, 1005632845, 1067061797, 1065783254) + W(7, 1033387493, 1024758296, -1141733133, 973320358) + + W(8, -1096460028, -1090567932, -1078682340, -1094955795) + + W(9, -1114814318, 994121897, -1126300988, -1148320949) + W(10, 992544217, 1043858115, 1041505996, -1104546945) + + W(11, -1114466677, -1115137122, 1007094454, -1122716507); + WS(1033221560, 1063777383); + sum1 = W(0, 1019126833, 1022703059, 1034317754, -1141147507) + + W(1, 1023815261, -1145478905, -1139797991, 1017044691) + + W(2, -1112638616, -1107233655, -1107419652, 1017313945) + + W(3, 1030431247, 1043218964, 1030899327, 1042038278) + W(4, 1057738402, 1049316970, 1057780266, 1039925560) + + W(5, -1101232178, -1097249286, -1105363093, -1097041200) + + W(6, -1088696201, -1093677291, -1091493000, -1105678958) + + W(7, 1054033952, 1050643572, 1039373871, 1044902925) + W(8, 1044063732, 1018619290, 1042363102, -1123751101) + + W(9, -1103422471, -1099574259, -1109462943, -1143343447) + + W(10, -1130166589, -1127677637, -1141893947, -1141892011) + + W(11, 1028589441, 1032480102, 1000558881, -1115509735); + sum2 = W(0, -1130982538, 1021127838, 1013698904, -1227267307) + + W(1, -1180063220, -1130392938, -1129014326, 1032270489) + + W(2, -1106875761, 1011019608, 1024572751, 1039986653) + + W(3, -1113103478, -1104759550, 1035543741, -1129087757) + + W(4, 1056618334, 1055137831, 1048771047, -1073860127) + W(5, -1108123535, 1059126644, 1045481337, 1042704754) + + W(6, 1055977286, 1058761027, -1103617496, -1072531400) + W(7, 1052255088, 1063802283, 1048895081, 1016319978) + + W(8, -1102508839, -1115387544, -1128394642, 1043687089) + + W(9, -1126700500, -1109991236, 1031917163, -1121934766) + + W(10, 1020425242, 1013848532, 1016018634, -1112657573) + + W(11, 1035781641, -1125248586, -1126407949, 1030839801); + WS(-1091503470, -1126838795); + sum1 = W(0, -1124121237, -1113414670, 1028321829, -1111356688) + + W(1, 1026686479, -1121133649, -1120913068, -1126384695) + + W(2, -1134568843, -1126036384, 1033159265, 1037814911) + + W(3, 1031580097, 1040854417, -1106928812, 1027944427) + W(4, 1047693172, 1049117760, -1105247938, 1058889082) + + W(5, 1012762455, -1120516448, 1049438209, 1040171928) + + W(6, -1109412515, -1103447906, -1096437464, -1098797565) + + W(7, -1104719461, -1106636212, -1129886751, -1106734009) + + W(8, -1129997061, 1034526751, -1143270742, 1022658271) + + W(9, -1109175079, 1042645116, -1104071908, 1012750451) + + W(10, 1024589216, -1113770234, 1036105485, -1114645460) + + W(11, 1023714995, -1138248951, -1132081196, -1145462266); + sum2 = W(0, -1121971015, -1109269766, -1096046215, -1096349825) + + W(1, -1104467071, -1105457821, -1114558576, -1113812495) + + W(2, 1025966975, 1042653975, 1058579369, 1055073186) + W(3, 1043843774, 1043492169, -1138844670, 1035958317) + + W(4, -1127561691, 1038662008, -1095336395, -1156170871) + + W(5, 1054347264, -1116732629, 1043300107, 1025184897) + + W(6, 1032121603, -1104797770, 1041625968, -1098327149) + + W(7, -1090818470, 1028261711, -1117277405, -1130419167) + + W(8, -1118316871, 1018661176, -1131103951, 1035437895) + + W(9, 1042639369, -1115472379, -1115061521, -1130646919) + + W(10, -1147835451, 1023052754, -1129857431, -1114991229) + + W(11, 1011784142, -1157273063, 1024244091, -1148362739); + WS(1065968028, 1020949470); + sum1 = W(0, 1032158503, 1018701500, 1028916776, 1031923218) + W(1, -1143490705, 1005807263, 1028568398, 1026731038) + + W(2, 1043191673, 1020082981, 999481917, 1033906881) + W(3, -1123072324, 1012896153, 1015001550, 1035245559) + + W(4, 1050691771, 1043953282, 1047062836, 1032996498) + W(5, 1057457238, 1057445286, 1051530049, 1057446979) + + W(6, -1089572661, -1139338281, -1091936976, -1081715803) + + W(7, -1087112685, -1088032573, -1100585253, -1095410205) + + W(8, 983294118, 1041437600, 1042367115, 1040306653) + W(9, 1019100064, -1123572193, 1039280729, -1104642968) + + W(10, 1033006978, -1139648989, 1033705422, -1132542121) + + W(11, -1138694873, 1033839136, 1027376729, 1015844228); + sum2 = + W(0, -1107158830, -1114179967, -1106205598, -1112529879) + W(1, 1036191348, 1045048740, -1112261511, 1045813672) + + W(2, -1098284578, 1050997929, 1032837846, -1138556160) + + W(3, -1103494095, 1033058370, -1109765233, 1040601336) + W(4, 1059620359, -1120628180, 1056621385, 1064698181) + + W(5, 1049117565, -1087565422, 1050635491, -1087363324) + W(6, 1059101624, -1084072333, 1033838752, 1049137220) + + W(7, -1100194061, -1096659207, 1042760064, -1087988644) + + W(8, -1080819081, 1055292451, -1084530179, -1118657190) + + W(9, 1035375516, 1055648971, -1101810418, 1059720072) + W(10, 1041045600, 1041809552, -1150759871, 1036987884) + + W(11, 1040790470, -1098721116, 1028926760, -1118399816); + WS(-1079370588, -1069938997); + sum1 = W(0, -1107111607, 1031876694, -1108546779, 1007409349) + + W(1, -1119937056, -1110402417, 1034313646, -1115195974) + + W(2, 1024046068, 1040468568, -1110778478, 1041967908) + W(3, 1037532265, 1027170100, 1028424065, 1030920188) + + W(4, 1034755057, 1048995971, 1044693184, 1056322870) + W(5, 992363881, -1123931633, 1041273350, 1034999584) + + W(6, -1106911318, -1106422470, -1092550445, -1089848952) + + W(7, -1115839591, -1098485404, 1027494176, -1101830589) + + W(8, 1032333322, 1043602212, -1124221431, 1044063648) + W(9, -1137125241, 1015794334, 1038675968, 1024639630) + + W(10, -1122522177, -1133546645, -1123999146, -1129245296) + + W(11, -1121719236, 1009488187, -1146748727, -1115284904); + sum2 = W(0, -1116010697, 1039856206, 1025692273, 1047723216) + W(1, 1054500142, 1045538686, 1020883249, 1037455508) + + W(2, 1044972838, -1094195694, 1041658757, -1090167008) + + W(3, -1087657974, -1114739465, -1103808398, 1025495534) + + W(4, -1107525170, 1054041965, -1095593913, 1054432792) + + W(5, 1048962216, -1099510609, 1041852115, -1112321007) + + W(6, 1025111869, -1105218154, 1047241736, -1103340827) + + W(7, -1105033641, 1043141319, -1104502432, 1020729805) + + W(8, -1115770744, 1021276689, -1113081166, 1030984707) + W(9, 1026520309, 1008623973, 1031142833, 1034321699) + + W(10, 1027404867, -1122132060, 1036997767, -1109230755) + + W(11, 1000189578, 949401483, -1121181330, 989367833); + WS(1051966318, -1113875142); + sum1 = + W(0, 1035883793, -1111332346, 1045917727, 1006041029) + W(1, -1129901007, 1042663274, -1119690564, 1014471632) + + W(2, 1040145278, -1135399329, 1017502534, -1096989371) + W(3, 1043615094, 1025318012, -1113005508, 1043398529) + + W(4, 1051696565, 1051177307, 1054251573, 1061428120) + W(5, 1037934795, 1050890887, 1046007992, 1049249377) + + W(6, -1091560996, -1096861164, -1091248610, -1087158964) + + W(7, -1098884432, -1096301045, -1093706893, -1093100168) + + W(8, -1133003627, -1117751383, -1178468754, -1126263439) + + W(9, -1106662601, 1017933485, 1038615540, -1116546293) + + W(10, -1126824689, 1039745286, 1020593891, 1008594943) + + W(11, 1037849734, 1035118155, -1114145271, 1028529816); + sum2 = + W(0, -1120038729, 1032134121, -1112337284, 1014623636) + W(1, 1015804972, -1111055788, 1025605092, -1118260382) + + W(2, 995641288, 1034430176, 1011533369, 1032554184) + W(3, -1114631943, 1037430467, 1022278663, 1020696197) + + W(4, 1035481768, -1099098436, 960227969, -1122840036) + W(5, -1123247827, -1115890560, 1022436109, 1010081074) + + W(6, 1011267102, -1099374838, 1055781369, 1046041384) + W(7, 1055178264, -1124103196, 1039303021, -1116158530) + + W(8, 1042749492, 1055985885, 1067101038, 1069533386) + W(9, 1065618150, 1058921177, -1106092627, -1118372702) + + W(10, 1026093812, -1113501317, -1095011910, -1086401299) + + W(11, -1079450114, -1075689828, -1082339747, -1095588850); + WS(-1087762743, -1114043214); + sum1 = W(0, 1028903325, -1111481047, 1010874850, -1117223539) + + W(1, -1114811697, 1027957028, -1115120063, 1025677743) + W(2, 1040067739, 981566559, 1032756947, -1130847267) + + W(3, -1123313460, -1113871531, -1126050567, -1113266015) + + W(4, 1045936105, 1050679259, 1052053924, 1055533279) + W(5, 1059392176, 1053658934, 1039338221, 1051823712) + + W(6, -1095653187, -1096161947, -1090950614, -1084280212) + + W(7, -1097768267, 1005713692, -1120312930, -1118568631) + + W(8, -1122706133, 1026181394, 1034645023, 1030922562) + + W(9, 1030340896, -1102292436, -1107839810, -1112577800) + + W(10, 1029496147, -1149217596, -1132850610, -1154701224) + + W(11, -1113406339, 1020850850, 1017761874, -1117302546); + sum2 = W(0, 1001016005, -1125241033, 1018218852, -1111720092) + + W(1, 1015413875, -1140722987, -1138333196, 1010568725) + + W(2, -1150454109, -1111980552, 1033028659, 1037513337) + + W(3, -1109924763, -1144232926, -1117260807, -1113652225) + + W(4, 1001531747, 1031575403, 1016765132, -1085543392) + W(5, 1053354837, 1054900052, 1041131548, 1045881209) + + W(6, 983352173, -1103460210, -1103428024, -1076627395) + + W(7, 1074369634, 1051272122, -1098379064, -1098914955) + + W(8, -1106746798, 1036252996, -1128273041, 1046375720) + + W(9, 1055587240, -1094917738, -1106193524, -1098562564) + + W(10, -1157019725, 1023495862, 1033057508, -1112606370) + + W(11, 1019967806, -1107285947, 1012881631, 1031041657); + WS(-1090517687, -1095444575); + sum1 = W(0, 1025742446, -1111454559, 1040962578, 1035513890) + W(1, 1025779251, 1041617005, -1106922364, 1024699903) + + W(2, 1032739299, -1106175885, -1110724347, -1118213794) + + W(3, -1103218657, 1040368314, -1105137317, 1024907982) + W(4, 1054789967, 1031326631, 1052551894, 1059778428) + + W(5, 1045793474, 1051667296, 1040121301, 1052247674) + + W(6, -1095546301, -1101847659, -1090925684, -1089262225) + + W(7, -1096439373, -1099734269, -1104705805, -1097282993) + + W(8, 1033023507, -1107099097, 1036045063, 1035395209) + + W(9, -1101529212, 1050132438, -1102593253, 1016797696) + + W(10, 1028563508, -1117676152, 1036888990, 1007580971) + + W(11, 949923192, 1037985265, -1113513373, 1026673059); + sum2 = W(0, 1052208474, 1035064858, 1064043431, 1055780907) + W(1, 1048070172, 1057138231, -1100953655, 1042120650) + + W(2, -1095438834, -1104348375, -1079843968, -1084432555) + + W(3, -1106077690, -1086965748, 1048708391, -1106942577) + + W(4, 1040952518, -1095663473, 1060639651, 1054823629) + + W(5, -1098542607, 1057295667, -1095587456, 1035260440) + + W(6, -1101013864, 1048824145, -1097227129, -1105218176) + + W(7, 1048082838, -1106201667, 1042233875, -1136871967) + + W(8, 1045777263, -1099869349, 1049789703, -1118379111) + + W(9, -1102784042, 1043327775, -1107731485, 1006771796) + + W(10, -1125550479, -1127115193, 1024044553, 972648308) + + W(11, 1021849499, 1016298873, -1116706874, 1030896448); + WS(-1115614648, 1042425791); + sum1 = + W(0, -1120207204, -1124027509, -1144413692, -1105701711) + + W(1, 1014568102, -1120774251, 1029691462, -1119274774) + W(2, -1115327070, 1016926292, 1038910502, 1037845356) + + W(3, 1042236823, -1105850383, -1134596907, -1117126533) + + W(4, -1093340989, -1096731140, -1096554678, -1085064420) + + W(5, -1100005974, -1098496607, -1135406214, -1098152617) + + W(6, 1053481388, 1053311332, 1057006919, 1049566369) + W(7, 1056376458, 1048579325, 1042582346, 1043887136) + + W(8, 1030984860, -1116407641, 1038600290, 1043585442) + W(9, 1018535375, -1122768840, -1120431498, 1035562443) + + W(10, -1113874973, 1010793530, -1116271283, -1114795809) + + W(11, 992031960, -1130485552, 1029193328, -1140222054); + sum2 = W(0, -1127240204, 1024332524, -1145474239, -1111478947) + + W(1, 1029335642, -1112394176, 1042612281, -1152251822) + + W(2, -1079712608, -1082891577, -1081879450, 1047818786) + + W(3, 1066272635, 1064292926, 1048742105, 1063028070) + W(4, 1066527571, 1063276166, 1065092416, 1033988518) + + W(5, -1081647719, -1085935960, -1090025738, -1088819358) + + W(6, 1049757184, 1025750476, 1045572932, -1093152038) + + W(7, -1129453741, -1107360776, 1042389166, -1095668919) + + W(8, -1122509441, -1127423195, -1127801782, -1126799575) + + W(9, 1033523902, -1109456127, 1029374360, -1163717821) + + W(10, -1120167031, 976948665, -1123809997, 1030959654) + + W(11, 995040830, 1026103880, -1116538748, 1033003323); + WS(1005558656, -1134386388); + + return clamp(mstd0 + 5.0 * vsum / wsum * mstd1, 0.0, 1.0); +} + +shared float inp[555]; + +#define CURRENT_PASS 2 + +#define GET_SAMPLE(x) dot(x.rgb, rgb2y) +#define imageStore(out_image, pos, val) imageStoreOverride(pos, val.x) +void imageStoreOverride(uint2 pos, float value) { + float2 UV = mul(rgb2uv, INPUT.SampleLevel(sam_INPUT_LINEAR, HOOKED_map(pos), 0).rgb); + OUTPUT[pos] = float4(mul(yuv2rgb, float3(value.x, UV)), 1.0); +} + +#define INPUT_tex(pos) GET_SAMPLE(vec4(texture(INPUT, pos))) +static const float2 INPUT_size = float2(GetInputSize()); +static const float2 INPUT_pt = float2(GetInputPt()); + +#define temp_tex(pos) (float(texture(temp, pos).x)) +static const float2 temp_size = float2(GetInputSize().x * 1, GetInputSize().y * 2); +static const float2 temp_pt = float2(1.0 / (temp_size.x), 1.0 / (temp_size.y)); + +#define HOOKED_tex(pos) temp_tex(pos) +#define HOOKED_size temp_size +#define HOOKED_pt temp_pt + +void Pass2(uint2 blockStart, uint3 threadId) { + ivec2 group_base = ivec2(gl_WorkGroupID) * ivec2(gl_WorkGroupSize); + int local_pos = int(gl_LocalInvocationID.x) * 15 + int(gl_LocalInvocationID.y); + for (int id = int(gl_LocalInvocationIndex); id < 555; id += int(gl_WorkGroupSize.x * gl_WorkGroupSize.y)) { + uint x = (uint)id / 15, y = (uint)id % 15; + inp[id] = + HOOKED_tex(HOOKED_pt * vec2(float(group_base.x + x - (2)) + 0.5, float(group_base.y + y - (3)) + 0.5)).x; + } + barrier(); + vec4 ret = vec4(0.0, 0.0, 0.0, 0.0); + vec4 ret0 = vec4(0.0, 0.0, 0.0, 0.0); + vec4 samples[12]; + samples[0][0] = inp[local_pos + 0]; + samples[0][1] = inp[local_pos + 1]; + samples[0][2] = inp[local_pos + 2]; + samples[0][3] = inp[local_pos + 3]; + samples[1][0] = inp[local_pos + 4]; + samples[1][1] = inp[local_pos + 5]; + samples[1][2] = inp[local_pos + 6]; + samples[1][3] = inp[local_pos + 7]; + samples[2][0] = inp[local_pos + 15]; + samples[2][1] = inp[local_pos + 16]; + samples[2][2] = inp[local_pos + 17]; + samples[2][3] = inp[local_pos + 18]; + samples[3][0] = inp[local_pos + 19]; + samples[3][1] = inp[local_pos + 20]; + samples[3][2] = inp[local_pos + 21]; + samples[3][3] = inp[local_pos + 22]; + samples[4][0] = inp[local_pos + 30]; + samples[4][1] = inp[local_pos + 31]; + samples[4][2] = inp[local_pos + 32]; + samples[4][3] = inp[local_pos + 33]; + samples[5][0] = inp[local_pos + 34]; + samples[5][1] = inp[local_pos + 35]; + samples[5][2] = inp[local_pos + 36]; + samples[5][3] = inp[local_pos + 37]; + samples[6][0] = inp[local_pos + 45]; + samples[6][1] = inp[local_pos + 46]; + samples[6][2] = inp[local_pos + 47]; + samples[6][3] = inp[local_pos + 48]; + samples[7][0] = inp[local_pos + 49]; + samples[7][1] = inp[local_pos + 50]; + samples[7][2] = inp[local_pos + 51]; + samples[7][3] = inp[local_pos + 52]; + samples[8][0] = inp[local_pos + 60]; + samples[8][1] = inp[local_pos + 61]; + samples[8][2] = inp[local_pos + 62]; + samples[8][3] = inp[local_pos + 63]; + samples[9][0] = inp[local_pos + 64]; + samples[9][1] = inp[local_pos + 65]; + samples[9][2] = inp[local_pos + 66]; + samples[9][3] = inp[local_pos + 67]; + samples[10][0] = inp[local_pos + 75]; + samples[10][1] = inp[local_pos + 76]; + samples[10][2] = inp[local_pos + 77]; + samples[10][3] = inp[local_pos + 78]; + samples[11][0] = inp[local_pos + 79]; + samples[11][1] = inp[local_pos + 80]; + samples[11][2] = inp[local_pos + 81]; + samples[11][3] = inp[local_pos + 82]; + ret[0] = nnedi3(samples); + ret0[0] = inp[local_pos + 33]; +#if CURRENT_PASS == LAST_PASS + uint2 destPos = blockStart + threadId.xy * 2; + uint2 outputSize = GetOutputSize(); + if (destPos.x >= outputSize.x || destPos.y >= outputSize.y) { + return; + } +#endif + imageStore(out_image, ivec2(gl_GlobalInvocationID) * ivec2(2, 1), ret0); + imageStore(out_image, ivec2(gl_GlobalInvocationID) * ivec2(2, 1) + ivec2(1, 0), ret); +} diff --git a/src/Effects/NNEDI3/NNEDI3_nns16_win8x4.hlsl b/src/Effects/NNEDI3/NNEDI3_nns16_win8x4.hlsl index 3414e5493..6566bffff 100644 --- a/src/Effects/NNEDI3/NNEDI3_nns16_win8x4.hlsl +++ b/src/Effects/NNEDI3/NNEDI3_nns16_win8x4.hlsl @@ -1,206 +1,732 @@ -// nnedi3-nns16-win8x4 -// 移植自 https://github.com/bjin/mpv-prescalers/blob/cc02ed95c1fe05b72bc21d41257c4c085e6e409b/compute/nnedi3-nns16-win8x4.hook -// 有半像素的偏移 +// This file is generated by the scripts available at https://github.com/hauuau/magpie-prescalers +// Please don't edit this file directly. +// Generated by: nnedi3.py --nns 16 --win 8x4 --use-compute-shader --use-magpie +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . //!MAGPIE EFFECT -//!VERSION 3 -//!OUTPUT_WIDTH INPUT_WIDTH * 2 -//!OUTPUT_HEIGHT INPUT_HEIGHT * 2 - +//!VERSION 4 +//!SORT_NAME NNEDI3_016_4 //!TEXTURE Texture2D INPUT; //!SAMPLER //!FILTER POINT -SamplerState sam; +SamplerState sam_INPUT; + +//!TEXTURE +//!WIDTH INPUT_WIDTH * 1 * 2 +//!HEIGHT INPUT_HEIGHT * 2 * 1 +Texture2D OUTPUT; //!SAMPLER //!FILTER LINEAR -SamplerState sam1; +SamplerState sam_INPUT_LINEAR; //!TEXTURE -//!WIDTH INPUT_WIDTH -//!HEIGHT INPUT_HEIGHT * 2 //!FORMAT R16_FLOAT -Texture2D tex1; +//!WIDTH INPUT_WIDTH * 1 +//!HEIGHT INPUT_HEIGHT * 2 +Texture2D temp; -//!COMMON +//!SAMPLER +//!FILTER POINT +SamplerState sam_temp; -#define T(x) asfloat(x) -#define W(i,w0,w1,w2,w3) dot(samples[i],float4(T(w0),T(w1),T(w2),T(w3))) -#define WS(w0,w1) sum1 = exp(sum1 * mstd2 + T(w0)); sum2 = sum2 * mstd2 + T(w1); wsum += sum1; vsum += sum1*(sum2/(1.0+abs(sum2))) +//!COMMON +#include "prescalers.hlsli" +#define LAST_PASS 2 //!PASS 1 -//!DESC double_y +//!DESC NNEDI3 (double_y, nns16, win8x4) //!IN INPUT -//!OUT tex1 -//!BLOCK_SIZE 32,16 -//!NUM_THREADS 32,8 - - -float nnedi3(float4 samples[8]) { +//!OUT temp +//!BLOCK_SIZE 32, 16 +//!NUM_THREADS 32, 8 +#pragma optionNV(inline none) +float nnedi3(vec4 samples[8]) { float sum = 0.0, sumsq = 0.0; - [unroll] - for (int i = 0; i < 8; i++) { - sum += dot(samples[i], 1.0f); + [unroll] for (int i = 0; i < 8; i++) { + sum += dot(samples[i], vec4(1.0, 1.0, 1.0, 1.0)); sumsq += dot(samples[i], samples[i]); } - float mstd0 = sum / 32.0; float mstd1 = sumsq / 32.0 - mstd0 * mstd0; - // 不能使用 lerp,否则结果可能为 nan - float mstd2 = mstd1 >= 1.192092896e-7 ? rsqrt(mstd1) : 0.0; + float mstd2 = mix(0.0, inversesqrt(mstd1), mstd1 >= 1.192092896e-7); mstd1 *= mstd2; - float vsum = 0.0, wsum = 0.0, sum1, sum2; +#define T(x) intBitsToFloat(x) +#define W(i, w0, w1, w2, w3) dot(samples[i], vec4(T(w0), T(w1), T(w2), T(w3))) +#define WS(w0, w1) \ + sum1 = exp(sum1 * mstd2 + T(w0)); \ + sum2 = sum2 * mstd2 + T(w1); \ + wsum += sum1; \ + vsum += sum1 * (sum2 / (1.0 + abs(sum2))); + sum1 = W(0, -1123354974, -1112248839, 1046299686, -1143613552) + + W(1, -1118620174, 1024662558, 1028038478, -1129268360) + + W(2, 1016130204, -1087068557, 1063313277, -1103342192) + + W(3, -1103968288, 1048182784, 1047279381, -1115088511) + + W(4, -1101453425, 1059583965, -1088182320, 1003350800) + + W(5, -1117908518, -1119323982, 1034186247, -1134684248) + + W(6, -1122284590, 1027638054, -1124394588, -1111377363) + + W(7, -1122818124, -1137723992, 978245507, 1028117438); + sum2 = W(0, -1162931039, -1131063526, 1029801649, -1117642655) + + W(1, -1136248556, -1131086728, 1031011705, -1128864654) + + W(2, -1115594515, -1128443230, 1042762789, -1107118398) + + W(3, -1119907402, 1044675527, 1050674207, -1113986381) + + W(4, 1022791334, -1107588397, 1009001220, -1186206458) + + W(5, 1017500018, -1111169922, -1112569685, 1017255694) + + W(6, -1156766128, -1125594766, -1148613464, 993928432) + + W(7, 1014782692, -1135599628, -1114139175, 1007622876); + WS(1038828992, 1041685264); + sum1 = W(0, -1114329248, 1049950910, -1097681183, 1028668144) + W(1, 995958527, 1027336960, -1107326552, 1025858258) + + W(2, -1117673776, 1060640651, -1085831405, 1033402064) + + W(3, 1034401008, 1045782072, -1105157973, -1122828000) + + W(4, 1038612842, -1098159517, 1053136924, -1110558370) + + W(5, 1035088196, -1106507532, 1032016120, -1113173980) + + W(6, 1008781376, -1124000392, 1023707152, 1012109856) + + W(7, 1029875310, -1105439902, 1034119968, -1114749520); + sum2 = + W(0, 1031315360, -1099468189, -1112139926, 1036663822) + W(1, -1131767489, -1140834082, 1024287080, -1122285462) + + W(2, 1023637252, -1100127579, -1117241706, 1038018354) + + W(3, -1107869385, 1052854494, 1052996200, -1112496415) + + W(4, -1107666272, 1034036134, 1027811452, -1110479054) + + W(5, -1117110288, 1024451620, 1027157968, -1112615559) + W(6, -1124350185, 1003450083, -1131082337, 998992195) + + W(7, -1110538107, 1041131277, 1035032776, -1106762474); + WS(-1086074680, 1053637716); + sum1 = W(0, -1121345387, 1042002951, -1113042450, -1121398619) + + W(1, -1148805338, -1165378922, -1115297518, 991217235) + + W(2, -1136570733, 1052460699, -1107443934, -1117268427) + + W(3, 1049266593, -1094571489, -1098765182, 1036113926) + + W(4, 1027081787, -1124281856, 1043313411, -1136658365) + + W(5, -1133439181, 1040734807, 1006695533, -1112513138) + + W(6, -1158465386, -1121708851, 1016359031, 1021173351) + + W(7, -1120818857, 1035650578, 1027853163, -1106476275); + sum2 = W(0, 1026517575, -1170492850, -1138816415, -1143472678) + + W(1, 1017334370, 1003954710, -1132363566, 998846550) + + W(2, 1051558711, -1096673587, -1136175651, -1124275402) + + W(3, 1071692777, -1077357700, -1098960792, 1018703670) + + W(4, 1049822619, -1098179385, -1116986501, 1007812651) + W(5, 1020207734, 996694924, 1003290486, 1007766851) + + W(6, 1022251878, -1122577241, -1141894102, 1009415395) + + W(7, 1019995718, 1015494226, -1126828734, -1163222937); + WS(1051521136, 1027207116); + sum1 = + W(0, -1122694020, 1010830545, -1124291704, 1018062184) + W(1, -1121133108, -1124202632, 1037913146, -1116091286) + + W(2, -1102175837, 1057246783, -1093542759, 1041281977) + W(3, -1116351908, 1026322980, 982577970, -1125394504) + + W(4, 1045518980, -1089509425, 1055793637, 1008755233) + W(5, 1009393969, 1025178484, -1118947636, -1127575032) + + W(6, 1008379217, -1117338572, 1001093793, 1015898776) + W(7, 1015772516, 1009646833, 1001810977, -1121163492); + sum2 = W(0, -1137495011, -1135527491, 1027730022, -1118108263) + + W(1, 1013616911, -1123650952, 1024465134, -1128775579) + + W(2, -1135578111, 1013443151, 1049128967, -1098008683) + + W(3, 1029346938, -1114797945, 1068130737, -1080443718) + + W(4, 1017473747, -1122100892, 1046423571, -1101482344) + + W(5, 1012413655, -1128721387, -1143058109, -1137148015) + + W(6, -1133405571, -1166794345, 1020545683, -1128178767) + + W(7, 1008139351, -1156685818, -1126785325, 991435034); + WS(1057767608, -1132080751); + sum1 = W(0, 1026028453, 1025766741, 1035118319, 1012106581) + W(1, 1026017621, -1135552917, 1040474693, -1138611630) + + W(2, -1117947285, 1051769667, -1111744027, 1030333189) + + W(3, 1048679017, -1083959172, -1084413328, 1045191121) + + W(4, 1025261389, -1120826122, 1049618505, -1122181545) + + W(5, 1011196341, 1045191525, -1110336171, 1030480605) + W(6, 1015828970, 1028389741, 1028257397, 1027514349) + + W(7, 1025013027, 1039505775, -1123719333, 1020294666); + sum2 = W(0, 1017587161, -1101123140, 1040188371, 988296658) + W(1, 1028118553, -1103020887, 1022642341, 1010063898) + + W(2, 1008167722, -1099714612, 1039093756, 1026403646) + W(3, 1005112948, 1049070164, 1046164698, 1033545355) + + W(4, -1125344655, 1032013714, -1111525569, 1002132020) + + W(5, 1015776789, 1022049457, -1098832696, 1037334715) + + W(6, -1148301500, 1009340114, -1115917000, -1139728254) + + W(7, -1138850406, -1167693540, -1103378287, 1035581889); + WS(-1099372256, -1088618788); + sum1 = W(0, -1112538182, 1048693927, -1112344546, -1109099742) + + W(1, -1113349022, 1033711782, -1129092599, -1110127398) + + W(2, -1103996671, 1064716592, -1086749016, 1032699126) + + W(3, 1024020908, -1143605597, 1044926535, -1121424940) + + W(4, 1046614908, -1085173359, 1062252083, -1130166943) + + W(5, -1111225386, 1004694493, 1040479887, -1106709441) + + W(6, -1110537326, -1108087402, 1034104622, -1120726228) + + W(7, -1114146165, -1138402062, 1042110371, -1106064827); + sum2 = W(0, 987083788, 1013472954, -1120418118, 979955865) + + W(1, -1144106823, -1131186779, -1122269098, -1163904780) + + W(2, -1120467381, -1139561796, 1038342084, -1115615181) + + W(3, -1121977305, 1044091298, 1042996066, -1127292875) + + W(4, -1118651341, 1038343490, -1118476220, -1123141745) + + W(5, -1162389292, -1115306287, -1128689408, 1014320394) + + W(6, -1152635694, -1155962630, -1132569906, -1135582470) + + W(7, 964510307, -1117365756, -1141833923, 1008840046); + WS(1041282784, 1044242623); + sum1 = W(0, -1119885764, -1171512555, 1003864029, 1025494836) + + W(1, -1119816052, -1121861252, 1040963149, -1113504879) + + W(2, -1100880653, 1057266723, -1094412795, 1043843337) + + W(3, -1113812594, 1010135439, -1118004569, -1125989575) + + W(4, 1046531310, -1089952515, 1056310444, -1156936827) + + W(5, 1015358999, 1031135156, -1114099002, -1122714492) + + W(6, 1005085853, -1115226950, 1015234855, 1003362397) + W(7, 1021011107, 1003139037, 992693307, -1120612644); + sum2 = + W(0, 1005317381, -1142619324, -1126266146, 1026462555) + W(1, -1143827754, 1012902153, -1128784654, 1020893616) + + W(2, 1019060164, -1114788024, -1094218173, 1054132458) + + W(3, 1009279342, -1098688460, -1078812823, 1070492026) + + W(4, 1014092605, -1120377499, -1099532818, 1048935725) + W(5, -1131000233, 1017453102, 1007638067, 1011358224) + + W(6, 1012779564, -1139793504, -1130333980, 1015734963) + + W(7, -1137528453, -1147729078, 1018177647, 987943782); + WS(1046635232, 1024078131); + sum1 = W(0, 1002735212, 1035063871, -1097977761, 1040314319) + W(1, 1025138813, 1034039879, -1105608655, 1035664624) + + W(2, 1017042555, 1044122447, -1094991056, 1038536855) + + W(3, -1132524982, -1110416695, 1051547730, -1114843703) + + W(4, 1031803657, -1092481954, 1050188814, 1003107468) + W(5, 1033606155, -1094320024, 1047410847, 1019470987) + + W(6, 1021596219, -1107502027, 1031346589, 1021345835) + + W(7, 1015508823, -1103391009, 1046101811, -1136683190); + sum2 = + W(0, -1096475926, 1044036812, 1052862983, -1106234474) + W(1, -1112281069, -1112231286, 1024115789, -1121785528) + + W(2, -1116645717, -1111398905, 1051331710, -1130292776) + + W(3, 1041647377, -1096068583, 1038036111, 1037359643) + W(4, -1113263240, 1026411348, 1042458641, -1111704128) + + W(5, 1023473494, -1114320784, 1028002558, -1123406807) + + W(6, -1117017643, -1138574198, 1037890580, -1109714921) + + W(7, 1039764966, -1104710548, -1106844581, 1041123403); + WS(-1088554040, -1076674880); + sum1 = + W(0, 1026292820, -1132973070, -1144171612, -1130131975) + W(1, 1016736263, 1034501898, -1110973538, 1028857234) + + W(2, 1042339025, -1089525132, 1052671191, -1108906970) + + W(3, -1110236986, 1037427962, -1123890785, -1112145786) + + W(4, -1103961368, 1056478885, -1092344862, 1002874044) + W(5, 1016313655, -1118983748, 1041641985, 1025897228) + + W(6, -1151588920, 1038469390, 1010979982, -1130905399) + + W(7, 1014755782, -1123320716, 1017396903, 1033705562); + sum2 = W(0, 1013915195, -1133182691, -1127318198, 1020584890) + + W(1, 1007730851, 1024414743, -1121307593, 1005058566) + W(2, 981970521, -1111248658, 1035588225, -1124411850) + + W(3, 1028189234, 1040952978, 1057294107, 1029625115) + + W(4, -1121038101, -1109339192, -1107404728, 1026110889) + + W(5, -1142484934, -1094377458, 1024397525, 1023925523) + + W(6, -1146368902, -1116592821, -1118541421, -1140327971) + + W(7, 1010322539, -1112421528, 1019759378, -1199698720); + WS(1063581112, 1015292283); + sum1 = + W(0, -1123806598, -1125096044, 1046804719, -1117498166) + W(1, -1124445804, 1037634467, 1028314614, 1006823135) + + W(2, 1036776315, -1083793455, 1064148787, -1106689849) + + W(3, -1112186771, -1098422117, 1034155462, 1004978479) + + W(4, -1102837698, 1058965073, -1089226130, 1033810693) + + W(5, -1117642958, -1106625757, 1037373467, 1029436414) + W(6, -1137018200, 1036181095, 994321759, -1119765454) + + W(7, 1010580432, -1127761788, 1021285644, 1034713459); + sum2 = W(0, -1127012521, -1110373665, -1121983257, 1021812843) + + W(1, -1129458054, -1122115974, -1121551577, 1015201109) + + W(2, -1134632819, -1118435057, -1107711610, 1039413537) + + W(3, -1113739078, 1041258512, 1043546644, -1127386873) + + W(4, -1106078947, 1025961773, 1048226293, -1110385416) + + W(5, -1115241196, 1041055451, -1131486243, -1135801459) + + W(6, -1122814807, 1025056413, -1139476701, -1132245806) + + W(7, -1119046895, 1029845331, 1018415015, -1140149017); + WS(-1109010880, -1087548956); + sum1 = W(0, 1034947768, -1095012676, 1046023882, 1029737824) + W(1, 1034343312, -1102610188, 1039446704, 1025692706) + + W(2, 1016751552, -1096454908, 1042564604, 1038373096) + + W(3, 1019661856, -1091443170, -1105694067, 1039271048) + + W(4, -1126501287, -1131030249, 1044246468, 1012879825) + + W(5, 1017025648, 1042942296, -1103700296, 1041317114) + W(6, 1030724160, 1019936112, -1141422594, 1029263800) + + W(7, -1140792121, 1024647464, -1107855416, 1041193844); + sum2 = + W(0, 1034034732, -1107522705, -1105460279, 1021740679) + W(1, -1113997103, -1121503695, 1038975878, -1112744336) + + W(2, 1028771217, -1114143244, 1032873918, -1121564954) + W(3, 1025456143, -1105773446, 1059420344, 1024971971) + + W(4, 1035315492, -1109746606, 1040681265, -1122379806) + + W(5, -1102403849, -1106040358, 1046039582, -1106873869) + + W(6, 1018212015, -1106459627, 1026290649, -1130313815) + + W(7, -1099438501, 1039219872, 1046943722, -1105420350); + WS(-1086299832, -1077288694); + sum1 = W(0, 1021716686, -1099039878, -1111509136, 1039618828) + + W(1, -1132921948, -1108540692, 1021468846, -1131678690) + + W(2, -1113901292, -1158126306, -1096197083, 1041516082) + + W(3, -1108835908, 1055092577, 1062013047, -1118733319) + + W(4, 1023078294, -1089051407, 1050708993, -1122936235) + W(5, 965138311, -1113759276, 1022391342, 1015065790) + + W(6, 998651320, -1107695832, -1133490396, 997649137) + W(7, -1130194922, -1113503632, 991635057, 1023538631); + sum2 = W(0, -1133976495, 1035891239, -1130801609, -1113698362) + + W(1, 1027343155, 1030599513, -1108453664, 1016406968) + + W(2, -1149877867, 1037590422, 1012747883, -1108226898) + + W(3, -1119506980, 1054189655, -1119322812, -1120928356) + + W(4, -1126385541, 1041308688, -1107379808, 1016225738) + + W(5, 1016526837, -1112736561, -1119223720, 988482485) + W(6, 994153115, 1004824957, -1116360142, 1018050885) + + W(7, -1140785051, -1120347934, -1129452107, -1117792638); + WS(-1113279936, 1066223903); + sum1 = W(0, -1128171420, 1040261344, -1112013315, -1123695998) + + W(1, -1141738481, -1140107833, -1116929726, -1154978689) + + W(2, -1138940153, 1050703688, -1108200895, -1123177006) + + W(3, 1044160156, -1100167260, -1100730273, 1034288823) + + W(4, 1020686276, -1130335589, 1040782300, -1141423761) + + W(5, -1129655596, 1035637471, 1024316286, -1114187043) + W(6, 964173357, -1124525100, 1014134393, 1013984857) + + W(7, -1123239900, 1032644739, 1029624526, -1108229911); + sum2 = W(0, -1115606620, 1021458196, 1009639320, -1131253088) + + W(1, -1125272644, 1017345212, 1016051020, -1143902384) + + W(2, -1099614716, 1047257730, -1120838650, 1020803060) + + W(3, -1080575150, 1068148121, -1113655261, 1032085971) + + W(4, -1102155153, 1044966894, -1132238288, 1016311348) + + W(5, -1122847678, 1026244022, -1130782536, -1137376840) + + W(6, -1123394906, 1017049220, 967940860, -1137115752) + + W(7, -1129056732, 1010161976, 1004223696, -1136984808); + WS(1060545080, -1126581603); + sum1 = + W(0, 1032630360, -1112268976, 1045186906, -1125010622) + W(1, 1037657648, -1128752350, 1032285712, 1029508223) + + W(2, 1043836232, -1090205186, 1053340438, -1108078856) + W(3, 1037448680, 1048595306, -1094666759, 1041691860) + + W(4, 976149203, 1057651571, -1082657749, 1042698525) + W(5, 1031833596, 1035187792, -1092127852, 1040118132) + + W(6, 1031675647, 1034806588, -1104761760, 1033087420) + W(7, 1025282125, 1043419290, -1096441814, 1034587656); + sum2 = + W(0, -1123698886, 1034075649, 998149095, -1113635181) + W(1, -1126365381, 1026991402, -1118780236, -1168196508) + + W(2, -1135914762, 1019253181, 1023543366, -1114469118) + + W(3, -1121651762, 1047572688, 1038479879, -1145545780) + W(4, -1118625490, 1035108181, -1114677625, 992781287) + + W(5, -1122087574, -1115886918, 1011684618, -1139655050) + + W(6, -1147908244, 1016718341, -1132109957, -1142844852) + + W(7, -1134045690, -1117034488, -1137057610, 1007905050); + WS(-1083899832, -1105526146); + sum1 = W(0, 1026357515, -1119744955, -1117075907, -1111407198) + + W(1, -1139718894, -1125720471, -1106102943, -1152407445) + + W(2, 1044187583, -1092285679, 1048719011, -1107209883) + + W(3, -1105573131, 1062437883, 1052836221, -1107292779) + + W(4, -1104526300, 1058460257, -1089717563, -1122559055) + + W(5, -1119529939, 1022150135, -1123085499, -1119739267) + + W(6, -1125768375, 1033366698, -1114009838, -1119196243) + + W(7, -1132776678, 1009731342, -1112611206, -1129505495); + sum2 = W(0, -1110807022, 1025172792, 1033543849, -1123816828) + + W(1, -1129400032, -1117035240, 999654946, -1144812946) + + W(2, -1105612607, 1035443403, 1039345667, -1120747576) + + W(3, -1123619892, -1135427545, 1053020794, -1113498942) + + W(4, -1131262448, -1111010692, 1047843748, -1113301822) + + W(5, 1016529300, -1115955576, -1135856481, -1146605522) + + W(6, -1129444600, -1117326476, 1022819536, -1119691028) + + W(7, -1136239801, -1121250556, 998047364, -1135792457); + WS(-1107513792, 1064663354); + sum1 = W(0, 1030862455, -1113532308, 1032378968, -1123071015) + + W(1, -1161118946, 1021510766, -1127591630, 1009770420) + + W(2, 1040244826, -1091621085, 1051734861, -1107582956) + + W(3, -1104300038, 1046262406, 1034822530, -1108820108) + + W(4, -1102940181, 1054782000, -1095483267, -1125175670) + + W(5, -1135077628, 1019068110, 1031948820, 1025488559) + + W(6, -1135539484, 1036941280, -1172984259, -1126076542) + + W(7, 1011863892, -1128724830, -1120336759, 1036426604); + sum2 = + W(0, -1135206239, -1140752647, 1022777359, 974924014) + W(1, -1139065871, -1123380440, 1021581075, -1133276463) + + W(2, 1026230428, 988696695, -1122295168, 1029689087) + W(3, 1025917606, -1092786651, -1085937537, -1140169471) + + W(4, 1027050280, 1049996339, 1032573953, -1135329695) + W(5, 1013849783, 1057784826, -1130048007, -1124883951) + + W(6, 1016077019, 1033822297, 1032545188, 1011238415) + W(7, -1127829351, 1034470972, -1137094527, 1001568686); + WS(1058918200, -1121082995); - sum1 = W(0, -1123354974, -1112248839, 1046299686, -1143613552) + W(1, -1118620174, 1024662558, 1028038478, -1129268360) + W(2, 1016130204, -1087068557, 1063313277, -1103342192) + W(3, -1103968288, 1048182784, 1047279381, -1115088511) + W(4, -1101453425, 1059583965, -1088182320, 1003350800) + W(5, -1117908518, -1119323982, 1034186247, -1134684248) + W(6, -1122284590, 1027638054, -1124394588, -1111377363) + W(7, -1122818124, -1137723992, 978245507, 1028117438); sum2 = W(0, -1162931039, -1131063526, 1029801649, -1117642655) + W(1, -1136248556, -1131086728, 1031011705, -1128864654) + W(2, -1115594515, -1128443230, 1042762789, -1107118398) + W(3, -1119907402, 1044675527, 1050674207, -1113986381) + W(4, 1022791334, -1107588397, 1009001220, -1186206458) + W(5, 1017500018, -1111169922, -1112569685, 1017255694) + W(6, -1156766128, -1125594766, -1148613464, 993928432) + W(7, 1014782692, -1135599628, -1114139175, 1007622876); WS(1038828992, 1041685264); - sum1 = W(0, -1114329248, 1049950910, -1097681183, 1028668144) + W(1, 995958527, 1027336960, -1107326552, 1025858258) + W(2, -1117673776, 1060640651, -1085831405, 1033402064) + W(3, 1034401008, 1045782072, -1105157973, -1122828000) + W(4, 1038612842, -1098159517, 1053136924, -1110558370) + W(5, 1035088196, -1106507532, 1032016120, -1113173980) + W(6, 1008781376, -1124000392, 1023707152, 1012109856) + W(7, 1029875310, -1105439902, 1034119968, -1114749520); sum2 = W(0, 1031315360, -1099468189, -1112139926, 1036663822) + W(1, -1131767489, -1140834082, 1024287080, -1122285462) + W(2, 1023637252, -1100127579, -1117241706, 1038018354) + W(3, -1107869385, 1052854494, 1052996200, -1112496415) + W(4, -1107666272, 1034036134, 1027811452, -1110479054) + W(5, -1117110288, 1024451620, 1027157968, -1112615559) + W(6, -1124350185, 1003450083, -1131082337, 998992195) + W(7, -1110538107, 1041131277, 1035032776, -1106762474); WS(-1086074680, 1053637716); - sum1 = W(0, -1121345387, 1042002951, -1113042450, -1121398619) + W(1, -1148805338, -1165378922, -1115297518, 991217235) + W(2, -1136570733, 1052460699, -1107443934, -1117268427) + W(3, 1049266593, -1094571489, -1098765182, 1036113926) + W(4, 1027081787, -1124281856, 1043313411, -1136658365) + W(5, -1133439181, 1040734807, 1006695533, -1112513138) + W(6, -1158465386, -1121708851, 1016359031, 1021173351) + W(7, -1120818857, 1035650578, 1027853163, -1106476275); sum2 = W(0, 1026517575, -1170492850, -1138816415, -1143472678) + W(1, 1017334370, 1003954710, -1132363566, 998846550) + W(2, 1051558711, -1096673587, -1136175651, -1124275402) + W(3, 1071692777, -1077357700, -1098960792, 1018703670) + W(4, 1049822619, -1098179385, -1116986501, 1007812651) + W(5, 1020207734, 996694924, 1003290486, 1007766851) + W(6, 1022251878, -1122577241, -1141894102, 1009415395) + W(7, 1019995718, 1015494226, -1126828734, -1163222937); WS(1051521136, 1027207116); - sum1 = W(0, -1122694020, 1010830545, -1124291704, 1018062184) + W(1, -1121133108, -1124202632, 1037913146, -1116091286) + W(2, -1102175837, 1057246783, -1093542759, 1041281977) + W(3, -1116351908, 1026322980, 982577970, -1125394504) + W(4, 1045518980, -1089509425, 1055793637, 1008755233) + W(5, 1009393969, 1025178484, -1118947636, -1127575032) + W(6, 1008379217, -1117338572, 1001093793, 1015898776) + W(7, 1015772516, 1009646833, 1001810977, -1121163492); sum2 = W(0, -1137495011, -1135527491, 1027730022, -1118108263) + W(1, 1013616911, -1123650952, 1024465134, -1128775579) + W(2, -1135578111, 1013443151, 1049128967, -1098008683) + W(3, 1029346938, -1114797945, 1068130737, -1080443718) + W(4, 1017473747, -1122100892, 1046423571, -1101482344) + W(5, 1012413655, -1128721387, -1143058109, -1137148015) + W(6, -1133405571, -1166794345, 1020545683, -1128178767) + W(7, 1008139351, -1156685818, -1126785325, 991435034); WS(1057767608, -1132080751); - sum1 = W(0, 1026028453, 1025766741, 1035118319, 1012106581) + W(1, 1026017621, -1135552917, 1040474693, -1138611630) + W(2, -1117947285, 1051769667, -1111744027, 1030333189) + W(3, 1048679017, -1083959172, -1084413328, 1045191121) + W(4, 1025261389, -1120826122, 1049618505, -1122181545) + W(5, 1011196341, 1045191525, -1110336171, 1030480605) + W(6, 1015828970, 1028389741, 1028257397, 1027514349) + W(7, 1025013027, 1039505775, -1123719333, 1020294666); sum2 = W(0, 1017587161, -1101123140, 1040188371, 988296658) + W(1, 1028118553, -1103020887, 1022642341, 1010063898) + W(2, 1008167722, -1099714612, 1039093756, 1026403646) + W(3, 1005112948, 1049070164, 1046164698, 1033545355) + W(4, -1125344655, 1032013714, -1111525569, 1002132020) + W(5, 1015776789, 1022049457, -1098832696, 1037334715) + W(6, -1148301500, 1009340114, -1115917000, -1139728254) + W(7, -1138850406, -1167693540, -1103378287, 1035581889); WS(-1099372256, -1088618788); - sum1 = W(0, -1112538182, 1048693927, -1112344546, -1109099742) + W(1, -1113349022, 1033711782, -1129092599, -1110127398) + W(2, -1103996671, 1064716592, -1086749016, 1032699126) + W(3, 1024020908, -1143605597, 1044926535, -1121424940) + W(4, 1046614908, -1085173359, 1062252083, -1130166943) + W(5, -1111225386, 1004694493, 1040479887, -1106709441) + W(6, -1110537326, -1108087402, 1034104622, -1120726228) + W(7, -1114146165, -1138402062, 1042110371, -1106064827); sum2 = W(0, 987083788, 1013472954, -1120418118, 979955865) + W(1, -1144106823, -1131186779, -1122269098, -1163904780) + W(2, -1120467381, -1139561796, 1038342084, -1115615181) + W(3, -1121977305, 1044091298, 1042996066, -1127292875) + W(4, -1118651341, 1038343490, -1118476220, -1123141745) + W(5, -1162389292, -1115306287, -1128689408, 1014320394) + W(6, -1152635694, -1155962630, -1132569906, -1135582470) + W(7, 964510307, -1117365756, -1141833923, 1008840046); WS(1041282784, 1044242623); - sum1 = W(0, -1119885764, -1171512555, 1003864029, 1025494836) + W(1, -1119816052, -1121861252, 1040963149, -1113504879) + W(2, -1100880653, 1057266723, -1094412795, 1043843337) + W(3, -1113812594, 1010135439, -1118004569, -1125989575) + W(4, 1046531310, -1089952515, 1056310444, -1156936827) + W(5, 1015358999, 1031135156, -1114099002, -1122714492) + W(6, 1005085853, -1115226950, 1015234855, 1003362397) + W(7, 1021011107, 1003139037, 992693307, -1120612644); sum2 = W(0, 1005317381, -1142619324, -1126266146, 1026462555) + W(1, -1143827754, 1012902153, -1128784654, 1020893616) + W(2, 1019060164, -1114788024, -1094218173, 1054132458) + W(3, 1009279342, -1098688460, -1078812823, 1070492026) + W(4, 1014092605, -1120377499, -1099532818, 1048935725) + W(5, -1131000233, 1017453102, 1007638067, 1011358224) + W(6, 1012779564, -1139793504, -1130333980, 1015734963) + W(7, -1137528453, -1147729078, 1018177647, 987943782); WS(1046635232, 1024078131); - sum1 = W(0, 1002735212, 1035063871, -1097977761, 1040314319) + W(1, 1025138813, 1034039879, -1105608655, 1035664624) + W(2, 1017042555, 1044122447, -1094991056, 1038536855) + W(3, -1132524982, -1110416695, 1051547730, -1114843703) + W(4, 1031803657, -1092481954, 1050188814, 1003107468) + W(5, 1033606155, -1094320024, 1047410847, 1019470987) + W(6, 1021596219, -1107502027, 1031346589, 1021345835) + W(7, 1015508823, -1103391009, 1046101811, -1136683190); sum2 = W(0, -1096475926, 1044036812, 1052862983, -1106234474) + W(1, -1112281069, -1112231286, 1024115789, -1121785528) + W(2, -1116645717, -1111398905, 1051331710, -1130292776) + W(3, 1041647377, -1096068583, 1038036111, 1037359643) + W(4, -1113263240, 1026411348, 1042458641, -1111704128) + W(5, 1023473494, -1114320784, 1028002558, -1123406807) + W(6, -1117017643, -1138574198, 1037890580, -1109714921) + W(7, 1039764966, -1104710548, -1106844581, 1041123403); WS(-1088554040, -1076674880); - sum1 = W(0, 1026292820, -1132973070, -1144171612, -1130131975) + W(1, 1016736263, 1034501898, -1110973538, 1028857234) + W(2, 1042339025, -1089525132, 1052671191, -1108906970) + W(3, -1110236986, 1037427962, -1123890785, -1112145786) + W(4, -1103961368, 1056478885, -1092344862, 1002874044) + W(5, 1016313655, -1118983748, 1041641985, 1025897228) + W(6, -1151588920, 1038469390, 1010979982, -1130905399) + W(7, 1014755782, -1123320716, 1017396903, 1033705562); sum2 = W(0, 1013915195, -1133182691, -1127318198, 1020584890) + W(1, 1007730851, 1024414743, -1121307593, 1005058566) + W(2, 981970521, -1111248658, 1035588225, -1124411850) + W(3, 1028189234, 1040952978, 1057294107, 1029625115) + W(4, -1121038101, -1109339192, -1107404728, 1026110889) + W(5, -1142484934, -1094377458, 1024397525, 1023925523) + W(6, -1146368902, -1116592821, -1118541421, -1140327971) + W(7, 1010322539, -1112421528, 1019759378, -1199698720); WS(1063581112, 1015292283); - sum1 = W(0, -1123806598, -1125096044, 1046804719, -1117498166) + W(1, -1124445804, 1037634467, 1028314614, 1006823135) + W(2, 1036776315, -1083793455, 1064148787, -1106689849) + W(3, -1112186771, -1098422117, 1034155462, 1004978479) + W(4, -1102837698, 1058965073, -1089226130, 1033810693) + W(5, -1117642958, -1106625757, 1037373467, 1029436414) + W(6, -1137018200, 1036181095, 994321759, -1119765454) + W(7, 1010580432, -1127761788, 1021285644, 1034713459); sum2 = W(0, -1127012521, -1110373665, -1121983257, 1021812843) + W(1, -1129458054, -1122115974, -1121551577, 1015201109) + W(2, -1134632819, -1118435057, -1107711610, 1039413537) + W(3, -1113739078, 1041258512, 1043546644, -1127386873) + W(4, -1106078947, 1025961773, 1048226293, -1110385416) + W(5, -1115241196, 1041055451, -1131486243, -1135801459) + W(6, -1122814807, 1025056413, -1139476701, -1132245806) + W(7, -1119046895, 1029845331, 1018415015, -1140149017); WS(-1109010880, -1087548956); - sum1 = W(0, 1034947768, -1095012676, 1046023882, 1029737824) + W(1, 1034343312, -1102610188, 1039446704, 1025692706) + W(2, 1016751552, -1096454908, 1042564604, 1038373096) + W(3, 1019661856, -1091443170, -1105694067, 1039271048) + W(4, -1126501287, -1131030249, 1044246468, 1012879825) + W(5, 1017025648, 1042942296, -1103700296, 1041317114) + W(6, 1030724160, 1019936112, -1141422594, 1029263800) + W(7, -1140792121, 1024647464, -1107855416, 1041193844); sum2 = W(0, 1034034732, -1107522705, -1105460279, 1021740679) + W(1, -1113997103, -1121503695, 1038975878, -1112744336) + W(2, 1028771217, -1114143244, 1032873918, -1121564954) + W(3, 1025456143, -1105773446, 1059420344, 1024971971) + W(4, 1035315492, -1109746606, 1040681265, -1122379806) + W(5, -1102403849, -1106040358, 1046039582, -1106873869) + W(6, 1018212015, -1106459627, 1026290649, -1130313815) + W(7, -1099438501, 1039219872, 1046943722, -1105420350); WS(-1086299832, -1077288694); - sum1 = W(0, 1021716686, -1099039878, -1111509136, 1039618828) + W(1, -1132921948, -1108540692, 1021468846, -1131678690) + W(2, -1113901292, -1158126306, -1096197083, 1041516082) + W(3, -1108835908, 1055092577, 1062013047, -1118733319) + W(4, 1023078294, -1089051407, 1050708993, -1122936235) + W(5, 965138311, -1113759276, 1022391342, 1015065790) + W(6, 998651320, -1107695832, -1133490396, 997649137) + W(7, -1130194922, -1113503632, 991635057, 1023538631); sum2 = W(0, -1133976495, 1035891239, -1130801609, -1113698362) + W(1, 1027343155, 1030599513, -1108453664, 1016406968) + W(2, -1149877867, 1037590422, 1012747883, -1108226898) + W(3, -1119506980, 1054189655, -1119322812, -1120928356) + W(4, -1126385541, 1041308688, -1107379808, 1016225738) + W(5, 1016526837, -1112736561, -1119223720, 988482485) + W(6, 994153115, 1004824957, -1116360142, 1018050885) + W(7, -1140785051, -1120347934, -1129452107, -1117792638); WS(-1113279936, 1066223903); - sum1 = W(0, -1128171420, 1040261344, -1112013315, -1123695998) + W(1, -1141738481, -1140107833, -1116929726, -1154978689) + W(2, -1138940153, 1050703688, -1108200895, -1123177006) + W(3, 1044160156, -1100167260, -1100730273, 1034288823) + W(4, 1020686276, -1130335589, 1040782300, -1141423761) + W(5, -1129655596, 1035637471, 1024316286, -1114187043) + W(6, 964173357, -1124525100, 1014134393, 1013984857) + W(7, -1123239900, 1032644739, 1029624526, -1108229911); sum2 = W(0, -1115606620, 1021458196, 1009639320, -1131253088) + W(1, -1125272644, 1017345212, 1016051020, -1143902384) + W(2, -1099614716, 1047257730, -1120838650, 1020803060) + W(3, -1080575150, 1068148121, -1113655261, 1032085971) + W(4, -1102155153, 1044966894, -1132238288, 1016311348) + W(5, -1122847678, 1026244022, -1130782536, -1137376840) + W(6, -1123394906, 1017049220, 967940860, -1137115752) + W(7, -1129056732, 1010161976, 1004223696, -1136984808); WS(1060545080, -1126581603); - sum1 = W(0, 1032630360, -1112268976, 1045186906, -1125010622) + W(1, 1037657648, -1128752350, 1032285712, 1029508223) + W(2, 1043836232, -1090205186, 1053340438, -1108078856) + W(3, 1037448680, 1048595306, -1094666759, 1041691860) + W(4, 976149203, 1057651571, -1082657749, 1042698525) + W(5, 1031833596, 1035187792, -1092127852, 1040118132) + W(6, 1031675647, 1034806588, -1104761760, 1033087420) + W(7, 1025282125, 1043419290, -1096441814, 1034587656); sum2 = W(0, -1123698886, 1034075649, 998149095, -1113635181) + W(1, -1126365381, 1026991402, -1118780236, -1168196508) + W(2, -1135914762, 1019253181, 1023543366, -1114469118) + W(3, -1121651762, 1047572688, 1038479879, -1145545780) + W(4, -1118625490, 1035108181, -1114677625, 992781287) + W(5, -1122087574, -1115886918, 1011684618, -1139655050) + W(6, -1147908244, 1016718341, -1132109957, -1142844852) + W(7, -1134045690, -1117034488, -1137057610, 1007905050); WS(-1083899832, -1105526146); - sum1 = W(0, 1026357515, -1119744955, -1117075907, -1111407198) + W(1, -1139718894, -1125720471, -1106102943, -1152407445) + W(2, 1044187583, -1092285679, 1048719011, -1107209883) + W(3, -1105573131, 1062437883, 1052836221, -1107292779) + W(4, -1104526300, 1058460257, -1089717563, -1122559055) + W(5, -1119529939, 1022150135, -1123085499, -1119739267) + W(6, -1125768375, 1033366698, -1114009838, -1119196243) + W(7, -1132776678, 1009731342, -1112611206, -1129505495); sum2 = W(0, -1110807022, 1025172792, 1033543849, -1123816828) + W(1, -1129400032, -1117035240, 999654946, -1144812946) + W(2, -1105612607, 1035443403, 1039345667, -1120747576) + W(3, -1123619892, -1135427545, 1053020794, -1113498942) + W(4, -1131262448, -1111010692, 1047843748, -1113301822) + W(5, 1016529300, -1115955576, -1135856481, -1146605522) + W(6, -1129444600, -1117326476, 1022819536, -1119691028) + W(7, -1136239801, -1121250556, 998047364, -1135792457); WS(-1107513792, 1064663354); - sum1 = W(0, 1030862455, -1113532308, 1032378968, -1123071015) + W(1, -1161118946, 1021510766, -1127591630, 1009770420) + W(2, 1040244826, -1091621085, 1051734861, -1107582956) + W(3, -1104300038, 1046262406, 1034822530, -1108820108) + W(4, -1102940181, 1054782000, -1095483267, -1125175670) + W(5, -1135077628, 1019068110, 1031948820, 1025488559) + W(6, -1135539484, 1036941280, -1172984259, -1126076542) + W(7, 1011863892, -1128724830, -1120336759, 1036426604); sum2 = W(0, -1135206239, -1140752647, 1022777359, 974924014) + W(1, -1139065871, -1123380440, 1021581075, -1133276463) + W(2, 1026230428, 988696695, -1122295168, 1029689087) + W(3, 1025917606, -1092786651, -1085937537, -1140169471) + W(4, 1027050280, 1049996339, 1032573953, -1135329695) + W(5, 1013849783, 1057784826, -1130048007, -1124883951) + W(6, 1016077019, 1033822297, 1032545188, 1011238415) + W(7, -1127829351, 1034470972, -1137094527, 1001568686); WS(1058918200, -1121082995); return clamp(mstd0 + 5.0 * vsum / wsum * mstd1, 0.0, 1.0); } -float GetLuma(float3 color) { - return dot(float3(0.299f, 0.587f, 0.114f), color); -} +shared float inp[429]; -groupshared float inp[429]; +#define CURRENT_PASS 1 -void Pass1(uint2 blockStart, uint3 threadId) { - const float2 inputPt = GetInputPt(); +#define GET_SAMPLE(x) dot(x.rgb, rgb2y) +#define imageStore(out_image, pos, val) imageStoreOverride(pos, val.x) +void imageStoreOverride(uint2 pos, float value) { temp[pos] = (value); } - const uint2 group_base = uint2(blockStart.x, blockStart.y >> 1); - for (int id = threadId.x * MP_NUM_THREADS_Y + threadId.y; id < 429; id += MP_NUM_THREADS_X * MP_NUM_THREADS_Y) { +#define INPUT_tex(pos) GET_SAMPLE(vec4(texture(INPUT, pos))) +static const float2 INPUT_size = float2(GetInputSize()); +static const float2 INPUT_pt = float2(GetInputPt()); + +#define HOOKED_tex(pos) INPUT_tex(pos) +#define HOOKED_size INPUT_size +#define HOOKED_pt INPUT_pt + +void Pass1(uint2 blockStart, uint3 threadId) { + ivec2 group_base = ivec2(gl_WorkGroupID) * ivec2(gl_WorkGroupSize); + int local_pos = int(gl_LocalInvocationID.x) * 11 + int(gl_LocalInvocationID.y); + for (int id = int(gl_LocalInvocationIndex); id < 429; id += int(gl_WorkGroupSize.x * gl_WorkGroupSize.y)) { uint x = (uint)id / 11, y = (uint)id % 11; - inp[id] = GetLuma(INPUT.SampleLevel(sam, inputPt * float2(group_base.x + x - 3 + 0.5, group_base.y + y - 1 + 0.5), 0).rgb); + inp[id] = + HOOKED_tex(HOOKED_pt * vec2(float(group_base.x + x - (3)) + 0.5, float(group_base.y + y - (1)) + 0.5)).x; } - - GroupMemoryBarrierWithGroupSync(); - - float4 ret = 0.0; - float4 ret0 = 0.0; - float4 samples[8]; - const uint local_pos = threadId.x * 11 + threadId.y; - [unroll] - for (int i = 0; i < 8; ++i) { - [unroll] - for (int j = 0; j < 4; ++j) { - samples[i][j] = inp[local_pos + i * 11 + j]; - } + barrier(); + vec4 ret = vec4(0.0, 0.0, 0.0, 0.0); + vec4 ret0 = vec4(0.0, 0.0, 0.0, 0.0); + vec4 samples[8]; + samples[0][0] = inp[local_pos + 0]; + samples[0][1] = inp[local_pos + 1]; + samples[0][2] = inp[local_pos + 2]; + samples[0][3] = inp[local_pos + 3]; + samples[1][0] = inp[local_pos + 11]; + samples[1][1] = inp[local_pos + 12]; + samples[1][2] = inp[local_pos + 13]; + samples[1][3] = inp[local_pos + 14]; + samples[2][0] = inp[local_pos + 22]; + samples[2][1] = inp[local_pos + 23]; + samples[2][2] = inp[local_pos + 24]; + samples[2][3] = inp[local_pos + 25]; + samples[3][0] = inp[local_pos + 33]; + samples[3][1] = inp[local_pos + 34]; + samples[3][2] = inp[local_pos + 35]; + samples[3][3] = inp[local_pos + 36]; + samples[4][0] = inp[local_pos + 44]; + samples[4][1] = inp[local_pos + 45]; + samples[4][2] = inp[local_pos + 46]; + samples[4][3] = inp[local_pos + 47]; + samples[5][0] = inp[local_pos + 55]; + samples[5][1] = inp[local_pos + 56]; + samples[5][2] = inp[local_pos + 57]; + samples[5][3] = inp[local_pos + 58]; + samples[6][0] = inp[local_pos + 66]; + samples[6][1] = inp[local_pos + 67]; + samples[6][2] = inp[local_pos + 68]; + samples[6][3] = inp[local_pos + 69]; + samples[7][0] = inp[local_pos + 77]; + samples[7][1] = inp[local_pos + 78]; + samples[7][2] = inp[local_pos + 79]; + samples[7][3] = inp[local_pos + 80]; + ret[0] = nnedi3(samples); + ret0[0] = inp[local_pos + 34]; +#if CURRENT_PASS == LAST_PASS + uint2 destPos = blockStart + threadId.xy * 2; + uint2 outputSize = GetOutputSize(); + if (destPos.x >= outputSize.x || destPos.y >= outputSize.y) { + return; } - - const uint2 destPos = blockStart + uint2(threadId.x, threadId.y * 2); - tex1[destPos] = samples[3][1]; - tex1[destPos + uint2(0, 1)] = nnedi3(samples); +#endif + imageStore(out_image, ivec2(gl_GlobalInvocationID) * ivec2(1, 2), ret0); + imageStore(out_image, ivec2(gl_GlobalInvocationID) * ivec2(1, 2) + ivec2(0, 1), ret); } - - //!PASS 2 -//!DESC double_x -//!IN tex1, INPUT -//!BLOCK_SIZE 64,8 -//!NUM_THREADS 32,8 - -float nnedi3(float4 samples[8]) { +//!DESC NNEDI3 (double_x, nns16, win8x4) +//!IN INPUT, temp +//!OUT OUTPUT +//!BLOCK_SIZE 64, 8 +//!NUM_THREADS 32, 8 +#pragma optionNV(inline none) +float nnedi3(vec4 samples[8]) { float sum = 0.0, sumsq = 0.0; - [unroll] - for (int i = 0; i < 8; i++) { - sum += dot(samples[i], 1.0f); + [unroll] for (int i = 0; i < 8; i++) { + sum += dot(samples[i], vec4(1.0, 1.0, 1.0, 1.0)); sumsq += dot(samples[i], samples[i]); } - float mstd0 = sum / 32.0; float mstd1 = sumsq / 32.0 - mstd0 * mstd0; - // 不能使用 lerp,否则结果可能为 nan - float mstd2 = mstd1 >= 1.192092896e-7 ? rsqrt(mstd1) : 0.0; + float mstd2 = mix(0.0, inversesqrt(mstd1), mstd1 >= 1.192092896e-7); mstd1 *= mstd2; - float vsum = 0.0, wsum = 0.0, sum1, sum2; +#define T(x) intBitsToFloat(x) +#define W(i, w0, w1, w2, w3) dot(samples[i], vec4(T(w0), T(w1), T(w2), T(w3))) +#define WS(w0, w1) \ + sum1 = exp(sum1 * mstd2 + T(w0)); \ + sum2 = sum2 * mstd2 + T(w1); \ + wsum += sum1; \ + vsum += sum1 * (sum2 / (1.0 + abs(sum2))); + sum1 = W(0, -1123354974, -1118620174, 1016130204, -1103968288) + + W(1, -1101453425, -1117908518, -1122284590, -1122818124) + + W(2, -1112248839, 1024662558, -1087068557, 1048182784) + + W(3, 1059583965, -1119323982, 1027638054, -1137723992) + W(4, 1046299686, 1028038478, 1063313277, 1047279381) + + W(5, -1088182320, 1034186247, -1124394588, 978245507) + + W(6, -1143613552, -1129268360, -1103342192, -1115088511) + + W(7, 1003350800, -1134684248, -1111377363, 1028117438); + sum2 = + W(0, -1162931039, -1136248556, -1115594515, -1119907402) + W(1, 1022791334, 1017500018, -1156766128, 1014782692) + + W(2, -1131063526, -1131086728, -1128443230, 1044675527) + + W(3, -1107588397, -1111169922, -1125594766, -1135599628) + + W(4, 1029801649, 1031011705, 1042762789, 1050674207) + W(5, 1009001220, -1112569685, -1148613464, -1114139175) + + W(6, -1117642655, -1128864654, -1107118398, -1113986381) + + W(7, -1186206458, 1017255694, 993928432, 1007622876); + WS(1038828992, 1041685264); + sum1 = W(0, -1114329248, 995958527, -1117673776, 1034401008) + W(1, 1038612842, 1035088196, 1008781376, 1029875310) + + W(2, 1049950910, 1027336960, 1060640651, 1045782072) + + W(3, -1098159517, -1106507532, -1124000392, -1105439902) + + W(4, -1097681183, -1107326552, -1085831405, -1105157973) + + W(5, 1053136924, 1032016120, 1023707152, 1034119968) + W(6, 1028668144, 1025858258, 1033402064, -1122828000) + + W(7, -1110558370, -1113173980, 1012109856, -1114749520); + sum2 = W(0, 1031315360, -1131767489, 1023637252, -1107869385) + + W(1, -1107666272, -1117110288, -1124350185, -1110538107) + + W(2, -1099468189, -1140834082, -1100127579, 1052854494) + + W(3, 1034036134, 1024451620, 1003450083, 1041131277) + W(4, -1112139926, 1024287080, -1117241706, 1052996200) + + W(5, 1027811452, 1027157968, -1131082337, 1035032776) + + W(6, 1036663822, -1122285462, 1038018354, -1112496415) + + W(7, -1110479054, -1112615559, 998992195, -1106762474); + WS(-1086074680, 1053637716); + sum1 = W(0, -1121345387, -1148805338, -1136570733, 1049266593) + + W(1, 1027081787, -1133439181, -1158465386, -1120818857) + + W(2, 1042002951, -1165378922, 1052460699, -1094571489) + + W(3, -1124281856, 1040734807, -1121708851, 1035650578) + + W(4, -1113042450, -1115297518, -1107443934, -1098765182) + + W(5, 1043313411, 1006695533, 1016359031, 1027853163) + W(6, -1121398619, 991217235, -1117268427, 1036113926) + + W(7, -1136658365, -1112513138, 1021173351, -1106476275); + sum2 = W(0, 1026517575, 1017334370, 1051558711, 1071692777) + W(1, 1049822619, 1020207734, 1022251878, 1019995718) + + W(2, -1170492850, 1003954710, -1096673587, -1077357700) + + W(3, -1098179385, 996694924, -1122577241, 1015494226) + + W(4, -1138816415, -1132363566, -1136175651, -1098960792) + + W(5, -1116986501, 1003290486, -1141894102, -1126828734) + + W(6, -1143472678, 998846550, -1124275402, 1018703670) + + W(7, 1007812651, 1007766851, 1009415395, -1163222937); + WS(1051521136, 1027207116); + sum1 = W(0, -1122694020, -1121133108, -1102175837, -1116351908) + + W(1, 1045518980, 1009393969, 1008379217, 1015772516) + W(2, 1010830545, -1124202632, 1057246783, 1026322980) + + W(3, -1089509425, 1025178484, -1117338572, 1009646833) + + W(4, -1124291704, 1037913146, -1093542759, 982577970) + W(5, 1055793637, -1118947636, 1001093793, 1001810977) + + W(6, 1018062184, -1116091286, 1041281977, -1125394504) + + W(7, 1008755233, -1127575032, 1015898776, -1121163492); + sum2 = W(0, -1137495011, 1013616911, -1135578111, 1029346938) + + W(1, 1017473747, 1012413655, -1133405571, 1008139351) + + W(2, -1135527491, -1123650952, 1013443151, -1114797945) + + W(3, -1122100892, -1128721387, -1166794345, -1156685818) + + W(4, 1027730022, 1024465134, 1049128967, 1068130737) + W(5, 1046423571, -1143058109, 1020545683, -1126785325) + + W(6, -1118108263, -1128775579, -1098008683, -1080443718) + + W(7, -1101482344, -1137148015, -1128178767, 991435034); + WS(1057767608, -1132080751); + sum1 = + W(0, 1026028453, 1026017621, -1117947285, 1048679017) + W(1, 1025261389, 1011196341, 1015828970, 1025013027) + + W(2, 1025766741, -1135552917, 1051769667, -1083959172) + W(3, -1120826122, 1045191525, 1028389741, 1039505775) + + W(4, 1035118319, 1040474693, -1111744027, -1084413328) + + W(5, 1049618505, -1110336171, 1028257397, -1123719333) + W(6, 1012106581, -1138611630, 1030333189, 1045191121) + + W(7, -1122181545, 1030480605, 1027514349, 1020294666); + sum2 = W(0, 1017587161, 1028118553, 1008167722, 1005112948) + + W(1, -1125344655, 1015776789, -1148301500, -1138850406) + + W(2, -1101123140, -1103020887, -1099714612, 1049070164) + + W(3, 1032013714, 1022049457, 1009340114, -1167693540) + W(4, 1040188371, 1022642341, 1039093756, 1046164698) + + W(5, -1111525569, -1098832696, -1115917000, -1103378287) + + W(6, 988296658, 1010063898, 1026403646, 1033545355) + W(7, 1002132020, 1037334715, -1139728254, 1035581889); + WS(-1099372256, -1088618788); + sum1 = W(0, -1112538182, -1113349022, -1103996671, 1024020908) + + W(1, 1046614908, -1111225386, -1110537326, -1114146165) + + W(2, 1048693927, 1033711782, 1064716592, -1143605597) + + W(3, -1085173359, 1004694493, -1108087402, -1138402062) + + W(4, -1112344546, -1129092599, -1086749016, 1044926535) + + W(5, 1062252083, 1040479887, 1034104622, 1042110371) + + W(6, -1109099742, -1110127398, 1032699126, -1121424940) + + W(7, -1130166943, -1106709441, -1120726228, -1106064827); + sum2 = W(0, 987083788, -1144106823, -1120467381, -1121977305) + + W(1, -1118651341, -1162389292, -1152635694, 964510307) + + W(2, 1013472954, -1131186779, -1139561796, 1044091298) + + W(3, 1038343490, -1115306287, -1155962630, -1117365756) + + W(4, -1120418118, -1122269098, 1038342084, 1042996066) + + W(5, -1118476220, -1128689408, -1132569906, -1141833923) + + W(6, 979955865, -1163904780, -1115615181, -1127292875) + + W(7, -1123141745, 1014320394, -1135582470, 1008840046); + WS(1041282784, 1044242623); + sum1 = W(0, -1119885764, -1119816052, -1100880653, -1113812594) + + W(1, 1046531310, 1015358999, 1005085853, 1021011107) + W(2, -1171512555, -1121861252, 1057266723, 1010135439) + + W(3, -1089952515, 1031135156, -1115226950, 1003139037) + + W(4, 1003864029, 1040963149, -1094412795, -1118004569) + W(5, 1056310444, -1114099002, 1015234855, 992693307) + + W(6, 1025494836, -1113504879, 1043843337, -1125989575) + + W(7, -1156936827, -1122714492, 1003362397, -1120612644); + sum2 = W(0, 1005317381, -1143827754, 1019060164, 1009279342) + + W(1, 1014092605, -1131000233, 1012779564, -1137528453) + + W(2, -1142619324, 1012902153, -1114788024, -1098688460) + + W(3, -1120377499, 1017453102, -1139793504, -1147729078) + + W(4, -1126266146, -1128784654, -1094218173, -1078812823) + + W(5, -1099532818, 1007638067, -1130333980, 1018177647) + W(6, 1026462555, 1020893616, 1054132458, 1070492026) + + W(7, 1048935725, 1011358224, 1015734963, 987943782); + WS(1046635232, 1024078131); + sum1 = W(0, 1002735212, 1025138813, 1017042555, -1132524982) + W(1, 1031803657, 1033606155, 1021596219, 1015508823) + + W(2, 1035063871, 1034039879, 1044122447, -1110416695) + + W(3, -1092481954, -1094320024, -1107502027, -1103391009) + + W(4, -1097977761, -1105608655, -1094991056, 1051547730) + + W(5, 1050188814, 1047410847, 1031346589, 1046101811) + W(6, 1040314319, 1035664624, 1038536855, -1114843703) + + W(7, 1003107468, 1019470987, 1021345835, -1136683190); + sum2 = W(0, -1096475926, -1112281069, -1116645717, 1041647377) + + W(1, -1113263240, 1023473494, -1117017643, 1039764966) + + W(2, 1044036812, -1112231286, -1111398905, -1096068583) + + W(3, 1026411348, -1114320784, -1138574198, -1104710548) + + W(4, 1052862983, 1024115789, 1051331710, 1038036111) + W(5, 1042458641, 1028002558, 1037890580, -1106844581) + + W(6, -1106234474, -1121785528, -1130292776, 1037359643) + + W(7, -1111704128, -1123406807, -1109714921, 1041123403); + WS(-1088554040, -1076674880); + sum1 = W(0, 1026292820, 1016736263, 1042339025, -1110236986) + + W(1, -1103961368, 1016313655, -1151588920, 1014755782) + + W(2, -1132973070, 1034501898, -1089525132, 1037427962) + + W(3, 1056478885, -1118983748, 1038469390, -1123320716) + + W(4, -1144171612, -1110973538, 1052671191, -1123890785) + + W(5, -1092344862, 1041641985, 1010979982, 1017396903) + + W(6, -1130131975, 1028857234, -1108906970, -1112145786) + + W(7, 1002874044, 1025897228, -1130905399, 1033705562); + sum2 = W(0, 1013915195, 1007730851, 981970521, 1028189234) + W(1, -1121038101, -1142484934, -1146368902, 1010322539) + + W(2, -1133182691, 1024414743, -1111248658, 1040952978) + + W(3, -1109339192, -1094377458, -1116592821, -1112421528) + + W(4, -1127318198, -1121307593, 1035588225, 1057294107) + + W(5, -1107404728, 1024397525, -1118541421, 1019759378) + + W(6, 1020584890, 1005058566, -1124411850, 1029625115) + + W(7, 1026110889, 1023925523, -1140327971, -1199698720); + WS(1063581112, 1015292283); + sum1 = W(0, -1123806598, -1124445804, 1036776315, -1112186771) + + W(1, -1102837698, -1117642958, -1137018200, 1010580432) + + W(2, -1125096044, 1037634467, -1083793455, -1098422117) + + W(3, 1058965073, -1106625757, 1036181095, -1127761788) + W(4, 1046804719, 1028314614, 1064148787, 1034155462) + + W(5, -1089226130, 1037373467, 994321759, 1021285644) + W(6, -1117498166, 1006823135, -1106689849, 1004978479) + + W(7, 1033810693, 1029436414, -1119765454, 1034713459); + sum2 = + W(0, -1127012521, -1129458054, -1134632819, -1113739078) + + W(1, -1106078947, -1115241196, -1122814807, -1119046895) + + W(2, -1110373665, -1122115974, -1118435057, 1041258512) + W(3, 1025961773, 1041055451, 1025056413, 1029845331) + + W(4, -1121983257, -1121551577, -1107711610, 1043546644) + + W(5, 1048226293, -1131486243, -1139476701, 1018415015) + W(6, 1021812843, 1015201109, 1039413537, -1127386873) + + W(7, -1110385416, -1135801459, -1132245806, -1140149017); + WS(-1109010880, -1087548956); + sum1 = W(0, 1034947768, 1034343312, 1016751552, 1019661856) + W(1, -1126501287, 1017025648, 1030724160, -1140792121) + + W(2, -1095012676, -1102610188, -1096454908, -1091443170) + + W(3, -1131030249, 1042942296, 1019936112, 1024647464) + W(4, 1046023882, 1039446704, 1042564604, -1105694067) + + W(5, 1044246468, -1103700296, -1141422594, -1107855416) + + W(6, 1029737824, 1025692706, 1038373096, 1039271048) + W(7, 1012879825, 1041317114, 1029263800, 1041193844); + sum2 = W(0, 1034034732, -1113997103, 1028771217, 1025456143) + + W(1, 1035315492, -1102403849, 1018212015, -1099438501) + + W(2, -1107522705, -1121503695, -1114143244, -1105773446) + + W(3, -1109746606, -1106040358, -1106459627, 1039219872) + + W(4, -1105460279, 1038975878, 1032873918, 1059420344) + W(5, 1040681265, 1046039582, 1026290649, 1046943722) + + W(6, 1021740679, -1112744336, -1121564954, 1024971971) + + W(7, -1122379806, -1106873869, -1130313815, -1105420350); + WS(-1086299832, -1077288694); + sum1 = W(0, 1021716686, -1132921948, -1113901292, -1108835908) + W(1, 1023078294, 965138311, 998651320, -1130194922) + + W(2, -1099039878, -1108540692, -1158126306, 1055092577) + + W(3, -1089051407, -1113759276, -1107695832, -1113503632) + + W(4, -1111509136, 1021468846, -1096197083, 1062013047) + W(5, 1050708993, 1022391342, -1133490396, 991635057) + + W(6, 1039618828, -1131678690, 1041516082, -1118733319) + + W(7, -1122936235, 1015065790, 997649137, 1023538631); + sum2 = W(0, -1133976495, 1027343155, -1149877867, -1119506980) + + W(1, -1126385541, 1016526837, 994153115, -1140785051) + W(2, 1035891239, 1030599513, 1037590422, 1054189655) + + W(3, 1041308688, -1112736561, 1004824957, -1120347934) + + W(4, -1130801609, -1108453664, 1012747883, -1119322812) + + W(5, -1107379808, -1119223720, -1116360142, -1129452107) + + W(6, -1113698362, 1016406968, -1108226898, -1120928356) + + W(7, 1016225738, 988482485, 1018050885, -1117792638); + WS(-1113279936, 1066223903); + sum1 = + W(0, -1128171420, -1141738481, -1138940153, 1044160156) + W(1, 1020686276, -1129655596, 964173357, -1123239900) + + W(2, 1040261344, -1140107833, 1050703688, -1100167260) + + W(3, -1130335589, 1035637471, -1124525100, 1032644739) + + W(4, -1112013315, -1116929726, -1108200895, -1100730273) + + W(5, 1040782300, 1024316286, 1014134393, 1029624526) + W(6, -1123695998, -1154978689, -1123177006, 1034288823) + + W(7, -1141423761, -1114187043, 1013984857, -1108229911); + sum2 = W(0, -1115606620, -1125272644, -1099614716, -1080575150) + + W(1, -1102155153, -1122847678, -1123394906, -1129056732) + + W(2, 1021458196, 1017345212, 1047257730, 1068148121) + W(3, 1044966894, 1026244022, 1017049220, 1010161976) + + W(4, 1009639320, 1016051020, -1120838650, -1113655261) + + W(5, -1132238288, -1130782536, 967940860, 1004223696) + + W(6, -1131253088, -1143902384, 1020803060, 1032085971) + + W(7, 1016311348, -1137376840, -1137115752, -1136984808); + WS(1060545080, -1126581603); + sum1 = W(0, 1032630360, 1037657648, 1043836232, 1037448680) + W(1, 976149203, 1031833596, 1031675647, 1025282125) + + W(2, -1112268976, -1128752350, -1090205186, 1048595306) + + W(3, 1057651571, 1035187792, 1034806588, 1043419290) + W(4, 1045186906, 1032285712, 1053340438, -1094666759) + + W(5, -1082657749, -1092127852, -1104761760, -1096441814) + + W(6, -1125010622, 1029508223, -1108078856, 1041691860) + + W(7, 1042698525, 1040118132, 1033087420, 1034587656); + sum2 = W(0, -1123698886, -1126365381, -1135914762, -1121651762) + + W(1, -1118625490, -1122087574, -1147908244, -1134045690) + + W(2, 1034075649, 1026991402, 1019253181, 1047572688) + W(3, 1035108181, -1115886918, 1016718341, -1117034488) + + W(4, 998149095, -1118780236, 1023543366, 1038479879) + + W(5, -1114677625, 1011684618, -1132109957, -1137057610) + + W(6, -1113635181, -1168196508, -1114469118, -1145545780) + + W(7, 992781287, -1139655050, -1142844852, 1007905050); + WS(-1083899832, -1105526146); + sum1 = W(0, 1026357515, -1139718894, 1044187583, -1105573131) + + W(1, -1104526300, -1119529939, -1125768375, -1132776678) + + W(2, -1119744955, -1125720471, -1092285679, 1062437883) + + W(3, 1058460257, 1022150135, 1033366698, 1009731342) + W(4, -1117075907, -1106102943, 1048719011, 1052836221) + + W(5, -1089717563, -1123085499, -1114009838, -1112611206) + + W(6, -1111407198, -1152407445, -1107209883, -1107292779) + + W(7, -1122559055, -1119739267, -1119196243, -1129505495); + sum2 = W(0, -1110807022, -1129400032, -1105612607, -1123619892) + + W(1, -1131262448, 1016529300, -1129444600, -1136239801) + + W(2, 1025172792, -1117035240, 1035443403, -1135427545) + + W(3, -1111010692, -1115955576, -1117326476, -1121250556) + + W(4, 1033543849, 999654946, 1039345667, 1053020794) + W(5, 1047843748, -1135856481, 1022819536, 998047364) + + W(6, -1123816828, -1144812946, -1120747576, -1113498942) + + W(7, -1113301822, -1146605522, -1119691028, -1135792457); + WS(-1107513792, 1064663354); + sum1 = W(0, 1030862455, -1161118946, 1040244826, -1104300038) + + W(1, -1102940181, -1135077628, -1135539484, 1011863892) + + W(2, -1113532308, 1021510766, -1091621085, 1046262406) + + W(3, 1054782000, 1019068110, 1036941280, -1128724830) + W(4, 1032378968, -1127591630, 1051734861, 1034822530) + + W(5, -1095483267, 1031948820, -1172984259, -1120336759) + + W(6, -1123071015, 1009770420, -1107582956, -1108820108) + + W(7, -1125175670, 1025488559, -1126076542, 1036426604); + sum2 = + W(0, -1135206239, -1139065871, 1026230428, 1025917606) + W(1, 1027050280, 1013849783, 1016077019, -1127829351) + + W(2, -1140752647, -1123380440, 988696695, -1092786651) + W(3, 1049996339, 1057784826, 1033822297, 1034470972) + + W(4, 1022777359, 1021581075, -1122295168, -1085937537) + + W(5, 1032573953, -1130048007, 1032545188, -1137094527) + W(6, 974924014, -1133276463, 1029689087, -1140169471) + + W(7, -1135329695, -1124883951, 1011238415, 1001568686); + WS(1058918200, -1121082995); - sum1 = W(0, -1123354974, -1118620174, 1016130204, -1103968288) + W(1, -1101453425, -1117908518, -1122284590, -1122818124) + W(2, -1112248839, 1024662558, -1087068557, 1048182784) + W(3, 1059583965, -1119323982, 1027638054, -1137723992) + W(4, 1046299686, 1028038478, 1063313277, 1047279381) + W(5, -1088182320, 1034186247, -1124394588, 978245507) + W(6, -1143613552, -1129268360, -1103342192, -1115088511) + W(7, 1003350800, -1134684248, -1111377363, 1028117438); sum2 = W(0, -1162931039, -1136248556, -1115594515, -1119907402) + W(1, 1022791334, 1017500018, -1156766128, 1014782692) + W(2, -1131063526, -1131086728, -1128443230, 1044675527) + W(3, -1107588397, -1111169922, -1125594766, -1135599628) + W(4, 1029801649, 1031011705, 1042762789, 1050674207) + W(5, 1009001220, -1112569685, -1148613464, -1114139175) + W(6, -1117642655, -1128864654, -1107118398, -1113986381) + W(7, -1186206458, 1017255694, 993928432, 1007622876); WS(1038828992, 1041685264); - sum1 = W(0, -1114329248, 995958527, -1117673776, 1034401008) + W(1, 1038612842, 1035088196, 1008781376, 1029875310) + W(2, 1049950910, 1027336960, 1060640651, 1045782072) + W(3, -1098159517, -1106507532, -1124000392, -1105439902) + W(4, -1097681183, -1107326552, -1085831405, -1105157973) + W(5, 1053136924, 1032016120, 1023707152, 1034119968) + W(6, 1028668144, 1025858258, 1033402064, -1122828000) + W(7, -1110558370, -1113173980, 1012109856, -1114749520); sum2 = W(0, 1031315360, -1131767489, 1023637252, -1107869385) + W(1, -1107666272, -1117110288, -1124350185, -1110538107) + W(2, -1099468189, -1140834082, -1100127579, 1052854494) + W(3, 1034036134, 1024451620, 1003450083, 1041131277) + W(4, -1112139926, 1024287080, -1117241706, 1052996200) + W(5, 1027811452, 1027157968, -1131082337, 1035032776) + W(6, 1036663822, -1122285462, 1038018354, -1112496415) + W(7, -1110479054, -1112615559, 998992195, -1106762474); WS(-1086074680, 1053637716); - sum1 = W(0, -1121345387, -1148805338, -1136570733, 1049266593) + W(1, 1027081787, -1133439181, -1158465386, -1120818857) + W(2, 1042002951, -1165378922, 1052460699, -1094571489) + W(3, -1124281856, 1040734807, -1121708851, 1035650578) + W(4, -1113042450, -1115297518, -1107443934, -1098765182) + W(5, 1043313411, 1006695533, 1016359031, 1027853163) + W(6, -1121398619, 991217235, -1117268427, 1036113926) + W(7, -1136658365, -1112513138, 1021173351, -1106476275); sum2 = W(0, 1026517575, 1017334370, 1051558711, 1071692777) + W(1, 1049822619, 1020207734, 1022251878, 1019995718) + W(2, -1170492850, 1003954710, -1096673587, -1077357700) + W(3, -1098179385, 996694924, -1122577241, 1015494226) + W(4, -1138816415, -1132363566, -1136175651, -1098960792) + W(5, -1116986501, 1003290486, -1141894102, -1126828734) + W(6, -1143472678, 998846550, -1124275402, 1018703670) + W(7, 1007812651, 1007766851, 1009415395, -1163222937); WS(1051521136, 1027207116); - sum1 = W(0, -1122694020, -1121133108, -1102175837, -1116351908) + W(1, 1045518980, 1009393969, 1008379217, 1015772516) + W(2, 1010830545, -1124202632, 1057246783, 1026322980) + W(3, -1089509425, 1025178484, -1117338572, 1009646833) + W(4, -1124291704, 1037913146, -1093542759, 982577970) + W(5, 1055793637, -1118947636, 1001093793, 1001810977) + W(6, 1018062184, -1116091286, 1041281977, -1125394504) + W(7, 1008755233, -1127575032, 1015898776, -1121163492); sum2 = W(0, -1137495011, 1013616911, -1135578111, 1029346938) + W(1, 1017473747, 1012413655, -1133405571, 1008139351) + W(2, -1135527491, -1123650952, 1013443151, -1114797945) + W(3, -1122100892, -1128721387, -1166794345, -1156685818) + W(4, 1027730022, 1024465134, 1049128967, 1068130737) + W(5, 1046423571, -1143058109, 1020545683, -1126785325) + W(6, -1118108263, -1128775579, -1098008683, -1080443718) + W(7, -1101482344, -1137148015, -1128178767, 991435034); WS(1057767608, -1132080751); - sum1 = W(0, 1026028453, 1026017621, -1117947285, 1048679017) + W(1, 1025261389, 1011196341, 1015828970, 1025013027) + W(2, 1025766741, -1135552917, 1051769667, -1083959172) + W(3, -1120826122, 1045191525, 1028389741, 1039505775) + W(4, 1035118319, 1040474693, -1111744027, -1084413328) + W(5, 1049618505, -1110336171, 1028257397, -1123719333) + W(6, 1012106581, -1138611630, 1030333189, 1045191121) + W(7, -1122181545, 1030480605, 1027514349, 1020294666); sum2 = W(0, 1017587161, 1028118553, 1008167722, 1005112948) + W(1, -1125344655, 1015776789, -1148301500, -1138850406) + W(2, -1101123140, -1103020887, -1099714612, 1049070164) + W(3, 1032013714, 1022049457, 1009340114, -1167693540) + W(4, 1040188371, 1022642341, 1039093756, 1046164698) + W(5, -1111525569, -1098832696, -1115917000, -1103378287) + W(6, 988296658, 1010063898, 1026403646, 1033545355) + W(7, 1002132020, 1037334715, -1139728254, 1035581889); WS(-1099372256, -1088618788); - sum1 = W(0, -1112538182, -1113349022, -1103996671, 1024020908) + W(1, 1046614908, -1111225386, -1110537326, -1114146165) + W(2, 1048693927, 1033711782, 1064716592, -1143605597) + W(3, -1085173359, 1004694493, -1108087402, -1138402062) + W(4, -1112344546, -1129092599, -1086749016, 1044926535) + W(5, 1062252083, 1040479887, 1034104622, 1042110371) + W(6, -1109099742, -1110127398, 1032699126, -1121424940) + W(7, -1130166943, -1106709441, -1120726228, -1106064827); sum2 = W(0, 987083788, -1144106823, -1120467381, -1121977305) + W(1, -1118651341, -1162389292, -1152635694, 964510307) + W(2, 1013472954, -1131186779, -1139561796, 1044091298) + W(3, 1038343490, -1115306287, -1155962630, -1117365756) + W(4, -1120418118, -1122269098, 1038342084, 1042996066) + W(5, -1118476220, -1128689408, -1132569906, -1141833923) + W(6, 979955865, -1163904780, -1115615181, -1127292875) + W(7, -1123141745, 1014320394, -1135582470, 1008840046); WS(1041282784, 1044242623); - sum1 = W(0, -1119885764, -1119816052, -1100880653, -1113812594) + W(1, 1046531310, 1015358999, 1005085853, 1021011107) + W(2, -1171512555, -1121861252, 1057266723, 1010135439) + W(3, -1089952515, 1031135156, -1115226950, 1003139037) + W(4, 1003864029, 1040963149, -1094412795, -1118004569) + W(5, 1056310444, -1114099002, 1015234855, 992693307) + W(6, 1025494836, -1113504879, 1043843337, -1125989575) + W(7, -1156936827, -1122714492, 1003362397, -1120612644); sum2 = W(0, 1005317381, -1143827754, 1019060164, 1009279342) + W(1, 1014092605, -1131000233, 1012779564, -1137528453) + W(2, -1142619324, 1012902153, -1114788024, -1098688460) + W(3, -1120377499, 1017453102, -1139793504, -1147729078) + W(4, -1126266146, -1128784654, -1094218173, -1078812823) + W(5, -1099532818, 1007638067, -1130333980, 1018177647) + W(6, 1026462555, 1020893616, 1054132458, 1070492026) + W(7, 1048935725, 1011358224, 1015734963, 987943782); WS(1046635232, 1024078131); - sum1 = W(0, 1002735212, 1025138813, 1017042555, -1132524982) + W(1, 1031803657, 1033606155, 1021596219, 1015508823) + W(2, 1035063871, 1034039879, 1044122447, -1110416695) + W(3, -1092481954, -1094320024, -1107502027, -1103391009) + W(4, -1097977761, -1105608655, -1094991056, 1051547730) + W(5, 1050188814, 1047410847, 1031346589, 1046101811) + W(6, 1040314319, 1035664624, 1038536855, -1114843703) + W(7, 1003107468, 1019470987, 1021345835, -1136683190); sum2 = W(0, -1096475926, -1112281069, -1116645717, 1041647377) + W(1, -1113263240, 1023473494, -1117017643, 1039764966) + W(2, 1044036812, -1112231286, -1111398905, -1096068583) + W(3, 1026411348, -1114320784, -1138574198, -1104710548) + W(4, 1052862983, 1024115789, 1051331710, 1038036111) + W(5, 1042458641, 1028002558, 1037890580, -1106844581) + W(6, -1106234474, -1121785528, -1130292776, 1037359643) + W(7, -1111704128, -1123406807, -1109714921, 1041123403); WS(-1088554040, -1076674880); - sum1 = W(0, 1026292820, 1016736263, 1042339025, -1110236986) + W(1, -1103961368, 1016313655, -1151588920, 1014755782) + W(2, -1132973070, 1034501898, -1089525132, 1037427962) + W(3, 1056478885, -1118983748, 1038469390, -1123320716) + W(4, -1144171612, -1110973538, 1052671191, -1123890785) + W(5, -1092344862, 1041641985, 1010979982, 1017396903) + W(6, -1130131975, 1028857234, -1108906970, -1112145786) + W(7, 1002874044, 1025897228, -1130905399, 1033705562); sum2 = W(0, 1013915195, 1007730851, 981970521, 1028189234) + W(1, -1121038101, -1142484934, -1146368902, 1010322539) + W(2, -1133182691, 1024414743, -1111248658, 1040952978) + W(3, -1109339192, -1094377458, -1116592821, -1112421528) + W(4, -1127318198, -1121307593, 1035588225, 1057294107) + W(5, -1107404728, 1024397525, -1118541421, 1019759378) + W(6, 1020584890, 1005058566, -1124411850, 1029625115) + W(7, 1026110889, 1023925523, -1140327971, -1199698720); WS(1063581112, 1015292283); - sum1 = W(0, -1123806598, -1124445804, 1036776315, -1112186771) + W(1, -1102837698, -1117642958, -1137018200, 1010580432) + W(2, -1125096044, 1037634467, -1083793455, -1098422117) + W(3, 1058965073, -1106625757, 1036181095, -1127761788) + W(4, 1046804719, 1028314614, 1064148787, 1034155462) + W(5, -1089226130, 1037373467, 994321759, 1021285644) + W(6, -1117498166, 1006823135, -1106689849, 1004978479) + W(7, 1033810693, 1029436414, -1119765454, 1034713459); sum2 = W(0, -1127012521, -1129458054, -1134632819, -1113739078) + W(1, -1106078947, -1115241196, -1122814807, -1119046895) + W(2, -1110373665, -1122115974, -1118435057, 1041258512) + W(3, 1025961773, 1041055451, 1025056413, 1029845331) + W(4, -1121983257, -1121551577, -1107711610, 1043546644) + W(5, 1048226293, -1131486243, -1139476701, 1018415015) + W(6, 1021812843, 1015201109, 1039413537, -1127386873) + W(7, -1110385416, -1135801459, -1132245806, -1140149017); WS(-1109010880, -1087548956); - sum1 = W(0, 1034947768, 1034343312, 1016751552, 1019661856) + W(1, -1126501287, 1017025648, 1030724160, -1140792121) + W(2, -1095012676, -1102610188, -1096454908, -1091443170) + W(3, -1131030249, 1042942296, 1019936112, 1024647464) + W(4, 1046023882, 1039446704, 1042564604, -1105694067) + W(5, 1044246468, -1103700296, -1141422594, -1107855416) + W(6, 1029737824, 1025692706, 1038373096, 1039271048) + W(7, 1012879825, 1041317114, 1029263800, 1041193844); sum2 = W(0, 1034034732, -1113997103, 1028771217, 1025456143) + W(1, 1035315492, -1102403849, 1018212015, -1099438501) + W(2, -1107522705, -1121503695, -1114143244, -1105773446) + W(3, -1109746606, -1106040358, -1106459627, 1039219872) + W(4, -1105460279, 1038975878, 1032873918, 1059420344) + W(5, 1040681265, 1046039582, 1026290649, 1046943722) + W(6, 1021740679, -1112744336, -1121564954, 1024971971) + W(7, -1122379806, -1106873869, -1130313815, -1105420350); WS(-1086299832, -1077288694); - sum1 = W(0, 1021716686, -1132921948, -1113901292, -1108835908) + W(1, 1023078294, 965138311, 998651320, -1130194922) + W(2, -1099039878, -1108540692, -1158126306, 1055092577) + W(3, -1089051407, -1113759276, -1107695832, -1113503632) + W(4, -1111509136, 1021468846, -1096197083, 1062013047) + W(5, 1050708993, 1022391342, -1133490396, 991635057) + W(6, 1039618828, -1131678690, 1041516082, -1118733319) + W(7, -1122936235, 1015065790, 997649137, 1023538631); sum2 = W(0, -1133976495, 1027343155, -1149877867, -1119506980) + W(1, -1126385541, 1016526837, 994153115, -1140785051) + W(2, 1035891239, 1030599513, 1037590422, 1054189655) + W(3, 1041308688, -1112736561, 1004824957, -1120347934) + W(4, -1130801609, -1108453664, 1012747883, -1119322812) + W(5, -1107379808, -1119223720, -1116360142, -1129452107) + W(6, -1113698362, 1016406968, -1108226898, -1120928356) + W(7, 1016225738, 988482485, 1018050885, -1117792638); WS(-1113279936, 1066223903); - sum1 = W(0, -1128171420, -1141738481, -1138940153, 1044160156) + W(1, 1020686276, -1129655596, 964173357, -1123239900) + W(2, 1040261344, -1140107833, 1050703688, -1100167260) + W(3, -1130335589, 1035637471, -1124525100, 1032644739) + W(4, -1112013315, -1116929726, -1108200895, -1100730273) + W(5, 1040782300, 1024316286, 1014134393, 1029624526) + W(6, -1123695998, -1154978689, -1123177006, 1034288823) + W(7, -1141423761, -1114187043, 1013984857, -1108229911); sum2 = W(0, -1115606620, -1125272644, -1099614716, -1080575150) + W(1, -1102155153, -1122847678, -1123394906, -1129056732) + W(2, 1021458196, 1017345212, 1047257730, 1068148121) + W(3, 1044966894, 1026244022, 1017049220, 1010161976) + W(4, 1009639320, 1016051020, -1120838650, -1113655261) + W(5, -1132238288, -1130782536, 967940860, 1004223696) + W(6, -1131253088, -1143902384, 1020803060, 1032085971) + W(7, 1016311348, -1137376840, -1137115752, -1136984808); WS(1060545080, -1126581603); - sum1 = W(0, 1032630360, 1037657648, 1043836232, 1037448680) + W(1, 976149203, 1031833596, 1031675647, 1025282125) + W(2, -1112268976, -1128752350, -1090205186, 1048595306) + W(3, 1057651571, 1035187792, 1034806588, 1043419290) + W(4, 1045186906, 1032285712, 1053340438, -1094666759) + W(5, -1082657749, -1092127852, -1104761760, -1096441814) + W(6, -1125010622, 1029508223, -1108078856, 1041691860) + W(7, 1042698525, 1040118132, 1033087420, 1034587656); sum2 = W(0, -1123698886, -1126365381, -1135914762, -1121651762) + W(1, -1118625490, -1122087574, -1147908244, -1134045690) + W(2, 1034075649, 1026991402, 1019253181, 1047572688) + W(3, 1035108181, -1115886918, 1016718341, -1117034488) + W(4, 998149095, -1118780236, 1023543366, 1038479879) + W(5, -1114677625, 1011684618, -1132109957, -1137057610) + W(6, -1113635181, -1168196508, -1114469118, -1145545780) + W(7, 992781287, -1139655050, -1142844852, 1007905050); WS(-1083899832, -1105526146); - sum1 = W(0, 1026357515, -1139718894, 1044187583, -1105573131) + W(1, -1104526300, -1119529939, -1125768375, -1132776678) + W(2, -1119744955, -1125720471, -1092285679, 1062437883) + W(3, 1058460257, 1022150135, 1033366698, 1009731342) + W(4, -1117075907, -1106102943, 1048719011, 1052836221) + W(5, -1089717563, -1123085499, -1114009838, -1112611206) + W(6, -1111407198, -1152407445, -1107209883, -1107292779) + W(7, -1122559055, -1119739267, -1119196243, -1129505495); sum2 = W(0, -1110807022, -1129400032, -1105612607, -1123619892) + W(1, -1131262448, 1016529300, -1129444600, -1136239801) + W(2, 1025172792, -1117035240, 1035443403, -1135427545) + W(3, -1111010692, -1115955576, -1117326476, -1121250556) + W(4, 1033543849, 999654946, 1039345667, 1053020794) + W(5, 1047843748, -1135856481, 1022819536, 998047364) + W(6, -1123816828, -1144812946, -1120747576, -1113498942) + W(7, -1113301822, -1146605522, -1119691028, -1135792457); WS(-1107513792, 1064663354); - sum1 = W(0, 1030862455, -1161118946, 1040244826, -1104300038) + W(1, -1102940181, -1135077628, -1135539484, 1011863892) + W(2, -1113532308, 1021510766, -1091621085, 1046262406) + W(3, 1054782000, 1019068110, 1036941280, -1128724830) + W(4, 1032378968, -1127591630, 1051734861, 1034822530) + W(5, -1095483267, 1031948820, -1172984259, -1120336759) + W(6, -1123071015, 1009770420, -1107582956, -1108820108) + W(7, -1125175670, 1025488559, -1126076542, 1036426604); sum2 = W(0, -1135206239, -1139065871, 1026230428, 1025917606) + W(1, 1027050280, 1013849783, 1016077019, -1127829351) + W(2, -1140752647, -1123380440, 988696695, -1092786651) + W(3, 1049996339, 1057784826, 1033822297, 1034470972) + W(4, 1022777359, 1021581075, -1122295168, -1085937537) + W(5, 1032573953, -1130048007, 1032545188, -1137094527) + W(6, 974924014, -1133276463, 1029689087, -1140169471) + W(7, -1135329695, -1124883951, 1011238415, 1001568686); WS(1058918200, -1121082995); return clamp(mstd0 + 5.0 * vsum / wsum * mstd1, 0.0, 1.0); } -const static float2x3 rgb2uv = { - -0.169, -0.331, 0.5, - 0.5, -0.419, -0.081 -}; +shared float inp[525]; -const static float3x3 yuv2rgb = { - 1, -0.00093, 1.401687, - 1, -0.3437, -0.71417, - 1, 1.77216, 0.00099 -}; +#define CURRENT_PASS 2 -groupshared float inp[525]; +#define GET_SAMPLE(x) dot(x.rgb, rgb2y) +#define imageStore(out_image, pos, val) imageStoreOverride(pos, val.x) +void imageStoreOverride(uint2 pos, float value) { + float2 UV = mul(rgb2uv, INPUT.SampleLevel(sam_INPUT_LINEAR, HOOKED_map(pos), 0).rgb); + OUTPUT[pos] = float4(mul(yuv2rgb, float3(value.x, UV)), 1.0); +} -void Pass2(uint2 blockStart, uint3 threadId) { - const float2 inputPt = GetInputPt(); - const float2 outputPt = GetOutputPt(); +#define INPUT_tex(pos) GET_SAMPLE(vec4(texture(INPUT, pos))) +static const float2 INPUT_size = float2(GetInputSize()); +static const float2 INPUT_pt = float2(GetInputPt()); - const uint2 group_base = uint2(blockStart.x >> 1, blockStart.y); - for (int id = threadId.x * MP_NUM_THREADS_Y + threadId.y; id < 525; id += MP_NUM_THREADS_X * MP_NUM_THREADS_Y) { - uint x = (uint)id / 15, y = (uint)id % 15; - inp[id] = tex1.SampleLevel(sam, inputPt * float2(group_base.x + x - 1 + 0.5, (group_base.y + y - 3 + 0.5) * 0.5), 0).r; - } +#define temp_tex(pos) (float(texture(temp, pos).x)) +static const float2 temp_size = float2(GetInputSize().x * 1, GetInputSize().y * 2); +static const float2 temp_pt = float2(1.0 / (temp_size.x), 1.0 / (temp_size.y)); - GroupMemoryBarrierWithGroupSync(); +#define HOOKED_tex(pos) temp_tex(pos) +#define HOOKED_size temp_size +#define HOOKED_pt temp_pt - uint2 destPos = blockStart + uint2(threadId.x * 2, threadId.y); - if (!CheckViewport(destPos)) { - return; - } - - float4 ret = 0.0; - float4 ret0 = 0.0; - float4 samples[8]; - const uint local_pos = threadId.x * 15 + threadId.y; - [unroll] - for (int i = 0; i < 8; ++i) { - [unroll] - for (int j = 0; j < 4; ++j) { - samples[i][j] = inp[local_pos + (i / 2) * 15 + (i % 2) * 4 + j]; - } +void Pass2(uint2 blockStart, uint3 threadId) { + ivec2 group_base = ivec2(gl_WorkGroupID) * ivec2(gl_WorkGroupSize); + int local_pos = int(gl_LocalInvocationID.x) * 15 + int(gl_LocalInvocationID.y); + for (int id = int(gl_LocalInvocationIndex); id < 525; id += int(gl_WorkGroupSize.x * gl_WorkGroupSize.y)) { + uint x = (uint)id / 15, y = (uint)id % 15; + inp[id] = + HOOKED_tex(HOOKED_pt * vec2(float(group_base.x + x - (1)) + 0.5, float(group_base.y + y - (3)) + 0.5)).x; } - - float2 originUV = mul(rgb2uv, INPUT.SampleLevel(sam1, (destPos + 0.5f) * outputPt, 0).rgb); - WriteToOutput(destPos, mul(yuv2rgb, float3(samples[2][3], originUV))); - - ++destPos.x; - if (!CheckViewport(destPos)) { + barrier(); + vec4 ret = vec4(0.0, 0.0, 0.0, 0.0); + vec4 ret0 = vec4(0.0, 0.0, 0.0, 0.0); + vec4 samples[8]; + samples[0][0] = inp[local_pos + 0]; + samples[0][1] = inp[local_pos + 1]; + samples[0][2] = inp[local_pos + 2]; + samples[0][3] = inp[local_pos + 3]; + samples[1][0] = inp[local_pos + 4]; + samples[1][1] = inp[local_pos + 5]; + samples[1][2] = inp[local_pos + 6]; + samples[1][3] = inp[local_pos + 7]; + samples[2][0] = inp[local_pos + 15]; + samples[2][1] = inp[local_pos + 16]; + samples[2][2] = inp[local_pos + 17]; + samples[2][3] = inp[local_pos + 18]; + samples[3][0] = inp[local_pos + 19]; + samples[3][1] = inp[local_pos + 20]; + samples[3][2] = inp[local_pos + 21]; + samples[3][3] = inp[local_pos + 22]; + samples[4][0] = inp[local_pos + 30]; + samples[4][1] = inp[local_pos + 31]; + samples[4][2] = inp[local_pos + 32]; + samples[4][3] = inp[local_pos + 33]; + samples[5][0] = inp[local_pos + 34]; + samples[5][1] = inp[local_pos + 35]; + samples[5][2] = inp[local_pos + 36]; + samples[5][3] = inp[local_pos + 37]; + samples[6][0] = inp[local_pos + 45]; + samples[6][1] = inp[local_pos + 46]; + samples[6][2] = inp[local_pos + 47]; + samples[6][3] = inp[local_pos + 48]; + samples[7][0] = inp[local_pos + 49]; + samples[7][1] = inp[local_pos + 50]; + samples[7][2] = inp[local_pos + 51]; + samples[7][3] = inp[local_pos + 52]; + ret[0] = nnedi3(samples); + ret0[0] = inp[local_pos + 18]; +#if CURRENT_PASS == LAST_PASS + uint2 destPos = blockStart + threadId.xy * 2; + uint2 outputSize = GetOutputSize(); + if (destPos.x >= outputSize.x || destPos.y >= outputSize.y) { return; } - - originUV = mul(rgb2uv, INPUT.SampleLevel(sam1, (destPos + 0.5f) * outputPt, 0).rgb); - WriteToOutput(destPos, mul(yuv2rgb, float3(nnedi3(samples), originUV))); +#endif + imageStore(out_image, ivec2(gl_GlobalInvocationID) * ivec2(2, 1), ret0); + imageStore(out_image, ivec2(gl_GlobalInvocationID) * ivec2(2, 1) + ivec2(1, 0), ret); } diff --git a/src/Effects/NNEDI3/NNEDI3_nns16_win8x6.hlsl b/src/Effects/NNEDI3/NNEDI3_nns16_win8x6.hlsl new file mode 100644 index 000000000..a52b77a07 --- /dev/null +++ b/src/Effects/NNEDI3/NNEDI3_nns16_win8x6.hlsl @@ -0,0 +1,953 @@ +// This file is generated by the scripts available at https://github.com/hauuau/magpie-prescalers +// Please don't edit this file directly. +// Generated by: nnedi3.py --nns 16 --win 8x6 --use-compute-shader --use-magpie +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +//!MAGPIE EFFECT +//!VERSION 4 +//!SORT_NAME NNEDI3_016_6 + +//!TEXTURE +Texture2D INPUT; + +//!SAMPLER +//!FILTER POINT +SamplerState sam_INPUT; + +//!TEXTURE +//!WIDTH INPUT_WIDTH * 1 * 2 +//!HEIGHT INPUT_HEIGHT * 2 * 1 +Texture2D OUTPUT; + +//!SAMPLER +//!FILTER LINEAR +SamplerState sam_INPUT_LINEAR; + +//!TEXTURE +//!FORMAT R16_FLOAT +//!WIDTH INPUT_WIDTH * 1 +//!HEIGHT INPUT_HEIGHT * 2 +Texture2D temp; + +//!SAMPLER +//!FILTER POINT +SamplerState sam_temp; + +//!COMMON +#include "prescalers.hlsli" + +#define LAST_PASS 2 + +//!PASS 1 +//!DESC NNEDI3 (double_y, nns16, win8x6) +//!IN INPUT +//!OUT temp +//!BLOCK_SIZE 32, 16 +//!NUM_THREADS 32, 8 +#pragma optionNV(inline none) +float nnedi3(vec4 samples[12]) { + float sum = 0.0, sumsq = 0.0; + [unroll] for (int i = 0; i < 12; i++) { + sum += dot(samples[i], vec4(1.0, 1.0, 1.0, 1.0)); + sumsq += dot(samples[i], samples[i]); + } + float mstd0 = sum / 48.0; + float mstd1 = sumsq / 48.0 - mstd0 * mstd0; + float mstd2 = mix(0.0, inversesqrt(mstd1), mstd1 >= 1.192092896e-7); + mstd1 *= mstd2; + float vsum = 0.0, wsum = 0.0, sum1, sum2; +#define T(x) intBitsToFloat(x) +#define W(i, w0, w1, w2, w3) dot(samples[i], vec4(T(w0), T(w1), T(w2), T(w3))) +#define WS(w0, w1) \ + sum1 = exp(sum1 * mstd2 + T(w0)); \ + sum2 = sum2 * mstd2 + T(w1); \ + wsum += sum1; \ + vsum += sum1 * (sum2 / (1.0 + abs(sum2))); + sum1 = + W(0, -1126897990, 1027745880, 1024250604, 1024642508) + W(1, -1121959908, -1149906049, -1130469888, -1121396864) + + W(2, 1039079928, -1107295041, -1147395201, -1126556538) + + W(3, -1113607518, 1041026790, 1022159130, 1044630722) + W(4, -1107136294, 1005058137, -1116173177, 1042195560) + + W(5, -1098313415, 999141354, 1019497054, 1007702352) + W(6, 1015526727, 1018714920, 1042189511, -1106681307) + + W(7, 1035880216, -1121374916, -1133977224, 1026239260) + + W(8, -1106606352, 1038936227, -1124106064, 1025050132) + W(9, 990390561, -1131068140, 1013770942, -1122507740) + + W(10, -1136584888, -1135809122, -1122292152, 1015308851) + + W(11, -1122039043, 1031978820, -1116330759, 1018900008); + sum2 = W(0, 1017133506, 1011515348, -1139818306, -1123730089) + W(1, 996184056, -1138856554, 1023321012, 1029416248) + + W(2, -1115999672, 1020129658, 1015618084, 1007066512) + + W(3, -1119553894, 1057587887, -1090489276, -1109933138) + + W(4, 1016266760, -1145378916, -1112177411, 1071604647) + + W(5, -1079392139, -1097028615, 1028448562, 1008681896) + + W(6, -1165256880, 1051025857, -1098617840, -1105405946) + + W(7, -1155286464, 1000343320, -1133574805, 1035052104) + + W(8, -1139515542, -1135392452, -1138601606, 991053648) + + W(9, 1020043526, 1010374724, -1121583660, -1142174380) + + W(10, 997185888, -1155288808, -1135761830, 1018728192) + + W(11, 1024878156, 1002597928, -1131188096, -1132781834); + WS(1018288640, 1027735986); + sum1 = + W(0, 1012158232, -1178449286, 1044498160, -1128542910) + W(1, -1115962871, 1002517720, 1006778572, -1114624234) + + W(2, 1032943202, 1027108853, 1017365062, 964628492) + W(3, 1025063871, -1104570115, 1059928494, -1088743921) + + W(4, 1032615126, -1134936888, -1156175041, 1028919475) + + W(5, -1097612337, -1106124541, 1026836706, -1146238776) + + W(6, 1010747802, 1034856692, -1085331503, 1059914122) + + W(7, -1114177498, 1020458158, -1140348884, -1127457566) + + W(8, 1031833306, 1032056909, -1122073627, 1016604174) + W(9, 1020162890, -1122825993, -1119592595, 1033999672) + + W(10, 1022377282, 998219705, -1172026051, -1115773453) + + W(11, 1038136595, 1027508251, -1129465364, 1023799671); + sum2 = + W(0, -1126840972, -1130460798, 1019075916, 1017322604) + W(1, -1131054760, -1131047996, -1145399745, 985194115) + + W(2, -1120812206, -1129997452, 1006903064, -1143360737) + + W(3, -1139273136, -1112997847, -1139625904, 1042717692) + + W(4, -1114175000, -1130986946, 991527106, -1120456092) + W(5, 1043975251, 1051048254, -1113881740, 1007107280) + + W(6, -1135317632, 1001121889, -1150833602, -1121880440) + + W(7, 978663174, -1143215153, -1139461992, 1017866680) + + W(8, -1128878392, -1112673669, 1026044394, -1125685806) + + W(9, -1129486378, 1006765920, -1133504840, -1126929736) + + W(10, 1014584312, -1144361281, 995542402, 1000306721) + + W(11, -1142139489, -1114488494, 1007041936, -1134951296); + WS(1042433344, -1111851638); + sum1 = W(0, -1128612156, -1112658226, -1119638967, 1043958886) + + W(1, -1120465263, -1128976934, -1139940268, -1123380939) + + W(2, -1126908022, 1033805831, -1115346894, -1142120768) + + W(3, -1122042583, -1128727592, -1097703246, 1057665642) + + W(4, -1104545545, 1005565040, 984858240, -1107767030) + + W(5, 1052387104, 1046318672, -1108167869, -1148354296) + + W(6, 999630836, -1114896432, 1054789077, -1095395475) + + W(7, 1029397739, -1133849404, -1146630760, -1115281716) + + W(8, 1030603948, -1117224401, -1163176544, -1117808895) + + W(9, -1126512698, -1129996802, 1028419819, -1123618471) + + W(10, -1117439993, 1013349902, 996431920, -1123547845) + + W(11, 1026334318, -1113258842, -1134051464, -1120421311); + sum2 = + W(0, 1022431497, -1109389142, 1004613154, 1028727631) + W(1, 1029503922, -1132574761, -1132240188, -1119299282) + + W(2, -1139248009, -1129989652, -1140046689, -1114039002) + + W(3, 1024165374, -1107432916, 1041447926, 1047487962) + W(4, 1017218352, -1135952741, -1114822837, 1044244351) + + W(5, -1108646182, -1100679909, 1040665470, -1123756570) + + W(6, -1120729932, 1031006195, 1047688354, -1126089152) + + W(7, -1120804126, -1148002498, -1124855948, 983982854) + W(8, 1009435309, 1033956847, -1107003694, 1028342876) + + W(9, -1126342960, -1158996358, -1122846542, -1123334894) + + W(10, -1140927562, -1117057946, -1128289576, -1121099750) + + W(11, 1036127241, 1039673953, -1102421772, 1026336008); + WS(1015433728, 1058400049); + sum1 = + W(0, -1139873791, 1031161269, -1113693508, 1033801204) + W(1, -1119172737, -1143910182, -1133909491, 1032977294) + + W(2, -1112917766, -1131731326, 989007258, 1019358132) + W(3, 1023506921, -1116372870, -1116140698, 1045725159) + + W(4, -1122523445, 1008313039, -1230944644, 1035249566) + + W(5, -1103376612, -1102794347, 1044071755, -1115540344) + + W(6, -1118840528, -1120831281, 1044830734, -1116748777) + + W(7, 1030473357, -1126204226, 1028378783, -1114963068) + + W(8, -1141442286, 1032646513, 1018738506, -1118552369) + + W(9, -1121050287, 1032892305, 1023234585, -1112562780) + + W(10, 1021910870, 1016154651, 1033465034, -1105610222) + + W(11, 1034039600, 1030129285, -1122899972, -1124368226); + sum2 = W(0, -1138428449, -1158711528, -1124467432, -1140697417) + + W(1, 1030243467, 1012442941, 992976916, 1013039401) + W(2, -1130455464, -1123518198, 1033499227, 975746961) + + W(3, -1142924106, -1128734961, -1113146735, -1099387353) + + W(4, 1051222006, -1122081826, 976851025, 1036130613) + + W(5, -1097860430, -1077268149, 1072898808, -1117904739) + + W(6, 989093448, 1010050489, -1108810723, -1091225653) + W(7, 1056060393, -1131990027, 997652548, -1137359275) + + W(8, -1122996798, 1032494444, 1025590581, 951236744) + W(9, -1153131756, 990210276, -1140348735, -1115493835) + + W(10, 1025171621, 1006284898, -1134977059, -1138876101) + + W(11, -1127238416, 1018469149, 1026307569, -1146863422); + WS(-1143089152, 1030017260); + sum1 = + W(0, 1012276081, -1116644609, 1019444907, -1124688427) + W(1, 1029853709, -1130860131, 1001605962, -1127223379) + + W(2, -1119160665, 1035777366, -1136557285, -1130309965) + + W(3, 1024406997, -1109637089, 1048989101, -1098625404) + + W(4, 1038057505, -1130883561, -1155861797, -1115433381) + + W(5, 1044433671, 1006101820, -1111190908, 1009046005) + W(6, -1155627981, 1036571679, -1098184025, 1048780603) + + W(7, -1112291813, 1025361773, -1122534699, 1028189701) + + W(8, 1039597237, -1104960796, -1130076067, 1018788475) + + W(9, 1018348791, -1126280255, -1117935161, 1029641477) + + W(10, 1012573277, -1125993892, -1120990241, 1036379833) + + W(11, -1136463217, -1111599465, -1154886405, 1020397819); + sum2 = W(0, -1153319600, 1008405084, -1118973116, -1140784820) + + W(1, 1012585128, 1010769460, -1147284080, 985822624) + W(2, 1010505984, -1129308604, 1021293048, 1001814848) + + W(3, 1008968960, -1142311064, -1101248908, 1037448945) + W(4, 1024969278, -1160749952, 995456320, 1022276922) + + W(5, -1089187936, 1057794596, 1033366347, -1123619202) + + W(6, -1140178660, -1140411728, -1109859050, 1029773785) + + W(7, 1024400778, -1136545168, -1146954776, 1005012008) + W(8, 1017518401, 1015531414, 1007802556, 1000322872) + + W(9, -1142030464, 1003782736, 982409184, 974134143) + W(10, 1003482728, -1152799248, -1170856127, 1006946188) + + W(11, 995727232, 960534268, 1009923956, 985284128); + WS(1064472528, -1121594920); + sum1 = + W(0, -1142654991, 1027230343, -1112807213, 1027061019) + W(1, -1128825126, -1164359388, -1143599223, 1032290711) + + W(2, -1113392623, 1016010466, 991342574, 1014490160) + W(3, 1014568428, -1136037408, -1115590690, 1034098395) + + W(4, 1008695068, -1148094031, 1010500896, 1002050167) + + W(5, -1113734161, -1112872467, 1027642302, -1127829894) + + W(6, -1124387333, -1122938499, 1038834309, -1130883382) + + W(7, 1013984188, -1138058188, 1020884834, -1120250507) + W(8, 1029912912, 1015162858, 1015817710, -1124941766) + + W(9, -1131205634, 1025589157, 1019867389, -1123484555) + + W(10, 1015459258, 1008886302, 1026841191, -1110863224) + + W(11, 1031947569, 1019435182, -1129521612, -1130075526); + sum2 = + W(0, 1003807591, -1154115373, 1000124719, 1017182228) + W(1, -1126980607, -1130234859, -1147429191, -1139843175) + + W(2, 1001833687, 1024488826, -1116401990, 987658746) + W(3, 1002635095, 1018649088, 1008095031, 1040714709) + + W(4, -1105844805, 1013729967, -1132089351, 1016729308) + + W(5, -1105992985, 1063780536, -1085442794, 1024604622) + W(6, -1147602519, 1024344696, 1014141127, 1047200342) + + W(7, -1101306502, 995366957, -1151072125, -1155997437) + + W(8, -1132427785, 1020609216, -1122913939, -1147894927) + W(9, 964968041, 1001714367, -1141957575, 1023684454) + + W(10, -1125194898, -1146690231, 1011860423, -1141691791) + + W(11, -1139390003, 1017456200, -1128761080, -1146063807); + WS(1061878800, -1131153991); + sum1 = + W(0, -1123872727, 1015115512, -1099302516, 1041224340) + W(1, -1144166978, -1171049230, 1018625288, 1031144036) + + W(2, -1102371221, 1009910425, 1014687697, 1022902338) + W(3, -1127640224, 1036357847, -1085394744, 1052022073) + + W(4, -1115552350, -1132534141, 1026350045, -1108974562) + + W(5, 1059569738, 1058525661, -1125187302, 1016189168) + W(6, 1013916191, -1107191102, 1050617832, -1088226291) + + W(7, 1037730450, -1123531112, 1018183052, 1006433282) + W(8, 1032504563, -1097316565, 1040234099, -1127405808) + + W(9, -1145362866, 1014427177, 1031877738, -1109508096) + W(10, 1015825508, 1018548825, 1016048056, 1026198990) + + W(11, 1033421596, -1098228398, 1035235966, -1137247201); + sum2 = W(0, -1131301730, 1031269327, -1127010401, -1109842974) + + W(1, -1181736700, -1180777340, 973798558, -1131640108) + + W(2, 1028981651, -1125259759, -1167651134, -1160957999) + + W(3, -1127780866, 1013454096, -1149526184, -1113692773) + + W(4, -1123287814, 993986728, 1013478572, -1109509101) + W(5, 1051779317, 1047088883, -1109788940, 1020962386) + + W(6, -1160424319, -1117315078, 1028380081, -1134194124) + + W(7, -1115287133, -1136947718, -1135840779, -1131160392) + + W(8, -1137527992, 1028175261, -1121515979, -1138138790) + + W(9, -1164912671, -1145619912, 998238336, 1018886164) + + W(10, -1125209194, -1152989064, -1138738786, -1127332243) + + W(11, -1148504424, 1027237057, -1142455024, -1123011340); + WS(-1146021888, 1053974589); + sum1 = + W(0, 1029642476, -1119368753, 1042969521, -1095098901) + W(1, 1046685039, 984849429, 1013890275, -1134074211) + + W(2, 1042359026, -1107285127, 1031018217, -1135393367) + + W(3, -1176939092, 1007708103, 1045769551, -1096985546) + W(4, 1036262392, -1139413615, 1022266947, 1017736689) + + W(5, -1101301107, 1034918881, 1003810877, 1024875117) + W(6, -1146466657, 1027345005, -1094644679, 1050538529) + + W(7, -1120828825, -1172526890, 1004183253, 1032510570) + W(8, -1091538585, 1051699648, 1011534979, 1017671961) + + W(9, -1160650069, 1019378973, -1107179580, 1036824506) + + W(10, -1133351451, -1160823333, -1127783457, 1031489314) + + W(11, -1095508207, 1048776768, 1035618600, 1006585957); + sum2 = W(0, 1031363252, -1091101506, 1048232756, 1057852755) + W(1, -1095952784, 1016290300, 1030774484, 1001500224) + + W(2, -1110436898, -1132290932, -1131305343, -1126601761) + + W(3, 1015165558, -1110787951, 1016237906, 1043794074) + W(4, -1113356328, 1003743696, 1007437656, 965388167) + + W(5, 1014973676, 1047525730, -1152923833, 1022650220) + W(6, 1020087968, 1003188992, -1123006886, 1011818344) + + W(7, -1111245491, 1021501454, -1158035650, 1041338676) + + W(8, -1105090874, -1129296549, -1131940021, 1017537464) + + W(9, -1137051446, -1134903850, -1123217223, 1034851396) + + W(10, -1117639196, -1133259176, 1018262350, 1033269727) + + W(11, -1104724635, -1106365430, 1024945328, 1019937714); + WS(-1077057896, -1083600334); + sum1 = W(0, 1017420011, 1011471785, 1029223422, -1116040414) + W(1, 1017123181, 1016511669, 1014201033, 1019976613) + + W(2, -1126437509, 1015478313, 1024110818, -1167731667) + + W(3, 1017846781, -1138042285, 1049638570, -1103217262) + W(4, 1023111893, 1009386661, 999765850, 1040273597) + + W(5, -1090770241, -1087230893, 1030676769, 1023090125) + + W(6, -1162024122, 1016487629, 1029091694, 1046437488) + W(7, -1112046985, 1020460717, 985808522, 1027730222) + + W(8, 1037672698, 1024768280, -1120839802, 1025489318) + W(9, 1019153993, 1010855969, 1027546578, 1028909230) + + W(10, 1023955584, -1134545259, 1011766057, 1025127228) + + W(11, 1025680213, 1017109109, -1128064723, 1027741830); + sum2 = + W(0, 1023774756, -1107003878, 1020767940, -1118294055) + W(1, -1113997093, 1021408408, -1152708847, 1013240776) + + W(2, -1108605887, -1128830540, -1139588328, -1119578529) + + W(3, 1005727232, -1108761818, 1050907301, -1097736561) + + W(4, 1032528025, -1135972104, -1128030280, 1032847770) + W(5, 1058054639, 1008347200, 1039669350, -1131826954) + + W(6, 1004577664, 1024878510, -1106188814, 1049418167) + W(7, -1108856812, 999382680, -1116453887, -1129071264) + + W(8, 1040942692, -1105809360, -1104688291, 1019392776) + + W(9, 1020705336, -1124253692, -1115446820, 1014050712) + + W(10, 1018266740, -1117167612, -1127775332, -1114566712) + + W(11, 1042743894, -1132221182, -1103534695, 1022204104); + WS(1034686080, -1080904524); + sum1 = + W(0, -1139332721, 1025190657, -1143163562, 1041601261) + W(1, 1024768205, -1137907141, -1156631187, 1024127465) + + W(2, 1040892278, 1028605547, -1129308018, 1012089369) + W(3, 1023562901, 1006799241, -1104914606, 1052908885) + + W(4, -1117860929, 1019594656, 1011454089, -1145135178) + + W(5, -1089193318, -1091833281, 1036300940, -1143330794) + + W(6, 1009225011, -1129417722, 1043909393, -1103073573) + W(7, 1040987970, 992909011, 1012327853, 1017495114) + + W(8, -1119873834, 1025246703, 1033652713, -1123933213) + + W(9, 1010687981, 1027561839, -1136185891, -1124345098) + W(10, 1024209623, 1018355139, 1010798725, 1010795083) + + W(11, -1118482716, 1032670633, 1027144528, -1123266333); + sum2 = + W(0, 998154484, -1124228589, -1132108902, -1115676434) + W(1, -1123985162, 1004957466, -1136847690, 1028193069) + + W(2, -1123281782, -1123302060, -1132306691, 1011392625) + + W(3, -1120010648, 1043298286, -1097765474, 1027211577) + + W(4, -1114822183, -1127542967, -1145824866, -1115567961) + + W(5, 1059221182, 1034703777, -1131429597, 1022587458) + W(6, 1015307650, -1106126812, 1048600788, -1099334080) + + W(7, 1029215805, -1127163397, 994166396, -1111174068) + W(8, -1130476352, 1015056080, 1023836215, -1122559367) + + W(9, 1000606426, -1128437454, 1026255089, -1137618020) + + W(10, -1127893362, -1171736302, 1010815409, -1110538383) + + W(11, -1118584150, 1028199647, 1025007180, -1124423270); + WS(-1097173920, -1100403112); + sum1 = W(0, -1133792968, -1126599342, 1026626987, -1109988694) + + W(1, -1128510918, -1124691470, -1124511038, -1134319356) + + W(2, -1112479512, -1122054529, -1138055228, -1131431128) + + W(3, -1133667884, -1113753548, 1051379210, -1097159959) + + W(4, 1031366423, -1128464692, -1126404688, -1113718896) + + W(5, 1058852431, 1058630415, -1108453759, -1122909907) + + W(6, -1129657589, 1034489098, -1097104011, 1049904553) + + W(7, -1111244112, 1006087192, -1123548289, 1017816566) + + W(8, 1007326848, -1104990865, -1129654222, -1138955724) + + W(9, -1134226372, -1122628437, -1112737379, 983139170) + + W(10, -1143321192, -1123473736, -1120375479, 1029275393) + + W(11, -1116837058, -1110311540, -1132471000, -1149064600); + sum2 = W(0, -1133003813, -1145103116, -1105221269, 1033080040) + + W(1, 1016862101, -1129731365, -1170659932, 1024883426) + + W(2, -1117429423, 1028547885, -1128891234, -1147341896) + + W(3, 1006656308, -1122208183, -1098340061, 1042272545) + + W(4, -1121562483, -1121650606, 1031055883, -1101651786) + + W(5, 1055658740, 1058321046, -1100689547, 1031708925) + + W(6, -1122785076, -1107240567, 1035604404, -1112738821) + + W(7, -1115182870, -1123396988, -1138148825, -1137951645) + + W(8, -1131811521, 1003752088, 1026865631, -1133076983) + + W(9, -1134424500, -1131665157, -1130287800, 1015669581) + + W(10, -1129373191, -1131162259, -1131089901, -1116779622) + + W(11, -1123356625, 1033205575, -1134576021, -1127933595); + WS(1049422752, 1064394145); + sum1 = W(0, 1016583527, -1106085006, 995307718, 1042273115) + W(1, -1113049442, 1025810280, 997641734, -1123841888) + + W(2, 1031369872, 1021597381, -1122854832, 1006187755) + + W(3, -1129211865, 1041111742, -1088517333, 1058826428) + + W(4, -1113933244, 1019889767, -1131677043, 1032245856) + + W(5, -1098988005, -1105331685, 1032610296, -1131685097) + + W(6, 1021172552, -1110939130, 1058612208, -1090507155) + + W(7, 1037338632, -1155049030, 1021691141, -1105269375) + + W(8, 1030057089, 1043687978, -1122591528, -1134096210) + + W(9, -1133007562, -1137128282, 1036830720, -1120823228) + + W(10, -1116248270, 1025994697, 1026669144, -1106745812) + + W(11, 1034516890, 1038691348, -1117945591, -1126546729); + sum2 = W(0, 1015668141, -1138201662, -1111996311, -1127284815) + + W(1, -1125087482, 1020174885, -1124041461, -1140877219) + + W(2, -1116450062, -1123578506, 1024732308, -1139064970) + + W(3, 1005775275, 1027346708, -1125910350, -1106280325) + + W(4, 1034158307, -1133423524, 1015274173, 1016303395) + + W(5, -1108948194, 1052974100, 1032925063, -1161498797) + + W(6, -1138139200, -1106503093, -1104963655, 1053021197) + + W(7, -1107449032, -1134898868, 992639399, -1117618841) + W(8, 1031763952, 957951850, 994113735, 1013272790) + + W(9, -1132053353, -1115775134, 1015724405, 1016609913) + + W(10, -1132927280, -1132485274, -1129319398, -1122071744) + + W(11, 1034411590, -1140595900, -1140186580, -1164791981); + WS(-1101497152, -1084603877); + sum1 = + W(0, -1136425045, 1016522037, 967194407, 1019848413) + W(1, -1129523533, -1142614610, -1140218249, -1157845066) + + W(2, 1029505522, -1119357636, -1140249161, -1135395837) + + W(3, -1121565262, 1035402982, 1022903246, 1027088345) + + W(4, -1121932442, -1148904362, -1122160667, 1027884002) + + W(5, -1107598171, 1024422013, -1127296803, 1002411186) + W(6, 1006883159, 1025282390, 1025270942, -1117602990) + + W(7, 1030372258, -1130529549, -1132497425, 1022271101) + + W(8, -1120772739, 1030415880, -1129818261, 1018540973) + + W(9, 1004502690, -1138792353, -1154700189, -1171556244) + + W(10, -1138666305, -1138856043, -1128604789, 995143101) + + W(11, -1128284203, 1025955498, -1121511513, 1011955033); + sum2 = W(0, -1126668299, -1131366283, 1024971228, 1000957181) + + W(1, -1151515419, 1005199725, -1137964827, -1117612139) + + W(2, 1034620123, -1119890411, -1145021381, -1136862175) + + W(3, 1015963121, -1097765254, 1049249869, 1026062254) + W(4, 1001872029, 1007955643, 1030757650, -1083955387) + + W(5, 1064229708, -1107214224, 1026637176, -1125717658) + + W(6, -1137547503, -1103492737, 1047078464, -1122275403) + + W(7, 1027173860, -1169614250, 997720155, -1118797430) + W(8, 1017921725, 1016072153, -1135832789, 923654805) + + W(9, -1132279825, -1131387718, 1024786888, -1133941049) + + W(10, -1148432117, 1002011725, -1152589275, -1140632131) + + W(11, -1144191965, 996433547, -1140699475, 1005736109); + WS(1059552336, -1136539026); + sum1 = + W(0, 990367896, 1041343484, -1096612504, 1033353841) + W(1, -1125599349, 1028944863, 1010957914, 1036710283) + + W(2, -1107358947, 1029016441, -1132821402, 1024290996) + + W(3, -1154541352, 1045269292, -1087221074, 1042554433) + + W(4, -1154580200, 1023892422, 1017372383, -1112141659) + W(5, 1058232297, 1029783110, -1114120867, 1023410731) + + W(6, 1026284586, -1116984235, 1051438086, -1087458720) + W(7, 1033522371, -1144215764, 1015461809, 1018013925) + + W(8, 1047713030, -1095293300, 1032365167, -1144750420) + W(9, 1014364322, 1006339428, 1032067931, -1114380761) + + W(10, 1004597796, 1001346936, 1021777309, 1032228520) + + W(11, 1045851190, -1099415088, 1030006574, -1130073781); + sum2 = W(0, -1153914788, -1101809160, 1052877341, 1046574229) + + W(1, -1095334336, 1023520281, -1126180245, -1115520194) + + W(2, 1022007580, 1000424166, -1113807813, 1021218858) + W(3, 995844276, -1114410922, 1055965696, 1034680258) + + W(4, -1109583292, 1008634443, -1141303142, 1033573989) + + W(5, -1098900400, -1098051352, 1033797491, -1115608949) + W(6, 1026951758, 998799030, 1023481081, 1045079279) + + W(7, 1032986287, 1032307290, 990856044, -1110191966) + W(8, 1023185808, -1106708743, 1025876178, -1128938562) + + W(9, 1004850742, -1129252703, 1031073312, 984863273) + W(10, -1137844345, 1017335440, 1015235936, 1016759632) + + W(11, -1104219784, -1103050031, 1038371038, 1020607644); + WS(-1080660584, -1085825159); + sum1 = + W(0, 1013708199, -1123370319, -1145658646, -1118786339) + W(1, 1028171867, -1144908790, 998525366, -1131079022) + + W(2, -1111041043, 1035331132, 1017605134, -1131113128) + + W(3, 1026247587, -1110742584, 1047524760, -1095527502) + + W(4, 1042485668, -1130744068, 1009982783, -1113918027) + W(5, 1038280501, 1041941518, -1110999603, 992723116) + + W(6, -1136883881, 1032009669, -1096311074, 1051037928) + + W(7, -1106204846, 1025830203, -1128223794, 1025751155) + + W(8, 1042402294, -1106649743, -1132447358, 1017749654) + W(9, 999596614, -1126831290, -1118872454, 1032615945) + + W(10, 1002160934, -1127230527, -1126850910, 1033490448) + + W(11, 1023947050, -1111971999, 971034337, 1018668086); + sum2 = W(0, 988660617, 1017543700, 1015794522, -1133704409) + W(1, 1003471274, -1140119133, -1145776834, 1002138986) + + W(2, 1001599498, 1024621822, -1135257421, -1136500105) + + W(3, -1133422913, 1031822055, 1041494739, -1102581932) + + W(4, 970658596, -1163479081, -1126488793, 1032911160) + W(5, 1056510750, -1089051586, 1026713544, 1009057465) + + W(6, 999416722, 1018658069, 1023998101, -1111744235) + W(7, 945757471, 1000517690, 999055930, 1007351961) + + W(8, -1138508317, 1009295285, 998080468, -1137960905) + W(9, 987033481, -1162261577, 991201876, -1140892226) + + W(10, -1156050276, -1186683976, -1179419172, 999395634) + + W(11, -1141702058, -1147317506, 1007988669, -1146609818); + WS(1064784784, -1120346387); + sum1 = W(0, -1150678408, 1015721531, 1049255678, -1099108228) + + W(1, -1149551256, -1136953142, 1000581420, -1110077251) + + W(2, 1043607805, -1107416484, 1017163947, -1140022794) + + W(3, 1006062348, -1107299655, 1059242626, -1089544734) + + W(4, 1023526494, -1139533474, 1015088861, -1132691862) + + W(5, -1123916922, -1130977491, 1022505321, 1012221798) + + W(6, -1136518116, -1148196556, -1096371932, 1057929313) + + W(7, -1104456865, 1014035238, -1126533711, 1013224070) + + W(8, -1100407642, 1048500643, -1111675367, 1026165050) + + W(9, 1012432222, -1124886999, -1132580564, 1035479729) + + W(10, -1127245287, -1136458552, -1122704190, 1014270588) + + W(11, -1102354822, 1044504531, 1007459698, 1017479699); + sum2 = W(0, -1140771860, 1031694512, -1104948969, -1115570202) + + W(1, 1040745971, -1127298441, -1125513054, -1122230843) + W(2, 993388690, 1042093481, -1111499166, 995262946) + + W(3, -1131667695, 979286214, 1026183534, 1042830623) + W(4, -1119680402, 1002124441, -1131288705, 1025077104) + + W(5, -1111209187, -1112764939, 982469091, -1123012516) + W(6, 978159878, -1108853537, 1041617383, 1043422569) + + W(7, -1120447085, -1129740789, 1012596136, -1102087836) + + W(8, 1045410736, 1034771561, -1109907689, -1125016939) + + W(9, 1011933560, -1117751010, 1030126174, 1014235016) + + W(10, -1127258987, 1004566649, -1121534607, -1113389694) + + W(11, 1044425994, 1025820984, -1115100280, -1119639931); + WS(-1088649680, 1067112300); + + return clamp(mstd0 + 5.0 * vsum / wsum * mstd1, 0.0, 1.0); +} + +shared float inp[507]; + +#define CURRENT_PASS 1 + +#define GET_SAMPLE(x) dot(x.rgb, rgb2y) +#define imageStore(out_image, pos, val) imageStoreOverride(pos, val.x) +void imageStoreOverride(uint2 pos, float value) { temp[pos] = (value); } + +#define INPUT_tex(pos) GET_SAMPLE(vec4(texture(INPUT, pos))) +static const float2 INPUT_size = float2(GetInputSize()); +static const float2 INPUT_pt = float2(GetInputPt()); + +#define HOOKED_tex(pos) INPUT_tex(pos) +#define HOOKED_size INPUT_size +#define HOOKED_pt INPUT_pt + +void Pass1(uint2 blockStart, uint3 threadId) { + ivec2 group_base = ivec2(gl_WorkGroupID) * ivec2(gl_WorkGroupSize); + int local_pos = int(gl_LocalInvocationID.x) * 13 + int(gl_LocalInvocationID.y); + for (int id = int(gl_LocalInvocationIndex); id < 507; id += int(gl_WorkGroupSize.x * gl_WorkGroupSize.y)) { + uint x = (uint)id / 13, y = (uint)id % 13; + inp[id] = + HOOKED_tex(HOOKED_pt * vec2(float(group_base.x + x - (3)) + 0.5, float(group_base.y + y - (2)) + 0.5)).x; + } + barrier(); + vec4 ret = vec4(0.0, 0.0, 0.0, 0.0); + vec4 ret0 = vec4(0.0, 0.0, 0.0, 0.0); + vec4 samples[12]; + samples[0][0] = inp[local_pos + 0]; + samples[0][1] = inp[local_pos + 1]; + samples[0][2] = inp[local_pos + 2]; + samples[0][3] = inp[local_pos + 3]; + samples[1][0] = inp[local_pos + 4]; + samples[1][1] = inp[local_pos + 5]; + samples[1][2] = inp[local_pos + 13]; + samples[1][3] = inp[local_pos + 14]; + samples[2][0] = inp[local_pos + 15]; + samples[2][1] = inp[local_pos + 16]; + samples[2][2] = inp[local_pos + 17]; + samples[2][3] = inp[local_pos + 18]; + samples[3][0] = inp[local_pos + 26]; + samples[3][1] = inp[local_pos + 27]; + samples[3][2] = inp[local_pos + 28]; + samples[3][3] = inp[local_pos + 29]; + samples[4][0] = inp[local_pos + 30]; + samples[4][1] = inp[local_pos + 31]; + samples[4][2] = inp[local_pos + 39]; + samples[4][3] = inp[local_pos + 40]; + samples[5][0] = inp[local_pos + 41]; + samples[5][1] = inp[local_pos + 42]; + samples[5][2] = inp[local_pos + 43]; + samples[5][3] = inp[local_pos + 44]; + samples[6][0] = inp[local_pos + 52]; + samples[6][1] = inp[local_pos + 53]; + samples[6][2] = inp[local_pos + 54]; + samples[6][3] = inp[local_pos + 55]; + samples[7][0] = inp[local_pos + 56]; + samples[7][1] = inp[local_pos + 57]; + samples[7][2] = inp[local_pos + 65]; + samples[7][3] = inp[local_pos + 66]; + samples[8][0] = inp[local_pos + 67]; + samples[8][1] = inp[local_pos + 68]; + samples[8][2] = inp[local_pos + 69]; + samples[8][3] = inp[local_pos + 70]; + samples[9][0] = inp[local_pos + 78]; + samples[9][1] = inp[local_pos + 79]; + samples[9][2] = inp[local_pos + 80]; + samples[9][3] = inp[local_pos + 81]; + samples[10][0] = inp[local_pos + 82]; + samples[10][1] = inp[local_pos + 83]; + samples[10][2] = inp[local_pos + 91]; + samples[10][3] = inp[local_pos + 92]; + samples[11][0] = inp[local_pos + 93]; + samples[11][1] = inp[local_pos + 94]; + samples[11][2] = inp[local_pos + 95]; + samples[11][3] = inp[local_pos + 96]; + ret[0] = nnedi3(samples); + ret0[0] = inp[local_pos + 41]; +#if CURRENT_PASS == LAST_PASS + uint2 destPos = blockStart + threadId.xy * 2; + uint2 outputSize = GetOutputSize(); + if (destPos.x >= outputSize.x || destPos.y >= outputSize.y) { + return; + } +#endif + imageStore(out_image, ivec2(gl_GlobalInvocationID) * ivec2(1, 2), ret0); + imageStore(out_image, ivec2(gl_GlobalInvocationID) * ivec2(1, 2) + ivec2(0, 1), ret); +} +//!PASS 2 +//!DESC NNEDI3 (double_x, nns16, win8x6) +//!IN INPUT, temp +//!OUT OUTPUT +//!BLOCK_SIZE 64, 8 +//!NUM_THREADS 32, 8 +#pragma optionNV(inline none) +float nnedi3(vec4 samples[12]) { + float sum = 0.0, sumsq = 0.0; + [unroll] for (int i = 0; i < 12; i++) { + sum += dot(samples[i], vec4(1.0, 1.0, 1.0, 1.0)); + sumsq += dot(samples[i], samples[i]); + } + float mstd0 = sum / 48.0; + float mstd1 = sumsq / 48.0 - mstd0 * mstd0; + float mstd2 = mix(0.0, inversesqrt(mstd1), mstd1 >= 1.192092896e-7); + mstd1 *= mstd2; + float vsum = 0.0, wsum = 0.0, sum1, sum2; +#define T(x) intBitsToFloat(x) +#define W(i, w0, w1, w2, w3) dot(samples[i], vec4(T(w0), T(w1), T(w2), T(w3))) +#define WS(w0, w1) \ + sum1 = exp(sum1 * mstd2 + T(w0)); \ + sum2 = sum2 * mstd2 + T(w1); \ + wsum += sum1; \ + vsum += sum1 * (sum2 / (1.0 + abs(sum2))); + sum1 = W(0, -1126897990, -1130469888, -1113607518, -1116173177) + + W(1, 1015526727, -1133977224, 990390561, -1122292152) + W(2, 1027745880, -1121396864, 1041026790, 1042195560) + + W(3, 1018714920, 1026239260, -1131068140, 1015308851) + W(4, 1024250604, 1039079928, 1022159130, -1098313415) + + W(5, 1042189511, -1106606352, 1013770942, -1122039043) + W(6, 1024642508, -1107295041, 1044630722, 999141354) + + W(7, -1106681307, 1038936227, -1122507740, 1031978820) + + W(8, -1121959908, -1147395201, -1107136294, 1019497054) + + W(9, 1035880216, -1124106064, -1136584888, -1116330759) + + W(10, -1149906049, -1126556538, 1005058137, 1007702352) + + W(11, -1121374916, 1025050132, -1135809122, 1018900008); + sum2 = W(0, 1017133506, 1023321012, -1119553894, -1112177411) + + W(1, -1165256880, -1133574805, 1020043526, -1135761830) + + W(2, 1011515348, 1029416248, 1057587887, 1071604647) + W(3, 1051025857, 1035052104, 1010374724, 1018728192) + + W(4, -1139818306, -1115999672, -1090489276, -1079392139) + + W(5, -1098617840, -1139515542, -1121583660, 1024878156) + + W(6, -1123730089, 1020129658, -1109933138, -1097028615) + + W(7, -1105405946, -1135392452, -1142174380, 1002597928) + W(8, 996184056, 1015618084, 1016266760, 1028448562) + + W(9, -1155286464, -1138601606, 997185888, -1131188096) + + W(10, -1138856554, 1007066512, -1145378916, 1008681896) + + W(11, 1000343320, 991053648, -1155288808, -1132781834); + WS(1018288640, 1027735986); + sum1 = + W(0, 1012158232, 1006778572, 1025063871, -1156175041) + W(1, 1010747802, -1140348884, 1020162890, -1172026051) + + W(2, -1178449286, -1114624234, -1104570115, 1028919475) + + W(3, 1034856692, -1127457566, -1122825993, -1115773453) + + W(4, 1044498160, 1032943202, 1059928494, -1097612337) + W(5, -1085331503, 1031833306, -1119592595, 1038136595) + + W(6, -1128542910, 1027108853, -1088743921, -1106124541) + W(7, 1059914122, 1032056909, 1033999672, 1027508251) + + W(8, -1115962871, 1017365062, 1032615126, 1026836706) + + W(9, -1114177498, -1122073627, 1022377282, -1129465364) + + W(10, 1002517720, 964628492, -1134936888, -1146238776) + W(11, 1020458158, 1016604174, 998219705, 1023799671); + sum2 = W(0, -1126840972, -1145399745, -1139273136, 991527106) + + W(1, -1135317632, -1139461992, -1129486378, 995542402) + + W(2, -1130460798, 985194115, -1112997847, -1120456092) + W(3, 1001121889, 1017866680, 1006765920, 1000306721) + + W(4, 1019075916, -1120812206, -1139625904, 1043975251) + + W(5, -1150833602, -1128878392, -1133504840, -1142139489) + + W(6, 1017322604, -1129997452, 1042717692, 1051048254) + + W(7, -1121880440, -1112673669, -1126929736, -1114488494) + + W(8, -1131054760, 1006903064, -1114175000, -1113881740) + W(9, 978663174, 1026044394, 1014584312, 1007041936) + + W(10, -1131047996, -1143360737, -1130986946, 1007107280) + + W(11, -1143215153, -1125685806, -1144361281, -1134951296); + WS(1042433344, -1111851638); + sum1 = W(0, -1128612156, -1139940268, -1122042583, 984858240) + W(1, 999630836, -1146630760, -1126512698, 996431920) + + W(2, -1112658226, -1123380939, -1128727592, -1107767030) + + W(3, -1114896432, -1115281716, -1129996802, -1123547845) + + W(4, -1119638967, -1126908022, -1097703246, 1052387104) + + W(5, 1054789077, 1030603948, 1028419819, 1026334318) + W(6, 1043958886, 1033805831, 1057665642, 1046318672) + + W(7, -1095395475, -1117224401, -1123618471, -1113258842) + + W(8, -1120465263, -1115346894, -1104545545, -1108167869) + + W(9, 1029397739, -1163176544, -1117439993, -1134051464) + + W(10, -1128976934, -1142120768, 1005565040, -1148354296) + + W(11, -1133849404, -1117808895, 1013349902, -1120421311); + sum2 = + W(0, 1022431497, -1132240188, 1024165374, -1114822837) + + W(1, -1120729932, -1124855948, -1126342960, -1128289576) + + W(2, -1109389142, -1119299282, -1107432916, 1044244351) + + W(3, 1031006195, 983982854, -1158996358, -1121099750) + W(4, 1004613154, -1139248009, 1041447926, -1108646182) + + W(5, 1047688354, 1009435309, -1122846542, 1036127241) + W(6, 1028727631, -1129989652, 1047487962, -1100679909) + + W(7, -1126089152, 1033956847, -1123334894, 1039673953) + W(8, 1029503922, -1140046689, 1017218352, 1040665470) + + W(9, -1120804126, -1107003694, -1140927562, -1102421772) + + W(10, -1132574761, -1114039002, -1135952741, -1123756570) + + W(11, -1148002498, 1028342876, -1117057946, 1026336008); + WS(1015433728, 1058400049); + sum1 = + W(0, -1139873791, -1133909491, 1023506921, -1230944644) + W(1, -1118840528, 1028378783, -1121050287, 1033465034) + + W(2, 1031161269, 1032977294, -1116372870, 1035249566) + + W(3, -1120831281, -1114963068, 1032892305, -1105610222) + + W(4, -1113693508, -1112917766, -1116140698, -1103376612) + + W(5, 1044830734, -1141442286, 1023234585, 1034039600) + W(6, 1033801204, -1131731326, 1045725159, -1102794347) + + W(7, -1116748777, 1032646513, -1112562780, 1030129285) + W(8, -1119172737, 989007258, -1122523445, 1044071755) + + W(9, 1030473357, 1018738506, 1021910870, -1122899972) + + W(10, -1143910182, 1019358132, 1008313039, -1115540344) + + W(11, -1126204226, -1118552369, 1016154651, -1124368226); + sum2 = W(0, -1138428449, 992976916, -1142924106, 976851025) + W(1, 989093448, 997652548, -1153131756, -1134977059) + + W(2, -1158711528, 1013039401, -1128734961, 1036130613) + + W(3, 1010050489, -1137359275, 990210276, -1138876101) + + W(4, -1124467432, -1130455464, -1113146735, -1097860430) + + W(5, -1108810723, -1122996798, -1140348735, -1127238416) + + W(6, -1140697417, -1123518198, -1099387353, -1077268149) + + W(7, -1091225653, 1032494444, -1115493835, 1018469149) + W(8, 1030243467, 1033499227, 1051222006, 1072898808) + + W(9, 1056060393, 1025590581, 1025171621, 1026307569) + W(10, 1012442941, 975746961, -1122081826, -1117904739) + + W(11, -1131990027, 951236744, 1006284898, -1146863422); + WS(-1143089152, 1030017260); + sum1 = W(0, 1012276081, 1001605962, 1024406997, -1155861797) + + W(1, -1155627981, -1122534699, 1018348791, -1120990241) + + W(2, -1116644609, -1127223379, -1109637089, -1115433381) + + W(3, 1036571679, 1028189701, -1126280255, 1036379833) + W(4, 1019444907, -1119160665, 1048989101, 1044433671) + + W(5, -1098184025, 1039597237, -1117935161, -1136463217) + + W(6, -1124688427, 1035777366, -1098625404, 1006101820) + + W(7, 1048780603, -1104960796, 1029641477, -1111599465) + + W(8, 1029853709, -1136557285, 1038057505, -1111190908) + + W(9, -1112291813, -1130076067, 1012573277, -1154886405) + + W(10, -1130860131, -1130309965, -1130883561, 1009046005) + + W(11, 1025361773, 1018788475, -1125993892, 1020397819); + sum2 = W(0, -1153319600, -1147284080, 1008968960, 995456320) + + W(1, -1140178660, -1146954776, -1142030464, -1170856127) + + W(2, 1008405084, 985822624, -1142311064, 1022276922) + W(3, -1140411728, 1005012008, 1003782736, 1006946188) + + W(4, -1118973116, 1010505984, -1101248908, -1089187936) + W(5, -1109859050, 1017518401, 982409184, 995727232) + + W(6, -1140784820, -1129308604, 1037448945, 1057794596) + W(7, 1029773785, 1015531414, 974134143, 960534268) + + W(8, 1012585128, 1021293048, 1024969278, 1033366347) + W(9, 1024400778, 1007802556, 1003482728, 1009923956) + + W(10, 1010769460, 1001814848, -1160749952, -1123619202) + + W(11, -1136545168, 1000322872, -1152799248, 985284128); + WS(1064472528, -1121594920); + sum1 = W(0, -1142654991, -1143599223, 1014568428, 1010500896) + + W(1, -1124387333, 1020884834, -1131205634, 1026841191) + + W(2, 1027230343, 1032290711, -1136037408, 1002050167) + + W(3, -1122938499, -1120250507, 1025589157, -1110863224) + + W(4, -1112807213, -1113392623, -1115590690, -1113734161) + + W(5, 1038834309, 1029912912, 1019867389, 1031947569) + W(6, 1027061019, 1016010466, 1034098395, -1112872467) + + W(7, -1130883382, 1015162858, -1123484555, 1019435182) + W(8, -1128825126, 991342574, 1008695068, 1027642302) + + W(9, 1013984188, 1015817710, 1015459258, -1129521612) + + W(10, -1164359388, 1014490160, -1148094031, -1127829894) + + W(11, -1138058188, -1124941766, 1008886302, -1130075526); + sum2 = + W(0, 1003807591, -1147429191, 1002635095, -1132089351) + W(1, -1147602519, -1151072125, 964968041, 1011860423) + + W(2, -1154115373, -1139843175, 1018649088, 1016729308) + + W(3, 1024344696, -1155997437, 1001714367, -1141691791) + W(4, 1000124719, 1001833687, 1008095031, -1105992985) + + W(5, 1014141127, -1132427785, -1141957575, -1139390003) + W(6, 1017182228, 1024488826, 1040714709, 1063780536) + + W(7, 1047200342, 1020609216, 1023684454, 1017456200) + + W(8, -1126980607, -1116401990, -1105844805, -1085442794) + + W(9, -1101306502, -1122913939, -1125194898, -1128761080) + + W(10, -1130234859, 987658746, 1013729967, 1024604622) + + W(11, 995366957, -1147894927, -1146690231, -1146063807); + WS(1061878800, -1131153991); + sum1 = + W(0, -1123872727, 1018625288, -1127640224, 1026350045) + W(1, 1013916191, 1018183052, -1145362866, 1016048056) + + W(2, 1015115512, 1031144036, 1036357847, -1108974562) + W(3, -1107191102, 1006433282, 1014427177, 1026198990) + + W(4, -1099302516, -1102371221, -1085394744, 1059569738) + W(5, 1050617832, 1032504563, 1031877738, 1033421596) + + W(6, 1041224340, 1009910425, 1052022073, 1058525661) + + W(7, -1088226291, -1097316565, -1109508096, -1098228398) + + W(8, -1144166978, 1014687697, -1115552350, -1125187302) + W(9, 1037730450, 1040234099, 1015825508, 1035235966) + + W(10, -1171049230, 1022902338, -1132534141, 1016189168) + + W(11, -1123531112, -1127405808, 1018548825, -1137247201); + sum2 = + W(0, -1131301730, 973798558, -1127780866, 1013478572) + W(1, -1160424319, -1135840779, -1164912671, -1138738786) + + W(2, 1031269327, -1131640108, 1013454096, -1109509101) + + W(3, -1117315078, -1131160392, -1145619912, -1127332243) + + W(4, -1127010401, 1028981651, -1149526184, 1051779317) + W(5, 1028380081, -1137527992, 998238336, -1148504424) + + W(6, -1109842974, -1125259759, -1113692773, 1047088883) + + W(7, -1134194124, 1028175261, 1018886164, 1027237057) + + W(8, -1181736700, -1167651134, -1123287814, -1109788940) + + W(9, -1115287133, -1121515979, -1125209194, -1142455024) + + W(10, -1180777340, -1160957999, 993986728, 1020962386) + + W(11, -1136947718, -1138138790, -1152989064, -1123011340); + WS(-1146021888, 1053974589); + sum1 = + W(0, 1029642476, 1013890275, -1176939092, 1022266947) + W(1, -1146466657, 1004183253, -1160650069, -1127783457) + + W(2, -1119368753, -1134074211, 1007708103, 1017736689) + W(3, 1027345005, 1032510570, 1019378973, 1031489314) + + W(4, 1042969521, 1042359026, 1045769551, -1101301107) + + W(5, -1094644679, -1091538585, -1107179580, -1095508207) + + W(6, -1095098901, -1107285127, -1096985546, 1034918881) + W(7, 1050538529, 1051699648, 1036824506, 1048776768) + + W(8, 1046685039, 1031018217, 1036262392, 1003810877) + W(9, -1120828825, 1011534979, -1133351451, 1035618600) + + W(10, 984849429, -1135393367, -1139413615, 1024875117) + + W(11, -1172526890, 1017671961, -1160823333, 1006585957); + sum2 = W(0, 1031363252, 1030774484, 1015165558, 1007437656) + W(1, 1020087968, -1158035650, -1137051446, 1018262350) + + W(2, -1091101506, 1001500224, -1110787951, 965388167) + W(3, 1003188992, 1041338676, -1134903850, 1033269727) + + W(4, 1048232756, -1110436898, 1016237906, 1014973676) + + W(5, -1123006886, -1105090874, -1123217223, -1104724635) + + W(6, 1057852755, -1132290932, 1043794074, 1047525730) + + W(7, 1011818344, -1129296549, 1034851396, -1106365430) + + W(8, -1095952784, -1131305343, -1113356328, -1152923833) + + W(9, -1111245491, -1131940021, -1117639196, 1024945328) + + W(10, 1016290300, -1126601761, 1003743696, 1022650220) + + W(11, 1021501454, 1017537464, -1133259176, 1019937714); + WS(-1077057896, -1083600334); + sum1 = W(0, 1017420011, 1014201033, 1017846781, 999765850) + W(1, -1162024122, 985808522, 1019153993, 1011766057) + + W(2, 1011471785, 1019976613, -1138042285, 1040273597) + W(3, 1016487629, 1027730222, 1010855969, 1025127228) + + W(4, 1029223422, -1126437509, 1049638570, -1090770241) + W(5, 1029091694, 1037672698, 1027546578, 1025680213) + + W(6, -1116040414, 1015478313, -1103217262, -1087230893) + + W(7, 1046437488, 1024768280, 1028909230, 1017109109) + W(8, 1017123181, 1024110818, 1023111893, 1030676769) + + W(9, -1112046985, -1120839802, 1023955584, -1128064723) + + W(10, 1016511669, -1167731667, 1009386661, 1023090125) + + W(11, 1020460717, 1025489318, -1134545259, 1027741830); + sum2 = + W(0, 1023774756, -1152708847, 1005727232, -1128030280) + W(1, 1004577664, -1116453887, 1020705336, -1127775332) + + W(2, -1107003878, 1013240776, -1108761818, 1032847770) + + W(3, 1024878510, -1129071264, -1124253692, -1114566712) + + W(4, 1020767940, -1108605887, 1050907301, 1058054639) + W(5, -1106188814, 1040942692, -1115446820, 1042743894) + + W(6, -1118294055, -1128830540, -1097736561, 1008347200) + + W(7, 1049418167, -1105809360, 1014050712, -1132221182) + + W(8, -1113997093, -1139588328, 1032528025, 1039669350) + + W(9, -1108856812, -1104688291, 1018266740, -1103534695) + + W(10, 1021408408, -1119578529, -1135972104, -1131826954) + + W(11, 999382680, 1019392776, -1117167612, 1022204104); + WS(1034686080, -1080904524); + sum1 = W(0, -1139332721, -1156631187, 1023562901, 1011454089) + W(1, 1009225011, 1012327853, 1010687981, 1010798725) + + W(2, 1025190657, 1024127465, 1006799241, -1145135178) + W(3, -1129417722, 1017495114, 1027561839, 1010795083) + + W(4, -1143163562, 1040892278, -1104914606, -1089193318) + + W(5, 1043909393, -1119873834, -1136185891, -1118482716) + + W(6, 1041601261, 1028605547, 1052908885, -1091833281) + + W(7, -1103073573, 1025246703, -1124345098, 1032670633) + + W(8, 1024768205, -1129308018, -1117860929, 1036300940) + W(9, 1040987970, 1033652713, 1024209623, 1027144528) + + W(10, -1137907141, 1012089369, 1019594656, -1143330794) + + W(11, 992909011, -1123933213, 1018355139, -1123266333); + sum2 = W(0, 998154484, -1136847690, -1120010648, -1145824866) + W(1, 1015307650, 994166396, 1000606426, 1010815409) + + W(2, -1124228589, 1028193069, 1043298286, -1115567961) + + W(3, -1106126812, -1111174068, -1128437454, -1110538383) + + W(4, -1132108902, -1123281782, -1097765474, 1059221182) + + W(5, 1048600788, -1130476352, 1026255089, -1118584150) + + W(6, -1115676434, -1123302060, 1027211577, 1034703777) + + W(7, -1099334080, 1015056080, -1137618020, 1028199647) + + W(8, -1123985162, -1132306691, -1114822183, -1131429597) + + W(9, 1029215805, 1023836215, -1127893362, 1025007180) + + W(10, 1004957466, 1011392625, -1127542967, 1022587458) + + W(11, -1127163397, -1122559367, -1171736302, -1124423270); + WS(-1097173920, -1100403112); + sum1 = W(0, -1133792968, -1124511038, -1133667884, -1126404688) + + W(1, -1129657589, -1123548289, -1134226372, -1120375479) + + W(2, -1126599342, -1134319356, -1113753548, -1113718896) + + W(3, 1034489098, 1017816566, -1122628437, 1029275393) + W(4, 1026626987, -1112479512, 1051379210, 1058852431) + + W(5, -1097104011, 1007326848, -1112737379, -1116837058) + + W(6, -1109988694, -1122054529, -1097159959, 1058630415) + + W(7, 1049904553, -1104990865, 983139170, -1110311540) + + W(8, -1128510918, -1138055228, 1031366423, -1108453759) + + W(9, -1111244112, -1129654222, -1143321192, -1132471000) + + W(10, -1124691470, -1131431128, -1128464692, -1122909907) + + W(11, 1006087192, -1138955724, -1123473736, -1149064600); + sum2 = W(0, -1133003813, -1170659932, 1006656308, 1031055883) + + W(1, -1122785076, -1138148825, -1134424500, -1131089901) + + W(2, -1145103116, 1024883426, -1122208183, -1101651786) + + W(3, -1107240567, -1137951645, -1131665157, -1116779622) + + W(4, -1105221269, -1117429423, -1098340061, 1055658740) + + W(5, 1035604404, -1131811521, -1130287800, -1123356625) + + W(6, 1033080040, 1028547885, 1042272545, 1058321046) + W(7, -1112738821, 1003752088, 1015669581, 1033205575) + + W(8, 1016862101, -1128891234, -1121562483, -1100689547) + + W(9, -1115182870, 1026865631, -1129373191, -1134576021) + + W(10, -1129731365, -1147341896, -1121650606, 1031708925) + + W(11, -1123396988, -1133076983, -1131162259, -1127933595); + WS(1049422752, 1064394145); + sum1 = W(0, 1016583527, 997641734, -1129211865, -1131677043) + W(1, 1021172552, 1021691141, -1133007562, 1026669144) + + W(2, -1106085006, -1123841888, 1041111742, 1032245856) + + W(3, -1110939130, -1105269375, -1137128282, -1106745812) + + W(4, 995307718, 1031369872, -1088517333, -1098988005) + W(5, 1058612208, 1030057089, 1036830720, 1034516890) + + W(6, 1042273115, 1021597381, 1058826428, -1105331685) + + W(7, -1090507155, 1043687978, -1120823228, 1038691348) + + W(8, -1113049442, -1122854832, -1113933244, 1032610296) + + W(9, 1037338632, -1122591528, -1116248270, -1117945591) + + W(10, 1025810280, 1006187755, 1019889767, -1131685097) + + W(11, -1155049030, -1134096210, 1025994697, -1126546729); + sum2 = + W(0, 1015668141, -1124041461, 1005775275, 1015274173) + W(1, -1138139200, 992639399, -1132053353, -1129319398) + + W(2, -1138201662, -1140877219, 1027346708, 1016303395) + + W(3, -1106503093, -1117618841, -1115775134, -1122071744) + + W(4, -1111996311, -1116450062, -1125910350, -1108948194) + + W(5, -1104963655, 1031763952, 1015724405, 1034411590) + + W(6, -1127284815, -1123578506, -1106280325, 1052974100) + W(7, 1053021197, 957951850, 1016609913, -1140595900) + + W(8, -1125087482, 1024732308, 1034158307, 1032925063) + W(9, -1107449032, 994113735, -1132927280, -1140186580) + + W(10, 1020174885, -1139064970, -1133423524, -1161498797) + + W(11, -1134898868, 1013272790, -1132485274, -1164791981); + WS(-1101497152, -1084603877); + sum1 = + W(0, -1136425045, -1140218249, -1121565262, -1122160667) + + W(1, 1006883159, -1132497425, 1004502690, -1128604789) + W(2, 1016522037, -1157845066, 1035402982, 1027884002) + + W(3, 1025282390, 1022271101, -1138792353, 995143101) + W(4, 967194407, 1029505522, 1022903246, -1107598171) + + W(5, 1025270942, -1120772739, -1154700189, -1128284203) + + W(6, 1019848413, -1119357636, 1027088345, 1024422013) + W(7, -1117602990, 1030415880, -1171556244, 1025955498) + + W(8, -1129523533, -1140249161, -1121932442, -1127296803) + + W(9, 1030372258, -1129818261, -1138666305, -1121511513) + + W(10, -1142614610, -1135395837, -1148904362, 1002411186) + + W(11, -1130529549, 1018540973, -1138856043, 1011955033); + sum2 = + W(0, -1126668299, -1137964827, 1015963121, 1030757650) + W(1, -1137547503, 997720155, -1132279825, -1152589275) + + W(2, -1131366283, -1117612139, -1097765254, -1083955387) + + W(3, -1103492737, -1118797430, -1131387718, -1140632131) + + W(4, 1024971228, 1034620123, 1049249869, 1064229708) + W(5, 1047078464, 1017921725, 1024786888, -1144191965) + + W(6, 1000957181, -1119890411, 1026062254, -1107214224) + W(7, -1122275403, 1016072153, -1133941049, 996433547) + + W(8, -1151515419, -1145021381, 1001872029, 1026637176) + + W(9, 1027173860, -1135832789, -1148432117, -1140699475) + + W(10, 1005199725, -1136862175, 1007955643, -1125717658) + + W(11, -1169614250, 923654805, 1002011725, 1005736109); + WS(1059552336, -1136539026); + sum1 = W(0, 990367896, 1010957914, -1154541352, 1017372383) + W(1, 1026284586, 1015461809, 1014364322, 1021777309) + + W(2, 1041343484, 1036710283, 1045269292, -1112141659) + W(3, -1116984235, 1018013925, 1006339428, 1032228520) + + W(4, -1096612504, -1107358947, -1087221074, 1058232297) + + W(5, 1051438086, 1047713030, 1032067931, 1045851190) + W(6, 1033353841, 1029016441, 1042554433, 1029783110) + + W(7, -1087458720, -1095293300, -1114380761, -1099415088) + + W(8, -1125599349, -1132821402, -1154580200, -1114120867) + + W(9, 1033522371, 1032365167, 1004597796, 1030006574) + W(10, 1028944863, 1024290996, 1023892422, 1023410731) + + W(11, -1144215764, -1144750420, 1001346936, -1130073781); + sum2 = W(0, -1153914788, -1126180245, 995844276, -1141303142) + W(1, 1026951758, 990856044, 1004850742, 1015235936) + + W(2, -1101809160, -1115520194, -1114410922, 1033573989) + + W(3, 998799030, -1110191966, -1129252703, 1016759632) + W(4, 1052877341, 1022007580, 1055965696, -1098900400) + + W(5, 1023481081, 1023185808, 1031073312, -1104219784) + W(6, 1046574229, 1000424166, 1034680258, -1098051352) + + W(7, 1045079279, -1106708743, 984863273, -1103050031) + + W(8, -1095334336, -1113807813, -1109583292, 1033797491) + + W(9, 1032986287, 1025876178, -1137844345, 1038371038) + + W(10, 1023520281, 1021218858, 1008634443, -1115608949) + + W(11, 1032307290, -1128938562, 1017335440, 1020607644); + WS(-1080660584, -1085825159); + sum1 = W(0, 1013708199, 998525366, 1026247587, 1009982783) + W(1, -1136883881, -1128223794, 999596614, -1126850910) + + W(2, -1123370319, -1131079022, -1110742584, -1113918027) + + W(3, 1032009669, 1025751155, -1126831290, 1033490448) + + W(4, -1145658646, -1111041043, 1047524760, 1038280501) + + W(5, -1096311074, 1042402294, -1118872454, 1023947050) + + W(6, -1118786339, 1035331132, -1095527502, 1041941518) + + W(7, 1051037928, -1106649743, 1032615945, -1111971999) + + W(8, 1028171867, 1017605134, 1042485668, -1110999603) + W(9, -1106204846, -1132447358, 1002160934, 971034337) + + W(10, -1144908790, -1131113128, -1130744068, 992723116) + + W(11, 1025830203, 1017749654, -1127230527, 1018668086); + sum2 = W(0, 988660617, -1145776834, -1133422913, -1126488793) + W(1, 999416722, 999055930, 987033481, -1179419172) + + W(2, 1017543700, 1002138986, 1031822055, 1032911160) + W(3, 1018658069, 1007351961, -1162261577, 999395634) + + W(4, 1015794522, 1001599498, 1041494739, 1056510750) + W(5, 1023998101, -1138508317, 991201876, -1141702058) + + W(6, -1133704409, 1024621822, -1102581932, -1089051586) + + W(7, -1111744235, 1009295285, -1140892226, -1147317506) + + W(8, 1003471274, -1135257421, 970658596, 1026713544) + W(9, 945757471, 998080468, -1156050276, 1007988669) + + W(10, -1140119133, -1136500105, -1163479081, 1009057465) + + W(11, 1000517690, -1137960905, -1186683976, -1146609818); + WS(1064784784, -1120346387); + sum1 = + W(0, -1150678408, 1000581420, 1006062348, 1015088861) + W(1, -1136518116, -1126533711, 1012432222, -1122704190) + + W(2, 1015721531, -1110077251, -1107299655, -1132691862) + + W(3, -1148196556, 1013224070, -1124886999, 1014270588) + W(4, 1049255678, 1043607805, 1059242626, -1123916922) + + W(5, -1096371932, -1100407642, -1132580564, -1102354822) + + W(6, -1099108228, -1107416484, -1089544734, -1130977491) + + W(7, 1057929313, 1048500643, 1035479729, 1044504531) + W(8, -1149551256, 1017163947, 1023526494, 1022505321) + + W(9, -1104456865, -1111675367, -1127245287, 1007459698) + + W(10, -1136953142, -1140022794, -1139533474, 1012221798) + + W(11, 1014035238, 1026165050, -1136458552, 1017479699); + sum2 = W(0, -1140771860, -1125513054, -1131667695, -1131288705) + + W(1, 978159878, 1012596136, 1011933560, -1121534607) + W(2, 1031694512, -1122230843, 979286214, 1025077104) + + W(3, -1108853537, -1102087836, -1117751010, -1113389694) + + W(4, -1104948969, 993388690, 1026183534, -1111209187) + W(5, 1041617383, 1045410736, 1030126174, 1044425994) + + W(6, -1115570202, 1042093481, 1042830623, -1112764939) + W(7, 1043422569, 1034771561, 1014235016, 1025820984) + + W(8, 1040745971, -1111499166, -1119680402, 982469091) + + W(9, -1120447085, -1109907689, -1127258987, -1115100280) + + W(10, -1127298441, 995262946, 1002124441, -1123012516) + + W(11, -1129740789, -1125016939, 1004566649, -1119639931); + WS(-1088649680, 1067112300); + + return clamp(mstd0 + 5.0 * vsum / wsum * mstd1, 0.0, 1.0); +} + +shared float inp[555]; + +#define CURRENT_PASS 2 + +#define GET_SAMPLE(x) dot(x.rgb, rgb2y) +#define imageStore(out_image, pos, val) imageStoreOverride(pos, val.x) +void imageStoreOverride(uint2 pos, float value) { + float2 UV = mul(rgb2uv, INPUT.SampleLevel(sam_INPUT_LINEAR, HOOKED_map(pos), 0).rgb); + OUTPUT[pos] = float4(mul(yuv2rgb, float3(value.x, UV)), 1.0); +} + +#define INPUT_tex(pos) GET_SAMPLE(vec4(texture(INPUT, pos))) +static const float2 INPUT_size = float2(GetInputSize()); +static const float2 INPUT_pt = float2(GetInputPt()); + +#define temp_tex(pos) (float(texture(temp, pos).x)) +static const float2 temp_size = float2(GetInputSize().x * 1, GetInputSize().y * 2); +static const float2 temp_pt = float2(1.0 / (temp_size.x), 1.0 / (temp_size.y)); + +#define HOOKED_tex(pos) temp_tex(pos) +#define HOOKED_size temp_size +#define HOOKED_pt temp_pt + +void Pass2(uint2 blockStart, uint3 threadId) { + ivec2 group_base = ivec2(gl_WorkGroupID) * ivec2(gl_WorkGroupSize); + int local_pos = int(gl_LocalInvocationID.x) * 15 + int(gl_LocalInvocationID.y); + for (int id = int(gl_LocalInvocationIndex); id < 555; id += int(gl_WorkGroupSize.x * gl_WorkGroupSize.y)) { + uint x = (uint)id / 15, y = (uint)id % 15; + inp[id] = + HOOKED_tex(HOOKED_pt * vec2(float(group_base.x + x - (2)) + 0.5, float(group_base.y + y - (3)) + 0.5)).x; + } + barrier(); + vec4 ret = vec4(0.0, 0.0, 0.0, 0.0); + vec4 ret0 = vec4(0.0, 0.0, 0.0, 0.0); + vec4 samples[12]; + samples[0][0] = inp[local_pos + 0]; + samples[0][1] = inp[local_pos + 1]; + samples[0][2] = inp[local_pos + 2]; + samples[0][3] = inp[local_pos + 3]; + samples[1][0] = inp[local_pos + 4]; + samples[1][1] = inp[local_pos + 5]; + samples[1][2] = inp[local_pos + 6]; + samples[1][3] = inp[local_pos + 7]; + samples[2][0] = inp[local_pos + 15]; + samples[2][1] = inp[local_pos + 16]; + samples[2][2] = inp[local_pos + 17]; + samples[2][3] = inp[local_pos + 18]; + samples[3][0] = inp[local_pos + 19]; + samples[3][1] = inp[local_pos + 20]; + samples[3][2] = inp[local_pos + 21]; + samples[3][3] = inp[local_pos + 22]; + samples[4][0] = inp[local_pos + 30]; + samples[4][1] = inp[local_pos + 31]; + samples[4][2] = inp[local_pos + 32]; + samples[4][3] = inp[local_pos + 33]; + samples[5][0] = inp[local_pos + 34]; + samples[5][1] = inp[local_pos + 35]; + samples[5][2] = inp[local_pos + 36]; + samples[5][3] = inp[local_pos + 37]; + samples[6][0] = inp[local_pos + 45]; + samples[6][1] = inp[local_pos + 46]; + samples[6][2] = inp[local_pos + 47]; + samples[6][3] = inp[local_pos + 48]; + samples[7][0] = inp[local_pos + 49]; + samples[7][1] = inp[local_pos + 50]; + samples[7][2] = inp[local_pos + 51]; + samples[7][3] = inp[local_pos + 52]; + samples[8][0] = inp[local_pos + 60]; + samples[8][1] = inp[local_pos + 61]; + samples[8][2] = inp[local_pos + 62]; + samples[8][3] = inp[local_pos + 63]; + samples[9][0] = inp[local_pos + 64]; + samples[9][1] = inp[local_pos + 65]; + samples[9][2] = inp[local_pos + 66]; + samples[9][3] = inp[local_pos + 67]; + samples[10][0] = inp[local_pos + 75]; + samples[10][1] = inp[local_pos + 76]; + samples[10][2] = inp[local_pos + 77]; + samples[10][3] = inp[local_pos + 78]; + samples[11][0] = inp[local_pos + 79]; + samples[11][1] = inp[local_pos + 80]; + samples[11][2] = inp[local_pos + 81]; + samples[11][3] = inp[local_pos + 82]; + ret[0] = nnedi3(samples); + ret0[0] = inp[local_pos + 33]; +#if CURRENT_PASS == LAST_PASS + uint2 destPos = blockStart + threadId.xy * 2; + uint2 outputSize = GetOutputSize(); + if (destPos.x >= outputSize.x || destPos.y >= outputSize.y) { + return; + } +#endif + imageStore(out_image, ivec2(gl_GlobalInvocationID) * ivec2(2, 1), ret0); + imageStore(out_image, ivec2(gl_GlobalInvocationID) * ivec2(2, 1) + ivec2(1, 0), ret); +} diff --git a/src/Effects/NNEDI3/NNEDI3_nns256_win8x4.hlsl b/src/Effects/NNEDI3/NNEDI3_nns256_win8x4.hlsl new file mode 100644 index 000000000..ca90b7a87 --- /dev/null +++ b/src/Effects/NNEDI3/NNEDI3_nns256_win8x4.hlsl @@ -0,0 +1,7880 @@ +// This file is generated by the scripts available at https://github.com/hauuau/magpie-prescalers +// Please don't edit this file directly. +// Generated by: nnedi3.py --nns 256 --win 8x4 --use-compute-shader --use-magpie +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +//!MAGPIE EFFECT +//!VERSION 4 +//!SORT_NAME NNEDI3_256_4 + +//!TEXTURE +Texture2D INPUT; + +//!SAMPLER +//!FILTER POINT +SamplerState sam_INPUT; + +//!TEXTURE +//!WIDTH INPUT_WIDTH * 1 * 2 +//!HEIGHT INPUT_HEIGHT * 2 * 1 +Texture2D OUTPUT; + +//!SAMPLER +//!FILTER LINEAR +SamplerState sam_INPUT_LINEAR; + +//!TEXTURE +//!FORMAT R16_FLOAT +//!WIDTH INPUT_WIDTH * 1 +//!HEIGHT INPUT_HEIGHT * 2 +Texture2D temp; + +//!SAMPLER +//!FILTER POINT +SamplerState sam_temp; + +//!COMMON +#include "prescalers.hlsli" + +#define LAST_PASS 2 + +//!PASS 1 +//!DESC NNEDI3 (double_y, nns256, win8x4) +//!IN INPUT +//!OUT temp +//!BLOCK_SIZE 32, 16 +//!NUM_THREADS 32, 8 +#pragma optionNV(inline none) +float nnedi3(vec4 samples[8]) { + float sum = 0.0, sumsq = 0.0; + [unroll] for (int i = 0; i < 8; i++) { + sum += dot(samples[i], vec4(1.0, 1.0, 1.0, 1.0)); + sumsq += dot(samples[i], samples[i]); + } + float mstd0 = sum / 32.0; + float mstd1 = sumsq / 32.0 - mstd0 * mstd0; + float mstd2 = mix(0.0, inversesqrt(mstd1), mstd1 >= 1.192092896e-7); + mstd1 *= mstd2; + float vsum = 0.0, wsum = 0.0, sum1, sum2; +#define T(x) intBitsToFloat(x) +#define W(i, w0, w1, w2, w3) dot(samples[i], vec4(T(w0), T(w1), T(w2), T(w3))) +#define WS(w0, w1) \ + sum1 = exp(sum1 * mstd2 + T(w0)); \ + sum2 = sum2 * mstd2 + T(w1); \ + wsum += sum1; \ + vsum += sum1 * (sum2 / (1.0 + abs(sum2))); + sum1 = W(0, 1024871952, -1091961907, 1049937838, 1023328805) + W(1, 1026430476, -1103990249, 1052012307, 994719130) + + W(2, 1041094851, -1086639391, 1057524239, -1110763811) + + W(3, 992987016, -1085365048, 1063527595, -1102193240) + W(4, 1034372511, -1087585419, 1061081007, 1046466539) + + W(5, 1007997243, -1093414958, 1057188600, -1131716095) + + W(6, 1038248733, -1100793414, -1104832955, 1042167685) + + W(7, 1009484684, -1099588502, -1114088341, 1037858632); + sum2 = W(0, -1122170202, -1115075619, -1113824159, 1016746290) + + W(1, -1117362461, 1050294809, 1022334174, 1016781702) + + W(2, -1125932452, 1041506545, -1098709995, 1031697879) + + W(3, -1100385246, -1100233118, -1104291570, 1033455014) + + W(4, 1020071642, -1100362988, 1072797337, 1050444141) + W(5, 1025043913, 1047005177, 1053652830, -1106922881) + + W(6, 1017078274, 1012082941, -1100425628, -1081909907) + + W(7, 1018043750, -1112302377, -1155649364, -1086585813); + WS(-1096195455, 1061976972); + sum1 = + W(0, -1107583849, -1094469481, 1057261454, 1032308806) + W(1, 1045016510, -1104061589, 1051975353, 1046697387) + + W(2, -1102048399, -1082981042, 1058403546, -1093320254) + + W(3, 1050507709, -1086991635, 1061386858, 1051876218) + + W(4, -1138600128, -1087760032, 1052980216, -1106246183) + + W(5, 1004076226, -1088999402, 1052828202, -1112945129) + W(6, 1049677870, -1111975782, 1055128500, 1045880594) + + W(7, -1106918697, -1089081125, 1048525839, -1116677906); + sum2 = + W(0, 976892690, -1095110912, -1080663089, 1075827337) + W(1, 1043646796, -1114450783, -1074060607, 1075290035) + + W(2, -1131052969, 1052886335, -1068434194, 1070007941) + W(3, 1047930742, -1113296119, 1048011859, 1046007784) + + W(4, -1099144563, -1088067101, 1042920440, -1090506241) + + W(5, 1035354913, 1040578653, 1058047003, -1099371585) + + W(6, -1115191227, -1102673565, 1057110709, -1096675048) + + W(7, -1111106463, 1051335047, 1038060178, -1096378099); + WS(-1095930303, -1128843438); + sum1 = W(0, -1113225514, 1000563038, 1038763268, -1104281110) + + W(1, 1030842449, -1103461662, 1052682210, -1105449143) + + W(2, -1120882464, -1098779087, 1055587560, -1106219642) + + W(3, -1111398934, -1156245815, 1046999855, -1105879965) + + W(4, -1098488134, 1057689814, -1090605975, 1039743648) + + W(5, -1098728413, 1058114717, -1106232348, 1030902068) + + W(6, -1111237296, 1041725787, -1106563184, -1111582036) + + W(7, -1104159890, 1046074787, -1119168797, 1033984854); + sum2 = W(0, -1109947141, -1078961084, 1053833634, 1049299145) + + W(1, -1087141194, -1081851502, -1102894339, 1040634467) + + W(2, 1007133897, 1057831088, 1046573470, 1035108031) + W(3, -1099413759, 1067440534, 1058568743, -1114324751) + + W(4, 1026690396, -1095618356, 1058025266, -1094447449) + + W(5, 1045509921, 1022398658, -1115002147, 1023241606) + W(6, -1117657274, 1029712906, -1109832065, 987652806) + + W(7, 1051942463, 1049871690, -1099467737, -1104714655); + WS(1018627052, -1077328537); + sum1 = W(0, -1107592280, -1098360952, 1054425801, -1121256842) + + W(1, 1011043872, -1103889731, 1045838144, 1016847523) + + W(2, -1138466445, -1088654431, 1063939041, -1114759963) + + W(3, 1041422472, -1079526160, 1057394281, -1109966789) + + W(4, -1112294435, -1109020730, 1061143403, -1115564074) + + W(5, 1012707679, -1095389295, 1057286118, -1117689671) + + W(6, -1150731309, -1102056896, 1040465365, -1133534770) + + W(7, -1118891707, -1101414784, 1042544156, 1028492087); + sum2 = + W(0, -1161717665, 1033867626, 1028201267, -1124228530) + W(1, -1138679732, -1115218580, -1096378423, 1029766795) + + W(2, -1121504639, 1030621655, 1071708903, -1128256742) + W(3, 1050854432, -1096361601, 1079482342, 1035298280) + + W(4, -1106511096, 1044499063, -1064184100, 1035336882) + + W(5, 1030373815, -1104067382, -1089118805, -1105361644) + W(6, 980628162, 1040061476, 1048273255, -1119150405) + + W(7, 1031200951, -1122098343, -1109436715, 1035049634); + WS(1045693694, 1057374369); + sum1 = W(0, 1048369598, 1034312519, -1131023893, -1099588978) + + W(1, -1104752283, 1045853799, -1098373234, 1019902402) + + W(2, 1031950009, 1057046586, -1095062180, -1105510198) + + W(3, -1123958928, 1065585622, -1089164628, 1033283356) + + W(4, -1103831441, 1061666460, -1092432965, -1115031649) + + W(5, -1106189273, 1060939321, -1087345809, -1122647270) + + W(6, -1103850789, 1050689810, -1092965100, -1126666680) + + W(7, -1110300085, 1060417841, -1091010256, -1103574093); + sum2 = W(0, -1087427905, -1098709872, 1072153031, -1089481634) + + W(1, 1058683530, -1099141199, -1088885778, 1056590706) + + W(2, -1081734921, 1032637312, 1061509476, -1092495010) + W(3, 1050776004, 1072181481, 1071890032, 1048814690) + + W(4, 1042479954, 1036599206, 1052304550, -1095810808) + + W(5, 1025544982, -1080357543, -1080881103, -1097308566) + + W(6, -1105492903, -1113642582, 1050862866, -1094462248) + + W(7, 1058740427, -1086527647, -1078556244, 1039671439); + WS(-1081549664, 1060153996); + sum1 = W(0, 992286043, 1063391104, -1087586274, -1105647870) + + W(1, -1115318586, 1055271797, -1095899708, 1025423024) + + W(2, -1105782456, 1062019397, -1085498120, 1033921889) + + W(3, 1026471870, 1061503832, -1089250259, -1113405924) + + W(4, -1114468402, 1058772501, -1090055577, -1113674825) + + W(5, 1037910210, 1045594046, -1102496824, -1106446561) + + W(6, -1130210466, 1049908468, -1103786988, -1118412923) + + W(7, 1043803882, 1040755007, -1104619012, -1096097592); + sum2 = W(0, 1053790549, -1080860351, -1068185653, -1082483044) + + W(1, -1110257416, -1097530578, -1077346152, -1088866791) + + W(2, 1033688102, 1041061421, 1052310674, 1052658871) + W(3, -1102619530, 1064966059, 1072556372, -1104178634) + + W(4, -1117483359, 1050344847, 1075004369, -1108410079) + + W(5, -1098152061, 1040479494, 1064749402, 1040931499) + + W(6, -1105743952, 1051151965, -1110156824, -1137891932) + + W(7, -1083553679, 1065962098, 1045213317, 1053124980); + WS(-1079020096, -1097079011); + sum1 = W(0, -1109501731, -1096742621, 1057943754, 1016000225) + + W(1, 1033910555, -1092191510, 1055662529, 1020967408) + + W(2, 1015347636, -1089091160, 1059647341, -1102027816) + + W(3, -1108027795, -1087072713, 1068092504, -1109882648) + + W(4, 1042979875, -1087558450, 1059824411, -1106889398) + + W(5, 1019929124, -1089417126, -1117499817, -1117366414) + + W(6, 1040369234, -1104831498, 1043480574, -1104827345) + + W(7, -1134559750, -1091818621, 1050143023, 1049289276); + sum2 = W(0, 1037631964, -1097479797, 1051023588, 1045348435) + + W(1, -1105851814, 1051380185, -1097950410, 1028003104) + + W(2, 1036652885, 1028410699, 1034374804, -1113269608) + W(3, -1110757790, 1044594400, 1053237761, 1041832368) + + W(4, 1024508007, 1041068006, -1132209182, 1033918380) + + W(5, -1139201564, 1046036650, -1088293598, -1089693526) + + W(6, -1113225064, 1054960427, -1081781977, -1099925151) + + W(7, -1104657620, -1105334641, 1065714224, -1106359824); + WS(-1087384991, 1052875812); + sum1 = W(0, 1041733252, -1109905397, 1041497057, -1113613058) + + W(1, -1138647561, -1104994285, 1032882549, -1117825756) + + W(2, 1034391503, -1107522048, 1050093354, -1108789794) + + W(3, -1106477875, 1057597757, -1091247383, 1028766931) + + W(4, -1100509868, 1062613266, -1087942224, 1042722079) + + W(5, -1098694249, 1055828187, -1090201627, 1013355333) + + W(6, -1110959830, 1052485297, -1098203032, 1034047139) + + W(7, -1120730421, 1044647290, -1100016695, 1038812681); + sum2 = W(0, 1019350107, 1041831066, 1051650697, -1103332568) + + W(1, -1111428867, -1130655130, -1112274143, -1077765094) + + W(2, 1017374087, -1138336400, -1092155273, -1073481211) + + W(3, -1112005123, 1035402260, -1114034096, -1087514353) + + W(4, 1028700445, -1116945124, 1045953881, 1069095754) + W(5, -1112772903, 1041636268, 1041190902, 1074086485) + + W(6, 1027823157, -1107238338, 1049171133, 1057277153) + W(7, 999439052, 1033528252, 1027833254, -1107727987); + WS(1050457727, 1041689780); + sum1 = + W(0, -1131312139, 992358355, -1092744895, 1048008788) + W(1, -1116681402, 1014710691, 1027381214, 1036450832) + + W(2, 1030961105, 1040368912, -1089348299, 1053966377) + W(3, -1140959985, -1105027369, 1050737138, 933247243) + + W(4, 1046496193, -1089290871, 1038810352, 1043432004) + W(5, 1048638526, -1090315138, 1055368676, -1119062181) + + W(6, 1007270019, -1098770776, 1040416748, 1023583738) + W(7, 1049181764, -1086147588, 1051301702, 1037141075); + sum2 = + W(0, -1107193278, 1057496780, 1072935738, -1080570956) + W(1, 1019433289, 1031729137, -1080020989, 1054527180) + + W(2, 1039188525, 1037283932, -1078950448, -1096917141) + + W(3, -1123892633, -1086728254, -1087453268, 1050123895) + + W(4, 1039851328, -1087309268, 1051352061, 1053948249) + W(5, 1032631611, -1092570464, 1059438018, 1042769096) + + W(6, 1044641782, 1035754242, 1051006721, 1029707984) + W(7, -1097026795, 1063903066, 1056300653, -1106545458); + WS(-1084263519, -1088250567); + sum1 = + W(0, -1107101246, 1048954180, -1118116730, -1111017296) + W(1, 1049480649, -1096698757, 1027018719, 1043604572) + + W(2, -1097447514, 1059331526, -1108150329, -1098833704) + + W(3, 1049647488, -1119095878, -1090501921, 1050343697) + + W(4, -1099235545, 1040553109, 1044929028, -1096264890) + W(5, 1018612505, 1041330418, -1094468036, 1044030041) + + W(6, -1103944776, 1040723088, 1047463532, -1121471547) + + W(7, 1032447885, 1023387386, -1106285556, -1175819022); + sum2 = W(0, 991719940, -1157381748, -1100952734, 1029794653) + W(1, 1034086314, -1121095386, 1027786887, 1016292894) + + W(2, 1055828179, -1103829652, -1085350121, 1067178121) + + W(3, 1034571486, -1100672658, -1118546758, -1098007098) + + W(4, 1049088345, -1090417467, 1049271738, 1008607005) + + W(5, -1098363481, 1050795943, -1140682323, -1110134488) + + W(6, -1111430799, -1113801830, 1035813474, -1115483467) + + W(7, -1111365517, 1037803588, -1164121191, -1133015817); + WS(1066054400, -1125664425); + sum1 = W(0, 1015260777, 1054574294, -1095241461, -1127045294) + + W(1, -1108545200, 1053284635, -1094415406, -1111343263) + + W(2, 1023624464, 1059735702, -1088764634, 1041542629) + + W(3, -1109354663, 1058150961, -1078845388, -1130514988) + + W(4, 1023465234, 1058102002, -1090401103, 1035892576) + + W(5, -1108921531, 1063397581, -1105651068, -1136829776) + + W(6, -1116445024, 1046571067, -1116790272, 1030749305) + + W(7, -1128865616, 1046728251, -1104354311, -1106930027); + sum2 = W(0, 1041565398, -1104697837, -1115419200, -1158883614) + + W(1, -1103469615, 1029373537, 1031260861, 1035036640) + W(2, 1029690269, 1057447179, 1026403525, 1034486240) + + W(3, 1035794320, 1080145714, 1043319440, 1041655252) + W(4, 1035452008, -1103623095, 1050811672, -1114789346) + + W(5, -1107146771, -1066097425, -1103531154, -1114794272) + + W(6, -1124704946, -1097535851, -1090176537, 1036709484) + + W(7, 1040850628, -1103109309, 1055196268, -1102936938); + WS(-1087901375, 1071177135); + sum1 = + W(0, -1121594272, -1110224028, 1030219348, 994425384) + W(1, -1122618691, -1109965218, 1047787782, 1027034090) + + W(2, -1114434254, -1120206908, -1114914192, -1106192913) + + W(3, 1044010486, 1010935165, -1113546820, 1040356168) + + W(4, -1113833999, -1108541318, 1046030645, -1112701798) + + W(5, -1108159437, 1041417229, 1035224125, -1130438655) + W(6, 997526195, -1109330685, 1017890711, -1151173965) + + W(7, -1123472883, 1039497451, 1022061139, -1125745551); + sum2 = W(0, 1042217679, -1116367239, 1026421701, -1140328609) + + W(1, -1108814485, 1042859710, 1027395369, -1114630403) + + W(2, 1058334461, -1078638996, 1028343990, -1105295199) + + W(3, -1080767453, 1073929687, -1097310248, 1028261520) + + W(4, 1050991857, -1092080339, 1042808122, -1122297114) + + W(5, 1030602271, -1116721722, 1051491707, -1105219597) + W(6, 1034906705, -1106162437, 1024141024, 997359482) + + W(7, -1127683613, 1035114111, -1112071525, 1017171678); + WS(1066545696, -1154623394); + sum1 = + W(0, -1105442505, -1114054203, 1057182265, -1123432545) + W(1, -1115505461, -1098488296, 1049322687, 1010507424) + + W(2, -1102287846, -1092352928, 1062190966, -1097309632) + + W(3, 1023914903, -1089108436, 1059635472, 1045294808) + W(4, 1021900696, -1087887754, 1057132007, -1098559779) + + W(5, 1016559928, -1096061654, 1043675118, 1042399967) + + W(6, -1142506442, -1097827287, 1048482034, -1110816589) + + W(7, -1129232035, -1095543703, 1055016957, 1026256390); + sum2 = + W(0, -1094410020, 1040526244, 1038890507, -1120085021) + W(1, -1073520568, -1119660436, -1105577163, 1014274624) + + W(2, -1076806727, 1072065972, 1038803075, -1119386280) + W(3, 1007932024, 1074284701, -1096715819, 1032586275) + + W(4, -1129053184, 1045336233, 1048625414, -1148623280) + + W(5, -1126774165, -1114285571, -1106066396, 1033069015) + + W(6, 1016297320, 1027498382, 1035667090, -1113847206) + + W(7, 1026440100, -1109537500, -1128514892, 1028560484); + WS(1055250687, -1106970626); + sum1 = W(0, 1033119688, 1042190962, -1096546392, -1117586055) + + W(1, -1105149829, 1055784922, -1103230410, -1125652468) + + W(2, 1043588463, 1039447718, -1093610964, 1035816565) + + W(3, -1098690473, 1060328969, -1094495495, -1103963220) + + W(4, 1051357302, -1105877415, -1104321127, 1047255951) + + W(5, -1111820283, 1050469874, -1102978667, -1108600424) + + W(6, 1036109552, -1123255849, 1034127854, -1157028943) + + W(7, -1119401059, 1044861546, -1097968467, 1018776031); + sum2 = W(0, 1038757267, 1030211853, 1033894636, -1133782171) + + W(1, -1111076574, -1147844455, 1039985174, -1117005539) + + W(2, 1036628998, 1002666567, -1092985165, -1150866734) + + W(3, -1107631850, -1080902130, -1084645521, 1049641986) + + W(4, 1045867530, -1089131777, 1069738325, 1051354211) + + W(5, -1126199158, 1067727291, -1096580382, -1100550183) + + W(6, 1034641438, 1050167793, -1100096489, -1104598763) + + W(7, 1014361489, -1114432338, -1100261485, 1033251244); + WS(1063662431, 1022143153); + sum1 = + W(0, -1101665898, 1028101088, 1045825111, -1107336877) + W(1, 1044567949, -1100200043, -1112112432, 1049135824) + + W(2, -1113912242, -1110575390, 1011332621, -1117269540) + + W(3, 1054985008, -1090770105, 1036354680, 1043762234) + W(4, -1089448239, 1042239925, 1053092900, -1090665684) + + W(5, 1031890901, 1034205190, 1020582213, 1045380738) + W(6, -1106608329, 1041117720, -1122250931, -1108114694) + + W(7, 1016341751, 1032506575, 1037368233, 1027635960); + sum2 = + W(0, -1109621945, 995625223, 1033690799, -1127273987) + W(1, 1044140338, -1125871763, -1131300267, 1031533647) + + W(2, 1011973298, 1059194369, 1019603073, -1100093028) + W(3, 1054192939, -1085775903, -1105557074, 1049649037) + + W(4, -1083519810, -1085690186, 1066625604, -1099380904) + + W(5, 1050669158, 1055305067, -1093331249, 1041330252) + W(6, 1015542539, -1115586758, 1025625789, -1109873113) + + W(7, 1007706050, 1024423563, -1163078190, 1021669909); + WS(1065395904, 1046290614); + sum1 = W(0, 996799560, -1125542553, 1038203972, -1122586727) + W(1, 1015596034, 1043656950, -1105153011, 1036793959) + + W(2, -1100668872, 1056396433, -1085640859, 1049715632) + + W(3, -1100927819, 1054862894, -1101762943, 1035554923) + + W(4, 1043886221, -1088911438, 1057024083, -1115152096) + + W(5, 1025322396, -1099487682, 1036429768, -1122121748) + + W(6, 1035443240, -1105531411, 1021072448, 1039652277) + + W(7, -1114934548, -1117673547, 1035195023, 1024299964); + sum2 = W(0, 1029237671, 1017509749, -1104176053, 1032328729) + + W(1, -1133651707, -1140172751, 1038596873, 1037378915) + + W(2, -1114304490, 1030543605, 1050264307, -1104642832) + + W(3, -1114162505, -1092617066, -1093179067, 1049979232) + + W(4, -1125875827, 1051105475, 1071302855, -1110244360) + + W(5, -1112015576, 1033357967, -1090684841, -1085540383) + + W(6, 1015895733, 1011455075, -1100815852, -1135016203) + + W(7, 1035088799, -1105982664, 1003487558, 1015899853); + WS(1058730335, 1038095077); + sum1 = W(0, 1050009523, -1090412329, -1116071407, -1120619710) + + W(1, -1156396202, 1022785342, -1112028282, 1033123659) + W(2, 1045232946, 990514519, 1027669243, -1138222105) + + W(3, -1123440788, 1051849503, 1025171300, 1042856679) + W(4, 994853272, 1050259497, -1091444451, 1043400402) + + W(5, 1029074928, 1048747736, -1091116387, 1046148791) + + W(6, -1116532263, 1040337077, -1095024325, 1031722640) + + W(7, 1016043038, 1047238893, -1085293672, 1050565349); + sum2 = W(0, 1046272294, 1056160584, -1069609928, -1086350256) + + W(1, -1119023958, 1047372879, -1100807597, 1012350161) + + W(2, -1106071503, 1066704996, 1063602974, -1093103672) + + W(3, -1097641458, 1062851774, 1071319304, -1165704932) + + W(4, -1099339001, -1127558738, -1123458905, -1099266547) + + W(5, -1122591395, -1095719050, 1049925865, 1039176837) + + W(6, -1120322169, 1012197993, 1037702687, -1104052164) + + W(7, -1112624405, -1094334166, 1046841945, 1043315186); + WS(-1102208382, 1082454872); + sum1 = W(0, -1121527792, -1097489215, 1044710709, 1024559218) + + W(1, 1019782131, -1109352802, 1043005718, 1025756170) + + W(2, -1111677734, -1089475261, 1059136208, -1098383546) + + W(3, 1042764822, -1094323164, -1113184692, 1034230961) + + W(4, -1098291428, 1057233791, -1102862820, -1121795355) + + W(5, -1109244559, 1055571354, -1113821821, 1034138424) + + W(6, -1122839755, 1036609181, 1016630678, -1148370726) + + W(7, 1023050790, 1023873367, -1122283881, 1021065311); + sum2 = W(0, 1012975921, -1113722375, -1109752074, 1009270385) + + W(1, 1033684352, -1113902527, -1108511603, 1034062718) + + W(2, -1119837718, 1034379158, 1047596894, -1096952633) + W(3, 1048900749, 1065557700, 1065261424, 1042274647) + + W(4, -1088385914, 1033601684, -1110433219, -1110816087) + + W(5, -1106132930, -1078602486, -1113936114, 1038223706) + + W(6, -1107812043, 1048231286, -1106600777, 1037668398) + + W(7, 1047279942, -1117907500, -1110420048, -1111923151); + WS(1055139903, 1066543323); + sum1 = W(0, -1113216706, 1025777755, 1062476912, -1094834883) + + W(1, 1034160554, -1106690282, 1047449287, -1115394087) + + W(2, -1110997976, 1025857819, 1040533578, -1100641176) + + W(3, -1104052311, -1108040417, -1088276389, -1109281747) + + W(4, -1130057219, 1042814916, 1043316038, -1111790927) + + W(5, -1100344024, 1058801014, -1096553156, -1131081926) + + W(6, -1109060119, 1040801319, 1003175286, -1127882001) + + W(7, -1102181302, 1061190298, -1109923206, -1116502963); + sum2 = W(0, 1032900543, -1093611286, -1093105706, -1103368978) + + W(1, 1026043047, -1143136704, -1104881087, 996537094) + + W(2, 1011969739, -1129502699, 1056641171, -1097512177) + W(3, 1005946567, 1065137024, 1062580590, 1038772124) + + W(4, -1104378201, 1034934846, -1137732946, -1108835309) + + W(5, -1106573410, 1044311979, -1102271464, 1035638256) + + W(6, -1149079854, -1128312106, -1106196955, 1028654910) + + W(7, -1098913457, -1107526541, -1097055308, -1144299515); + WS(1037662203, -1095462961); + sum1 = + W(0, 1051208476, 1054332722, -1088537607, 1009988859) + W(1, 1007151360, 1048962332, -1096098779, -1120684294) + + W(2, 1047867778, 1056131053, -1089718811, 1043868050) + W(3, -1120692693, 1060311124, -1086623130, 1008468855) + + W(4, -1102286423, 1053179033, -1088149909, 1024446024) + W(5, 1029685138, 1057524976, -1093380227, 1041242535) + + W(6, -1117174983, 1045179237, -1094989189, -1121112609) + + W(7, 998066935, 1053688986, -1094538289, 1022948968); + sum2 = W(0, -1075642964, 1064397427, 1042055631, 1049259770) + + W(1, -1078284587, 1070403917, 1050515956, -1100572061) + + W(2, -1077677369, 1072178178, -1094922849, 1038272909) + + W(3, -1086975712, 1071930150, -1096417404, -1110188613) + + W(4, 1050575143, -1093947328, -1094640520, 1033007627) + + W(5, -1109971278, -1119680819, 1045435393, -1109186235) + + W(6, 1043550667, -1134729809, -1109099138, 1040318497) + + W(7, 1046375822, -1094009133, -1106076462, 1038207101); + WS(-1091974591, 1028524890); + sum1 = + W(0, -1119527298, 1050666155, -1104886813, -1119869997) + W(1, 1034997099, -1101120961, -1100807815, 1044100139) + + W(2, -1099802012, 1057798952, -1099838668, -1103774309) + + W(3, 1033463662, -1146674958, 1021707158, -1112176434) + + W(4, -1090658116, 1048486316, 1057612011, -1094617942) + W(5, 1044419888, 1054164791, -1093871840, 1036492177) + + W(6, -1099353751, 1033437822, 1029138830, -1113521820) + + W(7, -1110855131, 1053708795, -1104286795, 1028051362); + sum2 = + W(0, 1029285075, -1114745613, 1024121756, -1127985632) + W(1, -1113245689, 1037297246, 1034295695, -1103172653) + + W(2, 1046869988, -1113507597, -1081105309, -1097344586) + + W(3, -1099734421, 1057852752, 1063764387, -1092930743) + W(4, 1045806866, 1031538739, -1093953622, 1039548141) + + W(5, -1099048447, 1019950674, 1060684479, -1113791115) + W(6, 1040440310, 1039903515, -1099720743, 1024790472) + + W(7, -1129472848, -1115367833, 1051222485, -1106398082); + WS(1058893599, -1078409713); + sum1 = + W(0, -1115244150, -1102829117, 1039336887, -1115623287) + W(1, 1036724056, -1100240992, 1053376406, -1114512019) + + W(2, -1098555735, -1094663483, 1053054383, 1041993169) + W(3, 1049246955, -1084866106, 1065100884, 1018575674) + + W(4, 1045222582, -1085064800, 1054590883, -1114852275) + + W(5, -1138283737, -1093243506, 1056764679, -1108377677) + + W(6, 1044966206, -1093950047, 1053059489, -1118180448) + + W(7, -1115412967, -1095580366, 1050610273, -1122449691); + sum2 = W(0, -1130929736, -1101060123, 1045192083, -1105822172) + + W(1, 1009552185, -1090337753, 1061442923, -1103557108) + + W(2, -1084383778, 1072779570, 1050903982, -1106762492) + + W(3, 1050909748, 1053567468, -1089269841, -1117595750) + + W(4, 1049209322, -1079161361, 1029505799, -1111371347) + + W(5, -1096700837, 1057662166, -1094014597, 1025228376) + + W(6, 1051369678, -1097661058, 1046387683, -1138825972) + + W(7, -1129474226, -1112521942, -1105984421, 1030887459); + WS(-1109369595, 1048740969); + sum1 = + W(0, 1040995480, 1051718495, -1091711555, -1125552391) + W(1, 1030414773, 1050319297, -1095167863, 1032958437) + + W(2, -1118646413, 1059003715, -1085356599, 1042985722) + W(3, 1043594790, 1046504696, -1083562713, 1045509569) + + W(4, -1129436350, -1135436979, -1096690237, 1023899916) + + W(5, 1037121811, 1043825845, -1098326935, 1019546753) + W(6, 1030207412, 1049475887, -1120665100, -1130219052) + + W(7, 1043560049, 1058279379, -1098718953, -1105013544); + sum2 = W(0, -1113177829, -1117552581, -1100446453, 1041583669) + + W(1, 1043809265, -1109343151, 1039662186, 1009024316) + + W(2, -1095416462, 1052574118, -1114145263, -1118793923) + + W(3, 1034071291, 1063553374, 1053677817, 1018689733) + W(4, -1120341831, 1070912061, -1101063801, 1031195477) + + W(5, 1043900974, -1112203792, 1042882834, -1105538343) + + W(6, 1020015593, -1091338378, -1094258913, -1114748986) + + W(7, -1119209873, -1072794661, 1055602011, -1109237633); + WS(-1093437503, 1065718162); + sum1 = + W(0, 1037550096, 1049488055, -1103061781, -1114711965) + W(1, -1101135841, 1042594425, 1046266118, -1097873069) + + W(2, 1044878747, 1049041945, -1087470164, 1046063170) + + W(3, -1107014286, 1066142676, -1106438298, -1091362312) + + W(4, 1042111087, -1100146203, -1111606545, 1037494709) + W(5, 1037051057, 1045825417, -1091131027, 1040258368) + + W(6, -1099961615, 1040663590, -1133427370, -1109172298) + + W(7, 1041500301, -1119554198, -1103590594, 1033770775); + sum2 = + W(0, -1106488910, -1123106758, 1050172947, -1124712996) + W(1, 1026201604, -1113590739, -1092748399, 1043391307) + + W(2, 1035711566, -1084666863, -1097703384, -1098783459) + + W(3, 1060425407, 1061776657, -1099741350, 1048423650) + W(4, -1098764525, 1055047321, -1120322586, 1041036039) + + W(5, -1096618367, -1119175762, 1050324229, -1099280352) + + W(6, -1182808622, -1103500958, 1025620288, 1048645442) + + W(7, -1127820908, 1041613778, -1105222946, -1118590758); + WS(1056660607, -1113798601); + sum1 = W(0, -1115305597, 1041913228, 1012656821, 1026504084) + W(1, -1101671294, 1008348404, 998498191, -1151777337) + + W(2, 1016801995, 1031963795, -1102006873, 1032505286) + + W(3, 1039904137, -1093680051, 1057450908, -1108358078) + + W(4, 1037148876, -1089471492, 1049874551, 1031920291) + W(5, 1040453028, 1034024758, -1111681498, 1043455038) + + W(6, -1110559226, -1111400057, -1109457443, -1129849213) + + W(7, -1154296528, 1031051312, 1036430914, -1125050675); + sum2 = W(0, 1042939003, 1024638457, -1123927190, 998901155) + W(1, -1114796094, -1101207597, 1042777565, 1022659417) + + W(2, 1044529628, 1027593065, -1098782283, 1017512357) + + W(3, -1124781020, -1097759574, 1059165645, -1104939928) + + W(4, -1106748864, -1130307786, 1062760553, -1098668376) + + W(5, 1016881133, 1033669310, 1017094385, -1089791762) + + W(6, -1108227590, 1022409637, -1160993898, -1106217568) + + W(7, 1027959261, 1019735589, -1125388747, -1115680109); + WS(1066155712, 1004288134); + sum1 = W(0, 1047132567, 1049267618, -1089062279, -1138510971) + + W(1, 1029697589, 1048612844, -1092380195, 1046969501) + W(2, 1014062303, 1055750611, -1088453014, 1024451359) + + W(3, 1041631965, 1059093756, -1084647474, 1049129552) + W(4, 991515041, 1057479944, -1091963789, 1040560290) + + W(5, -1123217244, 1056993158, -1088742789, 1043007167) + + W(6, -1154741365, 1047138005, -1098495965, -1122630737) + + W(7, 1030265807, 1055767146, -1086886676, -1122583780); + sum2 = W(0, 1011892235, 1040858440, -1127819845, 1010964983) + + W(1, -1111382628, -1103755803, -1109875610, -1106716388) + + W(2, 1037768402, -1125277089, -1096621612, 1032593498) + + W(3, 1032283234, -1084511950, -1071556311, 1040462902) + + W(4, -1114728106, -1090323786, -1071973667, -1100404332) + + W(5, 1009460031, -1159433014, -1099343032, 1040394500) + + W(6, -1112526532, 1053584755, 1076043190, 1007208771) + W(7, 1030203700, 1052886875, 1079690007, 1051792925); + WS(-1086041375, 1049976369); + sum1 = + W(0, -1125608345, -1096855193, 1037693680, 1048607039) + W(1, 1025261033, -1097190986, 1051176741, 1030637974) + + W(2, 1032012444, -1086237883, 1059434222, 1026121224) + W(3, 1046732297, -1083643033, 1062665585, -1103554484) + + W(4, -1114869141, -1093631755, 1052924527, -1110078044) + + W(5, 1036081274, -1095059844, 1052562329, -1109004102) + W(6, 1036645660, -1132519191, 1041010310, 1035782593) + + W(7, -1119140736, -1095180224, 1048775023, -1118200972); + sum2 = + W(0, 1029601330, -1115199196, -1096390757, -1079547524) + + W(1, -1144560396, 1026958814, -1100298556, -1081990625) + W(2, 1032763954, 1032369083, 1076866217, 1041174181) + + W(3, -1115106220, -1106065675, -1108884178, 1041059708) + + W(4, -1111454114, 1042189754, -1116766618, 1024602232) + + W(5, -1121335223, 1029124674, 1025985538, -1127158528) + + W(6, -1109520646, 1022674491, -1115268590, 1007020790) + W(7, 1021645795, 1026253022, 1011072742, 1003377428); + WS(-1111980027, 1060626277); + sum1 = W(0, 1023621139, -1102882983, 1044706422, 1028429765) + + W(1, 1032179266, -1092055397, 1043529367, -1113080214) + + W(2, 1030954414, -1089823274, 1057090380, -1101761443) + + W(3, 1037158526, -1095093232, 1064981515, -1098683411) + + W(4, 1036765152, -1090725010, 1047303429, 1033439719) + W(5, 1036680203, -1139402199, 1042557255, 1030304674) + + W(6, -1146606447, -1116432156, 1028925358, -1104492078) + + W(7, -1119312598, -1108873773, 1041638915, -1112219839); + sum2 = + W(0, -1107703976, 1045439570, 1032849260, -1122224669) + W(1, 1046455264, -1090239140, -1096329612, 1035962913) + + W(2, -1093472442, 1028879562, 1030082819, -1098806672) + W(3, 1048924762, 1064195571, 1036056807, 1041148911) + + W(4, -1097201227, 1016778259, 1059898488, -1091828205) + W(5, 1049435664, 1027385222, -1091675747, 1041687668) + + W(6, -1106239872, 1028121257, 1053658286, -1098243254) + + W(7, -1119402461, -1105208479, -1117889585, -1104565052); + WS(1062681599, 1040842201); + sum1 = + W(0, -1108789463, -1104300209, 1042117608, -1118282400) + + W(1, -1115361429, 1050445194, -1097788769, -1114475276) + + W(2, 1048981817, -1089127203, 1032428200, 1049574381) + W(3, -1092926921, 1063952639, 1049970971, -1090427073) + + W(4, 1054602509, 1043197406, -1088418847, 1045778638) + W(5, 1029602904, -1106041808, 1049956321, -1112080775) + + W(6, -1117967305, 1039191171, -1112931212, -1097758566) + + W(7, 1025443329, -1114238594, -1123051255, 1033393295); + sum2 = W(0, 1038735267, -1126315713, -1111714958, -1111656758) + + W(1, -1100048068, 1043050536, -1115313021, -1115683900) + + W(2, -1115453090, 1053683464, 1046662525, -1093358619) + + W(3, -1110884051, 1058830244, 1061563017, -1105966973) + + W(4, -1090743949, -1100540415, 1052621807, 1037413595) + + W(5, -1153955669, 1037942519, -1104363663, -1101879362) + + W(6, -1112598570, -1098889179, -1118760183, 1044482581) + + W(7, -1103797208, 1040830228, 1007755797, -1098877089); + WS(1062776447, 1069975051); + sum1 = W(0, -1130308944, 1036893844, -1104137265, -1108240801) + + W(1, -1112835078, -1114635034, -1098478453, 1029922778) + + W(2, -1113144126, 1050058840, -1104852259, -1111877761) + + W(3, -1094805377, 1071110128, 1041368142, -1088740684) + + W(4, -1098008538, 1061455014, -1095764665, -1112520550) + + W(5, -1114270939, 1044746969, -1109080309, -1119589855) + + W(6, -1117364667, 1018226642, -1103882015, -1121527653) + + W(7, -1117827459, 1049407081, -1120810969, -1103102129); + sum2 = W(0, 1028834725, -1113117380, 1037052904, -1113210551) + W(1, -1110297977, 1026197871, 996515330, 1032917698) + + W(2, 1035091068, -1099362318, 1043940575, -1106692355) + + W(3, 1034973002, 1077416661, -1069860026, -1103487680) + W(4, -1110025415, 1050456944, 969317772, 1034055293) + + W(5, -1154986018, -1112814852, 1021906202, 1006658352) + + W(6, -1120031976, 1027999489, -1115577362, 1018186436) + + W(7, 1030684381, 1016280910, 1013156184, -1124181989); + WS(-1082599007, -1084302409); + sum1 = + W(0, -1127095446, 1056665680, -1087212124, 1035858193) + W(1, 1011517278, 1052281350, -1096260148, -1128228554) + + W(2, -1110892475, 1058821842, -1085877656, 1043137767) + W(3, 1024933540, 1061132051, -1087957451, 1023709101) + + W(4, -1111586789, 1054434479, -1089270826, 1037286635) + + W(5, 1039136849, 1052720805, -1102718609, -1111842501) + + W(6, -1108207315, 1043783817, -1106422582, -1130056576) + + W(7, 1049617952, -1159632952, -1106709957, -1115207149); + sum2 = W(0, 1048459811, -1095160239, 1026509768, -1123792544) + + W(1, 1071226724, 1065850492, 1043007163, -1127547903) + W(2, 1075494724, -1121381976, 1043168485, 1027169380) + + W(3, 1074401127, -1099027008, -1093896652, -1107011198) + + W(4, 1044864951, 1031151008, 1012395574, 1037067951) + W(5, -1077687291, 1057399482, 1019701051, 1021690579) + + W(6, -1072311776, 1045213405, -1109946848, -1124089088) + + W(7, -1066953112, -1095971461, 1027278540, -1166810856); + WS(-1118215158, -1130722305); + sum1 = W(0, 1039784439, 1045520358, -1094865274, 966095017) + + W(1, -1119983743, 1040649785, -1098235299, -1166742058) + + W(2, 1027132090, -1126797149, -1085881139, 1023429181) + + W(3, -1101267710, 1070303194, -1106608186, -1127173569) + + W(4, -1106141431, 1059129261, -1088850304, -1112024885) + + W(5, -1119840977, 1056727436, -1093134907, 1030946302) + + W(6, -1131926580, 1040938982, -1098615277, -1160489077) + + W(7, -1158357571, 1050582583, -1104503154, -1106263629); + sum2 = W(0, -1122933952, 1043676402, -1122578476, 1034421913) + + W(1, 1029904221, -1092335308, -1096734640, -1121365342) + + W(2, -1104768174, 1050667883, -1067932755, -1103315560) + + W(3, 1044174015, -1106663265, 1078656606, 1049347404) + W(4, -1122786276, 1035773679, 1056344301, 1027752905) + + W(5, 1032455763, 1033986578, -1106732625, -1114333025) + + W(6, -1118952582, -1123822916, 1033374173, 1025409455) + + W(7, -1120585334, 1030027555, -1116084330, -1129253837); + WS(-1112296443, -1083191171); + sum1 = + W(0, 1030599873, 1049894985, -1100141489, -1124642344) + W(1, -1102688301, 1052276159, -1095734081, -1114229790) + + W(2, 1038739494, 1055519004, 1044438853, 1039505712) + W(3, -1091052013, 1061107959, -1078809864, -1108354137) + + W(4, -1120252367, 1059731464, -1100785926, 1037196526) + + W(5, -1118018759, 1052059899, -1095185489, -1129006466) + + W(6, -1105737735, 1050382861, -1092887220, 1034647259) + + W(7, 1036799090, 1050879021, -1113977245, -1123394945); + sum2 = + W(0, -1134366274, 1032198029, -1102569648, -1113629492) + W(1, 1040286055, -1093721101, 1059013351, -1099320981) + + W(2, -1103185345, 1064064153, -1076328416, 1062572765) + + W(3, -1089934078, 1038410574, 1075980540, -1079072621) + + W(4, -1104699884, 1053501328, -1081344728, 1057269325) + + W(5, -1135474394, 1053898256, -1093863519, 1039501040) + + W(6, 1039368980, -1088730122, 1061819985, -1089994189) + W(7, 984214720, 1045555557, -1089334779, 1050815727); + WS(1051639487, -1077445112); + sum1 = W(0, 1023584208, -1087680633, 1058381481, 1019116206) + + W(1, 1019039018, -1097242582, 1049175941, -1110819225) + + W(2, 1046978951, -1087958558, 1059595066, 1041321753) + + W(3, -1114024277, -1084584703, 1058705186, -1110784681) + + W(4, 1042440780, -1089578188, 1060807824, -1120949436) + + W(5, 1036430651, -1090497932, 1057261083, -1111841304) + + W(6, 1019910405, -1100840226, 1047705823, -1108976675) + + W(7, 1017051223, -1089989738, 1052092149, 1037750032); + sum2 = W(0, -1103483317, 1043027417, 1043672886, -1126025102) + + W(1, -1103949071, 1024633771, -1105891820, -1101612494) + + W(2, 1036613850, 1050158855, -1113242263, 1051748473) + + W(3, -1096200772, -1096718424, 1053817256, -1144187697) + + W(4, -1094761445, 1057240079, 1043447632, -1129269697) + + W(5, -1090478844, 1037855330, 1053166295, -1114569970) + + W(6, -1091384835, 1036780676, 1043680942, -1102484885) + + W(7, 1024429003, -1103545669, 1034776200, 1044262941); + WS(-1102141694, 1066754929); + sum1 = + W(0, 1024767465, -1097150806, -1121670572, 1047316983) + W(1, 1028037205, -1105574095, 1021251426, -1123186307) + + W(2, -1148374821, -1092607882, 1053426631, 1027553675) + W(3, 996156698, -1086231302, 1064662112, 1037457517) + + W(4, 1034886379, -1085570014, 1060264850, -1103359865) + W(5, 1011245536, -1090150659, 1058905527, 1031219256) + + W(6, 1017269224, -1093685286, 1047037217, -1108923303) + + W(7, 1023537404, -1100403588, 1048736520, 1039125668); + sum2 = W(0, -1127568330, 1005444026, -1099850392, -1069105992) + + W(1, 1031019669, -1121000217, 1052911126, -1075891845) + + W(2, 1013355589, -1135062981, 1040255711, 1052106082) + + W(3, -1123247753, -1099801823, -1120914990, 1078854269) + + W(4, -1131101666, 1044314830, 1055431083, 1061745892) + + W(5, -1126559289, 1052295626, -1112663055, -1097592921) + + W(6, -1128009624, -1112001042, 1029993103, 1033712114) + + W(7, -1122774763, 1018744598, -1105142519, 1037317546); + WS(-1092827839, 1049601702); + sum1 = + W(0, -1102748075, -1114726817, 1043768535, 1001409895) + W(1, 1048973336, -1100496851, 1037939345, 1025584388) + + W(2, -1101661842, 1056141590, -1092531310, 1043222609) + W(3, 1035794226, -1092935501, 1048278549, 1028885900) + + W(4, 1035295380, -1090189951, 1059458263, -1097823129) + W(5, 951002293, -1127762491, -1107678146, 1046084402) + + W(6, 1028700102, -1107070641, 1040739973, 1018269854) + + W(7, 1019995195, -1116434785, -1103464157, 1033486885); + sum2 = W(0, 1047648616, -1099866854, 1040911688, -1104812914) + + W(1, 1049954711, -1087014785, -1127547935, 1032774583) + + W(2, -1086499077, 1059941103, 1006897087, -1118719608) + + W(3, 1036131868, 1059724034, -1147690453, -1112213150) + + W(4, 1021844703, -1104253425, -1094365093, 1020986307) + + W(5, -1144052469, -1116739540, 1046092804, 1037506252) + + W(6, 1036766656, -1123734224, -1117733622, 1020773629) + + W(7, -1114852932, -1119117496, 1045874226, -1120467144); + WS(1062974879, -1132215613); + sum1 = W(0, -1181157822, -1096960767, 1047884458, 1046591191) + + W(1, 1033235448, -1103300066, 1024586364, 1028472621) + + W(2, -1120645311, -1098273063, 1040665968, 1027902609) + + W(3, 1032693326, -1084817024, 1065496294, -1105457745) + + W(4, 1014937094, -1086871647, 1061273423, -1099580452) + + W(5, 1012846527, -1093312183, 1057013666, -1121668195) + + W(6, 1029466479, -1094276984, 1048826162, -1123904424) + + W(7, 1027727527, -1099477807, 1049029078, 1033797162); + sum2 = W(0, -1120861164, -1114727130, 1051943787, 1073213517) + + W(1, 1023555157, -1127207629, 1021361633, 1067585393) + + W(2, -1114715157, 1049207316, -1100379929, -1095215585) + + W(3, 1039733942, -1100512081, 1049204344, -1072102567) + + W(4, -1111876903, 1044392032, 1029680046, -1085077901) + + W(5, -1121732899, -1113639142, 1040523175, 1017790060) + + W(6, 1028106223, -1107243417, -1113800818, -1115100698) + + W(7, -1136150442, 1035475508, 1017564481, -1111101803); + WS(1038961915, -1122010239); + sum1 = W(0, 1004620105, 1048595660, -1099376311, -1116246236) + + W(1, -1113106351, 1052250558, -1096833644, 1027857155) + + W(2, -1112775210, 1058549636, -1088891129, 1036452944) + + W(3, -1125534724, 1061573929, -1086812373, 1040782707) + + W(4, -1137271196, 1057522353, -1093214133, 1018281129) + + W(5, -1126589322, 1048822826, -1095914356, -1113857108) + + W(6, 1026657556, 1040718305, -1105329661, 1010557432) + + W(7, -1119328748, 1048641524, -1103878453, -1106455448); + sum2 = + W(0, -1116580406, 1027562258, 1055923683, 1077914250) + W(1, 1024927837, -1162615720, -1098456431, 1064911462) + + W(2, -1129828931, 1047581344, -1107918233, -1076359256) + + W(3, -1115420496, -1109513493, -1093462217, -1072190840) + + W(4, 1011185933, 1038795182, 1043574176, 1023726209) + W(5, -1123989928, -1118168090, 1042713369, -1114062645) + + W(6, -1146345634, 1030671240, -1118222006, -1119388396) + + W(7, -1132229127, 1038841827, 1029869485, -1111766417); + WS(1058520191, -1103814144); + sum1 = + W(0, 1017038583, -1136595532, -1118053743, 1027978638) + W(1, 1027734728, 1016280509, -1128563239, -1097122909) + + W(2, 1045254802, -1109207324, 1044218638, -1104843131) + + W(3, -1107262661, 1062837304, -1096672636, 1033499055) + + W(4, -1105442246, 1058887264, -1085861660, 1025985831) + W(5, 1031430877, 1040464732, -1103880229, 1030848699) + + W(6, -1126950445, 1030731221, -1107144426, -1131329888) + + W(7, 1024536063, 1029953906, -1145128486, -1109411553); + sum2 = W(0, 1034702970, -1176551015, 1007931783, -1110263367) + + W(1, -1125598974, -1168898884, -1090251816, -1089294892) + + W(2, -1114553387, 1041527709, 1067159008, -1085860022) + + W(3, 1027536136, -1101298022, 1043575777, 1061443693) + + W(4, -1115924578, 1036785061, 1028484706, -1099982080) + + W(5, 1035052048, -1106074654, -1104273626, 1042454777) + + W(6, -1132148431, 1030578400, -1148595850, 1027614804) + + W(7, 1025333585, 1024211757, -1114791455, -1123742626); + WS(1061983711, -1098811342); + sum1 = + W(0, 1012577103, 1051270689, -1108510228, -1107438075) + W(1, -1126897281, 1046420622, -1106195699, -1107699151) + + W(2, -1105225996, 1058683087, -1088411008, 1036711743) + W(3, 1024253613, 1058369439, -1089548804, 1026749110) + + W(4, 1053413654, -1097514912, -1118840551, -1116819519) + + W(5, -1137207095, 1052214131, -1096732498, 1024709491) + + W(6, 1042674340, -1105013139, -1109015536, -1140694819) + + W(7, -1109172700, 1050302029, -1103000311, -1154413112); + sum2 = + W(0, 1018267361, 1036503366, -1126101987, -1099489904) + W(1, -1110181012, 1041828239, -1116783782, -1102883314) + + W(2, -1146613180, 1050199247, 1071387060, 1052019906) + W(3, 1038715850, -1085432172, -1080125372, 1047113133) + + W(4, 1024296823, 1038941240, -1093021050, 1035497971) + + W(5, 1036970119, -1123003584, -1114155200, -1112911441) + + W(6, 1022003098, 1013422114, -1149124484, -1119585859) + + W(7, -1124702635, 1021003447, -1143100940, -1131838862); + WS(1061194367, -1092415693); + sum1 = W(0, 1036390333, 1051201914, -1104881972, -1115149537) + + W(1, -1126263470, 1053058480, -1172862130, 1030237668) + + W(2, 1025725222, 1054554894, -1093268199, 1021350042) + W(3, 1043857157, 1047231542, -1076465248, 1036659934) + + W(4, 1035642972, 1057662314, -1087389459, 1039247491) + W(5, 1044002978, 1050872286, -1093150623, 1026362746) + + W(6, 998479342, 1045022613, -1111846627, 1017611295) + W(7, 1045699251, 1049392206, -1095910796, 1018350484); + sum2 = W(0, -1129487679, 1018376667, -1097777178, -1117386048) + + W(1, 1042193002, -1087595144, -1098446206, -1106566736) + + W(2, -1108339354, 1054016721, -1106280983, -1108034123) + + W(3, -1095819059, 1063707892, 1068295659, -1104582586) + + W(4, 1041127864, 1036978867, 1052165187, -1102127104) + + W(5, -1103499785, -1103064253, -1110264861, 1036459063) + + W(6, 1034257999, -1103241982, -1135489703, -1104779766) + + W(7, -1118637794, -1112191100, -1107248782, 996655259); + WS(-1094699455, 1066131816); + sum1 = + W(0, 1049793485, -1081848423, 1059460685, 1042128105) + W(1, 1029004921, -1088299640, 1048637514, -1139594888) + + W(2, 1050253240, -1084057276, 1060796209, 1026023615) + W(3, 1043166228, -1084821317, 1059873140, 1020508084) + + W(4, 1029407446, -1084563631, 1055943200, -1125172935) + W(5, 1041612884, -1104203619, 1047596309, 1048504406) + + W(6, 1035949114, -1099802604, 1050483936, -1115227886) + + W(7, 1012128942, -1096241030, -1105809528, 1051471881); + sum2 = + W(0, 1060779432, 1051802488, -1086062785, -1114203174) + W(1, -1118034101, -1097493973, 998397725, -1112558489) + + W(2, -1104519356, 1057101737, -1092333837, -1099984065) + + W(3, -1119327164, 1060027297, 1066349798, -1091352583) + W(4, -1101970936, 1044004337, 979464170, -1094257268) + + W(5, -1106905521, 1057962293, -1133317807, -1102635709) + + W(6, 1002331293, -1098665363, 1046794021, -1094504499) + + W(7, -1082144605, -1086721729, 1070824403, -1114333706); + WS(-1074268304, 1079667699); + sum1 = + W(0, -1107189325, -1101508903, 1054199089, 1035260131) + W(1, 1027760991, -1090199334, 1054303683, -1107632246) + + W(2, -1136873402, -1090363950, 1062422475, 1005391451) + + W(3, -1113641470, -1087996124, 1067750847, -1101800081) + + W(4, 1031162561, -1083961527, -1113534839, 1034855959) + W(5, 1033891144, -1096484091, 1052689284, 1046337921) + + W(6, -1126712892, -1098094611, 1031942551, -1150999418) + + W(7, 1035917755, -1093567651, 1045977323, 1042992013); + sum2 = + W(0, -1109104193, -1100757902, 1040683096, -1125509919) + W(1, -1121805095, 1045040397, -1125556022, 1026278254) + + W(2, 1045986101, 1080470972, 1049174250, -1112163985) + W(3, 1048674700, -1080397282, -1095181876, 1050380898) + + W(4, -1091901802, -1070026310, -1122013099, -1131668233) + + W(5, 1048446997, 1054845861, -1110936398, 1033243862) + + W(6, -1113936425, -1109557127, 1038355211, -1144282357) + + W(7, 1027039508, -1113850952, -1103996340, 1036778147); + WS(-1085238047, -1082053459); + sum1 = W(0, -1106787663, 1039996894, 1048926451, -1104330662) + + W(1, -1138285833, 1010512412, -1119213276, -1128637723) + + W(2, -1108632776, 1053399812, -1130975030, -1108017347) + + W(3, -1094657608, 1045540841, 1010216242, -1096910157) + + W(4, -1101713608, 1051732998, 1034301867, -1101323868) + W(5, 1037328759, 1044326914, 1025236158, 1015829447) + + W(6, -1111697288, 976543556, -1128978334, -1111437732) + + W(7, -1109379868, 1057105320, -1109745879, -1108664266); + sum2 = + W(0, -1124623913, 1025825838, 1042257288, 1021162350) + W(1, 1032956443, -1119700813, -1135835500, -1114452863) + + W(2, 1027185909, 1032253087, 1053804277, -1109212782) + W(3, -1101336864, 1046009611, 1048892371, -1102267892) + + W(4, -1094263361, 1060071017, 1036906607, -1105958464) + + W(5, 1029736763, -1108021530, -1101254223, 1037505372) + + W(6, -1112090109, -1111711122, -1115069322, 996911332) + + W(7, 1039412150, -1092338318, -1114145526, -1125671849); + WS(1060867039, -1136390908); + sum1 = + W(0, -1127355032, -1085412379, 1049179798, 1047055468) + W(1, 1034805910, -1094311080, 1049208039, -1108149971) + + W(2, 1035163860, -1093352008, 1060583566, 1036232649) + W(3, 1029669941, -1084691216, 1063283264, -1103012671) + + W(4, 1042066222, -1088428116, 1058522472, 1024178471) + W(5, 1021674692, -1088125293, 1055147879, 1026233836) + + W(6, 1040577786, -1096644095, 1050065089, -1126656770) + + W(7, 1021261983, -1091872390, 1041474713, 1049799631); + sum2 = W(0, 1035672114, -1063752230, -1093487673, 1013645866) + + W(1, -1098827199, -1085747691, 1041803367, 1034418818) + + W(2, 1049155846, 1077059336, 1041184099, -1106855503) + W(3, 1035178389, 1075347264, -1096808218, 1049524211) + + W(4, -1107113032, 1056308660, -1129382302, -1122362105) + + W(5, -1144855824, 1034654874, -1119639669, 1030856901) + + W(6, 1035201737, -1121418857, -1122522987, 1027103888) + + W(7, -1127184278, 1014935340, 1011408026, -1115004359); + WS(-1090674303, -1100343233); + sum1 = W(0, -1120232797, -1091881416, 1051419109, 1036288004) + + W(1, 1040422273, -1094093465, 1052500896, 1023553551) + + W(2, 1026412864, -1085938046, 1061270771, -1112170192) + + W(3, -1138867958, -1089254334, 1067891162, -1115349187) + + W(4, 1033879777, -1089797193, 1060067146, -1112030904) + W(5, 1033565615, -1085407367, 1016645247, 998486818) + + W(6, 1019476032, -1095206984, 1041715172, 1027103050) + W(7, 988102399, -1105032111, 1036835111, 1040345019); + sum2 = W(0, 1040618154, -1101425729, 1012698939, -1121139419) + + W(1, -1114130867, 1043012943, -1135257643, 1033653009) + + W(2, -1122148687, 1049717343, 1047429512, 1038119907) + W(3, 1044229537, 1078734719, 1020747990, -1131387750) + + W(4, -1110193301, 1058416067, 1045573328, -1162837210) + + W(5, -1097134960, -1066172228, -1105653505, -1124290574) + + W(6, 1037070268, -1087270128, -1098650023, -1142454518) + + W(7, 1037459780, 1051160418, 1029335953, -1119987003); + WS(-1083751903, -1076119444); + sum1 = W(0, -1115245576, 1056842307, -1093345814, -1108216057) + + W(1, -1106029427, 1054460828, -1096614035, -1118873130) + + W(2, -1102084379, 1062160243, -1087844584, 1032187759) + + W(3, -1113929101, 1061549380, -1088621915, -1118044066) + + W(4, -1115339007, 1051628466, -1095344475, -1125935063) + + W(5, 1029734646, 1034628298, 1039622221, -1114025640) + + W(6, -1110488366, 1040780998, 1023285463, -1103117229) + + W(7, -1147960477, 1027250487, 1052549785, -1101242061); + sum2 = W(0, -1142266798, 1041896729, -1109207785, -1116438034) + + W(1, -1105635988, -1133541327, -1119640286, -1143926222) + + W(2, -1108468488, 1052249127, -1132044399, -1116983273) + + W(3, -1104742183, 1059101684, 1057719514, -1107716245) + + W(4, 1004562934, -1116644500, 1049160976, 1036001553) + + W(5, -1111519795, 1022626513, 1040987637, -1093640310) + + W(6, 1009402627, 1036478091, -1103527129, -1115139384) + + W(7, 1007186587, -1114250343, -1094402391, -1102449905); + WS(1032624635, 1033521535); + sum1 = W(0, -1131553039, -1098906814, 1051615627, 1045470610) + + W(1, -1117491096, -1100587359, 1047570260, 1025984961) + + W(2, -1112834618, -1081513385, 1060987922, 1036113314) + + W(3, 1049918570, -1078593782, 1043587024, 1040182861) + W(4, 1045795365, -1105649745, 1056209202, 1012071435) + + W(5, 1016822387, -1092053629, 1059398075, 1032631435) + W(6, 1035361729, -1096260814, 1049440024, 1023888652) + + W(7, -1113168565, -1095243062, 1051600524, 1034850724); + sum2 = W(0, -1111826236, -1092384767, -1095745094, 1034661269) + + W(1, -1099208280, 1027875109, -1100947515, 1048636172) + + W(2, 1026789677, 1064661507, -1112642295, -1098451609) + + W(3, -1106561040, 1062273543, 1068550638, -1099981129) + + W(4, -1093448876, -1087164405, -1104229197, -1118651857) + + W(5, 1046407154, -1108191451, -1106740917, 1049739863) + + W(6, -1102666308, 1044380270, -1103404028, -1095995165) + + W(7, 1042570396, -1104593420, -1105841536, 1048025970); + WS(-1085606847, 1061985400); + sum1 = + W(0, -1108997980, -1089905075, 1057688104, 1040581229) + W(1, -1117164584, -1114895517, 1056544190, -1114811305) + + W(2, 1031768707, -1095264598, 1062390314, -1107526493) + + W(3, -1103105924, -1077801587, 1055481056, -1110202349) + + W(4, 1041900981, -1097956992, 1062127874, -1118208771) + + W(5, -1110420181, -1088999487, 1051900674, -1108027100) + + W(6, 1037113665, -1098379486, 1048102065, 1024450541) + W(7, 1014163116, -1096151518, 1057425872, 1041210774); + sum2 = W(0, 1025785873, 1048760593, 1035955606, -1126760968) + + W(1, 1048912334, -1090084783, -1119218892, 1008603006) + + W(2, -1096464036, -1114768213, 1007739746, -1094704139) + + W(3, 1056133856, 1066763200, 1064934573, -1080670875) + + W(4, -1104154812, -1086306359, -1089946445, 1031309677) + + W(5, -1121968309, 1058187354, 1050702067, -1125625514) + + W(6, 1033410161, -1113492694, 1025685973, -1109240237) + + W(7, 1015120151, -1128581905, -1102128709, 1039335694); + WS(-1090966143, -1078936607); + sum1 = W(0, -1116393227, -1086961670, 1058706816, -1116819366) + + W(1, -1108278025, -1108945587, 1041859343, 1035952359) + + W(2, 1051625062, -1086695325, 1060094467, 1041797992) + + W(3, -1105522375, -1081986687, 1059190367, -1104043025) + + W(4, 1058727904, -1089148367, 1061098519, 1053094890) + + W(5, -1091195697, -1086453117, 1055062080, -1093101306) + + W(6, 1052016408, -1092689140, 1056115606, 1015960496) + + W(7, -1109728971, -1091172115, 1058930855, 1034498693); + sum2 = + W(0, 1023528661, -1118025227, 1075422545, -1073269716) + W(1, -1119417071, 1050920275, 1065042273, -1077701631) + + W(2, -1105978590, -1112399565, 1069638520, -1078616397) + + W(3, 1009798795, -1098493686, 1067662601, -1083676116) + W(4, 1040834561, 1036263434, -1093932676, 1044144047) + + W(5, -1111364082, -1124489419, -1079439326, 1070390370) + + W(6, 1041397121, 1048582480, -1078082886, 1068400636) + + W(7, 1033368796, -1089345484, -1070108577, 1077727906); + WS(-1079921856, 1049308945); + sum1 = W(0, 1030068962, -1165865787, -1187780005, 1025440517) + + W(1, -1133949626, -1118082277, -1108803021, -1111921110) + + W(2, 1050882798, 1053008345, 1038634079, -1120535059) + + W(3, 1018623990, -1094507016, -1106873963, -1104818073) + + W(4, -1106924392, 1052481994, -1087778738, 1046575523) + + W(5, -1146454049, 1043504665, -1101591143, 1041667424) + + W(6, -1116987117, 1047635255, -1101174683, 1031519031) + + W(7, 1040905769, 1026870489, -1110197734, 1031554658); + sum2 = + W(0, -1116556974, 1059176005, -1096412953, -1114011261) + W(1, -1095066961, 1038856572, 1050790436, -1173649795) + + W(2, -1100395256, -1076691076, 1058179896, 1024138419) + W(3, 1050308919, 1055715442, -1097771226, 1040413046) + + W(4, 1040792410, 1046498927, 1039711359, -1106323994) + W(5, 1032406727, -1123959066, -1106160519, 1033840078) + + W(6, 1011901446, 1028959950, 1018212767, -1127468978) + + W(7, -1141998384, 1032868606, 1038360912, -1107910389); + WS(1060842367, -1123947436); + sum1 = + W(0, 1024730985, 1048950736, -1097448124, -1122548355) + W(1, 1023159627, 1047784339, -1098772880, 1026072115) + + W(2, -1105241169, 1057388094, -1087773444, 1037590622) + W(3, 1017803651, 1060112037, -1085451727, 1037652837) + + W(4, 1037913699, 1062491953, -1088044111, 1034810634) + W(5, 1035962309, 1057656339, -1089872870, 1033785172) + + W(6, 1028045772, -1114528913, -1102522557, 1008900343) + + W(7, 1032728670, 997860858, -1103124285, -1114288296); + sum2 = W(0, 1026131421, 1001103237, -1133854939, -1114822986) + + W(1, -1112740722, -1121600279, 1038637096, -1108393699) + + W(2, 1046858645, -1108221277, 1037424280, 1029862733) + + W(3, 1032928238, -1097923247, -1103185020, -1101308237) + + W(4, 1042166107, 1069212508, -1120290433, 1036213344) + W(5, 1040344552, 1057336110, 1019342369, -1145606165) + + W(6, -1082879617, -1095628134, 1039461314, -1111520861) + + W(7, -1091819295, -1107037379, -1122429445, 1034167562); + WS(1038606587, 1058047160); + sum1 = + W(0, 1026865207, -1095018974, 1044423619, -1136300775) + W(1, 1042118304, -1093024127, 1048945010, -1117800769) + + W(2, 1051307036, -1082724754, 1054092644, 1005722288) + W(3, 1033639368, -1100730470, -1097872036, 1044405134) + + W(4, 1046742309, 1036658562, -1091674216, 1047528601) + W(5, -1109598961, 1040951763, 1033100505, 1044812414) + + W(6, 1028927539, -1113143704, 1030352835, 1032954286) + W(7, 1015037525, -1098528366, 1047837568, 1044220906); + sum2 = W(0, 1050657429, 1045860939, -1111592920, -1103122208) + + W(1, -1103301852, 1052242374, 1013554208, -1106328874) + + W(2, 1060573163, -1100974944, -1111727364, 1015168980) + + W(3, -1091436731, 1066745360, 1055083328, -1113723980) + + W(4, -1104427284, -1079344782, -1098647652, 1051192034) + + W(5, -1097267636, -1113016512, 1034990326, 1034643320) + + W(6, 1038196249, -1119497008, -1110499846, -1122594772) + + W(7, -1107511544, -1113648424, 1042188938, -1140986496); + WS(-1095257599, 1052962039); + sum1 = + W(0, -1106746181, -1097695335, 1053309708, 1036635571) + W(1, 1031300369, -1111219488, 1042046133, 1032102291) + + W(2, 1046667354, -1083536631, 1060606673, -1110849586) + + W(3, 1037361867, -1088861218, 1053570633, -1103814096) + + W(4, 1040829967, -1107201338, -1101583222, -1130665360) + + W(5, -1128966365, -1115618056, 1033575580, 1023220920) + W(6, 1034540700, -1117058422, 1029127944, 1009452933) + + W(7, -1115420664, -1138753100, 1041019129, 1041468947); + sum2 = W(0, -1137205193, -1089705070, -1116057142, -1106134583) + + W(1, -1121249932, 1025195792, 1014073009, -1131583764) + + W(2, -1137006201, 1049206515, 1040872535, 1023734245) + W(3, -1101149788, 1054529493, 1044729510, 1030258377) + + W(4, 1034796937, 1039074115, 1024555690, 1045578999) + W(5, -1115985020, 1050074620, -1108168105, 1041497164) + + W(6, -1140489533, -1104546681, -1105229574, -1131316168) + + W(7, 1026538132, -1103055048, -1093226929, 1036128894); + WS(1058062751, -1100017341); + sum1 = + W(0, -1129599006, 1055064995, -1094744478, -1110864465) + W(1, 1020928695, 1054737968, -1108714620, 1035506764) + + W(2, -1098371705, 1061839865, -1089137095, -1103907470) + + W(3, -1111175932, 1057524464, -1081607655, -1115102560) + + W(4, -1108928286, 1062722401, -1111400813, 1038105413) + + W(5, -1108487635, 1039434185, -1089739654, -1103382940) + W(6, 1028685770, 1053936411, 1037008853, 1038153674) + + W(7, -1134533769, 1054765971, -1094983833, -1101904010); + sum2 = + W(0, 1046625968, 1034733544, -1147999170, 1026537136) + W(1, -1114205611, -1100522159, -1093312378, -1103988998) + + W(2, -1097342682, 1034693600, 1057288295, 1049229753) + W(3, -1079666171, 1066071967, 1059803421, -1114956972) + + W(4, 1041595755, -1087077400, -1088579916, -1104980683) + W(5, 977545170, 1062799024, 1057064650, 1050850828) + + W(6, -1106070846, -1097179722, -1086854504, 997711860) + + W(7, -1145403458, 1015933409, 1055355590, -1115357129); + WS(1033636603, -1075190676); + sum1 = W(0, 1030520392, 1051253486, -1096251285, -1117233131) + + W(1, -1125697208, 1043969999, -1100430004, -1122877346) + + W(2, -1114269946, 1058583983, -1085953223, 1036037681) + + W(3, -1109653337, 1064791929, -1093290764, -1109909101) + + W(4, -1102211630, 1057642082, -1088005167, -1123582788) + + W(5, 1032435172, 1055881859, -1098086422, 1029223000) + + W(6, -1120127764, 1033241689, -1102333361, -1125435099) + + W(7, 996293820, 1053053914, -1119839106, -1103406294); + sum2 = + W(0, -1120200303, -1113787644, -1109535466, 1041916719) + W(1, 1024626781, 1041562727, -1106166077, 1028143351) + + W(2, 1013431061, -1114475538, 1029531851, -1097688999) + + W(3, -1124733431, -1112371618, 1051805575, 1068535590) + W(4, 1027814217, 1032748777, 1061661699, 1074776935) + + W(5, 999438554, -1098117165, -1114245048, 1029048009) + W(6, -1116912567, 1042886038, 1039886302, -1076933565) + + W(7, 1007930813, -1140542509, -1093997696, -1072079702); + WS(1051996799, 1040628126); + sum1 = + W(0, -1106876926, -1096999331, 1064227732, 1032518006) + W(1, 1042171100, -1106536569, 1056769919, -1132737450) + + W(2, 1014013938, -1087433914, 1057736892, -1121739327) + W(3, 1040804174, -1079279688, 1052514885, 1035728257) + + W(4, 1038633599, -1085040172, 1059334684, -1115112214) + + W(5, 1024260165, -1090750082, 1058371760, -1126170017) + + W(6, 1032103150, -1096245875, 1051111478, -1129820331) + + W(7, -1111941370, -1091794355, 1050507101, 1036168684); + sum2 = W(0, -1097197656, -1105938617, -1063141508, 1047663602) + + W(1, 1040517176, -1119182790, -1072247475, -1106333570) + + W(2, -1107105879, 1048788314, 1073986693, 1017343300) + W(3, 1050425804, 1048225474, 1082212097, 1014706728) + + W(4, -1108102513, 1050055380, 1063649950, 1023560998) + + W(5, 1044838414, -1097162220, -1108483496, -1105252179) + + W(6, 1026907274, 1028263310, 1040597170, 1016727612) + W(7, 978890108, 1043193320, -1096883524, 1025416282); + WS(-1079662656, 1075711984); + sum1 = W(0, -1136749190, 1054381451, -1099895821, -1111920714) + + W(1, -1108214827, 1049467004, -1104318006, -1124862997) + + W(2, -1112256994, 1060357369, -1094055613, -1099490085) + + W(3, -1102094902, 1064079536, -1088977984, -1093653775) + + W(4, 1019461885, 1058102849, -1094018397, 1047054555) + + W(5, -1113236619, 1050217386, -1093377643, 1026036560) + + W(6, -1115387518, 1046694646, -1102869707, -1122648846) + + W(7, 1015637672, 1053154499, -1097489705, -1117787456); + sum2 = + W(0, 1021596406, -1120307380, 1037868882, -1094559059) + W(1, 1027700788, 1049653321, 1038499992, -1099826066) + + W(2, 1031902674, -1100871897, 1074972319, -1070411479) + W(3, 1035450862, 1054975194, 1073269037, -1076192259) + + W(4, -1146279384, -1106853601, 992333684, 1024067187) + W(5, 1036068426, 1042197470, 1032586692, -1107184127) + + W(6, -1108044351, 1034125536, -1129244749, 1032061183) + + W(7, 1030087008, -1133477273, 1010404410, -1104237818); + WS(-1121360374, -1077155152); + sum1 = W(0, -1105583845, -1092428892, 1053987635, 1036329976) + + W(1, 1042009047, -1091586093, 1057449542, 1039912928) + + W(2, -1135496901, -1087526962, 1037542524, -1114441548) + + W(3, 1057317824, -1088356100, 1067018703, 1035631092) + W(4, 1037107234, -1084718223, 1053143538, 1024846769) + + W(5, 1028773828, -1086275726, 1051794540, 1020991498) + W(6, 1042777544, -1096882940, 1049337758, 1032759069) + + W(7, -1116736729, -1086839898, 1050512766, 1041911145); + sum2 = W(0, -1122349048, -1108922684, -1102817435, 1024154790) + + W(1, 1027223630, 1050237475, 1047134367, -1105600910) + + W(2, -1123059666, -1093984844, -1086242189, 1041276041) + + W(3, -1097496437, 1061603028, 1069845393, -1090292072) + + W(4, -1101147358, 1054912466, -1091188340, -1122818012) + + W(5, 1008041239, -1136134543, -1107987422, -1109079234) + + W(6, -1113710228, 1050990810, -1126348732, 1047206075) + + W(7, -1103013196, 1037079763, -1097181289, -1109791787); + WS(-1087087711, 1067831143); + sum1 = + W(0, 1034272753, -1110686621, 1034360523, 1006467012) + W(1, 1043354114, -1094089577, 1051348739, -1097882829) + + W(2, 1046815315, -1090322161, 1056352764, -1098171061) + W(3, 1041026663, 1019000899, 1049291409, -1099191041) + + W(4, -1116058688, 1048378971, -1098372646, 1036956791) + + W(5, -1131457456, 1054466495, -1090870248, 1036945505) + + W(6, -1115558139, 1045446607, -1103803571, -1124941614) + + W(7, 1032034947, 1043401342, -1098529593, 1026141794); + sum2 = W(0, 1046033632, -1147554302, 1021728539, 1034466187) + + W(1, -1114282503, 1065651536, 1061103542, -1117467216) + W(2, 1044655964, 1052996561, 1047372498, 1040544990) + + W(3, -1106001859, -1076523823, -1081697027, -1105745303) + + W(4, -1104436397, -1095873418, -1094800655, -1119054372) + + W(5, -1101664028, 1059971501, 1058036758, -1110996319) + + W(6, 1015764662, 1037179306, -1113369666, -1120190386) + + W(7, 1023732858, -1119149512, 1033040332, 1028498617); + WS(1040537598, -1164677141); + sum1 = W(0, 1044447583, 1058921623, -1079854668, 1051360885) + W(1, 987031402, 1052904912, -1089009751, 1009017491) + + W(2, -1121775302, 1059494147, -1082135643, 1049103971) + + W(3, 1042738997, 1059765434, -1085199868, 1042102879) + W(4, 1038434732, 1053249925, -1087718171, 1037325507) + + W(5, 1049696256, 1045203303, -1094593271, 1033340813) + W(6, 1024826006, 1049549231, -1098502833, 1040792940) + + W(7, 1044766000, 1032179929, -1111725730, -1103499809); + sum2 = W(0, -1105450770, -1076904032, 1034745372, 1064235564) + + W(1, -1099930216, -1110661913, -1104228342, -1133206564) + + W(2, -1087670985, 1054929191, 1055270313, -1159337186) + + W(3, -1097641768, 1067640588, 1058849806, -1095527236) + + W(4, -1093727900, 1043325457, 1055379319, -1097371942) + + W(5, 1034849198, 1041628489, 1047258529, -1123329564) + + W(6, -1089823109, 1024934811, -1091022953, 1053074558) + + W(7, 1026936119, 1071055811, -1093861556, -1079977593); + WS(-1072228928, 1076959210); + sum1 = W(0, 1049440860, -1102211417, 1052420434, 1046258910) + + W(1, -1100954468, -1090494943, 1049042513, -1094165323) + + W(2, 1040518102, -1089397123, 1057628335, -1113742940) + + W(3, 1055014377, -1085929645, 1059399711, -1115570152) + + W(4, -1102413547, -1092416799, 1055649007, -1095616949) + + W(5, 1056933930, -1103710088, 1056457065, 1054320058) + + W(6, -1100924366, -1099959722, 1043274798, -1096288332) + + W(7, 1025160513, -1097219837, 1043339918, -1113497047); + sum2 = + W(0, 1037249746, -1091193116, 1058952598, -1099278743) + W(1, -1106259401, 1057292562, -1089499743, 1035766214) + + W(2, -1118512137, 1045032769, 990544085, -1120311473) + W(3, 1033553146, -1101074553, 1052938455, -1107284433) + + W(4, -1118437421, 1047290760, -1096914685, 1032001159) + + W(5, 1049532353, -1085599381, 1060306657, -1105441959) + + W(6, -1112295163, 1045403080, -1095081062, 1037527897) + + W(7, -1112769969, 1036239865, 1036770528, -1117837555); + WS(-1095248895, -1088416713); + sum1 = W(0, 991086878, -1112623265, 1049658160, 1025280780) + W(1, 1041397006, 1023033498, -1129854724, 1018002536) + + W(2, -1100414321, -1095527100, 1056723856, -1101036339) + + W(3, -1106522737, -1085500137, 1061179113, -1098081679) + + W(4, 1032194452, -1103431285, 1050067968, -1121954805) + + W(5, 1040515607, -1093888960, 1055178889, 1040437430) + + W(6, -1113785099, 1025813699, 1027165141, -1107604207) + + W(7, -1119710941, -1112974208, 1044420741, -1122583614); + sum2 = W(0, -1115281709, 1049351198, -1101546004, -1132663474) + + W(1, 1038308115, -1105447726, 1044927538, 1036918381) + + W(2, -1086190321, 1061131477, -1105825160, -1104633062) + + W(3, -1079410563, 1070791012, -1124003323, 1035199903) + + W(4, 1055352031, -1080774986, 1054621998, -1119052371) + + W(5, -1106071111, 1050939464, -1100497740, 1038597174) + + W(6, 1042421121, -1096576742, 1042910101, -1126972585) + + W(7, 999244165, 1021655353, -1123561791, -1141223925); + WS(1057802399, -1081431823); + sum1 = W(0, -1122831751, -1093480916, 1050038833, 1031929377) + + W(1, -1131892376, -1097592621, 1050095280, 1003466633) + + W(2, 1041203877, -1087992005, 1058335651, -1150646211) + + W(3, 1034931072, -1086955360, 1062569267, -1108251076) + + W(4, 1020249162, -1094219074, 1052617634, -1123920403) + + W(5, 1023514439, -1099624791, 1053253320, -1110979235) + + W(6, -1183605377, -1104094712, 1037479577, 1022403704) + + W(7, -1102408215, -1103351679, 1047799764, 1031403703); + sum2 = W(0, -1104748298, 1032567526, 1030425414, 1028805714) + W(1, 1035677532, 1015597088, -1106402955, 1010146816) + + W(2, -1097271446, 1042180726, 1036072793, -1122721452) + + W(3, -1071563129, -1131466492, 1026492053, -1139412188) + + W(4, -1073203825, -1088097679, 1021201077, -1121571686) + + W(5, -1105574565, 1049167232, 1046304011, 1013464552) + + W(6, 1074066983, -1104411749, -1108010622, -1115684312) + + W(7, 1076846054, 1054919113, 1040423027, -1159010626); + WS(1057159391, -1098185256); + sum1 = + W(0, -1115997840, 1062337777, -1099145229, -1108105457) + W(1, -1139848194, 1059107990, -1096884471, 1026934458) + + W(2, -1110900998, 1058844902, -1083284577, -1128707950) + + W(3, 1040272534, 1060188982, -1081840204, 1050661700) + W(4, -1124007614, 1050305613, -1086268415, 1025671020) + + W(5, 1022311680, 1055455830, -1088086212, 1018441343) + W(6, -1122049771, 1052112283, -1093503993, 1032949738) + + W(7, 1025640163, 1058488623, -1095187909, -1115150240); + sum2 = + W(0, 1056249112, -1063663228, -1090194820, -1098679170) + W(1, -1087901783, -1065703489, 1049313091, 1049727089) + + W(2, 1050240307, 1050922399, 1059446328, -1118968312) + W(3, -1096100666, 1074103439, -1091782161, 1043947681) + + W(4, 1050011361, 1078895155, 1051412884, -1103451878) + W(5, 1046757851, 1075028289, 999915799, 1046896549) + + W(6, -1111613200, 1011769164, -1097222567, 1036070334) + + W(7, 1031802636, 1041242105, 1040180956, -1120669738); + WS(-1076050352, 1072169512); + sum1 = + W(0, -1112010473, -1127017300, 1032805651, -1127012698) + W(1, -1110549812, -1096217239, 1055039585, 1017026201) + + W(2, 1041474168, -1101316183, -1107675851, 1027743346) + + W(3, -1102358403, -1098236010, 1058693100, -1103052317) + + W(4, 1035256808, -1097462672, 1050718238, 1025923518) + W(5, -1103941101, 1015309803, 1047069339, -1108585145) + + W(6, -1126807163, -1109990262, 1040782175, 1029935559) + + W(7, -1127729580, -1124828306, 1033573870, 1030091394); + sum2 = + W(0, -1115222730, 1013406324, 1048651312, -1105744683) + W(1, -1103808603, 1044516259, -1091636530, 1036643390) + + W(2, -1133607278, 1056099238, -1082257366, 1056116581) + + W(3, 1035011293, -1093760521, 1065398243, -1087652578) + + W(4, 1045426354, -1097063741, 1052543946, -1106429625) + W(5, 1005150868, 1046105407, -1105190986, 1031045850) + + W(6, 1038138903, -1106358807, -1143243436, -1129675875) + + W(7, 1014354189, 1034790704, -1124610775, 1033997397); + WS(1065781680, 1039008007); + sum1 = + W(0, 1041247860, 1052873269, -1087848896, -1122380132) + W(1, -1132228043, 1052030887, -1090939837, 1043969975) + + W(2, -1116017645, 1057769989, -1086321043, -1167945460) + + W(3, 1029031978, 1065817909, -1090130600, 1043124941) + W(4, -1114552992, 1059292430, -1093123180, 1037414446) + + W(5, 1018467582, 1052683781, -1089813139, 1037105136) + W(6, -1119698444, 1045381867, -1093950448, 1016187596) + + W(7, 1039500994, 1042767258, -1088918334, -1139723011); + sum2 = W(0, 1038177586, -1105284792, -1114385091, 1023745983) + + W(1, 1024852101, -1131141686, -1105200928, 1044997454) + + W(2, 1031995320, -1123455081, 1057384109, -1102654886) + W(3, 1016571646, 999573799, 1073904332, 1045931554) + + W(4, 1033741319, -1107419527, 1075963065, -1113399825) + + W(5, -1108656521, 1052574782, -1130292726, 1041285787) + + W(6, 1035134998, -1099142208, -1072886122, -1101763500) + + W(7, -1120710323, -1103717942, -1070457563, 1044467987); + WS(-1090516543, -1087531312); + sum1 = W(0, -1105337757, 1040358473, 1026287071, -1112133319) + + W(1, -1135375282, 1025750638, -1109155234, 1043065477) + + W(2, -1113059195, 1034124454, -1111070925, 1049735832) + + W(3, -1111479074, -1082649657, -1113637434, 1048811350) + + W(4, 1044282546, -1098312091, 1056333811, -1104740686) + + W(5, 1036163039, -1114570479, 1044131649, -1111303053) + + W(6, -1123738614, -1112260786, 1049914271, -1128712224) + + W(7, -1110047807, 1044483760, 1039433994, -1136462731); + sum2 = W(0, -1122757257, 1027164873, 1002742314, -1111953049) + + W(1, 1009904581, -1112829049, -1115430893, -1116391321) + + W(2, -1113467627, 1020364514, -1098221748, 1025748661) + + W(3, -1099518373, 1064179702, 1059311413, -1098741962) + + W(4, 1032421699, -1092934445, -1139891301, 1036551469) + + W(5, -1095677862, 1039050377, 1041708988, -1119491053) + + W(6, 1020800146, -1106885375, -1124766450, 1025848261) + + W(7, -1112743661, 1022655162, 1032689603, -1122814953); + WS(1059528063, 1057564569); + sum1 = W(0, 993737087, -1096201122, 1052073475, 1036364765) + W(1, 1023855952, -1112481934, 1044928820, -1119101474) + + W(2, 1051519336, -1089271861, 1057871347, 1026047377) + + W(3, -1100822612, -1101379550, -1090210244, -1095066725) + + W(4, 1027584566, -1129312776, 1027452795, 1043887545) + + W(5, -1109486813, -1101173547, 1051680014, 1038809676) + + W(6, -1127107174, 1031993577, 1038521522, -1152581582) + + W(7, 1035631854, -1097162722, 1050823828, 1037595092); + sum2 = + W(0, -1106514375, -1115270098, 1025588625, -1109616345) + W(1, 1034094594, 1029678117, -1103891997, 1044342701) + + W(2, -1112949179, -1095879627, 1029083209, -1107320484) + + W(3, 1009317700, 1052560633, 1062070608, -1103446924) + + W(4, -1126355148, -1128108776, -1100067512, -1131810302) + + W(5, 1021633582, 1034084538, 1035054672, -1098743078) + W(6, 1010987268, 1040297892, -1117785257, -1123491293) + + W(7, -1106252693, 1049223604, 990783407, -1102218346); + WS(1061977215, -1122204685); + sum1 = + W(0, -1124031333, 1053794732, -1090279300, 1017895407) + W(1, -1109554099, 1053305789, -1096176108, 1027213295) + + W(2, -1105250724, 1058003360, -1093816822, 1024566052) + W(3, 1036027519, 1059361796, -1081723655, 1033714163) + + W(4, 959521497, 1055117810, -1090510080, -1125004641) + W(5, 1055353398, 1051669497, -1097892492, 1006220452) + + W(6, 1038275624, 1037705519, -1101480172, -1112881733) + + W(7, -1136942561, 1047158647, -1098784634, -1145512357); + sum2 = W(0, -1113155109, 1028856727, 993552399, 1036996819) + W(1, 1032430477, 1021325630, -1128331832, -1139715524) + + W(2, -1105712018, 1050891972, 1042508384, -1111526035) + W(3, 1048044904, 1070862297, 1042132916, 1040898786) + + W(4, -1081128362, 1074403261, 1044319918, 1025048067) + + W(5, -1070110178, 1035516985, -1115800491, 1038841221) + + W(6, -1092435520, -1108990845, 1033559089, -1119663830) + + W(7, -1092804751, -1122256510, -1109033129, 1007165668); + WS(-1096328959, 1070879408); + sum1 = W(0, 1047483149, 1056909741, -1084253114, 1043610432) + + W(1, -1131726569, 1050717891, -1097194674, -1120381614) + + W(2, 1017405984, 1049879450, -1084428714, 1029856307) + W(3, 1016192218, 1064784543, -1088019878, 1046790989) + + W(4, -1134185032, 1054175424, -1087922381, 1044095416) + + W(5, -1130210629, 1055866677, -1096076442, -1106891777) + + W(6, 1039283496, 1052923070, -1098682228, 1045347898) + + W(7, 1022798351, 1050331269, -1089646420, -1103492015); + sum2 = + W(0, -1096731787, -1092572599, -1072213302, 1074300082) + W(1, 1041094096, -1083918511, -1081783724, 1061218424) + + W(2, 1030029833, -1081752188, -1088492050, 1062246408) + + W(3, -1134738767, 1050600846, -1098909280, 1055931246) + W(4, -1112066554, 1060518769, 1054813136, 1030722387) + + W(5, 1049526473, 1056806956, 1066457366, -1080408758) + W(6, -1103571503, 1052566197, 1061557517, -1082314750) + + W(7, 1038503381, 1040255570, 1074348460, -1074863778); + WS(-1093955647, 1022010191); + sum1 = + W(0, 1027472455, 1051129150, -1126583382, -1110971745) + W(1, -1118029508, 1040858863, -1110637352, -1129027011) + + W(2, 1017520774, 1058284788, -1083829535, 1043546956) + W(3, -1100976252, 1064764899, -1092969620, 1032062845) + + W(4, 1048038797, -1094249656, -1093269900, 1049944248) + + W(5, 1019653215, 1054989120, -1098669306, -1114080636) + + W(6, 1015004427, -1137681219, -1101321193, 1039113958) + + W(7, 1006149335, 1047833420, -1092663640, -1120661351); + sum2 = + W(0, -1125700855, -1109340305, 1041739108, -1138307987) + W(1, 1010923567, -1099241242, -1121076246, 1010348245) + + W(2, -1097524591, -1097784845, -1122648580, 1043843262) + + W(3, -1086770251, 1061340682, 1059475190, -1104554020) + + W(4, -1119687254, -1091236020, -1097965354, 1042867821) + + W(5, -1136610695, 1059369820, 1048517727, -1105357691) + W(6, 1034141799, -1103210716, 1020884025, 1021404807) + + W(7, -1146172877, 1042204527, -1117941982, 1026766467); + WS(1057685119, 1067243116); + sum1 = + W(0, -1129459555, -1098308652, 1053516928, 1029422892) + W(1, 1016923756, -1100618635, 1049587364, -1111775882) + + W(2, 1004671913, -1090418529, 1057639529, -1114348966) + + W(3, -1095493364, -1088191051, 1065512192, -1112549294) + + W(4, -1098633785, -1089905135, 1058720438, -1103551521) + + W(5, -1112175056, -1101363479, 1052631981, -1111153757) + W(6, 1046138501, -1106099897, 1043712557, 995391206) + + W(7, -1131471418, -1097291652, 1052947846, 1020473821); + sum2 = W(0, -1131225411, -1140292462, 1018110051, 1018006973) + + W(1, -1130956898, 1023877693, -1137158572, -1128428036) + + W(2, -1103681442, 1042914798, -1224504659, 1020723155) + + W(3, -1077027280, 1069127322, 1043315619, -1147115303) + + W(4, -1076028808, 1071847872, -1120948958, 1020554514) + + W(5, 1031803188, -1103125793, 1043270022, -1133954299) + + W(6, -1101294062, 1043076855, -1113817590, 990350747) + W(7, 949706042, -1132087796, 1015417250, 1025989218); + WS(-1097928959, -1082976358); + sum1 = + W(0, 1027664520, 1057835343, -1089326063, -1108038941) + W(1, -1123678010, 1050550727, -1096462854, 1032858337) + + W(2, -1106569905, 1057764410, -1083721351, 1021803093) + W(3, 1052451146, 1062299789, -1087127986, 1042469806) + + W(4, -1103556709, 1049034640, -1097735566, -1104920125) + + W(5, 1038567635, 1057826487, -1094118206, 1031016631) + + W(6, -1108799690, 1041175724, -1100805265, -1129264698) + + W(7, 1040222651, 1060823717, -1089053734, -1107162784); + sum2 = W(0, 1059738223, -1087082495, -1092378156, 1034470847) + + W(1, 1048150071, -1095900368, 1046247330, 1025055065) + W(2, 1052511773, -1108343021, 1033545850, 1045395587) + + W(3, -1080186607, 1063110279, -1090059649, -1094453880) + + W(4, -1078381471, 1074904245, -1107095292, 1053230483) + + W(5, -1072132845, 1071639576, 1039712953, -1103894182) + + W(6, -1071450961, 1076364217, -1113577164, 1032308634) + + W(7, -1071397334, 1077341373, 1049211915, -1120241798); + WS(-1093482751, 1040242403); + sum1 = W(0, -1101135214, 1051279307, -1160860306, -1112732162) + + W(1, -1123956286, 1045008905, -1106067054, -1135242283) + + W(2, -1107524598, 1049489177, -1101021318, 1029341500) + + W(3, -1138012647, -1132973569, -1113266773, -1121978915) + + W(4, 1034129455, -1096848358, 1049504725, -1098727290) + + W(5, 1042720691, -1098383795, 1059206814, -1102892456) + + W(6, -1130324184, -1104810279, 1049756222, -1104163113) + + W(7, 998898338, -1118268600, 1052043149, -1099073308); + sum2 = W(0, 1050603120, 1055811875, -1086548128, 1034695967) + + W(1, -1101078445, -1122671355, -1087609936, -1108269543) + + W(2, 1048531671, 1038805789, -1088336312, -1089139562) + + W(3, -1105220793, 1066111209, 1071017234, -1104320030) + + W(4, -1091713187, 1026095418, -1115602704, -1100901763) + + W(5, 1034851673, -1130092003, -1089969509, 1049804877) + + W(6, -1122031169, -1137910742, -1121274059, -1103744367) + + W(7, 1020293663, -1094690648, 1053616941, 1054827086); + WS(-1112146683, -1077736475); + sum1 = W(0, -1128590341, -1099064529, 1049253908, 1039097715) + + W(1, -1130792414, -1090490649, 1028859267, 1017948777) + + W(2, -1147973299, -1086623314, 1040872136, 1025770233) + + W(3, -1117834531, -1101063739, 1068918685, -1115616742) + + W(4, 1007065251, -1084449173, 1059458719, -1104116690) + + W(5, 1033724609, -1094725676, 1057886934, -1132647657) + W(6, 1024083798, -1097837640, 1044653558, 998082042) + + W(7, -1122914526, -1097461352, 1048946351, 1030833130); + sum2 = + W(0, 1038545045, 1044965772, 1038508364, 1032278560) + W(1, -1104316542, -1073797636, -1092377302, -1115941315) + + W(2, -1098913527, -1069601753, 1050236814, -1109127211) + W(3, 1054073276, 1079919017, 1044931722, 1042591612) + + W(4, 990615436, 1065620582, 1034922622, 997021068) + W(5, -1111960943, -1103381017, 1033398315, 1042220416) + + W(6, -1127436605, 1039512539, -1113162193, -1138197651) + + W(7, -1131799749, -1105195767, 1039327537, -1121388557); + WS(-1090505151, -1074550453); + sum1 = W(0, -1112838599, -1106878250, 1057615003, -1131143051) + + W(1, 1028498739, -1103427629, 1042960070, 1023192930) + + W(2, 1023419227, -1088602192, 1063645564, -1096958907) + + W(3, -1117182312, -1088941275, 1053033883, 1048242260) + + W(4, 1018948122, -1087514842, 1058641540, -1098164287) + + W(5, -1126145258, -1096920942, 1043052986, 1045189988) + + W(6, 1024711581, -1096615233, 1050742275, -1105551137) + + W(7, -1125422420, -1095073209, 1053972531, 1026824959); + sum2 = W(0, 1051549752, 1021553919, -1106404197, 1031994963) + + W(1, 1081443218, -1111116920, 1044837835, -1113046369) + + W(2, 1072492444, -1073777225, -1113676512, 1032624041) + + W(3, 1048388769, -1067599847, -1089379201, 1025956540) + + W(4, 1035162847, -1096587672, -1109546151, 1027498280) + + W(5, -1139079606, 1029232562, 1030543674, -1132168419) + + W(6, -1121149576, -1115288719, -1122606689, 1034044071) + + W(7, -1123800689, 1042218632, -1125599605, -1115044631); + WS(1051119487, 1041244378); + sum1 = W(0, -1124974044, -1137238551, -1116593698, -1121323393) + + W(1, 1028120435, -1113671305, -1103177170, 1033078132) + + W(2, 1048876359, 1036964902, -1099611151, -1156053771) + + W(3, 1037118035, 1061504071, -1104164974, -1129960608) + + W(4, -1131477080, 1047204942, -1081804989, 1048068278) + + W(5, -1118427428, 1050660570, -1114906180, 1011539382) + + W(6, -1120234265, 1030267847, -1098831475, 1035846233) + + W(7, -1125985859, 1049717597, -1103929310, -1115091743); + sum2 = W(0, 1018090488, 1027537220, 1019973834, -1117503915) + + W(1, -1104952272, 1048078363, -1095697091, 1045164128) + + W(2, -1105226064, 1055192952, -1101823824, -1106818318) + + W(3, -1128161694, -1102612387, 1074095781, -1087428157) + + W(4, -1134153828, -1102761937, -1074759173, 1061969021) + + W(5, 1024328280, -1101688104, 1063478353, -1092430375) + + W(6, -1118410723, 1035228556, -1092594125, 1050476000) + + W(7, -1117225997, 1016223417, 1041310640, -1110796930); + WS(1062303263, 1031082743); + sum1 = + W(0, -1113216195, 1050954912, -1095964628, -1121789260) + W(1, -1099215391, 1012178225, -1095180416, 1027015379) + + W(2, 1052151297, 1065129152, -1088785601, 1041954507) + W(3, 1026092610, 1047492794, -1089641431, -1107401421) + + W(4, 1051942565, 1063700475, -1089295544, 1049634587) + + W(5, -1098039588, 1049517720, -1091476104, -1112964196) + + W(6, -1101893697, 1028060738, -1102410709, 1035520455) + + W(7, 1008063218, 1054989200, -1096414030, -1114231491); + sum2 = W(0, 1033145987, -1175661064, 1021827842, -1165845202) + + W(1, -1111827051, -1152013649, -1104895942, -1187919119) + + W(2, -1103256184, 1050523165, 1034611383, -1125020091) + + W(3, -1063595607, 1084357731, -1094652398, 1042933311) + + W(4, -1101985731, 1048919805, 1029250458, -1108910008) + + W(5, -1141099147, 1025442742, -1102082303, 1040766920) + + W(6, -1136421288, -1145624409, 1021034188, -1126731425) + + W(7, 1030655939, -1133270551, -1121842648, 1017996705); + WS(1057958943, -1104691893); + sum1 = + W(0, -1111014615, -1105424217, 1044401084, -1118336456) + W(1, -1128240917, 1046008396, -1100901945, 1038452148) + + W(2, -1146251723, -1090082375, 1057785284, -1119525902) + + W(3, -1095236657, 1054329938, 1040293502, -1093887914) + W(4, 1047913107, 1003615948, -1099597392, 1045607070) + + W(5, -1103203951, 1013130820, 1051440085, -1107674167) + + W(6, 1033356080, 1044802714, -1102604718, -1113361665) + + W(7, 1023941889, -1101796865, 1036253756, 1037874639); + sum2 = W(0, 1010987018, 1041119120, -1110188142, -1127404253) + + W(1, -1105807463, -1111572952, 1045029856, 1029477872) + + W(2, -1102396693, -1117220749, 1057260834, 1019931869) + + W(3, 1054217500, -1087890507, -1087358521, 1056265374) + + W(4, -1123211893, 1070205457, -1081682663, -1091128546) + + W(5, 1029628166, -1101117061, 1051101181, -1124058781) + + W(6, -1106898625, -1113015450, 1042553654, 1025549544) + + W(7, 1028744914, -1121743361, -1135525482, 992401866); + WS(1063883327, -1171419961); + sum1 = + W(0, -1131801844, 1049833398, -1102183011, -1101850371) + W(1, 1021098616, -1123871229, -1097479398, 1031224740) + + W(2, 1022023532, 1009731296, 1056730033, -1123343997) + W(3, -1121742227, 1044941350, 1041013425, -1127214008) + + W(4, -1090925859, 1060653970, -1095529687, -1107029405) + + W(5, 1024490200, 1043051923, -1097251239, 1042080318) + + W(6, -1102607801, 1048967870, -1104750961, -1107657120) + + W(7, -1123544461, 1050859794, -1097963532, 1009310536); + sum2 = W(0, -1106082604, 1047581965, -1097195715, -1113941985) + + W(1, 1041248381, -1108094251, -1105642610, -1131232309) + + W(2, -1132935321, -1111186257, 1042983438, 1050509566) + + W(3, -1106587714, 1050591326, 1048334662, -1103031697) + + W(4, -1104172881, 1039028256, 1046273630, -1127691207) + + W(5, -1118244665, 1025922877, -1128737701, -1115007353) + + W(6, -1115368488, -1111866155, 1044426238, -1112751356) + + W(7, -1139264801, -1104769894, -1122157893, 1031938310); + WS(1064944927, 1037595256); + sum1 = W(0, -1116864018, -1089228760, 1063040538, -1107296590) + + W(1, 1023806679, -1095304482, 1057549004, -1106875789) + + W(2, 1017115436, -1087165700, 1060715233, -1103245163) + + W(3, 1009660557, -1086682215, 1064233001, -1106392275) + + W(4, 1028149000, -1088874517, 1056983460, -1132085516) + + W(5, -1109610248, -1099761351, 1052917089, -1107160974) + + W(6, -1148661421, -1116139780, 1041500021, -1129006079) + + W(7, -1102752831, -1131587330, 1045020525, -1152394658); + sum2 = + W(0, 1045832950, -1084008560, -1084775302, 1058474163) + W(1, -1110716731, 1049995423, -1093173621, -1102301410) + + W(2, 1025147898, -1089165996, 1054478967, -1128684365) + W(3, -1098226948, 1066542501, 1068786857, 1031931484) + + W(4, -1099749141, 1049362032, 1047038722, -1091779956) + + W(5, -1098250414, 1055260506, -1126019654, -1105326436) + + W(6, 1042544569, -1086997229, -1127724076, 1053449115) + + W(7, -1089530617, 1067285885, -1088213452, -1090548395); + WS(-1082101344, -1089856493); + sum1 = + W(0, 1050831902, -1105691402, -1101015969, 1029275441) + W(1, -1112019073, 1030717682, -1098775681, -1120813832) + + W(2, 1030303546, 1055521064, -1097748442, -1139280937) + W(3, -1129997454, 1064695661, -1085520515, 965412887) + + W(4, -1110327174, 1061962758, -1086646154, 1041358014) + + W(5, -1117704076, 1058754169, -1089610799, -1122362798) + + W(6, -1112251093, 1047731210, -1093958751, 1028938947) + + W(7, -1131596868, 1056158989, -1094349907, 1016935004); + sum2 = W(0, -1065128139, -1101130808, 1034565987, -1119435550) + + W(1, -1076824095, 1050826865, -1109355365, 1023890205) + + W(2, 1067439244, 1046966330, -1109830496, 1012867020) + W(3, 1079260085, 1049869634, -1112614302, 1015248786) + + W(4, 1056740148, 1051236860, -1123646153, -1122661198) + + W(5, -1103928218, -1114183173, 1051726295, -1136992532) + + W(6, -1135208116, 1033256035, 1035002893, -1119472799) + + W(7, 1039164015, -1104627926, -1109091637, -1136910724); + WS(-1090711679, 1035967541); + sum1 = + W(0, -1111795270, -1104454427, 1050513973, 1030482278) + W(1, 1015715144, 1029360119, 1050454265, -1138269301) + + W(2, -1118064815, -1084526809, 1063535365, -1132452908) + + W(3, -1124564760, -1083278737, 1060834888, 1007072853) + W(4, 1033380937, -1083950349, 1050327592, 1028355007) + + W(5, 1041725555, -1091233609, 1054941014, 1029566323) + W(6, 1039158191, -1102432923, 1040417584, -1140656289) + + W(7, 1036708611, -1097260861, 1042099839, 1035976950); + sum2 = W(0, 1030795338, -1099705557, -1100315818, -1124401732) + + W(1, -1104698754, -1088930785, -1129318753, 1047822852) + + W(2, -1086482027, -1087114188, -1088371087, 1041847465) + + W(3, -1086674278, 1063363970, 1059258270, 1007827043) + W(4, 1048689193, 1066258058, 1052412907, -1114489829) + + W(5, -1101252049, 1055138353, 1035784301, 1039056173) + + W(6, -1127107620, -1113111809, -1107499570, 1036879119) + + W(7, -1097010897, 1050900036, 1046424313, -1112035485); + WS(-1098505599, -1075865372); + sum1 = W(0, -1119631078, -1131715643, -1121509433, -1113178620) + + W(1, 1024188415, 1032178901, -1128987132, 1024883696) + + W(2, -1125460739, 1056750314, -1131145214, -1114020928) + + W(3, -1113150415, 1055366257, -1096447994, -1102601578) + + W(4, -1098117352, 1063530169, -1086227497, -1111953177) + + W(5, 1028789822, 1038512989, -1117796833, -1101470933) + + W(6, -1115205937, 1036256496, 1016180195, -1141768534) + + W(7, -1134520549, 1042179631, 1032402616, -1114797153); + sum2 = W(0, -1098762498, 1039073687, 1035541163, 1030962008) + W(1, -1112826554, 1047439072, 1032611741, 981436096) + + W(2, -1099883844, 1024348972, 1050751610, 1048715774) + + W(3, -1090598021, 1068429254, 1066295533, -1089341195) + + W(4, 1060690639, -1078855206, -1081223881, -1094541311) + + W(5, -1101866176, 1052294530, -1097770507, 1041458546) + + W(6, 1051055486, -1095975199, -1126362074, 1044471119) + + W(7, -1111565268, 1034134076, -1121819739, 1024624177); + WS(1057165023, -1106509195); + sum1 = W(0, -1110663097, -1090373040, 1057389257, 1036322023) + + W(1, 1023353031, -1094296089, 1051297995, -1110472134) + + W(2, 1009641338, -1087820187, 1064196683, -1103525103) + + W(3, -1116674588, -1090764772, 1064337073, -1108191858) + + W(4, -1121179137, -1101809276, 1058239248, -1105116828) + + W(5, -1127866586, -1095695571, 1053143796, -1130262917) + + W(6, 1019708412, -1097119704, 1049182394, -1117889432) + + W(7, -1105922998, -1088811352, 1042633923, 1047174317); + sum2 = W(0, -1112942365, -1106822390, -1102090209, 1043730009) + + W(1, 1048482322, -1115190843, 1042851055, 1035412483) + + W(2, -1100072975, 1034045428, -1103979279, -1105576965) + + W(3, -1097118067, 1068163863, 1056641862, 1028572696) + W(4, 991349250, 1063618710, -1105663689, -1113934073) + + W(5, -1108096389, -1107942623, 1049912171, -1105853831) + + W(6, 1053525633, -1090492700, -1130278628, 1039916278) + + W(7, 1000921969, -1076676559, -1111476815, -1106999228); + WS(-1086493375, -1079336981); + sum1 = W(0, 977772865, -1102983835, 1026410857, 1015269519) + + W(1, -1123924042, -1108602044, -1098146918, 1049374456) + + W(2, -1109993624, 1041059645, -1106936850, 1036994068) + + W(3, -1107908519, -1094902379, 1061697492, 1041174790) + + W(4, 1036636329, -1083260999, 1061962303, -1103125248) + + W(5, 1038934102, -1084987377, 1057432285, -1125738921) + + W(6, 1034769240, -1102484540, 1051050960, -1130650164) + + W(7, -1099048778, -1108629750, 1050989872, 1040252563); + sum2 = + W(0, -1104970914, 1042634099, 1052960430, -1112577728) + W(1, 1018133697, -1097448347, -1108255972, -1096543501) + + W(2, 1040842491, 1055662701, 1062139198, -1090800341) + W(3, -1093587851, 1074010545, 1064732329, -1093194079) + + W(4, -1093237537, -1089724369, -1083390778, 1015865539) + + W(5, -1102375178, -1099392752, 1025575413, 991452982) + + W(6, -1099804326, 1049771835, -1104347883, -1126119433) + + W(7, 1054809337, -1092159031, -1096888027, 1028159711); + WS(-1088469887, 1068090411); + sum1 = + W(0, -1113244581, 1001301201, -1115331947, -1124374314) + W(1, -1123900274, 1023861926, 1035790701, -1105829923) + + W(2, 1049496346, -1082959002, 1057295251, -1096521435) + + W(3, -1110903326, 1050701400, 1048296635, -1119292644) + + W(4, -1119953152, 1060902689, -1081663133, 1048590454) + W(5, 1031904934, 1043052181, -1113327662, 1027826066) + + W(6, 1034227191, 1043817559, -1110964279, -1106468266) + + W(7, 1025939062, 1038313117, 1034951606, -1117293966); + sum2 = W(0, 1046922708, -1106472578, 1033443280, -1111979165) + + W(1, 1033420508, -1114867820, -1109208012, 1050643686) + + W(2, -1112865289, -1087802072, 1020845388, -1101832932) + + W(3, -1096930035, 1058113813, 1048730658, -1129026525) + + W(4, -1101802092, 1050476308, 1059721445, -1104558996) + + W(5, 1017341032, -1103417477, -1107242470, -1135034393) + + W(6, 1036773342, -1105807138, -1136542442, 1037376476) + + W(7, -1107450994, 1033379085, -1104249476, 1023773731); + WS(1052578175, -1092643724); + sum1 = W(0, -1106584961, -1102735475, 1053304083, 993436516) + W(1, 1030893452, -1100779014, 1049737317, 1037510015) + + W(2, 1033955624, -1082492039, 1060101900, -1101687426) + + W(3, 1037358070, -1086815439, 1065824329, -1103135573) + + W(4, 1036710537, -1088009424, 1041943502, 1029815263) + + W(5, -1128189432, -1095075429, 1057719155, 1040440469) + + W(6, -1118327615, -1106908643, 1051335460, -1106074638) + + W(7, -1129060558, -1102841939, 1036237087, 1027836379); + sum2 = + W(0, -1115440098, 1015710974, 1041402597, -1130229431) + W(1, 1029771501, 1033337736, -1114856806, 1034787000) + + W(2, 1018065220, -1094728975, 1037520917, -1082769104) + W(3, 999202537, 1039453548, 1064530169, -1074584982) + + W(4, 1036811205, 1050012979, -1094040689, -1090370130) + W(5, -1111720654, 1032576025, 1073761042, 1032162938) + + W(6, -1125064265, -1103861773, 1063409170, -1105633547) + + W(7, 1019498859, 1040788513, -1090935047, 1034133532); + WS(-1104397694, 1058392920); + sum1 = W(0, 1012876448, 1051523414, -1094911217, 1023486907) + + W(1, -1126111401, 1050625047, -1106828476, 1033392977) + + W(2, -1142522206, 1043902243, -1089440467, -1119682235) + + W(3, -1115125816, 1063861817, -1093833780, 1019625524) + + W(4, -1103048369, 1056801600, -1087921625, -1096529922) + + W(5, 999529969, 1053396405, -1107310585, 1015514383) + W(6, 1016404519, 1042081404, -1104958721, 1039287934) + + W(7, -1117545451, 1054067798, -1097217844, -1113687714); + sum2 = W(0, -1130009672, 1013515790, 1013756514, -1153587550) + + W(1, 1027809153, -1106180134, 1023886448, 1024050371) + + W(2, -1106384796, 1042067106, 1052609397, -1094102229) + + W(3, 1051460883, -1094561503, 1078005003, -1070026280) + + W(4, -1104521112, 1032257325, 1072194837, -1075632186) + + W(5, 1033821004, -1124940473, -1094906083, 1053282219) + + W(6, -1112259960, -1168427353, 1046140857, -1098407638) + + W(7, 1028508475, -1120291522, -1140922271, 1033718481); + WS(1063327007, -1121248448); + sum1 = + W(0, 1017612078, -1113236667, 1042967269, 1035231217) + W(1, 1043030576, -1096763312, 1049218219, -1115130868) + + W(2, 1039059525, -1091103118, 1058517677, -1107367965) + W(3, -1115811128, 1053297652, 1033504868, 1009543939) + + W(4, -1095615210, 1063340055, -1082785422, 1047061435) + + W(5, -1099887459, 1054079124, -1088587000, 1042859328) + + W(6, -1140707177, 1041492110, -1101731443, -1120288724) + + W(7, -1120397682, -1126620524, 1029718569, -1104957341); + sum2 = W(0, 1037909727, -1119813454, -1099212072, 1032936033) + + W(1, -1098298527, 1048025725, 1045330821, -1097673782) + + W(2, -1126569464, 1041835288, -1106229244, -1109675885) + + W(3, -1106955476, 1067026849, 1067954224, -1092590328) + + W(4, -1096969233, -1085288934, -1095495837, 1004812688) + + W(5, -1118592354, 1042571631, -1108169766, -1096486003) + + W(6, 1042882430, -1117602980, -1164085849, 1034064234) + + W(7, 1037216424, -1116313332, -1100305071, 1045459772); + WS(-1114652667, 1051933605); + sum1 = + W(0, 1026700110, -1102428549, 1043087092, -1109604752) + W(1, 1037508767, -1105027032, 1048715843, -1113263092) + + W(2, -1128033780, -1106431647, 1062796090, -1098797270) + + W(3, 1034155035, 1043250735, -1089603768, 1023780992) + + W(4, -1102462575, 1059213449, -1090890112, -1112475685) + + W(5, 1024543544, 1038435705, -1106007014, -1121524254) + W(6, -1147042251, 1038748492, -1119096106, 986589794) + + W(7, 1032374633, 1016229610, -1104514210, 1007891224); + sum2 = W(0, -1129141996, 1043866561, 1029019378, 1050935854) + + W(1, -1106880495, -1096921120, -1092013580, -1111274547) + + W(2, 1031191254, -1123077406, -1086673510, -1096956427) + + W(3, -1102244397, 1064276171, 1064706574, -1115781076) + + W(4, -1101040753, 1061828176, -1113110329, -1106057540) + + W(5, 1046080919, -1095750750, -1091369762, 1029696990) + + W(6, -1112883155, 1042185570, 1042119352, -1113619581) + + W(7, 1031234782, -1128566730, -1105256367, 1012473722); + WS(1059465279, -1101420399); + sum1 = + W(0, 1033088680, 1043444330, -1101682761, -1124073107) + W(1, -1124176798, 1000916382, -1126261266, -1118729178) + + W(2, 1014063089, 1057398923, -1089602004, 1032573720) + W(3, 1035053989, 1034190184, 1039770557, -1114558729) + + W(4, 1045820204, -1087528660, 1057859064, -1096323421) + W(5, 1038292302, 1036787650, -1106381771, 1041172764) + + W(6, -1115007182, 1027988010, -1104773247, 1024683157) + + W(7, -1131477704, 1042732770, -1102530758, 1029511616); + sum2 = W(0, -1093261173, -1081648717, -1107343332, 1020947921) + + W(1, -1100338012, -1096055698, 1016623505, -1121572837) + + W(2, 1016590929, 1049309077, 1058913944, 1035038069) + W(3, -1160318928, 1060463741, 1061699617, -1121635630) + + W(4, -1111261089, -1123677731, -1095509190, -1116667427) + + W(5, 1032510827, 1042247124, 988275856, -1130213341) + W(6, 1037987285, 1035681279, -1111758125, 1033159595) + + W(7, -1106728517, 1035240533, 979544481, -1112486763); + WS(1060076127, 1072958059); + sum1 = + W(0, -1103118654, -1090537599, 1060753617, -1129584897) + W(1, 1043365506, -1097065432, 1046496158, 1025963976) + + W(2, -1115420333, -1086314390, 1060760746, -1106610556) + + W(3, 1031523031, -1088162978, 1055888777, 1040410096) + W(4, 1033412302, -1089193875, 1052645932, -1138875303) + + W(5, 1032254402, -1091959462, 1054239287, 1032279415) + W(6, 1031863013, -1111327644, 1044639698, 1032182482) + + W(7, -1127560355, -1086013855, 1056703661, 1044337291); + sum2 = + W(0, 1034238418, -1122429687, 1038471498, -1105287037) + W(1, 1026722605, -1113650971, 1047703041, -1106809975) + + W(2, -1123083006, -1101416602, 1050567163, -1099784158) + + W(3, 1044566349, -1095747837, 1073798913, -1077245954) + + W(4, -1114043742, 1044375513, 1074668356, -1072322090) + W(5, 1029836970, 1032414162, 1076147895, -1070521946) + + W(6, -1124457715, -1132025334, 1076524889, -1071353549) + + W(7, -1112207598, -1112893824, 1071535287, -1076180558); + WS(-1114470395, -1114976351); + sum1 = W(0, 1017446070, 991904560, 1034584479, -1110976571) + W(1, 1040990896, 1041627584, -1107221597, -1099251857) + + W(2, -1129681934, 1047992216, -1115356259, -1111571481) + + W(3, -1120446036, 1061349282, -1083497834, 1039733326) + + W(4, -1097641691, 1061559014, -1089507216, 1036247843) + + W(5, -1110115727, 1055187519, -1098995485, -1114440077) + + W(6, -1110184487, 1045114861, -1109668803, -1115117640) + + W(7, 1033457695, 1047040436, -1107186297, -1120899067); + sum2 = W(0, -1093678598, -1084434022, 1064533419, 1042743345) + + W(1, 1002676269, 1057422860, 1067683118, -1108978134) + + W(2, 1055748356, 1066493380, -1078621547, -1117769694) + + W(3, 1044340647, -1079318791, -1079939901, 1015093293) + + W(4, -1118111722, -1116089022, 1054002901, 1049699290) + W(5, -1120084888, 1044705221, 1039926847, 986467602) + + W(6, 1001595675, -1112694927, -1112070298, -1107171922) + + W(7, -1123642691, 1031220790, 1023903081, 1037662763); + WS(1048785023, 1039045299); + sum1 = + W(0, -1104130562, -1090140327, 1061197562, -1133671882) + W(1, 1043168659, -1100442863, 1040570004, 1032880081) + + W(2, -1117502116, -1085428843, 1062309944, -1102819715) + + W(3, 1029857553, -1093347651, 1050495728, 1038995485) + W(4, 1034838603, -1089406196, 1050259320, -1127149063) + + W(5, 1027207566, -1093521697, 1054560318, 1026681976) + W(6, 1024393315, -1120775857, 1039464338, 1035433414) + + W(7, -1130533431, -1086838999, 1056208688, 1041402190); + sum2 = + W(0, -1118465298, -1142302474, -1114395216, 1037219807) + W(1, 1011712973, 1025023956, -1104707163, 1039062755) + + W(2, -1128433260, 1041730218, -1095905892, 1046574176) + + W(3, 1029767219, -1097771962, -1080533844, 1069124140) + + W(4, 1021354231, -1094677866, -1075595300, 1073795377) + W(5, 982009542, -1122047812, -1072373863, 1075522683) + + W(6, 1014788797, 1028525757, -1072719492, 1074436097) + W(7, 1033540398, 1020814500, -1078361330, 1068741752); + WS(1040594174, 1002085105); + sum1 = + W(0, 1041861603, -1113198522, -1137236930, 1041085614) + W(1, -1097746587, 1055071640, -1100468781, -1121524679) + + W(2, 1032164980, -1088672026, 1047493466, -1109849488) + W(3, 1031577622, 1050744420, -1105375081, 1048884604) + + W(4, -1102982955, 1057599999, -1087672398, -1113508732) + + W(5, 1044101411, -1103363988, 1050064611, -1098107838) + W(6, 1034678964, 1036351259, -1102178050, 1043931332) + + W(7, 1026039088, 1034848362, 1033863059, -1106488144); + sum2 = W(0, -1099743490, 1011906269, 1037961444, -1108436276) + W(1, 1035577370, 1026663055, -1152297667, 991169347) + + W(2, -1115293072, 1057096352, -1095995741, 1045881501) + + W(3, -1102421679, 979639118, 1050233559, -1097952901) + W(4, 1038726510, 1044440375, 1022991474, -1122343653) + + W(5, 1032210717, 1032214892, -1139108605, 1026937641) + + W(6, -1107407193, 1028754425, -1115369483, -1105994898) + + W(7, -1120037205, -1123040177, -1104470915, 1022469878); + WS(1066613200, -1123971367); + sum1 = + W(0, 1021072883, -1096708150, 1051074184, 1026036124) + W(1, -1125712504, -1090955664, 1051398158, -1108624754) + + W(2, 1041158633, -1159875842, 1058934814, 1040756057) + + W(3, -1106077125, -1079911082, 1061682240, -1090753503) + + W(4, 1036847484, -1093258685, 1055629981, -1114271443) + W(5, 1032267227, -1103560179, 1054180539, 1025501945) + + W(6, 1016782186, -1089925031, 1052861897, -1105228376) + + W(7, 1031886911, -1106725252, 1047227273, 1043536294); + sum2 = W(0, -1120579723, -1102098813, -1103583809, 1039910130) + + W(1, -1104595791, 1059079365, 1035649855, -1110832147) + + W(2, 1060943463, -1078775742, 1055196914, -1115424415) + + W(3, -1081375340, 1070420847, 1036446407, -1092581761) + + W(4, 1048074442, -1106373275, 1050043459, -1101688097) + + W(5, 1049316438, -1084015554, 1050724789, -1115969635) + + W(6, -1088959333, 1065759760, -1088425301, 1051846236) + + W(7, 1054216959, -1087995034, 1052608338, -1103333947); + WS(1015488492, -1082266482); + sum1 = W(0, -1115294884, -1096364772, 1054950795, -1109722877) + + W(1, 1041881447, 1036768790, 1051075280, 1018280484) + + W(2, -1116482020, -1083421327, 1062057653, -1105734603) + + W(3, 1028536641, -1079950554, 1057564011, -1124656723) + + W(4, 1044897017, -1088856963, 1054170231, -1129161159) + + W(5, -1108243791, -1096513911, 1056273768, -1113027740) + + W(6, 1033207234, -1104622888, 1056919206, -1132093050) + + W(7, 1015505847, -1096156044, 1054606378, 1025701004); + sum2 = W(0, -1103335141, -1123809016, 1056172663, -1093357581) + + W(1, -1087173612, -1080484881, 1047550056, -1112078382) + + W(2, 1045744538, 1068142929, 1051886373, -1102262951) + + W(3, -1106751239, 1065979347, 1064817240, -1097769156) + + W(4, -1089877767, 1048007586, 1065470183, -1095892093) + + W(5, 1054342226, -1086806497, -1098340366, 1033891425) + + W(6, 1047940388, -1098712592, -1102735881, -1105000175) + + W(7, -1120076732, -1082944418, -1088981287, 1059622670); + WS(-1089551423, -1072840444); + sum1 = + W(0, 1041019406, 1055991358, -1086576149, 1027645528) + W(1, 1022173115, 1057526040, -1100702364, -1141651861) + + W(2, -1113297010, 1036785718, -1093552675, 1016689751) + W(3, 1015463395, 1059475300, -1089572736, 1031793146) + + W(4, -1103473726, 1056836657, -1091007140, -1125097480) + + W(5, 1040814976, 1050051043, -1090411145, 1041821422) + W(6, 1007312016, 1050846086, -1098618125, 1015074267) + + W(7, 1029778436, 1053584058, -1097362556, -1104623366); + sum2 = + W(0, 1069423067, -1076703167, 1041694716, 1032293264) + W(1, 1072187327, -1073855626, -1115348910, 1008297781) + + W(2, 1072064387, -1079134619, -1107764634, -1120515458) + + W(3, 1072314518, -1077864031, -1089838794, 1037018177) + + W(4, 1066704589, -1081021850, 1036250076, -1121141704) + W(5, 1063804587, -1081933355, 1028352388, 1025803257) + + W(6, 1053139391, -1094622730, -1114321992, -1123317222) + + W(7, 1042659879, -1099654949, 1035224325, 1027779018); + WS(1053893247, -1106302313); + sum1 = + W(0, 1031892188, 1044357278, -1093335703, -1124627014) + W(1, -1110506435, 1051962248, -1098499127, -1121076939) + + W(2, -1127073177, 1061666784, -1085429924, 1038775118) + W(3, 1047997302, 1064449402, -1082436051, 1042378233) + + W(4, 1033243951, 1041901099, -1118050391, -1100759903) + + W(5, -1107646187, 1053582704, -1104422127, -1107823800) + + W(6, -1112186286, 1037482077, -1118004236, -1134911574) + + W(7, -1112631434, 1050110011, -1103845867, -1111029158); + sum2 = W(0, 1045534781, -1106914963, -1093884354, 1048929407) + + W(1, -1136883904, -1105365809, 1058094665, -1099297773) + + W(2, 1027794169, -1087950271, -1076257974, 1057853479) + + W(3, -1091599460, 1049402813, 1070891205, -1101014716) + + W(4, -1105954111, 1059435817, 1057695328, -1088483015) + + W(5, -1110353364, 1056244223, -1096007662, -1116753268) + + W(6, 1026306116, -1106437513, 1042940020, -1107558514) + + W(7, -1105327762, 1049633694, 1019026622, -1111740866); + WS(1043803134, 1031905225); + sum1 = W(0, -1113675573, 1045344728, -1093561052, -1125193272) + + W(1, -1137620096, 1015450714, 1039772705, -1142985628) + + W(2, 1045527725, 1036603287, -1087612823, 1043570724) + W(3, 1047471777, 1057861093, -1131204708, 1032608022) + + W(4, 1025442024, 1007995990, -1109713128, -1125123818) + + W(5, -1101766076, 1048683192, -1098589181, 1017746514) + + W(6, 1041363873, -1103914745, -1142310312, -1137687994) + + W(7, -1104559247, 1053784172, -1096789826, -1120823545); + sum2 = + W(0, -1102611800, 1052608919, -1092971881, 1033368250) + W(1, 1042572795, -1112317124, 1050084573, -1099740129) + + W(2, -1143715563, 1036000712, -1099050864, 1046340985) + W(3, 1047906835, 1058925768, 1062269077, -1106615878) + + W(4, 1034463821, -1089628524, -1100033854, -1143169701) + + W(5, -1097650393, -1097284017, -1155008883, 1034459058) + + W(6, 1044772028, -1090965565, 1043620595, -1102441858) + + W(7, -1105069125, 1053414419, -1099181286, -1145018737); + WS(1065606800, 1041895077); + sum1 = + W(0, 1041785011, 1041397665, -1108226929, -1113822832) + W(1, -1113293285, 1050236482, -1089967688, -1105474774) + + W(2, 1031552121, 1063682744, -1092426598, 1045393909) + + W(3, -1114204019, 1055253222, -1085544687, -1106251932) + + W(4, 1014586031, 1057927896, -1092878524, 1018782386) + W(5, 1032452466, 1054837340, -1094102329, -1135035573) + + W(6, -1103346054, 1043307490, -1097746379, -1114747425) + + W(7, 1025447425, 1058487624, -1098262983, -1119448485); + sum2 = + W(0, 1038489223, -1094743304, -1079775068, 1069957645) + W(1, 1032193624, -1106563024, -1075431018, 1074314813) + + W(2, -1137158564, 1029053577, -1075905408, 1067854461) + + W(3, 1048862753, -1103121169, 1061439417, -1090496129) + + W(4, -1107218869, 1018988618, 1061842524, -1083145579) + + W(5, -1112577633, 1015522148, 1055667456, -1093776696) + W(6, 1034028859, -1107822714, 1032002642, 1038458963) + + W(7, -1110240510, 1017646246, 1047594841, -1100108785); + WS(1050857279, 1035401177); + sum1 = + W(0, 1029370009, 1049972466, -1100844155, -1114359850) + W(1, -1121232094, 1045749679, -1097541146, -1119608387) + + W(2, -1118971861, 1054737744, -1089471141, 1032044074) + + W(3, -1116554354, 1064433520, -1088203652, 1039513726) + + W(4, -1102118870, 1057059356, -1089223685, 1028806533) + W(5, 1035949272, 1055161550, -1095333099, 1039358524) + + W(6, -1118591397, 1035470985, -1098430605, -1114373271) + + W(7, -1155732684, 1050840570, -1105548665, -1113669781); + sum2 = + W(0, 1034282103, 1040723224, 1028955705, -1104697256) + W(1, -1111920318, -1118965841, 1031483971, -1123254751) + + W(2, 1023538768, -1128437695, 1043259383, 1034554870) + + W(3, -1133376386, 1038672881, -1148076972, -1078609243) + + W(4, -1119100907, 993338648, -1084940093, -1075024478) + W(5, 1014776166, 1050613235, 1050550535, -1100774866) + + W(6, -1117007635, -1108740075, -1098463376, 1069274341) + + W(7, -1121555310, 1040276790, 1054296012, 1072481706); + WS(1059068159, -1095269543); + sum1 = + W(0, 1022243158, 1058751902, -1083015108, 1040310153) + W(1, -1126585055, 1052633434, -1095802212, 1009201364) + + W(2, -1113503115, 1061437964, -1083734386, 1040208083) + + W(3, 1034732162, 1062365313, -1087136899, -1116554445) + W(4, 1029695369, 1054753811, -1089074173, 1044292534) + + W(5, 1045709362, 1047783152, -1093733821, -1141695574) + W(6, 1005846771, 1043895001, -1096742887, 1042140272) + + W(7, 1049870212, -1119990530, -1106170901, -1106848091); + sum2 = + W(0, -1110453349, 1048158098, 1064329884, -1096499673) + W(1, -1118716929, -1117235638, -1122504669, 1023790996) + + W(2, -1111084235, 1037169053, 1037379653, 1035642078) + W(3, 1027079271, 1044450691, -1106426334, -1103100998) + + W(4, 1058163522, -1086959067, -1081956377, 1059064502) + + W(5, 1060433363, -1096141012, -1081432626, -1109003581) + + W(6, 1058751114, -1102281652, -1086790317, 1048822766) + + W(7, -1077532089, 1061563184, 1073667932, -1089552462); + WS(-1079238176, -1098575359); + sum1 = + W(0, -1122061272, 1040856756, -1106993315, -1113276757) + W(1, 1012614613, -1098659523, 1049053518, -1110111537) + + W(2, 1049213476, 1050219649, -1088887964, 1048270483) + W(3, -1091368434, 1046432350, 1061247706, -1098550683) + + W(4, 1050034455, -1092787824, -1113029435, 1053252708) + + W(5, -1115399887, 1045840143, -1096901418, -1120030007) + + W(6, -1105000541, -1102913028, 1045569657, -1144293604) + + W(7, 1040609063, -1104981396, -1106428832, 1037272948); + sum2 = W(0, 1035271628, -1096995906, -1097624644, 1051183735) + + W(1, 1033447544, 1032410306, 1048740225, -1095652467) + + W(2, -1113618952, 1053850685, -1109777102, 1037584786) + + W(3, -1104023060, 1054515359, 1058355960, -1116173683) + + W(4, 1022009109, -1114408860, -1139294461, -1096371453) + + W(5, -1104458884, 1030897990, -1116975083, 1030595307) + + W(6, 1044684178, -1115683354, -1099524388, -1117706649) + + W(7, -1104406640, -1106540716, 1036671037, -1108415342); + WS(1064155455, 1041078114); + sum1 = + W(0, -1114884791, -1133388468, 1031759625, -1116707016) + W(1, 1038026665, -1103926126, 1051074474, -1135572861) + + W(2, 1040569148, -1088265213, 1049866386, -1145284192) + + W(3, -1123095214, -1088521037, 1060913876, -1110455500) + + W(4, -1113346810, -1094483240, 1044072016, -1116167073) + + W(5, -1098688777, 1052099081, 1034732568, 1029730485) + W(6, -1106297864, 1038941559, -1138713347, 1017022612) + + W(7, 1033022404, 1027852876, 1019301565, 1028095637); + sum2 = W(0, 1027468398, -1120484835, 1033713911, 1037828351) + + W(1, -1111732215, -1115316427, -1113615213, -1102210431) + + W(2, -1149402831, 1042551085, 1015721118, 1027887653) + + W(3, -1136133524, -1101059653, 1005178376, -1105049969) + + W(4, 1058132410, 1067179636, -1112798365, 1033627060) + + W(5, -1084703700, -1093846517, 1036573120, -1112780439) + + W(6, -1103172541, 1015696434, 1035924289, 1025169534) + + W(7, 1011948492, -1119207903, -1106241198, 1034168377); + WS(1056869759, -1097268032); + sum1 = W(0, 1018133293, 1036411431, 1039633317, -1111689725) + + W(1, -1105532941, 1007771751, 1034605623, -1107937040) + + W(2, 1027243330, -1116024394, 1050783724, -1105991139) + + W(3, -1097428310, 1032024955, 1010531964, -1109581452) + + W(4, -1099204213, -1130187397, 1045069064, -1103861656) + + W(5, -1133851766, 1034973653, 1044277428, 1044990678) + + W(6, -1138393927, -1114469768, 1046520720, -1106353867) + + W(7, -1118550618, -1118964077, 1036629184, -1155661924); + sum2 = + W(0, 1031819015, 1040620760, -1130428603, -1130628701) + W(1, -1113612713, 1045122152, -1113774176, -1118722775) + + W(2, 1040659447, -1122637452, -1093905874, 1015363301) + + W(3, -1113225510, -1080510307, -1073670430, -1129641903) + + W(4, 1023788280, -1103769905, 1040925011, 1045479736) + W(5, -1115035325, 1050277803, 1074164392, 997650792) + + W(6, 1009487418, 1041168723, 1056579340, 1043373785) + W(7, 1023947578, -1112728330, 1044922942, -1122436477); + WS(1064095487, 1025785067); + sum1 = + W(0, 1026371284, -1106851535, -1128892272, 1040514533) + W(1, -1097495743, 1042476562, 1049973404, -1103190740) + + W(2, 1050378694, -1104849584, -1115675316, 1040022019) + W(3, 1008396404, -1085976658, 1058008769, 1040395090) + + W(4, 1042871873, -1097042470, -1098054097, 1050097558) + + W(5, -1103138663, -1109264236, 1052615848, -1102548473) + + W(6, -1136206974, 1035073279, 1037088776, -1157051795) + + W(7, 1034556564, -1094929447, 1045135411, 1023679636); + sum2 = + W(0, -1124722923, 1033420628, -1105442746, 1029168594) + W(1, -1114618025, -1100145939, 1047309531, 1048079041) + + W(2, 1043439029, -1115804833, -1084852425, -1101613108) + + W(3, 1036363299, 1057589449, -1089136554, 1042227257) + W(4, -1096133271, 1053618149, 1028964970, 1045151454) + + W(5, 1049502378, -1091358477, 1056312267, 1041752672) + W(6, -1106999272, 1030436134, -1100909906, 1036382707) + + W(7, 1013819494, -1119548384, 1043379377, -1113267324); + WS(1060109055, 1023402244); + sum1 = W(0, 1039025762, 1051909299, -1098089231, -1107880995) + + W(1, -1109278395, 1054481389, -1093104548, 1018380380) + + W(2, -1125210976, 1061074499, -1087624466, -1167447218) + + W(3, -1107337262, 1069080830, -1092709234, -1119879878) + + W(4, -1119314274, 991275263, -1085745760, 1030906608) + W(5, 1038278743, 1049054227, -1093068092, 1028271716) + + W(6, -1120902815, 1043342663, -1102438460, -1122586985) + + W(7, 1024999351, 1051802331, -1098889074, -1107737008); + sum2 = + W(0, 995982518, 1035578813, -1118279893, -1115504751) + W(1, 1033194341, -1121421677, -1114972659, -1108849613) + + W(2, 1038373562, 1046888388, 1069469835, 1041670894) + W(3, 1040171687, -1103362299, 1078927590, 1050450381) + + W(4, -1108098969, 1050255581, -1065023683, -1097423961) + + W(5, 1027047733, -1096418856, -1082214759, -1114805949) + W(6, -1147696971, 1042040695, 1045909115, 964966831) + + W(7, 1033796110, -1116244525, -1112457727, 1025540676); + WS(-1092049407, -1078216845); + sum1 = W(0, 1019093687, 1057591089, -1089127853, -1109784091) + + W(1, 1030002432, 1050969332, -1096074010, 1043174565) + + W(2, -1100550858, 1056027116, -1082843219, -1126191805) + + W(3, 1055647027, 1063070242, -1088645600, 1049441628) + + W(4, -1103872766, 1039049940, -1097545633, -1097650089) + + W(5, 1041444210, 1057957242, -1095349663, 1024042875) + + W(6, -1115845919, 1034942714, -1103665506, -1123963793) + + W(7, 1042339236, 1059965491, -1089209262, -1105758607); + sum2 = + W(0, -1086426610, 1062347208, 1053593730, -1108806990) + W(1, -1096143108, 1055082976, -1101252044, -1138780047) + + W(2, -1089951657, 1045157118, -1111940928, -1099705126) + W(3, 1062855195, 1048769854, 1037201995, 1058343455) + + W(4, 1068897447, -1073459143, -1091098547, -1094950430) + + W(5, 1074016711, -1078468086, -1119407664, 1046274438) + + W(6, 1075026151, -1071781830, 1031118734, -1128975824) + + W(7, 1074160921, -1072043968, -1095931446, 1035271906); + WS(-1092377983, 1032564911); + sum1 = + W(0, 1026968586, 1051240140, -1140824311, -1108814006) + W(1, 1001025293, -1135919542, -1114206145, 1031981930) + + W(2, -1101464865, 1047585891, 1035412731, -1105914151) + + W(3, -1099757657, 1046337282, -1093593858, -1111723206) + + W(4, -1099131534, 1042168181, 1042300945, -1114245051) + W(5, 1021990836, 1042765483, -1105010841, 1047084274) + + W(6, -1124857771, 1039475666, -1129901419, -1110153104) + + W(7, 1016095931, 1031087233, -1150842169, 1021006644); + sum2 = W(0, -1152594313, -1103837493, -1119502913, 1035550709) + + W(1, -1114711758, -1102219265, 1049238470, -1111809635) + + W(2, -1122222477, 1021928584, 1051353268, 1038283603) + + W(3, -1119994373, 1043085394, 1069806319, -1113383091) + + W(4, -1117872135, -1098150014, 1040245198, 1038911980) + + W(5, -1136114154, -1114380427, -1084770114, -1106271331) + + W(6, -1118889611, -1103586212, -1097500544, -1109409577) + + W(7, -1120239593, 999997765, 1032457879, -1130668925); + WS(1066805616, -1146277627); + sum1 = + W(0, -1135230785, -1097679853, 1046488473, 1036204713) + W(1, -1149155717, -1106566573, 1047676826, -1098488427) + + W(2, 1034010150, -1092037473, 1047117051, -1103697017) + W(3, 1042337650, -1085421897, 1062693860, 1057957971) + + W(4, -1127867356, -1091217395, 1049537116, -1114566390) + + W(5, 1036367663, -1094061036, 1056189429, 1034870184) + W(6, 1011804270, -1108406741, 1017502967, -1103604141) + + W(7, 998521116, -1096997053, 1049188263, 1029261884); + sum2 = W(0, -1122819855, 1035645255, -1107161682, 1042480496) + + W(1, 1029215207, -1111163705, 1019166485, -1107159841) + + W(2, -1109976389, 1026839491, -1129473215, -1115971786) + + W(3, 1044451524, -1095838714, 1082201538, -1067229991) + + W(4, -1130065951, -1147512571, 1052773623, -1091650896) + + W(5, 1027965847, -1156411358, 1033233466, -1142132409) + + W(6, -1119702735, -1110332882, 1034307583, -1107215185) + + W(7, 1036873692, -1114357123, 1001850219, 1025815163); + WS(1040205182, 1040987841); + sum1 = + W(0, 1032709552, 1050828331, -1098789018, -1130845956) + W(1, 1028035406, 1054299632, -1102534446, -1131566290) + + W(2, -1152624047, 1000765841, -1087146945, 1024089890) + W(3, 1047238622, 1064828620, -1084918512, 1044521480) + + W(4, -1110798127, 1059217829, -1080798168, 1041701723) + + W(5, -1160283945, 1057730984, -1094152707, -1105870556) + + W(6, -1129145589, 1050797759, -1154982570, -1121779940) + + W(7, 1035307633, 1040620053, -1104995442, -1110323595); + sum2 = W(0, -1104834685, 1039834326, 1040649104, -1113573633) + + W(1, -1098615503, 1050496819, 1034170750, -1119108596) + + W(2, -1090508283, 1045914856, -1118657109, -1128160390) + + W(3, -1080862372, 1070974917, -1102559609, -1095002000) + + W(4, 1048874616, -1085801376, 1041220807, 1053594264) + W(5, 1063492499, -1081343708, 1047362948, 1022825140) + + W(6, 1035824034, 1033985362, -1099586035, 1041895669) + + W(7, 1062512173, -1089072248, -1130222490, -1115149866); + WS(-1087487423, 1060332710); + sum1 = W(0, -1105878689, -1095746139, 1053913286, 1037671952) + + W(1, 1042437466, -1089004262, 1055197099, -1117440135) + + W(2, 1040585322, -1081828961, 1059867107, -1114610404) + + W(3, -1121111477, -1099866351, 1061690846, 1028605502) + + W(4, -1112195269, -1115422148, -1104536871, 1040822242) + + W(5, -1112892785, 1039314504, -1102951638, 1041433743) + + W(6, -1122925576, -1117471766, -1107184778, 1048192776) + + W(7, 1012646976, -1108492170, -1130420108, 1029799624); + sum2 = W(0, 1017331955, -1097747777, -1097037835, -1162485367) + + W(1, -1104677463, 1040900608, 1016355419, -1104406873) + + W(2, -1117673238, -1081336501, -1089023490, -1117660642) + + W(3, -1094338757, 1073518733, 1068423959, -1096388411) + + W(4, -1119646366, -1103573743, 1048344480, -1093216188) + + W(5, -1104710153, -1106204508, 1057220074, 1028492960) + + W(6, -1107625181, 1041186571, 1033091565, -1092192530) + + W(7, 1022869095, -1097636016, 1053959289, 1049060345); + WS(-1096756863, 1051174382); + sum1 = + W(0, 1025372546, -1115668125, 1000611497, 1034391118) + W(1, -1106905723, 1039995714, -1105014230, 1041916975) + + W(2, -1114360751, 1043101563, -1117013085, 1027806076) + + W(3, 1025624474, -1089490746, 1058174613, -1111998130) + W(4, 1037998160, -1092891318, 1045000731, 1008039732) + + W(5, 1032794399, -1107085565, 1035643438, 1030397185) + W(6, 1034992970, -1114405501, -1121180749, 1018926829) + + W(7, -1114244794, -1168885266, -1120880459, 1029203969); + sum2 = + W(0, -1089960886, -1095856011, 1007316785, 1036775569) + W(1, -1092452707, -1106157919, 1041476280, -1107942220) + + W(2, 1049541326, 1074170001, 1050706137, 1021239050) + W(3, 1032119458, -1085150802, -1083810164, -1132331444) + + W(4, 1032929374, 1046048366, 1043182557, 1036225521) + + W(5, -1110883627, -1112079347, -1129593193, -1113579728) + + W(6, -1123073435, 1027735021, -1214669080, 1009639193) + + W(7, 1026522309, -1111935169, 1009058861, 1022066674); + WS(1063524863, 1010978751); + sum1 = W(0, 1033376264, -1090913225, 1054337940, 1034437913) + W(1, 1035248130, -1094935586, 1045510498, 1040021853) + + W(2, 1029138555, -1084407830, 1057961148, -1141033844) + + W(3, 1040606570, -1085174115, 1062831778, 1032741433) + + W(4, -1146340206, -1080254739, 1060252175, -1127614262) + + W(5, -1122169062, -1094320024, 1058700983, -1136275261) + + W(6, -1113033206, 1033710501, 1045946247, 1007782611) + W(7, -1115451138, 955403507, 1033261261, 1030604567); + sum2 = W(0, -1096400044, 1053621644, 1017015195, 1037111777) + W(1, 1043917783, 1009306318, 1005897821, -1106811629) + + W(2, -1123678571, 1051339656, -1141989437, 1047789047) + + W(3, -1090244436, 1062093709, 1065539532, -1093438727) + + W(4, 1046901313, -1080576226, -1083332175, 1049955112) + + W(5, 1048870815, -1106342004, -1097183812, 1043219374) + + W(6, 1033884063, -1098524562, -1097464341, 1050393105) + + W(7, 1053211427, -1124418811, -1092155120, 1044056917); + WS(-1085369887, -1080302329); + sum1 = W(0, 1021216124, -1112260523, 1035888345, -1110274640) + + W(1, -1121762938, -1119192737, 1049037307, -1111476420) + + W(2, -1103047566, 1050211017, 1061443675, -1097892613) + + W(3, -1094342263, 1058411732, 1044828010, -1097171068) + + W(4, -1105630871, -1139271463, -1119204121, -1112160677) + + W(5, -1107174593, 1042276856, -1100915542, 1026261917) + + W(6, 1025950537, -1113852108, -1174284878, -1110403297) + + W(7, -1146340105, -1119668597, -1119790119, -1132483222); + sum2 = W(0, -1115512925, 1035074177, -1191992884, -1115656893) + + W(1, -1146353705, 1040461813, 1043381354, -1137020948) + W(2, 1036066439, 1042528734, 1059049535, 1021899784) + + W(3, -1134998124, 1058355837, 1058956516, -1112812041) + + W(4, -1093678923, -1081621864, -1095612272, 1012903452) + + W(5, -1122018103, -1089980594, 1050844919, -1123282157) + + W(6, -1110317749, 1049357806, -1100731037, -1122890057) + + W(7, 1002801625, -1101025299, 1036998024, 1023124620); + WS(-1106521214, -1077666555); + sum1 = W(0, 1003321829, 1052142545, -1102912320, -1108686032) + + W(1, -1120901013, 1052094618, -1105733097, -1118608535) + + W(2, -1105222370, 1060439250, -1085669204, 1045702647) + + W(3, -1107011833, 1059969903, -1113880763, -1106161276) + + W(4, 1029823211, -1095361591, 1052882623, -1103122454) + + W(5, 1000924822, 1039904896, -1107186882, -1106172071) + + W(6, -1127794128, 1000548911, -1118745688, -1113781993) + + W(7, 1027793952, 1046166153, -1096551831, -1132637458); + sum2 = W(0, 1034079401, 1025264110, -1123371956, -1116991392) + + W(1, -1123608512, -1119278092, -1104246380, -1156408861) + + W(2, 999851902, 1031056700, 1051208451, -1098806852) + W(3, -1128074608, 1059405503, 1063218900, 1038716729) + + W(4, -1102099502, -1123208440, -1110007228, -1136590423) + + W(5, -1109589984, -1081290516, -1131612640, 1034885175) + + W(6, -1127758712, 1015173988, -1124651080, 1009682031) + + W(7, 1032460032, -1121242732, 1025045004, -1115963068); + WS(1061862175, -1081928168); + sum1 = W(0, -1105584175, -1105871745, 1043886056, 1027658214) + W(1, 1024897880, -1093982770, 1052657028, 992865878) + + W(2, 1038516044, -1092069365, 1055074797, -1121064957) + + W(3, 1040792761, -1083616743, 1065026281, -1106374835) + + W(4, 1041867802, -1089303929, 1056987882, 1015027694) + + W(5, -1146323132, -1089274268, 1054263413, -1132520748) + + W(6, 1033649803, -1106858177, 1043742846, -1137844354) + + W(7, -1113939311, -1096909360, 1049053899, 1017619030); + sum2 = W(0, 1078367032, 1027322757, 1023449836, -1115583846) + W(1, 1056220347, 1044756153, -1148770222, 993742973) + + W(2, -1078889751, -1096547764, 1043960988, -1130380138) + + W(3, -1073546091, -1101560565, -1126862726, -1147412718) + + W(4, -1104234997, 1042443775, 1029550531, -1115461788) + + W(5, -1129365336, 1048890957, -1133306383, 1019814478) + + W(6, -1132392998, -1104280017, -1130422948, -1143007558) + + W(7, -1105729449, 1028418751, 1042854212, -1123464959); + WS(1052938943, -1103606318); + sum1 = W(0, -1114719934, -1087051802, 1058073278, -1114447856) + + W(1, -1110318513, -1108424920, 1044445625, 1040769086) + + W(2, 1051495307, -1085940948, 1060893495, 1037779432) + + W(3, -1100729633, -1082198177, 1058839039, -1103818980) + + W(4, 1058926789, -1090825863, 1060585177, 1053070735) + + W(5, -1090569589, -1088355266, 1053564817, -1091337376) + + W(6, 1050591187, -1096343413, 1054456219, -1131842819) + + W(7, -1120060704, -1090847836, 1059253187, 1026807692); + sum2 = W(0, 1015621136, 1033006755, -1072583370, 1074691924) + + W(1, 1032703681, -1098289077, -1084108607, 1067219112) + + W(2, 1048700747, -1098808895, -1081224226, 1064576163) + + W(3, -1098355550, 1046984196, -1081041246, 1066863963) + + W(4, 1047054427, -1083721832, 1069053051, -1084686190) + + W(5, -1097901072, 1061110777, 1046858869, -1086075738) + + W(6, -1126056922, -1109410901, 1068664236, -1079374171) + + W(7, -1165737020, 1047097145, 1076043754, -1071293986); + WS(-1083248351, 1041375270); + sum1 = + W(0, 998616699, -1087439008, 1054645196, 1045294540) + W(1, -1142901727, -1092067298, 1052452449, -1128264947) + + W(2, 1043282847, -1097778587, 1050602866, 1042620067) + + W(3, -1128981712, -1084179155, 1058025241, -1146688137) + + W(4, 1049050406, -1090979219, 1061357806, -1127282486) + + W(5, -1110272759, -1086455104, 1053431193, -1125997182) + W(6, 1045114289, -1095775369, 1052134295, 981342481) + + W(7, -1170526381, -1087021556, 1053157267, 1046767364); + sum2 = + W(0, -1076239116, 1068235144, 1054062613, -1114529265) + W(1, -1079299620, 1068687973, 1019509447, -1116897962) + + W(2, -1079042334, 1068481951, 1057377046, 1041823371) + W(3, -1083365485, 1066921525, -1100834259, 1032806429) + + W(4, 1049726715, -1106704213, -1095788298, -1104989857) + + W(5, 1066758659, -1080829299, -1107253929, -1107915189) + + W(6, 1069675355, -1077473679, -1112126912, 1021289065) + + W(7, 1075688460, -1073149491, -1090199615, 1034867372); + WS(-1089965567, 1041739713); + sum1 = W(0, 1014059625, 1050606464, -1097348868, 1016608410) + + W(1, -1109541748, 1046384755, -1098095776, -1110057610) + + W(2, -1120181702, 1052952467, -1098227712, -1165355548) + + W(3, -1113826001, 1062759283, -1097909490, -1103909923) + + W(4, -1099389050, 1061539071, -1089710746, 1018410859) + + W(5, -1107441048, 1056969105, -1097990985, -1097884829) + + W(6, -1110918155, 1043585729, -1112431723, -1109883584) + + W(7, -1129336123, 1054439728, -1101291373, -1118732474); + sum2 = + W(0, 1035083591, -1113211599, 1032203968, -1112771443) + W(1, -1112359157, 1037267536, -1129901649, 999833884) + + W(2, 1037205500, -1110383577, 1050641640, -1113848439) + W(3, -1119560270, 1053336900, 1062183610, 1048127168) + + W(4, -1130432545, 1036846600, 1052549520, -1087091182) + W(5, 1033928454, 1029308948, 1037218786, -1080175934) + + W(6, -1111608107, 1035214305, -1098666781, -1106600446) + + W(7, 1027763767, -1137000642, 1041216407, -1105808372); + WS(1040803966, -1079223548); + sum1 = W(0, -1103550802, -1108233168, -1115946235, 1021078213) + + W(1, -1113401739, -1097729981, 1016715200, -1123835458) + + W(2, -1105545077, -1112466052, 1051122342, -1103483180) + + W(3, -1095164520, 1056711305, 1072346450, -1092700173) + + W(4, -1102562113, 1033129898, 1046866637, -1104392485) + + W(5, -1106149592, -1100704991, 1041579689, 1033532004) + + W(6, -1123094707, -1106323272, 1017795558, -1128003929) + + W(7, -1105989383, -1109921151, 1019070562, -1109398092); + sum2 = W(0, -1132003761, -1097131135, 1033952970, -1114013558) + + W(1, -1126076753, -1098724323, -1102131199, 1027012993) + + W(2, 1028715469, -1094337061, 1043946979, -1109613274) + + W(3, -1094940877, 1075670208, 1037045260, 1026138301) + + W(4, -1096054213, -1092647285, 1052392413, -1107006741) + + W(5, 1050064171, -1119763725, -1101691459, 1032910718) + + W(6, -1095828963, -1104609741, -1104710657, -1127911473) + + W(7, 1024912709, -1103386045, 1042676905, -1109320626); + WS(-1077711088, -1080462700); + sum1 = + W(0, 1016976667, -1095463505, 1048382760, 1033669226) + W(1, -1143635214, -1094028818, 1043759401, 1023995271) + + W(2, 1050435883, -1084473735, 1060944248, 1038367764) + W(3, 1025648038, -1081613943, 1061061657, -1104130812) + + W(4, 1033190198, -1092817267, 1059085444, 1035230572) + + W(5, -1119077035, -1089963906, 1058923652, -1115548134) + + W(6, -1127874241, -1112556483, 1024757337, 998948881) + + W(7, -1124293633, -1096263708, 1052630131, 1035279350); + sum2 = + W(0, -1118714905, 1038737245, 1045939428, -1084863446) + W(1, -1128906105, 1033599435, -1124872105, -1120736313) + + W(2, -1104617441, 1047074065, 1073600723, 1072627800) + + W(3, -1102497202, -1081197801, -1069501955, 1076529178) + + W(4, 1052988680, 1051590837, -1078764847, 1066278053) + W(5, 1025452854, 1036478618, -1078626366, -1115729701) + + W(6, -1147569173, 1034730428, -1094352359, -1119746081) + + W(7, 1045309195, -1096538670, -1097394746, 1001372341); + WS(-1085605823, 1039908372); + sum1 = W(0, -1110519177, -1101464226, 1050281295, -1136474287) + + W(1, 998302542, -1097280531, 1040574050, 1017687606) + W(2, -1105109851, 1050325520, -1112501642, 1027599892) + + W(3, 1051114493, -1093718398, -1095999987, 1038451002) + + W(4, 1047758692, -1109283231, 1052111506, -1112873934) + + W(5, 1047411644, -1103804777, 1013903280, 1026946257) + + W(6, 1008966514, -1107759461, -1131548857, 1007362713) + + W(7, 1027414133, -1099881946, 1037344125, 1030395745); + sum2 = W(0, -1115357326, -1098998597, 1033193484, -1119934044) + + W(1, -1129481498, -1104582263, 1041990652, -1109942748) + + W(2, 1037423788, -1098625511, 1052524895, 1028176618) + W(3, -1149109833, 1036322812, 1029624616, 1032249206) + + W(4, -1107237807, 1050926614, -1102468922, -1117055607) + + W(5, -1098320683, 1045914812, 1016354632, 1026298641) + + W(6, -1118016391, 1029306918, 1029333966, -1116685452) + + W(7, -1111060805, 1035368549, 1036818044, -1113790705); + WS(1066221936, -1112686252); + sum1 = + W(0, -1111426931, 1042737360, 1039181581, -1110677245) + W(1, 1049363148, -1108750629, -1105687720, 1035534704) + + W(2, -1090113310, 1053136109, 1051677110, -1101864162) + W(3, 1038796336, -1095853365, 1031102479, 1019901392) + + W(4, -1102958241, -1108890233, 1058267293, -1107302241) + + W(5, 1041899238, 1023718298, -1089545128, 1048841797) + W(6, -1104001476, 1033191264, 1047293124, -1106653499) + + W(7, -1112879133, -1165972390, 1010166848, 989728967); + sum2 = + W(0, 1019579309, -1121628281, -1104132268, -1133616314) + W(1, -1115216952, 1041466962, -1110659898, 1046938970) + + W(2, -1101014764, 1044350744, -1092586315, -1089581193) + + W(3, 1035949455, -1096356807, 1067161402, -1097777539) + W(4, -1125343389, 1019949697, 1044980625, 1025080038) + + W(5, 1020295703, 1011899626, 1028945397, 1042942659) + W(6, -1107189524, 1020414781, 1024223321, 1000298789) + + W(7, 1032252124, -1108620092, -1106879950, 1034429670); + WS(1065647552, 1042223795); + sum1 = + W(0, -1118213891, -1090185691, 1054600851, 1042956769) + W(1, 1047859212, -1099254654, 1056675965, 1045938459) + + W(2, -1102035956, -1085546115, 1052764224, -1095542592) + + W(3, 1049817209, -1090115457, 1060918524, 1048397149) + + W(4, -1136727619, -1086839140, 1050058698, -1107166488) + + W(5, 1018314812, -1089622500, 1053194074, -1115710386) + W(6, 1048950515, -1103143659, 1055030644, 1046421002) + + W(7, -1111834851, -1088857895, 1046059111, 1019098869); + sum2 = + W(0, 1038047795, 1045715537, 1062099960, -1074982428) + W(1, -1100534663, -1109612723, 1074456323, -1071944747) + + W(2, 1043709757, -1109559353, 1074047524, -1086420775) + + W(3, -1098906327, -1088589586, 1061406543, -1087600981) + + W(4, 1054998296, 1046750383, -1109444720, 1058024333) + W(5, -1097979318, 1030039799, -1095255331, 1040647828) + + W(6, 1042447686, -1112135838, -1106577876, 1042372587) + + W(7, -1135615252, -1108474833, -1098188594, 1051479186); + WS(-1099261566, -1102058551); + sum1 = W(0, 1037460750, -1099740733, 1035868896, 1046250530) + W(1, -1118752449, 1038344912, 1028635221, 1040547388) + + W(2, 1048855473, -1097823268, -1135561696, 1049218244) + + W(3, 1046116085, -1077722267, -1089090112, 1053686776) + + W(4, 1041532007, -1086845489, 1054063629, 1041462458) + W(5, 1043443965, -1109540512, 1036245196, 1041323791) + + W(6, 1035797482, -1112472539, 1039520068, -1116084210) + + W(7, 1048656673, 1006300060, -1115462467, 1050214602); + sum2 = + W(0, -1107023704, -1099880087, 1047853298, -1106650230) + W(1, -1103130345, 1049640504, -1100868353, 1035820630) + + W(2, 1025081245, -1099241173, 1050410790, -1111373979) + W(3, 1007138702, 1060797185, -1096656068, 1048085306) + + W(4, 1020633935, -1096100738, 1053061345, -1098540289) + W(5, 1042694232, 1034621436, -1092716332, 1045275377) + + W(6, -1116958023, -1100840753, 1057695342, -1095110662) + + W(7, -1117764771, 1051814059, -1092707384, 1026583068); + WS(-1081437504, -1086037448); + sum1 = W(0, 1002898847, 1048903167, -1098037791, -1124004134) + + W(1, 1034161364, 1048827465, -1110924302, 1038960439) + + W(2, -1097339820, 1058952469, -1089826679, -1109622563) + + W(3, -1102052735, 1062493730, -1082951605, 1046141833) + + W(4, -1122224578, 1056452878, -1095802941, 1037494008) + + W(5, -1116847174, 1052097743, -1093057352, -1142221339) + + W(6, -1124219870, 1046287775, -1115921615, 1018754897) + + W(7, -1114337484, 1051622635, -1097214606, -1115514650); + sum2 = + W(0, 1026296217, -1098267531, 1056065541, -1107249906) + W(1, 1046658552, 1054123387, -1080723543, 1049528827) + + W(2, -1092482457, 1031912087, 1068312252, -1094476247) + + W(3, 1048926974, -1103258874, -1095327126, -1114829012) + + W(4, -1093986590, 1064081451, -1101319294, -1110151549) + + W(5, 1051240634, -1081783631, 1054428583, -1109929036) + W(6, 1031417427, 1052301313, -1095108256, 1023898518) + + W(7, -1116201775, -1136084293, 1032992382, -1131461985); + WS(1059931039, 1045326059); + sum1 = + W(0, -1105339195, 1027626820, 1035394960, 1020852317) + W(1, -1116497429, -1102542884, 1045819641, -1110241387) + + W(2, -1104905094, 1042432944, 1050447189, -1120454715) + W(3, 1048600749, -1087368655, 1050459387, 1028063406) + + W(4, 1017781140, -1090841955, 1058872902, -1135766366) + W(5, 1028510504, -1098837680, 1038310627, 1046575867) + + W(6, -1104151378, -1135818261, 1009721182, -1121800177) + + W(7, 1006123003, -1102238241, 1039487803, -1138241103); + sum2 = + W(0, -1108715925, 1033521028, -1130002309, 1043372642) + W(1, -1125695753, -1107049318, 1043711791, -1096562690) + + W(2, -1106861101, -1126359337, 1069432650, 1055907536) + W(3, 1037467647, 1024736242, 1069236178, -1077602923) + + W(4, 1049447879, -1096919459, -1089672176, -1079492159) + + W(5, -1108013135, 1030099711, -1104043463, 1048192702) + W(6, 1016159100, 1038861546, -1102967963, 1041544949) + + W(7, 1025122350, 1027296385, -1115278753, 1038199238); + WS(1065273279, -1155200022); + sum1 = + W(0, 1032043190, -1110724474, 1048813356, -1107914275) + W(1, 1042748400, -1113644224, -1113329098, 1017813644) + + W(2, 1044363154, -1103694886, -1138873982, -1119126921) + + W(3, -1101712885, 1049530899, 1013956115, 1030506334) + W(4, 1020290996, 1032343156, -1088512539, 1047677002) + + W(5, 1042545917, -1119655327, -1118975351, 1035449518) + + W(6, 1023679047, -1113927803, -1112426340, 1040385292) + W(7, 969146311, 1014066252, -1102619473, 1037002750); + sum2 = + W(0, -1105379539, 1040024171, 1054804566, 1020126178) + W(1, -1114326988, 1033596237, -1100858724, 1058095820) + + W(2, -1128505094, 1027874005, -1108932212, -1095228668) + + W(3, -1127815582, -1090164335, 1015111122, -1114002666) + + W(4, -1144273240, 1026082941, 1057491035, -1109234902) + + W(5, 1011114412, -1098155637, -1123558275, -1117423595) + + W(6, 1010998384, 1010514392, 1041639386, -1148517800) + W(7, 1008109660, -1110656550, 1025837089, 1028462436); + WS(1064822335, -1095840736); + sum1 = + W(0, 1049019197, 1056391992, -1082098174, 1047279757) + W(1, -1114924672, 1052717533, -1097259572, -1158101509) + + W(2, 1006539024, 1053226600, -1083318869, 1028150783) + W(3, 1027273471, 1063307800, -1085358981, 1048033194) + + W(4, 1024001604, 1051465786, -1093212548, 1040827508) + W(5, 1023329786, 1056189595, -1096912972, -1122795750) + + W(6, 1034076369, 1051405604, -1097995110, 1040247311) + + W(7, 1032078653, 1049885284, -1090164049, -1102713147); + sum2 = W(0, 1044291516, 1057945825, 1075245425, -1075047571) + + W(1, -1105536143, 1059138923, 1063262829, -1084742426) + + W(2, -1123279074, 1064153610, 1058517731, -1087050661) + + W(3, -1102729189, -1117658388, 1055818216, -1094508761) + + W(4, 1019015608, -1082824416, -1095331241, -1107921801) + + W(5, -1098099014, -1088923796, -1082492094, 1066223948) + + W(6, 1041233257, -1114762777, -1084810008, 1065694420) + + W(7, -1116414073, -1093119165, -1076437009, 1070896480); + WS(-1090760447, 1052695066); + sum1 = W(0, 1032827391, -1086160295, 1058956361, -1122589400) + + W(1, 1004836815, -1100507696, 1050270371, 1011775197) + + W(2, 1040820154, -1085279840, 1061054293, -1126907788) + + W(3, 1033221771, -1085951050, 1060000376, -1109718672) + + W(4, -1142824410, -1090476887, 1053225609, 1031459881) + + W(5, 1019263487, -1096291378, 1052048107, 1014310644) + W(6, 1033909728, -1104244158, 1044967298, 1002236306) + + W(7, 1030288497, -1096098979, -1123372967, 1050105184); + sum2 = W(0, -1115548553, -1119133376, 1034230379, -1106450540) + + W(1, 1010795990, 1054475337, 1049648601, -1130742967) + W(2, 1025233265, -1126101085, 1031862009, 1074765700) + + W(3, -1108773712, -1096206384, 1056453743, 1076253468) + + W(4, 1028577219, 1025243447, -1092511031, 1067142167) + + W(5, -1123367926, -1123699076, 1040231624, -1082850789) + + W(6, 1027045545, -1116348436, 1052333940, -1074864896) + + W(7, 1016487959, 1026289255, -1098871930, -1066441953); + WS(-1098442559, 1026469881); + sum1 = W(0, -1149983818, 1050517915, -1114000872, -1106643136) + + W(1, -1119522441, 1049663660, -1102209381, -1107005098) + + W(2, -1111872220, 1057681670, -1097110004, -1107624656) + + W(3, -1148708523, 1054270423, -1080449641, 1044397088) + + W(4, 1033974589, 1065584902, -1089390067, 1040137492) + W(5, 1034687077, 1060962908, -1088971425, 1011262833) + + W(6, -1121497336, 1043551013, -1096207069, -1152197144) + + W(7, 1040191316, 1037520938, -1098201593, -1111636393); + sum2 = W(0, -1093666199, 1067471948, 1044138823, -1087858714) + + W(1, 1049995354, -1083836095, -1089657247, 1040673003) + + W(2, -1104373549, 1067519925, 1068116530, -1086283540) + + W(3, -1108191449, 1075025493, 1070698122, -1107890740) + + W(4, -1086862321, -1079149522, -1077256496, 1052510667) + + W(5, -1109961150, -1092122258, -1092830464, 1044801958) + + W(6, -1105617480, -1118106953, -1104600439, -1113062539) + + W(7, 1057348983, -1090446878, -1095892285, 1040940184); + WS(-1089367999, -1080592817); + sum1 = + W(0, 1050901372, 1020565079, -1098563453, -1123752726) + W(1, -1142600967, 1046045566, -1094642094, 1032349343) + + W(2, 1043029392, 1051791856, -1092783656, 1017360893) + W(3, 1042662963, 1059303201, -1082254536, 1040706037) + + W(4, -1131715556, 1060541458, -1088235102, 1038984656) + W(5, 1028335344, 1057651322, -1083519131, 1042767141) + + W(6, 1009439676, 1050310918, -1088554180, 1039511244) + W(7, 1040529906, 1061742083, -1084895582, 1037250730); + sum2 = + W(0, -1086948904, 1072921984, -1102597600, -1081008410) + W(1, 1044777691, -1096214776, -1086612116, 1053678014) + + W(2, -1085906527, 1069427540, 1055370552, -1094318103) + W(3, -1107333159, 1069014322, 1068187895, 1040782350) + + W(4, -1094251850, 1068759557, 1049876941, -1097053445) + + W(5, -1101622483, -1095651744, -1098339283, 1052418274) + + W(6, 1054103540, -1080635176, -1098368915, -1116179967) + + W(7, -1095334551, -1071443034, -1119710681, 1057760894); + WS(-1072329816, 1074376722); + sum1 = + W(0, -1119826815, -1097135645, 1051061560, 1001332238) + W(1, 1034466519, -1100415357, 1050212013, 1009264740) + + W(2, -1121811611, -1123247055, 1057003368, -1119531350) + + W(3, 1040071236, -1078161261, 1050094223, 1047608180) + W(4, 1034412551, -1086793716, 1060987117, -1139666027) + + W(5, -1125783811, -1092987820, 1053182609, 1053959834) + + W(6, 1025497578, -1117997032, 1030369595, -1130537576) + W(7, 989295697, -1097292445, 1040352158, 1003451511); + sum2 = + W(0, 1010850411, 1033963983, 1041326744, -1110591524) + W(1, -1119692159, 1024673399, -1126975570, 1039643589) + + W(2, -1110113403, -1107122545, 1049177676, -1098235771) + W(3, 1041465994, 1041917938, 1075051781, 1061676083) + + W(4, 1019542894, 1031918417, 1057547658, -1072022345) + W(5, 1041361680, 1016152214, -1100210466, -1080793678) + + W(6, -1128076954, -1119110501, -1101468559, 1038326573) + + W(7, 1035827461, -1108745692, -1111890885, -1115279667); + WS(-1089734463, 1065567745); + sum1 = W(0, -1115310942, -1089748010, 1053493076, 1041536229) + + W(1, 1048676446, 1033541431, 1047890913, -1111760907) + W(2, 1051913151, -1091844976, 1060749357, 1031051700) + + W(3, 1041943745, -1078026925, 1057682191, 1033727319) + + W(4, 1032260949, -1083863979, 1060855949, -1117552023) + + W(5, -1123414147, -1088695462, 1057895644, -1123512523) + + W(6, 1025799735, -1097284573, 1049355215, -1134918146) + + W(7, -1118314271, -1090712276, 1052101531, 1037093278); + sum2 = W(0, -1087048499, 1067110585, 1062551012, -1088705293) + + W(1, -1089227831, -1073947481, -1107011493, 1063056164) + + W(2, -1081828818, -1100054441, 1044700801, -1091908804) + + W(3, -1106022394, 1057992187, 1053279159, 1049660447) + W(4, 1057638724, -1096117153, 1047077354, 1041467137) + + W(5, 1053589051, 1049824990, -1098858111, -1112699600) + W(6, 1030725267, 1008667589, 1055551992, 991046018) + + W(7, 1050363813, 1047082764, -1093863007, -1118599281); + WS(-1079109040, -1085312521); + sum1 = + W(0, 1023769582, 1037365911, -1113299189, -1127522065) + W(1, -1140282322, -1117579705, 1042794748, -1098682508) + + W(2, -1105105824, 1052645482, -1086336671, 1041518392) + W(3, 1041551140, 1061549365, -1087637436, 1049784787) + + W(4, 1030694836, -1092653220, 1051894263, -1104535548) + + W(5, -1111084358, 1050958145, -1111723928, -1112540051) + W(6, 955351653, -1113919416, 1039072513, 997865134) + + W(7, -1133450021, 1047664699, -1111528112, -1121426302); + sum2 = W(0, -1112127727, -1182735741, 1027967369, -1099828018) + + W(1, 1037755147, -1116775242, -1108084106, -1106208929) + + W(2, -1117076760, -1110833901, 1047419656, -1106621688) + + W(3, -1096944427, 1050960349, 1057406540, -1093670465) + W(4, 920706880, 1057824022, -1106635563, 1046907280) + + W(5, -1126463908, 1025802869, 1030718323, -1104727129) + + W(6, 1025583781, -1117624689, -1129307942, 1024731263) + + W(7, 1016301114, -1106817101, -1146210056, -1133403952); + WS(1066445424, -1114782683); + sum1 = W(0, -1105169880, -1110498524, 1042140161, 1033176686) + + W(1, 1037849343, -1092096849, 1045982494, 1027992139) + + W(2, -1111719878, -1089773556, 1059787797, -1104315937) + + W(3, 1053025475, -1093199580, 1058443885, 1034263873) + + W(4, -1106443352, -1085224723, 1058982105, -1099213011) + + W(5, -1118185334, 1017432168, 1051015495, 1015617473) + + W(6, -1115180998, -1097477655, 1049335790, -1134277975) + + W(7, -1104379365, -1120659192, 1047806371, -1124174113); + sum2 = + W(0, 1035156885, -1104443938, 1020765936, 1034215267) + W(1, 1010861092, -1111353322, -1131256669, -1119467871) + + W(2, 1053142713, -1092519845, 1043066295, 1043572605) + W(3, 1050643378, 1033492110, -1093594884, -1120345789) + + W(4, -1093995815, 1061622434, -1090891830, 1035132204) + + W(5, -1100307988, 1045835461, 1051701313, -1120193257) + + W(6, -1094190457, 1054276307, -1115303200, -1107758441) + + W(7, -1095534688, -1118030035, 1044764145, 1010759898); + WS(1053797695, 1034928741); + sum1 = + W(0, -1113709609, 1027306577, -1089618673, 1039738506) + W(1, -1101985872, 1036410350, -1094568298, 1041675949) + + W(2, -1098832221, 1048222316, -1089721378, 1049870789) + W(3, -1106547453, 1049396519, 1057932790, 1032602030) + + W(4, 1032341932, -1093507345, 1051551069, 1041034929) + W(5, 1038712045, -1098128846, 1042310981, 1020376402) + + W(6, 1020651977, -1102358117, 1032076306, 1038606871) + W(7, 1037110646, -1095739626, 1049811664, 1036847389); + sum2 = + W(0, -1107569978, -1096371488, -1091206842, -1113379832) + + W(1, 1048834253, -1100415470, -1140716449, -1098639187) + + W(2, 1032955728, -1097656368, -1099982688, -1102236471) + + W(3, 1047116738, 1057366407, 1067804624, -1112454303) + W(4, -1095875849, 1049724515, -1107732848, 1037256860) + + W(5, 1024141754, 1047568587, -1101898886, 1039735469) + W(6, -1117854930, 1025784853, -1104360749, 1034482735) + + W(7, 1031286951, 1040928209, -1099991629, -1122662653); + WS(-1100599294, -1113486107); + sum1 = W(0, 1041832895, 1058015130, -1095482492, -1123207408) + + W(1, -1113994869, 1043005476, -1095369841, -1120610968) + + W(2, -1101582062, 1065539217, -1088297536, 1040056719) + + W(3, -1100675730, 1054749782, -1085935041, -1111595960) + + W(4, 1015862616, 1046936430, 1054414015, -1110844045) + W(5, 1033573462, 1043027144, -1096194081, 1041950395) + + W(6, -1123901241, -1122192647, -1118572185, 1007333963) + + W(7, -1147102474, 1047923809, -1106262926, -1097939280); + sum2 = W(0, 1033496750, -1105017139, -1118941046, 1012703263) + + W(1, -1118187780, 1043450683, -1142467441, 1009095593) + + W(2, 1041080086, -1106458832, -1096734279, 1025973118) + + W(3, -1102935461, 1057933296, 1063076098, -1089439993) + + W(4, 1023898015, -1098239652, -1119844388, -1124882200) + + W(5, -1122438380, -1111698692, 1048742138, 1004297609) + + W(6, 1007185073, 1023645924, -1096898561, 1046154393) + W(7, 999989929, 1034431733, -1090457759, 1048791679); + WS(1058454143, -1086058342); + sum1 = W(0, -1115074879, 1051341170, -1123276713, 1040408770) + + W(1, -1099743710, 1054019099, -1112675511, 1042487060) + + W(2, -1103933280, 1057240637, -1095853513, 1044345774) + + W(3, -1113530407, -1085932301, 1048593300, 1034191179) + + W(4, -1124606630, -1090466976, 1059272419, -1105205160) + + W(5, -1115568198, -1097279225, 1052135974, -1111240730) + + W(6, -1123572016, -1108988935, 1039376368, -1135917288) + + W(7, -1118699368, -1095706385, 1041536544, 1043157563); + sum2 = W(0, 1047642666, -1106684338, -1097565895, 1038757740) + + W(1, -1094360366, -1104496052, -1137000462, -1120606628) + + W(2, -1111839157, -1101578828, 1017360469, 1043520604) + + W(3, -1101124559, 1062389037, 1056361687, -1110716481) + + W(4, -1119401007, -1099504899, 1057357121, -1121032787) + + W(5, -1114275291, -1102577927, -1111580608, -1174578992) + + W(6, 1010413358, -1121638606, 1047557438, 1020758339) + + W(7, 1018914035, -1100286365, -1108198790, 1031842399); + WS(-1116191222, -1087222261); + sum1 = W(0, 1051378220, -1092140039, -1098282527, -1115126509) + + W(1, 1026061480, 1041212802, -1108686318, 1018050395) + W(2, 1051132746, 1028855632, -1114615088, 1028919646) + + W(3, -1131139769, 1054776996, -1096808426, 1031880915) + + W(4, 1029438530, 1052461054, -1090181940, 1047407636) + W(5, 1010253799, 1056191968, -1089672580, 1041055121) + + W(6, -1140691900, 1041996679, -1095415146, 1025713945) + + W(7, 1032111196, 1051463563, -1084069643, 1049760258); + sum2 = W(0, -1120688670, 1075791226, 1072772368, 1033088733) + + W(1, 988781159, -1079951996, -1096143661, -1126178338) + + W(2, 1023531678, -1080919050, -1087274515, 1039982901) + + W(3, 1034244658, -1078043585, -1074830486, -1153355920) + + W(4, 1038669521, 1061514147, -1138433181, 1047086021) + + W(5, -1125227753, 1050383220, -1091737459, -1117938706) + + W(6, -1122152897, 1043495776, 1043710967, 1036258954) + + W(7, -1123518214, 1056154705, 1064633897, -1090859740); + WS(-1086114623, -1084816591); + sum1 = + W(0, -1119067590, 1036163639, -1106221778, 1015833809) + W(1, 1041053515, -1112478813, -1114565991, 1041839788) + + W(2, -1123050946, 1045609440, -1102274148, 1038604869) + W(3, 1050414506, -1091176571, 1041957568, 1049671879) + + W(4, 1017204584, -1096458464, -1140250052, 1016035267) + W(5, 1033253648, -1092456237, 1042499428, 1004159150) + + W(6, -1109025761, 1039781304, 1024592194, 1019624502) + + W(7, -1142909644, 1019336538, -1110741472, 1038938427); + sum2 = + W(0, 1006657945, -1115603798, 1043167348, 1032033598) + W(1, -1145756082, -1129023472, 1029036192, -1122908214) + + W(2, -1102183527, 1024575987, -1134024937, 1013148193) + + W(3, 1043063832, -1070476153, -1079118960, -1117007948) + W(4, 1048257970, 1078068971, 1058188063, 1026806223) + + W(5, 1030027167, 1034687231, 1026633068, -1106350665) + W(6, -1129422896, 1014471457, -1138449465, 1037397710) + + W(7, -1120006792, 998969122, 1035752331, -1119066852); + WS(1058895967, -1115291633); + sum1 = W(0, -1125313920, -1118075736, -1101537045, -1102743433) + + W(1, -1110715998, 1028840739, -1106860038, -1113756805) + + W(2, -1110540830, 1050429809, -1109809347, -1112821659) + + W(3, -1093243535, 1056177832, 1062536899, -1094426092) + + W(4, -1098773368, 1050921353, 1050429425, -1112140166) + + W(5, -1114664694, 1021103494, 1042267175, -1105504016) + + W(6, -1108229374, 1039051533, -1104944731, -1123143221) + + W(7, -1128878150, 1048765371, 1019165331, -1113092552); + sum2 = W(0, -1118991740, 1049660250, -1072802862, -1093107290) + + W(1, 1035161218, -1092533458, -1084844108, -1131472334) + + W(2, 1031409558, 1052404039, 1059153934, -1099814906) + W(3, 1025873763, 1059098325, 1066715964, 1050189246) + + W(4, -1130385854, 1035329255, 1054800035, 1033113369) + + W(5, -1109675818, 1033133876, -1121630224, 1032032260) + W(6, 1035221069, -1100849576, 1017402854, 999987753) + + W(7, -1106515599, 1041079456, 1051036492, -1109656332); + WS(-1088275071, -1079832501); + sum1 = + W(0, -1121609972, -1140631216, 1031902612, -1114449795) + W(1, 1054795207, 1001216956, 1053928586, 1049117898) + + W(2, -1091175970, -1109051587, -1100362195, -1089874193) + + W(3, 1036185063, -1108520810, -1118566269, 1024185910) + W(4, 1036253081, -1112588624, 1050418310, 1033419200) + + W(5, -1095852779, -1111932116, -1106845532, -1098704820) + + W(6, 1056993046, 1018114011, 1057036918, 1052334541) + + W(7, -1099614386, -1114447781, -1106898567, -1103629998); + sum2 = W(0, 1034198694, -1099753021, 1052074243, -1101897553) + W(1, 981839325, 1036479145, 1033443852, -1125560160) + + W(2, 1050051875, -1087878645, 1061175239, -1090657055) + + W(3, 1043520387, -1099082069, 1044393022, -1126528836) + + W(4, -1099547613, 1049181233, 1036533430, -1113239720) + + W(5, 1020237946, -1106552091, -1125692060, -1111189720) + + W(6, -1112528204, 1051666481, -1100952955, 1038783930) + + W(7, 1032634213, -1105193718, 1038429221, -1110455840); + WS(1055684799, 1057467177); + sum1 = + W(0, -1115635180, -1084593518, 1057349085, 1044528285) + W(1, 1040983065, -1097583958, 1048845932, -1108137881) + + W(2, 1033664034, -1088354001, 1059080519, 1042415046) + W(3, 1047016048, -1083875169, 1057461395, -1130549589) + + W(4, 1040303666, -1089538899, 1055847004, 1025308788) + W(5, 1031194256, -1090088564, 1052697432, 1040121956) + + W(6, 1036112338, -1096939300, 1050363555, -1124884732) + + W(7, 1031542812, -1092334596, 1025617138, 1051059157); + sum2 = W(0, 1039076253, 1084724252, 1055999642, -1111202323) + W(1, 1043377438, 1057352437, -1108204793, 982595482) + + W(2, -1111770710, -1070809771, -1115649819, 1026864091) + + W(3, -1129064764, -1070013447, -1084654208, 1008953953) + + W(4, 1041506513, 1024963427, 1027889169, 1041107952) + + W(5, -1117340191, -1115045950, 1023558847, -1112891517) + + W(6, -1113661124, 1037860995, -1108774739, -1161342746) + + W(7, 1006037802, -1120758055, 1034794526, 1036271073); + WS(-1089965247, 1033154456); + sum1 = + W(0, -1118330000, 1037068672, 1043453383, -1112803845) + W(1, 1043361746, -1091726905, 1027410848, 1030795409) + + W(2, 1028536899, -1106295439, 1047994631, -1111747193) + + W(3, -1106541856, -1087991002, 1053447482, -1109712917) + + W(4, -1103233833, -1094017778, 1058853977, -1110327970) + + W(5, 1037178020, 1026207675, 1049286760, -1111739348) + W(6, -1122355891, -1102222128, 1044913013, 1037236782) + + W(7, -1148310999, -1106998176, 1056026770, -1104668925); + sum2 = W(0, -1104081637, -1104712414, 1038273275, -1102746442) + + W(1, -1115350296, 1065017407, 1027805677, 1038124336) + + W(2, -1102551062, -1101193417, -1097697554, 1025981021) + + W(3, 1033477476, 1054909386, 1069044481, -1090398660) + W(4, 1048930937, -1096226206, 1051154993, 1049254524) + + W(5, -1092653578, -1094950793, -1097937335, -1111378843) + + W(6, 1049862570, 1042131871, -1115393002, -1100983150) + + W(7, -1095610208, -1100838677, -1090656582, 1038627466); + WS(1053522367, -1088249107); + sum1 = W(0, 1041083642, 1049354980, -1104528935, -1116245577) + + W(1, -1109062519, 1050121221, -1089361286, -1108913352) + + W(2, 1041255149, 1062047573, -1094323010, 1044478835) + + W(3, -1129341567, 1050256849, -1085946707, -1106612546) + + W(4, -1122816004, 1058306025, -1092704114, 1010650184) + + W(5, 1034422596, 1054029415, -1096738148, -1127765836) + + W(6, -1105678140, 1043380368, -1095183726, 1004046811) + + W(7, 1002201935, 1057986114, -1098664466, -1116617606); + sum2 = W(0, -1115691041, 1047105417, 1066880006, -1078420733) + + W(1, -1122196578, 1040512713, 1072356775, -1074089832) + + W(2, -1133382325, -1115639944, 1070833917, -1079250237) + + W(3, -1119943136, -1093984910, -1106032356, 1053171659) + + W(4, 1035619338, -1128164365, -1084317659, 1063302165) + + W(5, 1026693101, -1112542694, -1103058628, 1050228647) + + W(6, -1121646682, 1040561229, -1106694088, -1111273903) + + W(7, 1035287249, -1122951759, -1109474775, 1041535222); + WS(1054980735, -1118400611); + sum1 = + W(0, 1023857233, 1056052581, -1108899938, -1098911041) + W(1, -1136534172, 1054619866, -1084632317, 1014993130) + + W(2, -1109579886, 1062631892, -1087670245, 1019079234) + W(3, 1024279465, 1063340895, -1087714282, 984908360) + + W(4, 1031638446, 1054891904, -1089981519, 1040973935) + W(5, 1042081899, 1032051762, -1091518889, 1034243544) + + W(6, 1025101580, 1036582853, -1100292439, 1038263499) + W(7, 1037741818, 1040187076, -1096282711, 1035333164); + sum2 = W(0, 1048663857, -1103126769, -1090522781, -1135969141) + + W(1, -1115607290, -1089284711, -1135630263, -1096474341) + + W(2, 1050959246, -1106476140, -1116194786, -1110761886) + + W(3, -1094885185, 1065597134, 1068281966, -1097679100) + + W(4, 1032263390, -1114774312, -1114594327, 1030603925) + + W(5, -1094433235, 1044112203, 1034641663, 1025157613) + + W(6, 1034671855, -1110680696, -1120338125, -1121778209) + + W(7, -1100445080, 1044150663, 1039802827, -1101519530); + WS(-1099426814, 1028666567); + sum1 = + W(0, 1017347599, 1050515008, -1097546199, -1122852442) + W(1, -1114817850, 1054909169, -1091252816, 1034424401) + + W(2, -1102332157, 1058789976, -1088740593, 1040697053) + W(3, 1038414608, 1049870885, 1026332624, -1119196265) + + W(4, 1040863441, -1096181150, 1050979384, -1096850298) + + W(5, 1043586729, -1094822147, 1046083753, -1101867410) + + W(6, 1033560385, -1110297504, 1043042893, -1112505198) + + W(7, 1024225691, 1035801215, -1106319780, 1022200238); + sum2 = W(0, 1032296335, -1113854030, -1123218166, 1034439881) + + W(1, -1113414658, 1056314261, 1057288090, -1106401889) + W(2, 1032045591, 1056282685, 1048444709, 1027355020) + + W(3, -1096252543, -1076472908, -1076465599, -1099548772) + + W(4, 1039836782, 1041975936, 1054239999, 1041344971) + W(5, -1130462124, 1060789196, 1064414385, -1137373456) + + W(6, 1032505935, -1113045826, -1101415652, 1031341874) + + W(7, 1017080436, -1114544525, 1017354944, -1131418272); + WS(1048405758, 1021439377); + sum1 = W(0, -1095783591, 1056714988, -1095028931, -1099026446) + + W(1, 1004365570, 1053912029, -1097931508, 1040281084) + + W(2, -1111296393, 1060368018, -1093355890, 1042667324) + + W(3, -1090472608, 1058906144, -1084869763, -1099317986) + + W(4, 1053249340, 1059710205, -1111710658, 1058667863) + + W(5, -1096289768, 1050004859, -1089344390, -1094050929) + + W(6, -1116930177, 1050104788, -1098648430, 1032145973) + + W(7, 1031327257, 1057263364, -1095692170, -1127343131); + sum2 = + W(0, -1137650289, -1102128439, 1065729447, -1085103011) + W(1, -1108324664, 1038586891, 1042582877, -1096095433) + + W(2, -1107068637, -1102631398, 1055966210, -1096657292) + + W(3, 1053004242, -1096144010, 1066736444, -1084794119) + + W(4, -1096186406, 1065778432, -1077760412, 1061684194) + + W(5, 1044011702, -1087564484, -1109340585, 1053274132) + W(6, 1031462490, 1041037240, -1088233524, 1060428365) + + W(7, 1016473473, -1095964556, -1079487884, 1070082531); + WS(-1120621558, -1109747932); + sum1 = W(0, 1041405257, 1056552380, -1086075216, 1021959803) + W(1, 1034046808, 1057052863, -1102283433, 1009707220) + + W(2, -1118447615, 1034826244, -1089852749, 1002695151) + + W(3, 1031113092, 1061462741, -1087896594, 1030648525) + + W(4, -1118172841, 1057041023, -1089300195, 1017359341) + + W(5, 1039149197, 1051800560, -1089266110, 1034838445) + W(6, 1025628006, 1051243933, -1098077639, 1033512688) + + W(7, 1023987646, 1054503948, -1098034299, -1099231069); + sum2 = + W(0, -1072120352, 1076686179, -1096491690, -1109988374) + W(1, -1071453180, 1075980741, 1055107632, -1125676035) + + W(2, -1069998225, 1075876198, -1100816518, 1033428305) + W(3, -1071241469, 1076219984, 1048961210, 1018908197) + + W(4, -1073669228, 1072219376, -1123192163, 1040773271) + + W(5, -1079882002, 1071235859, -1097056656, -1129279043) + + W(6, -1086087106, 1056170781, 1049622318, 1030403985) + + W(7, -1096258120, 1057784547, -1098632303, -1116156171); + WS(1014286296, 1057122707); + sum1 = W(0, -1100574608, 1045128364, 1045637171, -1113867461) + + W(1, -1134927261, -1112841149, 1041785732, 1021982785) + + W(2, -1096946922, 1023155519, 1051848326, -1106336253) + + W(3, -1115033128, -1094208427, 1066937726, -1099783438) + + W(4, -1104533485, -1099169249, 1058599142, -1105189673) + + W(5, -1121259095, -1097752701, 1049921902, -1131816685) + + W(6, -1131995140, -1111007544, -1118760834, -1114789302) + + W(7, -1118839498, -1093400894, 1043420320, -1116552190); + sum2 = W(0, 1049653051, -1095117458, 1052542945, 1018695699) + + W(1, -1094509070, 1054995367, 1021265631, -1101605993) + W(2, 1050525055, 1042728281, 1046926465, 1044635344) + + W(3, -1103662151, 1058124872, 1063131010, -1104882803) + W(4, 1043452805, 1049859565, 1029162962, 1042944443) + + W(5, -1102028885, -1097129382, -1116537562, -1110047725) + + W(6, -1109754017, -1098619851, -1092457406, -1107003327) + + W(7, -1111709279, 1051259496, -1078653130, -1114867517); + WS(-1089617919, -1078924764); + sum1 = + W(0, 1038586191, 1054651431, -1087542485, 1032587193) + W(1, -1112517470, 1043170193, -1101086846, -1121720345) + + W(2, 1021690773, 1058605998, -1088163691, 1034793549) + + W(3, -1148410045, 1062049174, -1087004528, -1139319682) + + W(4, -1123773533, 1056236357, -1089020247, 1040971627) + W(5, 1037589846, 1058401044, -1089711896, 1052009144) + + W(6, -1114886949, 1034515388, -1095006441, 1017461287) + + W(7, 1015916580, 1056139353, -1089662071, -1138694970); + sum2 = + W(0, 1041183203, -1104791361, -1113641717, 1040266660) + W(1, -1109901203, -1103309504, 1018299463, -1124518657) + + W(2, 1047303939, -1109225788, 993644855, 1039912380) + W(3, -1146453442, 1050748307, 1050538753, -1107008276) + + W(4, -1103370030, 1032462009, 1024125183, -1094411631) + W(5, 1035308463, 1055570013, 1058013570, -1087158984) + + W(6, -1107592095, -1104507532, 1044744090, -1091454514) + + W(7, -1129723226, 1050955773, -1110543421, -1122733934); + WS(-1102088830, 1068463311); + sum1 = W(0, 1007817678, 1054791531, -1088166471, 1034628887) + + W(1, -1114291787, 1051084317, -1097682087, -1130503387) + + W(2, -1106493040, 1059023407, -1087032011, 1042839161) + + W(3, -1121377148, 1060487316, -1087032009, 1025313797) + + W(4, -1120569345, 1053262386, -1090195409, 1040112167) + + W(5, 1037434082, 1049438849, -1104445288, -1112558866) + + W(6, -1121570543, 1043319351, -1110294871, -1130274577) + + W(7, 1048479966, 1037267389, -1112047510, -1107488086); + sum2 = + W(0, -1092702026, 1046572938, -1113806693, 1023924734) + W(1, -1078842502, -1092761370, 1010298098, -1134107544) + + W(2, -1073165872, 1048469719, -1106037347, -1114438827) + + W(3, -1075365553, 1050413401, 1041503306, 1017902665) + W(4, -1101579557, -1110447061, 1037192623, 1011674154) + + W(5, 1066341075, -1104166524, 1033398310, -1109271682) + W(6, 1071992070, -1123716833, 1031702363, 1028552632) + + W(7, 1076187261, 1056626852, -1110743783, -1123830383); + WS(1050299903, -1120086405); + sum1 = W(0, 1001761330, 1015037916, 1045981578, 1032160884) + W(1, 1051426245, 1042953374, -1094503950, -1131440192) + + W(2, -1097473350, -1103780307, 1055197076, -1100940622) + + W(3, 1050955122, -1082933123, -1099126616, 1056645367) + + W(4, -1098718343, 1055455844, -1118831961, -1095742542) + + W(5, -1119699408, -1145769035, 1049761702, 1031622998) + + W(6, 1038117517, -1132909758, -1105955296, 1041481643) + + W(7, -1107622229, 1039587926, 1047033256, -1103124921); + sum2 = + W(0, 1033493706, -1100025935, -1117747708, -1131691420) + W(1, 1004282338, 1036668146, -1097774825, 1042472719) + + W(2, 1032395114, 1043333590, -1106149887, -1122758767) + + W(3, 1035721710, 1058018229, -1110236537, -1106477628) + + W(4, -1138557465, 1035348312, -1105971349, 1046834331) + + W(5, -1094630455, 1040910383, 1017216296, -1101697584) + W(6, 1050323990, 1034465026, -1110352462, 1040100106) + + W(7, -1102984389, 1044530527, -1108832665, -1099114129); + WS(1059761855, -1093333930); + sum1 = W(0, -1114738580, 1026403632, -1105736123, -1114933837) + + W(1, -1114617627, 1045397583, -1109519752, 1044731740) + + W(2, -1102727321, 1028768699, -1092041414, -1111636685) + + W(3, 1053910378, 1067649611, -1090720496, 1058839312) + + W(4, -1094270689, -1104323849, -1112030179, -1095377736) + + W(5, -1107452471, 1042776267, -1103704317, 1034877772) + + W(6, -1130455238, 1036450873, -1131764742, 1031929286) + + W(7, -1108958070, 1044075076, -1106063752, -1113359528); + sum2 = W(0, 1033753751, -1111931472, 1037689465, 1023732592) + + W(1, -1102724392, 1032416705, -1105246922, -1126463180) + + W(2, -1104466296, 1029992729, 1052475163, -1118149766) + + W(3, -1083668043, 1069568682, -1090236396, -1106129378) + + W(4, 1048180527, -1114422988, -1122305941, 1038071226) + + W(5, -1130490520, -1133345747, -1123788932, -1124715334) + + W(6, -1103926430, 1038116955, -1127253836, -1117123194) + + W(7, 1029490699, -1129834714, -1122171294, 1029091180); + WS(1058247519, 1058950523); + sum1 = W(0, -1149972914, -1088063023, 1055543086, 1037155715) + + W(1, 1038957612, -1093535488, 1052729022, 1026693813) + W(2, 1039970419, -1086741707, 1058924163, 1030719286) + + W(3, 1008158544, -1077128706, 1057693884, 1032127358) + W(4, 1041515382, -1087332234, 1060656868, 1000958261) + + W(5, 1036144305, 1032313207, 1056531259, -1112386573) + + W(6, 1048236362, -1113848378, 1049522521, -1144612480) + + W(7, -1101573740, -1089306475, 1052006205, 1039554949); + sum2 = + W(0, 1037957789, 1050553491, -1089722328, 1050994656) + W(1, -1128637884, 1004874497, 1058234547, -1095571828) + + W(2, -1110859440, -1106433025, -1098594890, 1041665953) + + W(3, 1052981065, 1058989771, 1052545864, -1129708900) + W(4, 1040710261, 1058251934, -1106724054, -1111634443) + + W(5, -1090346288, -1076253449, 1032950959, 1015279680) + + W(6, -1107045102, -1079150504, 1055215751, 1053553553) + + W(7, -1092015484, 1073146781, 993278274, -1088813426); + WS(-1079689312, 1054955487); + sum1 = + W(0, -1112827293, -1094091800, 1053343716, 1046408387) + W(1, 1038847520, -1099397203, 1057879171, -1099233409) + + W(2, -1106748654, -1102151838, 1023820222, -1154890390) + + W(3, 1038138418, -1086663035, 1057249493, 1012875058) + W(4, 1035397268, -1087965823, 1057985827, -1109124523) + + W(5, 1020226162, -1095805620, 1053821069, -1126965269) + W(6, 1030022886, -1098762192, 1051466543, 1036334304) + + W(7, -1108673687, -1096846716, 1049463311, 1027304762); + sum2 = W(0, 1029906557, -1118908362, -1075330978, 1069116571) + + W(1, -1110945783, -1110004947, -1081100797, 1067844910) + + W(2, 1046588193, -1089040350, -1089891752, 1066162938) + + W(3, -1121400966, -1106443118, -1103643831, 1048795077) + + W(4, -1106274145, 1054044230, -1095873523, 1049522444) + + W(5, 1040948990, -1115139995, -1120742988, 1042365723) + + W(6, -1114149785, -1112260837, -1107023588, 1011222152) + + W(7, 1030737726, 1025987216, 1017833328, 1031208089); + WS(1045323518, -1099573370); + sum1 = + W(0, 1043494028, 1054678847, -1087400961, 1041221965) + W(1, -1110296205, 1050638833, -1098183847, 1038272854) + + W(2, -1129034139, 1058657792, -1085969705, 1035507984) + W(3, 1040205415, 1062545342, -1082320511, 1038672050) + + W(4, 1019451328, 1053087270, -1092792902, 1018934299) + W(5, 1037480760, 1054717567, -1090230188, 1028598065) + + W(6, -1144942569, 1044080591, -1094581114, 1032398451) + + W(7, 1019441962, 1056118375, -1090342307, -1135273190); + sum2 = W(0, -1115726367, -1100272494, 1026681555, -1095030133) + + W(1, 1028786141, -1113941052, -1107020345, 1043410282) + + W(2, 1044450180, -1104186275, 1044693748, -1120312046) + + W(3, -1097529180, 1042859033, 1067055887, -1093369648) + + W(4, 1047479398, -1097402721, 1064288021, -1083945294) + + W(5, -1105649332, 1051025911, 1073649944, -1073003592) + + W(6, -1127420023, 1025042835, 1067916626, -1079526678) + + W(7, 1035799966, -1139194229, 1054550763, -1086831079); + WS(-1086660959, -1095040438); + sum1 = W(0, -1137772688, -1101831491, 1047762270, 1026497863) + + W(1, -1103872010, -1108733164, 1048734598, -1112526127) + + W(2, 1033664792, -1099393082, 1053294440, 1036444877) + + W(3, -1114303830, -1091611870, 1032897582, -1105948909) + + W(4, 1043631948, -1111668992, 1054700448, 1045765800) + + W(5, -1110960013, -1092153253, 1051790266, -1102627253) + + W(6, -1112201312, -1104258339, 1038982672, 1030853145) + + W(7, 1004207675, -1111896549, 1042342295, 1024477884); + sum2 = + W(0, 1047134358, -1100773581, 1038575217, -1121016162) + W(1, 1032860761, 1019143260, -1097448906, 1027754828) + + W(2, 1058187056, -1086969962, 1050436365, -1118814167) + + W(3, -1089859690, 1060822499, -1092585260, 1047705700) + W(4, -1073724300, 1074524802, -1097001013, 992280012) + + W(5, -1113017653, -1127402252, 1052022456, -1115523910) + + W(6, -1123513506, 986153015, -1101541136, 1026625966) + W(7, 1005834992, 1026902445, 1040058169, -1115254226); + WS(1065625968, 1033455989); + sum1 = W(0, 1037701789, -1151616802, -1102944307, 1035789757) + + W(1, -1137040283, -1099349487, 1053320242, -1106274637) + + W(2, 1000406064, 1047711372, -1098462560, 1048627484) + + W(3, -1094784938, -1115632781, 1053161728, -1098374228) + + W(4, 1050863995, -1088133648, 1049613697, -1120581030) + + W(5, -1103592251, 1049293870, -1128175786, -1114622845) + + W(6, 1032127959, -1118922740, 1017489163, 1038993832) + + W(7, 1038622703, -1120882929, -1119810116, -1165953346); + sum2 = W(0, 1035866397, -1099238508, 1052038184, -1107491561) + + W(1, -1103116216, 1047962584, -1105248240, 1027069673) + + W(2, 1059558286, -1082734190, 1057669233, -1098068789) + + W(3, 1058384307, -1088122523, -1091086098, 1053762892) + + W(4, -1096953271, 1056069525, -1083280561, 1064349048) + + W(5, 1042132369, -1106560803, 1032403631, -1107462772) + + W(6, -1111426470, 1038442279, -1104452063, 1040922744) + + W(7, -1128202268, 1028886015, -1150402298, 1012204557); + WS(1066439152, -1108830929); + sum1 = W(0, -1102916748, 1055608939, -1103898045, 1013732302) + + W(1, -1108788820, 1051866141, -1097938907, 1035488645) + + W(2, -1097607254, 1058768962, -1093577324, 1043113957) + + W(3, -1099017414, 1030462560, -1125603603, 1027216291) + + W(4, -1168846782, -1113005110, 1040477611, -1143171172) + + W(5, -1109193920, -1109987210, 1050862423, -1118580993) + + W(6, -1128476473, -1109670205, 1039038758, -1107320747) + + W(7, -1106724277, -1105116142, 1053895221, -1107171108); + sum2 = + W(0, 1050905005, 1051409035, -1123874142, -1099079861) + W(1, 1051922636, -1107944278, -1131839644, 1035659117) + + W(2, 1052154527, 1040207956, -1100926997, -1109355656) + W(3, 1005525738, 1060123319, 1046139234, 1029590720) + + W(4, 1024591478, 1032045878, -1113252250, 1032543174) + W(5, -1094205878, -1096175996, 1039675350, 1044310065) + + W(6, -1094330307, -1086096303, -1128729660, -1129395200) + + W(7, -1105421569, -1081193369, 1062516858, 1042520685); + WS(-1094347903, 1040885342); + sum1 = + W(0, 1027015666, -1119901274, -1109404651, -1145327523) + W(1, -1097151811, 1047615033, 1051228067, -1096635113) + + W(2, 1050782150, -1115052947, -1096976391, 1048638245) + + W(3, -1106442815, 1051587896, -1096200649, -1105180361) + + W(4, 1051184308, -1105704339, -1126487153, 1051518582) + + W(5, -1091810963, 1046407197, 1040585575, -1092825760) + W(6, 1034433919, 1009768300, -1132445914, 1038762547) + + W(7, 1042242605, -1122889273, -1108464678, 1040013733); + sum2 = W(0, -1121205117, -1124056141, -1106581817, 1026565438) + + W(1, 1031829824, -1109805410, 1007706034, 1029970286) + W(2, -1105324964, 1045427632, 1046732003, 1047283254) + + W(3, -1090390675, 1059020251, 1057752640, -1089850616) + + W(4, -1110420773, -1107061510, -1101115525, 1031976810) + + W(5, 1018005966, -1118368537, -1103994134, 1036394258) + + W(6, -1113281242, -1115675784, 1036673543, -1112565336) + + W(7, 1032068637, -1113920834, 1042522746, -1145818031); + WS(1066366016, -1121083386); + sum1 = + W(0, -1127500850, 1026624689, 1013565235, -1127181143) + W(1, -1122305754, -1114017662, 1052467062, 1035730049) + + W(2, 1025706181, -1088657475, -1121688536, 1045310349) + + W(3, -1104671484, -1098749979, 1066224034, 1026340635) + + W(4, 1043832110, -1085705014, -1112016562, -1121566277) + + W(5, -1111488580, 1037547214, 1041900405, -1127673329) + W(6, -1123271764, -1112264441, 1043675185, 998683632) + + W(7, 1015742169, -1105147876, 1022047173, -1132045794); + sum2 = W(0, -1102951634, 1043023116, -1104735391, 1035018995) + + W(1, 1044058166, -1093545812, 1058451408, -1112978123) + + W(2, 1037657608, -1093647750, -1104370519, 1043811519) + + W(3, -1091261805, 1070997171, -1105620254, 1052846459) + + W(4, 1057746121, -1082044166, -1091103100, -1097428497) + + W(5, -1106029228, 1051593249, -1096225251, -1127092852) + + W(6, 1006392595, -1100798567, 1052307063, -1107453736) + + W(7, -1119100020, 1013819138, -1121077487, 1041369362); + WS(1059191103, 1030618557); + sum1 = + W(0, 1034200101, 1032351793, -1100440271, -1148363237) + W(1, 1053678608, 1049973094, -1098031908, 1026486548) + + W(2, -1114145283, 1058794603, -1087452589, -1194991971) + + W(3, 1047695489, 1053292689, -1078695803, 1043453347) + W(4, -1114663316, 1055818163, -1125225546, 1033675947) + + W(5, -1137634576, 1053263444, -1094543429, 966472909) + + W(6, -1125278731, 1041016873, -1116533557, -1115520783) + + W(7, -1138534517, 1043320696, -1104858229, -1119664758); + sum2 = + W(0, 1021496216, -1095812325, -1116672596, 1031503244) + W(1, -1072453458, -1094113031, -1112299630, 1023122856) + + W(2, -1079530578, 1068683999, -1135088113, 1036078566) + W(3, 1063841069, 1074699170, -1126165044, 1036242384) + + W(4, -1095958945, 1043477830, -1107446259, -1100441243) + + W(5, 1042172731, 1031880682, -1119142347, 1009915385) + W(6, 1015153576, -1121439437, 1037216194, -1114450875) + + W(7, -1132334880, -1115200049, 1034903618, 1017712520); + WS(-1096433855, 1052342409); + sum1 = W(0, -1117693364, 1042163431, 1006023611, -1113444755) + + W(1, 1041070378, -1095385709, 1034697390, 1049542464) + + W(2, -1105417036, 1060080198, -1109633387, -1112382959) + + W(3, 1052133240, -1090036408, -1085473397, 1048891757) + + W(4, 1042648272, -1090327769, 1057448056, -1111238376) + + W(5, -1123398616, 1043184694, -1105658040, -1106505885) + + W(6, 1044512510, -1111854479, -1104977148, 1049508979) + + W(7, -1105041790, 1043408999, 1041051171, -1110665802); + sum2 = + W(0, 1039259027, 1043188759, -1165551167, -1113326246) + W(1, -1119373866, -1082984200, -1105050294, 1045229872) + + W(2, -1086821333, -1077733706, -1103802686, -1109909290) + + W(3, 1052826002, 1067327309, 1068967257, 1052700624) + W(4, -1117342490, -1149070344, 1054626023, -1098764713) + + W(5, 1036052293, 1052358305, -1101813629, -1099183932) + + W(6, 1037381955, -1102382047, -1103461210, 1052205497) + + W(7, -1101694007, 1050777563, -1106555317, -1096821402); + WS(1046655614, 1069864308); + sum1 = W(0, 1035633391, -1106200785, -1105260712, 1050507575) + W(1, 1040943483, 1031319761, 1026979270, 1034433460) + + W(2, 1045417382, -1120751363, -1106053451, 1045765948) + + W(3, 1043913370, -1093886310, -1121044950, 1041581532) + + W(4, 1050212129, -1098821847, 1042106970, 1029812249) + W(5, 1047844019, -1088130094, 1049054225, 1017929306) + + W(6, 1039058852, -1092291401, 1041620790, 1028938706) + + W(7, 1043891960, -1082722808, 1042598038, 1034869942); + sum2 = W(0, -1098805029, -1082465618, 1017798412, 1045866690) + + W(1, -1101136548, -1084472150, -1108050411, 1039888035) + + W(2, -1094351375, -1085764460, 1031330790, 1027046574) + + W(3, -1097728468, -1140347496, 1053843229, 1038111290) + + W(4, 1040878916, -1100091144, 1043199898, -1100094208) + W(5, 1049713965, 1049328541, 986797508, -1104239104) + + W(6, 1037060075, 1062808960, -1119994130, -1098800085) + + W(7, 1058810464, 1071144827, -1097822096, 1017716576); + WS(-1077527440, 1065234224); + sum1 = + W(0, 1031059492, -1088676934, 1055802445, -1159469258) + W(1, 1014606833, -1098001853, 1051162632, 1001612013) + + W(2, 1041495444, -1087241405, 1059501583, -1109463457) + + W(3, 1031584061, -1083911392, 1061276187, -1105280809) + + W(4, -1143158030, -1095088526, 1050088278, 1038556792) + W(5, -1140389945, -1096536807, 1049527800, 986827883) + + W(6, 1035424519, -1104484775, 1042937212, 1030875577) + W(7, 1013235228, -1100223239, 1037087943, 1047418837); + sum2 = + W(0, 1026928347, 1019217071, 1027288437, -1112677997) + W(1, 1006719462, -1098369589, -1099640354, -1146387796) + + W(2, -1103317527, 1041304779, 1050941648, -1072403340) + + W(3, 1043604137, -1134457784, -1112266437, -1071428003) + + W(4, -1106627965, 1048134757, 1027462477, -1082446250) + W(5, 1034526167, -1118427047, 1040843010, 1059493547) + + W(6, -1117999031, 1029994729, -1104465031, 1072461191) + + W(7, -1134258967, -1113504087, 1054764710, 1077848621); + WS(1034219259, -1130863201); + sum1 = W(0, -1122470601, 1036468120, 1033355302, -1104067775) + + W(1, -1125729883, 1031973022, -1125640547, -1112351746) + + W(2, -1119868741, 1045421587, -1122038588, -1106594245) + + W(3, -1092963050, 1062931954, 1044707408, -1094830635) + + W(4, -1102984950, 1062738826, -1104269382, -1127079049) + + W(5, 1017182198, 1050208654, -1106320445, -1109997276) + + W(6, -1107264969, 990945063, -1110744610, -1112571199) + + W(7, -1116589116, 1023027040, -1098846428, -1117279521); + sum2 = W(0, -1120041672, 1041156572, -1103868400, 1036471018) + W(1, 999703935, 1029144962, 1036670980, -1107170022) + + W(2, -1109032994, 1037796455, 1043292537, -1115113192) + W(3, 1041627711, 1046556501, 1059414852, 1029249656) + + W(4, -1111815622, 1060385029, 1048639871, -1126242312) + + W(5, 1029813110, 1040466231, -1105513272, 1043143286) + + W(6, -1110751572, -1103822492, -1100107078, -1101226736) + + W(7, -1114401610, -1076222058, 1043280503, 1034327293); + WS(-1097041087, -1081891922); + sum1 = W(0, 1045201037, -1097075376, -1126257330, -1115394372) + + W(1, 1042240134, -1091271089, 1049467348, -1097795722) + + W(2, 1049780286, -1094847921, 1057610047, -1097045891) + + W(3, 1039927583, 1059654550, -1141428591, -1103383438) + + W(4, -1122695635, 1056430510, -1089703504, 1036098616) + + W(5, -1110484942, 1057233913, -1087958744, 1033721138) + + W(6, -1117417409, 1041827328, -1096746586, 1035539581) + + W(7, 1039840796, 1050554535, -1096159486, -1131932502); + sum2 = + W(0, 1012982255, 1052214657, -1136022111, 1032353073) + W(1, -1101224821, 1042508745, -1093748656, 1020863779) + + W(2, -1109376974, 1042044290, 1045672838, -1113516472) + W(3, -1116588919, 1071547407, 1065241977, 1040242686) + + W(4, -1096183361, -1089469015, 1049249478, -1120964187) + + W(5, -1092858264, -1090264503, 1047260540, -1103746594) + + W(6, -1090462581, 1039700797, 1046964814, -1100885683) + + W(7, -1119652925, -1083767147, -1107087862, 1028764718); + WS(-1088621983, 1079497913); + sum1 = W(0, 1027161409, 1052712773, -1102058289, -1100368317) + + W(1, -1102075462, 1051824794, -1098602113, 1021667349) + + W(2, -1120075900, 1057942154, -1096292664, -1106147487) + + W(3, -1109063205, 1060662493, -1082645434, 1039175801) + + W(4, -1104005172, 1062931830, -1090788424, -1129475640) + + W(5, -1136555883, 1057800198, -1090185155, 1036809656) + + W(6, -1112015962, 1047971474, -1098101583, 1009161622) + + W(7, 1033292370, 1059753504, -1088742454, -1143403778); + sum2 = W(0, -1150684740, -1095235693, 1044985054, 1035589955) + + W(1, -1114056841, -1115238312, -1127339724, -1108218072) + + W(2, -1164208415, -1080604054, -1106549807, 1022130402) + + W(3, 1034698244, -1071093346, -1080554397, -1106288272) + + W(4, -1134574697, -1083926997, -1104923511, 1024268734) + + W(5, 1043895716, 1068501149, 1052487431, 1036117000) + W(6, -1101980686, 1079699126, 1054997905, -1130803558) + + W(7, 1050191679, 1056576712, 1029700329, 1031345667); + WS(-1087955103, 1023517655); + sum1 = + W(0, -1106663590, -1090071677, 1062902614, 1013889298) + W(1, 1037773274, -1103425461, 1055773525, -1100022495) + + W(2, -1116651838, -1089596734, 1059014377, -1101161913) + + W(3, 1022742037, -1082614473, 1060267482, 1030094516) + W(4, 1040438284, -1088542372, 1057943128, -1120043085) + + W(5, -1117813952, -1092404165, 1054561254, -1116951793) + + W(6, 1032561623, -1100716355, 1051603940, 1035114019) + + W(7, -1102318801, -1098396937, 1049819671, 1026546470); + sum2 = W(0, -1107653444, -1094858135, 1084595456, -1065438414) + + W(1, 1032757863, 1061839668, 1074196920, -1069856939) + + W(2, -1150202006, 1049735190, 1067688119, -1073375528) + + W(3, 1037010009, -1123088190, 1070729644, -1082206819) + + W(4, 1026258576, -1089824138, 1050587980, -1086758222) + + W(5, 1041748319, -1098358767, 1057889952, -1097734258) + + W(6, -1131622502, 1049699018, -1127981435, -1106404220) + + W(7, -1112646994, -1103776938, 1048602984, -1098587943); + WS(-1089607615, 1063931357); + sum1 = W(0, -1156148665, -1089422721, 1059281720, 1041177357) + + W(1, 1033042784, -1099513696, 1053472432, -1107985659) + + W(2, 1027235975, -1086976804, 1060428066, -1122980350) + + W(3, -1117005684, -1083936660, 1061258678, -1103260375) + + W(4, 1045226606, -1089259880, 1055780369, -1111710595) + + W(5, -1112863441, -1092850238, 1057981025, -1109580750) + + W(6, 1040283212, -1096473171, 1051704489, -1125267169) + + W(7, -1102751384, -1096124078, 1054893029, 1035448166); + sum2 = W(0, 1024298597, 1074606150, 1080820206, 1030125639) + W(1, 1037699935, 1048614297, 1047271097, -1121834510) + + W(2, 1030404477, -1085515118, -1079656120, -1166463196) + + W(3, -1094400051, -1071672142, -1066721483, -1101580999) + + W(4, 1052543759, -1091215560, -1078287609, 1028051862) + + W(5, 1024136176, -1095087497, -1096732136, 1009399200) + + W(6, -1159281410, 1050441058, 1057126689, -1117118368) + + W(7, -1102232478, 1071366890, 1074685383, -1113696211); + WS(-1083901183, 1060981851); + sum1 = + W(0, -1106299749, 1048978486, 1016862419, -1121286832) + W(1, 1039492049, -1107896957, -1115539879, 1049662006) + + W(2, -1113140273, -1119192025, -1098481927, -1106196840) + + W(3, 1055856482, -1090009641, 1058119768, -1149152444) + + W(4, -1103186821, -1088174932, 1052019064, -1101797848) + + W(5, -1108369378, 1034759564, 1048477348, -1146708651) + W(6, -1115937041, 1008970428, 1034559233, 1024756171) + + W(7, -1127954738, 1027686380, 1044214632, -1111878699); + sum2 = W(0, 1030335348, -1130369060, -1106797797, 1006653296) + + W(1, -1110488253, 1056034410, 1040331307, -1094310491) + + W(2, -1096373435, -1097486091, 1063611375, -1113782011) + + W(3, 1042224202, -1094958491, -1106971469, 1042512890) + + W(4, 1038378538, 1057631708, -1093142933, -1140559356) + + W(5, -1117770266, -1114209587, 1037075531, -1114686161) + + W(6, 1036930446, -1105273765, -1115233817, -1115373149) + + W(7, -1168276161, -1115537765, 1025218793, 1026640233); + WS(1063762143, -1098158381); + sum1 = W(0, 1027555010, -1106988831, 1031921883, 1033567284) + + W(1, -1113176415, 1049655577, 1032851437, -1099137927) + + W(2, 1044835884, -1089572014, -1106152127, 1052671923) + + W(3, -1094480963, 1041189880, 1057311541, -1101762329) + + W(4, 1042205032, 1035602487, -1100163979, -1106014811) + + W(5, 1038186408, -1095655321, 1046700975, 1044902280) + W(6, -1112247611, 995617211, 1050763922, -1094051821) + + W(7, 1041241393, -1102946366, -1119959180, 1044480349); + sum2 = + W(0, 1010916279, 1040615985, -1103581164, -1126424725) + W(1, -1108274646, 1037755544, 1053142923, -1119616718) + + W(2, -1108043460, -1107213139, -1091384808, 1062997316) + + W(3, 1049469526, -1085933104, -1093682556, 1050086980) + + W(4, 1061284555, -1098201753, -1095835641, 1044548392) + + W(5, -1097521196, 1027381238, 1044225612, -1099920539) + W(6, 1047936551, 1007266289, -1101597200, 1043928239) + + W(7, -1106103943, 1039340208, 1011948943, -1120667237); + WS(1060336095, -1119657045); + sum1 = + W(0, 1023788715, 1048279897, -1106238784, -1110161279) + W(1, -1117126579, 1044311660, -1096869700, -1136931731) + + W(2, -1108875843, 1062204714, 1019770348, -1115905233) + W(3, 1022815367, 1060724749, -1081389759, 1034904806) + + W(4, -1100562722, 1063043033, -1084472996, -1124661292) + + W(5, 1043213137, 1050929706, -1097593661, 1017832853) + + W(6, -1111482971, 1037241746, -1106654286, -1109716592) + + W(7, -1142747249, 1051192212, -1102133781, -1109353889); + sum2 = + W(0, 1036664563, 1009247708, 1013790140, 1035577258) + W(1, -1103288529, -1126560341, -1102369678, 1008412166) + + W(2, -1102134383, -1067246446, 1047852878, 1016094574) + W(3, 1057556566, 1067728497, -1093152080, 1045655865) + + W(4, -1099512639, 1078180911, -1110504691, -1123477495) + + W(5, 1031668335, -1085231458, 1042704555, 1023608957) + + W(6, -1103860103, 1047956293, -1132621098, -1112760821) + + W(7, 1028018661, -1114058193, 1030531898, -1120624893); + WS(1035518203, 1045613832); + sum1 = + W(0, 1044215468, 1057279232, -1097478568, 1042423606) + W(1, -1096085823, 1043513429, -1096451901, -1098498663) + + W(2, -1102751483, 1057361220, -1091716958, 1012832112) + W(3, 1007706274, 1061539183, -1085528932, 1054368634) + + W(4, -1098118842, 1057962612, -1093017477, -1103819295) + + W(5, 1051305356, 1058710773, -1091718961, 1057808613) + + W(6, -1096250919, 1037420261, -1100741095, -1100568821) + + W(7, -1106455273, 1053125757, -1097230063, -1111733504); + sum2 = W(0, -1105709018, 1058997495, -1086433444, 1022365788) + + W(1, 1050542737, -1084246791, 1065459234, -1101303092) + + W(2, -1106108137, -1103685622, 1055198365, 1040995532) + + W(3, 1027983028, -1106510960, -1102412567, 1044759128) + + W(4, 1053295819, -1089515541, 1057925132, -1104466949) + + W(5, -1091042532, 1066680974, -1080963495, 1043286350) + + W(6, 1049054259, -1088412186, 1056230430, -1096360229) + + W(7, -1108416827, 1037143386, 1049505110, -1106131860); + WS(-1103921662, 1072713673); + sum1 = W(0, 1042712209, -1111681022, 1029885560, -1123292759) + + W(1, -1130675027, -1104528338, 1032835743, -1124533373) + + W(2, 1041149044, -1103688784, 1053127408, -1101763282) + + W(3, -1108819823, 1055222237, -1089836355, -1143773237) + + W(4, -1099465033, 1063848575, -1089832742, 1044926036) + + W(5, -1102885798, 1053207587, -1090841456, 1032528402) + + W(6, -1108891552, 1051374172, -1098121506, 1040294582) + + W(7, -1122152216, 1044600823, -1101098252, 1018003689); + sum2 = W(0, -1116466906, 1017580326, -1100144980, 1018640494) + W(1, 1032691193, 1031996320, 1045143645, 1067424527) + + W(2, -1110682367, 1040673767, 1055366708, 1071822180) + + W(3, -1134651946, -1121084452, -1112456349, 1057195246) + + W(4, 1019799157, 1012141662, 1037079065, -1078565795) + + W(5, 1020309206, -1123645954, 1036705771, -1073530916) + + W(6, 1028255175, -1125118807, -1112096331, -1087156462) + + W(7, -1118897648, 1005021204, 1021253254, 1033125682); + WS(1054959295, 1011151216); + sum1 = W(0, -1124554365, 1043778462, -1140499785, -1103855992) + + W(1, 1028540695, -1104732576, -1111020475, -1113072532) + + W(2, -1107828893, 1063706911, -1098481604, -1121738665) + + W(3, -1135601758, 1052343180, -1081762405, 1048654720) + + W(4, -1135515507, 1050410381, 1053053447, -1096321673) + + W(5, 1032466990, -1128754020, -1112972157, 1012954617) + + W(6, -1110097877, 1034222620, 1023071124, -1110289546) + + W(7, 950109203, 1043960229, -1120112616, -1114439871); + sum2 = W(0, -1104841432, 1047456971, 1024424907, 991739097) + W(1, 1047690020, -1094867354, 1033457856, -1129013032) + + W(2, -1084375561, 1068880529, 1046341732, -1103560341) + + W(3, -1086552004, 1065412328, -1087761187, 1059009805) + + W(4, 1046416693, -1080289298, 1062384539, -1098849357) + + W(5, 1025710892, -1110380578, -1103331799, 1045332030) + + W(6, -1130856953, -1105039836, 1024509174, -1104241974) + + W(7, -1113936449, 1016290713, -1126452938, 1019994493); + WS(1061669311, 1066543312); + sum1 = + W(0, -1120030840, -1097490380, 1038501126, 1026361650) + W(1, -1111872182, 1051889621, -1110528784, -1112085217) + + W(2, 1046388965, -1085299564, 1050043436, 1019064063) + W(3, -1109640224, 1043197314, 1054292822, -1116217609) + + W(4, 1051640445, -1099578605, -1095700775, 1045441021) + + W(5, -1104742312, -1114905437, 1056051928, -1097066005) + + W(6, 1040612129, 1033952272, -1108619674, -1146667493) + + W(7, 1018742870, -1095793020, 1044337364, 1039394788); + sum2 = + W(0, 1041249103, -1098300344, 1041141085, -1123648820) + W(1, 1040922446, -1147221163, 1014590689, -1115292810) + + W(2, 1047169006, -1097103704, -1094689158, 1021735499) + W(3, -1133026152, 1055827658, 1056443342, 1023898168) + + W(4, 1045305983, -1082349433, 1051958562, -1153021086) + + W(5, -1121038685, -1105225178, 1035590360, 1038130213) + W(6, 1032067159, 1036618956, -1098250629, 1035045284) + + W(7, 986169209, -1102095468, -1145857885, 1030074795); + WS(1066007616, 1040865170); + sum1 = W(0, 1016703369, -1154003525, -1104662792, -1111826720) + + W(1, -1106398093, 1038441464, 1031083397, -1146451379) + + W(2, -1114560988, -1112021256, 1052887594, -1102003526) + + W(3, -1096325697, 1050813825, 1061249791, -1102172436) + + W(4, -1094335779, 1059033474, -1126656183, -1104413998) + + W(5, 1023023221, -1108543232, -1106571274, -1109007926) + + W(6, -1113231876, 1040892233, -1121820472, -1112600993) + + W(7, 1022983872, 1034570898, -1115038347, -1123919488); + sum2 = W(0, -1117895883, -1109314178, 1043196819, 1029963629) + + W(1, 1036640719, -1103775527, 1047073701, -1117061975) + + W(2, -1092695525, -1079308608, 1032498235, 1053147047) + + W(3, -1109277526, -1088245301, 1071134194, -1113344034) + + W(4, 1054484712, 1032194306, -1098274857, 1027577620) + + W(5, -1102073467, 1058556412, -1102222667, -1104158962) + + W(6, 1047716642, -1097777200, 1028797614, 1019489703) + + W(7, -1115714917, 1049638324, -1109885254, -1106961770); + WS(-1112959995, -1090797387); + sum1 = + W(0, 998546749, -1107113888, 1042251615, 1034524319) + W(1, -1102515009, -1157171375, 1043372984, -1109045169) + + W(2, 1018649191, -1095395659, 1057847906, 1025715818) + W(3, 1024148768, -1088418302, 1049085946, -1107024218) + + W(4, 1036601843, -1108499994, 1054314562, 1036766314) + W(5, 991750171, -1092700079, 1052242560, -1102346050) + + W(6, -1134314668, -1100812608, 1010001228, 1041369791) + + W(7, 1024106779, -1106951576, 1043704436, -1136260253); + sum2 = W(0, -1097076796, 1045091130, 1028367411, 1016501386) + W(1, 1000463738, 1024736081, 1040206702, -1122385083) + + W(2, -1083533587, 1064625577, -1112850496, -1104146558) + + W(3, 1064100942, -1096201033, -1086258418, 1050125885) + + W(4, 1074997490, -1071550159, 1052069491, -1105686824) + + W(5, 1043707697, -1106033160, -1098690685, 1041978517) + + W(6, 1028507309, -1118548401, 1050202273, -1109567340) + + W(7, -1152835380, -1111712908, -1113053149, 1032203802); + WS(1065286463, -1155116140); + sum1 = W(0, -1127743664, -1099417962, 1047837241, 1035108393) + + W(1, 1036265535, -1091060822, 1038987540, -1121911642) + + W(2, -1118137852, -1088882712, 1061626690, -1119901843) + + W(3, -1121018025, -1089265061, 1069311516, -1100290432) + + W(4, 1024160014, -1088513194, 1053957977, -1101311755) + W(5, 1028265374, -1090887512, 1051214117, 980641778) + + W(6, 1031461691, -1097685517, 1050330231, 1030945477) + + W(7, -1116217572, -1096201501, 1045642342, 1036102670); + sum2 = W(0, 1023964675, -1104287950, -1095527688, -1107378538) + + W(1, 1054178647, -1098771138, -1106164282, -1107123343) + + W(2, -1104607531, 1030951671, 1049293814, -1102317974) + + W(3, -1088748842, 1062304002, 1069791349, -1093097006) + + W(4, 1034720649, 1056993385, -1106129898, -1107155572) + + W(5, 1027793575, -1095484784, -1093744890, -1104614583) + + W(6, 1026748348, -1103591056, 1040804508, -1111048704) + + W(7, 1048440611, -1115722179, -1102843948, 1036145149); + WS(-1107864827, -1106183398); + sum1 = W(0, -1106667222, 1028246417, 1062610107, -1094330385) + + W(1, 1032383543, -1105288567, 1048732230, -1113355593) + + W(2, -1104095901, 1024277645, 1033194034, -1100412503) + + W(3, -1105126732, 1031807228, -1097352540, -1110531197) + + W(4, -1119082647, 1024663749, 1042072353, -1106817153) + + W(5, -1099092218, 1059042594, -1097841594, -1119219065) + + W(6, -1106477481, 1038514313, -1132497297, -1116226478) + + W(7, -1100466619, 1061247795, -1116357250, -1112377140); + sum2 = W(0, -1124057659, 1049202878, 1055877653, 1043135164) + + W(1, -1107748661, 1029365940, 1040631102, -1120955446) + + W(2, -1106641450, -1100669682, -1121942624, 1048773070) + + W(3, -1106278570, -1090514146, -1097531540, -1096084011) + + W(4, -1115427744, 1050790854, -1095195500, 1040842880) + + W(5, 1045306633, -1101749265, 1044511371, -1101432694) + + W(6, -1107251222, 1044664667, -1123742683, -1108344435) + + W(7, 1044220643, 1051259000, 1035140356, -1156279482); + WS(-1107710971, -1103335008); + sum1 = W(0, 1020774038, 1057965326, -1096736580, -1108312647) + + W(1, -1097452822, 1052789750, -1097416740, 1007270548) + + W(2, -1103681302, 1061528673, -1090723228, 1008435167) + + W(3, -1142400543, 1059882105, -1082070814, 1032878150) + + W(4, -1130541650, 1058381533, -1096313647, 1024150455) + + W(5, 1035627390, 1052101646, -1092903493, 1029066731) + W(6, 1026485526, 1047827121, -1095953623, 1024752368) + + W(7, 1026933710, 1048909172, -1094072619, -1129872006); + sum2 = W(0, -1091198687, 1051358993, 1026242284, 1036983987) + + W(1, -1096592719, 1056674994, -1102658445, -1112372364) + + W(2, -1088722291, 1050253089, 1039492851, -1109827680) + W(3, 1017819408, 1057806550, 1048044980, 1033031265) + + W(4, -1104841225, -1098514434, 1047848116, -1106004699) + + W(5, 1047280108, -1095745001, -1114927114, -1128936304) + + W(6, -1133964792, -1121773836, 1009730080, 1044703642) + + W(7, 1046210234, -1101840089, -1115459009, -1121859563); + WS(1046617982, -1079283690); + sum1 = W(0, -1112235521, -1103103206, 1050398983, 1031782004) + + W(1, -1112371935, 1005568807, 1053710959, -1112406582) + + W(2, 1046025067, -1082068590, 1059470764, -1109731202) + + W(3, -1114138877, 1053438832, 1056782757, -1120370051) + + W(4, -1100106092, 1050481934, -1084354719, 1047048563) + + W(5, -1106636112, -1113851306, 1044662919, -1114617505) + + W(6, 1006684852, -1101804759, 1028720557, -1122334215) + + W(7, -1134743124, -1101795702, 1040488963, 1035089325); + sum2 = + W(0, -1123583696, -1114190125, -1123424510, 1035265901) + W(1, 1041752924, -1107057915, -1108427412, 1011193218) + + W(2, -1096033091, 1054169171, -1101097272, -1097576107) + W(3, 1045050816, 1066165326, 1060681517, 1037309084) + + W(4, -1111810372, -1090934807, -1093738003, -1094306097) + + W(5, 1044170848, -1094482563, -1094742214, 1047478278) + W(6, 1035342189, 1030376713, -1122528198, 999245333) + + W(7, -1107148363, -1140242036, 1046835784, -1118953940); + WS(1057107647, -1115492411); + sum1 = + W(0, 1043432615, 1037909322, -1092726398, 1042270260) + W(1, 1017716083, 1044219192, -1094557923, 1036944691) + + W(2, -1115224236, 1059480955, -1089724826, 1049175094) + W(3, 1034158091, 1055275264, -1079486955, 1036017407) + + W(4, 1031606075, 1062186253, -1094016652, -1112299996) + W(5, 1040917102, 1051479740, -1090199321, 1012181234) + + W(6, -1119339928, 1036604907, -1111430132, 1026270626) + + W(7, 1006053250, 1049031914, -1124163213, -1106538704); + sum2 = W(0, 1018646782, 1037675363, 1056993548, -1095820604) + + W(1, -1107779390, 1041358579, -1114299594, -1106961783) + + W(2, 1048577488, -1103110037, -1108103869, -1113810892) + + W(3, -1094766117, 1063077105, 1069120744, -1094104293) + + W(4, 1029078775, -1094239344, 1019393926, -1100654825) + + W(5, -1115207772, -1097294293, -1090842684, 1030620215) + + W(6, 1041354677, -1106609062, -1103795001, 1015746998) + + W(7, -1134027235, 1005749079, -1111892981, 1031888221); + WS(1038408187, -1104646224); + sum1 = + W(0, -1100666444, 1031841147, 1045835257, -1121385297) + W(1, 1032659338, -1095811512, 1046356758, -1115316924) + + W(2, -1096791479, 1046629869, 1055310447, -1109718991) + W(3, 1050254507, -1086582314, 1049546009, 1043876936) + + W(4, -1125163769, -1092033141, 1059064223, -1115882186) + + W(5, 1034716030, -1095590162, 1032941357, 1051195252) + W(6, -1104041563, 1012740704, 1016606100, -1110386378) + + W(7, 1024265746, -1097384267, 1043234370, -1121465454); + sum2 = + W(0, 1033146053, 1033178697, -1110558215, -1107600367) + W(1, 1034495435, 1013274853, -1103797816, 1046600596) + + W(2, 1033891153, 1044565157, -1074394842, -1096372667) + + W(3, 1015618236, -1083473003, -1075035519, 1071496075) + W(4, -1102272365, 1047899954, 1070896015, 1070598351) + + W(5, 1026402836, 1033829854, -1107786181, -1103057086) + + W(6, -1126192412, 1026659107, 1039466503, -1099451771) + + W(7, -1130670616, -1129244632, 1033633210, -1106841766); + WS(1060540543, -1145107984); + sum1 = W(0, 1016949312, -1111708420, 999025948, -1110878953) + W(1, 1033700674, -1115158282, 1037057540, 1034636061) + + W(2, 1008485935, -1112773425, -1111113150, 1006219749) + + W(3, 1050394829, -1105627788, -1105528438, 1047777444) + + W(4, 1025975118, -1166436080, -1092533512, 1034379342) + + W(5, 1027755062, 1049090616, -1097657169, 1023310559) + + W(6, -1166944971, -1131929874, -1125616567, 1042471825) + + W(7, 1036625882, 1027903943, -1104970374, 1029991232); + sum2 = W(0, -1112727972, 1028528033, 1050127712, 1039139414) + + W(1, 1041061913, 1047913039, -1120606988, -1090975722) + + W(2, 1030171918, 1058299937, -1075312291, -1096898908) + + W(3, 1049192765, -1088725965, 1051042420, 1056682084) + W(4, -1097932217, 1006741474, 1061621025, 1043329296) + + W(5, -1108991614, 1028842331, -1120436768, -1136718330) + + W(6, -1128255593, -1119404040, 1041035795, 1019658885) + + W(7, -1128975721, 1019613109, 1038145345, 1017746289); + WS(1058512095, 1047466767); + sum1 = W(0, 1025672397, -1102753041, 1037445664, 1037433000) + W(1, 1032743763, 1015664161, 1032570339, 1033220516) + + W(2, 1046625694, -1102686879, -1091026739, 1035056566) + + W(3, 1040236986, -1099087483, -1089271035, 1024398415) + + W(4, 1041791363, -1097904327, -1100626131, 1043847942) + + W(5, 1042422310, -1097334084, 1051389809, 1042353123) + W(6, 1024317081, -1123206279, 1041773046, 1037697617) + + W(7, 1034505416, -1096407969, 1050962859, 1047698739); + sum2 = W(0, -1111694157, -1097429792, 1052756319, -1115035673) + + W(1, -1113457231, 1040318944, -1131566802, -1108486657) + + W(2, 1007020677, -1109123041, 1066240251, 1057627634) + + W(3, -1110494513, -1087577139, 1071158756, 1052796029) + + W(4, 1036239980, -1115766281, 1055974927, 1037312144) + W(5, 1042151096, 1033854974, -1085216854, 1031946717) + + W(6, 1014804229, 1056323633, -1076147337, -1107413695) + + W(7, 1038268008, 1058473731, -1078122726, -1088208012); + WS(-1087119871, 1051442968); + sum1 = + W(0, -1106951233, -1101188351, 1055191809, -1118371512) + W(1, 1026199466, -1102133666, 1046522759, 1024298399) + + W(2, -1111827529, -1096477343, 1061746551, -1102462991) + + W(3, 1034911407, -1081083296, 1062137809, -1118895495) + + W(4, -1110066258, -1093686286, 1056808794, -1105243164) + + W(5, 1036906330, -1089794286, 1061657374, 1028468933) + W(6, -1121489041, -1102503648, 1025414769, 1001909715) + + W(7, -1123695161, -1096524016, 1043754020, 1039027467); + sum2 = W(0, 1036012528, -1111568121, -1125130883, 1019317279) + + W(1, -1136414534, 1023613585, 1037328619, -1141870971) + + W(2, 1028357901, 1046290638, -1077265349, -1105362146) + + W(3, 1018170307, -1086518431, -1068062671, 1041918725) + W(4, 996800246, 1032866656, 1083861052, 1040576139) + + W(5, -1115554829, 1040198779, 1057186482, -1110577355) + + W(6, 1018408279, -1115393969, -1101393956, 1032099345) + + W(7, -1128152611, 1031067220, 1024816461, -1109411807); + WS(1041081598, -1101063046); + sum1 = W(0, 1038662072, -1123374599, 1035193857, -1104056554) + + W(1, -1105628103, 1048894326, -1098151405, 1009505700) + + W(2, 1046838359, 1044003395, -1109376817, -1107771451) + + W(3, -1112508084, 1062900743, -1082115704, 1039692648) + + W(4, -1112561351, 1058339600, -1087104856, 1049374543) + + W(5, 1047812813, 1041428913, -1097118497, -1126547869) + + W(6, -1106996345, 1044355834, -1098603955, 1037690530) + + W(7, 1045311157, 1013224727, -1110120844, -1121969199); + sum2 = W(0, 1034938637, -1102665080, -1083931487, -1096043986) + + W(1, -1110454828, 1066739686, 1057500561, 1050111041) + W(2, 1044300205, 1063593500, 1069787057, 1057117236) + + W(3, -1094841314, -1072571644, -1073076170, -1094917255) + + W(4, 1049263704, 1050585763, 1057940110, 992791419) + W(5, -1123904781, 1033188794, 1049962317, -1119131193) + + W(6, 1032882093, 1040935597, -1103057884, -1129197337) + + W(7, 1018550156, 992411043, 1032437745, -1139242755); + WS(1047493374, 1019974383); + sum1 = W(0, 1039818779, 1024992878, -1099980259, -1119405261) + + W(1, 1022499782, 1056719767, -1093967742, 1017537921) + + W(2, -1111466513, 1056992349, -1089692488, -1134657044) + + W(3, -1128872350, 1066523241, -1081677329, 1032226588) + + W(4, -1102282821, 1057279594, -1104336096, -1110606353) + + W(5, 1027318580, 1050310409, -1095763174, 1029746358) + + W(6, -1112367361, 1043633508, -1147598863, -1105211995) + + W(7, -1121442618, 1050332018, -1103201160, -1109613299); + sum2 = W(0, -1109381660, -1099927212, 1032613200, 1013674604) + + W(1, 1024006001, 1048105027, 1031703418, -1113331152) + W(2, 1048332575, 1083214625, 1051352300, 1010546556) + + W(3, 1030946168, -1068785948, -1082836395, -1137462284) + + W(4, -1111460550, -1080184440, 1047472657, 1033485356) + + W(5, -1115660792, -1125303858, 1027323348, 1034637753) + + W(6, 1027780517, -1129923962, 1006215943, -1112671380) + + W(7, -1125113546, 972536438, -1123338357, 1033990282); + WS(1049191295, 1026054180); + sum1 = + W(0, 1015431080, -1104530451, -1120791464, 1041795830) + W(1, -1114491642, 1045418990, -1105318659, -1107859847) + + W(2, -1106844240, -1091806904, 1059085476, 1035107546) + + W(3, 1052544606, -1092275830, -1096734436, 1050727987) + + W(4, -1101337172, 1032037152, 1055073816, -1098252244) + W(5, 1006821496, -1091613549, 1054997266, 1024892180) + + W(6, 1048579163, -1136631349, -1117752159, -1114835508) + + W(7, -1107367092, -1104046587, 1054027444, -1107321874); + sum2 = W(0, 1026733028, 1045033945, 1006278578, 1045459634) + W(1, -1099170713, 1052123052, -1100795787, 1045732660) + + W(2, -1116840904, 1011374557, -1137517037, 1036547859) + + W(3, -1119731112, 1034116255, -1093051584, 1049735621) + + W(4, -1105853851, 1042679995, 1032967726, -1115758581) + + W(5, 1023766170, -1103542762, 1030006514, 1012804929) + + W(6, -1109160117, 1002727514, 1010971477, -1107202197) + + W(7, -1110446049, -1116987471, 1032206215, -1108882618); + WS(1061349183, 1052960956); + sum1 = W(0, -1129777715, -1091852750, 1051531432, 1028688348) + + W(1, -1138324169, -1098630008, 1050117038, 1001458973) + + W(2, 1040354025, -1086948121, 1058780391, 1026112190) + + W(3, -1113069161, -1087783598, 1063142264, -1101543047) + + W(4, 1026875928, -1090578505, 1054898923, 1001807913) + + W(5, -1148679486, -1098392878, 1055753851, -1107707133) + + W(6, 1026350741, -1105317245, 1035239971, 1009551482) + + W(7, -1099366619, -1113156712, 1049214940, 1035358529); + sum2 = W(0, 1030464194, 1016786912, -1124271380, -1112870762) + + W(1, -1114101658, -1111442214, 1036708968, 1035127660) + + W(2, 1031167290, 1040962599, -1145350210, -1119263136) + + W(3, 1076423743, 1052649879, -1106763968, 1030450749) + W(4, 1075592137, 1059016603, 1036666460, -1114823676) + + W(5, -1122765276, -1109148248, -1102467968, 1030453841) + + W(6, -1073082101, 1031660172, 1040647493, -1120712732) + + W(7, -1067763317, -1093716078, -1123536642, 1004437586); + WS(1049240575, 1032641532); + sum1 = W(0, 1013730783, 1058635434, -1096215015, -1112522509) + + W(1, -1105480706, 1033988870, -1101342144, -1114702617) + + W(2, -1114036922, 1060052265, -1095577996, 1026538642) + + W(3, -1113879072, 1060507082, -1090178495, -1118644393) + + W(4, -1104229785, 1060417175, -1088104859, 1026113715) + + W(5, -1108053747, 1056801557, -1096180920, -1115402364) + + W(6, -1114764169, 1045744608, -1096622362, -1165415829) + + W(7, -1146082265, 1050162924, 1035143657, -1096614130); + sum2 = W(0, -1122276311, -1070701037, -1102500792, -1123484857) + + W(1, 1035291415, -1088124412, -1135890037, -1122878839) + + W(2, -1120194245, 1066415245, 1041496354, 1004310705) + W(3, 1040446858, 1074084237, -1104713726, 1043449641) + + W(4, -1120530587, 1049852139, -1121031703, 1033156545) + + W(5, -1138075205, -1122804719, -1103825640, 1027648711) + + W(6, 1025217366, 1023048268, -1123990667, 1022832518) + + W(7, -1118638617, -1139513797, 1028358694, -1136916673); + WS(1058199967, 1050173679); + sum1 = + W(0, 1035142580, 1049466778, -1090097411, -1180331449) + W(1, 1027370573, 1058691576, -1101732588, 1040649373) + + W(2, -1130262537, 1039593430, -1086371009, -1120260556) + + W(3, 1035504777, 1068404719, -1088745136, 1040680775) + W(4, -1114438555, 1055172389, -1085029652, 1044382793) + + W(5, -1117883815, 1049428736, -1087836907, -1124005336) + + W(6, 1019391016, 1057860609, -1099893249, 1042216563) + + W(7, 1002653538, 1038434456, -1090680108, -1112700144); + sum2 = + W(0, -1116884059, -1098591960, 1049382153, -1103314039) + W(1, 1053572077, 1057696884, 1027480579, -1088718218) + + W(2, -1098664530, -1094622297, -1090176467, -1083506692) + + W(3, 1052736946, 1068603564, 1060239128, -1093271444) + + W(4, -1109898534, -1110319390, 1035982822, -1100206230) + + W(5, -1100793752, -1092295148, -1110105636, 1032439700) + W(6, 1049155169, 1060435963, 1048950002, 1034453968) + + W(7, -1110972354, -1093610507, 1038370396, 1006875670); + WS(-1089372991, 1071972514); + sum1 = + W(0, -1138920887, 1036533027, -1102318256, 994211079) + W(1, -1111770809, -1104793556, 1048489074, -1105180974) + + W(2, -1102811010, 1055175791, -1087761408, 1048668925) + + W(3, -1115715559, -1099167419, 1059252133, 1002658941) + + W(4, 1039086134, -1087507272, 1053162297, -1118760057) + + W(5, -1097310634, 1049070430, -1114433380, 1015366427) + + W(6, 1031148825, -1119324807, -1118494745, 1042346841) + W(7, 1025838913, 1003453989, 1042268638, 1035401151); + sum2 = W(0, 1030112837, 1042265630, 1026971571, -1110663804) + + W(1, -1120976510, 1036120703, -1114486026, 1036038820) + W(2, 990074782, 1034066763, 1060265655, -1093575269) + + W(3, -1093456890, 1054439327, 1048349987, -1097582212) + + W(4, 1037465699, -1093016348, -1099844302, 1034062294) + W(5, 1026987255, 1018637880, 1021593632, 1015927322) + + W(6, -1141406991, -1135344000, -1122669452, -1131991172) + + W(7, -1139369648, 1039303764, -1105461723, -1112258092); + WS(1064707295, -1106068023); + sum1 = + W(0, -1099232505, -1122722466, 1050522762, -1163785122) + W(1, 1035233224, -1096714286, 1050648196, 1029641572) + + W(2, 1008917721, -1092366070, 1057836626, -1106158547) + + W(3, -1113461090, -1085444145, 1065526616, -1112344246) + + W(4, 1030936392, -1087864449, 1058128499, -1120989814) + W(5, 1004172005, -1089654074, 1053303385, 1023496586) + + W(6, 1027313190, -1109977746, 1046037453, -1132212895) + + W(7, -1115756158, -1096643772, 1045431365, 1026679026); + sum2 = + W(0, -1064765544, -1093639717, 1043466147, -1118670633) + W(1, -1081497441, 1052279998, -1106897145, 1026058867) + + W(2, 1073825520, 1049786220, -1111313590, -1120615525) + W(3, 1076205171, 1062543003, 1028519541, 1005098917) + + W(4, -1119211273, -1112239696, -1110796836, 1002459349) + + W(5, 1027623494, -1095053933, 1038884306, 1024155429) + W(6, 1025169073, 1041086677, -1138045203, -1139354443) + + W(7, 1044157267, -1111173396, -1103601885, 1031190784); + WS(-1111449083, -1157616163); + sum1 = W(0, -1140902742, 1050785866, -1096435822, -1106580347) + + W(1, -1108906886, 1041550344, -1095149714, -1111739842) + + W(2, -1107746707, 1063519767, -1097214657, -1112949561) + + W(3, -1091492130, 1070223306, 1059314470, -1090511327) + + W(4, -1106259270, 1056548545, -1091358630, -1115482851) + + W(5, -1123578095, 1033679887, -1102873285, -1102694659) + + W(6, -1112828291, 1033485706, -1098893397, -1119291392) + + W(7, -1129218172, 1037279241, -1105253969, -1105806553); + sum2 = + W(0, 1036877913, -1106537131, 1030920508, -1107276407) + W(1, -1107073590, 1029358898, -1148982309, -1158332371) + + W(2, -1107699229, 1059152956, -1101290720, -1104066278) + W(3, 1043855187, 1059494373, 1057939604, 1057817844) + + W(4, -1112562117, -1100478450, 1054005616, -1089434898) + + W(5, 1015957137, 1042289801, -1078154452, 1041374005) + + W(6, -1137092650, -1117856531, 1052159854, -1109759735) + + W(7, -1113777301, 1034651775, -1095096566, -1112996199); + WS(-1078462192, -1081042006); + sum1 = W(0, 1031777492, -1099264287, 1046006998, 987183826) + W(1, 1032754472, 1043123090, -1098614104, 1036343655) + + W(2, 1041664052, -1089905073, -1129274543, 1009990171) + + W(3, -1097597536, 1061087074, -1106235787, -1097811109) + + W(4, -1104816664, 1058804947, -1084543524, 1031138063) + + W(5, -1113883983, 1049386855, 1054195792, -1097275448) + + W(6, 1034668408, 1033759807, -1107840264, 1026038601) + + W(7, -1123431127, 1048603595, 1024992909, -1120606380); + sum2 = W(0, 1045113399, 1042319052, -1096815184, -1116743882) + + W(1, -1114091637, -1104675582, -1111655631, -1101972302) + + W(2, -1107885511, -1091877193, -1112520325, 1050965596) + + W(3, -1138476145, 1051152873, 1061790396, 1049921296) + + W(4, -1105540689, -1091823953, 1058061302, -1092103725) + + W(5, 1035866831, 1034466874, -1097657024, 1042351236) + + W(6, -1106333432, 1039480371, 1040922298, -1102843808) + + W(7, 1027850472, 1012452041, -1158709515, -1125733657); + WS(1056694143, -1116016311); + sum1 = W(0, -1113789237, 1051083644, -1097139864, -1123205479) + + W(1, -1100431022, -1126988186, -1094809972, 1034447326) + + W(2, 1050877939, 1064972735, -1089357240, 1036660918) + + W(3, 1018856325, 1040063173, -1094444318, -1108178982) + + W(4, 1050520537, 1063261729, -1089641983, 1047968461) + + W(5, -1097203011, 1049408537, -1094346349, -1113292277) + + W(6, -1103919120, 1026641091, -1100978845, 1038849023) + + W(7, -1146363818, 1053332672, -1097363714, -1114302469); + sum2 = W(0, -1117908102, 1019359999, -1120905960, 1017197102) + + W(1, 1013765983, -1145413682, 1028148573, 1027705717) + + W(2, 1045942570, -1095749402, 1032861566, -1127537989) + + W(3, 1086231745, -1062836828, -1087097136, 1031521084) + + W(4, 1048993826, -1094656357, -1145044098, 1027867224) + + W(5, -1110131683, 1037693606, 1040390747, -1114691836) + + W(6, 1005670802, -1125761673, -1112982831, 1031905995) + + W(7, -1126497913, 1018172516, 1016402027, -1122299754); + WS(1058898623, -1129627348); + sum1 = + W(0, -1115961291, 1024824451, 1015893437, -1111982511) + W(1, -1114910804, 1028416398, -1107386562, 1040362701) + + W(2, -1099814536, 1053775806, -1081677098, 1049488325) + W(3, 1014875535, 1049045373, 1054905786, 1016424474) + + W(4, 1042946610, -1081844071, 1057687981, -1105282974) + W(5, 1008636276, 1031972351, 1045923489, -1118478155) + + W(6, -1106406626, 1007262993, 1043411542, 1018226304) + W(7, -1120594878, 1044145240, 1016529769, 1008933435); + sum2 = W(0, -1133545882, 1024635319, -1123675276, 1049399700) + + W(1, 1048887568, -1104650552, 1009836758, -1109494815) + + W(2, -1092588040, -1106613727, -1090053582, -1105276085) + + W(3, 1040041167, 1061771033, 1063348295, -1099749985) + + W(4, -1098849827, 1059347143, -1095509129, -1094328117) + + W(5, 1009986974, 1020453405, -1091467004, 1040581639) + W(6, 1044263399, -1100016935, 1034750124, 1041257354) + + W(7, -1120224962, 1003801667, 1013849670, -1116729410); + WS(1051954047, 1053754534); + sum1 = W(0, -1115617616, 1038078984, 1012663597, -1106689047) + + W(1, 1024010640, 1036755054, -1111840872, 1027644834) + + W(2, -1105864485, 1063482792, -1094956956, 1000291764) + + W(3, -1104806436, 1054877383, -1088048944, -1099610254) + + W(4, -1109064955, 1061183100, -1092794954, 1030290339) + + W(5, -1116880702, 1032370277, -1106496725, -1110075188) + + W(6, -1125878182, 1043596932, -1106933961, -1134690355) + + W(7, 1017392662, 1041423460, 1027390113, -1125796047); + sum2 = W(0, 1032585330, 1041153226, -1098242715, 1045110917) + + W(1, -1120362784, 1038083675, -1097998955, 1041971655) + + W(2, 1053495069, -1085822417, -1097864806, -1094674500) + + W(3, -1103911013, 1062089523, 1056336567, -1090235355) + + W(4, -1152525762, -1088542584, 1061326318, -1100885631) + + W(5, -1128147020, 1044421032, 1046053205, -1141849761) + + W(6, 1012657824, -1113855086, 1042938789, -1114518568) + + W(7, -1104983105, 1041652917, -1160964996, 1032164357); + WS(1061027871, -1104546242); + sum1 = W(0, -1105616597, 999947493, 1020340785, 1044086916) + W(1, 1044372474, -1093243621, 1054887248, -1111771647) + + W(2, 1021564129, -1093936864, 1050165368, 1042456335) + + W(3, 1044930783, -1082760108, 1059757863, -1109427891) + + W(4, 1046184033, -1089254915, 1059995997, -1109416824) + + W(5, 1039863327, -1087020314, 1055330116, -1114227250) + + W(6, 1037242932, -1095491356, 1049586618, -1119355674) + + W(7, 1036593932, -1089177610, 1053764638, 1025046581); + sum2 = W(0, -1071093827, 1060306884, 1049935328, -1107356858) + + W(1, 1026041138, -1087262504, -1137957530, 1030953599) + + W(2, 1068370917, -1080863241, 1024099582, 1026067688) + + W(3, 1068180608, -1104665609, -1097098353, -1149593287) + + W(4, -1099034443, 1065726420, -1115701817, 1031805059) + + W(5, -1126398467, 1036496204, 1043337171, -1111590832) + + W(6, -1114641099, 1052019191, -1155572887, -1110320626) + + W(7, 1032038973, -1112342652, 1039831002, -1165279566); + WS(-1085156031, 1045210454); + sum1 = + W(0, 1032928297, 1062377574, -1090582815, -1097791665) + W(1, -1111119484, 1050029461, -1097825399, 1025846477) + + W(2, 1023710638, 1062121112, -1087364538, 1032229097) + W(3, 1012189550, 1061895670, -1084850381, 1038427330) + + W(4, -1119437633, 1058328143, -1086721078, 1040335420) + W(5, 1039427612, 1050106073, -1087870448, 1036234257) + + W(6, -1114651991, 1051812528, -1095972450, 1026163704) + + W(7, 1039591187, 1050020631, -1089842983, -1146480404); + sum2 = W(0, -1123647935, 1061817512, 1083879676, 1056516802) + W(1, 1039341132, 1048143772, 1075567701, 1037735150) + + W(2, 1035983028, -1106274437, -1081957201, 1028242764) + + W(3, -1100132407, -1080635557, -1069811820, -1096421593) + + W(4, -1107056231, -1101127944, -1080342730, 1035329144) + + W(5, 1035406254, -1113472410, -1083251742, 1030744652) + + W(6, -1116224056, 1025367216, -1113852980, -1094803270) + + W(7, 1039408558, -1101636583, -1087422720, 1049804166); + WS(-1079692512, 1054562755); + sum1 = + W(0, -1109749038, 1042438683, -1092016161, 1050333996) + W(1, -1107273417, 1049923207, -1091034933, 1042543591) + + W(2, -1102577952, 1044388569, -1089719139, 1055304278) + W(3, 1030213964, -1113189609, 1050309800, 1034159515) + + W(4, 1036563817, -1089184118, 1048990040, 1040366472) + W(5, 1046944740, -1087748930, 1053009554, -1122229091) + + W(6, 1031914983, -1096053014, 1048709856, 1006842402) + W(7, 1050658577, -1091524869, 1049517424, 1034826102); + sum2 = W(0, 1041125733, -1094982607, 1055140379, 1061130686) + W(1, -1097603156, 1045744428, 1049918932, 990353951) + + W(2, -1103003109, -1102781952, -1106862916, 1058588396) + + W(3, -1107000988, 1063877853, 1066829095, -1096233798) + + W(4, 1032085636, -1096755169, -1090474230, -1095838692) + + W(5, 1048646468, 1041101455, -1081598978, -1089860215) + + W(6, -1094740103, 1038162032, 1049572267, -1096717844) + + W(7, 1056003520, -1106723297, -1085369603, 1044183141); + WS(-1080283264, 1053171958); + sum1 = + W(0, 1045885175, 1054395509, -1083475508, 1028512496) + W(1, -1113658461, 1050045174, -1095192933, 1035446876) + + W(2, 1034538909, 1055879386, -1085810962, 1026195253) + W(3, 974135701, 1060600957, -1084797135, 1044250612) + + W(4, -1122513036, 1061640838, -1086057732, 1037521197) + + W(5, -1118011958, 1060753746, -1087204563, -1117222317) + W(6, 998696774, 1054788217, -1092652351, 1038575473) + + W(7, -1108239136, 1061053402, -1108529436, -1101819472); + sum2 = + W(0, 1049760823, 1082611215, -1114287788, -1130959534) + W(1, -1132622893, 1077078383, 1055018182, 1035090608) + + W(2, 1033001558, 1066257283, -1101461080, -1112584386) + + W(3, -1136534149, 986681348, -1078537691, -1090394759) + W(4, 1043696998, -1084657320, 1054805894, 1058031741) + + W(5, -1092886300, -1069070549, 1065047159, 1038822180) + + W(6, -1098156850, -1072372844, 1049854091, 1041633511) + + W(7, 1058228696, -1074505611, -1082348593, -1115499033); + WS(-1073398920, 1057727890); + sum1 = + W(0, 1041979362, 1052994159, -1092671491, -1110295050) + W(1, -1106188342, 1056847849, -1087976920, 1033778006) + + W(2, -1108985859, 1060197326, -1085676269, 1040328063) + + W(3, 1040300287, 1059196498, -1108460501, -1114468666) + + W(4, 1044683952, -1094535618, 1051731585, -1102804911) + + W(5, 1046284093, -1094105983, 1046385743, -1098429184) + + W(6, 1044621499, -1102914751, 1031818215, -1104640754) + W(7, 990388050, 1043962286, -1104493131, 1033981777); + sum2 = W(0, 1021160276, -1089430647, -1102895535, 1031984432) + + W(1, -1093219342, -1135654176, 1044152573, -1096279754) + + W(2, -1089562294, -1079796815, -1095163331, 1011763192) + + W(3, -1106388958, 1074674993, 1074136497, -1101895278) + + W(4, -1099093932, -1098010580, -1095203310, -1117345690) + + W(5, -1180890998, 1052929457, -1099885509, -1095468231) + + W(6, -1090965228, 1040584224, 1041387674, -1107912603) + + W(7, 1057228486, 1047748991, -1131585606, 1045144673); + WS(-1087643711, 1073414034); + sum1 = + W(0, 1043421796, 1043019738, -1091862260, 1028452722) + W(1, -1116796288, 1056957030, -1093379129, -1112484637) + + W(2, 1042590607, 1048028053, -1089120888, 1043084437) + + W(3, -1098636497, 1065994910, -1081315117, -1120978641) + + W(4, 1008405302, 1061262410, -1088787029, 1046109207) + W(5, 1005024220, 1059267719, -1093593189, -1105879924) + + W(6, -1106384411, 1045820026, -1108751805, 1024805700) + + W(7, 1029633907, 1054563645, -1106230054, -1095994501); + sum2 = W(0, 1015257573, -1101361376, -1151605286, -1114431290) + + W(1, -1117575950, 1051853927, -1126719224, -1122150057) + + W(2, 1040590395, 1007636882, -1099060090, -1123376079) + + W(3, 1040031817, -1085239439, -1069257368, -1122292554) + + W(4, -1104875608, 1029484438, 1078894141, 1045790053) + + W(5, -1111928738, 1055085469, 1065488662, -1105709439) + + W(6, -1124331304, -1104410806, -1097362053, 1046590167) + + W(7, -1104400845, 1055334030, -1099504604, -1096100911); + WS(-1089052703, 1050218486); + sum1 = W(0, 1024924308, 1032977094, -1127622480, 1016061078) + + W(1, -1124263665, 1048865735, -1103037451, 1027347950) + + W(2, -1114112032, 1032370348, -1093324152, 1047024376) + + W(3, -1101857739, 1057017435, -1130658874, -1114101947) + + W(4, 1004177297, -1096925880, 1049797356, -1136753151) + + W(5, -1132101549, -1106597310, -1147023991, -1136950735) + + W(6, 1037546120, -1101706323, -1148374781, 1016234194) + + W(7, -1127618735, -1138126252, 1041185327, -1135392976); + sum2 = + W(0, -1103127935, 1033687244, 1044282132, -1115309191) + W(1, 1034551493, -1111330163, -1132159854, -1101537844) + + W(2, -1131095837, -1111327049, 1043675418, 989659429) + W(3, 1056852609, -1097897810, 1038437355, -1126658673) + + W(4, 1041291951, -1092598078, -1085166716, -1101159602) + + W(5, 1031312786, 1027703970, -1122838335, 1065573620) + W(6, -1119687326, -1119650108, 1030316614, 1035948285) + + W(7, -1125922018, 1037109557, -1115941571, 1021015548); + WS(1065854560, -1114586365); + sum1 = W(0, 1025132845, -1093129789, 1039292161, 1052478106) + + W(1, -1132208108, -1097600366, 1047014713, -1114318540) + + W(2, 1043375962, -1094779500, 1054220253, 1045472794) + W(3, 1036127555, -1085251325, 1059484531, 1040640636) + + W(4, 1042813603, -1085614646, 1058902029, 1026772633) + W(5, 1042302785, -1083792532, 1058554289, 1030110605) + + W(6, 1041475414, -1088034874, 1049492791, -1123458066) + + W(7, 1044294516, -1081301837, 1057966909, 1048041627); + sum2 = + W(0, -1082315074, -1085719643, 1072912386, -1097858732) + W(1, 1044643809, 1026206592, -1098026838, -1097387905) + + W(2, -1098370418, 1060376399, 1068488422, -1097681385) + W(3, 1032322202, 1066420950, 1072201946, -1095903963) + + W(4, -1088636595, 1042910065, 1055106268, -1092707091) + + W(5, 1057109638, 1025783712, -1087763572, -1104219349) + + W(6, -1093539506, -1117795056, -1084317601, -1087895305) + + W(7, 1061431798, -1120476284, -1077472196, -1105350768); + WS(-1071370880, 1080498273); + sum1 = + W(0, -1117491793, -1117320376, 1025681812, -1112958490) + W(1, 1039364315, -1100646881, 1049740511, -1103504723) + + W(2, 1035846886, -1094786920, 1058631773, -1105396320) + W(3, 1023528601, 1045848824, -1094741601, 1032469201) + + W(4, -1131889533, 1057069771, -1088346742, 1034336534) + + W(5, -1106314247, 1055228236, -1102894479, -1144513794) + + W(6, 1028375004, 1020389492, -1138962992, -1116565942) + W(7, 1013100112, -1127017775, 995411618, 1002008579); + sum2 = W(0, -1097850747, -1108946242, -1129761151, 1024320851) + + W(1, -1107398437, -1114277717, -1118690429, 1012636527) + + W(2, -1085613590, 1063125687, 1040789135, 1029278628) + + W(3, 1042292809, -1084555354, -1101999238, 1026191463) + + W(4, 1054106205, 1059764079, 1051725304, -1119736004) + + W(5, -1106648125, 1041901467, -1128317719, -1127460399) + + W(6, 1035361236, -1103098774, 1022272136, -1115360404) + + W(7, -1122554235, -1148617751, 1025957669, 997652141); + WS(1058528159, 1053906024); + sum1 = W(0, -1112917396, -1104256080, 1023681564, 1039659283) + + W(1, 1035675727, -1092229473, 1058833811, 1021887717) + + W(2, -1104938189, -1097223269, 1051100098, 1033492802) + + W(3, 1040468760, -1082484606, 1061928249, -1119337706) + + W(4, -1105254898, -1103704557, 1057519273, -1099217437) + + W(5, 1020887917, -1100912091, 1047691241, -1127325712) + + W(6, -1113141838, -1118771074, 1047329733, -1114402703) + + W(7, -1149793215, -1099449368, 1044776397, 1024214504); + sum2 = W(0, -1129442596, 1040644144, -1106302200, -1105488042) + + W(1, 1023778714, 1033307012, 1056981996, 1014815489) + W(2, -1113953277, 1056896617, 1082625405, 1048992482) + + W(3, 1026809294, -1080168883, -1064674592, 1043950232) + + W(4, 1035644478, 1030172798, -1098216535, -1120732434) + + W(5, 1034718426, 1046899220, -1107268878, -1121557578) + + W(6, 1016827280, -1114672577, -1138831353, 1026207834) + + W(7, 1038084720, -1138817753, -1118740750, -1122753582); + WS(1050028863, 1057904824); + sum1 = W(0, 1016998719, -1115527732, 1049960370, 1033316845) + + W(1, 1031484924, -1114471481, -1097014217, 1045307870) + + W(2, -1113918453, -1092713340, 1059124695, -1113659631) + + W(3, 1035763396, -1086973069, 1055821255, -1113580281) + + W(4, -1100192683, 1048884339, 1045748179, -1104759887) + + W(5, 1046082071, -1093669960, 1046233018, 1024760783) + W(6, 1023767163, -1109475380, 972758359, 1028768132) + + W(7, -1109585801, -1102684193, 1047341446, -1118597711); + sum2 = W(0, 1042577042, 1058174637, -1093234196, 1036828005) + W(1, 1035985609, 1022451597, 1028288917, 1036599280) + + W(2, -1132583692, -1083350192, -1089654696, 1043707159) + + W(3, -1108557005, -1102051996, 1066585170, -1099096459) + + W(4, 1045882832, -1096734805, -1112976831, -1117191962) + + W(5, 1049978360, 1040525485, -1101233023, 1038823523) + + W(6, -1123148614, -1111555351, 1016281700, 1010883764) + + W(7, 1037998467, 1012738322, 1035922998, -1106116243); + WS(1064158815, 1035299335); + sum1 = + W(0, -1112803360, 1016610641, 1043480489, 1023721675) + W(1, 987363362, -1111853690, -1116662313, -1114846141) + + W(2, 1040202935, -1090418272, 1043761841, 1040437218) + W(3, -1148543050, -1086418793, 1062267936, 1044974085) + + W(4, -1119103150, -1096774480, 1026731899, -1112576238) + + W(5, 1016866897, -1106302329, 1046949595, 1035797256) + + W(6, -1120253212, -1125874772, 1044534239, -1118929285) + + W(7, -1136961231, -1111706212, 1038415821, 1017229376); + sum2 = W(0, 982347958, -1130481715, 1039697927, 1029826582) + + W(1, 1032509555, -1105443060, -1102232537, -1106323503) + + W(2, -1111294086, 1041532435, 1059036310, -1087181565) + + W(3, 1034453505, -1090026061, 1065332554, -1095157490) + + W(4, -1107492941, -1115327745, 1049776291, 1032022369) + + W(5, 1047671755, -1099067440, 1035057967, -1113855935) + + W(6, -1114281099, 1007189687, -1116755236, -1137758215) + + W(7, 1041657921, -1106888056, 1039394631, -1116441678); + WS(1064590463, 1056702913); + sum1 = W(0, 1029043770, -1118119137, 1044521535, -1108622774) + W(1, 1053372231, 1049750478, 1040212560, 1055292354) + + W(2, -1096751755, -1090400466, 1048069253, -1086796959) + + W(3, 1042753121, -1089893441, -1098259842, 1028130891) + + W(4, -1132040847, 1035942347, 1046519145, 1043794349) + + W(5, -1098166823, -1098407696, -1126503113, -1097599727) + + W(6, 1054745035, 1057009004, 1029470901, 1057963224) + + W(7, -1101919647, -1105867448, -1137574860, -1099480944); + sum2 = W(0, -1112469736, 1047380321, -1107309008, -1130012001) + + W(1, -1109993908, 1048112351, -1096267194, 1044766357) + + W(2, -1113626244, 1039961237, -1149218892, 1024449363) + + W(3, -1101975228, 1053720344, 1041967405, -1105185961) + + W(4, -1113395603, 1033059361, -1105421186, 1034928166) + + W(5, -1115391866, -1117206471, 1041082150, -1103730760) + + W(6, -1111764318, 1050486894, -1097114178, 1041700935) + + W(7, -1114050909, 1029031616, -1116211284, -1133808950); + WS(1049282175, -1081654589); + sum1 = W(0, 1026879882, 1056840376, -1089715922, 1023576205) + + W(1, -1106636470, 1051340514, -1103588481, 1019713064) + + W(2, 1025593670, 1059046350, -1087728227, 1018583793) + + W(3, -1120434947, 1060994015, -1081081863, -1116831948) + + W(4, -1109057316, 1062254571, -1089160278, 1040563949) + + W(5, -1103814142, 1054415372, -1110084674, -1148705741) + + W(6, -1108405355, 1044610849, -1097611347, -1130543166) + + W(7, 1025046173, 1057281100, -1102762237, -1108038889); + sum2 = W(0, 1021240677, -1112389783, 1025718250, -1104779102) + + W(1, -1117500355, -1154883848, -1096682611, 1051908652) + + W(2, -1104166105, -1102583420, 1048911763, -1093040032) + + W(3, -1110155670, 1061056453, 1065471868, 1051220588) + + W(4, -1101525323, -1123615532, -1149445264, -1113750073) + + W(5, -1099065181, 1038434309, -1090281103, -1098156535) + + W(6, -1135933351, 1041908272, 1042017461, 1046751376) + + W(7, -1100288377, -1120914319, -1131934595, -1100861861); + WS(1044733566, -1111466942); + sum1 = W(0, 1033634167, 1060020808, -1092913556, -1112663104) + + W(1, -1105078967, 1041929508, -1103349137, -1134753630) + + W(2, -1104340430, 1062221635, -1092289734, -1126194825) + + W(3, -1106426842, 1060048443, -1090785767, -1110397240) + + W(4, -1101553619, 1059584252, -1094348262, -1114529117) + + W(5, -1110993602, 1054717575, -1097827057, -1113238887) + + W(6, -1113465444, 1044713794, -1098824243, -1140846474) + + W(7, 1020428386, 1047352089, 1041060918, -1094820883); + sum2 = W(0, 1040248415, 1084299283, 1054267917, 1002599056) + W(1, -1113076108, 1066146464, 1032173778, 1029289900) + + W(2, 1043824330, -1073408210, -1102778436, 1027082476) + + W(3, -1105221470, -1067326117, -1084477148, -1116688572) + + W(4, 1036602392, -1097425816, -1149511007, 1024010398) + + W(5, -1134849104, 1016852200, 1040914456, -1121212984) + + W(6, -1163695359, -1119512248, 1026379762, 1007530464) + + W(7, 1011808464, -1118870508, 1011171408, 1020903456); + WS(1041204862, 1020998748); + sum1 = + W(0, 1041320410, 1040787048, -1129649268, -1136864165) + W(1, -1111643799, 1044400490, -1096018340, -1123167632) + + W(2, 1033147201, -1112000574, 1041936758, 1014392453) + W(3, 1033305824, 1057857240, -1090212595, 1043382402) + + W(4, -1110534482, 1058317173, -1083609992, 1046901861) + W(5, 1048653459, 1013490791, -1108280561, 1040774794) + + W(6, -1106102028, 1040475768, -1098465902, -1121200123) + + W(7, -1129433652, 1032979455, -1104103124, -1123801518); + sum2 = W(0, 1033367466, -1105739926, 1035166617, -1121294834) + + W(1, 1036408153, 1041467605, -1116824529, 1020242785) + + W(2, 1049195658, -1097896497, -1127250349, 1024987646) + + W(3, -1116950481, 1069287141, -1103787577, -1113169844) + + W(4, -1081345874, 1045676499, -1104285546, -1109755223) + + W(5, 1035726191, -1097322898, -1110450029, -1162599282) + + W(6, -1109751565, 1034595972, 1041775082, -1128984227) + + W(7, 1034565507, 1022861151, -1111377560, 1015705141); + WS(1061587071, -1140717261); + sum1 = W(0, -1112565188, -1082585266, 1063001355, 1029148274) + + W(1, 1035683412, -1091946062, 1057075562, -1133150565) + + W(2, 1034588141, -1086181493, 1061257307, -1121255338) + + W(3, -1105710858, -1084260507, 1062016535, 1031972073) + + W(4, 1024277837, -1087521200, 1059484653, -1140527211) + + W(5, -1104681461, -1094344584, 1051726365, 1015752222) + + W(6, 1033519565, -1109665588, 1053582679, -1140031633) + + W(7, -1097426768, -1092361421, 1050023351, 1054184694); + sum2 = W(0, 1052095029, -1068831962, -1076286348, 1061242602) + + W(1, 1040595366, -1076957703, -1081349117, 1046002483) + + W(2, -1098987175, -1081538085, -1088771362, 1040290526) + + W(3, -1084153168, 1037971476, 1057908839, -1093902656) + + W(4, -1091290481, 1070110671, -1114213425, -1094367529) + + W(5, -1096720628, 1069986978, 1063483875, -1094489561) + + W(6, -1101102486, 1074264190, 1068552571, -1099236623) + + W(7, 1044734380, 1070997731, 1075267150, -1081182731); + WS(-1071242520, -1095264341); + sum1 = + W(0, -1097248122, 1057257956, -1095464807, -1098637431) + W(1, 1017326143, 1050464317, -1098731544, 1039614697) + + W(2, -1105336241, 1059871125, -1096805078, 1034135507) + + W(3, -1091856432, 1058219580, -1088025845, -1098503641) + W(4, 1051920949, 1056167546, 1032394345, 1057766069) + + W(5, -1097210280, 1051126389, -1089070234, -1095933097) + + W(6, -1122345698, 1047883744, -1102431837, 1030493340) + + W(7, 999615444, 1055359408, -1098523426, -1112287963); + sum2 = W(0, -1132961311, 1038597560, -1089057302, 1055074030) + + W(1, 1034954689, -1114842936, -1113751042, 1048893008) + + W(2, -1131131128, 1039456110, -1095192990, 1046429121) + + W(3, -1105685093, -1104727669, -1097910004, 1057064004) + + W(4, 1044104138, -1085849936, 1064526735, -1091871118) + + W(5, -1118659572, 1053272959, 1045257331, -1096323208) + + W(6, -1117347443, -1117746499, 1054461586, -1090448877) + + W(7, -1140373421, 1049759548, 1062278408, -1081803378); + WS(1055746431, 1040288248); + sum1 = W(0, -1154016945, 1057716289, -1093759650, -1122750430) + + W(1, -1117613130, 1055590360, -1094487986, -1117149477) + + W(2, -1108247483, 1059644857, -1089867895, 1031955359) + + W(3, -1114072538, 1067207252, -1085229664, 1016534394) + + W(4, -1103530014, 1062212336, -1089860607, 1044969554) + + W(5, -1134724696, -1104299500, -1088563377, -1137442922) + + W(6, -1102903742, 1049302591, -1097577389, 1035178328) + + W(7, 1046496384, 1054319858, -1094962569, -1108831509); + sum2 = W(0, 1041968914, 1051752153, -1123800846, -1117011966) + + W(1, 1026703145, -1115260470, 1035127537, 1031245794) + W(2, 1033601916, 1038625472, 1035458769, -1109678904) + + W(3, 1035338047, 1052354182, 1035609386, 1050054059) + + W(4, -1106207855, -1118891350, 1057116581, -1098815779) + + W(5, -1094112140, -1081023345, -1104080857, 1038926653) + + W(6, -1100978937, -1084581041, 1055976243, -1108176195) + + W(7, -1106593629, 1066756564, -1101750238, -1107244818); + WS(-1089881759, 1037957184); + sum1 = + W(0, 1000251530, -1098029886, -1105974859, 1041712355) + W(1, -1117869170, -1095515176, 1060224425, 1040628361) + + W(2, 1029072469, -1089055515, 1060210489, 1042449912) + W(3, 1031851625, -1079829205, 1061092856, -1119516507) + + W(4, 1024508279, -1094362449, 1060581840, -1102207965) + + W(5, -1105582638, -1105281331, 1056017638, -1107063314) + + W(6, -1121710869, -1112643769, 1040568609, -1112932479) + + W(7, -1105403363, -1102959900, 1050032516, -1124065669); + sum2 = W(0, 1051114274, -1102532150, -1093533301, 1042271071) + + W(1, -1105565679, -1114476854, 1038543175, -1112348507) + + W(2, 1055378846, -1082969540, -1075201485, -1087360189) + + W(3, -1098769061, 1064670328, 1077554590, -1100903801) + + W(4, -1106275827, -1102001010, 1048871628, -1115312306) + + W(5, -1101598109, 1044770567, 1040464379, 1031777408) + + W(6, -1109849433, -1114021751, -1111404687, -1125205988) + + W(7, -1104426610, 1049459491, 1049461049, -1104546886); + WS(-1089609215, -1090633405); + sum1 = W(0, -1095985139, 1060468726, 1029992257, -1106189340) + + W(1, -1131730646, -1114989785, 1035463235, -1121474072) + + W(2, -1106836118, -1111340153, 1053834481, -1109753904) + + W(3, -1120898567, -1083229835, 1057093887, -1170836447) + + W(4, -1122196780, -1097505195, 1060127651, -1099640750) + + W(5, -1108220230, -1091862496, 1056095953, -1106303115) + + W(6, -1113602180, -1118278055, 1053644551, -1102165833) + + W(7, -1111282801, -1094974325, 1060964715, -1114233933); + sum2 = W(0, -1102755055, 1028184991, 1014375557, 1018724927) + + W(1, -1123071369, 1018963304, 1034540123, -1154538439) + + W(2, -1101642458, 1042446539, -1110958917, 1030328833) + + W(3, -1121616776, 1048904011, 1055634924, -1104340897) + + W(4, -1123659230, 1022095962, -1122273513, -1123674010) + + W(5, 1034971308, -1102092583, 1047229966, -1103087688) + + W(6, -1114444448, -1115812270, 1006913192, -1118183380) + + W(7, 992820811, -1115600403, 1032293939, -1116477720); + WS(-1089497119, -1083970920); + sum1 = + W(0, 1049400081, 1017038202, -1096866095, -1129668560) + W(1, -1112985379, 1054102421, -1092440080, 1023489999) + + W(2, 1032734776, 1052273107, -1090492445, 1039999326) + W(3, 1046931016, 1050677101, -1077775563, 1047866250) + + W(4, 1032966898, 1056472798, -1095500286, 1031139121) + W(5, 1026703569, 1054012759, -1141821439, -1128248842) + + W(6, 1023567673, 1046736000, -1103091876, 1037611037) + + W(7, 1020804657, 1054561791, -1096856494, -1102316761); + sum2 = W(0, -1119432539, -1113150368, 1049552369, -1123950204) + + W(1, -1114702364, -1107904829, -1109676099, 1034167140) + + W(2, -1131454616, 1051795717, 1049548364, 1018171432) + W(3, 1045807900, 1065572002, 1052256292, 1024318084) + + W(4, -1107556037, -1104213250, 1058452060, -1104886632) + + W(5, -1138592655, -1096394963, -1077576443, -1103410805) + + W(6, -1120197723, 991774812, -1102019177, -1103678409) + + W(7, -1116354551, 991245404, 1049782966, -1123412946); + WS(-1092399743, 1070790531); + sum1 = + W(0, 1031557241, -1110110152, -1086332927, 1040307665) + W(1, 1024013147, -1123928476, -1104003948, 1029330819) + + W(2, 1045977841, -1100428029, -1091187884, 1054647477) + + W(3, 1049827334, -1093314535, -1110202001, 1048337215) + W(4, 1044712430, -1098211617, 1031718940, 1045074033) + + W(5, 1042539942, -1120318828, 1031171411, 1042256462) + W(6, 1022243624, -1110797385, -1118825252, 1034920639) + + W(7, 1042631871, -1103475236, 1047659449, 1041342974); + sum2 = W(0, 1035080118, 1049091174, 1068767241, 1056655092) + W(1, -1111978522, 1049791001, 1068692590, -1120502660) + + W(2, 1043189101, 1038894820, 1041587068, 1054889999) + + W(3, -1107203795, -1088677682, -1079138335, -1094007639) + + W(4, 1020874649, -1074681252, -1088844169, -1106617291) + + W(5, 1040978901, 1032440616, 1033618204, 1037089622) + + W(6, -1103963851, -1139760881, 1036797334, -1115116202) + + W(7, 1014904337, -1132242473, 1040720920, 1029103732); + WS(-1076899872, -1090262268); + sum1 = W(0, -1111775583, -1105212520, 1053805936, -1130865048) + + W(1, -1105515965, -1109220950, 1044900104, -1124779047) + + W(2, 1031134981, -1105276619, 1061229259, -1108606366) + + W(3, -1152866339, -1081197371, 1056451270, 1012899053) + + W(4, 1022185487, -1085735312, 1061180827, -1111684786) + + W(5, 1031461535, -1090100176, 1061600458, 1038272628) + W(6, 991487050, -1106571081, 1040836429, -1123743158) + + W(7, 1013082739, -1094472404, -1114201801, 1043636133); + sum2 = W(0, -1092758077, 1054372816, 1025999909, 1025560437) + W(1, -1099940688, 1036990346, 1044094629, 1015649794) + + W(2, -1096959860, -1102824961, -1093700170, -1134776466) + + W(3, -1093749782, 1072234824, 1074465248, -1118772240) + + W(4, 1047974360, -1091574668, -1086059593, -1097328702) + + W(5, -1120633714, -1098403340, -1083936129, 1035273338) + + W(6, 1036248767, -1097220109, 1045585843, -1098634116) + + W(7, -1113388587, 1024848209, -1093741871, 1051989609); + WS(-1097318719, -1106686758); + sum1 = + W(0, -1138034233, 1031803579, -1107190316, -1118470609) + W(1, 1022220430, -1105675680, -1110575515, 1013564641) + + W(2, -1115259277, 1060345356, -1091489993, 1028754310) + W(3, 1037878284, 1040095311, -1082557626, 1043380040) + + W(4, -1109043646, 1057210483, 1054616755, -1126688788) + + W(5, -1118564628, 1018511203, -1113047197, -1103180903) + + W(6, -1132126739, 1038086620, 1037558661, -1105313401) + + W(7, -1123355602, 1040876381, 1040895458, -1110366427); + sum2 = + W(0, -1116780480, 1011610145, -1126532250, 1031867194) + W(1, 1034654933, -1109786563, 1049246354, -1117436106) + + W(2, 1033980194, 1034290987, -1098441369, 1050453777) + W(3, -1106740681, 1058839838, 1055488745, -1098876833) + + W(4, 1037910476, -1112504437, -1081564854, -1101879397) + + W(5, -1110588743, 1048688059, -1109313096, -1105182695) + + W(6, 1033369701, -1100404580, 1046210019, 1033744368) + W(7, 1006481529, 1024874106, -1122526519, 1042001428); + WS(1061957727, 1058150789); + sum1 = + W(0, 1009728708, -1099288198, 1046412713, 1036440691) + W(1, 1031914819, -1097230757, 1055587995, -1109853493) + + W(2, 1043097483, -1087266183, 1056802398, -1106212891) + W(3, -1106863550, 1043273168, 1049133325, 1023154886) + + W(4, -1097372952, 1055416522, -1086687979, 1047286155) + + W(5, -1108191069, 1050026271, -1105368103, 1036106272) + + W(6, 1032793786, -1110590381, -1107437206, 1024106902) + + W(7, -1129266281, -1108247452, 1042988739, -1120124353); + sum2 = W(0, 1021676194, 1026925373, -1130821928, 1011207236) + + W(1, -1104415808, 1041631623, 1047340087, -1118374396) + W(2, 1041444786, 1049347642, 1055108729, 1032289888) + + W(3, -1104915444, -1075706495, -1078646873, -1097824639) + + W(4, 1042839409, 1068941883, 1058328878, 1041964936) + W(5, 1025561656, 1049874161, 1054741696, -1122940124) + + W(6, -1111488206, -1096918949, -1108156193, 1033049167) + + W(7, -1119893126, 1030080935, -1107876167, -1131526532); + WS(1058678303, 1013994144); + sum1 = + W(0, -1118673511, 1050426208, -1111022430, -1110204509) + W(1, -1145988558, 1032382213, 1019043839, -1116037137) + + W(2, -1107600786, 1059103555, -1086017695, 1043824660) + + W(3, -1097799452, 1061451838, -1090188381, -1111434373) + + W(4, 1050901309, -1098106458, 1050664020, -1123560275) + W(5, 1025019066, 1032049821, -1093177128, 1043538778) + + W(6, 1034380585, 1038038624, -1133222475, -1104489131) + + W(7, -1117490811, 1043957152, -1113568728, -1110765932); + sum2 = + W(0, -1105859137, 1052524883, -1116369180, 1025172812) + W(1, 1047608842, -1096529292, 1033298597, 1035180205) + + W(2, -1101390223, -1103682938, -1095014501, -1138831970) + + W(3, 1011548907, 1018027622, 1063707518, -1096368530) + W(4, -1098146078, 1039330573, 1056731707, -1094263126) + + W(5, 1047719826, -1101134187, -1086128756, 1061932077) + + W(6, -1099968186, 1054816538, 1037701277, -1095466983) + + W(7, 1028887915, -1105962981, -1150004284, 1016476277); + WS(1063038079, 1033861047); + sum1 = + W(0, -1111914898, 1016779545, -1107257338, -1114919788) + W(1, 1040884807, 1014390112, 1045397811, -1162045399) + + W(2, -1102681756, -1109833994, -1096677860, -1101855164) + + W(3, 1061986003, -1095449911, 1065846455, 1049909751) + + W(4, -1095429920, -1097838100, 1029008656, -1097193708) + + W(5, -1109559865, 1019923216, 1039008680, -1113534130) + W(6, 1034752240, -1148961393, 1033037520, 1007645095) + + W(7, -1104233906, 1009274926, 1029851870, -1103320918); + sum2 = W(0, -1112457849, -1117177515, 1031942991, -1106095669) + + W(1, -1106002020, 1017665294, 1033022206, 1041685053) + + W(2, -1103752624, -1098231154, -1133545004, -1095196752) + + W(3, -1114732591, 1062239338, 1061426536, 1046863079) + + W(4, -1102536580, -1097906884, -1109528685, -1105989872) + + W(5, 1029961226, -1101585142, 1032626487, -1120505375) + + W(6, -1114728817, 1037597321, -1114069131, 1028074076) + + W(7, 1038070251, -1112453861, 1032988844, -1124888510); + WS(1060691839, -1121680521); + sum1 = W(0, -1112633460, -1105323108, 1045243383, -1113361469) + + W(1, 1034282296, -1097943963, -1117038833, -1109479713) + + W(2, 1016470792, -1091137362, 1060606770, -1110311799) + + W(3, -1124091490, -1083253895, 1065759511, -1102522287) + + W(4, 1036530779, -1090987401, 1062311590, -1114082482) + + W(5, -1110508885, -1090137469, 1056765570, -1104777690) + + W(6, 1036991882, -1098291034, 1054157412, 1016563642) + + W(7, -1133939630, -1093525810, 1057599172, -1167556095); + sum2 = + W(0, -1097189010, 1057901747, -1086723052, -1086497310) + W(1, 1041454563, 1039698409, -1087530727, -1090377488) + + W(2, -1110771302, -1122301550, -1094374456, -1110538585) + + W(3, 1043926258, -1125642190, 1064818137, 1061014784) + W(4, -1109373654, -1108285138, 1036021291, 1034378960) + + W(5, -1109768355, 1020817735, -1109979249, 1044647130) + W(6, -1114304258, 1040279727, 1055924705, 1013465199) + + W(7, 1043669875, -1101494695, 1040712355, 1050381101); + WS(-1087684831, -1094525449); + sum1 = W(0, 1038107891, -1093934649, 1052573184, 1038198313) + + W(1, -1121734275, -1096975274, 1049163549, -1113930844) + + W(2, 1035814365, -1093954738, 1040479417, 1035537105) + + W(3, -1107604308, -1090018791, 1066601083, -1102439448) + + W(4, 1038052214, -1088075930, 1058232216, -1113118893) + + W(5, -1101928869, -1090123804, 1057618495, -1148589172) + + W(6, -1104767443, -1106254226, 1040796439, -1146582942) + + W(7, -1127021124, -1100235009, 1051666987, 1033628463); + sum2 = + W(0, -1102391770, 1038892506, -1109920182, 1034045130) + W(1, 1032495868, 1032348345, 1035913564, -1111661823) + + W(2, -1140349122, 1055934176, 1043439866, -1148365864) + W(3, 1051494072, 1066287204, 1049172795, 1035742233) + + W(4, -1080481573, 1070533091, 1048700512, 1024670194) + W(5, -1072283498, 1056179234, -1122911277, 1043482108) + + W(6, -1085993190, -1098172645, 1042548330, -1117726050) + + W(7, -1091499210, 1038613315, -1103404378, 1024343165); + WS(-1095407551, -1073547033); + sum1 = W(0, -1103915126, 1043640456, -1106314263, -1099126911) + + W(1, -1101976843, 1041775803, -1098551608, 1023142916) + + W(2, 1024335748, 1061599658, -1096990689, -1110220795) + + W(3, -1108044768, 1057524528, -1095708126, -1106562202) + + W(4, 1050893513, 1060862745, -1102020840, 1056016670) + + W(5, -1095324014, 1028413803, -1092797676, -1099653918) + + W(6, -1107189281, 1044362232, -1110398586, 1031215069) + + W(7, -1114975198, 1051352312, -1097969466, -1138223071); + sum2 = W(0, -1112168075, 1034632723, 1034960798, -1112860057) + + W(1, -1111493200, -1122920764, 1040740621, -1108202591) + + W(2, -1123529566, 1009053647, -1105159128, -1115675116) + + W(3, 1022286331, 1049936313, 1057592446, -1112708946) + + W(4, -1103466952, 1051909492, -1126339526, -1146770753) + + W(5, 1035493883, -1099948229, 1041517424, -1116950762) + + W(6, -1113566520, 1029419308, 1016655048, -1115594520) + + W(7, -1106265315, -1107051081, 1024151142, -1103163741); + WS(1063407871, 1051042354); + sum1 = W(0, 1005154604, 1049807310, -1113122997, -1107282310) + + W(1, -1120529264, 1052429035, -1100831547, 1042685852) + + W(2, -1106161584, 1057743574, -1088929544, -1113923042) + + W(3, -1130858780, 1063894449, -1086654500, -1129272494) + + W(4, -1114354154, 1058090310, -1089886688, -1164896285) + + W(5, -1127255711, 1052514789, -1092092086, -1131567786) + + W(6, 1023693521, 1044231916, -1106897472, -1131959253) + + W(7, -1115504868, 1049931918, -1097639884, -1115987013); + sum2 = W(0, -1113031572, 1043434467, -1088941888, -1067187434) + + W(1, 1030565628, -1108784254, 1056568736, -1079041185) + + W(2, -1127702936, -1111949688, 1036016830, 1074040966) + W(3, 992883874, 1036810375, 1060861120, 1075709893) + + W(4, 1014952720, -1111107284, 1023742716, -1099161149) + W(5, 990495554, 1042918247, -1098281783, 992814626) + + W(6, 1018238740, -1120169364, 1022041004, 1039733673) + + W(7, 1023316920, -1112993936, -1112517088, 1028892682); + WS(1053166591, -1107822593); + sum1 = W(0, 1033874440, -1120335240, -1105709561, 1042509273) + + W(1, 1022746982, 1031831786, -1108379508, 1008295657) + W(2, 1035703758, 1052124034, -1093762507, 1044631286) + + W(3, 1019810386, 1048792350, 1046826502, -1124953572) + + W(4, 1044260196, -1095582904, 1053612659, -1112928126) + + W(5, 1042374543, -1088629918, 1045805451, -1113071488) + + W(6, 1040749291, -1097950065, 1037463342, -1120529605) + + W(7, 1041374685, -1085974448, 1042845918, -1132054272); + sum2 = W(0, 1010990056, -1096561981, 1040308359, -1119485380) + + W(1, 1039106059, -1097601992, 1052717590, -1115258493) + + W(2, -1102786881, 1031463124, 1058176412, -1101721469) + + W(3, -1114641521, 1058004743, 1045709336, -1138490792) + + W(4, -1133768253, 1042505523, 1034355291, -1101570252) + + W(5, -1101476912, 1041182740, -1096768246, 1029590734) + + W(6, -1103607882, -1105959219, 1033275384, 1037679123) + + W(7, -1113060394, -1099775079, -1105804625, 1036565969); + WS(1028916214, 1067075549); + sum1 = + W(0, 1039584518, -1148995491, -1098323934, 1026160863) + W(1, -1119264713, -1109885152, -1096386895, 1022848653) + + W(2, 1016298993, 1055889168, -1096985498, -1150434165) + + W(3, -1105861885, 1067421167, -1085982162, 1034469007) + + W(4, -1113980813, 1059632007, -1087532161, 1044152506) + W(5, 1020015061, 1055091716, -1088331431, 1024761132) + + W(6, -1134777055, 1045130509, -1095878225, 1032543553) + + W(7, 1032661512, 1052375930, -1104015130, -1104676378); + sum2 = W(0, -1120016029, -1101422768, -1104653664, -1122344899) + + W(1, -1096222017, -1103630239, -1105545071, 1042131820) + + W(2, -1119382227, 1040689805, -1120927281, -1120071349) + + W(3, -1092715875, 1064582511, 1058022283, -1101606830) + + W(4, -1110818689, 1043406218, 1060808344, -1096987934) + + W(5, 1049876716, -1089499537, -1107109410, 1051590178) + + W(6, -1103484103, 1029271710, -1107008053, -1099435532) + + W(7, 1032841990, -1117522613, -1105419897, 1050342947); + WS(1047020030, 1040511430); + sum1 = + W(0, -1108637223, -1092384755, 1057603229, 1031927268) + W(1, 1033110649, -1090443530, 1053549631, -1122999800) + + W(2, 1044090139, -1085982557, 1061618217, 1026366340) + W(3, 1043424750, -1080046633, 1047924234, 1032840448) + + W(4, 1036624046, -1083957593, 1053999549, 1015929108) + W(5, -1120308481, -1096279270, 1057048888, 1020572028) + + W(6, 1033721201, -1149642107, 1057845673, 994286645) + W(7, -1106849700, -1100324533, 1052833857, 1039624063); + sum2 = W(0, 1035208568, -1124082321, -1093736918, 1048736861) + + W(1, 1043030610, 1008382386, 1050323039, -1118377912) + + W(2, -1107699159, -1107061123, -1114950423, -1106119918) + + W(3, 1044796248, 1049576136, 1074526989, -1111443567) + W(4, 1034655700, 1051573865, 1073198167, -1132389881) + + W(5, -1103668262, 1048541752, -1080621030, 1034733436) + + W(6, 1045164876, -1093669891, -1074078238, 1034120076) + + W(7, -1095424772, -1134934914, -1079139349, 1029501600); + WS(-1080108544, 1072234904); + sum1 = + W(0, -1115070415, 1027588151, 1031137458, 1018404227) + W(1, -1130610603, 1029085890, -1104252646, 1044293186) + + W(2, -1098588213, 1032775046, 1056995037, 1028038521) + W(3, 1057466749, -1089931562, -1083673968, 1050777268) + + W(4, -1104374087, -1123371019, 1052314097, -1093125043) + + W(5, 1029557602, -1094030554, 1050628415, 1046325824) + W(6, 1018553236, 1034779836, 1033643941, -1108340394) + + W(7, 1001112594, 999211181, 1036988180, 1020739741); + sum2 = W(0, -1115557063, 1043108929, -1138826120, -1108049897) + + W(1, -1118678156, 1033401680, -1093193803, -1109597407) + + W(2, 1045099863, 1036186051, -1079584214, 1013268663) + + W(3, -1102856438, -1124450766, 1068262877, 1049634970) + + W(4, 1035209289, -1112637977, -1121148137, 1046161245) + + W(5, 1035167397, -1114646959, 1041792105, -1111895568) + + W(6, -1117208818, 1012643139, -1138286224, -1127251156) + + W(7, -1120387027, -1132473655, 1032348301, -1116707942); + WS(1061770399, 1033097145); + sum1 = W(0, -1127803310, -1100493560, 1049484359, -1117956049) + + W(1, -1108446526, -1122290538, 1040952192, -1101349332) + + W(2, 1046619869, -1090144134, 1049567736, 1015706547) + + W(3, -1102069216, -1124504076, 1060283011, 1051006353) + + W(4, -1115166002, -1096124978, 1036170309, 1027971186) + + W(5, -1107462472, -1113245389, 1049188012, -1105896346) + + W(6, -1113123881, -1115437168, 1004781969, 1011773295) + + W(7, -1109525661, -1114380655, 1043620172, -1118021614); + sum2 = W(0, -1115090363, 1035607607, 1036976780, -1102631851) + + W(1, -1146121477, 1032878473, 1008730983, -1105868946) + + W(2, 1029869322, 1020296178, 1050702114, -1106613659) + W(3, 1039239074, -1094567498, 1060438996, 1056742871) + + W(4, -1123366919, -1133024223, -1092544833, 1056526109) + + W(5, -1123569769, -1111505684, -1088372125, -1103439045) + + W(6, -1115297931, 1036037468, -1119747923, -1114092237) + + W(7, 1022224092, 1025152664, 1015952550, -1109382916); + WS(1063262431, 1041246684); + sum1 = + W(0, -1095604910, -1094141452, 1054301899, 1050361575) + W(1, 1035931377, -1103734011, 1050116188, 1015464930) + + W(2, -1116408259, -1088213584, 1059695011, -1130477940) + + W(3, -1113418944, -1084116356, 1063045487, 1005018697) + + W(4, 1035543059, -1088057339, 1060587189, -1114430457) + + W(5, -1109446615, -1084926720, 1062081288, -1112900435) + W(6, 1041501409, -1095142868, 1055163174, 968128030) + + W(7, -1111045021, -1085134126, 1061043357, 1012274924); + sum2 = W(0, -1088652568, 1079171932, 1068650823, -1089634291) + + W(1, -1101936220, 1073764649, 1062997529, -1106083041) + + W(2, -1091191468, 1074855165, 1053027607, -1102140198) + + W(3, -1102444501, -1113430470, 1039600983, -1123235056) + + W(4, -1123800532, -1095064501, -1105207914, 1028735871) + + W(5, -1111069004, -1078839186, -1082346847, 1056073450) + + W(6, -1088813372, -1078450334, -1088354544, -1114344542) + + W(7, 1050243792, -1071519758, -1081653443, 1060600412); + WS(-1071343712, -1080188504); + sum1 = W(0, 1048814204, 1024112567, -1101821021, -1155239198) + + W(1, -1112944093, 992179242, -1105846854, -1115614373) + + W(2, 1038698214, 1035991718, -1110088095, -1117961066) + + W(3, -1110388460, 1065540811, -1086620536, 1022833410) + + W(4, -1102353903, 1062800155, -1085891530, 1037955557) + + W(5, -1113346827, 1057270438, -1092189183, -1130491710) + + W(6, -1115354285, 1047814390, -1094362793, 1026576596) + + W(7, -1172877482, 1055244391, -1096652125, 1021561214); + sum2 = W(0, 1077488778, 1057844910, -1110901413, -1157420388) + + W(1, 1067869852, 1017329883, -1123912240, 1016773013) + + W(2, -1080283979, -1112258962, 1048616910, -1127671945) + + W(3, -1070445594, 1038200220, -1103189448, 1027002057) + + W(4, -1085461181, 1045877800, 1033584054, -1139116556) + + W(5, -1113067149, 1016515143, -1113680120, -1108492850) + + W(6, -1135625536, 1029029881, 1006246833, 1033508697) + + W(7, -1105631704, 1026840239, 1028070058, -1122607860); + WS(-1114300667, -1123436789); + sum1 = + W(0, 1048745214, 1024457460, -1084727981, -1124831645) + W(1, -1106612992, 1049280824, -1099711469, -1120312678) + + W(2, 1040619730, 1061265254, -1091611130, 991636461) + W(3, -1101020989, 1066754197, -1090437274, -1115033343) + + W(4, -1120049178, 1060475010, -1087975654, 1037659252) + + W(5, -1129452308, 1056957204, -1087165059, 1036876438) + + W(6, -1112058252, 1052291799, -1095257281, 1024723233) + + W(7, 1040777596, 1051532558, -1091858685, -1128167880); + sum2 = + W(0, -1102675226, -1096018291, -1064870457, 1050758265) + W(1, 1045758589, 1033992894, -1078407710, -1091427154) + + W(2, -1106608364, 1053924217, 1074354229, 1044800412) + W(3, 1037856863, 1023354017, 1077566439, -1122690967) + + W(4, -1121700495, 1045521037, 1055978728, 1037435194) + + W(5, 1038509645, -1112080608, -1100523264, -1101170582) + W(6, 1041300787, 1019757091, 1032114149, 1048475585) + + W(7, 1013024414, -1111416466, -1096094745, 1031501486); + WS(-1081349952, -1073531246); + sum1 = + W(0, -1130396178, -1092471918, 1052933181, -1120779255) + W(1, -1123247001, -1094799967, 1040552427, 1032899791) + + W(2, 1049234666, -1087091570, 1062313536, 1048808240) + W(3, -1123595694, -1083589055, 1056428784, 1047688662) + + W(4, 1044575749, -1090515766, 1060166366, 1025076592) + + W(5, -1118849787, -1088301188, 1052569014, -1104574961) + + W(6, 1027091408, -1100895532, 956727337, -1114767697) + W(7, 1015989072, -1095518837, 1057005798, 1028829344); + sum2 = + W(0, 1036727690, -1101780564, 1047063866, -1095151348) + W(1, 1038605852, 1036224480, 1003722492, -1101329253) + + W(2, 1000461252, 1043313873, 1071364196, -1071443435) + W(3, -1108807283, 1058417373, 1075919102, -1072909475) + + W(4, -1118764382, -1110550387, 1031984760, -1137970650) + + W(5, 1040753555, 1041024731, 1052825370, -1094681513) + W(6, 1025474323, 1032765623, -1104266299, -1130737363) + + W(7, 1026410269, -1114514162, 1049040777, -1100563228); + WS(-1087415039, 1075227720); + sum1 = W(0, 1014202565, 1030200505, 1042588557, 1032642210) + W(1, -1121306305, -1093044977, 1045750086, 1039690838) + + W(2, -1115466670, 1052765481, -1099185023, -1099716881) + + W(3, 1055732347, -1086016434, -1102841730, 1054066516) + + W(4, -1088701572, -1108244135, 1060432915, -1089156724) + + W(5, 1045428619, 1044242725, 1001272287, 1045967960) + W(6, -1106855619, -1102530383, 1047811955, 994787170) + + W(7, -1113272762, 1042147022, 1043051755, -1114980876); + sum2 = W(0, 1034817173, 1033088277, -1105460751, -1119967238) + + W(1, -1106843150, -1115275500, 1042281307, -1122100142) + + W(2, 1035283571, -1108330169, -1117933953, -1118763227) + + W(3, -1117324330, 1059951304, 1055263105, 1033190213) + + W(4, -1106783723, -1114610359, 1036736577, -1099584511) + + W(5, 1033652183, -1130129964, 1034893511, -1097591398) + + W(6, -1105003316, -1100855920, 1040893249, 1043864443) + + W(7, -1109219720, 1017452836, 1026860110, -1097701018); + WS(1061885343, -1093433134); + sum1 = W(0, -1119074171, -1116612499, 1043937396, 1026065358) + + W(1, 1040591342, -1106037336, 1035985530, 1035233146) + W(2, 1024365415, -1090085717, 1054530437, 1023445318) + + W(3, -1112185530, -1110885309, -1105284753, 1041032751) + + W(4, -1102861510, 1058148680, -1085809524, 1043298226) + + W(5, 1047951017, -1098920364, 1042740717, 1028431483) + + W(6, 1033079635, -1104145445, -1143903027, 1030877520) + + W(7, 1030794670, -1102965524, 1048819605, -1110782149); + sum2 = W(0, -1120425303, -1115506247, -1089905659, -1106986872) + + W(1, 1041777983, -1109249837, -1082926483, -1093100415) + + W(2, 1008642595, 1051302633, 976609774, -1100742938) + W(3, 1038578170, 1062460419, 1062992305, -1121360027) + + W(4, -1103931105, 1046700430, 1016533657, 1026171953) + + W(5, -1144970974, -1110379832, 1046952726, -1123505732) + + W(6, -1139607395, -1121481149, -1128426413, 1047068010) + + W(7, -1105571910, -1125592805, 1044012895, -1108759193); + WS(1057387711, 1071476886); + sum1 = W(0, 1029774760, -1088145158, 1058722665, 1026644842) + + W(1, 1046876472, -1090879061, 1046940920, -1124024690) + + W(2, 1049447728, -1087750555, 1062289140, 1034805113) + + W(3, -1104814472, -1081209882, 1060559271, -1101227374) + + W(4, 1047761369, -1102041597, 1057163193, 1041428045) + + W(5, -1107998911, -1088704948, 1046238393, -1112057972) + + W(6, 1035672969, -1101378696, 1049034574, -1123650077) + + W(7, 1025453339, -1090772220, 1051154538, 1045125730); + sum2 = + W(0, -1079574021, 1066168402, -1106633910, 1033041398) + W(1, -1076424748, 1072246945, 1039775524, 1025560740) + + W(2, -1084651933, 1055648588, -1122282375, 1042767844) + + W(3, -1079383446, 1069722149, 1050613020, -1122422479) + + W(4, -1094010079, -1105729737, -1112550614, 1029478726) + + W(5, -1105513599, 1052366950, 1046757765, 1029747528) + W(6, -1094989946, 1046266897, 1041413657, -1132333344) + + W(7, -1083946107, 1064021500, -1117589808, -1110924549); + WS(-1088291167, -1076464582); + sum1 = W(0, 1038365083, 1048475643, -1115380053, -1113517956) + + W(1, 1013092187, 1039614653, -1115741870, -1118168192) + + W(2, 1049005176, -1105893787, -1115211424, 1038779144) + + W(3, -1096083994, -1090164821, -1106465144, -1103584918) + + W(4, 1046666973, 1048630844, -1092124773, 1051487172) + W(5, 1029385568, 1052597003, -1097273638, 1036949051) + + W(6, -1130846211, 1030762351, -1104199584, 1029432699) + + W(7, 1035921309, 1049653618, -1098780292, 1041505439); + sum2 = W(0, -1102442432, -1119046775, 1038119755, -1116688635) + + W(1, 1042447103, -1103497340, -1117033259, -1109692823) + + W(2, 1009200726, -1108371687, -1111757198, -1136365839) + + W(3, -1140140535, 1063726871, 1053430514, -1103585210) + + W(4, 1018235219, 1023996549, -1097582390, 1035998106) + + W(5, 1038566242, -1100556235, -1130738637, -1122627505) + + W(6, -1105836948, -1134905751, 1027482933, -1113769016) + + W(7, -1119461411, -1115426548, 1038939472, -1131103707); + WS(1063535295, -1106643391); + sum1 = W(0, 998897947, 1049160779, -1095715331, 1022592892) + W(1, -1114069468, 1050551697, -1114097198, 1035333911) + + W(2, 1030590255, 1037435628, -1091439068, -1105875754) + + W(3, -1120649212, 1059662980, -1098500149, 1036951763) + + W(4, -1112623985, 1051258674, -1093374928, -1097348874) + + W(5, -1135800742, 1051146291, -1112852607, 1021555078) + + W(6, -1126057998, 1042046535, -1104302276, 1032877804) + + W(7, -1118923687, 1051522915, -1098602138, -1118947123); + sum2 = + W(0, 1020791040, 1023004440, -1131522740, -1130592194) + W(1, -1119848331, 1035188360, 1010552055, -1114014595) + + W(2, 1028098574, 1036866165, -1087402238, 1057774258) + W(3, 1024075228, -1081188844, -1063807577, 1085749988) + + W(4, 1036335573, 1036267331, -1074297638, 1072260443) + W(5, -1114214294, 1020492762, 1044255896, -1101071935) + + W(6, 1028067710, 1026996488, -1109527927, 1041502854) + + W(7, -1123998545, 1028180222, -1125487816, -1121770211); + WS(1065370528, -1140007425); + sum1 = W(0, -1119191691, -1089109360, 1051697742, 1048704645) + + W(1, -1123119348, -1093467562, 1051845168, -1120571445) + + W(2, 1043193134, -1104035088, 1049231373, 1047054964) + + W(3, -1144777506, -1082641845, 1058881533, -1128753754) + + W(4, 1048874737, -1090665335, 1060727795, -1122636375) + + W(5, -1114692372, -1085597050, 1053776045, -1135014444) + + W(6, 1047204584, -1097312497, 1050811579, 962936920) + W(7, 1028382351, -1084438004, 1054559607, 1047044271); + sum2 = W(0, 1072219394, -1078126224, -1093298188, 1011861728) + + W(1, 1068804680, -1079031251, -1110022070, 1040923692) + + W(2, 1068134846, -1078951161, -1084926454, -1105857084) + + W(3, 1066171639, -1087436811, -1107767815, -1121892273) + + W(4, -1095987744, 1039512383, 1055586357, 1026590003) + W(5, -1080918851, 1067164113, 1031793821, 1040751494) + + W(6, -1077110574, 1069504242, 1041030661, -1123439499) + + W(7, -1071545857, 1075315134, 1055897321, -1109554506); + WS(-1089696543, -1143233957); + sum1 = + W(0, -1115482013, -1129127938, 1041381507, -1122467892) + W(1, 1045323653, -1098483714, -1110243009, 1049605572) + + W(2, -1096516931, 1045383939, 1059582003, -1090424421) + + W(3, 1035013745, -1091150045, -1106321908, 1043667267) + + W(4, -1162367211, 1043411549, 1034020454, -1109629626) + W(5, 1054106403, -1086835476, 1026676964, 1048548650) + + W(6, -1107204469, 1048447553, 1034191370, -1105600748) + + W(7, 1036179510, -1103773800, -1159158363, 1035568493); + sum2 = W(0, -1134008573, 1032064725, -1117795542, -1113496357) + + W(1, -1125596513, -1121806942, 1035355315, 998755498) + W(2, 1011008945, 1045441656, 1024667789, -1119910472) + + W(3, 1051842604, 1065460002, -1089961367, 1041632626) + + W(4, -1125276577, -1114964420, -1081892598, 1035390555) + + W(5, -1118729604, -1130705389, 1026896379, 1032979221) + + W(6, -1111959837, -1121883022, 1020053498, -1129745921) + + W(7, -1117720498, 1034360078, 1023648883, -1115672512); + WS(1065278079, -1120402802); + sum1 = + W(0, 1031924074, 1052390115, -1097070063, -1116671142) + W(1, -1115548942, 1049303261, -1099757447, -1118597165) + + W(2, -1106896516, 1045251552, 1040981136, 1041336272) + W(3, -1112658654, 1060948388, -1081623390, 1043338841) + + W(4, -1103991244, 1062622505, -1085365853, -1145407604) + + W(5, -1121670257, 1054395391, -1096062708, 1032773481) + + W(6, -1115583119, 1045812503, -1101077740, -1123616408) + + W(7, 1031270934, 1048618059, -1099232531, -1127437558); + sum2 = + W(0, -1114021356, -1110767736, -1100377718, 1034493514) + W(1, 1032565152, -1122384971, 1041858293, 1019779384) + + W(2, 1056835748, -1085457975, -1085697040, 1016590225) + + W(3, -1085160508, 1068814369, 1060746614, -1097525969) + W(4, 1058685385, -1085213012, 1057245366, 1043875459) + + W(5, -1086618535, 1063574785, -1094120608, -1097974912) + + W(6, 1047242231, -1144776155, -1093482365, 1054776673) + + W(7, 1032715041, -1097434793, 1056356490, -1096653037); + WS(1055688959, -1109584743); + + return clamp(mstd0 + 5.0 * vsum / wsum * mstd1, 0.0, 1.0); +} + +shared float inp[429]; + +#define CURRENT_PASS 1 + +#define GET_SAMPLE(x) dot(x.rgb, rgb2y) +#define imageStore(out_image, pos, val) imageStoreOverride(pos, val.x) +void imageStoreOverride(uint2 pos, float value) { temp[pos] = (value); } + +#define INPUT_tex(pos) GET_SAMPLE(vec4(texture(INPUT, pos))) +static const float2 INPUT_size = float2(GetInputSize()); +static const float2 INPUT_pt = float2(GetInputPt()); + +#define HOOKED_tex(pos) INPUT_tex(pos) +#define HOOKED_size INPUT_size +#define HOOKED_pt INPUT_pt + +void Pass1(uint2 blockStart, uint3 threadId) { + ivec2 group_base = ivec2(gl_WorkGroupID) * ivec2(gl_WorkGroupSize); + int local_pos = int(gl_LocalInvocationID.x) * 11 + int(gl_LocalInvocationID.y); + for (int id = int(gl_LocalInvocationIndex); id < 429; id += int(gl_WorkGroupSize.x * gl_WorkGroupSize.y)) { + uint x = (uint)id / 11, y = (uint)id % 11; + inp[id] = + HOOKED_tex(HOOKED_pt * vec2(float(group_base.x + x - (3)) + 0.5, float(group_base.y + y - (1)) + 0.5)).x; + } + barrier(); + vec4 ret = vec4(0.0, 0.0, 0.0, 0.0); + vec4 ret0 = vec4(0.0, 0.0, 0.0, 0.0); + vec4 samples[8]; + samples[0][0] = inp[local_pos + 0]; + samples[0][1] = inp[local_pos + 1]; + samples[0][2] = inp[local_pos + 2]; + samples[0][3] = inp[local_pos + 3]; + samples[1][0] = inp[local_pos + 11]; + samples[1][1] = inp[local_pos + 12]; + samples[1][2] = inp[local_pos + 13]; + samples[1][3] = inp[local_pos + 14]; + samples[2][0] = inp[local_pos + 22]; + samples[2][1] = inp[local_pos + 23]; + samples[2][2] = inp[local_pos + 24]; + samples[2][3] = inp[local_pos + 25]; + samples[3][0] = inp[local_pos + 33]; + samples[3][1] = inp[local_pos + 34]; + samples[3][2] = inp[local_pos + 35]; + samples[3][3] = inp[local_pos + 36]; + samples[4][0] = inp[local_pos + 44]; + samples[4][1] = inp[local_pos + 45]; + samples[4][2] = inp[local_pos + 46]; + samples[4][3] = inp[local_pos + 47]; + samples[5][0] = inp[local_pos + 55]; + samples[5][1] = inp[local_pos + 56]; + samples[5][2] = inp[local_pos + 57]; + samples[5][3] = inp[local_pos + 58]; + samples[6][0] = inp[local_pos + 66]; + samples[6][1] = inp[local_pos + 67]; + samples[6][2] = inp[local_pos + 68]; + samples[6][3] = inp[local_pos + 69]; + samples[7][0] = inp[local_pos + 77]; + samples[7][1] = inp[local_pos + 78]; + samples[7][2] = inp[local_pos + 79]; + samples[7][3] = inp[local_pos + 80]; + ret[0] = nnedi3(samples); + ret0[0] = inp[local_pos + 34]; +#if CURRENT_PASS == LAST_PASS + uint2 destPos = blockStart + threadId.xy * 2; + uint2 outputSize = GetOutputSize(); + if (destPos.x >= outputSize.x || destPos.y >= outputSize.y) { + return; + } +#endif + imageStore(out_image, ivec2(gl_GlobalInvocationID) * ivec2(1, 2), ret0); + imageStore(out_image, ivec2(gl_GlobalInvocationID) * ivec2(1, 2) + ivec2(0, 1), ret); +} +//!PASS 2 +//!DESC NNEDI3 (double_x, nns256, win8x4) +//!IN INPUT, temp +//!OUT OUTPUT +//!BLOCK_SIZE 64, 8 +//!NUM_THREADS 32, 8 +#pragma optionNV(inline none) +float nnedi3(vec4 samples[8]) { + float sum = 0.0, sumsq = 0.0; + [unroll] for (int i = 0; i < 8; i++) { + sum += dot(samples[i], vec4(1.0, 1.0, 1.0, 1.0)); + sumsq += dot(samples[i], samples[i]); + } + float mstd0 = sum / 32.0; + float mstd1 = sumsq / 32.0 - mstd0 * mstd0; + float mstd2 = mix(0.0, inversesqrt(mstd1), mstd1 >= 1.192092896e-7); + mstd1 *= mstd2; + float vsum = 0.0, wsum = 0.0, sum1, sum2; +#define T(x) intBitsToFloat(x) +#define W(i, w0, w1, w2, w3) dot(samples[i], vec4(T(w0), T(w1), T(w2), T(w3))) +#define WS(w0, w1) \ + sum1 = exp(sum1 * mstd2 + T(w0)); \ + sum2 = sum2 * mstd2 + T(w1); \ + wsum += sum1; \ + vsum += sum1 * (sum2 / (1.0 + abs(sum2))); + sum1 = W(0, 1024871952, 1026430476, 1041094851, 992987016) + W(1, 1034372511, 1007997243, 1038248733, 1009484684) + + W(2, -1091961907, -1103990249, -1086639391, -1085365048) + + W(3, -1087585419, -1093414958, -1100793414, -1099588502) + + W(4, 1049937838, 1052012307, 1057524239, 1063527595) + W(5, 1061081007, 1057188600, -1104832955, -1114088341) + + W(6, 1023328805, 994719130, -1110763811, -1102193240) + + W(7, 1046466539, -1131716095, 1042167685, 1037858632); + sum2 = W(0, -1122170202, -1117362461, -1125932452, -1100385246) + + W(1, 1020071642, 1025043913, 1017078274, 1018043750) + W(2, -1115075619, 1050294809, 1041506545, -1100233118) + + W(3, -1100362988, 1047005177, 1012082941, -1112302377) + + W(4, -1113824159, 1022334174, -1098709995, -1104291570) + + W(5, 1072797337, 1053652830, -1100425628, -1155649364) + W(6, 1016746290, 1016781702, 1031697879, 1033455014) + + W(7, 1050444141, -1106922881, -1081909907, -1086585813); + WS(-1096195455, 1061976972); + sum1 = W(0, -1107583849, 1045016510, -1102048399, 1050507709) + + W(1, -1138600128, 1004076226, 1049677870, -1106918697) + + W(2, -1094469481, -1104061589, -1082981042, -1086991635) + + W(3, -1087760032, -1088999402, -1111975782, -1089081125) + + W(4, 1057261454, 1051975353, 1058403546, 1061386858) + W(5, 1052980216, 1052828202, 1055128500, 1048525839) + + W(6, 1032308806, 1046697387, -1093320254, 1051876218) + + W(7, -1106246183, -1112945129, 1045880594, -1116677906); + sum2 = W(0, 976892690, 1043646796, -1131052969, 1047930742) + + W(1, -1099144563, 1035354913, -1115191227, -1111106463) + + W(2, -1095110912, -1114450783, 1052886335, -1113296119) + + W(3, -1088067101, 1040578653, -1102673565, 1051335047) + + W(4, -1080663089, -1074060607, -1068434194, 1048011859) + + W(5, 1042920440, 1058047003, 1057110709, 1038060178) + W(6, 1075827337, 1075290035, 1070007941, 1046007784) + + W(7, -1090506241, -1099371585, -1096675048, -1096378099); + WS(-1095930303, -1128843438); + sum1 = W(0, -1113225514, 1030842449, -1120882464, -1111398934) + + W(1, -1098488134, -1098728413, -1111237296, -1104159890) + + W(2, 1000563038, -1103461662, -1098779087, -1156245815) + + W(3, 1057689814, 1058114717, 1041725787, 1046074787) + W(4, 1038763268, 1052682210, 1055587560, 1046999855) + + W(5, -1090605975, -1106232348, -1106563184, -1119168797) + + W(6, -1104281110, -1105449143, -1106219642, -1105879965) + + W(7, 1039743648, 1030902068, -1111582036, 1033984854); + sum2 = + W(0, -1109947141, -1087141194, 1007133897, -1099413759) + W(1, 1026690396, 1045509921, -1117657274, 1051942463) + + W(2, -1078961084, -1081851502, 1057831088, 1067440534) + W(3, -1095618356, 1022398658, 1029712906, 1049871690) + + W(4, 1053833634, -1102894339, 1046573470, 1058568743) + + W(5, 1058025266, -1115002147, -1109832065, -1099467737) + + W(6, 1049299145, 1040634467, 1035108031, -1114324751) + W(7, -1094447449, 1023241606, 987652806, -1104714655); + WS(1018627052, -1077328537); + sum1 = W(0, -1107592280, 1011043872, -1138466445, 1041422472) + + W(1, -1112294435, 1012707679, -1150731309, -1118891707) + + W(2, -1098360952, -1103889731, -1088654431, -1079526160) + + W(3, -1109020730, -1095389295, -1102056896, -1101414784) + + W(4, 1054425801, 1045838144, 1063939041, 1057394281) + W(5, 1061143403, 1057286118, 1040465365, 1042544156) + + W(6, -1121256842, 1016847523, -1114759963, -1109966789) + + W(7, -1115564074, -1117689671, -1133534770, 1028492087); + sum2 = W(0, -1161717665, -1138679732, -1121504639, 1050854432) + + W(1, -1106511096, 1030373815, 980628162, 1031200951) + W(2, 1033867626, -1115218580, 1030621655, -1096361601) + + W(3, 1044499063, -1104067382, 1040061476, -1122098343) + + W(4, 1028201267, -1096378423, 1071708903, 1079482342) + + W(5, -1064184100, -1089118805, 1048273255, -1109436715) + + W(6, -1124228530, 1029766795, -1128256742, 1035298280) + + W(7, 1035336882, -1105361644, -1119150405, 1035049634); + WS(1045693694, 1057374369); + sum1 = W(0, 1048369598, -1104752283, 1031950009, -1123958928) + + W(1, -1103831441, -1106189273, -1103850789, -1110300085) + + W(2, 1034312519, 1045853799, 1057046586, 1065585622) + W(3, 1061666460, 1060939321, 1050689810, 1060417841) + + W(4, -1131023893, -1098373234, -1095062180, -1089164628) + + W(5, -1092432965, -1087345809, -1092965100, -1091010256) + + W(6, -1099588978, 1019902402, -1105510198, 1033283356) + + W(7, -1115031649, -1122647270, -1126666680, -1103574093); + sum2 = + W(0, -1087427905, 1058683530, -1081734921, 1050776004) + W(1, 1042479954, 1025544982, -1105492903, 1058740427) + + W(2, -1098709872, -1099141199, 1032637312, 1072181481) + + W(3, 1036599206, -1080357543, -1113642582, -1086527647) + + W(4, 1072153031, -1088885778, 1061509476, 1071890032) + W(5, 1052304550, -1080881103, 1050862866, -1078556244) + + W(6, -1089481634, 1056590706, -1092495010, 1048814690) + + W(7, -1095810808, -1097308566, -1094462248, 1039671439); + WS(-1081549664, 1060153996); + sum1 = W(0, 992286043, -1115318586, -1105782456, 1026471870) + + W(1, -1114468402, 1037910210, -1130210466, 1043803882) + W(2, 1063391104, 1055271797, 1062019397, 1061503832) + + W(3, 1058772501, 1045594046, 1049908468, 1040755007) + + W(4, -1087586274, -1095899708, -1085498120, -1089250259) + + W(5, -1090055577, -1102496824, -1103786988, -1104619012) + + W(6, -1105647870, 1025423024, 1033921889, -1113405924) + + W(7, -1113674825, -1106446561, -1118412923, -1096097592); + sum2 = W(0, 1053790549, -1110257416, 1033688102, -1102619530) + + W(1, -1117483359, -1098152061, -1105743952, -1083553679) + + W(2, -1080860351, -1097530578, 1041061421, 1064966059) + W(3, 1050344847, 1040479494, 1051151965, 1065962098) + + W(4, -1068185653, -1077346152, 1052310674, 1072556372) + + W(5, 1075004369, 1064749402, -1110156824, 1045213317) + + W(6, -1082483044, -1088866791, 1052658871, -1104178634) + + W(7, -1108410079, 1040931499, -1137891932, 1053124980); + WS(-1079020096, -1097079011); + sum1 = W(0, -1109501731, 1033910555, 1015347636, -1108027795) + + W(1, 1042979875, 1019929124, 1040369234, -1134559750) + + W(2, -1096742621, -1092191510, -1089091160, -1087072713) + + W(3, -1087558450, -1089417126, -1104831498, -1091818621) + + W(4, 1057943754, 1055662529, 1059647341, 1068092504) + W(5, 1059824411, -1117499817, 1043480574, 1050143023) + + W(6, 1016000225, 1020967408, -1102027816, -1109882648) + + W(7, -1106889398, -1117366414, -1104827345, 1049289276); + sum2 = W(0, 1037631964, -1105851814, 1036652885, -1110757790) + + W(1, 1024508007, -1139201564, -1113225064, -1104657620) + + W(2, -1097479797, 1051380185, 1028410699, 1044594400) + W(3, 1041068006, 1046036650, 1054960427, -1105334641) + + W(4, 1051023588, -1097950410, 1034374804, 1053237761) + + W(5, -1132209182, -1088293598, -1081781977, 1065714224) + + W(6, 1045348435, 1028003104, -1113269608, 1041832368) + + W(7, 1033918380, -1089693526, -1099925151, -1106359824); + WS(-1087384991, 1052875812); + sum1 = W(0, 1041733252, -1138647561, 1034391503, -1106477875) + + W(1, -1100509868, -1098694249, -1110959830, -1120730421) + + W(2, -1109905397, -1104994285, -1107522048, 1057597757) + + W(3, 1062613266, 1055828187, 1052485297, 1044647290) + W(4, 1041497057, 1032882549, 1050093354, -1091247383) + + W(5, -1087942224, -1090201627, -1098203032, -1100016695) + + W(6, -1113613058, -1117825756, -1108789794, 1028766931) + + W(7, 1042722079, 1013355333, 1034047139, 1038812681); + sum2 = W(0, 1019350107, -1111428867, 1017374087, -1112005123) + W(1, 1028700445, -1112772903, 1027823157, 999439052) + + W(2, 1041831066, -1130655130, -1138336400, 1035402260) + + W(3, -1116945124, 1041636268, -1107238338, 1033528252) + + W(4, 1051650697, -1112274143, -1092155273, -1114034096) + + W(5, 1045953881, 1041190902, 1049171133, 1027833254) + + W(6, -1103332568, -1077765094, -1073481211, -1087514353) + + W(7, 1069095754, 1074086485, 1057277153, -1107727987); + WS(1050457727, 1041689780); + sum1 = W(0, -1131312139, -1116681402, 1030961105, -1140959985) + + W(1, 1046496193, 1048638526, 1007270019, 1049181764) + W(2, 992358355, 1014710691, 1040368912, -1105027369) + + W(3, -1089290871, -1090315138, -1098770776, -1086147588) + + W(4, -1092744895, 1027381214, -1089348299, 1050737138) + W(5, 1038810352, 1055368676, 1040416748, 1051301702) + + W(6, 1048008788, 1036450832, 1053966377, 933247243) + W(7, 1043432004, -1119062181, 1023583738, 1037141075); + sum2 = W(0, -1107193278, 1019433289, 1039188525, -1123892633) + + W(1, 1039851328, 1032631611, 1044641782, -1097026795) + W(2, 1057496780, 1031729137, 1037283932, -1086728254) + + W(3, -1087309268, -1092570464, 1035754242, 1063903066) + + W(4, 1072935738, -1080020989, -1078950448, -1087453268) + + W(5, 1051352061, 1059438018, 1051006721, 1056300653) + W(6, -1080570956, 1054527180, -1096917141, 1050123895) + + W(7, 1053948249, 1042769096, 1029707984, -1106545458); + WS(-1084263519, -1088250567); + sum1 = W(0, -1107101246, 1049480649, -1097447514, 1049647488) + + W(1, -1099235545, 1018612505, -1103944776, 1032447885) + + W(2, 1048954180, -1096698757, 1059331526, -1119095878) + W(3, 1040553109, 1041330418, 1040723088, 1023387386) + + W(4, -1118116730, 1027018719, -1108150329, -1090501921) + + W(5, 1044929028, -1094468036, 1047463532, -1106285556) + + W(6, -1111017296, 1043604572, -1098833704, 1050343697) + + W(7, -1096264890, 1044030041, -1121471547, -1175819022); + sum2 = W(0, 991719940, 1034086314, 1055828179, 1034571486) + W(1, 1049088345, -1098363481, -1111430799, -1111365517) + + W(2, -1157381748, -1121095386, -1103829652, -1100672658) + + W(3, -1090417467, 1050795943, -1113801830, 1037803588) + + W(4, -1100952734, 1027786887, -1085350121, -1118546758) + + W(5, 1049271738, -1140682323, 1035813474, -1164121191) + + W(6, 1029794653, 1016292894, 1067178121, -1098007098) + + W(7, 1008607005, -1110134488, -1115483467, -1133015817); + WS(1066054400, -1125664425); + sum1 = W(0, 1015260777, -1108545200, 1023624464, -1109354663) + + W(1, 1023465234, -1108921531, -1116445024, -1128865616) + + W(2, 1054574294, 1053284635, 1059735702, 1058150961) + W(3, 1058102002, 1063397581, 1046571067, 1046728251) + + W(4, -1095241461, -1094415406, -1088764634, -1078845388) + + W(5, -1090401103, -1105651068, -1116790272, -1104354311) + + W(6, -1127045294, -1111343263, 1041542629, -1130514988) + + W(7, 1035892576, -1136829776, 1030749305, -1106930027); + sum2 = + W(0, 1041565398, -1103469615, 1029690269, 1035794320) + W(1, 1035452008, -1107146771, -1124704946, 1040850628) + + W(2, -1104697837, 1029373537, 1057447179, 1080145714) + + W(3, -1103623095, -1066097425, -1097535851, -1103109309) + + W(4, -1115419200, 1031260861, 1026403525, 1043319440) + W(5, 1050811672, -1103531154, -1090176537, 1055196268) + + W(6, -1158883614, 1035036640, 1034486240, 1041655252) + + W(7, -1114789346, -1114794272, 1036709484, -1102936938); + WS(-1087901375, 1071177135); + sum1 = W(0, -1121594272, -1122618691, -1114434254, 1044010486) + + W(1, -1113833999, -1108159437, 997526195, -1123472883) + + W(2, -1110224028, -1109965218, -1120206908, 1010935165) + + W(3, -1108541318, 1041417229, -1109330685, 1039497451) + + W(4, 1030219348, 1047787782, -1114914192, -1113546820) + W(5, 1046030645, 1035224125, 1017890711, 1022061139) + + W(6, 994425384, 1027034090, -1106192913, 1040356168) + + W(7, -1112701798, -1130438655, -1151173965, -1125745551); + sum2 = W(0, 1042217679, -1108814485, 1058334461, -1080767453) + + W(1, 1050991857, 1030602271, 1034906705, -1127683613) + + W(2, -1116367239, 1042859710, -1078638996, 1073929687) + + W(3, -1092080339, -1116721722, -1106162437, 1035114111) + + W(4, 1026421701, 1027395369, 1028343990, -1097310248) + W(5, 1042808122, 1051491707, 1024141024, -1112071525) + + W(6, -1140328609, -1114630403, -1105295199, 1028261520) + + W(7, -1122297114, -1105219597, 997359482, 1017171678); + WS(1066545696, -1154623394); + sum1 = W(0, -1105442505, -1115505461, -1102287846, 1023914903) + + W(1, 1021900696, 1016559928, -1142506442, -1129232035) + + W(2, -1114054203, -1098488296, -1092352928, -1089108436) + + W(3, -1087887754, -1096061654, -1097827287, -1095543703) + + W(4, 1057182265, 1049322687, 1062190966, 1059635472) + W(5, 1057132007, 1043675118, 1048482034, 1055016957) + + W(6, -1123432545, 1010507424, -1097309632, 1045294808) + + W(7, -1098559779, 1042399967, -1110816589, 1026256390); + sum2 = + W(0, -1094410020, -1073520568, -1076806727, 1007932024) + W(1, -1129053184, -1126774165, 1016297320, 1026440100) + + W(2, 1040526244, -1119660436, 1072065972, 1074284701) + W(3, 1045336233, -1114285571, 1027498382, -1109537500) + + W(4, 1038890507, -1105577163, 1038803075, -1096715819) + + W(5, 1048625414, -1106066396, 1035667090, -1128514892) + + W(6, -1120085021, 1014274624, -1119386280, 1032586275) + + W(7, -1148623280, 1033069015, -1113847206, 1028560484); + WS(1055250687, -1106970626); + sum1 = W(0, 1033119688, -1105149829, 1043588463, -1098690473) + + W(1, 1051357302, -1111820283, 1036109552, -1119401059) + W(2, 1042190962, 1055784922, 1039447718, 1060328969) + + W(3, -1105877415, 1050469874, -1123255849, 1044861546) + + W(4, -1096546392, -1103230410, -1093610964, -1094495495) + + W(5, -1104321127, -1102978667, 1034127854, -1097968467) + + W(6, -1117586055, -1125652468, 1035816565, -1103963220) + + W(7, 1047255951, -1108600424, -1157028943, 1018776031); + sum2 = W(0, 1038757267, -1111076574, 1036628998, -1107631850) + + W(1, 1045867530, -1126199158, 1034641438, 1014361489) + + W(2, 1030211853, -1147844455, 1002666567, -1080902130) + + W(3, -1089131777, 1067727291, 1050167793, -1114432338) + + W(4, 1033894636, 1039985174, -1092985165, -1084645521) + + W(5, 1069738325, -1096580382, -1100096489, -1100261485) + + W(6, -1133782171, -1117005539, -1150866734, 1049641986) + + W(7, 1051354211, -1100550183, -1104598763, 1033251244); + WS(1063662431, 1022143153); + sum1 = + W(0, -1101665898, 1044567949, -1113912242, 1054985008) + W(1, -1089448239, 1031890901, -1106608329, 1016341751) + + W(2, 1028101088, -1100200043, -1110575390, -1090770105) + W(3, 1042239925, 1034205190, 1041117720, 1032506575) + + W(4, 1045825111, -1112112432, 1011332621, 1036354680) + W(5, 1053092900, 1020582213, -1122250931, 1037368233) + + W(6, -1107336877, 1049135824, -1117269540, 1043762234) + + W(7, -1090665684, 1045380738, -1108114694, 1027635960); + sum2 = W(0, -1109621945, 1044140338, 1011973298, 1054192939) + W(1, -1083519810, 1050669158, 1015542539, 1007706050) + + W(2, 995625223, -1125871763, 1059194369, -1085775903) + + W(3, -1085690186, 1055305067, -1115586758, 1024423563) + + W(4, 1033690799, -1131300267, 1019603073, -1105557074) + + W(5, 1066625604, -1093331249, 1025625789, -1163078190) + + W(6, -1127273987, 1031533647, -1100093028, 1049649037) + + W(7, -1099380904, 1041330252, -1109873113, 1021669909); + WS(1065395904, 1046290614); + sum1 = W(0, 996799560, 1015596034, -1100668872, -1100927819) + W(1, 1043886221, 1025322396, 1035443240, -1114934548) + + W(2, -1125542553, 1043656950, 1056396433, 1054862894) + + W(3, -1088911438, -1099487682, -1105531411, -1117673547) + + W(4, 1038203972, -1105153011, -1085640859, -1101762943) + + W(5, 1057024083, 1036429768, 1021072448, 1035195023) + W(6, -1122586727, 1036793959, 1049715632, 1035554923) + + W(7, -1115152096, -1122121748, 1039652277, 1024299964); + sum2 = + W(0, 1029237671, -1133651707, -1114304490, -1114162505) + W(1, -1125875827, -1112015576, 1015895733, 1035088799) + + W(2, 1017509749, -1140172751, 1030543605, -1092617066) + W(3, 1051105475, 1033357967, 1011455075, -1105982664) + + W(4, -1104176053, 1038596873, 1050264307, -1093179067) + + W(5, 1071302855, -1090684841, -1100815852, 1003487558) + W(6, 1032328729, 1037378915, -1104642832, 1049979232) + + W(7, -1110244360, -1085540383, -1135016203, 1015899853); + WS(1058730335, 1038095077); + sum1 = W(0, 1050009523, -1156396202, 1045232946, -1123440788) + W(1, 994853272, 1029074928, -1116532263, 1016043038) + + W(2, -1090412329, 1022785342, 990514519, 1051849503) + W(3, 1050259497, 1048747736, 1040337077, 1047238893) + + W(4, -1116071407, -1112028282, 1027669243, 1025171300) + + W(5, -1091444451, -1091116387, -1095024325, -1085293672) + + W(6, -1120619710, 1033123659, -1138222105, 1042856679) + + W(7, 1043400402, 1046148791, 1031722640, 1050565349); + sum2 = + W(0, 1046272294, -1119023958, -1106071503, -1097641458) + + W(1, -1099339001, -1122591395, -1120322169, -1112624405) + + W(2, 1056160584, 1047372879, 1066704996, 1062851774) + W(3, -1127558738, -1095719050, 1012197993, -1094334166) + + W(4, -1069609928, -1100807597, 1063602974, 1071319304) + W(5, -1123458905, 1049925865, 1037702687, 1046841945) + + W(6, -1086350256, 1012350161, -1093103672, -1165704932) + + W(7, -1099266547, 1039176837, -1104052164, 1043315186); + WS(-1102208382, 1082454872); + sum1 = W(0, -1121527792, 1019782131, -1111677734, 1042764822) + + W(1, -1098291428, -1109244559, -1122839755, 1023050790) + + W(2, -1097489215, -1109352802, -1089475261, -1094323164) + + W(3, 1057233791, 1055571354, 1036609181, 1023873367) + W(4, 1044710709, 1043005718, 1059136208, -1113184692) + + W(5, -1102862820, -1113821821, 1016630678, -1122283881) + + W(6, 1024559218, 1025756170, -1098383546, 1034230961) + + W(7, -1121795355, 1034138424, -1148370726, 1021065311); + sum2 = W(0, 1012975921, 1033684352, -1119837718, 1048900749) + + W(1, -1088385914, -1106132930, -1107812043, 1047279942) + + W(2, -1113722375, -1113902527, 1034379158, 1065557700) + + W(3, 1033601684, -1078602486, 1048231286, -1117907500) + + W(4, -1109752074, -1108511603, 1047596894, 1065261424) + + W(5, -1110433219, -1113936114, -1106600777, -1110420048) + + W(6, 1009270385, 1034062718, -1096952633, 1042274647) + + W(7, -1110816087, 1038223706, 1037668398, -1111923151); + WS(1055139903, 1066543323); + sum1 = W(0, -1113216706, 1034160554, -1110997976, -1104052311) + + W(1, -1130057219, -1100344024, -1109060119, -1102181302) + + W(2, 1025777755, -1106690282, 1025857819, -1108040417) + W(3, 1042814916, 1058801014, 1040801319, 1061190298) + + W(4, 1062476912, 1047449287, 1040533578, -1088276389) + + W(5, 1043316038, -1096553156, 1003175286, -1109923206) + + W(6, -1094834883, -1115394087, -1100641176, -1109281747) + + W(7, -1111790927, -1131081926, -1127882001, -1116502963); + sum2 = W(0, 1032900543, 1026043047, 1011969739, 1005946567) + + W(1, -1104378201, -1106573410, -1149079854, -1098913457) + + W(2, -1093611286, -1143136704, -1129502699, 1065137024) + + W(3, 1034934846, 1044311979, -1128312106, -1107526541) + + W(4, -1093105706, -1104881087, 1056641171, 1062580590) + + W(5, -1137732946, -1102271464, -1106196955, -1097055308) + + W(6, -1103368978, 996537094, -1097512177, 1038772124) + + W(7, -1108835309, 1035638256, 1028654910, -1144299515); + WS(1037662203, -1095462961); + sum1 = W(0, 1051208476, 1007151360, 1047867778, -1120692693) + W(1, -1102286423, 1029685138, -1117174983, 998066935) + + W(2, 1054332722, 1048962332, 1056131053, 1060311124) + W(3, 1053179033, 1057524976, 1045179237, 1053688986) + + W(4, -1088537607, -1096098779, -1089718811, -1086623130) + + W(5, -1088149909, -1093380227, -1094989189, -1094538289) + + W(6, 1009988859, -1120684294, 1043868050, 1008468855) + + W(7, 1024446024, 1041242535, -1121112609, 1022948968); + sum2 = W(0, -1075642964, -1078284587, -1077677369, -1086975712) + + W(1, 1050575143, -1109971278, 1043550667, 1046375822) + W(2, 1064397427, 1070403917, 1072178178, 1071930150) + + W(3, -1093947328, -1119680819, -1134729809, -1094009133) + + W(4, 1042055631, 1050515956, -1094922849, -1096417404) + + W(5, -1094640520, 1045435393, -1109099138, -1106076462) + + W(6, 1049259770, -1100572061, 1038272909, -1110188613) + + W(7, 1033007627, -1109186235, 1040318497, 1038207101); + WS(-1091974591, 1028524890); + sum1 = W(0, -1119527298, 1034997099, -1099802012, 1033463662) + + W(1, -1090658116, 1044419888, -1099353751, -1110855131) + + W(2, 1050666155, -1101120961, 1057798952, -1146674958) + W(3, 1048486316, 1054164791, 1033437822, 1053708795) + + W(4, -1104886813, -1100807815, -1099838668, 1021707158) + + W(5, 1057612011, -1093871840, 1029138830, -1104286795) + + W(6, -1119869997, 1044100139, -1103774309, -1112176434) + + W(7, -1094617942, 1036492177, -1113521820, 1028051362); + sum2 = + W(0, 1029285075, -1113245689, 1046869988, -1099734421) + W(1, 1045806866, -1099048447, 1040440310, -1129472848) + + W(2, -1114745613, 1037297246, -1113507597, 1057852752) + W(3, 1031538739, 1019950674, 1039903515, -1115367833) + + W(4, 1024121756, 1034295695, -1081105309, 1063764387) + W(5, -1093953622, 1060684479, -1099720743, 1051222485) + + W(6, -1127985632, -1103172653, -1097344586, -1092930743) + + W(7, 1039548141, -1113791115, 1024790472, -1106398082); + WS(1058893599, -1078409713); + sum1 = W(0, -1115244150, 1036724056, -1098555735, 1049246955) + + W(1, 1045222582, -1138283737, 1044966206, -1115412967) + + W(2, -1102829117, -1100240992, -1094663483, -1084866106) + + W(3, -1085064800, -1093243506, -1093950047, -1095580366) + + W(4, 1039336887, 1053376406, 1053054383, 1065100884) + W(5, 1054590883, 1056764679, 1053059489, 1050610273) + + W(6, -1115623287, -1114512019, 1041993169, 1018575674) + + W(7, -1114852275, -1108377677, -1118180448, -1122449691); + sum2 = + W(0, -1130929736, 1009552185, -1084383778, 1050909748) + W(1, 1049209322, -1096700837, 1051369678, -1129474226) + + W(2, -1101060123, -1090337753, 1072779570, 1053567468) + + W(3, -1079161361, 1057662166, -1097661058, -1112521942) + + W(4, 1045192083, 1061442923, 1050903982, -1089269841) + W(5, 1029505799, -1094014597, 1046387683, -1105984421) + + W(6, -1105822172, -1103557108, -1106762492, -1117595750) + + W(7, -1111371347, 1025228376, -1138825972, 1030887459); + WS(-1109369595, 1048740969); + sum1 = W(0, 1040995480, 1030414773, -1118646413, 1043594790) + W(1, -1129436350, 1037121811, 1030207412, 1043560049) + + W(2, 1051718495, 1050319297, 1059003715, 1046504696) + W(3, -1135436979, 1043825845, 1049475887, 1058279379) + + W(4, -1091711555, -1095167863, -1085356599, -1083562713) + + W(5, -1096690237, -1098326935, -1120665100, -1098718953) + + W(6, -1125552391, 1032958437, 1042985722, 1045509569) + + W(7, 1023899916, 1019546753, -1130219052, -1105013544); + sum2 = + W(0, -1113177829, 1043809265, -1095416462, 1034071291) + W(1, -1120341831, 1043900974, 1020015593, -1119209873) + + W(2, -1117552581, -1109343151, 1052574118, 1063553374) + + W(3, 1070912061, -1112203792, -1091338378, -1072794661) + + W(4, -1100446453, 1039662186, -1114145263, 1053677817) + + W(5, -1101063801, 1042882834, -1094258913, 1055602011) + W(6, 1041583669, 1009024316, -1118793923, 1018689733) + + W(7, 1031195477, -1105538343, -1114748986, -1109237633); + WS(-1093437503, 1065718162); + sum1 = W(0, 1037550096, -1101135841, 1044878747, -1107014286) + + W(1, 1042111087, 1037051057, -1099961615, 1041500301) + W(2, 1049488055, 1042594425, 1049041945, 1066142676) + + W(3, -1100146203, 1045825417, 1040663590, -1119554198) + + W(4, -1103061781, 1046266118, -1087470164, -1106438298) + + W(5, -1111606545, -1091131027, -1133427370, -1103590594) + + W(6, -1114711965, -1097873069, 1046063170, -1091362312) + + W(7, 1037494709, 1040258368, -1109172298, 1033770775); + sum2 = W(0, -1106488910, 1026201604, 1035711566, 1060425407) + + W(1, -1098764525, -1096618367, -1182808622, -1127820908) + + W(2, -1123106758, -1113590739, -1084666863, 1061776657) + + W(3, 1055047321, -1119175762, -1103500958, 1041613778) + + W(4, 1050172947, -1092748399, -1097703384, -1099741350) + + W(5, -1120322586, 1050324229, 1025620288, -1105222946) + + W(6, -1124712996, 1043391307, -1098783459, 1048423650) + + W(7, 1041036039, -1099280352, 1048645442, -1118590758); + WS(1056660607, -1113798601); + sum1 = + W(0, -1115305597, -1101671294, 1016801995, 1039904137) + W(1, 1037148876, 1040453028, -1110559226, -1154296528) + + W(2, 1041913228, 1008348404, 1031963795, -1093680051) + W(3, -1089471492, 1034024758, -1111400057, 1031051312) + + W(4, 1012656821, 998498191, -1102006873, 1057450908) + W(5, 1049874551, -1111681498, -1109457443, 1036430914) + + W(6, 1026504084, -1151777337, 1032505286, -1108358078) + + W(7, 1031920291, 1043455038, -1129849213, -1125050675); + sum2 = + W(0, 1042939003, -1114796094, 1044529628, -1124781020) + W(1, -1106748864, 1016881133, -1108227590, 1027959261) + + W(2, 1024638457, -1101207597, 1027593065, -1097759574) + W(3, -1130307786, 1033669310, 1022409637, 1019735589) + + W(4, -1123927190, 1042777565, -1098782283, 1059165645) + + W(5, 1062760553, 1017094385, -1160993898, -1125388747) + W(6, 998901155, 1022659417, 1017512357, -1104939928) + + W(7, -1098668376, -1089791762, -1106217568, -1115680109); + WS(1066155712, 1004288134); + sum1 = W(0, 1047132567, 1029697589, 1014062303, 1041631965) + W(1, 991515041, -1123217244, -1154741365, 1030265807) + + W(2, 1049267618, 1048612844, 1055750611, 1059093756) + W(3, 1057479944, 1056993158, 1047138005, 1055767146) + + W(4, -1089062279, -1092380195, -1088453014, -1084647474) + + W(5, -1091963789, -1088742789, -1098495965, -1086886676) + + W(6, -1138510971, 1046969501, 1024451359, 1049129552) + + W(7, 1040560290, 1043007167, -1122630737, -1122583780); + sum2 = + W(0, 1011892235, -1111382628, 1037768402, 1032283234) + W(1, -1114728106, 1009460031, -1112526532, 1030203700) + + W(2, 1040858440, -1103755803, -1125277089, -1084511950) + + W(3, -1090323786, -1159433014, 1053584755, 1052886875) + + W(4, -1127819845, -1109875610, -1096621612, -1071556311) + + W(5, -1071973667, -1099343032, 1076043190, 1079690007) + W(6, 1010964983, -1106716388, 1032593498, 1040462902) + + W(7, -1100404332, 1040394500, 1007208771, 1051792925); + WS(-1086041375, 1049976369); + sum1 = W(0, -1125608345, 1025261033, 1032012444, 1046732297) + + W(1, -1114869141, 1036081274, 1036645660, -1119140736) + + W(2, -1096855193, -1097190986, -1086237883, -1083643033) + + W(3, -1093631755, -1095059844, -1132519191, -1095180224) + + W(4, 1037693680, 1051176741, 1059434222, 1062665585) + W(5, 1052924527, 1052562329, 1041010310, 1048775023) + + W(6, 1048607039, 1030637974, 1026121224, -1103554484) + + W(7, -1110078044, -1109004102, 1035782593, -1118200972); + sum2 = W(0, 1029601330, -1144560396, 1032763954, -1115106220) + + W(1, -1111454114, -1121335223, -1109520646, 1021645795) + + W(2, -1115199196, 1026958814, 1032369083, -1106065675) + W(3, 1042189754, 1029124674, 1022674491, 1026253022) + + W(4, -1096390757, -1100298556, 1076866217, -1108884178) + + W(5, -1116766618, 1025985538, -1115268590, 1011072742) + + W(6, -1079547524, -1081990625, 1041174181, 1041059708) + + W(7, 1024602232, -1127158528, 1007020790, 1003377428); + WS(-1111980027, 1060626277); + sum1 = W(0, 1023621139, 1032179266, 1030954414, 1037158526) + W(1, 1036765152, 1036680203, -1146606447, -1119312598) + + W(2, -1102882983, -1092055397, -1089823274, -1095093232) + + W(3, -1090725010, -1139402199, -1116432156, -1108873773) + + W(4, 1044706422, 1043529367, 1057090380, 1064981515) + W(5, 1047303429, 1042557255, 1028925358, 1041638915) + + W(6, 1028429765, -1113080214, -1101761443, -1098683411) + + W(7, 1033439719, 1030304674, -1104492078, -1112219839); + sum2 = + W(0, -1107703976, 1046455264, -1093472442, 1048924762) + W(1, -1097201227, 1049435664, -1106239872, -1119402461) + + W(2, 1045439570, -1090239140, 1028879562, 1064195571) + W(3, 1016778259, 1027385222, 1028121257, -1105208479) + + W(4, 1032849260, -1096329612, 1030082819, 1036056807) + W(5, 1059898488, -1091675747, 1053658286, -1117889585) + + W(6, -1122224669, 1035962913, -1098806672, 1041148911) + + W(7, -1091828205, 1041687668, -1098243254, -1104565052); + WS(1062681599, 1040842201); + sum1 = + W(0, -1108789463, -1115361429, 1048981817, -1092926921) + W(1, 1054602509, 1029602904, -1117967305, 1025443329) + + W(2, -1104300209, 1050445194, -1089127203, 1063952639) + + W(3, 1043197406, -1106041808, 1039191171, -1114238594) + W(4, 1042117608, -1097788769, 1032428200, 1049970971) + + W(5, -1088418847, 1049956321, -1112931212, -1123051255) + + W(6, -1118282400, -1114475276, 1049574381, -1090427073) + + W(7, 1045778638, -1112080775, -1097758566, 1033393295); + sum2 = W(0, 1038735267, -1100048068, -1115453090, -1110884051) + + W(1, -1090743949, -1153955669, -1112598570, -1103797208) + + W(2, -1126315713, 1043050536, 1053683464, 1058830244) + + W(3, -1100540415, 1037942519, -1098889179, 1040830228) + + W(4, -1111714958, -1115313021, 1046662525, 1061563017) + + W(5, 1052621807, -1104363663, -1118760183, 1007755797) + + W(6, -1111656758, -1115683900, -1093358619, -1105966973) + + W(7, 1037413595, -1101879362, 1044482581, -1098877089); + WS(1062776447, 1069975051); + sum1 = W(0, -1130308944, -1112835078, -1113144126, -1094805377) + + W(1, -1098008538, -1114270939, -1117364667, -1117827459) + + W(2, 1036893844, -1114635034, 1050058840, 1071110128) + W(3, 1061455014, 1044746969, 1018226642, 1049407081) + + W(4, -1104137265, -1098478453, -1104852259, 1041368142) + + W(5, -1095764665, -1109080309, -1103882015, -1120810969) + + W(6, -1108240801, 1029922778, -1111877761, -1088740684) + + W(7, -1112520550, -1119589855, -1121527653, -1103102129); + sum2 = + W(0, 1028834725, -1110297977, 1035091068, 1034973002) + W(1, -1110025415, -1154986018, -1120031976, 1030684381) + + W(2, -1113117380, 1026197871, -1099362318, 1077416661) + W(3, 1050456944, -1112814852, 1027999489, 1016280910) + + W(4, 1037052904, 996515330, 1043940575, -1069860026) + W(5, 969317772, 1021906202, -1115577362, 1013156184) + + W(6, -1113210551, 1032917698, -1106692355, -1103487680) + + W(7, 1034055293, 1006658352, 1018186436, -1124181989); + WS(-1082599007, -1084302409); + sum1 = W(0, -1127095446, 1011517278, -1110892475, 1024933540) + + W(1, -1111586789, 1039136849, -1108207315, 1049617952) + W(2, 1056665680, 1052281350, 1058821842, 1061132051) + + W(3, 1054434479, 1052720805, 1043783817, -1159632952) + + W(4, -1087212124, -1096260148, -1085877656, -1087957451) + + W(5, -1089270826, -1102718609, -1106422582, -1106709957) + + W(6, 1035858193, -1128228554, 1043137767, 1023709101) + + W(7, 1037286635, -1111842501, -1130056576, -1115207149); + sum2 = W(0, 1048459811, 1071226724, 1075494724, 1074401127) + + W(1, 1044864951, -1077687291, -1072311776, -1066953112) + + W(2, -1095160239, 1065850492, -1121381976, -1099027008) + + W(3, 1031151008, 1057399482, 1045213405, -1095971461) + W(4, 1026509768, 1043007163, 1043168485, -1093896652) + + W(5, 1012395574, 1019701051, -1109946848, 1027278540) + + W(6, -1123792544, -1127547903, 1027169380, -1107011198) + + W(7, 1037067951, 1021690579, -1124089088, -1166810856); + WS(-1118215158, -1130722305); + sum1 = W(0, 1039784439, -1119983743, 1027132090, -1101267710) + + W(1, -1106141431, -1119840977, -1131926580, -1158357571) + + W(2, 1045520358, 1040649785, -1126797149, 1070303194) + W(3, 1059129261, 1056727436, 1040938982, 1050582583) + + W(4, -1094865274, -1098235299, -1085881139, -1106608186) + + W(5, -1088850304, -1093134907, -1098615277, -1104503154) + + W(6, 966095017, -1166742058, 1023429181, -1127173569) + + W(7, -1112024885, 1030946302, -1160489077, -1106263629); + sum2 = + W(0, -1122933952, 1029904221, -1104768174, 1044174015) + W(1, -1122786276, 1032455763, -1118952582, -1120585334) + + W(2, 1043676402, -1092335308, 1050667883, -1106663265) + W(3, 1035773679, 1033986578, -1123822916, 1030027555) + + W(4, -1122578476, -1096734640, -1067932755, 1078656606) + + W(5, 1056344301, -1106732625, 1033374173, -1116084330) + + W(6, 1034421913, -1121365342, -1103315560, 1049347404) + + W(7, 1027752905, -1114333025, 1025409455, -1129253837); + WS(-1112296443, -1083191171); + sum1 = W(0, 1030599873, -1102688301, 1038739494, -1091052013) + + W(1, -1120252367, -1118018759, -1105737735, 1036799090) + + W(2, 1049894985, 1052276159, 1055519004, 1061107959) + W(3, 1059731464, 1052059899, 1050382861, 1050879021) + + W(4, -1100141489, -1095734081, 1044438853, -1078809864) + + W(5, -1100785926, -1095185489, -1092887220, -1113977245) + + W(6, -1124642344, -1114229790, 1039505712, -1108354137) + + W(7, 1037196526, -1129006466, 1034647259, -1123394945); + sum2 = W(0, -1134366274, 1040286055, -1103185345, -1089934078) + + W(1, -1104699884, -1135474394, 1039368980, 984214720) + W(2, 1032198029, -1093721101, 1064064153, 1038410574) + + W(3, 1053501328, 1053898256, -1088730122, 1045555557) + + W(4, -1102569648, 1059013351, -1076328416, 1075980540) + + W(5, -1081344728, -1093863519, 1061819985, -1089334779) + + W(6, -1113629492, -1099320981, 1062572765, -1079072621) + + W(7, 1057269325, 1039501040, -1089994189, 1050815727); + WS(1051639487, -1077445112); + sum1 = W(0, 1023584208, 1019039018, 1046978951, -1114024277) + W(1, 1042440780, 1036430651, 1019910405, 1017051223) + + W(2, -1087680633, -1097242582, -1087958558, -1084584703) + + W(3, -1089578188, -1090497932, -1100840226, -1089989738) + + W(4, 1058381481, 1049175941, 1059595066, 1058705186) + W(5, 1060807824, 1057261083, 1047705823, 1052092149) + + W(6, 1019116206, -1110819225, 1041321753, -1110784681) + + W(7, -1120949436, -1111841304, -1108976675, 1037750032); + sum2 = W(0, -1103483317, -1103949071, 1036613850, -1096200772) + + W(1, -1094761445, -1090478844, -1091384835, 1024429003) + + W(2, 1043027417, 1024633771, 1050158855, -1096718424) + W(3, 1057240079, 1037855330, 1036780676, -1103545669) + + W(4, 1043672886, -1105891820, -1113242263, 1053817256) + W(5, 1043447632, 1053166295, 1043680942, 1034776200) + + W(6, -1126025102, -1101612494, 1051748473, -1144187697) + + W(7, -1129269697, -1114569970, -1102484885, 1044262941); + WS(-1102141694, 1066754929); + sum1 = W(0, 1024767465, 1028037205, -1148374821, 996156698) + W(1, 1034886379, 1011245536, 1017269224, 1023537404) + + W(2, -1097150806, -1105574095, -1092607882, -1086231302) + + W(3, -1085570014, -1090150659, -1093685286, -1100403588) + + W(4, -1121670572, 1021251426, 1053426631, 1064662112) + W(5, 1060264850, 1058905527, 1047037217, 1048736520) + + W(6, 1047316983, -1123186307, 1027553675, 1037457517) + + W(7, -1103359865, 1031219256, -1108923303, 1039125668); + sum2 = W(0, -1127568330, 1031019669, 1013355589, -1123247753) + + W(1, -1131101666, -1126559289, -1128009624, -1122774763) + + W(2, 1005444026, -1121000217, -1135062981, -1099801823) + + W(3, 1044314830, 1052295626, -1112001042, 1018744598) + + W(4, -1099850392, 1052911126, 1040255711, -1120914990) + + W(5, 1055431083, -1112663055, 1029993103, -1105142519) + + W(6, -1069105992, -1075891845, 1052106082, 1078854269) + + W(7, 1061745892, -1097592921, 1033712114, 1037317546); + WS(-1092827839, 1049601702); + sum1 = W(0, -1102748075, 1048973336, -1101661842, 1035794226) + W(1, 1035295380, 951002293, 1028700102, 1019995195) + + W(2, -1114726817, -1100496851, 1056141590, -1092935501) + + W(3, -1090189951, -1127762491, -1107070641, -1116434785) + + W(4, 1043768535, 1037939345, -1092531310, 1048278549) + + W(5, 1059458263, -1107678146, 1040739973, -1103464157) + W(6, 1001409895, 1025584388, 1043222609, 1028885900) + + W(7, -1097823129, 1046084402, 1018269854, 1033486885); + sum2 = W(0, 1047648616, 1049954711, -1086499077, 1036131868) + + W(1, 1021844703, -1144052469, 1036766656, -1114852932) + + W(2, -1099866854, -1087014785, 1059941103, 1059724034) + + W(3, -1104253425, -1116739540, -1123734224, -1119117496) + + W(4, 1040911688, -1127547935, 1006897087, -1147690453) + + W(5, -1094365093, 1046092804, -1117733622, 1045874226) + + W(6, -1104812914, 1032774583, -1118719608, -1112213150) + + W(7, 1020986307, 1037506252, 1020773629, -1120467144); + WS(1062974879, -1132215613); + sum1 = W(0, -1181157822, 1033235448, -1120645311, 1032693326) + W(1, 1014937094, 1012846527, 1029466479, 1027727527) + + W(2, -1096960767, -1103300066, -1098273063, -1084817024) + + W(3, -1086871647, -1093312183, -1094276984, -1099477807) + + W(4, 1047884458, 1024586364, 1040665968, 1065496294) + W(5, 1061273423, 1057013666, 1048826162, 1049029078) + + W(6, 1046591191, 1028472621, 1027902609, -1105457745) + + W(7, -1099580452, -1121668195, -1123904424, 1033797162); + sum2 = + W(0, -1120861164, 1023555157, -1114715157, 1039733942) + W(1, -1111876903, -1121732899, 1028106223, -1136150442) + + W(2, -1114727130, -1127207629, 1049207316, -1100512081) + + W(3, 1044392032, -1113639142, -1107243417, 1035475508) + W(4, 1051943787, 1021361633, -1100379929, 1049204344) + + W(5, 1029680046, 1040523175, -1113800818, 1017564481) + W(6, 1073213517, 1067585393, -1095215585, -1072102567) + + W(7, -1085077901, 1017790060, -1115100698, -1111101803); + WS(1038961915, -1122010239); + sum1 = W(0, 1004620105, -1113106351, -1112775210, -1125534724) + + W(1, -1137271196, -1126589322, 1026657556, -1119328748) + + W(2, 1048595660, 1052250558, 1058549636, 1061573929) + W(3, 1057522353, 1048822826, 1040718305, 1048641524) + + W(4, -1099376311, -1096833644, -1088891129, -1086812373) + + W(5, -1093214133, -1095914356, -1105329661, -1103878453) + + W(6, -1116246236, 1027857155, 1036452944, 1040782707) + + W(7, 1018281129, -1113857108, 1010557432, -1106455448); + sum2 = + W(0, -1116580406, 1024927837, -1129828931, -1115420496) + + W(1, 1011185933, -1123989928, -1146345634, -1132229127) + + W(2, 1027562258, -1162615720, 1047581344, -1109513493) + W(3, 1038795182, -1118168090, 1030671240, 1038841827) + + W(4, 1055923683, -1098456431, -1107918233, -1093462217) + + W(5, 1043574176, 1042713369, -1118222006, 1029869485) + W(6, 1077914250, 1064911462, -1076359256, -1072190840) + + W(7, 1023726209, -1114062645, -1119388396, -1111766417); + WS(1058520191, -1103814144); + sum1 = W(0, 1017038583, 1027734728, 1045254802, -1107262661) + + W(1, -1105442246, 1031430877, -1126950445, 1024536063) + + W(2, -1136595532, 1016280509, -1109207324, 1062837304) + W(3, 1058887264, 1040464732, 1030731221, 1029953906) + + W(4, -1118053743, -1128563239, 1044218638, -1096672636) + + W(5, -1085861660, -1103880229, -1107144426, -1145128486) + + W(6, 1027978638, -1097122909, -1104843131, 1033499055) + + W(7, 1025985831, 1030848699, -1131329888, -1109411553); + sum2 = W(0, 1034702970, -1125598974, -1114553387, 1027536136) + + W(1, -1115924578, 1035052048, -1132148431, 1025333585) + + W(2, -1176551015, -1168898884, 1041527709, -1101298022) + + W(3, 1036785061, -1106074654, 1030578400, 1024211757) + W(4, 1007931783, -1090251816, 1067159008, 1043575777) + + W(5, 1028484706, -1104273626, -1148595850, -1114791455) + + W(6, -1110263367, -1089294892, -1085860022, 1061443693) + + W(7, -1099982080, 1042454777, 1027614804, -1123742626); + WS(1061983711, -1098811342); + sum1 = W(0, 1012577103, -1126897281, -1105225996, 1024253613) + + W(1, 1053413654, -1137207095, 1042674340, -1109172700) + W(2, 1051270689, 1046420622, 1058683087, 1058369439) + + W(3, -1097514912, 1052214131, -1105013139, 1050302029) + + W(4, -1108510228, -1106195699, -1088411008, -1089548804) + + W(5, -1118840551, -1096732498, -1109015536, -1103000311) + + W(6, -1107438075, -1107699151, 1036711743, 1026749110) + + W(7, -1116819519, 1024709491, -1140694819, -1154413112); + sum2 = W(0, 1018267361, -1110181012, -1146613180, 1038715850) + + W(1, 1024296823, 1036970119, 1022003098, -1124702635) + W(2, 1036503366, 1041828239, 1050199247, -1085432172) + + W(3, 1038941240, -1123003584, 1013422114, 1021003447) + + W(4, -1126101987, -1116783782, 1071387060, -1080125372) + + W(5, -1093021050, -1114155200, -1149124484, -1143100940) + + W(6, -1099489904, -1102883314, 1052019906, 1047113133) + + W(7, 1035497971, -1112911441, -1119585859, -1131838862); + WS(1061194367, -1092415693); + sum1 = W(0, 1036390333, -1126263470, 1025725222, 1043857157) + W(1, 1035642972, 1044002978, 998479342, 1045699251) + + W(2, 1051201914, 1053058480, 1054554894, 1047231542) + W(3, 1057662314, 1050872286, 1045022613, 1049392206) + + W(4, -1104881972, -1172862130, -1093268199, -1076465248) + + W(5, -1087389459, -1093150623, -1111846627, -1095910796) + + W(6, -1115149537, 1030237668, 1021350042, 1036659934) + W(7, 1039247491, 1026362746, 1017611295, 1018350484); + sum2 = W(0, -1129487679, 1042193002, -1108339354, -1095819059) + + W(1, 1041127864, -1103499785, 1034257999, -1118637794) + + W(2, 1018376667, -1087595144, 1054016721, 1063707892) + + W(3, 1036978867, -1103064253, -1103241982, -1112191100) + + W(4, -1097777178, -1098446206, -1106280983, 1068295659) + + W(5, 1052165187, -1110264861, -1135489703, -1107248782) + + W(6, -1117386048, -1106566736, -1108034123, -1104582586) + + W(7, -1102127104, 1036459063, -1104779766, 996655259); + WS(-1094699455, 1066131816); + sum1 = W(0, 1049793485, 1029004921, 1050253240, 1043166228) + W(1, 1029407446, 1041612884, 1035949114, 1012128942) + + W(2, -1081848423, -1088299640, -1084057276, -1084821317) + + W(3, -1084563631, -1104203619, -1099802604, -1096241030) + + W(4, 1059460685, 1048637514, 1060796209, 1059873140) + W(5, 1055943200, 1047596309, 1050483936, -1105809528) + + W(6, 1042128105, -1139594888, 1026023615, 1020508084) + + W(7, -1125172935, 1048504406, -1115227886, 1051471881); + sum2 = W(0, 1060779432, -1118034101, -1104519356, -1119327164) + + W(1, -1101970936, -1106905521, 1002331293, -1082144605) + + W(2, 1051802488, -1097493973, 1057101737, 1060027297) + + W(3, 1044004337, 1057962293, -1098665363, -1086721729) + + W(4, -1086062785, 998397725, -1092333837, 1066349798) + W(5, 979464170, -1133317807, 1046794021, 1070824403) + + W(6, -1114203174, -1112558489, -1099984065, -1091352583) + + W(7, -1094257268, -1102635709, -1094504499, -1114333706); + WS(-1074268304, 1079667699); + sum1 = W(0, -1107189325, 1027760991, -1136873402, -1113641470) + + W(1, 1031162561, 1033891144, -1126712892, 1035917755) + + W(2, -1101508903, -1090199334, -1090363950, -1087996124) + + W(3, -1083961527, -1096484091, -1098094611, -1093567651) + + W(4, 1054199089, 1054303683, 1062422475, 1067750847) + W(5, -1113534839, 1052689284, 1031942551, 1045977323) + + W(6, 1035260131, -1107632246, 1005391451, -1101800081) + + W(7, 1034855959, 1046337921, -1150999418, 1042992013); + sum2 = W(0, -1109104193, -1121805095, 1045986101, 1048674700) + + W(1, -1091901802, 1048446997, -1113936425, 1027039508) + + W(2, -1100757902, 1045040397, 1080470972, -1080397282) + + W(3, -1070026310, 1054845861, -1109557127, -1113850952) + + W(4, 1040683096, -1125556022, 1049174250, -1095181876) + + W(5, -1122013099, -1110936398, 1038355211, -1103996340) + + W(6, -1125509919, 1026278254, -1112163985, 1050380898) + + W(7, -1131668233, 1033243862, -1144282357, 1036778147); + WS(-1085238047, -1082053459); + sum1 = W(0, -1106787663, -1138285833, -1108632776, -1094657608) + + W(1, -1101713608, 1037328759, -1111697288, -1109379868) + + W(2, 1039996894, 1010512412, 1053399812, 1045540841) + W(3, 1051732998, 1044326914, 976543556, 1057105320) + + W(4, 1048926451, -1119213276, -1130975030, 1010216242) + + W(5, 1034301867, 1025236158, -1128978334, -1109745879) + + W(6, -1104330662, -1128637723, -1108017347, -1096910157) + + W(7, -1101323868, 1015829447, -1111437732, -1108664266); + sum2 = W(0, -1124623913, 1032956443, 1027185909, -1101336864) + + W(1, -1094263361, 1029736763, -1112090109, 1039412150) + + W(2, 1025825838, -1119700813, 1032253087, 1046009611) + + W(3, 1060071017, -1108021530, -1111711122, -1092338318) + + W(4, 1042257288, -1135835500, 1053804277, 1048892371) + + W(5, 1036906607, -1101254223, -1115069322, -1114145526) + + W(6, 1021162350, -1114452863, -1109212782, -1102267892) + + W(7, -1105958464, 1037505372, 996911332, -1125671849); + WS(1060867039, -1136390908); + sum1 = W(0, -1127355032, 1034805910, 1035163860, 1029669941) + W(1, 1042066222, 1021674692, 1040577786, 1021261983) + + W(2, -1085412379, -1094311080, -1093352008, -1084691216) + + W(3, -1088428116, -1088125293, -1096644095, -1091872390) + + W(4, 1049179798, 1049208039, 1060583566, 1063283264) + W(5, 1058522472, 1055147879, 1050065089, 1041474713) + + W(6, 1047055468, -1108149971, 1036232649, -1103012671) + + W(7, 1024178471, 1026233836, -1126656770, 1049799631); + sum2 = + W(0, 1035672114, -1098827199, 1049155846, 1035178389) + W(1, -1107113032, -1144855824, 1035201737, -1127184278) + + W(2, -1063752230, -1085747691, 1077059336, 1075347264) + W(3, 1056308660, 1034654874, -1121418857, 1014935340) + + W(4, -1093487673, 1041803367, 1041184099, -1096808218) + + W(5, -1129382302, -1119639669, -1122522987, 1011408026) + + W(6, 1013645866, 1034418818, -1106855503, 1049524211) + + W(7, -1122362105, 1030856901, 1027103888, -1115004359); + WS(-1090674303, -1100343233); + sum1 = W(0, -1120232797, 1040422273, 1026412864, -1138867958) + W(1, 1033879777, 1033565615, 1019476032, 988102399) + + W(2, -1091881416, -1094093465, -1085938046, -1089254334) + + W(3, -1089797193, -1085407367, -1095206984, -1105032111) + + W(4, 1051419109, 1052500896, 1061270771, 1067891162) + W(5, 1060067146, 1016645247, 1041715172, 1036835111) + + W(6, 1036288004, 1023553551, -1112170192, -1115349187) + + W(7, -1112030904, 998486818, 1027103050, 1040345019); + sum2 = + W(0, 1040618154, -1114130867, -1122148687, 1044229537) + W(1, -1110193301, -1097134960, 1037070268, 1037459780) + + W(2, -1101425729, 1043012943, 1049717343, 1078734719) + W(3, 1058416067, -1066172228, -1087270128, 1051160418) + + W(4, 1012698939, -1135257643, 1047429512, 1020747990) + W(5, 1045573328, -1105653505, -1098650023, 1029335953) + + W(6, -1121139419, 1033653009, 1038119907, -1131387750) + + W(7, -1162837210, -1124290574, -1142454518, -1119987003); + WS(-1083751903, -1076119444); + sum1 = W(0, -1115245576, -1106029427, -1102084379, -1113929101) + + W(1, -1115339007, 1029734646, -1110488366, -1147960477) + + W(2, 1056842307, 1054460828, 1062160243, 1061549380) + W(3, 1051628466, 1034628298, 1040780998, 1027250487) + + W(4, -1093345814, -1096614035, -1087844584, -1088621915) + + W(5, -1095344475, 1039622221, 1023285463, 1052549785) + + W(6, -1108216057, -1118873130, 1032187759, -1118044066) + + W(7, -1125935063, -1114025640, -1103117229, -1101242061); + sum2 = W(0, -1142266798, -1105635988, -1108468488, -1104742183) + + W(1, 1004562934, -1111519795, 1009402627, 1007186587) + W(2, 1041896729, -1133541327, 1052249127, 1059101684) + + W(3, -1116644500, 1022626513, 1036478091, -1114250343) + + W(4, -1109207785, -1119640286, -1132044399, 1057719514) + + W(5, 1049160976, 1040987637, -1103527129, -1094402391) + + W(6, -1116438034, -1143926222, -1116983273, -1107716245) + + W(7, 1036001553, -1093640310, -1115139384, -1102449905); + WS(1032624635, 1033521535); + sum1 = W(0, -1131553039, -1117491096, -1112834618, 1049918570) + + W(1, 1045795365, 1016822387, 1035361729, -1113168565) + + W(2, -1098906814, -1100587359, -1081513385, -1078593782) + + W(3, -1105649745, -1092053629, -1096260814, -1095243062) + + W(4, 1051615627, 1047570260, 1060987922, 1043587024) + W(5, 1056209202, 1059398075, 1049440024, 1051600524) + + W(6, 1045470610, 1025984961, 1036113314, 1040182861) + W(7, 1012071435, 1032631435, 1023888652, 1034850724); + sum2 = W(0, -1111826236, -1099208280, 1026789677, -1106561040) + + W(1, -1093448876, 1046407154, -1102666308, 1042570396) + + W(2, -1092384767, 1027875109, 1064661507, 1062273543) + + W(3, -1087164405, -1108191451, 1044380270, -1104593420) + + W(4, -1095745094, -1100947515, -1112642295, 1068550638) + + W(5, -1104229197, -1106740917, -1103404028, -1105841536) + + W(6, 1034661269, 1048636172, -1098451609, -1099981129) + + W(7, -1118651857, 1049739863, -1095995165, 1048025970); + WS(-1085606847, 1061985400); + sum1 = W(0, -1108997980, -1117164584, 1031768707, -1103105924) + + W(1, 1041900981, -1110420181, 1037113665, 1014163116) + + W(2, -1089905075, -1114895517, -1095264598, -1077801587) + + W(3, -1097956992, -1088999487, -1098379486, -1096151518) + + W(4, 1057688104, 1056544190, 1062390314, 1055481056) + W(5, 1062127874, 1051900674, 1048102065, 1057425872) + + W(6, 1040581229, -1114811305, -1107526493, -1110202349) + + W(7, -1118208771, -1108027100, 1024450541, 1041210774); + sum2 = + W(0, 1025785873, 1048912334, -1096464036, 1056133856) + W(1, -1104154812, -1121968309, 1033410161, 1015120151) + + W(2, 1048760593, -1090084783, -1114768213, 1066763200) + + W(3, -1086306359, 1058187354, -1113492694, -1128581905) + + W(4, 1035955606, -1119218892, 1007739746, 1064934573) + W(5, -1089946445, 1050702067, 1025685973, -1102128709) + + W(6, -1126760968, 1008603006, -1094704139, -1080670875) + + W(7, 1031309677, -1125625514, -1109240237, 1039335694); + WS(-1090966143, -1078936607); + sum1 = W(0, -1116393227, -1108278025, 1051625062, -1105522375) + + W(1, 1058727904, -1091195697, 1052016408, -1109728971) + + W(2, -1086961670, -1108945587, -1086695325, -1081986687) + + W(3, -1089148367, -1086453117, -1092689140, -1091172115) + + W(4, 1058706816, 1041859343, 1060094467, 1059190367) + W(5, 1061098519, 1055062080, 1056115606, 1058930855) + + W(6, -1116819366, 1035952359, 1041797992, -1104043025) + + W(7, 1053094890, -1093101306, 1015960496, 1034498693); + sum2 = W(0, 1023528661, -1119417071, -1105978590, 1009798795) + + W(1, 1040834561, -1111364082, 1041397121, 1033368796) + + W(2, -1118025227, 1050920275, -1112399565, -1098493686) + + W(3, 1036263434, -1124489419, 1048582480, -1089345484) + W(4, 1075422545, 1065042273, 1069638520, 1067662601) + + W(5, -1093932676, -1079439326, -1078082886, -1070108577) + + W(6, -1073269716, -1077701631, -1078616397, -1083676116) + + W(7, 1044144047, 1070390370, 1068400636, 1077727906); + WS(-1079921856, 1049308945); + sum1 = + W(0, 1030068962, -1133949626, 1050882798, 1018623990) + W(1, -1106924392, -1146454049, -1116987117, 1040905769) + + W(2, -1165865787, -1118082277, 1053008345, -1094507016) + W(3, 1052481994, 1043504665, 1047635255, 1026870489) + + W(4, -1187780005, -1108803021, 1038634079, -1106873963) + + W(5, -1087778738, -1101591143, -1101174683, -1110197734) + + W(6, 1025440517, -1111921110, -1120535059, -1104818073) + + W(7, 1046575523, 1041667424, 1031519031, 1031554658); + sum2 = + W(0, -1116556974, -1095066961, -1100395256, 1050308919) + W(1, 1040792410, 1032406727, 1011901446, -1141998384) + + W(2, 1059176005, 1038856572, -1076691076, 1055715442) + W(3, 1046498927, -1123959066, 1028959950, 1032868606) + + W(4, -1096412953, 1050790436, 1058179896, -1097771226) + W(5, 1039711359, -1106160519, 1018212767, 1038360912) + + W(6, -1114011261, -1173649795, 1024138419, 1040413046) + + W(7, -1106323994, 1033840078, -1127468978, -1107910389); + WS(1060842367, -1123947436); + sum1 = W(0, 1024730985, 1023159627, -1105241169, 1017803651) + W(1, 1037913699, 1035962309, 1028045772, 1032728670) + + W(2, 1048950736, 1047784339, 1057388094, 1060112037) + W(3, 1062491953, 1057656339, -1114528913, 997860858) + + W(4, -1097448124, -1098772880, -1087773444, -1085451727) + + W(5, -1088044111, -1089872870, -1102522557, -1103124285) + + W(6, -1122548355, 1026072115, 1037590622, 1037652837) + + W(7, 1034810634, 1033785172, 1008900343, -1114288296); + sum2 = W(0, 1026131421, -1112740722, 1046858645, 1032928238) + + W(1, 1042166107, 1040344552, -1082879617, -1091819295) + + W(2, 1001103237, -1121600279, -1108221277, -1097923247) + + W(3, 1069212508, 1057336110, -1095628134, -1107037379) + + W(4, -1133854939, 1038637096, 1037424280, -1103185020) + + W(5, -1120290433, 1019342369, 1039461314, -1122429445) + + W(6, -1114822986, -1108393699, 1029862733, -1101308237) + + W(7, 1036213344, -1145606165, -1111520861, 1034167562); + WS(1038606587, 1058047160); + sum1 = W(0, 1026865207, 1042118304, 1051307036, 1033639368) + W(1, 1046742309, -1109598961, 1028927539, 1015037525) + + W(2, -1095018974, -1093024127, -1082724754, -1100730470) + + W(3, 1036658562, 1040951763, -1113143704, -1098528366) + + W(4, 1044423619, 1048945010, 1054092644, -1097872036) + W(5, -1091674216, 1033100505, 1030352835, 1047837568) + + W(6, -1136300775, -1117800769, 1005722288, 1044405134) + + W(7, 1047528601, 1044812414, 1032954286, 1044220906); + sum2 = W(0, 1050657429, -1103301852, 1060573163, -1091436731) + + W(1, -1104427284, -1097267636, 1038196249, -1107511544) + + W(2, 1045860939, 1052242374, -1100974944, 1066745360) + + W(3, -1079344782, -1113016512, -1119497008, -1113648424) + + W(4, -1111592920, 1013554208, -1111727364, 1055083328) + + W(5, -1098647652, 1034990326, -1110499846, 1042188938) + + W(6, -1103122208, -1106328874, 1015168980, -1113723980) + + W(7, 1051192034, 1034643320, -1122594772, -1140986496); + WS(-1095257599, 1052962039); + sum1 = W(0, -1106746181, 1031300369, 1046667354, 1037361867) + + W(1, 1040829967, -1128966365, 1034540700, -1115420664) + + W(2, -1097695335, -1111219488, -1083536631, -1088861218) + + W(3, -1107201338, -1115618056, -1117058422, -1138753100) + + W(4, 1053309708, 1042046133, 1060606673, 1053570633) + W(5, -1101583222, 1033575580, 1029127944, 1041019129) + + W(6, 1036635571, 1032102291, -1110849586, -1103814096) + + W(7, -1130665360, 1023220920, 1009452933, 1041468947); + sum2 = + W(0, -1137205193, -1121249932, -1137006201, -1101149788) + + W(1, 1034796937, -1115985020, -1140489533, 1026538132) + W(2, -1089705070, 1025195792, 1049206515, 1054529493) + + W(3, 1039074115, 1050074620, -1104546681, -1103055048) + W(4, -1116057142, 1014073009, 1040872535, 1044729510) + + W(5, 1024555690, -1108168105, -1105229574, -1093226929) + + W(6, -1106134583, -1131583764, 1023734245, 1030258377) + + W(7, 1045578999, 1041497164, -1131316168, 1036128894); + WS(1058062751, -1100017341); + sum1 = W(0, -1129599006, 1020928695, -1098371705, -1111175932) + + W(1, -1108928286, -1108487635, 1028685770, -1134533769) + + W(2, 1055064995, 1054737968, 1061839865, 1057524464) + W(3, 1062722401, 1039434185, 1053936411, 1054765971) + + W(4, -1094744478, -1108714620, -1089137095, -1081607655) + + W(5, -1111400813, -1089739654, 1037008853, -1094983833) + + W(6, -1110864465, 1035506764, -1103907470, -1115102560) + + W(7, 1038105413, -1103382940, 1038153674, -1101904010); + sum2 = W(0, 1046625968, -1114205611, -1097342682, -1079666171) + + W(1, 1041595755, 977545170, -1106070846, -1145403458) + W(2, 1034733544, -1100522159, 1034693600, 1066071967) + + W(3, -1087077400, 1062799024, -1097179722, 1015933409) + + W(4, -1147999170, -1093312378, 1057288295, 1059803421) + + W(5, -1088579916, 1057064650, -1086854504, 1055355590) + + W(6, 1026537136, -1103988998, 1049229753, -1114956972) + + W(7, -1104980683, 1050850828, 997711860, -1115357129); + WS(1033636603, -1075190676); + sum1 = W(0, 1030520392, -1125697208, -1114269946, -1109653337) + + W(1, -1102211630, 1032435172, -1120127764, 996293820) + W(2, 1051253486, 1043969999, 1058583983, 1064791929) + + W(3, 1057642082, 1055881859, 1033241689, 1053053914) + + W(4, -1096251285, -1100430004, -1085953223, -1093290764) + + W(5, -1088005167, -1098086422, -1102333361, -1119839106) + + W(6, -1117233131, -1122877346, 1036037681, -1109909101) + + W(7, -1123582788, 1029223000, -1125435099, -1103406294); + sum2 = W(0, -1120200303, 1024626781, 1013431061, -1124733431) + W(1, 1027814217, 999438554, -1116912567, 1007930813) + + W(2, -1113787644, 1041562727, -1114475538, -1112371618) + + W(3, 1032748777, -1098117165, 1042886038, -1140542509) + + W(4, -1109535466, -1106166077, 1029531851, 1051805575) + + W(5, 1061661699, -1114245048, 1039886302, -1093997696) + + W(6, 1041916719, 1028143351, -1097688999, 1068535590) + + W(7, 1074776935, 1029048009, -1076933565, -1072079702); + WS(1051996799, 1040628126); + sum1 = W(0, -1106876926, 1042171100, 1014013938, 1040804174) + W(1, 1038633599, 1024260165, 1032103150, -1111941370) + + W(2, -1096999331, -1106536569, -1087433914, -1079279688) + + W(3, -1085040172, -1090750082, -1096245875, -1091794355) + + W(4, 1064227732, 1056769919, 1057736892, 1052514885) + W(5, 1059334684, 1058371760, 1051111478, 1050507101) + + W(6, 1032518006, -1132737450, -1121739327, 1035728257) + + W(7, -1115112214, -1126170017, -1129820331, 1036168684); + sum2 = + W(0, -1097197656, 1040517176, -1107105879, 1050425804) + W(1, -1108102513, 1044838414, 1026907274, 978890108) + + W(2, -1105938617, -1119182790, 1048788314, 1048225474) + W(3, 1050055380, -1097162220, 1028263310, 1043193320) + + W(4, -1063141508, -1072247475, 1073986693, 1082212097) + + W(5, 1063649950, -1108483496, 1040597170, -1096883524) + W(6, 1047663602, -1106333570, 1017343300, 1014706728) + + W(7, 1023560998, -1105252179, 1016727612, 1025416282); + WS(-1079662656, 1075711984); + sum1 = W(0, -1136749190, -1108214827, -1112256994, -1102094902) + + W(1, 1019461885, -1113236619, -1115387518, 1015637672) + W(2, 1054381451, 1049467004, 1060357369, 1064079536) + + W(3, 1058102849, 1050217386, 1046694646, 1053154499) + + W(4, -1099895821, -1104318006, -1094055613, -1088977984) + + W(5, -1094018397, -1093377643, -1102869707, -1097489705) + + W(6, -1111920714, -1124862997, -1099490085, -1093653775) + + W(7, 1047054555, 1026036560, -1122648846, -1117787456); + sum2 = W(0, 1021596406, 1027700788, 1031902674, 1035450862) + W(1, -1146279384, 1036068426, -1108044351, 1030087008) + + W(2, -1120307380, 1049653321, -1100871897, 1054975194) + + W(3, -1106853601, 1042197470, 1034125536, -1133477273) + W(4, 1037868882, 1038499992, 1074972319, 1073269037) + + W(5, 992333684, 1032586692, -1129244749, 1010404410) + + W(6, -1094559059, -1099826066, -1070411479, -1076192259) + + W(7, 1024067187, -1107184127, 1032061183, -1104237818); + WS(-1121360374, -1077155152); + sum1 = W(0, -1105583845, 1042009047, -1135496901, 1057317824) + + W(1, 1037107234, 1028773828, 1042777544, -1116736729) + + W(2, -1092428892, -1091586093, -1087526962, -1088356100) + + W(3, -1084718223, -1086275726, -1096882940, -1086839898) + + W(4, 1053987635, 1057449542, 1037542524, 1067018703) + W(5, 1053143538, 1051794540, 1049337758, 1050512766) + + W(6, 1036329976, 1039912928, -1114441548, 1035631092) + W(7, 1024846769, 1020991498, 1032759069, 1041911145); + sum2 = W(0, -1122349048, 1027223630, -1123059666, -1097496437) + + W(1, -1101147358, 1008041239, -1113710228, -1103013196) + + W(2, -1108922684, 1050237475, -1093984844, 1061603028) + + W(3, 1054912466, -1136134543, 1050990810, 1037079763) + + W(4, -1102817435, 1047134367, -1086242189, 1069845393) + + W(5, -1091188340, -1107987422, -1126348732, -1097181289) + + W(6, 1024154790, -1105600910, 1041276041, -1090292072) + + W(7, -1122818012, -1109079234, 1047206075, -1109791787); + WS(-1087087711, 1067831143); + sum1 = W(0, 1034272753, 1043354114, 1046815315, 1041026663) + + W(1, -1116058688, -1131457456, -1115558139, 1032034947) + + W(2, -1110686621, -1094089577, -1090322161, 1019000899) + + W(3, 1048378971, 1054466495, 1045446607, 1043401342) + W(4, 1034360523, 1051348739, 1056352764, 1049291409) + + W(5, -1098372646, -1090870248, -1103803571, -1098529593) + + W(6, 1006467012, -1097882829, -1098171061, -1099191041) + + W(7, 1036956791, 1036945505, -1124941614, 1026141794); + sum2 = + W(0, 1046033632, -1114282503, 1044655964, -1106001859) + W(1, -1104436397, -1101664028, 1015764662, 1023732858) + + W(2, -1147554302, 1065651536, 1052996561, -1076523823) + + W(3, -1095873418, 1059971501, 1037179306, -1119149512) + W(4, 1021728539, 1061103542, 1047372498, -1081697027) + + W(5, -1094800655, 1058036758, -1113369666, 1033040332) + + W(6, 1034466187, -1117467216, 1040544990, -1105745303) + + W(7, -1119054372, -1110996319, -1120190386, 1028498617); + WS(1040537598, -1164677141); + sum1 = W(0, 1044447583, 987031402, -1121775302, 1042738997) + W(1, 1038434732, 1049696256, 1024826006, 1044766000) + + W(2, 1058921623, 1052904912, 1059494147, 1059765434) + W(3, 1053249925, 1045203303, 1049549231, 1032179929) + + W(4, -1079854668, -1089009751, -1082135643, -1085199868) + + W(5, -1087718171, -1094593271, -1098502833, -1111725730) + + W(6, 1051360885, 1009017491, 1049103971, 1042102879) + W(7, 1037325507, 1033340813, 1040792940, -1103499809); + sum2 = W(0, -1105450770, -1099930216, -1087670985, -1097641768) + + W(1, -1093727900, 1034849198, -1089823109, 1026936119) + + W(2, -1076904032, -1110661913, 1054929191, 1067640588) + W(3, 1043325457, 1041628489, 1024934811, 1071055811) + + W(4, 1034745372, -1104228342, 1055270313, 1058849806) + + W(5, 1055379319, 1047258529, -1091022953, -1093861556) + + W(6, 1064235564, -1133206564, -1159337186, -1095527236) + + W(7, -1097371942, -1123329564, 1053074558, -1079977593); + WS(-1072228928, 1076959210); + sum1 = W(0, 1049440860, -1100954468, 1040518102, 1055014377) + + W(1, -1102413547, 1056933930, -1100924366, 1025160513) + + W(2, -1102211417, -1090494943, -1089397123, -1085929645) + + W(3, -1092416799, -1103710088, -1099959722, -1097219837) + + W(4, 1052420434, 1049042513, 1057628335, 1059399711) + W(5, 1055649007, 1056457065, 1043274798, 1043339918) + + W(6, 1046258910, -1094165323, -1113742940, -1115570152) + + W(7, -1095616949, 1054320058, -1096288332, -1113497047); + sum2 = + W(0, 1037249746, -1106259401, -1118512137, 1033553146) + W(1, -1118437421, 1049532353, -1112295163, -1112769969) + + W(2, -1091193116, 1057292562, 1045032769, -1101074553) + W(3, 1047290760, -1085599381, 1045403080, 1036239865) + + W(4, 1058952598, -1089499743, 990544085, 1052938455) + W(5, -1096914685, 1060306657, -1095081062, 1036770528) + + W(6, -1099278743, 1035766214, -1120311473, -1107284433) + + W(7, 1032001159, -1105441959, 1037527897, -1117837555); + WS(-1095248895, -1088416713); + sum1 = W(0, 991086878, 1041397006, -1100414321, -1106522737) + + W(1, 1032194452, 1040515607, -1113785099, -1119710941) + + W(2, -1112623265, 1023033498, -1095527100, -1085500137) + + W(3, -1103431285, -1093888960, 1025813699, -1112974208) + + W(4, 1049658160, -1129854724, 1056723856, 1061179113) + W(5, 1050067968, 1055178889, 1027165141, 1044420741) + + W(6, 1025280780, 1018002536, -1101036339, -1098081679) + + W(7, -1121954805, 1040437430, -1107604207, -1122583614); + sum2 = W(0, -1115281709, 1038308115, -1086190321, -1079410563) + + W(1, 1055352031, -1106071111, 1042421121, 999244165) + W(2, 1049351198, -1105447726, 1061131477, 1070791012) + + W(3, -1080774986, 1050939464, -1096576742, 1021655353) + + W(4, -1101546004, 1044927538, -1105825160, -1124003323) + + W(5, 1054621998, -1100497740, 1042910101, -1123561791) + + W(6, -1132663474, 1036918381, -1104633062, 1035199903) + + W(7, -1119052371, 1038597174, -1126972585, -1141223925); + WS(1057802399, -1081431823); + sum1 = W(0, -1122831751, -1131892376, 1041203877, 1034931072) + + W(1, 1020249162, 1023514439, -1183605377, -1102408215) + + W(2, -1093480916, -1097592621, -1087992005, -1086955360) + + W(3, -1094219074, -1099624791, -1104094712, -1103351679) + + W(4, 1050038833, 1050095280, 1058335651, 1062569267) + W(5, 1052617634, 1053253320, 1037479577, 1047799764) + + W(6, 1031929377, 1003466633, -1150646211, -1108251076) + + W(7, -1123920403, -1110979235, 1022403704, 1031403703); + sum2 = + W(0, -1104748298, 1035677532, -1097271446, -1071563129) + W(1, -1073203825, -1105574565, 1074066983, 1076846054) + + W(2, 1032567526, 1015597088, 1042180726, -1131466492) + W(3, -1088097679, 1049167232, -1104411749, 1054919113) + + W(4, 1030425414, -1106402955, 1036072793, 1026492053) + W(5, 1021201077, 1046304011, -1108010622, 1040423027) + + W(6, 1028805714, 1010146816, -1122721452, -1139412188) + + W(7, -1121571686, 1013464552, -1115684312, -1159010626); + WS(1057159391, -1098185256); + sum1 = W(0, -1115997840, -1139848194, -1110900998, 1040272534) + + W(1, -1124007614, 1022311680, -1122049771, 1025640163) + W(2, 1062337777, 1059107990, 1058844902, 1060188982) + + W(3, 1050305613, 1055455830, 1052112283, 1058488623) + + W(4, -1099145229, -1096884471, -1083284577, -1081840204) + + W(5, -1086268415, -1088086212, -1093503993, -1095187909) + + W(6, -1108105457, 1026934458, -1128707950, 1050661700) + + W(7, 1025671020, 1018441343, 1032949738, -1115150240); + sum2 = W(0, 1056249112, -1087901783, 1050240307, -1096100666) + + W(1, 1050011361, 1046757851, -1111613200, 1031802636) + + W(2, -1063663228, -1065703489, 1050922399, 1074103439) + W(3, 1078895155, 1075028289, 1011769164, 1041242105) + + W(4, -1090194820, 1049313091, 1059446328, -1091782161) + W(5, 1051412884, 999915799, -1097222567, 1040180956) + + W(6, -1098679170, 1049727089, -1118968312, 1043947681) + + W(7, -1103451878, 1046896549, 1036070334, -1120669738); + WS(-1076050352, 1072169512); + sum1 = W(0, -1112010473, -1110549812, 1041474168, -1102358403) + + W(1, 1035256808, -1103941101, -1126807163, -1127729580) + + W(2, -1127017300, -1096217239, -1101316183, -1098236010) + + W(3, -1097462672, 1015309803, -1109990262, -1124828306) + + W(4, 1032805651, 1055039585, -1107675851, 1058693100) + W(5, 1050718238, 1047069339, 1040782175, 1033573870) + + W(6, -1127012698, 1017026201, 1027743346, -1103052317) + + W(7, 1025923518, -1108585145, 1029935559, 1030091394); + sum2 = W(0, -1115222730, -1103808603, -1133607278, 1035011293) + + W(1, 1045426354, 1005150868, 1038138903, 1014354189) + W(2, 1013406324, 1044516259, 1056099238, -1093760521) + + W(3, -1097063741, 1046105407, -1106358807, 1034790704) + + W(4, 1048651312, -1091636530, -1082257366, 1065398243) + + W(5, 1052543946, -1105190986, -1143243436, -1124610775) + + W(6, -1105744683, 1036643390, 1056116581, -1087652578) + + W(7, -1106429625, 1031045850, -1129675875, 1033997397); + WS(1065781680, 1039008007); + sum1 = W(0, 1041247860, -1132228043, -1116017645, 1029031978) + + W(1, -1114552992, 1018467582, -1119698444, 1039500994) + W(2, 1052873269, 1052030887, 1057769989, 1065817909) + + W(3, 1059292430, 1052683781, 1045381867, 1042767258) + + W(4, -1087848896, -1090939837, -1086321043, -1090130600) + + W(5, -1093123180, -1089813139, -1093950448, -1088918334) + + W(6, -1122380132, 1043969975, -1167945460, 1043124941) + + W(7, 1037414446, 1037105136, 1016187596, -1139723011); + sum2 = W(0, 1038177586, 1024852101, 1031995320, 1016571646) + W(1, 1033741319, -1108656521, 1035134998, -1120710323) + + W(2, -1105284792, -1131141686, -1123455081, 999573799) + + W(3, -1107419527, 1052574782, -1099142208, -1103717942) + + W(4, -1114385091, -1105200928, 1057384109, 1073904332) + + W(5, 1075963065, -1130292726, -1072886122, -1070457563) + + W(6, 1023745983, 1044997454, -1102654886, 1045931554) + + W(7, -1113399825, 1041285787, -1101763500, 1044467987); + WS(-1090516543, -1087531312); + sum1 = W(0, -1105337757, -1135375282, -1113059195, -1111479074) + + W(1, 1044282546, 1036163039, -1123738614, -1110047807) + + W(2, 1040358473, 1025750638, 1034124454, -1082649657) + + W(3, -1098312091, -1114570479, -1112260786, 1044483760) + + W(4, 1026287071, -1109155234, -1111070925, -1113637434) + + W(5, 1056333811, 1044131649, 1049914271, 1039433994) + W(6, -1112133319, 1043065477, 1049735832, 1048811350) + + W(7, -1104740686, -1111303053, -1128712224, -1136462731); + sum2 = + W(0, -1122757257, 1009904581, -1113467627, -1099518373) + W(1, 1032421699, -1095677862, 1020800146, -1112743661) + + W(2, 1027164873, -1112829049, 1020364514, 1064179702) + W(3, -1092934445, 1039050377, -1106885375, 1022655162) + + W(4, 1002742314, -1115430893, -1098221748, 1059311413) + + W(5, -1139891301, 1041708988, -1124766450, 1032689603) + + W(6, -1111953049, -1116391321, 1025748661, -1098741962) + + W(7, 1036551469, -1119491053, 1025848261, -1122814953); + WS(1059528063, 1057564569); + sum1 = W(0, 993737087, 1023855952, 1051519336, -1100822612) + W(1, 1027584566, -1109486813, -1127107174, 1035631854) + + W(2, -1096201122, -1112481934, -1089271861, -1101379550) + + W(3, -1129312776, -1101173547, 1031993577, -1097162722) + + W(4, 1052073475, 1044928820, 1057871347, -1090210244) + W(5, 1027452795, 1051680014, 1038521522, 1050823828) + + W(6, 1036364765, -1119101474, 1026047377, -1095066725) + + W(7, 1043887545, 1038809676, -1152581582, 1037595092); + sum2 = + W(0, -1106514375, 1034094594, -1112949179, 1009317700) + W(1, -1126355148, 1021633582, 1010987268, -1106252693) + + W(2, -1115270098, 1029678117, -1095879627, 1052560633) + W(3, -1128108776, 1034084538, 1040297892, 1049223604) + + W(4, 1025588625, -1103891997, 1029083209, 1062070608) + W(5, -1100067512, 1035054672, -1117785257, 990783407) + + W(6, -1109616345, 1044342701, -1107320484, -1103446924) + + W(7, -1131810302, -1098743078, -1123491293, -1102218346); + WS(1061977215, -1122204685); + sum1 = W(0, -1124031333, -1109554099, -1105250724, 1036027519) + + W(1, 959521497, 1055353398, 1038275624, -1136942561) + W(2, 1053794732, 1053305789, 1058003360, 1059361796) + + W(3, 1055117810, 1051669497, 1037705519, 1047158647) + + W(4, -1090279300, -1096176108, -1093816822, -1081723655) + + W(5, -1090510080, -1097892492, -1101480172, -1098784634) + + W(6, 1017895407, 1027213295, 1024566052, 1033714163) + + W(7, -1125004641, 1006220452, -1112881733, -1145512357); + sum2 = W(0, -1113155109, 1032430477, -1105712018, 1048044904) + + W(1, -1081128362, -1070110178, -1092435520, -1092804751) + + W(2, 1028856727, 1021325630, 1050891972, 1070862297) + W(3, 1074403261, 1035516985, -1108990845, -1122256510) + + W(4, 993552399, -1128331832, 1042508384, 1042132916) + W(5, 1044319918, -1115800491, 1033559089, -1109033129) + + W(6, 1036996819, -1139715524, -1111526035, 1040898786) + + W(7, 1025048067, 1038841221, -1119663830, 1007165668); + WS(-1096328959, 1070879408); + sum1 = W(0, 1047483149, -1131726569, 1017405984, 1016192218) + + W(1, -1134185032, -1130210629, 1039283496, 1022798351) + W(2, 1056909741, 1050717891, 1049879450, 1064784543) + + W(3, 1054175424, 1055866677, 1052923070, 1050331269) + + W(4, -1084253114, -1097194674, -1084428714, -1088019878) + + W(5, -1087922381, -1096076442, -1098682228, -1089646420) + + W(6, 1043610432, -1120381614, 1029856307, 1046790989) + + W(7, 1044095416, -1106891777, 1045347898, -1103492015); + sum2 = + W(0, -1096731787, 1041094096, 1030029833, -1134738767) + W(1, -1112066554, 1049526473, -1103571503, 1038503381) + + W(2, -1092572599, -1083918511, -1081752188, 1050600846) + W(3, 1060518769, 1056806956, 1052566197, 1040255570) + + W(4, -1072213302, -1081783724, -1088492050, -1098909280) + + W(5, 1054813136, 1066457366, 1061557517, 1074348460) + W(6, 1074300082, 1061218424, 1062246408, 1055931246) + + W(7, 1030722387, -1080408758, -1082314750, -1074863778); + WS(-1093955647, 1022010191); + sum1 = W(0, 1027472455, -1118029508, 1017520774, -1100976252) + W(1, 1048038797, 1019653215, 1015004427, 1006149335) + + W(2, 1051129150, 1040858863, 1058284788, 1064764899) + W(3, -1094249656, 1054989120, -1137681219, 1047833420) + + W(4, -1126583382, -1110637352, -1083829535, -1092969620) + + W(5, -1093269900, -1098669306, -1101321193, -1092663640) + + W(6, -1110971745, -1129027011, 1043546956, 1032062845) + + W(7, 1049944248, -1114080636, 1039113958, -1120661351); + sum2 = W(0, -1125700855, 1010923567, -1097524591, -1086770251) + + W(1, -1119687254, -1136610695, 1034141799, -1146172877) + + W(2, -1109340305, -1099241242, -1097784845, 1061340682) + + W(3, -1091236020, 1059369820, -1103210716, 1042204527) + + W(4, 1041739108, -1121076246, -1122648580, 1059475190) + + W(5, -1097965354, 1048517727, 1020884025, -1117941982) + + W(6, -1138307987, 1010348245, 1043843262, -1104554020) + + W(7, 1042867821, -1105357691, 1021404807, 1026766467); + WS(1057685119, 1067243116); + sum1 = W(0, -1129459555, 1016923756, 1004671913, -1095493364) + + W(1, -1098633785, -1112175056, 1046138501, -1131471418) + + W(2, -1098308652, -1100618635, -1090418529, -1088191051) + + W(3, -1089905135, -1101363479, -1106099897, -1097291652) + + W(4, 1053516928, 1049587364, 1057639529, 1065512192) + W(5, 1058720438, 1052631981, 1043712557, 1052947846) + + W(6, 1029422892, -1111775882, -1114348966, -1112549294) + + W(7, -1103551521, -1111153757, 995391206, 1020473821); + sum2 = + W(0, -1131225411, -1130956898, -1103681442, -1077027280) + W(1, -1076028808, 1031803188, -1101294062, 949706042) + + W(2, -1140292462, 1023877693, 1042914798, 1069127322) + W(3, 1071847872, -1103125793, 1043076855, -1132087796) + + W(4, 1018110051, -1137158572, -1224504659, 1043315619) + + W(5, -1120948958, 1043270022, -1113817590, 1015417250) + + W(6, 1018006973, -1128428036, 1020723155, -1147115303) + W(7, 1020554514, -1133954299, 990350747, 1025989218); + WS(-1097928959, -1082976358); + sum1 = W(0, 1027664520, -1123678010, -1106569905, 1052451146) + + W(1, -1103556709, 1038567635, -1108799690, 1040222651) + W(2, 1057835343, 1050550727, 1057764410, 1062299789) + + W(3, 1049034640, 1057826487, 1041175724, 1060823717) + + W(4, -1089326063, -1096462854, -1083721351, -1087127986) + + W(5, -1097735566, -1094118206, -1100805265, -1089053734) + + W(6, -1108038941, 1032858337, 1021803093, 1042469806) + + W(7, -1104920125, 1031016631, -1129264698, -1107162784); + sum2 = + W(0, 1059738223, 1048150071, 1052511773, -1080186607) + W(1, -1078381471, -1072132845, -1071450961, -1071397334) + + W(2, -1087082495, -1095900368, -1108343021, 1063110279) + W(3, 1074904245, 1071639576, 1076364217, 1077341373) + + W(4, -1092378156, 1046247330, 1033545850, -1090059649) + + W(5, -1107095292, 1039712953, -1113577164, 1049211915) + W(6, 1034470847, 1025055065, 1045395587, -1094453880) + + W(7, 1053230483, -1103894182, 1032308634, -1120241798); + WS(-1093482751, 1040242403); + sum1 = W(0, -1101135214, -1123956286, -1107524598, -1138012647) + + W(1, 1034129455, 1042720691, -1130324184, 998898338) + W(2, 1051279307, 1045008905, 1049489177, -1132973569) + + W(3, -1096848358, -1098383795, -1104810279, -1118268600) + + W(4, -1160860306, -1106067054, -1101021318, -1113266773) + + W(5, 1049504725, 1059206814, 1049756222, 1052043149) + + W(6, -1112732162, -1135242283, 1029341500, -1121978915) + + W(7, -1098727290, -1102892456, -1104163113, -1099073308); + sum2 = W(0, 1050603120, -1101078445, 1048531671, -1105220793) + + W(1, -1091713187, 1034851673, -1122031169, 1020293663) + + W(2, 1055811875, -1122671355, 1038805789, 1066111209) + + W(3, 1026095418, -1130092003, -1137910742, -1094690648) + + W(4, -1086548128, -1087609936, -1088336312, 1071017234) + + W(5, -1115602704, -1089969509, -1121274059, 1053616941) + + W(6, 1034695967, -1108269543, -1089139562, -1104320030) + + W(7, -1100901763, 1049804877, -1103744367, 1054827086); + WS(-1112146683, -1077736475); + sum1 = + W(0, -1128590341, -1130792414, -1147973299, -1117834531) + W(1, 1007065251, 1033724609, 1024083798, -1122914526) + + W(2, -1099064529, -1090490649, -1086623314, -1101063739) + + W(3, -1084449173, -1094725676, -1097837640, -1097461352) + + W(4, 1049253908, 1028859267, 1040872136, 1068918685) + W(5, 1059458719, 1057886934, 1044653558, 1048946351) + + W(6, 1039097715, 1017948777, 1025770233, -1115616742) + W(7, -1104116690, -1132647657, 998082042, 1030833130); + sum2 = + W(0, 1038545045, -1104316542, -1098913527, 1054073276) + W(1, 990615436, -1111960943, -1127436605, -1131799749) + + W(2, 1044965772, -1073797636, -1069601753, 1079919017) + + W(3, 1065620582, -1103381017, 1039512539, -1105195767) + W(4, 1038508364, -1092377302, 1050236814, 1044931722) + + W(5, 1034922622, 1033398315, -1113162193, 1039327537) + W(6, 1032278560, -1115941315, -1109127211, 1042591612) + + W(7, 997021068, 1042220416, -1138197651, -1121388557); + WS(-1090505151, -1074550453); + sum1 = W(0, -1112838599, 1028498739, 1023419227, -1117182312) + + W(1, 1018948122, -1126145258, 1024711581, -1125422420) + + W(2, -1106878250, -1103427629, -1088602192, -1088941275) + + W(3, -1087514842, -1096920942, -1096615233, -1095073209) + + W(4, 1057615003, 1042960070, 1063645564, 1053033883) + W(5, 1058641540, 1043052986, 1050742275, 1053972531) + + W(6, -1131143051, 1023192930, -1096958907, 1048242260) + + W(7, -1098164287, 1045189988, -1105551137, 1026824959); + sum2 = W(0, 1051549752, 1081443218, 1072492444, 1048388769) + + W(1, 1035162847, -1139079606, -1121149576, -1123800689) + + W(2, 1021553919, -1111116920, -1073777225, -1067599847) + + W(3, -1096587672, 1029232562, -1115288719, 1042218632) + + W(4, -1106404197, 1044837835, -1113676512, -1089379201) + + W(5, -1109546151, 1030543674, -1122606689, -1125599605) + + W(6, 1031994963, -1113046369, 1032624041, 1025956540) + + W(7, 1027498280, -1132168419, 1034044071, -1115044631); + WS(1051119487, 1041244378); + sum1 = W(0, -1124974044, 1028120435, 1048876359, 1037118035) + + W(1, -1131477080, -1118427428, -1120234265, -1125985859) + + W(2, -1137238551, -1113671305, 1036964902, 1061504071) + W(3, 1047204942, 1050660570, 1030267847, 1049717597) + + W(4, -1116593698, -1103177170, -1099611151, -1104164974) + + W(5, -1081804989, -1114906180, -1098831475, -1103929310) + + W(6, -1121323393, 1033078132, -1156053771, -1129960608) + + W(7, 1048068278, 1011539382, 1035846233, -1115091743); + sum2 = W(0, 1018090488, -1104952272, -1105226064, -1128161694) + + W(1, -1134153828, 1024328280, -1118410723, -1117225997) + + W(2, 1027537220, 1048078363, 1055192952, -1102612387) + + W(3, -1102761937, -1101688104, 1035228556, 1016223417) + + W(4, 1019973834, -1095697091, -1101823824, 1074095781) + + W(5, -1074759173, 1063478353, -1092594125, 1041310640) + + W(6, -1117503915, 1045164128, -1106818318, -1087428157) + + W(7, 1061969021, -1092430375, 1050476000, -1110796930); + WS(1062303263, 1031082743); + sum1 = W(0, -1113216195, -1099215391, 1052151297, 1026092610) + + W(1, 1051942565, -1098039588, -1101893697, 1008063218) + W(2, 1050954912, 1012178225, 1065129152, 1047492794) + + W(3, 1063700475, 1049517720, 1028060738, 1054989200) + + W(4, -1095964628, -1095180416, -1088785601, -1089641431) + + W(5, -1089295544, -1091476104, -1102410709, -1096414030) + + W(6, -1121789260, 1027015379, 1041954507, -1107401421) + + W(7, 1049634587, -1112964196, 1035520455, -1114231491); + sum2 = W(0, 1033145987, -1111827051, -1103256184, -1063595607) + + W(1, -1101985731, -1141099147, -1136421288, 1030655939) + + W(2, -1175661064, -1152013649, 1050523165, 1084357731) + + W(3, 1048919805, 1025442742, -1145624409, -1133270551) + + W(4, 1021827842, -1104895942, 1034611383, -1094652398) + + W(5, 1029250458, -1102082303, 1021034188, -1121842648) + + W(6, -1165845202, -1187919119, -1125020091, 1042933311) + + W(7, -1108910008, 1040766920, -1126731425, 1017996705); + WS(1057958943, -1104691893); + sum1 = + W(0, -1111014615, -1128240917, -1146251723, -1095236657) + W(1, 1047913107, -1103203951, 1033356080, 1023941889) + + W(2, -1105424217, 1046008396, -1090082375, 1054329938) + W(3, 1003615948, 1013130820, 1044802714, -1101796865) + + W(4, 1044401084, -1100901945, 1057785284, 1040293502) + W(5, -1099597392, 1051440085, -1102604718, 1036253756) + + W(6, -1118336456, 1038452148, -1119525902, -1093887914) + + W(7, 1045607070, -1107674167, -1113361665, 1037874639); + sum2 = + W(0, 1010987018, -1105807463, -1102396693, 1054217500) + W(1, -1123211893, 1029628166, -1106898625, 1028744914) + + W(2, 1041119120, -1111572952, -1117220749, -1087890507) + + W(3, 1070205457, -1101117061, -1113015450, -1121743361) + + W(4, -1110188142, 1045029856, 1057260834, -1087358521) + + W(5, -1081682663, 1051101181, 1042553654, -1135525482) + W(6, -1127404253, 1029477872, 1019931869, 1056265374) + + W(7, -1091128546, -1124058781, 1025549544, 992401866); + WS(1063883327, -1171419961); + sum1 = W(0, -1131801844, 1021098616, 1022023532, -1121742227) + + W(1, -1090925859, 1024490200, -1102607801, -1123544461) + + W(2, 1049833398, -1123871229, 1009731296, 1044941350) + W(3, 1060653970, 1043051923, 1048967870, 1050859794) + + W(4, -1102183011, -1097479398, 1056730033, 1041013425) + + W(5, -1095529687, -1097251239, -1104750961, -1097963532) + + W(6, -1101850371, 1031224740, -1123343997, -1127214008) + + W(7, -1107029405, 1042080318, -1107657120, 1009310536); + sum2 = W(0, -1106082604, 1041248381, -1132935321, -1106587714) + + W(1, -1104172881, -1118244665, -1115368488, -1139264801) + + W(2, 1047581965, -1108094251, -1111186257, 1050591326) + + W(3, 1039028256, 1025922877, -1111866155, -1104769894) + + W(4, -1097195715, -1105642610, 1042983438, 1048334662) + + W(5, 1046273630, -1128737701, 1044426238, -1122157893) + + W(6, -1113941985, -1131232309, 1050509566, -1103031697) + + W(7, -1127691207, -1115007353, -1112751356, 1031938310); + WS(1064944927, 1037595256); + sum1 = W(0, -1116864018, 1023806679, 1017115436, 1009660557) + + W(1, 1028149000, -1109610248, -1148661421, -1102752831) + + W(2, -1089228760, -1095304482, -1087165700, -1086682215) + + W(3, -1088874517, -1099761351, -1116139780, -1131587330) + + W(4, 1063040538, 1057549004, 1060715233, 1064233001) + W(5, 1056983460, 1052917089, 1041500021, 1045020525) + + W(6, -1107296590, -1106875789, -1103245163, -1106392275) + + W(7, -1132085516, -1107160974, -1129006079, -1152394658); + sum2 = + W(0, 1045832950, -1110716731, 1025147898, -1098226948) + W(1, -1099749141, -1098250414, 1042544569, -1089530617) + + W(2, -1084008560, 1049995423, -1089165996, 1066542501) + W(3, 1049362032, 1055260506, -1086997229, 1067285885) + + W(4, -1084775302, -1093173621, 1054478967, 1068786857) + + W(5, 1047038722, -1126019654, -1127724076, -1088213452) + + W(6, 1058474163, -1102301410, -1128684365, 1031931484) + + W(7, -1091779956, -1105326436, 1053449115, -1090548395); + WS(-1082101344, -1089856493); + sum1 = W(0, 1050831902, -1112019073, 1030303546, -1129997454) + + W(1, -1110327174, -1117704076, -1112251093, -1131596868) + + W(2, -1105691402, 1030717682, 1055521064, 1064695661) + W(3, 1061962758, 1058754169, 1047731210, 1056158989) + + W(4, -1101015969, -1098775681, -1097748442, -1085520515) + + W(5, -1086646154, -1089610799, -1093958751, -1094349907) + + W(6, 1029275441, -1120813832, -1139280937, 965412887) + + W(7, 1041358014, -1122362798, 1028938947, 1016935004); + sum2 = + W(0, -1065128139, -1076824095, 1067439244, 1079260085) + W(1, 1056740148, -1103928218, -1135208116, 1039164015) + + W(2, -1101130808, 1050826865, 1046966330, 1049869634) + W(3, 1051236860, -1114183173, 1033256035, -1104627926) + + W(4, 1034565987, -1109355365, -1109830496, -1112614302) + + W(5, -1123646153, 1051726295, 1035002893, -1109091637) + W(6, -1119435550, 1023890205, 1012867020, 1015248786) + + W(7, -1122661198, -1136992532, -1119472799, -1136910724); + WS(-1090711679, 1035967541); + sum1 = W(0, -1111795270, 1015715144, -1118064815, -1124564760) + + W(1, 1033380937, 1041725555, 1039158191, 1036708611) + + W(2, -1104454427, 1029360119, -1084526809, -1083278737) + + W(3, -1083950349, -1091233609, -1102432923, -1097260861) + + W(4, 1050513973, 1050454265, 1063535365, 1060834888) + W(5, 1050327592, 1054941014, 1040417584, 1042099839) + + W(6, 1030482278, -1138269301, -1132452908, 1007072853) + + W(7, 1028355007, 1029566323, -1140656289, 1035976950); + sum2 = W(0, 1030795338, -1104698754, -1086482027, -1086674278) + + W(1, 1048689193, -1101252049, -1127107620, -1097010897) + + W(2, -1099705557, -1088930785, -1087114188, 1063363970) + + W(3, 1066258058, 1055138353, -1113111809, 1050900036) + + W(4, -1100315818, -1129318753, -1088371087, 1059258270) + + W(5, 1052412907, 1035784301, -1107499570, 1046424313) + W(6, -1124401732, 1047822852, 1041847465, 1007827043) + + W(7, -1114489829, 1039056173, 1036879119, -1112035485); + WS(-1098505599, -1075865372); + sum1 = W(0, -1119631078, 1024188415, -1125460739, -1113150415) + + W(1, -1098117352, 1028789822, -1115205937, -1134520549) + + W(2, -1131715643, 1032178901, 1056750314, 1055366257) + W(3, 1063530169, 1038512989, 1036256496, 1042179631) + + W(4, -1121509433, -1128987132, -1131145214, -1096447994) + + W(5, -1086227497, -1117796833, 1016180195, 1032402616) + + W(6, -1113178620, 1024883696, -1114020928, -1102601578) + + W(7, -1111953177, -1101470933, -1141768534, -1114797153); + sum2 = W(0, -1098762498, -1112826554, -1099883844, -1090598021) + + W(1, 1060690639, -1101866176, 1051055486, -1111565268) + W(2, 1039073687, 1047439072, 1024348972, 1068429254) + + W(3, -1078855206, 1052294530, -1095975199, 1034134076) + W(4, 1035541163, 1032611741, 1050751610, 1066295533) + + W(5, -1081223881, -1097770507, -1126362074, -1121819739) + + W(6, 1030962008, 981436096, 1048715774, -1089341195) + W(7, -1094541311, 1041458546, 1044471119, 1024624177); + WS(1057165023, -1106509195); + sum1 = W(0, -1110663097, 1023353031, 1009641338, -1116674588) + + W(1, -1121179137, -1127866586, 1019708412, -1105922998) + + W(2, -1090373040, -1094296089, -1087820187, -1090764772) + + W(3, -1101809276, -1095695571, -1097119704, -1088811352) + + W(4, 1057389257, 1051297995, 1064196683, 1064337073) + W(5, 1058239248, 1053143796, 1049182394, 1042633923) + + W(6, 1036322023, -1110472134, -1103525103, -1108191858) + + W(7, -1105116828, -1130262917, -1117889432, 1047174317); + sum2 = W(0, -1112942365, 1048482322, -1100072975, -1097118067) + + W(1, 991349250, -1108096389, 1053525633, 1000921969) + W(2, -1106822390, -1115190843, 1034045428, 1068163863) + + W(3, 1063618710, -1107942623, -1090492700, -1076676559) + + W(4, -1102090209, 1042851055, -1103979279, 1056641862) + + W(5, -1105663689, 1049912171, -1130278628, -1111476815) + + W(6, 1043730009, 1035412483, -1105576965, 1028572696) + + W(7, -1113934073, -1105853831, 1039916278, -1106999228); + WS(-1086493375, -1079336981); + sum1 = W(0, 977772865, -1123924042, -1109993624, -1107908519) + + W(1, 1036636329, 1038934102, 1034769240, -1099048778) + + W(2, -1102983835, -1108602044, 1041059645, -1094902379) + + W(3, -1083260999, -1084987377, -1102484540, -1108629750) + + W(4, 1026410857, -1098146918, -1106936850, 1061697492) + W(5, 1061962303, 1057432285, 1051050960, 1050989872) + + W(6, 1015269519, 1049374456, 1036994068, 1041174790) + + W(7, -1103125248, -1125738921, -1130650164, 1040252563); + sum2 = W(0, -1104970914, 1018133697, 1040842491, -1093587851) + + W(1, -1093237537, -1102375178, -1099804326, 1054809337) + + W(2, 1042634099, -1097448347, 1055662701, 1074010545) + + W(3, -1089724369, -1099392752, 1049771835, -1092159031) + + W(4, 1052960430, -1108255972, 1062139198, 1064732329) + + W(5, -1083390778, 1025575413, -1104347883, -1096888027) + + W(6, -1112577728, -1096543501, -1090800341, -1093194079) + + W(7, 1015865539, 991452982, -1126119433, 1028159711); + WS(-1088469887, 1068090411); + sum1 = W(0, -1113244581, -1123900274, 1049496346, -1110903326) + + W(1, -1119953152, 1031904934, 1034227191, 1025939062) + W(2, 1001301201, 1023861926, -1082959002, 1050701400) + + W(3, 1060902689, 1043052181, 1043817559, 1038313117) + W(4, -1115331947, 1035790701, 1057295251, 1048296635) + + W(5, -1081663133, -1113327662, -1110964279, 1034951606) + + W(6, -1124374314, -1105829923, -1096521435, -1119292644) + + W(7, 1048590454, 1027826066, -1106468266, -1117293966); + sum2 = + W(0, 1046922708, 1033420508, -1112865289, -1096930035) + W(1, -1101802092, 1017341032, 1036773342, -1107450994) + + W(2, -1106472578, -1114867820, -1087802072, 1058113813) + + W(3, 1050476308, -1103417477, -1105807138, 1033379085) + W(4, 1033443280, -1109208012, 1020845388, 1048730658) + + W(5, 1059721445, -1107242470, -1136542442, -1104249476) + + W(6, -1111979165, 1050643686, -1101832932, -1129026525) + + W(7, -1104558996, -1135034393, 1037376476, 1023773731); + WS(1052578175, -1092643724); + sum1 = + W(0, -1106584961, 1030893452, 1033955624, 1037358070) + W(1, 1036710537, -1128189432, -1118327615, -1129060558) + + W(2, -1102735475, -1100779014, -1082492039, -1086815439) + + W(3, -1088009424, -1095075429, -1106908643, -1102841939) + + W(4, 1053304083, 1049737317, 1060101900, 1065824329) + W(5, 1041943502, 1057719155, 1051335460, 1036237087) + + W(6, 993436516, 1037510015, -1101687426, -1103135573) + W(7, 1029815263, 1040440469, -1106074638, 1027836379); + sum2 = W(0, -1115440098, 1029771501, 1018065220, 999202537) + W(1, 1036811205, -1111720654, -1125064265, 1019498859) + + W(2, 1015710974, 1033337736, -1094728975, 1039453548) + W(3, 1050012979, 1032576025, -1103861773, 1040788513) + + W(4, 1041402597, -1114856806, 1037520917, 1064530169) + + W(5, -1094040689, 1073761042, 1063409170, -1090935047) + + W(6, -1130229431, 1034787000, -1082769104, -1074584982) + + W(7, -1090370130, 1032162938, -1105633547, 1034133532); + WS(-1104397694, 1058392920); + sum1 = W(0, 1012876448, -1126111401, -1142522206, -1115125816) + + W(1, -1103048369, 999529969, 1016404519, -1117545451) + W(2, 1051523414, 1050625047, 1043902243, 1063861817) + + W(3, 1056801600, 1053396405, 1042081404, 1054067798) + + W(4, -1094911217, -1106828476, -1089440467, -1093833780) + + W(5, -1087921625, -1107310585, -1104958721, -1097217844) + + W(6, 1023486907, 1033392977, -1119682235, 1019625524) + + W(7, -1096529922, 1015514383, 1039287934, -1113687714); + sum2 = W(0, -1130009672, 1027809153, -1106384796, 1051460883) + + W(1, -1104521112, 1033821004, -1112259960, 1028508475) + + W(2, 1013515790, -1106180134, 1042067106, -1094561503) + + W(3, 1032257325, -1124940473, -1168427353, -1120291522) + + W(4, 1013756514, 1023886448, 1052609397, 1078005003) + W(5, 1072194837, -1094906083, 1046140857, -1140922271) + + W(6, -1153587550, 1024050371, -1094102229, -1070026280) + + W(7, -1075632186, 1053282219, -1098407638, 1033718481); + WS(1063327007, -1121248448); + sum1 = W(0, 1017612078, 1043030576, 1039059525, -1115811128) + + W(1, -1095615210, -1099887459, -1140707177, -1120397682) + + W(2, -1113236667, -1096763312, -1091103118, 1053297652) + + W(3, 1063340055, 1054079124, 1041492110, -1126620524) + W(4, 1042967269, 1049218219, 1058517677, 1033504868) + + W(5, -1082785422, -1088587000, -1101731443, 1029718569) + + W(6, 1035231217, -1115130868, -1107367965, 1009543939) + + W(7, 1047061435, 1042859328, -1120288724, -1104957341); + sum2 = W(0, 1037909727, -1098298527, -1126569464, -1106955476) + + W(1, -1096969233, -1118592354, 1042882430, 1037216424) + + W(2, -1119813454, 1048025725, 1041835288, 1067026849) + + W(3, -1085288934, 1042571631, -1117602980, -1116313332) + + W(4, -1099212072, 1045330821, -1106229244, 1067954224) + + W(5, -1095495837, -1108169766, -1164085849, -1100305071) + + W(6, 1032936033, -1097673782, -1109675885, -1092590328) + + W(7, 1004812688, -1096486003, 1034064234, 1045459772); + WS(-1114652667, 1051933605); + sum1 = W(0, 1026700110, 1037508767, -1128033780, 1034155035) + + W(1, -1102462575, 1024543544, -1147042251, 1032374633) + + W(2, -1102428549, -1105027032, -1106431647, 1043250735) + + W(3, 1059213449, 1038435705, 1038748492, 1016229610) + W(4, 1043087092, 1048715843, 1062796090, -1089603768) + + W(5, -1090890112, -1106007014, -1119096106, -1104514210) + + W(6, -1109604752, -1113263092, -1098797270, 1023780992) + + W(7, -1112475685, -1121524254, 986589794, 1007891224); + sum2 = W(0, -1129141996, -1106880495, 1031191254, -1102244397) + + W(1, -1101040753, 1046080919, -1112883155, 1031234782) + + W(2, 1043866561, -1096921120, -1123077406, 1064276171) + + W(3, 1061828176, -1095750750, 1042185570, -1128566730) + + W(4, 1029019378, -1092013580, -1086673510, 1064706574) + + W(5, -1113110329, -1091369762, 1042119352, -1105256367) + + W(6, 1050935854, -1111274547, -1096956427, -1115781076) + + W(7, -1106057540, 1029696990, -1113619581, 1012473722); + WS(1059465279, -1101420399); + sum1 = W(0, 1033088680, -1124176798, 1014063089, 1035053989) + + W(1, 1045820204, 1038292302, -1115007182, -1131477704) + W(2, 1043444330, 1000916382, 1057398923, 1034190184) + + W(3, -1087528660, 1036787650, 1027988010, 1042732770) + + W(4, -1101682761, -1126261266, -1089602004, 1039770557) + + W(5, 1057859064, -1106381771, -1104773247, -1102530758) + + W(6, -1124073107, -1118729178, 1032573720, -1114558729) + + W(7, -1096323421, 1041172764, 1024683157, 1029511616); + sum2 = W(0, -1093261173, -1100338012, 1016590929, -1160318928) + + W(1, -1111261089, 1032510827, 1037987285, -1106728517) + + W(2, -1081648717, -1096055698, 1049309077, 1060463741) + + W(3, -1123677731, 1042247124, 1035681279, 1035240533) + W(4, -1107343332, 1016623505, 1058913944, 1061699617) + + W(5, -1095509190, 988275856, -1111758125, 979544481) + W(6, 1020947921, -1121572837, 1035038069, -1121635630) + + W(7, -1116667427, -1130213341, 1033159595, -1112486763); + WS(1060076127, 1072958059); + sum1 = W(0, -1103118654, 1043365506, -1115420333, 1031523031) + + W(1, 1033412302, 1032254402, 1031863013, -1127560355) + + W(2, -1090537599, -1097065432, -1086314390, -1088162978) + + W(3, -1089193875, -1091959462, -1111327644, -1086013855) + + W(4, 1060753617, 1046496158, 1060760746, 1055888777) + W(5, 1052645932, 1054239287, 1044639698, 1056703661) + + W(6, -1129584897, 1025963976, -1106610556, 1040410096) + + W(7, -1138875303, 1032279415, 1032182482, 1044337291); + sum2 = W(0, 1034238418, 1026722605, -1123083006, 1044566349) + + W(1, -1114043742, 1029836970, -1124457715, -1112207598) + + W(2, -1122429687, -1113650971, -1101416602, -1095747837) + + W(3, 1044375513, 1032414162, -1132025334, -1112893824) + W(4, 1038471498, 1047703041, 1050567163, 1073798913) + + W(5, 1074668356, 1076147895, 1076524889, 1071535287) + + W(6, -1105287037, -1106809975, -1099784158, -1077245954) + + W(7, -1072322090, -1070521946, -1071353549, -1076180558); + WS(-1114470395, -1114976351); + sum1 = W(0, 1017446070, 1040990896, -1129681934, -1120446036) + + W(1, -1097641691, -1110115727, -1110184487, 1033457695) + W(2, 991904560, 1041627584, 1047992216, 1061349282) + + W(3, 1061559014, 1055187519, 1045114861, 1047040436) + + W(4, 1034584479, -1107221597, -1115356259, -1083497834) + + W(5, -1089507216, -1098995485, -1109668803, -1107186297) + + W(6, -1110976571, -1099251857, -1111571481, 1039733326) + + W(7, 1036247843, -1114440077, -1115117640, -1120899067); + sum2 = + W(0, -1093678598, 1002676269, 1055748356, 1044340647) + W(1, -1118111722, -1120084888, 1001595675, -1123642691) + + W(2, -1084434022, 1057422860, 1066493380, -1079318791) + + W(3, -1116089022, 1044705221, -1112694927, 1031220790) + + W(4, 1064533419, 1067683118, -1078621547, -1079939901) + W(5, 1054002901, 1039926847, -1112070298, 1023903081) + + W(6, 1042743345, -1108978134, -1117769694, 1015093293) + W(7, 1049699290, 986467602, -1107171922, 1037662763); + WS(1048785023, 1039045299); + sum1 = W(0, -1104130562, 1043168659, -1117502116, 1029857553) + + W(1, 1034838603, 1027207566, 1024393315, -1130533431) + + W(2, -1090140327, -1100442863, -1085428843, -1093347651) + + W(3, -1089406196, -1093521697, -1120775857, -1086838999) + + W(4, 1061197562, 1040570004, 1062309944, 1050495728) + W(5, 1050259320, 1054560318, 1039464338, 1056208688) + + W(6, -1133671882, 1032880081, -1102819715, 1038995485) + + W(7, -1127149063, 1026681976, 1035433414, 1041402190); + sum2 = W(0, -1118465298, 1011712973, -1128433260, 1029767219) + W(1, 1021354231, 982009542, 1014788797, 1033540398) + + W(2, -1142302474, 1025023956, 1041730218, -1097771962) + + W(3, -1094677866, -1122047812, 1028525757, 1020814500) + + W(4, -1114395216, -1104707163, -1095905892, -1080533844) + + W(5, -1075595300, -1072373863, -1072719492, -1078361330) + + W(6, 1037219807, 1039062755, 1046574176, 1069124140) + W(7, 1073795377, 1075522683, 1074436097, 1068741752); + WS(1040594174, 1002085105); + sum1 = W(0, 1041861603, -1097746587, 1032164980, 1031577622) + W(1, -1102982955, 1044101411, 1034678964, 1026039088) + + W(2, -1113198522, 1055071640, -1088672026, 1050744420) + + W(3, 1057599999, -1103363988, 1036351259, 1034848362) + + W(4, -1137236930, -1100468781, 1047493466, -1105375081) + + W(5, -1087672398, 1050064611, -1102178050, 1033863059) + + W(6, 1041085614, -1121524679, -1109849488, 1048884604) + + W(7, -1113508732, -1098107838, 1043931332, -1106488144); + sum2 = W(0, -1099743490, 1035577370, -1115293072, -1102421679) + + W(1, 1038726510, 1032210717, -1107407193, -1120037205) + W(2, 1011906269, 1026663055, 1057096352, 979639118) + + W(3, 1044440375, 1032214892, 1028754425, -1123040177) + + W(4, 1037961444, -1152297667, -1095995741, 1050233559) + + W(5, 1022991474, -1139108605, -1115369483, -1104470915) + + W(6, -1108436276, 991169347, 1045881501, -1097952901) + + W(7, -1122343653, 1026937641, -1105994898, 1022469878); + WS(1066613200, -1123971367); + sum1 = W(0, 1021072883, -1125712504, 1041158633, -1106077125) + W(1, 1036847484, 1032267227, 1016782186, 1031886911) + + W(2, -1096708150, -1090955664, -1159875842, -1079911082) + + W(3, -1093258685, -1103560179, -1089925031, -1106725252) + + W(4, 1051074184, 1051398158, 1058934814, 1061682240) + W(5, 1055629981, 1054180539, 1052861897, 1047227273) + + W(6, 1026036124, -1108624754, 1040756057, -1090753503) + + W(7, -1114271443, 1025501945, -1105228376, 1043536294); + sum2 = W(0, -1120579723, -1104595791, 1060943463, -1081375340) + + W(1, 1048074442, 1049316438, -1088959333, 1054216959) + + W(2, -1102098813, 1059079365, -1078775742, 1070420847) + + W(3, -1106373275, -1084015554, 1065759760, -1087995034) + + W(4, -1103583809, 1035649855, 1055196914, 1036446407) + W(5, 1050043459, 1050724789, -1088425301, 1052608338) + + W(6, 1039910130, -1110832147, -1115424415, -1092581761) + + W(7, -1101688097, -1115969635, 1051846236, -1103333947); + WS(1015488492, -1082266482); + sum1 = W(0, -1115294884, 1041881447, -1116482020, 1028536641) + + W(1, 1044897017, -1108243791, 1033207234, 1015505847) + + W(2, -1096364772, 1036768790, -1083421327, -1079950554) + + W(3, -1088856963, -1096513911, -1104622888, -1096156044) + + W(4, 1054950795, 1051075280, 1062057653, 1057564011) + W(5, 1054170231, 1056273768, 1056919206, 1054606378) + + W(6, -1109722877, 1018280484, -1105734603, -1124656723) + + W(7, -1129161159, -1113027740, -1132093050, 1025701004); + sum2 = + W(0, -1103335141, -1087173612, 1045744538, -1106751239) + W(1, -1089877767, 1054342226, 1047940388, -1120076732) + + W(2, -1123809016, -1080484881, 1068142929, 1065979347) + + W(3, 1048007586, -1086806497, -1098712592, -1082944418) + W(4, 1056172663, 1047550056, 1051886373, 1064817240) + + W(5, 1065470183, -1098340366, -1102735881, -1088981287) + + W(6, -1093357581, -1112078382, -1102262951, -1097769156) + + W(7, -1095892093, 1033891425, -1105000175, 1059622670); + WS(-1089551423, -1072840444); + sum1 = W(0, 1041019406, 1022173115, -1113297010, 1015463395) + W(1, -1103473726, 1040814976, 1007312016, 1029778436) + + W(2, 1055991358, 1057526040, 1036785718, 1059475300) + W(3, 1056836657, 1050051043, 1050846086, 1053584058) + + W(4, -1086576149, -1100702364, -1093552675, -1089572736) + + W(5, -1091007140, -1090411145, -1098618125, -1097362556) + + W(6, 1027645528, -1141651861, 1016689751, 1031793146) + + W(7, -1125097480, 1041821422, 1015074267, -1104623366); + sum2 = W(0, 1069423067, 1072187327, 1072064387, 1072314518) + W(1, 1066704589, 1063804587, 1053139391, 1042659879) + + W(2, -1076703167, -1073855626, -1079134619, -1077864031) + + W(3, -1081021850, -1081933355, -1094622730, -1099654949) + + W(4, 1041694716, -1115348910, -1107764634, -1089838794) + + W(5, 1036250076, 1028352388, -1114321992, 1035224325) + W(6, 1032293264, 1008297781, -1120515458, 1037018177) + + W(7, -1121141704, 1025803257, -1123317222, 1027779018); + WS(1053893247, -1106302313); + sum1 = W(0, 1031892188, -1110506435, -1127073177, 1047997302) + + W(1, 1033243951, -1107646187, -1112186286, -1112631434) + + W(2, 1044357278, 1051962248, 1061666784, 1064449402) + W(3, 1041901099, 1053582704, 1037482077, 1050110011) + + W(4, -1093335703, -1098499127, -1085429924, -1082436051) + + W(5, -1118050391, -1104422127, -1118004236, -1103845867) + + W(6, -1124627014, -1121076939, 1038775118, 1042378233) + + W(7, -1100759903, -1107823800, -1134911574, -1111029158); + sum2 = + W(0, 1045534781, -1136883904, 1027794169, -1091599460) + W(1, -1105954111, -1110353364, 1026306116, -1105327762) + + W(2, -1106914963, -1105365809, -1087950271, 1049402813) + + W(3, 1059435817, 1056244223, -1106437513, 1049633694) + W(4, -1093884354, 1058094665, -1076257974, 1070891205) + + W(5, 1057695328, -1096007662, 1042940020, 1019026622) + W(6, 1048929407, -1099297773, 1057853479, -1101014716) + + W(7, -1088483015, -1116753268, -1107558514, -1111740866); + WS(1043803134, 1031905225); + sum1 = W(0, -1113675573, -1137620096, 1045527725, 1047471777) + + W(1, 1025442024, -1101766076, 1041363873, -1104559247) + W(2, 1045344728, 1015450714, 1036603287, 1057861093) + + W(3, 1007995990, 1048683192, -1103914745, 1053784172) + + W(4, -1093561052, 1039772705, -1087612823, -1131204708) + + W(5, -1109713128, -1098589181, -1142310312, -1096789826) + + W(6, -1125193272, -1142985628, 1043570724, 1032608022) + + W(7, -1125123818, 1017746514, -1137687994, -1120823545); + sum2 = W(0, -1102611800, 1042572795, -1143715563, 1047906835) + + W(1, 1034463821, -1097650393, 1044772028, -1105069125) + + W(2, 1052608919, -1112317124, 1036000712, 1058925768) + + W(3, -1089628524, -1097284017, -1090965565, 1053414419) + + W(4, -1092971881, 1050084573, -1099050864, 1062269077) + + W(5, -1100033854, -1155008883, 1043620595, -1099181286) + + W(6, 1033368250, -1099740129, 1046340985, -1106615878) + + W(7, -1143169701, 1034459058, -1102441858, -1145018737); + WS(1065606800, 1041895077); + sum1 = W(0, 1041785011, -1113293285, 1031552121, -1114204019) + + W(1, 1014586031, 1032452466, -1103346054, 1025447425) + W(2, 1041397665, 1050236482, 1063682744, 1055253222) + + W(3, 1057927896, 1054837340, 1043307490, 1058487624) + + W(4, -1108226929, -1089967688, -1092426598, -1085544687) + + W(5, -1092878524, -1094102329, -1097746379, -1098262983) + + W(6, -1113822832, -1105474774, 1045393909, -1106251932) + + W(7, 1018782386, -1135035573, -1114747425, -1119448485); + sum2 = W(0, 1038489223, 1032193624, -1137158564, 1048862753) + + W(1, -1107218869, -1112577633, 1034028859, -1110240510) + + W(2, -1094743304, -1106563024, 1029053577, -1103121169) + + W(3, 1018988618, 1015522148, -1107822714, 1017646246) + + W(4, -1079775068, -1075431018, -1075905408, 1061439417) + + W(5, 1061842524, 1055667456, 1032002642, 1047594841) + W(6, 1069957645, 1074314813, 1067854461, -1090496129) + + W(7, -1083145579, -1093776696, 1038458963, -1100108785); + WS(1050857279, 1035401177); + sum1 = W(0, 1029370009, -1121232094, -1118971861, -1116554354) + + W(1, -1102118870, 1035949272, -1118591397, -1155732684) + + W(2, 1049972466, 1045749679, 1054737744, 1064433520) + W(3, 1057059356, 1055161550, 1035470985, 1050840570) + + W(4, -1100844155, -1097541146, -1089471141, -1088203652) + + W(5, -1089223685, -1095333099, -1098430605, -1105548665) + + W(6, -1114359850, -1119608387, 1032044074, 1039513726) + + W(7, 1028806533, 1039358524, -1114373271, -1113669781); + sum2 = + W(0, 1034282103, -1111920318, 1023538768, -1133376386) + W(1, -1119100907, 1014776166, -1117007635, -1121555310) + + W(2, 1040723224, -1118965841, -1128437695, 1038672881) + W(3, 993338648, 1050613235, -1108740075, 1040276790) + + W(4, 1028955705, 1031483971, 1043259383, -1148076972) + W(5, -1084940093, 1050550535, -1098463376, 1054296012) + + W(6, -1104697256, -1123254751, 1034554870, -1078609243) + + W(7, -1075024478, -1100774866, 1069274341, 1072481706); + WS(1059068159, -1095269543); + sum1 = W(0, 1022243158, -1126585055, -1113503115, 1034732162) + W(1, 1029695369, 1045709362, 1005846771, 1049870212) + + W(2, 1058751902, 1052633434, 1061437964, 1062365313) + W(3, 1054753811, 1047783152, 1043895001, -1119990530) + + W(4, -1083015108, -1095802212, -1083734386, -1087136899) + + W(5, -1089074173, -1093733821, -1096742887, -1106170901) + + W(6, 1040310153, 1009201364, 1040208083, -1116554445) + + W(7, 1044292534, -1141695574, 1042140272, -1106848091); + sum2 = W(0, -1110453349, -1118716929, -1111084235, 1027079271) + + W(1, 1058163522, 1060433363, 1058751114, -1077532089) + W(2, 1048158098, -1117235638, 1037169053, 1044450691) + + W(3, -1086959067, -1096141012, -1102281652, 1061563184) + + W(4, 1064329884, -1122504669, 1037379653, -1106426334) + + W(5, -1081956377, -1081432626, -1086790317, 1073667932) + + W(6, -1096499673, 1023790996, 1035642078, -1103100998) + + W(7, 1059064502, -1109003581, 1048822766, -1089552462); + WS(-1079238176, -1098575359); + sum1 = W(0, -1122061272, 1012614613, 1049213476, -1091368434) + + W(1, 1050034455, -1115399887, -1105000541, 1040609063) + + W(2, 1040856756, -1098659523, 1050219649, 1046432350) + + W(3, -1092787824, 1045840143, -1102913028, -1104981396) + + W(4, -1106993315, 1049053518, -1088887964, 1061247706) + + W(5, -1113029435, -1096901418, 1045569657, -1106428832) + + W(6, -1113276757, -1110111537, 1048270483, -1098550683) + + W(7, 1053252708, -1120030007, -1144293604, 1037272948); + sum2 = W(0, 1035271628, 1033447544, -1113618952, -1104023060) + + W(1, 1022009109, -1104458884, 1044684178, -1104406640) + + W(2, -1096995906, 1032410306, 1053850685, 1054515359) + + W(3, -1114408860, 1030897990, -1115683354, -1106540716) + + W(4, -1097624644, 1048740225, -1109777102, 1058355960) + + W(5, -1139294461, -1116975083, -1099524388, 1036671037) + + W(6, 1051183735, -1095652467, 1037584786, -1116173683) + + W(7, -1096371453, 1030595307, -1117706649, -1108415342); + WS(1064155455, 1041078114); + sum1 = W(0, -1114884791, 1038026665, 1040569148, -1123095214) + + W(1, -1113346810, -1098688777, -1106297864, 1033022404) + + W(2, -1133388468, -1103926126, -1088265213, -1088521037) + + W(3, -1094483240, 1052099081, 1038941559, 1027852876) + W(4, 1031759625, 1051074474, 1049866386, 1060913876) + + W(5, 1044072016, 1034732568, -1138713347, 1019301565) + + W(6, -1116707016, -1135572861, -1145284192, -1110455500) + + W(7, -1116167073, 1029730485, 1017022612, 1028095637); + sum2 = + W(0, 1027468398, -1111732215, -1149402831, -1136133524) + W(1, 1058132410, -1084703700, -1103172541, 1011948492) + + W(2, -1120484835, -1115316427, 1042551085, -1101059653) + + W(3, 1067179636, -1093846517, 1015696434, -1119207903) + W(4, 1033713911, -1113615213, 1015721118, 1005178376) + + W(5, -1112798365, 1036573120, 1035924289, -1106241198) + + W(6, 1037828351, -1102210431, 1027887653, -1105049969) + + W(7, 1033627060, -1112780439, 1025169534, 1034168377); + WS(1056869759, -1097268032); + sum1 = W(0, 1018133293, -1105532941, 1027243330, -1097428310) + + W(1, -1099204213, -1133851766, -1138393927, -1118550618) + + W(2, 1036411431, 1007771751, -1116024394, 1032024955) + + W(3, -1130187397, 1034973653, -1114469768, -1118964077) + + W(4, 1039633317, 1034605623, 1050783724, 1010531964) + W(5, 1045069064, 1044277428, 1046520720, 1036629184) + + W(6, -1111689725, -1107937040, -1105991139, -1109581452) + + W(7, -1103861656, 1044990678, -1106353867, -1155661924); + sum2 = + W(0, 1031819015, -1113612713, 1040659447, -1113225510) + W(1, 1023788280, -1115035325, 1009487418, 1023947578) + + W(2, 1040620760, 1045122152, -1122637452, -1080510307) + + W(3, -1103769905, 1050277803, 1041168723, -1112728330) + + W(4, -1130428603, -1113774176, -1093905874, -1073670430) + + W(5, 1040925011, 1074164392, 1056579340, 1044922942) + W(6, -1130628701, -1118722775, 1015363301, -1129641903) + + W(7, 1045479736, 997650792, 1043373785, -1122436477); + WS(1064095487, 1025785067); + sum1 = W(0, 1026371284, -1097495743, 1050378694, 1008396404) + + W(1, 1042871873, -1103138663, -1136206974, 1034556564) + + W(2, -1106851535, 1042476562, -1104849584, -1085976658) + + W(3, -1097042470, -1109264236, 1035073279, -1094929447) + + W(4, -1128892272, 1049973404, -1115675316, 1058008769) + + W(5, -1098054097, 1052615848, 1037088776, 1045135411) + W(6, 1040514533, -1103190740, 1040022019, 1040395090) + + W(7, 1050097558, -1102548473, -1157051795, 1023679636); + sum2 = W(0, -1124722923, -1114618025, 1043439029, 1036363299) + + W(1, -1096133271, 1049502378, -1106999272, 1013819494) + + W(2, 1033420628, -1100145939, -1115804833, 1057589449) + + W(3, 1053618149, -1091358477, 1030436134, -1119548384) + + W(4, -1105442746, 1047309531, -1084852425, -1089136554) + + W(5, 1028964970, 1056312267, -1100909906, 1043379377) + W(6, 1029168594, 1048079041, -1101613108, 1042227257) + + W(7, 1045151454, 1041752672, 1036382707, -1113267324); + WS(1060109055, 1023402244); + sum1 = W(0, 1039025762, -1109278395, -1125210976, -1107337262) + + W(1, -1119314274, 1038278743, -1120902815, 1024999351) + W(2, 1051909299, 1054481389, 1061074499, 1069080830) + + W(3, 991275263, 1049054227, 1043342663, 1051802331) + + W(4, -1098089231, -1093104548, -1087624466, -1092709234) + + W(5, -1085745760, -1093068092, -1102438460, -1098889074) + + W(6, -1107880995, 1018380380, -1167447218, -1119879878) + + W(7, 1030906608, 1028271716, -1122586985, -1107737008); + sum2 = W(0, 995982518, 1033194341, 1038373562, 1040171687) + W(1, -1108098969, 1027047733, -1147696971, 1033796110) + + W(2, 1035578813, -1121421677, 1046888388, -1103362299) + + W(3, 1050255581, -1096418856, 1042040695, -1116244525) + + W(4, -1118279893, -1114972659, 1069469835, 1078927590) + + W(5, -1065023683, -1082214759, 1045909115, -1112457727) + + W(6, -1115504751, -1108849613, 1041670894, 1050450381) + + W(7, -1097423961, -1114805949, 964966831, 1025540676); + WS(-1092049407, -1078216845); + sum1 = W(0, 1019093687, 1030002432, -1100550858, 1055647027) + + W(1, -1103872766, 1041444210, -1115845919, 1042339236) + W(2, 1057591089, 1050969332, 1056027116, 1063070242) + + W(3, 1039049940, 1057957242, 1034942714, 1059965491) + + W(4, -1089127853, -1096074010, -1082843219, -1088645600) + + W(5, -1097545633, -1095349663, -1103665506, -1089209262) + + W(6, -1109784091, 1043174565, -1126191805, 1049441628) + + W(7, -1097650089, 1024042875, -1123963793, -1105758607); + sum2 = W(0, -1086426610, -1096143108, -1089951657, 1062855195) + + W(1, 1068897447, 1074016711, 1075026151, 1074160921) + W(2, 1062347208, 1055082976, 1045157118, 1048769854) + + W(3, -1073459143, -1078468086, -1071781830, -1072043968) + + W(4, 1053593730, -1101252044, -1111940928, 1037201995) + + W(5, -1091098547, -1119407664, 1031118734, -1095931446) + + W(6, -1108806990, -1138780047, -1099705126, 1058343455) + + W(7, -1094950430, 1046274438, -1128975824, 1035271906); + WS(-1092377983, 1032564911); + sum1 = W(0, 1026968586, 1001025293, -1101464865, -1099757657) + + W(1, -1099131534, 1021990836, -1124857771, 1016095931) + + W(2, 1051240140, -1135919542, 1047585891, 1046337282) + W(3, 1042168181, 1042765483, 1039475666, 1031087233) + + W(4, -1140824311, -1114206145, 1035412731, -1093593858) + + W(5, 1042300945, -1105010841, -1129901419, -1150842169) + + W(6, -1108814006, 1031981930, -1105914151, -1111723206) + + W(7, -1114245051, 1047084274, -1110153104, 1021006644); + sum2 = W(0, -1152594313, -1114711758, -1122222477, -1119994373) + + W(1, -1117872135, -1136114154, -1118889611, -1120239593) + + W(2, -1103837493, -1102219265, 1021928584, 1043085394) + + W(3, -1098150014, -1114380427, -1103586212, 999997765) + + W(4, -1119502913, 1049238470, 1051353268, 1069806319) + + W(5, 1040245198, -1084770114, -1097500544, 1032457879) + + W(6, 1035550709, -1111809635, 1038283603, -1113383091) + + W(7, 1038911980, -1106271331, -1109409577, -1130668925); + WS(1066805616, -1146277627); + sum1 = W(0, -1135230785, -1149155717, 1034010150, 1042337650) + W(1, -1127867356, 1036367663, 1011804270, 998521116) + + W(2, -1097679853, -1106566573, -1092037473, -1085421897) + + W(3, -1091217395, -1094061036, -1108406741, -1096997053) + + W(4, 1046488473, 1047676826, 1047117051, 1062693860) + W(5, 1049537116, 1056189429, 1017502967, 1049188263) + + W(6, 1036204713, -1098488427, -1103697017, 1057957971) + + W(7, -1114566390, 1034870184, -1103604141, 1029261884); + sum2 = W(0, -1122819855, 1029215207, -1109976389, 1044451524) + + W(1, -1130065951, 1027965847, -1119702735, 1036873692) + + W(2, 1035645255, -1111163705, 1026839491, -1095838714) + + W(3, -1147512571, -1156411358, -1110332882, -1114357123) + + W(4, -1107161682, 1019166485, -1129473215, 1082201538) + W(5, 1052773623, 1033233466, 1034307583, 1001850219) + + W(6, 1042480496, -1107159841, -1115971786, -1067229991) + + W(7, -1091650896, -1142132409, -1107215185, 1025815163); + WS(1040205182, 1040987841); + sum1 = W(0, 1032709552, 1028035406, -1152624047, 1047238622) + + W(1, -1110798127, -1160283945, -1129145589, 1035307633) + + W(2, 1050828331, 1054299632, 1000765841, 1064828620) + W(3, 1059217829, 1057730984, 1050797759, 1040620053) + + W(4, -1098789018, -1102534446, -1087146945, -1084918512) + + W(5, -1080798168, -1094152707, -1154982570, -1104995442) + + W(6, -1130845956, -1131566290, 1024089890, 1044521480) + + W(7, 1041701723, -1105870556, -1121779940, -1110323595); + sum2 = W(0, -1104834685, -1098615503, -1090508283, -1080862372) + + W(1, 1048874616, 1063492499, 1035824034, 1062512173) + W(2, 1039834326, 1050496819, 1045914856, 1070974917) + + W(3, -1085801376, -1081343708, 1033985362, -1089072248) + + W(4, 1040649104, 1034170750, -1118657109, -1102559609) + + W(5, 1041220807, 1047362948, -1099586035, -1130222490) + + W(6, -1113573633, -1119108596, -1128160390, -1095002000) + + W(7, 1053594264, 1022825140, 1041895669, -1115149866); + WS(-1087487423, 1060332710); + sum1 = + W(0, -1105878689, 1042437466, 1040585322, -1121111477) + W(1, -1112195269, -1112892785, -1122925576, 1012646976) + + W(2, -1095746139, -1089004262, -1081828961, -1099866351) + + W(3, -1115422148, 1039314504, -1117471766, -1108492170) + W(4, 1053913286, 1055197099, 1059867107, 1061690846) + + W(5, -1104536871, -1102951638, -1107184778, -1130420108) + + W(6, 1037671952, -1117440135, -1114610404, 1028605502) + W(7, 1040822242, 1041433743, 1048192776, 1029799624); + sum2 = W(0, 1017331955, -1104677463, -1117673238, -1094338757) + + W(1, -1119646366, -1104710153, -1107625181, 1022869095) + + W(2, -1097747777, 1040900608, -1081336501, 1073518733) + + W(3, -1103573743, -1106204508, 1041186571, -1097636016) + + W(4, -1097037835, 1016355419, -1089023490, 1068423959) + W(5, 1048344480, 1057220074, 1033091565, 1053959289) + + W(6, -1162485367, -1104406873, -1117660642, -1096388411) + + W(7, -1093216188, 1028492960, -1092192530, 1049060345); + WS(-1096756863, 1051174382); + sum1 = W(0, 1025372546, -1106905723, -1114360751, 1025624474) + + W(1, 1037998160, 1032794399, 1034992970, -1114244794) + + W(2, -1115668125, 1039995714, 1043101563, -1089490746) + + W(3, -1092891318, -1107085565, -1114405501, -1168885266) + + W(4, 1000611497, -1105014230, -1117013085, 1058174613) + + W(5, 1045000731, 1035643438, -1121180749, -1120880459) + + W(6, 1034391118, 1041916975, 1027806076, -1111998130) + W(7, 1008039732, 1030397185, 1018926829, 1029203969); + sum2 = + W(0, -1089960886, -1092452707, 1049541326, 1032119458) + W(1, 1032929374, -1110883627, -1123073435, 1026522309) + + W(2, -1095856011, -1106157919, 1074170001, -1085150802) + + W(3, 1046048366, -1112079347, 1027735021, -1111935169) + W(4, 1007316785, 1041476280, 1050706137, -1083810164) + + W(5, 1043182557, -1129593193, -1214669080, 1009058861) + + W(6, 1036775569, -1107942220, 1021239050, -1132331444) + + W(7, 1036225521, -1113579728, 1009639193, 1022066674); + WS(1063524863, 1010978751); + sum1 = W(0, 1033376264, 1035248130, 1029138555, 1040606570) + + W(1, -1146340206, -1122169062, -1113033206, -1115451138) + + W(2, -1090913225, -1094935586, -1084407830, -1085174115) + + W(3, -1080254739, -1094320024, 1033710501, 955403507) + W(4, 1054337940, 1045510498, 1057961148, 1062831778) + + W(5, 1060252175, 1058700983, 1045946247, 1033261261) + W(6, 1034437913, 1040021853, -1141033844, 1032741433) + + W(7, -1127614262, -1136275261, 1007782611, 1030604567); + sum2 = W(0, -1096400044, 1043917783, -1123678571, -1090244436) + + W(1, 1046901313, 1048870815, 1033884063, 1053211427) + W(2, 1053621644, 1009306318, 1051339656, 1062093709) + + W(3, -1080576226, -1106342004, -1098524562, -1124418811) + + W(4, 1017015195, 1005897821, -1141989437, 1065539532) + + W(5, -1083332175, -1097183812, -1097464341, -1092155120) + + W(6, 1037111777, -1106811629, 1047789047, -1093438727) + + W(7, 1049955112, 1043219374, 1050393105, 1044056917); + WS(-1085369887, -1080302329); + sum1 = W(0, 1021216124, -1121762938, -1103047566, -1094342263) + + W(1, -1105630871, -1107174593, 1025950537, -1146340105) + + W(2, -1112260523, -1119192737, 1050211017, 1058411732) + + W(3, -1139271463, 1042276856, -1113852108, -1119668597) + + W(4, 1035888345, 1049037307, 1061443675, 1044828010) + + W(5, -1119204121, -1100915542, -1174284878, -1119790119) + + W(6, -1110274640, -1111476420, -1097892613, -1097171068) + + W(7, -1112160677, 1026261917, -1110403297, -1132483222); + sum2 = + W(0, -1115512925, -1146353705, 1036066439, -1134998124) + + W(1, -1093678923, -1122018103, -1110317749, 1002801625) + W(2, 1035074177, 1040461813, 1042528734, 1058355837) + + W(3, -1081621864, -1089980594, 1049357806, -1101025299) + + W(4, -1191992884, 1043381354, 1059049535, 1058956516) + W(5, -1095612272, 1050844919, -1100731037, 1036998024) + + W(6, -1115656893, -1137020948, 1021899784, -1112812041) + + W(7, 1012903452, -1123282157, -1122890057, 1023124620); + WS(-1106521214, -1077666555); + sum1 = W(0, 1003321829, -1120901013, -1105222370, -1107011833) + + W(1, 1029823211, 1000924822, -1127794128, 1027793952) + W(2, 1052142545, 1052094618, 1060439250, 1059969903) + + W(3, -1095361591, 1039904896, 1000548911, 1046166153) + + W(4, -1102912320, -1105733097, -1085669204, -1113880763) + + W(5, 1052882623, -1107186882, -1118745688, -1096551831) + + W(6, -1108686032, -1118608535, 1045702647, -1106161276) + + W(7, -1103122454, -1106172071, -1113781993, -1132637458); + sum2 = W(0, 1034079401, -1123608512, 999851902, -1128074608) + + W(1, -1102099502, -1109589984, -1127758712, 1032460032) + + W(2, 1025264110, -1119278092, 1031056700, 1059405503) + + W(3, -1123208440, -1081290516, 1015173988, -1121242732) + + W(4, -1123371956, -1104246380, 1051208451, 1063218900) + + W(5, -1110007228, -1131612640, -1124651080, 1025045004) + + W(6, -1116991392, -1156408861, -1098806852, 1038716729) + + W(7, -1136590423, 1034885175, 1009682031, -1115963068); + WS(1061862175, -1081928168); + sum1 = W(0, -1105584175, 1024897880, 1038516044, 1040792761) + + W(1, 1041867802, -1146323132, 1033649803, -1113939311) + + W(2, -1105871745, -1093982770, -1092069365, -1083616743) + + W(3, -1089303929, -1089274268, -1106858177, -1096909360) + + W(4, 1043886056, 1052657028, 1055074797, 1065026281) + W(5, 1056987882, 1054263413, 1043742846, 1049053899) + + W(6, 1027658214, 992865878, -1121064957, -1106374835) + + W(7, 1015027694, -1132520748, -1137844354, 1017619030); + sum2 = W(0, 1078367032, 1056220347, -1078889751, -1073546091) + + W(1, -1104234997, -1129365336, -1132392998, -1105729449) + + W(2, 1027322757, 1044756153, -1096547764, -1101560565) + + W(3, 1042443775, 1048890957, -1104280017, 1028418751) + + W(4, 1023449836, -1148770222, 1043960988, -1126862726) + + W(5, 1029550531, -1133306383, -1130422948, 1042854212) + + W(6, -1115583846, 993742973, -1130380138, -1147412718) + + W(7, -1115461788, 1019814478, -1143007558, -1123464959); + WS(1052938943, -1103606318); + sum1 = W(0, -1114719934, -1110318513, 1051495307, -1100729633) + + W(1, 1058926789, -1090569589, 1050591187, -1120060704) + + W(2, -1087051802, -1108424920, -1085940948, -1082198177) + + W(3, -1090825863, -1088355266, -1096343413, -1090847836) + + W(4, 1058073278, 1044445625, 1060893495, 1058839039) + W(5, 1060585177, 1053564817, 1054456219, 1059253187) + + W(6, -1114447856, 1040769086, 1037779432, -1103818980) + + W(7, 1053070735, -1091337376, -1131842819, 1026807692); + sum2 = W(0, 1015621136, 1032703681, 1048700747, -1098355550) + + W(1, 1047054427, -1097901072, -1126056922, -1165737020) + + W(2, 1033006755, -1098289077, -1098808895, 1046984196) + + W(3, -1083721832, 1061110777, -1109410901, 1047097145) + + W(4, -1072583370, -1084108607, -1081224226, -1081041246) + + W(5, 1069053051, 1046858869, 1068664236, 1076043754) + W(6, 1074691924, 1067219112, 1064576163, 1066863963) + + W(7, -1084686190, -1086075738, -1079374171, -1071293986); + WS(-1083248351, 1041375270); + sum1 = W(0, 998616699, -1142901727, 1043282847, -1128981712) + + W(1, 1049050406, -1110272759, 1045114289, -1170526381) + + W(2, -1087439008, -1092067298, -1097778587, -1084179155) + + W(3, -1090979219, -1086455104, -1095775369, -1087021556) + + W(4, 1054645196, 1052452449, 1050602866, 1058025241) + W(5, 1061357806, 1053431193, 1052134295, 1053157267) + + W(6, 1045294540, -1128264947, 1042620067, -1146688137) + + W(7, -1127282486, -1125997182, 981342481, 1046767364); + sum2 = W(0, -1076239116, -1079299620, -1079042334, -1083365485) + + W(1, 1049726715, 1066758659, 1069675355, 1075688460) + W(2, 1068235144, 1068687973, 1068481951, 1066921525) + + W(3, -1106704213, -1080829299, -1077473679, -1073149491) + + W(4, 1054062613, 1019509447, 1057377046, -1100834259) + + W(5, -1095788298, -1107253929, -1112126912, -1090199615) + + W(6, -1114529265, -1116897962, 1041823371, 1032806429) + + W(7, -1104989857, -1107915189, 1021289065, 1034867372); + WS(-1089965567, 1041739713); + sum1 = W(0, 1014059625, -1109541748, -1120181702, -1113826001) + + W(1, -1099389050, -1107441048, -1110918155, -1129336123) + + W(2, 1050606464, 1046384755, 1052952467, 1062759283) + W(3, 1061539071, 1056969105, 1043585729, 1054439728) + + W(4, -1097348868, -1098095776, -1098227712, -1097909490) + + W(5, -1089710746, -1097990985, -1112431723, -1101291373) + + W(6, 1016608410, -1110057610, -1165355548, -1103909923) + + W(7, 1018410859, -1097884829, -1109883584, -1118732474); + sum2 = W(0, 1035083591, -1112359157, 1037205500, -1119560270) + + W(1, -1130432545, 1033928454, -1111608107, 1027763767) + + W(2, -1113211599, 1037267536, -1110383577, 1053336900) + + W(3, 1036846600, 1029308948, 1035214305, -1137000642) + W(4, 1032203968, -1129901649, 1050641640, 1062183610) + + W(5, 1052549520, 1037218786, -1098666781, 1041216407) + W(6, -1112771443, 999833884, -1113848439, 1048127168) + + W(7, -1087091182, -1080175934, -1106600446, -1105808372); + WS(1040803966, -1079223548); + sum1 = W(0, -1103550802, -1113401739, -1105545077, -1095164520) + + W(1, -1102562113, -1106149592, -1123094707, -1105989383) + + W(2, -1108233168, -1097729981, -1112466052, 1056711305) + + W(3, 1033129898, -1100704991, -1106323272, -1109921151) + + W(4, -1115946235, 1016715200, 1051122342, 1072346450) + W(5, 1046866637, 1041579689, 1017795558, 1019070562) + + W(6, 1021078213, -1123835458, -1103483180, -1092700173) + + W(7, -1104392485, 1033532004, -1128003929, -1109398092); + sum2 = + W(0, -1132003761, -1126076753, 1028715469, -1094940877) + W(1, -1096054213, 1050064171, -1095828963, 1024912709) + + W(2, -1097131135, -1098724323, -1094337061, 1075670208) + + W(3, -1092647285, -1119763725, -1104609741, -1103386045) + + W(4, 1033952970, -1102131199, 1043946979, 1037045260) + W(5, 1052392413, -1101691459, -1104710657, 1042676905) + + W(6, -1114013558, 1027012993, -1109613274, 1026138301) + + W(7, -1107006741, 1032910718, -1127911473, -1109320626); + WS(-1077711088, -1080462700); + sum1 = W(0, 1016976667, -1143635214, 1050435883, 1025648038) + + W(1, 1033190198, -1119077035, -1127874241, -1124293633) + + W(2, -1095463505, -1094028818, -1084473735, -1081613943) + + W(3, -1092817267, -1089963906, -1112556483, -1096263708) + + W(4, 1048382760, 1043759401, 1060944248, 1061061657) + W(5, 1059085444, 1058923652, 1024757337, 1052630131) + + W(6, 1033669226, 1023995271, 1038367764, -1104130812) + W(7, 1035230572, -1115548134, 998948881, 1035279350); + sum2 = W(0, -1118714905, -1128906105, -1104617441, -1102497202) + + W(1, 1052988680, 1025452854, -1147569173, 1045309195) + W(2, 1038737245, 1033599435, 1047074065, -1081197801) + + W(3, 1051590837, 1036478618, 1034730428, -1096538670) + + W(4, 1045939428, -1124872105, 1073600723, -1069501955) + + W(5, -1078764847, -1078626366, -1094352359, -1097394746) + + W(6, -1084863446, -1120736313, 1072627800, 1076529178) + + W(7, 1066278053, -1115729701, -1119746081, 1001372341); + WS(-1085605823, 1039908372); + sum1 = W(0, -1110519177, 998302542, -1105109851, 1051114493) + W(1, 1047758692, 1047411644, 1008966514, 1027414133) + + W(2, -1101464226, -1097280531, 1050325520, -1093718398) + + W(3, -1109283231, -1103804777, -1107759461, -1099881946) + + W(4, 1050281295, 1040574050, -1112501642, -1095999987) + + W(5, 1052111506, 1013903280, -1131548857, 1037344125) + W(6, -1136474287, 1017687606, 1027599892, 1038451002) + + W(7, -1112873934, 1026946257, 1007362713, 1030395745); + sum2 = W(0, -1115357326, -1129481498, 1037423788, -1149109833) + + W(1, -1107237807, -1098320683, -1118016391, -1111060805) + + W(2, -1098998597, -1104582263, -1098625511, 1036322812) + + W(3, 1050926614, 1045914812, 1029306918, 1035368549) + W(4, 1033193484, 1041990652, 1052524895, 1029624616) + + W(5, -1102468922, 1016354632, 1029333966, 1036818044) + + W(6, -1119934044, -1109942748, 1028176618, 1032249206) + + W(7, -1117055607, 1026298641, -1116685452, -1113790705); + WS(1066221936, -1112686252); + sum1 = + W(0, -1111426931, 1049363148, -1090113310, 1038796336) + W(1, -1102958241, 1041899238, -1104001476, -1112879133) + + W(2, 1042737360, -1108750629, 1053136109, -1095853365) + + W(3, -1108890233, 1023718298, 1033191264, -1165972390) + W(4, 1039181581, -1105687720, 1051677110, 1031102479) + + W(5, 1058267293, -1089545128, 1047293124, 1010166848) + W(6, -1110677245, 1035534704, -1101864162, 1019901392) + + W(7, -1107302241, 1048841797, -1106653499, 989728967); + sum2 = + W(0, 1019579309, -1115216952, -1101014764, 1035949455) + W(1, -1125343389, 1020295703, -1107189524, 1032252124) + + W(2, -1121628281, 1041466962, 1044350744, -1096356807) + W(3, 1019949697, 1011899626, 1020414781, -1108620092) + + W(4, -1104132268, -1110659898, -1092586315, 1067161402) + + W(5, 1044980625, 1028945397, 1024223321, -1106879950) + + W(6, -1133616314, 1046938970, -1089581193, -1097777539) + + W(7, 1025080038, 1042942659, 1000298789, 1034429670); + WS(1065647552, 1042223795); + sum1 = W(0, -1118213891, 1047859212, -1102035956, 1049817209) + + W(1, -1136727619, 1018314812, 1048950515, -1111834851) + + W(2, -1090185691, -1099254654, -1085546115, -1090115457) + + W(3, -1086839140, -1089622500, -1103143659, -1088857895) + + W(4, 1054600851, 1056675965, 1052764224, 1060918524) + W(5, 1050058698, 1053194074, 1055030644, 1046059111) + + W(6, 1042956769, 1045938459, -1095542592, 1048397149) + + W(7, -1107166488, -1115710386, 1046421002, 1019098869); + sum2 = W(0, 1038047795, -1100534663, 1043709757, -1098906327) + + W(1, 1054998296, -1097979318, 1042447686, -1135615252) + + W(2, 1045715537, -1109612723, -1109559353, -1088589586) + + W(3, 1046750383, 1030039799, -1112135838, -1108474833) + W(4, 1062099960, 1074456323, 1074047524, 1061406543) + + W(5, -1109444720, -1095255331, -1106577876, -1098188594) + + W(6, -1074982428, -1071944747, -1086420775, -1087600981) + + W(7, 1058024333, 1040647828, 1042372587, 1051479186); + WS(-1099261566, -1102058551); + sum1 = W(0, 1037460750, -1118752449, 1048855473, 1046116085) + W(1, 1041532007, 1043443965, 1035797482, 1048656673) + + W(2, -1099740733, 1038344912, -1097823268, -1077722267) + + W(3, -1086845489, -1109540512, -1112472539, 1006300060) + + W(4, 1035868896, 1028635221, -1135561696, -1089090112) + + W(5, 1054063629, 1036245196, 1039520068, -1115462467) + W(6, 1046250530, 1040547388, 1049218244, 1053686776) + + W(7, 1041462458, 1041323791, -1116084210, 1050214602); + sum2 = W(0, -1107023704, -1103130345, 1025081245, 1007138702) + + W(1, 1020633935, 1042694232, -1116958023, -1117764771) + + W(2, -1099880087, 1049640504, -1099241173, 1060797185) + + W(3, -1096100738, 1034621436, -1100840753, 1051814059) + + W(4, 1047853298, -1100868353, 1050410790, -1096656068) + + W(5, 1053061345, -1092716332, 1057695342, -1092707384) + + W(6, -1106650230, 1035820630, -1111373979, 1048085306) + + W(7, -1098540289, 1045275377, -1095110662, 1026583068); + WS(-1081437504, -1086037448); + sum1 = W(0, 1002898847, 1034161364, -1097339820, -1102052735) + + W(1, -1122224578, -1116847174, -1124219870, -1114337484) + + W(2, 1048903167, 1048827465, 1058952469, 1062493730) + W(3, 1056452878, 1052097743, 1046287775, 1051622635) + + W(4, -1098037791, -1110924302, -1089826679, -1082951605) + + W(5, -1095802941, -1093057352, -1115921615, -1097214606) + + W(6, -1124004134, 1038960439, -1109622563, 1046141833) + + W(7, 1037494008, -1142221339, 1018754897, -1115514650); + sum2 = W(0, 1026296217, 1046658552, -1092482457, 1048926974) + + W(1, -1093986590, 1051240634, 1031417427, -1116201775) + + W(2, -1098267531, 1054123387, 1031912087, -1103258874) + + W(3, 1064081451, -1081783631, 1052301313, -1136084293) + + W(4, 1056065541, -1080723543, 1068312252, -1095327126) + + W(5, -1101319294, 1054428583, -1095108256, 1032992382) + + W(6, -1107249906, 1049528827, -1094476247, -1114829012) + + W(7, -1110151549, -1109929036, 1023898518, -1131461985); + WS(1059931039, 1045326059); + sum1 = W(0, -1105339195, -1116497429, -1104905094, 1048600749) + + W(1, 1017781140, 1028510504, -1104151378, 1006123003) + + W(2, 1027626820, -1102542884, 1042432944, -1087368655) + + W(3, -1090841955, -1098837680, -1135818261, -1102238241) + + W(4, 1035394960, 1045819641, 1050447189, 1050459387) + W(5, 1058872902, 1038310627, 1009721182, 1039487803) + + W(6, 1020852317, -1110241387, -1120454715, 1028063406) + + W(7, -1135766366, 1046575867, -1121800177, -1138241103); + sum2 = W(0, -1108715925, -1125695753, -1106861101, 1037467647) + + W(1, 1049447879, -1108013135, 1016159100, 1025122350) + + W(2, 1033521028, -1107049318, -1126359337, 1024736242) + + W(3, -1096919459, 1030099711, 1038861546, 1027296385) + W(4, -1130002309, 1043711791, 1069432650, 1069236178) + + W(5, -1089672176, -1104043463, -1102967963, -1115278753) + + W(6, 1043372642, -1096562690, 1055907536, -1077602923) + + W(7, -1079492159, 1048192702, 1041544949, 1038199238); + WS(1065273279, -1155200022); + sum1 = W(0, 1032043190, 1042748400, 1044363154, -1101712885) + W(1, 1020290996, 1042545917, 1023679047, 969146311) + + W(2, -1110724474, -1113644224, -1103694886, 1049530899) + + W(3, 1032343156, -1119655327, -1113927803, 1014066252) + + W(4, 1048813356, -1113329098, -1138873982, 1013956115) + + W(5, -1088512539, -1118975351, -1112426340, -1102619473) + + W(6, -1107914275, 1017813644, -1119126921, 1030506334) + + W(7, 1047677002, 1035449518, 1040385292, 1037002750); + sum2 = + W(0, -1105379539, -1114326988, -1128505094, -1127815582) + W(1, -1144273240, 1011114412, 1010998384, 1008109660) + + W(2, 1040024171, 1033596237, 1027874005, -1090164335) + W(3, 1026082941, -1098155637, 1010514392, -1110656550) + + W(4, 1054804566, -1100858724, -1108932212, 1015111122) + W(5, 1057491035, -1123558275, 1041639386, 1025837089) + + W(6, 1020126178, 1058095820, -1095228668, -1114002666) + + W(7, -1109234902, -1117423595, -1148517800, 1028462436); + WS(1064822335, -1095840736); + sum1 = W(0, 1049019197, -1114924672, 1006539024, 1027273471) + W(1, 1024001604, 1023329786, 1034076369, 1032078653) + + W(2, 1056391992, 1052717533, 1053226600, 1063307800) + W(3, 1051465786, 1056189595, 1051405604, 1049885284) + + W(4, -1082098174, -1097259572, -1083318869, -1085358981) + + W(5, -1093212548, -1096912972, -1097995110, -1090164049) + + W(6, 1047279757, -1158101509, 1028150783, 1048033194) + + W(7, 1040827508, -1122795750, 1040247311, -1102713147); + sum2 = W(0, 1044291516, -1105536143, -1123279074, -1102729189) + + W(1, 1019015608, -1098099014, 1041233257, -1116414073) + + W(2, 1057945825, 1059138923, 1064153610, -1117658388) + + W(3, -1082824416, -1088923796, -1114762777, -1093119165) + + W(4, 1075245425, 1063262829, 1058517731, 1055818216) + + W(5, -1095331241, -1082492094, -1084810008, -1076437009) + + W(6, -1075047571, -1084742426, -1087050661, -1094508761) + + W(7, -1107921801, 1066223948, 1065694420, 1070896480); + WS(-1090760447, 1052695066); + sum1 = W(0, 1032827391, 1004836815, 1040820154, 1033221771) + W(1, -1142824410, 1019263487, 1033909728, 1030288497) + + W(2, -1086160295, -1100507696, -1085279840, -1085951050) + + W(3, -1090476887, -1096291378, -1104244158, -1096098979) + + W(4, 1058956361, 1050270371, 1061054293, 1060000376) + W(5, 1053225609, 1052048107, 1044967298, -1123372967) + + W(6, -1122589400, 1011775197, -1126907788, -1109718672) + + W(7, 1031459881, 1014310644, 1002236306, 1050105184); + sum2 = W(0, -1115548553, 1010795990, 1025233265, -1108773712) + + W(1, 1028577219, -1123367926, 1027045545, 1016487959) + + W(2, -1119133376, 1054475337, -1126101085, -1096206384) + + W(3, 1025243447, -1123699076, -1116348436, 1026289255) + W(4, 1034230379, 1049648601, 1031862009, 1056453743) + + W(5, -1092511031, 1040231624, 1052333940, -1098871930) + + W(6, -1106450540, -1130742967, 1074765700, 1076253468) + + W(7, 1067142167, -1082850789, -1074864896, -1066441953); + WS(-1098442559, 1026469881); + sum1 = W(0, -1149983818, -1119522441, -1111872220, -1148708523) + + W(1, 1033974589, 1034687077, -1121497336, 1040191316) + W(2, 1050517915, 1049663660, 1057681670, 1054270423) + + W(3, 1065584902, 1060962908, 1043551013, 1037520938) + + W(4, -1114000872, -1102209381, -1097110004, -1080449641) + + W(5, -1089390067, -1088971425, -1096207069, -1098201593) + + W(6, -1106643136, -1107005098, -1107624656, 1044397088) + + W(7, 1040137492, 1011262833, -1152197144, -1111636393); + sum2 = W(0, -1093666199, 1049995354, -1104373549, -1108191449) + + W(1, -1086862321, -1109961150, -1105617480, 1057348983) + + W(2, 1067471948, -1083836095, 1067519925, 1075025493) + + W(3, -1079149522, -1092122258, -1118106953, -1090446878) + + W(4, 1044138823, -1089657247, 1068116530, 1070698122) + + W(5, -1077256496, -1092830464, -1104600439, -1095892285) + + W(6, -1087858714, 1040673003, -1086283540, -1107890740) + + W(7, 1052510667, 1044801958, -1113062539, 1040940184); + WS(-1089367999, -1080592817); + sum1 = W(0, 1050901372, -1142600967, 1043029392, 1042662963) + W(1, -1131715556, 1028335344, 1009439676, 1040529906) + + W(2, 1020565079, 1046045566, 1051791856, 1059303201) + W(3, 1060541458, 1057651322, 1050310918, 1061742083) + + W(4, -1098563453, -1094642094, -1092783656, -1082254536) + + W(5, -1088235102, -1083519131, -1088554180, -1084895582) + + W(6, -1123752726, 1032349343, 1017360893, 1040706037) + W(7, 1038984656, 1042767141, 1039511244, 1037250730); + sum2 = W(0, -1086948904, 1044777691, -1085906527, -1107333159) + + W(1, -1094251850, -1101622483, 1054103540, -1095334551) + + W(2, 1072921984, -1096214776, 1069427540, 1069014322) + + W(3, 1068759557, -1095651744, -1080635176, -1071443034) + + W(4, -1102597600, -1086612116, 1055370552, 1068187895) + + W(5, 1049876941, -1098339283, -1098368915, -1119710681) + + W(6, -1081008410, 1053678014, -1094318103, 1040782350) + + W(7, -1097053445, 1052418274, -1116179967, 1057760894); + WS(-1072329816, 1074376722); + sum1 = W(0, -1119826815, 1034466519, -1121811611, 1040071236) + W(1, 1034412551, -1125783811, 1025497578, 989295697) + + W(2, -1097135645, -1100415357, -1123247055, -1078161261) + + W(3, -1086793716, -1092987820, -1117997032, -1097292445) + + W(4, 1051061560, 1050212013, 1057003368, 1050094223) + W(5, 1060987117, 1053182609, 1030369595, 1040352158) + + W(6, 1001332238, 1009264740, -1119531350, 1047608180) + + W(7, -1139666027, 1053959834, -1130537576, 1003451511); + sum2 = W(0, 1010850411, -1119692159, -1110113403, 1041465994) + + W(1, 1019542894, 1041361680, -1128076954, 1035827461) + W(2, 1033963983, 1024673399, -1107122545, 1041917938) + + W(3, 1031918417, 1016152214, -1119110501, -1108745692) + + W(4, 1041326744, -1126975570, 1049177676, 1075051781) + + W(5, 1057547658, -1100210466, -1101468559, -1111890885) + + W(6, -1110591524, 1039643589, -1098235771, 1061676083) + + W(7, -1072022345, -1080793678, 1038326573, -1115279667); + WS(-1089734463, 1065567745); + sum1 = W(0, -1115310942, 1048676446, 1051913151, 1041943745) + + W(1, 1032260949, -1123414147, 1025799735, -1118314271) + + W(2, -1089748010, 1033541431, -1091844976, -1078026925) + + W(3, -1083863979, -1088695462, -1097284573, -1090712276) + + W(4, 1053493076, 1047890913, 1060749357, 1057682191) + W(5, 1060855949, 1057895644, 1049355215, 1052101531) + + W(6, 1041536229, -1111760907, 1031051700, 1033727319) + + W(7, -1117552023, -1123512523, -1134918146, 1037093278); + sum2 = W(0, -1087048499, -1089227831, -1081828818, -1106022394) + + W(1, 1057638724, 1053589051, 1030725267, 1050363813) + W(2, 1067110585, -1073947481, -1100054441, 1057992187) + + W(3, -1096117153, 1049824990, 1008667589, 1047082764) + W(4, 1062551012, -1107011493, 1044700801, 1053279159) + + W(5, 1047077354, -1098858111, 1055551992, -1093863007) + + W(6, -1088705293, 1063056164, -1091908804, 1049660447) + + W(7, 1041467137, -1112699600, 991046018, -1118599281); + WS(-1079109040, -1085312521); + sum1 = W(0, 1023769582, -1140282322, -1105105824, 1041551140) + + W(1, 1030694836, -1111084358, 955351653, -1133450021) + W(2, 1037365911, -1117579705, 1052645482, 1061549365) + + W(3, -1092653220, 1050958145, -1113919416, 1047664699) + + W(4, -1113299189, 1042794748, -1086336671, -1087637436) + + W(5, 1051894263, -1111723928, 1039072513, -1111528112) + + W(6, -1127522065, -1098682508, 1041518392, 1049784787) + + W(7, -1104535548, -1112540051, 997865134, -1121426302); + sum2 = + W(0, -1112127727, 1037755147, -1117076760, -1096944427) + W(1, 920706880, -1126463908, 1025583781, 1016301114) + + W(2, -1182735741, -1116775242, -1110833901, 1050960349) + + W(3, 1057824022, 1025802869, -1117624689, -1106817101) + W(4, 1027967369, -1108084106, 1047419656, 1057406540) + + W(5, -1106635563, 1030718323, -1129307942, -1146210056) + + W(6, -1099828018, -1106208929, -1106621688, -1093670465) + + W(7, 1046907280, -1104727129, 1024731263, -1133403952); + WS(1066445424, -1114782683); + sum1 = W(0, -1105169880, 1037849343, -1111719878, 1053025475) + + W(1, -1106443352, -1118185334, -1115180998, -1104379365) + + W(2, -1110498524, -1092096849, -1089773556, -1093199580) + + W(3, -1085224723, 1017432168, -1097477655, -1120659192) + + W(4, 1042140161, 1045982494, 1059787797, 1058443885) + W(5, 1058982105, 1051015495, 1049335790, 1047806371) + + W(6, 1033176686, 1027992139, -1104315937, 1034263873) + + W(7, -1099213011, 1015617473, -1134277975, -1124174113); + sum2 = + W(0, 1035156885, 1010861092, 1053142713, 1050643378) + W(1, -1093995815, -1100307988, -1094190457, -1095534688) + + W(2, -1104443938, -1111353322, -1092519845, 1033492110) + + W(3, 1061622434, 1045835461, 1054276307, -1118030035) + W(4, 1020765936, -1131256669, 1043066295, -1093594884) + + W(5, -1090891830, 1051701313, -1115303200, 1044764145) + + W(6, 1034215267, -1119467871, 1043572605, -1120345789) + + W(7, 1035132204, -1120193257, -1107758441, 1010759898); + WS(1053797695, 1034928741); + sum1 = W(0, -1113709609, -1101985872, -1098832221, -1106547453) + + W(1, 1032341932, 1038712045, 1020651977, 1037110646) + W(2, 1027306577, 1036410350, 1048222316, 1049396519) + + W(3, -1093507345, -1098128846, -1102358117, -1095739626) + + W(4, -1089618673, -1094568298, -1089721378, 1057932790) + + W(5, 1051551069, 1042310981, 1032076306, 1049811664) + W(6, 1039738506, 1041675949, 1049870789, 1032602030) + + W(7, 1041034929, 1020376402, 1038606871, 1036847389); + sum2 = + W(0, -1107569978, 1048834253, 1032955728, 1047116738) + W(1, -1095875849, 1024141754, -1117854930, 1031286951) + + W(2, -1096371488, -1100415470, -1097656368, 1057366407) + W(3, 1049724515, 1047568587, 1025784853, 1040928209) + + W(4, -1091206842, -1140716449, -1099982688, 1067804624) + + W(5, -1107732848, -1101898886, -1104360749, -1099991629) + + W(6, -1113379832, -1098639187, -1102236471, -1112454303) + + W(7, 1037256860, 1039735469, 1034482735, -1122662653); + WS(-1100599294, -1113486107); + sum1 = W(0, 1041832895, -1113994869, -1101582062, -1100675730) + + W(1, 1015862616, 1033573462, -1123901241, -1147102474) + W(2, 1058015130, 1043005476, 1065539217, 1054749782) + + W(3, 1046936430, 1043027144, -1122192647, 1047923809) + + W(4, -1095482492, -1095369841, -1088297536, -1085935041) + + W(5, 1054414015, -1096194081, -1118572185, -1106262926) + + W(6, -1123207408, -1120610968, 1040056719, -1111595960) + + W(7, -1110844045, 1041950395, 1007333963, -1097939280); + sum2 = W(0, 1033496750, -1118187780, 1041080086, -1102935461) + W(1, 1023898015, -1122438380, 1007185073, 999989929) + + W(2, -1105017139, 1043450683, -1106458832, 1057933296) + + W(3, -1098239652, -1111698692, 1023645924, 1034431733) + + W(4, -1118941046, -1142467441, -1096734279, 1063076098) + + W(5, -1119844388, 1048742138, -1096898561, -1090457759) + + W(6, 1012703263, 1009095593, 1025973118, -1089439993) + + W(7, -1124882200, 1004297609, 1046154393, 1048791679); + WS(1058454143, -1086058342); + sum1 = W(0, -1115074879, -1099743710, -1103933280, -1113530407) + + W(1, -1124606630, -1115568198, -1123572016, -1118699368) + + W(2, 1051341170, 1054019099, 1057240637, -1085932301) + + W(3, -1090466976, -1097279225, -1108988935, -1095706385) + + W(4, -1123276713, -1112675511, -1095853513, 1048593300) + + W(5, 1059272419, 1052135974, 1039376368, 1041536544) + W(6, 1040408770, 1042487060, 1044345774, 1034191179) + + W(7, -1105205160, -1111240730, -1135917288, 1043157563); + sum2 = W(0, 1047642666, -1094360366, -1111839157, -1101124559) + + W(1, -1119401007, -1114275291, 1010413358, 1018914035) + + W(2, -1106684338, -1104496052, -1101578828, 1062389037) + + W(3, -1099504899, -1102577927, -1121638606, -1100286365) + + W(4, -1097565895, -1137000462, 1017360469, 1056361687) + + W(5, 1057357121, -1111580608, 1047557438, -1108198790) + + W(6, 1038757740, -1120606628, 1043520604, -1110716481) + + W(7, -1121032787, -1174578992, 1020758339, 1031842399); + WS(-1116191222, -1087222261); + sum1 = W(0, 1051378220, 1026061480, 1051132746, -1131139769) + W(1, 1029438530, 1010253799, -1140691900, 1032111196) + + W(2, -1092140039, 1041212802, 1028855632, 1054776996) + W(3, 1052461054, 1056191968, 1041996679, 1051463563) + + W(4, -1098282527, -1108686318, -1114615088, -1096808426) + + W(5, -1090181940, -1089672580, -1095415146, -1084069643) + + W(6, -1115126509, 1018050395, 1028919646, 1031880915) + W(7, 1047407636, 1041055121, 1025713945, 1049760258); + sum2 = + W(0, -1120688670, 988781159, 1023531678, 1034244658) + W(1, 1038669521, -1125227753, -1122152897, -1123518214) + + W(2, 1075791226, -1079951996, -1080919050, -1078043585) + W(3, 1061514147, 1050383220, 1043495776, 1056154705) + + W(4, 1072772368, -1096143661, -1087274515, -1074830486) + + W(5, -1138433181, -1091737459, 1043710967, 1064633897) + + W(6, 1033088733, -1126178338, 1039982901, -1153355920) + + W(7, 1047086021, -1117938706, 1036258954, -1090859740); + WS(-1086114623, -1084816591); + sum1 = W(0, -1119067590, 1041053515, -1123050946, 1050414506) + + W(1, 1017204584, 1033253648, -1109025761, -1142909644) + + W(2, 1036163639, -1112478813, 1045609440, -1091176571) + + W(3, -1096458464, -1092456237, 1039781304, 1019336538) + + W(4, -1106221778, -1114565991, -1102274148, 1041957568) + + W(5, -1140250052, 1042499428, 1024592194, -1110741472) + W(6, 1015833809, 1041839788, 1038604869, 1049671879) + + W(7, 1016035267, 1004159150, 1019624502, 1038938427); + sum2 = + W(0, 1006657945, -1145756082, -1102183527, 1043063832) + W(1, 1048257970, 1030027167, -1129422896, -1120006792) + + W(2, -1115603798, -1129023472, 1024575987, -1070476153) + W(3, 1078068971, 1034687231, 1014471457, 998969122) + + W(4, 1043167348, 1029036192, -1134024937, -1079118960) + W(5, 1058188063, 1026633068, -1138449465, 1035752331) + + W(6, 1032033598, -1122908214, 1013148193, -1117007948) + + W(7, 1026806223, -1106350665, 1037397710, -1119066852); + WS(1058895967, -1115291633); + sum1 = W(0, -1125313920, -1110715998, -1110540830, -1093243535) + + W(1, -1098773368, -1114664694, -1108229374, -1128878150) + + W(2, -1118075736, 1028840739, 1050429809, 1056177832) + W(3, 1050921353, 1021103494, 1039051533, 1048765371) + + W(4, -1101537045, -1106860038, -1109809347, 1062536899) + + W(5, 1050429425, 1042267175, -1104944731, 1019165331) + + W(6, -1102743433, -1113756805, -1112821659, -1094426092) + + W(7, -1112140166, -1105504016, -1123143221, -1113092552); + sum2 = + W(0, -1118991740, 1035161218, 1031409558, 1025873763) + W(1, -1130385854, -1109675818, 1035221069, -1106515599) + + W(2, 1049660250, -1092533458, 1052404039, 1059098325) + W(3, 1035329255, 1033133876, -1100849576, 1041079456) + + W(4, -1072802862, -1084844108, 1059153934, 1066715964) + W(5, 1054800035, -1121630224, 1017402854, 1051036492) + + W(6, -1093107290, -1131472334, -1099814906, 1050189246) + + W(7, 1033113369, 1032032260, 999987753, -1109656332); + WS(-1088275071, -1079832501); + sum1 = W(0, -1121609972, 1054795207, -1091175970, 1036185063) + + W(1, 1036253081, -1095852779, 1056993046, -1099614386) + + W(2, -1140631216, 1001216956, -1109051587, -1108520810) + + W(3, -1112588624, -1111932116, 1018114011, -1114447781) + + W(4, 1031902612, 1053928586, -1100362195, -1118566269) + + W(5, 1050418310, -1106845532, 1057036918, -1106898567) + + W(6, -1114449795, 1049117898, -1089874193, 1024185910) + + W(7, 1033419200, -1098704820, 1052334541, -1103629998); + sum2 = W(0, 1034198694, 981839325, 1050051875, 1043520387) + W(1, -1099547613, 1020237946, -1112528204, 1032634213) + + W(2, -1099753021, 1036479145, -1087878645, -1099082069) + + W(3, 1049181233, -1106552091, 1051666481, -1105193718) + W(4, 1052074243, 1033443852, 1061175239, 1044393022) + + W(5, 1036533430, -1125692060, -1100952955, 1038429221) + + W(6, -1101897553, -1125560160, -1090657055, -1126528836) + + W(7, -1113239720, -1111189720, 1038783930, -1110455840); + WS(1055684799, 1057467177); + sum1 = W(0, -1115635180, 1040983065, 1033664034, 1047016048) + W(1, 1040303666, 1031194256, 1036112338, 1031542812) + + W(2, -1084593518, -1097583958, -1088354001, -1083875169) + + W(3, -1089538899, -1090088564, -1096939300, -1092334596) + + W(4, 1057349085, 1048845932, 1059080519, 1057461395) + W(5, 1055847004, 1052697432, 1050363555, 1025617138) + + W(6, 1044528285, -1108137881, 1042415046, -1130549589) + + W(7, 1025308788, 1040121956, -1124884732, 1051059157); + sum2 = W(0, 1039076253, 1043377438, -1111770710, -1129064764) + + W(1, 1041506513, -1117340191, -1113661124, 1006037802) + + W(2, 1084724252, 1057352437, -1070809771, -1070013447) + + W(3, 1024963427, -1115045950, 1037860995, -1120758055) + + W(4, 1055999642, -1108204793, -1115649819, -1084654208) + + W(5, 1027889169, 1023558847, -1108774739, 1034794526) + W(6, -1111202323, 982595482, 1026864091, 1008953953) + + W(7, 1041107952, -1112891517, -1161342746, 1036271073); + WS(-1089965247, 1033154456); + sum1 = + W(0, -1118330000, 1043361746, 1028536899, -1106541856) + W(1, -1103233833, 1037178020, -1122355891, -1148310999) + + W(2, 1037068672, -1091726905, -1106295439, -1087991002) + + W(3, -1094017778, 1026207675, -1102222128, -1106998176) + W(4, 1043453383, 1027410848, 1047994631, 1053447482) + + W(5, 1058853977, 1049286760, 1044913013, 1056026770) + W(6, -1112803845, 1030795409, -1111747193, -1109712917) + + W(7, -1110327970, -1111739348, 1037236782, -1104668925); + sum2 = W(0, -1104081637, -1115350296, -1102551062, 1033477476) + + W(1, 1048930937, -1092653578, 1049862570, -1095610208) + + W(2, -1104712414, 1065017407, -1101193417, 1054909386) + + W(3, -1096226206, -1094950793, 1042131871, -1100838677) + + W(4, 1038273275, 1027805677, -1097697554, 1069044481) + + W(5, 1051154993, -1097937335, -1115393002, -1090656582) + + W(6, -1102746442, 1038124336, 1025981021, -1090398660) + + W(7, 1049254524, -1111378843, -1100983150, 1038627466); + WS(1053522367, -1088249107); + sum1 = W(0, 1041083642, -1109062519, 1041255149, -1129341567) + + W(1, -1122816004, 1034422596, -1105678140, 1002201935) + W(2, 1049354980, 1050121221, 1062047573, 1050256849) + + W(3, 1058306025, 1054029415, 1043380368, 1057986114) + + W(4, -1104528935, -1089361286, -1094323010, -1085946707) + + W(5, -1092704114, -1096738148, -1095183726, -1098664466) + + W(6, -1116245577, -1108913352, 1044478835, -1106612546) + + W(7, 1010650184, -1127765836, 1004046811, -1116617606); + sum2 = W(0, -1115691041, -1122196578, -1133382325, -1119943136) + + W(1, 1035619338, 1026693101, -1121646682, 1035287249) + + W(2, 1047105417, 1040512713, -1115639944, -1093984910) + + W(3, -1128164365, -1112542694, 1040561229, -1122951759) + + W(4, 1066880006, 1072356775, 1070833917, -1106032356) + + W(5, -1084317659, -1103058628, -1106694088, -1109474775) + + W(6, -1078420733, -1074089832, -1079250237, 1053171659) + + W(7, 1063302165, 1050228647, -1111273903, 1041535222); + WS(1054980735, -1118400611); + sum1 = W(0, 1023857233, -1136534172, -1109579886, 1024279465) + W(1, 1031638446, 1042081899, 1025101580, 1037741818) + + W(2, 1056052581, 1054619866, 1062631892, 1063340895) + W(3, 1054891904, 1032051762, 1036582853, 1040187076) + + W(4, -1108899938, -1084632317, -1087670245, -1087714282) + + W(5, -1089981519, -1091518889, -1100292439, -1096282711) + + W(6, -1098911041, 1014993130, 1019079234, 984908360) + W(7, 1040973935, 1034243544, 1038263499, 1035333164); + sum2 = W(0, 1048663857, -1115607290, 1050959246, -1094885185) + + W(1, 1032263390, -1094433235, 1034671855, -1100445080) + + W(2, -1103126769, -1089284711, -1106476140, 1065597134) + + W(3, -1114774312, 1044112203, -1110680696, 1044150663) + + W(4, -1090522781, -1135630263, -1116194786, 1068281966) + + W(5, -1114594327, 1034641663, -1120338125, 1039802827) + + W(6, -1135969141, -1096474341, -1110761886, -1097679100) + + W(7, 1030603925, 1025157613, -1121778209, -1101519530); + WS(-1099426814, 1028666567); + sum1 = + W(0, 1017347599, -1114817850, -1102332157, 1038414608) + W(1, 1040863441, 1043586729, 1033560385, 1024225691) + + W(2, 1050515008, 1054909169, 1058789976, 1049870885) + W(3, -1096181150, -1094822147, -1110297504, 1035801215) + + W(4, -1097546199, -1091252816, -1088740593, 1026332624) + + W(5, 1050979384, 1046083753, 1043042893, -1106319780) + W(6, -1122852442, 1034424401, 1040697053, -1119196265) + + W(7, -1096850298, -1101867410, -1112505198, 1022200238); + sum2 = + W(0, 1032296335, -1113414658, 1032045591, -1096252543) + W(1, 1039836782, -1130462124, 1032505935, 1017080436) + + W(2, -1113854030, 1056314261, 1056282685, -1076472908) + + W(3, 1041975936, 1060789196, -1113045826, -1114544525) + + W(4, -1123218166, 1057288090, 1048444709, -1076465599) + W(5, 1054239999, 1064414385, -1101415652, 1017354944) + + W(6, 1034439881, -1106401889, 1027355020, -1099548772) + + W(7, 1041344971, -1137373456, 1031341874, -1131418272); + WS(1048405758, 1021439377); + sum1 = W(0, -1095783591, 1004365570, -1111296393, -1090472608) + + W(1, 1053249340, -1096289768, -1116930177, 1031327257) + W(2, 1056714988, 1053912029, 1060368018, 1058906144) + + W(3, 1059710205, 1050004859, 1050104788, 1057263364) + + W(4, -1095028931, -1097931508, -1093355890, -1084869763) + + W(5, -1111710658, -1089344390, -1098648430, -1095692170) + + W(6, -1099026446, 1040281084, 1042667324, -1099317986) + + W(7, 1058667863, -1094050929, 1032145973, -1127343131); + sum2 = W(0, -1137650289, -1108324664, -1107068637, 1053004242) + + W(1, -1096186406, 1044011702, 1031462490, 1016473473) + + W(2, -1102128439, 1038586891, -1102631398, -1096144010) + + W(3, 1065778432, -1087564484, 1041037240, -1095964556) + W(4, 1065729447, 1042582877, 1055966210, 1066736444) + + W(5, -1077760412, -1109340585, -1088233524, -1079487884) + + W(6, -1085103011, -1096095433, -1096657292, -1084794119) + + W(7, 1061684194, 1053274132, 1060428365, 1070082531); + WS(-1120621558, -1109747932); + sum1 = W(0, 1041405257, 1034046808, -1118447615, 1031113092) + W(1, -1118172841, 1039149197, 1025628006, 1023987646) + + W(2, 1056552380, 1057052863, 1034826244, 1061462741) + W(3, 1057041023, 1051800560, 1051243933, 1054503948) + + W(4, -1086075216, -1102283433, -1089852749, -1087896594) + + W(5, -1089300195, -1089266110, -1098077639, -1098034299) + + W(6, 1021959803, 1009707220, 1002695151, 1030648525) + W(7, 1017359341, 1034838445, 1033512688, -1099231069); + sum2 = W(0, -1072120352, -1071453180, -1069998225, -1071241469) + + W(1, -1073669228, -1079882002, -1086087106, -1096258120) + + W(2, 1076686179, 1075980741, 1075876198, 1076219984) + W(3, 1072219376, 1071235859, 1056170781, 1057784547) + + W(4, -1096491690, 1055107632, -1100816518, 1048961210) + + W(5, -1123192163, -1097056656, 1049622318, -1098632303) + + W(6, -1109988374, -1125676035, 1033428305, 1018908197) + + W(7, 1040773271, -1129279043, 1030403985, -1116156171); + WS(1014286296, 1057122707); + sum1 = W(0, -1100574608, -1134927261, -1096946922, -1115033128) + + W(1, -1104533485, -1121259095, -1131995140, -1118839498) + + W(2, 1045128364, -1112841149, 1023155519, -1094208427) + + W(3, -1099169249, -1097752701, -1111007544, -1093400894) + + W(4, 1045637171, 1041785732, 1051848326, 1066937726) + W(5, 1058599142, 1049921902, -1118760834, 1043420320) + + W(6, -1113867461, 1021982785, -1106336253, -1099783438) + + W(7, -1105189673, -1131816685, -1114789302, -1116552190); + sum2 = + W(0, 1049653051, -1094509070, 1050525055, -1103662151) + W(1, 1043452805, -1102028885, -1109754017, -1111709279) + + W(2, -1095117458, 1054995367, 1042728281, 1058124872) + W(3, 1049859565, -1097129382, -1098619851, 1051259496) + + W(4, 1052542945, 1021265631, 1046926465, 1063131010) + W(5, 1029162962, -1116537562, -1092457406, -1078653130) + + W(6, 1018695699, -1101605993, 1044635344, -1104882803) + + W(7, 1042944443, -1110047725, -1107003327, -1114867517); + WS(-1089617919, -1078924764); + sum1 = W(0, 1038586191, -1112517470, 1021690773, -1148410045) + + W(1, -1123773533, 1037589846, -1114886949, 1015916580) + W(2, 1054651431, 1043170193, 1058605998, 1062049174) + + W(3, 1056236357, 1058401044, 1034515388, 1056139353) + + W(4, -1087542485, -1101086846, -1088163691, -1087004528) + + W(5, -1089020247, -1089711896, -1095006441, -1089662071) + + W(6, 1032587193, -1121720345, 1034793549, -1139319682) + + W(7, 1040971627, 1052009144, 1017461287, -1138694970); + sum2 = + W(0, 1041183203, -1109901203, 1047303939, -1146453442) + W(1, -1103370030, 1035308463, -1107592095, -1129723226) + + W(2, -1104791361, -1103309504, -1109225788, 1050748307) + + W(3, 1032462009, 1055570013, -1104507532, 1050955773) + W(4, -1113641717, 1018299463, 993644855, 1050538753) + + W(5, 1024125183, 1058013570, 1044744090, -1110543421) + W(6, 1040266660, -1124518657, 1039912380, -1107008276) + + W(7, -1094411631, -1087158984, -1091454514, -1122733934); + WS(-1102088830, 1068463311); + sum1 = W(0, 1007817678, -1114291787, -1106493040, -1121377148) + + W(1, -1120569345, 1037434082, -1121570543, 1048479966) + W(2, 1054791531, 1051084317, 1059023407, 1060487316) + + W(3, 1053262386, 1049438849, 1043319351, 1037267389) + + W(4, -1088166471, -1097682087, -1087032011, -1087032009) + + W(5, -1090195409, -1104445288, -1110294871, -1112047510) + + W(6, 1034628887, -1130503387, 1042839161, 1025313797) + + W(7, 1040112167, -1112558866, -1130274577, -1107488086); + sum2 = W(0, -1092702026, -1078842502, -1073165872, -1075365553) + + W(1, -1101579557, 1066341075, 1071992070, 1076187261) + W(2, 1046572938, -1092761370, 1048469719, 1050413401) + + W(3, -1110447061, -1104166524, -1123716833, 1056626852) + + W(4, -1113806693, 1010298098, -1106037347, 1041503306) + + W(5, 1037192623, 1033398310, 1031702363, -1110743783) + + W(6, 1023924734, -1134107544, -1114438827, 1017902665) + + W(7, 1011674154, -1109271682, 1028552632, -1123830383); + WS(1050299903, -1120086405); + sum1 = W(0, 1001761330, 1051426245, -1097473350, 1050955122) + + W(1, -1098718343, -1119699408, 1038117517, -1107622229) + + W(2, 1015037916, 1042953374, -1103780307, -1082933123) + + W(3, 1055455844, -1145769035, -1132909758, 1039587926) + + W(4, 1045981578, -1094503950, 1055197076, -1099126616) + + W(5, -1118831961, 1049761702, -1105955296, 1047033256) + + W(6, 1032160884, -1131440192, -1100940622, 1056645367) + + W(7, -1095742542, 1031622998, 1041481643, -1103124921); + sum2 = W(0, 1033493706, 1004282338, 1032395114, 1035721710) + + W(1, -1138557465, -1094630455, 1050323990, -1102984389) + + W(2, -1100025935, 1036668146, 1043333590, 1058018229) + W(3, 1035348312, 1040910383, 1034465026, 1044530527) + + W(4, -1117747708, -1097774825, -1106149887, -1110236537) + + W(5, -1105971349, 1017216296, -1110352462, -1108832665) + + W(6, -1131691420, 1042472719, -1122758767, -1106477628) + + W(7, 1046834331, -1101697584, 1040100106, -1099114129); + WS(1059761855, -1093333930); + sum1 = W(0, -1114738580, -1114617627, -1102727321, 1053910378) + + W(1, -1094270689, -1107452471, -1130455238, -1108958070) + + W(2, 1026403632, 1045397583, 1028768699, 1067649611) + W(3, -1104323849, 1042776267, 1036450873, 1044075076) + + W(4, -1105736123, -1109519752, -1092041414, -1090720496) + + W(5, -1112030179, -1103704317, -1131764742, -1106063752) + + W(6, -1114933837, 1044731740, -1111636685, 1058839312) + + W(7, -1095377736, 1034877772, 1031929286, -1113359528); + sum2 = W(0, 1033753751, -1102724392, -1104466296, -1083668043) + + W(1, 1048180527, -1130490520, -1103926430, 1029490699) + + W(2, -1111931472, 1032416705, 1029992729, 1069568682) + + W(3, -1114422988, -1133345747, 1038116955, -1129834714) + + W(4, 1037689465, -1105246922, 1052475163, -1090236396) + + W(5, -1122305941, -1123788932, -1127253836, -1122171294) + + W(6, 1023732592, -1126463180, -1118149766, -1106129378) + + W(7, 1038071226, -1124715334, -1117123194, 1029091180); + WS(1058247519, 1058950523); + sum1 = W(0, -1149972914, 1038957612, 1039970419, 1008158544) + W(1, 1041515382, 1036144305, 1048236362, -1101573740) + + W(2, -1088063023, -1093535488, -1086741707, -1077128706) + + W(3, -1087332234, 1032313207, -1113848378, -1089306475) + + W(4, 1055543086, 1052729022, 1058924163, 1057693884) + W(5, 1060656868, 1056531259, 1049522521, 1052006205) + + W(6, 1037155715, 1026693813, 1030719286, 1032127358) + + W(7, 1000958261, -1112386573, -1144612480, 1039554949); + sum2 = + W(0, 1037957789, -1128637884, -1110859440, 1052981065) + W(1, 1040710261, -1090346288, -1107045102, -1092015484) + + W(2, 1050553491, 1004874497, -1106433025, 1058989771) + W(3, 1058251934, -1076253449, -1079150504, 1073146781) + + W(4, -1089722328, 1058234547, -1098594890, 1052545864) + W(5, -1106724054, 1032950959, 1055215751, 993278274) + + W(6, 1050994656, -1095571828, 1041665953, -1129708900) + + W(7, -1111634443, 1015279680, 1053553553, -1088813426); + WS(-1079689312, 1054955487); + sum1 = W(0, -1112827293, 1038847520, -1106748654, 1038138418) + + W(1, 1035397268, 1020226162, 1030022886, -1108673687) + + W(2, -1094091800, -1099397203, -1102151838, -1086663035) + + W(3, -1087965823, -1095805620, -1098762192, -1096846716) + + W(4, 1053343716, 1057879171, 1023820222, 1057249493) + W(5, 1057985827, 1053821069, 1051466543, 1049463311) + + W(6, 1046408387, -1099233409, -1154890390, 1012875058) + + W(7, -1109124523, -1126965269, 1036334304, 1027304762); + sum2 = W(0, 1029906557, -1110945783, 1046588193, -1121400966) + + W(1, -1106274145, 1040948990, -1114149785, 1030737726) + + W(2, -1118908362, -1110004947, -1089040350, -1106443118) + + W(3, 1054044230, -1115139995, -1112260837, 1025987216) + + W(4, -1075330978, -1081100797, -1089891752, -1103643831) + + W(5, -1095873523, -1120742988, -1107023588, 1017833328) + + W(6, 1069116571, 1067844910, 1066162938, 1048795077) + W(7, 1049522444, 1042365723, 1011222152, 1031208089); + WS(1045323518, -1099573370); + sum1 = W(0, 1043494028, -1110296205, -1129034139, 1040205415) + + W(1, 1019451328, 1037480760, -1144942569, 1019441962) + W(2, 1054678847, 1050638833, 1058657792, 1062545342) + + W(3, 1053087270, 1054717567, 1044080591, 1056118375) + + W(4, -1087400961, -1098183847, -1085969705, -1082320511) + + W(5, -1092792902, -1090230188, -1094581114, -1090342307) + + W(6, 1041221965, 1038272854, 1035507984, 1038672050) + W(7, 1018934299, 1028598065, 1032398451, -1135273190); + sum2 = + W(0, -1115726367, 1028786141, 1044450180, -1097529180) + W(1, 1047479398, -1105649332, -1127420023, 1035799966) + + W(2, -1100272494, -1113941052, -1104186275, 1042859033) + + W(3, -1097402721, 1051025911, 1025042835, -1139194229) + W(4, 1026681555, -1107020345, 1044693748, 1067055887) + + W(5, 1064288021, 1073649944, 1067916626, 1054550763) + W(6, -1095030133, 1043410282, -1120312046, -1093369648) + + W(7, -1083945294, -1073003592, -1079526678, -1086831079); + WS(-1086660959, -1095040438); + sum1 = W(0, -1137772688, -1103872010, 1033664792, -1114303830) + + W(1, 1043631948, -1110960013, -1112201312, 1004207675) + + W(2, -1101831491, -1108733164, -1099393082, -1091611870) + + W(3, -1111668992, -1092153253, -1104258339, -1111896549) + + W(4, 1047762270, 1048734598, 1053294440, 1032897582) + W(5, 1054700448, 1051790266, 1038982672, 1042342295) + + W(6, 1026497863, -1112526127, 1036444877, -1105948909) + + W(7, 1045765800, -1102627253, 1030853145, 1024477884); + sum2 = W(0, 1047134358, 1032860761, 1058187056, -1089859690) + + W(1, -1073724300, -1113017653, -1123513506, 1005834992) + + W(2, -1100773581, 1019143260, -1086969962, 1060822499) + W(3, 1074524802, -1127402252, 986153015, 1026902445) + + W(4, 1038575217, -1097448906, 1050436365, -1092585260) + + W(5, -1097001013, 1052022456, -1101541136, 1040058169) + + W(6, -1121016162, 1027754828, -1118814167, 1047705700) + + W(7, 992280012, -1115523910, 1026625966, -1115254226); + WS(1065625968, 1033455989); + sum1 = W(0, 1037701789, -1137040283, 1000406064, -1094784938) + + W(1, 1050863995, -1103592251, 1032127959, 1038622703) + + W(2, -1151616802, -1099349487, 1047711372, -1115632781) + + W(3, -1088133648, 1049293870, -1118922740, -1120882929) + + W(4, -1102944307, 1053320242, -1098462560, 1053161728) + + W(5, 1049613697, -1128175786, 1017489163, -1119810116) + + W(6, 1035789757, -1106274637, 1048627484, -1098374228) + + W(7, -1120581030, -1114622845, 1038993832, -1165953346); + sum2 = + W(0, 1035866397, -1103116216, 1059558286, 1058384307) + W(1, -1096953271, 1042132369, -1111426470, -1128202268) + + W(2, -1099238508, 1047962584, -1082734190, -1088122523) + + W(3, 1056069525, -1106560803, 1038442279, 1028886015) + W(4, 1052038184, -1105248240, 1057669233, -1091086098) + + W(5, -1083280561, 1032403631, -1104452063, -1150402298) + + W(6, -1107491561, 1027069673, -1098068789, 1053762892) + + W(7, 1064349048, -1107462772, 1040922744, 1012204557); + WS(1066439152, -1108830929); + sum1 = W(0, -1102916748, -1108788820, -1097607254, -1099017414) + + W(1, -1168846782, -1109193920, -1128476473, -1106724277) + + W(2, 1055608939, 1051866141, 1058768962, 1030462560) + + W(3, -1113005110, -1109987210, -1109670205, -1105116142) + + W(4, -1103898045, -1097938907, -1093577324, -1125603603) + + W(5, 1040477611, 1050862423, 1039038758, 1053895221) + W(6, 1013732302, 1035488645, 1043113957, 1027216291) + + W(7, -1143171172, -1118580993, -1107320747, -1107171108); + sum2 = W(0, 1050905005, 1051922636, 1052154527, 1005525738) + + W(1, 1024591478, -1094205878, -1094330307, -1105421569) + + W(2, 1051409035, -1107944278, 1040207956, 1060123319) + + W(3, 1032045878, -1096175996, -1086096303, -1081193369) + + W(4, -1123874142, -1131839644, -1100926997, 1046139234) + + W(5, -1113252250, 1039675350, -1128729660, 1062516858) + + W(6, -1099079861, 1035659117, -1109355656, 1029590720) + + W(7, 1032543174, 1044310065, -1129395200, 1042520685); + WS(-1094347903, 1040885342); + sum1 = W(0, 1027015666, -1097151811, 1050782150, -1106442815) + + W(1, 1051184308, -1091810963, 1034433919, 1042242605) + + W(2, -1119901274, 1047615033, -1115052947, 1051587896) + + W(3, -1105704339, 1046407197, 1009768300, -1122889273) + + W(4, -1109404651, 1051228067, -1096976391, -1096200649) + + W(5, -1126487153, 1040585575, -1132445914, -1108464678) + + W(6, -1145327523, -1096635113, 1048638245, -1105180361) + + W(7, 1051518582, -1092825760, 1038762547, 1040013733); + sum2 = + W(0, -1121205117, 1031829824, -1105324964, -1090390675) + W(1, -1110420773, 1018005966, -1113281242, 1032068637) + + W(2, -1124056141, -1109805410, 1045427632, 1059020251) + + W(3, -1107061510, -1118368537, -1115675784, -1113920834) + + W(4, -1106581817, 1007706034, 1046732003, 1057752640) + W(5, -1101115525, -1103994134, 1036673543, 1042522746) + + W(6, 1026565438, 1029970286, 1047283254, -1089850616) + + W(7, 1031976810, 1036394258, -1112565336, -1145818031); + WS(1066366016, -1121083386); + sum1 = W(0, -1127500850, -1122305754, 1025706181, -1104671484) + + W(1, 1043832110, -1111488580, -1123271764, 1015742169) + + W(2, 1026624689, -1114017662, -1088657475, -1098749979) + + W(3, -1085705014, 1037547214, -1112264441, -1105147876) + + W(4, 1013565235, 1052467062, -1121688536, 1066224034) + W(5, -1112016562, 1041900405, 1043675185, 1022047173) + + W(6, -1127181143, 1035730049, 1045310349, 1026340635) + + W(7, -1121566277, -1127673329, 998683632, -1132045794); + sum2 = W(0, -1102951634, 1044058166, 1037657608, -1091261805) + + W(1, 1057746121, -1106029228, 1006392595, -1119100020) + + W(2, 1043023116, -1093545812, -1093647750, 1070997171) + + W(3, -1082044166, 1051593249, -1100798567, 1013819138) + + W(4, -1104735391, 1058451408, -1104370519, -1105620254) + + W(5, -1091103100, -1096225251, 1052307063, -1121077487) + + W(6, 1035018995, -1112978123, 1043811519, 1052846459) + + W(7, -1097428497, -1127092852, -1107453736, 1041369362); + WS(1059191103, 1030618557); + sum1 = W(0, 1034200101, 1053678608, -1114145283, 1047695489) + + W(1, -1114663316, -1137634576, -1125278731, -1138534517) + + W(2, 1032351793, 1049973094, 1058794603, 1053292689) + W(3, 1055818163, 1053263444, 1041016873, 1043320696) + + W(4, -1100440271, -1098031908, -1087452589, -1078695803) + + W(5, -1125225546, -1094543429, -1116533557, -1104858229) + + W(6, -1148363237, 1026486548, -1194991971, 1043453347) + + W(7, 1033675947, 966472909, -1115520783, -1119664758); + sum2 = W(0, 1021496216, -1072453458, -1079530578, 1063841069) + + W(1, -1095958945, 1042172731, 1015153576, -1132334880) + + W(2, -1095812325, -1094113031, 1068683999, 1074699170) + + W(3, 1043477830, 1031880682, -1121439437, -1115200049) + + W(4, -1116672596, -1112299630, -1135088113, -1126165044) + + W(5, -1107446259, -1119142347, 1037216194, 1034903618) + W(6, 1031503244, 1023122856, 1036078566, 1036242384) + + W(7, -1100441243, 1009915385, -1114450875, 1017712520); + WS(-1096433855, 1052342409); + sum1 = W(0, -1117693364, 1041070378, -1105417036, 1052133240) + + W(1, 1042648272, -1123398616, 1044512510, -1105041790) + + W(2, 1042163431, -1095385709, 1060080198, -1090036408) + + W(3, -1090327769, 1043184694, -1111854479, 1043408999) + + W(4, 1006023611, 1034697390, -1109633387, -1085473397) + + W(5, 1057448056, -1105658040, -1104977148, 1041051171) + + W(6, -1113444755, 1049542464, -1112382959, 1048891757) + + W(7, -1111238376, -1106505885, 1049508979, -1110665802); + sum2 = W(0, 1039259027, -1119373866, -1086821333, 1052826002) + + W(1, -1117342490, 1036052293, 1037381955, -1101694007) + + W(2, 1043188759, -1082984200, -1077733706, 1067327309) + + W(3, -1149070344, 1052358305, -1102382047, 1050777563) + + W(4, -1165551167, -1105050294, -1103802686, 1068967257) + + W(5, 1054626023, -1101813629, -1103461210, -1106555317) + + W(6, -1113326246, 1045229872, -1109909290, 1052700624) + + W(7, -1098764713, -1099183932, 1052205497, -1096821402); + WS(1046655614, 1069864308); + sum1 = W(0, 1035633391, 1040943483, 1045417382, 1043913370) + W(1, 1050212129, 1047844019, 1039058852, 1043891960) + + W(2, -1106200785, 1031319761, -1120751363, -1093886310) + + W(3, -1098821847, -1088130094, -1092291401, -1082722808) + + W(4, -1105260712, 1026979270, -1106053451, -1121044950) + + W(5, 1042106970, 1049054225, 1041620790, 1042598038) + W(6, 1050507575, 1034433460, 1045765948, 1041581532) + + W(7, 1029812249, 1017929306, 1028938706, 1034869942); + sum2 = W(0, -1098805029, -1101136548, -1094351375, -1097728468) + + W(1, 1040878916, 1049713965, 1037060075, 1058810464) + + W(2, -1082465618, -1084472150, -1085764460, -1140347496) + + W(3, -1100091144, 1049328541, 1062808960, 1071144827) + W(4, 1017798412, -1108050411, 1031330790, 1053843229) + + W(5, 1043199898, 986797508, -1119994130, -1097822096) + W(6, 1045866690, 1039888035, 1027046574, 1038111290) + + W(7, -1100094208, -1104239104, -1098800085, 1017716576); + WS(-1077527440, 1065234224); + sum1 = W(0, 1031059492, 1014606833, 1041495444, 1031584061) + W(1, -1143158030, -1140389945, 1035424519, 1013235228) + + W(2, -1088676934, -1098001853, -1087241405, -1083911392) + + W(3, -1095088526, -1096536807, -1104484775, -1100223239) + + W(4, 1055802445, 1051162632, 1059501583, 1061276187) + W(5, 1050088278, 1049527800, 1042937212, 1037087943) + + W(6, -1159469258, 1001612013, -1109463457, -1105280809) + + W(7, 1038556792, 986827883, 1030875577, 1047418837); + sum2 = + W(0, 1026928347, 1006719462, -1103317527, 1043604137) + W(1, -1106627965, 1034526167, -1117999031, -1134258967) + + W(2, 1019217071, -1098369589, 1041304779, -1134457784) + + W(3, 1048134757, -1118427047, 1029994729, -1113504087) + + W(4, 1027288437, -1099640354, 1050941648, -1112266437) + W(5, 1027462477, 1040843010, -1104465031, 1054764710) + + W(6, -1112677997, -1146387796, -1072403340, -1071428003) + + W(7, -1082446250, 1059493547, 1072461191, 1077848621); + WS(1034219259, -1130863201); + sum1 = W(0, -1122470601, -1125729883, -1119868741, -1092963050) + + W(1, -1102984950, 1017182198, -1107264969, -1116589116) + + W(2, 1036468120, 1031973022, 1045421587, 1062931954) + W(3, 1062738826, 1050208654, 990945063, 1023027040) + + W(4, 1033355302, -1125640547, -1122038588, 1044707408) + + W(5, -1104269382, -1106320445, -1110744610, -1098846428) + + W(6, -1104067775, -1112351746, -1106594245, -1094830635) + + W(7, -1127079049, -1109997276, -1112571199, -1117279521); + sum2 = + W(0, -1120041672, 999703935, -1109032994, 1041627711) + W(1, -1111815622, 1029813110, -1110751572, -1114401610) + + W(2, 1041156572, 1029144962, 1037796455, 1046556501) + W(3, 1060385029, 1040466231, -1103822492, -1076222058) + + W(4, -1103868400, 1036670980, 1043292537, 1059414852) + W(5, 1048639871, -1105513272, -1100107078, 1043280503) + + W(6, 1036471018, -1107170022, -1115113192, 1029249656) + + W(7, -1126242312, 1043143286, -1101226736, 1034327293); + WS(-1097041087, -1081891922); + sum1 = W(0, 1045201037, 1042240134, 1049780286, 1039927583) + + W(1, -1122695635, -1110484942, -1117417409, 1039840796) + + W(2, -1097075376, -1091271089, -1094847921, 1059654550) + + W(3, 1056430510, 1057233913, 1041827328, 1050554535) + W(4, -1126257330, 1049467348, 1057610047, -1141428591) + + W(5, -1089703504, -1087958744, -1096746586, -1096159486) + + W(6, -1115394372, -1097795722, -1097045891, -1103383438) + + W(7, 1036098616, 1033721138, 1035539581, -1131932502); + sum2 = W(0, 1012982255, -1101224821, -1109376974, -1116588919) + + W(1, -1096183361, -1092858264, -1090462581, -1119652925) + + W(2, 1052214657, 1042508745, 1042044290, 1071547407) + + W(3, -1089469015, -1090264503, 1039700797, -1083767147) + + W(4, -1136022111, -1093748656, 1045672838, 1065241977) + + W(5, 1049249478, 1047260540, 1046964814, -1107087862) + W(6, 1032353073, 1020863779, -1113516472, 1040242686) + + W(7, -1120964187, -1103746594, -1100885683, 1028764718); + WS(-1088621983, 1079497913); + sum1 = W(0, 1027161409, -1102075462, -1120075900, -1109063205) + + W(1, -1104005172, -1136555883, -1112015962, 1033292370) + + W(2, 1052712773, 1051824794, 1057942154, 1060662493) + W(3, 1062931830, 1057800198, 1047971474, 1059753504) + + W(4, -1102058289, -1098602113, -1096292664, -1082645434) + + W(5, -1090788424, -1090185155, -1098101583, -1088742454) + + W(6, -1100368317, 1021667349, -1106147487, 1039175801) + + W(7, -1129475640, 1036809656, 1009161622, -1143403778); + sum2 = + W(0, -1150684740, -1114056841, -1164208415, 1034698244) + W(1, -1134574697, 1043895716, -1101980686, 1050191679) + + W(2, -1095235693, -1115238312, -1080604054, -1071093346) + + W(3, -1083926997, 1068501149, 1079699126, 1056576712) + + W(4, 1044985054, -1127339724, -1106549807, -1080554397) + + W(5, -1104923511, 1052487431, 1054997905, 1029700329) + W(6, 1035589955, -1108218072, 1022130402, -1106288272) + + W(7, 1024268734, 1036117000, -1130803558, 1031345667); + WS(-1087955103, 1023517655); + sum1 = W(0, -1106663590, 1037773274, -1116651838, 1022742037) + + W(1, 1040438284, -1117813952, 1032561623, -1102318801) + + W(2, -1090071677, -1103425461, -1089596734, -1082614473) + + W(3, -1088542372, -1092404165, -1100716355, -1098396937) + + W(4, 1062902614, 1055773525, 1059014377, 1060267482) + W(5, 1057943128, 1054561254, 1051603940, 1049819671) + + W(6, 1013889298, -1100022495, -1101161913, 1030094516) + + W(7, -1120043085, -1116951793, 1035114019, 1026546470); + sum2 = W(0, -1107653444, 1032757863, -1150202006, 1037010009) + + W(1, 1026258576, 1041748319, -1131622502, -1112646994) + + W(2, -1094858135, 1061839668, 1049735190, -1123088190) + + W(3, -1089824138, -1098358767, 1049699018, -1103776938) + + W(4, 1084595456, 1074196920, 1067688119, 1070729644) + W(5, 1050587980, 1057889952, -1127981435, 1048602984) + + W(6, -1065438414, -1069856939, -1073375528, -1082206819) + + W(7, -1086758222, -1097734258, -1106404220, -1098587943); + WS(-1089607615, 1063931357); + sum1 = W(0, -1156148665, 1033042784, 1027235975, -1117005684) + + W(1, 1045226606, -1112863441, 1040283212, -1102751384) + + W(2, -1089422721, -1099513696, -1086976804, -1083936660) + + W(3, -1089259880, -1092850238, -1096473171, -1096124078) + + W(4, 1059281720, 1053472432, 1060428066, 1061258678) + W(5, 1055780369, 1057981025, 1051704489, 1054893029) + + W(6, 1041177357, -1107985659, -1122980350, -1103260375) + + W(7, -1111710595, -1109580750, -1125267169, 1035448166); + sum2 = W(0, 1024298597, 1037699935, 1030404477, -1094400051) + + W(1, 1052543759, 1024136176, -1159281410, -1102232478) + + W(2, 1074606150, 1048614297, -1085515118, -1071672142) + + W(3, -1091215560, -1095087497, 1050441058, 1071366890) + + W(4, 1080820206, 1047271097, -1079656120, -1066721483) + + W(5, -1078287609, -1096732136, 1057126689, 1074685383) + + W(6, 1030125639, -1121834510, -1166463196, -1101580999) + + W(7, 1028051862, 1009399200, -1117118368, -1113696211); + WS(-1083901183, 1060981851); + sum1 = W(0, -1106299749, 1039492049, -1113140273, 1055856482) + + W(1, -1103186821, -1108369378, -1115937041, -1127954738) + + W(2, 1048978486, -1107896957, -1119192025, -1090009641) + + W(3, -1088174932, 1034759564, 1008970428, 1027686380) + + W(4, 1016862419, -1115539879, -1098481927, 1058119768) + W(5, 1052019064, 1048477348, 1034559233, 1044214632) + + W(6, -1121286832, 1049662006, -1106196840, -1149152444) + + W(7, -1101797848, -1146708651, 1024756171, -1111878699); + sum2 = W(0, 1030335348, -1110488253, -1096373435, 1042224202) + + W(1, 1038378538, -1117770266, 1036930446, -1168276161) + + W(2, -1130369060, 1056034410, -1097486091, -1094958491) + + W(3, 1057631708, -1114209587, -1105273765, -1115537765) + + W(4, -1106797797, 1040331307, 1063611375, -1106971469) + + W(5, -1093142933, 1037075531, -1115233817, 1025218793) + + W(6, 1006653296, -1094310491, -1113782011, 1042512890) + + W(7, -1140559356, -1114686161, -1115373149, 1026640233); + WS(1063762143, -1098158381); + sum1 = + W(0, 1027555010, -1113176415, 1044835884, -1094480963) + W(1, 1042205032, 1038186408, -1112247611, 1041241393) + + W(2, -1106988831, 1049655577, -1089572014, 1041189880) + W(3, 1035602487, -1095655321, 995617211, -1102946366) + + W(4, 1031921883, 1032851437, -1106152127, 1057311541) + W(5, -1100163979, 1046700975, 1050763922, -1119959180) + + W(6, 1033567284, -1099137927, 1052671923, -1101762329) + + W(7, -1106014811, 1044902280, -1094051821, 1044480349); + sum2 = + W(0, 1010916279, -1108274646, -1108043460, 1049469526) + W(1, 1061284555, -1097521196, 1047936551, -1106103943) + + W(2, 1040615985, 1037755544, -1107213139, -1085933104) + W(3, -1098201753, 1027381238, 1007266289, 1039340208) + + W(4, -1103581164, 1053142923, -1091384808, -1093682556) + + W(5, -1095835641, 1044225612, -1101597200, 1011948943) + + W(6, -1126424725, -1119616718, 1062997316, 1050086980) + + W(7, 1044548392, -1099920539, 1043928239, -1120667237); + WS(1060336095, -1119657045); + sum1 = W(0, 1023788715, -1117126579, -1108875843, 1022815367) + + W(1, -1100562722, 1043213137, -1111482971, -1142747249) + + W(2, 1048279897, 1044311660, 1062204714, 1060724749) + W(3, 1063043033, 1050929706, 1037241746, 1051192212) + + W(4, -1106238784, -1096869700, 1019770348, -1081389759) + + W(5, -1084472996, -1097593661, -1106654286, -1102133781) + + W(6, -1110161279, -1136931731, -1115905233, 1034904806) + + W(7, -1124661292, 1017832853, -1109716592, -1109353889); + sum2 = W(0, 1036664563, -1103288529, -1102134383, 1057556566) + + W(1, -1099512639, 1031668335, -1103860103, 1028018661) + + W(2, 1009247708, -1126560341, -1067246446, 1067728497) + + W(3, 1078180911, -1085231458, 1047956293, -1114058193) + + W(4, 1013790140, -1102369678, 1047852878, -1093152080) + + W(5, -1110504691, 1042704555, -1132621098, 1030531898) + W(6, 1035577258, 1008412166, 1016094574, 1045655865) + + W(7, -1123477495, 1023608957, -1112760821, -1120624893); + WS(1035518203, 1045613832); + sum1 = W(0, 1044215468, -1096085823, -1102751483, 1007706274) + + W(1, -1098118842, 1051305356, -1096250919, -1106455273) + + W(2, 1057279232, 1043513429, 1057361220, 1061539183) + W(3, 1057962612, 1058710773, 1037420261, 1053125757) + + W(4, -1097478568, -1096451901, -1091716958, -1085528932) + + W(5, -1093017477, -1091718961, -1100741095, -1097230063) + + W(6, 1042423606, -1098498663, 1012832112, 1054368634) + + W(7, -1103819295, 1057808613, -1100568821, -1111733504); + sum2 = W(0, -1105709018, 1050542737, -1106108137, 1027983028) + + W(1, 1053295819, -1091042532, 1049054259, -1108416827) + + W(2, 1058997495, -1084246791, -1103685622, -1106510960) + + W(3, -1089515541, 1066680974, -1088412186, 1037143386) + + W(4, -1086433444, 1065459234, 1055198365, -1102412567) + + W(5, 1057925132, -1080963495, 1056230430, 1049505110) + W(6, 1022365788, -1101303092, 1040995532, 1044759128) + + W(7, -1104466949, 1043286350, -1096360229, -1106131860); + WS(-1103921662, 1072713673); + sum1 = W(0, 1042712209, -1130675027, 1041149044, -1108819823) + + W(1, -1099465033, -1102885798, -1108891552, -1122152216) + + W(2, -1111681022, -1104528338, -1103688784, 1055222237) + + W(3, 1063848575, 1053207587, 1051374172, 1044600823) + W(4, 1029885560, 1032835743, 1053127408, -1089836355) + + W(5, -1089832742, -1090841456, -1098121506, -1101098252) + + W(6, -1123292759, -1124533373, -1101763282, -1143773237) + + W(7, 1044926036, 1032528402, 1040294582, 1018003689); + sum2 = W(0, -1116466906, 1032691193, -1110682367, -1134651946) + + W(1, 1019799157, 1020309206, 1028255175, -1118897648) + W(2, 1017580326, 1031996320, 1040673767, -1121084452) + + W(3, 1012141662, -1123645954, -1125118807, 1005021204) + + W(4, -1100144980, 1045143645, 1055366708, -1112456349) + + W(5, 1037079065, 1036705771, -1112096331, 1021253254) + W(6, 1018640494, 1067424527, 1071822180, 1057195246) + + W(7, -1078565795, -1073530916, -1087156462, 1033125682); + WS(1054959295, 1011151216); + sum1 = W(0, -1124554365, 1028540695, -1107828893, -1135601758) + + W(1, -1135515507, 1032466990, -1110097877, 950109203) + W(2, 1043778462, -1104732576, 1063706911, 1052343180) + + W(3, 1050410381, -1128754020, 1034222620, 1043960229) + + W(4, -1140499785, -1111020475, -1098481604, -1081762405) + + W(5, 1053053447, -1112972157, 1023071124, -1120112616) + + W(6, -1103855992, -1113072532, -1121738665, 1048654720) + + W(7, -1096321673, 1012954617, -1110289546, -1114439871); + sum2 = + W(0, -1104841432, 1047690020, -1084375561, -1086552004) + W(1, 1046416693, 1025710892, -1130856953, -1113936449) + + W(2, 1047456971, -1094867354, 1068880529, 1065412328) + + W(3, -1080289298, -1110380578, -1105039836, 1016290713) + + W(4, 1024424907, 1033457856, 1046341732, -1087761187) + W(5, 1062384539, -1103331799, 1024509174, -1126452938) + + W(6, 991739097, -1129013032, -1103560341, 1059009805) + + W(7, -1098849357, 1045332030, -1104241974, 1019994493); + WS(1061669311, 1066543312); + sum1 = + W(0, -1120030840, -1111872182, 1046388965, -1109640224) + W(1, 1051640445, -1104742312, 1040612129, 1018742870) + + W(2, -1097490380, 1051889621, -1085299564, 1043197314) + + W(3, -1099578605, -1114905437, 1033952272, -1095793020) + + W(4, 1038501126, -1110528784, 1050043436, 1054292822) + W(5, -1095700775, 1056051928, -1108619674, 1044337364) + + W(6, 1026361650, -1112085217, 1019064063, -1116217609) + + W(7, 1045441021, -1097066005, -1146667493, 1039394788); + sum2 = W(0, 1041249103, 1040922446, 1047169006, -1133026152) + W(1, 1045305983, -1121038685, 1032067159, 986169209) + + W(2, -1098300344, -1147221163, -1097103704, 1055827658) + + W(3, -1082349433, -1105225178, 1036618956, -1102095468) + + W(4, 1041141085, 1014590689, -1094689158, 1056443342) + + W(5, 1051958562, 1035590360, -1098250629, -1145857885) + + W(6, -1123648820, -1115292810, 1021735499, 1023898168) + + W(7, -1153021086, 1038130213, 1035045284, 1030074795); + WS(1066007616, 1040865170); + sum1 = W(0, 1016703369, -1106398093, -1114560988, -1096325697) + + W(1, -1094335779, 1023023221, -1113231876, 1022983872) + + W(2, -1154003525, 1038441464, -1112021256, 1050813825) + + W(3, 1059033474, -1108543232, 1040892233, 1034570898) + W(4, -1104662792, 1031083397, 1052887594, 1061249791) + + W(5, -1126656183, -1106571274, -1121820472, -1115038347) + + W(6, -1111826720, -1146451379, -1102003526, -1102172436) + + W(7, -1104413998, -1109007926, -1112600993, -1123919488); + sum2 = W(0, -1117895883, 1036640719, -1092695525, -1109277526) + + W(1, 1054484712, -1102073467, 1047716642, -1115714917) + + W(2, -1109314178, -1103775527, -1079308608, -1088245301) + + W(3, 1032194306, 1058556412, -1097777200, 1049638324) + W(4, 1043196819, 1047073701, 1032498235, 1071134194) + + W(5, -1098274857, -1102222667, 1028797614, -1109885254) + + W(6, 1029963629, -1117061975, 1053147047, -1113344034) + + W(7, 1027577620, -1104158962, 1019489703, -1106961770); + WS(-1112959995, -1090797387); + sum1 = W(0, 998546749, -1102515009, 1018649191, 1024148768) + W(1, 1036601843, 991750171, -1134314668, 1024106779) + + W(2, -1107113888, -1157171375, -1095395659, -1088418302) + + W(3, -1108499994, -1092700079, -1100812608, -1106951576) + + W(4, 1042251615, 1043372984, 1057847906, 1049085946) + W(5, 1054314562, 1052242560, 1010001228, 1043704436) + + W(6, 1034524319, -1109045169, 1025715818, -1107024218) + + W(7, 1036766314, -1102346050, 1041369791, -1136260253); + sum2 = W(0, -1097076796, 1000463738, -1083533587, 1064100942) + + W(1, 1074997490, 1043707697, 1028507309, -1152835380) + W(2, 1045091130, 1024736081, 1064625577, -1096201033) + + W(3, -1071550159, -1106033160, -1118548401, -1111712908) + + W(4, 1028367411, 1040206702, -1112850496, -1086258418) + + W(5, 1052069491, -1098690685, 1050202273, -1113053149) + + W(6, 1016501386, -1122385083, -1104146558, 1050125885) + + W(7, -1105686824, 1041978517, -1109567340, 1032203802); + WS(1065286463, -1155116140); + sum1 = W(0, -1127743664, 1036265535, -1118137852, -1121018025) + + W(1, 1024160014, 1028265374, 1031461691, -1116217572) + + W(2, -1099417962, -1091060822, -1088882712, -1089265061) + + W(3, -1088513194, -1090887512, -1097685517, -1096201501) + + W(4, 1047837241, 1038987540, 1061626690, 1069311516) + W(5, 1053957977, 1051214117, 1050330231, 1045642342) + + W(6, 1035108393, -1121911642, -1119901843, -1100290432) + + W(7, -1101311755, 980641778, 1030945477, 1036102670); + sum2 = W(0, 1023964675, 1054178647, -1104607531, -1088748842) + W(1, 1034720649, 1027793575, 1026748348, 1048440611) + + W(2, -1104287950, -1098771138, 1030951671, 1062304002) + + W(3, 1056993385, -1095484784, -1103591056, -1115722179) + + W(4, -1095527688, -1106164282, 1049293814, 1069791349) + + W(5, -1106129898, -1093744890, 1040804508, -1102843948) + + W(6, -1107378538, -1107123343, -1102317974, -1093097006) + + W(7, -1107155572, -1104614583, -1111048704, 1036145149); + WS(-1107864827, -1106183398); + sum1 = W(0, -1106667222, 1032383543, -1104095901, -1105126732) + + W(1, -1119082647, -1099092218, -1106477481, -1100466619) + + W(2, 1028246417, -1105288567, 1024277645, 1031807228) + W(3, 1024663749, 1059042594, 1038514313, 1061247795) + + W(4, 1062610107, 1048732230, 1033194034, -1097352540) + + W(5, 1042072353, -1097841594, -1132497297, -1116357250) + + W(6, -1094330385, -1113355593, -1100412503, -1110531197) + + W(7, -1106817153, -1119219065, -1116226478, -1112377140); + sum2 = W(0, -1124057659, -1107748661, -1106641450, -1106278570) + + W(1, -1115427744, 1045306633, -1107251222, 1044220643) + + W(2, 1049202878, 1029365940, -1100669682, -1090514146) + + W(3, 1050790854, -1101749265, 1044664667, 1051259000) + + W(4, 1055877653, 1040631102, -1121942624, -1097531540) + + W(5, -1095195500, 1044511371, -1123742683, 1035140356) + + W(6, 1043135164, -1120955446, 1048773070, -1096084011) + + W(7, 1040842880, -1101432694, -1108344435, -1156279482); + WS(-1107710971, -1103335008); + sum1 = + W(0, 1020774038, -1097452822, -1103681302, -1142400543) + W(1, -1130541650, 1035627390, 1026485526, 1026933710) + + W(2, 1057965326, 1052789750, 1061528673, 1059882105) + W(3, 1058381533, 1052101646, 1047827121, 1048909172) + + W(4, -1096736580, -1097416740, -1090723228, -1082070814) + + W(5, -1096313647, -1092903493, -1095953623, -1094072619) + + W(6, -1108312647, 1007270548, 1008435167, 1032878150) + W(7, 1024150455, 1029066731, 1024752368, -1129872006); + sum2 = W(0, -1091198687, -1096592719, -1088722291, 1017819408) + + W(1, -1104841225, 1047280108, -1133964792, 1046210234) + W(2, 1051358993, 1056674994, 1050253089, 1057806550) + + W(3, -1098514434, -1095745001, -1121773836, -1101840089) + + W(4, 1026242284, -1102658445, 1039492851, 1048044980) + + W(5, 1047848116, -1114927114, 1009730080, -1115459009) + + W(6, 1036983987, -1112372364, -1109827680, 1033031265) + + W(7, -1106004699, -1128936304, 1044703642, -1121859563); + WS(1046617982, -1079283690); + sum1 = W(0, -1112235521, -1112371935, 1046025067, -1114138877) + + W(1, -1100106092, -1106636112, 1006684852, -1134743124) + + W(2, -1103103206, 1005568807, -1082068590, 1053438832) + + W(3, 1050481934, -1113851306, -1101804759, -1101795702) + + W(4, 1050398983, 1053710959, 1059470764, 1056782757) + W(5, -1084354719, 1044662919, 1028720557, 1040488963) + + W(6, 1031782004, -1112406582, -1109731202, -1120370051) + + W(7, 1047048563, -1114617505, -1122334215, 1035089325); + sum2 = + W(0, -1123583696, 1041752924, -1096033091, 1045050816) + W(1, -1111810372, 1044170848, 1035342189, -1107148363) + + W(2, -1114190125, -1107057915, 1054169171, 1066165326) + + W(3, -1090934807, -1094482563, 1030376713, -1140242036) + + W(4, -1123424510, -1108427412, -1101097272, 1060681517) + + W(5, -1093738003, -1094742214, -1122528198, 1046835784) + + W(6, 1035265901, 1011193218, -1097576107, 1037309084) + W(7, -1094306097, 1047478278, 999245333, -1118953940); + WS(1057107647, -1115492411); + sum1 = W(0, 1043432615, 1017716083, -1115224236, 1034158091) + W(1, 1031606075, 1040917102, -1119339928, 1006053250) + + W(2, 1037909322, 1044219192, 1059480955, 1055275264) + W(3, 1062186253, 1051479740, 1036604907, 1049031914) + + W(4, -1092726398, -1094557923, -1089724826, -1079486955) + + W(5, -1094016652, -1090199321, -1111430132, -1124163213) + + W(6, 1042270260, 1036944691, 1049175094, 1036017407) + + W(7, -1112299996, 1012181234, 1026270626, -1106538704); + sum2 = W(0, 1018646782, -1107779390, 1048577488, -1094766117) + + W(1, 1029078775, -1115207772, 1041354677, -1134027235) + + W(2, 1037675363, 1041358579, -1103110037, 1063077105) + + W(3, -1094239344, -1097294293, -1106609062, 1005749079) + + W(4, 1056993548, -1114299594, -1108103869, 1069120744) + + W(5, 1019393926, -1090842684, -1103795001, -1111892981) + + W(6, -1095820604, -1106961783, -1113810892, -1094104293) + + W(7, -1100654825, 1030620215, 1015746998, 1031888221); + WS(1038408187, -1104646224); + sum1 = + W(0, -1100666444, 1032659338, -1096791479, 1050254507) + W(1, -1125163769, 1034716030, -1104041563, 1024265746) + + W(2, 1031841147, -1095811512, 1046629869, -1086582314) + + W(3, -1092033141, -1095590162, 1012740704, -1097384267) + W(4, 1045835257, 1046356758, 1055310447, 1049546009) + + W(5, 1059064223, 1032941357, 1016606100, 1043234370) + W(6, -1121385297, -1115316924, -1109718991, 1043876936) + + W(7, -1115882186, 1051195252, -1110386378, -1121465454); + sum2 = + W(0, 1033146053, 1034495435, 1033891153, 1015618236) + W(1, -1102272365, 1026402836, -1126192412, -1130670616) + + W(2, 1033178697, 1013274853, 1044565157, -1083473003) + W(3, 1047899954, 1033829854, 1026659107, -1129244632) + + W(4, -1110558215, -1103797816, -1074394842, -1075035519) + + W(5, 1070896015, -1107786181, 1039466503, 1033633210) + W(6, -1107600367, 1046600596, -1096372667, 1071496075) + + W(7, 1070598351, -1103057086, -1099451771, -1106841766); + WS(1060540543, -1145107984); + sum1 = W(0, 1016949312, 1033700674, 1008485935, 1050394829) + W(1, 1025975118, 1027755062, -1166944971, 1036625882) + + W(2, -1111708420, -1115158282, -1112773425, -1105627788) + + W(3, -1166436080, 1049090616, -1131929874, 1027903943) + + W(4, 999025948, 1037057540, -1111113150, -1105528438) + + W(5, -1092533512, -1097657169, -1125616567, -1104970374) + + W(6, -1110878953, 1034636061, 1006219749, 1047777444) + W(7, 1034379342, 1023310559, 1042471825, 1029991232); + sum2 = + W(0, -1112727972, 1041061913, 1030171918, 1049192765) + W(1, -1097932217, -1108991614, -1128255593, -1128975721) + + W(2, 1028528033, 1047913039, 1058299937, -1088725965) + W(3, 1006741474, 1028842331, -1119404040, 1019613109) + + W(4, 1050127712, -1120606988, -1075312291, 1051042420) + W(5, 1061621025, -1120436768, 1041035795, 1038145345) + + W(6, 1039139414, -1090975722, -1096898908, 1056682084) + + W(7, 1043329296, -1136718330, 1019658885, 1017746289); + WS(1058512095, 1047466767); + sum1 = W(0, 1025672397, 1032743763, 1046625694, 1040236986) + W(1, 1041791363, 1042422310, 1024317081, 1034505416) + + W(2, -1102753041, 1015664161, -1102686879, -1099087483) + + W(3, -1097904327, -1097334084, -1123206279, -1096407969) + + W(4, 1037445664, 1032570339, -1091026739, -1089271035) + + W(5, -1100626131, 1051389809, 1041773046, 1050962859) + W(6, 1037433000, 1033220516, 1035056566, 1024398415) + + W(7, 1043847942, 1042353123, 1037697617, 1047698739); + sum2 = W(0, -1111694157, -1113457231, 1007020677, -1110494513) + + W(1, 1036239980, 1042151096, 1014804229, 1038268008) + + W(2, -1097429792, 1040318944, -1109123041, -1087577139) + + W(3, -1115766281, 1033854974, 1056323633, 1058473731) + W(4, 1052756319, -1131566802, 1066240251, 1071158756) + + W(5, 1055974927, -1085216854, -1076147337, -1078122726) + + W(6, -1115035673, -1108486657, 1057627634, 1052796029) + + W(7, 1037312144, 1031946717, -1107413695, -1088208012); + WS(-1087119871, 1051442968); + sum1 = W(0, -1106951233, 1026199466, -1111827529, 1034911407) + + W(1, -1110066258, 1036906330, -1121489041, -1123695161) + + W(2, -1101188351, -1102133666, -1096477343, -1081083296) + + W(3, -1093686286, -1089794286, -1102503648, -1096524016) + + W(4, 1055191809, 1046522759, 1061746551, 1062137809) + W(5, 1056808794, 1061657374, 1025414769, 1043754020) + + W(6, -1118371512, 1024298399, -1102462991, -1118895495) + + W(7, -1105243164, 1028468933, 1001909715, 1039027467); + sum2 = + W(0, 1036012528, -1136414534, 1028357901, 1018170307) + W(1, 996800246, -1115554829, 1018408279, -1128152611) + + W(2, -1111568121, 1023613585, 1046290638, -1086518431) + W(3, 1032866656, 1040198779, -1115393969, 1031067220) + + W(4, -1125130883, 1037328619, -1077265349, -1068062671) + + W(5, 1083861052, 1057186482, -1101393956, 1024816461) + W(6, 1019317279, -1141870971, -1105362146, 1041918725) + + W(7, 1040576139, -1110577355, 1032099345, -1109411807); + WS(1041081598, -1101063046); + sum1 = W(0, 1038662072, -1105628103, 1046838359, -1112508084) + + W(1, -1112561351, 1047812813, -1106996345, 1045311157) + + W(2, -1123374599, 1048894326, 1044003395, 1062900743) + W(3, 1058339600, 1041428913, 1044355834, 1013224727) + + W(4, 1035193857, -1098151405, -1109376817, -1082115704) + + W(5, -1087104856, -1097118497, -1098603955, -1110120844) + + W(6, -1104056554, 1009505700, -1107771451, 1039692648) + + W(7, 1049374543, -1126547869, 1037690530, -1121969199); + sum2 = + W(0, 1034938637, -1110454828, 1044300205, -1094841314) + W(1, 1049263704, -1123904781, 1032882093, 1018550156) + + W(2, -1102665080, 1066739686, 1063593500, -1072571644) + W(3, 1050585763, 1033188794, 1040935597, 992411043) + + W(4, -1083931487, 1057500561, 1069787057, -1073076170) + W(5, 1057940110, 1049962317, -1103057884, 1032437745) + + W(6, -1096043986, 1050111041, 1057117236, -1094917255) + + W(7, 992791419, -1119131193, -1129197337, -1139242755); + WS(1047493374, 1019974383); + sum1 = W(0, 1039818779, 1022499782, -1111466513, -1128872350) + + W(1, -1102282821, 1027318580, -1112367361, -1121442618) + + W(2, 1024992878, 1056719767, 1056992349, 1066523241) + W(3, 1057279594, 1050310409, 1043633508, 1050332018) + + W(4, -1099980259, -1093967742, -1089692488, -1081677329) + + W(5, -1104336096, -1095763174, -1147598863, -1103201160) + + W(6, -1119405261, 1017537921, -1134657044, 1032226588) + + W(7, -1110606353, 1029746358, -1105211995, -1109613299); + sum2 = + W(0, -1109381660, 1024006001, 1048332575, 1030946168) + W(1, -1111460550, -1115660792, 1027780517, -1125113546) + + W(2, -1099927212, 1048105027, 1083214625, -1068785948) + + W(3, -1080184440, -1125303858, -1129923962, 972536438) + W(4, 1032613200, 1031703418, 1051352300, -1082836395) + + W(5, 1047472657, 1027323348, 1006215943, -1123338357) + W(6, 1013674604, -1113331152, 1010546556, -1137462284) + + W(7, 1033485356, 1034637753, -1112671380, 1033990282); + WS(1049191295, 1026054180); + sum1 = W(0, 1015431080, -1114491642, -1106844240, 1052544606) + + W(1, -1101337172, 1006821496, 1048579163, -1107367092) + + W(2, -1104530451, 1045418990, -1091806904, -1092275830) + + W(3, 1032037152, -1091613549, -1136631349, -1104046587) + + W(4, -1120791464, -1105318659, 1059085476, -1096734436) + + W(5, 1055073816, 1054997266, -1117752159, 1054027444) + W(6, 1041795830, -1107859847, 1035107546, 1050727987) + + W(7, -1098252244, 1024892180, -1114835508, -1107321874); + sum2 = W(0, 1026733028, -1099170713, -1116840904, -1119731112) + + W(1, -1105853851, 1023766170, -1109160117, -1110446049) + + W(2, 1045033945, 1052123052, 1011374557, 1034116255) + W(3, 1042679995, -1103542762, 1002727514, -1116987471) + + W(4, 1006278578, -1100795787, -1137517037, -1093051584) + + W(5, 1032967726, 1030006514, 1010971477, 1032206215) + W(6, 1045459634, 1045732660, 1036547859, 1049735621) + + W(7, -1115758581, 1012804929, -1107202197, -1108882618); + WS(1061349183, 1052960956); + sum1 = + W(0, -1129777715, -1138324169, 1040354025, -1113069161) + W(1, 1026875928, -1148679486, 1026350741, -1099366619) + + W(2, -1091852750, -1098630008, -1086948121, -1087783598) + + W(3, -1090578505, -1098392878, -1105317245, -1113156712) + + W(4, 1051531432, 1050117038, 1058780391, 1063142264) + W(5, 1054898923, 1055753851, 1035239971, 1049214940) + + W(6, 1028688348, 1001458973, 1026112190, -1101543047) + W(7, 1001807913, -1107707133, 1009551482, 1035358529); + sum2 = + W(0, 1030464194, -1114101658, 1031167290, 1076423743) + W(1, 1075592137, -1122765276, -1073082101, -1067763317) + + W(2, 1016786912, -1111442214, 1040962599, 1052649879) + W(3, 1059016603, -1109148248, 1031660172, -1093716078) + + W(4, -1124271380, 1036708968, -1145350210, -1106763968) + + W(5, 1036666460, -1102467968, 1040647493, -1123536642) + + W(6, -1112870762, 1035127660, -1119263136, 1030450749) + + W(7, -1114823676, 1030453841, -1120712732, 1004437586); + WS(1049240575, 1032641532); + sum1 = W(0, 1013730783, -1105480706, -1114036922, -1113879072) + + W(1, -1104229785, -1108053747, -1114764169, -1146082265) + + W(2, 1058635434, 1033988870, 1060052265, 1060507082) + W(3, 1060417175, 1056801557, 1045744608, 1050162924) + + W(4, -1096215015, -1101342144, -1095577996, -1090178495) + + W(5, -1088104859, -1096180920, -1096622362, 1035143657) + + W(6, -1112522509, -1114702617, 1026538642, -1118644393) + + W(7, 1026113715, -1115402364, -1165415829, -1096614130); + sum2 = W(0, -1122276311, 1035291415, -1120194245, 1040446858) + + W(1, -1120530587, -1138075205, 1025217366, -1118638617) + + W(2, -1070701037, -1088124412, 1066415245, 1074084237) + + W(3, 1049852139, -1122804719, 1023048268, -1139513797) + + W(4, -1102500792, -1135890037, 1041496354, -1104713726) + + W(5, -1121031703, -1103825640, -1123990667, 1028358694) + + W(6, -1123484857, -1122878839, 1004310705, 1043449641) + + W(7, 1033156545, 1027648711, 1022832518, -1136916673); + WS(1058199967, 1050173679); + sum1 = W(0, 1035142580, 1027370573, -1130262537, 1035504777) + + W(1, -1114438555, -1117883815, 1019391016, 1002653538) + W(2, 1049466778, 1058691576, 1039593430, 1068404719) + + W(3, 1055172389, 1049428736, 1057860609, 1038434456) + + W(4, -1090097411, -1101732588, -1086371009, -1088745136) + + W(5, -1085029652, -1087836907, -1099893249, -1090680108) + + W(6, -1180331449, 1040649373, -1120260556, 1040680775) + + W(7, 1044382793, -1124005336, 1042216563, -1112700144); + sum2 = W(0, -1116884059, 1053572077, -1098664530, 1052736946) + + W(1, -1109898534, -1100793752, 1049155169, -1110972354) + + W(2, -1098591960, 1057696884, -1094622297, 1068603564) + + W(3, -1110319390, -1092295148, 1060435963, -1093610507) + + W(4, 1049382153, 1027480579, -1090176467, 1060239128) + W(5, 1035982822, -1110105636, 1048950002, 1038370396) + + W(6, -1103314039, -1088718218, -1083506692, -1093271444) + + W(7, -1100206230, 1032439700, 1034453968, 1006875670); + WS(-1089372991, 1071972514); + sum1 = W(0, -1138920887, -1111770809, -1102811010, -1115715559) + + W(1, 1039086134, -1097310634, 1031148825, 1025838913) + + W(2, 1036533027, -1104793556, 1055175791, -1099167419) + + W(3, -1087507272, 1049070430, -1119324807, 1003453989) + + W(4, -1102318256, 1048489074, -1087761408, 1059252133) + + W(5, 1053162297, -1114433380, -1118494745, 1042268638) + W(6, 994211079, -1105180974, 1048668925, 1002658941) + + W(7, -1118760057, 1015366427, 1042346841, 1035401151); + sum2 = W(0, 1030112837, -1120976510, 990074782, -1093456890) + + W(1, 1037465699, 1026987255, -1141406991, -1139369648) + W(2, 1042265630, 1036120703, 1034066763, 1054439327) + + W(3, -1093016348, 1018637880, -1135344000, 1039303764) + + W(4, 1026971571, -1114486026, 1060265655, 1048349987) + + W(5, -1099844302, 1021593632, -1122669452, -1105461723) + + W(6, -1110663804, 1036038820, -1093575269, -1097582212) + + W(7, 1034062294, 1015927322, -1131991172, -1112258092); + WS(1064707295, -1106068023); + sum1 = W(0, -1099232505, 1035233224, 1008917721, -1113461090) + + W(1, 1030936392, 1004172005, 1027313190, -1115756158) + + W(2, -1122722466, -1096714286, -1092366070, -1085444145) + + W(3, -1087864449, -1089654074, -1109977746, -1096643772) + + W(4, 1050522762, 1050648196, 1057836626, 1065526616) + W(5, 1058128499, 1053303385, 1046037453, 1045431365) + + W(6, -1163785122, 1029641572, -1106158547, -1112344246) + + W(7, -1120989814, 1023496586, -1132212895, 1026679026); + sum2 = W(0, -1064765544, -1081497441, 1073825520, 1076205171) + + W(1, -1119211273, 1027623494, 1025169073, 1044157267) + W(2, -1093639717, 1052279998, 1049786220, 1062543003) + + W(3, -1112239696, -1095053933, 1041086677, -1111173396) + + W(4, 1043466147, -1106897145, -1111313590, 1028519541) + + W(5, -1110796836, 1038884306, -1138045203, -1103601885) + + W(6, -1118670633, 1026058867, -1120615525, 1005098917) + + W(7, 1002459349, 1024155429, -1139354443, 1031190784); + WS(-1111449083, -1157616163); + sum1 = W(0, -1140902742, -1108906886, -1107746707, -1091492130) + + W(1, -1106259270, -1123578095, -1112828291, -1129218172) + + W(2, 1050785866, 1041550344, 1063519767, 1070223306) + W(3, 1056548545, 1033679887, 1033485706, 1037279241) + + W(4, -1096435822, -1095149714, -1097214657, 1059314470) + + W(5, -1091358630, -1102873285, -1098893397, -1105253969) + + W(6, -1106580347, -1111739842, -1112949561, -1090511327) + + W(7, -1115482851, -1102694659, -1119291392, -1105806553); + sum2 = + W(0, 1036877913, -1107073590, -1107699229, 1043855187) + W(1, -1112562117, 1015957137, -1137092650, -1113777301) + + W(2, -1106537131, 1029358898, 1059152956, 1059494373) + W(3, -1100478450, 1042289801, -1117856531, 1034651775) + + W(4, 1030920508, -1148982309, -1101290720, 1057939604) + + W(5, 1054005616, -1078154452, 1052159854, -1095096566) + + W(6, -1107276407, -1158332371, -1104066278, 1057817844) + + W(7, -1089434898, 1041374005, -1109759735, -1112996199); + WS(-1078462192, -1081042006); + sum1 = W(0, 1031777492, 1032754472, 1041664052, -1097597536) + + W(1, -1104816664, -1113883983, 1034668408, -1123431127) + + W(2, -1099264287, 1043123090, -1089905073, 1061087074) + W(3, 1058804947, 1049386855, 1033759807, 1048603595) + + W(4, 1046006998, -1098614104, -1129274543, -1106235787) + + W(5, -1084543524, 1054195792, -1107840264, 1024992909) + W(6, 987183826, 1036343655, 1009990171, -1097811109) + + W(7, 1031138063, -1097275448, 1026038601, -1120606380); + sum2 = + W(0, 1045113399, -1114091637, -1107885511, -1138476145) + W(1, -1105540689, 1035866831, -1106333432, 1027850472) + + W(2, 1042319052, -1104675582, -1091877193, 1051152873) + W(3, -1091823953, 1034466874, 1039480371, 1012452041) + + W(4, -1096815184, -1111655631, -1112520325, 1061790396) + + W(5, 1058061302, -1097657024, 1040922298, -1158709515) + + W(6, -1116743882, -1101972302, 1050965596, 1049921296) + + W(7, -1092103725, 1042351236, -1102843808, -1125733657); + WS(1056694143, -1116016311); + sum1 = W(0, -1113789237, -1100431022, 1050877939, 1018856325) + + W(1, 1050520537, -1097203011, -1103919120, -1146363818) + + W(2, 1051083644, -1126988186, 1064972735, 1040063173) + W(3, 1063261729, 1049408537, 1026641091, 1053332672) + + W(4, -1097139864, -1094809972, -1089357240, -1094444318) + + W(5, -1089641983, -1094346349, -1100978845, -1097363714) + + W(6, -1123205479, 1034447326, 1036660918, -1108178982) + + W(7, 1047968461, -1113292277, 1038849023, -1114302469); + sum2 = + W(0, -1117908102, 1013765983, 1045942570, 1086231745) + W(1, 1048993826, -1110131683, 1005670802, -1126497913) + + W(2, 1019359999, -1145413682, -1095749402, -1062836828) + + W(3, -1094656357, 1037693606, -1125761673, 1018172516) + + W(4, -1120905960, 1028148573, 1032861566, -1087097136) + + W(5, -1145044098, 1040390747, -1112982831, 1016402027) + W(6, 1017197102, 1027705717, -1127537989, 1031521084) + + W(7, 1027867224, -1114691836, 1031905995, -1122299754); + WS(1058898623, -1129627348); + sum1 = W(0, -1115961291, -1114910804, -1099814536, 1014875535) + + W(1, 1042946610, 1008636276, -1106406626, -1120594878) + W(2, 1024824451, 1028416398, 1053775806, 1049045373) + + W(3, -1081844071, 1031972351, 1007262993, 1044145240) + + W(4, 1015893437, -1107386562, -1081677098, 1054905786) + W(5, 1057687981, 1045923489, 1043411542, 1016529769) + + W(6, -1111982511, 1040362701, 1049488325, 1016424474) + + W(7, -1105282974, -1118478155, 1018226304, 1008933435); + sum2 = + W(0, -1133545882, 1048887568, -1092588040, 1040041167) + W(1, -1098849827, 1009986974, 1044263399, -1120224962) + + W(2, 1024635319, -1104650552, -1106613727, 1061771033) + W(3, 1059347143, 1020453405, -1100016935, 1003801667) + + W(4, -1123675276, 1009836758, -1090053582, 1063348295) + + W(5, -1095509129, -1091467004, 1034750124, 1013849670) + + W(6, 1049399700, -1109494815, -1105276085, -1099749985) + + W(7, -1094328117, 1040581639, 1041257354, -1116729410); + WS(1051954047, 1053754534); + sum1 = W(0, -1115617616, 1024010640, -1105864485, -1104806436) + + W(1, -1109064955, -1116880702, -1125878182, 1017392662) + + W(2, 1038078984, 1036755054, 1063482792, 1054877383) + W(3, 1061183100, 1032370277, 1043596932, 1041423460) + + W(4, 1012663597, -1111840872, -1094956956, -1088048944) + + W(5, -1092794954, -1106496725, -1106933961, 1027390113) + + W(6, -1106689047, 1027644834, 1000291764, -1099610254) + + W(7, 1030290339, -1110075188, -1134690355, -1125796047); + sum2 = + W(0, 1032585330, -1120362784, 1053495069, -1103911013) + W(1, -1152525762, -1128147020, 1012657824, -1104983105) + + W(2, 1041153226, 1038083675, -1085822417, 1062089523) + W(3, -1088542584, 1044421032, -1113855086, 1041652917) + + W(4, -1098242715, -1097998955, -1097864806, 1056336567) + + W(5, 1061326318, 1046053205, 1042938789, -1160964996) + W(6, 1045110917, 1041971655, -1094674500, -1090235355) + + W(7, -1100885631, -1141849761, -1114518568, 1032164357); + WS(1061027871, -1104546242); + sum1 = W(0, -1105616597, 1044372474, 1021564129, 1044930783) + W(1, 1046184033, 1039863327, 1037242932, 1036593932) + + W(2, 999947493, -1093243621, -1093936864, -1082760108) + + W(3, -1089254915, -1087020314, -1095491356, -1089177610) + + W(4, 1020340785, 1054887248, 1050165368, 1059757863) + W(5, 1059995997, 1055330116, 1049586618, 1053764638) + + W(6, 1044086916, -1111771647, 1042456335, -1109427891) + + W(7, -1109416824, -1114227250, -1119355674, 1025046581); + sum2 = + W(0, -1071093827, 1026041138, 1068370917, 1068180608) + W(1, -1099034443, -1126398467, -1114641099, 1032038973) + + W(2, 1060306884, -1087262504, -1080863241, -1104665609) + + W(3, 1065726420, 1036496204, 1052019191, -1112342652) + W(4, 1049935328, -1137957530, 1024099582, -1097098353) + + W(5, -1115701817, 1043337171, -1155572887, 1039831002) + + W(6, -1107356858, 1030953599, 1026067688, -1149593287) + + W(7, 1031805059, -1111590832, -1110320626, -1165279566); + WS(-1085156031, 1045210454); + sum1 = + W(0, 1032928297, -1111119484, 1023710638, 1012189550) + W(1, -1119437633, 1039427612, -1114651991, 1039591187) + + W(2, 1062377574, 1050029461, 1062121112, 1061895670) + W(3, 1058328143, 1050106073, 1051812528, 1050020631) + + W(4, -1090582815, -1097825399, -1087364538, -1084850381) + + W(5, -1086721078, -1087870448, -1095972450, -1089842983) + + W(6, -1097791665, 1025846477, 1032229097, 1038427330) + W(7, 1040335420, 1036234257, 1026163704, -1146480404); + sum2 = + W(0, -1123647935, 1039341132, 1035983028, -1100132407) + W(1, -1107056231, 1035406254, -1116224056, 1039408558) + + W(2, 1061817512, 1048143772, -1106274437, -1080635557) + + W(3, -1101127944, -1113472410, 1025367216, -1101636583) + + W(4, 1083879676, 1075567701, -1081957201, -1069811820) + + W(5, -1080342730, -1083251742, -1113852980, -1087422720) + + W(6, 1056516802, 1037735150, 1028242764, -1096421593) + W(7, 1035329144, 1030744652, -1094803270, 1049804166); + WS(-1079692512, 1054562755); + sum1 = W(0, -1109749038, -1107273417, -1102577952, 1030213964) + + W(1, 1036563817, 1046944740, 1031914983, 1050658577) + W(2, 1042438683, 1049923207, 1044388569, -1113189609) + + W(3, -1089184118, -1087748930, -1096053014, -1091524869) + + W(4, -1092016161, -1091034933, -1089719139, 1050309800) + + W(5, 1048990040, 1053009554, 1048709856, 1049517424) + W(6, 1050333996, 1042543591, 1055304278, 1034159515) + + W(7, 1040366472, -1122229091, 1006842402, 1034826102); + sum2 = + W(0, 1041125733, -1097603156, -1103003109, -1107000988) + W(1, 1032085636, 1048646468, -1094740103, 1056003520) + + W(2, -1094982607, 1045744428, -1102781952, 1063877853) + + W(3, -1096755169, 1041101455, 1038162032, -1106723297) + W(4, 1055140379, 1049918932, -1106862916, 1066829095) + + W(5, -1090474230, -1081598978, 1049572267, -1085369603) + W(6, 1061130686, 990353951, 1058588396, -1096233798) + + W(7, -1095838692, -1089860215, -1096717844, 1044183141); + WS(-1080283264, 1053171958); + sum1 = W(0, 1045885175, -1113658461, 1034538909, 974135701) + W(1, -1122513036, -1118011958, 998696774, -1108239136) + + W(2, 1054395509, 1050045174, 1055879386, 1060600957) + W(3, 1061640838, 1060753746, 1054788217, 1061053402) + + W(4, -1083475508, -1095192933, -1085810962, -1084797135) + + W(5, -1086057732, -1087204563, -1092652351, -1108529436) + + W(6, 1028512496, 1035446876, 1026195253, 1044250612) + + W(7, 1037521197, -1117222317, 1038575473, -1101819472); + sum2 = W(0, 1049760823, -1132622893, 1033001558, -1136534149) + + W(1, 1043696998, -1092886300, -1098156850, 1058228696) + W(2, 1082611215, 1077078383, 1066257283, 986681348) + + W(3, -1084657320, -1069070549, -1072372844, -1074505611) + + W(4, -1114287788, 1055018182, -1101461080, -1078537691) + + W(5, 1054805894, 1065047159, 1049854091, -1082348593) + + W(6, -1130959534, 1035090608, -1112584386, -1090394759) + + W(7, 1058031741, 1038822180, 1041633511, -1115499033); + WS(-1073398920, 1057727890); + sum1 = + W(0, 1041979362, -1106188342, -1108985859, 1040300287) + W(1, 1044683952, 1046284093, 1044621499, 990388050) + + W(2, 1052994159, 1056847849, 1060197326, 1059196498) + W(3, -1094535618, -1094105983, -1102914751, 1043962286) + + W(4, -1092671491, -1087976920, -1085676269, -1108460501) + + W(5, 1051731585, 1046385743, 1031818215, -1104493131) + W(6, -1110295050, 1033778006, 1040328063, -1114468666) + + W(7, -1102804911, -1098429184, -1104640754, 1033981777); + sum2 = W(0, 1021160276, -1093219342, -1089562294, -1106388958) + + W(1, -1099093932, -1180890998, -1090965228, 1057228486) + + W(2, -1089430647, -1135654176, -1079796815, 1074674993) + + W(3, -1098010580, 1052929457, 1040584224, 1047748991) + + W(4, -1102895535, 1044152573, -1095163331, 1074136497) + + W(5, -1095203310, -1099885509, 1041387674, -1131585606) + + W(6, 1031984432, -1096279754, 1011763192, -1101895278) + + W(7, -1117345690, -1095468231, -1107912603, 1045144673); + WS(-1087643711, 1073414034); + sum1 = W(0, 1043421796, -1116796288, 1042590607, -1098636497) + + W(1, 1008405302, 1005024220, -1106384411, 1029633907) + W(2, 1043019738, 1056957030, 1048028053, 1065994910) + + W(3, 1061262410, 1059267719, 1045820026, 1054563645) + + W(4, -1091862260, -1093379129, -1089120888, -1081315117) + + W(5, -1088787029, -1093593189, -1108751805, -1106230054) + + W(6, 1028452722, -1112484637, 1043084437, -1120978641) + + W(7, 1046109207, -1105879924, 1024805700, -1095994501); + sum2 = + W(0, 1015257573, -1117575950, 1040590395, 1040031817) + W(1, -1104875608, -1111928738, -1124331304, -1104400845) + + W(2, -1101361376, 1051853927, 1007636882, -1085239439) + W(3, 1029484438, 1055085469, -1104410806, 1055334030) + + W(4, -1151605286, -1126719224, -1099060090, -1069257368) + + W(5, 1078894141, 1065488662, -1097362053, -1099504604) + + W(6, -1114431290, -1122150057, -1123376079, -1122292554) + + W(7, 1045790053, -1105709439, 1046590167, -1096100911); + WS(-1089052703, 1050218486); + sum1 = W(0, 1024924308, -1124263665, -1114112032, -1101857739) + + W(1, 1004177297, -1132101549, 1037546120, -1127618735) + W(2, 1032977094, 1048865735, 1032370348, 1057017435) + + W(3, -1096925880, -1106597310, -1101706323, -1138126252) + + W(4, -1127622480, -1103037451, -1093324152, -1130658874) + + W(5, 1049797356, -1147023991, -1148374781, 1041185327) + + W(6, 1016061078, 1027347950, 1047024376, -1114101947) + + W(7, -1136753151, -1136950735, 1016234194, -1135392976); + sum2 = + W(0, -1103127935, 1034551493, -1131095837, 1056852609) + W(1, 1041291951, 1031312786, -1119687326, -1125922018) + + W(2, 1033687244, -1111330163, -1111327049, -1097897810) + + W(3, -1092598078, 1027703970, -1119650108, 1037109557) + W(4, 1044282132, -1132159854, 1043675418, 1038437355) + + W(5, -1085166716, -1122838335, 1030316614, -1115941571) + + W(6, -1115309191, -1101537844, 989659429, -1126658673) + + W(7, -1101159602, 1065573620, 1035948285, 1021015548); + WS(1065854560, -1114586365); + sum1 = W(0, 1025132845, -1132208108, 1043375962, 1036127555) + W(1, 1042813603, 1042302785, 1041475414, 1044294516) + + W(2, -1093129789, -1097600366, -1094779500, -1085251325) + + W(3, -1085614646, -1083792532, -1088034874, -1081301837) + + W(4, 1039292161, 1047014713, 1054220253, 1059484531) + W(5, 1058902029, 1058554289, 1049492791, 1057966909) + + W(6, 1052478106, -1114318540, 1045472794, 1040640636) + + W(7, 1026772633, 1030110605, -1123458066, 1048041627); + sum2 = + W(0, -1082315074, 1044643809, -1098370418, 1032322202) + W(1, -1088636595, 1057109638, -1093539506, 1061431798) + + W(2, -1085719643, 1026206592, 1060376399, 1066420950) + W(3, 1042910065, 1025783712, -1117795056, -1120476284) + + W(4, 1072912386, -1098026838, 1068488422, 1072201946) + + W(5, 1055106268, -1087763572, -1084317601, -1077472196) + + W(6, -1097858732, -1097387905, -1097681385, -1095903963) + + W(7, -1092707091, -1104219349, -1087895305, -1105350768); + WS(-1071370880, 1080498273); + sum1 = W(0, -1117491793, 1039364315, 1035846886, 1023528601) + + W(1, -1131889533, -1106314247, 1028375004, 1013100112) + + W(2, -1117320376, -1100646881, -1094786920, 1045848824) + + W(3, 1057069771, 1055228236, 1020389492, -1127017775) + W(4, 1025681812, 1049740511, 1058631773, -1094741601) + + W(5, -1088346742, -1102894479, -1138962992, 995411618) + + W(6, -1112958490, -1103504723, -1105396320, 1032469201) + + W(7, 1034336534, -1144513794, -1116565942, 1002008579); + sum2 = W(0, -1097850747, -1107398437, -1085613590, 1042292809) + + W(1, 1054106205, -1106648125, 1035361236, -1122554235) + + W(2, -1108946242, -1114277717, 1063125687, -1084555354) + + W(3, 1059764079, 1041901467, -1103098774, -1148617751) + + W(4, -1129761151, -1118690429, 1040789135, -1101999238) + + W(5, 1051725304, -1128317719, 1022272136, 1025957669) + W(6, 1024320851, 1012636527, 1029278628, 1026191463) + + W(7, -1119736004, -1127460399, -1115360404, 997652141); + WS(1058528159, 1053906024); + sum1 = W(0, -1112917396, 1035675727, -1104938189, 1040468760) + + W(1, -1105254898, 1020887917, -1113141838, -1149793215) + + W(2, -1104256080, -1092229473, -1097223269, -1082484606) + + W(3, -1103704557, -1100912091, -1118771074, -1099449368) + + W(4, 1023681564, 1058833811, 1051100098, 1061928249) + W(5, 1057519273, 1047691241, 1047329733, 1044776397) + + W(6, 1039659283, 1021887717, 1033492802, -1119337706) + + W(7, -1099217437, -1127325712, -1114402703, 1024214504); + sum2 = W(0, -1129442596, 1023778714, -1113953277, 1026809294) + W(1, 1035644478, 1034718426, 1016827280, 1038084720) + + W(2, 1040644144, 1033307012, 1056896617, -1080168883) + + W(3, 1030172798, 1046899220, -1114672577, -1138817753) + + W(4, -1106302200, 1056981996, 1082625405, -1064674592) + + W(5, -1098216535, -1107268878, -1138831353, -1118740750) + + W(6, -1105488042, 1014815489, 1048992482, 1043950232) + + W(7, -1120732434, -1121557578, 1026207834, -1122753582); + WS(1050028863, 1057904824); + sum1 = W(0, 1016998719, 1031484924, -1113918453, 1035763396) + + W(1, -1100192683, 1046082071, 1023767163, -1109585801) + + W(2, -1115527732, -1114471481, -1092713340, -1086973069) + + W(3, 1048884339, -1093669960, -1109475380, -1102684193) + + W(4, 1049960370, -1097014217, 1059124695, 1055821255) + W(5, 1045748179, 1046233018, 972758359, 1047341446) + + W(6, 1033316845, 1045307870, -1113659631, -1113580281) + + W(7, -1104759887, 1024760783, 1028768132, -1118597711); + sum2 = + W(0, 1042577042, 1035985609, -1132583692, -1108557005) + W(1, 1045882832, 1049978360, -1123148614, 1037998467) + + W(2, 1058174637, 1022451597, -1083350192, -1102051996) + + W(3, -1096734805, 1040525485, -1111555351, 1012738322) + + W(4, -1093234196, 1028288917, -1089654696, 1066585170) + + W(5, -1112976831, -1101233023, 1016281700, 1035922998) + W(6, 1036828005, 1036599280, 1043707159, -1099096459) + + W(7, -1117191962, 1038823523, 1010883764, -1106116243); + WS(1064158815, 1035299335); + sum1 = W(0, -1112803360, 987363362, 1040202935, -1148543050) + + W(1, -1119103150, 1016866897, -1120253212, -1136961231) + + W(2, 1016610641, -1111853690, -1090418272, -1086418793) + + W(3, -1096774480, -1106302329, -1125874772, -1111706212) + + W(4, 1043480489, -1116662313, 1043761841, 1062267936) + W(5, 1026731899, 1046949595, 1044534239, 1038415821) + + W(6, 1023721675, -1114846141, 1040437218, 1044974085) + + W(7, -1112576238, 1035797256, -1118929285, 1017229376); + sum2 = W(0, 982347958, 1032509555, -1111294086, 1034453505) + W(1, -1107492941, 1047671755, -1114281099, 1041657921) + + W(2, -1130481715, -1105443060, 1041532435, -1090026061) + + W(3, -1115327745, -1099067440, 1007189687, -1106888056) + + W(4, 1039697927, -1102232537, 1059036310, 1065332554) + W(5, 1049776291, 1035057967, -1116755236, 1039394631) + + W(6, 1029826582, -1106323503, -1087181565, -1095157490) + + W(7, 1032022369, -1113855935, -1137758215, -1116441678); + WS(1064590463, 1056702913); + sum1 = + W(0, 1029043770, 1053372231, -1096751755, 1042753121) + W(1, -1132040847, -1098166823, 1054745035, -1101919647) + + W(2, -1118119137, 1049750478, -1090400466, -1089893441) + + W(3, 1035942347, -1098407696, 1057009004, -1105867448) + W(4, 1044521535, 1040212560, 1048069253, -1098259842) + + W(5, 1046519145, -1126503113, 1029470901, -1137574860) + + W(6, -1108622774, 1055292354, -1086796959, 1028130891) + + W(7, 1043794349, -1097599727, 1057963224, -1099480944); + sum2 = W(0, -1112469736, -1109993908, -1113626244, -1101975228) + + W(1, -1113395603, -1115391866, -1111764318, -1114050909) + + W(2, 1047380321, 1048112351, 1039961237, 1053720344) + W(3, 1033059361, -1117206471, 1050486894, 1029031616) + + W(4, -1107309008, -1096267194, -1149218892, 1041967405) + + W(5, -1105421186, 1041082150, -1097114178, -1116211284) + + W(6, -1130012001, 1044766357, 1024449363, -1105185961) + + W(7, 1034928166, -1103730760, 1041700935, -1133808950); + WS(1049282175, -1081654589); + sum1 = W(0, 1026879882, -1106636470, 1025593670, -1120434947) + + W(1, -1109057316, -1103814142, -1108405355, 1025046173) + + W(2, 1056840376, 1051340514, 1059046350, 1060994015) + W(3, 1062254571, 1054415372, 1044610849, 1057281100) + + W(4, -1089715922, -1103588481, -1087728227, -1081081863) + + W(5, -1089160278, -1110084674, -1097611347, -1102762237) + + W(6, 1023576205, 1019713064, 1018583793, -1116831948) + + W(7, 1040563949, -1148705741, -1130543166, -1108038889); + sum2 = W(0, 1021240677, -1117500355, -1104166105, -1110155670) + + W(1, -1101525323, -1099065181, -1135933351, -1100288377) + + W(2, -1112389783, -1154883848, -1102583420, 1061056453) + + W(3, -1123615532, 1038434309, 1041908272, -1120914319) + + W(4, 1025718250, -1096682611, 1048911763, 1065471868) + + W(5, -1149445264, -1090281103, 1042017461, -1131934595) + + W(6, -1104779102, 1051908652, -1093040032, 1051220588) + + W(7, -1113750073, -1098156535, 1046751376, -1100861861); + WS(1044733566, -1111466942); + sum1 = W(0, 1033634167, -1105078967, -1104340430, -1106426842) + + W(1, -1101553619, -1110993602, -1113465444, 1020428386) + + W(2, 1060020808, 1041929508, 1062221635, 1060048443) + W(3, 1059584252, 1054717575, 1044713794, 1047352089) + + W(4, -1092913556, -1103349137, -1092289734, -1090785767) + + W(5, -1094348262, -1097827057, -1098824243, 1041060918) + + W(6, -1112663104, -1134753630, -1126194825, -1110397240) + + W(7, -1114529117, -1113238887, -1140846474, -1094820883); + sum2 = + W(0, 1040248415, -1113076108, 1043824330, -1105221470) + W(1, 1036602392, -1134849104, -1163695359, 1011808464) + + W(2, 1084299283, 1066146464, -1073408210, -1067326117) + + W(3, -1097425816, 1016852200, -1119512248, -1118870508) + + W(4, 1054267917, 1032173778, -1102778436, -1084477148) + W(5, -1149511007, 1040914456, 1026379762, 1011171408) + + W(6, 1002599056, 1029289900, 1027082476, -1116688572) + W(7, 1024010398, -1121212984, 1007530464, 1020903456); + WS(1041204862, 1020998748); + sum1 = W(0, 1041320410, -1111643799, 1033147201, 1033305824) + + W(1, -1110534482, 1048653459, -1106102028, -1129433652) + + W(2, 1040787048, 1044400490, -1112000574, 1057857240) + W(3, 1058317173, 1013490791, 1040475768, 1032979455) + + W(4, -1129649268, -1096018340, 1041936758, -1090212595) + + W(5, -1083609992, -1108280561, -1098465902, -1104103124) + + W(6, -1136864165, -1123167632, 1014392453, 1043382402) + + W(7, 1046901861, 1040774794, -1121200123, -1123801518); + sum2 = + W(0, 1033367466, 1036408153, 1049195658, -1116950481) + W(1, -1081345874, 1035726191, -1109751565, 1034565507) + + W(2, -1105739926, 1041467605, -1097896497, 1069287141) + W(3, 1045676499, -1097322898, 1034595972, 1022861151) + + W(4, 1035166617, -1116824529, -1127250349, -1103787577) + + W(5, -1104285546, -1110450029, 1041775082, -1111377560) + + W(6, -1121294834, 1020242785, 1024987646, -1113169844) + + W(7, -1109755223, -1162599282, -1128984227, 1015705141); + WS(1061587071, -1140717261); + sum1 = W(0, -1112565188, 1035683412, 1034588141, -1105710858) + + W(1, 1024277837, -1104681461, 1033519565, -1097426768) + + W(2, -1082585266, -1091946062, -1086181493, -1084260507) + + W(3, -1087521200, -1094344584, -1109665588, -1092361421) + + W(4, 1063001355, 1057075562, 1061257307, 1062016535) + W(5, 1059484653, 1051726365, 1053582679, 1050023351) + + W(6, 1029148274, -1133150565, -1121255338, 1031972073) + + W(7, -1140527211, 1015752222, -1140031633, 1054184694); + sum2 = + W(0, 1052095029, 1040595366, -1098987175, -1084153168) + W(1, -1091290481, -1096720628, -1101102486, 1044734380) + + W(2, -1068831962, -1076957703, -1081538085, 1037971476) + W(3, 1070110671, 1069986978, 1074264190, 1070997731) + + W(4, -1076286348, -1081349117, -1088771362, 1057908839) + + W(5, -1114213425, 1063483875, 1068552571, 1075267150) + W(6, 1061242602, 1046002483, 1040290526, -1093902656) + + W(7, -1094367529, -1094489561, -1099236623, -1081182731); + WS(-1071242520, -1095264341); + sum1 = W(0, -1097248122, 1017326143, -1105336241, -1091856432) + + W(1, 1051920949, -1097210280, -1122345698, 999615444) + W(2, 1057257956, 1050464317, 1059871125, 1058219580) + + W(3, 1056167546, 1051126389, 1047883744, 1055359408) + + W(4, -1095464807, -1098731544, -1096805078, -1088025845) + + W(5, 1032394345, -1089070234, -1102431837, -1098523426) + + W(6, -1098637431, 1039614697, 1034135507, -1098503641) + + W(7, 1057766069, -1095933097, 1030493340, -1112287963); + sum2 = W(0, -1132961311, 1034954689, -1131131128, -1105685093) + + W(1, 1044104138, -1118659572, -1117347443, -1140373421) + + W(2, 1038597560, -1114842936, 1039456110, -1104727669) + + W(3, -1085849936, 1053272959, -1117746499, 1049759548) + + W(4, -1089057302, -1113751042, -1095192990, -1097910004) + + W(5, 1064526735, 1045257331, 1054461586, 1062278408) + W(6, 1055074030, 1048893008, 1046429121, 1057064004) + + W(7, -1091871118, -1096323208, -1090448877, -1081803378); + WS(1055746431, 1040288248); + sum1 = W(0, -1154016945, -1117613130, -1108247483, -1114072538) + + W(1, -1103530014, -1134724696, -1102903742, 1046496384) + + W(2, 1057716289, 1055590360, 1059644857, 1067207252) + W(3, 1062212336, -1104299500, 1049302591, 1054319858) + + W(4, -1093759650, -1094487986, -1089867895, -1085229664) + + W(5, -1089860607, -1088563377, -1097577389, -1094962569) + + W(6, -1122750430, -1117149477, 1031955359, 1016534394) + + W(7, 1044969554, -1137442922, 1035178328, -1108831509); + sum2 = + W(0, 1041968914, 1026703145, 1033601916, 1035338047) + W(1, -1106207855, -1094112140, -1100978937, -1106593629) + + W(2, 1051752153, -1115260470, 1038625472, 1052354182) + + W(3, -1118891350, -1081023345, -1084581041, 1066756564) + + W(4, -1123800846, 1035127537, 1035458769, 1035609386) + W(5, 1057116581, -1104080857, 1055976243, -1101750238) + + W(6, -1117011966, 1031245794, -1109678904, 1050054059) + + W(7, -1098815779, 1038926653, -1108176195, -1107244818); + WS(-1089881759, 1037957184); + sum1 = W(0, 1000251530, -1117869170, 1029072469, 1031851625) + + W(1, 1024508279, -1105582638, -1121710869, -1105403363) + + W(2, -1098029886, -1095515176, -1089055515, -1079829205) + + W(3, -1094362449, -1105281331, -1112643769, -1102959900) + + W(4, -1105974859, 1060224425, 1060210489, 1061092856) + W(5, 1060581840, 1056017638, 1040568609, 1050032516) + + W(6, 1041712355, 1040628361, 1042449912, -1119516507) + + W(7, -1102207965, -1107063314, -1112932479, -1124065669); + sum2 = W(0, 1051114274, -1105565679, 1055378846, -1098769061) + + W(1, -1106275827, -1101598109, -1109849433, -1104426610) + + W(2, -1102532150, -1114476854, -1082969540, 1064670328) + + W(3, -1102001010, 1044770567, -1114021751, 1049459491) + + W(4, -1093533301, 1038543175, -1075201485, 1077554590) + + W(5, 1048871628, 1040464379, -1111404687, 1049461049) + + W(6, 1042271071, -1112348507, -1087360189, -1100903801) + + W(7, -1115312306, 1031777408, -1125205988, -1104546886); + WS(-1089609215, -1090633405); + sum1 = W(0, -1095985139, -1131730646, -1106836118, -1120898567) + + W(1, -1122196780, -1108220230, -1113602180, -1111282801) + + W(2, 1060468726, -1114989785, -1111340153, -1083229835) + + W(3, -1097505195, -1091862496, -1118278055, -1094974325) + + W(4, 1029992257, 1035463235, 1053834481, 1057093887) + W(5, 1060127651, 1056095953, 1053644551, 1060964715) + + W(6, -1106189340, -1121474072, -1109753904, -1170836447) + + W(7, -1099640750, -1106303115, -1102165833, -1114233933); + sum2 = W(0, -1102755055, -1123071369, -1101642458, -1121616776) + + W(1, -1123659230, 1034971308, -1114444448, 992820811) + W(2, 1028184991, 1018963304, 1042446539, 1048904011) + + W(3, 1022095962, -1102092583, -1115812270, -1115600403) + + W(4, 1014375557, 1034540123, -1110958917, 1055634924) + W(5, -1122273513, 1047229966, 1006913192, 1032293939) + + W(6, 1018724927, -1154538439, 1030328833, -1104340897) + + W(7, -1123674010, -1103087688, -1118183380, -1116477720); + WS(-1089497119, -1083970920); + sum1 = W(0, 1049400081, -1112985379, 1032734776, 1046931016) + W(1, 1032966898, 1026703569, 1023567673, 1020804657) + + W(2, 1017038202, 1054102421, 1052273107, 1050677101) + W(3, 1056472798, 1054012759, 1046736000, 1054561791) + + W(4, -1096866095, -1092440080, -1090492445, -1077775563) + + W(5, -1095500286, -1141821439, -1103091876, -1096856494) + + W(6, -1129668560, 1023489999, 1039999326, 1047866250) + + W(7, 1031139121, -1128248842, 1037611037, -1102316761); + sum2 = W(0, -1119432539, -1114702364, -1131454616, 1045807900) + + W(1, -1107556037, -1138592655, -1120197723, -1116354551) + + W(2, -1113150368, -1107904829, 1051795717, 1065572002) + W(3, -1104213250, -1096394963, 991774812, 991245404) + + W(4, 1049552369, -1109676099, 1049548364, 1052256292) + + W(5, 1058452060, -1077576443, -1102019177, 1049782966) + + W(6, -1123950204, 1034167140, 1018171432, 1024318084) + + W(7, -1104886632, -1103410805, -1103678409, -1123412946); + WS(-1092399743, 1070790531); + sum1 = W(0, 1031557241, 1024013147, 1045977841, 1049827334) + W(1, 1044712430, 1042539942, 1022243624, 1042631871) + + W(2, -1110110152, -1123928476, -1100428029, -1093314535) + + W(3, -1098211617, -1120318828, -1110797385, -1103475236) + + W(4, -1086332927, -1104003948, -1091187884, -1110202001) + + W(5, 1031718940, 1031171411, -1118825252, 1047659449) + W(6, 1040307665, 1029330819, 1054647477, 1048337215) + + W(7, 1045074033, 1042256462, 1034920639, 1041342974); + sum2 = W(0, 1035080118, -1111978522, 1043189101, -1107203795) + + W(1, 1020874649, 1040978901, -1103963851, 1014904337) + W(2, 1049091174, 1049791001, 1038894820, -1088677682) + + W(3, -1074681252, 1032440616, -1139760881, -1132242473) + + W(4, 1068767241, 1068692590, 1041587068, -1079138335) + W(5, -1088844169, 1033618204, 1036797334, 1040720920) + + W(6, 1056655092, -1120502660, 1054889999, -1094007639) + + W(7, -1106617291, 1037089622, -1115116202, 1029103732); + WS(-1076899872, -1090262268); + sum1 = W(0, -1111775583, -1105515965, 1031134981, -1152866339) + W(1, 1022185487, 1031461535, 991487050, 1013082739) + + W(2, -1105212520, -1109220950, -1105276619, -1081197371) + + W(3, -1085735312, -1090100176, -1106571081, -1094472404) + + W(4, 1053805936, 1044900104, 1061229259, 1056451270) + W(5, 1061180827, 1061600458, 1040836429, -1114201801) + + W(6, -1130865048, -1124779047, -1108606366, 1012899053) + + W(7, -1111684786, 1038272628, -1123743158, 1043636133); + sum2 = W(0, -1092758077, -1099940688, -1096959860, -1093749782) + + W(1, 1047974360, -1120633714, 1036248767, -1113388587) + + W(2, 1054372816, 1036990346, -1102824961, 1072234824) + + W(3, -1091574668, -1098403340, -1097220109, 1024848209) + + W(4, 1025999909, 1044094629, -1093700170, 1074465248) + + W(5, -1086059593, -1083936129, 1045585843, -1093741871) + + W(6, 1025560437, 1015649794, -1134776466, -1118772240) + + W(7, -1097328702, 1035273338, -1098634116, 1051989609); + WS(-1097318719, -1106686758); + sum1 = W(0, -1138034233, 1022220430, -1115259277, 1037878284) + + W(1, -1109043646, -1118564628, -1132126739, -1123355602) + + W(2, 1031803579, -1105675680, 1060345356, 1040095311) + W(3, 1057210483, 1018511203, 1038086620, 1040876381) + + W(4, -1107190316, -1110575515, -1091489993, -1082557626) + + W(5, 1054616755, -1113047197, 1037558661, 1040895458) + W(6, -1118470609, 1013564641, 1028754310, 1043380040) + + W(7, -1126688788, -1103180903, -1105313401, -1110366427); + sum2 = W(0, -1116780480, 1034654933, 1033980194, -1106740681) + + W(1, 1037910476, -1110588743, 1033369701, 1006481529) + W(2, 1011610145, -1109786563, 1034290987, 1058839838) + + W(3, -1112504437, 1048688059, -1100404580, 1024874106) + + W(4, -1126532250, 1049246354, -1098441369, 1055488745) + + W(5, -1081564854, -1109313096, 1046210019, -1122526519) + + W(6, 1031867194, -1117436106, 1050453777, -1098876833) + + W(7, -1101879397, -1105182695, 1033744368, 1042001428); + WS(1061957727, 1058150789); + sum1 = W(0, 1009728708, 1031914819, 1043097483, -1106863550) + + W(1, -1097372952, -1108191069, 1032793786, -1129266281) + + W(2, -1099288198, -1097230757, -1087266183, 1043273168) + + W(3, 1055416522, 1050026271, -1110590381, -1108247452) + W(4, 1046412713, 1055587995, 1056802398, 1049133325) + + W(5, -1086687979, -1105368103, -1107437206, 1042988739) + + W(6, 1036440691, -1109853493, -1106212891, 1023154886) + + W(7, 1047286155, 1036106272, 1024106902, -1120124353); + sum2 = W(0, 1021676194, -1104415808, 1041444786, -1104915444) + + W(1, 1042839409, 1025561656, -1111488206, -1119893126) + + W(2, 1026925373, 1041631623, 1049347642, -1075706495) + W(3, 1068941883, 1049874161, -1096918949, 1030080935) + + W(4, -1130821928, 1047340087, 1055108729, -1078646873) + + W(5, 1058328878, 1054741696, -1108156193, -1107876167) + + W(6, 1011207236, -1118374396, 1032289888, -1097824639) + + W(7, 1041964936, -1122940124, 1033049167, -1131526532); + WS(1058678303, 1013994144); + sum1 = W(0, -1118673511, -1145988558, -1107600786, -1097799452) + + W(1, 1050901309, 1025019066, 1034380585, -1117490811) + W(2, 1050426208, 1032382213, 1059103555, 1061451838) + + W(3, -1098106458, 1032049821, 1038038624, 1043957152) + + W(4, -1111022430, 1019043839, -1086017695, -1090188381) + + W(5, 1050664020, -1093177128, -1133222475, -1113568728) + + W(6, -1110204509, -1116037137, 1043824660, -1111434373) + + W(7, -1123560275, 1043538778, -1104489131, -1110765932); + sum2 = W(0, -1105859137, 1047608842, -1101390223, 1011548907) + + W(1, -1098146078, 1047719826, -1099968186, 1028887915) + + W(2, 1052524883, -1096529292, -1103682938, 1018027622) + + W(3, 1039330573, -1101134187, 1054816538, -1105962981) + + W(4, -1116369180, 1033298597, -1095014501, 1063707518) + + W(5, 1056731707, -1086128756, 1037701277, -1150004284) + + W(6, 1025172812, 1035180205, -1138831970, -1096368530) + + W(7, -1094263126, 1061932077, -1095466983, 1016476277); + WS(1063038079, 1033861047); + sum1 = W(0, -1111914898, 1040884807, -1102681756, 1061986003) + + W(1, -1095429920, -1109559865, 1034752240, -1104233906) + + W(2, 1016779545, 1014390112, -1109833994, -1095449911) + + W(3, -1097838100, 1019923216, -1148961393, 1009274926) + + W(4, -1107257338, 1045397811, -1096677860, 1065846455) + W(5, 1029008656, 1039008680, 1033037520, 1029851870) + + W(6, -1114919788, -1162045399, -1101855164, 1049909751) + + W(7, -1097193708, -1113534130, 1007645095, -1103320918); + sum2 = W(0, -1112457849, -1106002020, -1103752624, -1114732591) + + W(1, -1102536580, 1029961226, -1114728817, 1038070251) + + W(2, -1117177515, 1017665294, -1098231154, 1062239338) + + W(3, -1097906884, -1101585142, 1037597321, -1112453861) + + W(4, 1031942991, 1033022206, -1133545004, 1061426536) + + W(5, -1109528685, 1032626487, -1114069131, 1032988844) + + W(6, -1106095669, 1041685053, -1095196752, 1046863079) + + W(7, -1105989872, -1120505375, 1028074076, -1124888510); + WS(1060691839, -1121680521); + sum1 = W(0, -1112633460, 1034282296, 1016470792, -1124091490) + + W(1, 1036530779, -1110508885, 1036991882, -1133939630) + + W(2, -1105323108, -1097943963, -1091137362, -1083253895) + + W(3, -1090987401, -1090137469, -1098291034, -1093525810) + + W(4, 1045243383, -1117038833, 1060606770, 1065759511) + W(5, 1062311590, 1056765570, 1054157412, 1057599172) + + W(6, -1113361469, -1109479713, -1110311799, -1102522287) + + W(7, -1114082482, -1104777690, 1016563642, -1167556095); + sum2 = W(0, -1097189010, 1041454563, -1110771302, 1043926258) + + W(1, -1109373654, -1109768355, -1114304258, 1043669875) + + W(2, 1057901747, 1039698409, -1122301550, -1125642190) + + W(3, -1108285138, 1020817735, 1040279727, -1101494695) + + W(4, -1086723052, -1087530727, -1094374456, 1064818137) + + W(5, 1036021291, -1109979249, 1055924705, 1040712355) + + W(6, -1086497310, -1090377488, -1110538585, 1061014784) + + W(7, 1034378960, 1044647130, 1013465199, 1050381101); + WS(-1087684831, -1094525449); + sum1 = W(0, 1038107891, -1121734275, 1035814365, -1107604308) + + W(1, 1038052214, -1101928869, -1104767443, -1127021124) + + W(2, -1093934649, -1096975274, -1093954738, -1090018791) + + W(3, -1088075930, -1090123804, -1106254226, -1100235009) + + W(4, 1052573184, 1049163549, 1040479417, 1066601083) + W(5, 1058232216, 1057618495, 1040796439, 1051666987) + + W(6, 1038198313, -1113930844, 1035537105, -1102439448) + + W(7, -1113118893, -1148589172, -1146582942, 1033628463); + sum2 = W(0, -1102391770, 1032495868, -1140349122, 1051494072) + + W(1, -1080481573, -1072283498, -1085993190, -1091499210) + + W(2, 1038892506, 1032348345, 1055934176, 1066287204) + W(3, 1070533091, 1056179234, -1098172645, 1038613315) + + W(4, -1109920182, 1035913564, 1043439866, 1049172795) + + W(5, 1048700512, -1122911277, 1042548330, -1103404378) + + W(6, 1034045130, -1111661823, -1148365864, 1035742233) + + W(7, 1024670194, 1043482108, -1117726050, 1024343165); + WS(-1095407551, -1073547033); + sum1 = W(0, -1103915126, -1101976843, 1024335748, -1108044768) + + W(1, 1050893513, -1095324014, -1107189281, -1114975198) + + W(2, 1043640456, 1041775803, 1061599658, 1057524528) + W(3, 1060862745, 1028413803, 1044362232, 1051352312) + + W(4, -1106314263, -1098551608, -1096990689, -1095708126) + + W(5, -1102020840, -1092797676, -1110398586, -1097969466) + + W(6, -1099126911, 1023142916, -1110220795, -1106562202) + + W(7, 1056016670, -1099653918, 1031215069, -1138223071); + sum2 = W(0, -1112168075, -1111493200, -1123529566, 1022286331) + + W(1, -1103466952, 1035493883, -1113566520, -1106265315) + + W(2, 1034632723, -1122920764, 1009053647, 1049936313) + + W(3, 1051909492, -1099948229, 1029419308, -1107051081) + + W(4, 1034960798, 1040740621, -1105159128, 1057592446) + W(5, -1126339526, 1041517424, 1016655048, 1024151142) + + W(6, -1112860057, -1108202591, -1115675116, -1112708946) + + W(7, -1146770753, -1116950762, -1115594520, -1103163741); + WS(1063407871, 1051042354); + sum1 = W(0, 1005154604, -1120529264, -1106161584, -1130858780) + + W(1, -1114354154, -1127255711, 1023693521, -1115504868) + + W(2, 1049807310, 1052429035, 1057743574, 1063894449) + W(3, 1058090310, 1052514789, 1044231916, 1049931918) + + W(4, -1113122997, -1100831547, -1088929544, -1086654500) + + W(5, -1089886688, -1092092086, -1106897472, -1097639884) + + W(6, -1107282310, 1042685852, -1113923042, -1129272494) + + W(7, -1164896285, -1131567786, -1131959253, -1115987013); + sum2 = + W(0, -1113031572, 1030565628, -1127702936, 992883874) + W(1, 1014952720, 990495554, 1018238740, 1023316920) + + W(2, 1043434467, -1108784254, -1111949688, 1036810375) + + W(3, -1111107284, 1042918247, -1120169364, -1112993936) + + W(4, -1088941888, 1056568736, 1036016830, 1060861120) + W(5, 1023742716, -1098281783, 1022041004, -1112517088) + + W(6, -1067187434, -1079041185, 1074040966, 1075709893) + W(7, -1099161149, 992814626, 1039733673, 1028892682); + WS(1053166591, -1107822593); + sum1 = W(0, 1033874440, 1022746982, 1035703758, 1019810386) + W(1, 1044260196, 1042374543, 1040749291, 1041374685) + + W(2, -1120335240, 1031831786, 1052124034, 1048792350) + + W(3, -1095582904, -1088629918, -1097950065, -1085974448) + + W(4, -1105709561, -1108379508, -1093762507, 1046826502) + + W(5, 1053612659, 1045805451, 1037463342, 1042845918) + W(6, 1042509273, 1008295657, 1044631286, -1124953572) + + W(7, -1112928126, -1113071488, -1120529605, -1132054272); + sum2 = W(0, 1010990056, 1039106059, -1102786881, -1114641521) + + W(1, -1133768253, -1101476912, -1103607882, -1113060394) + + W(2, -1096561981, -1097601992, 1031463124, 1058004743) + + W(3, 1042505523, 1041182740, -1105959219, -1099775079) + W(4, 1040308359, 1052717590, 1058176412, 1045709336) + + W(5, 1034355291, -1096768246, 1033275384, -1105804625) + + W(6, -1119485380, -1115258493, -1101721469, -1138490792) + + W(7, -1101570252, 1029590734, 1037679123, 1036565969); + WS(1028916214, 1067075549); + sum1 = + W(0, 1039584518, -1119264713, 1016298993, -1105861885) + W(1, -1113980813, 1020015061, -1134777055, 1032661512) + + W(2, -1148995491, -1109885152, 1055889168, 1067421167) + W(3, 1059632007, 1055091716, 1045130509, 1052375930) + + W(4, -1098323934, -1096386895, -1096985498, -1085982162) + + W(5, -1087532161, -1088331431, -1095878225, -1104015130) + + W(6, 1026160863, 1022848653, -1150434165, 1034469007) + W(7, 1044152506, 1024761132, 1032543553, -1104676378); + sum2 = W(0, -1120016029, -1096222017, -1119382227, -1092715875) + + W(1, -1110818689, 1049876716, -1103484103, 1032841990) + + W(2, -1101422768, -1103630239, 1040689805, 1064582511) + + W(3, 1043406218, -1089499537, 1029271710, -1117522613) + + W(4, -1104653664, -1105545071, -1120927281, 1058022283) + + W(5, 1060808344, -1107109410, -1107008053, -1105419897) + + W(6, -1122344899, 1042131820, -1120071349, -1101606830) + + W(7, -1096987934, 1051590178, -1099435532, 1050342947); + WS(1047020030, 1040511430); + sum1 = W(0, -1108637223, 1033110649, 1044090139, 1043424750) + + W(1, 1036624046, -1120308481, 1033721201, -1106849700) + + W(2, -1092384755, -1090443530, -1085982557, -1080046633) + + W(3, -1083957593, -1096279270, -1149642107, -1100324533) + + W(4, 1057603229, 1053549631, 1061618217, 1047924234) + W(5, 1053999549, 1057048888, 1057845673, 1052833857) + + W(6, 1031927268, -1122999800, 1026366340, 1032840448) + W(7, 1015929108, 1020572028, 994286645, 1039624063); + sum2 = W(0, 1035208568, 1043030610, -1107699159, 1044796248) + + W(1, 1034655700, -1103668262, 1045164876, -1095424772) + + W(2, -1124082321, 1008382386, -1107061123, 1049576136) + + W(3, 1051573865, 1048541752, -1093669891, -1134934914) + + W(4, -1093736918, 1050323039, -1114950423, 1074526989) + + W(5, 1073198167, -1080621030, -1074078238, -1079139349) + + W(6, 1048736861, -1118377912, -1106119918, -1111443567) + + W(7, -1132389881, 1034733436, 1034120076, 1029501600); + WS(-1080108544, 1072234904); + sum1 = + W(0, -1115070415, -1130610603, -1098588213, 1057466749) + W(1, -1104374087, 1029557602, 1018553236, 1001112594) + + W(2, 1027588151, 1029085890, 1032775046, -1089931562) + W(3, -1123371019, -1094030554, 1034779836, 999211181) + + W(4, 1031137458, -1104252646, 1056995037, -1083673968) + W(5, 1052314097, 1050628415, 1033643941, 1036988180) + + W(6, 1018404227, 1044293186, 1028038521, 1050777268) + W(7, -1093125043, 1046325824, -1108340394, 1020739741); + sum2 = W(0, -1115557063, -1118678156, 1045099863, -1102856438) + + W(1, 1035209289, 1035167397, -1117208818, -1120387027) + + W(2, 1043108929, 1033401680, 1036186051, -1124450766) + + W(3, -1112637977, -1114646959, 1012643139, -1132473655) + + W(4, -1138826120, -1093193803, -1079584214, 1068262877) + + W(5, -1121148137, 1041792105, -1138286224, 1032348301) + + W(6, -1108049897, -1109597407, 1013268663, 1049634970) + + W(7, 1046161245, -1111895568, -1127251156, -1116707942); + WS(1061770399, 1033097145); + sum1 = W(0, -1127803310, -1108446526, 1046619869, -1102069216) + + W(1, -1115166002, -1107462472, -1113123881, -1109525661) + + W(2, -1100493560, -1122290538, -1090144134, -1124504076) + + W(3, -1096124978, -1113245389, -1115437168, -1114380655) + + W(4, 1049484359, 1040952192, 1049567736, 1060283011) + W(5, 1036170309, 1049188012, 1004781969, 1043620172) + + W(6, -1117956049, -1101349332, 1015706547, 1051006353) + + W(7, 1027971186, -1105896346, 1011773295, -1118021614); + sum2 = + W(0, -1115090363, -1146121477, 1029869322, 1039239074) + W(1, -1123366919, -1123569769, -1115297931, 1022224092) + + W(2, 1035607607, 1032878473, 1020296178, -1094567498) + W(3, -1133024223, -1111505684, 1036037468, 1025152664) + + W(4, 1036976780, 1008730983, 1050702114, 1060438996) + W(5, -1092544833, -1088372125, -1119747923, 1015952550) + + W(6, -1102631851, -1105868946, -1106613659, 1056742871) + + W(7, 1056526109, -1103439045, -1114092237, -1109382916); + WS(1063262431, 1041246684); + sum1 = + W(0, -1095604910, 1035931377, -1116408259, -1113418944) + W(1, 1035543059, -1109446615, 1041501409, -1111045021) + + W(2, -1094141452, -1103734011, -1088213584, -1084116356) + + W(3, -1088057339, -1084926720, -1095142868, -1085134126) + + W(4, 1054301899, 1050116188, 1059695011, 1063045487) + W(5, 1060587189, 1062081288, 1055163174, 1061043357) + + W(6, 1050361575, 1015464930, -1130477940, 1005018697) + W(7, -1114430457, -1112900435, 968128030, 1012274924); + sum2 = W(0, -1088652568, -1101936220, -1091191468, -1102444501) + + W(1, -1123800532, -1111069004, -1088813372, 1050243792) + + W(2, 1079171932, 1073764649, 1074855165, -1113430470) + + W(3, -1095064501, -1078839186, -1078450334, -1071519758) + + W(4, 1068650823, 1062997529, 1053027607, 1039600983) + + W(5, -1105207914, -1082346847, -1088354544, -1081653443) + + W(6, -1089634291, -1106083041, -1102140198, -1123235056) + + W(7, 1028735871, 1056073450, -1114344542, 1060600412); + WS(-1071343712, -1080188504); + sum1 = W(0, 1048814204, -1112944093, 1038698214, -1110388460) + + W(1, -1102353903, -1113346827, -1115354285, -1172877482) + + W(2, 1024112567, 992179242, 1035991718, 1065540811) + W(3, 1062800155, 1057270438, 1047814390, 1055244391) + + W(4, -1101821021, -1105846854, -1110088095, -1086620536) + + W(5, -1085891530, -1092189183, -1094362793, -1096652125) + + W(6, -1155239198, -1115614373, -1117961066, 1022833410) + + W(7, 1037955557, -1130491710, 1026576596, 1021561214); + sum2 = W(0, 1077488778, 1067869852, -1080283979, -1070445594) + + W(1, -1085461181, -1113067149, -1135625536, -1105631704) + + W(2, 1057844910, 1017329883, -1112258962, 1038200220) + W(3, 1045877800, 1016515143, 1029029881, 1026840239) + + W(4, -1110901413, -1123912240, 1048616910, -1103189448) + + W(5, 1033584054, -1113680120, 1006246833, 1028070058) + + W(6, -1157420388, 1016773013, -1127671945, 1027002057) + + W(7, -1139116556, -1108492850, 1033508697, -1122607860); + WS(-1114300667, -1123436789); + sum1 = W(0, 1048745214, -1106612992, 1040619730, -1101020989) + + W(1, -1120049178, -1129452308, -1112058252, 1040777596) + + W(2, 1024457460, 1049280824, 1061265254, 1066754197) + W(3, 1060475010, 1056957204, 1052291799, 1051532558) + + W(4, -1084727981, -1099711469, -1091611130, -1090437274) + + W(5, -1087975654, -1087165059, -1095257281, -1091858685) + + W(6, -1124831645, -1120312678, 991636461, -1115033343) + + W(7, 1037659252, 1036876438, 1024723233, -1128167880); + sum2 = W(0, -1102675226, 1045758589, -1106608364, 1037856863) + + W(1, -1121700495, 1038509645, 1041300787, 1013024414) + W(2, -1096018291, 1033992894, 1053924217, 1023354017) + + W(3, 1045521037, -1112080608, 1019757091, -1111416466) + + W(4, -1064870457, -1078407710, 1074354229, 1077566439) + + W(5, 1055978728, -1100523264, 1032114149, -1096094745) + + W(6, 1050758265, -1091427154, 1044800412, -1122690967) + + W(7, 1037435194, -1101170582, 1048475585, 1031501486); + WS(-1081349952, -1073531246); + sum1 = W(0, -1130396178, -1123247001, 1049234666, -1123595694) + + W(1, 1044575749, -1118849787, 1027091408, 1015989072) + + W(2, -1092471918, -1094799967, -1087091570, -1083589055) + + W(3, -1090515766, -1088301188, -1100895532, -1095518837) + + W(4, 1052933181, 1040552427, 1062313536, 1056428784) + W(5, 1060166366, 1052569014, 956727337, 1057005798) + + W(6, -1120779255, 1032899791, 1048808240, 1047688662) + + W(7, 1025076592, -1104574961, -1114767697, 1028829344); + sum2 = W(0, 1036727690, 1038605852, 1000461252, -1108807283) + W(1, -1118764382, 1040753555, 1025474323, 1026410269) + + W(2, -1101780564, 1036224480, 1043313873, 1058417373) + + W(3, -1110550387, 1041024731, 1032765623, -1114514162) + W(4, 1047063866, 1003722492, 1071364196, 1075919102) + + W(5, 1031984760, 1052825370, -1104266299, 1049040777) + + W(6, -1095151348, -1101329253, -1071443435, -1072909475) + + W(7, -1137970650, -1094681513, -1130737363, -1100563228); + WS(-1087415039, 1075227720); + sum1 = + W(0, 1014202565, -1121306305, -1115466670, 1055732347) + W(1, -1088701572, 1045428619, -1106855619, -1113272762) + + W(2, 1030200505, -1093044977, 1052765481, -1086016434) + + W(3, -1108244135, 1044242725, -1102530383, 1042147022) + + W(4, 1042588557, 1045750086, -1099185023, -1102841730) + W(5, 1060432915, 1001272287, 1047811955, 1043051755) + + W(6, 1032642210, 1039690838, -1099716881, 1054066516) + W(7, -1089156724, 1045967960, 994787170, -1114980876); + sum2 = W(0, 1034817173, -1106843150, 1035283571, -1117324330) + + W(1, -1106783723, 1033652183, -1105003316, -1109219720) + + W(2, 1033088277, -1115275500, -1108330169, 1059951304) + + W(3, -1114610359, -1130129964, -1100855920, 1017452836) + + W(4, -1105460751, 1042281307, -1117933953, 1055263105) + W(5, 1036736577, 1034893511, 1040893249, 1026860110) + + W(6, -1119967238, -1122100142, -1118763227, 1033190213) + + W(7, -1099584511, -1097591398, 1043864443, -1097701018); + WS(1061885343, -1093433134); + sum1 = + W(0, -1119074171, 1040591342, 1024365415, -1112185530) + W(1, -1102861510, 1047951017, 1033079635, 1030794670) + + W(2, -1116612499, -1106037336, -1090085717, -1110885309) + + W(3, 1058148680, -1098920364, -1104145445, -1102965524) + + W(4, 1043937396, 1035985530, 1054530437, -1105284753) + W(5, -1085809524, 1042740717, -1143903027, 1048819605) + + W(6, 1026065358, 1035233146, 1023445318, 1041032751) + W(7, 1043298226, 1028431483, 1030877520, -1110782149); + sum2 = W(0, -1120425303, 1041777983, 1008642595, 1038578170) + + W(1, -1103931105, -1144970974, -1139607395, -1105571910) + + W(2, -1115506247, -1109249837, 1051302633, 1062460419) + + W(3, 1046700430, -1110379832, -1121481149, -1125592805) + + W(4, -1089905659, -1082926483, 976609774, 1062992305) + W(5, 1016533657, 1046952726, -1128426413, 1044012895) + + W(6, -1106986872, -1093100415, -1100742938, -1121360027) + + W(7, 1026171953, -1123505732, 1047068010, -1108759193); + WS(1057387711, 1071476886); + sum1 = W(0, 1029774760, 1046876472, 1049447728, -1104814472) + W(1, 1047761369, -1107998911, 1035672969, 1025453339) + + W(2, -1088145158, -1090879061, -1087750555, -1081209882) + + W(3, -1102041597, -1088704948, -1101378696, -1090772220) + + W(4, 1058722665, 1046940920, 1062289140, 1060559271) + W(5, 1057163193, 1046238393, 1049034574, 1051154538) + + W(6, 1026644842, -1124024690, 1034805113, -1101227374) + + W(7, 1041428045, -1112057972, -1123650077, 1045125730); + sum2 = W(0, -1079574021, -1076424748, -1084651933, -1079383446) + + W(1, -1094010079, -1105513599, -1094989946, -1083946107) + + W(2, 1066168402, 1072246945, 1055648588, 1069722149) + W(3, -1105729737, 1052366950, 1046266897, 1064021500) + + W(4, -1106633910, 1039775524, -1122282375, 1050613020) + + W(5, -1112550614, 1046757765, 1041413657, -1117589808) + + W(6, 1033041398, 1025560740, 1042767844, -1122422479) + + W(7, 1029478726, 1029747528, -1132333344, -1110924549); + WS(-1088291167, -1076464582); + sum1 = W(0, 1038365083, 1013092187, 1049005176, -1096083994) + W(1, 1046666973, 1029385568, -1130846211, 1035921309) + + W(2, 1048475643, 1039614653, -1105893787, -1090164821) + W(3, 1048630844, 1052597003, 1030762351, 1049653618) + + W(4, -1115380053, -1115741870, -1115211424, -1106465144) + + W(5, -1092124773, -1097273638, -1104199584, -1098780292) + + W(6, -1113517956, -1118168192, 1038779144, -1103584918) + + W(7, 1051487172, 1036949051, 1029432699, 1041505439); + sum2 = W(0, -1102442432, 1042447103, 1009200726, -1140140535) + + W(1, 1018235219, 1038566242, -1105836948, -1119461411) + + W(2, -1119046775, -1103497340, -1108371687, 1063726871) + + W(3, 1023996549, -1100556235, -1134905751, -1115426548) + + W(4, 1038119755, -1117033259, -1111757198, 1053430514) + + W(5, -1097582390, -1130738637, 1027482933, 1038939472) + + W(6, -1116688635, -1109692823, -1136365839, -1103585210) + + W(7, 1035998106, -1122627505, -1113769016, -1131103707); + WS(1063535295, -1106643391); + sum1 = W(0, 998897947, -1114069468, 1030590255, -1120649212) + + W(1, -1112623985, -1135800742, -1126057998, -1118923687) + + W(2, 1049160779, 1050551697, 1037435628, 1059662980) + W(3, 1051258674, 1051146291, 1042046535, 1051522915) + + W(4, -1095715331, -1114097198, -1091439068, -1098500149) + + W(5, -1093374928, -1112852607, -1104302276, -1098602138) + + W(6, 1022592892, 1035333911, -1105875754, 1036951763) + + W(7, -1097348874, 1021555078, 1032877804, -1118947123); + sum2 = W(0, 1020791040, -1119848331, 1028098574, 1024075228) + + W(1, 1036335573, -1114214294, 1028067710, -1123998545) + + W(2, 1023004440, 1035188360, 1036866165, -1081188844) + W(3, 1036267331, 1020492762, 1026996488, 1028180222) + + W(4, -1131522740, 1010552055, -1087402238, -1063807577) + + W(5, -1074297638, 1044255896, -1109527927, -1125487816) + + W(6, -1130592194, -1114014595, 1057774258, 1085749988) + + W(7, 1072260443, -1101071935, 1041502854, -1121770211); + WS(1065370528, -1140007425); + sum1 = W(0, -1119191691, -1123119348, 1043193134, -1144777506) + + W(1, 1048874737, -1114692372, 1047204584, 1028382351) + + W(2, -1089109360, -1093467562, -1104035088, -1082641845) + + W(3, -1090665335, -1085597050, -1097312497, -1084438004) + + W(4, 1051697742, 1051845168, 1049231373, 1058881533) + W(5, 1060727795, 1053776045, 1050811579, 1054559607) + + W(6, 1048704645, -1120571445, 1047054964, -1128753754) + + W(7, -1122636375, -1135014444, 962936920, 1047044271); + sum2 = W(0, 1072219394, 1068804680, 1068134846, 1066171639) + + W(1, -1095987744, -1080918851, -1077110574, -1071545857) + + W(2, -1078126224, -1079031251, -1078951161, -1087436811) + + W(3, 1039512383, 1067164113, 1069504242, 1075315134) + + W(4, -1093298188, -1110022070, -1084926454, -1107767815) + + W(5, 1055586357, 1031793821, 1041030661, 1055897321) + W(6, 1011861728, 1040923692, -1105857084, -1121892273) + + W(7, 1026590003, 1040751494, -1123439499, -1109554506); + WS(-1089696543, -1143233957); + sum1 = + W(0, -1115482013, 1045323653, -1096516931, 1035013745) + W(1, -1162367211, 1054106403, -1107204469, 1036179510) + + W(2, -1129127938, -1098483714, 1045383939, -1091150045) + + W(3, 1043411549, -1086835476, 1048447553, -1103773800) + + W(4, 1041381507, -1110243009, 1059582003, -1106321908) + W(5, 1034020454, 1026676964, 1034191370, -1159158363) + + W(6, -1122467892, 1049605572, -1090424421, 1043667267) + + W(7, -1109629626, 1048548650, -1105600748, 1035568493); + sum2 = W(0, -1134008573, -1125596513, 1011008945, 1051842604) + + W(1, -1125276577, -1118729604, -1111959837, -1117720498) + + W(2, 1032064725, -1121806942, 1045441656, 1065460002) + + W(3, -1114964420, -1130705389, -1121883022, 1034360078) + + W(4, -1117795542, 1035355315, 1024667789, -1089961367) + + W(5, -1081892598, 1026896379, 1020053498, 1023648883) + W(6, -1113496357, 998755498, -1119910472, 1041632626) + + W(7, 1035390555, 1032979221, -1129745921, -1115672512); + WS(1065278079, -1120402802); + sum1 = W(0, 1031924074, -1115548942, -1106896516, -1112658654) + + W(1, -1103991244, -1121670257, -1115583119, 1031270934) + + W(2, 1052390115, 1049303261, 1045251552, 1060948388) + W(3, 1062622505, 1054395391, 1045812503, 1048618059) + + W(4, -1097070063, -1099757447, 1040981136, -1081623390) + + W(5, -1085365853, -1096062708, -1101077740, -1099232531) + + W(6, -1116671142, -1118597165, 1041336272, 1043338841) + + W(7, -1145407604, 1032773481, -1123616408, -1127437558); + sum2 = + W(0, -1114021356, 1032565152, 1056835748, -1085160508) + W(1, 1058685385, -1086618535, 1047242231, 1032715041) + + W(2, -1110767736, -1122384971, -1085457975, 1068814369) + + W(3, -1085213012, 1063574785, -1144776155, -1097434793) + + W(4, -1100377718, 1041858293, -1085697040, 1060746614) + + W(5, 1057245366, -1094120608, -1093482365, 1056356490) + W(6, 1034493514, 1019779384, 1016590225, -1097525969) + + W(7, 1043875459, -1097974912, 1054776673, -1096653037); + WS(1055688959, -1109584743); + + return clamp(mstd0 + 5.0 * vsum / wsum * mstd1, 0.0, 1.0); +} + +shared float inp[525]; + +#define CURRENT_PASS 2 + +#define GET_SAMPLE(x) dot(x.rgb, rgb2y) +#define imageStore(out_image, pos, val) imageStoreOverride(pos, val.x) +void imageStoreOverride(uint2 pos, float value) { + float2 UV = mul(rgb2uv, INPUT.SampleLevel(sam_INPUT_LINEAR, HOOKED_map(pos), 0).rgb); + OUTPUT[pos] = float4(mul(yuv2rgb, float3(value.x, UV)), 1.0); +} + +#define INPUT_tex(pos) GET_SAMPLE(vec4(texture(INPUT, pos))) +static const float2 INPUT_size = float2(GetInputSize()); +static const float2 INPUT_pt = float2(GetInputPt()); + +#define temp_tex(pos) (float(texture(temp, pos).x)) +static const float2 temp_size = float2(GetInputSize().x * 1, GetInputSize().y * 2); +static const float2 temp_pt = float2(1.0 / (temp_size.x), 1.0 / (temp_size.y)); + +#define HOOKED_tex(pos) temp_tex(pos) +#define HOOKED_size temp_size +#define HOOKED_pt temp_pt + +void Pass2(uint2 blockStart, uint3 threadId) { + ivec2 group_base = ivec2(gl_WorkGroupID) * ivec2(gl_WorkGroupSize); + int local_pos = int(gl_LocalInvocationID.x) * 15 + int(gl_LocalInvocationID.y); + for (int id = int(gl_LocalInvocationIndex); id < 525; id += int(gl_WorkGroupSize.x * gl_WorkGroupSize.y)) { + uint x = (uint)id / 15, y = (uint)id % 15; + inp[id] = + HOOKED_tex(HOOKED_pt * vec2(float(group_base.x + x - (1)) + 0.5, float(group_base.y + y - (3)) + 0.5)).x; + } + barrier(); + vec4 ret = vec4(0.0, 0.0, 0.0, 0.0); + vec4 ret0 = vec4(0.0, 0.0, 0.0, 0.0); + vec4 samples[8]; + samples[0][0] = inp[local_pos + 0]; + samples[0][1] = inp[local_pos + 1]; + samples[0][2] = inp[local_pos + 2]; + samples[0][3] = inp[local_pos + 3]; + samples[1][0] = inp[local_pos + 4]; + samples[1][1] = inp[local_pos + 5]; + samples[1][2] = inp[local_pos + 6]; + samples[1][3] = inp[local_pos + 7]; + samples[2][0] = inp[local_pos + 15]; + samples[2][1] = inp[local_pos + 16]; + samples[2][2] = inp[local_pos + 17]; + samples[2][3] = inp[local_pos + 18]; + samples[3][0] = inp[local_pos + 19]; + samples[3][1] = inp[local_pos + 20]; + samples[3][2] = inp[local_pos + 21]; + samples[3][3] = inp[local_pos + 22]; + samples[4][0] = inp[local_pos + 30]; + samples[4][1] = inp[local_pos + 31]; + samples[4][2] = inp[local_pos + 32]; + samples[4][3] = inp[local_pos + 33]; + samples[5][0] = inp[local_pos + 34]; + samples[5][1] = inp[local_pos + 35]; + samples[5][2] = inp[local_pos + 36]; + samples[5][3] = inp[local_pos + 37]; + samples[6][0] = inp[local_pos + 45]; + samples[6][1] = inp[local_pos + 46]; + samples[6][2] = inp[local_pos + 47]; + samples[6][3] = inp[local_pos + 48]; + samples[7][0] = inp[local_pos + 49]; + samples[7][1] = inp[local_pos + 50]; + samples[7][2] = inp[local_pos + 51]; + samples[7][3] = inp[local_pos + 52]; + ret[0] = nnedi3(samples); + ret0[0] = inp[local_pos + 18]; +#if CURRENT_PASS == LAST_PASS + uint2 destPos = blockStart + threadId.xy * 2; + uint2 outputSize = GetOutputSize(); + if (destPos.x >= outputSize.x || destPos.y >= outputSize.y) { + return; + } +#endif + imageStore(out_image, ivec2(gl_GlobalInvocationID) * ivec2(2, 1), ret0); + imageStore(out_image, ivec2(gl_GlobalInvocationID) * ivec2(2, 1) + ivec2(1, 0), ret); +} diff --git a/src/Effects/NNEDI3/NNEDI3_nns256_win8x6.hlsl b/src/Effects/NNEDI3/NNEDI3_nns256_win8x6.hlsl new file mode 100644 index 000000000..cd7248910 --- /dev/null +++ b/src/Effects/NNEDI3/NNEDI3_nns256_win8x6.hlsl @@ -0,0 +1,11232 @@ +// This file is generated by the scripts available at https://github.com/hauuau/magpie-prescalers +// Please don't edit this file directly. +// Generated by: nnedi3.py --nns 256 --win 8x6 --use-compute-shader --use-magpie +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +//!MAGPIE EFFECT +//!VERSION 4 +//!SORT_NAME NNEDI3_256_6 + +//!TEXTURE +Texture2D INPUT; + +//!SAMPLER +//!FILTER POINT +SamplerState sam_INPUT; + +//!TEXTURE +//!WIDTH INPUT_WIDTH * 1 * 2 +//!HEIGHT INPUT_HEIGHT * 2 * 1 +Texture2D OUTPUT; + +//!SAMPLER +//!FILTER LINEAR +SamplerState sam_INPUT_LINEAR; + +//!TEXTURE +//!FORMAT R16_FLOAT +//!WIDTH INPUT_WIDTH * 1 +//!HEIGHT INPUT_HEIGHT * 2 +Texture2D temp; + +//!SAMPLER +//!FILTER POINT +SamplerState sam_temp; + +//!COMMON +#include "prescalers.hlsli" + +#define LAST_PASS 2 + +//!PASS 1 +//!DESC NNEDI3 (double_y, nns256, win8x6) +//!IN INPUT +//!OUT temp +//!BLOCK_SIZE 32, 16 +//!NUM_THREADS 32, 8 +#pragma optionNV(inline none) +float nnedi3(vec4 samples[12]) { + float sum = 0.0, sumsq = 0.0; + [unroll] for (int i = 0; i < 12; i++) { + sum += dot(samples[i], vec4(1.0, 1.0, 1.0, 1.0)); + sumsq += dot(samples[i], samples[i]); + } + float mstd0 = sum / 48.0; + float mstd1 = sumsq / 48.0 - mstd0 * mstd0; + float mstd2 = mix(0.0, inversesqrt(mstd1), mstd1 >= 1.192092896e-7); + mstd1 *= mstd2; + float vsum = 0.0, wsum = 0.0, sum1, sum2; +#define T(x) intBitsToFloat(x) +#define W(i, w0, w1, w2, w3) dot(samples[i], vec4(T(w0), T(w1), T(w2), T(w3))) +#define WS(w0, w1) \ + sum1 = exp(sum1 * mstd2 + T(w0)); \ + sum2 = sum2 * mstd2 + T(w1); \ + wsum += sum1; \ + vsum += sum1 * (sum2 / (1.0 + abs(sum2))); + sum1 = W(0, -1118812211, -1118354985, -1108702207, -1107177196) + + W(1, -1116025261, -1113369587, -1126504964, -1117760744) + + W(2, -1127312137, 1040658850, -1105559165, 1024463101) + + W(3, -1120674615, -1117458482, -1124477727, 1041726453) + + W(4, -1102924251, -1120327001, 1037346316, -1097807929) + + W(5, 1051925971, 1061593601, -1098269094, 1015141868) + + W(6, -1120777358, -1114916026, 1042061230, 1053108884) + + W(7, -1109857889, -1129934237, -1137814218, -1101147334) + + W(8, 1032645830, 1029100907, -1121960158, -1114359336) + W(9, -1128256674, 978731342, 1026597474, 1023094846) + + W(10, -1133406593, 1018102856, -1118580651, -1112914505) + + W(11, 1040041685, 1010634196, -1137769344, -1124738995); + sum2 = + W(0, 1012167794, 1034293816, 1040949842, -1073125242) + W(1, -1098861131, 1034317546, 975711915, -1103749327) + + W(2, -1105000392, -1097051670, 1026609280, -1107080190) + + W(3, 1007876102, 1042152488, -1113573827, 1048636347) + W(4, -1103172582, 1037196612, -1112492311, 1032768248) + + W(5, 1065119806, 1064777150, 1028248806, -1106667446) + W(6, 1037438381, 1026775674, 1049707133, 1035198208) + + W(7, 1042916747, 1024046979, -1104922990, -1112883791) + + W(8, -1118855570, 1049268872, -1108803486, -1112062411) + + W(9, 1035896848, 1009005510, 1019305156, -1110039318) + W(10, 1037762592, 1031133421, -1129478003, 1029694272) + + W(11, -1105233202, 1045598091, 1002108025, -1116379320); + WS(1002542528, -1081598301); + sum1 = + W(0, -1123106403, 1018532849, 1058293919, -1096563748) + W(1, 1033211315, -1104454821, 1003194766, 1031358712) + + W(2, 1048723343, -1102943230, 1043311017, 1033034550) + + W(3, -1115291860, -1100442248, 1060312385, -1084853826) + + W(4, -1122032382, -1105126162, -1120609928, -1102109750) + + W(5, 1065191364, -1082116255, 1048832547, -1093430837) + + W(6, 1033033375, -1124327881, 1057579241, -1090047916) + W(7, 1045565001, 1033480943, -1104418325, 1022719310) + + W(8, 1055391647, -1090520747, 1034840623, -1104668395) + W(9, 1031657633, 1042404749, 1048926634, -1115672903) + + W(10, 1040065984, 1041617645, -1140694509, -1173350542) + + W(11, 1057234642, -1088607906, 1034960904, -1100859732); + sum2 = + W(0, -1118979564, 1038135851, 1040555036, 1046730291) + W(1, -1098841046, 1010901456, -1136455954, -1098903542) + + W(2, -1113356687, -1091503884, 1033064908, -1105119573) + W(3, 1031647880, 1043936541, 1041172918, 1053446821) + + W(4, -1105844234, 1050988870, -1098733088, -1095471090) + + W(5, 1058853402, 1057969905, -1107613268, -1096003667) + + W(6, 1032618663, -1114646115, -1111675314, 1026777488) + + W(7, -1104403193, 1040941647, -1115252794, 1050331000) + + W(8, 1042547849, 1032649026, -1109177822, -1135105484) + + W(9, -1105564107, -1107943513, -1102521857, -1097022326) + + W(10, -1106932655, -1111654963, 1028338874, 1030299514) + + W(11, 1048036907, 1045220138, -1104926499, 1015146572); + WS(-1089089900, 1057806976); + sum1 = + W(0, -1107295812, 1034138799, -1095422036, 1050726826) + W(1, 1041715821, -1107540610, -1127595840, 1025412102) + + W(2, -1098433268, -1189029283, -1122343505, -1114195981) + + W(3, -1123024597, 1036945929, -1092642698, 1055732365) + + W(4, -1122551116, 1004508092, -1107414907, 1043589025) + + W(5, -1086058047, 1066834483, 1012137296, -1123010964) + W(6, 1016079705, 1048626936, -1087422851, 1060391966) + + W(7, -1112593208, 1021997657, -1114511976, 1026901142) + + W(8, -1090938821, 1050840209, 1032081267, -1116540066) + + W(9, -1121404144, -1122208804, -1099844512, 1046023279) + + W(10, 1025525231, -1117735535, -1120167114, -1132433569) + + W(11, -1092394401, 1054523402, 1034856335, -1140325311); + sum2 = + W(0, -1100068589, 1045053907, 1035618626, 1049401249) + W(1, 1036897142, -1103084156, 1040406565, -1112537807) + + W(2, -1097933278, -1091711434, 1040848725, 1039746012) + + W(3, -1105732125, 1034765996, -1099579155, 1056573344) + + W(4, -1089717374, 1030295740, -1129255625, -1096936254) + + W(5, 1047111871, 1055190008, 1050298277, -1110783667) + W(6, -1110986904, -1098576495, 1056019034, 1058665437) + + W(7, -1089302244, 1041764164, 1041854514, -1119869595) + + W(8, -1119227686, -1092612461, 1058580142, -1100808273) + + W(9, -1108063740, -1108123574, 1029490732, -1121089271) + + W(10, -1127874601, 1022690203, 1040297872, -1106886121) + + W(11, 996712344, -1113107096, -1110437244, 1034569294); + WS(1049963735, -1124746024); + sum1 = W(0, 1006389467, 1034213253, 1058411598, -1089111694) + W(1, -1120169982, 1033778855, 991131306, -1110639240) + + W(2, 1049374726, -1111102680, 1039576302, -1134195605) + + W(3, -1124991168, -1124116580, 1060442825, -1086690096) + + W(4, 1018630958, -1122058050, 1036315168, -1106688436) + + W(5, 1064243752, -1080857842, 1032153615, 1024033695) + + W(6, -1114080443, 1016950458, 1058630778, -1086343400) + W(7, 1034713638, 1016006830, 1034164414, 1034354600) + + W(8, 1057235431, -1086990857, 1036089759, 1017381585) + + W(9, -1168983685, -1118357326, 1051622657, -1099687954) + + W(10, 1035150121, 1027377121, 1034869786, 1046100667) + + W(11, 1028310995, -1090257402, -1126482082, -1130216101); + sum2 = W(0, -1114775505, -1111353121, 1051023520, 1077280281) + + W(1, 1042396970, -1100155636, 1022693528, 1040828458) + W(2, 1041444385, 1083159907, 1039028690, 1038899070) + + W(3, 1033686534, -1108626677, -1101109690, -1090827263) + + W(4, -1129576724, -1108327399, -1159675846, -1179590680) + + W(5, -1089609004, -1064966677, -1146898193, -1128357112) + + W(6, -1112709023, 1041114289, -1101828769, -1073695373) + + W(7, -1117377551, 1026559236, 1033838002, 1028829848) + W(8, 1037546580, -1090323484, 1046069066, 1017563688) + + W(9, -1125624388, -1108121837, 1033655640, 1042738654) + + W(10, -1098820901, -1149039617, 1032684170, 1037026782) + + W(11, -1104771455, -1104201752, 1049907200, -1119733667); + WS(-1082925548, -1131273240); + sum1 = + W(0, -1130676005, 1028984921, -1090453298, 1056020338) + W(1, 1036092472, 1031745797, 1024417890, 1026031368) + + W(2, -1094705109, 1048479050, 1026370227, 1023514525) + W(3, -1127912110, 1046418962, -1088411833, 1054709085) + + W(4, 1040943828, -1139610597, -1123681912, 1048544370) + W(5, -1080625999, 1056570469, 1016526011, 1039178347) + + W(6, -1128802908, 1032747842, -1078821070, 1060414079) + + W(7, -1134933227, -1115579031, 1009745483, -1115143804) + + W(8, -1093720869, 1058018725, -1146727344, 1033865376) + W(9, 1030244593, 1035809011, -1115224705, 1048613352) + + W(10, -1126383553, -1123856496, -1124372951, 1012870858) + + W(11, -1099806226, 1053689379, 1034696072, 1032018765); + sum2 = W(0, -1117505397, -1114926763, 1048798551, -1102904639) + + W(1, 1025448640, -1112830121, -1126832117, -1140231915) + + W(2, -1146496262, -1113101086, -1129185935, -1125809392) + + W(3, -1116692107, -1125548157, 1045683415, -1125191934) + + W(4, 1034411663, -1121525964, -1107644007, -1125354742) + + W(5, 1053833339, 1000279686, -1120274227, -1113082203) + + W(6, -1117458583, 1042669208, 1057710126, -1104919217) + + W(7, 1041220979, -1111650191, -1123105101, 1027773818) + + W(8, 1032098567, -1107525999, 1022009255, 1035574395) + + W(9, -1117032217, -1115355410, -1100115369, 1032507221) + + W(10, 1021108475, -1112638630, 1004815486, -1119603373) + + W(11, -1110288078, -1103622420, 1039592007, -1117835672); + WS(-1089340204, 1064822548); + sum1 = + W(0, 1024560260, 1040632746, 1042654740, -1106019185) + W(1, -1121721479, 1037194524, 1017532199, -1123651609) + + W(2, 1053882699, -1094337163, 1033472482, 1028050126) + W(3, 1036465700, 998268921, 1058440180, -1083627654) + + W(4, -1112650528, 993325743, 1032538389, -1115892569) + W(5, 1062655475, -1081203240, 1042941034, 1013010462) + + W(6, 1031720480, -1109887627, 1057084090, -1087921069) + W(7, 1046201917, 1035154240, 1035008482, 1033415588) + + W(8, 1054084900, -1086686700, 1038013786, 1021897635) + W(9, 1020865894, -1112010572, 1046711885, -1098821294) + + W(10, 1039144481, 1027972046, 1041385023, 1043778521) + + W(11, 1050203279, -1083224116, 1043447032, -1131974615); + sum2 = W(0, -1108565409, 1034353453, -1088688588, 1053209723) + + W(1, 1049996954, -1107721619, 1041490776, 1018486577) + + W(2, -1105841420, -1092734414, 1039814215, -1122233136) + + W(3, -1103680498, -1113519263, 1037914109, -1094792328) + + W(4, 1034343810, -1116717915, -1113858207, 1052082200) + W(5, 1062919581, 1049986423, 1012724150, 1040029087) + + W(6, 1018958125, -1097140178, -1095558118, -1107726366) + + W(7, -1098318745, 1007719490, -1139146344, 1046768714) + + W(8, 1049328132, 1044527939, 1024888668, -1100531711) + W(9, 1024460115, -1098207895, 1041960027, 1046336394) + + W(10, -1106186917, 1037888927, -1111959213, -1128703602) + + W(11, 1035231667, -1110040773, 1036710347, -1102670680); + WS(-1083458668, -1076208878); + sum1 = W(0, 1028803476, 1040683401, 1046406904, -1098733730) + + W(1, 1004468631, 1030855367, -1119221604, -1097616301) + + W(2, 1051879501, -1093169213, -1110693690, -1111140815) + + W(3, -1136427363, 1042493937, 1058517387, -1088547874) + + W(4, 1024040880, -1127640694, 1033962333, -1106128994) + + W(5, 1062475632, -1086787145, 1045297574, -1108587948) + + W(6, -1108948664, -1096558041, 1061490456, -1088927588) + + W(7, 1028806548, -1104411844, 1041264181, 1044433886) + W(8, 1053313566, 1035939910, 1038834422, 1040762412) + + W(9, -1108358441, -1097860853, 1049919352, -1096390160) + + W(10, -1095128350, -1118015030, 1032628870, -1123751924) + + W(11, 1054299289, -1130402734, -1106314264, -1165494119); + sum2 = W(0, 1016611708, 1016478676, -1110195557, -1101004152) + + W(1, 1040169462, -1128480930, 1037888148, 1037533502) + W(2, 1036667983, 1029018929, 1051795874, -1116498505) + + W(3, -1105282980, 1012928145, -1126800264, -1092116144) + + W(4, 1041335879, -1105668811, 1016374797, 1042320298) + + W(5, -1123884642, 1048907311, 1052196876, -1110762465) + + W(6, -1146676672, -1119445205, -1097480948, 1063932318) + + W(7, -1105880602, -1096424000, -1118267731, -1133007186) + + W(8, -1111241984, 1045206632, -1088285853, 1016609657) + + W(9, -1130451858, -1123652878, 1039970164, 1051255124) + + W(10, -1095104183, 1029046774, 1032410610, -1114217777) + + W(11, 1039354964, 1032089604, -1090379026, 1046489649); + WS(-1104670894, -1131977046); + sum1 = + W(0, -1112648188, -1127207577, 1054983097, -1088875575) + W(1, 1031188251, -1103988635, -1122872327, 1044660591) + + W(2, 1050049705, -1112061830, 1037435556, 1027063042) + W(3, 1034658686, -1159198685, 1055452918, -1088327234) + + W(4, 1047857485, -1117747167, -1105196647, -1091967838) + + W(5, 1062208630, -1080890076, 1027642075, -1097581231) + W(6, 1040705957, 1050515731, 1055187309, -1103107959) + + W(7, 1054501223, 1026629396, -1105551222, -1105182655) + + W(8, 1051606290, -1088400827, -1109004816, -1115427963) + + W(9, -1121117111, -1127322710, 1047450666, -1103254713) + + W(10, 1042878098, -1119280070, 1017793890, 1049557794) + + W(11, 1052382814, -1097595959, 1041414585, -1121163375); + sum2 = + W(0, 1016354951, 1027513536, -1143898815, -1120711631) + W(1, -1121835937, 1011202413, -1117974191, 1035918257) + + W(2, 1029824032, 1038928177, -1110582057, 1027020738) + W(3, 1039379806, 1037237024, -1103985849, -1101088822) + + W(4, 1009730353, -1113735870, 1055799129, -1144611727) + + W(5, -1097216592, -1097673825, 1040607236, 1044957698) + + W(6, 1043516685, 1028380863, -1106760625, -1124050651) + + W(7, -1115312251, -1114960631, 1037116388, 1042440009) + + W(8, -1103814691, -1105579212, 1038947942, 1027787831) + + W(9, 1033575170, -1106882882, -1123395355, 1026359109) + + W(10, -1135830635, -1133116095, -1131729016, 1025801393) + + W(11, -1136138683, 1011024469, -1112603972, 1008198659); + WS(-1096559831, 1037484900); + sum1 = + W(0, 1028249855, 1038422322, 1057397273, -1091437192) + W(1, -1101563608, 1033785689, -1134487991, 1027879764) + + W(2, 1048869250, -1098773026, 1029769503, 1031362249) + W(3, 1034313250, 1029515489, 1056640275, -1086850776) + + W(4, -1127965876, -1173649736, 1016173128, -1112460521) + + W(5, 1065757625, -1083502823, -1131269971, -1128247556) + + W(6, 1027417370, -1107825326, 1058322735, -1083394976) + W(7, 1044386388, 1035484541, 1028347039, -1123304579) + + W(8, 1054334819, -1089694535, -1107441417, -1132373103) + + W(9, 1000575210, 1030471249, 1052511918, -1098313541) + W(10, 1031752252, 1034873120, 1035635068, -1120703806) + + W(11, 1052376319, -1102551488, -1098473097, -1142130892); + sum2 = W(0, -1112511339, -1073555081, 1076402541, -1104998932) + + W(1, -1101584674, 1037626737, 1040888051, -1070793862) + + W(2, 1075658117, 1054215981, -1115233903, 1015165170) + W(3, 1033770332, -1069228230, 1075655149, 1042820552) + + W(4, 1010151672, 1023929473, 1027239578, -1071158503) + W(5, 1077820889, 1046227202, 1035248614, 1033175695) + + W(6, -1109060021, -1080567434, 1045918702, -1095422364) + + W(7, 1038949494, 1025525751, -1135961020, 1047598893) + + W(8, -1118850699, -1101978428, 1049027220, 1032251645) + W(9, -1113507810, 948656059, 1035044244, 1045389579) + + W(10, 1028467783, -1117328038, -1110941727, -1129804625) + + W(11, 1026016583, -1103164541, -1118124613, 1042587545); + WS(-1081931126, 1073966570); + sum1 = + W(0, -1121849711, 1035175459, -1121951547, 1027761070) + W(1, 1025905706, -1114686833, -1146361331, -1097410109) + + W(2, 1026127169, 1045225025, 1037511592, -1113648733) + W(3, 1017322599, 1043585907, -1144746721, -1106255910) + + W(4, 1043091875, 1017686828, -1106692309, -1120101763) + + W(5, -1091000962, 1065386286, -1111228857, -1108319001) + + W(6, 1025148299, 1050307440, -1079735571, 1061827739) + W(7, -1120837551, 1018597782, -1106210884, 1038219466) + + W(8, -1091953433, 1056380469, -1102991437, -1147707682) + + W(9, 1006422511, 1023773090, -1096168868, 1049682211) + + W(10, 1003336935, -1110127893, -1115138804, -1132131774) + + W(11, -1102445962, 1046599772, 1040799505, 1028136822); + sum2 = + W(0, -1106398945, 1035173169, -1101335301, 1053305068) + W(1, -1121291886, -1109509581, 1034732755, -1090565718) + + W(2, 1056357842, 1050400788, -1115544374, -1107192051) + + W(3, -1136096426, 1037348813, -1122254044, 1036743473) + + W(4, -1105444760, 1016457143, -1116038033, -1089313148) + + W(5, 1066071262, 1057700465, -1086616818, 1022772267) + W(6, 1044672515, 1037418911, -1095175639, -1084949846) + + W(7, 1050477957, 1033704361, -1100200943, 1045738761) + W(8, -1132458755, 1003355997, -1102270714, 1035291569) + + W(9, 1037208365, -1130864309, 1007521414, 1030076164) + + W(10, 1045722667, -1111299866, 1025870712, -1117649125) + + W(11, 1025322164, -1106413087, 999303933, 1024551876); + WS(1052508503, 1065718149); + sum1 = W(0, 1042149474, 962035242, 1048663227, -1097510801) + W(1, 1028239019, 1038442493, -1109127212, -1098223900) + + W(2, 1043423478, -1096660204, -1104342914, -1109357577) + + W(3, 1041796883, 1027445007, 1055339346, -1087758861) + W(4, 1027971236, 1040109559, 1033122295, -1108112926) + + W(5, 1061167739, -1089406218, 1037128774, 1025450507) + + W(6, -1120120612, -1098175173, 1054196775, -1094841886) + + W(7, -1105773058, -1123303012, 1045736850, 1043181559) + + W(8, 1055761732, -1105769888, 1042761157, 1044237597) + + W(9, -1110374755, -1100319159, 1041284046, -1103555357) + + W(10, -1101757237, -1111907879, 1038133568, -1102543586) + + W(11, 1051299336, -1120191499, -1105847257, 1039590240); + sum2 = + W(0, -1109097964, 1037136687, 1031673749, -1125393555) + W(1, 1019467600, 1025995330, 1021868522, -1116667451) + + W(2, -1094712046, 1041352693, -1104433838, 1008084051) + W(3, 1007318978, -1107845433, 1038331125, 1034962829) + + W(4, -1122570447, 1039892459, 1032613655, -1109068920) + + W(5, 1040720319, -1112580519, -1121851072, 1025598855) + + W(6, 1002517286, 1016069779, -1111158812, -1106409067) + + W(7, -1113430896, 1045465420, -1126879582, -1103760436) + + W(8, 1056111085, -1106729155, 1049773824, -1110468674) + + W(9, 1031113174, 1030143702, -1106358629, -1106975050) + + W(10, 1036295980, 1020538422, -1114937810, -1118059752) + + W(11, -1121843086, 1047380650, -1122235886, -1113447212); + WS(1056997868, 1008833773); + sum1 = + W(0, -1118496039, 1006806901, 1039826714, -1123143270) + W(1, 1006039247, 1017005492, 1036420187, -1130107576) + + W(2, -1123687353, -1104570591, 1032886196, -1125702370) + + W(3, -1113594582, -1115019369, 1053157409, -1093231896) + + W(4, -1105180689, 1028719950, 1034344230, 1045363911) + W(5, 1059756929, -1095316624, -1102708199, 1009228202) + + W(6, 1038393121, -1090717022, 1058230383, -1095564524) + + W(7, 1035814292, -1119964195, -1109888100, 1037930126) + + W(8, 1045739824, -1098051412, -1129186168, 1033820442) + + W(9, 1032434307, -1110427933, 1042446790, -1101398261) + + W(10, 1025625861, 1028568173, -1131937728, -1112104883) + + W(11, 1052782212, -1104229594, -1112516090, -1136905401); + sum2 = + W(0, 1034320453, -1118604595, 1025235375, 1028595208) + W(1, 1002638229, -1116609216, -1112051735, -1109468006) + + W(2, -1107232926, 1046387359, -1105038970, 1005965131) + W(3, 1043966073, -1106879339, 1049289065, 1044354198) + + W(4, 1045499601, -1111658272, 1033608293, -1088213587) + + W(5, 1067079268, -1087106166, 1035867996, -1132447732) + + W(6, -1092579307, 1064370547, -1088486363, -1108961766) + + W(7, -1096457250, 1042442572, 1051236380, -1095838484) + + W(8, 1044420987, -1104528882, 1028839698, -1134350406) + + W(9, -1102939053, 1043763107, -1107783352, 1035658672) + + W(10, -1122532695, -1131375963, 1027336318, 1016664388) + + W(11, -1116658227, 1023955051, -1126291119, -1135660575); + WS(1064849644, -1092967401); + sum1 = + W(0, 1041078624, 1033930742, 1053270962, -1091277968) + W(1, -1115974645, -1124489961, -1103081652, 1034184171) + + W(2, 1058076017, -1091900963, -1101902009, 1046377811) + + W(3, 1045204674, -1098756264, 1059044453, -1097334921) + + W(4, 1038364767, -1096742869, -1126422222, 1038407355) + W(5, 1061713418, -1078564449, 1031099397, 1034335299) + + W(6, -1107755791, -1103118957, 1064682577, -1099822850) + + W(7, 1025967234, 1015202107, 1049230600, -1103625882) + W(8, 1047988615, -1091654943, 1010917525, -1098744549) + + W(9, -1101861336, 1035198826, 1055582710, -1096942230) + + W(10, 1021900159, 1047801952, 1041473799, -1102710964) + + W(11, 1058355518, -1098047297, -1106099948, -1101582418); + sum2 = + W(0, 1034970587, 1039267337, -1109640195, -1085205368) + W(1, 1065312771, -1111782462, -1105865147, 1026053125) + + W(2, 1027743203, -1076908464, 1068235631, 1029167111) + W(3, 1024111791, 1040193826, 1042644379, -1072741915) + + W(4, 1074530244, 1035172075, 1018431373, 1037956157) + W(5, -1088412806, -1079896887, 1069229068, 1048206286) + + W(6, -1107243650, -1106797747, -1104275404, 1057561219) + + W(7, -1110308581, -1092973955, 1038385161, 1031902437) + W(8, 1031274183, 1052902509, 1045193510, -1105822229) + + W(9, -1114574492, -1114137980, -1115379021, -1103620900) + + W(10, -1167188013, -1102796809, -1129893537, -1128932411) + + W(11, 1040558376, 1054347378, -1099424233, -1106619819); + WS(-1085552428, 1044647857); + sum1 = + W(0, -1130568573, -1120131932, -1097293585, 1052681344) + W(1, -1115182247, 1016796643, -1111247047, 1046596325) + + W(2, -1095715202, 1050957098, -1125685565, -1123522377) + + W(3, 1001536536, 1026932885, -1090361246, 1059711152) + W(4, -1097304503, 1028362085, -1104704953, 1049575094) + + W(5, -1085535724, 1060788917, -1122898434, -1112833505) + + W(6, 1029690778, 1042872064, -1105723034, 1048249845) + + W(7, -1115360055, 1008149481, -1104108900, -1127841478) + + W(8, -1113844876, -1106926654, 1050188162, -1111804152) + + W(9, 1012447989, -1114289465, -1127895515, 1034645781) + + W(10, -1110595670, 1032897312, -1107166286, -1110288351) + + W(11, 1028149942, 1043016176, 1041406167, -1119471349); + sum2 = + W(0, 1049638564, -1122573304, -1097365817, -1120650912) + W(1, 1039129637, -1114566411, 1012096208, -1169058693) + + W(2, -1118822370, 1032693677, 1036528332, -1119534724) + + W(3, 1055008508, -1092917400, -1124083512, -1127709292) + + W(4, -1113518885, 1015256750, 1058022553, -1080721407) + W(5, 1056959548, 1044260765, -1122124802, 1042163670) + + W(6, 1059601221, -1081684685, 1056508637, -1099806388) + + W(7, 1019567420, -1110975736, 1065544846, -1080284825) + W(8, 1051359763, 1042746095, -1101554026, 1032382474) + + W(9, 1035938200, -1096574070, 1044088441, 1033735876) + + W(10, 1041548497, -1110809702, 1043980555, -1098850345) + + W(11, 1031681402, -1121369890, -1108142320, 1022534793); + WS(1049904727, -1085461498); + sum1 = + W(0, -1114441151, 1047758995, -1092338425, 1054893264) + W(1, -1095327506, 1042581180, 1032673159, -1122472531) + + W(2, -1101190388, 1042608805, -1108884127, -1119554504) + + W(3, 1027012354, 1048177385, -1096531431, 1050188989) + W(4, -1104987150, 1041262473, 1041600521, -1116753522) + + W(5, 1059669870, -1088410395, -1123782065, -1120686401) + + W(6, 1035856141, -1105032264, 1063099682, -1084283112) + + W(7, 1042263123, -1117364890, 1033107055, -1109908945) + + W(8, 1058897901, -1088007491, 1042892731, -1107384925) + + W(9, 1031163069, -1104848436, 1049115478, -1096369309) + + W(10, 1029697804, -1138499405, -1139856090, -1111353615) + + W(11, 1055941567, -1096366496, 1047202227, -1100444021); + sum2 = + W(0, -1101934313, 1068410613, 1053392914, 1045964051) + W(1, -1109754454, -1118726053, -1127864237, 1066297935) + + W(2, 1047339448, -1107136628, 1023924243, 1029832629) + W(3, -1112463889, 1052441146, -1111508378, 1035674775) + + W(4, -1121555471, -1111696115, 1047304216, -1077079694) + + W(5, 1044634164, 1046050296, -1111827987, 1036477638) + + W(6, -1097499627, -1082290320, -1086326188, -1113442140) + + W(7, 1006763480, -1119582249, 1041678537, -1095668928) + W(8, 1053023843, -1135364198, 1034831467, 1024856185) + + W(9, -1128505773, -1097722710, 1050833435, 1028981469) + + W(10, -1128234727, -1112331027, 1039199998, -1096167330) + + W(11, -1112581958, 1028034745, 1032814306, 1017921306); + WS(-1087326956, 1033622098); + sum1 = W(0, -1113899675, 1045896801, 1041409216, -1108955706) + + W(1, -1104543128, 1041055226, 1035193378, -1161971013) + + W(2, -1108871427, 1048600721, -1114333163, -1106692192) + + W(3, 1030557818, 1045303135, -1104804773, -1094955846) + + W(4, 1045266364, 1039063182, -1119324954, -1095480777) + + W(5, 1041468886, 1051943793, -1096626659, -1112593372) + + W(6, 1042470612, -1110770003, -1098059200, 1025944442) + + W(7, 1048775867, -1107180444, -1117399605, -1109576477) + + W(8, 1052050234, -1097508910, 1043056710, 1041486173) + W(9, 1021883592, -1100233714, 1041862393, 1030612641) + + W(10, -1122051827, -1114362202, 1035419591, -1122013269) + + W(11, 1017834329, -1106071902, 1042839849, -1121041260); + sum2 = + W(0, 1008283263, -1111634453, -1112224655, -1121896666) + W(1, 1031996897, -1106176579, -1114415273, 1032259795) + + W(2, 1046234660, 1020399084, -1105304684, 1027107696) + + W(3, -1114655921, -1123951654, 1039099048, -1139717487) + + W(4, 1017260660, -1106922258, 1036167174, -1116061542) + W(5, 1049934438, 1050902690, -1102142181, 1022104088) + + W(6, -1111159985, 1039368345, 1003410015, 1039007446) + W(7, 1003551903, -1122048418, 1033204129, -1102899145) + + W(8, -1113540553, 1039510238, -1114854307, -1135188919) + + W(9, -1122340118, 1024476440, -1117681522, 1032062517) + + W(10, 992233789, -1128403972, -1127458940, -1118949310) + + W(11, -1122317014, 1033150391, -1113963477, -1125862176); + WS(1068173014, -1111006676); + sum1 = + W(0, 1031049568, -1103201566, 1048004603, -1100468360) + W(1, 1046039773, 1012485196, -1115395480, -1112513259) + + W(2, -1117860850, -1173290307, -1123264224, -1127850837) + + W(3, 1019703498, -1112438249, -1104427535, 1042677725) + W(4, 1030284012, 1029876039, -1113567107, 1042819653) + + W(5, -1083606526, 1064316383, -1122621123, 1036820754) + W(6, 1015808760, 1048780036, -1083053360, 1063571221) + + W(7, -1094902185, 1035184606, -1109811912, 1039150546) + + W(8, -1090564527, 1060600586, -1103353426, 1024997805) + W(9, 1027899359, 1034094633, -1092330682, 1050639762) + + W(10, -1106486660, -1149057999, -1103105894, 1040353932) + + W(11, -1095220995, 1054475004, 1034806311, -1123061719); + sum2 = + W(0, 1014853092, -1122580470, -1120994367, 1047459793) + W(1, 1064875701, -1132455031, -1120466254, -1114547761) + + W(2, 1038991680, 1047680543, 1054395623, 1011283964) + W(3, 1027909890, 1030745116, 1034511499, -1098401240) + + W(4, 1045153300, -1108441710, -1117512854, -1119656010) + + W(5, 1041066172, -1121088174, -1085223893, 1018552602) + W(6, 1026011110, 1035574738, -1109149586, 1045982327) + + W(7, -1084582209, -1106692167, -1110873488, -1120221385) + + W(8, 1024235728, 1024310650, -1099510820, 1026658994) + W(9, 1036041188, 1020780404, -1112980367, -1122000913) + + W(10, 1029465320, 1023023932, -1115497806, -1122615179) + + W(11, 1020521688, 1042402937, -1105747852, 1004613671); + WS(-1095915991, 979918868); + sum1 = + W(0, -1115463727, 1032823819, 1026707497, -1119898332) + W(1, 1026568544, -1121143952, -1137886897, 1037523161) + + W(2, -1131549790, 1035412665, -1108324895, -1129452238) + + W(3, 1011021190, 1029800132, -1108429845, -1136100063) + + W(4, -1138504034, -1120493188, 1011860489, 1043477300) + + W(5, -1100874368, -1112838682, 1047390560, -1147670274) + + W(6, -1129491953, -1105888052, 1047336484, -1098267600) + + W(7, 1036689246, 1028096953, 1007409140, -1114264129) + W(8, 1049886943, -1097768883, 1037432366, -1134502280) + + W(9, -1124741815, 1021218335, 1042964547, -1106237874) + + W(10, 996441389, -1157333673, -1122228982, 1030459197) + + W(11, 1038061098, -1108915952, -1121991146, -1177453050); + sum2 = W(0, -1121902268, 1020062213, 1034601005, -1096503308) + + W(1, 1050858947, -1108630019, -1128394666, -1143339877) + + W(2, -1111450467, 1052764693, -1099720262, -1130142915) + + W(3, 1039974898, -1102502778, 1034366199, -1095299550) + + W(4, 1055940597, -1105816149, -1114856664, 1034423857) + + W(5, -1093114037, 1060522961, -1087523263, 1037139152) + W(6, 1032116923, 1030950002, 1027196884, 1057088106) + + W(7, -1085850393, 1054601799, -1115163450, 1038088024) + + W(8, 1036157347, -1104371255, -1107617878, 1043807995) + + W(9, -1112859101, 1036537682, -1130356560, 1031719642) + + W(10, -1119144319, -1122652165, -1128925353, 1019282123) + + W(11, 1032717961, -1110891365, 1017512699, 1025497552); + WS(1066530838, 1025703389); + sum1 = + W(0, -1120765920, -1132051981, -1129191897, 1042371592) + W(1, 1007708012, -1116932051, 1009297086, -1139418709) + + W(2, 1032587897, -1118415861, -1122811552, -1134432681) + + W(3, -1122351141, -1109474502, 1057153612, -1120712699) + + W(4, -1105657359, -1127344014, 1015487755, -1098776251) + + W(5, 1049522345, -1099055070, -1099127683, 1026629028) + W(6, 1015844344, -1109199593, 1041525985, 1049700744) + + W(7, -1111888320, -1119906716, -1127613121, -1123764613) + + W(8, -1109817213, 1050593755, -1113004743, -1136900213) + + W(9, -1133586812, -1121408403, 1010121533, 1036084166) + + W(10, 984437698, -1118848634, -1124468594, -1145136640) + + W(11, -1107128582, 1038803505, 1036904923, -1123829719); + sum2 = W(0, -1117430114, 1041261247, 1033806419, -1126022952) + + W(1, -1155381873, -1125967712, 1039120940, -1107749198) + + W(2, -1097831330, 1041137317, -1127685702, -1116954634) + + W(3, -1106133189, -1099018179, 1064523288, 1057416214) + + W(4, -1099691831, 1032736142, 1026507473, -1131506304) + + W(5, 1045711847, -1092069746, 1026250214, -1120045450) + + W(6, 1031550625, -1123617030, -1088977338, 1059767697) + + W(7, -1098651966, 1021746164, -1142215401, -1123190888) + + W(8, 1052831473, -1088761837, -1118397760, 1028302350) + + W(9, 1026312489, -1112954810, -1133526188, 1033531722) + + W(10, -1130823120, 990513889, -1139250704, -1137414048) + + W(11, -1122137188, -1110686692, 1029280576, -1115066264); + WS(1066680246, 1040921440); + sum1 = W(0, -1119730500, -1110280861, -1092083138, 1053565584) + + W(1, -1110918026, 1029997623, 1034101258, 1011417444) + + W(2, 1031601302, 1054599907, -1143895330, -1113777127) + + W(3, -1132236433, 1027753539, -1090607216, 1058261942) + + W(4, -1111808624, 1039976245, -1104735450, 1038200908) + + W(5, -1078665075, 1061430978, -1099071584, -1112447940) + + W(6, 1035235184, 1035268043, -1096046953, 1061610294) + + W(7, -1106320677, 1023744576, -1111591250, -1121734057) + + W(8, -1093429316, 1056142824, -1105323662, -1145165385) + + W(9, 1024518355, 1032771355, -1094352558, 1053165350) + + W(10, -1138833863, -1113453535, -1121802685, -1126371080) + + W(11, -1102572591, 1055282545, 1035738553, 1031263347); + sum2 = W(0, 1033717276, 1028210443, 1046091050, -1119519632) + + W(1, 1050909876, -1117678961, -1129082210, -1130739278) + + W(2, -1085374293, 1026401017, -1110182528, 1042909501) + + W(3, -1111396517, -1117565460, 1033058760, -1106338078) + + W(4, -1149282827, -1099518378, 1053521042, -1113906791) + + W(5, 1062822204, 1066908993, -1081393742, 1044082334) + + W(6, -1096499765, -1106119849, -1089123399, 1034907371) + + W(7, -1094008056, -1097984366, 1041638909, 1044690885) + W(8, 1003636411, 1054286387, 1035142168, 1040282994) + + W(9, -1115028859, 1000486481, 1048601259, -1096894542) + + W(10, 1020535023, -1109925208, -1143837439, 1015998178) + + W(11, -1103883056, 1041460877, 1028271260, 1021313035); + WS(-1111691100, -1070453585); + sum1 = + W(0, 1040350706, 1032181048, 1054597571, -1090063653) + W(1, -1105977411, -1114266718, -1107702492, 1006352113) + + W(2, 1056547603, -1111618639, 1011306277, 1034245578) + W(3, 1045915011, -1101176752, 1059824936, -1087007388) + + W(4, 1037450066, -1130610528, -1103582444, -1098104500) + + W(5, 1062411659, -1079908657, -1113612402, -1111998342) + + W(6, 1036820082, -1111995209, 1062112057, -1098160558) + W(7, 1043358554, 1021846218, 1030081641, -1105752467) + + W(8, 1042786985, -1094958736, -1108376090, 1026051990) + + W(9, -1112926972, -1111976126, 1050598527, -1104521261) + + W(10, 1024420791, 1032139296, 1034445457, 1025879721) + + W(11, 1058122296, -1107753094, -1098378691, 1018599200); + sum2 = W(0, -1102183736, 1044690091, 1025447267, -1103679886) + + W(1, 1034791609, -1120655593, 1045283790, -1117083441) + + W(2, 1036724432, -1096666126, 1043810354, -1109094473) + + W(3, -1099060082, -1109435037, -1100626978, 935783211) + + W(4, -1097803022, 1029730663, 1029589699, 1005932683) + W(5, 1066859805, 1061824774, 1034749891, 1023292171) + + W(6, -1103326288, -1109954065, -1114206859, -1098480165) + + W(7, -1094988176, -1109570093, -1146696619, -1130369043) + + W(8, 1024539831, -1113161303, 1050252440, 1012313206) + + W(9, -1123727405, -1115538567, -1123732285, -1109149493) + + W(10, 1029732207, -1106431920, -1106785078, 1039027144) + + W(11, 1040901138, -1129688427, -1105144948, 1015686163); + WS(-1105638574, -1077878805); + sum1 = W(0, -1112101313, 1043313362, -1104398291, 1034529536) + + W(1, -1120033234, 1017824488, 1025565072, 1041884710) + + W(2, -1093904634, 1043314021, -1106696920, 1028280843) + + W(3, -1118212870, 1045058176, -1086702118, 1058479092) + + W(4, -1128822905, 1038132788, 1034991091, -1099609869) + + W(5, 1055637093, 1049084915, -1126325576, -1136921361) + + W(6, 1037618766, -1100255017, 1061981800, -1082434966) + + W(7, 1050170340, -1125947450, 1033034081, -1097107341) + + W(8, 1053455331, -1087005060, 1046293466, -1124008918) + + W(9, 1023523536, -1104696333, 1048950646, -1098585534) + + W(10, 1042248226, -1126565485, -1143864013, -1128917761) + + W(11, 1037339676, -1105402705, 1032623999, -1114937252); + sum2 = + W(0, 1040832216, -1125419559, -1166596642, -1076839498) + W(1, -1085872442, 1038631745, 1042032808, -1103788280) + + W(2, 1045241846, -1091833274, -1105795498, 1037000995) + W(3, 1039550307, 1043848052, 1051795538, 1035730071) + + W(4, -1094587067, -1115278352, 1029252447, -1099123277) + + W(5, 1068949095, 1070654393, 1007431650, -1103746979) + W(6, 1040592387, 1047689572, -1094163017, -1096947569) + + W(7, -1089767553, 1041143367, -1111709033, -1102650535) + + W(8, -1111700665, 1050259859, 1041510738, 1025070825) + W(9, 1050208698, -1105352144, -1117027793, 1051072204) + + W(10, -1100476212, -1116523862, -1091595987, 1033340873) + + W(11, 1027304955, 1048679723, 1057584085, -1093749689); + WS(-1095944791, 1081861902); + sum1 = + W(0, -1129669743, 1034635115, 1057433596, -1090131839) + W(1, -1120322428, 1008560041, -1116664839, -1122706061) + + W(2, 1048908041, -1093164666, 1030509816, 1023557506) + W(3, -1148272609, 1033259121, 1058166921, -1087001587) + + W(4, 1035303897, 1013701241, -1121494877, -1124251544) + + W(5, 1058746094, -1083481847, 1044900399, -1117995899) + + W(6, -1115602986, -1126517523, 1055593874, -1085306808) + + W(7, 1041073282, -1116643091, 1028329496, -1128061368) + W(8, 1057488289, -1091485686, 1023593721, 1023656437) + + W(9, -1123378150, -1130313237, 1049860117, -1102755929) + + W(10, 1034451003, -1164007844, 1027525168, -1119991479) + + W(11, 1061071735, -1105495231, -1102595129, 1024551167); + sum2 = W(0, 1029670841, 999172620, 1042251423, -1105031588) + W(1, 1027957701, 1026093121, -1115575058, -1099435099) + + W(2, 1041110640, -1120449287, 1035596553, -1156632055) + + W(3, 1042858197, -1139359478, 1058527193, 1010020318) + + W(4, 1019832195, -1126960339, -1101600217, 1027943101) + + W(5, 1075961547, -1109667225, 1011086126, 1010028142) + W(6, -1117748556, 1048715384, 1073424302, 1057314889) + + W(7, 1033526397, 1037810339, 1035438169, -1098854617) + W(8, -1086643829, 1037113027, 975610078, -1115077778) + + W(9, -1114535210, 1036336651, -1080060710, -1123725073) + + W(10, 1012557694, -1133987070, 1032334939, 1041563473) + + W(11, -1067239867, -1100548924, -1095465488, 1036754195); + WS(-1085172076, 1069147958); + sum1 = W(0, 1025703205, 1027233863, 1026640114, 1029190628) + + W(1, -1111659152, -1139375968, -1141293989, -1106615031) + + W(2, 1042354526, -1106775167, -1115892869, 1028377583) + + W(3, 1041286826, -1115436126, 1053740861, -1106293072) + + W(4, 1035182992, -1156734143, -1119005195, -1112858253) + + W(5, 1054852793, -1089581852, 1027435128, -1121669673) + + W(6, 1026450561, 1042609938, -1119314307, -1098775605) + + W(7, -1137028117, 1034668065, -1117134469, -1122683754) + + W(8, 1026745790, -1108063055, 1038436612, -1119291218) + + W(9, -1120895076, 1044686038, -1108709290, 1015550627) + + W(10, -1112739478, 1027259179, 1025414366, -1117169125) + + W(11, 1023400633, -1125318352, 1031194923, -1118201212); + sum2 = W(0, -1154464437, 1027039233, 1008089899, -1117609897) + + W(1, -1118717800, 1027401421, 1004660066, -1115032564) + + W(2, 1041471507, 1033488023, 1033628240, -1112728150) + W(3, 1011666487, -1147080182, 1053281755, 1082321679) + + W(4, 1046901100, 1012824907, 1016373458, 975139636) + W(5, -1081313755, -1065846603, 1050032460, -1108305112) + + W(6, -1117096132, 1025013868, -1118862913, -1122974098) + + W(7, -1106934499, 1038621352, 1027534293, -1117310194) + + W(8, 1040077608, -1130639872, -1137731251, -1137500513) + + W(9, -1118720211, 1025607183, -1134922624, -1143672974) + + W(10, -1177023016, -1129758225, 1024315262, -1145025250) + + W(11, 993302909, -1114202318, 1017914834, 1025570630); + WS(1065820150, -1112682631); + sum1 = + W(0, -1105640672, -1140735040, -1096706537, 1051064512) + + W(1, -1114855500, -1128129890, -1136938293, 1045425461) + + W(2, -1095619178, 1046810501, 1041816072, -1108472292) + W(3, 1007936778, 1012508339, -1101065539, 1057299292) + + W(4, 1015987827, 1036938130, -1099447769, 1052020966) + W(5, -1083835034, 1054321083, 1049485320, -1101761488) + + W(6, 1033964109, -1110876672, -1127256032, 1044289505) + + W(7, -1106506396, 1035708141, -1110772895, 1038536521) + + W(8, -1101414038, 1042038046, 1031650401, -1113134674) + + W(9, -1107676126, 1034428376, -1102412811, 1050440565) + W(10, -1098866309, 1031811610, 948858222, 1041035251) + + W(11, -1104437005, -1126355329, 1044647659, -1119496853); + sum2 = + W(0, -1116689599, -1104060794, 1023887631, 1047625619) + W(1, -1104647113, 1032108768, 1033662400, 1047714485) + + W(2, -1101000300, -1113896185, 1049921725, -1114038586) + + W(3, -1110264521, -1106889746, -1123902349, 1058674488) + + W(4, -1100964722, -1134500667, -1113832562, 1055059659) + + W(5, 1047334183, -1105663288, 1060005487, -1105023935) + + W(6, 1034493072, -1089308922, 1060541265, -1079751447) + W(7, -1088726381, 1046968990, 1024644211, 1027816870) + + W(8, -1145174230, 1040502911, 1026206299, -1116742649) + + W(9, -1105470304, 1032487381, -1099777158, 1059286709) + + W(10, -1093081927, 1042150309, 1030330543, 1043118546) + + W(11, -1100795602, -1110882655, 1033716355, -1127164330); + WS(1051219671, 1032040132); + sum1 = + W(0, 1024246061, -1110293770, -1098745559, 1035978230) + W(1, 1050231066, -1111943280, 1029213629, -1111062337) + + W(2, -1104763504, 1041701281, -1106571859, 1016965359) + + W(3, -1142580623, 1026027124, -1097349705, 1051781481) + W(4, 1040668770, 1026054164, 1007533386, 1035026513) + + W(5, -1082429923, 1065410260, -1111350032, 1035026168) + + W(6, -1132388626, 1036422600, -1083869189, 1060856625) + W(7, -1113287631, 987392292, 1016678619, 1011246152) + + W(8, -1095610025, 1057796630, -1122887388, 1019565189) + W(9, 998523489, -1173422083, -1095350964, 1045145830) + + W(10, -1109374678, -1110518465, 1023830470, -1130424090) + + W(11, -1094623957, 1055180598, 1007169387, 1026555204); + sum2 = + W(0, -1123481859, -1131096266, -1107023625, 1040776673) + W(1, -1073406322, 1074128739, 1024186334, -1121050215) + + W(2, 1040345453, -1129271163, -1080765061, 1066657253) + + W(3, -1181265672, 1023491721, -1110082893, 1044851152) + + W(4, -1077100552, 1068015119, -1136581772, -1115413373) + + W(5, -1116173932, -1097567007, -1085034176, 1066670217) + W(6, 1007273042, 1036272276, 1041634800, 1051516690) + + W(7, -1104398720, -1111857710, -1130526339, -1110187157) + + W(8, 1028205855, -1106625929, 1019889879, 1026394385) + W(9, -1134191606, -1123342647, 1036476425, 1035231370) + + W(10, -1115096299, 990445793, 1035801320, -1125507188) + + W(11, -1124495703, 1007786534, -1105128420, 1030299973); + WS(-1124324720, 1038677119); + sum1 = W(0, 1008341069, 1038389179, 1056361124, -1081451931) + W(1, 1047683325, -1130646284, 1031967089, 993181316) + + W(2, 1050863173, -1096246661, 1035916906, -1134539381) + + W(3, 1023486232, -1145165264, 1054230472, -1086637900) + W(4, 1027831167, 986748732, 1037528348, 991007864) + + W(5, 1063082151, -1088130503, 1026128198, 1003368116) + + W(6, -1122921519, 1024190949, 1050043692, -1092787999) + + W(7, 1020947750, -1115252008, 1029849459, 1044031254) + W(8, 1049660054, -1099337955, 1025351359, 1036720064) + + W(9, -1114006089, -1123515526, 1043779649, -1095996120) + + W(10, 1037985981, -1116396881, 1035528454, 1052524910) + + W(11, -1097977265, -1102904005, -1114005272, 1029521402); + sum2 = W(0, 1042203848, -1089098687, 1035967917, 1068788369) + + W(1, -1095505730, 1025788011, -1133163156, -1098025067) + + W(2, 1052777785, -1096461215, -1097973178, -1111191248) + + W(3, -1108707706, 1036383110, 1043356562, -1090569807) + + W(4, -1127034898, 1023876171, 1027923803, 1058285406) + W(5, 1046924897, -1088764217, 1056967609, 1046203397) + + W(6, -1098359820, 1062333205, -1080913711, -1095261121) + + W(7, 1040836988, -1107189985, 1043843260, 1048839159) + + W(8, -1088408400, -1098396864, 1046078649, -1113219498) + + W(9, 1021888231, 1058743586, -1097507024, -1093746709) + + W(10, -1111389506, -1110869404, 1023965418, -1078465930) + + W(11, 1067915456, 1064748817, -1099047850, 1040158004); + WS(-1080347734, -1094728165); + sum1 = + W(0, -1115633753, 1036436624, -1113632799, 1018734050) + W(1, -1104273977, 1022550473, -1128052610, 1031912915) + + W(2, -1104119121, -1104173746, -1115038313, -1128796792) + + W(3, 996364134, 1038598142, -1095896866, 1042956529) + W(4, -1098511458, 1027191321, 1027254679, -1114408211) + + W(5, 1064358521, 1051156401, 1006576423, -1123707765) + W(6, 1027401421, -1097652239, 1061684826, -1087880029) + + W(7, 1037804713, -1125317723, -1125749028, -1109729611) + + W(8, 1051089073, -1093838037, 1039011098, -1116369959) + + W(9, -1143663749, -1111208674, 1044518984, -1100689848) + + W(10, -1157246715, -1130384675, 1017291157, -1118442418) + + W(11, 1048577269, -1104163629, -1145301883, -1113863292); + sum2 = W(0, -1137561210, 1000810292, -1109671087, -1098257975) + + W(1, -1113334223, 1010643898, 1008161562, 1017087401) + + W(2, -1143663956, -1088410023, 1033424863, -1122425914) + + W(3, -1138249722, -1104015266, -1100429296, -1110483119) + + W(4, -1113376685, -1120544050, 1032804591, 1045940061) + W(5, 1064636422, 1065774501, 1041401738, 1015219657) + + W(6, -1118405314, -1112933693, 1041071232, -1111449957) + + W(7, -1107119710, 1028103016, -1149548391, 1040845572) + + W(8, -1095622064, -1114533177, 1041680128, -1125778629) + + W(9, -1140666666, -1131915309, -1113635957, -1105461804) + + W(10, -1114424843, -1127495397, -1121723310, -1125770861) + + W(11, -1156294183, -1154727079, -1143304660, -1128411685); + WS(1062796012, -1081433938); + sum1 = + W(0, -1140258862, 1047697940, 1041493798, -1090901033) + W(1, 1032453887, 1008978681, 1019305782, -1137205890) + + W(2, 1051824452, -1095124244, 1034552166, 1031420374) + W(3, 1017521696, 1040574503, 1048941321, -1090555023) + + W(4, 1032035723, -1124609380, -1128637410, -1131514496) + + W(5, 1061551411, -1084025976, 1036871279, 1025475023) + W(6, 1030042599, -1115750349, 1058760695, -1089279069) + + W(7, 1041251643, 1016399695, -1140240046, -1114177400) + W(8, 1056942277, -1089170928, 1032547975, 1024887097) + + W(9, 1023786378, -1119424318, 1045023263, -1099538126) + + W(10, -1117686145, 1002611913, 1027083972, 1025144619) + + W(11, 1056967544, -1087239225, 1027338481, 1012109898); + sum2 = W(0, 1004838046, 1036867068, 1023348885, -1120560082) + W(1, 1032448279, 1025411331, 1009005547, -1112484311) + + W(2, -1113333873, 1019969949, -1115333043, -1123665230) + + W(3, 1023830295, 1034701810, -1115269491, -1089366478) + + W(4, 1028612787, 1024216939, -1121204348, -1131856601) + + W(5, -1084820204, -1067115412, -1132671203, 1034346460) + + W(6, 1026709605, 1008859907, -1095888786, -1071017431) + + W(7, -1112864526, -1116027280, -1145957446, -1129570235) + + W(8, 1052224270, 1066362408, 1045423025, -1133553563) + W(9, 1024434367, -1120209470, 1043852487, 1084005284) + + W(10, 1025066805, 1032270816, -1122812157, 1023686531) + + W(11, 1047863595, 1063525936, 1043035962, -1105823812); + WS(-1103681710, -1114530079); + sum1 = + W(0, 1025861737, -1130912909, -1110124091, 1040844938) + W(1, -1105267215, 1021540535, 1029506744, -1104283663) + + W(2, -1117715067, 1046218351, -1121870249, 1032871129) + + W(3, 1032236919, -1132593150, 1039686571, -1098764800) + + W(4, 1038793978, -1120294159, 1035998951, -1102933559) + + W(5, -1097542514, 1059317136, -1096018272, 1036773558) + + W(6, -1111043394, 1040041573, -1088677703, 1057765873) + W(7, -1105386706, -1111111618, 1007410083, 992747222) + + W(8, -1112367617, 1054923388, -1101946581, 1031187710) + + W(9, -1126534927, 1034020670, -1105036246, 1029185429) + + W(10, -1122605111, -1138057273, -1123346113, -1119406504) + + W(11, 1035634224, 1040434219, -1143951794, 1023823648); + sum2 = + W(0, -1133865733, 1041378526, -1102114760, 1040042063) + W(1, 1036263014, -1111718847, -1114357788, 1025611699) + + W(2, 1041852494, -1102827642, 1023561916, -1109687464) + + W(3, -1113774565, 1057780422, -1090351620, 1041105879) + + W(4, -1107817782, 1041802453, -1094909862, -1134317911) + + W(5, 1058263821, -1094128428, 1049906607, -1106696300) + + W(6, 1041934157, -1084534604, 1059786982, -1121888905) + + W(7, -1106476521, 1023851848, 1048238594, -1105040821) + W(8, -1114163954, 1038597269, 1034361268, 1032032810) + + W(9, 1041091101, -1096429323, 1034035361, -1139774900) + + W(10, 1016844568, -1111010993, 1042608690, -1128928913) + + W(11, -1102786592, 1035391793, 1014428216, 1031652841); + WS(1059372396, -1131086843); + sum1 = W(0, -1116770958, 1038224730, -1145642197, 1033085351) + + W(1, -1114157744, -1129272066, -1133338231, -1110641250) + + W(2, 1044958408, -1100693257, 1030339791, 1026076824) + W(3, -1109423369, 1048611339, 1054215533, 1024247225) + + W(4, -1106016522, -1113286331, -1142676381, 1026922691) + + W(5, 1059821143, -1085100606, 1039898225, -1126911267) + + W(6, -1119417706, 1012241985, 1063416476, -1082741615) + + W(7, 1046979692, -1119319754, 1016864285, 1033593306) + + W(8, -1109435540, -1105005730, -1157274234, -1131274519) + + W(9, -1134266292, -1108924145, 1051611888, -1096553463) + + W(10, 1033932042, 1018258200, 1026073927, 1029871326) + + W(11, 1046037553, -1091104802, 1022970360, -1118999381); + sum2 = W(0, -1117639690, 1032542252, 1049036492, -1106428174) + + W(1, -1100598545, -1124515281, -1126294727, -1105983103) + + W(2, 1053585046, -1090074420, -1101677356, 1042350020) + + W(3, -1135696947, -1105990346, 1063294224, 1074893281) + + W(4, -1088449090, -1128187082, 996342293, -1101410582) + + W(5, -1084067012, -1121077701, 1052666358, -1118105649) + + W(6, 1025603183, 1031145839, 1030876063, -1079475296) + W(7, 1049420880, 1033189178, -1120264553, 1029472991) + + W(8, -1090564487, 1059480413, -1099961793, 1012743453) + + W(9, 1034416033, -1125334020, 1047874805, -1099339963) + + W(10, 1047783255, 1016211057, 1029227505, 1016716795) + + W(11, -1103677712, -1097572114, -1106211131, 1026065323); + WS(998487488, 1024735998); + sum1 = + W(0, 1034787125, -1096711418, -1093645783, 1058035879) + W(1, -1113381667, 1020339515, 1033987197, 1049342972) + + W(2, -1089249828, 1055719968, 1033680357, 1037116250) + + W(3, -1118966639, -1099717199, -1085775960, 1060189357) + + W(4, -1108537011, -1109989161, -1138173503, 1051641300) + + W(5, -1083720757, 1061848612, -1102783527, 1046511483) + W(6, 1022076300, 1049184050, -1086133195, 1062875388) + + W(7, -1129404117, 1032957443, -1112157509, 1032130968) + + W(8, -1087092580, 1007190411, -1110331987, 1011591327) + W(9, 1034213589, 1048086279, -1098046771, 1051240059) + + W(10, 1030325168, 1039628088, -1125240838, 1039987293) + + W(11, -1087792286, 1039984791, 1051616838, -1135236550); + sum2 = W(0, 1001577162, 1048277958, -1094388043, -1079852425) + W(1, 1055450674, 1040994203, 1041063142, 1048804575) + + W(2, 1061039504, -1095199392, 1054780006, 1035580564) + + W(3, -1112011211, 1037383696, 1055288082, -1077655189) + + W(4, 1058201467, -1111912036, 1039747614, 1042988518) + + W(5, -1084834029, -1103423898, 1071463850, -1100510960) + + W(6, -1137882877, -1097597287, -1087507005, 1064308251) + + W(7, 1058560116, -1097442490, -1105672858, -1099442373) + + W(8, 1044806256, 1065240337, -1080251704, -1090250140) + + W(9, 1031849538, -1108394523, -1093629181, 1071708239) + + W(10, -1090257183, 1028605291, -1108158369, -1155656404) + + W(11, 1059993792, 1061107030, -1073879137, -1106111844); + WS(-1077135094, 1050907162); + sum1 = + W(0, -1132921461, -1117094275, -1098008869, 1043699095) + + W(1, -1112620946, -1122422352, -1127648729, 1033699545) + + W(2, -1094355462, 1055483630, 1042990903, 1034045812) + W(3, -1124984131, 1030394994, -1089194394, 1053279460) + + W(4, 1047326318, 1011377167, -1118007170, 1045491604) + W(5, -1081313730, 1065160347, -1121246728, 1042128328) + + W(6, -1117294457, 1039295895, -1088142214, 1056280352) + + W(7, -1110840279, -1103632934, -1126452986, 1040542752) + + W(8, -1094044967, 1058021117, -1106681402, 1039870541) + + W(9, -1124706520, 1018438944, -1098093746, 1041063570) + + W(10, -1128181366, -1109127577, -1119126518, 1035722382) + + W(11, -1094059515, 1050783700, 1018820533, 1037083890); + sum2 = W(0, 1003021837, -1110495495, 1016902499, -1116948709) + + W(1, 1029108513, -1113320609, 1029225785, 1032075003) + W(2, 993748010, 1041772340, -1097222635, 1042534143) + + W(3, -1123823650, -1122423961, 1028513681, 1083263801) + + W(4, -1063916786, 1039031010, 1023947681, 1043723635) + + W(5, -1096435650, 1074788880, -1074844879, -1104645285) + + W(6, -1119691195, -1138212418, -1120166015, 1038793960) + + W(7, -1115182489, -1124877446, 1024608678, 1017994477) + + W(8, -1119557273, 1017310535, 1021770517, -1131419477) + + W(9, -1125446899, -1115371525, 1032720188, 1032034162) + + W(10, 1014563122, -1119401015, 1034042378, 1002413729) + + W(11, -1115060009, -1118011761, 1027576529, 999290841); + WS(1048452526, 1015184705); + sum1 = W(0, -1138645804, -1110581160, -1106270342, 1048623137) + + W(1, 1006760678, -1113210911, 1032256237, 1049910352) + W(2, -1113826958, 1036222192, 1042522323, 1029873877) + + W(3, -1114005032, -1103860667, -1097372109, 1057099626) + + W(4, -1101854594, -1111141177, 1026512560, -1098570768) + + W(5, -1087095027, 1061337654, -1106501979, 1024448974) + + W(6, -1140244890, -1119844941, -1095003728, 1054485156) + + W(7, -1115808507, -1125584845, -1131077462, 1040825100) + + W(8, -1095439444, 1049129464, 1027903818, -1111469876) + + W(9, 1024452554, 1017183931, -1128526324, 1044366494) + + W(10, -1153767820, 1027351533, -1122466948, -1119780203) + + W(11, -1106181921, 1040163591, 1034550428, -1117633442); + sum2 = + W(0, -1117856953, 1034706164, 999139177, -1115089108) + W(1, 970725323, 1017499348, 1002437005, -1114697961) + + W(2, 1016679180, 1009230224, 1019562884, -1131336757) + W(3, -1122373390, -1110151254, 1034965747, 1007700984) + + W(4, -1131774725, 1031482891, 1023823647, -1078943314) + + W(5, 1069645782, -1105149666, 1038179083, -1120925641) + + W(6, -1131092262, -1111296752, 1026082346, 1033262730) + W(7, 1014219446, 1015408436, -1119824143, 1008147760) + + W(8, 1005900489, -1142960238, -1130072184, 1001625665) + + W(9, -1129026789, 1015792571, -1134452913, 1015281188) + + W(10, 1012295392, -1137039581, -1118651901, 1029244251) + + W(11, -1121319377, 1026230788, -1122304449, 1019807852); + WS(1061396972, -1097419696); + sum1 = + W(0, 1040610541, -1110826049, -1087862644, -1108888122) + W(1, 1051684947, -1117156776, -1116833412, 1042368898) + + W(2, 1000165941, 1058527541, -1102910221, -1135746300) + + W(3, 1015657075, -1113808270, -1108964145, 1056284429) + W(4, 1041698836, 1026275932, -1126977972, 1036447253) + + W(5, -1085843362, 1053927177, -1107922836, 1041042462) + W(6, 1033993320, 1043284110, -1088558114, 1062174380) + + W(7, 991752527, -1137078595, -1125945514, 1048078310) + W(8, -1086794197, 1055390198, -1112253878, 1035139905) + + W(9, 1028019732, 1028739112, -1087573386, 1042115560) + + W(10, 1039363202, -1118906322, -1120964750, 1052576556) + + W(11, -1079810761, 1051035743, 1047360574, 1038370422); + sum2 = W(0, -1104315228, -1103350409, -1094844926, 1062539510) + + W(1, -1096027281, 1014020953, -1117475550, 1024254038) + + W(2, -1091235931, -1112967686, 1042482062, -1119186298) + + W(3, 1019617669, -1116633366, -1089312569, 1056743222) + + W(4, -1129394013, 1028745390, -1096755788, 1042486592) + + W(5, -1104902685, 1052266072, 1051055108, -1093268483) + W(6, 1043056626, 1038440719, 1045881224, 1037341407) + + W(7, 1044017054, 1054988226, -1097959989, -1097184876) + + W(8, -1101957876, 1012499609, -1101861122, -1102938164) + + W(9, 1038305467, -1107570984, 1058820589, 1048266302) + + W(10, -1105903455, 1026503526, -1121707278, -1092525975) + + W(11, 1058872796, -1099676541, 1041661910, -1135013257); + WS(-1084431788, -1073850193); + sum1 = W(0, -1121456839, -1130755883, -1131651239, 1035028387) + + W(1, 1035837265, -1139076328, 1023326765, -1119027356) + + W(2, -1113039213, 1052115068, 1031790055, -1110649673) + + W(3, -1111055334, 1007276024, 1041028837, -1087869490) + + W(4, 1043959725, -1126605404, -1131954777, 1032958718) + + W(5, -1121014635, 1031197854, -1151139494, 1037205893) + + W(6, -1127100870, 1051511197, -1080291009, 1064028192) + + W(7, -1097929447, 1022476742, -1115233108, 1038479638) + + W(8, -1101242168, 1046762496, 1016490449, 1029406204) + W(9, 1032290155, 1033362061, -1095204295, 1048797598) + + W(10, 974160200, -1117985767, -1113154576, -1118671783) + + W(11, -1109590335, 1048241682, 1033898418, 1016018525); + sum2 = W(0, 975878233, 1035912472, 1033266404, -1098777501) + W(1, -1115369638, 1024165887, 1027199947, 1026239811) + + W(2, -1101163205, -1120465270, 1047867282, -1114558090) + + W(3, 1032202892, -1109490583, -1092678923, 1026269275) + + W(4, 1048647954, -1127793863, 1011577542, -1099491895) + + W(5, 1052721602, 1058060839, 1026065727, -1110013405) + W(6, 989447596, 1027909011, -1115079323, 1022663675) + + W(7, -1107120056, -1115589183, -1126785583, -1142596491) + + W(8, 1042994318, -1109244590, -1139333782, 1028177183) + + W(9, -1112180928, 1032601180, -1117880304, -1139999774) + + W(10, -1113232790, -1119188249, 1027448187, 1030066347) + + W(11, 999387083, -1113199846, -1128307819, 1010561254); + WS(1060891500, 1063998119); + sum1 = + W(0, 1009319059, 1034817251, 1060685055, -1082111981) + W(1, -1146641530, 1021753903, 1021371624, -1123888698) + + W(2, 1050963407, -1089953728, 1042831681, -1158245846) + W(3, 1020060242, 1007070174, 1059880676, -1083685732) + + W(4, 1044491976, 1024323659, 1034805925, 1031377177) + W(5, 1058492133, -1080402290, 1049293617, 974645755) + + W(6, -1119463744, 1035958587, 1057972187, -1087669949) + W(7, 1044279073, 1017781825, 1029917861, 1040845210) + + W(8, 1045390927, -1092052092, 1030870792, 1029410098) + W(9, 1022228167, -1119265271, 1050698442, -1101265316) + + W(10, 1040824939, 1009963113, 1028919037, 1041595485) + + W(11, 1042995863, -1093474029, -1117179330, 1033823734); + sum2 = + W(0, 1043252027, 1031085111, -1089976691, 1015926083) + W(1, 1075090314, -1090475122, 1039685669, -1103588836) + + W(2, -1136546874, 1047286193, 1055918010, 1041438201) + W(3, 1021402919, -1094345084, -1106220008, 1049855126) + + W(4, -1100279282, -1097421747, 1043798699, -1097680472) + + W(5, 1053086422, -1093227067, -1086978538, 1055157984) + + W(6, -1106121381, -1098140010, 1041831351, 1030378489) + + W(7, -1081018505, 1047503463, -1107286980, -1117022930) + + W(8, 1053158416, 1047431201, -1090494906, 1040447738) + + W(9, -1116219530, -1111854401, 1043898913, -1088912308) + + W(10, 1049023531, 1013873926, -1105216890, -1165267820) + + W(11, 1065796563, 1047204695, -1076607098, 1060337257); + WS(-1071907259, -1110912590); + sum1 = W(0, -1125193009, 1047025832, -1082520498, 1060301769) + + W(1, 1034040338, 1027334603, -1128862543, 1037187527) + W(2, -1091004805, 1051495910, 999732421, 1007930762) + + W(3, -1134196340, 1045585380, -1082717575, 1059488668) + W(4, 1034460834, 1012148988, 1030754750, 1046461539) + + W(5, -1081098270, 1059029683, 1039737374, -1153534395) + + W(6, -1115532794, 1034859053, -1085641231, 1058265227) + W(7, 1026869576, 1008981841, 1035978988, 1044478211) + + W(8, -1094770022, 1047385124, 1035505465, -1141674924) + + W(9, -1122396199, 1038023446, -1100806498, 1051401113) + + W(10, -1108119003, -1131397284, 1030566929, -1115297724) + + W(11, -1096364930, 1030610907, 1049444580, 1004145403); + sum2 = W(0, -1094095783, 1071341959, -1106266089, -1079612356) + + W(1, -1096220802, 1053270877, 1046265071, 1041114835) + + W(2, -1087794787, -1090342602, -1119797941, -1103321092) + + W(3, -1105766507, -1093757522, 1036032273, -1097206613) + + W(4, -1100480279, 1044676561, 1052972269, -1096593198) + + W(5, 1065807667, 1072329002, -1091841958, -1113258696) + + W(6, -1118583019, -1091593516, -1120668367, 1052074546) + + W(7, -1107977625, 1022355226, 1048411623, -1091154406) + + W(8, -1098744738, 1035089459, 1049018868, -1099949977) + + W(9, -1102184915, 1057911473, -1101075731, 1053464489) + + W(10, -1101117382, 1048742227, 1063609884, -1073590228) + + W(11, 1041493985, 1066861510, -1098841365, -1096064815); + WS(-1073583387, -1097642521); + sum1 = W(0, -1113793830, 1040986278, -1123577624, 1026212810) + + W(1, 1031641306, -1117606078, 1025630043, 1018743169) + W(2, 1051202676, -1107655120, 1015332695, 1026666645) + + W(3, 999171711, 1043520539, -1085714085, 1058537807) + W(4, -1102186706, 999394704, -1113970392, -1126196031) + + W(5, -1137921726, -1102760649, 1042214156, -1098706922) + + W(6, 1041107242, -1117788829, 1058609607, -1084066799) + + W(7, 1050734989, 1028174279, -1126372055, 1023908016) + + W(8, -1120709796, 1038867522, -1104026556, -1105230460) + + W(9, 1019259188, 999617264, 1049515695, -1105494638) + W(10, 1038371877, -1131430066, -1141619744, 997975216) + + W(11, 1048163249, -1113662887, -1118473257, -1117999154); + sum2 = + W(0, 1020465344, -1114187457, 1042661620, -1108558660) + W(1, 1022323488, 1024517966, -1122047285, 1035498840) + + W(2, -1112200610, 990338200, 1037081003, -1114108748) + W(3, -1132946638, 990134284, 1050532943, -1098817485) + + W(4, -1116108394, 1033071181, 1029560286, -1105572872) + W(5, 1053825241, 1046181371, -1112231866, 1024966834) + + W(6, -1137208000, -1125836673, 1035380426, 1052951690) + + W(7, -1098433232, 1018142458, 1032274109, -1107008827) + + W(8, 1041934457, -1099854916, -1115059895, -1114933005) + + W(9, 996568996, -1143550666, -1132156656, -1101729420) + + W(10, -1106305341, 1025004711, -1139618609, -1133886920) + + W(11, -1115627477, -1120597401, -1145950712, -1129654551); + WS(1066138518, -1093674260); + sum1 = + W(0, 1029114768, -1096639483, 1057895286, -1095967018) + W(1, 1030209323, -1115838467, 1016625343, -1107076945) + + W(2, 1046373881, -1098130813, 1027610352, 1036809869) + W(3, 1023256234, -1097327813, 1060592282, -1090692519) + + W(4, 1010824623, -1116997111, -1135602902, -1112968866) + + W(5, 1048700903, -1096019117, -1147523994, 1034515722) + + W(6, -1154917052, 1039946769, -1102042589, 1052511498) + + W(7, -1107963320, 1025259308, -1126509217, -1145778087) + + W(8, -1102212410, 1050590801, -1106421308, 1031910367) + + W(9, -1119361423, 1040195377, -1110743776, 1037092318) + + W(10, -1114290095, 1015369596, -1120895465, 1035798312) + + W(11, -1096085673, 1054517602, -1103975991, 1032370884); + sum2 = + W(0, 1020680083, -1098235374, 1040052819, 1039185699) + W(1, -1105651771, 999965284, 1026207298, -1129289080) + + W(2, 1000882372, 1041518935, -1108930987, 1025606660) + W(3, -1114338038, 1035819795, -1104532064, 1060121453) + + W(4, -1132043948, -1127194998, 1034412140, 1034843888) + + W(5, -1096717996, -1098039050, 1059664416, -1123799241) + + W(6, -1119552802, 1030579314, 1025849568, -1085068698) + W(7, 1064006582, 1020099573, -1132183796, 1031435954) + + W(8, -1126927262, -1105751584, -1108966794, -1130436386) + + W(9, 1014438782, -1118921036, 1034356940, 1039772175) + + W(10, -1090790505, 1040432622, 1026463590, -1110299389) + + W(11, 1043556407, 1060018227, -1083675102, -1098649260); + WS(-1098394199, 1021768394); + sum1 = + W(0, -1106976773, 1047476460, 1035645360, -1107202165) + W(1, -1121988294, 1008308247, 1030592418, -1106379994) + + W(2, 1042879449, -1121922344, 986778214, -1140215924) + W(3, -1109895628, 1041629170, 1052123789, -1091385002) + + W(4, 1042582852, -1120193402, 1031813276, -1108680996) + + W(5, 1053022447, -1090269731, 1042227034, -1127396653) + + W(6, -1114022359, 1028771909, -1107385030, -1107044710) + + W(7, 1044112989, 973525940, -1124672038, -1123109432) + + W(8, 1044862779, -1127679127, -1115617842, -1139398721) + W(9, 980431986, 1035760915, 1023833154, -1107740288) + + W(10, 1030134009, 1014367554, -1118216524, 1039049769) + + W(11, 1040198899, -1099192133, 1025832513, -1116507498); + sum2 = W(0, -1098169790, 1055345266, -1106123518, 1039932359) + W(1, -1111072353, 1012808524, 968544056, 1027898732) + + W(2, 1021773530, 1036378047, -1123343911, -1132858861) + + W(3, -1162122654, 1053687424, -1089212318, 1035540057) + + W(4, -1111121590, 1037852727, 1056997121, -1077105818) + + W(5, 1068095045, -1098361429, 1044527270, -1103837325) + + W(6, 1029158812, 1039110353, -1090252350, 1000425352) + + W(7, -1115281069, 1036594354, -1112228820, 1037144043) + + W(8, -1124556656, 1050038066, -1114307158, -1134065606) + + W(9, 1026696161, 1022799116, -1130232224, -1118055459) + + W(10, -1116705210, 1032061348, -1112296199, 1042942743) + + W(11, -1104975561, 1040445489, 1023167430, -1114916168); + WS(1064984812, 1025677564); + sum1 = + W(0, 1043884023, -1096329284, -1084712758, 1057726586) + W(1, 1043356655, 1012739123, 1030924649, 1033742216) + + W(2, -1103101243, 1046959260, 1018532660, -1131015624) + + W(3, 1038396303, -1101734196, -1087209573, 1057188432) + W(4, 1046520365, 1002161670, 1036152448, -1105624932) + + W(5, -1086845720, 1061206275, -1114153679, 1044816791) + W(6, 1017544939, 1017123640, -1084903475, 1060371326) + + W(7, -1111584053, 1024962678, 1042241831, -1108991823) + W(8, -1087299343, 1055419738, 1028245989, 1043667629) + + W(9, -1121467129, 1037154774, -1108220133, 1041931586) + + W(10, 994164350, -1114955616, 1047065797, -1096026219) + + W(11, -1087523701, 1055087388, 1051664559, 1040331724); + sum2 = + W(0, 1043159502, -1104158106, -1085409392, 1067096435) + W(1, -1090972778, -1098664617, -1105699647, 1050222709) + + W(2, -1090385012, -1106627676, -1102151020, 1050757442) + + W(3, 1038273264, 1025130152, -1106188919, 1052171093) + W(4, -1086083449, 1039140273, 1032147900, 1032288328) + + W(5, 1061149199, 1075677902, -1070862987, 1030992941) + W(6, 1048938986, -1103450106, 1050752016, 1075039778) + + W(7, -1070168511, 1040257314, -1106879197, -1110143950) + + W(8, 1049612036, 1073503496, -1072257998, 1041175752) + W(9, -1128156680, -1098742781, 1057886527, 1075355126) + + W(10, -1070483864, 1030488248, 1049056829, -1091104362) + + W(11, -1095713225, 1082426924, -1070643407, -1098188298); + WS(-1072457547, -1104871915); + sum1 = W(0, 1018087532, -1138749297, -1129333765, 983826087) + W(1, 1026100589, 1007352484, 1014551830, 1036550950) + + W(2, -1131367952, 1050222745, -1118152278, -1123482688) + + W(3, -1143311830, 1001512248, -1083142279, 1055877542) + + W(4, -1106883828, 1034580622, 1031881454, -1098112129) + + W(5, 1014989673, 1020808474, 1016760626, -1109491581) + + W(6, 1033102921, -1104222042, 1059974718, -1086706094) + + W(7, 1045231050, -1122062610, 1020957612, -1104597767) + + W(8, 1057969217, -1096646942, 1040528910, -1114916930) + + W(9, -1158925470, -1125431314, 1048954301, -1105443081) + + W(10, 1027306868, -1147978606, 1015585054, 1042534317) + + W(11, 1043242379, -1106542638, -1120756612, -1122581117); + sum2 = + W(0, -1120473304, 1034530006, -1151412702, -1124099243) + W(1, 1026058392, -1131120105, -1112539216, 1032795060) + + W(2, 1009244103, -1115907580, -1114805763, 1025202928) + W(3, -1132295147, 1046686841, 1037608248, 1020085733) + + W(4, -1120554932, 998829429, -1099708049, 1054832981) + W(5, 1050403530, 1033863239, -1154011810, -1131382687) + + W(6, -1120301365, -1109933894, 1051005406, -1107650300) + + W(7, 1036477609, 1020773937, -1106531527, -1089566811) + + W(8, -1106362502, 1030750625, -1122049677, -1143352615) + + W(9, -1119309605, 1004612697, -1114169666, -1130967605) + + W(10, 1028389062, -1142800679, -1165429700, -1105741108) + + W(11, 1026755208, -1146151019, 1026996282, 1016610669); + WS(1057548396, -1118860492); + sum1 = W(0, 1024314991, 1024521628, 1019907062, -1109277847) + W(1, 1042186208, -1127185475, 1015464700, 1035643506) + + W(2, 1035362560, 1033181378, 1019936830, 1015346289) + W(3, 1033090170, 1022826491, -1102305323, 1038789717) + + W(4, 1047455161, 1015056043, 1024068436, 1044765945) + W(5, -1077384746, -1093016121, 1050623422, 1035221881) + + W(6, 1023937802, 1040253828, -1095947197, 1047039772) + W(7, 1039235079, 1019339797, 1007695803, 1032416458) + + W(8, -1110302756, 1032628147, 1012944520, 1030260028) + W(9, 1026830221, 1031527745, -1110046895, 1032291149) + + W(10, 1025595072, -1124358344, -1142835770, 1041535598) + + W(11, -1106773417, 1038601945, 1031404576, 1039118899); + sum2 = + W(0, 1028948662, -1119520873, 1040692087, -1099276378) + W(1, 1042585669, -1108959122, -1108748842, 1035535229) + + W(2, -1128105382, -1125068566, -1119570187, -1105777938) + + W(3, 1035054379, 1034598190, -1105801492, 1046560183) + W(4, -1104135640, 1040780747, -1114955281, 1040844095) + + W(5, 1058969109, 1035247795, -1104363062, -1115696651) + + W(6, -1123628391, 1017632867, -1140061979, 1037021603) + + W(7, -1119904127, -1122498951, 1033670708, 1028317650) + + W(8, -1098716294, 1041621971, -1109815486, 1039115990) + + W(9, -1113438145, -1152158269, -1100355456, 1042440154) + + W(10, 1033417138, -1102421790, 1009774019, 1033306906) + + W(11, -1097137530, 1045186907, -1096381982, 1043903068); + WS(-1111617372, -1089239798); + sum1 = + W(0, -1120946745, -1109363280, 1036859267, -1107333692) + W(1, -1131126919, 1028471724, 1043411666, -1105933140) + + W(2, -1100282243, 1036658471, 1046725686, -1102252305) + + W(3, -1105344783, -1122482989, 1033736099, -1096910672) + + W(4, -1138971218, 1048148056, 1034980559, -1097138762) + + W(5, 1040067055, 1063625005, -1100591479, -1115573502) + W(6, 1035032490, 1028445691, -1085774908, 1059841631) + + W(7, -1101046354, 1018704810, -1102176538, 1038047807) + W(8, 985367106, 1050659758, -1099856795, 1038410359) + + W(9, 1042691462, -1104930291, -1095561837, 1056206133) + + W(10, -1114722211, -1104725204, -1106084756, 1036625252) + + W(11, -1105930796, 1039222942, 1033845467, 1032806392); + sum2 = + W(0, 1032901751, -1102980188, -1097455677, 1019096213) + W(1, 1032175116, -1112661460, -1107914664, 1034775565) + + W(2, -1079544271, -1123759676, -1101940532, 1048109574) + + W(3, 1029069579, -1107463876, -1107584024, 1039965269) + W(4, 1028816201, -1102645998, 987500422, -1115674720) + + W(5, 1066142773, 1060530292, 1036298034, 1048822254) + W(6, -1107918292, -1122769714, 1049477386, 1039765158) + + W(7, -1100641824, -1106440053, 1041931397, 1028640927) + + W(8, -1110827944, -1133849713, 1041944181, -1113520406) + + W(9, -1106970712, -1133982193, 1040943686, -1110406142) + + W(10, -1113302080, 1032469881, 1026585516, -1112107626) + + W(11, 1033119735, -1129682772, 1007346649, -1114426196); + WS(1055684951, -1075449937); + sum1 = W(0, 1025203701, 1021145317, -1089325052, 1050955910) + W(1, 1044060206, 1023449767, -1109225282, 1041132226) + + W(2, -1098148265, 1048074946, -1122722677, -1117792831) + + W(3, -1105594014, 1045336591, -1089314051, 1059061644) + + W(4, -1138312640, 1024771419, -1102495686, 1048290762) + + W(5, -1085251962, 1063401377, -1135340574, 1034487612) + + W(6, -1115277256, 1046212734, -1086898788, 1058388246) + + W(7, -1108206354, -1122363216, -1131312361, 1033816821) + + W(8, -1089905605, 1057949871, 1012872015, 1023079171) + W(9, 1003392922, 1042625602, -1090587428, 1049257380) + + W(10, 1013091209, -1119440554, -1119401549, 1032304674) + + W(11, -1086086859, 1056447675, 1030899626, 1029355212); + sum2 = + W(0, 1061277558, -1075680192, 1064394375, 1041412946) + W(1, -1097187807, 1043650757, 1070915797, -1078675502) + + W(2, -1099840736, 1036217426, 1041322393, -1128025338) + + W(3, 1077465728, -1072669743, -1080083122, 1053075748) + + W(4, -1098777830, -1113957037, 1077005703, -1071891757) + + W(5, -1110541808, 1035413026, -1105806062, 1028555409) + + W(6, 1067272551, -1079654744, 1034295344, -1098463344) + W(7, 1042040059, 1035679275, 1035834095, -1094224921) + + W(8, 1034313258, 1050839735, -1099205009, -1113787473) + + W(9, -1140563054, -1124876273, 1044374977, 1012713199) + + W(10, 1043077130, 1015942004, -1101597023, -1106967769) + + W(11, 1056268760, 1033733408, -1097742853, 1036121231); + WS(-1084991020, -1093321377); + sum1 = + W(0, -1124603198, 1041431403, 1058092855, -1087194206) + W(1, 1031898965, 1027465426, 1020905181, -1106261797) + + W(2, 1050746614, -1093664550, 1020373118, 1019387090) + W(3, 1034567442, 1012534679, 1060858482, -1086211050) + + W(4, 1037199077, 942151344, 1033810210, -1100435893) + W(5, 1063338984, -1081371861, 1028138434, -1130539845) + + W(6, 1026468027, -1113177704, 1057782107, -1091610836) + W(7, 1041359812, 1019123574, 1034346016, 1029015460) + + W(8, 1050350895, -1090363161, 1026545296, 1032894586) + W(9, 1012576759, -1109083497, 1047981412, -1099126963) + + W(10, 1017607178, 1018549369, 1040898454, 1045957208) + + W(11, 1051078083, -1088769118, -1114891854, 1024075622); + sum2 = + W(0, 1049096145, -1096421724, -1104462777, 1019605429) + W(1, -1107039596, 1039363330, 1050639335, -1100344181) + + W(2, 1044471716, 1054069324, -1112798845, -1113551308) + + W(3, 1060252300, -1085369111, -1101216805, -1124780213) + W(4, 1041817400, 999612981, 1068716746, -1076762820) + + W(5, 1050347336, 1025609425, -1099054195, 1018249637) + W(6, 1070836883, -1073687271, 1052234046, -1096692411) + + W(7, 1029953841, 1028531297, 1071114171, -1075542147) + W(8, 1009296899, 1043747806, 1030832137, -1109453871) + + W(9, 1069477538, -1076870984, 1047758574, 1026561745) + + W(10, -1135279155, 1027426027, 1068968491, -1078719402) + + W(11, -1114781860, 1035243068, -1140937749, -1125031723); + WS(-1082530796, 1061926473); + sum1 = W(0, -1111745736, -1107298323, 1048819916, 1033356744) + + W(1, 1034157517, -1119982339, 1030277984, -1127531019) + + W(2, 1039611697, -1113172467, -1127895905, 1009757802) + + W(3, -1123296661, -1109831840, 1058045501, 1035918242) + + W(4, -1146238814, -1125062126, 1039021467, -1118701125) + + W(5, -1099048749, -1088898044, -1099659681, 1039341706) + + W(6, -1130604760, -1101933527, 1052265202, -1125679275) + + W(7, 1032846000, -1111731430, 1012520514, -1114851579) + W(8, 1034215157, 1029808585, 1005542493, 1016627083) + + W(9, -1112767704, 1016124742, 1037161440, -1110952702) + + W(10, 1024904046, -1137100912, 1017586258, -1131932512) + + W(11, 1010862879, 1040689749, -1114167271, -1130467695); + sum2 = W(0, -1123675689, 1027790609, -1107220732, -1138688370) + + W(1, -1114685917, -1131813881, 1025856461, -1115257125) + + W(2, -1103597907, 1036222096, -1104487390, -1138958066) + + W(3, -1129839981, 1041635489, -1083432255, -1099581339) + + W(4, -1113019592, 1015980625, 1039506778, -1087170514) + + W(5, 1074899174, 1052206445, -1103205528, 1015820001) + + W(6, -1111122039, 1054414527, -1087814585, 1033877978) + + W(7, -1114160943, 1023501105, -1108253250, 1040911707) + + W(8, -1119836905, 1035305654, -1128600489, -1135082354) + + W(9, 1042547871, -1107819629, -1108795814, 1040418607) + + W(10, -1113593105, 1028405761, 1023517501, -1119501461) + + W(11, -1120345851, 974999585, -1136105250, 1023691837); + WS(1064809580, 1026007555); + sum1 = W(0, -1117346201, -1139810490, 1018638922, 1046259126) + + W(1, -1110265860, -1107316166, 1012678303, -1117193870) + + W(2, 1041509643, -1116046893, -1107022182, 1042684025) + + W(3, -1112794575, 1032058104, -1089321581, 1058768682) + + W(4, 1049529906, -1107194416, 1024755966, -1127734554) + + W(5, -1106321711, 1057441571, -1097674775, -1115653262) + + W(6, -1119597108, 1040786347, 1042250009, -1088983804) + + W(7, 1052962187, -1115453338, -1109792204, -1106953519) + + W(8, -1136225478, 1052663642, -1105006210, -1104239151) + + W(9, 1039580268, -1120656619, -1140389406, 1033398978) + + W(10, -1138416249, 1026892022, -1109340249, -1123630216) + + W(11, 1031754384, 1030125211, -1114619763, -1113265368); + sum2 = W(0, 1002173025, -1126476274, 993251281, 1035289805) + W(1, 1026092616, -1119256919, 1022454821, -1112202702) + + W(2, 1027055467, -1110248161, -1106697397, 1035602798) + + W(3, -1114052781, 1040267060, -1106967376, 1050537246) + + W(4, 1051631259, -1119463370, 1026488668, -1105276944) + + W(5, 1037292044, -1103163514, -1119693560, -1109176262) + + W(6, 1024785122, 1041996701, 1032247852, 1036995069) + W(7, 1026699348, -1123291766, -1114947733, 1024974628) + + W(8, -1103384730, 1044720036, -1113586574, -1103668424) + + W(9, 1041552522, -1106672600, 1024347316, -1136575544) + + W(10, 1012871948, -1104716490, -1114686018, 1014734543) + + W(11, 1038837578, 1011597497, -1113050536, -1124038001); + WS(1065652022, 1032044813); + sum1 = + W(0, 1008146233, 1024151812, -1109382253, 1046726755) + W(1, -1118504831, -1145994760, -1138253430, 1033154018) + + W(2, -1111423088, -1114751985, 1030270670, 1011776865) + + W(3, -1111490857, 1037025524, -1089787453, 1060185520) + + W(4, -1108385813, 1031075253, 1034343482, -1098142828) + + W(5, 1056996567, -1102691401, 1034117937, -1115595081) + + W(6, 1027957290, -1093711910, 1064926206, -1084615165) + W(7, 1042611828, -1141498448, 1037589943, 1019326054) + + W(8, 1020462798, -1096112169, 999245356, 1030480467) + W(9, 1035138662, -1137243780, 1028825917, -1123985530) + + W(10, -1106962907, 1020535720, -1130048270, 1033030167) + + W(11, 1017317515, -1105819364, -1131349303, -1161641125); + sum2 = W(0, 1006780909, 1018874621, -1118402441, -1125742470) + + W(1, 1022906649, 1002124531, 1032029355, -1106542042) + + W(2, -1123089851, 1042324218, 1032351097, -1127943559) + + W(3, 928839112, -1114343998, -1111882995, -1150379126) + + W(4, 1030201786, -1112138839, -1118040285, -1106692361) + + W(5, 1057618964, 1059562898, -1096401122, 1036092239) + + W(6, -1112805367, 1043467647, -1114692462, -1124030112) + + W(7, -1101041619, -1119061832, -1105940221, 1041450718) + + W(8, 1035656455, -1096899429, -1105376866, 1038704957) + + W(9, 1025941308, 1036583459, -1122657152, -1115452253) + + W(10, 1025207396, -1115257437, 1031169874, -1106475204) + + W(11, -1181112366, -1108009053, -1117532473, 1040262599); + WS(1060219372, -1086892801); + sum1 = + W(0, -1103145773, 1039153858, 1051640744, -1098525574) + W(1, -1104573181, 1018968139, 1041685441, -1139059104) + + W(2, -1111094658, -1114399172, 1034492410, -1114173214) + + W(3, -1114046300, -1139626983, 1060139625, -1105262039) + + W(4, -1112320535, -1114750605, -1105288038, 1051743245) + + W(5, 1048845947, -1084251893, 1048366229, -1119683574) + W(6, 1036049319, 1005204005, 1056234019, -1132035760) + + W(7, 1045757805, -1113866359, -1105447101, -1096900831) + + W(8, 1058595229, -1097183901, -1102598303, -1132035040) + + W(9, -1153064218, 1006778518, 1030114274, -1095492788) + + W(10, 1044243314, 1021887633, 1037687846, -1097346218) + + W(11, 1052830405, -1105878061, -1114955456, -1107291810); + sum2 = + W(0, -1116149857, 1025241726, -1099180395, 1043244905) + W(1, -1108018378, 1036684654, -1115656995, 1004099725) + + W(2, -1094029030, 1042198638, 1030698655, -1113978987) + W(3, 1030898684, 1025926274, 1029208805, 1050305603) + + W(4, -1105752531, 1030311314, -1101937257, 1029996270) + + W(5, -1093188603, 1051892024, 1032179392, -1143836228) + W(6, -1172884346, 1015423640, 1043486640, 1010118001) + + W(7, 1042453668, -1107174775, -1108962642, -1098527410) + + W(8, 1057927618, -1111697287, -1110311603, 1032971351) + + W(9, -1122887710, -1102965987, 1033678913, -1106879588) + + W(10, 1043859461, -1114814873, 1035380843, -1099100919) + + W(11, 1054675670, -1115267941, -1124505249, -1114563702); + WS(1054285911, 1050558006); + sum1 = + W(0, -1123510162, 1038924416, -1103298920, 1049975562) + W(1, -1107117058, -1132690963, -1131523010, 1041880394) + + W(2, -1093800836, 1050884477, -1103773453, 1013663344) + + W(3, -1131464621, 1042834130, -1095165898, 1056805171) + W(4, -1101616339, 1008580322, 1019709806, 1022473868) + + W(5, 1057683379, -1101108530, -1121085405, -1112183179) + + W(6, 1029482925, -1100861061, 1065493943, -1084744157) + + W(7, 1044641696, -1107880231, 1019519396, -1099456110) + + W(8, 1059660975, -1084827161, 1037612741, -1118057053) + + W(9, 1008876867, -1103795177, 1052993120, -1096422344) + W(10, 1041661496, -1120002940, 990268585, 1023983666) + + W(11, 1049686449, -1102767109, -1112995616, -1125681410); + sum2 = W(0, -1122499415, -1115660402, 1019721643, 1052675919) + + W(1, -1134010714, -1107636671, -1135750526, -1103885919) + + W(2, -1163427536, -1111228057, -1097257542, 1043515230) + + W(3, 1025808744, -1107570715, 1050733408, 1050715774) + + W(4, -1097200131, -1113330231, 1004729468, -1109043837) + + W(5, 1068391994, 1068640266, -1098019427, 1035061875) + + W(6, 1038371609, -1101018403, -1088555463, -1109791041) + + W(7, -1104872484, 1015805682, 1025309219, -1106866200) + + W(8, 1029079067, -1082318320, -1103711089, -1134559274) + + W(9, 1037233345, -1100735475, 1034253450, 1048468038) + + W(10, -1096395820, 1043601518, -1107252608, 1049544712) + + W(11, -1147071004, -1092391889, 1032346912, -1139706642); + WS(-1090663639, -1077388844); + sum1 = + W(0, 1018174482, -1118693311, -1093711755, 1049109025) + W(1, 1040639418, 1010315758, -1160081154, 1029100670) + + W(2, -1098783931, 1046071575, 1021012498, -1115518041) + + W(3, -1125628059, -1120731528, -1088582516, 1052420297) + + W(4, -1106387497, -1181480889, -1132569784, -1106887239) + + W(5, -1095941442, 1068562223, 986381179, 1034527238) + W(6, -1117916196, -1106415899, -1087125152, 1064382514) + + W(7, -1096200966, 974332196, -1117849353, -1097169074) + + W(8, -1094690684, 1058209900, -1116837948, 1015836076) + + W(9, 1021610031, -1146324700, -1097735927, 1048904111) + + W(10, 1025702951, -1123641014, -1122253105, -1168966176) + + W(11, -1093052224, 1056110513, -1121509238, 1025570188); + sum2 = W(0, 1034436941, -1094381136, 1032181918, 1038416019) + + W(1, -1157362266, 1040127243, -1113720588, 1042206203) + + W(2, 998633097, -1112936962, 1041189037, -1108577062) + W(3, 1024698569, -1096498964, 1057336919, 1044225483) + + W(4, -1114037642, -1122557473, -1106229774, -1082651758) + + W(5, 1076874404, 1035551973, 1029476436, 1033287923) + W(6, 1036635696, -1065300211, 1081990850, 1041430251) + + W(7, 1035032611, 1024588020, 1046234567, -1070759890) + W(8, 1049370102, 1045207615, 1036601034, 1015731519) + + W(9, 1052080385, -1090746117, -1114040834, 1038285588) + + W(10, -1115422836, -1155116306, 1034351318, -1089089289) + + W(11, 1035723536, -1119691531, -1130950394, 1031958369); + WS(-1080363926, -1071486509); + sum1 = W(0, 1035667824, -1117755862, 1058850627, -1089812638) + + W(1, -1119781738, 1033333673, -1106562756, -1102851061) + + W(2, 1044522508, -1098855847, -1124105919, -1122920906) + + W(3, 1048836261, 1026770536, 1060900423, -1094273901) + + W(4, -1136163052, 1034167779, -1099668353, -1096598034) + + W(5, 1062774732, -1081351512, 1019768789, -1100720585) + + W(6, 1041756943, -1111989629, 1060314417, -1091724133) + + W(7, 1036217472, 1023569595, 1034350288, -1117155588) + W(8, 1058954340, -1097309107, 1034476769, 1037864032) + + W(9, -1111757455, -1106686285, 1047827972, -1089979637) + + W(10, 1034808863, -1108224543, 1036008540, -1110305168) + + W(11, 1058323473, -1097705308, -1112569431, 997120104); + sum2 = + W(0, -1130221439, 1026473921, -1098631230, 1059210683) + W(1, 991949852, -1088875775, 1039521143, 1040027805) + + W(2, 1049962270, 1037922688, -1128609979, 1043008084) + + W(3, -1106623296, -1103850305, -1102633929, 1032319554) + + W(4, 1032322677, -1081254616, 1040812416, 1044422007) + W(5, 1053913409, 1075309200, -1093367457, -1078110278) + + W(6, -1108121630, 1033782288, 1041179127, 1051007822) + + W(7, -1128820939, -1087823621, 1011405671, -1112409330) + + W(8, -1118313372, -1114991064, 1042490244, -1085620101) + W(9, 1024610419, 1042204829, 1033589003, 1064519547) + + W(10, -1108707286, 1038944538, -1120568012, 1007920671) + + W(11, -1105557487, 1041664007, -1108726636, -1097283302); + WS(-1085146860, -1078432897); + sum1 = + W(0, 1000247468, -1149696569, 1046594056, -1105608437) + W(1, 1029982264, -1128935441, 1037132754, -1105005939) + + W(2, 1049101493, -1092242085, 1035020227, -1114749360) + W(3, -1107087079, 1047641075, 1036712721, 1034057408) + + W(4, 1000135432, 1041253327, 1043827999, -1094624073) + + W(5, 1056540903, -1091288646, -1097712673, -1098691603) + + W(6, -1105171356, 1038438012, 1056427897, -1092984875) + W(7, 1048401189, 1031740017, 1034542459, -1098392071) + + W(8, 1052522438, -1099696227, -1113847620, -1124493285) + + W(9, -1139389265, 1037791108, 1039493090, -1123704450) + + W(10, 1041969240, 1035876258, 1019250012, -1111893867) + + W(11, 1053002294, -1096292923, -1109486882, -1117863020); + sum2 = + W(0, 981650725, 1022634928, -1122722467, -1134931805) + W(1, -1114801830, 1035155349, -1123188651, -1141995321) + + W(2, 1043118137, 1038372119, -1108690895, -1113558499) + + W(3, -1132394336, -1159373413, -1111962066, -1088039805) + + W(4, 1059960197, -1123558064, 1019312288, 1040593594) + + W(5, -1085264893, -1062981933, 1086226578, -1122982849) + + W(6, 1007032529, -1125839148, 1035586791, -1088420516) + W(7, 1052041256, 1041973847, 1019035800, -1144628769) + + W(8, 1030456162, 1033594923, -1121903247, -1112866008) + + W(9, -1139057577, -1130558040, 1025167346, -1132235322) + W(10, -1127116104, 999416881, 994405618, 996479090) + + W(11, -1121727683, -1141102409, 1010205301, 1015327588); + WS(1065314092, 1028007882); + sum1 = + W(0, 1031315399, -1118910333, -1110071882, 1027958726) + W(1, -1132049297, 1030345978, 1009229913, 1044274103) + + W(2, -1091088835, 1049048403, -1098774521, 1015648546) + + W(3, -1129846167, 1040482617, -1081937298, 1058342964) + W(4, -1097400260, 1033820695, 1030512684, 1028502523) + + W(5, 1057125791, 1041882615, -1128387300, -1123750794) + + W(6, 1027211107, -1098008831, 1063505604, -1081007746) + + W(7, 1042307230, -1119357859, 1024491495, -1114626726) + + W(8, 1056913060, -1094994912, 1046624506, -1108219417) + + W(9, -1133667543, 1030034106, 1045615294, -1103714125) + W(10, 1018202602, 1021380405, 1020076159, 1035646611) + + W(11, 1046315392, -1120947018, -1116178789, -1113806211); + sum2 = + W(0, -1105494348, 1051114204, -1106549278, -1106413411) + W(1, 1026636954, -1101805730, 1042860341, -1095282678) + + W(2, -1095274416, -1115620988, 1032482885, -1123651604) + + W(3, 1034523914, -1099570184, -1097084890, -1100406176) + + W(4, -1103782738, 1033985372, 1032509803, -1092355888) + W(5, 1068351366, 1061966336, -1111829172, 1041181693) + + W(6, 1037500440, -1093487707, 1045336627, 1064976080) + + W(7, -1099957245, -1105149847, -1136462181, -1101634066) + + W(8, -1093371043, -1095768559, 1011878641, 1041978329) + W(9, -1115571726, 1038218158, 1025607496, 1051011462) + + W(10, -1122142689, -1106959075, 1030953968, -1144657738) + + W(11, -1098135458, -1103066203, 1046841453, 1034424520); + WS(-1100053422, 1042143034); + sum1 = + W(0, -1121193300, 1038907933, 1037214192, -1104157285) + W(1, 1003265009, 927491180, 1027006179, -1101648146) + + W(2, 1052804861, -1116788520, -1105088109, 1036085839) + + W(3, -1116784408, 1051061595, -1092953078, -1115727182) + + W(4, 1044603252, -1112320669, -1124403186, -1096312949) + + W(5, 1063691363, -1094770533, -1110178331, -1132796507) + + W(6, 1032959000, 1021329739, 1057610578, -1085255924) + W(7, 1042273837, -1129217311, 1036096698, -1104405590) + + W(8, 1046101531, 1032460934, -1099699080, 1029210945) + W(9, -1106874909, 1032316755, 1033832353, -1101777344) + + W(10, 1042741769, -1111566277, -1140087089, 1026338531) + + W(11, 1044117027, -1123976854, -1110400285, 1023324661); + sum2 = + W(0, -1141740532, -1127364827, 1016858659, 1019476887) + W(1, 1027610232, -1114104878, -1141563308, -1115378106) + + W(2, 1014774982, 1033910688, -1098709711, 1038463125) + + W(3, -1146742484, -1097895309, 1061549017, -1098904537) + + W(4, 1048121474, 1009723338, 1037326381, -1089066292) + + W(5, -1086943216, -1087533486, 1044386108, -1128378528) + + W(6, -1100634945, 1074712949, -1081904953, 1051894188) + + W(7, 1035948687, -1114075451, -1112991637, 1036278807) + W(8, 1016249563, -1105464222, 1034738839, 1023041183) + + W(9, 998071241, 1023404119, -1104500239, 1039001405) + W(10, -1111082062, 1028418264, 1028661660, 1032269699) + + W(11, -1118089334, 1002948788, 1032376859, -1116656881); + WS(1064553004, -1122811923); + sum1 = + W(0, -1129171987, 1031404000, 1045766677, -1102182210) + W(1, 1024429036, -1144455651, 1032276908, -1105326008) + + W(2, 1049463355, -1094389820, 1026361994, -1121595412) + W(3, -1113233767, 1049333812, 1036005443, 974120215) + + W(4, 1035186995, 1034062296, 1041762428, -1095271692) + + W(5, 1059787495, -1088583546, -1095666629, -1100003363) + + W(6, -1110071667, 1021654775, 1057980603, -1092394330) + W(7, 1048809333, 1024774373, 1027123610, -1101813124) + + W(8, 1052117804, -1097358280, -1132328890, -1125809241) + + W(9, -1123823416, 1034262350, 1041561742, -1111517243) + + W(10, 1043990330, 1035275874, 1026480898, -1114787413) + + W(11, 1051913520, -1097569834, -1107060706, -1116630377); + sum2 = + W(0, 1027128731, -1118374135, 1034513610, -1123174378) + W(1, 1026835315, -1114420605, -1153474964, 1014938475) + + W(2, -1107487108, -1123472496, 1026726549, 1026647445) + W(3, 1032141903, -1106631533, 1042187602, 1054134699) + + W(4, -1092438474, 1008281595, -1114194268, 1049333862) + + W(5, -1091768288, 1082046784, -1066065893, 1032174407) + W(6, 1010972171, -1117272233, 1029258819, 1048672371) + + W(7, -1108402828, -1107223380, -1128303982, 1026850075) + + W(8, -1112584656, 1015595275, -1129520676, 1020663133) + + W(9, 1020076945, -1130317298, 1019094573, -1143083862) + + W(10, 1012988295, 1016020771, -1125252319, 1023253865) + + W(11, 1030375545, -1112246350, 1033146096, -1120189048); + WS(1066855734, -1119441794); + sum1 = + W(0, -1127562022, 1039804281, -1090674092, 1057948125) + W(1, -1113289318, 1040603681, -1123770274, -1106380690) + + W(2, -1096623933, 1041520634, -1102744925, -1104646487) + + W(3, -1115364812, 1049486942, -1088928155, 1058254390) + + W(4, -1126493725, 1030330554, -1108591004, 1052921753) + + W(5, -1086271011, 1066610309, -1125400685, 1047144630) + + W(6, -1109630903, 1002857256, -1088126629, 1047590014) + + W(7, -1097419497, -1118729135, 1012450637, 1049080999) + W(8, -1098448030, 1058670697, 1027654745, 1040353710) + + W(9, -1111453929, -1123146086, -1095526376, 1020669183) + + W(10, -1103558716, -1110153949, -1112819014, 1045715313) + + W(11, -1090620137, 1057080301, -1122765265, 1038000005); + sum2 = + W(0, 1029773001, 1045848843, -1100354950, 1042255280) + W(1, 1031741567, -1106457511, -1098400772, -1098127734) + + W(2, 985414438, -1114969170, -1101857955, -1121665039) + W(3, 1049403575, 1040542896, -1094506611, 1044461531) + + W(4, 1033605854, -1106685198, -1106957817, -1113384065) + + W(5, 1065317808, 1063282493, -1099888837, -1090380876) + + W(6, 1040180418, -1098054809, -1102424534, -1111953320) + + W(7, -1148110913, -1097784009, -1125940042, 1051521525) + + W(8, 1038107076, 1052337139, -1125555808, 1010307405) + + W(9, -1121768997, -1098090743, 1030043463, -1098581045) + + W(10, 1034608926, -1105861523, 1035657430, 1035815778) + + W(11, -1104826760, 1052586351, -1105779304, -1121200133); + WS(1024108216, 1053619151); + sum1 = + W(0, -1110237276, -1117217830, 1029541828, -1116974327) + W(1, 1028000106, 997960357, 1036125123, -1104025987) + + W(2, 1035829669, 1029841740, -1125285423, -1115997186) + + W(3, -1105593599, 1053313098, 1040682969, -1093167724) + + W(4, 1031701731, 1020700860, -1116690717, -1107833238) + W(5, 1058976450, 1049118258, -1094097902, 1017239158) + + W(6, -1138403916, -1112296045, -1104638900, -1102593951) + + W(7, 1055269059, -1122615091, -1118424632, -1108171422) + + W(8, 1053496066, -1123704112, -1100830255, 1029941429) + W(9, -1118568038, 1025019530, 997886569, -1107943218) + + W(10, 1036129823, -1111217181, -1117554448, -1113883668) + + W(11, 1047703644, -1108512765, -1109656827, 1020926429); + sum2 = W(0, -1119993039, -1109450011, 1040401784, -1106582025) + + W(1, 1033614749, -1147493015, 1038893624, -1096262037) + + W(2, 1053717996, -1117988753, 1000703247, -1114388777) + + W(3, -1105602869, 1055566572, 1043380434, -1092886002) + + W(4, 1034388956, 1043473668, -1106354535, -1158461197) + + W(5, -1105416337, 1072933379, -1081255560, 1043342555) + + W(6, 1032998629, -1117939535, -1087999087, -1083385663) + + W(7, 1066426555, -1094544057, 998835515, -1108137959) + W(8, 1027244587, 1045359897, -1093783038, 1045623937) + + W(9, -1119543359, 1037096144, -1117843291, -1101171319) + + W(10, 1051461624, -1102892249, 1026155597, -1114868339) + + W(11, 1031605777, 1022787365, -1100938466, 1041102940); + WS(1062840044, 1036517115); + sum1 = + W(0, 1027882709, 1024218619, -1088734638, 1057788973) + W(1, 1032695796, -1105941698, -1102360361, -1119309706) + + W(2, 1031157223, 1045291130, -1107257205, 1032367183) + W(3, 1037386637, 1051294017, -1082181941, 1057574554) + + W(4, 1039133128, 1015412087, 1026327034, -1105387538) + W(5, -1087289600, 1064725383, 1024151288, -1102302982) + + W(6, -1102333276, 1045232110, -1089919726, 1056789371) + W(7, -1131902346, 1046746652, 1042539613, 1042423170) + + W(8, -1088061047, 1052153154, 1045762482, -1110282969) + + W(9, -1113170154, -1107171938, -1126992520, -1124580994) + + W(10, -1130270357, -1116552186, -1117867630, 1042893141) + + W(11, -1098512042, -1109192172, 1047580087, 1032060742); + sum2 = W(0, -1128425377, -1106124336, -1106789449, -1116881359) + + W(1, -1108203604, -1154187588, 1027402769, -1123408727) + + W(2, 1046361983, 1040877836, 1041799035, 1037669599) + W(3, -1122701285, 1035952055, 1033758045, -1092736894) + + W(4, -1110885432, -1106801609, 1029460017, -1106291502) + + W(5, -1092942672, -1089281400, 1058715791, 1044648045) + + W(6, -1128656941, 1034330078, 1022825967, 1067937621) + + W(7, 1060265099, -1104725901, 1015114546, -1137130753) + + W(8, 1043050798, 1057367901, -1090127289, -1099584998) + + W(9, -1131912907, -1151273092, 1026393205, -1100743964) + + W(10, -1100147508, -1114467924, 1012677721, -1141059698) + + W(11, -1114857397, -1116376233, -1085394823, 1048436512); + WS(-1090906199, 1032077706); + sum1 = + W(0, -1133027020, -1114971356, 1042474992, -1109782777) + W(1, 1040233361, -1113511763, -1121893314, 1044790618) + + W(2, -1113284386, 1033127972, -1105262125, 1025873725) + + W(3, 1023318639, -1123234602, 1041326284, -1090554926) + W(4, 1034823031, 1011115622, 1029445080, 1040694938) + + W(5, -1105269270, 1053731809, -1109230339, -1129412204) + + W(6, 1001128051, 1035215242, -1090300845, 1054234875) + W(7, -1098565414, 1038160135, 1034316233, -1102125462) + + W(8, 1049843289, -1098556565, 1042417542, 1018477632) + + W(9, -1103958128, 1043268297, -1131346756, -1121911775) + + W(10, 1026215817, 1009497794, 1035906358, -1122145747) + + W(11, 1025511402, -1113919963, -1122686272, 998364239); + sum2 = W(0, 1010874613, 1030375188, -1115235366, 1049471257) + + W(1, -1100352469, 1040126787, 1031993168, -1098558104) + + W(2, 1051363302, -1094785947, 1040320218, -1131978284) + + W(3, -1110586713, -1116546039, 1056517150, 1031272431) + + W(4, -1111763071, -1124433226, 1035954309, -1089737673) + + W(5, 1057138262, -1102658594, 1043402933, 1027656919) + + W(6, 1034349301, -1094899703, -1098486858, -1112892354) + + W(7, 1057577914, -1092308561, -1122071401, 1053685859) + + W(8, -1093546729, 1046184196, 1039716432, -1116345243) + + W(9, -1140127141, -1108774266, 1034072089, -1109252950) + + W(10, -1122970680, 1016915650, 1029284667, -1124583674) + + W(11, -1122424073, 1037904141, 958822899, -1140678181); + WS(1065971990, -1117349785); + sum1 = + W(0, 1041698888, -1103591502, -1130045402, 1049080916) + W(1, 1009208654, 1021475879, -1112126136, 1043874709) + + W(2, 1044992637, 1047240445, -1121869537, -1134810027) + + W(3, 1034826515, -1101299034, -1083999976, 1060703412) + + W(4, -1123043996, -1144695867, -1129568652, -1186542860) + + W(5, -1081978560, 1061790267, 1028920692, 1017436104) + W(6, -1109843230, 1041410157, -1085461041, 1058214583) + + W(7, -1105683576, -1131209785, 1024013025, -1159955630) + + W(8, -1090063736, 1059365054, 1011681824, -1139574520) + W(9, 1009653886, 1030113747, -1097631850, 1049303674) + + W(10, -1125202109, 1000157667, -1137279078, -1120752640) + + W(11, -1094129699, 1052607100, 1021258909, 1022839599); + sum2 = W(0, -1117014919, -1073720352, -1104300581, 1055286111) + + W(1, -1105567211, -1108683793, -1130364155, -1086725672) + + W(2, -1091483554, -1109695767, 1032269150, 1033653176) + + W(3, -1106662873, 1069712606, 1061376514, -1114136197) + + W(4, -1138351682, -1115525434, -1114007102, 1062079613) + + W(5, 1060429625, 1052661025, 1018497014, 1043366723) + + W(6, 1049348603, -1102930718, -1098979910, -1131131469) + + W(7, 1032920333, -1107942477, -1111037227, 1020707077) + + W(8, -1091915359, 1050631696, -1117367449, -1139459182) + + W(9, 1016435713, -1114426132, 1043583392, -1112682766) + + W(10, -1122101547, -1122885189, 1035610526, 1034066723) + + W(11, -1091474650, -1112601210, 1039950258, 1026792554); + WS(-1087438700, -1079683283); + sum1 = + W(0, 1017584527, -1111085935, -1097724786, 1052950249) + W(1, -1112145065, 1032156829, -1126645293, -1110290014) + + W(2, -1098381907, 1053593812, -1106211842, -1129163939) + + W(3, 1024510860, 1033919541, -1083731542, 1063649365) + W(4, 1003633557, -1118260846, -1126938201, 1049726143) + + W(5, -1081500983, 1059087538, 1023563130, -1120786763) + W(6, 1025818403, 1042036038, -1097215121, 1052548297) + + W(7, 1019377518, -1116189667, -1163276521, -1114444262) + + W(8, -1091706404, 1057898452, -1104008328, 1023503580) + W(9, 1040771729, 1029908410, -1097070911, 1045403069) + + W(10, -1115067299, -1112674412, -1160528892, 1035428627) + + W(11, -1097940968, 1052829673, 1032435766, 1015355644); + sum2 = + W(0, 1027460995, -1139353737, -1116062036, -1105887481) + + W(1, 1043084390, -1112909236, -1126036613, -1172793556) + + W(2, 1041340702, 1031879973, -1108443334, -1144584219) + W(3, 1029366028, 1021322407, 1050063273, -1101108606) + + W(4, 1031078409, -1116288208, -1129309981, -1097919394) + + W(5, 1055277098, 1009470709, 1041616760, -1099143154) + W(6, 1020875062, -1121912528, -1106551211, 1047064096) + + W(7, -1107655532, -1100042276, 988377354, 1034370211) + W(8, 1041415105, 1034815104, 1018545561, -1108610892) + + W(9, -1109676838, -1137199485, -1128558209, 1034836242) + + W(10, 1014245687, -1111876576, 1030688918, -1107628664) + + W(11, -1134721053, 1049845283, -1104117922, -1123449114); + WS(1044595630, -1081949232); + sum1 = + W(0, 1039675598, -1112185757, -1088266627, -1103352647) + W(1, 1051863744, -1115854735, -1114551286, 1041771076) + + W(2, -1144202605, 1058269731, -1102436935, -1130126796) + + W(3, 1008233858, -1113654239, -1106609306, 1055957016) + W(4, 1041931682, 1017898629, -1121252161, 1036138408) + + W(5, -1087961804, 1060473075, -1105147684, 1041818984) + W(6, 1033942172, 1043328887, -1087619944, 1062639593) + + W(7, 1002098271, -1130413359, -1122512668, 1047911808) + + W(8, -1086197995, 1055667963, -1111264410, 1032948860) + W(9, 1026205083, 1028532559, -1087181441, 1042300482) + + W(10, 1038991809, -1115140949, -1118876117, 1051948425) + + W(11, -1079365891, 1051816684, 1047648830, 1035539513); + sum2 = + W(0, 1050752765, -1087877559, -1089125923, 1063798323) + W(1, 1013490077, -1098786735, -1102559074, 1042152886) + + W(2, 1035361880, 1052128007, -1090156566, 1029952535) + W(3, 1004621594, -1095393630, 1058416370, 1062325475) + + W(4, -1094287538, -1116454071, -1106905815, -1106434273) + + W(5, 1058355794, -1120474523, -1101206197, 1025568531) + W(6, 1038134564, -1099723068, 1056388755, 1051681161) + + W(7, -1100293430, 1009033997, -1114858390, 1036662936) + W(8, 1040360076, -1096401119, -1104699402, 997069429) + + W(9, 999530010, -1101776331, -1106345832, -1106373450) + + W(10, 1048788631, -1117506479, -1104442024, 1054232067) + + W(11, 1034476952, -1089943559, -1113690608, 1019208527); + WS(-1082323244, 1081334754); + sum1 = + W(0, 1017652669, -1114671162, 1045686283, -1100397239) + W(1, 1040334760, -1120290385, 1026074030, -1101582293) + + W(2, 1051997878, -1097273854, 1036251335, 1010893986) + W(3, 1026308835, -1102225205, 1056290627, -1091487775) + + W(4, 1044247257, -1114193219, -1139023631, -1128122150) + + W(5, -1109179969, 1033600923, 1034603313, 1015477828) + W(6, -1124784756, 1047028384, -1088067773, 1058585755) + + W(7, -1098471302, 1027532986, -1157466090, 1041367009) + + W(8, -1090935975, 1058457225, -1104671877, 1028455628) + + W(9, -1151223253, 1037350457, -1100014755, 1047302995) + + W(10, -1113240670, 1023216600, -1123067319, 1018518877) + + W(11, -1100605637, 1040259816, 1007040336, -1167442276); + sum2 = W(0, 1021161720, 1034310052, 1028060302, -1111691904) + + W(1, -1117456161, -1120681063, -1130912565, -1120070653) + + W(2, 1057895756, 1060473449, -1103940220, 1030806761) + W(3, -1130074229, 1013066141, 1050008660, 1048707954) + + W(4, 1041027109, -1131293055, -1117040706, -1097167140) + + W(5, -1077198236, -1071981659, -1101172514, 1009545637) + + W(6, 1025588007, -1126989997, 1036249174, 1055589119) + W(7, 1014637039, 1035622377, 1012731209, 1035986228) + + W(8, 1061480822, 1068029984, 1014223793, -1130249456) + W(9, -1117264939, 979500482, 1036420478, 1025639810) + + W(10, 1027808652, -1120874755, 1035821810, -1131150309) + + W(11, -1114248001, -1104930835, -1128414380, 1036288471); + WS(1053726551, 1012659382); + sum1 = W(0, 1032083097, -1106638998, -1098702088, 1047871676) + W(1, 998886703, 1022035144, -1115995457, 1034541187) + + W(2, -1098027112, 1032148771, 1042659740, -1112198366) + + W(3, 1025061558, -1115280977, -1088652495, 1060231518) + + W(4, -1106688851, 1034668492, -1122031383, -1104507249) + + W(5, -1092902123, 1065996118, -1104094145, 1024148149) + + W(6, 1038196358, -1114143426, -1085882325, 1058126194) + + W(7, -1102012910, 1010989620, -1115071689, 1029764374) + + W(8, -1097451113, 1059563219, -1121352461, 1012420282) + + W(9, -1130575936, 1031225348, -1098237300, 1035470703) + + W(10, -1128714910, -1123786037, -1113099877, -1102798468) + + W(11, -1111014420, 1054581342, 1000597622, 1024134712); + sum2 = W(0, -1124504165, 1043258069, -1119272862, -1120765402) + + W(1, -1132584009, -1130103221, 1044199209, -1105860909) + + W(2, -1096303760, 1027333462, -1112573193, 1030769098) + + W(3, -1105768285, -1149580326, 1030851358, -1110802573) + + W(4, 1028533186, -1111917317, 1030597508, 1054859448) + W(5, 1057797022, 1040041196, 1035436142, 1033418125) + + W(6, -1097181409, 1065166573, 1062380695, 1017534493) + + W(7, -1141430739, -1140263257, 1040834484, 1012576825) + + W(8, -1116955554, -1108797661, 1032147286, -1126074797) + + W(9, -1106395293, -1091772000, -1113754765, 1042765191) + + W(10, -1113752657, 1020067757, 1038991009, -1077787203) + + W(11, -1098893101, -1110880129, -1120959090, -1136443945); + WS(-1091585367, -1096979755); + sum1 = + W(0, -1125210148, -1104771642, -1104387016, 1039960904) + W(1, 1043768271, -1127914889, -1121704545, 1041680018) + + W(2, -1093500244, 1056326757, -1114046313, -1113011982) + + W(3, -1120024086, 1043362647, -1085845307, 1060708396) + + W(4, 1022927067, -1140249314, -1106223422, 1048656073) + + W(5, -1086139981, 1060053831, -1105827043, -1132509525) + W(6, 1027649645, 1038801018, 971788283, -1115241635) + + W(7, -1120254754, 1027284814, -1106879908, -1103521718) + + W(8, -1124812374, 1040958787, 1038747748, 1026834103) + W(9, 1033259600, -1106174833, 1011346436, 995843043) + + W(10, -1118768800, -1115807705, -1108105765, 1031226898) + + W(11, -1119913673, 1040930453, 1040461604, 1029803545); + sum2 = W(0, 1007158722, 1004004293, -1123076619, -1109929145) + + W(1, -1104848259, 1045822378, -1117465525, 1030693613) + + W(2, 1034532408, -1107544976, -1095482533, -1130708853) + + W(3, 1020157105, 1007550482, -1101572236, -1110988335) + + W(4, -1085485924, 1036333634, -1115575087, 1032793866) + + W(5, 1059720067, 1067665797, -1090269083, -1111111456) + + W(6, 1029731993, -1104867994, -1112732963, 1048427228) + + W(7, -1135504754, -1105802165, -1115951245, -1111503366) + + W(8, -1098900155, 1058832170, 1037004208, -1115747431) + + W(9, 1042169362, -1101768383, -1132362761, 1029991341) + + W(10, -1108400441, -1132122165, -1111020797, 1042858280) + + W(11, -1101011815, 1043396912, 1041064016, -1126685993); + WS(1050761175, 1067771859); + sum1 = + W(0, 1007679755, -1103008542, -1117542415, 1040506400) + W(1, -1107587308, -1123566389, 1016344868, 1051881455) + + W(2, -1099208581, 1050438683, -1138473483, 1035136294) + + W(3, -1111212068, -1113694143, -1094852820, 1036449755) + + W(4, -1102372368, -1110750261, 1035369236, 1057165115) + W(5, -1086714990, 1067282489, 1045850761, 1047098321) + + W(6, -1114152399, 1030154052, -1087862176, 1049754336) + + W(7, -1112794889, -1108921199, 1027679203, -1119705863) + + W(8, -1098820035, 1030273979, -1111030523, -1158006009) + + W(9, 1024513697, 1037582923, -1101037788, 1048082428) + + W(10, -1114576136, 1025557440, 1023429051, -1106945041) + + W(11, -1098056967, 1020854026, 1000524418, 1029171882); + sum2 = + W(0, -1108377721, 1042939389, -1118508723, -1101760284) + W(1, 1037932369, -1111488356, 1043256577, -1092756549) + + W(2, -1136988785, 1050996294, -1104406221, 1040203060) + + W(3, -1098471532, -1140040329, -1099870420, -1098704018) + + W(4, 1015984185, -1103619810, 1048495965, -1094992475) + W(5, 1064902851, 1062859454, -1098855018, 1045571731) + + W(6, -1103576309, 1017276157, 1045749581, -1089477514) + W(7, 1025174042, 1025902034, 1036658009, -1104050853) + + W(8, 1045838269, -1157061765, -1121418697, -1107737652) + + W(9, -1107738492, 1032200565, -1110226959, 1046491511) + + W(10, -1106492592, 1044444185, 1030436882, -1104348148) + + W(11, 1042649061, -1106567852, 1027657606, -1105647758); + WS(1057448172, 1069108917); + sum1 = + W(0, 1025232554, -1116799928, -1100727837, 1055215485) + + W(1, -1106508548, -1139419762, -1128422002, -1123655391) + + W(2, 1037047614, -1104723136, 1040448906, 1006660815) + W(3, 1032607415, -1111298160, -1102160962, 1056783106) + + W(4, -1103004521, 1016236833, -1106129908, -1119092894) + + W(5, 1036246919, -1165535249, 1040745899, -1123853933) + + W(6, -1141856298, 1044964179, -1088316592, 1049606186) + + W(7, -1132962087, 1016605067, 1015221011, -1128617181) + + W(8, -1116622467, 1044617768, -1103456342, -1160895193) + + W(9, 1010040610, -1116425884, 1027658969, -1132120236) + W(10, 1037741920, 1018376479, 1026592994, 1015937075) + + W(11, -1102536008, 1042573835, -1118303623, -1120915345); + sum2 = + W(0, -1128749003, 1042697161, -1101835107, 1038607216) + W(1, -1108371617, 1031384482, -1091479855, 1061865996) + + W(2, -1097573200, 1026943422, -1114744392, 1026017402) + + W(3, -1124909389, 1067634595, -1083343720, -1110364223) + + W(4, 1035072621, 1036186174, 1030767422, -1111988197) + + W(5, -1090130192, -1089515454, 1054823097, -1104718688) + + W(6, 1028475536, -1102439466, 1055493018, -1090714326) + + W(7, 1059932372, 1024781950, -1118686225, -1117920963) + + W(8, 1027292464, -1101900071, 1031097460, -1110105890) + W(9, -1133507353, 1022976741, 1030733458, 1033968573) + + W(10, -1132241300, 1040128898, 1003197653, 1008285339) + + W(11, 1002427213, 1033064671, -1101772178, 1026666744); + WS(1065065708, -1125796377); + sum1 = + W(0, -1112144555, -1106943759, 1017193539, 1048634147) + W(1, -1127916040, -1132404112, 1029634469, 1025116330) + + W(2, -1112668180, 1027133034, 1026809557, 1004217594) + + W(3, -1112840237, -1105630541, -1112954809, 1055950575) + + W(4, -1112907992, -1111964638, 1034269757, -1106751530) + + W(5, -1096457447, 1060800975, -1093799807, 1038388364) + + W(6, -1122801969, 1023923175, -1094266089, 1051425450) + + W(7, -1103940357, -1132895812, -1133240789, 1041797158) + + W(8, -1096385878, 1041695411, 1039766276, 1013909417) + W(9, 1016754760, -1113089188, -1106190977, 1044103184) + + W(10, -1130590086, 1032062573, -1119164014, -1130226634) + + W(11, -1114305030, 1036967948, 1008751883, 992673732); + sum2 = W(0, 1043431555, -1098806978, 1024222598, -1105154239) + W(1, 1031236307, 953732840, -1109692118, 1046643695) + + W(2, 1045861043, 1054740901, 1035789437, -1115663935) + + W(3, 1036275465, -1097975189, -1101643320, -1083291725) + + W(4, 1007109846, 1042301531, -1111890182, 1048664613) + W(5, 1058544270, 1068703829, -1081353417, 1035678115) + + W(6, -1102288351, 1049750262, -1098883379, -1080748028) + + W(7, 1031821902, -1120166561, 1045724738, -1098934938) + + W(8, 1049188212, 1058055770, -1100833476, 1047454611) + + W(9, -1109691788, 1032869755, -1107029975, -1100454574) + + W(10, 1051695731, -1096856793, 1007408138, -1111259526) + + W(11, 1048185689, -1148294292, -1114785167, 1041528279); + WS(1061652844, 1044003957); + sum1 = + W(0, -1118715405, 1022617806, 1044034950, -1101088515) + W(1, 1019688911, -1131961856, 1029075868, 1045689305) + + W(2, 1030904095, -1103346936, 1045834099, -1110934572) + + W(3, -1115471369, -1094261862, 1059625182, -1096538237) + + W(4, -1102841294, 1036052922, 1032954233, 1027529537) + W(5, 1057470859, -1086691558, 1041319556, -1148682371) + + W(6, 998963525, -1099266912, 1062131070, -1094363880) + W(7, -1166277444, 1017830866, -1111723799, 1045678528) + + W(8, -1098407445, -1105378993, 1028040508, -1109411965) + + W(9, 1036011862, -1119248992, 1047156095, -1123294521) + + W(10, -1135804811, 1030886475, -1152687195, -1108410990) + + W(11, 1037164834, 1016045215, -1106724595, -1123601124); + sum2 = W(0, -1123087716, -1115107680, 1039737456, 1045652727) + + W(1, -1106100707, -1128513463, -1122327585, -1105390433) + + W(2, -1106584843, -1139899009, -1102201417, -1114704327) + + W(3, 1034911826, 1034185422, 987338697, 1060423005) + W(4, -1111505321, 1009548801, -1115300382, 1042081129) + + W(5, -1094697399, -1103292099, -1094374885, 1026056400) + + W(6, -1147444258, 1036682846, 1048628369, -1079464406) + + W(7, 1066067653, -1112497116, 1031538244, 1043195731) + + W(8, -1100913302, -1102260713, 1062702469, -1107096307) + + W(9, -1122824244, -1112377777, 1041194171, -1101961861) + + W(10, 1013733313, -1125635761, 1026384688, 1024479380) + + W(11, 1036768370, -1106123677, 1034543612, 1037241080); + WS(1061983340, -1091535279); + sum1 = W(0, -1154828523, -1133965299, 1043906007, -1118138894) + + W(1, -1109842717, 1025343169, 1027504414, -1128653831) + + W(2, 1027190112, -1097538828, 1037523079, -1121887129) + + W(3, -1131271078, -1114200663, 1061948198, 1027560685) + + W(4, -1106988467, 1023298667, -1120408436, -1129743238) + + W(5, 1054216086, -1081158944, 1048594270, -1108007945) + + W(6, -1131629652, -1117839504, 1062537731, -1089869577) + + W(7, -1121464863, 1034422373, -1122568783, 1035797658) + + W(8, 1028696552, -1097887897, 1028427349, -1120763036) + + W(9, -1165314478, -1115205249, 1045640431, -1111951485) + + W(10, -1121440284, 1008081777, 995201141, 1019503421) + + W(11, 1044774081, -1105384996, -1119142300, -1122356070); + sum2 = W(0, 995087446, 1036608468, 965233164, 1033021468) + W(1, -1114419070, 1033025046, 1030495116, -1099055008) + + W(2, -1104807397, -1107407110, 1033869233, -1119280070) + + W(3, 1007114937, -1115487063, -1070882050, 1038417178) + + W(4, -1103406865, 1028798922, -1121939088, 1057848194) + + W(5, 1075270016, -1094462735, 1051754977, -1120762821) + + W(6, -1109334595, -1106051731, 1059573542, 1039375650) + + W(7, -1104596666, 1018124826, 1012755199, 1015526929) + W(8, -1102771000, -1124510890, 1028405316, 976567206) + + W(9, 1031009559, -1118519790, 1023903156, 1016192349) + + W(10, -1111745826, 1015800189, -1123906524, 1024955281) + + W(11, -1159976683, 1023974018, 955743793, -1129936862); + WS(1062927532, 1035014202); + sum1 = + W(0, 1039522007, -1114736246, 1037103646, -1104897563) + W(1, 1044380938, -1121785378, 1034505951, -1109500450) + + W(2, 1048942600, -1092956200, 1044086236, 1027254073) + W(3, 1040732909, 1011271190, 1053278895, -1091146839) + + W(4, 1044239087, -1145709740, 1002357921, 1044028441) + W(5, -1097469770, -1093973369, 1042916452, 981579331) + + W(6, 1016035605, 1050061010, -1085392865, 1051214559) + W(7, -1112456671, 1035761861, -1122944943, 1042353405) + + W(8, -1094832633, 1050975197, -1111813313, 1033165606) + W(9, 999726956, 1036129025, -1103977959, 1043068615) + + W(10, -1112116510, 1025151372, -1140151454, 1041525964) + + W(11, -1111797875, -1126246883, -1110444494, 1033358643); + sum2 = + W(0, 1038528863, -1084044031, -1082440456, 1050939225) + W(1, 1053868195, -1113963371, 1036214533, -1091834288) + + W(2, -1077502553, -1095085693, 1028074081, -1114781385) + + W(3, 1049223347, -1110305241, 1049812579, 1050231565) + W(4, 1046376147, 1035810200, -1113699843, 1042795689) + + W(5, 1068178608, 1060273714, -1132635925, -1160679206) + + W(6, 1041716852, 1050774414, -1092073446, -1115682722) + + W(7, -1098688235, 1036026944, -1100571883, 1043118649) + W(8, 1047476754, -1105112612, 1017697398, 1016345266) + + W(9, 1017295180, 1047177880, 1034666293, 1050691511) + W(10, -1092800689, 1040315316, -1101978327, 1050263507) + + W(11, 1054410728, -1101197699, -1104788145, -1112282035); + WS(-1086906028, 1058773265); + sum1 = W(0, -1132629757, 1044191380, 1032367334, -1096691584) + + W(1, -1152318558, -1109034905, 997844200, 1043197109) + W(2, 1050808506, -1095732027, 1042781664, 1031594505) + + W(3, 965362145, -1125429564, 1058285756, -1086608026) + + W(4, 1034636741, -1119832870, -1106996409, 1033453658) + + W(5, 1062016570, -1081591954, 1043388193, -1106441585) + + W(6, -1153797548, -1118095697, 1044397873, 1041881517) + + W(7, 1045470808, -1149103576, -1120050655, -1121403972) + + W(8, 1043993638, -1096430215, -1115428219, -1113585524) + + W(9, -1122322046, -1119804562, 1042486572, 1002316636) + + W(10, 1018594522, -1135705587, 1015091632, 1026125167) + + W(11, 1047754366, -1099777504, 1024196285, -1122333654); + sum2 = + W(0, 1048104076, -1096548381, -1107021820, 1018456960) + W(1, -1136070657, -1112321878, 1038532068, -1086001730) + + W(2, -1131935456, 1007620609, 1040453646, 1033875386) + W(3, -1129915388, -1083843015, 1060056432, 1033171254) + + W(4, -1111662792, -1117768272, -1101156186, 1035944594) + + W(5, 1066609131, 1050949241, -1110531416, 1032538050) + + W(6, -1128179824, -1102068111, 1027352212, -1107874139) + + W(7, -1104445548, -1114035189, -1128045264, 1044127780) + + W(8, 1048571914, -1104179329, -1127646596, 1032855260) + + W(9, -1131782160, -1114990278, -1120175088, 1038875644) + + W(10, -1110249452, -1144805954, -1109473444, 1041203218) + + W(11, 1038985844, -1112054433, 1034344442, -1130080864); + WS(1046014126, 1065769758); + sum1 = + W(0, 1012096182, -1121314108, -1091239207, 1052142286) + W(1, 1042130570, 1019346753, -1112076254, 1039437825) + + W(2, -1094624040, 1048611696, -1109865911, -1152131961) + + W(3, -1100987245, 1043473803, -1091961473, 1060125676) + + W(4, -1128757714, -1123465492, -1106802021, 1045721640) + + W(5, -1088552177, 1062377804, -1119711185, 1039063160) + + W(6, -1106286530, 1049347084, -1089539427, 1053897896) + + W(7, -1128945819, -1114302645, -1129503003, -1109380841) + + W(8, -1091526873, 1057150062, -1119080717, 1015225093) + W(9, 1021132153, 1049245244, -1091375076, 1048631067) + + W(10, 1034078686, -1135518836, -1112401299, -1120677869) + + W(11, -1088888106, 1057709495, -1122337355, 1014030866); + sum2 = + W(0, -1089976447, 1064913799, -1094573985, -1109226965) + W(1, 1030445629, -1115506338, -1078304891, 1068350548) + + W(2, 1019506715, -1120561974, 1021062218, 1018259030) + W(3, -1071851632, 1070575185, 1065710309, 1002672995) + + W(4, -1127826384, 1012290398, -1070679577, 1072673707) + W(5, 1065504629, -1098180006, 1031139735, 995896746) + + W(6, -1081022179, 1063744071, 1056839493, -1117214353) + + W(7, -1112765526, 1010152224, -1113339548, -1128451504) + + W(8, -1124929726, -1111255228, 1037321868, -1118014213) + + W(9, 1011136331, 1040942179, -1106886716, 1028658493) + W(10, -1127063938, 967860273, 1035458322, -1115281660) + + W(11, -1111465381, 1033265670, 1001938923, -1119523230); + WS(-1096468055, 1053785380); + sum1 = W(0, -1110473361, -1116957735, 1034879511, 1017136705) + + W(1, -1116669644, -1118632404, 1020813409, -1114360891) + + W(2, -1114475674, -1111337627, -1135792006, -1120549867) + + W(3, -1111899059, -1123200592, -1109008383, 1028379180) + + W(4, -1105125143, -1162426624, 1027946631, -1090968927) + + W(5, 1066746382, 1051825655, -1094808947, -1173354793) + + W(6, 1003556839, -1107232681, 1064704330, -1094442401) + + W(7, -1116312257, -1119514205, -1143096715, -1117882342) + + W(8, 1046069775, -1129057075, -1106172505, -1113957025) + + W(9, 996386562, -1118523124, 1042611044, -1114700263) + + W(10, -1135525501, -1130080208, -1123588698, -1105979736) + + W(11, 1040361862, 1022269000, -1106276184, -1123525720); + sum2 = + W(0, -1127419095, -1122531649, -1111543417, 1043407189) + W(1, 1013519927, -1134679399, -1140125367, 1025350612) + + W(2, -1108347637, 1028851928, -1117946771, 991440379) + W(3, 1028088432, -1123116186, -1101718819, 1048774619) + + W(4, 1041147594, -1127107007, -1126099139, 1020760995) + + W(5, 1056423339, -1086358248, -1112971994, -1115422093) + + W(6, -1114986450, 1019570567, 1073762237, -1076137651) + W(7, -1118107520, 1037345920, 1024738032, 1039021380) + + W(8, -1100544782, 1044261707, 1015761083, -1103403994) + + W(9, -1114843176, 1018690059, 1049061203, -1099227611) + + W(10, -1111772147, 1042824177, 1023949256, -1119198021) + + W(11, 1026425060, -1123270518, 1027419728, -1129333383); + WS(-1089097708, -1091261619); + sum1 = W(0, -1127316247, 1003986316, -1111263852, 1044425283) + + W(1, 1033605983, -1116984894, -1113526029, -1120011361) + + W(2, -1112997295, 1047767320, -1118942860, -1121673366) + + W(3, -1118797136, 1046355762, -1081822066, 1061869832) + + W(4, -1110810403, 1027944882, -1123552881, -1103137072) + + W(5, -1100403388, 1058200050, 1009152314, -1124559262) + + W(6, -1123795687, -1103576251, 1053114278, -1092855018) + + W(7, 1046189751, -1131347855, 1015138359, 1032220600) + + W(8, -1138618770, -1160534136, 1031283151, -1118591413) + + W(9, -1129675572, -1120446878, 1007314666, 1034662460) + + W(10, 1016196275, -1131488026, -1126584008, 1027028747) + + W(11, -1123471427, 1018063772, -1128724178, -1122517738); + sum2 = + W(0, -1151923233, 1040701127, -1110923755, -1103532415) + W(1, 1041909162, -1121169096, 1026311687, -1109901381) + + W(2, 1024679085, 1016651554, 1036375055, -1135341024) + W(3, 1025121279, 1034378939, -1080291839, -1082840291) + + W(4, -1110170843, 1041541680, -1123775834, -1092342947) + + W(5, 1071256357, 1066054209, -1090243220, -1128413506) + W(6, 1033596173, -1096202739, 1042190483, 1056834874) + + W(7, -1097275958, 1043004954, -1105542037, 1051958537) + + W(8, -1103925783, -1199035157, 1038401459, -1097944284) + + W(9, 1035290939, -1098166743, 1046386099, 1035522294) + + W(10, -1113079432, 1042529081, -1108107550, 1047977685) + + W(11, -1114731953, 1030555165, 1015019440, -1099750845); + WS(1061142188, 1045552914); + sum1 = + W(0, 1022384747, 1020461367, 1058732728, -1095805239) + W(1, -1101590238, 1033080372, 1019603337, -1114371061) + + W(2, 1054684529, -1098135841, -1123665301, 1031766591) + W(3, 992843677, -1137489184, 1060634392, -1085459239) + + W(4, 1027392977, -1123755612, 1025369499, -1128616851) + + W(5, 1056292747, -1081060320, -1124699057, -1116775033) + + W(6, -1149984013, -1114859644, 1061516204, -1083596540) + + W(7, 1038698931, 1034158665, 1030794181, -1134916072) + + W(8, 1058073341, -1097701630, -1106352164, -1134014242) + + W(9, -1123167236, -1114858116, 1052882077, 1026645922) + W(10, 1006025241, 1037240581, 1034453383, 1009189588) + + W(11, 1050605022, -1099032542, -1100750969, -1122655396); + sum2 = W(0, 1041010686, 1045355628, -1091459780, -1092997038) + + W(1, 1025085151, 1019331790, -1100296712, -1110840017) + + W(2, -1109934927, -1109499465, -1110570114, -1115246837) + + W(3, 1042377248, 1028443719, -1120459763, 1023984711) + + W(4, -1120816159, 1025130703, -1124701214, -1097271182) + + W(5, 1068946970, 1068602839, -1090645327, 1036287199) + W(6, 1002573079, -1108318217, 1048538630, 1049236461) + + W(7, 1036483715, 1028224647, 1026372231, 1034868187) + + W(8, -1095496747, -1112347607, -1110453128, -1106754238) + + W(9, -1107309152, 1032249619, -1112114883, -1088682480) + + W(10, -1121128467, 1040581836, 1022594646, 1034940919) + + W(11, -1096153349, 1036467963, -1105549173, -1106253388); + WS(-1090464684, 1058848194); + sum1 = W(0, 1038070654, 1035807069, 1059156269, -1091590511) + + W(1, 1049775661, -1111666744, -1104784595, -1106022588) + + W(2, 1027584334, -1104101108, -1100086527, -1128618637) + + W(3, -1140651524, -1107342224, 1060192817, -1084437581) + + W(4, 1050662239, -1128690758, 1048797564, -1112865880) + + W(5, 1062566262, -1088742755, 1037690576, -1097281200) + + W(6, -1115845272, -1102596230, 1060113046, -1087393870) + + W(7, 1050391262, 1024450616, -1115304422, -1117573217) + + W(8, 1043041013, -1095911543, -1117869728, -1151911514) + + W(9, 1022142646, 1011767229, 1054886405, -1102839322) + + W(10, 1042443855, -1131868338, 1026901973, -1105151431) + + W(11, 1057383999, -1088896680, 1039830925, -1104457275); + sum2 = + W(0, -1106952896, -1173421195, -1113206734, -1136957987) + + W(1, -1152575873, -1112584615, 1050458431, -1100970530) + + W(2, 1037511626, 1029901269, -1116273053, 1045345833) + + W(3, -1084179073, -1117103305, 1063723378, -1106205415) + + W(4, 1039247706, 1031320371, -1068828969, 1049093414) + W(5, 1078393261, -1105390455, 1034474614, -1099252776) + + W(6, -1082769727, 1015202727, 1065452472, -1128426057) + W(7, 1032907306, 1035573879, 1054525389, -1093960872) + + W(8, -1106048166, 993579659, -1100143257, 1040309898) + W(9, -1098029126, 1043872404, 1031385535, -1114758982) + + W(10, -1155923695, -1124055116, 1038352192, -1107157710) + + W(11, 1030855073, 1034755506, 1034533524, -1124561432); + WS(-1106782638, -1120193880); + sum1 = W(0, 1020741911, -1116040418, 1053259451, -1112821605) + + W(1, -1101282812, -1111424287, 1021367862, -1121939617) + + W(2, 1050945756, -1100446872, 1049499553, -1129092267) + + W(3, 1038644232, -1109539853, 1055524943, -1091353929) + + W(4, -1100504250, 1016236516, -1126436322, -1098608828) + + W(5, 1065255335, -1085596156, -1101475552, 1033532871) + + W(6, 1043522250, -1101880327, 1061719830, -1096552606) + W(7, 1025835692, 1022700239, -1112066734, 993980163) + + W(8, 1048874997, -1090468372, -1114054607, -1114668904) + + W(9, 1018349205, -1115252655, 1051405991, -1106280862) + + W(10, 1027947689, -1147278953, 1033129938, -1133833389) + + W(11, 1042923217, -1102788916, -1104899626, 1028803059); + sum2 = + W(0, -1113068388, -1115580494, 1039529972, -1091718951) + W(1, -1076395174, 1046645532, 1036673453, 1024834555) + + W(2, -1098466798, 1052150318, -1080701891, -1104586573) + + W(3, -1118880240, -1115483686, 1043501593, 1043613567) + W(4, 1068474066, 1009076111, 1028813378, -1117546792) + + W(5, -1115055672, 1062484975, 1066750300, -1093753132) + + W(6, -1107832014, 1043490929, -1117282076, 1045088246) + + W(7, -1097140180, 1036864955, 1027909744, -1105092918) + W(8, 1042504898, -1094456673, 1049333443, 1022104546) + + W(9, -1122240512, 1040415904, -1107365158, 1030923561) + + W(10, -1109881554, 1033514298, 1011592783, -1119502452) + + W(11, -1112704202, -1123953380, 1043999999, -1115391680); + WS(-1093231703, 1042706757); + sum1 = + W(0, 1032826937, 1040624182, 1058499572, -1084803183) + W(1, -1104136529, 1041579305, 1026075841, 1000558899) + + W(2, 1052553144, -1099119122, 1025447538, 1031885534) + W(3, 1032961819, -1110755278, 1061343357, -1083389465) + + W(4, -1114092422, 1032264780, 1036684171, -1127770315) + + W(5, 1062021249, -1081334022, -1112317122, 1018739433) + + W(6, 1034757510, -1106938311, 1060752603, -1087386813) + W(7, -1132554758, 1031902455, 1036416025, 1019575916) + + W(8, 1057695045, -1090036539, -1109030926, 1037874311) + + W(9, 1015758976, -1114624210, 1051786740, -1098198604) + W(10, 1012060669, 1027119072, 1040004261, 1042264396) + + W(11, 1058906011, -1088285503, -1096739300, 1035404188); + sum2 = + W(0, -1134545280, 1057942802, -1072425931, -1067197419) + W(1, 1049446840, 1074141781, -1101426979, 1047102485) + + W(2, -1084592242, -1071603316, 1042726179, 1060445087) + + W(3, 1012752443, 1055001204, -1079302223, -1077093049) + W(4, 1050812050, 1060645469, 1036306510, -1096203167) + + W(5, -1123894686, -1098326846, -1129334697, 1037955576) + + W(6, 1034320105, -1114902087, 1062181631, 1072541263) + + W(7, -1097319760, -1094473234, -1111393843, -1096420171) + + W(8, 1062084093, 1067609499, -1093274589, -1087350702) + W(9, 1046638158, -1101073471, 1064536824, 1073214169) + + W(10, 1001153868, -1085693573, -1108867307, -1091559913) + + W(11, 1073505700, 1078744623, -1094526709, -1077663090); + WS(-1075107862, 1049521772); + sum1 = W(0, 1027861131, 1045206278, -1086495609, 1051717721) + W(1, 1033503081, 1031434621, 987763517, 1041173528) + + W(2, -1097093508, 1049572700, -1116084523, -1144572069) + + W(3, -1129668766, 1032319275, -1086275954, 1055584810) + + W(4, 1009361560, -1140119493, 1033675992, 1040210256) + W(5, -1081944455, 1064397290, 995768539, 1027980366) + + W(6, 1016072268, 1041485791, -1082045908, 1059363461) + W(7, -1112276757, -1129633421, 992091051, 1044520444) + + W(8, -1096923684, 1055988184, -1112468587, 1024276072) + + W(9, 1026084697, 1042655839, -1093981119, 1051323143) + + W(10, 1005879363, 1000619058, -1120420163, -1112688453) + + W(11, -1094413520, 1050124978, 1033578820, 1025196738); + sum2 = + W(0, 1033523983, -1091543751, 1048034710, 1051542012) + W(1, 1024239879, 1041022978, -1107297920, -1125142534) + + W(2, 1031510683, -1103344470, -1117305947, -1121264057) + + W(3, -1109353447, -1100365589, 995045613, -1120961303) + + W(4, -1099173366, -1115033235, -1097553497, -1121112319) + + W(5, 1061520608, 1061214811, 1044020024, 1053722991) + W(6, -1102290887, -1119424675, 1042981818, -1094266425) + + W(7, -1093433218, -1097363289, 987526362, -1094244068) + W(8, -1103162896, 1043830132, 1046119446, 1047286054) + + W(9, 1022298470, 1033606211, 1052169844, 1041952964) + W(10, 1043499670, -1106943326, 944749371, -1100627225) + + W(11, -1098189213, 1041818078, -1096785580, 1031561067); + WS(-1097146583, -1102489480); + sum1 = W(0, -1121239074, -1102624204, 1041928668, 1043173384) + + W(1, -1118777253, 1016656554, 1035066361, 1033907292) + W(2, -1096659727, 1051162503, -1108685857, 995611334) + + W(3, -1110655283, -1104909116, -1123609439, 1057278053) + + W(4, -1102566959, 1009112868, 1032257412, -1109600459) + + W(5, -1091326393, 1050132159, -1100309385, 1037330963) + + W(6, 1020382076, -1113387282, -1105975127, 1049365769) + + W(7, -1101876333, -1111738159, 1014217354, -1114213060) + + W(8, -1098203983, 1049080395, 1040792061, 1033561904) + W(9, 1032256145, -1114763275, 1045101428, 1033542535) + + W(10, -1121020400, -1149295615, -1120529307, -1123950514) + + W(11, -1093952115, 1055699093, 1035959564, -1122689753); + sum2 = + W(0, 1030001048, 1039849292, -1106927121, 1046837828) + W(1, -1131959957, -1116147800, -1107119695, -1106305989) + + W(2, 1060202814, -1095733546, 1012779430, -1124391765) + W(3, 1023713698, 1019090837, -1104587624, 1043085465) + + W(4, 1026454649, 1028873647, -1115026335, 1035696383) + W(5, 1057308499, 1053508746, 1038120705, -1104339358) + + W(6, 1024715164, 1036481868, 1047684818, 1034862818) + W(7, 1037173687, 1045294658, -1112691697, 1023388499) + + W(8, -1112160637, 1046794790, -1101425448, -1119391248) + + W(9, 1024758511, -1146519572, -1093257675, -1094465043) + + W(10, 1036335613, -1156574008, -1147275412, -1112564365) + + W(11, 1041456307, -1083960309, -1094791365, 1012709310); + WS(1057303084, -1084740383); + sum1 = + W(0, 1025949163, -1105987664, 1034968156, -1097863693) + W(1, 1046214631, -1130932027, 1023904890, -1104417576) + + W(2, 1048292239, -1093717272, 1042713619, -1126920426) + + W(3, 1033327896, -1097440039, 1057303604, -1088500414) + W(4, 1043920086, 1012093510, 1022060320, -1106403568) + + W(5, -1134851644, 1058205452, 1041892896, 1040636140) + W(6, -1131905805, 1043670267, -1082452830, 1059877080) + + W(7, -1101986947, 1028551783, -1114170862, 1041763972) + + W(8, -1089247692, 1058731430, -1107457363, 1041063330) + W(9, 1021513971, 1037885311, -1093401571, 1046703382) + + W(10, -1110573172, -1143718184, -1109381346, 1019385429) + + W(11, -1097845612, 1049842950, 1031126152, 1016340900); + sum2 = + W(0, -1097593869, -1100989715, 1026566131, 1061153405) + W(1, 1050695083, -1095509343, 1040446621, 1036240143) + + W(2, -1100851860, 1047874592, -1096668864, 1040237386) + + W(3, -1107347821, -1105186205, 1046892012, -1103469514) + + W(4, -1104864053, -1114614656, 1036994425, -1119554977) + + W(5, 1069594194, 1074408805, -1103368475, 1040210470) + W(6, 989701019, 1048367016, -1107809286, -1110319007) + + W(7, -1100341899, -1105386934, 1043906150, -1095197585) + + W(8, 1031148367, -1079941721, -1084422687, 1031716423) + W(9, 1040271244, -1102913875, 1038853877, 1042791078) + + W(10, -1093040701, 1036206107, 1016581730, 1041272891) + + W(11, -1105136265, -1086296266, -1099178193, 1042594729); + WS(-1085311468, 1078025451); + sum1 = + W(0, -1114246985, 1033236492, -1126048573, 1051596674) + W(1, -1110129580, -1109388771, -1123523234, 1042717314) + + W(2, -1100167817, 1050764301, -1101525701, 1021849401) + + W(3, -1123774423, 1046675224, -1090923842, 1057423711) + W(4, -1102550347, 1031509177, 1017942127, 1030027079) + + W(5, 1002547123, -1138337956, -1117387765, -1126623147) + + W(6, 1018695644, -1107516674, 1061445386, -1085962671) + + W(7, 1045061525, -1118825262, -1134274761, -1105985470) + + W(8, 1051174149, -1101362115, 1037275627, -1107617348) + W(9, 973249598, -1118366597, 1032724353, -1098415672) + + W(10, 1033244340, -1124427728, 1032511109, -1108369993) + + W(11, 1047097650, -1105953621, 1025818592, -1115961017); + sum2 = + W(0, -1123353384, -1131031713, 1029311455, 1047725718) + W(1, 1051601031, -1113968956, 1030359787, -1114557735) + + W(2, -1123787418, 1042470619, -1121374979, 1045218010) + + W(3, 1024787123, -1125418898, -1099438470, -1106551206) + + W(4, 1049816965, 1044805763, 1015567503, -1132430472) + W(5, 1049323738, -1097880179, -1088308991, 1039658119) + + W(6, -1115408082, 1029672716, 1042547290, -1089568094) + + W(7, -1098255621, 1042126156, 1026077135, -1118070691) + + W(8, 1050505809, -1166364565, 1026888229, -1115384233) + + W(9, -1137211259, -1125125186, -1110579463, -1115324497) + + W(10, -1112338809, 1043221816, 1015951538, -1135395683) + + W(11, 1040847724, 1028809582, -1102185033, 1014731468); + WS(1060142060, 1042832150); + sum1 = + W(0, 1031397804, 1036648197, 1052129567, -1093104885) + W(1, -1125587404, 1030014814, -1121488955, -1142445829) + + W(2, 1051097024, -1094159296, -1138833071, 1024131190) + + W(3, 1033996248, -1117943062, 1054892021, -1086111346) + W(4, 1028704007, 1024270930, 1018827426, -1111782928) + + W(5, 1065668620, -1081757070, 1032794495, -1123778927) + + W(6, -1131717262, -1108508447, 1059881804, -1087336873) + + W(7, 1047817147, 1022586319, 1033609702, -1106903604) + + W(8, 1058770516, -1090845580, -1104469332, -1125662417) + + W(9, 1010765225, 1015606653, 1050176059, -1100487494) + W(10, 1038701961, 1032196289, 1029196868, -1115637854) + + W(11, 1054801908, -1126749404, -1091639031, 1019613157); + sum2 = + W(0, 1016709191, 1043282989, -1105914972, -1104055195) + W(1, -1113893232, 1031619176, 1013621039, -1105412866) + + W(2, 1048947993, 1038685325, -1143937773, -1128320153) + + W(3, -1134054043, 1034830675, -1104630078, -1084033248) + + W(4, -1103493551, 990218298, 1033829499, -1123744731) + + W(5, -1088942993, -1072142874, -1098435347, 1026126526) + + W(6, -1133247239, -1107183956, -1093767876, 1073971039) + + W(7, 1052470850, 1042783259, 1014723479, -1110083630) + W(8, 1055362845, 1076386430, -1104225446, -1103699955) + + W(9, 1025542948, -1115844306, -1111303066, -1098251720) + + W(10, 1051939911, -1123473137, -1113297030, -1097083153) + + W(11, 1064727508, -1090433741, -1091328171, 1025388740); + WS(-1086199532, 1054743650); + sum1 = W(0, 1034444474, 1032011277, 1048862696, -1097849454) + W(1, 1006964268, 1027368614, 1027498242, -1095519909) + + W(2, 1053262121, -1090625833, 1040908045, -1113781807) + + W(3, 1040848158, -1107222607, 1061389071, -1084999869) + + W(4, 1038795271, -1118338586, 1023783640, -1152811127) + + W(5, 1030342167, -1113365765, 1038235355, -1108967739) + W(6, 999869046, 1044283945, -1084989084, 1060145155) + + W(7, -1104327823, 1006059384, -1115850147, 1044573214) + + W(8, -1095010778, 1054594461, -1101807134, 1028815960) + + W(9, 1025498402, 1036275699, -1106712265, 1045643928) + + W(10, -1122717633, -1124545277, -1134397103, -1123084051) + + W(11, 1032418005, 1033574715, 1015954881, -1135640905); + sum2 = + W(0, -1098769930, 1042608106, -1101852353, -1093087039) + W(1, -1139600545, 1036192806, 1041383757, -1089209738) + + W(2, -1121408570, 1038811718, -1093098827, -1121276186) + + W(3, 1031909130, -1102323575, -1108783974, -1089123880) + + W(4, -1121335963, 1045867083, 1040055926, -1105226719) + W(5, 1065973699, 1069194195, -1098519743, 1023817866) + + W(6, -1112037460, -1124786133, 1049738412, 1026907074) + + W(7, -1089198426, 1042688929, 1040275414, -1117623756) + + W(8, 1057999228, -1106112227, -1101165651, -1122635193) + + W(9, -1111784639, -1131302943, -1111524780, 1020629449) + + W(10, -1109243346, 1041146873, -1113621249, 1048083051) + + W(11, 1025491254, -1107530612, 1048264427, -1095495518); + WS(-1090983255, -1089207473); + sum1 = + W(0, 1011536056, -1126565928, 1055178415, -1101680475) + W(1, -1102945718, 1026884961, 1031895551, -1113602338) + + W(2, 1054038520, -1097154360, -1121652462, 990918528) + + W(3, -1113368985, -1111099810, 1055473117, -1089575247) + W(4, 994604183, 1022227241, 1041335941, -1099647257) + + W(5, 1064470249, -1084973552, -1121284913, -1151944468) + + W(6, -1112820133, -1102367072, 1063942234, -1086493203) + + W(7, 1041044307, -1119623498, 1033755607, 1030939267) + W(8, 1050197537, -1097159533, -1111487017, 1029397803) + + W(9, -1120463213, -1111909392, 1058279198, -1096914715) + + W(10, 1017418960, -1127714823, 1029129223, 1034973975) + + W(11, 1042393881, -1096995926, -1111098786, 1024652821); + sum2 = W(0, 1008868714, -1138668162, 988655570, -1108603395) + W(1, 1033342078, 1018452757, 1000134020, 1023930211) + + W(2, -1099344177, 1041622837, 1025638720, -1115444075) + + W(3, -1131179173, -1108628571, -1064898888, -1131013053) + + W(4, -1133763810, 1023801183, 1026383992, -1114490385) + + W(5, -1066369231, -1087427617, 1033730604, -1118168395) + + W(6, -1108980541, 1047990867, 1075540559, -1095163420) + + W(7, -1117896039, 1033324797, 1033178726, 1030525898) + W(8, 1086324754, 1057379348, 1031531103, -1116567631) + + W(9, -1113100227, -1131668265, 1049763634, 1040828448) + + W(10, -1119632759, 1028372534, 1025874080, -1138114226) + + W(11, -1100090533, -1109206595, 1025251971, -1128577333); + WS(-1109283164, -1114463829); + sum1 = W(0, 1026307305, 1048505142, 1056046207, -1087851802) + W(1, -1097387850, 1043738183, 1010065376, 1006853751) + + W(2, 1051849183, -1096622464, 1034233556, 1033008793) + + W(3, 1036887575, -1122796048, 1060373686, -1086026376) + + W(4, -1106692609, 1030721871, 1032762791, -1121781501) + + W(5, 1062361681, -1080983673, -1116217316, 1031320492) + + W(6, 1038442146, -1106474773, 1060935143, -1086759863) + + W(7, -1136008963, 1024808165, 1036926348, -1140109366) + + W(8, 1058739944, -1088322398, -1111740214, 1037732587) + + W(9, 983730417, -1113784606, 1052729243, -1098544579) + W(10, 973353381, 1028455576, 1042339968, 1033209828) + + W(11, 1060958338, -1085562739, -1098996574, 1032429188); + sum2 = W(0, 1033103311, -1088826877, 1076551262, 1082157528) + + W(1, -1088761642, -1073488400, 1036675590, -1093870598) + + W(2, 1064863709, 1075036637, 1044533603, -1083381518) + W(3, 1035316039, -1096260803, 1066303868, 1074566779) + + W(4, -1088656095, -1087052440, -1139597621, 1038770367) + + W(5, 1054257493, 1054121358, -1096732938, 1034260530) + + W(6, -1104037187, -1120383141, -1086745184, -1075712309) + + W(7, 1026461691, 1055295113, 1036924272, 1054470917) + W(8, -1080791393, -1075955022, 1058516172, 1062460380) + + W(9, -1111374359, 1048854624, -1081541832, -1073360354) + + W(10, 1036676016, 1061463967, 1033604811, 1052968175) + + W(11, -1074269835, -1068055688, 1036957577, 1072405502); + WS(-1073690779, -1087724268); + sum1 = W(0, 1020006630, 1040645890, 1037569760, 1040537741) + W(1, -1102207443, 1011752087, 944113971, 1024788392) + + W(2, 1033313762, 1022063376, -1117962707, 1010250996) + W(3, 1028328440, 1048604230, 1026748704, 1037819609) + + W(4, 1018608989, 1035208397, 1026519064, -1124203663) + + W(5, -1097395091, -1081034849, 1030158086, -1107990331) + + W(6, 1023877839, 1026558293, 1058432566, -1089181115) + W(7, 1048090929, 1030700463, 1026744019, -1108217132) + + W(8, 1052406658, -1095782133, 1028902900, -1115106384) + + W(9, -1116930962, 1024907750, 1046357449, -1103915032) + + W(10, 1040820950, 1006665970, 1037411798, -1124509669) + + W(11, 1052615509, -1095058991, 1037074644, -1120315546); + sum2 = + W(0, 1036147454, 991782552, -1100036784, -1102354425) + W(1, -1132125723, 1037581214, -1115074830, 1025479068) + + W(2, -1096384442, 1031211776, -1114551496, -1107514244) + + W(3, -1143660011, -1111873890, 1042154750, -1098733186) + + W(4, -1120425773, 1036528495, -1109526737, 1054093522) + W(5, 1036720443, 1061883500, 1042458762, -1113752408) + + W(6, -1113309480, 1016478163, 1015496998, 1040999099) + W(7, -1118319659, -1131440878, 1006285882, 1035621794) + + W(8, -1111840809, -1099055155, 1021928735, 1009305230) + + W(9, -1115649745, 1027286665, 1028637267, -1117281017) + + W(10, -1113807339, -1115311515, 1026243607, -1108696429) + + W(11, 1024623035, -1120753705, 1033776741, -1117838632); + WS(1053167575, 1034582410); + sum1 = + W(0, 1023109013, -1135820801, -1107146278, 1042183330) + W(1, -1106326923, 1038375967, -1105499654, 1041430288) + + W(2, 1045138183, 1015167422, 1048594337, -1103059717) + W(3, 1047073940, -1099071824, 1006706653, -1110119411) + + W(4, -1101264321, 1036901240, -1103829756, 1051022760) + + W(5, -1098544246, -1114407921, 1042439875, 1019390619) + + W(6, -1134567319, -1103780951, 1035133548, 1029794991) + + W(7, -1115149997, -1122256838, 1029509866, 1038026111) + + W(8, -1101742889, 1025810371, -1124355817, 1039002364) + + W(9, -1107075490, -1144576488, 1040882462, 1020673517) + + W(10, -1133994400, -1113322768, 1028951523, 1034415069) + + W(11, -1110494113, -1144644710, 1017843520, 1025775953); + sum2 = W(0, 1007469645, -1127684796, 1026289720, -1134400734) + + W(1, -1121586613, 1012304630, 1024932078, -1122451669) + + W(2, 1029479215, -1114161855, 1018968072, 1018258842) + W(3, -1123529450, 934668744, 1048216767, -1092503803) + + W(4, 1055026065, -1105610792, -1106895484, 1046133075) + + W(5, -1101979386, -1118826374, 1057475450, -1091642753) + + W(6, -1154152567, 1050482770, -1086100405, 1054881826) + + W(7, 1057991283, -1094138317, 1026396887, -1100501045) + + W(8, -1104578417, 1054831843, 1037697257, -1097381938) + + W(9, 1034932657, -1112663810, -1110628430, 1037309396) + + W(10, 1041220013, -1108645190, -1118589447, -1145059796) + + W(11, -1120799353, 1034243151, 1035239909, -1109776821); + WS(1065106092, 1009251236); + sum1 = W(0, -1127594260, -1119086128, -1106710454, 1041658930) + W(1, 1028936149, 999711717, 1015119794, 1041681344) + + W(2, -1108480942, 1053952044, -1098626929, -1128362792) + + W(3, -1105935716, 1038033220, -1085761952, 1059673337) + + W(4, -1106493133, 1030156593, 1030756271, -1103164984) + + W(5, 1048660750, 1035410928, 1042075767, -1105711219) + + W(6, 1015463627, -1097628571, 1062385221, -1083076739) + + W(7, 1048795361, -1109139763, 1033714469, -1096661826) + + W(8, 1057312254, -1097132616, 1042769246, -1109546740) + + W(9, -1121831017, -1162082196, 1045270286, -1100422942) + + W(10, 1033263484, -1128821631, 1032817313, 1037645501) + + W(11, 1038003425, -1134248242, -1109564844, -1113038632); + sum2 = + W(0, 1026504012, -1111982251, -1115575890, 1025515301) + W(1, 1038047283, -1121134093, -1115537349, -1109318355) + + W(2, 1037274256, 1036029355, -1140512157, -1118959675) + + W(3, 1004448402, -1126991046, 1032461625, -1105715099) + W(4, 1031934837, 966777949, -1120289237, -1114485349) + + W(5, 1046084064, 1035923056, -1127252256, 1001443794) + W(6, -1116193727, 1031030421, -1104386736, 1039615788) + + W(7, 1008094609, -1126229172, 1023273402, 1036795295) + W(8, 1033981186, 1034803763, -1108137243, 999509622) + + W(9, -1106169890, 1038895038, 1034486696, -1111316562) + + W(10, 1013721630, -1115420717, -1116296115, 1037382021) + + W(11, 1014573341, -1126611440, -1109430807, -1121268263); + WS(1058235500, 1054922309); + sum1 = W(0, -1126843838, -1110452882, -1096439037, 1054965252) + + W(1, -1126708475, -1113819273, -1115091447, 1026999796) + + W(2, -1109530936, 1035486938, 1040994960, -1112039092) + + W(3, 1037063794, 1027596138, -1126567064, 1052521111) + W(4, 1048136923, 1029145158, -1097782353, 1043595317) + + W(5, -1080972858, 1054616871, -1135709192, -1103625129) + + W(6, 1017345397, 1026915457, -1087153329, 1059777872) + + W(7, -1117730271, -1113712109, -1106496120, 1051692426) + + W(8, -1092439359, 1055199219, 1025849689, -1133876016) + + W(9, -1124168315, 1033470169, -1096481402, 1049045985) + + W(10, -1109862614, -1120397392, -1111050604, 1047889704) + + W(11, -1101856358, 1042302776, 1048178521, 1018059916); + sum2 = + W(0, 1032658614, -1104671284, 1033357456, -1107649550) + W(1, -1107785448, 1014985523, 1026047005, 1026757765) + + W(2, -1146410551, -1093450531, 1045006287, -1108588814) + + W(3, 1016793814, -1106565422, -1129670058, 1029536101) + W(4, 1032863350, -1114405495, 979115576, 1040092458) + + W(5, 1049738304, 1048902638, 1031141497, 1032866808) + W(6, 1025048255, -1118382609, 1047130549, 1043845633) + + W(7, 1024835039, -1128051766, -1120340424, 1024555245) + W(8, -1099524683, 1031379649, 1016575718, 1011865867) + + W(9, -1124528004, -1115048442, -1114147283, 1015256822) + + W(10, -1115840886, 1016407002, -1113479651, -1102456829) + + W(11, -1143577495, 1032535412, -1140327483, -1121997281); + WS(1050344663, 1040331465); + sum1 = + W(0, -1119034750, -1123846924, 1038870821, 1016005498) + W(1, -1113185550, -1180899430, 1027008397, 1032620906) + + W(2, -1145305726, -1104369525, 1047408652, -1117862216) + + W(3, -1123135107, -1107606109, 1045963311, -1101093248) + + W(4, -1106188838, 1031141157, 1034001074, -1113228665) + W(5, 1055978044, -1091899011, 1019406818, 1025902913) + + W(6, -1165785906, -1104523524, 1061494191, -1089807144) + + W(7, -1133495032, 995937181, -1109811775, 1044228977) + W(8, 994921841, -1100340494, 1039673315, -1126170822) + + W(9, 1012082163, -1136436803, 1043858443, -1113047285) + + W(10, 1003314783, -1155810234, 1021442477, 1015486907) + + W(11, 1032566715, -1121306753, -1110918342, 1012720916); + sum2 = W(0, 1017323653, 1006857268, 1027026905, -1096858156) + W(1, 1057582691, -1108630874, 983063098, 1027629321) + + W(2, 1041250623, -1096058068, 1069736593, -1103954988) + + W(3, -1124332548, 1040636195, -1098379711, -1081757810) + + W(4, -1098564102, 1039138402, -1136855038, 1050922570) + + W(5, -1095854749, 1046692173, -1092586095, 1040290673) + + W(6, 1038193266, -1107256285, -1124475180, 1055388353) + + W(7, -1101296593, 1026430908, -1115428487, 1024268384) + + W(8, -1107079153, 1044471504, -1099842491, -1135051275) + + W(9, 1037749325, -1105738834, 1035306909, 1018283467) + + W(10, -1130236866, -1127494735, -1162541650, -1112368096) + + W(11, 1041041721, 1034757871, -1116072515, -1128054004); + WS(1064629676, -1098084920); + sum1 = + W(0, 1033302207, 1017516913, 1037844037, 1004101612) + W(1, -1100831258, 1023773169, 1017176603, 986968687) + + W(2, 1048067236, -1094217842, 1032944847, 1036346276) + W(3, 1043155505, -1093133598, 1059745345, -1107275372) + + W(4, -1118901210, -1109611315, 1036523218, -1136867787) + + W(5, 1054752956, -1083111259, -1111571193, 1036061697) + + W(6, -1135635048, -1099849236, 1054803234, 1036740290) + + W(7, -1104247276, -1130856180, 1036902751, -1112073298) + + W(8, 1049105955, -1089373007, 1044914424, -1178541510) + W(9, -1154473427, 1015173986, 1045303547, 1007182507) + + W(10, 1032262742, 1028817260, 1031815708, -1108314079) + + W(11, 1049045791, -1096296960, 1028425028, -1121119813); + sum2 = W(0, 1031116538, -1106561538, 1041324255, -1097318271) + W(1, 1038093550, 1003684433, 1018758860, 1041892626) + + W(2, -1122918288, 1050772655, -1113042451, 1005733025) + + W(3, -1093507837, 1060901401, -1090730175, -1089173269) + + W(4, -1103574570, 1036702490, -1142239225, -1094547881) + + W(5, 1059998586, 1050575163, -1096117806, 1007559836) + + W(6, 1008547208, 1048344650, -1105692057, -1105982083) + + W(7, 1045224094, -1111284039, -1115133937, -1106548880) + + W(8, -1107738784, 1062167006, -1093777588, 1032209739) + + W(9, 1037272918, 1031802380, -1109731964, -1115007264) + + W(10, 1040225760, -1119496571, -1116833334, 1032935937) + + W(11, -1105354579, 1051274636, -1097190188, 1039213738); + WS(1059570988, -1104849743); + sum1 = W(0, 1015935639, -1105217736, -1100062838, 1055580097) + + W(1, -1114680436, 1027695934, -1114327981, -1117057793) + + W(2, -1095539196, 1051203348, -1104422643, -1122995670) + + W(3, 1032097032, 1045549308, -1097913193, 1057098153) + W(4, 1035503236, 1026067698, -1100671580, 994695167) + + W(5, -1081463016, 1065307314, -1100709080, -1115820943) + + W(6, -1118415719, 1019924475, -1088685699, 1060408535) + + W(7, -1100882497, -1121911751, -1146837726, 1044124420) + + W(8, -1103538521, 1060044676, -1127513406, 1040976712) + + W(9, -1128662677, -1133264506, -1090424260, 1048658511) + + W(10, -1106885414, -1109730008, -1106017873, 1026902699) + + W(11, -1096642336, 1058793797, -1112552037, 1032897105); + sum2 = + W(0, -1101738300, -1102635520, 1049960021, -1107186076) + W(1, 1031463651, -1109595133, 1026251680, 1042860418) + + W(2, 1045813894, 1037904592, 1043360780, 1032162510) + W(3, -1096487254, -1118004862, 1012147620, -1101520598) + + W(4, -1099464580, -1144663840, -1097132336, -1097577131) + + W(5, 1062244087, 1050699569, 1042220045, 1017587638) + W(6, -1103125896, 1034939290, 1030928730, -1118944274) + + W(7, -1129575892, -1122088198, -1098301296, -1107323885) + + W(8, 1018590462, 996952385, -1143727552, -1112243029) + W(9, -1145491968, 1046219299, 1042676852, -1132230456) + + W(10, 1038679603, 1028948530, -1102991820, -1101571742) + + W(11, 1048890187, -1120981264, 1022002534, -1108091801); + WS(-1095386967, -1111219145); + sum1 = + W(0, 989878260, 1046105185, 1042696371, -1089927208) + W(1, -1127509006, 1030962098, -1130549149, -1114353482) + + W(2, 1044731284, -1092958347, 1029760895, 1015099027) + W(3, 1027494660, -1126247292, 1059356463, -1090136954) + + W(4, -1123276603, 1002268463, 1027516453, -1101798869) + + W(5, 1066759339, -1086407791, -1134143337, 1008759050) + + W(6, -1138329195, -1109199416, 1060963410, -1086208082) + + W(7, 1037957160, 1030926587, 1029536895, -1149170463) + W(8, 1056388995, -1087382795, 1028489291, 1024487352) + + W(9, 1016226972, -1110945897, 1052477254, -1099705531) + W(10, 1033794703, 1027177352, 1031794584, 1041043200) + + W(11, 1048385630, -1090430272, -1116367629, -1155852515); + sum2 = W(0, 1037152773, -1107393101, -1107499267, -1071982339) + + W(1, 1050177526, 1034063245, -1155239869, -1118272906) + + W(2, -1123365743, -1066777138, -1099174901, -1111285661) + + W(3, -1110337901, -1121008946, 1053226346, 1065602467) + + W(4, -1114100047, -1111810642, 1031799544, 1040803769) + + W(5, -1091451910, 1078719649, 1051522302, 1032887971) + W(6, -1115579003, 1040826838, 1036591998, 1072207876) + + W(7, -1112448128, -1105619991, 1027082675, -1129277077) + W(8, 984589146, 1012365693, 1036247818, 1027337883) + + W(9, -1125050611, 1044810576, -1111221822, -1114663567) + + W(10, 1024897040, -1128259763, 1027786160, -1128372019) + + W(11, -1115106721, 1027240586, 1010421237, -1110086921); + WS(-1090330604, -1095913405); + sum1 = + W(0, 1020138108, -1155846064, -1089580553, 1060107168) + W(1, 1026904097, -1129005794, -1123891981, -1158857313) + + W(2, -1099259748, 1041623909, 1034391623, 1027969480) + W(3, 1027835331, 1042832881, -1086143680, 1061453552) + + W(4, -1115844409, -1126805065, -1104251929, 1026174194) + + W(5, -1083565678, 1065434151, -1108664129, 1015124739) + W(6, 1036891437, 1041459232, -1087459168, 1058328348) + + W(7, -1103857816, -1133565543, -1115340623, -1107002233) + + W(8, -1094838563, 1058061687, -1108388469, 1018898230) + W(9, 1034060158, 1043482052, -1096454718, 1046178603) + + W(10, -1124051644, -1128371111, -1111402939, -1101325435) + + W(11, -1097944271, 1056232524, -1124315511, 1016813002); + sum2 = W(0, -1123501879, 1032645553, 1031823713, 1073269342) + W(1, 1039470942, -1134706270, 994818552, -1106534525) + + W(2, 1055123028, 1086127434, -1106004733, -1108902493) + + W(3, 1024190209, 1041404870, 1003420836, -1097366650) + + W(4, 1048036108, -1131894299, 1026428551, -1104982451) + + W(5, -1080276792, -1064048639, 1029604730, 1040747994) + + W(6, -1113685733, 1042593674, -1127504591, -1073275019) + + W(7, -1102930579, -1114192145, 1033345966, -1115833227) + + W(8, 1051480126, -1090368136, -1127043711, 1028687353) + + W(9, -1113104927, 1034301013, -1116624943, 1039074558) + + W(10, 1016207563, -1110363669, 1032770548, 1019409377) + + W(11, 1017007809, -1104405577, 1023925896, 1028902826); + WS(-1090401964, -1152005757); + sum1 = W(0, -1107975723, -1110378885, -1108756369, 1036253290) + + W(1, -1114963960, -1113670180, 1027213860, -1114833045) + + W(2, -1095679285, -1126602324, 1031108853, -1122691487) + + W(3, -1098681011, -1110030634, -1106296032, 1055690689) + + W(4, -1100045596, -1107558750, 1041527967, -1088517567) + + W(5, 1070380432, 1071039479, -1089232274, 1041737494) + + W(6, -1104614908, -1108968043, -1108442736, 1052643167) + + W(7, -1099409217, -1114805320, -1117487349, -1117626874) + + W(8, -1098750614, 1027420045, -1149243844, -1114809497) + + W(9, -1139447119, 1013150495, -1103582017, 1037720897) + + W(10, -1112117145, -1129003237, -1114124023, -1107640642) + + W(11, -1109258534, 1028231256, 1004205268, -1115685308); + sum2 = + W(0, 1032241318, -1104603794, -1110024851, 1040884292) + W(1, -1102517567, 1041491703, -1099535875, 1042476400) + + W(2, 1036274242, -1098717699, 1017815860, -1106264274) + + W(3, 1055385702, -1090035137, -1088795135, 1054345172) + + W(4, -1094964358, 1050847172, -1088862448, 1058560544) + W(5, 1070638870, 1049287225, 1049908300, -1097728340) + + W(6, 1049303281, -1088861159, -1093985609, 1045145516) + + W(7, -1104972980, -1120926078, -1109469239, 1052772694) + + W(8, -1106832655, 1028821082, -1121780800, 1040141480) + + W(9, -1107728961, -1098593341, 1040915158, -1095210561) + + W(10, 1046695263, -1097969166, -1128383244, 1040732759) + + W(11, -1094544594, 1053404675, -1097835418, 1042680505); + WS(-1070853435, -1079594702); + sum1 = W(0, 1031368074, 1015638464, -1114370347, -1115839497) + + W(1, -1115223191, 1032466078, -1129832370, 1041167744) + + W(2, -1117069532, -1102391672, 1027397066, 1017764904) + + W(3, 1034753191, 1035847262, -1123068615, -1103157041) + + W(4, -1112317379, 1032880216, 1015854174, -1103546680) + + W(5, 1064504443, -1091637800, -1115479934, -1129698458) + + W(6, 1034404179, -1113675090, 1061831318, -1080200908) + W(7, 1034003429, 1015162251, 1016952500, 1024462894) + + W(8, 1053421228, -1096184888, 1024063661, -1140051844) + + W(9, -1121119193, 1024493276, 1039689052, -1127920108) + + W(10, 1021986479, -1133040549, 1030231874, -1128491667) + + W(11, 1047845552, -1114780422, -1108195108, -1121925385); + sum2 = + W(0, -1106137478, -1112484873, 1057355655, 1035747177) + W(1, -1121112608, -1111886750, 1043473407, -1102332364) + + W(2, -1095817987, -1115086293, -1132505032, 1028632460) + + W(3, -1106937584, -1092913054, 1065744344, 1023360745) + + W(4, -1113186427, -1106034045, 1026389244, -1107744995) + + W(5, 1065853704, 1072123343, -1092294539, 1034294011) + + W(6, -1112665680, -1097742336, -1081387458, -1079419356) + + W(7, -1121542644, 1024287965, 1037682857, 1043622402) + W(8, -1127502696, -1106562006, 1037780507, 1025382780) + + W(9, -1122471729, 1020098037, -1107102958, -1106082519) + + W(10, 1042075138, 1002478149, -1132137458, 1022975237) + + W(11, -1141866869, -1126279403, 1036152561, -1184105122); + WS(1049779927, -1112776705); + sum1 = + W(0, 1028071903, -1118237477, -1102803275, 1029391902) + W(1, 1034486619, -1146402448, -1114011991, 1043483133) + + W(2, -1098367878, -1104983021, 1030141823, 1024272361) + W(3, 1029458468, 1007633232, -1088820906, 1052808064) + + W(4, 1041927295, -1136262168, -1119065733, 1035764138) + + W(5, -1094340312, 1066199650, 1028311666, -1116603171) + + W(6, -1132325110, 1035328577, -1080604425, 1053987355) + W(7, -1120802495, 1022508086, 1021654911, 1034435922) + + W(8, -1090240908, 1056392483, 1033716813, -1120600656) + + W(9, -1140102008, -1138188744, -1148292210, 1036299814) + + W(10, -1137351220, -1178578023, -1114327724, -1122000063) + + W(11, -1113705707, 1048826612, 1019304377, 1020743116); + sum2 = + W(0, 1032570045, 1038214390, -1105258373, 1049712324) + W(1, -1104412018, -1123221706, -1105084280, 1026252154) + + W(2, 1013797397, -1092505394, -1106628914, 1042796766) + W(3, 1038138439, 1040403525, -1089116471, 1060934721) + + W(4, -1095609080, 997194667, -1106537061, -1094267982) + W(5, 1076181184, 1059180753, -1100140938, 1031304969) + + W(6, 1040196930, -1111441511, -1077048432, -1094660144) + + W(7, -1105239307, 1025898916, -1115643975, -1113353460) + + W(8, 1025617857, -1116351798, 1035183993, -1113508292) + + W(9, 1030892929, 1041615042, -1099622062, -1112051433) + + W(10, -1108612586, 1036578837, -1115802712, 1045634969) + + W(11, 1030853641, 1036834683, -1126459673, -1114596985); + WS(1046079918, -1101410372); + sum1 = + W(0, -1119247786, -1128322399, 1042510685, 1040172212) + W(1, -1102544268, -1115138862, 1028420729, 1041896248) + + W(2, 1041276767, 1029165630, 1023180436, 1035447066) + W(3, -1112243383, -1105916230, 1052547749, -1093769957) + + W(4, -1094151845, -1116787216, 992275696, 1048641796) + W(5, 1049660162, -1086983984, 1051181214, -1126725978) + + W(6, -1122025413, -1106854731, 1058242473, -1090223605) + + W(7, 1034028133, 1020616971, -1106451742, 1031954663) + W(8, 1042746961, -1101840568, 1035662026, -1106918309) + + W(9, 1031954516, 1008473970, 1045913078, -1131429676) + + W(10, -1136064862, 1031591591, -1132155589, -1111364501) + + W(11, 1038481040, 1034663574, -1123376855, -1113758304); + sum2 = W(0, -1141998719, -1109775790, 1044487768, -1123003936) + + W(1, -1128896096, -1116651188, -1145824639, -1114337335) + + W(2, 1032184652, -1105393491, -1105870753, 1028260552) + + W(3, 1031031156, 1035421278, -1118695686, 1043275908) + + W(4, -1123077850, -1117301622, 1020781312, -1094152732) + + W(5, 1023745864, 1060925239, -1116720242, -1118185274) + W(6, 1022361784, 1019796096, 1018742928, 1035441608) + + W(7, 1005384511, -1111756371, 1035727822, -1109500163) + + W(8, 1044822196, -1129786704, -1106753069, 1028382728) + + W(9, -1106658345, -1126048860, 1018234504, -1154747838) + + W(10, -1109895735, -1112885074, 1018984000, -1133379360) + + W(11, 1040264262, -1114483694, -1115363912, 1013789936); + WS(1065850966, 1065849900); + sum1 = + W(0, -1148044715, 1023026535, -1096615656, 1051437895) + W(1, 1037565454, 1009078433, 1016251913, 1037817733) + + W(2, -1090259708, 1044690723, 1031445334, -1134993406) + + W(3, -1121600570, 1025496281, -1086496425, 1060547800) + + W(4, -1123828273, -1122338716, -1122606683, 1030608138) + + W(5, -1089114938, 1067874188, -1103278290, 961099943) + W(6, -1119487441, 1035148220, -1087399018, 1061971613) + + W(7, -1103477215, -1115158089, -1123929445, 1038603949) + + W(8, -1089721837, 1051923078, 1017932657, -1152593000) + W(9, 1022387720, 1040789578, -1091666965, 1020371139) + + W(10, 1017045638, 1017681054, -1113618935, 1029056085) + + W(11, -1090055623, 1050691807, 1041207209, 1032486406); + sum2 = W(0, 1035054009, 1029203106, -1095822387, -1096883389) + + W(1, -1106861506, 1003858895, -1100085534, 1055497340) + + W(2, -1094806083, 1022251406, 1025821768, -1141198631) + + W(3, 1050236106, -1099101530, -1112580467, -1105263591) + + W(4, -1099047212, 1038164225, -1106312974, -1091493710) + + W(5, 1065636371, 1066985993, -1090221894, 1007864647) + W(6, 1040394388, 1035688516, 1057422694, 1050729384) + + W(7, 1040303734, -1131632326, -1111006317, -1100130836) + + W(8, 1038056034, -1113669663, -1095697855, 1034223408) + + W(9, -1122528690, 1051271785, -1090043318, -1109365057) + + W(10, -1132012078, 1022279531, -1120327060, 1037370697) + + W(11, -1101753600, -1098907474, 1042447412, -1111449439); + WS(-1097113303, -1098536273); + sum1 = + W(0, -1128711506, 1026190055, -1089449919, 1051085133) + W(1, 1039600836, 1017357112, 1001100740, -1129782332) + + W(2, -1090119792, 1054274400, 1006971045, -1151099700) + + W(3, -1116245678, 1036959597, -1089233276, 1059231684) + W(4, 1035061810, 1008174399, -1123204686, 1010531062) + + W(5, -1088111001, 1068549146, -1106500579, 1027830380) + + W(6, -1122390725, 1040533155, -1083999320, 1060528017) + W(7, -1110173729, -1118330949, 973480529, 1032146359) + + W(8, -1100399617, 1051645044, -1118570949, -1138008953) + + W(9, -1135175840, 1016950072, -1096337083, 1021720363) + + W(10, -1105366950, -1113983621, -1112078369, -1115082484) + + W(11, -1098983064, 1056811397, -1163217111, -1114515356); + sum2 = W(0, -1126544110, 1057867675, -1084782762, -1101472514) + + W(1, 1046930113, 1047938716, -1106788080, 1045040387) + + W(2, -1103936041, -1095964817, 1060484868, -1116398073) + + W(3, -1123763395, -1116688865, -1096694543, 1033632512) + + W(4, -1098897900, 1033301960, 1031886252, 1008770068) + W(5, 1065118928, 1070094219, 1055777327, -1112910333) + + W(6, 1019879781, -1111977015, -1120781351, -1093909441) + + W(7, -1105350592, -1132175940, -1106896864, -1104133845) + + W(8, -1094413904, -1091348732, -1098592917, 1028498658) + + W(9, 1025236903, -1123575137, 1055216743, -1087869152) + + W(10, 1032159773, -1111429301, -1103198659, -1095297610) + + W(11, 1063595180, -1101379604, -1090856164, -1148399072); + WS(-1088872108, 1052196610); + sum1 = W(0, -1115772244, -1114837443, 1040729928, 999143576) + + W(1, 1035543595, -1109636323, 1026268067, -1111544357) + + W(2, -1129315660, 1051137549, -1115388138, -1138847608) + + W(3, 1022683057, -1104977249, 1050293045, 1050616762) + + W(4, -1110255664, -1148093909, -1119255225, -1110507588) + + W(5, -1115663356, -1123488747, -1102766242, -1113579532) + + W(6, -1126845407, -1124752108, 1055556797, -1107532492) + + W(7, -1115121626, 1031428336, 1018606696, -1106979958) + + W(8, 1038400791, -1115698508, -1111362474, -1123058305) + + W(9, -1122729971, -1118779367, 1043464385, -1106851872) + + W(10, -1114761165, 1024891874, -1119390253, 1032957370) + + W(11, 1010467373, 1013947482, -1127308771, -1117161611); + sum2 = + W(0, 1021571414, -1136485425, 1033792089, 1044650880) + W(1, -1111938281, -1111133361, 1005045849, -1108696907) + + W(2, 1026572719, 1068805535, 1042295210, 1015874538) + W(3, 1032761087, 1015124882, -1097148617, 1072674603) + + W(4, 1053858128, -1115667125, -1131955840, -1109877489) + + W(5, -1072841573, -1073632622, -1114078156, 1025743417) + W(6, 1002892889, 1050593712, 1051731235, 1040667946) + + W(7, 986622244, 1029743517, -1113636159, -1105061066) + + W(8, 1040799594, -1114163718, -1105514756, -1150165522) + W(9, 1017257782, 1027289415, 1025178361, 1033059623) + + W(10, -1131411966, 1028606721, -1116947723, 1035889263) + + W(11, 1033387155, -1113785952, 1024784261, -1131685126); + WS(1059574956, -1147706177); + sum1 = + W(0, -1126851274, -1107330821, 1039522745, -1101979721) + W(1, 1039509326, -1113513772, 1032992154, -1114850125) + + W(2, 1036915515, -1103811902, 1037543219, -1122830319) + W(3, 990365335, -1111585801, 1058476188, -1091594576) + + W(4, 1044635632, -1115799180, 1021792788, 1025219833) + W(5, 1057257569, -1102147871, 1015035920, 999411009) + + W(6, 1014654722, 1042448198, -1130368142, 1049911159) + W(7, -1098033363, 1008106627, 1023708133, 1041111834) + + W(8, -1087441640, 1046832311, -1103709614, 1030688938) + W(9, 1021433863, 1028566264, -1103664757, 1042912388) + + W(10, -1112635561, 998865060, 1024270494, 1025900485) + + W(11, -1101532519, 1034347764, -1106561201, 1033251158); + sum2 = W(0, 1030668111, -1100054904, -1106823977, 1038847176) + + W(1, 1045749759, -1139922314, -1138525905, -1127093272) + + W(2, -1118630721, 1023505668, -1100949461, -1137789612) + + W(3, -1118095530, -1104427366, -1104404781, 1055088734) + + W(4, -1106737563, 1025350194, 1046358820, -1094333916) + + W(5, 1066330506, 1059364463, -1115593085, -1118124817) + + W(6, 1026007575, -1098434999, 1032956568, -1109156363) + + W(7, -1105827255, 1044080198, 1036395993, -1114547879) + + W(8, -1089680445, -1102029714, 1014767972, -1111415597) + + W(9, 1044323398, -1098255510, -1118009606, 1019564502) + + W(10, -1114455410, 1034872747, -1102154889, 1043811931) + + W(11, -1104253130, 1042217401, 1033201092, -1116871429); + WS(1056332375, 1037816258); + sum1 = W(0, -1121656782, -1103168373, -1119737691, 1044637987) + + W(1, 1028439953, -1147698697, -1121854558, -1112652978) + + W(2, -1116096096, 1045017865, -1108613751, 1015231409) + W(3, 988019291, 1032694229, -1099471067, 1051843657) + + W(4, -1124711667, -1126623722, 1027294260, 1032971073) + + W(5, -1088930875, 1058468850, -1105155884, 1025720722) + + W(6, -1141230927, 1036051832, -1088040995, 1059943427) + + W(7, -1110648631, -1125643860, -1146196851, 1029047507) + + W(8, -1094038173, 1054278049, 1023373473, 1025459107) + + W(9, -1124586778, -1138159876, -1105369135, 1040438911) + + W(10, -1109090662, -1140770656, -1119789479, -1116156558) + + W(11, -1100717841, 1052440082, -1121068380, 1033302707); + sum2 = + W(0, 1037403217, -1101035659, 1032316963, -1116665707) + W(1, -1159849898, 1025618366, 1056969468, -1090106390) + + W(2, 1038083410, -1119459300, 1009385423, -1128266716) + W(3, 1057593955, -1080354518, 1060881997, 1028006921) + + W(4, 1038355181, -1107076145, 1065979451, -1077736273) + + W(5, 1057826659, -1093367622, -1108823981, 1040978108) + W(6, 1052219437, -1095104394, 1040943565, 1050471411) + + W(7, 1028403474, -1107763897, 1048107842, -1110113632) + + W(8, -1093495590, -1098889696, 1041580846, 1031803963) + W(9, 1012201018, 1035332836, 1023246776, 1037291810) + + W(10, -1108503511, 1028340263, 1034400525, 1036232380) + + W(11, -1105354500, -1172133380, 1023204972, -1124125618); + WS(1057728492, -1114894260); + sum1 = + W(0, -1113553553, -1137973853, 1030725486, 1027451936) + W(1, 1024408310, -1122023828, -1129994721, 1032124939) + + W(2, 1023297510, 1039175515, -1104644784, 1015759447) + W(3, -1116323110, 1038491142, 1042012404, -1096381204) + + W(4, -1098358292, -1129065232, 1032700067, 1042214629) + W(5, 1063322480, 1002639809, -1097199096, 1025211173) + + W(6, 1022553594, -1102850457, 1049455560, -1095884801) + + W(7, 1038368473, -1119912573, -1174372438, -1103814977) + + W(8, 1038337085, -1099447670, 1041557913, -1120935138) + + W(9, 1025649872, -1108835354, 1036180712, -1107257155) + + W(10, -1143485305, 1022194670, -1204938694, -1117610625) + + W(11, 1041170774, -1110131186, -1139346043, -1131327617); + sum2 = W(0, -1132724746, -1136277690, -1115335750, -1142062564) + + W(1, -1111737990, 1021138001, -1125894137, 1023794749) + + W(2, 1019650853, -1102896527, 1036465851, -1117376889) + + W(3, 1008401986, 1034921985, -1111489002, -1095970428) + + W(4, -1093339450, 1036367329, -1123753553, -1135255538) + + W(5, 1065003137, 1052274635, -1130345777, -1114642052) + + W(6, 1028568703, -1095862669, 1042205114, 1050282098) + W(7, 961646223, 983274770, -1129573217, -1103833757) + + W(8, -1104966989, 1039075981, -1123958953, -1121876761) + + W(9, -1115138968, 989975657, 1028245440, -1124502561) + + W(10, 975314596, -1131382405, -1129237393, -1117578737) + + W(11, -1137003202, 1029353869, 981021860, -1129104973); + WS(1064957100, -1084259623); + sum1 = + W(0, -1147443767, 1048172674, 1050085746, -1087174820) + W(1, -1110620477, 1041967934, 1002237105, 1022388856) + + W(2, 1049301459, -1096483251, -1130736462, 1032395752) + + W(3, 1042679235, -1111985505, 1061123934, -1084863818) + W(4, 1036594273, 1029284270, 1025036588, -1105536623) + + W(5, 1059891343, -1085360136, -1096717087, 1027822410) + + W(6, 1039980881, -1111204540, 1063082922, -1087496217) + W(7, 1049051417, 1038157169, 1039876787, -1118973740) + + W(8, 1059164422, -1085023864, -1098175193, 1033526682) + + W(9, -1122119878, -1115201293, 1050147791, -1099749261) + + W(10, 1038851310, 1035926782, 1046679440, 1036937851) + + W(11, 1052477312, -1093770425, -1094492881, 1040430103); + sum2 = + W(0, 1043574668, -1079200674, 1070660923, 1052128984) + W(1, -1102512316, -1114631788, -1110691764, -1088609636) + + W(2, 1057860954, 1049301959, -1119415890, -1111966430) + + W(3, -1103083598, -1104512784, -1107138551, -1106877192) + + W(4, -1099577256, 1025811761, -1104224219, 1072315297) + + W(5, -1092267131, -1082025998, 1048136354, -1120067756) + + W(6, -1111324648, 1071717488, -1073631870, -1098154139) + + W(7, -1101281480, -1097839567, 1045365848, 1074062948) + W(8, -1072626825, 1060924493, 1049098296, 1046934152) + + W(9, -1123650350, 1072927288, -1076777698, 1055782129) + + W(10, 1053482338, -1142912019, 1040472402, 1075518858) + + W(11, -1068851440, -1085268633, 1045375219, -1113956244); + WS(-1075237718, 1059347685); + sum1 = + W(0, 1021242911, 1049968737, -1123217820, -1100043508) + W(1, -1123750750, 1039650209, 1033512399, -1159856274) + + W(2, 1052611492, -1096977477, 1035058824, -1164938034) + W(3, 1029870036, 1035044013, 1055398719, -1086974821) + + W(4, -1111424357, 1031585078, 1022930282, -1122614884) + + W(5, 1061884279, -1081627821, 1035852049, -1146263191) + + W(6, 1032776022, -1113136009, 1059035017, -1085989237) + W(7, 1046594056, 1040828171, 1018371807, -1134430929) + + W(8, 1058365139, -1083853344, 1040835864, -1113397210) + + W(9, 1019954077, -1114025505, 1054270736, -1094951367) + W(10, 1036293471, 1041271429, 1033340372, 1040742208) + + W(11, 1057072208, -1082038839, 1043435581, -1112152131); + sum2 = + W(0, -1109418256, -1082007392, 1074622373, -1087167323) + W(1, -1079889153, 1054843717, 1045686709, -1092895857) + + W(2, 1045059925, -1090791673, 1052961109, -1111299754) + W(3, 1025535098, -1097230803, 1022527077, 1061750517) + + W(4, -1094791227, -1097908774, 1041368995, -1087580936) + + W(5, 1072979117, 1066822104, -1121141584, 1039933817) + W(6, 1025255906, -1090709237, 1059630355, -1104688853) + + W(7, -1114952578, -1109459004, 1045341483, 1030380818) + + W(8, -1082271661, -1098772696, 1048788253, 1032974905) + + W(9, -1131647237, -1098811123, -1098333373, -1097425000) + + W(10, -1109808864, 1041274025, 1050563248, -1122444474) + + W(11, -1080249300, 1035536875, 1062091865, -1101634861); + WS(-1073405707, 1071333561); + sum1 = + W(0, 1032445482, -1107154225, -1086616986, 1053035442) + W(1, 1037191452, 1005358651, -1114759602, 1043648434) + + W(2, -1097373989, 1049497533, -1113096234, -1140703610) + + W(3, 1009365348, 1025826187, -1088696011, 1058380737) + W(4, 1042579156, -1147371482, -1116673978, 1050217769) + + W(5, -1084271170, 1057270871, 1027100008, 1008260703) + W(6, -1140494528, 1045274198, -1086550017, 1060414079) + + W(7, -1122447285, -1128134433, -1138343378, 1041826370) + + W(8, -1088202787, 1054213138, 1033632004, -1146407565) + + W(9, -1164102249, 1037855412, -1096484208, 1049814032) + + W(10, -1117413058, -1132301012, -1128324122, 1036590066) + + W(11, -1090407429, 1044502774, 1049279047, 1030979244); + sum2 = + W(0, -1104849756, 1044778147, 1087011564, 1051692028) + W(1, -1115275477, 1024288807, -1130309268, 1042344095) + + W(2, 1065552014, 1050304642, 1012814276, -1122813731) + + W(3, 1032168017, -1115874267, -1071484991, -1095624232) + W(4, 1034711867, 1018071134, 1006608216, 1016899230) + + W(5, -1064792716, -1080996320, 1012706900, -1113948677) + + W(6, 1025939811, 1015318926, -1108487910, 1038353709) + W(7, 1031018877, 1039145567, -1116205504, 1017541078) + + W(8, -1111002668, 1015541566, 1017981722, -1121567210) + + W(9, -1134020588, 1025032291, 1026184365, -1115175630) + + W(10, 1016059306, -1161414849, 1015836550, -1134707560) + + W(11, -1105554232, 1035428553, 1030487759, 957459976); + WS(-1093094231, 1019545057); + sum1 = + W(0, -1147370279, 1024662611, 1045730364, -1100871081) + W(1, -1113292876, -1115285964, -1111661690, 1043371102) + + W(2, 1007712219, -1103400446, -1125293706, 1035921815) + + W(3, 1036370005, -1098598749, 1063151515, -1086049630) + + W(4, 1038700136, -1106696483, -1130128916, -1121967929) + + W(5, 1048771569, -1094208743, 1042591246, 1031896756) + W(6, -1138886402, 1034324947, -1102866212, 1057052051) + + W(7, -1109292474, -1117085921, -1114353490, 1030255498) + + W(8, 1043747359, -1103168823, 1040829042, -1117982022) + + W(9, -1139052495, 1020719663, 1042970997, -1114366281) + W(10, -1113681601, 986496271, -1123566046, 983686292) + + W(11, 1044423271, -1105757546, -1119014482, -1116127556); + sum2 = + W(0, 1017737448, -1113949677, -1109074925, -1106456753) + W(1, 1033894674, 1002006465, -1112488549, 1043174240) + + W(2, -1099690943, 1036040708, -1136025401, -1127095326) + W(3, 1041909593, -1095542187, 1055357640, 990810979) + + W(4, 1036060652, -1106928479, -1119128646, -1123930650) + + W(5, 1063813292, 1064786485, -1095508468, 1041202855) + W(6, 995222883, 1011641777, 1029075282, -1080550900) + + W(7, -1096849813, 1028541984, -1138532089, 1043431269) + + W(8, -1111808055, -1099317256, 1042059844, 1013308785) + + W(9, -1122958336, -1133447353, -1121958092, -1111251400) + + W(10, 1031456264, -1130037494, 1002378369, 1011720393) + + W(11, -1111615901, -1122017034, 1041840135, 1011740497); + WS(1065464534, 1066200435); + sum1 = W(0, -1120929867, -1114034816, -1093428139, 1053507241) + + W(1, 1039630850, 1039737375, 1037468205, -1098649416) + + W(2, -1095417420, 1053719708, -1117479019, -1104296205) + + W(3, -1104046500, 1044270480, -1095455089, 1059517274) + + W(4, -1116571174, 1034668025, -1118049328, 1030873567) + + W(5, -1078956988, 1062996894, 1037682987, 1027940302) + W(6, 1026495526, 1027018036, -1097112752, 1062358792) + + W(7, -1100052716, -1105628906, -1102710553, 1029661039) + + W(8, -1090364038, 1051059848, -1134398359, 1047874257) + W(9, 1047356358, 992085460, -1098761015, 1053033759) + + W(10, -1124964177, -1105711476, -1104379061, 1014898857) + + W(11, -1089997432, 1058137077, -1119205176, 1036556777); + sum2 = + W(0, 1052570920, -1079960756, 1059860803, 1024102895) + W(1, -1109439044, 1028585912, -1096757231, -1072214843) + + W(2, 1077140634, 1045135233, -1135125103, 1026412089) + W(3, 1032706704, -1067716640, 1078085184, 1007395147) + + W(4, 1039504993, 999691338, 1048916325, -1071149720) + W(5, 1074719494, 1048879105, -1119420973, 1031274943) + + W(6, 1032567852, -1113086642, -1126012658, -1105291454) + + W(7, 1042487387, -1115876939, 1027784571, 1026889523) + W(8, 1023965646, -1125605772, -1107726802, 1031655696) + + W(9, -1123035498, -1102782368, 1033915049, 1036400237) + + W(10, 1040624471, -1118021143, 1032789056, -1113248449) + + W(11, -1131155204, -1120868355, -1123377002, 1033633154); + WS(-1088460652, -1077196042); + sum1 = + W(0, -1106714405, -1126618358, -1100538888, 1061836401) + W(1, -1105561066, 1017778831, 1012745873, -1104692362) + + W(2, -1105672234, 1049398341, -1107347643, -1107815087) + + W(3, -1106817926, -1128320455, -1096420642, 1063373516) + + W(4, -1095103574, 1021813111, 1014233321, -1113350277) + + W(5, 1032760733, 1062672955, -1104500106, -1130991024) + W(6, -1139695810, -1104636978, 980853696, 1040237156) + + W(7, -1136108756, 1015562593, -1112340330, -1111992333) + + W(8, -1098221750, 1049303442, -1098848505, -1124042178) + + W(9, -1112616426, -1112151140, 1032069058, -1115352833) + + W(10, 1028357771, -1117430379, 1014140598, -1103199781) + + W(11, -1124202648, 1047738902, -1108236605, 1024298444); + sum2 = + W(0, 1042942941, -1095373315, 1047404354, 1041600542) + W(1, 1029337611, -1116792463, -1103739979, 1042549384) + + W(2, -1104635751, 1049880149, -1113660916, 1033409028) + + W(3, 1021675082, -1100136800, -1156628070, 1042313351) + + W(4, -1103511888, -1100575516, 1031504716, 1032277385) + W(5, 1056265483, -1095000083, 1052284225, 1042607543) + + W(6, -1103784377, 1051314558, -1086627236, 1058671506) + + W(7, -1098025422, -1102539848, 1021140017, -1097536524) + + W(8, 1056610233, -1087499329, 1053296214, -1123811627) + W(9, 1032312275, 1033748340, -1097748456, 1053303874) + + W(10, -1097031052, 1034071897, -1113021145, 1006926454) + + W(11, 1032415346, -1106742186, 1040224097, -1116904421); + WS(-1090190636, 1052333694); + sum1 = W(0, -1118008162, 1046164882, -1087764995, 1050774996) + W(1, -1132114980, 992812356, 1017370722, 1025512151) + + W(2, -1107299674, -1113611419, -1133738119, -1143374172) + + W(3, 1028313190, 1039176172, -1107276920, 1042980645) + W(4, 1016759930, 1031741320, 1032465571, -1140639831) + + W(5, 1054861041, -1104478910, 1039228938, 991966796) + W(6, 1021024634, -1114523818, 1048774281, -1116066086) + + W(7, 1029146129, -1131726971, 1022145795, -1123803590) + + W(8, 1052546887, -1088290914, 1046828701, -1135053738) + + W(9, 974396430, -1114987978, 1033108808, -1101829203) + + W(10, 1025239231, -1135839572, 1023704762, -1150325779) + + W(11, 1052242867, -1082760046, 1050382392, -1117633184); + sum2 = W(0, -1112927492, -1126311221, -1124129707, -1089259297) + + W(1, -1121960162, -1127721129, 1000278501, -1112124316) + + W(2, 1030656727, -1136644755, -1119195008, -1143597573) + + W(3, -1115114722, -1096516945, 1062718459, -1089907054) + + W(4, -1113085858, 1010259715, 1038568093, -1095439368) + + W(5, 1069168233, 1066488720, -1108783853, 1016497897) + + W(6, -1107752992, 1035770391, -1092856910, 1057602472) + + W(7, -1101947316, -1142073349, 1036864823, -1173738153) + + W(8, -1097729376, -1119016562, -1105922885, 1034450025) + + W(9, -1111435217, -1127749525, -1108466839, 1028769031) + + W(10, -1119106133, -1113345821, 999311589, -1118042174) + + W(11, -1106807928, -1101412503, -1119408565, -1121786357); + WS(1050584535, 1068150000); + sum1 = + W(0, -1115260532, 1034938395, 1038987194, -1117589351) + W(1, -1115913835, 1013034091, 1010165469, -1115625742) + + W(2, 1047833470, -1104527215, -1116485512, 1026352434) + + W(3, -1112895478, 1043729220, -1102791097, 1041775364) + W(4, 1035117570, -1123123343, 1003680362, 1046586119) + + W(5, 1053057826, -1092950416, 1032942189, -1126776150) + + W(6, 1038151522, -1096382429, 1060286702, -1085160955) + + W(7, 1051158381, -1118268740, -1113655284, 1036369142) + W(8, 1031810112, -1099697720, -1109351189, 992197073) + + W(9, -1132334157, -1110737789, 1033665067, -1112334730) + + W(10, 1035094123, 1007592182, -1116596385, 1020311663) + + W(11, 1045919272, -1112800213, -1113211075, -1128843070); + sum2 = W(0, 1027450901, -1130117632, -1112751331, 1023748039) + W(1, -1129067048, 1020055214, 999052617, 1037992777) + + W(2, 1031860941, -1148181737, 1031574877, -1123191999) + + W(3, 998486633, 1035832253, -1100828230, -1107268336) + + W(4, -1108371420, -1176849298, -1098069390, 1058826704) + + W(5, 1066377631, 1031601953, -1110435251, 992240434) + W(6, 1050271656, -1075559944, 1059983898, -1105105514) + + W(7, -1111123861, 1022099846, -1144500281, 1051052067) + + W(8, -1089703828, 1006070601, -1135053221, -1122685646) + + W(9, 1034115809, -1104035684, 1037142243, 1031181077) + + W(10, 1013422629, -1154287506, -1111215245, 1041076323) + + W(11, -1116488683, -1123703892, 994427506, 1025316569); + WS(1065940278, 1034622363); + sum1 = + W(0, -1130882111, 1042781009, 1048563851, -1106282856) + W(1, 991352096, -1132163876, 1018945629, -1105035701) + + W(2, 1039562393, -1093168999, -1128564863, -1146137419) + + W(3, 1038546130, 1037583679, 1050832116, -1106056839) + W(4, 1040441019, 1034240611, -1109081570, -1089961211) + + W(5, 1065150616, -1081267407, -1125259845, -1103163033) + + W(6, -1116833467, -1106689964, 1063013875, -1093571617) + W(7, 1037655800, 1014989293, 1027338207, 1025705412) + + W(8, 1053064399, -1098826451, 1032573560, -1132178841) + + W(9, -1118439678, -1110899849, 1043578884, -1098971955) + + W(10, -1126802554, -1140385876, 1023675896, 1000818681) + + W(11, 1052844651, -1103816344, -1174556270, -1124029942); + sum2 = W(0, 1042045232, 1025081894, -1120251562, -1098032480) + + W(1, -1122897683, -1131598407, -1100582068, 1047796551) + + W(2, -1130142714, 1051286467, -1114446743, 1028094206) + + W(3, 1051353130, -1135649915, -1091982339, -1088973774) + + W(4, 1048662352, -1114986235, -1098661297, -1083821047) + + W(5, 1066411068, 1066192686, -1098476628, 1035402858) + + W(6, 1033093932, -1113123121, -1108263063, -1096817778) + + W(7, 1043244089, -1113670703, 1041505758, -1102707738) + + W(8, -1116829613, -1124748705, -1105512115, 1040252082) + + W(9, -1111611431, 1042774566, 1029093314, -1115318079) + + W(10, 1039955893, -1113507172, 1036803556, -1119704488) + + W(11, -1105374597, 1039210409, -1115075522, -1136180467); + WS(1056991468, -1087030746); + sum1 = + W(0, -1123211458, -1104816506, -1105628499, 1049039296) + + W(1, -1110865210, -1119944116, 1040392564, -1123900599) + W(2, 1035944426, 1031104918, 1038992913, 1019968535) + + W(3, -1107179074, -1097679367, -1092912076, 1058030045) + + W(4, -1092536332, -1113705364, 1032323379, 1050060447) + W(5, 1043269081, 1044634502, 1052766173, 1024115141) + + W(6, -1112698351, -1113372906, -1098944114, 1032247835) + + W(7, -1101773536, 1016666555, -1113154609, -1118981766) + + W(8, -1111852653, 1043769326, -1111088882, -1113641643) + W(9, 1035059984, 1036804874, 1030188977, 1035537687) + + W(10, 1017337855, 1034739876, -1117349658, -1117759553) + + W(11, -1099907470, 1048904265, -1120093295, -1119368937); + sum2 = W(0, 1038207100, -1100024892, 1019998746, -1116235844) + + W(1, 1028590129, -1132429552, 1055370704, -1091918952) + + W(2, -1108168198, 1051323790, 1017416940, -1131674494) + + W(3, 1017023961, -1082116017, 1065911065, -1096201210) + + W(4, 1032160655, -1107738152, -1102268135, -1125190319) + + W(5, 1060923636, -1094794141, 1048662690, -1115273448) + + W(6, -1122475964, 1048656820, -1095962080, 1023749917) + + W(7, 1005611185, -1120617509, 1023693826, -1118701724) + + W(8, 1025593786, -1112111831, -1121410776, 1032669658) + W(9, 1033230771, 1009208157, 1022143062, 1028403793) + + W(10, -1131420642, 1007544955, -1120372849, 1017593165) + + W(11, -1123799386, -1116942925, 1018425448, 990755743); + WS(1065408790, 1036624080); + sum1 = + W(0, 1031689276, -1095782030, 1040908418, 1044865119) + W(1, 1010781241, -1124793181, -1118902603, 1036811736) + + W(2, -1099523235, 1048657234, -1114118270, -1132122507) + + W(3, -1130392064, -1106389326, -1100633526, 1056569877) + + W(4, -1105362262, 1010247305, -1130349122, -1116251760) + + W(5, -1088986706, 1059819669, -1109527143, 1021657598) + + W(6, -1124855342, 1016267643, -1097124896, 1057017186) + + W(7, -1101014271, -1147394236, -1120117724, -1116551776) + + W(8, -1093812931, 1059687187, -1105256235, 1019294354) + W(9, 1032115325, 1029730958, -1102530619, 1046000250) + + W(10, 1028862634, -1131137795, -1114562026, -1110739566) + + W(11, -1093706094, 1058243684, -1118348593, 1010280523); + sum2 = W(0, 1008018405, 1028827850, 1048442625, 1022982076) + W(1, 1015261982, 1023643398, -1131603511, -1115409151) + + W(2, -1128423353, 976919119, -1110305290, -1142661114) + + W(3, 988821927, 1044469435, -1144038842, -1106419532) + + W(4, 1025710382, 1024565032, -1126539767, -1105522597) + + W(5, -1080807551, -1069309764, -1128896061, -1156968388) + + W(6, 1029044494, 1031515550, -1100063920, -1077869698) + + W(7, 1034212953, -1108906576, -1154431236, 1029512486) + W(8, 1047735839, 1057375362, 1047372093, 1040986767) + + W(9, -1144594818, -1118759177, 1049631559, 1074645104) + + W(10, -1121013958, -1109343217, -1134541747, 1017115388) + + W(11, 1040817807, 1074183528, 1028992794, 1013497529); + WS(-1134496480, -1135409208); + sum1 = + W(0, 1012816882, -1118561391, -1172095542, 1042727039) + W(1, -1101252924, 1038725048, -1131032216, 1023949458) + + W(2, -1135187513, -1111514505, 940438235, -1118209095) + W(3, 1015795842, 1025102291, -1122643706, 1044113108) + + W(4, -1099247502, 1039141810, 1017081284, -1098855254) + + W(5, 1062211658, -1088869665, 1037442288, -1110868352) + + W(6, 1032335660, -1109465919, 1053298610, -1090758606) + + W(7, 1036453998, -1124785329, -1114842158, 1018180354) + + W(8, 1055550179, -1097017583, 1038283500, -1123999226) + + W(9, -1121133019, 1039697400, -1104417019, 1024023145) + + W(10, -1127849669, 984058180, 1020892138, -1121622748) + + W(11, 1042088653, -1131309822, -1111728213, 985363057); + sum2 = + W(0, 1027844464, -1123756397, -1109401613, -1123223808) + W(1, 1035039619, -1128717516, -1120185020, 1023474305) + + W(2, 1009596088, 1048386893, -1119575836, -1197272208) + + W(3, 1033301171, -1120807818, -1105464515, -1117881742) + + W(4, 1029989604, -1129559846, -1142892826, 1045181163) + + W(5, -1069578385, -1079085438, 1032607110, 1013531724) + W(6, -1130897478, 1050514681, 1080182479, 1057107198) + + W(7, -1113328530, 1001587842, -1112219415, -1148494098) + + W(8, 1033916695, -1155326684, -1143648562, -1126181730) + + W(9, 1008317678, -1124897908, -1111316356, 1015620530) + + W(10, 1010222764, 1011089790, -1123809910, -1112292483) + + W(11, 1038900121, -1138311341, -1144599918, -1129634008); + WS(1063953772, 1006246735); + sum1 = W(0, -1129265445, 1023929568, 1050480356, -1094701786) + + W(1, 1037312131, 1034664643, -1103221880, -1113408580) + + W(2, 1053092565, -1092563365, -1114954585, 1012249970) + + W(3, -1129858606, -1152025615, 1054804888, -1099755687) + + W(4, 1041973195, 1007014628, -1113052252, -1124775629) + + W(5, 1058637767, -1081976315, 1043978961, 1034276907) + W(6, 970168057, -1116248388, 1061520345, -1085039957) + + W(7, -1109284733, -1121545966, 1035503657, -1112901548) + + W(8, 1052655373, -1106127939, 1037644971, 1031841028) + + W(9, -1114702297, -1114551939, 1043614208, -1104465584) + + W(10, 1036504960, -1122618723, 1026538155, 1012918985) + + W(11, 1053852345, -1094975651, -1153236991, 1015394179); + sum2 = W(0, -1108119214, -1098605940, 1035846227, 1036002502) + + W(1, -1110269476, -1115932080, -1096454441, 1047215192) + + W(2, -1114546522, 1051355228, 1034086715, 1019597651) + + W(3, -1110533412, -1103381544, 1042040175, -1102267339) + + W(4, -1102892813, -1130886478, -1119694402, -1128298432) + + W(5, 1054173861, 1055154953, 1033662351, -1108620470) + + W(6, -1127729168, -1115663656, -1103681801, 1052945690) + + W(7, 1018137856, 1033484697, -1110958880, -1114162078) + + W(8, 1035812038, -1097546689, -1135158408, -1106956606) + + W(9, 1023031785, 1023974294, 1020649501, 1033369183) + W(10, 998437331, 1029836288, -1130979192, -1102917557) + + W(11, 1043843622, 1033695483, -1106336801, 1026224246); + WS(1049960663, -1098656338); + sum1 = + W(0, -1129270334, -1097905355, -1106458043, 1053746044) + W(1, -1153859324, -1120671826, 1010743226, 1038429850) + + W(2, -1094238830, 1050579558, 1008020477, 1036488405) + W(3, -1116543140, 1026505899, -1084542826, 1060156652) + + W(4, -1101873487, 1033306211, 1036165346, -1111354490) + + W(5, -1093117384, 1065413702, -1122984978, 1035776465) + + W(6, 1026370235, 1012909508, -1096055524, -1110641506) + W(7, -1132001470, 1015184758, 1026933359, 1034045586) + + W(8, -1093158415, -1140159326, 1048347588, -1115507932) + + W(9, 1009750007, -1139624135, -1113672231, -1153271990) + + W(10, 1027525597, 1024719161, -1164389112, 1033987231) + + W(11, -1098353419, 1046556600, -1124973593, 1037016731); + sum2 = + W(0, 1007202997, -1107138382, -1101985157, -1105521455) + W(1, 998286218, -1135144653, 1038605814, -1092409649) + + W(2, -1111080585, 1031799434, -1127152184, -1138707909) + + W(3, -1111184485, -1086536233, 1058778058, -1102287591) + + W(4, 1043783051, 1018462794, -1097778206, 1033842165) + W(5, 1062592323, 1054124413, -1107786643, -1134709509) + + W(6, -1107862779, 1050500010, -1115904936, -1121603522) + + W(7, -1104929125, 1016336685, -1126800416, -1107791267) + + W(8, 1050870644, 1039372702, -1103666737, 1035379787) + W(9, -1122928880, 1035028069, -1115500703, 1030823202) + + W(10, -1123649878, -1120475406, -1117103670, 1024236113) + + W(11, -1137706913, 1012044041, 1042413442, -1119073178); + WS(1045571246, -1101396513); + sum1 = + W(0, 1027156266, -1105879340, -1095381975, 1052608133) + W(1, 1036979366, -1116386461, -1135540454, 1031079263) + + W(2, -1094890856, 1052732944, -1110160581, -1124519785) + + W(3, -1123739311, 1036462891, -1086841044, 1059410250) + + W(4, 1033495803, -1113888968, -1123826896, 1048275928) + W(5, -1081913239, 1057453824, 986236332, 1015417435) + + W(6, -1110505155, 1040289247, -1087831711, 1053535332) + + W(7, -1121128186, -1106215130, -1138173481, 1033674439) + + W(8, -1095054872, 1059217778, -1117509614, 1025380519) + W(9, 1019384210, 1035302207, -1100616678, 1056369955) + + W(10, 1002559041, -1132265864, -1138775820, -1109766005) + + W(11, -1096527684, 1057086003, 1031959012, 1009437253); + sum2 = + W(0, 1023702857, 1025579445, -1107828603, 1030949885) + W(1, 1030056541, -1138881396, -1116086512, 1041684936) + + W(2, -1100190580, -1127701406, -1101693823, 1031874044) + W(3, 1027064225, 991232624, -1127488618, 1063977916) + + W(4, 1026840857, -1115029594, 1024261913, 1049263730) + W(5, -1121382305, 1081524863, 1032271344, -1124133978) + + W(6, -1115739014, 994389040, 1049530396, 1074557390) + W(7, 1041139218, 1015337722, 1023117658, -1121855219) + + W(8, 1041567276, -1078514947, 1024600809, -1113125346) + + W(9, 1011341860, -1121905805, -1097196557, -1067412604) + + W(10, -1110332083, -1157524144, 1016675050, -1114246345) + + W(11, -1125328530, -1072747255, 1045882874, 1009384836); + WS(-1091844311, 1066789497); + sum1 = W(0, -1126657090, -1121934839, 1053346558, -1094816004) + + W(1, -1134360567, -1196074864, -1118280816, -1104655157) + + W(2, -1150447404, -1096277599, 1026981217, 1030410603) + + W(3, 1035276339, 1036892560, 1061301148, -1095276499) + W(4, 1035239934, -1117233544, 1034822275, 1041291861) + + W(5, 1054539137, -1085328499, -1132053288, 1032377106) + + W(6, -1122398524, 1016354085, 1061579109, -1094948141) + + W(7, 1041572288, -1113536398, 1027512241, -1100932977) + + W(8, 1052329175, -1090319102, -1138204721, 1028691858) + + W(9, -1105911320, -1113195754, 1010492736, -1109759879) + + W(10, 1026669711, 1016723124, 1036073133, -1137558275) + + W(11, 1052092547, -1096198988, -1122862318, 1004385343); + sum2 = + W(0, -1130924015, 1022730742, -1156842543, 1039023607) + W(1, -1147026848, 1024455841, 976327856, -1107671502) + + W(2, 1030703882, -1100688592, -1113451109, 1015244616) + W(3, 1006816288, -1102494949, 1050591037, 1039287442) + + W(4, 1030233046, -1121583866, 1032746467, -1063244855) + W(5, 1084548157, -1091568120, 1034384724, 1032201434) + + W(6, -1109752024, -1117144683, 1041535529, 1042495948) + + W(7, 1024850879, -1112832588, 1030725620, -1118200508) + W(8, 1030607420, -1100624377, 1037336210, 984232072) + + W(9, -1118656485, 1023153636, -1117378226, 1033109796) + + W(10, -1123040622, 1003511712, 1013150272, 1019358625) + + W(11, 1000111712, -1135441064, 1025293966, -1124806470); + WS(1062375148, 982896070); + sum1 = + W(0, 1041356906, -1092346958, -1098857839, 1052252533) + W(1, 1050501706, -1165233042, -1141741512, 1042371688) + + W(2, -1100631199, 1048733184, -1126563284, -1134397903) + + W(3, -1123251246, -1107640316, -1093348349, 1057292943) + + W(4, 1043133649, 1008063554, -1121772047, 1037798623) + W(5, -1081710855, 1063732968, -1111246422, 1032268279) + + W(6, -1138991637, 1035668286, -1084667272, 1061645578) + W(7, -1112114769, 988108978, -1156317853, 1026956462) + + W(8, -1088318752, 1059891330, -1106214611, 1037368483) + + W(9, -1161666833, 1016120313, -1093940123, 1051947731) + + W(10, -1109426316, -1138661789, 1011726474, -1115727625) + + W(11, -1084607638, 1059995535, -1190508359, 1040598420); + sum2 = W(0, -1087149149, -1081699534, 1075074133, 1074122230) + + W(1, 972078363, -1097056662, -1111774062, 1035582541) + W(2, 1078981756, 1067224402, -1092574897, 1045566397) + + W(3, -1122195827, -1087576154, 1080077903, 1066418532) + + W(4, -1094572008, 1049096521, 1039123010, -1082404199) + + W(5, -1086433828, -1082120864, -1101495601, -1109136155) + + W(6, 1035630599, -1111170675, -1073636555, -1078722695) + + W(7, -1124013413, 1034655424, 1055099903, -1119441337) + + W(8, -1080599553, -1083892454, 1051613332, 1023040696) + + W(9, 1042757145, -1097950160, -1080969229, 1038753292) + + W(10, 1020974546, 1027077203, 1060125526, -1098859385) + + W(11, -1075310961, -1085615144, 1056506110, -1129411423); + WS(-1073733835, -1077508759); + sum1 = + W(0, 1004911573, 1043185540, 1056421033, -1084678800) + W(1, 1025064353, 1009545653, 999004239, -1120942224) + + W(2, 1054442442, -1094509130, 1020812405, 1022285001) + W(3, 1008908284, -1136904037, 1059517190, -1087084867) + + W(4, -1149079216, -1118599969, 1032559088, -1114184455) + + W(5, 1066321721, -1089134469, -1127746091, 1007063543) + + W(6, -1123346838, -1112686066, 1063474337, -1088382556) + + W(7, 1027145139, -1149726053, 1021646261, 1032555200) + W(8, 1052962698, -1089853747, -1126936380, 1015641511) + + W(9, -1114632613, 1005792618, 1044159722, -1092765869) + W(10, 1027348136, 1023282088, 1036339578, 1040940927) + + W(11, 992460573, -1093589176, -1126618160, 981480241); + sum2 = + W(0, 1016441223, 1040812131, -1091551076, -1083270432) + W(1, 1054198423, 1001473573, -1123853806, -1136381199) + + W(2, 1020713637, -1123741604, -1108424657, -1110846033) + + W(3, 1034027700, -1121560396, -1092123318, 1057043619) + + W(4, -1115262538, 1008724259, 1016212045, -1100123577) + + W(5, 1069362941, 1065772322, -1092584961, -1120589670) + W(6, 1025170155, -1100550013, 1050653373, 1058297195) + + W(7, -1121642970, 1040111989, 1030169991, -1105283667) + + W(8, 1020763615, -1091989226, 1029919048, -1104422780) + + W(9, 1024326153, 1029487024, -1121149602, -1092470882) + + W(10, 1039520200, 1027795061, 1020004331, -1102325825) + + W(11, -1094990109, -1106605421, 1026718342, -1115881428); + WS(-1083424620, -1083774644); + sum1 = + W(0, 1025997707, -1107578509, -1116799831, 1051882641) + W(1, -1114213177, -1140244728, 995558823, -1112668224) + + W(2, -1098861996, 1045883512, -1127946135, -1116793621) + + W(3, -1132669247, -1109754213, -1099316274, 1060321715) + + W(4, -1106758402, -1131243108, 1015677409, 1048694360) + + W(5, -1079768279, 1059777970, 1040276008, -1129876893) + + W(6, -1113673299, -1099923633, -1093459346, 1064776049) + + W(7, -1108196294, -1167573435, -1146244698, 1044345284) + + W(8, -1098475085, 1036566882, 1008462282, 1020492609) + W(9, 1028038186, -1117921566, -1113981277, 1042756750) + + W(10, -1117078569, 1015090721, -1119640804, 1030760459) + + W(11, -1105585281, 1033934183, -1130472177, -1176961296); + sum2 = + W(0, -1120400279, -1120118931, -1114073896, 1044457775) + W(1, 1036833596, -1137956564, 1006239848, -1112851025) + + W(2, 1016448074, -1095953339, -1112980685, -1122147671) + + W(3, 1033967902, -1101370370, 1047917593, 1065044078) + W(4, -1119396143, 987310366, -1138878316, 1037781128) + + W(5, -1113781647, 1069276419, -1110041421, -1187381491) + + W(6, 1012842788, -1100258045, 1045546113, -1075186216) + + W(7, -1132903556, -1131003226, -1135736068, 1002346920) + + W(8, -1114666278, 1035717470, -1120766465, 1029533357) + + W(9, 1028356101, -1112182778, 1002645288, -1097061266) + W(10, 1015304410, 1003776904, -1120658117, 995892591) + + W(11, -1115876966, 1049663208, -1123504973, -1150885167); + WS(1055938007, -1113494123); + sum1 = + W(0, 1002908945, 1028210664, -1133494457, -1135464580) + W(1, 1008466835, -1131269290, 1005413771, -1117675639) + + W(2, 1035958810, -1095959351, 1040264713, 1035203030) + W(3, 1025040167, 1040926954, 1041989700, -1087581816) + + W(4, 1048292991, -1116685065, 1016082831, -1118443670) + + W(5, -1101702418, -1121242873, 1034336763, -1117662885) + + W(6, -1114102015, 1040854289, -1098047787, 1048632765) + W(7, 1043249233, -1132796663, 1024456642, 1046508410) + + W(8, -1093641223, 1052220147, -1183964258, -1144182458) + + W(9, -1121270129, 1019764906, -1111985289, 1025236686) + + W(10, 1036425152, -1137681823, 1006080470, 1029150738) + + W(11, -1102768646, 1042463785, -1131127167, 1031884341); + sum2 = + W(0, -1148833389, -1103329032, 1039527980, 1036545465) + W(1, -1140514638, -1111163586, 1034952858, -1114547380) + + W(2, 1019372679, -1111710878, 1042452640, 1025974311) + W(3, -1131645803, -1099667252, 1017530647, 1040867364) + + W(4, 1048394746, -1102843950, 1044582101, 1046239383) + W(5, -1095619156, 1074171367, 1046568773, 1030125627) + + W(6, -1100126968, 1038848953, 1053527025, -1072583834) + W(7, -1104419698, 1045672947, 1041029558, 1023994452) + + W(8, -1122648352, -1089175055, -1095650184, 1033990232) + + W(9, -1101188496, 1040593566, 1048348234, -1110512168) + + W(10, -1113024814, 1039972451, 1038559400, -1104909140) + + W(11, 1034383711, 1048723535, -1105559093, -1123744674); + WS(1054254551, 1014537956); + sum1 = + W(0, -1121039367, 1035774671, -1112598570, -1132150029) + W(1, -1109088445, 1040615567, 1018675757, -1130008697) + + W(2, 1008273253, -1122251932, -1109769252, 1003469451) + W(3, 1022410264, 1030747950, -1093495169, 1041075666) + + W(4, -1103842329, 1040565356, 1028321069, -1107714718) + + W(5, 1061840455, -1100441032, -1105690119, -1126038165) + + W(6, 1032078897, -1097508911, 1062686448, -1084814013) + + W(7, 1049125597, -1115375938, 1035879540, -1100889147) + + W(8, 1058139578, -1090418276, 1045096257, -1105705223) + W(9, 998902321, -1111836109, 1050284599, -1098262366) + + W(10, 1018266794, 1030169589, 1035017184, -1112194220) + + W(11, 1050365160, -1104639554, -1137878196, -1123088958); + sum2 = + W(0, 1011204314, -1130282463, -1119643322, 1040567914) + W(1, 1058038651, -1092395975, -1151906447, 1008292026) + + W(2, 1036989282, -1093705400, 1048788001, 1041384381) + W(3, -1132982086, -1113509623, 1023195387, 1046529995) + + W(4, 1069827352, -1082188469, 1015334447, -1118416042) + W(5, 1031871454, 1053486166, 1061661513, -1087135929) + + W(6, -1126682819, 1010705513, 1036745108, 1053627848) + W(7, -1076895592, 1050130047, 1031867988, 1015562377) + + W(8, -1105750465, -1097180463, -1083563182, 1062283738) + + W(9, -1118412630, 1033032763, 1024841875, 1042871577) + + W(10, -1102862368, -1108358221, 1019402007, -1171211484) + + W(11, -1132045005, -1098551422, -1093245544, 1058279550); + WS(1057163500, -1105993220); + sum1 = + W(0, -1117201821, -1127293622, 1046510122, -1119279260) + W(1, -1111026820, 1018908832, -1121502764, 1045431725) + + W(2, -1097880614, 1032698105, 1044535287, -1110256660) + + W(3, 1035599249, -1100979748, 1061106926, -1097882833) + + W(4, -1095331735, 1024080836, -1105708961, 1049617722) + + W(5, -1099817760, -1088567265, 1053288920, -1117593824) + + W(6, 1039647740, -1110465655, -1119635500, 1058361641) + + W(7, -1096979757, 1027464313, -1100922079, 1042176840) + + W(8, -1109566363, -1097567811, 1050620014, -1113789929) + + W(9, 1009912816, 1018827936, -1147860066, 1036626725) + W(10, 999121112, -1159432152, -1136735831, 1001114727) + + W(11, 1037588842, -1111863248, 1037098289, 1012647057); + sum2 = W(0, 1032576295, -1107895050, 1016729470, 1038099246) + + W(1, -1122727069, -1114110583, -1123342042, 1039805910) + + W(2, -1102939450, -1120156902, -1128970625, -1124467804) + + W(3, -1102694716, 1052615154, 1050355566, -1100691281) + + W(4, 1046407453, -1110408836, -1132748357, 1027679479) + W(5, 1057040101, -1098318717, 997134844, 1035923921) + + W(6, -1114775905, -1183264704, 1041423933, 1028185223) + + W(7, -1094682594, 1040728790, 1033817148, -1127944484) + + W(8, -1098800812, 1043085543, 1023808656, -1104134547) + W(9, 942234367, 1017960690, 1027447559, -1113846578) + + W(10, 1033077879, -1111084310, -1109637447, -1117652574) + + W(11, -1113353192, 1025700351, -1136470782, 1024627457); + WS(1069430838, -1077807532); + sum1 = W(0, -1123171840, 926704291, 1028287308, 1024652287) + + W(1, -1121358347, -1124249574, -1123870031, 1035074891) + + W(2, 1030377682, -1104443381, -1137933441, -1123723658) + + W(3, 1012978707, -1102713036, 1060355037, 1049114747) + + W(4, -1102473935, -1124350158, 1026708965, -1094582899) + + W(5, 1064667974, 1049334299, -1095444677, -1155502135) + + W(6, 1032241614, -1104095024, 1044883747, -1097738289) + + W(7, -1112982200, 996719039, -1110089696, -1131766218) + + W(8, 1023923417, -1112895132, -1115022670, -1114119663) + + W(9, 1013657340, -1123449267, 1023074654, -1133494194) + + W(10, -1123735342, -1129702439, -1120091289, -1126388352) + + W(11, -1134219998, -1105084689, -1125652635, -1115595936); + sum2 = + W(0, -1176390445, -1120278537, -1122813389, 1041053822) + W(1, 1022193201, -1120846771, 1032791968, -1112747779) + + W(2, -1119517685, 1042596904, -1132233097, -1150821318) + + W(3, -1107216374, 1039675898, 1061000499, 1032712030) + W(4, 1037891533, -1120324549, 1039748018, 1025598156) + + W(5, 1059349510, 1055783944, 1009116037, 1006903493) + W(6, -1104895086, 1049256042, -1087513873, -1099074048) + + W(7, -1107732985, -1117395279, 1038133354, -1105015824) + + W(8, 1030867610, -1084050573, -1101549778, 1034659541) + + W(9, -1123666927, 1024448666, -1108606159, 1040697602) + + W(10, 1022775251, -1115429715, 1013658503, -1110290749) + + W(11, 1029186614, -1106116496, -1106656496, 1028618234); + WS(-1107817820, -1083770194); + sum1 = + W(0, 1033900161, -1103638846, -1091016130, 1053216608) + W(1, 1041711845, 1032252891, -1129878691, 1019165999) + + W(2, -1105602789, 1056291523, -1114138529, 1005244003) + + W(3, -1129439246, 1023785569, -1097747004, 1057499003) + + W(4, -1107402783, -1129556050, -1131338575, 1041664750) + + W(5, -1076846267, 1059566574, 1043057225, 1037921123) + W(6, 1015365308, 1007653393, -1089110318, 1057822998) + + W(7, -1097881621, -1126092988, -1128788741, 1026305479) + + W(8, -1101714279, 1057215924, -1104471663, 1041959808) + W(9, 1034359265, 1029035509, -1095981534, 1051239662) + + W(10, 1029122288, 1025745172, 1024049691, -1111132977) + + W(11, -1089968180, 1055184137, 1032118072, 1027268745); + sum2 = W(0, -1108694073, 1017327589, 1040440313, 1037365040) + + W(1, -1097181356, -1123414724, 1045019344, 1034893158) + + W(2, 1020539438, 1043169414, 1044490295, -1142407924) + + W(3, -1102469381, -1100848825, -1091152854, -1179472005) + + W(4, -1098856738, -1124070306, 1037993179, -1146521528) + + W(5, 1062010427, 1059039676, -1105305386, -1103656828) + + W(6, -1102369829, -1136622056, 1017850914, 1038217042) + + W(7, -1109601321, 1025666621, 1036817135, -1122158468) + + W(8, -1095264144, -1119445175, -1098482637, -1105116469) + + W(9, -1116848662, 1036214504, 1045324437, 1048192551) + + W(10, 1034613852, 1027457629, -1123721670, -1109074807) + + W(11, 1047380031, -1115655698, -1105047780, -1121369495); + WS(-1121449656, -1084978473); + sum1 = W(0, 1045775831, -1099605930, -1086366198, 1054843763) + W(1, 1044622847, 1025802254, 1021114964, 1028648016) + + W(2, -1100836955, 1049277222, -1121703995, -1116658981) + + W(3, 1036495664, -1113195701, -1085601027, 1059006957) + + W(4, 1039106531, -1138285574, 1032769888, -1106810756) + + W(5, -1088747404, 1062277595, -1122091582, 1043922200) + + W(6, -1134400474, 1033523886, -1083936243, 1060137529) + + W(7, -1102614275, 1020367213, 1043049231, -1109837568) + + W(8, -1087596695, 1057384673, 1011169881, 1042132230) + + W(9, -1112792957, 1039225431, -1102874546, 1045407794) + + W(10, -1118753961, -1132370673, 1043659613, -1097941829) + + W(11, -1088234269, 1055835664, 1048366450, 1039326553); + sum2 = + W(0, 1027272459, -1105747151, 1058588727, 1050147388) + W(1, -1089616072, 1040922163, -1122536322, -1103046200) + + W(2, 1025881493, 1054947781, -1098050255, -1157391810) + W(3, -1115599503, 1043039962, 1025318337, 1058930692) + + W(4, 1020160348, -1097372724, -1109953333, 1029006014) + + W(5, -1079698237, -1072349877, 1078384354, 1029236731) + + W(6, -1101108438, 1049577028, -1116019666, -1069493839) + + W(7, 1078006681, -1111844849, -1160853572, 1035298821) + + W(8, 1050247454, -1072151832, 1075828182, -1095907204) + + W(9, -1125199072, 1043042004, -1104971590, -1072978341) + + W(10, 1074567753, 1046502148, -1105305527, 1053260045) + + W(11, -1094505007, -1072202568, 1072013431, 1037030073); + WS(-1076413686, 1050217089); + sum1 = W(0, 1037264211, -1103937453, 1032015257, 1043075881) + + W(1, -1122840185, -1144808135, -1140703701, 981259974) + + W(2, 1015092336, -1110472573, -1115654547, -1126940256) + + W(3, 1010880426, -1126374874, -1117441203, -1140207123) + + W(4, -1121072785, -1127053849, -1119658251, 1042459879) + + W(5, -1095655209, 1058975156, 1016890098, 1040888602) + + W(6, -1116247362, -1115463620, -1089060935, 1059127610) + + W(7, -1095200233, 1021095812, 1031154598, 1040532067) + W(8, -1097693400, 1049753500, 1024224509, 990976051) + + W(9, -1125273098, -1110800684, -1116339093, 1026525586) + + W(10, -1116764924, -1118091276, -1131976189, 1020764716) + + W(11, -1115082479, 1038259412, 1027865572, 1016317274); + sum2 = W(0, 1057721492, -1087030854, -1098169441, 976966634) + W(1, 1023517212, 1010046217, 1028643349, -1118716844) + + W(2, 1050324940, 1023362490, -1141117066, 1027499437) + + W(3, 1060288138, -1080168014, 1016748144, -1115171624) + + W(4, 1023617033, -1115470708, 1059252612, -1080273709) + + W(5, -1095791676, 1047291739, -1099550108, 1034407868) + + W(6, -1088865108, 1065839894, 1025332663, -1136639192) + + W(7, 1041241265, -1116997486, -1086775589, 1065802380) + + W(8, 1048744751, -1124716700, 1003901823, -1138422172) + + W(9, -1123025940, 1052992874, -1103675095, 1045176631) + + W(10, -1105682362, 1028187249, -1093527126, 1051057083) + + W(11, 1047968677, -1122660154, 1020688386, -1121332252); + WS(1066004950, -1130673709); + sum1 = + W(0, -1116101174, 1031654568, -1088044468, 1052873383) + W(1, 1041536990, -1136500130, -1143212072, -1115365365) + + W(2, -1112634148, 1046315731, 1018103788, -1125315968) + + W(3, -1110468285, 1037471350, -1095270314, 1053790292) + + W(4, 1044233532, -1143909091, -1115338446, 1044807147) + + W(5, -1086079158, 1057379349, -1114923292, 1020745202) + + W(6, -1108483849, 1036857292, -1084922887, 1062574892) + W(7, -1111082699, 1016815907, 1016794668, 1049500535) + + W(8, -1089120237, 1059566963, -1112535089, -1120057699) + + W(9, -1129241385, -1116011560, -1096691029, 1043154809) + + W(10, 1013224078, 1009076749, 1013476922, 1018991691) + + W(11, -1092328502, 1052540519, 1045681849, -1111113254); + sum2 = W(0, 1049010278, 1059657103, -1081123115, -1096253478) + + W(1, 1022187211, 1042763848, 1037489391, -1120407882) + + W(2, -1091075041, 1044030983, -1110198086, -1123055347) + + W(3, -1120558834, 1065561208, -1094693777, -1088412254) + + W(4, 1026065263, 1010460099, -1115441721, 1065354919) + W(5, -1086070082, -1088804298, 979808314, 1037997843) + + W(6, -1107156556, 1033902725, 1048072918, 1059822273) + W(7, 1015305348, -1106407542, 992841734, -1090673211) + + W(8, 1058489027, 1048768363, -1103664360, -1127526979) + + W(9, 1011333881, -1082019922, 1067731839, -1110539158) + + W(10, -1102578162, 1046102351, 1042878013, -1076779646) + + W(11, 1065573397, 1056386736, 1041735451, -1098151359); + WS(1047691950, 1051513987); + sum1 = + W(0, 1022367675, -1106171493, 1047705594, -1115678670) + W(1, -1110486184, -1119968336, 1023115866, -1148261013) + + W(2, -1138130365, 1039875161, 1038987295, -1146539325) + + W(3, 1025923810, -1110614526, -1138856554, -1098498099) + + W(4, -1111291916, 1031736900, -1121417283, 1048684730) + + W(5, -1092459648, 1059839847, 1037143648, -1113038256) + + W(6, -1135269348, 1043654816, -1088007377, 1055365231) + W(7, -1116325726, 999460043, -1123344254, 1037977761) + + W(8, -1117423671, -1110502987, 1038170008, -1124410005) + + W(9, -1153116613, 1018209505, -1145599589, -1108540005) + + W(10, 1024662707, -1170140361, -1140725337, 1012206837) + + W(11, -1130685354, 1013205632, -1106962771, 1022378313); + sum2 = + W(0, -1153456458, 1034638423, 1026219462, -1118314715) + W(1, -1119545213, 1020158000, -1134949160, -1132037434) + + W(2, -1110235102, 1026400860, 1033998497, -1129681397) + W(3, 976205336, 1047224115, 1041432515, -1098555575) + + W(4, 1038320636, 1034767622, -1107040555, -1111241686) + + W(5, -1098519781, 1048945857, 1042089138, -1100590807) + W(6, 1031938263, -1102088763, 1016119332, 1066956313) + + W(7, -1089428981, -1131704894, -1148458760, -1109506803) + + W(8, 1045200456, 1038098069, -1088147582, 1033722488) + W(9, -1128058621, -1119972538, 1026438298, 1020127420) + + W(10, -1103340362, 1036980701, 1018102832, -1122339703) + + W(11, 1012163112, 1026446934, -1114149729, -1126638758); + WS(1065730166, 1060778308); + sum1 = W(0, -1109508860, -1157499671, 1041425921, 999270323) + + W(1, 1009856488, -1122732458, -1155017835, -1122491724) + + W(2, 1039607429, -1108915110, 1019270959, 1019165315) + + W(3, -1113193022, -1101845990, 1059840031, -1093896302) + + W(4, 1048952862, -1112299503, 1018445113, -1123710636) + + W(5, -1103201623, 1034241095, -1124851701, 1031136123) + + W(6, -1116526739, 1037579925, -1086536234, 1065443257) + + W(7, -1100984082, -1130156262, 1027367671, -1109701838) + + W(8, -1119532176, -1115473720, 1042597895, -1112137490) + + W(9, -1113248331, 1024052458, -1131587533, 1023021127) + + W(10, 988759974, 1035869970, -1116098736, -1155438706) + + W(11, -1135484603, -1169161851, -1109972554, 1026435614); + sum2 = W(0, -1117967445, 1023936292, 1048994422, 1036573845) + W(1, 1025878262, -1136777476, 1040648348, 1027011316) + + W(2, -1081925843, -1090561506, -1121546197, 1000734832) + + W(3, -1112630617, -1104815876, 1069895227, 1061477130) + + W(4, 1006994724, -1120512530, 1042642774, 1032485416) + + W(5, -1079286264, -1076993331, 1017402756, 1043800887) + + W(6, -1134880336, -1097739621, 1067803238, 1074358700) + + W(7, -1094759274, -1115175264, -1108734545, 1008252288) + + W(8, -1093635474, -1082750513, -1124517798, -1106635673) + + W(9, 1042723069, 1027781874, 1039731885, -1152591489) + + W(10, -1128233335, 1050798200, -1110919553, 1017816544) + + W(11, -1113045602, 1040942069, 1015619872, -1104563368); + WS(1051081815, 1004177576); + sum1 = W(0, -1127006616, 1047378036, 1040477302, -1095193921) + W(1, 984028115, 1015654525, 1009183853, -1123222753) + + W(2, -1133548407, -1099314072, 1033152150, 1000220336) + + W(3, 1030806032, 1030530563, 1061394914, -1084986498) + + W(4, -1134209438, 1016832613, 1035550201, -1112167248) + + W(5, 1067589976, -1091645900, -1104155199, 1007541309) + + W(6, -1148492092, -1102096100, 1061693295, -1092420382) + + W(7, -1126214664, 1020442767, 1031890286, -1119963793) + + W(8, 1056018877, -1084371172, -1117645071, 1016050244) + + W(9, -1122950699, -1117414047, 1051876647, -1100397982) + + W(10, -1115478541, 1015156587, 1033051522, -1118879820) + + W(11, 1054656608, -1096248194, -1098736399, -1120116135); + sum2 = + W(0, 1038737431, -1086393652, -1122890851, 1062117952) + W(1, 1031555324, -1105710539, -1107492679, 1061143042) + + W(2, -1087802869, -1089713201, 1047951996, 1021198999) + W(3, 1048033211, -1086071985, 1050554685, 1059347527) + + W(4, 1026779363, -1103176732, -1120313369, 1050160290) + W(5, 1074235084, 1068761695, -1098359769, 1024031768) + + W(6, 1015799927, 1036302581, -1097102610, 1051722018) + + W(7, 1043634021, -1105088271, -1127256174, -1118303985) + + W(8, -1080828834, -1090432670, -1093586557, 1023611974) + + W(9, -1108431753, 1030572627, 1051308486, -1096060997) + + W(10, -1093678452, -1113357802, 1025558434, 1049210573) + + W(11, -1086660156, -1089293346, -1099341241, 1042868230); + WS(-1081907798, -1114644056); + sum1 = W(0, 1023775725, -1099395677, 1055907631, -1100928459) + + W(1, -1119324179, -1109439504, -1170980595, -1134709766) + + W(2, 1050593936, -1112754945, 1032148262, 1017060589) + + W(3, 1026005873, -1099241994, 1058604967, -1087793848) + + W(4, 1009969504, -1128826918, -1126334628, -1120114113) + + W(5, 1054687330, -1087665246, 1038203192, -1138112959) + + W(6, -1135823392, 1034531271, 1038229186, -1104299004) + + W(7, 1028440637, 1038462084, -1129163353, -1108351113) + W(8, 1034921283, 1040795209, -1104169898, 999099597) + + W(9, -1151688884, 1019473342, 1018134455, 1040889398) + + W(10, -1106565731, 1007377992, -1129940170, -1110039318) + + W(11, -1120708196, 1054318790, -1107725509, 1027667523); + sum2 = W(0, -1119441358, -1109792567, -1127769135, -1107196821) + + W(1, 1030789742, -1113410550, -1129970231, -1120391232) + W(2, 1050978947, 992017798, 1040616080, 1030775978) + + W(3, 1013923693, -1103233485, 1033489482, -1095646457) + + W(4, 1038693473, -1115392393, -1135011770, -1103316489) + + W(5, 1054134565, 1049668759, -1124339641, -1108882435) + + W(6, 1015830944, -1104701758, 1049300223, 1056508485) + W(7, 1043974386, -1145057435, -1115083307, 961266788) + + W(8, -1110832497, 1047186396, -1086696217, -1118394614) + + W(9, 1009913072, -1120471806, 1049274561, -1110580647) + + W(10, -1110322035, 1032794842, -1117182320, 1032096200) + + W(11, -1124368769, -1109467751, -1103392519, 1029776437); + WS(1054547415, -1080700728); + sum1 = W(0, -1118959255, -1106813137, -1136179854, 1049136707) + + W(1, -1121699838, -1110798213, 1000886579, 1020745112) + + W(2, 1042266506, -1113159542, -1135369949, -1133353861) + + W(3, -1108938574, 1000629071, -1114102394, -1117329322) + + W(4, -1098171678, -1132246652, 1035589374, -1089948699) + + W(5, 1058763908, 1057279043, -1102488395, -1116069530) + + W(6, -1115953331, -1104374042, 1043996152, 1058534976) + + W(7, -1118338951, 1023843187, -1120209015, -1115354302) + + W(8, 1034434840, 1042941412, -1123101368, -1110056358) + + W(9, -1130255148, -1115551813, 1030595334, 1024662339) + + W(10, -1111680098, -1125104281, -1114831416, -1107411355) + + W(11, 1037557447, -1115931546, -1111356186, -1113468791); + sum2 = + W(0, -1104438281, 1010047952, 1041416137, -1126834256) + W(1, -1137643420, -1141914640, 1006975884, 1033813267) + + W(2, -1103312430, -1117623020, -1119875938, -1142859168) + + W(3, -1114845259, -1104617278, 1059878226, -1091497753) + + W(4, 1032827109, -1115736166, -1121830816, 1016682467) + W(5, 1030331467, 1058017528, -1098691452, 1030249718) + + W(6, 1035922248, -1119230330, 1042445877, 1016098448) + W(7, 1038105687, -1111253212, -1109021584, 1016925125) + + W(8, -1127060444, 1041560361, -1110812698, -1153808400) + + W(9, 1024387710, 1031893944, -1106783001, -1112957506) + + W(10, 1032692112, -1114320479, -1116080890, 1028042677) + + W(11, -1113418625, 1032681483, -1112120334, -1122393388); + WS(1052913623, 1049378679); + sum1 = + W(0, -1122838827, 1042960148, -1086626395, 1057292387) + W(1, 1037967453, -1155224026, -1140317417, -1131398976) + + W(2, -1096052024, 1051976144, -1115050310, 1021209962) + + W(3, -1125024735, 1047376245, -1085621156, 1057250406) + + W(4, 1033197251, -1137632582, -1119624720, -1142164473) + + W(5, -1082562971, 1065554348, -1105683981, 1041116332) + + W(6, -1114511683, 1052155164, -1087926293, 1052193006) + W(7, 1022767638, -1114068531, 1000517975, 1026436976) + + W(8, -1091398264, 1054127476, 1031945184, 1019309136) + W(9, 980913767, 1040745327, -1096441475, 1052669955) + + W(10, -1117629257, -1119607996, -1118732996, 1037554661) + + W(11, -1088065070, 1051850318, 1041425290, 1029050594); + sum2 = + W(0, -1128729473, -1113890565, 1030681183, -1116238263) + W(1, 1054381777, -1088819879, 1026695603, -1113695617) + + W(2, 1046246583, 1032966985, 1060417287, -1094452995) + W(3, -1122814467, 1012493154, -1119541727, 1063042504) + + W(4, 1065151040, -1073258706, 1038041001, 1007226362) + W(5, -1105895610, 1066720275, 1069419683, -1071852139) + + W(6, -1114364242, 1022932917, 1013035938, 1061802664) + W(7, 1070184946, -1071972143, 1029245131, -1121347205) + + W(8, -1109256305, 1054635319, 1067716376, -1076852924) + W(9, -1114309631, 1028217359, 1037707015, 1034508407) + + W(10, 1063333907, -1084913408, -1131614889, 1005475605) + + W(11, 1018572933, -1114817272, 1057796391, -1086618913); + WS(-1080205366, 1054586731); + sum1 = + W(0, 1028285119, -1104231365, -1105384067, 1018315643) + W(1, 1050517144, -1107795033, 1034516295, -1118125300) + + W(2, -1098317298, 1050987674, -1103331232, 1030553289) + + W(3, -1114270114, -1122896269, -1102251495, 1045079495) + + W(4, 1044797187, -1134423957, 1028158052, 1031422323) + W(5, -1084181862, 1065887519, -1106919576, 1039594145) + + W(6, -1122816794, 1042423964, -1083878719, 1058366107) + + W(7, -1136969466, -1127143669, 1015275709, -1113275778) + + W(8, -1102645126, 1055927247, -1127822612, 1007528111) + W(9, 1008209269, 1035567225, -1094749758, 1042520123) + + W(10, -1111681950, -1112108944, 1026827799, -1113291743) + + W(11, -1095155767, 1054820368, 1023800268, 1010334934); + sum2 = W(0, 1018519238, 999332143, 1041061518, 1033756160) + W(1, 1071473984, -1074851124, 1015687849, 1021267259) + + W(2, -1105547391, 1042746528, 1066765865, -1079967238) + + W(3, -1123243110, 1021268373, 1034089943, 1026544409) + + W(4, 1067795051, -1079279124, -1154321191, 1001850235) + + W(5, -1097359239, 1057524548, 1059938647, -1081222132) + + W(6, -1147705571, -1122367554, 1024181853, -1128118669) + + W(7, -1126584943, 1036308208, -1137574530, -1149097003) + W(8, 964634475, 1033087855, -1109247299, 995399503) + + W(9, 1025499637, 1028798873, -1139074510, -1129467393) + + W(10, 1002507759, 1006964374, -1123293958, -1120881342) + + W(11, 1038775557, -1131901697, -1137941026, -1131371017); + WS(1032292188, -1145187004); + sum1 = + W(0, -1121091224, 1026282854, -1110430066, 1041424886) + W(1, -1163709786, -1130362518, -1124591439, 1032165735) + + W(2, -1099744666, 1053335502, -1097458647, 1026340962) + + W(3, -1121198813, 1048823572, -1088767505, 1045555550) + W(4, 1040806261, 1020242430, 1009701366, -1113803654) + + W(5, -1109489438, 1044961340, 1038271382, -1136150382) + + W(6, 1007646671, -1119045850, 1041537816, -1098280566) + + W(7, 1040783354, -1117600916, 1026658136, -1092992668) + W(8, 1047050636, 1043075732, 1037260307, 997023189) + + W(9, 1020346030, 1019935126, -1121506375, -1107270401) + + W(10, 1000329008, -1124456788, -1122546321, -1119672872) + + W(11, -1110555528, 1047792295, -1120965766, 1026784415); + sum2 = + W(0, -1120115102, 1027036707, 1028744443, 1037973272) + W(1, -1111409649, -1114092190, 1024423113, -1119221834) + + W(2, -1122478763, 1049287438, -1096539764, 1034186497) + W(3, -1131404107, 1034928052, 1034534080, 1047707985) + + W(4, 1032305459, -1111870688, -1162462122, -1115806512) + + W(5, -1117650486, 1065549495, 1059270295, -1104163224) + + W(6, -1116017912, -1133321326, -1108495610, -1079218451) + + W(7, 1053073262, -1116841516, 1035047655, -1101382306) + + W(8, -1105332910, -1101676179, -1108544028, 1038206879) + + W(9, -1146105278, 1029706393, 1038914207, -1109811124) + + W(10, -1125217018, 1004549098, 1011265421, 1023154260) + + W(11, -1113944011, -1116861489, 1023662974, 1021319568); + WS(1065238444, 1029810764); + sum1 = W(0, -1117664959, 1035631050, -1105662947, 1044376095) + + W(1, -1180059800, -1144996235, 1033625479, 998132025) + W(2, -1110409480, 1041425605, 1029921727, 1002652741) + + W(3, -1121511107, 1046740798, -1115600622, -1117226857) + W(4, 1047596134, 986508455, 1026353828, 1049143094) + + W(5, -1117398499, -1088462543, 1050498082, 1031133314) + + W(6, -1154871713, 1044265580, -1101622768, -1090821428) + + W(7, 1032067983, -1119889178, 980940712, 1037075730) + + W(8, -1109487884, -1099167518, -1134957959, 1038687768) + + W(9, 1018182811, 1028486865, -1112099063, 1039936213) + + W(10, 1021107193, -1122286680, 1025470327, -1128624253) + + W(11, -1120941494, -1117520833, 1019194744, 1032539083); + sum2 = + W(0, 1027136813, -1109237812, -1131106290, 1028116649) + W(1, -1115313320, -1132573667, -1126103938, 1029641913) + + W(2, 1047599733, 1041211299, -1119521049, 1022404146) + + W(3, -1134438995, -1108335880, -1097134429, -1092284431) + + W(4, -1100904528, 1016921434, 1023841561, 1016569578) + W(5, -1076957808, -1103461794, 1040752059, 1027441157) + + W(6, 1003327910, 1032415828, 1044824498, 1073063564) + W(7, 1045381268, -1106952976, -1130954514, 999116870) + + W(8, 1037851390, -1111597872, -1112786376, 1036890340) + + W(9, -1135210803, 1003972614, -1123469057, 1033926584) + + W(10, 1034574746, -1110049884, 994333964, -1138234067) + + W(11, 1043898273, -1115472968, -1137298819, -1139674515); + WS(-1111543132, 1053084187); + sum1 = W(0, 1033211657, 1029336727, 1056808676, -1089574549) + + W(1, -1112225370, 1035575202, -1116548448, -1100473306) + + W(2, 1042013257, -1097689349, 999357322, -1114691470) + W(3, 1043994373, 1036113196, 1061342772, -1087296749) + + W(4, 1042186215, 1040681774, -1112421659, -1100606697) + + W(5, 1060655799, -1082434496, -1100755553, 1045312421) + + W(6, 1033458902, -1117467379, 1059165410, -1087667391) + W(7, 1042539448, 1039236406, 1042588164, 1024205686) + + W(8, 1057924951, -1091727169, 1041805473, 1042949980) + + W(9, -1106715184, -1098518156, 1042727104, -1095816456) + + W(10, -1105873704, -1113675407, 1042106754, 1010302211) + + W(11, 1057649845, -1093601226, -1114265639, 1035739628); + sum2 = + W(0, 1036389819, 1006854517, 1049279774, -1104547241) + W(1, -1140479293, 1032391465, -1106855677, -1114095075) + + W(2, -1106885840, -1120692701, -1096936463, -1098591621) + + W(3, 1031620401, 1044374087, 1052305677, 1045612807) + W(4, 1051540981, -1115708783, -1109245550, -1105124479) + + W(5, 1054861276, 1058901209, -1092919117, -1081363743) + W(6, 997072274, -1105277948, 1057655059, 1054428932) + + W(7, -1129490106, -1090444858, -1132619277, 1043212463) + W(8, 1046093411, 1034709627, 1034565381, 1017473602) + + W(9, -1096737767, -1104242691, -1094755169, 1054770354) + + W(10, -1092959620, -1098730750, 1049991282, -1113287926) + + W(11, 1057224822, -1094426804, 1030915645, 1044114915); + WS(-1084020140, 1068126260); + sum1 = W(0, 1006295077, -1156074282, 1049019906, -1097931528) + + W(1, -1117241095, -1123621559, -1137936208, -1103771606) + + W(2, 1049395923, -1091558419, 1040511881, 1023627215) + + W(3, 1034316741, -1104490636, 1061237576, -1086810430) + + W(4, 1040083512, -1108467318, -1149620895, 1038480604) + + W(5, 1033598516, -1099102215, 1044377854, -1115694024) + + W(6, -1141477121, 1018703789, -1094713154, 1059440745) + + W(7, 1044961993, -1120119968, -1110713826, 1041233006) + + W(8, -1098857908, 1018408058, -1146014215, -1145494414) + + W(9, -1119964867, 1031629367, 1023717620, -1122483505) + + W(10, 1038059949, -1122997930, -1159113641, 1005339683) + + W(11, 1036793310, -1108866660, -1129764324, 1007729326); + sum2 = + W(0, 1015277664, 1025130698, 1027591084, -1117062871) + W(1, -1101670769, 1019605180, -1114453597, -1134749664) + + W(2, 1033917561, -1115087054, -1114105716, -1131991228) + + W(3, 1036987011, 1032879133, -1126832950, 1055956188) + + W(4, -1097729634, -1104354242, -1112547401, -1134874844) + + W(5, -1114337945, -1108159193, -1123425664, -1097147867) + + W(6, 1038859445, -1112115766, 1026538526, 1052262112) + W(7, 1058230624, -1101321392, -1116674795, 1018163604) + + W(8, -1114930086, 1032023389, 1047994902, -1100180330) + W(9, 983557058, -1128408082, 968847366, -1105383385) + + W(10, 1046456588, -1106875572, -1127718668, 1003243264) + + W(11, -1132712652, -1120777676, 1042953566, 1009596296); + WS(1044178094, -1112419455); + sum1 = + W(0, -1131480425, 1028145051, 1050373320, -1113746394) + W(1, -1097767254, 1005496122, 1014469647, -1106904202) + + W(2, 1050878345, -1101407218, 1036986154, 1009224698) + W(3, 1033460669, -1114114798, 1059597501, -1089975999) + + W(4, -1106579916, 1010606701, -1111970637, -1103921210) + + W(5, 1061375910, -1083033439, 1025899544, -1155279741) + + W(6, 1018155424, -1104772954, 1062331213, -1089702156) + W(7, 1034746546, 1027233072, 1028778773, -1105642670) + + W(8, 1054878354, -1100724747, 1032512190, 1015772371) + + W(9, -1120733619, -1122369255, 1050980308, -1095744476) + + W(10, -1113254377, -1131981388, 1036392279, -1105836421) + + W(11, 1057064179, -1096031599, -1120232930, -1140419566); + sum2 = + W(0, 1044058702, -1120335698, 1041124235, 1021344157) + W(1, -1087803383, 1057976488, -1105410550, 1016883675) + + W(2, 1035757794, -1104385836, -1085495757, 1058928386) + W(3, 1033398047, 1032351899, -1105578788, 1068114101) + + W(4, -1081571635, 1051244378, -1119512188, -1103364509) + + W(5, -1105098443, 1052569394, -1086748155, 1048853947) + + W(6, -1121578506, -1123961512, 1037191880, 1027075889) + + W(7, 1031589750, -1130402783, -1129503263, 1043612533) + + W(8, 1025665274, -1095293941, 1048618044, -1124003088) + + W(9, 1005093795, -1110855577, 1024086018, -1113226379) + + W(10, -1121765158, 1010599720, -1116781712, 1044044613) + + W(11, 1023695645, -1106316439, 1039073287, -1120128288); + WS(-1095246679, -1087513362); + sum1 = W(0, 1027634667, 1005582218, 1054139855, -1093682933) + W(1, 1002440559, -1142612208, 998672596, 1034119552) + + W(2, 1049059024, -1099832192, 1040529483, 1024339285) + + W(3, -1149130110, -1098084154, 1052649123, -1089047862) + + W(4, -1122861959, 1025618962, 1026870673, -1141537276) + + W(5, 1065515488, -1088853800, -1126585773, 1014930618) + + W(6, 1006905115, -1098155038, 1064339388, -1084571535) + + W(7, -1099945809, -1117714471, 1027369115, -1115874224) + + W(8, 1053781857, -1097071228, -1105399392, -1136815962) + + W(9, -1156874400, -1130796284, 1050040635, -1107001190) + + W(10, 1023818537, 1018962754, 1027010724, -1110211381) + + W(11, 1056042372, -1095503614, -1117200441, 1028298602); + sum2 = + W(0, 1021849900, 1041438934, -1128850825, 1035803991) + W(1, -1100551265, 1028120411, -1131412357, -1119369172) + + W(2, 1021256857, -1111021944, 1042971908, -1109090883) + W(3, -1118206650, 1040592619, 1046750596, 1038923952) + + W(4, -1109478151, 1026074630, -1125196517, -1114002177) + + W(5, 1025252531, 1072474004, -1083937830, -1100770381) + W(6, 1035111533, 1032710077, 1048692472, 1077302109) + + W(7, -1067064389, 1049109423, -1144348946, 1044882286) + + W(8, -1128830461, -1095554578, -1084038225, 1041329596) + + W(9, 1021086832, -1106944856, 1032666924, 1044371493) + W(10, -1106119426, 1033664959, 1020034266, 1034465258) + + W(11, 1034167215, -1126088605, -1103479472, -1114595648); + WS(-1086863724, -1072185677); + sum1 = + W(0, 1028385114, 999422396, 1054099261, -1096116227) + W(1, -1144842721, -1139590961, -1117432553, -1108936247) + + W(2, 1053618221, -1097427086, 1026659130, 1021035463) + W(3, 1039695343, -1104614655, 1060257868, -1085349189) + + W(4, 1037424170, -1123772160, -1109809663, -1104994067) + + W(5, 1062802560, -1083398775, 1038629270, -1103266023) + + W(6, 1021420394, -1154652341, 1056152893, -1099176000) + + W(7, 1048207210, 1017905387, -1123921882, -1146863602) + + W(8, 1045520765, -1110026089, -1118540449, -1111374457) + + W(9, -1130768465, -1114930982, 1044268562, -1104661441) + + W(10, -1129199023, 997564786, 1022384484, 1034006493) + + W(11, 1050379178, -1115290030, -1101129750, -1108736604); + sum2 = + W(0, -1122660132, 1040406414, 1007232002, -1096101684) + W(1, -1114861255, 1041847394, 1028330563, 1017997140) + + W(2, 1025921746, 1022732374, 1041150821, -1105481885) + W(3, -1115262781, 1025264396, 1043786284, -1102241564) + + W(4, -1094431556, 1055232297, 1045687787, -1103384157) + W(5, 1040909479, 1055010544, -1078483413, 1061241514) + + W(6, -1108704409, -1151694751, -1108714653, 1057419270) + W(7, -1079156700, 1063042984, 1029063313, 986929807) + + W(8, 1043690826, -1126901852, -1078269109, 1067726336) + + W(9, -1116092784, 1026201848, -1119932664, 1047767958) + + W(10, -1092610189, 1054314043, 1013546756, -1115691336) + + W(11, 1038266954, -1115096031, -1098859524, 1052159629); + WS(-1100931758, -1079897221); + sum1 = + W(0, 1002503979, -1105750735, -1109125113, 1042140489) + W(1, -1126416416, -1119888216, 1034941050, 1038153885) + + W(2, 1017797614, 1051948423, 1024057510, 1035399096) + W(3, -1106318298, -1105238364, -1095922988, 1034322060) + + W(4, -1103862864, -1104877795, 1040768819, 1049149819) + W(5, -1090093369, 1059094088, 1040510958, 1042879258) + + W(6, -1115730241, 1028324215, -1091054939, 1049017573) + + W(7, -1112163155, -1120272065, -1141069099, -1106412131) + + W(8, -1102230944, 1050624300, -1106256757, -1112985689) + + W(9, 1027555620, 1039911116, -1127686569, 1045992036) + + W(10, 1017980086, 1033961137, -1123362142, -1114353739) + + W(11, -1097766172, 1043140938, 1018029782, -1117933580); + sum2 = + W(0, -1118098210, 1039272612, 1033865352, -1107428188) + W(1, 1041731770, -1138511840, -1106915273, -1120265428) + + W(2, 1043187452, -1111026913, -1108614463, -1129236656) + + W(3, 1038839398, 1047577900, -1107536005, 1034998667) + + W(4, -1104254290, 1049639209, -1115506453, -1112696018) + + W(5, -1090204449, 1068488571, -1073443109, 1065503173) + W(6, 1032442192, -1123012045, 982996928, -1096446249) + + W(7, 1040126834, 1035312463, 1016491198, -1123570623) + W(8, 1042935567, 1013219076, 1041050172, -1104804103) + + W(9, 996494424, -1121836120, -1120793710, -1101384300) + W(10, 998034192, 1040382819, -1145352236, 1026228225) + + W(11, 1030161309, 1023915500, 1038049010, -1106858818); + WS(1060652716, -1122012062); + sum1 = + W(0, -1136700086, -1113850590, -1093156519, 1056384406) + W(1, -1101587139, 1021600449, -1120727741, 1022556549) + + W(2, -1098011208, 1052398904, -1106430355, -1114714908) + + W(3, -1136846536, 1030968440, -1100004083, 1062519968) + + W(4, -1132405458, 1016310696, -1102129381, 1036351121) + + W(5, -1079676696, 1061355096, -1107897312, -1113036024) + + W(6, 1035874533, 1049961616, -1097573322, 1059521337) + W(7, 1048756772, 1022545811, -1111246103, -1119797202) + + W(8, -1087704492, 1052440101, -1109566980, 956768943) + W(9, 1019584793, 1037896960, -1096988084, 1048869443) + + W(10, 1020055223, -1121983087, -1111739075, 1033695743) + + W(11, -1092447605, 1048091420, 1043876621, 1018273385); + sum2 = W(0, -1134928360, 1033535752, -1108867200, 1056652859) + + W(1, -1094974673, 1034782854, 1028726521, -1102458559) + + W(2, 1031241917, 1048810536, -1100509489, -1123876292) + + W(3, -1102649789, -1114678181, 1028753942, 1051021341) + + W(4, -1100441695, -1100025719, 1041988393, 1050124192) + W(5, 1056497468, 1036208495, 1034323322, 1037384204) + + W(6, -1105797881, -1102215651, -1090602802, -1099717915) + + W(7, -1115767916, -1098766868, -1125378124, 1032107719) + + W(8, 1057082230, -1114740583, 1041259997, 1024245049) + W(9, 1034345705, 1014416128, 1023046526, 1002570703) + + W(10, -1122784508, -1114560124, -1134413224, -1119150822) + + W(11, 1025484112, -1101875417, 1037850051, -1112409616); + WS(-1104650926, -1097620835); + sum1 = + W(0, -1121602225, 1025795527, 1046345311, -1105175020) + W(1, -1160491701, 1000929055, 1021304961, -1105437010) + + W(2, -1108985665, 1045711217, -1117138161, -1145522137) + + W(3, -1132438763, 1039870965, 1041625463, -1093274991) + + W(4, 1040158758, -1117941464, 1033606955, -1097752993) + + W(5, -1144407721, 1062570208, 1049985633, -1122762228) + + W(6, -1119908749, 1037504305, -1100934531, -1099088029) + + W(7, 1037586881, -1109694278, 1032325913, -1109081755) + W(8, 1047145475, -1097698093, 1004919651, 1026835862) + + W(9, -1112547088, -1121171172, -1119544288, -1136783989) + + W(10, -1124949278, 1024727664, 1011690407, -1116159153) + + W(11, 1036418740, -1106563213, 999804916, -1126831120); + sum2 = + W(0, -1103930431, -1122873970, 1048581640, -1139346648) + W(1, 1030984702, -1115391660, 1043997541, -1100601593) + + W(2, -1108032519, 1042591516, -1123657132, -1107477718) + + W(3, -1102154605, -1174042309, 1029742536, 1045200151) + + W(4, -1106767363, 1032437784, 1046282803, -1084779372) + W(5, 1068068442, 1052027066, -1086671314, 1025856678) + + W(6, -1106269056, -1114322527, 1051594943, -1098651742) + + W(7, 1024653780, 1036550683, -1116052960, 1046060831) + + W(8, -1119470820, -1115540046, -1127107345, -1121355040) + + W(9, 993204113, -1115511338, -1138871916, 1021777728) + + W(10, -1163609763, -1115373797, -1113135778, 1041954938) + + W(11, 1020181836, -1107159950, -1134598872, -1122730046); + WS(1066180726, 1071088208); + sum1 = + W(0, 1019239309, -1125280121, -1096761986, 1046613601) + W(1, -1107071425, 1022045682, -1139409238, 1001471451) + + W(2, 1012641888, -1137946220, 1047813898, 1006921793) + + W(3, 1016498838, -1110062156, -1103040193, -1089511315) + + W(4, 1045045936, 1010038708, -1117575980, 1036666525) + W(5, -1098591157, 1064065326, 1024305865, 1025055882) + + W(6, 1000209679, 1049354787, -1079760364, 1058946251) + W(7, -1110782371, 990559266, -1113394675, 1048739493) + + W(8, -1090655988, 1056455200, 1013890551, 1028621651) + W(9, 1030691589, -1119525817, -1102803453, 1048597558) + + W(10, 981956228, -1118324476, -1133365628, -1103045922) + + W(11, -1099636767, 1050574049, 1043476657, -1146495466); + sum2 = W(0, -1132513434, 1043448685, -1099364915, -1092624350) + + W(1, 1056566992, -1119372495, -1110784932, -1133524329) + + W(2, 1037755510, 1047633966, -1103089496, -1105722911) + + W(3, 1015163300, -1107748756, -1102119678, -1120785461) + + W(4, 1032253510, -1123661455, 1015068960, 1038994810) + + W(5, 1041992963, 1052941265, -1122308723, -1115405106) + + W(6, 1033174530, -1104237963, 1059473601, -1112171819) + + W(7, 1028984470, -1126727948, -1135254713, -1120882016) + + W(8, 1015880446, -1149514732, -1121912217, 1038410412) + + W(9, 1032888151, -1105704866, 1034086136, -1106883398) + + W(10, 1037486360, -1113287020, -1132281738, 1042278645) + + W(11, -1087682569, 1032085587, -1121651695, 1025242322); + WS(1036385628, 1044378228); + sum1 = + W(0, -1125923878, -1119989961, -1113894352, 1034400041) + W(1, 1040468885, -1119159494, -1122454178, 1024777096) + + W(2, -1109744594, 1050462805, -1118152051, -1136375156) + + W(3, -1106272614, 1045742974, -1081686591, 1057689729) + + W(4, -1112362495, 1016953331, 1034604284, -1106270482) + W(5, 1049041391, 1056885773, -1111838475, 1033159371) + + W(6, -1112814039, -1097223397, 1058546239, -1082103097) + + W(7, 1051410218, -1127987422, 1030894675, -1112273196) + W(8, 1043400251, -1111542214, 1042722054, 1008300000) + + W(9, -1123079474, -1131680651, 1024933634, 1032256832) + + W(10, -1104716944, 1020481857, -1130721815, 974203052) + + W(11, -1127331477, 1030325078, 1028514056, -1122308858); + sum2 = W(0, -1126857538, -1124098806, 1017023528, -1105780084) + + W(1, -1128747572, -1133097491, -1118763531, -1105376950) + + W(2, -1096176503, -1094874635, -1140350635, 1036694112) + + W(3, 1031801448, 1037674477, 1067983244, 1071605005) + + W(4, -1109792866, -1111308161, 1032593429, -1110580495) + + W(5, -1078904043, -1075832971, -1097243929, 1036064001) + + W(6, 1004108563, -1116861031, 1060638644, 1065456263) + W(7, 1040323331, 1039332997, -1119835024, 1039467599) + + W(8, -1111109918, -1112838992, -1114824160, -1103055030) + + W(9, 1016299757, -1109178305, -1098624444, -1104548941) + + W(10, 1033955221, 1027541135, -1169697445, 1033383777) + + W(11, 1040587540, 1006549790, -1127435882, 1022453269); + WS(1044586414, 987793058); + sum1 = W(0, 981244734, -1094962922, 1056192743, -1106851755) + + W(1, -1119312576, -1109764848, 1029861564, -1105742952) + + W(2, 1054313512, -1099782448, 1027895469, 1032524411) + + W(3, -1127551587, -1103252055, 1058042871, -1098041547) + + W(4, 1019737521, -1110892330, 1008852553, -1106380176) + + W(5, 1048369556, -1096188128, -1121596880, 1024237680) + + W(6, -1110264932, 1039776063, -1104749720, 1052995119) + + W(7, -1106765091, -1120426409, -1120415085, 1036900841) + + W(8, -1097596121, 1058305414, -1098125906, 1026360866) + + W(9, -1128191927, 1025145152, -1105335335, 1045503990) + + W(10, -1106717007, -1151171624, -1111219811, 1028803677) + + W(11, -1103570473, 1055249646, -1101993823, 1031597860); + sum2 = + W(0, -1170894487, 1038321486, 1053283699, -1093894288) + W(1, -1100030896, 1046510222, -1116947191, 1032730216) + + W(2, -1102463031, -1109920837, 1047091130, -1098101478) + + W(3, 1031282910, 1034140662, 1044178467, -1089191295) + + W(4, -1097946325, 1046381950, -1112734885, -1104751545) + + W(5, 1054507486, 1065532097, -1095028025, -1113780206) + + W(6, 1042944653, -1102906173, -1128523954, -1115680584) + + W(7, -1094781909, 1020709100, -1112368696, -1115060896) + + W(8, 1038784522, 1029167633, 1050920778, -1114933696) + W(9, 1023647443, -1124833342, -1109068581, 1021288403) + + W(10, -1113980416, -1114621382, -1149951158, -1103764076) + + W(11, -1105151256, 1048070264, 1052479172, -1120673083); + WS(-1114317660, -1079530866); + sum1 = + W(0, 1005492722, -1115918380, -1124407701, -1116105277) + W(1, 1041270838, -1125596386, 1045601427, -1100871485) + + W(2, 1040297908, -1115200394, 1034785295, 1024917256) + + W(3, -1125684614, -1122621547, -1098312611, -1103806788) + + W(4, 1049040249, 1026343653, 1040691817, -1094477942) + W(5, 1054673340, -1097950923, -1103823208, 1033886401) + + W(6, -1138701159, 1044150368, 1041833209, -1088150296) + + W(7, -1129519613, 1039772509, -1122106750, 1041157065) + + W(8, -1120050519, 1040435582, -1121264402, 1028146611) + W(9, 1010492340, 1039210328, -1116922669, 1025767275) + + W(10, -1133614768, 1030520276, -1132247342, 1037992735) + + W(11, 1025359158, 1032362656, -1107139719, 1032249339); + sum2 = W(0, -1155531695, 1035594747, -1111112193, -1101564588) + + W(1, -1116834132, -1130931838, -1116868484, -1130123766) + + W(2, 1034328851, -1113096514, -1115452418, -1123313694) + + W(3, -1135508412, -1121397012, 1033705026, 1029679690) + + W(4, -1152418495, 1018386998, -1106991844, -1115576312) + + W(5, 1050004218, 1048453590, 1029930774, -1127714868) + + W(6, -1135674828, -1126221532, -1117911568, 1050922209) + + W(7, 1007646710, -1121358676, 1001487940, -1107263445) + + W(8, -1123887534, 1043692754, -1114385718, 1023927325) + + W(9, -1119877490, -1121744498, 1017446183, 1034884616) + + W(10, -1122169416, -1115969900, -1131775200, -1125291430) + + W(11, -1110635219, 1032206024, 1016330315, -1122013064); + WS(1066254326, -1103165682); + sum1 = + W(0, 1032736195, -1107990998, 1040177417, -1102376817) + W(1, 1034252186, 1019040113, 1027879829, -1114107453) + + W(2, -1121888407, 1024426522, -1134855959, 1012754494) + + W(3, 1031762634, -1103287009, 1058340070, -1086180914) + + W(4, 1048880356, -1128188760, -1123062443, 1041209406) + + W(5, -1097968365, 1045901207, -1117801777, -1116847305) + + W(6, 1004281096, 1039171204, -1082040497, 1060563077) + + W(7, -1108119503, -1149008906, -1148973229, -1113506869) + + W(8, 1042461256, 1045252895, 1021862138, -1140572507) + W(9, -1119568276, 1029657432, -1110264442, 1035749465) + + W(10, 1017288487, 1021245074, -1130151676, 1042306865) + + W(11, -1106785311, 1042341554, -1125959462, 1010461490); + sum2 = W(0, 1021177914, -1111267114, 1038432054, -1105822865) + + W(1, 1037666445, -1122267795, -1124089023, 1044764288) + + W(2, -1106310853, -1100663157, 1039738660, -1121288215) + + W(3, 1026640236, 1026571855, -1115065858, -1088005063) + + W(4, -1097556837, 1045614354, 1019818775, -1103902938) + + W(5, 1063205014, 1066152263, -1094681119, -1112191805) + + W(6, 1019369915, -1139759728, 1054784388, -1093573252) + + W(7, -1095778937, 1041592438, -1106530127, 1046869720) + + W(8, -1096246655, -1098236584, 1051664274, -1110480242) + + W(9, 1038187852, -1116925721, -1115197568, 1033917272) + + W(10, -1104072801, 1015983837, 1030498751, -1107211067) + + W(11, 1035488589, -1107121631, 1038730556, 1022742082); + WS(1062838508, -1098141683); + sum1 = + W(0, -1134697126, -1129876167, -1116304310, -1099161722) + W(1, 1038618718, 1030514076, 1033720508, 1021336509) + + W(2, -1104597903, 1019102333, 1045312786, -1118743028) + + W(3, -1121504814, 1014720225, -1101916102, 1049624810) + + W(4, 1036131058, -1134396481, -1119656591, 1046652247) + W(5, -1082370571, 1058084844, 1029119981, 1009920435) + + W(6, 950602286, 1047400131, -1091801796, 1053105145) + W(7, -1119759594, -1132133195, -1114868293, 1033072079) + + W(8, -1096699752, 1050650780, -1119884597, -1133963803) + + W(9, 1034808260, -1139606129, -1121911577, 1034036747) + W(10, 1024218735, 990998386, -1113093265, 1026913289) + + W(11, -1098146380, 1048726310, 1017329950, -1121758433); + sum2 = + W(0, -1120814392, 1026947049, -1124609851, 1029294693) + W(1, -1089366560, 1054044776, 1018600110, -1114533760) + + W(2, 1043306429, -1096357662, -1078857162, -1109773692) + + W(3, 1027325255, -1112504706, 1030055965, 1075131584) + + W(4, -1106088729, -1105806639, -1124538308, -1107191892) + + W(5, -1090928488, -1118772404, 1060040329, -1102685120) + + W(6, -1127260613, 1023329910, 1046523168, -1092017575) + + W(7, 1045316672, -1119137158, 1007599328, -1124222597) + W(8, 1015958190, -1113584525, 1047822624, 1032716843) + + W(9, -1128821133, 1024046209, 1022187138, -1109468012) + + W(10, 1021757630, -1120065319, -1125977712, 1019591350) + + W(11, -1115445424, -1105922548, 1038940063, 1016647840); + WS(1054286935, 1054427377); + sum1 = + W(0, -1139016422, 1031868724, -1103470657, 1027450488) + W(1, 1036611766, -1113202838, 1015966225, 1024526894) + + W(2, -1100637795, 1046711412, -1105992614, 1036202402) + + W(3, 1034481375, -1107528289, 1043922306, -1098573729) + + W(4, 1045477269, -1121078688, 1029692191, -1123790766) + + W(5, -1096987004, 1036148808, -1138151730, 1006910195) + + W(6, -1118014037, 1033739398, -1103397016, 1053311986) + + W(7, -1103945702, 1033532379, 1037138557, -1101429240) + W(8, 1045510949, 1016118627, 1013880803, -1135069562) + + W(9, -1107878452, 1035472806, -1113746932, -1127637067) + + W(10, 1041047838, -1112788047, 996243233, -1114181077) + + W(11, 998962565, 1041113135, -1118755335, 1020627009); + sum2 = W(0, 998302909, -1114977231, -1111023634, 1036510752) + W(1, 1004185429, 1033017445, 1020343611, 1031676937) + + W(2, -1115901635, -1117993552, 1041465226, -1113757911) + + W(3, 1029585253, -1113383024, -1091081120, -1099268355) + + W(4, -1113451820, 1021941233, 1014080934, 1053648356) + + W(5, -1095412525, -1083342245, -1115471327, -1161911507) + + W(6, -1135780688, 1044096370, 1066870285, 1034064765) + + W(7, -1118193886, -1120710156, -1115911996, 1042686855) + + W(8, -1137657706, 1037488276, 1023464409, 1018751107) + W(9, 1018594371, -1108781434, 1043350243, 1014772326) + + W(10, -1138084208, -1148724493, -1117868456, 1037265024) + + W(11, -1126645268, -1113946823, 1032826620, 967002060); + WS(1069042774, 1023813606); + sum1 = + W(0, -1120569815, 1029846837, -1087916882, 1052864835) + W(1, 1037940281, -1130288148, 982627530, -1113747494) + + W(2, -1109565588, 1048856613, 1011966045, -1136915076) + + W(3, -1113058670, 1033076468, -1095056850, 1056781822) + + W(4, 1041407837, -1140629239, -1122018428, 1039673254) + + W(5, -1085384902, 1059308179, -1107102153, 1027021082) + + W(6, -1110295833, 1038190732, -1083727323, 1063669175) + W(7, -1111254596, 1007651659, 1021479086, 1046432919) + + W(8, -1089999723, 1059014405, -1110936865, -1128736648) + + W(9, 1001627822, -1134594983, -1094559921, 1044534497) + + W(10, 1025983877, -1139332738, 1013049407, 1016231853) + + W(11, -1094610970, 1048044230, 1046858383, -1114487747); + sum2 = + W(0, -1097118790, -1088323667, 1067177084, 1049654149) + W(1, -1120538318, -1108580354, -1115645027, 1030684990) + + W(2, 1056476304, -1101283859, 1040556965, -1124995735) + + W(3, -1109249259, -1081609065, 1058423359, 1057270411) + + W(4, -1122455315, 1017763415, 1042765123, -1082143899) + + W(5, 1061996602, 1055747315, -1120372038, -1114753052) + + W(6, 1015795842, -1102809807, 1006287482, -1087207348) + W(7, -1106540179, 1040354664, 1028792702, 1059694558) + + W(8, -1085597397, -1106003210, 1042932361, 1033427208) + + W(9, -1116071919, 1064574838, -1080103447, 1023804763) + + W(10, 1048665861, -1098395984, -1105083736, 1072110122) + + W(11, -1081832849, -1090423898, -1101912272, 1049644025); + WS(1046279854, -1100682627); + sum1 = W(0, -1155754074, -1109896894, -1107576521, 1035511522) + + W(1, 1002805634, -1116898232, -1110611178, -1114421037) + + W(2, 1030120983, -1124410677, -1114543731, 1008443967) + + W(3, 1022309140, -1131162933, -1094043528, 1038811574) + + W(4, 1039227081, -1122237996, -1118509483, 1027993210) + + W(5, 1062355587, 1059809630, -1113128332, -1141634631) + + W(6, -1109973457, 1040243222, -1094900881, 1038778317) + + W(7, -1105636701, 1021837827, 1022155595, -1117693450) + + W(8, -1110047247, 1046487839, -1109843880, -1132048229) + + W(9, -1107208537, 1019138289, -1110631994, -1127423844) + + W(10, 1004796827, -1123472091, -1117715774, 996768085) + + W(11, -1107567326, 1039784548, -1112311954, -1128081977); + sum2 = W(0, -1155805362, -1107499970, 1022847832, 1035480223) + + W(1, -1120962569, -1110725720, -1111094572, -1112866732) + + W(2, 1044264749, -1148903065, -1114470280, 1021130376) + + W(3, 1028160711, -1106540686, -1155674450, 1040150233) + + W(4, 1010774604, -1120260095, -1123681391, -1140638716) + + W(5, 1057429467, 1045538131, 1016428102, 1009992044) + W(6, -1116453985, 1031083122, -1106158641, 1031696457) + + W(7, -1120179561, 1026515918, -1119301235, -1139408516) + + W(8, 1025824831, 1041846065, -1118124541, -1114275912) + + W(9, -1108559318, 1034592379, -1111164410, -1120456085) + + W(10, 999266665, 1011855672, -1115385578, -1116565509) + + W(11, -1121519923, -1129601606, -1119709653, -1115407958); + WS(1068834358, -1130516755); + sum1 = + W(0, -1110020716, 1034114243, 1048068617, -1102038774) + W(1, 1031998965, -1110620517, 1043574522, -1095778974) + + W(2, 1048936405, 1035735542, -1100504766, 1038840817) + W(3, -1110718798, 1047457188, 1038642250, -1105529591) + + W(4, 1047377413, -1109142655, -1129582842, -1108460854) + + W(5, -1114164062, -1096174934, -1130108598, 1023990363) + + W(6, -1114402010, 1054126843, -1110583455, -1112126358) + + W(7, 1044906670, -1122044916, 1034180284, -1096959660) + W(8, 1049433806, 1043709316, -1095231947, 1040978881) + + W(9, 1025857751, 1033414773, -1136840220, -1123546692) + + W(10, -1130058411, -1131191403, -1111247176, 1039130852) + + W(11, -1119539023, -1112879245, 1035429307, -1115530151); + sum2 = W(0, 970017593, -1108165952, 1047729556, -1102798485) + + W(1, -1142827268, 1029593938, -1125442959, 1040753488) + + W(2, 1000227776, -1088611471, 1049645408, -1108133201) + + W(3, -1107196630, 1033984686, 1038319755, -1087549565) + + W(4, -1127043239, -1114349374, -1108273260, 1051322703) + + W(5, 1055231112, 1062180091, -1103837458, 1035145460) + + W(6, -1130992285, -1113564209, -1094436986, 1046553690) + + W(7, -1107399737, -1114342182, -1132402709, 1041587650) + + W(8, 986706110, -1113546876, 1048231400, -1146643074) + + W(9, 1017358256, -1116630320, -1124437274, -1120036494) + + W(10, -1124561928, -1126967424, 988670622, -1122802752) + + W(11, -1132214419, 1032902155, -1145381770, 1014303584); + WS(1067517750, 1033639701); + sum1 = + W(0, 1025509678, -1102897085, 1023511162, 1037697110) + W(1, 1039047450, -1138182274, -1130341242, -1132678155) + + W(2, -1096924480, 1040728225, -1108434135, -1138791135) + + W(3, -1120272434, -1151042791, -1094474081, 1056422164) + W(4, 1032921189, 1010850641, 1018375590, 1013105800) + + W(5, -1086033191, 1062857884, -1122589009, 1034477848) + + W(6, -1116961737, 1041000592, -1085852953, 1058773976) + + W(7, -1100255843, -1112868181, 1026047982, 1032243033) + + W(8, -1093123217, 1063905370, -1106044526, 1026848855) + W(9, 1025041660, 1034904976, -1093479580, 1050274619) + + W(10, -1112977566, -1122948276, -1113724179, -1123793645) + + W(11, -1091335173, 1057695471, -1136654701, 1007925107); + sum2 = + W(0, -1101843642, -1101718380, 1046322966, 1051125372) + W(1, -1084762721, 1050651985, 1047092496, -1110599661) + + W(2, 1053918698, -1092942861, 1058235489, -1101055683) + + W(3, 1032746990, -1127672356, -1100340247, 1040369276) + + W(4, -1090389206, 1050412863, -1098074183, -1096713677) + + W(5, 1069438643, 1074732797, -1088693676, -1103557505) + W(6, 1053786699, -1104014372, 1025809994, 1050011098) + + W(7, 1053232821, 1052371166, -1096910060, 1035860070) + W(8, -1083706115, -1080423025, 999981171, -1099152238) + + W(9, 1043846267, -1097849415, 1048729218, -1117530220) + + W(10, -1097505133, 1041618808, 1023876031, 1051096852) + + W(11, -1081917128, -1091623712, 1050919626, -1123531943); + WS(-1098378327, -1087753140); + sum1 = + W(0, -1149815841, -1123262056, -1110243207, 1053738584) + W(1, -1096838314, 1031741109, 1013838405, -1131552366) + + W(2, 997589309, 1025605911, 967065877, -1135340592) + W(3, 1021155853, -1114416842, -1104972312, 1049179692) + + W(4, -1108406847, 1029594857, 1025974631, -1103162646) + + W(5, 1042062186, -1094476095, -1130981226, -1145022506) + + W(6, 1017740987, -1099404299, 1057054155, -1093068705) + W(7, 1023051300, 1005012974, 1020943940, -1100518162) + + W(8, 1059648114, -1101042271, 1010424693, -1112923496) + + W(9, -1137239299, -1111541722, 1047878460, -1111532695) + + W(10, -1117167136, 1030823984, 1031952605, -1098489580) + + W(11, 1061110492, -1100382705, 989087216, -1113821120); + sum2 = + W(0, 1034695587, 1032463913, -1087773887, 1051055536) + W(1, -1103774157, 1028563957, -1111830177, 1031752431) + + W(2, -1104893727, 1010301739, 1003908630, -1111301343) + + W(3, 1017885202, -1103205904, -1114987001, 1045597173) + + W(4, -1107230114, 1042437558, -1116805918, 1045285117) + W(5, 1061301409, 1065451004, 999416278, -1106181364) + + W(6, 1039973913, -1092035876, 1053784665, 1036331211) + W(7, -1118216068, 1014136811, -1113376464, 1044034906) + + W(8, -1096259933, -1101789830, 1047293827, -1127455968) + + W(9, 1024357631, -1097056010, 1015259894, -1105822235) + + W(10, -1119063058, -1137717779, -1109344122, 1034392181) + + W(11, -1095057905, -1098597360, -1139528651, 1017174230); + WS(1051991511, -1090129628); + sum1 = + W(0, -1119709994, 1035475128, 1044364174, -1099369674) + W(1, 1024914253, -1122358045, 1028979258, -1103260128) + + W(2, 1048862488, -1107028176, 1037758213, -1142000036) + + W(3, 1025569135, -1099928080, 1054464119, -1092954947) + W(4, 1045752341, -1110227337, 1025156752, 1041023848) + + W(5, -1103260308, 1048877896, 992983000, 1023847918) + W(6, -1113846787, 1030722332, -1090331224, 1036105176) + + W(7, -1115078629, 1018698636, 1032797781, 1040845476) + W(8, 1039529634, -1113372113, 1027244574, -1139349278) + + W(9, -1137003429, 1015665914, 1015668019, -1104520406) + + W(10, 1039091960, -1131269376, -1126457798, 1032471277) + + W(11, 1036006161, -1111431094, -1113568276, 1004297100); + sum2 = + W(0, 1043798657, -1098470129, -1126555274, 1029962999) + W(1, 1028782608, -1131048284, -1117698064, -1096590117) + + W(2, 1047971790, 1037727050, -1161955740, 1022180969) + W(3, -1102458928, -1084690772, 1067678357, 1008201251) + + W(4, -1103096568, -1120783295, -1101130902, 1065791971) + + W(5, -1099131342, -1083609361, 1051059538, 1014843769) + W(6, 1025730631, -1123809426, 1036453804, 1031198846) + + W(7, -1106261335, 1020274026, 1026623851, 1019910088) + + W(8, -1117295572, -1113754273, 1041141064, -1111232000) + W(9, 995294154, 990258218, -1116170672, 1030505142) + + W(10, 1028328942, -1127235720, 1012466631, -1124630920) + + W(11, 1010360391, -1136369090, -1119361560, 1001879503); + WS(1062559660, 1025273829); + sum1 = + W(0, 1017067222, -1098241838, -1088364567, 1060515311) + W(1, -1113064427, 1036248943, 1004255955, 1041017424) + + W(2, -1088941672, 1050253504, -1115329590, -1133026900) + + W(3, 1019590495, -1136327879, -1087512143, 1064814036) + + W(4, -1113817187, 1008140615, -1109975080, 1032386976) + + W(5, -1083706517, 1061681108, -1146803505, 1028690158) + W(6, 1028071367, 1031451349, -1089169701, 1061080357) + + W(7, -1112935650, 1010963867, 1004648665, -1112687016) + W(8, -1092690193, 1052988124, 1031379878, 1030651112) + + W(9, -1129853588, 1040197151, -1100415991, 1048643203) + + W(10, -1112391860, -1133141907, 999516190, -1105242363) + + W(11, -1093365052, 1050105214, 1051227835, -1139571464); + sum2 = + W(0, 1058977722, -1088438618, -1070888183, -1080154822) + W(1, 1057028315, 1020668753, -1123128465, -1084402469) + + W(2, -1068917363, -1109667848, -1133954517, -1117456198) + + W(3, 1051128320, -1097793743, -1079680807, -1080832517) + + W(4, 1057005952, 1031920962, 1025585093, -1092491618) + W(5, 1078112044, 1058335327, -1089499329, 1039195999) + + W(6, 1043020026, -1090336452, 1082393215, 1067339759) + W(7, 1038175360, 1046190750, -1090331128, -1094761348) + + W(8, 1070728174, 1057746923, -1096630558, -1139309423) + + W(9, 1037612985, 1032815200, -1090225897, -1122043266) + + W(10, 1051816122, -1116527206, -1101815127, -1080227574) + + W(11, 1066541275, 1067785018, -1086032969, 1046599598); + WS(-1077531606, -1068627295); + sum1 = + W(0, -1124767318, -1113367136, -1095446127, 1055377197) + W(1, -1111814927, -1126382267, 1034866077, 1048375560) + + W(2, -1099058463, 1047513184, 1045191539, 1025894069) + + W(3, -1101653116, -1104403272, -1090535733, 1058086815) + + W(4, -1094831865, -1117513042, -1130761376, 1049955828) + + W(5, -1087242437, 1061174628, 1048150628, 1008100281) + W(6, -1106412978, 1036710310, -1088900579, 1057172304) + + W(7, -1103308083, 999030326, -1121310187, -1108970480) + + W(8, -1096168584, 1056094244, -1102502166, -1115104524) + + W(9, 1040285922, 1049541454, -1097928011, 1047121222) + + W(10, 1043510842, 1032672660, -1107982930, -1107579101) + + W(11, -1095682732, 1054731422, -1103869114, 1025118882); + sum2 = + W(0, -1118325221, 1021086937, 1043003051, -1131106753) + W(1, -1122810381, 1007248641, -1109912068, -1119472758) + + W(2, 1026424546, 1030452362, -1109242129, 1007569065) + W(3, 1055626857, 1051951524, -1092928023, -1103671831) + + W(4, 1034708821, -1112697430, 1073210842, 1028908234) + W(5, -1081037490, -1079815727, 1035695099, 1034566233) + + W(6, 1050117205, 1044779683, -1093398148, -1105002867) + + W(7, 1037167425, -1131640977, -1108710534, 1039597247) + W(8, 1044106321, 1032627417, -1112762482, 1020894429) + + W(9, 1007734945, -1130127373, -1119182686, -1108845723) + + W(10, -1120996683, -1144614067, 1005945059, 1026547602) + + W(11, 1019051617, 1023992222, 999154803, 1009135009); + WS(1027136184, 1037475189); + sum1 = + W(0, 1032095571, -1116112165, -1115063802, 1049018533) + W(1, -1119314641, -1107767341, -1100957374, 1049686375) + + W(2, 1038845436, -1106083983, -1120251015, 1047825580) + W(3, 1042581547, 1028374302, -1088748902, 1046087792) + + W(4, 1034473457, -1104556803, 1008293424, -1096656387) + W(5, 1053200569, 1044615055, -1099043646, 1041068763) + + W(6, -1125080965, 1033692244, 1024446429, -1090279185) + W(7, 1029265287, 1035958465, 1046313162, -1105885187) + + W(8, -1103807360, 1052904956, 1033985068, -1106489925) + + W(9, -1104233593, -1122471385, 1048125173, -1106111045) + + W(10, -1106885357, 1037737330, 1032243376, -1122778646) + + W(11, -1114896431, -1113201013, 1045413959, -1123269230); + sum2 = W(0, -1109957285, 1028061230, 1045893852, -1110812851) + + W(1, -1108048047, 1027149256, 1046942588, -1090820835) + + W(2, 1047577084, 1048459161, -1114577527, -1106934834) + + W(3, -1108558913, -1168618571, -1096957845, 1058947879) + + W(4, -1104353646, -1104794282, 1035311457, 1053631926) + + W(5, -1097789717, 1028951753, 1041621301, -1139749789) + + W(6, -1103268017, -1140171429, 1058472778, -1086199154) + + W(7, 1047742834, -1105608688, 1020819182, 1024395745) + W(8, 1010859305, 1018177816, -1101676043, 1051639728) + + W(9, 1017489970, 1034074787, -1118924631, -1119421881) + + W(10, 1030918112, -1105627073, -1119040125, -1111153127) + + W(11, -1134098557, 1029986143, -1110045381, 1035525353); + WS(1059085676, -1120419895); + sum1 = + W(0, -1123531970, 1010567522, -1140828475, 1031892193) + W(1, -1126417758, 1013434325, 1015920803, 1041225150) + + W(2, 1042370229, -1105839574, 1021017477, -1117671948) + + W(3, -1129458830, 1048968044, -1081896608, 1052692461) + + W(4, -1106306215, 1033141013, 1003238718, -1107069702) + + W(5, 1061545382, -1113798029, 1033163859, -1110196995) + + W(6, 1024388894, -1107554082, 1057779808, -1080962214) + W(7, 1051334024, 998455538, 1019022757, -1131681870) + + W(8, 1048429719, 1023517883, 974463598, -1104852314) + W(9, -1122285937, -1110859547, 1046207852, -1107360247) + + W(10, -1137698561, -1130795454, 1029064795, 1018058500) + + W(11, 1043188126, -1109838114, -1182091254, -1115208005); + sum2 = W(0, -1115293356, 1051048471, -1116254969, -1108089569) + + W(1, -1110389222, 1032305896, -1104270657, 1028093784) + + W(2, 1055158904, -1104160418, 1040482382, -1109483288) + + W(3, 995357221, -1111420185, -1108447426, -1113016550) + + W(4, -1105273681, 1033267880, -1140125409, -1087783718) + + W(5, 1057721666, 1060085251, -1106428297, -1106001572) + + W(6, 1041981586, 1031459460, -1086769840, 1041174723) + W(7, 1046452617, -1115354420, 1016190873, 1035133120) + + W(8, -1119040585, -1119561801, 1045849559, -1127947625) + + W(9, -1140513641, 1028088400, -1121069799, -1114345654) + + W(10, 1044224673, -1119205024, -1115228320, 1019234873) + + W(11, 1043934745, -1097229960, -1114369945, 1033437588); + WS(1063842732, 1069263660); + sum1 = W(0, -1134238373, -1122877239, 1055968823, -1099884346) + + W(1, -1101209335, 1027783644, 1031532473, -1122091454) + + W(2, 1052972391, -1097152888, -1119905385, 1025876211) + + W(3, -1118861678, -1114405937, 1057777668, -1088480739) + + W(4, 1025124405, -1133551424, 1031846503, -1102409375) + + W(5, 1062381841, -1081966868, -1166909210, -1124858713) + + W(6, -1118980549, -1105793535, 1065218890, -1086950263) + + W(7, 1045788186, -1146513705, 1032122901, -1113900631) + + W(8, 1051224528, -1107218856, -1105943487, -1136389690) + + W(9, -1119645672, -1129606328, 1055096307, -1097976619) + + W(10, 1011470685, -1153551023, 1033668289, -1133229476) + + W(11, 1043160456, -1106065147, -1107257190, 1024085520); + sum2 = + W(0, 1008982555, 1017497319, -1114050188, 1044555710) + W(1, -1115112254, -1121509319, -1122047761, -1119731325) + + W(2, 1048705804, -1104624717, -1113283108, 1042591944) + + W(3, -1134583037, -1110768789, 1082656561, 1041907901) + + W(4, 1041138312, -1111081434, -1137222855, 1050149080) + W(5, 1079097716, -1088882238, 1033378952, 1018241317) + + W(6, -1140752305, 1041298195, -1069364548, 1050137131) + + W(7, 1048604087, -1128224049, 1029699842, -1094516021) + + W(8, -1064571216, -1099205492, -1105508475, 1008906239) + + W(9, -1114302140, 1037679865, -1105564781, -1109039739) + + W(10, 1026612451, -1118064246, 1026101716, 1029205125) + + W(11, -1121859551, 1040352044, -1131493091, 1024193619); + WS(-1129102704, 1046511454); + sum1 = + W(0, -1120255189, 1003871004, -1098175836, 1060542285) + W(1, -1104614392, -1115237700, 992833099, 1029362986) + + W(2, -1113473140, 1049212165, -1118651222, 1012659838) + W(3, -1134582632, 988783847, -1095364566, 1059935407) + + W(4, -1098721330, 1026034940, -1138794987, 1011030567) + + W(5, -1091886143, 1049733902, -1109648580, -1116104473) + + W(6, -1157138191, -1118838023, 1040190185, -1115543549) + + W(7, -1121023765, 1036784617, -1129425099, -1111313565) + + W(8, -1149570791, 1041064643, -1105481630, -1112251695) + + W(9, 1016407976, -1115457860, 1037653026, -1119854466) + + W(10, 1031662787, 1023835049, -1133147960, -1106432157) + + W(11, 1038304902, 1029519512, -1111089569, -1170197274); + sum2 = W(0, 1039353726, 1022956598, -1093991321, -1088722171) + + W(1, 1039854738, -1125147089, -1104263814, 1036699032) + + W(2, -1154678850, -1088770012, -1104468959, -1123571799) + + W(3, 1027240563, -1120983737, -1089878099, -1101846939) + + W(4, -1096446657, 1036003207, 1028285409, -1106986979) + + W(5, 1067214284, 1070132546, 1029156699, -1117321918) + W(6, 1032871415, -1095425364, 1047639440, 1045480826) + + W(7, -1098508409, 1027342659, -1151417050, -1136397826) + + W(8, 1051464555, -1099095249, 1024325599, -1150420266) + + W(9, 1027668005, -1108376211, -1104038071, 1043597107) + + W(10, -1148394393, -1138411071, 1023556565, -1098325150) + + W(11, 1061372327, -1086577064, 1034968116, 1031516803); + WS(1056411607, -1109579684); + sum1 = + W(0, -1129654332, 1040494825, 1053570965, -1089114662) + W(1, -1099475130, 1041782836, 1027988397, 1031736403) + + W(2, 1051564806, -1091392278, 1018661052, 1032323860) + W(3, 1041758889, -1118623100, 1061336939, -1087917688) + + W(4, 1034322317, 1035039650, 1027974595, -1104250813) + W(5, 1057393436, -1081469355, -1094207710, 1010041732) + + W(6, 1038643645, 1023561152, 1065029703, -1091410052) + W(7, 1052271760, 1041287822, 1038422303, -1115303377) + + W(8, 1052932495, -1085011849, -1096091282, 1020820966) + + W(9, -1115801276, -1111435064, 1051403778, -1108233957) + + W(10, 1036087894, 1036272138, 1047822542, 1037517815) + + W(11, 1056446507, -1089621406, -1095410877, 1043391417); + sum2 = + W(0, -1114696922, 1063327246, -1085101471, -1089121793) + W(1, 1049274948, 1041765085, 1043151870, 1054945342) + + W(2, -1091433742, -1108711949, 1036153834, -1114908726) + + W(3, -1098855398, -1111180476, 1044429796, -1096795753) + + W(4, 1047012469, 1017938665, 1045725515, -1078968963) + W(5, 1071264665, 1049748951, 1043607695, -1113887753) + + W(6, 1041130784, -1075182266, 1068966947, 1041099170) + W(7, 1008700501, 1052357470, -1093166728, -1073598210) + + W(8, 1074573142, -1107925652, -1106854972, -1097732836) + + W(9, 1048010869, -1072729035, 1072575447, -1087601324) + + W(10, -1100708600, 1035577978, -1097485062, -1069127579) + + W(11, 1082548410, 1057234494, -1095686167, -1117196119); + WS(-1075355670, -1094395357); + sum1 = + W(0, -1145694380, 1013276974, 1022872131, -1102394069) + W(1, -1132601278, 1032373060, 1031927794, 1019602069) + + W(2, 1012968093, -1105184299, -1113047243, -1123577887) + + W(3, -1126751284, 1034056645, 1064151904, -1089968245) + + W(4, -1112578984, 1012023536, -1107635165, 1046251906) + + W(5, 1059501808, -1079531190, 1045395638, -1121043161) + W(6, 1035883256, -1107984424, 1052823861, 1040654683) + + W(7, 1035604635, -1136193989, -1117999477, -1101824103) + + W(8, 1052884390, -1097950850, -1102570614, -1124087697) + + W(9, 1025403748, -1117853800, 1040309473, 1021798787) + + W(10, 1016601958, 1014648876, -1135056568, -1113050587) + + W(11, 1051481338, -1099617206, -1117559395, 1015049529); + sum2 = W(0, 1040559153, 1024400373, -1112035522, -1102969122) + + W(1, 1035694118, 1008704054, -1099966915, 1050797480) + + W(2, -1095559069, 1048535090, -1109162397, 1035803260) + + W(3, 1051040838, -1098907063, -1091507667, -1081423354) + + W(4, 1049424016, 1032276403, -1122400566, -1088192853) + + W(5, 1063399780, 1065515124, -1098794388, -1104133833) + + W(6, -1103745056, -1132746540, 1064106398, -1104928579) + + W(7, -1097345189, 1042270874, -1127876766, 1040989775) + + W(8, -1101527709, 1047332946, -1105732065, -1109516912) + + W(9, -1118336076, 999475557, 1025976147, -1171911780) + + W(10, -1107661001, 1033064723, -1122216569, 1024449813) + + W(11, -1118033876, 1047796018, 1036172042, -1106418589); + WS(1045480366, -1089018411); + sum1 = W(0, 956510844, -1147321796, -1098659472, 1046172476) + W(1, -1117032824, 1012429717, 998930446, -1119371847) + + W(2, -1114996930, 1016456206, 1032232105, 992745416) + W(3, -1129843310, 1033743797, -1084286683, 1060852743) + + W(4, 1034928007, -1120189081, -1113698796, 1047477674) + + W(5, -1080535200, 1065762350, 1036591131, -1130833259) + W(6, 1001814128, 993727556, -1100569285, 1055209670) + + W(7, 1034876769, -1112309127, -1126854725, 1019312750) + + W(8, -1095107249, 1054147605, -1103835661, -1162991986) + + W(9, 1033942209, 991522899, -1106428344, 1040201800) + + W(10, -1110790848, 1019870324, -1127622934, -1124727396) + + W(11, -1102902186, 1049320503, -1117790432, -1166423644); + sum2 = + W(0, -1135134951, 1034251754, -1112699779, 1028246411) + W(1, 1024730233, -1141862453, -1138029383, -1112450391) + + W(2, 1048844919, -1097747276, 1036047504, -1116303285) + W(3, 1039247354, 1048129179, -1081251706, 1030988939) + + W(4, 1032907358, 1032058431, -1105815405, 1013788103) + + W(5, -1102377508, -1085286825, -1098604264, 1026446373) + + W(6, 1043479193, -1107279344, 1074756442, 1066704374) + + W(7, -1121203556, -1115422697, -1108579602, -1098532570) + + W(8, -1079912447, 1048531717, -1097926469, 1017067577) + W(9, 1036464698, -1125069222, 1051417558, 1025432715) + + W(10, 1037541288, -1110631868, -1114044136, -1106884027) + + W(11, -1113485350, 1037742006, -1114746618, 1026757097); + WS(-1129198960, -1098545020); + sum1 = + W(0, 1016631370, -1103774667, -1097986678, 1055978916) + W(1, 998946812, -1113370572, -1109829274, 1046260982) + + W(2, -1103302894, 1038066845, 1013747092, 1026014767) + W(3, 1027654249, 1041444949, -1085753764, 1057520791) + + W(4, 1033950432, -1133701934, -1135763497, 1029491033) + + W(5, -1087937321, 1064242364, -1108378356, -1124979408) + + W(6, 1022371969, 1033440347, -1100503343, 1043702710) + W(7, -1149232679, 1034434352, -1109147378, 1047095266) + + W(8, -1092825640, -1106434743, 1039795292, -1123636138) + + W(9, -1124465415, -1135425502, -1114972810, 1042256612) + + W(10, -1134578155, -1133096682, 1000105708, 1031236725) + + W(11, -1092048676, 1048160666, 1047273267, -1110866582); + sum2 = + W(0, 1008784866, -1101060946, 1045200185, 1046672822) + W(1, -1118279822, 994298612, -1111810524, 1041574978) + + W(2, -1109901275, -1123470329, -1113194466, -1124039764) + + W(3, -1123287968, -1113715041, -1111729623, 1052382391) + + W(4, -1105523541, 1016737108, 1035375858, 1009783259) + W(5, -1099551228, 1057574679, -1090683445, 1025528776) + + W(6, -1131156064, -1117592464, 1028611861, 1037781521) + W(7, -1089242363, 1044936991, 1014562100, 1037249766) + + W(8, -1126723736, -1088911756, 1057541056, 1038965019) + + W(9, 1013976797, -1112331585, 1048583824, -1105025107) + + W(10, 1046019340, -1100984465, 1025684805, -1116058888) + + W(11, -1123970907, -1098796399, 1058673062, -1111874598); + WS(1055927127, 1032414456); + sum1 = W(0, 1026777470, -1105922759, 1039415013, -1114467391) + + W(1, 1040445212, -1109775801, -1114645447, 1038629978) + + W(2, -1109541160, 1049649890, -1118657663, 1029983880) + + W(3, -1107741345, -1118870909, -1121580331, -1099187900) + + W(4, 1040802710, -1103039897, 1034928754, 1048976902) + W(5, 1035267569, -1110167275, 1050521172, 1032803169) + + W(6, -1106080726, 1031310464, -1092363639, 1044706191) + + W(7, -1122260014, -1106266495, 1036990351, -1116578243) + + W(8, 1052806443, -1098780639, 1045812872, -1117906236) + + W(9, -1132545269, -1121324945, -1105847083, 1042096283) + + W(10, -1112784326, 1031828590, -1115024108, 1028926430) + + W(11, -1107491323, 1026721601, 1028974308, -1113700371); + sum2 = + W(0, 1046339838, -1095477634, 1041080449, -1106007640) + W(1, 1022253579, -1124447256, -1116647554, 1046850624) + + W(2, -1097525459, 1046513622, -1109703351, 1043170037) + W(3, 1008329020, 1046890022, -1087064144, 1055899106) + + W(4, 1048733947, -1100004355, 1019769686, -1090363791) + + W(5, 1051375999, -1097018549, 1049672544, -1097807314) + + W(6, -1108633040, 1015468535, 1042338708, -1122727333) + + W(7, 1051464963, -1129042543, 1035617664, -1092874283) + + W(8, 1061754259, -1100515622, 1025134369, -1112390214) + + W(9, 1033551944, -1110478242, -1118600243, 1043707610) + + W(10, -1099218588, 1040819075, -1127469148, 1032940188) + + W(11, -1108757958, 1042447169, -1108633308, -1120359161); + WS(1063732396, 1030954530); + sum1 = + W(0, 1032126752, 1036299263, 1040042182, -1085959612) + W(1, 1040218780, 1017251428, 976782235, -1151769923) + + W(2, -1126287138, -1100277765, 1040546448, -1135394341) + + W(3, 1026279044, 1034233519, 1024363996, -1112294345) + W(4, 1044348191, -1164354746, -1118035684, 1048463661) + + W(5, -1092651532, -1099766629, 1048686290, 1013744650) + W(6, 1028715099, 1036782808, -1113174091, 1035866674) + + W(7, 1009750781, -1137751148, -1121995199, 1036166050) + W(8, -1102126950, 1049742039, -1118854702, 972654113) + + W(9, 1032435871, 1020132772, -1118937966, -1116277291) + + W(10, 1040779899, -1123833085, -1124714096, 1046021200) + + W(11, -1096484767, 1041160144, 1026126509, 1032085003); + sum2 = + W(0, 1023560328, -1114346246, 1055635447, 1080093571) + W(1, 1053265582, -1109086292, 1005726416, 1027252420) + + W(2, 1058379047, 1066361916, 1041698127, 1032891532) + + W(3, -1116687692, -1128267680, -1093219742, -1079490865) + + W(4, 1044641580, -1142986448, -1115408842, -1102003721) + + W(5, -1075825777, -1069273193, -1103412699, 1040229437) + + W(6, 1041728877, 1038357336, -1122468504, 1048667285) + W(7, -1104322529, 1008854368, -1105589301, 1012806192) + + W(8, 1043596623, 1040586029, -1123753164, -1116993440) + W(9, 1038558105, 1025579970, -1110943172, 1032482622) + + W(10, -1134749344, -1125346072, -1113100068, 1032847335) + + W(11, 1037773232, -1123027612, 1003892288, 1027065900); + WS(-1091386327, 1040820769); + sum1 = W(0, -1133727678, -1113530145, 1024243708, 1033777591) + + W(1, 1009482248, -1122301794, 1015097725, -1145488419) + + W(2, -1111308865, 1043618337, -1113425624, 1016257779) + + W(3, -1138479056, 1016526204, -1103657483, 1057905859) + + W(4, -1104459527, 1026855702, -1114059050, 1038143634) + + W(5, -1091368514, 1056300329, -1103801765, -1136938187) + + W(6, 1024901707, -1118547201, -1102986721, 1019703993) + + W(7, 1043076580, -1118577003, -1122041679, 1031893970) + + W(8, -1104061090, 1024793576, 1039830345, -1111999542) + + W(9, 1013224377, -1120867010, 1020963773, -1114932462) + + W(10, 1042855834, -1119434421, -1123564392, 1007161468) + + W(11, -1118947879, 1024563890, -1129826522, 1018984621); + sum2 = + W(0, -1118014300, -1107425211, 988341556, -1122432623) + W(1, 1031639360, -1122715046, -1121259996, 1034914627) + + W(2, 1058886039, 1043257251, -1110426684, 1030027284) + W(3, -1118480989, 1057124947, 1080471640, 1049657622) + + W(4, 981320073, 1022014335, -1120519112, 1041680563) + W(5, -1067455811, -1080970083, -1105451271, 1012008135) + + W(6, 1034237400, -1110358856, -1105716188, -1091987171) + + W(7, 1044181951, -1121988626, 1031820662, -1114315301) + + W(8, -1113532913, 1051213388, -1110623014, 1009779611) + + W(9, -1116062192, 1010762999, 1033223294, -1109593637) + W(10, 1038375349, -1113750985, 1029964608, 974005161) + + W(11, -1106855886, 1037720533, 999181553, 1028099986); + WS(1067317974, -1128063738); + sum1 = + W(0, -1112292702, 1047000343, -1088068429, 1048838463) + W(1, -1121751190, 1027999791, 1030230219, 1008892739) + + W(2, -1130941083, -1108932456, 1013016624, 1017454988) + W(3, 1023947008, 1038318737, -1122235065, 1034700890) + + W(4, -1165199081, 1031463650, 1037678225, -1110797816) + W(5, 1055157388, -1096039434, 1039874719, 1025959551) + + W(6, 1016840879, -1118959774, 1048428783, -1113377160) + W(7, 1031603132, 1018062255, 1032095758, -1114918032) + + W(8, 1052878187, -1088738347, 1045859362, -1143147336) + + W(9, 1018620213, -1114992535, 1036886165, -1100769370) + W(10, 1028131502, 1018649043, 1023530868, 1004226268) + + W(11, 1052393190, -1082056652, 1050791676, -1115371169); + sum2 = W(0, 1017164622, -1091622621, 1072454217, 1067262657) + W(1, -1098954881, 1035940089, 1004731920, 1038964407) + + W(2, -1113390241, -1112910469, 1038887363, -1108193245) + + W(3, 1046790460, 1049069382, -1080520963, 1044434118) + W(4, 1033204278, 1032575148, -1106036842, 1047078409) + + W(5, -1071223185, -1073367678, -1106847320, -1127548642) + + W(6, 1036535757, -1107481011, 1059476479, -1099641871) + + W(7, 967303234, 1015223408, -1103678216, -1098544714) + W(8, 1061994978, 1029437169, 1030771421, -1109007913) + + W(9, 1025471738, 1040369699, 1053016271, 1051233508) + + W(10, -1123160801, 1042599225, -1122761780, -1107095641) + + W(11, 1054597152, 1062276141, -1113404397, -1116480773); + WS(-1095745367, -1102532016); + sum1 = + W(0, -1117700567, -1131139906, -1104729417, 1031266390) + + W(1, 1034962037, -1123836106, -1125050061, -1115476726) + + W(2, 1049785973, 1034862742, -1108925228, 1021444802) + W(3, -1104292247, 1044141479, -1096094522, 1043929817) + + W(4, -1121682994, -1112024639, 1032821374, 1043020835) + W(5, -1103984511, 1025371182, 1003529681, 1036065165) + + W(6, -1106685309, 1033588284, -1135965844, 1048857569) + + W(7, -1108409524, -1114922921, 1026094807, 1027591436) + W(8, -1092452582, 1049600882, 1029191534, 1028793076) + + W(9, -1109617979, 1031476842, 1035377859, -1127826823) + + W(10, -1105178749, 1025559229, 1025256272, -1109574827) + + W(11, -1108767399, 1045422790, -1147768356, 1027631502); + sum2 = + W(0, -1102917712, 1050493331, -1104683957, 1038417192) + W(1, 1032679083, -1124032472, -1090566997, 1058641835) + + W(2, -1106617401, -1131983160, -1117134944, -1142618034) + + W(3, -1083236080, 1072277942, -1083529216, 1026745412) + W(4, 1030312114, 1033461689, -1084121809, 1066117726) + + W(5, -1110147426, -1097349120, 1045086676, -1107466492) + + W(6, -1092542987, 1055792221, 1053260074, -1092834676) + + W(7, -1115504874, 1040055828, -1098664696, 1016159325) + + W(8, 1047496584, 1048447149, -1103742512, -1111688997) + + W(9, -1115432352, -1123932559, 1040670728, -1110071086) + + W(10, 1018575153, 1025562022, -1109069600, -1107091755) + + W(11, 1041712051, 1019306140, 1023956348, 995416610); + WS(1064673964, 1027541745); + sum1 = + W(0, 1040862122, 1042078126, 1060076351, -1092017101) + W(1, 1050924251, -1113513485, -1105951646, -1104573695) + + W(2, 1032906140, -1098380055, -1103234546, -1122608113) + + W(3, -1159900529, -1104241265, 1059885441, -1084208856) + + W(4, 1045405901, -1114509959, 1047048323, -1111978190) + + W(5, 1064315273, -1089015252, 1048739529, -1097330869) + + W(6, -1123048515, -1096920009, 1059865934, -1085419935) + + W(7, 1043557114, -1130206982, -1115789415, 1032018046) + W(8, 1050382000, -1095947620, 1032498465, 1009712656) + + W(9, 1032172675, 1022298419, 1053685923, -1104053605) + W(10, 1042167691, 1011282770, 1028373376, -1099040790) + + W(11, 1058530774, -1087017843, 1037400788, -1099616447); + sum2 = W(0, 1039738446, -1137481092, 1036746190, 998253152) + W(1, 1035100433, 1029249908, -1096514001, 1050849818) + + W(2, -1109747727, -1102987618, -1144728624, -1103405950) + + W(3, 1067583917, 1017170018, -1078331016, 1044897487) + + W(4, -1108804343, -1113657787, 1083413745, 1041988969) + + W(5, -1066189939, -1088427847, 1030429056, 1049519441) + + W(6, 1067818743, -1115429835, -1077977055, -1125950758) + + W(7, -1124211336, -1105416150, -1089267428, 1054896719) + + W(8, 1050059376, -1108032139, 1045807183, -1104699523) + + W(9, 1050540062, -1108022123, -1119460484, 1038480975) + + W(10, -1164441214, 1036658641, -1102208699, 1042362507) + + W(11, -1140654200, -1098634922, -1138500556, -1135144148); + WS(-1084384556, -1100810808); + sum1 = + W(0, 1032390692, -1101205955, -1095424763, 1056723089) + W(1, -1103994552, -1113631133, 1033258828, -1114756638) + + W(2, -1115332589, 1044941511, -1103092466, 1038921097) + W(3, 1036208454, 1034225747, -1089988048, 1059213081) + + W(4, 1016698694, 1041433148, -1153131217, -1123281148) + + W(5, -1080799329, 1058219330, -1102604175, 1029458059) + W(6, 1035878930, 1052764669, -1086451675, 1065718984) + + W(7, 1010056863, 1046701849, -1113170436, -1110681734) + + W(8, -1089641270, 1051546784, -1105901266, -1114617106) + + W(9, 1034716867, -1132636906, -1111992667, 1048907447) + + W(10, -1104305197, 1022756491, 1008810370, 1010363102) + + W(11, -1089944572, 1051751177, 1025009925, 1042675492); + sum2 = + W(0, 1003892755, -1106845972, -1130802613, 1042856976) + W(1, -1090921483, 1035865477, -1123544386, 1040443741) + + W(2, -1099129814, 1046395618, -1117156960, -1128022157) + W(3, 1040199158, 1041556166, 1034864555, 1049252005) + + W(4, -1101642940, 1029291710, -1099919704, -1098641213) + + W(5, 1044973210, 1051151809, -1094482604, 1033022953) + W(6, 1046124074, 1043027552, 1046986152, -1120255910) + + W(7, 1049495257, 1028643166, -1114201767, -1102894487) + + W(8, 1040886200, -1098031952, -1113386876, 1031856421) + + W(9, -1137485313, 1031291554, -1097152858, -1103612985) + + W(10, -1132183417, -1106468948, 1018916205, 1029095170) + + W(11, 1035815457, 1034278467, 1026205590, 1020718685); + WS(-1097545175, -1081485407); + sum1 = W(0, 1036015463, 1034150438, 1057909318, -1085934785) + W(1, 1035924004, 1033963168, 1036906638, -1107749409) + + W(2, 1041348600, -1091465804, -1120240750, -1115496908) + + W(3, 1033438601, 1025404544, 1058891216, -1088212159) + + W(4, 1040930578, 1023737332, -1148467606, -1130068931) + + W(5, 1062920275, -1085185870, 1044931644, 1034996968) + + W(6, -1116883369, -1110996648, 1058446394, -1083820335) + + W(7, -1110014855, -1109644005, 1043481795, -1129433572) + + W(8, 1057530498, -1097522985, 1046628778, 1044774695) + + W(9, -1107248831, -1112307200, 1041812911, -1098817647) + + W(10, -1112689630, -1109394217, 1035852867, -1133343797) + + W(11, 1058924580, -1088845017, 1031062731, 991839047); + sum2 = + W(0, -1085422352, -1096165509, 1057773529, -1090487063) + W(1, 1044955346, 1048850208, -1073537081, -1097506962) + + W(2, 1050305732, 1042351306, -1096519547, -1098077313) + W(3, -1090145600, 1035648589, 1070820271, 1042246902) + + W(4, 1012707558, 1040847724, -1103264022, 1037776879) + W(5, 1064009122, 1057815879, 1035447241, 1039355809) + + W(6, -1098060014, -1106454260, -1102687355, 1056492080) + + W(7, -1098251612, -1128314591, 1039561049, -1132410675) + + W(8, 1037201191, -1132940238, 1055262754, 1034334977) + + W(9, -1111561066, -1095706003, -1106323076, 1047053654) + + W(10, -1098685023, -1107078913, -1097648243, -1093619532) + + W(11, 1065891070, -1104795343, 1017091667, 1044351754); + WS(-1079771574, 1075069839); + sum1 = W(0, 1032166989, -1118529175, 1055702741, -1092970539) + + W(1, -1117950828, -1113551430, -1111167476, 1021133405) + + W(2, 1048648437, -1092445782, 1033539229, -1142239002) + + W(3, -1123178206, -1093562003, 1062276827, -1088433116) + + W(4, -1104828877, -1110397888, 1032734815, -1104246611) + + W(5, 1071187580, -1118830448, -1114529494, -1119974813) + + W(6, 1029165557, -1098100446, 1061220800, -1097110780) + + W(7, -1112849365, -1139975764, -1112820125, -1114628655) + + W(8, 1049405702, -1093425874, 1023590922, -1111568211) + + W(9, -1135576864, -1133453360, 1042497282, -1109854691) + + W(10, 992807281, 974859957, -1114861753, -1119446905) + + W(11, 1051379002, -1094782027, -1104282614, -1107804608); + sum2 = + W(0, -1108373663, 1058265898, -1105791278, -1097633487) + W(1, 1040059628, 1041333883, 1008476139, -1092753943) + + W(2, -1098184263, 1036219103, -1096394805, -1106791026) + + W(3, -1104454680, 1052155727, -1106622092, 1039768739) + W(4, 1043022076, 1034264586, 1048684757, -1094584251) + + W(5, 1051207789, 1059813061, -1089567461, 1043988712) + W(6, -1093428939, 1044002260, 1040647411, 1037804238) + + W(7, 1053976656, -1094438691, 1053127551, 1027921055) + W(8, -1092246791, 1058749571, -1109099791, 1046191998) + + W(9, -1096653504, -1109762731, 1028193495, -1091622541) + + W(10, -1128546349, -1105323978, 1052320010, -1093142139) + + W(11, -1102532444, 1056925595, -1105143398, 1027895571); + WS(-1080085654, 1070612946); + sum1 = + W(0, 1024243697, -1111019203, -1099863023, 1051294614) + W(1, 1018553499, 1001929499, -1118763904, 1017624971) + + W(2, -1093242824, 1049086721, -1110032568, -1129474933) + + W(3, -1129448298, 998267115, -1096657110, 1054244159) + + W(4, -1107816470, -1103030358, -1125372076, 1049904509) + + W(5, -1083526619, 1063525996, 1050014740, 1034265690) + W(6, -1130529432, 1044325341, -1084273056, 1060516258) + + W(7, -1120428313, 1028809164, -1113325424, 1036368923) + + W(8, -1089131829, 1052725165, 1042939778, -1137068591) + W(9, 1028582463, 1022422215, -1100657096, 1045179095) + + W(10, -1105723916, 995816851, -1115811081, 1029887376) + + W(11, -1095229037, 1047234173, 1034815359, 1023513072); + sum2 = + W(0, 1027629060, -1114994936, 1044032624, -1120685804) + W(1, 1028515824, -1128032940, 1025235210, 1042086314) + + W(2, -1110089750, 1041443307, -1109301707, 1028557604) + + W(3, -1125103522, -1109536432, 1027377576, 1041551160) + + W(4, 1038947979, -1095260923, -1130467636, 1043514454) + W(5, 1040857173, 1078385077, -1069674168, 1041445431) + + W(6, 1000499297, -1116030212, 1049094807, 1071531230) + W(7, -1072009528, 1044521776, 1020465580, 1034381305) + + W(8, -1102199059, -1097624207, 1042363648, -1111317304) + + W(9, -1138182160, -1133867384, 1040209410, 1042950964) + + W(10, -1100125727, 1026231984, 1014590712, 1032991925) + + W(11, -1107097337, -1110894461, 1020171064, -1115643044); + WS(-1094677847, 1071331518); + sum1 = + W(0, -1108370254, 1050522446, -1090412394, 1059909490) + W(1, -1131659964, 1045668787, 1027561514, -1102155388) + + W(2, -1096900614, 1033926552, -1108396174, -1099365497) + + W(3, -1098732332, 1051883284, -1088235704, 1060113893) + + W(4, -1104366446, 1036562753, -1118400576, 1052444946) + W(5, -1081990504, 1065971548, 1016076284, 1045429432) + + W(6, -1098654343, 1048632224, -1083209683, 1057796766) + W(7, -1094058291, 1027649399, 1020701942, 1036179296) + + W(8, -1095695623, 1055081266, 1044926426, -1115499084) + + W(9, -1114608461, 1043748547, -1096819473, 1048355474) + + W(10, -1102235562, 1020598162, -1102267173, 1046936641) + + W(11, -1088405429, 1057781222, -1122894705, 1041162909); + sum2 = W(0, -1102306900, 1042298222, 1021581591, -1097774924) + W(1, 1051289508, 1044651623, 1039340517, 1011988276) + + W(2, -1091773202, -1083547573, 1050176620, 1060043835) + + W(3, 1036459319, -1104503945, -1086047943, -1076320925) + + W(4, 1066124397, 1072230275, 1032447827, -1099734245) + + W(5, -1071833762, -1070847208, 1069182349, 1080482397) + + W(6, -1099327251, 1032726509, -1087097517, -1079468544) + + W(7, 1058492703, 1067612874, 1052797014, 1032685073) + W(8, -1094401898, -1084551630, 1061745990, 1060905071) + + W(9, -1122082449, 1045894449, -1089730964, -1096261152) + + W(10, 1029975482, 1035766217, -1098452307, 1031495568) + + W(11, -1094627244, -1097740674, 1062784611, 1036170953); + WS(-1075403638, -1098484659); + sum1 = + W(0, 1008218969, -1141902179, 1045612697, -1098198307) + W(1, -1115216112, 1014117412, 1031048294, 1016567255) + + W(2, 1051272109, -1097302541, 1045061466, 1032424528) + + W(3, -1123131291, -1102849342, 1045999461, -1089514713) + + W(4, -1110301017, -1117285565, 1045188911, 1018204181) + W(5, 1067242878, -1083074125, 1055219615, 1039741805) + + W(6, -1123984690, -1097928441, 1057827361, -1090995143) + + W(7, 1042127630, -1138318152, 1016373997, -1102752375) + W(8, 1039307800, -1089521325, 1018247819, 990571063) + + W(9, 1038284987, -1119205801, 1052680217, -1111274305) + W(10, 1043301703, 1035406958, 993498863, -1111653947) + + W(11, 1048974634, -1089001074, -1112012330, 991913685); + sum2 = W(0, 1032878555, -1136655860, 1031615749, -1113247036) + + W(1, -1102324444, 1033821831, -1123900432, 1023477569) + + W(2, 1032172309, 1040892014, 1041677780, -1122117887) + W(3, 1029453781, 993352402, -1101515073, -1093800370) + + W(4, -1099560811, -1111754290, -1120535472, 1007422372) + + W(5, 1063516373, 1059067488, -1101931537, -1118366060) + + W(6, 1040510410, -1110556919, -1114866186, 1049733424) + + W(7, -1091691569, -1131546954, -1109544472, -1138628828) + + W(8, -1101753271, -1112478460, -1137342172, 1043560141) + + W(9, 1036988619, -1137184004, 1046060209, -1128679382) + + W(10, -1112686045, -1110783375, -1113659102, 1035524869) + + W(11, -1110546008, -1106958218, 999359657, 1026284797); + WS(1018938736, 1060529869); + sum1 = + W(0, -1114076530, 1037607357, 1045714156, -1166977277) + W(1, -1102825464, 1003359422, 1008598737, -1120766810) + + W(2, 1044442542, 1024586298, 985048227, 1019680094) + W(3, 1029696041, -1113865353, 1057228923, -1084710912) + + W(4, 1048654858, -1122235660, -1118730378, 1019917938) + W(5, 1049628033, 1048848151, -1109196652, 1032134772) + + W(6, 1036159584, 1041300082, -1081803320, 1052825757) + W(7, -1101625253, 1023446241, 1012443924, -1119787914) + + W(8, 1042784239, -1110703311, 1021290536, 1025035938) + W(9, 1034257674, -1102751430, 1016494120, -1108049641) + + W(10, 1039349129, -1122160707, -1133449206, 1018668169) + + W(11, 1031639516, -1111061268, 1018121541, 1028394476); + sum2 = W(0, -1146778654, 1033337426, -1101837401, 1023259685) + + W(1, -1165315756, 1017616818, 1009999826, -1117028555) + + W(2, -1107426057, -1113617305, 1042598704, -1119841713) + + W(3, 1042445717, -1092512747, -1106280442, 1063964069) + + W(4, -1101414619, 1033400884, 1027431889, -1100415596) + + W(5, 1063146362, 1058459732, -1136881638, -1110929163) + + W(6, -1118789096, -1100913756, -1086144449, -1101061454) + + W(7, -1099212326, 1043348599, 1034933139, 1031653672) + + W(8, -1121957589, -1139753565, 1035181957, -1110261015) + + W(9, -1102516465, 1049736808, -1104136456, 1034026738) + + W(10, 1031514566, -1119239229, 1039233552, -1123203031) + + W(11, -1123128270, -1143324392, -1103321885, 1032933914); + WS(1057790316, -1113005641); + sum1 = W(0, -1123468520, 1034968039, -1107161453, 1035442035) + + W(1, -1107573447, 1040623159, 1016842734, -1180462681) + + W(2, -1109372445, -1126387193, -1110219956, 1001956750) + + W(3, 1017823704, -1141354132, -1097660717, 1045333479) + + W(4, -1111689634, 1034883047, 1031334797, -1111663246) + + W(5, 1060769665, -1097006056, 1016331253, -1121213099) + + W(6, 1029517379, -1096962432, 1062816796, -1085875335) + W(7, 1042106418, 999707420, 1032276500, -1102337515) + + W(8, 1057344992, -1087615930, 1042154624, -1110655190) + + W(9, 1024531558, -1112383277, 1050585827, -1099229077) + + W(10, 1021430571, 1027213229, 1032934320, -1115337892) + + W(11, 1048852876, -1104188731, 1007994773, -1125102461); + sum2 = + W(0, 1027505374, 1006384241, 1038217397, -1102596332) + W(1, -1088198084, 1054112069, -1119743709, 1032385395) + + W(2, -1124784904, 1055108824, -1101781911, -1110486748) + + W(3, 1022357321, -1110226975, 1036163691, -1095998103) + + W(4, -1077861124, 1063443275, -1129702556, 1009992786) + + W(5, 1038388564, -1096068823, -1082211809, 1060625206) + + W(6, 1025908250, -1117540770, -1107551412, 1027585837) + + W(7, 1067639721, -1095993202, -1116658238, 1015280579) + W(8, 1043662427, 1052401764, 1063419774, -1084462256) + + W(9, 1007287620, 1013929491, -1110875284, -1112465838) + + W(10, 1041946916, 1040943353, -1132286080, -1123806249) + + W(11, 1032548500, 1049275421, 1054953848, -1088060635); + WS(1057314092, 1031126097); + sum1 = W(0, -1113264897, 1047286031, 1051515170, -1091122512) + + W(1, 1035529026, -1125355113, 1042921300, 1038748523) + W(2, 1044373061, -1119263830, 1016709539, 1029610636) + + W(3, -1118216326, 1040626286, 1057172805, -1081529962) + W(4, 1043973191, 1029771624, 1036778483, 1048990343) + + W(5, -1111196723, -1076778621, 1049229393, -1112976162) + + W(6, 1035020911, 1036098930, 1053560288, -1085296972) + W(7, 1046938632, 1041831703, -1108928881, 1042428894) + + W(8, 1053915059, -1112351005, -1123285785, -1103970660) + + W(9, 1036290288, 1016422504, 1044112316, -1100809115) + W(10, 1035877806, 1044125996, 1012907241, 1041504752) + + W(11, 1048512334, -1107245185, -1123727583, -1123672296); + sum2 = + W(0, -1110279027, -1116888772, 1033554595, -1108669327) + W(1, 1015808739, 1027314221, 1044898087, -1115916604) + + W(2, -1111117443, 1045218355, -1106102431, -1116221606) + + W(3, -1096945908, -1107202311, 1035778723, -1103416606) + W(4, 1041666953, 1024714919, 1039092196, 1045884385) + + W(5, -1113256321, 1065794034, -1107247823, -1098987808) + + W(6, -1113241071, -1103988696, -1115920774, -1090569433) + + W(7, 1049716916, 1049758114, -1099008684, 1049112986) + + W(8, -1139004677, 1055599565, -1106016659, -1091770239) + + W(9, 1044106833, -1123386226, -1112080343, -1099737884) + + W(10, 1031391070, 1053158291, -1103116396, -1134049769) + + W(11, -1114347803, 1044073709, -1108799013, -1105054228); + WS(-1078536214, 1004530797); + sum1 = W(0, 1027375859, -1101920227, 1025777344, 1044389645) + W(1, -1110651587, 1018050380, 1017444741, 1031432968) + + W(2, -1103056081, 1048716617, -1137653198, -1125959547) + + W(3, -1120029560, -1106564803, -1107107772, 1051154454) + + W(4, -1107166356, 1019570356, 1000019140, 1048371434) + + W(5, -1082038651, 1066595410, -1130046381, -1125449965) + + W(6, -1114543207, -1118108517, -1087843395, 1055824714) + + W(7, -1105265945, 1033235496, 1013557197, 1042631950) + + W(8, -1090887738, 1054676989, 1030116559, -1126792065) + + W(9, -1122136338, 1018155212, -1103973545, 1041035048) + + W(10, 1023828021, -1122035417, -1148145247, 1016114854) + + W(11, -1102912795, 1016296812, 1040191506, -1142050258); + sum2 = + W(0, 1027035378, 1026113022, -1111907604, -1117578886) + W(1, -1140538653, 1018825264, -1132701065, 1034348094) + + W(2, 1044772326, 987582920, -1136739637, 1015195718) + W(3, -1114259972, 1019537869, -1115459713, -1091701771) + + W(4, -1106970806, 1029368182, 1024730711, -1139897757) + + W(5, -1083470341, -1064559027, 1035917626, -1129456736) + W(6, 986229224, -1140805741, 1024256637, 1083026821) + + W(7, 1051507274, 1025912688, 1013886009, -1118691470) + W(8, 1050967575, 1062853848, 1035548789, -1107265712) + + W(9, -1129435432, 1009541569, 1013091981, -1097816209) + + W(10, 1030786995, 1031335734, -1141056234, -1129312440) + + W(11, 1028089297, 1036032976, -1102804079, -1115863996); + WS(1053759831, 1032374114); + sum1 = + W(0, 972229904, -1121671930, 1054724605, -1092393035) + W(1, 1018308729, -1129466650, -1109228149, -1112583528) + + W(2, -1112974870, -1101934908, 1027590122, 1029939172) + W(3, 1034978575, 1034149296, 1061211455, -1092299422) + + W(4, 1034030567, -1113423424, 1041049216, 1029443406) + W(5, 1048871720, -1093922438, -1111847647, 1038901743) + + W(6, -1120680758, 1029497788, 1059772533, -1094240300) + + W(7, 1041914031, -1106909549, 1029299866, -1098177536) + + W(8, 1052523382, -1091878482, -1113968603, 1040006220) + + W(9, -1104501302, -1147362406, -1143596105, -1112394307) + + W(10, 1028043992, -1140269215, 1034604409, -1129221556) + + W(11, 1050895314, -1097371836, -1126204095, 998375305); + sum2 = + W(0, -1150066816, -1150466984, 1023864952, -1110066210) + W(1, 1023825317, -1124858867, -1122485893, 1032358015) + + W(2, -1120268940, 1042589181, 1027888694, -1130877326) + + W(3, -1114773240, 1050624105, -1092046440, 1028033997) + + W(4, -1151325172, -1135440218, 1024800634, 1086980496) + + W(5, -1062089081, -1086968029, 1038366470, -1140173368) + W(6, 996682648, 1049846439, -1092228228, 1024724796) + + W(7, -1121152696, 1022098295, -1123997738, -1116390866) + + W(8, 1022750294, 1041929871, -1118357792, 1017805328) + W(9, 1019128023, 1016213345, 1015347232, -1114433107) + + W(10, 1031614438, -1119866592, -1127165963, -1127449775) + + W(11, 1000268865, -1139900476, -1136800730, 1025894920); + WS(1063005484, 1009613411); + sum1 = W(0, 1023879031, -1099686359, 1052137768, 1046007565) + + W(1, -1104853008, 1005501772, -1116658758, -1121736524) + + W(2, 1047373394, -1096622041, 1032552475, -1119708225) + + W(3, 1016433014, -1101192360, 1060630207, -1088767007) + + W(4, -1107092245, -1118541917, 1020845368, -1114633573) + + W(5, 1066103327, -1084203279, 1041296218, -1116191290) + + W(6, 1014732617, -1095872969, 1062822060, -1090088910) + + W(7, 1027255591, 1022596005, -1133265115, -1106126199) + + W(8, 1059882369, -1090037515, -1131360500, -1115075910) + + W(9, -1123204757, -1114430117, 1050777829, -1103091289) + + W(10, -1122457924, 1022253604, 1010953149, -1135381594) + + W(11, 1058652475, -1092699671, -1108476770, -1114779071); + sum2 = + W(0, 1018912922, 1027578843, 1033809184, -1094114890) + W(1, -1100264522, -1107937173, -1115513506, -1122957333) + + W(2, -1107632498, 1001948858, 1024979575, 996744179) + W(3, 1035927400, 1036987406, -1102289594, 1056054406) + + W(4, -1110397259, -1110541201, -1104590179, -1100032664) + + W(5, 1055409420, 1048553428, -1121465059, -1114033403) + W(6, 1040736265, -1110179624, 1055289786, 1051787669) + + W(7, -1147035242, 1041331760, -1107721632, -1125426330) + + W(8, -1112721987, -1094744691, 1045301422, -1113161109) + + W(9, 1025188211, -1103038285, 1036015348, 1032878358) + + W(10, -1131004626, -1108457170, -1112944230, 1043904940) + + W(11, -1110109848, -1118996080, -1124556646, 1028913131); + WS(-1088267692, 1058858468); + sum1 = W(0, -1112379634, 1030761249, 1050799110, -1099191401) + + W(1, 1033839199, -1111715307, 1029162995, 1004146884) + W(2, 1045209037, -1095201623, 981108966, 1002675052) + + W(3, -1140270752, -1122297718, 1060358148, -1091143388) + + W(4, 1043211072, -1120236170, -1141342278, 1040340278) + + W(5, 1057423488, -1083233902, 1032118859, -1118812007) + + W(6, -1155361775, 1036240851, 1058630580, -1098879351) + + W(7, 1032700466, 1017441470, -1113272402, -1129581456) + + W(8, 1044230767, -1096101987, 1030417559, -1148456452) + + W(9, -1140210569, 1042224566, -1104611845, -1122560784) + + W(10, -1140846885, -1124250818, 1015213304, 994119730) + + W(11, -1109863885, -1109785875, 1009738084, -1131671893); + sum2 = + W(0, -1113443438, 1021821461, -1122246023, -1146734500) + W(1, -1128559783, -1125128801, 1023812788, 1044300514) + + W(2, -1104002403, 1024116650, -1115812447, -1134793082) + + W(3, -1131593767, -1104994806, 1038382254, 1049088332) + + W(4, -1105739887, -1131329759, -1112801638, 1060658961) + + W(5, -1099826888, -1089766136, 1025686404, 1034755166) + W(6, -1105757720, 1044687616, 1066144433, 1042354562) + + W(7, -1117250635, -1114066084, -1107427633, -1087213560) + + W(8, 1057721748, -1129092349, 1035306954, 1031417186) + + W(9, -1107137147, -1093064102, -1097329958, 1044181933) + + W(10, -1106719387, -1117543346, 1049954034, -1093773442) + + W(11, 1039897892, -1105235988, 1040800736, -1128306605); + WS(1042978478, 1051058289); + sum1 = + W(0, -1105382966, 1032357083, -1099095273, 1056839899) + W(1, -1122236410, 1024938700, 1035278676, 1023966158) + + W(2, -1110890773, 1050844654, 1019140850, -1122653091) + + W(3, -1102112151, -1113794846, -1087097191, 1060126757) + + W(4, -1107056589, -1122892351, -1102711504, 1052488610) + + W(5, -1081382120, 1063120271, -1150461374, -1119829084) + + W(6, -1113404858, 1046698475, -1086454106, 1060142827) + + W(7, -1103751812, 1007453138, -1111458068, 1025992701) + + W(8, -1097860134, 1054395618, -1120625160, -1106500335) + + W(9, 1038103836, 1042579843, -1105233954, 1048420817) + W(10, 1025690583, 1032216339, -1101215220, 1026938905) + + W(11, -1091436978, 1056719627, -1112415123, 1010325087); + sum2 = + W(0, 986675002, -1098687074, 995475005, -1115454695) + W(1, -1110655697, 1018060844, -1112567440, 1041166801) + + W(2, -1097111455, -1132868679, -1114152579, -1101427932) + + W(3, 1033516168, -1099338776, 1062728692, -1120015952) + W(4, 1023628514, 1045275251, -1097585273, 1019263552) + + W(5, 1066654492, 1054175336, -1097107880, -1098419362) + W(6, 1031672616, -1108963639, 1034345380, 1038275134) + + W(7, -1118909665, 1049612882, 1029453516, -1104454378) + + W(8, -1124466258, -1096244103, 1049130538, -1100742770) + + W(9, -1106591291, -1109440188, -1092068145, 1039104546) + + W(10, -1093717692, 1000911598, 981423732, 1024870634) + + W(11, 1048117247, -1119846616, 1042494451, -1140045927); + WS(-1097071959, 1072623846); + sum1 = + W(0, 1026094363, 1010541764, -1087379998, 1028105114) + W(1, 1046169702, -1135291959, -1114366565, 1023927408) + + W(2, -1100421531, 1051865478, -1105971271, -1125008010) + + W(3, 1026372640, 1034504814, -1091057687, 1057630379) + W(4, 1041980470, 1012391943, -1127140609, 1038480008) + + W(5, -1086095524, 1064048287, -1104375598, 1011497593) + W(6, 1020533357, 1046400295, -1083615449, 1061319210) + + W(7, -1113258549, -1126436590, -1164090721, 1040252248) + + W(8, -1089701071, 1056141130, -1149976804, 1008261592) + + W(9, -1143600974, 1040642843, -1093225865, 1049626241) + + W(10, -1120849689, -1126913777, 993477434, 1032065949) + + W(11, -1090227881, 1047950199, 1048635489, 1026040178); + sum2 = + W(0, 1012042818, 1045767812, -1063490706, -1101778611) + W(1, -1112785819, 1012780879, 1021360395, -1098807230) + + W(2, -1081789373, -1114664520, 1033999610, 1021391529) + W(3, -1107209227, 1044720012, 1074390906, 1049922132) + + W(4, -1110057121, -1130294258, 1027378250, 1042281858) + W(5, 1079115935, -1094869567, 1045861970, 1031106226) + + W(6, -1105921842, 1016599978, 1058048856, -1118592797) + + W(7, 1034050759, -1122317121, 1041772128, -1127223374) + + W(8, -1108782236, -1121088549, -1129798306, 1025125464) + + W(9, -1127367716, -1115783877, -1128008216, -1137516645) + + W(10, 1033434514, -1149825053, -1127019644, 1027816090) + + W(11, 1032186898, -1111496361, -1136389257, 1031888403); + WS(-1103312814, -1092017335); + sum1 = W(0, -1127703091, -1101144796, 1054306333, -1126801713) + + W(1, 1023075088, 989243788, 1018146514, -1115460311) + W(2, 1039997174, 1026063214, 1027296474, -1122138660) + + W(3, -1121799134, -1106383343, 1024945271, -1131110905) + + W(4, -1132250026, 1032388672, 1017072510, -1133230391) + + W(5, -1088288960, 1059941407, -1113425894, 982272924) + + W(6, -1131539818, 1034901054, -1088630417, 1061737047) + + W(7, -1097522374, 1021266411, -1112727125, 1027622014) + + W(8, -1096972398, 1057455253, -1097018828, -1135487483) + + W(9, 1017229265, 1018005017, -1101045202, 1048616129) + + W(10, -1112216732, -1117699788, -1109754009, 1034197373) + + W(11, -1098488314, 1051714580, -1142469689, 995701513); + sum2 = W(0, 1015133861, -1105189044, -1093732269, -1094162786) + + W(1, -1109540616, 1030009493, 1037113072, -1115931822) + + W(2, -1102686481, -1113599737, 1040400825, -1114813207) + + W(3, -1114822552, -1098364789, 1041653115, 1041635421) + + W(4, -1118060506, 1027616765, 1028491873, -1113527921) + + W(5, 1065997875, 1064813540, -1123044799, -1116517245) + + W(6, -1105557810, 1024139573, -1130473293, 1037786550) + + W(7, -1105450383, 1021543889, 1038591890, -1112247318) + + W(8, -1098512761, 1036196676, -1106060901, 1005718790) + + W(9, -1105949948, 1007564387, -1125828389, -1114108758) + + W(10, -1118151575, -1122858549, 1032708826, -1120342494) + + W(11, -1125733097, -1132225813, 1010062515, 1029912177); + WS(1054094679, 1053313313); + sum1 = + W(0, -1133457438, -1123263126, 1046955525, -1124016519) + + W(1, 1039131745, -1120644986, -1120986711, -1130558777) + + W(2, 1034791245, 1044418743, -1102726978, 1007447622) + W(3, 1034987238, -1097984725, 1059693200, -1102062065) + + W(4, -1136653836, -1119688622, 1028444909, -1096198619) + + W(5, 1056744813, -1098120268, -1097784815, -1150742701) + + W(6, 1035642130, 1007426149, -1111414009, -1111514230) + W(7, -1121981368, 1028941155, 1018062863, 1002886242) + + W(8, 1030506913, -1104691680, 1038384226, -1124505481) + + W(9, 1034710931, -1123562906, -1113706235, 1011520719) + + W(10, -1114621003, 1028268649, -1149170946, 1018181775) + + W(11, 1033357311, -1107703301, 1012043028, 1016894461); + sum2 = + W(0, 988916677, 1035831303, -1110571087, 1034464782) + W(1, -1106828560, -1178538002, -1137939637, -1140903881) + + W(2, 1038296707, -1090860425, 1044389789, 1041756630) + + W(3, -1123566910, -1103092742, -1107155945, 1056968489) + + W(4, -1079651989, 1029915845, 1028209713, -1131746560) + + W(5, -1117714466, 1064742714, 1050942503, -1106236653) + + W(6, -1123858844, -1101579019, 1038803820, 1040557782) + W(7, 1043224862, -1110415601, 1036944358, 1038814302) + + W(8, -1103151768, -1120375726, -1130430804, 1019097405) + + W(9, -1119538750, -1130948272, 1032643961, -1111036663) + + W(10, 1041889175, -1132733633, -1142606817, 1038676356) + + W(11, -1111989951, -1122089622, 1014857001, -1140337549); + WS(1060301740, -1107262085); + sum1 = W(0, 980901136, 1034782831, -1105836176, 1036556474) + W(1, -1123655719, -1123449511, 1027361860, 1047173818) + + W(2, -1090641081, 1050207945, -1104237805, 1032390687) + + W(3, -1140723427, 1039236098, -1089836727, 1053103024) + + W(4, -1097134658, 1023266998, 1026764890, -1167399456) + + W(5, 1057068694, 1041462691, -1168491986, -1128069487) + + W(6, 1040866884, -1096504911, 1061579759, -1084387656) + + W(7, 1041789973, -1111341496, 1025665684, -1107799148) + + W(8, 1058017849, -1086651203, 1041962562, -1121577073) + + W(9, 1033047081, -1104388354, 1050545524, -1099258584) + + W(10, 1042093191, -1128080260, -1120424813, 1042507977) + + W(11, 1043225643, -1106352190, -1107448273, -1118302731); + sum2 = W(0, -1120672932, 1046006360, -1112452525, -1103760793) + + W(1, -1135937657, 1037670355, 1020434122, -1097339905) + + W(2, 1059308780, 1054394959, 1038148088, -1114765629) + W(3, 1029602171, -1114812458, 1040180724, 1058139034) + + W(4, -1103543044, -1120562291, 986372169, -1107596062) + + W(5, -1073685765, -1075031098, -1098429000, -1131755817) + + W(6, 1039121856, 1036462865, 1068230783, 1055263295) + W(7, 1051067274, 1034635900, -1113202257, 1042494496) + + W(8, 1060720662, 1065727212, -1106499347, 1010504894) + + W(9, -1139183469, -1097212089, -1116372590, -1106882983) + + W(10, -1127997619, -1127537321, 1010867474, -1111658779) + + W(11, -1096232759, -1102585430, 998537328, -1141626877); + WS(-1096709719, -1109932402); + sum1 = W(0, 1015250582, -1143431239, 1041217222, 1009444904) + + W(1, -1127867147, -1115442975, -1109965037, 1015070528) + + W(2, 1044707911, -1099789672, 1028928427, 1033219242) + W(3, 1037158888, -1094706154, 1032459556, 1049449359) + + W(4, 1015515213, -1119289842, -1115453048, 1051852512) + + W(5, -1103734188, -1091866852, 1049692098, -1140261177) + + W(6, 1032345875, -1107272167, -1116721265, 1042112892) + + W(7, -1094357813, 1041543818, -1113173429, 1039101648) + + W(8, -1100636937, 1051337808, 1036490203, -1107580668) + W(9, 1033146133, -1112986991, 980311674, 1011811037) + + W(10, -1118660177, 1027230184, -1109546082, 1034073405) + + W(11, 1017051268, 1035868647, 1019523665, -1121586498); + sum2 = W(0, -1129366500, -1111869912, -1114572049, 1047691494) + + W(1, 1024096486, -1112777200, 1029756683, 1029022998) + W(2, 1041454921, 1051011830, -1094989992, 1033382685) + + W(3, -1113040482, 1046043365, 1063827282, -1075590857) + + W(4, -1094007689, 1046068934, 1041050942, 1028636589) + W(5, -1088878874, 1052419847, 1049374228, 1022134325) + + W(6, 1019865458, -1100561355, -1120053198, 1053136256) + + W(7, 1051405216, -1104418826, -1130192114, -1118786886) + + W(8, 1037601458, -1142379802, -1105102628, 1039472389) + + W(9, 1021094310, -1136660469, -1121128994, -1115896886) + + W(10, 1030093181, -1173694926, 1011878989, -1113939693) + + W(11, 1024511741, 1033422229, 1038213156, -1122209396); + WS(1065853238, 1014077745); + sum1 = + W(0, -1141216588, -1117433015, -1094201799, 1050233869) + W(1, 1044254087, -1138617969, 1026623353, -1129058045) + + W(2, -1096460535, 1049952264, 1008011942, 1022594791) + W(3, -1128763228, 1039902504, -1083943142, 1051933059) + + W(4, 1048823509, -1141149825, 1020370461, 1043759351) + W(5, -1077503527, 1055071872, 1025148605, 1032777398) + + W(6, 1026101893, 1050608829, -1089716396, 1055823041) + W(7, 1040921250, -1117303781, -1118113002, 1042454284) + + W(8, -1098731144, 1057515106, -1120507502, 1030831063) + W(9, 1032019108, 1027449020, -1095714819, 1050055875) + + W(10, -1149099066, -1131034510, -1113706417, 965645460) + + W(11, -1094767340, 1054942629, 1040832262, 1023411184); + sum2 = W(0, 1024492456, -1107369605, -1114418679, -1102696165) + + W(1, -1133142225, -1122518916, -1126703609, 1040389587) + + W(2, 1038677226, -1115181151, -1114014523, 1026327736) + + W(3, 1029353704, -1109233879, 1043636997, -1104069114) + + W(4, -1122395696, 1035228514, 1036516578, -1095300447) + + W(5, 1063429366, 1063594124, -1091978649, 1023044321) + + W(6, 1032071462, -1104963978, -1101740776, -1098164193) + + W(7, 1053626887, -1116601496, -1107363712, -1106122650) + + W(8, -1097459892, 1040620147, -1097146692, -1130578705) + + W(9, 1044306067, -1143085570, 1035238854, -1106357294) + + W(10, 1040976159, 1026795860, -1105180142, 1043865859) + + W(11, -1116890590, -1127904241, -1120794976, -1127926993); + WS(-1088917996, 1063906509); + sum1 = + W(0, -1110920777, 1044506738, 1047786311, -1095080042) + W(1, -1134941681, 1033765698, 1042151912, -1103723194) + + W(2, 1032125650, -1113114611, 1025189266, -1104090263) + + W(3, -1101936374, 1033303784, 1061302810, -1088574755) + W(4, -1115794445, 1041151454, 1005195703, 1049511025) + + W(5, 1034065915, -1080208865, 1048946939, -1113407178) + W(6, 1032265367, -1113286290, 1048810800, 1049193686) + + W(7, -1126346531, -1109067703, -1103459368, 1043019742) + + W(8, 1054491533, -1121283466, -1103486336, 1044875416) + + W(9, 1041691572, -1128222025, -1112859072, 1024774526) + + W(10, 1015955599, -1121559327, -1129700693, -1114181825) + + W(11, 1049358361, -1147499681, -1097425800, 1029016425); + sum2 = + W(0, -1103461552, -1127991186, -1120190757, -1108916090) + W(1, 1012492564, 1029245469, 1050674327, -1116051994) + + W(2, -1113530372, -1124692174, 1042343963, -1115385529) + + W(3, -1104590141, -1131508502, 1055990720, -1121470095) + W(4, 1032226081, 1026603353, 1015549042, 1050173609) + + W(5, 1072931527, 1046026095, 1048814953, 1024686773) + W(6, 1036919049, -1105608002, -1095048932, 1050729023) + + W(7, -1098673970, -1108452621, -1098769683, 1039941075) + + W(8, -1078020039, -1084802111, -1101605152, 1046452703) + + W(9, 1046313441, -1101603735, -1101033642, 1047911325) + + W(10, -1113534935, -1112756717, -1112862464, 1031505597) + + W(11, 1010804308, 1034713295, 1017021378, -1119772659); + WS(-1128039792, 1065254279); + sum1 = W(0, 949814928, -1114341117, -1094482850, 1052398616) + W(1, 1027872723, -1155305313, 1027171091, 1031806764) + + W(2, -1095186291, 1051880795, -1139824782, 1022544667) + + W(3, -1129242384, 1033646238, -1085842430, 1058904806) + + W(4, 1010706555, -1121892394, 1031101353, 1018879791) + + W(5, -1092086861, 1068407459, -1098849364, 1040052675) + + W(6, -1120975327, 1042055949, -1084252337, 1055432619) + + W(7, -1121195299, -1127339326, 1003634843, 1033681236) + W(8, -1089087466, 1036562814, 1023772639, 993927654) + + W(9, -1144006416, 1023909046, -1099056317, 1039311896) + + W(10, -1126801378, -1123991661, -1123053628, 1027677731) + + W(11, -1095496311, 1050962337, 1038931216, 1005742098); + sum2 = + W(0, -1120833032, -1124763415, -1118777010, 1030229073) + W(1, 1028911958, -1123843510, 1034915193, -1113475142) + + W(2, 1010824003, -1105412742, -1133618203, 1030755234) + W(3, -1115307960, 1025322201, 1064953874, 1042572184) + + W(4, 1022077590, -1135426163, 967112657, 1059271888) + W(5, 1082807588, -1098383492, 1048790378, -1113939962) + + W(6, 1023925021, -1102912552, -1080316189, 1054443836) + + W(7, -1103923621, 1038571089, -1107476032, -1118552210) + + W(8, -1064631277, -1098098835, 1029953956, -1109596012) + + W(9, 1033449936, -1103660545, -1110193476, -1121091158) + + W(10, -1106218101, 1035405992, -1132191993, 1033898849) + + W(11, 1039205719, 1028111985, 1036034024, -1126376787); + WS(-1100484014, -1082813103); + sum1 = + W(0, -1123138350, 1037916588, -1092840871, 1048819422) + W(1, 1042234192, -1212876940, -1124738939, -1123209507) + + W(2, -1095165544, 1053647432, -1117914254, 1018206961) + W(3, 991988525, 1049386547, -1086369653, 1054472273) + + W(4, 1039202605, -1120915541, -1115403050, 1038702225) + + W(5, -1082690349, 1063735148, -1121098737, 1024686130) + W(6, 1032429349, 1052139678, -1080932794, 1057734851) + + W(7, -1124146173, 1015928020, -1113715255, -1114440425) + + W(8, -1104541586, 1057909982, -1120991811, -1138122766) + + W(9, 1024280877, 1033284897, -1091044852, 1048946363) + + W(10, -1116174764, 1018911880, 1024090791, -1105213156) + + W(11, -1098590565, 1057027323, -1140316975, 1023234987); + sum2 = + W(0, 1017320792, -1151813795, -1114719136, -1127138406) + W(1, 1024237362, 1038691322, -1115193567, -1117132961) + + W(2, -1104426322, 1035777956, -1122656452, -1114810881) + + W(3, 1033153774, 1023133248, -1094043595, 1044557822) + + W(4, 1043828952, -1134215421, -1109723345, -1096979800) + + W(5, -1067432541, -1081748159, -1105451925, 1025666138) + + W(6, 1038092476, 1051436512, -1094705611, -1094662263) + + W(7, -1118217110, 1023161212, -1111785287, -1136600857) + + W(8, 1084038773, 1059186895, -1118750811, -1141123106) + W(9, -1119671739, 1043953938, 1051561136, 1023890070) + + W(10, 1026839182, 1009024009, -1109901657, 1038440342) + + W(11, -1097692319, 1021470996, -1114305884, -1122422926); + WS(-1090600151, 1059961608); + sum1 = + W(0, 1026132748, 1003856660, -1086859502, 1051724689) + W(1, 1051693682, 1032934656, -1119499740, 1023957057) + + W(2, -1105095800, 1035359281, 1030063117, -1123043606) + W(3, 1009974340, 1043713207, -1089372619, 1059175635) + + W(4, 1040699442, 1034542394, -1113885561, 977342510) + W(5, -1080432315, 1059908410, -1106762114, 1018557983) + + W(6, 1031101992, 1051525550, -1084623068, 1060487798) + W(7, -1114853678, 1019132432, -1111559238, 1025363409) + + W(8, -1086083942, 1059822844, -1116041416, 1031213982) + W(9, 1038517558, 1031878320, -1090836983, 1051599439) + + W(10, -1130086580, -1150140386, -1109274083, -1114083846) + + W(11, -1097114792, 1057278953, 1040974422, -1138998830); + sum2 = + W(0, 992923986, -1099561897, -1105536701, 1079165891) + W(1, -1067147152, -1122782084, -1162949315, -1123994385) + + W(2, -1114799541, 1071631223, -1073660425, -1122543983) + + W(3, 1026898877, -1116860796, 1049791100, 1068780303) + + W(4, -1081838471, -1095462698, -1114052913, 1033030662) + + W(5, 1035377948, 1075632919, -1083671230, -1097530520) + + W(6, -1129262506, 1024241717, -1088177074, -1093777203) + + W(7, 1057542893, -1107750254, 1033577774, 1027801571) + W(8, 1049717575, -1083766160, 1057183721, 1032284006) + + W(9, -1129225578, 1041458479, 1043978030, 1029517847) + W(10, -1103299573, 1025982179, 1036380420, 1050404867) + + W(11, -1091169113, -1083354335, 1061807320, 1016984746); + WS(-1077101366, 1062204989); + sum1 = + W(0, 1030791972, 1034919675, -1119759728, -1099266697) + W(1, 1044609922, -1131275309, 1033145401, -1109323772) + + W(2, 1033209467, 1032826652, -1108657922, -1142019948) + + W(3, 1041963978, -1109601924, 1053457281, -1084468746) + W(4, 1049423472, 1005679697, 974201395, -1098302775) + + W(5, 1054965265, -1116769210, 1034832195, -1125973710) + + W(6, -1122207423, 1049858413, -1085314770, 1055247733) + W(7, -1104833109, 1038354000, 987140211, -1163737350) + + W(8, -1111164798, 1051122507, -1113738245, 1030630601) + + W(9, 1038549201, -1104961646, -1103072597, 1043488164) + + W(10, -1121147841, -1132893044, -1110991006, 1022472166) + + W(11, -1115893275, 1036206931, -1131086146, 1033991117); + sum2 = + W(0, -1128313262, 1013333880, 1041733323, 1023499747) + W(1, -1111312052, 1026149469, -1111995834, 1035550861) + + W(2, 1024909109, -1107108555, 1015145454, -1188980193) + W(3, -1111474816, 1047569009, 1049082846, 1042800306) + + W(4, 1017141780, -1123639612, -1108547758, 1036006103) + + W(5, -1093864056, -1137016284, 1013541080, -1132476264) + + W(6, -1123519406, -1104835579, 1049905793, 1032249988) + W(7, 1034012446, 987971164, -1107039325, -1119199538) + + W(8, 1005924363, -1146750815, -1119513572, -1118671040) + + W(9, -1122872424, -1113807123, -1107099901, 1024429363) + + W(10, 1036805530, -1119021692, 1034342977, -1111926114) + + W(11, -1117079308, 1029021112, 1021769214, 1010774610); + WS(1062330988, -1108933484); + sum1 = W(0, -1130422235, -1127744279, -1103583502, -1112967222) + + W(1, 1030687296, 1027221408, 1014897395, 1022571909) + W(2, -1095189640, 1057599524, 1033146447, -1115561596) + + W(3, 1027643186, -1103670303, -1097916197, 1050533350) + + W(4, 1045948242, 1024802772, -1143835797, -1110385841) + + W(5, -1083565633, 1066390108, -1104991248, 1027456689) + + W(6, 1008148004, 1042533684, -1085814590, 1059916677) + + W(7, -1098839314, -1125614226, -1128962907, -1104774725) + + W(8, -1117452294, 1050496965, -1114792086, 1027191883) + + W(9, 1015454424, -1116892960, -1099231943, 1049304867) + + W(10, -1127702342, -1115468561, -1140840472, -1113171223) + + W(11, -1103031657, 1049771574, 1032045679, 1026854932); + sum2 = + W(0, 1032895988, 1032830726, -1115406541, -1088204952) + W(1, -1092446016, 1031989945, -1117467777, -1111744013) + + W(2, 1060942494, 1054289941, -1123665301, -1104702594) + W(3, 1028545567, 1005059811, 1047355779, 1071613570) + + W(4, 1060958044, 1046230999, -1111764526, 984631841) + W(5, -1080183554, -1077634808, 1046926373, -1100189171) + + W(6, 1041090350, 1049595248, -1134532596, -1093147012) + + W(7, -1113920155, 1034621337, -1115412116, -1107906030) + + W(8, 1035977506, 1042083474, -1097187857, -1132922134) + + W(9, -1125773241, -1128022386, 1020817981, 1037668146) + + W(10, -1142970826, -1117116166, 1023304410, 1041765137) + + W(11, 998580490, 1032116542, -1125184917, 1022449461); + WS(-1109331804, 1042368707); + sum1 = + W(0, -1127022377, 1017844485, 1059385318, -1100795701) + W(1, -1111987554, 1016900750, 1024616740, -1131144083) + + W(2, 1050963589, -1097056965, 1029893237, 1023074109) + + W(3, -1123466393, -1107976561, 1060165431, -1085607547) + + W(4, 1029216560, -1112887422, -1123208698, -1113085828) + W(5, 1059271336, -1083778221, 1039937652, 998408382) + + W(6, -1123129456, -1114039899, 1060839292, -1087428756) + + W(7, 1032072458, -1132276000, 1019270569, -1111910285) + + W(8, 1056907678, -1094957746, -1114977786, 1030127674) + W(9, 981412042, -1118232839, 1049849056, -1097540376) + + W(10, 1024925794, 1027413302, -1140654132, 1022571624) + + W(11, 1053487153, -1103251894, -1099334072, 1016237783); + sum2 = + W(0, 1032849952, 1026055449, -1062565523, -1095655110) + W(1, -1117249787, 1033345650, -1124884727, -1115329827) + + W(2, -1069645041, 1045607629, -1117682124, -1126204236) + + W(3, -1113876395, 1027815845, 1071954840, 1038549538) + W(4, 1041120073, -1111681252, -1129227720, 1037903820) + + W(5, 1082661778, -1099195860, 1049745271, 1027383795) + W(6, -1120368220, 1033732250, 1074466947, 1038448988) + + W(7, -1117133911, 1003632367, 1017198470, -1135699996) + + W(8, 1029601901, -1098438651, 1028175479, -1122462785) + W(9, -1139825528, 999495607, 1010255452, -1108984513) + + W(10, 1021673198, 1028818665, -1146042855, -1129930944) + + W(11, 1032971494, 1036170224, -1119888169, 1008778484); + WS(-1115348316, 1054745777); + sum1 = + W(0, -1137232980, 1036166838, 1049991788, -1091675395) + W(1, 1017816583, 1029575560, 1010567825, 1015838740) + + W(2, 1049110157, -1096298109, 1034100235, 1027659359) + W(3, 1027515738, -1156212270, 1058008076, -1087264777) + + W(4, 1034455816, 1022248439, -1129778165, -1111605669) + W(5, 1064241460, -1084812083, 1015442096, 1022178737) + + W(6, 1031078129, -1105267814, 1060214194, -1090012802) + + W(7, 1038960299, 1027280241, -1163675813, -1129353779) + W(8, 1054590870, -1089909917, 1024747424, 1032358751) + + W(9, 1021335208, -1109102196, 1041116785, -1099321920) + + W(10, -1128935590, -1140454872, 1015357019, 1044530957) + + W(11, 1051902330, -1087098097, 1001621141, 1023518060); + sum2 = + W(0, -1165172934, 1029679520, -1126280148, -1133513625) + W(1, 1007295249, -1112190701, 1024206556, 1020162972) + + W(2, -1122180110, 1032751166, -1123729058, 1031911051) + W(3, -1116697030, 1034059275, 997668227, 1058808820) + + W(4, -1106696521, -1130859572, 1027518769, 1040171419) + + W(5, -1097026624, 1078058683, 1051253388, -1110596693) + W(6, -1114129087, 1027996817, 1034726751, 1074823993) + + W(7, -1129919188, 1030310076, 1038375004, -1110434123) + + W(8, 1040744343, -1082346775, -1130957332, 1020514684) + + W(9, -1112102389, 1034335827, -1102815825, -1066028315) + + W(10, -1106067749, -1120038362, 1033334280, -1129105068) + + W(11, -1107441727, -1081349721, 1046963831, -1140190249); + WS(-1106429870, -1094013011); + sum1 = + W(0, -1180060253, 1032914805, 1051659804, -1083977393) + W(1, 1044666432, -1143253052, 1010730896, -1122572746) + + W(2, 1041447962, -1096070845, 1042077981, -1112889935) + W(3, 1021824818, 1007289698, 1049003466, -1090427610) + + W(4, 1040702780, 1019043703, -1126648308, 1032028260) + W(5, 1055000463, -1110426966, 1039434940, -1121648024) + + W(6, -1129917792, 1028442598, 1028832887, -1154202266) + + W(7, -1143541158, -1121855216, -1130361130, 1044381070) + + W(8, -1108621431, 1047276227, -1126798128, 1025638626) + + W(9, -1120274467, 997655159, -1127588999, -1106909952) + + W(10, 1034262401, -1112957869, -1140710069, 1048974915) + + W(11, -1092428073, 1037115308, -1116914978, 1027653084); + sum2 = W(0, -1113021585, 1044056205, -1096040530, -1099894114) + + W(1, -1101136816, -1129192316, 1027309129, 1042644451) + + W(2, -1098848264, -1100852865, 1051352325, -1127314210) + + W(3, 1040557912, -1130917417, -1086782093, 1055980834) + + W(4, -1094431966, 1001033976, -1105312463, -1097839840) + + W(5, 1066533545, 1060955207, -1105883820, 1028457481) + W(6, 1045635393, -1093830389, 1047866369, 1049480207) + + W(7, -1100511063, -1109915970, -1102513438, -1101732547) + + W(8, 1049511378, -1136131482, -1095199310, 1041484506) + + W(9, 1027399099, -1116545436, 1054444603, -1099150452) + + W(10, 1057783348, -1111537389, -1114789238, 1035602021) + + W(11, 1045074348, -1089010378, -1105061215, 1038428609); + WS(1043891118, 1068855714); + sum1 = W(0, 1034864935, -1116934668, -1092449819, 1054927906) + + W(1, 1034556804, -1137767170, -1115119790, -1132968331) + + W(2, -1094480060, 1036212657, -1105343195, -1110944332) + + W(3, 1021640868, 1038582262, -1087769325, 1059302628) + W(4, 1039390277, 1007166673, -1116826163, 1007221512) + + W(5, -1085866861, 1065404307, -1118670257, 1000130184) + + W(6, -1131811026, 1042862352, -1087019235, 1060871017) + + W(7, -1097654326, -1149095244, 1023733166, 1036137865) + + W(8, -1090795981, 1058788692, -1110180471, 1038210141) + + W(9, -1143217636, -1140157826, -1096174840, 1054585007) + + W(10, -1103987387, -1123846591, -1132040205, -1132089051) + + W(11, -1088777568, 1058320673, 1039274926, 1033742658); + sum2 = + W(0, -1109312558, 1043524956, -1128190925, -1098627702) + W(1, 1046310591, -1109532722, 1016877071, 1022447527) + + W(2, -1112207078, -1106898612, 1038513036, 1007593597) + + W(3, -1119267190, 1041115214, -1098728904, -1125515089) + + W(4, 1034661588, -1120394532, 1012463989, -1113751024) + + W(5, -1096567460, 1069702771, -1085518745, -1104054586) + + W(6, -1126846961, 1044302697, -1103900959, 1067943590) + + W(7, -1080776989, -1120974914, -1130793473, 1017381631) + + W(8, 1042180588, 1068665203, -1076263106, 1042247803) + W(9, 1028514185, -1118188819, -1098746809, 1066385707) + + W(10, -1082060374, 1009589981, 987754923, 1030898373) + + W(11, 1045698067, 1053793920, -1093259035, -1114854661); + WS(-1087649964, 1019782291); + sum1 = + W(0, -1120416323, 1030168161, 1040415828, -1105270513) + W(1, 1024428446, -1138699736, -1143853715, -1112895868) + + W(2, 1040272853, 1031966316, -1115504066, -1138905653) + W(3, 997344379, 1041161399, -1108639376, -1088122706) + + W(4, 1050439898, 986611002, -1117444008, -1109107148) + + W(5, 1066099001, -1107599501, -1101667648, -1107645603) + + W(6, 1021907901, 1047711365, 1016783474, -1089416651) + W(7, 1046888529, 998160367, -1121005123, -1121138472) + + W(8, 1034911086, -1111272734, 1033038819, -1138080961) + W(9, 1024251314, 1000308143, 1025062450, -1107120316) + + W(10, -1142414472, 1016114481, -1131127160, 1016698342) + + W(11, 1039033917, -1102333873, 1024070769, -1128756052); + sum2 = W(0, -1107127477, 1040784536, -1117663793, -1112675945) + + W(1, 1039537683, 1025325994, 1033768126, -1100939724) + W(2, 1017594321, 1057262150, -1092150404, 1019337948) + + W(3, 1023416069, -1105075327, -1107862291, -1072566694) + + W(4, 1066290117, -1099590626, -1125558334, 1031863699) + + W(5, -1098589794, 1078638992, -1077578123, 1051733383) + + W(6, 1043030557, -1103416126, 1051532765, -1086195181) + + W(7, 1053259006, -1119314417, -1118774605, -1104742149) + + W(8, 1047503953, -1109470897, 1050584179, -1100419866) + + W(9, -1151915405, 1042707477, -1106456825, 1041105499) + + W(10, -1103867215, 1038050610, 1000627574, -1121719211) + + W(11, 1014542959, -1106760943, 1033290657, 1002291590); + WS(1061891500, 1029739432); + sum1 = W(0, -1120639769, -1106216192, -1113834067, 1044238166) + + W(1, -1114217922, -1131739160, -1135804195, 1006283635) + + W(2, -1103570763, 991333090, -1139025510, -1118882723) + + W(3, -1111424495, -1105829118, -1096510251, 1059958553) + + W(4, -1105864021, -1144807936, 1029738303, -1090566706) + + W(5, 1051808376, 1070740438, -1094764771, 1034612526) + + W(6, -1117498485, -1116262763, -1092264601, 1055146526) + + W(7, -1102695282, -1134494805, -1118615961, 1034396863) + + W(8, -1100309453, 1034609097, -1115698885, 1017541191) + + W(9, -1125527056, 1019261400, -1103214946, 1035571491) + + W(10, -1137185181, -1114134173, -1118385394, -1120846617) + + W(11, -1103884676, 1043753671, -1118241703, 1003240643); + sum2 = W(0, -1121600381, 1026550907, 1038640235, -1118247849) + + W(1, -1129506938, -1121040584, 1006302792, -1138054916) + + W(2, -1115693397, 1032667651, -1150824496, 1022873234) + + W(3, -1119262688, 1026195583, 1049140618, -1131891756) + + W(4, 1032667233, -1116879102, 1002488024, -1109251816) + + W(5, -1070322023, 1075955836, 1037796079, -1123674716) + W(6, 1029037035, 989985520, 1050244555, -1093462820) + + W(7, 1041966968, 1023067742, 1026568605, -1119850715) + + W(8, -1111337441, 1039467523, -1119306593, -1115823182) + + W(9, -1136033516, 1023268674, 1034795019, -1123631905) + + W(10, 1011205316, 1030765775, 1023468893, -1113487368) + + W(11, 1032357843, -1111383976, -1140765060, -1117038411); + WS(-1084563692, -1094583093); + sum1 = + W(0, 1022703229, 1012279186, 1016172182, -1118740542) + W(1, 1030161881, -1118949361, -1162852794, -1124105959) + + W(2, 1043937588, 1029178707, -1113029519, 1029291849) + W(3, -1132568844, 1040618577, -1096721723, 1047241030) + + W(4, -1110742685, 1002005802, 1021772616, -1104495965) + W(5, 975997096, 1058138797, -1095587800, 1026228226) + + W(6, 1024085850, -1108936808, -1105257082, -1098942649) + + W(7, 1044167852, -1121437018, 996545514, -1134036365) + W(8, -1119752408, 1033384955, 1030217107, -1128298663) + + W(9, 1026223997, -1117471057, 1035927703, -1119041259) + + W(10, 1033396614, -1127843472, -1146052282, -1121618798) + + W(11, 1030206390, -1135741956, -1114495566, 1024441958); + sum2 = W(0, 1025430445, -1154040649, -1116838887, 1050769250) + + W(1, -1101164186, 1025324860, 1022296570, 1041313314) + + W(2, -1089338077, -1110563158, 1049390351, -1110459458) + + W(3, 1036981025, -1095051054, -1080092115, 1047738904) + + W(4, -1105225557, -1123670947, -1113204042, 1045521896) + + W(5, 1068042633, -1105725339, 1058198082, -1102419914) + + W(6, 1015494893, -1140159290, -1123762249, 1046459196) + + W(7, -1097909404, 1036400862, -1113488118, 1036274902) + + W(8, 1036460009, -1099991734, 1042800199, -1121611661) + + W(9, -1127432409, 1033705522, -1115504399, 1035671600) + + W(10, -1112380024, 1029427990, -1122316989, 1014652738) + + W(11, 1034428960, -1109634740, 1019626217, -1122111247); + WS(1070570422, -1118483066); + sum1 = + W(0, 1018165832, -1110069429, -1099959964, 1060331110) + W(1, -1162935118, -1139421786, -1132852684, 1031499417) + + W(2, -1099020957, 1050128623, 1032275410, 1009522871) + W(3, -1139725729, 1040072889, -1084885570, 1059366093) + + W(4, 1019497086, -1140197674, -1109730565, 1042906054) + W(5, -1081528768, 1062372980, 996066926, -1117746023) + + W(6, 1028156415, 1042919301, -1083523477, 1058454089) + + W(7, -1118811556, -1128372287, -1118139972, -1168228894) + + W(8, -1091258848, 1058887102, -1112630512, 1014662756) + W(9, 1024357779, 1039947243, -1095225642, 1048717802) + + W(10, -1117991970, -1119179525, -1122455036, -1103975241) + + W(11, -1094692227, 1057283318, 998336395, 1028666043); + sum2 = + W(0, 1041833519, -1105638218, -1090712556, -1068172350) + W(1, 1053466473, 1031038629, -1108615966, 1028972955) + + W(2, 1051586707, -1062545743, -1089644697, -1109024185) + + W(3, -1125372171, 1029956673, 1040982790, 1058445980) + W(4, 1044082250, -1115541422, -1161988394, 1048735800) + + W(5, -1113315600, 1081890452, 1021891615, -1110157560) + W(6, -1113215633, 1034458457, 1025381303, 1078990875) + + W(7, 1047100697, 1034093689, 1034531971, 1025753183) + W(8, -1116357686, 1057946443, -1138523317, -1121128958) + + W(9, -1118383435, 1036634769, -1096961046, -1129266047) + + W(10, -1118643722, -1164400298, 1028261725, 1000882603) + + W(11, 1047278155, 1020805991, 1003167691, 1023430939); + WS(-1086946092, 1067745931); + sum1 = + W(0, -1129718754, 1043160110, 1057051220, -1086793423) + W(1, 1029510552, 1019782728, 1029399808, -1107060738) + + W(2, 1052187432, -1093519641, 1041235060, 1028876859) + W(3, 1034551451, 1035261538, 1056679450, -1086890615) + + W(4, 1027399596, -1121687640, 1031195606, -1095383669) + + W(5, 1065908691, -1082115172, 1028581668, -1151056709) + + W(6, 1040134022, -1133919947, 1053194351, -1091092163) + W(7, 1039541441, 985161115, 1033121193, -1122710934) + + W(8, 1055695833, -1087806651, 1022886169, 1032179179) + W(9, 1023151712, -1107305618, 1050664148, -1106762967) + + W(10, 1035840335, -1137650955, 1042343314, 1042006276) + + W(11, 1051480109, -1086763775, -1123269599, 1023858088); + sum2 = + W(0, -1092038506, 1049598436, 1043882093, 1042320103) + W(1, -1131832297, -1121740952, -1100127293, 1048639033) + + W(2, 1037661877, -1103044471, 1002123811, 1029198842) + W(3, -1076970891, 1064718435, 1059313512, 1034035103) + + W(4, -1103733932, -1115216799, -1074419095, 1072396257) + + W(5, 1057486689, -1104719409, 1041582287, 1010136401) + W(6, -1072137471, 1071503744, 1051417643, -1111075093) + + W(7, -1115120295, -1128000009, -1071882845, 1074270589) + + W(8, 1058040444, 1044428409, -1139439905, 1024386386) + W(9, -1075499422, 1071966648, 1034550731, -1105998171) + + W(10, 1008560441, -1120184167, -1077760287, 1067893220) + + W(11, -1109701446, 1040427981, -1112073274, 1030441594); + WS(-1081254198, -1103496580); + sum1 = W(0, -1115414444, -1146587219, -1093427101, 1048836291) + + W(1, 1038644661, 1040942563, 1041339642, -1098606506) + + W(2, -1097683981, 1057498447, -1144521152, -1102869832) + + W(3, -1098407452, 1050459360, -1091994231, 1058816906) + + W(4, -1117884339, 1036627839, -1130637434, 1042214179) + + W(5, -1078168847, 1061921355, 1040740783, -1165859686) + + W(6, 1020760807, -1117423418, -1095228700, 1063391143) + + W(7, -1099277734, -1107645994, -1101995566, 1034598934) + + W(8, -1092752622, 1049596874, -1125383814, 1047950513) + + W(9, 1047565230, -1122745995, -1097351785, 1055225025) + + W(10, -1125503451, -1104517417, -1100079212, 1024450296) + + W(11, -1094816186, 1057483350, -1112883619, 1038686359); + sum2 = + W(0, -1101463653, 1057761413, -1092703936, -1109493923) + W(1, 1041760680, 1014720459, 1049429767, 1067192921) + + W(2, -1078098525, -1139460835, 1028945771, -1117756514) + + W(3, -1128244554, 1075421514, -1071536845, 1039603395) + + W(4, -1114414573, 1016362862, -1113723320, 1075836777) + + W(5, -1077415283, -1087182285, 1045554670, -1118637934) + + W(6, -1100253783, -1088665878, 1059548308, 1034610843) + + W(7, -1106673179, -1125369728, -1100739127, 1016894214) + + W(8, 1051692516, -1117875445, 1032645955, 1027339291) + W(9, 1041910404, -1116933337, -1101242161, 1013931579) + + W(10, -1122014712, 1013909643, -1105778187, -1111337535) + + W(11, 1048285068, 1038460759, -1113595007, -1124961818); + WS(-1089093868, 1047195432); + sum1 = W(0, -1139038025, -1108646892, 1042227448, -1116853265) + + W(1, 1032512066, 1015754506, -1146634508, -1102493258) + + W(2, 1050027260, -1113152371, 1037772585, -1111624526) + + W(3, -1107247574, -1102675263, 1055627170, -1102292967) + + W(4, 1040310103, -1122052409, -1111039036, 1027299238) + + W(5, -1094097439, 1059178599, -1120135685, -1123630421) + + W(6, -1111569431, 1043334313, -1086063146, 1064850945) + + W(7, -1097054397, 1035574535, -1131070116, 1035038251) + + W(8, -1091453053, 1055758905, -1107670363, -1126001639) + + W(9, -1123633457, -1130835530, -1104540112, 1047069456) + + W(10, -1109953256, 1015067608, -1125658710, 1006218639) + + W(11, -1100496626, 1028822677, 1033685440, 906381938); + sum2 = W(0, -1103632983, 1051248459, 1050224986, -1112111441) + + W(1, -1114055425, -1111599379, 1043805370, -1102825598) + + W(2, -1106748849, -1107415409, -1113209339, 1037386114) + + W(3, -1100282419, -1110573499, -1142028319, 1047715488) + + W(4, -1106125891, -1107474855, 1043204826, 1027245233) + W(5, 1068200484, 1064575785, 1034756297, 1042201726) + + W(6, -1107284068, -1115422824, -1110893073, -1116519441) + + W(7, -1121811913, -1115818225, 1032596944, -1088944566) + + W(8, -1082511144, -1166081973, 1036646608, 1036836551) + + W(9, -1115324019, -1119815045, -1101546175, 1033478296) + + W(10, -1139772871, -1107371535, 1038389706, -1103855212) + + W(11, -1099926119, -1112155627, 1042197713, 1026011708); + WS(-1121781432, -1075996235); + sum1 = + W(0, -1139185884, -1104344139, 1055178280, 1023675446) + W(1, -1115352921, -1116105386, 1017932812, -1106763371) + + W(2, 1050633065, -1102467779, -1113788396, -1134059780) + + W(3, 1031934942, -1097501556, 1061458986, -1098857564) + W(4, 987917899, -1113912527, 986151814, -1122902443) + + W(5, 1056941803, -1087567683, 1038547421, -1136836585) + + W(6, -1164665422, -1153685131, 1057254916, -1091469811) + + W(7, -1108760371, 1007170123, 1000199096, -1127990679) + + W(8, 1045616484, -1104204108, 1011665321, -1128021832) + W(9, 1007298263, 1001735501, 1030315686, -1129857478) + + W(10, -1121847517, -1154396360, -1140438078, -1113474827) + + W(11, 1046908556, -1103515070, -1118109260, -1121041198); + sum2 = + W(0, -1168649543, -1097479461, 1049098480, 1042706476) + W(1, 1041988609, -1106980555, -1129109975, -1104465921) + + W(2, 1049155382, -1102354715, -1112820525, -1122042062) + + W(3, 1016893178, -1103938775, 1057022497, 1043506300) + + W(4, 1047765539, -1105649317, -1132018102, -1118749694) + + W(5, -1098731951, -1097087336, 1046909100, 1031531696) + + W(6, -1117453381, -1115486085, -1119719509, 1057524747) + + W(7, -1100642605, -1114531186, 1023462612, 976518647) + W(8, -1106384437, 1036026738, -1121071990, 1040948740) + + W(9, -1106957470, 1025546665, -1098317799, 1045328977) + + W(10, -1106523641, -1113359258, -1115823387, 1034975399) + + W(11, -1105263623, 1035074429, 1003192501, 1033488186); + WS(1058868844, 1053114578); + sum1 = + W(0, 1019520880, 1047026923, 1040716289, -1095841007) + W(1, 1020793813, 1026453035, -1122446279, -1120049453) + + W(2, 1048040834, -1093651986, 1039005404, -1117418946) + W(3, 1037061470, 994701546, 1059285152, -1089525095) + + W(4, 1046415125, 1019785277, 1025396381, -1104790763) + W(5, 1063349990, -1081113852, 1040363303, -1114838686) + + W(6, 1029402067, -1104820950, 1062179110, -1086213616) + W(7, 1045703966, 1030676884, 1031841884, 1021084025) + + W(8, 1056787146, -1087503095, 1041196477, 1024749253) + + W(9, -1120186199, -1105237507, 1046529242, -1091401861) + W(10, 999605293, 1004229292, 1033549944, 1009185118) + + W(11, 1057448647, -1088312360, 1036113571, 1022861598); + sum2 = + W(0, 1050427341, -1089070569, 1053219089, 1067490860) + W(1, -1080930470, 1058659628, -1106859908, -1111523090) + + W(2, 1052246278, -1093125710, -1078811541, 1066232343) + W(3, 1035861035, 1043538575, 1059060280, -1078649576) + + W(4, -1074777053, 1073277874, -1112488680, -1097196972) + + W(5, -1088179143, -1087268097, -1075643449, 1065823003) + W(6, 1032409135, 1036654054, 1017346040, 1059384755) + + W(7, -1124572738, 1062269032, -1122621450, -1133854060) + W(8, 1043005089, 1062938540, 1049929252, 1043425453) + + W(9, -1104767713, -1130574088, -1092034159, -1093321870) + + W(10, -1112625720, -1092663388, 1046587865, -1093068011) + + W(11, 1052143300, 1059539225, 1059287102, -1098215774); + WS(-1074642550, 1059001037); + sum1 = + W(0, 1033877849, -1105864948, 1040506928, -1096349630) + W(1, 1046552293, -1110243859, -1114814273, -1133959838) + + W(2, -1108476642, 1023714759, -1108357401, -1127057913) + + W(3, 1017602926, -1106724665, -1098100854, 1055335876) + + W(4, 1032280783, -1147216585, -1122785432, 1042832010) + + W(5, -1084427489, 1065396984, -1132282059, 1033899323) + + W(6, -1119942606, 1046400581, -1083890617, 1062559324) + + W(7, -1113686945, 1032718711, -1121541554, 1036804396) + + W(8, -1088670813, 1061684023, -1104721044, 1025273824) + W(9, 1004629641, 1032924291, -1090515058, 1051195620) + + W(10, -1110306392, -1122497752, -1103073299, 1039804561) + + W(11, -1095458045, 1054342111, 1031943308, -1121848889); + sum2 = + W(0, 1024273115, 1021686194, 1043888107, -1108335658) + W(1, -1077891718, -1110849641, -1131612410, 1025348247) + + W(2, -1101286924, -1122239076, -1091711743, -1111108183) + + W(3, -1107407950, -1105777061, 1048538591, 1046097166) + W(4, -1097181377, 1033944270, 1041256788, 1042238427) + + W(5, -1090332406, 1036931728, 1065426853, -1111979954) + + W(6, -1117121277, -1126779625, 1053208564, 1040874893) + W(7, 1063431633, 1039617071, 1031505312, -1118046720) + + W(8, 1043322093, 1040745205, 1040529954, -1105370761) + + W(9, -1110072407, -1118330488, -1135252559, 1050743072) + + W(10, -1097546746, -1122096807, 1016793154, 1027338756) + + W(11, -1116082242, -1096125238, 1050690616, -1122718137); + WS(-1088674604, -1128666815); + sum1 = + W(0, -1123914807, -1112902532, 1031043843, 1051063687) + W(1, -1094561666, 1018478931, 1016031116, -1154837176) + + W(2, 1033184452, -1131397783, 1025159063, -1134237698) + W(3, 1014718188, -1114821559, 1015481863, 1027540319) + + W(4, -1102063788, 1024172061, 1024027612, -1098901213) + + W(5, 1054517603, -1102428675, -1104802482, -1126359028) + + W(6, -1145356432, -1103324234, 1051928805, -1094753613) + + W(7, 1021380397, -1133861065, 1024193015, -1099251759) + + W(8, 1059978813, -1100081596, -1111732847, -1114031158) + + W(9, -1124389866, -1119376425, 1047372601, -1110958225) + + W(10, -1154253637, 1028470484, 1032770888, -1101826270) + + W(11, 1062901239, -1101878062, -1113334654, -1114369951); + sum2 = + W(0, -1125911137, -1108931889, 1017628143, 1050970701) + W(1, 1035307535, -1132880011, 1012595671, -1114639139) + + W(2, 1032292317, -1128469007, -1112594616, 1026392505) + W(3, 999266341, 1007405169, -1114156858, -1110785518) + + W(4, 1028698628, -1126668834, 1044288444, -1110292957) + + W(5, -1067836662, -1074929312, -1112320536, 1035975658) + + W(6, -1101165077, 1050109344, -1072172899, -1105301985) + + W(7, 1032862316, -1115294669, 1041147790, 1041510968) + W(8, 1037860217, 1044362436, -1133865234, -1122721591) + + W(9, -1113177198, 1029583838, 1074693740, 1048694785) + W(10, -1121233078, 1027549527, 1025832748, 1046353900) + + W(11, 1081403750, 1057358913, 1015908463, -1114367420); + WS(-1092184279, -1114774309); + sum1 = + W(0, -1112548452, 1035183681, -1114927434, 1044352162) + W(1, 979364527, -1115173597, -1120800919, 1038305887) + + W(2, -1101125062, 1039166894, -1131609361, -1182492945) + + W(3, -1114639366, 1043708422, -1087724142, 1063427286) + W(4, -1093459700, 1021495134, 1008341430, 1037535198) + + W(5, -1103312811, 1034792975, 1048665209, -1113251558) + + W(6, 1009522319, -1098020135, 1062809460, -1088121787) + + W(7, 1043037714, -1113757330, -1120506536, 1029108045) + + W(8, -1118967585, -1115071968, 1023205859, -1113409875) + + W(9, 1034801619, -1128765878, 1002077113, -1114196826) + + W(10, 1033949151, -1123554950, 1022706306, -1106461058) + + W(11, 1043448960, -1129024277, -1126884683, -1115469664); + sum2 = + W(0, -1130731300, -1113218164, 1024876637, -1112264614) + W(1, -1099018413, 1026854381, -1146462793, 1028824397) + + W(2, -1129593633, -1113338336, -1111675537, -1102804304) + + W(3, -1114036842, 1013989596, 1044891209, 1058622224) + W(4, -1088855347, -1102462733, 1017173194, 1034818358) + + W(5, -1101530532, -1105838439, 1059579881, -1108694945) + + W(6, 1027612469, -1104368005, 1049606516, 1050794194) + W(7, 1042736448, -1114432119, -1121343755, 1040334859) + + W(8, -1097048862, -1102338893, 1043492825, 1019755962) + W(9, 1027895615, -1123082454, 1042764886, 1040822444) + + W(10, -1121501222, -1122392540, -1154268081, -1123775916) + + W(11, -1113704648, -1122592353, 1034905054, -1119817837); + WS(1061153836, -1122742154); + sum1 = W(0, 1027853554, -1109089440, -1102650256, 1051082942) + + W(1, 1027843188, -1131011401, -1115291137, 1043116226) + + W(2, -1115210274, 1047414994, -1112215273, -1119605372) + + W(3, -1171221910, -1138258466, -1112757431, 1055597733) + + W(4, 1034632359, -1126942769, -1112977164, 1050791197) + + W(5, -1077890273, 1055540065, 1042514461, -1126698730) + + W(6, -1121554637, 1034471002, -1082648980, 1061271560) + W(7, -1131618020, 998349933, 1022714404, 1041098678) + + W(8, -1093251577, 1053866013, 1046515591, 1025132479) + + W(9, -1157881362, -1134239506, -1097764996, 1044732088) + + W(10, 1036747322, -1120958927, -1123187178, 1034237593) + + W(11, -1092621429, 1032996986, 1043087924, 984532249); + sum2 = + W(0, 1031101174, -1102026314, 1042272104, -1126868316) + W(1, 1028240358, 1023923290, -1132731961, 1038074007) + + W(2, -1090146581, 1042331882, 1036936531, -1128194324) + W(3, 1022986308, -1092900468, 1028046198, 1039425711) + + W(4, -1122656394, -1114483483, 1017601076, 1030590838) + W(5, 1054179894, 1068886648, 1039233571, -1108833787) + + W(6, -1126674740, 1001758673, -1096188072, 1049555295) + W(7, -1086618714, 1026905222, 1022398052, 1001713969) + + W(8, 1035923987, -1096410864, -1090080092, 1029729918) + + W(9, 1013813081, -1140283033, -1106500726, 1036573795) + + W(10, -1110072380, 1035325123, 1010235161, -1138091097) + + W(11, 1036670019, -1105222854, -1134061337, 1035525391); + WS(-1098883799, 1037141561); + sum1 = W(0, -1114839991, 1039141586, -1110021469, 1020247259) + W(1, 1030453625, 1040211480, 1029657918, 1034970850) + + W(2, -1090767256, 1029681923, -1119339247, -1126798193) + + W(3, -1116594483, 1048999812, -1089859629, 1058872566) + + W(4, -1104869706, 1041448405, 1034543274, 1026227619) + + W(5, 1007604554, -1100094273, -1106749124, -1123771570) + + W(6, 1026816074, -1103366664, 1063309440, -1090400131) + + W(7, 1040832320, 1006844457, -1140770618, -1115755155) + + W(8, 1050338841, -1090199858, 1023759014, -1131945671) + + W(9, 1035386535, -1109617409, 1049028980, -1104209655) + + W(10, 1040157646, -1115455274, 1007197468, -1117505278) + + W(11, 1050252341, -1101914812, 1034144506, -1106217213); + sum2 = W(0, 1003211606, -1120528483, -1156174412, -1122088448) + + W(1, 1034591096, 1008615371, -1137674963, -1120827669) + + W(2, -1165578649, 1021421814, 1046263423, -1109822394) + + W(3, -1151639180, -1113012012, 1045965141, -1108742643) + + W(4, 1043768035, -1107512724, -1126381316, -1125167698) + + W(5, -1143882022, 1025314463, 1048434617, -1102660599) + + W(6, -1125497686, -1133545211, -1157195276, 1048741047) + + W(7, -1100558843, -1103528899, -1120928387, 1042115577) + + W(8, -1139515595, 1042307479, -1111490489, -1116374767) + + W(9, 1024650751, -1111755343, 1024020315, 1028526161) + + W(10, -1106766859, 1031989982, -1121709003, 1034768106) + + W(11, -1128894336, 1033940928, -1105393784, -1146160726); + WS(1056068055, 1054753321); + sum1 = W(0, -1151415881, 1039080395, 1057552055, -1089028090) + + W(1, -1115248008, 1035025164, -1148496799, -1110003853) + + W(2, 1043835198, 1042243518, 1050869997, 1014222010) + W(3, 1010657956, 1010453293, 1059020393, -1089501818) + + W(4, 1038857744, 1019596694, 1024019466, 1036235820) + W(5, 1056043521, -1077848098, 1040563886, -1121658024) + + W(6, -1130137728, 1020552269, 1059247988, -1085601017) + + W(7, 1031869090, -1123056704, 1008503186, 1036573197) + W(8, 1054798584, -1088101382, 1014726271, 1035081577) + + W(9, -1132133255, -1115513116, 1050516586, -1102383812) + + W(10, 1037313809, -1137744617, 1035499631, 1040242409) + + W(11, 1047345767, -1092379525, -1116861746, 1008326318); + sum2 = + W(0, 1028355794, -1096807405, 1040605863, 1067941768) + W(1, -1077104108, 1052817152, -1106782132, 1053669968) + + W(2, -1138391825, -1075220438, -1095467240, -1103015841) + + W(3, 1035193429, -1113415499, 1054131819, -1088459045) + W(4, -1094157882, 1049259157, 1019490884, 1045145961) + + W(5, -1117197986, 1059082808, 1063065831, -1103440804) + W(6, -1103311494, 1033457423, 1014178849, 1050105229) + + W(7, 1061761756, -1095094287, 1051099266, -1105194567) + + W(8, 1043284247, -1121773074, 1042603721, -1122898552) + + W(9, -1107701072, -1111393110, 1045435457, -1120483817) + + W(10, -1116379229, -1109769641, 1017055868, 995616995) + + W(11, -1110630971, 1023829774, 1044996767, 1018464332); + WS(-1081368566, -1084412265); + sum1 = + W(0, 1027068306, -1116002144, 1048181720, -1097381330) + W(1, -1110979184, 1021378954, 1015688387, -1139602460) + + W(2, 1048418201, -1109028275, 1018111780, 1036715310) + W(3, 1033201483, -1116483849, 1059204754, -1086309497) + + W(4, -1126061147, -1118145977, 1018141039, -1108067395) + + W(5, 1059054739, -1080843359, 1023153354, 1024269909) + W(6, 1032237687, -1114781410, 1060863016, 1035809139) + + W(7, 1043786804, 1014428471, 1022250212, -1101031910) + W(8, 1054995541, -1090938969, -1102361409, 1015803518) + + W(9, 1019999841, -1110135922, 1048891912, -1097995920) + + W(10, 1017536656, 1027639288, 1019305877, -1115253585) + + W(11, 1054003721, -1098655035, -1110370680, 1026153225); + sum2 = + W(0, -1105480981, 1050460434, -1098849709, 1048076097) + W(1, 1035320005, -1105501338, 1035973965, -1096496755) + + W(2, 1051612828, -1090117310, 1047120319, -1108725217) + W(3, 1037165381, 1049140757, -1090898849, 1053634690) + + W(4, 1021130333, 1039969785, -1106311589, 1006710678) + W(5, 1040931379, 1066845841, -1083953982, 1046728781) + + W(6, 1052000177, -1091756558, 1058463605, -1077185739) + W(7, 1057459457, 1038345201, -1104974154, 1044207757) + + W(8, -1090778289, 1058534342, -1091684787, -1141278071) + + W(9, -1120302417, 1032159893, 1039812947, -1102438650) + + W(10, 1041032826, 1040363142, 1040627526, -1100748342) + + W(11, 1045155050, -1096398368, 1045504944, -1109297232); + WS(1040286894, 1035975353); + sum1 = W(0, -1171293815, 1034319831, 1059664710, -1091927835) + + W(1, -1116625676, 1013574450, 1023182418, -1127987806) + + W(2, 1048633701, -1097464070, 1029070026, 1012611215) + W(3, 996039142, -1102399280, 1062256902, -1087363556) + + W(4, 1016696459, -1115123712, -1137235964, -1105596260) + + W(5, 1059153168, -1086480503, 1000027879, 1006568169) + + W(6, -1135192533, -1103790599, 1061115073, -1089057879) + + W(7, 1028964506, -1134032598, 1025821242, -1108335719) + + W(8, 1056014846, -1099300213, -1108586113, 1032814547) + + W(9, -1128818097, -1114500598, 1050028641, -1097571161) + + W(10, 1032749254, 1020632239, 1020463141, -1129600787) + + W(11, 1052737098, -1112421262, -1096430155, 1016193698); + sum2 = W(0, -1115556642, 1037372428, 1085969060, 1051814466) + + W(1, 1011471282, -1114698318, -1130243023, 1030557532) + W(2, 1077581449, 1043810263, 1030366783, 1034280644) + + W(3, 1032034792, 1049080310, -1074326256, -1103611514) + + W(4, -1109496698, -1140286158, -1126476135, -1112452010) + + W(5, -1064530882, -1081646826, -1129814679, 1022645135) + + W(6, 1032996496, -1108874582, -1074476109, 1033029539) + + W(7, 1035377868, -1126128243, -1138592966, -1125709403) + + W(8, -1104386166, 993676602, 1007963430, 1013431542) + W(9, -1121911846, -1147299853, 1029772508, 1034388196) + + W(10, 1005762565, -1114714998, 1029413614, -1125845903) + + W(11, -1109306490, 1000946837, 1024214725, 1024966722); + WS(-1128144240, -1105727419); + sum1 = W(0, 1008177348, 1038442911, 1034971295, 1037111480) + W(1, -1119737674, 1019898055, 1008158465, 1030921926) + + W(2, -1108323937, 1020025483, 1015575522, 1036155997) + W(3, 1025380533, -1116236765, 1041262911, 1039711206) + + W(4, -1096558626, 1023258159, 1041196118, -1091904121) + + W(5, -1116818069, -1090328900, -1106145913, 1038413850) + + W(6, -1123971020, -1110541401, -1118195565, 1053066642) + + W(7, -1107602136, -1123851725, 1038005880, -1155490648) + + W(8, 1050488689, -1108534613, 1033678004, 1027658998) + + W(9, -1110790464, -1118346788, 1005836543, 1032777199) + + W(10, 1034582855, -1118860082, 1022532691, -1132141153) + + W(11, 1035288564, 1043217853, -1110557919, -1161170171); + sum2 = + W(0, -1128930637, -1132037027, 1018701611, -1110976033) + W(1, -1129623857, 1029665439, 1013105493, -1110061572) + + W(2, 1028677045, -1113315034, -1136221161, -1120215489) + + W(3, 1027020519, 1023565141, -1097696705, -1136487341) + + W(4, 1045236380, 1025952555, -1111106512, -1118411413) + + W(5, 1051172043, 1064921249, -1100340880, -1120959951) + + W(6, 1033707008, -1104848450, 1036460110, -1097426277) + W(7, 1026225447, 1006240491, -1108465338, 1001195043) + + W(8, -1134254189, 1028959819, 1033145987, -1118442072) + + W(9, -1130609759, -1113096913, 1035127174, -1113952185) + + W(10, -1105387359, -1137489821, -1112986298, -1123693871) + + W(11, 1021784635, -1139702593, 1025786651, -1119362634); + WS(1066786198, 1018352061); + sum1 = + W(0, 1037807432, 1042991174, 1056116676, -1089303485) + W(1, -1115182496, 1044944769, -1147124480, -1118935590) + + W(2, 1053008404, -1093203077, 1032850856, 1019595829) + W(3, 1032919115, -1102401423, 1058826232, -1091158043) + + W(4, -1118679276, 1030098999, 1043153405, -1111703874) + W(5, 1052869895, -1077398372, -1112497438, 990101824) + + W(6, 1024885356, -1105747115, 1063596395, -1088790919) + W(7, 1041854800, 1037575334, 1040525108, -1109427003) + + W(8, 1052412861, -1096537905, -1158252416, 1022825908) + W(9, 1034093744, 1036876386, 1055303296, -1092801624) + + W(10, 1029739551, 1042956152, 1041644314, -1113217832) + + W(11, 1055747689, -1095292522, -1097656684, 1027108728); + sum2 = W(0, 1036031230, -1102747382, 1040389106, 1027629590) + + W(1, 1033840740, -1113736580, -1120880520, 1035081854) + W(2, 999021742, 1048871361, 1037408166, 1036561850) + + W(3, -1118383086, -1081312733, 1046511529, -1102228261) + + W(4, -1111365044, -1105995296, -1112120068, -1097589576) + + W(5, 1061513306, 1059108854, 1017984327, 1037901466) + W(6, 1044452135, -1136989239, -1098672489, 1030279668) + + W(7, 1032578550, 1024281094, -1113902667, -1101386787) + + W(8, 1028645652, -1090327880, -1098256610, 1003868670) + W(9, 1036248196, 1038098664, 1037598188, 1046091275) + + W(10, 1055272900, 1035521712, -1175016923, -1106083613) + + W(11, 1027306194, -1110606753, -1100293962, -1114802202); + WS(-1088826540, -1072617048); + sum1 = + W(0, 986338164, 1037920241, 1051799989, -1096657083) + W(1, -1131268440, -1122826702, 1023136598, -1108211448) + + W(2, 1051897846, -1097067830, -1134063855, 1022858827) + + W(3, -1127817408, -1117329516, 1060040519, -1085267217) + + W(4, 1034398076, 1016624516, 1038855104, -1098615294) + W(5, 1068445460, -1091986338, -1104903024, 1025833567) + + W(6, -1112014844, -1156351446, 1041659186, -1085224562) + + W(7, 1041222927, -1148095931, 1032100206, -1125030464) + + W(8, 1049473503, -1095210946, -1123500579, 1018816617) + + W(9, -1114071293, 1025960366, 1046320643, -1103740786) + + W(10, 1021522163, 1004333185, 1031252724, -1128205111) + + W(11, 1053193450, -1098483636, -1110505437, -1135786218); + sum2 = + W(0, 1025188267, -1139275200, 1040515214, -1131755519) + W(1, -1105181237, 1030566925, -1121532154, 1033600964) + + W(2, -1111129732, -1105820182, 1041295374, -1137053008) + + W(3, 1037371296, -1123953755, 1035395064, 1067277095) + + W(4, -1104867399, -1131759093, -1111771837, 1046721727) + + W(5, -1119362505, 1075696256, 1058324165, 1026363312) + W(6, 1040037716, -1098628025, 1046868281, -1070220409) + + W(7, -1095490474, -1118056117, -1106548534, 1040338433) + + W(8, -1095083293, -1079865944, 1030948623, 1018203389) + W(9, 1039102739, -1109104289, 1045077862, 1049591033) + + W(10, -1107729189, -1128931569, -1109851481, 1042987802) + + W(11, -1121821072, -1113640498, 1039251361, -1123620784); + WS(-1126600048, -1081356549); + sum1 = W(0, -1127841038, -1133929050, -1098403026, 1044657313) + + W(1, -1112364357, -1126110067, -1121393942, 1032965854) + + W(2, -1092154099, 1056638003, 1040562850, 1036225512) + + W(3, -1127713943, 1033968271, -1092503722, 1049224359) + + W(4, 1040769245, -1129561307, -1112866678, 1043820719) + + W(5, -1081570623, 1066854747, -1105175211, 1047740947) + + W(6, -1130256197, 1042942538, -1086843241, 1055316562) + + W(7, -1123699911, -1102743497, -1113126004, 1043379215) + + W(8, -1092479684, 1058087872, -1108064855, 1041161205) + + W(9, -1135790871, 1027795642, -1097678271, 1032418298) + + W(10, -1138101411, -1106598351, -1114110304, 1034600139) + + W(11, -1094287464, 1051778533, 999504676, 1039116783); + sum2 = + W(0, 1002695390, 1041236493, -1107205869, -1110230321) + W(1, 1025661924, 1013006047, -1122258341, 1024135109) + + W(2, -1167041196, -1120190201, 1051920007, -1101224590) + + W(3, -1122292123, 1018577975, 1048984334, -1063745707) + W(4, 1083223141, 1033459361, -1120933435, 1034742596) + + W(5, -1085659967, -1070580481, 1079255156, 1037086181) + W(6, 1032169765, -1148289286, 1041640777, 1042707591) + + W(7, -1110361303, -1105447820, -1117894001, -1155671947) + + W(8, -1108030745, 1049556353, -1097500712, 1029970779) + + W(9, 1003179774, 1027950533, -1123201389, -1106095214) + + W(10, 1030518681, 1006793819, -1138289315, -1116290259) + + W(11, -1139220243, 1050855401, -1105964729, -1115669085); + WS(1044741550, -1111040261); + sum1 = + W(0, -1123328853, -1129171790, -1119860449, 1045626213) + W(1, -1104602741, 1022127887, -1102049737, 1051367713) + + W(2, -1091471693, 1046305018, 1044417333, -1107859535) + W(3, 1040528310, -1097130129, 1035652177, 1049556145) + + W(4, -1091825946, 1033350174, -1104112191, 1051950321) + + W(5, -1092522751, 1053940037, 1049099055, -1124872112) + W(6, 1024305776, 1039437043, -1095677118, 1055561708) + + W(7, -1104689389, -1115808049, -1101315365, 1045396986) + + W(8, -1130673884, -1095468986, 1055485165, -1115536169) + + W(9, 1021709031, -1108128612, -1112716514, 1044018368) + + W(10, -1103796617, 1029190802, -1111623399, -1165073551) + + W(11, -1121220876, 1026385047, 1036376309, -1122289340); + sum2 = + W(0, -1104033148, 1039328248, 1040757730, 1023457753) + W(1, -1105261590, 1019934334, -1105436527, 1038128967) + + W(2, 1010939044, -1118329847, 1011822306, 998732076) + W(3, -1109964889, 1010051700, 1051778220, -1098103909) + + W(4, 1019752394, -1151355224, -1097126651, 1057153562) + + W(5, 1035481326, -1094975289, 1037637839, -1112777586) + + W(6, -1098141643, 1057745438, -1094952202, 1048659070) + W(7, 1023965510, 1012075272, -1090250993, 1060383381) + + W(8, -1102222701, -1098057265, 1049957743, -1134551782) + + W(9, -1116302593, 1035812245, -1133841678, -1123621243) + + W(10, -1104798795, 1031321862, -1118233874, 1044677482) + + W(11, -1105877607, -1160321672, 1036758948, -1124061226); + WS(1065794902, 1053657215); + sum1 = + W(0, -1121908120, 1038333639, 1027457764, -1123855831) + W(1, -1123864939, 1004753494, 1018314063, 1031009517) + + W(2, -1106391546, 1034446294, -1121443224, 1015085764) + W(3, 1015310777, 1039118671, -1097318831, 1039330595) + + W(4, 1026117491, -1152877546, -1124873339, 1034311430) + + W(5, -1141167585, -1090069831, 1040632671, -1119728987) + + W(6, 1031572020, 1041290230, 1054548019, -1096859758) + + W(7, 1028976296, -1155937596, -1147984576, -1120195837) + + W(8, 1053489270, -1090834490, 1043686014, -1132243578) + + W(9, 1024640407, -1119856235, 1041008530, -1105884449) + W(10, 1007855863, 999100652, 1026486289, -1114392412) + + W(11, 1038700424, -1105777031, 1023881277, -1148206328); + sum2 = + W(0, -1111593455, 1035072504, 1043803228, 1033408259) + W(1, -1104275307, 998670368, 1026283313, 1028902500) + + W(2, -1108682745, -1102620143, 1005020832, 1032181798) + W(3, -1106910582, 1047373071, 1040261276, 1048908013) + + W(4, -1100960524, 1023771046, -1123416451, 1053329938) + W(5, 1067600226, -1090850305, 1050480903, 1032569956) + + W(6, 1050577288, -1092564654, -1072392505, 1062297118) + + W(7, -1138210428, -1112013629, -1128641646, -1100521328) + + W(8, -1113219589, 1017836657, -1168415746, 1023611526) + W(9, 1047088729, -1096962366, 1049469167, 1033530157) + + W(10, 1025688819, -1112880371, -1113858977, 1017970524) + + W(11, 1037790473, -1125952722, -1131011166, 1021270423); + WS(1062391596, 1012575503); + sum1 = + W(0, 1031343933, -1118754907, -1124966418, -1110681406) + W(1, 1044511208, -1105353116, -1104891955, 1040079801) + + W(2, 1034244551, -1097175282, 1039695694, 1041572194) + W(3, 1032025473, -1098309187, -1115351741, 1051954479) + + W(4, 1024690888, -1106768761, 1018981700, 1047266492) + W(5, -1082667844, 1046130725, 1049723012, -1111177056) + + W(6, -1107154694, 1041578200, 1034155267, 1051147223) + W(7, -1103478091, 1041859398, 1037332142, -1102249736) + + W(8, -1116669206, 1052085167, 1031631968, -1100878141) + + W(9, -1113508494, 1040475388, -1108675062, 1003822408) + + W(10, 1001356052, 1037747241, -1120166325, -1099931343) + + W(11, 1037232762, 1045069376, -1120670778, -1115735812); + sum2 = W(0, 1033523600, 984378304, 1029410276, 1013286288) + W(1, -1149511552, -1114072340, -1111554425, 1035520350) + + W(2, 1027721316, -1092144316, 1040549613, 1027894332) + + W(3, -1129275556, -1139357832, -1120989222, 1051778774) + + W(4, -1101613332, -1138380800, -1122087690, 1042336361) + + W(5, 1063527919, 1062226267, 1044728263, -1113445964) + + W(6, -1124036306, -1098127108, -1086537602, -1106529787) + + W(7, -1102568312, 1042436209, 1037981702, -1108770624) + + W(8, -1087308230, 1023869712, 1043627655, -1103441850) + + W(9, -1119955572, 1031985496, 1038170956, -1106223749) + + W(10, -1109791564, 1038090706, -1122349214, 1030270440) + + W(11, 1040810725, -1113965912, 1025118636, -1120264936); + WS(1061969900, 1065420380); + sum1 = W(0, 1002358108, 1041410250, 1005238718, -1098164717) + + W(1, -1127598604, 1013481849, -1132400117, 1024825568) + + W(2, 1055004288, -1093641048, 1037205414, -1128588267) + + W(3, 1036273784, -1111416381, 1058195604, -1089452644) + + W(4, -1122200151, 995531041, -1121891281, -1112279056) + + W(5, 1065721300, -1081575699, 1041630292, -1118185583) + + W(6, 1031471239, -1100377015, 1058645356, -1095897092) + + W(7, -1115380038, 1031870564, 1014037550, -1110955448) + + W(8, 1050103969, -1095327860, 1033148051, -1125213521) + + W(9, 1015146068, -1140842745, 1047622119, -1122283864) + + W(10, -1112032609, 1031659065, 1021231496, -1109508230) + + W(11, 1050895308, -1101391147, -1107652840, -1167265945); + sum2 = W(0, 1037378832, -1097408481, -1089422359, -1134521568) + + W(1, 1024014288, -1156999910, -1105869799, 1040337956) + + W(2, 1064628576, 1048269110, -1113808990, -1121898726) + W(3, 1034348880, 1050274911, 1078490638, 1055313899) + + W(4, 1025241947, 1025759300, 1010791317, -1124897054) + + W(5, -1067190452, -1081189141, -1100728789, 1010618498) + + W(6, 1020451237, -1105197585, 1026583828, 1051135592) + W(7, 1047164907, 981635389, 1025476671, -1107003535) + + W(8, 1034175619, 1043712009, -1112306567, -1142752483) + + W(9, -1121382126, -1131733180, 1030289482, -1114815155) + + W(10, 1025919494, -1158764013, -1144944739, -1128932040) + + W(11, 1035014695, -1125325948, -1116208218, 1029088384); + WS(1048733783, 1027643848); + sum1 = + W(0, -1133845785, 1036515120, -1088559253, 1057953132) + W(1, 1034283684, -1114935677, -1133175894, 1023561851) + + W(2, -1093510507, 1049915371, -1130587597, 1012777537) + + W(3, -1135183403, 1042717327, -1088396394, 1060634166) + + W(4, -1127730531, -1122593837, -1116789548, 1030082171) + + W(5, -1080791005, 1063183646, -1114509469, 1031486794) + + W(6, -1148511502, 1048693393, -1089662985, 1058925305) + + W(7, -1138682841, -1116148770, -1134260761, 1034425221) + + W(8, -1090323862, 1044704560, 1038705162, -1166921432) + W(9, 1018609610, 1039337356, -1100061261, 1042697693) + + W(10, 1015444552, -1126426832, -1123833247, 1027869798) + + W(11, -1089888600, 1047384498, 1049640472, 1023971661); + sum2 = + W(0, 994989105, 1037891939, -1173716290, -1100065758) + W(1, -1120127409, 1036146011, -1144072856, -1103317800) + + W(2, 1052666546, -1122814128, -1094230404, 1054652553) + + W(3, -1122509885, 1037436931, 1001371192, -1129250144) + + W(4, -1083084807, 1061875701, 1026939205, -1127785128) + W(5, 1040815920, 1058553182, -1075758811, 1067689129) + + W(6, 1028398855, -1103788534, -1100616833, 1055924851) + + W(7, -1074914963, 1068744910, -1120878413, 1034163445) + W(8, 1020001090, 1053725018, -1075891465, 1067320464) + + W(9, 1025208177, -1127272012, -1134790452, 1036740791) + + W(10, -1081737398, 1065190583, -1113678678, 1026044831) + + W(11, 1043708121, -1123998093, -1084193900, 1062426867); + WS(-1084457324, 1066101859); + sum1 = W(0, -1146837948, -1111022815, -1115296098, 1042035070) + + W(1, 1030912362, -1121095658, 1016102797, -1125864729) + + W(2, 1038645029, 1047347075, -1106508822, -1128702979) + + W(3, -1115430590, 1047559389, -1083544605, 1059438663) + + W(4, -1104927285, 1022709564, -1115904029, 1034715654) + + W(5, 1037951214, 1052960194, -1167432352, -1129984885) + + W(6, -1139281484, -1103064096, 1057869073, -1083491782) + + W(7, 1045723406, -1123913107, -1117556663, -1108958078) + + W(8, -1109939240, 1046468604, 1012598283, -1123056725) + + W(9, 1034492603, -1131712724, -1123954086, -1121536740) + + W(10, 1019381994, 1026960983, -1124011056, -1131623214) + + W(11, -1123535023, 1043250206, -1110102674, -1128824061); + sum2 = + W(0, -1125705477, -1127395739, -1105227463, 1036906007) + W(1, 1026846896, 989272222, -1127756609, 1044805550) + + W(2, 1015549291, -1109261657, 1037043129, -1106679057) + W(3, 993770127, -1097909373, 1049252886, -1102191244) + + W(4, -1097396928, 1042524140, 1034569455, -1177736375) + W(5, 1058826852, 1061852121, -1116961215, 1013800282) + + W(6, 1010458600, -1116962018, -1119951878, -1086841826) + + W(7, -1103314123, 1033157194, -1119844207, 1043096893) + + W(8, -1094678765, -1128420796, 1038664018, -1128652243) + + W(9, -1122090273, 1035619005, -1119199398, 1021651597) + + W(10, 1035622840, -1124905499, 1019369801, -1112228363) + + W(11, -1109645851, 1038741216, 1019677755, -1126258736); + WS(1067036470, -1087655195); + sum1 = + W(0, -1143851962, 1018554747, 1050955184, -1110423387) + W(1, -1106360251, 1025799530, 1026890311, -1120379564) + + W(2, 1053786273, -1098337218, 1040602294, -1118031105) + + W(3, -1106604063, -1114993347, 1042552729, -1090196611) + + W(4, -1134551499, -1119796702, 1016195769, 1022258327) + + W(5, 1063572966, -1083965137, 1045568787, -1110210301) + W(6, -1138731339, 981655329, 1058367344, -1084059678) + + W(7, 1046272662, -1132188582, 1037080924, 1045778247) + W(8, 1055564522, -1090231591, 1028646847, -1117810092) + + W(9, -1121217270, 1025121994, 1047575674, -1096786628) + W(10, 1026932869, 1021012754, 1029907824, 1023696087) + + W(11, 1048845230, -1095677575, 1027665749, -1118338222); + sum2 = + W(0, -1113854255, -1108417433, 1042382895, 1025435556) + W(1, -1108154666, 1042045079, 1028862084, 1033605964) + + W(2, 1032534216, 1033584957, 1046901615, -1105415159) + W(3, -1104900936, -1109151867, 1017793091, 1033281558) + + W(4, -1111336587, 1039313065, -1104116954, -1102487521) + + W(5, 1067799294, -1099286824, 1036137805, 1005958605) + W(6, -1114719178, -1071728118, 1077900204, 1056033422) + + W(7, 1024983956, 1020191839, 1040474278, -1073652757) + W(8, 1051278318, -1113833767, 1034492621, -1114752489) + + W(9, 1048817634, -1090221130, 1048299521, 1011833167) + + W(10, 1033542750, 1024757388, -1122519186, -1102125815) + + W(11, -1105402373, -1107682623, -1127962013, 1032711916); + WS(-1087701164, 1071308133); + sum1 = + W(0, 1040776942, -1100025248, 1040244657, 1047131214) + W(1, -1116520012, -1152028354, -1112915908, 1039729431) + + W(2, -1108101926, -1104971284, -1123736282, -1120800451) + + W(3, 1032135583, -1111499300, -1107965963, 1036283892) + + W(4, -1105297773, 1024489952, -1109010607, 1047911115) + W(5, -1095250332, 1057920197, 1040789767, 1038925278) + + W(6, -1125896234, -1096854047, -1097276733, 1057601759) + + W(7, -1089523085, 1034463851, 1033070381, 1047586960) + W(8, -1104060437, 1046835436, 1046328829, -1130324381) + + W(9, 1001383873, -1100475875, -1129328465, 1017446731) + + W(10, -1107686492, -1112186573, -1127540900, 1025720505) + + W(11, -1115131352, 1041767855, 1031878575, 1015088161); + sum2 = + W(0, -1089646175, 1060062242, 1050551269, 1017421696) + W(1, -1124178965, 1023971829, -1112379036, 1018139178) + + W(2, -1096611550, 1040955729, -1115297526, -1112174927) + + W(3, -1087427677, 1066898400, -1116330565, 1035645225) + + W(4, -1111832492, 1035838465, -1088789602, 1066001716) + W(5, 1056235229, 1040223965, 1027731712, -1128027042) + + W(6, 1059010203, -1079880526, -1118197619, -1114176344) + + W(7, -1106279788, 1015547306, 1060985431, -1081253059) + + W(8, -1102574794, 1044677785, -1130074994, 1033729011) + + W(9, -1139584980, -1095878540, 1039647840, -1100382074) + + W(10, 1040262609, -1110899873, 1054225000, -1095013927) + + W(11, -1099698701, 1035015292, -1124507789, 1032866060); + WS(1063980716, -1121784884); + sum1 = + W(0, 1027357276, 1046480497, -1094692773, 1050884987) + W(1, 1046796692, 1025153935, -1104528667, -1121849329) + + W(2, -1090457523, 1048987838, -1098583576, -1107151594) + + W(3, -1122859745, 1049050976, -1090130146, 1057733925) + W(4, 1037378828, 1016110982, -1107033792, 1046903620) + + W(5, -1084796508, 1061180023, 1034725880, 1023598816) + + W(6, -1105809438, -1128776604, -1089370535, 1054317580) + + W(7, -1096435840, -1114135692, 1033196814, 1050194992) + W(8, -1105629197, 1055134019, 1049629536, 1040596522) + + W(9, -1111338526, -1112079704, -1093813713, 1046804578) + + W(10, -1097780651, -1113598601, -1111105883, 1037688238) + + W(11, -1094775914, 1057027842, 1038664949, -1127372967); + sum2 = + W(0, 1041589168, -1098133521, 1031854878, -1105720063) + W(1, 1035016760, -1121214780, 1024315846, -1106371173) + + W(2, 1051327081, 1023684981, -1128261352, 1011090873) + + W(3, 1043663909, -1106740015, -1108849860, -1124767392) + + W(4, 1035542785, 1029549000, 1040621380, -1107177437) + + W(5, -1106409587, -1127108094, -1111599720, 1034668152) + + W(6, 1040212968, -1111131552, -1120392794, -1102248051) + + W(7, 1051247500, -1136161665, 1033384296, 1040430896) + W(8, -1093765703, 1050935529, -1102687331, 1018485311) + + W(9, 1014426993, 1032409853, -1107120761, 1033359350) + W(10, 1037002974, -1126387868, 1022694293, 1003633577) + + W(11, -1104283048, -1128561530, 1026574958, 998242826); + WS(1047153326, -1105960410); + sum1 = W(0, 1032318440, -1105871782, -1111485966, 1043448020) + + W(1, -1110710801, 1019497606, -1133035902, 1024269605) + + W(2, -1098984649, 1044051929, 1028564080, 1019882933) + W(3, 1023033002, -1110369667, 1050315790, 1059563250) + + W(4, -1113831750, -1118335287, -1111741083, 1047130673) + + W(5, -1080272088, 1053459949, 1024144723, 1018957863) + W(6, 1009988015, 1043587009, -1086889743, 1061038806) + + W(7, -1117616080, -1122250988, -1126171361, -1113373146) + + W(8, -1098309317, 1044456898, -1145766181, -1124691083) + + W(9, -1183551252, 1035984354, -1105786176, 1048086975) + + W(10, -1114741783, -1123242346, -1118067977, -1111622952) + + W(11, -1106267538, 1037611273, 1040212689, -1150984053); + sum2 = W(0, -1132142402, -1109262360, 1044069954, -1111364284) + + W(1, 1031679549, 1018817977, 1019405455, 1034679642) + + W(2, -1104355470, -1108806456, -1097044621, 1034241557) + + W(3, 1022592575, -1099677890, -1119884477, -1066728208) + W(4, 1043056057, 988348592, 1002713172, 1048612806) + + W(5, -1094376769, 1079847520, 1057366851, -1114461524) + W(6, 993592760, 1036415285, -1110824904, 1060715429) + + W(7, -1104696735, -1107038514, -1120241477, -1118742739) + + W(8, 1031998111, -1103911380, 993276152, 1036085605) + W(9, 1024283135, -1125545553, -1128336378, 1028262793) + + W(10, 1012785110, -1128734189, -1139068036, -1129249399) + + W(11, 1030577347, -1127589036, -1133646774, -1182233281); + WS(1056964652, 1042968547); + sum1 = + W(0, 1026864302, 1044356666, -1111481597, -1091567350) + W(1, 1041608192, 1008927875, -1136392949, 1026146499) + + W(2, 1051097712, -1098882624, 1029687022, -1130908784) + W(3, 1024389106, 1030265493, 1040695131, -1090350559) + + W(4, 1042991030, -1127664937, -1126999334, 1038248593) + + W(5, 1052760426, -1081953599, 1043333208, -1121268145) + + W(6, 1026043785, -1126651679, 1056669112, -1095456258) + W(7, 1044232931, 952128323, -1130628252, -1146035092) + + W(8, 1038264227, -1102468122, 1038520784, -1146879000) + W(9, 1000688741, 986691602, 1027446877, -1109487565) + + W(10, 1033386798, -1137895230, 1002882868, 1033146167) + + W(11, 1040116499, -1110909592, 1040618297, 1023066122); + sum2 = + W(0, -1155037894, -1109445776, -1106399184, 1052866656) + W(1, 1046069094, 1012439553, -1117766868, -1132308185) + + W(2, 1041934367, -1111172948, 1042904039, -1108172404) + + W(3, 1042293027, -1101307898, -1137539889, 1058738313) + W(4, 1045435531, -1110297962, 1004126723, 995397702) + + W(5, 1035303811, 1064268129, 1051607279, -1110625272) + W(6, -1123150924, 1014206993, -1091518060, 1052685347) + + W(7, -1098813712, -1107185126, 1015608713, 1046458351) + + W(8, -1124849601, -1090299347, -1150133894, 1045339946) + + W(9, -1135323377, -1120597884, 1043824666, -1087905074) + + W(10, 1037110006, -1122419536, 1030487760, 1026431488) + + W(11, 1061366644, -1075431372, -1089430426, 1049588119); + WS(-1096061015, 1045980634); + sum1 = + W(0, -1136709393, 1047345176, -1089944925, -1113534082) + W(1, 1020871950, 1032683291, 1028828435, 1016418418) + + W(2, -1096285771, 1049565603, 1021274185, 1018404508) + W(3, 997001355, 1049157941, -1094897728, -1113216951) + + W(4, 1042276288, 1027484139, 1022855123, 1032879612) + W(5, -1097979037, -1094660427, 1039512084, -1119890439) + + W(6, -1128346047, 1042754713, 1014307589, 1031601097) + W(7, 1028680388, 1030972704, 1031977874, 1032419332) + + W(8, 1040846151, -1095562472, 1044068336, -1125789619) + W(9, 984865373, -1124110958, 1042092045, -1109834744) + + W(10, -1140756488, 1031142826, 1040707047, 1040469689) + + W(11, 1041011167, -1093905225, 1048548616, -1123584299); + sum2 = + W(0, -1114682679, 1055059251, 1064739409, -1095220576) + W(1, -1100660553, 1038444345, -1115477579, 1024869090) + + W(2, 1031266096, -1113806527, -1105830101, -1132048253) + + W(3, -1100789101, 1055732865, 1030176534, 1040530242) + + W(4, -1096186716, 1040636888, -1113658391, -1122542034) + + W(5, 1067742275, 1036337974, -1103152959, 1015520805) + + W(6, -1110942733, -1120682294, 1062911121, -1087169731) + + W(7, 1035448471, 1032588114, 1044868728, -1107016239) + W(8, -1081471397, 1042181045, 1052603278, -1102136445) + + W(9, 1028313432, -1152832742, -1080677577, 1042749891) + + W(10, 1033558186, -1134141481, 1046472362, -1087243594) + + W(11, -1077241450, 1067213860, 1052345796, -1112398105); + WS(-1086603372, 1061480206); + sum1 = + W(0, 1025472273, 1022341006, 1006839158, -1102342404) + W(1, 1042514621, -1114893026, -1143591172, 1027469190) + + W(2, -1128153798, -1124925900, 1043263108, -1114252238) + + W(3, -1124123051, -1141108008, 1051787090, -1093885235) + + W(4, 1027880941, -1121794488, -1110008795, 1042054049) + + W(5, -1090097115, 1058414043, -1105821275, 1039892842) + + W(6, -1124248793, 1051331968, -1081435553, 1063214861) + + W(7, -1094479791, 1028544109, -1127491490, 1044174205) + + W(8, -1089913687, 1057428893, -1099759469, 1041669328) + W(9, 1014214528, 1044005681, -1092574472, 1052102264) + + W(10, -1112069887, 977928239, -1120184170, -1155225358) + + W(11, -1096696337, 1048742922, 1035771431, 1039400116); + sum2 = + W(0, 1037224808, 1025638319, -1093017633, -1143762368) + W(1, -1119609796, 995865588, -1109009263, 1049599085) + + W(2, 1039705537, -1112746506, -1119534458, 1021427773) + + W(3, -1120793535, -1142324554, 1040559103, -1099136162) + + W(4, -1123476586, 988834049, -1110258597, 1028269513) + W(5, 1053657173, 1056581815, -1104556193, -1122952792) + + W(6, -1112240446, -1132053081, -1120149375, -1118127758) + + W(7, 1044376501, -1114993482, -1151274598, -1119573384) + + W(8, 1043501160, -1147801478, -1107739102, 1029987722) + + W(9, -1120536233, 1010517574, -1121251494, -1130373692) + + W(10, 1033895801, -1106681926, -1103902982, 1008384356) + + W(11, 1035850418, 1032229723, -1122521676, -1116132116); + WS(1037058908, -1087106898); + sum1 = W(0, 1032385376, 1026637522, -1098495714, 1041048768) + W(1, 1039729665, 1017191910, 1028077583, -1129390954) + + W(2, -1107088868, 1041268325, -1126519617, -1132138900) + + W(3, 1014613011, 1048467894, -1108180359, 1045140885) + W(4, 1040649531, 1035348883, -1151370839, 1048758199) + + W(5, -1093334653, -1080472255, -1114665834, 997380151) + + W(6, -1139761263, 1043852440, -1108393155, 1045570315) + + W(7, -1125126080, 1031307292, 1027279360, 1034990442) + W(8, -1097414435, 1045361342, 1035082182, 1030937245) + + W(9, 1022565566, 1017011558, -1111470776, 1028923180) + + W(10, 1023808326, -1138594135, 1031834108, 1036138504) + + W(11, -1104527470, 1036330497, 1027790590, 1036519916); + sum2 = W(0, -1111516802, -1131222514, -1097346809, 1049467820) + + W(1, -1118099733, -1111393075, 1036231024, -1098228691) + + W(2, -1128682274, 1020406578, -1102087439, 1039222222) + + W(3, -1130951686, 1034905648, -1113861539, 1024259929) + + W(4, 1049541587, -1113826501, 1031916934, -1090487171) + + W(5, 1052765954, 1061096371, -1108988196, 1025340241) + + W(6, -1130989326, 1032129266, -1108538807, -1104129123) + + W(7, 1033200380, 1029417921, -1129631002, 1035677128) + + W(8, -1122282521, -1108918961, 1042713844, -1111528334) + + W(9, -1123615369, -1103168970, 1038239484, -1114584358) + + W(10, -1097598443, 1034012496, -1119469958, 1049196148) + + W(11, -1116187122, -1129232626, 1018354634, 1029857705); + WS(1054906071, -1091145324); + sum1 = W(0, 1029398237, -1120406171, 1051536197, -1115196942) + + W(1, -1136290815, -1126429728, -1140775857, -1106052861) + + W(2, 1046952684, -1109008729, 1034481647, 1032555988) + + W(3, -1128656451, -1099422950, 1057886666, -1097962977) + + W(4, -1114344740, 1015919623, 1004160018, 1032725545) + + W(5, -1085942396, -1130426984, 1050651652, -1108426832) + + W(6, -1130732913, -1097841652, -1098611557, 1048146402) + + W(7, -1102043591, 1040987294, 1029686973, 1037934865) + + W(8, 1042440654, 1034532491, -1133864753, -1107032303) + + W(9, 1021855224, 1036573848, 1035129734, -1122054089) + + W(10, -1124817654, 1044439941, -1128798955, -1157619404) + + W(11, 1032622058, 1027356128, -1126847669, -1115113714); + sum2 = W(0, -1113802973, 1027581315, -1110955855, 1047020911) + + W(1, -1105727831, 1022816774, -1116219822, -1112877584) + + W(2, -1127685514, 1021259086, -1118276653, -1129541322) + + W(3, 1020553430, -1110295429, -1097495000, 1057623683) + + W(4, -1110729082, 997980814, -1109755343, 1027296115) + W(5, 1025841055, 1053623791, -1104267868, 1016281450) + + W(6, -1131329246, -1126007358, -1104102640, 1057318729) + + W(7, -1106795812, -1105649969, -1112950186, 1035099341) + + W(8, -1110724235, 1040083835, -1119773745, 1031563375) + + W(9, -1113313093, -1130784978, -1165405916, 1048620928) + + W(10, -1128480210, -1111917112, -1116367256, 1035863861) + + W(11, -1097352168, 1039940909, -1110646461, 1032754595); + WS(1063926444, -1083200389); + sum1 = + W(0, -1110900111, 1049653262, -1089993663, 1052688460) + W(1, -1098055945, 1042131972, 1015785179, -1116391059) + + W(2, -1106495964, 1038385529, -1108169455, -1121748392) + + W(3, -1132926346, 1048988121, -1104923071, 1045396422) + + W(4, -1110654965, 1039495970, 1034778082, -1111931241) + + W(5, 1061854120, -1089207439, -1111176153, -1117097761) + + W(6, 1029162938, 1002973694, 1062129309, -1085048198) + W(7, 1042255343, -1120523578, 1024169214, -1107911937) + + W(8, 1059656227, -1087799869, 1043917388, -1106362715) + + W(9, 1031086749, -1104277444, 1047872627, -1096506545) + + W(10, 1012240783, 1011366638, -1116484151, -1114837807) + + W(11, 1055218483, -1096830980, 1049045741, -1098874335); + sum2 = W(0, 1031260311, -1079593190, -1121246507, -1113337443) + + W(1, 985022717, 1032096214, 1008713252, -1080879443) + W(2, 1035854140, 1043424734, -1123981203, -1130846658) + + W(3, -1110413739, -1099919153, 1040572163, -1112705599) + + W(4, 1028350097, -1119780465, -1108083749, 1067198745) + + W(5, -1111993270, -1102589461, 1035118406, 1007072124) + W(6, 1024382525, 1061544601, 1060638292, 1044789771) + + W(7, -1119559917, -1132931022, -1107516795, 1037733964) + + W(8, -1122943484, 1040341398, -1123835438, -1131952682) + + W(9, 1032742989, 1034769578, -1098923291, -1116338100) + + W(10, 1021760610, 1028149723, -1107429215, 1037726418) + + W(11, 1034609836, 1030676197, -1114867192, -1115680064); + WS(-1091090263, 1040227933); + sum1 = + W(0, -1123880467, -1113261184, 1033284496, 1044923332) + W(1, -1105999782, -1135767575, -1114808049, 1027485320) + + W(2, 1019377225, -1098653061, 1042536309, -1127683258) + + W(3, 1014154590, -1101480756, -1102787036, 1059927492) + W(4, -1095990282, 1037484605, 1032220316, 1043855170) + + W(5, -1094753319, 1040011797, 1044858269, -1120454550) + + W(6, 1018131933, -1088775234, 1065098078, -1099661886) + + W(7, -1091964998, 1029352975, -1121223347, 1021676847) + + W(8, -1107869654, -1151140018, 1045062557, -1109078132) + + W(9, -1128795491, 1031227206, 1045897152, -1113799968) + + W(10, -1109510984, 1027724204, 1008528046, 1026364723) + + W(11, 1025551690, -1125551659, 1023695008, 1006311503); + sum2 = + W(0, -1123304381, -1135928985, 1039889929, -1113522433) + W(1, -1108136941, 1038356153, 1011470018, -1131363804) + + W(2, 1045400660, -1100907702, 1038781261, -1139124254) + + W(3, -1116901758, 1044779190, -1100997480, -1104972678) + + W(4, 1052809383, -1105005165, 1029761957, -1101932196) + W(5, 1055172736, 1058841413, -1093286229, 1040780481) + + W(6, -1135722528, -1097334030, -1087140500, 1039800739) + + W(7, 1034962749, -1105451984, -1111769341, 994986369) + W(8, 1054550160, -1122473050, -1105965260, 1042887374) + + W(9, -1107033568, 1042173475, -1110305303, -1109069053) + + W(10, 1038676003, -1114167820, 1032808415, 1025113569) + + W(11, -1115908038, 1032761157, -1155418681, -1152192529); + WS(1063982124, 1031276218); + sum1 = + W(0, 1041442545, 1031361481, 1056936890, -1090353464) + W(1, -1122143798, 1007942615, -1103090149, 1026538936) + + W(2, 1055470587, -1090262005, -1101092681, 1040474995) + + W(3, 1042807746, -1101400314, 1060963845, -1096383728) + W(4, 1031723710, -1103896066, 1024468200, 1034898060) + + W(5, 1061353486, -1078114170, -1122232454, 1027975174) + + W(6, -1106882536, -1103132501, 1063510555, -1106902698) + + W(7, 1043143621, 1030475455, 1049721332, -1112916420) + + W(8, 1048946651, -1088793180, -1172995470, -1101011290) + + W(9, -1101888878, -1139074135, 1054541302, -1098771630) + + W(10, 1032268200, 1044176219, 1042454319, -1110788513) + + W(11, 1058321972, -1093460753, -1104729748, -1108198577); + sum2 = + W(0, 1015674059, -1109357907, 1031332447, 1066992274) + W(1, -1074609058, 1048304191, 1034996578, 1024785272) + + W(2, 1048659656, 1076858856, -1070866381, 1030261153) + W(3, 1026624942, -1129998179, -1108514478, 1078632808) + + W(4, -1068251573, -1098508369, -1128049054, -1120348186) + + W(5, 1052415888, 1073772904, -1076608801, -1108782845) + W(6, 999367802, 1048014132, -1105319294, -1105884909) + + W(7, -1103939197, 1048310856, 1021382702, -1105300006) + + W(8, -1117149322, 1038594495, -1109221944, 1031934850) + W(9, -1124407536, 1046166047, 1010482847, 1038514249) + + W(10, -1098022157, 1046147873, 1029480964, -1116382211) + + W(11, -1154249511, -1098756758, -1125235504, 1038709270); + WS(-1084008748, -1076428689); + sum1 = + W(0, 995293936, -1119372516, -1088304948, 1059786207) + W(1, -1137964103, 1013109895, -1162911689, 1036299874) + + W(2, -1097059736, 1051547992, -1125552990, 1006687204) + + W(3, -1138016718, 1017340780, -1085861109, 1060565598) + + W(4, -1116363658, 1002349741, -1132274729, 1041960361) + + W(5, -1081600491, 1064118968, -1116908178, 1007519945) + + W(6, -1145295444, 1044385332, -1083799507, 1058261310) + W(7, -1119006543, 994300076, -1131268254, 1034368866) + + W(8, -1090459925, 1050466917, 1026422690, -1119097260) + + W(9, -1201649403, 1043013720, -1104403080, 1049921019) + + W(10, -1131911306, -1123993357, -1135278623, -1103541652) + + W(11, -1103180426, 1042671596, 1051353751, 1023041036); + sum2 = + W(0, 1033856632, -1090933982, 1068958128, 1067844920) + W(1, -1095515318, -1124923033, 1041148647, -1094617784) + + W(2, 1066199400, -1102124443, -1122244574, 1042779533) + + W(3, -1094518814, -1122277735, 1055138982, 1051248434) + W(4, 1036900546, -1103088355, 1045521814, 1062250596) + + W(5, -1070105649, -1078683071, 1046136146, -1114411292) + + W(6, -1128266986, 1027053741, -1070096660, -1079091570) + + W(7, 1021983978, -1114099181, 1033117136, 1050179515) + W(8, -1082392713, -1089309992, 1045719314, 1023274434) + + W(9, -1173165821, 1033890948, 1067349236, 1047411220) + + W(10, 1050937215, -1124200313, 1041230368, -1086799133) + + W(11, 1076979077, 1070525583, -1091587052, 1042022635); + WS(-1081223670, 1021288719); + sum1 = + W(0, 1011016529, 1035837139, 1042651768, -1098433890) + W(1, -1129696110, 995272815, -1123721507, 1032041909) + + W(2, 1036928499, -1100608474, 1024607124, 1027549342) + W(3, 1017381041, -1108640782, 1055254255, -1094722148) + + W(4, -1131079071, -1116321147, 1017648243, 1024313608) + W(5, 1061777248, -1083909329, 1047474926, 1017435439) + + W(6, 1028006000, -1105590117, 1061429156, -1087617676) + + W(7, 1036831026, -1122084432, -1122128468, -1108791100) + + W(8, 1052534382, -1091388554, 1033276873, -1139273509) + + W(9, 1009660876, -1128783630, 1049990152, -1104773376) + + W(10, -1150770463, 1024807730, 1007983923, -1116825572) + + W(11, 1053483289, -1093454083, 1005912461, -1125665142); + sum2 = + W(0, 1057380038, -1088994983, 1016685185, 998662038) + W(1, 1040844632, 1027712021, 1057597982, -1085734595) + + W(2, 983594263, 1031174835, -1116219635, -1109851055) + W(3, 1069621581, -1072283812, 1066773393, -1099503122) + + W(4, -1134907857, 1037507283, 1060801069, -1079782207) + + W(5, 1060848632, -1097910780, 1027931069, -1116080368) + W(6, 1060050844, -1081640783, 1043641192, 1038323247) + + W(7, -1111695032, -1123552119, 1041938366, 1046270010) + W(8, -1105013658, 1026094487, 1047921746, 1028446195) + + W(9, -1122435905, -1113922524, -1104981345, 1036576275) + + W(10, -1114519002, -1108250726, 1024344515, 1043446590) + + W(11, -1105295106, -1145544806, 1032973176, 1031771441); + WS(-1120405176, 1052288640); + sum1 = + W(0, -1136485047, 1040656325, 1051431647, -1114886102) + W(1, -1113721480, -1115542032, -1120969533, 1013423883) + + W(2, 1042796768, -1092939904, 1039390695, -1165530871) + + W(3, 1032711321, -1108004548, 1062809491, -1083705303) + W(4, 1026161897, 1020434857, 1027237267, -1107763377) + + W(5, 1060861813, -1089040632, -1116341945, 1024821617) + W(6, 1021305874, 1022040031, 1027813500, 1039332409) + + W(7, -1108229347, 1031183209, -1146847086, 1040265357) + + W(8, -1107918083, -1098943929, 1035322940, 1019272038) + + W(9, -1133175986, 1031093856, 1039657966, -1112315213) + + W(10, -1115465454, 1024346473, 1039673939, -1100629595) + + W(11, 1043412169, -1104541036, -1114748782, 1012723731); + sum2 = W(0, 1032873736, -1128467212, -1098460251, 1024553592) + + W(1, 1047433570, -1128334191, -1106233681, -1131275971) + + W(2, 1035809416, -1114616785, 1026776904, -1107845863) + + W(3, 1036788040, -1113770947, -1078975662, -1092555656) + + W(4, -1132131619, 1043173677, 1009987037, -1088748320) + + W(5, 1062703231, 1067981395, -1104531393, -1111351589) + + W(6, -1117147579, -1097209973, 1059662245, 1058574054) + W(7, -1106248497, 991598885, 1018109057, 1040210251) + + W(8, -1110493560, -1103422592, -1125640736, -1107997815) + + W(9, -1114508674, -1099376356, 1052516052, 1038056552) + + W(10, -1107638185, 1023829740, -1106556966, 1050939532) + + W(11, 992650581, 1026754378, -1107493388, -1106870741); + WS(1050656983, 1072047790); + sum1 = + W(0, -1128713579, 1048792739, 1050333168, -1097949975) + W(1, -1101689274, -1127716817, 1026709637, 1034799517) + + W(2, 1050171449, -1104033571, 1036522731, 1037025856) + W(3, 1023201012, 1014670385, 1053203577, -1085647978) + + W(4, -1115538280, -1116963676, 1030859291, -1116111658) + + W(5, 1064066450, -1080119690, 1043957990, -1112813084) + W(6, 1041237492, 1025355287, 1060032700, -1088145917) + + W(7, 1037919995, 1036783049, -1152997210, -1112906461) + + W(8, 1050694506, -1088560507, -1120212113, -1113565993) + + W(9, -1155686725, 1036463444, 1053095469, -1105136840) + W(10, 1035379762, 1035776666, 1040488948, 1002270506) + + W(11, 1046913707, -1093840327, -1108210918, -1122514141); + sum2 = W(0, 1032121925, 1067037293, -1074821338, -1094551116) + + W(1, 1045030197, -1115959604, -1105031648, 1072414374) + + W(2, -1081225596, 1050387420, 1035683027, -1117669800) + + W(3, -1130820039, 1072723545, -1069168235, 1050306407) + + W(4, 1054464199, -1109697271, -1105961083, 1076922042) + + W(5, -1068908234, -1080768789, -1129129027, -1106200850) + + W(6, 1040237041, 1072846596, 1068735095, -1110799161) + + W(7, -1109242003, 1041008693, -1091675607, -1079373087) + + W(8, 1050158994, 1048692149, -1102086715, -1107790175) + W(9, 1052906990, 1048404715, 1043049709, 1039557097) + + W(10, 1050068036, 1019897614, -1119953618, -1090018360) + + W(11, 1036354441, -1114340558, -1106557101, 1034398799); + WS(-1081468886, 1041730784); + sum1 = + W(0, -1114247594, 1021500053, 1028761377, 1044129269) + W(1, -1131183895, -1121682823, 999910687, 1042624634) + + W(2, 1005300019, 1053438789, -1096850135, 1029411807) + W(3, -1112649805, 1043096639, -1100727404, 1055682820) + + W(4, -1106832988, 1022343799, 1022168820, 1034747044) + W(5, 1035906940, -1086991443, 1038040260, -1113521452) + + W(6, 1009392321, -1103886814, 1062898916, -1084075064) + + W(7, 1044548897, -1110992968, 1025791509, -1101453262) + + W(8, 1054732110, -1098009154, 1037861846, -1110478453) + + W(9, -1115410306, 1026735815, 1042621601, -1097832968) + + W(10, 1022910341, -1125653940, 1020540891, 1034256626) + + W(11, 1041116931, -1117544535, -1121491970, -1112646442); + sum2 = W(0, -1109856908, 1025315462, -1111613060, -1108093549) + + W(1, 1041489120, -1114414815, 995541592, 1040254152) + W(2, 997512408, -1085520225, -1094645099, 1040714423) + + W(3, -1107331629, 1035675473, -1115826672, -1103361463) + + W(4, -1102705141, -1125997775, 1043476326, 1026228130) + + W(5, 1067108106, 1059978555, -1121534122, 1032256197) + + W(6, -1104942022, -1101803200, 1053887552, -1094292172) + + W(7, 1039802977, -1130615251, 1039471517, -1123010638) + + W(8, -1104388416, -1120534147, 1017265579, -1129091643) + + W(9, -1114856041, 1040268905, -1120685867, -1108094032) + + W(10, 1040793483, -1108206349, 1022399907, 1028920354) + + W(11, -1103458923, 1040596394, -1107135380, 1027593934); + WS(1054796503, -1111794816); + + return clamp(mstd0 + 5.0 * vsum / wsum * mstd1, 0.0, 1.0); +} + +shared float inp[507]; + +#define CURRENT_PASS 1 + +#define GET_SAMPLE(x) dot(x.rgb, rgb2y) +#define imageStore(out_image, pos, val) imageStoreOverride(pos, val.x) +void imageStoreOverride(uint2 pos, float value) { temp[pos] = (value); } + +#define INPUT_tex(pos) GET_SAMPLE(vec4(texture(INPUT, pos))) +static const float2 INPUT_size = float2(GetInputSize()); +static const float2 INPUT_pt = float2(GetInputPt()); + +#define HOOKED_tex(pos) INPUT_tex(pos) +#define HOOKED_size INPUT_size +#define HOOKED_pt INPUT_pt + +void Pass1(uint2 blockStart, uint3 threadId) { + ivec2 group_base = ivec2(gl_WorkGroupID) * ivec2(gl_WorkGroupSize); + int local_pos = int(gl_LocalInvocationID.x) * 13 + int(gl_LocalInvocationID.y); + for (int id = int(gl_LocalInvocationIndex); id < 507; id += int(gl_WorkGroupSize.x * gl_WorkGroupSize.y)) { + uint x = (uint)id / 13, y = (uint)id % 13; + inp[id] = + HOOKED_tex(HOOKED_pt * vec2(float(group_base.x + x - (3)) + 0.5, float(group_base.y + y - (2)) + 0.5)).x; + } + barrier(); + vec4 ret = vec4(0.0, 0.0, 0.0, 0.0); + vec4 ret0 = vec4(0.0, 0.0, 0.0, 0.0); + vec4 samples[12]; + samples[0][0] = inp[local_pos + 0]; + samples[0][1] = inp[local_pos + 1]; + samples[0][2] = inp[local_pos + 2]; + samples[0][3] = inp[local_pos + 3]; + samples[1][0] = inp[local_pos + 4]; + samples[1][1] = inp[local_pos + 5]; + samples[1][2] = inp[local_pos + 13]; + samples[1][3] = inp[local_pos + 14]; + samples[2][0] = inp[local_pos + 15]; + samples[2][1] = inp[local_pos + 16]; + samples[2][2] = inp[local_pos + 17]; + samples[2][3] = inp[local_pos + 18]; + samples[3][0] = inp[local_pos + 26]; + samples[3][1] = inp[local_pos + 27]; + samples[3][2] = inp[local_pos + 28]; + samples[3][3] = inp[local_pos + 29]; + samples[4][0] = inp[local_pos + 30]; + samples[4][1] = inp[local_pos + 31]; + samples[4][2] = inp[local_pos + 39]; + samples[4][3] = inp[local_pos + 40]; + samples[5][0] = inp[local_pos + 41]; + samples[5][1] = inp[local_pos + 42]; + samples[5][2] = inp[local_pos + 43]; + samples[5][3] = inp[local_pos + 44]; + samples[6][0] = inp[local_pos + 52]; + samples[6][1] = inp[local_pos + 53]; + samples[6][2] = inp[local_pos + 54]; + samples[6][3] = inp[local_pos + 55]; + samples[7][0] = inp[local_pos + 56]; + samples[7][1] = inp[local_pos + 57]; + samples[7][2] = inp[local_pos + 65]; + samples[7][3] = inp[local_pos + 66]; + samples[8][0] = inp[local_pos + 67]; + samples[8][1] = inp[local_pos + 68]; + samples[8][2] = inp[local_pos + 69]; + samples[8][3] = inp[local_pos + 70]; + samples[9][0] = inp[local_pos + 78]; + samples[9][1] = inp[local_pos + 79]; + samples[9][2] = inp[local_pos + 80]; + samples[9][3] = inp[local_pos + 81]; + samples[10][0] = inp[local_pos + 82]; + samples[10][1] = inp[local_pos + 83]; + samples[10][2] = inp[local_pos + 91]; + samples[10][3] = inp[local_pos + 92]; + samples[11][0] = inp[local_pos + 93]; + samples[11][1] = inp[local_pos + 94]; + samples[11][2] = inp[local_pos + 95]; + samples[11][3] = inp[local_pos + 96]; + ret[0] = nnedi3(samples); + ret0[0] = inp[local_pos + 41]; +#if CURRENT_PASS == LAST_PASS + uint2 destPos = blockStart + threadId.xy * 2; + uint2 outputSize = GetOutputSize(); + if (destPos.x >= outputSize.x || destPos.y >= outputSize.y) { + return; + } +#endif + imageStore(out_image, ivec2(gl_GlobalInvocationID) * ivec2(1, 2), ret0); + imageStore(out_image, ivec2(gl_GlobalInvocationID) * ivec2(1, 2) + ivec2(0, 1), ret); +} +//!PASS 2 +//!DESC NNEDI3 (double_x, nns256, win8x6) +//!IN INPUT, temp +//!OUT OUTPUT +//!BLOCK_SIZE 64, 8 +//!NUM_THREADS 32, 8 +#pragma optionNV(inline none) +float nnedi3(vec4 samples[12]) { + float sum = 0.0, sumsq = 0.0; + [unroll] for (int i = 0; i < 12; i++) { + sum += dot(samples[i], vec4(1.0, 1.0, 1.0, 1.0)); + sumsq += dot(samples[i], samples[i]); + } + float mstd0 = sum / 48.0; + float mstd1 = sumsq / 48.0 - mstd0 * mstd0; + float mstd2 = mix(0.0, inversesqrt(mstd1), mstd1 >= 1.192092896e-7); + mstd1 *= mstd2; + float vsum = 0.0, wsum = 0.0, sum1, sum2; +#define T(x) intBitsToFloat(x) +#define W(i, w0, w1, w2, w3) dot(samples[i], vec4(T(w0), T(w1), T(w2), T(w3))) +#define WS(w0, w1) \ + sum1 = exp(sum1 * mstd2 + T(w0)); \ + sum2 = sum2 * mstd2 + T(w1); \ + wsum += sum1; \ + vsum += sum1 * (sum2 / (1.0 + abs(sum2))); + sum1 = W(0, -1118812211, -1126504964, -1120674615, 1037346316) + + W(1, -1120777358, -1137814218, -1128256674, -1118580651) + + W(2, -1118354985, -1117760744, -1117458482, -1097807929) + + W(3, -1114916026, -1101147334, 978731342, -1112914505) + + W(4, -1108702207, -1127312137, -1124477727, 1051925971) + + W(5, 1042061230, 1032645830, 1026597474, 1040041685) + W(6, -1107177196, 1040658850, 1041726453, 1061593601) + + W(7, 1053108884, 1029100907, 1023094846, 1010634196) + + W(8, -1116025261, -1105559165, -1102924251, -1098269094) + + W(9, -1109857889, -1121960158, -1133406593, -1137769344) + + W(10, -1113369587, 1024463101, -1120327001, 1015141868) + + W(11, -1129934237, -1114359336, 1018102856, -1124738995); + sum2 = + W(0, 1012167794, 975711915, 1007876102, -1112492311) + W(1, 1037438381, -1104922990, 1035896848, -1129478003) + + W(2, 1034293816, -1103749327, 1042152488, 1032768248) + W(3, 1026775674, -1112883791, 1009005510, 1029694272) + + W(4, 1040949842, -1105000392, -1113573827, 1065119806) + + W(5, 1049707133, -1118855570, 1019305156, -1105233202) + + W(6, -1073125242, -1097051670, 1048636347, 1064777150) + W(7, 1035198208, 1049268872, -1110039318, 1045598091) + + W(8, -1098861131, 1026609280, -1103172582, 1028248806) + W(9, 1042916747, -1108803486, 1037762592, 1002108025) + + W(10, 1034317546, -1107080190, 1037196612, -1106667446) + + W(11, 1024046979, -1112062411, 1031133421, -1116379320); + WS(1002542528, -1081598301); + sum1 = W(0, -1123106403, 1003194766, -1115291860, -1120609928) + + W(1, 1033033375, -1104418325, 1031657633, -1140694509) + + W(2, 1018532849, 1031358712, -1100442248, -1102109750) + + W(3, -1124327881, 1022719310, 1042404749, -1173350542) + W(4, 1058293919, 1048723343, 1060312385, 1065191364) + + W(5, 1057579241, 1055391647, 1048926634, 1057234642) + + W(6, -1096563748, -1102943230, -1084853826, -1082116255) + + W(7, -1090047916, -1090520747, -1115672903, -1088607906) + + W(8, 1033211315, 1043311017, -1122032382, 1048832547) + W(9, 1045565001, 1034840623, 1040065984, 1034960904) + + W(10, -1104454821, 1033034550, -1105126162, -1093430837) + + W(11, 1033480943, -1104668395, 1041617645, -1100859732); + sum2 = + W(0, -1118979564, -1136455954, 1031647880, -1098733088) + W(1, 1032618663, -1115252794, -1105564107, 1028338874) + + W(2, 1038135851, -1098903542, 1043936541, -1095471090) + + W(3, -1114646115, 1050331000, -1107943513, 1030299514) + W(4, 1040555036, -1113356687, 1041172918, 1058853402) + + W(5, -1111675314, 1042547849, -1102521857, 1048036907) + W(6, 1046730291, -1091503884, 1053446821, 1057969905) + + W(7, 1026777488, 1032649026, -1097022326, 1045220138) + + W(8, -1098841046, 1033064908, -1105844234, -1107613268) + + W(9, -1104403193, -1109177822, -1106932655, -1104926499) + + W(10, 1010901456, -1105119573, 1050988870, -1096003667) + + W(11, 1040941647, -1135105484, -1111654963, 1015146572); + WS(-1089089900, 1057806976); + sum1 = W(0, -1107295812, -1127595840, -1123024597, -1107414907) + + W(1, 1016079705, -1114511976, -1121404144, -1120167114) + + W(2, 1034138799, 1025412102, 1036945929, 1043589025) + W(3, 1048626936, 1026901142, -1122208804, -1132433569) + + W(4, -1095422036, -1098433268, -1092642698, -1086058047) + + W(5, -1087422851, -1090938821, -1099844512, -1092394401) + + W(6, 1050726826, -1189029283, 1055732365, 1066834483) + W(7, 1060391966, 1050840209, 1046023279, 1054523402) + + W(8, 1041715821, -1122343505, -1122551116, 1012137296) + + W(9, -1112593208, 1032081267, 1025525231, 1034856335) + + W(10, -1107540610, -1114195981, 1004508092, -1123010964) + + W(11, 1021997657, -1116540066, -1117735535, -1140325311); + sum2 = W(0, -1100068589, 1040406565, -1105732125, -1129255625) + + W(1, -1110986904, 1041854514, -1108063740, 1040297872) + + W(2, 1045053907, -1112537807, 1034765996, -1096936254) + + W(3, -1098576495, -1119869595, -1108123574, -1106886121) + + W(4, 1035618626, -1097933278, -1099579155, 1047111871) + W(5, 1056019034, -1119227686, 1029490732, 996712344) + + W(6, 1049401249, -1091711434, 1056573344, 1055190008) + + W(7, 1058665437, -1092612461, -1121089271, -1113107096) + + W(8, 1036897142, 1040848725, -1089717374, 1050298277) + + W(9, -1089302244, 1058580142, -1127874601, -1110437244) + + W(10, -1103084156, 1039746012, 1030295740, -1110783667) + + W(11, 1041764164, -1100808273, 1022690203, 1034569294); + WS(1049963735, -1124746024); + sum1 = W(0, 1006389467, 991131306, -1124991168, 1036315168) + W(1, -1114080443, 1034164414, -1168983685, 1034869786) + + W(2, 1034213253, -1110639240, -1124116580, -1106688436) + + W(3, 1016950458, 1034354600, -1118357326, 1046100667) + W(4, 1058411598, 1049374726, 1060442825, 1064243752) + + W(5, 1058630778, 1057235431, 1051622657, 1028310995) + + W(6, -1089111694, -1111102680, -1086690096, -1080857842) + + W(7, -1086343400, -1086990857, -1099687954, -1090257402) + + W(8, -1120169982, 1039576302, 1018630958, 1032153615) + W(9, 1034713638, 1036089759, 1035150121, -1126482082) + + W(10, 1033778855, -1134195605, -1122058050, 1024033695) + + W(11, 1016006830, 1017381585, 1027377121, -1130216101); + sum2 = + W(0, -1114775505, 1022693528, 1033686534, -1159675846) + W(1, -1112709023, 1033838002, -1125624388, 1032684170) + + W(2, -1111353121, 1040828458, -1108626677, -1179590680) + + W(3, 1041114289, 1028829848, -1108121837, 1037026782) + W(4, 1051023520, 1041444385, -1101109690, -1089609004) + + W(5, -1101828769, 1037546580, 1033655640, -1104771455) + + W(6, 1077280281, 1083159907, -1090827263, -1064966677) + + W(7, -1073695373, -1090323484, 1042738654, -1104201752) + + W(8, 1042396970, 1039028690, -1129576724, -1146898193) + + W(9, -1117377551, 1046069066, -1098820901, 1049907200) + + W(10, -1100155636, 1038899070, -1108327399, -1128357112) + + W(11, 1026559236, 1017563688, -1149039617, -1119733667); + WS(-1082925548, -1131273240); + sum1 = + W(0, -1130676005, 1024417890, -1127912110, -1123681912) + W(1, -1128802908, 1009745483, 1030244593, -1124372951) + + W(2, 1028984921, 1026031368, 1046418962, 1048544370) + W(3, 1032747842, -1115143804, 1035809011, 1012870858) + + W(4, -1090453298, -1094705109, -1088411833, -1080625999) + + W(5, -1078821070, -1093720869, -1115224705, -1099806226) + + W(6, 1056020338, 1048479050, 1054709085, 1056570469) + W(7, 1060414079, 1058018725, 1048613352, 1053689379) + + W(8, 1036092472, 1026370227, 1040943828, 1016526011) + W(9, -1134933227, -1146727344, -1126383553, 1034696072) + + W(10, 1031745797, 1023514525, -1139610597, 1039178347) + + W(11, -1115579031, 1033865376, -1123856496, 1032018765); + sum2 = W(0, -1117505397, -1126832117, -1116692107, -1107644007) + + W(1, -1117458583, -1123105101, -1117032217, 1004815486) + + W(2, -1114926763, -1140231915, -1125548157, -1125354742) + + W(3, 1042669208, 1027773818, -1115355410, -1119603373) + + W(4, 1048798551, -1146496262, 1045683415, 1053833339) + + W(5, 1057710126, 1032098567, -1100115369, -1110288078) + + W(6, -1102904639, -1113101086, -1125191934, 1000279686) + + W(7, -1104919217, -1107525999, 1032507221, -1103622420) + + W(8, 1025448640, -1129185935, 1034411663, -1120274227) + W(9, 1041220979, 1022009255, 1021108475, 1039592007) + + W(10, -1112830121, -1125809392, -1121525964, -1113082203) + + W(11, -1111650191, 1035574395, -1112638630, -1117835672); + WS(-1089340204, 1064822548); + sum1 = + W(0, 1024560260, 1017532199, 1036465700, 1032538389) + W(1, 1031720480, 1035008482, 1020865894, 1041385023) + + W(2, 1040632746, -1123651609, 998268921, -1115892569) + W(3, -1109887627, 1033415588, -1112010572, 1043778521) + + W(4, 1042654740, 1053882699, 1058440180, 1062655475) + W(5, 1057084090, 1054084900, 1046711885, 1050203279) + + W(6, -1106019185, -1094337163, -1083627654, -1081203240) + + W(7, -1087921069, -1086686700, -1098821294, -1083224116) + + W(8, -1121721479, 1033472482, -1112650528, 1042941034) + W(9, 1046201917, 1038013786, 1039144481, 1043447032) + + W(10, 1037194524, 1028050126, 993325743, 1013010462) + W(11, 1035154240, 1021897635, 1027972046, -1131974615); + sum2 = + W(0, -1108565409, 1041490776, -1103680498, -1113858207) + W(1, 1018958125, -1139146344, 1024460115, -1111959213) + + W(2, 1034353453, 1018486577, -1113519263, 1052082200) + + W(3, -1097140178, 1046768714, -1098207895, -1128703602) + + W(4, -1088688588, -1105841420, 1037914109, 1062919581) + W(5, -1095558118, 1049328132, 1041960027, 1035231667) + + W(6, 1053209723, -1092734414, -1094792328, 1049986423) + + W(7, -1107726366, 1044527939, 1046336394, -1110040773) + W(8, 1049996954, 1039814215, 1034343810, 1012724150) + + W(9, -1098318745, 1024888668, -1106186917, 1036710347) + + W(10, -1107721619, -1122233136, -1116717915, 1040029087) + + W(11, 1007719490, -1100531711, 1037888927, -1102670680); + WS(-1083458668, -1076208878); + sum1 = + W(0, 1028803476, -1119221604, -1136427363, 1033962333) + W(1, -1108948664, 1041264181, -1108358441, 1032628870) + + W(2, 1040683401, -1097616301, 1042493937, -1106128994) + + W(3, -1096558041, 1044433886, -1097860853, -1123751924) + W(4, 1046406904, 1051879501, 1058517387, 1062475632) + + W(5, 1061490456, 1053313566, 1049919352, 1054299289) + + W(6, -1098733730, -1093169213, -1088547874, -1086787145) + + W(7, -1088927588, 1035939910, -1096390160, -1130402734) + + W(8, 1004468631, -1110693690, 1024040880, 1045297574) + W(9, 1028806548, 1038834422, -1095128350, -1106314264) + + W(10, 1030855367, -1111140815, -1127640694, -1108587948) + + W(11, -1104411844, 1040762412, -1118015030, -1165494119); + sum2 = W(0, 1016611708, 1037888148, -1105282980, 1016374797) + + W(1, -1146676672, -1118267731, -1130451858, 1032410610) + + W(2, 1016478676, 1037533502, 1012928145, 1042320298) + + W(3, -1119445205, -1133007186, -1123652878, -1114217777) + + W(4, -1110195557, 1036667983, -1126800264, -1123884642) + + W(5, -1097480948, -1111241984, 1039970164, 1039354964) + + W(6, -1101004152, 1029018929, -1092116144, 1048907311) + W(7, 1063932318, 1045206632, 1051255124, 1032089604) + + W(8, 1040169462, 1051795874, 1041335879, 1052196876) + + W(9, -1105880602, -1088285853, -1095104183, -1090379026) + + W(10, -1128480930, -1116498505, -1105668811, -1110762465) + + W(11, -1096424000, 1016609657, 1029046774, 1046489649); + WS(-1104670894, -1131977046); + sum1 = W(0, -1112648188, -1122872327, 1034658686, -1105196647) + + W(1, 1040705957, -1105551222, -1121117111, 1017793890) + + W(2, -1127207577, 1044660591, -1159198685, -1091967838) + + W(3, 1050515731, -1105182655, -1127322710, 1049557794) + W(4, 1054983097, 1050049705, 1055452918, 1062208630) + + W(5, 1055187309, 1051606290, 1047450666, 1052382814) + + W(6, -1088875575, -1112061830, -1088327234, -1080890076) + + W(7, -1103107959, -1088400827, -1103254713, -1097595959) + + W(8, 1031188251, 1037435556, 1047857485, 1027642075) + W(9, 1054501223, -1109004816, 1042878098, 1041414585) + + W(10, -1103988635, 1027063042, -1117747167, -1097581231) + + W(11, 1026629396, -1115427963, -1119280070, -1121163375); + sum2 = W(0, 1016354951, -1117974191, 1039379806, 1055799129) + W(1, 1043516685, 1037116388, 1033575170, -1131729016) + + W(2, 1027513536, 1035918257, 1037237024, -1144611727) + W(3, 1028380863, 1042440009, -1106882882, 1025801393) + + W(4, -1143898815, 1029824032, -1103985849, -1097216592) + + W(5, -1106760625, -1103814691, -1123395355, -1136138683) + + W(6, -1120711631, 1038928177, -1101088822, -1097673825) + + W(7, -1124050651, -1105579212, 1026359109, 1011024469) + + W(8, -1121835937, -1110582057, 1009730353, 1040607236) + + W(9, -1115312251, 1038947942, -1135830635, -1112603972) + + W(10, 1011202413, 1027020738, -1113735870, 1044957698) + + W(11, -1114960631, 1027787831, -1133116095, 1008198659); + WS(-1096559831, 1037484900); + sum1 = W(0, 1028249855, -1134487991, 1034313250, 1016173128) + W(1, 1027417370, 1028347039, 1000575210, 1035635068) + + W(2, 1038422322, 1027879764, 1029515489, -1112460521) + + W(3, -1107825326, -1123304579, 1030471249, -1120703806) + + W(4, 1057397273, 1048869250, 1056640275, 1065757625) + W(5, 1058322735, 1054334819, 1052511918, 1052376319) + + W(6, -1091437192, -1098773026, -1086850776, -1083502823) + + W(7, -1083394976, -1089694535, -1098313541, -1102551488) + + W(8, -1101563608, 1029769503, -1127965876, -1131269971) + + W(9, 1044386388, -1107441417, 1031752252, -1098473097) + + W(10, 1033785689, 1031362249, -1173649736, -1128247556) + + W(11, 1035484541, -1132373103, 1034873120, -1142130892); + sum2 = W(0, -1112511339, 1040888051, 1033770332, 1027239578) + + W(1, -1109060021, -1135961020, -1113507810, -1110941727) + + W(2, -1073555081, -1070793862, -1069228230, -1071158503) + + W(3, -1080567434, 1047598893, 948656059, -1129804625) + W(4, 1076402541, 1075658117, 1075655149, 1077820889) + + W(5, 1045918702, -1118850699, 1035044244, 1026016583) + W(6, -1104998932, 1054215981, 1042820552, 1046227202) + + W(7, -1095422364, -1101978428, 1045389579, -1103164541) + + W(8, -1101584674, -1115233903, 1010151672, 1035248614) + + W(9, 1038949494, 1049027220, 1028467783, -1118124613) + W(10, 1037626737, 1015165170, 1023929473, 1033175695) + + W(11, 1025525751, 1032251645, -1117328038, 1042587545); + WS(-1081931126, 1073966570); + sum1 = + W(0, -1121849711, -1146361331, 1017322599, -1106692309) + W(1, 1025148299, -1106210884, 1006422511, -1115138804) + + W(2, 1035175459, -1097410109, 1043585907, -1120101763) + W(3, 1050307440, 1038219466, 1023773090, -1132131774) + + W(4, -1121951547, 1026127169, -1144746721, -1091000962) + + W(5, -1079735571, -1091953433, -1096168868, -1102445962) + + W(6, 1027761070, 1045225025, -1106255910, 1065386286) + W(7, 1061827739, 1056380469, 1049682211, 1046599772) + + W(8, 1025905706, 1037511592, 1043091875, -1111228857) + W(9, -1120837551, -1102991437, 1003336935, 1040799505) + + W(10, -1114686833, -1113648733, 1017686828, -1108319001) + + W(11, 1018597782, -1147707682, -1110127893, 1028136822); + sum2 = + W(0, -1106398945, 1034732755, -1136096426, -1116038033) + W(1, 1044672515, -1100200943, 1037208365, 1025870712) + + W(2, 1035173169, -1090565718, 1037348813, -1089313148) + + W(3, 1037418911, 1045738761, -1130864309, -1117649125) + + W(4, -1101335301, 1056357842, -1122254044, 1066071262) + + W(5, -1095175639, -1132458755, 1007521414, 1025322164) + W(6, 1053305068, 1050400788, 1036743473, 1057700465) + + W(7, -1084949846, 1003355997, 1030076164, -1106413087) + + W(8, -1121291886, -1115544374, -1105444760, -1086616818) + + W(9, 1050477957, -1102270714, 1045722667, 999303933) + W(10, -1109509581, -1107192051, 1016457143, 1022772267) + + W(11, 1033704361, 1035291569, -1111299866, 1024551876); + WS(1052508503, 1065718149); + sum1 = W(0, 1042149474, -1109127212, 1041796883, 1033122295) + + W(1, -1120120612, 1045736850, -1110374755, 1038133568) + + W(2, 962035242, -1098223900, 1027445007, -1108112926) + + W(3, -1098175173, 1043181559, -1100319159, -1102543586) + + W(4, 1048663227, 1043423478, 1055339346, 1061167739) + W(5, 1054196775, 1055761732, 1041284046, 1051299336) + + W(6, -1097510801, -1096660204, -1087758861, -1089406218) + + W(7, -1094841886, -1105769888, -1103555357, -1120191499) + + W(8, 1028239019, -1104342914, 1027971236, 1037128774) + + W(9, -1105773058, 1042761157, -1101757237, -1105847257) + + W(10, 1038442493, -1109357577, 1040109559, 1025450507) + + W(11, -1123303012, 1044237597, -1111907879, 1039590240); + sum2 = + W(0, -1109097964, 1021868522, 1007318978, 1032613655) + W(1, 1002517286, -1126879582, 1031113174, -1114937810) + + W(2, 1037136687, -1116667451, -1107845433, -1109068920) + + W(3, 1016069779, -1103760436, 1030143702, -1118059752) + W(4, 1031673749, -1094712046, 1038331125, 1040720319) + + W(5, -1111158812, 1056111085, -1106358629, -1121843086) + + W(6, -1125393555, 1041352693, 1034962829, -1112580519) + + W(7, -1106409067, -1106729155, -1106975050, 1047380650) + + W(8, 1019467600, -1104433838, -1122570447, -1121851072) + + W(9, -1113430896, 1049773824, 1036295980, -1122235886) + W(10, 1025995330, 1008084051, 1039892459, 1025598855) + + W(11, 1045465420, -1110468674, 1020538422, -1113447212); + WS(1056997868, 1008833773); + sum1 = W(0, -1118496039, 1036420187, -1113594582, 1034344230) + + W(1, 1038393121, -1109888100, 1032434307, -1131937728) + + W(2, 1006806901, -1130107576, -1115019369, 1045363911) + + W(3, -1090717022, 1037930126, -1110427933, -1112104883) + + W(4, 1039826714, -1123687353, 1053157409, 1059756929) + W(5, 1058230383, 1045739824, 1042446790, 1052782212) + + W(6, -1123143270, -1104570591, -1093231896, -1095316624) + + W(7, -1095564524, -1098051412, -1101398261, -1104229594) + + W(8, 1006039247, 1032886196, -1105180689, -1102708199) + + W(9, 1035814292, -1129186168, 1025625861, -1112516090) + + W(10, 1017005492, -1125702370, 1028719950, 1009228202) + + W(11, -1119964195, 1033820442, 1028568173, -1136905401); + sum2 = + W(0, 1034320453, -1112051735, 1043966073, 1033608293) + W(1, -1092579307, 1051236380, -1102939053, 1027336318) + + W(2, -1118604595, -1109468006, -1106879339, -1088213587) + + W(3, 1064370547, -1095838484, 1043763107, 1016664388) + W(4, 1025235375, -1107232926, 1049289065, 1067079268) + + W(5, -1088486363, 1044420987, -1107783352, -1116658227) + + W(6, 1028595208, 1046387359, 1044354198, -1087106166) + W(7, -1108961766, -1104528882, 1035658672, 1023955051) + + W(8, 1002638229, -1105038970, 1045499601, 1035867996) + + W(9, -1096457250, 1028839698, -1122532695, -1126291119) + + W(10, -1116609216, 1005965131, -1111658272, -1132447732) + + W(11, 1042442572, -1134350406, -1131375963, -1135660575); + WS(1064849644, -1092967401); + sum1 = + W(0, 1041078624, -1103081652, 1045204674, -1126422222) + W(1, -1107755791, 1049230600, -1101861336, 1041473799) + + W(2, 1033930742, 1034184171, -1098756264, 1038407355) + + W(3, -1103118957, -1103625882, 1035198826, -1102710964) + W(4, 1053270962, 1058076017, 1059044453, 1061713418) + + W(5, 1064682577, 1047988615, 1055582710, 1058355518) + + W(6, -1091277968, -1091900963, -1097334921, -1078564449) + + W(7, -1099822850, -1091654943, -1096942230, -1098047297) + + W(8, -1115974645, -1101902009, 1038364767, 1031099397) + W(9, 1025967234, 1010917525, 1021900159, -1106099948) + + W(10, -1124489961, 1046377811, -1096742869, 1034335299) + + W(11, 1015202107, -1098744549, 1047801952, -1101582418); + sum2 = + W(0, 1034970587, -1105865147, 1024111791, 1018431373) + W(1, -1107243650, 1038385161, -1114574492, -1129893537) + + W(2, 1039267337, 1026053125, 1040193826, 1037956157) + W(3, -1106797747, 1031902437, -1114137980, -1128932411) + + W(4, -1109640195, 1027743203, 1042644379, -1088412806) + + W(5, -1104275404, 1031274183, -1115379021, 1040558376) + + W(6, -1085205368, -1076908464, -1072741915, -1079896887) + + W(7, 1057561219, 1052902509, -1103620900, 1054347378) + W(8, 1065312771, 1068235631, 1074530244, 1069229068) + + W(9, -1110308581, 1045193510, -1167188013, -1099424233) + + W(10, -1111782462, 1029167111, 1035172075, 1048206286) + + W(11, -1092973955, -1105822229, -1102796809, -1106619819); + WS(-1085552428, 1044647857); + sum1 = W(0, -1130568573, -1111247047, 1001536536, -1104704953) + + W(1, 1029690778, -1104108900, 1012447989, -1107166286) + + W(2, -1120131932, 1046596325, 1026932885, 1049575094) + + W(3, 1042872064, -1127841478, -1114289465, -1110288351) + + W(4, -1097293585, -1095715202, -1090361246, -1085535724) + + W(5, -1105723034, -1113844876, -1127895515, 1028149942) + + W(6, 1052681344, 1050957098, 1059711152, 1060788917) + W(7, 1048249845, -1106926654, 1034645781, 1043016176) + + W(8, -1115182247, -1125685565, -1097304503, -1122898434) + + W(9, -1115360055, 1050188162, -1110595670, 1041406167) + + W(10, 1016796643, -1123522377, 1028362085, -1112833505) + + W(11, 1008149481, -1111804152, 1032897312, -1119471349); + sum2 = W(0, 1049638564, 1012096208, 1055008508, 1058022553) + W(1, 1059601221, 1065544846, 1035938200, 1043980555) + + W(2, -1122573304, -1169058693, -1092917400, -1080721407) + + W(3, -1081684685, -1080284825, -1096574070, -1098850345) + + W(4, -1097365817, -1118822370, -1124083512, 1056959548) + + W(5, 1056508637, 1051359763, 1044088441, 1031681402) + W(6, -1120650912, 1032693677, -1127709292, 1044260765) + + W(7, -1099806388, 1042746095, 1033735876, -1121369890) + + W(8, 1039129637, 1036528332, -1113518885, -1122124802) + + W(9, 1019567420, -1101554026, 1041548497, -1108142320) + + W(10, -1114566411, -1119534724, 1015256750, 1042163670) + + W(11, -1110975736, 1032382474, -1110809702, 1022534793); + WS(1049904727, -1085461498); + sum1 = W(0, -1114441151, 1032673159, 1027012354, 1041600521) + W(1, 1035856141, 1033107055, 1031163069, -1139856090) + + W(2, 1047758995, -1122472531, 1048177385, -1116753522) + + W(3, -1105032264, -1109908945, -1104848436, -1111353615) + + W(4, -1092338425, -1101190388, -1096531431, 1059669870) + + W(5, 1063099682, 1058897901, 1049115478, 1055941567) + W(6, 1054893264, 1042608805, 1050188989, -1088410395) + + W(7, -1084283112, -1088007491, -1096369309, -1096366496) + + W(8, -1095327506, -1108884127, -1104987150, -1123782065) + + W(9, 1042263123, 1042892731, 1029697804, 1047202227) + + W(10, 1042581180, -1119554504, 1041262473, -1120686401) + + W(11, -1117364890, -1107384925, -1138499405, -1100444021); + sum2 = + W(0, -1101934313, -1127864237, -1112463889, 1047304216) + W(1, -1097499627, 1041678537, -1128505773, 1039199998) + + W(2, 1068410613, 1066297935, 1052441146, -1077079694) + + W(3, -1082290320, -1095668928, -1097722710, -1096167330) + + W(4, 1053392914, 1047339448, -1111508378, 1044634164) + W(5, -1086326188, 1053023843, 1050833435, -1112581958) + + W(6, 1045964051, -1107136628, 1035674775, 1046050296) + W(7, -1113442140, -1135364198, 1028981469, 1028034745) + + W(8, -1109754454, 1023924243, -1121555471, -1111827987) + + W(9, 1006763480, 1034831467, -1128234727, 1032814306) + + W(10, -1118726053, 1029832629, -1111696115, 1036477638) + + W(11, -1119582249, 1024856185, -1112331027, 1017921306); + WS(-1087326956, 1033622098); + sum1 = + W(0, -1113899675, 1035193378, 1030557818, -1119324954) + W(1, 1042470612, -1117399605, 1021883592, 1035419591) + + W(2, 1045896801, -1161971013, 1045303135, -1095480777) + + W(3, -1110770003, -1109576477, -1100233714, -1122013269) + + W(4, 1041409216, -1108871427, -1104804773, 1041468886) + W(5, -1098059200, 1052050234, 1041862393, 1017834329) + + W(6, -1108955706, 1048600721, -1094955846, 1051943793) + + W(7, 1025944442, -1097508910, 1030612641, -1106071902) + + W(8, -1104543128, -1114333163, 1045266364, -1096626659) + + W(9, 1048775867, 1043056710, -1122051827, 1042839849) + + W(10, 1041055226, -1106692192, 1039063182, -1112593372) + + W(11, -1107180444, 1041486173, -1114362202, -1121041260); + sum2 = + W(0, 1008283263, -1114415273, -1114655921, 1036167174) + W(1, -1111159985, 1033204129, -1122340118, -1127458940) + + W(2, -1111634453, 1032259795, -1123951654, -1116061542) + + W(3, 1039368345, -1102899145, 1024476440, -1118949310) + W(4, -1112224655, 1046234660, 1039099048, 1049934438) + + W(5, 1003410015, -1113540553, -1117681522, -1122317014) + + W(6, -1121896666, 1020399084, -1139717487, 1050902690) + W(7, 1039007446, 1039510238, 1032062517, 1033150391) + + W(8, 1031996897, -1105304684, 1017260660, -1102142181) + W(9, 1003551903, -1114854307, 992233789, -1113963477) + + W(10, -1106176579, 1027107696, -1106922258, 1022104088) + + W(11, -1122048418, -1135188919, -1128403972, -1125862176); + WS(1068173014, -1111006676); + sum1 = + W(0, 1031049568, -1115395480, 1019703498, -1113567107) + W(1, 1015808760, -1109811912, 1027899359, -1103105894) + + W(2, -1103201566, -1112513259, -1112438249, 1042819653) + W(3, 1048780036, 1039150546, 1034094633, 1040353932) + + W(4, 1048004603, -1117860850, -1104427535, -1083606526) + + W(5, -1083053360, -1090564527, -1092330682, -1095220995) + + W(6, -1100468360, -1173290307, 1042677725, 1064316383) + W(7, 1063571221, 1060600586, 1050639762, 1054475004) + + W(8, 1046039773, -1123264224, 1030284012, -1122621123) + + W(9, -1094902185, -1103353426, -1106486660, 1034806311) + + W(10, 1012485196, -1127850837, 1029876039, 1036820754) + + W(11, 1035184606, 1024997805, -1149057999, -1123061719); + sum2 = + W(0, 1014853092, -1120466254, 1027909890, -1117512854) + W(1, 1026011110, -1110873488, 1036041188, -1115497806) + + W(2, -1122580470, -1114547761, 1030745116, -1119656010) + + W(3, 1035574738, -1120221385, 1020780404, -1122615179) + W(4, -1120994367, 1038991680, 1034511499, 1041066172) + + W(5, -1109149586, 1024235728, -1112980367, 1020521688) + + W(6, 1047459793, 1047680543, -1098401240, -1121088174) + W(7, 1045982327, 1024310650, -1122000913, 1042402937) + + W(8, 1064875701, 1054395623, 1045153300, -1085223893) + + W(9, -1084582209, -1099510820, 1029465320, -1105747852) + + W(10, -1132455031, 1011283964, -1108441710, 1018552602) + + W(11, -1106692167, 1026658994, 1023023932, 1004613671); + WS(-1095915991, 979918868); + sum1 = + W(0, -1115463727, -1137886897, 1011021190, 1011860489) + W(1, -1129491953, 1007409140, -1124741815, -1122228982) + + W(2, 1032823819, 1037523161, 1029800132, 1043477300) + W(3, -1105888052, -1114264129, 1021218335, 1030459197) + + W(4, 1026707497, -1131549790, -1108429845, -1100874368) + W(5, 1047336484, 1049886943, 1042964547, 1038061098) + + W(6, -1119898332, 1035412665, -1136100063, -1112838682) + + W(7, -1098267600, -1097768883, -1106237874, -1108915952) + + W(8, 1026568544, -1108324895, -1138504034, 1047390560) + W(9, 1036689246, 1037432366, 996441389, -1121991146) + + W(10, -1121143952, -1129452238, -1120493188, -1147670274) + + W(11, 1028096953, -1134502280, -1157333673, -1177453050); + sum2 = W(0, -1121902268, -1128394666, 1039974898, -1114856664) + + W(1, 1032116923, -1115163450, -1112859101, -1128925353) + + W(2, 1020062213, -1143339877, -1102502778, 1034423857) + W(3, 1030950002, 1038088024, 1036537682, 1019282123) + + W(4, 1034601005, -1111450467, 1034366199, -1093114037) + + W(5, 1027196884, 1036157347, -1130356560, 1032717961) + + W(6, -1096503308, 1052764693, -1095299550, 1060522961) + + W(7, 1057088106, -1104371255, 1031719642, -1110891365) + + W(8, 1050858947, -1099720262, 1055940597, -1087523263) + + W(9, -1085850393, -1107617878, -1119144319, 1017512699) + + W(10, -1108630019, -1130142915, -1105816149, 1037139152) + + W(11, 1054601799, 1043807995, -1122652165, 1025497552); + WS(1066530838, 1025703389); + sum1 = + W(0, -1120765920, 1009297086, -1122351141, 1015487755) + W(1, 1015844344, -1127613121, -1133586812, -1124468594) + + W(2, -1132051981, -1139418709, -1109474502, -1098776251) + + W(3, -1109199593, -1123764613, -1121408403, -1145136640) + + W(4, -1129191897, 1032587897, 1057153612, 1049522345) + W(5, 1041525985, -1109817213, 1010121533, -1107128582) + + W(6, 1042371592, -1118415861, -1120712699, -1099055070) + W(7, 1049700744, 1050593755, 1036084166, 1038803505) + + W(8, 1007708012, -1122811552, -1105657359, -1099127683) + + W(9, -1111888320, -1113004743, 984437698, 1036904923) + + W(10, -1116932051, -1134432681, -1127344014, 1026629028) + + W(11, -1119906716, -1136900213, -1118848634, -1123829719); + sum2 = W(0, -1117430114, 1039120940, -1106133189, 1026507473) + + W(1, 1031550625, -1142215401, 1026312489, -1139250704) + + W(2, 1041261247, -1107749198, -1099018179, -1131506304) + + W(3, -1123617030, -1123190888, -1112954810, -1137414048) + + W(4, 1033806419, -1097831330, 1064523288, 1045711847) + + W(5, -1088977338, 1052831473, -1133526188, -1122137188) + + W(6, -1126022952, 1041137317, 1057416214, -1092069746) + + W(7, 1059767697, -1088761837, 1033531722, -1110686692) + + W(8, -1155381873, -1127685702, -1099691831, 1026250214) + + W(9, -1098651966, -1118397760, -1130823120, 1029280576) + + W(10, -1125967712, -1116954634, 1032736142, -1120045450) + + W(11, 1021746164, 1028302350, 990513889, -1115066264); + WS(1066680246, 1040921440); + sum1 = + W(0, -1119730500, 1034101258, -1132236433, -1104735450) + W(1, 1035235184, -1111591250, 1024518355, -1121802685) + + W(2, -1110280861, 1011417444, 1027753539, 1038200908) + W(3, 1035268043, -1121734057, 1032771355, -1126371080) + + W(4, -1092083138, 1031601302, -1090607216, -1078665075) + + W(5, -1096046953, -1093429316, -1094352558, -1102572591) + + W(6, 1053565584, 1054599907, 1058261942, 1061430978) + W(7, 1061610294, 1056142824, 1053165350, 1055282545) + + W(8, -1110918026, -1143895330, -1111808624, -1099071584) + + W(9, -1106320677, -1105323662, -1138833863, 1035738553) + + W(10, 1029997623, -1113777127, 1039976245, -1112447940) + + W(11, 1023744576, -1145165385, -1113453535, 1031263347); + sum2 = + W(0, 1033717276, -1129082210, -1111396517, 1053521042) + W(1, -1096499765, 1041638909, -1115028859, -1143837439) + + W(2, 1028210443, -1130739278, -1117565460, -1113906791) + + W(3, -1106119849, 1044690885, 1000486481, 1015998178) + W(4, 1046091050, -1085374293, 1033058760, 1062822204) + + W(5, -1089123399, 1003636411, 1048601259, -1103883056) + + W(6, -1119519632, 1026401017, -1106338078, 1066908993) + W(7, 1034907371, 1054286387, -1096894542, 1041460877) + + W(8, 1050909876, -1110182528, -1149282827, -1081393742) + + W(9, -1094008056, 1035142168, 1020535023, 1028271260) + + W(10, -1117678961, 1042909501, -1099518378, 1044082334) + + W(11, -1097984366, 1040282994, -1109925208, 1021313035); + WS(-1111691100, -1070453585); + sum1 = W(0, 1040350706, -1107702492, 1045915011, -1103582444) + + W(1, 1036820082, 1030081641, -1112926972, 1034445457) + + W(2, 1032181048, 1006352113, -1101176752, -1098104500) + + W(3, -1111995209, -1105752467, -1111976126, 1025879721) + + W(4, 1054597571, 1056547603, 1059824936, 1062411659) + W(5, 1062112057, 1042786985, 1050598527, 1058122296) + + W(6, -1090063653, -1111618639, -1087007388, -1079908657) + + W(7, -1098160558, -1094958736, -1104521261, -1107753094) + + W(8, -1105977411, 1011306277, 1037450066, -1113612402) + + W(9, 1043358554, -1108376090, 1024420791, -1098378691) + + W(10, -1114266718, 1034245578, -1130610528, -1111998342) + + W(11, 1021846218, 1026051990, 1032139296, 1018599200); + sum2 = + W(0, -1102183736, 1045283790, -1099060082, 1029589699) + + W(1, -1103326288, -1146696619, -1123727405, -1106785078) + + W(2, 1044690091, -1117083441, -1109435037, 1005932683) + + W(3, -1109954065, -1130369043, -1115538567, 1039027144) + + W(4, 1025447267, 1036724432, -1100626978, 1066859805) + W(5, -1114206859, 1024539831, -1123732285, 1040901138) + + W(6, -1103679886, -1096666126, 935783211, 1061824774) + + W(7, -1098480165, -1113161303, -1109149493, -1129688427) + + W(8, 1034791609, 1043810354, -1097803022, 1034749891) + W(9, -1094988176, 1050252440, 1029732207, -1105144948) + + W(10, -1120655593, -1109094473, 1029730663, 1023292171) + + W(11, -1109570093, 1012313206, -1106431920, 1015686163); + WS(-1105638574, -1077878805); + sum1 = W(0, -1112101313, 1025565072, -1118212870, 1034991091) + + W(1, 1037618766, 1033034081, 1023523536, -1143864013) + W(2, 1043313362, 1041884710, 1045058176, -1099609869) + + W(3, -1100255017, -1097107341, -1104696333, -1128917761) + + W(4, -1104398291, -1093904634, -1086702118, 1055637093) + + W(5, 1061981800, 1053455331, 1048950646, 1037339676) + W(6, 1034529536, 1043314021, 1058479092, 1049084915) + + W(7, -1082434966, -1087005060, -1098585534, -1105402705) + + W(8, -1120033234, -1106696920, -1128822905, -1126325576) + + W(9, 1050170340, 1046293466, 1042248226, 1032623999) + W(10, 1017824488, 1028280843, 1038132788, -1136921361) + + W(11, -1125947450, -1124008918, -1126565485, -1114937252); + sum2 = + W(0, 1040832216, 1042032808, 1039550307, 1029252447) + W(1, 1040592387, -1111709033, 1050208698, -1091595987) + + W(2, -1125419559, -1103788280, 1043848052, -1099123277) + + W(3, 1047689572, -1102650535, -1105352144, 1033340873) + W(4, -1166596642, 1045241846, 1051795538, 1068949095) + + W(5, -1094163017, -1111700665, -1117027793, 1027304955) + + W(6, -1076839498, -1091833274, 1035730071, 1070654393) + W(7, -1096947569, 1050259859, 1051072204, 1048679723) + + W(8, -1085872442, -1105795498, -1094587067, 1007431650) + + W(9, -1089767553, 1041510738, -1100476212, 1057584085) + + W(10, 1038631745, 1037000995, -1115278352, -1103746979) + + W(11, 1041143367, 1025070825, -1116523862, -1093749689); + WS(-1095944791, 1081861902); + sum1 = W(0, -1129669743, -1116664839, -1148272609, -1121494877) + + W(1, -1115602986, 1028329496, -1123378150, 1027525168) + + W(2, 1034635115, -1122706061, 1033259121, -1124251544) + + W(3, -1126517523, -1128061368, -1130313237, -1119991479) + + W(4, 1057433596, 1048908041, 1058166921, 1058746094) + W(5, 1055593874, 1057488289, 1049860117, 1061071735) + + W(6, -1090131839, -1093164666, -1087001587, -1083481847) + + W(7, -1085306808, -1091485686, -1102755929, -1105495231) + + W(8, -1120322428, 1030509816, 1035303897, 1044900399) + W(9, 1041073282, 1023593721, 1034451003, -1102595129) + + W(10, 1008560041, 1023557506, 1013701241, -1117995899) + + W(11, -1116643091, 1023656437, -1164007844, 1024551167); + sum2 = + W(0, 1029670841, -1115575058, 1042858197, -1101600217) + W(1, -1117748556, 1035438169, -1114535210, 1032334939) + + W(2, 999172620, -1099435099, -1139359478, 1027943101) + W(3, 1048715384, -1098854617, 1036336651, 1041563473) + + W(4, 1042251423, 1041110640, 1058527193, 1075961547) + W(5, 1073424302, -1086643829, -1080060710, -1067239867) + + W(6, -1105031588, -1120449287, 1010020318, -1109667225) + + W(7, 1057314889, 1037113027, -1123725073, -1100548924) + W(8, 1027957701, 1035596553, 1019832195, 1011086126) + + W(9, 1033526397, 975610078, 1012557694, -1095465488) + W(10, 1026093121, -1156632055, -1126960339, 1010028142) + + W(11, 1037810339, -1115077778, -1133987070, 1036754195); + WS(-1085172076, 1069147958); + sum1 = W(0, 1025703205, -1141293989, 1041286826, -1119005195) + + W(1, 1026450561, -1117134469, -1120895076, 1025414366) + + W(2, 1027233863, -1106615031, -1115436126, -1112858253) + + W(3, 1042609938, -1122683754, 1044686038, -1117169125) + W(4, 1026640114, 1042354526, 1053740861, 1054852793) + + W(5, -1119314307, 1026745790, -1108709290, 1023400633) + + W(6, 1029190628, -1106775167, -1106293072, -1089581852) + + W(7, -1098775605, -1108063055, 1015550627, -1125318352) + + W(8, -1111659152, -1115892869, 1035182992, 1027435128) + + W(9, -1137028117, 1038436612, -1112739478, 1031194923) + + W(10, -1139375968, 1028377583, -1156734143, -1121669673) + + W(11, 1034668065, -1119291218, 1027259179, -1118201212); + sum2 = + W(0, -1154464437, 1004660066, 1011666487, 1016373458) + W(1, -1117096132, 1027534293, -1118720211, 1024315262) + + W(2, 1027039233, -1115032564, -1147080182, 975139636) + W(3, 1025013868, -1117310194, 1025607183, -1145025250) + + W(4, 1008089899, 1041471507, 1053281755, -1081313755) + W(5, -1118862913, 1040077608, -1134922624, 993302909) + + W(6, -1117609897, 1033488023, 1082321679, -1065846603) + + W(7, -1122974098, -1130639872, -1143672974, -1114202318) + + W(8, -1118717800, 1033628240, 1046901100, 1050032460) + + W(9, -1106934499, -1137731251, -1177023016, 1017914834) + + W(10, 1027401421, -1112728150, 1012824907, -1108305112) + + W(11, 1038621352, -1137500513, -1129758225, 1025570630); + WS(1065820150, -1112682631); + sum1 = + W(0, -1105640672, -1136938293, 1007936778, -1099447769) + W(1, 1033964109, -1110772895, -1107676126, 948858222) + + W(2, -1140735040, 1045425461, 1012508339, 1052020966) + W(3, -1110876672, 1038536521, 1034428376, 1041035251) + + W(4, -1096706537, -1095619178, -1101065539, -1083835034) + + W(5, -1127256032, -1101414038, -1102412811, -1104437005) + + W(6, 1051064512, 1046810501, 1057299292, 1054321083) + W(7, 1044289505, 1042038046, 1050440565, -1126355329) + + W(8, -1114855500, 1041816072, 1015987827, 1049485320) + W(9, -1106506396, 1031650401, -1098866309, 1044647659) + + W(10, -1128129890, -1108472292, 1036938130, -1101761488) + + W(11, 1035708141, -1113134674, 1031811610, -1119496853); + sum2 = + W(0, -1116689599, 1033662400, -1110264521, -1113832562) + W(1, 1034493072, 1024644211, -1105470304, 1030330543) + + W(2, -1104060794, 1047714485, -1106889746, 1055059659) + W(3, -1089308922, 1027816870, 1032487381, 1043118546) + + W(4, 1023887631, -1101000300, -1123902349, 1047334183) + + W(5, 1060541265, -1145174230, -1099777158, -1100795602) + + W(6, 1047625619, -1113896185, 1058674488, -1105663288) + + W(7, -1079751447, 1040502911, 1059286709, -1110882655) + + W(8, -1104647113, 1049921725, -1100964722, 1060005487) + + W(9, -1088726381, 1026206299, -1093081927, 1033716355) + + W(10, 1032108768, -1114038586, -1134500667, -1105023935) + + W(11, 1046968990, -1116742649, 1042150309, -1127164330); + WS(1051219671, 1032040132); + sum1 = W(0, 1024246061, 1029213629, -1142580623, 1007533386) + W(1, -1132388626, 1016678619, 998523489, 1023830470) + + W(2, -1110293770, -1111062337, 1026027124, 1035026513) + + W(3, 1036422600, 1011246152, -1173422083, -1130424090) + + W(4, -1098745559, -1104763504, -1097349705, -1082429923) + + W(5, -1083869189, -1095610025, -1095350964, -1094623957) + + W(6, 1035978230, 1041701281, 1051781481, 1065410260) + W(7, 1060856625, 1057796630, 1045145830, 1055180598) + + W(8, 1050231066, -1106571859, 1040668770, -1111350032) + + W(9, -1113287631, -1122887388, -1109374678, 1007169387) + + W(10, -1111943280, 1016965359, 1026054164, 1035026168) + + W(11, 987392292, 1019565189, -1110518465, 1026555204); + sum2 = + W(0, -1123481859, 1024186334, -1181265672, -1136581772) + W(1, 1007273042, -1130526339, -1134191606, 1035801320) + + W(2, -1131096266, -1121050215, 1023491721, -1115413373) + + W(3, 1036272276, -1110187157, -1123342647, -1125507188) + + W(4, -1107023625, 1040345453, -1110082893, -1116173932) + + W(5, 1041634800, 1028205855, 1036476425, -1124495703) + W(6, 1040776673, -1129271163, 1044851152, -1097567007) + + W(7, 1051516690, -1106625929, 1035231370, 1007786534) + + W(8, -1073406322, -1080765061, -1077100552, -1085034176) + + W(9, -1104398720, 1019889879, -1115096299, -1105128420) + + W(10, 1074128739, 1066657253, 1068015119, 1066670217) + W(11, -1111857710, 1026394385, 990445793, 1030299973); + WS(-1124324720, 1038677119); + sum1 = W(0, 1008341069, 1031967089, 1023486232, 1037528348) + W(1, -1122921519, 1029849459, -1114006089, 1035528454) + + W(2, 1038389179, 993181316, -1145165264, 991007864) + W(3, 1024190949, 1044031254, -1123515526, 1052524910) + + W(4, 1056361124, 1050863173, 1054230472, 1063082151) + W(5, 1050043692, 1049660054, 1043779649, -1097977265) + + W(6, -1081451931, -1096246661, -1086637900, -1088130503) + + W(7, -1092787999, -1099337955, -1095996120, -1102904005) + + W(8, 1047683325, 1035916906, 1027831167, 1026128198) + W(9, 1020947750, 1025351359, 1037985981, -1114005272) + + W(10, -1130646284, -1134539381, 986748732, 1003368116) + + W(11, -1115252008, 1036720064, -1116396881, 1029521402); + sum2 = + W(0, 1042203848, -1133163156, -1108707706, 1027923803) + W(1, -1098359820, 1043843260, 1021888231, 1023965418) + + W(2, -1089098687, -1098025067, 1036383110, 1058285406) + W(3, 1062333205, 1048839159, 1058743586, -1078465930) + + W(4, 1035967917, 1052777785, 1043356562, 1046924897) + W(5, -1080913711, -1088408400, -1097507024, 1067915456) + + W(6, 1068788369, -1096461215, -1090569807, -1088764217) + + W(7, -1095261121, -1098396864, -1093746709, 1064748817) + + W(8, -1095505730, -1097973178, -1127034898, 1056967609) + + W(9, 1040836988, 1046078649, -1111389506, -1099047850) + + W(10, 1025788011, -1111191248, 1023876171, 1046203397) + + W(11, -1107189985, -1113219498, -1110869404, 1040158004); + WS(-1080347734, -1094728165); + sum1 = W(0, -1115633753, -1128052610, 996364134, 1027254679) + + W(1, 1027401421, -1125749028, -1143663749, 1017291157) + + W(2, 1036436624, 1031912915, 1038598142, -1114408211) + + W(3, -1097652239, -1109729611, -1111208674, -1118442418) + + W(4, -1113632799, -1104119121, -1095896866, 1064358521) + + W(5, 1061684826, 1051089073, 1044518984, 1048577269) + W(6, 1018734050, -1104173746, 1042956529, 1051156401) + + W(7, -1087880029, -1093838037, -1100689848, -1104163629) + + W(8, -1104273977, -1115038313, -1098511458, 1006576423) + + W(9, 1037804713, 1039011098, -1157246715, -1145301883) + + W(10, 1022550473, -1128796792, 1027191321, -1123707765) + + W(11, -1125317723, -1116369959, -1130384675, -1113863292); + sum2 = W(0, -1137561210, 1008161562, -1138249722, 1032804591) + + W(1, -1118405314, -1149548391, -1140666666, -1121723310) + + W(2, 1000810292, 1017087401, -1104015266, 1045940061) + + W(3, -1112933693, 1040845572, -1131915309, -1125770861) + + W(4, -1109671087, -1143663956, -1100429296, 1064636422) + + W(5, 1041071232, -1095622064, -1113635957, -1156294183) + + W(6, -1098257975, -1088410023, -1110483119, 1065774501) + + W(7, -1111449957, -1114533177, -1105461804, -1154727079) + + W(8, -1113334223, 1033424863, -1113376685, 1041401738) + + W(9, -1107119710, 1041680128, -1114424843, -1143304660) + + W(10, 1010643898, -1122425914, -1120544050, 1015219657) + + W(11, 1028103016, -1125778629, -1127495397, -1128411685); + WS(1062796012, -1081433938); + sum1 = W(0, -1140258862, 1019305782, 1017521696, -1128637410) + + W(1, 1030042599, -1140240046, 1023786378, 1027083972) + + W(2, 1047697940, -1137205890, 1040574503, -1131514496) + + W(3, -1115750349, -1114177400, -1119424318, 1025144619) + + W(4, 1041493798, 1051824452, 1048941321, 1061551411) + W(5, 1058760695, 1056942277, 1045023263, 1056967544) + + W(6, -1090901033, -1095124244, -1090555023, -1084025976) + + W(7, -1089279069, -1089170928, -1099538126, -1087239225) + + W(8, 1032453887, 1034552166, 1032035723, 1036871279) + W(9, 1041251643, 1032547975, -1117686145, 1027338481) + + W(10, 1008978681, 1031420374, -1124609380, 1025475023) + + W(11, 1016399695, 1024887097, 1002611913, 1012109898); + sum2 = + W(0, 1004838046, 1009005547, 1023830295, -1121204348) + W(1, 1026709605, -1145957446, 1024434367, -1122812157) + + W(2, 1036867068, -1112484311, 1034701810, -1131856601) + + W(3, 1008859907, -1129570235, -1120209470, 1023686531) + + W(4, 1023348885, -1113333873, -1115269491, -1084820204) + + W(5, -1095888786, 1052224270, 1043852487, 1047863595) + + W(6, -1120560082, 1019969949, -1089366478, -1067115412) + + W(7, -1071017431, 1066362408, 1084005284, 1063525936) + W(8, 1032448279, -1115333043, 1028612787, -1132671203) + + W(9, -1112864526, 1045423025, 1025066805, 1043035962) + W(10, 1025411331, -1123665230, 1024216939, 1034346460) + + W(11, -1116027280, -1133553563, 1032270816, -1105823812); + WS(-1103681710, -1114530079); + sum1 = + W(0, 1025861737, 1029506744, 1032236919, 1035998951) + W(1, -1111043394, 1007410083, -1126534927, -1123346113) + + W(2, -1130912909, -1104283663, -1132593150, -1102933559) + + W(3, 1040041573, 992747222, 1034020670, -1119406504) + W(4, -1110124091, -1117715067, 1039686571, -1097542514) + + W(5, -1088677703, -1112367617, -1105036246, 1035634224) + + W(6, 1040844938, 1046218351, -1098764800, 1059317136) + W(7, 1057765873, 1054923388, 1029185429, 1040434219) + + W(8, -1105267215, -1121870249, 1038793978, -1096018272) + + W(9, -1105386706, -1101946581, -1122605111, -1143951794) + + W(10, 1021540535, 1032871129, -1120294159, 1036773558) + + W(11, -1111111618, 1031187710, -1138057273, 1023823648); + sum2 = W(0, -1133865733, -1114357788, -1113774565, -1094909862) + + W(1, 1041934157, 1048238594, 1041091101, 1042608690) + W(2, 1041378526, 1025611699, 1057780422, -1134317911) + + W(3, -1084534604, -1105040821, -1096429323, -1128928913) + + W(4, -1102114760, 1041852494, -1090351620, 1058263821) + + W(5, 1059786982, -1114163954, 1034035361, -1102786592) + + W(6, 1040042063, -1102827642, 1041105879, -1094128428) + + W(7, -1121888905, 1038597269, -1139774900, 1035391793) + + W(8, 1036263014, 1023561916, -1107817782, 1049906607) + W(9, -1106476521, 1034361268, 1016844568, 1014428216) + + W(10, -1111718847, -1109687464, 1041802453, -1106696300) + + W(11, 1023851848, 1032032810, -1111010993, 1031652841); + WS(1059372396, -1131086843); + sum1 = + W(0, -1116770958, -1133338231, -1109423369, -1142676381) + + W(1, -1119417706, 1016864285, -1134266292, 1026073927) + W(2, 1038224730, -1110641250, 1048611339, 1026922691) + + W(3, 1012241985, 1033593306, -1108924145, 1029871326) + W(4, -1145642197, 1044958408, 1054215533, 1059821143) + + W(5, 1063416476, -1109435540, 1051611888, 1046037553) + W(6, 1033085351, -1100693257, 1024247225, -1085100606) + + W(7, -1082741615, -1105005730, -1096553463, -1091104802) + + W(8, -1114157744, 1030339791, -1106016522, 1039898225) + W(9, 1046979692, -1157274234, 1033932042, 1022970360) + + W(10, -1129272066, 1026076824, -1113286331, -1126911267) + + W(11, -1119319754, -1131274519, 1018258200, -1118999381); + sum2 = W(0, -1117639690, -1126294727, -1135696947, 996342293) + + W(1, 1025603183, -1120264553, 1034416033, 1029227505) + + W(2, 1032542252, -1105983103, -1105990346, -1101410582) + + W(3, 1031145839, 1029472991, -1125334020, 1016716795) + W(4, 1049036492, 1053585046, 1063294224, -1084067012) + + W(5, 1030876063, -1090564487, 1047874805, -1103677712) + + W(6, -1106428174, -1090074420, 1074893281, -1121077701) + + W(7, -1079475296, 1059480413, -1099339963, -1097572114) + + W(8, -1100598545, -1101677356, -1088449090, 1052666358) + + W(9, 1049420880, -1099961793, 1047783255, -1106211131) + + W(10, -1124515281, 1042350020, -1128187082, -1118105649) + + W(11, 1033189178, 1012743453, 1016211057, 1026065323); + WS(998487488, 1024735998); + sum1 = W(0, 1034787125, 1033987197, -1118966639, -1138173503) + + W(1, 1022076300, -1112157509, 1034213589, -1125240838) + + W(2, -1096711418, 1049342972, -1099717199, 1051641300) + W(3, 1049184050, 1032130968, 1048086279, 1039987293) + + W(4, -1093645783, -1089249828, -1085775960, -1083720757) + + W(5, -1086133195, -1087092580, -1098046771, -1087792286) + + W(6, 1058035879, 1055719968, 1060189357, 1061848612) + W(7, 1062875388, 1007190411, 1051240059, 1039984791) + + W(8, -1113381667, 1033680357, -1108537011, -1102783527) + + W(9, -1129404117, -1110331987, 1030325168, 1051616838) + + W(10, 1020339515, 1037116250, -1109989161, 1046511483) + + W(11, 1032957443, 1011591327, 1039628088, -1135236550); + sum2 = W(0, 1001577162, 1041063142, -1112011211, 1039747614) + + W(1, -1137882877, -1105672858, 1031849538, -1108158369) + + W(2, 1048277958, 1048804575, 1037383696, 1042988518) + + W(3, -1097597287, -1099442373, -1108394523, -1155656404) + + W(4, -1094388043, 1061039504, 1055288082, -1084834029) + + W(5, -1087507005, 1044806256, -1093629181, 1059993792) + + W(6, -1079852425, -1095199392, -1077655189, -1103423898) + + W(7, 1064308251, 1065240337, 1071708239, 1061107030) + W(8, 1055450674, 1054780006, 1058201467, 1071463850) + + W(9, 1058560116, -1080251704, -1090257183, -1073879137) + + W(10, 1040994203, 1035580564, -1111912036, -1100510960) + + W(11, -1097442490, -1090250140, 1028605291, -1106111844); + WS(-1077135094, 1050907162); + sum1 = W(0, -1132921461, -1127648729, -1124984131, -1118007170) + + W(1, -1117294457, -1126452986, -1124706520, -1119126518) + + W(2, -1117094275, 1033699545, 1030394994, 1045491604) + W(3, 1039295895, 1040542752, 1018438944, 1035722382) + + W(4, -1098008869, -1094355462, -1089194394, -1081313730) + + W(5, -1088142214, -1094044967, -1098093746, -1094059515) + + W(6, 1043699095, 1055483630, 1053279460, 1065160347) + W(7, 1056280352, 1058021117, 1041063570, 1050783700) + + W(8, -1112620946, 1042990903, 1047326318, -1121246728) + + W(9, -1110840279, -1106681402, -1128181366, 1018820533) + + W(10, -1122422352, 1034045812, 1011377167, 1042128328) + + W(11, -1103632934, 1039870541, -1109127577, 1037083890); + sum2 = W(0, 1003021837, 1029225785, -1123823650, 1023947681) + + W(1, -1119691195, 1024608678, -1125446899, 1034042378) + + W(2, -1110495495, 1032075003, -1122423961, 1043723635) + + W(3, -1138212418, 1017994477, -1115371525, 1002413729) + W(4, 1016902499, 993748010, 1028513681, -1096435650) + + W(5, -1120166015, -1119557273, 1032720188, -1115060009) + + W(6, -1116948709, 1041772340, 1083263801, 1074788880) + W(7, 1038793960, 1017310535, 1032034162, -1118011761) + + W(8, 1029108513, -1097222635, -1063916786, -1074844879) + + W(9, -1115182489, 1021770517, 1014563122, 1027576529) + + W(10, -1113320609, 1042534143, 1039031010, -1104645285) + + W(11, -1124877446, -1131419477, -1119401015, 999290841); + WS(1048452526, 1015184705); + sum1 = W(0, -1138645804, 1032256237, -1114005032, 1026512560) + + W(1, -1140244890, -1131077462, 1024452554, -1122466948) + + W(2, -1110581160, 1049910352, -1103860667, -1098570768) + + W(3, -1119844941, 1040825100, 1017183931, -1119780203) + + W(4, -1106270342, -1113826958, -1097372109, -1087095027) + + W(5, -1095003728, -1095439444, -1128526324, -1106181921) + + W(6, 1048623137, 1036222192, 1057099626, 1061337654) + W(7, 1054485156, 1049129464, 1044366494, 1040163591) + + W(8, 1006760678, 1042522323, -1101854594, -1106501979) + + W(9, -1115808507, 1027903818, -1153767820, 1034550428) + + W(10, -1113210911, 1029873877, -1111141177, 1024448974) + + W(11, -1125584845, -1111469876, 1027351533, -1117633442); + sum2 = W(0, -1117856953, 1002437005, -1122373390, 1023823647) + + W(1, -1131092262, -1119824143, -1129026789, -1118651901) + + W(2, 1034706164, -1114697961, -1110151254, -1078943314) + + W(3, -1111296752, 1008147760, 1015792571, 1029244251) + W(4, 999139177, 1016679180, 1034965747, 1069645782) + + W(5, 1026082346, 1005900489, -1134452913, -1121319377) + + W(6, -1115089108, 1009230224, 1007700984, -1105149666) + + W(7, 1033262730, -1142960238, 1015281188, 1026230788) + W(8, 970725323, 1019562884, -1131774725, 1038179083) + + W(9, 1014219446, -1130072184, 1012295392, -1122304449) + + W(10, 1017499348, -1131336757, 1031482891, -1120925641) + + W(11, 1015408436, 1001625665, -1137039581, 1019807852); + WS(1061396972, -1097419696); + sum1 = W(0, 1040610541, -1116833412, 1015657075, -1126977972) + + W(1, 1033993320, -1125945514, 1028019732, -1120964750) + + W(2, -1110826049, 1042368898, -1113808270, 1036447253) + W(3, 1043284110, 1048078310, 1028739112, 1052576556) + + W(4, -1087862644, 1000165941, -1108964145, -1085843362) + + W(5, -1088558114, -1086794197, -1087573386, -1079810761) + + W(6, -1108888122, 1058527541, 1056284429, 1053927177) + W(7, 1062174380, 1055390198, 1042115560, 1051035743) + + W(8, 1051684947, -1102910221, 1041698836, -1107922836) + W(9, 991752527, -1112253878, 1039363202, 1047360574) + + W(10, -1117156776, -1135746300, 1026275932, 1041042462) + + W(11, -1137078595, 1035139905, -1118906322, 1038370422); + sum2 = + W(0, -1104315228, -1117475550, 1019617669, -1096755788) + W(1, 1043056626, -1097959989, 1038305467, -1121707278) + + W(2, -1103350409, 1024254038, -1116633366, 1042486592) + + W(3, 1038440719, -1097184876, -1107570984, -1092525975) + + W(4, -1094844926, -1091235931, -1089312569, -1104902685) + + W(5, 1045881224, -1101957876, 1058820589, 1058872796) + W(6, 1062539510, -1112967686, 1056743222, 1052266072) + + W(7, 1037341407, 1012499609, 1048266302, -1099676541) + W(8, -1096027281, 1042482062, -1129394013, 1051055108) + + W(9, 1044017054, -1101861122, -1105903455, 1041661910) + + W(10, 1014020953, -1119186298, 1028745390, -1093268483) + + W(11, 1054988226, -1102938164, 1026503526, -1135013257); + WS(-1084431788, -1073850193); + sum1 = W(0, -1121456839, 1023326765, -1111055334, -1131954777) + + W(1, -1127100870, -1115233108, 1032290155, -1113154576) + + W(2, -1130755883, -1119027356, 1007276024, 1032958718) + + W(3, 1051511197, 1038479638, 1033362061, -1118671783) + + W(4, -1131651239, -1113039213, 1041028837, -1121014635) + + W(5, -1080291009, -1101242168, -1095204295, -1109590335) + + W(6, 1035028387, 1052115068, -1087869490, 1031197854) + W(7, 1064028192, 1046762496, 1048797598, 1048241682) + + W(8, 1035837265, 1031790055, 1043959725, -1151139494) + W(9, -1097929447, 1016490449, 974160200, 1033898418) + + W(10, -1139076328, -1110649673, -1126605404, 1037205893) + + W(11, 1022476742, 1029406204, -1117985767, 1016018525); + sum2 = + W(0, 975878233, 1027199947, 1032202892, 1011577542) + W(1, 989447596, -1126785583, -1112180928, 1027448187) + + W(2, 1035912472, 1026239811, -1109490583, -1099491895) + W(3, 1027909011, -1142596491, 1032601180, 1030066347) + + W(4, 1033266404, -1101163205, -1092678923, 1052721602) + W(5, -1115079323, 1042994318, -1117880304, 999387083) + + W(6, -1098777501, -1120465270, 1026269275, 1058060839) + + W(7, 1022663675, -1109244590, -1139999774, -1113199846) + + W(8, -1115369638, 1047867282, 1048647954, 1026065727) + + W(9, -1107120056, -1139333782, -1113232790, -1128307819) + + W(10, 1024165887, -1114558090, -1127793863, -1110013405) + + W(11, -1115589183, 1028177183, -1119188249, 1010561254); + WS(1060891500, 1063998119); + sum1 = W(0, 1009319059, 1021371624, 1020060242, 1034805925) + W(1, -1119463744, 1029917861, 1022228167, 1028919037) + + W(2, 1034817251, -1123888698, 1007070174, 1031377177) + W(3, 1035958587, 1040845210, -1119265271, 1041595485) + + W(4, 1060685055, 1050963407, 1059880676, 1058492133) + W(5, 1057972187, 1045390927, 1050698442, 1042995863) + + W(6, -1082111981, -1089953728, -1083685732, -1080402290) + + W(7, -1087669949, -1092052092, -1101265316, -1093474029) + + W(8, -1146641530, 1042831681, 1044491976, 1049293617) + W(9, 1044279073, 1030870792, 1040824939, -1117179330) + + W(10, 1021753903, -1158245846, 1024323659, 974645755) + + W(11, 1017781825, 1029410098, 1009963113, 1033823734); + sum2 = + W(0, 1043252027, 1039685669, 1021402919, 1043798699) + W(1, -1106121381, -1107286980, -1116219530, -1105216890) + + W(2, 1031085111, -1103588836, -1094345084, -1097680472) + + W(3, -1098140010, -1117022930, -1111854401, -1165267820) + + W(4, -1089976691, -1136546874, -1106220008, 1053086422) + W(5, 1041831351, 1053158416, 1043898913, 1065796563) + + W(6, 1015926083, 1047286193, 1049855126, -1093227067) + W(7, 1030378489, 1047431201, -1088912308, 1047204695) + + W(8, 1075090314, 1055918010, -1100279282, -1086978538) + + W(9, -1081018505, -1090494906, 1049023531, -1076607098) + + W(10, -1090475122, 1041438201, -1097421747, 1055157984) + + W(11, 1047503463, 1040447738, 1013873926, 1060337257); + WS(-1071907259, -1110912590); + sum1 = W(0, -1125193009, -1128862543, -1134196340, 1030754750) + + W(1, -1115532794, 1035978988, -1122396199, 1030566929) + W(2, 1047025832, 1037187527, 1045585380, 1046461539) + + W(3, 1034859053, 1044478211, 1038023446, -1115297724) + + W(4, -1082520498, -1091004805, -1082717575, -1081098270) + + W(5, -1085641231, -1094770022, -1100806498, -1096364930) + + W(6, 1060301769, 1051495910, 1059488668, 1059029683) + W(7, 1058265227, 1047385124, 1051401113, 1030610907) + + W(8, 1034040338, 999732421, 1034460834, 1039737374) + W(9, 1026869576, 1035505465, -1108119003, 1049444580) + + W(10, 1027334603, 1007930762, 1012148988, -1153534395) + + W(11, 1008981841, -1141674924, -1131397284, 1004145403); + sum2 = + W(0, -1094095783, 1046265071, -1105766507, 1052972269) + W(1, -1118583019, 1048411623, -1102184915, 1063609884) + + W(2, 1071341959, 1041114835, -1093757522, -1096593198) + + W(3, -1091593516, -1091154406, 1057911473, -1073590228) + + W(4, -1106266089, -1087794787, 1036032273, 1065807667) + + W(5, -1120668367, -1098744738, -1101075731, 1041493985) + + W(6, -1079612356, -1090342602, -1097206613, 1072329002) + W(7, 1052074546, 1035089459, 1053464489, 1066861510) + + W(8, -1096220802, -1119797941, -1100480279, -1091841958) + + W(9, -1107977625, 1049018868, -1101117382, -1098841365) + + W(10, 1053270877, -1103321092, 1044676561, -1113258696) + + W(11, 1022355226, -1099949977, 1048742227, -1096064815); + WS(-1073583387, -1097642521); + sum1 = + W(0, -1113793830, 1025630043, 999171711, -1113970392) + W(1, 1041107242, -1126372055, 1019259188, -1141619744) + + W(2, 1040986278, 1018743169, 1043520539, -1126196031) + W(3, -1117788829, 1023908016, 999617264, 997975216) + + W(4, -1123577624, 1051202676, -1085714085, -1137921726) + + W(5, 1058609607, -1120709796, 1049515695, 1048163249) + W(6, 1026212810, -1107655120, 1058537807, -1102760649) + + W(7, -1084066799, 1038867522, -1105494638, -1113662887) + + W(8, 1031641306, 1015332695, -1102186706, 1042214156) + W(9, 1050734989, -1104026556, 1038371877, -1118473257) + + W(10, -1117606078, 1026666645, 999394704, -1098706922) + + W(11, 1028174279, -1105230460, -1131430066, -1117999154); + sum2 = W(0, 1020465344, -1122047285, -1132946638, 1029560286) + + W(1, -1137208000, 1032274109, 996568996, -1139618609) + W(2, -1114187457, 1035498840, 990134284, -1105572872) + + W(3, -1125836673, -1107008827, -1143550666, -1133886920) + + W(4, 1042661620, -1112200610, 1050532943, 1053825241) + + W(5, 1035380426, 1041934457, -1132156656, -1115627477) + + W(6, -1108558660, 990338200, -1098817485, 1046181371) + + W(7, 1052951690, -1099854916, -1101729420, -1120597401) + + W(8, 1022323488, 1037081003, -1116108394, -1112231866) + + W(9, -1098433232, -1115059895, -1106305341, -1145950712) + + W(10, 1024517966, -1114108748, 1033071181, 1024966834) + + W(11, 1018142458, -1114933005, 1025004711, -1129654551); + WS(1066138518, -1093674260); + sum1 = W(0, 1029114768, 1016625343, 1023256234, -1135602902) + + W(1, -1154917052, -1126509217, -1119361423, -1120895465) + + W(2, -1096639483, -1107076945, -1097327813, -1112968866) + + W(3, 1039946769, -1145778087, 1040195377, 1035798312) + W(4, 1057895286, 1046373881, 1060592282, 1048700903) + + W(5, -1102042589, -1102212410, -1110743776, -1096085673) + + W(6, -1095967018, -1098130813, -1090692519, -1096019117) + + W(7, 1052511498, 1050590801, 1037092318, 1054517602) + W(8, 1030209323, 1027610352, 1010824623, -1147523994) + + W(9, -1107963320, -1106421308, -1114290095, -1103975991) + + W(10, -1115838467, 1036809869, -1116997111, 1034515722) + + W(11, 1025259308, 1031910367, 1015369596, 1032370884); + sum2 = + W(0, 1020680083, 1026207298, -1114338038, 1034412140) + W(1, -1119552802, -1132183796, 1014438782, 1026463590) + + W(2, -1098235374, -1129289080, 1035819795, 1034843888) + + W(3, 1030579314, 1031435954, -1118921036, -1110299389) + + W(4, 1040052819, 1000882372, -1104532064, -1096717996) + W(5, 1025849568, -1126927262, 1034356940, 1043556407) + + W(6, 1039185699, 1041518935, 1060121453, -1098039050) + W(7, -1085068698, -1105751584, 1039772175, 1060018227) + + W(8, -1105651771, -1108930987, -1132043948, 1059664416) + + W(9, 1064006582, -1108966794, -1090790505, -1083675102) + + W(10, 999965284, 1025606660, -1127194998, -1123799241) + + W(11, 1020099573, -1130436386, 1040432622, -1098649260); + WS(-1098394199, 1021768394); + sum1 = + W(0, -1106976773, 1030592418, -1109895628, 1031813276) + W(1, -1114022359, -1124672038, 980431986, -1118216524) + + W(2, 1047476460, -1106379994, 1041629170, -1108680996) + W(3, 1028771909, -1123109432, 1035760915, 1039049769) + + W(4, 1035645360, 1042879449, 1052123789, 1053022447) + W(5, -1107385030, 1044862779, 1023833154, 1040198899) + + W(6, -1107202165, -1121922344, -1091385002, -1090269731) + + W(7, -1107044710, -1127679127, -1107740288, -1099192133) + + W(8, -1121988294, 986778214, 1042582852, 1042227034) + W(9, 1044112989, -1115617842, 1030134009, 1025832513) + + W(10, 1008308247, -1140215924, -1120193402, -1127396653) + + W(11, 973525940, -1139398721, 1014367554, -1116507498); + sum2 = W(0, -1098169790, 968544056, -1162122654, 1056997121) + + W(1, 1029158812, -1112228820, 1026696161, -1112296199) + + W(2, 1055345266, 1027898732, 1053687424, -1077105818) + W(3, 1039110353, 1037144043, 1022799116, 1042942743) + + W(4, -1106123518, 1021773530, -1089212318, 1068095045) + + W(5, -1090252350, -1124556656, -1130232224, -1104975561) + + W(6, 1039932359, 1036378047, 1035540057, -1098361429) + W(7, 1000425352, 1050038066, -1118055459, 1040445489) + + W(8, -1111072353, -1123343911, -1111121590, 1044527270) + + W(9, -1115281069, -1114307158, -1116705210, 1023167430) + + W(10, 1012808524, -1132858861, 1037852727, -1103837325) + + W(11, 1036594354, -1134065606, 1032061348, -1114916168); + WS(1064984812, 1025677564); + sum1 = W(0, 1043884023, 1030924649, 1038396303, 1036152448) + W(1, 1017544939, 1042241831, -1121467129, 1047065797) + + W(2, -1096329284, 1033742216, -1101734196, -1105624932) + + W(3, 1017123640, -1108991823, 1037154774, -1096026219) + + W(4, -1084712758, -1103101243, -1087209573, -1086845720) + + W(5, -1084903475, -1087299343, -1108220133, -1087523701) + + W(6, 1057726586, 1046959260, 1057188432, 1061206275) + W(7, 1060371326, 1055419738, 1041931586, 1055087388) + + W(8, 1043356655, 1018532660, 1046520365, -1114153679) + W(9, -1111584053, 1028245989, 994164350, 1051664559) + + W(10, 1012739123, -1131015624, 1002161670, 1044816791) + + W(11, 1024962678, 1043667629, -1114955616, 1040331724); + sum2 = W(0, 1043159502, -1105699647, 1038273264, 1032147900) + + W(1, 1048938986, -1106879197, -1128156680, 1049056829) + + W(2, -1104158106, 1050222709, 1025130152, 1032288328) + + W(3, -1103450106, -1110143950, -1098742781, -1091104362) + + W(4, -1085409392, -1090385012, -1106188919, 1061149199) + + W(5, 1050752016, 1049612036, 1057886527, -1095713225) + W(6, 1067096435, -1106627676, 1052171093, 1075677902) + + W(7, 1075039778, 1073503496, 1075355126, 1082426924) + + W(8, -1090972778, -1102151020, -1086083449, -1070862987) + + W(9, -1070168511, -1072257998, -1070483864, -1070643407) + + W(10, -1098664617, 1050757442, 1039140273, 1030992941) + + W(11, 1040257314, 1041175752, 1030488248, -1098188298); + WS(-1072457547, -1104871915); + sum1 = + W(0, 1018087532, 1014551830, -1143311830, 1031881454) + W(1, 1033102921, 1020957612, -1158925470, 1015585054) + + W(2, -1138749297, 1036550950, 1001512248, -1098112129) + + W(3, -1104222042, -1104597767, -1125431314, 1042534317) + + W(4, -1129333765, -1131367952, -1083142279, 1014989673) + W(5, 1059974718, 1057969217, 1048954301, 1043242379) + + W(6, 983826087, 1050222745, 1055877542, 1020808474) + W(7, -1086706094, -1096646942, -1105443081, -1106542638) + + W(8, 1026100589, -1118152278, -1106883828, 1016760626) + W(9, 1045231050, 1040528910, 1027306868, -1120756612) + + W(10, 1007352484, -1123482688, 1034580622, -1109491581) + + W(11, -1122062610, -1114916930, -1147978606, -1122581117); + sum2 = + W(0, -1120473304, -1112539216, -1132295147, -1099708049) + + W(1, -1120301365, -1106531527, -1119309605, -1165429700) + + W(2, 1034530006, 1032795060, 1046686841, 1054832981) + W(3, -1109933894, -1089566811, 1004612697, -1105741108) + + W(4, -1151412702, 1009244103, 1037608248, 1050403530) + W(5, 1051005406, -1106362502, -1114169666, 1026755208) + + W(6, -1124099243, -1115907580, 1020085733, 1033863239) + + W(7, -1107650300, 1030750625, -1130967605, -1146151019) + + W(8, 1026058392, -1114805763, -1120554932, -1154011810) + + W(9, 1036477609, -1122049677, 1028389062, 1026996282) + W(10, -1131120105, 1025202928, 998829429, -1131382687) + + W(11, 1020773937, -1143352615, -1142800679, 1016610669); + WS(1057548396, -1118860492); + sum1 = W(0, 1024314991, 1015464700, 1033090170, 1024068436) + W(1, 1023937802, 1007695803, 1026830221, -1142835770) + + W(2, 1024521628, 1035643506, 1022826491, 1044765945) + W(3, 1040253828, 1032416458, 1031527745, 1041535598) + + W(4, 1019907062, 1035362560, -1102305323, -1077384746) + + W(5, -1095947197, -1110302756, -1110046895, -1106773417) + + W(6, -1109277847, 1033181378, 1038789717, -1093016121) + W(7, 1047039772, 1032628147, 1032291149, 1038601945) + + W(8, 1042186208, 1019936830, 1047455161, 1050623422) + W(9, 1039235079, 1012944520, 1025595072, 1031404576) + + W(10, -1127185475, 1015346289, 1015056043, 1035221881) + + W(11, 1019339797, 1030260028, -1124358344, 1039118899); + sum2 = W(0, 1028948662, -1108748842, 1035054379, -1114955281) + + W(1, -1123628391, 1033670708, -1113438145, 1009774019) + + W(2, -1119520873, 1035535229, 1034598190, 1040844095) + W(3, 1017632867, 1028317650, -1152158269, 1033306906) + + W(4, 1040692087, -1128105382, -1105801492, 1058969109) + + W(5, -1140061979, -1098716294, -1100355456, -1097137530) + + W(6, -1099276378, -1125068566, 1046560183, 1035247795) + W(7, 1037021603, 1041621971, 1042440154, 1045186907) + + W(8, 1042585669, -1119570187, -1104135640, -1104363062) + + W(9, -1119904127, -1109815486, 1033417138, -1096381982) + + W(10, -1108959122, -1105777938, 1040780747, -1115696651) + + W(11, -1122498951, 1039115990, -1102421790, 1043903068); + WS(-1111617372, -1089239798); + sum1 = W(0, -1120946745, 1043411666, -1105344783, 1034980559) + + W(1, 1035032490, -1102176538, 1042691462, -1106084756) + + W(2, -1109363280, -1105933140, -1122482989, -1097138762) + + W(3, 1028445691, 1038047807, -1104930291, 1036625252) + W(4, 1036859267, -1100282243, 1033736099, 1040067055) + + W(5, -1085774908, 985367106, -1095561837, -1105930796) + + W(6, -1107333692, 1036658471, -1096910672, 1063625005) + W(7, 1059841631, 1050659758, 1056206133, 1039222942) + + W(8, -1131126919, 1046725686, -1138971218, -1100591479) + + W(9, -1101046354, -1099856795, -1114722211, 1033845467) + + W(10, 1028471724, -1102252305, 1048148056, -1115573502) + + W(11, 1018704810, 1038410359, -1104725204, 1032806392); + sum2 = W(0, 1032901751, -1107914664, 1029069579, 987500422) + W(1, -1107918292, 1041931397, -1106970712, 1026585516) + + W(2, -1102980188, 1034775565, -1107463876, -1115674720) + + W(3, -1122769714, 1028640927, -1133982193, -1112107626) + + W(4, -1097455677, -1079544271, -1107584024, 1066142773) + + W(5, 1049477386, -1110827944, 1040943686, 1033119735) + W(6, 1019096213, -1123759676, 1039965269, 1060530292) + + W(7, 1039765158, -1133849713, -1110406142, -1129682772) + + W(8, 1032175116, -1101940532, 1028816201, 1036298034) + + W(9, -1100641824, 1041944181, -1113302080, 1007346649) + + W(10, -1112661460, 1048109574, -1102645998, 1048822254) + + W(11, -1106440053, -1113520406, 1032469881, -1114426196); + WS(1055684951, -1075449937); + sum1 = W(0, 1025203701, -1109225282, -1105594014, -1102495686) + + W(1, -1115277256, -1131312361, 1003392922, -1119401549) + + W(2, 1021145317, 1041132226, 1045336591, 1048290762) + W(3, 1046212734, 1033816821, 1042625602, 1032304674) + + W(4, -1089325052, -1098148265, -1089314051, -1085251962) + + W(5, -1086898788, -1089905605, -1090587428, -1086086859) + + W(6, 1050955910, 1048074946, 1059061644, 1063401377) + W(7, 1058388246, 1057949871, 1049257380, 1056447675) + + W(8, 1044060206, -1122722677, -1138312640, -1135340574) + + W(9, -1108206354, 1012872015, 1013091209, 1030899626) + + W(10, 1023449767, -1117792831, 1024771419, 1034487612) + + W(11, -1122363216, 1023079171, -1119440554, 1029355212); + sum2 = W(0, 1061277558, 1070915797, 1077465728, 1077005703) + W(1, 1067272551, 1035834095, -1140563054, -1101597023) + + W(2, -1075680192, -1078675502, -1072669743, -1071891757) + + W(3, -1079654744, -1094224921, -1124876273, -1106967769) + + W(4, 1064394375, -1099840736, -1080083122, -1110541808) + + W(5, 1034295344, 1034313258, 1044374977, 1056268760) + W(6, 1041412946, 1036217426, 1053075748, 1035413026) + + W(7, -1098463344, 1050839735, 1012713199, 1033733408) + + W(8, -1097187807, 1041322393, -1098777830, -1105806062) + + W(9, 1042040059, -1099205009, 1043077130, -1097742853) + + W(10, 1043650757, -1128025338, -1113957037, 1028555409) + + W(11, 1035679275, -1113787473, 1015942004, 1036121231); + WS(-1084991020, -1093321377); + sum1 = W(0, -1124603198, 1020905181, 1034567442, 1033810210) + W(1, 1026468027, 1034346016, 1012576759, 1040898454) + + W(2, 1041431403, -1106261797, 1012534679, -1100435893) + + W(3, -1113177704, 1029015460, -1109083497, 1045957208) + W(4, 1058092855, 1050746614, 1060858482, 1063338984) + + W(5, 1057782107, 1050350895, 1047981412, 1051078083) + + W(6, -1087194206, -1093664550, -1086211050, -1081371861) + + W(7, -1091610836, -1090363161, -1099126963, -1088769118) + + W(8, 1031898965, 1020373118, 1037199077, 1028138434) + W(9, 1041359812, 1026545296, 1017607178, -1114891854) + + W(10, 1027465426, 1019387090, 942151344, -1130539845) + + W(11, 1019123574, 1032894586, 1018549369, 1024075622); + sum2 = + W(0, 1049096145, 1050639335, 1060252300, 1068716746) + W(1, 1070836883, 1071114171, 1069477538, 1068968491) + + W(2, -1096421724, -1100344181, -1085369111, -1076762820) + + W(3, -1073687271, -1075542147, -1076870984, -1078719402) + + W(4, -1104462777, 1044471716, -1101216805, 1050347336) + W(5, 1052234046, 1009296899, 1047758574, -1114781860) + + W(6, 1019605429, 1054069324, -1124780213, 1025609425) + W(7, -1096692411, 1043747806, 1026561745, 1035243068) + + W(8, -1107039596, -1112798845, 1041817400, -1099054195) + + W(9, 1029953841, 1030832137, -1135279155, -1140937749) + W(10, 1039363330, -1113551308, 999612981, 1018249637) + + W(11, 1028531297, -1109453871, 1027426027, -1125031723); + WS(-1082530796, 1061926473); + sum1 = W(0, -1111745736, 1030277984, -1123296661, 1039021467) + + W(1, -1130604760, 1012520514, -1112767704, 1017586258) + + W(2, -1107298323, -1127531019, -1109831840, -1118701125) + + W(3, -1101933527, -1114851579, 1016124742, -1131932512) + + W(4, 1048819916, 1039611697, 1058045501, -1099048749) + W(5, 1052265202, 1034215157, 1037161440, 1010862879) + + W(6, 1033356744, -1113172467, 1035918242, -1088898044) + + W(7, -1125679275, 1029808585, -1110952702, 1040689749) + + W(8, 1034157517, -1127895905, -1146238814, -1099659681) + + W(9, 1032846000, 1005542493, 1024904046, -1114167271) + + W(10, -1119982339, 1009757802, -1125062126, 1039341706) + + W(11, -1111731430, 1016627083, -1137100912, -1130467695); + sum2 = W(0, -1123675689, 1025856461, -1129839981, 1039506778) + + W(1, -1111122039, -1108253250, 1042547871, 1023517501) + + W(2, 1027790609, -1115257125, 1041635489, -1087170514) + + W(3, 1054414527, 1040911707, -1107819629, -1119501461) + + W(4, -1107220732, -1103597907, -1083432255, 1074899174) + + W(5, -1087814585, -1119836905, -1108795814, -1120345851) + + W(6, -1138688370, 1036222096, -1099581339, 1052206445) + W(7, 1033877978, 1035305654, 1040418607, 974999585) + + W(8, -1114685917, -1104487390, -1113019592, -1103205528) + + W(9, -1114160943, -1128600489, -1113593105, -1136105250) + + W(10, -1131813881, -1138958066, 1015980625, 1015820001) + + W(11, 1023501105, -1135082354, 1028405761, 1023691837); + WS(1064809580, 1026007555); + sum1 = W(0, -1117346201, 1012678303, -1112794575, 1024755966) + + W(1, -1119597108, -1109792204, 1039580268, -1109340249) + + W(2, -1139810490, -1117193870, 1032058104, -1127734554) + + W(3, 1040786347, -1106953519, -1120656619, -1123630216) + + W(4, 1018638922, 1041509643, -1089321581, -1106321711) + + W(5, 1042250009, -1136225478, -1140389406, 1031754384) + + W(6, 1046259126, -1116046893, 1058768682, 1057441571) + W(7, -1088983804, 1052663642, 1033398978, 1030125211) + + W(8, -1110265860, -1107022182, 1049529906, -1097674775) + + W(9, 1052962187, -1105006210, -1138416249, -1114619763) + + W(10, -1107316166, 1042684025, -1107194416, -1115653262) + + W(11, -1115453338, -1104239151, 1026892022, -1113265368); + sum2 = + W(0, 1002173025, 1022454821, -1114052781, 1026488668) + W(1, 1024785122, -1114947733, 1041552522, -1114686018) + + W(2, -1126476274, -1112202702, 1040267060, -1105276944) + + W(3, 1041996701, 1024974628, -1106672600, 1014734543) + W(4, 993251281, 1027055467, -1106967376, 1037292044) + + W(5, 1032247852, -1103384730, 1024347316, 1038837578) + W(6, 1035289805, -1110248161, 1050537246, -1103163514) + + W(7, 1036995069, 1044720036, -1136575544, 1011597497) + W(8, 1026092616, -1106697397, 1051631259, -1119693560) + + W(9, 1026699348, -1113586574, 1012871948, -1113050536) + + W(10, -1119256919, 1035602798, -1119463370, -1109176262) + + W(11, -1123291766, -1103668424, -1104716490, -1124038001); + WS(1065652022, 1032044813); + sum1 = + W(0, 1008146233, -1138253430, -1111490857, 1034343482) + W(1, 1027957290, 1037589943, 1035138662, -1130048270) + + W(2, 1024151812, 1033154018, 1037025524, -1098142828) + W(3, -1093711910, 1019326054, -1137243780, 1033030167) + + W(4, -1109382253, -1111423088, -1089787453, 1056996567) + W(5, 1064926206, 1020462798, 1028825917, 1017317515) + + W(6, 1046726755, -1114751985, 1060185520, -1102691401) + + W(7, -1084615165, -1096112169, -1123985530, -1105819364) + + W(8, -1118504831, 1030270670, -1108385813, 1034117937) + W(9, 1042611828, 999245356, -1106962907, -1131349303) + + W(10, -1145994760, 1011776865, 1031075253, -1115595081) + + W(11, -1141498448, 1030480467, 1020535720, -1161641125); + sum2 = W(0, 1006780909, 1032029355, 928839112, -1118040285) + W(1, -1112805367, -1105940221, 1025941308, 1031169874) + + W(2, 1018874621, -1106542042, -1114343998, -1106692361) + + W(3, 1043467647, 1041450718, 1036583459, -1106475204) + + W(4, -1118402441, -1123089851, -1111882995, 1057618964) + + W(5, -1114692462, 1035656455, -1122657152, -1181112366) + + W(6, -1125742470, 1042324218, -1150379126, 1059562898) + + W(7, -1124030112, -1096899429, -1115452253, -1108009053) + + W(8, 1022906649, 1032351097, 1030201786, -1096401122) + + W(9, -1101041619, -1105376866, 1025207396, -1117532473) + + W(10, 1002124531, -1127943559, -1112138839, 1036092239) + + W(11, -1119061832, 1038704957, -1115257437, 1040262599); + WS(1060219372, -1086892801); + sum1 = W(0, -1103145773, 1041685441, -1114046300, -1105288038) + + W(1, 1036049319, -1105447101, -1153064218, 1037687846) + + W(2, 1039153858, -1139059104, -1139626983, 1051743245) + + W(3, 1005204005, -1096900831, 1006778518, -1097346218) + + W(4, 1051640744, -1111094658, 1060139625, 1048845947) + W(5, 1056234019, 1058595229, 1030114274, 1052830405) + + W(6, -1098525574, -1114399172, -1105262039, -1084251893) + + W(7, -1132035760, -1097183901, -1095492788, -1105878061) + + W(8, -1104573181, 1034492410, -1112320535, 1048366229) + + W(9, 1045757805, -1102598303, 1044243314, -1114955456) + + W(10, 1018968139, -1114173214, -1114750605, -1119683574) + + W(11, -1113866359, -1132035040, 1021887633, -1107291810); + sum2 = + W(0, -1116149857, -1115656995, 1030898684, -1101937257) + + W(1, -1172884346, -1108962642, -1122887710, 1035380843) + W(2, 1025241726, 1004099725, 1025926274, 1029996270) + + W(3, 1015423640, -1098527410, -1102965987, -1099100919) + + W(4, -1099180395, -1094029030, 1029208805, -1093188603) + W(5, 1043486640, 1057927618, 1033678913, 1054675670) + + W(6, 1043244905, 1042198638, 1050305603, 1051892024) + W(7, 1010118001, -1111697287, -1106879588, -1115267941) + + W(8, -1108018378, 1030698655, -1105752531, 1032179392) + + W(9, 1042453668, -1110311603, 1043859461, -1124505249) + + W(10, 1036684654, -1113978987, 1030311314, -1143836228) + + W(11, -1107174775, 1032971351, -1114814873, -1114563702); + WS(1054285911, 1050558006); + sum1 = W(0, -1123510162, -1131523010, -1131464621, 1019709806) + W(1, 1029482925, 1019519396, 1008876867, 990268585) + + W(2, 1038924416, 1041880394, 1042834130, 1022473868) + + W(3, -1100861061, -1099456110, -1103795177, 1023983666) + + W(4, -1103298920, -1093800836, -1095165898, 1057683379) + + W(5, 1065493943, 1059660975, 1052993120, 1049686449) + W(6, 1049975562, 1050884477, 1056805171, -1101108530) + + W(7, -1084744157, -1084827161, -1096422344, -1102767109) + + W(8, -1107117058, -1103773453, -1101616339, -1121085405) + + W(9, 1044641696, 1037612741, 1041661496, -1112995616) + + W(10, -1132690963, 1013663344, 1008580322, -1112183179) + + W(11, -1107880231, -1118057053, -1120002940, -1125681410); + sum2 = + W(0, -1122499415, -1135750526, 1025808744, 1004729468) + W(1, 1038371609, 1025309219, 1037233345, -1107252608) + + W(2, -1115660402, -1103885919, -1107570715, -1109043837) + + W(3, -1101018403, -1106866200, -1100735475, 1049544712) + + W(4, 1019721643, -1163427536, 1050733408, 1068391994) + W(5, -1088555463, 1029079067, 1034253450, -1147071004) + + W(6, 1052675919, -1111228057, 1050715774, 1068640266) + + W(7, -1109791041, -1082318320, 1048468038, -1092391889) + + W(8, -1134010714, -1097257542, -1097200131, -1098019427) + + W(9, -1104872484, -1103711089, -1096395820, 1032346912) + + W(10, -1107636671, 1043515230, -1113330231, 1035061875) + + W(11, 1015805682, -1134559274, 1043601518, -1139706642); + WS(-1090663639, -1077388844); + sum1 = W(0, 1018174482, -1160081154, -1125628059, -1132569784) + + W(1, -1117916196, -1117849353, 1021610031, -1122253105) + + W(2, -1118693311, 1029100670, -1120731528, -1106887239) + + W(3, -1106415899, -1097169074, -1146324700, -1168966176) + + W(4, -1093711755, -1098783931, -1088582516, -1095941442) + + W(5, -1087125152, -1094690684, -1097735927, -1093052224) + + W(6, 1049109025, 1046071575, 1052420297, 1068562223) + W(7, 1064382514, 1058209900, 1048904111, 1056110513) + + W(8, 1040639418, 1021012498, -1106387497, 986381179) + + W(9, -1096200966, -1116837948, 1025702951, -1121509238) + + W(10, 1010315758, -1115518041, -1181480889, 1034527238) + + W(11, 974332196, 1015836076, -1123641014, 1025570188); + sum2 = W(0, 1034436941, -1113720588, 1024698569, -1106229774) + W(1, 1036635696, 1046234567, 1052080385, 1034351318) + + W(2, -1094381136, 1042206203, -1096498964, -1082651758) + + W(3, -1065300211, -1070759890, -1090746117, -1089089289) + + W(4, 1032181918, 998633097, 1057336919, 1076874404) + W(5, 1081990850, 1049370102, -1114040834, 1035723536) + + W(6, 1038416019, -1112936962, 1044225483, 1035551973) + W(7, 1041430251, 1045207615, 1038285588, -1119691531) + + W(8, -1157362266, 1041189037, -1114037642, 1029476436) + + W(9, 1035032611, 1036601034, -1115422836, -1130950394) + + W(10, 1040127243, -1108577062, -1122557473, 1033287923) + + W(11, 1024588020, 1015731519, -1155116306, 1031958369); + WS(-1080363926, -1071486509); + sum1 = W(0, 1035667824, -1106562756, 1048836261, -1099668353) + + W(1, 1041756943, 1034350288, -1111757455, 1036008540) + + W(2, -1117755862, -1102851061, 1026770536, -1096598034) + + W(3, -1111989629, -1117155588, -1106686285, -1110305168) + + W(4, 1058850627, 1044522508, 1060900423, 1062774732) + W(5, 1060314417, 1058954340, 1047827972, 1058323473) + + W(6, -1089812638, -1098855847, -1094273901, -1081351512) + + W(7, -1091724133, -1097309107, -1089979637, -1097705308) + + W(8, -1119781738, -1124105919, -1136163052, 1019768789) + + W(9, 1036217472, 1034476769, 1034808863, -1112569431) + + W(10, 1033333673, -1122920906, 1034167779, -1100720585) + + W(11, 1023569595, 1037864032, -1108224543, 997120104); + sum2 = W(0, -1130221439, 1039521143, -1106623296, 1040812416) + + W(1, -1108121630, 1011405671, 1024610419, -1120568012) + + W(2, 1026473921, 1040027805, -1103850305, 1044422007) + W(3, 1033782288, -1112409330, 1042204829, 1007920671) + + W(4, -1098631230, 1049962270, -1102633929, 1053913409) + + W(5, 1041179127, -1118313372, 1033589003, -1105557487) + W(6, 1059210683, 1037922688, 1032319554, 1075309200) + + W(7, 1051007822, -1114991064, 1064519547, 1041664007) + W(8, 991949852, -1128609979, 1032322677, -1093367457) + + W(9, -1128820939, 1042490244, -1108707286, -1108726636) + + W(10, -1088875775, 1043008084, -1081254616, -1078110278) + + W(11, -1087823621, -1085620101, 1038944538, -1097283302); + WS(-1085146860, -1078432897); + sum1 = + W(0, 1000247468, 1037132754, -1107087079, 1043827999) + W(1, -1105171356, 1034542459, -1139389265, 1019250012) + + W(2, -1149696569, -1105005939, 1047641075, -1094624073) + + W(3, 1038438012, -1098392071, 1037791108, -1111893867) + W(4, 1046594056, 1049101493, 1036712721, 1056540903) + + W(5, 1056427897, 1052522438, 1039493090, 1053002294) + W(6, -1105608437, -1092242085, 1034057408, -1091288646) + + W(7, -1092984875, -1099696227, -1123704450, -1096292923) + + W(8, 1029982264, 1035020227, 1000135432, -1097712673) + W(9, 1048401189, -1113847620, 1041969240, -1109486882) + + W(10, -1128935441, -1114749360, 1041253327, -1098691603) + + W(11, 1031740017, -1124493285, 1035876258, -1117863020); + sum2 = W(0, 981650725, -1123188651, -1132394336, 1019312288) + W(1, 1007032529, 1019035800, -1139057577, 994405618) + + W(2, 1022634928, -1141995321, -1159373413, 1040593594) + + W(3, -1125839148, -1144628769, -1130558040, 996479090) + + W(4, -1122722467, 1043118137, -1111962066, -1085264893) + + W(5, 1035586791, 1030456162, 1025167346, -1121727683) + + W(6, -1134931805, 1038372119, -1088039805, -1062981933) + + W(7, -1088420516, 1033594923, -1132235322, -1141102409) + + W(8, -1114801830, -1108690895, 1059960197, 1086226578) + + W(9, 1052041256, -1121903247, -1127116104, 1010205301) + + W(10, 1035155349, -1113558499, -1123558064, -1122982849) + + W(11, 1041973847, -1112866008, 999416881, 1015327588); + WS(1065314092, 1028007882); + sum1 = + W(0, 1031315399, 1009229913, -1129846167, 1030512684) + W(1, 1027211107, 1024491495, -1133667543, 1020076159) + + W(2, -1118910333, 1044274103, 1040482617, 1028502523) + W(3, -1098008831, -1114626726, 1030034106, 1035646611) + + W(4, -1110071882, -1091088835, -1081937298, 1057125791) + W(5, 1063505604, 1056913060, 1045615294, 1046315392) + + W(6, 1027958726, 1049048403, 1058342964, 1041882615) + + W(7, -1081007746, -1094994912, -1103714125, -1120947018) + + W(8, -1132049297, -1098774521, -1097400260, -1128387300) + + W(9, 1042307230, 1046624506, 1018202602, -1116178789) + W(10, 1030345978, 1015648546, 1033820695, -1123750794) + + W(11, -1119357859, -1108219417, 1021380405, -1113806211); + sum2 = W(0, -1105494348, 1042860341, 1034523914, 1032509803) + + W(1, 1037500440, -1136462181, -1115571726, 1030953968) + + W(2, 1051114204, -1095282678, -1099570184, -1092355888) + + W(3, -1093487707, -1101634066, 1038218158, -1144657738) + + W(4, -1106549278, -1095274416, -1097084890, 1068351366) + + W(5, 1045336627, -1093371043, 1025607496, -1098135458) + + W(6, -1106413411, -1115620988, -1100406176, 1061966336) + + W(7, 1064976080, -1095768559, 1051011462, -1103066203) + + W(8, 1026636954, 1032482885, -1103782738, -1111829172) + + W(9, -1099957245, 1011878641, -1122142689, 1046841453) + + W(10, -1101805730, -1123651604, 1033985372, 1041181693) + + W(11, -1105149847, 1041978329, -1106959075, 1034424520); + WS(-1100053422, 1042143034); + sum1 = + W(0, -1121193300, 1027006179, -1116784408, -1124403186) + W(1, 1032959000, 1036096698, -1106874909, -1140087089) + + W(2, 1038907933, -1101648146, 1051061595, -1096312949) + W(3, 1021329739, -1104405590, 1032316755, 1026338531) + + W(4, 1037214192, 1052804861, -1092953078, 1063691363) + W(5, 1057610578, 1046101531, 1033832353, 1044117027) + + W(6, -1104157285, -1116788520, -1115727182, -1094770533) + + W(7, -1085255924, 1032460934, -1101777344, -1123976854) + + W(8, 1003265009, -1105088109, 1044603252, -1110178331) + + W(9, 1042273837, -1099699080, 1042741769, -1110400285) + + W(10, 927491180, 1036085839, -1112320669, -1132796507) + + W(11, -1129217311, 1029210945, -1111566277, 1023324661); + sum2 = + W(0, -1141740532, -1141563308, -1146742484, 1037326381) + W(1, -1100634945, -1112991637, 998071241, 1028661660) + + W(2, -1127364827, -1115378106, -1097895309, -1089066292) + + W(3, 1074712949, 1036278807, 1023404119, 1032269699) + W(4, 1016858659, 1014774982, 1061549017, -1086943216) + + W(5, -1081904953, 1016249563, -1104500239, -1118089334) + + W(6, 1019476887, 1033910688, -1098904537, -1087533486) + W(7, 1051894188, -1105464222, 1039001405, 1002948788) + + W(8, 1027610232, -1098709711, 1048121474, 1044386108) + W(9, 1035948687, 1034738839, -1111082062, 1032376859) + + W(10, -1114104878, 1038463125, 1009723338, -1128378528) + + W(11, -1114075451, 1023041183, 1028418264, -1116656881); + WS(1064553004, -1122811923); + sum1 = + W(0, -1129171987, 1032276908, -1113233767, 1041762428) + W(1, -1110071667, 1027123610, -1123823416, 1026480898) + + W(2, 1031404000, -1105326008, 1049333812, -1095271692) + + W(3, 1021654775, -1101813124, 1034262350, -1114787413) + W(4, 1045766677, 1049463355, 1036005443, 1059787495) + + W(5, 1057980603, 1052117804, 1041561742, 1051913520) + W(6, -1102182210, -1094389820, 974120215, -1088583546) + + W(7, -1092394330, -1097358280, -1111517243, -1097569834) + + W(8, 1024429036, 1026361994, 1035186995, -1095666629) + W(9, 1048809333, -1132328890, 1043990330, -1107060706) + + W(10, -1144455651, -1121595412, 1034062296, -1100003363) + + W(11, 1024774373, -1125809241, 1035275874, -1116630377); + sum2 = + W(0, 1027128731, -1153474964, 1032141903, -1114194268) + W(1, 1010972171, -1128303982, 1020076945, -1125252319) + + W(2, -1118374135, 1014938475, -1106631533, 1049333862) + + W(3, -1117272233, 1026850075, -1130317298, 1023253865) + + W(4, 1034513610, -1107487108, 1042187602, -1091768288) + W(5, 1029258819, -1112584656, 1019094573, 1030375545) + + W(6, -1123174378, -1123472496, 1054134699, 1082046784) + + W(7, 1048672371, 1015595275, -1143083862, -1112246350) + + W(8, 1026835315, 1026726549, -1092438474, -1066065893) + + W(9, -1108402828, -1129520676, 1012988295, 1033146096) + + W(10, -1114420605, 1026647445, 1008281595, 1032174407) + + W(11, -1107223380, 1020663133, 1016020771, -1120189048); + WS(1066855734, -1119441794); + sum1 = W(0, -1127562022, -1123770274, -1115364812, -1108591004) + + W(1, -1109630903, 1012450637, -1111453929, -1112819014) + + W(2, 1039804281, -1106380690, 1049486942, 1052921753) + W(3, 1002857256, 1049080999, -1123146086, 1045715313) + + W(4, -1090674092, -1096623933, -1088928155, -1086271011) + + W(5, -1088126629, -1098448030, -1095526376, -1090620137) + + W(6, 1057948125, 1041520634, 1058254390, 1066610309) + W(7, 1047590014, 1058670697, 1020669183, 1057080301) + + W(8, -1113289318, -1102744925, -1126493725, -1125400685) + + W(9, -1097419497, 1027654745, -1103558716, -1122765265) + + W(10, 1040603681, -1104646487, 1030330554, 1047144630) + + W(11, -1118729135, 1040353710, -1110153949, 1038000005); + sum2 = + W(0, 1029773001, -1098400772, 1049403575, -1106957817) + W(1, 1040180418, -1125940042, -1121768997, 1035657430) + + W(2, 1045848843, -1098127734, 1040542896, -1113384065) + + W(3, -1098054809, 1051521525, -1098090743, 1035815778) + W(4, -1100354950, 985414438, -1094506611, 1065317808) + + W(5, -1102424534, 1038107076, 1030043463, -1104826760) + W(6, 1042255280, -1114969170, 1044461531, 1063282493) + + W(7, -1111953320, 1052337139, -1098581045, 1052586351) + + W(8, 1031741567, -1101857955, 1033605854, -1099888837) + + W(9, -1148110913, -1125555808, 1034608926, -1105779304) + + W(10, -1106457511, -1121665039, -1106685198, -1090380876) + + W(11, -1097784009, 1010307405, -1105861523, -1121200133); + WS(1024108216, 1053619151); + sum1 = + W(0, -1110237276, 1036125123, -1105593599, -1116690717) + + W(1, -1138403916, -1118424632, -1118568038, -1117554448) + + W(2, -1117217830, -1104025987, 1053313098, -1107833238) + + W(3, -1112296045, -1108171422, 1025019530, -1113883668) + W(4, 1029541828, 1035829669, 1040682969, 1058976450) + + W(5, -1104638900, 1053496066, 997886569, 1047703644) + W(6, -1116974327, 1029841740, -1093167724, 1049118258) + + W(7, -1102593951, -1123704112, -1107943218, -1108512765) + + W(8, 1028000106, -1125285423, 1031701731, -1094097902) + + W(9, 1055269059, -1100830255, 1036129823, -1109656827) + W(10, 997960357, -1115997186, 1020700860, 1017239158) + + W(11, -1122615091, 1029941429, -1111217181, 1020926429); + sum2 = + W(0, -1119993039, 1038893624, -1105602869, -1106354535) + W(1, 1032998629, 998835515, -1119543359, 1026155597) + + W(2, -1109450011, -1096262037, 1055566572, -1158461197) + + W(3, -1117939535, -1108137959, 1037096144, -1114868339) + + W(4, 1040401784, 1053717996, 1043380434, -1105416337) + W(5, -1087999087, 1027244587, -1117843291, 1031605777) + + W(6, -1106582025, -1117988753, -1092886002, 1072933379) + + W(7, -1083385663, 1045359897, -1101171319, 1022787365) + W(8, 1033614749, 1000703247, 1034388956, -1081255560) + + W(9, 1066426555, -1093783038, 1051461624, -1100938466) + + W(10, -1147493015, -1114388777, 1043473668, 1043342555) + + W(11, -1094544057, 1045623937, -1102892249, 1041102940); + WS(1062840044, 1036517115); + sum1 = + W(0, 1027882709, -1102360361, 1037386637, 1026327034) + W(1, -1102333276, 1042539613, -1113170154, -1117867630) + + W(2, 1024218619, -1119309706, 1051294017, -1105387538) + W(3, 1045232110, 1042423170, -1107171938, 1042893141) + + W(4, -1088734638, 1031157223, -1082181941, -1087289600) + + W(5, -1089919726, -1088061047, -1126992520, -1098512042) + + W(6, 1057788973, 1045291130, 1057574554, 1064725383) + W(7, 1056789371, 1052153154, -1124580994, -1109192172) + + W(8, 1032695796, -1107257205, 1039133128, 1024151288) + W(9, -1131902346, 1045762482, -1130270357, 1047580087) + + W(10, -1105941698, 1032367183, 1015412087, -1102302982) + + W(11, 1046746652, -1110282969, -1116552186, 1032060742); + sum2 = + W(0, -1128425377, 1027402769, -1122701285, 1029460017) + W(1, -1128656941, 1015114546, -1131912907, 1012677721) + + W(2, -1106124336, -1123408727, 1035952055, -1106291502) + + W(3, 1034330078, -1137130753, -1151273092, -1141059698) + + W(4, -1106789449, 1046361983, 1033758045, -1092942672) + W(5, 1022825967, 1043050798, 1026393205, -1114857397) + + W(6, -1116881359, 1040877836, -1092736894, -1089281400) + + W(7, 1067937621, 1057367901, -1100743964, -1116376233) + + W(8, -1108203604, 1041799035, -1110885432, 1058715791) + + W(9, 1060265099, -1090127289, -1100147508, -1085394823) + + W(10, -1154187588, 1037669599, -1106801609, 1044648045) + + W(11, -1104725901, -1099584998, -1114467924, 1048436512); + WS(-1090906199, 1032077706); + sum1 = W(0, -1133027020, -1121893314, 1023318639, 1029445080) + + W(1, 1001128051, 1034316233, -1103958128, 1035906358) + + W(2, -1114971356, 1044790618, -1123234602, 1040694938) + + W(3, 1035215242, -1102125462, 1043268297, -1122145747) + + W(4, 1042474992, -1113284386, 1041326284, -1105269270) + + W(5, -1090300845, 1049843289, -1131346756, 1025511402) + + W(6, -1109782777, 1033127972, -1090554926, 1053731809) + + W(7, 1054234875, -1098556565, -1121911775, -1113919963) + + W(8, 1040233361, -1105262125, 1034823031, -1109230339) + + W(9, -1098565414, 1042417542, 1026215817, -1122686272) + + W(10, -1113511763, 1025873725, 1011115622, -1129412204) + + W(11, 1038160135, 1018477632, 1009497794, 998364239); + sum2 = W(0, 1010874613, 1031993168, -1110586713, 1035954309) + + W(1, 1034349301, -1122071401, -1140127141, 1029284667) + + W(2, 1030375188, -1098558104, -1116546039, -1089737673) + + W(3, -1094899703, 1053685859, -1108774266, -1124583674) + + W(4, -1115235366, 1051363302, 1056517150, 1057138262) + + W(5, -1098486858, -1093546729, 1034072089, -1122424073) + + W(6, 1049471257, -1094785947, 1031272431, -1102658594) + + W(7, -1112892354, 1046184196, -1109252950, 1037904141) + + W(8, -1100352469, 1040320218, -1111763071, 1043402933) + W(9, 1057577914, 1039716432, -1122970680, 958822899) + + W(10, 1040126787, -1131978284, -1124433226, 1027656919) + + W(11, -1092308561, -1116345243, 1016915650, -1140678181); + WS(1065971990, -1117349785); + sum1 = W(0, 1041698888, -1112126136, 1034826515, -1129568652) + + W(1, -1109843230, 1024013025, 1009653886, -1137279078) + + W(2, -1103591502, 1043874709, -1101299034, -1186542860) + + W(3, 1041410157, -1159955630, 1030113747, -1120752640) + + W(4, -1130045402, 1044992637, -1083999976, -1081978560) + + W(5, -1085461041, -1090063736, -1097631850, -1094129699) + + W(6, 1049080916, 1047240445, 1060703412, 1061790267) + W(7, 1058214583, 1059365054, 1049303674, 1052607100) + + W(8, 1009208654, -1121869537, -1123043996, 1028920692) + + W(9, -1105683576, 1011681824, -1125202109, 1021258909) + + W(10, 1021475879, -1134810027, -1144695867, 1017436104) + + W(11, -1131209785, -1139574520, 1000157667, 1022839599); + sum2 = W(0, -1117014919, -1130364155, -1106662873, -1114007102) + + W(1, 1049348603, -1111037227, 1016435713, 1035610526) + + W(2, -1073720352, -1086725672, 1069712606, 1062079613) + + W(3, -1102930718, 1020707077, -1114426132, 1034066723) + + W(4, -1104300581, -1091483554, 1061376514, 1060429625) + + W(5, -1098979910, -1091915359, 1043583392, -1091474650) + + W(6, 1055286111, -1109695767, -1114136197, 1052661025) + + W(7, -1131131469, 1050631696, -1112682766, -1112601210) + + W(8, -1105567211, 1032269150, -1138351682, 1018497014) + + W(9, 1032920333, -1117367449, -1122101547, 1039950258) + + W(10, -1108683793, 1033653176, -1115525434, 1043366723) + + W(11, -1107942477, -1139459182, -1122885189, 1026792554); + WS(-1087438700, -1079683283); + sum1 = + W(0, 1017584527, -1126645293, 1024510860, -1126938201) + W(1, 1025818403, -1163276521, 1040771729, -1160528892) + + W(2, -1111085935, -1110290014, 1033919541, 1049726143) + W(3, 1042036038, -1114444262, 1029908410, 1035428627) + + W(4, -1097724786, -1098381907, -1083731542, -1081500983) + + W(5, -1097215121, -1091706404, -1097070911, -1097940968) + + W(6, 1052950249, 1053593812, 1063649365, 1059087538) + W(7, 1052548297, 1057898452, 1045403069, 1052829673) + + W(8, -1112145065, -1106211842, 1003633557, 1023563130) + + W(9, 1019377518, -1104008328, -1115067299, 1032435766) + + W(10, 1032156829, -1129163939, -1118260846, -1120786763) + + W(11, -1116189667, 1023503580, -1112674412, 1015355644); + sum2 = W(0, 1027460995, -1126036613, 1029366028, -1129309981) + W(1, 1020875062, 988377354, -1109676838, 1030688918) + + W(2, -1139353737, -1172793556, 1021322407, -1097919394) + + W(3, -1121912528, 1034370211, -1137199485, -1107628664) + + W(4, -1116062036, 1041340702, 1050063273, 1055277098) + + W(5, -1106551211, 1041415105, -1128558209, -1134721053) + + W(6, -1105887481, 1031879973, -1101108606, 1009470709) + W(7, 1047064096, 1034815104, 1034836242, 1049845283) + + W(8, 1043084390, -1108443334, 1031078409, 1041616760) + + W(9, -1107655532, 1018545561, 1014245687, -1104117922) + + W(10, -1112909236, -1144584219, -1116288208, -1099143154) + + W(11, -1100042276, -1108610892, -1111876576, -1123449114); + WS(1044595630, -1081949232); + sum1 = + W(0, 1039675598, -1114551286, 1008233858, -1121252161) + W(1, 1033942172, -1122512668, 1026205083, -1118876117) + + W(2, -1112185757, 1041771076, -1113654239, 1036138408) + W(3, 1043328887, 1047911808, 1028532559, 1051948425) + + W(4, -1088266627, -1144202605, -1106609306, -1087961804) + + W(5, -1087619944, -1086197995, -1087181441, -1079365891) + + W(6, -1103352647, 1058269731, 1055957016, 1060473075) + W(7, 1062639593, 1055667963, 1042300482, 1051816684) + + W(8, 1051863744, -1102436935, 1041931682, -1105147684) + W(9, 1002098271, -1111264410, 1038991809, 1047648830) + + W(10, -1115854735, -1130126796, 1017898629, 1041818984) + + W(11, -1130413359, 1032948860, -1115140949, 1035539513); + sum2 = + W(0, 1050752765, -1102559074, 1004621594, -1106905815) + W(1, 1038134564, -1114858390, 999530010, -1104442024) + + W(2, -1087877559, 1042152886, -1095393630, -1106434273) + + W(3, -1099723068, 1036662936, -1101776331, 1054232067) + W(4, -1089125923, 1035361880, 1058416370, 1058355794) + + W(5, 1056388755, 1040360076, -1106345832, 1034476952) + W(6, 1063798323, 1052128007, 1062325475, -1120474523) + + W(7, 1051681161, -1096401119, -1106373450, -1089943559) + + W(8, 1013490077, -1090156566, -1094287538, -1101206197) + + W(9, -1100293430, -1104699402, 1048788631, -1113690608) + + W(10, -1098786735, 1029952535, -1116454071, 1025568531) + + W(11, 1009033997, 997069429, -1117506479, 1019208527); + WS(-1082323244, 1081334754); + sum1 = + W(0, 1017652669, 1026074030, 1026308835, -1139023631) + W(1, -1124784756, -1157466090, -1151223253, -1123067319) + + W(2, -1114671162, -1101582293, -1102225205, -1128122150) + + W(3, 1047028384, 1041367009, 1037350457, 1018518877) + W(4, 1045686283, 1051997878, 1056290627, -1109179969) + + W(5, -1088067773, -1090935975, -1100014755, -1100605637) + + W(6, -1100397239, -1097273854, -1091487775, 1033600923) + W(7, 1058585755, 1058457225, 1047302995, 1040259816) + + W(8, 1040334760, 1036251335, 1044247257, 1034603313) + W(9, -1098471302, -1104671877, -1113240670, 1007040336) + + W(10, -1120290385, 1010893986, -1114193219, 1015477828) + + W(11, 1027532986, 1028455628, 1023216600, -1167442276); + sum2 = + W(0, 1021161720, -1130912565, -1130074229, -1117040706) + W(1, 1025588007, 1012731209, -1117264939, 1035821810) + + W(2, 1034310052, -1120070653, 1013066141, -1097167140) + W(3, -1126989997, 1035986228, 979500482, -1131150309) + + W(4, 1028060302, 1057895756, 1050008660, -1077198236) + W(5, 1036249174, 1061480822, 1036420478, -1114248001) + + W(6, -1111691904, 1060473449, 1048707954, -1071981659) + W(7, 1055589119, 1068029984, 1025639810, -1104930835) + + W(8, -1117456161, -1103940220, 1041027109, -1101172514) + + W(9, 1014637039, 1014223793, 1027808652, -1128414380) + + W(10, -1120681063, 1030806761, -1131293055, 1009545637) + + W(11, 1035622377, -1130249456, -1120874755, 1036288471); + WS(1053726551, 1012659382); + sum1 = W(0, 1032083097, -1115995457, 1025061558, -1122031383) + + W(1, 1038196358, -1115071689, -1130575936, -1113099877) + + W(2, -1106638998, 1034541187, -1115280977, -1104507249) + + W(3, -1114143426, 1029764374, 1031225348, -1102798468) + + W(4, -1098702088, -1098027112, -1088652495, -1092902123) + + W(5, -1085882325, -1097451113, -1098237300, -1111014420) + + W(6, 1047871676, 1032148771, 1060231518, 1065996118) + W(7, 1058126194, 1059563219, 1035470703, 1054581342) + + W(8, 998886703, 1042659740, -1106688851, -1104094145) + + W(9, -1102012910, -1121352461, -1128714910, 1000597622) + + W(10, 1022035144, -1112198366, 1034668492, 1024148149) + + W(11, 1010989620, 1012420282, -1123786037, 1024134712); + sum2 = W(0, -1124504165, 1044199209, -1105768285, 1030597508) + + W(1, -1097181409, 1040834484, -1106395293, 1038991009) + + W(2, 1043258069, -1105860909, -1149580326, 1054859448) + + W(3, 1065166573, 1012576825, -1091772000, -1077787203) + + W(4, -1119272862, -1096303760, 1030851358, 1057797022) + + W(5, 1062380695, -1116955554, -1113754765, -1098893101) + + W(6, -1120765402, 1027333462, -1110802573, 1040041196) + + W(7, 1017534493, -1108797661, 1042765191, -1110880129) + + W(8, -1132584009, -1112573193, 1028533186, 1035436142) + + W(9, -1141430739, 1032147286, -1113752657, -1120959090) + + W(10, -1130103221, 1030769098, -1111917317, 1033418125) + + W(11, -1140263257, -1126074797, 1020067757, -1136443945); + WS(-1091585367, -1096979755); + sum1 = W(0, -1125210148, -1121704545, -1120024086, -1106223422) + + W(1, 1027649645, -1106879908, 1033259600, -1108105765) + + W(2, -1104771642, 1041680018, 1043362647, 1048656073) + + W(3, 1038801018, -1103521718, -1106174833, 1031226898) + + W(4, -1104387016, -1093500244, -1085845307, -1086139981) + + W(5, 971788283, -1124812374, 1011346436, -1119913673) + W(6, 1039960904, 1056326757, 1060708396, 1060053831) + + W(7, -1115241635, 1040958787, 995843043, 1040930453) + W(8, 1043768271, -1114046313, 1022927067, -1105827043) + + W(9, -1120254754, 1038747748, -1118768800, 1040461604) + + W(10, -1127914889, -1113011982, -1140249314, -1132509525) + + W(11, 1027284814, 1026834103, -1115807705, 1029803545); + sum2 = + W(0, 1007158722, -1117465525, 1020157105, -1115575087) + W(1, 1029731993, -1115951245, 1042169362, -1111020797) + + W(2, 1004004293, 1030693613, 1007550482, 1032793866) + W(3, -1104867994, -1111503366, -1101768383, 1042858280) + + W(4, -1123076619, 1034532408, -1101572236, 1059720067) + + W(5, -1112732963, -1098900155, -1132362761, -1101011815) + + W(6, -1109929145, -1107544976, -1110988335, 1067665797) + W(7, 1048427228, 1058832170, 1029991341, 1043396912) + + W(8, -1104848259, -1095482533, -1085485924, -1090269083) + + W(9, -1135504754, 1037004208, -1108400441, 1041064016) + + W(10, 1045822378, -1130708853, 1036333634, -1111111456) + + W(11, -1105802165, -1115747431, -1132122165, -1126685993); + WS(1050761175, 1067771859); + sum1 = W(0, 1007679755, 1016344868, -1111212068, 1035369236) + W(1, -1114152399, 1027679203, 1024513697, 1023429051) + + W(2, -1103008542, 1051881455, -1113694143, 1057165115) + + W(3, 1030154052, -1119705863, 1037582923, -1106945041) + + W(4, -1117542415, -1099208581, -1094852820, -1086714990) + + W(5, -1087862176, -1098820035, -1101037788, -1098056967) + + W(6, 1040506400, 1050438683, 1036449755, 1067282489) + W(7, 1049754336, 1030273979, 1048082428, 1020854026) + + W(8, -1107587308, -1138473483, -1102372368, 1045850761) + + W(9, -1112794889, -1111030523, -1114576136, 1000524418) + + W(10, -1123566389, 1035136294, -1110750261, 1047098321) + + W(11, -1108921199, -1158006009, 1025557440, 1029171882); + sum2 = + W(0, -1108377721, 1043256577, -1098471532, 1048495965) + W(1, -1103576309, 1036658009, -1107738492, 1030436882) + + W(2, 1042939389, -1092756549, -1140040329, -1094992475) + + W(3, 1017276157, -1104050853, 1032200565, -1104348148) + + W(4, -1118508723, -1136988785, -1099870420, 1064902851) + + W(5, 1045749581, 1045838269, -1110226959, 1042649061) + W(6, -1101760284, 1050996294, -1098704018, 1062859454) + + W(7, -1089477514, -1157061765, 1046491511, -1106567852) + + W(8, 1037932369, -1104406221, 1015984185, -1098855018) + + W(9, 1025174042, -1121418697, -1106492592, 1027657606) + + W(10, -1111488356, 1040203060, -1103619810, 1045571731) + + W(11, 1025902034, -1107737652, 1044444185, -1105647758); + WS(1057448172, 1069108917); + sum1 = + W(0, 1025232554, -1128422002, 1032607415, -1106129908) + W(1, -1141856298, 1015221011, 1010040610, 1026592994) + + W(2, -1116799928, -1123655391, -1111298160, -1119092894) + + W(3, 1044964179, -1128617181, -1116425884, 1015937075) + + W(4, -1100727837, 1037047614, -1102160962, 1036246919) + + W(5, -1088316592, -1116622467, 1027658969, -1102536008) + + W(6, 1055215485, -1104723136, 1056783106, -1165535249) + W(7, 1049606186, 1044617768, -1132120236, 1042573835) + + W(8, -1106508548, 1040448906, -1103004521, 1040745899) + + W(9, -1132962087, -1103456342, 1037741920, -1118303623) + + W(10, -1139419762, 1006660815, 1016236833, -1123853933) + + W(11, 1016605067, -1160895193, 1018376479, -1120915345); + sum2 = + W(0, -1128749003, -1091479855, -1124909389, 1030767422) + W(1, 1028475536, -1118686225, -1133507353, 1003197653) + + W(2, 1042697161, 1061865996, 1067634595, -1111988197) + W(3, -1102439466, -1117920963, 1022976741, 1008285339) + + W(4, -1101835107, -1097573200, -1083343720, -1090130192) + + W(5, 1055493018, 1027292464, 1030733458, 1002427213) + W(6, 1038607216, 1026943422, -1110364223, -1089515454) + + W(7, -1090714326, -1101900071, 1033968573, 1033064671) + + W(8, -1108371617, -1114744392, 1035072621, 1054823097) + + W(9, 1059932372, 1031097460, -1132241300, -1101772178) + + W(10, 1031384482, 1026017402, 1036186174, -1104718688) + + W(11, 1024781950, -1110105890, 1040128898, 1026666744); + WS(1065065708, -1125796377); + sum1 = W(0, -1112144555, 1029634469, -1112840237, 1034269757) + + W(1, -1122801969, -1133240789, 1016754760, -1119164014) + + W(2, -1106943759, 1025116330, -1105630541, -1106751530) + + W(3, 1023923175, 1041797158, -1113089188, -1130226634) + + W(4, 1017193539, -1112668180, -1112954809, -1096457447) + + W(5, -1094266089, -1096385878, -1106190977, -1114305030) + + W(6, 1048634147, 1027133034, 1055950575, 1060800975) + W(7, 1051425450, 1041695411, 1044103184, 1036967948) + + W(8, -1127916040, 1026809557, -1112907992, -1093799807) + + W(9, -1103940357, 1039766276, -1130590086, 1008751883) + + W(10, -1132404112, 1004217594, -1111964638, 1038388364) + + W(11, -1132895812, 1013909417, 1032062573, 992673732); + sum2 = + W(0, 1043431555, -1109692118, 1036275465, -1111890182) + W(1, -1102288351, 1045724738, -1109691788, 1007408138) + + W(2, -1098806978, 1046643695, -1097975189, 1048664613) + + W(3, 1049750262, -1098934938, 1032869755, -1111259526) + W(4, 1024222598, 1045861043, -1101643320, 1058544270) + + W(5, -1098883379, 1049188212, -1107029975, 1048185689) + + W(6, -1105154239, 1054740901, -1083291725, 1068703829) + + W(7, -1080748028, 1058055770, -1100454574, -1148294292) + + W(8, 1031236307, 1035789437, 1007109846, -1081353417) + W(9, 1031821902, -1100833476, 1051695731, -1114785167) + + W(10, 953732840, -1115663935, 1042301531, 1035678115) + + W(11, -1120166561, 1047454611, -1096856793, 1041528279); + WS(1061652844, 1044003957); + sum1 = W(0, -1118715405, 1029075868, -1115471369, 1032954233) + + W(1, 998963525, -1111723799, 1036011862, -1152687195) + W(2, 1022617806, 1045689305, -1094261862, 1027529537) + + W(3, -1099266912, 1045678528, -1119248992, -1108410990) + + W(4, 1044034950, 1030904095, 1059625182, 1057470859) + W(5, 1062131070, -1098407445, 1047156095, 1037164834) + + W(6, -1101088515, -1103346936, -1096538237, -1086691558) + + W(7, -1094363880, -1105378993, -1123294521, 1016045215) + + W(8, 1019688911, 1045834099, -1102841294, 1041319556) + + W(9, -1166277444, 1028040508, -1135804811, -1106724595) + + W(10, -1131961856, -1110934572, 1036052922, -1148682371) + + W(11, 1017830866, -1109411965, 1030886475, -1123601124); + sum2 = + W(0, -1123087716, -1122327585, 1034911826, -1115300382) + W(1, -1147444258, 1031538244, -1122824244, 1026384688) + + W(2, -1115107680, -1105390433, 1034185422, 1042081129) + W(3, 1036682846, 1043195731, -1112377777, 1024479380) + + W(4, 1039737456, -1106584843, 987338697, -1094697399) + W(5, 1048628369, -1100913302, 1041194171, 1036768370) + + W(6, 1045652727, -1139899009, 1060423005, -1103292099) + + W(7, -1079464406, -1102260713, -1101961861, -1106123677) + + W(8, -1106100707, -1102201417, -1111505321, -1094374885) + + W(9, 1066067653, 1062702469, 1013733313, 1034543612) + W(10, -1128513463, -1114704327, 1009548801, 1026056400) + + W(11, -1112497116, -1107096307, -1125635761, 1037241080); + WS(1061983340, -1091535279); + sum1 = + W(0, -1154828523, 1027504414, -1131271078, -1120408436) + W(1, -1131629652, -1122568783, -1165314478, 995201141) + + W(2, -1133965299, -1128653831, -1114200663, -1129743238) + + W(3, -1117839504, 1035797658, -1115205249, 1019503421) + W(4, 1043906007, 1027190112, 1061948198, 1054216086) + + W(5, 1062537731, 1028696552, 1045640431, 1044774081) + W(6, -1118138894, -1097538828, 1027560685, -1081158944) + + W(7, -1089869577, -1097887897, -1111951485, -1105384996) + + W(8, -1109842717, 1037523079, -1106988467, 1048594270) + + W(9, -1121464863, 1028427349, -1121440284, -1119142300) + + W(10, 1025343169, -1121887129, 1023298667, -1108007945) + + W(11, 1034422373, -1120763036, 1008081777, -1122356070); + sum2 = + W(0, 995087446, 1030495116, 1007114937, -1121939088) + W(1, -1109334595, 1012755199, 1031009559, -1123906524) + + W(2, 1036608468, -1099055008, -1115487063, 1057848194) + + W(3, -1106051731, 1015526929, -1118519790, 1024955281) + W(4, 965233164, -1104807397, -1070882050, 1075270016) + + W(5, 1059573542, -1102771000, 1023903156, -1159976683) + + W(6, 1033021468, -1107407110, 1038417178, -1094462735) + W(7, 1039375650, -1124510890, 1016192349, 1023974018) + + W(8, -1114419070, 1033869233, -1103406865, 1051754977) + W(9, -1104596666, 1028405316, -1111745826, 955743793) + + W(10, 1033025046, -1119280070, 1028798922, -1120762821) + + W(11, 1018124826, 976567206, 1015800189, -1129936862); + WS(1062927532, 1035014202); + sum1 = W(0, 1039522007, 1034505951, 1040732909, 1002357921) + W(1, 1016035605, -1122944943, 999726956, -1140151454) + + W(2, -1114736246, -1109500450, 1011271190, 1044028441) + W(3, 1050061010, 1042353405, 1036129025, 1041525964) + + W(4, 1037103646, 1048942600, 1053278895, -1097469770) + + W(5, -1085392865, -1094832633, -1103977959, -1111797875) + + W(6, -1104897563, -1092956200, -1091146839, -1093973369) + + W(7, 1051214559, 1050975197, 1043068615, -1126246883) + W(8, 1044380938, 1044086236, 1044239087, 1042916452) + + W(9, -1112456671, -1111813313, -1112116510, -1110444494) + + W(10, -1121785378, 1027254073, -1145709740, 981579331) + + W(11, 1035761861, 1033165606, 1025151372, 1033358643); + sum2 = W(0, 1038528863, 1036214533, 1049223347, -1113699843) + + W(1, 1041716852, -1100571883, 1017295180, -1101978327) + + W(2, -1084044031, -1091834288, -1110305241, 1042795689) + + W(3, 1050774414, 1043118649, 1047177880, 1050263507) + W(4, -1082440456, -1077502553, 1049812579, 1068178608) + + W(5, -1092073446, 1047476754, 1034666293, 1054410728) + W(6, 1050939225, -1095085693, 1050231565, 1060273714) + + W(7, -1115682722, -1105112612, 1050691511, -1101197699) + + W(8, 1053868195, 1028074081, 1046376147, -1132635925) + + W(9, -1098688235, 1017697398, -1092800689, -1104788145) + + W(10, -1113963371, -1114781385, 1035810200, -1160679206) + + W(11, 1036026944, 1016345266, 1040315316, -1112282035); + WS(-1086906028, 1058773265); + sum1 = W(0, -1132629757, 997844200, 965362145, -1106996409) + + W(1, -1153797548, -1120050655, -1122322046, 1015091632) + + W(2, 1044191380, 1043197109, -1125429564, 1033453658) + + W(3, -1118095697, -1121403972, -1119804562, 1026125167) + + W(4, 1032367334, 1050808506, 1058285756, 1062016570) + W(5, 1044397873, 1043993638, 1042486572, 1047754366) + + W(6, -1096691584, -1095732027, -1086608026, -1081591954) + + W(7, 1041881517, -1096430215, 1002316636, -1099777504) + + W(8, -1152318558, 1042781664, 1034636741, 1043388193) + W(9, 1045470808, -1115428219, 1018594522, 1024196285) + + W(10, -1109034905, 1031594505, -1119832870, -1106441585) + + W(11, -1149103576, -1113585524, -1135705587, -1122333654); + sum2 = W(0, 1048104076, 1038532068, -1129915388, -1101156186) + + W(1, -1128179824, -1128045264, -1131782160, -1109473444) + + W(2, -1096548381, -1086001730, -1083843015, 1035944594) + + W(3, -1102068111, 1044127780, -1114990278, 1041203218) + + W(4, -1107021820, -1131935456, 1060056432, 1066609131) + + W(5, 1027352212, 1048571914, -1120175088, 1038985844) + W(6, 1018456960, 1007620609, 1033171254, 1050949241) + + W(7, -1107874139, -1104179329, 1038875644, -1112054433) + + W(8, -1136070657, 1040453646, -1111662792, -1110531416) + + W(9, -1104445548, -1127646596, -1110249452, 1034344442) + + W(10, -1112321878, 1033875386, -1117768272, 1032538050) + + W(11, -1114035189, 1032855260, -1144805954, -1130080864); + WS(1046014126, 1065769758); + sum1 = W(0, 1012096182, -1112076254, -1100987245, -1106802021) + + W(1, -1106286530, -1129503003, 1021132153, -1112401299) + + W(2, -1121314108, 1039437825, 1043473803, 1045721640) + + W(3, 1049347084, -1109380841, 1049245244, -1120677869) + + W(4, -1091239207, -1094624040, -1091961473, -1088552177) + + W(5, -1089539427, -1091526873, -1091375076, -1088888106) + + W(6, 1052142286, 1048611696, 1060125676, 1062377804) + W(7, 1053897896, 1057150062, 1048631067, 1057709495) + + W(8, 1042130570, -1109865911, -1128757714, -1119711185) + + W(9, -1128945819, -1119080717, 1034078686, -1122337355) + + W(10, 1019346753, -1152131961, -1123465492, 1039063160) + + W(11, -1114302645, 1015225093, -1135518836, 1014030866); + sum2 = + W(0, -1089976447, -1078304891, -1071851632, -1070679577) + + W(1, -1081022179, -1113339548, 1011136331, 1035458322) + W(2, 1064913799, 1068350548, 1070575185, 1072673707) + + W(3, 1063744071, -1128451504, 1040942179, -1115281660) + W(4, -1094573985, 1019506715, 1065710309, 1065504629) + + W(5, 1056839493, -1124929726, -1106886716, -1111465381) + + W(6, -1109226965, -1120561974, 1002672995, -1098180006) + + W(7, -1117214353, -1111255228, 1028658493, 1033265670) + W(8, 1030445629, 1021062218, -1127826384, 1031139735) + + W(9, -1112765526, 1037321868, -1127063938, 1001938923) + W(10, -1115506338, 1018259030, 1012290398, 995896746) + + W(11, 1010152224, -1118014213, 967860273, -1119523230); + WS(-1096468055, 1053785380); + sum1 = W(0, -1110473361, 1020813409, -1111899059, 1027946631) + + W(1, 1003556839, -1143096715, 996386562, -1123588698) + + W(2, -1116957735, -1114360891, -1123200592, -1090968927) + + W(3, -1107232681, -1117882342, -1118523124, -1105979736) + + W(4, 1034879511, -1114475674, -1109008383, 1066746382) + W(5, 1064704330, 1046069775, 1042611044, 1040361862) + + W(6, 1017136705, -1111337627, 1028379180, 1051825655) + + W(7, -1094442401, -1129057075, -1114700263, 1022269000) + + W(8, -1116669644, -1135792006, -1105125143, -1094808947) + + W(9, -1116312257, -1106172505, -1135525501, -1106276184) + + W(10, -1118632404, -1120549867, -1162426624, -1173354793) + + W(11, -1119514205, -1113957025, -1130080208, -1123525720); + sum2 = + W(0, -1127419095, -1140125367, 1028088432, -1126099139) + W(1, -1114986450, 1024738032, -1114843176, 1023949256) + + W(2, -1122531649, 1025350612, -1123116186, 1020760995) + W(3, 1019570567, 1039021380, 1018690059, -1119198021) + + W(4, -1111543417, -1108347637, -1101718819, 1056423339) + + W(5, 1073762237, -1100544782, 1049061203, 1026425060) + W(6, 1043407189, 1028851928, 1048774619, -1086358248) + + W(7, -1076137651, 1044261707, -1099227611, -1123270518) + + W(8, 1013519927, -1117946771, 1041147594, -1112971994) + + W(9, -1118107520, 1015761083, -1111772147, 1027419728) + + W(10, -1134679399, 991440379, -1127107007, -1115422093) + + W(11, 1037345920, -1103403994, 1042824177, -1129333383); + WS(-1089097708, -1091261619); + sum1 = W(0, -1127316247, -1113526029, -1118797136, -1123552881) + + W(1, -1123795687, 1015138359, -1129675572, -1126584008) + + W(2, 1003986316, -1120011361, 1046355762, -1103137072) + + W(3, -1103576251, 1032220600, -1120446878, 1027028747) + + W(4, -1111263852, -1112997295, -1081822066, -1100403388) + + W(5, 1053114278, -1138618770, 1007314666, -1123471427) + W(6, 1044425283, 1047767320, 1061869832, 1058200050) + + W(7, -1092855018, -1160534136, 1034662460, 1018063772) + + W(8, 1033605983, -1118942860, -1110810403, 1009152314) + + W(9, 1046189751, 1031283151, 1016196275, -1128724178) + + W(10, -1116984894, -1121673366, 1027944882, -1124559262) + + W(11, -1131347855, -1118591413, -1131488026, -1122517738); + sum2 = + W(0, -1151923233, 1026311687, 1025121279, -1123775834) + W(1, 1033596173, -1105542037, 1035290939, -1108107550) + + W(2, 1040701127, -1109901381, 1034378939, -1092342947) + + W(3, -1096202739, 1051958537, -1098166743, 1047977685) + + W(4, -1110923755, 1024679085, -1080291839, 1071256357) + + W(5, 1042190483, -1103925783, 1046386099, -1114731953) + + W(6, -1103532415, 1016651554, -1082840291, 1066054209) + W(7, 1056834874, -1199035157, 1035522294, 1030555165) + + W(8, 1041909162, 1036375055, -1110170843, -1090243220) + + W(9, -1097275958, 1038401459, -1113079432, 1015019440) + + W(10, -1121169096, -1135341024, 1041541680, -1128413506) + + W(11, 1043004954, -1097944284, 1042529081, -1099750845); + WS(1061142188, 1045552914); + sum1 = W(0, 1022384747, 1019603337, 992843677, 1025369499) + W(1, -1149984013, 1030794181, -1123167236, 1034453383) + + W(2, 1020461367, -1114371061, -1137489184, -1128616851) + + W(3, -1114859644, -1134916072, -1114858116, 1009189588) + + W(4, 1058732728, 1054684529, 1060634392, 1056292747) + W(5, 1061516204, 1058073341, 1052882077, 1050605022) + + W(6, -1095805239, -1098135841, -1085459239, -1081060320) + + W(7, -1083596540, -1097701630, 1026645922, -1099032542) + + W(8, -1101590238, -1123665301, 1027392977, -1124699057) + + W(9, 1038698931, -1106352164, 1006025241, -1100750969) + + W(10, 1033080372, 1031766591, -1123755612, -1116775033) + + W(11, 1034158665, -1134014242, 1037240581, -1122655396); + sum2 = + W(0, 1041010686, -1100296712, 1042377248, -1124701214) + W(1, 1002573079, 1026372231, -1107309152, 1022594646) + + W(2, 1045355628, -1110840017, 1028443719, -1097271182) + W(3, -1108318217, 1034868187, 1032249619, 1034940919) + + W(4, -1091459780, -1109934927, -1120459763, 1068946970) + + W(5, 1048538630, -1095496747, -1112114883, -1096153349) + + W(6, -1092997038, -1109499465, 1023984711, 1068602839) + + W(7, 1049236461, -1112347607, -1088682480, 1036467963) + + W(8, 1025085151, -1110570114, -1120816159, -1090645327) + + W(9, 1036483715, -1110453128, -1121128467, -1105549173) + + W(10, 1019331790, -1115246837, 1025130703, 1036287199) + + W(11, 1028224647, -1106754238, 1040581836, -1106253388); + WS(-1090464684, 1058848194); + sum1 = W(0, 1038070654, -1104784595, -1140651524, 1048797564) + + W(1, -1115845272, -1115304422, 1022142646, 1026901973) + + W(2, 1035807069, -1106022588, -1107342224, -1112865880) + + W(3, -1102596230, -1117573217, 1011767229, -1105151431) + + W(4, 1059156269, 1027584334, 1060192817, 1062566262) + W(5, 1060113046, 1043041013, 1054886405, 1057383999) + + W(6, -1091590511, -1104101108, -1084437581, -1088742755) + + W(7, -1087393870, -1095911543, -1102839322, -1088896680) + + W(8, 1049775661, -1100086527, 1050662239, 1037690576) + W(9, 1050391262, -1117869728, 1042443855, 1039830925) + + W(10, -1111666744, -1128618637, -1128690758, -1097281200) + + W(11, 1024450616, -1151911514, -1131868338, -1104457275); + sum2 = + W(0, -1106952896, 1050458431, -1084179073, -1068828969) + W(1, -1082769727, 1054525389, -1098029126, 1038352192) + + W(2, -1173421195, -1100970530, -1117103305, 1049093414) + + W(3, 1015202727, -1093960872, 1043872404, -1107157710) + W(4, -1113206734, 1037511626, 1063723378, 1078393261) + + W(5, 1065452472, -1106048166, 1031385535, 1030855073) + + W(6, -1136957987, 1029901269, -1106205415, -1105390455) + + W(7, -1128426057, 993579659, -1114758982, 1034755506) + W(8, -1152575873, -1116273053, 1039247706, 1034474614) + + W(9, 1032907306, -1100143257, -1155923695, 1034533524) + + W(10, -1112584615, 1045345833, 1031320371, -1099252776) + + W(11, 1035573879, 1040309898, -1124055116, -1124561432); + WS(-1106782638, -1120193880); + sum1 = W(0, 1020741911, 1021367862, 1038644232, -1126436322) + W(1, 1043522250, -1112066734, 1018349205, 1033129938) + + W(2, -1116040418, -1121939617, -1109539853, -1098608828) + + W(3, -1101880327, 993980163, -1115252655, -1133833389) + W(4, 1053259451, 1050945756, 1055524943, 1065255335) + + W(5, 1061719830, 1048874997, 1051405991, 1042923217) + + W(6, -1112821605, -1100446872, -1091353929, -1085596156) + + W(7, -1096552606, -1090468372, -1106280862, -1102788916) + + W(8, -1101282812, 1049499553, -1100504250, -1101475552) + + W(9, 1025835692, -1114054607, 1027947689, -1104899626) + + W(10, -1111424287, -1129092267, 1016236516, 1033532871) + + W(11, 1022700239, -1114668904, -1147278953, 1028803059); + sum2 = + W(0, -1113068388, 1036673453, -1118880240, 1028813378) + W(1, -1107832014, 1027909744, -1122240512, 1011592783) + + W(2, -1115580494, 1024834555, -1115483686, -1117546792) + + W(3, 1043490929, -1105092918, 1040415904, -1119502452) + + W(4, 1039529972, -1098466798, 1043501593, -1115055672) + + W(5, -1117282076, 1042504898, -1107365158, -1112704202) + + W(6, -1091718951, 1052150318, 1043613567, 1062484975) + W(7, 1045088246, -1094456673, 1030923561, -1123953380) + + W(8, -1076395174, -1080701891, 1068474066, 1066750300) + + W(9, -1097140180, 1049333443, -1109881554, 1043999999) + + W(10, 1046645532, -1104586573, 1009076111, -1093753132) + + W(11, 1036864955, 1022104546, 1033514298, -1115391680); + WS(-1093231703, 1042706757); + sum1 = W(0, 1032826937, 1026075841, 1032961819, 1036684171) + W(1, 1034757510, 1036416025, 1015758976, 1040004261) + + W(2, 1040624182, 1000558899, -1110755278, -1127770315) + + W(3, -1106938311, 1019575916, -1114624210, 1042264396) + W(4, 1058499572, 1052553144, 1061343357, 1062021249) + + W(5, 1060752603, 1057695045, 1051786740, 1058906011) + + W(6, -1084803183, -1099119122, -1083389465, -1081334022) + + W(7, -1087386813, -1090036539, -1098198604, -1088285503) + + W(8, -1104136529, 1025447538, -1114092422, -1112317122) + + W(9, -1132554758, -1109030926, 1012060669, -1096739300) + + W(10, 1041579305, 1031885534, 1032264780, 1018739433) + + W(11, 1031902455, 1037874311, 1027119072, 1035404188); + sum2 = W(0, -1134545280, -1101426979, 1012752443, 1036306510) + + W(1, 1034320105, -1111393843, 1046638158, -1108867307) + + W(2, 1057942802, 1047102485, 1055001204, -1096203167) + + W(3, -1114902087, -1096420171, -1101073471, -1091559913) + + W(4, -1072425931, -1084592242, -1079302223, -1123894686) + + W(5, 1062181631, 1062084093, 1064536824, 1073505700) + + W(6, -1067197419, -1071603316, -1077093049, -1098326846) + + W(7, 1072541263, 1067609499, 1073214169, 1078744623) + W(8, 1049446840, 1042726179, 1050812050, -1129334697) + + W(9, -1097319760, -1093274589, 1001153868, -1094526709) + + W(10, 1074141781, 1060445087, 1060645469, 1037955576) + + W(11, -1094473234, -1087350702, -1085693573, -1077663090); + WS(-1075107862, 1049521772); + sum1 = W(0, 1027861131, 987763517, -1129668766, 1033675992) + W(1, 1016072268, 992091051, 1026084697, -1120420163) + + W(2, 1045206278, 1041173528, 1032319275, 1040210256) + W(3, 1041485791, 1044520444, 1042655839, -1112688453) + + W(4, -1086495609, -1097093508, -1086275954, -1081944455) + + W(5, -1082045908, -1096923684, -1093981119, -1094413520) + + W(6, 1051717721, 1049572700, 1055584810, 1064397290) + W(7, 1059363461, 1055988184, 1051323143, 1050124978) + + W(8, 1033503081, -1116084523, 1009361560, 995768539) + W(9, -1112276757, -1112468587, 1005879363, 1033578820) + + W(10, 1031434621, -1144572069, -1140119493, 1027980366) + + W(11, -1129633421, 1024276072, 1000619058, 1025196738); + sum2 = W(0, 1033523983, -1107297920, -1109353447, -1097553497) + W(1, -1102290887, 987526362, 1022298470, 944749371) + + W(2, -1091543751, -1125142534, -1100365589, -1121112319) + + W(3, -1119424675, -1094244068, 1033606211, -1100627225) + W(4, 1048034710, 1031510683, 995045613, 1061520608) + + W(5, 1042981818, -1103162896, 1052169844, -1098189213) + + W(6, 1051542012, -1103344470, -1120961303, 1061214811) + + W(7, -1094266425, 1043830132, 1041952964, 1041818078) + + W(8, 1024239879, -1117305947, -1099173366, 1044020024) + + W(9, -1093433218, 1046119446, 1043499670, -1096785580) + + W(10, 1041022978, -1121264057, -1115033235, 1053722991) + + W(11, -1097363289, 1047286054, -1106943326, 1031561067); + WS(-1097146583, -1102489480); + sum1 = W(0, -1121239074, 1035066361, -1110655283, 1032257412) + + W(1, 1020382076, 1014217354, 1032256145, -1120529307) + + W(2, -1102624204, 1033907292, -1104909116, -1109600459) + + W(3, -1113387282, -1114213060, -1114763275, -1123950514) + + W(4, 1041928668, -1096659727, -1123609439, -1091326393) + + W(5, -1105975127, -1098203983, 1045101428, -1093952115) + + W(6, 1043173384, 1051162503, 1057278053, 1050132159) + W(7, 1049365769, 1049080395, 1033542535, 1055699093) + + W(8, -1118777253, -1108685857, -1102566959, -1100309385) + + W(9, -1101876333, 1040792061, -1121020400, 1035959564) + W(10, 1016656554, 995611334, 1009112868, 1037330963) + + W(11, -1111738159, 1033561904, -1149295615, -1122689753); + sum2 = + W(0, 1030001048, -1107119695, 1023713698, -1115026335) + W(1, 1024715164, -1112691697, 1024758511, -1147275412) + + W(2, 1039849292, -1106305989, 1019090837, 1035696383) + W(3, 1036481868, 1023388499, -1146519572, -1112564365) + + W(4, -1106927121, 1060202814, -1104587624, 1057308499) + + W(5, 1047684818, -1112160637, -1093257675, 1041456307) + W(6, 1046837828, -1095733546, 1043085465, 1053508746) + + W(7, 1034862818, 1046794790, -1094465043, -1083960309) + W(8, -1131959957, 1012779430, 1026454649, 1038120705) + + W(9, 1037173687, -1101425448, 1036335613, -1094791365) + + W(10, -1116147800, -1124391765, 1028873647, -1104339358) + + W(11, 1045294658, -1119391248, -1156574008, 1012709310); + WS(1057303084, -1084740383); + sum1 = + W(0, 1025949163, 1023904890, 1033327896, 1022060320) + W(1, -1131905805, -1114170862, 1021513971, -1109381346) + + W(2, -1105987664, -1104417576, -1097440039, -1106403568) + + W(3, 1043670267, 1041763972, 1037885311, 1019385429) + W(4, 1034968156, 1048292239, 1057303604, -1134851644) + + W(5, -1082452830, -1089247692, -1093401571, -1097845612) + + W(6, -1097863693, -1093717272, -1088500414, 1058205452) + W(7, 1059877080, 1058731430, 1046703382, 1049842950) + + W(8, 1046214631, 1042713619, 1043920086, 1041892896) + W(9, -1101986947, -1107457363, -1110573172, 1031126152) + + W(10, -1130932027, -1126920426, 1012093510, 1040636140) + + W(11, 1028551783, 1041063330, -1143718184, 1016340900); + sum2 = + W(0, -1097593869, 1040446621, -1107347821, 1036994425) + W(1, 989701019, 1043906150, 1040271244, 1016581730) + + W(2, -1100989715, 1036240143, -1105186205, -1119554977) + + W(3, 1048367016, -1095197585, -1102913875, 1041272891) + W(4, 1026566131, -1100851860, 1046892012, 1069594194) + + W(5, -1107809286, 1031148367, 1038853877, -1105136265) + W(6, 1061153405, 1047874592, -1103469514, 1074408805) + + W(7, -1110319007, -1079941721, 1042791078, -1086296266) + + W(8, 1050695083, -1096668864, -1104864053, -1103368475) + + W(9, -1100341899, -1084422687, -1093040701, -1099178193) + + W(10, -1095509343, 1040237386, -1114614656, 1040210470) + + W(11, -1105386934, 1031716423, 1036206107, 1042594729); + WS(-1085311468, 1078025451); + sum1 = W(0, -1114246985, -1123523234, -1123774423, 1017942127) + + W(1, 1018695644, -1134274761, 973249598, 1032511109) + W(2, 1033236492, 1042717314, 1046675224, 1030027079) + + W(3, -1107516674, -1105985470, -1118366597, -1108369993) + + W(4, -1126048573, -1100167817, -1090923842, 1002547123) + + W(5, 1061445386, 1051174149, 1032724353, 1047097650) + W(6, 1051596674, 1050764301, 1057423711, -1138337956) + + W(7, -1085962671, -1101362115, -1098415672, -1105953621) + + W(8, -1110129580, -1101525701, -1102550347, -1117387765) + + W(9, 1045061525, 1037275627, 1033244340, 1025818592) + + W(10, -1109388771, 1021849401, 1031509177, -1126623147) + + W(11, -1118825262, -1107617348, -1124427728, -1115961017); + sum2 = + W(0, -1123353384, 1030359787, 1024787123, 1015567503) + W(1, -1115408082, 1026077135, -1137211259, 1015951538) + + W(2, -1131031713, -1114557735, -1125418898, -1132430472) + + W(3, 1029672716, -1118070691, -1125125186, -1135395683) + + W(4, 1029311455, -1123787418, -1099438470, 1049323738) + W(5, 1042547290, 1050505809, -1110579463, 1040847724) + + W(6, 1047725718, 1042470619, -1106551206, -1097880179) + + W(7, -1089568094, -1166364565, -1115324497, 1028809582) + + W(8, 1051601031, -1121374979, 1049816965, -1088308991) + + W(9, -1098255621, 1026888229, -1112338809, -1102185033) + + W(10, -1113968956, 1045218010, 1044805763, 1039658119) + + W(11, 1042126156, -1115384233, 1043221816, 1014731468); + WS(1060142060, 1042832150); + sum1 = W(0, 1031397804, -1121488955, 1033996248, 1018827426) + W(1, -1131717262, 1033609702, 1010765225, 1029196868) + + W(2, 1036648197, -1142445829, -1117943062, -1111782928) + + W(3, -1108508447, -1106903604, 1015606653, -1115637854) + + W(4, 1052129567, 1051097024, 1054892021, 1065668620) + W(5, 1059881804, 1058770516, 1050176059, 1054801908) + + W(6, -1093104885, -1094159296, -1086111346, -1081757070) + + W(7, -1087336873, -1090845580, -1100487494, -1126749404) + + W(8, -1125587404, -1138833071, 1028704007, 1032794495) + + W(9, 1047817147, -1104469332, 1038701961, -1091639031) + + W(10, 1030014814, 1024131190, 1024270930, -1123778927) + + W(11, 1022586319, -1125662417, 1032196289, 1019613157); + sum2 = + W(0, 1016709191, 1013621039, -1134054043, 1033829499) + W(1, -1133247239, 1014723479, 1025542948, -1113297030) + + W(2, 1043282989, -1105412866, 1034830675, -1123744731) + + W(3, -1107183956, -1110083630, -1115844306, -1097083153) + + W(4, -1105914972, 1048947993, -1104630078, -1088942993) + + W(5, -1093767876, 1055362845, -1111303066, 1064727508) + + W(6, -1104055195, 1038685325, -1084033248, -1072142874) + + W(7, 1073971039, 1076386430, -1098251720, -1090433741) + + W(8, -1113893232, -1143937773, -1103493551, -1098435347) + + W(9, 1052470850, -1104225446, 1051939911, -1091328171) + W(10, 1031619176, -1128320153, 990218298, 1026126526) + + W(11, 1042783259, -1103699955, -1123473137, 1025388740); + WS(-1086199532, 1054743650); + sum1 = W(0, 1034444474, 1027498242, 1040848158, 1023783640) + W(1, 999869046, -1115850147, 1025498402, -1134397103) + + W(2, 1032011277, -1095519909, -1107222607, -1152811127) + + W(3, 1044283945, 1044573214, 1036275699, -1123084051) + W(4, 1048862696, 1053262121, 1061389071, 1030342167) + + W(5, -1084989084, -1095010778, -1106712265, 1032418005) + + W(6, -1097849454, -1090625833, -1084999869, -1113365765) + + W(7, 1060145155, 1054594461, 1045643928, 1033574715) + W(8, 1006964268, 1040908045, 1038795271, 1038235355) + + W(9, -1104327823, -1101807134, -1122717633, 1015954881) + + W(10, 1027368614, -1113781807, -1118338586, -1108967739) + + W(11, 1006059384, 1028815960, -1124545277, -1135640905); + sum2 = + W(0, -1098769930, 1041383757, 1031909130, 1040055926) + W(1, -1112037460, 1040275414, -1111784639, -1113621249) + + W(2, 1042608106, -1089209738, -1102323575, -1105226719) + + W(3, -1124786133, -1117623756, -1131302943, 1048083051) + + W(4, -1101852353, -1121408570, -1108783974, 1065973699) + + W(5, 1049738412, 1057999228, -1111524780, 1025491254) + W(6, -1093087039, 1038811718, -1089123880, 1069194195) + + W(7, 1026907074, -1106112227, 1020629449, -1107530612) + + W(8, -1139600545, -1093098827, -1121335963, -1098519743) + + W(9, -1089198426, -1101165651, -1109243346, 1048264427) + + W(10, 1036192806, -1121276186, 1045867083, 1023817866) + + W(11, 1042688929, -1122635193, 1041146873, -1095495518); + WS(-1090983255, -1089207473); + sum1 = + W(0, 1011536056, 1031895551, -1113368985, 1041335941) + W(1, -1112820133, 1033755607, -1120463213, 1029129223) + + W(2, -1126565928, -1113602338, -1111099810, -1099647257) + + W(3, -1102367072, 1030939267, -1111909392, 1034973975) + W(4, 1055178415, 1054038520, 1055473117, 1064470249) + + W(5, 1063942234, 1050197537, 1058279198, 1042393881) + + W(6, -1101680475, -1097154360, -1089575247, -1084973552) + + W(7, -1086493203, -1097159533, -1096914715, -1096995926) + + W(8, -1102945718, -1121652462, 994604183, -1121284913) + + W(9, 1041044307, -1111487017, 1017418960, -1111098786) + W(10, 1026884961, 990918528, 1022227241, -1151944468) + + W(11, -1119623498, 1029397803, -1127714823, 1024652821); + sum2 = + W(0, 1008868714, 1000134020, -1131179173, 1026383992) + W(1, -1108980541, 1033178726, -1113100227, 1025874080) + + W(2, -1138668162, 1023930211, -1108628571, -1114490385) + + W(3, 1047990867, 1030525898, -1131668265, -1138114226) + + W(4, 988655570, -1099344177, -1064898888, -1066369231) + W(5, 1075540559, 1086324754, 1049763634, -1100090533) + + W(6, -1108603395, 1041622837, -1131013053, -1087427617) + + W(7, -1095163420, 1057379348, 1040828448, -1109206595) + W(8, 1033342078, 1025638720, -1133763810, 1033730604) + + W(9, -1117896039, 1031531103, -1119632759, 1025251971) + + W(10, 1018452757, -1115444075, 1023801183, -1118168395) + + W(11, 1033324797, -1116567631, 1028372534, -1128577333); + WS(-1109283164, -1114463829); + sum1 = W(0, 1026307305, 1010065376, 1036887575, 1032762791) + W(1, 1038442146, 1036926348, 983730417, 1042339968) + + W(2, 1048505142, 1006853751, -1122796048, -1121781501) + + W(3, -1106474773, -1140109366, -1113784606, 1033209828) + + W(4, 1056046207, 1051849183, 1060373686, 1062361681) + W(5, 1060935143, 1058739944, 1052729243, 1060958338) + + W(6, -1087851802, -1096622464, -1086026376, -1080983673) + + W(7, -1086759863, -1088322398, -1098544579, -1085562739) + + W(8, -1097387850, 1034233556, -1106692609, -1116217316) + + W(9, -1136008963, -1111740214, 973353381, -1098996574) + + W(10, 1043738183, 1033008793, 1030721871, 1031320492) + + W(11, 1024808165, 1037732587, 1028455576, 1032429188); + sum2 = + W(0, 1033103311, 1036675590, 1035316039, -1139597621) + W(1, -1104037187, 1036924272, -1111374359, 1033604811) + + W(2, -1088826877, -1093870598, -1096260803, 1038770367) + + W(3, -1120383141, 1054470917, 1048854624, 1052968175) + W(4, 1076551262, 1064863709, 1066303868, 1054257493) + + W(5, -1086745184, -1080791393, -1081541832, -1074269835) + + W(6, 1082157528, 1075036637, 1074566779, 1054121358) + + W(7, -1075712309, -1075955022, -1073360354, -1068055688) + + W(8, -1088761642, 1044533603, -1088656095, -1096732938) + W(9, 1026461691, 1058516172, 1036676016, 1036957577) + + W(10, -1073488400, -1083381518, -1087052440, 1034260530) + + W(11, 1055295113, 1062460380, 1061463967, 1072405502); + WS(-1073690779, -1087724268); + sum1 = W(0, 1020006630, 944113971, 1028328440, 1026519064) + W(1, 1023877839, 1026744019, -1116930962, 1037411798) + + W(2, 1040645890, 1024788392, 1048604230, -1124203663) + + W(3, 1026558293, -1108217132, 1024907750, -1124509669) + + W(4, 1037569760, 1033313762, 1026748704, -1097395091) + W(5, 1058432566, 1052406658, 1046357449, 1052615509) + + W(6, 1040537741, 1022063376, 1037819609, -1081034849) + + W(7, -1089181115, -1095782133, -1103915032, -1095058991) + + W(8, -1102207443, -1117962707, 1018608989, 1030158086) + W(9, 1048090929, 1028902900, 1040820950, 1037074644) + + W(10, 1011752087, 1010250996, 1035208397, -1107990331) + + W(11, 1030700463, -1115106384, 1006665970, -1120315546); + sum2 = + W(0, 1036147454, -1115074830, -1143660011, -1109526737) + W(1, -1113309480, 1006285882, -1115649745, 1026243607) + + W(2, 991782552, 1025479068, -1111873890, 1054093522) + W(3, 1016478163, 1035621794, 1027286665, -1108696429) + + W(4, -1100036784, -1096384442, 1042154750, 1036720443) + W(5, 1015496998, -1111840809, 1028637267, 1024623035) + + W(6, -1102354425, 1031211776, -1098733186, 1061883500) + + W(7, 1040999099, -1099055155, -1117281017, -1120753705) + + W(8, -1132125723, -1114551496, -1120425773, 1042458762) + + W(9, -1118319659, 1021928735, -1113807339, 1033776741) + + W(10, 1037581214, -1107514244, 1036528495, -1113752408) + + W(11, -1131440878, 1009305230, -1115311515, -1117838632); + WS(1053167575, 1034582410); + sum1 = + W(0, 1023109013, -1105499654, 1047073940, -1103829756) + W(1, -1134567319, 1029509866, -1107075490, 1028951523) + + W(2, -1135820801, 1041430288, -1099071824, 1051022760) + + W(3, -1103780951, 1038026111, -1144576488, 1034415069) + + W(4, -1107146278, 1045138183, 1006706653, -1098544246) + + W(5, 1035133548, -1101742889, 1040882462, -1110494113) + + W(6, 1042183330, 1015167422, -1110119411, -1114407921) + W(7, 1029794991, 1025810371, 1020673517, -1144644710) + + W(8, -1106326923, 1048594337, -1101264321, 1042439875) + + W(9, -1115149997, -1124355817, -1133994400, 1017843520) + + W(10, 1038375967, -1103059717, 1036901240, 1019390619) + + W(11, -1122256838, 1039002364, -1113322768, 1025775953); + sum2 = + W(0, 1007469645, 1024932078, -1123529450, -1106895484) + W(1, -1154152567, 1026396887, 1034932657, -1118589447) + + W(2, -1127684796, -1122451669, 934668744, 1046133075) + + W(3, 1050482770, -1100501045, -1112663810, -1145059796) + + W(4, 1026289720, 1029479215, 1048216767, -1101979386) + + W(5, -1086100405, -1104578417, -1110628430, -1120799353) + + W(6, -1134400734, -1114161855, -1092503803, -1118826374) + + W(7, 1054881826, 1054831843, 1037309396, 1034243151) + W(8, -1121586613, 1018968072, 1055026065, 1057475450) + + W(9, 1057991283, 1037697257, 1041220013, 1035239909) + W(10, 1012304630, 1018258842, -1105610792, -1091642753) + + W(11, -1094138317, -1097381938, -1108645190, -1109776821); + WS(1065106092, 1009251236); + sum1 = + W(0, -1127594260, 1015119794, -1105935716, 1030756271) + W(1, 1015463627, 1033714469, -1121831017, 1032817313) + + W(2, -1119086128, 1041681344, 1038033220, -1103164984) + + W(3, -1097628571, -1096661826, -1162082196, 1037645501) + + W(4, -1106710454, -1108480942, -1085761952, 1048660750) + W(5, 1062385221, 1057312254, 1045270286, 1038003425) + + W(6, 1041658930, 1053952044, 1059673337, 1035410928) + + W(7, -1083076739, -1097132616, -1100422942, -1134248242) + + W(8, 1028936149, -1098626929, -1106493133, 1042075767) + W(9, 1048795361, 1042769246, 1033263484, -1109564844) + + W(10, 999711717, -1128362792, 1030156593, -1105711219) + + W(11, -1109139763, -1109546740, -1128821631, -1113038632); + sum2 = W(0, 1026504012, -1115537349, 1004448402, -1120289237) + + W(1, -1116193727, 1023273402, -1106169890, -1116296115) + + W(2, -1111982251, -1109318355, -1126991046, -1114485349) + + W(3, 1031030421, 1036795295, 1038895038, 1037382021) + W(4, -1115575890, 1037274256, 1032461625, 1046084064) + + W(5, -1104386736, 1033981186, 1034486696, 1014573341) + W(6, 1025515301, 1036029355, -1105715099, 1035923056) + + W(7, 1039615788, 1034803763, -1111316562, -1126611440) + + W(8, 1038047283, -1140512157, 1031934837, -1127252256) + + W(9, 1008094609, -1108137243, 1013721630, -1109430807) + + W(10, -1121134093, -1118959675, 966777949, 1001443794) + + W(11, -1126229172, 999509622, -1115420717, -1121268263); + WS(1058235500, 1054922309); + sum1 = W(0, -1126843838, -1115091447, 1037063794, -1097782353) + + W(1, 1017345397, -1106496120, -1124168315, -1111050604) + + W(2, -1110452882, 1026999796, 1027596138, 1043595317) + W(3, 1026915457, 1051692426, 1033470169, 1047889704) + + W(4, -1096439037, -1109530936, -1126567064, -1080972858) + + W(5, -1087153329, -1092439359, -1096481402, -1101856358) + + W(6, 1054965252, 1035486938, 1052521111, 1054616871) + W(7, 1059777872, 1055199219, 1049045985, 1042302776) + + W(8, -1126708475, 1040994960, 1048136923, -1135709192) + + W(9, -1117730271, 1025849689, -1109862614, 1048178521) + + W(10, -1113819273, -1112039092, 1029145158, -1103625129) + + W(11, -1113712109, -1133876016, -1120397392, 1018059916); + sum2 = W(0, 1032658614, 1026047005, 1016793814, 979115576) + W(1, 1025048255, -1120340424, -1124528004, -1113479651) + + W(2, -1104671284, 1026757765, -1106565422, 1040092458) + + W(3, -1118382609, 1024555245, -1115048442, -1102456829) + + W(4, 1033357456, -1146410551, -1129670058, 1049738304) + + W(5, 1047130549, -1099524683, -1114147283, -1143577495) + + W(6, -1107649550, -1093450531, 1029536101, 1048902638) + W(7, 1043845633, 1031379649, 1015256822, 1032535412) + + W(8, -1107785448, 1045006287, 1032863350, 1031141497) + + W(9, 1024835039, 1016575718, -1115840886, -1140327483) + + W(10, 1014985523, -1108588814, -1114405495, 1032866808) + + W(11, -1128051766, 1011865867, 1016407002, -1121997281); + WS(1050344663, 1040331465); + sum1 = + W(0, -1119034750, 1027008397, -1123135107, 1034001074) + W(1, -1165785906, -1109811775, 1012082163, 1021442477) + + W(2, -1123846924, 1032620906, -1107606109, -1113228665) + + W(3, -1104523524, 1044228977, -1136436803, 1015486907) + W(4, 1038870821, -1145305726, 1045963311, 1055978044) + + W(5, 1061494191, 994921841, 1043858443, 1032566715) + W(6, 1016005498, -1104369525, -1101093248, -1091899011) + + W(7, -1089807144, -1100340494, -1113047285, -1121306753) + + W(8, -1113185550, 1047408652, -1106188838, 1019406818) + + W(9, -1133495032, 1039673315, 1003314783, -1110918342) + + W(10, -1180899430, -1117862216, 1031141157, 1025902913) + + W(11, 995937181, -1126170822, -1155810234, 1012720916); + sum2 = W(0, 1017323653, 983063098, -1124332548, -1136855038) + + W(1, 1038193266, -1115428487, 1037749325, -1162541650) + W(2, 1006857268, 1027629321, 1040636195, 1050922570) + + W(3, -1107256285, 1024268384, -1105738834, -1112368096) + + W(4, 1027026905, 1041250623, -1098379711, -1095854749) + + W(5, -1124475180, -1107079153, 1035306909, 1041041721) + + W(6, -1096858156, -1096058068, -1081757810, 1046692173) + + W(7, 1055388353, 1044471504, 1018283467, 1034757871) + W(8, 1057582691, 1069736593, -1098564102, -1092586095) + + W(9, -1101296593, -1099842491, -1130236866, -1116072515) + + W(10, -1108630874, -1103954988, 1039138402, 1040290673) + + W(11, 1026430908, -1135051275, -1127494735, -1128054004); + WS(1064629676, -1098084920); + sum1 = + W(0, 1033302207, 1017176603, 1043155505, 1036523218) + W(1, -1135635048, 1036902751, -1154473427, 1031815708) + + W(2, 1017516913, 986968687, -1093133598, -1136867787) + + W(3, -1099849236, -1112073298, 1015173986, -1108314079) + W(4, 1037844037, 1048067236, 1059745345, 1054752956) + + W(5, 1054803234, 1049105955, 1045303547, 1049045791) + W(6, 1004101612, -1094217842, -1107275372, -1083111259) + + W(7, 1036740290, -1089373007, 1007182507, -1096296960) + + W(8, -1100831258, 1032944847, -1118901210, -1111571193) + + W(9, -1104247276, 1044914424, 1032262742, 1028425028) + W(10, 1023773169, 1036346276, -1109611315, 1036061697) + + W(11, -1130856180, -1178541510, 1028817260, -1121119813); + sum2 = + W(0, 1031116538, 1018758860, -1093507837, -1142239225) + W(1, 1008547208, -1115133937, 1037272918, -1116833334) + + W(2, -1106561538, 1041892626, 1060901401, -1094547881) + W(3, 1048344650, -1106548880, 1031802380, 1032935937) + + W(4, 1041324255, -1122918288, -1090730175, 1059998586) + + W(5, -1105692057, -1107738784, -1109731964, -1105354579) + + W(6, -1097318271, 1050772655, -1089173269, 1050575163) + + W(7, -1105982083, 1062167006, -1115007264, 1051274636) + + W(8, 1038093550, -1113042451, -1103574570, -1096117806) + + W(9, 1045224094, -1093777588, 1040225760, -1097190188) + W(10, 1003684433, 1005733025, 1036702490, 1007559836) + + W(11, -1111284039, 1032209739, -1119496571, 1039213738); + WS(1059570988, -1104849743); + sum1 = W(0, 1015935639, -1114327981, 1032097032, -1100671580) + + W(1, -1118415719, -1146837726, -1128662677, -1106017873) + + W(2, -1105217736, -1117057793, 1045549308, 994695167) + W(3, 1019924475, 1044124420, -1133264506, 1026902699) + + W(4, -1100062838, -1095539196, -1097913193, -1081463016) + + W(5, -1088685699, -1103538521, -1090424260, -1096642336) + + W(6, 1055580097, 1051203348, 1057098153, 1065307314) + W(7, 1060408535, 1060044676, 1048658511, 1058793797) + + W(8, -1114680436, -1104422643, 1035503236, -1100709080) + + W(9, -1100882497, -1127513406, -1106885414, -1112552037) + + W(10, 1027695934, -1122995670, 1026067698, -1115820943) + + W(11, -1121911751, 1040976712, -1109730008, 1032897105); + sum2 = W(0, -1101738300, 1026251680, -1096487254, -1097132336) + + W(1, -1103125896, -1098301296, -1145491968, -1102991820) + + W(2, -1102635520, 1042860418, -1118004862, -1097577131) + + W(3, 1034939290, -1107323885, 1046219299, -1101571742) + W(4, 1049960021, 1045813894, 1012147620, 1062244087) + + W(5, 1030928730, 1018590462, 1042676852, 1048890187) + W(6, -1107186076, 1037904592, -1101520598, 1050699569) + + W(7, -1118944274, 996952385, -1132230456, -1120981264) + + W(8, 1031463651, 1043360780, -1099464580, 1042220045) + + W(9, -1129575892, -1143727552, 1038679603, 1022002534) + + W(10, -1109595133, 1032162510, -1144663840, 1017587638) + + W(11, -1122088198, -1112243029, 1028948530, -1108091801); + WS(-1095386967, -1111219145); + sum1 = W(0, 989878260, -1130549149, 1027494660, 1027516453) + W(1, -1138329195, 1029536895, 1016226972, 1031794584) + + W(2, 1046105185, -1114353482, -1126247292, -1101798869) + + W(3, -1109199416, -1149170463, -1110945897, 1041043200) + + W(4, 1042696371, 1044731284, 1059356463, 1066759339) + W(5, 1060963410, 1056388995, 1052477254, 1048385630) + + W(6, -1089927208, -1092958347, -1090136954, -1086407791) + + W(7, -1086208082, -1087382795, -1099705531, -1090430272) + + W(8, -1127509006, 1029760895, -1123276603, -1134143337) + + W(9, 1037957160, 1028489291, 1033794703, -1116367629) + W(10, 1030962098, 1015099027, 1002268463, 1008759050) + + W(11, 1030926587, 1024487352, 1027177352, -1155852515); + sum2 = + W(0, 1037152773, -1155239869, -1110337901, 1031799544) + W(1, -1115579003, 1027082675, -1125050611, 1027786160) + + W(2, -1107393101, -1118272906, -1121008946, 1040803769) + + W(3, 1040826838, -1129277077, 1044810576, -1128372019) + + W(4, -1107499267, -1123365743, 1053226346, -1091451910) + + W(5, 1036591998, 984589146, -1111221822, -1115106721) + W(6, -1071982339, -1066777138, 1065602467, 1078719649) + + W(7, 1072207876, 1012365693, -1114663567, 1027240586) + W(8, 1050177526, -1099174901, -1114100047, 1051522302) + + W(9, -1112448128, 1036247818, 1024897040, 1010421237) + + W(10, 1034063245, -1111285661, -1111810642, 1032887971) + + W(11, -1105619991, 1027337883, -1128259763, -1110086921); + WS(-1090330604, -1095913405); + sum1 = W(0, 1020138108, -1123891981, 1027835331, -1104251929) + + W(1, 1036891437, -1115340623, 1034060158, -1111402939) + + W(2, -1155846064, -1158857313, 1042832881, 1026174194) + + W(3, 1041459232, -1107002233, 1043482052, -1101325435) + + W(4, -1089580553, -1099259748, -1086143680, -1083565678) + + W(5, -1087459168, -1094838563, -1096454718, -1097944271) + + W(6, 1060107168, 1041623909, 1061453552, 1065434151) + W(7, 1058328348, 1058061687, 1046178603, 1056232524) + + W(8, 1026904097, 1034391623, -1115844409, -1108664129) + + W(9, -1103857816, -1108388469, -1124051644, -1124315511) + + W(10, -1129005794, 1027969480, -1126805065, 1015124739) + + W(11, -1133565543, 1018898230, -1128371111, 1016813002); + sum2 = + W(0, -1123501879, 994818552, 1024190209, 1026428551) + W(1, -1113685733, 1033345966, -1113104927, 1032770548) + + W(2, 1032645553, -1106534525, 1041404870, -1104982451) + W(3, 1042593674, -1115833227, 1034301013, 1019409377) + + W(4, 1031823713, 1055123028, 1003420836, -1080276792) + W(5, -1127504591, 1051480126, -1116624943, 1017007809) + + W(6, 1073269342, 1086127434, -1097366650, -1064048639) + + W(7, -1073275019, -1090368136, 1039074558, -1104405577) + + W(8, 1039470942, -1106004733, 1048036108, 1029604730) + W(9, -1102930579, -1127043711, 1016207563, 1023925896) + + W(10, -1134706270, -1108902493, -1131894299, 1040747994) + + W(11, -1114192145, 1028687353, -1110363669, 1028902826); + WS(-1090401964, -1152005757); + sum1 = W(0, -1107975723, 1027213860, -1098681011, 1041527967) + + W(1, -1104614908, -1117487349, -1139447119, -1114124023) + + W(2, -1110378885, -1114833045, -1110030634, -1088517567) + + W(3, -1108968043, -1117626874, 1013150495, -1107640642) + + W(4, -1108756369, -1095679285, -1106296032, 1070380432) + + W(5, -1108442736, -1098750614, -1103582017, -1109258534) + + W(6, 1036253290, -1126602324, 1055690689, 1071039479) + W(7, 1052643167, 1027420045, 1037720897, 1028231256) + + W(8, -1114963960, 1031108853, -1100045596, -1089232274) + + W(9, -1099409217, -1149243844, -1112117145, 1004205268) + + W(10, -1113670180, -1122691487, -1107558750, 1041737494) + + W(11, -1114805320, -1114809497, -1129003237, -1115685308); + sum2 = W(0, 1032241318, -1099535875, 1055385702, -1088862448) + + W(1, 1049303281, -1109469239, -1107728961, -1128383244) + + W(2, -1104603794, 1042476400, -1090035137, 1058560544) + + W(3, -1088861159, 1052772694, -1098593341, 1040732759) + + W(4, -1110024851, 1036274242, -1088795135, 1070638870) + + W(5, -1093985609, -1106832655, 1040915158, -1094544594) + + W(6, 1040884292, -1098717699, 1054345172, 1049287225) + W(7, 1045145516, 1028821082, -1095210561, 1053404675) + + W(8, -1102517567, 1017815860, -1094964358, 1049908300) + + W(9, -1104972980, -1121780800, 1046695263, -1097835418) + + W(10, 1041491703, -1106264274, 1050847172, -1097728340) + + W(11, -1120926078, 1040141480, -1097969166, 1042680505); + WS(-1070853435, -1079594702); + sum1 = + W(0, 1031368074, -1129832370, 1034753191, 1015854174) + W(1, 1034404179, 1016952500, -1121119193, 1030231874) + + W(2, 1015638464, 1041167744, 1035847262, -1103546680) + W(3, -1113675090, 1024462894, 1024493276, -1128491667) + + W(4, -1114370347, -1117069532, -1123068615, 1064504443) + W(5, 1061831318, 1053421228, 1039689052, 1047845552) + + W(6, -1115839497, -1102391672, -1103157041, -1091637800) + + W(7, -1080200908, -1096184888, -1127920108, -1114780422) + + W(8, -1115223191, 1027397066, -1112317379, -1115479934) + + W(9, 1034003429, 1024063661, 1021986479, -1108195108) + W(10, 1032466078, 1017764904, 1032880216, -1129698458) + + W(11, 1015162251, -1140051844, -1133040549, -1121925385); + sum2 = W(0, -1106137478, 1043473407, -1106937584, 1026389244) + + W(1, -1112665680, 1037682857, -1122471729, -1132137458) + + W(2, -1112484873, -1102332364, -1092913054, -1107744995) + + W(3, -1097742336, 1043622402, 1020098037, 1022975237) + W(4, 1057355655, -1095817987, 1065744344, 1065853704) + + W(5, -1081387458, -1127502696, -1107102958, -1141866869) + + W(6, 1035747177, -1115086293, 1023360745, 1072123343) + + W(7, -1079419356, -1106562006, -1106082519, -1126279403) + + W(8, -1121112608, -1132505032, -1113186427, -1092294539) + + W(9, -1121542644, 1037780507, 1042075138, 1036152561) + + W(10, -1111886750, 1028632460, -1106034045, 1034294011) + + W(11, 1024287965, 1025382780, 1002478149, -1184105122); + WS(1049779927, -1112776705); + sum1 = + W(0, 1028071903, -1114011991, 1029458468, -1119065733) + W(1, -1132325110, 1021654911, -1140102008, -1114327724) + + W(2, -1118237477, 1043483133, 1007633232, 1035764138) + W(3, 1035328577, 1034435922, -1138188744, -1122000063) + + W(4, -1102803275, -1098367878, -1088820906, -1094340312) + + W(5, -1080604425, -1090240908, -1148292210, -1113705707) + + W(6, 1029391902, -1104983021, 1052808064, 1066199650) + W(7, 1053987355, 1056392483, 1036299814, 1048826612) + + W(8, 1034486619, 1030141823, 1041927295, 1028311666) + W(9, -1120802495, 1033716813, -1137351220, 1019304377) + + W(10, -1146402448, 1024272361, -1136262168, -1116603171) + + W(11, 1022508086, -1120600656, -1178578023, 1020743116); + sum2 = + W(0, 1032570045, -1105084280, 1038138439, -1106537061) + W(1, 1040196930, -1115643975, 1030892929, -1115802712) + + W(2, 1038214390, 1026252154, 1040403525, -1094267982) + W(3, -1111441511, -1113353460, 1041615042, 1045634969) + + W(4, -1105258373, 1013797397, -1089116471, 1076181184) + + W(5, -1077048432, 1025617857, -1099622062, 1030853641) + W(6, 1049712324, -1092505394, 1060934721, 1059180753) + + W(7, -1094660144, -1116351798, -1112051433, 1036834683) + + W(8, -1104412018, -1106628914, -1095609080, -1100140938) + + W(9, -1105239307, 1035183993, -1108612586, -1126459673) + + W(10, -1123221706, 1042796766, 997194667, 1031304969) + + W(11, 1025898916, -1113508292, 1036578837, -1114596985); + WS(1046079918, -1101410372); + sum1 = W(0, -1119247786, 1028420729, -1112243383, 992275696) + + W(1, -1122025413, -1106451742, 1031954516, -1132155589) + + W(2, -1128322399, 1041896248, -1105916230, 1048641796) + + W(3, -1106854731, 1031954663, 1008473970, -1111364501) + W(4, 1042510685, 1041276767, 1052547749, 1049660162) + + W(5, 1058242473, 1042746961, 1045913078, 1038481040) + W(6, 1040172212, 1029165630, -1093769957, -1086983984) + + W(7, -1090223605, -1101840568, -1131429676, 1034663574) + + W(8, -1102544268, 1023180436, -1094151845, 1051181214) + + W(9, 1034028133, 1035662026, -1136064862, -1123376855) + + W(10, -1115138862, 1035447066, -1116787216, -1126725978) + + W(11, 1020616971, -1106918309, 1031591591, -1113758304); + sum2 = W(0, -1141998719, -1145824639, 1031031156, 1020781312) + + W(1, 1022361784, 1035727822, -1106658345, 1018984000) + + W(2, -1109775790, -1114337335, 1035421278, -1094152732) + + W(3, 1019796096, -1109500163, -1126048860, -1133379360) + + W(4, 1044487768, 1032184652, -1118695686, 1023745864) + W(5, 1018742928, 1044822196, 1018234504, 1040264262) + + W(6, -1123003936, -1105393491, 1043275908, 1060925239) + + W(7, 1035441608, -1129786704, -1154747838, -1114483694) + + W(8, -1128896096, -1105870753, -1123077850, -1116720242) + + W(9, 1005384511, -1106753069, -1109895735, -1115363912) + + W(10, -1116651188, 1028260552, -1117301622, -1118185274) + + W(11, -1111756371, 1028382728, -1112885074, 1013789936); + WS(1065850966, 1065849900); + sum1 = W(0, -1148044715, 1016251913, -1121600570, -1122606683) + + W(1, -1119487441, -1123929445, 1022387720, -1113618935) + + W(2, 1023026535, 1037817733, 1025496281, 1030608138) + W(3, 1035148220, 1038603949, 1040789578, 1029056085) + + W(4, -1096615656, -1090259708, -1086496425, -1089114938) + + W(5, -1087399018, -1089721837, -1091666965, -1090055623) + + W(6, 1051437895, 1044690723, 1060547800, 1067874188) + W(7, 1061971613, 1051923078, 1020371139, 1050691807) + + W(8, 1037565454, 1031445334, -1123828273, -1103278290) + + W(9, -1103477215, 1017932657, 1017045638, 1041207209) + + W(10, 1009078433, -1134993406, -1122338716, 961099943) + + W(11, -1115158089, -1152593000, 1017681054, 1032486406); + sum2 = + W(0, 1035054009, -1100085534, 1050236106, -1106312974) + W(1, 1040394388, -1111006317, -1122528690, -1120327060) + + W(2, 1029203106, 1055497340, -1099101530, -1091493710) + W(3, 1035688516, -1100130836, 1051271785, 1037370697) + + W(4, -1095822387, -1094806083, -1112580467, 1065636371) + + W(5, 1057422694, 1038056034, -1090043318, -1101753600) + + W(6, -1096883389, 1022251406, -1105263591, 1066985993) + + W(7, 1050729384, -1113669663, -1109365057, -1098907474) + + W(8, -1106861506, 1025821768, -1099047212, -1090221894) + + W(9, 1040303734, -1095697855, -1132012078, 1042447412) + + W(10, 1003858895, -1141198631, 1038164225, 1007864647) + + W(11, -1131632326, 1034223408, 1022279531, -1111449439); + WS(-1097113303, -1098536273); + sum1 = W(0, -1128711506, 1001100740, -1116245678, -1123204686) + + W(1, -1122390725, 973480529, -1135175840, -1112078369) + + W(2, 1026190055, -1129782332, 1036959597, 1010531062) + W(3, 1040533155, 1032146359, 1016950072, -1115082484) + + W(4, -1089449919, -1090119792, -1089233276, -1088111001) + + W(5, -1083999320, -1100399617, -1096337083, -1098983064) + + W(6, 1051085133, 1054274400, 1059231684, 1068549146) + W(7, 1060528017, 1051645044, 1021720363, 1056811397) + + W(8, 1039600836, 1006971045, 1035061810, -1106500579) + + W(9, -1110173729, -1118570949, -1105366950, -1163217111) + + W(10, 1017357112, -1151099700, 1008174399, 1027830380) + + W(11, -1118330949, -1138008953, -1113983621, -1114515356); + sum2 = W(0, -1126544110, -1106788080, -1123763395, 1031886252) + + W(1, 1019879781, -1106896864, 1025236903, -1103198659) + + W(2, 1057867675, 1045040387, -1116688865, 1008770068) + + W(3, -1111977015, -1104133845, -1123575137, -1095297610) + + W(4, -1084782762, -1103936041, -1096694543, 1065118928) + + W(5, -1120781351, -1094413904, 1055216743, 1063595180) + + W(6, -1101472514, -1095964817, 1033632512, 1070094219) + + W(7, -1093909441, -1091348732, -1087869152, -1101379604) + + W(8, 1046930113, 1060484868, -1098897900, 1055777327) + + W(9, -1105350592, -1098592917, 1032159773, -1090856164) + + W(10, 1047938716, -1116398073, 1033301960, -1112910333) + + W(11, -1132175940, 1028498658, -1111429301, -1148399072); + WS(-1088872108, 1052196610); + sum1 = + W(0, -1115772244, 1026268067, 1022683057, -1119255225) + W(1, -1126845407, 1018606696, -1122729971, -1119390253) + + W(2, -1114837443, -1111544357, -1104977249, -1110507588) + + W(3, -1124752108, -1106979958, -1118779367, 1032957370) + + W(4, 1040729928, -1129315660, 1050293045, -1115663356) + W(5, 1055556797, 1038400791, 1043464385, 1010467373) + + W(6, 999143576, 1051137549, 1050616762, -1123488747) + W(7, -1107532492, -1115698508, -1106851872, 1013947482) + + W(8, 1035543595, -1115388138, -1110255664, -1102766242) + + W(9, -1115121626, -1111362474, -1114761165, -1127308771) + + W(10, -1109636323, -1138847608, -1148093909, -1113579532) + + W(11, 1031428336, -1123058305, 1024891874, -1117161611); + sum2 = + W(0, 1021571414, 1005045849, 1032761087, -1131955840) + W(1, 1002892889, -1113636159, 1017257782, -1116947723) + + W(2, -1136485425, -1108696907, 1015124882, -1109877489) + + W(3, 1050593712, -1105061066, 1027289415, 1035889263) + W(4, 1033792089, 1026572719, -1097148617, -1072841573) + + W(5, 1051731235, 1040799594, 1025178361, 1033387155) + W(6, 1044650880, 1068805535, 1072674603, -1073632622) + + W(7, 1040667946, -1114163718, 1033059623, -1113785952) + + W(8, -1111938281, 1042295210, 1053858128, -1114078156) + W(9, 986622244, -1105514756, -1131411966, 1024784261) + + W(10, -1111133361, 1015874538, -1115667125, 1025743417) + + W(11, 1029743517, -1150165522, 1028606721, -1131685126); + WS(1059574956, -1147706177); + sum1 = W(0, -1126851274, 1032992154, 990365335, 1021792788) + W(1, 1014654722, 1023708133, 1021433863, 1024270494) + + W(2, -1107330821, -1114850125, -1111585801, 1025219833) + + W(3, 1042448198, 1041111834, 1028566264, 1025900485) + W(4, 1039522745, 1036915515, 1058476188, 1057257569) + + W(5, -1130368142, -1087441640, -1103664757, -1101532519) + + W(6, -1101979721, -1103811902, -1091594576, -1102147871) + + W(7, 1049911159, 1046832311, 1042912388, 1034347764) + W(8, 1039509326, 1037543219, 1044635632, 1015035920) + + W(9, -1098033363, -1103709614, -1112635561, -1106561201) + + W(10, -1113513772, -1122830319, -1115799180, 999411009) + + W(11, 1008106627, 1030688938, 998865060, 1033251158); + sum2 = W(0, 1030668111, -1138525905, -1118095530, 1046358820) + + W(1, 1026007575, 1036395993, 1044323398, -1102154889) + + W(2, -1100054904, -1127093272, -1104427366, -1094333916) + + W(3, -1098434999, -1114547879, -1098255510, 1043811931) + + W(4, -1106823977, -1118630721, -1104404781, 1066330506) + + W(5, 1032956568, -1089680445, -1118009606, -1104253130) + + W(6, 1038847176, 1023505668, 1055088734, 1059364463) + W(7, -1109156363, -1102029714, 1019564502, 1042217401) + + W(8, 1045749759, -1100949461, -1106737563, -1115593085) + + W(9, -1105827255, 1014767972, -1114455410, 1033201092) + + W(10, -1139922314, -1137789612, 1025350194, -1118124817) + + W(11, 1044080198, -1111415597, 1034872747, -1116871429); + WS(1056332375, 1037816258); + sum1 = W(0, -1121656782, -1121854558, 988019291, 1027294260) + + W(1, -1141230927, -1146196851, -1124586778, -1119789479) + + W(2, -1103168373, -1112652978, 1032694229, 1032971073) + + W(3, 1036051832, 1029047507, -1138159876, -1116156558) + + W(4, -1119737691, -1116096096, -1099471067, -1088930875) + + W(5, -1088040995, -1094038173, -1105369135, -1100717841) + + W(6, 1044637987, 1045017865, 1051843657, 1058468850) + W(7, 1059943427, 1054278049, 1040438911, 1052440082) + + W(8, 1028439953, -1108613751, -1124711667, -1105155884) + + W(9, -1110648631, 1023373473, -1109090662, -1121068380) + + W(10, -1147698697, 1015231409, -1126623722, 1025720722) + + W(11, -1125643860, 1025459107, -1140770656, 1033302707); + sum2 = W(0, 1037403217, 1056969468, 1057593955, 1065979451) + W(1, 1052219437, 1048107842, 1012201018, 1034400525) + + W(2, -1101035659, -1090106390, -1080354518, -1077736273) + + W(3, -1095104394, -1110113632, 1035332836, 1036232380) + W(4, 1032316963, 1038083410, 1060881997, 1057826659) + + W(5, 1040943565, -1093495590, 1023246776, -1105354500) + + W(6, -1116665707, -1119459300, 1028006921, -1093367622) + + W(7, 1050471411, -1098889696, 1037291810, -1172133380) + + W(8, -1159849898, 1009385423, 1038355181, -1108823981) + + W(9, 1028403474, 1041580846, -1108503511, 1023204972) + + W(10, 1025618366, -1128266716, -1107076145, 1040978108) + + W(11, -1107763897, 1031803963, 1028340263, -1124125618); + WS(1057728492, -1114894260); + sum1 = W(0, -1113553553, -1129994721, -1116323110, 1032700067) + + W(1, 1022553594, -1174372438, 1025649872, -1204938694) + + W(2, -1137973853, 1032124939, 1038491142, 1042214629) + + W(3, -1102850457, -1103814977, -1108835354, -1117610625) + + W(4, 1030725486, 1023297510, 1042012404, 1063322480) + W(5, 1049455560, 1038337085, 1036180712, 1041170774) + + W(6, 1027451936, 1039175515, -1096381204, 1002639809) + + W(7, -1095884801, -1099447670, -1107257155, -1110131186) + + W(8, 1024408310, -1104644784, -1098358292, -1097199096) + + W(9, 1038368473, 1041557913, -1143485305, -1139346043) + + W(10, -1122023828, 1015759447, -1129065232, 1025211173) + + W(11, -1119912573, -1120935138, 1022194670, -1131327617); + sum2 = W(0, -1132724746, -1125894137, 1008401986, -1123753553) + + W(1, 1028568703, -1129573217, -1115138968, -1129237393) + + W(2, -1136277690, 1023794749, 1034921985, -1135255538) + + W(3, -1095862669, -1103833757, 989975657, -1117578737) + + W(4, -1115335750, 1019650853, -1111489002, 1065003137) + + W(5, 1042205114, -1104966989, 1028245440, -1137003202) + + W(6, -1142062564, -1102896527, -1095970428, 1052274635) + + W(7, 1050282098, 1039075981, -1124502561, 1029353869) + + W(8, -1111737990, 1036465851, -1093339450, -1130345777) + W(9, 961646223, -1123958953, 975314596, 981021860) + + W(10, 1021138001, -1117376889, 1036367329, -1114642052) + + W(11, 983274770, -1121876761, -1131382405, -1129104973); + WS(1064957100, -1084259623); + sum1 = W(0, -1147443767, 1002237105, 1042679235, 1025036588) + W(1, 1039980881, 1039876787, -1122119878, 1046679440) + + W(2, 1048172674, 1022388856, -1111985505, -1105536623) + + W(3, -1111204540, -1118973740, -1115201293, 1036937851) + + W(4, 1050085746, 1049301459, 1061123934, 1059891343) + W(5, 1063082922, 1059164422, 1050147791, 1052477312) + + W(6, -1087174820, -1096483251, -1084863818, -1085360136) + + W(7, -1087496217, -1085023864, -1099749261, -1093770425) + + W(8, -1110620477, -1130736462, 1036594273, -1096717087) + + W(9, 1049051417, -1098175193, 1038851310, -1094492881) + + W(10, 1041967934, 1032395752, 1029284270, 1027822410) + + W(11, 1038157169, 1033526682, 1035926782, 1040430103); + sum2 = W(0, 1043574668, -1110691764, -1103083598, -1104224219) + + W(1, -1111324648, 1045365848, -1123650350, 1040472402) + + W(2, -1079200674, -1088609636, -1104512784, 1072315297) + + W(3, 1071717488, 1074062948, 1072927288, 1075518858) + W(4, 1070660923, 1057860954, -1107138551, -1092267131) + + W(5, -1073631870, -1072626825, -1076777698, -1068851440) + + W(6, 1052128984, 1049301959, -1106877192, -1082025998) + + W(7, -1098154139, 1060924493, 1055782129, -1085268633) + + W(8, -1102512316, -1119415890, -1099577256, 1048136354) + + W(9, -1101281480, 1049098296, 1053482338, 1045375219) + + W(10, -1114631788, -1111966430, 1025811761, -1120067756) + + W(11, -1097839567, 1046934152, -1142912019, -1113956244); + WS(-1075237718, 1059347685); + sum1 = W(0, 1021242911, 1033512399, 1029870036, 1022930282) + W(1, 1032776022, 1018371807, 1019954077, 1033340372) + + W(2, 1049968737, -1159856274, 1035044013, -1122614884) + + W(3, -1113136009, -1134430929, -1114025505, 1040742208) + + W(4, -1123217820, 1052611492, 1055398719, 1061884279) + W(5, 1059035017, 1058365139, 1054270736, 1057072208) + + W(6, -1100043508, -1096977477, -1086974821, -1081627821) + + W(7, -1085989237, -1083853344, -1094951367, -1082038839) + + W(8, -1123750750, 1035058824, -1111424357, 1035852049) + W(9, 1046594056, 1040835864, 1036293471, 1043435581) + + W(10, 1039650209, -1164938034, 1031585078, -1146263191) + + W(11, 1040828171, -1113397210, 1041271429, -1112152131); + sum2 = W(0, -1109418256, 1045686709, 1025535098, 1041368995) + W(1, 1025255906, 1045341483, -1131647237, 1050563248) + + W(2, -1082007392, -1092895857, -1097230803, -1087580936) + + W(3, -1090709237, 1030380818, -1098811123, -1122444474) + + W(4, 1074622373, 1045059925, 1022527077, 1072979117) + + W(5, 1059630355, -1082271661, -1098333373, -1080249300) + + W(6, -1087167323, -1090791673, 1061750517, 1066822104) + + W(7, -1104688853, -1098772696, -1097425000, 1035536875) + + W(8, -1079889153, 1052961109, -1094791227, -1121141584) + + W(9, -1114952578, 1048788253, -1109808864, 1062091865) + + W(10, 1054843717, -1111299754, -1097908774, 1039933817) + + W(11, -1109459004, 1032974905, 1041274025, -1101634861); + WS(-1073405707, 1071333561); + sum1 = W(0, 1032445482, -1114759602, 1009365348, -1116673978) + + W(1, -1140494528, -1138343378, -1164102249, -1128324122) + + W(2, -1107154225, 1043648434, 1025826187, 1050217769) + W(3, 1045274198, 1041826370, 1037855412, 1036590066) + + W(4, -1086616986, -1097373989, -1088696011, -1084271170) + + W(5, -1086550017, -1088202787, -1096484208, -1090407429) + + W(6, 1053035442, 1049497533, 1058380737, 1057270871) + W(7, 1060414079, 1054213138, 1049814032, 1044502774) + + W(8, 1037191452, -1113096234, 1042579156, 1027100008) + + W(9, -1122447285, 1033632004, -1117413058, 1049279047) + + W(10, 1005358651, -1140703610, -1147371482, 1008260703) + + W(11, -1128134433, -1146407565, -1132301012, 1030979244); + sum2 = + W(0, -1104849756, -1130309268, 1032168017, 1006608216) + W(1, 1025939811, -1116205504, -1134020588, 1015836550) + + W(2, 1044778147, 1042344095, -1115874267, 1016899230) + W(3, 1015318926, 1017541078, 1025032291, -1134707560) + + W(4, 1087011564, 1065552014, -1071484991, -1064792716) + + W(5, -1108487910, -1111002668, 1026184365, -1105554232) + + W(6, 1051692028, 1050304642, -1095624232, -1080996320) + W(7, 1038353709, 1015541566, -1115175630, 1035428553) + + W(8, -1115275477, 1012814276, 1034711867, 1012706900) + W(9, 1031018877, 1017981722, 1016059306, 1030487759) + + W(10, 1024288807, -1122813731, 1018071134, -1113948677) + + W(11, 1039145567, -1121567210, -1161414849, 957459976); + WS(-1093094231, 1019545057); + sum1 = W(0, -1147370279, -1111661690, 1036370005, -1130128916) + + W(1, -1138886402, -1114353490, -1139052495, -1123566046) + + W(2, 1024662611, 1043371102, -1098598749, -1121967929) + W(3, 1034324947, 1030255498, 1020719663, 983686292) + + W(4, 1045730364, 1007712219, 1063151515, 1048771569) + W(5, -1102866212, 1043747359, 1042970997, 1044423271) + + W(6, -1100871081, -1103400446, -1086049630, -1094208743) + + W(7, 1057052051, -1103168823, -1114366281, -1105757546) + + W(8, -1113292876, -1125293706, 1038700136, 1042591246) + + W(9, -1109292474, 1040829042, -1113681601, -1119014482) + + W(10, -1115285964, 1035921815, -1106696483, 1031896756) + + W(11, -1117085921, -1117982022, 986496271, -1116127556); + sum2 = + W(0, 1017737448, -1112488549, 1041909593, -1119128646) + W(1, 995222883, -1138532089, -1122958336, 1002378369) + + W(2, -1113949677, 1043174240, -1095542187, -1123930650) + + W(3, 1011641777, 1043431269, -1133447353, 1011720393) + W(4, -1109074925, -1099690943, 1055357640, 1063813292) + + W(5, 1029075282, -1111808055, -1121958092, -1111615901) + W(6, -1106456753, 1036040708, 990810979, 1064786485) + + W(7, -1080550900, -1099317256, -1111251400, -1122017034) + + W(8, 1033894674, -1136025401, 1036060652, -1095508468) + W(9, -1096849813, 1042059844, 1031456264, 1041840135) + + W(10, 1002006465, -1127095326, -1106928479, 1041202855) + + W(11, 1028541984, 1013308785, -1130037494, 1011740497); + WS(1065464534, 1066200435); + sum1 = W(0, -1120929867, 1037468205, -1104046500, -1118049328) + + W(1, 1026495526, -1102710553, 1047356358, -1104379061) + + W(2, -1114034816, -1098649416, 1044270480, 1030873567) + W(3, 1027018036, 1029661039, 992085460, 1014898857) + + W(4, -1093428139, -1095417420, -1095455089, -1078956988) + + W(5, -1097112752, -1090364038, -1098761015, -1089997432) + + W(6, 1053507241, 1053719708, 1059517274, 1062996894) + W(7, 1062358792, 1051059848, 1053033759, 1058137077) + + W(8, 1039630850, -1117479019, -1116571174, 1037682987) + + W(9, -1100052716, -1134398359, -1124964177, -1119205176) + + W(10, 1039737375, -1104296205, 1034668025, 1027940302) + + W(11, -1105628906, 1047874257, -1105711476, 1036556777); + sum2 = W(0, 1052570920, -1096757231, 1032706704, 1048916325) + W(1, 1032567852, 1027784571, -1123035498, 1032789056) + + W(2, -1079960756, -1072214843, -1067716640, -1071149720) + + W(3, -1113086642, 1026889523, -1102782368, -1113248449) + + W(4, 1059860803, 1077140634, 1078085184, 1074719494) + W(5, -1126012658, 1023965646, 1033915049, -1131155204) + + W(6, 1024102895, 1045135233, 1007395147, 1048879105) + + W(7, -1105291454, -1125605772, 1036400237, -1120868355) + + W(8, -1109439044, -1135125103, 1039504993, -1119420973) + + W(9, 1042487387, -1107726802, 1040624471, -1123377002) + W(10, 1028585912, 1026412089, 999691338, 1031274943) + + W(11, -1115876939, 1031655696, -1118021143, 1033633154); + WS(-1088460652, -1077196042); + sum1 = W(0, -1106714405, 1012745873, -1106817926, 1014233321) + + W(1, -1139695810, -1112340330, -1112616426, 1014140598) + + W(2, -1126618358, -1104692362, -1128320455, -1113350277) + + W(3, -1104636978, -1111992333, -1112151140, -1103199781) + + W(4, -1100538888, -1105672234, -1096420642, 1032760733) + + W(5, 980853696, -1098221750, 1032069058, -1124202648) + W(6, 1061836401, 1049398341, 1063373516, 1062672955) + + W(7, 1040237156, 1049303442, -1115352833, 1047738902) + + W(8, -1105561066, -1107347643, -1095103574, -1104500106) + + W(9, -1136108756, -1098848505, 1028357771, -1108236605) + + W(10, 1017778831, -1107815087, 1021813111, -1130991024) + + W(11, 1015562593, -1124042178, -1117430379, 1024298444); + sum2 = + W(0, 1042942941, -1103739979, 1021675082, 1031504716) + W(1, -1103784377, 1021140017, 1032312275, -1113021145) + + W(2, -1095373315, 1042549384, -1100136800, 1032277385) + W(3, 1051314558, -1097536524, 1033748340, 1006926454) + + W(4, 1047404354, -1104635751, -1156628070, 1056265483) + + W(5, -1086627236, 1056610233, -1097748456, 1032415346) + W(6, 1041600542, 1049880149, 1042313351, -1095000083) + + W(7, 1058671506, -1087499329, 1053303874, -1106742186) + + W(8, 1029337611, -1113660916, -1103511888, 1052284225) + + W(9, -1098025422, 1053296214, -1097031052, 1040224097) + + W(10, -1116792463, 1033409028, -1100575516, 1042607543) + + W(11, -1102539848, -1123811627, 1034071897, -1116904421); + WS(-1090190636, 1052333694); + sum1 = W(0, -1118008162, 1017370722, 1028313190, 1032465571) + W(1, 1021024634, 1022145795, 974396430, 1023704762) + + W(2, 1046164882, 1025512151, 1039176172, -1140639831) + + W(3, -1114523818, -1123803590, -1114987978, -1150325779) + + W(4, -1087764995, -1107299674, -1107276920, 1054861041) + + W(5, 1048774281, 1052546887, 1033108808, 1052242867) + W(6, 1050774996, -1113611419, 1042980645, -1104478910) + + W(7, -1116066086, -1088290914, -1101829203, -1082760046) + + W(8, -1132114980, -1133738119, 1016759930, 1039228938) + W(9, 1029146129, 1046828701, 1025239231, 1050382392) + + W(10, 992812356, -1143374172, 1031741320, 991966796) + + W(11, -1131726971, -1135053738, -1135839572, -1117633184); + sum2 = W(0, -1112927492, 1000278501, -1115114722, 1038568093) + + W(1, -1107752992, 1036864823, -1111435217, 999311589) + + W(2, -1126311221, -1112124316, -1096516945, -1095439368) + + W(3, 1035770391, -1173738153, -1127749525, -1118042174) + + W(4, -1124129707, 1030656727, 1062718459, 1069168233) + + W(5, -1092856910, -1097729376, -1108466839, -1106807928) + + W(6, -1089259297, -1136644755, -1089907054, 1066488720) + + W(7, 1057602472, -1119016562, 1028769031, -1101412503) + + W(8, -1121960162, -1119195008, -1113085858, -1108783853) + + W(9, -1101947316, -1105922885, -1119106133, -1119408565) + + W(10, -1127721129, -1143597573, 1010259715, 1016497897) + + W(11, -1142073349, 1034450025, -1113345821, -1121786357); + WS(1050584535, 1068150000); + sum1 = + W(0, -1115260532, 1010165469, -1112895478, 1003680362) + W(1, 1038151522, -1113655284, -1132334157, -1116596385) + + W(2, 1034938395, -1115625742, 1043729220, 1046586119) + W(3, -1096382429, 1036369142, -1110737789, 1020311663) + + W(4, 1038987194, 1047833470, -1102791097, 1053057826) + W(5, 1060286702, 1031810112, 1033665067, 1045919272) + + W(6, -1117589351, -1104527215, 1041775364, -1092950416) + + W(7, -1085160955, -1099697720, -1112334730, -1112800213) + + W(8, -1115913835, -1116485512, 1035117570, 1032942189) + + W(9, 1051158381, -1109351189, 1035094123, -1113211075) + + W(10, 1013034091, 1026352434, -1123123343, -1126776150) + + W(11, -1118268740, 992197073, 1007592182, -1128843070); + sum2 = + W(0, 1027450901, 999052617, 998486633, -1098069390) + W(1, 1050271656, -1144500281, 1034115809, -1111215245) + + W(2, -1130117632, 1037992777, 1035832253, 1058826704) + W(3, -1075559944, 1051052067, -1104035684, 1041076323) + + W(4, -1112751331, 1031860941, -1100828230, 1066377631) + + W(5, 1059983898, -1089703828, 1037142243, -1116488683) + + W(6, 1023748039, -1148181737, -1107268336, 1031601953) + + W(7, -1105105514, 1006070601, 1031181077, -1123703892) + + W(8, -1129067048, 1031574877, -1108371420, -1110435251) + + W(9, -1111123861, -1135053221, 1013422629, 994427506) + W(10, 1020055214, -1123191999, -1176849298, 992240434) + + W(11, 1022099846, -1122685646, -1154287506, 1025316569); + WS(1065940278, 1034622363); + sum1 = + W(0, -1130882111, 1018945629, 1038546130, -1109081570) + W(1, -1116833467, 1027338207, -1118439678, 1023675896) + + W(2, 1042781009, -1105035701, 1037583679, -1089961211) + + W(3, -1106689964, 1025705412, -1110899849, 1000818681) + W(4, 1048563851, 1039562393, 1050832116, 1065150616) + + W(5, 1063013875, 1053064399, 1043578884, 1052844651) + + W(6, -1106282856, -1093168999, -1106056839, -1081267407) + + W(7, -1093571617, -1098826451, -1098971955, -1103816344) + + W(8, 991352096, -1128564863, 1040441019, -1125259845) + W(9, 1037655800, 1032573560, -1126802554, -1174556270) + + W(10, -1132163876, -1146137419, 1034240611, -1103163033) + + W(11, 1014989293, -1132178841, -1140385876, -1124029942); + sum2 = W(0, 1042045232, -1100582068, 1051353130, -1098661297) + + W(1, 1033093932, 1041505758, -1111611431, 1036803556) + + W(2, 1025081894, 1047796551, -1135649915, -1083821047) + + W(3, -1113123121, -1102707738, 1042774566, -1119704488) + + W(4, -1120251562, -1130142714, -1091982339, 1066411068) + + W(5, -1108263063, -1116829613, 1029093314, -1105374597) + + W(6, -1098032480, 1051286467, -1088973774, 1066192686) + + W(7, -1096817778, -1124748705, -1115318079, 1039210409) + + W(8, -1122897683, -1114446743, 1048662352, -1098476628) + + W(9, 1043244089, -1105512115, 1039955893, -1115075522) + + W(10, -1131598407, 1028094206, -1114986235, 1035402858) + + W(11, -1113670703, 1040252082, -1113507172, -1136180467); + WS(1056991468, -1087030746); + sum1 = + W(0, -1123211458, 1040392564, -1107179074, 1032323379) + W(1, -1112698351, -1113154609, 1035059984, -1117349658) + + W(2, -1104816506, -1123900599, -1097679367, 1050060447) + + W(3, -1113372906, -1118981766, 1036804874, -1117759553) + + W(4, -1105628499, 1035944426, -1092912076, 1043269081) + + W(5, -1098944114, -1111852653, 1030188977, -1099907470) + W(6, 1049039296, 1031104918, 1058030045, 1044634502) + + W(7, 1032247835, 1043769326, 1035537687, 1048904265) + W(8, -1110865210, 1038992913, -1092536332, 1052766173) + + W(9, -1101773536, -1111088882, 1017337855, -1120093295) + + W(10, -1119944116, 1019968535, -1113705364, 1024115141) + + W(11, 1016666555, -1113641643, 1034739876, -1119368937); + sum2 = W(0, 1038207100, 1055370704, 1017023961, -1102268135) + + W(1, -1122475964, 1023693826, 1033230771, -1120372849) + + W(2, -1100024892, -1091918952, -1082116017, -1125190319) + + W(3, 1048656820, -1118701724, 1009208157, 1017593165) + W(4, 1019998746, -1108168198, 1065911065, 1060923636) + + W(5, -1095962080, 1025593786, 1022143062, -1123799386) + + W(6, -1116235844, 1051323790, -1096201210, -1094794141) + + W(7, 1023749917, -1112111831, 1028403793, -1116942925) + W(8, 1028590129, 1017416940, 1032160655, 1048662690) + + W(9, 1005611185, -1121410776, -1131420642, 1018425448) + + W(10, -1132429552, -1131674494, -1107738152, -1115273448) + + W(11, -1120617509, 1032669658, 1007544955, 990755743); + WS(1065408790, 1036624080); + sum1 = W(0, 1031689276, -1118902603, -1130392064, -1130349122) + + W(1, -1124855342, -1120117724, 1032115325, -1114562026) + + W(2, -1095782030, 1036811736, -1106389326, -1116251760) + + W(3, 1016267643, -1116551776, 1029730958, -1110739566) + + W(4, 1040908418, -1099523235, -1100633526, -1088986706) + + W(5, -1097124896, -1093812931, -1102530619, -1093706094) + + W(6, 1044865119, 1048657234, 1056569877, 1059819669) + W(7, 1057017186, 1059687187, 1046000250, 1058243684) + + W(8, 1010781241, -1114118270, -1105362262, -1109527143) + + W(9, -1101014271, -1105256235, 1028862634, -1118348593) + + W(10, -1124793181, -1132122507, 1010247305, 1021657598) + + W(11, -1147394236, 1019294354, -1131137795, 1010280523); + sum2 = + W(0, 1008018405, -1131603511, 988821927, -1126539767) + W(1, 1029044494, -1154431236, -1144594818, -1134541747) + + W(2, 1028827850, -1115409151, 1044469435, -1105522597) + W(3, 1031515550, 1029512486, -1118759177, 1017115388) + + W(4, 1048442625, -1128423353, -1144038842, -1080807551) + + W(5, -1100063920, 1047735839, 1049631559, 1040817807) + W(6, 1022982076, 976919119, -1106419532, -1069309764) + + W(7, -1077869698, 1057375362, 1074645104, 1074183528) + W(8, 1015261982, -1110305290, 1025710382, -1128896061) + + W(9, 1034212953, 1047372093, -1121013958, 1028992794) + + W(10, 1023643398, -1142661114, 1024565032, -1156968388) + + W(11, -1108906576, 1040986767, -1109343217, 1013497529); + WS(-1134496480, -1135409208); + sum1 = + W(0, 1012816882, -1131032216, 1015795842, 1017081284) + W(1, 1032335660, -1114842158, -1121133019, 1020892138) + + W(2, -1118561391, 1023949458, 1025102291, -1098855254) + + W(3, -1109465919, 1018180354, 1039697400, -1121622748) + + W(4, -1172095542, -1135187513, -1122643706, 1062211658) + + W(5, 1053298610, 1055550179, -1104417019, 1042088653) + W(6, 1042727039, -1111514505, 1044113108, -1088869665) + + W(7, -1090758606, -1097017583, 1024023145, -1131309822) + + W(8, -1101252924, 940438235, -1099247502, 1037442288) + W(9, 1036453998, 1038283500, -1127849669, -1111728213) + + W(10, 1038725048, -1118209095, 1039141810, -1110868352) + + W(11, -1124785329, -1123999226, 984058180, 985363057); + sum2 = + W(0, 1027844464, -1120185020, 1033301171, -1142892826) + W(1, -1130897478, -1112219415, 1008317678, -1123809910) + + W(2, -1123756397, 1023474305, -1120807818, 1045181163) + + W(3, 1050514681, -1148494098, -1124897908, -1112292483) + + W(4, -1109401613, 1009596088, -1105464515, -1069578385) + + W(5, 1080182479, 1033916695, -1111316356, 1038900121) + + W(6, -1123223808, 1048386893, -1117881742, -1079085438) + + W(7, 1057107198, -1155326684, 1015620530, -1138311341) + W(8, 1035039619, -1119575836, 1029989604, 1032607110) + + W(9, -1113328530, -1143648562, 1010222764, -1144599918) + + W(10, -1128717516, -1197272208, -1129559846, 1013531724) + + W(11, 1001587842, -1126181730, 1011089790, -1129634008); + WS(1063953772, 1006246735); + sum1 = + W(0, -1129265445, -1103221880, -1129858606, -1113052252) + W(1, 970168057, 1035503657, -1114702297, 1026538155) + + W(2, 1023929568, -1113408580, -1152025615, -1124775629) + + W(3, -1116248388, -1112901548, -1114551939, 1012918985) + W(4, 1050480356, 1053092565, 1054804888, 1058637767) + + W(5, 1061520345, 1052655373, 1043614208, 1053852345) + + W(6, -1094701786, -1092563365, -1099755687, -1081976315) + + W(7, -1085039957, -1106127939, -1104465584, -1094975651) + + W(8, 1037312131, -1114954585, 1041973195, 1043978961) + W(9, -1109284733, 1037644971, 1036504960, -1153236991) + + W(10, 1034664643, 1012249970, 1007014628, 1034276907) + + W(11, -1121545966, 1031841028, -1122618723, 1015394179); + sum2 = W(0, -1108119214, -1096454441, -1110533412, -1119694402) + + W(1, -1127729168, -1110958880, 1023031785, -1130979192) + + W(2, -1098605940, 1047215192, -1103381544, -1128298432) + + W(3, -1115663656, -1114162078, 1023974294, -1102917557) + + W(4, 1035846227, -1114546522, 1042040175, 1054173861) + W(5, -1103681801, 1035812038, 1020649501, 1043843622) + + W(6, 1036002502, 1051355228, -1102267339, 1055154953) + W(7, 1052945690, -1097546689, 1033369183, 1033695483) + + W(8, -1110269476, 1034086715, -1102892813, 1033662351) + + W(9, 1018137856, -1135158408, 998437331, -1106336801) + + W(10, -1115932080, 1019597651, -1130886478, -1108620470) + + W(11, 1033484697, -1106956606, 1029836288, 1026224246); + WS(1049960663, -1098656338); + sum1 = + W(0, -1129270334, 1010743226, -1116543140, 1036165346) + W(1, 1026370235, 1026933359, 1009750007, -1164389112) + + W(2, -1097905355, 1038429850, 1026505899, -1111354490) + W(3, 1012909508, 1034045586, -1139624135, 1033987231) + + W(4, -1106458043, -1094238830, -1084542826, -1093117384) + + W(5, -1096055524, -1093158415, -1113672231, -1098353419) + + W(6, 1053746044, 1050579558, 1060156652, 1065413702) + W(7, -1110641506, -1140159326, -1153271990, 1046556600) + + W(8, -1153859324, 1008020477, -1101873487, -1122984978) + + W(9, -1132001470, 1048347588, 1027525597, -1124973593) + + W(10, -1120671826, 1036488405, 1033306211, 1035776465) + + W(11, 1015184758, -1115507932, 1024719161, 1037016731); + sum2 = W(0, 1007202997, 1038605814, -1111184485, -1097778206) + + W(1, -1107862779, -1126800416, -1122928880, -1117103670) + + W(2, -1107138382, -1092409649, -1086536233, 1033842165) + + W(3, 1050500010, -1107791267, 1035028069, 1024236113) + + W(4, -1101985157, -1111080585, 1058778058, 1062592323) + + W(5, -1115904936, 1050870644, -1115500703, -1137706913) + + W(6, -1105521455, 1031799434, -1102287591, 1054124413) + + W(7, -1121603522, 1039372702, 1030823202, 1012044041) + W(8, 998286218, -1127152184, 1043783051, -1107786643) + + W(9, -1104929125, -1103666737, -1123649878, 1042413442) + + W(10, -1135144653, -1138707909, 1018462794, -1134709509) + + W(11, 1016336685, 1035379787, -1120475406, -1119073178); + WS(1045571246, -1101396513); + sum1 = W(0, 1027156266, -1135540454, -1123739311, -1123826896) + + W(1, -1110505155, -1138173481, 1019384210, -1138775820) + + W(2, -1105879340, 1031079263, 1036462891, 1048275928) + W(3, 1040289247, 1033674439, 1035302207, -1109766005) + + W(4, -1095381975, -1094890856, -1086841044, -1081913239) + + W(5, -1087831711, -1095054872, -1100616678, -1096527684) + + W(6, 1052608133, 1052732944, 1059410250, 1057453824) + W(7, 1053535332, 1059217778, 1056369955, 1057086003) + + W(8, 1036979366, -1110160581, 1033495803, 986236332) + W(9, -1121128186, -1117509614, 1002559041, 1031959012) + + W(10, -1116386461, -1124519785, -1113888968, 1015417435) + + W(11, -1106215130, 1025380519, -1132265864, 1009437253); + sum2 = W(0, 1023702857, -1116086512, 1027064225, 1024261913) + W(1, -1115739014, 1023117658, 1011341860, 1016675050) + + W(2, 1025579445, 1041684936, 991232624, 1049263730) + W(3, 994389040, -1121855219, -1121905805, -1114246345) + + W(4, -1107828603, -1100190580, -1127488618, -1121382305) + + W(5, 1049530396, 1041567276, -1097196557, -1125328530) + + W(6, 1030949885, -1127701406, 1063977916, 1081524863) + + W(7, 1074557390, -1078514947, -1067412604, -1072747255) + + W(8, 1030056541, -1101693823, 1026840857, 1032271344) + W(9, 1041139218, 1024600809, -1110332083, 1045882874) + + W(10, -1138881396, 1031874044, -1115029594, -1124133978) + + W(11, 1015337722, -1113125346, -1157524144, 1009384836); + WS(-1091844311, 1066789497); + sum1 = W(0, -1126657090, -1118280816, 1035276339, 1034822275) + + W(1, -1122398524, 1027512241, -1105911320, 1036073133) + + W(2, -1121934839, -1104655157, 1036892560, 1041291861) + + W(3, 1016354085, -1100932977, -1113195754, -1137558275) + + W(4, 1053346558, -1150447404, 1061301148, 1054539137) + W(5, 1061579109, 1052329175, 1010492736, 1052092547) + + W(6, -1094816004, -1096277599, -1095276499, -1085328499) + + W(7, -1094948141, -1090319102, -1109759879, -1096198988) + + W(8, -1134360567, 1026981217, 1035239934, -1132053288) + + W(9, 1041572288, -1138204721, 1026669711, -1122862318) + + W(10, -1196074864, 1030410603, -1117233544, 1032377106) + + W(11, -1113536398, 1028691858, 1016723124, 1004385343); + sum2 = + W(0, -1130924015, 976327856, 1006816288, 1032746467) + W(1, -1109752024, 1030725620, -1118656485, 1013150272) + + W(2, 1022730742, -1107671502, -1102494949, -1063244855) + + W(3, -1117144683, -1118200508, 1023153636, 1019358625) + W(4, -1156842543, 1030703882, 1050591037, 1084548157) + + W(5, 1041535529, 1030607420, -1117378226, 1000111712) + W(6, 1039023607, -1100688592, 1039287442, -1091568120) + + W(7, 1042495948, -1100624377, 1033109796, -1135441064) + + W(8, -1147026848, -1113451109, 1030233046, 1034384724) + W(9, 1024850879, 1037336210, -1123040622, 1025293966) + + W(10, 1024455841, 1015244616, -1121583866, 1032201434) + + W(11, -1112832588, 984232072, 1003511712, -1124806470); + WS(1062375148, 982896070); + sum1 = W(0, 1041356906, -1141741512, -1123251246, -1121772047) + + W(1, -1138991637, -1156317853, -1161666833, 1011726474) + + W(2, -1092346958, 1042371688, -1107640316, 1037798623) + + W(3, 1035668286, 1026956462, 1016120313, -1115727625) + + W(4, -1098857839, -1100631199, -1093348349, -1081710855) + + W(5, -1084667272, -1088318752, -1093940123, -1084607638) + + W(6, 1052252533, 1048733184, 1057292943, 1063732968) + W(7, 1061645578, 1059891330, 1051947731, 1059995535) + + W(8, 1050501706, -1126563284, 1043133649, -1111246422) + + W(9, -1112114769, -1106214611, -1109426316, -1190508359) + + W(10, -1165233042, -1134397903, 1008063554, 1032268279) + + W(11, 988108978, 1037368483, -1138661789, 1040598420); + sum2 = + W(0, -1087149149, -1111774062, -1122195827, 1039123010) + W(1, 1035630599, 1055099903, 1042757145, 1060125526) + + W(2, -1081699534, 1035582541, -1087576154, -1082404199) + + W(3, -1111170675, -1119441337, -1097950160, -1098859385) + + W(4, 1075074133, 1078981756, 1080077903, -1086433828) + + W(5, -1073636555, -1080599553, -1080969229, -1075310961) + + W(6, 1074122230, 1067224402, 1066418532, -1082120864) + + W(7, -1078722695, -1083892454, 1038753292, -1085615144) + + W(8, 972078363, -1092574897, -1094572008, -1101495601) + W(9, -1124013413, 1051613332, 1020974546, 1056506110) + + W(10, -1097056662, 1045566397, 1049096521, -1109136155) + + W(11, 1034655424, 1023040696, 1027077203, -1129411423); + WS(-1073733835, -1077508759); + sum1 = W(0, 1004911573, 999004239, 1008908284, 1032559088) + W(1, -1123346838, 1021646261, -1114632613, 1036339578) + + W(2, 1043185540, -1120942224, -1136904037, -1114184455) + + W(3, -1112686066, 1032555200, 1005792618, 1040940927) + W(4, 1056421033, 1054442442, 1059517190, 1066321721) + + W(5, 1063474337, 1052962698, 1044159722, 992460573) + + W(6, -1084678800, -1094509130, -1087084867, -1089134469) + + W(7, -1088382556, -1089853747, -1092765869, -1093589176) + + W(8, 1025064353, 1020812405, -1149079216, -1127746091) + + W(9, 1027145139, -1126936380, 1027348136, -1126618160) + + W(10, 1009545653, 1022285001, -1118599969, 1007063543) + + W(11, -1149726053, 1015641511, 1023282088, 981480241); + sum2 = W(0, 1016441223, -1123853806, 1034027700, 1016212045) + W(1, 1025170155, 1030169991, 1024326153, 1020004331) + + W(2, 1040812131, -1136381199, -1121560396, -1100123577) + + W(3, -1100550013, -1105283667, 1029487024, -1102325825) + + W(4, -1091551076, 1020713637, -1092123318, 1069362941) + + W(5, 1050653373, 1020763615, -1121149602, -1094990109) + + W(6, -1083270432, -1123741604, 1057043619, 1065772322) + + W(7, 1058297195, -1091989226, -1092470882, -1106605421) + + W(8, 1054198423, -1108424657, -1115262538, -1092584961) + + W(9, -1121642970, 1029919048, 1039520200, 1026718342) + + W(10, 1001473573, -1110846033, 1008724259, -1120589670) + + W(11, 1040111989, -1104422780, 1027795061, -1115881428); + WS(-1083424620, -1083774644); + sum1 = W(0, 1025997707, 995558823, -1132669247, 1015677409) + + W(1, -1113673299, -1146244698, 1028038186, -1119640804) + + W(2, -1107578509, -1112668224, -1109754213, 1048694360) + + W(3, -1099923633, 1044345284, -1117921566, 1030760459) + + W(4, -1116799831, -1098861996, -1099316274, -1079768279) + + W(5, -1093459346, -1098475085, -1113981277, -1105585281) + + W(6, 1051882641, 1045883512, 1060321715, 1059777970) + W(7, 1064776049, 1036566882, 1042756750, 1033934183) + + W(8, -1114213177, -1127946135, -1106758402, 1040276008) + + W(9, -1108196294, 1008462282, -1117078569, -1130472177) + + W(10, -1140244728, -1116793621, -1131243108, -1129876893) + + W(11, -1167573435, 1020492609, 1015090721, -1176961296); + sum2 = + W(0, -1120400279, 1006239848, 1033967902, -1138878316) + W(1, 1012842788, -1135736068, 1028356101, -1120658117) + + W(2, -1120118931, -1112851025, -1101370370, 1037781128) + + W(3, -1100258045, 1002346920, -1112182778, 995892591) + W(4, -1114073896, 1016448074, 1047917593, -1113781647) + + W(5, 1045546113, -1114666278, 1002645288, -1115876966) + W(6, 1044457775, -1095953339, 1065044078, 1069276419) + + W(7, -1075186216, 1035717470, -1097061266, 1049663208) + + W(8, 1036833596, -1112980685, -1119396143, -1110041421) + + W(9, -1132903556, -1120766465, 1015304410, -1123504973) + + W(10, -1137956564, -1122147671, 987310366, -1187381491) + + W(11, -1131003226, 1029533357, 1003776904, -1150885167); + WS(1055938007, -1113494123); + sum1 = W(0, 1002908945, 1005413771, 1025040167, 1016082831) + W(1, -1114102015, 1024456642, -1121270129, 1006080470) + + W(2, 1028210664, -1117675639, 1040926954, -1118443670) + W(3, 1040854289, 1046508410, 1019764906, 1029150738) + + W(4, -1133494457, 1035958810, 1041989700, -1101702418) + + W(5, -1098047787, -1093641223, -1111985289, -1102768646) + + W(6, -1135464580, -1095959351, -1087581816, -1121242873) + + W(7, 1048632765, 1052220147, 1025236686, 1042463785) + W(8, 1008466835, 1040264713, 1048292991, 1034336763) + + W(9, 1043249233, -1183964258, 1036425152, -1131127167) + + W(10, -1131269290, 1035203030, -1116685065, -1117662885) + + W(11, -1132796663, -1144182458, -1137681823, 1031884341); + sum2 = W(0, -1148833389, 1034952858, -1131645803, 1044582101) + + W(1, -1100126968, 1041029558, -1101188496, 1038559400) + + W(2, -1103329032, -1114547380, -1099667252, 1046239383) + + W(3, 1038848953, 1023994452, 1040593566, -1104909140) + W(4, 1039527980, 1019372679, 1017530647, -1095619156) + + W(5, 1053527025, -1122648352, 1048348234, 1034383711) + W(6, 1036545465, -1111710878, 1040867364, 1074171367) + + W(7, -1072583834, -1089175055, -1110512168, 1048723535) + + W(8, -1140514638, 1042452640, 1048394746, 1046568773) + + W(9, -1104419698, -1095650184, -1113024814, -1105559093) + + W(10, -1111163586, 1025974311, -1102843950, 1030125627) + + W(11, 1045672947, 1033990232, 1039972451, -1123744674); + WS(1054254551, 1014537956); + sum1 = W(0, -1121039367, 1018675757, 1022410264, 1028321069) + W(1, 1032078897, 1035879540, 998902321, 1035017184) + + W(2, 1035774671, -1130008697, 1030747950, -1107714718) + + W(3, -1097508911, -1100889147, -1111836109, -1112194220) + + W(4, -1112598570, 1008273253, -1093495169, 1061840455) + W(5, 1062686448, 1058139578, 1050284599, 1050365160) + + W(6, -1132150029, -1122251932, 1041075666, -1100441032) + + W(7, -1084814013, -1090418276, -1098262366, -1104639554) + + W(8, -1109088445, -1109769252, -1103842329, -1105690119) + + W(9, 1049125597, 1045096257, 1018266794, -1137878196) + + W(10, 1040615567, 1003469451, 1040565356, -1126038165) + + W(11, -1115375938, -1105705223, 1030169589, -1123088958); + sum2 = + W(0, 1011204314, -1151906447, -1132982086, 1015334447) + W(1, -1126682819, 1031867988, -1118412630, 1019402007) + + W(2, -1130282463, 1008292026, -1113509623, -1118416042) + + W(3, 1010705513, 1015562377, 1033032763, -1171211484) + W(4, -1119643322, 1036989282, 1023195387, 1031871454) + + W(5, 1036745108, -1105750465, 1024841875, -1132045005) + W(6, 1040567914, -1093705400, 1046529995, 1053486166) + + W(7, 1053627848, -1097180463, 1042871577, -1098551422) + W(8, 1058038651, 1048788001, 1069827352, 1061661513) + + W(9, -1076895592, -1083563182, -1102862368, -1093245544) + + W(10, -1092395975, 1041384381, -1082188469, -1087135929) + + W(11, 1050130047, 1062283738, -1108358221, 1058279550); + WS(1057163500, -1105993220); + sum1 = + W(0, -1117201821, -1121502764, 1035599249, -1105708961) + W(1, 1039647740, -1100922079, 1009912816, -1136735831) + + W(2, -1127293622, 1045431725, -1100979748, 1049617722) + W(3, -1110465655, 1042176840, 1018827936, 1001114727) + + W(4, 1046510122, -1097880614, 1061106926, -1099817760) + + W(5, -1119635500, -1109566363, -1147860066, 1037588842) + + W(6, -1119279260, 1032698105, -1097882833, -1088567265) + + W(7, 1058361641, -1097567811, 1036626725, -1111863248) + + W(8, -1111026820, 1044535287, -1095331735, 1053288920) + W(9, -1096979757, 1050620014, 999121112, 1037098289) + + W(10, 1018908832, -1110256660, 1024080836, -1117593824) + + W(11, 1027464313, -1113789929, -1159432152, 1012647057); + sum2 = W(0, 1032576295, -1123342042, -1102694716, -1132748357) + + W(1, -1114775905, 1033817148, 942234367, -1109637447) + W(2, -1107895050, 1039805910, 1052615154, 1027679479) + + W(3, -1183264704, -1127944484, 1017960690, -1117652574) + + W(4, 1016729470, -1102939450, 1050355566, 1057040101) + + W(5, 1041423933, -1098800812, 1027447559, -1113353192) + + W(6, 1038099246, -1120156902, -1100691281, -1098318717) + + W(7, 1028185223, 1043085543, -1113846578, 1025700351) + W(8, -1122727069, -1128970625, 1046407453, 997134844) + + W(9, -1094682594, 1023808656, 1033077879, -1136470782) + + W(10, -1114110583, -1124467804, -1110408836, 1035923921) + + W(11, 1040728790, -1104134547, -1111084310, 1024627457); + WS(1069430838, -1077807532); + sum1 = W(0, -1123171840, -1123870031, 1012978707, 1026708965) + + W(1, 1032241614, -1110089696, 1013657340, -1120091289) + + W(2, 926704291, 1035074891, -1102713036, -1094582899) + + W(3, -1104095024, -1131766218, -1123449267, -1126388352) + + W(4, 1028287308, 1030377682, 1060355037, 1064667974) + W(5, 1044883747, 1023923417, 1023074654, -1134219998) + + W(6, 1024652287, -1104443381, 1049114747, 1049334299) + + W(7, -1097738289, -1112895132, -1133494194, -1105084689) + + W(8, -1121358347, -1137933441, -1102473935, -1095444677) + + W(9, -1112982200, -1115022670, -1123735342, -1125652635) + + W(10, -1124249574, -1123723658, -1124350158, -1155502135) + + W(11, 996719039, -1114119663, -1129702439, -1115595936); + sum2 = W(0, -1176390445, 1032791968, -1107216374, 1039748018) + + W(1, -1104895086, 1038133354, -1123666927, 1013658503) + + W(2, -1120278537, -1112747779, 1039675898, 1025598156) + + W(3, 1049256042, -1105015824, 1024448666, -1110290749) + + W(4, -1122813389, -1119517685, 1061000499, 1059349510) + + W(5, -1087513873, 1030867610, -1108606159, 1029186614) + W(6, 1041053822, 1042596904, 1032712030, 1055783944) + + W(7, -1099074048, -1084050573, 1040697602, -1106116496) + + W(8, 1022193201, -1132233097, 1037891533, 1009116037) + + W(9, -1107732985, -1101549778, 1022775251, -1106656496) + + W(10, -1120846771, -1150821318, -1120324549, 1006903493) + + W(11, -1117395279, 1034659541, -1115429715, 1028618234); + WS(-1107817820, -1083770194); + sum1 = W(0, 1033900161, -1129878691, -1129439246, -1131338575) + + W(1, 1015365308, -1128788741, 1034359265, 1024049691) + W(2, -1103638846, 1019165999, 1023785569, 1041664750) + + W(3, 1007653393, 1026305479, 1029035509, -1111132977) + + W(4, -1091016130, -1105602789, -1097747004, -1076846267) + + W(5, -1089110318, -1101714279, -1095981534, -1089968180) + + W(6, 1053216608, 1056291523, 1057499003, 1059566574) + W(7, 1057822998, 1057215924, 1051239662, 1055184137) + + W(8, 1041711845, -1114138529, -1107402783, 1043057225) + + W(9, -1097881621, -1104471663, 1029122288, 1032118072) + + W(10, 1032252891, 1005244003, -1129556050, 1037921123) + + W(11, -1126092988, 1041959808, 1025745172, 1027268745); + sum2 = + W(0, -1108694073, 1045019344, -1102469381, 1037993179) + W(1, -1102369829, 1036817135, -1116848662, -1123721670) + + W(2, 1017327589, 1034893158, -1100848825, -1146521528) + + W(3, -1136622056, -1122158468, 1036214504, -1109074807) + + W(4, 1040440313, 1020539438, -1091152854, 1062010427) + W(5, 1017850914, -1095264144, 1045324437, 1047380031) + + W(6, 1037365040, 1043169414, -1179472005, 1059039676) + W(7, 1038217042, -1119445175, 1048192551, -1115655698) + + W(8, -1097181356, 1044490295, -1098856738, -1105305386) + + W(9, -1109601321, -1098482637, 1034613852, -1105047780) + + W(10, -1123414724, -1142407924, -1124070306, -1103656828) + + W(11, 1025666621, -1105116469, 1027457629, -1121369495); + WS(-1121449656, -1084978473); + sum1 = W(0, 1045775831, 1021114964, 1036495664, 1032769888) + W(1, -1134400474, 1043049231, -1112792957, 1043659613) + + W(2, -1099605930, 1028648016, -1113195701, -1106810756) + + W(3, 1033523886, -1109837568, 1039225431, -1097941829) + + W(4, -1086366198, -1100836955, -1085601027, -1088747404) + + W(5, -1083936243, -1087596695, -1102874546, -1088234269) + + W(6, 1054843763, 1049277222, 1059006957, 1062277595) + W(7, 1060137529, 1057384673, 1045407794, 1055835664) + + W(8, 1044622847, -1121703995, 1039106531, -1122091582) + + W(9, -1102614275, 1011169881, -1118753961, 1048366450) + + W(10, 1025802254, -1116658981, -1138285574, 1043922200) + + W(11, 1020367213, 1042132230, -1132370673, 1039326553); + sum2 = W(0, 1027272459, -1122536322, -1115599503, -1109953333) + + W(1, -1101108438, -1160853572, -1125199072, -1105305527) + + W(2, -1105747151, -1103046200, 1043039962, 1029006014) + W(3, 1049577028, 1035298821, 1043042004, 1053260045) + + W(4, 1058588727, 1025881493, 1025318337, -1079698237) + + W(5, -1116019666, 1050247454, -1104971590, -1094505007) + + W(6, 1050147388, 1054947781, 1058930692, -1072349877) + + W(7, -1069493839, -1072151832, -1072978341, -1072202568) + + W(8, -1089616072, -1098050255, 1020160348, 1078384354) + W(9, 1078006681, 1075828182, 1074567753, 1072013431) + + W(10, 1040922163, -1157391810, -1097372724, 1029236731) + + W(11, -1111844849, -1095907204, 1046502148, 1037030073); + WS(-1076413686, 1050217089); + sum1 = + W(0, 1037264211, -1140703701, 1010880426, -1119658251) + W(1, -1116247362, 1031154598, -1125273098, -1131976189) + + W(2, -1103937453, 981259974, -1126374874, 1042459879) + W(3, -1115463620, 1040532067, -1110800684, 1020764716) + + W(4, 1032015257, 1015092336, -1117441203, -1095655209) + + W(5, -1089060935, -1097693400, -1116339093, -1115082479) + + W(6, 1043075881, -1110472573, -1140207123, 1058975156) + W(7, 1059127610, 1049753500, 1026525586, 1038259412) + + W(8, -1122840185, -1115654547, -1121072785, 1016890098) + + W(9, -1095200233, 1024224509, -1116764924, 1027865572) + + W(10, -1144808135, -1126940256, -1127053849, 1040888602) + + W(11, 1021095812, 990976051, -1118091276, 1016317274); + sum2 = + W(0, 1057721492, 1028643349, 1060288138, 1059252612) + W(1, -1088865108, -1086775589, -1123025940, -1093527126) + + W(2, -1087030854, -1118716844, -1080168014, -1080273709) + + W(3, 1065839894, 1065802380, 1052992874, 1051057083) + W(4, -1098169441, 1050324940, 1016748144, -1095791676) + + W(5, 1025332663, 1048744751, -1103675095, 1047968677) + W(6, 976966634, 1023362490, -1115171624, 1047291739) + + W(7, -1136639192, -1124716700, 1045176631, -1122660154) + + W(8, 1023517212, -1141117066, 1023617033, -1099550108) + W(9, 1041241265, 1003901823, -1105682362, 1020688386) + + W(10, 1010046217, 1027499437, -1115470708, 1034407868) + + W(11, -1116997486, -1138422172, 1028187249, -1121332252); + WS(1066004950, -1130673709); + sum1 = W(0, -1116101174, -1143212072, -1110468285, -1115338446) + + W(1, -1108483849, 1016794668, -1129241385, 1013476922) + + W(2, 1031654568, -1115365365, 1037471350, 1044807147) + W(3, 1036857292, 1049500535, -1116011560, 1018991691) + + W(4, -1088044468, -1112634148, -1095270314, -1086079158) + + W(5, -1084922887, -1089120237, -1096691029, -1092328502) + + W(6, 1052873383, 1046315731, 1053790292, 1057379349) + W(7, 1062574892, 1059566963, 1043154809, 1052540519) + + W(8, 1041536990, 1018103788, 1044233532, -1114923292) + + W(9, -1111082699, -1112535089, 1013224078, 1045681849) + + W(10, -1136500130, -1125315968, -1143909091, 1020745202) + + W(11, 1016815907, -1120057699, 1009076749, -1111113254); + sum2 = W(0, 1049010278, 1037489391, -1120558834, -1115441721) + W(1, -1107156556, 992841734, 1011333881, 1042878013) + + W(2, 1059657103, -1120407882, 1065561208, 1065354919) + + W(3, 1033902725, -1090673211, -1082019922, -1076779646) + + W(4, -1081123115, -1091075041, -1094693777, -1086070082) + + W(5, 1048072918, 1058489027, 1067731839, 1065573397) + + W(6, -1096253478, 1044030983, -1088412254, -1088804298) + + W(7, 1059822273, 1048768363, -1110539158, 1056386736) + W(8, 1022187211, -1110198086, 1026065263, 979808314) + + W(9, 1015305348, -1103664360, -1102578162, 1041735451) + + W(10, 1042763848, -1123055347, 1010460099, 1037997843) + + W(11, -1106407542, -1127526979, 1046102351, -1098151359); + WS(1047691950, 1051513987); + sum1 = + W(0, 1022367675, 1023115866, 1025923810, -1121417283) + W(1, -1135269348, -1123344254, -1153116613, -1140725337) + + W(2, -1106171493, -1148261013, -1110614526, 1048684730) + W(3, 1043654816, 1037977761, 1018209505, 1012206837) + + W(4, 1047705594, -1138130365, -1138856554, -1092459648) + + W(5, -1088007377, -1117423671, -1145599589, -1130685354) + + W(6, -1115678670, 1039875161, -1098498099, 1059839847) + + W(7, 1055365231, -1110502987, -1108540005, 1013205632) + + W(8, -1110486184, 1038987295, -1111291916, 1037143648) + + W(9, -1116325726, 1038170008, 1024662707, -1106962771) + + W(10, -1119968336, -1146539325, 1031736900, -1113038256) + + W(11, 999460043, -1124410005, -1170140361, 1022378313); + sum2 = W(0, -1153456458, -1134949160, 976205336, -1107040555) + + W(1, 1031938263, -1148458760, -1128058621, 1018102832) + + W(2, 1034638423, -1132037434, 1047224115, -1111241686) + + W(3, -1102088763, -1109506803, -1119972538, -1122339703) + + W(4, 1026219462, -1110235102, 1041432515, -1098519781) + W(5, 1016119332, 1045200456, 1026438298, 1012163112) + + W(6, -1118314715, 1026400860, -1098555575, 1048945857) + W(7, 1066956313, 1038098069, 1020127420, 1026446934) + + W(8, -1119545213, 1033998497, 1038320636, 1042089138) + + W(9, -1089428981, -1088147582, -1103340362, -1114149729) + + W(10, 1020158000, -1129681397, 1034767622, -1100590807) + + W(11, -1131704894, 1033722488, 1036980701, -1126638758); + WS(1065730166, 1060778308); + sum1 = + W(0, -1109508860, -1155017835, -1113193022, 1018445113) + + W(1, -1116526739, 1027367671, -1113248331, -1116098736) + + W(2, -1157499671, -1122491724, -1101845990, -1123710636) + + W(3, 1037579925, -1109701838, 1024052458, -1155438706) + W(4, 1041425921, 1039607429, 1059840031, -1103201623) + + W(5, -1086536234, -1119532176, -1131587533, -1135484603) + + W(6, 999270323, -1108915110, -1093896302, 1034241095) + W(7, 1065443257, -1115473720, 1023021127, -1169161851) + + W(8, 1009856488, 1019270959, 1048952862, -1124851701) + W(9, -1100984082, 1042597895, 988759974, -1109972554) + + W(10, -1122732458, 1019165315, -1112299503, 1031136123) + + W(11, -1130156262, -1112137490, 1035869970, 1026435614); + sum2 = + W(0, -1117967445, 1040648348, -1112630617, 1042642774) + W(1, -1134880336, -1108734545, 1042723069, -1110919553) + + W(2, 1023936292, 1027011316, -1104815876, 1032485416) + W(3, -1097739621, 1008252288, 1027781874, 1017816544) + + W(4, 1048994422, -1081925843, 1069895227, -1079286264) + + W(5, 1067803238, -1093635474, 1039731885, -1113045602) + + W(6, 1036573845, -1090561506, 1061477130, -1076993331) + + W(7, 1074358700, -1082750513, -1152591489, 1040942069) + W(8, 1025878262, -1121546197, 1006994724, 1017402756) + + W(9, -1094759274, -1124517798, -1128233335, 1015619872) + + W(10, -1136777476, 1000734832, -1120512530, 1043800887) + + W(11, -1115175264, -1106635673, 1050798200, -1104563368); + WS(1051081815, 1004177576); + sum1 = W(0, -1127006616, 1009183853, 1030806032, 1035550201) + + W(1, -1148492092, 1031890286, -1122950699, 1033051522) + + W(2, 1047378036, -1123222753, 1030530563, -1112167248) + + W(3, -1102096100, -1119963793, -1117414047, -1118879820) + + W(4, 1040477302, -1133548407, 1061394914, 1067589976) + W(5, 1061693295, 1056018877, 1051876647, 1054656608) + + W(6, -1095193921, -1099314072, -1084986498, -1091645900) + + W(7, -1092420382, -1084371172, -1100397982, -1096248194) + + W(8, 984028115, 1033152150, -1134209438, -1104155199) + + W(9, -1126214664, -1117645071, -1115478541, -1098736399) + + W(10, 1015654525, 1000220336, 1016832613, 1007541309) + + W(11, 1020442767, 1016050244, 1015156587, -1120116135); + sum2 = + W(0, 1038737431, -1107492679, 1048033211, -1120313369) + W(1, 1015799927, -1127256174, -1108431753, 1025558434) + + W(2, -1086393652, 1061143042, -1086071985, 1050160290) + W(3, 1036302581, -1118303985, 1030572627, 1049210573) + + W(4, -1122890851, -1087802869, 1050554685, 1074235084) + + W(5, -1097102610, -1080828834, 1051308486, -1086660156) + + W(6, 1062117952, -1089713201, 1059347527, 1068761695) + + W(7, 1051722018, -1090432670, -1096060997, -1089293346) + + W(8, 1031555324, 1047951996, 1026779363, -1098359769) + + W(9, 1043634021, -1093586557, -1093678452, -1099341241) + + W(10, -1105710539, 1021198999, -1103176732, 1024031768) + + W(11, -1105088271, 1023611974, -1113357802, 1042868230); + WS(-1081907798, -1114644056); + sum1 = W(0, 1023775725, -1170980595, 1026005873, -1126334628) + + W(1, -1135823392, -1129163353, -1151688884, -1129940170) + + W(2, -1099395677, -1134709766, -1099241994, -1120114113) + + W(3, 1034531271, -1108351113, 1019473342, -1110039318) + W(4, 1055907631, 1050593936, 1058604967, 1054687330) + + W(5, 1038229186, 1034921283, 1018134455, -1120708196) + + W(6, -1100928459, -1112754945, -1087793848, -1087665246) + + W(7, -1104299004, 1040795209, 1040889398, 1054318790) + W(8, -1119324179, 1032148262, 1009969504, 1038203192) + + W(9, 1028440637, -1104169898, -1106565731, -1107725509) + + W(10, -1109439504, 1017060589, -1128826918, -1138112959) + + W(11, 1038462084, 999099597, 1007377992, 1027667523); + sum2 = + W(0, -1119441358, -1129970231, 1013923693, -1135011770) + W(1, 1015830944, -1115083307, 1009913072, -1117182320) + + W(2, -1109792567, -1120391232, -1103233485, -1103316489) + + W(3, -1104701758, 961266788, -1120471806, 1032096200) + W(4, -1127769135, 1050978947, 1033489482, 1054134565) + + W(5, 1049300223, -1110832497, 1049274561, -1124368769) + W(6, -1107196821, 992017798, -1095646457, 1049668759) + + W(7, 1056508485, 1047186396, -1110580647, -1109467751) + W(8, 1030789742, 1040616080, 1038693473, -1124339641) + + W(9, 1043974386, -1086696217, -1110322035, -1103392519) + + W(10, -1113410550, 1030775978, -1115392393, -1108882435) + + W(11, -1145057435, -1118394614, 1032794842, 1029776437); + WS(1054547415, -1080700728); + sum1 = W(0, -1118959255, 1000886579, -1108938574, 1035589374) + + W(1, -1115953331, -1120209015, -1130255148, -1114831416) + + W(2, -1106813137, 1020745112, 1000629071, -1089948699) + + W(3, -1104374042, -1115354302, -1115551813, -1107411355) + + W(4, -1136179854, 1042266506, -1114102394, 1058763908) + W(5, 1043996152, 1034434840, 1030595334, 1037557447) + + W(6, 1049136707, -1113159542, -1117329322, 1057279043) + + W(7, 1058534976, 1042941412, 1024662339, -1115931546) + + W(8, -1121699838, -1135369949, -1098171678, -1102488395) + + W(9, -1118338951, -1123101368, -1111680098, -1111356186) + + W(10, -1110798213, -1133353861, -1132246652, -1116069530) + + W(11, 1023843187, -1110056358, -1125104281, -1113468791); + sum2 = W(0, -1104438281, 1006975884, -1114845259, -1121830816) + + W(1, 1035922248, -1109021584, 1024387710, -1116080890) + + W(2, 1010047952, 1033813267, -1104617278, 1016682467) + W(3, -1119230330, 1016925125, 1031893944, 1028042677) + + W(4, 1041416137, -1103312430, 1059878226, 1030331467) + + W(5, 1042445877, -1127060444, -1106783001, -1113418625) + + W(6, -1126834256, -1117623020, -1091497753, 1058017528) + + W(7, 1016098448, 1041560361, -1112957506, 1032681483) + + W(8, -1137643420, -1119875938, 1032827109, -1098691452) + + W(9, 1038105687, -1110812698, 1032692112, -1112120334) + + W(10, -1141914640, -1142859168, -1115736166, 1030249718) + + W(11, -1111253212, -1153808400, -1114320479, -1122393388); + WS(1052913623, 1049378679); + sum1 = + W(0, -1122838827, -1140317417, -1125024735, -1119624720) + W(1, -1114511683, 1000517975, 980913767, -1118732996) + + W(2, 1042960148, -1131398976, 1047376245, -1142164473) + W(3, 1052155164, 1026436976, 1040745327, 1037554661) + + W(4, -1086626395, -1096052024, -1085621156, -1082562971) + + W(5, -1087926293, -1091398264, -1096441475, -1088065070) + + W(6, 1057292387, 1051976144, 1057250406, 1065554348) + W(7, 1052193006, 1054127476, 1052669955, 1051850318) + + W(8, 1037967453, -1115050310, 1033197251, -1105683981) + W(9, 1022767638, 1031945184, -1117629257, 1041425290) + + W(10, -1155224026, 1021209962, -1137632582, 1041116332) + + W(11, -1114068531, 1019309136, -1119607996, 1029050594); + sum2 = + W(0, -1128729473, 1026695603, -1122814467, 1038041001) + W(1, -1114364242, 1029245131, -1114309631, -1131614889) + + W(2, -1113890565, -1113695617, 1012493154, 1007226362) + W(3, 1022932917, -1121347205, 1028217359, 1005475605) + + W(4, 1030681183, 1046246583, -1119541727, -1105895610) + W(5, 1013035938, -1109256305, 1037707015, 1018572933) + + W(6, -1116238263, 1032966985, 1063042504, 1066720275) + W(7, 1061802664, 1054635319, 1034508407, -1114817272) + + W(8, 1054381777, 1060417287, 1065151040, 1069419683) + W(9, 1070184946, 1067716376, 1063333907, 1057796391) + + W(10, -1088819879, -1094452995, -1073258706, -1071852139) + + W(11, -1071972143, -1076852924, -1084913408, -1086618913); + WS(-1080205366, 1054586731); + sum1 = W(0, 1028285119, 1034516295, -1114270114, 1028158052) + W(1, -1122816794, 1015275709, 1008209269, 1026827799) + + W(2, -1104231365, -1118125300, -1122896269, 1031422323) + + W(3, 1042423964, -1113275778, 1035567225, -1113291743) + + W(4, -1105384067, -1098317298, -1102251495, -1084181862) + + W(5, -1083878719, -1102645126, -1094749758, -1095155767) + + W(6, 1018315643, 1050987674, 1045079495, 1065887519) + W(7, 1058366107, 1055927247, 1042520123, 1054820368) + + W(8, 1050517144, -1103331232, 1044797187, -1106919576) + + W(9, -1136969466, -1127822612, -1111681950, 1023800268) + + W(10, -1107795033, 1030553289, -1134423957, 1039594145) + + W(11, -1127143669, 1007528111, -1112108944, 1010334934); + sum2 = + W(0, 1018519238, 1015687849, -1123243110, -1154321191) + W(1, -1147705571, -1137574530, 1025499637, -1123293958) + + W(2, 999332143, 1021267259, 1021268373, 1001850235) + W(3, -1122367554, -1149097003, 1028798873, -1120881342) + + W(4, 1041061518, -1105547391, 1034089943, -1097359239) + W(5, 1024181853, 964634475, -1139074510, 1038775557) + + W(6, 1033756160, 1042746528, 1026544409, 1057524548) + W(7, -1128118669, 1033087855, -1129467393, -1131901697) + + W(8, 1071473984, 1066765865, 1067795051, 1059938647) + W(9, -1126584943, -1109247299, 1002507759, -1137941026) + + W(10, -1074851124, -1079967238, -1079279124, -1081222132) + + W(11, 1036308208, 995399503, 1006964374, -1131371017); + WS(1032292188, -1145187004); + sum1 = W(0, -1121091224, -1124591439, -1121198813, 1009701366) + + W(1, 1007646671, 1026658136, 1020346030, -1122546321) + W(2, 1026282854, 1032165735, 1048823572, -1113803654) + + W(3, -1119045850, -1092992668, 1019935126, -1119672872) + + W(4, -1110430066, -1099744666, -1088767505, -1109489438) + + W(5, 1041537816, 1047050636, -1121506375, -1110555528) + W(6, 1041424886, 1053335502, 1045555550, 1044961340) + + W(7, -1098280566, 1043075732, -1107270401, 1047792295) + + W(8, -1163709786, -1097458647, 1040806261, 1038271382) + + W(9, 1040783354, 1037260307, 1000329008, -1120965766) + + W(10, -1130362518, 1026340962, 1020242430, -1136150382) + + W(11, -1117600916, 997023189, -1124456788, 1026784415); + sum2 = + W(0, -1120115102, 1024423113, -1131404107, -1162462122) + W(1, -1116017912, 1035047655, -1146105278, 1011265421) + + W(2, 1027036707, -1119221834, 1034928052, -1115806512) + + W(3, -1133321326, -1101382306, 1029706393, 1023154260) + + W(4, 1028744443, -1122478763, 1034534080, -1117650486) + + W(5, -1108495610, -1105332910, 1038914207, -1113944011) + W(6, 1037973272, 1049287438, 1047707985, 1065549495) + + W(7, -1079218451, -1101676179, -1109811124, -1116861489) + + W(8, -1111409649, -1096539764, 1032305459, 1059270295) + + W(9, 1053073262, -1108544028, -1125217018, 1023662974) + + W(10, -1114092190, 1034186497, -1111870688, -1104163224) + + W(11, -1116841516, 1038206879, 1004549098, 1021319568); + WS(1065238444, 1029810764); + sum1 = W(0, -1117664959, 1033625479, -1121511107, 1026353828) + W(1, -1154871713, 980940712, 1018182811, 1025470327) + + W(2, 1035631050, 998132025, 1046740798, 1049143094) + W(3, 1044265580, 1037075730, 1028486865, -1128624253) + + W(4, -1105662947, -1110409480, -1115600622, -1117398499) + + W(5, -1101622768, -1109487884, -1112099063, -1120941494) + + W(6, 1044376095, 1041425605, -1117226857, -1088462543) + + W(7, -1090821428, -1099167518, 1039936213, -1117520833) + + W(8, -1180059800, 1029921727, 1047596134, 1050498082) + W(9, 1032067983, -1134957959, 1021107193, 1019194744) + + W(10, -1144996235, 1002652741, 986508455, 1031133314) + + W(11, -1119889178, 1038687768, -1122286680, 1032539083); + sum2 = + W(0, 1027136813, -1126103938, -1134438995, 1023841561) + W(1, 1003327910, -1130954514, -1135210803, 994333964) + + W(2, -1109237812, 1029641913, -1108335880, 1016569578) + W(3, 1032415828, 999116870, 1003972614, -1138234067) + + W(4, -1131106290, 1047599733, -1097134429, -1076957808) + + W(5, 1044824498, 1037851390, -1123469057, 1043898273) + W(6, 1028116649, 1041211299, -1092284431, -1103461794) + + W(7, 1073063564, -1111597872, 1033926584, -1115472968) + + W(8, -1115313320, -1119521049, -1100904528, 1040752059) + + W(9, 1045381268, -1112786376, 1034574746, -1137298819) + + W(10, -1132573667, 1022404146, 1016921434, 1027441157) + + W(11, -1106952976, 1036890340, -1110049884, -1139674515); + WS(-1111543132, 1053084187); + sum1 = + W(0, 1033211657, -1116548448, 1043994373, -1112421659) + W(1, 1033458902, 1042588164, -1106715184, 1042106754) + + W(2, 1029336727, -1100473306, 1036113196, -1100606697) + + W(3, -1117467379, 1024205686, -1098518156, 1010302211) + W(4, 1056808676, 1042013257, 1061342772, 1060655799) + + W(5, 1059165410, 1057924951, 1042727104, 1057649845) + + W(6, -1089574549, -1097689349, -1087296749, -1082434496) + + W(7, -1087667391, -1091727169, -1095816456, -1093601226) + + W(8, -1112225370, 999357322, 1042186215, -1100755553) + W(9, 1042539448, 1041805473, -1105873704, -1114265639) + + W(10, 1035575202, -1114691470, 1040681774, 1045312421) + + W(11, 1039236406, 1042949980, -1113675407, 1035739628); + sum2 = + W(0, 1036389819, -1106855677, 1031620401, -1109245550) + W(1, 997072274, -1132619277, -1096737767, 1049991282) + + W(2, 1006854517, -1114095075, 1044374087, -1105124479) + + W(3, -1105277948, 1043212463, -1104242691, -1113287926) + + W(4, 1049279774, -1106885840, 1052305677, 1054861276) + W(5, 1057655059, 1046093411, -1094755169, 1057224822) + + W(6, -1104547241, -1120692701, 1045612807, 1058901209) + W(7, 1054428932, 1034709627, 1054770354, -1094426804) + + W(8, -1140479293, -1096936463, 1051540981, -1092919117) + + W(9, -1129490106, 1034565381, -1092959620, 1030915645) + + W(10, 1032391465, -1098591621, -1115708783, -1081363743) + + W(11, -1090444858, 1017473602, -1098730750, 1044114915); + WS(-1084020140, 1068126260); + sum1 = + W(0, 1006295077, -1137936208, 1034316741, -1149620895) + + W(1, -1141477121, -1110713826, -1119964867, -1159113641) + + W(2, -1156074282, -1103771606, -1104490636, 1038480604) + W(3, 1018703789, 1041233006, 1031629367, 1005339683) + + W(4, 1049019906, 1049395923, 1061237576, 1033598516) + W(5, -1094713154, -1098857908, 1023717620, 1036793310) + + W(6, -1097931528, -1091558419, -1086810430, -1099102215) + + W(7, 1059440745, 1018408058, -1122483505, -1108866660) + W(8, -1117241095, 1040511881, 1040083512, 1044377854) + + W(9, 1044961993, -1146014215, 1038059949, -1129764324) + + W(10, -1123621559, 1023627215, -1108467318, -1115694024) + + W(11, -1120119968, -1145494414, -1122997930, 1007729326); + sum2 = + W(0, 1015277664, -1114453597, 1036987011, -1112547401) + W(1, 1038859445, -1116674795, 983557058, -1127718668) + + W(2, 1025130698, -1134749664, 1032879133, -1134874844) + + W(3, -1112115766, 1018163604, -1128408082, 1003243264) + + W(4, 1027591084, 1033917561, -1126832950, -1114337945) + W(5, 1026538526, -1114930086, 968847366, -1132712652) + + W(6, -1117062871, -1115087054, 1055956188, -1108159193) + + W(7, 1052262112, 1032023389, -1105383385, -1120777676) + + W(8, -1101670769, -1114105716, -1097729634, -1123425664) + + W(9, 1058230624, 1047994902, 1046456588, 1042953566) + + W(10, 1019605180, -1131991228, -1104354242, -1097147867) + + W(11, -1101321392, -1100180330, -1106875572, 1009596296); + WS(1044178094, -1112419455); + sum1 = W(0, -1131480425, 1014469647, 1033460669, -1111970637) + + W(1, 1018155424, 1028778773, -1120733619, 1036392279) + + W(2, 1028145051, -1106904202, -1114114798, -1103921210) + + W(3, -1104772954, -1105642670, -1122369255, -1105836421) + + W(4, 1050373320, 1050878345, 1059597501, 1061375910) + W(5, 1062331213, 1054878354, 1050980308, 1057064179) + + W(6, -1113746394, -1101407218, -1089975999, -1083033439) + + W(7, -1089702156, -1100724747, -1095744476, -1096031599) + + W(8, -1097767254, 1036986154, -1106579916, 1025899544) + + W(9, 1034746546, 1032512190, -1113254377, -1120232930) + + W(10, 1005496122, 1009224698, 1010606701, -1155279741) + + W(11, 1027233072, 1015772371, -1131981388, -1140419566); + sum2 = W(0, 1044058702, -1105410550, 1033398047, -1119512188) + + W(1, -1121578506, -1129503263, 1005093795, -1116781712) + + W(2, -1120335698, 1016883675, 1032351899, -1103364509) + + W(3, -1123961512, 1043612533, -1110855577, 1044044613) + + W(4, 1041124235, 1035757794, -1105578788, -1105098443) + W(5, 1037191880, 1025665274, 1024086018, 1023695645) + + W(6, 1021344157, -1104385836, 1068114101, 1052569394) + + W(7, 1027075889, -1095293941, -1113226379, -1106316439) + + W(8, -1087803383, -1085495757, -1081571635, -1086748155) + + W(9, 1031589750, 1048618044, -1121765158, 1039073287) + W(10, 1057976488, 1058928386, 1051244378, 1048853947) + + W(11, -1130402783, -1124003088, 1010599720, -1120128288); + WS(-1095246679, -1087513362); + sum1 = W(0, 1027634667, 998672596, -1149130110, 1026870673) + W(1, 1006905115, 1027369115, -1156874400, 1027010724) + + W(2, 1005582218, 1034119552, -1098084154, -1141537276) + + W(3, -1098155038, -1115874224, -1130796284, -1110211381) + + W(4, 1054139855, 1049059024, 1052649123, 1065515488) + W(5, 1064339388, 1053781857, 1050040635, 1056042372) + + W(6, -1093682933, -1099832192, -1089047862, -1088853800) + + W(7, -1084571535, -1097071228, -1107001190, -1095503614) + + W(8, 1002440559, 1040529483, -1122861959, -1126585773) + + W(9, -1099945809, -1105399392, 1023818537, -1117200441) + + W(10, -1142612208, 1024339285, 1025618962, 1014930618) + + W(11, -1117714471, -1136815962, 1018962754, 1028298602); + sum2 = + W(0, 1021849900, -1131412357, -1118206650, -1125196517) + W(1, 1035111533, -1144348946, 1021086832, 1020034266) + + W(2, 1041438934, -1119369172, 1040592619, -1114002177) + W(3, 1032710077, 1044882286, -1106944856, 1034465258) + + W(4, -1128850825, 1021256857, 1046750596, 1025252531) + W(5, 1048692472, -1128830461, 1032666924, 1034167215) + + W(6, 1035803991, -1111021944, 1038923952, 1072474004) + W(7, 1077302109, -1095554578, 1044371493, -1126088605) + + W(8, -1100551265, 1042971908, -1109478151, -1083937830) + + W(9, -1067064389, -1084038225, -1106119426, -1103479472) + + W(10, 1028120411, -1109090883, 1026074630, -1100770381) + + W(11, 1049109423, 1041329596, 1033664959, -1114595648); + WS(-1086863724, -1072185677); + sum1 = W(0, 1028385114, -1117432553, 1039695343, -1109809663) + + W(1, 1021420394, -1123921882, -1130768465, 1022384484) + + W(2, 999422396, -1108936247, -1104614655, -1104994067) + + W(3, -1154652341, -1146863602, -1114930982, 1034006493) + + W(4, 1054099261, 1053618221, 1060257868, 1062802560) + W(5, 1056152893, 1045520765, 1044268562, 1050379178) + + W(6, -1096116227, -1097427086, -1085349189, -1083398775) + + W(7, -1099176000, -1110026089, -1104661441, -1115290030) + + W(8, -1144842721, 1026659130, 1037424170, 1038629270) + + W(9, 1048207210, -1118540449, -1129199023, -1101129750) + + W(10, -1139590961, 1021035463, -1123772160, -1103266023) + + W(11, 1017905387, -1111374457, 997564786, -1108736604); + sum2 = W(0, -1122660132, 1028330563, -1115262781, 1045687787) + + W(1, -1108704409, 1029063313, -1116092784, 1013546756) + + W(2, 1040406414, 1017997140, 1025264396, -1103384157) + W(3, -1151694751, 986929807, 1026201848, -1115691336) + + W(4, 1007232002, 1025921746, 1043786284, 1040909479) + W(5, -1108714653, 1043690826, -1119932664, 1038266954) + + W(6, -1096101684, 1022732374, -1102241564, 1055010544) + + W(7, 1057419270, -1126901852, 1047767958, -1115096031) + + W(8, -1114861255, 1041150821, -1094431556, -1078483413) + + W(9, -1079156700, -1078269109, -1092610189, -1098859524) + + W(10, 1041847394, -1105481885, 1055232297, 1061241514) + + W(11, 1063042984, 1067726336, 1054314043, 1052159629); + WS(-1100931758, -1079897221); + sum1 = W(0, 1002503979, 1034941050, -1106318298, 1040768819) + + W(1, -1115730241, -1141069099, 1027555620, -1123362142) + + W(2, -1105750735, 1038153885, -1105238364, 1049149819) + + W(3, 1028324215, -1106412131, 1039911116, -1114353739) + + W(4, -1109125113, 1017797614, -1095922988, -1090093369) + + W(5, -1091054939, -1102230944, -1127686569, -1097766172) + + W(6, 1042140489, 1051948423, 1034322060, 1059094088) + W(7, 1049017573, 1050624300, 1045992036, 1043140938) + + W(8, -1126416416, 1024057510, -1103862864, 1040510958) + + W(9, -1112163155, -1106256757, 1017980086, 1018029782) + + W(10, -1119888216, 1035399096, -1104877795, 1042879258) + + W(11, -1120272065, -1112985689, 1033961137, -1117933580); + sum2 = W(0, -1118098210, -1106915273, 1038839398, -1115506453) + + W(1, 1032442192, 1016491198, 996494424, -1145352236) + W(2, 1039272612, -1120265428, 1047577900, -1112696018) + + W(3, -1123012045, -1123570623, -1121836120, 1026228225) + + W(4, 1033865352, 1043187452, -1107536005, -1090204449) + W(5, 982996928, 1042935567, -1120793710, 1030161309) + + W(6, -1107428188, -1111026913, 1034998667, 1068488571) + + W(7, -1096446249, 1013219076, -1101384300, 1023915500) + + W(8, 1041731770, -1108614463, -1104254290, -1073443109) + W(9, 1040126834, 1041050172, 998034192, 1038049010) + + W(10, -1138511840, -1129236656, 1049639209, 1065503173) + + W(11, 1035312463, -1104804103, 1040382819, -1106858818); + WS(1060652716, -1122012062); + sum1 = W(0, -1136700086, -1120727741, -1136846536, -1102129381) + + W(1, 1035874533, -1111246103, 1019584793, -1111739075) + + W(2, -1113850590, 1022556549, 1030968440, 1036351121) + W(3, 1049961616, -1119797202, 1037896960, 1033695743) + + W(4, -1093156519, -1098011208, -1100004083, -1079676696) + + W(5, -1097573322, -1087704492, -1096988084, -1092447605) + + W(6, 1056384406, 1052398904, 1062519968, 1061355096) + W(7, 1059521337, 1052440101, 1048869443, 1048091420) + + W(8, -1101587139, -1106430355, -1132405458, -1107897312) + + W(9, 1048756772, -1109566980, 1020055223, 1043876621) + + W(10, 1021600449, -1114714908, 1016310696, -1113036024) + + W(11, 1022545811, 956768943, -1121983087, 1018273385); + sum2 = + W(0, -1134928360, 1028726521, -1102649789, 1041988393) + W(1, -1105797881, -1125378124, 1034345705, -1134413224) + + W(2, 1033535752, -1102458559, -1114678181, 1050124192) + + W(3, -1102215651, 1032107719, 1014416128, -1119150822) + W(4, -1108867200, 1031241917, 1028753942, 1056497468) + + W(5, -1090602802, 1057082230, 1023046526, 1025484112) + W(6, 1056652859, 1048810536, 1051021341, 1036208495) + + W(7, -1099717915, -1114740583, 1002570703, -1101875417) + + W(8, -1094974673, -1100509489, -1100441695, 1034323322) + + W(9, -1115767916, 1041259997, -1122784508, 1037850051) + + W(10, 1034782854, -1123876292, -1100025719, 1037384204) + + W(11, -1098766868, 1024245049, -1114560124, -1112409616); + WS(-1104650926, -1097620835); + sum1 = W(0, -1121602225, 1021304961, -1132438763, 1033606955) + + W(1, -1119908749, 1032325913, -1112547088, 1011690407) + + W(2, 1025795527, -1105437010, 1039870965, -1097752993) + + W(3, 1037504305, -1109081755, -1121171172, -1116159153) + + W(4, 1046345311, -1108985665, 1041625463, -1144407721) + + W(5, -1100934531, 1047145475, -1119544288, 1036418740) + + W(6, -1105175020, 1045711217, -1093274991, 1062570208) + + W(7, -1099088029, -1097698093, -1136783989, -1106563213) + + W(8, -1160491701, -1117138161, 1040158758, 1049985633) + W(9, 1037586881, 1004919651, -1124949278, 999804916) + + W(10, 1000929055, -1145522137, -1117941464, -1122762228) + + W(11, -1109694278, 1026835862, 1024727664, -1126831120); + sum2 = + W(0, -1103930431, 1043997541, -1102154605, 1046282803) + W(1, -1106269056, -1116052960, 993204113, -1113135778) + + W(2, -1122873970, -1100601593, -1174042309, -1084779372) + + W(3, -1114322527, 1046060831, -1115511338, 1041954938) + W(4, 1048581640, -1108032519, 1029742536, 1068068442) + + W(5, 1051594943, -1119470820, -1138871916, 1020181836) + W(6, -1139346648, 1042591516, 1045200151, 1052027066) + + W(7, -1098651742, -1115540046, 1021777728, -1107159950) + + W(8, 1030984702, -1123657132, -1106767363, -1086671314) + + W(9, 1024653780, -1127107345, -1163609763, -1134598872) + + W(10, -1115391660, -1107477718, 1032437784, 1025856678) + + W(11, 1036550683, -1121355040, -1115373797, -1122730046); + WS(1066180726, 1071088208); + sum1 = W(0, 1019239309, -1139409238, 1016498838, -1117575980) + + W(1, 1000209679, -1113394675, 1030691589, -1133365628) + + W(2, -1125280121, 1001471451, -1110062156, 1036666525) + + W(3, 1049354787, 1048739493, -1119525817, -1103045922) + + W(4, -1096761986, 1012641888, -1103040193, -1098591157) + + W(5, -1079760364, -1090655988, -1102803453, -1099636767) + + W(6, 1046613601, -1137946220, -1089511315, 1064065326) + W(7, 1058946251, 1056455200, 1048597558, 1050574049) + + W(8, -1107071425, 1047813898, 1045045936, 1024305865) + W(9, -1110782371, 1013890551, 981956228, 1043476657) + + W(10, 1022045682, 1006921793, 1010038708, 1025055882) + + W(11, 990559266, 1028621651, -1118324476, -1146495466); + sum2 = + W(0, -1132513434, -1110784932, 1015163300, 1015068960) + W(1, 1033174530, -1135254713, 1032888151, -1132281738) + + W(2, 1043448685, -1133524329, -1107748756, 1038994810) + + W(3, -1104237963, -1120882016, -1105704866, 1042278645) + + W(4, -1099364915, 1037755510, -1102119678, 1041992963) + W(5, 1059473601, 1015880446, 1034086136, -1087682569) + + W(6, -1092624350, 1047633966, -1120785461, 1052941265) + + W(7, -1112171819, -1149514732, -1106883398, 1032085587) + + W(8, 1056566992, -1103089496, 1032253510, -1122308723) + + W(9, 1028984470, -1121912217, 1037486360, -1121651695) + + W(10, -1119372495, -1105722911, -1123661455, -1115405106) + + W(11, -1126727948, 1038410412, -1113287020, 1025242322); + WS(1036385628, 1044378228); + sum1 = W(0, -1125923878, -1122454178, -1106272614, 1034604284) + + W(1, -1112814039, 1030894675, -1123079474, -1130721815) + + W(2, -1119989961, 1024777096, 1045742974, -1106270482) + + W(3, -1097223397, -1112273196, -1131680651, 974203052) + + W(4, -1113894352, -1109744594, -1081686591, 1049041391) + + W(5, 1058546239, 1043400251, 1024933634, -1127331477) + W(6, 1034400041, 1050462805, 1057689729, 1056885773) + + W(7, -1082103097, -1111542214, 1032256832, 1030325078) + + W(8, 1040468885, -1118152051, -1112362495, -1111838475) + + W(9, 1051410218, 1042722054, -1104716944, 1028514056) + + W(10, -1119159494, -1136375156, 1016953331, 1033159371) + + W(11, -1127987422, 1008300000, 1020481857, -1122308858); + sum2 = W(0, -1126857538, -1118763531, 1031801448, 1032593429) + + W(1, 1004108563, -1119835024, 1016299757, -1169697445) + + W(2, -1124098806, -1105376950, 1037674477, -1110580495) + + W(3, -1116861031, 1039467599, -1109178305, 1033383777) + + W(4, 1017023528, -1096176503, 1067983244, -1078904043) + + W(5, 1060638644, -1111109918, -1098624444, 1040587540) + + W(6, -1105780084, -1094874635, 1071605005, -1075832971) + + W(7, 1065456263, -1112838992, -1104548941, 1006549790) + + W(8, -1128747572, -1140350635, -1109792866, -1097243929) + + W(9, 1040323331, -1114824160, 1033955221, -1127435882) + + W(10, -1133097491, 1036694112, -1111308161, 1036064001) + + W(11, 1039332997, -1103055030, 1027541135, 1022453269); + WS(1044586414, 987793058); + sum1 = W(0, 981244734, 1029861564, -1127551587, 1008852553) + + W(1, -1110264932, -1120415085, -1128191927, -1111219811) + + W(2, -1094962922, -1105742952, -1103252055, -1106380176) + + W(3, 1039776063, 1036900841, 1025145152, 1028803677) + W(4, 1056192743, 1054313512, 1058042871, 1048369556) + + W(5, -1104749720, -1097596121, -1105335335, -1103570473) + + W(6, -1106851755, -1099782448, -1098041547, -1096188128) + + W(7, 1052995119, 1058305414, 1045503990, 1055249646) + W(8, -1119312576, 1027895469, 1019737521, -1121596880) + + W(9, -1106765091, -1098125906, -1106717007, -1101993823) + + W(10, -1109764848, 1032524411, -1110892330, 1024237680) + + W(11, -1120426409, 1026360866, -1151171624, 1031597860); + sum2 = W(0, -1170894487, -1116947191, 1031282910, -1112734885) + + W(1, 1042944653, -1112368696, 1023647443, -1149951158) + + W(2, 1038321486, 1032730216, 1034140662, -1104751545) + + W(3, -1102906173, -1115060896, -1124833342, -1103764076) + + W(4, 1053283699, -1102463031, 1044178467, 1054507486) + + W(5, -1128523954, 1038784522, -1109068581, -1105151256) + + W(6, -1093894288, -1109920837, -1089191295, 1065532097) + + W(7, -1115680584, 1029167633, 1021288403, 1048070264) + + W(8, -1100030896, 1047091130, -1097946325, -1095028025) + + W(9, -1094781909, 1050920778, -1113980416, 1052479172) + + W(10, 1046510222, -1098101478, 1046381950, -1113780206) + + W(11, 1020709100, -1114933696, -1114621382, -1120673083); + WS(-1114317660, -1079530866); + sum1 = W(0, 1005492722, 1045601427, -1125684614, 1040691817) + + W(1, -1138701159, -1122106750, 1010492340, -1132247342) + + W(2, -1115918380, -1100871485, -1122621547, -1094477942) + + W(3, 1044150368, 1041157065, 1039210328, 1037992735) + W(4, -1124407701, 1040297908, -1098312611, 1054673340) + + W(5, 1041833209, -1120050519, -1116922669, 1025359158) + + W(6, -1116105277, -1115200394, -1103806788, -1097950923) + + W(7, -1088150296, 1040435582, 1025767275, 1032362656) + W(8, 1041270838, 1034785295, 1049040249, -1103823208) + + W(9, -1129519613, -1121264402, -1133614768, -1107139719) + + W(10, -1125596386, 1024917256, 1026343653, 1033886401) + + W(11, 1039772509, 1028146611, 1030520276, 1032249339); + sum2 = W(0, -1155531695, -1116868484, -1135508412, -1106991844) + + W(1, -1135674828, 1001487940, -1119877490, -1131775200) + + W(2, 1035594747, -1130123766, -1121397012, -1115576312) + + W(3, -1126221532, -1107263445, -1121744498, -1125291430) + + W(4, -1111112193, 1034328851, 1033705026, 1050004218) + + W(5, -1117911568, -1123887534, 1017446183, -1110635219) + + W(6, -1101564588, -1113096514, 1029679690, 1048453590) + W(7, 1050922209, 1043692754, 1034884616, 1032206024) + + W(8, -1116834132, -1115452418, -1152418495, 1029930774) + + W(9, 1007646710, -1114385718, -1122169416, 1016330315) + + W(10, -1130931838, -1123313694, 1018386998, -1127714868) + + W(11, -1121358676, 1023927325, -1115969900, -1122013064); + WS(1066254326, -1103165682); + sum1 = + W(0, 1032736195, 1027879829, 1031762634, -1123062443) + W(1, 1004281096, -1148973229, -1119568276, -1130151676) + + W(2, -1107990998, -1114107453, -1103287009, 1041209406) + + W(3, 1039171204, -1113506869, 1029657432, 1042306865) + W(4, 1040177417, -1121888407, 1058340070, -1097968365) + + W(5, -1082040497, 1042461256, -1110264442, -1106785311) + + W(6, -1102376817, 1024426522, -1086180914, 1045901207) + W(7, 1060563077, 1045252895, 1035749465, 1042341554) + + W(8, 1034252186, -1134855959, 1048880356, -1117801777) + + W(9, -1108119503, 1021862138, 1017288487, -1125959462) + + W(10, 1019040113, 1012754494, -1128188760, -1116847305) + + W(11, -1149008906, -1140572507, 1021245074, 1010461490); + sum2 = W(0, 1021177914, -1124089023, 1026640236, 1019818775) + W(1, 1019369915, -1106530127, 1038187852, 1030498751) + + W(2, -1111267114, 1044764288, 1026571855, -1103902938) + + W(3, -1139759728, 1046869720, -1116925721, -1107211067) + + W(4, 1038432054, -1106310853, -1115065858, 1063205014) + + W(5, 1054784388, -1096246655, -1115197568, 1035488589) + + W(6, -1105822865, -1100663157, -1088005063, 1066152263) + + W(7, -1093573252, -1098236584, 1033917272, -1107121631) + + W(8, 1037666445, 1039738660, -1097556837, -1094681119) + + W(9, -1095778937, 1051664274, -1104072801, 1038730556) + + W(10, -1122267795, -1121288215, 1045614354, -1112191805) + + W(11, 1041592438, -1110480242, 1015983837, 1022742082); + WS(1062838508, -1098141683); + sum1 = W(0, -1134697126, 1033720508, -1121504814, -1119656591) + + W(1, 950602286, -1114868293, 1034808260, -1113093265) + W(2, -1129876167, 1021336509, 1014720225, 1046652247) + + W(3, 1047400131, 1033072079, -1139606129, 1026913289) + + W(4, -1116304310, -1104597903, -1101916102, -1082370571) + + W(5, -1091801796, -1096699752, -1121911577, -1098146380) + + W(6, -1099161722, 1019102333, 1049624810, 1058084844) + W(7, 1053105145, 1050650780, 1034036747, 1048726310) + + W(8, 1038618718, 1045312786, 1036131058, 1029119981) + W(9, -1119759594, -1119884597, 1024218735, 1017329950) + + W(10, 1030514076, -1118743028, -1134396481, 1009920435) + + W(11, -1132133195, -1133963803, 990998386, -1121758433); + sum2 = + W(0, -1120814392, 1018600110, 1027325255, -1124538308) + W(1, -1127260613, 1007599328, -1128821133, -1125977712) + + W(2, 1026947049, -1114533760, -1112504706, -1107191892) + + W(3, 1023329910, -1124222597, 1024046209, 1019591350) + W(4, -1124609851, 1043306429, 1030055965, -1090928488) + + W(5, 1046523168, 1015958190, 1022187138, -1115445424) + W(6, 1029294693, -1096357662, 1075131584, -1118772404) + + W(7, -1092017575, -1113584525, -1109468012, -1105922548) + + W(8, -1089366560, -1078857162, -1106088729, 1060040329) + W(9, 1045316672, 1047822624, 1021757630, 1038940063) + + W(10, 1054044776, -1109773692, -1105806639, -1102685120) + + W(11, -1119137158, 1032716843, -1120065319, 1016647840); + WS(1054286935, 1054427377); + sum1 = W(0, -1139016422, 1015966225, 1034481375, 1029692191) + W(1, -1118014037, 1037138557, -1107878452, 996243233) + + W(2, 1031868724, 1024526894, -1107528289, -1123790766) + + W(3, 1033739398, -1101429240, 1035472806, -1114181077) + + W(4, -1103470657, -1100637795, 1043922306, -1096987004) + + W(5, -1103397016, 1045510949, -1113746932, 998962565) + W(6, 1027450488, 1046711412, -1098573729, 1036148808) + + W(7, 1053311986, 1016118627, -1127637067, 1041113135) + + W(8, 1036611766, -1105992614, 1045477269, -1138151730) + + W(9, -1103945702, 1013880803, 1041047838, -1118755335) + + W(10, -1113202838, 1036202402, -1121078688, 1006910195) + + W(11, 1033532379, -1135069562, -1112788047, 1020627009); + sum2 = + W(0, 998302909, 1020343611, 1029585253, 1014080934) + W(1, -1135780688, -1115911996, 1018594371, -1117868456) + + W(2, -1114977231, 1031676937, -1113383024, 1053648356) + W(3, 1044096370, 1042686855, -1108781434, 1037265024) + + W(4, -1111023634, -1115901635, -1091081120, -1095412525) + + W(5, 1066870285, -1137657706, 1043350243, -1126645268) + + W(6, 1036510752, -1117993552, -1099268355, -1083342245) + + W(7, 1034064765, 1037488276, 1014772326, -1113946823) + W(8, 1004185429, 1041465226, -1113451820, -1115471327) + + W(9, -1118193886, 1023464409, -1138084208, 1032826620) + + W(10, 1033017445, -1113757911, 1021941233, -1161911507) + + W(11, -1120710156, 1018751107, -1148724493, 967002060); + WS(1069042774, 1023813606); + sum1 = + W(0, -1120569815, 982627530, -1113058670, -1122018428) + W(1, -1110295833, 1021479086, 1001627822, 1013049407) + + W(2, 1029846837, -1113747494, 1033076468, 1039673254) + W(3, 1038190732, 1046432919, -1134594983, 1016231853) + + W(4, -1087916882, -1109565588, -1095056850, -1085384902) + + W(5, -1083727323, -1089999723, -1094559921, -1094610970) + + W(6, 1052864835, 1048856613, 1056781822, 1059308179) + W(7, 1063669175, 1059014405, 1044534497, 1048044230) + + W(8, 1037940281, 1011966045, 1041407837, -1107102153) + W(9, -1111254596, -1110936865, 1025983877, 1046858383) + + W(10, -1130288148, -1136915076, -1140629239, 1027021082) + + W(11, 1007651659, -1128736648, -1139332738, -1114487747); + sum2 = W(0, -1097118790, -1115645027, -1109249259, 1042765123) + + W(1, 1015795842, 1028792702, -1116071919, -1105083736) + + W(2, -1088323667, 1030684990, -1081609065, -1082143899) + + W(3, -1102809807, 1059694558, 1064574838, 1072110122) + W(4, 1067177084, 1056476304, 1058423359, 1061996602) + + W(5, 1006287482, -1085597397, -1080103447, -1081832849) + + W(6, 1049654149, -1101283859, 1057270411, 1055747315) + + W(7, -1087207348, -1106003210, 1023804763, -1090423898) + + W(8, -1120538318, 1040556965, -1122455315, -1120372038) + + W(9, -1106540179, 1042932361, 1048665861, -1101912272) + + W(10, -1108580354, -1124995735, 1017763415, -1114753052) + + W(11, 1040354664, 1033427208, -1098395984, 1049644025); + WS(1046279854, -1100682627); + sum1 = W(0, -1155754074, -1110611178, 1022309140, -1118509483) + + W(1, -1109973457, 1022155595, -1107208537, -1117715774) + + W(2, -1109896894, -1114421037, -1131162933, 1027993210) + + W(3, 1040243222, -1117693450, 1019138289, 996768085) + W(4, -1107576521, 1030120983, -1094043528, 1062355587) + + W(5, -1094900881, -1110047247, -1110631994, -1107567326) + + W(6, 1035511522, -1124410677, 1038811574, 1059809630) + W(7, 1038778317, 1046487839, -1127423844, 1039784548) + + W(8, 1002805634, -1114543731, 1039227081, -1113128332) + + W(9, -1105636701, -1109843880, 1004796827, -1112311954) + + W(10, -1116898232, 1008443967, -1122237996, -1141634631) + + W(11, 1021837827, -1132048229, -1123472091, -1128081977); + sum2 = + W(0, -1155805362, -1111094572, 1028160711, -1123681391) + + W(1, -1116453985, -1119301235, -1108559318, -1115385578) + + W(2, -1107499970, -1112866732, -1106540686, -1140638716) + + W(3, 1031083122, -1139408516, 1034592379, -1116565509) + W(4, 1022847832, 1044264749, -1155674450, 1057429467) + + W(5, -1106158641, 1025824831, -1111164410, -1121519923) + + W(6, 1035480223, -1148903065, 1040150233, 1045538131) + W(7, 1031696457, 1041846065, -1120456085, -1129601606) + + W(8, -1120962569, -1114470280, 1010774604, 1016428102) + + W(9, -1120179561, -1118124541, 999266665, -1119709653) + + W(10, -1110725720, 1021130376, -1120260095, 1009992044) + + W(11, 1026515918, -1114275912, 1011855672, -1115407958); + WS(1068834358, -1130516755); + sum1 = W(0, -1110020716, 1043574522, -1110718798, -1129582842) + + W(1, -1114402010, 1034180284, 1025857751, -1111247176) + + W(2, 1034114243, -1095778974, 1047457188, -1108460854) + + W(3, 1054126843, -1096959660, 1033414773, 1039130852) + W(4, 1048068617, 1048936405, 1038642250, -1114164062) + + W(5, -1110583455, 1049433806, -1136840220, -1119539023) + + W(6, -1102038774, 1035735542, -1105529591, -1096174934) + + W(7, -1112126358, 1043709316, -1123546692, -1112879245) + + W(8, 1031998965, -1100504766, 1047377413, -1130108598) + + W(9, 1044906670, -1095231947, -1130058411, 1035429307) + + W(10, -1110620517, 1038840817, -1109142655, 1023990363) + + W(11, -1122044916, 1040978881, -1131191403, -1115530151); + sum2 = W(0, 970017593, -1125442959, -1107196630, -1108273260) + + W(1, -1130992285, -1132402709, 1017358256, 988670622) + W(2, -1108165952, 1040753488, 1033984686, 1051322703) + + W(3, -1113564209, 1041587650, -1116630320, -1122802752) + + W(4, 1047729556, 1000227776, 1038319755, 1055231112) + W(5, -1094436986, 986706110, -1124437274, -1132214419) + + W(6, -1102798485, -1088611471, -1087549565, 1062180091) + + W(7, 1046553690, -1113546876, -1120036494, 1032902155) + + W(8, -1142827268, 1049645408, -1127043239, -1103837458) + + W(9, -1107399737, 1048231400, -1124561928, -1145381770) + + W(10, 1029593938, -1108133201, -1114349374, 1035145460) + + W(11, -1114342182, -1146643074, -1126967424, 1014303584); + WS(1067517750, 1033639701); + sum1 = W(0, 1025509678, -1130341242, -1120272434, 1018375590) + + W(1, -1116961737, 1026047982, 1025041660, -1113724179) + + W(2, -1102897085, -1132678155, -1151042791, 1013105800) + + W(3, 1041000592, 1032243033, 1034904976, -1123793645) + + W(4, 1023511162, -1096924480, -1094474081, -1086033191) + + W(5, -1085852953, -1093123217, -1093479580, -1091335173) + + W(6, 1037697110, 1040728225, 1056422164, 1062857884) + W(7, 1058773976, 1063905370, 1050274619, 1057695471) + + W(8, 1039047450, -1108434135, 1032921189, -1122589009) + + W(9, -1100255843, -1106044526, -1112977566, -1136654701) + + W(10, -1138182274, -1138791135, 1010850641, 1034477848) + + W(11, -1112868181, 1026848855, -1122948276, 1007925107); + sum2 = + W(0, -1101843642, 1047092496, 1032746990, -1098074183) + W(1, 1053786699, -1096910060, 1043846267, 1023876031) + + W(2, -1101718380, -1110599661, -1127672356, -1096713677) + + W(3, -1104014372, 1035860070, -1097849415, 1051096852) + W(4, 1046322966, 1053918698, -1100340247, 1069438643) + + W(5, 1025809994, -1083706115, 1048729218, -1081917128) + W(6, 1051125372, -1092942861, 1040369276, 1074732797) + + W(7, 1050011098, -1080423025, -1117530220, -1091623712) + + W(8, -1084762721, 1058235489, -1090389206, -1088693676) + W(9, 1053232821, 999981171, -1097505133, 1050919626) + + W(10, 1050651985, -1101055683, 1050412863, -1103557505) + + W(11, 1052371166, -1099152238, 1041618808, -1123531943); + WS(-1098378327, -1087753140); + sum1 = W(0, -1149815841, 1013838405, 1021155853, 1025974631) + W(1, 1017740987, 1020943940, -1137239299, 1031952605) + + W(2, -1123262056, -1131552366, -1114416842, -1103162646) + + W(3, -1099404299, -1100518162, -1111541722, -1098489580) + + W(4, -1110243207, 997589309, -1104972312, 1042062186) + W(5, 1057054155, 1059648114, 1047878460, 1061110492) + + W(6, 1053738584, 1025605911, 1049179692, -1094476095) + + W(7, -1093068705, -1101042271, -1111532695, -1100382705) + + W(8, -1096838314, 967065877, -1108406847, -1130981226) + W(9, 1023051300, 1010424693, -1117167136, 989087216) + + W(10, 1031741109, -1135340592, 1029594857, -1145022506) + + W(11, 1005012974, -1112923496, 1030823984, -1113821120); + sum2 = + W(0, 1034695587, -1111830177, 1017885202, -1116805918) + W(1, 1039973913, -1113376464, 1024357631, -1109344122) + + W(2, 1032463913, 1031752431, -1103205904, 1045285117) + W(3, -1092035876, 1044034906, -1097056010, 1034392181) + + W(4, -1087773887, -1104893727, -1114987001, 1061301409) + + W(5, 1053784665, -1096259933, 1015259894, -1095057905) + W(6, 1051055536, 1010301739, 1045597173, 1065451004) + + W(7, 1036331211, -1101789830, -1105822235, -1098597360) + + W(8, -1103774157, 1003908630, -1107230114, 999416278) + + W(9, -1118216068, 1047293827, -1119063058, -1139528651) + + W(10, 1028563957, -1111301343, 1042437558, -1106181364) + + W(11, 1014136811, -1127455968, -1137717779, 1017174230); + WS(1051991511, -1090129628); + sum1 = W(0, -1119709994, 1028979258, 1025569135, 1025156752) + + W(1, -1113846787, 1032797781, -1137003429, -1126457798) + + W(2, 1035475128, -1103260128, -1099928080, 1041023848) + W(3, 1030722332, 1040845476, 1015665914, 1032471277) + + W(4, 1044364174, 1048862488, 1054464119, -1103260308) + W(5, -1090331224, 1039529634, 1015668019, 1036006161) + + W(6, -1099369674, -1107028176, -1092954947, 1048877896) + + W(7, 1036105176, -1113372113, -1104520406, -1111431094) + W(8, 1024914253, 1037758213, 1045752341, 992983000) + + W(9, -1115078629, 1027244574, 1039091960, -1113568276) + + W(10, -1122358045, -1142000036, -1110227337, 1023847918) + + W(11, 1018698636, -1139349278, -1131269376, 1004297100); + sum2 = + W(0, 1043798657, -1117698064, -1102458928, -1101130902) + W(1, 1025730631, 1026623851, 995294154, 1012466631) + + W(2, -1098470129, -1096590117, -1084690772, 1065791971) + + W(3, -1123809426, 1019910088, 990258218, -1124630920) + W(4, -1126555274, 1047971790, 1067678357, -1099131342) + + W(5, 1036453804, -1117295572, -1116170672, 1010360391) + W(6, 1029962999, 1037727050, 1008201251, -1083609361) + + W(7, 1031198846, -1113754273, 1030505142, -1136369090) + + W(8, 1028782608, -1161955740, -1103096568, 1051059538) + + W(9, -1106261335, 1041141064, 1028328942, -1119361560) + + W(10, -1131048284, 1022180969, -1120783295, 1014843769) + + W(11, 1020274026, -1111232000, -1127235720, 1001879503); + WS(1062559660, 1025273829); + sum1 = W(0, 1017067222, 1004255955, 1019590495, -1109975080) + W(1, 1028071367, 1004648665, -1129853588, 999516190) + + W(2, -1098241838, 1041017424, -1136327879, 1032386976) + + W(3, 1031451349, -1112687016, 1040197151, -1105242363) + + W(4, -1088364567, -1088941672, -1087512143, -1083706517) + + W(5, -1089169701, -1092690193, -1100415991, -1093365052) + + W(6, 1060515311, 1050253504, 1064814036, 1061681108) + W(7, 1061080357, 1052988124, 1048643203, 1050105214) + + W(8, -1113064427, -1115329590, -1113817187, -1146803505) + + W(9, -1112935650, 1031379878, -1112391860, 1051227835) + + W(10, 1036248943, -1133026900, 1008140615, 1028690158) + + W(11, 1010963867, 1030651112, -1133141907, -1139571464); + sum2 = + W(0, 1058977722, -1123128465, 1051128320, 1025585093) + W(1, 1043020026, -1090331128, 1037612985, -1101815127) + + W(2, -1088438618, -1084402469, -1097793743, -1092491618) + + W(3, -1090336452, -1094761348, 1032815200, -1080227574) + + W(4, -1070888183, -1068917363, -1079680807, 1078112044) + + W(5, 1082393215, 1070728174, -1090225897, 1066541275) + + W(6, -1080154822, -1109667848, -1080832517, 1058335327) + + W(7, 1067339759, 1057746923, -1122043266, 1067785018) + W(8, 1057028315, -1133954517, 1057005952, -1089499329) + + W(9, 1038175360, -1096630558, 1051816122, -1086032969) + + W(10, 1020668753, -1117456198, 1031920962, 1039195999) + + W(11, 1046190750, -1139309423, -1116527206, 1046599598); + WS(-1077531606, -1068627295); + sum1 = W(0, -1124767318, 1034866077, -1101653116, -1130761376) + + W(1, -1106412978, -1121310187, 1040285922, -1107982930) + + W(2, -1113367136, 1048375560, -1104403272, 1049955828) + + W(3, 1036710310, -1108970480, 1049541454, -1107579101) + + W(4, -1095446127, -1099058463, -1090535733, -1087242437) + + W(5, -1088900579, -1096168584, -1097928011, -1095682732) + + W(6, 1055377197, 1047513184, 1058086815, 1061174628) + W(7, 1057172304, 1056094244, 1047121222, 1054731422) + + W(8, -1111814927, 1045191539, -1094831865, 1048150628) + + W(9, -1103308083, -1102502166, 1043510842, -1103869114) + + W(10, -1126382267, 1025894069, -1117513042, 1008100281) + + W(11, 999030326, -1115104524, 1032672660, 1025118882); + sum2 = + W(0, -1118325221, -1109912068, 1055626857, 1073210842) + W(1, 1050117205, -1108710534, 1007734945, 1005945059) + + W(2, 1021086937, -1119472758, 1051951524, 1028908234) + W(3, 1044779683, 1039597247, -1130127373, 1026547602) + + W(4, 1043003051, 1026424546, -1092928023, -1081037490) + + W(5, -1093398148, 1044106321, -1119182686, 1019051617) + + W(6, -1131106753, 1030452362, -1103671831, -1079815727) + + W(7, -1105002867, 1032627417, -1108845723, 1023992222) + + W(8, -1122810381, -1109242129, 1034708821, 1035695099) + W(9, 1037167425, -1112762482, -1120996683, 999154803) + + W(10, 1007248641, 1007569065, -1112697430, 1034566233) + + W(11, -1131640977, 1020894429, -1144614067, 1009135009); + WS(1027136184, 1037475189); + sum1 = + W(0, 1032095571, -1100957374, 1042581547, 1008293424) + W(1, -1125080965, 1046313162, -1104233593, 1032243376) + + W(2, -1116112165, 1049686375, 1028374302, -1096656387) + + W(3, 1033692244, -1105885187, -1122471385, -1122778646) + + W(4, -1115063802, 1038845436, -1088748902, 1053200569) + + W(5, 1024446429, -1103807360, 1048125173, -1114896431) + W(6, 1049018533, -1106083983, 1046087792, 1044615055) + + W(7, -1090279185, 1052904956, -1106111045, -1113201013) + + W(8, -1119314641, -1120251015, 1034473457, -1099043646) + + W(9, 1029265287, 1033985068, -1106885357, 1045413959) + + W(10, -1107767341, 1047825580, -1104556803, 1041068763) + + W(11, 1035958465, -1106489925, 1037737330, -1123269230); + sum2 = + W(0, -1109957285, 1046942588, -1108558913, 1035311457) + W(1, -1103268017, 1020819182, 1017489970, -1119040125) + + W(2, 1028061230, -1090820835, -1168618571, 1053631926) + + W(3, -1140171429, 1024395745, 1034074787, -1111153127) + + W(4, 1045893852, 1047577084, -1096957845, -1097789717) + + W(5, 1058472778, 1010859305, -1118924631, -1134098557) + W(6, -1110812851, 1048459161, 1058947879, 1028951753) + + W(7, -1086199154, 1018177816, -1119421881, 1029986143) + + W(8, -1108048047, -1114577527, -1104353646, 1041621301) + + W(9, 1047742834, -1101676043, 1030918112, -1110045381) + + W(10, 1027149256, -1106934834, -1104794282, -1139749789) + + W(11, -1105608688, 1051639728, -1105627073, 1035525353); + WS(1059085676, -1120419895); + sum1 = W(0, -1123531970, 1015920803, -1129458830, 1003238718) + + W(1, 1024388894, 1019022757, -1122285937, 1029064795) + W(2, 1010567522, 1041225150, 1048968044, -1107069702) + + W(3, -1107554082, -1131681870, -1110859547, 1018058500) + + W(4, -1140828475, 1042370229, -1081896608, 1061545382) + W(5, 1057779808, 1048429719, 1046207852, 1043188126) + + W(6, 1031892193, -1105839574, 1052692461, -1113798029) + + W(7, -1080962214, 1023517883, -1107360247, -1109838114) + + W(8, -1126417758, 1021017477, -1106306215, 1033163859) + + W(9, 1051334024, 974463598, -1137698561, -1182091254) + + W(10, 1013434325, -1117671948, 1033141013, -1110196995) + + W(11, 998455538, -1104852314, -1130795454, -1115208005); + sum2 = W(0, -1115293356, -1104270657, 995357221, -1140125409) + + W(1, 1041981586, 1016190873, -1140513641, -1115228320) + + W(2, 1051048471, 1028093784, -1111420185, -1087783718) + W(3, 1031459460, 1035133120, 1028088400, 1019234873) + + W(4, -1116254969, 1055158904, -1108447426, 1057721666) + + W(5, -1086769840, -1119040585, -1121069799, 1043934745) + + W(6, -1108089569, -1104160418, -1113016550, 1060085251) + + W(7, 1041174723, -1119561801, -1114345654, -1097229960) + + W(8, -1110389222, 1040482382, -1105273681, -1106428297) + + W(9, 1046452617, 1045849559, 1044224673, -1114369945) + + W(10, 1032305896, -1109483288, 1033267880, -1106001572) + + W(11, -1115354420, -1127947625, -1119205024, 1033437588); + WS(1063842732, 1069263660); + sum1 = W(0, -1134238373, 1031532473, -1118861678, 1031846503) + + W(1, -1118980549, 1032122901, -1119645672, 1033668289) + + W(2, -1122877239, -1122091454, -1114405937, -1102409375) + + W(3, -1105793535, -1113900631, -1129606328, -1133229476) + + W(4, 1055968823, 1052972391, 1057777668, 1062381841) + W(5, 1065218890, 1051224528, 1055096307, 1043160456) + + W(6, -1099884346, -1097152888, -1088480739, -1081966868) + + W(7, -1086950263, -1107218856, -1097976619, -1106065147) + + W(8, -1101209335, -1119905385, 1025124405, -1166909210) + + W(9, 1045788186, -1105943487, 1011470685, -1107257190) + + W(10, 1027783644, 1025876211, -1133551424, -1124858713) + + W(11, -1146513705, -1136389690, -1153551023, 1024085520); + sum2 = W(0, 1008982555, -1122047761, -1134583037, -1137222855) + + W(1, -1140752305, 1029699842, -1114302140, 1026101716) + + W(2, 1017497319, -1119731325, -1110768789, 1050149080) + + W(3, 1041298195, -1094516021, 1037679865, 1029205125) + W(4, -1114050188, 1048705804, 1082656561, 1079097716) + + W(5, -1069364548, -1064571216, -1105564781, -1121859551) + + W(6, 1044555710, -1104624717, 1041907901, -1088882238) + + W(7, 1050137131, -1099205492, -1109039739, 1040352044) + + W(8, -1115112254, -1113283108, 1041138312, 1033378952) + + W(9, 1048604087, -1105508475, 1026612451, -1131493091) + + W(10, -1121509319, 1042591944, -1111081434, 1018241317) + + W(11, -1128224049, 1008906239, -1118064246, 1024193619); + WS(-1129102704, 1046511454); + sum1 = W(0, -1120255189, 992833099, -1134582632, -1138794987) + + W(1, -1157138191, -1129425099, 1016407976, -1133147960) + W(2, 1003871004, 1029362986, 988783847, 1011030567) + + W(3, -1118838023, -1111313565, -1115457860, -1106432157) + + W(4, -1098175836, -1113473140, -1095364566, -1091886143) + + W(5, 1040190185, -1149570791, 1037653026, 1038304902) + W(6, 1060542285, 1049212165, 1059935407, 1049733902) + + W(7, -1115543549, 1041064643, -1119854466, 1029519512) + + W(8, -1104614392, -1118651222, -1098721330, -1109648580) + + W(9, -1121023765, -1105481630, 1031662787, -1111089569) + + W(10, -1115237700, 1012659838, 1026034940, -1116104473) + + W(11, 1036784617, -1112251695, 1023835049, -1170197274); + sum2 = W(0, 1039353726, -1104263814, 1027240563, 1028285409) + W(1, 1032871415, -1151417050, 1027668005, 1023556565) + + W(2, 1022956598, 1036699032, -1120983737, -1106986979) + + W(3, -1095425364, -1136397826, -1108376211, -1098325150) + + W(4, -1093991321, -1154678850, -1089878099, 1067214284) + + W(5, 1047639440, 1051464555, -1104038071, 1061372327) + + W(6, -1088722171, -1088770012, -1101846939, 1070132546) + + W(7, 1045480826, -1099095249, 1043597107, -1086577064) + + W(8, 1039854738, -1104468959, -1096446657, 1029156699) + + W(9, -1098508409, 1024325599, -1148394393, 1034968116) + + W(10, -1125147089, -1123571799, 1036003207, -1117321918) + + W(11, 1027342659, -1150420266, -1138411071, 1031516803); + WS(1056411607, -1109579684); + sum1 = W(0, -1129654332, 1027988397, 1041758889, 1027974595) + W(1, 1038643645, 1038422303, -1115801276, 1047822542) + + W(2, 1040494825, 1031736403, -1118623100, -1104250813) + + W(3, 1023561152, -1115303377, -1111435064, 1037517815) + W(4, 1053570965, 1051564806, 1061336939, 1057393436) + + W(5, 1065029703, 1052932495, 1051403778, 1056446507) + + W(6, -1089114662, -1091392278, -1087917688, -1081469355) + + W(7, -1091410052, -1085011849, -1108233957, -1089621406) + + W(8, -1099475130, 1018661052, 1034322317, -1094207710) + + W(9, 1052271760, -1096091282, 1036087894, -1095410877) + + W(10, 1041782836, 1032323860, 1035039650, 1010041732) + + W(11, 1041287822, 1020820966, 1036272138, 1043391417); + sum2 = W(0, -1114696922, 1043151870, -1098855398, 1045725515) + + W(1, 1041130784, -1093166728, 1048010869, -1097485062) + + W(2, 1063327246, 1054945342, -1111180476, -1078968963) + + W(3, -1075182266, -1073598210, -1072729035, -1069127579) + + W(4, -1085101471, -1091433742, 1044429796, 1071264665) + W(5, 1068966947, 1074573142, 1072575447, 1082548410) + + W(6, -1089121793, -1108711949, -1096795753, 1049748951) + + W(7, 1041099170, -1107925652, -1087601324, 1057234494) + W(8, 1049274948, 1036153834, 1047012469, 1043607695) + + W(9, 1008700501, -1106854972, -1100708600, -1095686167) + + W(10, 1041765085, -1114908726, 1017938665, -1113887753) + + W(11, 1052357470, -1097732836, 1035577978, -1117196119); + WS(-1075355670, -1094395357); + sum1 = W(0, -1145694380, 1031927794, -1126751284, -1107635165) + + W(1, 1035883256, -1117999477, 1025403748, -1135056568) + W(2, 1013276974, 1019602069, 1034056645, 1046251906) + + W(3, -1107984424, -1101824103, -1117853800, -1113050587) + + W(4, 1022872131, 1012968093, 1064151904, 1059501808) + W(5, 1052823861, 1052884390, 1040309473, 1051481338) + + W(6, -1102394069, -1105184299, -1089968245, -1079531190) + + W(7, 1040654683, -1097950850, 1021798787, -1099617206) + + W(8, -1132601278, -1113047243, -1112578984, 1045395638) + + W(9, 1035604635, -1102570614, 1016601958, -1117559395) + + W(10, 1032373060, -1123577887, 1012023536, -1121043161) + + W(11, -1136193989, -1124087697, 1014648876, 1015049529); + sum2 = W(0, 1040559153, -1099966915, 1051040838, -1122400566) + + W(1, -1103745056, -1127876766, -1118336076, -1122216569) + + W(2, 1024400373, 1050797480, -1098907063, -1088192853) + W(3, -1132746540, 1040989775, 999475557, 1024449813) + + W(4, -1112035522, -1095559069, -1091507667, 1063399780) + + W(5, 1064106398, -1101527709, 1025976147, -1118033876) + + W(6, -1102969122, 1048535090, -1081423354, 1065515124) + + W(7, -1104928579, 1047332946, -1171911780, 1047796018) + + W(8, 1035694118, -1109162397, 1049424016, -1098794388) + + W(9, -1097345189, -1105732065, -1107661001, 1036172042) + + W(10, 1008704054, 1035803260, 1032276403, -1104133833) + + W(11, 1042270874, -1109516912, 1033064723, -1106418589); + WS(1045480366, -1089018411); + sum1 = W(0, 956510844, 998930446, -1129843310, -1113698796) + W(1, 1001814128, -1126854725, 1033942209, -1127622934) + + W(2, -1147321796, -1119371847, 1033743797, 1047477674) + W(3, 993727556, 1019312750, 991522899, -1124727396) + + W(4, -1098659472, -1114996930, -1084286683, -1080535200) + + W(5, -1100569285, -1095107249, -1106428344, -1102902186) + + W(6, 1046172476, 1016456206, 1060852743, 1065762350) + W(7, 1055209670, 1054147605, 1040201800, 1049320503) + + W(8, -1117032824, 1032232105, 1034928007, 1036591131) + + W(9, 1034876769, -1103835661, -1110790848, -1117790432) + + W(10, 1012429717, 992745416, -1120189081, -1130833259) + + W(11, -1112309127, -1162991986, 1019870324, -1166423644); + sum2 = W(0, -1135134951, -1138029383, 1039247354, -1105815405) + + W(1, 1043479193, -1108579602, 1036464698, -1114044136) + + W(2, 1034251754, -1112450391, 1048129179, 1013788103) + + W(3, -1107279344, -1098532570, -1125069222, -1106884027) + + W(4, -1112699779, 1048844919, -1081251706, -1102377508) + + W(5, 1074756442, -1079912447, 1051417558, -1113485350) + + W(6, 1028246411, -1097747276, 1030988939, -1085286825) + W(7, 1066704374, 1048531717, 1025432715, 1037742006) + + W(8, 1024730233, 1036047504, 1032907358, -1098604264) + + W(9, -1121203556, -1097926469, 1037541288, -1114746618) + + W(10, -1141862453, -1116303285, 1032058431, 1026446373) + + W(11, -1115422697, 1017067577, -1110631868, 1026757097); + WS(-1129198960, -1098545020); + sum1 = W(0, 1016631370, -1109829274, 1027654249, -1135763497) + + W(1, 1022371969, -1109147378, -1124465415, 1000105708) + + W(2, -1103774667, 1046260982, 1041444949, 1029491033) + W(3, 1033440347, 1047095266, -1135425502, 1031236725) + + W(4, -1097986678, -1103302894, -1085753764, -1087937321) + + W(5, -1100503343, -1092825640, -1114972810, -1092048676) + + W(6, 1055978916, 1038066845, 1057520791, 1064242364) + W(7, 1043702710, -1106434743, 1042256612, 1048160666) + + W(8, 998946812, 1013747092, 1033950432, -1108378356) + W(9, -1149232679, 1039795292, -1134578155, 1047273267) + + W(10, -1113370572, 1026014767, -1133701934, -1124979408) + + W(11, 1034434352, -1123636138, -1133096682, -1110866582); + sum2 = + W(0, 1008784866, -1111810524, -1123287968, 1035375858) + W(1, -1131156064, 1014562100, 1013976797, 1025684805) + + W(2, -1101060946, 1041574978, -1113715041, 1009783259) + + W(3, -1117592464, 1037249766, -1112331585, -1116058888) + + W(4, 1045200185, -1109901275, -1111729623, -1099551228) + + W(5, 1028611861, -1126723736, 1048583824, -1123970907) + W(6, 1046672822, -1123470329, 1052382391, 1057574679) + + W(7, 1037781521, -1088911756, -1105025107, -1098796399) + + W(8, -1118279822, -1113194466, -1105523541, -1090683445) + + W(9, -1089242363, 1057541056, 1046019340, 1058673062) + W(10, 994298612, -1124039764, 1016737108, 1025528776) + + W(11, 1044936991, 1038965019, -1100984465, -1111874598); + WS(1055927127, 1032414456); + sum1 = W(0, 1026777470, -1114645447, -1107741345, 1034928754) + + W(1, -1106080726, 1036990351, -1132545269, -1115024108) + + W(2, -1105922759, 1038629978, -1118870909, 1048976902) + + W(3, 1031310464, -1116578243, -1121324945, 1028926430) + + W(4, 1039415013, -1109541160, -1121580331, 1035267569) + + W(5, -1092363639, 1052806443, -1105847083, -1107491323) + + W(6, -1114467391, 1049649890, -1099187900, -1110167275) + + W(7, 1044706191, -1098780639, 1042096283, 1026721601) + W(8, 1040445212, -1118657663, 1040802710, 1050521172) + + W(9, -1122260014, 1045812872, -1112784326, 1028974308) + + W(10, -1109775801, 1029983880, -1103039897, 1032803169) + + W(11, -1106266495, -1117906236, 1031828590, -1113700371); + sum2 = + W(0, 1046339838, -1116647554, 1008329020, 1019769686) + W(1, -1108633040, 1035617664, 1033551944, -1127469148) + + W(2, -1095477634, 1046850624, 1046890022, -1090363791) + + W(3, 1015468535, -1092874283, -1110478242, 1032940188) + + W(4, 1041080449, -1097525459, -1087064144, 1051375999) + + W(5, 1042338708, 1061754259, -1118600243, -1108757958) + + W(6, -1106007640, 1046513622, 1055899106, -1097018549) + + W(7, -1122727333, -1100515622, 1043707610, 1042447169) + W(8, 1022253579, -1109703351, 1048733947, 1049672544) + + W(9, 1051464963, 1025134369, -1099218588, -1108633308) + + W(10, -1124447256, 1043170037, -1100004355, -1097807314) + + W(11, -1129042543, -1112390214, 1040819075, -1120359161); + WS(1063732396, 1030954530); + sum1 = W(0, 1032126752, 976782235, 1026279044, -1118035684) + W(1, 1028715099, -1121995199, 1032435871, -1124714096) + + W(2, 1036299263, -1151769923, 1034233519, 1048463661) + W(3, 1036782808, 1036166050, 1020132772, 1046021200) + + W(4, 1040042182, -1126287138, 1024363996, -1092651532) + + W(5, -1113174091, -1102126950, -1118937966, -1096484767) + + W(6, -1085959612, -1100277765, -1112294345, -1099766629) + + W(7, 1035866674, 1049742039, -1116277291, 1041160144) + W(8, 1040218780, 1040546448, 1044348191, 1048686290) + + W(9, 1009750781, -1118854702, 1040779899, 1026126509) + + W(10, 1017251428, -1135394341, -1164354746, 1013744650) + + W(11, -1137751148, 972654113, -1123833085, 1032085003); + sum2 = W(0, 1023560328, 1005726416, -1116687692, -1115408842) + + W(1, 1041728877, -1105589301, 1038558105, -1113100068) + + W(2, -1114346246, 1027252420, -1128267680, -1102003721) + + W(3, 1038357336, 1012806192, 1025579970, 1032847335) + W(4, 1055635447, 1058379047, -1093219742, -1075825777) + + W(5, -1122468504, 1043596623, -1110943172, 1037773232) + + W(6, 1080093571, 1066361916, -1079490865, -1069273193) + + W(7, 1048667285, 1040586029, 1032482622, -1123027612) + W(8, 1053265582, 1041698127, 1044641580, -1103412699) + + W(9, -1104322529, -1123753164, -1134749344, 1003892288) + + W(10, -1109086292, 1032891532, -1142986448, 1040229437) + + W(11, 1008854368, -1116993440, -1125346072, 1027065900); + WS(-1091386327, 1040820769); + sum1 = W(0, -1133727678, 1015097725, -1138479056, -1114059050) + + W(1, 1024901707, -1122041679, 1013224377, -1123564392) + + W(2, -1113530145, -1145488419, 1016526204, 1038143634) + + W(3, -1118547201, 1031893970, -1120867010, 1007161468) + + W(4, 1024243708, -1111308865, -1103657483, -1091368514) + + W(5, -1102986721, -1104061090, 1020963773, -1118947879) + + W(6, 1033777591, 1043618337, 1057905859, 1056300329) + W(7, 1019703993, 1024793576, -1114932462, 1024563890) + + W(8, 1009482248, -1113425624, -1104459527, -1103801765) + + W(9, 1043076580, 1039830345, 1042855834, -1129826522) + + W(10, -1122301794, 1016257779, 1026855702, -1136938187) + + W(11, -1118577003, -1111999542, -1119434421, 1018984621); + sum2 = + W(0, -1118014300, -1121259996, -1118480989, -1120519112) + W(1, 1034237400, 1031820662, -1116062192, 1029964608) + + W(2, -1107425211, 1034914627, 1057124947, 1041680563) + W(3, -1110358856, -1114315301, 1010762999, 974005161) + + W(4, 988341556, 1058886039, 1080471640, -1067455811) + W(5, -1105716188, -1113532913, 1033223294, -1106855886) + + W(6, -1122432623, 1043257251, 1049657622, -1080970083) + + W(7, -1091987171, 1051213388, -1109593637, 1037720533) + W(8, 1031639360, -1110426684, 981320073, -1105451271) + + W(9, 1044181951, -1110623014, 1038375349, 999181553) + W(10, -1122715046, 1030027284, 1022014335, 1012008135) + + W(11, -1121988626, 1009779611, -1113750985, 1028099986); + WS(1067317974, -1128063738); + sum1 = W(0, -1112292702, 1030230219, 1023947008, 1037678225) + W(1, 1016840879, 1032095758, 1018620213, 1023530868) + + W(2, 1047000343, 1008892739, 1038318737, -1110797816) + + W(3, -1118959774, -1114918032, -1114992535, 1004226268) + + W(4, -1088068429, -1130941083, -1122235065, 1055157388) + + W(5, 1048428783, 1052878187, 1036886165, 1052393190) + W(6, 1048838463, -1108932456, 1034700890, -1096039434) + + W(7, -1113377160, -1088738347, -1100769370, -1082056652) + + W(8, -1121751190, 1013016624, -1165199081, 1039874719) + W(9, 1031603132, 1045859362, 1028131502, 1050791676) + + W(10, 1027999791, 1017454988, 1031463650, 1025959551) + + W(11, 1018062255, -1143147336, 1018649043, -1115371169); + sum2 = + W(0, 1017164622, 1004731920, 1046790460, -1106036842) + W(1, 1036535757, -1103678216, 1025471738, -1122761780) + + W(2, -1091622621, 1038964407, 1049069382, 1047078409) + + W(3, -1107481011, -1098544714, 1040369699, -1107095641) + + W(4, 1072454217, -1113390241, -1080520963, -1071223185) + W(5, 1059476479, 1061994978, 1053016271, 1054597152) + + W(6, 1067262657, -1112910469, 1044434118, -1073367678) + W(7, -1099641871, 1029437169, 1051233508, 1062276141) + + W(8, -1098954881, 1038887363, 1033204278, -1106847320) + W(9, 967303234, 1030771421, -1123160801, -1113404397) + + W(10, 1035940089, -1108193245, 1032575148, -1127548642) + + W(11, 1015223408, -1109007913, 1042599225, -1116480773); + WS(-1095745367, -1102532016); + sum1 = + W(0, -1117700567, -1125050061, -1104292247, 1032821374) + W(1, -1106685309, 1026094807, -1109617979, 1025256272) + + W(2, -1131139906, -1115476726, 1044141479, 1043020835) + W(3, 1033588284, 1027591436, 1031476842, -1109574827) + + W(4, -1104729417, 1049785973, -1096094522, -1103984511) + + W(5, -1135965844, -1092452582, 1035377859, -1108767399) + W(6, 1031266390, 1034862742, 1043929817, 1025371182) + + W(7, 1048857569, 1049600882, -1127826823, 1045422790) + W(8, 1034962037, -1108925228, -1121682994, 1003529681) + + W(9, -1108409524, 1029191534, -1105178749, -1147768356) + + W(10, -1123836106, 1021444802, -1112024639, 1036065165) + + W(11, -1114922921, 1028793076, 1025559229, 1027631502); + sum2 = W(0, -1102917712, -1090566997, -1083236080, -1084121809) + + W(1, -1092542987, -1098664696, -1115432352, -1109069600) + + W(2, 1050493331, 1058641835, 1072277942, 1066117726) + W(3, 1055792221, 1016159325, -1123932559, -1107091755) + + W(4, -1104683957, -1106617401, -1083529216, -1110147426) + + W(5, 1053260074, 1047496584, 1040670728, 1041712051) + W(6, 1038417192, -1131983160, 1026745412, -1097349120) + + W(7, -1092834676, 1048447149, -1110071086, 1019306140) + + W(8, 1032679083, -1117134944, 1030312114, 1045086676) + + W(9, -1115504874, -1103742512, 1018575153, 1023956348) + + W(10, -1124032472, -1142618034, 1033461689, -1107466492) + + W(11, 1040055828, -1111688997, 1025562022, 995416610); + WS(1064673964, 1027541745); + sum1 = W(0, 1040862122, -1105951646, -1159900529, 1047048323) + + W(1, -1123048515, -1115789415, 1032172675, 1028373376) + + W(2, 1042078126, -1104573695, -1104241265, -1111978190) + + W(3, -1096920009, 1032018046, 1022298419, -1099040790) + W(4, 1060076351, 1032906140, 1059885441, 1064315273) + + W(5, 1059865934, 1050382000, 1053685923, 1058530774) + + W(6, -1092017101, -1098380055, -1084208856, -1089015252) + + W(7, -1085419935, -1095947620, -1104053605, -1087017843) + + W(8, 1050924251, -1103234546, 1045405901, 1048739529) + W(9, 1043557114, 1032498465, 1042167691, 1037400788) + + W(10, -1113513485, -1122608113, -1114509959, -1097330869) + + W(11, -1130206982, 1009712656, 1011282770, -1099616447); + sum2 = + W(0, 1039738446, -1096514001, 1067583917, 1083413745) + W(1, 1067818743, -1089267428, 1050540062, -1102208699) + + W(2, -1137481092, 1050849818, 1017170018, 1041988969) + W(3, -1115429835, 1054896719, -1108022123, 1042362507) + + W(4, 1036746190, -1109747727, -1078331016, -1066189939) + + W(5, -1077977055, 1050059376, -1119460484, -1140654200) + + W(6, 998253152, -1102987618, 1044897487, -1088427847) + + W(7, -1125950758, -1108032139, 1038480975, -1098634922) + + W(8, 1035100433, -1144728624, -1108804343, 1030429056) + + W(9, -1124211336, 1045807183, -1164441214, -1138500556) + + W(10, 1029249908, -1103405950, -1113657787, 1049519441) + + W(11, -1105416150, -1104699523, 1036658641, -1135144148); + WS(-1084384556, -1100810808); + sum1 = W(0, 1032390692, 1033258828, 1036208454, -1153131217) + W(1, 1035878930, -1113170436, 1034716867, 1008810370) + + W(2, -1101205955, -1114756638, 1034225747, -1123281148) + + W(3, 1052764669, -1110681734, -1132636906, 1010363102) + + W(4, -1095424763, -1115332589, -1089988048, -1080799329) + + W(5, -1086451675, -1089641270, -1111992667, -1089944572) + + W(6, 1056723089, 1044941511, 1059213081, 1058219330) + W(7, 1065718984, 1051546784, 1048907447, 1051751177) + + W(8, -1103994552, -1103092466, 1016698694, -1102604175) + + W(9, 1010056863, -1105901266, -1104305197, 1025009925) + + W(10, -1113631133, 1038921097, 1041433148, 1029458059) + + W(11, 1046701849, -1114617106, 1022756491, 1042675492); + sum2 = + W(0, 1003892755, -1123544386, 1040199158, -1099919704) + W(1, 1046124074, -1114201767, -1137485313, 1018916205) + + W(2, -1106845972, 1040443741, 1041556166, -1098641213) + W(3, 1043027552, -1102894487, 1031291554, 1029095170) + + W(4, -1130802613, -1099129814, 1034864555, 1044973210) + W(5, 1046986152, 1040886200, -1097152858, 1035815457) + + W(6, 1042856976, 1046395618, 1049252005, 1051151809) + W(7, -1120255910, -1098031952, -1103612985, 1034278467) + + W(8, -1090921483, -1117156960, -1101642940, -1094482604) + + W(9, 1049495257, -1113386876, -1132183417, 1026205590) + + W(10, 1035865477, -1128022157, 1029291710, 1033022953) + + W(11, 1028643166, 1031856421, -1106468948, 1020718685); + WS(-1097545175, -1081485407); + sum1 = + W(0, 1036015463, 1036906638, 1033438601, -1148467606) + W(1, -1116883369, 1043481795, -1107248831, 1035852867) + + W(2, 1034150438, -1107749409, 1025404544, -1130068931) + + W(3, -1110996648, -1129433572, -1112307200, -1133343797) + + W(4, 1057909318, 1041348600, 1058891216, 1062920275) + W(5, 1058446394, 1057530498, 1041812911, 1058924580) + + W(6, -1085934785, -1091465804, -1088212159, -1085185870) + + W(7, -1083820335, -1097522985, -1098817647, -1088845017) + + W(8, 1035924004, -1120240750, 1040930578, 1044931644) + W(9, -1110014855, 1046628778, -1112689630, 1031062731) + + W(10, 1033963168, -1115496908, 1023737332, 1034996968) + + W(11, -1109644005, 1044774695, -1109394217, 991839047); + sum2 = + W(0, -1085422352, -1073537081, -1090145600, -1103264022) + + W(1, -1098060014, 1039561049, -1111561066, -1097648243) + + W(2, -1096165509, -1097506962, 1035648589, 1037776879) + + W(3, -1106454260, -1132410675, -1095706003, -1093619532) + + W(4, 1057773529, 1050305732, 1070820271, 1064009122) + W(5, -1102687355, 1037201191, -1106323076, 1065891070) + + W(6, -1090487063, 1042351306, 1042246902, 1057815879) + W(7, 1056492080, -1132940238, 1047053654, -1104795343) + + W(8, 1044955346, -1096519547, 1012707558, 1035447241) + W(9, -1098251612, 1055262754, -1098685023, 1017091667) + + W(10, 1048850208, -1098077313, 1040847724, 1039355809) + + W(11, -1128314591, 1034334977, -1107078913, 1044351754); + WS(-1079771574, 1075069839); + sum1 = W(0, 1032166989, -1111167476, -1123178206, 1032734815) + + W(1, 1029165557, -1112820125, -1135576864, -1114861753) + + W(2, -1118529175, 1021133405, -1093562003, -1104246611) + + W(3, -1098100446, -1114628655, -1133453360, -1119446905) + + W(4, 1055702741, 1048648437, 1062276827, 1071187580) + W(5, 1061220800, 1049405702, 1042497282, 1051379002) + + W(6, -1092970539, -1092445782, -1088433116, -1118830448) + + W(7, -1097110780, -1093425874, -1109854691, -1094782027) + + W(8, -1117950828, 1033539229, -1104828877, -1114529494) + + W(9, -1112849365, 1023590922, 992807281, -1104282614) + + W(10, -1113551430, -1142239002, -1110397888, -1119974813) + + W(11, -1139975764, -1111568211, 974859957, -1107804608); + sum2 = + W(0, -1108373663, 1008476139, -1104454680, 1048684757) + W(1, -1093428939, 1053127551, -1096653504, 1052320010) + + W(2, 1058265898, -1092753943, 1052155727, -1094584251) + + W(3, 1044002260, 1027921055, -1109762731, -1093142139) + + W(4, -1105791278, -1098184263, -1106622092, 1051207789) + + W(5, 1040647411, -1092246791, 1028193495, -1102532444) + W(6, -1097633487, 1036219103, 1039768739, 1059813061) + + W(7, 1037804238, 1058749571, -1091622541, 1056925595) + W(8, 1040059628, -1096394805, 1043022076, -1089567461) + + W(9, 1053976656, -1109099791, -1128546349, -1105143398) + + W(10, 1041333883, -1106791026, 1034264586, 1043988712) + + W(11, -1094438691, 1046191998, -1105323978, 1027895571); + WS(-1080085654, 1070612946); + sum1 = W(0, 1024243697, -1118763904, -1129448298, -1125372076) + + W(1, -1130529432, -1113325424, 1028582463, -1115811081) + + W(2, -1111019203, 1017624971, 998267115, 1049904509) + W(3, 1044325341, 1036368923, 1022422215, 1029887376) + + W(4, -1099863023, -1093242824, -1096657110, -1083526619) + + W(5, -1084273056, -1089131829, -1100657096, -1095229037) + + W(6, 1051294614, 1049086721, 1054244159, 1063525996) + W(7, 1060516258, 1052725165, 1045179095, 1047234173) + + W(8, 1018553499, -1110032568, -1107816470, 1050014740) + + W(9, -1120428313, 1042939778, -1105723916, 1034815359) + + W(10, 1001929499, -1129474933, -1103030358, 1034265690) + + W(11, 1028809164, -1137068591, 995816851, 1023513072); + sum2 = + W(0, 1027629060, 1025235210, -1125103522, -1130467636) + W(1, 1000499297, 1020465580, -1138182160, 1014590712) + + W(2, -1114994936, 1042086314, -1109536432, 1043514454) + + W(3, -1116030212, 1034381305, -1133867384, 1032991925) + W(4, 1044032624, -1110089750, 1027377576, 1040857173) + + W(5, 1049094807, -1102199059, 1040209410, -1107097337) + W(6, -1120685804, 1041443307, 1041551160, 1078385077) + + W(7, 1071531230, -1097624207, 1042950964, -1110894461) + + W(8, 1028515824, -1109301707, 1038947979, -1069674168) + + W(9, -1072009528, 1042363648, -1100125727, 1020171064) + + W(10, -1128032940, 1028557604, -1095260923, 1041445431) + + W(11, 1044521776, -1111317304, 1026231984, -1115643044); + WS(-1094677847, 1071331518); + sum1 = W(0, -1108370254, 1027561514, -1098732332, -1118400576) + + W(1, -1098654343, 1020701942, -1114608461, -1102267173) + + W(2, 1050522446, -1102155388, 1051883284, 1052444946) + W(3, 1048632224, 1036179296, 1043748547, 1046936641) + + W(4, -1090412394, -1096900614, -1088235704, -1081990504) + + W(5, -1083209683, -1095695623, -1096819473, -1088405429) + + W(6, 1059909490, 1033926552, 1060113893, 1065971548) + W(7, 1057796766, 1055081266, 1048355474, 1057781222) + + W(8, -1131659964, -1108396174, -1104366446, 1016076284) + + W(9, -1094058291, 1044926426, -1102235562, -1122894705) + + W(10, 1045668787, -1099365497, 1036562753, 1045429432) + + W(11, 1027649399, -1115499084, 1020598162, 1041162909); + sum2 = + W(0, -1102306900, 1039340517, 1036459319, 1032447827) + W(1, -1099327251, 1052797014, -1122082449, -1098452307) + + W(2, 1042298222, 1011988276, -1104503945, -1099734245) + W(3, 1032726509, 1032685073, 1045894449, 1031495568) + + W(4, 1021581591, -1091773202, -1086047943, -1071833762) + + W(5, -1087097517, -1094401898, -1089730964, -1094627244) + + W(6, -1097774924, -1083547573, -1076320925, -1070847208) + + W(7, -1079468544, -1084551630, -1096261152, -1097740674) + + W(8, 1051289508, 1050176620, 1066124397, 1069182349) + W(9, 1058492703, 1061745990, 1029975482, 1062784611) + + W(10, 1044651623, 1060043835, 1072230275, 1080482397) + W(11, 1067612874, 1060905071, 1035766217, 1036170953); + WS(-1075403638, -1098484659); + sum1 = + W(0, 1008218969, 1031048294, -1123131291, 1045188911) + W(1, -1123984690, 1016373997, 1038284987, 993498863) + + W(2, -1141902179, 1016567255, -1102849342, 1018204181) + + W(3, -1097928441, -1102752375, -1119205801, -1111653947) + + W(4, 1045612697, 1051272109, 1045999461, 1067242878) + W(5, 1057827361, 1039307800, 1052680217, 1048974634) + + W(6, -1098198307, -1097302541, -1089514713, -1083074125) + + W(7, -1090995143, -1089521325, -1111274305, -1089001074) + + W(8, -1115216112, 1045061466, -1110301017, 1055219615) + W(9, 1042127630, 1018247819, 1043301703, -1112012330) + + W(10, 1014117412, 1032424528, -1117285565, 1039741805) + W(11, -1138318152, 990571063, 1035406958, 991913685); + sum2 = W(0, 1032878555, -1123900432, 1029453781, -1120535472) + + W(1, 1040510410, -1109544472, 1036988619, -1113659102) + W(2, -1136655860, 1023477569, 993352402, 1007422372) + + W(3, -1110556919, -1138628828, -1137184004, 1035524869) + + W(4, 1031615749, 1032172309, -1101515073, 1063516373) + + W(5, -1114866186, -1101753271, 1046060209, -1110546008) + + W(6, -1113247036, 1040892014, -1093800370, 1059067488) + + W(7, 1049733424, -1112478460, -1128679382, -1106958218) + + W(8, -1102324444, 1041677780, -1099560811, -1101931537) + + W(9, -1091691569, -1137342172, -1112686045, 999359657) + + W(10, 1033821831, -1122117887, -1111754290, -1118366060) + + W(11, -1131546954, 1043560141, -1110783375, 1026284797); + WS(1018938736, 1060529869); + sum1 = + W(0, -1114076530, 1008598737, 1029696041, -1118730378) + W(1, 1036159584, 1012443924, 1034257674, -1133449206) + + W(2, 1037607357, -1120766810, -1113865353, 1019917938) + + W(3, 1041300082, -1119787914, -1102751430, 1018668169) + W(4, 1045714156, 1044442542, 1057228923, 1049628033) + + W(5, -1081803320, 1042784239, 1016494120, 1031639516) + W(6, -1166977277, 1024586298, -1084710912, 1048848151) + + W(7, 1052825757, -1110703311, -1108049641, -1111061268) + + W(8, -1102825464, 985048227, 1048654858, -1109196652) + W(9, -1101625253, 1021290536, 1039349129, 1018121541) + + W(10, 1003359422, 1019680094, -1122235660, 1032134772) + + W(11, 1023446241, 1025035938, -1122160707, 1028394476); + sum2 = W(0, -1146778654, 1009999826, 1042445717, 1027431889) + + W(1, -1118789096, 1034933139, -1102516465, 1039233552) + + W(2, 1033337426, -1117028555, -1092512747, -1100415596) + + W(3, -1100913756, 1031653672, 1049736808, -1123203031) + + W(4, -1101837401, -1107426057, -1106280442, 1063146362) + + W(5, -1086144449, -1121957589, -1104136456, -1123128270) + + W(6, 1023259685, -1113617305, 1063964069, 1058459732) + + W(7, -1101061454, -1139753565, 1034026738, -1143324392) + + W(8, -1165315756, 1042598704, -1101414619, -1136881638) + + W(9, -1099212326, 1035181957, 1031514566, -1103321885) + + W(10, 1017616818, -1119841713, 1033400884, -1110929163) + + W(11, 1043348599, -1110261015, -1119239229, 1032933914); + WS(1057790316, -1113005641); + sum1 = W(0, -1123468520, 1016842734, 1017823704, 1031334797) + W(1, 1029517379, 1032276500, 1024531558, 1032934320) + + W(2, 1034968039, -1180462681, -1141354132, -1111663246) + + W(3, -1096962432, -1102337515, -1112383277, -1115337892) + + W(4, -1107161453, -1109372445, -1097660717, 1060769665) + + W(5, 1062816796, 1057344992, 1050585827, 1048852876) + W(6, 1035442035, -1126387193, 1045333479, -1097006056) + + W(7, -1085875335, -1087615930, -1099229077, -1104188731) + + W(8, -1107573447, -1110219956, -1111689634, 1016331253) + + W(9, 1042106418, 1042154624, 1021430571, 1007994773) + W(10, 1040623159, 1001956750, 1034883047, -1121213099) + + W(11, 999707420, -1110655190, 1027213229, -1125102461); + sum2 = + W(0, 1027505374, -1119743709, 1022357321, -1129702556) + W(1, 1025908250, -1116658238, 1007287620, -1132286080) + + W(2, 1006384241, 1032385395, -1110226975, 1009992786) + W(3, -1117540770, 1015280579, 1013929491, -1123806249) + + W(4, 1038217397, -1124784904, 1036163691, 1038388564) + W(5, -1107551412, 1043662427, -1110875284, 1032548500) + + W(6, -1102596332, 1055108824, -1095998103, -1096068823) + + W(7, 1027585837, 1052401764, -1112465838, 1049275421) + + W(8, -1088198084, -1101781911, -1077861124, -1082211809) + + W(9, 1067639721, 1063419774, 1041946916, 1054953848) + W(10, 1054112069, -1110486748, 1063443275, 1060625206) + + W(11, -1095993202, -1084462256, 1040943353, -1088060635); + WS(1057314092, 1031126097); + sum1 = W(0, -1113264897, 1042921300, -1118216326, 1036778483) + + W(1, 1035020911, -1108928881, 1036290288, 1012907241) + W(2, 1047286031, 1038748523, 1040626286, 1048990343) + + W(3, 1036098930, 1042428894, 1016422504, 1041504752) + W(4, 1051515170, 1044373061, 1057172805, -1111196723) + + W(5, 1053560288, 1053915059, 1044112316, 1048512334) + + W(6, -1091122512, -1119263830, -1081529962, -1076778621) + + W(7, -1085296972, -1112351005, -1100809115, -1107245185) + + W(8, 1035529026, 1016709539, 1043973191, 1049229393) + W(9, 1046938632, -1123285785, 1035877806, -1123727583) + + W(10, -1125355113, 1029610636, 1029771624, -1112976162) + + W(11, 1041831703, -1103970660, 1044125996, -1123672296); + sum2 = W(0, -1110279027, 1044898087, -1096945908, 1039092196) + + W(1, -1113241071, -1099008684, 1044106833, -1103116396) + + W(2, -1116888772, -1115916604, -1107202311, 1045884385) + + W(3, -1103988696, 1049112986, -1123386226, -1134049769) + + W(4, 1033554595, -1111117443, 1035778723, -1113256321) + + W(5, -1115920774, -1139004677, -1112080343, -1114347803) + + W(6, -1108669327, 1045218355, -1103416606, 1065794034) + + W(7, -1090569433, 1055599565, -1099737884, 1044073709) + + W(8, 1015808739, -1106102431, 1041666953, -1107247823) + + W(9, 1049716916, -1106016659, 1031391070, -1108799013) + + W(10, 1027314221, -1116221606, 1024714919, -1098987808) + + W(11, 1049758114, -1091770239, 1053158291, -1105054228); + WS(-1078536214, 1004530797); + sum1 = + W(0, 1027375859, 1017444741, -1120029560, 1000019140) + W(1, -1114543207, 1013557197, -1122136338, -1148145247) + + W(2, -1101920227, 1031432968, -1106564803, 1048371434) + W(3, -1118108517, 1042631950, 1018155212, 1016114854) + + W(4, 1025777344, -1103056081, -1107107772, -1082038651) + + W(5, -1087843395, -1090887738, -1103973545, -1102912795) + + W(6, 1044389645, 1048716617, 1051154454, 1066595410) + W(7, 1055824714, 1054676989, 1041035048, 1016296812) + + W(8, -1110651587, -1137653198, -1107166356, -1130046381) + + W(9, -1105265945, 1030116559, 1023828021, 1040191506) + + W(10, 1018050380, -1125959547, 1019570356, -1125449965) + + W(11, 1033235496, -1126792065, -1122035417, -1142050258); + sum2 = + W(0, 1027035378, -1132701065, -1114259972, 1024730711) + W(1, 986229224, 1013886009, -1129435432, -1141056234) + + W(2, 1026113022, 1034348094, 1019537869, -1139897757) + + W(3, -1140805741, -1118691470, 1009541569, -1129312440) + + W(4, -1111907604, 1044772326, -1115459713, -1083470341) + W(5, 1024256637, 1050967575, 1013091981, 1028089297) + + W(6, -1117578886, 987582920, -1091701771, -1064559027) + W(7, 1083026821, 1062853848, -1097816209, 1036032976) + + W(8, -1140538653, -1136739637, -1106970806, 1035917626) + + W(9, 1051507274, 1035548789, 1030786995, -1102804079) + W(10, 1018825264, 1015195718, 1029368182, -1129456736) + + W(11, 1025912688, -1107265712, 1031335734, -1115863996); + WS(1053759831, 1032374114); + sum1 = W(0, 972229904, -1109228149, 1034978575, 1041049216) + W(1, -1120680758, 1029299866, -1104501302, 1034604409) + + W(2, -1121671930, -1112583528, 1034149296, 1029443406) + + W(3, 1029497788, -1098177536, -1147362406, -1129221556) + + W(4, 1054724605, -1112974870, 1061211455, 1048871720) + W(5, 1059772533, 1052523382, -1143596105, 1050895314) + + W(6, -1092393035, -1101934908, -1092299422, -1093922438) + + W(7, -1094240300, -1091878482, -1112394307, -1097371836) + + W(8, 1018308729, 1027590122, 1034030567, -1111847647) + + W(9, 1041914031, -1113968603, 1028043992, -1126204095) + + W(10, -1129466650, 1029939172, -1113423424, 1038901743) + + W(11, -1106909549, 1040006220, -1140269215, 998375305); + sum2 = + W(0, -1150066816, -1122485893, -1114773240, 1024800634) + W(1, 996682648, -1123997738, 1019128023, -1127165963) + + W(2, -1150466984, 1032358015, 1050624105, 1086980496) + W(3, 1049846439, -1116390866, 1016213345, -1127449775) + + W(4, 1023864952, -1120268940, -1092046440, -1062089081) + + W(5, -1092228228, 1022750294, 1015347232, 1000268865) + W(6, -1110066210, 1042589181, 1028033997, -1086968029) + + W(7, 1024724796, 1041929871, -1114433107, -1139900476) + W(8, 1023825317, 1027888694, -1151325172, 1038366470) + + W(9, -1121152696, -1118357792, 1031614438, -1136800730) + + W(10, -1124858867, -1130877326, -1135440218, -1140173368) + + W(11, 1022098295, 1017805328, -1119866592, 1025894920); + WS(1063005484, 1009613411); + sum1 = W(0, 1023879031, -1116658758, 1016433014, 1020845368) + + W(1, 1014732617, -1133265115, -1123204757, 1010953149) + + W(2, -1099686359, -1121736524, -1101192360, -1114633573) + + W(3, -1095872969, -1106126199, -1114430117, -1135381594) + + W(4, 1052137768, 1047373394, 1060630207, 1066103327) + W(5, 1062822060, 1059882369, 1050777829, 1058652475) + + W(6, 1046007565, -1096622041, -1088767007, -1084203279) + + W(7, -1090088910, -1090037515, -1103091289, -1092699671) + + W(8, -1104853008, 1032552475, -1107092245, 1041296218) + + W(9, 1027255591, -1131360500, -1122457924, -1108476770) + + W(10, 1005501772, -1119708225, -1118541917, -1116191290) + + W(11, 1022596005, -1115075910, 1022253604, -1114779071); + sum2 = + W(0, 1018912922, -1115513506, 1035927400, -1104590179) + W(1, 1040736265, -1107721632, 1025188211, -1112944230) + + W(2, 1027578843, -1122957333, 1036987406, -1100032664) + + W(3, -1110179624, -1125426330, -1103038285, 1043904940) + + W(4, 1033809184, -1107632498, -1102289594, 1055409420) + + W(5, 1055289786, -1112721987, 1036015348, -1110109848) + W(6, -1094114890, 1001948858, 1056054406, 1048553428) + + W(7, 1051787669, -1094744691, 1032878358, -1118996080) + + W(8, -1100264522, 1024979575, -1110397259, -1121465059) + + W(9, -1147035242, 1045301422, -1131004626, -1124556646) + + W(10, -1107937173, 996744179, -1110541201, -1114033403) + + W(11, 1041331760, -1113161109, -1108457170, 1028913131); + WS(-1088267692, 1058858468); + sum1 = W(0, -1112379634, 1029162995, -1140270752, -1141342278) + + W(1, -1155361775, -1113272402, -1140210569, 1015213304) + + W(2, 1030761249, 1004146884, -1122297718, 1040340278) + W(3, 1036240851, -1129581456, 1042224566, 994119730) + + W(4, 1050799110, 1045209037, 1060358148, 1057423488) + W(5, 1058630580, 1044230767, -1104611845, -1109863885) + + W(6, -1099191401, -1095201623, -1091143388, -1083233902) + + W(7, -1098879351, -1096101987, -1122560784, -1109785875) + + W(8, 1033839199, 981108966, 1043211072, 1032118859) + W(9, 1032700466, 1030417559, -1140846885, 1009738084) + + W(10, -1111715307, 1002675052, -1120236170, -1118812007) + + W(11, 1017441470, -1148456452, -1124250818, -1131671893); + sum2 = W(0, -1113443438, 1023812788, -1131593767, -1112801638) + + W(1, -1105757720, -1107427633, -1107137147, 1049954034) + + W(2, 1021821461, 1044300514, -1104994806, 1060658961) + + W(3, 1044687616, -1087213560, -1093064102, -1093773442) + + W(4, -1122246023, -1104002403, 1038382254, -1099826888) + + W(5, 1066144433, 1057721748, -1097329958, 1039897892) + + W(6, -1146734500, 1024116650, 1049088332, -1089766136) + + W(7, 1042354562, -1129092349, 1044181933, -1105235988) + + W(8, -1128559783, -1115812447, -1105739887, 1025686404) + + W(9, -1117250635, 1035306954, -1106719387, 1040800736) + + W(10, -1125128801, -1134793082, -1131329759, 1034755166) + + W(11, -1114066084, 1031417186, -1117543346, -1128306605); + WS(1042978478, 1051058289); + sum1 = W(0, -1105382966, 1035278676, -1102112151, -1102711504) + + W(1, -1113404858, -1111458068, 1038103836, -1101215220) + + W(2, 1032357083, 1023966158, -1113794846, 1052488610) + W(3, 1046698475, 1025992701, 1042579843, 1026938905) + + W(4, -1099095273, -1110890773, -1087097191, -1081382120) + + W(5, -1086454106, -1097860134, -1105233954, -1091436978) + + W(6, 1056839899, 1050844654, 1060126757, 1063120271) + W(7, 1060142827, 1054395618, 1048420817, 1056719627) + + W(8, -1122236410, 1019140850, -1107056589, -1150461374) + + W(9, -1103751812, -1120625160, 1025690583, -1112415123) + + W(10, 1024938700, -1122653091, -1122892351, -1119829084) + + W(11, 1007453138, -1106500335, 1032216339, 1010325087); + sum2 = W(0, 986675002, -1112567440, 1033516168, -1097585273) + W(1, 1031672616, 1029453516, -1106591291, 981423732) + + W(2, -1098687074, 1041166801, -1099338776, 1019263552) + + W(3, -1108963639, -1104454378, -1109440188, 1024870634) + + W(4, 995475005, -1097111455, 1062728692, 1066654492) + W(5, 1034345380, -1124466258, -1092068145, 1048117247) + + W(6, -1115454695, -1132868679, -1120015952, 1054175336) + + W(7, 1038275134, -1096244103, 1039104546, -1119846616) + + W(8, -1110655697, -1114152579, 1023628514, -1097107880) + + W(9, -1118909665, 1049130538, -1093717692, 1042494451) + + W(10, 1018060844, -1101427932, 1045275251, -1098419362) + + W(11, 1049612882, -1100742770, 1000911598, -1140045927); + WS(-1097071959, 1072623846); + sum1 = W(0, 1026094363, -1114366565, 1026372640, -1127140609) + + W(1, 1020533357, -1164090721, -1143600974, 993477434) + W(2, 1010541764, 1023927408, 1034504814, 1038480008) + + W(3, 1046400295, 1040252248, 1040642843, 1032065949) + + W(4, -1087379998, -1100421531, -1091057687, -1086095524) + + W(5, -1083615449, -1089701071, -1093225865, -1090227881) + + W(6, 1028105114, 1051865478, 1057630379, 1064048287) + W(7, 1061319210, 1056141130, 1049626241, 1047950199) + + W(8, 1046169702, -1105971271, 1041980470, -1104375598) + + W(9, -1113258549, -1149976804, -1120849689, 1048635489) + + W(10, -1135291959, -1125008010, 1012391943, 1011497593) + + W(11, -1126436590, 1008261592, -1126913777, 1026040178); + sum2 = + W(0, 1012042818, 1021360395, -1107209227, 1027378250) + W(1, -1105921842, 1041772128, -1127367716, -1127019644) + + W(2, 1045767812, -1098807230, 1044720012, 1042281858) + W(3, 1016599978, -1127223374, -1115783877, 1027816090) + + W(4, -1063490706, -1081789373, 1074390906, 1079115935) + + W(5, 1058048856, -1108782236, -1128008216, 1032186898) + + W(6, -1101778611, -1114664520, 1049922132, -1094869567) + + W(7, -1118592797, -1121088549, -1137516645, -1111496361) + + W(8, -1112785819, 1033999610, -1110057121, 1045861970) + + W(9, 1034050759, -1129798306, 1033434514, -1136389257) + + W(10, 1012780879, 1021391529, -1130294258, 1031106226) + + W(11, -1122317121, 1025125464, -1149825053, 1031888403); + WS(-1103312814, -1092017335); + sum1 = + W(0, -1127703091, 1018146514, -1121799134, 1017072510) + W(1, -1131539818, -1112727125, 1017229265, -1109754009) + + W(2, -1101144796, -1115460311, -1106383343, -1133230391) + + W(3, 1034901054, 1027622014, 1018005017, 1034197373) + W(4, 1054306333, 1039997174, 1024945271, -1088288960) + + W(5, -1088630417, -1096972398, -1101045202, -1098488314) + + W(6, -1126801713, 1026063214, -1131110905, 1059941407) + W(7, 1061737047, 1057455253, 1048616129, 1051714580) + + W(8, 1023075088, 1027296474, -1132250026, -1113425894) + + W(9, -1097522374, -1097018828, -1112216732, -1142469689) + + W(10, 989243788, -1122138660, 1032388672, 982272924) + W(11, 1021266411, -1135487483, -1117699788, 995701513); + sum2 = W(0, 1015133861, 1037113072, -1114822552, 1028491873) + + W(1, -1105557810, 1038591890, -1105949948, 1032708826) + + W(2, -1105189044, -1115931822, -1098364789, -1113527921) + + W(3, 1024139573, -1112247318, 1007564387, -1120342494) + + W(4, -1093732269, -1102686481, 1041653115, 1065997875) + + W(5, -1130473293, -1098512761, -1125828389, -1125733097) + + W(6, -1094162786, -1113599737, 1041635421, 1064813540) + + W(7, 1037786550, 1036196676, -1114108758, -1132225813) + + W(8, -1109540616, 1040400825, -1118060506, -1123044799) + + W(9, -1105450383, -1106060901, -1118151575, 1010062515) + + W(10, 1030009493, -1114813207, 1027616765, -1116517245) + + W(11, 1021543889, 1005718790, -1122858549, 1029912177); + WS(1054094679, 1053313313); + sum1 = W(0, -1133457438, -1120986711, 1034987238, 1028444909) + + W(1, 1035642130, 1018062863, 1034710931, -1149170946) + + W(2, -1123263126, -1130558777, -1097984725, -1096198619) + + W(3, 1007426149, 1002886242, -1123562906, 1018181775) + W(4, 1046955525, 1034791245, 1059693200, 1056744813) + + W(5, -1111414009, 1030506913, -1113706235, 1033357311) + + W(6, -1124016519, 1044418743, -1102062065, -1098120268) + + W(7, -1111514230, -1104691680, 1011520719, -1107703301) + + W(8, 1039131745, -1102726978, -1136653836, -1097784815) + + W(9, -1121981368, 1038384226, -1114621003, 1012043028) + + W(10, -1120644986, 1007447622, -1119688622, -1150742701) + + W(11, 1028941155, -1124505481, 1028268649, 1016894461); + sum2 = + W(0, 988916677, -1137939637, -1123566910, 1028209713) + W(1, -1123858844, 1036944358, -1119538750, -1142606817) + + W(2, 1035831303, -1140903881, -1103092742, -1131746560) + + W(3, -1101579019, 1038814302, -1130948272, 1038676356) + + W(4, -1110571087, 1038296707, -1107155945, -1117714466) + + W(5, 1038803820, -1103151768, 1032643961, -1111989951) + W(6, 1034464782, -1090860425, 1056968489, 1064742714) + + W(7, 1040557782, -1120375726, -1111036663, -1122089622) + + W(8, -1106828560, 1044389789, -1079651989, 1050942503) + W(9, 1043224862, -1130430804, 1041889175, 1014857001) + + W(10, -1178538002, 1041756630, 1029915845, -1106236653) + + W(11, -1110415601, 1019097405, -1132733633, -1140337549); + WS(1060301740, -1107262085); + sum1 = W(0, 980901136, 1027361860, -1140723427, 1026764890) + W(1, 1040866884, 1025665684, 1033047081, -1120424813) + + W(2, 1034782831, 1047173818, 1039236098, -1167399456) + + W(3, -1096504911, -1107799148, -1104388354, 1042507977) + + W(4, -1105836176, -1090641081, -1089836727, 1057068694) + + W(5, 1061579759, 1058017849, 1050545524, 1043225643) + W(6, 1036556474, 1050207945, 1053103024, 1041462691) + + W(7, -1084387656, -1086651203, -1099258584, -1106352190) + + W(8, -1123655719, -1104237805, -1097134658, -1168491986) + + W(9, 1041789973, 1041962562, 1042093191, -1107448273) + + W(10, -1123449511, 1032390687, 1023266998, -1128069487) + + W(11, -1111341496, -1121577073, -1128080260, -1118302731); + sum2 = W(0, -1120672932, 1020434122, 1029602171, 986372169) + W(1, 1039121856, -1113202257, -1139183469, 1010867474) + + W(2, 1046006360, -1097339905, -1114812458, -1107596062) + + W(3, 1036462865, 1042494496, -1097212089, -1111658779) + + W(4, -1112452525, 1059308780, 1040180724, -1073685765) + + W(5, 1068230783, 1060720662, -1116372590, -1096232759) + + W(6, -1103760793, 1054394959, 1058139034, -1075031098) + + W(7, 1055263295, 1065727212, -1106882983, -1102585430) + + W(8, -1135937657, 1038148088, -1103543044, -1098429000) + + W(9, 1051067274, -1106499347, -1127997619, 998537328) + + W(10, 1037670355, -1114765629, -1120562291, -1131755817) + + W(11, 1034635900, 1010504894, -1127537321, -1141626877); + WS(-1096709719, -1109932402); + sum1 = + W(0, 1015250582, -1109965037, 1037158888, -1115453048) + W(1, 1032345875, -1113173429, 1033146133, -1109546082) + + W(2, -1143431239, 1015070528, -1094706154, 1051852512) + + W(3, -1107272167, 1039101648, -1112986991, 1034073405) + W(4, 1041217222, 1044707911, 1032459556, -1103734188) + + W(5, -1116721265, -1100636937, 980311674, 1017051268) + W(6, 1009444904, -1099789672, 1049449359, -1091866852) + + W(7, 1042112892, 1051337808, 1011811037, 1035868647) + W(8, -1127867147, 1028928427, 1015515213, 1049692098) + + W(9, -1094357813, 1036490203, -1118660177, 1019523665) + + W(10, -1115442975, 1033219242, -1119289842, -1140261177) + + W(11, 1041543818, -1107580668, 1027230184, -1121586498); + sum2 = + W(0, -1129366500, 1029756683, -1113040482, 1041050942) + W(1, 1019865458, -1130192114, 1021094310, 1011878989) + + W(2, -1111869912, 1029022998, 1046043365, 1028636589) + + W(3, -1100561355, -1118786886, -1136660469, -1113939693) + + W(4, -1114572049, 1041454921, 1063827282, -1088878874) + + W(5, -1120053198, 1037601458, -1121128994, 1024511741) + W(6, 1047691494, 1051011830, -1075590857, 1052419847) + + W(7, 1053136256, -1142379802, -1115896886, 1033422229) + + W(8, 1024096486, -1094989992, -1094007689, 1049374228) + W(9, 1051405216, -1105102628, 1030093181, 1038213156) + + W(10, -1112777200, 1033382685, 1046068934, 1022134325) + + W(11, -1104418826, 1039472389, -1173694926, -1122209396); + WS(1065853238, 1014077745); + sum1 = W(0, -1141216588, 1026623353, -1128763228, 1020370461) + + W(1, 1026101893, -1118113002, 1032019108, -1113706417) + + W(2, -1117433015, -1129058045, 1039902504, 1043759351) + W(3, 1050608829, 1042454284, 1027449020, 965645460) + + W(4, -1094201799, -1096460535, -1083943142, -1077503527) + + W(5, -1089716396, -1098731144, -1095714819, -1094767340) + + W(6, 1050233869, 1049952264, 1051933059, 1055071872) + W(7, 1055823041, 1057515106, 1050055875, 1054942629) + + W(8, 1044254087, 1008011942, 1048823509, 1025148605) + W(9, 1040921250, -1120507502, -1149099066, 1040832262) + + W(10, -1138617969, 1022594791, -1141149825, 1032777398) + + W(11, -1117303781, 1030831063, -1131034510, 1023411184); + sum2 = W(0, 1024492456, -1126703609, 1029353704, 1036516578) + + W(1, 1032071462, -1107363712, 1044306067, -1105180142) + + W(2, -1107369605, 1040389587, -1109233879, -1095300447) + + W(3, -1104963978, -1106122650, -1143085570, 1043865859) + + W(4, -1114418679, 1038677226, 1043636997, 1063429366) + + W(5, -1101740776, -1097459892, 1035238854, -1116890590) + + W(6, -1102696165, -1115181151, -1104069114, 1063594124) + + W(7, -1098164193, 1040620147, -1106357294, -1127904241) + + W(8, -1133142225, -1114014523, -1122395696, -1091978649) + + W(9, 1053626887, -1097146692, 1040976159, -1120794976) + + W(10, -1122518916, 1026327736, 1035228514, 1023044321) + + W(11, -1116601496, -1130578705, 1026795860, -1127926993); + WS(-1088917996, 1063906509); + sum1 = W(0, -1110920777, 1042151912, -1101936374, 1005195703) + + W(1, 1032265367, -1103459368, 1041691572, -1129700693) + + W(2, 1044506738, -1103723194, 1033303784, 1049511025) + + W(3, -1113286290, 1043019742, -1128222025, -1114181825) + + W(4, 1047786311, 1032125650, 1061302810, 1034065915) + W(5, 1048810800, 1054491533, -1112859072, 1049358361) + + W(6, -1095080042, -1113114611, -1088574755, -1080208865) + + W(7, 1049193686, -1121283466, 1024774526, -1147499681) + + W(8, -1134941681, 1025189266, -1115794445, 1048946939) + + W(9, -1126346531, -1103486336, 1015955599, -1097425800) + + W(10, 1033765698, -1104090263, 1041151454, -1113407178) + + W(11, -1109067703, 1044875416, -1121559327, 1029016425); + sum2 = W(0, -1103461552, 1050674327, -1104590141, 1015549042) + + W(1, 1036919049, -1098769683, 1046313441, -1112862464) + + W(2, -1127991186, -1116051994, -1131508502, 1050173609) + + W(3, -1105608002, 1039941075, -1101603735, 1031505597) + + W(4, -1120190757, -1113530372, 1055990720, 1072931527) + + W(5, -1095048932, -1078020039, -1101033642, 1010804308) + + W(6, -1108916090, -1124692174, -1121470095, 1046026095) + + W(7, 1050729023, -1084802111, 1047911325, 1034713295) + W(8, 1012492564, 1042343963, 1032226081, 1048814953) + + W(9, -1098673970, -1101605152, -1113534935, 1017021378) + + W(10, 1029245469, -1115385529, 1026603353, 1024686773) + + W(11, -1108452621, 1046452703, -1112756717, -1119772659); + WS(-1128039792, 1065254279); + sum1 = W(0, 949814928, 1027171091, -1129242384, 1031101353) + + W(1, -1120975327, 1003634843, -1144006416, -1123053628) + + W(2, -1114341117, 1031806764, 1033646238, 1018879791) + W(3, 1042055949, 1033681236, 1023909046, 1027677731) + + W(4, -1094482850, -1095186291, -1085842430, -1092086861) + + W(5, -1084252337, -1089087466, -1099056317, -1095496311) + + W(6, 1052398616, 1051880795, 1058904806, 1068407459) + W(7, 1055432619, 1036562814, 1039311896, 1050962337) + + W(8, 1027872723, -1139824782, 1010706555, -1098849364) + + W(9, -1121195299, 1023772639, -1126801378, 1038931216) + + W(10, -1155305313, 1022544667, -1121892394, 1040052675) + + W(11, -1127339326, 993927654, -1123991661, 1005742098); + sum2 = + W(0, -1120833032, 1034915193, -1115307960, 967112657) + W(1, 1023925021, -1107476032, 1033449936, -1132191993) + + W(2, -1124763415, -1113475142, 1025322201, 1059271888) + + W(3, -1102912552, -1118552210, -1103660545, 1033898849) + + W(4, -1118777010, 1010824003, 1064953874, 1082807588) + + W(5, -1080316189, -1064631277, -1110193476, 1039205719) + + W(6, 1030229073, -1105412742, 1042572184, -1098383492) + + W(7, 1054443836, -1098098835, -1121091158, 1028111985) + W(8, 1028911958, -1133618203, 1022077590, 1048790378) + + W(9, -1103923621, 1029953956, -1106218101, 1036034024) + + W(10, -1123843510, 1030755234, -1135426163, -1113939962) + + W(11, 1038571089, -1109596012, 1035405992, -1126376787); + WS(-1100484014, -1082813103); + sum1 = W(0, -1123138350, -1124738939, 991988525, -1115403050) + + W(1, 1032429349, -1113715255, 1024280877, 1024090791) + W(2, 1037916588, -1123209507, 1049386547, 1038702225) + + W(3, 1052139678, -1114440425, 1033284897, -1105213156) + + W(4, -1092840871, -1095165544, -1086369653, -1082690349) + + W(5, -1080932794, -1104541586, -1091044852, -1098590565) + + W(6, 1048819422, 1053647432, 1054472273, 1063735148) + W(7, 1057734851, 1057909982, 1048946363, 1057027323) + + W(8, 1042234192, -1117914254, 1039202605, -1121098737) + + W(9, -1124146173, -1120991811, -1116174764, -1140316975) + + W(10, -1212876940, 1018206961, -1120915541, 1024686130) + + W(11, 1015928020, -1138122766, 1018911880, 1023234987); + sum2 = + W(0, 1017320792, -1115193567, 1033153774, -1109723345) + W(1, 1038092476, -1111785287, -1119671739, -1109901657) + + W(2, -1151813795, -1117132961, 1023133248, -1096979800) + + W(3, 1051436512, -1136600857, 1043953938, 1038440342) + + W(4, -1114719136, -1104426322, -1094043595, -1067432541) + + W(5, -1094705611, 1084038773, 1051561136, -1097692319) + + W(6, -1127138406, 1035777956, 1044557822, -1081748159) + W(7, -1094662263, 1059186895, 1023890070, 1021470996) + + W(8, 1024237362, -1122656452, 1043828952, -1105451925) + + W(9, -1118217110, -1118750811, 1026839182, -1114305884) + + W(10, 1038691322, -1114810881, -1134215421, 1025666138) + + W(11, 1023161212, -1141123106, 1009024009, -1122422926); + WS(-1090600151, 1059961608); + sum1 = W(0, 1026132748, -1119499740, 1009974340, -1113885561) + + W(1, 1031101992, -1111559238, 1038517558, -1109274083) + W(2, 1003856660, 1023957057, 1043713207, 977342510) + + W(3, 1051525550, 1025363409, 1031878320, -1114083846) + + W(4, -1086859502, -1105095800, -1089372619, -1080432315) + + W(5, -1084623068, -1086083942, -1090836983, -1097114792) + + W(6, 1051724689, 1035359281, 1059175635, 1059908410) + W(7, 1060487798, 1059822844, 1051599439, 1057278953) + + W(8, 1051693682, 1030063117, 1040699442, -1106762114) + + W(9, -1114853678, -1116041416, -1130086580, 1040974422) + + W(10, 1032934656, -1123043606, 1034542394, 1018557983) + + W(11, 1019132432, 1031213982, -1150140386, -1138998830); + sum2 = W(0, 992923986, -1162949315, 1026898877, -1114052913) + + W(1, -1129262506, 1033577774, -1129225578, 1036380420) + + W(2, -1099561897, -1123994385, -1116860796, 1033030662) + + W(3, 1024241717, 1027801571, 1041458479, 1050404867) + W(4, -1105536701, -1114799541, 1049791100, 1035377948) + + W(5, -1088177074, 1049717575, 1043978030, -1091169113) + W(6, 1079165891, 1071631223, 1068780303, 1075632919) + + W(7, -1093777203, -1083766160, 1029517847, -1083354335) + + W(8, -1067147152, -1073660425, -1081838471, -1083671230) + + W(9, 1057542893, 1057183721, -1103299573, 1061807320) + + W(10, -1122782084, -1122543983, -1095462698, -1097530520) + + W(11, -1107750254, 1032284006, 1025982179, 1016984746); + WS(-1077101366, 1062204989); + sum1 = W(0, 1030791972, 1033145401, 1041963978, 974201395) + W(1, -1122207423, 987140211, 1038549201, -1110991006) + + W(2, 1034919675, -1109323772, -1109601924, -1098302775) + + W(3, 1049858413, -1163737350, -1104961646, 1022472166) + + W(4, -1119759728, 1033209467, 1053457281, 1054965265) + + W(5, -1085314770, -1111164798, -1103072597, -1115893275) + + W(6, -1099266697, 1032826652, -1084468746, -1116769210) + + W(7, 1055247733, 1051122507, 1043488164, 1036206931) + W(8, 1044609922, -1108657922, 1049423472, 1034832195) + + W(9, -1104833109, -1113738245, -1121147841, -1131086146) + + W(10, -1131275309, -1142019948, 1005679697, -1125973710) + + W(11, 1038354000, 1030630601, -1132893044, 1033991117); + sum2 = + W(0, -1128313262, -1111995834, -1111474816, -1108547758) + + W(1, -1123519406, -1107039325, -1122872424, 1034342977) + W(2, 1013333880, 1035550861, 1047569009, 1036006103) + + W(3, -1104835579, -1119199538, -1113807123, -1111926114) + + W(4, 1041733323, 1024909109, 1049082846, -1093864056) + W(5, 1049905793, 1005924363, -1107099901, -1117079308) + + W(6, 1023499747, -1107108555, 1042800306, -1137016284) + W(7, 1032249988, -1146750815, 1024429363, 1029021112) + + W(8, -1111312052, 1015145454, 1017141780, 1013541080) + W(9, 1034012446, -1119513572, 1036805530, 1021769214) + + W(10, 1026149469, -1188980193, -1123639612, -1132476264) + + W(11, 987971164, -1118671040, -1119021692, 1010774610); + WS(1062330988, -1108933484); + sum1 = W(0, -1130422235, 1014897395, 1027643186, -1143835797) + + W(1, 1008148004, -1128962907, 1015454424, -1140840472) + + W(2, -1127744279, 1022571909, -1103670303, -1110385841) + + W(3, 1042533684, -1104774725, -1116892960, -1113171223) + + W(4, -1103583502, -1095189640, -1097916197, -1083565633) + + W(5, -1085814590, -1117452294, -1099231943, -1103031657) + + W(6, -1112967222, 1057599524, 1050533350, 1066390108) + W(7, 1059916677, 1050496965, 1049304867, 1049771574) + + W(8, 1030687296, 1033146447, 1045948242, -1104991248) + + W(9, -1098839314, -1114792086, -1127702342, 1032045679) + + W(10, 1027221408, -1115561596, 1024802772, 1027456689) + + W(11, -1125614226, 1027191883, -1115468561, 1026854932); + sum2 = + W(0, 1032895988, -1117467777, 1028545567, -1111764526) + W(1, 1041090350, -1115412116, -1125773241, 1023304410) + + W(2, 1032830726, -1111744013, 1005059811, 984631841) + W(3, 1049595248, -1107906030, -1128022386, 1041765137) + + W(4, -1115406541, 1060942494, 1047355779, -1080183554) + W(5, -1134532596, 1035977506, 1020817981, 998580490) + + W(6, -1088204952, 1054289941, 1071613570, -1077634808) + W(7, -1093147012, 1042083474, 1037668146, 1032116542) + + W(8, -1092446016, -1123665301, 1060958044, 1046926373) + + W(9, -1113920155, -1097187857, -1142970826, -1125184917) + + W(10, 1031989945, -1104702594, 1046230999, -1100189171) + + W(11, 1034621337, -1132922134, -1117116166, 1022449461); + WS(-1109331804, 1042368707); + sum1 = + W(0, -1127022377, 1024616740, -1123466393, -1123208698) + W(1, -1123129456, 1019270569, 981412042, -1140654132) + + W(2, 1017844485, -1131144083, -1107976561, -1113085828) + + W(3, -1114039899, -1111910285, -1118232839, 1022571624) + W(4, 1059385318, 1050963589, 1060165431, 1059271336) + + W(5, 1060839292, 1056907678, 1049849056, 1053487153) + + W(6, -1100795701, -1097056965, -1085607547, -1083778221) + + W(7, -1087428756, -1094957746, -1097540376, -1103251894) + + W(8, -1111987554, 1029893237, 1029216560, 1039937652) + W(9, 1032072458, -1114977786, 1024925794, -1099334072) + + W(10, 1016900750, 1023074109, -1112887422, 998408382) + + W(11, -1132276000, 1030127674, 1027413302, 1016237783); + sum2 = W(0, 1032849952, -1124884727, -1113876395, -1129227720) + + W(1, -1120368220, 1017198470, -1139825528, -1146042855) + + W(2, 1026055449, -1115329827, 1027815845, 1037903820) + W(3, 1033732250, -1135699996, 999495607, -1129930944) + + W(4, -1062565523, -1069645041, 1071954840, 1082661778) + W(5, 1074466947, 1029601901, 1010255452, 1032971494) + + W(6, -1095655110, 1045607629, 1038549538, -1099195860) + + W(7, 1038448988, -1098438651, -1108984513, 1036170224) + + W(8, -1117249787, -1117682124, 1041120073, 1049745271) + + W(9, -1117133911, 1028175479, 1021673198, -1119888169) + + W(10, 1033345650, -1126204236, -1111681252, 1027383795) + + W(11, 1003632367, -1122462785, 1028818665, 1008778484); + WS(-1115348316, 1054745777); + sum1 = W(0, -1137232980, 1010567825, 1027515738, -1129778165) + + W(1, 1031078129, -1163675813, 1021335208, 1015357019) + + W(2, 1036166838, 1015838740, -1156212270, -1111605669) + + W(3, -1105267814, -1129353779, -1109102196, 1044530957) + + W(4, 1049991788, 1049110157, 1058008076, 1064241460) + W(5, 1060214194, 1054590870, 1041116785, 1051902330) + + W(6, -1091675395, -1096298109, -1087264777, -1084812083) + + W(7, -1090012802, -1089909917, -1099321920, -1087098097) + + W(8, 1017816583, 1034100235, 1034455816, 1015442096) + W(9, 1038960299, 1024747424, -1128935590, 1001621141) + + W(10, 1029575560, 1027659359, 1022248439, 1022178737) + + W(11, 1027280241, 1032358751, -1140454872, 1023518060); + sum2 = + W(0, -1165172934, 1024206556, -1116697030, 1027518769) + W(1, -1114129087, 1038375004, -1112102389, 1033334280) + + W(2, 1029679520, 1020162972, 1034059275, 1040171419) + W(3, 1027996817, -1110434123, 1034335827, -1129105068) + + W(4, -1126280148, -1122180110, 997668227, -1097026624) + + W(5, 1034726751, 1040744343, -1102815825, -1107441727) + W(6, -1133513625, 1032751166, 1058808820, 1078058683) + + W(7, 1074823993, -1082346775, -1066028315, -1081349721) + + W(8, 1007295249, -1123729058, -1106696521, 1051253388) + + W(9, -1129919188, -1130957332, -1106067749, 1046963831) + + W(10, -1112190701, 1031911051, -1130859572, -1110596693) + + W(11, 1030310076, 1020514684, -1120038362, -1140190249); + WS(-1106429870, -1094013011); + sum1 = W(0, -1180060253, 1010730896, 1021824818, -1126648308) + + W(1, -1129917792, -1130361130, -1120274467, -1140710069) + + W(2, 1032914805, -1122572746, 1007289698, 1032028260) + W(3, 1028442598, 1044381070, 997655159, 1048974915) + + W(4, 1051659804, 1041447962, 1049003466, 1055000463) + + W(5, 1028832887, -1108621431, -1127588999, -1092428073) + + W(6, -1083977393, -1096070845, -1090427610, -1110426966) + + W(7, -1154202266, 1047276227, -1106909952, 1037115308) + W(8, 1044666432, 1042077981, 1040702780, 1039434940) + + W(9, -1143541158, -1126798128, 1034262401, -1116914978) + + W(10, -1143253052, -1112889935, 1019043703, -1121648024) + + W(11, -1121855216, 1025638626, -1112957869, 1027653084); + sum2 = W(0, -1113021585, 1027309129, 1040557912, -1105312463) + + W(1, 1045635393, -1102513438, 1027399099, -1114789238) + + W(2, 1044056205, 1042644451, -1130917417, -1097839840) + + W(3, -1093830389, -1101732547, -1116545436, 1035602021) + + W(4, -1096040530, -1098848264, -1086782093, 1066533545) + + W(5, 1047866369, 1049511378, 1054444603, 1045074348) + W(6, -1099894114, -1100852865, 1055980834, 1060955207) + + W(7, 1049480207, -1136131482, -1099150452, -1089010378) + + W(8, -1101136816, 1051352325, -1094431966, -1105883820) + + W(9, -1100511063, -1095199310, 1057783348, -1105061215) + + W(10, -1129192316, -1127314210, 1001033976, 1028457481) + + W(11, -1109915970, 1041484506, -1111537389, 1038428609); + WS(1043891118, 1068855714); + sum1 = W(0, 1034864935, -1115119790, 1021640868, -1116826163) + + W(1, -1131811026, 1023733166, -1143217636, -1132040205) + + W(2, -1116934668, -1132968331, 1038582262, 1007221512) + + W(3, 1042862352, 1036137865, -1140157826, -1132089051) + + W(4, -1092449819, -1094480060, -1087769325, -1085866861) + + W(5, -1087019235, -1090795981, -1096174840, -1088777568) + + W(6, 1054927906, 1036212657, 1059302628, 1065404307) + W(7, 1060871017, 1058788692, 1054585007, 1058320673) + + W(8, 1034556804, -1105343195, 1039390277, -1118670257) + + W(9, -1097654326, -1110180471, -1103987387, 1039274926) + + W(10, -1137767170, -1110944332, 1007166673, 1000130184) + + W(11, -1149095244, 1038210141, -1123846591, 1033742658); + sum2 = W(0, -1109312558, 1016877071, -1119267190, 1012463989) + + W(1, -1126846961, -1130793473, 1028514185, 987754923) + W(2, 1043524956, 1022447527, 1041115214, -1113751024) + + W(3, 1044302697, 1017381631, -1118188819, 1030898373) + + W(4, -1128190925, -1112207078, -1098728904, -1096567460) + + W(5, -1103900959, 1042180588, -1098746809, 1045698067) + + W(6, -1098627702, -1106898612, -1125515089, 1069702771) + + W(7, 1067943590, 1068665203, 1066385707, 1053793920) + W(8, 1046310591, 1038513036, 1034661588, -1085518745) + + W(9, -1080776989, -1076263106, -1082060374, -1093259035) + + W(10, -1109532722, 1007593597, -1120394532, -1104054586) + + W(11, -1120974914, 1042247803, 1009589981, -1114854661); + WS(-1087649964, 1019782291); + sum1 = + W(0, -1120416323, -1143853715, 997344379, -1117444008) + W(1, 1021907901, -1121005123, 1024251314, -1131127160) + + W(2, 1030168161, -1112895868, 1041161399, -1109107148) + W(3, 1047711365, -1121138472, 1000308143, 1016698342) + + W(4, 1040415828, 1040272853, -1108639376, 1066099001) + W(5, 1016783474, 1034911086, 1025062450, 1039033917) + + W(6, -1105270513, 1031966316, -1088122706, -1107599501) + + W(7, -1089416651, -1111272734, -1107120316, -1102333873) + + W(8, 1024428446, -1115504066, 1050439898, -1101667648) + W(9, 1046888529, 1033038819, -1142414472, 1024070769) + + W(10, -1138699736, -1138905653, 986611002, -1107645603) + + W(11, 998160367, -1138080961, 1016114481, -1128756052); + sum2 = + W(0, -1107127477, 1033768126, 1023416069, -1125558334) + W(1, 1043030557, -1118774605, -1151915405, 1000627574) + + W(2, 1040784536, -1100939724, -1105075327, 1031863699) + + W(3, -1103416126, -1104742149, 1042707477, -1121719211) + + W(4, -1117663793, 1017594321, -1107862291, -1098589794) + + W(5, 1051532765, 1047503953, -1106456825, 1014542959) + W(6, -1112675945, 1057262150, -1072566694, 1078638992) + + W(7, -1086195181, -1109470897, 1041105499, -1106760943) + + W(8, 1039537683, -1092150404, 1066290117, -1077578123) + W(9, 1053259006, 1050584179, -1103867215, 1033290657) + + W(10, 1025325994, 1019337948, -1099590626, 1051733383) + + W(11, -1119314417, -1100419866, 1038050610, 1002291590); + WS(1061891500, 1029739432); + sum1 = W(0, -1120639769, -1135804195, -1111424495, 1029738303) + + W(1, -1117498485, -1118615961, -1125527056, -1118385394) + + W(2, -1106216192, 1006283635, -1105829118, -1090566706) + + W(3, -1116262763, 1034396863, 1019261400, -1120846617) + + W(4, -1113834067, -1103570763, -1096510251, 1051808376) + + W(5, -1092264601, -1100309453, -1103214946, -1103884676) + + W(6, 1044238166, 991333090, 1059958553, 1070740438) + W(7, 1055146526, 1034609097, 1035571491, 1043753671) + + W(8, -1114217922, -1139025510, -1105864021, -1094764771) + + W(9, -1102695282, -1115698885, -1137185181, -1118241703) + + W(10, -1131739160, -1118882723, -1144807936, 1034612526) + + W(11, -1134494805, 1017541191, -1114134173, 1003240643); + sum2 = + W(0, -1121600381, 1006302792, -1119262688, 1002488024) + W(1, 1029037035, 1026568605, -1136033516, 1023468893) + + W(2, 1026550907, -1138054916, 1026195583, -1109251816) + W(3, 989985520, -1119850715, 1023268674, -1113487368) + + W(4, 1038640235, -1115693397, 1049140618, -1070322023) + W(5, 1050244555, -1111337441, 1034795019, 1032357843) + + W(6, -1118247849, 1032667651, -1131891756, 1075955836) + + W(7, -1093462820, 1039467523, -1123631905, -1111383976) + + W(8, -1129506938, -1150824496, 1032667233, 1037796079) + + W(9, 1041966968, -1119306593, 1011205316, -1140765060) + + W(10, -1121040584, 1022873234, -1116879102, -1123674716) + + W(11, 1023067742, -1115823182, 1030765775, -1117038411); + WS(-1084563692, -1094583093); + sum1 = W(0, 1022703229, -1162852794, -1132568844, 1021772616) + W(1, 1024085850, 996545514, 1026223997, -1146052282) + + W(2, 1012279186, -1124105959, 1040618577, -1104495965) + + W(3, -1108936808, -1134036365, -1117471057, -1121618798) + + W(4, 1016172182, 1043937588, -1096721723, 975997096) + W(5, -1105257082, -1119752408, 1035927703, 1030206390) + + W(6, -1118740542, 1029178707, 1047241030, 1058138797) + + W(7, -1098942649, 1033384955, -1119041259, -1135741956) + + W(8, 1030161881, -1113029519, -1110742685, -1095587800) + + W(9, 1044167852, 1030217107, 1033396614, -1114495566) + + W(10, -1118949361, 1029291849, 1002005802, 1026228226) + + W(11, -1121437018, -1128298663, -1127843472, 1024441958); + sum2 = + W(0, 1025430445, 1022296570, 1036981025, -1113204042) + W(1, 1015494893, -1113488118, -1127432409, -1122316989) + + W(2, -1154040649, 1041313314, -1095051054, 1045521896) + W(3, -1140159290, 1036274902, 1033705522, 1014652738) + + W(4, -1116838887, -1089338077, -1080092115, 1068042633) + + W(5, -1123762249, 1036460009, -1115504399, 1034428960) + + W(6, 1050769250, -1110563158, 1047738904, -1105725339) + + W(7, 1046459196, -1099991734, 1035671600, -1109634740) + + W(8, -1101164186, 1049390351, -1105225557, 1058198082) + + W(9, -1097909404, 1042800199, -1112380024, 1019626217) + + W(10, 1025324860, -1110459458, -1123670947, -1102419914) + + W(11, 1036400862, -1121611661, 1029427990, -1122111247); + WS(1070570422, -1118483066); + sum1 = + W(0, 1018165832, -1132852684, -1139725729, -1109730565) + W(1, 1028156415, -1118139972, 1024357779, -1122455036) + + W(2, -1110069429, 1031499417, 1040072889, 1042906054) + W(3, 1042919301, -1168228894, 1039947243, -1103975241) + + W(4, -1099959964, -1099020957, -1084885570, -1081528768) + + W(5, -1083523477, -1091258848, -1095225642, -1094692227) + + W(6, 1060331110, 1050128623, 1059366093, 1062372980) + W(7, 1058454089, 1058887102, 1048717802, 1057283318) + + W(8, -1162935118, 1032275410, 1019497086, 996066926) + W(9, -1118811556, -1112630512, -1117991970, 998336395) + + W(10, -1139421786, 1009522871, -1140197674, -1117746023) + + W(11, -1128372287, 1014662756, -1119179525, 1028666043); + sum2 = + W(0, 1041833519, -1108615966, -1125372171, -1161988394) + W(1, -1113215633, 1034531971, -1118383435, 1028261725) + + W(2, -1105638218, 1028972955, 1029956673, 1048735800) + W(3, 1034458457, 1025753183, 1036634769, 1000882603) + + W(4, -1090712556, 1051586707, 1040982790, -1113315600) + + W(5, 1025381303, -1116357686, -1096961046, 1047278155) + + W(6, -1068172350, -1062545743, 1058445980, 1081890452) + W(7, 1078990875, 1057946443, -1129266047, 1020805991) + + W(8, 1053466473, -1089644697, 1044082250, 1021891615) + W(9, 1047100697, -1138523317, -1118643722, 1003167691) + + W(10, 1031038629, -1109024185, -1115541422, -1110157560) + + W(11, 1034093689, -1121128958, -1164400298, 1023430939); + WS(-1086946092, 1067745931); + sum1 = W(0, -1129718754, 1029399808, 1034551451, 1031195606) + W(1, 1040134022, 1033121193, 1023151712, 1042343314) + + W(2, 1043160110, -1107060738, 1035261538, -1095383669) + + W(3, -1133919947, -1122710934, -1107305618, 1042006276) + + W(4, 1057051220, 1052187432, 1056679450, 1065908691) + W(5, 1053194351, 1055695833, 1050664148, 1051480109) + + W(6, -1086793423, -1093519641, -1086890615, -1082115172) + + W(7, -1091092163, -1087806651, -1106762967, -1086763775) + + W(8, 1029510552, 1041235060, 1027399596, 1028581668) + W(9, 1039541441, 1022886169, 1035840335, -1123269599) + + W(10, 1019782728, 1028876859, -1121687640, -1151056709) + + W(11, 985161115, 1032179179, -1137650955, 1023858088); + sum2 = W(0, -1092038506, -1100127293, -1076970891, -1074419095) + + W(1, -1072137471, -1071882845, -1075499422, -1077760287) + + W(2, 1049598436, 1048639033, 1064718435, 1072396257) + W(3, 1071503744, 1074270589, 1071966648, 1067893220) + + W(4, 1043882093, 1037661877, 1059313512, 1057486689) + W(5, 1051417643, 1058040444, 1034550731, -1109701446) + + W(6, 1042320103, -1103044471, 1034035103, -1104719409) + + W(7, -1111075093, 1044428409, -1105998171, 1040427981) + + W(8, -1131832297, 1002123811, -1103733932, 1041582287) + + W(9, -1115120295, -1139439905, 1008560441, -1112073274) + + W(10, -1121740952, 1029198842, -1115216799, 1010136401) + + W(11, -1128000009, 1024386386, -1120184167, 1030441594); + WS(-1081254198, -1103496580); + sum1 = W(0, -1115414444, 1041339642, -1098407452, -1130637434) + + W(1, 1020760807, -1101995566, 1047565230, -1100079212) + + W(2, -1146587219, -1098606506, 1050459360, 1042214179) + + W(3, -1117423418, 1034598934, -1122745995, 1024450296) + + W(4, -1093427101, -1097683981, -1091994231, -1078168847) + + W(5, -1095228700, -1092752622, -1097351785, -1094816186) + + W(6, 1048836291, 1057498447, 1058816906, 1061921355) + W(7, 1063391143, 1049596874, 1055225025, 1057483350) + + W(8, 1038644661, -1144521152, -1117884339, 1040740783) + + W(9, -1099277734, -1125383814, -1125503451, -1112883619) + + W(10, 1040942563, -1102869832, 1036627839, -1165859686) + + W(11, -1107645994, 1047950513, -1104517417, 1038686359); + sum2 = W(0, -1101463653, 1049429767, -1128244554, -1113723320) + + W(1, -1100253783, -1100739127, 1041910404, -1105778187) + + W(2, 1057761413, 1067192921, 1075421514, 1075836777) + + W(3, -1088665878, 1016894214, -1116933337, -1111337535) + + W(4, -1092703936, -1078098525, -1071536845, -1077415283) + + W(5, 1059548308, 1051692516, -1101242161, 1048285068) + + W(6, -1109493923, -1139460835, 1039603395, -1087182285) + + W(7, 1034610843, -1117875445, 1013931579, 1038460759) + W(8, 1041760680, 1028945771, -1114414573, 1045554670) + + W(9, -1106673179, 1032645955, -1122014712, -1113595007) + + W(10, 1014720459, -1117756514, 1016362862, -1118637934) + + W(11, -1125369728, 1027339291, 1013909643, -1124961818); + WS(-1089093868, 1047195432); + sum1 = W(0, -1139038025, -1146634508, -1107247574, -1111039036) + + W(1, -1111569431, -1131070116, -1123633457, -1125658710) + + W(2, -1108646892, -1102493258, -1102675263, 1027299238) + + W(3, 1043334313, 1035038251, -1130835530, 1006218639) + W(4, 1042227448, 1050027260, 1055627170, -1094097439) + + W(5, -1086063146, -1091453053, -1104540112, -1100496626) + + W(6, -1116853265, -1113152371, -1102292967, 1059178599) + + W(7, 1064850945, 1055758905, 1047069456, 1028822677) + W(8, 1032512066, 1037772585, 1040310103, -1120135685) + + W(9, -1097054397, -1107670363, -1109953256, 1033685440) + + W(10, 1015754506, -1111624526, -1122052409, -1123630421) + + W(11, 1035574535, -1126001639, 1015067608, 906381938); + sum2 = W(0, -1103632983, 1043805370, -1100282419, 1043204826) + + W(1, -1107284068, 1032596944, -1115324019, 1038389706) + + W(2, 1051248459, -1102825598, -1110573499, 1027245233) + + W(3, -1115422824, -1088944566, -1119815045, -1103855212) + + W(4, 1050224986, -1106748849, -1142028319, 1068200484) + + W(5, -1110893073, -1082511144, -1101546175, -1099926119) + + W(6, -1112111441, -1107415409, 1047715488, 1064575785) + + W(7, -1116519441, -1166081973, 1033478296, -1112155627) + + W(8, -1114055425, -1113209339, -1106125891, 1034756297) + + W(9, -1121811913, 1036646608, -1139772871, 1042197713) + + W(10, -1111599379, 1037386114, -1107474855, 1042201726) + + W(11, -1115818225, 1036836551, -1107371535, 1026011708); + WS(-1121781432, -1075996235); + sum1 = W(0, -1139185884, 1017932812, 1031934942, 986151814) + W(1, -1164665422, 1000199096, 1007298263, -1140438078) + + W(2, -1104344139, -1106763371, -1097501556, -1122902443) + + W(3, -1153685131, -1127990679, 1001735501, -1113474827) + + W(4, 1055178280, 1050633065, 1061458986, 1056941803) + W(5, 1057254916, 1045616484, 1030315686, 1046908556) + + W(6, 1023675446, -1102467779, -1098857564, -1087567683) + + W(7, -1091469811, -1104204108, -1129857478, -1103515070) + + W(8, -1115352921, -1113788396, 987917899, 1038547421) + + W(9, -1108760371, 1011665321, -1121847517, -1118109260) + + W(10, -1116105386, -1134059780, -1113912527, -1136836585) + + W(11, 1007170123, -1128021832, -1154396360, -1121041198); + sum2 = W(0, -1168649543, -1129109975, 1016893178, -1132018102) + + W(1, -1117453381, 1023462612, -1106957470, -1115823387) + + W(2, -1097479461, -1104465921, -1103938775, -1118749694) + + W(3, -1115486085, 976518647, 1025546665, 1034975399) + W(4, 1049098480, 1049155382, 1057022497, -1098731951) + + W(5, -1119719509, -1106384437, -1098317799, -1105263623) + + W(6, 1042706476, -1102354715, 1043506300, -1097087336) + W(7, 1057524747, 1036026738, 1045328977, 1035074429) + + W(8, 1041988609, -1112820525, 1047765539, 1046909100) + + W(9, -1100642605, -1121071990, -1106523641, 1003192501) + + W(10, -1106980555, -1122042062, -1105649317, 1031531696) + + W(11, -1114531186, 1040948740, -1113359258, 1033488186); + WS(1058868844, 1053114578); + sum1 = W(0, 1019520880, -1122446279, 1037061470, 1025396381) + W(1, 1029402067, 1031841884, -1120186199, 1033549944) + + W(2, 1047026923, -1120049453, 994701546, -1104790763) + + W(3, -1104820950, 1021084025, -1105237507, 1009185118) + W(4, 1040716289, 1048040834, 1059285152, 1063349990) + + W(5, 1062179110, 1056787146, 1046529242, 1057448647) + + W(6, -1095841007, -1093651986, -1089525095, -1081113852) + + W(7, -1086213616, -1087503095, -1091401861, -1088312360) + + W(8, 1020793813, 1039005404, 1046415125, 1040363303) + W(9, 1045703966, 1041196477, 999605293, 1036113571) + + W(10, 1026453035, -1117418946, 1019785277, -1114838686) + + W(11, 1030676884, 1024749253, 1004229292, 1022861598); + sum2 = + W(0, 1050427341, -1106859908, 1035861035, -1112488680) + W(1, 1032409135, -1122621450, -1104767713, 1046587865) + + W(2, -1089070569, -1111523090, 1043538575, -1097196972) + + W(3, 1036654054, -1133854060, -1130574088, -1093068011) + + W(4, 1053219089, 1052246278, 1059060280, -1088179143) + W(5, 1017346040, 1043005089, -1092034159, 1052143300) + + W(6, 1067490860, -1093125710, -1078649576, -1087268097) + + W(7, 1059384755, 1062938540, -1093321870, 1059539225) + + W(8, -1080930470, -1078811541, -1074777053, -1075643449) + + W(9, -1124572738, 1049929252, -1112625720, 1059287102) + W(10, 1058659628, 1066232343, 1073277874, 1065823003) + + W(11, 1062269032, 1043425453, -1092663388, -1098215774); + WS(-1074642550, 1059001037); + sum1 = + W(0, 1033877849, -1114814273, 1017602926, -1122785432) + W(1, -1119942606, -1121541554, 1004629641, -1103073299) + + W(2, -1105864948, -1133959838, -1106724665, 1042832010) + W(3, 1046400581, 1036804396, 1032924291, 1039804561) + + W(4, 1040506928, -1108476642, -1098100854, -1084427489) + + W(5, -1083890617, -1088670813, -1090515058, -1095458045) + + W(6, -1096349630, 1023714759, 1055335876, 1065396984) + W(7, 1062559324, 1061684023, 1051195620, 1054342111) + + W(8, 1046552293, -1108357401, 1032280783, -1132282059) + + W(9, -1113686945, -1104721044, -1110306392, 1031943308) + + W(10, -1110243859, -1127057913, -1147216585, 1033899323) + + W(11, 1032718711, 1025273824, -1122497752, -1121848889); + sum2 = + W(0, 1024273115, -1131612410, -1107407950, 1041256788) + W(1, -1117121277, 1031505312, -1110072407, 1016793154) + + W(2, 1021686194, 1025348247, -1105777061, 1042238427) + + W(3, -1126779625, -1118046720, -1118330488, 1027338756) + + W(4, 1043888107, -1101286924, 1048538591, -1090332406) + + W(5, 1053208564, 1043322093, -1135252559, -1116082242) + + W(6, -1108335658, -1122239076, 1046097166, 1036931728) + W(7, 1040874893, 1040745205, 1050743072, -1096125238) + + W(8, -1077891718, -1091711743, -1097181377, 1065426853) + + W(9, 1063431633, 1040529954, -1097546746, 1050690616) + + W(10, -1110849641, -1111108183, 1033944270, -1111979954) + + W(11, 1039617071, -1105370761, -1122096807, -1122718137); + WS(-1088674604, -1128666815); + sum1 = W(0, -1123914807, 1016031116, 1014718188, 1024027612) + + W(1, -1145356432, 1024193015, -1124389866, 1032770888) + + W(2, -1112902532, -1154837176, -1114821559, -1098901213) + + W(3, -1103324234, -1099251759, -1119376425, -1101826270) + + W(4, 1031043843, 1033184452, 1015481863, 1054517603) + W(5, 1051928805, 1059978813, 1047372601, 1062901239) + + W(6, 1051063687, -1131397783, 1027540319, -1102428675) + + W(7, -1094753613, -1100081596, -1110958225, -1101878062) + + W(8, -1094561666, 1025159063, -1102063788, -1104802482) + + W(9, 1021380397, -1111732847, -1154253637, -1113334654) + + W(10, 1018478931, -1134237698, 1024172061, -1126359028) + + W(11, -1133861065, -1114031158, 1028470484, -1114369951); + sum2 = + W(0, -1125911137, 1012595671, 999266341, 1044288444) + W(1, -1101165077, 1041147790, -1113177198, 1025832748) + + W(2, -1108931889, -1114639139, 1007405169, -1110292957) + W(3, 1050109344, 1041510968, 1029583838, 1046353900) + + W(4, 1017628143, 1032292317, -1114156858, -1067836662) + W(5, -1072172899, 1037860217, 1074693740, 1081403750) + + W(6, 1050970701, -1128469007, -1110785518, -1074929312) + + W(7, -1105301985, 1044362436, 1048694785, 1057358913) + W(8, 1035307535, -1112594616, 1028698628, -1112320536) + + W(9, 1032862316, -1133865234, -1121233078, 1015908463) + + W(10, -1132880011, 1026392505, -1126668834, 1035975658) + + W(11, -1115294669, -1122721591, 1027549527, -1114367420); + WS(-1092184279, -1114774309); + sum1 = W(0, -1112548452, -1120800919, -1114639366, 1008341430) + + W(1, 1009522319, -1120506536, 1034801619, 1022706306) + W(2, 1035183681, 1038305887, 1043708422, 1037535198) + + W(3, -1098020135, 1029108045, -1128765878, -1106461058) + + W(4, -1114927434, -1101125062, -1087724142, -1103312811) + + W(5, 1062809460, -1118967585, 1002077113, 1043448960) + W(6, 1044352162, 1039166894, 1063427286, 1034792975) + + W(7, -1088121787, -1115071968, -1114196826, -1129024277) + + W(8, 979364527, -1131609361, -1093459700, 1048665209) + W(9, 1043037714, 1023205859, 1033949151, -1126884683) + + W(10, -1115173597, -1182492945, 1021495134, -1113251558) + + W(11, -1113757330, -1113409875, -1123554950, -1115469664); + sum2 = W(0, -1130731300, -1146462793, -1114036842, 1017173194) + + W(1, 1027612469, -1121343755, 1027895615, -1154268081) + + W(2, -1113218164, 1028824397, 1013989596, 1034818358) + + W(3, -1104368005, 1040334859, -1123082454, -1123775916) + + W(4, 1024876637, -1129593633, 1044891209, -1101530532) + + W(5, 1049606516, -1097048862, 1042764886, -1113704648) + + W(6, -1112264614, -1113338336, 1058622224, -1105838439) + + W(7, 1050794194, -1102338893, 1040822444, -1122592353) + + W(8, -1099018413, -1111675537, -1088855347, 1059579881) + + W(9, 1042736448, 1043492825, -1121501222, 1034905054) + + W(10, 1026854381, -1102804304, -1102462733, -1108694945) + + W(11, -1114432119, 1019755962, -1122392540, -1119817837); + WS(1061153836, -1122742154); + sum1 = W(0, 1027853554, -1115291137, -1171221910, -1112977164) + + W(1, -1121554637, 1022714404, -1157881362, -1123187178) + + W(2, -1109089440, 1043116226, -1138258466, 1050791197) + + W(3, 1034471002, 1041098678, -1134239506, 1034237593) + + W(4, -1102650256, -1115210274, -1112757431, -1077890273) + + W(5, -1082648980, -1093251577, -1097764996, -1092621429) + + W(6, 1051082942, 1047414994, 1055597733, 1055540065) + W(7, 1061271560, 1053866013, 1044732088, 1032996986) + + W(8, 1027843188, -1112215273, 1034632359, 1042514461) + W(9, -1131618020, 1046515591, 1036747322, 1043087924) + + W(10, -1131011401, -1119605372, -1126942769, -1126698730) + + W(11, 998349933, 1025132479, -1120958927, 984532249); + sum2 = + W(0, 1031101174, -1132731961, 1022986308, 1017601076) + W(1, -1126674740, 1022398052, 1013813081, 1010235161) + + W(2, -1102026314, 1038074007, -1092900468, 1030590838) + + W(3, 1001758673, 1001713969, -1140283033, -1138091097) + W(4, 1042272104, -1090146581, 1028046198, 1054179894) + + W(5, -1096188072, 1035923987, -1106500726, 1036670019) + W(6, -1126868316, 1042331882, 1039425711, 1068886648) + + W(7, 1049555295, -1096410864, 1036573795, -1105222854) + W(8, 1028240358, 1036936531, -1122656394, 1039233571) + + W(9, -1086618714, -1090080092, -1110072380, -1134061337) + + W(10, 1023923290, -1128194324, -1114483483, -1108833787) + + W(11, 1026905222, 1029729918, 1035325123, 1035525391); + WS(-1098883799, 1037141561); + sum1 = W(0, -1114839991, 1029657918, -1116594483, 1034543274) + + W(1, 1026816074, -1140770618, 1035386535, 1007197468) + W(2, 1039141586, 1034970850, 1048999812, 1026227619) + + W(3, -1103366664, -1115755155, -1109617409, -1117505278) + + W(4, -1110021469, -1090767256, -1089859629, 1007604554) + + W(5, 1063309440, 1050338841, 1049028980, 1050252341) + W(6, 1020247259, 1029681923, 1058872566, -1100094273) + + W(7, -1090400131, -1090199858, -1104209655, -1101914812) + + W(8, 1030453625, -1119339247, -1104869706, -1106749124) + + W(9, 1040832320, 1023759014, 1040157646, 1034144506) + + W(10, 1040211480, -1126798193, 1041448405, -1123771570) + + W(11, 1006844457, -1131945671, -1115455274, -1106217213); + sum2 = W(0, 1003211606, -1137674963, -1151639180, -1126381316) + + W(1, -1125497686, -1120928387, 1024650751, -1121709003) + + W(2, -1120528483, -1120827669, -1113012012, -1125167698) + + W(3, -1133545211, 1042115577, -1111755343, 1034768106) + + W(4, -1156174412, -1165578649, 1045965141, -1143882022) + + W(5, -1157195276, -1139515595, 1024020315, -1128894336) + + W(6, -1122088448, 1021421814, -1108742643, 1025314463) + W(7, 1048741047, 1042307479, 1028526161, 1033940928) + + W(8, 1034591096, 1046263423, 1043768035, 1048434617) + + W(9, -1100558843, -1111490489, -1106766859, -1105393784) + + W(10, 1008615371, -1109822394, -1107512724, -1102660599) + + W(11, -1103528899, -1116374767, 1031989982, -1146160726); + WS(1056068055, 1054753321); + sum1 = W(0, -1151415881, -1148496799, 1010657956, 1024019466) + + W(1, -1130137728, 1008503186, -1132133255, 1035499631) + + W(2, 1039080395, -1110003853, 1010453293, 1036235820) + W(3, 1020552269, 1036573197, -1115513116, 1040242409) + + W(4, 1057552055, 1043835198, 1059020393, 1056043521) + W(5, 1059247988, 1054798584, 1050516586, 1047345767) + + W(6, -1089028090, 1042243518, -1089501818, -1077848098) + + W(7, -1085601017, -1088101382, -1102383812, -1092379525) + + W(8, -1115248008, 1050869997, 1038857744, 1040563886) + W(9, 1031869090, 1014726271, 1037313809, -1116861746) + + W(10, 1035025164, 1014222010, 1019596694, -1121658024) + + W(11, -1123056704, 1035081577, -1137744617, 1008326318); + sum2 = + W(0, 1028355794, -1106782132, 1035193429, 1019490884) + W(1, -1103311494, 1051099266, -1107701072, 1017055868) + + W(2, -1096807405, 1053669968, -1113415499, 1045145961) + W(3, 1033457423, -1105194567, -1111393110, 995616995) + + W(4, 1040605863, -1138391825, 1054131819, -1117197986) + W(5, 1014178849, 1043284247, 1045435457, -1110630971) + + W(6, 1067941768, -1075220438, -1088459045, 1059082808) + + W(7, 1050105229, -1121773074, -1120483817, 1023829774) + + W(8, -1077104108, -1095467240, -1094157882, 1063065831) + + W(9, 1061761756, 1042603721, -1116379229, 1044996767) + + W(10, 1052817152, -1103015841, 1049259157, -1103440804) + + W(11, -1095094287, -1122898552, -1109769641, 1018464332); + WS(-1081368566, -1084412265); + sum1 = W(0, 1027068306, 1015688387, 1033201483, 1018141039) + W(1, 1032237687, 1022250212, 1019999841, 1019305877) + + W(2, -1116002144, -1139602460, -1116483849, -1108067395) + + W(3, -1114781410, -1101031910, -1110135922, -1115253585) + + W(4, 1048181720, 1048418201, 1059204754, 1059054739) + W(5, 1060863016, 1054995541, 1048891912, 1054003721) + + W(6, -1097381330, -1109028275, -1086309497, -1080843359) + + W(7, 1035809139, -1090938969, -1097995920, -1098655035) + + W(8, -1110979184, 1018111780, -1126061147, 1023153354) + + W(9, 1043786804, -1102361409, 1017536656, -1110370680) + + W(10, 1021378954, 1036715310, -1118145977, 1024269909) + + W(11, 1014428471, 1015803518, 1027639288, 1026153225); + sum2 = + W(0, -1105480981, 1035973965, 1037165381, -1106311589) + W(1, 1052000177, -1104974154, -1120302417, 1040627526) + + W(2, 1050460434, -1096496755, 1049140757, 1006710678) + W(3, -1091756558, 1044207757, 1032159893, -1100748342) + + W(4, -1098849709, 1051612828, -1090898849, 1040931379) + W(5, 1058463605, -1090778289, 1039812947, 1045155050) + + W(6, 1048076097, -1090117310, 1053634690, 1066845841) + + W(7, -1077185739, 1058534342, -1102438650, -1096398368) + + W(8, 1035320005, 1047120319, 1021130333, -1083953982) + W(9, 1057459457, -1091684787, 1041032826, 1045504944) + + W(10, -1105501338, -1108725217, 1039969785, 1046728781) + + W(11, 1038345201, -1141278071, 1040363142, -1109297232); + WS(1040286894, 1035975353); + sum1 = + W(0, -1171293815, 1023182418, 996039142, -1137235964) + W(1, -1135192533, 1025821242, -1128818097, 1020463141) + + W(2, 1034319831, -1127987806, -1102399280, -1105596260) + + W(3, -1103790599, -1108335719, -1114500598, -1129600787) + + W(4, 1059664710, 1048633701, 1062256902, 1059153168) + W(5, 1061115073, 1056014846, 1050028641, 1052737098) + + W(6, -1091927835, -1097464070, -1087363556, -1086480503) + + W(7, -1089057879, -1099300213, -1097571161, -1112421262) + + W(8, -1116625676, 1029070026, 1016696459, 1000027879) + W(9, 1028964506, -1108586113, 1032749254, -1096430155) + + W(10, 1013574450, 1012611215, -1115123712, 1006568169) + + W(11, -1134032598, 1032814547, 1020632239, 1016193698); + sum2 = W(0, -1115556642, -1130243023, 1032034792, -1126476135) + + W(1, 1032996496, -1138592966, -1121911846, 1029413614) + + W(2, 1037372428, 1030557532, 1049080310, -1112452010) + + W(3, -1108874582, -1125709403, -1147299853, -1125845903) + + W(4, 1085969060, 1077581449, -1074326256, -1064530882) + + W(5, -1074476109, -1104386166, 1029772508, -1109306490) + + W(6, 1051814466, 1043810263, -1103611514, -1081646826) + W(7, 1033029539, 993676602, 1034388196, 1000946837) + + W(8, 1011471282, 1030366783, -1109496698, -1129814679) + W(9, 1035377868, 1007963430, 1005762565, 1024214725) + + W(10, -1114698318, 1034280644, -1140286158, 1022645135) + + W(11, -1126128243, 1013431542, -1114714998, 1024966722); + WS(-1128144240, -1105727419); + sum1 = + W(0, 1008177348, 1008158465, 1025380533, 1041196118) + W(1, -1123971020, 1038005880, -1110790464, 1022532691) + + W(2, 1038442911, 1030921926, -1116236765, -1091904121) + + W(3, -1110541401, -1155490648, -1118346788, -1132141153) + + W(4, 1034971295, -1108323937, 1041262911, -1116818069) + W(5, -1118195565, 1050488689, 1005836543, 1035288564) + + W(6, 1037111480, 1020025483, 1039711206, -1090328900) + W(7, 1053066642, -1108534613, 1032777199, 1043217853) + + W(8, -1119737674, 1015575522, -1096558626, -1106145913) + + W(9, -1107602136, 1033678004, 1034582855, -1110557919) + W(10, 1019898055, 1036155997, 1023258159, 1038413850) + + W(11, -1123851725, 1027658998, -1118860082, -1161170171); + sum2 = W(0, -1128930637, 1013105493, 1027020519, -1111106512) + + W(1, 1033707008, -1108465338, -1130609759, -1112986298) + + W(2, -1132037027, -1110061572, 1023565141, -1118411413) + + W(3, -1104848450, 1001195043, -1113096913, -1123693871) + + W(4, 1018701611, 1028677045, -1097696705, 1051172043) + W(5, 1036460110, -1134254189, 1035127174, 1021784635) + + W(6, -1110976033, -1113315034, -1136487341, 1064921249) + + W(7, -1097426277, 1028959819, -1113952185, -1139702593) + + W(8, -1129623857, -1136221161, 1045236380, -1100340880) + + W(9, 1026225447, 1033145987, -1105387359, 1025786651) + + W(10, 1029665439, -1120215489, 1025952555, -1120959951) + + W(11, 1006240491, -1118442072, -1137489821, -1119362634); + WS(1066786198, 1018352061); + sum1 = W(0, 1037807432, -1147124480, 1032919115, 1043153405) + W(1, 1024885356, 1040525108, 1034093744, 1041644314) + + W(2, 1042991174, -1118935590, -1102401423, -1111703874) + + W(3, -1105747115, -1109427003, 1036876386, -1113217832) + + W(4, 1056116676, 1053008404, 1058826232, 1052869895) + W(5, 1063596395, 1052412861, 1055303296, 1055747689) + + W(6, -1089303485, -1093203077, -1091158043, -1077398372) + + W(7, -1088790919, -1096537905, -1092801624, -1095292522) + + W(8, -1115182496, 1032850856, -1118679276, -1112497438) + + W(9, 1041854800, -1158252416, 1029739551, -1097656684) + W(10, 1044944769, 1019595829, 1030098999, 990101824) + + W(11, 1037575334, 1022825908, 1042956152, 1027108728); + sum2 = + W(0, 1036031230, -1120880520, -1118383086, -1112120068) + W(1, 1044452135, -1113902667, 1036248196, -1175016923) + + W(2, -1102747382, 1035081854, -1081312733, -1097589576) + + W(3, -1136989239, -1101386787, 1038098664, -1106083613) + W(4, 1040389106, 999021742, 1046511529, 1061513306) + + W(5, -1098672489, 1028645652, 1037598188, 1027306194) + W(6, 1027629590, 1048871361, -1102228261, 1059108854) + + W(7, 1030279668, -1090327880, 1046091275, -1110606753) + W(8, 1033840740, 1037408166, -1111365044, 1017984327) + + W(9, 1032578550, -1098256610, 1055272900, -1100293962) + + W(10, -1113736580, 1036561850, -1105995296, 1037901466) + + W(11, 1024281094, 1003868670, 1035521712, -1114802202); + WS(-1088826540, -1072617048); + sum1 = W(0, 986338164, 1023136598, -1127817408, 1038855104) + W(1, -1112014844, 1032100206, -1114071293, 1031252724) + + W(2, 1037920241, -1108211448, -1117329516, -1098615294) + + W(3, -1156351446, -1125030464, 1025960366, -1128205111) + + W(4, 1051799989, 1051897846, 1060040519, 1068445460) + W(5, 1041659186, 1049473503, 1046320643, 1053193450) + + W(6, -1096657083, -1097067830, -1085267217, -1091986338) + + W(7, -1085224562, -1095210946, -1103740786, -1098483636) + + W(8, -1131268440, -1134063855, 1034398076, -1104903024) + + W(9, 1041222927, -1123500579, 1021522163, -1110505437) + + W(10, -1122826702, 1022858827, 1016624516, 1025833567) + + W(11, -1148095931, 1018816617, 1004333185, -1135786218); + sum2 = W(0, 1025188267, -1121532154, 1037371296, -1111771837) + + W(1, 1040037716, -1106548534, 1039102739, -1109851481) + + W(2, -1139275200, 1033600964, -1123953755, 1046721727) + + W(3, -1098628025, 1040338433, -1109104289, 1042987802) + + W(4, 1040515214, -1111129732, 1035395064, -1119362505) + + W(5, 1046868281, -1095083293, 1045077862, -1121821072) + + W(6, -1131755519, -1105820182, 1067277095, 1075696256) + + W(7, -1070220409, -1079865944, 1049591033, -1113640498) + + W(8, -1105181237, 1041295374, -1104867399, 1058324165) + + W(9, -1095490474, 1030948623, -1107729189, 1039251361) + + W(10, 1030566925, -1137053008, -1131759093, 1026363312) + + W(11, -1118056117, 1018203389, -1128931569, -1123620784); + WS(-1126600048, -1081356549); + sum1 = W(0, -1127841038, -1121393942, -1127713943, -1112866678) + + W(1, -1130256197, -1113126004, -1135790871, -1114110304) + + W(2, -1133929050, 1032965854, 1033968271, 1043820719) + W(3, 1042942538, 1043379215, 1027795642, 1034600139) + + W(4, -1098403026, -1092154099, -1092503722, -1081570623) + + W(5, -1086843241, -1092479684, -1097678271, -1094287464) + + W(6, 1044657313, 1056638003, 1049224359, 1066854747) + W(7, 1055316562, 1058087872, 1032418298, 1051778533) + + W(8, -1112364357, 1040562850, 1040769245, -1105175211) + + W(9, -1123699911, -1108064855, -1138101411, 999504676) + + W(10, -1126110067, 1036225512, -1129561307, 1047740947) + + W(11, -1102743497, 1041161205, -1106598351, 1039116783); + sum2 = W(0, 1002695390, -1122258341, -1122292123, -1120933435) + + W(1, 1032169765, -1117894001, 1003179774, -1138289315) + W(2, 1041236493, 1024135109, 1018577975, 1034742596) + + W(3, -1148289286, -1155671947, 1027950533, -1116290259) + + W(4, -1107205869, -1167041196, 1048984334, -1085659967) + + W(5, 1041640777, -1108030745, -1123201389, -1139220243) + + W(6, -1110230321, -1120190201, -1063745707, -1070580481) + + W(7, 1042707591, 1049556353, -1106095214, 1050855401) + W(8, 1025661924, 1051920007, 1083223141, 1079255156) + + W(9, -1110361303, -1097500712, 1030518681, -1105964729) + + W(10, 1013006047, -1101224590, 1033459361, 1037086181) + + W(11, -1105447820, 1029970779, 1006793819, -1115669085); + WS(1044741550, -1111040261); + sum1 = W(0, -1123328853, -1102049737, 1040528310, -1104112191) + + W(1, 1024305776, -1101315365, 1021709031, -1111623399) + + W(2, -1129171790, 1051367713, -1097130129, 1051950321) + + W(3, 1039437043, 1045396986, -1108128612, -1165073551) + + W(4, -1119860449, -1091471693, 1035652177, -1092522751) + + W(5, -1095677118, -1130673884, -1112716514, -1121220876) + + W(6, 1045626213, 1046305018, 1049556145, 1053940037) + W(7, 1055561708, -1095468986, 1044018368, 1026385047) + + W(8, -1104602741, 1044417333, -1091825946, 1049099055) + + W(9, -1104689389, 1055485165, -1103796617, 1036376309) + + W(10, 1022127887, -1107859535, 1033350174, -1124872112) + + W(11, -1115808049, -1115536169, 1029190802, -1122289340); + sum2 = W(0, -1104033148, -1105436527, -1109964889, -1097126651) + + W(1, -1098141643, -1090250993, -1116302593, -1118233874) + + W(2, 1039328248, 1038128967, 1010051700, 1057153562) + W(3, 1057745438, 1060383381, 1035812245, 1044677482) + + W(4, 1040757730, 1010939044, 1051778220, 1035481326) + + W(5, -1094952202, -1102222701, -1133841678, -1105877607) + + W(6, 1023457753, -1118329847, -1098103909, -1094975289) + + W(7, 1048659070, -1098057265, -1123621243, -1160321672) + + W(8, -1105261590, 1011822306, 1019752394, 1037637839) + W(9, 1023965510, 1049957743, -1104798795, 1036758948) + + W(10, 1019934334, 998732076, -1151355224, -1112777586) + + W(11, 1012075272, -1134551782, 1031321862, -1124061226); + WS(1065794902, 1053657215); + sum1 = W(0, -1121908120, 1018314063, 1015310777, -1124873339) + + W(1, 1031572020, -1147984576, 1024640407, 1026486289) + W(2, 1038333639, 1031009517, 1039118671, 1034311430) + + W(3, 1041290230, -1120195837, -1119856235, -1114392412) + + W(4, 1027457764, -1106391546, -1097318831, -1141167585) + + W(5, 1054548019, 1053489270, 1041008530, 1038700424) + W(6, -1123855831, 1034446294, 1039330595, -1090069831) + + W(7, -1096859758, -1090834490, -1105884449, -1105777031) + + W(8, -1123864939, -1121443224, 1026117491, 1040632671) + W(9, 1028976296, 1043686014, 1007855863, 1023881277) + + W(10, 1004753494, 1015085764, -1152877546, -1119728987) + + W(11, -1155937596, -1132243578, 999100652, -1148206328); + sum2 = + W(0, -1111593455, 1026283313, -1106910582, -1123416451) + W(1, 1050577288, -1128641646, 1047088729, -1113858977) + + W(2, 1035072504, 1028902500, 1047373071, 1053329938) + W(3, -1092564654, -1100521328, -1096962366, 1017970524) + + W(4, 1043803228, -1108682745, 1040261276, 1067600226) + W(5, -1072392505, -1113219589, 1049469167, 1037790473) + + W(6, 1033408259, -1102620143, 1048908013, -1090850305) + W(7, 1062297118, 1017836657, 1033530157, -1125952722) + + W(8, -1104275307, 1005020832, -1100960524, 1050480903) + + W(9, -1138210428, -1168415746, 1025688819, -1131011166) + W(10, 998670368, 1032181798, 1023771046, 1032569956) + + W(11, -1112013629, 1023611526, -1112880371, 1021270423); + WS(1062391596, 1012575503); + sum1 = W(0, 1031343933, -1104891955, 1032025473, 1018981700) + + W(1, -1107154694, 1037332142, -1113508494, -1120166325) + + W(2, -1118754907, 1040079801, -1098309187, 1047266492) + + W(3, 1041578200, -1102249736, 1040475388, -1099931343) + + W(4, -1124966418, 1034244551, -1115351741, -1082667844) + + W(5, 1034155267, -1116669206, -1108675062, 1037232762) + + W(6, -1110681406, -1097175282, 1051954479, 1046130725) + W(7, 1051147223, 1052085167, 1003822408, 1045069376) + + W(8, 1044511208, 1039695694, 1024690888, 1049723012) + W(9, -1103478091, 1031631968, 1001356052, -1120670778) + + W(10, -1105353116, 1041572194, -1106768761, -1111177056) + + W(11, 1041859398, -1100878141, 1037747241, -1115735812); + sum2 = + W(0, 1033523600, -1111554425, -1129275556, -1122087690) + + W(1, -1124036306, 1037981702, -1119955572, -1122349214) + W(2, 984378304, 1035520350, -1139357832, 1042336361) + + W(3, -1098127108, -1108770624, 1031985496, 1030270440) + W(4, 1029410276, 1027721316, -1120989222, 1063527919) + + W(5, -1086537602, -1087308230, 1038170956, 1040810725) + W(6, 1013286288, -1092144316, 1051778774, 1062226267) + + W(7, -1106529787, 1023869712, -1106223749, -1113965912) + + W(8, -1149511552, 1040549613, -1101613332, 1044728263) + + W(9, -1102568312, 1043627655, -1109791564, 1025118636) + + W(10, -1114072340, 1027894332, -1138380800, -1113445964) + + W(11, 1042436209, -1103441850, 1038090706, -1120264936); + WS(1061969900, 1065420380); + sum1 = W(0, 1002358108, -1132400117, 1036273784, -1121891281) + W(1, 1031471239, 1014037550, 1015146068, 1021231496) + + W(2, 1041410250, 1024825568, -1111416381, -1112279056) + + W(3, -1100377015, -1110955448, -1140842745, -1109508230) + + W(4, 1005238718, 1055004288, 1058195604, 1065721300) + W(5, 1058645356, 1050103969, 1047622119, 1050895308) + + W(6, -1098164717, -1093641048, -1089452644, -1081575699) + + W(7, -1095897092, -1095327860, -1122283864, -1101391147) + + W(8, -1127598604, 1037205414, -1122200151, 1041630292) + + W(9, -1115380038, 1033148051, -1112032609, -1107652840) + + W(10, 1013481849, -1128588267, 995531041, -1118185583) + + W(11, 1031870564, -1125213521, 1031659065, -1167265945); + sum2 = W(0, 1037378832, -1105869799, 1034348880, 1010791317) + + W(1, 1020451237, 1025476671, -1121382126, -1144944739) + + W(2, -1097408481, 1040337956, 1050274911, -1124897054) + + W(3, -1105197585, -1107003535, -1131733180, -1128932040) + + W(4, -1089422359, 1064628576, 1078490638, -1067190452) + W(5, 1026583828, 1034175619, 1030289482, 1035014695) + + W(6, -1134521568, 1048269110, 1055313899, -1081189141) + + W(7, 1051135592, 1043712009, -1114815155, -1125325948) + + W(8, 1024014288, -1113808990, 1025241947, -1100728789) + + W(9, 1047164907, -1112306567, 1025919494, -1116208218) + + W(10, -1156999910, -1121898726, 1025759300, 1010618498) + + W(11, 981635389, -1142752483, -1158764013, 1029088384); + WS(1048733783, 1027643848); + sum1 = W(0, -1133845785, -1133175894, -1135183403, -1116789548) + + W(1, -1148511502, -1134260761, 1018609610, -1123833247) + + W(2, 1036515120, 1023561851, 1042717327, 1030082171) + W(3, 1048693393, 1034425221, 1039337356, 1027869798) + + W(4, -1088559253, -1093510507, -1088396394, -1080791005) + + W(5, -1089662985, -1090323862, -1100061261, -1089888600) + + W(6, 1057953132, 1049915371, 1060634166, 1063183646) + W(7, 1058925305, 1044704560, 1042697693, 1047384498) + + W(8, 1034283684, -1130587597, -1127730531, -1114509469) + + W(9, -1138682841, 1038705162, 1015444552, 1049640472) + + W(10, -1114935677, 1012777537, -1122593837, 1031486794) + + W(11, -1116148770, -1166921432, -1126426832, 1023971661); + sum2 = + W(0, 994989105, -1144072856, -1122509885, 1026939205) + W(1, 1028398855, -1120878413, 1025208177, -1113678678) + + W(2, 1037891939, -1103317800, 1037436931, -1127785128) + + W(3, -1103788534, 1034163445, -1127272012, 1026044831) + W(4, -1173716290, 1052666546, 1001371192, 1040815920) + + W(5, -1100616833, 1020001090, -1134790452, 1043708121) + + W(6, -1100065758, -1122814128, -1129250144, 1058553182) + + W(7, 1055924851, 1053725018, 1036740791, -1123998093) + + W(8, -1120127409, -1094230404, -1083084807, -1075758811) + + W(9, -1074914963, -1075891465, -1081737398, -1084193900) + + W(10, 1036146011, 1054652553, 1061875701, 1067689129) + W(11, 1068744910, 1067320464, 1065190583, 1062426867); + WS(-1084457324, 1066101859); + sum1 = W(0, -1146837948, 1016102797, -1115430590, -1115904029) + + W(1, -1139281484, -1117556663, 1034492603, -1124011056) + + W(2, -1111022815, -1125864729, 1047559389, 1034715654) + + W(3, -1103064096, -1108958078, -1131712724, -1131623214) + + W(4, -1115296098, 1038645029, -1083544605, 1037951214) + + W(5, 1057869073, -1109939240, -1123954086, -1123535023) + + W(6, 1042035070, 1047347075, 1059438663, 1052960194) + W(7, -1083491782, 1046468604, -1121536740, 1043250206) + + W(8, 1030912362, -1106508822, -1104927285, -1167432352) + + W(9, 1045723406, 1012598283, 1019381994, -1110102674) + + W(10, -1121095658, -1128702979, 1022709564, -1129984885) + + W(11, -1123913107, -1123056725, 1026960983, -1128824061); + sum2 = + W(0, -1125705477, -1127756609, 993770127, 1034569455) + W(1, 1010458600, -1119844207, -1122090273, 1019369801) + + W(2, -1127395739, 1044805550, -1097909373, -1177736375) + + W(3, -1116962018, 1043096893, 1035619005, -1112228363) + W(4, -1105227463, 1015549291, 1049252886, 1058826852) + + W(5, -1119951878, -1094678765, -1119199398, -1109645851) + + W(6, 1036906007, -1109261657, -1102191244, 1061852121) + + W(7, -1086841826, -1128420796, 1021651597, 1038741216) + + W(8, 1026846896, 1037043129, -1097396928, -1116961215) + W(9, -1103314123, 1038664018, 1035622840, 1019677755) + + W(10, 989272222, -1106679057, 1042524140, 1013800282) + + W(11, 1033157194, -1128652243, -1124905499, -1126258736); + WS(1067036470, -1087655195); + sum1 = W(0, -1143851962, 1026890311, -1106604063, 1016195769) + + W(1, -1138731339, 1037080924, -1121217270, 1029907824) + + W(2, 1018554747, -1120379564, -1114993347, 1022258327) + W(3, 981655329, 1045778247, 1025121994, 1023696087) + + W(4, 1050955184, 1053786273, 1042552729, 1063572966) + W(5, 1058367344, 1055564522, 1047575674, 1048845230) + + W(6, -1110423387, -1098337218, -1090196611, -1083965137) + + W(7, -1084059678, -1090231591, -1096786628, -1095677575) + + W(8, -1106360251, 1040602294, -1134551499, 1045568787) + W(9, 1046272662, 1028646847, 1026932869, 1027665749) + + W(10, 1025799530, -1118031105, -1119796702, -1110210301) + + W(11, -1132188582, -1117810092, 1021012754, -1118338222); + sum2 = + W(0, -1113854255, 1028862084, -1104900936, -1104116954) + W(1, -1114719178, 1040474278, 1048817634, -1122519186) + + W(2, -1108417433, 1033605964, -1109151867, -1102487521) + + W(3, -1071728118, -1073652757, -1090221130, -1102125815) + + W(4, 1042382895, 1032534216, 1017793091, 1067799294) + W(5, 1077900204, 1051278318, 1048299521, -1105402373) + + W(6, 1025435556, 1033584957, 1033281558, -1099286824) + W(7, 1056033422, -1113833767, 1011833167, -1107682623) + + W(8, -1108154666, 1046901615, -1111336587, 1036137805) + W(9, 1024983956, 1034492621, 1033542750, -1127962013) + + W(10, 1042045079, -1105415159, 1039313065, 1005958605) + + W(11, 1020191839, -1114752489, 1024757388, 1032711916); + WS(-1087701164, 1071308133); + sum1 = W(0, 1040776942, -1112915908, 1032135583, -1109010607) + + W(1, -1125896234, 1033070381, 1001383873, -1127540900) + + W(2, -1100025248, 1039729431, -1111499300, 1047911115) + + W(3, -1096854047, 1047586960, -1100475875, 1025720505) + + W(4, 1040244657, -1108101926, -1107965963, -1095250332) + + W(5, -1097276733, -1104060437, -1129328465, -1115131352) + + W(6, 1047131214, -1104971284, 1036283892, 1057920197) + W(7, 1057601759, 1046835436, 1017446731, 1041767855) + + W(8, -1116520012, -1123736282, -1105297773, 1040789767) + + W(9, -1089523085, 1046328829, -1107686492, 1031878575) + + W(10, -1152028354, -1120800451, 1024489952, 1038925278) + + W(11, 1034463851, -1130324381, -1112186573, 1015088161); + sum2 = W(0, -1089646175, -1112379036, -1087427677, -1088789602) + + W(1, 1059010203, 1060985431, -1139584980, 1054225000) + W(2, 1060062242, 1018139178, 1066898400, 1066001716) + + W(3, -1079880526, -1081253059, -1095878540, -1095013927) + + W(4, 1050551269, -1096611550, -1116330565, 1056235229) + + W(5, -1118197619, -1102574794, 1039647840, -1099698701) + + W(6, 1017421696, 1040955729, 1035645225, 1040223965) + W(7, -1114176344, 1044677785, -1100382074, 1035015292) + + W(8, -1124178965, -1115297526, -1111832492, 1027731712) + + W(9, -1106279788, -1130074994, 1040262609, -1124507789) + + W(10, 1023971829, -1112174927, 1035838465, -1128027042) + + W(11, 1015547306, 1033729011, -1110899873, 1032866060); + WS(1063980716, -1121784884); + sum1 = + W(0, 1027357276, -1104528667, -1122859745, -1107033792) + + W(1, -1105809438, 1033196814, -1111338526, -1111105883) + + W(2, 1046480497, -1121849329, 1049050976, 1046903620) + W(3, -1128776604, 1050194992, -1112079704, 1037688238) + + W(4, -1094692773, -1090457523, -1090130146, -1084796508) + + W(5, -1089370535, -1105629197, -1093813713, -1094775914) + + W(6, 1050884987, 1048987838, 1057733925, 1061180023) + W(7, 1054317580, 1055134019, 1046804578, 1057027842) + + W(8, 1046796692, -1098583576, 1037378828, 1034725880) + W(9, -1096435840, 1049629536, -1097780651, 1038664949) + + W(10, 1025153935, -1107151594, 1016110982, 1023598816) + + W(11, -1114135692, 1040596522, -1113598601, -1127372967); + sum2 = + W(0, 1041589168, 1024315846, 1043663909, 1040621380) + W(1, 1040212968, 1033384296, 1014426993, 1022694293) + + W(2, -1098133521, -1106371173, -1106740015, -1107177437) + + W(3, -1111131552, 1040430896, 1032409853, 1003633577) + W(4, 1031854878, 1051327081, -1108849860, -1106409587) + + W(5, -1120392794, -1093765703, -1107120761, -1104283048) + + W(6, -1105720063, 1023684981, -1124767392, -1127108094) + + W(7, -1102248051, 1050935529, 1033359350, -1128561530) + + W(8, 1035016760, -1128261352, 1035542785, -1111599720) + W(9, 1051247500, -1102687331, 1037002974, 1026574958) + + W(10, -1121214780, 1011090873, 1029549000, 1034668152) + + W(11, -1136161665, 1018485311, -1126387868, 998242826); + WS(1047153326, -1105960410); + sum1 = W(0, 1032318440, -1133035902, 1023033002, -1111741083) + + W(1, 1009988015, -1126171361, -1183551252, -1118067977) + + W(2, -1105871782, 1024269605, -1110369667, 1047130673) + + W(3, 1043587009, -1113373146, 1035984354, -1111622952) + + W(4, -1111485966, -1098984649, 1050315790, -1080272088) + + W(5, -1086889743, -1098309317, -1105786176, -1106267538) + + W(6, 1043448020, 1044051929, 1059563250, 1053459949) + W(7, 1061038806, 1044456898, 1048086975, 1037611273) + + W(8, -1110710801, 1028564080, -1113831750, 1024144723) + + W(9, -1117616080, -1145766181, -1114741783, 1040212689) + + W(10, 1019497606, 1019882933, -1118335287, 1018957863) + + W(11, -1122250988, -1124691083, -1123242346, -1150984053); + sum2 = W(0, -1132142402, 1019405455, 1022592575, 1002713172) + W(1, 993592760, -1120241477, 1024283135, -1139068036) + + W(2, -1109262360, 1034679642, -1099677890, 1048612806) + + W(3, 1036415285, -1118742739, -1125545553, -1129249399) + + W(4, 1044069954, -1104355470, -1119884477, -1094376769) + + W(5, -1110824904, 1031998111, -1128336378, 1030577347) + + W(6, -1111364284, -1108806456, -1066728208, 1079847520) + + W(7, 1060715429, -1103911380, 1028262793, -1127589036) + + W(8, 1031679549, -1097044621, 1043056057, 1057366851) + W(9, -1104696735, 993276152, 1012785110, -1133646774) + + W(10, 1018817977, 1034241557, 988348592, -1114461524) + + W(11, -1107038514, 1036085605, -1128734189, -1182233281); + WS(1056964652, 1042968547); + sum1 = W(0, 1026864302, -1136392949, 1024389106, -1126999334) + + W(1, 1026043785, -1130628252, 1000688741, 1002882868) + W(2, 1044356666, 1026146499, 1030265493, 1038248593) + + W(3, -1126651679, -1146035092, 986691602, 1033146167) + W(4, -1111481597, 1051097712, 1040695131, 1052760426) + + W(5, 1056669112, 1038264227, 1027446877, 1040116499) + + W(6, -1091567350, -1098882624, -1090350559, -1081953599) + + W(7, -1095456258, -1102468122, -1109487565, -1110909592) + + W(8, 1041608192, 1029687022, 1042991030, 1043333208) + W(9, 1044232931, 1038520784, 1033386798, 1040618297) + + W(10, 1008927875, -1130908784, -1127664937, -1121268145) + + W(11, 952128323, -1146879000, -1137895230, 1023066122); + sum2 = + W(0, -1155037894, -1117766868, 1042293027, 1004126723) + W(1, -1123150924, 1015608713, -1135323377, 1030487760) + + W(2, -1109445776, -1132308185, -1101307898, 995397702) + W(3, 1014206993, 1046458351, -1120597884, 1026431488) + + W(4, -1106399184, 1041934367, -1137539889, 1035303811) + + W(5, -1091518060, -1124849601, 1043824666, 1061366644) + W(6, 1052866656, -1111172948, 1058738313, 1064268129) + + W(7, 1052685347, -1090299347, -1087905074, -1075431372) + W(8, 1046069094, 1042904039, 1045435531, 1051607279) + + W(9, -1098813712, -1150133894, 1037110006, -1089430426) + + W(10, 1012439553, -1108172404, -1110297962, -1110625272) + + W(11, -1107185126, 1045339946, -1122419536, 1049588119); + WS(-1096061015, 1045980634); + sum1 = + W(0, -1136709393, 1028828435, 997001355, 1022855123) + W(1, -1128346047, 1031977874, 984865373, 1040707047) + + W(2, 1047345176, 1016418418, 1049157941, 1032879612) + W(3, 1042754713, 1032419332, -1124110958, 1040469689) + + W(4, -1089944925, -1096285771, -1094897728, -1097979037) + + W(5, 1014307589, 1040846151, 1042092045, 1041011167) + W(6, -1113534082, 1049565603, -1113216951, -1094660427) + + W(7, 1031601097, -1095562472, -1109834744, -1093905225) + W(8, 1020871950, 1021274185, 1042276288, 1039512084) + + W(9, 1028680388, 1044068336, -1140756488, 1048548616) + W(10, 1032683291, 1018404508, 1027484139, -1119890439) + + W(11, 1030972704, -1125789619, 1031142826, -1123584299); + sum2 = + W(0, -1114682679, -1115477579, -1100789101, -1113658391) + W(1, -1110942733, 1044868728, 1028313432, 1046472362) + + W(2, 1055059251, 1024869090, 1055732865, -1122542034) + + W(3, -1120682294, -1107016239, -1152832742, -1087243594) + + W(4, 1064739409, 1031266096, 1030176534, 1067742275) + W(5, 1062911121, -1081471397, -1080677577, -1077241450) + + W(6, -1095220576, -1113806527, 1040530242, 1036337974) + W(7, -1087169731, 1042181045, 1042749891, 1067213860) + + W(8, -1100660553, -1105830101, -1096186716, -1103152959) + + W(9, 1035448471, 1052603278, 1033558186, 1052345796) + W(10, 1038444345, -1132048253, 1040636888, 1015520805) + + W(11, 1032588114, -1102136445, -1134141481, -1112398105); + WS(-1086603372, 1061480206); + sum1 = W(0, 1025472273, -1143591172, -1124123051, -1110008795) + + W(1, -1124248793, -1127491490, 1014214528, -1120184170) + + W(2, 1022341006, 1027469190, -1141108008, 1042054049) + W(3, 1051331968, 1044174205, 1044005681, -1155225358) + + W(4, 1006839158, -1128153798, 1051787090, -1090097115) + + W(5, -1081435553, -1089913687, -1092574472, -1096696337) + + W(6, -1102342404, -1124925900, -1093885235, 1058414043) + + W(7, 1063214861, 1057428893, 1052102264, 1048742922) + W(8, 1042514621, 1043263108, 1027880941, -1105821275) + + W(9, -1094479791, -1099759469, -1112069887, 1035771431) + + W(10, -1114893026, -1114252238, -1121794488, 1039892842) + + W(11, 1028544109, 1041669328, 977928239, 1039400116); + sum2 = + W(0, 1037224808, -1109009263, -1120793535, -1110258597) + + W(1, -1112240446, -1151274598, -1120536233, -1103902982) + + W(2, 1025638319, 1049599085, -1142324554, 1028269513) + W(3, -1132053081, -1119573384, 1010517574, 1008384356) + + W(4, -1093017633, 1039705537, 1040559103, 1053657173) + W(5, -1120149375, 1043501160, -1121251494, 1035850418) + + W(6, -1143762368, -1112746506, -1099136162, 1056581815) + + W(7, -1118127758, -1147801478, -1130373692, 1032229723) + + W(8, -1119609796, -1119534458, -1123476586, -1104556193) + + W(9, 1044376501, -1107739102, 1033895801, -1122521676) + W(10, 995865588, 1021427773, 988834049, -1122952792) + + W(11, -1114993482, 1029987722, -1106681926, -1116132116); + WS(1037058908, -1087106898); + sum1 = W(0, 1032385376, 1028077583, 1014613011, -1151370839) + W(1, -1139761263, 1027279360, 1022565566, 1031834108) + + W(2, 1026637522, -1129390954, 1048467894, 1048758199) + W(3, 1043852440, 1034990442, 1017011558, 1036138504) + + W(4, -1098495714, -1107088868, -1108180359, -1093334653) + + W(5, -1108393155, -1097414435, -1111470776, -1104527470) + + W(6, 1041048768, 1041268325, 1045140885, -1080472255) + W(7, 1045570315, 1045361342, 1028923180, 1036330497) + + W(8, 1039729665, -1126519617, 1040649531, -1114665834) + + W(9, -1125126080, 1035082182, 1023808326, 1027790590) + W(10, 1017191910, -1132138900, 1035348883, 997380151) + + W(11, 1031307292, 1030937245, -1138594135, 1036519916); + sum2 = W(0, -1111516802, 1036231024, -1130951686, 1031916934) + + W(1, -1130989326, -1129631002, -1123615369, -1119469958) + + W(2, -1131222514, -1098228691, 1034905648, -1090487171) + + W(3, 1032129266, 1035677128, -1103168970, 1049196148) + + W(4, -1097346809, -1128682274, -1113861539, 1052765954) + + W(5, -1108538807, -1122282521, 1038239484, -1116187122) + + W(6, 1049467820, 1020406578, 1024259929, 1061096371) + + W(7, -1104129123, -1108918961, -1114584358, -1129232626) + + W(8, -1118099733, -1102087439, 1049541587, -1108988196) + + W(9, 1033200380, 1042713844, -1097598443, 1018354634) + + W(10, -1111393075, 1039222222, -1113826501, 1025340241) + + W(11, 1029417921, -1111528334, 1034012496, 1029857705); + WS(1054906071, -1091145324); + sum1 = + W(0, 1029398237, -1140775857, -1128656451, 1004160018) + W(1, -1130732913, 1029686973, 1021855224, -1128798955) + + W(2, -1120406171, -1106052861, -1099422950, 1032725545) + + W(3, -1097841652, 1037934865, 1036573848, -1157619404) + W(4, 1051536197, 1046952684, 1057886666, -1085942396) + + W(5, -1098611557, 1042440654, 1035129734, 1032622058) + + W(6, -1115196942, -1109008729, -1097962977, -1130426984) + + W(7, 1048146402, 1034532491, -1122054089, 1027356128) + W(8, -1136290815, 1034481647, -1114344740, 1050651652) + + W(9, -1102043591, -1133864753, -1124817654, -1126847669) + + W(10, -1126429728, 1032555988, 1015919623, -1108426832) + + W(11, 1040987294, -1107032303, 1044439941, -1115113714); + sum2 = W(0, -1113802973, -1116219822, 1020553430, -1109755343) + + W(1, -1131329246, -1112950186, -1113313093, -1116367256) + + W(2, 1027581315, -1112877584, -1110295429, 1027296115) + + W(3, -1126007358, 1035099341, -1130784978, 1035863861) + + W(4, -1110955855, -1127685514, -1097495000, 1025841055) + + W(5, -1104102640, -1110724235, -1165405916, -1097352168) + + W(6, 1047020911, 1021259086, 1057623683, 1053623791) + W(7, 1057318729, 1040083835, 1048620928, 1039940909) + + W(8, -1105727831, -1118276653, -1110729082, -1104267868) + + W(9, -1106795812, -1119773745, -1128480210, -1110646461) + + W(10, 1022816774, -1129541322, 997980814, 1016281450) + + W(11, -1105649969, 1031563375, -1111917112, 1032754595); + WS(1063926444, -1083200389); + sum1 = + W(0, -1110900111, 1015785179, -1132926346, 1034778082) + W(1, 1029162938, 1024169214, 1031086749, -1116484151) + + W(2, 1049653262, -1116391059, 1048988121, -1111931241) + + W(3, 1002973694, -1107911937, -1104277444, -1114837807) + + W(4, -1089993663, -1106495964, -1104923071, 1061854120) + W(5, 1062129309, 1059656227, 1047872627, 1055218483) + + W(6, 1052688460, 1038385529, 1045396422, -1089207439) + + W(7, -1085048198, -1087799869, -1096506545, -1096830980) + + W(8, -1098055945, -1108169455, -1110654965, -1111176153) + + W(9, 1042255343, 1043917388, 1012240783, 1049045741) + W(10, 1042131972, -1121748392, 1039495970, -1117097761) + + W(11, -1120523578, -1106362715, 1011366638, -1098874335); + sum2 = W(0, 1031260311, 1008713252, -1110413739, -1108083749) + + W(1, 1024382525, -1107516795, 1032742989, -1107429215) + + W(2, -1079593190, -1080879443, -1099919153, 1067198745) + + W(3, 1061544601, 1037733964, 1034769578, 1037726418) + W(4, -1121246507, 1035854140, 1040572163, -1111993270) + + W(5, 1060638292, -1122943484, -1098923291, 1034609836) + + W(6, -1113337443, 1043424734, -1112705599, -1102589461) + + W(7, 1044789771, 1040341398, -1116338100, 1030676197) + W(8, 985022717, -1123981203, 1028350097, 1035118406) + + W(9, -1119559917, -1123835438, 1021760610, -1114867192) + + W(10, 1032096214, -1130846658, -1119780465, 1007072124) + + W(11, -1132931022, -1131952682, 1028149723, -1115680064); + WS(-1091090263, 1040227933); + sum1 = + W(0, -1123880467, -1114808049, 1014154590, 1032220316) + W(1, 1018131933, -1121223347, -1128795491, 1008528046) + + W(2, -1113261184, 1027485320, -1101480756, 1043855170) + W(3, -1088775234, 1021676847, 1031227206, 1026364723) + + W(4, 1033284496, 1019377225, -1102787036, -1094753319) + W(5, 1065098078, -1107869654, 1045897152, 1025551690) + + W(6, 1044923332, -1098653061, 1059927492, 1040011797) + + W(7, -1099661886, -1151140018, -1113799968, -1125551659) + + W(8, -1105999782, 1042536309, -1095990282, 1044858269) + + W(9, -1091964998, 1045062557, -1109510984, 1023695008) + + W(10, -1135767575, -1127683258, 1037484605, -1120454550) + + W(11, 1029352975, -1109078132, 1027724204, 1006311503); + sum2 = W(0, -1123304381, 1011470018, -1116901758, 1029761957) + + W(1, -1135722528, -1111769341, -1107033568, 1032808415) + + W(2, -1135928985, -1131363804, 1044779190, -1101932196) + + W(3, -1097334030, 994986369, 1042173475, 1025113569) + W(4, 1039889929, 1045400660, -1100997480, 1055172736) + + W(5, -1087140500, 1054550160, -1110305303, -1115908038) + + W(6, -1113522433, -1100907702, -1104972678, 1058841413) + + W(7, 1039800739, -1122473050, -1109069053, 1032761157) + + W(8, -1108136941, 1038781261, 1052809383, -1093286229) + + W(9, 1034962749, -1105965260, 1038676003, -1155418681) + + W(10, 1038356153, -1139124254, -1105005165, 1040780481) + + W(11, -1105451984, 1042887374, -1114167820, -1152192529); + WS(1063982124, 1031276218); + sum1 = W(0, 1041442545, -1103090149, 1042807746, 1024468200) + + W(1, -1106882536, 1049721332, -1101888878, 1042454319) + + W(2, 1031361481, 1026538936, -1101400314, 1034898060) + + W(3, -1103132501, -1112916420, -1139074135, -1110788513) + + W(4, 1056936890, 1055470587, 1060963845, 1061353486) + W(5, 1063510555, 1048946651, 1054541302, 1058321972) + + W(6, -1090353464, -1090262005, -1096383728, -1078114170) + + W(7, -1106902698, -1088793180, -1098771630, -1093460753) + + W(8, -1122143798, -1101092681, 1031723710, -1122232454) + + W(9, 1043143621, -1172995470, 1032268200, -1104729748) + + W(10, 1007942615, 1040474995, -1103896066, 1027975174) + + W(11, 1030475455, -1101011290, 1044176219, -1108198577); + sum2 = W(0, 1015674059, 1034996578, 1026624942, -1128049054) + W(1, 999367802, 1021382702, -1124407536, 1029480964) + + W(2, -1109357907, 1024785272, -1129998179, -1120348186) + + W(3, 1048014132, -1105300006, 1046166047, -1116382211) + + W(4, 1031332447, 1048659656, -1108514478, 1052415888) + + W(5, -1105319294, -1117149322, 1010482847, -1154249511) + + W(6, 1066992274, 1076858856, 1078632808, 1073772904) + W(7, -1105884909, 1038594495, 1038514249, -1098756758) + + W(8, -1074609058, -1070866381, -1068251573, -1076608801) + + W(9, -1103939197, -1109221944, -1098022157, -1125235504) + + W(10, 1048304191, 1030261153, -1098508369, -1108782845) + + W(11, 1048310856, 1031934850, 1046147873, 1038709270); + WS(-1084008748, -1076428689); + sum1 = W(0, 995293936, -1162911689, -1138016718, -1132274729) + + W(1, -1145295444, -1131268254, -1201649403, -1135278623) + + W(2, -1119372516, 1036299874, 1017340780, 1041960361) + W(3, 1044385332, 1034368866, 1043013720, -1103541652) + + W(4, -1088304948, -1097059736, -1085861109, -1081600491) + + W(5, -1083799507, -1090459925, -1104403080, -1103180426) + + W(6, 1059786207, 1051547992, 1060565598, 1064118968) + W(7, 1058261310, 1050466917, 1049921019, 1042671596) + + W(8, -1137964103, -1125552990, -1116363658, -1116908178) + + W(9, -1119006543, 1026422690, -1131911306, 1051353751) + + W(10, 1013109895, 1006687204, 1002349741, 1007519945) + + W(11, 994300076, -1119097260, -1123993357, 1023041036); + sum2 = + W(0, 1033856632, 1041148647, -1094518814, 1045521814) + W(1, -1128266986, 1033117136, -1173165821, 1041230368) + + W(2, -1090933982, -1094617784, -1122277735, 1062250596) + + W(3, 1027053741, 1050179515, 1033890948, -1086799133) + W(4, 1068958128, 1066199400, 1055138982, -1070105649) + + W(5, -1070096660, -1082392713, 1067349236, 1076979077) + + W(6, 1067844920, -1102124443, 1051248434, -1078683071) + + W(7, -1079091570, -1089309992, 1047411220, 1070525583) + + W(8, -1095515318, -1122244574, 1036900546, 1046136146) + W(9, 1021983978, 1045719314, 1050937215, -1091587052) + + W(10, -1124923033, 1042779533, -1103088355, -1114411292) + + W(11, -1114099181, 1023274434, -1124200313, 1042022635); + WS(-1081223670, 1021288719); + sum1 = W(0, 1011016529, -1123721507, 1017381041, 1017648243) + W(1, 1028006000, -1122128468, 1009660876, 1007983923) + + W(2, 1035837139, 1032041909, -1108640782, 1024313608) + + W(3, -1105590117, -1108791100, -1128783630, -1116825572) + + W(4, 1042651768, 1036928499, 1055254255, 1061777248) + W(5, 1061429156, 1052534382, 1049990152, 1053483289) + + W(6, -1098433890, -1100608474, -1094722148, -1083909329) + + W(7, -1087617676, -1091388554, -1104773376, -1093454083) + + W(8, -1129696110, 1024607124, -1131079071, 1047474926) + + W(9, 1036831026, 1033276873, -1150770463, 1005912461) + W(10, 995272815, 1027549342, -1116321147, 1017435439) + + W(11, -1122084432, -1139273509, 1024807730, -1125665142); + sum2 = W(0, 1057380038, 1057597982, 1069621581, 1060801069) + W(1, 1060050844, 1041938366, -1122435905, 1024344515) + + W(2, -1088994983, -1085734595, -1072283812, -1079782207) + + W(3, -1081640783, 1046270010, -1113922524, 1043446590) + W(4, 1016685185, 983594263, 1066773393, 1060848632) + + W(5, 1043641192, -1105013658, -1104981345, -1105295106) + + W(6, 998662038, 1031174835, -1099503122, -1097910780) + W(7, 1038323247, 1026094487, 1036576275, -1145544806) + + W(8, 1040844632, -1116219635, -1134907857, 1027931069) + + W(9, -1111695032, 1047921746, -1114519002, 1032973176) + + W(10, 1027712021, -1109851055, 1037507283, -1116080368) + + W(11, -1123552119, 1028446195, -1108250726, 1031771441); + WS(-1120405176, 1052288640); + sum1 = + W(0, -1136485047, -1120969533, 1032711321, 1027237267) + W(1, 1021305874, -1146847086, -1133175986, 1039673939) + + W(2, 1040656325, 1013423883, -1108004548, -1107763377) + W(3, 1022040031, 1040265357, 1031093856, -1100629595) + + W(4, 1051431647, 1042796768, 1062809491, 1060861813) + W(5, 1027813500, -1107918083, 1039657966, 1043412169) + + W(6, -1114886102, -1092939904, -1083705303, -1089040632) + + W(7, 1039332409, -1098943929, -1112315213, -1104541036) + + W(8, -1113721480, 1039390695, 1026161897, -1116341945) + + W(9, -1108229347, 1035322940, -1115465454, -1114748782) + + W(10, -1115542032, -1165530871, 1020434857, 1024821617) + + W(11, 1031183209, 1019272038, 1024346473, 1012723731); + sum2 = + W(0, 1032873736, -1106233681, 1036788040, 1009987037) + W(1, -1117147579, 1018109057, -1114508674, -1106556966) + + W(2, -1128467212, -1131275971, -1113770947, -1088748320) + + W(3, -1097209973, 1040210251, -1099376356, 1050939532) + + W(4, -1098460251, 1035809416, -1078975662, 1062703231) + W(5, 1059662245, -1110493560, 1052516052, 992650581) + + W(6, 1024553592, -1114616785, -1092555656, 1067981395) + W(7, 1058574054, -1103422592, 1038056552, 1026754378) + + W(8, 1047433570, 1026776904, -1132131619, -1104531393) + + W(9, -1106248497, -1125640736, -1107638185, -1107493388) + + W(10, -1128334191, -1107845863, 1043173677, -1111351589) + + W(11, 991598885, -1107997815, 1023829740, -1106870741); + WS(1050656983, 1072047790); + sum1 = W(0, -1128713579, 1026709637, 1023201012, 1030859291) + + W(1, 1041237492, -1152997210, -1155686725, 1040488948) + + W(2, 1048792739, 1034799517, 1014670385, -1116111658) + W(3, 1025355287, -1112906461, 1036463444, 1002270506) + + W(4, 1050333168, 1050171449, 1053203577, 1064066450) + W(5, 1060032700, 1050694506, 1053095469, 1046913707) + + W(6, -1097949975, -1104033571, -1085647978, -1080119690) + + W(7, -1088145917, -1088560507, -1105136840, -1093840327) + + W(8, -1101689274, 1036522731, -1115538280, 1043957990) + + W(9, 1037919995, -1120212113, 1035379762, -1108210918) + + W(10, -1127716817, 1037025856, -1116963676, -1112813084) + + W(11, 1036783049, -1113565993, 1035776666, -1122514141); + sum2 = + W(0, 1032121925, -1105031648, -1130820039, -1105961083) + W(1, 1040237041, -1091675607, 1052906990, -1119953618) + + W(2, 1067037293, 1072414374, 1072723545, 1076922042) + W(3, 1072846596, -1079373087, 1048404715, -1090018360) + + W(4, -1074821338, -1081225596, -1069168235, -1068908234) + + W(5, 1068735095, 1050158994, 1043049709, 1036354441) + W(6, -1094551116, 1050387420, 1050306407, -1080768789) + + W(7, -1110799161, 1048692149, 1039557097, -1114340558) + W(8, 1045030197, 1035683027, 1054464199, -1129129027) + + W(9, -1109242003, -1102086715, 1050068036, -1106557101) + + W(10, -1115959604, -1117669800, -1109697271, -1106200850) + + W(11, 1041008693, -1107790175, 1019897614, 1034398799); + WS(-1081468886, 1041730784); + sum1 = W(0, -1114247594, 999910687, -1112649805, 1022168820) + W(1, 1009392321, 1025791509, -1115410306, 1020540891) + + W(2, 1021500053, 1042624634, 1043096639, 1034747044) + W(3, -1103886814, -1101453262, 1026735815, 1034256626) + + W(4, 1028761377, 1005300019, -1100727404, 1035906940) + W(5, 1062898916, 1054732110, 1042621601, 1041116931) + + W(6, 1044129269, 1053438789, 1055682820, -1086991443) + + W(7, -1084075064, -1098009154, -1097832968, -1117544535) + + W(8, -1131183895, -1096850135, -1106832988, 1038040260) + + W(9, 1044548897, 1037861846, 1022910341, -1121491970) + + W(10, -1121682823, 1029411807, 1022343799, -1113521452) + + W(11, -1110992968, -1110478453, -1125653940, -1112646442); + sum2 = W(0, -1109856908, 995541592, -1107331629, 1043476326) + + W(1, -1104942022, 1039471517, -1114856041, 1022399907) + W(2, 1025315462, 1040254152, 1035675473, 1026228130) + + W(3, -1101803200, -1123010638, 1040268905, 1028920354) + + W(4, -1111613060, 997512408, -1115826672, 1067108106) + + W(5, 1053887552, -1104388416, -1120685867, -1103458923) + + W(6, -1108093549, -1085520225, -1103361463, 1059978555) + + W(7, -1094292172, -1120534147, -1108094032, 1040596394) + + W(8, 1041489120, -1094645099, -1102705141, -1121534122) + + W(9, 1039802977, 1017265579, 1040793483, -1107135380) + + W(10, -1114414815, 1040714423, -1125997775, 1032256197) + + W(11, -1130615251, -1129091643, -1108206349, 1027593934); + WS(1054796503, -1111794816); + + return clamp(mstd0 + 5.0 * vsum / wsum * mstd1, 0.0, 1.0); +} + +shared float inp[555]; + +#define CURRENT_PASS 2 + +#define GET_SAMPLE(x) dot(x.rgb, rgb2y) +#define imageStore(out_image, pos, val) imageStoreOverride(pos, val.x) +void imageStoreOverride(uint2 pos, float value) { + float2 UV = mul(rgb2uv, INPUT.SampleLevel(sam_INPUT_LINEAR, HOOKED_map(pos), 0).rgb); + OUTPUT[pos] = float4(mul(yuv2rgb, float3(value.x, UV)), 1.0); +} + +#define INPUT_tex(pos) GET_SAMPLE(vec4(texture(INPUT, pos))) +static const float2 INPUT_size = float2(GetInputSize()); +static const float2 INPUT_pt = float2(GetInputPt()); + +#define temp_tex(pos) (float(texture(temp, pos).x)) +static const float2 temp_size = float2(GetInputSize().x * 1, GetInputSize().y * 2); +static const float2 temp_pt = float2(1.0 / (temp_size.x), 1.0 / (temp_size.y)); + +#define HOOKED_tex(pos) temp_tex(pos) +#define HOOKED_size temp_size +#define HOOKED_pt temp_pt + +void Pass2(uint2 blockStart, uint3 threadId) { + ivec2 group_base = ivec2(gl_WorkGroupID) * ivec2(gl_WorkGroupSize); + int local_pos = int(gl_LocalInvocationID.x) * 15 + int(gl_LocalInvocationID.y); + for (int id = int(gl_LocalInvocationIndex); id < 555; id += int(gl_WorkGroupSize.x * gl_WorkGroupSize.y)) { + uint x = (uint)id / 15, y = (uint)id % 15; + inp[id] = + HOOKED_tex(HOOKED_pt * vec2(float(group_base.x + x - (2)) + 0.5, float(group_base.y + y - (3)) + 0.5)).x; + } + barrier(); + vec4 ret = vec4(0.0, 0.0, 0.0, 0.0); + vec4 ret0 = vec4(0.0, 0.0, 0.0, 0.0); + vec4 samples[12]; + samples[0][0] = inp[local_pos + 0]; + samples[0][1] = inp[local_pos + 1]; + samples[0][2] = inp[local_pos + 2]; + samples[0][3] = inp[local_pos + 3]; + samples[1][0] = inp[local_pos + 4]; + samples[1][1] = inp[local_pos + 5]; + samples[1][2] = inp[local_pos + 6]; + samples[1][3] = inp[local_pos + 7]; + samples[2][0] = inp[local_pos + 15]; + samples[2][1] = inp[local_pos + 16]; + samples[2][2] = inp[local_pos + 17]; + samples[2][3] = inp[local_pos + 18]; + samples[3][0] = inp[local_pos + 19]; + samples[3][1] = inp[local_pos + 20]; + samples[3][2] = inp[local_pos + 21]; + samples[3][3] = inp[local_pos + 22]; + samples[4][0] = inp[local_pos + 30]; + samples[4][1] = inp[local_pos + 31]; + samples[4][2] = inp[local_pos + 32]; + samples[4][3] = inp[local_pos + 33]; + samples[5][0] = inp[local_pos + 34]; + samples[5][1] = inp[local_pos + 35]; + samples[5][2] = inp[local_pos + 36]; + samples[5][3] = inp[local_pos + 37]; + samples[6][0] = inp[local_pos + 45]; + samples[6][1] = inp[local_pos + 46]; + samples[6][2] = inp[local_pos + 47]; + samples[6][3] = inp[local_pos + 48]; + samples[7][0] = inp[local_pos + 49]; + samples[7][1] = inp[local_pos + 50]; + samples[7][2] = inp[local_pos + 51]; + samples[7][3] = inp[local_pos + 52]; + samples[8][0] = inp[local_pos + 60]; + samples[8][1] = inp[local_pos + 61]; + samples[8][2] = inp[local_pos + 62]; + samples[8][3] = inp[local_pos + 63]; + samples[9][0] = inp[local_pos + 64]; + samples[9][1] = inp[local_pos + 65]; + samples[9][2] = inp[local_pos + 66]; + samples[9][3] = inp[local_pos + 67]; + samples[10][0] = inp[local_pos + 75]; + samples[10][1] = inp[local_pos + 76]; + samples[10][2] = inp[local_pos + 77]; + samples[10][3] = inp[local_pos + 78]; + samples[11][0] = inp[local_pos + 79]; + samples[11][1] = inp[local_pos + 80]; + samples[11][2] = inp[local_pos + 81]; + samples[11][3] = inp[local_pos + 82]; + ret[0] = nnedi3(samples); + ret0[0] = inp[local_pos + 33]; +#if CURRENT_PASS == LAST_PASS + uint2 destPos = blockStart + threadId.xy * 2; + uint2 outputSize = GetOutputSize(); + if (destPos.x >= outputSize.x || destPos.y >= outputSize.y) { + return; + } +#endif + imageStore(out_image, ivec2(gl_GlobalInvocationID) * ivec2(2, 1), ret0); + imageStore(out_image, ivec2(gl_GlobalInvocationID) * ivec2(2, 1) + ivec2(1, 0), ret); +} diff --git a/src/Effects/NNEDI3/NNEDI3_nns32_win8x4.hlsl b/src/Effects/NNEDI3/NNEDI3_nns32_win8x4.hlsl new file mode 100644 index 000000000..56b26f7a5 --- /dev/null +++ b/src/Effects/NNEDI3/NNEDI3_nns32_win8x4.hlsl @@ -0,0 +1,1193 @@ +// This file is generated by the scripts available at https://github.com/hauuau/magpie-prescalers +// Please don't edit this file directly. +// Generated by: nnedi3.py --nns 32 --win 8x4 --use-compute-shader --use-magpie +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +//!MAGPIE EFFECT +//!VERSION 4 +//!SORT_NAME NNEDI3_032_4 + +//!TEXTURE +Texture2D INPUT; + +//!SAMPLER +//!FILTER POINT +SamplerState sam_INPUT; + +//!TEXTURE +//!WIDTH INPUT_WIDTH * 1 * 2 +//!HEIGHT INPUT_HEIGHT * 2 * 1 +Texture2D OUTPUT; + +//!SAMPLER +//!FILTER LINEAR +SamplerState sam_INPUT_LINEAR; + +//!TEXTURE +//!FORMAT R16_FLOAT +//!WIDTH INPUT_WIDTH * 1 +//!HEIGHT INPUT_HEIGHT * 2 +Texture2D temp; + +//!SAMPLER +//!FILTER POINT +SamplerState sam_temp; + +//!COMMON +#include "prescalers.hlsli" + +#define LAST_PASS 2 + +//!PASS 1 +//!DESC NNEDI3 (double_y, nns32, win8x4) +//!IN INPUT +//!OUT temp +//!BLOCK_SIZE 32, 16 +//!NUM_THREADS 32, 8 +#pragma optionNV(inline none) +float nnedi3(vec4 samples[8]) { + float sum = 0.0, sumsq = 0.0; + [unroll] for (int i = 0; i < 8; i++) { + sum += dot(samples[i], vec4(1.0, 1.0, 1.0, 1.0)); + sumsq += dot(samples[i], samples[i]); + } + float mstd0 = sum / 32.0; + float mstd1 = sumsq / 32.0 - mstd0 * mstd0; + float mstd2 = mix(0.0, inversesqrt(mstd1), mstd1 >= 1.192092896e-7); + mstd1 *= mstd2; + float vsum = 0.0, wsum = 0.0, sum1, sum2; +#define T(x) intBitsToFloat(x) +#define W(i, w0, w1, w2, w3) dot(samples[i], vec4(T(w0), T(w1), T(w2), T(w3))) +#define WS(w0, w1) \ + sum1 = exp(sum1 * mstd2 + T(w0)); \ + sum2 = sum2 * mstd2 + T(w1); \ + wsum += sum1; \ + vsum += sum1 * (sum2 / (1.0 + abs(sum2))); + sum1 = W(0, 1036208225, -1091571194, 1048590727, 1032174663) + W(1, 1039469975, -1095740683, 1028885330, 1026075554) + + W(2, 1027560868, -1097328754, 1039928979, 1023201972) + W(3, 1039536921, 1025116802, 1017576356, 1042058704) + + W(4, -1144450173, 1043923973, -1098962113, 1033278580) + + W(5, 1035622988, 1049700439, -1090255529, 1046104373) + W(6, 1024461970, 1024545936, -1100301043, 1035224848) + + W(7, 1029776426, 1047463785, -1090407950, 1043393326); + sum2 = + W(0, -1098253927, 1055965966, 1006679350, -1096709168) + W(1, -1166389754, -1101782718, 983512221, -1105895383) + + W(2, -1106582410, 1045236553, -1097283179, 1040768379) + + W(3, 1034460863, -1132225959, -1090237017, 1030302550) + W(4, 1027738130, 1057568628, 1036184228, -1111760224) + + W(5, -1113669665, 1055278331, -1133967067, 1033275358) + + W(6, 1016925525, -1127810369, 1022264595, -1104949250) + + W(7, -1129223232, -1108092808, 1009711002, 1045297871); + WS(-1080723616, -1076327864); + sum1 = + W(0, 1017315691, -1106293281, 1041272315, -1113397025) + W(1, -1140602116, 1024505865, -1129176587, 1022464939) + + W(2, 1037257964, -1101486193, 1040932726, 1024865293) + W(3, -1107192473, 1027220277, -1098639185, 1043879330) + + W(4, 1022003974, 1032001763, 1032224091, -1118929755) + W(5, 1022805527, -1106692027, 1038889695, -1123579783) + + W(6, 1021604747, 1020788295, 1019749115, -1117432531) + W(7, 1014959990, -1109388172, 1036681163, 998707020); + sum2 = W(0, 1015755803, -1127131649, -1137718334, 1033341381) + + W(1, -1140061902, 1016927815, -1129880851, 1024947773) + + W(2, -1129835189, -1112279061, -1089663810, 1058036499) + + W(3, 1032555441, -1095938931, -1069364926, 1079454606) + + W(4, -1138877514, -1116204914, -1092530653, 1053318688) + + W(5, -1123339814, 1009679614, -1148409052, 1022404175) + + W(6, 1016646759, -1153656135, -1122312216, 1028043253) + + W(7, -1165772366, -1146249364, 1018619187, 1025789685); + WS(1058954560, 1004956589); + sum1 = + W(0, -1128607008, -1102342440, 1027139080, 1038455278) + W(1, 1038458494, -1105082889, -1147341058, -1156235011) + + W(2, 1047693245, -1085974686, 1057887999, -1103441674) + W(3, 1026348672, 1047296084, -1100046248, 1029167261) + + W(4, -1108459679, 1058722958, -1087115665, 1033885827) + + W(5, -1116524774, -1135229473, 1043502422, 1027001826) + W(6, 1024592800, 1019546620, 1020243248, -1124163292) + + W(7, -1117551096, -1122816147, 1043995308, 1023459588); + sum2 = + W(0, 1039897191, 1032715073, -1104821098, -1103487249) + W(1, -1116902056, 1035295215, -1120385367, -1118716257) + + W(2, -1115617116, 1051413477, 1060018690, -1091510775) + + W(3, -1116419565, -1089611288, -1132652148, 1048354743) + + W(4, -1121428266, 1039274043, 1008252604, 1040404198) + W(5, 1003022729, -1102315300, -1117381948, 1037629937) + + W(6, 1032782009, 1012620980, -1113601670, 1035102099) + + W(7, -1161229156, 1023483611, -1116040249, -1132320852); + WS(-1088253760, -1127575790); + sum1 = W(0, 1038728366, -1156102863, 1036225546, 1011512228) + W(1, 1033404580, 1042126700, -1111684630, 1043566527) + + W(2, 1036121471, -1099951467, 1050604224, 1032168346) + + W(3, 1045370723, -1083618166, -1088174091, 1050156122) + W(4, 994877095, 1040753147, -1098202972, 1037663513) + + W(5, 1036217881, -1099186053, 1039701042, 1034991255) + W(6, 1012008372, 1033329669, 1015138122, 1030253051) + + W(7, 1040247041, -1099351704, 1032444126, 1041638884); + sum2 = + W(0, 1030438042, -1147399085, -1093920639, -1109485523) + W(1, 1009286759, 1025260806, -1086940227, -1143426189) + + W(2, 1027607240, 1032031341, -1090745109, -1114490725) + W(3, 1019667875, 1065802217, 1049694895, -1135657207) + + W(4, -1113200383, 1046766533, -1117099650, 1032826151) + W(5, 1032828373, -1110418147, 1041550488, 1024844082) + + W(6, -1125602091, -1137630919, -1114583845, 993352218) + + W(7, 1008172775, -1119451994, 1034586333, -1137428855); + WS(-1079364256, 1057874888); + sum1 = W(0, 1038744583, 1023431711, -1097930673, 1027252187) + W(1, 1028964378, 1034807569, -1105253352, 1030066159) + + W(2, 1038770168, 1043817591, -1095573950, 1037737491) + + W(3, 1044691424, -1093522810, -1085514994, 1045101529) + + W(4, 1039465822, 1033837359, -1111615463, 1019830473) + W(5, 1031872786, 1026052487, 1038514603, 1014931844) + + W(6, 1031706975, 1024735357, 1029114647, 1030853165) + W(7, 1026510455, 1032349913, 1036441879, 1025856707); + sum2 = W(0, -1110129969, 1023276596, 1028080466, -1115008651) + + W(1, -1122608874, 1020476676, -1106237621, -1145788944) + + W(2, -1109784187, 1055608478, -1110801543, -1135649000) + + W(3, 1036903789, 1056514262, -1099727798, 1034305529) + W(4, 1016388156, -1122102418, 1033517697, 1019861916) + + W(5, -1134147112, 1032271709, -1114242709, -1104837577) + + W(6, 1025386706, -1109100200, -1110189468, 1027443202) + + W(7, -1114085729, 1030585586, -1128034084, -1105665752); + WS(-1091483264, -1079194671); + sum1 = W(0, -1131351604, -1116837930, -1139989065, 1024497830) + + W(1, -1113984995, 1032278999, 987288903, -1120582522) + + W(2, 1021186040, -1099425098, 1055014512, -1105371085) + + W(3, -1116327562, 1045060919, 1046630795, -1115581427) + + W(4, -1132080655, 1054575181, -1092379987, 1026057008) + + W(5, -1206829265, -1113261897, 1027226210, -1110689206) + + W(6, 1023600234, -1130307600, -1122295330, -1130576880) + + W(7, -1126861572, -1115285054, 1003385298, -1136751161); + sum2 = W(0, -1129629424, 1004745569, 1012138921, 1021845392) + W(1, 1028468886, -1114381934, 1032075412, 1000184001) + + W(2, -1120636360, 1032177433, -1114041388, 1017905952) + + W(3, -1136732761, 1051604488, -1122709320, -1141636449) + + W(4, 1036262769, -1115452378, -1105925279, -1138562729) + + W(5, 1022425868, 1026786204, -1102674451, 1006971361) + + W(6, 1019955588, -1123076816, 1002766561, -1146151969) + + W(7, -1123045172, -1139760465, -1135173233, -1127921184); + WS(1067689632, -1150117831); + sum1 = + W(0, -1109849008, 1047555836, 1035630764, -1099893915) + W(1, -1130553174, 1029999475, -1114674616, -1113991840) + + W(2, -1123520321, 1050420518, 1040630545, -1107722684) + + W(3, 1036413160, -1116179871, -1098283742, -1150636351) + W(4, 1029117869, 1035246488, 1031697439, 1041501593) + + W(5, -1127374955, -1104890550, -1116392999, 1019029347) + + W(6, -1140464318, 1020611803, -1125473743, 1031847583) + + W(7, 1027561031, -1113066609, -1114557056, 1006720846); + sum2 = W(0, 1032302578, 1032483043, 1055539881, -1089061083) + + W(1, -1114467512, 1037446674, 1053856893, -1095432519) + + W(2, 1035589071, -1114962225, 1060021172, -1087688027) + + W(3, -1140727686, -1107033941, 1044678306, -1119624965) + + W(4, 1028178655, 1017647091, -1086216329, 1060967891) + + W(5, -1123814512, -1102520792, -1096729370, 1056004093) + + W(6, -1131958732, 1028700703, -1098594526, 1046082925) + + W(7, -1114865396, -1106445462, -1103816765, 1049601918); + WS(1053174400, -1151490459); + sum1 = + W(0, -1122069115, 1032070534, -1106451229, 1016988943) + W(1, -1147738936, -1116405775, 1015337751, -1131178679) + + W(2, 1027718109, 1043517586, -1118269791, 1030116243) + W(3, 1032697654, -1108806494, -1117317899, 1014470144) + + W(4, 1025368761, 1041596435, 1044803791, -1112007328) + W(5, -1112696969, 1030488179, -1098708424, 1036691591) + + W(6, 1007532846, -1145227340, 1024445699, -1121635481) + + W(7, -1121758051, 1032005679, -1105947015, 1025294511); + sum2 = W(0, 1030975148, -1130068082, -1128045540, 1009416079) + + W(1, 1021517080, -1126516206, 1010660367, 1014043007) + + W(2, 1055956931, -1091517508, -1115164896, -1124472846) + + W(3, 1077778659, -1071480833, -1096786527, 1028586964) + + W(4, 1057214094, -1089646275, -1109767888, 1004868686) + + W(5, 1029844584, -1129174056, 1010452735, -1122799750) + + W(6, 1029913248, -1116251741, -1130073888, 1023899390) + + W(7, 1021753404, 998387790, -1161269496, -1126055830); + WS(1064255296, 1017910760); + sum1 = W(0, 1034554881, 1054734130, -1098111935, -1127407003) + + W(1, -1112041607, 1053450179, 1024002066, -1117294562) + + W(2, -1108750194, 1051103338, -1095577677, 1016696883) + + W(3, -1098306542, 1044871248, 1046694116, -1097130662) + + W(4, -1140839485, -1103441076, -1111281057, 983357671) + + W(5, -1117661336, 1027829882, 1048629833, -1104687573) + + W(6, -1142577806, -1122634224, 1032310597, -1118108640) + + W(7, -1131295699, 1024857124, 1048835924, -1098281839); + sum2 = W(0, -1120767464, 1053966016, 1035968374, -1147532546) + + W(1, 1032914397, 1073793292, 1040357442, -1129131123) + + W(2, -1109760249, 1060302091, -1122023462, -1130362887) + + W(3, 1040094052, -1072585870, -1086238928, -1116834009) + + W(4, 1016200567, -1094220304, -1172011891, 1036030945) + + W(5, 1009241688, -1113143087, 1043210576, 1015923256) + W(6, -1122384418, 1028063795, 1025380203, 1017132829) + + W(7, 1032959032, -1104349617, -1119727737, 1019714285); + WS(-1096343168, -1126236522); + sum1 = W(0, 1030703603, -1108689250, 1038321302, -1121378303) + + W(1, 1007810299, -1119306439, 1031818658, -1127608870) + + W(2, 1040041675, -1096469888, 1053153171, -1126859158) + + W(3, 1047119465, -1085509191, -1089344732, 1045457184) + + W(4, -1113575360, 1056154112, 1045446045, -1144694086) + W(5, -1132527909, 1020253526, 999324634, 1029954693) + + W(6, -1134236941, 1041829816, -1115315934, 1019451938) + + W(7, 1009418349, 1033231243, -1107897834, 1026209383); + sum2 = W(0, 983284602, 1020456556, -1131636264, 1015204808) + W(1, 1016178696, -1144975071, -1131007184, 1022946788) + + W(2, 1029794920, -1114118472, 997214653, 998054973) + W(3, 1029986296, 1041996066, 1053737341, 1023304596) + + W(4, -1109420788, -1139464095, -1097949071, 1029400914) + + W(5, -1131549160, -1114876306, -1113647896, 1024576522) + + W(6, -1118046352, 1015095008, -1115559594, -1124860928) + + W(7, -1117716768, 983229178, -1141234271, -1131778280); + WS(1054415488, 1031748714); + sum1 = W(0, 1032036500, 1016814449, -1098109636, 1018567785) + + W(1, -1106849745, 1048190511, -1110288412, -1119790601) + + W(2, 1032905605, 1025341687, -1090213441, 1041909072) + W(3, 998976710, 1051815981, 1042721902, 1029877301) + + W(4, 1035586875, -1102465150, -1117518441, 1033626399) + + W(5, 1024707071, -1113968464, 1046144796, -1106536335) + + W(6, -1137244643, -1127337837, -1117570737, 1018599181) + + W(7, 1040319748, -1115415046, -1135047459, -1122513053); + sum2 = + W(0, 990440998, -1103416430, -1120602807, 1034530622) + W(1, -1138393335, -1121991569, 1037302636, -1117267403) + + W(2, -1115155620, -1128966950, -1098451061, 1032576586) + + W(3, 1002996807, -1100463136, 1060125031, -1114490937) + + W(4, -1122715509, -1095499559, 1057202890, -1120765719) + + W(5, -1107496177, 1010012987, 1038403096, -1126507430) + W(6, -1109700727, 1000571127, 1011003397, 1027555951) + + W(7, -1100731818, 1048400711, 1041385707, -1105804206); + WS(1057399616, 1074070393); + sum1 = + W(0, -1116946950, 1049855515, -1097294408, 1045229301) + W(1, -1167692925, 1048650971, -1103643414, 1041758026) + + W(2, 1025124136, 1035712138, -1094845877, 1045455640) + W(3, 1027460150, -1096264273, -1106323062, 1036926493) + + W(4, 1033233658, -1093603523, 1045414146, 1036007790) + W(5, 1043057687, -1089515076, 1057610273, -1123310040) + + W(6, 1031827147, -1102565613, 1043872372, 1012034194) + W(7, 1036180887, -1089497938, 1048651645, 1034964477); + sum2 = W(0, -1099019906, -1135117191, 1053230727, -1102919364) + + W(1, 1016280180, -1104821294, -1108236474, 1021862852) + + W(2, -1104956478, 1031344902, 1044240449, -1102746088) + + W(3, -1160553787, 1057285857, 1060881655, -1121198562) + + W(4, -1115190705, -1108143797, -1141578351, -1107568696) + + W(5, 1040551613, -1096822242, -1110487530, 1027740054) + + W(6, -1110901592, -1121444630, 1033167055, -1115478973) + + W(7, 1043284947, -1108844527, -1097266933, 1039050835); + WS(-1079272096, -1088198283); + sum1 = W(0, -1150549691, -1112293630, 1038263474, -1117531256) + + W(1, -1136809437, -1147892734, -1131332343, 1024124492) + + W(2, 1035238887, -1101200910, 1042949876, 1022854919) + + W(3, -1114730926, -1153686203, -1109365886, 1038223988) + + W(4, 1013948517, 1033312670, -1123815596, -1137128325) + + W(5, 1024493634, -1111552818, 1033656538, -1131368443) + W(6, 1014747375, 993656219, 999554974, -1123012682) + + W(7, 1007675727, -1115285591, 1031561484, 983503863); + sum2 = + W(0, -1130912341, -1131869901, 1021624533, -1116201618) + W(1, 933663296, 973137042, 1031913949, -1114826138) + + W(2, 1024898014, 1022547165, 1049231168, -1097351564) + W(3, 1026863962, -1103034755, 1074345895, -1074065991) + + W(4, 1006981209, 1032168251, 1046910286, -1101411998) + W(5, 1015250909, -1122671508, 1033396431, -1116799454) + + W(6, -1128875465, 1002623282, 1015118461, -1122428830) + + W(7, -1163156681, -1124284861, 987851849, -1131138133); + WS(1066898592, -1135257599); + sum1 = W(0, -1110180874, 1039457202, -1099722419, 1033603984) + + W(1, -1104421608, 1036077428, -1109956850, 1025966004) + + W(2, -1108282395, 1042328969, -1108344348, 1027866348) + + W(3, -1109212258, 1047234565, 1050666829, -1127852161) + + W(4, -1112266449, -1102031401, 1052651555, -1117920074) + + W(5, -1104815307, -1101771699, 1056795268, -1103088922) + + W(6, -1117810340, -1107974833, 1044347095, -1114797145) + + W(7, -1107536862, -1105991798, 1052879183, -1109126692); + sum2 = W(0, -1109573955, 1053252716, -1111963093, -1104024699) + + W(1, -1130272686, -1099761318, 1023415227, -1113318439) + + W(2, -1112628352, 1053124236, 1036225124, -1113101390) + + W(3, -1135365682, 1015950468, -1098416341, 989675628) + W(4, -1127976571, 1055173972, 984548524, -1113626094) + + W(5, -1109041460, 1056516595, -1099834172, 1021900236) + + W(6, -1141484375, -1111992284, -1115296758, -1121224929) + + W(7, -1124075328, -1111067004, -1123095583, 1035158074); + WS(-1080514464, 1071098312); + sum1 = + W(0, 1029423638, -1104998922, 1034143047, -1121480226) + W(1, 1032590577, -1109637973, 1035675859, -1116754806) + + W(2, 1026820152, -1100165641, 1041959039, -1119258414) + W(3, 1032314563, 1052963835, 1044386890, -1124675269) + + W(4, -1121041060, 1049180397, -1094089003, -1141724766) + + W(5, -1118573868, 1051364482, -1091683740, 1026232616) + + W(6, -1120807462, 1040988017, -1104568584, -1142663074) + + W(7, -1138006521, 1046351030, -1100071438, -1128189972); + sum2 = W(0, -1103917515, 1047440331, 1045127249, -1101094893) + + W(1, 1015651007, -1161898742, -1107946310, 1034127906) + + W(2, -1110033797, 1037971494, 1032097498, -1105034150) + + W(3, -1102760582, 1064882055, 1062501861, -1105985747) + + W(4, -1111112749, -1094052244, -1097807648, 952358760) + + W(5, 1038662254, -1095531648, -1103513552, 1029080884) + + W(6, -1114159185, 1028288648, 1000704926, -1115269879) + + W(7, 1037944898, -1103088589, -1103412727, 1036625418); + WS(1048356096, 1025975827); + sum1 = W(0, -1127785256, 1042988217, -1143337570, -1113788528) + + W(1, -1122099232, 1042373466, -1109964850, 985728647) + W(2, -1101696686, 1057753530, -1091154007, 981326605) + + W(3, 1026577988, 1024353684, 1027827940, 1025248769) + W(4, 1038799529, -1089144738, 1052285203, 1031883373) + + W(5, 1035389109, -1100403603, -1125657656, 1042938314) + + W(6, 1026796836, -1117105634, -1109515886, 1041478413) + + W(7, 1026531900, -1118224663, -1110632314, 1024598728); + sum2 = W(0, 1012220951, -1127410563, -1133847817, -1150652997) + + W(1, -1116521159, -1105350472, 1023881724, -1121646209) + + W(2, -1112142878, 1052174871, 1044599155, -1123898264) + + W(3, 1029633040, -1097063130, -1106094805, 1019540966) + + W(4, -1134401830, -1157154125, 1059986787, -1101447493) + + W(5, -1123437332, 1029744370, -1111846084, -1113752268) + + W(6, -1127274631, -1133421881, 1028497368, -1115689394) + + W(7, -1127142758, 1031896001, -1111750394, -1144497399); + WS(1047538944, -1094881626); + sum1 = + W(0, -1131292909, 1026526343, -1137367995, -1137761291) + W(1, -1116924690, 1015768341, 1040643394, -1105713526) + + W(2, -1112297452, 1061821276, -1088680894, 1031500559) + + W(3, 1021777101, 1006944475, -1090839121, -1122499811) + + W(4, 1043477817, -1091685625, 1059324523, -1107169411) + + W(5, -1116873677, 1042550748, -1162815447, -1119456201) + + W(6, -1148100662, -1112344306, 1036475455, 998501030) + W(7, -1142312694, 1025260793, 1009991259, 1032218389); + sum2 = W(0, 1018368946, -1112001321, -1120361628, -1136144308) + + W(1, 1027383442, -1114299623, -1113414147, 995591994) + + W(2, 1026347909, -1159080892, -1114902877, -1130300135) + + W(3, -1120907217, 1048017951, 1047229175, -1113455406) + + W(4, -1113638165, 1043117803, 1034197636, -1104824263) + + W(5, 1015876554, -1117678872, -1153448320, -1135559770) + + W(6, -1121952605, 1016312397, 1030999359, -1116260909) + + W(7, -1157376536, -1122492527, -1146986041, 1024817261); + WS(1059019584, -1093542352); + sum1 = + W(0, -1118590060, 1030085820, 1044414089, -1139295455) + W(1, 1036739212, -1117660736, 1037660574, 1017695255) + + W(2, -1117950862, 1053611807, 1035930184, -1132182919) + + W(3, 1044992135, -1088498407, -1087395836, 1041445842) + + W(4, 1031932973, -1106481599, 1044296603, -1162575911) + + W(5, -1157350427, 1041316489, -1101366685, 1028651518) + W(6, 1018600951, 1033416637, -1113146202, 1029799946) + + W(7, -1135788111, 1042914684, -1105147443, 1024137952); + sum2 = W(0, -1139124704, -1098733365, -1134878408, 1017748092) + + W(1, -1129149604, -1096002059, -1139933424, -1120672660) + + W(2, -1112674264, -1099326395, 1006823136, 1007868832) + W(3, 1041796064, 1042574015, 1054885382, 1038924927) + + W(4, 1023328190, 993486752, 1040771663, -1118903044) + W(5, 983636161, 1013026008, 1012616072, -1117420588) + + W(6, -1131439188, -1121650464, -1119789204, 1032346590) + + W(7, 968306692, 1025526661, 1007743024, 1016029412); + WS(1034201600, 1032755867); + sum1 = W(0, -1153568391, -1096012775, 1054286804, -1151613767) + + W(1, 1027758260, -1105013167, 1040809774, -1113241540) + + W(2, -1120836106, -1096428191, 1052819554, -1109787424) + + W(3, -1106713574, 1052356477, 1045456334, -1103823871) + + W(4, -1110497539, 1040996254, -1104715738, -1140335480) + + W(5, -1113115007, 1046162344, -1106901340, -1136669162) + + W(6, -1129181937, 1026611286, -1119554608, -1129950605) + + W(7, -1106649828, 1046578147, -1111616164, 1018423993); + sum2 = + W(0, -1116195452, 1046553581, 1060291180, -1133268119) + W(1, -1114916062, 1044137813, 1067697792, 1023665145) + + W(2, 1015539387, 1039450853, 1056432615, 1037512606) + W(3, 1031939547, -1081686100, -1075409426, 1033868463) + + W(4, 1004500534, -1106570618, -1100622921, 1015733077) + W(5, 1002967134, 1023858175, 1018449047, -1120650920) + + W(6, -1116253852, 1032662783, 1002080710, 1016550645) + W(7, 1037899637, 1018521363, -1106597825, 1008358731); + WS(-1092032128, -1114982082); + sum1 = W(0, 1022785838, -1092594901, 1053421570, -1131318086) + + W(1, 1030256707, -1096516325, 1038780564, -1117764855) + + W(2, 1019093490, -1091986421, 1047196191, -1114799192) + + W(3, -1129380878, 1046024022, 1055287349, -1136363407) + + W(4, -1136259347, -1122621159, -1127922606, -1144800614) + + W(5, -1112386231, 1047446468, -1103792760, 1031400745) + + W(6, -1119087591, 983613607, -1127804734, -1141783466) + + W(7, -1105547264, 1044817638, -1107803612, 1035179430); + sum2 = W(0, 1041280609, -1101864626, -1094055741, 1033694830) + + W(1, -1122718101, -1105911709, -1103824921, -1107222411) + + W(2, 1032208518, -1098031958, -1096453130, -1124818562) + + W(3, -1105883428, 1058683727, 1064792422, -1108861898) + + W(4, 1032385022, -1120084233, 1036982526, -1126293810) + + W(5, -1105712369, 1049511237, 1028614917, -1108778587) + + W(6, 1026423073, -1101782173, 1024411853, 1022233154) + + W(7, -1100029914, 1048360263, 1045846387, -1104838815); + WS(-1109129728, 1010433912); + sum1 = W(0, -1117250164, -1096823624, 1040646763, 1019407999) + + W(1, 1006908285, -1105899410, 1019351431, -1137630799) + + W(2, -1122855062, -1092542200, 1052048931, -1109418342) + + W(3, -1107144297, 1057728383, 1064635860, -1105008732) + + W(4, -1106683568, 1037050434, -1117087348, -1114857797) + + W(5, -1123315850, 1026000812, -1107858814, 1029923270) + + W(6, -1130212999, -1117617698, -1107016783, -1137382471) + + W(7, -1125685047, -1122267030, -1100117973, 1034575732); + sum2 = W(0, -1153548328, -1138461074, -1109953492, 970383811) + + W(1, -1146428548, 1040260969, -1109276610, 1016706951) + + W(2, -1122720334, 1050908092, -1119113122, -1113772244) + + W(3, -1131960189, 1057542522, -1109440842, -1149783528) + + W(4, -1105417557, 1046314824, 1008998438, -1111645386) + + W(5, -1140382642, -1105004761, -1140136790, -1114961145) + + W(6, -1130524097, 1024281381, -1119699464, -1128062487) + + W(7, 1025793768, -1110366356, -1135544654, -1113390177); + WS(1028043776, 1066748487); + sum1 = + W(0, 1020869188, 1042153037, -1114798157, -1111756535) + W(1, 1029235758, -1142684082, -1109061593, 1025123714) + + W(2, -1130366216, 1055996350, -1084468040, 1039957533) + W(3, 1035504777, 1053860476, 1054127718, 1020063133) + + W(4, 1043701316, -1085695847, 1050138268, 1020852591) + W(5, 1028701624, -1103910983, -1111428405, 1027291444) + + W(6, -1140377801, -1112356264, -1142788434, 1023500800) + + W(7, -1122144394, -1125763849, -1122964802, -1137256281); + sum2 = + W(0, -1124029698, -1129530165, -1125964837, 1021970837) + W(1, 924100096, -1119644642, 1007880106, -1133743274) + + W(2, -1114278109, -1119677450, 1030663674, -1118803866) + + W(3, -1110737625, 1050522694, 1051750384, -1114387111) + W(4, -1113250169, 1031715210, -1120664914, 999385235) + + W(5, -1121059730, -1121636434, -1117515026, 1025411170) + + W(6, 998717971, -1145009875, -1122454562, 1019195093) + + W(7, -1125884533, -1119348450, 1010693450, -1127692741); + WS(1060837696, -1133947077); + sum1 = + W(0, -1111653883, 1043511426, 1035524535, -1102491073) + W(1, 1028161858, -1107876293, 1015032078, -1120891991) + + W(2, 1026751705, 1032976162, 1051427819, -1107214884) + + W(3, 1035200691, -1100826286, -1104551490, -1125941943) + W(4, 1000443428, 1046154066, 1014718172, 1038586510) + + W(5, -1124636570, -1109841015, -1105048272, 1029969865) + + W(6, -1153569903, 1028652293, -1150803951, 1023653077) + + W(7, 1010162044, -1123706233, -1122173975, 990755503); + sum2 = + W(0, -1109148006, -1124907300, -1092637531, 1058387135) + W(1, 1027230711, -1130116966, -1092832201, 1052271642) + + W(2, -1141349815, -1099589874, -1085994041, 1062146597) + + W(3, -1115012616, 1033368851, 1040685020, 1019043320) + W(4, 1025861327, -1097709653, 1063174823, -1085821967) + + W(5, -1129789352, 1048790586, 1056989663, -1089224415) + + W(6, 1018453676, -1111271581, 1049450817, -1100831168) + + W(7, 1031045509, 1042673858, 1044673285, -1096709646); + WS(1052991104, 1024635730); + sum1 = + W(0, 1035832004, 1054985227, -1101014640, -1119430356) + W(1, -1113667962, 1053766219, 1027437528, -1121298600) + + W(2, -1115665493, 1046292645, -1097461637, 1029858016) + + W(3, -1099876558, -1128304655, -1148766910, -1098528437) + + W(4, -1124670698, -1115760280, -1103841730, 1026860541) + + W(5, -1123144798, 1032906080, 1048476772, -1107490221) + + W(6, -1141396670, 1011324759, 1034147624, -1114702739) + W(7, 991927035, 1032830229, 1048946541, -1098098175); + sum2 = W(0, 1023525971, -1101540780, -1109590196, -1124206084) + + W(1, -1123155104, -1081244300, -1107189914, 989815561) + W(2, 1037524511, -1094597742, 1026840221, 979200786) + + W(3, -1119336486, 1068940029, 1038949441, 1039597181) + + W(4, -1120201684, 1051860638, 1014639773, -1126284432) + + W(5, -1140931614, 998725346, -1110977051, -1128575576) + + W(6, 1025256785, 1002156586, -1117345859, -1123250336) + + W(7, -1116496860, 1038812729, 1033886084, -1117282785); + WS(-1106197760, -1107941957); + sum1 = + W(0, -1126741205, 958134964, 1042417753, -1131232109) + W(1, 992223587, -1096404880, -1114006205, -1156891819) + + W(2, -1103296147, 1050569383, 1053212362, -1104768673) + + W(3, -1096167611, -1089676235, -1101748223, -1105076618) + + W(4, -1103227950, 1032016157, 1057274419, -1101041056) + W(5, 1041994672, 1020956357, 1042030605, -1124618361) + + W(6, -1124973941, -1180953690, 1049652990, -1114495652) + + W(7, 1027666259, 1043412107, 1052224033, -1117167007); + sum2 = + W(0, -1114619118, 1033666378, 1015708744, 1027002418) + W(1, -1149001791, 1045400432, -1103940412, -1125963088) + + W(2, -1110825372, 924614016, -1107881456, -1103385448) + + W(3, -1090736686, 1063026008, 1059931802, -1091159350) + + W(4, -1106216772, -1114127208, -1107266078, -1139192735) + + W(5, 1027272732, -1108719036, 1024735270, -1125128312) + W(6, 1033544093, 1032301903, -1134995311, 1019689496) + + W(7, -1120615480, -1114760302, 1034226031, 1032462491); + WS(-1076602784, -1079939509); + sum1 = W(0, 1033209209, -1103738752, 1025390185, 1002177000) + + W(1, -1124683769, -1119780485, 1041533536, -1112424745) + + W(2, 1015980198, -1096323000, 1052087227, -1104846498) + + W(3, -1141354248, 1042233324, 1039917313, -1113895617) + + W(4, -1106007132, 1054450248, -1105614956, -1119444855) + + W(5, -1114123684, 1052850909, -1098158311, -1112376802) + + W(6, -1121157953, 1043529432, -1107965437, 1021969694) + + W(7, 1019464370, 1045060053, -1103437636, -1109951699); + sum2 = + W(0, 1032197744, -1106233686, -1119285117, 1036373860) + W(1, -1119329897, -1117977933, 1035649904, -1113988579) + + W(2, 1026978731, -1119744119, 1046616172, -1150690390) + + W(3, 1042368013, -1074309068, -1080074847, -1148379867) + W(4, 1034747948, 1068607081, 1045039448, 1031972703) + + W(5, -1109569271, 1064708176, 1043980108, -1113275705) + W(6, 1037031349, -1119111329, 1029320825, 1015848847) + + W(7, -1111213511, 1041980892, 1028259198, 1008019670); + WS(-1093673600, -1131421273); + sum1 = + W(0, -1121371719, -1114120908, 1035660544, 1009001293) + W(1, -1126420325, -1110871822, 1021798446, 1008740253) + + W(2, 1033366837, -1087025669, 1058317703, -1120291359) + W(3, 1021303790, -1118558279, 1042294182, 1022689127) + + W(4, -1117842165, 1056872571, -1088792724, 1031810222) + + W(5, 1011797877, 1032969664, -1114500968, -1148303562) + + W(6, 1021502382, 1037611499, -1111697864, -1137856917) + + W(7, -1131840478, 1040800018, 1017988942, -1121301883); + sum2 = W(0, -1145039688, -1114206314, -1116540509, 1020565626) + + W(1, -1129835426, -1119983153, -1113040628, 1000979816) + + W(2, -1119915157, -1121785409, -1118504757, 989230112) + + W(3, -1110668832, 1051729955, 1051989643, -1112437186) + + W(4, -1111519800, 1012089860, 1039755978, -1112214518) + + W(5, 1002833896, -1118223897, 1025479957, 1015165050) + + W(6, -1127947266, -1130809610, -1158783904, -1128941978) + + W(7, 1006052904, -1123764449, -1127132522, 1025956493); + WS(1065682080, -1111828541); + sum1 = + W(0, 1015869752, -1145885026, 1022264616, -1126764880) + W(1, 1017604463, -1115077208, 1021224792, 1032942526) + + W(2, -1112250175, 1052074397, -1089954536, 1040282413) + W(3, 1024786188, -1121697500, 1047440331, 1035803452) + + W(4, 1036568133, -1086889687, 1049268572, -1125683619) + W(5, 1002255762, 1045248549, -1109225970, 1031850711) + + W(6, -1131800664, -1130857684, -1123514660, -1141787602) + + W(7, 982208647, 1037568127, -1113425822, 1017131424); + sum2 = W(0, -1122978131, 1016858600, 1028741871, 993636865) + W(1, 1016040732, 968811648, 1021399769, -1144040913) + + W(2, -1114060649, 1029169324, 1032336595, -1118019503) + + W(3, -1125004872, 1051074882, 1031746308, -1109484363) + + W(4, 1029971540, 1006053609, -1103346234, -1124468225) + + W(5, 1026938249, -1154135582, -1113140779, 1013417282) + + W(6, 1017189437, -1115290499, -1141169189, -1169769501) + + W(7, -1124460348, -1140773838, -1122277912, -1139883250); + WS(1068575136, 1057679145); + sum1 = + W(0, -1106541599, 1049880682, -1093397815, 1052783569) + W(1, 1008215334, 1049251178, -1111487207, 1042509671) + + W(2, 989927934, 1026486412, -1092992340, 1051194971) + W(3, 1042310507, -1095539136, -1103138323, 1040579493) + + W(4, 1018512183, -1094672658, 1043830943, 1038856114) + W(5, 1040070410, -1089191083, 1057944056, -1114567880) + + W(6, 1014261304, -1100618939, 1044894993, 1025292508) + W(7, 1041475113, -1087252724, 1049811244, 1038361721); + sum2 = + W(0, -1114445084, 1053593458, 1057823779, -1150175899) + W(1, -1136765855, 1055007475, 1054334485, -1141017037) + + W(2, 1039574032, -1105638736, -1096181786, 1042094581) + + W(3, -1113238946, -1078800745, -1078443122, -1134493359) + + W(4, 1030357662, -1104375874, 1049857835, 1020483059) + W(5, -1106803932, 1059224194, 1058193036, -1099695416) + + W(6, 964162478, 1050059734, 1043677394, -1118569338) + W(7, -1113028634, 1035501186, 1029634285, -1110238952); + WS(-1069843280, 1043992756); + sum1 = + W(0, -1124948267, 1027695014, -1108770183, 1008956039) + W(1, -1135429253, -1119099178, 1017935435, -1129507307) + + W(2, 1025550072, 1044103833, -1112757821, 1030807982) + W(3, 1025838726, -1113789227, -1130965835, 1014849865) + + W(4, 1019242118, 1039477491, 1042243413, -1114625158) + W(5, -1116233196, 1024839950, -1101790135, 1035190516) + + W(6, 998797102, -1142719774, 1012540023, -1127852007) + + W(7, -1130610171, 1028120504, -1106167085, 1023573770); + sum2 = + W(0, -1114838118, 1026300352, 1004928481, -1130791968) + W(1, -1121247640, 1028491168, -1130258048, -1127851536) + + W(2, -1095359738, 1053083344, 1024432884, 1025789396) + W(3, -1072953064, 1074653957, -1102013621, 1030571860) + + W(4, -1093135708, 1056568596, 1030571276, 984097412) + W(5, -1115141896, 1033233928, -1116002270, 1025870428) + + W(6, -1116140314, 1030713448, 1015669456, -1120604784) + + W(7, -1127503160, 1023653964, -1129660856, 1016702232); + WS(1066802848, -1129257078); + sum1 = W(0, 1015630667, 1033473243, -1104672775, -1114728473) + + W(1, -1118978065, -1155453851, -1122431286, -1121467910) + + W(2, -1113784260, 1035395194, -1115117829, -1105320751) + + W(3, -1101616805, 1065736411, 1061324843, -1095556296) + + W(4, -1108037466, 1045542397, -1100789945, -1104703871) + + W(5, -1114908350, 1040181775, -1114134583, -1109993148) + + W(6, -1114956027, -1177594330, -1124148059, -1111474306) + + W(7, -1111947911, 1036229652, -1138173719, -1106051686); + sum2 = W(0, -1109560646, -1155123513, 1035199782, -1115008786) + + W(1, -1134031950, -1108713026, -1107664082, 1019412439) + + W(2, -1107125821, 1038996664, 1043157052, -1123597732) + W(3, 1017238679, 1026897780, 1051508948, 1016515095) + + W(4, 1024343484, -1107646918, 1055083262, -1106563795) + + W(5, -1127256871, -1107869542, 998755997, -1116358964) + + W(6, 1004378333, -1112902766, -1159444594, -1117600772) + + W(7, -1129735047, -1145442397, 1012570830, -1110777694); + WS(-1093453440, 1062530498); + sum1 = W(0, -1124930739, -1115495349, 1025637074, 1023868966) + + W(1, 1018166794, -1109318263, 1039727605, 1023563962) + W(2, -1109529502, 1024699176, 931786146, -1131885027) + + W(3, -1114300581, 1040214918, 1052285453, -1104984446) + + W(4, 1025096231, -1105577322, 1009762919, -1110072888) + + W(5, 1023247327, 1043329716, -1105534248, -1137647791) + W(6, 998443854, -1123543752, 988548151, -1123805240) + + W(7, -1125424515, 1034740398, -1116356474, 1018092315); + sum2 = + W(0, -1116378324, 1018118074, 1027066059, -1110082211) + W(1, -1110334365, -1135013993, 1002595554, -1111471528) + + W(2, -1139723269, -1117515615, 1053899571, -1114430561) + + W(3, -1134041225, -1097345050, 1043336959, 1040454031) + W(4, -1147091114, 1039717826, 1040668505, 1033656482) + + W(5, -1112237914, -1107830137, 1010598309, -1117546906) + + W(6, -1123080609, 1032288465, 1016807738, -1115822981) + + W(7, -1131603942, 978891919, 1026333875, -1119917138); + WS(1067735712, -1080534052); + + return clamp(mstd0 + 5.0 * vsum / wsum * mstd1, 0.0, 1.0); +} + +shared float inp[429]; + +#define CURRENT_PASS 1 + +#define GET_SAMPLE(x) dot(x.rgb, rgb2y) +#define imageStore(out_image, pos, val) imageStoreOverride(pos, val.x) +void imageStoreOverride(uint2 pos, float value) { temp[pos] = (value); } + +#define INPUT_tex(pos) GET_SAMPLE(vec4(texture(INPUT, pos))) +static const float2 INPUT_size = float2(GetInputSize()); +static const float2 INPUT_pt = float2(GetInputPt()); + +#define HOOKED_tex(pos) INPUT_tex(pos) +#define HOOKED_size INPUT_size +#define HOOKED_pt INPUT_pt + +void Pass1(uint2 blockStart, uint3 threadId) { + ivec2 group_base = ivec2(gl_WorkGroupID) * ivec2(gl_WorkGroupSize); + int local_pos = int(gl_LocalInvocationID.x) * 11 + int(gl_LocalInvocationID.y); + for (int id = int(gl_LocalInvocationIndex); id < 429; id += int(gl_WorkGroupSize.x * gl_WorkGroupSize.y)) { + uint x = (uint)id / 11, y = (uint)id % 11; + inp[id] = + HOOKED_tex(HOOKED_pt * vec2(float(group_base.x + x - (3)) + 0.5, float(group_base.y + y - (1)) + 0.5)).x; + } + barrier(); + vec4 ret = vec4(0.0, 0.0, 0.0, 0.0); + vec4 ret0 = vec4(0.0, 0.0, 0.0, 0.0); + vec4 samples[8]; + samples[0][0] = inp[local_pos + 0]; + samples[0][1] = inp[local_pos + 1]; + samples[0][2] = inp[local_pos + 2]; + samples[0][3] = inp[local_pos + 3]; + samples[1][0] = inp[local_pos + 11]; + samples[1][1] = inp[local_pos + 12]; + samples[1][2] = inp[local_pos + 13]; + samples[1][3] = inp[local_pos + 14]; + samples[2][0] = inp[local_pos + 22]; + samples[2][1] = inp[local_pos + 23]; + samples[2][2] = inp[local_pos + 24]; + samples[2][3] = inp[local_pos + 25]; + samples[3][0] = inp[local_pos + 33]; + samples[3][1] = inp[local_pos + 34]; + samples[3][2] = inp[local_pos + 35]; + samples[3][3] = inp[local_pos + 36]; + samples[4][0] = inp[local_pos + 44]; + samples[4][1] = inp[local_pos + 45]; + samples[4][2] = inp[local_pos + 46]; + samples[4][3] = inp[local_pos + 47]; + samples[5][0] = inp[local_pos + 55]; + samples[5][1] = inp[local_pos + 56]; + samples[5][2] = inp[local_pos + 57]; + samples[5][3] = inp[local_pos + 58]; + samples[6][0] = inp[local_pos + 66]; + samples[6][1] = inp[local_pos + 67]; + samples[6][2] = inp[local_pos + 68]; + samples[6][3] = inp[local_pos + 69]; + samples[7][0] = inp[local_pos + 77]; + samples[7][1] = inp[local_pos + 78]; + samples[7][2] = inp[local_pos + 79]; + samples[7][3] = inp[local_pos + 80]; + ret[0] = nnedi3(samples); + ret0[0] = inp[local_pos + 34]; +#if CURRENT_PASS == LAST_PASS + uint2 destPos = blockStart + threadId.xy * 2; + uint2 outputSize = GetOutputSize(); + if (destPos.x >= outputSize.x || destPos.y >= outputSize.y) { + return; + } +#endif + imageStore(out_image, ivec2(gl_GlobalInvocationID) * ivec2(1, 2), ret0); + imageStore(out_image, ivec2(gl_GlobalInvocationID) * ivec2(1, 2) + ivec2(0, 1), ret); +} +//!PASS 2 +//!DESC NNEDI3 (double_x, nns32, win8x4) +//!IN INPUT, temp +//!OUT OUTPUT +//!BLOCK_SIZE 64, 8 +//!NUM_THREADS 32, 8 +#pragma optionNV(inline none) +float nnedi3(vec4 samples[8]) { + float sum = 0.0, sumsq = 0.0; + [unroll] for (int i = 0; i < 8; i++) { + sum += dot(samples[i], vec4(1.0, 1.0, 1.0, 1.0)); + sumsq += dot(samples[i], samples[i]); + } + float mstd0 = sum / 32.0; + float mstd1 = sumsq / 32.0 - mstd0 * mstd0; + float mstd2 = mix(0.0, inversesqrt(mstd1), mstd1 >= 1.192092896e-7); + mstd1 *= mstd2; + float vsum = 0.0, wsum = 0.0, sum1, sum2; +#define T(x) intBitsToFloat(x) +#define W(i, w0, w1, w2, w3) dot(samples[i], vec4(T(w0), T(w1), T(w2), T(w3))) +#define WS(w0, w1) \ + sum1 = exp(sum1 * mstd2 + T(w0)); \ + sum2 = sum2 * mstd2 + T(w1); \ + wsum += sum1; \ + vsum += sum1 * (sum2 / (1.0 + abs(sum2))); + sum1 = W(0, 1036208225, 1039469975, 1027560868, 1039536921) + W(1, -1144450173, 1035622988, 1024461970, 1029776426) + + W(2, -1091571194, -1095740683, -1097328754, 1025116802) + + W(3, 1043923973, 1049700439, 1024545936, 1047463785) + W(4, 1048590727, 1028885330, 1039928979, 1017576356) + + W(5, -1098962113, -1090255529, -1100301043, -1090407950) + + W(6, 1032174663, 1026075554, 1023201972, 1042058704) + W(7, 1033278580, 1046104373, 1035224848, 1043393326); + sum2 = + W(0, -1098253927, -1166389754, -1106582410, 1034460863) + W(1, 1027738130, -1113669665, 1016925525, -1129223232) + + W(2, 1055965966, -1101782718, 1045236553, -1132225959) + + W(3, 1057568628, 1055278331, -1127810369, -1108092808) + W(4, 1006679350, 983512221, -1097283179, -1090237017) + + W(5, 1036184228, -1133967067, 1022264595, 1009711002) + W(6, -1096709168, -1105895383, 1040768379, 1030302550) + + W(7, -1111760224, 1033275358, -1104949250, 1045297871); + WS(-1080723616, -1076327864); + sum1 = W(0, 1017315691, -1140602116, 1037257964, -1107192473) + W(1, 1022003974, 1022805527, 1021604747, 1014959990) + + W(2, -1106293281, 1024505865, -1101486193, 1027220277) + + W(3, 1032001763, -1106692027, 1020788295, -1109388172) + + W(4, 1041272315, -1129176587, 1040932726, -1098639185) + W(5, 1032224091, 1038889695, 1019749115, 1036681163) + + W(6, -1113397025, 1022464939, 1024865293, 1043879330) + + W(7, -1118929755, -1123579783, -1117432531, 998707020); + sum2 = W(0, 1015755803, -1140061902, -1129835189, 1032555441) + + W(1, -1138877514, -1123339814, 1016646759, -1165772366) + + W(2, -1127131649, 1016927815, -1112279061, -1095938931) + + W(3, -1116204914, 1009679614, -1153656135, -1146249364) + + W(4, -1137718334, -1129880851, -1089663810, -1069364926) + + W(5, -1092530653, -1148409052, -1122312216, 1018619187) + + W(6, 1033341381, 1024947773, 1058036499, 1079454606) + W(7, 1053318688, 1022404175, 1028043253, 1025789685); + WS(1058954560, 1004956589); + sum1 = + W(0, -1128607008, 1038458494, 1047693245, 1026348672) + W(1, -1108459679, -1116524774, 1024592800, -1117551096) + + W(2, -1102342440, -1105082889, -1085974686, 1047296084) + + W(3, 1058722958, -1135229473, 1019546620, -1122816147) + + W(4, 1027139080, -1147341058, 1057887999, -1100046248) + W(5, -1087115665, 1043502422, 1020243248, 1043995308) + + W(6, 1038455278, -1156235011, -1103441674, 1029167261) + + W(7, 1033885827, 1027001826, -1124163292, 1023459588); + sum2 = W(0, 1039897191, -1116902056, -1115617116, -1116419565) + + W(1, -1121428266, 1003022729, 1032782009, -1161229156) + + W(2, 1032715073, 1035295215, 1051413477, -1089611288) + W(3, 1039274043, -1102315300, 1012620980, 1023483611) + + W(4, -1104821098, -1120385367, 1060018690, -1132652148) + + W(5, 1008252604, -1117381948, -1113601670, -1116040249) + + W(6, -1103487249, -1118716257, -1091510775, 1048354743) + + W(7, 1040404198, 1037629937, 1035102099, -1132320852); + WS(-1088253760, -1127575790); + sum1 = W(0, 1038728366, 1033404580, 1036121471, 1045370723) + W(1, 994877095, 1036217881, 1012008372, 1040247041) + + W(2, -1156102863, 1042126700, -1099951467, -1083618166) + + W(3, 1040753147, -1099186053, 1033329669, -1099351704) + + W(4, 1036225546, -1111684630, 1050604224, -1088174091) + + W(5, -1098202972, 1039701042, 1015138122, 1032444126) + W(6, 1011512228, 1043566527, 1032168346, 1050156122) + + W(7, 1037663513, 1034991255, 1030253051, 1041638884); + sum2 = W(0, 1030438042, 1009286759, 1027607240, 1019667875) + W(1, -1113200383, 1032828373, -1125602091, 1008172775) + + W(2, -1147399085, 1025260806, 1032031341, 1065802217) + + W(3, 1046766533, -1110418147, -1137630919, -1119451994) + + W(4, -1093920639, -1086940227, -1090745109, 1049694895) + + W(5, -1117099650, 1041550488, -1114583845, 1034586333) + + W(6, -1109485523, -1143426189, -1114490725, -1135657207) + + W(7, 1032826151, 1024844082, 993352218, -1137428855); + WS(-1079364256, 1057874888); + sum1 = W(0, 1038744583, 1028964378, 1038770168, 1044691424) + W(1, 1039465822, 1031872786, 1031706975, 1026510455) + + W(2, 1023431711, 1034807569, 1043817591, -1093522810) + W(3, 1033837359, 1026052487, 1024735357, 1032349913) + + W(4, -1097930673, -1105253352, -1095573950, -1085514994) + + W(5, -1111615463, 1038514603, 1029114647, 1036441879) + W(6, 1027252187, 1030066159, 1037737491, 1045101529) + + W(7, 1019830473, 1014931844, 1030853165, 1025856707); + sum2 = W(0, -1110129969, -1122608874, -1109784187, 1036903789) + + W(1, 1016388156, -1134147112, 1025386706, -1114085729) + W(2, 1023276596, 1020476676, 1055608478, 1056514262) + + W(3, -1122102418, 1032271709, -1109100200, 1030585586) + + W(4, 1028080466, -1106237621, -1110801543, -1099727798) + + W(5, 1033517697, -1114242709, -1110189468, -1128034084) + + W(6, -1115008651, -1145788944, -1135649000, 1034305529) + + W(7, 1019861916, -1104837577, 1027443202, -1105665752); + WS(-1091483264, -1079194671); + sum1 = W(0, -1131351604, -1113984995, 1021186040, -1116327562) + + W(1, -1132080655, -1206829265, 1023600234, -1126861572) + + W(2, -1116837930, 1032278999, -1099425098, 1045060919) + + W(3, 1054575181, -1113261897, -1130307600, -1115285054) + + W(4, -1139989065, 987288903, 1055014512, 1046630795) + W(5, -1092379987, 1027226210, -1122295330, 1003385298) + + W(6, 1024497830, -1120582522, -1105371085, -1115581427) + + W(7, 1026057008, -1110689206, -1130576880, -1136751161); + sum2 = W(0, -1129629424, 1028468886, -1120636360, -1136732761) + + W(1, 1036262769, 1022425868, 1019955588, -1123045172) + W(2, 1004745569, -1114381934, 1032177433, 1051604488) + + W(3, -1115452378, 1026786204, -1123076816, -1139760465) + + W(4, 1012138921, 1032075412, -1114041388, -1122709320) + + W(5, -1105925279, -1102674451, 1002766561, -1135173233) + + W(6, 1021845392, 1000184001, 1017905952, -1141636449) + + W(7, -1138562729, 1006971361, -1146151969, -1127921184); + WS(1067689632, -1150117831); + sum1 = + W(0, -1109849008, -1130553174, -1123520321, 1036413160) + W(1, 1029117869, -1127374955, -1140464318, 1027561031) + + W(2, 1047555836, 1029999475, 1050420518, -1116179871) + W(3, 1035246488, -1104890550, 1020611803, -1113066609) + + W(4, 1035630764, -1114674616, 1040630545, -1098283742) + + W(5, 1031697439, -1116392999, -1125473743, -1114557056) + + W(6, -1099893915, -1113991840, -1107722684, -1150636351) + + W(7, 1041501593, 1019029347, 1031847583, 1006720846); + sum2 = W(0, 1032302578, -1114467512, 1035589071, -1140727686) + + W(1, 1028178655, -1123814512, -1131958732, -1114865396) + + W(2, 1032483043, 1037446674, -1114962225, -1107033941) + + W(3, 1017647091, -1102520792, 1028700703, -1106445462) + W(4, 1055539881, 1053856893, 1060021172, 1044678306) + + W(5, -1086216329, -1096729370, -1098594526, -1103816765) + + W(6, -1089061083, -1095432519, -1087688027, -1119624965) + + W(7, 1060967891, 1056004093, 1046082925, 1049601918); + WS(1053174400, -1151490459); + sum1 = + W(0, -1122069115, -1147738936, 1027718109, 1032697654) + W(1, 1025368761, -1112696969, 1007532846, -1121758051) + + W(2, 1032070534, -1116405775, 1043517586, -1108806494) + W(3, 1041596435, 1030488179, -1145227340, 1032005679) + + W(4, -1106451229, 1015337751, -1118269791, -1117317899) + + W(5, 1044803791, -1098708424, 1024445699, -1105947015) + W(6, 1016988943, -1131178679, 1030116243, 1014470144) + + W(7, -1112007328, 1036691591, -1121635481, 1025294511); + sum2 = W(0, 1030975148, 1021517080, 1055956931, 1077778659) + W(1, 1057214094, 1029844584, 1029913248, 1021753404) + + W(2, -1130068082, -1126516206, -1091517508, -1071480833) + + W(3, -1089646275, -1129174056, -1116251741, 998387790) + + W(4, -1128045540, 1010660367, -1115164896, -1096786527) + + W(5, -1109767888, 1010452735, -1130073888, -1161269496) + + W(6, 1009416079, 1014043007, -1124472846, 1028586964) + + W(7, 1004868686, -1122799750, 1023899390, -1126055830); + WS(1064255296, 1017910760); + sum1 = W(0, 1034554881, -1112041607, -1108750194, -1098306542) + + W(1, -1140839485, -1117661336, -1142577806, -1131295699) + + W(2, 1054734130, 1053450179, 1051103338, 1044871248) + W(3, -1103441076, 1027829882, -1122634224, 1024857124) + + W(4, -1098111935, 1024002066, -1095577677, 1046694116) + + W(5, -1111281057, 1048629833, 1032310597, 1048835924) + + W(6, -1127407003, -1117294562, 1016696883, -1097130662) + + W(7, 983357671, -1104687573, -1118108640, -1098281839); + sum2 = W(0, -1120767464, 1032914397, -1109760249, 1040094052) + + W(1, 1016200567, 1009241688, -1122384418, 1032959032) + W(2, 1053966016, 1073793292, 1060302091, -1072585870) + + W(3, -1094220304, -1113143087, 1028063795, -1104349617) + + W(4, 1035968374, 1040357442, -1122023462, -1086238928) + + W(5, -1172011891, 1043210576, 1025380203, -1119727737) + + W(6, -1147532546, -1129131123, -1130362887, -1116834009) + + W(7, 1036030945, 1015923256, 1017132829, 1019714285); + WS(-1096343168, -1126236522); + sum1 = W(0, 1030703603, 1007810299, 1040041675, 1047119465) + + W(1, -1113575360, -1132527909, -1134236941, 1009418349) + + W(2, -1108689250, -1119306439, -1096469888, -1085509191) + + W(3, 1056154112, 1020253526, 1041829816, 1033231243) + W(4, 1038321302, 1031818658, 1053153171, -1089344732) + + W(5, 1045446045, 999324634, -1115315934, -1107897834) + + W(6, -1121378303, -1127608870, -1126859158, 1045457184) + + W(7, -1144694086, 1029954693, 1019451938, 1026209383); + sum2 = W(0, 983284602, 1016178696, 1029794920, 1029986296) + + W(1, -1109420788, -1131549160, -1118046352, -1117716768) + + W(2, 1020456556, -1144975071, -1114118472, 1041996066) + + W(3, -1139464095, -1114876306, 1015095008, 983229178) + W(4, -1131636264, -1131007184, 997214653, 1053737341) + + W(5, -1097949071, -1113647896, -1115559594, -1141234271) + + W(6, 1015204808, 1022946788, 998054973, 1023304596) + W(7, 1029400914, 1024576522, -1124860928, -1131778280); + WS(1054415488, 1031748714); + sum1 = W(0, 1032036500, -1106849745, 1032905605, 998976710) + W(1, 1035586875, 1024707071, -1137244643, 1040319748) + + W(2, 1016814449, 1048190511, 1025341687, 1051815981) + + W(3, -1102465150, -1113968464, -1127337837, -1115415046) + + W(4, -1098109636, -1110288412, -1090213441, 1042721902) + + W(5, -1117518441, 1046144796, -1117570737, -1135047459) + + W(6, 1018567785, -1119790601, 1041909072, 1029877301) + + W(7, 1033626399, -1106536335, 1018599181, -1122513053); + sum2 = + W(0, 990440998, -1138393335, -1115155620, 1002996807) + W(1, -1122715509, -1107496177, -1109700727, -1100731818) + + W(2, -1103416430, -1121991569, -1128966950, -1100463136) + + W(3, -1095499559, 1010012987, 1000571127, 1048400711) + W(4, -1120602807, 1037302636, -1098451061, 1060125031) + + W(5, 1057202890, 1038403096, 1011003397, 1041385707) + W(6, 1034530622, -1117267403, 1032576586, -1114490937) + + W(7, -1120765719, -1126507430, 1027555951, -1105804206); + WS(1057399616, 1074070393); + sum1 = W(0, -1116946950, -1167692925, 1025124136, 1027460150) + W(1, 1033233658, 1043057687, 1031827147, 1036180887) + + W(2, 1049855515, 1048650971, 1035712138, -1096264273) + + W(3, -1093603523, -1089515076, -1102565613, -1089497938) + + W(4, -1097294408, -1103643414, -1094845877, -1106323062) + + W(5, 1045414146, 1057610273, 1043872372, 1048651645) + W(6, 1045229301, 1041758026, 1045455640, 1036926493) + + W(7, 1036007790, -1123310040, 1012034194, 1034964477); + sum2 = W(0, -1099019906, 1016280180, -1104956478, -1160553787) + + W(1, -1115190705, 1040551613, -1110901592, 1043284947) + + W(2, -1135117191, -1104821294, 1031344902, 1057285857) + + W(3, -1108143797, -1096822242, -1121444630, -1108844527) + + W(4, 1053230727, -1108236474, 1044240449, 1060881655) + + W(5, -1141578351, -1110487530, 1033167055, -1097266933) + + W(6, -1102919364, 1021862852, -1102746088, -1121198562) + + W(7, -1107568696, 1027740054, -1115478973, 1039050835); + WS(-1079272096, -1088198283); + sum1 = + W(0, -1150549691, -1136809437, 1035238887, -1114730926) + W(1, 1013948517, 1024493634, 1014747375, 1007675727) + + W(2, -1112293630, -1147892734, -1101200910, -1153686203) + + W(3, 1033312670, -1111552818, 993656219, -1115285591) + W(4, 1038263474, -1131332343, 1042949876, -1109365886) + + W(5, -1123815596, 1033656538, 999554974, 1031561484) + W(6, -1117531256, 1024124492, 1022854919, 1038223988) + + W(7, -1137128325, -1131368443, -1123012682, 983503863); + sum2 = W(0, -1130912341, 933663296, 1024898014, 1026863962) + W(1, 1006981209, 1015250909, -1128875465, -1163156681) + + W(2, -1131869901, 973137042, 1022547165, -1103034755) + + W(3, 1032168251, -1122671508, 1002623282, -1124284861) + W(4, 1021624533, 1031913949, 1049231168, 1074345895) + + W(5, 1046910286, 1033396431, 1015118461, 987851849) + + W(6, -1116201618, -1114826138, -1097351564, -1074065991) + + W(7, -1101411998, -1116799454, -1122428830, -1131138133); + WS(1066898592, -1135257599); + sum1 = W(0, -1110180874, -1104421608, -1108282395, -1109212258) + + W(1, -1112266449, -1104815307, -1117810340, -1107536862) + + W(2, 1039457202, 1036077428, 1042328969, 1047234565) + + W(3, -1102031401, -1101771699, -1107974833, -1105991798) + + W(4, -1099722419, -1109956850, -1108344348, 1050666829) + + W(5, 1052651555, 1056795268, 1044347095, 1052879183) + W(6, 1033603984, 1025966004, 1027866348, -1127852161) + + W(7, -1117920074, -1103088922, -1114797145, -1109126692); + sum2 = W(0, -1109573955, -1130272686, -1112628352, -1135365682) + + W(1, -1127976571, -1109041460, -1141484375, -1124075328) + + W(2, 1053252716, -1099761318, 1053124236, 1015950468) + + W(3, 1055173972, 1056516595, -1111992284, -1111067004) + + W(4, -1111963093, 1023415227, 1036225124, -1098416341) + + W(5, 984548524, -1099834172, -1115296758, -1123095583) + + W(6, -1104024699, -1113318439, -1113101390, 989675628) + + W(7, -1113626094, 1021900236, -1121224929, 1035158074); + WS(-1080514464, 1071098312); + sum1 = W(0, 1029423638, 1032590577, 1026820152, 1032314563) + + W(1, -1121041060, -1118573868, -1120807462, -1138006521) + + W(2, -1104998922, -1109637973, -1100165641, 1052963835) + + W(3, 1049180397, 1051364482, 1040988017, 1046351030) + W(4, 1034143047, 1035675859, 1041959039, 1044386890) + + W(5, -1094089003, -1091683740, -1104568584, -1100071438) + + W(6, -1121480226, -1116754806, -1119258414, -1124675269) + + W(7, -1141724766, 1026232616, -1142663074, -1128189972); + sum2 = W(0, -1103917515, 1015651007, -1110033797, -1102760582) + + W(1, -1111112749, 1038662254, -1114159185, 1037944898) + + W(2, 1047440331, -1161898742, 1037971494, 1064882055) + + W(3, -1094052244, -1095531648, 1028288648, -1103088589) + + W(4, 1045127249, -1107946310, 1032097498, 1062501861) + + W(5, -1097807648, -1103513552, 1000704926, -1103412727) + + W(6, -1101094893, 1034127906, -1105034150, -1105985747) + + W(7, 952358760, 1029080884, -1115269879, 1036625418); + WS(1048356096, 1025975827); + sum1 = W(0, -1127785256, -1122099232, -1101696686, 1026577988) + + W(1, 1038799529, 1035389109, 1026796836, 1026531900) + W(2, 1042988217, 1042373466, 1057753530, 1024353684) + + W(3, -1089144738, -1100403603, -1117105634, -1118224663) + + W(4, -1143337570, -1109964850, -1091154007, 1027827940) + + W(5, 1052285203, -1125657656, -1109515886, -1110632314) + W(6, -1113788528, 985728647, 981326605, 1025248769) + + W(7, 1031883373, 1042938314, 1041478413, 1024598728); + sum2 = W(0, 1012220951, -1116521159, -1112142878, 1029633040) + + W(1, -1134401830, -1123437332, -1127274631, -1127142758) + + W(2, -1127410563, -1105350472, 1052174871, -1097063130) + + W(3, -1157154125, 1029744370, -1133421881, 1031896001) + + W(4, -1133847817, 1023881724, 1044599155, -1106094805) + + W(5, 1059986787, -1111846084, 1028497368, -1111750394) + + W(6, -1150652997, -1121646209, -1123898264, 1019540966) + + W(7, -1101447493, -1113752268, -1115689394, -1144497399); + WS(1047538944, -1094881626); + sum1 = W(0, -1131292909, -1116924690, -1112297452, 1021777101) + + W(1, 1043477817, -1116873677, -1148100662, -1142312694) + + W(2, 1026526343, 1015768341, 1061821276, 1006944475) + W(3, -1091685625, 1042550748, -1112344306, 1025260793) + + W(4, -1137367995, 1040643394, -1088680894, -1090839121) + + W(5, 1059324523, -1162815447, 1036475455, 1009991259) + + W(6, -1137761291, -1105713526, 1031500559, -1122499811) + + W(7, -1107169411, -1119456201, 998501030, 1032218389); + sum2 = W(0, 1018368946, 1027383442, 1026347909, -1120907217) + + W(1, -1113638165, 1015876554, -1121952605, -1157376536) + + W(2, -1112001321, -1114299623, -1159080892, 1048017951) + + W(3, 1043117803, -1117678872, 1016312397, -1122492527) + + W(4, -1120361628, -1113414147, -1114902877, 1047229175) + + W(5, 1034197636, -1153448320, 1030999359, -1146986041) + + W(6, -1136144308, 995591994, -1130300135, -1113455406) + + W(7, -1104824263, -1135559770, -1116260909, 1024817261); + WS(1059019584, -1093542352); + sum1 = W(0, -1118590060, 1036739212, -1117950862, 1044992135) + + W(1, 1031932973, -1157350427, 1018600951, -1135788111) + + W(2, 1030085820, -1117660736, 1053611807, -1088498407) + + W(3, -1106481599, 1041316489, 1033416637, 1042914684) + W(4, 1044414089, 1037660574, 1035930184, -1087395836) + + W(5, 1044296603, -1101366685, -1113146202, -1105147443) + + W(6, -1139295455, 1017695255, -1132182919, 1041445842) + + W(7, -1162575911, 1028651518, 1029799946, 1024137952); + sum2 = W(0, -1139124704, -1129149604, -1112674264, 1041796064) + W(1, 1023328190, 983636161, -1131439188, 968306692) + + W(2, -1098733365, -1096002059, -1099326395, 1042574015) + + W(3, 993486752, 1013026008, -1121650464, 1025526661) + W(4, -1134878408, -1139933424, 1006823136, 1054885382) + + W(5, 1040771663, 1012616072, -1119789204, 1007743024) + W(6, 1017748092, -1120672660, 1007868832, 1038924927) + + W(7, -1118903044, -1117420588, 1032346590, 1016029412); + WS(1034201600, 1032755867); + sum1 = W(0, -1153568391, 1027758260, -1120836106, -1106713574) + + W(1, -1110497539, -1113115007, -1129181937, -1106649828) + + W(2, -1096012775, -1105013167, -1096428191, 1052356477) + + W(3, 1040996254, 1046162344, 1026611286, 1046578147) + W(4, 1054286804, 1040809774, 1052819554, 1045456334) + + W(5, -1104715738, -1106901340, -1119554608, -1111616164) + + W(6, -1151613767, -1113241540, -1109787424, -1103823871) + + W(7, -1140335480, -1136669162, -1129950605, 1018423993); + sum2 = + W(0, -1116195452, -1114916062, 1015539387, 1031939547) + W(1, 1004500534, 1002967134, -1116253852, 1037899637) + + W(2, 1046553581, 1044137813, 1039450853, -1081686100) + W(3, -1106570618, 1023858175, 1032662783, 1018521363) + + W(4, 1060291180, 1067697792, 1056432615, -1075409426) + W(5, -1100622921, 1018449047, 1002080710, -1106597825) + + W(6, -1133268119, 1023665145, 1037512606, 1033868463) + W(7, 1015733077, -1120650920, 1016550645, 1008358731); + WS(-1092032128, -1114982082); + sum1 = W(0, 1022785838, 1030256707, 1019093490, -1129380878) + + W(1, -1136259347, -1112386231, -1119087591, -1105547264) + + W(2, -1092594901, -1096516325, -1091986421, 1046024022) + + W(3, -1122621159, 1047446468, 983613607, 1044817638) + W(4, 1053421570, 1038780564, 1047196191, 1055287349) + + W(5, -1127922606, -1103792760, -1127804734, -1107803612) + + W(6, -1131318086, -1117764855, -1114799192, -1136363407) + + W(7, -1144800614, 1031400745, -1141783466, 1035179430); + sum2 = + W(0, 1041280609, -1122718101, 1032208518, -1105883428) + W(1, 1032385022, -1105712369, 1026423073, -1100029914) + + W(2, -1101864626, -1105911709, -1098031958, 1058683727) + + W(3, -1120084233, 1049511237, -1101782173, 1048360263) + + W(4, -1094055741, -1103824921, -1096453130, 1064792422) + W(5, 1036982526, 1028614917, 1024411853, 1045846387) + + W(6, 1033694830, -1107222411, -1124818562, -1108861898) + + W(7, -1126293810, -1108778587, 1022233154, -1104838815); + WS(-1109129728, 1010433912); + sum1 = W(0, -1117250164, 1006908285, -1122855062, -1107144297) + + W(1, -1106683568, -1123315850, -1130212999, -1125685047) + + W(2, -1096823624, -1105899410, -1092542200, 1057728383) + + W(3, 1037050434, 1026000812, -1117617698, -1122267030) + W(4, 1040646763, 1019351431, 1052048931, 1064635860) + + W(5, -1117087348, -1107858814, -1107016783, -1100117973) + + W(6, 1019407999, -1137630799, -1109418342, -1105008732) + + W(7, -1114857797, 1029923270, -1137382471, 1034575732); + sum2 = W(0, -1153548328, -1146428548, -1122720334, -1131960189) + + W(1, -1105417557, -1140382642, -1130524097, 1025793768) + + W(2, -1138461074, 1040260969, 1050908092, 1057542522) + + W(3, 1046314824, -1105004761, 1024281381, -1110366356) + + W(4, -1109953492, -1109276610, -1119113122, -1109440842) + + W(5, 1008998438, -1140136790, -1119699464, -1135544654) + + W(6, 970383811, 1016706951, -1113772244, -1149783528) + + W(7, -1111645386, -1114961145, -1128062487, -1113390177); + WS(1028043776, 1066748487); + sum1 = + W(0, 1020869188, 1029235758, -1130366216, 1035504777) + W(1, 1043701316, 1028701624, -1140377801, -1122144394) + + W(2, 1042153037, -1142684082, 1055996350, 1053860476) + + W(3, -1085695847, -1103910983, -1112356264, -1125763849) + + W(4, -1114798157, -1109061593, -1084468040, 1054127718) + + W(5, 1050138268, -1111428405, -1142788434, -1122964802) + + W(6, -1111756535, 1025123714, 1039957533, 1020063133) + W(7, 1020852591, 1027291444, 1023500800, -1137256281); + sum2 = W(0, -1124029698, 924100096, -1114278109, -1110737625) + + W(1, -1113250169, -1121059730, 998717971, -1125884533) + + W(2, -1129530165, -1119644642, -1119677450, 1050522694) + + W(3, 1031715210, -1121636434, -1145009875, -1119348450) + + W(4, -1125964837, 1007880106, 1030663674, 1051750384) + + W(5, -1120664914, -1117515026, -1122454562, 1010693450) + + W(6, 1021970837, -1133743274, -1118803866, -1114387111) + + W(7, 999385235, 1025411170, 1019195093, -1127692741); + WS(1060837696, -1133947077); + sum1 = + W(0, -1111653883, 1028161858, 1026751705, 1035200691) + W(1, 1000443428, -1124636570, -1153569903, 1010162044) + + W(2, 1043511426, -1107876293, 1032976162, -1100826286) + + W(3, 1046154066, -1109841015, 1028652293, -1123706233) + W(4, 1035524535, 1015032078, 1051427819, -1104551490) + + W(5, 1014718172, -1105048272, -1150803951, -1122173975) + + W(6, -1102491073, -1120891991, -1107214884, -1125941943) + + W(7, 1038586510, 1029969865, 1023653077, 990755503); + sum2 = W(0, -1109148006, 1027230711, -1141349815, -1115012616) + + W(1, 1025861327, -1129789352, 1018453676, 1031045509) + + W(2, -1124907300, -1130116966, -1099589874, 1033368851) + + W(3, -1097709653, 1048790586, -1111271581, 1042673858) + + W(4, -1092637531, -1092832201, -1085994041, 1040685020) + + W(5, 1063174823, 1056989663, 1049450817, 1044673285) + W(6, 1058387135, 1052271642, 1062146597, 1019043320) + + W(7, -1085821967, -1089224415, -1100831168, -1096709646); + WS(1052991104, 1024635730); + sum1 = W(0, 1035832004, -1113667962, -1115665493, -1099876558) + + W(1, -1124670698, -1123144798, -1141396670, 991927035) + + W(2, 1054985227, 1053766219, 1046292645, -1128304655) + W(3, -1115760280, 1032906080, 1011324759, 1032830229) + + W(4, -1101014640, 1027437528, -1097461637, -1148766910) + + W(5, -1103841730, 1048476772, 1034147624, 1048946541) + + W(6, -1119430356, -1121298600, 1029858016, -1098528437) + + W(7, 1026860541, -1107490221, -1114702739, -1098098175); + sum2 = W(0, 1023525971, -1123155104, 1037524511, -1119336486) + + W(1, -1120201684, -1140931614, 1025256785, -1116496860) + + W(2, -1101540780, -1081244300, -1094597742, 1068940029) + W(3, 1051860638, 998725346, 1002156586, 1038812729) + + W(4, -1109590196, -1107189914, 1026840221, 1038949441) + + W(5, 1014639773, -1110977051, -1117345859, 1033886084) + W(6, -1124206084, 989815561, 979200786, 1039597181) + + W(7, -1126284432, -1128575576, -1123250336, -1117282785); + WS(-1106197760, -1107941957); + sum1 = W(0, -1126741205, 992223587, -1103296147, -1096167611) + + W(1, -1103227950, 1041994672, -1124973941, 1027666259) + + W(2, 958134964, -1096404880, 1050569383, -1089676235) + W(3, 1032016157, 1020956357, -1180953690, 1043412107) + + W(4, 1042417753, -1114006205, 1053212362, -1101748223) + W(5, 1057274419, 1042030605, 1049652990, 1052224033) + + W(6, -1131232109, -1156891819, -1104768673, -1105076618) + + W(7, -1101041056, -1124618361, -1114495652, -1117167007); + sum2 = W(0, -1114619118, -1149001791, -1110825372, -1090736686) + + W(1, -1106216772, 1027272732, 1033544093, -1120615480) + W(2, 1033666378, 1045400432, 924614016, 1063026008) + + W(3, -1114127208, -1108719036, 1032301903, -1114760302) + + W(4, 1015708744, -1103940412, -1107881456, 1059931802) + + W(5, -1107266078, 1024735270, -1134995311, 1034226031) + + W(6, 1027002418, -1125963088, -1103385448, -1091159350) + + W(7, -1139192735, -1125128312, 1019689496, 1032462491); + WS(-1076602784, -1079939509); + sum1 = W(0, 1033209209, -1124683769, 1015980198, -1141354248) + + W(1, -1106007132, -1114123684, -1121157953, 1019464370) + + W(2, -1103738752, -1119780485, -1096323000, 1042233324) + + W(3, 1054450248, 1052850909, 1043529432, 1045060053) + W(4, 1025390185, 1041533536, 1052087227, 1039917313) + + W(5, -1105614956, -1098158311, -1107965437, -1103437636) + + W(6, 1002177000, -1112424745, -1104846498, -1113895617) + + W(7, -1119444855, -1112376802, 1021969694, -1109951699); + sum2 = + W(0, 1032197744, -1119329897, 1026978731, 1042368013) + W(1, 1034747948, -1109569271, 1037031349, -1111213511) + + W(2, -1106233686, -1117977933, -1119744119, -1074309068) + + W(3, 1068607081, 1064708176, -1119111329, 1041980892) + W(4, -1119285117, 1035649904, 1046616172, -1080074847) + + W(5, 1045039448, 1043980108, 1029320825, 1028259198) + W(6, 1036373860, -1113988579, -1150690390, -1148379867) + + W(7, 1031972703, -1113275705, 1015848847, 1008019670); + WS(-1093673600, -1131421273); + sum1 = W(0, -1121371719, -1126420325, 1033366837, 1021303790) + + W(1, -1117842165, 1011797877, 1021502382, -1131840478) + + W(2, -1114120908, -1110871822, -1087025669, -1118558279) + + W(3, 1056872571, 1032969664, 1037611499, 1040800018) + W(4, 1035660544, 1021798446, 1058317703, 1042294182) + + W(5, -1088792724, -1114500968, -1111697864, 1017988942) + + W(6, 1009001293, 1008740253, -1120291359, 1022689127) + + W(7, 1031810222, -1148303562, -1137856917, -1121301883); + sum2 = W(0, -1145039688, -1129835426, -1119915157, -1110668832) + + W(1, -1111519800, 1002833896, -1127947266, 1006052904) + + W(2, -1114206314, -1119983153, -1121785409, 1051729955) + + W(3, 1012089860, -1118223897, -1130809610, -1123764449) + + W(4, -1116540509, -1113040628, -1118504757, 1051989643) + + W(5, 1039755978, 1025479957, -1158783904, -1127132522) + W(6, 1020565626, 1000979816, 989230112, -1112437186) + + W(7, -1112214518, 1015165050, -1128941978, 1025956493); + WS(1065682080, -1111828541); + sum1 = W(0, 1015869752, 1017604463, -1112250175, 1024786188) + W(1, 1036568133, 1002255762, -1131800664, 982208647) + + W(2, -1145885026, -1115077208, 1052074397, -1121697500) + + W(3, -1086889687, 1045248549, -1130857684, 1037568127) + + W(4, 1022264616, 1021224792, -1089954536, 1047440331) + + W(5, 1049268572, -1109225970, -1123514660, -1113425822) + + W(6, -1126764880, 1032942526, 1040282413, 1035803452) + + W(7, -1125683619, 1031850711, -1141787602, 1017131424); + sum2 = W(0, -1122978131, 1016040732, -1114060649, -1125004872) + + W(1, 1029971540, 1026938249, 1017189437, -1124460348) + W(2, 1016858600, 968811648, 1029169324, 1051074882) + + W(3, 1006053609, -1154135582, -1115290499, -1140773838) + + W(4, 1028741871, 1021399769, 1032336595, 1031746308) + + W(5, -1103346234, -1113140779, -1141169189, -1122277912) + + W(6, 993636865, -1144040913, -1118019503, -1109484363) + + W(7, -1124468225, 1013417282, -1169769501, -1139883250); + WS(1068575136, 1057679145); + sum1 = W(0, -1106541599, 1008215334, 989927934, 1042310507) + W(1, 1018512183, 1040070410, 1014261304, 1041475113) + + W(2, 1049880682, 1049251178, 1026486412, -1095539136) + + W(3, -1094672658, -1089191083, -1100618939, -1087252724) + + W(4, -1093397815, -1111487207, -1092992340, -1103138323) + + W(5, 1043830943, 1057944056, 1044894993, 1049811244) + W(6, 1052783569, 1042509671, 1051194971, 1040579493) + + W(7, 1038856114, -1114567880, 1025292508, 1038361721); + sum2 = + W(0, -1114445084, -1136765855, 1039574032, -1113238946) + W(1, 1030357662, -1106803932, 964162478, -1113028634) + + W(2, 1053593458, 1055007475, -1105638736, -1078800745) + W(3, -1104375874, 1059224194, 1050059734, 1035501186) + + W(4, 1057823779, 1054334485, -1096181786, -1078443122) + W(5, 1049857835, 1058193036, 1043677394, 1029634285) + + W(6, -1150175899, -1141017037, 1042094581, -1134493359) + + W(7, 1020483059, -1099695416, -1118569338, -1110238952); + WS(-1069843280, 1043992756); + sum1 = + W(0, -1124948267, -1135429253, 1025550072, 1025838726) + W(1, 1019242118, -1116233196, 998797102, -1130610171) + + W(2, 1027695014, -1119099178, 1044103833, -1113789227) + W(3, 1039477491, 1024839950, -1142719774, 1028120504) + + W(4, -1108770183, 1017935435, -1112757821, -1130965835) + + W(5, 1042243413, -1101790135, 1012540023, -1106167085) + W(6, 1008956039, -1129507307, 1030807982, 1014849865) + + W(7, -1114625158, 1035190516, -1127852007, 1023573770); + sum2 = W(0, -1114838118, -1121247640, -1095359738, -1072953064) + + W(1, -1093135708, -1115141896, -1116140314, -1127503160) + + W(2, 1026300352, 1028491168, 1053083344, 1074653957) + W(3, 1056568596, 1033233928, 1030713448, 1023653964) + + W(4, 1004928481, -1130258048, 1024432884, -1102013621) + + W(5, 1030571276, -1116002270, 1015669456, -1129660856) + + W(6, -1130791968, -1127851536, 1025789396, 1030571860) + + W(7, 984097412, 1025870428, -1120604784, 1016702232); + WS(1066802848, -1129257078); + sum1 = W(0, 1015630667, -1118978065, -1113784260, -1101616805) + + W(1, -1108037466, -1114908350, -1114956027, -1111947911) + + W(2, 1033473243, -1155453851, 1035395194, 1065736411) + W(3, 1045542397, 1040181775, -1177594330, 1036229652) + + W(4, -1104672775, -1122431286, -1115117829, 1061324843) + + W(5, -1100789945, -1114134583, -1124148059, -1138173719) + + W(6, -1114728473, -1121467910, -1105320751, -1095556296) + + W(7, -1104703871, -1109993148, -1111474306, -1106051686); + sum2 = W(0, -1109560646, -1134031950, -1107125821, 1017238679) + + W(1, 1024343484, -1127256871, 1004378333, -1129735047) + + W(2, -1155123513, -1108713026, 1038996664, 1026897780) + + W(3, -1107646918, -1107869542, -1112902766, -1145442397) + + W(4, 1035199782, -1107664082, 1043157052, 1051508948) + W(5, 1055083262, 998755997, -1159444594, 1012570830) + + W(6, -1115008786, 1019412439, -1123597732, 1016515095) + + W(7, -1106563795, -1116358964, -1117600772, -1110777694); + WS(-1093453440, 1062530498); + sum1 = W(0, -1124930739, 1018166794, -1109529502, -1114300581) + + W(1, 1025096231, 1023247327, 998443854, -1125424515) + W(2, -1115495349, -1109318263, 1024699176, 1040214918) + + W(3, -1105577322, 1043329716, -1123543752, 1034740398) + W(4, 1025637074, 1039727605, 931786146, 1052285453) + + W(5, 1009762919, -1105534248, 988548151, -1116356474) + + W(6, 1023868966, 1023563962, -1131885027, -1104984446) + + W(7, -1110072888, -1137647791, -1123805240, 1018092315); + sum2 = W(0, -1116378324, -1110334365, -1139723269, -1134041225) + + W(1, -1147091114, -1112237914, -1123080609, -1131603942) + + W(2, 1018118074, -1135013993, -1117515615, -1097345050) + + W(3, 1039717826, -1107830137, 1032288465, 978891919) + W(4, 1027066059, 1002595554, 1053899571, 1043336959) + + W(5, 1040668505, 1010598309, 1016807738, 1026333875) + + W(6, -1110082211, -1111471528, -1114430561, 1040454031) + + W(7, 1033656482, -1117546906, -1115822981, -1119917138); + WS(1067735712, -1080534052); + + return clamp(mstd0 + 5.0 * vsum / wsum * mstd1, 0.0, 1.0); +} + +shared float inp[525]; + +#define CURRENT_PASS 2 + +#define GET_SAMPLE(x) dot(x.rgb, rgb2y) +#define imageStore(out_image, pos, val) imageStoreOverride(pos, val.x) +void imageStoreOverride(uint2 pos, float value) { + float2 UV = mul(rgb2uv, INPUT.SampleLevel(sam_INPUT_LINEAR, HOOKED_map(pos), 0).rgb); + OUTPUT[pos] = float4(mul(yuv2rgb, float3(value.x, UV)), 1.0); +} + +#define INPUT_tex(pos) GET_SAMPLE(vec4(texture(INPUT, pos))) +static const float2 INPUT_size = float2(GetInputSize()); +static const float2 INPUT_pt = float2(GetInputPt()); + +#define temp_tex(pos) (float(texture(temp, pos).x)) +static const float2 temp_size = float2(GetInputSize().x * 1, GetInputSize().y * 2); +static const float2 temp_pt = float2(1.0 / (temp_size.x), 1.0 / (temp_size.y)); + +#define HOOKED_tex(pos) temp_tex(pos) +#define HOOKED_size temp_size +#define HOOKED_pt temp_pt + +void Pass2(uint2 blockStart, uint3 threadId) { + ivec2 group_base = ivec2(gl_WorkGroupID) * ivec2(gl_WorkGroupSize); + int local_pos = int(gl_LocalInvocationID.x) * 15 + int(gl_LocalInvocationID.y); + for (int id = int(gl_LocalInvocationIndex); id < 525; id += int(gl_WorkGroupSize.x * gl_WorkGroupSize.y)) { + uint x = (uint)id / 15, y = (uint)id % 15; + inp[id] = + HOOKED_tex(HOOKED_pt * vec2(float(group_base.x + x - (1)) + 0.5, float(group_base.y + y - (3)) + 0.5)).x; + } + barrier(); + vec4 ret = vec4(0.0, 0.0, 0.0, 0.0); + vec4 ret0 = vec4(0.0, 0.0, 0.0, 0.0); + vec4 samples[8]; + samples[0][0] = inp[local_pos + 0]; + samples[0][1] = inp[local_pos + 1]; + samples[0][2] = inp[local_pos + 2]; + samples[0][3] = inp[local_pos + 3]; + samples[1][0] = inp[local_pos + 4]; + samples[1][1] = inp[local_pos + 5]; + samples[1][2] = inp[local_pos + 6]; + samples[1][3] = inp[local_pos + 7]; + samples[2][0] = inp[local_pos + 15]; + samples[2][1] = inp[local_pos + 16]; + samples[2][2] = inp[local_pos + 17]; + samples[2][3] = inp[local_pos + 18]; + samples[3][0] = inp[local_pos + 19]; + samples[3][1] = inp[local_pos + 20]; + samples[3][2] = inp[local_pos + 21]; + samples[3][3] = inp[local_pos + 22]; + samples[4][0] = inp[local_pos + 30]; + samples[4][1] = inp[local_pos + 31]; + samples[4][2] = inp[local_pos + 32]; + samples[4][3] = inp[local_pos + 33]; + samples[5][0] = inp[local_pos + 34]; + samples[5][1] = inp[local_pos + 35]; + samples[5][2] = inp[local_pos + 36]; + samples[5][3] = inp[local_pos + 37]; + samples[6][0] = inp[local_pos + 45]; + samples[6][1] = inp[local_pos + 46]; + samples[6][2] = inp[local_pos + 47]; + samples[6][3] = inp[local_pos + 48]; + samples[7][0] = inp[local_pos + 49]; + samples[7][1] = inp[local_pos + 50]; + samples[7][2] = inp[local_pos + 51]; + samples[7][3] = inp[local_pos + 52]; + ret[0] = nnedi3(samples); + ret0[0] = inp[local_pos + 18]; +#if CURRENT_PASS == LAST_PASS + uint2 destPos = blockStart + threadId.xy * 2; + uint2 outputSize = GetOutputSize(); + if (destPos.x >= outputSize.x || destPos.y >= outputSize.y) { + return; + } +#endif + imageStore(out_image, ivec2(gl_GlobalInvocationID) * ivec2(2, 1), ret0); + imageStore(out_image, ivec2(gl_GlobalInvocationID) * ivec2(2, 1) + ivec2(1, 0), ret); +} diff --git a/src/Effects/NNEDI3/NNEDI3_nns32_win8x6.hlsl b/src/Effects/NNEDI3/NNEDI3_nns32_win8x6.hlsl new file mode 100644 index 000000000..ccfc7baf6 --- /dev/null +++ b/src/Effects/NNEDI3/NNEDI3_nns32_win8x6.hlsl @@ -0,0 +1,1643 @@ +// This file is generated by the scripts available at https://github.com/hauuau/magpie-prescalers +// Please don't edit this file directly. +// Generated by: nnedi3.py --nns 32 --win 8x6 --use-compute-shader --use-magpie +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +//!MAGPIE EFFECT +//!VERSION 4 +//!SORT_NAME NNEDI3_032_6 + +//!TEXTURE +Texture2D INPUT; + +//!SAMPLER +//!FILTER POINT +SamplerState sam_INPUT; + +//!TEXTURE +//!WIDTH INPUT_WIDTH * 1 * 2 +//!HEIGHT INPUT_HEIGHT * 2 * 1 +Texture2D OUTPUT; + +//!SAMPLER +//!FILTER LINEAR +SamplerState sam_INPUT_LINEAR; + +//!TEXTURE +//!FORMAT R16_FLOAT +//!WIDTH INPUT_WIDTH * 1 +//!HEIGHT INPUT_HEIGHT * 2 +Texture2D temp; + +//!SAMPLER +//!FILTER POINT +SamplerState sam_temp; + +//!COMMON +#include "prescalers.hlsli" + +#define LAST_PASS 2 + +//!PASS 1 +//!DESC NNEDI3 (double_y, nns32, win8x6) +//!IN INPUT +//!OUT temp +//!BLOCK_SIZE 32, 16 +//!NUM_THREADS 32, 8 +#pragma optionNV(inline none) +float nnedi3(vec4 samples[12]) { + float sum = 0.0, sumsq = 0.0; + [unroll] for (int i = 0; i < 12; i++) { + sum += dot(samples[i], vec4(1.0, 1.0, 1.0, 1.0)); + sumsq += dot(samples[i], samples[i]); + } + float mstd0 = sum / 48.0; + float mstd1 = sumsq / 48.0 - mstd0 * mstd0; + float mstd2 = mix(0.0, inversesqrt(mstd1), mstd1 >= 1.192092896e-7); + mstd1 *= mstd2; + float vsum = 0.0, wsum = 0.0, sum1, sum2; +#define T(x) intBitsToFloat(x) +#define W(i, w0, w1, w2, w3) dot(samples[i], vec4(T(w0), T(w1), T(w2), T(w3))) +#define WS(w0, w1) \ + sum1 = exp(sum1 * mstd2 + T(w0)); \ + sum2 = sum2 * mstd2 + T(w1); \ + wsum += sum1; \ + vsum += sum1 * (sum2 / (1.0 + abs(sum2))); + sum1 = W(0, -1120567290, 994153301, -1139074345, 1021572063) + + W(1, -1117468940, -1119615974, -1132374181, 1016607238) + + W(2, 992947237, -1137843051, -1125619459, 1000210819) + + W(3, -1132591953, -1122316900, 1053527378, -1096186409) + + W(4, -1144213939, -1121684346, -1125130389, -1146864427) + + W(5, 1046512564, 1056444330, -1138699933, -1129869365) + + W(6, -1117911182, 1031756856, -1093298645, 1051252577) + W(7, 1023905988, 979248533, -1119806663, 1024055745) + + W(8, -1112059294, -1109040755, 1033651817, -1119537890) + + W(9, -1121091407, 1003125923, -1120338466, -1148456803) + + W(10, -1133630411, -1141776739, -1126690796, 1029429758) + + W(11, -1110173889, -1113641375, 1032546877, -1127458445); + sum2 = + W(0, -1126549409, 1022573468, -1140490164, -1114833146) + W(1, 1021805248, 1003196031, -1119263575, -1114028928) + + W(2, -1119708173, 1024108770, -1146392599, -1113990054) + + W(3, 1019494412, -1116443736, 1032492771, 1037187519) + W(4, 1026983682, 1006796332, -1124834267, -1099458226) + + W(5, 1055169273, 1055452063, -1095922228, -1126677517) + W(6, 1007192676, 1017309436, 1044169825, -1106256028) + + W(7, -1122158651, 1022777176, -1122284082, -1118444706) + + W(8, 1039787167, -1112035826, -1118290710, -1130573089) + + W(9, -1127647730, -1121042004, -1145097543, -1125070906) + + W(10, -1129575364, -1123455912, 1010488320, -1109973330) + + W(11, 1044065299, -1121131548, -1121253833, 1019346120); + WS(1060265584, 1063714812); + sum1 = W(0, 1021450242, -1128788280, -1111111528, 1039397963) + + W(1, -1131322533, 1011253684, -1123065753, 1022311347) + W(2, 999728711, -1108349889, 1022720848, 974355898) + + W(3, -1137050988, 1028928107, -1119265827, 1026074151) + + W(4, 1019796282, -1136338948, 1021294882, -1140362288) + + W(5, -1137639751, -1102959280, 1043907075, 1025863841) + + W(6, -1118036885, 1024570351, -1101623708, 1041760911) + + W(7, -1151514983, -1136816500, 1009531192, 1035626828) + + W(8, -1106406289, 1036057270, -1132552740, 1027651305) + + W(9, -1118665549, 1025121435, -1128138578, 1017790822) + + W(10, -1124857459, -1139070668, 992320459, 1029327365) + + W(11, -1106167682, 1037788386, -1134343810, 1024478285); + sum2 = W(0, 1023758242, -1130878336, -1120671625, 1027498838) + + W(1, -1144315403, -1131041230, -1124053764, 1017938673) + + W(2, -1145138723, 1027873020, -1122179044, -1127336921) + + W(3, 1000956747, 1028583936, 1005174931, 1053869854) + W(4, -1093535895, 1009416925, -1122894214, 1031015106) + + W(5, -1104963408, 1073183850, -1074622268, 1033668418) + W(6, 999883691, 994031846, 1001047899, 1053107786) + + W(7, -1094361386, 990806038, 1004424067, 999096115) + W(8, -1126082311, 1035733703, -1114468554, 992895974) + + W(9, -1150041590, -1134395125, 1002728051, 1022225293) + + W(10, -1123867271, -1131337021, 1009546537, 1005722235) + + W(11, -1135618057, 1023923178, -1126165581, -1138321549); + WS(1067199072, 981674447); + sum1 = + W(0, -1113726457, -1105288827, 1040785760, 1032552483) + W(1, -1124907206, -1139898486, 1018794771, -1113372949) + + W(2, -1099180638, 1040483381, -1114167068, -1127069135) + + W(3, -1115871564, -1095136821, 1050678235, 1054762461) + + W(4, -1107257499, -1118671794, 1008735750, -1102105679) + + W(5, 1052734745, 1065065389, -1097429016, 1035770473) + W(6, -1125817867, -1103744656, 1044281884, 1044820043) + + W(7, -1104994292, -1122788302, -1125149117, -1108798620) + + W(8, 1033282170, -1097094388, 1027211226, -1125646899) + + W(9, 1001830321, -1137689902, -1121192922, 1010644366) + + W(10, -1114303237, -1123221796, 1016463803, -1099284685) + + W(11, 1032013917, -1124668651, 1015961570, -1114483455); + sum2 = + W(0, -1124538541, 1021627528, -1127440395, 1027300307) + W(1, 1020622605, -1130074937, -1139313841, 989560618) + + W(2, 1028695072, 1011050585, 999023778, 1015498074) + W(3, -1119374292, 1014774531, -1102978428, 1052523334) + + W(4, -1119874204, -1126569197, 1010830983, 1026431506) + + W(5, -1087762234, 1053318756, 1038687085, -1128231773) + + W(6, 1020827626, -1118520012, 1027251929, -1113197028) + W(7, 1029469191, 1018969905, -1125616841, 1018739126) + + W(8, -1109480314, 1034265115, -1125820221, -1123965604) + + W(9, 1008596323, 1014458179, 1023848922, -1134832277) + + W(10, -1159659466, 1024095771, -1136528497, -1129452021) + + W(11, -1132845253, 1022117249, -1150305989, -1130502215); + WS(-1082327904, -1101742629); + sum1 = + W(0, -1128942355, 994965062, -1116531225, 1027052286) + W(1, -1127603958, 1021969515, 1007179909, -1124051394) + + W(2, 1022855203, -1119991818, 1015495233, -1129777663) + + W(3, -1172666584, 1029361427, 1044526075, -1110346311) + W(4, 1026992677, 1017142675, -1115398989, 1047686461) + + W(5, -1095192109, -1106285700, 1037065627, -1113404469) + + W(6, -1145393643, 1028067431, -1123739865, 1043850022) + + W(7, -1119388383, -1130059467, -1126910957, 1025118144) + + W(8, -1116394763, 1030498357, 1013662917, 1016457699) + + W(9, -1153678686, -1121058723, -1123838961, 1032721886) + + W(10, -1119902562, -1131255799, -1127439210, 1018201755) + + W(11, -1120454737, 1034890279, 1021249778, 1017348651); + sum2 = + W(0, 1014279427, -1130890464, -1129394348, 1014973315) + W(1, -1152876382, 1004833335, -1131491186, -1137235679) + + W(2, 1024729347, -1130557096, -1150339726, -1141673719) + + W(3, 1026571161, -1097554196, 1048952496, 1014221291) + W(4, 1016692910, -1159625756, 1042930837, -1073378768) + + W(5, 1073588633, -1105375875, 1035354953, -1124590261) + W(6, 1025279833, -1092458255, 1053816664, 1016092170) + + W(7, -1129170378, 989537980, 993445038, -1130245298) + W(8, 1029166823, -1119905200, 1027382919, -1138326931) + + W(9, -1133457551, -1120075373, 1030737081, -1147013927) + + W(10, -1124802440, 1017200998, 1014707171, -1135266971) + + W(11, -1151431678, -1161525308, 979085751, 1009604643); + WS(1067891072, -1132872541); + sum1 = + W(0, 1025237873, -1122834636, -1117007553, -1114151507) + W(1, 1031366707, 984935338, 1014334757, 1020114356) + + W(2, -1118569017, 976917621, 1039451348, -1152616053) + W(3, 1030238795, -1105197551, 1049984500, -1088419628) + + W(4, 1049092386, -1123762161, 1029025473, -1121917372) + + W(5, -1114461425, 1051488823, 1008484089, -1145922699) + W(6, 1007260181, 1038150728, -1084792932, 1053317187) + + W(7, -1122288663, 1012164149, -1121222990, 1024596920) + W(8, 1039495098, 987986858, -1131993235, 1000937675) + + W(9, 988616634, 1024170379, -1124531763, 1026119523) + W(10, 1022258228, 1011615629, -1123834925, 1015271403) + + W(11, 1027254009, 993078101, 999667975, 1004174827); + sum2 = W(0, -1144599930, -1116760996, 1032730282, 1032901632) + + W(1, 985378521, -1129170670, -1136232721, 1019759527) + + W(2, -1125055029, 1027655943, 1005941018, -1131155477) + + W(3, -1137221455, -1111064134, 1047170030, -1115058011) + + W(4, -1129460922, -1129924333, -1128645029, 1041961890) + + W(5, 1050767412, -1130649513, 1019394239, 1022276751) + + W(6, -1151231836, 1036336113, -1093680614, -1116185015) + + W(7, -1115704458, -1148456898, -1156748756, 1033905549) + + W(8, -1120368706, -1105887613, 1024734935, 1015791177) + + W(9, -1160295481, 1022489781, -1115425401, 1012694293) + + W(10, -1147415538, -1140100033, 1020235585, -1122711401) + + W(11, -1132924343, -1122854992, 1018590227, 1012472897); + WS(1059709408, 1024973287); + sum1 = + W(0, -1126012593, 996494647, -1119189544, 1028092109) + W(1, -1124577204, 1023428420, 1004611460, -1122880609) + + W(2, 1030391200, -1114579692, 1016065247, -1127475101) + + W(3, -1134152138, 1020165829, 1046947367, -1111968183) + W(4, 1002304420, 1021721777, -1114032340, 1049657976) + + W(5, -1094041084, -1106474499, 1040268033, -1114564220) + + W(6, -1131432537, 1014735450, 1018380112, 1044458845) + + W(7, -1114168306, -1128430825, -1126017195, 1032225804) + + W(8, -1112475533, 1030371012, 1023640576, 1019190017) + W(9, 991561039, -1115613273, -1123292160, 1033263557) + + W(10, -1119951545, -1127717781, -1124178504, 1022764985) + + W(11, -1122300512, 1034006830, 1017080432, 1017178441); + sum2 = + W(0, -1125800395, 1024962708, 1023886172, -1122338700) + W(1, -1171853367, 973576887, 1011909323, -1143341847) + + W(2, -1144213999, 1018807292, 1000330119, 984068764) + W(3, -1116511680, 1052819438, -1097320166, -1115186882) + + W(4, -1140479659, 1001426319, -1103527255, 1076690943) + + W(5, -1072687587, -1098249874, 1023038428, 1007326739) + + W(6, -1120293374, 1057154431, -1091630497, -1117298851) + + W(7, 1029135274, -1135413483, -1148349175, 990717342) + W(8, 1012280135, 1010582795, -1122270538, 1008233815) + + W(9, 1015270352, 1025045202, -1118805022, 990164302) + W(10, 1020995472, -1129534965, -1125483347, 1023577182) + + W(11, 1016249338, -1125194137, 1003973863, -1140102471); + WS(1066253200, 1009489111); + sum1 = + W(0, -1121073890, -1102592607, 1041243549, 1033075644) + W(1, -1123366116, -1130535196, 1024085178, -1107707469) + + W(2, 1026388586, -1107162241, 1004872905, -1145989825) + + W(3, -1130104696, -1106598971, -1121496677, 1050587318) + + W(4, -1113976447, -1120961954, 1023275236, -1116780301) + + W(5, 1049328440, 1057262167, -1116780079, 1023066500) + W(6, -1128214764, -1111680448, 1018012708, 1027096831) + + W(7, -1113850464, -1121521086, -1135799996, 1032050668) + + W(8, -1096674093, 1040843700, 1015552212, 1008378152) + + W(9, -1141685621, -1131519352, -1122519370, 1028580820) + + W(10, -1123000331, -1124335656, -1121776782, 1028096678) + + W(11, -1101864235, -1117086438, 1040749648, -1135644600); + sum2 = + W(0, 1013104936, -1106333857, 1041445982, -1143812784) + + W(1, -1111423698, -1153458272, -1117172679, -1121647283) + + W(2, 1046293466, -1098323478, 1025469214, -1123006845) + W(3, -1127525498, 1031691189, 1054977467, 1032669672) + + W(4, -1110723238, 1018478818, -1135146700, 1030458550) + W(5, 1051999059, 1016608418, 1041509878, -1111394764) + + W(6, -1122718205, -1111791784, 1044523088, -1093831562) + + W(7, 1024902469, -1127833490, 1027187072, 1009508096) + + W(8, -1099681845, 1044831040, -1110045970, -1140396324) + + W(9, -1119344027, -1127767754, -1185033988, -1117227205) + + W(10, -1129401382, -1129041118, -1128814570, 1037784205) + + W(11, -1107269301, -1118967703, -1121987113, 1021194206); + WS(1055988095, 1068562120); + sum1 = W(0, 1025054956, 1041692938, 1040251631, -1141880069) + + W(1, -1113980711, 1011769695, -1130996743, 1036197410) + W(2, 1032351834, 1043619883, 1002392085, 1020511427) + + W(3, 1024941510, 1042434277, -1100356972, 1026325313) + W(4, 1040781794, -1124414423, 1026193148, 1039706891) + + W(5, -1093055992, -1087193164, 1032223740, -1163338101) + + W(6, 1035977616, 1036807045, 1047058383, -1087410536) + W(7, 1047196369, 1015241743, 1028839961, 1029783554) + + W(8, 1043491547, -1097265155, 1027612260, -1129538215) + + W(9, 1016648336, 1019008523, 1044781893, -1104034167) + W(10, 1036828166, 1018634427, 1025665319, 1026886128) + + W(11, 1048991774, -1099060796, -1113322870, -1180507092); + sum2 = W(0, -1109623534, -1098330057, 1051762285, -1105318233) + + W(1, -1120494292, 1036873688, -1119308996, -1121926087) + + W(2, 1045894429, -1111281216, 1002875661, -1152598618) + + W(3, -1108667787, 1031129408, 1029096148, -1116694436) + + W(4, 1042501069, -1117793653, -1107757858, -1111457821) + + W(5, 1060518836, -1103134861, -1104320409, 1023528108) + + W(6, -1126585969, -1091241820, 1065480819, 1017373783) + + W(7, 1041202422, -1117516356, -1144042093, -1092220222) + + W(8, -1120268316, 1034184394, -1131983911, -1123122827) + + W(9, 1004201965, -1112242725, 1035423856, -1129342463) + + W(10, 1023586732, -1131565835, 1024608852, -1104308532) + + W(11, -1105721536, -1134873838, 1017105251, 1015347387); + WS(-1073915832, -1098883962); + sum1 = W(0, 1030932360, 1024626915, -1098288699, -1130380922) + + W(1, 1033018229, 1021355752, -1131602112, 1032898976) + + W(2, -1117814224, -1103847418, 1040490540, -1120290302) + + W(3, -1125999684, -1122370130, 1056014501, -1096397881) + + W(4, 1031863906, -1131922448, 1018154928, 1011274315) + + W(5, -1106175819, -1105327485, 1044317365, -1139369119) + + W(6, -1122265980, -1113904235, -1097956311, 1059753579) + + W(7, -1098424101, -1121102372, -1122315861, 1029902191) + + W(8, -1115232133, 1040451325, -1122968848, 1033247800) + + W(9, 1018577993, -1115348785, -1126206816, 1039068637) + + W(10, -1136273729, -1121007738, -1120663220, -1111387910) + + W(11, 1017122848, 1042824131, 1021433455, -1143567007); + sum2 = + W(0, -1118315643, 1046909717, -1100980148, -1129801877) + W(1, -1122172234, 1010610423, -1126395193, 1025514844) + + W(2, -1112473945, 1030594060, -1111527676, -1135186433) + + W(3, 1014636591, 1026986728, 1040985677, -1101816290) + W(4, 1023795758, 1030475382, -1138413531, -1112879553) + + W(5, 1027746798, -1094641835, 1027030278, -1121095046) + W(6, 1013622247, -1122377333, 1051150943, 1041324898) + + W(7, -1113671456, 1015864126, -1129252552, -1114813410) + + W(8, 1057006779, -1106485598, -1133454616, 999966259) + + W(9, -1122713894, -1144089687, -1138866101, -1115757412) + + W(10, 1001347783, -1127643580, -1131632742, -1140190295) + + W(11, 1035155819, 1016695560, -1139893847, -1124292419); + WS(1058139200, 1067005003); + sum1 = W(0, -1131277347, -1103206155, 1015263811, 1048238354) + + W(1, -1106607621, -1122297405, -1128484819, -1112832909) + + W(2, -1111332237, 1044526364, -1104751670, -1124214159) + + W(3, 1014594990, -1108301118, 1004409248, 1056580635) + + W(4, -1107635783, 1017238947, -1112913457, -1111811582) + + W(5, 1031432468, -1114379264, -1107787999, -1110162105) + + W(6, 1028891109, -1113179152, 1057408386, 1025802539) + + W(7, 1020725062, 1002560364, -1118434446, -1100757638) + + W(8, 1053177162, -1104236495, -1114959053, -1113724157) + + W(9, -1125459884, -1116265771, 1035803645, -1124751623) + + W(10, -1129296244, -1123244163, -1151139539, -1119227733) + + W(11, 1052437131, -1121289813, -1120069105, -1115210511); + sum2 = + W(0, -1121057595, 1023292260, -1111891368, 1035766063) + W(1, 1032208606, -1122161823, 1016432775, -1124268922) + + W(2, 1029388268, -1118389960, -1122510207, 1028529468) + + W(3, -1112629457, -1116199054, -1123843875, 1033023394) + + W(4, -1113138713, -1118001871, 1031151061, -1110795130) + W(5, 1054055516, 1054507013, 1019595258, 1026811027) + + W(6, -1126819952, -1103006120, 1020478730, -1104664187) + + W(7, -1114598707, -1116707921, 1021228732, -1134369449) + + W(8, -1135412321, -1121918429, 1023542227, 1018790016) + W(9, 1009585899, -1120667087, 993043492, 982538191) + + W(10, 993709924, -1146185904, -1127402608, 1016333862) + + W(11, 996548072, -1108029597, -1129671373, -1152045912); + WS(-1091835967, 1038509097); + sum1 = W(0, 1002958335, 1041562959, -1124369824, -1093861855) + + W(1, 1039801017, -1132073944, 1031236696, 1038000620) + W(2, 1029288008, -1100002304, 1038306915, 1032364667) + + W(3, -1122124314, 1042029266, -1104824881, -1087002164) + + W(4, 1037725118, -1122032128, 1034973544, 1034473413) + W(5, 1049571184, 1052741396, 1041619283, 1036587856) + + W(6, -1120202292, 1040514695, -1089024373, 1044570703) + + W(7, 1031782758, -1138629744, 1015820538, 1042048878) + W(8, -1089426268, 1042398171, 1038671876, 1010685600) + + W(9, 1033636218, 1029242778, -1107643796, 1023923250) + + W(10, 1025678032, 1027566834, -1121967836, 1042898689) + + W(11, -1091407169, 1030369604, 1043274836, -1153060031); + sum2 = W(0, 1016791821, -1110538641, -1114409767, 1045544748) + + W(1, -1111278622, -1127655665, 1013192458, 1023566599) + + W(2, -1113846927, 1029704719, -1125617069, 1012727082) + + W(3, -1123883287, 1000152052, -1109610416, 1034122997) + + W(4, -1110039103, -1131212885, 1015528749, -1112636904) + + W(5, 1054155729, 1054056541, -1108588248, 1000573476) + + W(6, -1131825297, -1116367667, -1109117303, 1030522539) + + W(7, -1132906850, -1123699129, -1132736674, -1130121037) + + W(8, 1016394661, -1116026974, -1135451026, -1126704253) + + W(9, 1019880949, -1114305335, 1030290683, 992430312) + W(10, -1134728538, 988228497, -1117749640, 1033496981) + + W(11, -1157815185, -1107824982, 1016739853, -1123545619); + WS(-1089794384, 1053743764); + sum1 = + W(0, 977181200, -1124062435, 1045792382, -1096122984) + W(1, 1035356461, -1146772642, 1022034304, -1123589329) + + W(2, 1045687772, -1100185218, 1029423919, 1022712508) + W(3, 999195154, 1008939465, 1043214811, -1089534650) + + W(4, 1037071922, 986801416, -1173982736, 967031199) + W(5, 1051096635, -1128424615, -1130937578, 1009586465) + + W(6, -1131079992, 1031201254, -1106608558, 1022835035) + W(7, 1033635179, 1012941585, -1117753925, 1038421055) + + W(8, -1104815387, 1033659882, -1112564552, 1008485953) + W(9, 1011212627, 1023184516, 975115280, 1025453978) + + W(10, -1148354182, 1023442138, -1131210280, 1042888267) + + W(11, -1113606040, -1114474998, -1115626236, 1020831720); + sum2 = + W(0, 1025756371, 1038582018, -1095235720, -1097242729) + W(1, 1048188946, -1145714840, -1152866061, -1136865390) + + W(2, 1027392563, -1108446917, 1009460859, 1022755591) + W(3, 1022411083, 1028991375, -1094985700, -1092586393) + + W(4, 1013992713, 1033471029, 1021941035, -1102180290) + W(5, 1062263751, 1055770556, -1098658877, 1018658879) + + W(6, 1018807869, -1127151005, 1023141397, 1024429444) + + W(7, -1162587434, 1032105067, -1162131898, -1103213990) + + W(8, 1032099771, 1045256871, -1104388978, -1135748387) + + W(9, 1030478695, -1148467374, -1139645537, -1115314196) + + W(10, 1033707193, 1008760659, -1117519259, -1101731450) + + W(11, 1050734432, 1044538365, -1097902791, 1019361371); + WS(-1092258911, -1089815334); + sum1 = W(0, -1139634407, 1045821685, -1119357002, 1034361159) + + W(1, -1137425069, -1130196683, -1147044493, 1034203057) + + W(2, 1015718019, 1051668019, -1115826689, 1023465264) + W(3, 1017866535, 1044613801, -1104936487, 1032636456) + + W(4, 1035725147, 1015877619, -1130890003, 1035729090) + + W(5, -1090722234, -1086460492, 1010439579, -1117806874) + + W(6, 1027130446, 1029847032, 1052628837, -1094763749) + W(7, 1043916211, 1025832214, 1016637069, -1102281888) + + W(8, 1057948020, -1095562645, -1114240161, -1123952546) + + W(9, 1016500860, -1131657511, 1044884520, -1106362539) + + W(10, 1035145793, 1029577644, 1026913637, -1121093118) + + W(11, 1053191568, -1098187032, -1102258214, 1011300119); + sum2 = + W(0, -1128703433, -1113670137, 1038503213, 1040684472) + W(1, -1099552212, 993905065, 1012757410, 1024378351) + + W(2, -1102109659, -1100043210, 1026887817, 1003273444) + W(3, 1007787634, -1111552612, 1041322248, 1041989415) + + W(4, -1104965070, -1144755940, 1023396449, -1131966925) + + W(5, 1061982310, 1066879681, -1107386978, 1019447753) + + W(6, 1017560605, -1114649634, -1104769108, -1101238360) + + W(7, -1104448348, 1019550873, 1012244530, 1040107467) + W(8, -1098175974, -1089047102, 1016563929, 1024790159) + + W(9, -1143125556, -1122758108, 1026757617, 1023979343) + + W(10, -1107880053, -1138003290, 1024938353, 1032092801) + + W(11, -1105089779, -1100231891, 1036400101, 1014825186); + WS(-1086002512, -1084928660); + sum1 = + W(0, -1131929465, -1115340892, 1050776738, -1103148388) + + W(1, -1143173743, -1130358353, 1017039401, -1113717074) + + W(2, 1042912513, 1010821235, -1128281895, -1122997746) + + W(3, 1020173741, -1102662114, 1053707114, -1104889757) + + W(4, -1111952748, -1139775729, -1134499377, -1097984585) + + W(5, 1055825787, 1049797700, -1098746549, -1117617116) + W(6, -1129468257, 999020755, -1108349590, 1042555580) + + W(7, -1106170922, 1014563169, -1138890277, -1114393442) + + W(8, 1033511359, 1041826234, -1103706929, 1010736529) + W(9, -1132813939, 1028151894, -1108075378, 1032548919) + + W(10, -1127274842, -1137959865, -1143488833, -1132982017) + + W(11, -1138015505, 1041074464, -1110410462, -1123442568); + sum2 = + W(0, 1000102260, -1118205558, 1051204856, 1041999613) + W(1, -1135930364, 1019347314, -1126633986, 1029900308) + + W(2, 1063980475, 1037162912, -1134402620, -1137379540) + + W(3, -1144291760, -1140439712, 1066576503, -1167793729) + + W(4, 1020225891, 1012525172, -1119827470, 1041420529) + + W(5, -1075398805, -1085093765, -1133429672, -1123883092) + + W(6, 1016232493, 979974721, -1098954833, 1017117707) + W(7, 1028764817, -1139078108, 1023762781, 1006017080) + + W(8, -1114660078, 1033481679, 1018587503, 990744512) + W(9, -1141218312, -1137204884, 1021034547, -1137323924) + + W(10, -1132685152, -1137103964, 1025293286, 1002898232) + + W(11, -1117648930, 1002077480, 1026769102, 1022792204); + WS(-1084377664, 1027078466); + sum1 = + W(0, 1028609881, 1023875764, -1113303893, 1031700430) + W(1, -1138486380, 1025866053, -1129675619, 1032239673) + + W(2, -1114746833, 1026119482, -1122216064, 1016759071) + W(3, 1022038247, 1043647401, -1084547118, 1051850662) + + W(4, -1132199979, 1032834541, 1010908070, 1024809124) + W(5, -1156932707, -1104988345, 1033025459, 1029398137) + + W(6, 1026611885, -1131519215, 1050946557, -1083734174) + W(7, 1043104191, 1007914454, 1030113110, -1128260416) + + W(8, 1047159719, 1027361605, 1018468419, 1021351811) + W(9, -1132403564, 1026951667, 1020650755, -1111325382) + + W(10, 1014159432, 1014779182, 1031201461, -1115829469) + + W(11, 1037768177, 1042797655, -1108759836, 1018395723); + sum2 = W(0, -1123315648, 1034590473, 1026150549, 1030314237) + + W(1, -1113579452, 1014056813, -1139192721, -1139997869) + + W(2, 969235347, -1112534256, -1158492453, -1132289868) + + W(3, -1123875414, -1115134908, 1042477897, 1037120039) + + W(4, -1098184684, 1018097190, 1030816333, 1008365317) + W(5, 1046059603, 1027803789, 1032895251, 1032146261) + + W(6, -1123326315, -1110803030, -1155992274, -1102080708) + + W(7, -1126452160, -1114996104, 1016532474, 1028786615) + + W(8, -1122978967, -1135183209, 1047700729, 1011346781) + + W(9, -1130303816, 1004595129, -1119026545, -1120008811) + + W(10, 999072441, -1115756663, -1131093304, 1015409534) + + W(11, -1111529432, -1109468455, 1047312851, -1122411639); + WS(1043014014, -1087744322); + sum1 = + W(0, 1027952711, -1123526530, 1008337244, 1035059438) + W(1, -1116610857, 1026995059, 1020523582, -1138321214) + + W(2, 1022379422, -1120526792, 1037330895, -1156487121) + + W(3, 1002118409, -1110182129, 1057818171, -1086364127) + W(4, 1040407761, 1009757724, 1021435438, 1032339433) + + W(5, -1110004232, -1118604170, 1040846837, -1153254001) + + W(6, -1138414444, 1035386835, -1083267015, 1057062103) + + W(7, -1107059287, 1021783366, 1003104545, -1137297015) + W(8, 1007303460, 1036507098, -1128420830, 1034169880) + + W(9, 1021955143, -1119534945, -1115695919, 1038869533) + + W(10, 1017909759, -1138765796, 1013303243, -1108462406) + + W(11, 1036022088, 1036993862, -1142792885, 1027514579); + sum2 = + W(0, -1129567658, -1117738234, 1034622765, 1030957051) + W(1, 1029443337, -1132249217, -1156092221, -1131091573) + + W(2, -1128107850, -1118479197, 1005860107, 969559787) + W(3, -1123579911, -1115037144, 1017778197, 1041246295) + + W(4, -1110926783, -1132354551, 1008715269, -1115010115) + + W(5, 1050631618, 1054490255, -1157251077, 1024782459) + + W(6, -1125160256, -1101087826, 1045062017, -1117275788) + W(7, -1108959270, 998415619, 1026524337, 1015586863) + + W(8, -1095615964, 1025836507, 1020928095, 1012990901) + W(9, -1137738801, -1113332277, 1020345131, 1027688491) + + W(10, -1122972204, -1161032699, 1017463077, 1019720419) + + W(11, -1101223712, -1120912313, 983922363, 1011300789); + WS(1054959103, -1083836992); + sum1 = + W(0, -1144415487, 1023853723, -1123173616, -1121737045) + + W(1, -1124541667, 1017937944, -1132171248, -1118146184) + + W(2, 1018672592, -1123041056, -1120856711, -1131928876) + + W(3, -1133053416, 1039313221, -1090265426, -1161038260) + W(4, 1034290206, 1027902624, 980216825, -1107434917) + + W(5, 1057912142, 1053211380, -1109871174, -1129566080) + W(6, 1018609320, 1027331294, 1044087220, -1089253699) + + W(7, 1040602782, -1121689404, 1017404666, -1111685883) + W(8, 1046306952, 1036559366, -1113560292, 1010241568) + + W(9, -1127349353, -1129432820, -1133031712, -1110305609) + + W(10, -1148202051, -1124796708, -1154920122, -1126004808) + + W(11, 1039769364, 1035028498, -1109624712, -1127304152); + sum2 = W(0, 1018338338, -1110884586, -1136808221, 1026570078) + + W(1, -1136194357, -1120452457, -1139755941, -1129406227) + + W(2, -1118232763, 1021052542, 1020321772, 1004896115) + + W(3, 1025801614, -1108237236, -1115176435, -1114736489) + + W(4, 1048907220, -1119060361, -1122001203, 1037408540) + + W(5, -1113269344, 1041519115, 1046652366, -1107310106) + + W(6, 1010171613, 1040327756, -1105808410, 1047951095) + + W(7, 1035402835, 1033649944, -1132321439, -1123391437) + + W(8, -1110685464, -1115014721, -1111631696, -1126977687) + + W(9, 1016232007, -1129086463, -1168436052, -1113536502) + + W(10, 1026410761, 1026056519, 1013259501, -1132299663) + + W(11, 1021765462, -1123780081, -1102273277, 1027695361); + WS(1057903600, 1067139767); + sum1 = W(0, -1130009103, -1107061793, 1043136838, -1102099951) + + W(1, -1115498357, -1123992244, 1012511358, -1111029392) + + W(2, 1028125200, 992918145, -1117969679, -1145160172) + + W(3, -1137761926, -1104154592, 1051222763, -1106189879) + + W(4, -1104467697, -1125356943, -1124300975, -1103367501) + + W(5, 1060113955, 1050079197, -1108729546, -1117739880) + W(6, 1008012526, 1009980758, 1024983063, 1048697267) + + W(7, -1111781863, -1165450354, -1117250069, -1113394087) + + W(8, 1016245011, 1034440698, -1104780916, -1114615608) + + W(9, -1162310274, 1026647906, -1117690736, 1041096574) + + W(10, -1117169584, -1139440358, -1115259538, -1114684710) + + W(11, 1025498192, 1041574755, -1120787335, -1118506516); + sum2 = W(0, 1011962608, 1038855085, -1122245118, -1126451804) + + W(1, -1106947014, 1026864717, -1120699406, -1131692032) + + W(2, -1112627842, -1110442893, 1008646548, -1123527836) + + W(3, 1007214128, 1038467393, -1122221782, 1042136464) + W(4, -1113116412, 999106843, 1026799984, -1112343444) + + W(5, -1106597578, 1054959792, -1109079281, 1011333214) + + W(6, -1145867047, -1113849522, 1026356645, 1031831390) + + W(7, -1109881757, -1117815384, 1029224075, -1138735380) + + W(8, -1114988845, 1046305460, -1109725169, 1032922020) + + W(9, -1116434980, -1120001434, 1020413259, 1008343524) + + W(10, -1123390380, -1119479700, 1022659583, -1118784264) + + W(11, -1123194990, 1047204017, -1114571313, 1000599735); + WS(-1101058110, 1058505899); + sum1 = W(0, 1008909245, -1123852394, 1037579744, 1024016996) + + W(1, -1121096497, 1022516663, 1015324303, -1112299044) + + W(2, 992056181, -1124723744, -1131134189, -1130344395) + + W(3, -1151491221, -1128516275, -1098678002, 1056678303) + + W(4, -1109419958, 1021039583, -1139701245, -1102217815) + + W(5, 1045087960, 1021619781, -1098726544, -1132041247) + + W(6, 1009250957, -1104833467, 1058072040, -1095085849) + + W(7, -1109643932, -1140161581, 1031005836, -1113648843) + + W(8, 1036986521, 1041104615, -1121889031, 1026848535) + + W(9, -1131857944, -1119585353, 1024521495, -1129179587) + + W(10, -1127292144, -1125244995, 1009310828, -1121962739) + + W(11, 1032839164, 1025292595, 1017031326, 1005622747); + sum2 = W(0, 992821683, 1023078017, 1023704638, -1112719649) + W(1, 1027637582, 1021903376, 1017011277, -1140746852) + + W(2, -1139829185, 1034266306, -1119668356, 1016759855) + W(3, 1011814063, 959773689, -1107874815, 1032357888) + + W(4, -1113625790, 1034398452, 999390943, -1112338116) + + W(5, -1113377165, 1057654961, -1086342498, 1051594315) + + W(6, -1121326865, 1035095219, -1108229047, 1012152366) + + W(7, -1101720659, 1035110699, -1128713872, 1024063493) + + W(8, 1033653422, -1122811174, -1136544465, 1031049449) + + W(9, -1144442308, 1023948090, -1133039950, 1020168485) + + W(10, -1121720102, 1018271190, -1138094133, 1032024680) + + W(11, -1140161389, -1113617432, 1019370668, 1021410443); + WS(-1098338111, 1023498750); + sum1 = + W(0, -1138701849, -1121510465, 1040383254, 1010706669) + W(1, -1149170878, 1021863397, 1022617405, -1112416999) + + W(2, 1041395124, -1110248019, 1020223099, 1016227961) + + W(3, -1168316434, -1180399652, -1097293461, 1058209828) + W(4, -1106291545, 1018489101, 989875557, 1037491593) + + W(5, -1094988553, -1095385553, 984962665, 1021609037) + W(6, 1014043241, -1102495433, 1059563452, -1097437690) + + W(7, -1119747464, -1145092370, 1028694643, -1121884733) + + W(8, -1118903112, 1046085501, -1122110350, 1026243438) + + W(9, 1012653195, -1122132512, 1027507886, -1130301425) + + W(10, -1123237039, 992349061, -1123740578, 1036415429) + + W(11, -1126796061, -1128488725, 989067449, -1164474953); + sum2 = + W(0, -1164068108, 1029420636, -1112077059, -1110964317) + W(1, 1028276360, -1148255859, -1120898035, 1036981221) + + W(2, -1106651210, -1141413971, 1028557670, -1129246253) + + W(3, 1013829433, 1035658823, -1106432341, 1035230257) + W(4, 1017251513, -1131530425, 972583599, 1039879187) + + W(5, -1108370344, 1044568046, 1026800348, -1126980980) + W(6, 1016837545, -1102894380, 1027609202, 1041920264) + + W(7, -1124056839, -1121785123, -1128855117, -1128781606) + + W(8, 1035930993, -1110600858, 1023713154, -1124361549) + + W(9, -1120505887, 1013125305, 1026372950, -1125837008) + + W(10, -1132458450, 1009116645, -1130000643, 1008550341) + + W(11, 1017927697, 1019426133, -1129712212, -1127748642); + WS(1064075168, -1085260633); + sum1 = + W(0, 1020097830, -1104011171, 1041894009, 1034297780) + W(1, -1113914242, -1138151419, 1004279127, -1113516590) + + W(2, 1036855277, -1106861493, 1031661466, -1151789197) + + W(3, 1028112237, -1103036207, 1045116105, -1112331770) + + W(4, 1017072798, -1129921062, 1026532451, -1102348791) + W(5, 1027716980, 1058153819, -1100287056, 1026370483) + + W(6, 961537748, -1120389361, -1096376936, 1043898973) + W(7, -1119328440, 1025128111, -1130706656, 1038928889) + + W(8, -1096709211, 1048347472, 1032287909, -1140511211) + + W(9, -1135275149, -1129088474, 996846509, -1164071066) + W(10, 1019059671, -1167790389, 994604265, 1031068695) + + W(11, -1102472071, -1118081687, 1040008649, -1140610427); + sum2 = + W(0, 1014633478, 1033869831, -1114935893, -1111281510) + W(1, 1016908923, 990649086, -1138053524, -1133342724) + + W(2, -1126366588, -1128243618, -1145483991, 996067150) + + W(3, -1140130516, 1003291347, 1043822142, -1107071420) + W(4, 1006526455, 1012165262, -1120104172, 1033872317) + + W(5, -1086850225, -1084734921, 1045857736, -1119271334) + W(6, 1012698026, 1006625651, 1030145358, 1067004758) + + W(7, 1020093203, -1129772456, -1123853902, -1121932314) + + W(8, 1040015383, 1046081705, -1118176982, -1144422823) + W(9, 1013120742, 1004319943, -1150276254, 1002809783) + + W(10, -1161820989, -1141799647, -1133638700, 975983930) + + W(11, 1028724356, 1031930717, -1104669476, -1143148999); + WS(-1102756414, -1120030182); + sum1 = W(0, -1114857721, -1102767115, 1043961809, -1124210446) + + W(1, -1117667780, -1120413918, 1007304745, -1115971707) + + W(2, -1101676399, 1028311347, -1113057893, -1125847632) + + W(3, -1113282502, -1095987354, 1053600405, 1046261656) + + W(4, -1103902228, -1114932345, -1135708169, -1101194087) + + W(5, 1065521342, 1068133511, -1095174540, 1027169042) + + W(6, -1130226572, -1099422340, 1046696200, 1042816511) + + W(7, -1101926052, -1125196828, -1115825727, -1109693396) + + W(8, 997946179, -1098872988, 1020822452, -1114420141) + + W(9, -1142173365, -1122657804, -1112668237, -1133742993) + + W(10, -1113901869, -1121096548, -1136250680, -1100198174) + + W(11, 1025742970, -1113205915, -1140085511, -1110338975); + sum2 = + W(0, 1022430051, -1119384349, -1127804673, 1011315171) + W(1, -1121146859, 1009328259, -1126993785, -1117046041) + + W(2, 1014745875, -1106680506, 1009189211, -1125156477) + + W(3, 1027244407, -1113440146, -1129639049, 1020590601) + + W(4, -1115604020, 1000906166, -1136699515, -1099757367) + + W(5, 1065124465, 1034863647, -1111752578, 1017063165) + W(6, -1115987625, 1038214736, -1113943514, 1035633573) + + W(7, -1124061319, -1117062841, 1024283610, -1152620459) + + W(8, -1130768777, -1116743921, -1120130033, 1024425511) + + W(9, -1120680273, 1013074835, -1113854522, -1127682237) + + W(10, -1148961286, -1119191933, -1137060371, 1015902709) + + W(11, -1112590762, 1012706011, -1113078716, 1024105421); + WS(-1077988040, -1098609713); + sum1 = W(0, 1020152245, 1040202093, -1114910389, -1104283732) + + W(1, 1039298438, -1125387021, 1002836371, 1027276515) + W(2, 1037438449, -1105856183, 1028081393, 1013826369) + + W(3, -1132015209, 1049452385, -1100627367, -1098108347) + + W(4, 1024125142, 1018674229, 1010566313, 1032875267) + W(5, 1030654167, -1102427678, -1131705423, 1017725301) + + W(6, 1010053945, 1036663212, -1113362709, -1104090280) + + W(7, 1042947115, -1141124531, 1020486319, 1034908465) + W(8, -1095852652, 1048934265, 1019783717, 1015682181) + + W(9, 1030571159, -1114877050, 1025947458, -1126406169) + + W(10, 1021770278, 1006527587, -1132252076, 1038229775) + + W(11, -1105166249, -1138504825, 1035155325, 1016700365); + sum2 = W(0, -1142267837, -1132626695, 1023852808, 1039691642) + + W(1, -1114839167, -1147709133, -1139598567, -1138132903) + + W(2, 1033876712, -1110747637, -1127924867, -1155304986) + + W(3, 967895252, -1131100139, 1012220303, 1061640184) + W(4, -1122160974, -1121532798, 1008554815, 1032537913) + + W(5, -1095058264, 1037101696, 1049832068, 992067354) + + W(6, -1145406733, -1112410791, -1110252153, -1091888991) + + W(7, 1027903240, -1128735955, 1024473654, 1023361695) + + W(8, -1104029741, -1161200181, -1126050715, 1025251228) + + W(9, -1120792990, -1130141475, 1031843465, -1119701362) + + W(10, -1132864167, -1157362170, 1020245499, 1015868043) + + W(11, -1196949327, 977066218, -1118663498, 1009680879); + WS(1050097375, -1144620389); + sum1 = W(0, -1128715377, 1044211901, -1107032850, -1104047251) + + W(1, 1044522647, -1128884681, 1011057731, 1033637193) + W(2, 1022227585, 1028225817, 1008625791, 1011579579) + + W(3, -1134438475, 1048874276, -1096643663, -1092741994) + + W(4, 1044273989, 1018667761, 1019193873, 1034983634) + W(5, -1114392598, 1036584266, -1113959235, 1025301657) + + W(6, 1022275225, 1042543166, -1092702793, 1025153498) + W(7, 1042105869, 1024565397, 1009602711, 1017343103) + + W(8, -1097617495, 1028276325, 1041046056, -1123355105) + + W(9, 1032927683, -1149239594, -1139445891, -1142331733) + + W(10, 1025445761, 1027058603, -1136253330, 1037918654) + + W(11, -1097624368, -1118553533, 1045159742, 1015982985); + sum2 = + W(0, -1125113091, 1033296420, 1004274749, -1102915066) + W(1, 1028147108, 1017918867, -1172679141, -1128383915) + + W(2, 1016688407, 1037338868, -1144981581, 991135609) + W(3, -1152889753, 1019343075, -1103752812, -1089888071) + + W(4, 1030353331, 1022111055, -1126905475, 1031861037) + + W(5, -1097163724, -1090194983, -1121675098, -1117974458) + + W(6, 1006649294, 1038268779, 1062746712, 1041005261) + W(7, 1019962267, 1026630548, -1117488938, -1113645001) + + W(8, 1051715314, -1118523722, 1006661278, -1115156997) + W(9, 1019337735, 1028739248, -1124587947, 1027501384) + + W(10, 1023891692, 1018829507, -1172252645, -1120621430) + + W(11, 1035778038, -1154227385, 1013440998, -1136345798); + WS(-1098112447, -1125216946); + sum1 = + W(0, 1010417568, -1112042689, 1004161984, 1041397655) + W(1, -1114418485, 1021110568, 1006322176, -1119953952) + + W(2, -1112614584, 1018267345, 1024614191, -1137912440) + + W(3, -1140685064, -1116450322, -1090400895, 1058507679) + + W(4, -1104618697, -1127130192, 1017991280, -1112784281) + + W(5, -1113885864, 1050855349, 1027345269, 1019594896) + + W(6, -1126853432, -1105219289, 1051228911, -1097135921) + + W(7, 1037685358, -1116355204, -1146614696, 1023451023) + W(8, -1126136276, -1122997076, 1039454784, 987030015) + + W(9, 1004323364, -1153582112, 1016683168, -1149231824) + + W(10, -1140802306, 988441407, 1019294567, -1110071894) + + W(11, 983864831, 1012208560, 1030420791, -1149650752); + sum2 = + W(0, 1035141604, -1152950404, -1100547860, -1104792229) + W(1, 1037875812, -1138078871, -1134943159, 1010887850) + + W(2, 1025641276, -1119115361, 1021611837, 1016878804) + + W(3, 1031353634, -1122370025, -1101375945, -1100366049) + + W(4, 1015511489, 1015482099, -1120750640, -1101926585) + + W(5, 1057546844, 1042205116, -1109199537, -1140091328) + W(6, 1025254666, -1104605825, 1048526282, 1042952063) + + W(7, -1105787312, 1032201266, -1114509439, 1035852377) + + W(8, -1108641700, 1039483674, -1109299079, -1132053601) + + W(9, 1028756554, -1114959163, 1033576762, 1030776026) + + W(10, -1143994351, 1007578680, -1113538005, -1148680422) + + W(11, 1037895648, 1041006229, -1107406256, -1124574444); + WS(1027823864, 1049081066); + sum1 = W(0, 1012131718, 1045092167, -1108779609, 1031292119) + + W(1, -1168425160, -1123848398, -1130128499, 1032126573) + + W(2, -1127539283, 1050389010, -1113259988, 1017365039) + W(3, 1020918007, 1043895467, -1101697729, 998802811) + + W(4, 1036534559, 1015583683, -1147020173, 1034108246) + + W(5, -1094495268, -1089568357, 1026355631, -1120941186) + + W(6, 1027080278, 1035993776, 1047905888, -1096020979) + W(7, 1044370080, 1024649726, 1020448605, -1104998342) + + W(8, 1057437086, -1097851474, -1112197645, -1123264842) + + W(9, 1012408472, -1129990263, 1041161122, -1105719893) + + W(10, 1035394325, 1027345300, 1024273997, -1123698278) + + W(11, 1052750589, -1101687913, -1103284196, 966350543); + sum2 = + W(0, 1023788251, -1115639872, 1042970848, 1041100183) + W(1, -1120506242, -1214633659, 982227227, -1150596845) + + W(2, 1046665761, 1053945290, -1121383639, -1143798279) + W(3, 1006064903, 1015277390, 1037025188, -1128807740) + + W(4, 1017634434, 1023282498, -1119196045, 1006169559) + W(5, -1080187678, -1078236510, 998104205, -1114831851) + + W(6, 1022374646, 1034991246, 1047303977, 1053440142) + W(7, 1037533712, 1023435593, -1139981943, -1110295858) + + W(8, 1052132899, 1058969577, -1112892146, -1124500500) + W(9, 1006364327, -1148612007, 1033799186, 1029728171) + + W(10, 1033828190, 1015376522, -1130167410, -1131776900) + + W(11, 1035867784, 1005561207, -1110685126, 1014287051); + WS(-1088189216, 1043089281); + sum1 = + W(0, -1140748743, 1049770738, -1088213532, 1042644994) + W(1, 1041481493, 1008330103, -1121398410, 1041680407) + + W(2, -1096476823, 1047024381, -1107153702, 1031833588) + W(3, 1026065228, 1048806759, -1084369379, 1050638745) + + W(4, 1035104215, 1020682979, -1149048846, 1043836791) + W(5, -1108723571, -1101872740, 1041455384, 1026205458) + + W(6, 1020127051, 1034371336, 1036745881, -1094226627) + W(7, 1040593116, 1006701623, 1036138263, 1024770968) + + W(8, 1041309981, -1096464492, 1045395982, -1120876186) + + W(9, -1128555260, 1037337862, 1011670631, -1106071481) + + W(10, 1040128941, 1024336228, 1038047047, -1137213911) + + W(11, 1028379642, -1102959693, 1016152290, 1028740542); + sum2 = + W(0, -1129618765, 1028575755, 1018469269, -1109549862) + W(1, 1022763469, -1123897489, 1004169862, -1114659435) + + W(2, 1020493837, 1025826707, -1116607191, -1153284395) + + W(3, -1163586391, 1025093243, -1120959857, 1018231561) + + W(4, 1017295613, -1131222849, 1012667011, -1110197183) + W(5, 1045602812, 1050121196, -1110473213, 1019030581) + + W(6, 1004789414, -1140439179, -1119013866, 1009644755) + + W(7, -1143499366, -1125130849, 1006867267, -1110600679) + + W(8, 1007539419, 1038682513, -1107944702, 1009132883) + W(9, -1148564598, 1019765437, -1126956769, 1017107081) + + W(10, -1123266847, 1006886939, 1023888443, -1106146141) + + W(11, 1005311510, 1040899502, -1114206671, -1127991173); + WS(-1082596160, 1043517696); + sum1 = + W(0, 1028909798, -1154689545, -1104169149, 1025985531) + W(1, 1029418231, 1024711058, -1153492953, 1032486047) + + W(2, -1117361518, -1118729126, 1034798166, -1125485751) + W(3, 967933898, -1128767583, 1049441299, 1031994846) + + W(4, 1006099469, 1008177302, 1019116907, 1037703496) + W(5, -1087176649, -1089391227, 1046438773, 986175666) + + W(6, -1132218099, -1115978788, -1115448907, 1056185125) + + W(7, -1106352341, -1125946755, -1129844133, 1027446332) + W(8, 1018413135, 1032249225, 991686873, 1030151438) + + W(9, 1011144392, -1146849277, -1154137305, 1036574828) + + W(10, -1131200252, 1006963806, 999709323, -1114471573) + + W(11, -1130624603, 1042483386, 1022706506, 1019997155); + sum2 = W(0, 987806561, -1103978637, 1039699877, 1032745921) + W(1, -1106709297, 1017765222, 1024001581, -1138508200) + + W(2, -1109586411, 1036006171, 984628641, -1151113585) + + W(3, -1132313544, -1113576691, -1109697688, 1041044376) + + W(4, -1135869680, -1128136972, -1138298076, 1037869389) + + W(5, 1004783368, 1057490671, -1123523352, -1126668402) + + W(6, 1003342504, 1041829747, -1101655248, -1120283284) + + W(7, 1037905909, -1142518888, -1131321664, -1102361734) + + W(8, 1023850463, -1118937466, -1133053924, -1119975873) + + W(9, 1015369606, 995389041, -1123567230, -1137071480) + + W(10, 1008345900, 1015435786, 1016585830, -1103350916) + + W(11, 1033013495, 1023653113, -1123775069, -1153724113); + WS(1066487464, -1081148228); + sum1 = + W(0, -1156758047, 1045622655, -1121579186, 1016497454) + W(1, 1026804003, 1025331662, -1115667101, 1039828621) + + W(2, 1016276052, 1034243041, -1129971954, 1022570928) + W(3, 1032245054, 1043227835, -1107379682, -1125065087) + + W(4, 1036683903, 1033790001, -1120457266, 1051174634) + W(5, -1081882686, -1081200961, 1050524446, 950141917) + + W(6, 1025970038, 1038187760, -1114502289, -1121918554) + W(7, 1033938044, 1035886143, 1028999903, 1035936180) + + W(8, -1110627634, -1121754318, 1045144826, -1123227402) + + W(9, -1129094085, 1028125692, 1032926021, -1138807120) + W(10, 1028558202, 1023360168, 1031685286, 1038703027) + + W(11, -1130240468, -1128847308, 1036935449, 1033245399); + sum2 = W(0, 990406129, 1013162021, -1111903383, 1031481662) + W(1, -1112035485, 1026146121, -1109318105, 1040565489) + + W(2, -1098989385, 1036428343, -1111376696, 1020848344) + + W(3, 1032976305, -1125670617, -1114873385, 1043786440) + W(4, 1007686716, 993596601, -1108583903, 1041812300) + + W(5, 1042303391, 1039454897, 1044627344, -1114987237) + W(6, 1009651516, -1123723867, 1001920896, 1032603577) + + W(7, -1107723593, 1030752081, 1027268958, 1031967357) + + W(8, -1113158574, -1097549253, 1043104932, -1112152994) + + W(9, -1109295843, 1033460548, 1015358203, -1117993943) + + W(10, -1142055788, -1128311189, 1034160517, -1113698315) + + W(11, 1032025507, -1119346601, -1111706149, 1024170945); + WS(-1085700080, -1080808385); + sum1 = + W(0, 1024296914, -1130852634, -1113008209, 1037784580) + W(1, -1128041639, 1011155704, -1122227946, 1020782261) + + W(2, 1011762792, -1106441949, 1023563097, 1007950112) + W(3, -1137292464, 1018157624, -1132968658, 1034492712) + + W(4, 1002605936, -1130475172, 1023737634, 1000516328) + W(5, -1126768286, -1096045179, 1048917408, 1027876850) + + W(6, -1114666035, 1007198528, -1104353680, 1044579508) + + W(7, -1126595297, -1148910448, 1017074878, 1034334952) + + W(8, -1108931914, 1035021791, -1127030516, 1030237498) + + W(9, -1116342907, 1028012332, -1128335092, 1016641544) + + W(10, -1124799637, -1178616327, 998628462, 1030076118) + + W(11, -1106440695, 1037317931, -1122557970, 1026212766); + sum2 = + W(0, -1127545645, 1009004191, 1015771798, -1131692274) + W(1, 1014637794, 996126556, 1018138398, -1136885460) + + W(2, -1151865619, -1125888003, 1023581282, 1018938725) + + W(3, -1144042592, -1141392422, -1107745249, -1091675886) + + W(4, 1057331451, -1136255574, 999025130, 1032831862) + W(5, -1097510643, -1072938398, 1076041086, -1112160457) + + W(6, -1139402988, 1017820345, -1117369881, -1091916978) + + W(7, 1056314077, -1150817344, -1150259805, -1138954980) + + W(8, 1017078443, -1117354278, 1032772879, -1138128772) + W(9, 985356315, 1013413304, -1132039248, -1124163047) + + W(10, 1020965023, 1018397555, -1133933532, -1164078621) + + W(11, -1132951491, -1138824868, 1026258229, 985080995); + WS(1065410184, 989310727); + sum1 = W(0, -1129262375, -1109321255, 1036945010, 1026154888) + + W(1, -1134197844, -1125355007, -1140125102, -1114916286) + + W(2, 1039766830, -1115626794, -1121887434, 1012320294) + + W(3, -1116437485, -1113105487, 1017194412, 1060001058) + + W(4, -1094555822, -1137406030, -1133156750, -1103994248) + + W(5, 1046741097, 1017259310, -1114897776, -1133486286) + + W(6, 1013595422, -1113291025, 1059311888, -1103200016) + + W(7, 1023750749, -1124720479, -1140436482, -1135877737) + + W(8, -1110004779, 1018378495, -1113774366, -1115411390) + + W(9, 1001232640, 1027066925, -1131666807, -1131905035) + + W(10, -1124072268, 1004266540, -1120957855, 1020121135) + + W(11, -1115618446, -1127100975, -1116648163, -1123146591); + sum2 = W(0, -1134742142, 1015903261, 1020154303, -1137672551) + W(1, 1024853570, 1005131169, 994239369, 1014594226) + + W(2, -1150882457, 1023023759, 1017377705, -1125421078) + + W(3, -1134258278, -1129761964, 1022217883, 1027518631) + + W(4, -1148789809, 1001175413, -1126643555, 1031995313) + + W(5, 1040302074, -1097618001, 1026258033, -1138047636) + + W(6, -1124787402, 1009465920, 1049285742, -1098762324) + + W(7, -1132512970, -1148246653, 1015413679, 1021296491) + + W(8, 1029784509, -1122992412, 1015729459, 1016986651) + + W(9, 991423945, -1131866907, -1135790753, -1126884057) + + W(10, -1130065044, -1142203369, 1010959842, 1022764367) + + W(11, -1122024941, -1118740892, 980872325, 992745521); + WS(1051937311, 1019742014); + sum1 = W(0, -1128733562, -1110586220, 1044317379, 1034449865) + + W(1, -1129053661, -1126315858, 997229903, 1007594774) + + W(2, -1115449474, 1040493967, -1122019556, -1118602611) + + W(3, 1023734487, -1114376035, 1058430122, -1106892452) + + W(4, -1137597924, 1007433460, -1116159949, -1126695312) + + W(5, -1131615423, -1096043495, -1114653189, -1115826781) + + W(6, -1132293538, 1032525373, 1028795565, 1048571437) + + W(7, -1104742917, 1027349977, -1139661928, -1154941499) + + W(8, 1043036192, -1110832404, -1106286569, 1018237258) + + W(9, -1123545457, 1019369518, -1111719346, 1031893623) + + W(10, -1118024837, -1123671919, 1016780849, 1026460481) + + W(11, -1122201669, 1016066306, -1121789868, 1018711058); + sum2 = W(0, 1008400273, -1127535498, -1110432262, -1120718262) + + W(1, -1113670226, 1025653041, 1016157529, -1127740478) + + W(2, -1101104373, -1108362087, -1146032407, -1134925453) + + W(3, -1144490357, 1041994790, -1088501039, 1042410198) + + W(4, -1132649478, 1011207517, -1138058389, 1049438349) + + W(5, 1056816205, -1105949033, 1045816390, -1153231998) + + W(6, -1125392389, -1105215135, 1056199589, -1108549667) + + W(7, -1122823248, -1127906971, -1130565626, -1113276412) + + W(8, 1025802623, 1029274599, -1139374331, 1000306913) + W(9, 965128306, -1135958083, 1003347845, -1152613734) + + W(10, -1123972337, -1157554354, -1135290574, -1114929610) + + W(11, 1003318865, 1031964529, 1019133207, -1130500213); + WS(-1117640696, 1034706864); + + return clamp(mstd0 + 5.0 * vsum / wsum * mstd1, 0.0, 1.0); +} + +shared float inp[507]; + +#define CURRENT_PASS 1 + +#define GET_SAMPLE(x) dot(x.rgb, rgb2y) +#define imageStore(out_image, pos, val) imageStoreOverride(pos, val.x) +void imageStoreOverride(uint2 pos, float value) { temp[pos] = (value); } + +#define INPUT_tex(pos) GET_SAMPLE(vec4(texture(INPUT, pos))) +static const float2 INPUT_size = float2(GetInputSize()); +static const float2 INPUT_pt = float2(GetInputPt()); + +#define HOOKED_tex(pos) INPUT_tex(pos) +#define HOOKED_size INPUT_size +#define HOOKED_pt INPUT_pt + +void Pass1(uint2 blockStart, uint3 threadId) { + ivec2 group_base = ivec2(gl_WorkGroupID) * ivec2(gl_WorkGroupSize); + int local_pos = int(gl_LocalInvocationID.x) * 13 + int(gl_LocalInvocationID.y); + for (int id = int(gl_LocalInvocationIndex); id < 507; id += int(gl_WorkGroupSize.x * gl_WorkGroupSize.y)) { + uint x = (uint)id / 13, y = (uint)id % 13; + inp[id] = + HOOKED_tex(HOOKED_pt * vec2(float(group_base.x + x - (3)) + 0.5, float(group_base.y + y - (2)) + 0.5)).x; + } + barrier(); + vec4 ret = vec4(0.0, 0.0, 0.0, 0.0); + vec4 ret0 = vec4(0.0, 0.0, 0.0, 0.0); + vec4 samples[12]; + samples[0][0] = inp[local_pos + 0]; + samples[0][1] = inp[local_pos + 1]; + samples[0][2] = inp[local_pos + 2]; + samples[0][3] = inp[local_pos + 3]; + samples[1][0] = inp[local_pos + 4]; + samples[1][1] = inp[local_pos + 5]; + samples[1][2] = inp[local_pos + 13]; + samples[1][3] = inp[local_pos + 14]; + samples[2][0] = inp[local_pos + 15]; + samples[2][1] = inp[local_pos + 16]; + samples[2][2] = inp[local_pos + 17]; + samples[2][3] = inp[local_pos + 18]; + samples[3][0] = inp[local_pos + 26]; + samples[3][1] = inp[local_pos + 27]; + samples[3][2] = inp[local_pos + 28]; + samples[3][3] = inp[local_pos + 29]; + samples[4][0] = inp[local_pos + 30]; + samples[4][1] = inp[local_pos + 31]; + samples[4][2] = inp[local_pos + 39]; + samples[4][3] = inp[local_pos + 40]; + samples[5][0] = inp[local_pos + 41]; + samples[5][1] = inp[local_pos + 42]; + samples[5][2] = inp[local_pos + 43]; + samples[5][3] = inp[local_pos + 44]; + samples[6][0] = inp[local_pos + 52]; + samples[6][1] = inp[local_pos + 53]; + samples[6][2] = inp[local_pos + 54]; + samples[6][3] = inp[local_pos + 55]; + samples[7][0] = inp[local_pos + 56]; + samples[7][1] = inp[local_pos + 57]; + samples[7][2] = inp[local_pos + 65]; + samples[7][3] = inp[local_pos + 66]; + samples[8][0] = inp[local_pos + 67]; + samples[8][1] = inp[local_pos + 68]; + samples[8][2] = inp[local_pos + 69]; + samples[8][3] = inp[local_pos + 70]; + samples[9][0] = inp[local_pos + 78]; + samples[9][1] = inp[local_pos + 79]; + samples[9][2] = inp[local_pos + 80]; + samples[9][3] = inp[local_pos + 81]; + samples[10][0] = inp[local_pos + 82]; + samples[10][1] = inp[local_pos + 83]; + samples[10][2] = inp[local_pos + 91]; + samples[10][3] = inp[local_pos + 92]; + samples[11][0] = inp[local_pos + 93]; + samples[11][1] = inp[local_pos + 94]; + samples[11][2] = inp[local_pos + 95]; + samples[11][3] = inp[local_pos + 96]; + ret[0] = nnedi3(samples); + ret0[0] = inp[local_pos + 41]; +#if CURRENT_PASS == LAST_PASS + uint2 destPos = blockStart + threadId.xy * 2; + uint2 outputSize = GetOutputSize(); + if (destPos.x >= outputSize.x || destPos.y >= outputSize.y) { + return; + } +#endif + imageStore(out_image, ivec2(gl_GlobalInvocationID) * ivec2(1, 2), ret0); + imageStore(out_image, ivec2(gl_GlobalInvocationID) * ivec2(1, 2) + ivec2(0, 1), ret); +} +//!PASS 2 +//!DESC NNEDI3 (double_x, nns32, win8x6) +//!IN INPUT, temp +//!OUT OUTPUT +//!BLOCK_SIZE 64, 8 +//!NUM_THREADS 32, 8 +#pragma optionNV(inline none) +float nnedi3(vec4 samples[12]) { + float sum = 0.0, sumsq = 0.0; + [unroll] for (int i = 0; i < 12; i++) { + sum += dot(samples[i], vec4(1.0, 1.0, 1.0, 1.0)); + sumsq += dot(samples[i], samples[i]); + } + float mstd0 = sum / 48.0; + float mstd1 = sumsq / 48.0 - mstd0 * mstd0; + float mstd2 = mix(0.0, inversesqrt(mstd1), mstd1 >= 1.192092896e-7); + mstd1 *= mstd2; + float vsum = 0.0, wsum = 0.0, sum1, sum2; +#define T(x) intBitsToFloat(x) +#define W(i, w0, w1, w2, w3) dot(samples[i], vec4(T(w0), T(w1), T(w2), T(w3))) +#define WS(w0, w1) \ + sum1 = exp(sum1 * mstd2 + T(w0)); \ + sum2 = sum2 * mstd2 + T(w1); \ + wsum += sum1; \ + vsum += sum1 * (sum2 / (1.0 + abs(sum2))); + sum1 = W(0, -1120567290, -1132374181, -1132591953, -1125130389) + + W(1, -1117911182, -1119806663, -1121091407, -1126690796) + + W(2, 994153301, 1016607238, -1122316900, -1146864427) + W(3, 1031756856, 1024055745, 1003125923, 1029429758) + + W(4, -1139074345, 992947237, 1053527378, 1046512564) + + W(5, -1093298645, -1112059294, -1120338466, -1110173889) + + W(6, 1021572063, -1137843051, -1096186409, 1056444330) + + W(7, 1051252577, -1109040755, -1148456803, -1113641375) + + W(8, -1117468940, -1125619459, -1144213939, -1138699933) + + W(9, 1023905988, 1033651817, -1133630411, 1032546877) + + W(10, -1119615974, 1000210819, -1121684346, -1129869365) + + W(11, 979248533, -1119537890, -1141776739, -1127458445); + sum2 = W(0, -1126549409, -1119263575, 1019494412, -1124834267) + + W(1, 1007192676, -1122284082, -1127647730, 1010488320) + + W(2, 1022573468, -1114028928, -1116443736, -1099458226) + + W(3, 1017309436, -1118444706, -1121042004, -1109973330) + + W(4, -1140490164, -1119708173, 1032492771, 1055169273) + + W(5, 1044169825, 1039787167, -1145097543, 1044065299) + W(6, -1114833146, 1024108770, 1037187519, 1055452063) + + W(7, -1106256028, -1112035826, -1125070906, -1121131548) + + W(8, 1021805248, -1146392599, 1026983682, -1095922228) + + W(9, -1122158651, -1118290710, -1129575364, -1121253833) + + W(10, 1003196031, -1113990054, 1006796332, -1126677517) + + W(11, 1022777176, -1130573089, -1123455912, 1019346120); + WS(1060265584, 1063714812); + sum1 = W(0, 1021450242, -1123065753, -1137050988, 1021294882) + + W(1, -1118036885, 1009531192, -1118665549, 992320459) + + W(2, -1128788280, 1022311347, 1028928107, -1140362288) + W(3, 1024570351, 1035626828, 1025121435, 1029327365) + + W(4, -1111111528, 999728711, -1119265827, -1137639751) + + W(5, -1101623708, -1106406289, -1128138578, -1106167682) + + W(6, 1039397963, -1108349889, 1026074151, -1102959280) + W(7, 1041760911, 1036057270, 1017790822, 1037788386) + + W(8, -1131322533, 1022720848, 1019796282, 1043907075) + + W(9, -1151514983, -1132552740, -1124857459, -1134343810) + + W(10, 1011253684, 974355898, -1136338948, 1025863841) + + W(11, -1136816500, 1027651305, -1139070668, 1024478285); + sum2 = W(0, 1023758242, -1124053764, 1000956747, -1122894214) + W(1, 999883691, 1004424067, -1150041590, 1009546537) + + W(2, -1130878336, 1017938673, 1028583936, 1031015106) + W(3, 994031846, 999096115, -1134395125, 1005722235) + + W(4, -1120671625, -1145138723, 1005174931, -1104963408) + + W(5, 1001047899, -1126082311, 1002728051, -1135618057) + W(6, 1027498838, 1027873020, 1053869854, 1073183850) + + W(7, 1053107786, 1035733703, 1022225293, 1023923178) + + W(8, -1144315403, -1122179044, -1093535895, -1074622268) + + W(9, -1094361386, -1114468554, -1123867271, -1126165581) + + W(10, -1131041230, -1127336921, 1009416925, 1033668418) + + W(11, 990806038, 992895974, -1131337021, -1138321549); + WS(1067199072, 981674447); + sum1 = W(0, -1113726457, 1018794771, -1115871564, 1008735750) + + W(1, -1125817867, -1125149117, 1001830321, 1016463803) + + W(2, -1105288827, -1113372949, -1095136821, -1102105679) + + W(3, -1103744656, -1108798620, -1137689902, -1099284685) + + W(4, 1040785760, -1099180638, 1050678235, 1052734745) + W(5, 1044281884, 1033282170, -1121192922, 1032013917) + + W(6, 1032552483, 1040483381, 1054762461, 1065065389) + W(7, 1044820043, -1097094388, 1010644366, -1124668651) + + W(8, -1124907206, -1114167068, -1107257499, -1097429016) + + W(9, -1104994292, 1027211226, -1114303237, 1015961570) + + W(10, -1139898486, -1127069135, -1118671794, 1035770473) + + W(11, -1122788302, -1125646899, -1123221796, -1114483455); + sum2 = W(0, -1124538541, -1139313841, -1119374292, 1010830983) + + W(1, 1020827626, -1125616841, 1008596323, -1136528497) + W(2, 1021627528, 989560618, 1014774531, 1026431506) + + W(3, -1118520012, 1018739126, 1014458179, -1129452021) + + W(4, -1127440395, 1028695072, -1102978428, -1087762234) + + W(5, 1027251929, -1109480314, 1023848922, -1132845253) + W(6, 1027300307, 1011050585, 1052523334, 1053318756) + + W(7, -1113197028, 1034265115, -1134832277, 1022117249) + W(8, 1020622605, 999023778, -1119874204, 1038687085) + + W(9, 1029469191, -1125820221, -1159659466, -1150305989) + + W(10, -1130074937, 1015498074, -1126569197, -1128231773) + + W(11, 1018969905, -1123965604, 1024095771, -1130502215); + WS(-1082327904, -1101742629); + sum1 = W(0, -1128942355, 1007179909, -1172666584, -1115398989) + + W(1, -1145393643, -1126910957, -1153678686, -1127439210) + + W(2, 994965062, -1124051394, 1029361427, 1047686461) + W(3, 1028067431, 1025118144, -1121058723, 1018201755) + + W(4, -1116531225, 1022855203, 1044526075, -1095192109) + + W(5, -1123739865, -1116394763, -1123838961, -1120454737) + + W(6, 1027052286, -1119991818, -1110346311, -1106285700) + + W(7, 1043850022, 1030498357, 1032721886, 1034890279) + W(8, -1127603958, 1015495233, 1026992677, 1037065627) + + W(9, -1119388383, 1013662917, -1119902562, 1021249778) + + W(10, 1021969515, -1129777663, 1017142675, -1113404469) + + W(11, -1130059467, 1016457699, -1131255799, 1017348651); + sum2 = W(0, 1014279427, -1131491186, 1026571161, 1042930837) + W(1, 1025279833, 993445038, -1133457551, 1014707171) + + W(2, -1130890464, -1137235679, -1097554196, -1073378768) + + W(3, -1092458255, -1130245298, -1120075373, -1135266971) + + W(4, -1129394348, 1024729347, 1048952496, 1073588633) + W(5, 1053816664, 1029166823, 1030737081, -1151431678) + + W(6, 1014973315, -1130557096, 1014221291, -1105375875) + + W(7, 1016092170, -1119905200, -1147013927, -1161525308) + + W(8, -1152876382, -1150339726, 1016692910, 1035354953) + + W(9, -1129170378, 1027382919, -1124802440, 979085751) + + W(10, 1004833335, -1141673719, -1159625756, -1124590261) + + W(11, 989537980, -1138326931, 1017200998, 1009604643); + WS(1067891072, -1132872541); + sum1 = W(0, 1025237873, 1014334757, 1030238795, 1029025473) + W(1, 1007260181, -1121222990, 988616634, -1123834925) + + W(2, -1122834636, 1020114356, -1105197551, -1121917372) + + W(3, 1038150728, 1024596920, 1024170379, 1015271403) + + W(4, -1117007553, -1118569017, 1049984500, -1114461425) + + W(5, -1084792932, 1039495098, -1124531763, 1027254009) + + W(6, -1114151507, 976917621, -1088419628, 1051488823) + W(7, 1053317187, 987986858, 1026119523, 993078101) + + W(8, 1031366707, 1039451348, 1049092386, 1008484089) + W(9, -1122288663, -1131993235, 1022258228, 999667975) + + W(10, 984935338, -1152616053, -1123762161, -1145922699) + + W(11, 1012164149, 1000937675, 1011615629, 1004174827); + sum2 = W(0, -1144599930, -1136232721, -1137221455, -1128645029) + + W(1, -1151231836, -1156748756, -1160295481, 1020235585) + + W(2, -1116760996, 1019759527, -1111064134, 1041961890) + + W(3, 1036336113, 1033905549, 1022489781, -1122711401) + W(4, 1032730282, -1125055029, 1047170030, 1050767412) + + W(5, -1093680614, -1120368706, -1115425401, -1132924343) + + W(6, 1032901632, 1027655943, -1115058011, -1130649513) + + W(7, -1116185015, -1105887613, 1012694293, -1122854992) + + W(8, 985378521, 1005941018, -1129460922, 1019394239) + W(9, -1115704458, 1024734935, -1147415538, 1018590227) + + W(10, -1129170670, -1131155477, -1129924333, 1022276751) + + W(11, -1148456898, 1015791177, -1140100033, 1012472897); + WS(1059709408, 1024973287); + sum1 = + W(0, -1126012593, 1004611460, -1134152138, -1114032340) + W(1, -1131432537, -1126017195, 991561039, -1124178504) + + W(2, 996494647, -1122880609, 1020165829, 1049657976) + W(3, 1014735450, 1032225804, -1115613273, 1022764985) + + W(4, -1119189544, 1030391200, 1046947367, -1094041084) + + W(5, 1018380112, -1112475533, -1123292160, -1122300512) + + W(6, 1028092109, -1114579692, -1111968183, -1106474499) + W(7, 1044458845, 1030371012, 1033263557, 1034006830) + + W(8, -1124577204, 1016065247, 1002304420, 1040268033) + W(9, -1114168306, 1023640576, -1119951545, 1017080432) + + W(10, 1023428420, -1127475101, 1021721777, -1114564220) + + W(11, -1128430825, 1019190017, -1127717781, 1017178441); + sum2 = W(0, -1125800395, 1011909323, -1116511680, -1103527255) + + W(1, -1120293374, -1148349175, 1015270352, -1125483347) + + W(2, 1024962708, -1143341847, 1052819438, 1076690943) + W(3, 1057154431, 990717342, 1025045202, 1023577182) + + W(4, 1023886172, -1144213999, -1097320166, -1072687587) + + W(5, -1091630497, 1012280135, -1118805022, 1016249338) + + W(6, -1122338700, 1018807292, -1115186882, -1098249874) + + W(7, -1117298851, 1010582795, 990164302, -1125194137) + + W(8, -1171853367, 1000330119, -1140479659, 1023038428) + + W(9, 1029135274, -1122270538, 1020995472, 1003973863) + W(10, 973576887, 984068764, 1001426319, 1007326739) + + W(11, -1135413483, 1008233815, -1129534965, -1140102471); + WS(1066253200, 1009489111); + sum1 = W(0, -1121073890, 1024085178, -1130104696, 1023275236) + + W(1, -1128214764, -1135799996, -1141685621, -1121776782) + + W(2, -1102592607, -1107707469, -1106598971, -1116780301) + + W(3, -1111680448, 1032050668, -1131519352, 1028096678) + + W(4, 1041243549, 1026388586, -1121496677, 1049328440) + + W(5, 1018012708, -1096674093, -1122519370, -1101864235) + + W(6, 1033075644, -1107162241, 1050587318, 1057262167) + W(7, 1027096831, 1040843700, 1028580820, -1117086438) + + W(8, -1123366116, 1004872905, -1113976447, -1116780079) + + W(9, -1113850464, 1015552212, -1123000331, 1040749648) + + W(10, -1130535196, -1145989825, -1120961954, 1023066500) + + W(11, -1121521086, 1008378152, -1124335656, -1135644600); + sum2 = W(0, 1013104936, -1117172679, -1127525498, -1135146700) + + W(1, -1122718205, 1027187072, -1119344027, -1128814570) + + W(2, -1106333857, -1121647283, 1031691189, 1030458550) + + W(3, -1111791784, 1009508096, -1127767754, 1037784205) + W(4, 1041445982, 1046293466, 1054977467, 1051999059) + + W(5, 1044523088, -1099681845, -1185033988, -1107269301) + + W(6, -1143812784, -1098323478, 1032669672, 1016608418) + + W(7, -1093831562, 1044831040, -1117227205, -1118967703) + + W(8, -1111423698, 1025469214, -1110723238, 1041509878) + + W(9, 1024902469, -1110045970, -1129401382, -1121987113) + + W(10, -1153458272, -1123006845, 1018478818, -1111394764) + + W(11, -1127833490, -1140396324, -1129041118, 1021194206); + WS(1055988095, 1068562120); + sum1 = W(0, 1025054956, -1130996743, 1024941510, 1026193148) + W(1, 1035977616, 1028839961, 1016648336, 1025665319) + + W(2, 1041692938, 1036197410, 1042434277, 1039706891) + W(3, 1036807045, 1029783554, 1019008523, 1026886128) + + W(4, 1040251631, 1032351834, -1100356972, -1093055992) + W(5, 1047058383, 1043491547, 1044781893, 1048991774) + + W(6, -1141880069, 1043619883, 1026325313, -1087193164) + + W(7, -1087410536, -1097265155, -1104034167, -1099060796) + + W(8, -1113980711, 1002392085, 1040781794, 1032223740) + W(9, 1047196369, 1027612260, 1036828166, -1113322870) + + W(10, 1011769695, 1020511427, -1124414423, -1163338101) + + W(11, 1015241743, -1129538215, 1018634427, -1180507092); + sum2 = W(0, -1109623534, -1119308996, -1108667787, -1107757858) + + W(1, -1126585969, -1144042093, 1004201965, 1024608852) + + W(2, -1098330057, -1121926087, 1031129408, -1111457821) + + W(3, -1091241820, -1092220222, -1112242725, -1104308532) + + W(4, 1051762285, 1045894429, 1029096148, 1060518836) + W(5, 1065480819, -1120268316, 1035423856, -1105721536) + + W(6, -1105318233, -1111281216, -1116694436, -1103134861) + + W(7, 1017373783, 1034184394, -1129342463, -1134873838) + + W(8, -1120494292, 1002875661, 1042501069, -1104320409) + + W(9, 1041202422, -1131983911, 1023586732, 1017105251) + + W(10, 1036873688, -1152598618, -1117793653, 1023528108) + + W(11, -1117516356, -1123122827, -1131565835, 1015347387); + WS(-1073915832, -1098883962); + sum1 = W(0, 1030932360, -1131602112, -1125999684, 1018154928) + + W(1, -1122265980, -1122315861, 1018577993, -1120663220) + + W(2, 1024626915, 1032898976, -1122370130, 1011274315) + + W(3, -1113904235, 1029902191, -1115348785, -1111387910) + + W(4, -1098288699, -1117814224, 1056014501, -1106175819) + + W(5, -1097956311, -1115232133, -1126206816, 1017122848) + + W(6, -1130380922, -1103847418, -1096397881, -1105327485) + + W(7, 1059753579, 1040451325, 1039068637, 1042824131) + W(8, 1033018229, 1040490540, 1031863906, 1044317365) + + W(9, -1098424101, -1122968848, -1136273729, 1021433455) + + W(10, 1021355752, -1120290302, -1131922448, -1139369119) + + W(11, -1121102372, 1033247800, -1121007738, -1143567007); + sum2 = W(0, -1118315643, -1126395193, 1014636591, -1138413531) + + W(1, 1013622247, -1129252552, -1122713894, -1131632742) + + W(2, 1046909717, 1025514844, 1026986728, -1112879553) + + W(3, -1122377333, -1114813410, -1144089687, -1140190295) + + W(4, -1100980148, -1112473945, 1040985677, 1027746798) + + W(5, 1051150943, 1057006779, -1138866101, 1035155819) + + W(6, -1129801877, 1030594060, -1101816290, -1094641835) + + W(7, 1041324898, -1106485598, -1115757412, 1016695560) + + W(8, -1122172234, -1111527676, 1023795758, 1027030278) + + W(9, -1113671456, -1133454616, 1001347783, -1139893847) + + W(10, 1010610423, -1135186433, 1030475382, -1121095046) + + W(11, 1015864126, 999966259, -1127643580, -1124292419); + WS(1058139200, 1067005003); + sum1 = W(0, -1131277347, -1128484819, 1014594990, -1112913457) + + W(1, 1028891109, -1118434446, -1125459884, -1151139539) + + W(2, -1103206155, -1112832909, -1108301118, -1111811582) + + W(3, -1113179152, -1100757638, -1116265771, -1119227733) + + W(4, 1015263811, -1111332237, 1004409248, 1031432468) + W(5, 1057408386, 1053177162, 1035803645, 1052437131) + + W(6, 1048238354, 1044526364, 1056580635, -1114379264) + + W(7, 1025802539, -1104236495, -1124751623, -1121289813) + + W(8, -1106607621, -1104751670, -1107635783, -1107787999) + + W(9, 1020725062, -1114959053, -1129296244, -1120069105) + + W(10, -1122297405, -1124214159, 1017238947, -1110162105) + + W(11, 1002560364, -1113724157, -1123244163, -1115210511); + sum2 = + W(0, -1121057595, 1016432775, -1112629457, 1031151061) + W(1, -1126819952, 1021228732, 1009585899, -1127402608) + + W(2, 1023292260, -1124268922, -1116199054, -1110795130) + + W(3, -1103006120, -1134369449, -1120667087, 1016333862) + + W(4, -1111891368, 1029388268, -1123843875, 1054055516) + W(5, 1020478730, -1135412321, 993043492, 996548072) + + W(6, 1035766063, -1118389960, 1033023394, 1054507013) + W(7, -1104664187, -1121918429, 982538191, -1108029597) + + W(8, 1032208606, -1122510207, -1113138713, 1019595258) + W(9, -1114598707, 1023542227, 993709924, -1129671373) + + W(10, -1122161823, 1028529468, -1118001871, 1026811027) + + W(11, -1116707921, 1018790016, -1146185904, -1152045912); + WS(-1091835967, 1038509097); + sum1 = W(0, 1002958335, 1031236696, -1122124314, 1034973544) + + W(1, -1120202292, 1015820538, 1033636218, -1121967836) + W(2, 1041562959, 1038000620, 1042029266, 1034473413) + + W(3, 1040514695, 1042048878, 1029242778, 1042898689) + W(4, -1124369824, 1029288008, -1104824881, 1049571184) + + W(5, -1089024373, -1089426268, -1107643796, -1091407169) + + W(6, -1093861855, -1100002304, -1087002164, 1052741396) + + W(7, 1044570703, 1042398171, 1023923250, 1030369604) + W(8, 1039801017, 1038306915, 1037725118, 1041619283) + + W(9, 1031782758, 1038671876, 1025678032, 1043274836) + + W(10, -1132073944, 1032364667, -1122032128, 1036587856) + + W(11, -1138629744, 1010685600, 1027566834, -1153060031); + sum2 = W(0, 1016791821, 1013192458, -1123883287, 1015528749) + + W(1, -1131825297, -1132736674, 1019880949, -1117749640) + + W(2, -1110538641, 1023566599, 1000152052, -1112636904) + + W(3, -1116367667, -1130121037, -1114305335, 1033496981) + + W(4, -1114409767, -1113846927, -1109610416, 1054155729) + + W(5, -1109117303, 1016394661, 1030290683, -1157815185) + W(6, 1045544748, 1029704719, 1034122997, 1054056541) + + W(7, 1030522539, -1116026974, 992430312, -1107824982) + + W(8, -1111278622, -1125617069, -1110039103, -1108588248) + + W(9, -1132906850, -1135451026, -1134728538, 1016739853) + + W(10, -1127655665, 1012727082, -1131212885, 1000573476) + + W(11, -1123699129, -1126704253, 988228497, -1123545619); + WS(-1089794384, 1053743764); + sum1 = W(0, 977181200, 1022034304, 999195154, -1173982736) + W(1, -1131079992, -1117753925, 1011212627, -1131210280) + + W(2, -1124062435, -1123589329, 1008939465, 967031199) + W(3, 1031201254, 1038421055, 1023184516, 1042888267) + + W(4, 1045792382, 1045687772, 1043214811, 1051096635) + W(5, -1106608558, -1104815387, 975115280, -1113606040) + + W(6, -1096122984, -1100185218, -1089534650, -1128424615) + + W(7, 1022835035, 1033659882, 1025453978, -1114474998) + W(8, 1035356461, 1029423919, 1037071922, -1130937578) + + W(9, 1033635179, -1112564552, -1148354182, -1115626236) + + W(10, -1146772642, 1022712508, 986801416, 1009586465) + + W(11, 1012941585, 1008485953, 1023442138, 1020831720); + sum2 = + W(0, 1025756371, -1152866061, 1022411083, 1021941035) + W(1, 1018807869, -1162131898, 1030478695, -1117519259) + + W(2, 1038582018, -1136865390, 1028991375, -1102180290) + + W(3, -1127151005, -1103213990, -1148467374, -1101731450) + + W(4, -1095235720, 1027392563, -1094985700, 1062263751) + W(5, 1023141397, 1032099771, -1139645537, 1050734432) + + W(6, -1097242729, -1108446917, -1092586393, 1055770556) + + W(7, 1024429444, 1045256871, -1115314196, 1044538365) + W(8, 1048188946, 1009460859, 1013992713, -1098658877) + + W(9, -1162587434, -1104388978, 1033707193, -1097902791) + + W(10, -1145714840, 1022755591, 1033471029, 1018658879) + + W(11, 1032105067, -1135748387, 1008760659, 1019361371); + WS(-1092258911, -1089815334); + sum1 = W(0, -1139634407, -1147044493, 1017866535, -1130890003) + + W(1, 1027130446, 1016637069, 1016500860, 1026913637) + W(2, 1045821685, 1034203057, 1044613801, 1035729090) + + W(3, 1029847032, -1102281888, -1131657511, -1121093118) + + W(4, -1119357002, 1015718019, -1104936487, -1090722234) + + W(5, 1052628837, 1057948020, 1044884520, 1053191568) + W(6, 1034361159, 1051668019, 1032636456, -1086460492) + + W(7, -1094763749, -1095562645, -1106362539, -1098187032) + + W(8, -1137425069, -1115826689, 1035725147, 1010439579) + + W(9, 1043916211, -1114240161, 1035145793, -1102258214) + + W(10, -1130196683, 1023465264, 1015877619, -1117806874) + + W(11, 1025832214, -1123952546, 1029577644, 1011300119); + sum2 = + W(0, -1128703433, 1012757410, 1007787634, 1023396449) + W(1, 1017560605, 1012244530, -1143125556, 1024938353) + + W(2, -1113670137, 1024378351, -1111552612, -1131966925) + + W(3, -1114649634, 1040107467, -1122758108, 1032092801) + W(4, 1038503213, -1102109659, 1041322248, 1061982310) + + W(5, -1104769108, -1098175974, 1026757617, -1105089779) + + W(6, 1040684472, -1100043210, 1041989415, 1066879681) + + W(7, -1101238360, -1089047102, 1023979343, -1100231891) + + W(8, -1099552212, 1026887817, -1104965070, -1107386978) + + W(9, -1104448348, 1016563929, -1107880053, 1036400101) + W(10, 993905065, 1003273444, -1144755940, 1019447753) + + W(11, 1019550873, 1024790159, -1138003290, 1014825186); + WS(-1086002512, -1084928660); + sum1 = W(0, -1131929465, 1017039401, 1020173741, -1134499377) + + W(1, -1129468257, -1138890277, -1132813939, -1143488833) + + W(2, -1115340892, -1113717074, -1102662114, -1097984585) + + W(3, 999020755, -1114393442, 1028151894, -1132982017) + W(4, 1050776738, 1042912513, 1053707114, 1055825787) + + W(5, -1108349590, 1033511359, -1108075378, -1138015505) + + W(6, -1103148388, 1010821235, -1104889757, 1049797700) + W(7, 1042555580, 1041826234, 1032548919, 1041074464) + + W(8, -1143173743, -1128281895, -1111952748, -1098746549) + + W(9, -1106170922, -1103706929, -1127274842, -1110410462) + + W(10, -1130358353, -1122997746, -1139775729, -1117617116) + + W(11, 1014563169, 1010736529, -1137959865, -1123442568); + sum2 = + W(0, 1000102260, -1126633986, -1144291760, -1119827470) + W(1, 1016232493, 1023762781, -1141218312, 1025293286) + + W(2, -1118205558, 1029900308, -1140439712, 1041420529) + W(3, 979974721, 1006017080, -1137204884, 1002898232) + + W(4, 1051204856, 1063980475, 1066576503, -1075398805) + + W(5, -1098954833, -1114660078, 1021034547, -1117648930) + + W(6, 1041999613, 1037162912, -1167793729, -1085093765) + W(7, 1017117707, 1033481679, -1137323924, 1002077480) + + W(8, -1135930364, -1134402620, 1020225891, -1133429672) + + W(9, 1028764817, 1018587503, -1132685152, 1026769102) + + W(10, 1019347314, -1137379540, 1012525172, -1123883092) + + W(11, -1139078108, 990744512, -1137103964, 1022792204); + WS(-1084377664, 1027078466); + sum1 = W(0, 1028609881, -1129675619, 1022038247, 1010908070) + W(1, 1026611885, 1030113110, -1132403564, 1031201461) + + W(2, 1023875764, 1032239673, 1043647401, 1024809124) + + W(3, -1131519215, -1128260416, 1026951667, -1115829469) + + W(4, -1113303893, -1114746833, -1084547118, -1156932707) + + W(5, 1050946557, 1047159719, 1020650755, 1037768177) + W(6, 1031700430, 1026119482, 1051850662, -1104988345) + + W(7, -1083734174, 1027361605, -1111325382, 1042797655) + + W(8, -1138486380, -1122216064, -1132199979, 1033025459) + + W(9, 1043104191, 1018468419, 1014159432, -1108759836) + W(10, 1025866053, 1016759071, 1032834541, 1029398137) + + W(11, 1007914454, 1021351811, 1014779182, 1018395723); + sum2 = W(0, -1123315648, -1139192721, -1123875414, 1030816333) + + W(1, -1123326315, 1016532474, -1130303816, -1131093304) + + W(2, 1034590473, -1139997869, -1115134908, 1008365317) + + W(3, -1110803030, 1028786615, 1004595129, 1015409534) + W(4, 1026150549, 969235347, 1042477897, 1046059603) + + W(5, -1155992274, -1122978967, -1119026545, -1111529432) + + W(6, 1030314237, -1112534256, 1037120039, 1027803789) + + W(7, -1102080708, -1135183209, -1120008811, -1109468455) + + W(8, -1113579452, -1158492453, -1098184684, 1032895251) + + W(9, -1126452160, 1047700729, 999072441, 1047312851) + W(10, 1014056813, -1132289868, 1018097190, 1032146261) + + W(11, -1114996104, 1011346781, -1115756663, -1122411639); + WS(1043014014, -1087744322); + sum1 = W(0, 1027952711, 1020523582, 1002118409, 1021435438) + W(1, -1138414444, 1003104545, 1021955143, 1013303243) + + W(2, -1123526530, -1138321214, -1110182129, 1032339433) + + W(3, 1035386835, -1137297015, -1119534945, -1108462406) + + W(4, 1008337244, 1022379422, 1057818171, -1110004232) + + W(5, -1083267015, 1007303460, -1115695919, 1036022088) + + W(6, 1035059438, -1120526792, -1086364127, -1118604170) + + W(7, 1057062103, 1036507098, 1038869533, 1036993862) + W(8, -1116610857, 1037330895, 1040407761, 1040846837) + + W(9, -1107059287, -1128420830, 1017909759, -1142792885) + + W(10, 1026995059, -1156487121, 1009757724, -1153254001) + + W(11, 1021783366, 1034169880, -1138765796, 1027514579); + sum2 = + W(0, -1129567658, -1156092221, -1123579911, 1008715269) + W(1, -1125160256, 1026524337, -1137738801, 1017463077) + + W(2, -1117738234, -1131091573, -1115037144, -1115010115) + + W(3, -1101087826, 1015586863, -1113332277, 1019720419) + W(4, 1034622765, -1128107850, 1017778197, 1050631618) + + W(5, 1045062017, -1095615964, 1020345131, -1101223712) + W(6, 1030957051, -1118479197, 1041246295, 1054490255) + + W(7, -1117275788, 1025836507, 1027688491, -1120912313) + + W(8, 1029443337, 1005860107, -1110926783, -1157251077) + W(9, -1108959270, 1020928095, -1122972204, 983922363) + + W(10, -1132249217, 969559787, -1132354551, 1024782459) + + W(11, 998415619, 1012990901, -1161032699, 1011300789); + WS(1054959103, -1083836992); + sum1 = + W(0, -1144415487, -1132171248, -1133053416, 980216825) + W(1, 1018609320, 1017404666, -1127349353, -1154920122) + + W(2, 1023853723, -1118146184, 1039313221, -1107434917) + + W(3, 1027331294, -1111685883, -1129432820, -1126004808) + + W(4, -1123173616, 1018672592, -1090265426, 1057912142) + W(5, 1044087220, 1046306952, -1133031712, 1039769364) + + W(6, -1121737045, -1123041056, -1161038260, 1053211380) + + W(7, -1089253699, 1036559366, -1110305609, 1035028498) + + W(8, -1124541667, -1120856711, 1034290206, -1109871174) + + W(9, 1040602782, -1113560292, -1148202051, -1109624712) + + W(10, 1017937944, -1131928876, 1027902624, -1129566080) + + W(11, -1121689404, 1010241568, -1124796708, -1127304152); + sum2 = + W(0, 1018338338, -1139755941, 1025801614, -1122001203) + W(1, 1010171613, -1132321439, 1016232007, 1013259501) + + W(2, -1110884586, -1129406227, -1108237236, 1037408540) + + W(3, 1040327756, -1123391437, -1129086463, -1132299663) + + W(4, -1136808221, -1118232763, -1115176435, -1113269344) + + W(5, -1105808410, -1110685464, -1168436052, 1021765462) + + W(6, 1026570078, 1021052542, -1114736489, 1041519115) + + W(7, 1047951095, -1115014721, -1113536502, -1123780081) + + W(8, -1136194357, 1020321772, 1048907220, 1046652366) + W(9, 1035402835, -1111631696, 1026410761, -1102273277) + + W(10, -1120452457, 1004896115, -1119060361, -1107310106) + + W(11, 1033649944, -1126977687, 1026056519, 1027695361); + WS(1057903600, 1067139767); + sum1 = W(0, -1130009103, 1012511358, -1137761926, -1124300975) + + W(1, 1008012526, -1117250069, -1162310274, -1115259538) + + W(2, -1107061793, -1111029392, -1104154592, -1103367501) + + W(3, 1009980758, -1113394087, 1026647906, -1114684710) + W(4, 1043136838, 1028125200, 1051222763, 1060113955) + + W(5, 1024983063, 1016245011, -1117690736, 1025498192) + W(6, -1102099951, 992918145, -1106189879, 1050079197) + + W(7, 1048697267, 1034440698, 1041096574, 1041574755) + + W(8, -1115498357, -1117969679, -1104467697, -1108729546) + + W(9, -1111781863, -1104780916, -1117169584, -1120787335) + + W(10, -1123992244, -1145160172, -1125356943, -1117739880) + + W(11, -1165450354, -1114615608, -1139440358, -1118506516); + sum2 = W(0, 1011962608, -1120699406, 1007214128, 1026799984) + + W(1, -1145867047, 1029224075, -1116434980, 1022659583) + + W(2, 1038855085, -1131692032, 1038467393, -1112343444) + + W(3, -1113849522, -1138735380, -1120001434, -1118784264) + + W(4, -1122245118, -1112627842, -1122221782, -1106597578) + + W(5, 1026356645, -1114988845, 1020413259, -1123194990) + + W(6, -1126451804, -1110442893, 1042136464, 1054959792) + W(7, 1031831390, 1046305460, 1008343524, 1047204017) + + W(8, -1106947014, 1008646548, -1113116412, -1109079281) + + W(9, -1109881757, -1109725169, -1123390380, -1114571313) + + W(10, 1026864717, -1123527836, 999106843, 1011333214) + + W(11, -1117815384, 1032922020, -1119479700, 1000599735); + WS(-1101058110, 1058505899); + sum1 = + W(0, 1008909245, 1015324303, -1151491221, -1139701245) + W(1, 1009250957, 1031005836, -1131857944, 1009310828) + + W(2, -1123852394, -1112299044, -1128516275, -1102217815) + + W(3, -1104833467, -1113648843, -1119585353, -1121962739) + + W(4, 1037579744, 992056181, -1098678002, 1045087960) + W(5, 1058072040, 1036986521, 1024521495, 1032839164) + + W(6, 1024016996, -1124723744, 1056678303, 1021619781) + W(7, -1095085849, 1041104615, -1129179587, 1025292595) + + W(8, -1121096497, -1131134189, -1109419958, -1098726544) + + W(9, -1109643932, -1121889031, -1127292144, 1017031326) + + W(10, 1022516663, -1130344395, 1021039583, -1132041247) + + W(11, -1140161581, 1026848535, -1125244995, 1005622747); + sum2 = + W(0, 992821683, 1017011277, 1011814063, 999390943) + W(1, -1121326865, -1128713872, -1144442308, -1138094133) + + W(2, 1023078017, -1140746852, 959773689, -1112338116) + W(3, 1035095219, 1024063493, 1023948090, 1032024680) + + W(4, 1023704638, -1139829185, -1107874815, -1113377165) + + W(5, -1108229047, 1033653422, -1133039950, -1140161389) + + W(6, -1112719649, 1034266306, 1032357888, 1057654961) + W(7, 1012152366, -1122811174, 1020168485, -1113617432) + + W(8, 1027637582, -1119668356, -1113625790, -1086342498) + + W(9, -1101720659, -1136544465, -1121720102, 1019370668) + + W(10, 1021903376, 1016759855, 1034398452, 1051594315) + W(11, 1035110699, 1031049449, 1018271190, 1021410443); + WS(-1098338111, 1023498750); + sum1 = W(0, -1138701849, 1022617405, -1168316434, 989875557) + W(1, 1014043241, 1028694643, 1012653195, -1123740578) + + W(2, -1121510465, -1112416999, -1180399652, 1037491593) + + W(3, -1102495433, -1121884733, -1122132512, 1036415429) + + W(4, 1040383254, 1041395124, -1097293461, -1094988553) + + W(5, 1059563452, -1118903112, 1027507886, -1126796061) + + W(6, 1010706669, -1110248019, 1058209828, -1095385553) + + W(7, -1097437690, 1046085501, -1130301425, -1128488725) + + W(8, -1149170878, 1020223099, -1106291545, 984962665) + + W(9, -1119747464, -1122110350, -1123237039, 989067449) + + W(10, 1021863397, 1016227961, 1018489101, 1021609037) + + W(11, -1145092370, 1026243438, 992349061, -1164474953); + sum2 = W(0, -1164068108, -1120898035, 1013829433, 972583599) + + W(1, 1016837545, -1128855117, -1120505887, -1130000643) + + W(2, 1029420636, 1036981221, 1035658823, 1039879187) + W(3, -1102894380, -1128781606, 1013125305, 1008550341) + + W(4, -1112077059, -1106651210, -1106432341, -1108370344) + + W(5, 1027609202, 1035930993, 1026372950, 1017927697) + W(6, -1110964317, -1141413971, 1035230257, 1044568046) + + W(7, 1041920264, -1110600858, -1125837008, 1019426133) + W(8, 1028276360, 1028557670, 1017251513, 1026800348) + + W(9, -1124056839, 1023713154, -1132458450, -1129712212) + + W(10, -1148255859, -1129246253, -1131530425, -1126980980) + + W(11, -1121785123, -1124361549, 1009116645, -1127748642); + WS(1064075168, -1085260633); + sum1 = W(0, 1020097830, 1004279127, 1028112237, 1026532451) + W(1, 961537748, -1130706656, -1135275149, 994604265) + + W(2, -1104011171, -1113516590, -1103036207, -1102348791) + + W(3, -1120389361, 1038928889, -1129088474, 1031068695) + W(4, 1041894009, 1036855277, 1045116105, 1027716980) + + W(5, -1096376936, -1096709211, 996846509, -1102472071) + + W(6, 1034297780, -1106861493, -1112331770, 1058153819) + + W(7, 1043898973, 1048347472, -1164071066, -1118081687) + + W(8, -1113914242, 1031661466, 1017072798, -1100287056) + + W(9, -1119328440, 1032287909, 1019059671, 1040008649) + + W(10, -1138151419, -1151789197, -1129921062, 1026370483) + + W(11, 1025128111, -1140511211, -1167790389, -1140610427); + sum2 = + W(0, 1014633478, -1138053524, -1140130516, -1120104172) + W(1, 1012698026, -1123853902, 1013120742, -1133638700) + + W(2, 1033869831, -1133342724, 1003291347, 1033872317) + W(3, 1006625651, -1121932314, 1004319943, 975983930) + + W(4, -1114935893, -1126366588, 1043822142, -1086850225) + + W(5, 1030145358, 1040015383, -1150276254, 1028724356) + + W(6, -1111281510, -1128243618, -1107071420, -1084734921) + + W(7, 1067004758, 1046081705, 1002809783, 1031930717) + W(8, 1016908923, -1145483991, 1006526455, 1045857736) + + W(9, 1020093203, -1118176982, -1161820989, -1104669476) + W(10, 990649086, 996067150, 1012165262, -1119271334) + + W(11, -1129772456, -1144422823, -1141799647, -1143148999); + WS(-1102756414, -1120030182); + sum1 = W(0, -1114857721, 1007304745, -1113282502, -1135708169) + + W(1, -1130226572, -1115825727, -1142173365, -1136250680) + + W(2, -1102767115, -1115971707, -1095987354, -1101194087) + + W(3, -1099422340, -1109693396, -1122657804, -1100198174) + + W(4, 1043961809, -1101676399, 1053600405, 1065521342) + W(5, 1046696200, 997946179, -1112668237, 1025742970) + + W(6, -1124210446, 1028311347, 1046261656, 1068133511) + + W(7, 1042816511, -1098872988, -1133742993, -1113205915) + + W(8, -1117667780, -1113057893, -1103902228, -1095174540) + + W(9, -1101926052, 1020822452, -1113901869, -1140085511) + + W(10, -1120413918, -1125847632, -1114932345, 1027169042) + + W(11, -1125196828, -1114420141, -1121096548, -1110338975); + sum2 = + W(0, 1022430051, -1126993785, 1027244407, -1136699515) + W(1, -1115987625, 1024283610, -1120680273, -1137060371) + + W(2, -1119384349, -1117046041, -1113440146, -1099757367) + + W(3, 1038214736, -1152620459, 1013074835, 1015902709) + W(4, -1127804673, 1014745875, -1129639049, 1065124465) + + W(5, -1113943514, -1130768777, -1113854522, -1112590762) + + W(6, 1011315171, -1106680506, 1020590601, 1034863647) + W(7, 1035633573, -1116743921, -1127682237, 1012706011) + + W(8, -1121146859, 1009189211, -1115604020, -1111752578) + + W(9, -1124061319, -1120130033, -1148961286, -1113078716) + + W(10, 1009328259, -1125156477, 1000906166, 1017063165) + + W(11, -1117062841, 1024425511, -1119191933, 1024105421); + WS(-1077988040, -1098609713); + sum1 = W(0, 1020152245, 1002836371, -1132015209, 1010566313) + W(1, 1010053945, 1020486319, 1030571159, -1132252076) + + W(2, 1040202093, 1027276515, 1049452385, 1032875267) + W(3, 1036663212, 1034908465, -1114877050, 1038229775) + + W(4, -1114910389, 1037438449, -1100627367, 1030654167) + + W(5, -1113362709, -1095852652, 1025947458, -1105166249) + + W(6, -1104283732, -1105856183, -1098108347, -1102427678) + + W(7, -1104090280, 1048934265, -1126406169, -1138504825) + + W(8, 1039298438, 1028081393, 1024125142, -1131705423) + W(9, 1042947115, 1019783717, 1021770278, 1035155325) + + W(10, -1125387021, 1013826369, 1018674229, 1017725301) + + W(11, -1141124531, 1015682181, 1006527587, 1016700365); + sum2 = + W(0, -1142267837, -1139598567, 967895252, 1008554815) + W(1, -1145406733, 1024473654, -1120792990, 1020245499) + + W(2, -1132626695, -1138132903, -1131100139, 1032537913) + + W(3, -1112410791, 1023361695, -1130141475, 1015868043) + W(4, 1023852808, 1033876712, 1012220303, -1095058264) + + W(5, -1110252153, -1104029741, 1031843465, -1196949327) + + W(6, 1039691642, -1110747637, 1061640184, 1037101696) + W(7, -1091888991, -1161200181, -1119701362, 977066218) + + W(8, -1114839167, -1127924867, -1122160974, 1049832068) + + W(9, 1027903240, -1126050715, -1132864167, -1118663498) + + W(10, -1147709133, -1155304986, -1121532798, 992067354) + + W(11, -1128735955, 1025251228, -1157362170, 1009680879); + WS(1050097375, -1144620389); + sum1 = + W(0, -1128715377, 1011057731, -1134438475, 1019193873) + W(1, 1022275225, 1009602711, 1032927683, -1136253330) + + W(2, 1044211901, 1033637193, 1048874276, 1034983634) + W(3, 1042543166, 1017343103, -1149239594, 1037918654) + + W(4, -1107032850, 1022227585, -1096643663, -1114392598) + + W(5, -1092702793, -1097617495, -1139445891, -1097624368) + + W(6, -1104047251, 1028225817, -1092741994, 1036584266) + + W(7, 1025153498, 1028276325, -1142331733, -1118553533) + W(8, 1044522647, 1008625791, 1044273989, -1113959235) + + W(9, 1042105869, 1041046056, 1025445761, 1045159742) + W(10, -1128884681, 1011579579, 1018667761, 1025301657) + + W(11, 1024565397, -1123355105, 1027058603, 1015982985); + sum2 = + W(0, -1125113091, -1172679141, -1152889753, -1126905475) + + W(1, 1006649294, -1117488938, 1019337735, -1172252645) + W(2, 1033296420, -1128383915, 1019343075, 1031861037) + + W(3, 1038268779, -1113645001, 1028739248, -1120621430) + + W(4, 1004274749, 1016688407, -1103752812, -1097163724) + W(5, 1062746712, 1051715314, -1124587947, 1035778038) + + W(6, -1102915066, 1037338868, -1089888071, -1090194983) + + W(7, 1041005261, -1118523722, 1027501384, -1154227385) + + W(8, 1028147108, -1144981581, 1030353331, -1121675098) + W(9, 1019962267, 1006661278, 1023891692, 1013440998) + + W(10, 1017918867, 991135609, 1022111055, -1117974458) + + W(11, 1026630548, -1115156997, 1018829507, -1136345798); + WS(-1098112447, -1125216946); + sum1 = + W(0, 1010417568, 1006322176, -1140685064, 1017991280) + W(1, -1126853432, -1146614696, 1004323364, 1019294567) + + W(2, -1112042689, -1119953952, -1116450322, -1112784281) + + W(3, -1105219289, 1023451023, -1153582112, -1110071894) + + W(4, 1004161984, -1112614584, -1090400895, -1113885864) + W(5, 1051228911, -1126136276, 1016683168, 983864831) + + W(6, 1041397655, 1018267345, 1058507679, 1050855349) + W(7, -1097135921, -1122997076, -1149231824, 1012208560) + + W(8, -1114418485, 1024614191, -1104618697, 1027345269) + W(9, 1037685358, 1039454784, -1140802306, 1030420791) + + W(10, 1021110568, -1137912440, -1127130192, 1019594896) + + W(11, -1116355204, 987030015, 988441407, -1149650752); + sum2 = + W(0, 1035141604, -1134943159, 1031353634, -1120750640) + W(1, 1025254666, -1114509439, 1028756554, -1113538005) + + W(2, -1152950404, 1010887850, -1122370025, -1101926585) + + W(3, -1104605825, 1035852377, -1114959163, -1148680422) + + W(4, -1100547860, 1025641276, -1101375945, 1057546844) + W(5, 1048526282, -1108641700, 1033576762, 1037895648) + + W(6, -1104792229, -1119115361, -1100366049, 1042205116) + W(7, 1042952063, 1039483674, 1030776026, 1041006229) + + W(8, 1037875812, 1021611837, 1015511489, -1109199537) + + W(9, -1105787312, -1109299079, -1143994351, -1107406256) + + W(10, -1138078871, 1016878804, 1015482099, -1140091328) + + W(11, 1032201266, -1132053601, 1007578680, -1124574444); + WS(1027823864, 1049081066); + sum1 = W(0, 1012131718, -1130128499, 1020918007, -1147020173) + W(1, 1027080278, 1020448605, 1012408472, 1024273997) + + W(2, 1045092167, 1032126573, 1043895467, 1034108246) + + W(3, 1035993776, -1104998342, -1129990263, -1123698278) + + W(4, -1108779609, -1127539283, -1101697729, -1094495268) + + W(5, 1047905888, 1057437086, 1041161122, 1052750589) + W(6, 1031292119, 1050389010, 998802811, -1089568357) + + W(7, -1096020979, -1097851474, -1105719893, -1101687913) + + W(8, -1168425160, -1113259988, 1036534559, 1026355631) + + W(9, 1044370080, -1112197645, 1035394325, -1103284196) + + W(10, -1123848398, 1017365039, 1015583683, -1120941186) + + W(11, 1024649726, -1123264842, 1027345300, 966350543); + sum2 = W(0, 1023788251, 982227227, 1006064903, -1119196045) + W(1, 1022374646, -1139981943, 1006364327, -1130167410) + + W(2, -1115639872, -1150596845, 1015277390, 1006169559) + + W(3, 1034991246, -1110295858, -1148612007, -1131776900) + + W(4, 1042970848, 1046665761, 1037025188, -1080187678) + W(5, 1047303977, 1052132899, 1033799186, 1035867784) + + W(6, 1041100183, 1053945290, -1128807740, -1078236510) + W(7, 1053440142, 1058969577, 1029728171, 1005561207) + + W(8, -1120506242, -1121383639, 1017634434, 998104205) + + W(9, 1037533712, -1112892146, 1033828190, -1110685126) + + W(10, -1214633659, -1143798279, 1023282498, -1114831851) + + W(11, 1023435593, -1124500500, 1015376522, 1014287051); + WS(-1088189216, 1043089281); + sum1 = W(0, -1140748743, -1121398410, 1026065228, -1149048846) + + W(1, 1020127051, 1036138263, -1128555260, 1038047047) + W(2, 1049770738, 1041680407, 1048806759, 1043836791) + + W(3, 1034371336, 1024770968, 1037337862, -1137213911) + + W(4, -1088213532, -1096476823, -1084369379, -1108723571) + + W(5, 1036745881, 1041309981, 1011670631, 1028379642) + W(6, 1042644994, 1047024381, 1050638745, -1101872740) + + W(7, -1094226627, -1096464492, -1106071481, -1102959693) + + W(8, 1041481493, -1107153702, 1035104215, 1041455384) + W(9, 1040593116, 1045395982, 1040128941, 1016152290) + + W(10, 1008330103, 1031833588, 1020682979, 1026205458) + + W(11, 1006701623, -1120876186, 1024336228, 1028740542); + sum2 = + W(0, -1129618765, 1004169862, -1163586391, 1012667011) + W(1, 1004789414, 1006867267, -1148564598, 1023888443) + + W(2, 1028575755, -1114659435, 1025093243, -1110197183) + + W(3, -1140439179, -1110600679, 1019765437, -1106146141) + + W(4, 1018469269, 1020493837, -1120959857, 1045602812) + W(5, -1119013866, 1007539419, -1126956769, 1005311510) + + W(6, -1109549862, 1025826707, 1018231561, 1050121196) + W(7, 1009644755, 1038682513, 1017107081, 1040899502) + + W(8, 1022763469, -1116607191, 1017295613, -1110473213) + + W(9, -1143499366, -1107944702, -1123266847, -1114206671) + + W(10, -1123897489, -1153284395, -1131222849, 1019030581) + + W(11, -1125130849, 1009132883, 1006886939, -1127991173); + WS(-1082596160, 1043517696); + sum1 = W(0, 1028909798, -1153492953, 967933898, 1019116907) + W(1, -1132218099, -1129844133, 1011144392, 999709323) + + W(2, -1154689545, 1032486047, -1128767583, 1037703496) + + W(3, -1115978788, 1027446332, -1146849277, -1114471573) + + W(4, -1104169149, -1117361518, 1049441299, -1087176649) + + W(5, -1115448907, 1018413135, -1154137305, -1130624603) + + W(6, 1025985531, -1118729126, 1031994846, -1089391227) + W(7, 1056185125, 1032249225, 1036574828, 1042483386) + + W(8, 1029418231, 1034798166, 1006099469, 1046438773) + W(9, -1106352341, 991686873, -1131200252, 1022706506) + + W(10, 1024711058, -1125485751, 1008177302, 986175666) + + W(11, -1125946755, 1030151438, 1006963806, 1019997155); + sum2 = W(0, 987806561, 1024001581, -1132313544, -1138298076) + W(1, 1003342504, -1131321664, 1015369606, 1016585830) + + W(2, -1103978637, -1138508200, -1113576691, 1037869389) + + W(3, 1041829747, -1102361734, 995389041, -1103350916) + + W(4, 1039699877, -1109586411, -1109697688, 1004783368) + + W(5, -1101655248, 1023850463, -1123567230, 1033013495) + W(6, 1032745921, 1036006171, 1041044376, 1057490671) + + W(7, -1120283284, -1118937466, -1137071480, 1023653113) + + W(8, -1106709297, 984628641, -1135869680, -1123523352) + + W(9, 1037905909, -1133053924, 1008345900, -1123775069) + + W(10, 1017765222, -1151113585, -1128136972, -1126668402) + + W(11, -1142518888, -1119975873, 1015435786, -1153724113); + WS(1066487464, -1081148228); + sum1 = + W(0, -1156758047, -1115667101, 1032245054, -1120457266) + W(1, 1025970038, 1028999903, -1129094085, 1031685286) + + W(2, 1045622655, 1039828621, 1043227835, 1051174634) + W(3, 1038187760, 1035936180, 1028125692, 1038703027) + + W(4, -1121579186, 1016276052, -1107379682, -1081882686) + + W(5, -1114502289, -1110627634, 1032926021, -1130240468) + + W(6, 1016497454, 1034243041, -1125065087, -1081200961) + + W(7, -1121918554, -1121754318, -1138807120, -1128847308) + + W(8, 1026804003, -1129971954, 1036683903, 1050524446) + W(9, 1033938044, 1045144826, 1028558202, 1036935449) + + W(10, 1025331662, 1022570928, 1033790001, 950141917) + W(11, 1035886143, -1123227402, 1023360168, 1033245399); + sum2 = W(0, 990406129, -1109318105, 1032976305, -1108583903) + W(1, 1009651516, 1027268958, -1109295843, 1034160517) + + W(2, 1013162021, 1040565489, -1125670617, 1041812300) + + W(3, -1123723867, 1031967357, 1033460548, -1113698315) + + W(4, -1111903383, -1098989385, -1114873385, 1042303391) + + W(5, 1001920896, -1113158574, 1015358203, 1032025507) + W(6, 1031481662, 1036428343, 1043786440, 1039454897) + + W(7, 1032603577, -1097549253, -1117993943, -1119346601) + + W(8, -1112035485, -1111376696, 1007686716, 1044627344) + + W(9, -1107723593, 1043104932, -1142055788, -1111706149) + + W(10, 1026146121, 1020848344, 993596601, -1114987237) + + W(11, 1030752081, -1112152994, -1128311189, 1024170945); + WS(-1085700080, -1080808385); + sum1 = W(0, 1024296914, -1122227946, -1137292464, 1023737634) + + W(1, -1114666035, 1017074878, -1116342907, 998628462) + W(2, -1130852634, 1020782261, 1018157624, 1000516328) + + W(3, 1007198528, 1034334952, 1028012332, 1030076118) + + W(4, -1113008209, 1011762792, -1132968658, -1126768286) + + W(5, -1104353680, -1108931914, -1128335092, -1106440695) + + W(6, 1037784580, -1106441949, 1034492712, -1096045179) + W(7, 1044579508, 1035021791, 1016641544, 1037317931) + + W(8, -1128041639, 1023563097, 1002605936, 1048917408) + + W(9, -1126595297, -1127030516, -1124799637, -1122557970) + + W(10, 1011155704, 1007950112, -1130475172, 1027876850) + + W(11, -1148910448, 1030237498, -1178616327, 1026212766); + sum2 = W(0, -1127545645, 1018138398, -1144042592, 999025130) + + W(1, -1139402988, -1150259805, 985356315, -1133933532) + + W(2, 1009004191, -1136885460, -1141392422, 1032831862) + + W(3, 1017820345, -1138954980, 1013413304, -1164078621) + + W(4, 1015771798, -1151865619, -1107745249, -1097510643) + + W(5, -1117369881, 1017078443, -1132039248, -1132951491) + + W(6, -1131692274, -1125888003, -1091675886, -1072938398) + + W(7, -1091916978, -1117354278, -1124163047, -1138824868) + + W(8, 1014637794, 1023581282, 1057331451, 1076041086) + W(9, 1056314077, 1032772879, 1020965023, 1026258229) + + W(10, 996126556, 1018938725, -1136255574, -1112160457) + + W(11, -1150817344, -1138128772, 1018397555, 985080995); + WS(1065410184, 989310727); + sum1 = W(0, -1129262375, -1140125102, -1116437485, -1133156750) + + W(1, 1013595422, -1140436482, 1001232640, -1120957855) + + W(2, -1109321255, -1114916286, -1113105487, -1103994248) + + W(3, -1113291025, -1135877737, 1027066925, 1020121135) + W(4, 1036945010, 1039766830, 1017194412, 1046741097) + + W(5, 1059311888, -1110004779, -1131666807, -1115618446) + + W(6, 1026154888, -1115626794, 1060001058, 1017259310) + + W(7, -1103200016, 1018378495, -1131905035, -1127100975) + + W(8, -1134197844, -1121887434, -1094555822, -1114897776) + + W(9, 1023750749, -1113774366, -1124072268, -1116648163) + + W(10, -1125355007, 1012320294, -1137406030, -1133486286) + + W(11, -1124720479, -1115411390, 1004266540, -1123146591); + sum2 = W(0, -1134742142, 994239369, -1134258278, -1126643555) + W(1, -1124787402, 1015413679, 991423945, 1010959842) + + W(2, 1015903261, 1014594226, -1129761964, 1031995313) + W(3, 1009465920, 1021296491, -1131866907, 1022764367) + + W(4, 1020154303, -1150882457, 1022217883, 1040302074) + + W(5, 1049285742, 1029784509, -1135790753, -1122024941) + + W(6, -1137672551, 1023023759, 1027518631, -1097618001) + + W(7, -1098762324, -1122992412, -1126884057, -1118740892) + + W(8, 1024853570, 1017377705, -1148789809, 1026258033) + W(9, -1132512970, 1015729459, -1130065044, 980872325) + + W(10, 1005131169, -1125421078, 1001175413, -1138047636) + + W(11, -1148246653, 1016986651, -1142203369, 992745521); + WS(1051937311, 1019742014); + sum1 = + W(0, -1128733562, 997229903, 1023734487, -1116159949) + W(1, -1132293538, -1139661928, -1123545457, 1016780849) + + W(2, -1110586220, 1007594774, -1114376035, -1126695312) + + W(3, 1032525373, -1154941499, 1019369518, 1026460481) + W(4, 1044317379, -1115449474, 1058430122, -1131615423) + + W(5, 1028795565, 1043036192, -1111719346, -1122201669) + + W(6, 1034449865, 1040493967, -1106892452, -1096043495) + W(7, 1048571437, -1110832404, 1031893623, 1016066306) + + W(8, -1129053661, -1122019556, -1137597924, -1114653189) + + W(9, -1104742917, -1106286569, -1118024837, -1121789868) + + W(10, -1126315858, -1118602611, 1007433460, -1115826781) + + W(11, 1027349977, 1018237258, -1123671919, 1018711058); + sum2 = + W(0, 1008400273, 1016157529, -1144490357, -1138058389) + W(1, -1125392389, -1130565626, 965128306, -1135290574) + + W(2, -1127535498, -1127740478, 1041994790, 1049438349) + + W(3, -1105215135, -1113276412, -1135958083, -1114929610) + + W(4, -1110432262, -1101104373, -1088501039, 1056816205) + W(5, 1056199589, 1025802623, 1003347845, 1003318865) + + W(6, -1120718262, -1108362087, 1042410198, -1105949033) + + W(7, -1108549667, 1029274599, -1152613734, 1031964529) + + W(8, -1113670226, -1146032407, -1132649478, 1045816390) + + W(9, -1122823248, -1139374331, -1123972337, 1019133207) + + W(10, 1025653041, -1134925453, 1011207517, -1153231998) + + W(11, -1127906971, 1000306913, -1157554354, -1130500213); + WS(-1117640696, 1034706864); + + return clamp(mstd0 + 5.0 * vsum / wsum * mstd1, 0.0, 1.0); +} + +shared float inp[555]; + +#define CURRENT_PASS 2 + +#define GET_SAMPLE(x) dot(x.rgb, rgb2y) +#define imageStore(out_image, pos, val) imageStoreOverride(pos, val.x) +void imageStoreOverride(uint2 pos, float value) { + float2 UV = mul(rgb2uv, INPUT.SampleLevel(sam_INPUT_LINEAR, HOOKED_map(pos), 0).rgb); + OUTPUT[pos] = float4(mul(yuv2rgb, float3(value.x, UV)), 1.0); +} + +#define INPUT_tex(pos) GET_SAMPLE(vec4(texture(INPUT, pos))) +static const float2 INPUT_size = float2(GetInputSize()); +static const float2 INPUT_pt = float2(GetInputPt()); + +#define temp_tex(pos) (float(texture(temp, pos).x)) +static const float2 temp_size = float2(GetInputSize().x * 1, GetInputSize().y * 2); +static const float2 temp_pt = float2(1.0 / (temp_size.x), 1.0 / (temp_size.y)); + +#define HOOKED_tex(pos) temp_tex(pos) +#define HOOKED_size temp_size +#define HOOKED_pt temp_pt + +void Pass2(uint2 blockStart, uint3 threadId) { + ivec2 group_base = ivec2(gl_WorkGroupID) * ivec2(gl_WorkGroupSize); + int local_pos = int(gl_LocalInvocationID.x) * 15 + int(gl_LocalInvocationID.y); + for (int id = int(gl_LocalInvocationIndex); id < 555; id += int(gl_WorkGroupSize.x * gl_WorkGroupSize.y)) { + uint x = (uint)id / 15, y = (uint)id % 15; + inp[id] = + HOOKED_tex(HOOKED_pt * vec2(float(group_base.x + x - (2)) + 0.5, float(group_base.y + y - (3)) + 0.5)).x; + } + barrier(); + vec4 ret = vec4(0.0, 0.0, 0.0, 0.0); + vec4 ret0 = vec4(0.0, 0.0, 0.0, 0.0); + vec4 samples[12]; + samples[0][0] = inp[local_pos + 0]; + samples[0][1] = inp[local_pos + 1]; + samples[0][2] = inp[local_pos + 2]; + samples[0][3] = inp[local_pos + 3]; + samples[1][0] = inp[local_pos + 4]; + samples[1][1] = inp[local_pos + 5]; + samples[1][2] = inp[local_pos + 6]; + samples[1][3] = inp[local_pos + 7]; + samples[2][0] = inp[local_pos + 15]; + samples[2][1] = inp[local_pos + 16]; + samples[2][2] = inp[local_pos + 17]; + samples[2][3] = inp[local_pos + 18]; + samples[3][0] = inp[local_pos + 19]; + samples[3][1] = inp[local_pos + 20]; + samples[3][2] = inp[local_pos + 21]; + samples[3][3] = inp[local_pos + 22]; + samples[4][0] = inp[local_pos + 30]; + samples[4][1] = inp[local_pos + 31]; + samples[4][2] = inp[local_pos + 32]; + samples[4][3] = inp[local_pos + 33]; + samples[5][0] = inp[local_pos + 34]; + samples[5][1] = inp[local_pos + 35]; + samples[5][2] = inp[local_pos + 36]; + samples[5][3] = inp[local_pos + 37]; + samples[6][0] = inp[local_pos + 45]; + samples[6][1] = inp[local_pos + 46]; + samples[6][2] = inp[local_pos + 47]; + samples[6][3] = inp[local_pos + 48]; + samples[7][0] = inp[local_pos + 49]; + samples[7][1] = inp[local_pos + 50]; + samples[7][2] = inp[local_pos + 51]; + samples[7][3] = inp[local_pos + 52]; + samples[8][0] = inp[local_pos + 60]; + samples[8][1] = inp[local_pos + 61]; + samples[8][2] = inp[local_pos + 62]; + samples[8][3] = inp[local_pos + 63]; + samples[9][0] = inp[local_pos + 64]; + samples[9][1] = inp[local_pos + 65]; + samples[9][2] = inp[local_pos + 66]; + samples[9][3] = inp[local_pos + 67]; + samples[10][0] = inp[local_pos + 75]; + samples[10][1] = inp[local_pos + 76]; + samples[10][2] = inp[local_pos + 77]; + samples[10][3] = inp[local_pos + 78]; + samples[11][0] = inp[local_pos + 79]; + samples[11][1] = inp[local_pos + 80]; + samples[11][2] = inp[local_pos + 81]; + samples[11][3] = inp[local_pos + 82]; + ret[0] = nnedi3(samples); + ret0[0] = inp[local_pos + 33]; +#if CURRENT_PASS == LAST_PASS + uint2 destPos = blockStart + threadId.xy * 2; + uint2 outputSize = GetOutputSize(); + if (destPos.x >= outputSize.x || destPos.y >= outputSize.y) { + return; + } +#endif + imageStore(out_image, ivec2(gl_GlobalInvocationID) * ivec2(2, 1), ret0); + imageStore(out_image, ivec2(gl_GlobalInvocationID) * ivec2(2, 1) + ivec2(1, 0), ret); +} diff --git a/src/Effects/NNEDI3/NNEDI3_nns64_win8x4.hlsl b/src/Effects/NNEDI3/NNEDI3_nns64_win8x4.hlsl new file mode 100644 index 000000000..677401e65 --- /dev/null +++ b/src/Effects/NNEDI3/NNEDI3_nns64_win8x4.hlsl @@ -0,0 +1,2111 @@ +// This file is generated by the scripts available at https://github.com/hauuau/magpie-prescalers +// Please don't edit this file directly. +// Generated by: nnedi3.py --nns 64 --win 8x4 --use-compute-shader --use-magpie +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +//!MAGPIE EFFECT +//!VERSION 4 +//!SORT_NAME NNEDI3_064_4 + +//!TEXTURE +Texture2D INPUT; + +//!SAMPLER +//!FILTER POINT +SamplerState sam_INPUT; + +//!TEXTURE +//!WIDTH INPUT_WIDTH * 1 * 2 +//!HEIGHT INPUT_HEIGHT * 2 * 1 +Texture2D OUTPUT; + +//!SAMPLER +//!FILTER LINEAR +SamplerState sam_INPUT_LINEAR; + +//!TEXTURE +//!FORMAT R16_FLOAT +//!WIDTH INPUT_WIDTH * 1 +//!HEIGHT INPUT_HEIGHT * 2 +Texture2D temp; + +//!SAMPLER +//!FILTER POINT +SamplerState sam_temp; + +//!COMMON +#include "prescalers.hlsli" + +#define LAST_PASS 2 + +//!PASS 1 +//!DESC NNEDI3 (double_y, nns64, win8x4) +//!IN INPUT +//!OUT temp +//!BLOCK_SIZE 32, 16 +//!NUM_THREADS 32, 8 +#pragma optionNV(inline none) +float nnedi3(vec4 samples[8]) { + float sum = 0.0, sumsq = 0.0; + [unroll] for (int i = 0; i < 8; i++) { + sum += dot(samples[i], vec4(1.0, 1.0, 1.0, 1.0)); + sumsq += dot(samples[i], samples[i]); + } + float mstd0 = sum / 32.0; + float mstd1 = sumsq / 32.0 - mstd0 * mstd0; + float mstd2 = mix(0.0, inversesqrt(mstd1), mstd1 >= 1.192092896e-7); + mstd1 *= mstd2; + float vsum = 0.0, wsum = 0.0, sum1, sum2; +#define T(x) intBitsToFloat(x) +#define W(i, w0, w1, w2, w3) dot(samples[i], vec4(T(w0), T(w1), T(w2), T(w3))) +#define WS(w0, w1) \ + sum1 = exp(sum1 * mstd2 + T(w0)); \ + sum2 = sum2 * mstd2 + T(w1); \ + wsum += sum1; \ + vsum += sum1 * (sum2 / (1.0 + abs(sum2))); + sum1 = + W(0, 1040079017, -1115658697, -1107150591, -1119789534) + W(1, -1129953383, 1052077971, -1102425550, 1027055297) + + W(2, -1112255447, 1056937139, -1089460941, 1033358144) + + W(3, -1100320116, 1052646725, 1029401490, -1121552872) + + W(4, 1039284509, -1091236407, 1057992884, -1097729145) + W(5, 991372703, -1106109018, 1043570389, -1111268755) + + W(6, 1013856427, -1112818013, 1044897031, -1110301789) + + W(7, -1108390802, 1030287040, 1028923089, -1132036495); + sum2 = W(0, -1108031914, -1118430023, 1012288055, 1013768747) + + W(1, 1026461175, 1041449883, 1027150813, -1122068949) + W(2, 1032549274, 1072973866, 1049697467, 1026059807) + + W(3, 1041814131, -1076980873, -1082819831, 1036691428) + + W(4, 1017353224, -1111091488, 1041587393, -1152272302) + + W(5, -1121140359, 1028730196, 1027133694, -1116481805) + + W(6, -1132764107, -1121430441, -1122016279, 1025296987) + + W(7, -1138465879, -1127880506, -1141547063, 1012449399); + WS(-1098744132, 1034278418); + sum1 = W(0, -1103397220, -1145635621, -1105248316, 1050544938) + + W(1, -1124165708, 1041815523, -1120033612, 1021903208) + + W(2, -1110800938, -1099348442, 1050332487, 1035939706) + W(3, 1026719460, -1092523700, 1047722705, 994253234) + + W(4, 1022646298, -1100009602, 1037024150, 1017012340) + W(5, 1032193166, -1088889154, 1057456646, 992386946) + + W(6, 1022064347, -1104673163, 1045722836, -1126668889) + + W(7, -1136800346, -1098235958, 1051861685, 1007925993); + sum2 = W(0, -1097631923, 1051137052, 1049915324, -1103655169) + + W(1, 1038271179, -1138123466, -1101382095, 1030554459) + + W(2, 1016052501, 1047950529, 1053016941, -1103587135) + W(3, 1038061501, 1066995446, 1044310058, 1039796029) + + W(4, -1098093629, 1052164534, -1101624661, 1022295275) + + W(5, 1036023945, -1086456688, -1097740488, 1002073396) + + W(6, -1103222197, -1092315790, 1025704121, 1009745942) + + W(7, 1049634734, -1088937960, -1095498431, 1037237655); + WS(-1082862242, -1106529553); + sum1 = W(0, -1130854575, 1035507577, -1111381151, -1121770975) + + W(1, -1136558799, -1134799464, -1109420173, 1040932752) + + W(2, -1106220300, 1050921813, -1090777253, 1042678624) + W(3, 1011297096, 1017516694, 1058584025, 1023914089) + + W(4, 1032803517, -1083278305, 1053793791, -1114891124) + + W(5, 1003802452, -1113237716, 1038764911, 1024022374) + + W(6, -1130818358, -1166618304, 1011564912, 1003125716) + + W(7, -1115833284, 1036440480, -1125528356, -1148371520); + sum2 = W(0, -1113253112, -1114468103, 1046106511, 1029911106) + + W(1, 1017383795, -1105748811, 1042779663, -1111927878) + + W(2, -1098397046, 1042070822, 1049941293, -1106009556) + + W(3, -1105653936, 1062131274, 1049624420, -1113543954) + + W(4, 1043748521, -1088478625, -1093962905, -1110290200) + + W(5, -1130700635, 1039489157, -1102421728, 1032413051) + + W(6, 1040646747, -1112481937, -1120850913, 1032000907) + + W(7, -1134989990, -1118262998, -1124158867, 1027657598); + WS(1055738180, 1034492849); + sum1 = W(0, -1130881323, -1111251428, 1042092597, 1006685651) + + W(1, -1114926341, -1128721888, 1039888312, -1103919286) + + W(2, 1041145701, -1099536939, 1055510938, -1104400342) + + W(3, -1109424308, 1051914904, -1131357522, -1113433279) + + W(4, -1112247108, 1058202118, -1089549409, 1022435899) + + W(5, -1112831856, 1051860704, -1104754439, -1139575663) + + W(6, -1114665081, 1026763985, -1109075065, -1129253153) + + W(7, -1121239258, -1130346670, -1117425768, -1142807791); + sum2 = + W(0, -1110077216, -1118181126, 1049383148, -1110853226) + W(1, 1036549925, -1116107500, 1034915268, -1119533468) + + W(2, -1103858204, 1042025735, 1044994486, -1101175453) + W(3, 1011211476, 1056055130, 1058209450, -1113779586) + + W(4, 1008268344, -1090440399, -1098004228, -1109857174) + + W(5, 1023981444, -1117941654, -1099569204, 1034145803) + W(6, 1010863636, 1001166765, -1121873216, 1026441284) + + W(7, 1034090633, -1130298175, -1107211558, 1033292040); + WS(1056018244, -1109435672); + sum1 = W(0, 1028147653, -1121172806, -1156629272, 1029524274) + W(1, 1025593127, -1108190871, 1019648283, 998861994) + + W(2, 1019179235, 1044333967, -1105021998, -1126875818) + + W(3, 1042157337, -1098176216, -1084323638, 1048944704) + + W(4, -1110312463, 1052400296, 1052575762, -1112766254) + + W(5, 1019247612, 1041545807, -1144495302, 1027979993) + + W(6, -1120006735, -1152440548, 960835398, -1115664295) + + W(7, -1144225212, 1040728133, -1117757541, -1127435447); + sum2 = W(0, -1133465842, 1020564842, -1109452473, 1020759546) + + W(1, 1037565600, -1103457632, 1042355402, 1025892619) + + W(2, -1114814180, 1043192653, -1103393926, 1033812672) + W(3, 1023511793, 1057142397, 1042803000, 1040091206) + + W(4, 1028077461, -1101196001, -1093624788, -1104532905) + + W(5, 1005396583, 1038394412, -1094252679, -1153222990) + + W(6, 1022326514, -1113456189, 1041416796, -1130818626) + + W(7, -1149118303, -1137100532, 1021621854, 1028700597); + WS(1058353218, 1042996167); + sum1 = + W(0, 1024954343, -1094124879, 1052314513, 1009270680) + W(1, 1015847030, -1107919793, -1138612357, -1116609353) + + W(2, 1036476495, -1097421664, 1044445371, -1202266712) + + W(3, -1110665693, 1048862286, 1050687635, -1105910956) + + W(4, -1121159378, 1033331871, -1102818752, 1018868510) + W(5, -1108641009, 1049066134, 998963493, -1115498359) + + W(6, -1137738249, 1023600450, -1113493234, 1016588291) + + W(7, -1102251787, 1041347474, 1023627001, -1119202191); + sum2 = W(0, -1126808420, -1120540574, -1098896413, 1039187917) + + W(1, 980939457, -1110048722, -1075343834, -1110843188) + + W(2, -1123796075, 1033167871, -1086151008, 1032482295) + W(3, 1037410136, -1106277561, 1075199384, 991431992) + + W(4, 1002142140, -1166268225, 1058982643, -1123555130) + + W(5, -1139817292, -1116671070, -1127002394, -1163241473) + + W(6, -1134378480, -1143978200, 1028067074, 1021947375) + + W(7, -1142652688, 1011961658, 1027681870, -1117918702); + WS(1065448321, -1123448424); + sum1 = W(0, 1033675765, 1042933049, -1113419593, -1107290229) + + W(1, 1010310940, 1048779866, -1098481070, 1033876859) + + W(2, -1135157253, 1053164479, -1085464413, 1028430645) + + W(3, -1130617674, 1054681092, 1025088582, -1126554424) + + W(4, 1045868403, -1088933089, 1052703622, -1113028565) + + W(5, 1037821135, -1096402228, 1043193000, -1114258373) + + W(6, 1029877230, -1112063319, 1039463880, -1131689691) + + W(7, -1107423852, -1132569296, 1039088003, 992526257); + sum2 = W(0, 992398551, -1118632904, -1109433050, -1143518596) + + W(1, 1027463162, -1115592424, 998577524, -1122494561) + + W(2, -1110914988, -1094541616, -1095126430, -1116426235) + + W(3, -1119896935, 1058308065, 1059518579, -1103007923) + + W(4, -1100289244, 1052134722, 1038527426, -1121464784) + + W(5, 1024218964, -1139018826, -1109739820, -1115201103) + + W(6, -1111923136, 1043392525, 1004586244, -1120049915) + + W(7, 1036361104, -1114310803, 1020338285, -1128089075); + WS(1050696068, -1101686596); + sum1 = W(0, 1030829490, 1032239887, 1015204626, -1113406309) + W(1, 1025629886, 1039198082, 1033819234, 1030627629) + + W(2, 1028506281, 1035777849, 1052890832, -1111973334) + + W(3, 1044306231, -1094476563, -1083567844, 1049080890) + + W(4, 1022456523, 1053256444, -1095460989, 1026744658) + W(5, 1033300499, -1108777674, 1028011096, 1009469122) + + W(6, 1025382374, -1125496907, -1117978119, 1014700692) + + W(7, -1126351518, 1013615278, 1022077689, -1117484787); + sum2 = + W(0, -1123705959, -1116235595, 1034058997, -1139597844) + W(1, 1033160533, 1028975273, -1094422871, -1122943830) + + W(2, 1021465594, -1105037500, -1106553103, -1103106284) + W(3, 1019539230, 1055127070, 1036912081, 1037858431) + + W(4, -1115261066, 1039390029, -1113630050, 1034945731) + W(5, 1030761443, -1104569658, 1034816057, 997585040) + + W(6, 1021971134, 1024962787, -1131788338, -1137214108) + W(7, -1122567677, 999405400, 1014360364, 1023175710); + WS(1058623938, 1044469574); + sum1 = W(0, 1045615020, -1108426137, -1135193336, 1044911680) + + W(1, 1035147318, -1141312974, 1044306859, 1030580258) + + W(2, 1047639223, -1105886038, -1122107414, 1043270872) + + W(3, 1050348390, -1079944741, -1085342603, 1051720601) + + W(4, 1030161626, 1039515483, -1100470855, 1041363874) + W(5, 1044899106, 1021302290, -1110191310, 1041545713) + + W(6, -1132009366, -1167333042, -1180200419, 1040848727) + + W(7, 1044251461, 991624716, -1100960996, 1042676794); + sum2 = W(0, -1126998679, -1097249916, 1048536708, -1118913729) + + W(1, -1112584470, -1101780852, 1037003529, -1122142287) + + W(2, -1125720699, -1124055793, 1040132893, 1008038822) + + W(3, 1026650453, 1050619160, 1058508674, -1117660887) + + W(4, -1098785634, 1044368398, 1037637019, -1121056345) + + W(5, 1035354845, -1115949975, -1106591466, 1006096779) + + W(6, -1103280207, 1036370417, -1109803757, -1116815483) + + W(7, -1117822839, 1013784870, -1104576316, -1119752481); + WS(-1092650820, -1093598320); + sum1 = W(0, -1126483198, -1111185837, 1032567139, 1028684103) + + W(1, -1136033646, -1107026560, -1113511425, 1034982933) + + W(2, 1019177644, -1096033968, 1059010394, 1025024233) + + W(3, -1119240794, -1101350837, 1042563567, -1118967697) + + W(4, -1095523617, 1057301262, -1131092420, -1118984463) + + W(5, -1108863241, 1042409572, -1108714423, 1023629806) + + W(6, -1113123137, 1040959081, -1114101506, -1128061252) + + W(7, -1126435736, 1035081684, -1106962654, -1142697342); + sum2 = + W(0, -1118904411, -1134435633, -1102280300, -1150017862) + + W(1, -1158272012, -1107189637, 992574886, -1122133752) + + W(2, 1013234849, -1120249847, -1083559741, -1146867651) + + W(3, 1030464194, 1057018316, 1062197029, -1097179586) + W(4, -1106482941, 1048792270, 1040811198, -1115216614) + + W(5, 1025489390, 1024832618, -1114392001, 1021081809) + W(6, -1129648553, 1031754422, 1031998303, -1112304821) + + W(7, 1028128070, -1125347555, 1029475610, 993658022); + WS(1058173058, 1066808129); + sum1 = + W(0, -1107348220, 1035236882, 1041707116, -1121094224) + W(1, -1099127505, 1036577094, 1043659283, -1105652573) + + W(2, -1103913530, 1044208414, 1046852514, -1107481241) + + W(3, -1113478482, 1029276252, 1039741986, -1121409754) + W(4, 1040539139, -1097605967, 1044710619, 1032545388) + + W(5, -1113016318, -1100723463, 1043551606, -1115290924) + + W(6, -1120477164, 1029619500, -1133641268, 1013015214) + W(7, 1000206250, -1122925746, 994694705, 950366748); + sum2 = + W(0, -1094008764, 1034130054, 1031813868, 1011760553) + W(1, -1105723160, -1120175931, 1042930394, -1124103013) + + W(2, -1087139249, 1064201383, -1110465854, -1131636845) + + W(3, 1052425931, 1002356625, -1098172076, 1006833373) + W(4, 1056772124, -1089869944, 1043061462, 1007319139) + + W(5, 1034445536, -1114835724, -1102352886, 1014923704) + W(6, 1012087213, -1123264660, 1040830367, 1016549099) + + W(7, 1037095176, -1129286431, -1111397998, 993051546); + WS(1061928770, 1027279769); + sum1 = + W(0, 1034406912, -1100123699, 1029564087, 1033006716) + W(1, -1113862823, -1162686055, -1109708970, -1128579510) + + W(2, 1039933724, -1096018034, 1050604450, 1007368299) + W(3, -1111710246, 1056786929, 1037263862, -1109765633) + + W(4, -1111349982, 1056534441, -1098017894, -1113416432) + + W(5, -1109997378, 1044907121, 1038664521, -1101798872) + + W(6, -1113344954, 1022437288, -1116167797, -1105438789) + + W(7, -1114279935, 1031029722, 1027389387, -1113862289); + sum2 = + W(0, 1026006751, -1115270559, 1024783342, -1130316822) + W(1, -1108403600, 1031363022, 1033798448, -1139293944) + + W(2, 1035073774, -1104904057, 1037041630, 1025961213) + W(3, -1122004937, 1031769509, 1039898935, 1021529214) + + W(4, 1035952663, -1106336513, 1057393141, -1112547455) + W(5, 1015050843, 1027760004, 1027825620, -1096601581) + + W(6, -1124438030, 1019789656, -1121305243, -1105185563) + + W(7, -1133483016, -1118390529, -1128829234, -1106336479); + WS(1053752708, 1043937257); + sum1 = W(0, -1114168512, -1105170221, 1031197758, -1109039567) + + W(1, -1112521242, -1098204331, -1104934543, -1113606305) + + W(2, -1097902456, 1046102006, 1042705158, -1098767200) + + W(3, -1095288434, 1066642253, 1070561411, -1089903115) + + W(4, -1094410051, 1054367941, 1038022813, -1100846418) + + W(5, -1114520925, -1100810554, 1032266099, -1108028099) + + W(6, -1115668990, -1121904763, -1114135854, -1115062077) + + W(7, -1105295129, 1031167873, -1123380722, -1118408200); + sum2 = W(0, -1113064749, -1090786559, 1038982572, -1136678198) + + W(1, -1144787532, -1094418907, -1102980167, -1129681067) + + W(2, -1115681675, 1009808406, 1041806798, 1023762114) + W(3, 1041111385, 1053253351, 1054413523, 1035936399) + + W(4, -1130408019, 1015714915, 1024043560, -1114747797) + + W(5, -1136936214, 1020895003, -1114777947, 1001107148) + + W(6, 1022660811, -1117683238, 1021536435, -1129865467) + + W(7, -1121651306, 1028089270, -1123371786, 1019986163); + WS(-1077899937, -1095640595); + sum1 = + W(0, 1038010313, 1032811586, -1097475626, 1033727032) + W(1, 1026389718, 1036208246, -1123908524, -1117534996) + + W(2, 1040451742, -1100196466, 1051006893, -1116405267) + + W(3, 1038149954, -1112596654, -1096170677, 1043001855) + W(4, 1012098034, 1057575303, -1089360567, 1035677341) + + W(5, 1041468735, 1025151035, -1102384270, -1122502968) + W(6, 1036152598, -1108998502, -1117118702, 959089718) + + W(7, 1035936827, -1117388883, 1019229383, -1122221082); + sum2 = W(0, 1014408115, 1037203464, -1112987386, 1006518986) + W(1, 1031626038, -1111295182, 1033188726, 998532726) + + W(2, 1042237958, -1111204470, 1033012571, 1002908510) + W(3, 1024306585, 1046645930, 1040504174, -1142339005) + + W(4, 1005347958, 1036175171, 1022488131, 1028667874) + + W(5, -1108949069, -1102667672, -1113110436, 1028194944) + + W(6, -1129272561, -1105300490, 1012028387, 991631364) + + W(7, -1155665460, -1098212068, 1026136762, -1118275484); + WS(1052188868, -1105025774); + sum1 = W(0, 1026006805, 1053332527, -1093124457, 1016895952) + + W(1, -1127133881, 1046329385, -1102124985, 1015047702) + + W(2, -1111238899, 1054121990, -1093232644, 1031180874) + + W(3, 1039605133, 1041936861, -1108714798, -1123947762) + + W(4, 1036489378, -1098161716, 1047964177, -1116894641) + + W(5, 1027868467, -1100202284, 1042303686, -1100188956) + + W(6, 1028341284, -1114580002, 1042593657, -1114267170) + + W(7, 1040022103, -1112308133, 1033044781, -1120167377); + sum2 = W(0, -1098242390, 1038124206, 1035251585, -1146833441) + + W(1, -1090155459, -1111850856, -1110800852, 1015159009) + + W(2, -1080159437, -1111691725, 1033462452, -1114532383) + + W(3, -1083172772, 1045262621, -1116129960, 1037947101) + + W(4, 1043663143, -1107342132, -1117401930, -1115149205) + + W(5, 1066420271, -1115094311, 1036826747, -1118954060) + + W(6, 1065821018, 1045364599, -1121811075, -1159263732) + + W(7, 1052081121, 1039539139, 1031476522, -1144829650); + WS(-1102870152, 1022622513); + sum1 = + W(0, 1055644087, -1105950504, -1114669622, -1099940547) + W(1, 1035394969, -1108831748, 1043185370, 1029691760) + + W(2, 1045649819, 1041190721, -1098060649, -1105006556) + W(3, 1045987408, 1039545500, -1093030704, 1034170571) + + W(4, 1030573816, 1049616144, -1093912525, 1028754581) + W(5, 1031111560, 1056957379, -1084377448, 1032315050) + + W(6, 1035095156, 1047436506, -1093512673, 1008186016) + W(7, 1041054212, 1055423038, -1094643096, 1002093997); + sum2 = W(0, -1084145430, 1070336926, 1055168354, -1086613448) + + W(1, 1037387540, -1098862516, -1095516697, 1056626754) + + W(2, -1091365810, 1050914492, 1050568943, -1097405209) + + W(3, -1096604175, 1068317532, 1069441477, -1099937369) + + W(4, -1095647742, 1054262144, -1090345251, -1106692290) + + W(5, 1043123500, -1083131387, -1085743049, 1045945631) + + W(6, -1106696806, 1046449081, 1048225937, -1106594556) + + W(7, 1053814194, -1081281727, -1086819148, 1058187197); + WS(-1069426976, -1120848841); + sum1 = W(0, 1036938172, 1037072255, -1103659451, 1032159990) + W(1, 1035259664, 997868135, 1049019033, 1025792718) + + W(2, 1047028417, 1031706371, -1095105906, 1020529436) + + W(3, 1052190352, -1092031243, -1081236347, 1049696791) + + W(4, 1041456894, 1045414333, -1090672009, 1038916826) + W(5, 1039915051, 1026900661, 1032303833, 1035011641) + + W(6, 1015525967, -1119324359, 1008361890, 1039253091) + + W(7, 1036563112, 1015048091, -1146656500, -1145253028); + sum2 = W(0, -1131675185, 1029191442, -1114450600, 1024984252) + + W(1, -1130807793, -1132163681, 1018117017, -1115031522) + + W(2, -1137547874, -1115933340, 1033829647, 1037592454) + + W(3, -1119117212, -1086087178, 1063181450, 1006729954) + + W(4, -1138868050, -1112002886, 1026390676, 1017409241) + + W(5, -1139313154, 1014175682, -1143924164, -1134939410) + + W(6, -1127085641, 1023290113, -1138352802, -1125048401) + + W(7, -1144490820, -1135148482, 1007342770, 974288160); + WS(-1092511940, 1056045775); + sum1 = W(0, 1034351639, -1122413709, 1034842253, -1109413949) + + W(1, 1036571263, -1107220477, 1031880235, -1128037178) + + W(2, 1026078569, -1123595634, 1048156900, -1106487287) + + W(3, 1044122211, -1099810889, -1106066347, 1038991202) + + W(4, -1145831724, 1052039823, -1096815763, 1016305349) + + W(5, -1113387827, 1050308552, -1095462256, 1039930976) + + W(6, 1018446892, 1032192235, -1104039774, -1145490603) + + W(7, -1119385695, 1047960215, -1105858435, -1115254417); + sum2 = W(0, -1129634341, 1017418680, 1033383321, -1086264457) + + W(1, -1125984965, -1145267460, -1108053053, -1078809375) + + W(2, -1131211232, 1019434782, 1035592777, -1073693037) + + W(3, 1032304695, -1112808134, 1017461836, -1098879629) + + W(4, -1126835561, 1027589163, -1125819067, 1071963841) + + W(5, -1135310730, -1164412329, 1048432434, 1073307463) + + W(6, 1030376830, 1012340975, -1132396034, 1053688201) + + W(7, -1115706548, 1024240430, 1037084632, -1110470100); + WS(1042257800, -1115776325); + sum1 = + W(0, -1146926115, -1107281138, 1038400362, 1010013391) + W(1, 1032352980, -1098526814, 1045994468, -1117084567) + + W(2, -1109330569, 1043068219, -1111135982, 1043908518) + + W(3, -1114314051, -1109412128, -1144690495, -1120663934) + + W(4, 1039411448, -1097266597, 1057956169, -1098521248) + + W(5, -1111850704, 1039093055, -1128243973, -1122589083) + + W(6, 1040829028, -1100632132, 1048043508, 1029880783) + W(7, -1123393177, -1104810789, 1025450855, 997333453); + sum2 = W(0, 1029402915, -1139977433, -1102627522, 1041328458) + + W(1, -1131137316, -1118253197, 1040550677, -1112092070) + + W(2, 1031911869, -1122896144, -1088615745, 1058291503) + + W(3, 1023173531, -1122404168, 1061434285, -1087193418) + + W(4, 1023792141, -1098422336, 1075510495, -1072676007) + + W(5, -1123803784, 1037623928, 1067804318, -1079538943) + + W(6, 1014267385, -1106514445, 1045458757, -1106625048) + + W(7, -1128776324, 1036548666, 1035151624, -1107997040); + WS(1062572194, -1113128476); + sum1 = W(0, 1025054504, -1105909778, 1035303099, 1030405814) + + W(1, 1032745069, -1098454710, 1048922046, -1107189334) + + W(2, -1111717923, 1040855323, -1111940687, 1047137430) + + W(3, -1115121012, -1102647392, 1030883818, -1120733568) + + W(4, 1039928305, -1094658254, 1056642050, -1102007432) + + W(5, -1108655721, 1048800872, -1114397119, -1121522301) + + W(6, 1042636501, -1098634802, 1045405821, 1030940241) + + W(7, -1121873307, -1107065062, 1028123977, -1129454014); + sum2 = W(0, -1114559261, -1138228901, 1049277284, -1102431407) + + W(1, 1015935669, 1029828517, -1107208114, 1036930870) + + W(2, -1119968612, -1110320033, 1062476231, -1086736101) + + W(3, 1034980574, -1095660939, -1090290563, 1061616421) + + W(4, -1134322843, 1043622789, -1071408041, 1075586093) + + W(5, 1031387619, -1103434641, -1079628774, 1068626110) + + W(6, -1130912561, 1043842027, -1100585862, 1036267766) + + W(7, 1028413753, -1104010102, -1110973692, 1043722127); + WS(1060774594, 1031131703); + sum1 = W(0, -1107942447, 1045023814, 1022102280, -1109726834) + + W(1, -1105426838, 1048858052, 1019498368, -1115599332) + + W(2, -1102134060, 1057375412, -1089780107, 1024119623) + + W(3, -1108928460, 1053310638, 1054202179, -1117349999) + + W(4, 1030069408, -1086363546, 1056436400, -1105657043) + + W(5, -1109912496, -1121814959, 1045750878, -1112636534) + + W(6, -1111247296, -1121700033, 1017717699, 1020787328) + + W(7, 1016389396, -1112979299, -1115080444, 1034439495); + sum2 = + W(0, 1036474850, -1115841609, -1115206474, 1027456791) + W(1, -1117613837, 1015990489, -1121605429, -1155010952) + + W(2, 993333704, -1114813616, 1041891165, -1115442992) + W(3, -1124280889, 1046600726, 1051997378, -1145891812) + + W(4, -1120272689, -1127188969, -1122067781, -1135549634) + + W(5, -1147158916, -1101686418, 1035140408, 1009536026) + + W(6, -1136721538, -1106242516, 1020051521, 1019245009) + + W(7, 1006917274, -1111325506, -1113122752, 1017045509); + WS(1060194466, -1100017114); + sum1 = W(0, -1107280066, -1105747811, 1059466063, -1103466926) + + W(1, -1110455654, -1101985628, 1043733237, -1106475814) + + W(2, -1108454907, 1018718942, 1057500851, -1106517942) + + W(3, -1102634810, -1106901713, 1036011765, -1094721336) + + W(4, -1103570769, 1046100821, 1016328357, -1110005824) + + W(5, -1103041901, 1055521256, -1113318903, -1108487663) + + W(6, -1108837738, 1047438565, -1139455183, -1116101330) + + W(7, -1103753711, 1059153514, -1111475141, -1118902112); + sum2 = W(0, -1134258178, -1116481221, 1032034504, -1123729210) + + W(1, 1016306377, -1123533287, -1130975497, -1124034546) + + W(2, -1119701101, -1150894505, -1129842733, -1119840142) + + W(3, -1121134035, 1050682292, 1050657130, -1118895679) + + W(4, -1110905440, 1003934853, 1032136922, -1115758498) + + W(5, -1123898542, 1016401385, -1114630639, -1135589646) + + W(6, -1120388479, 1010383122, -1135861370, -1140270714) + + W(7, -1131815221, 1025651043, -1115813895, -1126135829); + WS(-1094780356, -1096037829); + sum1 = W(0, -1094564683, 1051641704, 1042321778, -1109647669) + W(1, 998269945, 1048993133, -1097112145, 1034946343) + + W(2, -1106439374, -1105882161, 1049078036, -1120792141) + + W(3, -1099790159, 1021385644, 1039341071, -1101585581) + + W(4, 1039955171, -1110801281, 1035258371, 1020526630) + + W(5, -1116696534, -1093602407, 1056382370, -1124429730) + + W(6, 1026955814, 1040928722, 1035779188, -1106396689) + + W(7, -1132274079, -1094848202, 1053064740, 1027970323); + sum2 = + W(0, -1137596463, 1029577680, 1038439017, -1113448033) + W(1, -1129205035, -1107142480, 1015352075, 1012914617) + + W(2, -1126343315, 1047351132, 1070713407, -1114069586) + W(3, 1039861741, -1098569120, 1073186805, 1046610276) + + W(4, -1126312459, 1038608299, 1038004689, -1144677526) + + W(5, -1123052878, -1116615219, -1073950732, 1007385420) + + W(6, 996868828, -1112533224, -1077903771, -1108941862) + + W(7, -1125851727, -1107291575, -1107100148, 1037961064); + WS(1053603780, -1115461008); + sum1 = + W(0, -1137418943, -1097293942, 1049585228, 1014991997) + W(1, 1030817204, -1095449155, 1046317951, -1134044169) + + W(2, 1016256157, -1092155167, 1056038503, -1118818050) + W(3, 1021933093, 1049349309, 1058232189, -1129232467) + + W(4, -1107174285, -1125654285, -1109114845, 1020919504) + + W(5, 1024187323, -1107838901, -1104780729, 1042320778) + + W(6, -1121722108, -1112035518, -1104946775, 1033110781) + + W(7, 1027865701, -1115980033, -1096840466, 1040979266); + sum2 = W(0, 1033231462, -1115237141, -1111323807, 1022510111) + + W(1, -1122607696, 1031925962, -1115623012, 1016053183) + + W(2, -1126070520, 1042960949, -1119706606, 999155791) + W(3, 1021774826, 1053325526, 1049744257, -1130112624) + + W(4, -1120788802, -1107200469, 1005054791, -1116359926) + + W(5, 1023918789, -1112013861, 1026671690, -1115047971) + + W(6, -1127228708, -1114604471, -1107279270, -1133439199) + + W(7, -1155086158, -1120863174, -1119270266, -1114777589); + WS(1049944452, -1118177299); + sum1 = + W(0, 1004954534, -1113835168, -1131743895, 1036431958) + W(1, 1034605113, -1117712807, 1044152226, -1113909672) + + W(2, 1042179871, 1049772083, -1105992217, 1034469319) + W(3, 1046072096, -1089565448, -1102704504, 1047091406) + + W(4, -1119832136, -1087875066, 1051885673, -1117867957) + + W(5, -1115172412, 1028249398, 1023284205, 1037431354) + W(6, 1021914321, -1115173764, 1032417701, -1128742159) + + W(7, -1125265763, 1016032028, 1023720959, 1027934165); + sum2 = + W(0, -1122048832, 1053033259, -1121809206, -1100778293) + W(1, -1102028824, 1033866732, 1014156522, 1033801710) + + W(2, -1098388207, -1083784972, 1055740053, -1112352078) + + W(3, 1042109429, 1035235216, -1104400409, 1046653262) + W(4, 1037898289, 1056376564, -1126110057, -1111071353) + + W(5, 1035691269, -1103367787, -1120368299, 1025902829) + W(6, -1120157845, 1034674212, 1015248281, 997672170) + + W(7, 1026959129, -1128193065, 984939091, -1153716682); + WS(-1165444096, -1119710264); + sum1 = W(0, 1042994118, 1051115175, -1098028621, -1108071955) + W(1, 1034244741, 1042802936, 1040688824, 1032455940) + + W(2, 1037778378, 1051394930, -1088773549, -1120702728) + + W(3, 1041081798, -1114386041, -1087521946, 1029133552) + + W(4, 1016348739, 1044466585, -1089153334, 1045508004) + + W(5, 1044760836, 1039392600, -1102706330, -1117660781) + W(6, -1126699940, 1042064672, 987979863, 1043978432) + + W(7, 1049969601, -1111502020, -1112154588, -1112358151); + sum2 = + W(0, -1113048377, 1060341068, 1067872749, -1107478445) + W(1, -1169925094, 1041247352, 1057359743, -1121919154) + + W(2, 1033233769, 999982909, -1089189226, -1112420946) + W(3, 1022227231, -1081289783, -1075624869, 1030919570) + + W(4, 973479782, -1090689511, -1088323315, 1049895882) + W(5, 1025958326, 1036288861, 1048635178, -1108655271) + + W(6, -1175748301, 1044034366, 1052769876, 1042449401) + + W(7, -1108998850, 1055733822, 1060416891, -1098757157); + WS(-1077066897, -1138646112); + sum1 = + W(0, 1024267775, -1092381223, 1053014632, 1025453154) + W(1, 1009759453, -1106693383, 1027242622, -1118474373) + + W(2, 1034803609, -1096180043, 1051220983, -1149202983) + + W(3, -1105412061, 1042083852, 1053447283, -1101608091) + + W(4, -1118414542, 1031147625, -1105039519, 1010847661) + + W(5, -1104989395, 1050244398, 1023828386, -1113932053) + W(6, 1000523125, 1024065726, -1110843104, 1023831870) + + W(7, -1099033634, 1045342865, 1028746421, -1113130950); + sum2 = W(0, 1013870164, 1032969077, 1050672871, -1105627059) + W(1, -1133465912, 1032956180, 1076869477, 1037977967) + + W(2, 1030888661, -1118666398, 1063553933, 1017901782) + + W(3, -1118337904, -1095979039, -1069322680, 1026329625) + + W(4, 1030672570, -1102611716, -1088200357, -1169512700) + + W(5, -1156287199, 1041525268, 1026168517, -1153801247) + + W(6, 1014316520, -1121602320, -1129519600, -1126632288) + + W(7, -1145191680, -1129518532, -1120095414, 1031405165); + WS(1059038658, 1028594353); + sum1 = + W(0, 1030613999, 1027001704, -1089493909, 1046010101) + W(1, -1132336275, 1035531624, -1094328658, 1026431736) + + W(2, -1117493948, 1032402678, -1106243079, 1043051950) + W(3, 1038489844, -1152158733, 1052296065, 1044337864) + + W(4, 1028206993, -1098315241, 1042911580, 1028671678) + W(5, 1044643916, -1088517514, 1049587060, 1032918142) + + W(6, 1007880004, -1103996748, 1035409673, -1137633217) + + W(7, 1043840791, -1091506711, 1044000434, 1036291743); + sum2 = W(0, -1118922878, -1105269646, 1050974192, -1110275215) + + W(1, 998383694, -1109062791, 1002191246, -1111322692) + + W(2, -1117830208, 1013977255, 1046707356, -1114811922) + + W(3, -1123342062, 1052555170, 1051646415, -1114439732) + + W(4, -1109116635, 1041098100, 1036678597, -1108145020) + + W(5, -1124252768, 1040874722, -1098775079, -1121186646) + + W(6, -1104593856, 1030669290, -1122565606, -1115485971) + + W(7, 1026377322, 1040986964, -1098750401, -1115223671); + WS(-1089038754, 1070610314); + sum1 = + W(0, 1006818038, -1112569734, -1110914124, 1038135388) + W(1, -1126323612, -1099849389, 1036085850, 1043645143) + + W(2, 1015379312, -1090696922, 1053776546, 1040122382) + + W(3, -1107760774, -1101892281, 1045400523, -1118717763) + + W(4, -1110158738, 1028620400, 1040930437, 1002760462) + W(5, -1104391397, 1047988033, -1132043583, 1016954112) + + W(6, -1114553627, 1043536901, -1119469430, 974497054) + + W(7, -1113068735, 1039930893, -1114659286, -1139206280); + sum2 = W(0, -1120363159, 1029972206, -1135126990, -1111466112) + + W(1, -1119340063, 1020623843, 1026762268, -1099605665) + + W(2, -1119078724, -1137841818, 1064611900, -1102195223) + + W(3, 1035843986, -1094446255, 1017486399, 1042926586) + W(4, 1035175754, 1049035968, -1094749382, 1014516782) + + W(5, -1106992039, -1128810267, 1039608352, -1112006203) + + W(6, -1128507307, -1123633215, -1194223384, -1136077530) + + W(7, -1129270833, -1123131987, -1197948696, -1129209333); + WS(-1120775200, -1094115106); + sum1 = W(0, -1117113151, -1112921839, 1046145098, -1107062579) + + W(1, -1133090109, -1099947345, -1097096777, -1151313622) + + W(2, -1096583070, 1050818928, 1048882552, -1100319675) + + W(3, -1098081804, 1057531117, 1067142180, -1094480203) + + W(4, -1092969217, 1051254629, 1054137781, -1100195749) + + W(5, -1119648950, -1098660371, 1035250696, -1111825641) + + W(6, -1113650835, 926574177, -1115652196, -1118408614) + + W(7, -1105675228, 1035449878, 1024424221, -1114839546); + sum2 = W(0, -1122846232, 1031116535, -1118531646, 1030028661) + + W(1, 1002183233, -1113707943, 1034244245, -1116699784) + W(2, -1129631292, 988543074, 1027624889, 1039671963) + + W(3, -1112395279, -1080457005, 1064104967, 1037992478) + + W(4, 1009610216, -1097715519, 1052372051, -1115290878) + W(5, 1001287537, 1037716560, 1011412016, 1016046512) + + W(6, -1122731504, -1112112395, 1031591085, -1122589730) + + W(7, -1139829356, 1031806339, -1128697528, 1022404309); + WS(-1083041826, -1088446577); + sum1 = + W(0, -1112868382, -1138041180, 1041478665, -1123809603) + W(1, -1139686881, 998832115, 1026886463, 1007627162) + + W(2, 1037998481, -1108164766, 1018740405, -1137074328) + + W(3, 1035817611, -1106005004, -1092605991, 1036557383) + W(4, 1028314191, 1054394898, -1096954228, 1043199331) + + W(5, -1112414119, 1042585939, -1105339656, 1016960213) + W(6, -1123391616, 1037009680, -1122534560, 949272012) + + W(7, -1152205450, 1027830053, -1128384493, -1161448845); + sum2 = W(0, 1036010005, -1080772886, -1110295637, -1113551367) + + W(1, -1112615912, -1080108640, 1033469827, -1118689741) + + W(2, -1108103320, 1042883784, 991295446, -1123719569) + W(3, 1026422893, 1067023817, -1106557392, 1039881895) + + W(4, 1043952518, 1065911618, 1015020021, 1028046949) + W(5, -1112407780, 1043418298, -1113416335, 986544491) + + W(6, 1025610945, -1121396391, -1118133995, 1028536389) + + W(7, -1142574731, 1019038275, 1027619053, -1114551687); + WS(1059656866, 1032254503); + sum1 = W(0, 1051132033, -1087438145, 1040121644, 1047684766) + W(1, 1032901415, -1096624519, 1045530925, 1031967406) + + W(2, 1050001035, -1093591378, 1040228252, 1044069767) + + W(3, 1051046262, -1092342973, -1096329486, 1050005760) + + W(4, 1024623477, 1024747921, -1100479077, 1045316401) + W(5, 1041030197, 1042870865, -1092498854, 1048633756) + + W(6, -1129401004, -1112612011, -1100524478, 1041789317) + + W(7, 1040932616, 1037509038, -1089145703, 1050363772); + sum2 = W(0, 1033723840, 1054927280, -1094930774, -1110893464) + + W(1, -1120765513, 1004192518, 1009606707, -1117945313) + + W(2, -1151198348, 1032813206, 1018976553, -1111742424) + + W(3, -1121736497, -1097617496, -1096835022, -1121652889) + + W(4, 1020727265, 994767756, -1114598300, -1144829382) + W(5, -1111733852, 1024454465, 1049726638, 1030389401) + + W(6, 1010605379, -1124374145, 1040837102, -1120942585) + + W(7, -1112033268, -1107458988, 1057385902, 1035752486); + WS(-1076352721, 1061176787); + sum1 = W(0, -1115567878, -1095051668, 1047858891, 1038434246) + + W(1, 1039493528, -1094852257, 1040618482, -1116442287) + + W(2, 1037423542, -1086623624, 1057001770, -1114755255) + W(3, 1022350014, 1044286862, 1036068672, 1022609452) + + W(4, -1114677168, 1057477914, -1086915318, 1037805114) + + W(5, -1123591576, 1049595083, -1095930750, 1044588197) + + W(6, -1143365955, 1036655988, -1108386213, 1031697064) + + W(7, -1114839417, 1044280124, 1029598047, -1119274549); + sum2 = W(0, 1018488840, -1104206436, -1111729053, 1004158510) + + W(1, -1109735653, 1012246375, -1117505825, -1122544930) + + W(2, -1113462230, -1114523900, 1042992721, -1111468709) + + W(3, -1112517262, 1056346033, 1051780099, -1133433375) + + W(4, -1108529674, 1029007760, 1042618199, -1114816198) + + W(5, -1112282852, -1106712811, 1035563022, -1136000711) + + W(6, 1002563934, -1113168793, 1024458488, -1122022613) + + W(7, 1011039855, -1115338003, -1112797570, 1037211560); + WS(1037340944, -1121222187); + sum1 = W(0, -1116495838, 1040689218, 1036502651, -1106495021) + + W(1, -1118176747, -1110298712, -1106426924, -1119752153) + + W(2, -1096308023, 1052341602, 1044624667, -1097659059) + + W(3, -1094205341, 1064260668, 1068943083, -1089978464) + + W(4, -1095502171, 1052009702, 1045175252, -1099820424) + + W(5, -1115640417, -1100646016, 1004526500, -1108261518) + + W(6, -1112496425, -1117627026, -1108867801, -1110958217) + + W(7, -1105702479, 1026863896, -1112879076, -1111070831); + sum2 = W(0, 1002312827, 1043920878, -1113959010, -1124888335) + + W(1, -1134403694, 1045056865, -1120905299, 1019347263) + + W(2, 1025097519, -1107896626, 1031903433, -1120916959) + + W(3, -1105297347, 1060319926, -1100397803, 1028583233) + + W(4, 1007461646, -1100756735, 1042137547, -1119634731) + + W(5, -1117960999, 1018292031, -1106899263, -1134844462) + + W(6, -1123847191, -1136355134, -1119650359, 998264859) + + W(7, -1129847887, -1108036266, 1033071013, -1109200858); + WS(-1087648930, 1056984912); + sum1 = W(0, 1027950097, 1048727276, -1101873716, -1111974664) + W(1, 1027762677, 1043573475, 1015678999, 1024202483) + + W(2, 1025406415, 1051177331, -1091649404, 1016025318) + + W(3, 1043195617, -1092810048, -1082302860, 1050173331) + + W(4, 1035903278, 1038252876, -1097139061, -1156961168) + W(5, 1031391740, 1044809191, 1038200652, 998750650) + + W(6, 1023913741, 1035706934, 1042041459, 1023377112) + W(7, 1033673899, 1020597221, 1041744649, -1114494621); + sum2 = + W(0, 1035604443, -1109665959, 1027481873, -1121529027) + W(1, -1113891962, 1017090586, -1115818981, 1006860245) + + W(2, -1155240851, 1033553543, 1023852497, -1124657042) + W(3, -1130359386, 1061263788, 1027230949, 1039189933) + + W(4, 1025386829, -1109330568, 1041592808, -1123139111) + W(5, 1028100153, -1106256683, -1113120233, 999905578) + + W(6, 1016774458, -1097657183, -1101411950, -1132638677) + + W(7, -1126789482, -1118236009, -1121071325, -1109638591); + WS(-1090940868, 1045539156); + sum1 = W(0, -1125495305, -1111842948, 1024315123, 1033322010) + + W(1, -1122547977, 1036262295, 1017057054, 1021788462) + W(2, 1049435900, -1083395945, 1046781659, 1041875702) + + W(3, 1022396558, 1050733040, 1016653136, 1032259903) + W(4, 1034779456, 1050803832, -1084181811, 1045300311) + + W(5, -1113477720, 1023164412, 1044787970, -1103054087) + + W(6, 1025152496, -1141132416, 1025666193, -1119238479) + + W(7, 1017461170, -1119150102, 1039405571, -1121753565); + sum2 = + W(0, -1111850352, -1154701652, 1008422401, -1128983709) + W(1, -1115334877, 1045060155, 1033609440, -1109145509) + + W(2, -1101312255, 1053683311, -1090718168, 1041457249) + W(3, -1131783421, 1041887968, 1047082317, 1009316297) + + W(4, 1037660946, -1090960245, 1034433310, 1037394704) + W(5, -1121261620, 1034919558, 1036748070, 1030040522) + + W(6, 1008969141, -1118627401, -1109720341, 1034723828) + + W(7, -1118719808, -1117531173, 998924330, -1122112519); + WS(1058382658, -1101786424); + sum1 = + W(0, -1110270554, 1020557616, 1042446649, 1010032145) + W(1, -1139041509, 1040419632, -1110579152, 1021044303) + + W(2, -1106470550, 1039037886, 1052788411, -1107378131) + + W(3, -1114587164, -1089217895, -1102603214, -1101971332) + + W(4, 1023988544, -1116816379, 1052497916, -1110520967) + + W(5, 1031022672, -1098005290, 1048850952, -1136091053) + W(6, 1028924449, 1030444000, 1041387232, -1142630143) + + W(7, 1026679274, -1105928314, 1042985742, 1036784631); + sum2 = W(0, -1122331173, 1021048143, -1121426033, -1141905806) + + W(1, -1116694246, -1117334358, 1034622720, -1109719947) + + W(2, -1133055086, 985385246, -1111822939, -1111398337) + + W(3, -1106162040, 1058597177, 1062397265, -1092732322) + + W(4, 1033705060, -1096472079, 1007125953, -1104483430) + + W(5, -1119866494, 1040447045, -1124693001, -1148551778) + + W(6, 1019582103, -1107345628, 1025700470, -1142669219) + + W(7, -1119480360, 1011504527, 1026572561, -1124513225); + WS(1062970978, -1081266569); + sum1 = W(0, -1102316771, 1049067654, 1040583110, 986432279) + W(1, 1026249566, 1049251698, 1039432874, 1031488060) + + W(2, -1104248914, -1100292756, 1040278772, 1034368766) + + W(3, 1037424006, -1086541140, -1096033842, 1046796153) + + W(4, 1035596338, -1092317470, 1045287213, 1039493185) + + W(5, -1122189220, -1101422105, 1049598341, 1029733120) + + W(6, 1016727466, -1130063849, 1043296141, -1132489681) + + W(7, 1006845944, -1103019359, 1042202275, 1032483937); + sum2 = + W(0, -1108138297, -1092863213, -1134447463, 1020893591) + W(1, 1024987284, -1095439435, -1107350452, 1030342296) + + W(2, -1107013954, 1054820060, -1104627754, 1023656240) + W(3, 1038311792, 991870971, 1058790229, -1145193326) + + W(4, -1140508767, 1019051815, 1049499199, -1111721419) + W(5, 999045582, 1003248078, -1113643053, -1124168067) + + W(6, 1010876103, -1122507350, 1040683258, -1111078930) + + W(7, -1139420079, -1120196608, -1107048418, 1036851190); + WS(-1090709444, 1049440503); + sum1 = W(0, -1112814366, 1025170444, 1021129071, -1116166456) + + W(1, 1009000949, -1102968365, -1107658202, 1013557870) + + W(2, -1102384190, 1054801672, -1108358704, -1112664461) + + W(3, -1098104133, 1055216649, 1055155742, -1102466049) + + W(4, -1100420271, 1007027006, 1062491877, -1093799886) + + W(5, -1117987732, 994631719, -1115514619, -1139587454) + + W(6, -1108681738, -1122456724, 1032182427, -1112800010) + + W(7, -1118237822, 1037835469, -1137063726, -1119596065); + sum2 = W(0, 1010269627, -1125700925, -1129465449, -1124401971) + + W(1, 1011116525, 1031004177, -1111184590, -1139731999) + + W(2, 1031226256, 991734042, -1090395945, -1123603568) + W(3, 1023655690, 1056735713, 1007034923, -1106780773) + + W(4, -1117593255, 1023598587, -1114530604, 1032362667) + + W(5, -1139919503, -1116020697, 1044588818, 1019563835) + + W(6, -1131886173, 1030692092, -1118660887, 1016903156) + + W(7, -1132337311, 1014084462, 1027760305, 1003383541); + WS(1052605444, -1096548047); + sum1 = W(0, -1135269079, -1099989408, 1035141158, -1157809579) + + W(1, 1014261129, -1107118442, 1022832721, 1034237928) + W(2, 1035728362, -1095069609, 1036930738, 1014945855) + + W(3, 1017149121, 1004173259, 1042230040, 1022065263) + W(4, 1022065234, -1102684265, 1051854441, -1149699425) + + W(5, -1106055602, 1026600311, -1123731628, 1033708682) + + W(6, -1122459306, 1029280393, 1039321653, -1120230985) + + W(7, -1120275059, -1114974728, -1108029264, 1040542518); + sum2 = W(0, -1139099893, -1078862437, -1097588090, -1129576496) + + W(1, -1102121527, -1076350607, 998819801, 1024729710) + + W(2, -1108414487, 1043522425, -1111980043, -1134118593) + + W(3, 1039987934, 1067956735, -1109442889, 1032654822) + W(4, 1045186917, 1072447081, 1044036972, -1118463242) + + W(5, -1096991255, 1053122067, -1115256553, -1124332658) + + W(6, 1033745090, -1111637970, 1027886256, -1123595298) + + W(7, -1102163660, 1040872955, 1044251533, -1115579557); + WS(1054231108, 1025279114); + sum1 = W(0, 1020527399, -1123453065, -1096862627, 1049493415) + + W(1, 1020186806, 1039341944, -1119337841, -1160786718) + + W(2, 1026191493, -1104689967, 1034733383, 1041541558) + W(3, 1046988234, -1092316960, 1008801448, 1041661776) + + W(4, -1147857037, -1122753069, -1108979241, 1034215919) + + W(5, 1041704764, -1093206832, 1050167121, 1032223662) + + W(6, -1120557618, -1107112804, 1027712531, -1156220183) + + W(7, 1039867950, -1094240131, 1043962418, 1036558383); + sum2 = + W(0, -1156731980, -1121143571, 1027150242, 1019039796) + W(1, -1125155383, 1021067288, 1024911074, -1128517034) + + W(2, -1153680156, -1101109237, -1096825521, 1036906894) + + W(3, -1140765671, -1079877582, -1088644111, -1110310177) + + W(4, 1018992688, -1094350155, -1113080073, 1019841700) + W(5, 1030176462, 1058234221, 1052444813, 1000349534) + + W(6, 1027890172, 1064456596, 1024094624, -1128055622) + W(7, 1018002108, 1058386161, 1045751986, -1134555143); + WS(-1097731588, 1025129315); + sum1 = + W(0, 1033609822, 1037092684, -1099469177, -1125480775) + W(1, 972033083, -1118357663, -1139849211, -1113410371) + + W(2, 1036940225, 1046113067, -1089626010, 1035911587) + W(3, 1025915127, 1050865438, -1143345853, 1047135499) + + W(4, 1037164536, -1109542297, -1104510832, 1038594118) + W(5, 1018117854, 1047810219, -1097851227, 1031924197) + + W(6, 1009743167, -1111680192, -1113708160, -1146462713) + + W(7, 1021572178, 1036701507, -1110047355, -1120871309); + sum2 = W(0, -1124965724, 1029789829, -1119672690, -1132623148) + + W(1, -1134630348, -1105084635, 1036116775, -1123511646) + + W(2, -1138485084, 1035852445, 1002738585, -1106888257) + + W(3, -1143859545, 1050249105, 1057234226, -1097411434) + + W(4, -1133066340, -1114135764, -1115375290, -1109817844) + + W(5, 1030422253, 1024721985, -1117221657, 1017260494) + + W(6, -1121255807, -1120848177, 1007172972, -1118819718) + + W(7, 1003464777, 1033535897, -1110249095, 1021514610); + WS(1064258306, 1057427735); + sum1 = + W(0, 1046669668, 1041288794, -1094345727, 1024557366) + W(1, 1048078371, 1002554246, -1107049340, 1026345305) + + W(2, 1049007041, 1039217007, -1092155570, -1126800432) + + W(3, 1043467602, -1117262306, -1100296810, 1017273727) + W(4, 1032131185, 1041191743, -1101509636, 1027549470) + + W(5, 1040278032, 1037075392, -1100720075, -1136038899) + W(6, 995640096, -1121877906, 1015117221, -1134767685) + + W(7, -1135631084, 1026049048, 1034147956, -1111532367); + sum2 = + W(0, -1083389635, 1062132206, -1122840851, -1127222139) + W(1, -1081609637, 1066099523, 1053156114, 1022631188) + + W(2, -1079976349, 1066066300, -1105997303, 1027246780) + + W(3, -1090363224, 1067427062, -1091867230, -1128121946) + + W(4, -1100056051, 1049064133, -1103783968, 1036294091) + W(5, -1097029007, 996873905, 1048340523, -1115106526) + + W(6, 1028030408, -1137063332, -1134953960, 1035025213) + + W(7, -1118886369, 1035057689, -1104392578, -1117772337); + WS(-1082692450, -1121765493); + sum1 = + W(0, -1112587635, 992292947, 1015927970, -1121302066) + W(1, -1118487719, -1104534315, 1038416886, -1121296341) + + W(2, -1105756568, 1049230729, -1104867982, 1043167221) + W(3, -1111631170, 1048175951, 1051898365, 1037146590) + + W(4, 1036199927, -1089217933, 1057590961, -1113442509) + + W(5, -1106833087, 1028715132, -1104675396, 1030891673) + + W(6, -1115752014, -1121927694, 1012516667, -1121397517) + + W(7, -1109370235, 1018481703, 1022215305, -1113425325); + sum2 = W(0, -1102561169, 1040868564, -1126923948, -1123351116) + + W(1, 1026098771, 1021710972, 1009959824, -1125337962) + W(2, -1149524831, 1048116590, 1037970343, 1024724387) + + W(3, -1113975834, 1041914200, 1042300553, -1123062396) + + W(4, -1157274159, 1051191259, 1032086087, 1021621986) + + W(5, -1105234356, 1039729263, -1097615037, -1105344931) + + W(6, 1008573990, 1018638481, -1115639834, -1109718449) + + W(7, -1102778536, 1035375403, -1115667744, -1105611058); + WS(1063145570, 1065948321); + sum1 = + W(0, -1113780043, 1042647928, 1023153433, -1113344071) + W(1, -1107415145, 1041877314, -1105577826, 1034763992) + + W(2, -1103697695, 1043379605, 1035095074, -1113485016) + + W(3, -1125795137, -1105676766, 1058030732, -1107021830) + + W(4, -1119226457, -1093770877, 1049757493, -1116457366) + + W(5, 1032469064, -1098882227, 1047432094, 1028002580) + W(6, -1118570362, 1029896809, -1106671851, 1033670420) + + W(7, -1148759702, 1007275454, -1110160160, 1021171309); + sum2 = + W(0, 1033443671, -1147652316, -1122182070, -1114870166) + + W(1, -1119163512, 1034562054, -1110746439, -1126213983) + + W(2, 1032648925, 1044843888, -1104224164, 1033622730) + W(3, 1022262943, -1082830049, -1080473697, 1036499220) + + W(4, -1121656898, 1049609982, 1070472721, 1042757767) + W(5, -1125619769, 1025258841, 1045148854, -1125695843) + + W(6, -1116250872, 1030706970, -1138594966, -1109235057) + + W(7, 983397903, 1030898199, 1015661307, -1105016797); + WS(1047808392, -1105857653); + sum1 = + W(0, 1036414223, 1057255335, -1089047968, 1019549874) + W(1, 1038664639, 1050583338, -1095111703, 1027946812) + + W(2, 1033646416, 1052085724, -1090242223, 1014185453) + W(3, 1045309491, -1112577010, -1088425805, 1038762993) + + W(4, 1028560677, 1049269098, -1097592171, 1038356881) + W(5, 1047007737, -1101673225, 1024927375, -1120878336) + + W(6, 1035626955, 1020504170, 988289723, 1031636916) + W(7, 1052689664, -1098667351, -1153489085, -1106190208); + sum2 = + W(0, 1050181400, -1084160527, -1088778570, 1059321043) + W(1, -1114267734, 1035785784, -1097051496, -1113170400) + + W(2, 1015251419, -1094891239, -1096397593, 1035392846) + + W(3, -1097894374, 1060354212, 1063793540, -1098458292) + W(4, 1014394222, 1045924604, -1132415773, 1030978836) + + W(5, -1098468098, 1054874631, -1115217527, -1096505073) + + W(6, 1043075035, 1042828743, -1098450150, 1042772598) + + W(7, -1092845444, 1063378281, 1051615858, -1088082125); + WS(-1073783985, -1080098540); + sum1 = + W(0, 1012137476, 1004414705, 994170013, -1135747626) + W(1, -1111733448, -1125334283, 1040796537, -1106294475) + + W(2, 1027546650, -1098951217, 1045494048, -1105932043) + + W(3, -1095391448, 1058781709, 1038631039, -1097893467) + + W(4, -1107725963, 1056582836, -1099332954, 1027155091) + W(5, 1030910366, 1054585131, -1102018612, 1001385357) + + W(6, 1024902311, -1118558951, -1106829042, -1141795121) + + W(7, -1136391487, 1012935090, -1113109295, -1118975220); + sum2 = W(0, -1136577003, -1161174488, -1123274403, 1021768566) + + W(1, -1123969951, -1115268047, 1023359390, -1128609502) + + W(2, -1126970134, -1111829747, 1034323377, 1026568479) + + W(3, 1039844510, -1078035036, -1085317526, 1027511085) + W(4, 1037108170, 1072008544, 1044555209, 986504280) + + W(5, -1182117728, 1038025274, 1032404118, -1139830523) + + W(6, 1024145219, 1006927579, 1024479257, -1127097094) + W(7, -1107924935, 1013110307, 983390936, 1022685546); + WS(-1104974728, 1024380720); + sum1 = W(0, -1117848102, -1117883163, 1036325571, -1131530510) + + W(1, 1021171896, -1127535108, 1018298053, 1031544042) + W(2, 1039153371, -1099610928, 1041104624, 982295861) + + W(3, 1036503965, -1100771573, -1101972463, 1036843369) + W(4, 988770395, 1043814114, -1133844875, 1029874576) + + W(5, -1109841905, 1034691017, -1107251369, 1031396654) + + W(6, -1121562883, 1034709362, 1025626276, -1125713989) + + W(7, -1126175513, 1004793673, -1111468989, 1034135320); + sum2 = W(0, -1125393898, 1071281072, 1044770418, 1011595325) + W(1, 1044163006, 1072425553, -1125402454, 1021558362) + + W(2, 1045704700, -1104699996, 1018560910, 1010524637) + + W(3, -1110276988, -1078765241, -1098423872, -1113439186) + + W(4, -1099412627, -1076152216, -1103281302, -1178088596) + + W(5, 1044569612, -1100004941, 1028856833, 1019143058) + + W(6, -1115657155, 1036033265, -1123488110, -1126446200) + + W(7, 1037394103, -1111185479, -1117821699, 1026998165); + WS(1066498257, 1026989550); + sum1 = W(0, -1129927868, 1023571545, 1016605513, -1133253141) + + W(1, -1123659738, 1024686464, -1143882757, 1025371048) + + W(2, 1045121333, -1084187390, 1042249043, 1033458708) + W(3, 1002634947, 1040895252, 1054068239, 1032849928) + + W(4, 1036944705, 1040663099, -1089079196, 1049903454) + W(5, 970850411, -1115004776, -1120675276, 1024612748) + + W(6, 1022709187, 1024409057, -1112524513, 1017685954) + + W(7, 1004856149, 1001199419, -1120648472, -1117202350); + sum2 = W(0, 1038138620, -1106434423, 1014840059, -1117610677) + + W(1, -1155040203, 1038340354, -1105689565, 1038431916) + + W(2, 1049419982, -1087069176, -1102609737, -1115449783) + + W(3, -1094597030, 1064410985, 1043321526, -1117967352) + + W(4, 1022703337, -1110711879, 1043390477, -1107988055) + + W(5, -1117198782, -1112639315, 1042536365, -1112813855) + + W(6, -1132959015, 1026273617, 1036470844, -1122022929) + + W(7, -1121486321, -1123727669, 1009362023, 1031915394); + WS(1059170114, -1115069681); + sum1 = + W(0, 1041126528, 1039057944, -1114418030, -1125005432) + W(1, 1031327889, 1043197758, 1035998588, -1184440086) + + W(2, -1137442701, 1057495242, -1086197480, -1107377807) + + W(3, 1027929903, 1035662548, -1092661254, -1131407372) + W(4, 1016336432, 1036387882, -1098594899, 1031309989) + + W(5, 1045677858, 1043295874, -1097533773, 1017102598) + W(6, 1027533272, 1020376880, -1116322521, 1036182828) + + W(7, 1040648584, 1035357519, -1106979748, -1128058314); + sum2 = + W(0, 1029223181, -1099457044, -1094833228, 1022472216) + W(1, 1035999136, -1123134927, -1107153986, -1129014496) + + W(2, 1032743888, -1106245137, 1052844759, 1034397600) + W(3, 1050206678, -1115721168, 1029163621, 1043654862) + + W(4, 1030968394, 1035536761, 1046847142, -1114537747) + W(5, 969652021, -1109098872, -1111905268, -1149928759) + + W(6, 1018474295, -1136790748, -1116305850, 968266517) + + W(7, -1138117380, -1105152866, -1102858563, 1033858063); + WS(-1091215044, -1097536449); + sum1 = W(0, 1036334229, -1088688205, 1028067640, 1049627927) + W(1, 1027816414, -1110004986, 1025245044, 1039037582) + + W(2, 1046343318, -1088611549, -1104070412, 1048707955) + + W(3, 1054850406, -1085760696, -1089807987, 1052669472) + W(4, 1041878433, -1113122464, 990395721, 1043177720) + + W(5, 1040414769, -1115511970, 1024229024, 1039929856) + W(6, 1017820267, -1113420363, 1028468150, 1044644789) + + W(7, 1047750528, 1034437006, -1097347774, 1048578060); + sum2 = W(0, -1114440831, 1036847317, 1041890716, 1027069126) + W(1, 1030624098, 1042295753, -1115362087, 1021176355) + + W(2, 988636086, 1050034374, -1113867927, 1029167466) + W(3, -1132718391, 1031424194, 1016671019, 1028661170) + + W(4, 1030310950, -1119733782, -1130826523, -1183083952) + + W(5, 1016098323, -1120554286, -1097953797, -1108500823) + + W(6, 1024855622, -1114648667, -1146049358, 1027651154) + + W(7, 1018716851, 1035432255, -1096082463, -1106095247); + WS(-1074893425, -1117971628); + sum1 = W(0, -1094367290, 1052023128, 1042452051, -1107223211) + + W(1, -1152038187, 1049322869, -1097322793, 1034136520) + + W(2, -1103630563, -1111356283, 1049675109, -1112379016) + + W(3, -1098786216, 999054287, 1040732760, -1102728254) + W(4, 1037656965, -1106664801, 1040645714, 1016544493) + + W(5, -1114777697, -1093651375, 1057236855, -1125564586) + + W(6, 1025099466, 1040611874, 1040783587, -1105965314) + + W(7, -1124130662, -1094570594, 1055134184, 1008351835); + sum2 = W(0, 1004001863, -1116735450, -1111481570, 1033584975) + + W(1, 1021526755, 1032892007, 1024548251, -1130001464) + + W(2, 1018968138, -1096890588, -1073615974, 1026017190) + + W(3, -1116175346, -1099974349, -1071438395, -1121576034) + + W(4, -1139174407, -1103015201, -1146527383, -1164624762) + + W(5, 1031843333, 1040986630, 1076155388, 1024580999) + W(6, -1131104448, 1035109709, 1074182350, 1043256283) + + W(7, 1009509771, 1041412407, 1041860718, -1106441216); + WS(1040475912, 1032695578); + sum1 = W(0, -1124525022, -1112011377, 1035534023, -1136466746) + + W(1, -1155851319, -1123298122, -1102944834, 1035920825) + + W(2, 1035372099, -1091278169, 1055301749, -1130626274) + + W(3, -1122500130, 1056532699, 1041895809, -1104812886) + + W(4, -1172701842, 1054708857, -1087252087, 1028924087) + + W(5, 1033773669, -1105035590, 1039100863, -1111589035) + + W(6, 1014757675, 1007501482, -1123874252, -1142366545) + + W(7, -1116930196, 1026134833, 1036316385, -1110262076); + sum2 = + W(0, -1109091355, 1041703749, -1120034208, 1010537508) + W(1, -1119792870, -1123886114, -1123320808, 1026411366) + + W(2, -1111337413, 1026232126, 1045621744, 1015836410) + W(3, -1102054262, 1049335147, 1063803841, -1098413574) + + W(4, -1118550690, -1114718085, -1088756378, 1041947548) + + W(5, -1113960445, -1111978783, 1016064880, -1123461018) + + W(6, -1142500624, -1124340572, 1026268254, 999681904) + + W(7, -1109065069, 1020384670, 1030310973, -1122952578); + WS(1060902754, 1050355625); + sum1 = + W(0, -1156790206, -1099711167, 1048936605, 975051222) + W(1, -1151083459, -1104333225, 1047935457, -1120760458) + + W(2, 1011568442, -1101534272, 1041411896, 1040804594) + W(3, 1023922682, -1082482317, -1103038759, 1043235660) + + W(4, 1024500211, -1107281952, 1049946264, 998453633) + W(5, -1112644265, 1053813598, 1036831245, 1030084558) + + W(6, 1033389138, 1025001795, 1037700978, 1007099659) + W(7, -1104847739, -1116841801, 1030797274, 1035779080); + sum2 = + W(0, 1036801640, -1106066969, -1098529900, 1051617655) + W(1, -1120633215, 1029646415, -1094622159, -1128436081) + + W(2, 1043653368, -1102845552, 1045091011, -1108268977) + W(3, 1045612039, 1020964885, 1062435502, -1120809462) + + W(4, -1100846658, 1041841354, -1104869009, -1127923721) + + W(5, 976462574, -1088569123, 1054359824, -1115259155) + + W(6, -1115109418, -1101549413, -1101036113, 1041018201) + + W(7, -1097687290, 1054633350, 1044975639, -1102739129); + WS(-1090140642, -1081743990); + sum1 = + W(0, 1014408182, 1037549524, -1119977588, -1148996265) + W(1, -1130293844, 1009886528, 1031805064, -1107483388) + + W(2, 1031847606, 1044394635, -1097431626, 1015837167) + W(3, 1042594418, 1037202321, -1094879521, 1035016080) + + W(4, 1041618980, -1117833212, -1119842097, 1032499967) + W(5, 1035968392, 1037634256, -1101547735, 1034663662) + + W(6, 1009499077, -1122700465, -1107123493, 1017023585) + + W(7, 1033368909, 1015596142, -1105308242, 1030806526); + sum2 = W(0, -1123785792, 1013646496, -1105735433, 1032589029) + + W(1, 1006912162, -1120892227, 1034054467, -1113324539) + + W(2, -1091554339, 1057715626, -1103626228, 1043157583) + + W(3, -1071648513, 1076150687, -1110563164, 1029343874) + + W(4, -1078529007, 1069469884, 1025732222, -1120727508) + + W(5, -1106043455, 1049558148, -1102425071, 1029688242) + + W(6, -1108743589, 1035924910, 1028146935, -1120545616) + + W(7, -1113325201, 1038760139, 1001130061, -1123660578); + WS(1055430148, -1108560690); + sum1 = + W(0, 1035961997, -1122962962, 1001804274, -1109508687) + W(1, 1035029338, -1107101862, 1037435821, -1114596033) + + W(2, 1036894711, -1105458486, 1049324163, -1105968336) + + W(3, 1041930516, -1102453987, -1115462345, 1030068713) + W(4, 1018389269, 1050880022, -1096234295, 1023650152) + + W(5, -1113968413, 1050461237, -1096034793, 1041307521) + W(6, 1026969083, 1017425654, -1105484423, 1023939770) + + W(7, -1119268932, 1049028992, -1109268985, -1110794404); + sum2 = W(0, 1020921672, -1133145023, 967639540, 1057583079) + W(1, 1015626891, 1000680715, 1038163303, 1066461314) + + W(2, -1131154511, 1034643892, 1029820070, 1070593780) + + W(3, -1149322267, -1106033700, 1027175814, 1042500058) + + W(4, 1005570725, -1155618307, 1050725869, -1076733999) + + W(5, -1122484266, 1030350968, -1107328459, -1075365186) + + W(6, -1125609227, -1127714103, 984351189, -1095092572) + + W(7, 1019773418, 1027949553, -1113454879, 1026351361); + WS(1048611396, -1120253991); + sum1 = W(0, -1109906484, -1104843595, 1042068462, 1029221016) + + W(1, -1134442421, 1020368935, -1116357012, 1014414830) + + W(2, -1157090745, -1102655324, -1127594975, 1044033359) + + W(3, 1038629782, -1096452233, 1048790986, 1052393436) + W(4, 1019276152, -1094801150, 1026936628, 1029702657) + + W(5, 1008425488, -1098953977, 1044903358, -1137141374) + + W(6, -1121251029, -1125379561, 1031973931, -1117911220) + + W(7, -1115994974, -1120481658, 1042932491, 1022285443); + sum2 = W(0, -1129566974, -1111784437, 1050813877, -1093517653) + + W(1, -1143746400, 1036277891, 1047551505, -1098527209) + + W(2, 1036033029, 1028988774, 1061486774, -1081514759) + + W(3, -1117052801, -1100779042, 1077969880, -1071648362) + + W(4, -1123748463, 1044450885, 1055586292, -1089190754) + + W(5, 1038502321, -1129810696, -1131992338, -1107152864) + + W(6, -1138810328, 1034348699, 1040643987, -1111885211) + + W(7, 1043607047, -1108082071, -1108034712, 1025200270); + WS(-1095808772, 1065647947); + sum1 = W(0, -1096536264, 1055051378, -1152511995, -1101629224) + + W(1, -1104862109, 1050045579, -1106144343, -1139560206) + + W(2, -1101976087, 1051209263, -1114400236, -1118447811) + + W(3, -1101730853, 1045989771, 1051130659, -1101507019) + + W(4, -1126516760, -1096666661, 1054814183, -1103658466) + + W(5, -1106707963, -1098537885, 1057272194, -1098960762) + + W(6, -1123882077, 1021791993, 1047598263, -1106849375) + + W(7, -1108125731, -1104774017, 1057816237, -1104521538); + sum2 = W(0, -1110633145, 1046325680, -1106205960, -1121981161) + + W(1, -1114352725, -1134514653, -1145236426, -1115188107) + + W(2, -1120367533, 1030462840, -1121802017, 1009337269) + + W(3, -1113576661, 1052343557, 1052169724, -1122467029) + + W(4, -1147392026, 1028577898, -1126550987, -1112707841) + + W(5, -1111220567, -1127265311, 967975074, -1123885069) + + W(6, -1123261925, 1023140267, -1125641651, -1109514951) + + W(7, -1131596567, -1109705515, 1019189507, 1036097210); + WS(-1088656098, -1093593990); + sum1 = W(0, 1009988669, 1053407451, -1093246956, 1009810317) + W(1, 1006243392, 1046462824, -1100605512, 1021367180) + + W(2, -1118924498, 1054487499, -1092703459, 1031892963) + + W(3, 1040203342, 1043824044, -1110184012, -1115326423) + + W(4, 1030956655, -1107509853, 1041099456, 1009525296) + + W(5, 1015251645, -1099069067, 1036164518, -1102894371) + + W(6, 1032654584, -1114843936, 1040232112, -1121673919) + + W(7, 1034196708, -1106663601, 1035276411, -1120762380); + sum2 = W(0, 1045046842, -1111686548, -1120613757, -1123157156) + + W(1, 1057379920, 1047338924, 1041926325, -1122209414) + W(2, 1066661430, 1044625920, 1010608356, 1026048962) + + W(3, 1065556520, -1108706635, -1107659276, -1118064370) + + W(4, -1100359290, 1040575208, 1029226052, 1036917588) + W(5, -1079104557, 1048831397, 990146073, -1118722317) + + W(6, -1080513286, -1106604517, -1122878530, 999828841) + + W(7, -1090732450, -1118381857, -1148427089, -1128484108); + WS(-1103417864, 1032685901); + sum1 = W(0, -1113840082, 999140540, 1026362243, 1025795300) + W(1, -1101895278, 1021813182, 1049323684, -1104186210) + + W(2, -1106883347, 1050838637, -1123649147, 1026463622) + + W(3, -1112947643, 1035808888, -1115046028, 1015970396) + + W(4, 1045150312, -1089518824, 1051398592, 1028121997) + + W(5, -1106874992, -1112862903, 1043843226, -1114287989) + + W(6, -1122615424, -1123587264, 1032255888, -1148228092) + + W(7, -1140285221, 991482976, 1025625239, -1125179546); + sum2 = W(0, 1052414494, -1107019340, 1021676257, -1118630717) + + W(1, 1041601968, 1032004449, -1101889010, 1028135044) + W(2, 1061231009, -1083281727, 1040520305, 994543087) + + W(3, -1094738093, 1048799024, -1113266306, 1023423300) + + W(4, -1090047391, 1060484354, -1097572834, 1023744190) + + W(5, -1112254382, 1026094686, 1047868927, -1123297050) + + W(6, -1124055261, 1028491114, -1106439707, -1134044699) + + W(7, -1106989530, 1016363351, 1039531031, -1135541243); + WS(1062251010, -1128406975); + sum1 = + W(0, -1122559590, -1114430084, 1041522773, -1200477464) + W(1, -1117783082, 998905218, -1122146129, 1030594936) + + W(2, -1111223497, -1117430765, 1049934150, -1117296696) + + W(3, -1097132645, 1043264160, 1038499861, -1108127936) + + W(4, -1118294493, -1137238321, 1040349396, -1117164622) + + W(5, 1027318465, -1109365760, 1038350478, 1008104625) + W(6, -1122628178, 1012147781, -1161426505, 1016497826) + + W(7, -1142140116, -1112437644, 1022231761, 1030977566); + sum2 = + W(0, -1117898288, 1035048481, 1015521050, -1121110162) + W(1, -1125963325, 1029071818, -1131842712, -1139107970) + + W(2, -1090182563, 1058090849, -1155119281, -1131029094) + + W(3, -1072766634, 1075259304, -1099596444, 1037152077) + W(4, -1084699977, 1062748800, 1015646848, 1018972128) + + W(5, 1030742992, -1113008632, -1124623837, 1025197316) + + W(6, -1114032290, 1039805619, -1116189732, -1127481518) + + W(7, 1021721886, -1113709765, -1146515621, 1027813594); + WS(1065708113, -1121751611); + sum1 = + W(0, -1151170552, 1004700116, 1029908854, -1203182552) + W(1, -1113367966, 1033929377, -1124121476, -1152107167) + + W(2, -1132161740, 1028879143, 1021289212, 985230639) + W(3, -1102777150, 1048992314, -1106962671, -1118004497) + + W(4, 1008580363, -1130586604, -1145749780, 1024087440) + W(5, 1034637855, -1123817297, 1010684790, 1024857134) + + W(6, -1122909571, 997138991, -1110778290, 1018524741) + + W(7, 1029317996, -1119780649, -1119558682, 1030859440); + sum2 = W(0, 1022085973, -1128031215, 1012976820, -1176062153) + W(1, 1007192988, 982756722, -1124806095, 1022708360) + + W(2, 1059325611, -1087213694, 1030136738, -1120463845) + + W(3, 1078660314, -1070139299, -1095156098, 1033425170) + + W(4, 1067996709, -1079390657, -1131018297, -1138793506) + + W(5, -1179370697, -1159362498, 1019962283, -1124014927) + + W(6, 1033764027, -1110724756, 1025926144, 1016277465) + + W(7, 1000911377, 1028041806, -1121497459, -1138055830); + WS(1067144001, 1026092834); + sum1 = + W(0, 1005864375, 1049810486, -1103125415, -1120236446) + W(1, 1014388109, 1020396467, 1040462414, -1132016387) + + W(2, -1110877439, 1055042333, -1103579165, -1107048544) + + W(3, -1100539124, 1042867979, -1096204250, -1116193256) + + W(4, -1110133357, 1031992147, 1048911295, 1010104860) + W(5, -1126225268, 1044290490, -1091768605, 1031444773) + + W(6, 1033891677, 1034565181, -1114007278, 1030176378) + W(7, 1016160519, 1034066560, -1112003369, 1031923300); + sum2 = W(0, -1130823435, -1123834023, 1036568073, -1114604843) + + W(1, -1108591076, 1045671991, -1106172311, 1024976861) + + W(2, -1112679806, -1133291790, -1115701009, 1033105292) + + W(3, -1095898825, 1058163296, 1057311204, -1122476787) + + W(4, -1107310218, -1100325346, -1097367248, 1035411458) + + W(5, 1030441654, -1113640367, 1044352434, -1111920852) + + W(6, -1128226189, 1016405480, -1106561364, 1031834977) + + W(7, 1031713190, -1116067001, 1014762708, -1121017007); + WS(1057420226, -1092362255); + sum1 = W(0, 1032475105, 1044920519, -1103664666, -1114304581) + + W(1, 1020346174, -1144052776, 1027257637, -1116794957) + + W(2, -1121587297, 1052978802, -1096869991, -1103967019) + + W(3, 1019256762, 1055322687, -1116373310, -1100439285) + + W(4, -1123769862, -1104246416, 1028318277, 1018564517) + + W(5, 1033058515, 1040777765, -1096789598, 1036089864) + W(6, 1024808486, 1016898380, -1118572551, 1021198731) + + W(7, 1030782351, 1041983019, -1106323631, -1130998630); + sum2 = + W(0, -1134184569, 1016741405, 1020516693, -1102863001) + W(1, 1006994613, -1130764191, 1043863088, -1103907912) + + W(2, 1034914936, 1033077740, 1060988002, -1084447988) + + W(3, -1134366153, -1112456708, 1071901111, -1076633620) + + W(4, 1033598449, 1043198162, 1043355315, -1098165823) + W(5, 1009154259, -1132669129, 1018979141, -1118646231) + + W(6, 989883430, 1016038391, 1034096544, -1113048166) + W(7, 1021229932, -1126067903, 1022348007, -1118544043); + WS(-1105493768, -1082709441); + + return clamp(mstd0 + 5.0 * vsum / wsum * mstd1, 0.0, 1.0); +} + +shared float inp[429]; + +#define CURRENT_PASS 1 + +#define GET_SAMPLE(x) dot(x.rgb, rgb2y) +#define imageStore(out_image, pos, val) imageStoreOverride(pos, val.x) +void imageStoreOverride(uint2 pos, float value) { temp[pos] = (value); } + +#define INPUT_tex(pos) GET_SAMPLE(vec4(texture(INPUT, pos))) +static const float2 INPUT_size = float2(GetInputSize()); +static const float2 INPUT_pt = float2(GetInputPt()); + +#define HOOKED_tex(pos) INPUT_tex(pos) +#define HOOKED_size INPUT_size +#define HOOKED_pt INPUT_pt + +void Pass1(uint2 blockStart, uint3 threadId) { + ivec2 group_base = ivec2(gl_WorkGroupID) * ivec2(gl_WorkGroupSize); + int local_pos = int(gl_LocalInvocationID.x) * 11 + int(gl_LocalInvocationID.y); + for (int id = int(gl_LocalInvocationIndex); id < 429; id += int(gl_WorkGroupSize.x * gl_WorkGroupSize.y)) { + uint x = (uint)id / 11, y = (uint)id % 11; + inp[id] = + HOOKED_tex(HOOKED_pt * vec2(float(group_base.x + x - (3)) + 0.5, float(group_base.y + y - (1)) + 0.5)).x; + } + barrier(); + vec4 ret = vec4(0.0, 0.0, 0.0, 0.0); + vec4 ret0 = vec4(0.0, 0.0, 0.0, 0.0); + vec4 samples[8]; + samples[0][0] = inp[local_pos + 0]; + samples[0][1] = inp[local_pos + 1]; + samples[0][2] = inp[local_pos + 2]; + samples[0][3] = inp[local_pos + 3]; + samples[1][0] = inp[local_pos + 11]; + samples[1][1] = inp[local_pos + 12]; + samples[1][2] = inp[local_pos + 13]; + samples[1][3] = inp[local_pos + 14]; + samples[2][0] = inp[local_pos + 22]; + samples[2][1] = inp[local_pos + 23]; + samples[2][2] = inp[local_pos + 24]; + samples[2][3] = inp[local_pos + 25]; + samples[3][0] = inp[local_pos + 33]; + samples[3][1] = inp[local_pos + 34]; + samples[3][2] = inp[local_pos + 35]; + samples[3][3] = inp[local_pos + 36]; + samples[4][0] = inp[local_pos + 44]; + samples[4][1] = inp[local_pos + 45]; + samples[4][2] = inp[local_pos + 46]; + samples[4][3] = inp[local_pos + 47]; + samples[5][0] = inp[local_pos + 55]; + samples[5][1] = inp[local_pos + 56]; + samples[5][2] = inp[local_pos + 57]; + samples[5][3] = inp[local_pos + 58]; + samples[6][0] = inp[local_pos + 66]; + samples[6][1] = inp[local_pos + 67]; + samples[6][2] = inp[local_pos + 68]; + samples[6][3] = inp[local_pos + 69]; + samples[7][0] = inp[local_pos + 77]; + samples[7][1] = inp[local_pos + 78]; + samples[7][2] = inp[local_pos + 79]; + samples[7][3] = inp[local_pos + 80]; + ret[0] = nnedi3(samples); + ret0[0] = inp[local_pos + 34]; +#if CURRENT_PASS == LAST_PASS + uint2 destPos = blockStart + threadId.xy * 2; + uint2 outputSize = GetOutputSize(); + if (destPos.x >= outputSize.x || destPos.y >= outputSize.y) { + return; + } +#endif + imageStore(out_image, ivec2(gl_GlobalInvocationID) * ivec2(1, 2), ret0); + imageStore(out_image, ivec2(gl_GlobalInvocationID) * ivec2(1, 2) + ivec2(0, 1), ret); +} +//!PASS 2 +//!DESC NNEDI3 (double_x, nns64, win8x4) +//!IN INPUT, temp +//!OUT OUTPUT +//!BLOCK_SIZE 64, 8 +//!NUM_THREADS 32, 8 +#pragma optionNV(inline none) +float nnedi3(vec4 samples[8]) { + float sum = 0.0, sumsq = 0.0; + [unroll] for (int i = 0; i < 8; i++) { + sum += dot(samples[i], vec4(1.0, 1.0, 1.0, 1.0)); + sumsq += dot(samples[i], samples[i]); + } + float mstd0 = sum / 32.0; + float mstd1 = sumsq / 32.0 - mstd0 * mstd0; + float mstd2 = mix(0.0, inversesqrt(mstd1), mstd1 >= 1.192092896e-7); + mstd1 *= mstd2; + float vsum = 0.0, wsum = 0.0, sum1, sum2; +#define T(x) intBitsToFloat(x) +#define W(i, w0, w1, w2, w3) dot(samples[i], vec4(T(w0), T(w1), T(w2), T(w3))) +#define WS(w0, w1) \ + sum1 = exp(sum1 * mstd2 + T(w0)); \ + sum2 = sum2 * mstd2 + T(w1); \ + wsum += sum1; \ + vsum += sum1 * (sum2 / (1.0 + abs(sum2))); + sum1 = W(0, 1040079017, -1129953383, -1112255447, -1100320116) + + W(1, 1039284509, 991372703, 1013856427, -1108390802) + W(2, -1115658697, 1052077971, 1056937139, 1052646725) + + W(3, -1091236407, -1106109018, -1112818013, 1030287040) + + W(4, -1107150591, -1102425550, -1089460941, 1029401490) + + W(5, 1057992884, 1043570389, 1044897031, 1028923089) + W(6, -1119789534, 1027055297, 1033358144, -1121552872) + + W(7, -1097729145, -1111268755, -1110301789, -1132036495); + sum2 = + W(0, -1108031914, 1026461175, 1032549274, 1041814131) + W(1, 1017353224, -1121140359, -1132764107, -1138465879) + + W(2, -1118430023, 1041449883, 1072973866, -1076980873) + + W(3, -1111091488, 1028730196, -1121430441, -1127880506) + + W(4, 1012288055, 1027150813, 1049697467, -1082819831) + W(5, 1041587393, 1027133694, -1122016279, -1141547063) + + W(6, 1013768747, -1122068949, 1026059807, 1036691428) + + W(7, -1152272302, -1116481805, 1025296987, 1012449399); + WS(-1098744132, 1034278418); + sum1 = W(0, -1103397220, -1124165708, -1110800938, 1026719460) + + W(1, 1022646298, 1032193166, 1022064347, -1136800346) + + W(2, -1145635621, 1041815523, -1099348442, -1092523700) + + W(3, -1100009602, -1088889154, -1104673163, -1098235958) + + W(4, -1105248316, -1120033612, 1050332487, 1047722705) + W(5, 1037024150, 1057456646, 1045722836, 1051861685) + + W(6, 1050544938, 1021903208, 1035939706, 994253234) + W(7, 1017012340, 992386946, -1126668889, 1007925993); + sum2 = + W(0, -1097631923, 1038271179, 1016052501, 1038061501) + W(1, -1098093629, 1036023945, -1103222197, 1049634734) + + W(2, 1051137052, -1138123466, 1047950529, 1066995446) + + W(3, 1052164534, -1086456688, -1092315790, -1088937960) + + W(4, 1049915324, -1101382095, 1053016941, 1044310058) + + W(5, -1101624661, -1097740488, 1025704121, -1095498431) + + W(6, -1103655169, 1030554459, -1103587135, 1039796029) + W(7, 1022295275, 1002073396, 1009745942, 1037237655); + WS(-1082862242, -1106529553); + sum1 = W(0, -1130854575, -1136558799, -1106220300, 1011297096) + + W(1, 1032803517, 1003802452, -1130818358, -1115833284) + + W(2, 1035507577, -1134799464, 1050921813, 1017516694) + + W(3, -1083278305, -1113237716, -1166618304, 1036440480) + + W(4, -1111381151, -1109420173, -1090777253, 1058584025) + + W(5, 1053793791, 1038764911, 1011564912, -1125528356) + W(6, -1121770975, 1040932752, 1042678624, 1023914089) + + W(7, -1114891124, 1024022374, 1003125716, -1148371520); + sum2 = + W(0, -1113253112, 1017383795, -1098397046, -1105653936) + W(1, 1043748521, -1130700635, 1040646747, -1134989990) + + W(2, -1114468103, -1105748811, 1042070822, 1062131274) + + W(3, -1088478625, 1039489157, -1112481937, -1118262998) + W(4, 1046106511, 1042779663, 1049941293, 1049624420) + + W(5, -1093962905, -1102421728, -1120850913, -1124158867) + + W(6, 1029911106, -1111927878, -1106009556, -1113543954) + + W(7, -1110290200, 1032413051, 1032000907, 1027657598); + WS(1055738180, 1034492849); + sum1 = W(0, -1130881323, -1114926341, 1041145701, -1109424308) + + W(1, -1112247108, -1112831856, -1114665081, -1121239258) + + W(2, -1111251428, -1128721888, -1099536939, 1051914904) + + W(3, 1058202118, 1051860704, 1026763985, -1130346670) + W(4, 1042092597, 1039888312, 1055510938, -1131357522) + + W(5, -1089549409, -1104754439, -1109075065, -1117425768) + + W(6, 1006685651, -1103919286, -1104400342, -1113433279) + + W(7, 1022435899, -1139575663, -1129253153, -1142807791); + sum2 = W(0, -1110077216, 1036549925, -1103858204, 1011211476) + W(1, 1008268344, 1023981444, 1010863636, 1034090633) + + W(2, -1118181126, -1116107500, 1042025735, 1056055130) + + W(3, -1090440399, -1117941654, 1001166765, -1130298175) + + W(4, 1049383148, 1034915268, 1044994486, 1058209450) + + W(5, -1098004228, -1099569204, -1121873216, -1107211558) + + W(6, -1110853226, -1119533468, -1101175453, -1113779586) + + W(7, -1109857174, 1034145803, 1026441284, 1033292040); + WS(1056018244, -1109435672); + sum1 = W(0, 1028147653, 1025593127, 1019179235, 1042157337) + + W(1, -1110312463, 1019247612, -1120006735, -1144225212) + + W(2, -1121172806, -1108190871, 1044333967, -1098176216) + + W(3, 1052400296, 1041545807, -1152440548, 1040728133) + + W(4, -1156629272, 1019648283, -1105021998, -1084323638) + + W(5, 1052575762, -1144495302, 960835398, -1117757541) + W(6, 1029524274, 998861994, -1126875818, 1048944704) + + W(7, -1112766254, 1027979993, -1115664295, -1127435447); + sum2 = W(0, -1133465842, 1037565600, -1114814180, 1023511793) + + W(1, 1028077461, 1005396583, 1022326514, -1149118303) + W(2, 1020564842, -1103457632, 1043192653, 1057142397) + + W(3, -1101196001, 1038394412, -1113456189, -1137100532) + + W(4, -1109452473, 1042355402, -1103393926, 1042803000) + + W(5, -1093624788, -1094252679, 1041416796, 1021621854) + W(6, 1020759546, 1025892619, 1033812672, 1040091206) + + W(7, -1104532905, -1153222990, -1130818626, 1028700597); + WS(1058353218, 1042996167); + sum1 = + W(0, 1024954343, 1015847030, 1036476495, -1110665693) + W(1, -1121159378, -1108641009, -1137738249, -1102251787) + + W(2, -1094124879, -1107919793, -1097421664, 1048862286) + W(3, 1033331871, 1049066134, 1023600450, 1041347474) + + W(4, 1052314513, -1138612357, 1044445371, 1050687635) + W(5, -1102818752, 998963493, -1113493234, 1023627001) + + W(6, 1009270680, -1116609353, -1202266712, -1105910956) + + W(7, 1018868510, -1115498359, 1016588291, -1119202191); + sum2 = W(0, -1126808420, 980939457, -1123796075, 1037410136) + + W(1, 1002142140, -1139817292, -1134378480, -1142652688) + + W(2, -1120540574, -1110048722, 1033167871, -1106277561) + + W(3, -1166268225, -1116671070, -1143978200, 1011961658) + + W(4, -1098896413, -1075343834, -1086151008, 1075199384) + + W(5, 1058982643, -1127002394, 1028067074, 1027681870) + W(6, 1039187917, -1110843188, 1032482295, 991431992) + + W(7, -1123555130, -1163241473, 1021947375, -1117918702); + WS(1065448321, -1123448424); + sum1 = W(0, 1033675765, 1010310940, -1135157253, -1130617674) + + W(1, 1045868403, 1037821135, 1029877230, -1107423852) + W(2, 1042933049, 1048779866, 1053164479, 1054681092) + + W(3, -1088933089, -1096402228, -1112063319, -1132569296) + + W(4, -1113419593, -1098481070, -1085464413, 1025088582) + + W(5, 1052703622, 1043193000, 1039463880, 1039088003) + W(6, -1107290229, 1033876859, 1028430645, -1126554424) + + W(7, -1113028565, -1114258373, -1131689691, 992526257); + sum2 = W(0, 992398551, 1027463162, -1110914988, -1119896935) + + W(1, -1100289244, 1024218964, -1111923136, 1036361104) + + W(2, -1118632904, -1115592424, -1094541616, 1058308065) + + W(3, 1052134722, -1139018826, 1043392525, -1114310803) + + W(4, -1109433050, 998577524, -1095126430, 1059518579) + W(5, 1038527426, -1109739820, 1004586244, 1020338285) + + W(6, -1143518596, -1122494561, -1116426235, -1103007923) + + W(7, -1121464784, -1115201103, -1120049915, -1128089075); + WS(1050696068, -1101686596); + sum1 = + W(0, 1030829490, 1025629886, 1028506281, 1044306231) + W(1, 1022456523, 1033300499, 1025382374, -1126351518) + + W(2, 1032239887, 1039198082, 1035777849, -1094476563) + W(3, 1053256444, -1108777674, -1125496907, 1013615278) + + W(4, 1015204626, 1033819234, 1052890832, -1083567844) + W(5, -1095460989, 1028011096, -1117978119, 1022077689) + + W(6, -1113406309, 1030627629, -1111973334, 1049080890) + + W(7, 1026744658, 1009469122, 1014700692, -1117484787); + sum2 = W(0, -1123705959, 1033160533, 1021465594, 1019539230) + + W(1, -1115261066, 1030761443, 1021971134, -1122567677) + + W(2, -1116235595, 1028975273, -1105037500, 1055127070) + W(3, 1039390029, -1104569658, 1024962787, 999405400) + + W(4, 1034058997, -1094422871, -1106553103, 1036912081) + + W(5, -1113630050, 1034816057, -1131788338, 1014360364) + + W(6, -1139597844, -1122943830, -1103106284, 1037858431) + + W(7, 1034945731, 997585040, -1137214108, 1023175710); + WS(1058623938, 1044469574); + sum1 = W(0, 1045615020, 1035147318, 1047639223, 1050348390) + W(1, 1030161626, 1044899106, -1132009366, 1044251461) + + W(2, -1108426137, -1141312974, -1105886038, -1079944741) + + W(3, 1039515483, 1021302290, -1167333042, 991624716) + + W(4, -1135193336, 1044306859, -1122107414, -1085342603) + + W(5, -1100470855, -1110191310, -1180200419, -1100960996) + + W(6, 1044911680, 1030580258, 1043270872, 1051720601) + W(7, 1041363874, 1041545713, 1040848727, 1042676794); + sum2 = W(0, -1126998679, -1112584470, -1125720699, 1026650453) + + W(1, -1098785634, 1035354845, -1103280207, -1117822839) + + W(2, -1097249916, -1101780852, -1124055793, 1050619160) + + W(3, 1044368398, -1115949975, 1036370417, 1013784870) + W(4, 1048536708, 1037003529, 1040132893, 1058508674) + + W(5, 1037637019, -1106591466, -1109803757, -1104576316) + + W(6, -1118913729, -1122142287, 1008038822, -1117660887) + + W(7, -1121056345, 1006096779, -1116815483, -1119752481); + WS(-1092650820, -1093598320); + sum1 = W(0, -1126483198, -1136033646, 1019177644, -1119240794) + + W(1, -1095523617, -1108863241, -1113123137, -1126435736) + + W(2, -1111185837, -1107026560, -1096033968, -1101350837) + + W(3, 1057301262, 1042409572, 1040959081, 1035081684) + W(4, 1032567139, -1113511425, 1059010394, 1042563567) + + W(5, -1131092420, -1108714423, -1114101506, -1106962654) + + W(6, 1028684103, 1034982933, 1025024233, -1118967697) + + W(7, -1118984463, 1023629806, -1128061252, -1142697342); + sum2 = W(0, -1118904411, -1158272012, 1013234849, 1030464194) + + W(1, -1106482941, 1025489390, -1129648553, 1028128070) + + W(2, -1134435633, -1107189637, -1120249847, 1057018316) + + W(3, 1048792270, 1024832618, 1031754422, -1125347555) + W(4, -1102280300, 992574886, -1083559741, 1062197029) + + W(5, 1040811198, -1114392001, 1031998303, 1029475610) + + W(6, -1150017862, -1122133752, -1146867651, -1097179586) + + W(7, -1115216614, 1021081809, -1112304821, 993658022); + WS(1058173058, 1066808129); + sum1 = W(0, -1107348220, -1099127505, -1103913530, -1113478482) + + W(1, 1040539139, -1113016318, -1120477164, 1000206250) + W(2, 1035236882, 1036577094, 1044208414, 1029276252) + + W(3, -1097605967, -1100723463, 1029619500, -1122925746) + + W(4, 1041707116, 1043659283, 1046852514, 1039741986) + W(5, 1044710619, 1043551606, -1133641268, 994694705) + + W(6, -1121094224, -1105652573, -1107481241, -1121409754) + + W(7, 1032545388, -1115290924, 1013015214, 950366748); + sum2 = W(0, -1094008764, -1105723160, -1087139249, 1052425931) + + W(1, 1056772124, 1034445536, 1012087213, 1037095176) + W(2, 1034130054, -1120175931, 1064201383, 1002356625) + + W(3, -1089869944, -1114835724, -1123264660, -1129286431) + + W(4, 1031813868, 1042930394, -1110465854, -1098172076) + + W(5, 1043061462, -1102352886, 1040830367, -1111397998) + + W(6, 1011760553, -1124103013, -1131636845, 1006833373) + W(7, 1007319139, 1014923704, 1016549099, 993051546); + WS(1061928770, 1027279769); + sum1 = W(0, 1034406912, -1113862823, 1039933724, -1111710246) + + W(1, -1111349982, -1109997378, -1113344954, -1114279935) + + W(2, -1100123699, -1162686055, -1096018034, 1056786929) + + W(3, 1056534441, 1044907121, 1022437288, 1031029722) + W(4, 1029564087, -1109708970, 1050604450, 1037263862) + + W(5, -1098017894, 1038664521, -1116167797, 1027389387) + + W(6, 1033006716, -1128579510, 1007368299, -1109765633) + + W(7, -1113416432, -1101798872, -1105438789, -1113862289); + sum2 = W(0, 1026006751, -1108403600, 1035073774, -1122004937) + + W(1, 1035952663, 1015050843, -1124438030, -1133483016) + + W(2, -1115270559, 1031363022, -1104904057, 1031769509) + + W(3, -1106336513, 1027760004, 1019789656, -1118390529) + W(4, 1024783342, 1033798448, 1037041630, 1039898935) + + W(5, 1057393141, 1027825620, -1121305243, -1128829234) + + W(6, -1130316822, -1139293944, 1025961213, 1021529214) + + W(7, -1112547455, -1096601581, -1105185563, -1106336479); + WS(1053752708, 1043937257); + sum1 = W(0, -1114168512, -1112521242, -1097902456, -1095288434) + + W(1, -1094410051, -1114520925, -1115668990, -1105295129) + + W(2, -1105170221, -1098204331, 1046102006, 1066642253) + + W(3, 1054367941, -1100810554, -1121904763, 1031167873) + + W(4, 1031197758, -1104934543, 1042705158, 1070561411) + + W(5, 1038022813, 1032266099, -1114135854, -1123380722) + + W(6, -1109039567, -1113606305, -1098767200, -1089903115) + + W(7, -1100846418, -1108028099, -1115062077, -1118408200); + sum2 = W(0, -1113064749, -1144787532, -1115681675, 1041111385) + + W(1, -1130408019, -1136936214, 1022660811, -1121651306) + + W(2, -1090786559, -1094418907, 1009808406, 1053253351) + + W(3, 1015714915, 1020895003, -1117683238, 1028089270) + W(4, 1038982572, -1102980167, 1041806798, 1054413523) + + W(5, 1024043560, -1114777947, 1021536435, -1123371786) + + W(6, -1136678198, -1129681067, 1023762114, 1035936399) + + W(7, -1114747797, 1001107148, -1129865467, 1019986163); + WS(-1077899937, -1095640595); + sum1 = W(0, 1038010313, 1026389718, 1040451742, 1038149954) + W(1, 1012098034, 1041468735, 1036152598, 1035936827) + + W(2, 1032811586, 1036208246, -1100196466, -1112596654) + + W(3, 1057575303, 1025151035, -1108998502, -1117388883) + + W(4, -1097475626, -1123908524, 1051006893, -1096170677) + + W(5, -1089360567, -1102384270, -1117118702, 1019229383) + + W(6, 1033727032, -1117534996, -1116405267, 1043001855) + + W(7, 1035677341, -1122502968, 959089718, -1122221082); + sum2 = W(0, 1014408115, 1031626038, 1042237958, 1024306585) + + W(1, 1005347958, -1108949069, -1129272561, -1155665460) + + W(2, 1037203464, -1111295182, -1111204470, 1046645930) + + W(3, 1036175171, -1102667672, -1105300490, -1098212068) + + W(4, -1112987386, 1033188726, 1033012571, 1040504174) + W(5, 1022488131, -1113110436, 1012028387, 1026136762) + + W(6, 1006518986, 998532726, 1002908510, -1142339005) + W(7, 1028667874, 1028194944, 991631364, -1118275484); + WS(1052188868, -1105025774); + sum1 = W(0, 1026006805, -1127133881, -1111238899, 1039605133) + W(1, 1036489378, 1027868467, 1028341284, 1040022103) + + W(2, 1053332527, 1046329385, 1054121990, 1041936861) + + W(3, -1098161716, -1100202284, -1114580002, -1112308133) + + W(4, -1093124457, -1102124985, -1093232644, -1108714798) + + W(5, 1047964177, 1042303686, 1042593657, 1033044781) + W(6, 1016895952, 1015047702, 1031180874, -1123947762) + + W(7, -1116894641, -1100188956, -1114267170, -1120167377); + sum2 = W(0, -1098242390, -1090155459, -1080159437, -1083172772) + + W(1, 1043663143, 1066420271, 1065821018, 1052081121) + W(2, 1038124206, -1111850856, -1111691725, 1045262621) + + W(3, -1107342132, -1115094311, 1045364599, 1039539139) + + W(4, 1035251585, -1110800852, 1033462452, -1116129960) + + W(5, -1117401930, 1036826747, -1121811075, 1031476522) + + W(6, -1146833441, 1015159009, -1114532383, 1037947101) + + W(7, -1115149205, -1118954060, -1159263732, -1144829650); + WS(-1102870152, 1022622513); + sum1 = W(0, 1055644087, 1035394969, 1045649819, 1045987408) + W(1, 1030573816, 1031111560, 1035095156, 1041054212) + + W(2, -1105950504, -1108831748, 1041190721, 1039545500) + W(3, 1049616144, 1056957379, 1047436506, 1055423038) + + W(4, -1114669622, 1043185370, -1098060649, -1093030704) + + W(5, -1093912525, -1084377448, -1093512673, -1094643096) + + W(6, -1099940547, 1029691760, -1105006556, 1034170571) + + W(7, 1028754581, 1032315050, 1008186016, 1002093997); + sum2 = + W(0, -1084145430, 1037387540, -1091365810, -1096604175) + W(1, -1095647742, 1043123500, -1106696806, 1053814194) + + W(2, 1070336926, -1098862516, 1050914492, 1068317532) + W(3, 1054262144, -1083131387, 1046449081, -1081281727) + + W(4, 1055168354, -1095516697, 1050568943, 1069441477) + + W(5, -1090345251, -1085743049, 1048225937, -1086819148) + + W(6, -1086613448, 1056626754, -1097405209, -1099937369) + + W(7, -1106692290, 1045945631, -1106594556, 1058187197); + WS(-1069426976, -1120848841); + sum1 = W(0, 1036938172, 1035259664, 1047028417, 1052190352) + W(1, 1041456894, 1039915051, 1015525967, 1036563112) + + W(2, 1037072255, 997868135, 1031706371, -1092031243) + W(3, 1045414333, 1026900661, -1119324359, 1015048091) + + W(4, -1103659451, 1049019033, -1095105906, -1081236347) + + W(5, -1090672009, 1032303833, 1008361890, -1146656500) + W(6, 1032159990, 1025792718, 1020529436, 1049696791) + + W(7, 1038916826, 1035011641, 1039253091, -1145253028); + sum2 = + W(0, -1131675185, -1130807793, -1137547874, -1119117212) + + W(1, -1138868050, -1139313154, -1127085641, -1144490820) + + W(2, 1029191442, -1132163681, -1115933340, -1086087178) + + W(3, -1112002886, 1014175682, 1023290113, -1135148482) + W(4, -1114450600, 1018117017, 1033829647, 1063181450) + + W(5, 1026390676, -1143924164, -1138352802, 1007342770) + W(6, 1024984252, -1115031522, 1037592454, 1006729954) + + W(7, 1017409241, -1134939410, -1125048401, 974288160); + WS(-1092511940, 1056045775); + sum1 = W(0, 1034351639, 1036571263, 1026078569, 1044122211) + + W(1, -1145831724, -1113387827, 1018446892, -1119385695) + + W(2, -1122413709, -1107220477, -1123595634, -1099810889) + + W(3, 1052039823, 1050308552, 1032192235, 1047960215) + W(4, 1034842253, 1031880235, 1048156900, -1106066347) + + W(5, -1096815763, -1095462256, -1104039774, -1105858435) + + W(6, -1109413949, -1128037178, -1106487287, 1038991202) + + W(7, 1016305349, 1039930976, -1145490603, -1115254417); + sum2 = W(0, -1129634341, -1125984965, -1131211232, 1032304695) + + W(1, -1126835561, -1135310730, 1030376830, -1115706548) + + W(2, 1017418680, -1145267460, 1019434782, -1112808134) + + W(3, 1027589163, -1164412329, 1012340975, 1024240430) + W(4, 1033383321, -1108053053, 1035592777, 1017461836) + + W(5, -1125819067, 1048432434, -1132396034, 1037084632) + + W(6, -1086264457, -1078809375, -1073693037, -1098879629) + + W(7, 1071963841, 1073307463, 1053688201, -1110470100); + WS(1042257800, -1115776325); + sum1 = + W(0, -1146926115, 1032352980, -1109330569, -1114314051) + W(1, 1039411448, -1111850704, 1040829028, -1123393177) + + W(2, -1107281138, -1098526814, 1043068219, -1109412128) + + W(3, -1097266597, 1039093055, -1100632132, -1104810789) + + W(4, 1038400362, 1045994468, -1111135982, -1144690495) + W(5, 1057956169, -1128243973, 1048043508, 1025450855) + + W(6, 1010013391, -1117084567, 1043908518, -1120663934) + + W(7, -1098521248, -1122589083, 1029880783, 997333453); + sum2 = W(0, 1029402915, -1131137316, 1031911869, 1023173531) + + W(1, 1023792141, -1123803784, 1014267385, -1128776324) + + W(2, -1139977433, -1118253197, -1122896144, -1122404168) + + W(3, -1098422336, 1037623928, -1106514445, 1036548666) + + W(4, -1102627522, 1040550677, -1088615745, 1061434285) + W(5, 1075510495, 1067804318, 1045458757, 1035151624) + + W(6, 1041328458, -1112092070, 1058291503, -1087193418) + + W(7, -1072676007, -1079538943, -1106625048, -1107997040); + WS(1062572194, -1113128476); + sum1 = W(0, 1025054504, 1032745069, -1111717923, -1115121012) + + W(1, 1039928305, -1108655721, 1042636501, -1121873307) + + W(2, -1105909778, -1098454710, 1040855323, -1102647392) + + W(3, -1094658254, 1048800872, -1098634802, -1107065062) + + W(4, 1035303099, 1048922046, -1111940687, 1030883818) + W(5, 1056642050, -1114397119, 1045405821, 1028123977) + + W(6, 1030405814, -1107189334, 1047137430, -1120733568) + + W(7, -1102007432, -1121522301, 1030940241, -1129454014); + sum2 = + W(0, -1114559261, 1015935669, -1119968612, 1034980574) + W(1, -1134322843, 1031387619, -1130912561, 1028413753) + + W(2, -1138228901, 1029828517, -1110320033, -1095660939) + + W(3, 1043622789, -1103434641, 1043842027, -1104010102) + + W(4, 1049277284, -1107208114, 1062476231, -1090290563) + + W(5, -1071408041, -1079628774, -1100585862, -1110973692) + + W(6, -1102431407, 1036930870, -1086736101, 1061616421) + W(7, 1075586093, 1068626110, 1036267766, 1043722127); + WS(1060774594, 1031131703); + sum1 = W(0, -1107942447, -1105426838, -1102134060, -1108928460) + + W(1, 1030069408, -1109912496, -1111247296, 1016389396) + W(2, 1045023814, 1048858052, 1057375412, 1053310638) + + W(3, -1086363546, -1121814959, -1121700033, -1112979299) + + W(4, 1022102280, 1019498368, -1089780107, 1054202179) + W(5, 1056436400, 1045750878, 1017717699, -1115080444) + + W(6, -1109726834, -1115599332, 1024119623, -1117349999) + + W(7, -1105657043, -1112636534, 1020787328, 1034439495); + sum2 = W(0, 1036474850, -1117613837, 993333704, -1124280889) + + W(1, -1120272689, -1147158916, -1136721538, 1006917274) + + W(2, -1115841609, 1015990489, -1114813616, 1046600726) + + W(3, -1127188969, -1101686418, -1106242516, -1111325506) + + W(4, -1115206474, -1121605429, 1041891165, 1051997378) + + W(5, -1122067781, 1035140408, 1020051521, -1113122752) + + W(6, 1027456791, -1155010952, -1115442992, -1145891812) + + W(7, -1135549634, 1009536026, 1019245009, 1017045509); + WS(1060194466, -1100017114); + sum1 = W(0, -1107280066, -1110455654, -1108454907, -1102634810) + + W(1, -1103570769, -1103041901, -1108837738, -1103753711) + + W(2, -1105747811, -1101985628, 1018718942, -1106901713) + + W(3, 1046100821, 1055521256, 1047438565, 1059153514) + W(4, 1059466063, 1043733237, 1057500851, 1036011765) + + W(5, 1016328357, -1113318903, -1139455183, -1111475141) + + W(6, -1103466926, -1106475814, -1106517942, -1094721336) + + W(7, -1110005824, -1108487663, -1116101330, -1118902112); + sum2 = W(0, -1134258178, 1016306377, -1119701101, -1121134035) + + W(1, -1110905440, -1123898542, -1120388479, -1131815221) + + W(2, -1116481221, -1123533287, -1150894505, 1050682292) + + W(3, 1003934853, 1016401385, 1010383122, 1025651043) + W(4, 1032034504, -1130975497, -1129842733, 1050657130) + + W(5, 1032136922, -1114630639, -1135861370, -1115813895) + + W(6, -1123729210, -1124034546, -1119840142, -1118895679) + + W(7, -1115758498, -1135589646, -1140270714, -1126135829); + WS(-1094780356, -1096037829); + sum1 = W(0, -1094564683, 998269945, -1106439374, -1099790159) + + W(1, 1039955171, -1116696534, 1026955814, -1132274079) + + W(2, 1051641704, 1048993133, -1105882161, 1021385644) + + W(3, -1110801281, -1093602407, 1040928722, -1094848202) + + W(4, 1042321778, -1097112145, 1049078036, 1039341071) + W(5, 1035258371, 1056382370, 1035779188, 1053064740) + + W(6, -1109647669, 1034946343, -1120792141, -1101585581) + + W(7, 1020526630, -1124429730, -1106396689, 1027970323); + sum2 = + W(0, -1137596463, -1129205035, -1126343315, 1039861741) + W(1, -1126312459, -1123052878, 996868828, -1125851727) + + W(2, 1029577680, -1107142480, 1047351132, -1098569120) + + W(3, 1038608299, -1116615219, -1112533224, -1107291575) + W(4, 1038439017, 1015352075, 1070713407, 1073186805) + + W(5, 1038004689, -1073950732, -1077903771, -1107100148) + + W(6, -1113448033, 1012914617, -1114069586, 1046610276) + + W(7, -1144677526, 1007385420, -1108941862, 1037961064); + WS(1053603780, -1115461008); + sum1 = W(0, -1137418943, 1030817204, 1016256157, 1021933093) + + W(1, -1107174285, 1024187323, -1121722108, 1027865701) + + W(2, -1097293942, -1095449155, -1092155167, 1049349309) + + W(3, -1125654285, -1107838901, -1112035518, -1115980033) + + W(4, 1049585228, 1046317951, 1056038503, 1058232189) + + W(5, -1109114845, -1104780729, -1104946775, -1096840466) + + W(6, 1014991997, -1134044169, -1118818050, -1129232467) + + W(7, 1020919504, 1042320778, 1033110781, 1040979266); + sum2 = W(0, 1033231462, -1122607696, -1126070520, 1021774826) + + W(1, -1120788802, 1023918789, -1127228708, -1155086158) + + W(2, -1115237141, 1031925962, 1042960949, 1053325526) + + W(3, -1107200469, -1112013861, -1114604471, -1120863174) + + W(4, -1111323807, -1115623012, -1119706606, 1049744257) + + W(5, 1005054791, 1026671690, -1107279270, -1119270266) + W(6, 1022510111, 1016053183, 999155791, -1130112624) + + W(7, -1116359926, -1115047971, -1133439199, -1114777589); + WS(1049944452, -1118177299); + sum1 = W(0, 1004954534, 1034605113, 1042179871, 1046072096) + + W(1, -1119832136, -1115172412, 1021914321, -1125265763) + + W(2, -1113835168, -1117712807, 1049772083, -1089565448) + + W(3, -1087875066, 1028249398, -1115173764, 1016032028) + + W(4, -1131743895, 1044152226, -1105992217, -1102704504) + + W(5, 1051885673, 1023284205, 1032417701, 1023720959) + W(6, 1036431958, -1113909672, 1034469319, 1047091406) + + W(7, -1117867957, 1037431354, -1128742159, 1027934165); + sum2 = + W(0, -1122048832, -1102028824, -1098388207, 1042109429) + W(1, 1037898289, 1035691269, -1120157845, 1026959129) + + W(2, 1053033259, 1033866732, -1083784972, 1035235216) + W(3, 1056376564, -1103367787, 1034674212, -1128193065) + + W(4, -1121809206, 1014156522, 1055740053, -1104400409) + W(5, -1126110057, -1120368299, 1015248281, 984939091) + + W(6, -1100778293, 1033801710, -1112352078, 1046653262) + + W(7, -1111071353, 1025902829, 997672170, -1153716682); + WS(-1165444096, -1119710264); + sum1 = W(0, 1042994118, 1034244741, 1037778378, 1041081798) + W(1, 1016348739, 1044760836, -1126699940, 1049969601) + + W(2, 1051115175, 1042802936, 1051394930, -1114386041) + W(3, 1044466585, 1039392600, 1042064672, -1111502020) + + W(4, -1098028621, 1040688824, -1088773549, -1087521946) + + W(5, -1089153334, -1102706330, 987979863, -1112154588) + + W(6, -1108071955, 1032455940, -1120702728, 1029133552) + + W(7, 1045508004, -1117660781, 1043978432, -1112358151); + sum2 = + W(0, -1113048377, -1169925094, 1033233769, 1022227231) + W(1, 973479782, 1025958326, -1175748301, -1108998850) + + W(2, 1060341068, 1041247352, 999982909, -1081289783) + W(3, -1090689511, 1036288861, 1044034366, 1055733822) + + W(4, 1067872749, 1057359743, -1089189226, -1075624869) + W(5, -1088323315, 1048635178, 1052769876, 1060416891) + + W(6, -1107478445, -1121919154, -1112420946, 1030919570) + + W(7, 1049895882, -1108655271, 1042449401, -1098757157); + WS(-1077066897, -1138646112); + sum1 = + W(0, 1024267775, 1009759453, 1034803609, -1105412061) + W(1, -1118414542, -1104989395, 1000523125, -1099033634) + + W(2, -1092381223, -1106693383, -1096180043, 1042083852) + W(3, 1031147625, 1050244398, 1024065726, 1045342865) + + W(4, 1053014632, 1027242622, 1051220983, 1053447283) + W(5, -1105039519, 1023828386, -1110843104, 1028746421) + + W(6, 1025453154, -1118474373, -1149202983, -1101608091) + + W(7, 1010847661, -1113932053, 1023831870, -1113130950); + sum2 = W(0, 1013870164, -1133465912, 1030888661, -1118337904) + + W(1, 1030672570, -1156287199, 1014316520, -1145191680) + + W(2, 1032969077, 1032956180, -1118666398, -1095979039) + + W(3, -1102611716, 1041525268, -1121602320, -1129518532) + + W(4, 1050672871, 1076869477, 1063553933, -1069322680) + + W(5, -1088200357, 1026168517, -1129519600, -1120095414) + + W(6, -1105627059, 1037977967, 1017901782, 1026329625) + + W(7, -1169512700, -1153801247, -1126632288, 1031405165); + WS(1059038658, 1028594353); + sum1 = W(0, 1030613999, -1132336275, -1117493948, 1038489844) + W(1, 1028206993, 1044643916, 1007880004, 1043840791) + + W(2, 1027001704, 1035531624, 1032402678, -1152158733) + + W(3, -1098315241, -1088517514, -1103996748, -1091506711) + + W(4, -1089493909, -1094328658, -1106243079, 1052296065) + + W(5, 1042911580, 1049587060, 1035409673, 1044000434) + W(6, 1046010101, 1026431736, 1043051950, 1044337864) + + W(7, 1028671678, 1032918142, -1137633217, 1036291743); + sum2 = + W(0, -1118922878, 998383694, -1117830208, -1123342062) + W(1, -1109116635, -1124252768, -1104593856, 1026377322) + + W(2, -1105269646, -1109062791, 1013977255, 1052555170) + W(3, 1041098100, 1040874722, 1030669290, 1040986964) + + W(4, 1050974192, 1002191246, 1046707356, 1051646415) + W(5, 1036678597, -1098775079, -1122565606, -1098750401) + + W(6, -1110275215, -1111322692, -1114811922, -1114439732) + + W(7, -1108145020, -1121186646, -1115485971, -1115223671); + WS(-1089038754, 1070610314); + sum1 = W(0, 1006818038, -1126323612, 1015379312, -1107760774) + + W(1, -1110158738, -1104391397, -1114553627, -1113068735) + + W(2, -1112569734, -1099849389, -1090696922, -1101892281) + + W(3, 1028620400, 1047988033, 1043536901, 1039930893) + W(4, -1110914124, 1036085850, 1053776546, 1045400523) + + W(5, 1040930437, -1132043583, -1119469430, -1114659286) + + W(6, 1038135388, 1043645143, 1040122382, -1118717763) + W(7, 1002760462, 1016954112, 974497054, -1139206280); + sum2 = W(0, -1120363159, -1119340063, -1119078724, 1035843986) + + W(1, 1035175754, -1106992039, -1128507307, -1129270833) + + W(2, 1029972206, 1020623843, -1137841818, -1094446255) + + W(3, 1049035968, -1128810267, -1123633215, -1123131987) + + W(4, -1135126990, 1026762268, 1064611900, 1017486399) + + W(5, -1094749382, 1039608352, -1194223384, -1197948696) + + W(6, -1111466112, -1099605665, -1102195223, 1042926586) + + W(7, 1014516782, -1112006203, -1136077530, -1129209333); + WS(-1120775200, -1094115106); + sum1 = W(0, -1117113151, -1133090109, -1096583070, -1098081804) + + W(1, -1092969217, -1119648950, -1113650835, -1105675228) + + W(2, -1112921839, -1099947345, 1050818928, 1057531117) + W(3, 1051254629, -1098660371, 926574177, 1035449878) + + W(4, 1046145098, -1097096777, 1048882552, 1067142180) + W(5, 1054137781, 1035250696, -1115652196, 1024424221) + + W(6, -1107062579, -1151313622, -1100319675, -1094480203) + + W(7, -1100195749, -1111825641, -1118408614, -1114839546); + sum2 = + W(0, -1122846232, 1002183233, -1129631292, -1112395279) + W(1, 1009610216, 1001287537, -1122731504, -1139829356) + + W(2, 1031116535, -1113707943, 988543074, -1080457005) + W(3, -1097715519, 1037716560, -1112112395, 1031806339) + + W(4, -1118531646, 1034244245, 1027624889, 1064104967) + W(5, 1052372051, 1011412016, 1031591085, -1128697528) + + W(6, 1030028661, -1116699784, 1039671963, 1037992478) + + W(7, -1115290878, 1016046512, -1122589730, 1022404309); + WS(-1083041826, -1088446577); + sum1 = + W(0, -1112868382, -1139686881, 1037998481, 1035817611) + W(1, 1028314191, -1112414119, -1123391616, -1152205450) + + W(2, -1138041180, 998832115, -1108164766, -1106005004) + W(3, 1054394898, 1042585939, 1037009680, 1027830053) + + W(4, 1041478665, 1026886463, 1018740405, -1092605991) + + W(5, -1096954228, -1105339656, -1122534560, -1128384493) + + W(6, -1123809603, 1007627162, -1137074328, 1036557383) + W(7, 1043199331, 1016960213, 949272012, -1161448845); + sum2 = + W(0, 1036010005, -1112615912, -1108103320, 1026422893) + W(1, 1043952518, -1112407780, 1025610945, -1142574731) + + W(2, -1080772886, -1080108640, 1042883784, 1067023817) + W(3, 1065911618, 1043418298, -1121396391, 1019038275) + + W(4, -1110295637, 1033469827, 991295446, -1106557392) + W(5, 1015020021, -1113416335, -1118133995, 1027619053) + + W(6, -1113551367, -1118689741, -1123719569, 1039881895) + + W(7, 1028046949, 986544491, 1028536389, -1114551687); + WS(1059656866, 1032254503); + sum1 = W(0, 1051132033, 1032901415, 1050001035, 1051046262) + W(1, 1024623477, 1041030197, -1129401004, 1040932616) + + W(2, -1087438145, -1096624519, -1093591378, -1092342973) + + W(3, 1024747921, 1042870865, -1112612011, 1037509038) + W(4, 1040121644, 1045530925, 1040228252, -1096329486) + + W(5, -1100479077, -1092498854, -1100524478, -1089145703) + + W(6, 1047684766, 1031967406, 1044069767, 1050005760) + W(7, 1045316401, 1048633756, 1041789317, 1050363772); + sum2 = + W(0, 1033723840, -1120765513, -1151198348, -1121736497) + W(1, 1020727265, -1111733852, 1010605379, -1112033268) + + W(2, 1054927280, 1004192518, 1032813206, -1097617496) + W(3, 994767756, 1024454465, -1124374145, -1107458988) + + W(4, -1094930774, 1009606707, 1018976553, -1096835022) + W(5, -1114598300, 1049726638, 1040837102, 1057385902) + + W(6, -1110893464, -1117945313, -1111742424, -1121652889) + + W(7, -1144829382, 1030389401, -1120942585, 1035752486); + WS(-1076352721, 1061176787); + sum1 = + W(0, -1115567878, 1039493528, 1037423542, 1022350014) + W(1, -1114677168, -1123591576, -1143365955, -1114839417) + + W(2, -1095051668, -1094852257, -1086623624, 1044286862) + W(3, 1057477914, 1049595083, 1036655988, 1044280124) + + W(4, 1047858891, 1040618482, 1057001770, 1036068672) + W(5, -1086915318, -1095930750, -1108386213, 1029598047) + + W(6, 1038434246, -1116442287, -1114755255, 1022609452) + + W(7, 1037805114, 1044588197, 1031697064, -1119274549); + sum2 = + W(0, 1018488840, -1109735653, -1113462230, -1112517262) + W(1, -1108529674, -1112282852, 1002563934, 1011039855) + + W(2, -1104206436, 1012246375, -1114523900, 1056346033) + + W(3, 1029007760, -1106712811, -1113168793, -1115338003) + + W(4, -1111729053, -1117505825, 1042992721, 1051780099) + W(5, 1042618199, 1035563022, 1024458488, -1112797570) + + W(6, 1004158510, -1122544930, -1111468709, -1133433375) + + W(7, -1114816198, -1136000711, -1122022613, 1037211560); + WS(1037340944, -1121222187); + sum1 = + W(0, -1116495838, -1118176747, -1096308023, -1094205341) + + W(1, -1095502171, -1115640417, -1112496425, -1105702479) + + W(2, 1040689218, -1110298712, 1052341602, 1064260668) + W(3, 1052009702, -1100646016, -1117627026, 1026863896) + + W(4, 1036502651, -1106426924, 1044624667, 1068943083) + W(5, 1045175252, 1004526500, -1108867801, -1112879076) + + W(6, -1106495021, -1119752153, -1097659059, -1089978464) + + W(7, -1099820424, -1108261518, -1110958217, -1111070831); + sum2 = W(0, 1002312827, -1134403694, 1025097519, -1105297347) + + W(1, 1007461646, -1117960999, -1123847191, -1129847887) + + W(2, 1043920878, 1045056865, -1107896626, 1060319926) + + W(3, -1100756735, 1018292031, -1136355134, -1108036266) + + W(4, -1113959010, -1120905299, 1031903433, -1100397803) + + W(5, 1042137547, -1106899263, -1119650359, 1033071013) + + W(6, -1124888335, 1019347263, -1120916959, 1028583233) + + W(7, -1119634731, -1134844462, 998264859, -1109200858); + WS(-1087648930, 1056984912); + sum1 = W(0, 1027950097, 1027762677, 1025406415, 1043195617) + W(1, 1035903278, 1031391740, 1023913741, 1033673899) + + W(2, 1048727276, 1043573475, 1051177331, -1092810048) + W(3, 1038252876, 1044809191, 1035706934, 1020597221) + + W(4, -1101873716, 1015678999, -1091649404, -1082302860) + + W(5, -1097139061, 1038200652, 1042041459, 1041744649) + W(6, -1111974664, 1024202483, 1016025318, 1050173331) + + W(7, -1156961168, 998750650, 1023377112, -1114494621); + sum2 = W(0, 1035604443, -1113891962, -1155240851, -1130359386) + + W(1, 1025386829, 1028100153, 1016774458, -1126789482) + W(2, -1109665959, 1017090586, 1033553543, 1061263788) + + W(3, -1109330568, -1106256683, -1097657183, -1118236009) + + W(4, 1027481873, -1115818981, 1023852497, 1027230949) + + W(5, 1041592808, -1113120233, -1101411950, -1121071325) + + W(6, -1121529027, 1006860245, -1124657042, 1039189933) + + W(7, -1123139111, 999905578, -1132638677, -1109638591); + WS(-1090940868, 1045539156); + sum1 = W(0, -1125495305, -1122547977, 1049435900, 1022396558) + + W(1, 1034779456, -1113477720, 1025152496, 1017461170) + + W(2, -1111842948, 1036262295, -1083395945, 1050733040) + + W(3, 1050803832, 1023164412, -1141132416, -1119150102) + W(4, 1024315123, 1017057054, 1046781659, 1016653136) + + W(5, -1084181811, 1044787970, 1025666193, 1039405571) + W(6, 1033322010, 1021788462, 1041875702, 1032259903) + + W(7, 1045300311, -1103054087, -1119238479, -1121753565); + sum2 = W(0, -1111850352, -1115334877, -1101312255, -1131783421) + + W(1, 1037660946, -1121261620, 1008969141, -1118719808) + + W(2, -1154701652, 1045060155, 1053683311, 1041887968) + + W(3, -1090960245, 1034919558, -1118627401, -1117531173) + + W(4, 1008422401, 1033609440, -1090718168, 1047082317) + W(5, 1034433310, 1036748070, -1109720341, 998924330) + + W(6, -1128983709, -1109145509, 1041457249, 1009316297) + + W(7, 1037394704, 1030040522, 1034723828, -1122112519); + WS(1058382658, -1101786424); + sum1 = W(0, -1110270554, -1139041509, -1106470550, -1114587164) + + W(1, 1023988544, 1031022672, 1028924449, 1026679274) + W(2, 1020557616, 1040419632, 1039037886, -1089217895) + + W(3, -1116816379, -1098005290, 1030444000, -1105928314) + + W(4, 1042446649, -1110579152, 1052788411, -1102603214) + W(5, 1052497916, 1048850952, 1041387232, 1042985742) + + W(6, 1010032145, 1021044303, -1107378131, -1101971332) + + W(7, -1110520967, -1136091053, -1142630143, 1036784631); + sum2 = W(0, -1122331173, -1116694246, -1133055086, -1106162040) + + W(1, 1033705060, -1119866494, 1019582103, -1119480360) + W(2, 1021048143, -1117334358, 985385246, 1058597177) + + W(3, -1096472079, 1040447045, -1107345628, 1011504527) + + W(4, -1121426033, 1034622720, -1111822939, 1062397265) + + W(5, 1007125953, -1124693001, 1025700470, 1026572561) + + W(6, -1141905806, -1109719947, -1111398337, -1092732322) + + W(7, -1104483430, -1148551778, -1142669219, -1124513225); + WS(1062970978, -1081266569); + sum1 = W(0, -1102316771, 1026249566, -1104248914, 1037424006) + + W(1, 1035596338, -1122189220, 1016727466, 1006845944) + + W(2, 1049067654, 1049251698, -1100292756, -1086541140) + + W(3, -1092317470, -1101422105, -1130063849, -1103019359) + + W(4, 1040583110, 1039432874, 1040278772, -1096033842) + W(5, 1045287213, 1049598341, 1043296141, 1042202275) + + W(6, 986432279, 1031488060, 1034368766, 1046796153) + W(7, 1039493185, 1029733120, -1132489681, 1032483937); + sum2 = + W(0, -1108138297, 1024987284, -1107013954, 1038311792) + W(1, -1140508767, 999045582, 1010876103, -1139420079) + + W(2, -1092863213, -1095439435, 1054820060, 991870971) + W(3, 1019051815, 1003248078, -1122507350, -1120196608) + + W(4, -1134447463, -1107350452, -1104627754, 1058790229) + + W(5, 1049499199, -1113643053, 1040683258, -1107048418) + W(6, 1020893591, 1030342296, 1023656240, -1145193326) + + W(7, -1111721419, -1124168067, -1111078930, 1036851190); + WS(-1090709444, 1049440503); + sum1 = W(0, -1112814366, 1009000949, -1102384190, -1098104133) + + W(1, -1100420271, -1117987732, -1108681738, -1118237822) + + W(2, 1025170444, -1102968365, 1054801672, 1055216649) + W(3, 1007027006, 994631719, -1122456724, 1037835469) + + W(4, 1021129071, -1107658202, -1108358704, 1055155742) + + W(5, 1062491877, -1115514619, 1032182427, -1137063726) + + W(6, -1116166456, 1013557870, -1112664461, -1102466049) + + W(7, -1093799886, -1139587454, -1112800010, -1119596065); + sum2 = W(0, 1010269627, 1011116525, 1031226256, 1023655690) + + W(1, -1117593255, -1139919503, -1131886173, -1132337311) + + W(2, -1125700925, 1031004177, 991734042, 1056735713) + W(3, 1023598587, -1116020697, 1030692092, 1014084462) + + W(4, -1129465449, -1111184590, -1090395945, 1007034923) + + W(5, -1114530604, 1044588818, -1118660887, 1027760305) + + W(6, -1124401971, -1139731999, -1123603568, -1106780773) + + W(7, 1032362667, 1019563835, 1016903156, 1003383541); + WS(1052605444, -1096548047); + sum1 = + W(0, -1135269079, 1014261129, 1035728362, 1017149121) + W(1, 1022065234, -1106055602, -1122459306, -1120275059) + + W(2, -1099989408, -1107118442, -1095069609, 1004173259) + + W(3, -1102684265, 1026600311, 1029280393, -1114974728) + W(4, 1035141158, 1022832721, 1036930738, 1042230040) + + W(5, 1051854441, -1123731628, 1039321653, -1108029264) + W(6, -1157809579, 1034237928, 1014945855, 1022065263) + + W(7, -1149699425, 1033708682, -1120230985, 1040542518); + sum2 = + W(0, -1139099893, -1102121527, -1108414487, 1039987934) + W(1, 1045186917, -1096991255, 1033745090, -1102163660) + + W(2, -1078862437, -1076350607, 1043522425, 1067956735) + W(3, 1072447081, 1053122067, -1111637970, 1040872955) + + W(4, -1097588090, 998819801, -1111980043, -1109442889) + W(5, 1044036972, -1115256553, 1027886256, 1044251533) + + W(6, -1129576496, 1024729710, -1134118593, 1032654822) + + W(7, -1118463242, -1124332658, -1123595298, -1115579557); + WS(1054231108, 1025279114); + sum1 = W(0, 1020527399, 1020186806, 1026191493, 1046988234) + W(1, -1147857037, 1041704764, -1120557618, 1039867950) + + W(2, -1123453065, 1039341944, -1104689967, -1092316960) + + W(3, -1122753069, -1093206832, -1107112804, -1094240131) + + W(4, -1096862627, -1119337841, 1034733383, 1008801448) + + W(5, -1108979241, 1050167121, 1027712531, 1043962418) + W(6, 1049493415, -1160786718, 1041541558, 1041661776) + + W(7, 1034215919, 1032223662, -1156220183, 1036558383); + sum2 = + W(0, -1156731980, -1125155383, -1153680156, -1140765671) + W(1, 1018992688, 1030176462, 1027890172, 1018002108) + + W(2, -1121143571, 1021067288, -1101109237, -1079877582) + + W(3, -1094350155, 1058234221, 1064456596, 1058386161) + W(4, 1027150242, 1024911074, -1096825521, -1088644111) + + W(5, -1113080073, 1052444813, 1024094624, 1045751986) + W(6, 1019039796, -1128517034, 1036906894, -1110310177) + + W(7, 1019841700, 1000349534, -1128055622, -1134555143); + WS(-1097731588, 1025129315); + sum1 = W(0, 1033609822, 972033083, 1036940225, 1025915127) + W(1, 1037164536, 1018117854, 1009743167, 1021572178) + + W(2, 1037092684, -1118357663, 1046113067, 1050865438) + + W(3, -1109542297, 1047810219, -1111680192, 1036701507) + + W(4, -1099469177, -1139849211, -1089626010, -1143345853) + + W(5, -1104510832, -1097851227, -1113708160, -1110047355) + + W(6, -1125480775, -1113410371, 1035911587, 1047135499) + + W(7, 1038594118, 1031924197, -1146462713, -1120871309); + sum2 = + W(0, -1124965724, -1134630348, -1138485084, -1143859545) + + W(1, -1133066340, 1030422253, -1121255807, 1003464777) + W(2, 1029789829, -1105084635, 1035852445, 1050249105) + + W(3, -1114135764, 1024721985, -1120848177, 1033535897) + W(4, -1119672690, 1036116775, 1002738585, 1057234226) + + W(5, -1115375290, -1117221657, 1007172972, -1110249095) + + W(6, -1132623148, -1123511646, -1106888257, -1097411434) + + W(7, -1109817844, 1017260494, -1118819718, 1021514610); + WS(1064258306, 1057427735); + sum1 = W(0, 1046669668, 1048078371, 1049007041, 1043467602) + W(1, 1032131185, 1040278032, 995640096, -1135631084) + + W(2, 1041288794, 1002554246, 1039217007, -1117262306) + W(3, 1041191743, 1037075392, -1121877906, 1026049048) + + W(4, -1094345727, -1107049340, -1092155570, -1100296810) + + W(5, -1101509636, -1100720075, 1015117221, 1034147956) + + W(6, 1024557366, 1026345305, -1126800432, 1017273727) + + W(7, 1027549470, -1136038899, -1134767685, -1111532367); + sum2 = W(0, -1083389635, -1081609637, -1079976349, -1090363224) + + W(1, -1100056051, -1097029007, 1028030408, -1118886369) + + W(2, 1062132206, 1066099523, 1066066300, 1067427062) + W(3, 1049064133, 996873905, -1137063332, 1035057689) + + W(4, -1122840851, 1053156114, -1105997303, -1091867230) + + W(5, -1103783968, 1048340523, -1134953960, -1104392578) + + W(6, -1127222139, 1022631188, 1027246780, -1128121946) + + W(7, 1036294091, -1115106526, 1035025213, -1117772337); + WS(-1082692450, -1121765493); + sum1 = W(0, -1112587635, -1118487719, -1105756568, -1111631170) + + W(1, 1036199927, -1106833087, -1115752014, -1109370235) + + W(2, 992292947, -1104534315, 1049230729, 1048175951) + W(3, -1089217933, 1028715132, -1121927694, 1018481703) + + W(4, 1015927970, 1038416886, -1104867982, 1051898365) + W(5, 1057590961, -1104675396, 1012516667, 1022215305) + + W(6, -1121302066, -1121296341, 1043167221, 1037146590) + + W(7, -1113442509, 1030891673, -1121397517, -1113425325); + sum2 = W(0, -1102561169, 1026098771, -1149524831, -1113975834) + + W(1, -1157274159, -1105234356, 1008573990, -1102778536) + + W(2, 1040868564, 1021710972, 1048116590, 1041914200) + W(3, 1051191259, 1039729263, 1018638481, 1035375403) + + W(4, -1126923948, 1009959824, 1037970343, 1042300553) + + W(5, 1032086087, -1097615037, -1115639834, -1115667744) + + W(6, -1123351116, -1125337962, 1024724387, -1123062396) + + W(7, 1021621986, -1105344931, -1109718449, -1105611058); + WS(1063145570, 1065948321); + sum1 = + W(0, -1113780043, -1107415145, -1103697695, -1125795137) + + W(1, -1119226457, 1032469064, -1118570362, -1148759702) + + W(2, 1042647928, 1041877314, 1043379605, -1105676766) + W(3, -1093770877, -1098882227, 1029896809, 1007275454) + + W(4, 1023153433, -1105577826, 1035095074, 1058030732) + W(5, 1049757493, 1047432094, -1106671851, -1110160160) + + W(6, -1113344071, 1034763992, -1113485016, -1107021830) + + W(7, -1116457366, 1028002580, 1033670420, 1021171309); + sum2 = + W(0, 1033443671, -1119163512, 1032648925, 1022262943) + W(1, -1121656898, -1125619769, -1116250872, 983397903) + + W(2, -1147652316, 1034562054, 1044843888, -1082830049) + W(3, 1049609982, 1025258841, 1030706970, 1030898199) + + W(4, -1122182070, -1110746439, -1104224164, -1080473697) + + W(5, 1070472721, 1045148854, -1138594966, 1015661307) + W(6, -1114870166, -1126213983, 1033622730, 1036499220) + + W(7, 1042757767, -1125695843, -1109235057, -1105016797); + WS(1047808392, -1105857653); + sum1 = W(0, 1036414223, 1038664639, 1033646416, 1045309491) + W(1, 1028560677, 1047007737, 1035626955, 1052689664) + + W(2, 1057255335, 1050583338, 1052085724, -1112577010) + + W(3, 1049269098, -1101673225, 1020504170, -1098667351) + + W(4, -1089047968, -1095111703, -1090242223, -1088425805) + + W(5, -1097592171, 1024927375, 988289723, -1153489085) + W(6, 1019549874, 1027946812, 1014185453, 1038762993) + + W(7, 1038356881, -1120878336, 1031636916, -1106190208); + sum2 = W(0, 1050181400, -1114267734, 1015251419, -1097894374) + + W(1, 1014394222, -1098468098, 1043075035, -1092845444) + + W(2, -1084160527, 1035785784, -1094891239, 1060354212) + W(3, 1045924604, 1054874631, 1042828743, 1063378281) + + W(4, -1088778570, -1097051496, -1096397593, 1063793540) + + W(5, -1132415773, -1115217527, -1098450150, 1051615858) + + W(6, 1059321043, -1113170400, 1035392846, -1098458292) + + W(7, 1030978836, -1096505073, 1042772598, -1088082125); + WS(-1073783985, -1080098540); + sum1 = + W(0, 1012137476, -1111733448, 1027546650, -1095391448) + W(1, -1107725963, 1030910366, 1024902311, -1136391487) + + W(2, 1004414705, -1125334283, -1098951217, 1058781709) + W(3, 1056582836, 1054585131, -1118558951, 1012935090) + + W(4, 994170013, 1040796537, 1045494048, 1038631039) + W(5, -1099332954, -1102018612, -1106829042, -1113109295) + + W(6, -1135747626, -1106294475, -1105932043, -1097893467) + + W(7, 1027155091, 1001385357, -1141795121, -1118975220); + sum2 = W(0, -1136577003, -1123969951, -1126970134, 1039844510) + + W(1, 1037108170, -1182117728, 1024145219, -1107924935) + + W(2, -1161174488, -1115268047, -1111829747, -1078035036) + + W(3, 1072008544, 1038025274, 1006927579, 1013110307) + W(4, -1123274403, 1023359390, 1034323377, -1085317526) + + W(5, 1044555209, 1032404118, 1024479257, 983390936) + W(6, 1021768566, -1128609502, 1026568479, 1027511085) + + W(7, 986504280, -1139830523, -1127097094, 1022685546); + WS(-1104974728, 1024380720); + sum1 = W(0, -1117848102, 1021171896, 1039153371, 1036503965) + + W(1, 988770395, -1109841905, -1121562883, -1126175513) + + W(2, -1117883163, -1127535108, -1099610928, -1100771573) + + W(3, 1043814114, 1034691017, 1034709362, 1004793673) + W(4, 1036325571, 1018298053, 1041104624, -1101972463) + + W(5, -1133844875, -1107251369, 1025626276, -1111468989) + + W(6, -1131530510, 1031544042, 982295861, 1036843369) + W(7, 1029874576, 1031396654, -1125713989, 1034135320); + sum2 = W(0, -1125393898, 1044163006, 1045704700, -1110276988) + + W(1, -1099412627, 1044569612, -1115657155, 1037394103) + + W(2, 1071281072, 1072425553, -1104699996, -1078765241) + + W(3, -1076152216, -1100004941, 1036033265, -1111185479) + + W(4, 1044770418, -1125402454, 1018560910, -1098423872) + + W(5, -1103281302, 1028856833, -1123488110, -1117821699) + + W(6, 1011595325, 1021558362, 1010524637, -1113439186) + + W(7, -1178088596, 1019143058, -1126446200, 1026998165); + WS(1066498257, 1026989550); + sum1 = W(0, -1129927868, -1123659738, 1045121333, 1002634947) + W(1, 1036944705, 970850411, 1022709187, 1004856149) + + W(2, 1023571545, 1024686464, -1084187390, 1040895252) + W(3, 1040663099, -1115004776, 1024409057, 1001199419) + + W(4, 1016605513, -1143882757, 1042249043, 1054068239) + + W(5, -1089079196, -1120675276, -1112524513, -1120648472) + + W(6, -1133253141, 1025371048, 1033458708, 1032849928) + + W(7, 1049903454, 1024612748, 1017685954, -1117202350); + sum2 = W(0, 1038138620, -1155040203, 1049419982, -1094597030) + + W(1, 1022703337, -1117198782, -1132959015, -1121486321) + + W(2, -1106434423, 1038340354, -1087069176, 1064410985) + + W(3, -1110711879, -1112639315, 1026273617, -1123727669) + + W(4, 1014840059, -1105689565, -1102609737, 1043321526) + W(5, 1043390477, 1042536365, 1036470844, 1009362023) + + W(6, -1117610677, 1038431916, -1115449783, -1117967352) + + W(7, -1107988055, -1112813855, -1122022929, 1031915394); + WS(1059170114, -1115069681); + sum1 = W(0, 1041126528, 1031327889, -1137442701, 1027929903) + W(1, 1016336432, 1045677858, 1027533272, 1040648584) + + W(2, 1039057944, 1043197758, 1057495242, 1035662548) + W(3, 1036387882, 1043295874, 1020376880, 1035357519) + + W(4, -1114418030, 1035998588, -1086197480, -1092661254) + + W(5, -1098594899, -1097533773, -1116322521, -1106979748) + + W(6, -1125005432, -1184440086, -1107377807, -1131407372) + + W(7, 1031309989, 1017102598, 1036182828, -1128058314); + sum2 = W(0, 1029223181, 1035999136, 1032743888, 1050206678) + W(1, 1030968394, 969652021, 1018474295, -1138117380) + + W(2, -1099457044, -1123134927, -1106245137, -1115721168) + + W(3, 1035536761, -1109098872, -1136790748, -1105152866) + + W(4, -1094833228, -1107153986, 1052844759, 1029163621) + + W(5, 1046847142, -1111905268, -1116305850, -1102858563) + + W(6, 1022472216, -1129014496, 1034397600, 1043654862) + + W(7, -1114537747, -1149928759, 968266517, 1033858063); + WS(-1091215044, -1097536449); + sum1 = W(0, 1036334229, 1027816414, 1046343318, 1054850406) + W(1, 1041878433, 1040414769, 1017820267, 1047750528) + + W(2, -1088688205, -1110004986, -1088611549, -1085760696) + + W(3, -1113122464, -1115511970, -1113420363, 1034437006) + + W(4, 1028067640, 1025245044, -1104070412, -1089807987) + W(5, 990395721, 1024229024, 1028468150, -1097347774) + + W(6, 1049627927, 1039037582, 1048707955, 1052669472) + W(7, 1043177720, 1039929856, 1044644789, 1048578060); + sum2 = W(0, -1114440831, 1030624098, 988636086, -1132718391) + W(1, 1030310950, 1016098323, 1024855622, 1018716851) + + W(2, 1036847317, 1042295753, 1050034374, 1031424194) + + W(3, -1119733782, -1120554286, -1114648667, 1035432255) + + W(4, 1041890716, -1115362087, -1113867927, 1016671019) + + W(5, -1130826523, -1097953797, -1146049358, -1096082463) + + W(6, 1027069126, 1021176355, 1029167466, 1028661170) + + W(7, -1183083952, -1108500823, 1027651154, -1106095247); + WS(-1074893425, -1117971628); + sum1 = W(0, -1094367290, -1152038187, -1103630563, -1098786216) + + W(1, 1037656965, -1114777697, 1025099466, -1124130662) + W(2, 1052023128, 1049322869, -1111356283, 999054287) + + W(3, -1106664801, -1093651375, 1040611874, -1094570594) + + W(4, 1042452051, -1097322793, 1049675109, 1040732760) + W(5, 1040645714, 1057236855, 1040783587, 1055134184) + + W(6, -1107223211, 1034136520, -1112379016, -1102728254) + + W(7, 1016544493, -1125564586, -1105965314, 1008351835); + sum2 = + W(0, 1004001863, 1021526755, 1018968138, -1116175346) + W(1, -1139174407, 1031843333, -1131104448, 1009509771) + + W(2, -1116735450, 1032892007, -1096890588, -1099974349) + + W(3, -1103015201, 1040986630, 1035109709, 1041412407) + + W(4, -1111481570, 1024548251, -1073615974, -1071438395) + + W(5, -1146527383, 1076155388, 1074182350, 1041860718) + W(6, 1033584975, -1130001464, 1026017190, -1121576034) + + W(7, -1164624762, 1024580999, 1043256283, -1106441216); + WS(1040475912, 1032695578); + sum1 = W(0, -1124525022, -1155851319, 1035372099, -1122500130) + + W(1, -1172701842, 1033773669, 1014757675, -1116930196) + + W(2, -1112011377, -1123298122, -1091278169, 1056532699) + + W(3, 1054708857, -1105035590, 1007501482, 1026134833) + W(4, 1035534023, -1102944834, 1055301749, 1041895809) + + W(5, -1087252087, 1039100863, -1123874252, 1036316385) + + W(6, -1136466746, 1035920825, -1130626274, -1104812886) + + W(7, 1028924087, -1111589035, -1142366545, -1110262076); + sum2 = W(0, -1109091355, -1119792870, -1111337413, -1102054262) + + W(1, -1118550690, -1113960445, -1142500624, -1109065069) + + W(2, 1041703749, -1123886114, 1026232126, 1049335147) + + W(3, -1114718085, -1111978783, -1124340572, 1020384670) + + W(4, -1120034208, -1123320808, 1045621744, 1063803841) + + W(5, -1088756378, 1016064880, 1026268254, 1030310973) + W(6, 1010537508, 1026411366, 1015836410, -1098413574) + + W(7, 1041947548, -1123461018, 999681904, -1122952578); + WS(1060902754, 1050355625); + sum1 = W(0, -1156790206, -1151083459, 1011568442, 1023922682) + + W(1, 1024500211, -1112644265, 1033389138, -1104847739) + + W(2, -1099711167, -1104333225, -1101534272, -1082482317) + + W(3, -1107281952, 1053813598, 1025001795, -1116841801) + + W(4, 1048936605, 1047935457, 1041411896, -1103038759) + W(5, 1049946264, 1036831245, 1037700978, 1030797274) + + W(6, 975051222, -1120760458, 1040804594, 1043235660) + W(7, 998453633, 1030084558, 1007099659, 1035779080); + sum2 = W(0, 1036801640, -1120633215, 1043653368, 1045612039) + + W(1, -1100846658, 976462574, -1115109418, -1097687290) + + W(2, -1106066969, 1029646415, -1102845552, 1020964885) + + W(3, 1041841354, -1088569123, -1101549413, 1054633350) + + W(4, -1098529900, -1094622159, 1045091011, 1062435502) + + W(5, -1104869009, 1054359824, -1101036113, 1044975639) + + W(6, 1051617655, -1128436081, -1108268977, -1120809462) + + W(7, -1127923721, -1115259155, 1041018201, -1102739129); + WS(-1090140642, -1081743990); + sum1 = W(0, 1014408182, -1130293844, 1031847606, 1042594418) + W(1, 1041618980, 1035968392, 1009499077, 1033368909) + + W(2, 1037549524, 1009886528, 1044394635, 1037202321) + W(3, -1117833212, 1037634256, -1122700465, 1015596142) + + W(4, -1119977588, 1031805064, -1097431626, -1094879521) + + W(5, -1119842097, -1101547735, -1107123493, -1105308242) + + W(6, -1148996265, -1107483388, 1015837167, 1035016080) + + W(7, 1032499967, 1034663662, 1017023585, 1030806526); + sum2 = W(0, -1123785792, 1006912162, -1091554339, -1071648513) + + W(1, -1078529007, -1106043455, -1108743589, -1113325201) + + W(2, 1013646496, -1120892227, 1057715626, 1076150687) + W(3, 1069469884, 1049558148, 1035924910, 1038760139) + + W(4, -1105735433, 1034054467, -1103626228, -1110563164) + + W(5, 1025732222, -1102425071, 1028146935, 1001130061) + W(6, 1032589029, -1113324539, 1043157583, 1029343874) + + W(7, -1120727508, 1029688242, -1120545616, -1123660578); + WS(1055430148, -1108560690); + sum1 = W(0, 1035961997, 1035029338, 1036894711, 1041930516) + W(1, 1018389269, -1113968413, 1026969083, -1119268932) + + W(2, -1122962962, -1107101862, -1105458486, -1102453987) + + W(3, 1050880022, 1050461237, 1017425654, 1049028992) + W(4, 1001804274, 1037435821, 1049324163, -1115462345) + + W(5, -1096234295, -1096034793, -1105484423, -1109268985) + + W(6, -1109508687, -1114596033, -1105968336, 1030068713) + + W(7, 1023650152, 1041307521, 1023939770, -1110794404); + sum2 = W(0, 1020921672, 1015626891, -1131154511, -1149322267) + + W(1, 1005570725, -1122484266, -1125609227, 1019773418) + + W(2, -1133145023, 1000680715, 1034643892, -1106033700) + + W(3, -1155618307, 1030350968, -1127714103, 1027949553) + W(4, 967639540, 1038163303, 1029820070, 1027175814) + + W(5, 1050725869, -1107328459, 984351189, -1113454879) + W(6, 1057583079, 1066461314, 1070593780, 1042500058) + + W(7, -1076733999, -1075365186, -1095092572, 1026351361); + WS(1048611396, -1120253991); + sum1 = + W(0, -1109906484, -1134442421, -1157090745, 1038629782) + W(1, 1019276152, 1008425488, -1121251029, -1115994974) + + W(2, -1104843595, 1020368935, -1102655324, -1096452233) + + W(3, -1094801150, -1098953977, -1125379561, -1120481658) + + W(4, 1042068462, -1116357012, -1127594975, 1048790986) + W(5, 1026936628, 1044903358, 1031973931, 1042932491) + + W(6, 1029221016, 1014414830, 1044033359, 1052393436) + W(7, 1029702657, -1137141374, -1117911220, 1022285443); + sum2 = W(0, -1129566974, -1143746400, 1036033029, -1117052801) + + W(1, -1123748463, 1038502321, -1138810328, 1043607047) + + W(2, -1111784437, 1036277891, 1028988774, -1100779042) + + W(3, 1044450885, -1129810696, 1034348699, -1108082071) + W(4, 1050813877, 1047551505, 1061486774, 1077969880) + + W(5, 1055586292, -1131992338, 1040643987, -1108034712) + + W(6, -1093517653, -1098527209, -1081514759, -1071648362) + + W(7, -1089190754, -1107152864, -1111885211, 1025200270); + WS(-1095808772, 1065647947); + sum1 = + W(0, -1096536264, -1104862109, -1101976087, -1101730853) + + W(1, -1126516760, -1106707963, -1123882077, -1108125731) + + W(2, 1055051378, 1050045579, 1051209263, 1045989771) + W(3, -1096666661, -1098537885, 1021791993, -1104774017) + + W(4, -1152511995, -1106144343, -1114400236, 1051130659) + W(5, 1054814183, 1057272194, 1047598263, 1057816237) + + W(6, -1101629224, -1139560206, -1118447811, -1101507019) + + W(7, -1103658466, -1098960762, -1106849375, -1104521538); + sum2 = W(0, -1110633145, -1114352725, -1120367533, -1113576661) + + W(1, -1147392026, -1111220567, -1123261925, -1131596567) + + W(2, 1046325680, -1134514653, 1030462840, 1052343557) + + W(3, 1028577898, -1127265311, 1023140267, -1109705515) + + W(4, -1106205960, -1145236426, -1121802017, 1052169724) + + W(5, -1126550987, 967975074, -1125641651, 1019189507) + + W(6, -1121981161, -1115188107, 1009337269, -1122467029) + + W(7, -1112707841, -1123885069, -1109514951, 1036097210); + WS(-1088656098, -1093593990); + sum1 = W(0, 1009988669, 1006243392, -1118924498, 1040203342) + W(1, 1030956655, 1015251645, 1032654584, 1034196708) + + W(2, 1053407451, 1046462824, 1054487499, 1043824044) + + W(3, -1107509853, -1099069067, -1114843936, -1106663601) + + W(4, -1093246956, -1100605512, -1092703459, -1110184012) + + W(5, 1041099456, 1036164518, 1040232112, 1035276411) + W(6, 1009810317, 1021367180, 1031892963, -1115326423) + + W(7, 1009525296, -1102894371, -1121673919, -1120762380); + sum2 = + W(0, 1045046842, 1057379920, 1066661430, 1065556520) + W(1, -1100359290, -1079104557, -1080513286, -1090732450) + + W(2, -1111686548, 1047338924, 1044625920, -1108706635) + + W(3, 1040575208, 1048831397, -1106604517, -1118381857) + + W(4, -1120613757, 1041926325, 1010608356, -1107659276) + W(5, 1029226052, 990146073, -1122878530, -1148427089) + + W(6, -1123157156, -1122209414, 1026048962, -1118064370) + + W(7, 1036917588, -1118722317, 999828841, -1128484108); + WS(-1103417864, 1032685901); + sum1 = W(0, -1113840082, -1101895278, -1106883347, -1112947643) + + W(1, 1045150312, -1106874992, -1122615424, -1140285221) + W(2, 999140540, 1021813182, 1050838637, 1035808888) + + W(3, -1089518824, -1112862903, -1123587264, 991482976) + + W(4, 1026362243, 1049323684, -1123649147, -1115046028) + W(5, 1051398592, 1043843226, 1032255888, 1025625239) + + W(6, 1025795300, -1104186210, 1026463622, 1015970396) + + W(7, 1028121997, -1114287989, -1148228092, -1125179546); + sum2 = W(0, 1052414494, 1041601968, 1061231009, -1094738093) + + W(1, -1090047391, -1112254382, -1124055261, -1106989530) + + W(2, -1107019340, 1032004449, -1083281727, 1048799024) + W(3, 1060484354, 1026094686, 1028491114, 1016363351) + + W(4, 1021676257, -1101889010, 1040520305, -1113266306) + + W(5, -1097572834, 1047868927, -1106439707, 1039531031) + W(6, -1118630717, 1028135044, 994543087, 1023423300) + + W(7, 1023744190, -1123297050, -1134044699, -1135541243); + WS(1062251010, -1128406975); + sum1 = W(0, -1122559590, -1117783082, -1111223497, -1097132645) + + W(1, -1118294493, 1027318465, -1122628178, -1142140116) + + W(2, -1114430084, 998905218, -1117430765, 1043264160) + + W(3, -1137238321, -1109365760, 1012147781, -1112437644) + + W(4, 1041522773, -1122146129, 1049934150, 1038499861) + W(5, 1040349396, 1038350478, -1161426505, 1022231761) + + W(6, -1200477464, 1030594936, -1117296696, -1108127936) + + W(7, -1117164622, 1008104625, 1016497826, 1030977566); + sum2 = W(0, -1117898288, -1125963325, -1090182563, -1072766634) + + W(1, -1084699977, 1030742992, -1114032290, 1021721886) + W(2, 1035048481, 1029071818, 1058090849, 1075259304) + + W(3, 1062748800, -1113008632, 1039805619, -1113709765) + + W(4, 1015521050, -1131842712, -1155119281, -1099596444) + + W(5, 1015646848, -1124623837, -1116189732, -1146515621) + + W(6, -1121110162, -1139107970, -1131029094, 1037152077) + + W(7, 1018972128, 1025197316, -1127481518, 1027813594); + WS(1065708113, -1121751611); + sum1 = + W(0, -1151170552, -1113367966, -1132161740, -1102777150) + W(1, 1008580363, 1034637855, -1122909571, 1029317996) + + W(2, 1004700116, 1033929377, 1028879143, 1048992314) + W(3, -1130586604, -1123817297, 997138991, -1119780649) + + W(4, 1029908854, -1124121476, 1021289212, -1106962671) + + W(5, -1145749780, 1010684790, -1110778290, -1119558682) + + W(6, -1203182552, -1152107167, 985230639, -1118004497) + W(7, 1024087440, 1024857134, 1018524741, 1030859440); + sum2 = W(0, 1022085973, 1007192988, 1059325611, 1078660314) + W(1, 1067996709, -1179370697, 1033764027, 1000911377) + + W(2, -1128031215, 982756722, -1087213694, -1070139299) + + W(3, -1079390657, -1159362498, -1110724756, 1028041806) + + W(4, 1012976820, -1124806095, 1030136738, -1095156098) + + W(5, -1131018297, 1019962283, 1025926144, -1121497459) + + W(6, -1176062153, 1022708360, -1120463845, 1033425170) + + W(7, -1138793506, -1124014927, 1016277465, -1138055830); + WS(1067144001, 1026092834); + sum1 = W(0, 1005864375, 1014388109, -1110877439, -1100539124) + + W(1, -1110133357, -1126225268, 1033891677, 1016160519) + W(2, 1049810486, 1020396467, 1055042333, 1042867979) + + W(3, 1031992147, 1044290490, 1034565181, 1034066560) + + W(4, -1103125415, 1040462414, -1103579165, -1096204250) + + W(5, 1048911295, -1091768605, -1114007278, -1112003369) + + W(6, -1120236446, -1132016387, -1107048544, -1116193256) + + W(7, 1010104860, 1031444773, 1030176378, 1031923300); + sum2 = W(0, -1130823435, -1108591076, -1112679806, -1095898825) + + W(1, -1107310218, 1030441654, -1128226189, 1031713190) + + W(2, -1123834023, 1045671991, -1133291790, 1058163296) + + W(3, -1100325346, -1113640367, 1016405480, -1116067001) + + W(4, 1036568073, -1106172311, -1115701009, 1057311204) + + W(5, -1097367248, 1044352434, -1106561364, 1014762708) + + W(6, -1114604843, 1024976861, 1033105292, -1122476787) + + W(7, 1035411458, -1111920852, 1031834977, -1121017007); + WS(1057420226, -1092362255); + sum1 = W(0, 1032475105, 1020346174, -1121587297, 1019256762) + W(1, -1123769862, 1033058515, 1024808486, 1030782351) + + W(2, 1044920519, -1144052776, 1052978802, 1055322687) + W(3, -1104246416, 1040777765, 1016898380, 1041983019) + + W(4, -1103664666, 1027257637, -1096869991, -1116373310) + + W(5, 1028318277, -1096789598, -1118572551, -1106323631) + + W(6, -1114304581, -1116794957, -1103967019, -1100439285) + + W(7, 1018564517, 1036089864, 1021198731, -1130998630); + sum2 = W(0, -1134184569, 1006994613, 1034914936, -1134366153) + W(1, 1033598449, 1009154259, 989883430, 1021229932) + + W(2, 1016741405, -1130764191, 1033077740, -1112456708) + + W(3, 1043198162, -1132669129, 1016038391, -1126067903) + W(4, 1020516693, 1043863088, 1060988002, 1071901111) + + W(5, 1043355315, 1018979141, 1034096544, 1022348007) + + W(6, -1102863001, -1103907912, -1084447988, -1076633620) + + W(7, -1098165823, -1118646231, -1113048166, -1118544043); + WS(-1105493768, -1082709441); + + return clamp(mstd0 + 5.0 * vsum / wsum * mstd1, 0.0, 1.0); +} + +shared float inp[525]; + +#define CURRENT_PASS 2 + +#define GET_SAMPLE(x) dot(x.rgb, rgb2y) +#define imageStore(out_image, pos, val) imageStoreOverride(pos, val.x) +void imageStoreOverride(uint2 pos, float value) { + float2 UV = mul(rgb2uv, INPUT.SampleLevel(sam_INPUT_LINEAR, HOOKED_map(pos), 0).rgb); + OUTPUT[pos] = float4(mul(yuv2rgb, float3(value.x, UV)), 1.0); +} + +#define INPUT_tex(pos) GET_SAMPLE(vec4(texture(INPUT, pos))) +static const float2 INPUT_size = float2(GetInputSize()); +static const float2 INPUT_pt = float2(GetInputPt()); + +#define temp_tex(pos) (float(texture(temp, pos).x)) +static const float2 temp_size = float2(GetInputSize().x * 1, GetInputSize().y * 2); +static const float2 temp_pt = float2(1.0 / (temp_size.x), 1.0 / (temp_size.y)); + +#define HOOKED_tex(pos) temp_tex(pos) +#define HOOKED_size temp_size +#define HOOKED_pt temp_pt + +void Pass2(uint2 blockStart, uint3 threadId) { + ivec2 group_base = ivec2(gl_WorkGroupID) * ivec2(gl_WorkGroupSize); + int local_pos = int(gl_LocalInvocationID.x) * 15 + int(gl_LocalInvocationID.y); + for (int id = int(gl_LocalInvocationIndex); id < 525; id += int(gl_WorkGroupSize.x * gl_WorkGroupSize.y)) { + uint x = (uint)id / 15, y = (uint)id % 15; + inp[id] = + HOOKED_tex(HOOKED_pt * vec2(float(group_base.x + x - (1)) + 0.5, float(group_base.y + y - (3)) + 0.5)).x; + } + barrier(); + vec4 ret = vec4(0.0, 0.0, 0.0, 0.0); + vec4 ret0 = vec4(0.0, 0.0, 0.0, 0.0); + vec4 samples[8]; + samples[0][0] = inp[local_pos + 0]; + samples[0][1] = inp[local_pos + 1]; + samples[0][2] = inp[local_pos + 2]; + samples[0][3] = inp[local_pos + 3]; + samples[1][0] = inp[local_pos + 4]; + samples[1][1] = inp[local_pos + 5]; + samples[1][2] = inp[local_pos + 6]; + samples[1][3] = inp[local_pos + 7]; + samples[2][0] = inp[local_pos + 15]; + samples[2][1] = inp[local_pos + 16]; + samples[2][2] = inp[local_pos + 17]; + samples[2][3] = inp[local_pos + 18]; + samples[3][0] = inp[local_pos + 19]; + samples[3][1] = inp[local_pos + 20]; + samples[3][2] = inp[local_pos + 21]; + samples[3][3] = inp[local_pos + 22]; + samples[4][0] = inp[local_pos + 30]; + samples[4][1] = inp[local_pos + 31]; + samples[4][2] = inp[local_pos + 32]; + samples[4][3] = inp[local_pos + 33]; + samples[5][0] = inp[local_pos + 34]; + samples[5][1] = inp[local_pos + 35]; + samples[5][2] = inp[local_pos + 36]; + samples[5][3] = inp[local_pos + 37]; + samples[6][0] = inp[local_pos + 45]; + samples[6][1] = inp[local_pos + 46]; + samples[6][2] = inp[local_pos + 47]; + samples[6][3] = inp[local_pos + 48]; + samples[7][0] = inp[local_pos + 49]; + samples[7][1] = inp[local_pos + 50]; + samples[7][2] = inp[local_pos + 51]; + samples[7][3] = inp[local_pos + 52]; + ret[0] = nnedi3(samples); + ret0[0] = inp[local_pos + 18]; +#if CURRENT_PASS == LAST_PASS + uint2 destPos = blockStart + threadId.xy * 2; + uint2 outputSize = GetOutputSize(); + if (destPos.x >= outputSize.x || destPos.y >= outputSize.y) { + return; + } +#endif + imageStore(out_image, ivec2(gl_GlobalInvocationID) * ivec2(2, 1), ret0); + imageStore(out_image, ivec2(gl_GlobalInvocationID) * ivec2(2, 1) + ivec2(1, 0), ret); +} diff --git a/src/Effects/NNEDI3/NNEDI3_nns64_win8x6.hlsl b/src/Effects/NNEDI3/NNEDI3_nns64_win8x6.hlsl index 75f402d84..0f9c2c370 100644 --- a/src/Effects/NNEDI3/NNEDI3_nns64_win8x6.hlsl +++ b/src/Effects/NNEDI3/NNEDI3_nns64_win8x6.hlsl @@ -1,149 +1,1472 @@ -// nnedi3-nns64-win8x6 -// 移植自 https://github.com/bjin/mpv-prescalers/blob/cc02ed95c1fe05b72bc21d41257c4c085e6e409b/compute/nnedi3-nns64-win8x6.hook -// 有半像素的偏移 +// This file is generated by the scripts available at https://github.com/hauuau/magpie-prescalers +// Please don't edit this file directly. +// Generated by: nnedi3.py --nns 64 --win 8x6 --use-compute-shader --use-magpie +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . //!MAGPIE EFFECT -//!VERSION 3 -//!OUTPUT_WIDTH INPUT_WIDTH * 2 -//!OUTPUT_HEIGHT INPUT_HEIGHT * 2 - +//!VERSION 4 +//!SORT_NAME NNEDI3_064_6 //!TEXTURE Texture2D INPUT; //!SAMPLER //!FILTER POINT -SamplerState sam; +SamplerState sam_INPUT; + +//!TEXTURE +//!WIDTH INPUT_WIDTH * 1 * 2 +//!HEIGHT INPUT_HEIGHT * 2 * 1 +Texture2D OUTPUT; //!SAMPLER //!FILTER LINEAR -SamplerState sam1; +SamplerState sam_INPUT_LINEAR; //!TEXTURE -//!WIDTH INPUT_WIDTH -//!HEIGHT INPUT_HEIGHT * 2 //!FORMAT R16_FLOAT -Texture2D tex1; +//!WIDTH INPUT_WIDTH * 1 +//!HEIGHT INPUT_HEIGHT * 2 +Texture2D temp; -//!COMMON +//!SAMPLER +//!FILTER POINT +SamplerState sam_temp; -#define T(x) asfloat(x) -#define W(i,w0,w1,w2,w3) dot(samples[i],float4(T(w0),T(w1),T(w2),T(w3))) -#define WS(w0,w1) sum1 = exp(sum1 * mstd2 + T(w0)); sum2 = sum2 * mstd2 + T(w1); wsum += sum1; vsum += sum1*(sum2/(1.0+abs(sum2))) +//!COMMON +#include "prescalers.hlsli" +#define LAST_PASS 2 //!PASS 1 -//!DESC double_y +//!DESC NNEDI3 (double_y, nns64, win8x6) //!IN INPUT -//!OUT tex1 -//!BLOCK_SIZE 32,16 -//!NUM_THREADS 32,8 - - -float nnedi3(float4 samples[12]) { +//!OUT temp +//!BLOCK_SIZE 32, 16 +//!NUM_THREADS 32, 8 +#pragma optionNV(inline none) +float nnedi3(vec4 samples[12]) { float sum = 0.0, sumsq = 0.0; - [unroll] - for (int i = 0; i < 12; i++) { - sum += dot(samples[i], 1.0f); + [unroll] for (int i = 0; i < 12; i++) { + sum += dot(samples[i], vec4(1.0, 1.0, 1.0, 1.0)); sumsq += dot(samples[i], samples[i]); } - float mstd0 = sum / 48.0; float mstd1 = sumsq / 48.0 - mstd0 * mstd0; - // 不能使用 lerp,否则结果可能为 nan - float mstd2 = mstd1 >= 1.192092896e-7 ? rsqrt(mstd1) : 0.0; + float mstd2 = mix(0.0, inversesqrt(mstd1), mstd1 >= 1.192092896e-7); mstd1 *= mstd2; - float vsum = 0.0, wsum = 0.0, sum1, sum2; +#define T(x) intBitsToFloat(x) +#define W(i, w0, w1, w2, w3) dot(samples[i], vec4(T(w0), T(w1), T(w2), T(w3))) +#define WS(w0, w1) \ + sum1 = exp(sum1 * mstd2 + T(w0)); \ + sum2 = sum2 * mstd2 + T(w1); \ + wsum += sum1; \ + vsum += sum1 * (sum2 / (1.0 + abs(sum2))); + sum1 = + W(0, -1120714617, 1035162146, -1110752415, -1121818163) + W(1, 1035961863, -1120878363, 1007614003, -1123901891) + + W(2, 1046176310, -1105876799, 1034124059, -1120533037) + + W(3, -1123305414, 1027364554, -1114390527, -1096860741) + + W(4, 1022953826, -1155422496, 1009908268, 1030225939) + W(5, -1110762423, 1046191054, 1023450788, -1124524780) + + W(6, -1129324172, -1116882705, 1032526991, 1043289735) + + W(7, -1114841418, -1129613106, -1121901526, 1030599214) + + W(8, -1096831458, 1052908756, -1114991488, 1013731840) + + W(9, 1022915304, -1135846624, -1117077507, 1034530771) + + W(10, -1116257712, 981289536, -1142748844, -1113117446) + + W(11, -1127767760, 1039462233, 1025047056, -1143328976); + sum2 = + W(0, -1131108965, 1043465638, 988544780, -1145266179) + W(1, 1018501507, 1021344415, 1000650931, -1113612493) + + W(2, -1124179817, -1111438835, 1003301507, -1131299129) + + W(3, 1025688791, -1106748353, -1070139293, -1110118136) + + W(4, 1026178295, -1123696315, -1116852534, 1029599173) + + W(5, -1102659167, -1097100047, 1031198431, 1012522521) + W(6, -1145056307, 1045881517, 1078104617, 1027449515) + + W(7, -1123515159, 1024975831, -1123043594, -1118230687) + + W(8, 1048052425, 1027739737, -1134523125, 1020199127) + W(9, 1018436747, 1029259867, -1126127905, -1136112041) + + W(10, 995063942, -1162666156, -1139914565, -1107504809) + + W(11, 1025133515, 1036504803, -1120319069, -1131042995); + WS(1061710334, -1113637247); + sum1 = W(0, -1121814583, 1036106897, -1109309294, -1143950978) + + W(1, 1033251382, -1118153848, -1138603692, -1122595552) + + W(2, 1048694647, -1103580007, 1032154570, -1122508490) + + W(3, -1138264845, 1018454510, 1030681928, -1097890158) + + W(4, 1019050396, 1012933309, -1140194465, 1033737112) + + W(5, -1115559686, -1120177173, 1021617155, -1120902675) + + W(6, -1131439046, -1122735662, 1044326142, 1042373458) + + W(7, -1113884080, -1152998244, -1125621862, 1024541667) + + W(8, -1097437158, 1052689231, -1107957310, 1016843898) + + W(9, 1023073058, -1122620661, -1132933761, 1034486114) + + W(10, -1116304653, -1144273714, -1129805541, -1116003130) + + W(11, -1128614666, 1037961704, 1019245786, -1155701620); + sum2 = W(0, -1162960213, -1107084454, -1126626424, 1025411499) + + W(1, -1126548940, -1127269937, 1013908203, 1023868855) + W(2, 1032930462, 1029914487, 997665611, 1018748433) + + W(3, -1113327157, 1032525526, 1076098019, 1035900190) + + W(4, -1121182801, -1158385717, 1023571595, 1048796624) + + W(5, -1132699465, -1093496445, 1038561302, 1000017309) + + W(6, -1133790043, -1104878976, -1072747140, 1026052839) + + W(7, -1146184997, -1123007653, 1024139725, 1003078933) + + W(8, -1104764998, -1109617402, -1142783113, -1154085627) + + W(9, -1130037920, -1121062518, 1019199125, 1025857863) + + W(10, -1147685381, 1000677165, 1007034787, 1034207166) + + W(11, -1123497947, -1118139493, 1017680405, 1016687665); + WS(1064800702, 1030635520); + sum1 = + W(0, 1004285524, -1128056492, 1035663048, -1110660706) + W(1, -1128734654, 1028175148, -1122860750, 1024005652) + + W(2, 1031878036, -1116831438, -1204558974, -1143857649) + W(3, -1122286551, 1035530413, 984521208, 1023270757) + + W(4, -1136886024, 1005008153, 1021316024, 1053335517) + W(5, -1100061872, -1093549817, 1042579293, 1016449422) + + W(6, -1116388951, -1139373960, 1048911707, -1104621327) + + W(7, -1148999845, -1135015336, 1022533838, -1130762670) + + W(8, 1035194194, -1149876978, -1142259845, 1010510404) + + W(9, -1125657162, -1121564617, -1131931048, -1142066105) + + W(10, -1120920449, 1018152308, 1001429301, -1129213371) + + W(11, -1141986761, 1031904066, -1111776529, 1020350678); + sum2 = + W(0, 1015139874, -1120731382, 1017539382, 1020112270) + W(1, -1126248934, 1013963196, -1150118671, -1116737087) + + W(2, 1031888972, -1112637962, 1010207212, -1138130380) + W(3, 1032711786, -1087320828, 1059502015, 1026899401) + + W(4, -1119882792, 1019091922, 1028577839, -1069693959) + + W(5, 1078824499, -1094071548, 1040940327, -1123861886) + + W(6, -1116703472, -1103666133, 1045823576, 1036639812) + + W(7, -1131804892, 1004924552, -1123435694, -1138801588) + + W(8, 1009232228, -1114441289, 1029410629, -1130443436) + W(9, -1140098908, 999422392, 1011539428, 1023067274) + + W(10, -1130083750, -1137456436, -1140019692, 1029210329) + + W(11, -1118193829, -1131442506, 1007549476, 1026106777); + WS(1058942782, 1023618692); + sum1 = W(0, -1126072821, 1041771492, -1110777188, -1110871838) + + W(1, 1036426764, -1142526755, 1011693912, 1025548876) + W(2, 1035801072, 1043278082, -1146527995, 1015953709) + + W(3, 1017195423, 1036961985, -1094081945, -1103634941) + + W(4, 1046715887, -1148709083, -1122268692, 1037536142) + + W(5, -1091452759, -1105679152, 1040286827, -1119884351) + + W(6, 1022607903, 1038780013, -1095962376, -1103558179) + W(7, 1049101574, -1122534754, 982545387, 1023558139) + + W(8, 1049096396, -1130619215, 1031851588, 1007174309) + + W(9, -1126061755, 1037537425, -1113879430, -1136949949) + + W(10, 1002869195, 1017517093, 1003763447, 1035261291) + W(11, 955835050, 1026350907, 1006549707, 986004587); + sum2 = + W(0, -1128639222, 1001638233, -1119841411, 1014385869) + W(1, 986023269, -1135260845, -1150616818, 1013509397) + + W(2, 1029376723, 1037911199, 970306708, 1013815957) + W(3, -1118932607, 1035428655, 1019940778, -1102461584) + + W(4, -1141011097, 959170344, -1125568566, 1024255335) + W(5, 1063260126, -1085129330, -1110526300, 1017551658) + + W(6, 991022546, 1031481278, 1032753418, -1110003004) + W(7, 1033244979, 1016351942, -1129687950, -1111645244) + + W(8, 1026999545, 1019019978, -1121764803, -1127392454) + W(9, 1018120650, 1028380841, -1121385219, 1021463302) + + W(10, 1025283273, 1009569613, 1006676397, -1115817479) + + W(11, -1134958989, 1017625850, -1128128990, -1138867245); + WS(1037837808, 1056377428); + sum1 = W(0, -1135573495, -1105969090, 1027945538, 1043223694) + + W(1, -1100584037, 1025656415, 1023727061, -1138454045) + + W(2, -1116105371, 1039709953, -1111027805, 1021082723) + + W(3, -1118803082, -1114548551, -1126955510, 1051232418) + + W(4, -1097887999, 1018764077, -1123500111, 1046351686) + + W(5, -1122693874, -1100833583, 1040497066, -1115071549) + + W(6, 1020600341, 1036383371, 1053007142, -1103740252) + W(7, 1024768136, 1025234525, -1111066541, 1034647805) + + W(8, 1035274060, -1101618713, -1138012047, -1116333124) + + W(9, 1008936161, 1026657308, -1156882549, 1033814037) + + W(10, -1123286772, 1016891995, -1115286797, 1033474888) + + W(11, -1122516460, -1129756781, 1010716753, -1114238799); + sum2 = W(0, 1020978875, -1100967324, 1043179705, 1026290891) + + W(1, 1013196277, -1138979633, -1121670462, -1130583533) + + W(2, -1122981488, 1032797386, -1120286641, 966672716) + + W(3, -1103298336, -1096736455, 1062358565, -1104401130) + + W(4, -1114052290, -1152672163, -1110731474, 1053186254) + + W(5, -1112891412, -1091109944, 1048200412, -1122242747) + + W(6, -1105136733, 1045958215, 1031005462, -1133705481) + + W(7, -1113847816, 1023845499, -1119790394, 1043729632) + + W(8, 1033523405, -1102472853, 1033631266, -1118586102) + + W(9, -1127100056, 1033816035, -1109547546, 1031959215) + + W(10, -1126209517, -1147194793, 999102475, 1020355333) + + W(11, -1122874410, -1122532081, 1027184816, -1127245018); + WS(1050865148, 1032626572); + sum1 = W(0, -1110436993, 1043627312, -1118552440, 1045700875) + + W(1, -1115060612, 1040430485, 1040042556, -1101476879) + + W(2, -1108049256, 1033317691, 1031191472, -1096410465) + + W(3, -1107890608, 1049906138, -1107535228, -1115480133) + + W(4, 1025393771, 1042925123, -1113356418, -1109025830) + + W(5, -1162779891, 1049713062, -1106727656, -1114330616) + + W(6, 1034032544, -1120749707, -1095271743, 1042738346) + + W(7, -1127443770, -1106585845, -1105712244, 1051482110) + + W(8, 1035225158, -1122810712, 1039553933, 1042770518) + W(9, 999321197, -1103830356, -1104074479, 1050825756) + + W(10, -1104755066, -1103219825, -1110201208, 1048543054) + + W(11, -1106449960, 1031488492, 1040395170, 1009713998); + sum2 = + W(0, 1024944996, -1111924540, -1107012648, 1057346437) + W(1, -1105023593, -1097010076, 1020193961, 1007347355) + + W(2, 1049541488, 1054940943, -1097277462, -1107952444) + + W(3, 1014966838, -1116539066, -1107447750, 1059914271) + + W(4, -1142156696, -1085761230, 1015828472, 1012341552) + + W(5, -1109770505, 1066972918, 1043445868, -1078926120) + + W(6, -1113612636, 1034050704, -1111197863, 1063973493) + + W(7, 1017043379, -1084679416, 1032934706, -1113193567) + + W(8, 1014122612, 1056333532, -1118781870, -1092348708) + W(9, -1116105943, 1042584092, 1016467631, 1045837843) + + W(10, -1113967259, -1128370702, 1021395599, -1116104243) + + W(11, -1135977693, 1043326701, -1117573943, -1108363561); + WS(1054811644, 1027249161); + sum1 = + W(0, 1040940111, -1101358582, -1113576073, 1049141881) + W(1, -1132483205, -1116754862, -1100243090, 1036221579) + + W(2, 1038054901, -1105999252, -1104538698, 1037145120) + W(3, 1043481462, 1014943347, -1097482896, 1051960356) + + W(4, 1036681666, -1118995685, -1119365790, -1109150355) + + W(5, -1106696288, 1048275427, -1123112824, -1126689554) + + W(6, -1111878381, 1036687602, 1022736646, -1118345360) + W(7, 1019000333, 1038634998, 1044780378, -1109759237) + + W(8, -1097940765, 1049145430, 1044474573, -1101292557) + + W(9, -1101638738, 1028424107, 1038478827, -1113101949) + + W(10, -1103799553, 1034438878, 1035929492, -1122643648) + + W(11, -1103674991, 1037909315, 1037239602, -1126283866); + sum2 = W(0, 1023766557, 1016554458, 1021815988, -1137435361) + W(1, -1114856427, 1032032312, 1015306072, 1020144724) + + W(2, -1103467660, 1016553974, 1044555388, -1105991725) + + W(3, -1136376403, -1116988904, 1034521268, 1060795535) + + W(4, -1088370625, -1127777881, -1113107482, 1050162106) + + W(5, -1102546407, 1075503478, -1071164689, 1035804901) + + W(6, 1038494252, -1104347057, -1103257907, 1072821349) + + W(7, -1077590614, -1120944929, -1113447013, 1003678517) + + W(8, 1025406308, -1113972415, -1112563255, 1036418439) + + W(9, 1023629411, 1033762395, -1113239746, 1031283975) + + W(10, 995356642, -1123929939, 1024784188, -1109441777) + + W(11, 1026085595, 1037416902, -1112537357, -1140753514); + WS(1055940220, -1124188157); + sum1 = + W(0, -1113999823, -1119569210, 1015781094, -1147977024) + W(1, -1117684995, -1108336232, 1015763751, 1043278990) + + W(2, -1106256755, 1046188556, 1036478965, 1006648968) + W(3, -1115168029, -1094609330, 1052603679, 1041916962) + + W(4, 1033522483, -1101485874, 1022861696, 1044340802) + + W(5, -1095339972, -1108128054, 1047885622, -1110457109) + + W(6, -1114461725, 1033154083, -1108564239, 1057380776) + + W(7, 1036635468, -1114614567, -1113117029, -1106205123) + + W(8, 1042723938, -1095928258, 1035899866, -1108232826) + W(9, 1032164308, 1021089498, -1125646960, 1041299799) + + W(10, -1139371156, 1034599135, -1121800074, -1107756257) + + W(11, -1171638077, 1027517543, -1131185034, -1115299047); + sum2 = + W(0, -1120118804, -1136369034, -1127959037, 1015341014) + W(1, 1033327798, -1113602386, 1013270421, 1027353114) + + W(2, -1129939889, 1034464346, 1041751325, -1114857235) + + W(3, -1120552641, -1125884733, -1117793827, -1117887441) + + W(4, 1049619624, -1103868602, -1117027367, 1035518448) + + W(5, -1095769137, 1043338219, 1049093640, -1097589990) + W(6, 1016254148, 1043285424, -1095274849, 1049861339) + + W(7, 1048627700, -1105817123, -1110780393, -1129166063) + + W(8, -1117623897, -1128474295, 1035712363, -1106207094) + + W(9, 1030787932, -1140216380, -1128598589, 1032330618) + + W(10, 1035384499, 1004274322, -1133117880, -1120569751) + + W(11, -1129927717, 1018695247, 1027229852, -1120123842); + WS(1057163582, 1025817537); + sum1 = + W(0, 1037167835, 1031655825, -1096271953, 1045084224) + W(1, 1033520525, 1016078798, -1121852313, 1046829204) + + W(2, -1093143228, 1046279122, -1103697416, 1030441081) + W(3, 1034559945, 1038865075, -1085198281, 1057074420) + + W(4, -1107583934, 1036548879, 1027044951, 987855837) + W(5, 1050118415, 1040167170, 1024989936, 974934139) + + W(6, 1039868489, -1105739319, 1057217669, -1086525384) + W(7, 1034776664, 1034922130, 1037598609, -1112419405) + + W(8, 1047779928, -1087515051, 1044254259, -1113468278) + W(9, 1007581568, 1015381448, 1035805671, -1098926044) + + W(10, -1134624240, 1036139674, 1031626785, 1037495244) + + W(11, 1015872616, -1124461564, -1113253902, 1017385676); + sum2 = W(0, -1136384493, 1036526786, 1028719631, -1123632092) + + W(1, -1145098603, -1122280548, 1023814631, -1099879539) + + W(2, 1030342243, 1043747658, -1102737141, -1130733945) + W(3, 1033659202, 1034332004, 1046758826, 1050427835) + + W(4, -1112406001, 1014543213, 1017810163, 1013925981) + + W(5, -1093436173, -1100447595, -1119158797, -1123106681) + + W(6, 1009967381, -1106516740, 1051870663, 1041231786) + W(7, 1034292458, 1019870319, 1017781727, -1101585218) + + W(8, 1042788701, 1045006578, -1107586767, 1013053757) + + W(9, -1118180802, -1131784625, -1114786901, 1010389989) + + W(10, -1143106923, -1119739637, -1141961139, -1112082470) + + W(11, -1113417628, -1117114477, 1032164569, 1012643781); + WS(-1081763615, -1092598780); + sum1 = W(0, -1130922677, -1114318275, -1127997567, 1028467828) + + W(1, 1023598927, -1139280241, -1122514966, 1026414532) + + W(2, -1121576984, -1127358845, 1017010415, 1002425203) + + W(3, -1136114845, 1017564438, -1088500870, 1061837768) + + W(4, -1116904946, -1123987795, 1015393433, 1021344041) + + W(5, -1098266094, 1035926493, 1037585875, -1136160989) + + W(6, -1137786397, -1095352826, 1061435536, -1095349722) + + W(7, 1040151266, -1131570741, 1023447063, -1116164091) + + W(8, -1148866211, -1114585584, 1031742785, -1116123969) + + W(9, -1142668459, -1123782681, 1039772482, -1114677716) + + W(10, 1007413957, 1020007637, -1140705115, 1012849463) + + W(11, 1024002537, -1116920883, -1128808099, -1126849079); + sum2 = + W(0, 1021958137, 1034408685, -1106091708, -1098486326) + W(1, 1028745769, 1024682325, -1117837187, 1036094407) + + W(2, -1147105428, -1110159069, 1031154711, -1116910593) + + W(3, 1026312941, 1033683959, -1094093059, -1088187103) + + W(4, -1105512708, 1039406737, -1115513274, -1124949158) + + W(5, 1061646324, 1055280585, -1100598283, -1117359799) + W(6, 1037370871, -1091894288, 1058519893, 1045036050) + + W(7, -1109806227, 1026080301, -1112242113, 1027011647) + + W(8, -1106569597, 1045721104, -1117345257, -1117139296) + + W(9, 1033686533, -1107943508, 1037199097, 1034325435) + W(10, -1144974476, 991455177, -1107052036, 1010459130) + + W(11, 1030945863, 1039418143, -1124920152, -1112397476); + WS(1049187708, 1061143407); + sum1 = W(0, 1032206028, 1046469409, 1044620591, -1086760535) + W(1, 1049164066, 1022165171, -1121811767, 1033070593) + + W(2, 1020031147, -1113096094, -1132628435, 1009114287) + + W(3, 1032297330, 1049873346, -1111788011, -1092765627) + + W(4, 1051671486, 1034535880, -1136528167, 1050639650) + + W(5, -1089881571, -1083700943, 1044844041, 1024964917) + + W(6, 1005295654, 1041319460, -1127219501, -1092202425) + W(7, 1037004161, 1011091807, 1031846890, 1041542033) + + W(8, 1033106537, 1011207027, 1026161438, 1038185039) + W(9, -1136496587, 1036329419, 991465499, 1015330121) + + W(10, -1134373563, 1018308239, 1032778794, 1043869975) + + W(11, -1112918515, 1026637361, 1019220893, 1032129132); + sum2 = + W(0, -1123557888, 1024038368, 964997605, -1123190992) + W(1, -1170950771, 1009594487, -1139662759, 1022314468) + + W(2, 1007232143, 1040909663, -1119781676, 1011035391) + W(3, -1120649660, 1016353740, -1112234110, 1035500288) + + W(4, -1122589660, -1122952928, 1021700488, -1149024430) + W(5, 1052797849, 1059925772, 1021322900, 1015425876) + + W(6, -1119215196, -1127462832, 1032636001, -1123381020) + + W(7, -1124742672, 1024335912, 1025758640, -1109226016) + + W(8, -1096670151, -1110751472, 1037872214, -1115520552) + + W(9, -1134635263, 1022909500, -1103246759, -1114698588) + + W(10, -1123038904, 1026100870, 1025396502, -1106595065) + + W(11, -1095307242, 1016687528, 1025386190, -1128653768); + WS(-1080960863, 1058419411); + sum1 = W(0, -1118700722, -1111066847, 984198859, 1043965403) + + W(1, -1108783427, 1000248987, 1032983255, -1112208894) + + W(2, -1099715572, -1113907195, -1113914551, -1124179019) + + W(3, -1122641758, -1099579692, 1049479517, 1050672334) + + W(4, -1105019770, -1128328213, 1033094082, -1090459763) + + W(5, 1062349342, 1061713555, -1095692932, 1023738862) + + W(6, -1121000958, -1107128402, -1099059374, 1059583022) + + W(7, -1099879371, -1131329315, -1133773881, -1107276892) + + W(8, 1033076198, -1121054998, -1108028092, 1027231576) + + W(9, -1141737059, -1116550064, -1125040759, 1024684126) + + W(10, 1024533736, -1113801521, -1120123854, -1103159313) + + W(11, 1037355536, 1026513898, -1110661700, 1007580489); + sum2 = + W(0, 995719700, -1129327601, -1125739202, 1029045123) + W(1, 1025141617, -1154923092, -1114687459, 1021214658) + + W(2, 1027238209, 1037994429, -1113434302, 1007115993) + W(3, 1024240180, 997717028, -1120915257, 1036441804) + + W(4, 1032546636, 1003062850, -1115935924, 978476974) + W(5, -1078687396, 1066236156, 1035362808, -1118441375) + + W(6, 1025427056, -1140454571, -1111104335, 1022342240) + W(7, 1033358736, 1017727844, -1123062148, 1010080137) + + W(8, -1128218828, 1028953671, -1166615662, -1129048983) + W(9, 999440794, 1002330866, -1147995690, 1024857232) + + W(10, -1165027863, 1019778022, -1131128122, -1152746908) + + W(11, -1128526870, -1126806088, 1024563904, 1009762473); + WS(-1082880574, -1095080656); + sum1 = + W(0, -1120399523, -1111736159, -1111698940, 1037879414) + + W(1, 1037066756, -1118524245, -1123397517, -1128373242) + + W(2, 1019423266, 1028697399, -1119567216, 1027581671) + W(3, -1135116544, 1025039907, -1092929515, 1062200098) + + W(4, -1131199446, -1139610160, -1168421181, -1127950106) + + W(5, -1098702381, 1023355236, 1027882718, -1139561152) + + W(6, -1131259136, -1098593297, 1060991762, -1094756999) + + W(7, 1038218895, 1005358744, 1037719400, -1106461210) + W(8, 1018082074, -1115312044, 1022591155, -1113962893) + + W(9, -1113348279, 1024172498, 1036669022, -1106391640) + + W(10, -1118950442, 1026868195, 1030740495, 1028249110) + + W(11, -1114016273, -1109491766, -1141634128, -1126548648); + sum2 = W(0, 1007561151, -1106890729, -1144059530, 1010626011) + + W(1, -1140206187, -1152147163, -1118820752, 1031296198) + + W(2, -1112391017, -1114880200, -1136937433, -1120281594) + + W(3, -1128452386, -1110907715, 1056169840, 1052511775) + + W(4, 1034255225, -1114711449, -1121745985, 1032462388) + + W(5, -1096446085, -1094697844, 1033067226, 993102387) + W(6, -1114861795, 1035962501, 1031556034, 1056886944) + + W(7, -1104164393, -1120009849, -1121584151, 1035033495) + + W(8, 987032615, -1129701328, 1013679559, -1122813977) + W(9, -1120079456, 982365671, -1138039959, 980377326) + + W(10, -1115367679, -1118918686, -1129117272, 1035951051) + + W(11, -1119286197, -1126702674, -1137374445, 1006646323); + WS(1058795070, 1058351276); + sum1 = + W(0, -1129226172, -1106246658, 1041614193, 1041522846) + W(1, -1106977045, -1140271486, 1032650784, -1132244111) + + W(2, 1048401911, 1041471472, 1031926461, -1130658915) + W(3, -1134152362, -1102574120, 1050141831, 1033352747) + + W(4, -1121658742, -1115542891, -1122312016, 1028257624) + + W(5, -1088102699, 1030285885, -1124591186, -1119417531) + + W(6, -1145265749, 1004724909, -1093353638, 1056599450) + + W(7, -1107883356, -1155196377, -1118796187, -1128587973) + + W(8, -1112285036, 1049138668, -1114299650, 1003429157) + + W(9, 1017891569, -1150296521, -1122892680, 1043369227) + + W(10, -1130730345, -1125742491, -1131365684, -1107598873) + + W(11, -1120116589, 1040658126, 1034850634, -1137642362); + sum2 = + W(0, 1018264792, -1109681111, 1028734812, -1104210606) + W(1, 1025579416, 1029305888, 1019878456, -1134735936) + + W(2, -1093714299, -1099909667, 1032419228, -1113499692) + + W(3, 1020074080, -1106212594, 1034660210, -1098896203) + W(4, 1010388000, 1025031188, -1143212320, 1037009054) + + W(5, 1047288883, 1060586916, 1030286292, -1130541520) + W(6, -1148803168, -1132238328, 1031452084, 1042866381) + + W(7, -1107165918, -1127563664, -1127882992, 1032289620) + + W(8, -1112028563, -1109339206, 1019446368, 1026005920) + W(9, 1017409120, 990246720, -1115169564, 1023925320) + + W(10, 989303425, -1123344268, -1131165168, 1004132864) + + W(11, 1020410832, -1112228144, 1029468412, 1009015280); + WS(1043816952, 1056206353); + sum1 = + W(0, -1132948972, -1115461859, 1034684352, 1037119642) + W(1, -1107088436, -1144087781, 1024900084, -1107172113) + + W(2, 1038250028, 1039626815, -1110088668, -1116127087) + + W(3, -1150680698, -1097009915, 1061195075, -1095598055) + + W(4, -1113187289, -1117712852, 1016358425, -1102438229) + + W(5, 1051576078, 1056604231, -1102307882, -1114968828) + + W(6, -1160444148, 1024199571, -1088975285, 1057172865) + + W(7, -1103288997, -1134624362, -1115326124, -1148961467) + + W(8, 1010078034, 1029312608, -1122873761, 1012385158) + W(9, 1019123435, -1130723763, -1107729186, 1039764276) + + W(10, 1032878393, -1114736693, -1120343575, -1144998513) + + W(11, 1022450003, -1112740858, 1034042985, 1002559709); + sum2 = + W(0, -1135809827, 1031002711, -1136033931, -1114169661) + W(1, -1107967067, 1027957130, -1140675011, 1009667595) + + W(2, 1025543601, -1124911966, -1108557845, 1004385158) + + W(3, -1137384851, -1156373420, -1123691685, 1056449903) + + W(4, -1096033675, 1015282250, -1147988326, 1010789683) + + W(5, -1105219090, 1044469394, -1118550723, -1115586301) + + W(6, 1019754904, -1122328477, -1118075063, 1046754031) + + W(7, 1020360378, -1120013003, -1172160176, -1135703979) + + W(8, -1111692677, 1034039333, 1005574774, -1130287690) + W(9, 1006265798, 1016962928, -1131889022, 1024901767) + + W(10, 1025982043, -1127946498, 990940844, -1135289651) + + W(11, 1010975355, -1111731157, 1036125487, -1169619760); + WS(1049886076, 1034318367); + sum1 = W(0, -1140544720, 1022042959, 1021784769, -1131075883) + + W(1, -1142660485, -1160888244, 1006465467, -1106141033) + + W(2, 966352080, 1032360624, 1029412697, -1121174096) + W(3, 1025588553, -1104462159, 1059646174, -1086897182) + + W(4, 1042100949, 1017231209, -1118154094, -1100197533) + + W(5, 1051735858, 1059041662, -1106256562, -1150715274) + W(6, 996302474, 1029682164, -1085821075, 1057694799) + + W(7, -1106530518, 1024907260, -1111905052, -1112348667) + + W(8, 1029991670, 1036690656, -1121375714, 1015672965) + + W(9, -1125961261, -1117824763, -1111853843, 1030592201) + + W(10, 1017125029, -1120397516, -1122979160, -1123002959) + + W(11, 1031029131, -1155480906, 1014936522, -1124207481); + sum2 = W(0, -1110846605, 1032320648, 1027180085, 1029603693) + + W(1, 1033577170, -1112673640, -1118194097, 1027617785) + + W(2, -1144235925, 1030911393, -1134544211, -1123614185) + + W(3, -1143898437, 1000132981, 1031570329, -1119293171) + + W(4, -1126616369, -1129974305, 1019764549, -1102116254) + + W(5, 1058710858, 1058397441, -1096477332, 1018853209) + W(6, 1008325379, 1026769453, 1031557517, -1104852463) + + W(7, -1103611475, 1036639048, 999139301, -1131321177) + + W(8, -1129394727, -1097515304, -1115701158, 1018401637) + + W(9, 997400075, 1008054267, -1131248001, -1123234663) + + W(10, -1119810656, 1024391909, 1024689095, -1118482095) + + W(11, -1120094485, -1106708620, -1134741251, 1017993989); + WS(1058429118, 1064863249); + sum1 = + W(0, 1021156518, 983001563, 1054264097, -1097350840) + W(1, -1175841770, 964768362, 1024394983, -1115666854) + + W(2, 1049468028, -1099725362, 1024539904, -1149024695) + W(3, 1020219616, 1039490386, 1055450440, -1115114453) + + W(4, 997016493, 1012766063, -1131178666, 1046648007) + W(5, -1104196510, -1085827188, 1043203980, 1022718592) + + W(6, 1016100640, 1017911734, 992909240, -1100930382) + W(7, 1033767351, -1136266891, 1007341951, 1043757188) + + W(8, -1104186631, -1128095056, -1119513801, 1035657141) + + W(9, 994206685, -1128564932, -1122765517, -1118903024) + W(10, -1131557236, 1016423590, 964693930, 1045299318) + + W(11, -1105268364, 1023907580, -1106015350, 1029236260); + sum2 = W(0, 1005391535, -1106696811, 1050575955, -1100156814) + + W(1, -1098256564, 1028021126, 1018096716, -1121907467) + + W(2, 1051313221, 1060662591, 1029467086, -1129063320) + W(3, -1135288360, 1026226746, 1047952814, 1068258385) + + W(4, -1142136447, -1131820748, -1121648533, 1031305614) + + W(5, -1081952512, -1074657656, 1051661425, 1008147176) + W(6, 996459166, 1032267559, 1040750694, -1095314974) + + W(7, 1035381379, -1168737402, -1130245220, -1111725659) + + W(8, 1031579134, 1036231973, -1107714686, 1020424408) + W(9, -1123582348, 1028271694, 1007524520, 1044691450) + + W(10, 1022647148, -1129848660, 1033610651, -1108648643) + + W(11, 1034169827, 1044987108, -1100160947, 1024695710); + WS(-1083443454, 998713176); + sum1 = W(0, 1032696047, 1040709994, 1040929033, -1087559501) + W(1, 1049786774, -1146095614, 1026355790, 1040668906) + + W(2, 1032459486, -1103862520, 1037090637, 1033091241) + W(3, 1024354795, 1036398699, 1012490030, -1102928053) + + W(4, 1047072725, 1024780023, 1034252472, 1051748575) + W(5, -1097753826, -1093112676, 1050721065, 1037512365) + + W(6, 1012872363, 1035129883, -1114537329, -1092883854) + W(7, 1039546228, 1024615038, 1032281789, 1044965075) + + W(8, -1100635790, -1099081393, 1011437457, 1037286498) + + W(9, 1027888345, 1031400701, -1103916602, -1104850339) + + W(10, 1009955155, 1036010231, 1016830581, 1048807512) + + W(11, -1098186970, -1112352715, -1114553850, 1033653631); + sum2 = + W(0, 1035861958, -1098289107, 1026686124, -1096172460) + W(1, -1113513064, 1019723703, -1161872500, -1119785106) + + W(2, 1049978705, -1107697817, 1027596044, -1121217732) + + W(3, -1113290777, 1033623622, -1098402027, -1091833397) + + W(4, -1098063812, 1033198374, -1137177342, 1045692473) + W(5, 1024040864, 1013412750, 1031079096, -1107709748) + + W(6, 1034613598, -1106425659, 1053770527, 1046082211) + W(7, 1012376430, 1038124498, -1103597964, -1117971136) + + W(8, -1127968019, 1057075430, -1095279992, -1112843267) + W(9, 1038756242, 1019694879, 1049090628, 1047895771) + + W(10, 1045163433, -1120386622, -1111249467, -1114046628) + + W(11, 1052585151, -1102204197, -1100444173, 1034273086); + WS(-1086369662, -1078015058); + sum1 = + W(0, 1024279387, 1042615374, 1054091094, -1095346029) + W(1, 1050416872, -1113840294, -1100066053, -1106499229) + + W(2, -1113085188, -1103658220, -1111759460, -1141254386) + + W(3, 1039589628, 1049518735, 1050614757, -1097514477) + W(4, 1048966812, 1032485602, -1104719791, -1115604002) + + W(5, -1103236040, -1100854410, -1122281110, -1113439156) + + W(6, -1113174076, -1127523972, 1047781504, -1097175852) + + W(7, 1043919349, -1119980106, -1125885710, 1049389829) + W(8, -1108066658, 1026529231, 1032565272, 1039770777) + + W(9, -1111149795, -1102519338, 1041501469, -1104719494) + + W(10, 1027138593, -1104628175, 1024511623, 1042212335) + + W(11, 1048227542, -1099302313, 1036646913, 1032389542); + sum2 = + W(0, -1092512531, -1098738343, 1063615535, 1009177475) + W(1, -1119750726, 1030476954, -1093473489, -1088925799) + + W(2, 1062426368, 1026425874, 1012050343, -1120184004) + W(3, -1081280020, 1042571962, 1067242406, 998962046) + + W(4, 1025403720, 1031881676, -1076988140, 1043337888) + + W(5, 1066811408, -1096426756, -1129159374, -1116680638) + + W(6, -1081342477, 1033193400, 1066297017, 1022780060) + W(7, 1023044380, -1135563955, -1086556968, 1010020371) + + W(8, 1060290312, 1026166068, -1115355073, 1004442726) + W(9, -1107875638, -1102154130, 1052028857, 1017583668) + + W(10, 1026819560, 946141982, -1121362077, -1126174974) + + W(11, 1037059936, -1119102823, -1127777686, 1034449190); + WS(-1129707456, 1007685382); + sum1 = W(0, -1134894751, -1098519836, 1040671079, 1044073412) + + W(1, -1109530006, -1134057701, 1044154267, 1030394337) + W(2, 1013414869, 1041040503, 1035376874, 1028314315) + + W(3, -1111052786, -1107874844, -1103276809, 1038778991) + + W(4, -1105794628, -1112561176, 1038046773, -1118678129) + + W(5, -1098881194, -1107344299, -1139987723, 992777541) + + W(6, -1192544411, -1111301144, -1110522396, 1048980909) + + W(7, -1108336721, -1112828028, -1128991721, -1115520098) + + W(8, -1107120076, 1052479600, -1112546431, -1132207293) + + W(9, 1035051017, 1015910765, 1033063921, 1049200001) + W(10, 1023468750, 999515194, -1122391156, -1103669035) + + W(11, -1111557603, 1051478546, 1018554845, -1119107128); + sum2 = + W(0, -1137824107, -1110122518, -1137081539, 1039063461) + + W(1, -1158403413, -1124656554, -1126465818, 1033612180) + + W(2, -1106894813, 1047362418, -1117814890, 1023374342) + W(3, 1005362547, -1116868027, 1045165527, 1067526191) + + W(4, -1136640937, -1115663214, -1158497445, 1039739597) + + W(5, -1106604299, 1071589227, 1044031039, -1148955153) + + W(6, -1119770196, 1037998233, -1138568822, 1061860820) + + W(7, -1133800170, -1123862185, 1021074352, -1112420682) + W(8, 1039276731, -1077533661, 1031122886, 999718675) + + W(9, -1138544392, 1025116420, -1104439342, -1073373771) + + W(10, -1106196407, -1139157324, 1034621027, -1120069279) + + W(11, -1113398206, -1094637864, 1031315442, 1025985948); + WS(1033791472, -1138498893); + sum1 = W(0, -1143657507, -1102835756, 1024249065, 1044190455) + + W(1, -1107762844, 1008291608, 1014781903, -1108646231) + + W(2, -1130492804, 1021681616, -1112711792, -1128240816) + + W(3, 1029133201, -1108649138, 1008218246, -1115040338) + + W(4, 1019895480, 1025256893, 1018917100, -1106020223) + W(5, 1054388603, 1058377694, -1123372431, 1014932868) + + W(6, 998381448, 1003669472, -1092207694, 1046387590) + W(7, -1111491159, 1007448080, 1016812674, -1113672010) + + W(8, -1132293500, 1049136345, -1123523050, 1008489644) + + W(9, -1118545247, -1114481905, -1112726231, 1017676194) + + W(10, -1123035739, -1112884042, -1137667330, -1127743919) + + W(11, -1119594899, -1119541597, 1028355707, 1001709096); + sum2 = W(0, 1014470821, -1106657768, 1034825132, 1006830039) + + W(1, -1104684796, -1124459301, -1120344268, -1106292024) + + W(2, 1032219219, -1101139832, -1114556582, 1008940380) + + W(3, -1114330800, 1049926230, 1057813788, -1102461554) + + W(4, -1111886229, 1029827978, -1106002658, 1054743689) + + W(5, 1049962194, -1103958261, 1050373872, -1133852786) + + W(6, 1024999308, -1112305858, 1051810194, -1098680718) + + W(7, 1035894797, -1109427720, -1126273593, -1122403994) + + W(8, 996027236, 1040205712, -1100520246, 1024816377) + W(9, -1127411221, -1116955850, 984340447, -1109277736) + + W(10, 1014102650, -1117160816, -1123975632, 1030827431) + + W(11, -1114551452, -1111240037, -1106040331, 1003623824); + WS(1060089726, 1074996161); + sum1 = + W(0, -1117558175, 1046443391, -1083103171, 1040714346) + W(1, 1044503809, 1023987857, 1029119241, 1039893948) + + W(2, -1093429938, 1021452133, 1030628716, 1027140771) + W(3, -1141503452, 1041448800, -1088988175, 1048946821) + + W(4, 1038933875, 1026874120, 1010789890, 1035829124) + W(5, 1032282738, 1021975771, 1038764813, 1026271340) + + W(6, 1037081758, 1041862066, 1035486030, 1040332065) + W(7, 1032949373, 1034225415, -1120312844, 1028398131) + + W(8, -1142682180, -1090323173, 1041097413, -1113760891) + + W(9, 1027150698, 1038548631, -1111879740, -1112512014) + W(10, 1029165798, 1028642719, 1021223318, 1047369209) + + W(11, -1105296983, -1095359061, 1046714577, -1134282558); + sum2 = W(0, -1130708327, -1131662151, 1027052068, -1104634511) + + W(1, 1037500532, -1117309872, -1156760442, -1160974837) + + W(2, -1119116140, -1148640061, 1028521640, -1132259207) + + W(3, 1011385503, -1122121264, 1006726095, -1101053828) + + W(4, 1041142688, -1129219511, 1005458237, -1104012424) + + W(5, 1053197196, 1050251696, -1121651972, -1148190653) + + W(6, 1015786967, 1025508020, -1150821434, 1043632028) + + W(7, -1105814552, 1005943453, -1121500080, -1106371091) + + W(8, 1032166230, -1115585403, -1117076340, -1120252400) + + W(9, 1023017975, 1032453110, -1116451706, 1032061998) + + W(10, -1120517680, 1024831312, 1008927007, -1107217673) + + W(11, -1143126685, 1045664978, -1103126409, -1126349911); + WS(-1081408895, 1057237802); + sum1 = + W(0, 1016592219, 1050393725, -1096948620, -1099121222) + W(1, 1042338077, 1026859007, -1135569700, 1025037351) + + W(2, 1021729271, -1114451665, 1033766733, 1023688209) + W(3, 1019913045, 1042967287, -1123436299, -1104931659) + + W(4, 1036822635, 994107237, -1134722237, 1042881918) + W(5, -1107250293, -1092679092, 1042265522, 1017621813) + + W(6, 1020337237, 1033060699, 1047123275, -1098053310) + W(7, 1043883210, 1033354815, 1019971573, 1038993285) + + W(8, 1037602588, -1091584672, 1042862441, -1147819555) + W(9, 1015924209, 1028206140, 1034435092, -1092984777) + + W(10, 1029491668, 1035642823, 1027236154, 1041649576) + W(11, 1044331459, -1089381821, 1042007901, 963919445); + sum2 = W(0, -1127968320, -1092240358, 1057542400, 1016463192) + + W(1, -1094079665, 1037438732, 1036537032, 1030963640) + + W(2, -1105653780, -1097383073, 1040975890, 1019305024) + + W(3, -1112917417, -1097473768, 1053316325, 1038201480) + + W(4, -1101066411, 1028884816, 1020801080, -1109029546) + W(5, 1058712288, 1052867895, 1013027424, 1010261952) + + W(6, 1019615648, -1116583352, 1043894648, -1123129572) + + W(7, -1118015492, 1027371024, -1127208552, 1028578068) + + W(8, -1093453186, -1141347136, -1117505000, -1113360113) + + W(9, 1023589392, -1113404853, 1034405836, 1006791808) + + W(10, -1111557726, 1034904608, -1121416948, 1041090246) + + W(11, -1094394128, 1037486484, 1044943944, -1104647878); + WS(-1076745215, 1064070508); + sum1 = + W(0, 1019383636, 1043437193, -1100863080, 1019299111) + W(1, 1041928012, 1018313975, -1138649581, 1030286820) + + W(2, 1033675388, 1027453406, 1031909515, -1136380470) + W(3, 1029667879, 1040316179, -1102225484, -1110289513) + + W(4, 1043406276, 1026991539, -1127653591, 1048543741) + + W(5, -1084687593, -1082029409, 1044625233, -1136351578) + W(6, 1027426151, 1029763954, -1111626052, 983973284) + + W(7, 1044339921, 1027257018, 1022926189, 1039947283) + W(8, 1026499316, 1031954367, 1039879984, 1022902273) + + W(9, 1004012708, 1025479577, -1122995300, -1118301831) + W(10, 1022733729, 1026798858, 1016119660, 1041368223) + + W(11, 1026134601, 1016553765, 1012331970, 1027440187); + sum2 = + W(0, -1131696089, 1012459087, -1112347233, 1039451269) + W(1, -1158657302, -1129595249, 1008718823, -1135045027) + + W(2, -1125420309, -1110618065, 1007247903, 999949222) + W(3, -1149188438, -1118135053, 1041969824, 1024383435) + + W(4, 1015365577, -1130814181, -1140198251, 1033739972) + W(5, 1052325325, 1052741682, 1034080133, -1140370763) + + W(6, -1129603953, -1142742214, 1029891118, -1121721953) + + W(7, -1110453303, 1020979581, 1007479839, 1015462815) + + W(8, -1120072309, -1095903036, -1162307222, -1132990667) + + W(9, -1141563590, -1126906553, 1017890385, -1105015368) + + W(10, -1122346803, 1008938691, 1018622169, -1135479163) + + W(11, 1016803437, -1098230278, 1021342643, -1137891195); + WS(-1094563452, 1051169575); + sum1 = + W(0, -1154622990, 1018130713, 1040428881, -1120902330) + W(1, -1113835211, 1019319877, 1029393378, 1035203109) + + W(2, 1032896399, 1039535746, 1021002107, 1036762426) + W(3, -1117775501, -1113234793, 1049040808, -1102863965) + + W(4, -1107942972, -1135300966, 1033996553, -1106127031) + + W(5, -1112183035, -1090463816, -1105904891, 1040237135) + + W(6, -1136342582, -1114335628, 1048012112, 961094679) + W(7, -1148767576, 1032716400, 1018491963, -1112874623) + + W(8, 1044702279, -1098092733, -1124337998, -1137189022) + W(9, 1032030382, 1023872671, 1032915973, 1033184663) + + W(10, 1006151100, 1037223880, 1015760954, -1110067034) + + W(11, 1035998904, 1029109433, -1110631596, 1013167238); + sum2 = + W(0, 1028413027, -1121092135, 1017337743, -1137632446) + W(1, 999930971, 1027578971, -1120070369, -1130520759) + + W(2, 1037177446, -1104029390, 1033133092, -1114678191) + + W(3, 1012563150, -1120753460, -1106734706, 1048794348) + + W(4, -1111694827, 1030530567, -1111535757, -1097640928) + + W(5, 1051800696, 1050145982, 1041394994, -1119592910) + W(6, 1011962278, -1098008778, 1035782812, -1114477541) + + W(7, -1118971109, 1001961835, 1009477102, 999766235) + W(8, -1106510696, 1047938812, -1127041263, 1024176823) + + W(9, -1153318262, -1122757360, 1010623246, -1111017918) + + W(10, 1020162151, -1115486877, 974823129, -1129371381) + + W(11, 1028214977, -1123769252, -1124747017, 1007999422); + WS(1057759166, -1088449289); + sum1 = + W(0, -1129635066, 1044873994, -1087389198, -1116302487) + W(1, 1048786726, 1017011581, 1025446574, 1037627635) + + W(2, -1097118359, 1022204225, 1039292653, 1021371937) + W(3, -1144519245, 1041685209, -1089578865, 1022125102) + + W(4, 1045860709, 1025212662, 1017539549, 1033910011) + W(5, -1129568803, -1105345911, 1045748274, 1031878029) + + W(6, 1026395242, 1039651930, 1010566389, -1122366800) + W(7, 1027479143, 1013486066, -1122678010, 1035038013) + + W(8, 1030050103, -1097803608, 1033498658, 1007580942) + W(9, 1025431320, 1039320958, -1110122707, -1119554634) + + W(10, -1161253492, 1028360045, 1024557433, 1038868536) + + W(11, -1112614790, -1126568107, 1010965710, 1015223035); + sum2 = + W(0, -1162281894, 1033992046, 1042856153, 1038465062) + W(1, -1093956780, 1024284423, -1124547002, -1149048922) + + W(2, 1036788056, 1046094595, -1100316514, 1035682376) + W(3, -1150111187, 988741862, -1112557119, 1060179844) + + W(4, -1090501223, -1122577303, -1135956229, -1132541637) + + W(5, -1097406101, 1049669935, 1022378118, -1113139255) + + W(6, -1145634890, -1132011310, -1121853795, -1101657128) + + W(7, 1045140163, -1130855582, 965409433, 1024739191) + W(8, -1104384368, 1042681611, -1121116299, -1118824057) + + W(9, -1123274137, 1008671821, 1032013500, -1111116605) + + W(10, 1035479824, 1006161754, 1024679583, -1129294934) + + W(11, -1147059498, 1027020519, -1131272734, -1124922046); + WS(-1086987838, -1100233980); + sum1 = + W(0, 1015308459, 1041765192, -1105415847, 1042444900) + W(1, -1111075669, 1003799483, -1122325985, 1028094431) + + W(2, -1114108890, 1041449686, -1106140165, 1034767973) + + W(3, -1116672610, 1042485054, -1092596043, 1049087917) + + W(4, -1110170951, -1144225139, 1032904116, -1118546351) + + W(5, 1046690691, -1128556841, 1034284768, 1033288361) + + W(6, -1141168915, -1118052589, 1054244345, -1089307961) + + W(7, 1026589088, 1010481109, 1033123257, -1116818498) + W(8, 1049735534, -1094503991, 1030527932, -1121578684) + + W(9, 1001375875, 992241989, 1040724504, -1104029377) + W(10, 1008796465, 1030765989, 1015833828, 1015146386) + + W(11, 1041637233, -1100869156, -1123717612, -1124977133); + sum2 = W(0, -1128145157, -1100557855, 1057648426, 1048654145) + + W(1, -1122215769, -1133425768, 1026284201, -1106810438) + + W(2, 1054522141, 1057115188, -1103409060, 1017140792) + W(3, 1012811840, 1042787919, -1098531848, 1046636853) + + W(4, 1046426252, -1118227807, -1136599052, 1044596046) + + W(5, -1073275189, -1074262745, 1035358469, -1143532160) + W(6, 992541697, 1038174685, 1061008073, 1044984510) + + W(7, 1036107748, 1016191398, 1011005728, -1104618112) + W(8, 1059653331, 1060082709, -1104639697, 981079778) + + W(9, -1127430370, -1166127490, 1035655860, 1034192337) + + W(10, -1130597644, 1006837720, 995789721, -1116633305) + + W(11, 1017274260, 1033697834, -1112828961, 1021901152); + WS(-1092446204, 989212831); + sum1 = + W(0, 1007124942, 1048125124, -1138101793, -1141178857) + W(1, -1102978326, 1034583667, -1116778591, -1131432602) + + W(2, -1106585464, 1019782926, -1115311760, 1015089582) + W(3, 1027403088, 1042237585, 1016240146, 1036610823) + + W(4, -1110971902, 1027127900, -1121715541, -1138060917) + + W(5, 1037962972, -1101006449, -1114322839, 1008360193) + W(6, 1019921952, 1027977243, 1053191424, -1094792341) + + W(7, 1031189102, 1028625507, 1020332096, -1126238792) + W(8, 1053622732, -1089064867, -1137835047, 1017386452) + + W(9, -1139218425, -1131884420, 1043276755, -1101892348) + + W(10, -1132849129, 1009465805, 1020381759, 1024321015) + + W(11, 1049124886, -1107274751, -1110951117, 1008208785); + sum2 = + W(0, -1120159352, -1088595541, 1060560783, 1061831343) + W(1, -1089452071, -1101640393, -1125980662, 1050146519) + + W(2, -1093128727, -1098317152, 1042347964, 1038452583) + + W(3, -1131578305, -1090859444, 1057304640, 1057012981) + + W(4, -1095995319, -1105624394, 1028063854, -1107336769) + + W(5, 1071289406, 1069689231, -1096815763, 1041229675) + + W(6, 1021975879, -1105868965, -1087527230, -1097221007) + + W(7, -1104502319, 1037791301, 1033612769, 1041431951) + + W(8, -1086794372, -1086042421, 1049524493, -1143180172) + + W(9, -1119579693, -1112749441, 982969010, 1033122226) + W(10, -1104150062, 1029453052, 1040487308, 1042279365) + + W(11, -1089785065, -1088997285, -1135764460, 1049121852); + WS(-1080642303, 1037515653); + sum1 = + W(0, 1014399585, -1123461796, -1115821917, 1037702505) + W(1, -1105260875, -1134503912, 1040389217, 1009459592) + + W(2, -1138501592, 1046330151, -1113097082, 1032999462) + + W(3, 1025436037, -1118449912, 1046808963, -1088063230) + + W(4, -1166545913, 1011659972, 1035628117, -1111999897) + W(5, 1046961203, 1048171302, -1112931778, 1033647146) + + W(6, 1032176658, 1042449564, -1085801589, 1046621083) + W(7, -1116953058, 1020514160, 1019714410, -1098862637) + + W(8, 1042823052, 1033619294, -1108126015, 1023868127) + W(9, 1031481267, 1015874414, 1032561937, 1017602698) + + W(10, 1033606503, 1030447848, -1129425897, -1108656118) + + W(11, 1022709518, -1172911161, -1161936349, 1015791986); + sum2 = + W(0, -1139497271, -1104932637, 1000924601, 1034980171) + W(1, -1102656208, -1154378706, 1025910769, 1043978669) + + W(2, -1116100213, 1042493673, 1038409695, 1025837919) + + W(3, -1105297083, -1105480129, -1102785010, 1044002411) + + W(4, -1098474508, -1109802618, 1037339247, 1037617885) + W(5, 1049988969, 1050036780, -1122964745, 1036616991) + + W(6, -1111547600, -1107402541, 1045831134, 1039942071) + + W(7, -1106907325, -1132149525, -1123186639, -1105522985) + + W(8, 1040977948, -1097804729, 1028039731, -1111839940) + W(9, 1029488041, 1011577705, 1036894407, 1042714488) + + W(10, -1112976714, 1040500443, -1137152287, -1102258444) + + W(11, 1025599417, -1139888185, -1112698813, -1114191023); + WS(1060124606, -1084472548); + sum1 = + W(0, 1012638700, -1112711971, 1024524352, 1032623962) + W(1, -1115629480, 1027484509, -1131934189, 1021193865) + + W(2, 1017460401, -1117271615, 1023262959, -1157409515) + + W(3, -1129347279, -1125331574, -1113956442, 1049120342) + + W(4, -1108495481, 1010910287, -1138043955, 1048955067) + W(5, -1094951982, 1015143283, 1031640934, 1021584239) + + W(6, 1007380511, -1106488069, 1048203795, -1110142007) + + W(7, -1129214986, -1144904917, 1022374575, -1115361884) + + W(8, 1005249701, 1024310560, -1136673413, 1017598403) + W(9, 996895579, -1120058426, 1026650437, -1121731240) + + W(10, 1017029987, -1145343061, 992489843, -1118477310) + + W(11, -1129456851, 1036683482, -1115998674, 1014521967); + sum2 = + W(0, -1113301049, 1041723134, -1119425470, 1012563935) + W(1, 1013366251, -1135264199, -1129519836, 1018887182) + + W(2, -1123219625, 1021107126, -1131491053, 1017265018) + + W(3, -1113144608, 1065721494, -1082046556, 1032971141) + + W(4, -1132479565, -1135106943, -1114997262, 1081282167) + + W(5, -1068115046, -1092304788, 1028331651, 927030725) + W(6, 1028189537, 1053752802, -1091841582, -1120681827) + + W(7, 1021570574, 983594844, -1144798799, 1004635839) + W(8, -1126716683, 1026059029, -1132445755, -1137356791) + + W(9, -1135227415, 1024321495, -1149813598, 992723582) + W(10, 1010781703, 959859164, -1123606042, 1032429021) + + W(11, -1137534547, -1121765421, 1024141029, -1123588459); + WS(1064307390, 997943845); + sum1 = + W(0, 1016504192, -1110031838, -1108555962, 1047561626) + W(1, -1114174882, 1004953741, 1004931163, -1124632947) + + W(2, -1129767067, 1003984285, 1017992857, 1018940039) + W(3, 1001468389, -1106796660, -1106350773, 1053522405) + + W(4, -1106382906, 1000370245, -1125536771, -1132488742) + + W(5, -1097456765, 1050670238, -1136221548, 1015934681) + + W(6, 1024701821, -1111862756, 1040312105, -1128004006) + + W(7, -1123896954, 1011062590, -1157300426, -1111316170) + + W(8, -1110123941, 1039422954, 1020844396, -1128259885) + W(9, 1008115882, -1153319146, 1030600762, 1005773541) + + W(10, 1015300557, -1153739770, 1014991280, -1116314499) + + W(11, -1109063375, 1042190650, 1024320647, -1130969505); + sum2 = W(0, 1036505224, -1100095598, 1039944480, -1110028565) + + W(1, 1016119595, 1017378303, 1018720963, -1119632397) + W(2, 1033659023, 1025734363, 1015545311, -1126149289) + + W(3, 1037554666, -1082101932, 1064933062, -1103479495) + + W(4, 1036578506, 1022196513, 1035136259, -1072130218) + W(5, 1074634461, 1012777017, 1036162128, -1118704038) + + W(6, -1131720942, -1090292986, 1057038142, -1132873326) + + W(7, -1120419990, 1020047721, 1012123245, -1114842502) + + W(8, 1046242606, -1117820012, -1115011900, 1033886326) + + W(9, 1027168757, -1108983905, 1018437263, -1117294599) + + W(10, 1004277346, -1136709697, 1024471767, -1105383800) + + W(11, 1041395450, 1033191694, -1113427773, 1024978781); + WS(1053812476, -1113586226); + sum1 = W(0, -1130399840, -1111011390, 1007197394, 1037708373) + + W(1, -1122978308, -1139049030, 1028349447, -1120416825) + + W(2, -1105796643, 1044272829, -1110423782, -1125249991) + + W(3, 1021963321, -1107941440, 1056809437, -1093131829) + + W(4, -1122097703, 1011721762, -1121520129, -1106086226) + + W(5, 1046348585, 1057081835, -1099751719, -1114497366) + + W(6, 1020769785, -1129958415, -1090756230, 1059679544) + + W(7, -1102044582, 1018253471, -1115853964, -1107644952) + + W(8, 1050300257, -1119895572, -1111488955, 1022041005) + + W(9, 1021860117, -1122155502, -1116443513, 1040260199) + + W(10, 1019054925, -1121197023, -1121122124, -1114352785) + + W(11, 1041113720, -1110926804, -1156322407, -1135672898); + sum2 = + W(0, 1015672618, 1010541588, -1115998566, 1020421847) + W(1, -1129704409, 1015113530, -1121994623, 1032866568) + + W(2, 1011616452, -1095022641, 1020628925, 1017019595) + + W(3, -1149412980, 1044676778, -1107438884, -1097106911) + + W(4, -1112769863, 1022483811, -1127744422, -1124040172) + + W(5, 1058620442, 1015017230, -1113422252, 1015061518) + W(6, 990134373, -1102290659, 1049322309, -1104275347) + + W(7, 1039268635, -1114030797, 1024671460, 1029499881) + W(8, -1104592911, 1045525693, 1026741584, -1136765715) + + W(9, -1132259460, -1120084193, 1035840939, -1119993661) + + W(10, 999745387, -1131682952, -1125579600, 1001699435) + + W(11, -1123886068, 1037165892, -1126762930, -1134246014); + WS(1059863230, -1098226968); + sum1 = + W(0, -1111154474, -1130042625, -1124092147, -1126659421) + + W(1, -1116454602, -1109234699, 1033627108, 1044463840) + W(2, -1125693093, 1045974478, 1040744732, 1026252457) + + W(3, -1111220881, -1098768819, 1043860042, 1040108899) + + W(4, -1149847241, -1103478147, 1018934285, 1036585799) + + W(5, -1094381437, -1098844542, 1043775752, -1107008620) + + W(6, -1156119577, 1041677635, 1034781361, 1051479065) + + W(7, 1046003792, -1127254569, -1108034825, -1100472134) + + W(8, 1038465479, -1096809363, -1121805723, -1105262391) + W(9, 1035708952, 1038444026, 1027036095, 1040658808) + + W(10, 1037992790, 1038964162, -1116166225, -1111999396) + + W(11, 1019243847, 1003830125, -1131289879, -1116821910); + sum2 = + W(0, 1031860762, 1008804487, 1036033743, -1130814575) + W(1, -1114717025, 1042429978, -1114215534, -1119320351) + + W(2, -1105317049, -1126605754, -1103884858, 1019583714) + W(3, 1037917300, 1028769566, 1033869945, 1029943513) + + W(4, -1097519272, 1050527129, -1123072391, -1145928741) + + W(5, -1104666827, 1058632863, -1084821476, 1057878257) + + W(6, -1121765219, -1118791492, -1103277106, 1010033985) + + W(7, -1091781337, 1047090522, 1036233577, 1035112755) + W(8, 1043081028, 1033184724, -1108906997, 1050006554) + + W(9, -1113082189, -1119166399, -1110309063, -1124066564) + + W(10, -1105454190, -1116436299, 1007761049, 1034891236) + + W(11, 1003334201, -1146667244, -1124982586, 1037673833); + WS(1053829756, -1108691549); + sum1 = + W(0, 1014621415, 1034972923, -1105089900, -1121242915) + W(1, 1024842558, -1125107735, -1117035633, 1031518451) + + W(2, -1146432572, 1011744694, -1195363583, 1024600093) + + W(3, 1017668333, 1028891034, -1111069516, -1099260407) + + W(4, 1035963185, -1111257697, -1121088251, 1043029617) + W(5, 1052288956, -1096216885, 1043236853, 1022444749) + + W(6, -1113943163, 1037608353, 1043183409, -1109446679) + + W(7, -1104376301, 1008767270, 1027915142, -1118505878) + W(8, 1040529537, 1033001703, -1110826184, 983774736) + + W(9, -1117882340, 1008280866, -1127832039, 1023717270) + + W(10, -1108863440, 1021787123, 1018110476, -1114328254) + + W(11, 1025673432, 1038283409, -1136644866, -1122279626); + sum2 = W(0, 1011466728, -1153535168, -1121363658, -1113493290) + + W(1, 1016979229, -1121975877, -1128158188, -1133074596) + + W(2, -1108077390, 1031842286, -1114077565, 1032726750) + + W(3, 993685376, -1111924694, 1048370655, -1096696142) + W(4, 1032702600, -1126878203, 1021341187, 1041916532) + + W(5, -1088803436, -1097359431, 1051606360, 1020447303) + + W(6, -1125064327, -1115375045, 1050909934, 1066069354) + + W(7, -1108957150, -1115472084, 1016637363, -1111577830) + + W(8, 1048268187, -1102058354, -1106393780, 1011253904) + + W(9, -1135616946, -1121861231, 1028734454, -1112810542) + + W(10, -1104652034, 1032484333, -1142265296, -1139232914) + + W(11, 1033829714, -1108918948, -1124153420, -1135690267); + WS(1043379192, -1131322837); + sum1 = + W(0, -1129021027, -1109595831, 1033800339, 1042153991) + W(1, -1099711038, 1026187331, -1148980502, -1141769560) + + W(2, 1040943040, 1016895818, 1029537886, 1023917269) + W(3, -1117253390, -1131540259, -1099641090, 1040857522) + + W(4, -1104535414, 999787984, 1015261926, 1038059198) + W(5, 1019360940, -1103092216, 1032384358, -1137467256) + + W(6, 1024719214, 1043151230, 1047704456, -1091529984) + W(7, 1043292971, 1021851650, -1130947836, 1040366611) + + W(8, -1120007803, -1100986498, 1031568104, -1117455240) + W(9, 974083843, 1036650848, 1032688054, -1116706574) + + W(10, 1019020464, 1021119266, 1010796022, 1032003186) + + W(11, -1135300928, -1114490317, 1026900536, -1124200964); + sum2 = + W(0, -1127801857, 1028175283, -1129802997, -1133354170) + W(1, -1129332011, 1029358411, -1143073539, 1010285366) + + W(2, 1022418743, -1111757330, 1032847739, -1119713292) + + W(3, -1106914355, 1045024365, -1109183829, 1035388549) + W(4, 1028119663, 984677997, -1114698807, -1107796176) + + W(5, 1055188047, -1099199714, 1027769667, -1126683209) + + W(6, -1129241721, -1093181393, 1060464193, -1108056884) + + W(7, 1015260775, -1117802232, 1034854605, -1094857339) + W(8, 1038631095, 1042537531, -1123722407, 1025618013) + + W(9, 1015357631, -1104001534, 1035894131, 1019867695) + + W(10, 1021694327, -1116557581, 1026781991, -1106206681) + + W(11, -1121422795, 1010545294, -1120402439, 1021478623); + WS(1049844732, -1121310639); + sum1 = + W(0, 1023733410, 1044402267, 1053233309, -1096212219) + W(1, 1051767783, -1114613442, -1099209689, -1106734859) + + W(2, -1108848000, -1103164857, -1109302031, -1129199659) + + W(3, 1040893204, 1050332331, 1049912979, -1099336615) + W(4, 1050917291, 1033787229, -1102957277, -1111686974) + + W(5, -1098618899, -1097562740, -1121562509, -1111886543) + + W(6, -1114244983, -1122456058, 1048539349, -1096335583) + + W(7, 1042792075, -1121890370, -1136674298, 1049981942) + W(8, -1111429758, 1033031043, 1039550692, 1041151474) + + W(9, -1108461358, -1102278760, 1039273110, -1102589972) + + W(10, 1008842338, -1104020956, 1021220348, 1043895987) + + W(11, 1048170180, -1101337719, 1041281742, 1031699907); + sum2 = W(0, 1051830333, 1040398919, -1088812275, -1112895824) + + W(1, 1030823820, -1120174945, 1052363768, 1056364330) + + W(2, -1088095023, -1128031249, -1126124865, 1022839272) + + W(3, 1062286287, -1105094784, -1083945825, -1110939052) + + W(4, -1131257287, -1113476028, 1068323273, -1117763636) + + W(5, -1086712736, -1122350162, 1034881723, 1031923437) + + W(6, 1062941652, -1117097644, -1085128967, -1107088013) + + W(7, 993374262, -1149114843, 1058036233, -1135317262) + + W(8, -1090471655, -1117471490, 1022005418, -1131972943) + + W(9, 1038399576, 1045469136, -1096613184, -1128774604) + + W(10, -1124473506, 1015689530, 1029358050, -1127713443) + + W(11, -1118175248, 1023889083, 1006015479, -1114795832); + WS(997080576, -1130763300); + sum1 = W(0, -1113905570, -1121320815, 1038521748, 1025325853) + + W(1, -1108459484, -1123369669, 1030153879, -1108108727) + + W(2, 1032364321, -1131460303, -1152289285, -1111143084) + + W(3, -1117230256, -1100762033, 1051702873, 1040312882) + + W(4, -1099800679, 1018134009, -1152616277, -1090117932) + + W(5, 1069923213, 1063008042, -1092045374, -1116551136) + + W(6, -1146808706, -1109500574, -1104049339, 1056019095) + + W(7, -1100849447, 1015899783, -1112646432, -1102311764) + + W(8, 1028696893, -1115439812, -1105934578, -1120248394) + + W(9, -1186209359, -1119610882, -1120830317, -1125581089) + + W(10, 1028735898, -1113190874, -1120216576, -1099135446) + + W(11, 1030578386, -1116447004, -1108771165, -1120342084); + sum2 = + W(0, -1130955153, 1025142055, 1025405091, 1041203911) + W(1, 1034798579, -1107186683, -1115062100, 1033634795) + + W(2, -1124058081, -1151569099, -1098708869, 1041850582) + + W(3, -1114768924, -1114031272, 1047530952, -1160505239) + + W(4, 1048498835, -1097808347, 1040485485, -1115074190) + + W(5, -1104495565, 1065129660, -1095909934, 1045395705) + + W(6, -1102247365, -1110799922, 1038913214, -1115442088) + + W(7, -1105078519, -1106337339, 1040365390, 1039570131) + W(8, -1102056033, 1037120419, 1024518769, 1007217475) + + W(9, -1105380703, -1112489130, -1123724877, -1145632358) + + W(10, -1109649658, -1152795787, -1134789779, 1035629875) + + W(11, -1104428707, 1035843769, -1117935125, -1124566009); + WS(-1078383103, 1059446981); + sum1 = + W(0, -1139864362, -1142609202, -1105667544, 1048881003) + W(1, -1110989208, 1019807480, 1022304576, 1008862865) + + W(2, -1100327790, 1047898440, 1029966423, -1128249884) + + W(3, -1117916615, -1109139429, -1098424968, 1053051896) + + W(4, 1023833874, -1114518074, 1007335089, 1032501274) + W(5, -1089810345, -1104044598, 1040575921, 1013296733) + + W(6, -1119884647, 982044231, 1033240873, 1051763270) + W(7, -1114053146, -1110353213, 1022280942, -1115332063) + + W(8, 1049118183, -1113330784, 1041606896, -1126749570) + W(9, 1023668405, 991223187, -1140016273, 1027424455) + + W(10, -1122699729, 1021514772, 1034312731, -1102309771) + + W(11, -1110413061, 1032557738, 1041157596, -1121516731); + sum2 = + W(0, -1143648694, 1050457027, -1090901428, -1095258955) + W(1, 1047388223, 1034828442, 1022767513, -1104882348) + + W(2, 1017677825, -1116653154, -1125154789, -1149114774) + W(3, 963325627, 1052893834, -1090554669, 1030383529) + + W(4, -1114292033, 1040557770, -1138915747, -1122824043) + + W(5, 1048412513, 1063122641, -1118207917, 1005930742) + W(6, 1040530304, 1019582897, -1101863176, -1089352859) + + W(7, 1048190601, 980397999, 1031585165, -1094902239) + W(8, -1104950416, 1057380402, -1102824630, 1033506230) + + W(9, 1008260859, -1113748748, -1120605391, -1106433792) + + W(10, 1038107916, -1115355457, -1120690652, -1090635807) + + W(11, 1056780417, 1049388154, -1104842210, -1136517107); + WS(-1104952056, -1073278929); + sum1 = W(0, -1144211169, -1099507218, 1047627264, 1043300637) + + W(1, -1098196346, 1030331294, 1031125659, -1116651974) + + W(2, -1113308557, 1037274304, -1126577137, -1122667056) + + W(3, -1121100585, -1101060075, 1054491321, -1102367022) + + W(4, -1102852173, 1026346581, -1142367854, -1105066053) + + W(5, 1039149624, 1051689271, -1106731162, -1120693369) + + W(6, 1025675017, -1131576359, -1106626380, 1044811828) + + W(7, -1111689619, 1018492983, -1114298540, -1114707952) + + W(8, 1042584197, -1128472513, -1126957444, -1140414731) + + W(9, 1036563163, -1120605819, -1128818827, 1045578618) + + W(10, 992521004, -1128018583, -1122834968, -1111900952) + + W(11, 1039018645, -1115669626, 1025441875, 997033420); + sum2 = + W(0, -1117577133, 1036324905, 1012676607, -1164734594) + W(1, 1039853902, -1110394349, -1139616023, -1124977156) + + W(2, -1115101040, 1032695755, -1116113854, 1006188424) + W(3, 997820975, -1120808104, 1041273688, 1041759226) + + W(4, 1041255405, -1120661488, 1028627780, -1109376562) + + W(5, 1049990275, -1096754642, -1106762918, 1033535767) + W(6, -1114909048, 1029259135, 1043064430, 1041324783) + + W(7, -1111929038, 1021759445, 1032747040, -1145526876) + W(8, 1039154681, -1094055114, 1025837595, 1023476809) + + W(9, -1116006677, 1022442689, 1027909669, -1098711698) + + W(10, -1130147608, -1133986843, 1030832637, 983753970) + + W(11, -1115224952, 1023440264, -1112181665, 1029342490); + WS(1057403966, -1096678293); + sum1 = W(0, 1015545167, -1133819725, 1037006758, -1110196161) + + W(1, -1111752718, 1028708905, 1013920108, -1127594402) + + W(2, -1136130453, -1123399563, 1041684833, -1119121787) + + W(3, 1030182836, 1031500952, 1042283546, -1086200264) + W(4, 1047364560, -1120221088, 991347091, -1107540753) + + W(5, 1040431359, 1060132444, -1104881213, 1006406689) + W(6, 1031028372, 1042502792, -1084295706, 1049379651) + + W(7, -1113607001, 1002061113, -1130110920, -1120427420) + + W(8, 1042737160, 1001749345, -1117219726, 1026883950) + W(9, -1137745417, 1023814022, 1019878434, 1023472436) + + W(10, 1017968636, -1124476270, -1127755335, -1113612941) + + W(11, 1042334622, -1123659840, 1008021369, 1011156129); + sum2 = + W(0, -1178786588, -1129322914, -1116170217, 1036181740) + W(1, 1016863918, -1132924585, 1027650789, -1117835702) + + W(2, -1106357388, 1050236879, -1107702296, -1127926494) + + W(3, 1004569898, -1120140062, 1012300621, 1029537087) + W(4, -1115347042, 1007741857, 1010647389, -1110565129) + + W(5, 1051050908, -1121260831, 1019718506, -1147888890) + + W(6, -1130907066, 1046200355, -1094299123, -1105419536) + + W(7, 1018471790, -1122466004, -1128412421, 1035331810) + + W(8, 1038925264, -1104188032, 1035623426, -1132432621) + + W(9, 1000455394, 1040609034, -1110352470, -1148832482) + + W(10, 1031812039, -1132484471, 1019136642, -1114775527) + + W(11, 1028674911, 1009994365, -1129304944, -1146317634); + WS(1056335484, -1129697442); + sum1 = W(0, -1118615510, 1026825265, -1102686619, 1045269336) + + W(1, 1031523962, -1140818205, -1123816285, -1162479083) + + W(2, -1175208362, -1122870505, 1025178018, -1112741005) + + W(3, 1016357093, -1123245334, -1112742573, 1056143939) + + W(4, -1115481871, 1004860403, -1126548591, -1115166368) + + W(5, 1012633705, 1022501065, -1098786498, -1121817826) + W(6, 1017679973, 993334229, 1048503365, 1044007618) + + W(7, -1107348056, -1134864917, -1125007109, 1009460392) + + W(8, -1110640192, 1043433395, -1104721331, -1142571619) + + W(9, -1130509569, -1117686884, 1010107581, 1037226473) + + W(10, -1124234681, -1120701013, -1127256452, -1110259820) + + W(11, 1008538193, 1040188728, -1112073470, 1004599859); + sum2 = W(0, -1140731697, -1126783010, 1035005186, -1110815467) + + W(1, -1144657885, -1127206230, 1018164054, -1144859189) + + W(2, 1011714049, 1039236492, -1130754383, -1146205013) + + W(3, -1116322329, -1148034885, -1112384840, -1109778149) + + W(4, -1113329105, -1113225660, 1033668632, -1111621890) + + W(5, 1057652336, 1053123628, -1107649638, 1012470213) + + W(6, -1110091010, 1034430751, -1103655808, -1113563636) + + W(7, -1112793157, -1113811608, 1006827755, -1133278289) + + W(8, 1035575897, 1009902097, -1136830370, -1126431906) + + W(9, 1024608202, -1134565598, 1007536733, 1031837967) + + W(10, -1131576514, 1007646275, 978878091, -1106732021) + + W(11, 1017810394, 1032913014, -1118754368, -1123083034); + WS(1064654654, 1035088379); + sum1 = W(0, -1123150274, -1101065371, 1052021669, 1034671630) + + W(1, -1103122974, -1124628232, 1013730923, -1104968795) + + W(2, 1043838624, -1116995686, 1025043295, -1123853974) + + W(3, -1124984926, -1104298005, 1050953841, -1125221929) + + W(4, -1102292982, -1122875259, -1143080352, -1097917367) + + W(5, 1053857683, 1053311748, -1101557747, -1129945790) + + W(6, -1115541655, -1115560637, -1098028717, 1054064059) + + W(7, -1102206963, -1115475969, -1120446591, -1112072243) + + W(8, -1118042236, 1056948345, -1099829586, 1010096420) + + W(9, 1019709882, -1121553409, -1117850604, 1047317764) + + W(10, -1123986585, -1120157778, -1123168830, -1101025669) + + W(11, 1024509393, 1051915779, -1105952782, 1010117900); + sum2 = + W(0, -1115290116, -1109338596, 1052546267, -1101682429) + W(1, -1106866549, 1027635895, 1036300391, -1120873277) + + W(2, 1031940424, 1045633640, -1121551223, 1021591180) + + W(3, -1109664288, -1133763869, 1041363997, -1094977574) + + W(4, 1008614181, -1119215823, 1023887773, -1110763968) + W(5, 1046589307, 1050150667, -1110488084, 1009099129) + + W(6, 1031338337, -1104363651, 1038758869, -1104681827) + + W(7, -1120223295, 1016354897, -1112746552, -1111086518) + + W(8, 1026186944, -1121584221, 1035823152, -1115537942) + W(9, 1029647363, 1014654409, 1011886363, 1042076972) + + W(10, -1111033402, 1012736237, -1123357025, -1113327782) + + W(11, -1114411312, 1033926660, 1046305164, -1109553196); + WS(-1088190206, -1108558078); + sum1 = W(0, -1109712467, 1048826552, -1117596347, 1045129740) + + W(1, -1145103958, 1040739958, 1034096473, -1100191472) + + W(2, -1104233509, 1021528052, 1015098342, -1095362037) + + W(3, -1111610193, 1051587686, -1112703594, -1123092480) + + W(4, 1033306871, 1043699492, -1111503908, -1114238856) + + W(5, -1118548075, 1045282957, -1105600408, -1112734841) + + W(6, 1029528067, -1124911644, -1094857227, 1041941490) + + W(7, -1116887040, -1106244021, -1109918121, 1053388852) + + W(8, 1040678692, -1121835291, 1043572363, 1044475255) + + W(9, -1130336610, -1101598429, -1102065648, 1050563972) + + W(10, -1101594283, -1100499697, -1110290409, 1049826386) + + W(11, -1108498290, 1032628503, 1041251987, 1015959598); + sum2 = W(0, -1140036524, 1033121292, 1020537037, -1094559771) + + W(1, 1042598592, 1048560917, -1122134368, -1135675176) + + W(2, -1102563608, -1090683436, 1049536131, 1043095342) + + W(3, -1124742331, 1022385651, 1017232470, -1089829937) + W(4, 1015761873, 1060516603, 1023368729, 1037868584) + + W(5, -1097085277, -1081905013, -1122385293, 1068776853) + + W(6, 1025643512, -1113410705, 1026038978, -1085580324) + + W(7, -1119606047, 1062905414, -1117935205, 1034815986) + + W(8, -1107749524, -1093433405, 1034046493, 1053234619) + + W(9, 1029315286, -1106876578, -1116418603, -1100509010) + + W(10, 1037794408, 1023262329, -1121900993, 1029051910) + + W(11, 1013163432, -1107168757, 1020109569, 1038509970); + WS(1048802172, -1118644607); + sum1 = + W(0, 1022629891, -1112271863, -1115934246, -1112205646) + W(1, 1050188943, -1125264263, 1001330921, 1008285357) + + W(2, 1007889405, -1137992085, 1025826270, -1127716075) + + W(3, -1147098739, -1106982824, -1110669107, 1044651974) + + W(4, 1026008921, -1113499645, 1023807923, 1020475895) + W(5, -1095657203, 1050363724, 1011316531, 1026946398) + + W(6, -1129374813, 958183765, -1113474437, 1050921091) + W(7, -1106529387, -1121270209, 1028532286, 1025640422) + + W(8, -1090481180, 1050665633, -1131537104, 1021652689) + + W(9, 1031375324, -1133565569, -1104303995, 1037811271) + + W(10, -1125009457, 1014192325, -1151549405, -1106868493) + + W(11, -1104624276, 1049383075, 1022847857, -1142930963); + sum2 = + W(0, 1016559128, -1089262209, 1053795811, 1058569170) + W(1, -1094475155, 1008650912, -1119933527, 1032931419) + + W(2, -1108360154, -1097574423, 1036603460, -1121755244) + + W(3, 1008526536, -1094914643, 1052999976, 1052760357) + W(4, -1106271635, 1039081818, 1034816070, -1096197918) + + W(5, 1069558608, 1058007152, 1022028102, 1004102711) + W(6, 1018959568, -1101210129, -1103281588, -1106340652) + + W(7, -1121182797, 1033515588, 1026554777, 1049415798) + W(8, -1085501184, -1101474305, 1027756295, 1032461240) + + W(9, -1112891495, -1128790619, -1098019814, -1114646508) + + W(10, -1124734105, -1118822413, 1046177388, 1043157162) + + W(11, -1088254262, -1096632714, 1015426864, 1043397723); + WS(-1085648446, -1079079370); + sum1 = W(0, 1031831473, 1036117159, 1049939273, -1094329359) + W(1, 1040633606, 1023486628, -1114079994, 1003975776) + + W(2, 1042007752, -1097850009, -1134555900, 1019647980) + + W(3, 1031367567, 1044164867, 1043312672, -1089391360) + W(4, 1041283678, 1023951387, -1118896788, 1045647319) + + W(5, -1095211959, -1087218668, 1044809099, 1014099708) + + W(6, -1123680847, 1033826253, -1122554975, -1100203021) + + W(7, 1046447947, 1017251780, 1033718927, 1041970952) + W(8, -1116359196, 1033960979, 1042238738, 1031788713) + + W(9, -1123944253, 1024952417, -1176880640, -1108529239) + + W(10, 1024390649, -1146375056, 1033541103, 1040029267) + + W(11, 1026974961, -1111794397, 996515216, 1033511473); + sum2 = W(0, 1019169584, 1042983019, -1098354632, -1099987280) + + W(1, 1048978343, -1118546716, -1120973142, 1009997472) + + W(2, -1106283039, 1032814660, -1103033329, 1022934360) + + W(3, 1033125970, -1103915398, 1033722376, -1095179878) + + W(4, 1055664562, -1110281795, 1025364316, 1036688212) + W(5, 1062322516, 1032770062, -1097173506, 1045599869) + + W(6, -1109812797, -1125420780, -1098634798, -1109050948) + + W(7, -1103688168, -1119010038, 1040314133, -1119986230) + + W(8, 1057333054, -1097734639, -1173745415, 1038965178) + + W(9, -1108282977, 1034277286, -1102308141, 1034195486) + + W(10, -1107997912, 1007528912, 1018923536, -1117630132) + + W(11, -1125368820, 1049154263, -1098308929, 1035253180); + WS(-1089355774, -1078290086); + sum1 = W(0, -1122950775, 1037182841, -1118638572, -1121667553) + + W(1, 1009124079, -1115334660, -1112691207, -1124344033) + + W(2, 1041047393, -1104403323, -1138062223, -1126199861) + + W(3, 1023290087, 1046400294, -1098349922, -1099164822) + + W(4, 1044398104, -1136525567, -1107733500, -1118583361) + + W(5, 1057481334, 1054069421, -1149431076, -1110719762) + + W(6, -1146188190, 1042531744, -1139289650, -1097191323) + + W(7, 1044515332, 1015659149, -1132821263, -1121639475) + + W(8, -1109625472, 1041114291, -1120573261, -1121643278) + + W(9, -1112282369, -1137408791, 1026873009, -1120861012) + + W(10, -1120947806, -1122889719, -1116356099, 1018516820) + + W(11, -1139389015, -1139200383, 1017011067, -1120569352); + sum2 = W(0, -1120919296, -1124567280, 1037030993, -1120629799) + + W(1, -1106639281, 1020211370, 1009843654, -1107129213) + + W(2, 1043380414, -1102119519, 1030878171, -1126825280) + + W(3, -1132368064, 1020831927, -1109288357, -1112537154) + + W(4, -1118412551, -1144175329, 1020138111, -1098918731) + + W(5, 1059483198, 1064361176, -1093377806, -1146281491) + + W(6, 1029564211, -1132836513, -1119273466, -1104145236) + + W(7, -1123848756, -1135251423, -1115205032, 1010227332) + + W(8, -1106893419, 1043150197, -1103899854, 1028327527) + + W(9, 1016741875, -1118685376, 1028452918, -1117770026) + + W(10, 1024207514, -1128215590, -1119663171, 1026001154) + + W(11, -1135273053, 1019055438, -1109882780, 1024565629); + WS(1064975294, 1066308158); + sum1 = + W(0, 1031747776, -1119071204, 984462229, -1132055971) + W(1, -1148253029, -1126913907, -1106142801, 1032019633) + + W(2, 1045090381, -1108909198, -1110036442, 1036419718) + W(3, 1028818885, 1041375482, -1093262116, 1038243096) + + W(4, 1036945928, -1121925745, 1001228109, -1112793497) + W(5, 1049965274, 1021279149, -1115536386, 1019907753) + + W(6, -1115396498, 1013499583, 1052662103, -1090377239) + W(7, 1034061985, 1032108124, 1041342669, -1123968938) + + W(8, -1113450905, 1040402543, 993049059, -1109636927) + W(9, -1108139113, 1024220311, 1035427697, -1107965954) + + W(10, -1113141447, 1032825796, 1027821620, 1020544662) + + W(11, -1138282267, -1116422289, 1016907357, -1128061041); + sum2 = + W(0, 1016610899, -1118189976, 1027283971, 1028895363) + W(1, -1113530321, 1007846553, -1135553471, 1018031354) + + W(2, -1118352328, 1032145382, -1123867563, 1011272254) + + W(3, -1163068737, -1120752887, 1042584076, 1042427003) + + W(4, -1099207121, 1010785270, -1147979120, 1035872696) + + W(5, -1095799786, 1073605475, -1075418961, 1026092591) + W(6, -1121296916, 1034250650, 1009508653, 1056095764) + + W(7, -1091570337, 1030054693, -1139692219, 1022157658) + + W(8, -1121907329, -1130051225, -1113117501, 1019567305) + + W(9, 1007282246, -1131969269, -1148404200, 1025403981) + + W(10, -1124635978, 1012575724, 1019770181, -1131641536) + + W(11, 1013257077, -1121748387, -1123610989, 1018865930); + WS(1062423998, 1020226002); + sum1 = W(0, -1122384152, -1116470612, -1095861522, 1055717600) + + W(1, -1128557498, -1133541800, 1000976853, 1015809956) + + W(2, -1125526476, 1034182342, -1136390676, 1025071548) + + W(3, -1122957973, -1115150860, -1101122465, 1052715645) + + W(4, -1101688288, -1121585121, -1140430696, -1100102424) + + W(5, 1051208664, 1053221217, -1097231798, 1026360261) + W(6, 1018079658, -1099378776, 1045734276, 1041738487) + + W(7, -1114764537, -1127628368, -1116871589, -1102397253) + + W(8, 1040938184, 1038184662, -1107259340, -1121765359) + + W(9, 1021042950, -1121061927, 1045437908, -1114085178) + + W(10, 1034631967, 1018430000, -1130305609, -1097083551) + + W(11, 1049869175, 1019939330, -1105843464, -1122412137); + sum2 = W(0, -1125184611, -1124729770, 1045115043, 1058112728) + W(1, 1023628890, 1007171579, 985313435, -1132095255) + + W(2, -1117207517, 1067077185, -1158219675, -1118062236) + + W(3, -1181860650, 1028760415, 1036693207, -1107623537) + + W(4, 1043689375, 1000645119, -1124740239, 1011065519) + + W(5, -1088457353, -1080660794, 1020427720, -1160295467) + + W(6, -1132645547, 1033849803, -1096437481, -1109418981) + + W(7, -1110185484, 1015083304, 999484231, 1015359010) + W(8, 1048821220, -1117188353, 1032363474, 1023561702) + + W(9, -1125466771, -1140486285, -1107942084, 1027196953) + + W(10, -1121893121, -1134577643, 1024683619, -1125848669) + + W(11, 1027562883, -1127975224, 1023023798, -1158549787); + WS(-1085592318, -1113086899); + sum1 = + W(0, -1127342656, -1105245475, -1104578161, 1053241687) + W(1, -1103827813, -1138537863, 1024334944, 1029597578) + + W(2, -1117644382, 1041591201, 1020278010, 1015573096) + + W(3, -1107952998, -1104926592, -1101901257, 1051692021) + + W(4, -1097952575, -1110174988, 1034498345, -1110412429) + + W(5, 1053247055, 1044816720, -1110749814, 1033881662) + W(6, -1131633306, -1103724998, 1051300307, 1042909421) + + W(7, -1106968399, -1116328992, -1110168462, -1098176238) + + W(8, 1051451939, -1124765258, -1105195378, -1113141267) + + W(9, 1033648125, -1115323711, 1049307889, -1143558503) + + W(10, 1027981559, 1028312016, -1119681052, -1098367950) + + W(11, 1053283054, -1113485404, -1102600950, -1113790704); + sum2 = + W(0, 1019423143, -1118706158, -1110500850, 982325064) + W(1, -1117883328, -1145733922, -1134200265, -1122995556) + + W(2, 1021681136, -1106847870, -1115095323, 1001371122) + + W(3, 1022335641, -1113839515, -1121978030, 1042414810) + + W(4, -1112736275, 1019850892, -1126211289, -1123774588) + + W(5, 1048787768, 1052221246, -1118959328, -1113736050) + W(6, -1160177640, 1002859666, 1035034344, 1009324191) + + W(7, 1026260852, 1023767274, 995157684, -1114460336) + W(8, 1025695056, -1129766425, -1114723897, -1130130145) + + W(9, -1138832033, -1131104601, -1126984825, -1136621129) + + W(10, 1016807320, -1131688905, -1130236057, 1027754115) + + W(11, 1027074464, -1120353368, -1121253912, 992217060); + WS(1025516512, -1100199588); + sum1 = + W(0, 1010096560, 1021891087, 1041308560, -1106994989) + W(1, -1107391304, 1032706511, 998291066, -1128181387) + + W(2, 1015332531, -1097993736, 1040752366, -1115681272) + + W(3, 1015136529, -1152435393, 1054580194, -1087955312) + W(4, 1021987303, 1013936722, 1016981531, 1035336779) + + W(5, 1043985948, 1049373383, 1016493518, -1153713033) + W(6, -1134306338, 1040424469, -1088067164, 1048585956) + + W(7, -1111549299, -1122756060, 1015217585, 1041134374) + W(8, -1097437107, 1044933000, 1015283332, 1028860515) + + W(9, 1025573847, -1147235028, -1108043523, 1037061588) + + W(10, -1125444197, -1124931799, 1027586712, -1105873140) + + W(11, 1024655979, 1041451309, 1025261651, 1010373746); + sum2 = + W(0, 1024904631, -1115115972, -1128899549, -1100416868) + W(1, 1014205090, -1138213458, -1136864762, 1023564875) + + W(2, -1103710322, -1105139728, -1112771593, 1024304323) + + W(3, 1005033941, -1114446231, -1140124434, -1107001478) + + W(4, -1105823902, 1028369943, 1030076655, -1115188268) + W(5, 1057566767, 1061216146, -1101449249, 1031401203) + + W(6, 1022202973, -1099782234, 1051976820, -1114917196) + W(7, -1115621063, -1127316949, 995105737, 1025338591) + + W(8, 1009750634, -1107279078, -1123827499, 1002907445) + + W(9, 1009257370, -1107689693, 1040613751, -1123762171) + + W(10, -1124460977, 1021828037, -1113660547, 1049272645) + + W(11, -1105716747, -1112133417, 1019919657, -1121285688); + WS(1050734204, -1108852232); + sum1 = W(0, -1111669430, -1116292712, -1122281377, 1027495958) + + W(1, -1113568120, -1123139966, 1026854009, -1106093993) + + W(2, -1103616254, -1113635568, -1125634353, -1117637392) + + W(3, -1115457556, -1104273631, 1027625969, 1042550097) + + W(4, -1100906821, -1147736996, 1022285659, -1090233269) + + W(5, 1069754213, 1065691213, -1090598793, 999398084) + + W(6, -1130768721, -1103820941, -1114752252, 1054098174) + + W(7, -1103145534, -1140005358, -1124925681, -1107176543) + + W(8, -1130883179, 1026991873, -1107767585, -1123096067) + + W(9, 988348114, -1114665965, -1144129324, 1018693905) + + W(10, 1007587914, -1120005196, -1117352760, -1103610460) + + W(11, 1032882469, 1034282506, -1112131865, -1122062653); + sum2 = + W(0, 1024214881, -1105712489, -1096328526, 1036545949) + W(1, -1114697429, 1029115040, -1122830075, 1026001227) + + W(2, -1089670730, -1104892025, 1027384734, -1127506094) + + W(3, 1024710111, -1105988647, -1109313571, 1042923133) + + W(4, -1108836817, 1018384918, -1118490155, 1044311614) + W(5, 1057951288, 1050757116, 1046225965, -1118982995) + + W(6, -1134765475, -1128591966, 1031038781, 1041007149) + W(7, -1111832237, 1000957030, 1007204875, 1016894538) + + W(8, -1135710147, -1111844715, 1020988490, 1018633070) + W(9, 955722144, -1132281374, -1121635711, 982097434) + + W(10, -1141601766, -1131312630, -1132418382, -1121103003) + + W(11, 1040031313, -1131469166, -1137288635, 1012074251); + WS(-1077332287, -1089760701); + sum1 = + W(0, 998476811, -1126986618, 1035645275, 1035996661) + W(1, -1111559939, 1002151576, -1146931846, -1106320367) + + W(2, 1033143495, 1030948981, -1116749294, -1132098378) + + W(3, 1020090684, -1103512376, 1057100532, -1098691810) + + W(4, -1114602228, 1020764052, -1115596769, -1106044643) + + W(5, 1033806067, 1054020686, -1102410839, -1131285468) + W(6, 1018970620, 1033789092, -1089559024, 1053006209) + + W(7, -1114317262, -1143682184, -1117338894, -1121544222) + + W(8, -1119052427, 1053247323, -1148875196, -1140686688) + + W(9, -1131301080, 1025908912, -1109205213, -1117960094) + + W(10, 1040862618, -1112291776, -1134004534, -1120853460) + + W(11, 1021655744, -1112997269, 1024305160, -1137942600); + sum2 = + W(0, 1006079429, 1015506585, -1129173219, -1126961905) + W(1, 1025558752, 1004493969, -1142220161, 1012377004) + + W(2, 1019086641, 1027847692, -1121396179, -1129089615) + + W(3, -1129651941, 1027444401, 1029291472, -1099113060) + W(4, 1031608500, 1032469225, -1120056293, 1027255740) + + W(5, -1087748986, -1071778912, -1132223695, -1117547929) + + W(6, 1021210606, -1154390002, 1030702430, 1077548482) + W(7, 1041292060, 1017793536, -1138049810, -1121552483) + + W(8, 1046290929, 1017608723, 1030045463, -1115202758) + W(9, 1020679942, 988683875, -1149010889, 1009874569) + + W(10, -1116313503, 1024909384, -1144760977, -1149209645) + + W(11, 958643736, -1165018915, -1108302337, -1153372770); + WS(1054407548, 983325672); + sum1 = + W(0, 1028412425, -1105600625, -1148390382, 1033571545) + W(1, 1032293767, -1124427701, -1115456470, 1033490817) + + W(2, 1044756246, -1114006910, -1119790070, 1037509878) + + W(3, 1017604747, -1115519181, -1103922376, 1059608097) + W(4, -1107101148, 1007976775, 1031921957, 1031550611) + + W(5, -1090010995, -1087252051, 1044072953, 1022727275) + + W(6, -1121692358, -1103698804, 1062123705, -1094628214) + + W(7, 1027680451, 1033962892, 1041128181, -1109550327) + W(8, -1103937189, 1042983319, 1021059262, -1108328080) + + W(9, -1131299175, 1030793272, 1039103265, -1106569209) + W(10, 1007158719, 1032055396, 1034097067, 1014014769) + + W(11, -1135652511, -1116995186, -1141553278, -1143059662); + sum2 = W(0, 1007145536, 1011835040, -1115291423, 1029973058) + + W(1, 1036345379, -1106716830, -1108956115, 1040320325) + + W(2, -1145921569, -1113530029, -1116109872, 1031627486) + + W(3, -1123468231, 1009493536, -1120694127, 1025444390) + + W(4, -1106839609, -1106619549, 1003522017, 1036429861) + W(5, 1057547857, 1039825371, 1028735446, 1032586179) + + W(6, -1106382527, 1045134298, -1120933925, -1093621604) + + W(7, 1043632212, -1135351552, 1023566518, -1132203156) + + W(8, -1105348488, 1030401418, 1032927131, -1107014793) + + W(9, -1116797301, 1044032552, -1105744806, -1111109931) + + W(10, 1031187850, 1030984886, 1016028592, -1103689691) + + W(11, 1019566780, 1039637835, -1119043970, -1117261713); + WS(1062610366, -1081620328); + sum1 = W(0, 1034909184, 1041975919, 1038564634, -1086061975) + W(1, 1054071881, -1118145809, 1022225638, 1036878493) + + W(2, 1032326503, -1097049310, 1038246806, 1033815666) + W(3, 1022593144, 1038275488, 1032775158, -1094128798) + + W(4, 1049378869, 984752392, 1034659649, 1049110721) + W(5, -1104434937, -1097332230, 1048167927, 1040915883) + + W(6, -1145063906, 1039909252, -1098154666, -1096830529) + + W(7, 1037005773, -1127387550, 1029979468, 1050285945) + + W(8, -1091716385, 1031802154, -1122539766, 1042582214) + + W(9, 1024460554, 1032760119, -1098908862, -1125106744) + + W(10, 1023442918, 1025327999, -1129493655, 1052309552) + + W(11, -1093908076, 1033460244, -1111713187, 1038395208); + sum2 = W(0, 1025388154, -1106689977, -1110560421, 1049316874) + W(1, 983067209, -1121273022, 1001261778, 1031762430) + + W(2, -1111104301, -1112011481, 1033280635, 1026153330) + + W(3, 1007664153, -1105078255, -1122922762, 1044332351) + + W(4, -1133572905, -1116643818, 1018216589, -1117638934) + + W(5, 1029938402, -1117360942, 1022258405, 1033323756) + + W(6, 1011431705, -1119019386, -1107704269, -1116357646) + + W(7, 1016143957, -1123412994, -1124915037, 1039919645) + + W(8, 1043034893, -1107523849, -1109485745, 1027380094) + + W(9, 1007167865, -1115769810, 1041034358, -1112781805) + + W(10, 1010088409, 1016238045, -1118462618, 1041969311) + + W(11, 1050092429, -1104673921, -1106654827, 1006440178); + WS(-1079099231, 1058224693); + sum1 = + W(0, -1136025729, -1098612147, 1040574357, 1044962866) + W(1, -1107948018, -1152707357, 1041807413, 1030021338) + + W(2, -1113591959, 1041390773, 1030293261, 1019631368) + W(3, -1113852830, -1101745716, 1035906153, 1038641429) + + W(4, -1102747762, -1119110697, 1038775953, -1114342965) + + W(5, -1100940817, -1112997607, -1131180663, 1008365619) + + W(6, -1130024634, -1109189268, -1110548904, 1053521164) + + W(7, -1102886695, -1120409456, -1139925939, -1116898669) + + W(8, -1107090858, 1048687519, -1127712365, -1156710253) + W(9, 1032899333, -1169623989, 983487291, 1048553583) + + W(10, 1020276366, -1137865855, -1135488689, -1105924753) + + W(11, -1105279552, 1049805017, 1033907987, -1120648241); + sum2 = + W(0, 1026221982, 1031288593, 1025270629, -1105433524) + W(1, 1025604422, 1025361731, -1150712731, -1121646784) + + W(2, 1040465550, -1099611845, 1015298833, -1118571342) + + W(3, -1135858910, 1020650492, -1102699692, -1077885918) + W(4, 1013887757, 1035533544, 998750602, -1118866549) + + W(5, -1090773917, -1073585027, -1111404471, -1115122758) + + W(6, 1026066546, -1126679589, -1103726643, -1083499628) + + W(7, 1029004921, 1025173545, -1122173835, 1033676882) + W(8, 1038653616, 1072488285, -1128843744, -1132364945) + + W(9, 1019885572, -1119823506, 1044175124, 1076879885) + W(10, 1042609155, 982102231, -1114797832, 1024418530) + + W(11, 1035909226, 1053754278, -1128976380, -1120827581); + WS(1039418864, -1140458522); + sum1 = W(0, 983096624, -1114535995, 1044450572, 1027001827) + W(1, -1117675070, 1035770150, 1029517505, -1145085849) + + W(2, -1097839409, 1032347927, 1031259878, -1104931415) + + W(3, -1121873782, -1102746926, 1062380387, -1106235793) + + W(4, -1105839880, 1033087169, 1019803894, 1028523779) + + W(5, -1088253674, -1090653261, 1036696746, -1121428646) + + W(6, 1027911414, -1100878768, -1109645966, 1061486174) + + W(7, -1097301074, -1120235273, -1108005699, 1038991951) + + W(8, -1154916402, 1029669390, 1024178544, 1035324408) + + W(9, 1033576274, -1142936385, -1107146685, 1047810758) + + W(10, 1038477872, -1108040973, -1135118358, -1125909817) + + W(11, -1122115416, 1038152785, 1041849616, 1017003668); + sum2 = W(0, -1121567066, 1033267920, -1104421963, -1130139832) + + W(1, -1132243276, 1024120715, 1034344084, 1026284945) + + W(2, -1103410132, 1037507308, 1034735332, -1109350039) + + W(3, -1105011035, 1033899226, 1022298858, -1102818563) + + W(4, 1044067085, -1127155070, -1142865888, -1120108491) + W(5, 1057117238, 1003910328, 1041074904, 975508032) + + W(6, -1136511728, -1122542627, 1038703002, 1043197066) + + W(7, -1101099519, -1117378085, -1106811819, -1120621959) + + W(8, 1033583066, -1124006960, -1109459597, 1001772648) + + W(9, 1032101677, -1134482876, -1122973141, -1124335993) + + W(10, 1041237660, -1113899392, -1113394506, -1114137407) + + W(11, 1030826553, -1125132432, -1128301632, -1126301549); + WS(1053462780, -1083681865); + sum1 = W(0, 1023511963, 1041747598, 1041497612, -1138339988) + W(1, 1035615616, 1020629658, -1126058411, 1015154794) + + W(2, 1018224530, 996055791, 1027711272, -1123213919) + W(3, 1027394040, 1045749945, 1041814811, 1014351349) + + W(4, 1040756601, 1032965474, -1118697149, 1048726745) + + W(5, -1086401302, -1082085657, 1048515830, -1129047376) + + W(6, 993307519, 1043007793, -1115623160, -1096882594) + W(7, 1042139693, -1132054806, 1025756296, 1038169844) + + W(8, 1032344226, -1105145572, 1038148425, 1033289129) + + W(9, -1131368524, 1024626666, -1127070442, -1110953740) + + W(10, 1009997960, -1128695798, 1029589575, 1040782360) + + W(11, -1131398580, -1110890258, 1029718722, 1029252236); + sum2 = W(0, 1008350928, -1118714967, 1030231193, -1091889801) + + W(1, -1108897465, 1032606711, 1011413600, 1024023545) + + W(2, -1124778398, -1098641764, 1033453825, -1125648711) + + W(3, -1120704007, -1126562655, -1110351493, -1104262464) + + W(4, -1106889474, 1025836907, 1027382950, 1034951721) + W(5, 1052754126, 1057762368, 1035809187, -1131934955) + + W(6, -1127381517, -1128407708, 1033272406, -1161878816) + + W(7, -1132306565, -1134699254, 981904616, -1126139913) + + W(8, -1151802072, 1012148800, -1153180738, -1131180247) + W(9, 1015535284, 999360844, 1013432992, 1024540201) + + W(10, 1014625240, -1171757551, -1135583391, -1138986423) + + W(11, -1123376913, 1031971990, -1118108772, -1140791326); + WS(-1099299320, 1056598066); + sum1 = + W(0, 1006197652, -1127547996, -1106221946, 1045972807) + W(1, 1004824505, -1119658116, -1128153660, 1041714651) + + W(2, -1098261544, 1038366195, -1113181968, 1030219574) + + W(3, -1136164796, 1029712499, -1085896508, 1057638589) + + W(4, -1113770157, -1129447670, 1035903322, -1128532088) + W(5, 1057218165, 1054413180, 1038963911, 1033715440) + + W(6, -1130396894, -1106761055, 1054525467, -1086573266) + + W(7, 1033084478, -1128924420, 1036246880, -1121593759) + + W(8, 1028130044, -1090476168, 1042818602, -1116035017) + + W(9, -1124832314, 1017604226, 1036683414, -1101308500) + + W(10, -1130963634, 1030841394, 1029570879, 1017990507) + + W(11, 1016287010, -1110319406, -1114724733, 998207538); + sum2 = + W(0, -1131923124, 1046772351, -1110971235, -1105011941) + W(1, 1028001687, -1121147281, 993280665, 1028557303) + + W(2, -1134148898, -1104446514, -1147560296, 1024426003) + + W(3, -1127811288, -1107794670, 1043137579, -1096504482) + + W(4, -1101129935, 1034898623, 1032538133, -1098564467) + + W(5, 1067961229, 1066594258, -1104613803, -1136832302) + + W(6, 992174233, -1121892222, -1095277951, -1107079502) + W(7, -1097683180, 1036381319, 1002762140, 1035775413) + + W(8, -1099141736, -1090299346, -1129031039, 1009264906) + + W(9, 1015088121, -1158807761, 1011333246, -1132433157) + W(10, -1108888578, 1032287279, 992586073, 1019898989) + + W(11, -1118039147, -1109952821, 1040568125, -1111357043); + WS(-1105186296, -1108555742); + sum1 = + W(0, 1040483623, -1105046378, -1118442722, 1040666374) + W(1, 986662468, -1118942975, -1101386974, 1038429012) + + W(2, 1042743759, -1109750289, -1103538071, 1040611956) + W(3, 1040816739, 1031828819, -1093958439, 1050019912) + + W(4, 1033262923, -1118385334, -1134311356, -1107675004) + + W(5, 1030110546, 1040526743, -1121451017, 1012951144) + W(6, -1108915605, 1034430779, 1044698927, -1097473172) + + W(7, 1032745156, 1035127903, 1046011615, -1109709717) + W(8, -1103097566, 1045974257, 1041021277, -1100748433) + + W(9, -1102638726, 1030173660, 1041159370, -1110364069) + + W(10, -1106175813, 1037154391, 1034864637, -1130419297) + + W(11, -1111922822, 1017242540, 1032931450, -1121991998); + sum2 = W(0, -1127162070, 1014979733, -1114518101, 1016203776) + + W(1, 1035296562, -1117887634, -1135271108, -1136185376) + + W(2, 1038675289, -1140478504, -1111853852, 1030827904) + + W(3, 1003505825, 1028363168, -1105093650, -1089585970) + + W(4, 1058969759, -1123277259, 1012864633, -1131143608) + + W(5, -1095849351, -1070239185, 1079096535, -1116960146) + + W(6, -1123384038, 1033256022, 1028346583, -1078361549) + + W(7, 1068193425, -1125445846, 1026898060, -1133517476) + + W(8, -1113528611, 1038794260, 1032636395, -1113311282) + + W(9, -1134649836, -1120532892, 1028725832, -1125525718) + + W(10, 1017911666, 991223090, -1125848258, 1028008335) + + W(11, -1117113572, 1005296645, 1032298564, -1134431064); + WS(1065442623, 1015025160); + sum1 = + W(0, -1115365041, -1113215535, 1018550702, 983382403) + W(1, -1103693946, -1124004468, 1040496438, 1031517084) + + W(2, 1044423084, 1017412396, 1032083208, 1040563090) + + W(3, -1114325264, -1109245393, -1131936399, -1109909072) + + W(4, -1106995843, -1120263275, 1036061554, 1002812769) + W(5, 1034975748, -1099246196, 1024898238, 1012000060) + + W(6, 1038370800, 1036804053, 1048106991, -1114225707) + W(7, 1044531927, 1036150809, -1112496600, -1099928488) + + W(8, -1107673238, -1129165678, -1096349707, -1113013165) + + W(9, 1039123015, 1036473513, 1041344487, 1011581692) + W(10, 1043676418, 1037117105, -1120668655, -1116761110) + + W(11, 1019812354, -1138585900, -1110354101, -1128538214); + sum2 = + W(0, 1010698941, 1023126843, -1106210958, -1122624743) + W(1, -1122034237, -1117968485, 1042699596, -1140656688) + + W(2, 1029081919, 1040813712, -1174961495, 1039098482) + + W(3, 1048659418, -1095653758, -1118272649, -1097694847) + + W(4, 1033474214, -1118912655, 1058578114, -1081184698) + W(5, 1060468587, 996865603, -1102355565, 1020119257) + + W(6, 1052277576, -1097586600, 1043044817, -1103459725) + W(7, 1049205466, 1031051049, 1019470633, -1098953045) + + W(8, -1108654451, -1128239326, -1112376452, -1108144089) + + W(9, 1041036392, 1018118885, 1029721267, 1034766857) + W(10, 1033989555, 1038110136, -1119471849, -1122826054) + + W(11, -1130901998, 1000734433, 1017824567, -1114988670); + WS(-1115864032, 1039792746); + sum1 = + W(0, -1140468214, -1121375417, 1034497081, 1039608980) + W(1, -1113171393, -1132620605, 996096400, -1108218204) + + W(2, 1033625894, 1040179481, -1108192053, 1018030914) + W(3, 1010495721, -1109130991, 1055392502, -1093805194) + + W(4, -1127063626, 1012649753, -1114956320, -1115276388) + + W(5, 1036829073, 1050653566, -1109643980, -1127455572) + W(6, 1013460969, 1040789857, -1088431348, 1049263376) + + W(7, -1124542831, -1135717173, -1122072970, -1114444905) + + W(8, 1030275655, 1051648994, -1129660583, -1147064482) + + W(9, -1127833232, 1026520268, -1111886108, -1121903450) + + W(10, 1034831154, -1114505023, -1140762151, -1127271361) + + W(11, 1031218972, -1112576115, 1019975176, -1135014713); + sum2 = + W(0, 1015385693, -1115435752, 1035175215, 1017441239) + W(1, -1112773411, 998363696, 1020691269, -1141202058) + + W(2, -1117300235, -1122675471, 1031000417, 1016207247) + W(3, 1015565489, -1111436746, 1033401267, 1055273933) + + W(4, -1101083444, -1113092041, 1019337403, 1040267853) + W(5, -1100581516, 1073306798, 1046685605, 1013448250) + + W(6, -1132207064, -1114623303, 1041259906, -1073173797) + + W(7, -1115311051, -1130370856, -1131086480, 1025609602) + + W(8, -1101351817, 1032997632, -1113329498, 1026870685) + + W(9, -1163542113, -1140470334, 1020278145, -1122237085) + + W(10, 1031244051, -1124843109, 1010427910, -1128429973) + + W(11, 1027629029, -1119509251, 1033297372, 1014260054); + WS(1060418110, -1122066101); + sum1 = + W(0, 1031696780, -1115430516, -1104465800, 1041576533) + W(1, -1122042801, 1028261758, -1124029560, -1129767372) + + W(2, -1124342772, 1035204176, -1109435772, 1025573168) + + W(3, -1147879495, 1033383950, -1084846132, 1057835449) + + W(4, -1106791333, 1024098613, -1123330286, 1032201307) + W(5, 1040589380, -1121351835, 1025265863, 1000233671) + + W(6, -1137787811, -1124043956, 1059143665, -1085338500) + + W(7, 1037079395, 1020968696, 1025904121, -1135655378) + W(8, 1047669789, 1026196737, 1031201378, -1122702819) + + W(9, -1122010711, 1016436406, 1032251443, -1113520196) + + W(10, -1120875027, 1016849816, -1131825009, 1011740349) + + W(11, 1017074582, 1023559701, 1024540211, -1123483709); + sum2 = W(0, -1127836624, 1033364881, -1101679270, 1023580345) + + W(1, -1149619356, -1136662275, -1173496113, -1127629564) + + W(2, -1105780675, -1119640853, 1033890881, -1122666983) + + W(3, 1027284157, -1104916712, -1113070309, -1132739235) + + W(4, -1113766541, 1023707939, 1022886010, -1097350377) + + W(5, 1061873799, 1062616603, -1112358042, 1028952789) + + W(6, 1036751625, -1105423640, -1096904559, 1009507187) + + W(7, -1119315178, -1117384012, -1124242822, 1034826035) + + W(8, -1105550966, -1098447862, 1045500652, -1137245711) + + W(9, 1017945890, -1122986652, -1127473876, -1116534057) + + W(10, 1015952658, -1136860123, -1140181115, 1033442485) + + W(11, -1108824717, -1115327874, 1033458469, 1001899534); + WS(1052277756, 1024619064); + sum1 = W(0, 1029425189, -1120340480, 1055903799, -1093981294) + + W(1, -1125235986, 1026200342, -1155801216, -1107014752) + + W(2, 1049346130, -1099678446, 1003141514, -1131584400) + + W(3, 1030252033, 1038469578, 1057427995, -1098793998) + W(4, 1025012844, 1031806855, -1112675811, 1032327591) + + W(5, -1103272826, -1090697510, -1118748640, -1126277858) + + W(6, 1025211073, 1034534022, 1040656272, -1103403378) + W(7, 1025335343, 1010568017, -1122395345, 1039704040) + + W(8, -1111436999, 1041606598, -1106833215, 1032770798) + W(9, 994289396, -1137717581, 1016775164, 1005246730) + + W(10, 1029370155, -1124454216, -1124711713, 1045346698) + + W(11, -1134653325, 1013960373, -1099652851, 1034190187); + sum2 = W(0, 1023289146, 1045862572, -1095566322, -1087461476) + W(1, 1016132472, 1044890152, 1020437582, 1028786959) + + W(2, -1132354231, -1101737384, -1127607289, -1124440021) + + W(3, 1009748873, -1120652794, -1090793815, -1083542229) + + W(4, -1107157844, 1037463572, 1030199907, 1015917080) + W(5, 1063879108, 1069217208, -1097091848, 1032502373) + + W(6, 1007345789, -1117660774, -1107315270, 1056862945) + + W(7, -1098187278, 1028169917, 1010063617, -1106003069) + + W(8, 1045942315, -1153692567, -1116485608, -1108513707) + + W(9, 1018930146, 1039304637, -1106431667, -1111757292) + + W(10, 1036040005, 1034190881, -1127799210, -1098471935) + + W(11, 1048572904, 1056217861, -1094693884, -1108016950); + WS(-1086218302, -1084258561); + sum1 = W(0, 1027347742, 1041008695, 1040638149, -1088163117) + W(1, 1045697689, -1131589088, 1021408948, 1036310380) + + W(2, 1041666443, -1103354245, 1033383494, 1033326017) + + W(3, -1127633782, 1035524367, 1033011818, -1094269524) + + W(4, 1040895122, -1132088142, 1039366096, 1048593117) + W(5, 1050103608, -1122175629, 1042904478, 1042877939) + + W(6, -1116749595, -1138037400, -1111907839, -1096387988) + + W(7, -1136050786, -1131538396, 1033396118, 1045683171) + + W(8, -1097626581, -1103712029, 1018682217, 1039834587) + + W(9, -1139872292, 1032120647, -1099416246, -1111740158) + + W(10, -1126758410, 1030901630, 1025066091, 1046369740) + + W(11, -1095221944, -1117250695, -1121047845, 1034112696); + sum2 = W(0, -1116225927, 1020583173, -1120289762, -1116630862) + + W(1, 1037488437, -1120774706, 1030773056, 1018516207) + + W(2, -1142227828, -1157244503, -1120616119, 1021325617) + + W(3, -1122365237, -1121497633, 1024002380, 1045806125) + + W(4, -1122845130, -1124264052, 1032148531, 1032012136) + W(5, 1050603076, 1061490298, 1029135782, 1020114521) + + W(6, -1127594672, -1111134479, 1040110681, -1104925089) + + W(7, -1122119114, -1129316292, 1026422036, -1112679629) + + W(8, -1109379336, -1096282325, 1035818151, -1129796491) + + W(9, 1023835916, -1123177144, -1102178993, -1103628682) + + W(10, -1118358279, 1024324894, -1131330830, -1112996078) + + W(11, -1102999759, -1116593585, 1024073644, -1129630471); + WS(-1092406524, -1089571522); - sum1 = W(0, -1120714617, 1035162146, -1110752415, -1121818163) + W(1, 1035961863, -1120878363, 1007614003, -1123901891) + W(2, 1046176310, -1105876799, 1034124059, -1120533037) + W(3, -1123305414, 1027364554, -1114390527, -1096860741) + W(4, 1022953826, -1155422496, 1009908268, 1030225939) + W(5, -1110762423, 1046191054, 1023450788, -1124524780) + W(6, -1129324172, -1116882705, 1032526991, 1043289735) + W(7, -1114841418, -1129613106, -1121901526, 1030599214) + W(8, -1096831458, 1052908756, -1114991488, 1013731840) + W(9, 1022915304, -1135846624, -1117077507, 1034530771) + W(10, -1116257712, 981289536, -1142748844, -1113117446) + W(11, -1127767760, 1039462233, 1025047056, -1143328976); sum2 = W(0, -1131108965, 1043465638, 988544780, -1145266179) + W(1, 1018501507, 1021344415, 1000650931, -1113612493) + W(2, -1124179817, -1111438835, 1003301507, -1131299129) + W(3, 1025688791, -1106748353, -1070139293, -1110118136) + W(4, 1026178295, -1123696315, -1116852534, 1029599173) + W(5, -1102659167, -1097100047, 1031198431, 1012522521) + W(6, -1145056307, 1045881517, 1078104617, 1027449515) + W(7, -1123515159, 1024975831, -1123043594, -1118230687) + W(8, 1048052425, 1027739737, -1134523125, 1020199127) + W(9, 1018436747, 1029259867, -1126127905, -1136112041) + W(10, 995063942, -1162666156, -1139914565, -1107504809) + W(11, 1025133515, 1036504803, -1120319069, -1131042995); WS(1061710334, -1113637247); - sum1 = W(0, -1121814583, 1036106897, -1109309294, -1143950978) + W(1, 1033251382, -1118153848, -1138603692, -1122595552) + W(2, 1048694647, -1103580007, 1032154570, -1122508490) + W(3, -1138264845, 1018454510, 1030681928, -1097890158) + W(4, 1019050396, 1012933309, -1140194465, 1033737112) + W(5, -1115559686, -1120177173, 1021617155, -1120902675) + W(6, -1131439046, -1122735662, 1044326142, 1042373458) + W(7, -1113884080, -1152998244, -1125621862, 1024541667) + W(8, -1097437158, 1052689231, -1107957310, 1016843898) + W(9, 1023073058, -1122620661, -1132933761, 1034486114) + W(10, -1116304653, -1144273714, -1129805541, -1116003130) + W(11, -1128614666, 1037961704, 1019245786, -1155701620); sum2 = W(0, -1162960213, -1107084454, -1126626424, 1025411499) + W(1, -1126548940, -1127269937, 1013908203, 1023868855) + W(2, 1032930462, 1029914487, 997665611, 1018748433) + W(3, -1113327157, 1032525526, 1076098019, 1035900190) + W(4, -1121182801, -1158385717, 1023571595, 1048796624) + W(5, -1132699465, -1093496445, 1038561302, 1000017309) + W(6, -1133790043, -1104878976, -1072747140, 1026052839) + W(7, -1146184997, -1123007653, 1024139725, 1003078933) + W(8, -1104764998, -1109617402, -1142783113, -1154085627) + W(9, -1130037920, -1121062518, 1019199125, 1025857863) + W(10, -1147685381, 1000677165, 1007034787, 1034207166) + W(11, -1123497947, -1118139493, 1017680405, 1016687665); WS(1064800702, 1030635520); - sum1 = W(0, 1004285524, -1128056492, 1035663048, -1110660706) + W(1, -1128734654, 1028175148, -1122860750, 1024005652) + W(2, 1031878036, -1116831438, -1204558974, -1143857649) + W(3, -1122286551, 1035530413, 984521208, 1023270757) + W(4, -1136886024, 1005008153, 1021316024, 1053335517) + W(5, -1100061872, -1093549817, 1042579293, 1016449422) + W(6, -1116388951, -1139373960, 1048911707, -1104621327) + W(7, -1148999845, -1135015336, 1022533838, -1130762670) + W(8, 1035194194, -1149876978, -1142259845, 1010510404) + W(9, -1125657162, -1121564617, -1131931048, -1142066105) + W(10, -1120920449, 1018152308, 1001429301, -1129213371) + W(11, -1141986761, 1031904066, -1111776529, 1020350678); sum2 = W(0, 1015139874, -1120731382, 1017539382, 1020112270) + W(1, -1126248934, 1013963196, -1150118671, -1116737087) + W(2, 1031888972, -1112637962, 1010207212, -1138130380) + W(3, 1032711786, -1087320828, 1059502015, 1026899401) + W(4, -1119882792, 1019091922, 1028577839, -1069693959) + W(5, 1078824499, -1094071548, 1040940327, -1123861886) + W(6, -1116703472, -1103666133, 1045823576, 1036639812) + W(7, -1131804892, 1004924552, -1123435694, -1138801588) + W(8, 1009232228, -1114441289, 1029410629, -1130443436) + W(9, -1140098908, 999422392, 1011539428, 1023067274) + W(10, -1130083750, -1137456436, -1140019692, 1029210329) + W(11, -1118193829, -1131442506, 1007549476, 1026106777); WS(1058942782, 1023618692); - sum1 = W(0, -1126072821, 1041771492, -1110777188, -1110871838) + W(1, 1036426764, -1142526755, 1011693912, 1025548876) + W(2, 1035801072, 1043278082, -1146527995, 1015953709) + W(3, 1017195423, 1036961985, -1094081945, -1103634941) + W(4, 1046715887, -1148709083, -1122268692, 1037536142) + W(5, -1091452759, -1105679152, 1040286827, -1119884351) + W(6, 1022607903, 1038780013, -1095962376, -1103558179) + W(7, 1049101574, -1122534754, 982545387, 1023558139) + W(8, 1049096396, -1130619215, 1031851588, 1007174309) + W(9, -1126061755, 1037537425, -1113879430, -1136949949) + W(10, 1002869195, 1017517093, 1003763447, 1035261291) + W(11, 955835050, 1026350907, 1006549707, 986004587); sum2 = W(0, -1128639222, 1001638233, -1119841411, 1014385869) + W(1, 986023269, -1135260845, -1150616818, 1013509397) + W(2, 1029376723, 1037911199, 970306708, 1013815957) + W(3, -1118932607, 1035428655, 1019940778, -1102461584) + W(4, -1141011097, 959170344, -1125568566, 1024255335) + W(5, 1063260126, -1085129330, -1110526300, 1017551658) + W(6, 991022546, 1031481278, 1032753418, -1110003004) + W(7, 1033244979, 1016351942, -1129687950, -1111645244) + W(8, 1026999545, 1019019978, -1121764803, -1127392454) + W(9, 1018120650, 1028380841, -1121385219, 1021463302) + W(10, 1025283273, 1009569613, 1006676397, -1115817479) + W(11, -1134958989, 1017625850, -1128128990, -1138867245); WS(1037837808, 1056377428); - sum1 = W(0, -1135573495, -1105969090, 1027945538, 1043223694) + W(1, -1100584037, 1025656415, 1023727061, -1138454045) + W(2, -1116105371, 1039709953, -1111027805, 1021082723) + W(3, -1118803082, -1114548551, -1126955510, 1051232418) + W(4, -1097887999, 1018764077, -1123500111, 1046351686) + W(5, -1122693874, -1100833583, 1040497066, -1115071549) + W(6, 1020600341, 1036383371, 1053007142, -1103740252) + W(7, 1024768136, 1025234525, -1111066541, 1034647805) + W(8, 1035274060, -1101618713, -1138012047, -1116333124) + W(9, 1008936161, 1026657308, -1156882549, 1033814037) + W(10, -1123286772, 1016891995, -1115286797, 1033474888) + W(11, -1122516460, -1129756781, 1010716753, -1114238799); sum2 = W(0, 1020978875, -1100967324, 1043179705, 1026290891) + W(1, 1013196277, -1138979633, -1121670462, -1130583533) + W(2, -1122981488, 1032797386, -1120286641, 966672716) + W(3, -1103298336, -1096736455, 1062358565, -1104401130) + W(4, -1114052290, -1152672163, -1110731474, 1053186254) + W(5, -1112891412, -1091109944, 1048200412, -1122242747) + W(6, -1105136733, 1045958215, 1031005462, -1133705481) + W(7, -1113847816, 1023845499, -1119790394, 1043729632) + W(8, 1033523405, -1102472853, 1033631266, -1118586102) + W(9, -1127100056, 1033816035, -1109547546, 1031959215) + W(10, -1126209517, -1147194793, 999102475, 1020355333) + W(11, -1122874410, -1122532081, 1027184816, -1127245018); WS(1050865148, 1032626572); - sum1 = W(0, -1110436993, 1043627312, -1118552440, 1045700875) + W(1, -1115060612, 1040430485, 1040042556, -1101476879) + W(2, -1108049256, 1033317691, 1031191472, -1096410465) + W(3, -1107890608, 1049906138, -1107535228, -1115480133) + W(4, 1025393771, 1042925123, -1113356418, -1109025830) + W(5, -1162779891, 1049713062, -1106727656, -1114330616) + W(6, 1034032544, -1120749707, -1095271743, 1042738346) + W(7, -1127443770, -1106585845, -1105712244, 1051482110) + W(8, 1035225158, -1122810712, 1039553933, 1042770518) + W(9, 999321197, -1103830356, -1104074479, 1050825756) + W(10, -1104755066, -1103219825, -1110201208, 1048543054) + W(11, -1106449960, 1031488492, 1040395170, 1009713998); sum2 = W(0, 1024944996, -1111924540, -1107012648, 1057346437) + W(1, -1105023593, -1097010076, 1020193961, 1007347355) + W(2, 1049541488, 1054940943, -1097277462, -1107952444) + W(3, 1014966838, -1116539066, -1107447750, 1059914271) + W(4, -1142156696, -1085761230, 1015828472, 1012341552) + W(5, -1109770505, 1066972918, 1043445868, -1078926120) + W(6, -1113612636, 1034050704, -1111197863, 1063973493) + W(7, 1017043379, -1084679416, 1032934706, -1113193567) + W(8, 1014122612, 1056333532, -1118781870, -1092348708) + W(9, -1116105943, 1042584092, 1016467631, 1045837843) + W(10, -1113967259, -1128370702, 1021395599, -1116104243) + W(11, -1135977693, 1043326701, -1117573943, -1108363561); WS(1054811644, 1027249161); - sum1 = W(0, 1040940111, -1101358582, -1113576073, 1049141881) + W(1, -1132483205, -1116754862, -1100243090, 1036221579) + W(2, 1038054901, -1105999252, -1104538698, 1037145120) + W(3, 1043481462, 1014943347, -1097482896, 1051960356) + W(4, 1036681666, -1118995685, -1119365790, -1109150355) + W(5, -1106696288, 1048275427, -1123112824, -1126689554) + W(6, -1111878381, 1036687602, 1022736646, -1118345360) + W(7, 1019000333, 1038634998, 1044780378, -1109759237) + W(8, -1097940765, 1049145430, 1044474573, -1101292557) + W(9, -1101638738, 1028424107, 1038478827, -1113101949) + W(10, -1103799553, 1034438878, 1035929492, -1122643648) + W(11, -1103674991, 1037909315, 1037239602, -1126283866); sum2 = W(0, 1023766557, 1016554458, 1021815988, -1137435361) + W(1, -1114856427, 1032032312, 1015306072, 1020144724) + W(2, -1103467660, 1016553974, 1044555388, -1105991725) + W(3, -1136376403, -1116988904, 1034521268, 1060795535) + W(4, -1088370625, -1127777881, -1113107482, 1050162106) + W(5, -1102546407, 1075503478, -1071164689, 1035804901) + W(6, 1038494252, -1104347057, -1103257907, 1072821349) + W(7, -1077590614, -1120944929, -1113447013, 1003678517) + W(8, 1025406308, -1113972415, -1112563255, 1036418439) + W(9, 1023629411, 1033762395, -1113239746, 1031283975) + W(10, 995356642, -1123929939, 1024784188, -1109441777) + W(11, 1026085595, 1037416902, -1112537357, -1140753514); WS(1055940220, -1124188157); - sum1 = W(0, -1113999823, -1119569210, 1015781094, -1147977024) + W(1, -1117684995, -1108336232, 1015763751, 1043278990) + W(2, -1106256755, 1046188556, 1036478965, 1006648968) + W(3, -1115168029, -1094609330, 1052603679, 1041916962) + W(4, 1033522483, -1101485874, 1022861696, 1044340802) + W(5, -1095339972, -1108128054, 1047885622, -1110457109) + W(6, -1114461725, 1033154083, -1108564239, 1057380776) + W(7, 1036635468, -1114614567, -1113117029, -1106205123) + W(8, 1042723938, -1095928258, 1035899866, -1108232826) + W(9, 1032164308, 1021089498, -1125646960, 1041299799) + W(10, -1139371156, 1034599135, -1121800074, -1107756257) + W(11, -1171638077, 1027517543, -1131185034, -1115299047); sum2 = W(0, -1120118804, -1136369034, -1127959037, 1015341014) + W(1, 1033327798, -1113602386, 1013270421, 1027353114) + W(2, -1129939889, 1034464346, 1041751325, -1114857235) + W(3, -1120552641, -1125884733, -1117793827, -1117887441) + W(4, 1049619624, -1103868602, -1117027367, 1035518448) + W(5, -1095769137, 1043338219, 1049093640, -1097589990) + W(6, 1016254148, 1043285424, -1095274849, 1049861339) + W(7, 1048627700, -1105817123, -1110780393, -1129166063) + W(8, -1117623897, -1128474295, 1035712363, -1106207094) + W(9, 1030787932, -1140216380, -1128598589, 1032330618) + W(10, 1035384499, 1004274322, -1133117880, -1120569751) + W(11, -1129927717, 1018695247, 1027229852, -1120123842); WS(1057163582, 1025817537); - sum1 = W(0, 1037167835, 1031655825, -1096271953, 1045084224) + W(1, 1033520525, 1016078798, -1121852313, 1046829204) + W(2, -1093143228, 1046279122, -1103697416, 1030441081) + W(3, 1034559945, 1038865075, -1085198281, 1057074420) + W(4, -1107583934, 1036548879, 1027044951, 987855837) + W(5, 1050118415, 1040167170, 1024989936, 974934139) + W(6, 1039868489, -1105739319, 1057217669, -1086525384) + W(7, 1034776664, 1034922130, 1037598609, -1112419405) + W(8, 1047779928, -1087515051, 1044254259, -1113468278) + W(9, 1007581568, 1015381448, 1035805671, -1098926044) + W(10, -1134624240, 1036139674, 1031626785, 1037495244) + W(11, 1015872616, -1124461564, -1113253902, 1017385676); sum2 = W(0, -1136384493, 1036526786, 1028719631, -1123632092) + W(1, -1145098603, -1122280548, 1023814631, -1099879539) + W(2, 1030342243, 1043747658, -1102737141, -1130733945) + W(3, 1033659202, 1034332004, 1046758826, 1050427835) + W(4, -1112406001, 1014543213, 1017810163, 1013925981) + W(5, -1093436173, -1100447595, -1119158797, -1123106681) + W(6, 1009967381, -1106516740, 1051870663, 1041231786) + W(7, 1034292458, 1019870319, 1017781727, -1101585218) + W(8, 1042788701, 1045006578, -1107586767, 1013053757) + W(9, -1118180802, -1131784625, -1114786901, 1010389989) + W(10, -1143106923, -1119739637, -1141961139, -1112082470) + W(11, -1113417628, -1117114477, 1032164569, 1012643781); WS(-1081763615, -1092598780); - sum1 = W(0, -1130922677, -1114318275, -1127997567, 1028467828) + W(1, 1023598927, -1139280241, -1122514966, 1026414532) + W(2, -1121576984, -1127358845, 1017010415, 1002425203) + W(3, -1136114845, 1017564438, -1088500870, 1061837768) + W(4, -1116904946, -1123987795, 1015393433, 1021344041) + W(5, -1098266094, 1035926493, 1037585875, -1136160989) + W(6, -1137786397, -1095352826, 1061435536, -1095349722) + W(7, 1040151266, -1131570741, 1023447063, -1116164091) + W(8, -1148866211, -1114585584, 1031742785, -1116123969) + W(9, -1142668459, -1123782681, 1039772482, -1114677716) + W(10, 1007413957, 1020007637, -1140705115, 1012849463) + W(11, 1024002537, -1116920883, -1128808099, -1126849079); sum2 = W(0, 1021958137, 1034408685, -1106091708, -1098486326) + W(1, 1028745769, 1024682325, -1117837187, 1036094407) + W(2, -1147105428, -1110159069, 1031154711, -1116910593) + W(3, 1026312941, 1033683959, -1094093059, -1088187103) + W(4, -1105512708, 1039406737, -1115513274, -1124949158) + W(5, 1061646324, 1055280585, -1100598283, -1117359799) + W(6, 1037370871, -1091894288, 1058519893, 1045036050) + W(7, -1109806227, 1026080301, -1112242113, 1027011647) + W(8, -1106569597, 1045721104, -1117345257, -1117139296) + W(9, 1033686533, -1107943508, 1037199097, 1034325435) + W(10, -1144974476, 991455177, -1107052036, 1010459130) + W(11, 1030945863, 1039418143, -1124920152, -1112397476); WS(1049187708, 1061143407); - sum1 = W(0, 1032206028, 1046469409, 1044620591, -1086760535) + W(1, 1049164066, 1022165171, -1121811767, 1033070593) + W(2, 1020031147, -1113096094, -1132628435, 1009114287) + W(3, 1032297330, 1049873346, -1111788011, -1092765627) + W(4, 1051671486, 1034535880, -1136528167, 1050639650) + W(5, -1089881571, -1083700943, 1044844041, 1024964917) + W(6, 1005295654, 1041319460, -1127219501, -1092202425) + W(7, 1037004161, 1011091807, 1031846890, 1041542033) + W(8, 1033106537, 1011207027, 1026161438, 1038185039) + W(9, -1136496587, 1036329419, 991465499, 1015330121) + W(10, -1134373563, 1018308239, 1032778794, 1043869975) + W(11, -1112918515, 1026637361, 1019220893, 1032129132); sum2 = W(0, -1123557888, 1024038368, 964997605, -1123190992) + W(1, -1170950771, 1009594487, -1139662759, 1022314468) + W(2, 1007232143, 1040909663, -1119781676, 1011035391) + W(3, -1120649660, 1016353740, -1112234110, 1035500288) + W(4, -1122589660, -1122952928, 1021700488, -1149024430) + W(5, 1052797849, 1059925772, 1021322900, 1015425876) + W(6, -1119215196, -1127462832, 1032636001, -1123381020) + W(7, -1124742672, 1024335912, 1025758640, -1109226016) + W(8, -1096670151, -1110751472, 1037872214, -1115520552) + W(9, -1134635263, 1022909500, -1103246759, -1114698588) + W(10, -1123038904, 1026100870, 1025396502, -1106595065) + W(11, -1095307242, 1016687528, 1025386190, -1128653768); WS(-1080960863, 1058419411); - sum1 = W(0, -1118700722, -1111066847, 984198859, 1043965403) + W(1, -1108783427, 1000248987, 1032983255, -1112208894) + W(2, -1099715572, -1113907195, -1113914551, -1124179019) + W(3, -1122641758, -1099579692, 1049479517, 1050672334) + W(4, -1105019770, -1128328213, 1033094082, -1090459763) + W(5, 1062349342, 1061713555, -1095692932, 1023738862) + W(6, -1121000958, -1107128402, -1099059374, 1059583022) + W(7, -1099879371, -1131329315, -1133773881, -1107276892) + W(8, 1033076198, -1121054998, -1108028092, 1027231576) + W(9, -1141737059, -1116550064, -1125040759, 1024684126) + W(10, 1024533736, -1113801521, -1120123854, -1103159313) + W(11, 1037355536, 1026513898, -1110661700, 1007580489); sum2 = W(0, 995719700, -1129327601, -1125739202, 1029045123) + W(1, 1025141617, -1154923092, -1114687459, 1021214658) + W(2, 1027238209, 1037994429, -1113434302, 1007115993) + W(3, 1024240180, 997717028, -1120915257, 1036441804) + W(4, 1032546636, 1003062850, -1115935924, 978476974) + W(5, -1078687396, 1066236156, 1035362808, -1118441375) + W(6, 1025427056, -1140454571, -1111104335, 1022342240) + W(7, 1033358736, 1017727844, -1123062148, 1010080137) + W(8, -1128218828, 1028953671, -1166615662, -1129048983) + W(9, 999440794, 1002330866, -1147995690, 1024857232) + W(10, -1165027863, 1019778022, -1131128122, -1152746908) + W(11, -1128526870, -1126806088, 1024563904, 1009762473); WS(-1082880574, -1095080656); - sum1 = W(0, -1120399523, -1111736159, -1111698940, 1037879414) + W(1, 1037066756, -1118524245, -1123397517, -1128373242) + W(2, 1019423266, 1028697399, -1119567216, 1027581671) + W(3, -1135116544, 1025039907, -1092929515, 1062200098) + W(4, -1131199446, -1139610160, -1168421181, -1127950106) + W(5, -1098702381, 1023355236, 1027882718, -1139561152) + W(6, -1131259136, -1098593297, 1060991762, -1094756999) + W(7, 1038218895, 1005358744, 1037719400, -1106461210) + W(8, 1018082074, -1115312044, 1022591155, -1113962893) + W(9, -1113348279, 1024172498, 1036669022, -1106391640) + W(10, -1118950442, 1026868195, 1030740495, 1028249110) + W(11, -1114016273, -1109491766, -1141634128, -1126548648); sum2 = W(0, 1007561151, -1106890729, -1144059530, 1010626011) + W(1, -1140206187, -1152147163, -1118820752, 1031296198) + W(2, -1112391017, -1114880200, -1136937433, -1120281594) + W(3, -1128452386, -1110907715, 1056169840, 1052511775) + W(4, 1034255225, -1114711449, -1121745985, 1032462388) + W(5, -1096446085, -1094697844, 1033067226, 993102387) + W(6, -1114861795, 1035962501, 1031556034, 1056886944) + W(7, -1104164393, -1120009849, -1121584151, 1035033495) + W(8, 987032615, -1129701328, 1013679559, -1122813977) + W(9, -1120079456, 982365671, -1138039959, 980377326) + W(10, -1115367679, -1118918686, -1129117272, 1035951051) + W(11, -1119286197, -1126702674, -1137374445, 1006646323); WS(1058795070, 1058351276); - sum1 = W(0, -1129226172, -1106246658, 1041614193, 1041522846) + W(1, -1106977045, -1140271486, 1032650784, -1132244111) + W(2, 1048401911, 1041471472, 1031926461, -1130658915) + W(3, -1134152362, -1102574120, 1050141831, 1033352747) + W(4, -1121658742, -1115542891, -1122312016, 1028257624) + W(5, -1088102699, 1030285885, -1124591186, -1119417531) + W(6, -1145265749, 1004724909, -1093353638, 1056599450) + W(7, -1107883356, -1155196377, -1118796187, -1128587973) + W(8, -1112285036, 1049138668, -1114299650, 1003429157) + W(9, 1017891569, -1150296521, -1122892680, 1043369227) + W(10, -1130730345, -1125742491, -1131365684, -1107598873) + W(11, -1120116589, 1040658126, 1034850634, -1137642362); sum2 = W(0, 1018264792, -1109681111, 1028734812, -1104210606) + W(1, 1025579416, 1029305888, 1019878456, -1134735936) + W(2, -1093714299, -1099909667, 1032419228, -1113499692) + W(3, 1020074080, -1106212594, 1034660210, -1098896203) + W(4, 1010388000, 1025031188, -1143212320, 1037009054) + W(5, 1047288883, 1060586916, 1030286292, -1130541520) + W(6, -1148803168, -1132238328, 1031452084, 1042866381) + W(7, -1107165918, -1127563664, -1127882992, 1032289620) + W(8, -1112028563, -1109339206, 1019446368, 1026005920) + W(9, 1017409120, 990246720, -1115169564, 1023925320) + W(10, 989303425, -1123344268, -1131165168, 1004132864) + W(11, 1020410832, -1112228144, 1029468412, 1009015280); WS(1043816952, 1056206353); - sum1 = W(0, -1132948972, -1115461859, 1034684352, 1037119642) + W(1, -1107088436, -1144087781, 1024900084, -1107172113) + W(2, 1038250028, 1039626815, -1110088668, -1116127087) + W(3, -1150680698, -1097009915, 1061195075, -1095598055) + W(4, -1113187289, -1117712852, 1016358425, -1102438229) + W(5, 1051576078, 1056604231, -1102307882, -1114968828) + W(6, -1160444148, 1024199571, -1088975285, 1057172865) + W(7, -1103288997, -1134624362, -1115326124, -1148961467) + W(8, 1010078034, 1029312608, -1122873761, 1012385158) + W(9, 1019123435, -1130723763, -1107729186, 1039764276) + W(10, 1032878393, -1114736693, -1120343575, -1144998513) + W(11, 1022450003, -1112740858, 1034042985, 1002559709); sum2 = W(0, -1135809827, 1031002711, -1136033931, -1114169661) + W(1, -1107967067, 1027957130, -1140675011, 1009667595) + W(2, 1025543601, -1124911966, -1108557845, 1004385158) + W(3, -1137384851, -1156373420, -1123691685, 1056449903) + W(4, -1096033675, 1015282250, -1147988326, 1010789683) + W(5, -1105219090, 1044469394, -1118550723, -1115586301) + W(6, 1019754904, -1122328477, -1118075063, 1046754031) + W(7, 1020360378, -1120013003, -1172160176, -1135703979) + W(8, -1111692677, 1034039333, 1005574774, -1130287690) + W(9, 1006265798, 1016962928, -1131889022, 1024901767) + W(10, 1025982043, -1127946498, 990940844, -1135289651) + W(11, 1010975355, -1111731157, 1036125487, -1169619760); WS(1049886076, 1034318367); - sum1 = W(0, -1140544720, 1022042959, 1021784769, -1131075883) + W(1, -1142660485, -1160888244, 1006465467, -1106141033) + W(2, 966352080, 1032360624, 1029412697, -1121174096) + W(3, 1025588553, -1104462159, 1059646174, -1086897182) + W(4, 1042100949, 1017231209, -1118154094, -1100197533) + W(5, 1051735858, 1059041662, -1106256562, -1150715274) + W(6, 996302474, 1029682164, -1085821075, 1057694799) + W(7, -1106530518, 1024907260, -1111905052, -1112348667) + W(8, 1029991670, 1036690656, -1121375714, 1015672965) + W(9, -1125961261, -1117824763, -1111853843, 1030592201) + W(10, 1017125029, -1120397516, -1122979160, -1123002959) + W(11, 1031029131, -1155480906, 1014936522, -1124207481); sum2 = W(0, -1110846605, 1032320648, 1027180085, 1029603693) + W(1, 1033577170, -1112673640, -1118194097, 1027617785) + W(2, -1144235925, 1030911393, -1134544211, -1123614185) + W(3, -1143898437, 1000132981, 1031570329, -1119293171) + W(4, -1126616369, -1129974305, 1019764549, -1102116254) + W(5, 1058710858, 1058397441, -1096477332, 1018853209) + W(6, 1008325379, 1026769453, 1031557517, -1104852463) + W(7, -1103611475, 1036639048, 999139301, -1131321177) + W(8, -1129394727, -1097515304, -1115701158, 1018401637) + W(9, 997400075, 1008054267, -1131248001, -1123234663) + W(10, -1119810656, 1024391909, 1024689095, -1118482095) + W(11, -1120094485, -1106708620, -1134741251, 1017993989); WS(1058429118, 1064863249); - sum1 = W(0, 1021156518, 983001563, 1054264097, -1097350840) + W(1, -1175841770, 964768362, 1024394983, -1115666854) + W(2, 1049468028, -1099725362, 1024539904, -1149024695) + W(3, 1020219616, 1039490386, 1055450440, -1115114453) + W(4, 997016493, 1012766063, -1131178666, 1046648007) + W(5, -1104196510, -1085827188, 1043203980, 1022718592) + W(6, 1016100640, 1017911734, 992909240, -1100930382) + W(7, 1033767351, -1136266891, 1007341951, 1043757188) + W(8, -1104186631, -1128095056, -1119513801, 1035657141) + W(9, 994206685, -1128564932, -1122765517, -1118903024) + W(10, -1131557236, 1016423590, 964693930, 1045299318) + W(11, -1105268364, 1023907580, -1106015350, 1029236260); sum2 = W(0, 1005391535, -1106696811, 1050575955, -1100156814) + W(1, -1098256564, 1028021126, 1018096716, -1121907467) + W(2, 1051313221, 1060662591, 1029467086, -1129063320) + W(3, -1135288360, 1026226746, 1047952814, 1068258385) + W(4, -1142136447, -1131820748, -1121648533, 1031305614) + W(5, -1081952512, -1074657656, 1051661425, 1008147176) + W(6, 996459166, 1032267559, 1040750694, -1095314974) + W(7, 1035381379, -1168737402, -1130245220, -1111725659) + W(8, 1031579134, 1036231973, -1107714686, 1020424408) + W(9, -1123582348, 1028271694, 1007524520, 1044691450) + W(10, 1022647148, -1129848660, 1033610651, -1108648643) + W(11, 1034169827, 1044987108, -1100160947, 1024695710); WS(-1083443454, 998713176); - sum1 = W(0, 1032696047, 1040709994, 1040929033, -1087559501) + W(1, 1049786774, -1146095614, 1026355790, 1040668906) + W(2, 1032459486, -1103862520, 1037090637, 1033091241) + W(3, 1024354795, 1036398699, 1012490030, -1102928053) + W(4, 1047072725, 1024780023, 1034252472, 1051748575) + W(5, -1097753826, -1093112676, 1050721065, 1037512365) + W(6, 1012872363, 1035129883, -1114537329, -1092883854) + W(7, 1039546228, 1024615038, 1032281789, 1044965075) + W(8, -1100635790, -1099081393, 1011437457, 1037286498) + W(9, 1027888345, 1031400701, -1103916602, -1104850339) + W(10, 1009955155, 1036010231, 1016830581, 1048807512) + W(11, -1098186970, -1112352715, -1114553850, 1033653631); sum2 = W(0, 1035861958, -1098289107, 1026686124, -1096172460) + W(1, -1113513064, 1019723703, -1161872500, -1119785106) + W(2, 1049978705, -1107697817, 1027596044, -1121217732) + W(3, -1113290777, 1033623622, -1098402027, -1091833397) + W(4, -1098063812, 1033198374, -1137177342, 1045692473) + W(5, 1024040864, 1013412750, 1031079096, -1107709748) + W(6, 1034613598, -1106425659, 1053770527, 1046082211) + W(7, 1012376430, 1038124498, -1103597964, -1117971136) + W(8, -1127968019, 1057075430, -1095279992, -1112843267) + W(9, 1038756242, 1019694879, 1049090628, 1047895771) + W(10, 1045163433, -1120386622, -1111249467, -1114046628) + W(11, 1052585151, -1102204197, -1100444173, 1034273086); WS(-1086369662, -1078015058); - sum1 = W(0, 1024279387, 1042615374, 1054091094, -1095346029) + W(1, 1050416872, -1113840294, -1100066053, -1106499229) + W(2, -1113085188, -1103658220, -1111759460, -1141254386) + W(3, 1039589628, 1049518735, 1050614757, -1097514477) + W(4, 1048966812, 1032485602, -1104719791, -1115604002) + W(5, -1103236040, -1100854410, -1122281110, -1113439156) + W(6, -1113174076, -1127523972, 1047781504, -1097175852) + W(7, 1043919349, -1119980106, -1125885710, 1049389829) + W(8, -1108066658, 1026529231, 1032565272, 1039770777) + W(9, -1111149795, -1102519338, 1041501469, -1104719494) + W(10, 1027138593, -1104628175, 1024511623, 1042212335) + W(11, 1048227542, -1099302313, 1036646913, 1032389542); sum2 = W(0, -1092512531, -1098738343, 1063615535, 1009177475) + W(1, -1119750726, 1030476954, -1093473489, -1088925799) + W(2, 1062426368, 1026425874, 1012050343, -1120184004) + W(3, -1081280020, 1042571962, 1067242406, 998962046) + W(4, 1025403720, 1031881676, -1076988140, 1043337888) + W(5, 1066811408, -1096426756, -1129159374, -1116680638) + W(6, -1081342477, 1033193400, 1066297017, 1022780060) + W(7, 1023044380, -1135563955, -1086556968, 1010020371) + W(8, 1060290312, 1026166068, -1115355073, 1004442726) + W(9, -1107875638, -1102154130, 1052028857, 1017583668) + W(10, 1026819560, 946141982, -1121362077, -1126174974) + W(11, 1037059936, -1119102823, -1127777686, 1034449190); WS(-1129707456, 1007685382); - sum1 = W(0, -1134894751, -1098519836, 1040671079, 1044073412) + W(1, -1109530006, -1134057701, 1044154267, 1030394337) + W(2, 1013414869, 1041040503, 1035376874, 1028314315) + W(3, -1111052786, -1107874844, -1103276809, 1038778991) + W(4, -1105794628, -1112561176, 1038046773, -1118678129) + W(5, -1098881194, -1107344299, -1139987723, 992777541) + W(6, -1192544411, -1111301144, -1110522396, 1048980909) + W(7, -1108336721, -1112828028, -1128991721, -1115520098) + W(8, -1107120076, 1052479600, -1112546431, -1132207293) + W(9, 1035051017, 1015910765, 1033063921, 1049200001) + W(10, 1023468750, 999515194, -1122391156, -1103669035) + W(11, -1111557603, 1051478546, 1018554845, -1119107128); sum2 = W(0, -1137824107, -1110122518, -1137081539, 1039063461) + W(1, -1158403413, -1124656554, -1126465818, 1033612180) + W(2, -1106894813, 1047362418, -1117814890, 1023374342) + W(3, 1005362547, -1116868027, 1045165527, 1067526191) + W(4, -1136640937, -1115663214, -1158497445, 1039739597) + W(5, -1106604299, 1071589227, 1044031039, -1148955153) + W(6, -1119770196, 1037998233, -1138568822, 1061860820) + W(7, -1133800170, -1123862185, 1021074352, -1112420682) + W(8, 1039276731, -1077533661, 1031122886, 999718675) + W(9, -1138544392, 1025116420, -1104439342, -1073373771) + W(10, -1106196407, -1139157324, 1034621027, -1120069279) + W(11, -1113398206, -1094637864, 1031315442, 1025985948); WS(1033791472, -1138498893); - sum1 = W(0, -1143657507, -1102835756, 1024249065, 1044190455) + W(1, -1107762844, 1008291608, 1014781903, -1108646231) + W(2, -1130492804, 1021681616, -1112711792, -1128240816) + W(3, 1029133201, -1108649138, 1008218246, -1115040338) + W(4, 1019895480, 1025256893, 1018917100, -1106020223) + W(5, 1054388603, 1058377694, -1123372431, 1014932868) + W(6, 998381448, 1003669472, -1092207694, 1046387590) + W(7, -1111491159, 1007448080, 1016812674, -1113672010) + W(8, -1132293500, 1049136345, -1123523050, 1008489644) + W(9, -1118545247, -1114481905, -1112726231, 1017676194) + W(10, -1123035739, -1112884042, -1137667330, -1127743919) + W(11, -1119594899, -1119541597, 1028355707, 1001709096); sum2 = W(0, 1014470821, -1106657768, 1034825132, 1006830039) + W(1, -1104684796, -1124459301, -1120344268, -1106292024) + W(2, 1032219219, -1101139832, -1114556582, 1008940380) + W(3, -1114330800, 1049926230, 1057813788, -1102461554) + W(4, -1111886229, 1029827978, -1106002658, 1054743689) + W(5, 1049962194, -1103958261, 1050373872, -1133852786) + W(6, 1024999308, -1112305858, 1051810194, -1098680718) + W(7, 1035894797, -1109427720, -1126273593, -1122403994) + W(8, 996027236, 1040205712, -1100520246, 1024816377) + W(9, -1127411221, -1116955850, 984340447, -1109277736) + W(10, 1014102650, -1117160816, -1123975632, 1030827431) + W(11, -1114551452, -1111240037, -1106040331, 1003623824); WS(1060089726, 1074996161); - sum1 = W(0, -1117558175, 1046443391, -1083103171, 1040714346) + W(1, 1044503809, 1023987857, 1029119241, 1039893948) + W(2, -1093429938, 1021452133, 1030628716, 1027140771) + W(3, -1141503452, 1041448800, -1088988175, 1048946821) + W(4, 1038933875, 1026874120, 1010789890, 1035829124) + W(5, 1032282738, 1021975771, 1038764813, 1026271340) + W(6, 1037081758, 1041862066, 1035486030, 1040332065) + W(7, 1032949373, 1034225415, -1120312844, 1028398131) + W(8, -1142682180, -1090323173, 1041097413, -1113760891) + W(9, 1027150698, 1038548631, -1111879740, -1112512014) + W(10, 1029165798, 1028642719, 1021223318, 1047369209) + W(11, -1105296983, -1095359061, 1046714577, -1134282558); sum2 = W(0, -1130708327, -1131662151, 1027052068, -1104634511) + W(1, 1037500532, -1117309872, -1156760442, -1160974837) + W(2, -1119116140, -1148640061, 1028521640, -1132259207) + W(3, 1011385503, -1122121264, 1006726095, -1101053828) + W(4, 1041142688, -1129219511, 1005458237, -1104012424) + W(5, 1053197196, 1050251696, -1121651972, -1148190653) + W(6, 1015786967, 1025508020, -1150821434, 1043632028) + W(7, -1105814552, 1005943453, -1121500080, -1106371091) + W(8, 1032166230, -1115585403, -1117076340, -1120252400) + W(9, 1023017975, 1032453110, -1116451706, 1032061998) + W(10, -1120517680, 1024831312, 1008927007, -1107217673) + W(11, -1143126685, 1045664978, -1103126409, -1126349911); WS(-1081408895, 1057237802); - sum1 = W(0, 1016592219, 1050393725, -1096948620, -1099121222) + W(1, 1042338077, 1026859007, -1135569700, 1025037351) + W(2, 1021729271, -1114451665, 1033766733, 1023688209) + W(3, 1019913045, 1042967287, -1123436299, -1104931659) + W(4, 1036822635, 994107237, -1134722237, 1042881918) + W(5, -1107250293, -1092679092, 1042265522, 1017621813) + W(6, 1020337237, 1033060699, 1047123275, -1098053310) + W(7, 1043883210, 1033354815, 1019971573, 1038993285) + W(8, 1037602588, -1091584672, 1042862441, -1147819555) + W(9, 1015924209, 1028206140, 1034435092, -1092984777) + W(10, 1029491668, 1035642823, 1027236154, 1041649576) + W(11, 1044331459, -1089381821, 1042007901, 963919445); sum2 = W(0, -1127968320, -1092240358, 1057542400, 1016463192) + W(1, -1094079665, 1037438732, 1036537032, 1030963640) + W(2, -1105653780, -1097383073, 1040975890, 1019305024) + W(3, -1112917417, -1097473768, 1053316325, 1038201480) + W(4, -1101066411, 1028884816, 1020801080, -1109029546) + W(5, 1058712288, 1052867895, 1013027424, 1010261952) + W(6, 1019615648, -1116583352, 1043894648, -1123129572) + W(7, -1118015492, 1027371024, -1127208552, 1028578068) + W(8, -1093453186, -1141347136, -1117505000, -1113360113) + W(9, 1023589392, -1113404853, 1034405836, 1006791808) + W(10, -1111557726, 1034904608, -1121416948, 1041090246) + W(11, -1094394128, 1037486484, 1044943944, -1104647878); WS(-1076745215, 1064070508); - sum1 = W(0, 1019383636, 1043437193, -1100863080, 1019299111) + W(1, 1041928012, 1018313975, -1138649581, 1030286820) + W(2, 1033675388, 1027453406, 1031909515, -1136380470) + W(3, 1029667879, 1040316179, -1102225484, -1110289513) + W(4, 1043406276, 1026991539, -1127653591, 1048543741) + W(5, -1084687593, -1082029409, 1044625233, -1136351578) + W(6, 1027426151, 1029763954, -1111626052, 983973284) + W(7, 1044339921, 1027257018, 1022926189, 1039947283) + W(8, 1026499316, 1031954367, 1039879984, 1022902273) + W(9, 1004012708, 1025479577, -1122995300, -1118301831) + W(10, 1022733729, 1026798858, 1016119660, 1041368223) + W(11, 1026134601, 1016553765, 1012331970, 1027440187); sum2 = W(0, -1131696089, 1012459087, -1112347233, 1039451269) + W(1, -1158657302, -1129595249, 1008718823, -1135045027) + W(2, -1125420309, -1110618065, 1007247903, 999949222) + W(3, -1149188438, -1118135053, 1041969824, 1024383435) + W(4, 1015365577, -1130814181, -1140198251, 1033739972) + W(5, 1052325325, 1052741682, 1034080133, -1140370763) + W(6, -1129603953, -1142742214, 1029891118, -1121721953) + W(7, -1110453303, 1020979581, 1007479839, 1015462815) + W(8, -1120072309, -1095903036, -1162307222, -1132990667) + W(9, -1141563590, -1126906553, 1017890385, -1105015368) + W(10, -1122346803, 1008938691, 1018622169, -1135479163) + W(11, 1016803437, -1098230278, 1021342643, -1137891195); WS(-1094563452, 1051169575); - sum1 = W(0, -1154622990, 1018130713, 1040428881, -1120902330) + W(1, -1113835211, 1019319877, 1029393378, 1035203109) + W(2, 1032896399, 1039535746, 1021002107, 1036762426) + W(3, -1117775501, -1113234793, 1049040808, -1102863965) + W(4, -1107942972, -1135300966, 1033996553, -1106127031) + W(5, -1112183035, -1090463816, -1105904891, 1040237135) + W(6, -1136342582, -1114335628, 1048012112, 961094679) + W(7, -1148767576, 1032716400, 1018491963, -1112874623) + W(8, 1044702279, -1098092733, -1124337998, -1137189022) + W(9, 1032030382, 1023872671, 1032915973, 1033184663) + W(10, 1006151100, 1037223880, 1015760954, -1110067034) + W(11, 1035998904, 1029109433, -1110631596, 1013167238); sum2 = W(0, 1028413027, -1121092135, 1017337743, -1137632446) + W(1, 999930971, 1027578971, -1120070369, -1130520759) + W(2, 1037177446, -1104029390, 1033133092, -1114678191) + W(3, 1012563150, -1120753460, -1106734706, 1048794348) + W(4, -1111694827, 1030530567, -1111535757, -1097640928) + W(5, 1051800696, 1050145982, 1041394994, -1119592910) + W(6, 1011962278, -1098008778, 1035782812, -1114477541) + W(7, -1118971109, 1001961835, 1009477102, 999766235) + W(8, -1106510696, 1047938812, -1127041263, 1024176823) + W(9, -1153318262, -1122757360, 1010623246, -1111017918) + W(10, 1020162151, -1115486877, 974823129, -1129371381) + W(11, 1028214977, -1123769252, -1124747017, 1007999422); WS(1057759166, -1088449289); - sum1 = W(0, -1129635066, 1044873994, -1087389198, -1116302487) + W(1, 1048786726, 1017011581, 1025446574, 1037627635) + W(2, -1097118359, 1022204225, 1039292653, 1021371937) + W(3, -1144519245, 1041685209, -1089578865, 1022125102) + W(4, 1045860709, 1025212662, 1017539549, 1033910011) + W(5, -1129568803, -1105345911, 1045748274, 1031878029) + W(6, 1026395242, 1039651930, 1010566389, -1122366800) + W(7, 1027479143, 1013486066, -1122678010, 1035038013) + W(8, 1030050103, -1097803608, 1033498658, 1007580942) + W(9, 1025431320, 1039320958, -1110122707, -1119554634) + W(10, -1161253492, 1028360045, 1024557433, 1038868536) + W(11, -1112614790, -1126568107, 1010965710, 1015223035); sum2 = W(0, -1162281894, 1033992046, 1042856153, 1038465062) + W(1, -1093956780, 1024284423, -1124547002, -1149048922) + W(2, 1036788056, 1046094595, -1100316514, 1035682376) + W(3, -1150111187, 988741862, -1112557119, 1060179844) + W(4, -1090501223, -1122577303, -1135956229, -1132541637) + W(5, -1097406101, 1049669935, 1022378118, -1113139255) + W(6, -1145634890, -1132011310, -1121853795, -1101657128) + W(7, 1045140163, -1130855582, 965409433, 1024739191) + W(8, -1104384368, 1042681611, -1121116299, -1118824057) + W(9, -1123274137, 1008671821, 1032013500, -1111116605) + W(10, 1035479824, 1006161754, 1024679583, -1129294934) + W(11, -1147059498, 1027020519, -1131272734, -1124922046); WS(-1086987838, -1100233980); - sum1 = W(0, 1015308459, 1041765192, -1105415847, 1042444900) + W(1, -1111075669, 1003799483, -1122325985, 1028094431) + W(2, -1114108890, 1041449686, -1106140165, 1034767973) + W(3, -1116672610, 1042485054, -1092596043, 1049087917) + W(4, -1110170951, -1144225139, 1032904116, -1118546351) + W(5, 1046690691, -1128556841, 1034284768, 1033288361) + W(6, -1141168915, -1118052589, 1054244345, -1089307961) + W(7, 1026589088, 1010481109, 1033123257, -1116818498) + W(8, 1049735534, -1094503991, 1030527932, -1121578684) + W(9, 1001375875, 992241989, 1040724504, -1104029377) + W(10, 1008796465, 1030765989, 1015833828, 1015146386) + W(11, 1041637233, -1100869156, -1123717612, -1124977133); sum2 = W(0, -1128145157, -1100557855, 1057648426, 1048654145) + W(1, -1122215769, -1133425768, 1026284201, -1106810438) + W(2, 1054522141, 1057115188, -1103409060, 1017140792) + W(3, 1012811840, 1042787919, -1098531848, 1046636853) + W(4, 1046426252, -1118227807, -1136599052, 1044596046) + W(5, -1073275189, -1074262745, 1035358469, -1143532160) + W(6, 992541697, 1038174685, 1061008073, 1044984510) + W(7, 1036107748, 1016191398, 1011005728, -1104618112) + W(8, 1059653331, 1060082709, -1104639697, 981079778) + W(9, -1127430370, -1166127490, 1035655860, 1034192337) + W(10, -1130597644, 1006837720, 995789721, -1116633305) + W(11, 1017274260, 1033697834, -1112828961, 1021901152); WS(-1092446204, 989212831); - sum1 = W(0, 1007124942, 1048125124, -1138101793, -1141178857) + W(1, -1102978326, 1034583667, -1116778591, -1131432602) + W(2, -1106585464, 1019782926, -1115311760, 1015089582) + W(3, 1027403088, 1042237585, 1016240146, 1036610823) + W(4, -1110971902, 1027127900, -1121715541, -1138060917) + W(5, 1037962972, -1101006449, -1114322839, 1008360193) + W(6, 1019921952, 1027977243, 1053191424, -1094792341) + W(7, 1031189102, 1028625507, 1020332096, -1126238792) + W(8, 1053622732, -1089064867, -1137835047, 1017386452) + W(9, -1139218425, -1131884420, 1043276755, -1101892348) + W(10, -1132849129, 1009465805, 1020381759, 1024321015) + W(11, 1049124886, -1107274751, -1110951117, 1008208785); sum2 = W(0, -1120159352, -1088595541, 1060560783, 1061831343) + W(1, -1089452071, -1101640393, -1125980662, 1050146519) + W(2, -1093128727, -1098317152, 1042347964, 1038452583) + W(3, -1131578305, -1090859444, 1057304640, 1057012981) + W(4, -1095995319, -1105624394, 1028063854, -1107336769) + W(5, 1071289406, 1069689231, -1096815763, 1041229675) + W(6, 1021975879, -1105868965, -1087527230, -1097221007) + W(7, -1104502319, 1037791301, 1033612769, 1041431951) + W(8, -1086794372, -1086042421, 1049524493, -1143180172) + W(9, -1119579693, -1112749441, 982969010, 1033122226) + W(10, -1104150062, 1029453052, 1040487308, 1042279365) + W(11, -1089785065, -1088997285, -1135764460, 1049121852); WS(-1080642303, 1037515653); - sum1 = W(0, 1014399585, -1123461796, -1115821917, 1037702505) + W(1, -1105260875, -1134503912, 1040389217, 1009459592) + W(2, -1138501592, 1046330151, -1113097082, 1032999462) + W(3, 1025436037, -1118449912, 1046808963, -1088063230) + W(4, -1166545913, 1011659972, 1035628117, -1111999897) + W(5, 1046961203, 1048171302, -1112931778, 1033647146) + W(6, 1032176658, 1042449564, -1085801589, 1046621083) + W(7, -1116953058, 1020514160, 1019714410, -1098862637) + W(8, 1042823052, 1033619294, -1108126015, 1023868127) + W(9, 1031481267, 1015874414, 1032561937, 1017602698) + W(10, 1033606503, 1030447848, -1129425897, -1108656118) + W(11, 1022709518, -1172911161, -1161936349, 1015791986); sum2 = W(0, -1139497271, -1104932637, 1000924601, 1034980171) + W(1, -1102656208, -1154378706, 1025910769, 1043978669) + W(2, -1116100213, 1042493673, 1038409695, 1025837919) + W(3, -1105297083, -1105480129, -1102785010, 1044002411) + W(4, -1098474508, -1109802618, 1037339247, 1037617885) + W(5, 1049988969, 1050036780, -1122964745, 1036616991) + W(6, -1111547600, -1107402541, 1045831134, 1039942071) + W(7, -1106907325, -1132149525, -1123186639, -1105522985) + W(8, 1040977948, -1097804729, 1028039731, -1111839940) + W(9, 1029488041, 1011577705, 1036894407, 1042714488) + W(10, -1112976714, 1040500443, -1137152287, -1102258444) + W(11, 1025599417, -1139888185, -1112698813, -1114191023); WS(1060124606, -1084472548); - sum1 = W(0, 1012638700, -1112711971, 1024524352, 1032623962) + W(1, -1115629480, 1027484509, -1131934189, 1021193865) + W(2, 1017460401, -1117271615, 1023262959, -1157409515) + W(3, -1129347279, -1125331574, -1113956442, 1049120342) + W(4, -1108495481, 1010910287, -1138043955, 1048955067) + W(5, -1094951982, 1015143283, 1031640934, 1021584239) + W(6, 1007380511, -1106488069, 1048203795, -1110142007) + W(7, -1129214986, -1144904917, 1022374575, -1115361884) + W(8, 1005249701, 1024310560, -1136673413, 1017598403) + W(9, 996895579, -1120058426, 1026650437, -1121731240) + W(10, 1017029987, -1145343061, 992489843, -1118477310) + W(11, -1129456851, 1036683482, -1115998674, 1014521967); sum2 = W(0, -1113301049, 1041723134, -1119425470, 1012563935) + W(1, 1013366251, -1135264199, -1129519836, 1018887182) + W(2, -1123219625, 1021107126, -1131491053, 1017265018) + W(3, -1113144608, 1065721494, -1082046556, 1032971141) + W(4, -1132479565, -1135106943, -1114997262, 1081282167) + W(5, -1068115046, -1092304788, 1028331651, 927030725) + W(6, 1028189537, 1053752802, -1091841582, -1120681827) + W(7, 1021570574, 983594844, -1144798799, 1004635839) + W(8, -1126716683, 1026059029, -1132445755, -1137356791) + W(9, -1135227415, 1024321495, -1149813598, 992723582) + W(10, 1010781703, 959859164, -1123606042, 1032429021) + W(11, -1137534547, -1121765421, 1024141029, -1123588459); WS(1064307390, 997943845); - sum1 = W(0, 1016504192, -1110031838, -1108555962, 1047561626) + W(1, -1114174882, 1004953741, 1004931163, -1124632947) + W(2, -1129767067, 1003984285, 1017992857, 1018940039) + W(3, 1001468389, -1106796660, -1106350773, 1053522405) + W(4, -1106382906, 1000370245, -1125536771, -1132488742) + W(5, -1097456765, 1050670238, -1136221548, 1015934681) + W(6, 1024701821, -1111862756, 1040312105, -1128004006) + W(7, -1123896954, 1011062590, -1157300426, -1111316170) + W(8, -1110123941, 1039422954, 1020844396, -1128259885) + W(9, 1008115882, -1153319146, 1030600762, 1005773541) + W(10, 1015300557, -1153739770, 1014991280, -1116314499) + W(11, -1109063375, 1042190650, 1024320647, -1130969505); sum2 = W(0, 1036505224, -1100095598, 1039944480, -1110028565) + W(1, 1016119595, 1017378303, 1018720963, -1119632397) + W(2, 1033659023, 1025734363, 1015545311, -1126149289) + W(3, 1037554666, -1082101932, 1064933062, -1103479495) + W(4, 1036578506, 1022196513, 1035136259, -1072130218) + W(5, 1074634461, 1012777017, 1036162128, -1118704038) + W(6, -1131720942, -1090292986, 1057038142, -1132873326) + W(7, -1120419990, 1020047721, 1012123245, -1114842502) + W(8, 1046242606, -1117820012, -1115011900, 1033886326) + W(9, 1027168757, -1108983905, 1018437263, -1117294599) + W(10, 1004277346, -1136709697, 1024471767, -1105383800) + W(11, 1041395450, 1033191694, -1113427773, 1024978781); WS(1053812476, -1113586226); - sum1 = W(0, -1130399840, -1111011390, 1007197394, 1037708373) + W(1, -1122978308, -1139049030, 1028349447, -1120416825) + W(2, -1105796643, 1044272829, -1110423782, -1125249991) + W(3, 1021963321, -1107941440, 1056809437, -1093131829) + W(4, -1122097703, 1011721762, -1121520129, -1106086226) + W(5, 1046348585, 1057081835, -1099751719, -1114497366) + W(6, 1020769785, -1129958415, -1090756230, 1059679544) + W(7, -1102044582, 1018253471, -1115853964, -1107644952) + W(8, 1050300257, -1119895572, -1111488955, 1022041005) + W(9, 1021860117, -1122155502, -1116443513, 1040260199) + W(10, 1019054925, -1121197023, -1121122124, -1114352785) + W(11, 1041113720, -1110926804, -1156322407, -1135672898); sum2 = W(0, 1015672618, 1010541588, -1115998566, 1020421847) + W(1, -1129704409, 1015113530, -1121994623, 1032866568) + W(2, 1011616452, -1095022641, 1020628925, 1017019595) + W(3, -1149412980, 1044676778, -1107438884, -1097106911) + W(4, -1112769863, 1022483811, -1127744422, -1124040172) + W(5, 1058620442, 1015017230, -1113422252, 1015061518) + W(6, 990134373, -1102290659, 1049322309, -1104275347) + W(7, 1039268635, -1114030797, 1024671460, 1029499881) + W(8, -1104592911, 1045525693, 1026741584, -1136765715) + W(9, -1132259460, -1120084193, 1035840939, -1119993661) + W(10, 999745387, -1131682952, -1125579600, 1001699435) + W(11, -1123886068, 1037165892, -1126762930, -1134246014); WS(1059863230, -1098226968); - sum1 = W(0, -1111154474, -1130042625, -1124092147, -1126659421) + W(1, -1116454602, -1109234699, 1033627108, 1044463840) + W(2, -1125693093, 1045974478, 1040744732, 1026252457) + W(3, -1111220881, -1098768819, 1043860042, 1040108899) + W(4, -1149847241, -1103478147, 1018934285, 1036585799) + W(5, -1094381437, -1098844542, 1043775752, -1107008620) + W(6, -1156119577, 1041677635, 1034781361, 1051479065) + W(7, 1046003792, -1127254569, -1108034825, -1100472134) + W(8, 1038465479, -1096809363, -1121805723, -1105262391) + W(9, 1035708952, 1038444026, 1027036095, 1040658808) + W(10, 1037992790, 1038964162, -1116166225, -1111999396) + W(11, 1019243847, 1003830125, -1131289879, -1116821910); sum2 = W(0, 1031860762, 1008804487, 1036033743, -1130814575) + W(1, -1114717025, 1042429978, -1114215534, -1119320351) + W(2, -1105317049, -1126605754, -1103884858, 1019583714) + W(3, 1037917300, 1028769566, 1033869945, 1029943513) + W(4, -1097519272, 1050527129, -1123072391, -1145928741) + W(5, -1104666827, 1058632863, -1084821476, 1057878257) + W(6, -1121765219, -1118791492, -1103277106, 1010033985) + W(7, -1091781337, 1047090522, 1036233577, 1035112755) + W(8, 1043081028, 1033184724, -1108906997, 1050006554) + W(9, -1113082189, -1119166399, -1110309063, -1124066564) + W(10, -1105454190, -1116436299, 1007761049, 1034891236) + W(11, 1003334201, -1146667244, -1124982586, 1037673833); WS(1053829756, -1108691549); - sum1 = W(0, 1014621415, 1034972923, -1105089900, -1121242915) + W(1, 1024842558, -1125107735, -1117035633, 1031518451) + W(2, -1146432572, 1011744694, -1195363583, 1024600093) + W(3, 1017668333, 1028891034, -1111069516, -1099260407) + W(4, 1035963185, -1111257697, -1121088251, 1043029617) + W(5, 1052288956, -1096216885, 1043236853, 1022444749) + W(6, -1113943163, 1037608353, 1043183409, -1109446679) + W(7, -1104376301, 1008767270, 1027915142, -1118505878) + W(8, 1040529537, 1033001703, -1110826184, 983774736) + W(9, -1117882340, 1008280866, -1127832039, 1023717270) + W(10, -1108863440, 1021787123, 1018110476, -1114328254) + W(11, 1025673432, 1038283409, -1136644866, -1122279626); sum2 = W(0, 1011466728, -1153535168, -1121363658, -1113493290) + W(1, 1016979229, -1121975877, -1128158188, -1133074596) + W(2, -1108077390, 1031842286, -1114077565, 1032726750) + W(3, 993685376, -1111924694, 1048370655, -1096696142) + W(4, 1032702600, -1126878203, 1021341187, 1041916532) + W(5, -1088803436, -1097359431, 1051606360, 1020447303) + W(6, -1125064327, -1115375045, 1050909934, 1066069354) + W(7, -1108957150, -1115472084, 1016637363, -1111577830) + W(8, 1048268187, -1102058354, -1106393780, 1011253904) + W(9, -1135616946, -1121861231, 1028734454, -1112810542) + W(10, -1104652034, 1032484333, -1142265296, -1139232914) + W(11, 1033829714, -1108918948, -1124153420, -1135690267); WS(1043379192, -1131322837); - sum1 = W(0, -1129021027, -1109595831, 1033800339, 1042153991) + W(1, -1099711038, 1026187331, -1148980502, -1141769560) + W(2, 1040943040, 1016895818, 1029537886, 1023917269) + W(3, -1117253390, -1131540259, -1099641090, 1040857522) + W(4, -1104535414, 999787984, 1015261926, 1038059198) + W(5, 1019360940, -1103092216, 1032384358, -1137467256) + W(6, 1024719214, 1043151230, 1047704456, -1091529984) + W(7, 1043292971, 1021851650, -1130947836, 1040366611) + W(8, -1120007803, -1100986498, 1031568104, -1117455240) + W(9, 974083843, 1036650848, 1032688054, -1116706574) + W(10, 1019020464, 1021119266, 1010796022, 1032003186) + W(11, -1135300928, -1114490317, 1026900536, -1124200964); sum2 = W(0, -1127801857, 1028175283, -1129802997, -1133354170) + W(1, -1129332011, 1029358411, -1143073539, 1010285366) + W(2, 1022418743, -1111757330, 1032847739, -1119713292) + W(3, -1106914355, 1045024365, -1109183829, 1035388549) + W(4, 1028119663, 984677997, -1114698807, -1107796176) + W(5, 1055188047, -1099199714, 1027769667, -1126683209) + W(6, -1129241721, -1093181393, 1060464193, -1108056884) + W(7, 1015260775, -1117802232, 1034854605, -1094857339) + W(8, 1038631095, 1042537531, -1123722407, 1025618013) + W(9, 1015357631, -1104001534, 1035894131, 1019867695) + W(10, 1021694327, -1116557581, 1026781991, -1106206681) + W(11, -1121422795, 1010545294, -1120402439, 1021478623); WS(1049844732, -1121310639); - sum1 = W(0, 1023733410, 1044402267, 1053233309, -1096212219) + W(1, 1051767783, -1114613442, -1099209689, -1106734859) + W(2, -1108848000, -1103164857, -1109302031, -1129199659) + W(3, 1040893204, 1050332331, 1049912979, -1099336615) + W(4, 1050917291, 1033787229, -1102957277, -1111686974) + W(5, -1098618899, -1097562740, -1121562509, -1111886543) + W(6, -1114244983, -1122456058, 1048539349, -1096335583) + W(7, 1042792075, -1121890370, -1136674298, 1049981942) + W(8, -1111429758, 1033031043, 1039550692, 1041151474) + W(9, -1108461358, -1102278760, 1039273110, -1102589972) + W(10, 1008842338, -1104020956, 1021220348, 1043895987) + W(11, 1048170180, -1101337719, 1041281742, 1031699907); sum2 = W(0, 1051830333, 1040398919, -1088812275, -1112895824) + W(1, 1030823820, -1120174945, 1052363768, 1056364330) + W(2, -1088095023, -1128031249, -1126124865, 1022839272) + W(3, 1062286287, -1105094784, -1083945825, -1110939052) + W(4, -1131257287, -1113476028, 1068323273, -1117763636) + W(5, -1086712736, -1122350162, 1034881723, 1031923437) + W(6, 1062941652, -1117097644, -1085128967, -1107088013) + W(7, 993374262, -1149114843, 1058036233, -1135317262) + W(8, -1090471655, -1117471490, 1022005418, -1131972943) + W(9, 1038399576, 1045469136, -1096613184, -1128774604) + W(10, -1124473506, 1015689530, 1029358050, -1127713443) + W(11, -1118175248, 1023889083, 1006015479, -1114795832); WS(997080576, -1130763300); - sum1 = W(0, -1113905570, -1121320815, 1038521748, 1025325853) + W(1, -1108459484, -1123369669, 1030153879, -1108108727) + W(2, 1032364321, -1131460303, -1152289285, -1111143084) + W(3, -1117230256, -1100762033, 1051702873, 1040312882) + W(4, -1099800679, 1018134009, -1152616277, -1090117932) + W(5, 1069923213, 1063008042, -1092045374, -1116551136) + W(6, -1146808706, -1109500574, -1104049339, 1056019095) + W(7, -1100849447, 1015899783, -1112646432, -1102311764) + W(8, 1028696893, -1115439812, -1105934578, -1120248394) + W(9, -1186209359, -1119610882, -1120830317, -1125581089) + W(10, 1028735898, -1113190874, -1120216576, -1099135446) + W(11, 1030578386, -1116447004, -1108771165, -1120342084); sum2 = W(0, -1130955153, 1025142055, 1025405091, 1041203911) + W(1, 1034798579, -1107186683, -1115062100, 1033634795) + W(2, -1124058081, -1151569099, -1098708869, 1041850582) + W(3, -1114768924, -1114031272, 1047530952, -1160505239) + W(4, 1048498835, -1097808347, 1040485485, -1115074190) + W(5, -1104495565, 1065129660, -1095909934, 1045395705) + W(6, -1102247365, -1110799922, 1038913214, -1115442088) + W(7, -1105078519, -1106337339, 1040365390, 1039570131) + W(8, -1102056033, 1037120419, 1024518769, 1007217475) + W(9, -1105380703, -1112489130, -1123724877, -1145632358) + W(10, -1109649658, -1152795787, -1134789779, 1035629875) + W(11, -1104428707, 1035843769, -1117935125, -1124566009); WS(-1078383103, 1059446981); - sum1 = W(0, -1139864362, -1142609202, -1105667544, 1048881003) + W(1, -1110989208, 1019807480, 1022304576, 1008862865) + W(2, -1100327790, 1047898440, 1029966423, -1128249884) + W(3, -1117916615, -1109139429, -1098424968, 1053051896) + W(4, 1023833874, -1114518074, 1007335089, 1032501274) + W(5, -1089810345, -1104044598, 1040575921, 1013296733) + W(6, -1119884647, 982044231, 1033240873, 1051763270) + W(7, -1114053146, -1110353213, 1022280942, -1115332063) + W(8, 1049118183, -1113330784, 1041606896, -1126749570) + W(9, 1023668405, 991223187, -1140016273, 1027424455) + W(10, -1122699729, 1021514772, 1034312731, -1102309771) + W(11, -1110413061, 1032557738, 1041157596, -1121516731); sum2 = W(0, -1143648694, 1050457027, -1090901428, -1095258955) + W(1, 1047388223, 1034828442, 1022767513, -1104882348) + W(2, 1017677825, -1116653154, -1125154789, -1149114774) + W(3, 963325627, 1052893834, -1090554669, 1030383529) + W(4, -1114292033, 1040557770, -1138915747, -1122824043) + W(5, 1048412513, 1063122641, -1118207917, 1005930742) + W(6, 1040530304, 1019582897, -1101863176, -1089352859) + W(7, 1048190601, 980397999, 1031585165, -1094902239) + W(8, -1104950416, 1057380402, -1102824630, 1033506230) + W(9, 1008260859, -1113748748, -1120605391, -1106433792) + W(10, 1038107916, -1115355457, -1120690652, -1090635807) + W(11, 1056780417, 1049388154, -1104842210, -1136517107); WS(-1104952056, -1073278929); - sum1 = W(0, -1144211169, -1099507218, 1047627264, 1043300637) + W(1, -1098196346, 1030331294, 1031125659, -1116651974) + W(2, -1113308557, 1037274304, -1126577137, -1122667056) + W(3, -1121100585, -1101060075, 1054491321, -1102367022) + W(4, -1102852173, 1026346581, -1142367854, -1105066053) + W(5, 1039149624, 1051689271, -1106731162, -1120693369) + W(6, 1025675017, -1131576359, -1106626380, 1044811828) + W(7, -1111689619, 1018492983, -1114298540, -1114707952) + W(8, 1042584197, -1128472513, -1126957444, -1140414731) + W(9, 1036563163, -1120605819, -1128818827, 1045578618) + W(10, 992521004, -1128018583, -1122834968, -1111900952) + W(11, 1039018645, -1115669626, 1025441875, 997033420); sum2 = W(0, -1117577133, 1036324905, 1012676607, -1164734594) + W(1, 1039853902, -1110394349, -1139616023, -1124977156) + W(2, -1115101040, 1032695755, -1116113854, 1006188424) + W(3, 997820975, -1120808104, 1041273688, 1041759226) + W(4, 1041255405, -1120661488, 1028627780, -1109376562) + W(5, 1049990275, -1096754642, -1106762918, 1033535767) + W(6, -1114909048, 1029259135, 1043064430, 1041324783) + W(7, -1111929038, 1021759445, 1032747040, -1145526876) + W(8, 1039154681, -1094055114, 1025837595, 1023476809) + W(9, -1116006677, 1022442689, 1027909669, -1098711698) + W(10, -1130147608, -1133986843, 1030832637, 983753970) + W(11, -1115224952, 1023440264, -1112181665, 1029342490); WS(1057403966, -1096678293); - sum1 = W(0, 1015545167, -1133819725, 1037006758, -1110196161) + W(1, -1111752718, 1028708905, 1013920108, -1127594402) + W(2, -1136130453, -1123399563, 1041684833, -1119121787) + W(3, 1030182836, 1031500952, 1042283546, -1086200264) + W(4, 1047364560, -1120221088, 991347091, -1107540753) + W(5, 1040431359, 1060132444, -1104881213, 1006406689) + W(6, 1031028372, 1042502792, -1084295706, 1049379651) + W(7, -1113607001, 1002061113, -1130110920, -1120427420) + W(8, 1042737160, 1001749345, -1117219726, 1026883950) + W(9, -1137745417, 1023814022, 1019878434, 1023472436) + W(10, 1017968636, -1124476270, -1127755335, -1113612941) + W(11, 1042334622, -1123659840, 1008021369, 1011156129); sum2 = W(0, -1178786588, -1129322914, -1116170217, 1036181740) + W(1, 1016863918, -1132924585, 1027650789, -1117835702) + W(2, -1106357388, 1050236879, -1107702296, -1127926494) + W(3, 1004569898, -1120140062, 1012300621, 1029537087) + W(4, -1115347042, 1007741857, 1010647389, -1110565129) + W(5, 1051050908, -1121260831, 1019718506, -1147888890) + W(6, -1130907066, 1046200355, -1094299123, -1105419536) + W(7, 1018471790, -1122466004, -1128412421, 1035331810) + W(8, 1038925264, -1104188032, 1035623426, -1132432621) + W(9, 1000455394, 1040609034, -1110352470, -1148832482) + W(10, 1031812039, -1132484471, 1019136642, -1114775527) + W(11, 1028674911, 1009994365, -1129304944, -1146317634); WS(1056335484, -1129697442); - sum1 = W(0, -1118615510, 1026825265, -1102686619, 1045269336) + W(1, 1031523962, -1140818205, -1123816285, -1162479083) + W(2, -1175208362, -1122870505, 1025178018, -1112741005) + W(3, 1016357093, -1123245334, -1112742573, 1056143939) + W(4, -1115481871, 1004860403, -1126548591, -1115166368) + W(5, 1012633705, 1022501065, -1098786498, -1121817826) + W(6, 1017679973, 993334229, 1048503365, 1044007618) + W(7, -1107348056, -1134864917, -1125007109, 1009460392) + W(8, -1110640192, 1043433395, -1104721331, -1142571619) + W(9, -1130509569, -1117686884, 1010107581, 1037226473) + W(10, -1124234681, -1120701013, -1127256452, -1110259820) + W(11, 1008538193, 1040188728, -1112073470, 1004599859); sum2 = W(0, -1140731697, -1126783010, 1035005186, -1110815467) + W(1, -1144657885, -1127206230, 1018164054, -1144859189) + W(2, 1011714049, 1039236492, -1130754383, -1146205013) + W(3, -1116322329, -1148034885, -1112384840, -1109778149) + W(4, -1113329105, -1113225660, 1033668632, -1111621890) + W(5, 1057652336, 1053123628, -1107649638, 1012470213) + W(6, -1110091010, 1034430751, -1103655808, -1113563636) + W(7, -1112793157, -1113811608, 1006827755, -1133278289) + W(8, 1035575897, 1009902097, -1136830370, -1126431906) + W(9, 1024608202, -1134565598, 1007536733, 1031837967) + W(10, -1131576514, 1007646275, 978878091, -1106732021) + W(11, 1017810394, 1032913014, -1118754368, -1123083034); WS(1064654654, 1035088379); - sum1 = W(0, -1123150274, -1101065371, 1052021669, 1034671630) + W(1, -1103122974, -1124628232, 1013730923, -1104968795) + W(2, 1043838624, -1116995686, 1025043295, -1123853974) + W(3, -1124984926, -1104298005, 1050953841, -1125221929) + W(4, -1102292982, -1122875259, -1143080352, -1097917367) + W(5, 1053857683, 1053311748, -1101557747, -1129945790) + W(6, -1115541655, -1115560637, -1098028717, 1054064059) + W(7, -1102206963, -1115475969, -1120446591, -1112072243) + W(8, -1118042236, 1056948345, -1099829586, 1010096420) + W(9, 1019709882, -1121553409, -1117850604, 1047317764) + W(10, -1123986585, -1120157778, -1123168830, -1101025669) + W(11, 1024509393, 1051915779, -1105952782, 1010117900); sum2 = W(0, -1115290116, -1109338596, 1052546267, -1101682429) + W(1, -1106866549, 1027635895, 1036300391, -1120873277) + W(2, 1031940424, 1045633640, -1121551223, 1021591180) + W(3, -1109664288, -1133763869, 1041363997, -1094977574) + W(4, 1008614181, -1119215823, 1023887773, -1110763968) + W(5, 1046589307, 1050150667, -1110488084, 1009099129) + W(6, 1031338337, -1104363651, 1038758869, -1104681827) + W(7, -1120223295, 1016354897, -1112746552, -1111086518) + W(8, 1026186944, -1121584221, 1035823152, -1115537942) + W(9, 1029647363, 1014654409, 1011886363, 1042076972) + W(10, -1111033402, 1012736237, -1123357025, -1113327782) + W(11, -1114411312, 1033926660, 1046305164, -1109553196); WS(-1088190206, -1108558078); - sum1 = W(0, -1109712467, 1048826552, -1117596347, 1045129740) + W(1, -1145103958, 1040739958, 1034096473, -1100191472) + W(2, -1104233509, 1021528052, 1015098342, -1095362037) + W(3, -1111610193, 1051587686, -1112703594, -1123092480) + W(4, 1033306871, 1043699492, -1111503908, -1114238856) + W(5, -1118548075, 1045282957, -1105600408, -1112734841) + W(6, 1029528067, -1124911644, -1094857227, 1041941490) + W(7, -1116887040, -1106244021, -1109918121, 1053388852) + W(8, 1040678692, -1121835291, 1043572363, 1044475255) + W(9, -1130336610, -1101598429, -1102065648, 1050563972) + W(10, -1101594283, -1100499697, -1110290409, 1049826386) + W(11, -1108498290, 1032628503, 1041251987, 1015959598); sum2 = W(0, -1140036524, 1033121292, 1020537037, -1094559771) + W(1, 1042598592, 1048560917, -1122134368, -1135675176) + W(2, -1102563608, -1090683436, 1049536131, 1043095342) + W(3, -1124742331, 1022385651, 1017232470, -1089829937) + W(4, 1015761873, 1060516603, 1023368729, 1037868584) + W(5, -1097085277, -1081905013, -1122385293, 1068776853) + W(6, 1025643512, -1113410705, 1026038978, -1085580324) + W(7, -1119606047, 1062905414, -1117935205, 1034815986) + W(8, -1107749524, -1093433405, 1034046493, 1053234619) + W(9, 1029315286, -1106876578, -1116418603, -1100509010) + W(10, 1037794408, 1023262329, -1121900993, 1029051910) + W(11, 1013163432, -1107168757, 1020109569, 1038509970); WS(1048802172, -1118644607); - sum1 = W(0, 1022629891, -1112271863, -1115934246, -1112205646) + W(1, 1050188943, -1125264263, 1001330921, 1008285357) + W(2, 1007889405, -1137992085, 1025826270, -1127716075) + W(3, -1147098739, -1106982824, -1110669107, 1044651974) + W(4, 1026008921, -1113499645, 1023807923, 1020475895) + W(5, -1095657203, 1050363724, 1011316531, 1026946398) + W(6, -1129374813, 958183765, -1113474437, 1050921091) + W(7, -1106529387, -1121270209, 1028532286, 1025640422) + W(8, -1090481180, 1050665633, -1131537104, 1021652689) + W(9, 1031375324, -1133565569, -1104303995, 1037811271) + W(10, -1125009457, 1014192325, -1151549405, -1106868493) + W(11, -1104624276, 1049383075, 1022847857, -1142930963); sum2 = W(0, 1016559128, -1089262209, 1053795811, 1058569170) + W(1, -1094475155, 1008650912, -1119933527, 1032931419) + W(2, -1108360154, -1097574423, 1036603460, -1121755244) + W(3, 1008526536, -1094914643, 1052999976, 1052760357) + W(4, -1106271635, 1039081818, 1034816070, -1096197918) + W(5, 1069558608, 1058007152, 1022028102, 1004102711) + W(6, 1018959568, -1101210129, -1103281588, -1106340652) + W(7, -1121182797, 1033515588, 1026554777, 1049415798) + W(8, -1085501184, -1101474305, 1027756295, 1032461240) + W(9, -1112891495, -1128790619, -1098019814, -1114646508) + W(10, -1124734105, -1118822413, 1046177388, 1043157162) + W(11, -1088254262, -1096632714, 1015426864, 1043397723); WS(-1085648446, -1079079370); - sum1 = W(0, 1031831473, 1036117159, 1049939273, -1094329359) + W(1, 1040633606, 1023486628, -1114079994, 1003975776) + W(2, 1042007752, -1097850009, -1134555900, 1019647980) + W(3, 1031367567, 1044164867, 1043312672, -1089391360) + W(4, 1041283678, 1023951387, -1118896788, 1045647319) + W(5, -1095211959, -1087218668, 1044809099, 1014099708) + W(6, -1123680847, 1033826253, -1122554975, -1100203021) + W(7, 1046447947, 1017251780, 1033718927, 1041970952) + W(8, -1116359196, 1033960979, 1042238738, 1031788713) + W(9, -1123944253, 1024952417, -1176880640, -1108529239) + W(10, 1024390649, -1146375056, 1033541103, 1040029267) + W(11, 1026974961, -1111794397, 996515216, 1033511473); sum2 = W(0, 1019169584, 1042983019, -1098354632, -1099987280) + W(1, 1048978343, -1118546716, -1120973142, 1009997472) + W(2, -1106283039, 1032814660, -1103033329, 1022934360) + W(3, 1033125970, -1103915398, 1033722376, -1095179878) + W(4, 1055664562, -1110281795, 1025364316, 1036688212) + W(5, 1062322516, 1032770062, -1097173506, 1045599869) + W(6, -1109812797, -1125420780, -1098634798, -1109050948) + W(7, -1103688168, -1119010038, 1040314133, -1119986230) + W(8, 1057333054, -1097734639, -1173745415, 1038965178) + W(9, -1108282977, 1034277286, -1102308141, 1034195486) + W(10, -1107997912, 1007528912, 1018923536, -1117630132) + W(11, -1125368820, 1049154263, -1098308929, 1035253180); WS(-1089355774, -1078290086); - sum1 = W(0, -1122950775, 1037182841, -1118638572, -1121667553) + W(1, 1009124079, -1115334660, -1112691207, -1124344033) + W(2, 1041047393, -1104403323, -1138062223, -1126199861) + W(3, 1023290087, 1046400294, -1098349922, -1099164822) + W(4, 1044398104, -1136525567, -1107733500, -1118583361) + W(5, 1057481334, 1054069421, -1149431076, -1110719762) + W(6, -1146188190, 1042531744, -1139289650, -1097191323) + W(7, 1044515332, 1015659149, -1132821263, -1121639475) + W(8, -1109625472, 1041114291, -1120573261, -1121643278) + W(9, -1112282369, -1137408791, 1026873009, -1120861012) + W(10, -1120947806, -1122889719, -1116356099, 1018516820) + W(11, -1139389015, -1139200383, 1017011067, -1120569352); sum2 = W(0, -1120919296, -1124567280, 1037030993, -1120629799) + W(1, -1106639281, 1020211370, 1009843654, -1107129213) + W(2, 1043380414, -1102119519, 1030878171, -1126825280) + W(3, -1132368064, 1020831927, -1109288357, -1112537154) + W(4, -1118412551, -1144175329, 1020138111, -1098918731) + W(5, 1059483198, 1064361176, -1093377806, -1146281491) + W(6, 1029564211, -1132836513, -1119273466, -1104145236) + W(7, -1123848756, -1135251423, -1115205032, 1010227332) + W(8, -1106893419, 1043150197, -1103899854, 1028327527) + W(9, 1016741875, -1118685376, 1028452918, -1117770026) + W(10, 1024207514, -1128215590, -1119663171, 1026001154) + W(11, -1135273053, 1019055438, -1109882780, 1024565629); WS(1064975294, 1066308158); - sum1 = W(0, 1031747776, -1119071204, 984462229, -1132055971) + W(1, -1148253029, -1126913907, -1106142801, 1032019633) + W(2, 1045090381, -1108909198, -1110036442, 1036419718) + W(3, 1028818885, 1041375482, -1093262116, 1038243096) + W(4, 1036945928, -1121925745, 1001228109, -1112793497) + W(5, 1049965274, 1021279149, -1115536386, 1019907753) + W(6, -1115396498, 1013499583, 1052662103, -1090377239) + W(7, 1034061985, 1032108124, 1041342669, -1123968938) + W(8, -1113450905, 1040402543, 993049059, -1109636927) + W(9, -1108139113, 1024220311, 1035427697, -1107965954) + W(10, -1113141447, 1032825796, 1027821620, 1020544662) + W(11, -1138282267, -1116422289, 1016907357, -1128061041); sum2 = W(0, 1016610899, -1118189976, 1027283971, 1028895363) + W(1, -1113530321, 1007846553, -1135553471, 1018031354) + W(2, -1118352328, 1032145382, -1123867563, 1011272254) + W(3, -1163068737, -1120752887, 1042584076, 1042427003) + W(4, -1099207121, 1010785270, -1147979120, 1035872696) + W(5, -1095799786, 1073605475, -1075418961, 1026092591) + W(6, -1121296916, 1034250650, 1009508653, 1056095764) + W(7, -1091570337, 1030054693, -1139692219, 1022157658) + W(8, -1121907329, -1130051225, -1113117501, 1019567305) + W(9, 1007282246, -1131969269, -1148404200, 1025403981) + W(10, -1124635978, 1012575724, 1019770181, -1131641536) + W(11, 1013257077, -1121748387, -1123610989, 1018865930); WS(1062423998, 1020226002); - sum1 = W(0, -1122384152, -1116470612, -1095861522, 1055717600) + W(1, -1128557498, -1133541800, 1000976853, 1015809956) + W(2, -1125526476, 1034182342, -1136390676, 1025071548) + W(3, -1122957973, -1115150860, -1101122465, 1052715645) + W(4, -1101688288, -1121585121, -1140430696, -1100102424) + W(5, 1051208664, 1053221217, -1097231798, 1026360261) + W(6, 1018079658, -1099378776, 1045734276, 1041738487) + W(7, -1114764537, -1127628368, -1116871589, -1102397253) + W(8, 1040938184, 1038184662, -1107259340, -1121765359) + W(9, 1021042950, -1121061927, 1045437908, -1114085178) + W(10, 1034631967, 1018430000, -1130305609, -1097083551) + W(11, 1049869175, 1019939330, -1105843464, -1122412137); sum2 = W(0, -1125184611, -1124729770, 1045115043, 1058112728) + W(1, 1023628890, 1007171579, 985313435, -1132095255) + W(2, -1117207517, 1067077185, -1158219675, -1118062236) + W(3, -1181860650, 1028760415, 1036693207, -1107623537) + W(4, 1043689375, 1000645119, -1124740239, 1011065519) + W(5, -1088457353, -1080660794, 1020427720, -1160295467) + W(6, -1132645547, 1033849803, -1096437481, -1109418981) + W(7, -1110185484, 1015083304, 999484231, 1015359010) + W(8, 1048821220, -1117188353, 1032363474, 1023561702) + W(9, -1125466771, -1140486285, -1107942084, 1027196953) + W(10, -1121893121, -1134577643, 1024683619, -1125848669) + W(11, 1027562883, -1127975224, 1023023798, -1158549787); WS(-1085592318, -1113086899); - sum1 = W(0, -1127342656, -1105245475, -1104578161, 1053241687) + W(1, -1103827813, -1138537863, 1024334944, 1029597578) + W(2, -1117644382, 1041591201, 1020278010, 1015573096) + W(3, -1107952998, -1104926592, -1101901257, 1051692021) + W(4, -1097952575, -1110174988, 1034498345, -1110412429) + W(5, 1053247055, 1044816720, -1110749814, 1033881662) + W(6, -1131633306, -1103724998, 1051300307, 1042909421) + W(7, -1106968399, -1116328992, -1110168462, -1098176238) + W(8, 1051451939, -1124765258, -1105195378, -1113141267) + W(9, 1033648125, -1115323711, 1049307889, -1143558503) + W(10, 1027981559, 1028312016, -1119681052, -1098367950) + W(11, 1053283054, -1113485404, -1102600950, -1113790704); sum2 = W(0, 1019423143, -1118706158, -1110500850, 982325064) + W(1, -1117883328, -1145733922, -1134200265, -1122995556) + W(2, 1021681136, -1106847870, -1115095323, 1001371122) + W(3, 1022335641, -1113839515, -1121978030, 1042414810) + W(4, -1112736275, 1019850892, -1126211289, -1123774588) + W(5, 1048787768, 1052221246, -1118959328, -1113736050) + W(6, -1160177640, 1002859666, 1035034344, 1009324191) + W(7, 1026260852, 1023767274, 995157684, -1114460336) + W(8, 1025695056, -1129766425, -1114723897, -1130130145) + W(9, -1138832033, -1131104601, -1126984825, -1136621129) + W(10, 1016807320, -1131688905, -1130236057, 1027754115) + W(11, 1027074464, -1120353368, -1121253912, 992217060); WS(1025516512, -1100199588); - sum1 = W(0, 1010096560, 1021891087, 1041308560, -1106994989) + W(1, -1107391304, 1032706511, 998291066, -1128181387) + W(2, 1015332531, -1097993736, 1040752366, -1115681272) + W(3, 1015136529, -1152435393, 1054580194, -1087955312) + W(4, 1021987303, 1013936722, 1016981531, 1035336779) + W(5, 1043985948, 1049373383, 1016493518, -1153713033) + W(6, -1134306338, 1040424469, -1088067164, 1048585956) + W(7, -1111549299, -1122756060, 1015217585, 1041134374) + W(8, -1097437107, 1044933000, 1015283332, 1028860515) + W(9, 1025573847, -1147235028, -1108043523, 1037061588) + W(10, -1125444197, -1124931799, 1027586712, -1105873140) + W(11, 1024655979, 1041451309, 1025261651, 1010373746); sum2 = W(0, 1024904631, -1115115972, -1128899549, -1100416868) + W(1, 1014205090, -1138213458, -1136864762, 1023564875) + W(2, -1103710322, -1105139728, -1112771593, 1024304323) + W(3, 1005033941, -1114446231, -1140124434, -1107001478) + W(4, -1105823902, 1028369943, 1030076655, -1115188268) + W(5, 1057566767, 1061216146, -1101449249, 1031401203) + W(6, 1022202973, -1099782234, 1051976820, -1114917196) + W(7, -1115621063, -1127316949, 995105737, 1025338591) + W(8, 1009750634, -1107279078, -1123827499, 1002907445) + W(9, 1009257370, -1107689693, 1040613751, -1123762171) + W(10, -1124460977, 1021828037, -1113660547, 1049272645) + W(11, -1105716747, -1112133417, 1019919657, -1121285688); WS(1050734204, -1108852232); - sum1 = W(0, -1111669430, -1116292712, -1122281377, 1027495958) + W(1, -1113568120, -1123139966, 1026854009, -1106093993) + W(2, -1103616254, -1113635568, -1125634353, -1117637392) + W(3, -1115457556, -1104273631, 1027625969, 1042550097) + W(4, -1100906821, -1147736996, 1022285659, -1090233269) + W(5, 1069754213, 1065691213, -1090598793, 999398084) + W(6, -1130768721, -1103820941, -1114752252, 1054098174) + W(7, -1103145534, -1140005358, -1124925681, -1107176543) + W(8, -1130883179, 1026991873, -1107767585, -1123096067) + W(9, 988348114, -1114665965, -1144129324, 1018693905) + W(10, 1007587914, -1120005196, -1117352760, -1103610460) + W(11, 1032882469, 1034282506, -1112131865, -1122062653); sum2 = W(0, 1024214881, -1105712489, -1096328526, 1036545949) + W(1, -1114697429, 1029115040, -1122830075, 1026001227) + W(2, -1089670730, -1104892025, 1027384734, -1127506094) + W(3, 1024710111, -1105988647, -1109313571, 1042923133) + W(4, -1108836817, 1018384918, -1118490155, 1044311614) + W(5, 1057951288, 1050757116, 1046225965, -1118982995) + W(6, -1134765475, -1128591966, 1031038781, 1041007149) + W(7, -1111832237, 1000957030, 1007204875, 1016894538) + W(8, -1135710147, -1111844715, 1020988490, 1018633070) + W(9, 955722144, -1132281374, -1121635711, 982097434) + W(10, -1141601766, -1131312630, -1132418382, -1121103003) + W(11, 1040031313, -1131469166, -1137288635, 1012074251); WS(-1077332287, -1089760701); - sum1 = W(0, 998476811, -1126986618, 1035645275, 1035996661) + W(1, -1111559939, 1002151576, -1146931846, -1106320367) + W(2, 1033143495, 1030948981, -1116749294, -1132098378) + W(3, 1020090684, -1103512376, 1057100532, -1098691810) + W(4, -1114602228, 1020764052, -1115596769, -1106044643) + W(5, 1033806067, 1054020686, -1102410839, -1131285468) + W(6, 1018970620, 1033789092, -1089559024, 1053006209) + W(7, -1114317262, -1143682184, -1117338894, -1121544222) + W(8, -1119052427, 1053247323, -1148875196, -1140686688) + W(9, -1131301080, 1025908912, -1109205213, -1117960094) + W(10, 1040862618, -1112291776, -1134004534, -1120853460) + W(11, 1021655744, -1112997269, 1024305160, -1137942600); sum2 = W(0, 1006079429, 1015506585, -1129173219, -1126961905) + W(1, 1025558752, 1004493969, -1142220161, 1012377004) + W(2, 1019086641, 1027847692, -1121396179, -1129089615) + W(3, -1129651941, 1027444401, 1029291472, -1099113060) + W(4, 1031608500, 1032469225, -1120056293, 1027255740) + W(5, -1087748986, -1071778912, -1132223695, -1117547929) + W(6, 1021210606, -1154390002, 1030702430, 1077548482) + W(7, 1041292060, 1017793536, -1138049810, -1121552483) + W(8, 1046290929, 1017608723, 1030045463, -1115202758) + W(9, 1020679942, 988683875, -1149010889, 1009874569) + W(10, -1116313503, 1024909384, -1144760977, -1149209645) + W(11, 958643736, -1165018915, -1108302337, -1153372770); WS(1054407548, 983325672); - sum1 = W(0, 1028412425, -1105600625, -1148390382, 1033571545) + W(1, 1032293767, -1124427701, -1115456470, 1033490817) + W(2, 1044756246, -1114006910, -1119790070, 1037509878) + W(3, 1017604747, -1115519181, -1103922376, 1059608097) + W(4, -1107101148, 1007976775, 1031921957, 1031550611) + W(5, -1090010995, -1087252051, 1044072953, 1022727275) + W(6, -1121692358, -1103698804, 1062123705, -1094628214) + W(7, 1027680451, 1033962892, 1041128181, -1109550327) + W(8, -1103937189, 1042983319, 1021059262, -1108328080) + W(9, -1131299175, 1030793272, 1039103265, -1106569209) + W(10, 1007158719, 1032055396, 1034097067, 1014014769) + W(11, -1135652511, -1116995186, -1141553278, -1143059662); sum2 = W(0, 1007145536, 1011835040, -1115291423, 1029973058) + W(1, 1036345379, -1106716830, -1108956115, 1040320325) + W(2, -1145921569, -1113530029, -1116109872, 1031627486) + W(3, -1123468231, 1009493536, -1120694127, 1025444390) + W(4, -1106839609, -1106619549, 1003522017, 1036429861) + W(5, 1057547857, 1039825371, 1028735446, 1032586179) + W(6, -1106382527, 1045134298, -1120933925, -1093621604) + W(7, 1043632212, -1135351552, 1023566518, -1132203156) + W(8, -1105348488, 1030401418, 1032927131, -1107014793) + W(9, -1116797301, 1044032552, -1105744806, -1111109931) + W(10, 1031187850, 1030984886, 1016028592, -1103689691) + W(11, 1019566780, 1039637835, -1119043970, -1117261713); WS(1062610366, -1081620328); - sum1 = W(0, 1034909184, 1041975919, 1038564634, -1086061975) + W(1, 1054071881, -1118145809, 1022225638, 1036878493) + W(2, 1032326503, -1097049310, 1038246806, 1033815666) + W(3, 1022593144, 1038275488, 1032775158, -1094128798) + W(4, 1049378869, 984752392, 1034659649, 1049110721) + W(5, -1104434937, -1097332230, 1048167927, 1040915883) + W(6, -1145063906, 1039909252, -1098154666, -1096830529) + W(7, 1037005773, -1127387550, 1029979468, 1050285945) + W(8, -1091716385, 1031802154, -1122539766, 1042582214) + W(9, 1024460554, 1032760119, -1098908862, -1125106744) + W(10, 1023442918, 1025327999, -1129493655, 1052309552) + W(11, -1093908076, 1033460244, -1111713187, 1038395208); sum2 = W(0, 1025388154, -1106689977, -1110560421, 1049316874) + W(1, 983067209, -1121273022, 1001261778, 1031762430) + W(2, -1111104301, -1112011481, 1033280635, 1026153330) + W(3, 1007664153, -1105078255, -1122922762, 1044332351) + W(4, -1133572905, -1116643818, 1018216589, -1117638934) + W(5, 1029938402, -1117360942, 1022258405, 1033323756) + W(6, 1011431705, -1119019386, -1107704269, -1116357646) + W(7, 1016143957, -1123412994, -1124915037, 1039919645) + W(8, 1043034893, -1107523849, -1109485745, 1027380094) + W(9, 1007167865, -1115769810, 1041034358, -1112781805) + W(10, 1010088409, 1016238045, -1118462618, 1041969311) + W(11, 1050092429, -1104673921, -1106654827, 1006440178); WS(-1079099231, 1058224693); - sum1 = W(0, -1136025729, -1098612147, 1040574357, 1044962866) + W(1, -1107948018, -1152707357, 1041807413, 1030021338) + W(2, -1113591959, 1041390773, 1030293261, 1019631368) + W(3, -1113852830, -1101745716, 1035906153, 1038641429) + W(4, -1102747762, -1119110697, 1038775953, -1114342965) + W(5, -1100940817, -1112997607, -1131180663, 1008365619) + W(6, -1130024634, -1109189268, -1110548904, 1053521164) + W(7, -1102886695, -1120409456, -1139925939, -1116898669) + W(8, -1107090858, 1048687519, -1127712365, -1156710253) + W(9, 1032899333, -1169623989, 983487291, 1048553583) + W(10, 1020276366, -1137865855, -1135488689, -1105924753) + W(11, -1105279552, 1049805017, 1033907987, -1120648241); sum2 = W(0, 1026221982, 1031288593, 1025270629, -1105433524) + W(1, 1025604422, 1025361731, -1150712731, -1121646784) + W(2, 1040465550, -1099611845, 1015298833, -1118571342) + W(3, -1135858910, 1020650492, -1102699692, -1077885918) + W(4, 1013887757, 1035533544, 998750602, -1118866549) + W(5, -1090773917, -1073585027, -1111404471, -1115122758) + W(6, 1026066546, -1126679589, -1103726643, -1083499628) + W(7, 1029004921, 1025173545, -1122173835, 1033676882) + W(8, 1038653616, 1072488285, -1128843744, -1132364945) + W(9, 1019885572, -1119823506, 1044175124, 1076879885) + W(10, 1042609155, 982102231, -1114797832, 1024418530) + W(11, 1035909226, 1053754278, -1128976380, -1120827581); WS(1039418864, -1140458522); - sum1 = W(0, 983096624, -1114535995, 1044450572, 1027001827) + W(1, -1117675070, 1035770150, 1029517505, -1145085849) + W(2, -1097839409, 1032347927, 1031259878, -1104931415) + W(3, -1121873782, -1102746926, 1062380387, -1106235793) + W(4, -1105839880, 1033087169, 1019803894, 1028523779) + W(5, -1088253674, -1090653261, 1036696746, -1121428646) + W(6, 1027911414, -1100878768, -1109645966, 1061486174) + W(7, -1097301074, -1120235273, -1108005699, 1038991951) + W(8, -1154916402, 1029669390, 1024178544, 1035324408) + W(9, 1033576274, -1142936385, -1107146685, 1047810758) + W(10, 1038477872, -1108040973, -1135118358, -1125909817) + W(11, -1122115416, 1038152785, 1041849616, 1017003668); sum2 = W(0, -1121567066, 1033267920, -1104421963, -1130139832) + W(1, -1132243276, 1024120715, 1034344084, 1026284945) + W(2, -1103410132, 1037507308, 1034735332, -1109350039) + W(3, -1105011035, 1033899226, 1022298858, -1102818563) + W(4, 1044067085, -1127155070, -1142865888, -1120108491) + W(5, 1057117238, 1003910328, 1041074904, 975508032) + W(6, -1136511728, -1122542627, 1038703002, 1043197066) + W(7, -1101099519, -1117378085, -1106811819, -1120621959) + W(8, 1033583066, -1124006960, -1109459597, 1001772648) + W(9, 1032101677, -1134482876, -1122973141, -1124335993) + W(10, 1041237660, -1113899392, -1113394506, -1114137407) + W(11, 1030826553, -1125132432, -1128301632, -1126301549); WS(1053462780, -1083681865); - sum1 = W(0, 1023511963, 1041747598, 1041497612, -1138339988) + W(1, 1035615616, 1020629658, -1126058411, 1015154794) + W(2, 1018224530, 996055791, 1027711272, -1123213919) + W(3, 1027394040, 1045749945, 1041814811, 1014351349) + W(4, 1040756601, 1032965474, -1118697149, 1048726745) + W(5, -1086401302, -1082085657, 1048515830, -1129047376) + W(6, 993307519, 1043007793, -1115623160, -1096882594) + W(7, 1042139693, -1132054806, 1025756296, 1038169844) + W(8, 1032344226, -1105145572, 1038148425, 1033289129) + W(9, -1131368524, 1024626666, -1127070442, -1110953740) + W(10, 1009997960, -1128695798, 1029589575, 1040782360) + W(11, -1131398580, -1110890258, 1029718722, 1029252236); sum2 = W(0, 1008350928, -1118714967, 1030231193, -1091889801) + W(1, -1108897465, 1032606711, 1011413600, 1024023545) + W(2, -1124778398, -1098641764, 1033453825, -1125648711) + W(3, -1120704007, -1126562655, -1110351493, -1104262464) + W(4, -1106889474, 1025836907, 1027382950, 1034951721) + W(5, 1052754126, 1057762368, 1035809187, -1131934955) + W(6, -1127381517, -1128407708, 1033272406, -1161878816) + W(7, -1132306565, -1134699254, 981904616, -1126139913) + W(8, -1151802072, 1012148800, -1153180738, -1131180247) + W(9, 1015535284, 999360844, 1013432992, 1024540201) + W(10, 1014625240, -1171757551, -1135583391, -1138986423) + W(11, -1123376913, 1031971990, -1118108772, -1140791326); WS(-1099299320, 1056598066); - sum1 = W(0, 1006197652, -1127547996, -1106221946, 1045972807) + W(1, 1004824505, -1119658116, -1128153660, 1041714651) + W(2, -1098261544, 1038366195, -1113181968, 1030219574) + W(3, -1136164796, 1029712499, -1085896508, 1057638589) + W(4, -1113770157, -1129447670, 1035903322, -1128532088) + W(5, 1057218165, 1054413180, 1038963911, 1033715440) + W(6, -1130396894, -1106761055, 1054525467, -1086573266) + W(7, 1033084478, -1128924420, 1036246880, -1121593759) + W(8, 1028130044, -1090476168, 1042818602, -1116035017) + W(9, -1124832314, 1017604226, 1036683414, -1101308500) + W(10, -1130963634, 1030841394, 1029570879, 1017990507) + W(11, 1016287010, -1110319406, -1114724733, 998207538); sum2 = W(0, -1131923124, 1046772351, -1110971235, -1105011941) + W(1, 1028001687, -1121147281, 993280665, 1028557303) + W(2, -1134148898, -1104446514, -1147560296, 1024426003) + W(3, -1127811288, -1107794670, 1043137579, -1096504482) + W(4, -1101129935, 1034898623, 1032538133, -1098564467) + W(5, 1067961229, 1066594258, -1104613803, -1136832302) + W(6, 992174233, -1121892222, -1095277951, -1107079502) + W(7, -1097683180, 1036381319, 1002762140, 1035775413) + W(8, -1099141736, -1090299346, -1129031039, 1009264906) + W(9, 1015088121, -1158807761, 1011333246, -1132433157) + W(10, -1108888578, 1032287279, 992586073, 1019898989) + W(11, -1118039147, -1109952821, 1040568125, -1111357043); WS(-1105186296, -1108555742); - sum1 = W(0, 1040483623, -1105046378, -1118442722, 1040666374) + W(1, 986662468, -1118942975, -1101386974, 1038429012) + W(2, 1042743759, -1109750289, -1103538071, 1040611956) + W(3, 1040816739, 1031828819, -1093958439, 1050019912) + W(4, 1033262923, -1118385334, -1134311356, -1107675004) + W(5, 1030110546, 1040526743, -1121451017, 1012951144) + W(6, -1108915605, 1034430779, 1044698927, -1097473172) + W(7, 1032745156, 1035127903, 1046011615, -1109709717) + W(8, -1103097566, 1045974257, 1041021277, -1100748433) + W(9, -1102638726, 1030173660, 1041159370, -1110364069) + W(10, -1106175813, 1037154391, 1034864637, -1130419297) + W(11, -1111922822, 1017242540, 1032931450, -1121991998); sum2 = W(0, -1127162070, 1014979733, -1114518101, 1016203776) + W(1, 1035296562, -1117887634, -1135271108, -1136185376) + W(2, 1038675289, -1140478504, -1111853852, 1030827904) + W(3, 1003505825, 1028363168, -1105093650, -1089585970) + W(4, 1058969759, -1123277259, 1012864633, -1131143608) + W(5, -1095849351, -1070239185, 1079096535, -1116960146) + W(6, -1123384038, 1033256022, 1028346583, -1078361549) + W(7, 1068193425, -1125445846, 1026898060, -1133517476) + W(8, -1113528611, 1038794260, 1032636395, -1113311282) + W(9, -1134649836, -1120532892, 1028725832, -1125525718) + W(10, 1017911666, 991223090, -1125848258, 1028008335) + W(11, -1117113572, 1005296645, 1032298564, -1134431064); WS(1065442623, 1015025160); - sum1 = W(0, -1115365041, -1113215535, 1018550702, 983382403) + W(1, -1103693946, -1124004468, 1040496438, 1031517084) + W(2, 1044423084, 1017412396, 1032083208, 1040563090) + W(3, -1114325264, -1109245393, -1131936399, -1109909072) + W(4, -1106995843, -1120263275, 1036061554, 1002812769) + W(5, 1034975748, -1099246196, 1024898238, 1012000060) + W(6, 1038370800, 1036804053, 1048106991, -1114225707) + W(7, 1044531927, 1036150809, -1112496600, -1099928488) + W(8, -1107673238, -1129165678, -1096349707, -1113013165) + W(9, 1039123015, 1036473513, 1041344487, 1011581692) + W(10, 1043676418, 1037117105, -1120668655, -1116761110) + W(11, 1019812354, -1138585900, -1110354101, -1128538214); sum2 = W(0, 1010698941, 1023126843, -1106210958, -1122624743) + W(1, -1122034237, -1117968485, 1042699596, -1140656688) + W(2, 1029081919, 1040813712, -1174961495, 1039098482) + W(3, 1048659418, -1095653758, -1118272649, -1097694847) + W(4, 1033474214, -1118912655, 1058578114, -1081184698) + W(5, 1060468587, 996865603, -1102355565, 1020119257) + W(6, 1052277576, -1097586600, 1043044817, -1103459725) + W(7, 1049205466, 1031051049, 1019470633, -1098953045) + W(8, -1108654451, -1128239326, -1112376452, -1108144089) + W(9, 1041036392, 1018118885, 1029721267, 1034766857) + W(10, 1033989555, 1038110136, -1119471849, -1122826054) + W(11, -1130901998, 1000734433, 1017824567, -1114988670); WS(-1115864032, 1039792746); - sum1 = W(0, -1140468214, -1121375417, 1034497081, 1039608980) + W(1, -1113171393, -1132620605, 996096400, -1108218204) + W(2, 1033625894, 1040179481, -1108192053, 1018030914) + W(3, 1010495721, -1109130991, 1055392502, -1093805194) + W(4, -1127063626, 1012649753, -1114956320, -1115276388) + W(5, 1036829073, 1050653566, -1109643980, -1127455572) + W(6, 1013460969, 1040789857, -1088431348, 1049263376) + W(7, -1124542831, -1135717173, -1122072970, -1114444905) + W(8, 1030275655, 1051648994, -1129660583, -1147064482) + W(9, -1127833232, 1026520268, -1111886108, -1121903450) + W(10, 1034831154, -1114505023, -1140762151, -1127271361) + W(11, 1031218972, -1112576115, 1019975176, -1135014713); sum2 = W(0, 1015385693, -1115435752, 1035175215, 1017441239) + W(1, -1112773411, 998363696, 1020691269, -1141202058) + W(2, -1117300235, -1122675471, 1031000417, 1016207247) + W(3, 1015565489, -1111436746, 1033401267, 1055273933) + W(4, -1101083444, -1113092041, 1019337403, 1040267853) + W(5, -1100581516, 1073306798, 1046685605, 1013448250) + W(6, -1132207064, -1114623303, 1041259906, -1073173797) + W(7, -1115311051, -1130370856, -1131086480, 1025609602) + W(8, -1101351817, 1032997632, -1113329498, 1026870685) + W(9, -1163542113, -1140470334, 1020278145, -1122237085) + W(10, 1031244051, -1124843109, 1010427910, -1128429973) + W(11, 1027629029, -1119509251, 1033297372, 1014260054); WS(1060418110, -1122066101); - sum1 = W(0, 1031696780, -1115430516, -1104465800, 1041576533) + W(1, -1122042801, 1028261758, -1124029560, -1129767372) + W(2, -1124342772, 1035204176, -1109435772, 1025573168) + W(3, -1147879495, 1033383950, -1084846132, 1057835449) + W(4, -1106791333, 1024098613, -1123330286, 1032201307) + W(5, 1040589380, -1121351835, 1025265863, 1000233671) + W(6, -1137787811, -1124043956, 1059143665, -1085338500) + W(7, 1037079395, 1020968696, 1025904121, -1135655378) + W(8, 1047669789, 1026196737, 1031201378, -1122702819) + W(9, -1122010711, 1016436406, 1032251443, -1113520196) + W(10, -1120875027, 1016849816, -1131825009, 1011740349) + W(11, 1017074582, 1023559701, 1024540211, -1123483709); sum2 = W(0, -1127836624, 1033364881, -1101679270, 1023580345) + W(1, -1149619356, -1136662275, -1173496113, -1127629564) + W(2, -1105780675, -1119640853, 1033890881, -1122666983) + W(3, 1027284157, -1104916712, -1113070309, -1132739235) + W(4, -1113766541, 1023707939, 1022886010, -1097350377) + W(5, 1061873799, 1062616603, -1112358042, 1028952789) + W(6, 1036751625, -1105423640, -1096904559, 1009507187) + W(7, -1119315178, -1117384012, -1124242822, 1034826035) + W(8, -1105550966, -1098447862, 1045500652, -1137245711) + W(9, 1017945890, -1122986652, -1127473876, -1116534057) + W(10, 1015952658, -1136860123, -1140181115, 1033442485) + W(11, -1108824717, -1115327874, 1033458469, 1001899534); WS(1052277756, 1024619064); - sum1 = W(0, 1029425189, -1120340480, 1055903799, -1093981294) + W(1, -1125235986, 1026200342, -1155801216, -1107014752) + W(2, 1049346130, -1099678446, 1003141514, -1131584400) + W(3, 1030252033, 1038469578, 1057427995, -1098793998) + W(4, 1025012844, 1031806855, -1112675811, 1032327591) + W(5, -1103272826, -1090697510, -1118748640, -1126277858) + W(6, 1025211073, 1034534022, 1040656272, -1103403378) + W(7, 1025335343, 1010568017, -1122395345, 1039704040) + W(8, -1111436999, 1041606598, -1106833215, 1032770798) + W(9, 994289396, -1137717581, 1016775164, 1005246730) + W(10, 1029370155, -1124454216, -1124711713, 1045346698) + W(11, -1134653325, 1013960373, -1099652851, 1034190187); sum2 = W(0, 1023289146, 1045862572, -1095566322, -1087461476) + W(1, 1016132472, 1044890152, 1020437582, 1028786959) + W(2, -1132354231, -1101737384, -1127607289, -1124440021) + W(3, 1009748873, -1120652794, -1090793815, -1083542229) + W(4, -1107157844, 1037463572, 1030199907, 1015917080) + W(5, 1063879108, 1069217208, -1097091848, 1032502373) + W(6, 1007345789, -1117660774, -1107315270, 1056862945) + W(7, -1098187278, 1028169917, 1010063617, -1106003069) + W(8, 1045942315, -1153692567, -1116485608, -1108513707) + W(9, 1018930146, 1039304637, -1106431667, -1111757292) + W(10, 1036040005, 1034190881, -1127799210, -1098471935) + W(11, 1048572904, 1056217861, -1094693884, -1108016950); WS(-1086218302, -1084258561); - sum1 = W(0, 1027347742, 1041008695, 1040638149, -1088163117) + W(1, 1045697689, -1131589088, 1021408948, 1036310380) + W(2, 1041666443, -1103354245, 1033383494, 1033326017) + W(3, -1127633782, 1035524367, 1033011818, -1094269524) + W(4, 1040895122, -1132088142, 1039366096, 1048593117) + W(5, 1050103608, -1122175629, 1042904478, 1042877939) + W(6, -1116749595, -1138037400, -1111907839, -1096387988) + W(7, -1136050786, -1131538396, 1033396118, 1045683171) + W(8, -1097626581, -1103712029, 1018682217, 1039834587) + W(9, -1139872292, 1032120647, -1099416246, -1111740158) + W(10, -1126758410, 1030901630, 1025066091, 1046369740) + W(11, -1095221944, -1117250695, -1121047845, 1034112696); sum2 = W(0, -1116225927, 1020583173, -1120289762, -1116630862) + W(1, 1037488437, -1120774706, 1030773056, 1018516207) + W(2, -1142227828, -1157244503, -1120616119, 1021325617) + W(3, -1122365237, -1121497633, 1024002380, 1045806125) + W(4, -1122845130, -1124264052, 1032148531, 1032012136) + W(5, 1050603076, 1061490298, 1029135782, 1020114521) + W(6, -1127594672, -1111134479, 1040110681, -1104925089) + W(7, -1122119114, -1129316292, 1026422036, -1112679629) + W(8, -1109379336, -1096282325, 1035818151, -1129796491) + W(9, 1023835916, -1123177144, -1102178993, -1103628682) + W(10, -1118358279, 1024324894, -1131330830, -1112996078) + W(11, -1102999759, -1116593585, 1024073644, -1129630471); WS(-1092406524, -1089571522); return clamp(mstd0 + 5.0 * vsum / wsum * mstd1, 0.0, 1.0); } -float GetLuma(float3 color) { - return dot(float3(0.299f, 0.587f, 0.114f), color); -} +shared float inp[507]; -groupshared float inp[507]; +#define CURRENT_PASS 1 -void Pass1(uint2 blockStart, uint3 threadId) { - const float2 inputPt = GetInputPt(); +#define GET_SAMPLE(x) dot(x.rgb, rgb2y) +#define imageStore(out_image, pos, val) imageStoreOverride(pos, val.x) +void imageStoreOverride(uint2 pos, float value) { temp[pos] = (value); } - const uint2 group_base = uint2(blockStart.x, blockStart.y >> 1); - for (int id = threadId.x * MP_NUM_THREADS_Y + threadId.y; id < 507; id += MP_NUM_THREADS_X * MP_NUM_THREADS_Y) { - uint x = (uint)id / 13, y = (uint)id % 13; - inp[id] = GetLuma(INPUT.SampleLevel(sam, inputPt * float2(group_base.x + x - 3 + 0.5, group_base.y + y - 2 + 0.5), 0).rgb); - } +#define INPUT_tex(pos) GET_SAMPLE(vec4(texture(INPUT, pos))) +static const float2 INPUT_size = float2(GetInputSize()); +static const float2 INPUT_pt = float2(GetInputPt()); - GroupMemoryBarrierWithGroupSync(); +#define HOOKED_tex(pos) INPUT_tex(pos) +#define HOOKED_size INPUT_size +#define HOOKED_pt INPUT_pt - float4 ret = 0.0; - float4 ret0 = 0.0; - float4 samples[12]; - const uint local_pos = threadId.x * 13 + threadId.y; +void Pass1(uint2 blockStart, uint3 threadId) { + ivec2 group_base = ivec2(gl_WorkGroupID) * ivec2(gl_WorkGroupSize); + int local_pos = int(gl_LocalInvocationID.x) * 13 + int(gl_LocalInvocationID.y); + for (int id = int(gl_LocalInvocationIndex); id < 507; id += int(gl_WorkGroupSize.x * gl_WorkGroupSize.y)) { + uint x = (uint)id / 13, y = (uint)id % 13; + inp[id] = + HOOKED_tex(HOOKED_pt * vec2(float(group_base.x + x - (3)) + 0.5, float(group_base.y + y - (2)) + 0.5)).x; + } + barrier(); + vec4 ret = vec4(0.0, 0.0, 0.0, 0.0); + vec4 ret0 = vec4(0.0, 0.0, 0.0, 0.0); + vec4 samples[12]; samples[0][0] = inp[local_pos + 0]; samples[0][1] = inp[local_pos + 1]; samples[0][2] = inp[local_pos + 2]; @@ -192,136 +1515,1433 @@ void Pass1(uint2 blockStart, uint3 threadId) { samples[11][1] = inp[local_pos + 94]; samples[11][2] = inp[local_pos + 95]; samples[11][3] = inp[local_pos + 96]; - - const uint2 destPos = blockStart + uint2(threadId.x, threadId.y * 2); - tex1[destPos] = samples[5][0]; - tex1[destPos + uint2(0, 1)] = nnedi3(samples); + ret[0] = nnedi3(samples); + ret0[0] = inp[local_pos + 41]; +#if CURRENT_PASS == LAST_PASS + uint2 destPos = blockStart + threadId.xy * 2; + uint2 outputSize = GetOutputSize(); + if (destPos.x >= outputSize.x || destPos.y >= outputSize.y) { + return; + } +#endif + imageStore(out_image, ivec2(gl_GlobalInvocationID) * ivec2(1, 2), ret0); + imageStore(out_image, ivec2(gl_GlobalInvocationID) * ivec2(1, 2) + ivec2(0, 1), ret); } - - //!PASS 2 -//!DESC double_x -//!IN tex1, INPUT -//!BLOCK_SIZE 64,8 -//!NUM_THREADS 32,8 - -float nnedi3(float4 samples[12]) { +//!DESC NNEDI3 (double_x, nns64, win8x6) +//!IN INPUT, temp +//!OUT OUTPUT +//!BLOCK_SIZE 64, 8 +//!NUM_THREADS 32, 8 +#pragma optionNV(inline none) +float nnedi3(vec4 samples[12]) { float sum = 0.0, sumsq = 0.0; - [unroll] - for (int i = 0; i < 12; i++) { - sum += dot(samples[i], 1.0f); + [unroll] for (int i = 0; i < 12; i++) { + sum += dot(samples[i], vec4(1.0, 1.0, 1.0, 1.0)); sumsq += dot(samples[i], samples[i]); } - - float mstd0 = sum / 48; - float mstd1 = sumsq / 48 - mstd0 * mstd0; - // 不能使用 lerp,否则结果可能为 nan - float mstd2 = mstd1 >= 1.192092896e-7 ? rsqrt(mstd1) : 0.0; + float mstd0 = sum / 48.0; + float mstd1 = sumsq / 48.0 - mstd0 * mstd0; + float mstd2 = mix(0.0, inversesqrt(mstd1), mstd1 >= 1.192092896e-7); mstd1 *= mstd2; - float vsum = 0.0, wsum = 0.0, sum1, sum2; +#define T(x) intBitsToFloat(x) +#define W(i, w0, w1, w2, w3) dot(samples[i], vec4(T(w0), T(w1), T(w2), T(w3))) +#define WS(w0, w1) \ + sum1 = exp(sum1 * mstd2 + T(w0)); \ + sum2 = sum2 * mstd2 + T(w1); \ + wsum += sum1; \ + vsum += sum1 * (sum2 / (1.0 + abs(sum2))); + sum1 = + W(0, -1120714617, 1007614003, -1123305414, 1009908268) + W(1, -1129324172, -1121901526, 1022915304, -1142748844) + + W(2, 1035162146, -1123901891, 1027364554, 1030225939) + + W(3, -1116882705, 1030599214, -1135846624, -1113117446) + + W(4, -1110752415, 1046176310, -1114390527, -1110762423) + + W(5, 1032526991, -1096831458, -1117077507, -1127767760) + + W(6, -1121818163, -1105876799, -1096860741, 1046191054) + W(7, 1043289735, 1052908756, 1034530771, 1039462233) + + W(8, 1035961863, 1034124059, 1022953826, 1023450788) + W(9, -1114841418, -1114991488, -1116257712, 1025047056) + + W(10, -1120878363, -1120533037, -1155422496, -1124524780) + + W(11, -1129613106, 1013731840, 981289536, -1143328976); + sum2 = + W(0, -1131108965, 1000650931, 1025688791, -1116852534) + W(1, -1145056307, -1123043594, 1018436747, -1139914565) + + W(2, 1043465638, -1113612493, -1106748353, 1029599173) + + W(3, 1045881517, -1118230687, 1029259867, -1107504809) + + W(4, 988544780, -1124179817, -1070139293, -1102659167) + W(5, 1078104617, 1048052425, -1126127905, 1025133515) + + W(6, -1145266179, -1111438835, -1110118136, -1097100047) + + W(7, 1027449515, 1027739737, -1136112041, 1036504803) + W(8, 1018501507, 1003301507, 1026178295, 1031198431) + + W(9, -1123515159, -1134523125, 995063942, -1120319069) + + W(10, 1021344415, -1131299129, -1123696315, 1012522521) + + W(11, 1024975831, 1020199127, -1162666156, -1131042995); + WS(1061710334, -1113637247); + sum1 = W(0, -1121814583, -1138603692, -1138264845, -1140194465) + + W(1, -1131439046, -1125621862, 1023073058, -1129805541) + + W(2, 1036106897, -1122595552, 1018454510, 1033737112) + + W(3, -1122735662, 1024541667, -1122620661, -1116003130) + + W(4, -1109309294, 1048694647, 1030681928, -1115559686) + + W(5, 1044326142, -1097437158, -1132933761, -1128614666) + + W(6, -1143950978, -1103580007, -1097890158, -1120177173) + + W(7, 1042373458, 1052689231, 1034486114, 1037961704) + W(8, 1033251382, 1032154570, 1019050396, 1021617155) + + W(9, -1113884080, -1107957310, -1116304653, 1019245786) + + W(10, -1118153848, -1122508490, 1012933309, -1120902675) + + W(11, -1152998244, 1016843898, -1144273714, -1155701620); + sum2 = + W(0, -1162960213, 1013908203, -1113327157, 1023571595) + W(1, -1133790043, 1024139725, -1130037920, 1007034787) + + W(2, -1107084454, 1023868855, 1032525526, 1048796624) + W(3, -1104878976, 1003078933, -1121062518, 1034207166) + + W(4, -1126626424, 1032930462, 1076098019, -1132699465) + + W(5, -1072747140, -1104764998, 1019199125, -1123497947) + + W(6, 1025411499, 1029914487, 1035900190, -1093496445) + W(7, 1026052839, -1109617402, 1025857863, -1118139493) + + W(8, -1126548940, 997665611, -1121182801, 1038561302) + + W(9, -1146184997, -1142783113, -1147685381, 1017680405) + + W(10, -1127269937, 1018748433, -1158385717, 1000017309) + + W(11, -1123007653, -1154085627, 1000677165, 1016687665); + WS(1064800702, 1030635520); + sum1 = W(0, 1004285524, -1122860750, -1122286551, 1021316024) + + W(1, -1116388951, 1022533838, -1125657162, 1001429301) + + W(2, -1128056492, 1024005652, 1035530413, 1053335517) + + W(3, -1139373960, -1130762670, -1121564617, -1129213371) + + W(4, 1035663048, 1031878036, 984521208, -1100061872) + W(5, 1048911707, 1035194194, -1131931048, -1141986761) + + W(6, -1110660706, -1116831438, 1023270757, -1093549817) + + W(7, -1104621327, -1149876978, -1142066105, 1031904066) + + W(8, -1128734654, -1204558974, -1136886024, 1042579293) + + W(9, -1148999845, -1142259845, -1120920449, -1111776529) + + W(10, 1028175148, -1143857649, 1005008153, 1016449422) + + W(11, -1135015336, 1010510404, 1018152308, 1020350678); + sum2 = + W(0, 1015139874, -1150118671, 1032711786, 1028577839) + W(1, -1116703472, -1123435694, -1140098908, -1140019692) + + W(2, -1120731382, -1116737087, -1087320828, -1069693959) + + W(3, -1103666133, -1138801588, 999422392, 1029210329) + W(4, 1017539382, 1031888972, 1059502015, 1078824499) + + W(5, 1045823576, 1009232228, 1011539428, -1118193829) + W(6, 1020112270, -1112637962, 1026899401, -1094071548) + + W(7, 1036639812, -1114441289, 1023067274, -1131442506) + + W(8, -1126248934, 1010207212, -1119882792, 1040940327) + + W(9, -1131804892, 1029410629, -1130083750, 1007549476) + + W(10, 1013963196, -1138130380, 1019091922, -1123861886) + + W(11, 1004924552, -1130443436, -1137456436, 1026106777); + WS(1058942782, 1023618692); + sum1 = W(0, -1126072821, 1011693912, 1017195423, -1122268692) + W(1, 1022607903, 982545387, -1126061755, 1003763447) + + W(2, 1041771492, 1025548876, 1036961985, 1037536142) + W(3, 1038780013, 1023558139, 1037537425, 1035261291) + + W(4, -1110777188, 1035801072, -1094081945, -1091452759) + + W(5, -1095962376, 1049096396, -1113879430, 955835050) + + W(6, -1110871838, 1043278082, -1103634941, -1105679152) + + W(7, -1103558179, -1130619215, -1136949949, 1026350907) + + W(8, 1036426764, -1146527995, 1046715887, 1040286827) + W(9, 1049101574, 1031851588, 1002869195, 1006549707) + + W(10, -1142526755, 1015953709, -1148709083, -1119884351) + + W(11, -1122534754, 1007174309, 1017517093, 986004587); + sum2 = + W(0, -1128639222, -1150616818, -1118932607, -1125568566) + W(1, 991022546, -1129687950, 1018120650, 1006676397) + + W(2, 1001638233, 1013509397, 1035428655, 1024255335) + W(3, 1031481278, -1111645244, 1028380841, -1115817479) + + W(4, -1119841411, 1029376723, 1019940778, 1063260126) + W(5, 1032753418, 1026999545, -1121385219, -1134958989) + + W(6, 1014385869, 1037911199, -1102461584, -1085129330) + W(7, -1110003004, 1019019978, 1021463302, 1017625850) + + W(8, 986023269, 970306708, -1141011097, -1110526300) + W(9, 1033244979, -1121764803, 1025283273, -1128128990) + + W(10, -1135260845, 1013815957, 959170344, 1017551658) + + W(11, 1016351942, -1127392454, 1009569613, -1138867245); + WS(1037837808, 1056377428); + sum1 = + W(0, -1135573495, 1023727061, -1118803082, -1123500111) + W(1, 1020600341, -1111066541, 1008936161, -1115286797) + + W(2, -1105969090, -1138454045, -1114548551, 1046351686) + W(3, 1036383371, 1034647805, 1026657308, 1033474888) + + W(4, 1027945538, -1116105371, -1126955510, -1122693874) + + W(5, 1053007142, 1035274060, -1156882549, -1122516460) + W(6, 1043223694, 1039709953, 1051232418, -1100833583) + + W(7, -1103740252, -1101618713, 1033814037, -1129756781) + + W(8, -1100584037, -1111027805, -1097887999, 1040497066) + + W(9, 1024768136, -1138012047, -1123286772, 1010716753) + + W(10, 1025656415, 1021082723, 1018764077, -1115071549) + + W(11, 1025234525, -1116333124, 1016891995, -1114238799); + sum2 = W(0, 1020978875, -1121670462, -1103298336, -1110731474) + + W(1, -1105136733, -1119790394, -1127100056, 999102475) + + W(2, -1100967324, -1130583533, -1096736455, 1053186254) + + W(3, 1045958215, 1043729632, 1033816035, 1020355333) + W(4, 1043179705, -1122981488, 1062358565, -1112891412) + + W(5, 1031005462, 1033523405, -1109547546, -1122874410) + + W(6, 1026290891, 1032797386, -1104401130, -1091109944) + + W(7, -1133705481, -1102472853, 1031959215, -1122532081) + + W(8, 1013196277, -1120286641, -1114052290, 1048200412) + + W(9, -1113847816, 1033631266, -1126209517, 1027184816) + + W(10, -1138979633, 966672716, -1152672163, -1122242747) + + W(11, 1023845499, -1118586102, -1147194793, -1127245018); + WS(1050865148, 1032626572); + sum1 = W(0, -1110436993, 1040042556, -1107890608, -1113356418) + + W(1, 1034032544, -1105712244, 999321197, -1110201208) + + W(2, 1043627312, -1101476879, 1049906138, -1109025830) + + W(3, -1120749707, 1051482110, -1103830356, 1048543054) + + W(4, -1118552440, -1108049256, -1107535228, -1162779891) + + W(5, -1095271743, 1035225158, -1104074479, -1106449960) + + W(6, 1045700875, 1033317691, -1115480133, 1049713062) + W(7, 1042738346, -1122810712, 1050825756, 1031488492) + + W(8, -1115060612, 1031191472, 1025393771, -1106727656) + + W(9, -1127443770, 1039553933, -1104755066, 1040395170) + + W(10, 1040430485, -1096410465, 1042925123, -1114330616) + + W(11, -1106585845, 1042770518, -1103219825, 1009713998); + sum2 = W(0, 1024944996, 1020193961, 1014966838, 1015828472) + W(1, -1113612636, 1032934706, -1116105943, 1021395599) + + W(2, -1111924540, 1007347355, -1116539066, 1012341552) + + W(3, 1034050704, -1113193567, 1042584092, -1116104243) + + W(4, -1107012648, 1049541488, -1107447750, -1109770505) + + W(5, -1111197863, 1014122612, 1016467631, -1135977693) + W(6, 1057346437, 1054940943, 1059914271, 1066972918) + + W(7, 1063973493, 1056333532, 1045837843, 1043326701) + + W(8, -1105023593, -1097277462, -1142156696, 1043445868) + + W(9, 1017043379, -1118781870, -1113967259, -1117573943) + + W(10, -1097010076, -1107952444, -1085761230, -1078926120) + + W(11, -1084679416, -1092348708, -1128370702, -1108363561); + WS(1054811644, 1027249161); + sum1 = + W(0, 1040940111, -1100243090, 1043481462, -1119365790) + W(1, -1111878381, 1044780378, -1101638738, 1035929492) + + W(2, -1101358582, 1036221579, 1014943347, -1109150355) + + W(3, 1036687602, -1109759237, 1028424107, -1122643648) + + W(4, -1113576073, 1038054901, -1097482896, -1106696288) + + W(5, 1022736646, -1097940765, 1038478827, -1103674991) + W(6, 1049141881, -1105999252, 1051960356, 1048275427) + + W(7, -1118345360, 1049145430, -1113101949, 1037909315) + + W(8, -1132483205, -1104538698, 1036681666, -1123112824) + + W(9, 1019000333, 1044474573, -1103799553, 1037239602) + + W(10, -1116754862, 1037145120, -1118995685, -1126689554) + + W(11, 1038634998, -1101292557, 1034438878, -1126283866); + sum2 = W(0, 1023766557, 1015306072, -1136376403, -1113107482) + + W(1, 1038494252, -1113447013, 1023629411, 1024784188) + W(2, 1016554458, 1020144724, -1116988904, 1050162106) + + W(3, -1104347057, 1003678517, 1033762395, -1109441777) + + W(4, 1021815988, -1103467660, 1034521268, -1102546407) + + W(5, -1103257907, 1025406308, -1113239746, 1026085595) + + W(6, -1137435361, 1016553974, 1060795535, 1075503478) + W(7, 1072821349, -1113972415, 1031283975, 1037416902) + + W(8, -1114856427, 1044555388, -1088370625, -1071164689) + + W(9, -1077590614, -1112563255, 995356642, -1112537357) + + W(10, 1032032312, -1105991725, -1127777881, 1035804901) + + W(11, -1120944929, 1036418439, -1123929939, -1140753514); + WS(1055940220, -1124188157); + sum1 = + W(0, -1113999823, 1015763751, -1115168029, 1022861696) + W(1, -1114461725, -1113117029, 1032164308, -1121800074) + + W(2, -1119569210, 1043278990, -1094609330, 1044340802) + + W(3, 1033154083, -1106205123, 1021089498, -1107756257) + + W(4, 1015781094, -1106256755, 1052603679, -1095339972) + + W(5, -1108564239, 1042723938, -1125646960, -1171638077) + + W(6, -1147977024, 1046188556, 1041916962, -1108128054) + W(7, 1057380776, -1095928258, 1041299799, 1027517543) + + W(8, -1117684995, 1036478965, 1033522483, 1047885622) + W(9, 1036635468, 1035899866, -1139371156, -1131185034) + + W(10, -1108336232, 1006648968, -1101485874, -1110457109) + + W(11, -1114614567, -1108232826, 1034599135, -1115299047); + sum2 = W(0, -1120118804, 1013270421, -1120552641, -1117027367) + + W(1, 1016254148, -1110780393, 1030787932, -1133117880) + + W(2, -1136369034, 1027353114, -1125884733, 1035518448) + + W(3, 1043285424, -1129166063, -1140216380, -1120569751) + + W(4, -1127959037, -1129939889, -1117793827, -1095769137) + + W(5, -1095274849, -1117623897, -1128598589, -1129927717) + + W(6, 1015341014, 1034464346, -1117887441, 1043338219) + W(7, 1049861339, -1128474295, 1032330618, 1018695247) + + W(8, 1033327798, 1041751325, 1049619624, 1049093640) + W(9, 1048627700, 1035712363, 1035384499, 1027229852) + + W(10, -1113602386, -1114857235, -1103868602, -1097589990) + + W(11, -1105817123, -1106207094, 1004274322, -1120123842); + WS(1057163582, 1025817537); + sum1 = W(0, 1037167835, -1121852313, 1034559945, 1027044951) + W(1, 1039868489, 1037598609, 1007581568, 1031626785) + + W(2, 1031655825, 1046829204, 1038865075, 987855837) + W(3, -1105739319, -1112419405, 1015381448, 1037495244) + + W(4, -1096271953, -1093143228, -1085198281, 1050118415) + + W(5, 1057217669, 1047779928, 1035805671, 1015872616) + W(6, 1045084224, 1046279122, 1057074420, 1040167170) + + W(7, -1086525384, -1087515051, -1098926044, -1124461564) + + W(8, 1033520525, -1103697416, -1107583934, 1024989936) + + W(9, 1034776664, 1044254259, -1134624240, -1113253902) + W(10, 1016078798, 1030441081, 1036548879, 974934139) + + W(11, 1034922130, -1113468278, 1036139674, 1017385676); + sum2 = + W(0, -1136384493, 1023814631, 1033659202, 1017810163) + W(1, 1009967381, 1017781727, -1118180802, -1141961139) + + W(2, 1036526786, -1099879539, 1034332004, 1013925981) + + W(3, -1106516740, -1101585218, -1131784625, -1112082470) + + W(4, 1028719631, 1030342243, 1046758826, -1093436173) + W(5, 1051870663, 1042788701, -1114786901, -1113417628) + + W(6, -1123632092, 1043747658, 1050427835, -1100447595) + W(7, 1041231786, 1045006578, 1010389989, -1117114477) + + W(8, -1145098603, -1102737141, -1112406001, -1119158797) + + W(9, 1034292458, -1107586767, -1143106923, 1032164569) + + W(10, -1122280548, -1130733945, 1014543213, -1123106681) + + W(11, 1019870319, 1013053757, -1119739637, 1012643781); + WS(-1081763615, -1092598780); + sum1 = W(0, -1130922677, -1122514966, -1136114845, 1015393433) + + W(1, -1137786397, 1023447063, -1142668459, -1140705115) + + W(2, -1114318275, 1026414532, 1017564438, 1021344041) + + W(3, -1095352826, -1116164091, -1123782681, 1012849463) + + W(4, -1127997567, -1121576984, -1088500870, -1098266094) + + W(5, 1061435536, -1148866211, 1039772482, 1024002537) + W(6, 1028467828, -1127358845, 1061837768, 1035926493) + + W(7, -1095349722, -1114585584, -1114677716, -1116920883) + + W(8, 1023598927, 1017010415, -1116904946, 1037585875) + W(9, 1040151266, 1031742785, 1007413957, -1128808099) + + W(10, -1139280241, 1002425203, -1123987795, -1136160989) + + W(11, -1131570741, -1116123969, 1020007637, -1126849079); + sum2 = + W(0, 1021958137, -1117837187, 1026312941, -1115513274) + W(1, 1037370871, -1112242113, 1033686533, -1107052036) + + W(2, 1034408685, 1036094407, 1033683959, -1124949158) + W(3, -1091894288, 1027011647, -1107943508, 1010459130) + + W(4, -1106091708, -1147105428, -1094093059, 1061646324) + + W(5, 1058519893, -1106569597, 1037199097, 1030945863) + + W(6, -1098486326, -1110159069, -1088187103, 1055280585) + W(7, 1045036050, 1045721104, 1034325435, 1039418143) + + W(8, 1028745769, 1031154711, -1105512708, -1100598283) + + W(9, -1109806227, -1117345257, -1144974476, -1124920152) + + W(10, 1024682325, -1116910593, 1039406737, -1117359799) + + W(11, 1026080301, -1117139296, 991455177, -1112397476); + WS(1049187708, 1061143407); + sum1 = W(0, 1032206028, -1121811767, 1032297330, -1136528167) + + W(1, 1005295654, 1031846890, -1136496587, 1032778794) + W(2, 1046469409, 1033070593, 1049873346, 1050639650) + + W(3, 1041319460, 1041542033, 1036329419, 1043869975) + W(4, 1044620591, 1020031147, -1111788011, -1089881571) + + W(5, -1127219501, 1033106537, 991465499, -1112918515) + + W(6, -1086760535, -1113096094, -1092765627, -1083700943) + + W(7, -1092202425, 1011207027, 1015330121, 1026637361) + W(8, 1049164066, -1132628435, 1051671486, 1044844041) + + W(9, 1037004161, 1026161438, -1134373563, 1019220893) + W(10, 1022165171, 1009114287, 1034535880, 1024964917) + + W(11, 1011091807, 1038185039, 1018308239, 1032129132); + sum2 = + W(0, -1123557888, -1139662759, -1120649660, 1021700488) + W(1, -1119215196, 1025758640, -1134635263, 1025396502) + + W(2, 1024038368, 1022314468, 1016353740, -1149024430) + + W(3, -1127462832, -1109226016, 1022909500, -1106595065) + W(4, 964997605, 1007232143, -1112234110, 1052797849) + + W(5, 1032636001, -1096670151, -1103246759, -1095307242) + + W(6, -1123190992, 1040909663, 1035500288, 1059925772) + + W(7, -1123381020, -1110751472, -1114698588, 1016687528) + + W(8, -1170950771, -1119781676, -1122589660, 1021322900) + + W(9, -1124742672, 1037872214, -1123038904, 1025386190) + + W(10, 1009594487, 1011035391, -1122952928, 1015425876) + + W(11, 1024335912, -1115520552, 1026100870, -1128653768); + WS(-1080960863, 1058419411); + sum1 = W(0, -1118700722, 1032983255, -1122641758, 1033094082) + + W(1, -1121000958, -1133773881, -1141737059, -1120123854) + + W(2, -1111066847, -1112208894, -1099579692, -1090459763) + + W(3, -1107128402, -1107276892, -1116550064, -1103159313) + + W(4, 984198859, -1099715572, 1049479517, 1062349342) + W(5, -1099059374, 1033076198, -1125040759, 1037355536) + + W(6, 1043965403, -1113907195, 1050672334, 1061713555) + W(7, 1059583022, -1121054998, 1024684126, 1026513898) + + W(8, -1108783427, -1113914551, -1105019770, -1095692932) + + W(9, -1099879371, -1108028092, 1024533736, -1110661700) + + W(10, 1000248987, -1124179019, -1128328213, 1023738862) + + W(11, -1131329315, 1027231576, -1113801521, 1007580489); + sum2 = W(0, 995719700, -1114687459, 1024240180, -1115935924) + W(1, 1025427056, -1123062148, 999440794, -1131128122) + + W(2, -1129327601, 1021214658, 997717028, 978476974) + W(3, -1140454571, 1010080137, 1002330866, -1152746908) + + W(4, -1125739202, 1027238209, -1120915257, -1078687396) + + W(5, -1111104335, -1128218828, -1147995690, -1128526870) + + W(6, 1029045123, 1037994429, 1036441804, 1066236156) + W(7, 1022342240, 1028953671, 1024857232, -1126806088) + + W(8, 1025141617, -1113434302, 1032546636, 1035362808) + + W(9, 1033358736, -1166615662, -1165027863, 1024563904) + + W(10, -1154923092, 1007115993, 1003062850, -1118441375) + + W(11, 1017727844, -1129048983, 1019778022, 1009762473); + WS(-1082880574, -1095080656); + sum1 = W(0, -1120399523, -1123397517, -1135116544, -1168421181) + + W(1, -1131259136, 1037719400, -1113348279, 1030740495) + + W(2, -1111736159, -1128373242, 1025039907, -1127950106) + + W(3, -1098593297, -1106461210, 1024172498, 1028249110) + + W(4, -1111698940, 1019423266, -1092929515, -1098702381) + + W(5, 1060991762, 1018082074, 1036669022, -1114016273) + W(6, 1037879414, 1028697399, 1062200098, 1023355236) + + W(7, -1094756999, -1115312044, -1106391640, -1109491766) + + W(8, 1037066756, -1119567216, -1131199446, 1027882718) + + W(9, 1038218895, 1022591155, -1118950442, -1141634128) + + W(10, -1118524245, 1027581671, -1139610160, -1139561152) + + W(11, 1005358744, -1113962893, 1026868195, -1126548648); + sum2 = + W(0, 1007561151, -1118820752, -1128452386, -1121745985) + + W(1, -1114861795, -1121584151, -1120079456, -1129117272) + + W(2, -1106890729, 1031296198, -1110907715, 1032462388) + W(3, 1035962501, 1035033495, 982365671, 1035951051) + + W(4, -1144059530, -1112391017, 1056169840, -1096446085) + + W(5, 1031556034, 987032615, -1138039959, -1119286197) + W(6, 1010626011, -1114880200, 1052511775, -1094697844) + + W(7, 1056886944, -1129701328, 980377326, -1126702674) + W(8, -1140206187, -1136937433, 1034255225, 1033067226) + + W(9, -1104164393, 1013679559, -1115367679, -1137374445) + + W(10, -1152147163, -1120281594, -1114711449, 993102387) + + W(11, -1120009849, -1122813977, -1118918686, 1006646323); + WS(1058795070, 1058351276); + sum1 = W(0, -1129226172, 1032650784, -1134152362, -1122312016) + + W(1, -1145265749, -1118796187, 1017891569, -1131365684) + + W(2, -1106246658, -1132244111, -1102574120, 1028257624) + + W(3, 1004724909, -1128587973, -1150296521, -1107598873) + + W(4, 1041614193, 1048401911, 1050141831, -1088102699) + + W(5, -1093353638, -1112285036, -1122892680, -1120116589) + + W(6, 1041522846, 1041471472, 1033352747, 1030285885) + W(7, 1056599450, 1049138668, 1043369227, 1040658126) + + W(8, -1106977045, 1031926461, -1121658742, -1124591186) + + W(9, -1107883356, -1114299650, -1130730345, 1034850634) + + W(10, -1140271486, -1130658915, -1115542891, -1119417531) + + W(11, -1155196377, 1003429157, -1125742491, -1137642362); + sum2 = + W(0, 1018264792, 1019878456, 1020074080, -1143212320) + W(1, -1148803168, -1127882992, 1017409120, -1131165168) + + W(2, -1109681111, -1134735936, -1106212594, 1037009054) + W(3, -1132238328, 1032289620, 990246720, 1004132864) + + W(4, 1028734812, -1093714299, 1034660210, 1047288883) + W(5, 1031452084, -1112028563, -1115169564, 1020410832) + + W(6, -1104210606, -1099909667, -1098896203, 1060586916) + + W(7, 1042866381, -1109339206, 1023925320, -1112228144) + W(8, 1025579416, 1032419228, 1010388000, 1030286292) + + W(9, -1107165918, 1019446368, 989303425, 1029468412) + W(10, 1029305888, -1113499692, 1025031188, -1130541520) + + W(11, -1127563664, 1026005920, -1123344268, 1009015280); + WS(1043816952, 1056206353); + sum1 = W(0, -1132948972, 1024900084, -1150680698, 1016358425) + + W(1, -1160444148, -1115326124, 1019123435, -1120343575) + + W(2, -1115461859, -1107172113, -1097009915, -1102438229) + + W(3, 1024199571, -1148961467, -1130723763, -1144998513) + + W(4, 1034684352, 1038250028, 1061195075, 1051576078) + W(5, -1088975285, 1010078034, -1107729186, 1022450003) + + W(6, 1037119642, 1039626815, -1095598055, 1056604231) + W(7, 1057172865, 1029312608, 1039764276, -1112740858) + + W(8, -1107088436, -1110088668, -1113187289, -1102307882) + + W(9, -1103288997, -1122873761, 1032878393, 1034042985) + + W(10, -1144087781, -1116127087, -1117712852, -1114968828) + + W(11, -1134624362, 1012385158, -1114736693, 1002559709); + sum2 = W(0, -1135809827, -1140675011, -1137384851, -1147988326) + + W(1, 1019754904, -1172160176, 1006265798, 990940844) + W(2, 1031002711, 1009667595, -1156373420, 1010789683) + + W(3, -1122328477, -1135703979, 1016962928, -1135289651) + + W(4, -1136033931, 1025543601, -1123691685, -1105219090) + + W(5, -1118075063, -1111692677, -1131889022, 1010975355) + + W(6, -1114169661, -1124911966, 1056449903, 1044469394) + + W(7, 1046754031, 1034039333, 1024901767, -1111731157) + + W(8, -1107967067, -1108557845, -1096033675, -1118550723) + + W(9, 1020360378, 1005574774, 1025982043, 1036125487) + W(10, 1027957130, 1004385158, 1015282250, -1115586301) + + W(11, -1120013003, -1130287690, -1127946498, -1169619760); + WS(1049886076, 1034318367); + sum1 = + W(0, -1140544720, 1006465467, 1025588553, -1118154094) + W(1, 996302474, -1111905052, -1125961261, -1122979160) + + W(2, 1022042959, -1106141033, -1104462159, -1100197533) + + W(3, 1029682164, -1112348667, -1117824763, -1123002959) + W(4, 1021784769, 966352080, 1059646174, 1051735858) + + W(5, -1085821075, 1029991670, -1111853843, 1031029131) + + W(6, -1131075883, 1032360624, -1086897182, 1059041662) + W(7, 1057694799, 1036690656, 1030592201, -1155480906) + + W(8, -1142660485, 1029412697, 1042100949, -1106256562) + + W(9, -1106530518, -1121375714, 1017125029, 1014936522) + + W(10, -1160888244, -1121174096, 1017231209, -1150715274) + + W(11, 1024907260, 1015672965, -1120397516, -1124207481); + sum2 = W(0, -1110846605, -1118194097, -1143898437, 1019764549) + W(1, 1008325379, 999139301, 997400075, 1024689095) + + W(2, 1032320648, 1027617785, 1000132981, -1102116254) + + W(3, 1026769453, -1131321177, 1008054267, -1118482095) + + W(4, 1027180085, -1144235925, 1031570329, 1058710858) + + W(5, 1031557517, -1129394727, -1131248001, -1120094485) + + W(6, 1029603693, 1030911393, -1119293171, 1058397441) + + W(7, -1104852463, -1097515304, -1123234663, -1106708620) + + W(8, 1033577170, -1134544211, -1126616369, -1096477332) + + W(9, -1103611475, -1115701158, -1119810656, -1134741251) + + W(10, -1112673640, -1123614185, -1129974305, 1018853209) + + W(11, 1036639048, 1018401637, 1024391909, 1017993989); + WS(1058429118, 1064863249); + sum1 = + W(0, 1021156518, 1024394983, 1020219616, -1131178666) + W(1, 1016100640, 1007341951, 994206685, 964693930) + + W(2, 983001563, -1115666854, 1039490386, 1046648007) + W(3, 1017911734, 1043757188, -1128564932, 1045299318) + + W(4, 1054264097, 1049468028, 1055450440, -1104196510) + W(5, 992909240, -1104186631, -1122765517, -1105268364) + + W(6, -1097350840, -1099725362, -1115114453, -1085827188) + + W(7, -1100930382, -1128095056, -1118903024, 1023907580) + W(8, -1175841770, 1024539904, 997016493, 1043203980) + + W(9, 1033767351, -1119513801, -1131557236, -1106015350) + + W(10, 964768362, -1149024695, 1012766063, 1022718592) + + W(11, -1136266891, 1035657141, 1016423590, 1029236260); + sum2 = + W(0, 1005391535, 1018096716, -1135288360, -1121648533) + W(1, 996459166, -1130245220, -1123582348, 1033610651) + + W(2, -1106696811, -1121907467, 1026226746, 1031305614) + + W(3, 1032267559, -1111725659, 1028271694, -1108648643) + W(4, 1050575955, 1051313221, 1047952814, -1081952512) + + W(5, 1040750694, 1031579134, 1007524520, 1034169827) + W(6, -1100156814, 1060662591, 1068258385, -1074657656) + + W(7, -1095314974, 1036231973, 1044691450, 1044987108) + W(8, -1098256564, 1029467086, -1142136447, 1051661425) + + W(9, 1035381379, -1107714686, 1022647148, -1100160947) + + W(10, 1028021126, -1129063320, -1131820748, 1008147176) + + W(11, -1168737402, 1020424408, -1129848660, 1024695710); + WS(-1083443454, 998713176); + sum1 = W(0, 1032696047, 1026355790, 1024354795, 1034252472) + W(1, 1012872363, 1032281789, 1027888345, 1016830581) + + W(2, 1040709994, 1040668906, 1036398699, 1051748575) + W(3, 1035129883, 1044965075, 1031400701, 1048807512) + + W(4, 1040929033, 1032459486, 1012490030, -1097753826) + + W(5, -1114537329, -1100635790, -1103916602, -1098186970) + + W(6, -1087559501, -1103862520, -1102928053, -1093112676) + + W(7, -1092883854, -1099081393, -1104850339, -1112352715) + + W(8, 1049786774, 1037090637, 1047072725, 1050721065) + W(9, 1039546228, 1011437457, 1009955155, -1114553850) + + W(10, -1146095614, 1033091241, 1024780023, 1037512365) + + W(11, 1024615038, 1037286498, 1036010231, 1033653631); + sum2 = + W(0, 1035861958, -1161872500, -1113290777, -1137177342) + W(1, 1034613598, -1103597964, 1038756242, -1111249467) + + W(2, -1098289107, -1119785106, 1033623622, 1045692473) + + W(3, -1106425659, -1117971136, 1019694879, -1114046628) + + W(4, 1026686124, 1049978705, -1098402027, 1024040864) + W(5, 1053770527, -1127968019, 1049090628, 1052585151) + + W(6, -1096172460, -1107697817, -1091833397, 1013412750) + + W(7, 1046082211, 1057075430, 1047895771, -1102204197) + W(8, -1113513064, 1027596044, -1098063812, 1031079096) + + W(9, 1012376430, -1095279992, 1045163433, -1100444173) + + W(10, 1019723703, -1121217732, 1033198374, -1107709748) + + W(11, 1038124498, -1112843267, -1120386622, 1034273086); + WS(-1086369662, -1078015058); + sum1 = + W(0, 1024279387, -1100066053, 1039589628, -1104719791) + W(1, -1113174076, -1125885710, -1111149795, 1024511623) + + W(2, 1042615374, -1106499229, 1049518735, -1115604002) + + W(3, -1127523972, 1049389829, -1102519338, 1042212335) + + W(4, 1054091094, -1113085188, 1050614757, -1103236040) + W(5, 1047781504, -1108066658, 1041501469, 1048227542) + + W(6, -1095346029, -1103658220, -1097514477, -1100854410) + + W(7, -1097175852, 1026529231, -1104719494, -1099302313) + + W(8, 1050416872, -1111759460, 1048966812, -1122281110) + W(9, 1043919349, 1032565272, 1027138593, 1036646913) + + W(10, -1113840294, -1141254386, 1032485602, -1113439156) + + W(11, -1119980106, 1039770777, -1104628175, 1032389542); + sum2 = W(0, -1092512531, -1093473489, -1081280020, -1076988140) + + W(1, -1081342477, -1086556968, -1107875638, -1121362077) + + W(2, -1098738343, -1088925799, 1042571962, 1043337888) + + W(3, 1033193400, 1010020371, -1102154130, -1126174974) + W(4, 1063615535, 1062426368, 1067242406, 1066811408) + + W(5, 1066297017, 1060290312, 1052028857, 1037059936) + W(6, 1009177475, 1026425874, 998962046, -1096426756) + + W(7, 1022780060, 1026166068, 1017583668, -1119102823) + + W(8, -1119750726, 1012050343, 1025403720, -1129159374) + + W(9, 1023044380, -1115355073, 1026819560, -1127777686) + + W(10, 1030476954, -1120184004, 1031881676, -1116680638) + + W(11, -1135563955, 1004442726, 946141982, 1034449190); + WS(-1129707456, 1007685382); + sum1 = W(0, -1134894751, 1044154267, -1111052786, 1038046773) + + W(1, -1192544411, -1128991721, 1035051017, -1122391156) + + W(2, -1098519836, 1030394337, -1107874844, -1118678129) + + W(3, -1111301144, -1115520098, 1015910765, -1103669035) + + W(4, 1040671079, 1013414869, -1103276809, -1098881194) + + W(5, -1110522396, -1107120076, 1033063921, -1111557603) + + W(6, 1044073412, 1041040503, 1038778991, -1107344299) + W(7, 1048980909, 1052479600, 1049200001, 1051478546) + + W(8, -1109530006, 1035376874, -1105794628, -1139987723) + + W(9, -1108336721, -1112546431, 1023468750, 1018554845) + + W(10, -1134057701, 1028314315, -1112561176, 992777541) + + W(11, -1112828028, -1132207293, 999515194, -1119107128); + sum2 = + W(0, -1137824107, -1126465818, 1005362547, -1158497445) + W(1, -1119770196, 1021074352, -1138544392, 1034621027) + + W(2, -1110122518, 1033612180, -1116868027, 1039739597) + + W(3, 1037998233, -1112420682, 1025116420, -1120069279) + + W(4, -1137081539, -1106894813, 1045165527, -1106604299) + + W(5, -1138568822, 1039276731, -1104439342, -1113398206) + W(6, 1039063461, 1047362418, 1067526191, 1071589227) + + W(7, 1061860820, -1077533661, -1073373771, -1094637864) + + W(8, -1158403413, -1117814890, -1136640937, 1044031039) + + W(9, -1133800170, 1031122886, -1106196407, 1031315442) + + W(10, -1124656554, 1023374342, -1115663214, -1148955153) + + W(11, -1123862185, 999718675, -1139157324, 1025985948); + WS(1033791472, -1138498893); + sum1 = W(0, -1143657507, 1014781903, 1029133201, 1018917100) + W(1, 998381448, 1016812674, -1118545247, -1137667330) + + W(2, -1102835756, -1108646231, -1108649138, -1106020223) + + W(3, 1003669472, -1113672010, -1114481905, -1127743919) + + W(4, 1024249065, -1130492804, 1008218246, 1054388603) + + W(5, -1092207694, -1132293500, -1112726231, -1119594899) + + W(6, 1044190455, 1021681616, -1115040338, 1058377694) + W(7, 1046387590, 1049136345, 1017676194, -1119541597) + + W(8, -1107762844, -1112711792, 1019895480, -1123372431) + + W(9, -1111491159, -1123523050, -1123035739, 1028355707) + + W(10, 1008291608, -1128240816, 1025256893, 1014932868) + + W(11, 1007448080, 1008489644, -1112884042, 1001709096); + sum2 = W(0, 1014470821, -1120344268, -1114330800, -1106002658) + + W(1, 1024999308, -1126273593, -1127411221, -1123975632) + + W(2, -1106657768, -1106292024, 1049926230, 1054743689) + + W(3, -1112305858, -1122403994, -1116955850, 1030827431) + + W(4, 1034825132, 1032219219, 1057813788, 1049962194) + W(5, 1051810194, 996027236, 984340447, -1114551452) + + W(6, 1006830039, -1101139832, -1102461554, -1103958261) + + W(7, -1098680718, 1040205712, -1109277736, -1111240037) + + W(8, -1104684796, -1114556582, -1111886229, 1050373872) + + W(9, 1035894797, -1100520246, 1014102650, -1106040331) + + W(10, -1124459301, 1008940380, 1029827978, -1133852786) + + W(11, -1109427720, 1024816377, -1117160816, 1003623824); + WS(1060089726, 1074996161); + sum1 = + W(0, -1117558175, 1029119241, -1141503452, 1010789890) + W(1, 1037081758, -1120312844, 1027150698, 1021223318) + + W(2, 1046443391, 1039893948, 1041448800, 1035829124) + W(3, 1041862066, 1028398131, 1038548631, 1047369209) + + W(4, -1083103171, -1093429938, -1088988175, 1032282738) + + W(5, 1035486030, -1142682180, -1111879740, -1105296983) + W(6, 1040714346, 1021452133, 1048946821, 1021975771) + + W(7, 1040332065, -1090323173, -1112512014, -1095359061) + W(8, 1044503809, 1030628716, 1038933875, 1038764813) + + W(9, 1032949373, 1041097413, 1029165798, 1046714577) + W(10, 1023987857, 1027140771, 1026874120, 1026271340) + + W(11, 1034225415, -1113760891, 1028642719, -1134282558); + sum2 = + W(0, -1130708327, -1156760442, 1011385503, 1005458237) + W(1, 1015786967, -1121500080, 1023017975, 1008927007) + + W(2, -1131662151, -1160974837, -1122121264, -1104012424) + + W(3, 1025508020, -1106371091, 1032453110, -1107217673) + W(4, 1027052068, -1119116140, 1006726095, 1053197196) + + W(5, -1150821434, 1032166230, -1116451706, -1143126685) + + W(6, -1104634511, -1148640061, -1101053828, 1050251696) + + W(7, 1043632028, -1115585403, 1032061998, 1045664978) + W(8, 1037500532, 1028521640, 1041142688, -1121651972) + + W(9, -1105814552, -1117076340, -1120517680, -1103126409) + + W(10, -1117309872, -1132259207, -1129219511, -1148190653) + + W(11, 1005943453, -1120252400, 1024831312, -1126349911); + WS(-1081408895, 1057237802); + sum1 = W(0, 1016592219, -1135569700, 1019913045, -1134722237) + W(1, 1020337237, 1019971573, 1015924209, 1027236154) + + W(2, 1050393725, 1025037351, 1042967287, 1042881918) + W(3, 1033060699, 1038993285, 1028206140, 1041649576) + + W(4, -1096948620, 1021729271, -1123436299, -1107250293) + + W(5, 1047123275, 1037602588, 1034435092, 1044331459) + + W(6, -1099121222, -1114451665, -1104931659, -1092679092) + + W(7, -1098053310, -1091584672, -1092984777, -1089381821) + + W(8, 1042338077, 1033766733, 1036822635, 1042265522) + W(9, 1043883210, 1042862441, 1029491668, 1042007901) + + W(10, 1026859007, 1023688209, 994107237, 1017621813) + W(11, 1033354815, -1147819555, 1035642823, 963919445); + sum2 = + W(0, -1127968320, 1036537032, -1112917417, 1020801080) + W(1, 1019615648, -1127208552, 1023589392, -1121416948) + + W(2, -1092240358, 1030963640, -1097473768, -1109029546) + + W(3, -1116583352, 1028578068, -1113404853, 1041090246) + W(4, 1057542400, -1105653780, 1053316325, 1058712288) + + W(5, 1043894648, -1093453186, 1034405836, -1094394128) + W(6, 1016463192, -1097383073, 1038201480, 1052867895) + + W(7, -1123129572, -1141347136, 1006791808, 1037486484) + + W(8, -1094079665, 1040975890, -1101066411, 1013027424) + + W(9, -1118015492, -1117505000, -1111557726, 1044943944) + + W(10, 1037438732, 1019305024, 1028884816, 1010261952) + + W(11, 1027371024, -1113360113, 1034904608, -1104647878); + WS(-1076745215, 1064070508); + sum1 = W(0, 1019383636, -1138649581, 1029667879, -1127653591) + W(1, 1027426151, 1022926189, 1004012708, 1016119660) + + W(2, 1043437193, 1030286820, 1040316179, 1048543741) + W(3, 1029763954, 1039947283, 1025479577, 1041368223) + + W(4, -1100863080, 1033675388, -1102225484, -1084687593) + + W(5, -1111626052, 1026499316, -1122995300, 1026134601) + + W(6, 1019299111, 1027453406, -1110289513, -1082029409) + W(7, 983973284, 1031954367, -1118301831, 1016553765) + + W(8, 1041928012, 1031909515, 1043406276, 1044625233) + W(9, 1044339921, 1039879984, 1022733729, 1012331970) + + W(10, 1018313975, -1136380470, 1026991539, -1136351578) + + W(11, 1027257018, 1022902273, 1026798858, 1027440187); + sum2 = W(0, -1131696089, 1008718823, -1149188438, -1140198251) + + W(1, -1129603953, 1007479839, -1141563590, 1018622169) + + W(2, 1012459087, -1135045027, -1118135053, 1033739972) + + W(3, -1142742214, 1015462815, -1126906553, -1135479163) + + W(4, -1112347233, -1125420309, 1041969824, 1052325325) + + W(5, 1029891118, -1120072309, 1017890385, 1016803437) + W(6, 1039451269, -1110618065, 1024383435, 1052741682) + + W(7, -1121721953, -1095903036, -1105015368, -1098230278) + + W(8, -1158657302, 1007247903, 1015365577, 1034080133) + + W(9, -1110453303, -1162307222, -1122346803, 1021342643) + + W(10, -1129595249, 999949222, -1130814181, -1140370763) + + W(11, 1020979581, -1132990667, 1008938691, -1137891195); + WS(-1094563452, 1051169575); + sum1 = + W(0, -1154622990, 1029393378, -1117775501, 1033996553) + W(1, -1136342582, 1018491963, 1032030382, 1015760954) + + W(2, 1018130713, 1035203109, -1113234793, -1106127031) + + W(3, -1114335628, -1112874623, 1023872671, -1110067034) + + W(4, 1040428881, 1032896399, 1049040808, -1112183035) + W(5, 1048012112, 1044702279, 1032915973, 1035998904) + + W(6, -1120902330, 1039535746, -1102863965, -1090463816) + W(7, 961094679, -1098092733, 1033184663, 1029109433) + + W(8, -1113835211, 1021002107, -1107942972, -1105904891) + + W(9, -1148767576, -1124337998, 1006151100, -1110631596) + + W(10, 1019319877, 1036762426, -1135300966, 1040237135) + + W(11, 1032716400, -1137189022, 1037223880, 1013167238); + sum2 = + W(0, 1028413027, -1120070369, 1012563150, -1111535757) + W(1, 1011962278, 1009477102, -1153318262, 974823129) + + W(2, -1121092135, -1130520759, -1120753460, -1097640928) + + W(3, -1098008778, 999766235, -1122757360, -1129371381) + W(4, 1017337743, 1037177446, -1106734706, 1051800696) + + W(5, 1035782812, -1106510696, 1010623246, 1028214977) + W(6, -1137632446, -1104029390, 1048794348, 1050145982) + + W(7, -1114477541, 1047938812, -1111017918, -1123769252) + W(8, 999930971, 1033133092, -1111694827, 1041394994) + + W(9, -1118971109, -1127041263, 1020162151, -1124747017) + + W(10, 1027578971, -1114678191, 1030530567, -1119592910) + + W(11, 1001961835, 1024176823, -1115486877, 1007999422); + WS(1057759166, -1088449289); + sum1 = + W(0, -1129635066, 1025446574, -1144519245, 1017539549) + W(1, 1026395242, -1122678010, 1025431320, 1024557433) + + W(2, 1044873994, 1037627635, 1041685209, 1033910011) + W(3, 1039651930, 1035038013, 1039320958, 1038868536) + + W(4, -1087389198, -1097118359, -1089578865, -1129568803) + + W(5, 1010566389, 1030050103, -1110122707, -1112614790) + + W(6, -1116302487, 1022204225, 1022125102, -1105345911) + + W(7, -1122366800, -1097803608, -1119554634, -1126568107) + + W(8, 1048786726, 1039292653, 1045860709, 1045748274) + W(9, 1027479143, 1033498658, -1161253492, 1010965710) + + W(10, 1017011581, 1021371937, 1025212662, 1031878029) + W(11, 1013486066, 1007580942, 1028360045, 1015223035); + sum2 = W(0, -1162281894, -1124547002, -1150111187, -1135956229) + + W(1, -1145634890, 965409433, -1123274137, 1024679583) + W(2, 1033992046, -1149048922, 988741862, -1132541637) + + W(3, -1132011310, 1024739191, 1008671821, -1129294934) + + W(4, 1042856153, 1036788056, -1112557119, -1097406101) + + W(5, -1121853795, -1104384368, 1032013500, -1147059498) + + W(6, 1038465062, 1046094595, 1060179844, 1049669935) + W(7, -1101657128, 1042681611, -1111116605, 1027020519) + + W(8, -1093956780, -1100316514, -1090501223, 1022378118) + + W(9, 1045140163, -1121116299, 1035479824, -1131272734) + + W(10, 1024284423, 1035682376, -1122577303, -1113139255) + + W(11, -1130855582, -1118824057, 1006161754, -1124922046); + WS(-1086987838, -1100233980); + sum1 = + W(0, 1015308459, -1122325985, -1116672610, 1032904116) + W(1, -1141168915, 1033123257, 1001375875, 1015833828) + + W(2, 1041765192, 1028094431, 1042485054, -1118546351) + W(3, -1118052589, -1116818498, 992241989, 1015146386) + + W(4, -1105415847, -1114108890, -1092596043, 1046690691) + W(5, 1054244345, 1049735534, 1040724504, 1041637233) + + W(6, 1042444900, 1041449686, 1049087917, -1128556841) + + W(7, -1089307961, -1094503991, -1104029377, -1100869156) + + W(8, -1111075669, -1106140165, -1110170951, 1034284768) + + W(9, 1026589088, 1030527932, 1008796465, -1123717612) + W(10, 1003799483, 1034767973, -1144225139, 1033288361) + + W(11, 1010481109, -1121578684, 1030765989, -1124977133); + sum2 = W(0, -1128145157, 1026284201, 1012811840, -1136599052) + W(1, 992541697, 1011005728, -1127430370, 995789721) + + W(2, -1100557855, -1106810438, 1042787919, 1044596046) + + W(3, 1038174685, -1104618112, -1166127490, -1116633305) + + W(4, 1057648426, 1054522141, -1098531848, -1073275189) + W(5, 1061008073, 1059653331, 1035655860, 1017274260) + + W(6, 1048654145, 1057115188, 1046636853, -1074262745) + W(7, 1044984510, 1060082709, 1034192337, 1033697834) + + W(8, -1122215769, -1103409060, 1046426252, 1035358469) + + W(9, 1036107748, -1104639697, -1130597644, -1112828961) + + W(10, -1133425768, 1017140792, -1118227807, -1143532160) + + W(11, 1016191398, 981079778, 1006837720, 1021901152); + WS(-1092446204, 989212831); + sum1 = + W(0, 1007124942, -1116778591, 1027403088, -1121715541) + W(1, 1019921952, 1020332096, -1139218425, 1020381759) + + W(2, 1048125124, -1131432602, 1042237585, -1138060917) + + W(3, 1027977243, -1126238792, -1131884420, 1024321015) + + W(4, -1138101793, -1106585464, 1016240146, 1037962972) + W(5, 1053191424, 1053622732, 1043276755, 1049124886) + + W(6, -1141178857, 1019782926, 1036610823, -1101006449) + + W(7, -1094792341, -1089064867, -1101892348, -1107274751) + + W(8, -1102978326, -1115311760, -1110971902, -1114322839) + + W(9, 1031189102, -1137835047, -1132849129, -1110951117) + + W(10, 1034583667, 1015089582, 1027127900, 1008360193) + W(11, 1028625507, 1017386452, 1009465805, 1008208785); + sum2 = + W(0, -1120159352, -1125980662, -1131578305, 1028063854) + W(1, 1021975879, 1033612769, -1119579693, 1040487308) + + W(2, -1088595541, 1050146519, -1090859444, -1107336769) + + W(3, -1105868965, 1041431951, -1112749441, 1042279365) + W(4, 1060560783, -1093128727, 1057304640, 1071289406) + + W(5, -1087527230, -1086794372, 982969010, -1089785065) + W(6, 1061831343, -1098317152, 1057012981, 1069689231) + + W(7, -1097221007, -1086042421, 1033122226, -1088997285) + + W(8, -1089452071, 1042347964, -1095995319, -1096815763) + + W(9, -1104502319, 1049524493, -1104150062, -1135764460) + + W(10, -1101640393, 1038452583, -1105624394, 1041229675) + + W(11, 1037791301, -1143180172, 1029453052, 1049121852); + WS(-1080642303, 1037515653); + sum1 = W(0, 1014399585, 1040389217, 1025436037, 1035628117) + W(1, 1032176658, 1019714410, 1031481267, -1129425897) + + W(2, -1123461796, 1009459592, -1118449912, -1111999897) + + W(3, 1042449564, -1098862637, 1015874414, -1108656118) + + W(4, -1115821917, -1138501592, 1046808963, 1046961203) + + W(5, -1085801589, 1042823052, 1032561937, 1022709518) + W(6, 1037702505, 1046330151, -1088063230, 1048171302) + + W(7, 1046621083, 1033619294, 1017602698, -1172911161) + + W(8, -1105260875, -1113097082, -1166545913, -1112931778) + + W(9, -1116953058, -1108126015, 1033606503, -1161936349) + + W(10, -1134503912, 1032999462, 1011659972, 1033647146) + + W(11, 1020514160, 1023868127, 1030447848, 1015791986); + sum2 = W(0, -1139497271, 1025910769, -1105297083, 1037339247) + + W(1, -1111547600, -1123186639, 1029488041, -1137152287) + + W(2, -1104932637, 1043978669, -1105480129, 1037617885) + + W(3, -1107402541, -1105522985, 1011577705, -1102258444) + + W(4, 1000924601, -1116100213, -1102785010, 1049988969) + W(5, 1045831134, 1040977948, 1036894407, 1025599417) + + W(6, 1034980171, 1042493673, 1044002411, 1050036780) + W(7, 1039942071, -1097804729, 1042714488, -1139888185) + + W(8, -1102656208, 1038409695, -1098474508, -1122964745) + + W(9, -1106907325, 1028039731, -1112976714, -1112698813) + + W(10, -1154378706, 1025837919, -1109802618, 1036616991) + + W(11, -1132149525, -1111839940, 1040500443, -1114191023); + WS(1060124606, -1084472548); + sum1 = W(0, 1012638700, -1131934189, -1129347279, -1138043955) + W(1, 1007380511, 1022374575, 996895579, 992489843) + + W(2, -1112711971, 1021193865, -1125331574, 1048955067) + + W(3, -1106488069, -1115361884, -1120058426, -1118477310) + + W(4, 1024524352, 1017460401, -1113956442, -1094951982) + + W(5, 1048203795, 1005249701, 1026650437, -1129456851) + W(6, 1032623962, -1117271615, 1049120342, 1015143283) + + W(7, -1110142007, 1024310560, -1121731240, 1036683482) + + W(8, -1115629480, 1023262959, -1108495481, 1031640934) + + W(9, -1129214986, -1136673413, 1017029987, -1115998674) + + W(10, 1027484509, -1157409515, 1010910287, 1021584239) + + W(11, -1144904917, 1017598403, -1145343061, 1014521967); + sum2 = W(0, -1113301049, -1129519836, -1113144608, -1114997262) + + W(1, 1028189537, -1144798799, -1135227415, -1123606042) + + W(2, 1041723134, 1018887182, 1065721494, 1081282167) + W(3, 1053752802, 1004635839, 1024321495, 1032429021) + + W(4, -1119425470, -1123219625, -1082046556, -1068115046) + + W(5, -1091841582, -1126716683, -1149813598, -1137534547) + + W(6, 1012563935, 1021107126, 1032971141, -1092304788) + W(7, -1120681827, 1026059029, 992723582, -1121765421) + + W(8, 1013366251, -1131491053, -1132479565, 1028331651) + + W(9, 1021570574, -1132445755, 1010781703, 1024141029) + + W(10, -1135264199, 1017265018, -1135106943, 927030725) + + W(11, 983594844, -1137356791, 959859164, -1123588459); + WS(1064307390, 997943845); + sum1 = W(0, 1016504192, 1004931163, 1001468389, -1125536771) + W(1, 1024701821, -1157300426, 1008115882, 1014991280) + + W(2, -1110031838, -1124632947, -1106796660, -1132488742) + + W(3, -1111862756, -1111316170, -1153319146, -1116314499) + + W(4, -1108555962, -1129767067, -1106350773, -1097456765) + + W(5, 1040312105, -1110123941, 1030600762, -1109063375) + W(6, 1047561626, 1003984285, 1053522405, 1050670238) + + W(7, -1128004006, 1039422954, 1005773541, 1042190650) + + W(8, -1114174882, 1017992857, -1106382906, -1136221548) + + W(9, -1123896954, 1020844396, 1015300557, 1024320647) + W(10, 1004953741, 1018940039, 1000370245, 1015934681) + + W(11, 1011062590, -1128259885, -1153739770, -1130969505); + sum2 = W(0, 1036505224, 1018720963, 1037554666, 1035136259) + W(1, -1131720942, 1012123245, 1027168757, 1024471767) + + W(2, -1100095598, -1119632397, -1082101932, -1072130218) + + W(3, -1090292986, -1114842502, -1108983905, -1105383800) + + W(4, 1039944480, 1033659023, 1064933062, 1074634461) + W(5, 1057038142, 1046242606, 1018437263, 1041395450) + + W(6, -1110028565, 1025734363, -1103479495, 1012777017) + + W(7, -1132873326, -1117820012, -1117294599, 1033191694) + + W(8, 1016119595, 1015545311, 1036578506, 1036162128) + + W(9, -1120419990, -1115011900, 1004277346, -1113427773) + + W(10, 1017378303, -1126149289, 1022196513, -1118704038) + + W(11, 1020047721, 1033886326, -1136709697, 1024978781); + WS(1053812476, -1113586226); + sum1 = + W(0, -1130399840, 1028349447, 1021963321, -1121520129) + W(1, 1020769785, -1115853964, 1021860117, -1121122124) + + W(2, -1111011390, -1120416825, -1107941440, -1106086226) + + W(3, -1129958415, -1107644952, -1122155502, -1114352785) + + W(4, 1007197394, -1105796643, 1056809437, 1046348585) + W(5, -1090756230, 1050300257, -1116443513, 1041113720) + + W(6, 1037708373, 1044272829, -1093131829, 1057081835) + W(7, 1059679544, -1119895572, 1040260199, -1110926804) + + W(8, -1122978308, -1110423782, -1122097703, -1099751719) + + W(9, -1102044582, -1111488955, 1019054925, -1156322407) + + W(10, -1139049030, -1125249991, 1011721762, -1114497366) + + W(11, 1018253471, 1022041005, -1121197023, -1135672898); + sum2 = W(0, 1015672618, -1121994623, -1149412980, -1127744422) + + W(1, 990134373, 1024671460, -1132259460, -1125579600) + W(2, 1010541588, 1032866568, 1044676778, -1124040172) + + W(3, -1102290659, 1029499881, -1120084193, 1001699435) + + W(4, -1115998566, 1011616452, -1107438884, 1058620442) + + W(5, 1049322309, -1104592911, 1035840939, -1123886068) + + W(6, 1020421847, -1095022641, -1097106911, 1015017230) + + W(7, -1104275347, 1045525693, -1119993661, 1037165892) + + W(8, -1129704409, 1020628925, -1112769863, -1113422252) + + W(9, 1039268635, 1026741584, 999745387, -1126762930) + W(10, 1015113530, 1017019595, 1022483811, 1015061518) + + W(11, -1114030797, -1136765715, -1131682952, -1134246014); + WS(1059863230, -1098226968); + sum1 = + W(0, -1111154474, 1033627108, -1111220881, 1018934285) + W(1, -1156119577, -1108034825, 1035708952, -1116166225) + + W(2, -1130042625, 1044463840, -1098768819, 1036585799) + + W(3, 1041677635, -1100472134, 1038444026, -1111999396) + + W(4, -1124092147, -1125693093, 1043860042, -1094381437) + W(5, 1034781361, 1038465479, 1027036095, 1019243847) + + W(6, -1126659421, 1045974478, 1040108899, -1098844542) + W(7, 1051479065, -1096809363, 1040658808, 1003830125) + + W(8, -1116454602, 1040744732, -1149847241, 1043775752) + + W(9, 1046003792, -1121805723, 1037992790, -1131289879) + + W(10, -1109234699, 1026252457, -1103478147, -1107008620) + + W(11, -1127254569, -1105262391, 1038964162, -1116821910); + sum2 = W(0, 1031860762, -1114215534, 1037917300, -1123072391) + + W(1, -1121765219, 1036233577, -1113082189, 1007761049) + + W(2, 1008804487, -1119320351, 1028769566, -1145928741) + + W(3, -1118791492, 1035112755, -1119166399, 1034891236) + + W(4, 1036033743, -1105317049, 1033869945, -1104666827) + + W(5, -1103277106, 1043081028, -1110309063, 1003334201) + + W(6, -1130814575, -1126605754, 1029943513, 1058632863) + + W(7, 1010033985, 1033184724, -1124066564, -1146667244) + + W(8, -1114717025, -1103884858, -1097519272, -1084821476) + + W(9, -1091781337, -1108906997, -1105454190, -1124982586) + + W(10, 1042429978, 1019583714, 1050527129, 1057878257) + + W(11, 1047090522, 1050006554, -1116436299, 1037673833); + WS(1053829756, -1108691549); + sum1 = W(0, 1014621415, -1117035633, 1017668333, -1121088251) + + W(1, -1113943163, 1027915142, -1117882340, 1018110476) + W(2, 1034972923, 1031518451, 1028891034, 1043029617) + + W(3, 1037608353, -1118505878, 1008280866, -1114328254) + + W(4, -1105089900, -1146432572, -1111069516, 1052288956) + + W(5, 1043183409, 1040529537, -1127832039, 1025673432) + + W(6, -1121242915, 1011744694, -1099260407, -1096216885) + + W(7, -1109446679, 1033001703, 1023717270, 1038283409) + W(8, 1024842558, -1195363583, 1035963185, 1043236853) + + W(9, -1104376301, -1110826184, -1108863440, -1136644866) + + W(10, -1125107735, 1024600093, -1111257697, 1022444749) + + W(11, 1008767270, 983774736, 1021787123, -1122279626); + sum2 = + W(0, 1011466728, -1128158188, 993685376, 1021341187) + W(1, -1125064327, 1016637363, -1135616946, -1142265296) + + W(2, -1153535168, -1133074596, -1111924694, 1041916532) + + W(3, -1115375045, -1111577830, -1121861231, -1139232914) + + W(4, -1121363658, -1108077390, 1048370655, -1088803436) + W(5, 1050909934, 1048268187, 1028734454, 1033829714) + + W(6, -1113493290, 1031842286, -1096696142, -1097359431) + + W(7, 1066069354, -1102058354, -1112810542, -1108918948) + + W(8, 1016979229, -1114077565, 1032702600, 1051606360) + + W(9, -1108957150, -1106393780, -1104652034, -1124153420) + + W(10, -1121975877, 1032726750, -1126878203, 1020447303) + + W(11, -1115472084, 1011253904, 1032484333, -1135690267); + WS(1043379192, -1131322837); + sum1 = + W(0, -1129021027, -1148980502, -1117253390, 1015261926) + W(1, 1024719214, -1130947836, 974083843, 1010796022) + + W(2, -1109595831, -1141769560, -1131540259, 1038059198) + W(3, 1043151230, 1040366611, 1036650848, 1032003186) + + W(4, 1033800339, 1040943040, -1099641090, 1019360940) + W(5, 1047704456, -1120007803, 1032688054, -1135300928) + + W(6, 1042153991, 1016895818, 1040857522, -1103092216) + + W(7, -1091529984, -1100986498, -1116706574, -1114490317) + + W(8, -1099711038, 1029537886, -1104535414, 1032384358) + W(9, 1043292971, 1031568104, 1019020464, 1026900536) + + W(10, 1026187331, 1023917269, 999787984, -1137467256) + + W(11, 1021851650, -1117455240, 1021119266, -1124200964); + sum2 = W(0, -1127801857, -1143073539, -1106914355, -1114698807) + + W(1, -1129241721, 1034854605, 1015357631, 1026781991) + W(2, 1028175283, 1010285366, 1045024365, -1107796176) + + W(3, -1093181393, -1094857339, -1104001534, -1106206681) + + W(4, -1129802997, 1022418743, -1109183829, 1055188047) + + W(5, 1060464193, 1038631095, 1035894131, -1121422795) + + W(6, -1133354170, -1111757330, 1035388549, -1099199714) + + W(7, -1108056884, 1042537531, 1019867695, 1010545294) + W(8, -1129332011, 1032847739, 1028119663, 1027769667) + + W(9, 1015260775, -1123722407, 1021694327, -1120402439) + + W(10, 1029358411, -1119713292, 984677997, -1126683209) + + W(11, -1117802232, 1025618013, -1116557581, 1021478623); + WS(1049844732, -1121310639); + sum1 = + W(0, 1023733410, -1099209689, 1040893204, -1102957277) + W(1, -1114244983, -1136674298, -1108461358, 1021220348) + + W(2, 1044402267, -1106734859, 1050332331, -1111686974) + + W(3, -1122456058, 1049981942, -1102278760, 1043895987) + + W(4, 1053233309, -1108848000, 1049912979, -1098618899) + W(5, 1048539349, -1111429758, 1039273110, 1048170180) + + W(6, -1096212219, -1103164857, -1099336615, -1097562740) + + W(7, -1096335583, 1033031043, -1102589972, -1101337719) + + W(8, 1051767783, -1109302031, 1050917291, -1121562509) + W(9, 1042792075, 1039550692, 1008842338, 1041281742) + + W(10, -1114613442, -1129199659, 1033787229, -1111886543) + + W(11, -1121890370, 1041151474, -1104020956, 1031699907); + sum2 = W(0, 1051830333, 1052363768, 1062286287, 1068323273) + W(1, 1062941652, 1058036233, 1038399576, 1029358050) + + W(2, 1040398919, 1056364330, -1105094784, -1117763636) + + W(3, -1117097644, -1135317262, 1045469136, -1127713443) + + W(4, -1088812275, -1088095023, -1083945825, -1086712736) + + W(5, -1085128967, -1090471655, -1096613184, -1118175248) + + W(6, -1112895824, -1128031249, -1110939052, -1122350162) + + W(7, -1107088013, -1117471490, -1128774604, 1023889083) + + W(8, 1030823820, -1126124865, -1131257287, 1034881723) + W(9, 993374262, 1022005418, -1124473506, 1006015479) + + W(10, -1120174945, 1022839272, -1113476028, 1031923437) + + W(11, -1149114843, -1131972943, 1015689530, -1114795832); + WS(997080576, -1130763300); + sum1 = W(0, -1113905570, 1030153879, -1117230256, -1152616277) + + W(1, -1146808706, -1112646432, -1186209359, -1120216576) + + W(2, -1121320815, -1108108727, -1100762033, -1090117932) + + W(3, -1109500574, -1102311764, -1119610882, -1099135446) + + W(4, 1038521748, 1032364321, 1051702873, 1069923213) + W(5, -1104049339, 1028696893, -1120830317, 1030578386) + + W(6, 1025325853, -1131460303, 1040312882, 1063008042) + + W(7, 1056019095, -1115439812, -1125581089, -1116447004) + + W(8, -1108459484, -1152289285, -1099800679, -1092045374) + + W(9, -1100849447, -1105934578, 1028735898, -1108771165) + + W(10, -1123369669, -1111143084, 1018134009, -1116551136) + + W(11, 1015899783, -1120248394, -1113190874, -1120342084); + sum2 = W(0, -1130955153, -1115062100, -1114768924, 1040485485) + + W(1, -1102247365, 1040365390, -1105380703, -1134789779) + + W(2, 1025142055, 1033634795, -1114031272, -1115074190) + + W(3, -1110799922, 1039570131, -1112489130, 1035629875) + + W(4, 1025405091, -1124058081, 1047530952, -1104495565) + + W(5, 1038913214, -1102056033, -1123724877, -1104428707) + + W(6, 1041203911, -1151569099, -1160505239, 1065129660) + + W(7, -1115442088, 1037120419, -1145632358, 1035843769) + + W(8, 1034798579, -1098708869, 1048498835, -1095909934) + + W(9, -1105078519, 1024518769, -1109649658, -1117935125) + + W(10, -1107186683, 1041850582, -1097808347, 1045395705) + + W(11, -1106337339, 1007217475, -1152795787, -1124566009); + WS(-1078383103, 1059446981); + sum1 = + W(0, -1139864362, 1022304576, -1117916615, 1007335089) + W(1, -1119884647, 1022280942, 1023668405, 1034312731) + + W(2, -1142609202, 1008862865, -1109139429, 1032501274) + W(3, 982044231, -1115332063, 991223187, -1102309771) + + W(4, -1105667544, -1100327790, -1098424968, -1089810345) + + W(5, 1033240873, 1049118183, -1140016273, -1110413061) + W(6, 1048881003, 1047898440, 1053051896, -1104044598) + + W(7, 1051763270, -1113330784, 1027424455, 1032557738) + W(8, -1110989208, 1029966423, 1023833874, 1040575921) + + W(9, -1114053146, 1041606896, -1122699729, 1041157596) + + W(10, 1019807480, -1128249884, -1114518074, 1013296733) + + W(11, -1110353213, -1126749570, 1021514772, -1121516731); + sum2 = W(0, -1143648694, 1022767513, 963325627, -1138915747) + W(1, 1040530304, 1031585165, 1008260859, -1120690652) + + W(2, 1050457027, -1104882348, 1052893834, -1122824043) + + W(3, 1019582897, -1094902239, -1113748748, -1090635807) + + W(4, -1090901428, 1017677825, -1090554669, 1048412513) + + W(5, -1101863176, -1104950416, -1120605391, 1056780417) + + W(6, -1095258955, -1116653154, 1030383529, 1063122641) + + W(7, -1089352859, 1057380402, -1106433792, 1049388154) + + W(8, 1047388223, -1125154789, -1114292033, -1118207917) + + W(9, 1048190601, -1102824630, 1038107916, -1104842210) + + W(10, 1034828442, -1149114774, 1040557770, 1005930742) + + W(11, 980397999, 1033506230, -1115355457, -1136517107); + WS(-1104952056, -1073278929); + sum1 = + W(0, -1144211169, 1031125659, -1121100585, -1142367854) + W(1, 1025675017, -1114298540, 1036563163, -1122834968) + + W(2, -1099507218, -1116651974, -1101060075, -1105066053) + + W(3, -1131576359, -1114707952, -1120605819, -1111900952) + + W(4, 1047627264, -1113308557, 1054491321, 1039149624) + W(5, -1106626380, 1042584197, -1128818827, 1039018645) + + W(6, 1043300637, 1037274304, -1102367022, 1051689271) + W(7, 1044811828, -1128472513, 1045578618, -1115669626) + + W(8, -1098196346, -1126577137, -1102852173, -1106731162) + + W(9, -1111689619, -1126957444, 992521004, 1025441875) + + W(10, 1030331294, -1122667056, 1026346581, -1120693369) + + W(11, 1018492983, -1140414731, -1128018583, 997033420); + sum2 = + W(0, -1117577133, -1139616023, 997820975, 1028627780) + W(1, -1114909048, 1032747040, -1116006677, 1030832637) + + W(2, 1036324905, -1124977156, -1120808104, -1109376562) + W(3, 1029259135, -1145526876, 1022442689, 983753970) + + W(4, 1012676607, -1115101040, 1041273688, 1049990275) + W(5, 1043064430, 1039154681, 1027909669, -1115224952) + + W(6, -1164734594, 1032695755, 1041759226, -1096754642) + + W(7, 1041324783, -1094055114, -1098711698, 1023440264) + + W(8, 1039853902, -1116113854, 1041255405, -1106762918) + + W(9, -1111929038, 1025837595, -1130147608, -1112181665) + + W(10, -1110394349, 1006188424, -1120661488, 1033535767) + + W(11, 1021759445, 1023476809, -1133986843, 1029342490); + WS(1057403966, -1096678293); + sum1 = W(0, 1015545167, 1013920108, 1030182836, 991347091) + W(1, 1031028372, -1130110920, -1137745417, -1127755335) + + W(2, -1133819725, -1127594402, 1031500952, -1107540753) + + W(3, 1042502792, -1120427420, 1023814022, -1113612941) + + W(4, 1037006758, -1136130453, 1042283546, 1040431359) + W(5, -1084295706, 1042737160, 1019878434, 1042334622) + + W(6, -1110196161, -1123399563, -1086200264, 1060132444) + + W(7, 1049379651, 1001749345, 1023472436, -1123659840) + + W(8, -1111752718, 1041684833, 1047364560, -1104881213) + + W(9, -1113607001, -1117219726, 1017968636, 1008021369) + + W(10, 1028708905, -1119121787, -1120221088, 1006406689) + + W(11, 1002061113, 1026883950, -1124476270, 1011156129); + sum2 = + W(0, -1178786588, 1027650789, 1004569898, 1010647389) + W(1, -1130907066, -1128412421, 1000455394, 1019136642) + + W(2, -1129322914, -1117835702, -1120140062, -1110565129) + + W(3, 1046200355, 1035331810, 1040609034, -1114775527) + W(4, -1116170217, -1106357388, 1012300621, 1051050908) + + W(5, -1094299123, 1038925264, -1110352470, 1028674911) + W(6, 1036181740, 1050236879, 1029537087, -1121260831) + + W(7, -1105419536, -1104188032, -1148832482, 1009994365) + + W(8, 1016863918, -1107702296, -1115347042, 1019718506) + W(9, 1018471790, 1035623426, 1031812039, -1129304944) + + W(10, -1132924585, -1127926494, 1007741857, -1147888890) + + W(11, -1122466004, -1132432621, -1132484471, -1146317634); + WS(1056335484, -1129697442); + sum1 = W(0, -1118615510, -1123816285, 1016357093, -1126548591) + + W(1, 1017679973, -1125007109, -1130509569, -1127256452) + + W(2, 1026825265, -1162479083, -1123245334, -1115166368) + + W(3, 993334229, 1009460392, -1117686884, -1110259820) + + W(4, -1102686619, -1175208362, -1112742573, 1012633705) + + W(5, 1048503365, -1110640192, 1010107581, 1008538193) + W(6, 1045269336, -1122870505, 1056143939, 1022501065) + + W(7, 1044007618, 1043433395, 1037226473, 1040188728) + W(8, 1031523962, 1025178018, -1115481871, -1098786498) + + W(9, -1107348056, -1104721331, -1124234681, -1112073470) + + W(10, -1140818205, -1112741005, 1004860403, -1121817826) + + W(11, -1134864917, -1142571619, -1120701013, 1004599859); + sum2 = W(0, -1140731697, 1018164054, -1116322329, 1033668632) + W(1, -1110091010, 1006827755, 1024608202, 978878091) + + W(2, -1126783010, -1144859189, -1148034885, -1111621890) + + W(3, 1034430751, -1133278289, -1134565598, -1106732021) + + W(4, 1035005186, 1011714049, -1112384840, 1057652336) + W(5, -1103655808, 1035575897, 1007536733, 1017810394) + + W(6, -1110815467, 1039236492, -1109778149, 1053123628) + + W(7, -1113563636, 1009902097, 1031837967, 1032913014) + + W(8, -1144657885, -1130754383, -1113329105, -1107649638) + + W(9, -1112793157, -1136830370, -1131576514, -1118754368) + + W(10, -1127206230, -1146205013, -1113225660, 1012470213) + + W(11, -1113811608, -1126431906, 1007646275, -1123083034); + WS(1064654654, 1035088379); + sum1 = W(0, -1123150274, 1013730923, -1124984926, -1143080352) + + W(1, -1115541655, -1120446591, 1019709882, -1123168830) + + W(2, -1101065371, -1104968795, -1104298005, -1097917367) + + W(3, -1115560637, -1112072243, -1121553409, -1101025669) + + W(4, 1052021669, 1043838624, 1050953841, 1053857683) + + W(5, -1098028717, -1118042236, -1117850604, 1024509393) + + W(6, 1034671630, -1116995686, -1125221929, 1053311748) + W(7, 1054064059, 1056948345, 1047317764, 1051915779) + + W(8, -1103122974, 1025043295, -1102292982, -1101557747) + + W(9, -1102206963, -1099829586, -1123986585, -1105952782) + + W(10, -1124628232, -1123853974, -1122875259, -1129945790) + + W(11, -1115475969, 1010096420, -1120157778, 1010117900); + sum2 = + W(0, -1115290116, 1036300391, -1109664288, 1023887773) + W(1, 1031338337, -1112746552, 1029647363, -1123357025) + + W(2, -1109338596, -1120873277, -1133763869, -1110763968) + + W(3, -1104363651, -1111086518, 1014654409, -1113327782) + W(4, 1052546267, 1031940424, 1041363997, 1046589307) + + W(5, 1038758869, 1026186944, 1011886363, -1114411312) + W(6, -1101682429, 1045633640, -1094977574, 1050150667) + + W(7, -1104681827, -1121584221, 1042076972, 1033926660) + + W(8, -1106866549, -1121551223, 1008614181, -1110488084) + + W(9, -1120223295, 1035823152, -1111033402, 1046305164) + + W(10, 1027635895, 1021591180, -1119215823, 1009099129) + + W(11, 1016354897, -1115537942, 1012736237, -1109553196); + WS(-1088190206, -1108558078); + sum1 = W(0, -1109712467, 1034096473, -1111610193, -1111503908) + + W(1, 1029528067, -1109918121, -1130336610, -1110290409) + + W(2, 1048826552, -1100191472, 1051587686, -1114238856) + + W(3, -1124911644, 1053388852, -1101598429, 1049826386) + + W(4, -1117596347, -1104233509, -1112703594, -1118548075) + + W(5, -1094857227, 1040678692, -1102065648, -1108498290) + + W(6, 1045129740, 1021528052, -1123092480, 1045282957) + W(7, 1041941490, -1121835291, 1050563972, 1032628503) + + W(8, -1145103958, 1015098342, 1033306871, -1105600408) + + W(9, -1116887040, 1043572363, -1101594283, 1041251987) + + W(10, 1040739958, -1095362037, 1043699492, -1112734841) + + W(11, -1106244021, 1044475255, -1100499697, 1015959598); + sum2 = + W(0, -1140036524, -1122134368, -1124742331, 1023368729) + W(1, 1025643512, -1117935205, 1029315286, -1121900993) + + W(2, 1033121292, -1135675176, 1022385651, 1037868584) + W(3, -1113410705, 1034815986, -1106876578, 1029051910) + + W(4, 1020537037, -1102563608, 1017232470, -1097085277) + + W(5, 1026038978, -1107749524, -1116418603, 1013163432) + + W(6, -1094559771, -1090683436, -1089829937, -1081905013) + + W(7, -1085580324, -1093433405, -1100509010, -1107168757) + + W(8, 1042598592, 1049536131, 1015761873, -1122385293) + W(9, -1119606047, 1034046493, 1037794408, 1020109569) + + W(10, 1048560917, 1043095342, 1060516603, 1068776853) + W(11, 1062905414, 1053234619, 1023262329, 1038509970); + WS(1048802172, -1118644607); + sum1 = + W(0, 1022629891, 1001330921, -1147098739, 1023807923) + W(1, -1129374813, 1028532286, 1031375324, -1151549405) + + W(2, -1112271863, 1008285357, -1106982824, 1020475895) + W(3, 958183765, 1025640422, -1133565569, -1106868493) + + W(4, -1115934246, 1007889405, -1110669107, -1095657203) + + W(5, -1113474437, -1090481180, -1104303995, -1104624276) + + W(6, -1112205646, -1137992085, 1044651974, 1050363724) + W(7, 1050921091, 1050665633, 1037811271, 1049383075) + + W(8, 1050188943, 1025826270, 1026008921, 1011316531) + W(9, -1106529387, -1131537104, -1125009457, 1022847857) + + W(10, -1125264263, -1127716075, -1113499645, 1026946398) + + W(11, -1121270209, 1021652689, 1014192325, -1142930963); + sum2 = W(0, 1016559128, -1119933527, 1008526536, 1034816070) + W(1, 1018959568, 1026554777, -1112891495, 1046177388) + + W(2, -1089262209, 1032931419, -1094914643, -1096197918) + + W(3, -1101210129, 1049415798, -1128790619, 1043157162) + + W(4, 1053795811, -1108360154, 1052999976, 1069558608) + + W(5, -1103281588, -1085501184, -1098019814, -1088254262) + + W(6, 1058569170, -1097574423, 1052760357, 1058007152) + + W(7, -1106340652, -1101474305, -1114646508, -1096632714) + + W(8, -1094475155, 1036603460, -1106271635, 1022028102) + + W(9, -1121182797, 1027756295, -1124734105, 1015426864) + + W(10, 1008650912, -1121755244, 1039081818, 1004102711) + + W(11, 1033515588, 1032461240, -1118822413, 1043397723); + WS(-1085648446, -1079079370); + sum1 = W(0, 1031831473, -1114079994, 1031367567, -1118896788) + + W(1, -1123680847, 1033718927, -1123944253, 1033541103) + W(2, 1036117159, 1003975776, 1044164867, 1045647319) + + W(3, 1033826253, 1041970952, 1024952417, 1040029267) + W(4, 1049939273, 1042007752, 1043312672, -1095211959) + + W(5, -1122554975, -1116359196, -1176880640, 1026974961) + + W(6, -1094329359, -1097850009, -1089391360, -1087218668) + + W(7, -1100203021, 1033960979, -1108529239, -1111794397) + + W(8, 1040633606, -1134555900, 1041283678, 1044809099) + W(9, 1046447947, 1042238738, 1024390649, 996515216) + + W(10, 1023486628, 1019647980, 1023951387, 1014099708) + + W(11, 1017251780, 1031788713, -1146375056, 1033511473); + sum2 = W(0, 1019169584, -1120973142, 1033125970, 1025364316) + + W(1, -1109812797, 1040314133, -1108282977, 1018923536) + + W(2, 1042983019, 1009997472, -1103915398, 1036688212) + + W(3, -1125420780, -1119986230, 1034277286, -1117630132) + + W(4, -1098354632, -1106283039, 1033722376, 1062322516) + + W(5, -1098634798, 1057333054, -1102308141, -1125368820) + + W(6, -1099987280, 1032814660, -1095179878, 1032770062) + + W(7, -1109050948, -1097734639, 1034195486, 1049154263) + + W(8, 1048978343, -1103033329, 1055664562, -1097173506) + + W(9, -1103688168, -1173745415, -1107997912, -1098308929) + + W(10, -1118546716, 1022934360, -1110281795, 1045599869) + + W(11, -1119010038, 1038965178, 1007528912, 1035253180); + WS(-1089355774, -1078290086); + sum1 = W(0, -1122950775, -1112691207, 1023290087, -1107733500) + + W(1, -1146188190, -1132821263, -1112282369, -1116356099) + + W(2, 1037182841, -1124344033, 1046400294, -1118583361) + + W(3, 1042531744, -1121639475, -1137408791, 1018516820) + + W(4, -1118638572, 1041047393, -1098349922, 1057481334) + + W(5, -1139289650, -1109625472, 1026873009, -1139389015) + + W(6, -1121667553, -1104403323, -1099164822, 1054069421) + + W(7, -1097191323, 1041114291, -1120861012, -1139200383) + + W(8, 1009124079, -1138062223, 1044398104, -1149431076) + + W(9, 1044515332, -1120573261, -1120947806, 1017011067) + + W(10, -1115334660, -1126199861, -1136525567, -1110719762) + + W(11, 1015659149, -1121643278, -1122889719, -1120569352); + sum2 = + W(0, -1120919296, 1009843654, -1132368064, 1020138111) + W(1, 1029564211, -1115205032, 1016741875, -1119663171) + + W(2, -1124567280, -1107129213, 1020831927, -1098918731) + + W(3, -1132836513, 1010227332, -1118685376, 1026001154) + W(4, 1037030993, 1043380414, -1109288357, 1059483198) + + W(5, -1119273466, -1106893419, 1028452918, -1135273053) + + W(6, -1120629799, -1102119519, -1112537154, 1064361176) + + W(7, -1104145236, 1043150197, -1117770026, 1019055438) + + W(8, -1106639281, 1030878171, -1118412551, -1093377806) + + W(9, -1123848756, -1103899854, 1024207514, -1109882780) + + W(10, 1020211370, -1126825280, -1144175329, -1146281491) + + W(11, -1135251423, 1028327527, -1128215590, 1024565629); + WS(1064975294, 1066308158); + sum1 = + W(0, 1031747776, -1106142801, 1028818885, 1001228109) + W(1, -1115396498, 1041342669, -1108139113, 1027821620) + + W(2, -1119071204, 1032019633, 1041375482, -1112793497) + W(3, 1013499583, -1123968938, 1024220311, 1020544662) + + W(4, 984462229, 1045090381, -1093262116, 1049965274) + W(5, 1052662103, -1113450905, 1035427697, -1138282267) + + W(6, -1132055971, -1108909198, 1038243096, 1021279149) + + W(7, -1090377239, 1040402543, -1107965954, -1116422289) + + W(8, -1148253029, -1110036442, 1036945928, -1115536386) + W(9, 1034061985, 993049059, -1113141447, 1016907357) + + W(10, -1126913907, 1036419718, -1121925745, 1019907753) + + W(11, 1032108124, -1109636927, 1032825796, -1128061041); + sum2 = + W(0, 1016610899, -1135553471, -1163068737, -1147979120) + W(1, -1121296916, -1139692219, 1007282246, 1019770181) + + W(2, -1118189976, 1018031354, -1120752887, 1035872696) + + W(3, 1034250650, 1022157658, -1131969269, -1131641536) + + W(4, 1027283971, -1118352328, 1042584076, -1095799786) + + W(5, 1009508653, -1121907329, -1148404200, 1013257077) + W(6, 1028895363, 1032145382, 1042427003, 1073605475) + + W(7, 1056095764, -1130051225, 1025403981, -1121748387) + + W(8, -1113530321, -1123867563, -1099207121, -1075418961) + + W(9, -1091570337, -1113117501, -1124635978, -1123610989) + + W(10, 1007846553, 1011272254, 1010785270, 1026092591) + W(11, 1030054693, 1019567305, 1012575724, 1018865930); + WS(1062423998, 1020226002); + sum1 = + W(0, -1122384152, 1000976853, -1122957973, -1140430696) + W(1, 1018079658, -1116871589, 1021042950, -1130305609) + + W(2, -1116470612, 1015809956, -1115150860, -1100102424) + + W(3, -1099378776, -1102397253, -1121061927, -1097083551) + + W(4, -1095861522, -1125526476, -1101122465, 1051208664) + W(5, 1045734276, 1040938184, 1045437908, 1049869175) + + W(6, 1055717600, 1034182342, 1052715645, 1053221217) + W(7, 1041738487, 1038184662, -1114085178, 1019939330) + + W(8, -1128557498, -1136390676, -1101688288, -1097231798) + + W(9, -1114764537, -1107259340, 1034631967, -1105843464) + + W(10, -1133541800, 1025071548, -1121585121, 1026360261) + + W(11, -1127628368, -1121765359, 1018430000, -1122412137); + sum2 = + W(0, -1125184611, 985313435, -1181860650, -1124740239) + W(1, -1132645547, 999484231, -1125466771, 1024683619) + + W(2, -1124729770, -1132095255, 1028760415, 1011065519) + + W(3, 1033849803, 1015359010, -1140486285, -1125848669) + + W(4, 1045115043, -1117207517, 1036693207, -1088457353) + + W(5, -1096437481, 1048821220, -1107942084, 1027562883) + + W(6, 1058112728, 1067077185, -1107623537, -1080660794) + + W(7, -1109418981, -1117188353, 1027196953, -1127975224) + + W(8, 1023628890, -1158219675, 1043689375, 1020427720) + W(9, -1110185484, 1032363474, -1121893121, 1023023798) + + W(10, 1007171579, -1118062236, 1000645119, -1160295467) + + W(11, 1015083304, 1023561702, -1134577643, -1158549787); + WS(-1085592318, -1113086899); + sum1 = + W(0, -1127342656, 1024334944, -1107952998, 1034498345) + W(1, -1131633306, -1110168462, 1033648125, -1119681052) + + W(2, -1105245475, 1029597578, -1104926592, -1110412429) + + W(3, -1103724998, -1098176238, -1115323711, -1098367950) + + W(4, -1104578161, -1117644382, -1101901257, 1053247055) + W(5, 1051300307, 1051451939, 1049307889, 1053283054) + + W(6, 1053241687, 1041591201, 1051692021, 1044816720) + W(7, 1042909421, -1124765258, -1143558503, -1113485404) + + W(8, -1103827813, 1020278010, -1097952575, -1110749814) + + W(9, -1106968399, -1105195378, 1027981559, -1102600950) + + W(10, -1138537863, 1015573096, -1110174988, 1033881662) + + W(11, -1116328992, -1113141267, 1028312016, -1113790704); + sum2 = + W(0, 1019423143, -1134200265, 1022335641, -1126211289) + W(1, -1160177640, 995157684, -1138832033, -1130236057) + + W(2, -1118706158, -1122995556, -1113839515, -1123774588) + + W(3, 1002859666, -1114460336, -1131104601, 1027754115) + + W(4, -1110500850, 1021681136, -1121978030, 1048787768) + W(5, 1035034344, 1025695056, -1126984825, 1027074464) + + W(6, 982325064, -1106847870, 1042414810, 1052221246) + W(7, 1009324191, -1129766425, -1136621129, -1120353368) + + W(8, -1117883328, -1115095323, -1112736275, -1118959328) + + W(9, 1026260852, -1114723897, 1016807320, -1121253912) + + W(10, -1145733922, 1001371122, 1019850892, -1113736050) + + W(11, 1023767274, -1130130145, -1131688905, 992217060); + WS(1025516512, -1100199588); + sum1 = W(0, 1010096560, 998291066, 1015136529, 1016981531) + W(1, -1134306338, 1015217585, 1025573847, 1027586712) + + W(2, 1021891087, -1128181387, -1152435393, 1035336779) + + W(3, 1040424469, 1041134374, -1147235028, -1105873140) + W(4, 1041308560, 1015332531, 1054580194, 1043985948) + + W(5, -1088067164, -1097437107, -1108043523, 1024655979) + + W(6, -1106994989, -1097993736, -1087955312, 1049373383) + + W(7, 1048585956, 1044933000, 1037061588, 1041451309) + W(8, -1107391304, 1040752366, 1021987303, 1016493518) + + W(9, -1111549299, 1015283332, -1125444197, 1025261651) + + W(10, 1032706511, -1115681272, 1013936722, -1153713033) + + W(11, -1122756060, 1028860515, -1124931799, 1010373746); + sum2 = W(0, 1024904631, -1136864762, 1005033941, 1030076655) + W(1, 1022202973, 995105737, 1009257370, -1113660547) + + W(2, -1115115972, 1023564875, -1114446231, -1115188268) + + W(3, -1099782234, 1025338591, -1107689693, 1049272645) + + W(4, -1128899549, -1103710322, -1140124434, 1057566767) + + W(5, 1051976820, 1009750634, 1040613751, -1105716747) + + W(6, -1100416868, -1105139728, -1107001478, 1061216146) + + W(7, -1114917196, -1107279078, -1123762171, -1112133417) + + W(8, 1014205090, -1112771593, -1105823902, -1101449249) + + W(9, -1115621063, -1123827499, -1124460977, 1019919657) + + W(10, -1138213458, 1024304323, 1028369943, 1031401203) + + W(11, -1127316949, 1002907445, 1021828037, -1121285688); + WS(1050734204, -1108852232); + sum1 = W(0, -1111669430, 1026854009, -1115457556, 1022285659) + + W(1, -1130768721, -1124925681, 988348114, -1117352760) + + W(2, -1116292712, -1106093993, -1104273631, -1090233269) + + W(3, -1103820941, -1107176543, -1114665965, -1103610460) + + W(4, -1122281377, -1103616254, 1027625969, 1069754213) + + W(5, -1114752252, -1130883179, -1144129324, 1032882469) + + W(6, 1027495958, -1113635568, 1042550097, 1065691213) + W(7, 1054098174, 1026991873, 1018693905, 1034282506) + + W(8, -1113568120, -1125634353, -1100906821, -1090598793) + + W(9, -1103145534, -1107767585, 1007587914, -1112131865) + + W(10, -1123139966, -1117637392, -1147736996, 999398084) + + W(11, -1140005358, -1123096067, -1120005196, -1122062653); + sum2 = + W(0, 1024214881, -1122830075, 1024710111, -1118490155) + W(1, -1134765475, 1007204875, 955722144, -1132418382) + + W(2, -1105712489, 1026001227, -1105988647, 1044311614) + + W(3, -1128591966, 1016894538, -1132281374, -1121103003) + + W(4, -1096328526, -1089670730, -1109313571, 1057951288) + + W(5, 1031038781, -1135710147, -1121635711, 1040031313) + W(6, 1036545949, -1104892025, 1042923133, 1050757116) + + W(7, 1041007149, -1111844715, 982097434, -1131469166) + W(8, -1114697429, 1027384734, -1108836817, 1046225965) + + W(9, -1111832237, 1020988490, -1141601766, -1137288635) + + W(10, 1029115040, -1127506094, 1018384918, -1118982995) + + W(11, 1000957030, 1018633070, -1131312630, 1012074251); + WS(-1077332287, -1089760701); + sum1 = + W(0, 998476811, -1146931846, 1020090684, -1115596769) + W(1, 1018970620, -1117338894, -1131301080, -1134004534) + + W(2, -1126986618, -1106320367, -1103512376, -1106044643) + + W(3, 1033789092, -1121544222, 1025908912, -1120853460) + W(4, 1035645275, 1033143495, 1057100532, 1033806067) + + W(5, -1089559024, -1119052427, -1109205213, 1021655744) + + W(6, 1035996661, 1030948981, -1098691810, 1054020686) + W(7, 1053006209, 1053247323, -1117960094, -1112997269) + + W(8, -1111559939, -1116749294, -1114602228, -1102410839) + + W(9, -1114317262, -1148875196, 1040862618, 1024305160) + + W(10, 1002151576, -1132098378, 1020764052, -1131285468) + + W(11, -1143682184, -1140686688, -1112291776, -1137942600); + sum2 = + W(0, 1006079429, -1142220161, -1129651941, -1120056293) + W(1, 1021210606, -1138049810, 1020679942, -1144760977) + + W(2, 1015506585, 1012377004, 1027444401, 1027255740) + W(3, -1154390002, -1121552483, 988683875, -1149209645) + + W(4, -1129173219, 1019086641, 1029291472, -1087748986) + W(5, 1030702430, 1046290929, -1149010889, 958643736) + + W(6, -1126961905, 1027847692, -1099113060, -1071778912) + + W(7, 1077548482, 1017608723, 1009874569, -1165018915) + W(8, 1025558752, -1121396179, 1031608500, -1132223695) + + W(9, 1041292060, 1030045463, -1116313503, -1108302337) + + W(10, 1004493969, -1129089615, 1032469225, -1117547929) + + W(11, 1017793536, -1115202758, 1024909384, -1153372770); + WS(1054407548, 983325672); + sum1 = + W(0, 1028412425, -1115456470, 1017604747, 1031921957) + W(1, -1121692358, 1041128181, -1131299175, 1034097067) + + W(2, -1105600625, 1033490817, -1115519181, 1031550611) + + W(3, -1103698804, -1109550327, 1030793272, 1014014769) + + W(4, -1148390382, 1044756246, -1103922376, -1090010995) + + W(5, 1062123705, -1103937189, 1039103265, -1135652511) + + W(6, 1033571545, -1114006910, 1059608097, -1087252051) + + W(7, -1094628214, 1042983319, -1106569209, -1116995186) + + W(8, 1032293767, -1119790070, -1107101148, 1044072953) + W(9, 1027680451, 1021059262, 1007158719, -1141553278) + + W(10, -1124427701, 1037509878, 1007976775, 1022727275) + + W(11, 1033962892, -1108328080, 1032055396, -1143059662); + sum2 = + W(0, 1007145536, -1108956115, -1123468231, 1003522017) + W(1, -1106382527, 1023566518, -1116797301, 1016028592) + + W(2, 1011835040, 1040320325, 1009493536, 1036429861) + W(3, 1045134298, -1132203156, 1044032552, -1103689691) + + W(4, -1115291423, -1145921569, -1120694127, 1057547857) + + W(5, -1120933925, -1105348488, -1105744806, 1019566780) + + W(6, 1029973058, -1113530029, 1025444390, 1039825371) + W(7, -1093621604, 1030401418, -1111109931, 1039637835) + + W(8, 1036345379, -1116109872, -1106839609, 1028735446) + W(9, 1043632212, 1032927131, 1031187850, -1119043970) + + W(10, -1106716830, 1031627486, -1106619549, 1032586179) + + W(11, -1135351552, -1107014793, 1030984886, -1117261713); + WS(1062610366, -1081620328); + sum1 = W(0, 1034909184, 1022225638, 1022593144, 1034659649) + W(1, -1145063906, 1029979468, 1024460554, -1129493655) + + W(2, 1041975919, 1036878493, 1038275488, 1049110721) + W(3, 1039909252, 1050285945, 1032760119, 1052309552) + + W(4, 1038564634, 1032326503, 1032775158, -1104434937) + + W(5, -1098154666, -1091716385, -1098908862, -1093908076) + + W(6, -1086061975, -1097049310, -1094128798, -1097332230) + + W(7, -1096830529, 1031802154, -1125106744, 1033460244) + W(8, 1054071881, 1038246806, 1049378869, 1048167927) + + W(9, 1037005773, -1122539766, 1023442918, -1111713187) + + W(10, -1118145809, 1033815666, 984752392, 1040915883) + + W(11, -1127387550, 1042582214, 1025327999, 1038395208); + sum2 = W(0, 1025388154, 1001261778, 1007664153, 1018216589) + W(1, 1011431705, -1124915037, 1007167865, -1118462618) + + W(2, -1106689977, 1031762430, -1105078255, -1117638934) + + W(3, -1119019386, 1039919645, -1115769810, 1041969311) + + W(4, -1110560421, -1111104301, -1122922762, 1029938402) + + W(5, -1107704269, 1043034893, 1041034358, 1050092429) + + W(6, 1049316874, -1112011481, 1044332351, -1117360942) + + W(7, -1116357646, -1107523849, -1112781805, -1104673921) + + W(8, 983067209, 1033280635, -1133572905, 1022258405) + W(9, 1016143957, -1109485745, 1010088409, -1106654827) + + W(10, -1121273022, 1026153330, -1116643818, 1033323756) + + W(11, -1123412994, 1027380094, 1016238045, 1006440178); + WS(-1079099231, 1058224693); + sum1 = + W(0, -1136025729, 1041807413, -1113852830, 1038775953) + W(1, -1130024634, -1139925939, 1032899333, -1135488689) + + W(2, -1098612147, 1030021338, -1101745716, -1114342965) + + W(3, -1109189268, -1116898669, -1169623989, -1105924753) + + W(4, 1040574357, -1113591959, 1035906153, -1100940817) + + W(5, -1110548904, -1107090858, 983487291, -1105279552) + W(6, 1044962866, 1041390773, 1038641429, -1112997607) + + W(7, 1053521164, 1048687519, 1048553583, 1049805017) + W(8, -1107948018, 1030293261, -1102747762, -1131180663) + + W(9, -1102886695, -1127712365, 1020276366, 1033907987) + + W(10, -1152707357, 1019631368, -1119110697, 1008365619) + + W(11, -1120409456, -1156710253, -1137865855, -1120648241); + sum2 = + W(0, 1026221982, -1150712731, -1135858910, 998750602) + W(1, 1026066546, -1122173835, 1019885572, -1114797832) + + W(2, 1031288593, -1121646784, 1020650492, -1118866549) + + W(3, -1126679589, 1033676882, -1119823506, 1024418530) + + W(4, 1025270629, 1040465550, -1102699692, -1090773917) + W(5, -1103726643, 1038653616, 1044175124, 1035909226) + + W(6, -1105433524, -1099611845, -1077885918, -1073585027) + + W(7, -1083499628, 1072488285, 1076879885, 1053754278) + W(8, 1025604422, 1015298833, 1013887757, -1111404471) + + W(9, 1029004921, -1128843744, 1042609155, -1128976380) + + W(10, 1025361731, -1118571342, 1035533544, -1115122758) + + W(11, 1025173545, -1132364945, 982102231, -1120827581); + WS(1039418864, -1140458522); + sum1 = W(0, 983096624, 1029517505, -1121873782, 1019803894) + W(1, 1027911414, -1108005699, 1033576274, -1135118358) + + W(2, -1114535995, -1145085849, -1102746926, 1028523779) + + W(3, -1100878768, 1038991951, -1142936385, -1125909817) + + W(4, 1044450572, -1097839409, 1062380387, -1088253674) + + W(5, -1109645966, -1154916402, -1107146685, -1122115416) + + W(6, 1027001827, 1032347927, -1106235793, -1090653261) + W(7, 1061486174, 1029669390, 1047810758, 1038152785) + + W(8, -1117675070, 1031259878, -1105839880, 1036696746) + + W(9, -1097301074, 1024178544, 1038477872, 1041849616) + + W(10, 1035770150, -1104931415, 1033087169, -1121428646) + + W(11, -1120235273, 1035324408, -1108040973, 1017003668); + sum2 = W(0, -1121567066, 1034344084, -1105011035, -1142865888) + + W(1, -1136511728, -1106811819, 1032101677, -1113394506) + + W(2, 1033267920, 1026284945, 1033899226, -1120108491) + + W(3, -1122542627, -1120621959, -1134482876, -1114137407) + + W(4, -1104421963, -1103410132, 1022298858, 1057117238) + + W(5, 1038703002, 1033583066, -1122973141, 1030826553) + + W(6, -1130139832, 1037507308, -1102818563, 1003910328) + + W(7, 1043197066, -1124006960, -1124335993, -1125132432) + + W(8, -1132243276, 1034735332, 1044067085, 1041074904) + + W(9, -1101099519, -1109459597, 1041237660, -1128301632) + + W(10, 1024120715, -1109350039, -1127155070, 975508032) + + W(11, -1117378085, 1001772648, -1113899392, -1126301549); + WS(1053462780, -1083681865); + sum1 = W(0, 1023511963, -1126058411, 1027394040, -1118697149) + W(1, 993307519, 1025756296, -1131368524, 1029589575) + + W(2, 1041747598, 1015154794, 1045749945, 1048726745) + W(3, 1043007793, 1038169844, 1024626666, 1040782360) + + W(4, 1041497612, 1018224530, 1041814811, -1086401302) + + W(5, -1115623160, 1032344226, -1127070442, -1131398580) + + W(6, -1138339988, 996055791, 1014351349, -1082085657) + + W(7, -1096882594, -1105145572, -1110953740, -1110890258) + + W(8, 1035615616, 1027711272, 1040756601, 1048515830) + W(9, 1042139693, 1038148425, 1009997960, 1029718722) + + W(10, 1020629658, -1123213919, 1032965474, -1129047376) + + W(11, -1132054806, 1033289129, -1128695798, 1029252236); + sum2 = W(0, 1008350928, 1011413600, -1120704007, 1027382950) + W(1, -1127381517, 981904616, 1015535284, -1135583391) + + W(2, -1118714967, 1024023545, -1126562655, 1034951721) + + W(3, -1128407708, -1126139913, 999360844, -1138986423) + + W(4, 1030231193, -1124778398, -1110351493, 1052754126) + + W(5, 1033272406, -1151802072, 1013432992, -1123376913) + + W(6, -1091889801, -1098641764, -1104262464, 1057762368) + + W(7, -1161878816, 1012148800, 1024540201, 1031971990) + + W(8, -1108897465, 1033453825, -1106889474, 1035809187) + + W(9, -1132306565, -1153180738, 1014625240, -1118108772) + + W(10, 1032606711, -1125648711, 1025836907, -1131934955) + + W(11, -1134699254, -1131180247, -1171757551, -1140791326); + WS(-1099299320, 1056598066); + sum1 = W(0, 1006197652, -1128153660, -1136164796, 1035903322) + + W(1, -1130396894, 1036246880, -1124832314, 1029570879) + + W(2, -1127547996, 1041714651, 1029712499, -1128532088) + + W(3, -1106761055, -1121593759, 1017604226, 1017990507) + + W(4, -1106221946, -1098261544, -1085896508, 1057218165) + + W(5, 1054525467, 1028130044, 1036683414, 1016287010) + W(6, 1045972807, 1038366195, 1057638589, 1054413180) + + W(7, -1086573266, -1090476168, -1101308500, -1110319406) + + W(8, 1004824505, -1113181968, -1113770157, 1038963911) + + W(9, 1033084478, 1042818602, -1130963634, -1114724733) + + W(10, -1119658116, 1030219574, -1129447670, 1033715440) + + W(11, -1128924420, -1116035017, 1030841394, 998207538); + sum2 = W(0, -1131923124, 993280665, -1127811288, 1032538133) + W(1, 992174233, 1002762140, 1015088121, 992586073) + + W(2, 1046772351, 1028557303, -1107794670, -1098564467) + + W(3, -1121892222, 1035775413, -1158807761, 1019898989) + + W(4, -1110971235, -1134148898, 1043137579, 1067961229) + + W(5, -1095277951, -1099141736, 1011333246, -1118039147) + + W(6, -1105011941, -1104446514, -1096504482, 1066594258) + + W(7, -1107079502, -1090299346, -1132433157, -1109952821) + + W(8, 1028001687, -1147560296, -1101129935, -1104613803) + + W(9, -1097683180, -1129031039, -1108888578, 1040568125) + + W(10, -1121147281, 1024426003, 1034898623, -1136832302) + + W(11, 1036381319, 1009264906, 1032287279, -1111357043); + WS(-1105186296, -1108555742); + sum1 = + W(0, 1040483623, -1101386974, 1040816739, -1134311356) + W(1, -1108915605, 1046011615, -1102638726, 1034864637) + + W(2, -1105046378, 1038429012, 1031828819, -1107675004) + + W(3, 1034430779, -1109709717, 1030173660, -1130419297) + + W(4, -1118442722, 1042743759, -1093958439, 1030110546) + + W(5, 1044698927, -1103097566, 1041159370, -1111922822) + W(6, 1040666374, -1109750289, 1050019912, 1040526743) + + W(7, -1097473172, 1045974257, -1110364069, 1017242540) + W(8, 986662468, -1103538071, 1033262923, -1121451017) + + W(9, 1032745156, 1041021277, -1106175813, 1032931450) + + W(10, -1118942975, 1040611956, -1118385334, 1012951144) + + W(11, 1035127903, -1100748433, 1037154391, -1121991998); + sum2 = W(0, -1127162070, -1135271108, 1003505825, 1012864633) + + W(1, -1123384038, 1026898060, -1134649836, -1125848258) + + W(2, 1014979733, -1136185376, 1028363168, -1131143608) + + W(3, 1033256022, -1133517476, -1120532892, 1028008335) + + W(4, -1114518101, 1038675289, -1105093650, -1095849351) + + W(5, 1028346583, -1113528611, 1028725832, -1117113572) + + W(6, 1016203776, -1140478504, -1089585970, -1070239185) + + W(7, -1078361549, 1038794260, -1125525718, 1005296645) + + W(8, 1035296562, -1111853852, 1058969759, 1079096535) + W(9, 1068193425, 1032636395, 1017911666, 1032298564) + + W(10, -1117887634, 1030827904, -1123277259, -1116960146) + + W(11, -1125445846, -1113311282, 991223090, -1134431064); + WS(1065442623, 1015025160); + sum1 = + W(0, -1115365041, 1040496438, -1114325264, 1036061554) + W(1, 1038370800, -1112496600, 1039123015, -1120668655) + + W(2, -1113215535, 1031517084, -1109245393, 1002812769) + + W(3, 1036804053, -1099928488, 1036473513, -1116761110) + W(4, 1018550702, 1044423084, -1131936399, 1034975748) + + W(5, 1048106991, -1107673238, 1041344487, 1019812354) + W(6, 983382403, 1017412396, -1109909072, -1099246196) + + W(7, -1114225707, -1129165678, 1011581692, -1138585900) + + W(8, -1103693946, 1032083208, -1106995843, 1024898238) + + W(9, 1044531927, -1096349707, 1043676418, -1110354101) + + W(10, -1124004468, 1040563090, -1120263275, 1012000060) + + W(11, 1036150809, -1113013165, 1037117105, -1128538214); + sum2 = W(0, 1010698941, 1042699596, 1048659418, 1058578114) + W(1, 1052277576, 1019470633, 1041036392, -1119471849) + + W(2, 1023126843, -1140656688, -1095653758, -1081184698) + + W(3, -1097586600, -1098953045, 1018118885, -1122826054) + + W(4, -1106210958, 1029081919, -1118272649, 1060468587) + + W(5, 1043044817, -1108654451, 1029721267, -1130901998) + + W(6, -1122624743, 1040813712, -1097694847, 996865603) + + W(7, -1103459725, -1128239326, 1034766857, 1000734433) + + W(8, -1122034237, -1174961495, 1033474214, -1102355565) + + W(9, 1049205466, -1112376452, 1033989555, 1017824567) + + W(10, -1117968485, 1039098482, -1118912655, 1020119257) + + W(11, 1031051049, -1108144089, 1038110136, -1114988670); + WS(-1115864032, 1039792746); + sum1 = + W(0, -1140468214, 996096400, 1010495721, -1114956320) + W(1, 1013460969, -1122072970, -1127833232, -1140762151) + + W(2, -1121375417, -1108218204, -1109130991, -1115276388) + + W(3, 1040789857, -1114444905, 1026520268, -1127271361) + W(4, 1034497081, 1033625894, 1055392502, 1036829073) + + W(5, -1088431348, 1030275655, -1111886108, 1031218972) + W(6, 1039608980, 1040179481, -1093805194, 1050653566) + + W(7, 1049263376, 1051648994, -1121903450, -1112576115) + + W(8, -1113171393, -1108192053, -1127063626, -1109643980) + + W(9, -1124542831, -1129660583, 1034831154, 1019975176) + + W(10, -1132620605, 1018030914, 1012649753, -1127455572) + + W(11, -1135717173, -1147064482, -1114505023, -1135014713); + sum2 = + W(0, 1015385693, 1020691269, 1015565489, 1019337403) + W(1, -1132207064, -1131086480, -1163542113, 1010427910) + + W(2, -1115435752, -1141202058, -1111436746, 1040267853) + + W(3, -1114623303, 1025609602, -1140470334, -1128429973) + + W(4, 1035175215, -1117300235, 1033401267, -1100581516) + W(5, 1041259906, -1101351817, 1020278145, 1027629029) + + W(6, 1017441239, -1122675471, 1055273933, 1073306798) + + W(7, -1073173797, 1032997632, -1122237085, -1119509251) + + W(8, -1112773411, 1031000417, -1101083444, 1046685605) + + W(9, -1115311051, -1113329498, 1031244051, 1033297372) + W(10, 998363696, 1016207247, -1113092041, 1013448250) + + W(11, -1130370856, 1026870685, -1124843109, 1014260054); + WS(1060418110, -1122066101); + sum1 = W(0, 1031696780, -1124029560, -1147879495, -1123330286) + + W(1, -1137787811, 1025904121, -1122010711, -1131825009) + + W(2, -1115430516, -1129767372, 1033383950, 1032201307) + + W(3, -1124043956, -1135655378, 1016436406, 1011740349) + + W(4, -1104465800, -1124342772, -1084846132, 1040589380) + + W(5, 1059143665, 1047669789, 1032251443, 1017074582) + W(6, 1041576533, 1035204176, 1057835449, -1121351835) + + W(7, -1085338500, 1026196737, -1113520196, 1023559701) + + W(8, -1122042801, -1109435772, -1106791333, 1025265863) + + W(9, 1037079395, 1031201378, -1120875027, 1024540211) + W(10, 1028261758, 1025573168, 1024098613, 1000233671) + + W(11, 1020968696, -1122702819, 1016849816, -1123483709); + sum2 = W(0, -1127836624, -1173496113, 1027284157, 1022886010) + + W(1, 1036751625, -1124242822, 1017945890, -1140181115) + + W(2, 1033364881, -1127629564, -1104916712, -1097350377) + + W(3, -1105423640, 1034826035, -1122986652, 1033442485) + + W(4, -1101679270, -1105780675, -1113070309, 1061873799) + + W(5, -1096904559, -1105550966, -1127473876, -1108824717) + + W(6, 1023580345, -1119640853, -1132739235, 1062616603) + + W(7, 1009507187, -1098447862, -1116534057, -1115327874) + + W(8, -1149619356, 1033890881, -1113766541, -1112358042) + + W(9, -1119315178, 1045500652, 1015952658, 1033458469) + + W(10, -1136662275, -1122666983, 1023707939, 1028952789) + + W(11, -1117384012, -1137245711, -1136860123, 1001899534); + WS(1052277756, 1024619064); + sum1 = + W(0, 1029425189, -1155801216, 1030252033, -1112675811) + W(1, 1025211073, -1122395345, 994289396, -1124711713) + + W(2, -1120340480, -1107014752, 1038469578, 1032327591) + W(3, 1034534022, 1039704040, -1137717581, 1045346698) + + W(4, 1055903799, 1049346130, 1057427995, -1103272826) + W(5, 1040656272, -1111436999, 1016775164, -1134653325) + + W(6, -1093981294, -1099678446, -1098793998, -1090697510) + + W(7, -1103403378, 1041606598, 1005246730, 1013960373) + W(8, -1125235986, 1003141514, 1025012844, -1118748640) + + W(9, 1025335343, -1106833215, 1029370155, -1099652851) + + W(10, 1026200342, -1131584400, 1031806855, -1126277858) + + W(11, 1010568017, 1032770798, -1124454216, 1034190187); + sum2 = W(0, 1023289146, 1020437582, 1009748873, 1030199907) + W(1, 1007345789, 1010063617, 1018930146, -1127799210) + + W(2, 1045862572, 1028786959, -1120652794, 1015917080) + + W(3, -1117660774, -1106003069, 1039304637, -1098471935) + + W(4, -1095566322, -1132354231, -1090793815, 1063879108) + + W(5, -1107315270, 1045942315, -1106431667, 1048572904) + + W(6, -1087461476, -1101737384, -1083542229, 1069217208) + + W(7, 1056862945, -1153692567, -1111757292, 1056217861) + + W(8, 1016132472, -1127607289, -1107157844, -1097091848) + + W(9, -1098187278, -1116485608, 1036040005, -1094693884) + + W(10, 1044890152, -1124440021, 1037463572, 1032502373) + + W(11, 1028169917, -1108513707, 1034190881, -1108016950); + WS(-1086218302, -1084258561); + sum1 = W(0, 1027347742, 1021408948, -1127633782, 1039366096) + + W(1, -1116749595, 1033396118, -1139872292, 1025066091) + W(2, 1041008695, 1036310380, 1035524367, 1048593117) + + W(3, -1138037400, 1045683171, 1032120647, 1046369740) + W(4, 1040638149, 1041666443, 1033011818, 1050103608) + + W(5, -1111907839, -1097626581, -1099416246, -1095221944) + + W(6, -1088163117, -1103354245, -1094269524, -1122175629) + + W(7, -1096387988, -1103712029, -1111740158, -1117250695) + + W(8, 1045697689, 1033383494, 1040895122, 1042904478) + + W(9, -1136050786, 1018682217, -1126758410, -1121047845) + + W(10, -1131589088, 1033326017, -1132088142, 1042877939) + + W(11, -1131538396, 1039834587, 1030901630, 1034112696); + sum2 = W(0, -1116225927, 1030773056, -1122365237, 1032148531) + + W(1, -1127594672, 1026422036, 1023835916, -1131330830) + + W(2, 1020583173, 1018516207, -1121497633, 1032012136) + + W(3, -1111134479, -1112679629, -1123177144, -1112996078) + + W(4, -1120289762, -1142227828, 1024002380, 1050603076) + + W(5, 1040110681, -1109379336, -1102178993, -1102999759) + + W(6, -1116630862, -1157244503, 1045806125, 1061490298) + + W(7, -1104925089, -1096282325, -1103628682, -1116593585) + + W(8, 1037488437, -1120616119, -1122845130, 1029135782) + + W(9, -1122119114, 1035818151, -1118358279, 1024073644) + + W(10, -1120774706, 1021325617, -1124264052, 1020114521) + + W(11, -1129316292, -1129796491, 1024324894, -1129630471); + WS(-1092406524, -1089571522); - sum1 = W(0, -1120714617, 1007614003, -1123305414, 1009908268) + W(1, -1129324172, -1121901526, 1022915304, -1142748844) + W(2, 1035162146, -1123901891, 1027364554, 1030225939) + W(3, -1116882705, 1030599214, -1135846624, -1113117446) + W(4, -1110752415, 1046176310, -1114390527, -1110762423) + W(5, 1032526991, -1096831458, -1117077507, -1127767760) + W(6, -1121818163, -1105876799, -1096860741, 1046191054) + W(7, 1043289735, 1052908756, 1034530771, 1039462233) + W(8, 1035961863, 1034124059, 1022953826, 1023450788) + W(9, -1114841418, -1114991488, -1116257712, 1025047056) + W(10, -1120878363, -1120533037, -1155422496, -1124524780) + W(11, -1129613106, 1013731840, 981289536, -1143328976); sum2 = W(0, -1131108965, 1000650931, 1025688791, -1116852534) + W(1, -1145056307, -1123043594, 1018436747, -1139914565) + W(2, 1043465638, -1113612493, -1106748353, 1029599173) + W(3, 1045881517, -1118230687, 1029259867, -1107504809) + W(4, 988544780, -1124179817, -1070139293, -1102659167) + W(5, 1078104617, 1048052425, -1126127905, 1025133515) + W(6, -1145266179, -1111438835, -1110118136, -1097100047) + W(7, 1027449515, 1027739737, -1136112041, 1036504803) + W(8, 1018501507, 1003301507, 1026178295, 1031198431) + W(9, -1123515159, -1134523125, 995063942, -1120319069) + W(10, 1021344415, -1131299129, -1123696315, 1012522521) + W(11, 1024975831, 1020199127, -1162666156, -1131042995); WS(1061710334, -1113637247); - sum1 = W(0, -1121814583, -1138603692, -1138264845, -1140194465) + W(1, -1131439046, -1125621862, 1023073058, -1129805541) + W(2, 1036106897, -1122595552, 1018454510, 1033737112) + W(3, -1122735662, 1024541667, -1122620661, -1116003130) + W(4, -1109309294, 1048694647, 1030681928, -1115559686) + W(5, 1044326142, -1097437158, -1132933761, -1128614666) + W(6, -1143950978, -1103580007, -1097890158, -1120177173) + W(7, 1042373458, 1052689231, 1034486114, 1037961704) + W(8, 1033251382, 1032154570, 1019050396, 1021617155) + W(9, -1113884080, -1107957310, -1116304653, 1019245786) + W(10, -1118153848, -1122508490, 1012933309, -1120902675) + W(11, -1152998244, 1016843898, -1144273714, -1155701620); sum2 = W(0, -1162960213, 1013908203, -1113327157, 1023571595) + W(1, -1133790043, 1024139725, -1130037920, 1007034787) + W(2, -1107084454, 1023868855, 1032525526, 1048796624) + W(3, -1104878976, 1003078933, -1121062518, 1034207166) + W(4, -1126626424, 1032930462, 1076098019, -1132699465) + W(5, -1072747140, -1104764998, 1019199125, -1123497947) + W(6, 1025411499, 1029914487, 1035900190, -1093496445) + W(7, 1026052839, -1109617402, 1025857863, -1118139493) + W(8, -1126548940, 997665611, -1121182801, 1038561302) + W(9, -1146184997, -1142783113, -1147685381, 1017680405) + W(10, -1127269937, 1018748433, -1158385717, 1000017309) + W(11, -1123007653, -1154085627, 1000677165, 1016687665); WS(1064800702, 1030635520); - sum1 = W(0, 1004285524, -1122860750, -1122286551, 1021316024) + W(1, -1116388951, 1022533838, -1125657162, 1001429301) + W(2, -1128056492, 1024005652, 1035530413, 1053335517) + W(3, -1139373960, -1130762670, -1121564617, -1129213371) + W(4, 1035663048, 1031878036, 984521208, -1100061872) + W(5, 1048911707, 1035194194, -1131931048, -1141986761) + W(6, -1110660706, -1116831438, 1023270757, -1093549817) + W(7, -1104621327, -1149876978, -1142066105, 1031904066) + W(8, -1128734654, -1204558974, -1136886024, 1042579293) + W(9, -1148999845, -1142259845, -1120920449, -1111776529) + W(10, 1028175148, -1143857649, 1005008153, 1016449422) + W(11, -1135015336, 1010510404, 1018152308, 1020350678); sum2 = W(0, 1015139874, -1150118671, 1032711786, 1028577839) + W(1, -1116703472, -1123435694, -1140098908, -1140019692) + W(2, -1120731382, -1116737087, -1087320828, -1069693959) + W(3, -1103666133, -1138801588, 999422392, 1029210329) + W(4, 1017539382, 1031888972, 1059502015, 1078824499) + W(5, 1045823576, 1009232228, 1011539428, -1118193829) + W(6, 1020112270, -1112637962, 1026899401, -1094071548) + W(7, 1036639812, -1114441289, 1023067274, -1131442506) + W(8, -1126248934, 1010207212, -1119882792, 1040940327) + W(9, -1131804892, 1029410629, -1130083750, 1007549476) + W(10, 1013963196, -1138130380, 1019091922, -1123861886) + W(11, 1004924552, -1130443436, -1137456436, 1026106777); WS(1058942782, 1023618692); - sum1 = W(0, -1126072821, 1011693912, 1017195423, -1122268692) + W(1, 1022607903, 982545387, -1126061755, 1003763447) + W(2, 1041771492, 1025548876, 1036961985, 1037536142) + W(3, 1038780013, 1023558139, 1037537425, 1035261291) + W(4, -1110777188, 1035801072, -1094081945, -1091452759) + W(5, -1095962376, 1049096396, -1113879430, 955835050) + W(6, -1110871838, 1043278082, -1103634941, -1105679152) + W(7, -1103558179, -1130619215, -1136949949, 1026350907) + W(8, 1036426764, -1146527995, 1046715887, 1040286827) + W(9, 1049101574, 1031851588, 1002869195, 1006549707) + W(10, -1142526755, 1015953709, -1148709083, -1119884351) + W(11, -1122534754, 1007174309, 1017517093, 986004587); sum2 = W(0, -1128639222, -1150616818, -1118932607, -1125568566) + W(1, 991022546, -1129687950, 1018120650, 1006676397) + W(2, 1001638233, 1013509397, 1035428655, 1024255335) + W(3, 1031481278, -1111645244, 1028380841, -1115817479) + W(4, -1119841411, 1029376723, 1019940778, 1063260126) + W(5, 1032753418, 1026999545, -1121385219, -1134958989) + W(6, 1014385869, 1037911199, -1102461584, -1085129330) + W(7, -1110003004, 1019019978, 1021463302, 1017625850) + W(8, 986023269, 970306708, -1141011097, -1110526300) + W(9, 1033244979, -1121764803, 1025283273, -1128128990) + W(10, -1135260845, 1013815957, 959170344, 1017551658) + W(11, 1016351942, -1127392454, 1009569613, -1138867245); WS(1037837808, 1056377428); - sum1 = W(0, -1135573495, 1023727061, -1118803082, -1123500111) + W(1, 1020600341, -1111066541, 1008936161, -1115286797) + W(2, -1105969090, -1138454045, -1114548551, 1046351686) + W(3, 1036383371, 1034647805, 1026657308, 1033474888) + W(4, 1027945538, -1116105371, -1126955510, -1122693874) + W(5, 1053007142, 1035274060, -1156882549, -1122516460) + W(6, 1043223694, 1039709953, 1051232418, -1100833583) + W(7, -1103740252, -1101618713, 1033814037, -1129756781) + W(8, -1100584037, -1111027805, -1097887999, 1040497066) + W(9, 1024768136, -1138012047, -1123286772, 1010716753) + W(10, 1025656415, 1021082723, 1018764077, -1115071549) + W(11, 1025234525, -1116333124, 1016891995, -1114238799); sum2 = W(0, 1020978875, -1121670462, -1103298336, -1110731474) + W(1, -1105136733, -1119790394, -1127100056, 999102475) + W(2, -1100967324, -1130583533, -1096736455, 1053186254) + W(3, 1045958215, 1043729632, 1033816035, 1020355333) + W(4, 1043179705, -1122981488, 1062358565, -1112891412) + W(5, 1031005462, 1033523405, -1109547546, -1122874410) + W(6, 1026290891, 1032797386, -1104401130, -1091109944) + W(7, -1133705481, -1102472853, 1031959215, -1122532081) + W(8, 1013196277, -1120286641, -1114052290, 1048200412) + W(9, -1113847816, 1033631266, -1126209517, 1027184816) + W(10, -1138979633, 966672716, -1152672163, -1122242747) + W(11, 1023845499, -1118586102, -1147194793, -1127245018); WS(1050865148, 1032626572); - sum1 = W(0, -1110436993, 1040042556, -1107890608, -1113356418) + W(1, 1034032544, -1105712244, 999321197, -1110201208) + W(2, 1043627312, -1101476879, 1049906138, -1109025830) + W(3, -1120749707, 1051482110, -1103830356, 1048543054) + W(4, -1118552440, -1108049256, -1107535228, -1162779891) + W(5, -1095271743, 1035225158, -1104074479, -1106449960) + W(6, 1045700875, 1033317691, -1115480133, 1049713062) + W(7, 1042738346, -1122810712, 1050825756, 1031488492) + W(8, -1115060612, 1031191472, 1025393771, -1106727656) + W(9, -1127443770, 1039553933, -1104755066, 1040395170) + W(10, 1040430485, -1096410465, 1042925123, -1114330616) + W(11, -1106585845, 1042770518, -1103219825, 1009713998); sum2 = W(0, 1024944996, 1020193961, 1014966838, 1015828472) + W(1, -1113612636, 1032934706, -1116105943, 1021395599) + W(2, -1111924540, 1007347355, -1116539066, 1012341552) + W(3, 1034050704, -1113193567, 1042584092, -1116104243) + W(4, -1107012648, 1049541488, -1107447750, -1109770505) + W(5, -1111197863, 1014122612, 1016467631, -1135977693) + W(6, 1057346437, 1054940943, 1059914271, 1066972918) + W(7, 1063973493, 1056333532, 1045837843, 1043326701) + W(8, -1105023593, -1097277462, -1142156696, 1043445868) + W(9, 1017043379, -1118781870, -1113967259, -1117573943) + W(10, -1097010076, -1107952444, -1085761230, -1078926120) + W(11, -1084679416, -1092348708, -1128370702, -1108363561); WS(1054811644, 1027249161); - sum1 = W(0, 1040940111, -1100243090, 1043481462, -1119365790) + W(1, -1111878381, 1044780378, -1101638738, 1035929492) + W(2, -1101358582, 1036221579, 1014943347, -1109150355) + W(3, 1036687602, -1109759237, 1028424107, -1122643648) + W(4, -1113576073, 1038054901, -1097482896, -1106696288) + W(5, 1022736646, -1097940765, 1038478827, -1103674991) + W(6, 1049141881, -1105999252, 1051960356, 1048275427) + W(7, -1118345360, 1049145430, -1113101949, 1037909315) + W(8, -1132483205, -1104538698, 1036681666, -1123112824) + W(9, 1019000333, 1044474573, -1103799553, 1037239602) + W(10, -1116754862, 1037145120, -1118995685, -1126689554) + W(11, 1038634998, -1101292557, 1034438878, -1126283866); sum2 = W(0, 1023766557, 1015306072, -1136376403, -1113107482) + W(1, 1038494252, -1113447013, 1023629411, 1024784188) + W(2, 1016554458, 1020144724, -1116988904, 1050162106) + W(3, -1104347057, 1003678517, 1033762395, -1109441777) + W(4, 1021815988, -1103467660, 1034521268, -1102546407) + W(5, -1103257907, 1025406308, -1113239746, 1026085595) + W(6, -1137435361, 1016553974, 1060795535, 1075503478) + W(7, 1072821349, -1113972415, 1031283975, 1037416902) + W(8, -1114856427, 1044555388, -1088370625, -1071164689) + W(9, -1077590614, -1112563255, 995356642, -1112537357) + W(10, 1032032312, -1105991725, -1127777881, 1035804901) + W(11, -1120944929, 1036418439, -1123929939, -1140753514); WS(1055940220, -1124188157); - sum1 = W(0, -1113999823, 1015763751, -1115168029, 1022861696) + W(1, -1114461725, -1113117029, 1032164308, -1121800074) + W(2, -1119569210, 1043278990, -1094609330, 1044340802) + W(3, 1033154083, -1106205123, 1021089498, -1107756257) + W(4, 1015781094, -1106256755, 1052603679, -1095339972) + W(5, -1108564239, 1042723938, -1125646960, -1171638077) + W(6, -1147977024, 1046188556, 1041916962, -1108128054) + W(7, 1057380776, -1095928258, 1041299799, 1027517543) + W(8, -1117684995, 1036478965, 1033522483, 1047885622) + W(9, 1036635468, 1035899866, -1139371156, -1131185034) + W(10, -1108336232, 1006648968, -1101485874, -1110457109) + W(11, -1114614567, -1108232826, 1034599135, -1115299047); sum2 = W(0, -1120118804, 1013270421, -1120552641, -1117027367) + W(1, 1016254148, -1110780393, 1030787932, -1133117880) + W(2, -1136369034, 1027353114, -1125884733, 1035518448) + W(3, 1043285424, -1129166063, -1140216380, -1120569751) + W(4, -1127959037, -1129939889, -1117793827, -1095769137) + W(5, -1095274849, -1117623897, -1128598589, -1129927717) + W(6, 1015341014, 1034464346, -1117887441, 1043338219) + W(7, 1049861339, -1128474295, 1032330618, 1018695247) + W(8, 1033327798, 1041751325, 1049619624, 1049093640) + W(9, 1048627700, 1035712363, 1035384499, 1027229852) + W(10, -1113602386, -1114857235, -1103868602, -1097589990) + W(11, -1105817123, -1106207094, 1004274322, -1120123842); WS(1057163582, 1025817537); - sum1 = W(0, 1037167835, -1121852313, 1034559945, 1027044951) + W(1, 1039868489, 1037598609, 1007581568, 1031626785) + W(2, 1031655825, 1046829204, 1038865075, 987855837) + W(3, -1105739319, -1112419405, 1015381448, 1037495244) + W(4, -1096271953, -1093143228, -1085198281, 1050118415) + W(5, 1057217669, 1047779928, 1035805671, 1015872616) + W(6, 1045084224, 1046279122, 1057074420, 1040167170) + W(7, -1086525384, -1087515051, -1098926044, -1124461564) + W(8, 1033520525, -1103697416, -1107583934, 1024989936) + W(9, 1034776664, 1044254259, -1134624240, -1113253902) + W(10, 1016078798, 1030441081, 1036548879, 974934139) + W(11, 1034922130, -1113468278, 1036139674, 1017385676); sum2 = W(0, -1136384493, 1023814631, 1033659202, 1017810163) + W(1, 1009967381, 1017781727, -1118180802, -1141961139) + W(2, 1036526786, -1099879539, 1034332004, 1013925981) + W(3, -1106516740, -1101585218, -1131784625, -1112082470) + W(4, 1028719631, 1030342243, 1046758826, -1093436173) + W(5, 1051870663, 1042788701, -1114786901, -1113417628) + W(6, -1123632092, 1043747658, 1050427835, -1100447595) + W(7, 1041231786, 1045006578, 1010389989, -1117114477) + W(8, -1145098603, -1102737141, -1112406001, -1119158797) + W(9, 1034292458, -1107586767, -1143106923, 1032164569) + W(10, -1122280548, -1130733945, 1014543213, -1123106681) + W(11, 1019870319, 1013053757, -1119739637, 1012643781); WS(-1081763615, -1092598780); - sum1 = W(0, -1130922677, -1122514966, -1136114845, 1015393433) + W(1, -1137786397, 1023447063, -1142668459, -1140705115) + W(2, -1114318275, 1026414532, 1017564438, 1021344041) + W(3, -1095352826, -1116164091, -1123782681, 1012849463) + W(4, -1127997567, -1121576984, -1088500870, -1098266094) + W(5, 1061435536, -1148866211, 1039772482, 1024002537) + W(6, 1028467828, -1127358845, 1061837768, 1035926493) + W(7, -1095349722, -1114585584, -1114677716, -1116920883) + W(8, 1023598927, 1017010415, -1116904946, 1037585875) + W(9, 1040151266, 1031742785, 1007413957, -1128808099) + W(10, -1139280241, 1002425203, -1123987795, -1136160989) + W(11, -1131570741, -1116123969, 1020007637, -1126849079); sum2 = W(0, 1021958137, -1117837187, 1026312941, -1115513274) + W(1, 1037370871, -1112242113, 1033686533, -1107052036) + W(2, 1034408685, 1036094407, 1033683959, -1124949158) + W(3, -1091894288, 1027011647, -1107943508, 1010459130) + W(4, -1106091708, -1147105428, -1094093059, 1061646324) + W(5, 1058519893, -1106569597, 1037199097, 1030945863) + W(6, -1098486326, -1110159069, -1088187103, 1055280585) + W(7, 1045036050, 1045721104, 1034325435, 1039418143) + W(8, 1028745769, 1031154711, -1105512708, -1100598283) + W(9, -1109806227, -1117345257, -1144974476, -1124920152) + W(10, 1024682325, -1116910593, 1039406737, -1117359799) + W(11, 1026080301, -1117139296, 991455177, -1112397476); WS(1049187708, 1061143407); - sum1 = W(0, 1032206028, -1121811767, 1032297330, -1136528167) + W(1, 1005295654, 1031846890, -1136496587, 1032778794) + W(2, 1046469409, 1033070593, 1049873346, 1050639650) + W(3, 1041319460, 1041542033, 1036329419, 1043869975) + W(4, 1044620591, 1020031147, -1111788011, -1089881571) + W(5, -1127219501, 1033106537, 991465499, -1112918515) + W(6, -1086760535, -1113096094, -1092765627, -1083700943) + W(7, -1092202425, 1011207027, 1015330121, 1026637361) + W(8, 1049164066, -1132628435, 1051671486, 1044844041) + W(9, 1037004161, 1026161438, -1134373563, 1019220893) + W(10, 1022165171, 1009114287, 1034535880, 1024964917) + W(11, 1011091807, 1038185039, 1018308239, 1032129132); sum2 = W(0, -1123557888, -1139662759, -1120649660, 1021700488) + W(1, -1119215196, 1025758640, -1134635263, 1025396502) + W(2, 1024038368, 1022314468, 1016353740, -1149024430) + W(3, -1127462832, -1109226016, 1022909500, -1106595065) + W(4, 964997605, 1007232143, -1112234110, 1052797849) + W(5, 1032636001, -1096670151, -1103246759, -1095307242) + W(6, -1123190992, 1040909663, 1035500288, 1059925772) + W(7, -1123381020, -1110751472, -1114698588, 1016687528) + W(8, -1170950771, -1119781676, -1122589660, 1021322900) + W(9, -1124742672, 1037872214, -1123038904, 1025386190) + W(10, 1009594487, 1011035391, -1122952928, 1015425876) + W(11, 1024335912, -1115520552, 1026100870, -1128653768); WS(-1080960863, 1058419411); - sum1 = W(0, -1118700722, 1032983255, -1122641758, 1033094082) + W(1, -1121000958, -1133773881, -1141737059, -1120123854) + W(2, -1111066847, -1112208894, -1099579692, -1090459763) + W(3, -1107128402, -1107276892, -1116550064, -1103159313) + W(4, 984198859, -1099715572, 1049479517, 1062349342) + W(5, -1099059374, 1033076198, -1125040759, 1037355536) + W(6, 1043965403, -1113907195, 1050672334, 1061713555) + W(7, 1059583022, -1121054998, 1024684126, 1026513898) + W(8, -1108783427, -1113914551, -1105019770, -1095692932) + W(9, -1099879371, -1108028092, 1024533736, -1110661700) + W(10, 1000248987, -1124179019, -1128328213, 1023738862) + W(11, -1131329315, 1027231576, -1113801521, 1007580489); sum2 = W(0, 995719700, -1114687459, 1024240180, -1115935924) + W(1, 1025427056, -1123062148, 999440794, -1131128122) + W(2, -1129327601, 1021214658, 997717028, 978476974) + W(3, -1140454571, 1010080137, 1002330866, -1152746908) + W(4, -1125739202, 1027238209, -1120915257, -1078687396) + W(5, -1111104335, -1128218828, -1147995690, -1128526870) + W(6, 1029045123, 1037994429, 1036441804, 1066236156) + W(7, 1022342240, 1028953671, 1024857232, -1126806088) + W(8, 1025141617, -1113434302, 1032546636, 1035362808) + W(9, 1033358736, -1166615662, -1165027863, 1024563904) + W(10, -1154923092, 1007115993, 1003062850, -1118441375) + W(11, 1017727844, -1129048983, 1019778022, 1009762473); WS(-1082880574, -1095080656); - sum1 = W(0, -1120399523, -1123397517, -1135116544, -1168421181) + W(1, -1131259136, 1037719400, -1113348279, 1030740495) + W(2, -1111736159, -1128373242, 1025039907, -1127950106) + W(3, -1098593297, -1106461210, 1024172498, 1028249110) + W(4, -1111698940, 1019423266, -1092929515, -1098702381) + W(5, 1060991762, 1018082074, 1036669022, -1114016273) + W(6, 1037879414, 1028697399, 1062200098, 1023355236) + W(7, -1094756999, -1115312044, -1106391640, -1109491766) + W(8, 1037066756, -1119567216, -1131199446, 1027882718) + W(9, 1038218895, 1022591155, -1118950442, -1141634128) + W(10, -1118524245, 1027581671, -1139610160, -1139561152) + W(11, 1005358744, -1113962893, 1026868195, -1126548648); sum2 = W(0, 1007561151, -1118820752, -1128452386, -1121745985) + W(1, -1114861795, -1121584151, -1120079456, -1129117272) + W(2, -1106890729, 1031296198, -1110907715, 1032462388) + W(3, 1035962501, 1035033495, 982365671, 1035951051) + W(4, -1144059530, -1112391017, 1056169840, -1096446085) + W(5, 1031556034, 987032615, -1138039959, -1119286197) + W(6, 1010626011, -1114880200, 1052511775, -1094697844) + W(7, 1056886944, -1129701328, 980377326, -1126702674) + W(8, -1140206187, -1136937433, 1034255225, 1033067226) + W(9, -1104164393, 1013679559, -1115367679, -1137374445) + W(10, -1152147163, -1120281594, -1114711449, 993102387) + W(11, -1120009849, -1122813977, -1118918686, 1006646323); WS(1058795070, 1058351276); - sum1 = W(0, -1129226172, 1032650784, -1134152362, -1122312016) + W(1, -1145265749, -1118796187, 1017891569, -1131365684) + W(2, -1106246658, -1132244111, -1102574120, 1028257624) + W(3, 1004724909, -1128587973, -1150296521, -1107598873) + W(4, 1041614193, 1048401911, 1050141831, -1088102699) + W(5, -1093353638, -1112285036, -1122892680, -1120116589) + W(6, 1041522846, 1041471472, 1033352747, 1030285885) + W(7, 1056599450, 1049138668, 1043369227, 1040658126) + W(8, -1106977045, 1031926461, -1121658742, -1124591186) + W(9, -1107883356, -1114299650, -1130730345, 1034850634) + W(10, -1140271486, -1130658915, -1115542891, -1119417531) + W(11, -1155196377, 1003429157, -1125742491, -1137642362); sum2 = W(0, 1018264792, 1019878456, 1020074080, -1143212320) + W(1, -1148803168, -1127882992, 1017409120, -1131165168) + W(2, -1109681111, -1134735936, -1106212594, 1037009054) + W(3, -1132238328, 1032289620, 990246720, 1004132864) + W(4, 1028734812, -1093714299, 1034660210, 1047288883) + W(5, 1031452084, -1112028563, -1115169564, 1020410832) + W(6, -1104210606, -1099909667, -1098896203, 1060586916) + W(7, 1042866381, -1109339206, 1023925320, -1112228144) + W(8, 1025579416, 1032419228, 1010388000, 1030286292) + W(9, -1107165918, 1019446368, 989303425, 1029468412) + W(10, 1029305888, -1113499692, 1025031188, -1130541520) + W(11, -1127563664, 1026005920, -1123344268, 1009015280); WS(1043816952, 1056206353); - sum1 = W(0, -1132948972, 1024900084, -1150680698, 1016358425) + W(1, -1160444148, -1115326124, 1019123435, -1120343575) + W(2, -1115461859, -1107172113, -1097009915, -1102438229) + W(3, 1024199571, -1148961467, -1130723763, -1144998513) + W(4, 1034684352, 1038250028, 1061195075, 1051576078) + W(5, -1088975285, 1010078034, -1107729186, 1022450003) + W(6, 1037119642, 1039626815, -1095598055, 1056604231) + W(7, 1057172865, 1029312608, 1039764276, -1112740858) + W(8, -1107088436, -1110088668, -1113187289, -1102307882) + W(9, -1103288997, -1122873761, 1032878393, 1034042985) + W(10, -1144087781, -1116127087, -1117712852, -1114968828) + W(11, -1134624362, 1012385158, -1114736693, 1002559709); sum2 = W(0, -1135809827, -1140675011, -1137384851, -1147988326) + W(1, 1019754904, -1172160176, 1006265798, 990940844) + W(2, 1031002711, 1009667595, -1156373420, 1010789683) + W(3, -1122328477, -1135703979, 1016962928, -1135289651) + W(4, -1136033931, 1025543601, -1123691685, -1105219090) + W(5, -1118075063, -1111692677, -1131889022, 1010975355) + W(6, -1114169661, -1124911966, 1056449903, 1044469394) + W(7, 1046754031, 1034039333, 1024901767, -1111731157) + W(8, -1107967067, -1108557845, -1096033675, -1118550723) + W(9, 1020360378, 1005574774, 1025982043, 1036125487) + W(10, 1027957130, 1004385158, 1015282250, -1115586301) + W(11, -1120013003, -1130287690, -1127946498, -1169619760); WS(1049886076, 1034318367); - sum1 = W(0, -1140544720, 1006465467, 1025588553, -1118154094) + W(1, 996302474, -1111905052, -1125961261, -1122979160) + W(2, 1022042959, -1106141033, -1104462159, -1100197533) + W(3, 1029682164, -1112348667, -1117824763, -1123002959) + W(4, 1021784769, 966352080, 1059646174, 1051735858) + W(5, -1085821075, 1029991670, -1111853843, 1031029131) + W(6, -1131075883, 1032360624, -1086897182, 1059041662) + W(7, 1057694799, 1036690656, 1030592201, -1155480906) + W(8, -1142660485, 1029412697, 1042100949, -1106256562) + W(9, -1106530518, -1121375714, 1017125029, 1014936522) + W(10, -1160888244, -1121174096, 1017231209, -1150715274) + W(11, 1024907260, 1015672965, -1120397516, -1124207481); sum2 = W(0, -1110846605, -1118194097, -1143898437, 1019764549) + W(1, 1008325379, 999139301, 997400075, 1024689095) + W(2, 1032320648, 1027617785, 1000132981, -1102116254) + W(3, 1026769453, -1131321177, 1008054267, -1118482095) + W(4, 1027180085, -1144235925, 1031570329, 1058710858) + W(5, 1031557517, -1129394727, -1131248001, -1120094485) + W(6, 1029603693, 1030911393, -1119293171, 1058397441) + W(7, -1104852463, -1097515304, -1123234663, -1106708620) + W(8, 1033577170, -1134544211, -1126616369, -1096477332) + W(9, -1103611475, -1115701158, -1119810656, -1134741251) + W(10, -1112673640, -1123614185, -1129974305, 1018853209) + W(11, 1036639048, 1018401637, 1024391909, 1017993989); WS(1058429118, 1064863249); - sum1 = W(0, 1021156518, 1024394983, 1020219616, -1131178666) + W(1, 1016100640, 1007341951, 994206685, 964693930) + W(2, 983001563, -1115666854, 1039490386, 1046648007) + W(3, 1017911734, 1043757188, -1128564932, 1045299318) + W(4, 1054264097, 1049468028, 1055450440, -1104196510) + W(5, 992909240, -1104186631, -1122765517, -1105268364) + W(6, -1097350840, -1099725362, -1115114453, -1085827188) + W(7, -1100930382, -1128095056, -1118903024, 1023907580) + W(8, -1175841770, 1024539904, 997016493, 1043203980) + W(9, 1033767351, -1119513801, -1131557236, -1106015350) + W(10, 964768362, -1149024695, 1012766063, 1022718592) + W(11, -1136266891, 1035657141, 1016423590, 1029236260); sum2 = W(0, 1005391535, 1018096716, -1135288360, -1121648533) + W(1, 996459166, -1130245220, -1123582348, 1033610651) + W(2, -1106696811, -1121907467, 1026226746, 1031305614) + W(3, 1032267559, -1111725659, 1028271694, -1108648643) + W(4, 1050575955, 1051313221, 1047952814, -1081952512) + W(5, 1040750694, 1031579134, 1007524520, 1034169827) + W(6, -1100156814, 1060662591, 1068258385, -1074657656) + W(7, -1095314974, 1036231973, 1044691450, 1044987108) + W(8, -1098256564, 1029467086, -1142136447, 1051661425) + W(9, 1035381379, -1107714686, 1022647148, -1100160947) + W(10, 1028021126, -1129063320, -1131820748, 1008147176) + W(11, -1168737402, 1020424408, -1129848660, 1024695710); WS(-1083443454, 998713176); - sum1 = W(0, 1032696047, 1026355790, 1024354795, 1034252472) + W(1, 1012872363, 1032281789, 1027888345, 1016830581) + W(2, 1040709994, 1040668906, 1036398699, 1051748575) + W(3, 1035129883, 1044965075, 1031400701, 1048807512) + W(4, 1040929033, 1032459486, 1012490030, -1097753826) + W(5, -1114537329, -1100635790, -1103916602, -1098186970) + W(6, -1087559501, -1103862520, -1102928053, -1093112676) + W(7, -1092883854, -1099081393, -1104850339, -1112352715) + W(8, 1049786774, 1037090637, 1047072725, 1050721065) + W(9, 1039546228, 1011437457, 1009955155, -1114553850) + W(10, -1146095614, 1033091241, 1024780023, 1037512365) + W(11, 1024615038, 1037286498, 1036010231, 1033653631); sum2 = W(0, 1035861958, -1161872500, -1113290777, -1137177342) + W(1, 1034613598, -1103597964, 1038756242, -1111249467) + W(2, -1098289107, -1119785106, 1033623622, 1045692473) + W(3, -1106425659, -1117971136, 1019694879, -1114046628) + W(4, 1026686124, 1049978705, -1098402027, 1024040864) + W(5, 1053770527, -1127968019, 1049090628, 1052585151) + W(6, -1096172460, -1107697817, -1091833397, 1013412750) + W(7, 1046082211, 1057075430, 1047895771, -1102204197) + W(8, -1113513064, 1027596044, -1098063812, 1031079096) + W(9, 1012376430, -1095279992, 1045163433, -1100444173) + W(10, 1019723703, -1121217732, 1033198374, -1107709748) + W(11, 1038124498, -1112843267, -1120386622, 1034273086); WS(-1086369662, -1078015058); - sum1 = W(0, 1024279387, -1100066053, 1039589628, -1104719791) + W(1, -1113174076, -1125885710, -1111149795, 1024511623) + W(2, 1042615374, -1106499229, 1049518735, -1115604002) + W(3, -1127523972, 1049389829, -1102519338, 1042212335) + W(4, 1054091094, -1113085188, 1050614757, -1103236040) + W(5, 1047781504, -1108066658, 1041501469, 1048227542) + W(6, -1095346029, -1103658220, -1097514477, -1100854410) + W(7, -1097175852, 1026529231, -1104719494, -1099302313) + W(8, 1050416872, -1111759460, 1048966812, -1122281110) + W(9, 1043919349, 1032565272, 1027138593, 1036646913) + W(10, -1113840294, -1141254386, 1032485602, -1113439156) + W(11, -1119980106, 1039770777, -1104628175, 1032389542); sum2 = W(0, -1092512531, -1093473489, -1081280020, -1076988140) + W(1, -1081342477, -1086556968, -1107875638, -1121362077) + W(2, -1098738343, -1088925799, 1042571962, 1043337888) + W(3, 1033193400, 1010020371, -1102154130, -1126174974) + W(4, 1063615535, 1062426368, 1067242406, 1066811408) + W(5, 1066297017, 1060290312, 1052028857, 1037059936) + W(6, 1009177475, 1026425874, 998962046, -1096426756) + W(7, 1022780060, 1026166068, 1017583668, -1119102823) + W(8, -1119750726, 1012050343, 1025403720, -1129159374) + W(9, 1023044380, -1115355073, 1026819560, -1127777686) + W(10, 1030476954, -1120184004, 1031881676, -1116680638) + W(11, -1135563955, 1004442726, 946141982, 1034449190); WS(-1129707456, 1007685382); - sum1 = W(0, -1134894751, 1044154267, -1111052786, 1038046773) + W(1, -1192544411, -1128991721, 1035051017, -1122391156) + W(2, -1098519836, 1030394337, -1107874844, -1118678129) + W(3, -1111301144, -1115520098, 1015910765, -1103669035) + W(4, 1040671079, 1013414869, -1103276809, -1098881194) + W(5, -1110522396, -1107120076, 1033063921, -1111557603) + W(6, 1044073412, 1041040503, 1038778991, -1107344299) + W(7, 1048980909, 1052479600, 1049200001, 1051478546) + W(8, -1109530006, 1035376874, -1105794628, -1139987723) + W(9, -1108336721, -1112546431, 1023468750, 1018554845) + W(10, -1134057701, 1028314315, -1112561176, 992777541) + W(11, -1112828028, -1132207293, 999515194, -1119107128); sum2 = W(0, -1137824107, -1126465818, 1005362547, -1158497445) + W(1, -1119770196, 1021074352, -1138544392, 1034621027) + W(2, -1110122518, 1033612180, -1116868027, 1039739597) + W(3, 1037998233, -1112420682, 1025116420, -1120069279) + W(4, -1137081539, -1106894813, 1045165527, -1106604299) + W(5, -1138568822, 1039276731, -1104439342, -1113398206) + W(6, 1039063461, 1047362418, 1067526191, 1071589227) + W(7, 1061860820, -1077533661, -1073373771, -1094637864) + W(8, -1158403413, -1117814890, -1136640937, 1044031039) + W(9, -1133800170, 1031122886, -1106196407, 1031315442) + W(10, -1124656554, 1023374342, -1115663214, -1148955153) + W(11, -1123862185, 999718675, -1139157324, 1025985948); WS(1033791472, -1138498893); - sum1 = W(0, -1143657507, 1014781903, 1029133201, 1018917100) + W(1, 998381448, 1016812674, -1118545247, -1137667330) + W(2, -1102835756, -1108646231, -1108649138, -1106020223) + W(3, 1003669472, -1113672010, -1114481905, -1127743919) + W(4, 1024249065, -1130492804, 1008218246, 1054388603) + W(5, -1092207694, -1132293500, -1112726231, -1119594899) + W(6, 1044190455, 1021681616, -1115040338, 1058377694) + W(7, 1046387590, 1049136345, 1017676194, -1119541597) + W(8, -1107762844, -1112711792, 1019895480, -1123372431) + W(9, -1111491159, -1123523050, -1123035739, 1028355707) + W(10, 1008291608, -1128240816, 1025256893, 1014932868) + W(11, 1007448080, 1008489644, -1112884042, 1001709096); sum2 = W(0, 1014470821, -1120344268, -1114330800, -1106002658) + W(1, 1024999308, -1126273593, -1127411221, -1123975632) + W(2, -1106657768, -1106292024, 1049926230, 1054743689) + W(3, -1112305858, -1122403994, -1116955850, 1030827431) + W(4, 1034825132, 1032219219, 1057813788, 1049962194) + W(5, 1051810194, 996027236, 984340447, -1114551452) + W(6, 1006830039, -1101139832, -1102461554, -1103958261) + W(7, -1098680718, 1040205712, -1109277736, -1111240037) + W(8, -1104684796, -1114556582, -1111886229, 1050373872) + W(9, 1035894797, -1100520246, 1014102650, -1106040331) + W(10, -1124459301, 1008940380, 1029827978, -1133852786) + W(11, -1109427720, 1024816377, -1117160816, 1003623824); WS(1060089726, 1074996161); - sum1 = W(0, -1117558175, 1029119241, -1141503452, 1010789890) + W(1, 1037081758, -1120312844, 1027150698, 1021223318) + W(2, 1046443391, 1039893948, 1041448800, 1035829124) + W(3, 1041862066, 1028398131, 1038548631, 1047369209) + W(4, -1083103171, -1093429938, -1088988175, 1032282738) + W(5, 1035486030, -1142682180, -1111879740, -1105296983) + W(6, 1040714346, 1021452133, 1048946821, 1021975771) + W(7, 1040332065, -1090323173, -1112512014, -1095359061) + W(8, 1044503809, 1030628716, 1038933875, 1038764813) + W(9, 1032949373, 1041097413, 1029165798, 1046714577) + W(10, 1023987857, 1027140771, 1026874120, 1026271340) + W(11, 1034225415, -1113760891, 1028642719, -1134282558); sum2 = W(0, -1130708327, -1156760442, 1011385503, 1005458237) + W(1, 1015786967, -1121500080, 1023017975, 1008927007) + W(2, -1131662151, -1160974837, -1122121264, -1104012424) + W(3, 1025508020, -1106371091, 1032453110, -1107217673) + W(4, 1027052068, -1119116140, 1006726095, 1053197196) + W(5, -1150821434, 1032166230, -1116451706, -1143126685) + W(6, -1104634511, -1148640061, -1101053828, 1050251696) + W(7, 1043632028, -1115585403, 1032061998, 1045664978) + W(8, 1037500532, 1028521640, 1041142688, -1121651972) + W(9, -1105814552, -1117076340, -1120517680, -1103126409) + W(10, -1117309872, -1132259207, -1129219511, -1148190653) + W(11, 1005943453, -1120252400, 1024831312, -1126349911); WS(-1081408895, 1057237802); - sum1 = W(0, 1016592219, -1135569700, 1019913045, -1134722237) + W(1, 1020337237, 1019971573, 1015924209, 1027236154) + W(2, 1050393725, 1025037351, 1042967287, 1042881918) + W(3, 1033060699, 1038993285, 1028206140, 1041649576) + W(4, -1096948620, 1021729271, -1123436299, -1107250293) + W(5, 1047123275, 1037602588, 1034435092, 1044331459) + W(6, -1099121222, -1114451665, -1104931659, -1092679092) + W(7, -1098053310, -1091584672, -1092984777, -1089381821) + W(8, 1042338077, 1033766733, 1036822635, 1042265522) + W(9, 1043883210, 1042862441, 1029491668, 1042007901) + W(10, 1026859007, 1023688209, 994107237, 1017621813) + W(11, 1033354815, -1147819555, 1035642823, 963919445); sum2 = W(0, -1127968320, 1036537032, -1112917417, 1020801080) + W(1, 1019615648, -1127208552, 1023589392, -1121416948) + W(2, -1092240358, 1030963640, -1097473768, -1109029546) + W(3, -1116583352, 1028578068, -1113404853, 1041090246) + W(4, 1057542400, -1105653780, 1053316325, 1058712288) + W(5, 1043894648, -1093453186, 1034405836, -1094394128) + W(6, 1016463192, -1097383073, 1038201480, 1052867895) + W(7, -1123129572, -1141347136, 1006791808, 1037486484) + W(8, -1094079665, 1040975890, -1101066411, 1013027424) + W(9, -1118015492, -1117505000, -1111557726, 1044943944) + W(10, 1037438732, 1019305024, 1028884816, 1010261952) + W(11, 1027371024, -1113360113, 1034904608, -1104647878); WS(-1076745215, 1064070508); - sum1 = W(0, 1019383636, -1138649581, 1029667879, -1127653591) + W(1, 1027426151, 1022926189, 1004012708, 1016119660) + W(2, 1043437193, 1030286820, 1040316179, 1048543741) + W(3, 1029763954, 1039947283, 1025479577, 1041368223) + W(4, -1100863080, 1033675388, -1102225484, -1084687593) + W(5, -1111626052, 1026499316, -1122995300, 1026134601) + W(6, 1019299111, 1027453406, -1110289513, -1082029409) + W(7, 983973284, 1031954367, -1118301831, 1016553765) + W(8, 1041928012, 1031909515, 1043406276, 1044625233) + W(9, 1044339921, 1039879984, 1022733729, 1012331970) + W(10, 1018313975, -1136380470, 1026991539, -1136351578) + W(11, 1027257018, 1022902273, 1026798858, 1027440187); sum2 = W(0, -1131696089, 1008718823, -1149188438, -1140198251) + W(1, -1129603953, 1007479839, -1141563590, 1018622169) + W(2, 1012459087, -1135045027, -1118135053, 1033739972) + W(3, -1142742214, 1015462815, -1126906553, -1135479163) + W(4, -1112347233, -1125420309, 1041969824, 1052325325) + W(5, 1029891118, -1120072309, 1017890385, 1016803437) + W(6, 1039451269, -1110618065, 1024383435, 1052741682) + W(7, -1121721953, -1095903036, -1105015368, -1098230278) + W(8, -1158657302, 1007247903, 1015365577, 1034080133) + W(9, -1110453303, -1162307222, -1122346803, 1021342643) + W(10, -1129595249, 999949222, -1130814181, -1140370763) + W(11, 1020979581, -1132990667, 1008938691, -1137891195); WS(-1094563452, 1051169575); - sum1 = W(0, -1154622990, 1029393378, -1117775501, 1033996553) + W(1, -1136342582, 1018491963, 1032030382, 1015760954) + W(2, 1018130713, 1035203109, -1113234793, -1106127031) + W(3, -1114335628, -1112874623, 1023872671, -1110067034) + W(4, 1040428881, 1032896399, 1049040808, -1112183035) + W(5, 1048012112, 1044702279, 1032915973, 1035998904) + W(6, -1120902330, 1039535746, -1102863965, -1090463816) + W(7, 961094679, -1098092733, 1033184663, 1029109433) + W(8, -1113835211, 1021002107, -1107942972, -1105904891) + W(9, -1148767576, -1124337998, 1006151100, -1110631596) + W(10, 1019319877, 1036762426, -1135300966, 1040237135) + W(11, 1032716400, -1137189022, 1037223880, 1013167238); sum2 = W(0, 1028413027, -1120070369, 1012563150, -1111535757) + W(1, 1011962278, 1009477102, -1153318262, 974823129) + W(2, -1121092135, -1130520759, -1120753460, -1097640928) + W(3, -1098008778, 999766235, -1122757360, -1129371381) + W(4, 1017337743, 1037177446, -1106734706, 1051800696) + W(5, 1035782812, -1106510696, 1010623246, 1028214977) + W(6, -1137632446, -1104029390, 1048794348, 1050145982) + W(7, -1114477541, 1047938812, -1111017918, -1123769252) + W(8, 999930971, 1033133092, -1111694827, 1041394994) + W(9, -1118971109, -1127041263, 1020162151, -1124747017) + W(10, 1027578971, -1114678191, 1030530567, -1119592910) + W(11, 1001961835, 1024176823, -1115486877, 1007999422); WS(1057759166, -1088449289); - sum1 = W(0, -1129635066, 1025446574, -1144519245, 1017539549) + W(1, 1026395242, -1122678010, 1025431320, 1024557433) + W(2, 1044873994, 1037627635, 1041685209, 1033910011) + W(3, 1039651930, 1035038013, 1039320958, 1038868536) + W(4, -1087389198, -1097118359, -1089578865, -1129568803) + W(5, 1010566389, 1030050103, -1110122707, -1112614790) + W(6, -1116302487, 1022204225, 1022125102, -1105345911) + W(7, -1122366800, -1097803608, -1119554634, -1126568107) + W(8, 1048786726, 1039292653, 1045860709, 1045748274) + W(9, 1027479143, 1033498658, -1161253492, 1010965710) + W(10, 1017011581, 1021371937, 1025212662, 1031878029) + W(11, 1013486066, 1007580942, 1028360045, 1015223035); sum2 = W(0, -1162281894, -1124547002, -1150111187, -1135956229) + W(1, -1145634890, 965409433, -1123274137, 1024679583) + W(2, 1033992046, -1149048922, 988741862, -1132541637) + W(3, -1132011310, 1024739191, 1008671821, -1129294934) + W(4, 1042856153, 1036788056, -1112557119, -1097406101) + W(5, -1121853795, -1104384368, 1032013500, -1147059498) + W(6, 1038465062, 1046094595, 1060179844, 1049669935) + W(7, -1101657128, 1042681611, -1111116605, 1027020519) + W(8, -1093956780, -1100316514, -1090501223, 1022378118) + W(9, 1045140163, -1121116299, 1035479824, -1131272734) + W(10, 1024284423, 1035682376, -1122577303, -1113139255) + W(11, -1130855582, -1118824057, 1006161754, -1124922046); WS(-1086987838, -1100233980); - sum1 = W(0, 1015308459, -1122325985, -1116672610, 1032904116) + W(1, -1141168915, 1033123257, 1001375875, 1015833828) + W(2, 1041765192, 1028094431, 1042485054, -1118546351) + W(3, -1118052589, -1116818498, 992241989, 1015146386) + W(4, -1105415847, -1114108890, -1092596043, 1046690691) + W(5, 1054244345, 1049735534, 1040724504, 1041637233) + W(6, 1042444900, 1041449686, 1049087917, -1128556841) + W(7, -1089307961, -1094503991, -1104029377, -1100869156) + W(8, -1111075669, -1106140165, -1110170951, 1034284768) + W(9, 1026589088, 1030527932, 1008796465, -1123717612) + W(10, 1003799483, 1034767973, -1144225139, 1033288361) + W(11, 1010481109, -1121578684, 1030765989, -1124977133); sum2 = W(0, -1128145157, 1026284201, 1012811840, -1136599052) + W(1, 992541697, 1011005728, -1127430370, 995789721) + W(2, -1100557855, -1106810438, 1042787919, 1044596046) + W(3, 1038174685, -1104618112, -1166127490, -1116633305) + W(4, 1057648426, 1054522141, -1098531848, -1073275189) + W(5, 1061008073, 1059653331, 1035655860, 1017274260) + W(6, 1048654145, 1057115188, 1046636853, -1074262745) + W(7, 1044984510, 1060082709, 1034192337, 1033697834) + W(8, -1122215769, -1103409060, 1046426252, 1035358469) + W(9, 1036107748, -1104639697, -1130597644, -1112828961) + W(10, -1133425768, 1017140792, -1118227807, -1143532160) + W(11, 1016191398, 981079778, 1006837720, 1021901152); WS(-1092446204, 989212831); - sum1 = W(0, 1007124942, -1116778591, 1027403088, -1121715541) + W(1, 1019921952, 1020332096, -1139218425, 1020381759) + W(2, 1048125124, -1131432602, 1042237585, -1138060917) + W(3, 1027977243, -1126238792, -1131884420, 1024321015) + W(4, -1138101793, -1106585464, 1016240146, 1037962972) + W(5, 1053191424, 1053622732, 1043276755, 1049124886) + W(6, -1141178857, 1019782926, 1036610823, -1101006449) + W(7, -1094792341, -1089064867, -1101892348, -1107274751) + W(8, -1102978326, -1115311760, -1110971902, -1114322839) + W(9, 1031189102, -1137835047, -1132849129, -1110951117) + W(10, 1034583667, 1015089582, 1027127900, 1008360193) + W(11, 1028625507, 1017386452, 1009465805, 1008208785); sum2 = W(0, -1120159352, -1125980662, -1131578305, 1028063854) + W(1, 1021975879, 1033612769, -1119579693, 1040487308) + W(2, -1088595541, 1050146519, -1090859444, -1107336769) + W(3, -1105868965, 1041431951, -1112749441, 1042279365) + W(4, 1060560783, -1093128727, 1057304640, 1071289406) + W(5, -1087527230, -1086794372, 982969010, -1089785065) + W(6, 1061831343, -1098317152, 1057012981, 1069689231) + W(7, -1097221007, -1086042421, 1033122226, -1088997285) + W(8, -1089452071, 1042347964, -1095995319, -1096815763) + W(9, -1104502319, 1049524493, -1104150062, -1135764460) + W(10, -1101640393, 1038452583, -1105624394, 1041229675) + W(11, 1037791301, -1143180172, 1029453052, 1049121852); WS(-1080642303, 1037515653); - sum1 = W(0, 1014399585, 1040389217, 1025436037, 1035628117) + W(1, 1032176658, 1019714410, 1031481267, -1129425897) + W(2, -1123461796, 1009459592, -1118449912, -1111999897) + W(3, 1042449564, -1098862637, 1015874414, -1108656118) + W(4, -1115821917, -1138501592, 1046808963, 1046961203) + W(5, -1085801589, 1042823052, 1032561937, 1022709518) + W(6, 1037702505, 1046330151, -1088063230, 1048171302) + W(7, 1046621083, 1033619294, 1017602698, -1172911161) + W(8, -1105260875, -1113097082, -1166545913, -1112931778) + W(9, -1116953058, -1108126015, 1033606503, -1161936349) + W(10, -1134503912, 1032999462, 1011659972, 1033647146) + W(11, 1020514160, 1023868127, 1030447848, 1015791986); sum2 = W(0, -1139497271, 1025910769, -1105297083, 1037339247) + W(1, -1111547600, -1123186639, 1029488041, -1137152287) + W(2, -1104932637, 1043978669, -1105480129, 1037617885) + W(3, -1107402541, -1105522985, 1011577705, -1102258444) + W(4, 1000924601, -1116100213, -1102785010, 1049988969) + W(5, 1045831134, 1040977948, 1036894407, 1025599417) + W(6, 1034980171, 1042493673, 1044002411, 1050036780) + W(7, 1039942071, -1097804729, 1042714488, -1139888185) + W(8, -1102656208, 1038409695, -1098474508, -1122964745) + W(9, -1106907325, 1028039731, -1112976714, -1112698813) + W(10, -1154378706, 1025837919, -1109802618, 1036616991) + W(11, -1132149525, -1111839940, 1040500443, -1114191023); WS(1060124606, -1084472548); - sum1 = W(0, 1012638700, -1131934189, -1129347279, -1138043955) + W(1, 1007380511, 1022374575, 996895579, 992489843) + W(2, -1112711971, 1021193865, -1125331574, 1048955067) + W(3, -1106488069, -1115361884, -1120058426, -1118477310) + W(4, 1024524352, 1017460401, -1113956442, -1094951982) + W(5, 1048203795, 1005249701, 1026650437, -1129456851) + W(6, 1032623962, -1117271615, 1049120342, 1015143283) + W(7, -1110142007, 1024310560, -1121731240, 1036683482) + W(8, -1115629480, 1023262959, -1108495481, 1031640934) + W(9, -1129214986, -1136673413, 1017029987, -1115998674) + W(10, 1027484509, -1157409515, 1010910287, 1021584239) + W(11, -1144904917, 1017598403, -1145343061, 1014521967); sum2 = W(0, -1113301049, -1129519836, -1113144608, -1114997262) + W(1, 1028189537, -1144798799, -1135227415, -1123606042) + W(2, 1041723134, 1018887182, 1065721494, 1081282167) + W(3, 1053752802, 1004635839, 1024321495, 1032429021) + W(4, -1119425470, -1123219625, -1082046556, -1068115046) + W(5, -1091841582, -1126716683, -1149813598, -1137534547) + W(6, 1012563935, 1021107126, 1032971141, -1092304788) + W(7, -1120681827, 1026059029, 992723582, -1121765421) + W(8, 1013366251, -1131491053, -1132479565, 1028331651) + W(9, 1021570574, -1132445755, 1010781703, 1024141029) + W(10, -1135264199, 1017265018, -1135106943, 927030725) + W(11, 983594844, -1137356791, 959859164, -1123588459); WS(1064307390, 997943845); - sum1 = W(0, 1016504192, 1004931163, 1001468389, -1125536771) + W(1, 1024701821, -1157300426, 1008115882, 1014991280) + W(2, -1110031838, -1124632947, -1106796660, -1132488742) + W(3, -1111862756, -1111316170, -1153319146, -1116314499) + W(4, -1108555962, -1129767067, -1106350773, -1097456765) + W(5, 1040312105, -1110123941, 1030600762, -1109063375) + W(6, 1047561626, 1003984285, 1053522405, 1050670238) + W(7, -1128004006, 1039422954, 1005773541, 1042190650) + W(8, -1114174882, 1017992857, -1106382906, -1136221548) + W(9, -1123896954, 1020844396, 1015300557, 1024320647) + W(10, 1004953741, 1018940039, 1000370245, 1015934681) + W(11, 1011062590, -1128259885, -1153739770, -1130969505); sum2 = W(0, 1036505224, 1018720963, 1037554666, 1035136259) + W(1, -1131720942, 1012123245, 1027168757, 1024471767) + W(2, -1100095598, -1119632397, -1082101932, -1072130218) + W(3, -1090292986, -1114842502, -1108983905, -1105383800) + W(4, 1039944480, 1033659023, 1064933062, 1074634461) + W(5, 1057038142, 1046242606, 1018437263, 1041395450) + W(6, -1110028565, 1025734363, -1103479495, 1012777017) + W(7, -1132873326, -1117820012, -1117294599, 1033191694) + W(8, 1016119595, 1015545311, 1036578506, 1036162128) + W(9, -1120419990, -1115011900, 1004277346, -1113427773) + W(10, 1017378303, -1126149289, 1022196513, -1118704038) + W(11, 1020047721, 1033886326, -1136709697, 1024978781); WS(1053812476, -1113586226); - sum1 = W(0, -1130399840, 1028349447, 1021963321, -1121520129) + W(1, 1020769785, -1115853964, 1021860117, -1121122124) + W(2, -1111011390, -1120416825, -1107941440, -1106086226) + W(3, -1129958415, -1107644952, -1122155502, -1114352785) + W(4, 1007197394, -1105796643, 1056809437, 1046348585) + W(5, -1090756230, 1050300257, -1116443513, 1041113720) + W(6, 1037708373, 1044272829, -1093131829, 1057081835) + W(7, 1059679544, -1119895572, 1040260199, -1110926804) + W(8, -1122978308, -1110423782, -1122097703, -1099751719) + W(9, -1102044582, -1111488955, 1019054925, -1156322407) + W(10, -1139049030, -1125249991, 1011721762, -1114497366) + W(11, 1018253471, 1022041005, -1121197023, -1135672898); sum2 = W(0, 1015672618, -1121994623, -1149412980, -1127744422) + W(1, 990134373, 1024671460, -1132259460, -1125579600) + W(2, 1010541588, 1032866568, 1044676778, -1124040172) + W(3, -1102290659, 1029499881, -1120084193, 1001699435) + W(4, -1115998566, 1011616452, -1107438884, 1058620442) + W(5, 1049322309, -1104592911, 1035840939, -1123886068) + W(6, 1020421847, -1095022641, -1097106911, 1015017230) + W(7, -1104275347, 1045525693, -1119993661, 1037165892) + W(8, -1129704409, 1020628925, -1112769863, -1113422252) + W(9, 1039268635, 1026741584, 999745387, -1126762930) + W(10, 1015113530, 1017019595, 1022483811, 1015061518) + W(11, -1114030797, -1136765715, -1131682952, -1134246014); WS(1059863230, -1098226968); - sum1 = W(0, -1111154474, 1033627108, -1111220881, 1018934285) + W(1, -1156119577, -1108034825, 1035708952, -1116166225) + W(2, -1130042625, 1044463840, -1098768819, 1036585799) + W(3, 1041677635, -1100472134, 1038444026, -1111999396) + W(4, -1124092147, -1125693093, 1043860042, -1094381437) + W(5, 1034781361, 1038465479, 1027036095, 1019243847) + W(6, -1126659421, 1045974478, 1040108899, -1098844542) + W(7, 1051479065, -1096809363, 1040658808, 1003830125) + W(8, -1116454602, 1040744732, -1149847241, 1043775752) + W(9, 1046003792, -1121805723, 1037992790, -1131289879) + W(10, -1109234699, 1026252457, -1103478147, -1107008620) + W(11, -1127254569, -1105262391, 1038964162, -1116821910); sum2 = W(0, 1031860762, -1114215534, 1037917300, -1123072391) + W(1, -1121765219, 1036233577, -1113082189, 1007761049) + W(2, 1008804487, -1119320351, 1028769566, -1145928741) + W(3, -1118791492, 1035112755, -1119166399, 1034891236) + W(4, 1036033743, -1105317049, 1033869945, -1104666827) + W(5, -1103277106, 1043081028, -1110309063, 1003334201) + W(6, -1130814575, -1126605754, 1029943513, 1058632863) + W(7, 1010033985, 1033184724, -1124066564, -1146667244) + W(8, -1114717025, -1103884858, -1097519272, -1084821476) + W(9, -1091781337, -1108906997, -1105454190, -1124982586) + W(10, 1042429978, 1019583714, 1050527129, 1057878257) + W(11, 1047090522, 1050006554, -1116436299, 1037673833); WS(1053829756, -1108691549); - sum1 = W(0, 1014621415, -1117035633, 1017668333, -1121088251) + W(1, -1113943163, 1027915142, -1117882340, 1018110476) + W(2, 1034972923, 1031518451, 1028891034, 1043029617) + W(3, 1037608353, -1118505878, 1008280866, -1114328254) + W(4, -1105089900, -1146432572, -1111069516, 1052288956) + W(5, 1043183409, 1040529537, -1127832039, 1025673432) + W(6, -1121242915, 1011744694, -1099260407, -1096216885) + W(7, -1109446679, 1033001703, 1023717270, 1038283409) + W(8, 1024842558, -1195363583, 1035963185, 1043236853) + W(9, -1104376301, -1110826184, -1108863440, -1136644866) + W(10, -1125107735, 1024600093, -1111257697, 1022444749) + W(11, 1008767270, 983774736, 1021787123, -1122279626); sum2 = W(0, 1011466728, -1128158188, 993685376, 1021341187) + W(1, -1125064327, 1016637363, -1135616946, -1142265296) + W(2, -1153535168, -1133074596, -1111924694, 1041916532) + W(3, -1115375045, -1111577830, -1121861231, -1139232914) + W(4, -1121363658, -1108077390, 1048370655, -1088803436) + W(5, 1050909934, 1048268187, 1028734454, 1033829714) + W(6, -1113493290, 1031842286, -1096696142, -1097359431) + W(7, 1066069354, -1102058354, -1112810542, -1108918948) + W(8, 1016979229, -1114077565, 1032702600, 1051606360) + W(9, -1108957150, -1106393780, -1104652034, -1124153420) + W(10, -1121975877, 1032726750, -1126878203, 1020447303) + W(11, -1115472084, 1011253904, 1032484333, -1135690267); WS(1043379192, -1131322837); - sum1 = W(0, -1129021027, -1148980502, -1117253390, 1015261926) + W(1, 1024719214, -1130947836, 974083843, 1010796022) + W(2, -1109595831, -1141769560, -1131540259, 1038059198) + W(3, 1043151230, 1040366611, 1036650848, 1032003186) + W(4, 1033800339, 1040943040, -1099641090, 1019360940) + W(5, 1047704456, -1120007803, 1032688054, -1135300928) + W(6, 1042153991, 1016895818, 1040857522, -1103092216) + W(7, -1091529984, -1100986498, -1116706574, -1114490317) + W(8, -1099711038, 1029537886, -1104535414, 1032384358) + W(9, 1043292971, 1031568104, 1019020464, 1026900536) + W(10, 1026187331, 1023917269, 999787984, -1137467256) + W(11, 1021851650, -1117455240, 1021119266, -1124200964); sum2 = W(0, -1127801857, -1143073539, -1106914355, -1114698807) + W(1, -1129241721, 1034854605, 1015357631, 1026781991) + W(2, 1028175283, 1010285366, 1045024365, -1107796176) + W(3, -1093181393, -1094857339, -1104001534, -1106206681) + W(4, -1129802997, 1022418743, -1109183829, 1055188047) + W(5, 1060464193, 1038631095, 1035894131, -1121422795) + W(6, -1133354170, -1111757330, 1035388549, -1099199714) + W(7, -1108056884, 1042537531, 1019867695, 1010545294) + W(8, -1129332011, 1032847739, 1028119663, 1027769667) + W(9, 1015260775, -1123722407, 1021694327, -1120402439) + W(10, 1029358411, -1119713292, 984677997, -1126683209) + W(11, -1117802232, 1025618013, -1116557581, 1021478623); WS(1049844732, -1121310639); - sum1 = W(0, 1023733410, -1099209689, 1040893204, -1102957277) + W(1, -1114244983, -1136674298, -1108461358, 1021220348) + W(2, 1044402267, -1106734859, 1050332331, -1111686974) + W(3, -1122456058, 1049981942, -1102278760, 1043895987) + W(4, 1053233309, -1108848000, 1049912979, -1098618899) + W(5, 1048539349, -1111429758, 1039273110, 1048170180) + W(6, -1096212219, -1103164857, -1099336615, -1097562740) + W(7, -1096335583, 1033031043, -1102589972, -1101337719) + W(8, 1051767783, -1109302031, 1050917291, -1121562509) + W(9, 1042792075, 1039550692, 1008842338, 1041281742) + W(10, -1114613442, -1129199659, 1033787229, -1111886543) + W(11, -1121890370, 1041151474, -1104020956, 1031699907); sum2 = W(0, 1051830333, 1052363768, 1062286287, 1068323273) + W(1, 1062941652, 1058036233, 1038399576, 1029358050) + W(2, 1040398919, 1056364330, -1105094784, -1117763636) + W(3, -1117097644, -1135317262, 1045469136, -1127713443) + W(4, -1088812275, -1088095023, -1083945825, -1086712736) + W(5, -1085128967, -1090471655, -1096613184, -1118175248) + W(6, -1112895824, -1128031249, -1110939052, -1122350162) + W(7, -1107088013, -1117471490, -1128774604, 1023889083) + W(8, 1030823820, -1126124865, -1131257287, 1034881723) + W(9, 993374262, 1022005418, -1124473506, 1006015479) + W(10, -1120174945, 1022839272, -1113476028, 1031923437) + W(11, -1149114843, -1131972943, 1015689530, -1114795832); WS(997080576, -1130763300); - sum1 = W(0, -1113905570, 1030153879, -1117230256, -1152616277) + W(1, -1146808706, -1112646432, -1186209359, -1120216576) + W(2, -1121320815, -1108108727, -1100762033, -1090117932) + W(3, -1109500574, -1102311764, -1119610882, -1099135446) + W(4, 1038521748, 1032364321, 1051702873, 1069923213) + W(5, -1104049339, 1028696893, -1120830317, 1030578386) + W(6, 1025325853, -1131460303, 1040312882, 1063008042) + W(7, 1056019095, -1115439812, -1125581089, -1116447004) + W(8, -1108459484, -1152289285, -1099800679, -1092045374) + W(9, -1100849447, -1105934578, 1028735898, -1108771165) + W(10, -1123369669, -1111143084, 1018134009, -1116551136) + W(11, 1015899783, -1120248394, -1113190874, -1120342084); sum2 = W(0, -1130955153, -1115062100, -1114768924, 1040485485) + W(1, -1102247365, 1040365390, -1105380703, -1134789779) + W(2, 1025142055, 1033634795, -1114031272, -1115074190) + W(3, -1110799922, 1039570131, -1112489130, 1035629875) + W(4, 1025405091, -1124058081, 1047530952, -1104495565) + W(5, 1038913214, -1102056033, -1123724877, -1104428707) + W(6, 1041203911, -1151569099, -1160505239, 1065129660) + W(7, -1115442088, 1037120419, -1145632358, 1035843769) + W(8, 1034798579, -1098708869, 1048498835, -1095909934) + W(9, -1105078519, 1024518769, -1109649658, -1117935125) + W(10, -1107186683, 1041850582, -1097808347, 1045395705) + W(11, -1106337339, 1007217475, -1152795787, -1124566009); WS(-1078383103, 1059446981); - sum1 = W(0, -1139864362, 1022304576, -1117916615, 1007335089) + W(1, -1119884647, 1022280942, 1023668405, 1034312731) + W(2, -1142609202, 1008862865, -1109139429, 1032501274) + W(3, 982044231, -1115332063, 991223187, -1102309771) + W(4, -1105667544, -1100327790, -1098424968, -1089810345) + W(5, 1033240873, 1049118183, -1140016273, -1110413061) + W(6, 1048881003, 1047898440, 1053051896, -1104044598) + W(7, 1051763270, -1113330784, 1027424455, 1032557738) + W(8, -1110989208, 1029966423, 1023833874, 1040575921) + W(9, -1114053146, 1041606896, -1122699729, 1041157596) + W(10, 1019807480, -1128249884, -1114518074, 1013296733) + W(11, -1110353213, -1126749570, 1021514772, -1121516731); sum2 = W(0, -1143648694, 1022767513, 963325627, -1138915747) + W(1, 1040530304, 1031585165, 1008260859, -1120690652) + W(2, 1050457027, -1104882348, 1052893834, -1122824043) + W(3, 1019582897, -1094902239, -1113748748, -1090635807) + W(4, -1090901428, 1017677825, -1090554669, 1048412513) + W(5, -1101863176, -1104950416, -1120605391, 1056780417) + W(6, -1095258955, -1116653154, 1030383529, 1063122641) + W(7, -1089352859, 1057380402, -1106433792, 1049388154) + W(8, 1047388223, -1125154789, -1114292033, -1118207917) + W(9, 1048190601, -1102824630, 1038107916, -1104842210) + W(10, 1034828442, -1149114774, 1040557770, 1005930742) + W(11, 980397999, 1033506230, -1115355457, -1136517107); WS(-1104952056, -1073278929); - sum1 = W(0, -1144211169, 1031125659, -1121100585, -1142367854) + W(1, 1025675017, -1114298540, 1036563163, -1122834968) + W(2, -1099507218, -1116651974, -1101060075, -1105066053) + W(3, -1131576359, -1114707952, -1120605819, -1111900952) + W(4, 1047627264, -1113308557, 1054491321, 1039149624) + W(5, -1106626380, 1042584197, -1128818827, 1039018645) + W(6, 1043300637, 1037274304, -1102367022, 1051689271) + W(7, 1044811828, -1128472513, 1045578618, -1115669626) + W(8, -1098196346, -1126577137, -1102852173, -1106731162) + W(9, -1111689619, -1126957444, 992521004, 1025441875) + W(10, 1030331294, -1122667056, 1026346581, -1120693369) + W(11, 1018492983, -1140414731, -1128018583, 997033420); sum2 = W(0, -1117577133, -1139616023, 997820975, 1028627780) + W(1, -1114909048, 1032747040, -1116006677, 1030832637) + W(2, 1036324905, -1124977156, -1120808104, -1109376562) + W(3, 1029259135, -1145526876, 1022442689, 983753970) + W(4, 1012676607, -1115101040, 1041273688, 1049990275) + W(5, 1043064430, 1039154681, 1027909669, -1115224952) + W(6, -1164734594, 1032695755, 1041759226, -1096754642) + W(7, 1041324783, -1094055114, -1098711698, 1023440264) + W(8, 1039853902, -1116113854, 1041255405, -1106762918) + W(9, -1111929038, 1025837595, -1130147608, -1112181665) + W(10, -1110394349, 1006188424, -1120661488, 1033535767) + W(11, 1021759445, 1023476809, -1133986843, 1029342490); WS(1057403966, -1096678293); - sum1 = W(0, 1015545167, 1013920108, 1030182836, 991347091) + W(1, 1031028372, -1130110920, -1137745417, -1127755335) + W(2, -1133819725, -1127594402, 1031500952, -1107540753) + W(3, 1042502792, -1120427420, 1023814022, -1113612941) + W(4, 1037006758, -1136130453, 1042283546, 1040431359) + W(5, -1084295706, 1042737160, 1019878434, 1042334622) + W(6, -1110196161, -1123399563, -1086200264, 1060132444) + W(7, 1049379651, 1001749345, 1023472436, -1123659840) + W(8, -1111752718, 1041684833, 1047364560, -1104881213) + W(9, -1113607001, -1117219726, 1017968636, 1008021369) + W(10, 1028708905, -1119121787, -1120221088, 1006406689) + W(11, 1002061113, 1026883950, -1124476270, 1011156129); sum2 = W(0, -1178786588, 1027650789, 1004569898, 1010647389) + W(1, -1130907066, -1128412421, 1000455394, 1019136642) + W(2, -1129322914, -1117835702, -1120140062, -1110565129) + W(3, 1046200355, 1035331810, 1040609034, -1114775527) + W(4, -1116170217, -1106357388, 1012300621, 1051050908) + W(5, -1094299123, 1038925264, -1110352470, 1028674911) + W(6, 1036181740, 1050236879, 1029537087, -1121260831) + W(7, -1105419536, -1104188032, -1148832482, 1009994365) + W(8, 1016863918, -1107702296, -1115347042, 1019718506) + W(9, 1018471790, 1035623426, 1031812039, -1129304944) + W(10, -1132924585, -1127926494, 1007741857, -1147888890) + W(11, -1122466004, -1132432621, -1132484471, -1146317634); WS(1056335484, -1129697442); - sum1 = W(0, -1118615510, -1123816285, 1016357093, -1126548591) + W(1, 1017679973, -1125007109, -1130509569, -1127256452) + W(2, 1026825265, -1162479083, -1123245334, -1115166368) + W(3, 993334229, 1009460392, -1117686884, -1110259820) + W(4, -1102686619, -1175208362, -1112742573, 1012633705) + W(5, 1048503365, -1110640192, 1010107581, 1008538193) + W(6, 1045269336, -1122870505, 1056143939, 1022501065) + W(7, 1044007618, 1043433395, 1037226473, 1040188728) + W(8, 1031523962, 1025178018, -1115481871, -1098786498) + W(9, -1107348056, -1104721331, -1124234681, -1112073470) + W(10, -1140818205, -1112741005, 1004860403, -1121817826) + W(11, -1134864917, -1142571619, -1120701013, 1004599859); sum2 = W(0, -1140731697, 1018164054, -1116322329, 1033668632) + W(1, -1110091010, 1006827755, 1024608202, 978878091) + W(2, -1126783010, -1144859189, -1148034885, -1111621890) + W(3, 1034430751, -1133278289, -1134565598, -1106732021) + W(4, 1035005186, 1011714049, -1112384840, 1057652336) + W(5, -1103655808, 1035575897, 1007536733, 1017810394) + W(6, -1110815467, 1039236492, -1109778149, 1053123628) + W(7, -1113563636, 1009902097, 1031837967, 1032913014) + W(8, -1144657885, -1130754383, -1113329105, -1107649638) + W(9, -1112793157, -1136830370, -1131576514, -1118754368) + W(10, -1127206230, -1146205013, -1113225660, 1012470213) + W(11, -1113811608, -1126431906, 1007646275, -1123083034); WS(1064654654, 1035088379); - sum1 = W(0, -1123150274, 1013730923, -1124984926, -1143080352) + W(1, -1115541655, -1120446591, 1019709882, -1123168830) + W(2, -1101065371, -1104968795, -1104298005, -1097917367) + W(3, -1115560637, -1112072243, -1121553409, -1101025669) + W(4, 1052021669, 1043838624, 1050953841, 1053857683) + W(5, -1098028717, -1118042236, -1117850604, 1024509393) + W(6, 1034671630, -1116995686, -1125221929, 1053311748) + W(7, 1054064059, 1056948345, 1047317764, 1051915779) + W(8, -1103122974, 1025043295, -1102292982, -1101557747) + W(9, -1102206963, -1099829586, -1123986585, -1105952782) + W(10, -1124628232, -1123853974, -1122875259, -1129945790) + W(11, -1115475969, 1010096420, -1120157778, 1010117900); sum2 = W(0, -1115290116, 1036300391, -1109664288, 1023887773) + W(1, 1031338337, -1112746552, 1029647363, -1123357025) + W(2, -1109338596, -1120873277, -1133763869, -1110763968) + W(3, -1104363651, -1111086518, 1014654409, -1113327782) + W(4, 1052546267, 1031940424, 1041363997, 1046589307) + W(5, 1038758869, 1026186944, 1011886363, -1114411312) + W(6, -1101682429, 1045633640, -1094977574, 1050150667) + W(7, -1104681827, -1121584221, 1042076972, 1033926660) + W(8, -1106866549, -1121551223, 1008614181, -1110488084) + W(9, -1120223295, 1035823152, -1111033402, 1046305164) + W(10, 1027635895, 1021591180, -1119215823, 1009099129) + W(11, 1016354897, -1115537942, 1012736237, -1109553196); WS(-1088190206, -1108558078); - sum1 = W(0, -1109712467, 1034096473, -1111610193, -1111503908) + W(1, 1029528067, -1109918121, -1130336610, -1110290409) + W(2, 1048826552, -1100191472, 1051587686, -1114238856) + W(3, -1124911644, 1053388852, -1101598429, 1049826386) + W(4, -1117596347, -1104233509, -1112703594, -1118548075) + W(5, -1094857227, 1040678692, -1102065648, -1108498290) + W(6, 1045129740, 1021528052, -1123092480, 1045282957) + W(7, 1041941490, -1121835291, 1050563972, 1032628503) + W(8, -1145103958, 1015098342, 1033306871, -1105600408) + W(9, -1116887040, 1043572363, -1101594283, 1041251987) + W(10, 1040739958, -1095362037, 1043699492, -1112734841) + W(11, -1106244021, 1044475255, -1100499697, 1015959598); sum2 = W(0, -1140036524, -1122134368, -1124742331, 1023368729) + W(1, 1025643512, -1117935205, 1029315286, -1121900993) + W(2, 1033121292, -1135675176, 1022385651, 1037868584) + W(3, -1113410705, 1034815986, -1106876578, 1029051910) + W(4, 1020537037, -1102563608, 1017232470, -1097085277) + W(5, 1026038978, -1107749524, -1116418603, 1013163432) + W(6, -1094559771, -1090683436, -1089829937, -1081905013) + W(7, -1085580324, -1093433405, -1100509010, -1107168757) + W(8, 1042598592, 1049536131, 1015761873, -1122385293) + W(9, -1119606047, 1034046493, 1037794408, 1020109569) + W(10, 1048560917, 1043095342, 1060516603, 1068776853) + W(11, 1062905414, 1053234619, 1023262329, 1038509970); WS(1048802172, -1118644607); - sum1 = W(0, 1022629891, 1001330921, -1147098739, 1023807923) + W(1, -1129374813, 1028532286, 1031375324, -1151549405) + W(2, -1112271863, 1008285357, -1106982824, 1020475895) + W(3, 958183765, 1025640422, -1133565569, -1106868493) + W(4, -1115934246, 1007889405, -1110669107, -1095657203) + W(5, -1113474437, -1090481180, -1104303995, -1104624276) + W(6, -1112205646, -1137992085, 1044651974, 1050363724) + W(7, 1050921091, 1050665633, 1037811271, 1049383075) + W(8, 1050188943, 1025826270, 1026008921, 1011316531) + W(9, -1106529387, -1131537104, -1125009457, 1022847857) + W(10, -1125264263, -1127716075, -1113499645, 1026946398) + W(11, -1121270209, 1021652689, 1014192325, -1142930963); sum2 = W(0, 1016559128, -1119933527, 1008526536, 1034816070) + W(1, 1018959568, 1026554777, -1112891495, 1046177388) + W(2, -1089262209, 1032931419, -1094914643, -1096197918) + W(3, -1101210129, 1049415798, -1128790619, 1043157162) + W(4, 1053795811, -1108360154, 1052999976, 1069558608) + W(5, -1103281588, -1085501184, -1098019814, -1088254262) + W(6, 1058569170, -1097574423, 1052760357, 1058007152) + W(7, -1106340652, -1101474305, -1114646508, -1096632714) + W(8, -1094475155, 1036603460, -1106271635, 1022028102) + W(9, -1121182797, 1027756295, -1124734105, 1015426864) + W(10, 1008650912, -1121755244, 1039081818, 1004102711) + W(11, 1033515588, 1032461240, -1118822413, 1043397723); WS(-1085648446, -1079079370); - sum1 = W(0, 1031831473, -1114079994, 1031367567, -1118896788) + W(1, -1123680847, 1033718927, -1123944253, 1033541103) + W(2, 1036117159, 1003975776, 1044164867, 1045647319) + W(3, 1033826253, 1041970952, 1024952417, 1040029267) + W(4, 1049939273, 1042007752, 1043312672, -1095211959) + W(5, -1122554975, -1116359196, -1176880640, 1026974961) + W(6, -1094329359, -1097850009, -1089391360, -1087218668) + W(7, -1100203021, 1033960979, -1108529239, -1111794397) + W(8, 1040633606, -1134555900, 1041283678, 1044809099) + W(9, 1046447947, 1042238738, 1024390649, 996515216) + W(10, 1023486628, 1019647980, 1023951387, 1014099708) + W(11, 1017251780, 1031788713, -1146375056, 1033511473); sum2 = W(0, 1019169584, -1120973142, 1033125970, 1025364316) + W(1, -1109812797, 1040314133, -1108282977, 1018923536) + W(2, 1042983019, 1009997472, -1103915398, 1036688212) + W(3, -1125420780, -1119986230, 1034277286, -1117630132) + W(4, -1098354632, -1106283039, 1033722376, 1062322516) + W(5, -1098634798, 1057333054, -1102308141, -1125368820) + W(6, -1099987280, 1032814660, -1095179878, 1032770062) + W(7, -1109050948, -1097734639, 1034195486, 1049154263) + W(8, 1048978343, -1103033329, 1055664562, -1097173506) + W(9, -1103688168, -1173745415, -1107997912, -1098308929) + W(10, -1118546716, 1022934360, -1110281795, 1045599869) + W(11, -1119010038, 1038965178, 1007528912, 1035253180); WS(-1089355774, -1078290086); - sum1 = W(0, -1122950775, -1112691207, 1023290087, -1107733500) + W(1, -1146188190, -1132821263, -1112282369, -1116356099) + W(2, 1037182841, -1124344033, 1046400294, -1118583361) + W(3, 1042531744, -1121639475, -1137408791, 1018516820) + W(4, -1118638572, 1041047393, -1098349922, 1057481334) + W(5, -1139289650, -1109625472, 1026873009, -1139389015) + W(6, -1121667553, -1104403323, -1099164822, 1054069421) + W(7, -1097191323, 1041114291, -1120861012, -1139200383) + W(8, 1009124079, -1138062223, 1044398104, -1149431076) + W(9, 1044515332, -1120573261, -1120947806, 1017011067) + W(10, -1115334660, -1126199861, -1136525567, -1110719762) + W(11, 1015659149, -1121643278, -1122889719, -1120569352); sum2 = W(0, -1120919296, 1009843654, -1132368064, 1020138111) + W(1, 1029564211, -1115205032, 1016741875, -1119663171) + W(2, -1124567280, -1107129213, 1020831927, -1098918731) + W(3, -1132836513, 1010227332, -1118685376, 1026001154) + W(4, 1037030993, 1043380414, -1109288357, 1059483198) + W(5, -1119273466, -1106893419, 1028452918, -1135273053) + W(6, -1120629799, -1102119519, -1112537154, 1064361176) + W(7, -1104145236, 1043150197, -1117770026, 1019055438) + W(8, -1106639281, 1030878171, -1118412551, -1093377806) + W(9, -1123848756, -1103899854, 1024207514, -1109882780) + W(10, 1020211370, -1126825280, -1144175329, -1146281491) + W(11, -1135251423, 1028327527, -1128215590, 1024565629); WS(1064975294, 1066308158); - sum1 = W(0, 1031747776, -1106142801, 1028818885, 1001228109) + W(1, -1115396498, 1041342669, -1108139113, 1027821620) + W(2, -1119071204, 1032019633, 1041375482, -1112793497) + W(3, 1013499583, -1123968938, 1024220311, 1020544662) + W(4, 984462229, 1045090381, -1093262116, 1049965274) + W(5, 1052662103, -1113450905, 1035427697, -1138282267) + W(6, -1132055971, -1108909198, 1038243096, 1021279149) + W(7, -1090377239, 1040402543, -1107965954, -1116422289) + W(8, -1148253029, -1110036442, 1036945928, -1115536386) + W(9, 1034061985, 993049059, -1113141447, 1016907357) + W(10, -1126913907, 1036419718, -1121925745, 1019907753) + W(11, 1032108124, -1109636927, 1032825796, -1128061041); sum2 = W(0, 1016610899, -1135553471, -1163068737, -1147979120) + W(1, -1121296916, -1139692219, 1007282246, 1019770181) + W(2, -1118189976, 1018031354, -1120752887, 1035872696) + W(3, 1034250650, 1022157658, -1131969269, -1131641536) + W(4, 1027283971, -1118352328, 1042584076, -1095799786) + W(5, 1009508653, -1121907329, -1148404200, 1013257077) + W(6, 1028895363, 1032145382, 1042427003, 1073605475) + W(7, 1056095764, -1130051225, 1025403981, -1121748387) + W(8, -1113530321, -1123867563, -1099207121, -1075418961) + W(9, -1091570337, -1113117501, -1124635978, -1123610989) + W(10, 1007846553, 1011272254, 1010785270, 1026092591) + W(11, 1030054693, 1019567305, 1012575724, 1018865930); WS(1062423998, 1020226002); - sum1 = W(0, -1122384152, 1000976853, -1122957973, -1140430696) + W(1, 1018079658, -1116871589, 1021042950, -1130305609) + W(2, -1116470612, 1015809956, -1115150860, -1100102424) + W(3, -1099378776, -1102397253, -1121061927, -1097083551) + W(4, -1095861522, -1125526476, -1101122465, 1051208664) + W(5, 1045734276, 1040938184, 1045437908, 1049869175) + W(6, 1055717600, 1034182342, 1052715645, 1053221217) + W(7, 1041738487, 1038184662, -1114085178, 1019939330) + W(8, -1128557498, -1136390676, -1101688288, -1097231798) + W(9, -1114764537, -1107259340, 1034631967, -1105843464) + W(10, -1133541800, 1025071548, -1121585121, 1026360261) + W(11, -1127628368, -1121765359, 1018430000, -1122412137); sum2 = W(0, -1125184611, 985313435, -1181860650, -1124740239) + W(1, -1132645547, 999484231, -1125466771, 1024683619) + W(2, -1124729770, -1132095255, 1028760415, 1011065519) + W(3, 1033849803, 1015359010, -1140486285, -1125848669) + W(4, 1045115043, -1117207517, 1036693207, -1088457353) + W(5, -1096437481, 1048821220, -1107942084, 1027562883) + W(6, 1058112728, 1067077185, -1107623537, -1080660794) + W(7, -1109418981, -1117188353, 1027196953, -1127975224) + W(8, 1023628890, -1158219675, 1043689375, 1020427720) + W(9, -1110185484, 1032363474, -1121893121, 1023023798) + W(10, 1007171579, -1118062236, 1000645119, -1160295467) + W(11, 1015083304, 1023561702, -1134577643, -1158549787); WS(-1085592318, -1113086899); - sum1 = W(0, -1127342656, 1024334944, -1107952998, 1034498345) + W(1, -1131633306, -1110168462, 1033648125, -1119681052) + W(2, -1105245475, 1029597578, -1104926592, -1110412429) + W(3, -1103724998, -1098176238, -1115323711, -1098367950) + W(4, -1104578161, -1117644382, -1101901257, 1053247055) + W(5, 1051300307, 1051451939, 1049307889, 1053283054) + W(6, 1053241687, 1041591201, 1051692021, 1044816720) + W(7, 1042909421, -1124765258, -1143558503, -1113485404) + W(8, -1103827813, 1020278010, -1097952575, -1110749814) + W(9, -1106968399, -1105195378, 1027981559, -1102600950) + W(10, -1138537863, 1015573096, -1110174988, 1033881662) + W(11, -1116328992, -1113141267, 1028312016, -1113790704); sum2 = W(0, 1019423143, -1134200265, 1022335641, -1126211289) + W(1, -1160177640, 995157684, -1138832033, -1130236057) + W(2, -1118706158, -1122995556, -1113839515, -1123774588) + W(3, 1002859666, -1114460336, -1131104601, 1027754115) + W(4, -1110500850, 1021681136, -1121978030, 1048787768) + W(5, 1035034344, 1025695056, -1126984825, 1027074464) + W(6, 982325064, -1106847870, 1042414810, 1052221246) + W(7, 1009324191, -1129766425, -1136621129, -1120353368) + W(8, -1117883328, -1115095323, -1112736275, -1118959328) + W(9, 1026260852, -1114723897, 1016807320, -1121253912) + W(10, -1145733922, 1001371122, 1019850892, -1113736050) + W(11, 1023767274, -1130130145, -1131688905, 992217060); WS(1025516512, -1100199588); - sum1 = W(0, 1010096560, 998291066, 1015136529, 1016981531) + W(1, -1134306338, 1015217585, 1025573847, 1027586712) + W(2, 1021891087, -1128181387, -1152435393, 1035336779) + W(3, 1040424469, 1041134374, -1147235028, -1105873140) + W(4, 1041308560, 1015332531, 1054580194, 1043985948) + W(5, -1088067164, -1097437107, -1108043523, 1024655979) + W(6, -1106994989, -1097993736, -1087955312, 1049373383) + W(7, 1048585956, 1044933000, 1037061588, 1041451309) + W(8, -1107391304, 1040752366, 1021987303, 1016493518) + W(9, -1111549299, 1015283332, -1125444197, 1025261651) + W(10, 1032706511, -1115681272, 1013936722, -1153713033) + W(11, -1122756060, 1028860515, -1124931799, 1010373746); sum2 = W(0, 1024904631, -1136864762, 1005033941, 1030076655) + W(1, 1022202973, 995105737, 1009257370, -1113660547) + W(2, -1115115972, 1023564875, -1114446231, -1115188268) + W(3, -1099782234, 1025338591, -1107689693, 1049272645) + W(4, -1128899549, -1103710322, -1140124434, 1057566767) + W(5, 1051976820, 1009750634, 1040613751, -1105716747) + W(6, -1100416868, -1105139728, -1107001478, 1061216146) + W(7, -1114917196, -1107279078, -1123762171, -1112133417) + W(8, 1014205090, -1112771593, -1105823902, -1101449249) + W(9, -1115621063, -1123827499, -1124460977, 1019919657) + W(10, -1138213458, 1024304323, 1028369943, 1031401203) + W(11, -1127316949, 1002907445, 1021828037, -1121285688); WS(1050734204, -1108852232); - sum1 = W(0, -1111669430, 1026854009, -1115457556, 1022285659) + W(1, -1130768721, -1124925681, 988348114, -1117352760) + W(2, -1116292712, -1106093993, -1104273631, -1090233269) + W(3, -1103820941, -1107176543, -1114665965, -1103610460) + W(4, -1122281377, -1103616254, 1027625969, 1069754213) + W(5, -1114752252, -1130883179, -1144129324, 1032882469) + W(6, 1027495958, -1113635568, 1042550097, 1065691213) + W(7, 1054098174, 1026991873, 1018693905, 1034282506) + W(8, -1113568120, -1125634353, -1100906821, -1090598793) + W(9, -1103145534, -1107767585, 1007587914, -1112131865) + W(10, -1123139966, -1117637392, -1147736996, 999398084) + W(11, -1140005358, -1123096067, -1120005196, -1122062653); sum2 = W(0, 1024214881, -1122830075, 1024710111, -1118490155) + W(1, -1134765475, 1007204875, 955722144, -1132418382) + W(2, -1105712489, 1026001227, -1105988647, 1044311614) + W(3, -1128591966, 1016894538, -1132281374, -1121103003) + W(4, -1096328526, -1089670730, -1109313571, 1057951288) + W(5, 1031038781, -1135710147, -1121635711, 1040031313) + W(6, 1036545949, -1104892025, 1042923133, 1050757116) + W(7, 1041007149, -1111844715, 982097434, -1131469166) + W(8, -1114697429, 1027384734, -1108836817, 1046225965) + W(9, -1111832237, 1020988490, -1141601766, -1137288635) + W(10, 1029115040, -1127506094, 1018384918, -1118982995) + W(11, 1000957030, 1018633070, -1131312630, 1012074251); WS(-1077332287, -1089760701); - sum1 = W(0, 998476811, -1146931846, 1020090684, -1115596769) + W(1, 1018970620, -1117338894, -1131301080, -1134004534) + W(2, -1126986618, -1106320367, -1103512376, -1106044643) + W(3, 1033789092, -1121544222, 1025908912, -1120853460) + W(4, 1035645275, 1033143495, 1057100532, 1033806067) + W(5, -1089559024, -1119052427, -1109205213, 1021655744) + W(6, 1035996661, 1030948981, -1098691810, 1054020686) + W(7, 1053006209, 1053247323, -1117960094, -1112997269) + W(8, -1111559939, -1116749294, -1114602228, -1102410839) + W(9, -1114317262, -1148875196, 1040862618, 1024305160) + W(10, 1002151576, -1132098378, 1020764052, -1131285468) + W(11, -1143682184, -1140686688, -1112291776, -1137942600); sum2 = W(0, 1006079429, -1142220161, -1129651941, -1120056293) + W(1, 1021210606, -1138049810, 1020679942, -1144760977) + W(2, 1015506585, 1012377004, 1027444401, 1027255740) + W(3, -1154390002, -1121552483, 988683875, -1149209645) + W(4, -1129173219, 1019086641, 1029291472, -1087748986) + W(5, 1030702430, 1046290929, -1149010889, 958643736) + W(6, -1126961905, 1027847692, -1099113060, -1071778912) + W(7, 1077548482, 1017608723, 1009874569, -1165018915) + W(8, 1025558752, -1121396179, 1031608500, -1132223695) + W(9, 1041292060, 1030045463, -1116313503, -1108302337) + W(10, 1004493969, -1129089615, 1032469225, -1117547929) + W(11, 1017793536, -1115202758, 1024909384, -1153372770); WS(1054407548, 983325672); - sum1 = W(0, 1028412425, -1115456470, 1017604747, 1031921957) + W(1, -1121692358, 1041128181, -1131299175, 1034097067) + W(2, -1105600625, 1033490817, -1115519181, 1031550611) + W(3, -1103698804, -1109550327, 1030793272, 1014014769) + W(4, -1148390382, 1044756246, -1103922376, -1090010995) + W(5, 1062123705, -1103937189, 1039103265, -1135652511) + W(6, 1033571545, -1114006910, 1059608097, -1087252051) + W(7, -1094628214, 1042983319, -1106569209, -1116995186) + W(8, 1032293767, -1119790070, -1107101148, 1044072953) + W(9, 1027680451, 1021059262, 1007158719, -1141553278) + W(10, -1124427701, 1037509878, 1007976775, 1022727275) + W(11, 1033962892, -1108328080, 1032055396, -1143059662); sum2 = W(0, 1007145536, -1108956115, -1123468231, 1003522017) + W(1, -1106382527, 1023566518, -1116797301, 1016028592) + W(2, 1011835040, 1040320325, 1009493536, 1036429861) + W(3, 1045134298, -1132203156, 1044032552, -1103689691) + W(4, -1115291423, -1145921569, -1120694127, 1057547857) + W(5, -1120933925, -1105348488, -1105744806, 1019566780) + W(6, 1029973058, -1113530029, 1025444390, 1039825371) + W(7, -1093621604, 1030401418, -1111109931, 1039637835) + W(8, 1036345379, -1116109872, -1106839609, 1028735446) + W(9, 1043632212, 1032927131, 1031187850, -1119043970) + W(10, -1106716830, 1031627486, -1106619549, 1032586179) + W(11, -1135351552, -1107014793, 1030984886, -1117261713); WS(1062610366, -1081620328); - sum1 = W(0, 1034909184, 1022225638, 1022593144, 1034659649) + W(1, -1145063906, 1029979468, 1024460554, -1129493655) + W(2, 1041975919, 1036878493, 1038275488, 1049110721) + W(3, 1039909252, 1050285945, 1032760119, 1052309552) + W(4, 1038564634, 1032326503, 1032775158, -1104434937) + W(5, -1098154666, -1091716385, -1098908862, -1093908076) + W(6, -1086061975, -1097049310, -1094128798, -1097332230) + W(7, -1096830529, 1031802154, -1125106744, 1033460244) + W(8, 1054071881, 1038246806, 1049378869, 1048167927) + W(9, 1037005773, -1122539766, 1023442918, -1111713187) + W(10, -1118145809, 1033815666, 984752392, 1040915883) + W(11, -1127387550, 1042582214, 1025327999, 1038395208); sum2 = W(0, 1025388154, 1001261778, 1007664153, 1018216589) + W(1, 1011431705, -1124915037, 1007167865, -1118462618) + W(2, -1106689977, 1031762430, -1105078255, -1117638934) + W(3, -1119019386, 1039919645, -1115769810, 1041969311) + W(4, -1110560421, -1111104301, -1122922762, 1029938402) + W(5, -1107704269, 1043034893, 1041034358, 1050092429) + W(6, 1049316874, -1112011481, 1044332351, -1117360942) + W(7, -1116357646, -1107523849, -1112781805, -1104673921) + W(8, 983067209, 1033280635, -1133572905, 1022258405) + W(9, 1016143957, -1109485745, 1010088409, -1106654827) + W(10, -1121273022, 1026153330, -1116643818, 1033323756) + W(11, -1123412994, 1027380094, 1016238045, 1006440178); WS(-1079099231, 1058224693); - sum1 = W(0, -1136025729, 1041807413, -1113852830, 1038775953) + W(1, -1130024634, -1139925939, 1032899333, -1135488689) + W(2, -1098612147, 1030021338, -1101745716, -1114342965) + W(3, -1109189268, -1116898669, -1169623989, -1105924753) + W(4, 1040574357, -1113591959, 1035906153, -1100940817) + W(5, -1110548904, -1107090858, 983487291, -1105279552) + W(6, 1044962866, 1041390773, 1038641429, -1112997607) + W(7, 1053521164, 1048687519, 1048553583, 1049805017) + W(8, -1107948018, 1030293261, -1102747762, -1131180663) + W(9, -1102886695, -1127712365, 1020276366, 1033907987) + W(10, -1152707357, 1019631368, -1119110697, 1008365619) + W(11, -1120409456, -1156710253, -1137865855, -1120648241); sum2 = W(0, 1026221982, -1150712731, -1135858910, 998750602) + W(1, 1026066546, -1122173835, 1019885572, -1114797832) + W(2, 1031288593, -1121646784, 1020650492, -1118866549) + W(3, -1126679589, 1033676882, -1119823506, 1024418530) + W(4, 1025270629, 1040465550, -1102699692, -1090773917) + W(5, -1103726643, 1038653616, 1044175124, 1035909226) + W(6, -1105433524, -1099611845, -1077885918, -1073585027) + W(7, -1083499628, 1072488285, 1076879885, 1053754278) + W(8, 1025604422, 1015298833, 1013887757, -1111404471) + W(9, 1029004921, -1128843744, 1042609155, -1128976380) + W(10, 1025361731, -1118571342, 1035533544, -1115122758) + W(11, 1025173545, -1132364945, 982102231, -1120827581); WS(1039418864, -1140458522); - sum1 = W(0, 983096624, 1029517505, -1121873782, 1019803894) + W(1, 1027911414, -1108005699, 1033576274, -1135118358) + W(2, -1114535995, -1145085849, -1102746926, 1028523779) + W(3, -1100878768, 1038991951, -1142936385, -1125909817) + W(4, 1044450572, -1097839409, 1062380387, -1088253674) + W(5, -1109645966, -1154916402, -1107146685, -1122115416) + W(6, 1027001827, 1032347927, -1106235793, -1090653261) + W(7, 1061486174, 1029669390, 1047810758, 1038152785) + W(8, -1117675070, 1031259878, -1105839880, 1036696746) + W(9, -1097301074, 1024178544, 1038477872, 1041849616) + W(10, 1035770150, -1104931415, 1033087169, -1121428646) + W(11, -1120235273, 1035324408, -1108040973, 1017003668); sum2 = W(0, -1121567066, 1034344084, -1105011035, -1142865888) + W(1, -1136511728, -1106811819, 1032101677, -1113394506) + W(2, 1033267920, 1026284945, 1033899226, -1120108491) + W(3, -1122542627, -1120621959, -1134482876, -1114137407) + W(4, -1104421963, -1103410132, 1022298858, 1057117238) + W(5, 1038703002, 1033583066, -1122973141, 1030826553) + W(6, -1130139832, 1037507308, -1102818563, 1003910328) + W(7, 1043197066, -1124006960, -1124335993, -1125132432) + W(8, -1132243276, 1034735332, 1044067085, 1041074904) + W(9, -1101099519, -1109459597, 1041237660, -1128301632) + W(10, 1024120715, -1109350039, -1127155070, 975508032) + W(11, -1117378085, 1001772648, -1113899392, -1126301549); WS(1053462780, -1083681865); - sum1 = W(0, 1023511963, -1126058411, 1027394040, -1118697149) + W(1, 993307519, 1025756296, -1131368524, 1029589575) + W(2, 1041747598, 1015154794, 1045749945, 1048726745) + W(3, 1043007793, 1038169844, 1024626666, 1040782360) + W(4, 1041497612, 1018224530, 1041814811, -1086401302) + W(5, -1115623160, 1032344226, -1127070442, -1131398580) + W(6, -1138339988, 996055791, 1014351349, -1082085657) + W(7, -1096882594, -1105145572, -1110953740, -1110890258) + W(8, 1035615616, 1027711272, 1040756601, 1048515830) + W(9, 1042139693, 1038148425, 1009997960, 1029718722) + W(10, 1020629658, -1123213919, 1032965474, -1129047376) + W(11, -1132054806, 1033289129, -1128695798, 1029252236); sum2 = W(0, 1008350928, 1011413600, -1120704007, 1027382950) + W(1, -1127381517, 981904616, 1015535284, -1135583391) + W(2, -1118714967, 1024023545, -1126562655, 1034951721) + W(3, -1128407708, -1126139913, 999360844, -1138986423) + W(4, 1030231193, -1124778398, -1110351493, 1052754126) + W(5, 1033272406, -1151802072, 1013432992, -1123376913) + W(6, -1091889801, -1098641764, -1104262464, 1057762368) + W(7, -1161878816, 1012148800, 1024540201, 1031971990) + W(8, -1108897465, 1033453825, -1106889474, 1035809187) + W(9, -1132306565, -1153180738, 1014625240, -1118108772) + W(10, 1032606711, -1125648711, 1025836907, -1131934955) + W(11, -1134699254, -1131180247, -1171757551, -1140791326); WS(-1099299320, 1056598066); - sum1 = W(0, 1006197652, -1128153660, -1136164796, 1035903322) + W(1, -1130396894, 1036246880, -1124832314, 1029570879) + W(2, -1127547996, 1041714651, 1029712499, -1128532088) + W(3, -1106761055, -1121593759, 1017604226, 1017990507) + W(4, -1106221946, -1098261544, -1085896508, 1057218165) + W(5, 1054525467, 1028130044, 1036683414, 1016287010) + W(6, 1045972807, 1038366195, 1057638589, 1054413180) + W(7, -1086573266, -1090476168, -1101308500, -1110319406) + W(8, 1004824505, -1113181968, -1113770157, 1038963911) + W(9, 1033084478, 1042818602, -1130963634, -1114724733) + W(10, -1119658116, 1030219574, -1129447670, 1033715440) + W(11, -1128924420, -1116035017, 1030841394, 998207538); sum2 = W(0, -1131923124, 993280665, -1127811288, 1032538133) + W(1, 992174233, 1002762140, 1015088121, 992586073) + W(2, 1046772351, 1028557303, -1107794670, -1098564467) + W(3, -1121892222, 1035775413, -1158807761, 1019898989) + W(4, -1110971235, -1134148898, 1043137579, 1067961229) + W(5, -1095277951, -1099141736, 1011333246, -1118039147) + W(6, -1105011941, -1104446514, -1096504482, 1066594258) + W(7, -1107079502, -1090299346, -1132433157, -1109952821) + W(8, 1028001687, -1147560296, -1101129935, -1104613803) + W(9, -1097683180, -1129031039, -1108888578, 1040568125) + W(10, -1121147281, 1024426003, 1034898623, -1136832302) + W(11, 1036381319, 1009264906, 1032287279, -1111357043); WS(-1105186296, -1108555742); - sum1 = W(0, 1040483623, -1101386974, 1040816739, -1134311356) + W(1, -1108915605, 1046011615, -1102638726, 1034864637) + W(2, -1105046378, 1038429012, 1031828819, -1107675004) + W(3, 1034430779, -1109709717, 1030173660, -1130419297) + W(4, -1118442722, 1042743759, -1093958439, 1030110546) + W(5, 1044698927, -1103097566, 1041159370, -1111922822) + W(6, 1040666374, -1109750289, 1050019912, 1040526743) + W(7, -1097473172, 1045974257, -1110364069, 1017242540) + W(8, 986662468, -1103538071, 1033262923, -1121451017) + W(9, 1032745156, 1041021277, -1106175813, 1032931450) + W(10, -1118942975, 1040611956, -1118385334, 1012951144) + W(11, 1035127903, -1100748433, 1037154391, -1121991998); sum2 = W(0, -1127162070, -1135271108, 1003505825, 1012864633) + W(1, -1123384038, 1026898060, -1134649836, -1125848258) + W(2, 1014979733, -1136185376, 1028363168, -1131143608) + W(3, 1033256022, -1133517476, -1120532892, 1028008335) + W(4, -1114518101, 1038675289, -1105093650, -1095849351) + W(5, 1028346583, -1113528611, 1028725832, -1117113572) + W(6, 1016203776, -1140478504, -1089585970, -1070239185) + W(7, -1078361549, 1038794260, -1125525718, 1005296645) + W(8, 1035296562, -1111853852, 1058969759, 1079096535) + W(9, 1068193425, 1032636395, 1017911666, 1032298564) + W(10, -1117887634, 1030827904, -1123277259, -1116960146) + W(11, -1125445846, -1113311282, 991223090, -1134431064); WS(1065442623, 1015025160); - sum1 = W(0, -1115365041, 1040496438, -1114325264, 1036061554) + W(1, 1038370800, -1112496600, 1039123015, -1120668655) + W(2, -1113215535, 1031517084, -1109245393, 1002812769) + W(3, 1036804053, -1099928488, 1036473513, -1116761110) + W(4, 1018550702, 1044423084, -1131936399, 1034975748) + W(5, 1048106991, -1107673238, 1041344487, 1019812354) + W(6, 983382403, 1017412396, -1109909072, -1099246196) + W(7, -1114225707, -1129165678, 1011581692, -1138585900) + W(8, -1103693946, 1032083208, -1106995843, 1024898238) + W(9, 1044531927, -1096349707, 1043676418, -1110354101) + W(10, -1124004468, 1040563090, -1120263275, 1012000060) + W(11, 1036150809, -1113013165, 1037117105, -1128538214); sum2 = W(0, 1010698941, 1042699596, 1048659418, 1058578114) + W(1, 1052277576, 1019470633, 1041036392, -1119471849) + W(2, 1023126843, -1140656688, -1095653758, -1081184698) + W(3, -1097586600, -1098953045, 1018118885, -1122826054) + W(4, -1106210958, 1029081919, -1118272649, 1060468587) + W(5, 1043044817, -1108654451, 1029721267, -1130901998) + W(6, -1122624743, 1040813712, -1097694847, 996865603) + W(7, -1103459725, -1128239326, 1034766857, 1000734433) + W(8, -1122034237, -1174961495, 1033474214, -1102355565) + W(9, 1049205466, -1112376452, 1033989555, 1017824567) + W(10, -1117968485, 1039098482, -1118912655, 1020119257) + W(11, 1031051049, -1108144089, 1038110136, -1114988670); WS(-1115864032, 1039792746); - sum1 = W(0, -1140468214, 996096400, 1010495721, -1114956320) + W(1, 1013460969, -1122072970, -1127833232, -1140762151) + W(2, -1121375417, -1108218204, -1109130991, -1115276388) + W(3, 1040789857, -1114444905, 1026520268, -1127271361) + W(4, 1034497081, 1033625894, 1055392502, 1036829073) + W(5, -1088431348, 1030275655, -1111886108, 1031218972) + W(6, 1039608980, 1040179481, -1093805194, 1050653566) + W(7, 1049263376, 1051648994, -1121903450, -1112576115) + W(8, -1113171393, -1108192053, -1127063626, -1109643980) + W(9, -1124542831, -1129660583, 1034831154, 1019975176) + W(10, -1132620605, 1018030914, 1012649753, -1127455572) + W(11, -1135717173, -1147064482, -1114505023, -1135014713); sum2 = W(0, 1015385693, 1020691269, 1015565489, 1019337403) + W(1, -1132207064, -1131086480, -1163542113, 1010427910) + W(2, -1115435752, -1141202058, -1111436746, 1040267853) + W(3, -1114623303, 1025609602, -1140470334, -1128429973) + W(4, 1035175215, -1117300235, 1033401267, -1100581516) + W(5, 1041259906, -1101351817, 1020278145, 1027629029) + W(6, 1017441239, -1122675471, 1055273933, 1073306798) + W(7, -1073173797, 1032997632, -1122237085, -1119509251) + W(8, -1112773411, 1031000417, -1101083444, 1046685605) + W(9, -1115311051, -1113329498, 1031244051, 1033297372) + W(10, 998363696, 1016207247, -1113092041, 1013448250) + W(11, -1130370856, 1026870685, -1124843109, 1014260054); WS(1060418110, -1122066101); - sum1 = W(0, 1031696780, -1124029560, -1147879495, -1123330286) + W(1, -1137787811, 1025904121, -1122010711, -1131825009) + W(2, -1115430516, -1129767372, 1033383950, 1032201307) + W(3, -1124043956, -1135655378, 1016436406, 1011740349) + W(4, -1104465800, -1124342772, -1084846132, 1040589380) + W(5, 1059143665, 1047669789, 1032251443, 1017074582) + W(6, 1041576533, 1035204176, 1057835449, -1121351835) + W(7, -1085338500, 1026196737, -1113520196, 1023559701) + W(8, -1122042801, -1109435772, -1106791333, 1025265863) + W(9, 1037079395, 1031201378, -1120875027, 1024540211) + W(10, 1028261758, 1025573168, 1024098613, 1000233671) + W(11, 1020968696, -1122702819, 1016849816, -1123483709); sum2 = W(0, -1127836624, -1173496113, 1027284157, 1022886010) + W(1, 1036751625, -1124242822, 1017945890, -1140181115) + W(2, 1033364881, -1127629564, -1104916712, -1097350377) + W(3, -1105423640, 1034826035, -1122986652, 1033442485) + W(4, -1101679270, -1105780675, -1113070309, 1061873799) + W(5, -1096904559, -1105550966, -1127473876, -1108824717) + W(6, 1023580345, -1119640853, -1132739235, 1062616603) + W(7, 1009507187, -1098447862, -1116534057, -1115327874) + W(8, -1149619356, 1033890881, -1113766541, -1112358042) + W(9, -1119315178, 1045500652, 1015952658, 1033458469) + W(10, -1136662275, -1122666983, 1023707939, 1028952789) + W(11, -1117384012, -1137245711, -1136860123, 1001899534); WS(1052277756, 1024619064); - sum1 = W(0, 1029425189, -1155801216, 1030252033, -1112675811) + W(1, 1025211073, -1122395345, 994289396, -1124711713) + W(2, -1120340480, -1107014752, 1038469578, 1032327591) + W(3, 1034534022, 1039704040, -1137717581, 1045346698) + W(4, 1055903799, 1049346130, 1057427995, -1103272826) + W(5, 1040656272, -1111436999, 1016775164, -1134653325) + W(6, -1093981294, -1099678446, -1098793998, -1090697510) + W(7, -1103403378, 1041606598, 1005246730, 1013960373) + W(8, -1125235986, 1003141514, 1025012844, -1118748640) + W(9, 1025335343, -1106833215, 1029370155, -1099652851) + W(10, 1026200342, -1131584400, 1031806855, -1126277858) + W(11, 1010568017, 1032770798, -1124454216, 1034190187); sum2 = W(0, 1023289146, 1020437582, 1009748873, 1030199907) + W(1, 1007345789, 1010063617, 1018930146, -1127799210) + W(2, 1045862572, 1028786959, -1120652794, 1015917080) + W(3, -1117660774, -1106003069, 1039304637, -1098471935) + W(4, -1095566322, -1132354231, -1090793815, 1063879108) + W(5, -1107315270, 1045942315, -1106431667, 1048572904) + W(6, -1087461476, -1101737384, -1083542229, 1069217208) + W(7, 1056862945, -1153692567, -1111757292, 1056217861) + W(8, 1016132472, -1127607289, -1107157844, -1097091848) + W(9, -1098187278, -1116485608, 1036040005, -1094693884) + W(10, 1044890152, -1124440021, 1037463572, 1032502373) + W(11, 1028169917, -1108513707, 1034190881, -1108016950); WS(-1086218302, -1084258561); - sum1 = W(0, 1027347742, 1021408948, -1127633782, 1039366096) + W(1, -1116749595, 1033396118, -1139872292, 1025066091) + W(2, 1041008695, 1036310380, 1035524367, 1048593117) + W(3, -1138037400, 1045683171, 1032120647, 1046369740) + W(4, 1040638149, 1041666443, 1033011818, 1050103608) + W(5, -1111907839, -1097626581, -1099416246, -1095221944) + W(6, -1088163117, -1103354245, -1094269524, -1122175629) + W(7, -1096387988, -1103712029, -1111740158, -1117250695) + W(8, 1045697689, 1033383494, 1040895122, 1042904478) + W(9, -1136050786, 1018682217, -1126758410, -1121047845) + W(10, -1131589088, 1033326017, -1132088142, 1042877939) + W(11, -1131538396, 1039834587, 1030901630, 1034112696); sum2 = W(0, -1116225927, 1030773056, -1122365237, 1032148531) + W(1, -1127594672, 1026422036, 1023835916, -1131330830) + W(2, 1020583173, 1018516207, -1121497633, 1032012136) + W(3, -1111134479, -1112679629, -1123177144, -1112996078) + W(4, -1120289762, -1142227828, 1024002380, 1050603076) + W(5, 1040110681, -1109379336, -1102178993, -1102999759) + W(6, -1116630862, -1157244503, 1045806125, 1061490298) + W(7, -1104925089, -1096282325, -1103628682, -1116593585) + W(8, 1037488437, -1120616119, -1122845130, 1029135782) + W(9, -1122119114, 1035818151, -1118358279, 1024073644) + W(10, -1120774706, 1021325617, -1124264052, 1020114521) + W(11, -1129316292, -1129796491, 1024324894, -1129630471); WS(-1092406524, -1089571522); return clamp(mstd0 + 5.0 * vsum / wsum * mstd1, 0.0, 1.0); } -const static float2x3 rgb2uv = { - -0.169, -0.331, 0.5, - 0.5, -0.419, -0.081 -}; +shared float inp[555]; -const static float3x3 yuv2rgb = { - 1, -0.00093, 1.401687, - 1, -0.3437, -0.71417, - 1, 1.77216, 0.00099 -}; +#define CURRENT_PASS 2 -groupshared float inp[555]; +#define GET_SAMPLE(x) dot(x.rgb, rgb2y) +#define imageStore(out_image, pos, val) imageStoreOverride(pos, val.x) +void imageStoreOverride(uint2 pos, float value) { + float2 UV = mul(rgb2uv, INPUT.SampleLevel(sam_INPUT_LINEAR, HOOKED_map(pos), 0).rgb); + OUTPUT[pos] = float4(mul(yuv2rgb, float3(value.x, UV)), 1.0); +} -void Pass2(uint2 blockStart, uint3 threadId) { - const float2 inputPt = GetInputPt(); - const float2 outputPt = GetOutputPt(); +#define INPUT_tex(pos) GET_SAMPLE(vec4(texture(INPUT, pos))) +static const float2 INPUT_size = float2(GetInputSize()); +static const float2 INPUT_pt = float2(GetInputPt()); - const uint2 group_base = uint2(blockStart.x >> 1, blockStart.y); - for (int id = threadId.x * MP_NUM_THREADS_Y + threadId.y; id < 555; id += MP_NUM_THREADS_X * MP_NUM_THREADS_Y) { - uint x = (uint)id / 15, y = (uint)id % 15; - inp[id] = tex1.SampleLevel(sam, inputPt * float2(group_base.x + x - 2 + 0.5, (group_base.y + y - 3 + 0.5) * 0.5), 0).r; - } +#define temp_tex(pos) (float(texture(temp, pos).x)) +static const float2 temp_size = float2(GetInputSize().x * 1, GetInputSize().y * 2); +static const float2 temp_pt = float2(1.0 / (temp_size.x), 1.0 / (temp_size.y)); - GroupMemoryBarrierWithGroupSync(); +#define HOOKED_tex(pos) temp_tex(pos) +#define HOOKED_size temp_size +#define HOOKED_pt temp_pt - uint2 destPos = blockStart + uint2(threadId.x * 2, threadId.y); - if (!CheckViewport(destPos)) { - return; +void Pass2(uint2 blockStart, uint3 threadId) { + ivec2 group_base = ivec2(gl_WorkGroupID) * ivec2(gl_WorkGroupSize); + int local_pos = int(gl_LocalInvocationID.x) * 15 + int(gl_LocalInvocationID.y); + for (int id = int(gl_LocalInvocationIndex); id < 555; id += int(gl_WorkGroupSize.x * gl_WorkGroupSize.y)) { + uint x = (uint)id / 15, y = (uint)id % 15; + inp[id] = + HOOKED_tex(HOOKED_pt * vec2(float(group_base.x + x - (2)) + 0.5, float(group_base.y + y - (3)) + 0.5)).x; } - - float4 ret = 0.0; - float4 ret0 = 0.0; - float4 samples[12]; - const uint local_pos = threadId.x * 15 + threadId.y; + barrier(); + vec4 ret = vec4(0.0, 0.0, 0.0, 0.0); + vec4 ret0 = vec4(0.0, 0.0, 0.0, 0.0); + vec4 samples[12]; samples[0][0] = inp[local_pos + 0]; samples[0][1] = inp[local_pos + 1]; samples[0][2] = inp[local_pos + 2]; @@ -370,15 +2990,15 @@ void Pass2(uint2 blockStart, uint3 threadId) { samples[11][1] = inp[local_pos + 80]; samples[11][2] = inp[local_pos + 81]; samples[11][3] = inp[local_pos + 82]; - - float2 originUV = mul(rgb2uv, INPUT.SampleLevel(sam1, outputPt * (destPos + 0.5f), 0).rgb); - WriteToOutput(destPos, mul(yuv2rgb, float3(samples[4][3], originUV))); - - ++destPos.x; - if (!CheckViewport(destPos)) { + ret[0] = nnedi3(samples); + ret0[0] = inp[local_pos + 33]; +#if CURRENT_PASS == LAST_PASS + uint2 destPos = blockStart + threadId.xy * 2; + uint2 outputSize = GetOutputSize(); + if (destPos.x >= outputSize.x || destPos.y >= outputSize.y) { return; } - - originUV = mul(rgb2uv, INPUT.SampleLevel(sam1, outputPt * (destPos + 0.5f), 0).rgb); - WriteToOutput(destPos, mul(yuv2rgb, float3(nnedi3(samples), originUV))); +#endif + imageStore(out_image, ivec2(gl_GlobalInvocationID) * ivec2(2, 1), ret0); + imageStore(out_image, ivec2(gl_GlobalInvocationID) * ivec2(2, 1) + ivec2(1, 0), ret); } diff --git a/src/Effects/NNEDI3/prescalers.hlsli b/src/Effects/NNEDI3/prescalers.hlsli new file mode 100644 index 000000000..e81e3918a --- /dev/null +++ b/src/Effects/NNEDI3/prescalers.hlsli @@ -0,0 +1,73 @@ +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +// Conversion from GLSL to HLSL is done through defines as much as possible to ease synchronization and comparison with upstream +#define ivec2 int2 + +#define vec2 float2 +#define vec3 float3 +#define vec4 float4 + +#define mat4x3 float4x3 +#define matrixCompMult(mtx1, mtx2) (mtx1 * mtx2) + +#define shared groupshared + +#define atan atan2 +#define barrier GroupMemoryBarrierWithGroupSync +#define fract frac +#define intBitsToFloat asfloat +#define inversesqrt rsqrt +// mod deals only with positive numbers here and it could be substituted by fmod +#define mod fmod + +// lerp handles bools as the third argument differently from mix +float mix(float a, float b, bool c) { + return c ? b : a; +} + +#define MIX_LERP(type1, type3) type1 mix(type1 a, type1 b, type3 c) { return lerp(a, b, c); } +MIX_LERP(float, float) +MIX_LERP(float2, float2) +MIX_LERP(float3, float) +MIX_LERP(float4, float) + +#define texture(tex, pos) tex.SampleLevel(sam_##tex, pos, 0.0) + +#define OUTPUT_pt float2(GetOutputPt()) +#define frag_pos(id) (vec2(id) + vec2(0.5, 0.5)) +#define frag_map(id) (OUTPUT_pt * frag_pos(id)) +#define HOOKED_map(id) frag_map(id) + +#define gl_LocalInvocationIndex (threadId.y*MP_NUM_THREADS_X + threadId.x) +#define gl_LocalInvocationID threadId +#define gl_WorkGroupSize (uint2(MP_NUM_THREADS_X, MP_NUM_THREADS_Y)) +#define gl_WorkGroupID (blockStart / uint2(MP_BLOCK_WIDTH, MP_BLOCK_HEIGHT)) +#define gl_GlobalInvocationID (gl_WorkGroupID*gl_WorkGroupSize + threadId.xy) + +// disable warning about unknown pragma +#pragma warning(disable: 3568) +// disable warning about too many threads (ravu-r4-rgb triggers it) +#pragma warning(disable: 4714) + +// https://www.itu.int/dms_pubrec/itu-r/rec/bt/R-REC-BT.709-6-201506-I!!PDF-E.pdf +static const float3 rgb2y = float3(0.2126, 0.7152, 0.0722); +static const float2x3 rgb2uv = { + -0.2126/1.8556, -0.7152/1.8556, 0.9278/1.8556, + 0.7874/1.5748, -0.7152/1.5748, -0.0722/1.5748 +}; +static const float3x3 yuv2rgb = { + 1, 0, 1.5748, + 1, -0.187324, -0.468124, + 1, 1.8556, 0 +}; diff --git a/src/Effects/RAVU/RAVU_3x_R2.hlsl b/src/Effects/RAVU/RAVU_3x_R2.hlsl new file mode 100644 index 000000000..c834cc986 --- /dev/null +++ b/src/Effects/RAVU/RAVU_3x_R2.hlsl @@ -0,0 +1,176 @@ +// This file is generated by the scripts available at https://github.com/hauuau/magpie-prescalers +// Please don't edit this file directly. +// Generated by: ravu-3x.py --target luma --weights-file weights\ravu-3x_weights-r2.py --float-format float16dx --use-magpie --overwrite +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +//!MAGPIE EFFECT +//!VERSION 4 + +//!TEXTURE +Texture2D INPUT; + +//!SAMPLER +//!FILTER POINT +SamplerState sam_INPUT; + +//!TEXTURE +//!WIDTH INPUT_WIDTH * 3 +//!HEIGHT INPUT_HEIGHT * 3 +Texture2D OUTPUT; + +//!SAMPLER +//!FILTER LINEAR +SamplerState sam_INPUT_LINEAR; + +//!TEXTURE +//!SOURCE ravu_3x_lut2_f16.dds +//!FORMAT R16G16B16A16_FLOAT +Texture2D ravu_3x_lut2; + +//!SAMPLER +//!FILTER LINEAR +SamplerState sam_ravu_3x_lut2; + +//!COMMON +#include "prescalers.hlsli" + +#define LAST_PASS 1 + +//!PASS 1 +//!DESC RAVU-3x (luma, r2) +//!IN INPUT, ravu_3x_lut2 +//!OUT OUTPUT +//!BLOCK_SIZE 96, 24 +//!NUM_THREADS 32, 8 +shared float inp[340]; + +#define CURRENT_PASS 1 + +#define GET_SAMPLE(x) dot(x.rgb, rgb2y) +#define imageStore(out_image, pos, val) imageStoreOverride(pos, val.x) +void imageStoreOverride(uint2 pos, float value) { + float2 UV = mul(rgb2uv, INPUT.SampleLevel(sam_INPUT_LINEAR, HOOKED_map(pos), 0).rgb); + OUTPUT[pos] = float4(mul(yuv2rgb, float3(value.x, UV)), 1.0); +} + +#define INPUT_tex(pos) GET_SAMPLE(vec4(texture(INPUT, pos))) +static const float2 INPUT_size = float2(GetInputSize()); +static const float2 INPUT_pt = float2(GetInputPt()); + +#define ravu_3x_lut2_tex(pos) (vec4(texture(ravu_3x_lut2, pos))) + +#define HOOKED_tex(pos) INPUT_tex(pos) +#define HOOKED_size INPUT_size +#define HOOKED_pt INPUT_pt + +void Pass1(uint2 blockStart, uint3 threadId) { + ivec2 group_base = ivec2(gl_WorkGroupID) * ivec2(gl_WorkGroupSize); + int local_pos = int(gl_LocalInvocationID.x) * 10 + int(gl_LocalInvocationID.y); + for (int id = int(gl_LocalInvocationIndex); id < 340; id += int(gl_WorkGroupSize.x * gl_WorkGroupSize.y)) { + uint x = (uint)id / 10, y = (uint)id % 10; + inp[id] = HOOKED_tex(HOOKED_pt * vec2(float(group_base.x + x) + (-0.5), float(group_base.y + y) + (-0.5))).x; + } + barrier(); +#if CURRENT_PASS == LAST_PASS + uint2 destPos = blockStart + threadId.xy * 3; + uint2 outputSize = GetOutputSize(); + if (destPos.x >= outputSize.x || destPos.y >= outputSize.y) { + return; + } +#endif + float luma0 = inp[local_pos + 0]; + float luma1 = inp[local_pos + 1]; + float luma2 = inp[local_pos + 2]; + float luma3 = inp[local_pos + 10]; + float luma4 = inp[local_pos + 11]; + float luma5 = inp[local_pos + 12]; + float luma6 = inp[local_pos + 20]; + float luma7 = inp[local_pos + 21]; + float luma8 = inp[local_pos + 22]; + vec3 abd = vec3(0.0, 0.0, 0.0); + float gx, gy; + gx = (luma3 - luma0); + gy = (luma1 - luma0); + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.1018680644198163; + gx = (luma4 - luma1); + gy = (luma2 - luma0) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.11543163961422666; + gx = (luma5 - luma2); + gy = (luma2 - luma1); + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.1018680644198163; + gx = (luma6 - luma0) / 2.0; + gy = (luma4 - luma3); + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.11543163961422666; + gx = (luma7 - luma1) / 2.0; + gy = (luma5 - luma3) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.13080118386382833; + gx = (luma8 - luma2) / 2.0; + gy = (luma5 - luma4); + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.11543163961422666; + gx = (luma6 - luma3); + gy = (luma7 - luma6); + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.1018680644198163; + gx = (luma7 - luma4); + gy = (luma8 - luma6) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.11543163961422666; + gx = (luma8 - luma5); + gy = (luma8 - luma7); + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.1018680644198163; + float a = abd.x, b = abd.y, d = abd.z; + float T = a + d, D = a * d - b * b; + float delta = sqrt(max(T * T / 4.0 - D, 0.0)); + float L1 = T / 2.0 + delta, L2 = T / 2.0 - delta; + float sqrtL1 = sqrt(L1), sqrtL2 = sqrt(L2); + float theta = mix(mod(atan(L1 - a, b) + 3.141592653589793, 3.141592653589793), 0.0, abs(b) < 1.192092896e-7); + float lambda = sqrtL1; + float mu = mix((sqrtL1 - sqrtL2) / (sqrtL1 + sqrtL2), 0.0, sqrtL1 + sqrtL2 < 1.192092896e-7); + float angle = floor(theta * 24.0 / 3.141592653589793); + float strength = mix(mix(0.0, 1.0, lambda >= 0.005), 2.0, lambda >= 0.02); + float coherence = mix(mix(0.0, 1.0, mu >= 0.25), 2.0, mu >= 0.5); + float coord_y = ((angle * 3.0 + strength) * 3.0 + coherence + 0.5) / 216.0; + vec4 res0 = vec4(0.0, 0.0, 0.0, 0.0), res1 = vec4(0.0, 0.0, 0.0, 0.0); + vec4 w0, w1; + w0 = texture(ravu_3x_lut2, vec2(0.05, coord_y)); + w1 = texture(ravu_3x_lut2, vec2(0.15, coord_y)); + res0 += luma0 * w0 + luma8 * w1.wzyx; + res1 += luma0 * w1 + luma8 * w0.wzyx; + w0 = texture(ravu_3x_lut2, vec2(0.25, coord_y)); + w1 = texture(ravu_3x_lut2, vec2(0.35, coord_y)); + res0 += luma1 * w0 + luma7 * w1.wzyx; + res1 += luma1 * w1 + luma7 * w0.wzyx; + w0 = texture(ravu_3x_lut2, vec2(0.45, coord_y)); + w1 = texture(ravu_3x_lut2, vec2(0.55, coord_y)); + res0 += luma2 * w0 + luma6 * w1.wzyx; + res1 += luma2 * w1 + luma6 * w0.wzyx; + w0 = texture(ravu_3x_lut2, vec2(0.65, coord_y)); + w1 = texture(ravu_3x_lut2, vec2(0.75, coord_y)); + res0 += luma3 * w0 + luma5 * w1.wzyx; + res1 += luma3 * w1 + luma5 * w0.wzyx; + w0 = texture(ravu_3x_lut2, vec2(0.85, coord_y)); + w1 = texture(ravu_3x_lut2, vec2(0.95, coord_y)); + res0 += luma4 * w0; + res1 += luma4 * w1; + res0 = clamp(res0, 0.0, 1.0); + res1 = clamp(res1, 0.0, 1.0); + imageStore(out_image, ivec2(gl_GlobalInvocationID) * 3 + ivec2(0, 0), res0[0]); + imageStore(out_image, ivec2(gl_GlobalInvocationID) * 3 + ivec2(0, 1), res0[1]); + imageStore(out_image, ivec2(gl_GlobalInvocationID) * 3 + ivec2(0, 2), res0[2]); + imageStore(out_image, ivec2(gl_GlobalInvocationID) * 3 + ivec2(1, 0), res0[3]); + imageStore(out_image, ivec2(gl_GlobalInvocationID) * 3 + ivec2(1, 1), luma4); + imageStore(out_image, ivec2(gl_GlobalInvocationID) * 3 + ivec2(1, 2), res1[0]); + imageStore(out_image, ivec2(gl_GlobalInvocationID) * 3 + ivec2(2, 0), res1[1]); + imageStore(out_image, ivec2(gl_GlobalInvocationID) * 3 + ivec2(2, 1), res1[2]); + imageStore(out_image, ivec2(gl_GlobalInvocationID) * 3 + ivec2(2, 2), res1[3]); +} diff --git a/src/Effects/RAVU/RAVU_3x_R2_RGB.hlsl b/src/Effects/RAVU/RAVU_3x_R2_RGB.hlsl new file mode 100644 index 000000000..94aed4dbf --- /dev/null +++ b/src/Effects/RAVU/RAVU_3x_R2_RGB.hlsl @@ -0,0 +1,180 @@ +// This file is generated by the scripts available at https://github.com/hauuau/magpie-prescalers +// Please don't edit this file directly. +// Generated by: ravu-3x.py --target rgb --weights-file weights\ravu-3x_weights-r2.py --float-format float16dx --use-magpie --overwrite +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +//!MAGPIE EFFECT +//!VERSION 4 + +//!TEXTURE +Texture2D INPUT; + +//!SAMPLER +//!FILTER POINT +SamplerState sam_INPUT; + +//!TEXTURE +//!WIDTH INPUT_WIDTH * 3 +//!HEIGHT INPUT_HEIGHT * 3 +Texture2D OUTPUT; + +//!TEXTURE +//!SOURCE ravu_3x_lut2_f16.dds +//!FORMAT R16G16B16A16_FLOAT +Texture2D ravu_3x_lut2; + +//!SAMPLER +//!FILTER LINEAR +SamplerState sam_ravu_3x_lut2; + +//!COMMON +#include "prescalers.hlsli" + +#define LAST_PASS 1 + +//!PASS 1 +//!DESC RAVU-3x (rgb, r2) +//!IN INPUT, ravu_3x_lut2 +//!OUT OUTPUT +//!BLOCK_SIZE 96, 24 +//!NUM_THREADS 32, 8 +static const vec3 color_primary = vec3(0.2126, 0.7152, 0.0722); +// HLSL doesn't have outerProduct +float4x3 outerProduct(float3 l, float4 r) { return mul(float4x1(r), float1x3(l)); } +shared vec3 inp[340]; +shared float inp_luma[340]; + +#define CURRENT_PASS 1 + +#define GET_SAMPLE(x) x +#define imageStore(out_image, pos, val) imageStoreOverride(pos, val) +void imageStoreOverride(uint2 pos, float4 value) { OUTPUT[pos] = value; } + +#define INPUT_tex(pos) GET_SAMPLE(vec4(texture(INPUT, pos))) +static const float2 INPUT_size = float2(GetInputSize()); +static const float2 INPUT_pt = float2(GetInputPt()); + +#define ravu_3x_lut2_tex(pos) (vec4(texture(ravu_3x_lut2, pos))) + +#define HOOKED_tex(pos) INPUT_tex(pos) +#define HOOKED_size INPUT_size +#define HOOKED_pt INPUT_pt + +void Pass1(uint2 blockStart, uint3 threadId) { + ivec2 group_base = ivec2(gl_WorkGroupID) * ivec2(gl_WorkGroupSize); + int local_pos = int(gl_LocalInvocationID.x) * 10 + int(gl_LocalInvocationID.y); + for (int id = int(gl_LocalInvocationIndex); id < 340; id += int(gl_WorkGroupSize.x * gl_WorkGroupSize.y)) { + uint x = (uint)id / 10, y = (uint)id % 10; + inp[id] = HOOKED_tex(HOOKED_pt * vec2(float(group_base.x + x) + (-0.5), float(group_base.y + y) + (-0.5))).xyz; + inp_luma[id] = dot(inp[id], color_primary); + } + barrier(); +#if CURRENT_PASS == LAST_PASS + uint2 destPos = blockStart + threadId.xy * 3; + uint2 outputSize = GetOutputSize(); + if (destPos.x >= outputSize.x || destPos.y >= outputSize.y) { + return; + } +#endif + float luma0 = inp_luma[local_pos + 0]; + float luma1 = inp_luma[local_pos + 1]; + float luma2 = inp_luma[local_pos + 2]; + float luma3 = inp_luma[local_pos + 10]; + float luma4 = inp_luma[local_pos + 11]; + float luma5 = inp_luma[local_pos + 12]; + float luma6 = inp_luma[local_pos + 20]; + float luma7 = inp_luma[local_pos + 21]; + float luma8 = inp_luma[local_pos + 22]; + vec3 abd = vec3(0.0, 0.0, 0.0); + float gx, gy; + gx = (luma3 - luma0); + gy = (luma1 - luma0); + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.1018680644198163; + gx = (luma4 - luma1); + gy = (luma2 - luma0) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.11543163961422666; + gx = (luma5 - luma2); + gy = (luma2 - luma1); + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.1018680644198163; + gx = (luma6 - luma0) / 2.0; + gy = (luma4 - luma3); + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.11543163961422666; + gx = (luma7 - luma1) / 2.0; + gy = (luma5 - luma3) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.13080118386382833; + gx = (luma8 - luma2) / 2.0; + gy = (luma5 - luma4); + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.11543163961422666; + gx = (luma6 - luma3); + gy = (luma7 - luma6); + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.1018680644198163; + gx = (luma7 - luma4); + gy = (luma8 - luma6) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.11543163961422666; + gx = (luma8 - luma5); + gy = (luma8 - luma7); + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.1018680644198163; + float a = abd.x, b = abd.y, d = abd.z; + float T = a + d, D = a * d - b * b; + float delta = sqrt(max(T * T / 4.0 - D, 0.0)); + float L1 = T / 2.0 + delta, L2 = T / 2.0 - delta; + float sqrtL1 = sqrt(L1), sqrtL2 = sqrt(L2); + float theta = mix(mod(atan(L1 - a, b) + 3.141592653589793, 3.141592653589793), 0.0, abs(b) < 1.192092896e-7); + float lambda = sqrtL1; + float mu = mix((sqrtL1 - sqrtL2) / (sqrtL1 + sqrtL2), 0.0, sqrtL1 + sqrtL2 < 1.192092896e-7); + float angle = floor(theta * 24.0 / 3.141592653589793); + float strength = mix(mix(0.0, 1.0, lambda >= 0.005), 2.0, lambda >= 0.02); + float coherence = mix(mix(0.0, 1.0, mu >= 0.25), 2.0, mu >= 0.5); + float coord_y = ((angle * 3.0 + strength) * 3.0 + coherence + 0.5) / 216.0; + mat4x3 res0 = 0.0, res1 = 0.0; + vec4 w0, w1; + w0 = texture(ravu_3x_lut2, vec2(0.05, coord_y)); + w1 = texture(ravu_3x_lut2, vec2(0.15, coord_y)); + res0 += outerProduct(inp[local_pos + 0], w0) + outerProduct(inp[local_pos + 22], w1.wzyx); + res1 += outerProduct(inp[local_pos + 0], w1) + outerProduct(inp[local_pos + 22], w0.wzyx); + w0 = texture(ravu_3x_lut2, vec2(0.25, coord_y)); + w1 = texture(ravu_3x_lut2, vec2(0.35, coord_y)); + res0 += outerProduct(inp[local_pos + 1], w0) + outerProduct(inp[local_pos + 21], w1.wzyx); + res1 += outerProduct(inp[local_pos + 1], w1) + outerProduct(inp[local_pos + 21], w0.wzyx); + w0 = texture(ravu_3x_lut2, vec2(0.45, coord_y)); + w1 = texture(ravu_3x_lut2, vec2(0.55, coord_y)); + res0 += outerProduct(inp[local_pos + 2], w0) + outerProduct(inp[local_pos + 20], w1.wzyx); + res1 += outerProduct(inp[local_pos + 2], w1) + outerProduct(inp[local_pos + 20], w0.wzyx); + w0 = texture(ravu_3x_lut2, vec2(0.65, coord_y)); + w1 = texture(ravu_3x_lut2, vec2(0.75, coord_y)); + res0 += outerProduct(inp[local_pos + 10], w0) + outerProduct(inp[local_pos + 12], w1.wzyx); + res1 += outerProduct(inp[local_pos + 10], w1) + outerProduct(inp[local_pos + 12], w0.wzyx); + w0 = texture(ravu_3x_lut2, vec2(0.85, coord_y)); + w1 = texture(ravu_3x_lut2, vec2(0.95, coord_y)); + res0 += outerProduct(inp[local_pos + 11], w0); + res1 += outerProduct(inp[local_pos + 11], w1); + res0[0] = clamp(res0[0], 0.0, 1.0); + res0[1] = clamp(res0[1], 0.0, 1.0); + res0[2] = clamp(res0[2], 0.0, 1.0); + res0[3] = clamp(res0[3], 0.0, 1.0); + res1[0] = clamp(res1[0], 0.0, 1.0); + res1[1] = clamp(res1[1], 0.0, 1.0); + res1[2] = clamp(res1[2], 0.0, 1.0); + res1[3] = clamp(res1[3], 0.0, 1.0); + imageStore(out_image, ivec2(gl_GlobalInvocationID) * 3 + ivec2(0, 0), vec4(res0[0], 1.0)); + imageStore(out_image, ivec2(gl_GlobalInvocationID) * 3 + ivec2(0, 1), vec4(res0[1], 1.0)); + imageStore(out_image, ivec2(gl_GlobalInvocationID) * 3 + ivec2(0, 2), vec4(res0[2], 1.0)); + imageStore(out_image, ivec2(gl_GlobalInvocationID) * 3 + ivec2(1, 0), vec4(res0[3], 1.0)); + imageStore(out_image, ivec2(gl_GlobalInvocationID) * 3 + ivec2(1, 1), vec4(inp[local_pos + 11], 1.0)); + imageStore(out_image, ivec2(gl_GlobalInvocationID) * 3 + ivec2(1, 2), vec4(res1[0], 1.0)); + imageStore(out_image, ivec2(gl_GlobalInvocationID) * 3 + ivec2(2, 0), vec4(res1[1], 1.0)); + imageStore(out_image, ivec2(gl_GlobalInvocationID) * 3 + ivec2(2, 1), vec4(res1[2], 1.0)); + imageStore(out_image, ivec2(gl_GlobalInvocationID) * 3 + ivec2(2, 2), vec4(res1[3], 1.0)); +} diff --git a/src/Effects/RAVU/RAVU_3x_R3.hlsl b/src/Effects/RAVU/RAVU_3x_R3.hlsl new file mode 100644 index 000000000..e78eb9260 --- /dev/null +++ b/src/Effects/RAVU/RAVU_3x_R3.hlsl @@ -0,0 +1,224 @@ +// This file is generated by the scripts available at https://github.com/hauuau/magpie-prescalers +// Please don't edit this file directly. +// Generated by: ravu-3x.py --target luma --weights-file weights\ravu-3x_weights-r3.py --float-format float16dx --use-magpie --overwrite +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +//!MAGPIE EFFECT +//!VERSION 4 + +//!TEXTURE +Texture2D INPUT; + +//!SAMPLER +//!FILTER POINT +SamplerState sam_INPUT; + +//!TEXTURE +//!WIDTH INPUT_WIDTH * 3 +//!HEIGHT INPUT_HEIGHT * 3 +Texture2D OUTPUT; + +//!SAMPLER +//!FILTER LINEAR +SamplerState sam_INPUT_LINEAR; + +//!TEXTURE +//!SOURCE ravu_3x_lut3_f16.dds +//!FORMAT R16G16B16A16_FLOAT +Texture2D ravu_3x_lut3; + +//!SAMPLER +//!FILTER LINEAR +SamplerState sam_ravu_3x_lut3; + +//!COMMON +#include "prescalers.hlsli" + +#define LAST_PASS 1 + +//!PASS 1 +//!DESC RAVU-3x (luma, r3) +//!IN INPUT, ravu_3x_lut3 +//!OUT OUTPUT +//!BLOCK_SIZE 96, 24 +//!NUM_THREADS 32, 8 +shared float inp[432]; + +#define CURRENT_PASS 1 + +#define GET_SAMPLE(x) dot(x.rgb, rgb2y) +#define imageStore(out_image, pos, val) imageStoreOverride(pos, val.x) +void imageStoreOverride(uint2 pos, float value) { + float2 UV = mul(rgb2uv, INPUT.SampleLevel(sam_INPUT_LINEAR, HOOKED_map(pos), 0).rgb); + OUTPUT[pos] = float4(mul(yuv2rgb, float3(value.x, UV)), 1.0); +} + +#define INPUT_tex(pos) GET_SAMPLE(vec4(texture(INPUT, pos))) +static const float2 INPUT_size = float2(GetInputSize()); +static const float2 INPUT_pt = float2(GetInputPt()); + +#define ravu_3x_lut3_tex(pos) (vec4(texture(ravu_3x_lut3, pos))) + +#define HOOKED_tex(pos) INPUT_tex(pos) +#define HOOKED_size INPUT_size +#define HOOKED_pt INPUT_pt + +void Pass1(uint2 blockStart, uint3 threadId) { + ivec2 group_base = ivec2(gl_WorkGroupID) * ivec2(gl_WorkGroupSize); + int local_pos = int(gl_LocalInvocationID.x) * 12 + int(gl_LocalInvocationID.y); + for (int id = int(gl_LocalInvocationIndex); id < 432; id += int(gl_WorkGroupSize.x * gl_WorkGroupSize.y)) { + uint x = (uint)id / 12, y = (uint)id % 12; + inp[id] = HOOKED_tex(HOOKED_pt * vec2(float(group_base.x + x) + (-1.5), float(group_base.y + y) + (-1.5))).x; + } + barrier(); +#if CURRENT_PASS == LAST_PASS + uint2 destPos = blockStart + threadId.xy * 3; + uint2 outputSize = GetOutputSize(); + if (destPos.x >= outputSize.x || destPos.y >= outputSize.y) { + return; + } +#endif + float luma0 = inp[local_pos + 0]; + float luma1 = inp[local_pos + 1]; + float luma2 = inp[local_pos + 2]; + float luma3 = inp[local_pos + 3]; + float luma4 = inp[local_pos + 4]; + float luma5 = inp[local_pos + 12]; + float luma6 = inp[local_pos + 13]; + float luma7 = inp[local_pos + 14]; + float luma8 = inp[local_pos + 15]; + float luma9 = inp[local_pos + 16]; + float luma10 = inp[local_pos + 24]; + float luma11 = inp[local_pos + 25]; + float luma12 = inp[local_pos + 26]; + float luma13 = inp[local_pos + 27]; + float luma14 = inp[local_pos + 28]; + float luma15 = inp[local_pos + 36]; + float luma16 = inp[local_pos + 37]; + float luma17 = inp[local_pos + 38]; + float luma18 = inp[local_pos + 39]; + float luma19 = inp[local_pos + 40]; + float luma20 = inp[local_pos + 48]; + float luma21 = inp[local_pos + 49]; + float luma22 = inp[local_pos + 50]; + float luma23 = inp[local_pos + 51]; + float luma24 = inp[local_pos + 52]; + vec3 abd = vec3(0.0, 0.0, 0.0); + float gx, gy; + gx = (luma11 - luma1) / 2.0; + gy = (luma7 - luma5) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.1018680644198163; + gx = (luma12 - luma2) / 2.0; + gy = (luma8 - luma6) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.11543163961422666; + gx = (luma13 - luma3) / 2.0; + gy = (luma9 - luma7) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.1018680644198163; + gx = (luma16 - luma6) / 2.0; + gy = (luma12 - luma10) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.11543163961422666; + gx = (luma17 - luma7) / 2.0; + gy = (luma13 - luma11) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.13080118386382833; + gx = (luma18 - luma8) / 2.0; + gy = (luma14 - luma12) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.11543163961422666; + gx = (luma21 - luma11) / 2.0; + gy = (luma17 - luma15) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.1018680644198163; + gx = (luma22 - luma12) / 2.0; + gy = (luma18 - luma16) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.11543163961422666; + gx = (luma23 - luma13) / 2.0; + gy = (luma19 - luma17) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.1018680644198163; + float a = abd.x, b = abd.y, d = abd.z; + float T = a + d, D = a * d - b * b; + float delta = sqrt(max(T * T / 4.0 - D, 0.0)); + float L1 = T / 2.0 + delta, L2 = T / 2.0 - delta; + float sqrtL1 = sqrt(L1), sqrtL2 = sqrt(L2); + float theta = mix(mod(atan(L1 - a, b) + 3.141592653589793, 3.141592653589793), 0.0, abs(b) < 1.192092896e-7); + float lambda = sqrtL1; + float mu = mix((sqrtL1 - sqrtL2) / (sqrtL1 + sqrtL2), 0.0, sqrtL1 + sqrtL2 < 1.192092896e-7); + float angle = floor(theta * 24.0 / 3.141592653589793); + float strength = mix(mix(0.0, 1.0, lambda >= 0.005), 2.0, lambda >= 0.02); + float coherence = mix(mix(0.0, 1.0, mu >= 0.25), 2.0, mu >= 0.5); + float coord_y = ((angle * 3.0 + strength) * 3.0 + coherence + 0.5) / 216.0; + vec4 res0 = vec4(0.0, 0.0, 0.0, 0.0), res1 = vec4(0.0, 0.0, 0.0, 0.0); + vec4 w0, w1; + w0 = texture(ravu_3x_lut3, vec2(0.019230769230769232, coord_y)); + w1 = texture(ravu_3x_lut3, vec2(0.057692307692307696, coord_y)); + res0 += luma0 * w0 + luma24 * w1.wzyx; + res1 += luma0 * w1 + luma24 * w0.wzyx; + w0 = texture(ravu_3x_lut3, vec2(0.09615384615384616, coord_y)); + w1 = texture(ravu_3x_lut3, vec2(0.1346153846153846, coord_y)); + res0 += luma1 * w0 + luma23 * w1.wzyx; + res1 += luma1 * w1 + luma23 * w0.wzyx; + w0 = texture(ravu_3x_lut3, vec2(0.17307692307692307, coord_y)); + w1 = texture(ravu_3x_lut3, vec2(0.21153846153846154, coord_y)); + res0 += luma2 * w0 + luma22 * w1.wzyx; + res1 += luma2 * w1 + luma22 * w0.wzyx; + w0 = texture(ravu_3x_lut3, vec2(0.25, coord_y)); + w1 = texture(ravu_3x_lut3, vec2(0.28846153846153844, coord_y)); + res0 += luma3 * w0 + luma21 * w1.wzyx; + res1 += luma3 * w1 + luma21 * w0.wzyx; + w0 = texture(ravu_3x_lut3, vec2(0.3269230769230769, coord_y)); + w1 = texture(ravu_3x_lut3, vec2(0.36538461538461536, coord_y)); + res0 += luma4 * w0 + luma20 * w1.wzyx; + res1 += luma4 * w1 + luma20 * w0.wzyx; + w0 = texture(ravu_3x_lut3, vec2(0.40384615384615385, coord_y)); + w1 = texture(ravu_3x_lut3, vec2(0.4423076923076923, coord_y)); + res0 += luma5 * w0 + luma19 * w1.wzyx; + res1 += luma5 * w1 + luma19 * w0.wzyx; + w0 = texture(ravu_3x_lut3, vec2(0.4807692307692308, coord_y)); + w1 = texture(ravu_3x_lut3, vec2(0.5192307692307693, coord_y)); + res0 += luma6 * w0 + luma18 * w1.wzyx; + res1 += luma6 * w1 + luma18 * w0.wzyx; + w0 = texture(ravu_3x_lut3, vec2(0.5576923076923077, coord_y)); + w1 = texture(ravu_3x_lut3, vec2(0.5961538461538461, coord_y)); + res0 += luma7 * w0 + luma17 * w1.wzyx; + res1 += luma7 * w1 + luma17 * w0.wzyx; + w0 = texture(ravu_3x_lut3, vec2(0.6346153846153846, coord_y)); + w1 = texture(ravu_3x_lut3, vec2(0.6730769230769231, coord_y)); + res0 += luma8 * w0 + luma16 * w1.wzyx; + res1 += luma8 * w1 + luma16 * w0.wzyx; + w0 = texture(ravu_3x_lut3, vec2(0.7115384615384616, coord_y)); + w1 = texture(ravu_3x_lut3, vec2(0.75, coord_y)); + res0 += luma9 * w0 + luma15 * w1.wzyx; + res1 += luma9 * w1 + luma15 * w0.wzyx; + w0 = texture(ravu_3x_lut3, vec2(0.7884615384615384, coord_y)); + w1 = texture(ravu_3x_lut3, vec2(0.8269230769230769, coord_y)); + res0 += luma10 * w0 + luma14 * w1.wzyx; + res1 += luma10 * w1 + luma14 * w0.wzyx; + w0 = texture(ravu_3x_lut3, vec2(0.8653846153846154, coord_y)); + w1 = texture(ravu_3x_lut3, vec2(0.9038461538461539, coord_y)); + res0 += luma11 * w0 + luma13 * w1.wzyx; + res1 += luma11 * w1 + luma13 * w0.wzyx; + w0 = texture(ravu_3x_lut3, vec2(0.9423076923076923, coord_y)); + w1 = texture(ravu_3x_lut3, vec2(0.9807692307692307, coord_y)); + res0 += luma12 * w0; + res1 += luma12 * w1; + res0 = clamp(res0, 0.0, 1.0); + res1 = clamp(res1, 0.0, 1.0); + imageStore(out_image, ivec2(gl_GlobalInvocationID) * 3 + ivec2(0, 0), res0[0]); + imageStore(out_image, ivec2(gl_GlobalInvocationID) * 3 + ivec2(0, 1), res0[1]); + imageStore(out_image, ivec2(gl_GlobalInvocationID) * 3 + ivec2(0, 2), res0[2]); + imageStore(out_image, ivec2(gl_GlobalInvocationID) * 3 + ivec2(1, 0), res0[3]); + imageStore(out_image, ivec2(gl_GlobalInvocationID) * 3 + ivec2(1, 1), luma12); + imageStore(out_image, ivec2(gl_GlobalInvocationID) * 3 + ivec2(1, 2), res1[0]); + imageStore(out_image, ivec2(gl_GlobalInvocationID) * 3 + ivec2(2, 0), res1[1]); + imageStore(out_image, ivec2(gl_GlobalInvocationID) * 3 + ivec2(2, 1), res1[2]); + imageStore(out_image, ivec2(gl_GlobalInvocationID) * 3 + ivec2(2, 2), res1[3]); +} diff --git a/src/Effects/RAVU/RAVU_3x_R3_RGB.hlsl b/src/Effects/RAVU/RAVU_3x_R3_RGB.hlsl new file mode 100644 index 000000000..9b2c05257 --- /dev/null +++ b/src/Effects/RAVU/RAVU_3x_R3_RGB.hlsl @@ -0,0 +1,224 @@ +// This file is generated by the scripts available at https://github.com/hauuau/magpie-prescalers +// Please don't edit this file directly. +// Generated by: ravu-3x.py --target rgb --weights-file weights\ravu-3x_weights-r3.py --float-format float16dx --use-magpie --overwrite +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +//!MAGPIE EFFECT +//!VERSION 4 + +//!TEXTURE +Texture2D INPUT; + +//!SAMPLER +//!FILTER POINT +SamplerState sam_INPUT; + +//!TEXTURE +//!WIDTH INPUT_WIDTH * 3 +//!HEIGHT INPUT_HEIGHT * 3 +Texture2D OUTPUT; + +//!TEXTURE +//!SOURCE ravu_3x_lut3_f16.dds +//!FORMAT R16G16B16A16_FLOAT +Texture2D ravu_3x_lut3; + +//!SAMPLER +//!FILTER LINEAR +SamplerState sam_ravu_3x_lut3; + +//!COMMON +#include "prescalers.hlsli" + +#define LAST_PASS 1 + +//!PASS 1 +//!DESC RAVU-3x (rgb, r3) +//!IN INPUT, ravu_3x_lut3 +//!OUT OUTPUT +//!BLOCK_SIZE 96, 24 +//!NUM_THREADS 32, 8 +static const vec3 color_primary = vec3(0.2126, 0.7152, 0.0722); +// HLSL doesn't have outerProduct +float4x3 outerProduct(float3 l, float4 r) { return mul(float4x1(r), float1x3(l)); } +shared vec3 inp[432]; +shared float inp_luma[432]; + +#define CURRENT_PASS 1 + +#define GET_SAMPLE(x) x +#define imageStore(out_image, pos, val) imageStoreOverride(pos, val) +void imageStoreOverride(uint2 pos, float4 value) { OUTPUT[pos] = value; } + +#define INPUT_tex(pos) GET_SAMPLE(vec4(texture(INPUT, pos))) +static const float2 INPUT_size = float2(GetInputSize()); +static const float2 INPUT_pt = float2(GetInputPt()); + +#define ravu_3x_lut3_tex(pos) (vec4(texture(ravu_3x_lut3, pos))) + +#define HOOKED_tex(pos) INPUT_tex(pos) +#define HOOKED_size INPUT_size +#define HOOKED_pt INPUT_pt + +void Pass1(uint2 blockStart, uint3 threadId) { + ivec2 group_base = ivec2(gl_WorkGroupID) * ivec2(gl_WorkGroupSize); + int local_pos = int(gl_LocalInvocationID.x) * 12 + int(gl_LocalInvocationID.y); + for (int id = int(gl_LocalInvocationIndex); id < 432; id += int(gl_WorkGroupSize.x * gl_WorkGroupSize.y)) { + uint x = (uint)id / 12, y = (uint)id % 12; + inp[id] = HOOKED_tex(HOOKED_pt * vec2(float(group_base.x + x) + (-1.5), float(group_base.y + y) + (-1.5))).xyz; + inp_luma[id] = dot(inp[id], color_primary); + } + barrier(); +#if CURRENT_PASS == LAST_PASS + uint2 destPos = blockStart + threadId.xy * 3; + uint2 outputSize = GetOutputSize(); + if (destPos.x >= outputSize.x || destPos.y >= outputSize.y) { + return; + } +#endif + float luma1 = inp_luma[local_pos + 1]; + float luma2 = inp_luma[local_pos + 2]; + float luma3 = inp_luma[local_pos + 3]; + float luma5 = inp_luma[local_pos + 12]; + float luma6 = inp_luma[local_pos + 13]; + float luma7 = inp_luma[local_pos + 14]; + float luma8 = inp_luma[local_pos + 15]; + float luma9 = inp_luma[local_pos + 16]; + float luma10 = inp_luma[local_pos + 24]; + float luma11 = inp_luma[local_pos + 25]; + float luma12 = inp_luma[local_pos + 26]; + float luma13 = inp_luma[local_pos + 27]; + float luma14 = inp_luma[local_pos + 28]; + float luma15 = inp_luma[local_pos + 36]; + float luma16 = inp_luma[local_pos + 37]; + float luma17 = inp_luma[local_pos + 38]; + float luma18 = inp_luma[local_pos + 39]; + float luma19 = inp_luma[local_pos + 40]; + float luma21 = inp_luma[local_pos + 49]; + float luma22 = inp_luma[local_pos + 50]; + float luma23 = inp_luma[local_pos + 51]; + vec3 abd = vec3(0.0, 0.0, 0.0); + float gx, gy; + gx = (luma11 - luma1) / 2.0; + gy = (luma7 - luma5) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.1018680644198163; + gx = (luma12 - luma2) / 2.0; + gy = (luma8 - luma6) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.11543163961422666; + gx = (luma13 - luma3) / 2.0; + gy = (luma9 - luma7) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.1018680644198163; + gx = (luma16 - luma6) / 2.0; + gy = (luma12 - luma10) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.11543163961422666; + gx = (luma17 - luma7) / 2.0; + gy = (luma13 - luma11) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.13080118386382833; + gx = (luma18 - luma8) / 2.0; + gy = (luma14 - luma12) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.11543163961422666; + gx = (luma21 - luma11) / 2.0; + gy = (luma17 - luma15) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.1018680644198163; + gx = (luma22 - luma12) / 2.0; + gy = (luma18 - luma16) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.11543163961422666; + gx = (luma23 - luma13) / 2.0; + gy = (luma19 - luma17) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.1018680644198163; + float a = abd.x, b = abd.y, d = abd.z; + float T = a + d, D = a * d - b * b; + float delta = sqrt(max(T * T / 4.0 - D, 0.0)); + float L1 = T / 2.0 + delta, L2 = T / 2.0 - delta; + float sqrtL1 = sqrt(L1), sqrtL2 = sqrt(L2); + float theta = mix(mod(atan(L1 - a, b) + 3.141592653589793, 3.141592653589793), 0.0, abs(b) < 1.192092896e-7); + float lambda = sqrtL1; + float mu = mix((sqrtL1 - sqrtL2) / (sqrtL1 + sqrtL2), 0.0, sqrtL1 + sqrtL2 < 1.192092896e-7); + float angle = floor(theta * 24.0 / 3.141592653589793); + float strength = mix(mix(0.0, 1.0, lambda >= 0.005), 2.0, lambda >= 0.02); + float coherence = mix(mix(0.0, 1.0, mu >= 0.25), 2.0, mu >= 0.5); + float coord_y = ((angle * 3.0 + strength) * 3.0 + coherence + 0.5) / 216.0; + mat4x3 res0 = 0.0, res1 = 0.0; + vec4 w0, w1; + w0 = texture(ravu_3x_lut3, vec2(0.019230769230769232, coord_y)); + w1 = texture(ravu_3x_lut3, vec2(0.057692307692307696, coord_y)); + res0 += outerProduct(inp[local_pos + 0], w0) + outerProduct(inp[local_pos + 52], w1.wzyx); + res1 += outerProduct(inp[local_pos + 0], w1) + outerProduct(inp[local_pos + 52], w0.wzyx); + w0 = texture(ravu_3x_lut3, vec2(0.09615384615384616, coord_y)); + w1 = texture(ravu_3x_lut3, vec2(0.1346153846153846, coord_y)); + res0 += outerProduct(inp[local_pos + 1], w0) + outerProduct(inp[local_pos + 51], w1.wzyx); + res1 += outerProduct(inp[local_pos + 1], w1) + outerProduct(inp[local_pos + 51], w0.wzyx); + w0 = texture(ravu_3x_lut3, vec2(0.17307692307692307, coord_y)); + w1 = texture(ravu_3x_lut3, vec2(0.21153846153846154, coord_y)); + res0 += outerProduct(inp[local_pos + 2], w0) + outerProduct(inp[local_pos + 50], w1.wzyx); + res1 += outerProduct(inp[local_pos + 2], w1) + outerProduct(inp[local_pos + 50], w0.wzyx); + w0 = texture(ravu_3x_lut3, vec2(0.25, coord_y)); + w1 = texture(ravu_3x_lut3, vec2(0.28846153846153844, coord_y)); + res0 += outerProduct(inp[local_pos + 3], w0) + outerProduct(inp[local_pos + 49], w1.wzyx); + res1 += outerProduct(inp[local_pos + 3], w1) + outerProduct(inp[local_pos + 49], w0.wzyx); + w0 = texture(ravu_3x_lut3, vec2(0.3269230769230769, coord_y)); + w1 = texture(ravu_3x_lut3, vec2(0.36538461538461536, coord_y)); + res0 += outerProduct(inp[local_pos + 4], w0) + outerProduct(inp[local_pos + 48], w1.wzyx); + res1 += outerProduct(inp[local_pos + 4], w1) + outerProduct(inp[local_pos + 48], w0.wzyx); + w0 = texture(ravu_3x_lut3, vec2(0.40384615384615385, coord_y)); + w1 = texture(ravu_3x_lut3, vec2(0.4423076923076923, coord_y)); + res0 += outerProduct(inp[local_pos + 12], w0) + outerProduct(inp[local_pos + 40], w1.wzyx); + res1 += outerProduct(inp[local_pos + 12], w1) + outerProduct(inp[local_pos + 40], w0.wzyx); + w0 = texture(ravu_3x_lut3, vec2(0.4807692307692308, coord_y)); + w1 = texture(ravu_3x_lut3, vec2(0.5192307692307693, coord_y)); + res0 += outerProduct(inp[local_pos + 13], w0) + outerProduct(inp[local_pos + 39], w1.wzyx); + res1 += outerProduct(inp[local_pos + 13], w1) + outerProduct(inp[local_pos + 39], w0.wzyx); + w0 = texture(ravu_3x_lut3, vec2(0.5576923076923077, coord_y)); + w1 = texture(ravu_3x_lut3, vec2(0.5961538461538461, coord_y)); + res0 += outerProduct(inp[local_pos + 14], w0) + outerProduct(inp[local_pos + 38], w1.wzyx); + res1 += outerProduct(inp[local_pos + 14], w1) + outerProduct(inp[local_pos + 38], w0.wzyx); + w0 = texture(ravu_3x_lut3, vec2(0.6346153846153846, coord_y)); + w1 = texture(ravu_3x_lut3, vec2(0.6730769230769231, coord_y)); + res0 += outerProduct(inp[local_pos + 15], w0) + outerProduct(inp[local_pos + 37], w1.wzyx); + res1 += outerProduct(inp[local_pos + 15], w1) + outerProduct(inp[local_pos + 37], w0.wzyx); + w0 = texture(ravu_3x_lut3, vec2(0.7115384615384616, coord_y)); + w1 = texture(ravu_3x_lut3, vec2(0.75, coord_y)); + res0 += outerProduct(inp[local_pos + 16], w0) + outerProduct(inp[local_pos + 36], w1.wzyx); + res1 += outerProduct(inp[local_pos + 16], w1) + outerProduct(inp[local_pos + 36], w0.wzyx); + w0 = texture(ravu_3x_lut3, vec2(0.7884615384615384, coord_y)); + w1 = texture(ravu_3x_lut3, vec2(0.8269230769230769, coord_y)); + res0 += outerProduct(inp[local_pos + 24], w0) + outerProduct(inp[local_pos + 28], w1.wzyx); + res1 += outerProduct(inp[local_pos + 24], w1) + outerProduct(inp[local_pos + 28], w0.wzyx); + w0 = texture(ravu_3x_lut3, vec2(0.8653846153846154, coord_y)); + w1 = texture(ravu_3x_lut3, vec2(0.9038461538461539, coord_y)); + res0 += outerProduct(inp[local_pos + 25], w0) + outerProduct(inp[local_pos + 27], w1.wzyx); + res1 += outerProduct(inp[local_pos + 25], w1) + outerProduct(inp[local_pos + 27], w0.wzyx); + w0 = texture(ravu_3x_lut3, vec2(0.9423076923076923, coord_y)); + w1 = texture(ravu_3x_lut3, vec2(0.9807692307692307, coord_y)); + res0 += outerProduct(inp[local_pos + 26], w0); + res1 += outerProduct(inp[local_pos + 26], w1); + res0[0] = clamp(res0[0], 0.0, 1.0); + res0[1] = clamp(res0[1], 0.0, 1.0); + res0[2] = clamp(res0[2], 0.0, 1.0); + res0[3] = clamp(res0[3], 0.0, 1.0); + res1[0] = clamp(res1[0], 0.0, 1.0); + res1[1] = clamp(res1[1], 0.0, 1.0); + res1[2] = clamp(res1[2], 0.0, 1.0); + res1[3] = clamp(res1[3], 0.0, 1.0); + imageStore(out_image, ivec2(gl_GlobalInvocationID) * 3 + ivec2(0, 0), vec4(res0[0], 1.0)); + imageStore(out_image, ivec2(gl_GlobalInvocationID) * 3 + ivec2(0, 1), vec4(res0[1], 1.0)); + imageStore(out_image, ivec2(gl_GlobalInvocationID) * 3 + ivec2(0, 2), vec4(res0[2], 1.0)); + imageStore(out_image, ivec2(gl_GlobalInvocationID) * 3 + ivec2(1, 0), vec4(res0[3], 1.0)); + imageStore(out_image, ivec2(gl_GlobalInvocationID) * 3 + ivec2(1, 1), vec4(inp[local_pos + 26], 1.0)); + imageStore(out_image, ivec2(gl_GlobalInvocationID) * 3 + ivec2(1, 2), vec4(res1[0], 1.0)); + imageStore(out_image, ivec2(gl_GlobalInvocationID) * 3 + ivec2(2, 0), vec4(res1[1], 1.0)); + imageStore(out_image, ivec2(gl_GlobalInvocationID) * 3 + ivec2(2, 1), vec4(res1[2], 1.0)); + imageStore(out_image, ivec2(gl_GlobalInvocationID) * 3 + ivec2(2, 2), vec4(res1[3], 1.0)); +} diff --git a/src/Effects/RAVU/RAVU_3x_R4.hlsl b/src/Effects/RAVU/RAVU_3x_R4.hlsl new file mode 100644 index 000000000..97b1e223b --- /dev/null +++ b/src/Effects/RAVU/RAVU_3x_R4.hlsl @@ -0,0 +1,344 @@ +// This file is generated by the scripts available at https://github.com/hauuau/magpie-prescalers +// Please don't edit this file directly. +// Generated by: ravu-3x.py --target luma --weights-file weights\ravu-3x_weights-r4.py --float-format float16dx --use-magpie --overwrite +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +//!MAGPIE EFFECT +//!VERSION 4 + +//!TEXTURE +Texture2D INPUT; + +//!SAMPLER +//!FILTER POINT +SamplerState sam_INPUT; + +//!TEXTURE +//!WIDTH INPUT_WIDTH * 3 +//!HEIGHT INPUT_HEIGHT * 3 +Texture2D OUTPUT; + +//!SAMPLER +//!FILTER LINEAR +SamplerState sam_INPUT_LINEAR; + +//!TEXTURE +//!SOURCE ravu_3x_lut4_f16.dds +//!FORMAT R16G16B16A16_FLOAT +Texture2D ravu_3x_lut4; + +//!SAMPLER +//!FILTER LINEAR +SamplerState sam_ravu_3x_lut4; + +//!COMMON +#include "prescalers.hlsli" + +#define LAST_PASS 1 + +//!PASS 1 +//!DESC RAVU-3x (luma, r4) +//!IN INPUT, ravu_3x_lut4 +//!OUT OUTPUT +//!BLOCK_SIZE 96, 24 +//!NUM_THREADS 32, 8 +shared float inp[532]; + +#define CURRENT_PASS 1 + +#define GET_SAMPLE(x) dot(x.rgb, rgb2y) +#define imageStore(out_image, pos, val) imageStoreOverride(pos, val.x) +void imageStoreOverride(uint2 pos, float value) { + float2 UV = mul(rgb2uv, INPUT.SampleLevel(sam_INPUT_LINEAR, HOOKED_map(pos), 0).rgb); + OUTPUT[pos] = float4(mul(yuv2rgb, float3(value.x, UV)), 1.0); +} + +#define INPUT_tex(pos) GET_SAMPLE(vec4(texture(INPUT, pos))) +static const float2 INPUT_size = float2(GetInputSize()); +static const float2 INPUT_pt = float2(GetInputPt()); + +#define ravu_3x_lut4_tex(pos) (vec4(texture(ravu_3x_lut4, pos))) + +#define HOOKED_tex(pos) INPUT_tex(pos) +#define HOOKED_size INPUT_size +#define HOOKED_pt INPUT_pt + +void Pass1(uint2 blockStart, uint3 threadId) { + ivec2 group_base = ivec2(gl_WorkGroupID) * ivec2(gl_WorkGroupSize); + int local_pos = int(gl_LocalInvocationID.x) * 14 + int(gl_LocalInvocationID.y); + for (int id = int(gl_LocalInvocationIndex); id < 532; id += int(gl_WorkGroupSize.x * gl_WorkGroupSize.y)) { + uint x = (uint)id / 14, y = (uint)id % 14; + inp[id] = HOOKED_tex(HOOKED_pt * vec2(float(group_base.x + x) + (-2.5), float(group_base.y + y) + (-2.5))).x; + } + barrier(); +#if CURRENT_PASS == LAST_PASS + uint2 destPos = blockStart + threadId.xy * 3; + uint2 outputSize = GetOutputSize(); + if (destPos.x >= outputSize.x || destPos.y >= outputSize.y) { + return; + } +#endif + float luma0 = inp[local_pos + 0]; + float luma1 = inp[local_pos + 1]; + float luma2 = inp[local_pos + 2]; + float luma3 = inp[local_pos + 3]; + float luma4 = inp[local_pos + 4]; + float luma5 = inp[local_pos + 5]; + float luma6 = inp[local_pos + 6]; + float luma7 = inp[local_pos + 14]; + float luma8 = inp[local_pos + 15]; + float luma9 = inp[local_pos + 16]; + float luma10 = inp[local_pos + 17]; + float luma11 = inp[local_pos + 18]; + float luma12 = inp[local_pos + 19]; + float luma13 = inp[local_pos + 20]; + float luma14 = inp[local_pos + 28]; + float luma15 = inp[local_pos + 29]; + float luma16 = inp[local_pos + 30]; + float luma17 = inp[local_pos + 31]; + float luma18 = inp[local_pos + 32]; + float luma19 = inp[local_pos + 33]; + float luma20 = inp[local_pos + 34]; + float luma21 = inp[local_pos + 42]; + float luma22 = inp[local_pos + 43]; + float luma23 = inp[local_pos + 44]; + float luma24 = inp[local_pos + 45]; + float luma25 = inp[local_pos + 46]; + float luma26 = inp[local_pos + 47]; + float luma27 = inp[local_pos + 48]; + float luma28 = inp[local_pos + 56]; + float luma29 = inp[local_pos + 57]; + float luma30 = inp[local_pos + 58]; + float luma31 = inp[local_pos + 59]; + float luma32 = inp[local_pos + 60]; + float luma33 = inp[local_pos + 61]; + float luma34 = inp[local_pos + 62]; + float luma35 = inp[local_pos + 70]; + float luma36 = inp[local_pos + 71]; + float luma37 = inp[local_pos + 72]; + float luma38 = inp[local_pos + 73]; + float luma39 = inp[local_pos + 74]; + float luma40 = inp[local_pos + 75]; + float luma41 = inp[local_pos + 76]; + float luma42 = inp[local_pos + 84]; + float luma43 = inp[local_pos + 85]; + float luma44 = inp[local_pos + 86]; + float luma45 = inp[local_pos + 87]; + float luma46 = inp[local_pos + 88]; + float luma47 = inp[local_pos + 89]; + float luma48 = inp[local_pos + 90]; + vec3 abd = vec3(0.0, 0.0, 0.0); + float gx, gy; + gx = (luma15 - luma1) / 2.0; + gy = (luma9 - luma7) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.02324683987829437; + gx = (luma16 - luma2) / 2.0; + gy = (luma10 - luma8) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.033823952439922346; + gx = (luma17 - luma3) / 2.0; + gy = (luma11 - luma9) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.038327559383903906; + gx = (luma18 - luma4) / 2.0; + gy = (luma12 - luma10) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.033823952439922346; + gx = (luma19 - luma5) / 2.0; + gy = (luma13 - luma11) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.02324683987829437; + gx = (luma22 - luma8) / 2.0; + gy = (luma16 - luma14) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.033823952439922346; + gx = (luma23 - luma9) / 2.0; + gy = (luma17 - luma15) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.04921356040854137; + gx = (luma24 - luma10) / 2.0; + gy = (luma18 - luma16) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.055766269846849466; + gx = (luma25 - luma11) / 2.0; + gy = (luma19 - luma17) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.04921356040854137; + gx = (luma26 - luma12) / 2.0; + gy = (luma20 - luma18) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.033823952439922346; + gx = (luma29 - luma15) / 2.0; + gy = (luma23 - luma21) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.038327559383903906; + gx = (luma30 - luma16) / 2.0; + gy = (luma24 - luma22) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.055766269846849466; + gx = (luma31 - luma17) / 2.0; + gy = (luma25 - luma23) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06319146241026467; + gx = (luma32 - luma18) / 2.0; + gy = (luma26 - luma24) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.055766269846849466; + gx = (luma33 - luma19) / 2.0; + gy = (luma27 - luma25) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.038327559383903906; + gx = (luma36 - luma22) / 2.0; + gy = (luma30 - luma28) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.033823952439922346; + gx = (luma37 - luma23) / 2.0; + gy = (luma31 - luma29) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.04921356040854137; + gx = (luma38 - luma24) / 2.0; + gy = (luma32 - luma30) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.055766269846849466; + gx = (luma39 - luma25) / 2.0; + gy = (luma33 - luma31) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.04921356040854137; + gx = (luma40 - luma26) / 2.0; + gy = (luma34 - luma32) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.033823952439922346; + gx = (luma43 - luma29) / 2.0; + gy = (luma37 - luma35) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.02324683987829437; + gx = (luma44 - luma30) / 2.0; + gy = (luma38 - luma36) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.033823952439922346; + gx = (luma45 - luma31) / 2.0; + gy = (luma39 - luma37) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.038327559383903906; + gx = (luma46 - luma32) / 2.0; + gy = (luma40 - luma38) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.033823952439922346; + gx = (luma47 - luma33) / 2.0; + gy = (luma41 - luma39) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.02324683987829437; + float a = abd.x, b = abd.y, d = abd.z; + float T = a + d, D = a * d - b * b; + float delta = sqrt(max(T * T / 4.0 - D, 0.0)); + float L1 = T / 2.0 + delta, L2 = T / 2.0 - delta; + float sqrtL1 = sqrt(L1), sqrtL2 = sqrt(L2); + float theta = mix(mod(atan(L1 - a, b) + 3.141592653589793, 3.141592653589793), 0.0, abs(b) < 1.192092896e-7); + float lambda = sqrtL1; + float mu = mix((sqrtL1 - sqrtL2) / (sqrtL1 + sqrtL2), 0.0, sqrtL1 + sqrtL2 < 1.192092896e-7); + float angle = floor(theta * 24.0 / 3.141592653589793); + float strength = mix(mix(0.0, 1.0, lambda >= 0.005), 2.0, lambda >= 0.02); + float coherence = mix(mix(0.0, 1.0, mu >= 0.25), 2.0, mu >= 0.5); + float coord_y = ((angle * 3.0 + strength) * 3.0 + coherence + 0.5) / 216.0; + vec4 res0 = vec4(0.0, 0.0, 0.0, 0.0), res1 = vec4(0.0, 0.0, 0.0, 0.0); + vec4 w0, w1; + w0 = texture(ravu_3x_lut4, vec2(0.01, coord_y)); + w1 = texture(ravu_3x_lut4, vec2(0.03, coord_y)); + res0 += luma0 * w0 + luma48 * w1.wzyx; + res1 += luma0 * w1 + luma48 * w0.wzyx; + w0 = texture(ravu_3x_lut4, vec2(0.05, coord_y)); + w1 = texture(ravu_3x_lut4, vec2(0.07, coord_y)); + res0 += luma1 * w0 + luma47 * w1.wzyx; + res1 += luma1 * w1 + luma47 * w0.wzyx; + w0 = texture(ravu_3x_lut4, vec2(0.09, coord_y)); + w1 = texture(ravu_3x_lut4, vec2(0.11, coord_y)); + res0 += luma2 * w0 + luma46 * w1.wzyx; + res1 += luma2 * w1 + luma46 * w0.wzyx; + w0 = texture(ravu_3x_lut4, vec2(0.13, coord_y)); + w1 = texture(ravu_3x_lut4, vec2(0.15, coord_y)); + res0 += luma3 * w0 + luma45 * w1.wzyx; + res1 += luma3 * w1 + luma45 * w0.wzyx; + w0 = texture(ravu_3x_lut4, vec2(0.17, coord_y)); + w1 = texture(ravu_3x_lut4, vec2(0.19, coord_y)); + res0 += luma4 * w0 + luma44 * w1.wzyx; + res1 += luma4 * w1 + luma44 * w0.wzyx; + w0 = texture(ravu_3x_lut4, vec2(0.21, coord_y)); + w1 = texture(ravu_3x_lut4, vec2(0.23, coord_y)); + res0 += luma5 * w0 + luma43 * w1.wzyx; + res1 += luma5 * w1 + luma43 * w0.wzyx; + w0 = texture(ravu_3x_lut4, vec2(0.25, coord_y)); + w1 = texture(ravu_3x_lut4, vec2(0.27, coord_y)); + res0 += luma6 * w0 + luma42 * w1.wzyx; + res1 += luma6 * w1 + luma42 * w0.wzyx; + w0 = texture(ravu_3x_lut4, vec2(0.29, coord_y)); + w1 = texture(ravu_3x_lut4, vec2(0.31, coord_y)); + res0 += luma7 * w0 + luma41 * w1.wzyx; + res1 += luma7 * w1 + luma41 * w0.wzyx; + w0 = texture(ravu_3x_lut4, vec2(0.33, coord_y)); + w1 = texture(ravu_3x_lut4, vec2(0.35, coord_y)); + res0 += luma8 * w0 + luma40 * w1.wzyx; + res1 += luma8 * w1 + luma40 * w0.wzyx; + w0 = texture(ravu_3x_lut4, vec2(0.37, coord_y)); + w1 = texture(ravu_3x_lut4, vec2(0.39, coord_y)); + res0 += luma9 * w0 + luma39 * w1.wzyx; + res1 += luma9 * w1 + luma39 * w0.wzyx; + w0 = texture(ravu_3x_lut4, vec2(0.41, coord_y)); + w1 = texture(ravu_3x_lut4, vec2(0.43, coord_y)); + res0 += luma10 * w0 + luma38 * w1.wzyx; + res1 += luma10 * w1 + luma38 * w0.wzyx; + w0 = texture(ravu_3x_lut4, vec2(0.45, coord_y)); + w1 = texture(ravu_3x_lut4, vec2(0.47, coord_y)); + res0 += luma11 * w0 + luma37 * w1.wzyx; + res1 += luma11 * w1 + luma37 * w0.wzyx; + w0 = texture(ravu_3x_lut4, vec2(0.49, coord_y)); + w1 = texture(ravu_3x_lut4, vec2(0.51, coord_y)); + res0 += luma12 * w0 + luma36 * w1.wzyx; + res1 += luma12 * w1 + luma36 * w0.wzyx; + w0 = texture(ravu_3x_lut4, vec2(0.53, coord_y)); + w1 = texture(ravu_3x_lut4, vec2(0.55, coord_y)); + res0 += luma13 * w0 + luma35 * w1.wzyx; + res1 += luma13 * w1 + luma35 * w0.wzyx; + w0 = texture(ravu_3x_lut4, vec2(0.57, coord_y)); + w1 = texture(ravu_3x_lut4, vec2(0.59, coord_y)); + res0 += luma14 * w0 + luma34 * w1.wzyx; + res1 += luma14 * w1 + luma34 * w0.wzyx; + w0 = texture(ravu_3x_lut4, vec2(0.61, coord_y)); + w1 = texture(ravu_3x_lut4, vec2(0.63, coord_y)); + res0 += luma15 * w0 + luma33 * w1.wzyx; + res1 += luma15 * w1 + luma33 * w0.wzyx; + w0 = texture(ravu_3x_lut4, vec2(0.65, coord_y)); + w1 = texture(ravu_3x_lut4, vec2(0.67, coord_y)); + res0 += luma16 * w0 + luma32 * w1.wzyx; + res1 += luma16 * w1 + luma32 * w0.wzyx; + w0 = texture(ravu_3x_lut4, vec2(0.69, coord_y)); + w1 = texture(ravu_3x_lut4, vec2(0.71, coord_y)); + res0 += luma17 * w0 + luma31 * w1.wzyx; + res1 += luma17 * w1 + luma31 * w0.wzyx; + w0 = texture(ravu_3x_lut4, vec2(0.73, coord_y)); + w1 = texture(ravu_3x_lut4, vec2(0.75, coord_y)); + res0 += luma18 * w0 + luma30 * w1.wzyx; + res1 += luma18 * w1 + luma30 * w0.wzyx; + w0 = texture(ravu_3x_lut4, vec2(0.77, coord_y)); + w1 = texture(ravu_3x_lut4, vec2(0.79, coord_y)); + res0 += luma19 * w0 + luma29 * w1.wzyx; + res1 += luma19 * w1 + luma29 * w0.wzyx; + w0 = texture(ravu_3x_lut4, vec2(0.81, coord_y)); + w1 = texture(ravu_3x_lut4, vec2(0.83, coord_y)); + res0 += luma20 * w0 + luma28 * w1.wzyx; + res1 += luma20 * w1 + luma28 * w0.wzyx; + w0 = texture(ravu_3x_lut4, vec2(0.85, coord_y)); + w1 = texture(ravu_3x_lut4, vec2(0.87, coord_y)); + res0 += luma21 * w0 + luma27 * w1.wzyx; + res1 += luma21 * w1 + luma27 * w0.wzyx; + w0 = texture(ravu_3x_lut4, vec2(0.89, coord_y)); + w1 = texture(ravu_3x_lut4, vec2(0.91, coord_y)); + res0 += luma22 * w0 + luma26 * w1.wzyx; + res1 += luma22 * w1 + luma26 * w0.wzyx; + w0 = texture(ravu_3x_lut4, vec2(0.93, coord_y)); + w1 = texture(ravu_3x_lut4, vec2(0.95, coord_y)); + res0 += luma23 * w0 + luma25 * w1.wzyx; + res1 += luma23 * w1 + luma25 * w0.wzyx; + w0 = texture(ravu_3x_lut4, vec2(0.97, coord_y)); + w1 = texture(ravu_3x_lut4, vec2(0.99, coord_y)); + res0 += luma24 * w0; + res1 += luma24 * w1; + res0 = clamp(res0, 0.0, 1.0); + res1 = clamp(res1, 0.0, 1.0); + imageStore(out_image, ivec2(gl_GlobalInvocationID) * 3 + ivec2(0, 0), res0[0]); + imageStore(out_image, ivec2(gl_GlobalInvocationID) * 3 + ivec2(0, 1), res0[1]); + imageStore(out_image, ivec2(gl_GlobalInvocationID) * 3 + ivec2(0, 2), res0[2]); + imageStore(out_image, ivec2(gl_GlobalInvocationID) * 3 + ivec2(1, 0), res0[3]); + imageStore(out_image, ivec2(gl_GlobalInvocationID) * 3 + ivec2(1, 1), luma24); + imageStore(out_image, ivec2(gl_GlobalInvocationID) * 3 + ivec2(1, 2), res1[0]); + imageStore(out_image, ivec2(gl_GlobalInvocationID) * 3 + ivec2(2, 0), res1[1]); + imageStore(out_image, ivec2(gl_GlobalInvocationID) * 3 + ivec2(2, 1), res1[2]); + imageStore(out_image, ivec2(gl_GlobalInvocationID) * 3 + ivec2(2, 2), res1[3]); +} diff --git a/src/Effects/RAVU/RAVU_3x_R4_RGB.hlsl b/src/Effects/RAVU/RAVU_3x_R4_RGB.hlsl new file mode 100644 index 000000000..c3883a6d3 --- /dev/null +++ b/src/Effects/RAVU/RAVU_3x_R4_RGB.hlsl @@ -0,0 +1,344 @@ +// This file is generated by the scripts available at https://github.com/hauuau/magpie-prescalers +// Please don't edit this file directly. +// Generated by: ravu-3x.py --target rgb --weights-file weights\ravu-3x_weights-r4.py --float-format float16dx --use-magpie --overwrite +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +//!MAGPIE EFFECT +//!VERSION 4 + +//!TEXTURE +Texture2D INPUT; + +//!SAMPLER +//!FILTER POINT +SamplerState sam_INPUT; + +//!TEXTURE +//!WIDTH INPUT_WIDTH * 3 +//!HEIGHT INPUT_HEIGHT * 3 +Texture2D OUTPUT; + +//!TEXTURE +//!SOURCE ravu_3x_lut4_f16.dds +//!FORMAT R16G16B16A16_FLOAT +Texture2D ravu_3x_lut4; + +//!SAMPLER +//!FILTER LINEAR +SamplerState sam_ravu_3x_lut4; + +//!COMMON +#include "prescalers.hlsli" + +#define LAST_PASS 1 + +//!PASS 1 +//!DESC RAVU-3x (rgb, r4) +//!IN INPUT, ravu_3x_lut4 +//!OUT OUTPUT +//!BLOCK_SIZE 96, 24 +//!NUM_THREADS 32, 8 +static const vec3 color_primary = vec3(0.2126, 0.7152, 0.0722); +// HLSL doesn't have outerProduct +float4x3 outerProduct(float3 l, float4 r) { return mul(float4x1(r), float1x3(l)); } +shared vec3 inp[532]; +shared float inp_luma[532]; + +#define CURRENT_PASS 1 + +#define GET_SAMPLE(x) x +#define imageStore(out_image, pos, val) imageStoreOverride(pos, val) +void imageStoreOverride(uint2 pos, float4 value) { OUTPUT[pos] = value; } + +#define INPUT_tex(pos) GET_SAMPLE(vec4(texture(INPUT, pos))) +static const float2 INPUT_size = float2(GetInputSize()); +static const float2 INPUT_pt = float2(GetInputPt()); + +#define ravu_3x_lut4_tex(pos) (vec4(texture(ravu_3x_lut4, pos))) + +#define HOOKED_tex(pos) INPUT_tex(pos) +#define HOOKED_size INPUT_size +#define HOOKED_pt INPUT_pt + +void Pass1(uint2 blockStart, uint3 threadId) { + ivec2 group_base = ivec2(gl_WorkGroupID) * ivec2(gl_WorkGroupSize); + int local_pos = int(gl_LocalInvocationID.x) * 14 + int(gl_LocalInvocationID.y); + for (int id = int(gl_LocalInvocationIndex); id < 532; id += int(gl_WorkGroupSize.x * gl_WorkGroupSize.y)) { + uint x = (uint)id / 14, y = (uint)id % 14; + inp[id] = HOOKED_tex(HOOKED_pt * vec2(float(group_base.x + x) + (-2.5), float(group_base.y + y) + (-2.5))).xyz; + inp_luma[id] = dot(inp[id], color_primary); + } + barrier(); +#if CURRENT_PASS == LAST_PASS + uint2 destPos = blockStart + threadId.xy * 3; + uint2 outputSize = GetOutputSize(); + if (destPos.x >= outputSize.x || destPos.y >= outputSize.y) { + return; + } +#endif + float luma1 = inp_luma[local_pos + 1]; + float luma2 = inp_luma[local_pos + 2]; + float luma3 = inp_luma[local_pos + 3]; + float luma4 = inp_luma[local_pos + 4]; + float luma5 = inp_luma[local_pos + 5]; + float luma7 = inp_luma[local_pos + 14]; + float luma8 = inp_luma[local_pos + 15]; + float luma9 = inp_luma[local_pos + 16]; + float luma10 = inp_luma[local_pos + 17]; + float luma11 = inp_luma[local_pos + 18]; + float luma12 = inp_luma[local_pos + 19]; + float luma13 = inp_luma[local_pos + 20]; + float luma14 = inp_luma[local_pos + 28]; + float luma15 = inp_luma[local_pos + 29]; + float luma16 = inp_luma[local_pos + 30]; + float luma17 = inp_luma[local_pos + 31]; + float luma18 = inp_luma[local_pos + 32]; + float luma19 = inp_luma[local_pos + 33]; + float luma20 = inp_luma[local_pos + 34]; + float luma21 = inp_luma[local_pos + 42]; + float luma22 = inp_luma[local_pos + 43]; + float luma23 = inp_luma[local_pos + 44]; + float luma24 = inp_luma[local_pos + 45]; + float luma25 = inp_luma[local_pos + 46]; + float luma26 = inp_luma[local_pos + 47]; + float luma27 = inp_luma[local_pos + 48]; + float luma28 = inp_luma[local_pos + 56]; + float luma29 = inp_luma[local_pos + 57]; + float luma30 = inp_luma[local_pos + 58]; + float luma31 = inp_luma[local_pos + 59]; + float luma32 = inp_luma[local_pos + 60]; + float luma33 = inp_luma[local_pos + 61]; + float luma34 = inp_luma[local_pos + 62]; + float luma35 = inp_luma[local_pos + 70]; + float luma36 = inp_luma[local_pos + 71]; + float luma37 = inp_luma[local_pos + 72]; + float luma38 = inp_luma[local_pos + 73]; + float luma39 = inp_luma[local_pos + 74]; + float luma40 = inp_luma[local_pos + 75]; + float luma41 = inp_luma[local_pos + 76]; + float luma43 = inp_luma[local_pos + 85]; + float luma44 = inp_luma[local_pos + 86]; + float luma45 = inp_luma[local_pos + 87]; + float luma46 = inp_luma[local_pos + 88]; + float luma47 = inp_luma[local_pos + 89]; + vec3 abd = vec3(0.0, 0.0, 0.0); + float gx, gy; + gx = (luma15 - luma1) / 2.0; + gy = (luma9 - luma7) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.02324683987829437; + gx = (luma16 - luma2) / 2.0; + gy = (luma10 - luma8) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.033823952439922346; + gx = (luma17 - luma3) / 2.0; + gy = (luma11 - luma9) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.038327559383903906; + gx = (luma18 - luma4) / 2.0; + gy = (luma12 - luma10) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.033823952439922346; + gx = (luma19 - luma5) / 2.0; + gy = (luma13 - luma11) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.02324683987829437; + gx = (luma22 - luma8) / 2.0; + gy = (luma16 - luma14) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.033823952439922346; + gx = (luma23 - luma9) / 2.0; + gy = (luma17 - luma15) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.04921356040854137; + gx = (luma24 - luma10) / 2.0; + gy = (luma18 - luma16) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.055766269846849466; + gx = (luma25 - luma11) / 2.0; + gy = (luma19 - luma17) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.04921356040854137; + gx = (luma26 - luma12) / 2.0; + gy = (luma20 - luma18) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.033823952439922346; + gx = (luma29 - luma15) / 2.0; + gy = (luma23 - luma21) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.038327559383903906; + gx = (luma30 - luma16) / 2.0; + gy = (luma24 - luma22) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.055766269846849466; + gx = (luma31 - luma17) / 2.0; + gy = (luma25 - luma23) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06319146241026467; + gx = (luma32 - luma18) / 2.0; + gy = (luma26 - luma24) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.055766269846849466; + gx = (luma33 - luma19) / 2.0; + gy = (luma27 - luma25) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.038327559383903906; + gx = (luma36 - luma22) / 2.0; + gy = (luma30 - luma28) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.033823952439922346; + gx = (luma37 - luma23) / 2.0; + gy = (luma31 - luma29) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.04921356040854137; + gx = (luma38 - luma24) / 2.0; + gy = (luma32 - luma30) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.055766269846849466; + gx = (luma39 - luma25) / 2.0; + gy = (luma33 - luma31) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.04921356040854137; + gx = (luma40 - luma26) / 2.0; + gy = (luma34 - luma32) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.033823952439922346; + gx = (luma43 - luma29) / 2.0; + gy = (luma37 - luma35) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.02324683987829437; + gx = (luma44 - luma30) / 2.0; + gy = (luma38 - luma36) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.033823952439922346; + gx = (luma45 - luma31) / 2.0; + gy = (luma39 - luma37) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.038327559383903906; + gx = (luma46 - luma32) / 2.0; + gy = (luma40 - luma38) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.033823952439922346; + gx = (luma47 - luma33) / 2.0; + gy = (luma41 - luma39) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.02324683987829437; + float a = abd.x, b = abd.y, d = abd.z; + float T = a + d, D = a * d - b * b; + float delta = sqrt(max(T * T / 4.0 - D, 0.0)); + float L1 = T / 2.0 + delta, L2 = T / 2.0 - delta; + float sqrtL1 = sqrt(L1), sqrtL2 = sqrt(L2); + float theta = mix(mod(atan(L1 - a, b) + 3.141592653589793, 3.141592653589793), 0.0, abs(b) < 1.192092896e-7); + float lambda = sqrtL1; + float mu = mix((sqrtL1 - sqrtL2) / (sqrtL1 + sqrtL2), 0.0, sqrtL1 + sqrtL2 < 1.192092896e-7); + float angle = floor(theta * 24.0 / 3.141592653589793); + float strength = mix(mix(0.0, 1.0, lambda >= 0.005), 2.0, lambda >= 0.02); + float coherence = mix(mix(0.0, 1.0, mu >= 0.25), 2.0, mu >= 0.5); + float coord_y = ((angle * 3.0 + strength) * 3.0 + coherence + 0.5) / 216.0; + mat4x3 res0 = 0.0, res1 = 0.0; + vec4 w0, w1; + w0 = texture(ravu_3x_lut4, vec2(0.01, coord_y)); + w1 = texture(ravu_3x_lut4, vec2(0.03, coord_y)); + res0 += outerProduct(inp[local_pos + 0], w0) + outerProduct(inp[local_pos + 90], w1.wzyx); + res1 += outerProduct(inp[local_pos + 0], w1) + outerProduct(inp[local_pos + 90], w0.wzyx); + w0 = texture(ravu_3x_lut4, vec2(0.05, coord_y)); + w1 = texture(ravu_3x_lut4, vec2(0.07, coord_y)); + res0 += outerProduct(inp[local_pos + 1], w0) + outerProduct(inp[local_pos + 89], w1.wzyx); + res1 += outerProduct(inp[local_pos + 1], w1) + outerProduct(inp[local_pos + 89], w0.wzyx); + w0 = texture(ravu_3x_lut4, vec2(0.09, coord_y)); + w1 = texture(ravu_3x_lut4, vec2(0.11, coord_y)); + res0 += outerProduct(inp[local_pos + 2], w0) + outerProduct(inp[local_pos + 88], w1.wzyx); + res1 += outerProduct(inp[local_pos + 2], w1) + outerProduct(inp[local_pos + 88], w0.wzyx); + w0 = texture(ravu_3x_lut4, vec2(0.13, coord_y)); + w1 = texture(ravu_3x_lut4, vec2(0.15, coord_y)); + res0 += outerProduct(inp[local_pos + 3], w0) + outerProduct(inp[local_pos + 87], w1.wzyx); + res1 += outerProduct(inp[local_pos + 3], w1) + outerProduct(inp[local_pos + 87], w0.wzyx); + w0 = texture(ravu_3x_lut4, vec2(0.17, coord_y)); + w1 = texture(ravu_3x_lut4, vec2(0.19, coord_y)); + res0 += outerProduct(inp[local_pos + 4], w0) + outerProduct(inp[local_pos + 86], w1.wzyx); + res1 += outerProduct(inp[local_pos + 4], w1) + outerProduct(inp[local_pos + 86], w0.wzyx); + w0 = texture(ravu_3x_lut4, vec2(0.21, coord_y)); + w1 = texture(ravu_3x_lut4, vec2(0.23, coord_y)); + res0 += outerProduct(inp[local_pos + 5], w0) + outerProduct(inp[local_pos + 85], w1.wzyx); + res1 += outerProduct(inp[local_pos + 5], w1) + outerProduct(inp[local_pos + 85], w0.wzyx); + w0 = texture(ravu_3x_lut4, vec2(0.25, coord_y)); + w1 = texture(ravu_3x_lut4, vec2(0.27, coord_y)); + res0 += outerProduct(inp[local_pos + 6], w0) + outerProduct(inp[local_pos + 84], w1.wzyx); + res1 += outerProduct(inp[local_pos + 6], w1) + outerProduct(inp[local_pos + 84], w0.wzyx); + w0 = texture(ravu_3x_lut4, vec2(0.29, coord_y)); + w1 = texture(ravu_3x_lut4, vec2(0.31, coord_y)); + res0 += outerProduct(inp[local_pos + 14], w0) + outerProduct(inp[local_pos + 76], w1.wzyx); + res1 += outerProduct(inp[local_pos + 14], w1) + outerProduct(inp[local_pos + 76], w0.wzyx); + w0 = texture(ravu_3x_lut4, vec2(0.33, coord_y)); + w1 = texture(ravu_3x_lut4, vec2(0.35, coord_y)); + res0 += outerProduct(inp[local_pos + 15], w0) + outerProduct(inp[local_pos + 75], w1.wzyx); + res1 += outerProduct(inp[local_pos + 15], w1) + outerProduct(inp[local_pos + 75], w0.wzyx); + w0 = texture(ravu_3x_lut4, vec2(0.37, coord_y)); + w1 = texture(ravu_3x_lut4, vec2(0.39, coord_y)); + res0 += outerProduct(inp[local_pos + 16], w0) + outerProduct(inp[local_pos + 74], w1.wzyx); + res1 += outerProduct(inp[local_pos + 16], w1) + outerProduct(inp[local_pos + 74], w0.wzyx); + w0 = texture(ravu_3x_lut4, vec2(0.41, coord_y)); + w1 = texture(ravu_3x_lut4, vec2(0.43, coord_y)); + res0 += outerProduct(inp[local_pos + 17], w0) + outerProduct(inp[local_pos + 73], w1.wzyx); + res1 += outerProduct(inp[local_pos + 17], w1) + outerProduct(inp[local_pos + 73], w0.wzyx); + w0 = texture(ravu_3x_lut4, vec2(0.45, coord_y)); + w1 = texture(ravu_3x_lut4, vec2(0.47, coord_y)); + res0 += outerProduct(inp[local_pos + 18], w0) + outerProduct(inp[local_pos + 72], w1.wzyx); + res1 += outerProduct(inp[local_pos + 18], w1) + outerProduct(inp[local_pos + 72], w0.wzyx); + w0 = texture(ravu_3x_lut4, vec2(0.49, coord_y)); + w1 = texture(ravu_3x_lut4, vec2(0.51, coord_y)); + res0 += outerProduct(inp[local_pos + 19], w0) + outerProduct(inp[local_pos + 71], w1.wzyx); + res1 += outerProduct(inp[local_pos + 19], w1) + outerProduct(inp[local_pos + 71], w0.wzyx); + w0 = texture(ravu_3x_lut4, vec2(0.53, coord_y)); + w1 = texture(ravu_3x_lut4, vec2(0.55, coord_y)); + res0 += outerProduct(inp[local_pos + 20], w0) + outerProduct(inp[local_pos + 70], w1.wzyx); + res1 += outerProduct(inp[local_pos + 20], w1) + outerProduct(inp[local_pos + 70], w0.wzyx); + w0 = texture(ravu_3x_lut4, vec2(0.57, coord_y)); + w1 = texture(ravu_3x_lut4, vec2(0.59, coord_y)); + res0 += outerProduct(inp[local_pos + 28], w0) + outerProduct(inp[local_pos + 62], w1.wzyx); + res1 += outerProduct(inp[local_pos + 28], w1) + outerProduct(inp[local_pos + 62], w0.wzyx); + w0 = texture(ravu_3x_lut4, vec2(0.61, coord_y)); + w1 = texture(ravu_3x_lut4, vec2(0.63, coord_y)); + res0 += outerProduct(inp[local_pos + 29], w0) + outerProduct(inp[local_pos + 61], w1.wzyx); + res1 += outerProduct(inp[local_pos + 29], w1) + outerProduct(inp[local_pos + 61], w0.wzyx); + w0 = texture(ravu_3x_lut4, vec2(0.65, coord_y)); + w1 = texture(ravu_3x_lut4, vec2(0.67, coord_y)); + res0 += outerProduct(inp[local_pos + 30], w0) + outerProduct(inp[local_pos + 60], w1.wzyx); + res1 += outerProduct(inp[local_pos + 30], w1) + outerProduct(inp[local_pos + 60], w0.wzyx); + w0 = texture(ravu_3x_lut4, vec2(0.69, coord_y)); + w1 = texture(ravu_3x_lut4, vec2(0.71, coord_y)); + res0 += outerProduct(inp[local_pos + 31], w0) + outerProduct(inp[local_pos + 59], w1.wzyx); + res1 += outerProduct(inp[local_pos + 31], w1) + outerProduct(inp[local_pos + 59], w0.wzyx); + w0 = texture(ravu_3x_lut4, vec2(0.73, coord_y)); + w1 = texture(ravu_3x_lut4, vec2(0.75, coord_y)); + res0 += outerProduct(inp[local_pos + 32], w0) + outerProduct(inp[local_pos + 58], w1.wzyx); + res1 += outerProduct(inp[local_pos + 32], w1) + outerProduct(inp[local_pos + 58], w0.wzyx); + w0 = texture(ravu_3x_lut4, vec2(0.77, coord_y)); + w1 = texture(ravu_3x_lut4, vec2(0.79, coord_y)); + res0 += outerProduct(inp[local_pos + 33], w0) + outerProduct(inp[local_pos + 57], w1.wzyx); + res1 += outerProduct(inp[local_pos + 33], w1) + outerProduct(inp[local_pos + 57], w0.wzyx); + w0 = texture(ravu_3x_lut4, vec2(0.81, coord_y)); + w1 = texture(ravu_3x_lut4, vec2(0.83, coord_y)); + res0 += outerProduct(inp[local_pos + 34], w0) + outerProduct(inp[local_pos + 56], w1.wzyx); + res1 += outerProduct(inp[local_pos + 34], w1) + outerProduct(inp[local_pos + 56], w0.wzyx); + w0 = texture(ravu_3x_lut4, vec2(0.85, coord_y)); + w1 = texture(ravu_3x_lut4, vec2(0.87, coord_y)); + res0 += outerProduct(inp[local_pos + 42], w0) + outerProduct(inp[local_pos + 48], w1.wzyx); + res1 += outerProduct(inp[local_pos + 42], w1) + outerProduct(inp[local_pos + 48], w0.wzyx); + w0 = texture(ravu_3x_lut4, vec2(0.89, coord_y)); + w1 = texture(ravu_3x_lut4, vec2(0.91, coord_y)); + res0 += outerProduct(inp[local_pos + 43], w0) + outerProduct(inp[local_pos + 47], w1.wzyx); + res1 += outerProduct(inp[local_pos + 43], w1) + outerProduct(inp[local_pos + 47], w0.wzyx); + w0 = texture(ravu_3x_lut4, vec2(0.93, coord_y)); + w1 = texture(ravu_3x_lut4, vec2(0.95, coord_y)); + res0 += outerProduct(inp[local_pos + 44], w0) + outerProduct(inp[local_pos + 46], w1.wzyx); + res1 += outerProduct(inp[local_pos + 44], w1) + outerProduct(inp[local_pos + 46], w0.wzyx); + w0 = texture(ravu_3x_lut4, vec2(0.97, coord_y)); + w1 = texture(ravu_3x_lut4, vec2(0.99, coord_y)); + res0 += outerProduct(inp[local_pos + 45], w0); + res1 += outerProduct(inp[local_pos + 45], w1); + res0[0] = clamp(res0[0], 0.0, 1.0); + res0[1] = clamp(res0[1], 0.0, 1.0); + res0[2] = clamp(res0[2], 0.0, 1.0); + res0[3] = clamp(res0[3], 0.0, 1.0); + res1[0] = clamp(res1[0], 0.0, 1.0); + res1[1] = clamp(res1[1], 0.0, 1.0); + res1[2] = clamp(res1[2], 0.0, 1.0); + res1[3] = clamp(res1[3], 0.0, 1.0); + imageStore(out_image, ivec2(gl_GlobalInvocationID) * 3 + ivec2(0, 0), vec4(res0[0], 1.0)); + imageStore(out_image, ivec2(gl_GlobalInvocationID) * 3 + ivec2(0, 1), vec4(res0[1], 1.0)); + imageStore(out_image, ivec2(gl_GlobalInvocationID) * 3 + ivec2(0, 2), vec4(res0[2], 1.0)); + imageStore(out_image, ivec2(gl_GlobalInvocationID) * 3 + ivec2(1, 0), vec4(res0[3], 1.0)); + imageStore(out_image, ivec2(gl_GlobalInvocationID) * 3 + ivec2(1, 1), vec4(inp[local_pos + 45], 1.0)); + imageStore(out_image, ivec2(gl_GlobalInvocationID) * 3 + ivec2(1, 2), vec4(res1[0], 1.0)); + imageStore(out_image, ivec2(gl_GlobalInvocationID) * 3 + ivec2(2, 0), vec4(res1[1], 1.0)); + imageStore(out_image, ivec2(gl_GlobalInvocationID) * 3 + ivec2(2, 1), vec4(res1[2], 1.0)); + imageStore(out_image, ivec2(gl_GlobalInvocationID) * 3 + ivec2(2, 2), vec4(res1[3], 1.0)); +} diff --git a/src/Effects/RAVU/RAVU_Lite_AR_R2.hlsl b/src/Effects/RAVU/RAVU_Lite_AR_R2.hlsl new file mode 100644 index 000000000..473527c6b --- /dev/null +++ b/src/Effects/RAVU/RAVU_Lite_AR_R2.hlsl @@ -0,0 +1,224 @@ +// This file is generated by the scripts available at https://github.com/hauuau/magpie-prescalers +// Please don't edit this file directly. +// Generated by: ravu-lite.py --weights-file weights\ravu-lite_weights-r2.py --float-format float16dx --use-compute-shader --anti-ringing 0.8 --use-magpie --overwrite +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +//!MAGPIE EFFECT +//!VERSION 4 + +//!TEXTURE +Texture2D INPUT; + +//!SAMPLER +//!FILTER POINT +SamplerState sam_INPUT; + +//!TEXTURE +//!WIDTH INPUT_WIDTH * 2 +//!HEIGHT INPUT_HEIGHT * 2 +Texture2D OUTPUT; + +//!SAMPLER +//!FILTER LINEAR +SamplerState sam_INPUT_LINEAR; + +//!TEXTURE +//!SOURCE ravu_lite_lut2_f16.dds +//!FORMAT R16G16B16A16_FLOAT +Texture2D ravu_lite_lut2; + +//!SAMPLER +//!FILTER LINEAR +SamplerState sam_ravu_lite_lut2; + +//!COMMON +#include "prescalers.hlsli" + +#define LAST_PASS 1 + +//!PASS 1 +//!DESC RAVU-Lite-AR (r2, compute) +//!IN INPUT, ravu_lite_lut2 +//!OUT OUTPUT +//!BLOCK_SIZE 64, 16 +//!NUM_THREADS 32, 8 +shared float inp[340]; + +#define CURRENT_PASS 1 + +#define GET_SAMPLE(x) dot(x.rgb, rgb2y) +#define imageStore(out_image, pos, val) imageStoreOverride(pos, val.x) +void imageStoreOverride(uint2 pos, float value) { + float2 UV = mul(rgb2uv, INPUT.SampleLevel(sam_INPUT_LINEAR, HOOKED_map(pos), 0).rgb); + OUTPUT[pos] = float4(mul(yuv2rgb, float3(value.x, UV)), 1.0); +} + +#define INPUT_tex(pos) GET_SAMPLE(vec4(texture(INPUT, pos))) +static const float2 INPUT_size = float2(GetInputSize()); +static const float2 INPUT_pt = float2(GetInputPt()); + +#define ravu_lite_lut2_tex(pos) (vec4(texture(ravu_lite_lut2, pos))) + +#define HOOKED_tex(pos) INPUT_tex(pos) +#define HOOKED_size INPUT_size +#define HOOKED_pt INPUT_pt + +void Pass1(uint2 blockStart, uint3 threadId) { + ivec2 group_base = ivec2(gl_WorkGroupID) * ivec2(gl_WorkGroupSize); + int local_pos = int(gl_LocalInvocationID.x) * 10 + int(gl_LocalInvocationID.y); +#pragma warning(disable : 3557) + for (int id = int(gl_LocalInvocationIndex); id < 340; id += int(gl_WorkGroupSize.x * gl_WorkGroupSize.y)) { + uint x = (uint)id / 10, y = (uint)id % 10; + inp[id] = HOOKED_tex(HOOKED_pt * vec2(float(group_base.x + x) + (-0.5), float(group_base.y + y) + (-0.5))).x; + } + barrier(); +#if CURRENT_PASS == LAST_PASS + uint2 destPos = blockStart + threadId.xy * 2; + uint2 outputSize = GetOutputSize(); + if (destPos.x >= outputSize.x || destPos.y >= outputSize.y) { + return; + } +#endif + vec3 abd = vec3(0.0, 0.0, 0.0); + float gx, gy; + gx = (inp[local_pos + 10] - inp[local_pos + 0]); + gy = (inp[local_pos + 1] - inp[local_pos + 0]); + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.1018680644198163; + gx = (inp[local_pos + 11] - inp[local_pos + 1]); + gy = (inp[local_pos + 2] - inp[local_pos + 0]) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.11543163961422666; + gx = (inp[local_pos + 12] - inp[local_pos + 2]); + gy = (inp[local_pos + 2] - inp[local_pos + 1]); + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.1018680644198163; + gx = (inp[local_pos + 20] - inp[local_pos + 0]) / 2.0; + gy = (inp[local_pos + 11] - inp[local_pos + 10]); + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.11543163961422666; + gx = (inp[local_pos + 21] - inp[local_pos + 1]) / 2.0; + gy = (inp[local_pos + 12] - inp[local_pos + 10]) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.13080118386382833; + gx = (inp[local_pos + 22] - inp[local_pos + 2]) / 2.0; + gy = (inp[local_pos + 12] - inp[local_pos + 11]); + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.11543163961422666; + gx = (inp[local_pos + 20] - inp[local_pos + 10]); + gy = (inp[local_pos + 21] - inp[local_pos + 20]); + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.1018680644198163; + gx = (inp[local_pos + 21] - inp[local_pos + 11]); + gy = (inp[local_pos + 22] - inp[local_pos + 20]) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.11543163961422666; + gx = (inp[local_pos + 22] - inp[local_pos + 12]); + gy = (inp[local_pos + 22] - inp[local_pos + 21]); + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.1018680644198163; + float a = abd.x, b = abd.y, d = abd.z; + float T = a + d, D = a * d - b * b; + float delta = sqrt(max(T * T / 4.0 - D, 0.0)); + float L1 = T / 2.0 + delta, L2 = T / 2.0 - delta; + float sqrtL1 = sqrt(L1), sqrtL2 = sqrt(L2); + float theta = mix(mod(atan(L1 - a, b) + 3.141592653589793, 3.141592653589793), 0.0, abs(b) < 1.192092896e-7); + float lambda = sqrtL1; + float mu = mix((sqrtL1 - sqrtL2) / (sqrtL1 + sqrtL2), 0.0, sqrtL1 + sqrtL2 < 1.192092896e-7); + float angle = floor(theta * 24.0 / 3.141592653589793); + float strength = mix(mix(0.0, 1.0, lambda >= 0.004), mix(2.0, 3.0, lambda >= 0.05), lambda >= 0.016); + float coherence = mix(mix(0.0, 1.0, mu >= 0.25), 2.0, mu >= 0.5); + float coord_y = ((angle * 4.0 + strength) * 3.0 + coherence + 0.5) / 288.0; + vec4 res = vec4(0.0, 0.0, 0.0, 0.0), w; + vec4 lo = vec4(0.0, 0.0, 0.0, 0.0), hi = vec4(0.0, 0.0, 0.0, 0.0), lo2 = vec4(0.0, 0.0, 0.0, 0.0), + hi2 = vec4(0.0, 0.0, 0.0, 0.0), wg, cg4, cg4_1; + w = texture(ravu_lite_lut2, vec2(0.1, coord_y)); + wg = max(vec4(0.0, 0.0, 0.0, 0.0), w); + res += inp[local_pos + 0] * w + inp[local_pos + 22] * w.wzyx; + cg4 = + vec4(0.1 + inp[local_pos + 0], 1.1 - inp[local_pos + 0], 0.1 + inp[local_pos + 22], 1.1 - inp[local_pos + 22]); + cg4_1 = cg4; + cg4 *= cg4; + cg4 *= cg4; + cg4 *= cg4; + cg4 *= cg4; + cg4 *= cg4; + hi += cg4.x * wg + cg4.z * wg.wzyx; + lo += cg4.y * wg + cg4.w * wg.wzyx; + cg4 *= cg4_1; + hi2 += cg4.x * wg + cg4.z * wg.wzyx; + lo2 += cg4.y * wg + cg4.w * wg.wzyx; + w = texture(ravu_lite_lut2, vec2(0.3, coord_y)); + wg = max(vec4(0.0, 0.0, 0.0, 0.0), w); + res += inp[local_pos + 1] * w + inp[local_pos + 21] * w.wzyx; + cg4 = + vec4(0.1 + inp[local_pos + 1], 1.1 - inp[local_pos + 1], 0.1 + inp[local_pos + 21], 1.1 - inp[local_pos + 21]); + cg4_1 = cg4; + cg4 *= cg4; + cg4 *= cg4; + cg4 *= cg4; + cg4 *= cg4; + cg4 *= cg4; + hi += cg4.x * wg + cg4.z * wg.wzyx; + lo += cg4.y * wg + cg4.w * wg.wzyx; + cg4 *= cg4_1; + hi2 += cg4.x * wg + cg4.z * wg.wzyx; + lo2 += cg4.y * wg + cg4.w * wg.wzyx; + w = texture(ravu_lite_lut2, vec2(0.5, coord_y)); + wg = max(vec4(0.0, 0.0, 0.0, 0.0), w); + res += inp[local_pos + 2] * w + inp[local_pos + 20] * w.wzyx; + cg4 = + vec4(0.1 + inp[local_pos + 2], 1.1 - inp[local_pos + 2], 0.1 + inp[local_pos + 20], 1.1 - inp[local_pos + 20]); + cg4_1 = cg4; + cg4 *= cg4; + cg4 *= cg4; + cg4 *= cg4; + cg4 *= cg4; + cg4 *= cg4; + hi += cg4.x * wg + cg4.z * wg.wzyx; + lo += cg4.y * wg + cg4.w * wg.wzyx; + cg4 *= cg4_1; + hi2 += cg4.x * wg + cg4.z * wg.wzyx; + lo2 += cg4.y * wg + cg4.w * wg.wzyx; + w = texture(ravu_lite_lut2, vec2(0.7, coord_y)); + wg = max(vec4(0.0, 0.0, 0.0, 0.0), w); + res += inp[local_pos + 10] * w + inp[local_pos + 12] * w.wzyx; + cg4 = vec4(0.1 + inp[local_pos + 10], 1.1 - inp[local_pos + 10], 0.1 + inp[local_pos + 12], + 1.1 - inp[local_pos + 12]); + cg4_1 = cg4; + cg4 *= cg4; + cg4 *= cg4; + cg4 *= cg4; + cg4 *= cg4; + cg4 *= cg4; + hi += cg4.x * wg + cg4.z * wg.wzyx; + lo += cg4.y * wg + cg4.w * wg.wzyx; + cg4 *= cg4_1; + hi2 += cg4.x * wg + cg4.z * wg.wzyx; + lo2 += cg4.y * wg + cg4.w * wg.wzyx; + w = texture(ravu_lite_lut2, vec2(0.9, coord_y)); + wg = max(vec4(0.0, 0.0, 0.0, 0.0), w); + res += inp[local_pos + 11] * w; + vec2 cg2 = vec2(0.1 + inp[local_pos + 11], 1.1 - inp[local_pos + 11]); + vec2 cg2_1 = cg2; + cg2 *= cg2; + cg2 *= cg2; + cg2 *= cg2; + cg2 *= cg2; + cg2 *= cg2; + hi += cg2.x * wg; + lo += cg2.y * wg; + cg2 *= cg2_1; + hi2 += cg2.x * wg; + lo2 += cg2.y * wg; + lo = 1.1 - lo2 / lo; + hi = hi2 / hi - 0.1; + res = mix(res, clamp(res, lo, hi), 0.800000); + imageStore(out_image, ivec2(gl_GlobalInvocationID) * 2 + ivec2(0, 0), vec4(res[0], 0.0, 0.0, 0.0)); + imageStore(out_image, ivec2(gl_GlobalInvocationID) * 2 + ivec2(0, 1), vec4(res[1], 0.0, 0.0, 0.0)); + imageStore(out_image, ivec2(gl_GlobalInvocationID) * 2 + ivec2(1, 0), vec4(res[2], 0.0, 0.0, 0.0)); + imageStore(out_image, ivec2(gl_GlobalInvocationID) * 2 + ivec2(1, 1), vec4(res[3], 0.0, 0.0, 0.0)); +} diff --git a/src/Effects/RAVU/RAVU_Lite_AR_R3.hlsl b/src/Effects/RAVU/RAVU_Lite_AR_R3.hlsl new file mode 100644 index 000000000..0f69785d8 --- /dev/null +++ b/src/Effects/RAVU/RAVU_Lite_AR_R3.hlsl @@ -0,0 +1,268 @@ +// This file is generated by the scripts available at https://github.com/hauuau/magpie-prescalers +// Please don't edit this file directly. +// Generated by: ravu-lite.py --weights-file weights\ravu-lite_weights-r3.py --float-format float16dx --use-compute-shader --anti-ringing 0.8 --use-magpie --overwrite +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +//!MAGPIE EFFECT +//!VERSION 4 + +//!TEXTURE +Texture2D INPUT; + +//!SAMPLER +//!FILTER POINT +SamplerState sam_INPUT; + +//!TEXTURE +//!WIDTH INPUT_WIDTH * 2 +//!HEIGHT INPUT_HEIGHT * 2 +Texture2D OUTPUT; + +//!SAMPLER +//!FILTER LINEAR +SamplerState sam_INPUT_LINEAR; + +//!TEXTURE +//!SOURCE ravu_lite_lut3_f16.dds +//!FORMAT R16G16B16A16_FLOAT +Texture2D ravu_lite_lut3; + +//!SAMPLER +//!FILTER LINEAR +SamplerState sam_ravu_lite_lut3; + +//!COMMON +#include "prescalers.hlsli" + +#define LAST_PASS 1 + +//!PASS 1 +//!DESC RAVU-Lite-AR (r3, compute) +//!IN INPUT, ravu_lite_lut3 +//!OUT OUTPUT +//!BLOCK_SIZE 64, 16 +//!NUM_THREADS 32, 8 +shared float inp[432]; + +#define CURRENT_PASS 1 + +#define GET_SAMPLE(x) dot(x.rgb, rgb2y) +#define imageStore(out_image, pos, val) imageStoreOverride(pos, val.x) +void imageStoreOverride(uint2 pos, float value) { + float2 UV = mul(rgb2uv, INPUT.SampleLevel(sam_INPUT_LINEAR, HOOKED_map(pos), 0).rgb); + OUTPUT[pos] = float4(mul(yuv2rgb, float3(value.x, UV)), 1.0); +} + +#define INPUT_tex(pos) GET_SAMPLE(vec4(texture(INPUT, pos))) +static const float2 INPUT_size = float2(GetInputSize()); +static const float2 INPUT_pt = float2(GetInputPt()); + +#define ravu_lite_lut3_tex(pos) (vec4(texture(ravu_lite_lut3, pos))) + +#define HOOKED_tex(pos) INPUT_tex(pos) +#define HOOKED_size INPUT_size +#define HOOKED_pt INPUT_pt + +void Pass1(uint2 blockStart, uint3 threadId) { + ivec2 group_base = ivec2(gl_WorkGroupID) * ivec2(gl_WorkGroupSize); + int local_pos = int(gl_LocalInvocationID.x) * 12 + int(gl_LocalInvocationID.y); +#pragma warning(disable : 3557) + for (int id = int(gl_LocalInvocationIndex); id < 432; id += int(gl_WorkGroupSize.x * gl_WorkGroupSize.y)) { + uint x = (uint)id / 12, y = (uint)id % 12; + inp[id] = HOOKED_tex(HOOKED_pt * vec2(float(group_base.x + x) + (-1.5), float(group_base.y + y) + (-1.5))).x; + } + barrier(); +#if CURRENT_PASS == LAST_PASS + uint2 destPos = blockStart + threadId.xy * 2; + uint2 outputSize = GetOutputSize(); + if (destPos.x >= outputSize.x || destPos.y >= outputSize.y) { + return; + } +#endif + vec3 abd = vec3(0.0, 0.0, 0.0); + float gx, gy; + gx = (inp[local_pos + 25] - inp[local_pos + 1]) / 2.0; + gy = (inp[local_pos + 14] - inp[local_pos + 12]) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.1018680644198163; + gx = (inp[local_pos + 26] - inp[local_pos + 2]) / 2.0; + gy = (inp[local_pos + 15] - inp[local_pos + 13]) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.11543163961422666; + gx = (inp[local_pos + 27] - inp[local_pos + 3]) / 2.0; + gy = (inp[local_pos + 16] - inp[local_pos + 14]) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.1018680644198163; + gx = (inp[local_pos + 37] - inp[local_pos + 13]) / 2.0; + gy = (inp[local_pos + 26] - inp[local_pos + 24]) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.11543163961422666; + gx = (inp[local_pos + 38] - inp[local_pos + 14]) / 2.0; + gy = (inp[local_pos + 27] - inp[local_pos + 25]) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.13080118386382833; + gx = (inp[local_pos + 39] - inp[local_pos + 15]) / 2.0; + gy = (inp[local_pos + 28] - inp[local_pos + 26]) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.11543163961422666; + gx = (inp[local_pos + 49] - inp[local_pos + 25]) / 2.0; + gy = (inp[local_pos + 38] - inp[local_pos + 36]) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.1018680644198163; + gx = (inp[local_pos + 50] - inp[local_pos + 26]) / 2.0; + gy = (inp[local_pos + 39] - inp[local_pos + 37]) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.11543163961422666; + gx = (inp[local_pos + 51] - inp[local_pos + 27]) / 2.0; + gy = (inp[local_pos + 40] - inp[local_pos + 38]) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.1018680644198163; + float a = abd.x, b = abd.y, d = abd.z; + float T = a + d, D = a * d - b * b; + float delta = sqrt(max(T * T / 4.0 - D, 0.0)); + float L1 = T / 2.0 + delta, L2 = T / 2.0 - delta; + float sqrtL1 = sqrt(L1), sqrtL2 = sqrt(L2); + float theta = mix(mod(atan(L1 - a, b) + 3.141592653589793, 3.141592653589793), 0.0, abs(b) < 1.192092896e-7); + float lambda = sqrtL1; + float mu = mix((sqrtL1 - sqrtL2) / (sqrtL1 + sqrtL2), 0.0, sqrtL1 + sqrtL2 < 1.192092896e-7); + float angle = floor(theta * 24.0 / 3.141592653589793); + float strength = mix(mix(0.0, 1.0, lambda >= 0.004), mix(2.0, 3.0, lambda >= 0.05), lambda >= 0.016); + float coherence = mix(mix(0.0, 1.0, mu >= 0.25), 2.0, mu >= 0.5); + float coord_y = ((angle * 4.0 + strength) * 3.0 + coherence + 0.5) / 288.0; + vec4 res = vec4(0.0, 0.0, 0.0, 0.0), w; + vec4 lo = vec4(0.0, 0.0, 0.0, 0.0), hi = vec4(0.0, 0.0, 0.0, 0.0), lo2 = vec4(0.0, 0.0, 0.0, 0.0), + hi2 = vec4(0.0, 0.0, 0.0, 0.0), wg, cg4, cg4_1; + w = texture(ravu_lite_lut3, vec2(0.038461538461538464, coord_y)); + res += inp[local_pos + 0] * w + inp[local_pos + 52] * w.wzyx; + w = texture(ravu_lite_lut3, vec2(0.11538461538461539, coord_y)); + res += inp[local_pos + 1] * w + inp[local_pos + 51] * w.wzyx; + w = texture(ravu_lite_lut3, vec2(0.19230769230769232, coord_y)); + wg = max(vec4(0.0, 0.0, 0.0, 0.0), w); + res += inp[local_pos + 2] * w + inp[local_pos + 50] * w.wzyx; + cg4 = + vec4(0.1 + inp[local_pos + 2], 1.1 - inp[local_pos + 2], 0.1 + inp[local_pos + 50], 1.1 - inp[local_pos + 50]); + cg4_1 = cg4; + cg4 *= cg4; + cg4 *= cg4; + cg4 *= cg4; + cg4 *= cg4; + cg4 *= cg4; + hi += cg4.x * wg + cg4.z * wg.wzyx; + lo += cg4.y * wg + cg4.w * wg.wzyx; + cg4 *= cg4_1; + hi2 += cg4.x * wg + cg4.z * wg.wzyx; + lo2 += cg4.y * wg + cg4.w * wg.wzyx; + w = texture(ravu_lite_lut3, vec2(0.2692307692307692, coord_y)); + res += inp[local_pos + 3] * w + inp[local_pos + 49] * w.wzyx; + w = texture(ravu_lite_lut3, vec2(0.34615384615384615, coord_y)); + res += inp[local_pos + 4] * w + inp[local_pos + 48] * w.wzyx; + w = texture(ravu_lite_lut3, vec2(0.4230769230769231, coord_y)); + res += inp[local_pos + 12] * w + inp[local_pos + 40] * w.wzyx; + w = texture(ravu_lite_lut3, vec2(0.5, coord_y)); + wg = max(vec4(0.0, 0.0, 0.0, 0.0), w); + res += inp[local_pos + 13] * w + inp[local_pos + 39] * w.wzyx; + cg4 = vec4(0.1 + inp[local_pos + 13], 1.1 - inp[local_pos + 13], 0.1 + inp[local_pos + 39], + 1.1 - inp[local_pos + 39]); + cg4_1 = cg4; + cg4 *= cg4; + cg4 *= cg4; + cg4 *= cg4; + cg4 *= cg4; + cg4 *= cg4; + hi += cg4.x * wg + cg4.z * wg.wzyx; + lo += cg4.y * wg + cg4.w * wg.wzyx; + cg4 *= cg4_1; + hi2 += cg4.x * wg + cg4.z * wg.wzyx; + lo2 += cg4.y * wg + cg4.w * wg.wzyx; + w = texture(ravu_lite_lut3, vec2(0.5769230769230769, coord_y)); + wg = max(vec4(0.0, 0.0, 0.0, 0.0), w); + res += inp[local_pos + 14] * w + inp[local_pos + 38] * w.wzyx; + cg4 = vec4(0.1 + inp[local_pos + 14], 1.1 - inp[local_pos + 14], 0.1 + inp[local_pos + 38], + 1.1 - inp[local_pos + 38]); + cg4_1 = cg4; + cg4 *= cg4; + cg4 *= cg4; + cg4 *= cg4; + cg4 *= cg4; + cg4 *= cg4; + hi += cg4.x * wg + cg4.z * wg.wzyx; + lo += cg4.y * wg + cg4.w * wg.wzyx; + cg4 *= cg4_1; + hi2 += cg4.x * wg + cg4.z * wg.wzyx; + lo2 += cg4.y * wg + cg4.w * wg.wzyx; + w = texture(ravu_lite_lut3, vec2(0.6538461538461539, coord_y)); + wg = max(vec4(0.0, 0.0, 0.0, 0.0), w); + res += inp[local_pos + 15] * w + inp[local_pos + 37] * w.wzyx; + cg4 = vec4(0.1 + inp[local_pos + 15], 1.1 - inp[local_pos + 15], 0.1 + inp[local_pos + 37], + 1.1 - inp[local_pos + 37]); + cg4_1 = cg4; + cg4 *= cg4; + cg4 *= cg4; + cg4 *= cg4; + cg4 *= cg4; + cg4 *= cg4; + hi += cg4.x * wg + cg4.z * wg.wzyx; + lo += cg4.y * wg + cg4.w * wg.wzyx; + cg4 *= cg4_1; + hi2 += cg4.x * wg + cg4.z * wg.wzyx; + lo2 += cg4.y * wg + cg4.w * wg.wzyx; + w = texture(ravu_lite_lut3, vec2(0.7307692307692307, coord_y)); + res += inp[local_pos + 16] * w + inp[local_pos + 36] * w.wzyx; + w = texture(ravu_lite_lut3, vec2(0.8076923076923077, coord_y)); + wg = max(vec4(0.0, 0.0, 0.0, 0.0), w); + res += inp[local_pos + 24] * w + inp[local_pos + 28] * w.wzyx; + cg4 = vec4(0.1 + inp[local_pos + 24], 1.1 - inp[local_pos + 24], 0.1 + inp[local_pos + 28], + 1.1 - inp[local_pos + 28]); + cg4_1 = cg4; + cg4 *= cg4; + cg4 *= cg4; + cg4 *= cg4; + cg4 *= cg4; + cg4 *= cg4; + hi += cg4.x * wg + cg4.z * wg.wzyx; + lo += cg4.y * wg + cg4.w * wg.wzyx; + cg4 *= cg4_1; + hi2 += cg4.x * wg + cg4.z * wg.wzyx; + lo2 += cg4.y * wg + cg4.w * wg.wzyx; + w = texture(ravu_lite_lut3, vec2(0.8846153846153846, coord_y)); + wg = max(vec4(0.0, 0.0, 0.0, 0.0), w); + res += inp[local_pos + 25] * w + inp[local_pos + 27] * w.wzyx; + cg4 = vec4(0.1 + inp[local_pos + 25], 1.1 - inp[local_pos + 25], 0.1 + inp[local_pos + 27], + 1.1 - inp[local_pos + 27]); + cg4_1 = cg4; + cg4 *= cg4; + cg4 *= cg4; + cg4 *= cg4; + cg4 *= cg4; + cg4 *= cg4; + hi += cg4.x * wg + cg4.z * wg.wzyx; + lo += cg4.y * wg + cg4.w * wg.wzyx; + cg4 *= cg4_1; + hi2 += cg4.x * wg + cg4.z * wg.wzyx; + lo2 += cg4.y * wg + cg4.w * wg.wzyx; + w = texture(ravu_lite_lut3, vec2(0.9615384615384616, coord_y)); + wg = max(vec4(0.0, 0.0, 0.0, 0.0), w); + res += inp[local_pos + 26] * w; + vec2 cg2 = vec2(0.1 + inp[local_pos + 26], 1.1 - inp[local_pos + 26]); + vec2 cg2_1 = cg2; + cg2 *= cg2; + cg2 *= cg2; + cg2 *= cg2; + cg2 *= cg2; + cg2 *= cg2; + hi += cg2.x * wg; + lo += cg2.y * wg; + cg2 *= cg2_1; + hi2 += cg2.x * wg; + lo2 += cg2.y * wg; + lo = 1.1 - lo2 / lo; + hi = hi2 / hi - 0.1; + res = mix(res, clamp(res, lo, hi), 0.800000); + imageStore(out_image, ivec2(gl_GlobalInvocationID) * 2 + ivec2(0, 0), vec4(res[0], 0.0, 0.0, 0.0)); + imageStore(out_image, ivec2(gl_GlobalInvocationID) * 2 + ivec2(0, 1), vec4(res[1], 0.0, 0.0, 0.0)); + imageStore(out_image, ivec2(gl_GlobalInvocationID) * 2 + ivec2(1, 0), vec4(res[2], 0.0, 0.0, 0.0)); + imageStore(out_image, ivec2(gl_GlobalInvocationID) * 2 + ivec2(1, 1), vec4(res[3], 0.0, 0.0, 0.0)); +} diff --git a/src/Effects/RAVU/RAVU_Lite_AR_R4.hlsl b/src/Effects/RAVU/RAVU_Lite_AR_R4.hlsl new file mode 100644 index 000000000..243b46d0d --- /dev/null +++ b/src/Effects/RAVU/RAVU_Lite_AR_R4.hlsl @@ -0,0 +1,340 @@ +// This file is generated by the scripts available at https://github.com/hauuau/magpie-prescalers +// Please don't edit this file directly. +// Generated by: ravu-lite.py --weights-file weights\ravu-lite_weights-r4.py --float-format float16dx --use-compute-shader --anti-ringing 0.8 --use-magpie --overwrite +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +//!MAGPIE EFFECT +//!VERSION 4 + +//!TEXTURE +Texture2D INPUT; + +//!SAMPLER +//!FILTER POINT +SamplerState sam_INPUT; + +//!TEXTURE +//!WIDTH INPUT_WIDTH * 2 +//!HEIGHT INPUT_HEIGHT * 2 +Texture2D OUTPUT; + +//!SAMPLER +//!FILTER LINEAR +SamplerState sam_INPUT_LINEAR; + +//!TEXTURE +//!SOURCE ravu_lite_lut4_f16.dds +//!FORMAT R16G16B16A16_FLOAT +Texture2D ravu_lite_lut4; + +//!SAMPLER +//!FILTER LINEAR +SamplerState sam_ravu_lite_lut4; + +//!COMMON +#include "prescalers.hlsli" + +#define LAST_PASS 1 + +//!PASS 1 +//!DESC RAVU-Lite-AR (r4, compute) +//!IN INPUT, ravu_lite_lut4 +//!OUT OUTPUT +//!BLOCK_SIZE 64, 16 +//!NUM_THREADS 32, 8 +shared float inp[532]; + +#define CURRENT_PASS 1 + +#define GET_SAMPLE(x) dot(x.rgb, rgb2y) +#define imageStore(out_image, pos, val) imageStoreOverride(pos, val.x) +void imageStoreOverride(uint2 pos, float value) { + float2 UV = mul(rgb2uv, INPUT.SampleLevel(sam_INPUT_LINEAR, HOOKED_map(pos), 0).rgb); + OUTPUT[pos] = float4(mul(yuv2rgb, float3(value.x, UV)), 1.0); +} + +#define INPUT_tex(pos) GET_SAMPLE(vec4(texture(INPUT, pos))) +static const float2 INPUT_size = float2(GetInputSize()); +static const float2 INPUT_pt = float2(GetInputPt()); + +#define ravu_lite_lut4_tex(pos) (vec4(texture(ravu_lite_lut4, pos))) + +#define HOOKED_tex(pos) INPUT_tex(pos) +#define HOOKED_size INPUT_size +#define HOOKED_pt INPUT_pt + +void Pass1(uint2 blockStart, uint3 threadId) { + ivec2 group_base = ivec2(gl_WorkGroupID) * ivec2(gl_WorkGroupSize); + int local_pos = int(gl_LocalInvocationID.x) * 14 + int(gl_LocalInvocationID.y); +#pragma warning(disable : 3557) + for (int id = int(gl_LocalInvocationIndex); id < 532; id += int(gl_WorkGroupSize.x * gl_WorkGroupSize.y)) { + uint x = (uint)id / 14, y = (uint)id % 14; + inp[id] = HOOKED_tex(HOOKED_pt * vec2(float(group_base.x + x) + (-2.5), float(group_base.y + y) + (-2.5))).x; + } + barrier(); +#if CURRENT_PASS == LAST_PASS + uint2 destPos = blockStart + threadId.xy * 2; + uint2 outputSize = GetOutputSize(); + if (destPos.x >= outputSize.x || destPos.y >= outputSize.y) { + return; + } +#endif + vec3 abd = vec3(0.0, 0.0, 0.0); + float gx, gy; + gx = (inp[local_pos + 29] - inp[local_pos + 1]) / 2.0; + gy = (inp[local_pos + 16] - inp[local_pos + 14]) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.02324683987829437; + gx = (inp[local_pos + 30] - inp[local_pos + 2]) / 2.0; + gy = (inp[local_pos + 17] - inp[local_pos + 15]) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.033823952439922346; + gx = (inp[local_pos + 31] - inp[local_pos + 3]) / 2.0; + gy = (inp[local_pos + 18] - inp[local_pos + 16]) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.038327559383903906; + gx = (inp[local_pos + 32] - inp[local_pos + 4]) / 2.0; + gy = (inp[local_pos + 19] - inp[local_pos + 17]) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.033823952439922346; + gx = (inp[local_pos + 33] - inp[local_pos + 5]) / 2.0; + gy = (inp[local_pos + 20] - inp[local_pos + 18]) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.02324683987829437; + gx = (inp[local_pos + 43] - inp[local_pos + 15]) / 2.0; + gy = (inp[local_pos + 30] - inp[local_pos + 28]) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.033823952439922346; + gx = (inp[local_pos + 44] - inp[local_pos + 16]) / 2.0; + gy = (inp[local_pos + 31] - inp[local_pos + 29]) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.04921356040854137; + gx = (inp[local_pos + 45] - inp[local_pos + 17]) / 2.0; + gy = (inp[local_pos + 32] - inp[local_pos + 30]) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.055766269846849466; + gx = (inp[local_pos + 46] - inp[local_pos + 18]) / 2.0; + gy = (inp[local_pos + 33] - inp[local_pos + 31]) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.04921356040854137; + gx = (inp[local_pos + 47] - inp[local_pos + 19]) / 2.0; + gy = (inp[local_pos + 34] - inp[local_pos + 32]) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.033823952439922346; + gx = (inp[local_pos + 57] - inp[local_pos + 29]) / 2.0; + gy = (inp[local_pos + 44] - inp[local_pos + 42]) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.038327559383903906; + gx = (inp[local_pos + 58] - inp[local_pos + 30]) / 2.0; + gy = (inp[local_pos + 45] - inp[local_pos + 43]) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.055766269846849466; + gx = (inp[local_pos + 59] - inp[local_pos + 31]) / 2.0; + gy = (inp[local_pos + 46] - inp[local_pos + 44]) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06319146241026467; + gx = (inp[local_pos + 60] - inp[local_pos + 32]) / 2.0; + gy = (inp[local_pos + 47] - inp[local_pos + 45]) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.055766269846849466; + gx = (inp[local_pos + 61] - inp[local_pos + 33]) / 2.0; + gy = (inp[local_pos + 48] - inp[local_pos + 46]) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.038327559383903906; + gx = (inp[local_pos + 71] - inp[local_pos + 43]) / 2.0; + gy = (inp[local_pos + 58] - inp[local_pos + 56]) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.033823952439922346; + gx = (inp[local_pos + 72] - inp[local_pos + 44]) / 2.0; + gy = (inp[local_pos + 59] - inp[local_pos + 57]) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.04921356040854137; + gx = (inp[local_pos + 73] - inp[local_pos + 45]) / 2.0; + gy = (inp[local_pos + 60] - inp[local_pos + 58]) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.055766269846849466; + gx = (inp[local_pos + 74] - inp[local_pos + 46]) / 2.0; + gy = (inp[local_pos + 61] - inp[local_pos + 59]) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.04921356040854137; + gx = (inp[local_pos + 75] - inp[local_pos + 47]) / 2.0; + gy = (inp[local_pos + 62] - inp[local_pos + 60]) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.033823952439922346; + gx = (inp[local_pos + 85] - inp[local_pos + 57]) / 2.0; + gy = (inp[local_pos + 72] - inp[local_pos + 70]) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.02324683987829437; + gx = (inp[local_pos + 86] - inp[local_pos + 58]) / 2.0; + gy = (inp[local_pos + 73] - inp[local_pos + 71]) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.033823952439922346; + gx = (inp[local_pos + 87] - inp[local_pos + 59]) / 2.0; + gy = (inp[local_pos + 74] - inp[local_pos + 72]) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.038327559383903906; + gx = (inp[local_pos + 88] - inp[local_pos + 60]) / 2.0; + gy = (inp[local_pos + 75] - inp[local_pos + 73]) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.033823952439922346; + gx = (inp[local_pos + 89] - inp[local_pos + 61]) / 2.0; + gy = (inp[local_pos + 76] - inp[local_pos + 74]) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.02324683987829437; + float a = abd.x, b = abd.y, d = abd.z; + float T = a + d, D = a * d - b * b; + float delta = sqrt(max(T * T / 4.0 - D, 0.0)); + float L1 = T / 2.0 + delta, L2 = T / 2.0 - delta; + float sqrtL1 = sqrt(L1), sqrtL2 = sqrt(L2); + float theta = mix(mod(atan(L1 - a, b) + 3.141592653589793, 3.141592653589793), 0.0, abs(b) < 1.192092896e-7); + float lambda = sqrtL1; + float mu = mix((sqrtL1 - sqrtL2) / (sqrtL1 + sqrtL2), 0.0, sqrtL1 + sqrtL2 < 1.192092896e-7); + float angle = floor(theta * 24.0 / 3.141592653589793); + float strength = mix(mix(0.0, 1.0, lambda >= 0.004), mix(2.0, 3.0, lambda >= 0.05), lambda >= 0.016); + float coherence = mix(mix(0.0, 1.0, mu >= 0.25), 2.0, mu >= 0.5); + float coord_y = ((angle * 4.0 + strength) * 3.0 + coherence + 0.5) / 288.0; + vec4 res = vec4(0.0, 0.0, 0.0, 0.0), w; + vec4 lo = vec4(0.0, 0.0, 0.0, 0.0), hi = vec4(0.0, 0.0, 0.0, 0.0), lo2 = vec4(0.0, 0.0, 0.0, 0.0), + hi2 = vec4(0.0, 0.0, 0.0, 0.0), wg, cg4, cg4_1; + w = texture(ravu_lite_lut4, vec2(0.02, coord_y)); + res += inp[local_pos + 0] * w + inp[local_pos + 90] * w.wzyx; + w = texture(ravu_lite_lut4, vec2(0.06, coord_y)); + res += inp[local_pos + 1] * w + inp[local_pos + 89] * w.wzyx; + w = texture(ravu_lite_lut4, vec2(0.1, coord_y)); + res += inp[local_pos + 2] * w + inp[local_pos + 88] * w.wzyx; + w = texture(ravu_lite_lut4, vec2(0.14, coord_y)); + res += inp[local_pos + 3] * w + inp[local_pos + 87] * w.wzyx; + w = texture(ravu_lite_lut4, vec2(0.18, coord_y)); + res += inp[local_pos + 4] * w + inp[local_pos + 86] * w.wzyx; + w = texture(ravu_lite_lut4, vec2(0.22, coord_y)); + res += inp[local_pos + 5] * w + inp[local_pos + 85] * w.wzyx; + w = texture(ravu_lite_lut4, vec2(0.26, coord_y)); + res += inp[local_pos + 6] * w + inp[local_pos + 84] * w.wzyx; + w = texture(ravu_lite_lut4, vec2(0.3, coord_y)); + res += inp[local_pos + 14] * w + inp[local_pos + 76] * w.wzyx; + w = texture(ravu_lite_lut4, vec2(0.34, coord_y)); + res += inp[local_pos + 15] * w + inp[local_pos + 75] * w.wzyx; + w = texture(ravu_lite_lut4, vec2(0.38, coord_y)); + res += inp[local_pos + 16] * w + inp[local_pos + 74] * w.wzyx; + w = texture(ravu_lite_lut4, vec2(0.42, coord_y)); + wg = max(vec4(0.0, 0.0, 0.0, 0.0), w); + res += inp[local_pos + 17] * w + inp[local_pos + 73] * w.wzyx; + cg4 = vec4(0.1 + inp[local_pos + 17], 1.1 - inp[local_pos + 17], 0.1 + inp[local_pos + 73], + 1.1 - inp[local_pos + 73]); + cg4_1 = cg4; + cg4 *= cg4; + cg4 *= cg4; + cg4 *= cg4; + cg4 *= cg4; + cg4 *= cg4; + hi += cg4.x * wg + cg4.z * wg.wzyx; + lo += cg4.y * wg + cg4.w * wg.wzyx; + cg4 *= cg4_1; + hi2 += cg4.x * wg + cg4.z * wg.wzyx; + lo2 += cg4.y * wg + cg4.w * wg.wzyx; + w = texture(ravu_lite_lut4, vec2(0.46, coord_y)); + res += inp[local_pos + 18] * w + inp[local_pos + 72] * w.wzyx; + w = texture(ravu_lite_lut4, vec2(0.5, coord_y)); + res += inp[local_pos + 19] * w + inp[local_pos + 71] * w.wzyx; + w = texture(ravu_lite_lut4, vec2(0.54, coord_y)); + res += inp[local_pos + 20] * w + inp[local_pos + 70] * w.wzyx; + w = texture(ravu_lite_lut4, vec2(0.58, coord_y)); + res += inp[local_pos + 28] * w + inp[local_pos + 62] * w.wzyx; + w = texture(ravu_lite_lut4, vec2(0.62, coord_y)); + res += inp[local_pos + 29] * w + inp[local_pos + 61] * w.wzyx; + w = texture(ravu_lite_lut4, vec2(0.66, coord_y)); + wg = max(vec4(0.0, 0.0, 0.0, 0.0), w); + res += inp[local_pos + 30] * w + inp[local_pos + 60] * w.wzyx; + cg4 = vec4(0.1 + inp[local_pos + 30], 1.1 - inp[local_pos + 30], 0.1 + inp[local_pos + 60], + 1.1 - inp[local_pos + 60]); + cg4_1 = cg4; + cg4 *= cg4; + cg4 *= cg4; + cg4 *= cg4; + cg4 *= cg4; + cg4 *= cg4; + hi += cg4.x * wg + cg4.z * wg.wzyx; + lo += cg4.y * wg + cg4.w * wg.wzyx; + cg4 *= cg4_1; + hi2 += cg4.x * wg + cg4.z * wg.wzyx; + lo2 += cg4.y * wg + cg4.w * wg.wzyx; + w = texture(ravu_lite_lut4, vec2(0.7, coord_y)); + wg = max(vec4(0.0, 0.0, 0.0, 0.0), w); + res += inp[local_pos + 31] * w + inp[local_pos + 59] * w.wzyx; + cg4 = vec4(0.1 + inp[local_pos + 31], 1.1 - inp[local_pos + 31], 0.1 + inp[local_pos + 59], + 1.1 - inp[local_pos + 59]); + cg4_1 = cg4; + cg4 *= cg4; + cg4 *= cg4; + cg4 *= cg4; + cg4 *= cg4; + cg4 *= cg4; + hi += cg4.x * wg + cg4.z * wg.wzyx; + lo += cg4.y * wg + cg4.w * wg.wzyx; + cg4 *= cg4_1; + hi2 += cg4.x * wg + cg4.z * wg.wzyx; + lo2 += cg4.y * wg + cg4.w * wg.wzyx; + w = texture(ravu_lite_lut4, vec2(0.74, coord_y)); + wg = max(vec4(0.0, 0.0, 0.0, 0.0), w); + res += inp[local_pos + 32] * w + inp[local_pos + 58] * w.wzyx; + cg4 = vec4(0.1 + inp[local_pos + 32], 1.1 - inp[local_pos + 32], 0.1 + inp[local_pos + 58], + 1.1 - inp[local_pos + 58]); + cg4_1 = cg4; + cg4 *= cg4; + cg4 *= cg4; + cg4 *= cg4; + cg4 *= cg4; + cg4 *= cg4; + hi += cg4.x * wg + cg4.z * wg.wzyx; + lo += cg4.y * wg + cg4.w * wg.wzyx; + cg4 *= cg4_1; + hi2 += cg4.x * wg + cg4.z * wg.wzyx; + lo2 += cg4.y * wg + cg4.w * wg.wzyx; + w = texture(ravu_lite_lut4, vec2(0.78, coord_y)); + res += inp[local_pos + 33] * w + inp[local_pos + 57] * w.wzyx; + w = texture(ravu_lite_lut4, vec2(0.82, coord_y)); + res += inp[local_pos + 34] * w + inp[local_pos + 56] * w.wzyx; + w = texture(ravu_lite_lut4, vec2(0.86, coord_y)); + res += inp[local_pos + 42] * w + inp[local_pos + 48] * w.wzyx; + w = texture(ravu_lite_lut4, vec2(0.9, coord_y)); + wg = max(vec4(0.0, 0.0, 0.0, 0.0), w); + res += inp[local_pos + 43] * w + inp[local_pos + 47] * w.wzyx; + cg4 = vec4(0.1 + inp[local_pos + 43], 1.1 - inp[local_pos + 43], 0.1 + inp[local_pos + 47], + 1.1 - inp[local_pos + 47]); + cg4_1 = cg4; + cg4 *= cg4; + cg4 *= cg4; + cg4 *= cg4; + cg4 *= cg4; + cg4 *= cg4; + hi += cg4.x * wg + cg4.z * wg.wzyx; + lo += cg4.y * wg + cg4.w * wg.wzyx; + cg4 *= cg4_1; + hi2 += cg4.x * wg + cg4.z * wg.wzyx; + lo2 += cg4.y * wg + cg4.w * wg.wzyx; + w = texture(ravu_lite_lut4, vec2(0.94, coord_y)); + wg = max(vec4(0.0, 0.0, 0.0, 0.0), w); + res += inp[local_pos + 44] * w + inp[local_pos + 46] * w.wzyx; + cg4 = vec4(0.1 + inp[local_pos + 44], 1.1 - inp[local_pos + 44], 0.1 + inp[local_pos + 46], + 1.1 - inp[local_pos + 46]); + cg4_1 = cg4; + cg4 *= cg4; + cg4 *= cg4; + cg4 *= cg4; + cg4 *= cg4; + cg4 *= cg4; + hi += cg4.x * wg + cg4.z * wg.wzyx; + lo += cg4.y * wg + cg4.w * wg.wzyx; + cg4 *= cg4_1; + hi2 += cg4.x * wg + cg4.z * wg.wzyx; + lo2 += cg4.y * wg + cg4.w * wg.wzyx; + w = texture(ravu_lite_lut4, vec2(0.98, coord_y)); + wg = max(vec4(0.0, 0.0, 0.0, 0.0), w); + res += inp[local_pos + 45] * w; + vec2 cg2 = vec2(0.1 + inp[local_pos + 45], 1.1 - inp[local_pos + 45]); + vec2 cg2_1 = cg2; + cg2 *= cg2; + cg2 *= cg2; + cg2 *= cg2; + cg2 *= cg2; + cg2 *= cg2; + hi += cg2.x * wg; + lo += cg2.y * wg; + cg2 *= cg2_1; + hi2 += cg2.x * wg; + lo2 += cg2.y * wg; + lo = 1.1 - lo2 / lo; + hi = hi2 / hi - 0.1; + res = mix(res, clamp(res, lo, hi), 0.800000); + imageStore(out_image, ivec2(gl_GlobalInvocationID) * 2 + ivec2(0, 0), vec4(res[0], 0.0, 0.0, 0.0)); + imageStore(out_image, ivec2(gl_GlobalInvocationID) * 2 + ivec2(0, 1), vec4(res[1], 0.0, 0.0, 0.0)); + imageStore(out_image, ivec2(gl_GlobalInvocationID) * 2 + ivec2(1, 0), vec4(res[2], 0.0, 0.0, 0.0)); + imageStore(out_image, ivec2(gl_GlobalInvocationID) * 2 + ivec2(1, 1), vec4(res[3], 0.0, 0.0, 0.0)); +} diff --git a/src/Effects/RAVU/RAVU_Lite_R2.hlsl b/src/Effects/RAVU/RAVU_Lite_R2.hlsl new file mode 100644 index 000000000..cb62cb20c --- /dev/null +++ b/src/Effects/RAVU/RAVU_Lite_R2.hlsl @@ -0,0 +1,151 @@ +// This file is generated by the scripts available at https://github.com/hauuau/magpie-prescalers +// Please don't edit this file directly. +// Generated by: ravu-lite.py --weights-file weights\ravu-lite_weights-r2.py --float-format float16dx --use-compute-shader --use-magpie --overwrite +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +//!MAGPIE EFFECT +//!VERSION 4 + +//!TEXTURE +Texture2D INPUT; + +//!SAMPLER +//!FILTER POINT +SamplerState sam_INPUT; + +//!TEXTURE +//!WIDTH INPUT_WIDTH * 2 +//!HEIGHT INPUT_HEIGHT * 2 +Texture2D OUTPUT; + +//!SAMPLER +//!FILTER LINEAR +SamplerState sam_INPUT_LINEAR; + +//!TEXTURE +//!SOURCE ravu_lite_lut2_f16.dds +//!FORMAT R16G16B16A16_FLOAT +Texture2D ravu_lite_lut2; + +//!SAMPLER +//!FILTER LINEAR +SamplerState sam_ravu_lite_lut2; + +//!COMMON +#include "prescalers.hlsli" + +#define LAST_PASS 1 + +//!PASS 1 +//!DESC RAVU-Lite (r2, compute) +//!IN INPUT, ravu_lite_lut2 +//!OUT OUTPUT +//!BLOCK_SIZE 64, 16 +//!NUM_THREADS 32, 8 +shared float inp[340]; + +#define CURRENT_PASS 1 + +#define GET_SAMPLE(x) dot(x.rgb, rgb2y) +#define imageStore(out_image, pos, val) imageStoreOverride(pos, val.x) +void imageStoreOverride(uint2 pos, float value) { + float2 UV = mul(rgb2uv, INPUT.SampleLevel(sam_INPUT_LINEAR, HOOKED_map(pos), 0).rgb); + OUTPUT[pos] = float4(mul(yuv2rgb, float3(value.x, UV)), 1.0); +} + +#define INPUT_tex(pos) GET_SAMPLE(vec4(texture(INPUT, pos))) +static const float2 INPUT_size = float2(GetInputSize()); +static const float2 INPUT_pt = float2(GetInputPt()); + +#define ravu_lite_lut2_tex(pos) (vec4(texture(ravu_lite_lut2, pos))) + +#define HOOKED_tex(pos) INPUT_tex(pos) +#define HOOKED_size INPUT_size +#define HOOKED_pt INPUT_pt + +void Pass1(uint2 blockStart, uint3 threadId) { + ivec2 group_base = ivec2(gl_WorkGroupID) * ivec2(gl_WorkGroupSize); + int local_pos = int(gl_LocalInvocationID.x) * 10 + int(gl_LocalInvocationID.y); +#pragma warning(disable : 3557) + for (int id = int(gl_LocalInvocationIndex); id < 340; id += int(gl_WorkGroupSize.x * gl_WorkGroupSize.y)) { + uint x = (uint)id / 10, y = (uint)id % 10; + inp[id] = HOOKED_tex(HOOKED_pt * vec2(float(group_base.x + x) + (-0.5), float(group_base.y + y) + (-0.5))).x; + } + barrier(); +#if CURRENT_PASS == LAST_PASS + uint2 destPos = blockStart + threadId.xy * 2; + uint2 outputSize = GetOutputSize(); + if (destPos.x >= outputSize.x || destPos.y >= outputSize.y) { + return; + } +#endif + vec3 abd = vec3(0.0, 0.0, 0.0); + float gx, gy; + gx = (inp[local_pos + 10] - inp[local_pos + 0]); + gy = (inp[local_pos + 1] - inp[local_pos + 0]); + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.1018680644198163; + gx = (inp[local_pos + 11] - inp[local_pos + 1]); + gy = (inp[local_pos + 2] - inp[local_pos + 0]) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.11543163961422666; + gx = (inp[local_pos + 12] - inp[local_pos + 2]); + gy = (inp[local_pos + 2] - inp[local_pos + 1]); + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.1018680644198163; + gx = (inp[local_pos + 20] - inp[local_pos + 0]) / 2.0; + gy = (inp[local_pos + 11] - inp[local_pos + 10]); + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.11543163961422666; + gx = (inp[local_pos + 21] - inp[local_pos + 1]) / 2.0; + gy = (inp[local_pos + 12] - inp[local_pos + 10]) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.13080118386382833; + gx = (inp[local_pos + 22] - inp[local_pos + 2]) / 2.0; + gy = (inp[local_pos + 12] - inp[local_pos + 11]); + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.11543163961422666; + gx = (inp[local_pos + 20] - inp[local_pos + 10]); + gy = (inp[local_pos + 21] - inp[local_pos + 20]); + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.1018680644198163; + gx = (inp[local_pos + 21] - inp[local_pos + 11]); + gy = (inp[local_pos + 22] - inp[local_pos + 20]) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.11543163961422666; + gx = (inp[local_pos + 22] - inp[local_pos + 12]); + gy = (inp[local_pos + 22] - inp[local_pos + 21]); + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.1018680644198163; + float a = abd.x, b = abd.y, d = abd.z; + float T = a + d, D = a * d - b * b; + float delta = sqrt(max(T * T / 4.0 - D, 0.0)); + float L1 = T / 2.0 + delta, L2 = T / 2.0 - delta; + float sqrtL1 = sqrt(L1), sqrtL2 = sqrt(L2); + float theta = mix(mod(atan(L1 - a, b) + 3.141592653589793, 3.141592653589793), 0.0, abs(b) < 1.192092896e-7); + float lambda = sqrtL1; + float mu = mix((sqrtL1 - sqrtL2) / (sqrtL1 + sqrtL2), 0.0, sqrtL1 + sqrtL2 < 1.192092896e-7); + float angle = floor(theta * 24.0 / 3.141592653589793); + float strength = mix(mix(0.0, 1.0, lambda >= 0.004), mix(2.0, 3.0, lambda >= 0.05), lambda >= 0.016); + float coherence = mix(mix(0.0, 1.0, mu >= 0.25), 2.0, mu >= 0.5); + float coord_y = ((angle * 4.0 + strength) * 3.0 + coherence + 0.5) / 288.0; + vec4 res = vec4(0.0, 0.0, 0.0, 0.0), w; + w = texture(ravu_lite_lut2, vec2(0.1, coord_y)); + res += inp[local_pos + 0] * w + inp[local_pos + 22] * w.wzyx; + w = texture(ravu_lite_lut2, vec2(0.3, coord_y)); + res += inp[local_pos + 1] * w + inp[local_pos + 21] * w.wzyx; + w = texture(ravu_lite_lut2, vec2(0.5, coord_y)); + res += inp[local_pos + 2] * w + inp[local_pos + 20] * w.wzyx; + w = texture(ravu_lite_lut2, vec2(0.7, coord_y)); + res += inp[local_pos + 10] * w + inp[local_pos + 12] * w.wzyx; + w = texture(ravu_lite_lut2, vec2(0.9, coord_y)); + res += inp[local_pos + 11] * w; + res = clamp(res, 0.0, 1.0); + imageStore(out_image, ivec2(gl_GlobalInvocationID) * 2 + ivec2(0, 0), vec4(res[0], 0.0, 0.0, 0.0)); + imageStore(out_image, ivec2(gl_GlobalInvocationID) * 2 + ivec2(0, 1), vec4(res[1], 0.0, 0.0, 0.0)); + imageStore(out_image, ivec2(gl_GlobalInvocationID) * 2 + ivec2(1, 0), vec4(res[2], 0.0, 0.0, 0.0)); + imageStore(out_image, ivec2(gl_GlobalInvocationID) * 2 + ivec2(1, 1), vec4(res[3], 0.0, 0.0, 0.0)); +} diff --git a/src/Effects/RAVU/RAVU_Lite_R3.hlsl b/src/Effects/RAVU/RAVU_Lite_R3.hlsl index a9c3564cb..467a5b112 100644 --- a/src/Effects/RAVU/RAVU_Lite_R3.hlsl +++ b/src/Effects/RAVU/RAVU_Lite_R3.hlsl @@ -1,174 +1,167 @@ -// ravu-lite-r3 -// 移植自 https://github.com/bjin/mpv-prescalers/blob/cc02ed95c1fe05b72bc21d41257c4c085e6e409b/ravu-lite-r3.hook +// This file is generated by the scripts available at https://github.com/hauuau/magpie-prescalers +// Please don't edit this file directly. +// Generated by: ravu-lite.py --weights-file weights\ravu-lite_weights-r3.py --float-format float16dx --use-compute-shader --use-magpie --overwrite +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . //!MAGPIE EFFECT -//!VERSION 3 -//!OUTPUT_WIDTH INPUT_WIDTH * 2 -//!OUTPUT_HEIGHT INPUT_HEIGHT * 2 - +//!VERSION 4 //!TEXTURE Texture2D INPUT; -//!TEXTURE -//!SOURCE RAVU_Lite_R3_Weights.dds -//!FORMAT R16G16B16A16_FLOAT -Texture2D ravu_lite_lut3; - //!SAMPLER //!FILTER POINT -SamplerState sam; +SamplerState sam_INPUT; + +//!TEXTURE +//!WIDTH INPUT_WIDTH * 2 +//!HEIGHT INPUT_HEIGHT * 2 +Texture2D OUTPUT; //!SAMPLER //!FILTER LINEAR -SamplerState sam1; +SamplerState sam_INPUT_LINEAR; -//!PASS 1 -//!IN INPUT, ravu_lite_lut3 -//!BLOCK_SIZE 32, 16 -//!NUM_THREADS 16, 8 - -#pragma warning(disable: 3557) // X3557: loop only executes for 1 iteration(s), forcing loop to unroll +//!TEXTURE +//!SOURCE ravu_lite_lut3_f16.dds +//!FORMAT R16G16B16A16_FLOAT +Texture2D ravu_lite_lut3; -#define NUM_PIXELS_X (MP_BLOCK_WIDTH + 4) -#define NUM_PIXELS_Y (MP_BLOCK_HEIGHT + 4) +//!SAMPLER +//!FILTER LINEAR +SamplerState sam_ravu_lite_lut3; -groupshared float inp[NUM_PIXELS_Y][NUM_PIXELS_X]; +//!COMMON +#include "prescalers.hlsli" -#define PI 3.1415926535897932384626433832795 +#define LAST_PASS 1 -float GetLuma(float3 color) { - return dot(float3(0.299f, 0.587f, 0.114f), color); +//!PASS 1 +//!DESC RAVU-Lite (r3, compute) +//!IN INPUT, ravu_lite_lut3 +//!OUT OUTPUT +//!BLOCK_SIZE 64, 16 +//!NUM_THREADS 32, 8 +shared float inp[432]; + +#define CURRENT_PASS 1 + +#define GET_SAMPLE(x) dot(x.rgb, rgb2y) +#define imageStore(out_image, pos, val) imageStoreOverride(pos, val.x) +void imageStoreOverride(uint2 pos, float value) { + float2 UV = mul(rgb2uv, INPUT.SampleLevel(sam_INPUT_LINEAR, HOOKED_map(pos), 0).rgb); + OUTPUT[pos] = float4(mul(yuv2rgb, float3(value.x, UV)), 1.0); } -const static float2x3 rgb2uv = { - -0.169, -0.331, 0.5, - 0.5, -0.419, -0.081 -}; +#define INPUT_tex(pos) GET_SAMPLE(vec4(texture(INPUT, pos))) +static const float2 INPUT_size = float2(GetInputSize()); +static const float2 INPUT_pt = float2(GetInputPt()); -const static float3x3 yuv2rgb = { - 1, -0.00093, 1.401687, - 1, -0.3437, -0.71417, - 1, 1.77216, 0.00099 -}; +#define ravu_lite_lut3_tex(pos) (vec4(texture(ravu_lite_lut3, pos))) -float mod(float x, float y) { - return x - y * floor(x / y); -} +#define HOOKED_tex(pos) INPUT_tex(pos) +#define HOOKED_size INPUT_size +#define HOOKED_pt INPUT_pt void Pass1(uint2 blockStart, uint3 threadId) { - const float2 inputPt = GetInputPt(); - - for (int id = threadId.y * MP_NUM_THREADS_X + threadId.x; id < NUM_PIXELS_X * NUM_PIXELS_Y; id += MP_NUM_THREADS_X * MP_NUM_THREADS_Y) { - uint2 pos = { (uint)id % NUM_PIXELS_X, (uint)id / NUM_PIXELS_X }; - inp[pos.y][pos.x] = GetLuma(INPUT.SampleLevel(sam, inputPt * ((blockStart / 2) + pos - 1.5f), 0).rgb); + ivec2 group_base = ivec2(gl_WorkGroupID) * ivec2(gl_WorkGroupSize); + int local_pos = int(gl_LocalInvocationID.x) * 12 + int(gl_LocalInvocationID.y); +#pragma warning(disable : 3557) + for (int id = int(gl_LocalInvocationIndex); id < 432; id += int(gl_WorkGroupSize.x * gl_WorkGroupSize.y)) { + uint x = (uint)id / 12, y = (uint)id % 12; + inp[id] = HOOKED_tex(HOOKED_pt * vec2(float(group_base.x + x) + (-1.5), float(group_base.y + y) + (-1.5))).x; } - - GroupMemoryBarrierWithGroupSync(); - + barrier(); +#if CURRENT_PASS == LAST_PASS uint2 destPos = blockStart + threadId.xy * 2; - if (!CheckViewport(destPos)) { + uint2 outputSize = GetOutputSize(); + if (destPos.x >= outputSize.x || destPos.y >= outputSize.y) { return; } - - float src[5][5]; - [unroll] - for (uint i = 0; i < 5; ++i) { - [unroll] - for (uint j = 0; j < 5; ++j) { - src[j][i] = inp[threadId.y + i][threadId.x + j]; - } - } - - float3 abd = 0; +#endif + vec3 abd = vec3(0.0, 0.0, 0.0); float gx, gy; - gx = (src[2][1] - src[0][1]) / 2.0; - gy = (src[1][2] - src[1][0]) / 2.0; - abd += float3(gx * gx, gx * gy, gy * gy) * 0.1018680644198163; - gx = (src[2][2] - src[0][2]) / 2.0; - gy = (src[1][3] - src[1][1]) / 2.0; - abd += float3(gx * gx, gx * gy, gy * gy) * 0.11543163961422666; - gx = (src[2][3] - src[0][3]) / 2.0; - gy = (src[1][4] - src[1][2]) / 2.0; - abd += float3(gx * gx, gx * gy, gy * gy) * 0.1018680644198163; - gx = (src[3][1] - src[1][1]) / 2.0; - gy = (src[2][2] - src[2][0]) / 2.0; - abd += float3(gx * gx, gx * gy, gy * gy) * 0.11543163961422666; - gx = (src[3][2] - src[1][2]) / 2.0; - gy = (src[2][3] - src[2][1]) / 2.0; - abd += float3(gx * gx, gx * gy, gy * gy) * 0.13080118386382833; - gx = (src[3][3] - src[1][3]) / 2.0; - gy = (src[2][4] - src[2][2]) / 2.0; - abd += float3(gx * gx, gx * gy, gy * gy) * 0.11543163961422666; - gx = (src[4][1] - src[2][1]) / 2.0; - gy = (src[3][2] - src[3][0]) / 2.0; - abd += float3(gx * gx, gx * gy, gy * gy) * 0.1018680644198163; - gx = (src[4][2] - src[2][2]) / 2.0; - gy = (src[3][3] - src[3][1]) / 2.0; - abd += float3(gx * gx, gx * gy, gy * gy) * 0.11543163961422666; - gx = (src[4][3] - src[2][3]) / 2.0; - gy = (src[3][4] - src[3][2]) / 2.0; - abd += float3(gx * gx, gx * gy, gy * gy) * 0.1018680644198163; + gx = (inp[local_pos + 25] - inp[local_pos + 1]) / 2.0; + gy = (inp[local_pos + 14] - inp[local_pos + 12]) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.1018680644198163; + gx = (inp[local_pos + 26] - inp[local_pos + 2]) / 2.0; + gy = (inp[local_pos + 15] - inp[local_pos + 13]) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.11543163961422666; + gx = (inp[local_pos + 27] - inp[local_pos + 3]) / 2.0; + gy = (inp[local_pos + 16] - inp[local_pos + 14]) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.1018680644198163; + gx = (inp[local_pos + 37] - inp[local_pos + 13]) / 2.0; + gy = (inp[local_pos + 26] - inp[local_pos + 24]) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.11543163961422666; + gx = (inp[local_pos + 38] - inp[local_pos + 14]) / 2.0; + gy = (inp[local_pos + 27] - inp[local_pos + 25]) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.13080118386382833; + gx = (inp[local_pos + 39] - inp[local_pos + 15]) / 2.0; + gy = (inp[local_pos + 28] - inp[local_pos + 26]) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.11543163961422666; + gx = (inp[local_pos + 49] - inp[local_pos + 25]) / 2.0; + gy = (inp[local_pos + 38] - inp[local_pos + 36]) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.1018680644198163; + gx = (inp[local_pos + 50] - inp[local_pos + 26]) / 2.0; + gy = (inp[local_pos + 39] - inp[local_pos + 37]) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.11543163961422666; + gx = (inp[local_pos + 51] - inp[local_pos + 27]) / 2.0; + gy = (inp[local_pos + 40] - inp[local_pos + 38]) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.1018680644198163; float a = abd.x, b = abd.y, d = abd.z; float T = a + d, D = a * d - b * b; float delta = sqrt(max(T * T / 4.0 - D, 0.0)); float L1 = T / 2.0 + delta, L2 = T / 2.0 - delta; float sqrtL1 = sqrt(L1), sqrtL2 = sqrt(L2); - float theta = lerp(mod(atan2(b, L1 - a) + PI, PI), 0.0, abs(b) < 1.192092896e-7); + float theta = mix(mod(atan(L1 - a, b) + 3.141592653589793, 3.141592653589793), 0.0, abs(b) < 1.192092896e-7); float lambda = sqrtL1; - float mu = lerp((sqrtL1 - sqrtL2) / (sqrtL1 + sqrtL2), 0.0, sqrtL1 + sqrtL2 < 1.192092896e-7); - float angle = floor(theta * 24.0 / PI); - float strength = lerp(lerp(0.0, 1.0, lambda >= 0.004), lerp(2.0, 3.0, lambda >= 0.05), lambda >= 0.016); - float coherence = lerp(lerp(0.0, 1.0, mu >= 0.25), 2.0, mu >= 0.5); - float coord_y = ((angle * 4.0f + strength) * 3.0f + coherence + 0.5f) / 288.0f; - float4 res = 0, w; - w = ravu_lite_lut3.SampleLevel(sam, float2(0.038461538461538464, coord_y), 0); - res += src[0][0] * w + src[4][4] * w.wzyx; - w = ravu_lite_lut3.SampleLevel(sam, float2(0.11538461538461539, coord_y), 0); - res += src[0][1] * w + src[4][3] * w.wzyx; - w = ravu_lite_lut3.SampleLevel(sam, float2(0.19230769230769232, coord_y), 0); - res += src[0][2] * w + src[4][2] * w.wzyx; - w = ravu_lite_lut3.SampleLevel(sam, float2(0.2692307692307692, coord_y), 0); - res += src[0][3] * w + src[4][1] * w.wzyx; - w = ravu_lite_lut3.SampleLevel(sam, float2(0.34615384615384615, coord_y), 0); - res += src[0][4] * w + src[4][0] * w.wzyx; - w = ravu_lite_lut3.SampleLevel(sam, float2(0.4230769230769231, coord_y), 0); - res += src[1][0] * w + src[3][4] * w.wzyx; - w = ravu_lite_lut3.SampleLevel(sam, float2(0.5, coord_y), 0); - res += src[1][1] * w + src[3][3] * w.wzyx; - w = ravu_lite_lut3.SampleLevel(sam, float2(0.5769230769230769, coord_y), 0); - res += src[1][2] * w + src[3][2] * w.wzyx; - w = ravu_lite_lut3.SampleLevel(sam, float2(0.6538461538461539, coord_y), 0); - res += src[1][3] * w + src[3][1] * w.wzyx; - w = ravu_lite_lut3.SampleLevel(sam, float2(0.7307692307692307, coord_y), 0); - res += src[1][4] * w + src[3][0] * w.wzyx; - w = ravu_lite_lut3.SampleLevel(sam, float2(0.8076923076923077, coord_y), 0); - res += src[2][0] * w + src[2][4] * w.wzyx; - w = ravu_lite_lut3.SampleLevel(sam, float2(0.8846153846153846, coord_y), 0); - res += src[2][1] * w + src[2][3] * w.wzyx; - w = ravu_lite_lut3.SampleLevel(sam, float2(0.9615384615384616, coord_y), 0); - res += src[2][2] * w; - res = saturate(res); - - const float2 outputPt = GetOutputPt(); - float2 originUV = mul(rgb2uv, INPUT.SampleLevel(sam1, (destPos + 0.5f) * outputPt, 0).rgb); - WriteToOutput(destPos, mul(yuv2rgb, float3(res.x, originUV))); - - ++destPos.y; - if (CheckViewport(destPos)) { - originUV = mul(rgb2uv, INPUT.SampleLevel(sam1, (destPos + 0.5f) * outputPt, 0).rgb); - WriteToOutput(destPos, mul(yuv2rgb, float3(res.y, originUV))); - } - - ++destPos.x; - if (CheckViewport(destPos)) { - originUV = mul(rgb2uv, INPUT.SampleLevel(sam1, (destPos + 0.5f) * outputPt, 0).rgb); - WriteToOutput(destPos, mul(yuv2rgb, float3(res.w, originUV))); - } - - --destPos.y; - if (CheckViewport(destPos)) { - originUV = mul(rgb2uv, INPUT.SampleLevel(sam1, (destPos + 0.5f) * outputPt, 0).rgb); - WriteToOutput(destPos, mul(yuv2rgb, float3(res.z, originUV))); - } + float mu = mix((sqrtL1 - sqrtL2) / (sqrtL1 + sqrtL2), 0.0, sqrtL1 + sqrtL2 < 1.192092896e-7); + float angle = floor(theta * 24.0 / 3.141592653589793); + float strength = mix(mix(0.0, 1.0, lambda >= 0.004), mix(2.0, 3.0, lambda >= 0.05), lambda >= 0.016); + float coherence = mix(mix(0.0, 1.0, mu >= 0.25), 2.0, mu >= 0.5); + float coord_y = ((angle * 4.0 + strength) * 3.0 + coherence + 0.5) / 288.0; + vec4 res = vec4(0.0, 0.0, 0.0, 0.0), w; + w = texture(ravu_lite_lut3, vec2(0.038461538461538464, coord_y)); + res += inp[local_pos + 0] * w + inp[local_pos + 52] * w.wzyx; + w = texture(ravu_lite_lut3, vec2(0.11538461538461539, coord_y)); + res += inp[local_pos + 1] * w + inp[local_pos + 51] * w.wzyx; + w = texture(ravu_lite_lut3, vec2(0.19230769230769232, coord_y)); + res += inp[local_pos + 2] * w + inp[local_pos + 50] * w.wzyx; + w = texture(ravu_lite_lut3, vec2(0.2692307692307692, coord_y)); + res += inp[local_pos + 3] * w + inp[local_pos + 49] * w.wzyx; + w = texture(ravu_lite_lut3, vec2(0.34615384615384615, coord_y)); + res += inp[local_pos + 4] * w + inp[local_pos + 48] * w.wzyx; + w = texture(ravu_lite_lut3, vec2(0.4230769230769231, coord_y)); + res += inp[local_pos + 12] * w + inp[local_pos + 40] * w.wzyx; + w = texture(ravu_lite_lut3, vec2(0.5, coord_y)); + res += inp[local_pos + 13] * w + inp[local_pos + 39] * w.wzyx; + w = texture(ravu_lite_lut3, vec2(0.5769230769230769, coord_y)); + res += inp[local_pos + 14] * w + inp[local_pos + 38] * w.wzyx; + w = texture(ravu_lite_lut3, vec2(0.6538461538461539, coord_y)); + res += inp[local_pos + 15] * w + inp[local_pos + 37] * w.wzyx; + w = texture(ravu_lite_lut3, vec2(0.7307692307692307, coord_y)); + res += inp[local_pos + 16] * w + inp[local_pos + 36] * w.wzyx; + w = texture(ravu_lite_lut3, vec2(0.8076923076923077, coord_y)); + res += inp[local_pos + 24] * w + inp[local_pos + 28] * w.wzyx; + w = texture(ravu_lite_lut3, vec2(0.8846153846153846, coord_y)); + res += inp[local_pos + 25] * w + inp[local_pos + 27] * w.wzyx; + w = texture(ravu_lite_lut3, vec2(0.9615384615384616, coord_y)); + res += inp[local_pos + 26] * w; + res = clamp(res, 0.0, 1.0); + imageStore(out_image, ivec2(gl_GlobalInvocationID) * 2 + ivec2(0, 0), vec4(res[0], 0.0, 0.0, 0.0)); + imageStore(out_image, ivec2(gl_GlobalInvocationID) * 2 + ivec2(0, 1), vec4(res[1], 0.0, 0.0, 0.0)); + imageStore(out_image, ivec2(gl_GlobalInvocationID) * 2 + ivec2(1, 0), vec4(res[2], 0.0, 0.0, 0.0)); + imageStore(out_image, ivec2(gl_GlobalInvocationID) * 2 + ivec2(1, 1), vec4(res[3], 0.0, 0.0, 0.0)); } diff --git a/src/Effects/RAVU/RAVU_Lite_R4.hlsl b/src/Effects/RAVU/RAVU_Lite_R4.hlsl new file mode 100644 index 000000000..ab6db274e --- /dev/null +++ b/src/Effects/RAVU/RAVU_Lite_R4.hlsl @@ -0,0 +1,239 @@ +// This file is generated by the scripts available at https://github.com/hauuau/magpie-prescalers +// Please don't edit this file directly. +// Generated by: ravu-lite.py --weights-file weights\ravu-lite_weights-r4.py --float-format float16dx --use-compute-shader --use-magpie --overwrite +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +//!MAGPIE EFFECT +//!VERSION 4 + +//!TEXTURE +Texture2D INPUT; + +//!SAMPLER +//!FILTER POINT +SamplerState sam_INPUT; + +//!TEXTURE +//!WIDTH INPUT_WIDTH * 2 +//!HEIGHT INPUT_HEIGHT * 2 +Texture2D OUTPUT; + +//!SAMPLER +//!FILTER LINEAR +SamplerState sam_INPUT_LINEAR; + +//!TEXTURE +//!SOURCE ravu_lite_lut4_f16.dds +//!FORMAT R16G16B16A16_FLOAT +Texture2D ravu_lite_lut4; + +//!SAMPLER +//!FILTER LINEAR +SamplerState sam_ravu_lite_lut4; + +//!COMMON +#include "prescalers.hlsli" + +#define LAST_PASS 1 + +//!PASS 1 +//!DESC RAVU-Lite (r4, compute) +//!IN INPUT, ravu_lite_lut4 +//!OUT OUTPUT +//!BLOCK_SIZE 64, 16 +//!NUM_THREADS 32, 8 +shared float inp[532]; + +#define CURRENT_PASS 1 + +#define GET_SAMPLE(x) dot(x.rgb, rgb2y) +#define imageStore(out_image, pos, val) imageStoreOverride(pos, val.x) +void imageStoreOverride(uint2 pos, float value) { + float2 UV = mul(rgb2uv, INPUT.SampleLevel(sam_INPUT_LINEAR, HOOKED_map(pos), 0).rgb); + OUTPUT[pos] = float4(mul(yuv2rgb, float3(value.x, UV)), 1.0); +} + +#define INPUT_tex(pos) GET_SAMPLE(vec4(texture(INPUT, pos))) +static const float2 INPUT_size = float2(GetInputSize()); +static const float2 INPUT_pt = float2(GetInputPt()); + +#define ravu_lite_lut4_tex(pos) (vec4(texture(ravu_lite_lut4, pos))) + +#define HOOKED_tex(pos) INPUT_tex(pos) +#define HOOKED_size INPUT_size +#define HOOKED_pt INPUT_pt + +void Pass1(uint2 blockStart, uint3 threadId) { + ivec2 group_base = ivec2(gl_WorkGroupID) * ivec2(gl_WorkGroupSize); + int local_pos = int(gl_LocalInvocationID.x) * 14 + int(gl_LocalInvocationID.y); +#pragma warning(disable : 3557) + for (int id = int(gl_LocalInvocationIndex); id < 532; id += int(gl_WorkGroupSize.x * gl_WorkGroupSize.y)) { + uint x = (uint)id / 14, y = (uint)id % 14; + inp[id] = HOOKED_tex(HOOKED_pt * vec2(float(group_base.x + x) + (-2.5), float(group_base.y + y) + (-2.5))).x; + } + barrier(); +#if CURRENT_PASS == LAST_PASS + uint2 destPos = blockStart + threadId.xy * 2; + uint2 outputSize = GetOutputSize(); + if (destPos.x >= outputSize.x || destPos.y >= outputSize.y) { + return; + } +#endif + vec3 abd = vec3(0.0, 0.0, 0.0); + float gx, gy; + gx = (inp[local_pos + 29] - inp[local_pos + 1]) / 2.0; + gy = (inp[local_pos + 16] - inp[local_pos + 14]) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.02324683987829437; + gx = (inp[local_pos + 30] - inp[local_pos + 2]) / 2.0; + gy = (inp[local_pos + 17] - inp[local_pos + 15]) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.033823952439922346; + gx = (inp[local_pos + 31] - inp[local_pos + 3]) / 2.0; + gy = (inp[local_pos + 18] - inp[local_pos + 16]) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.038327559383903906; + gx = (inp[local_pos + 32] - inp[local_pos + 4]) / 2.0; + gy = (inp[local_pos + 19] - inp[local_pos + 17]) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.033823952439922346; + gx = (inp[local_pos + 33] - inp[local_pos + 5]) / 2.0; + gy = (inp[local_pos + 20] - inp[local_pos + 18]) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.02324683987829437; + gx = (inp[local_pos + 43] - inp[local_pos + 15]) / 2.0; + gy = (inp[local_pos + 30] - inp[local_pos + 28]) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.033823952439922346; + gx = (inp[local_pos + 44] - inp[local_pos + 16]) / 2.0; + gy = (inp[local_pos + 31] - inp[local_pos + 29]) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.04921356040854137; + gx = (inp[local_pos + 45] - inp[local_pos + 17]) / 2.0; + gy = (inp[local_pos + 32] - inp[local_pos + 30]) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.055766269846849466; + gx = (inp[local_pos + 46] - inp[local_pos + 18]) / 2.0; + gy = (inp[local_pos + 33] - inp[local_pos + 31]) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.04921356040854137; + gx = (inp[local_pos + 47] - inp[local_pos + 19]) / 2.0; + gy = (inp[local_pos + 34] - inp[local_pos + 32]) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.033823952439922346; + gx = (inp[local_pos + 57] - inp[local_pos + 29]) / 2.0; + gy = (inp[local_pos + 44] - inp[local_pos + 42]) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.038327559383903906; + gx = (inp[local_pos + 58] - inp[local_pos + 30]) / 2.0; + gy = (inp[local_pos + 45] - inp[local_pos + 43]) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.055766269846849466; + gx = (inp[local_pos + 59] - inp[local_pos + 31]) / 2.0; + gy = (inp[local_pos + 46] - inp[local_pos + 44]) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06319146241026467; + gx = (inp[local_pos + 60] - inp[local_pos + 32]) / 2.0; + gy = (inp[local_pos + 47] - inp[local_pos + 45]) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.055766269846849466; + gx = (inp[local_pos + 61] - inp[local_pos + 33]) / 2.0; + gy = (inp[local_pos + 48] - inp[local_pos + 46]) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.038327559383903906; + gx = (inp[local_pos + 71] - inp[local_pos + 43]) / 2.0; + gy = (inp[local_pos + 58] - inp[local_pos + 56]) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.033823952439922346; + gx = (inp[local_pos + 72] - inp[local_pos + 44]) / 2.0; + gy = (inp[local_pos + 59] - inp[local_pos + 57]) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.04921356040854137; + gx = (inp[local_pos + 73] - inp[local_pos + 45]) / 2.0; + gy = (inp[local_pos + 60] - inp[local_pos + 58]) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.055766269846849466; + gx = (inp[local_pos + 74] - inp[local_pos + 46]) / 2.0; + gy = (inp[local_pos + 61] - inp[local_pos + 59]) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.04921356040854137; + gx = (inp[local_pos + 75] - inp[local_pos + 47]) / 2.0; + gy = (inp[local_pos + 62] - inp[local_pos + 60]) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.033823952439922346; + gx = (inp[local_pos + 85] - inp[local_pos + 57]) / 2.0; + gy = (inp[local_pos + 72] - inp[local_pos + 70]) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.02324683987829437; + gx = (inp[local_pos + 86] - inp[local_pos + 58]) / 2.0; + gy = (inp[local_pos + 73] - inp[local_pos + 71]) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.033823952439922346; + gx = (inp[local_pos + 87] - inp[local_pos + 59]) / 2.0; + gy = (inp[local_pos + 74] - inp[local_pos + 72]) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.038327559383903906; + gx = (inp[local_pos + 88] - inp[local_pos + 60]) / 2.0; + gy = (inp[local_pos + 75] - inp[local_pos + 73]) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.033823952439922346; + gx = (inp[local_pos + 89] - inp[local_pos + 61]) / 2.0; + gy = (inp[local_pos + 76] - inp[local_pos + 74]) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.02324683987829437; + float a = abd.x, b = abd.y, d = abd.z; + float T = a + d, D = a * d - b * b; + float delta = sqrt(max(T * T / 4.0 - D, 0.0)); + float L1 = T / 2.0 + delta, L2 = T / 2.0 - delta; + float sqrtL1 = sqrt(L1), sqrtL2 = sqrt(L2); + float theta = mix(mod(atan(L1 - a, b) + 3.141592653589793, 3.141592653589793), 0.0, abs(b) < 1.192092896e-7); + float lambda = sqrtL1; + float mu = mix((sqrtL1 - sqrtL2) / (sqrtL1 + sqrtL2), 0.0, sqrtL1 + sqrtL2 < 1.192092896e-7); + float angle = floor(theta * 24.0 / 3.141592653589793); + float strength = mix(mix(0.0, 1.0, lambda >= 0.004), mix(2.0, 3.0, lambda >= 0.05), lambda >= 0.016); + float coherence = mix(mix(0.0, 1.0, mu >= 0.25), 2.0, mu >= 0.5); + float coord_y = ((angle * 4.0 + strength) * 3.0 + coherence + 0.5) / 288.0; + vec4 res = vec4(0.0, 0.0, 0.0, 0.0), w; + w = texture(ravu_lite_lut4, vec2(0.02, coord_y)); + res += inp[local_pos + 0] * w + inp[local_pos + 90] * w.wzyx; + w = texture(ravu_lite_lut4, vec2(0.06, coord_y)); + res += inp[local_pos + 1] * w + inp[local_pos + 89] * w.wzyx; + w = texture(ravu_lite_lut4, vec2(0.1, coord_y)); + res += inp[local_pos + 2] * w + inp[local_pos + 88] * w.wzyx; + w = texture(ravu_lite_lut4, vec2(0.14, coord_y)); + res += inp[local_pos + 3] * w + inp[local_pos + 87] * w.wzyx; + w = texture(ravu_lite_lut4, vec2(0.18, coord_y)); + res += inp[local_pos + 4] * w + inp[local_pos + 86] * w.wzyx; + w = texture(ravu_lite_lut4, vec2(0.22, coord_y)); + res += inp[local_pos + 5] * w + inp[local_pos + 85] * w.wzyx; + w = texture(ravu_lite_lut4, vec2(0.26, coord_y)); + res += inp[local_pos + 6] * w + inp[local_pos + 84] * w.wzyx; + w = texture(ravu_lite_lut4, vec2(0.3, coord_y)); + res += inp[local_pos + 14] * w + inp[local_pos + 76] * w.wzyx; + w = texture(ravu_lite_lut4, vec2(0.34, coord_y)); + res += inp[local_pos + 15] * w + inp[local_pos + 75] * w.wzyx; + w = texture(ravu_lite_lut4, vec2(0.38, coord_y)); + res += inp[local_pos + 16] * w + inp[local_pos + 74] * w.wzyx; + w = texture(ravu_lite_lut4, vec2(0.42, coord_y)); + res += inp[local_pos + 17] * w + inp[local_pos + 73] * w.wzyx; + w = texture(ravu_lite_lut4, vec2(0.46, coord_y)); + res += inp[local_pos + 18] * w + inp[local_pos + 72] * w.wzyx; + w = texture(ravu_lite_lut4, vec2(0.5, coord_y)); + res += inp[local_pos + 19] * w + inp[local_pos + 71] * w.wzyx; + w = texture(ravu_lite_lut4, vec2(0.54, coord_y)); + res += inp[local_pos + 20] * w + inp[local_pos + 70] * w.wzyx; + w = texture(ravu_lite_lut4, vec2(0.58, coord_y)); + res += inp[local_pos + 28] * w + inp[local_pos + 62] * w.wzyx; + w = texture(ravu_lite_lut4, vec2(0.62, coord_y)); + res += inp[local_pos + 29] * w + inp[local_pos + 61] * w.wzyx; + w = texture(ravu_lite_lut4, vec2(0.66, coord_y)); + res += inp[local_pos + 30] * w + inp[local_pos + 60] * w.wzyx; + w = texture(ravu_lite_lut4, vec2(0.7, coord_y)); + res += inp[local_pos + 31] * w + inp[local_pos + 59] * w.wzyx; + w = texture(ravu_lite_lut4, vec2(0.74, coord_y)); + res += inp[local_pos + 32] * w + inp[local_pos + 58] * w.wzyx; + w = texture(ravu_lite_lut4, vec2(0.78, coord_y)); + res += inp[local_pos + 33] * w + inp[local_pos + 57] * w.wzyx; + w = texture(ravu_lite_lut4, vec2(0.82, coord_y)); + res += inp[local_pos + 34] * w + inp[local_pos + 56] * w.wzyx; + w = texture(ravu_lite_lut4, vec2(0.86, coord_y)); + res += inp[local_pos + 42] * w + inp[local_pos + 48] * w.wzyx; + w = texture(ravu_lite_lut4, vec2(0.9, coord_y)); + res += inp[local_pos + 43] * w + inp[local_pos + 47] * w.wzyx; + w = texture(ravu_lite_lut4, vec2(0.94, coord_y)); + res += inp[local_pos + 44] * w + inp[local_pos + 46] * w.wzyx; + w = texture(ravu_lite_lut4, vec2(0.98, coord_y)); + res += inp[local_pos + 45] * w; + res = clamp(res, 0.0, 1.0); + imageStore(out_image, ivec2(gl_GlobalInvocationID) * 2 + ivec2(0, 0), vec4(res[0], 0.0, 0.0, 0.0)); + imageStore(out_image, ivec2(gl_GlobalInvocationID) * 2 + ivec2(0, 1), vec4(res[1], 0.0, 0.0, 0.0)); + imageStore(out_image, ivec2(gl_GlobalInvocationID) * 2 + ivec2(1, 0), vec4(res[2], 0.0, 0.0, 0.0)); + imageStore(out_image, ivec2(gl_GlobalInvocationID) * 2 + ivec2(1, 1), vec4(res[3], 0.0, 0.0, 0.0)); +} diff --git a/src/Effects/RAVU/RAVU_R2.hlsl b/src/Effects/RAVU/RAVU_R2.hlsl new file mode 100644 index 000000000..4ffc8faa5 --- /dev/null +++ b/src/Effects/RAVU/RAVU_R2.hlsl @@ -0,0 +1,449 @@ +// This file is generated by the scripts available at https://github.com/hauuau/magpie-prescalers +// Please don't edit this file directly. +// Generated by: ravu.py --target luma --weights-file weights\ravu_weights-r2.py --float-format float16dx --use-compute-shader --use-magpie --overwrite +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +//!MAGPIE EFFECT +//!VERSION 4 + +//!TEXTURE +Texture2D INPUT; + +//!SAMPLER +//!FILTER POINT +SamplerState sam_INPUT; + +//!TEXTURE +//!WIDTH INPUT_WIDTH * 2 +//!HEIGHT INPUT_HEIGHT * 2 +Texture2D OUTPUT; + +//!SAMPLER +//!FILTER LINEAR +SamplerState sam_INPUT_LINEAR; + +//!TEXTURE +//!SOURCE ravu_lut2_f16.dds +//!FORMAT R16G16B16A16_FLOAT +Texture2D ravu_lut2; + +//!SAMPLER +//!FILTER LINEAR +SamplerState sam_ravu_lut2; + +//!TEXTURE +//!FORMAT R16_FLOAT +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +Texture2D ravu_int11; + +//!SAMPLER +//!FILTER POINT +SamplerState sam_ravu_int11; + +//!COMMON +#include "prescalers.hlsli" + +#define LAST_PASS 2 + +//!PASS 1 +//!DESC RAVU (step1, luma, r2, compute) +//!IN INPUT, ravu_lut2 +//!OUT ravu_int11 +//!BLOCK_SIZE 32, 8 +//!NUM_THREADS 32, 8 +shared float inp0[385]; + +#define CURRENT_PASS 1 + +#define GET_SAMPLE(x) dot(x.rgb, rgb2y) +#define imageStore(out_image, pos, val) imageStoreOverride(pos, val.x) +void imageStoreOverride(uint2 pos, float value) { ravu_int11[pos] = (value); } + +#define INPUT_tex(pos) GET_SAMPLE(vec4(texture(INPUT, pos))) +static const float2 INPUT_size = float2(GetInputSize()); +static const float2 INPUT_pt = float2(GetInputPt()); + +#define ravu_lut2_tex(pos) (vec4(texture(ravu_lut2, pos))) + +#define HOOKED_tex(pos) INPUT_tex(pos) +#define HOOKED_size INPUT_size +#define HOOKED_pt INPUT_pt + +void Pass1(uint2 blockStart, uint3 threadId) { + ivec2 group_base = ivec2(gl_WorkGroupID) * ivec2(gl_WorkGroupSize); + int local_pos = int(gl_LocalInvocationID.x) * 11 + int(gl_LocalInvocationID.y); + { + for (int id = int(gl_LocalInvocationIndex); id < 385; id += int(gl_WorkGroupSize.x * gl_WorkGroupSize.y)) { + uint x = (uint)id / 11, y = (uint)id % 11; + inp0[id] = + HOOKED_tex(HOOKED_pt * vec2(float(group_base.x + x) + (-0.5), float(group_base.y + y) + (-0.5))).x; + } + } + barrier(); +#if CURRENT_PASS == LAST_PASS + uint2 destPos = blockStart + threadId.xy * 2; + uint2 outputSize = GetOutputSize(); + if (destPos.x >= outputSize.x || destPos.y >= outputSize.y) { + return; + } +#endif + { + float luma0 = inp0[local_pos + 0]; + float luma4 = inp0[local_pos + 11]; + float luma5 = inp0[local_pos + 12]; + float luma6 = inp0[local_pos + 13]; + float luma7 = inp0[local_pos + 14]; + float luma1 = inp0[local_pos + 1]; + float luma8 = inp0[local_pos + 22]; + float luma9 = inp0[local_pos + 23]; + float luma10 = inp0[local_pos + 24]; + float luma11 = inp0[local_pos + 25]; + float luma2 = inp0[local_pos + 2]; + float luma12 = inp0[local_pos + 33]; + float luma13 = inp0[local_pos + 34]; + float luma14 = inp0[local_pos + 35]; + float luma15 = inp0[local_pos + 36]; + float luma3 = inp0[local_pos + 3]; + vec3 abd = vec3(0.0, 0.0, 0.0); + float gx, gy; + gx = (luma4 - luma0); + gy = (luma1 - luma0); + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.04792235409415088; + gx = (luma5 - luma1); + gy = (luma2 - luma0) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (luma6 - luma2); + gy = (luma3 - luma1) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (luma7 - luma3); + gy = (luma3 - luma2); + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.04792235409415088; + gx = (luma8 - luma0) / 2.0; + gy = (luma5 - luma4); + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (luma9 - luma1) / 2.0; + gy = (luma6 - luma4) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.07901060453704994; + gx = (luma10 - luma2) / 2.0; + gy = (luma7 - luma5) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.07901060453704994; + gx = (luma11 - luma3) / 2.0; + gy = (luma7 - luma6); + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (luma12 - luma4) / 2.0; + gy = (luma9 - luma8); + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (luma13 - luma5) / 2.0; + gy = (luma10 - luma8) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.07901060453704994; + gx = (luma14 - luma6) / 2.0; + gy = (luma11 - luma9) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.07901060453704994; + gx = (luma15 - luma7) / 2.0; + gy = (luma11 - luma10); + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (luma12 - luma8); + gy = (luma13 - luma12); + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.04792235409415088; + gx = (luma13 - luma9); + gy = (luma14 - luma12) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (luma14 - luma10); + gy = (luma15 - luma13) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (luma15 - luma11); + gy = (luma15 - luma14); + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.04792235409415088; + float a = abd.x, b = abd.y, d = abd.z; + float T = a + d, D = a * d - b * b; + float delta = sqrt(max(T * T / 4.0 - D, 0.0)); + float L1 = T / 2.0 + delta, L2 = T / 2.0 - delta; + float sqrtL1 = sqrt(L1), sqrtL2 = sqrt(L2); + float theta = mix(mod(atan(L1 - a, b) + 3.141592653589793, 3.141592653589793), 0.0, abs(b) < 1.192092896e-7); + float lambda = sqrtL1; + float mu = mix((sqrtL1 - sqrtL2) / (sqrtL1 + sqrtL2), 0.0, sqrtL1 + sqrtL2 < 1.192092896e-7); + float angle = floor(theta * 24.0 / 3.141592653589793); + float strength = clamp(floor(log2(lambda * 2000.0 + 1.192092896e-7)), 0.0, 8.0); + float coherence = mix(mix(0.0, 1.0, mu >= 0.25), 2.0, mu >= 0.5); + float coord_y = ((angle * 9.0 + strength) * 3.0 + coherence + 0.5) / 648.0; + float res = 0.0; + vec4 w; + w = texture(ravu_lut2, vec2(0.25, coord_y)); + res += (inp0[local_pos + 0] + inp0[local_pos + 36]) * w[0]; + res += (inp0[local_pos + 1] + inp0[local_pos + 35]) * w[1]; + res += (inp0[local_pos + 2] + inp0[local_pos + 34]) * w[2]; + res += (inp0[local_pos + 3] + inp0[local_pos + 33]) * w[3]; + w = texture(ravu_lut2, vec2(0.75, coord_y)); + res += (inp0[local_pos + 11] + inp0[local_pos + 25]) * w[0]; + res += (inp0[local_pos + 12] + inp0[local_pos + 24]) * w[1]; + res += (inp0[local_pos + 13] + inp0[local_pos + 23]) * w[2]; + res += (inp0[local_pos + 14] + inp0[local_pos + 22]) * w[3]; + res = clamp(res, 0.0, 1.0); + imageStore(out_image, ivec2(gl_GlobalInvocationID), res); + } +} +//!PASS 2 +//!DESC RAVU (step2, luma, r2, compute) +//!IN INPUT, ravu_lut2, ravu_int11 +//!OUT OUTPUT +//!BLOCK_SIZE 64, 16 +//!NUM_THREADS 32, 8 +shared float inp0[385]; +shared float inp1[385]; + +#define CURRENT_PASS 2 + +#define GET_SAMPLE(x) dot(x.rgb, rgb2y) +#define imageStore(out_image, pos, val) imageStoreOverride(pos, val.x) +void imageStoreOverride(uint2 pos, float value) { + float2 UV = mul(rgb2uv, INPUT.SampleLevel(sam_INPUT_LINEAR, HOOKED_map(pos), 0).rgb); + OUTPUT[pos] = float4(mul(yuv2rgb, float3(value.x, UV)), 1.0); +} + +#define INPUT_tex(pos) GET_SAMPLE(vec4(texture(INPUT, pos))) +static const float2 INPUT_size = float2(GetInputSize()); +static const float2 INPUT_pt = float2(GetInputPt()); + +#define ravu_lut2_tex(pos) (vec4(texture(ravu_lut2, pos))) + +#define ravu_int11_tex(pos) (float(texture(ravu_int11, pos).x)) +static const float2 ravu_int11_size = float2(GetInputSize().x, GetInputSize().y); +static const float2 ravu_int11_pt = float2(1.0 / (ravu_int11_size.x), 1.0 / (ravu_int11_size.y)); + +#define HOOKED_tex(pos) INPUT_tex(pos) +#define HOOKED_size INPUT_size +#define HOOKED_pt INPUT_pt + +void Pass2(uint2 blockStart, uint3 threadId) { + ivec2 group_base = ivec2(gl_WorkGroupID) * ivec2(gl_WorkGroupSize); + int local_pos = int(gl_LocalInvocationID.x) * 11 + int(gl_LocalInvocationID.y); + { + for (int id = int(gl_LocalInvocationIndex); id < 385; id += int(gl_WorkGroupSize.x * gl_WorkGroupSize.y)) { + uint x = (uint)id / 11, y = (uint)id % 11; + inp0[id] = + ravu_int11_tex(ravu_int11_pt * vec2(float(group_base.x + x) + (-1.5), float(group_base.y + y) + (-1.5))) + .x; + } + } + { + for (int id = int(gl_LocalInvocationIndex); id < 385; id += int(gl_WorkGroupSize.x * gl_WorkGroupSize.y)) { + uint x = (uint)id / 11, y = (uint)id % 11; + inp1[id] = + HOOKED_tex(HOOKED_pt * vec2(float(group_base.x + x) + (-0.5), float(group_base.y + y) + (-0.5))).x; + } + } + barrier(); +#if CURRENT_PASS == LAST_PASS + uint2 destPos = blockStart + threadId.xy * 2; + uint2 outputSize = GetOutputSize(); + if (destPos.x >= outputSize.x || destPos.y >= outputSize.y) { + return; + } +#endif + { + float luma8 = inp0[local_pos + 12]; + float luma5 = inp0[local_pos + 13]; + float luma2 = inp0[local_pos + 14]; + float luma13 = inp0[local_pos + 23]; + float luma10 = inp0[local_pos + 24]; + float luma7 = inp0[local_pos + 25]; + float luma0 = inp0[local_pos + 2]; + float luma15 = inp0[local_pos + 35]; + float luma12 = inp1[local_pos + 11]; + float luma9 = inp1[local_pos + 12]; + float luma6 = inp1[local_pos + 13]; + float luma3 = inp1[local_pos + 14]; + float luma4 = inp1[local_pos + 1]; + float luma14 = inp1[local_pos + 23]; + float luma11 = inp1[local_pos + 24]; + float luma1 = inp1[local_pos + 2]; + vec3 abd = vec3(0.0, 0.0, 0.0); + float gx, gy; + gx = (luma4 - luma0); + gy = (luma1 - luma0); + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.04792235409415088; + gx = (luma5 - luma1); + gy = (luma2 - luma0) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (luma6 - luma2); + gy = (luma3 - luma1) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (luma7 - luma3); + gy = (luma3 - luma2); + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.04792235409415088; + gx = (luma8 - luma0) / 2.0; + gy = (luma5 - luma4); + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (luma9 - luma1) / 2.0; + gy = (luma6 - luma4) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.07901060453704994; + gx = (luma10 - luma2) / 2.0; + gy = (luma7 - luma5) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.07901060453704994; + gx = (luma11 - luma3) / 2.0; + gy = (luma7 - luma6); + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (luma12 - luma4) / 2.0; + gy = (luma9 - luma8); + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (luma13 - luma5) / 2.0; + gy = (luma10 - luma8) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.07901060453704994; + gx = (luma14 - luma6) / 2.0; + gy = (luma11 - luma9) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.07901060453704994; + gx = (luma15 - luma7) / 2.0; + gy = (luma11 - luma10); + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (luma12 - luma8); + gy = (luma13 - luma12); + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.04792235409415088; + gx = (luma13 - luma9); + gy = (luma14 - luma12) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (luma14 - luma10); + gy = (luma15 - luma13) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (luma15 - luma11); + gy = (luma15 - luma14); + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.04792235409415088; + float a = abd.x, b = abd.y, d = abd.z; + float T = a + d, D = a * d - b * b; + float delta = sqrt(max(T * T / 4.0 - D, 0.0)); + float L1 = T / 2.0 + delta, L2 = T / 2.0 - delta; + float sqrtL1 = sqrt(L1), sqrtL2 = sqrt(L2); + float theta = mix(mod(atan(L1 - a, b) + 3.141592653589793, 3.141592653589793), 0.0, abs(b) < 1.192092896e-7); + float lambda = sqrtL1; + float mu = mix((sqrtL1 - sqrtL2) / (sqrtL1 + sqrtL2), 0.0, sqrtL1 + sqrtL2 < 1.192092896e-7); + float angle = floor(theta * 24.0 / 3.141592653589793); + float strength = clamp(floor(log2(lambda * 2000.0 + 1.192092896e-7)), 0.0, 8.0); + float coherence = mix(mix(0.0, 1.0, mu >= 0.25), 2.0, mu >= 0.5); + float coord_y = ((angle * 9.0 + strength) * 3.0 + coherence + 0.5) / 648.0; + float res = 0.0; + vec4 w; + w = texture(ravu_lut2, vec2(0.25, coord_y)); + res += (inp0[local_pos + 2] + inp0[local_pos + 35]) * w[0]; + res += (inp1[local_pos + 2] + inp1[local_pos + 23]) * w[1]; + res += (inp0[local_pos + 14] + inp0[local_pos + 23]) * w[2]; + res += (inp1[local_pos + 14] + inp1[local_pos + 11]) * w[3]; + w = texture(ravu_lut2, vec2(0.75, coord_y)); + res += (inp1[local_pos + 1] + inp1[local_pos + 24]) * w[0]; + res += (inp0[local_pos + 13] + inp0[local_pos + 24]) * w[1]; + res += (inp1[local_pos + 13] + inp1[local_pos + 12]) * w[2]; + res += (inp0[local_pos + 25] + inp0[local_pos + 12]) * w[3]; + res = clamp(res, 0.0, 1.0); + imageStore(out_image, ivec2(gl_GlobalInvocationID) * 2 + ivec2(0, 1), res); + } + { + float luma4 = inp0[local_pos + 12]; + float luma1 = inp0[local_pos + 13]; + float luma12 = inp0[local_pos + 22]; + float luma9 = inp0[local_pos + 23]; + float luma6 = inp0[local_pos + 24]; + float luma3 = inp0[local_pos + 25]; + float luma14 = inp0[local_pos + 34]; + float luma11 = inp0[local_pos + 35]; + float luma8 = inp1[local_pos + 11]; + float luma5 = inp1[local_pos + 12]; + float luma2 = inp1[local_pos + 13]; + float luma0 = inp1[local_pos + 1]; + float luma13 = inp1[local_pos + 22]; + float luma10 = inp1[local_pos + 23]; + float luma7 = inp1[local_pos + 24]; + float luma15 = inp1[local_pos + 34]; + vec3 abd = vec3(0.0, 0.0, 0.0); + float gx, gy; + gx = (luma4 - luma0); + gy = (luma1 - luma0); + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.04792235409415088; + gx = (luma5 - luma1); + gy = (luma2 - luma0) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (luma6 - luma2); + gy = (luma3 - luma1) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (luma7 - luma3); + gy = (luma3 - luma2); + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.04792235409415088; + gx = (luma8 - luma0) / 2.0; + gy = (luma5 - luma4); + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (luma9 - luma1) / 2.0; + gy = (luma6 - luma4) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.07901060453704994; + gx = (luma10 - luma2) / 2.0; + gy = (luma7 - luma5) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.07901060453704994; + gx = (luma11 - luma3) / 2.0; + gy = (luma7 - luma6); + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (luma12 - luma4) / 2.0; + gy = (luma9 - luma8); + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (luma13 - luma5) / 2.0; + gy = (luma10 - luma8) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.07901060453704994; + gx = (luma14 - luma6) / 2.0; + gy = (luma11 - luma9) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.07901060453704994; + gx = (luma15 - luma7) / 2.0; + gy = (luma11 - luma10); + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (luma12 - luma8); + gy = (luma13 - luma12); + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.04792235409415088; + gx = (luma13 - luma9); + gy = (luma14 - luma12) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (luma14 - luma10); + gy = (luma15 - luma13) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (luma15 - luma11); + gy = (luma15 - luma14); + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.04792235409415088; + float a = abd.x, b = abd.y, d = abd.z; + float T = a + d, D = a * d - b * b; + float delta = sqrt(max(T * T / 4.0 - D, 0.0)); + float L1 = T / 2.0 + delta, L2 = T / 2.0 - delta; + float sqrtL1 = sqrt(L1), sqrtL2 = sqrt(L2); + float theta = mix(mod(atan(L1 - a, b) + 3.141592653589793, 3.141592653589793), 0.0, abs(b) < 1.192092896e-7); + float lambda = sqrtL1; + float mu = mix((sqrtL1 - sqrtL2) / (sqrtL1 + sqrtL2), 0.0, sqrtL1 + sqrtL2 < 1.192092896e-7); + float angle = floor(theta * 24.0 / 3.141592653589793); + float strength = clamp(floor(log2(lambda * 2000.0 + 1.192092896e-7)), 0.0, 8.0); + float coherence = mix(mix(0.0, 1.0, mu >= 0.25), 2.0, mu >= 0.5); + float coord_y = ((angle * 9.0 + strength) * 3.0 + coherence + 0.5) / 648.0; + float res = 0.0; + vec4 w; + w = texture(ravu_lut2, vec2(0.25, coord_y)); + res += (inp1[local_pos + 1] + inp1[local_pos + 34]) * w[0]; + res += (inp0[local_pos + 13] + inp0[local_pos + 34]) * w[1]; + res += (inp1[local_pos + 13] + inp1[local_pos + 22]) * w[2]; + res += (inp0[local_pos + 25] + inp0[local_pos + 22]) * w[3]; + w = texture(ravu_lut2, vec2(0.75, coord_y)); + res += (inp0[local_pos + 12] + inp0[local_pos + 35]) * w[0]; + res += (inp1[local_pos + 12] + inp1[local_pos + 23]) * w[1]; + res += (inp0[local_pos + 24] + inp0[local_pos + 23]) * w[2]; + res += (inp1[local_pos + 24] + inp1[local_pos + 11]) * w[3]; + res = clamp(res, 0.0, 1.0); + imageStore(out_image, ivec2(gl_GlobalInvocationID) * 2 + ivec2(1, 0), res); + } + float res; + res = inp0[local_pos + 24]; + imageStore(out_image, ivec2(gl_GlobalInvocationID) * 2 + ivec2(1, 1), res); + res = inp1[local_pos + 12]; + imageStore(out_image, ivec2(gl_GlobalInvocationID) * 2 + ivec2(0, 0), res); +} diff --git a/src/Effects/RAVU/RAVU_R2_RGB.hlsl b/src/Effects/RAVU/RAVU_R2_RGB.hlsl new file mode 100644 index 000000000..a3001b21e --- /dev/null +++ b/src/Effects/RAVU/RAVU_R2_RGB.hlsl @@ -0,0 +1,450 @@ +// This file is generated by the scripts available at https://github.com/hauuau/magpie-prescalers +// Please don't edit this file directly. +// Generated by: ravu.py --target rgb --weights-file weights\ravu_weights-r2.py --float-format float16dx --use-compute-shader --use-magpie --overwrite +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +//!MAGPIE EFFECT +//!VERSION 4 + +//!TEXTURE +Texture2D INPUT; + +//!SAMPLER +//!FILTER POINT +SamplerState sam_INPUT; + +//!TEXTURE +//!WIDTH INPUT_WIDTH * 2 +//!HEIGHT INPUT_HEIGHT * 2 +Texture2D OUTPUT; + +//!TEXTURE +//!SOURCE ravu_lut2_f16.dds +//!FORMAT R16G16B16A16_FLOAT +Texture2D ravu_lut2; + +//!SAMPLER +//!FILTER LINEAR +SamplerState sam_ravu_lut2; + +//!TEXTURE +//!FORMAT R16G16B16A16_FLOAT +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +Texture2D ravu_int11; + +//!SAMPLER +//!FILTER POINT +SamplerState sam_ravu_int11; + +//!COMMON +#include "prescalers.hlsli" + +#define LAST_PASS 2 + +//!PASS 1 +//!DESC RAVU (step1, rgb, r2, compute) +//!IN INPUT, ravu_lut2 +//!OUT ravu_int11 +//!BLOCK_SIZE 32, 8 +//!NUM_THREADS 32, 8 +static const vec3 color_primary = vec3(0.2126, 0.7152, 0.0722); +shared vec3 inp0[385]; +shared float inp_luma0[385]; + +#define CURRENT_PASS 1 + +#define GET_SAMPLE(x) x +#define imageStore(out_image, pos, val) imageStoreOverride(pos, val.xyz) +void imageStoreOverride(uint2 pos, vec3 value) { ravu_int11[pos] = vec4(value, 0.0); } + +#define INPUT_tex(pos) GET_SAMPLE(vec4(texture(INPUT, pos))) +static const float2 INPUT_size = float2(GetInputSize()); +static const float2 INPUT_pt = float2(GetInputPt()); + +#define ravu_lut2_tex(pos) (vec4(texture(ravu_lut2, pos))) + +#define HOOKED_tex(pos) INPUT_tex(pos) +#define HOOKED_size INPUT_size +#define HOOKED_pt INPUT_pt + +void Pass1(uint2 blockStart, uint3 threadId) { + ivec2 group_base = ivec2(gl_WorkGroupID) * ivec2(gl_WorkGroupSize); + int local_pos = int(gl_LocalInvocationID.x) * 11 + int(gl_LocalInvocationID.y); + { + for (int id = int(gl_LocalInvocationIndex); id < 385; id += int(gl_WorkGroupSize.x * gl_WorkGroupSize.y)) { + uint x = (uint)id / 11, y = (uint)id % 11; + inp0[id] = + HOOKED_tex(HOOKED_pt * vec2(float(group_base.x + x) + (-0.5), float(group_base.y + y) + (-0.5))).xyz; + inp_luma0[id] = dot(inp0[id], color_primary); + } + } + barrier(); +#if CURRENT_PASS == LAST_PASS + uint2 destPos = blockStart + threadId.xy * 2; + uint2 outputSize = GetOutputSize(); + if (destPos.x >= outputSize.x || destPos.y >= outputSize.y) { + return; + } +#endif + { + float luma0 = inp_luma0[local_pos + 0]; + float luma4 = inp_luma0[local_pos + 11]; + float luma5 = inp_luma0[local_pos + 12]; + float luma6 = inp_luma0[local_pos + 13]; + float luma7 = inp_luma0[local_pos + 14]; + float luma1 = inp_luma0[local_pos + 1]; + float luma8 = inp_luma0[local_pos + 22]; + float luma9 = inp_luma0[local_pos + 23]; + float luma10 = inp_luma0[local_pos + 24]; + float luma11 = inp_luma0[local_pos + 25]; + float luma2 = inp_luma0[local_pos + 2]; + float luma12 = inp_luma0[local_pos + 33]; + float luma13 = inp_luma0[local_pos + 34]; + float luma14 = inp_luma0[local_pos + 35]; + float luma15 = inp_luma0[local_pos + 36]; + float luma3 = inp_luma0[local_pos + 3]; + vec3 abd = vec3(0.0, 0.0, 0.0); + float gx, gy; + gx = (luma4 - luma0); + gy = (luma1 - luma0); + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.04792235409415088; + gx = (luma5 - luma1); + gy = (luma2 - luma0) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (luma6 - luma2); + gy = (luma3 - luma1) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (luma7 - luma3); + gy = (luma3 - luma2); + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.04792235409415088; + gx = (luma8 - luma0) / 2.0; + gy = (luma5 - luma4); + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (luma9 - luma1) / 2.0; + gy = (luma6 - luma4) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.07901060453704994; + gx = (luma10 - luma2) / 2.0; + gy = (luma7 - luma5) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.07901060453704994; + gx = (luma11 - luma3) / 2.0; + gy = (luma7 - luma6); + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (luma12 - luma4) / 2.0; + gy = (luma9 - luma8); + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (luma13 - luma5) / 2.0; + gy = (luma10 - luma8) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.07901060453704994; + gx = (luma14 - luma6) / 2.0; + gy = (luma11 - luma9) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.07901060453704994; + gx = (luma15 - luma7) / 2.0; + gy = (luma11 - luma10); + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (luma12 - luma8); + gy = (luma13 - luma12); + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.04792235409415088; + gx = (luma13 - luma9); + gy = (luma14 - luma12) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (luma14 - luma10); + gy = (luma15 - luma13) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (luma15 - luma11); + gy = (luma15 - luma14); + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.04792235409415088; + float a = abd.x, b = abd.y, d = abd.z; + float T = a + d, D = a * d - b * b; + float delta = sqrt(max(T * T / 4.0 - D, 0.0)); + float L1 = T / 2.0 + delta, L2 = T / 2.0 - delta; + float sqrtL1 = sqrt(L1), sqrtL2 = sqrt(L2); + float theta = mix(mod(atan(L1 - a, b) + 3.141592653589793, 3.141592653589793), 0.0, abs(b) < 1.192092896e-7); + float lambda = sqrtL1; + float mu = mix((sqrtL1 - sqrtL2) / (sqrtL1 + sqrtL2), 0.0, sqrtL1 + sqrtL2 < 1.192092896e-7); + float angle = floor(theta * 24.0 / 3.141592653589793); + float strength = clamp(floor(log2(lambda * 2000.0 + 1.192092896e-7)), 0.0, 8.0); + float coherence = mix(mix(0.0, 1.0, mu >= 0.25), 2.0, mu >= 0.5); + float coord_y = ((angle * 9.0 + strength) * 3.0 + coherence + 0.5) / 648.0; + vec3 res = vec3(0.0, 0.0, 0.0); + vec4 w; + w = texture(ravu_lut2, vec2(0.25, coord_y)); + res += (inp0[local_pos + 0] + inp0[local_pos + 36]) * w[0]; + res += (inp0[local_pos + 1] + inp0[local_pos + 35]) * w[1]; + res += (inp0[local_pos + 2] + inp0[local_pos + 34]) * w[2]; + res += (inp0[local_pos + 3] + inp0[local_pos + 33]) * w[3]; + w = texture(ravu_lut2, vec2(0.75, coord_y)); + res += (inp0[local_pos + 11] + inp0[local_pos + 25]) * w[0]; + res += (inp0[local_pos + 12] + inp0[local_pos + 24]) * w[1]; + res += (inp0[local_pos + 13] + inp0[local_pos + 23]) * w[2]; + res += (inp0[local_pos + 14] + inp0[local_pos + 22]) * w[3]; + res = clamp(res, 0.0, 1.0); + imageStore(out_image, ivec2(gl_GlobalInvocationID), vec4(res, 1.0)); + } +} +//!PASS 2 +//!DESC RAVU (step2, rgb, r2, compute) +//!IN INPUT, ravu_lut2, ravu_int11 +//!OUT OUTPUT +//!BLOCK_SIZE 64, 16 +//!NUM_THREADS 32, 8 +static const vec3 color_primary = vec3(0.2126, 0.7152, 0.0722); +shared vec3 inp0[385]; +shared float inp_luma0[385]; +shared vec3 inp1[385]; +shared float inp_luma1[385]; + +#define CURRENT_PASS 2 + +#define GET_SAMPLE(x) x +#define imageStore(out_image, pos, val) imageStoreOverride(pos, val) +void imageStoreOverride(uint2 pos, float4 value) { OUTPUT[pos] = value; } + +#define INPUT_tex(pos) GET_SAMPLE(vec4(texture(INPUT, pos))) +static const float2 INPUT_size = float2(GetInputSize()); +static const float2 INPUT_pt = float2(GetInputPt()); + +#define ravu_lut2_tex(pos) (vec4(texture(ravu_lut2, pos))) + +#define ravu_int11_tex(pos) (vec3(texture(ravu_int11, pos).xyz)) +static const float2 ravu_int11_size = float2(GetInputSize().x, GetInputSize().y); +static const float2 ravu_int11_pt = float2(1.0 / (ravu_int11_size.x), 1.0 / (ravu_int11_size.y)); + +#define HOOKED_tex(pos) INPUT_tex(pos) +#define HOOKED_size INPUT_size +#define HOOKED_pt INPUT_pt + +void Pass2(uint2 blockStart, uint3 threadId) { + ivec2 group_base = ivec2(gl_WorkGroupID) * ivec2(gl_WorkGroupSize); + int local_pos = int(gl_LocalInvocationID.x) * 11 + int(gl_LocalInvocationID.y); + { + for (int id = int(gl_LocalInvocationIndex); id < 385; id += int(gl_WorkGroupSize.x * gl_WorkGroupSize.y)) { + uint x = (uint)id / 11, y = (uint)id % 11; + inp0[id] = + ravu_int11_tex(ravu_int11_pt * vec2(float(group_base.x + x) + (-1.5), float(group_base.y + y) + (-1.5))) + .xyz; + inp_luma0[id] = dot(inp0[id], color_primary); + } + } + { + for (int id = int(gl_LocalInvocationIndex); id < 385; id += int(gl_WorkGroupSize.x * gl_WorkGroupSize.y)) { + uint x = (uint)id / 11, y = (uint)id % 11; + inp1[id] = + HOOKED_tex(HOOKED_pt * vec2(float(group_base.x + x) + (-0.5), float(group_base.y + y) + (-0.5))).xyz; + inp_luma1[id] = dot(inp1[id], color_primary); + } + } + barrier(); +#if CURRENT_PASS == LAST_PASS + uint2 destPos = blockStart + threadId.xy * 2; + uint2 outputSize = GetOutputSize(); + if (destPos.x >= outputSize.x || destPos.y >= outputSize.y) { + return; + } +#endif + { + float luma8 = inp_luma0[local_pos + 12]; + float luma5 = inp_luma0[local_pos + 13]; + float luma2 = inp_luma0[local_pos + 14]; + float luma13 = inp_luma0[local_pos + 23]; + float luma10 = inp_luma0[local_pos + 24]; + float luma7 = inp_luma0[local_pos + 25]; + float luma0 = inp_luma0[local_pos + 2]; + float luma15 = inp_luma0[local_pos + 35]; + float luma12 = inp_luma1[local_pos + 11]; + float luma9 = inp_luma1[local_pos + 12]; + float luma6 = inp_luma1[local_pos + 13]; + float luma3 = inp_luma1[local_pos + 14]; + float luma4 = inp_luma1[local_pos + 1]; + float luma14 = inp_luma1[local_pos + 23]; + float luma11 = inp_luma1[local_pos + 24]; + float luma1 = inp_luma1[local_pos + 2]; + vec3 abd = vec3(0.0, 0.0, 0.0); + float gx, gy; + gx = (luma4 - luma0); + gy = (luma1 - luma0); + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.04792235409415088; + gx = (luma5 - luma1); + gy = (luma2 - luma0) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (luma6 - luma2); + gy = (luma3 - luma1) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (luma7 - luma3); + gy = (luma3 - luma2); + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.04792235409415088; + gx = (luma8 - luma0) / 2.0; + gy = (luma5 - luma4); + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (luma9 - luma1) / 2.0; + gy = (luma6 - luma4) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.07901060453704994; + gx = (luma10 - luma2) / 2.0; + gy = (luma7 - luma5) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.07901060453704994; + gx = (luma11 - luma3) / 2.0; + gy = (luma7 - luma6); + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (luma12 - luma4) / 2.0; + gy = (luma9 - luma8); + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (luma13 - luma5) / 2.0; + gy = (luma10 - luma8) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.07901060453704994; + gx = (luma14 - luma6) / 2.0; + gy = (luma11 - luma9) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.07901060453704994; + gx = (luma15 - luma7) / 2.0; + gy = (luma11 - luma10); + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (luma12 - luma8); + gy = (luma13 - luma12); + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.04792235409415088; + gx = (luma13 - luma9); + gy = (luma14 - luma12) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (luma14 - luma10); + gy = (luma15 - luma13) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (luma15 - luma11); + gy = (luma15 - luma14); + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.04792235409415088; + float a = abd.x, b = abd.y, d = abd.z; + float T = a + d, D = a * d - b * b; + float delta = sqrt(max(T * T / 4.0 - D, 0.0)); + float L1 = T / 2.0 + delta, L2 = T / 2.0 - delta; + float sqrtL1 = sqrt(L1), sqrtL2 = sqrt(L2); + float theta = mix(mod(atan(L1 - a, b) + 3.141592653589793, 3.141592653589793), 0.0, abs(b) < 1.192092896e-7); + float lambda = sqrtL1; + float mu = mix((sqrtL1 - sqrtL2) / (sqrtL1 + sqrtL2), 0.0, sqrtL1 + sqrtL2 < 1.192092896e-7); + float angle = floor(theta * 24.0 / 3.141592653589793); + float strength = clamp(floor(log2(lambda * 2000.0 + 1.192092896e-7)), 0.0, 8.0); + float coherence = mix(mix(0.0, 1.0, mu >= 0.25), 2.0, mu >= 0.5); + float coord_y = ((angle * 9.0 + strength) * 3.0 + coherence + 0.5) / 648.0; + vec3 res = vec3(0.0, 0.0, 0.0); + vec4 w; + w = texture(ravu_lut2, vec2(0.25, coord_y)); + res += (inp0[local_pos + 2] + inp0[local_pos + 35]) * w[0]; + res += (inp1[local_pos + 2] + inp1[local_pos + 23]) * w[1]; + res += (inp0[local_pos + 14] + inp0[local_pos + 23]) * w[2]; + res += (inp1[local_pos + 14] + inp1[local_pos + 11]) * w[3]; + w = texture(ravu_lut2, vec2(0.75, coord_y)); + res += (inp1[local_pos + 1] + inp1[local_pos + 24]) * w[0]; + res += (inp0[local_pos + 13] + inp0[local_pos + 24]) * w[1]; + res += (inp1[local_pos + 13] + inp1[local_pos + 12]) * w[2]; + res += (inp0[local_pos + 25] + inp0[local_pos + 12]) * w[3]; + res = clamp(res, 0.0, 1.0); + imageStore(out_image, ivec2(gl_GlobalInvocationID) * 2 + ivec2(0, 1), vec4(res, 1.0)); + } + { + float luma4 = inp_luma0[local_pos + 12]; + float luma1 = inp_luma0[local_pos + 13]; + float luma12 = inp_luma0[local_pos + 22]; + float luma9 = inp_luma0[local_pos + 23]; + float luma6 = inp_luma0[local_pos + 24]; + float luma3 = inp_luma0[local_pos + 25]; + float luma14 = inp_luma0[local_pos + 34]; + float luma11 = inp_luma0[local_pos + 35]; + float luma8 = inp_luma1[local_pos + 11]; + float luma5 = inp_luma1[local_pos + 12]; + float luma2 = inp_luma1[local_pos + 13]; + float luma0 = inp_luma1[local_pos + 1]; + float luma13 = inp_luma1[local_pos + 22]; + float luma10 = inp_luma1[local_pos + 23]; + float luma7 = inp_luma1[local_pos + 24]; + float luma15 = inp_luma1[local_pos + 34]; + vec3 abd = vec3(0.0, 0.0, 0.0); + float gx, gy; + gx = (luma4 - luma0); + gy = (luma1 - luma0); + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.04792235409415088; + gx = (luma5 - luma1); + gy = (luma2 - luma0) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (luma6 - luma2); + gy = (luma3 - luma1) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (luma7 - luma3); + gy = (luma3 - luma2); + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.04792235409415088; + gx = (luma8 - luma0) / 2.0; + gy = (luma5 - luma4); + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (luma9 - luma1) / 2.0; + gy = (luma6 - luma4) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.07901060453704994; + gx = (luma10 - luma2) / 2.0; + gy = (luma7 - luma5) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.07901060453704994; + gx = (luma11 - luma3) / 2.0; + gy = (luma7 - luma6); + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (luma12 - luma4) / 2.0; + gy = (luma9 - luma8); + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (luma13 - luma5) / 2.0; + gy = (luma10 - luma8) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.07901060453704994; + gx = (luma14 - luma6) / 2.0; + gy = (luma11 - luma9) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.07901060453704994; + gx = (luma15 - luma7) / 2.0; + gy = (luma11 - luma10); + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (luma12 - luma8); + gy = (luma13 - luma12); + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.04792235409415088; + gx = (luma13 - luma9); + gy = (luma14 - luma12) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (luma14 - luma10); + gy = (luma15 - luma13) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (luma15 - luma11); + gy = (luma15 - luma14); + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.04792235409415088; + float a = abd.x, b = abd.y, d = abd.z; + float T = a + d, D = a * d - b * b; + float delta = sqrt(max(T * T / 4.0 - D, 0.0)); + float L1 = T / 2.0 + delta, L2 = T / 2.0 - delta; + float sqrtL1 = sqrt(L1), sqrtL2 = sqrt(L2); + float theta = mix(mod(atan(L1 - a, b) + 3.141592653589793, 3.141592653589793), 0.0, abs(b) < 1.192092896e-7); + float lambda = sqrtL1; + float mu = mix((sqrtL1 - sqrtL2) / (sqrtL1 + sqrtL2), 0.0, sqrtL1 + sqrtL2 < 1.192092896e-7); + float angle = floor(theta * 24.0 / 3.141592653589793); + float strength = clamp(floor(log2(lambda * 2000.0 + 1.192092896e-7)), 0.0, 8.0); + float coherence = mix(mix(0.0, 1.0, mu >= 0.25), 2.0, mu >= 0.5); + float coord_y = ((angle * 9.0 + strength) * 3.0 + coherence + 0.5) / 648.0; + vec3 res = vec3(0.0, 0.0, 0.0); + vec4 w; + w = texture(ravu_lut2, vec2(0.25, coord_y)); + res += (inp1[local_pos + 1] + inp1[local_pos + 34]) * w[0]; + res += (inp0[local_pos + 13] + inp0[local_pos + 34]) * w[1]; + res += (inp1[local_pos + 13] + inp1[local_pos + 22]) * w[2]; + res += (inp0[local_pos + 25] + inp0[local_pos + 22]) * w[3]; + w = texture(ravu_lut2, vec2(0.75, coord_y)); + res += (inp0[local_pos + 12] + inp0[local_pos + 35]) * w[0]; + res += (inp1[local_pos + 12] + inp1[local_pos + 23]) * w[1]; + res += (inp0[local_pos + 24] + inp0[local_pos + 23]) * w[2]; + res += (inp1[local_pos + 24] + inp1[local_pos + 11]) * w[3]; + res = clamp(res, 0.0, 1.0); + imageStore(out_image, ivec2(gl_GlobalInvocationID) * 2 + ivec2(1, 0), vec4(res, 1.0)); + } + vec3 res; + res = inp0[local_pos + 24]; + imageStore(out_image, ivec2(gl_GlobalInvocationID) * 2 + ivec2(1, 1), vec4(res, 1.0)); + res = inp1[local_pos + 12]; + imageStore(out_image, ivec2(gl_GlobalInvocationID) * 2 + ivec2(0, 0), vec4(res, 1.0)); +} diff --git a/src/Effects/RAVU/RAVU_R3.hlsl b/src/Effects/RAVU/RAVU_R3.hlsl new file mode 100644 index 000000000..e4b847055 --- /dev/null +++ b/src/Effects/RAVU/RAVU_R3.hlsl @@ -0,0 +1,536 @@ +// This file is generated by the scripts available at https://github.com/hauuau/magpie-prescalers +// Please don't edit this file directly. +// Generated by: ravu.py --target luma --weights-file weights\ravu_weights-r3.py --float-format float16dx --use-compute-shader --use-magpie --overwrite +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +//!MAGPIE EFFECT +//!VERSION 4 + +//!TEXTURE +Texture2D INPUT; + +//!SAMPLER +//!FILTER POINT +SamplerState sam_INPUT; + +//!TEXTURE +//!WIDTH INPUT_WIDTH * 2 +//!HEIGHT INPUT_HEIGHT * 2 +Texture2D OUTPUT; + +//!SAMPLER +//!FILTER LINEAR +SamplerState sam_INPUT_LINEAR; + +//!TEXTURE +//!SOURCE ravu_lut3_f16.dds +//!FORMAT R16G16B16A16_FLOAT +Texture2D ravu_lut3; + +//!SAMPLER +//!FILTER LINEAR +SamplerState sam_ravu_lut3; + +//!TEXTURE +//!FORMAT R16_FLOAT +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +Texture2D ravu_int11; + +//!SAMPLER +//!FILTER POINT +SamplerState sam_ravu_int11; + +//!COMMON +#include "prescalers.hlsli" + +#define LAST_PASS 2 + +//!PASS 1 +//!DESC RAVU (step1, luma, r3, compute) +//!IN INPUT, ravu_lut3 +//!OUT ravu_int11 +//!BLOCK_SIZE 32, 8 +//!NUM_THREADS 32, 8 +shared float inp0[481]; + +#define CURRENT_PASS 1 + +#define GET_SAMPLE(x) dot(x.rgb, rgb2y) +#define imageStore(out_image, pos, val) imageStoreOverride(pos, val.x) +void imageStoreOverride(uint2 pos, float value) { ravu_int11[pos] = (value); } + +#define INPUT_tex(pos) GET_SAMPLE(vec4(texture(INPUT, pos))) +static const float2 INPUT_size = float2(GetInputSize()); +static const float2 INPUT_pt = float2(GetInputPt()); + +#define ravu_lut3_tex(pos) (vec4(texture(ravu_lut3, pos))) + +#define HOOKED_tex(pos) INPUT_tex(pos) +#define HOOKED_size INPUT_size +#define HOOKED_pt INPUT_pt + +void Pass1(uint2 blockStart, uint3 threadId) { + ivec2 group_base = ivec2(gl_WorkGroupID) * ivec2(gl_WorkGroupSize); + int local_pos = int(gl_LocalInvocationID.x) * 13 + int(gl_LocalInvocationID.y); + { + for (int id = int(gl_LocalInvocationIndex); id < 481; id += int(gl_WorkGroupSize.x * gl_WorkGroupSize.y)) { + uint x = (uint)id / 13, y = (uint)id % 13; + inp0[id] = + HOOKED_tex(HOOKED_pt * vec2(float(group_base.x + x) + (-1.5), float(group_base.y + y) + (-1.5))).x; + } + } + barrier(); +#if CURRENT_PASS == LAST_PASS + uint2 destPos = blockStart + threadId.xy * 2; + uint2 outputSize = GetOutputSize(); + if (destPos.x >= outputSize.x || destPos.y >= outputSize.y) { + return; + } +#endif + { + float luma6 = inp0[local_pos + 13]; + float luma7 = inp0[local_pos + 14]; + float luma8 = inp0[local_pos + 15]; + float luma9 = inp0[local_pos + 16]; + float luma10 = inp0[local_pos + 17]; + float luma11 = inp0[local_pos + 18]; + float luma1 = inp0[local_pos + 1]; + float luma12 = inp0[local_pos + 26]; + float luma13 = inp0[local_pos + 27]; + float luma14 = inp0[local_pos + 28]; + float luma15 = inp0[local_pos + 29]; + float luma2 = inp0[local_pos + 2]; + float luma16 = inp0[local_pos + 30]; + float luma17 = inp0[local_pos + 31]; + float luma18 = inp0[local_pos + 39]; + float luma3 = inp0[local_pos + 3]; + float luma19 = inp0[local_pos + 40]; + float luma20 = inp0[local_pos + 41]; + float luma21 = inp0[local_pos + 42]; + float luma22 = inp0[local_pos + 43]; + float luma23 = inp0[local_pos + 44]; + float luma4 = inp0[local_pos + 4]; + float luma24 = inp0[local_pos + 52]; + float luma25 = inp0[local_pos + 53]; + float luma26 = inp0[local_pos + 54]; + float luma27 = inp0[local_pos + 55]; + float luma28 = inp0[local_pos + 56]; + float luma29 = inp0[local_pos + 57]; + float luma31 = inp0[local_pos + 66]; + float luma32 = inp0[local_pos + 67]; + float luma33 = inp0[local_pos + 68]; + float luma34 = inp0[local_pos + 69]; + vec3 abd = vec3(0.0, 0.0, 0.0); + float gx, gy; + gx = (luma13 - luma1) / 2.0; + gy = (luma8 - luma6) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.04792235409415088; + gx = (luma14 - luma2) / 2.0; + gy = (-luma10 + 8.0 * luma9 - 8.0 * luma7 + luma6) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (luma15 - luma3) / 2.0; + gy = (-luma11 + 8.0 * luma10 - 8.0 * luma8 + luma7) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (luma16 - luma4) / 2.0; + gy = (luma11 - luma9) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.04792235409415088; + gx = (-luma25 + 8.0 * luma19 - 8.0 * luma7 + luma1) / 12.0; + gy = (luma14 - luma12) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (-luma26 + 8.0 * luma20 - 8.0 * luma8 + luma2) / 12.0; + gy = (-luma16 + 8.0 * luma15 - 8.0 * luma13 + luma12) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.07901060453704994; + gx = (-luma27 + 8.0 * luma21 - 8.0 * luma9 + luma3) / 12.0; + gy = (-luma17 + 8.0 * luma16 - 8.0 * luma14 + luma13) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.07901060453704994; + gx = (-luma28 + 8.0 * luma22 - 8.0 * luma10 + luma4) / 12.0; + gy = (luma17 - luma15) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (-luma31 + 8.0 * luma25 - 8.0 * luma13 + luma7) / 12.0; + gy = (luma20 - luma18) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (-luma32 + 8.0 * luma26 - 8.0 * luma14 + luma8) / 12.0; + gy = (-luma22 + 8.0 * luma21 - 8.0 * luma19 + luma18) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.07901060453704994; + gx = (-luma33 + 8.0 * luma27 - 8.0 * luma15 + luma9) / 12.0; + gy = (-luma23 + 8.0 * luma22 - 8.0 * luma20 + luma19) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.07901060453704994; + gx = (-luma34 + 8.0 * luma28 - 8.0 * luma16 + luma10) / 12.0; + gy = (luma23 - luma21) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (luma31 - luma19) / 2.0; + gy = (luma26 - luma24) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.04792235409415088; + gx = (luma32 - luma20) / 2.0; + gy = (-luma28 + 8.0 * luma27 - 8.0 * luma25 + luma24) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (luma33 - luma21) / 2.0; + gy = (-luma29 + 8.0 * luma28 - 8.0 * luma26 + luma25) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (luma34 - luma22) / 2.0; + gy = (luma29 - luma27) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.04792235409415088; + float a = abd.x, b = abd.y, d = abd.z; + float T = a + d, D = a * d - b * b; + float delta = sqrt(max(T * T / 4.0 - D, 0.0)); + float L1 = T / 2.0 + delta, L2 = T / 2.0 - delta; + float sqrtL1 = sqrt(L1), sqrtL2 = sqrt(L2); + float theta = mix(mod(atan(L1 - a, b) + 3.141592653589793, 3.141592653589793), 0.0, abs(b) < 1.192092896e-7); + float lambda = sqrtL1; + float mu = mix((sqrtL1 - sqrtL2) / (sqrtL1 + sqrtL2), 0.0, sqrtL1 + sqrtL2 < 1.192092896e-7); + float angle = floor(theta * 24.0 / 3.141592653589793); + float strength = clamp(floor(log2(lambda * 2000.0 + 1.192092896e-7)), 0.0, 8.0); + float coherence = mix(mix(0.0, 1.0, mu >= 0.25), 2.0, mu >= 0.5); + float coord_y = ((angle * 9.0 + strength) * 3.0 + coherence + 0.5) / 648.0; + float res = 0.0; + vec4 w; + w = texture(ravu_lut3, vec2(0.1, coord_y)); + res += (inp0[local_pos + 0] + inp0[local_pos + 70]) * w[0]; + res += (inp0[local_pos + 1] + inp0[local_pos + 69]) * w[1]; + res += (inp0[local_pos + 2] + inp0[local_pos + 68]) * w[2]; + res += (inp0[local_pos + 3] + inp0[local_pos + 67]) * w[3]; + w = texture(ravu_lut3, vec2(0.3, coord_y)); + res += (inp0[local_pos + 4] + inp0[local_pos + 66]) * w[0]; + res += (inp0[local_pos + 5] + inp0[local_pos + 65]) * w[1]; + res += (inp0[local_pos + 13] + inp0[local_pos + 57]) * w[2]; + res += (inp0[local_pos + 14] + inp0[local_pos + 56]) * w[3]; + w = texture(ravu_lut3, vec2(0.5, coord_y)); + res += (inp0[local_pos + 15] + inp0[local_pos + 55]) * w[0]; + res += (inp0[local_pos + 16] + inp0[local_pos + 54]) * w[1]; + res += (inp0[local_pos + 17] + inp0[local_pos + 53]) * w[2]; + res += (inp0[local_pos + 18] + inp0[local_pos + 52]) * w[3]; + w = texture(ravu_lut3, vec2(0.7, coord_y)); + res += (inp0[local_pos + 26] + inp0[local_pos + 44]) * w[0]; + res += (inp0[local_pos + 27] + inp0[local_pos + 43]) * w[1]; + res += (inp0[local_pos + 28] + inp0[local_pos + 42]) * w[2]; + res += (inp0[local_pos + 29] + inp0[local_pos + 41]) * w[3]; + w = texture(ravu_lut3, vec2(0.9, coord_y)); + res += (inp0[local_pos + 30] + inp0[local_pos + 40]) * w[0]; + res += (inp0[local_pos + 31] + inp0[local_pos + 39]) * w[1]; + res = clamp(res, 0.0, 1.0); + imageStore(out_image, ivec2(gl_GlobalInvocationID), res); + } +} +//!PASS 2 +//!DESC RAVU (step2, luma, r3, compute) +//!IN INPUT, ravu_lut3, ravu_int11 +//!OUT OUTPUT +//!BLOCK_SIZE 64, 16 +//!NUM_THREADS 32, 8 +shared float inp0[481]; +shared float inp1[481]; + +#define CURRENT_PASS 2 + +#define GET_SAMPLE(x) dot(x.rgb, rgb2y) +#define imageStore(out_image, pos, val) imageStoreOverride(pos, val.x) +void imageStoreOverride(uint2 pos, float value) { + float2 UV = mul(rgb2uv, INPUT.SampleLevel(sam_INPUT_LINEAR, HOOKED_map(pos), 0).rgb); + OUTPUT[pos] = float4(mul(yuv2rgb, float3(value.x, UV)), 1.0); +} + +#define INPUT_tex(pos) GET_SAMPLE(vec4(texture(INPUT, pos))) +static const float2 INPUT_size = float2(GetInputSize()); +static const float2 INPUT_pt = float2(GetInputPt()); + +#define ravu_lut3_tex(pos) (vec4(texture(ravu_lut3, pos))) + +#define ravu_int11_tex(pos) (float(texture(ravu_int11, pos).x)) +static const float2 ravu_int11_size = float2(GetInputSize().x, GetInputSize().y); +static const float2 ravu_int11_pt = float2(1.0 / (ravu_int11_size.x), 1.0 / (ravu_int11_size.y)); + +#define HOOKED_tex(pos) INPUT_tex(pos) +#define HOOKED_size INPUT_size +#define HOOKED_pt INPUT_pt + +void Pass2(uint2 blockStart, uint3 threadId) { + ivec2 group_base = ivec2(gl_WorkGroupID) * ivec2(gl_WorkGroupSize); + int local_pos = int(gl_LocalInvocationID.x) * 13 + int(gl_LocalInvocationID.y); + { + for (int id = int(gl_LocalInvocationIndex); id < 481; id += int(gl_WorkGroupSize.x * gl_WorkGroupSize.y)) { + uint x = (uint)id / 13, y = (uint)id % 13; + inp0[id] = + ravu_int11_tex(ravu_int11_pt * vec2(float(group_base.x + x) + (-2.5), float(group_base.y + y) + (-2.5))) + .x; + } + } + { + for (int id = int(gl_LocalInvocationIndex); id < 481; id += int(gl_WorkGroupSize.x * gl_WorkGroupSize.y)) { + uint x = (uint)id / 13, y = (uint)id % 13; + inp1[id] = + HOOKED_tex(HOOKED_pt * vec2(float(group_base.x + x) + (-1.5), float(group_base.y + y) + (-1.5))).x; + } + } + barrier(); +#if CURRENT_PASS == LAST_PASS + uint2 destPos = blockStart + threadId.xy * 2; + uint2 outputSize = GetOutputSize(); + if (destPos.x >= outputSize.x || destPos.y >= outputSize.y) { + return; + } +#endif + { + float luma12 = inp0[local_pos + 15]; + float luma7 = inp0[local_pos + 16]; + float luma2 = inp0[local_pos + 17]; + float luma24 = inp0[local_pos + 27]; + float luma19 = inp0[local_pos + 28]; + float luma14 = inp0[local_pos + 29]; + float luma9 = inp0[local_pos + 30]; + float luma4 = inp0[local_pos + 31]; + float luma31 = inp0[local_pos + 40]; + float luma26 = inp0[local_pos + 41]; + float luma21 = inp0[local_pos + 42]; + float luma16 = inp0[local_pos + 43]; + float luma11 = inp0[local_pos + 44]; + float luma33 = inp0[local_pos + 54]; + float luma28 = inp0[local_pos + 55]; + float luma23 = inp0[local_pos + 56]; + float luma18 = inp1[local_pos + 14]; + float luma13 = inp1[local_pos + 15]; + float luma8 = inp1[local_pos + 16]; + float luma3 = inp1[local_pos + 17]; + float luma25 = inp1[local_pos + 27]; + float luma20 = inp1[local_pos + 28]; + float luma15 = inp1[local_pos + 29]; + float luma6 = inp1[local_pos + 2]; + float luma10 = inp1[local_pos + 30]; + float luma1 = inp1[local_pos + 3]; + float luma32 = inp1[local_pos + 40]; + float luma27 = inp1[local_pos + 41]; + float luma22 = inp1[local_pos + 42]; + float luma17 = inp1[local_pos + 43]; + float luma34 = inp1[local_pos + 54]; + float luma29 = inp1[local_pos + 55]; + vec3 abd = vec3(0.0, 0.0, 0.0); + float gx, gy; + gx = (luma13 - luma1) / 2.0; + gy = (luma8 - luma6) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.04792235409415088; + gx = (luma14 - luma2) / 2.0; + gy = (-luma10 + 8.0 * luma9 - 8.0 * luma7 + luma6) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (luma15 - luma3) / 2.0; + gy = (-luma11 + 8.0 * luma10 - 8.0 * luma8 + luma7) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (luma16 - luma4) / 2.0; + gy = (luma11 - luma9) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.04792235409415088; + gx = (-luma25 + 8.0 * luma19 - 8.0 * luma7 + luma1) / 12.0; + gy = (luma14 - luma12) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (-luma26 + 8.0 * luma20 - 8.0 * luma8 + luma2) / 12.0; + gy = (-luma16 + 8.0 * luma15 - 8.0 * luma13 + luma12) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.07901060453704994; + gx = (-luma27 + 8.0 * luma21 - 8.0 * luma9 + luma3) / 12.0; + gy = (-luma17 + 8.0 * luma16 - 8.0 * luma14 + luma13) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.07901060453704994; + gx = (-luma28 + 8.0 * luma22 - 8.0 * luma10 + luma4) / 12.0; + gy = (luma17 - luma15) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (-luma31 + 8.0 * luma25 - 8.0 * luma13 + luma7) / 12.0; + gy = (luma20 - luma18) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (-luma32 + 8.0 * luma26 - 8.0 * luma14 + luma8) / 12.0; + gy = (-luma22 + 8.0 * luma21 - 8.0 * luma19 + luma18) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.07901060453704994; + gx = (-luma33 + 8.0 * luma27 - 8.0 * luma15 + luma9) / 12.0; + gy = (-luma23 + 8.0 * luma22 - 8.0 * luma20 + luma19) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.07901060453704994; + gx = (-luma34 + 8.0 * luma28 - 8.0 * luma16 + luma10) / 12.0; + gy = (luma23 - luma21) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (luma31 - luma19) / 2.0; + gy = (luma26 - luma24) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.04792235409415088; + gx = (luma32 - luma20) / 2.0; + gy = (-luma28 + 8.0 * luma27 - 8.0 * luma25 + luma24) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (luma33 - luma21) / 2.0; + gy = (-luma29 + 8.0 * luma28 - 8.0 * luma26 + luma25) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (luma34 - luma22) / 2.0; + gy = (luma29 - luma27) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.04792235409415088; + float a = abd.x, b = abd.y, d = abd.z; + float T = a + d, D = a * d - b * b; + float delta = sqrt(max(T * T / 4.0 - D, 0.0)); + float L1 = T / 2.0 + delta, L2 = T / 2.0 - delta; + float sqrtL1 = sqrt(L1), sqrtL2 = sqrt(L2); + float theta = mix(mod(atan(L1 - a, b) + 3.141592653589793, 3.141592653589793), 0.0, abs(b) < 1.192092896e-7); + float lambda = sqrtL1; + float mu = mix((sqrtL1 - sqrtL2) / (sqrtL1 + sqrtL2), 0.0, sqrtL1 + sqrtL2 < 1.192092896e-7); + float angle = floor(theta * 24.0 / 3.141592653589793); + float strength = clamp(floor(log2(lambda * 2000.0 + 1.192092896e-7)), 0.0, 8.0); + float coherence = mix(mix(0.0, 1.0, mu >= 0.25), 2.0, mu >= 0.5); + float coord_y = ((angle * 9.0 + strength) * 3.0 + coherence + 0.5) / 648.0; + float res = 0.0; + vec4 w; + w = texture(ravu_lut3, vec2(0.1, coord_y)); + res += (inp0[local_pos + 3] + inp0[local_pos + 68]) * w[0]; + res += (inp1[local_pos + 3] + inp1[local_pos + 54]) * w[1]; + res += (inp0[local_pos + 17] + inp0[local_pos + 54]) * w[2]; + res += (inp1[local_pos + 17] + inp1[local_pos + 40]) * w[3]; + w = texture(ravu_lut3, vec2(0.3, coord_y)); + res += (inp0[local_pos + 31] + inp0[local_pos + 40]) * w[0]; + res += (inp1[local_pos + 31] + inp1[local_pos + 26]) * w[1]; + res += (inp1[local_pos + 2] + inp1[local_pos + 55]) * w[2]; + res += (inp0[local_pos + 16] + inp0[local_pos + 55]) * w[3]; + w = texture(ravu_lut3, vec2(0.5, coord_y)); + res += (inp1[local_pos + 16] + inp1[local_pos + 41]) * w[0]; + res += (inp0[local_pos + 30] + inp0[local_pos + 41]) * w[1]; + res += (inp1[local_pos + 30] + inp1[local_pos + 27]) * w[2]; + res += (inp0[local_pos + 44] + inp0[local_pos + 27]) * w[3]; + w = texture(ravu_lut3, vec2(0.7, coord_y)); + res += (inp0[local_pos + 15] + inp0[local_pos + 56]) * w[0]; + res += (inp1[local_pos + 15] + inp1[local_pos + 42]) * w[1]; + res += (inp0[local_pos + 29] + inp0[local_pos + 42]) * w[2]; + res += (inp1[local_pos + 29] + inp1[local_pos + 28]) * w[3]; + w = texture(ravu_lut3, vec2(0.9, coord_y)); + res += (inp0[local_pos + 43] + inp0[local_pos + 28]) * w[0]; + res += (inp1[local_pos + 43] + inp1[local_pos + 14]) * w[1]; + res = clamp(res, 0.0, 1.0); + imageStore(out_image, ivec2(gl_GlobalInvocationID) * 2 + ivec2(0, 1), res); + } + { + float luma6 = inp0[local_pos + 15]; + float luma1 = inp0[local_pos + 16]; + float luma18 = inp0[local_pos + 27]; + float luma13 = inp0[local_pos + 28]; + float luma8 = inp0[local_pos + 29]; + float luma3 = inp0[local_pos + 30]; + float luma25 = inp0[local_pos + 40]; + float luma20 = inp0[local_pos + 41]; + float luma15 = inp0[local_pos + 42]; + float luma10 = inp0[local_pos + 43]; + float luma32 = inp0[local_pos + 53]; + float luma27 = inp0[local_pos + 54]; + float luma22 = inp0[local_pos + 55]; + float luma17 = inp0[local_pos + 56]; + float luma34 = inp0[local_pos + 67]; + float luma29 = inp0[local_pos + 68]; + float luma12 = inp1[local_pos + 14]; + float luma7 = inp1[local_pos + 15]; + float luma2 = inp1[local_pos + 16]; + float luma24 = inp1[local_pos + 26]; + float luma19 = inp1[local_pos + 27]; + float luma14 = inp1[local_pos + 28]; + float luma9 = inp1[local_pos + 29]; + float luma4 = inp1[local_pos + 30]; + float luma31 = inp1[local_pos + 39]; + float luma26 = inp1[local_pos + 40]; + float luma21 = inp1[local_pos + 41]; + float luma16 = inp1[local_pos + 42]; + float luma11 = inp1[local_pos + 43]; + float luma33 = inp1[local_pos + 53]; + float luma28 = inp1[local_pos + 54]; + float luma23 = inp1[local_pos + 55]; + vec3 abd = vec3(0.0, 0.0, 0.0); + float gx, gy; + gx = (luma13 - luma1) / 2.0; + gy = (luma8 - luma6) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.04792235409415088; + gx = (luma14 - luma2) / 2.0; + gy = (-luma10 + 8.0 * luma9 - 8.0 * luma7 + luma6) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (luma15 - luma3) / 2.0; + gy = (-luma11 + 8.0 * luma10 - 8.0 * luma8 + luma7) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (luma16 - luma4) / 2.0; + gy = (luma11 - luma9) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.04792235409415088; + gx = (-luma25 + 8.0 * luma19 - 8.0 * luma7 + luma1) / 12.0; + gy = (luma14 - luma12) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (-luma26 + 8.0 * luma20 - 8.0 * luma8 + luma2) / 12.0; + gy = (-luma16 + 8.0 * luma15 - 8.0 * luma13 + luma12) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.07901060453704994; + gx = (-luma27 + 8.0 * luma21 - 8.0 * luma9 + luma3) / 12.0; + gy = (-luma17 + 8.0 * luma16 - 8.0 * luma14 + luma13) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.07901060453704994; + gx = (-luma28 + 8.0 * luma22 - 8.0 * luma10 + luma4) / 12.0; + gy = (luma17 - luma15) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (-luma31 + 8.0 * luma25 - 8.0 * luma13 + luma7) / 12.0; + gy = (luma20 - luma18) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (-luma32 + 8.0 * luma26 - 8.0 * luma14 + luma8) / 12.0; + gy = (-luma22 + 8.0 * luma21 - 8.0 * luma19 + luma18) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.07901060453704994; + gx = (-luma33 + 8.0 * luma27 - 8.0 * luma15 + luma9) / 12.0; + gy = (-luma23 + 8.0 * luma22 - 8.0 * luma20 + luma19) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.07901060453704994; + gx = (-luma34 + 8.0 * luma28 - 8.0 * luma16 + luma10) / 12.0; + gy = (luma23 - luma21) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (luma31 - luma19) / 2.0; + gy = (luma26 - luma24) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.04792235409415088; + gx = (luma32 - luma20) / 2.0; + gy = (-luma28 + 8.0 * luma27 - 8.0 * luma25 + luma24) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (luma33 - luma21) / 2.0; + gy = (-luma29 + 8.0 * luma28 - 8.0 * luma26 + luma25) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (luma34 - luma22) / 2.0; + gy = (luma29 - luma27) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.04792235409415088; + float a = abd.x, b = abd.y, d = abd.z; + float T = a + d, D = a * d - b * b; + float delta = sqrt(max(T * T / 4.0 - D, 0.0)); + float L1 = T / 2.0 + delta, L2 = T / 2.0 - delta; + float sqrtL1 = sqrt(L1), sqrtL2 = sqrt(L2); + float theta = mix(mod(atan(L1 - a, b) + 3.141592653589793, 3.141592653589793), 0.0, abs(b) < 1.192092896e-7); + float lambda = sqrtL1; + float mu = mix((sqrtL1 - sqrtL2) / (sqrtL1 + sqrtL2), 0.0, sqrtL1 + sqrtL2 < 1.192092896e-7); + float angle = floor(theta * 24.0 / 3.141592653589793); + float strength = clamp(floor(log2(lambda * 2000.0 + 1.192092896e-7)), 0.0, 8.0); + float coherence = mix(mix(0.0, 1.0, mu >= 0.25), 2.0, mu >= 0.5); + float coord_y = ((angle * 9.0 + strength) * 3.0 + coherence + 0.5) / 648.0; + float res = 0.0; + vec4 w; + w = texture(ravu_lut3, vec2(0.1, coord_y)); + res += (inp1[local_pos + 2] + inp1[local_pos + 67]) * w[0]; + res += (inp0[local_pos + 16] + inp0[local_pos + 67]) * w[1]; + res += (inp1[local_pos + 16] + inp1[local_pos + 53]) * w[2]; + res += (inp0[local_pos + 30] + inp0[local_pos + 53]) * w[3]; + w = texture(ravu_lut3, vec2(0.3, coord_y)); + res += (inp1[local_pos + 30] + inp1[local_pos + 39]) * w[0]; + res += (inp0[local_pos + 44] + inp0[local_pos + 39]) * w[1]; + res += (inp0[local_pos + 15] + inp0[local_pos + 68]) * w[2]; + res += (inp1[local_pos + 15] + inp1[local_pos + 54]) * w[3]; + w = texture(ravu_lut3, vec2(0.5, coord_y)); + res += (inp0[local_pos + 29] + inp0[local_pos + 54]) * w[0]; + res += (inp1[local_pos + 29] + inp1[local_pos + 40]) * w[1]; + res += (inp0[local_pos + 43] + inp0[local_pos + 40]) * w[2]; + res += (inp1[local_pos + 43] + inp1[local_pos + 26]) * w[3]; + w = texture(ravu_lut3, vec2(0.7, coord_y)); + res += (inp1[local_pos + 14] + inp1[local_pos + 55]) * w[0]; + res += (inp0[local_pos + 28] + inp0[local_pos + 55]) * w[1]; + res += (inp1[local_pos + 28] + inp1[local_pos + 41]) * w[2]; + res += (inp0[local_pos + 42] + inp0[local_pos + 41]) * w[3]; + w = texture(ravu_lut3, vec2(0.9, coord_y)); + res += (inp1[local_pos + 42] + inp1[local_pos + 27]) * w[0]; + res += (inp0[local_pos + 56] + inp0[local_pos + 27]) * w[1]; + res = clamp(res, 0.0, 1.0); + imageStore(out_image, ivec2(gl_GlobalInvocationID) * 2 + ivec2(1, 0), res); + } + float res; + res = inp0[local_pos + 42]; + imageStore(out_image, ivec2(gl_GlobalInvocationID) * 2 + ivec2(1, 1), res); + res = inp1[local_pos + 28]; + imageStore(out_image, ivec2(gl_GlobalInvocationID) * 2 + ivec2(0, 0), res); +} diff --git a/src/Effects/RAVU/RAVU_R3_RGB.hlsl b/src/Effects/RAVU/RAVU_R3_RGB.hlsl new file mode 100644 index 000000000..72dd6e50e --- /dev/null +++ b/src/Effects/RAVU/RAVU_R3_RGB.hlsl @@ -0,0 +1,537 @@ +// This file is generated by the scripts available at https://github.com/hauuau/magpie-prescalers +// Please don't edit this file directly. +// Generated by: ravu.py --target rgb --weights-file weights\ravu_weights-r3.py --float-format float16dx --use-compute-shader --use-magpie --overwrite +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +//!MAGPIE EFFECT +//!VERSION 4 + +//!TEXTURE +Texture2D INPUT; + +//!SAMPLER +//!FILTER POINT +SamplerState sam_INPUT; + +//!TEXTURE +//!WIDTH INPUT_WIDTH * 2 +//!HEIGHT INPUT_HEIGHT * 2 +Texture2D OUTPUT; + +//!TEXTURE +//!SOURCE ravu_lut3_f16.dds +//!FORMAT R16G16B16A16_FLOAT +Texture2D ravu_lut3; + +//!SAMPLER +//!FILTER LINEAR +SamplerState sam_ravu_lut3; + +//!TEXTURE +//!FORMAT R16G16B16A16_FLOAT +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +Texture2D ravu_int11; + +//!SAMPLER +//!FILTER POINT +SamplerState sam_ravu_int11; + +//!COMMON +#include "prescalers.hlsli" + +#define LAST_PASS 2 + +//!PASS 1 +//!DESC RAVU (step1, rgb, r3, compute) +//!IN INPUT, ravu_lut3 +//!OUT ravu_int11 +//!BLOCK_SIZE 32, 8 +//!NUM_THREADS 32, 8 +static const vec3 color_primary = vec3(0.2126, 0.7152, 0.0722); +shared vec3 inp0[481]; +shared float inp_luma0[481]; + +#define CURRENT_PASS 1 + +#define GET_SAMPLE(x) x +#define imageStore(out_image, pos, val) imageStoreOverride(pos, val.xyz) +void imageStoreOverride(uint2 pos, vec3 value) { ravu_int11[pos] = vec4(value, 0.0); } + +#define INPUT_tex(pos) GET_SAMPLE(vec4(texture(INPUT, pos))) +static const float2 INPUT_size = float2(GetInputSize()); +static const float2 INPUT_pt = float2(GetInputPt()); + +#define ravu_lut3_tex(pos) (vec4(texture(ravu_lut3, pos))) + +#define HOOKED_tex(pos) INPUT_tex(pos) +#define HOOKED_size INPUT_size +#define HOOKED_pt INPUT_pt + +void Pass1(uint2 blockStart, uint3 threadId) { + ivec2 group_base = ivec2(gl_WorkGroupID) * ivec2(gl_WorkGroupSize); + int local_pos = int(gl_LocalInvocationID.x) * 13 + int(gl_LocalInvocationID.y); + { + for (int id = int(gl_LocalInvocationIndex); id < 481; id += int(gl_WorkGroupSize.x * gl_WorkGroupSize.y)) { + uint x = (uint)id / 13, y = (uint)id % 13; + inp0[id] = + HOOKED_tex(HOOKED_pt * vec2(float(group_base.x + x) + (-1.5), float(group_base.y + y) + (-1.5))).xyz; + inp_luma0[id] = dot(inp0[id], color_primary); + } + } + barrier(); +#if CURRENT_PASS == LAST_PASS + uint2 destPos = blockStart + threadId.xy * 2; + uint2 outputSize = GetOutputSize(); + if (destPos.x >= outputSize.x || destPos.y >= outputSize.y) { + return; + } +#endif + { + float luma6 = inp_luma0[local_pos + 13]; + float luma7 = inp_luma0[local_pos + 14]; + float luma8 = inp_luma0[local_pos + 15]; + float luma9 = inp_luma0[local_pos + 16]; + float luma10 = inp_luma0[local_pos + 17]; + float luma11 = inp_luma0[local_pos + 18]; + float luma1 = inp_luma0[local_pos + 1]; + float luma12 = inp_luma0[local_pos + 26]; + float luma13 = inp_luma0[local_pos + 27]; + float luma14 = inp_luma0[local_pos + 28]; + float luma15 = inp_luma0[local_pos + 29]; + float luma2 = inp_luma0[local_pos + 2]; + float luma16 = inp_luma0[local_pos + 30]; + float luma17 = inp_luma0[local_pos + 31]; + float luma18 = inp_luma0[local_pos + 39]; + float luma3 = inp_luma0[local_pos + 3]; + float luma19 = inp_luma0[local_pos + 40]; + float luma20 = inp_luma0[local_pos + 41]; + float luma21 = inp_luma0[local_pos + 42]; + float luma22 = inp_luma0[local_pos + 43]; + float luma23 = inp_luma0[local_pos + 44]; + float luma4 = inp_luma0[local_pos + 4]; + float luma24 = inp_luma0[local_pos + 52]; + float luma25 = inp_luma0[local_pos + 53]; + float luma26 = inp_luma0[local_pos + 54]; + float luma27 = inp_luma0[local_pos + 55]; + float luma28 = inp_luma0[local_pos + 56]; + float luma29 = inp_luma0[local_pos + 57]; + float luma31 = inp_luma0[local_pos + 66]; + float luma32 = inp_luma0[local_pos + 67]; + float luma33 = inp_luma0[local_pos + 68]; + float luma34 = inp_luma0[local_pos + 69]; + vec3 abd = vec3(0.0, 0.0, 0.0); + float gx, gy; + gx = (luma13 - luma1) / 2.0; + gy = (luma8 - luma6) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.04792235409415088; + gx = (luma14 - luma2) / 2.0; + gy = (-luma10 + 8.0 * luma9 - 8.0 * luma7 + luma6) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (luma15 - luma3) / 2.0; + gy = (-luma11 + 8.0 * luma10 - 8.0 * luma8 + luma7) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (luma16 - luma4) / 2.0; + gy = (luma11 - luma9) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.04792235409415088; + gx = (-luma25 + 8.0 * luma19 - 8.0 * luma7 + luma1) / 12.0; + gy = (luma14 - luma12) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (-luma26 + 8.0 * luma20 - 8.0 * luma8 + luma2) / 12.0; + gy = (-luma16 + 8.0 * luma15 - 8.0 * luma13 + luma12) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.07901060453704994; + gx = (-luma27 + 8.0 * luma21 - 8.0 * luma9 + luma3) / 12.0; + gy = (-luma17 + 8.0 * luma16 - 8.0 * luma14 + luma13) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.07901060453704994; + gx = (-luma28 + 8.0 * luma22 - 8.0 * luma10 + luma4) / 12.0; + gy = (luma17 - luma15) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (-luma31 + 8.0 * luma25 - 8.0 * luma13 + luma7) / 12.0; + gy = (luma20 - luma18) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (-luma32 + 8.0 * luma26 - 8.0 * luma14 + luma8) / 12.0; + gy = (-luma22 + 8.0 * luma21 - 8.0 * luma19 + luma18) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.07901060453704994; + gx = (-luma33 + 8.0 * luma27 - 8.0 * luma15 + luma9) / 12.0; + gy = (-luma23 + 8.0 * luma22 - 8.0 * luma20 + luma19) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.07901060453704994; + gx = (-luma34 + 8.0 * luma28 - 8.0 * luma16 + luma10) / 12.0; + gy = (luma23 - luma21) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (luma31 - luma19) / 2.0; + gy = (luma26 - luma24) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.04792235409415088; + gx = (luma32 - luma20) / 2.0; + gy = (-luma28 + 8.0 * luma27 - 8.0 * luma25 + luma24) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (luma33 - luma21) / 2.0; + gy = (-luma29 + 8.0 * luma28 - 8.0 * luma26 + luma25) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (luma34 - luma22) / 2.0; + gy = (luma29 - luma27) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.04792235409415088; + float a = abd.x, b = abd.y, d = abd.z; + float T = a + d, D = a * d - b * b; + float delta = sqrt(max(T * T / 4.0 - D, 0.0)); + float L1 = T / 2.0 + delta, L2 = T / 2.0 - delta; + float sqrtL1 = sqrt(L1), sqrtL2 = sqrt(L2); + float theta = mix(mod(atan(L1 - a, b) + 3.141592653589793, 3.141592653589793), 0.0, abs(b) < 1.192092896e-7); + float lambda = sqrtL1; + float mu = mix((sqrtL1 - sqrtL2) / (sqrtL1 + sqrtL2), 0.0, sqrtL1 + sqrtL2 < 1.192092896e-7); + float angle = floor(theta * 24.0 / 3.141592653589793); + float strength = clamp(floor(log2(lambda * 2000.0 + 1.192092896e-7)), 0.0, 8.0); + float coherence = mix(mix(0.0, 1.0, mu >= 0.25), 2.0, mu >= 0.5); + float coord_y = ((angle * 9.0 + strength) * 3.0 + coherence + 0.5) / 648.0; + vec3 res = vec3(0.0, 0.0, 0.0); + vec4 w; + w = texture(ravu_lut3, vec2(0.1, coord_y)); + res += (inp0[local_pos + 0] + inp0[local_pos + 70]) * w[0]; + res += (inp0[local_pos + 1] + inp0[local_pos + 69]) * w[1]; + res += (inp0[local_pos + 2] + inp0[local_pos + 68]) * w[2]; + res += (inp0[local_pos + 3] + inp0[local_pos + 67]) * w[3]; + w = texture(ravu_lut3, vec2(0.3, coord_y)); + res += (inp0[local_pos + 4] + inp0[local_pos + 66]) * w[0]; + res += (inp0[local_pos + 5] + inp0[local_pos + 65]) * w[1]; + res += (inp0[local_pos + 13] + inp0[local_pos + 57]) * w[2]; + res += (inp0[local_pos + 14] + inp0[local_pos + 56]) * w[3]; + w = texture(ravu_lut3, vec2(0.5, coord_y)); + res += (inp0[local_pos + 15] + inp0[local_pos + 55]) * w[0]; + res += (inp0[local_pos + 16] + inp0[local_pos + 54]) * w[1]; + res += (inp0[local_pos + 17] + inp0[local_pos + 53]) * w[2]; + res += (inp0[local_pos + 18] + inp0[local_pos + 52]) * w[3]; + w = texture(ravu_lut3, vec2(0.7, coord_y)); + res += (inp0[local_pos + 26] + inp0[local_pos + 44]) * w[0]; + res += (inp0[local_pos + 27] + inp0[local_pos + 43]) * w[1]; + res += (inp0[local_pos + 28] + inp0[local_pos + 42]) * w[2]; + res += (inp0[local_pos + 29] + inp0[local_pos + 41]) * w[3]; + w = texture(ravu_lut3, vec2(0.9, coord_y)); + res += (inp0[local_pos + 30] + inp0[local_pos + 40]) * w[0]; + res += (inp0[local_pos + 31] + inp0[local_pos + 39]) * w[1]; + res = clamp(res, 0.0, 1.0); + imageStore(out_image, ivec2(gl_GlobalInvocationID), vec4(res, 1.0)); + } +} +//!PASS 2 +//!DESC RAVU (step2, rgb, r3, compute) +//!IN INPUT, ravu_lut3, ravu_int11 +//!OUT OUTPUT +//!BLOCK_SIZE 64, 16 +//!NUM_THREADS 32, 8 +static const vec3 color_primary = vec3(0.2126, 0.7152, 0.0722); +shared vec3 inp0[481]; +shared float inp_luma0[481]; +shared vec3 inp1[481]; +shared float inp_luma1[481]; + +#define CURRENT_PASS 2 + +#define GET_SAMPLE(x) x +#define imageStore(out_image, pos, val) imageStoreOverride(pos, val) +void imageStoreOverride(uint2 pos, float4 value) { OUTPUT[pos] = value; } + +#define INPUT_tex(pos) GET_SAMPLE(vec4(texture(INPUT, pos))) +static const float2 INPUT_size = float2(GetInputSize()); +static const float2 INPUT_pt = float2(GetInputPt()); + +#define ravu_lut3_tex(pos) (vec4(texture(ravu_lut3, pos))) + +#define ravu_int11_tex(pos) (vec3(texture(ravu_int11, pos).xyz)) +static const float2 ravu_int11_size = float2(GetInputSize().x, GetInputSize().y); +static const float2 ravu_int11_pt = float2(1.0 / (ravu_int11_size.x), 1.0 / (ravu_int11_size.y)); + +#define HOOKED_tex(pos) INPUT_tex(pos) +#define HOOKED_size INPUT_size +#define HOOKED_pt INPUT_pt + +void Pass2(uint2 blockStart, uint3 threadId) { + ivec2 group_base = ivec2(gl_WorkGroupID) * ivec2(gl_WorkGroupSize); + int local_pos = int(gl_LocalInvocationID.x) * 13 + int(gl_LocalInvocationID.y); + { + for (int id = int(gl_LocalInvocationIndex); id < 481; id += int(gl_WorkGroupSize.x * gl_WorkGroupSize.y)) { + uint x = (uint)id / 13, y = (uint)id % 13; + inp0[id] = + ravu_int11_tex(ravu_int11_pt * vec2(float(group_base.x + x) + (-2.5), float(group_base.y + y) + (-2.5))) + .xyz; + inp_luma0[id] = dot(inp0[id], color_primary); + } + } + { + for (int id = int(gl_LocalInvocationIndex); id < 481; id += int(gl_WorkGroupSize.x * gl_WorkGroupSize.y)) { + uint x = (uint)id / 13, y = (uint)id % 13; + inp1[id] = + HOOKED_tex(HOOKED_pt * vec2(float(group_base.x + x) + (-1.5), float(group_base.y + y) + (-1.5))).xyz; + inp_luma1[id] = dot(inp1[id], color_primary); + } + } + barrier(); +#if CURRENT_PASS == LAST_PASS + uint2 destPos = blockStart + threadId.xy * 2; + uint2 outputSize = GetOutputSize(); + if (destPos.x >= outputSize.x || destPos.y >= outputSize.y) { + return; + } +#endif + { + float luma12 = inp_luma0[local_pos + 15]; + float luma7 = inp_luma0[local_pos + 16]; + float luma2 = inp_luma0[local_pos + 17]; + float luma24 = inp_luma0[local_pos + 27]; + float luma19 = inp_luma0[local_pos + 28]; + float luma14 = inp_luma0[local_pos + 29]; + float luma9 = inp_luma0[local_pos + 30]; + float luma4 = inp_luma0[local_pos + 31]; + float luma31 = inp_luma0[local_pos + 40]; + float luma26 = inp_luma0[local_pos + 41]; + float luma21 = inp_luma0[local_pos + 42]; + float luma16 = inp_luma0[local_pos + 43]; + float luma11 = inp_luma0[local_pos + 44]; + float luma33 = inp_luma0[local_pos + 54]; + float luma28 = inp_luma0[local_pos + 55]; + float luma23 = inp_luma0[local_pos + 56]; + float luma18 = inp_luma1[local_pos + 14]; + float luma13 = inp_luma1[local_pos + 15]; + float luma8 = inp_luma1[local_pos + 16]; + float luma3 = inp_luma1[local_pos + 17]; + float luma25 = inp_luma1[local_pos + 27]; + float luma20 = inp_luma1[local_pos + 28]; + float luma15 = inp_luma1[local_pos + 29]; + float luma6 = inp_luma1[local_pos + 2]; + float luma10 = inp_luma1[local_pos + 30]; + float luma1 = inp_luma1[local_pos + 3]; + float luma32 = inp_luma1[local_pos + 40]; + float luma27 = inp_luma1[local_pos + 41]; + float luma22 = inp_luma1[local_pos + 42]; + float luma17 = inp_luma1[local_pos + 43]; + float luma34 = inp_luma1[local_pos + 54]; + float luma29 = inp_luma1[local_pos + 55]; + vec3 abd = vec3(0.0, 0.0, 0.0); + float gx, gy; + gx = (luma13 - luma1) / 2.0; + gy = (luma8 - luma6) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.04792235409415088; + gx = (luma14 - luma2) / 2.0; + gy = (-luma10 + 8.0 * luma9 - 8.0 * luma7 + luma6) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (luma15 - luma3) / 2.0; + gy = (-luma11 + 8.0 * luma10 - 8.0 * luma8 + luma7) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (luma16 - luma4) / 2.0; + gy = (luma11 - luma9) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.04792235409415088; + gx = (-luma25 + 8.0 * luma19 - 8.0 * luma7 + luma1) / 12.0; + gy = (luma14 - luma12) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (-luma26 + 8.0 * luma20 - 8.0 * luma8 + luma2) / 12.0; + gy = (-luma16 + 8.0 * luma15 - 8.0 * luma13 + luma12) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.07901060453704994; + gx = (-luma27 + 8.0 * luma21 - 8.0 * luma9 + luma3) / 12.0; + gy = (-luma17 + 8.0 * luma16 - 8.0 * luma14 + luma13) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.07901060453704994; + gx = (-luma28 + 8.0 * luma22 - 8.0 * luma10 + luma4) / 12.0; + gy = (luma17 - luma15) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (-luma31 + 8.0 * luma25 - 8.0 * luma13 + luma7) / 12.0; + gy = (luma20 - luma18) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (-luma32 + 8.0 * luma26 - 8.0 * luma14 + luma8) / 12.0; + gy = (-luma22 + 8.0 * luma21 - 8.0 * luma19 + luma18) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.07901060453704994; + gx = (-luma33 + 8.0 * luma27 - 8.0 * luma15 + luma9) / 12.0; + gy = (-luma23 + 8.0 * luma22 - 8.0 * luma20 + luma19) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.07901060453704994; + gx = (-luma34 + 8.0 * luma28 - 8.0 * luma16 + luma10) / 12.0; + gy = (luma23 - luma21) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (luma31 - luma19) / 2.0; + gy = (luma26 - luma24) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.04792235409415088; + gx = (luma32 - luma20) / 2.0; + gy = (-luma28 + 8.0 * luma27 - 8.0 * luma25 + luma24) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (luma33 - luma21) / 2.0; + gy = (-luma29 + 8.0 * luma28 - 8.0 * luma26 + luma25) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (luma34 - luma22) / 2.0; + gy = (luma29 - luma27) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.04792235409415088; + float a = abd.x, b = abd.y, d = abd.z; + float T = a + d, D = a * d - b * b; + float delta = sqrt(max(T * T / 4.0 - D, 0.0)); + float L1 = T / 2.0 + delta, L2 = T / 2.0 - delta; + float sqrtL1 = sqrt(L1), sqrtL2 = sqrt(L2); + float theta = mix(mod(atan(L1 - a, b) + 3.141592653589793, 3.141592653589793), 0.0, abs(b) < 1.192092896e-7); + float lambda = sqrtL1; + float mu = mix((sqrtL1 - sqrtL2) / (sqrtL1 + sqrtL2), 0.0, sqrtL1 + sqrtL2 < 1.192092896e-7); + float angle = floor(theta * 24.0 / 3.141592653589793); + float strength = clamp(floor(log2(lambda * 2000.0 + 1.192092896e-7)), 0.0, 8.0); + float coherence = mix(mix(0.0, 1.0, mu >= 0.25), 2.0, mu >= 0.5); + float coord_y = ((angle * 9.0 + strength) * 3.0 + coherence + 0.5) / 648.0; + vec3 res = vec3(0.0, 0.0, 0.0); + vec4 w; + w = texture(ravu_lut3, vec2(0.1, coord_y)); + res += (inp0[local_pos + 3] + inp0[local_pos + 68]) * w[0]; + res += (inp1[local_pos + 3] + inp1[local_pos + 54]) * w[1]; + res += (inp0[local_pos + 17] + inp0[local_pos + 54]) * w[2]; + res += (inp1[local_pos + 17] + inp1[local_pos + 40]) * w[3]; + w = texture(ravu_lut3, vec2(0.3, coord_y)); + res += (inp0[local_pos + 31] + inp0[local_pos + 40]) * w[0]; + res += (inp1[local_pos + 31] + inp1[local_pos + 26]) * w[1]; + res += (inp1[local_pos + 2] + inp1[local_pos + 55]) * w[2]; + res += (inp0[local_pos + 16] + inp0[local_pos + 55]) * w[3]; + w = texture(ravu_lut3, vec2(0.5, coord_y)); + res += (inp1[local_pos + 16] + inp1[local_pos + 41]) * w[0]; + res += (inp0[local_pos + 30] + inp0[local_pos + 41]) * w[1]; + res += (inp1[local_pos + 30] + inp1[local_pos + 27]) * w[2]; + res += (inp0[local_pos + 44] + inp0[local_pos + 27]) * w[3]; + w = texture(ravu_lut3, vec2(0.7, coord_y)); + res += (inp0[local_pos + 15] + inp0[local_pos + 56]) * w[0]; + res += (inp1[local_pos + 15] + inp1[local_pos + 42]) * w[1]; + res += (inp0[local_pos + 29] + inp0[local_pos + 42]) * w[2]; + res += (inp1[local_pos + 29] + inp1[local_pos + 28]) * w[3]; + w = texture(ravu_lut3, vec2(0.9, coord_y)); + res += (inp0[local_pos + 43] + inp0[local_pos + 28]) * w[0]; + res += (inp1[local_pos + 43] + inp1[local_pos + 14]) * w[1]; + res = clamp(res, 0.0, 1.0); + imageStore(out_image, ivec2(gl_GlobalInvocationID) * 2 + ivec2(0, 1), vec4(res, 1.0)); + } + { + float luma6 = inp_luma0[local_pos + 15]; + float luma1 = inp_luma0[local_pos + 16]; + float luma18 = inp_luma0[local_pos + 27]; + float luma13 = inp_luma0[local_pos + 28]; + float luma8 = inp_luma0[local_pos + 29]; + float luma3 = inp_luma0[local_pos + 30]; + float luma25 = inp_luma0[local_pos + 40]; + float luma20 = inp_luma0[local_pos + 41]; + float luma15 = inp_luma0[local_pos + 42]; + float luma10 = inp_luma0[local_pos + 43]; + float luma32 = inp_luma0[local_pos + 53]; + float luma27 = inp_luma0[local_pos + 54]; + float luma22 = inp_luma0[local_pos + 55]; + float luma17 = inp_luma0[local_pos + 56]; + float luma34 = inp_luma0[local_pos + 67]; + float luma29 = inp_luma0[local_pos + 68]; + float luma12 = inp_luma1[local_pos + 14]; + float luma7 = inp_luma1[local_pos + 15]; + float luma2 = inp_luma1[local_pos + 16]; + float luma24 = inp_luma1[local_pos + 26]; + float luma19 = inp_luma1[local_pos + 27]; + float luma14 = inp_luma1[local_pos + 28]; + float luma9 = inp_luma1[local_pos + 29]; + float luma4 = inp_luma1[local_pos + 30]; + float luma31 = inp_luma1[local_pos + 39]; + float luma26 = inp_luma1[local_pos + 40]; + float luma21 = inp_luma1[local_pos + 41]; + float luma16 = inp_luma1[local_pos + 42]; + float luma11 = inp_luma1[local_pos + 43]; + float luma33 = inp_luma1[local_pos + 53]; + float luma28 = inp_luma1[local_pos + 54]; + float luma23 = inp_luma1[local_pos + 55]; + vec3 abd = vec3(0.0, 0.0, 0.0); + float gx, gy; + gx = (luma13 - luma1) / 2.0; + gy = (luma8 - luma6) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.04792235409415088; + gx = (luma14 - luma2) / 2.0; + gy = (-luma10 + 8.0 * luma9 - 8.0 * luma7 + luma6) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (luma15 - luma3) / 2.0; + gy = (-luma11 + 8.0 * luma10 - 8.0 * luma8 + luma7) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (luma16 - luma4) / 2.0; + gy = (luma11 - luma9) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.04792235409415088; + gx = (-luma25 + 8.0 * luma19 - 8.0 * luma7 + luma1) / 12.0; + gy = (luma14 - luma12) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (-luma26 + 8.0 * luma20 - 8.0 * luma8 + luma2) / 12.0; + gy = (-luma16 + 8.0 * luma15 - 8.0 * luma13 + luma12) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.07901060453704994; + gx = (-luma27 + 8.0 * luma21 - 8.0 * luma9 + luma3) / 12.0; + gy = (-luma17 + 8.0 * luma16 - 8.0 * luma14 + luma13) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.07901060453704994; + gx = (-luma28 + 8.0 * luma22 - 8.0 * luma10 + luma4) / 12.0; + gy = (luma17 - luma15) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (-luma31 + 8.0 * luma25 - 8.0 * luma13 + luma7) / 12.0; + gy = (luma20 - luma18) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (-luma32 + 8.0 * luma26 - 8.0 * luma14 + luma8) / 12.0; + gy = (-luma22 + 8.0 * luma21 - 8.0 * luma19 + luma18) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.07901060453704994; + gx = (-luma33 + 8.0 * luma27 - 8.0 * luma15 + luma9) / 12.0; + gy = (-luma23 + 8.0 * luma22 - 8.0 * luma20 + luma19) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.07901060453704994; + gx = (-luma34 + 8.0 * luma28 - 8.0 * luma16 + luma10) / 12.0; + gy = (luma23 - luma21) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (luma31 - luma19) / 2.0; + gy = (luma26 - luma24) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.04792235409415088; + gx = (luma32 - luma20) / 2.0; + gy = (-luma28 + 8.0 * luma27 - 8.0 * luma25 + luma24) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (luma33 - luma21) / 2.0; + gy = (-luma29 + 8.0 * luma28 - 8.0 * luma26 + luma25) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (luma34 - luma22) / 2.0; + gy = (luma29 - luma27) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.04792235409415088; + float a = abd.x, b = abd.y, d = abd.z; + float T = a + d, D = a * d - b * b; + float delta = sqrt(max(T * T / 4.0 - D, 0.0)); + float L1 = T / 2.0 + delta, L2 = T / 2.0 - delta; + float sqrtL1 = sqrt(L1), sqrtL2 = sqrt(L2); + float theta = mix(mod(atan(L1 - a, b) + 3.141592653589793, 3.141592653589793), 0.0, abs(b) < 1.192092896e-7); + float lambda = sqrtL1; + float mu = mix((sqrtL1 - sqrtL2) / (sqrtL1 + sqrtL2), 0.0, sqrtL1 + sqrtL2 < 1.192092896e-7); + float angle = floor(theta * 24.0 / 3.141592653589793); + float strength = clamp(floor(log2(lambda * 2000.0 + 1.192092896e-7)), 0.0, 8.0); + float coherence = mix(mix(0.0, 1.0, mu >= 0.25), 2.0, mu >= 0.5); + float coord_y = ((angle * 9.0 + strength) * 3.0 + coherence + 0.5) / 648.0; + vec3 res = vec3(0.0, 0.0, 0.0); + vec4 w; + w = texture(ravu_lut3, vec2(0.1, coord_y)); + res += (inp1[local_pos + 2] + inp1[local_pos + 67]) * w[0]; + res += (inp0[local_pos + 16] + inp0[local_pos + 67]) * w[1]; + res += (inp1[local_pos + 16] + inp1[local_pos + 53]) * w[2]; + res += (inp0[local_pos + 30] + inp0[local_pos + 53]) * w[3]; + w = texture(ravu_lut3, vec2(0.3, coord_y)); + res += (inp1[local_pos + 30] + inp1[local_pos + 39]) * w[0]; + res += (inp0[local_pos + 44] + inp0[local_pos + 39]) * w[1]; + res += (inp0[local_pos + 15] + inp0[local_pos + 68]) * w[2]; + res += (inp1[local_pos + 15] + inp1[local_pos + 54]) * w[3]; + w = texture(ravu_lut3, vec2(0.5, coord_y)); + res += (inp0[local_pos + 29] + inp0[local_pos + 54]) * w[0]; + res += (inp1[local_pos + 29] + inp1[local_pos + 40]) * w[1]; + res += (inp0[local_pos + 43] + inp0[local_pos + 40]) * w[2]; + res += (inp1[local_pos + 43] + inp1[local_pos + 26]) * w[3]; + w = texture(ravu_lut3, vec2(0.7, coord_y)); + res += (inp1[local_pos + 14] + inp1[local_pos + 55]) * w[0]; + res += (inp0[local_pos + 28] + inp0[local_pos + 55]) * w[1]; + res += (inp1[local_pos + 28] + inp1[local_pos + 41]) * w[2]; + res += (inp0[local_pos + 42] + inp0[local_pos + 41]) * w[3]; + w = texture(ravu_lut3, vec2(0.9, coord_y)); + res += (inp1[local_pos + 42] + inp1[local_pos + 27]) * w[0]; + res += (inp0[local_pos + 56] + inp0[local_pos + 27]) * w[1]; + res = clamp(res, 0.0, 1.0); + imageStore(out_image, ivec2(gl_GlobalInvocationID) * 2 + ivec2(1, 0), vec4(res, 1.0)); + } + vec3 res; + res = inp0[local_pos + 42]; + imageStore(out_image, ivec2(gl_GlobalInvocationID) * 2 + ivec2(1, 1), vec4(res, 1.0)); + res = inp1[local_pos + 28]; + imageStore(out_image, ivec2(gl_GlobalInvocationID) * 2 + ivec2(0, 0), vec4(res, 1.0)); +} diff --git a/src/Effects/RAVU/RAVU_R4.hlsl b/src/Effects/RAVU/RAVU_R4.hlsl new file mode 100644 index 000000000..79104920f --- /dev/null +++ b/src/Effects/RAVU/RAVU_R4.hlsl @@ -0,0 +1,851 @@ +// This file is generated by the scripts available at https://github.com/hauuau/magpie-prescalers +// Please don't edit this file directly. +// Generated by: ravu.py --target luma --weights-file weights\ravu_weights-r4.py --float-format float16dx --use-compute-shader --use-magpie --overwrite +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +//!MAGPIE EFFECT +//!VERSION 4 + +//!TEXTURE +Texture2D INPUT; + +//!SAMPLER +//!FILTER POINT +SamplerState sam_INPUT; + +//!TEXTURE +//!WIDTH INPUT_WIDTH * 2 +//!HEIGHT INPUT_HEIGHT * 2 +Texture2D OUTPUT; + +//!SAMPLER +//!FILTER LINEAR +SamplerState sam_INPUT_LINEAR; + +//!TEXTURE +//!SOURCE ravu_lut4_f16.dds +//!FORMAT R16G16B16A16_FLOAT +Texture2D ravu_lut4; + +//!SAMPLER +//!FILTER LINEAR +SamplerState sam_ravu_lut4; + +//!TEXTURE +//!FORMAT R16_FLOAT +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +Texture2D ravu_int11; + +//!SAMPLER +//!FILTER POINT +SamplerState sam_ravu_int11; + +//!COMMON +#include "prescalers.hlsli" + +#define LAST_PASS 2 + +//!PASS 1 +//!DESC RAVU (step1, luma, r4, compute) +//!IN INPUT, ravu_lut4 +//!OUT ravu_int11 +//!BLOCK_SIZE 32, 8 +//!NUM_THREADS 32, 8 +shared float inp0[585]; + +#define CURRENT_PASS 1 + +#define GET_SAMPLE(x) dot(x.rgb, rgb2y) +#define imageStore(out_image, pos, val) imageStoreOverride(pos, val.x) +void imageStoreOverride(uint2 pos, float value) { ravu_int11[pos] = (value); } + +#define INPUT_tex(pos) GET_SAMPLE(vec4(texture(INPUT, pos))) +static const float2 INPUT_size = float2(GetInputSize()); +static const float2 INPUT_pt = float2(GetInputPt()); + +#define ravu_lut4_tex(pos) (vec4(texture(ravu_lut4, pos))) + +#define HOOKED_tex(pos) INPUT_tex(pos) +#define HOOKED_size INPUT_size +#define HOOKED_pt INPUT_pt + +void Pass1(uint2 blockStart, uint3 threadId) { + ivec2 group_base = ivec2(gl_WorkGroupID) * ivec2(gl_WorkGroupSize); + int local_pos = int(gl_LocalInvocationID.x) * 15 + int(gl_LocalInvocationID.y); + { + for (int id = int(gl_LocalInvocationIndex); id < 585; id += int(gl_WorkGroupSize.x * gl_WorkGroupSize.y)) { + uint x = (uint)id / 15, y = (uint)id % 15; + inp0[id] = + HOOKED_tex(HOOKED_pt * vec2(float(group_base.x + x) + (-2.5), float(group_base.y + y) + (-2.5))).x; + } + } + barrier(); +#if CURRENT_PASS == LAST_PASS + uint2 destPos = blockStart + threadId.xy * 2; + uint2 outputSize = GetOutputSize(); + if (destPos.x >= outputSize.x || destPos.y >= outputSize.y) { + return; + } +#endif + { + float luma57 = inp0[local_pos + 106]; + float luma58 = inp0[local_pos + 107]; + float luma59 = inp0[local_pos + 108]; + float luma60 = inp0[local_pos + 109]; + float luma61 = inp0[local_pos + 110]; + float luma62 = inp0[local_pos + 111]; + float luma8 = inp0[local_pos + 15]; + float luma9 = inp0[local_pos + 16]; + float luma10 = inp0[local_pos + 17]; + float luma11 = inp0[local_pos + 18]; + float luma12 = inp0[local_pos + 19]; + float luma1 = inp0[local_pos + 1]; + float luma13 = inp0[local_pos + 20]; + float luma14 = inp0[local_pos + 21]; + float luma15 = inp0[local_pos + 22]; + float luma2 = inp0[local_pos + 2]; + float luma16 = inp0[local_pos + 30]; + float luma17 = inp0[local_pos + 31]; + float luma18 = inp0[local_pos + 32]; + float luma19 = inp0[local_pos + 33]; + float luma20 = inp0[local_pos + 34]; + float luma21 = inp0[local_pos + 35]; + float luma22 = inp0[local_pos + 36]; + float luma23 = inp0[local_pos + 37]; + float luma3 = inp0[local_pos + 3]; + float luma24 = inp0[local_pos + 45]; + float luma25 = inp0[local_pos + 46]; + float luma26 = inp0[local_pos + 47]; + float luma27 = inp0[local_pos + 48]; + float luma28 = inp0[local_pos + 49]; + float luma4 = inp0[local_pos + 4]; + float luma29 = inp0[local_pos + 50]; + float luma30 = inp0[local_pos + 51]; + float luma31 = inp0[local_pos + 52]; + float luma5 = inp0[local_pos + 5]; + float luma32 = inp0[local_pos + 60]; + float luma33 = inp0[local_pos + 61]; + float luma34 = inp0[local_pos + 62]; + float luma35 = inp0[local_pos + 63]; + float luma36 = inp0[local_pos + 64]; + float luma37 = inp0[local_pos + 65]; + float luma38 = inp0[local_pos + 66]; + float luma39 = inp0[local_pos + 67]; + float luma6 = inp0[local_pos + 6]; + float luma40 = inp0[local_pos + 75]; + float luma41 = inp0[local_pos + 76]; + float luma42 = inp0[local_pos + 77]; + float luma43 = inp0[local_pos + 78]; + float luma44 = inp0[local_pos + 79]; + float luma45 = inp0[local_pos + 80]; + float luma46 = inp0[local_pos + 81]; + float luma47 = inp0[local_pos + 82]; + float luma48 = inp0[local_pos + 90]; + float luma49 = inp0[local_pos + 91]; + float luma50 = inp0[local_pos + 92]; + float luma51 = inp0[local_pos + 93]; + float luma52 = inp0[local_pos + 94]; + float luma53 = inp0[local_pos + 95]; + float luma54 = inp0[local_pos + 96]; + float luma55 = inp0[local_pos + 97]; + vec3 abd = vec3(0.0, 0.0, 0.0); + float gx, gy; + gx = (luma17 - luma1) / 2.0; + gy = (luma10 - luma8) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.011007348802298533; + gx = (luma18 - luma2) / 2.0; + gy = (-luma12 + 8.0 * luma11 - 8.0 * luma9 + luma8) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.018148050104365175; + gx = (luma19 - luma3) / 2.0; + gy = (-luma13 + 8.0 * luma12 - 8.0 * luma10 + luma9) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.0233025575973275; + gx = (luma20 - luma4) / 2.0; + gy = (-luma14 + 8.0 * luma13 - 8.0 * luma11 + luma10) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.0233025575973275; + gx = (luma21 - luma5) / 2.0; + gy = (-luma15 + 8.0 * luma14 - 8.0 * luma12 + luma11) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.018148050104365175; + gx = (luma22 - luma6) / 2.0; + gy = (luma15 - luma13) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.011007348802298533; + gx = (-luma33 + 8.0 * luma25 - 8.0 * luma9 + luma1) / 12.0; + gy = (luma18 - luma16) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.018148050104365175; + gx = (-luma34 + 8.0 * luma26 - 8.0 * luma10 + luma2) / 12.0; + gy = (-luma20 + 8.0 * luma19 - 8.0 * luma17 + luma16) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.02992107622879854; + gx = (-luma35 + 8.0 * luma27 - 8.0 * luma11 + luma3) / 12.0; + gy = (-luma21 + 8.0 * luma20 - 8.0 * luma18 + luma17) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.03841942237242872; + gx = (-luma36 + 8.0 * luma28 - 8.0 * luma12 + luma4) / 12.0; + gy = (-luma22 + 8.0 * luma21 - 8.0 * luma19 + luma18) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.03841942237242872; + gx = (-luma37 + 8.0 * luma29 - 8.0 * luma13 + luma5) / 12.0; + gy = (-luma23 + 8.0 * luma22 - 8.0 * luma20 + luma19) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.02992107622879854; + gx = (-luma38 + 8.0 * luma30 - 8.0 * luma14 + luma6) / 12.0; + gy = (luma23 - luma21) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.018148050104365175; + gx = (-luma41 + 8.0 * luma33 - 8.0 * luma17 + luma9) / 12.0; + gy = (luma26 - luma24) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.0233025575973275; + gx = (-luma42 + 8.0 * luma34 - 8.0 * luma18 + luma10) / 12.0; + gy = (-luma28 + 8.0 * luma27 - 8.0 * luma25 + luma24) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.03841942237242872; + gx = (-luma43 + 8.0 * luma35 - 8.0 * luma19 + luma11) / 12.0; + gy = (-luma29 + 8.0 * luma28 - 8.0 * luma26 + luma25) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.04933151482066013; + gx = (-luma44 + 8.0 * luma36 - 8.0 * luma20 + luma12) / 12.0; + gy = (-luma30 + 8.0 * luma29 - 8.0 * luma27 + luma26) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.04933151482066013; + gx = (-luma45 + 8.0 * luma37 - 8.0 * luma21 + luma13) / 12.0; + gy = (-luma31 + 8.0 * luma30 - 8.0 * luma28 + luma27) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.03841942237242872; + gx = (-luma46 + 8.0 * luma38 - 8.0 * luma22 + luma14) / 12.0; + gy = (luma31 - luma29) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.0233025575973275; + gx = (-luma49 + 8.0 * luma41 - 8.0 * luma25 + luma17) / 12.0; + gy = (luma34 - luma32) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.0233025575973275; + gx = (-luma50 + 8.0 * luma42 - 8.0 * luma26 + luma18) / 12.0; + gy = (-luma36 + 8.0 * luma35 - 8.0 * luma33 + luma32) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.03841942237242872; + gx = (-luma51 + 8.0 * luma43 - 8.0 * luma27 + luma19) / 12.0; + gy = (-luma37 + 8.0 * luma36 - 8.0 * luma34 + luma33) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.04933151482066013; + gx = (-luma52 + 8.0 * luma44 - 8.0 * luma28 + luma20) / 12.0; + gy = (-luma38 + 8.0 * luma37 - 8.0 * luma35 + luma34) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.04933151482066013; + gx = (-luma53 + 8.0 * luma45 - 8.0 * luma29 + luma21) / 12.0; + gy = (-luma39 + 8.0 * luma38 - 8.0 * luma36 + luma35) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.03841942237242872; + gx = (-luma54 + 8.0 * luma46 - 8.0 * luma30 + luma22) / 12.0; + gy = (luma39 - luma37) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.0233025575973275; + gx = (-luma57 + 8.0 * luma49 - 8.0 * luma33 + luma25) / 12.0; + gy = (luma42 - luma40) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.018148050104365175; + gx = (-luma58 + 8.0 * luma50 - 8.0 * luma34 + luma26) / 12.0; + gy = (-luma44 + 8.0 * luma43 - 8.0 * luma41 + luma40) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.02992107622879854; + gx = (-luma59 + 8.0 * luma51 - 8.0 * luma35 + luma27) / 12.0; + gy = (-luma45 + 8.0 * luma44 - 8.0 * luma42 + luma41) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.03841942237242872; + gx = (-luma60 + 8.0 * luma52 - 8.0 * luma36 + luma28) / 12.0; + gy = (-luma46 + 8.0 * luma45 - 8.0 * luma43 + luma42) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.03841942237242872; + gx = (-luma61 + 8.0 * luma53 - 8.0 * luma37 + luma29) / 12.0; + gy = (-luma47 + 8.0 * luma46 - 8.0 * luma44 + luma43) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.02992107622879854; + gx = (-luma62 + 8.0 * luma54 - 8.0 * luma38 + luma30) / 12.0; + gy = (luma47 - luma45) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.018148050104365175; + gx = (luma57 - luma41) / 2.0; + gy = (luma50 - luma48) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.011007348802298533; + gx = (luma58 - luma42) / 2.0; + gy = (-luma52 + 8.0 * luma51 - 8.0 * luma49 + luma48) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.018148050104365175; + gx = (luma59 - luma43) / 2.0; + gy = (-luma53 + 8.0 * luma52 - 8.0 * luma50 + luma49) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.0233025575973275; + gx = (luma60 - luma44) / 2.0; + gy = (-luma54 + 8.0 * luma53 - 8.0 * luma51 + luma50) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.0233025575973275; + gx = (luma61 - luma45) / 2.0; + gy = (-luma55 + 8.0 * luma54 - 8.0 * luma52 + luma51) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.018148050104365175; + gx = (luma62 - luma46) / 2.0; + gy = (luma55 - luma53) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.011007348802298533; + float a = abd.x, b = abd.y, d = abd.z; + float T = a + d, D = a * d - b * b; + float delta = sqrt(max(T * T / 4.0 - D, 0.0)); + float L1 = T / 2.0 + delta, L2 = T / 2.0 - delta; + float sqrtL1 = sqrt(L1), sqrtL2 = sqrt(L2); + float theta = mix(mod(atan(L1 - a, b) + 3.141592653589793, 3.141592653589793), 0.0, abs(b) < 1.192092896e-7); + float lambda = sqrtL1; + float mu = mix((sqrtL1 - sqrtL2) / (sqrtL1 + sqrtL2), 0.0, sqrtL1 + sqrtL2 < 1.192092896e-7); + float angle = floor(theta * 24.0 / 3.141592653589793); + float strength = clamp(floor(log2(lambda * 2000.0 + 1.192092896e-7)), 0.0, 8.0); + float coherence = mix(mix(0.0, 1.0, mu >= 0.25), 2.0, mu >= 0.5); + float coord_y = ((angle * 9.0 + strength) * 3.0 + coherence + 0.5) / 648.0; + float res = 0.0; + vec4 w; + w = texture(ravu_lut4, vec2(0.0625, coord_y)); + res += (inp0[local_pos + 0] + inp0[local_pos + 112]) * w[0]; + res += (inp0[local_pos + 1] + inp0[local_pos + 111]) * w[1]; + res += (inp0[local_pos + 2] + inp0[local_pos + 110]) * w[2]; + res += (inp0[local_pos + 3] + inp0[local_pos + 109]) * w[3]; + w = texture(ravu_lut4, vec2(0.1875, coord_y)); + res += (inp0[local_pos + 4] + inp0[local_pos + 108]) * w[0]; + res += (inp0[local_pos + 5] + inp0[local_pos + 107]) * w[1]; + res += (inp0[local_pos + 6] + inp0[local_pos + 106]) * w[2]; + res += (inp0[local_pos + 7] + inp0[local_pos + 105]) * w[3]; + w = texture(ravu_lut4, vec2(0.3125, coord_y)); + res += (inp0[local_pos + 15] + inp0[local_pos + 97]) * w[0]; + res += (inp0[local_pos + 16] + inp0[local_pos + 96]) * w[1]; + res += (inp0[local_pos + 17] + inp0[local_pos + 95]) * w[2]; + res += (inp0[local_pos + 18] + inp0[local_pos + 94]) * w[3]; + w = texture(ravu_lut4, vec2(0.4375, coord_y)); + res += (inp0[local_pos + 19] + inp0[local_pos + 93]) * w[0]; + res += (inp0[local_pos + 20] + inp0[local_pos + 92]) * w[1]; + res += (inp0[local_pos + 21] + inp0[local_pos + 91]) * w[2]; + res += (inp0[local_pos + 22] + inp0[local_pos + 90]) * w[3]; + w = texture(ravu_lut4, vec2(0.5625, coord_y)); + res += (inp0[local_pos + 30] + inp0[local_pos + 82]) * w[0]; + res += (inp0[local_pos + 31] + inp0[local_pos + 81]) * w[1]; + res += (inp0[local_pos + 32] + inp0[local_pos + 80]) * w[2]; + res += (inp0[local_pos + 33] + inp0[local_pos + 79]) * w[3]; + w = texture(ravu_lut4, vec2(0.6875, coord_y)); + res += (inp0[local_pos + 34] + inp0[local_pos + 78]) * w[0]; + res += (inp0[local_pos + 35] + inp0[local_pos + 77]) * w[1]; + res += (inp0[local_pos + 36] + inp0[local_pos + 76]) * w[2]; + res += (inp0[local_pos + 37] + inp0[local_pos + 75]) * w[3]; + w = texture(ravu_lut4, vec2(0.8125, coord_y)); + res += (inp0[local_pos + 45] + inp0[local_pos + 67]) * w[0]; + res += (inp0[local_pos + 46] + inp0[local_pos + 66]) * w[1]; + res += (inp0[local_pos + 47] + inp0[local_pos + 65]) * w[2]; + res += (inp0[local_pos + 48] + inp0[local_pos + 64]) * w[3]; + w = texture(ravu_lut4, vec2(0.9375, coord_y)); + res += (inp0[local_pos + 49] + inp0[local_pos + 63]) * w[0]; + res += (inp0[local_pos + 50] + inp0[local_pos + 62]) * w[1]; + res += (inp0[local_pos + 51] + inp0[local_pos + 61]) * w[2]; + res += (inp0[local_pos + 52] + inp0[local_pos + 60]) * w[3]; + res = clamp(res, 0.0, 1.0); + imageStore(out_image, ivec2(gl_GlobalInvocationID), res); + } +} +//!PASS 2 +//!DESC RAVU (step2, luma, r4, compute) +//!IN INPUT, ravu_lut4, ravu_int11 +//!OUT OUTPUT +//!BLOCK_SIZE 64, 16 +//!NUM_THREADS 32, 8 +shared float inp0[585]; +shared float inp1[585]; + +#define CURRENT_PASS 2 + +#define GET_SAMPLE(x) dot(x.rgb, rgb2y) +#define imageStore(out_image, pos, val) imageStoreOverride(pos, val.x) +void imageStoreOverride(uint2 pos, float value) { + float2 UV = mul(rgb2uv, INPUT.SampleLevel(sam_INPUT_LINEAR, HOOKED_map(pos), 0).rgb); + OUTPUT[pos] = float4(mul(yuv2rgb, float3(value.x, UV)), 1.0); +} + +#define INPUT_tex(pos) GET_SAMPLE(vec4(texture(INPUT, pos))) +static const float2 INPUT_size = float2(GetInputSize()); +static const float2 INPUT_pt = float2(GetInputPt()); + +#define ravu_lut4_tex(pos) (vec4(texture(ravu_lut4, pos))) + +#define ravu_int11_tex(pos) (float(texture(ravu_int11, pos).x)) +static const float2 ravu_int11_size = float2(GetInputSize().x, GetInputSize().y); +static const float2 ravu_int11_pt = float2(1.0 / (ravu_int11_size.x), 1.0 / (ravu_int11_size.y)); + +#define HOOKED_tex(pos) INPUT_tex(pos) +#define HOOKED_size INPUT_size +#define HOOKED_pt INPUT_pt + +void Pass2(uint2 blockStart, uint3 threadId) { + ivec2 group_base = ivec2(gl_WorkGroupID) * ivec2(gl_WorkGroupSize); + int local_pos = int(gl_LocalInvocationID.x) * 15 + int(gl_LocalInvocationID.y); + { + for (int id = int(gl_LocalInvocationIndex); id < 585; id += int(gl_WorkGroupSize.x * gl_WorkGroupSize.y)) { + uint x = (uint)id / 15, y = (uint)id % 15; + inp0[id] = + ravu_int11_tex(ravu_int11_pt * vec2(float(group_base.x + x) + (-3.5), float(group_base.y + y) + (-3.5))) + .x; + } + } + { + for (int id = int(gl_LocalInvocationIndex); id < 585; id += int(gl_WorkGroupSize.x * gl_WorkGroupSize.y)) { + uint x = (uint)id / 15, y = (uint)id % 15; + inp1[id] = + HOOKED_tex(HOOKED_pt * vec2(float(group_base.x + x) + (-2.5), float(group_base.y + y) + (-2.5))).x; + } + } + barrier(); +#if CURRENT_PASS == LAST_PASS + uint2 destPos = blockStart + threadId.xy * 2; + uint2 outputSize = GetOutputSize(); + if (destPos.x >= outputSize.x || destPos.y >= outputSize.y) { + return; + } +#endif + { + float luma16 = inp0[local_pos + 18]; + float luma9 = inp0[local_pos + 19]; + float luma2 = inp0[local_pos + 20]; + float luma32 = inp0[local_pos + 32]; + float luma25 = inp0[local_pos + 33]; + float luma18 = inp0[local_pos + 34]; + float luma11 = inp0[local_pos + 35]; + float luma4 = inp0[local_pos + 36]; + float luma48 = inp0[local_pos + 46]; + float luma41 = inp0[local_pos + 47]; + float luma34 = inp0[local_pos + 48]; + float luma27 = inp0[local_pos + 49]; + float luma20 = inp0[local_pos + 50]; + float luma13 = inp0[local_pos + 51]; + float luma6 = inp0[local_pos + 52]; + float luma57 = inp0[local_pos + 61]; + float luma50 = inp0[local_pos + 62]; + float luma43 = inp0[local_pos + 63]; + float luma36 = inp0[local_pos + 64]; + float luma29 = inp0[local_pos + 65]; + float luma22 = inp0[local_pos + 66]; + float luma15 = inp0[local_pos + 67]; + float luma59 = inp0[local_pos + 77]; + float luma52 = inp0[local_pos + 78]; + float luma45 = inp0[local_pos + 79]; + float luma38 = inp0[local_pos + 80]; + float luma31 = inp0[local_pos + 81]; + float luma61 = inp0[local_pos + 93]; + float luma54 = inp0[local_pos + 94]; + float luma47 = inp0[local_pos + 95]; + float luma24 = inp1[local_pos + 17]; + float luma17 = inp1[local_pos + 18]; + float luma10 = inp1[local_pos + 19]; + float luma3 = inp1[local_pos + 20]; + float luma40 = inp1[local_pos + 31]; + float luma33 = inp1[local_pos + 32]; + float luma26 = inp1[local_pos + 33]; + float luma19 = inp1[local_pos + 34]; + float luma12 = inp1[local_pos + 35]; + float luma5 = inp1[local_pos + 36]; + float luma8 = inp1[local_pos + 3]; + float luma49 = inp1[local_pos + 46]; + float luma42 = inp1[local_pos + 47]; + float luma35 = inp1[local_pos + 48]; + float luma28 = inp1[local_pos + 49]; + float luma1 = inp1[local_pos + 4]; + float luma21 = inp1[local_pos + 50]; + float luma14 = inp1[local_pos + 51]; + float luma58 = inp1[local_pos + 61]; + float luma51 = inp1[local_pos + 62]; + float luma44 = inp1[local_pos + 63]; + float luma37 = inp1[local_pos + 64]; + float luma30 = inp1[local_pos + 65]; + float luma23 = inp1[local_pos + 66]; + float luma60 = inp1[local_pos + 77]; + float luma53 = inp1[local_pos + 78]; + float luma46 = inp1[local_pos + 79]; + float luma39 = inp1[local_pos + 80]; + float luma62 = inp1[local_pos + 93]; + float luma55 = inp1[local_pos + 94]; + vec3 abd = vec3(0.0, 0.0, 0.0); + float gx, gy; + gx = (luma17 - luma1) / 2.0; + gy = (luma10 - luma8) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.011007348802298533; + gx = (luma18 - luma2) / 2.0; + gy = (-luma12 + 8.0 * luma11 - 8.0 * luma9 + luma8) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.018148050104365175; + gx = (luma19 - luma3) / 2.0; + gy = (-luma13 + 8.0 * luma12 - 8.0 * luma10 + luma9) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.0233025575973275; + gx = (luma20 - luma4) / 2.0; + gy = (-luma14 + 8.0 * luma13 - 8.0 * luma11 + luma10) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.0233025575973275; + gx = (luma21 - luma5) / 2.0; + gy = (-luma15 + 8.0 * luma14 - 8.0 * luma12 + luma11) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.018148050104365175; + gx = (luma22 - luma6) / 2.0; + gy = (luma15 - luma13) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.011007348802298533; + gx = (-luma33 + 8.0 * luma25 - 8.0 * luma9 + luma1) / 12.0; + gy = (luma18 - luma16) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.018148050104365175; + gx = (-luma34 + 8.0 * luma26 - 8.0 * luma10 + luma2) / 12.0; + gy = (-luma20 + 8.0 * luma19 - 8.0 * luma17 + luma16) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.02992107622879854; + gx = (-luma35 + 8.0 * luma27 - 8.0 * luma11 + luma3) / 12.0; + gy = (-luma21 + 8.0 * luma20 - 8.0 * luma18 + luma17) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.03841942237242872; + gx = (-luma36 + 8.0 * luma28 - 8.0 * luma12 + luma4) / 12.0; + gy = (-luma22 + 8.0 * luma21 - 8.0 * luma19 + luma18) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.03841942237242872; + gx = (-luma37 + 8.0 * luma29 - 8.0 * luma13 + luma5) / 12.0; + gy = (-luma23 + 8.0 * luma22 - 8.0 * luma20 + luma19) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.02992107622879854; + gx = (-luma38 + 8.0 * luma30 - 8.0 * luma14 + luma6) / 12.0; + gy = (luma23 - luma21) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.018148050104365175; + gx = (-luma41 + 8.0 * luma33 - 8.0 * luma17 + luma9) / 12.0; + gy = (luma26 - luma24) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.0233025575973275; + gx = (-luma42 + 8.0 * luma34 - 8.0 * luma18 + luma10) / 12.0; + gy = (-luma28 + 8.0 * luma27 - 8.0 * luma25 + luma24) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.03841942237242872; + gx = (-luma43 + 8.0 * luma35 - 8.0 * luma19 + luma11) / 12.0; + gy = (-luma29 + 8.0 * luma28 - 8.0 * luma26 + luma25) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.04933151482066013; + gx = (-luma44 + 8.0 * luma36 - 8.0 * luma20 + luma12) / 12.0; + gy = (-luma30 + 8.0 * luma29 - 8.0 * luma27 + luma26) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.04933151482066013; + gx = (-luma45 + 8.0 * luma37 - 8.0 * luma21 + luma13) / 12.0; + gy = (-luma31 + 8.0 * luma30 - 8.0 * luma28 + luma27) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.03841942237242872; + gx = (-luma46 + 8.0 * luma38 - 8.0 * luma22 + luma14) / 12.0; + gy = (luma31 - luma29) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.0233025575973275; + gx = (-luma49 + 8.0 * luma41 - 8.0 * luma25 + luma17) / 12.0; + gy = (luma34 - luma32) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.0233025575973275; + gx = (-luma50 + 8.0 * luma42 - 8.0 * luma26 + luma18) / 12.0; + gy = (-luma36 + 8.0 * luma35 - 8.0 * luma33 + luma32) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.03841942237242872; + gx = (-luma51 + 8.0 * luma43 - 8.0 * luma27 + luma19) / 12.0; + gy = (-luma37 + 8.0 * luma36 - 8.0 * luma34 + luma33) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.04933151482066013; + gx = (-luma52 + 8.0 * luma44 - 8.0 * luma28 + luma20) / 12.0; + gy = (-luma38 + 8.0 * luma37 - 8.0 * luma35 + luma34) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.04933151482066013; + gx = (-luma53 + 8.0 * luma45 - 8.0 * luma29 + luma21) / 12.0; + gy = (-luma39 + 8.0 * luma38 - 8.0 * luma36 + luma35) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.03841942237242872; + gx = (-luma54 + 8.0 * luma46 - 8.0 * luma30 + luma22) / 12.0; + gy = (luma39 - luma37) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.0233025575973275; + gx = (-luma57 + 8.0 * luma49 - 8.0 * luma33 + luma25) / 12.0; + gy = (luma42 - luma40) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.018148050104365175; + gx = (-luma58 + 8.0 * luma50 - 8.0 * luma34 + luma26) / 12.0; + gy = (-luma44 + 8.0 * luma43 - 8.0 * luma41 + luma40) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.02992107622879854; + gx = (-luma59 + 8.0 * luma51 - 8.0 * luma35 + luma27) / 12.0; + gy = (-luma45 + 8.0 * luma44 - 8.0 * luma42 + luma41) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.03841942237242872; + gx = (-luma60 + 8.0 * luma52 - 8.0 * luma36 + luma28) / 12.0; + gy = (-luma46 + 8.0 * luma45 - 8.0 * luma43 + luma42) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.03841942237242872; + gx = (-luma61 + 8.0 * luma53 - 8.0 * luma37 + luma29) / 12.0; + gy = (-luma47 + 8.0 * luma46 - 8.0 * luma44 + luma43) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.02992107622879854; + gx = (-luma62 + 8.0 * luma54 - 8.0 * luma38 + luma30) / 12.0; + gy = (luma47 - luma45) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.018148050104365175; + gx = (luma57 - luma41) / 2.0; + gy = (luma50 - luma48) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.011007348802298533; + gx = (luma58 - luma42) / 2.0; + gy = (-luma52 + 8.0 * luma51 - 8.0 * luma49 + luma48) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.018148050104365175; + gx = (luma59 - luma43) / 2.0; + gy = (-luma53 + 8.0 * luma52 - 8.0 * luma50 + luma49) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.0233025575973275; + gx = (luma60 - luma44) / 2.0; + gy = (-luma54 + 8.0 * luma53 - 8.0 * luma51 + luma50) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.0233025575973275; + gx = (luma61 - luma45) / 2.0; + gy = (-luma55 + 8.0 * luma54 - 8.0 * luma52 + luma51) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.018148050104365175; + gx = (luma62 - luma46) / 2.0; + gy = (luma55 - luma53) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.011007348802298533; + float a = abd.x, b = abd.y, d = abd.z; + float T = a + d, D = a * d - b * b; + float delta = sqrt(max(T * T / 4.0 - D, 0.0)); + float L1 = T / 2.0 + delta, L2 = T / 2.0 - delta; + float sqrtL1 = sqrt(L1), sqrtL2 = sqrt(L2); + float theta = mix(mod(atan(L1 - a, b) + 3.141592653589793, 3.141592653589793), 0.0, abs(b) < 1.192092896e-7); + float lambda = sqrtL1; + float mu = mix((sqrtL1 - sqrtL2) / (sqrtL1 + sqrtL2), 0.0, sqrtL1 + sqrtL2 < 1.192092896e-7); + float angle = floor(theta * 24.0 / 3.141592653589793); + float strength = clamp(floor(log2(lambda * 2000.0 + 1.192092896e-7)), 0.0, 8.0); + float coherence = mix(mix(0.0, 1.0, mu >= 0.25), 2.0, mu >= 0.5); + float coord_y = ((angle * 9.0 + strength) * 3.0 + coherence + 0.5) / 648.0; + float res = 0.0; + vec4 w; + w = texture(ravu_lut4, vec2(0.0625, coord_y)); + res += (inp0[local_pos + 4] + inp0[local_pos + 109]) * w[0]; + res += (inp1[local_pos + 4] + inp1[local_pos + 93]) * w[1]; + res += (inp0[local_pos + 20] + inp0[local_pos + 93]) * w[2]; + res += (inp1[local_pos + 20] + inp1[local_pos + 77]) * w[3]; + w = texture(ravu_lut4, vec2(0.1875, coord_y)); + res += (inp0[local_pos + 36] + inp0[local_pos + 77]) * w[0]; + res += (inp1[local_pos + 36] + inp1[local_pos + 61]) * w[1]; + res += (inp0[local_pos + 52] + inp0[local_pos + 61]) * w[2]; + res += (inp1[local_pos + 52] + inp1[local_pos + 45]) * w[3]; + w = texture(ravu_lut4, vec2(0.3125, coord_y)); + res += (inp1[local_pos + 3] + inp1[local_pos + 94]) * w[0]; + res += (inp0[local_pos + 19] + inp0[local_pos + 94]) * w[1]; + res += (inp1[local_pos + 19] + inp1[local_pos + 78]) * w[2]; + res += (inp0[local_pos + 35] + inp0[local_pos + 78]) * w[3]; + w = texture(ravu_lut4, vec2(0.4375, coord_y)); + res += (inp1[local_pos + 35] + inp1[local_pos + 62]) * w[0]; + res += (inp0[local_pos + 51] + inp0[local_pos + 62]) * w[1]; + res += (inp1[local_pos + 51] + inp1[local_pos + 46]) * w[2]; + res += (inp0[local_pos + 67] + inp0[local_pos + 46]) * w[3]; + w = texture(ravu_lut4, vec2(0.5625, coord_y)); + res += (inp0[local_pos + 18] + inp0[local_pos + 95]) * w[0]; + res += (inp1[local_pos + 18] + inp1[local_pos + 79]) * w[1]; + res += (inp0[local_pos + 34] + inp0[local_pos + 79]) * w[2]; + res += (inp1[local_pos + 34] + inp1[local_pos + 63]) * w[3]; + w = texture(ravu_lut4, vec2(0.6875, coord_y)); + res += (inp0[local_pos + 50] + inp0[local_pos + 63]) * w[0]; + res += (inp1[local_pos + 50] + inp1[local_pos + 47]) * w[1]; + res += (inp0[local_pos + 66] + inp0[local_pos + 47]) * w[2]; + res += (inp1[local_pos + 66] + inp1[local_pos + 31]) * w[3]; + w = texture(ravu_lut4, vec2(0.8125, coord_y)); + res += (inp1[local_pos + 17] + inp1[local_pos + 80]) * w[0]; + res += (inp0[local_pos + 33] + inp0[local_pos + 80]) * w[1]; + res += (inp1[local_pos + 33] + inp1[local_pos + 64]) * w[2]; + res += (inp0[local_pos + 49] + inp0[local_pos + 64]) * w[3]; + w = texture(ravu_lut4, vec2(0.9375, coord_y)); + res += (inp1[local_pos + 49] + inp1[local_pos + 48]) * w[0]; + res += (inp0[local_pos + 65] + inp0[local_pos + 48]) * w[1]; + res += (inp1[local_pos + 65] + inp1[local_pos + 32]) * w[2]; + res += (inp0[local_pos + 81] + inp0[local_pos + 32]) * w[3]; + res = clamp(res, 0.0, 1.0); + imageStore(out_image, ivec2(gl_GlobalInvocationID) * 2 + ivec2(0, 1), res); + } + { + float luma62 = inp0[local_pos + 108]; + float luma55 = inp0[local_pos + 109]; + float luma8 = inp0[local_pos + 18]; + float luma1 = inp0[local_pos + 19]; + float luma24 = inp0[local_pos + 32]; + float luma17 = inp0[local_pos + 33]; + float luma10 = inp0[local_pos + 34]; + float luma3 = inp0[local_pos + 35]; + float luma40 = inp0[local_pos + 46]; + float luma33 = inp0[local_pos + 47]; + float luma26 = inp0[local_pos + 48]; + float luma19 = inp0[local_pos + 49]; + float luma12 = inp0[local_pos + 50]; + float luma5 = inp0[local_pos + 51]; + float luma49 = inp0[local_pos + 61]; + float luma42 = inp0[local_pos + 62]; + float luma35 = inp0[local_pos + 63]; + float luma28 = inp0[local_pos + 64]; + float luma21 = inp0[local_pos + 65]; + float luma14 = inp0[local_pos + 66]; + float luma58 = inp0[local_pos + 76]; + float luma51 = inp0[local_pos + 77]; + float luma44 = inp0[local_pos + 78]; + float luma37 = inp0[local_pos + 79]; + float luma30 = inp0[local_pos + 80]; + float luma23 = inp0[local_pos + 81]; + float luma60 = inp0[local_pos + 92]; + float luma53 = inp0[local_pos + 93]; + float luma46 = inp0[local_pos + 94]; + float luma39 = inp0[local_pos + 95]; + float luma16 = inp1[local_pos + 17]; + float luma9 = inp1[local_pos + 18]; + float luma2 = inp1[local_pos + 19]; + float luma32 = inp1[local_pos + 31]; + float luma25 = inp1[local_pos + 32]; + float luma18 = inp1[local_pos + 33]; + float luma11 = inp1[local_pos + 34]; + float luma4 = inp1[local_pos + 35]; + float luma48 = inp1[local_pos + 45]; + float luma41 = inp1[local_pos + 46]; + float luma34 = inp1[local_pos + 47]; + float luma27 = inp1[local_pos + 48]; + float luma20 = inp1[local_pos + 49]; + float luma13 = inp1[local_pos + 50]; + float luma6 = inp1[local_pos + 51]; + float luma57 = inp1[local_pos + 60]; + float luma50 = inp1[local_pos + 61]; + float luma43 = inp1[local_pos + 62]; + float luma36 = inp1[local_pos + 63]; + float luma29 = inp1[local_pos + 64]; + float luma22 = inp1[local_pos + 65]; + float luma15 = inp1[local_pos + 66]; + float luma59 = inp1[local_pos + 76]; + float luma52 = inp1[local_pos + 77]; + float luma45 = inp1[local_pos + 78]; + float luma38 = inp1[local_pos + 79]; + float luma31 = inp1[local_pos + 80]; + float luma61 = inp1[local_pos + 92]; + float luma54 = inp1[local_pos + 93]; + float luma47 = inp1[local_pos + 94]; + vec3 abd = vec3(0.0, 0.0, 0.0); + float gx, gy; + gx = (luma17 - luma1) / 2.0; + gy = (luma10 - luma8) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.011007348802298533; + gx = (luma18 - luma2) / 2.0; + gy = (-luma12 + 8.0 * luma11 - 8.0 * luma9 + luma8) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.018148050104365175; + gx = (luma19 - luma3) / 2.0; + gy = (-luma13 + 8.0 * luma12 - 8.0 * luma10 + luma9) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.0233025575973275; + gx = (luma20 - luma4) / 2.0; + gy = (-luma14 + 8.0 * luma13 - 8.0 * luma11 + luma10) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.0233025575973275; + gx = (luma21 - luma5) / 2.0; + gy = (-luma15 + 8.0 * luma14 - 8.0 * luma12 + luma11) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.018148050104365175; + gx = (luma22 - luma6) / 2.0; + gy = (luma15 - luma13) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.011007348802298533; + gx = (-luma33 + 8.0 * luma25 - 8.0 * luma9 + luma1) / 12.0; + gy = (luma18 - luma16) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.018148050104365175; + gx = (-luma34 + 8.0 * luma26 - 8.0 * luma10 + luma2) / 12.0; + gy = (-luma20 + 8.0 * luma19 - 8.0 * luma17 + luma16) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.02992107622879854; + gx = (-luma35 + 8.0 * luma27 - 8.0 * luma11 + luma3) / 12.0; + gy = (-luma21 + 8.0 * luma20 - 8.0 * luma18 + luma17) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.03841942237242872; + gx = (-luma36 + 8.0 * luma28 - 8.0 * luma12 + luma4) / 12.0; + gy = (-luma22 + 8.0 * luma21 - 8.0 * luma19 + luma18) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.03841942237242872; + gx = (-luma37 + 8.0 * luma29 - 8.0 * luma13 + luma5) / 12.0; + gy = (-luma23 + 8.0 * luma22 - 8.0 * luma20 + luma19) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.02992107622879854; + gx = (-luma38 + 8.0 * luma30 - 8.0 * luma14 + luma6) / 12.0; + gy = (luma23 - luma21) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.018148050104365175; + gx = (-luma41 + 8.0 * luma33 - 8.0 * luma17 + luma9) / 12.0; + gy = (luma26 - luma24) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.0233025575973275; + gx = (-luma42 + 8.0 * luma34 - 8.0 * luma18 + luma10) / 12.0; + gy = (-luma28 + 8.0 * luma27 - 8.0 * luma25 + luma24) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.03841942237242872; + gx = (-luma43 + 8.0 * luma35 - 8.0 * luma19 + luma11) / 12.0; + gy = (-luma29 + 8.0 * luma28 - 8.0 * luma26 + luma25) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.04933151482066013; + gx = (-luma44 + 8.0 * luma36 - 8.0 * luma20 + luma12) / 12.0; + gy = (-luma30 + 8.0 * luma29 - 8.0 * luma27 + luma26) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.04933151482066013; + gx = (-luma45 + 8.0 * luma37 - 8.0 * luma21 + luma13) / 12.0; + gy = (-luma31 + 8.0 * luma30 - 8.0 * luma28 + luma27) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.03841942237242872; + gx = (-luma46 + 8.0 * luma38 - 8.0 * luma22 + luma14) / 12.0; + gy = (luma31 - luma29) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.0233025575973275; + gx = (-luma49 + 8.0 * luma41 - 8.0 * luma25 + luma17) / 12.0; + gy = (luma34 - luma32) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.0233025575973275; + gx = (-luma50 + 8.0 * luma42 - 8.0 * luma26 + luma18) / 12.0; + gy = (-luma36 + 8.0 * luma35 - 8.0 * luma33 + luma32) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.03841942237242872; + gx = (-luma51 + 8.0 * luma43 - 8.0 * luma27 + luma19) / 12.0; + gy = (-luma37 + 8.0 * luma36 - 8.0 * luma34 + luma33) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.04933151482066013; + gx = (-luma52 + 8.0 * luma44 - 8.0 * luma28 + luma20) / 12.0; + gy = (-luma38 + 8.0 * luma37 - 8.0 * luma35 + luma34) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.04933151482066013; + gx = (-luma53 + 8.0 * luma45 - 8.0 * luma29 + luma21) / 12.0; + gy = (-luma39 + 8.0 * luma38 - 8.0 * luma36 + luma35) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.03841942237242872; + gx = (-luma54 + 8.0 * luma46 - 8.0 * luma30 + luma22) / 12.0; + gy = (luma39 - luma37) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.0233025575973275; + gx = (-luma57 + 8.0 * luma49 - 8.0 * luma33 + luma25) / 12.0; + gy = (luma42 - luma40) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.018148050104365175; + gx = (-luma58 + 8.0 * luma50 - 8.0 * luma34 + luma26) / 12.0; + gy = (-luma44 + 8.0 * luma43 - 8.0 * luma41 + luma40) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.02992107622879854; + gx = (-luma59 + 8.0 * luma51 - 8.0 * luma35 + luma27) / 12.0; + gy = (-luma45 + 8.0 * luma44 - 8.0 * luma42 + luma41) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.03841942237242872; + gx = (-luma60 + 8.0 * luma52 - 8.0 * luma36 + luma28) / 12.0; + gy = (-luma46 + 8.0 * luma45 - 8.0 * luma43 + luma42) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.03841942237242872; + gx = (-luma61 + 8.0 * luma53 - 8.0 * luma37 + luma29) / 12.0; + gy = (-luma47 + 8.0 * luma46 - 8.0 * luma44 + luma43) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.02992107622879854; + gx = (-luma62 + 8.0 * luma54 - 8.0 * luma38 + luma30) / 12.0; + gy = (luma47 - luma45) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.018148050104365175; + gx = (luma57 - luma41) / 2.0; + gy = (luma50 - luma48) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.011007348802298533; + gx = (luma58 - luma42) / 2.0; + gy = (-luma52 + 8.0 * luma51 - 8.0 * luma49 + luma48) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.018148050104365175; + gx = (luma59 - luma43) / 2.0; + gy = (-luma53 + 8.0 * luma52 - 8.0 * luma50 + luma49) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.0233025575973275; + gx = (luma60 - luma44) / 2.0; + gy = (-luma54 + 8.0 * luma53 - 8.0 * luma51 + luma50) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.0233025575973275; + gx = (luma61 - luma45) / 2.0; + gy = (-luma55 + 8.0 * luma54 - 8.0 * luma52 + luma51) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.018148050104365175; + gx = (luma62 - luma46) / 2.0; + gy = (luma55 - luma53) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.011007348802298533; + float a = abd.x, b = abd.y, d = abd.z; + float T = a + d, D = a * d - b * b; + float delta = sqrt(max(T * T / 4.0 - D, 0.0)); + float L1 = T / 2.0 + delta, L2 = T / 2.0 - delta; + float sqrtL1 = sqrt(L1), sqrtL2 = sqrt(L2); + float theta = mix(mod(atan(L1 - a, b) + 3.141592653589793, 3.141592653589793), 0.0, abs(b) < 1.192092896e-7); + float lambda = sqrtL1; + float mu = mix((sqrtL1 - sqrtL2) / (sqrtL1 + sqrtL2), 0.0, sqrtL1 + sqrtL2 < 1.192092896e-7); + float angle = floor(theta * 24.0 / 3.141592653589793); + float strength = clamp(floor(log2(lambda * 2000.0 + 1.192092896e-7)), 0.0, 8.0); + float coherence = mix(mix(0.0, 1.0, mu >= 0.25), 2.0, mu >= 0.5); + float coord_y = ((angle * 9.0 + strength) * 3.0 + coherence + 0.5) / 648.0; + float res = 0.0; + vec4 w; + w = texture(ravu_lut4, vec2(0.0625, coord_y)); + res += (inp1[local_pos + 3] + inp1[local_pos + 108]) * w[0]; + res += (inp0[local_pos + 19] + inp0[local_pos + 108]) * w[1]; + res += (inp1[local_pos + 19] + inp1[local_pos + 92]) * w[2]; + res += (inp0[local_pos + 35] + inp0[local_pos + 92]) * w[3]; + w = texture(ravu_lut4, vec2(0.1875, coord_y)); + res += (inp1[local_pos + 35] + inp1[local_pos + 76]) * w[0]; + res += (inp0[local_pos + 51] + inp0[local_pos + 76]) * w[1]; + res += (inp1[local_pos + 51] + inp1[local_pos + 60]) * w[2]; + res += (inp0[local_pos + 67] + inp0[local_pos + 60]) * w[3]; + w = texture(ravu_lut4, vec2(0.3125, coord_y)); + res += (inp0[local_pos + 18] + inp0[local_pos + 109]) * w[0]; + res += (inp1[local_pos + 18] + inp1[local_pos + 93]) * w[1]; + res += (inp0[local_pos + 34] + inp0[local_pos + 93]) * w[2]; + res += (inp1[local_pos + 34] + inp1[local_pos + 77]) * w[3]; + w = texture(ravu_lut4, vec2(0.4375, coord_y)); + res += (inp0[local_pos + 50] + inp0[local_pos + 77]) * w[0]; + res += (inp1[local_pos + 50] + inp1[local_pos + 61]) * w[1]; + res += (inp0[local_pos + 66] + inp0[local_pos + 61]) * w[2]; + res += (inp1[local_pos + 66] + inp1[local_pos + 45]) * w[3]; + w = texture(ravu_lut4, vec2(0.5625, coord_y)); + res += (inp1[local_pos + 17] + inp1[local_pos + 94]) * w[0]; + res += (inp0[local_pos + 33] + inp0[local_pos + 94]) * w[1]; + res += (inp1[local_pos + 33] + inp1[local_pos + 78]) * w[2]; + res += (inp0[local_pos + 49] + inp0[local_pos + 78]) * w[3]; + w = texture(ravu_lut4, vec2(0.6875, coord_y)); + res += (inp1[local_pos + 49] + inp1[local_pos + 62]) * w[0]; + res += (inp0[local_pos + 65] + inp0[local_pos + 62]) * w[1]; + res += (inp1[local_pos + 65] + inp1[local_pos + 46]) * w[2]; + res += (inp0[local_pos + 81] + inp0[local_pos + 46]) * w[3]; + w = texture(ravu_lut4, vec2(0.8125, coord_y)); + res += (inp0[local_pos + 32] + inp0[local_pos + 95]) * w[0]; + res += (inp1[local_pos + 32] + inp1[local_pos + 79]) * w[1]; + res += (inp0[local_pos + 48] + inp0[local_pos + 79]) * w[2]; + res += (inp1[local_pos + 48] + inp1[local_pos + 63]) * w[3]; + w = texture(ravu_lut4, vec2(0.9375, coord_y)); + res += (inp0[local_pos + 64] + inp0[local_pos + 63]) * w[0]; + res += (inp1[local_pos + 64] + inp1[local_pos + 47]) * w[1]; + res += (inp0[local_pos + 80] + inp0[local_pos + 47]) * w[2]; + res += (inp1[local_pos + 80] + inp1[local_pos + 31]) * w[3]; + res = clamp(res, 0.0, 1.0); + imageStore(out_image, ivec2(gl_GlobalInvocationID) * 2 + ivec2(1, 0), res); + } + float res; + res = inp0[local_pos + 64]; + imageStore(out_image, ivec2(gl_GlobalInvocationID) * 2 + ivec2(1, 1), res); + res = inp1[local_pos + 48]; + imageStore(out_image, ivec2(gl_GlobalInvocationID) * 2 + ivec2(0, 0), res); +} diff --git a/src/Effects/RAVU/RAVU_R4_RGB.hlsl b/src/Effects/RAVU/RAVU_R4_RGB.hlsl new file mode 100644 index 000000000..98dcd40be --- /dev/null +++ b/src/Effects/RAVU/RAVU_R4_RGB.hlsl @@ -0,0 +1,852 @@ +// This file is generated by the scripts available at https://github.com/hauuau/magpie-prescalers +// Please don't edit this file directly. +// Generated by: ravu.py --target rgb --weights-file weights\ravu_weights-r4.py --float-format float16dx --use-compute-shader --use-magpie --overwrite +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +//!MAGPIE EFFECT +//!VERSION 4 + +//!TEXTURE +Texture2D INPUT; + +//!SAMPLER +//!FILTER POINT +SamplerState sam_INPUT; + +//!TEXTURE +//!WIDTH INPUT_WIDTH * 2 +//!HEIGHT INPUT_HEIGHT * 2 +Texture2D OUTPUT; + +//!TEXTURE +//!SOURCE ravu_lut4_f16.dds +//!FORMAT R16G16B16A16_FLOAT +Texture2D ravu_lut4; + +//!SAMPLER +//!FILTER LINEAR +SamplerState sam_ravu_lut4; + +//!TEXTURE +//!FORMAT R16G16B16A16_FLOAT +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +Texture2D ravu_int11; + +//!SAMPLER +//!FILTER POINT +SamplerState sam_ravu_int11; + +//!COMMON +#include "prescalers.hlsli" + +#define LAST_PASS 2 + +//!PASS 1 +//!DESC RAVU (step1, rgb, r4, compute) +//!IN INPUT, ravu_lut4 +//!OUT ravu_int11 +//!BLOCK_SIZE 32, 8 +//!NUM_THREADS 32, 8 +static const vec3 color_primary = vec3(0.2126, 0.7152, 0.0722); +shared vec3 inp0[585]; +shared float inp_luma0[585]; + +#define CURRENT_PASS 1 + +#define GET_SAMPLE(x) x +#define imageStore(out_image, pos, val) imageStoreOverride(pos, val.xyz) +void imageStoreOverride(uint2 pos, vec3 value) { ravu_int11[pos] = vec4(value, 0.0); } + +#define INPUT_tex(pos) GET_SAMPLE(vec4(texture(INPUT, pos))) +static const float2 INPUT_size = float2(GetInputSize()); +static const float2 INPUT_pt = float2(GetInputPt()); + +#define ravu_lut4_tex(pos) (vec4(texture(ravu_lut4, pos))) + +#define HOOKED_tex(pos) INPUT_tex(pos) +#define HOOKED_size INPUT_size +#define HOOKED_pt INPUT_pt + +void Pass1(uint2 blockStart, uint3 threadId) { + ivec2 group_base = ivec2(gl_WorkGroupID) * ivec2(gl_WorkGroupSize); + int local_pos = int(gl_LocalInvocationID.x) * 15 + int(gl_LocalInvocationID.y); + { + for (int id = int(gl_LocalInvocationIndex); id < 585; id += int(gl_WorkGroupSize.x * gl_WorkGroupSize.y)) { + uint x = (uint)id / 15, y = (uint)id % 15; + inp0[id] = + HOOKED_tex(HOOKED_pt * vec2(float(group_base.x + x) + (-2.5), float(group_base.y + y) + (-2.5))).xyz; + inp_luma0[id] = dot(inp0[id], color_primary); + } + } + barrier(); +#if CURRENT_PASS == LAST_PASS + uint2 destPos = blockStart + threadId.xy * 2; + uint2 outputSize = GetOutputSize(); + if (destPos.x >= outputSize.x || destPos.y >= outputSize.y) { + return; + } +#endif + { + float luma57 = inp_luma0[local_pos + 106]; + float luma58 = inp_luma0[local_pos + 107]; + float luma59 = inp_luma0[local_pos + 108]; + float luma60 = inp_luma0[local_pos + 109]; + float luma61 = inp_luma0[local_pos + 110]; + float luma62 = inp_luma0[local_pos + 111]; + float luma8 = inp_luma0[local_pos + 15]; + float luma9 = inp_luma0[local_pos + 16]; + float luma10 = inp_luma0[local_pos + 17]; + float luma11 = inp_luma0[local_pos + 18]; + float luma12 = inp_luma0[local_pos + 19]; + float luma1 = inp_luma0[local_pos + 1]; + float luma13 = inp_luma0[local_pos + 20]; + float luma14 = inp_luma0[local_pos + 21]; + float luma15 = inp_luma0[local_pos + 22]; + float luma2 = inp_luma0[local_pos + 2]; + float luma16 = inp_luma0[local_pos + 30]; + float luma17 = inp_luma0[local_pos + 31]; + float luma18 = inp_luma0[local_pos + 32]; + float luma19 = inp_luma0[local_pos + 33]; + float luma20 = inp_luma0[local_pos + 34]; + float luma21 = inp_luma0[local_pos + 35]; + float luma22 = inp_luma0[local_pos + 36]; + float luma23 = inp_luma0[local_pos + 37]; + float luma3 = inp_luma0[local_pos + 3]; + float luma24 = inp_luma0[local_pos + 45]; + float luma25 = inp_luma0[local_pos + 46]; + float luma26 = inp_luma0[local_pos + 47]; + float luma27 = inp_luma0[local_pos + 48]; + float luma28 = inp_luma0[local_pos + 49]; + float luma4 = inp_luma0[local_pos + 4]; + float luma29 = inp_luma0[local_pos + 50]; + float luma30 = inp_luma0[local_pos + 51]; + float luma31 = inp_luma0[local_pos + 52]; + float luma5 = inp_luma0[local_pos + 5]; + float luma32 = inp_luma0[local_pos + 60]; + float luma33 = inp_luma0[local_pos + 61]; + float luma34 = inp_luma0[local_pos + 62]; + float luma35 = inp_luma0[local_pos + 63]; + float luma36 = inp_luma0[local_pos + 64]; + float luma37 = inp_luma0[local_pos + 65]; + float luma38 = inp_luma0[local_pos + 66]; + float luma39 = inp_luma0[local_pos + 67]; + float luma6 = inp_luma0[local_pos + 6]; + float luma40 = inp_luma0[local_pos + 75]; + float luma41 = inp_luma0[local_pos + 76]; + float luma42 = inp_luma0[local_pos + 77]; + float luma43 = inp_luma0[local_pos + 78]; + float luma44 = inp_luma0[local_pos + 79]; + float luma45 = inp_luma0[local_pos + 80]; + float luma46 = inp_luma0[local_pos + 81]; + float luma47 = inp_luma0[local_pos + 82]; + float luma48 = inp_luma0[local_pos + 90]; + float luma49 = inp_luma0[local_pos + 91]; + float luma50 = inp_luma0[local_pos + 92]; + float luma51 = inp_luma0[local_pos + 93]; + float luma52 = inp_luma0[local_pos + 94]; + float luma53 = inp_luma0[local_pos + 95]; + float luma54 = inp_luma0[local_pos + 96]; + float luma55 = inp_luma0[local_pos + 97]; + vec3 abd = vec3(0.0, 0.0, 0.0); + float gx, gy; + gx = (luma17 - luma1) / 2.0; + gy = (luma10 - luma8) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.011007348802298533; + gx = (luma18 - luma2) / 2.0; + gy = (-luma12 + 8.0 * luma11 - 8.0 * luma9 + luma8) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.018148050104365175; + gx = (luma19 - luma3) / 2.0; + gy = (-luma13 + 8.0 * luma12 - 8.0 * luma10 + luma9) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.0233025575973275; + gx = (luma20 - luma4) / 2.0; + gy = (-luma14 + 8.0 * luma13 - 8.0 * luma11 + luma10) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.0233025575973275; + gx = (luma21 - luma5) / 2.0; + gy = (-luma15 + 8.0 * luma14 - 8.0 * luma12 + luma11) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.018148050104365175; + gx = (luma22 - luma6) / 2.0; + gy = (luma15 - luma13) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.011007348802298533; + gx = (-luma33 + 8.0 * luma25 - 8.0 * luma9 + luma1) / 12.0; + gy = (luma18 - luma16) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.018148050104365175; + gx = (-luma34 + 8.0 * luma26 - 8.0 * luma10 + luma2) / 12.0; + gy = (-luma20 + 8.0 * luma19 - 8.0 * luma17 + luma16) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.02992107622879854; + gx = (-luma35 + 8.0 * luma27 - 8.0 * luma11 + luma3) / 12.0; + gy = (-luma21 + 8.0 * luma20 - 8.0 * luma18 + luma17) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.03841942237242872; + gx = (-luma36 + 8.0 * luma28 - 8.0 * luma12 + luma4) / 12.0; + gy = (-luma22 + 8.0 * luma21 - 8.0 * luma19 + luma18) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.03841942237242872; + gx = (-luma37 + 8.0 * luma29 - 8.0 * luma13 + luma5) / 12.0; + gy = (-luma23 + 8.0 * luma22 - 8.0 * luma20 + luma19) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.02992107622879854; + gx = (-luma38 + 8.0 * luma30 - 8.0 * luma14 + luma6) / 12.0; + gy = (luma23 - luma21) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.018148050104365175; + gx = (-luma41 + 8.0 * luma33 - 8.0 * luma17 + luma9) / 12.0; + gy = (luma26 - luma24) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.0233025575973275; + gx = (-luma42 + 8.0 * luma34 - 8.0 * luma18 + luma10) / 12.0; + gy = (-luma28 + 8.0 * luma27 - 8.0 * luma25 + luma24) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.03841942237242872; + gx = (-luma43 + 8.0 * luma35 - 8.0 * luma19 + luma11) / 12.0; + gy = (-luma29 + 8.0 * luma28 - 8.0 * luma26 + luma25) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.04933151482066013; + gx = (-luma44 + 8.0 * luma36 - 8.0 * luma20 + luma12) / 12.0; + gy = (-luma30 + 8.0 * luma29 - 8.0 * luma27 + luma26) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.04933151482066013; + gx = (-luma45 + 8.0 * luma37 - 8.0 * luma21 + luma13) / 12.0; + gy = (-luma31 + 8.0 * luma30 - 8.0 * luma28 + luma27) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.03841942237242872; + gx = (-luma46 + 8.0 * luma38 - 8.0 * luma22 + luma14) / 12.0; + gy = (luma31 - luma29) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.0233025575973275; + gx = (-luma49 + 8.0 * luma41 - 8.0 * luma25 + luma17) / 12.0; + gy = (luma34 - luma32) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.0233025575973275; + gx = (-luma50 + 8.0 * luma42 - 8.0 * luma26 + luma18) / 12.0; + gy = (-luma36 + 8.0 * luma35 - 8.0 * luma33 + luma32) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.03841942237242872; + gx = (-luma51 + 8.0 * luma43 - 8.0 * luma27 + luma19) / 12.0; + gy = (-luma37 + 8.0 * luma36 - 8.0 * luma34 + luma33) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.04933151482066013; + gx = (-luma52 + 8.0 * luma44 - 8.0 * luma28 + luma20) / 12.0; + gy = (-luma38 + 8.0 * luma37 - 8.0 * luma35 + luma34) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.04933151482066013; + gx = (-luma53 + 8.0 * luma45 - 8.0 * luma29 + luma21) / 12.0; + gy = (-luma39 + 8.0 * luma38 - 8.0 * luma36 + luma35) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.03841942237242872; + gx = (-luma54 + 8.0 * luma46 - 8.0 * luma30 + luma22) / 12.0; + gy = (luma39 - luma37) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.0233025575973275; + gx = (-luma57 + 8.0 * luma49 - 8.0 * luma33 + luma25) / 12.0; + gy = (luma42 - luma40) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.018148050104365175; + gx = (-luma58 + 8.0 * luma50 - 8.0 * luma34 + luma26) / 12.0; + gy = (-luma44 + 8.0 * luma43 - 8.0 * luma41 + luma40) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.02992107622879854; + gx = (-luma59 + 8.0 * luma51 - 8.0 * luma35 + luma27) / 12.0; + gy = (-luma45 + 8.0 * luma44 - 8.0 * luma42 + luma41) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.03841942237242872; + gx = (-luma60 + 8.0 * luma52 - 8.0 * luma36 + luma28) / 12.0; + gy = (-luma46 + 8.0 * luma45 - 8.0 * luma43 + luma42) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.03841942237242872; + gx = (-luma61 + 8.0 * luma53 - 8.0 * luma37 + luma29) / 12.0; + gy = (-luma47 + 8.0 * luma46 - 8.0 * luma44 + luma43) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.02992107622879854; + gx = (-luma62 + 8.0 * luma54 - 8.0 * luma38 + luma30) / 12.0; + gy = (luma47 - luma45) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.018148050104365175; + gx = (luma57 - luma41) / 2.0; + gy = (luma50 - luma48) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.011007348802298533; + gx = (luma58 - luma42) / 2.0; + gy = (-luma52 + 8.0 * luma51 - 8.0 * luma49 + luma48) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.018148050104365175; + gx = (luma59 - luma43) / 2.0; + gy = (-luma53 + 8.0 * luma52 - 8.0 * luma50 + luma49) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.0233025575973275; + gx = (luma60 - luma44) / 2.0; + gy = (-luma54 + 8.0 * luma53 - 8.0 * luma51 + luma50) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.0233025575973275; + gx = (luma61 - luma45) / 2.0; + gy = (-luma55 + 8.0 * luma54 - 8.0 * luma52 + luma51) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.018148050104365175; + gx = (luma62 - luma46) / 2.0; + gy = (luma55 - luma53) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.011007348802298533; + float a = abd.x, b = abd.y, d = abd.z; + float T = a + d, D = a * d - b * b; + float delta = sqrt(max(T * T / 4.0 - D, 0.0)); + float L1 = T / 2.0 + delta, L2 = T / 2.0 - delta; + float sqrtL1 = sqrt(L1), sqrtL2 = sqrt(L2); + float theta = mix(mod(atan(L1 - a, b) + 3.141592653589793, 3.141592653589793), 0.0, abs(b) < 1.192092896e-7); + float lambda = sqrtL1; + float mu = mix((sqrtL1 - sqrtL2) / (sqrtL1 + sqrtL2), 0.0, sqrtL1 + sqrtL2 < 1.192092896e-7); + float angle = floor(theta * 24.0 / 3.141592653589793); + float strength = clamp(floor(log2(lambda * 2000.0 + 1.192092896e-7)), 0.0, 8.0); + float coherence = mix(mix(0.0, 1.0, mu >= 0.25), 2.0, mu >= 0.5); + float coord_y = ((angle * 9.0 + strength) * 3.0 + coherence + 0.5) / 648.0; + vec3 res = vec3(0.0, 0.0, 0.0); + vec4 w; + w = texture(ravu_lut4, vec2(0.0625, coord_y)); + res += (inp0[local_pos + 0] + inp0[local_pos + 112]) * w[0]; + res += (inp0[local_pos + 1] + inp0[local_pos + 111]) * w[1]; + res += (inp0[local_pos + 2] + inp0[local_pos + 110]) * w[2]; + res += (inp0[local_pos + 3] + inp0[local_pos + 109]) * w[3]; + w = texture(ravu_lut4, vec2(0.1875, coord_y)); + res += (inp0[local_pos + 4] + inp0[local_pos + 108]) * w[0]; + res += (inp0[local_pos + 5] + inp0[local_pos + 107]) * w[1]; + res += (inp0[local_pos + 6] + inp0[local_pos + 106]) * w[2]; + res += (inp0[local_pos + 7] + inp0[local_pos + 105]) * w[3]; + w = texture(ravu_lut4, vec2(0.3125, coord_y)); + res += (inp0[local_pos + 15] + inp0[local_pos + 97]) * w[0]; + res += (inp0[local_pos + 16] + inp0[local_pos + 96]) * w[1]; + res += (inp0[local_pos + 17] + inp0[local_pos + 95]) * w[2]; + res += (inp0[local_pos + 18] + inp0[local_pos + 94]) * w[3]; + w = texture(ravu_lut4, vec2(0.4375, coord_y)); + res += (inp0[local_pos + 19] + inp0[local_pos + 93]) * w[0]; + res += (inp0[local_pos + 20] + inp0[local_pos + 92]) * w[1]; + res += (inp0[local_pos + 21] + inp0[local_pos + 91]) * w[2]; + res += (inp0[local_pos + 22] + inp0[local_pos + 90]) * w[3]; + w = texture(ravu_lut4, vec2(0.5625, coord_y)); + res += (inp0[local_pos + 30] + inp0[local_pos + 82]) * w[0]; + res += (inp0[local_pos + 31] + inp0[local_pos + 81]) * w[1]; + res += (inp0[local_pos + 32] + inp0[local_pos + 80]) * w[2]; + res += (inp0[local_pos + 33] + inp0[local_pos + 79]) * w[3]; + w = texture(ravu_lut4, vec2(0.6875, coord_y)); + res += (inp0[local_pos + 34] + inp0[local_pos + 78]) * w[0]; + res += (inp0[local_pos + 35] + inp0[local_pos + 77]) * w[1]; + res += (inp0[local_pos + 36] + inp0[local_pos + 76]) * w[2]; + res += (inp0[local_pos + 37] + inp0[local_pos + 75]) * w[3]; + w = texture(ravu_lut4, vec2(0.8125, coord_y)); + res += (inp0[local_pos + 45] + inp0[local_pos + 67]) * w[0]; + res += (inp0[local_pos + 46] + inp0[local_pos + 66]) * w[1]; + res += (inp0[local_pos + 47] + inp0[local_pos + 65]) * w[2]; + res += (inp0[local_pos + 48] + inp0[local_pos + 64]) * w[3]; + w = texture(ravu_lut4, vec2(0.9375, coord_y)); + res += (inp0[local_pos + 49] + inp0[local_pos + 63]) * w[0]; + res += (inp0[local_pos + 50] + inp0[local_pos + 62]) * w[1]; + res += (inp0[local_pos + 51] + inp0[local_pos + 61]) * w[2]; + res += (inp0[local_pos + 52] + inp0[local_pos + 60]) * w[3]; + res = clamp(res, 0.0, 1.0); + imageStore(out_image, ivec2(gl_GlobalInvocationID), vec4(res, 1.0)); + } +} +//!PASS 2 +//!DESC RAVU (step2, rgb, r4, compute) +//!IN INPUT, ravu_lut4, ravu_int11 +//!OUT OUTPUT +//!BLOCK_SIZE 64, 16 +//!NUM_THREADS 32, 8 +static const vec3 color_primary = vec3(0.2126, 0.7152, 0.0722); +shared vec3 inp0[585]; +shared float inp_luma0[585]; +shared vec3 inp1[585]; +shared float inp_luma1[585]; + +#define CURRENT_PASS 2 + +#define GET_SAMPLE(x) x +#define imageStore(out_image, pos, val) imageStoreOverride(pos, val) +void imageStoreOverride(uint2 pos, float4 value) { OUTPUT[pos] = value; } + +#define INPUT_tex(pos) GET_SAMPLE(vec4(texture(INPUT, pos))) +static const float2 INPUT_size = float2(GetInputSize()); +static const float2 INPUT_pt = float2(GetInputPt()); + +#define ravu_lut4_tex(pos) (vec4(texture(ravu_lut4, pos))) + +#define ravu_int11_tex(pos) (vec3(texture(ravu_int11, pos).xyz)) +static const float2 ravu_int11_size = float2(GetInputSize().x, GetInputSize().y); +static const float2 ravu_int11_pt = float2(1.0 / (ravu_int11_size.x), 1.0 / (ravu_int11_size.y)); + +#define HOOKED_tex(pos) INPUT_tex(pos) +#define HOOKED_size INPUT_size +#define HOOKED_pt INPUT_pt + +void Pass2(uint2 blockStart, uint3 threadId) { + ivec2 group_base = ivec2(gl_WorkGroupID) * ivec2(gl_WorkGroupSize); + int local_pos = int(gl_LocalInvocationID.x) * 15 + int(gl_LocalInvocationID.y); + { + for (int id = int(gl_LocalInvocationIndex); id < 585; id += int(gl_WorkGroupSize.x * gl_WorkGroupSize.y)) { + uint x = (uint)id / 15, y = (uint)id % 15; + inp0[id] = + ravu_int11_tex(ravu_int11_pt * vec2(float(group_base.x + x) + (-3.5), float(group_base.y + y) + (-3.5))) + .xyz; + inp_luma0[id] = dot(inp0[id], color_primary); + } + } + { + for (int id = int(gl_LocalInvocationIndex); id < 585; id += int(gl_WorkGroupSize.x * gl_WorkGroupSize.y)) { + uint x = (uint)id / 15, y = (uint)id % 15; + inp1[id] = + HOOKED_tex(HOOKED_pt * vec2(float(group_base.x + x) + (-2.5), float(group_base.y + y) + (-2.5))).xyz; + inp_luma1[id] = dot(inp1[id], color_primary); + } + } + barrier(); +#if CURRENT_PASS == LAST_PASS + uint2 destPos = blockStart + threadId.xy * 2; + uint2 outputSize = GetOutputSize(); + if (destPos.x >= outputSize.x || destPos.y >= outputSize.y) { + return; + } +#endif + { + float luma16 = inp_luma0[local_pos + 18]; + float luma9 = inp_luma0[local_pos + 19]; + float luma2 = inp_luma0[local_pos + 20]; + float luma32 = inp_luma0[local_pos + 32]; + float luma25 = inp_luma0[local_pos + 33]; + float luma18 = inp_luma0[local_pos + 34]; + float luma11 = inp_luma0[local_pos + 35]; + float luma4 = inp_luma0[local_pos + 36]; + float luma48 = inp_luma0[local_pos + 46]; + float luma41 = inp_luma0[local_pos + 47]; + float luma34 = inp_luma0[local_pos + 48]; + float luma27 = inp_luma0[local_pos + 49]; + float luma20 = inp_luma0[local_pos + 50]; + float luma13 = inp_luma0[local_pos + 51]; + float luma6 = inp_luma0[local_pos + 52]; + float luma57 = inp_luma0[local_pos + 61]; + float luma50 = inp_luma0[local_pos + 62]; + float luma43 = inp_luma0[local_pos + 63]; + float luma36 = inp_luma0[local_pos + 64]; + float luma29 = inp_luma0[local_pos + 65]; + float luma22 = inp_luma0[local_pos + 66]; + float luma15 = inp_luma0[local_pos + 67]; + float luma59 = inp_luma0[local_pos + 77]; + float luma52 = inp_luma0[local_pos + 78]; + float luma45 = inp_luma0[local_pos + 79]; + float luma38 = inp_luma0[local_pos + 80]; + float luma31 = inp_luma0[local_pos + 81]; + float luma61 = inp_luma0[local_pos + 93]; + float luma54 = inp_luma0[local_pos + 94]; + float luma47 = inp_luma0[local_pos + 95]; + float luma24 = inp_luma1[local_pos + 17]; + float luma17 = inp_luma1[local_pos + 18]; + float luma10 = inp_luma1[local_pos + 19]; + float luma3 = inp_luma1[local_pos + 20]; + float luma40 = inp_luma1[local_pos + 31]; + float luma33 = inp_luma1[local_pos + 32]; + float luma26 = inp_luma1[local_pos + 33]; + float luma19 = inp_luma1[local_pos + 34]; + float luma12 = inp_luma1[local_pos + 35]; + float luma5 = inp_luma1[local_pos + 36]; + float luma8 = inp_luma1[local_pos + 3]; + float luma49 = inp_luma1[local_pos + 46]; + float luma42 = inp_luma1[local_pos + 47]; + float luma35 = inp_luma1[local_pos + 48]; + float luma28 = inp_luma1[local_pos + 49]; + float luma1 = inp_luma1[local_pos + 4]; + float luma21 = inp_luma1[local_pos + 50]; + float luma14 = inp_luma1[local_pos + 51]; + float luma58 = inp_luma1[local_pos + 61]; + float luma51 = inp_luma1[local_pos + 62]; + float luma44 = inp_luma1[local_pos + 63]; + float luma37 = inp_luma1[local_pos + 64]; + float luma30 = inp_luma1[local_pos + 65]; + float luma23 = inp_luma1[local_pos + 66]; + float luma60 = inp_luma1[local_pos + 77]; + float luma53 = inp_luma1[local_pos + 78]; + float luma46 = inp_luma1[local_pos + 79]; + float luma39 = inp_luma1[local_pos + 80]; + float luma62 = inp_luma1[local_pos + 93]; + float luma55 = inp_luma1[local_pos + 94]; + vec3 abd = vec3(0.0, 0.0, 0.0); + float gx, gy; + gx = (luma17 - luma1) / 2.0; + gy = (luma10 - luma8) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.011007348802298533; + gx = (luma18 - luma2) / 2.0; + gy = (-luma12 + 8.0 * luma11 - 8.0 * luma9 + luma8) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.018148050104365175; + gx = (luma19 - luma3) / 2.0; + gy = (-luma13 + 8.0 * luma12 - 8.0 * luma10 + luma9) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.0233025575973275; + gx = (luma20 - luma4) / 2.0; + gy = (-luma14 + 8.0 * luma13 - 8.0 * luma11 + luma10) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.0233025575973275; + gx = (luma21 - luma5) / 2.0; + gy = (-luma15 + 8.0 * luma14 - 8.0 * luma12 + luma11) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.018148050104365175; + gx = (luma22 - luma6) / 2.0; + gy = (luma15 - luma13) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.011007348802298533; + gx = (-luma33 + 8.0 * luma25 - 8.0 * luma9 + luma1) / 12.0; + gy = (luma18 - luma16) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.018148050104365175; + gx = (-luma34 + 8.0 * luma26 - 8.0 * luma10 + luma2) / 12.0; + gy = (-luma20 + 8.0 * luma19 - 8.0 * luma17 + luma16) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.02992107622879854; + gx = (-luma35 + 8.0 * luma27 - 8.0 * luma11 + luma3) / 12.0; + gy = (-luma21 + 8.0 * luma20 - 8.0 * luma18 + luma17) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.03841942237242872; + gx = (-luma36 + 8.0 * luma28 - 8.0 * luma12 + luma4) / 12.0; + gy = (-luma22 + 8.0 * luma21 - 8.0 * luma19 + luma18) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.03841942237242872; + gx = (-luma37 + 8.0 * luma29 - 8.0 * luma13 + luma5) / 12.0; + gy = (-luma23 + 8.0 * luma22 - 8.0 * luma20 + luma19) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.02992107622879854; + gx = (-luma38 + 8.0 * luma30 - 8.0 * luma14 + luma6) / 12.0; + gy = (luma23 - luma21) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.018148050104365175; + gx = (-luma41 + 8.0 * luma33 - 8.0 * luma17 + luma9) / 12.0; + gy = (luma26 - luma24) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.0233025575973275; + gx = (-luma42 + 8.0 * luma34 - 8.0 * luma18 + luma10) / 12.0; + gy = (-luma28 + 8.0 * luma27 - 8.0 * luma25 + luma24) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.03841942237242872; + gx = (-luma43 + 8.0 * luma35 - 8.0 * luma19 + luma11) / 12.0; + gy = (-luma29 + 8.0 * luma28 - 8.0 * luma26 + luma25) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.04933151482066013; + gx = (-luma44 + 8.0 * luma36 - 8.0 * luma20 + luma12) / 12.0; + gy = (-luma30 + 8.0 * luma29 - 8.0 * luma27 + luma26) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.04933151482066013; + gx = (-luma45 + 8.0 * luma37 - 8.0 * luma21 + luma13) / 12.0; + gy = (-luma31 + 8.0 * luma30 - 8.0 * luma28 + luma27) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.03841942237242872; + gx = (-luma46 + 8.0 * luma38 - 8.0 * luma22 + luma14) / 12.0; + gy = (luma31 - luma29) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.0233025575973275; + gx = (-luma49 + 8.0 * luma41 - 8.0 * luma25 + luma17) / 12.0; + gy = (luma34 - luma32) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.0233025575973275; + gx = (-luma50 + 8.0 * luma42 - 8.0 * luma26 + luma18) / 12.0; + gy = (-luma36 + 8.0 * luma35 - 8.0 * luma33 + luma32) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.03841942237242872; + gx = (-luma51 + 8.0 * luma43 - 8.0 * luma27 + luma19) / 12.0; + gy = (-luma37 + 8.0 * luma36 - 8.0 * luma34 + luma33) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.04933151482066013; + gx = (-luma52 + 8.0 * luma44 - 8.0 * luma28 + luma20) / 12.0; + gy = (-luma38 + 8.0 * luma37 - 8.0 * luma35 + luma34) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.04933151482066013; + gx = (-luma53 + 8.0 * luma45 - 8.0 * luma29 + luma21) / 12.0; + gy = (-luma39 + 8.0 * luma38 - 8.0 * luma36 + luma35) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.03841942237242872; + gx = (-luma54 + 8.0 * luma46 - 8.0 * luma30 + luma22) / 12.0; + gy = (luma39 - luma37) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.0233025575973275; + gx = (-luma57 + 8.0 * luma49 - 8.0 * luma33 + luma25) / 12.0; + gy = (luma42 - luma40) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.018148050104365175; + gx = (-luma58 + 8.0 * luma50 - 8.0 * luma34 + luma26) / 12.0; + gy = (-luma44 + 8.0 * luma43 - 8.0 * luma41 + luma40) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.02992107622879854; + gx = (-luma59 + 8.0 * luma51 - 8.0 * luma35 + luma27) / 12.0; + gy = (-luma45 + 8.0 * luma44 - 8.0 * luma42 + luma41) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.03841942237242872; + gx = (-luma60 + 8.0 * luma52 - 8.0 * luma36 + luma28) / 12.0; + gy = (-luma46 + 8.0 * luma45 - 8.0 * luma43 + luma42) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.03841942237242872; + gx = (-luma61 + 8.0 * luma53 - 8.0 * luma37 + luma29) / 12.0; + gy = (-luma47 + 8.0 * luma46 - 8.0 * luma44 + luma43) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.02992107622879854; + gx = (-luma62 + 8.0 * luma54 - 8.0 * luma38 + luma30) / 12.0; + gy = (luma47 - luma45) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.018148050104365175; + gx = (luma57 - luma41) / 2.0; + gy = (luma50 - luma48) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.011007348802298533; + gx = (luma58 - luma42) / 2.0; + gy = (-luma52 + 8.0 * luma51 - 8.0 * luma49 + luma48) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.018148050104365175; + gx = (luma59 - luma43) / 2.0; + gy = (-luma53 + 8.0 * luma52 - 8.0 * luma50 + luma49) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.0233025575973275; + gx = (luma60 - luma44) / 2.0; + gy = (-luma54 + 8.0 * luma53 - 8.0 * luma51 + luma50) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.0233025575973275; + gx = (luma61 - luma45) / 2.0; + gy = (-luma55 + 8.0 * luma54 - 8.0 * luma52 + luma51) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.018148050104365175; + gx = (luma62 - luma46) / 2.0; + gy = (luma55 - luma53) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.011007348802298533; + float a = abd.x, b = abd.y, d = abd.z; + float T = a + d, D = a * d - b * b; + float delta = sqrt(max(T * T / 4.0 - D, 0.0)); + float L1 = T / 2.0 + delta, L2 = T / 2.0 - delta; + float sqrtL1 = sqrt(L1), sqrtL2 = sqrt(L2); + float theta = mix(mod(atan(L1 - a, b) + 3.141592653589793, 3.141592653589793), 0.0, abs(b) < 1.192092896e-7); + float lambda = sqrtL1; + float mu = mix((sqrtL1 - sqrtL2) / (sqrtL1 + sqrtL2), 0.0, sqrtL1 + sqrtL2 < 1.192092896e-7); + float angle = floor(theta * 24.0 / 3.141592653589793); + float strength = clamp(floor(log2(lambda * 2000.0 + 1.192092896e-7)), 0.0, 8.0); + float coherence = mix(mix(0.0, 1.0, mu >= 0.25), 2.0, mu >= 0.5); + float coord_y = ((angle * 9.0 + strength) * 3.0 + coherence + 0.5) / 648.0; + vec3 res = vec3(0.0, 0.0, 0.0); + vec4 w; + w = texture(ravu_lut4, vec2(0.0625, coord_y)); + res += (inp0[local_pos + 4] + inp0[local_pos + 109]) * w[0]; + res += (inp1[local_pos + 4] + inp1[local_pos + 93]) * w[1]; + res += (inp0[local_pos + 20] + inp0[local_pos + 93]) * w[2]; + res += (inp1[local_pos + 20] + inp1[local_pos + 77]) * w[3]; + w = texture(ravu_lut4, vec2(0.1875, coord_y)); + res += (inp0[local_pos + 36] + inp0[local_pos + 77]) * w[0]; + res += (inp1[local_pos + 36] + inp1[local_pos + 61]) * w[1]; + res += (inp0[local_pos + 52] + inp0[local_pos + 61]) * w[2]; + res += (inp1[local_pos + 52] + inp1[local_pos + 45]) * w[3]; + w = texture(ravu_lut4, vec2(0.3125, coord_y)); + res += (inp1[local_pos + 3] + inp1[local_pos + 94]) * w[0]; + res += (inp0[local_pos + 19] + inp0[local_pos + 94]) * w[1]; + res += (inp1[local_pos + 19] + inp1[local_pos + 78]) * w[2]; + res += (inp0[local_pos + 35] + inp0[local_pos + 78]) * w[3]; + w = texture(ravu_lut4, vec2(0.4375, coord_y)); + res += (inp1[local_pos + 35] + inp1[local_pos + 62]) * w[0]; + res += (inp0[local_pos + 51] + inp0[local_pos + 62]) * w[1]; + res += (inp1[local_pos + 51] + inp1[local_pos + 46]) * w[2]; + res += (inp0[local_pos + 67] + inp0[local_pos + 46]) * w[3]; + w = texture(ravu_lut4, vec2(0.5625, coord_y)); + res += (inp0[local_pos + 18] + inp0[local_pos + 95]) * w[0]; + res += (inp1[local_pos + 18] + inp1[local_pos + 79]) * w[1]; + res += (inp0[local_pos + 34] + inp0[local_pos + 79]) * w[2]; + res += (inp1[local_pos + 34] + inp1[local_pos + 63]) * w[3]; + w = texture(ravu_lut4, vec2(0.6875, coord_y)); + res += (inp0[local_pos + 50] + inp0[local_pos + 63]) * w[0]; + res += (inp1[local_pos + 50] + inp1[local_pos + 47]) * w[1]; + res += (inp0[local_pos + 66] + inp0[local_pos + 47]) * w[2]; + res += (inp1[local_pos + 66] + inp1[local_pos + 31]) * w[3]; + w = texture(ravu_lut4, vec2(0.8125, coord_y)); + res += (inp1[local_pos + 17] + inp1[local_pos + 80]) * w[0]; + res += (inp0[local_pos + 33] + inp0[local_pos + 80]) * w[1]; + res += (inp1[local_pos + 33] + inp1[local_pos + 64]) * w[2]; + res += (inp0[local_pos + 49] + inp0[local_pos + 64]) * w[3]; + w = texture(ravu_lut4, vec2(0.9375, coord_y)); + res += (inp1[local_pos + 49] + inp1[local_pos + 48]) * w[0]; + res += (inp0[local_pos + 65] + inp0[local_pos + 48]) * w[1]; + res += (inp1[local_pos + 65] + inp1[local_pos + 32]) * w[2]; + res += (inp0[local_pos + 81] + inp0[local_pos + 32]) * w[3]; + res = clamp(res, 0.0, 1.0); + imageStore(out_image, ivec2(gl_GlobalInvocationID) * 2 + ivec2(0, 1), vec4(res, 1.0)); + } + { + float luma62 = inp_luma0[local_pos + 108]; + float luma55 = inp_luma0[local_pos + 109]; + float luma8 = inp_luma0[local_pos + 18]; + float luma1 = inp_luma0[local_pos + 19]; + float luma24 = inp_luma0[local_pos + 32]; + float luma17 = inp_luma0[local_pos + 33]; + float luma10 = inp_luma0[local_pos + 34]; + float luma3 = inp_luma0[local_pos + 35]; + float luma40 = inp_luma0[local_pos + 46]; + float luma33 = inp_luma0[local_pos + 47]; + float luma26 = inp_luma0[local_pos + 48]; + float luma19 = inp_luma0[local_pos + 49]; + float luma12 = inp_luma0[local_pos + 50]; + float luma5 = inp_luma0[local_pos + 51]; + float luma49 = inp_luma0[local_pos + 61]; + float luma42 = inp_luma0[local_pos + 62]; + float luma35 = inp_luma0[local_pos + 63]; + float luma28 = inp_luma0[local_pos + 64]; + float luma21 = inp_luma0[local_pos + 65]; + float luma14 = inp_luma0[local_pos + 66]; + float luma58 = inp_luma0[local_pos + 76]; + float luma51 = inp_luma0[local_pos + 77]; + float luma44 = inp_luma0[local_pos + 78]; + float luma37 = inp_luma0[local_pos + 79]; + float luma30 = inp_luma0[local_pos + 80]; + float luma23 = inp_luma0[local_pos + 81]; + float luma60 = inp_luma0[local_pos + 92]; + float luma53 = inp_luma0[local_pos + 93]; + float luma46 = inp_luma0[local_pos + 94]; + float luma39 = inp_luma0[local_pos + 95]; + float luma16 = inp_luma1[local_pos + 17]; + float luma9 = inp_luma1[local_pos + 18]; + float luma2 = inp_luma1[local_pos + 19]; + float luma32 = inp_luma1[local_pos + 31]; + float luma25 = inp_luma1[local_pos + 32]; + float luma18 = inp_luma1[local_pos + 33]; + float luma11 = inp_luma1[local_pos + 34]; + float luma4 = inp_luma1[local_pos + 35]; + float luma48 = inp_luma1[local_pos + 45]; + float luma41 = inp_luma1[local_pos + 46]; + float luma34 = inp_luma1[local_pos + 47]; + float luma27 = inp_luma1[local_pos + 48]; + float luma20 = inp_luma1[local_pos + 49]; + float luma13 = inp_luma1[local_pos + 50]; + float luma6 = inp_luma1[local_pos + 51]; + float luma57 = inp_luma1[local_pos + 60]; + float luma50 = inp_luma1[local_pos + 61]; + float luma43 = inp_luma1[local_pos + 62]; + float luma36 = inp_luma1[local_pos + 63]; + float luma29 = inp_luma1[local_pos + 64]; + float luma22 = inp_luma1[local_pos + 65]; + float luma15 = inp_luma1[local_pos + 66]; + float luma59 = inp_luma1[local_pos + 76]; + float luma52 = inp_luma1[local_pos + 77]; + float luma45 = inp_luma1[local_pos + 78]; + float luma38 = inp_luma1[local_pos + 79]; + float luma31 = inp_luma1[local_pos + 80]; + float luma61 = inp_luma1[local_pos + 92]; + float luma54 = inp_luma1[local_pos + 93]; + float luma47 = inp_luma1[local_pos + 94]; + vec3 abd = vec3(0.0, 0.0, 0.0); + float gx, gy; + gx = (luma17 - luma1) / 2.0; + gy = (luma10 - luma8) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.011007348802298533; + gx = (luma18 - luma2) / 2.0; + gy = (-luma12 + 8.0 * luma11 - 8.0 * luma9 + luma8) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.018148050104365175; + gx = (luma19 - luma3) / 2.0; + gy = (-luma13 + 8.0 * luma12 - 8.0 * luma10 + luma9) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.0233025575973275; + gx = (luma20 - luma4) / 2.0; + gy = (-luma14 + 8.0 * luma13 - 8.0 * luma11 + luma10) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.0233025575973275; + gx = (luma21 - luma5) / 2.0; + gy = (-luma15 + 8.0 * luma14 - 8.0 * luma12 + luma11) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.018148050104365175; + gx = (luma22 - luma6) / 2.0; + gy = (luma15 - luma13) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.011007348802298533; + gx = (-luma33 + 8.0 * luma25 - 8.0 * luma9 + luma1) / 12.0; + gy = (luma18 - luma16) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.018148050104365175; + gx = (-luma34 + 8.0 * luma26 - 8.0 * luma10 + luma2) / 12.0; + gy = (-luma20 + 8.0 * luma19 - 8.0 * luma17 + luma16) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.02992107622879854; + gx = (-luma35 + 8.0 * luma27 - 8.0 * luma11 + luma3) / 12.0; + gy = (-luma21 + 8.0 * luma20 - 8.0 * luma18 + luma17) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.03841942237242872; + gx = (-luma36 + 8.0 * luma28 - 8.0 * luma12 + luma4) / 12.0; + gy = (-luma22 + 8.0 * luma21 - 8.0 * luma19 + luma18) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.03841942237242872; + gx = (-luma37 + 8.0 * luma29 - 8.0 * luma13 + luma5) / 12.0; + gy = (-luma23 + 8.0 * luma22 - 8.0 * luma20 + luma19) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.02992107622879854; + gx = (-luma38 + 8.0 * luma30 - 8.0 * luma14 + luma6) / 12.0; + gy = (luma23 - luma21) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.018148050104365175; + gx = (-luma41 + 8.0 * luma33 - 8.0 * luma17 + luma9) / 12.0; + gy = (luma26 - luma24) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.0233025575973275; + gx = (-luma42 + 8.0 * luma34 - 8.0 * luma18 + luma10) / 12.0; + gy = (-luma28 + 8.0 * luma27 - 8.0 * luma25 + luma24) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.03841942237242872; + gx = (-luma43 + 8.0 * luma35 - 8.0 * luma19 + luma11) / 12.0; + gy = (-luma29 + 8.0 * luma28 - 8.0 * luma26 + luma25) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.04933151482066013; + gx = (-luma44 + 8.0 * luma36 - 8.0 * luma20 + luma12) / 12.0; + gy = (-luma30 + 8.0 * luma29 - 8.0 * luma27 + luma26) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.04933151482066013; + gx = (-luma45 + 8.0 * luma37 - 8.0 * luma21 + luma13) / 12.0; + gy = (-luma31 + 8.0 * luma30 - 8.0 * luma28 + luma27) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.03841942237242872; + gx = (-luma46 + 8.0 * luma38 - 8.0 * luma22 + luma14) / 12.0; + gy = (luma31 - luma29) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.0233025575973275; + gx = (-luma49 + 8.0 * luma41 - 8.0 * luma25 + luma17) / 12.0; + gy = (luma34 - luma32) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.0233025575973275; + gx = (-luma50 + 8.0 * luma42 - 8.0 * luma26 + luma18) / 12.0; + gy = (-luma36 + 8.0 * luma35 - 8.0 * luma33 + luma32) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.03841942237242872; + gx = (-luma51 + 8.0 * luma43 - 8.0 * luma27 + luma19) / 12.0; + gy = (-luma37 + 8.0 * luma36 - 8.0 * luma34 + luma33) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.04933151482066013; + gx = (-luma52 + 8.0 * luma44 - 8.0 * luma28 + luma20) / 12.0; + gy = (-luma38 + 8.0 * luma37 - 8.0 * luma35 + luma34) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.04933151482066013; + gx = (-luma53 + 8.0 * luma45 - 8.0 * luma29 + luma21) / 12.0; + gy = (-luma39 + 8.0 * luma38 - 8.0 * luma36 + luma35) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.03841942237242872; + gx = (-luma54 + 8.0 * luma46 - 8.0 * luma30 + luma22) / 12.0; + gy = (luma39 - luma37) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.0233025575973275; + gx = (-luma57 + 8.0 * luma49 - 8.0 * luma33 + luma25) / 12.0; + gy = (luma42 - luma40) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.018148050104365175; + gx = (-luma58 + 8.0 * luma50 - 8.0 * luma34 + luma26) / 12.0; + gy = (-luma44 + 8.0 * luma43 - 8.0 * luma41 + luma40) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.02992107622879854; + gx = (-luma59 + 8.0 * luma51 - 8.0 * luma35 + luma27) / 12.0; + gy = (-luma45 + 8.0 * luma44 - 8.0 * luma42 + luma41) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.03841942237242872; + gx = (-luma60 + 8.0 * luma52 - 8.0 * luma36 + luma28) / 12.0; + gy = (-luma46 + 8.0 * luma45 - 8.0 * luma43 + luma42) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.03841942237242872; + gx = (-luma61 + 8.0 * luma53 - 8.0 * luma37 + luma29) / 12.0; + gy = (-luma47 + 8.0 * luma46 - 8.0 * luma44 + luma43) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.02992107622879854; + gx = (-luma62 + 8.0 * luma54 - 8.0 * luma38 + luma30) / 12.0; + gy = (luma47 - luma45) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.018148050104365175; + gx = (luma57 - luma41) / 2.0; + gy = (luma50 - luma48) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.011007348802298533; + gx = (luma58 - luma42) / 2.0; + gy = (-luma52 + 8.0 * luma51 - 8.0 * luma49 + luma48) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.018148050104365175; + gx = (luma59 - luma43) / 2.0; + gy = (-luma53 + 8.0 * luma52 - 8.0 * luma50 + luma49) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.0233025575973275; + gx = (luma60 - luma44) / 2.0; + gy = (-luma54 + 8.0 * luma53 - 8.0 * luma51 + luma50) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.0233025575973275; + gx = (luma61 - luma45) / 2.0; + gy = (-luma55 + 8.0 * luma54 - 8.0 * luma52 + luma51) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.018148050104365175; + gx = (luma62 - luma46) / 2.0; + gy = (luma55 - luma53) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.011007348802298533; + float a = abd.x, b = abd.y, d = abd.z; + float T = a + d, D = a * d - b * b; + float delta = sqrt(max(T * T / 4.0 - D, 0.0)); + float L1 = T / 2.0 + delta, L2 = T / 2.0 - delta; + float sqrtL1 = sqrt(L1), sqrtL2 = sqrt(L2); + float theta = mix(mod(atan(L1 - a, b) + 3.141592653589793, 3.141592653589793), 0.0, abs(b) < 1.192092896e-7); + float lambda = sqrtL1; + float mu = mix((sqrtL1 - sqrtL2) / (sqrtL1 + sqrtL2), 0.0, sqrtL1 + sqrtL2 < 1.192092896e-7); + float angle = floor(theta * 24.0 / 3.141592653589793); + float strength = clamp(floor(log2(lambda * 2000.0 + 1.192092896e-7)), 0.0, 8.0); + float coherence = mix(mix(0.0, 1.0, mu >= 0.25), 2.0, mu >= 0.5); + float coord_y = ((angle * 9.0 + strength) * 3.0 + coherence + 0.5) / 648.0; + vec3 res = vec3(0.0, 0.0, 0.0); + vec4 w; + w = texture(ravu_lut4, vec2(0.0625, coord_y)); + res += (inp1[local_pos + 3] + inp1[local_pos + 108]) * w[0]; + res += (inp0[local_pos + 19] + inp0[local_pos + 108]) * w[1]; + res += (inp1[local_pos + 19] + inp1[local_pos + 92]) * w[2]; + res += (inp0[local_pos + 35] + inp0[local_pos + 92]) * w[3]; + w = texture(ravu_lut4, vec2(0.1875, coord_y)); + res += (inp1[local_pos + 35] + inp1[local_pos + 76]) * w[0]; + res += (inp0[local_pos + 51] + inp0[local_pos + 76]) * w[1]; + res += (inp1[local_pos + 51] + inp1[local_pos + 60]) * w[2]; + res += (inp0[local_pos + 67] + inp0[local_pos + 60]) * w[3]; + w = texture(ravu_lut4, vec2(0.3125, coord_y)); + res += (inp0[local_pos + 18] + inp0[local_pos + 109]) * w[0]; + res += (inp1[local_pos + 18] + inp1[local_pos + 93]) * w[1]; + res += (inp0[local_pos + 34] + inp0[local_pos + 93]) * w[2]; + res += (inp1[local_pos + 34] + inp1[local_pos + 77]) * w[3]; + w = texture(ravu_lut4, vec2(0.4375, coord_y)); + res += (inp0[local_pos + 50] + inp0[local_pos + 77]) * w[0]; + res += (inp1[local_pos + 50] + inp1[local_pos + 61]) * w[1]; + res += (inp0[local_pos + 66] + inp0[local_pos + 61]) * w[2]; + res += (inp1[local_pos + 66] + inp1[local_pos + 45]) * w[3]; + w = texture(ravu_lut4, vec2(0.5625, coord_y)); + res += (inp1[local_pos + 17] + inp1[local_pos + 94]) * w[0]; + res += (inp0[local_pos + 33] + inp0[local_pos + 94]) * w[1]; + res += (inp1[local_pos + 33] + inp1[local_pos + 78]) * w[2]; + res += (inp0[local_pos + 49] + inp0[local_pos + 78]) * w[3]; + w = texture(ravu_lut4, vec2(0.6875, coord_y)); + res += (inp1[local_pos + 49] + inp1[local_pos + 62]) * w[0]; + res += (inp0[local_pos + 65] + inp0[local_pos + 62]) * w[1]; + res += (inp1[local_pos + 65] + inp1[local_pos + 46]) * w[2]; + res += (inp0[local_pos + 81] + inp0[local_pos + 46]) * w[3]; + w = texture(ravu_lut4, vec2(0.8125, coord_y)); + res += (inp0[local_pos + 32] + inp0[local_pos + 95]) * w[0]; + res += (inp1[local_pos + 32] + inp1[local_pos + 79]) * w[1]; + res += (inp0[local_pos + 48] + inp0[local_pos + 79]) * w[2]; + res += (inp1[local_pos + 48] + inp1[local_pos + 63]) * w[3]; + w = texture(ravu_lut4, vec2(0.9375, coord_y)); + res += (inp0[local_pos + 64] + inp0[local_pos + 63]) * w[0]; + res += (inp1[local_pos + 64] + inp1[local_pos + 47]) * w[1]; + res += (inp0[local_pos + 80] + inp0[local_pos + 47]) * w[2]; + res += (inp1[local_pos + 80] + inp1[local_pos + 31]) * w[3]; + res = clamp(res, 0.0, 1.0); + imageStore(out_image, ivec2(gl_GlobalInvocationID) * 2 + ivec2(1, 0), vec4(res, 1.0)); + } + vec3 res; + res = inp0[local_pos + 64]; + imageStore(out_image, ivec2(gl_GlobalInvocationID) * 2 + ivec2(1, 1), vec4(res, 1.0)); + res = inp1[local_pos + 48]; + imageStore(out_image, ivec2(gl_GlobalInvocationID) * 2 + ivec2(0, 0), vec4(res, 1.0)); +} diff --git a/src/Effects/RAVU/RAVU_Zoom_AR_R2.hlsl b/src/Effects/RAVU/RAVU_Zoom_AR_R2.hlsl new file mode 100644 index 000000000..dba8b22ec --- /dev/null +++ b/src/Effects/RAVU/RAVU_Zoom_AR_R2.hlsl @@ -0,0 +1,325 @@ +// This file is generated by the scripts available at https://github.com/hauuau/magpie-prescalers +// Please don't edit this file directly. +// Generated by: ravu-zoom.py --target luma --weights-file weights\ravu-zoom_weights-r2.py --float-format float16dx --use-compute-shader --anti-ringing 0.8 --use-magpie --overwrite +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +//!MAGPIE EFFECT +//!VERSION 4 + +//!TEXTURE +Texture2D INPUT; + +//!SAMPLER +//!FILTER POINT +SamplerState sam_INPUT; + +//!TEXTURE +// +// +Texture2D OUTPUT; + +//!SAMPLER +//!FILTER LINEAR +SamplerState sam_INPUT_LINEAR; + +//!TEXTURE +//!SOURCE ravu_zoom_lut2_f16.dds +//!FORMAT R16G16B16A16_FLOAT +Texture2D ravu_zoom_lut2; + +//!SAMPLER +//!FILTER LINEAR +SamplerState sam_ravu_zoom_lut2; + +//!TEXTURE +//!SOURCE ravu_zoom_lut2_ar_f16.dds +//!FORMAT R16G16B16A16_FLOAT +Texture2D ravu_zoom_lut2_ar; + +//!SAMPLER +//!FILTER LINEAR +SamplerState sam_ravu_zoom_lut2_ar; + +//!COMMON +#include "prescalers.hlsli" + +#define LAST_PASS 1 + +//!PASS 1 +//!DESC RAVU-Zoom-AR (luma, r2, compute) +//!IN INPUT, ravu_zoom_lut2, ravu_zoom_lut2_ar +//!OUT OUTPUT +//!BLOCK_SIZE 32, 8 +//!NUM_THREADS 32, 8 +#define LUTPOS(x, lut_size) mix(0.5 / (lut_size), 1.0 - 0.5 / (lut_size), (x)) +shared float samples[432]; + +#define CURRENT_PASS 1 + +#define GET_SAMPLE(x) dot(x.rgb, rgb2y) +#define imageStore(out_image, pos, val) imageStoreOverride(pos, val.x) +void imageStoreOverride(uint2 pos, float value) { + float2 UV = mul(rgb2uv, INPUT.SampleLevel(sam_INPUT_LINEAR, HOOKED_map(pos), 0).rgb); + OUTPUT[pos] = float4(mul(yuv2rgb, float3(value.x, UV)), 1.0); +} + +#define INPUT_tex(pos) GET_SAMPLE(vec4(texture(INPUT, pos))) +static const float2 INPUT_size = float2(GetInputSize()); +static const float2 INPUT_pt = float2(GetInputPt()); + +#define ravu_zoom_lut2_tex(pos) (vec4(texture(ravu_zoom_lut2, pos))) + +#define ravu_zoom_lut2_ar_tex(pos) (vec4(texture(ravu_zoom_lut2_ar, pos))) + +#define HOOKED_tex(pos) INPUT_tex(pos) +#define HOOKED_size INPUT_size +#define HOOKED_pt INPUT_pt + +void Pass1(uint2 blockStart, uint3 threadId) { + ivec2 group_begin = ivec2(gl_WorkGroupID) * ivec2(gl_WorkGroupSize); + ivec2 group_end = group_begin + ivec2(gl_WorkGroupSize) - ivec2(1, 1); + ivec2 rectl = ivec2(floor(HOOKED_size * HOOKED_map(group_begin) - 0.5001)) - 1; + ivec2 rectr = ivec2(floor(HOOKED_size * HOOKED_map(group_end) - 0.4999)) + 2; + ivec2 rect = rectr - rectl + 1; + for (int id = int(gl_LocalInvocationIndex); id < rect.x * rect.y; + id += int(gl_WorkGroupSize.x * gl_WorkGroupSize.y)) { + uint y = (uint)id / rect.x, x = (uint)id % rect.x; + samples[x + y * 36] = HOOKED_tex(HOOKED_pt * (vec2(rectl + ivec2(x, y)) + vec2(0.5, 0.5))).x; + } + barrier(); +#if CURRENT_PASS == LAST_PASS + uint2 destPos = blockStart + threadId.xy; + uint2 outputSize = GetOutputSize(); + if (destPos.x >= outputSize.x || destPos.y >= outputSize.y) { + return; + } +#endif + vec2 pos = HOOKED_size * HOOKED_map(ivec2(gl_GlobalInvocationID)); + vec2 subpix = fract(pos - 0.5); + pos -= subpix; + subpix = LUTPOS(subpix, vec2(9.0, 9.0)); + vec2 subpix_inv = 1.0 - subpix; + subpix /= vec2(2.0, 288.0); + subpix_inv /= vec2(2.0, 288.0); + ivec2 ipos = ivec2(floor(pos)) - rectl; + int lpos = ipos.x + ipos.y * 36; + float sample0 = samples[-37 + lpos]; + float sample1 = samples[-1 + lpos]; + float sample2 = samples[35 + lpos]; + float sample3 = samples[71 + lpos]; + float sample4 = samples[-36 + lpos]; + float sample5 = samples[0 + lpos]; + float sample6 = samples[36 + lpos]; + float sample7 = samples[72 + lpos]; + float sample8 = samples[-35 + lpos]; + float sample9 = samples[1 + lpos]; + float sample10 = samples[37 + lpos]; + float sample11 = samples[73 + lpos]; + float sample12 = samples[-34 + lpos]; + float sample13 = samples[2 + lpos]; + float sample14 = samples[38 + lpos]; + float sample15 = samples[74 + lpos]; + vec3 abd = vec3(0.0, 0.0, 0.0); + float gx, gy; + gx = (sample4 - sample0); + gy = (sample1 - sample0); + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.04792235409415088; + gx = (sample5 - sample1); + gy = (sample2 - sample0) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (sample6 - sample2); + gy = (sample3 - sample1) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (sample7 - sample3); + gy = (sample3 - sample2); + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.04792235409415088; + gx = (sample8 - sample0) / 2.0; + gy = (sample5 - sample4); + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (sample9 - sample1) / 2.0; + gy = (sample6 - sample4) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.07901060453704994; + gx = (sample10 - sample2) / 2.0; + gy = (sample7 - sample5) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.07901060453704994; + gx = (sample11 - sample3) / 2.0; + gy = (sample7 - sample6); + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (sample12 - sample4) / 2.0; + gy = (sample9 - sample8); + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (sample13 - sample5) / 2.0; + gy = (sample10 - sample8) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.07901060453704994; + gx = (sample14 - sample6) / 2.0; + gy = (sample11 - sample9) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.07901060453704994; + gx = (sample15 - sample7) / 2.0; + gy = (sample11 - sample10); + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (sample12 - sample8); + gy = (sample13 - sample12); + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.04792235409415088; + gx = (sample13 - sample9); + gy = (sample14 - sample12) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (sample14 - sample10); + gy = (sample15 - sample13) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (sample15 - sample11); + gy = (sample15 - sample14); + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.04792235409415088; + float a = abd.x, b = abd.y, d = abd.z; + float T = a + d, D = a * d - b * b; + float delta = sqrt(max(T * T / 4.0 - D, 0.0)); + float L1 = T / 2.0 + delta, L2 = T / 2.0 - delta; + float sqrtL1 = sqrt(L1), sqrtL2 = sqrt(L2); + float theta = mix(mod(atan(L1 - a, b) + 3.141592653589793, 3.141592653589793), 0.0, abs(b) < 1.192092896e-7); + float lambda = sqrtL1; + float mu = mix((sqrtL1 - sqrtL2) / (sqrtL1 + sqrtL2), 0.0, sqrtL1 + sqrtL2 < 1.192092896e-7); + float angle = floor(theta * 24.0 / 3.141592653589793); + float strength = mix(mix(0.0, 1.0, lambda >= 0.004), mix(2.0, 3.0, lambda >= 0.05), lambda >= 0.016); + float coherence = mix(mix(0.0, 1.0, mu >= 0.25), 2.0, mu >= 0.5); + float coord_y = ((angle * 4.0 + strength) * 3.0 + coherence) / 288.0; + float res = 0.0; + vec4 w; + vec4 cg, cg1; + float lo = 0.0, hi = 0.0; + float lo2 = 0.0, hi2 = 0.0; + w = texture(ravu_zoom_lut2, vec2(0.0, coord_y) + subpix); + res += sample0 * w[0]; + res += sample1 * w[1]; + res += sample2 * w[2]; + res += sample3 * w[3]; + w = texture(ravu_zoom_lut2, vec2(0.5, coord_y) + subpix); + res += sample4 * w[0]; + res += sample5 * w[1]; + res += sample6 * w[2]; + res += sample7 * w[3]; + w = texture(ravu_zoom_lut2, vec2(0.0, coord_y) + subpix_inv); + res += sample15 * w[0]; + res += sample14 * w[1]; + res += sample13 * w[2]; + res += sample12 * w[3]; + w = texture(ravu_zoom_lut2, vec2(0.5, coord_y) + subpix_inv); + res += sample11 * w[0]; + res += sample10 * w[1]; + res += sample9 * w[2]; + res += sample8 * w[3]; + w = texture(ravu_zoom_lut2_ar, vec2(0.0, coord_y) + subpix); + cg = vec4(0.1 + sample0, 1.1 - sample0, 0.1 + sample1, 1.1 - sample1); + cg1 = cg; + cg *= cg; + cg *= cg; + cg *= cg; + cg *= cg; + cg *= cg; + hi += cg[0] * w[0] + cg[2] * w[1]; + lo += cg[1] * w[0] + cg[3] * w[1]; + cg *= cg1; + hi2 += cg[0] * w[0] + cg[2] * w[1]; + lo2 += cg[1] * w[0] + cg[3] * w[1]; + cg = vec4(0.1 + sample2, 1.1 - sample2, 0.1 + sample3, 1.1 - sample3); + cg1 = cg; + cg *= cg; + cg *= cg; + cg *= cg; + cg *= cg; + cg *= cg; + hi += cg[0] * w[2] + cg[2] * w[3]; + lo += cg[1] * w[2] + cg[3] * w[3]; + cg *= cg1; + hi2 += cg[0] * w[2] + cg[2] * w[3]; + lo2 += cg[1] * w[2] + cg[3] * w[3]; + w = texture(ravu_zoom_lut2_ar, vec2(0.5, coord_y) + subpix); + cg = vec4(0.1 + sample4, 1.1 - sample4, 0.1 + sample5, 1.1 - sample5); + cg1 = cg; + cg *= cg; + cg *= cg; + cg *= cg; + cg *= cg; + cg *= cg; + hi += cg[0] * w[0] + cg[2] * w[1]; + lo += cg[1] * w[0] + cg[3] * w[1]; + cg *= cg1; + hi2 += cg[0] * w[0] + cg[2] * w[1]; + lo2 += cg[1] * w[0] + cg[3] * w[1]; + cg = vec4(0.1 + sample6, 1.1 - sample6, 0.1 + sample7, 1.1 - sample7); + cg1 = cg; + cg *= cg; + cg *= cg; + cg *= cg; + cg *= cg; + cg *= cg; + hi += cg[0] * w[2] + cg[2] * w[3]; + lo += cg[1] * w[2] + cg[3] * w[3]; + cg *= cg1; + hi2 += cg[0] * w[2] + cg[2] * w[3]; + lo2 += cg[1] * w[2] + cg[3] * w[3]; + w = texture(ravu_zoom_lut2_ar, vec2(0.0, coord_y) + subpix_inv); + cg = vec4(0.1 + sample15, 1.1 - sample15, 0.1 + sample14, 1.1 - sample14); + cg1 = cg; + cg *= cg; + cg *= cg; + cg *= cg; + cg *= cg; + cg *= cg; + hi += cg[0] * w[0] + cg[2] * w[1]; + lo += cg[1] * w[0] + cg[3] * w[1]; + cg *= cg1; + hi2 += cg[0] * w[0] + cg[2] * w[1]; + lo2 += cg[1] * w[0] + cg[3] * w[1]; + cg = vec4(0.1 + sample13, 1.1 - sample13, 0.1 + sample12, 1.1 - sample12); + cg1 = cg; + cg *= cg; + cg *= cg; + cg *= cg; + cg *= cg; + cg *= cg; + hi += cg[0] * w[2] + cg[2] * w[3]; + lo += cg[1] * w[2] + cg[3] * w[3]; + cg *= cg1; + hi2 += cg[0] * w[2] + cg[2] * w[3]; + lo2 += cg[1] * w[2] + cg[3] * w[3]; + w = texture(ravu_zoom_lut2_ar, vec2(0.5, coord_y) + subpix_inv); + cg = vec4(0.1 + sample11, 1.1 - sample11, 0.1 + sample10, 1.1 - sample10); + cg1 = cg; + cg *= cg; + cg *= cg; + cg *= cg; + cg *= cg; + cg *= cg; + hi += cg[0] * w[0] + cg[2] * w[1]; + lo += cg[1] * w[0] + cg[3] * w[1]; + cg *= cg1; + hi2 += cg[0] * w[0] + cg[2] * w[1]; + lo2 += cg[1] * w[0] + cg[3] * w[1]; + cg = vec4(0.1 + sample9, 1.1 - sample9, 0.1 + sample8, 1.1 - sample8); + cg1 = cg; + cg *= cg; + cg *= cg; + cg *= cg; + cg *= cg; + cg *= cg; + hi += cg[0] * w[2] + cg[2] * w[3]; + lo += cg[1] * w[2] + cg[3] * w[3]; + cg *= cg1; + hi2 += cg[0] * w[2] + cg[2] * w[3]; + lo2 += cg[1] * w[2] + cg[3] * w[3]; + hi = hi2 / hi - 0.1; + lo = 1.1 - lo2 / lo; + res = mix(res, clamp(res, lo, hi), 0.800000); + imageStore(out_image, ivec2(gl_GlobalInvocationID), res); +} diff --git a/src/Effects/RAVU/RAVU_Zoom_AR_R2_RGB.hlsl b/src/Effects/RAVU/RAVU_Zoom_AR_R2_RGB.hlsl new file mode 100644 index 000000000..d3d40dff6 --- /dev/null +++ b/src/Effects/RAVU/RAVU_Zoom_AR_R2_RGB.hlsl @@ -0,0 +1,335 @@ +// This file is generated by the scripts available at https://github.com/hauuau/magpie-prescalers +// Please don't edit this file directly. +// Generated by: ravu-zoom.py --target rgb --weights-file weights\ravu-zoom_weights-r2.py --float-format float16dx --use-compute-shader --anti-ringing 0.8 --use-magpie --overwrite +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +//!MAGPIE EFFECT +//!VERSION 4 + +//!TEXTURE +Texture2D INPUT; + +//!SAMPLER +//!FILTER POINT +SamplerState sam_INPUT; + +//!TEXTURE +// +// +Texture2D OUTPUT; + +//!TEXTURE +//!SOURCE ravu_zoom_lut2_f16.dds +//!FORMAT R16G16B16A16_FLOAT +Texture2D ravu_zoom_lut2; + +//!SAMPLER +//!FILTER LINEAR +SamplerState sam_ravu_zoom_lut2; + +//!TEXTURE +//!SOURCE ravu_zoom_lut2_ar_f16.dds +//!FORMAT R16G16B16A16_FLOAT +Texture2D ravu_zoom_lut2_ar; + +//!SAMPLER +//!FILTER LINEAR +SamplerState sam_ravu_zoom_lut2_ar; + +//!COMMON +#include "prescalers.hlsli" + +#define LAST_PASS 1 + +//!PASS 1 +//!DESC RAVU-Zoom-AR (rgb, r2, compute) +//!IN INPUT, ravu_zoom_lut2, ravu_zoom_lut2_ar +//!OUT OUTPUT +//!BLOCK_SIZE 32, 8 +//!NUM_THREADS 32, 8 +static const vec3 color_primary = vec3(0.2126, 0.7152, 0.0722); +#define LUTPOS(x, lut_size) mix(0.5 / (lut_size), 1.0 - 0.5 / (lut_size), (x)) +shared vec3 samples[432]; + +#define CURRENT_PASS 1 + +#define GET_SAMPLE(x) x +#define imageStore(out_image, pos, val) imageStoreOverride(pos, val) +void imageStoreOverride(uint2 pos, float4 value) { OUTPUT[pos] = value; } + +#define INPUT_tex(pos) GET_SAMPLE(vec4(texture(INPUT, pos))) +static const float2 INPUT_size = float2(GetInputSize()); +static const float2 INPUT_pt = float2(GetInputPt()); + +#define ravu_zoom_lut2_tex(pos) (vec4(texture(ravu_zoom_lut2, pos))) + +#define ravu_zoom_lut2_ar_tex(pos) (vec4(texture(ravu_zoom_lut2_ar, pos))) + +#define HOOKED_tex(pos) INPUT_tex(pos) +#define HOOKED_size INPUT_size +#define HOOKED_pt INPUT_pt + +void Pass1(uint2 blockStart, uint3 threadId) { + ivec2 group_begin = ivec2(gl_WorkGroupID) * ivec2(gl_WorkGroupSize); + ivec2 group_end = group_begin + ivec2(gl_WorkGroupSize) - ivec2(1, 1); + ivec2 rectl = ivec2(floor(HOOKED_size * HOOKED_map(group_begin) - 0.5001)) - 1; + ivec2 rectr = ivec2(floor(HOOKED_size * HOOKED_map(group_end) - 0.4999)) + 2; + ivec2 rect = rectr - rectl + 1; + for (int id = int(gl_LocalInvocationIndex); id < rect.x * rect.y; + id += int(gl_WorkGroupSize.x * gl_WorkGroupSize.y)) { + uint y = (uint)id / rect.x, x = (uint)id % rect.x; + samples[x + y * 36] = HOOKED_tex(HOOKED_pt * (vec2(rectl + ivec2(x, y)) + vec2(0.5, 0.5))).xyz; + } + barrier(); +#if CURRENT_PASS == LAST_PASS + uint2 destPos = blockStart + threadId.xy; + uint2 outputSize = GetOutputSize(); + if (destPos.x >= outputSize.x || destPos.y >= outputSize.y) { + return; + } +#endif + vec2 pos = HOOKED_size * HOOKED_map(ivec2(gl_GlobalInvocationID)); + vec2 subpix = fract(pos - 0.5); + pos -= subpix; + subpix = LUTPOS(subpix, vec2(9.0, 9.0)); + vec2 subpix_inv = 1.0 - subpix; + subpix /= vec2(2.0, 288.0); + subpix_inv /= vec2(2.0, 288.0); + ivec2 ipos = ivec2(floor(pos)) - rectl; + int lpos = ipos.x + ipos.y * 36; + vec3 sample0 = samples[-37 + lpos]; + vec3 sample1 = samples[-1 + lpos]; + vec3 sample2 = samples[35 + lpos]; + vec3 sample3 = samples[71 + lpos]; + vec3 sample4 = samples[-36 + lpos]; + vec3 sample5 = samples[0 + lpos]; + vec3 sample6 = samples[36 + lpos]; + vec3 sample7 = samples[72 + lpos]; + vec3 sample8 = samples[-35 + lpos]; + vec3 sample9 = samples[1 + lpos]; + vec3 sample10 = samples[37 + lpos]; + vec3 sample11 = samples[73 + lpos]; + vec3 sample12 = samples[-34 + lpos]; + vec3 sample13 = samples[2 + lpos]; + vec3 sample14 = samples[38 + lpos]; + vec3 sample15 = samples[74 + lpos]; + float luma0 = dot(sample0, color_primary); + float luma1 = dot(sample1, color_primary); + float luma2 = dot(sample2, color_primary); + float luma3 = dot(sample3, color_primary); + float luma4 = dot(sample4, color_primary); + float luma5 = dot(sample5, color_primary); + float luma6 = dot(sample6, color_primary); + float luma7 = dot(sample7, color_primary); + float luma8 = dot(sample8, color_primary); + float luma9 = dot(sample9, color_primary); + float luma10 = dot(sample10, color_primary); + float luma11 = dot(sample11, color_primary); + float luma12 = dot(sample12, color_primary); + float luma13 = dot(sample13, color_primary); + float luma14 = dot(sample14, color_primary); + float luma15 = dot(sample15, color_primary); + vec3 abd = vec3(0.0, 0.0, 0.0); + float gx, gy; + gx = (luma4 - luma0); + gy = (luma1 - luma0); + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.04792235409415088; + gx = (luma5 - luma1); + gy = (luma2 - luma0) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (luma6 - luma2); + gy = (luma3 - luma1) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (luma7 - luma3); + gy = (luma3 - luma2); + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.04792235409415088; + gx = (luma8 - luma0) / 2.0; + gy = (luma5 - luma4); + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (luma9 - luma1) / 2.0; + gy = (luma6 - luma4) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.07901060453704994; + gx = (luma10 - luma2) / 2.0; + gy = (luma7 - luma5) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.07901060453704994; + gx = (luma11 - luma3) / 2.0; + gy = (luma7 - luma6); + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (luma12 - luma4) / 2.0; + gy = (luma9 - luma8); + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (luma13 - luma5) / 2.0; + gy = (luma10 - luma8) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.07901060453704994; + gx = (luma14 - luma6) / 2.0; + gy = (luma11 - luma9) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.07901060453704994; + gx = (luma15 - luma7) / 2.0; + gy = (luma11 - luma10); + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (luma12 - luma8); + gy = (luma13 - luma12); + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.04792235409415088; + gx = (luma13 - luma9); + gy = (luma14 - luma12) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (luma14 - luma10); + gy = (luma15 - luma13) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (luma15 - luma11); + gy = (luma15 - luma14); + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.04792235409415088; + float a = abd.x, b = abd.y, d = abd.z; + float T = a + d, D = a * d - b * b; + float delta = sqrt(max(T * T / 4.0 - D, 0.0)); + float L1 = T / 2.0 + delta, L2 = T / 2.0 - delta; + float sqrtL1 = sqrt(L1), sqrtL2 = sqrt(L2); + float theta = mix(mod(atan(L1 - a, b) + 3.141592653589793, 3.141592653589793), 0.0, abs(b) < 1.192092896e-7); + float lambda = sqrtL1; + float mu = mix((sqrtL1 - sqrtL2) / (sqrtL1 + sqrtL2), 0.0, sqrtL1 + sqrtL2 < 1.192092896e-7); + float angle = floor(theta * 24.0 / 3.141592653589793); + float strength = mix(mix(0.0, 1.0, lambda >= 0.004), mix(2.0, 3.0, lambda >= 0.05), lambda >= 0.016); + float coherence = mix(mix(0.0, 1.0, mu >= 0.25), 2.0, mu >= 0.5); + float coord_y = ((angle * 4.0 + strength) * 3.0 + coherence) / 288.0; + vec3 res = vec3(0.0, 0.0, 0.0); + vec4 w; + mat4x3 cg, cg1; + vec3 lo = vec3(0.0, 0.0, 0.0), hi = vec3(0.0, 0.0, 0.0); + vec3 lo2 = vec3(0.0, 0.0, 0.0), hi2 = vec3(0.0, 0.0, 0.0); + w = texture(ravu_zoom_lut2, vec2(0.0, coord_y) + subpix); + res += sample0 * w[0]; + res += sample1 * w[1]; + res += sample2 * w[2]; + res += sample3 * w[3]; + w = texture(ravu_zoom_lut2, vec2(0.5, coord_y) + subpix); + res += sample4 * w[0]; + res += sample5 * w[1]; + res += sample6 * w[2]; + res += sample7 * w[3]; + w = texture(ravu_zoom_lut2, vec2(0.0, coord_y) + subpix_inv); + res += sample15 * w[0]; + res += sample14 * w[1]; + res += sample13 * w[2]; + res += sample12 * w[3]; + w = texture(ravu_zoom_lut2, vec2(0.5, coord_y) + subpix_inv); + res += sample11 * w[0]; + res += sample10 * w[1]; + res += sample9 * w[2]; + res += sample8 * w[3]; + w = texture(ravu_zoom_lut2_ar, vec2(0.0, coord_y) + subpix); + cg = mat4x3(0.1 + sample0, 1.1 - sample0, 0.1 + sample1, 1.1 - sample1); + cg1 = cg; + cg = matrixCompMult(cg, cg); + cg = matrixCompMult(cg, cg); + cg = matrixCompMult(cg, cg); + cg = matrixCompMult(cg, cg); + cg = matrixCompMult(cg, cg); + hi += cg[0] * w[0] + cg[2] * w[1]; + lo += cg[1] * w[0] + cg[3] * w[1]; + cg = matrixCompMult(cg, cg1); + hi2 += cg[0] * w[0] + cg[2] * w[1]; + lo2 += cg[1] * w[0] + cg[3] * w[1]; + cg = mat4x3(0.1 + sample2, 1.1 - sample2, 0.1 + sample3, 1.1 - sample3); + cg1 = cg; + cg = matrixCompMult(cg, cg); + cg = matrixCompMult(cg, cg); + cg = matrixCompMult(cg, cg); + cg = matrixCompMult(cg, cg); + cg = matrixCompMult(cg, cg); + hi += cg[0] * w[2] + cg[2] * w[3]; + lo += cg[1] * w[2] + cg[3] * w[3]; + cg = matrixCompMult(cg, cg1); + hi2 += cg[0] * w[2] + cg[2] * w[3]; + lo2 += cg[1] * w[2] + cg[3] * w[3]; + w = texture(ravu_zoom_lut2_ar, vec2(0.5, coord_y) + subpix); + cg = mat4x3(0.1 + sample4, 1.1 - sample4, 0.1 + sample5, 1.1 - sample5); + cg1 = cg; + cg = matrixCompMult(cg, cg); + cg = matrixCompMult(cg, cg); + cg = matrixCompMult(cg, cg); + cg = matrixCompMult(cg, cg); + cg = matrixCompMult(cg, cg); + hi += cg[0] * w[0] + cg[2] * w[1]; + lo += cg[1] * w[0] + cg[3] * w[1]; + cg = matrixCompMult(cg, cg1); + hi2 += cg[0] * w[0] + cg[2] * w[1]; + lo2 += cg[1] * w[0] + cg[3] * w[1]; + cg = mat4x3(0.1 + sample6, 1.1 - sample6, 0.1 + sample7, 1.1 - sample7); + cg1 = cg; + cg = matrixCompMult(cg, cg); + cg = matrixCompMult(cg, cg); + cg = matrixCompMult(cg, cg); + cg = matrixCompMult(cg, cg); + cg = matrixCompMult(cg, cg); + hi += cg[0] * w[2] + cg[2] * w[3]; + lo += cg[1] * w[2] + cg[3] * w[3]; + cg = matrixCompMult(cg, cg1); + hi2 += cg[0] * w[2] + cg[2] * w[3]; + lo2 += cg[1] * w[2] + cg[3] * w[3]; + w = texture(ravu_zoom_lut2_ar, vec2(0.0, coord_y) + subpix_inv); + cg = mat4x3(0.1 + sample15, 1.1 - sample15, 0.1 + sample14, 1.1 - sample14); + cg1 = cg; + cg = matrixCompMult(cg, cg); + cg = matrixCompMult(cg, cg); + cg = matrixCompMult(cg, cg); + cg = matrixCompMult(cg, cg); + cg = matrixCompMult(cg, cg); + hi += cg[0] * w[0] + cg[2] * w[1]; + lo += cg[1] * w[0] + cg[3] * w[1]; + cg = matrixCompMult(cg, cg1); + hi2 += cg[0] * w[0] + cg[2] * w[1]; + lo2 += cg[1] * w[0] + cg[3] * w[1]; + cg = mat4x3(0.1 + sample13, 1.1 - sample13, 0.1 + sample12, 1.1 - sample12); + cg1 = cg; + cg = matrixCompMult(cg, cg); + cg = matrixCompMult(cg, cg); + cg = matrixCompMult(cg, cg); + cg = matrixCompMult(cg, cg); + cg = matrixCompMult(cg, cg); + hi += cg[0] * w[2] + cg[2] * w[3]; + lo += cg[1] * w[2] + cg[3] * w[3]; + cg = matrixCompMult(cg, cg1); + hi2 += cg[0] * w[2] + cg[2] * w[3]; + lo2 += cg[1] * w[2] + cg[3] * w[3]; + w = texture(ravu_zoom_lut2_ar, vec2(0.5, coord_y) + subpix_inv); + cg = mat4x3(0.1 + sample11, 1.1 - sample11, 0.1 + sample10, 1.1 - sample10); + cg1 = cg; + cg = matrixCompMult(cg, cg); + cg = matrixCompMult(cg, cg); + cg = matrixCompMult(cg, cg); + cg = matrixCompMult(cg, cg); + cg = matrixCompMult(cg, cg); + hi += cg[0] * w[0] + cg[2] * w[1]; + lo += cg[1] * w[0] + cg[3] * w[1]; + cg = matrixCompMult(cg, cg1); + hi2 += cg[0] * w[0] + cg[2] * w[1]; + lo2 += cg[1] * w[0] + cg[3] * w[1]; + cg = mat4x3(0.1 + sample9, 1.1 - sample9, 0.1 + sample8, 1.1 - sample8); + cg1 = cg; + cg = matrixCompMult(cg, cg); + cg = matrixCompMult(cg, cg); + cg = matrixCompMult(cg, cg); + cg = matrixCompMult(cg, cg); + cg = matrixCompMult(cg, cg); + hi += cg[0] * w[2] + cg[2] * w[3]; + lo += cg[1] * w[2] + cg[3] * w[3]; + cg = matrixCompMult(cg, cg1); + hi2 += cg[0] * w[2] + cg[2] * w[3]; + lo2 += cg[1] * w[2] + cg[3] * w[3]; + hi = hi2 / hi - 0.1; + lo = 1.1 - lo2 / lo; + res = mix(res, clamp(res, lo, hi), 0.800000); + imageStore(out_image, ivec2(gl_GlobalInvocationID), vec4(res, 1.0)); +} diff --git a/src/Effects/RAVU/RAVU_Zoom_AR_R3.hlsl b/src/Effects/RAVU/RAVU_Zoom_AR_R3.hlsl new file mode 100644 index 000000000..99ba60220 --- /dev/null +++ b/src/Effects/RAVU/RAVU_Zoom_AR_R3.hlsl @@ -0,0 +1,373 @@ +// This file is generated by the scripts available at https://github.com/hauuau/magpie-prescalers +// Please don't edit this file directly. +// Generated by: ravu-zoom.py --target luma --weights-file weights\ravu-zoom_weights-r3.py --float-format float16dx --use-compute-shader --anti-ringing 0.8 --use-magpie --overwrite +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +//!MAGPIE EFFECT +//!VERSION 4 + +//!TEXTURE +Texture2D INPUT; + +//!SAMPLER +//!FILTER POINT +SamplerState sam_INPUT; + +//!TEXTURE +// +// +Texture2D OUTPUT; + +//!SAMPLER +//!FILTER LINEAR +SamplerState sam_INPUT_LINEAR; + +//!TEXTURE +//!SOURCE ravu_zoom_lut3_f16.dds +//!FORMAT R16G16B16A16_FLOAT +Texture2D ravu_zoom_lut3; + +//!SAMPLER +//!FILTER LINEAR +SamplerState sam_ravu_zoom_lut3; + +//!TEXTURE +//!SOURCE ravu_zoom_lut3_ar_f16.dds +//!FORMAT R16G16B16A16_FLOAT +Texture2D ravu_zoom_lut3_ar; + +//!SAMPLER +//!FILTER LINEAR +SamplerState sam_ravu_zoom_lut3_ar; + +//!COMMON +#include "prescalers.hlsli" + +#define LAST_PASS 1 + +//!PASS 1 +//!DESC RAVU-Zoom-AR (luma, r3, compute) +//!IN INPUT, ravu_zoom_lut3, ravu_zoom_lut3_ar +//!OUT OUTPUT +//!BLOCK_SIZE 32, 8 +//!NUM_THREADS 32, 8 +#define LUTPOS(x, lut_size) mix(0.5 / (lut_size), 1.0 - 0.5 / (lut_size), (x)) +shared float samples[532]; + +#define CURRENT_PASS 1 + +#define GET_SAMPLE(x) dot(x.rgb, rgb2y) +#define imageStore(out_image, pos, val) imageStoreOverride(pos, val.x) +void imageStoreOverride(uint2 pos, float value) { + float2 UV = mul(rgb2uv, INPUT.SampleLevel(sam_INPUT_LINEAR, HOOKED_map(pos), 0).rgb); + OUTPUT[pos] = float4(mul(yuv2rgb, float3(value.x, UV)), 1.0); +} + +#define INPUT_tex(pos) GET_SAMPLE(vec4(texture(INPUT, pos))) +static const float2 INPUT_size = float2(GetInputSize()); +static const float2 INPUT_pt = float2(GetInputPt()); + +#define ravu_zoom_lut3_tex(pos) (vec4(texture(ravu_zoom_lut3, pos))) + +#define ravu_zoom_lut3_ar_tex(pos) (vec4(texture(ravu_zoom_lut3_ar, pos))) + +#define HOOKED_tex(pos) INPUT_tex(pos) +#define HOOKED_size INPUT_size +#define HOOKED_pt INPUT_pt + +void Pass1(uint2 blockStart, uint3 threadId) { + ivec2 group_begin = ivec2(gl_WorkGroupID) * ivec2(gl_WorkGroupSize); + ivec2 group_end = group_begin + ivec2(gl_WorkGroupSize) - ivec2(1, 1); + ivec2 rectl = ivec2(floor(HOOKED_size * HOOKED_map(group_begin) - 0.5001)) - 2; + ivec2 rectr = ivec2(floor(HOOKED_size * HOOKED_map(group_end) - 0.4999)) + 3; + ivec2 rect = rectr - rectl + 1; + for (int id = int(gl_LocalInvocationIndex); id < rect.x * rect.y; + id += int(gl_WorkGroupSize.x * gl_WorkGroupSize.y)) { + uint y = (uint)id / rect.x, x = (uint)id % rect.x; + samples[x + y * 38] = HOOKED_tex(HOOKED_pt * (vec2(rectl + ivec2(x, y)) + vec2(0.5, 0.5))).x; + } + barrier(); +#if CURRENT_PASS == LAST_PASS + uint2 destPos = blockStart + threadId.xy; + uint2 outputSize = GetOutputSize(); + if (destPos.x >= outputSize.x || destPos.y >= outputSize.y) { + return; + } +#endif + vec2 pos = HOOKED_size * HOOKED_map(ivec2(gl_GlobalInvocationID)); + vec2 subpix = fract(pos - 0.5); + pos -= subpix; + subpix = LUTPOS(subpix, vec2(9.0, 9.0)); + vec2 subpix_inv = 1.0 - subpix; + vec2 subpix_ar = subpix / vec2(2.0, 288.0); + vec2 subpix_inv_ar = subpix_inv / vec2(2.0, 288.0); + subpix /= vec2(5.0, 288.0); + subpix_inv /= vec2(5.0, 288.0); + ivec2 ipos = ivec2(floor(pos)) - rectl; + int lpos = ipos.x + ipos.y * 38; + float sample0 = samples[-78 + lpos]; + float sample1 = samples[-40 + lpos]; + float sample2 = samples[-2 + lpos]; + float sample3 = samples[36 + lpos]; + float sample4 = samples[74 + lpos]; + float sample5 = samples[112 + lpos]; + float sample6 = samples[-77 + lpos]; + float sample7 = samples[-39 + lpos]; + float sample8 = samples[-1 + lpos]; + float sample9 = samples[37 + lpos]; + float sample10 = samples[75 + lpos]; + float sample11 = samples[113 + lpos]; + float sample12 = samples[-76 + lpos]; + float sample13 = samples[-38 + lpos]; + float sample14 = samples[0 + lpos]; + float sample15 = samples[38 + lpos]; + float sample16 = samples[76 + lpos]; + float sample17 = samples[114 + lpos]; + float sample18 = samples[-75 + lpos]; + float sample19 = samples[-37 + lpos]; + float sample20 = samples[1 + lpos]; + float sample21 = samples[39 + lpos]; + float sample22 = samples[77 + lpos]; + float sample23 = samples[115 + lpos]; + float sample24 = samples[-74 + lpos]; + float sample25 = samples[-36 + lpos]; + float sample26 = samples[2 + lpos]; + float sample27 = samples[40 + lpos]; + float sample28 = samples[78 + lpos]; + float sample29 = samples[116 + lpos]; + float sample30 = samples[-73 + lpos]; + float sample31 = samples[-35 + lpos]; + float sample32 = samples[3 + lpos]; + float sample33 = samples[41 + lpos]; + float sample34 = samples[79 + lpos]; + float sample35 = samples[117 + lpos]; + vec3 abd = vec3(0.0, 0.0, 0.0); + float gx, gy; + gx = (sample13 - sample1) / 2.0; + gy = (sample8 - sample6) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.04792235409415088; + gx = (sample14 - sample2) / 2.0; + gy = (-sample10 + 8.0 * sample9 - 8.0 * sample7 + sample6) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (sample15 - sample3) / 2.0; + gy = (-sample11 + 8.0 * sample10 - 8.0 * sample8 + sample7) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (sample16 - sample4) / 2.0; + gy = (sample11 - sample9) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.04792235409415088; + gx = (-sample25 + 8.0 * sample19 - 8.0 * sample7 + sample1) / 12.0; + gy = (sample14 - sample12) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (-sample26 + 8.0 * sample20 - 8.0 * sample8 + sample2) / 12.0; + gy = (-sample16 + 8.0 * sample15 - 8.0 * sample13 + sample12) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.07901060453704994; + gx = (-sample27 + 8.0 * sample21 - 8.0 * sample9 + sample3) / 12.0; + gy = (-sample17 + 8.0 * sample16 - 8.0 * sample14 + sample13) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.07901060453704994; + gx = (-sample28 + 8.0 * sample22 - 8.0 * sample10 + sample4) / 12.0; + gy = (sample17 - sample15) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (-sample31 + 8.0 * sample25 - 8.0 * sample13 + sample7) / 12.0; + gy = (sample20 - sample18) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (-sample32 + 8.0 * sample26 - 8.0 * sample14 + sample8) / 12.0; + gy = (-sample22 + 8.0 * sample21 - 8.0 * sample19 + sample18) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.07901060453704994; + gx = (-sample33 + 8.0 * sample27 - 8.0 * sample15 + sample9) / 12.0; + gy = (-sample23 + 8.0 * sample22 - 8.0 * sample20 + sample19) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.07901060453704994; + gx = (-sample34 + 8.0 * sample28 - 8.0 * sample16 + sample10) / 12.0; + gy = (sample23 - sample21) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (sample31 - sample19) / 2.0; + gy = (sample26 - sample24) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.04792235409415088; + gx = (sample32 - sample20) / 2.0; + gy = (-sample28 + 8.0 * sample27 - 8.0 * sample25 + sample24) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (sample33 - sample21) / 2.0; + gy = (-sample29 + 8.0 * sample28 - 8.0 * sample26 + sample25) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (sample34 - sample22) / 2.0; + gy = (sample29 - sample27) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.04792235409415088; + float a = abd.x, b = abd.y, d = abd.z; + float T = a + d, D = a * d - b * b; + float delta = sqrt(max(T * T / 4.0 - D, 0.0)); + float L1 = T / 2.0 + delta, L2 = T / 2.0 - delta; + float sqrtL1 = sqrt(L1), sqrtL2 = sqrt(L2); + float theta = mix(mod(atan(L1 - a, b) + 3.141592653589793, 3.141592653589793), 0.0, abs(b) < 1.192092896e-7); + float lambda = sqrtL1; + float mu = mix((sqrtL1 - sqrtL2) / (sqrtL1 + sqrtL2), 0.0, sqrtL1 + sqrtL2 < 1.192092896e-7); + float angle = floor(theta * 24.0 / 3.141592653589793); + float strength = mix(mix(0.0, 1.0, lambda >= 0.004), mix(2.0, 3.0, lambda >= 0.05), lambda >= 0.016); + float coherence = mix(mix(0.0, 1.0, mu >= 0.25), 2.0, mu >= 0.5); + float coord_y = ((angle * 4.0 + strength) * 3.0 + coherence) / 288.0; + float res = 0.0; + vec4 w; + vec4 cg, cg1; + float lo = 0.0, hi = 0.0; + float lo2 = 0.0, hi2 = 0.0; + w = texture(ravu_zoom_lut3, vec2(0.0, coord_y) + subpix); + res += sample0 * w[0]; + res += sample1 * w[1]; + res += sample2 * w[2]; + res += sample3 * w[3]; + w = texture(ravu_zoom_lut3, vec2(0.2, coord_y) + subpix); + res += sample4 * w[0]; + res += sample5 * w[1]; + res += sample6 * w[2]; + res += sample7 * w[3]; + w = texture(ravu_zoom_lut3, vec2(0.4, coord_y) + subpix); + res += sample8 * w[0]; + res += sample9 * w[1]; + res += sample10 * w[2]; + res += sample11 * w[3]; + w = texture(ravu_zoom_lut3, vec2(0.6, coord_y) + subpix); + res += sample12 * w[0]; + res += sample13 * w[1]; + res += sample14 * w[2]; + res += sample15 * w[3]; + w = texture(ravu_zoom_lut3, vec2(0.8, coord_y) + subpix); + res += sample16 * w[0]; + res += sample17 * w[1]; + w = texture(ravu_zoom_lut3, vec2(0.0, coord_y) + subpix_inv); + res += sample35 * w[0]; + res += sample34 * w[1]; + res += sample33 * w[2]; + res += sample32 * w[3]; + w = texture(ravu_zoom_lut3, vec2(0.2, coord_y) + subpix_inv); + res += sample31 * w[0]; + res += sample30 * w[1]; + res += sample29 * w[2]; + res += sample28 * w[3]; + w = texture(ravu_zoom_lut3, vec2(0.4, coord_y) + subpix_inv); + res += sample27 * w[0]; + res += sample26 * w[1]; + res += sample25 * w[2]; + res += sample24 * w[3]; + w = texture(ravu_zoom_lut3, vec2(0.6, coord_y) + subpix_inv); + res += sample23 * w[0]; + res += sample22 * w[1]; + res += sample21 * w[2]; + res += sample20 * w[3]; + w = texture(ravu_zoom_lut3, vec2(0.8, coord_y) + subpix_inv); + res += sample19 * w[0]; + res += sample18 * w[1]; + w = texture(ravu_zoom_lut3_ar, vec2(0.0, coord_y) + subpix_ar); + cg = vec4(0.1 + sample7, 1.1 - sample7, 0.1 + sample8, 1.1 - sample8); + cg1 = cg; + cg *= cg; + cg *= cg; + cg *= cg; + cg *= cg; + cg *= cg; + hi += cg[0] * w[0] + cg[2] * w[1]; + lo += cg[1] * w[0] + cg[3] * w[1]; + cg *= cg1; + hi2 += cg[0] * w[0] + cg[2] * w[1]; + lo2 += cg[1] * w[0] + cg[3] * w[1]; + cg = vec4(0.1 + sample9, 1.1 - sample9, 0.1 + sample10, 1.1 - sample10); + cg1 = cg; + cg *= cg; + cg *= cg; + cg *= cg; + cg *= cg; + cg *= cg; + hi += cg[0] * w[2] + cg[2] * w[3]; + lo += cg[1] * w[2] + cg[3] * w[3]; + cg *= cg1; + hi2 += cg[0] * w[2] + cg[2] * w[3]; + lo2 += cg[1] * w[2] + cg[3] * w[3]; + w = texture(ravu_zoom_lut3_ar, vec2(0.5, coord_y) + subpix_ar); + cg = vec4(0.1 + sample13, 1.1 - sample13, 0.1 + sample14, 1.1 - sample14); + cg1 = cg; + cg *= cg; + cg *= cg; + cg *= cg; + cg *= cg; + cg *= cg; + hi += cg[0] * w[0] + cg[2] * w[1]; + lo += cg[1] * w[0] + cg[3] * w[1]; + cg *= cg1; + hi2 += cg[0] * w[0] + cg[2] * w[1]; + lo2 += cg[1] * w[0] + cg[3] * w[1]; + cg = vec4(0.1 + sample15, 1.1 - sample15, 0.1 + sample16, 1.1 - sample16); + cg1 = cg; + cg *= cg; + cg *= cg; + cg *= cg; + cg *= cg; + cg *= cg; + hi += cg[0] * w[2] + cg[2] * w[3]; + lo += cg[1] * w[2] + cg[3] * w[3]; + cg *= cg1; + hi2 += cg[0] * w[2] + cg[2] * w[3]; + lo2 += cg[1] * w[2] + cg[3] * w[3]; + w = texture(ravu_zoom_lut3_ar, vec2(0.0, coord_y) + subpix_inv_ar); + cg = vec4(0.1 + sample28, 1.1 - sample28, 0.1 + sample27, 1.1 - sample27); + cg1 = cg; + cg *= cg; + cg *= cg; + cg *= cg; + cg *= cg; + cg *= cg; + hi += cg[0] * w[0] + cg[2] * w[1]; + lo += cg[1] * w[0] + cg[3] * w[1]; + cg *= cg1; + hi2 += cg[0] * w[0] + cg[2] * w[1]; + lo2 += cg[1] * w[0] + cg[3] * w[1]; + cg = vec4(0.1 + sample26, 1.1 - sample26, 0.1 + sample25, 1.1 - sample25); + cg1 = cg; + cg *= cg; + cg *= cg; + cg *= cg; + cg *= cg; + cg *= cg; + hi += cg[0] * w[2] + cg[2] * w[3]; + lo += cg[1] * w[2] + cg[3] * w[3]; + cg *= cg1; + hi2 += cg[0] * w[2] + cg[2] * w[3]; + lo2 += cg[1] * w[2] + cg[3] * w[3]; + w = texture(ravu_zoom_lut3_ar, vec2(0.5, coord_y) + subpix_inv_ar); + cg = vec4(0.1 + sample22, 1.1 - sample22, 0.1 + sample21, 1.1 - sample21); + cg1 = cg; + cg *= cg; + cg *= cg; + cg *= cg; + cg *= cg; + cg *= cg; + hi += cg[0] * w[0] + cg[2] * w[1]; + lo += cg[1] * w[0] + cg[3] * w[1]; + cg *= cg1; + hi2 += cg[0] * w[0] + cg[2] * w[1]; + lo2 += cg[1] * w[0] + cg[3] * w[1]; + cg = vec4(0.1 + sample20, 1.1 - sample20, 0.1 + sample19, 1.1 - sample19); + cg1 = cg; + cg *= cg; + cg *= cg; + cg *= cg; + cg *= cg; + cg *= cg; + hi += cg[0] * w[2] + cg[2] * w[3]; + lo += cg[1] * w[2] + cg[3] * w[3]; + cg *= cg1; + hi2 += cg[0] * w[2] + cg[2] * w[3]; + lo2 += cg[1] * w[2] + cg[3] * w[3]; + hi = hi2 / hi - 0.1; + lo = 1.1 - lo2 / lo; + res = mix(res, clamp(res, lo, hi), 0.800000); + imageStore(out_image, ivec2(gl_GlobalInvocationID), res); +} diff --git a/src/Effects/RAVU/RAVU_Zoom_AR_R3_RGB.hlsl b/src/Effects/RAVU/RAVU_Zoom_AR_R3_RGB.hlsl new file mode 100644 index 000000000..6cfe46697 --- /dev/null +++ b/src/Effects/RAVU/RAVU_Zoom_AR_R3_RGB.hlsl @@ -0,0 +1,399 @@ +// This file is generated by the scripts available at https://github.com/hauuau/magpie-prescalers +// Please don't edit this file directly. +// Generated by: ravu-zoom.py --target rgb --weights-file weights\ravu-zoom_weights-r3.py --float-format float16dx --use-compute-shader --anti-ringing 0.8 --use-magpie --overwrite +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +//!MAGPIE EFFECT +//!VERSION 4 + +//!TEXTURE +Texture2D INPUT; + +//!SAMPLER +//!FILTER POINT +SamplerState sam_INPUT; + +//!TEXTURE +// +// +Texture2D OUTPUT; + +//!TEXTURE +//!SOURCE ravu_zoom_lut3_f16.dds +//!FORMAT R16G16B16A16_FLOAT +Texture2D ravu_zoom_lut3; + +//!SAMPLER +//!FILTER LINEAR +SamplerState sam_ravu_zoom_lut3; + +//!TEXTURE +//!SOURCE ravu_zoom_lut3_ar_f16.dds +//!FORMAT R16G16B16A16_FLOAT +Texture2D ravu_zoom_lut3_ar; + +//!SAMPLER +//!FILTER LINEAR +SamplerState sam_ravu_zoom_lut3_ar; + +//!COMMON +#include "prescalers.hlsli" + +#define LAST_PASS 1 + +//!PASS 1 +//!DESC RAVU-Zoom-AR (rgb, r3, compute) +//!IN INPUT, ravu_zoom_lut3, ravu_zoom_lut3_ar +//!OUT OUTPUT +//!BLOCK_SIZE 32, 8 +//!NUM_THREADS 32, 8 +static const vec3 color_primary = vec3(0.2126, 0.7152, 0.0722); +#define LUTPOS(x, lut_size) mix(0.5 / (lut_size), 1.0 - 0.5 / (lut_size), (x)) +shared vec3 samples[532]; + +#define CURRENT_PASS 1 + +#define GET_SAMPLE(x) x +#define imageStore(out_image, pos, val) imageStoreOverride(pos, val) +void imageStoreOverride(uint2 pos, float4 value) { OUTPUT[pos] = value; } + +#define INPUT_tex(pos) GET_SAMPLE(vec4(texture(INPUT, pos))) +static const float2 INPUT_size = float2(GetInputSize()); +static const float2 INPUT_pt = float2(GetInputPt()); + +#define ravu_zoom_lut3_tex(pos) (vec4(texture(ravu_zoom_lut3, pos))) + +#define ravu_zoom_lut3_ar_tex(pos) (vec4(texture(ravu_zoom_lut3_ar, pos))) + +#define HOOKED_tex(pos) INPUT_tex(pos) +#define HOOKED_size INPUT_size +#define HOOKED_pt INPUT_pt + +void Pass1(uint2 blockStart, uint3 threadId) { + ivec2 group_begin = ivec2(gl_WorkGroupID) * ivec2(gl_WorkGroupSize); + ivec2 group_end = group_begin + ivec2(gl_WorkGroupSize) - ivec2(1, 1); + ivec2 rectl = ivec2(floor(HOOKED_size * HOOKED_map(group_begin) - 0.5001)) - 2; + ivec2 rectr = ivec2(floor(HOOKED_size * HOOKED_map(group_end) - 0.4999)) + 3; + ivec2 rect = rectr - rectl + 1; + for (int id = int(gl_LocalInvocationIndex); id < rect.x * rect.y; + id += int(gl_WorkGroupSize.x * gl_WorkGroupSize.y)) { + uint y = (uint)id / rect.x, x = (uint)id % rect.x; + samples[x + y * 38] = HOOKED_tex(HOOKED_pt * (vec2(rectl + ivec2(x, y)) + vec2(0.5, 0.5))).xyz; + } + barrier(); +#if CURRENT_PASS == LAST_PASS + uint2 destPos = blockStart + threadId.xy; + uint2 outputSize = GetOutputSize(); + if (destPos.x >= outputSize.x || destPos.y >= outputSize.y) { + return; + } +#endif + vec2 pos = HOOKED_size * HOOKED_map(ivec2(gl_GlobalInvocationID)); + vec2 subpix = fract(pos - 0.5); + pos -= subpix; + subpix = LUTPOS(subpix, vec2(9.0, 9.0)); + vec2 subpix_inv = 1.0 - subpix; + vec2 subpix_ar = subpix / vec2(2.0, 288.0); + vec2 subpix_inv_ar = subpix_inv / vec2(2.0, 288.0); + subpix /= vec2(5.0, 288.0); + subpix_inv /= vec2(5.0, 288.0); + ivec2 ipos = ivec2(floor(pos)) - rectl; + int lpos = ipos.x + ipos.y * 38; + vec3 sample0 = samples[-78 + lpos]; + vec3 sample1 = samples[-40 + lpos]; + vec3 sample2 = samples[-2 + lpos]; + vec3 sample3 = samples[36 + lpos]; + vec3 sample4 = samples[74 + lpos]; + vec3 sample5 = samples[112 + lpos]; + vec3 sample6 = samples[-77 + lpos]; + vec3 sample7 = samples[-39 + lpos]; + vec3 sample8 = samples[-1 + lpos]; + vec3 sample9 = samples[37 + lpos]; + vec3 sample10 = samples[75 + lpos]; + vec3 sample11 = samples[113 + lpos]; + vec3 sample12 = samples[-76 + lpos]; + vec3 sample13 = samples[-38 + lpos]; + vec3 sample14 = samples[0 + lpos]; + vec3 sample15 = samples[38 + lpos]; + vec3 sample16 = samples[76 + lpos]; + vec3 sample17 = samples[114 + lpos]; + vec3 sample18 = samples[-75 + lpos]; + vec3 sample19 = samples[-37 + lpos]; + vec3 sample20 = samples[1 + lpos]; + vec3 sample21 = samples[39 + lpos]; + vec3 sample22 = samples[77 + lpos]; + vec3 sample23 = samples[115 + lpos]; + vec3 sample24 = samples[-74 + lpos]; + vec3 sample25 = samples[-36 + lpos]; + vec3 sample26 = samples[2 + lpos]; + vec3 sample27 = samples[40 + lpos]; + vec3 sample28 = samples[78 + lpos]; + vec3 sample29 = samples[116 + lpos]; + vec3 sample30 = samples[-73 + lpos]; + vec3 sample31 = samples[-35 + lpos]; + vec3 sample32 = samples[3 + lpos]; + vec3 sample33 = samples[41 + lpos]; + vec3 sample34 = samples[79 + lpos]; + vec3 sample35 = samples[117 + lpos]; + float luma1 = dot(sample1, color_primary); + float luma2 = dot(sample2, color_primary); + float luma3 = dot(sample3, color_primary); + float luma4 = dot(sample4, color_primary); + float luma6 = dot(sample6, color_primary); + float luma7 = dot(sample7, color_primary); + float luma8 = dot(sample8, color_primary); + float luma9 = dot(sample9, color_primary); + float luma10 = dot(sample10, color_primary); + float luma11 = dot(sample11, color_primary); + float luma12 = dot(sample12, color_primary); + float luma13 = dot(sample13, color_primary); + float luma14 = dot(sample14, color_primary); + float luma15 = dot(sample15, color_primary); + float luma16 = dot(sample16, color_primary); + float luma17 = dot(sample17, color_primary); + float luma18 = dot(sample18, color_primary); + float luma19 = dot(sample19, color_primary); + float luma20 = dot(sample20, color_primary); + float luma21 = dot(sample21, color_primary); + float luma22 = dot(sample22, color_primary); + float luma23 = dot(sample23, color_primary); + float luma24 = dot(sample24, color_primary); + float luma25 = dot(sample25, color_primary); + float luma26 = dot(sample26, color_primary); + float luma27 = dot(sample27, color_primary); + float luma28 = dot(sample28, color_primary); + float luma29 = dot(sample29, color_primary); + float luma31 = dot(sample31, color_primary); + float luma32 = dot(sample32, color_primary); + float luma33 = dot(sample33, color_primary); + float luma34 = dot(sample34, color_primary); + vec3 abd = vec3(0.0, 0.0, 0.0); + float gx, gy; + gx = (luma13 - luma1) / 2.0; + gy = (luma8 - luma6) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.04792235409415088; + gx = (luma14 - luma2) / 2.0; + gy = (-luma10 + 8.0 * luma9 - 8.0 * luma7 + luma6) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (luma15 - luma3) / 2.0; + gy = (-luma11 + 8.0 * luma10 - 8.0 * luma8 + luma7) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (luma16 - luma4) / 2.0; + gy = (luma11 - luma9) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.04792235409415088; + gx = (-luma25 + 8.0 * luma19 - 8.0 * luma7 + luma1) / 12.0; + gy = (luma14 - luma12) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (-luma26 + 8.0 * luma20 - 8.0 * luma8 + luma2) / 12.0; + gy = (-luma16 + 8.0 * luma15 - 8.0 * luma13 + luma12) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.07901060453704994; + gx = (-luma27 + 8.0 * luma21 - 8.0 * luma9 + luma3) / 12.0; + gy = (-luma17 + 8.0 * luma16 - 8.0 * luma14 + luma13) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.07901060453704994; + gx = (-luma28 + 8.0 * luma22 - 8.0 * luma10 + luma4) / 12.0; + gy = (luma17 - luma15) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (-luma31 + 8.0 * luma25 - 8.0 * luma13 + luma7) / 12.0; + gy = (luma20 - luma18) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (-luma32 + 8.0 * luma26 - 8.0 * luma14 + luma8) / 12.0; + gy = (-luma22 + 8.0 * luma21 - 8.0 * luma19 + luma18) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.07901060453704994; + gx = (-luma33 + 8.0 * luma27 - 8.0 * luma15 + luma9) / 12.0; + gy = (-luma23 + 8.0 * luma22 - 8.0 * luma20 + luma19) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.07901060453704994; + gx = (-luma34 + 8.0 * luma28 - 8.0 * luma16 + luma10) / 12.0; + gy = (luma23 - luma21) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (luma31 - luma19) / 2.0; + gy = (luma26 - luma24) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.04792235409415088; + gx = (luma32 - luma20) / 2.0; + gy = (-luma28 + 8.0 * luma27 - 8.0 * luma25 + luma24) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (luma33 - luma21) / 2.0; + gy = (-luma29 + 8.0 * luma28 - 8.0 * luma26 + luma25) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (luma34 - luma22) / 2.0; + gy = (luma29 - luma27) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.04792235409415088; + float a = abd.x, b = abd.y, d = abd.z; + float T = a + d, D = a * d - b * b; + float delta = sqrt(max(T * T / 4.0 - D, 0.0)); + float L1 = T / 2.0 + delta, L2 = T / 2.0 - delta; + float sqrtL1 = sqrt(L1), sqrtL2 = sqrt(L2); + float theta = mix(mod(atan(L1 - a, b) + 3.141592653589793, 3.141592653589793), 0.0, abs(b) < 1.192092896e-7); + float lambda = sqrtL1; + float mu = mix((sqrtL1 - sqrtL2) / (sqrtL1 + sqrtL2), 0.0, sqrtL1 + sqrtL2 < 1.192092896e-7); + float angle = floor(theta * 24.0 / 3.141592653589793); + float strength = mix(mix(0.0, 1.0, lambda >= 0.004), mix(2.0, 3.0, lambda >= 0.05), lambda >= 0.016); + float coherence = mix(mix(0.0, 1.0, mu >= 0.25), 2.0, mu >= 0.5); + float coord_y = ((angle * 4.0 + strength) * 3.0 + coherence) / 288.0; + vec3 res = vec3(0.0, 0.0, 0.0); + vec4 w; + mat4x3 cg, cg1; + vec3 lo = vec3(0.0, 0.0, 0.0), hi = vec3(0.0, 0.0, 0.0); + vec3 lo2 = vec3(0.0, 0.0, 0.0), hi2 = vec3(0.0, 0.0, 0.0); + w = texture(ravu_zoom_lut3, vec2(0.0, coord_y) + subpix); + res += sample0 * w[0]; + res += sample1 * w[1]; + res += sample2 * w[2]; + res += sample3 * w[3]; + w = texture(ravu_zoom_lut3, vec2(0.2, coord_y) + subpix); + res += sample4 * w[0]; + res += sample5 * w[1]; + res += sample6 * w[2]; + res += sample7 * w[3]; + w = texture(ravu_zoom_lut3, vec2(0.4, coord_y) + subpix); + res += sample8 * w[0]; + res += sample9 * w[1]; + res += sample10 * w[2]; + res += sample11 * w[3]; + w = texture(ravu_zoom_lut3, vec2(0.6, coord_y) + subpix); + res += sample12 * w[0]; + res += sample13 * w[1]; + res += sample14 * w[2]; + res += sample15 * w[3]; + w = texture(ravu_zoom_lut3, vec2(0.8, coord_y) + subpix); + res += sample16 * w[0]; + res += sample17 * w[1]; + w = texture(ravu_zoom_lut3, vec2(0.0, coord_y) + subpix_inv); + res += sample35 * w[0]; + res += sample34 * w[1]; + res += sample33 * w[2]; + res += sample32 * w[3]; + w = texture(ravu_zoom_lut3, vec2(0.2, coord_y) + subpix_inv); + res += sample31 * w[0]; + res += sample30 * w[1]; + res += sample29 * w[2]; + res += sample28 * w[3]; + w = texture(ravu_zoom_lut3, vec2(0.4, coord_y) + subpix_inv); + res += sample27 * w[0]; + res += sample26 * w[1]; + res += sample25 * w[2]; + res += sample24 * w[3]; + w = texture(ravu_zoom_lut3, vec2(0.6, coord_y) + subpix_inv); + res += sample23 * w[0]; + res += sample22 * w[1]; + res += sample21 * w[2]; + res += sample20 * w[3]; + w = texture(ravu_zoom_lut3, vec2(0.8, coord_y) + subpix_inv); + res += sample19 * w[0]; + res += sample18 * w[1]; + w = texture(ravu_zoom_lut3_ar, vec2(0.0, coord_y) + subpix_ar); + cg = mat4x3(0.1 + sample7, 1.1 - sample7, 0.1 + sample8, 1.1 - sample8); + cg1 = cg; + cg = matrixCompMult(cg, cg); + cg = matrixCompMult(cg, cg); + cg = matrixCompMult(cg, cg); + cg = matrixCompMult(cg, cg); + cg = matrixCompMult(cg, cg); + hi += cg[0] * w[0] + cg[2] * w[1]; + lo += cg[1] * w[0] + cg[3] * w[1]; + cg = matrixCompMult(cg, cg1); + hi2 += cg[0] * w[0] + cg[2] * w[1]; + lo2 += cg[1] * w[0] + cg[3] * w[1]; + cg = mat4x3(0.1 + sample9, 1.1 - sample9, 0.1 + sample10, 1.1 - sample10); + cg1 = cg; + cg = matrixCompMult(cg, cg); + cg = matrixCompMult(cg, cg); + cg = matrixCompMult(cg, cg); + cg = matrixCompMult(cg, cg); + cg = matrixCompMult(cg, cg); + hi += cg[0] * w[2] + cg[2] * w[3]; + lo += cg[1] * w[2] + cg[3] * w[3]; + cg = matrixCompMult(cg, cg1); + hi2 += cg[0] * w[2] + cg[2] * w[3]; + lo2 += cg[1] * w[2] + cg[3] * w[3]; + w = texture(ravu_zoom_lut3_ar, vec2(0.5, coord_y) + subpix_ar); + cg = mat4x3(0.1 + sample13, 1.1 - sample13, 0.1 + sample14, 1.1 - sample14); + cg1 = cg; + cg = matrixCompMult(cg, cg); + cg = matrixCompMult(cg, cg); + cg = matrixCompMult(cg, cg); + cg = matrixCompMult(cg, cg); + cg = matrixCompMult(cg, cg); + hi += cg[0] * w[0] + cg[2] * w[1]; + lo += cg[1] * w[0] + cg[3] * w[1]; + cg = matrixCompMult(cg, cg1); + hi2 += cg[0] * w[0] + cg[2] * w[1]; + lo2 += cg[1] * w[0] + cg[3] * w[1]; + cg = mat4x3(0.1 + sample15, 1.1 - sample15, 0.1 + sample16, 1.1 - sample16); + cg1 = cg; + cg = matrixCompMult(cg, cg); + cg = matrixCompMult(cg, cg); + cg = matrixCompMult(cg, cg); + cg = matrixCompMult(cg, cg); + cg = matrixCompMult(cg, cg); + hi += cg[0] * w[2] + cg[2] * w[3]; + lo += cg[1] * w[2] + cg[3] * w[3]; + cg = matrixCompMult(cg, cg1); + hi2 += cg[0] * w[2] + cg[2] * w[3]; + lo2 += cg[1] * w[2] + cg[3] * w[3]; + w = texture(ravu_zoom_lut3_ar, vec2(0.0, coord_y) + subpix_inv_ar); + cg = mat4x3(0.1 + sample28, 1.1 - sample28, 0.1 + sample27, 1.1 - sample27); + cg1 = cg; + cg = matrixCompMult(cg, cg); + cg = matrixCompMult(cg, cg); + cg = matrixCompMult(cg, cg); + cg = matrixCompMult(cg, cg); + cg = matrixCompMult(cg, cg); + hi += cg[0] * w[0] + cg[2] * w[1]; + lo += cg[1] * w[0] + cg[3] * w[1]; + cg = matrixCompMult(cg, cg1); + hi2 += cg[0] * w[0] + cg[2] * w[1]; + lo2 += cg[1] * w[0] + cg[3] * w[1]; + cg = mat4x3(0.1 + sample26, 1.1 - sample26, 0.1 + sample25, 1.1 - sample25); + cg1 = cg; + cg = matrixCompMult(cg, cg); + cg = matrixCompMult(cg, cg); + cg = matrixCompMult(cg, cg); + cg = matrixCompMult(cg, cg); + cg = matrixCompMult(cg, cg); + hi += cg[0] * w[2] + cg[2] * w[3]; + lo += cg[1] * w[2] + cg[3] * w[3]; + cg = matrixCompMult(cg, cg1); + hi2 += cg[0] * w[2] + cg[2] * w[3]; + lo2 += cg[1] * w[2] + cg[3] * w[3]; + w = texture(ravu_zoom_lut3_ar, vec2(0.5, coord_y) + subpix_inv_ar); + cg = mat4x3(0.1 + sample22, 1.1 - sample22, 0.1 + sample21, 1.1 - sample21); + cg1 = cg; + cg = matrixCompMult(cg, cg); + cg = matrixCompMult(cg, cg); + cg = matrixCompMult(cg, cg); + cg = matrixCompMult(cg, cg); + cg = matrixCompMult(cg, cg); + hi += cg[0] * w[0] + cg[2] * w[1]; + lo += cg[1] * w[0] + cg[3] * w[1]; + cg = matrixCompMult(cg, cg1); + hi2 += cg[0] * w[0] + cg[2] * w[1]; + lo2 += cg[1] * w[0] + cg[3] * w[1]; + cg = mat4x3(0.1 + sample20, 1.1 - sample20, 0.1 + sample19, 1.1 - sample19); + cg1 = cg; + cg = matrixCompMult(cg, cg); + cg = matrixCompMult(cg, cg); + cg = matrixCompMult(cg, cg); + cg = matrixCompMult(cg, cg); + cg = matrixCompMult(cg, cg); + hi += cg[0] * w[2] + cg[2] * w[3]; + lo += cg[1] * w[2] + cg[3] * w[3]; + cg = matrixCompMult(cg, cg1); + hi2 += cg[0] * w[2] + cg[2] * w[3]; + lo2 += cg[1] * w[2] + cg[3] * w[3]; + hi = hi2 / hi - 0.1; + lo = 1.1 - lo2 / lo; + res = mix(res, clamp(res, lo, hi), 0.800000); + imageStore(out_image, ivec2(gl_GlobalInvocationID), vec4(res, 1.0)); +} diff --git a/src/Effects/RAVU/RAVU_Zoom_R2.hlsl b/src/Effects/RAVU/RAVU_Zoom_R2.hlsl new file mode 100644 index 000000000..408a39da0 --- /dev/null +++ b/src/Effects/RAVU/RAVU_Zoom_R2.hlsl @@ -0,0 +1,209 @@ +// This file is generated by the scripts available at https://github.com/hauuau/magpie-prescalers +// Please don't edit this file directly. +// Generated by: ravu-zoom.py --target luma --weights-file weights\ravu-zoom_weights-r2.py --float-format float16dx --use-compute-shader --use-magpie --overwrite +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +//!MAGPIE EFFECT +//!VERSION 4 + +//!TEXTURE +Texture2D INPUT; + +//!SAMPLER +//!FILTER POINT +SamplerState sam_INPUT; + +//!TEXTURE +// +// +Texture2D OUTPUT; + +//!SAMPLER +//!FILTER LINEAR +SamplerState sam_INPUT_LINEAR; + +//!TEXTURE +//!SOURCE ravu_zoom_lut2_f16.dds +//!FORMAT R16G16B16A16_FLOAT +Texture2D ravu_zoom_lut2; + +//!SAMPLER +//!FILTER LINEAR +SamplerState sam_ravu_zoom_lut2; + +//!COMMON +#include "prescalers.hlsli" + +#define LAST_PASS 1 + +//!PASS 1 +//!DESC RAVU-Zoom (luma, r2, compute) +//!IN INPUT, ravu_zoom_lut2 +//!OUT OUTPUT +//!BLOCK_SIZE 32, 8 +//!NUM_THREADS 32, 8 +#define LUTPOS(x, lut_size) mix(0.5 / (lut_size), 1.0 - 0.5 / (lut_size), (x)) +shared float samples[432]; + +#define CURRENT_PASS 1 + +#define GET_SAMPLE(x) dot(x.rgb, rgb2y) +#define imageStore(out_image, pos, val) imageStoreOverride(pos, val.x) +void imageStoreOverride(uint2 pos, float value) { + float2 UV = mul(rgb2uv, INPUT.SampleLevel(sam_INPUT_LINEAR, HOOKED_map(pos), 0).rgb); + OUTPUT[pos] = float4(mul(yuv2rgb, float3(value.x, UV)), 1.0); +} + +#define INPUT_tex(pos) GET_SAMPLE(vec4(texture(INPUT, pos))) +static const float2 INPUT_size = float2(GetInputSize()); +static const float2 INPUT_pt = float2(GetInputPt()); + +#define ravu_zoom_lut2_tex(pos) (vec4(texture(ravu_zoom_lut2, pos))) + +#define HOOKED_tex(pos) INPUT_tex(pos) +#define HOOKED_size INPUT_size +#define HOOKED_pt INPUT_pt + +void Pass1(uint2 blockStart, uint3 threadId) { + ivec2 group_begin = ivec2(gl_WorkGroupID) * ivec2(gl_WorkGroupSize); + ivec2 group_end = group_begin + ivec2(gl_WorkGroupSize) - ivec2(1, 1); + ivec2 rectl = ivec2(floor(HOOKED_size * HOOKED_map(group_begin) - 0.5001)) - 1; + ivec2 rectr = ivec2(floor(HOOKED_size * HOOKED_map(group_end) - 0.4999)) + 2; + ivec2 rect = rectr - rectl + 1; + for (int id = int(gl_LocalInvocationIndex); id < rect.x * rect.y; + id += int(gl_WorkGroupSize.x * gl_WorkGroupSize.y)) { + uint y = (uint)id / rect.x, x = (uint)id % rect.x; + samples[x + y * 36] = HOOKED_tex(HOOKED_pt * (vec2(rectl + ivec2(x, y)) + vec2(0.5, 0.5))).x; + } + barrier(); +#if CURRENT_PASS == LAST_PASS + uint2 destPos = blockStart + threadId.xy; + uint2 outputSize = GetOutputSize(); + if (destPos.x >= outputSize.x || destPos.y >= outputSize.y) { + return; + } +#endif + vec2 pos = HOOKED_size * HOOKED_map(ivec2(gl_GlobalInvocationID)); + vec2 subpix = fract(pos - 0.5); + pos -= subpix; + subpix = LUTPOS(subpix, vec2(9.0, 9.0)); + vec2 subpix_inv = 1.0 - subpix; + subpix /= vec2(2.0, 288.0); + subpix_inv /= vec2(2.0, 288.0); + ivec2 ipos = ivec2(floor(pos)) - rectl; + int lpos = ipos.x + ipos.y * 36; + float sample0 = samples[-37 + lpos]; + float sample1 = samples[-1 + lpos]; + float sample2 = samples[35 + lpos]; + float sample3 = samples[71 + lpos]; + float sample4 = samples[-36 + lpos]; + float sample5 = samples[0 + lpos]; + float sample6 = samples[36 + lpos]; + float sample7 = samples[72 + lpos]; + float sample8 = samples[-35 + lpos]; + float sample9 = samples[1 + lpos]; + float sample10 = samples[37 + lpos]; + float sample11 = samples[73 + lpos]; + float sample12 = samples[-34 + lpos]; + float sample13 = samples[2 + lpos]; + float sample14 = samples[38 + lpos]; + float sample15 = samples[74 + lpos]; + vec3 abd = vec3(0.0, 0.0, 0.0); + float gx, gy; + gx = (sample4 - sample0); + gy = (sample1 - sample0); + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.04792235409415088; + gx = (sample5 - sample1); + gy = (sample2 - sample0) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (sample6 - sample2); + gy = (sample3 - sample1) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (sample7 - sample3); + gy = (sample3 - sample2); + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.04792235409415088; + gx = (sample8 - sample0) / 2.0; + gy = (sample5 - sample4); + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (sample9 - sample1) / 2.0; + gy = (sample6 - sample4) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.07901060453704994; + gx = (sample10 - sample2) / 2.0; + gy = (sample7 - sample5) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.07901060453704994; + gx = (sample11 - sample3) / 2.0; + gy = (sample7 - sample6); + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (sample12 - sample4) / 2.0; + gy = (sample9 - sample8); + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (sample13 - sample5) / 2.0; + gy = (sample10 - sample8) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.07901060453704994; + gx = (sample14 - sample6) / 2.0; + gy = (sample11 - sample9) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.07901060453704994; + gx = (sample15 - sample7) / 2.0; + gy = (sample11 - sample10); + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (sample12 - sample8); + gy = (sample13 - sample12); + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.04792235409415088; + gx = (sample13 - sample9); + gy = (sample14 - sample12) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (sample14 - sample10); + gy = (sample15 - sample13) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (sample15 - sample11); + gy = (sample15 - sample14); + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.04792235409415088; + float a = abd.x, b = abd.y, d = abd.z; + float T = a + d, D = a * d - b * b; + float delta = sqrt(max(T * T / 4.0 - D, 0.0)); + float L1 = T / 2.0 + delta, L2 = T / 2.0 - delta; + float sqrtL1 = sqrt(L1), sqrtL2 = sqrt(L2); + float theta = mix(mod(atan(L1 - a, b) + 3.141592653589793, 3.141592653589793), 0.0, abs(b) < 1.192092896e-7); + float lambda = sqrtL1; + float mu = mix((sqrtL1 - sqrtL2) / (sqrtL1 + sqrtL2), 0.0, sqrtL1 + sqrtL2 < 1.192092896e-7); + float angle = floor(theta * 24.0 / 3.141592653589793); + float strength = mix(mix(0.0, 1.0, lambda >= 0.004), mix(2.0, 3.0, lambda >= 0.05), lambda >= 0.016); + float coherence = mix(mix(0.0, 1.0, mu >= 0.25), 2.0, mu >= 0.5); + float coord_y = ((angle * 4.0 + strength) * 3.0 + coherence) / 288.0; + float res = 0.0; + vec4 w; + w = texture(ravu_zoom_lut2, vec2(0.0, coord_y) + subpix); + res += sample0 * w[0]; + res += sample1 * w[1]; + res += sample2 * w[2]; + res += sample3 * w[3]; + w = texture(ravu_zoom_lut2, vec2(0.5, coord_y) + subpix); + res += sample4 * w[0]; + res += sample5 * w[1]; + res += sample6 * w[2]; + res += sample7 * w[3]; + w = texture(ravu_zoom_lut2, vec2(0.0, coord_y) + subpix_inv); + res += sample15 * w[0]; + res += sample14 * w[1]; + res += sample13 * w[2]; + res += sample12 * w[3]; + w = texture(ravu_zoom_lut2, vec2(0.5, coord_y) + subpix_inv); + res += sample11 * w[0]; + res += sample10 * w[1]; + res += sample9 * w[2]; + res += sample8 * w[3]; + res = clamp(res, 0.0, 1.0); + imageStore(out_image, ivec2(gl_GlobalInvocationID), res); +} diff --git a/src/Effects/RAVU/RAVU_Zoom_R2_RGB.hlsl b/src/Effects/RAVU/RAVU_Zoom_R2_RGB.hlsl new file mode 100644 index 000000000..9f9cea73f --- /dev/null +++ b/src/Effects/RAVU/RAVU_Zoom_R2_RGB.hlsl @@ -0,0 +1,219 @@ +// This file is generated by the scripts available at https://github.com/hauuau/magpie-prescalers +// Please don't edit this file directly. +// Generated by: ravu-zoom.py --target rgb --weights-file weights\ravu-zoom_weights-r2.py --float-format float16dx --use-compute-shader --use-magpie --overwrite +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +//!MAGPIE EFFECT +//!VERSION 4 + +//!TEXTURE +Texture2D INPUT; + +//!SAMPLER +//!FILTER POINT +SamplerState sam_INPUT; + +//!TEXTURE +// +// +Texture2D OUTPUT; + +//!TEXTURE +//!SOURCE ravu_zoom_lut2_f16.dds +//!FORMAT R16G16B16A16_FLOAT +Texture2D ravu_zoom_lut2; + +//!SAMPLER +//!FILTER LINEAR +SamplerState sam_ravu_zoom_lut2; + +//!COMMON +#include "prescalers.hlsli" + +#define LAST_PASS 1 + +//!PASS 1 +//!DESC RAVU-Zoom (rgb, r2, compute) +//!IN INPUT, ravu_zoom_lut2 +//!OUT OUTPUT +//!BLOCK_SIZE 32, 8 +//!NUM_THREADS 32, 8 +static const vec3 color_primary = vec3(0.2126, 0.7152, 0.0722); +#define LUTPOS(x, lut_size) mix(0.5 / (lut_size), 1.0 - 0.5 / (lut_size), (x)) +shared vec3 samples[432]; + +#define CURRENT_PASS 1 + +#define GET_SAMPLE(x) x +#define imageStore(out_image, pos, val) imageStoreOverride(pos, val) +void imageStoreOverride(uint2 pos, float4 value) { OUTPUT[pos] = value; } + +#define INPUT_tex(pos) GET_SAMPLE(vec4(texture(INPUT, pos))) +static const float2 INPUT_size = float2(GetInputSize()); +static const float2 INPUT_pt = float2(GetInputPt()); + +#define ravu_zoom_lut2_tex(pos) (vec4(texture(ravu_zoom_lut2, pos))) + +#define HOOKED_tex(pos) INPUT_tex(pos) +#define HOOKED_size INPUT_size +#define HOOKED_pt INPUT_pt + +void Pass1(uint2 blockStart, uint3 threadId) { + ivec2 group_begin = ivec2(gl_WorkGroupID) * ivec2(gl_WorkGroupSize); + ivec2 group_end = group_begin + ivec2(gl_WorkGroupSize) - ivec2(1, 1); + ivec2 rectl = ivec2(floor(HOOKED_size * HOOKED_map(group_begin) - 0.5001)) - 1; + ivec2 rectr = ivec2(floor(HOOKED_size * HOOKED_map(group_end) - 0.4999)) + 2; + ivec2 rect = rectr - rectl + 1; + for (int id = int(gl_LocalInvocationIndex); id < rect.x * rect.y; + id += int(gl_WorkGroupSize.x * gl_WorkGroupSize.y)) { + uint y = (uint)id / rect.x, x = (uint)id % rect.x; + samples[x + y * 36] = HOOKED_tex(HOOKED_pt * (vec2(rectl + ivec2(x, y)) + vec2(0.5, 0.5))).xyz; + } + barrier(); +#if CURRENT_PASS == LAST_PASS + uint2 destPos = blockStart + threadId.xy; + uint2 outputSize = GetOutputSize(); + if (destPos.x >= outputSize.x || destPos.y >= outputSize.y) { + return; + } +#endif + vec2 pos = HOOKED_size * HOOKED_map(ivec2(gl_GlobalInvocationID)); + vec2 subpix = fract(pos - 0.5); + pos -= subpix; + subpix = LUTPOS(subpix, vec2(9.0, 9.0)); + vec2 subpix_inv = 1.0 - subpix; + subpix /= vec2(2.0, 288.0); + subpix_inv /= vec2(2.0, 288.0); + ivec2 ipos = ivec2(floor(pos)) - rectl; + int lpos = ipos.x + ipos.y * 36; + vec3 sample0 = samples[-37 + lpos]; + vec3 sample1 = samples[-1 + lpos]; + vec3 sample2 = samples[35 + lpos]; + vec3 sample3 = samples[71 + lpos]; + vec3 sample4 = samples[-36 + lpos]; + vec3 sample5 = samples[0 + lpos]; + vec3 sample6 = samples[36 + lpos]; + vec3 sample7 = samples[72 + lpos]; + vec3 sample8 = samples[-35 + lpos]; + vec3 sample9 = samples[1 + lpos]; + vec3 sample10 = samples[37 + lpos]; + vec3 sample11 = samples[73 + lpos]; + vec3 sample12 = samples[-34 + lpos]; + vec3 sample13 = samples[2 + lpos]; + vec3 sample14 = samples[38 + lpos]; + vec3 sample15 = samples[74 + lpos]; + float luma0 = dot(sample0, color_primary); + float luma1 = dot(sample1, color_primary); + float luma2 = dot(sample2, color_primary); + float luma3 = dot(sample3, color_primary); + float luma4 = dot(sample4, color_primary); + float luma5 = dot(sample5, color_primary); + float luma6 = dot(sample6, color_primary); + float luma7 = dot(sample7, color_primary); + float luma8 = dot(sample8, color_primary); + float luma9 = dot(sample9, color_primary); + float luma10 = dot(sample10, color_primary); + float luma11 = dot(sample11, color_primary); + float luma12 = dot(sample12, color_primary); + float luma13 = dot(sample13, color_primary); + float luma14 = dot(sample14, color_primary); + float luma15 = dot(sample15, color_primary); + vec3 abd = vec3(0.0, 0.0, 0.0); + float gx, gy; + gx = (luma4 - luma0); + gy = (luma1 - luma0); + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.04792235409415088; + gx = (luma5 - luma1); + gy = (luma2 - luma0) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (luma6 - luma2); + gy = (luma3 - luma1) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (luma7 - luma3); + gy = (luma3 - luma2); + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.04792235409415088; + gx = (luma8 - luma0) / 2.0; + gy = (luma5 - luma4); + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (luma9 - luma1) / 2.0; + gy = (luma6 - luma4) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.07901060453704994; + gx = (luma10 - luma2) / 2.0; + gy = (luma7 - luma5) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.07901060453704994; + gx = (luma11 - luma3) / 2.0; + gy = (luma7 - luma6); + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (luma12 - luma4) / 2.0; + gy = (luma9 - luma8); + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (luma13 - luma5) / 2.0; + gy = (luma10 - luma8) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.07901060453704994; + gx = (luma14 - luma6) / 2.0; + gy = (luma11 - luma9) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.07901060453704994; + gx = (luma15 - luma7) / 2.0; + gy = (luma11 - luma10); + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (luma12 - luma8); + gy = (luma13 - luma12); + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.04792235409415088; + gx = (luma13 - luma9); + gy = (luma14 - luma12) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (luma14 - luma10); + gy = (luma15 - luma13) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (luma15 - luma11); + gy = (luma15 - luma14); + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.04792235409415088; + float a = abd.x, b = abd.y, d = abd.z; + float T = a + d, D = a * d - b * b; + float delta = sqrt(max(T * T / 4.0 - D, 0.0)); + float L1 = T / 2.0 + delta, L2 = T / 2.0 - delta; + float sqrtL1 = sqrt(L1), sqrtL2 = sqrt(L2); + float theta = mix(mod(atan(L1 - a, b) + 3.141592653589793, 3.141592653589793), 0.0, abs(b) < 1.192092896e-7); + float lambda = sqrtL1; + float mu = mix((sqrtL1 - sqrtL2) / (sqrtL1 + sqrtL2), 0.0, sqrtL1 + sqrtL2 < 1.192092896e-7); + float angle = floor(theta * 24.0 / 3.141592653589793); + float strength = mix(mix(0.0, 1.0, lambda >= 0.004), mix(2.0, 3.0, lambda >= 0.05), lambda >= 0.016); + float coherence = mix(mix(0.0, 1.0, mu >= 0.25), 2.0, mu >= 0.5); + float coord_y = ((angle * 4.0 + strength) * 3.0 + coherence) / 288.0; + vec3 res = vec3(0.0, 0.0, 0.0); + vec4 w; + w = texture(ravu_zoom_lut2, vec2(0.0, coord_y) + subpix); + res += sample0 * w[0]; + res += sample1 * w[1]; + res += sample2 * w[2]; + res += sample3 * w[3]; + w = texture(ravu_zoom_lut2, vec2(0.5, coord_y) + subpix); + res += sample4 * w[0]; + res += sample5 * w[1]; + res += sample6 * w[2]; + res += sample7 * w[3]; + w = texture(ravu_zoom_lut2, vec2(0.0, coord_y) + subpix_inv); + res += sample15 * w[0]; + res += sample14 * w[1]; + res += sample13 * w[2]; + res += sample12 * w[3]; + w = texture(ravu_zoom_lut2, vec2(0.5, coord_y) + subpix_inv); + res += sample11 * w[0]; + res += sample10 * w[1]; + res += sample9 * w[2]; + res += sample8 * w[3]; + res = clamp(res, 0.0, 1.0); + imageStore(out_image, ivec2(gl_GlobalInvocationID), vec4(res, 1.0)); +} diff --git a/src/Effects/RAVU/RAVU_Zoom_R3.hlsl b/src/Effects/RAVU/RAVU_Zoom_R3.hlsl index ef70f5158..8a9b9b8c0 100644 --- a/src/Effects/RAVU/RAVU_Zoom_R3.hlsl +++ b/src/Effects/RAVU/RAVU_Zoom_R3.hlsl @@ -1,242 +1,255 @@ -// 移植自 https://raw.githubusercontent.com/bjin/mpv-prescalers/master/compute/ravu-zoom-r3.hook +// This file is generated by the scripts available at https://github.com/hauuau/magpie-prescalers +// Please don't edit this file directly. +// Generated by: ravu-zoom.py --target luma --weights-file weights\ravu-zoom_weights-r3.py --float-format float16dx --use-compute-shader --use-magpie --overwrite +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . //!MAGPIE EFFECT -//!VERSION 3 - +//!VERSION 4 //!TEXTURE Texture2D INPUT; -//!TEXTURE -//!SOURCE RAVU_Zoom_R3_Weights.dds -//!FORMAT R16G16B16A16_FLOAT -Texture2D ravu_zoom_lut3; - - //!SAMPLER //!FILTER POINT -SamplerState sam; +SamplerState sam_INPUT; + +//!TEXTURE +// +// +Texture2D OUTPUT; //!SAMPLER //!FILTER LINEAR -SamplerState sam1; +SamplerState sam_INPUT_LINEAR; +//!TEXTURE +//!SOURCE ravu_zoom_lut3_f16.dds +//!FORMAT R16G16B16A16_FLOAT +Texture2D ravu_zoom_lut3; -//!PASS 1 -//!IN INPUT, ravu_zoom_lut3 -//!BLOCK_SIZE 16, 16 -//!NUM_THREADS 16, 16 +//!SAMPLER +//!FILTER LINEAR +SamplerState sam_ravu_zoom_lut3; -#define NUM_PIXELS_X (MP_BLOCK_WIDTH + 5) -#define NUM_PIXELS_Y (MP_BLOCK_HEIGHT + 5) +//!COMMON +#include "prescalers.hlsli" -groupshared float samples[NUM_PIXELS_X * NUM_PIXELS_Y]; +#define LAST_PASS 1 -float GetLuma(float3 color) { - return dot(float3(0.299f, 0.587f, 0.114f), color); +//!PASS 1 +//!DESC RAVU-Zoom (luma, r3, compute) +//!IN INPUT, ravu_zoom_lut3 +//!OUT OUTPUT +//!BLOCK_SIZE 32, 8 +//!NUM_THREADS 32, 8 +#define LUTPOS(x, lut_size) mix(0.5 / (lut_size), 1.0 - 0.5 / (lut_size), (x)) +shared float samples[532]; + +#define CURRENT_PASS 1 + +#define GET_SAMPLE(x) dot(x.rgb, rgb2y) +#define imageStore(out_image, pos, val) imageStoreOverride(pos, val.x) +void imageStoreOverride(uint2 pos, float value) { + float2 UV = mul(rgb2uv, INPUT.SampleLevel(sam_INPUT_LINEAR, HOOKED_map(pos), 0).rgb); + OUTPUT[pos] = float4(mul(yuv2rgb, float3(value.x, UV)), 1.0); } -#define PI 3.1415926535897932384626433832795 - -// https://github.com/mpv-player/mpv/issues/9390#issuecomment-961082863 -#define LUT_POS(x, lut_size) lerp(0.5 / (lut_size), 1.0 - 0.5 / (lut_size), (x)) +#define INPUT_tex(pos) GET_SAMPLE(vec4(texture(INPUT, pos))) +static const float2 INPUT_size = float2(GetInputSize()); +static const float2 INPUT_pt = float2(GetInputPt()); -const static float3x3 yuv2rgb = { - 1, -0.00093, 1.401687, - 1, -0.3437, -0.71417, - 1, 1.77216, 0.00099 -}; - -const static float2x3 rgb2uv = { - -0.169, -0.331, 0.5, - 0.5, -0.419, -0.081 -}; - -float mod(float x, float y) { - return x - y * floor(x / y); -} +#define ravu_zoom_lut3_tex(pos) (vec4(texture(ravu_zoom_lut3, pos))) +#define HOOKED_tex(pos) INPUT_tex(pos) +#define HOOKED_size INPUT_size +#define HOOKED_pt INPUT_pt void Pass1(uint2 blockStart, uint3 threadId) { - const float2 inputPt = GetInputPt(); - const uint2 inputSize = GetInputSize(); - const float2 rcpScale = rcp(GetScale()); - - const int2 rectl = floor(blockStart * rcpScale - 0.5f) - 2; - const int2 rectr = floor((blockStart + uint2(MP_BLOCK_WIDTH, MP_BLOCK_HEIGHT)) * rcpScale - 0.5f) + 3; - const uint2 rect = uint2(rectr - rectl + 1); - - const int maxId = int(rect.x * rect.y); - - for (int id = int(threadId.y * MP_NUM_THREADS_X + threadId.x); id < maxId; id += MP_NUM_THREADS_X * MP_NUM_THREADS_Y) { + ivec2 group_begin = ivec2(gl_WorkGroupID) * ivec2(gl_WorkGroupSize); + ivec2 group_end = group_begin + ivec2(gl_WorkGroupSize) - ivec2(1, 1); + ivec2 rectl = ivec2(floor(HOOKED_size * HOOKED_map(group_begin) - 0.5001)) - 2; + ivec2 rectr = ivec2(floor(HOOKED_size * HOOKED_map(group_end) - 0.4999)) + 3; + ivec2 rect = rectr - rectl + 1; + for (int id = int(gl_LocalInvocationIndex); id < rect.x * rect.y; + id += int(gl_WorkGroupSize.x * gl_WorkGroupSize.y)) { uint y = (uint)id / rect.x, x = (uint)id % rect.x; - samples[x + y * NUM_PIXELS_X] = GetLuma(INPUT.SampleLevel(sam, inputPt * (rectl + uint2(x, y) + 0.5f), 0).rgb); + samples[x + y * 38] = HOOKED_tex(HOOKED_pt * (vec2(rectl + ivec2(x, y)) + vec2(0.5, 0.5))).x; } - - GroupMemoryBarrierWithGroupSync(); - + barrier(); +#if CURRENT_PASS == LAST_PASS uint2 destPos = blockStart + threadId.xy; - if (!CheckViewport(destPos)) { + uint2 outputSize = GetOutputSize(); + if (destPos.x >= outputSize.x || destPos.y >= outputSize.y) { return; } - - float2 pos = (destPos + 0.5f) * rcpScale; - float2 subpix = frac(pos - 0.5f); +#endif + vec2 pos = HOOKED_size * HOOKED_map(ivec2(gl_GlobalInvocationID)); + vec2 subpix = fract(pos - 0.5); pos -= subpix; - subpix = LUT_POS(subpix, 9); - float2 subpix_inv = 1.0 - subpix; - subpix /= float2(5.0, 288.0); - subpix_inv /= float2(5.0, 288.0); - uint2 ipos = uint2(floor(pos) - rectl); - uint lpos = ipos.x + ipos.y * NUM_PIXELS_X; - float sample0 = samples[lpos - 2 * NUM_PIXELS_X - 2]; - float sample1 = samples[lpos - NUM_PIXELS_X - 2]; - float sample2 = samples[lpos - 2]; - float sample3 = samples[lpos + NUM_PIXELS_X - 2]; - float sample4 = samples[lpos + 2 * NUM_PIXELS_X - 2]; - float sample5 = samples[lpos + 3 * NUM_PIXELS_X - 2]; - float sample6 = samples[lpos - 2 * NUM_PIXELS_X - 1]; - float sample7 = samples[lpos - NUM_PIXELS_X - 1]; - float sample8 = samples[lpos - 1]; - float sample9 = samples[lpos + NUM_PIXELS_X - 1]; - float sample10 = samples[lpos + 2 * NUM_PIXELS_X - 1]; - float sample11 = samples[lpos + 3 * NUM_PIXELS_X - 1]; - float sample12 = samples[lpos - 2 * NUM_PIXELS_X]; - float sample13 = samples[lpos - NUM_PIXELS_X]; - float sample14 = samples[lpos]; - float sample15 = samples[lpos + NUM_PIXELS_X]; - float sample16 = samples[lpos + 2 * NUM_PIXELS_X]; - float sample17 = samples[lpos + 3 * NUM_PIXELS_X]; - float sample18 = samples[lpos - 2 * NUM_PIXELS_X + 1]; - float sample19 = samples[lpos - NUM_PIXELS_X + 1]; - float sample20 = samples[lpos + 1]; - float sample21 = samples[lpos + NUM_PIXELS_X + 1]; - float sample22 = samples[lpos + 2 * NUM_PIXELS_X + 1]; - float sample23 = samples[lpos + 3 * NUM_PIXELS_X + 1]; - float sample24 = samples[lpos - 2 * NUM_PIXELS_X + 2]; - float sample25 = samples[lpos - NUM_PIXELS_X + 2]; - float sample26 = samples[lpos + 2]; - float sample27 = samples[lpos + NUM_PIXELS_X + 2]; - float sample28 = samples[lpos + 2 * NUM_PIXELS_X + 2]; - float sample29 = samples[lpos + 3 * NUM_PIXELS_X + 2]; - float sample30 = samples[lpos - 2 * NUM_PIXELS_X + 3]; - float sample31 = samples[lpos - NUM_PIXELS_X + 3]; - float sample32 = samples[lpos + 3]; - float sample33 = samples[lpos + NUM_PIXELS_X + 3]; - float sample34 = samples[lpos + 2 * NUM_PIXELS_X + 3]; - float sample35 = samples[lpos + 3 * NUM_PIXELS_X + 3]; - float3 abd = 0; + subpix = LUTPOS(subpix, vec2(9.0, 9.0)); + vec2 subpix_inv = 1.0 - subpix; + subpix /= vec2(5.0, 288.0); + subpix_inv /= vec2(5.0, 288.0); + ivec2 ipos = ivec2(floor(pos)) - rectl; + int lpos = ipos.x + ipos.y * 38; + float sample0 = samples[-78 + lpos]; + float sample1 = samples[-40 + lpos]; + float sample2 = samples[-2 + lpos]; + float sample3 = samples[36 + lpos]; + float sample4 = samples[74 + lpos]; + float sample5 = samples[112 + lpos]; + float sample6 = samples[-77 + lpos]; + float sample7 = samples[-39 + lpos]; + float sample8 = samples[-1 + lpos]; + float sample9 = samples[37 + lpos]; + float sample10 = samples[75 + lpos]; + float sample11 = samples[113 + lpos]; + float sample12 = samples[-76 + lpos]; + float sample13 = samples[-38 + lpos]; + float sample14 = samples[0 + lpos]; + float sample15 = samples[38 + lpos]; + float sample16 = samples[76 + lpos]; + float sample17 = samples[114 + lpos]; + float sample18 = samples[-75 + lpos]; + float sample19 = samples[-37 + lpos]; + float sample20 = samples[1 + lpos]; + float sample21 = samples[39 + lpos]; + float sample22 = samples[77 + lpos]; + float sample23 = samples[115 + lpos]; + float sample24 = samples[-74 + lpos]; + float sample25 = samples[-36 + lpos]; + float sample26 = samples[2 + lpos]; + float sample27 = samples[40 + lpos]; + float sample28 = samples[78 + lpos]; + float sample29 = samples[116 + lpos]; + float sample30 = samples[-73 + lpos]; + float sample31 = samples[-35 + lpos]; + float sample32 = samples[3 + lpos]; + float sample33 = samples[41 + lpos]; + float sample34 = samples[79 + lpos]; + float sample35 = samples[117 + lpos]; + vec3 abd = vec3(0.0, 0.0, 0.0); float gx, gy; gx = (sample13 - sample1) / 2.0; gy = (sample8 - sample6) / 2.0; - abd += float3(gx * gx, gx * gy, gy * gy) * 0.04792235409415088; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.04792235409415088; gx = (sample14 - sample2) / 2.0; gy = (-sample10 + 8.0 * sample9 - 8.0 * sample7 + sample6) / 12.0; - abd += float3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; gx = (sample15 - sample3) / 2.0; gy = (-sample11 + 8.0 * sample10 - 8.0 * sample8 + sample7) / 12.0; - abd += float3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; gx = (sample16 - sample4) / 2.0; gy = (sample11 - sample9) / 2.0; - abd += float3(gx * gx, gx * gy, gy * gy) * 0.04792235409415088; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.04792235409415088; gx = (-sample25 + 8.0 * sample19 - 8.0 * sample7 + sample1) / 12.0; gy = (sample14 - sample12) / 2.0; - abd += float3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; gx = (-sample26 + 8.0 * sample20 - 8.0 * sample8 + sample2) / 12.0; gy = (-sample16 + 8.0 * sample15 - 8.0 * sample13 + sample12) / 12.0; - abd += float3(gx * gx, gx * gy, gy * gy) * 0.07901060453704994; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.07901060453704994; gx = (-sample27 + 8.0 * sample21 - 8.0 * sample9 + sample3) / 12.0; gy = (-sample17 + 8.0 * sample16 - 8.0 * sample14 + sample13) / 12.0; - abd += float3(gx * gx, gx * gy, gy * gy) * 0.07901060453704994; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.07901060453704994; gx = (-sample28 + 8.0 * sample22 - 8.0 * sample10 + sample4) / 12.0; gy = (sample17 - sample15) / 2.0; - abd += float3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; gx = (-sample31 + 8.0 * sample25 - 8.0 * sample13 + sample7) / 12.0; gy = (sample20 - sample18) / 2.0; - abd += float3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; gx = (-sample32 + 8.0 * sample26 - 8.0 * sample14 + sample8) / 12.0; gy = (-sample22 + 8.0 * sample21 - 8.0 * sample19 + sample18) / 12.0; - abd += float3(gx * gx, gx * gy, gy * gy) * 0.07901060453704994; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.07901060453704994; gx = (-sample33 + 8.0 * sample27 - 8.0 * sample15 + sample9) / 12.0; gy = (-sample23 + 8.0 * sample22 - 8.0 * sample20 + sample19) / 12.0; - abd += float3(gx * gx, gx * gy, gy * gy) * 0.07901060453704994; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.07901060453704994; gx = (-sample34 + 8.0 * sample28 - 8.0 * sample16 + sample10) / 12.0; gy = (sample23 - sample21) / 2.0; - abd += float3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; gx = (sample31 - sample19) / 2.0; gy = (sample26 - sample24) / 2.0; - abd += float3(gx * gx, gx * gy, gy * gy) * 0.04792235409415088; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.04792235409415088; gx = (sample32 - sample20) / 2.0; gy = (-sample28 + 8.0 * sample27 - 8.0 * sample25 + sample24) / 12.0; - abd += float3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; gx = (sample33 - sample21) / 2.0; gy = (-sample29 + 8.0 * sample28 - 8.0 * sample26 + sample25) / 12.0; - abd += float3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; gx = (sample34 - sample22) / 2.0; gy = (sample29 - sample27) / 2.0; - abd += float3(gx * gx, gx * gy, gy * gy) * 0.04792235409415088; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.04792235409415088; float a = abd.x, b = abd.y, d = abd.z; float T = a + d, D = a * d - b * b; float delta = sqrt(max(T * T / 4.0 - D, 0.0)); float L1 = T / 2.0 + delta, L2 = T / 2.0 - delta; float sqrtL1 = sqrt(L1), sqrtL2 = sqrt(L2); - float theta = lerp(mod(atan2(L1 - a, b) + 3.141592653589793, 3.141592653589793), 0.0, abs(b) < 1.192092896e-7); + float theta = mix(mod(atan(L1 - a, b) + 3.141592653589793, 3.141592653589793), 0.0, abs(b) < 1.192092896e-7); float lambda = sqrtL1; - float mu = lerp((sqrtL1 - sqrtL2) / (sqrtL1 + sqrtL2), 0.0, sqrtL1 + sqrtL2 < 1.192092896e-7); + float mu = mix((sqrtL1 - sqrtL2) / (sqrtL1 + sqrtL2), 0.0, sqrtL1 + sqrtL2 < 1.192092896e-7); float angle = floor(theta * 24.0 / 3.141592653589793); - float strength = lerp(lerp(0.0, 1.0, lambda >= 0.004), lerp(2.0, 3.0, lambda >= 0.05), lambda >= 0.016); - float coherence = lerp(lerp(0.0, 1.0, mu >= 0.25), 2.0, mu >= 0.5); + float strength = mix(mix(0.0, 1.0, lambda >= 0.004), mix(2.0, 3.0, lambda >= 0.05), lambda >= 0.016); + float coherence = mix(mix(0.0, 1.0, mu >= 0.25), 2.0, mu >= 0.5); float coord_y = ((angle * 4.0 + strength) * 3.0 + coherence) / 288.0; float res = 0.0; - float4 w; - w = ravu_zoom_lut3.SampleLevel(sam1, float2(0.0, coord_y) + subpix, 0); + vec4 w; + w = texture(ravu_zoom_lut3, vec2(0.0, coord_y) + subpix); res += sample0 * w[0]; res += sample1 * w[1]; res += sample2 * w[2]; res += sample3 * w[3]; - w = ravu_zoom_lut3.SampleLevel(sam1, float2(0.2, coord_y) + subpix, 0); + w = texture(ravu_zoom_lut3, vec2(0.2, coord_y) + subpix); res += sample4 * w[0]; res += sample5 * w[1]; res += sample6 * w[2]; res += sample7 * w[3]; - w = ravu_zoom_lut3.SampleLevel(sam1, float2(0.4, coord_y) + subpix, 0); + w = texture(ravu_zoom_lut3, vec2(0.4, coord_y) + subpix); res += sample8 * w[0]; res += sample9 * w[1]; res += sample10 * w[2]; res += sample11 * w[3]; - w = ravu_zoom_lut3.SampleLevel(sam1, float2(0.6, coord_y) + subpix, 0); + w = texture(ravu_zoom_lut3, vec2(0.6, coord_y) + subpix); res += sample12 * w[0]; res += sample13 * w[1]; res += sample14 * w[2]; res += sample15 * w[3]; - w = ravu_zoom_lut3.SampleLevel(sam1, float2(0.8, coord_y) + subpix, 0); + w = texture(ravu_zoom_lut3, vec2(0.8, coord_y) + subpix); res += sample16 * w[0]; res += sample17 * w[1]; - w = ravu_zoom_lut3.SampleLevel(sam1, float2(0.0, coord_y) + subpix_inv, 0); + w = texture(ravu_zoom_lut3, vec2(0.0, coord_y) + subpix_inv); res += sample35 * w[0]; res += sample34 * w[1]; res += sample33 * w[2]; res += sample32 * w[3]; - w = ravu_zoom_lut3.SampleLevel(sam1, float2(0.2, coord_y) + subpix_inv, 0); + w = texture(ravu_zoom_lut3, vec2(0.2, coord_y) + subpix_inv); res += sample31 * w[0]; res += sample30 * w[1]; res += sample29 * w[2]; res += sample28 * w[3]; - w = ravu_zoom_lut3.SampleLevel(sam1, float2(0.4, coord_y) + subpix_inv, 0); + w = texture(ravu_zoom_lut3, vec2(0.4, coord_y) + subpix_inv); res += sample27 * w[0]; res += sample26 * w[1]; res += sample25 * w[2]; res += sample24 * w[3]; - w = ravu_zoom_lut3.SampleLevel(sam1, float2(0.6, coord_y) + subpix_inv, 0); + w = texture(ravu_zoom_lut3, vec2(0.6, coord_y) + subpix_inv); res += sample23 * w[0]; res += sample22 * w[1]; res += sample21 * w[2]; res += sample20 * w[3]; - w = ravu_zoom_lut3.SampleLevel(sam1, float2(0.8, coord_y) + subpix_inv, 0); + w = texture(ravu_zoom_lut3, vec2(0.8, coord_y) + subpix_inv); res += sample19 * w[0]; res += sample18 * w[1]; - res = saturate(res); - - float2 originUV = mul(rgb2uv, INPUT.SampleLevel(sam1, (destPos + 0.5f) * GetOutputPt(), 0).rgb); - WriteToOutput(destPos, mul(yuv2rgb, float3(res, originUV))); + res = clamp(res, 0.0, 1.0); + imageStore(out_image, ivec2(gl_GlobalInvocationID), res); } diff --git a/src/Effects/RAVU/RAVU_Zoom_R3_RGB.hlsl b/src/Effects/RAVU/RAVU_Zoom_R3_RGB.hlsl new file mode 100644 index 000000000..8c66a1b27 --- /dev/null +++ b/src/Effects/RAVU/RAVU_Zoom_R3_RGB.hlsl @@ -0,0 +1,281 @@ +// This file is generated by the scripts available at https://github.com/hauuau/magpie-prescalers +// Please don't edit this file directly. +// Generated by: ravu-zoom.py --target rgb --weights-file weights\ravu-zoom_weights-r3.py --float-format float16dx --use-compute-shader --use-magpie --overwrite +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +//!MAGPIE EFFECT +//!VERSION 4 + +//!TEXTURE +Texture2D INPUT; + +//!SAMPLER +//!FILTER POINT +SamplerState sam_INPUT; + +//!TEXTURE +// +// +Texture2D OUTPUT; + +//!TEXTURE +//!SOURCE ravu_zoom_lut3_f16.dds +//!FORMAT R16G16B16A16_FLOAT +Texture2D ravu_zoom_lut3; + +//!SAMPLER +//!FILTER LINEAR +SamplerState sam_ravu_zoom_lut3; + +//!COMMON +#include "prescalers.hlsli" + +#define LAST_PASS 1 + +//!PASS 1 +//!DESC RAVU-Zoom (rgb, r3, compute) +//!IN INPUT, ravu_zoom_lut3 +//!OUT OUTPUT +//!BLOCK_SIZE 32, 8 +//!NUM_THREADS 32, 8 +static const vec3 color_primary = vec3(0.2126, 0.7152, 0.0722); +#define LUTPOS(x, lut_size) mix(0.5 / (lut_size), 1.0 - 0.5 / (lut_size), (x)) +shared vec3 samples[532]; + +#define CURRENT_PASS 1 + +#define GET_SAMPLE(x) x +#define imageStore(out_image, pos, val) imageStoreOverride(pos, val) +void imageStoreOverride(uint2 pos, float4 value) { OUTPUT[pos] = value; } + +#define INPUT_tex(pos) GET_SAMPLE(vec4(texture(INPUT, pos))) +static const float2 INPUT_size = float2(GetInputSize()); +static const float2 INPUT_pt = float2(GetInputPt()); + +#define ravu_zoom_lut3_tex(pos) (vec4(texture(ravu_zoom_lut3, pos))) + +#define HOOKED_tex(pos) INPUT_tex(pos) +#define HOOKED_size INPUT_size +#define HOOKED_pt INPUT_pt + +void Pass1(uint2 blockStart, uint3 threadId) { + ivec2 group_begin = ivec2(gl_WorkGroupID) * ivec2(gl_WorkGroupSize); + ivec2 group_end = group_begin + ivec2(gl_WorkGroupSize) - ivec2(1, 1); + ivec2 rectl = ivec2(floor(HOOKED_size * HOOKED_map(group_begin) - 0.5001)) - 2; + ivec2 rectr = ivec2(floor(HOOKED_size * HOOKED_map(group_end) - 0.4999)) + 3; + ivec2 rect = rectr - rectl + 1; + for (int id = int(gl_LocalInvocationIndex); id < rect.x * rect.y; + id += int(gl_WorkGroupSize.x * gl_WorkGroupSize.y)) { + uint y = (uint)id / rect.x, x = (uint)id % rect.x; + samples[x + y * 38] = HOOKED_tex(HOOKED_pt * (vec2(rectl + ivec2(x, y)) + vec2(0.5, 0.5))).xyz; + } + barrier(); +#if CURRENT_PASS == LAST_PASS + uint2 destPos = blockStart + threadId.xy; + uint2 outputSize = GetOutputSize(); + if (destPos.x >= outputSize.x || destPos.y >= outputSize.y) { + return; + } +#endif + vec2 pos = HOOKED_size * HOOKED_map(ivec2(gl_GlobalInvocationID)); + vec2 subpix = fract(pos - 0.5); + pos -= subpix; + subpix = LUTPOS(subpix, vec2(9.0, 9.0)); + vec2 subpix_inv = 1.0 - subpix; + subpix /= vec2(5.0, 288.0); + subpix_inv /= vec2(5.0, 288.0); + ivec2 ipos = ivec2(floor(pos)) - rectl; + int lpos = ipos.x + ipos.y * 38; + vec3 sample0 = samples[-78 + lpos]; + vec3 sample1 = samples[-40 + lpos]; + vec3 sample2 = samples[-2 + lpos]; + vec3 sample3 = samples[36 + lpos]; + vec3 sample4 = samples[74 + lpos]; + vec3 sample5 = samples[112 + lpos]; + vec3 sample6 = samples[-77 + lpos]; + vec3 sample7 = samples[-39 + lpos]; + vec3 sample8 = samples[-1 + lpos]; + vec3 sample9 = samples[37 + lpos]; + vec3 sample10 = samples[75 + lpos]; + vec3 sample11 = samples[113 + lpos]; + vec3 sample12 = samples[-76 + lpos]; + vec3 sample13 = samples[-38 + lpos]; + vec3 sample14 = samples[0 + lpos]; + vec3 sample15 = samples[38 + lpos]; + vec3 sample16 = samples[76 + lpos]; + vec3 sample17 = samples[114 + lpos]; + vec3 sample18 = samples[-75 + lpos]; + vec3 sample19 = samples[-37 + lpos]; + vec3 sample20 = samples[1 + lpos]; + vec3 sample21 = samples[39 + lpos]; + vec3 sample22 = samples[77 + lpos]; + vec3 sample23 = samples[115 + lpos]; + vec3 sample24 = samples[-74 + lpos]; + vec3 sample25 = samples[-36 + lpos]; + vec3 sample26 = samples[2 + lpos]; + vec3 sample27 = samples[40 + lpos]; + vec3 sample28 = samples[78 + lpos]; + vec3 sample29 = samples[116 + lpos]; + vec3 sample30 = samples[-73 + lpos]; + vec3 sample31 = samples[-35 + lpos]; + vec3 sample32 = samples[3 + lpos]; + vec3 sample33 = samples[41 + lpos]; + vec3 sample34 = samples[79 + lpos]; + vec3 sample35 = samples[117 + lpos]; + float luma1 = dot(sample1, color_primary); + float luma2 = dot(sample2, color_primary); + float luma3 = dot(sample3, color_primary); + float luma4 = dot(sample4, color_primary); + float luma6 = dot(sample6, color_primary); + float luma7 = dot(sample7, color_primary); + float luma8 = dot(sample8, color_primary); + float luma9 = dot(sample9, color_primary); + float luma10 = dot(sample10, color_primary); + float luma11 = dot(sample11, color_primary); + float luma12 = dot(sample12, color_primary); + float luma13 = dot(sample13, color_primary); + float luma14 = dot(sample14, color_primary); + float luma15 = dot(sample15, color_primary); + float luma16 = dot(sample16, color_primary); + float luma17 = dot(sample17, color_primary); + float luma18 = dot(sample18, color_primary); + float luma19 = dot(sample19, color_primary); + float luma20 = dot(sample20, color_primary); + float luma21 = dot(sample21, color_primary); + float luma22 = dot(sample22, color_primary); + float luma23 = dot(sample23, color_primary); + float luma24 = dot(sample24, color_primary); + float luma25 = dot(sample25, color_primary); + float luma26 = dot(sample26, color_primary); + float luma27 = dot(sample27, color_primary); + float luma28 = dot(sample28, color_primary); + float luma29 = dot(sample29, color_primary); + float luma31 = dot(sample31, color_primary); + float luma32 = dot(sample32, color_primary); + float luma33 = dot(sample33, color_primary); + float luma34 = dot(sample34, color_primary); + vec3 abd = vec3(0.0, 0.0, 0.0); + float gx, gy; + gx = (luma13 - luma1) / 2.0; + gy = (luma8 - luma6) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.04792235409415088; + gx = (luma14 - luma2) / 2.0; + gy = (-luma10 + 8.0 * luma9 - 8.0 * luma7 + luma6) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (luma15 - luma3) / 2.0; + gy = (-luma11 + 8.0 * luma10 - 8.0 * luma8 + luma7) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (luma16 - luma4) / 2.0; + gy = (luma11 - luma9) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.04792235409415088; + gx = (-luma25 + 8.0 * luma19 - 8.0 * luma7 + luma1) / 12.0; + gy = (luma14 - luma12) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (-luma26 + 8.0 * luma20 - 8.0 * luma8 + luma2) / 12.0; + gy = (-luma16 + 8.0 * luma15 - 8.0 * luma13 + luma12) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.07901060453704994; + gx = (-luma27 + 8.0 * luma21 - 8.0 * luma9 + luma3) / 12.0; + gy = (-luma17 + 8.0 * luma16 - 8.0 * luma14 + luma13) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.07901060453704994; + gx = (-luma28 + 8.0 * luma22 - 8.0 * luma10 + luma4) / 12.0; + gy = (luma17 - luma15) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (-luma31 + 8.0 * luma25 - 8.0 * luma13 + luma7) / 12.0; + gy = (luma20 - luma18) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (-luma32 + 8.0 * luma26 - 8.0 * luma14 + luma8) / 12.0; + gy = (-luma22 + 8.0 * luma21 - 8.0 * luma19 + luma18) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.07901060453704994; + gx = (-luma33 + 8.0 * luma27 - 8.0 * luma15 + luma9) / 12.0; + gy = (-luma23 + 8.0 * luma22 - 8.0 * luma20 + luma19) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.07901060453704994; + gx = (-luma34 + 8.0 * luma28 - 8.0 * luma16 + luma10) / 12.0; + gy = (luma23 - luma21) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (luma31 - luma19) / 2.0; + gy = (luma26 - luma24) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.04792235409415088; + gx = (luma32 - luma20) / 2.0; + gy = (-luma28 + 8.0 * luma27 - 8.0 * luma25 + luma24) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (luma33 - luma21) / 2.0; + gy = (-luma29 + 8.0 * luma28 - 8.0 * luma26 + luma25) / 12.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.06153352068439959; + gx = (luma34 - luma22) / 2.0; + gy = (luma29 - luma27) / 2.0; + abd += vec3(gx * gx, gx * gy, gy * gy) * 0.04792235409415088; + float a = abd.x, b = abd.y, d = abd.z; + float T = a + d, D = a * d - b * b; + float delta = sqrt(max(T * T / 4.0 - D, 0.0)); + float L1 = T / 2.0 + delta, L2 = T / 2.0 - delta; + float sqrtL1 = sqrt(L1), sqrtL2 = sqrt(L2); + float theta = mix(mod(atan(L1 - a, b) + 3.141592653589793, 3.141592653589793), 0.0, abs(b) < 1.192092896e-7); + float lambda = sqrtL1; + float mu = mix((sqrtL1 - sqrtL2) / (sqrtL1 + sqrtL2), 0.0, sqrtL1 + sqrtL2 < 1.192092896e-7); + float angle = floor(theta * 24.0 / 3.141592653589793); + float strength = mix(mix(0.0, 1.0, lambda >= 0.004), mix(2.0, 3.0, lambda >= 0.05), lambda >= 0.016); + float coherence = mix(mix(0.0, 1.0, mu >= 0.25), 2.0, mu >= 0.5); + float coord_y = ((angle * 4.0 + strength) * 3.0 + coherence) / 288.0; + vec3 res = vec3(0.0, 0.0, 0.0); + vec4 w; + w = texture(ravu_zoom_lut3, vec2(0.0, coord_y) + subpix); + res += sample0 * w[0]; + res += sample1 * w[1]; + res += sample2 * w[2]; + res += sample3 * w[3]; + w = texture(ravu_zoom_lut3, vec2(0.2, coord_y) + subpix); + res += sample4 * w[0]; + res += sample5 * w[1]; + res += sample6 * w[2]; + res += sample7 * w[3]; + w = texture(ravu_zoom_lut3, vec2(0.4, coord_y) + subpix); + res += sample8 * w[0]; + res += sample9 * w[1]; + res += sample10 * w[2]; + res += sample11 * w[3]; + w = texture(ravu_zoom_lut3, vec2(0.6, coord_y) + subpix); + res += sample12 * w[0]; + res += sample13 * w[1]; + res += sample14 * w[2]; + res += sample15 * w[3]; + w = texture(ravu_zoom_lut3, vec2(0.8, coord_y) + subpix); + res += sample16 * w[0]; + res += sample17 * w[1]; + w = texture(ravu_zoom_lut3, vec2(0.0, coord_y) + subpix_inv); + res += sample35 * w[0]; + res += sample34 * w[1]; + res += sample33 * w[2]; + res += sample32 * w[3]; + w = texture(ravu_zoom_lut3, vec2(0.2, coord_y) + subpix_inv); + res += sample31 * w[0]; + res += sample30 * w[1]; + res += sample29 * w[2]; + res += sample28 * w[3]; + w = texture(ravu_zoom_lut3, vec2(0.4, coord_y) + subpix_inv); + res += sample27 * w[0]; + res += sample26 * w[1]; + res += sample25 * w[2]; + res += sample24 * w[3]; + w = texture(ravu_zoom_lut3, vec2(0.6, coord_y) + subpix_inv); + res += sample23 * w[0]; + res += sample22 * w[1]; + res += sample21 * w[2]; + res += sample20 * w[3]; + w = texture(ravu_zoom_lut3, vec2(0.8, coord_y) + subpix_inv); + res += sample19 * w[0]; + res += sample18 * w[1]; + res = clamp(res, 0.0, 1.0); + imageStore(out_image, ivec2(gl_GlobalInvocationID), vec4(res, 1.0)); +} diff --git a/src/Effects/RAVU/RAVU_Zoom_R3_Weights.dds b/src/Effects/RAVU/RAVU_Zoom_R3_Weights.dds deleted file mode 100644 index 6777330a793d60e1045c2cce3780b347c27d1fca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 933248 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%0Dqx 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

NY)@t*SFX8 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%0A;(7mOG!1D8IFI1H8MKk^%4WrjCF!9!Of* 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�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

5F3$GQ;Ug?B~$KI~^uJ-X!>q{i?9oR>b>RCT1l$ zF%%7}XBGK>9|KyMp;=BTZ$kMI)@rAaH!rLs{K0vF+dkwe=bm#c=OlF?e9J$psEQeg z1h{nU4`BvG?hH=e=Qc(OH7UvCyfU8M@G0qwHxKULmFa1e-0^Ipf zY*Jxg8^oKZP>6?Ed-4}meU|=#&*4p|4GVu}9fAH)H#7X5bpY=fX*w;*CPv2B@)+lB z%aJv58`R2vgRP*Pg!py|XMWgX=(P^j^xE9h>O|A0v<^8bs-u>7DT$eKO_qh6JRyE$9x5?-;F0)0PXodxW~cwc7$NS+XHYG@gcXh^#wT-6 zA<40ow#SqoKf|_zHrbpX-(=p2=QV89bf@k_RkcCdJ5fa_7S&6ANgKnf zk!+S6&_(n3mHjov`f}Jt4p9E3od#+f6*FI*XT0tyVFVeA z41arUjJ5iFoy_wZ8fWM!-c59X=jcAt1`ykMAGF^&3*0J{uKy0lxnu%=DmT<*o8})s zw<{je9wcgu_Q(b?W+o0R%B;&~vXf>O@>IXEqLac3He)5MqC{)n(FQl;ccE1DT{$E! zL2xANi6$3%%N~>xiM>+pHRRYgP*z>YxHO921o_cmXKfEcJ;+zT)BXNefiIEDWa8bKqo1FVGTS-HIsc9sUd|?O756(AYXx_y*2?c6~s)+QK={N@~4Jc?tfHgq9Y|vDcN0XQ_hhD!19l(B|4^y6TK= zuu|(d=Q3R)7H%Ej=q2M|+ws3`2t-p!EgkRyu=BsZlV4KNrdk~=c590=!fwNDoW~1q zii42r_Q?eXF@apQ1?AHX^SQ%popWQby-235A{$ckxng^0`v3kv0mK)mxsTzR&1$AY zotJ^0zjyq^Z06fLE`fR#$$~W){qw})vPh`kFjdmch+bA z2l>xfF>5hDSoKn|0t(^IlXsQAq31*IF>9NG4VxpGz*qcHj-mcn84ktiRAH*>`;?>D zq=yqNitq}VnF3F&>+e(DKBJhgAb`>sTmAY@!$U#k2YId`(49Y#Ov{qpNVbEf#I?Sn`Khb9ryvK!#ao(B!bcE+|9EMax@=MEO~`!RKD1?@a{ zHC?W_O#KRpXcuIeltJRDF(XMGl-Fd%f#b1}(UEYZwV%91J`3()y(RlDI|>VJ2kQ>j zbc5U5H1cxE9d?toTJ|OqVH@yc(wX7})^W?8Hhf7XlVeI%?jD=ONOasqwONG|M^q(B#W`{$n#2B4RT zFCscRn>WMtB(sjT0--rZCXy{RaFX@9(`75ORRg=c0e=AS`rF(J#M|Sv9uR+*H3R~D z?@>E6H0%Fls3mV8A8G{8V*{%e;65yNn!XMCkn_%8F|e;76lts(BWV<)hw zT&`M4-;b7Z+DIXZh&u|(sD`P3Lf>eYs{4yoltIz^8y44G#%ytiv2#(K;UXJX@mjH+ zgIhOCYwH%mZ2LbA+D(Vxadw83DLW4zv~{a$Efc`+to>__OIhrAYoH>pt&Ta(yjPwQ zK8U$X|Hb-;>muyN274ljF|b z@9S$cJ?l0y(x{D^b5W@%g1BWJ*9Y^@`BoHm6K&?-^Q|h>=PW|AeSi7u)6>z`jd$|b zX9{_5J<7a<^j6$5B2Cmi`JvyBRcFFH8Ite#DVc101t;3y<5})3q6Ewz&2YB@^GBPU zeZjam%l4kyjO!wc5761#$6!8xJS!I9?SxYRzCuI*?8@!v2z_f*4hN7%Xgl%wD68ss z>>d9N&m@fq%jXYAuawVI`0TcxS`XbFwGS)6W|pP+ z&jJR*QtJp+X}dt!XpK{NB|~7DEnYoT;pNzDTV=<@;qV)qzY;?1Y)+Q#zO=0FF}t00 zu53)@(aI-Wb*H-Us?$4@6?j~;>@=e{EPjxSbooR)x1VETT#ePXRx&&YUiL4$fX!}{Y73$i(z%M=`inU|L&q9U`1*CJtd7vzMSo|B)hg?l+KWk`ifV2yo$ve{7%m)Snl(mhYT zdk(6Z%T)gPo%Y^1ml8h}6c*P2kV$#^P8#xAn7`0}uu7>)hhD#CIbmihM@cf>+! z%h_30e|^H}1XfS{*XlfpgH>+s*0513p`JIy!W3@=TBCSut@K?-Me3oBO}>S^5bYR; zq46;1tJ-0Ad&q2xdIrA6rH<*M7_0w^OR;Z?0``W`;p*42w&+Q2q%u+V4IV&@5zQ_v z{&0+?a{!#Q-j$)LVddY)T>sVo?Zt^sLmAyRk zT-jm;49zo7tX(WKFgln?iW{|y8NEy)4U!r;eYmmPx>XVF7^8GX?mq8wbh>tjc16=i zv>dB3A8p!*PEp@AU-NZAny`K5evLOd2`Ywh4Ka)<#xAQL*)u42_S;tmyyVuxg^xRcr_ zEJ>k=Rcm}ILS9ZAVcFCfVr5y&r~mVMgz8X!kp{qj z$yUk_hpuDf2e!qI)tzDuk1mxSYM9SzFPuDyD<6juv(fGbWc19}|fE&_C+qY3D<|I{5?UvW^$F&J@6E{Qg5B%9z8cJKoGxy($H1=((UVc7@&TgLx2D9A?OKg?#k<;`7GC z5&>9Gxvv)d*Z;Dc{lVA^o=wwZSJ~N-6X+bxZAug6MRXg*V{PMx{mP30YV@t^0cB6!D_*>FOx**qKZbHv zkxq)KXr^;|`3P|%4|fdQ&{o!s*Vgf5y|p%o%d{V^xw!Ee{2nJN2A3a!Pncsp>x{v% z33U!%CgN3xQKvOA;giY_k>sX)?j5BofaV*(eTjVuulMYO+o`@$vz;?Is46QmT6vlr z9(}BK9r~TUS*eLWik@jYSbWvl9X;kNDcl`V-7QmvRmRokBTpK#u9VoR<27 z``E?6kNdzr1MqKR{R(hrL>s{qLTLSKnj5Q-TpLyJ3R(@fw*D2L%MO6E@E*c{m|NJR z%}Mc{AtAemiN*iM^gy$Xi9Cok0&1mCgl;nKGgs*HDt@IK7>~3!wJ&MU)cYc9c~pX} z-9*}f786EHQQexKO@yl*6<+jj_g1WZ^&a%3`!~hswTsYTcOQ8~tIp_L7p^Fau=6sU zdGh;F?Rldeed3?E%ej2a&6(Y>=LXI9)Z3nNu+G5aL;@1ZxWzJ`&y zK~RAce>?8=)RinDbhy0h?S_|ggg(hp(TAvUk?l9FToa9b` z1F%9$Pe&Q^lI$Y?JKnD1NnMA8OpRR8wR%z#i!o8Y)o*yWd-Dqi=Cpyc8`l&jWDkU| zdQ%IlGp4XRdzTgzq}+$|yyf{QyAb){Dak8vy+@XMZsm}@Yq$(gaMqJXKJN!S#71MEf*T^JbO`f@4(o=14gwaxd3@>RgExFQ&&Z{};_nSl0*KMn31xyKw0 z3B}A$NC!vPgkwA&vdSKpu#a~VUSS&~9E2W&4_G7OXCS*d#kdl!M9#2tExnM_oZ*}> z^RJYAD4JbhjMVgj#Ogs|5y*4bW`m8?3hCxPtP2fcb0@fG856@1?h?0J(~9~C8RXXL zdr{7DXS=&-^^^!+qMNGTN1n~y>6)(1i~EH;!*w?`x9NnCVr-LqxhWvwi@s9Wp-C2B zs_V`l=vyclsqGcN+B*P!rRx?C6Q>Y5rcHS02xe!gmn7{sovgbno|&AZDv4Igc+5pa zaQ^N*8p}&`$&btXhi)JQ`MDwn(@H$a+nLpwkx9_=dZeF(x)E`?2UL7c0+E!H>XE|~ z;_u9>zFc^PJ0kshQ<{4qm{XeItOD!VQ*15uGJi4b0XWm>7|`3v{Ca@v>G&C7zWIyr zDVXQaPnc_L#=REy+F1$9+hFi2duYN+bS!+yc3+swkA)*_g~AFn1RiL8F6fN@$+?2} z;*UXQvG4lVW)E;m*(TFqW*B=Sw8FG9csKJm=^j}GWOv-ve~ivz?{PHh|B4*JzV7Iu zkEJZ(u$`L?gCe`Yqn&PTT?iLWcMjARL~nqLon@L|Vwb@~oqwnz!h0Z%4qED&rj-d6 zqcXYg7FOaNW1GaYn{yK88|NpOn%>9988G2c-#o!s?NOoF^M#kJ`70sHHH(uWg_GXl zG1Rfx*yKz4VA@0J+GwNWdd`ai88zOSD;iQTi#E_XOGL__63KJ&MA5kyDA~?EIT6`C zV$+-fIU`dB)89ERW@%jSn14E~8Lxd8SkE0VQ-9iA=IOy|#_9i&_0@rGo7>yLh8&~J zcH$&Jrx%*?RT%G|EZNt&hsgCt9~WRxkfLrvP0nQ>hiR$Os~bzQrz+ijA0gyL68Pp2yOw&J08?bK$)LV2=;<%pFp zjMj-!8x{RYS|wgV9hK}Bbru}7rYk#%|HOVm8T=@x&hk5}r!d0%)RGS$5KMAX)-9|F zLeyDnB3VO3XPo`b;hbbqvvatK#^p;gT=&RN&|b+vS6A{3Z)}9yH75D@mU)S|ZD!*8 zE&QZm_Lu~}R!-t`>PY;{%`fBcS~KGdTT0@>tOfD(O+3X|bKm%whQ{b|rez7wYetBV zV)qiGsbTyeGR{BCz9@Y~`$1T({XqJl_FdS4&iNS`Ma!@X$NG#31zc=}V{XQWTn10( zjLmRmYAe{zN$K-qFNefC8dEoKn#tiirzH>Cd|}gM5VsB5^lko;tWg1YUsBfvj3edL z{08oSBZLLOKXi-z0_@u5T}#x)_x(g6z!QNCV^)k-Hk2D^^^OI^dE*D`26V0RFFA59Z}CO^>*PID%fP* z&OX2hFos%J)3>XZ(|TC%vA(Ow)jhS0VU4DrH)L3xY!Q6Yc!tDSFPV|%=_np}kWIHl z6FZn{)d}OUm{e~o;;q!?RVGZ>;=3z@#e66*U{CBVa zjy2bMeSb`h-LOK@-aps=R=$7q@4<@Z6a8sUqmMP1&vi^f? zwVq{uZeQk|Gx=Y7+JDh@j$XKFXNNW3^(Xti5wu%(K<3x5v#3>nQg)_pS3!xsEGp2G zmp2Yq%bwP3&!iDYqkpP#{|7g1IzMju733$WjbXAjIlbY7v<<(n>i}>^?cX5Zwo`t< zzWdAg;J(;)&Of*L-bxmO?a7fBg+YomAq}3xwJK&APw* zi=6JcD73&!Vrpw13fETC=f9g>hpn!z-q49uluNUMhRk5*WYPXo9D-#KbF1 z_R8kwxVTl`2};sU+SotzQOb^uXJg0dBEZ<>zjd|u@d*|cHI;X;H>&oXJ8!qxVZ<^ zcF1Ab#BD>=dH{?^Yc02c{NC&X#;Lno|NM_U*AI+Y>St>=i#Gis)kNPww?_5(irXS(l)-jU(+4QTJjmTxlt9h+;B(p zydg-DX`G_DQD;+ZAmwmWtxqi7P^l`ipNs2lp2vD*n%`8`;hiVUy0>vyhnBk4hP{nf z+n=jjYG`RpXzyG9lm2nzfx=n!Qv@+h?1CqC36k=r+T5vie@mTBJu}C;heluCbTIje zyOrA?_=PpPM}Xf~cog6>f}9U{U!pewxvQ}|kUtp)0Nxd37RU?J$sCX;_KR=dNXEs+ z&WIn>@Is=Ce;KE!pP?Tb-w?Oc!*%$?e;?;|Uvt&Q?TMXOv$3{!Y+&pHXO8={0##&L z54%UlIOR*syWEdr3aJQwK9SQjpVC7-_1sN|sE*JuX<+k2>qDOfvb^S*mN|jbqee7W zn%=S=$4qT5GBs9?QvA@Y&~=AjEBZB;>N{*O#=16DWsKg`De4?MCmnAxNF>ZpDcu{_ ziWcynB+si4*P((*$xq!D<1}7}X^?>I%Pea$#(WZ6*Iga!IVy)(LuS z8|~@ot^2&4dhVSix==RPTaP}neX=ve)>6N^h*SU7I=bPneH^c z$a}o0uf9`LbxvgSs>TCx2NO=k{nU^mqa|L8>(=nu zlAdUfdr)`UwLD>+m;cALx8oUcz1&wl8{;R%zO7y785Vzm_nU z^WLnfn@`5hVUNgyH@}yE<}S!=Z284o`a3tXwz(;?BlIL=%%-^lkEkKzKtqsmkYGl} z1kVRcNAbjrmDaKLW>IK{(bQl+;(hWPZBHtEl-16**DcO@mcX9-iGlPgwqmPac}EwRAoYF+#huhYi1?{#R=>D zYiB2*mTkgr_N%pNju-qd_5tqi9Op#CZA)6vkF3a=(<+LuhkUY5Zuuduh?ANn+7hn# zMTlqq*b*jB5U{f*HYZDeksQi=(g-s#@xjczIsr99GB$I!d!Z#qa>#Nm@_pXUyr%U*mg# zageL=9YKCGP(HFzkseoLkXJN5O>K$(T`p@hrZmNFmjBjJlAIYIs5sZaOB|BWOEITm zMcl}QV1=cAQuO46X^P+Lv{XaFa)qW&PPI#zXBs3tVOz{Dv%9=c`+lUavo915vUBYH z9GK8UopNP(>s8F6eBFW0R$(0F=h^HS#P4Q~u8(zO^W~<@hGq5_+;wP4!*A)gw~&c> zrrjCrt?iPY6I(KlwGK*HirvrX(b_ql!RnQ{XbTZb6Aj92ZE?!~6fDi`(Of0_BDQ4i zXnd%wm-NjX-LMQVlRP6o#-wJ`3J2<6M`vaaDF`-I%2#Fc@*kK#%a>$t$hm5jDW+vN zX9Q6p^5|@z*cyr^ugv;k(=JLLbs)3%7Mg8}aZtvP))(d`5PQ6i5Zc@LzAB$VwV^OB z6rg{?5y1P%ginC)C5cVodWez)Kt7w;2V9REk<06NX?l;JY;oP-)Qwa>*_^t|DcAMu zWW(xSCx0J(NY<^cb8@qMOw>8gz{EkZtD@>WSp1mSK2g`)t7Am*C!@}}uSUI%J0R&R zTw&GAPnbK2v#E3P8|Lw%dsar&OX^qQ7we74avLc!Sc<(}Oa2xtrJUx;_Daz{^Fw=$ z{SGhAQto0qJi_h9;@Y0xJn&-@LUB?8wnE7ZEEOqlTE{1qn?|N?YUL(Y>Jrjqt+a$Z z?Sr)An=iyIT|FO@NW}}8 z!>B-|~F~ z*19jT)!ZZxZ{41NlGSmSHlK{w>SrbhT9(AkWtJx0Zt5ZLBHErbzwxtTZ&gP@diV{` z$_`piXVE}6)Ztg!18HN;i1zM^=E%*i2Zeo<2W1xL-}(Kph^XgIUhXn-@TS}da8|qnpgHN=@t+fi zgX`e)f7@cSJ-Tm<&BigO$!Llr_%qX`2yU#>+|isFu_ktusmhcu`8#%l;gadB@RVXg z$Q4tWXk={q|HR^#WU1H%XrkP^ZY;PQa>UG%q?I{2C*-)Wmi~fqTb{$b22~&_ik+Cz zU#I3Ne$gFgrs{TqXF>n^Ep528;m4L0v7N1q`q<4;accAO`nr~5iZIjFx~LXqY^3?4 zr(ZKW_OfxNdvsHK#ax}TW_SavSpGkG$~j)FPjXXnhaS8~l~jYNeFC(fuWz7==5ZMk zZNqN`+qkQw?HdI7yLdIyu!c3+YuU%6k2YLM{^xIL+n?R|5ya-B>ZIUrKIV=D=wIst zu0yy}2Jm~oZ}V|`N3*H_*3l;S(2ds*@UGS2BagJOxE>Ri>nfU z9}ki))BlF5;XR^o-8!VDVmoiD4pyte&oGOKzW51#dwhg(u4W1QEmmk$Y6depV3eT| zU!;3MRtUIyQ`I^{g0K`fX!a5h_$#ns@OiWaQfMzAqKX3cBeV;U|cayx2?8*qDv)wz^hgLJpAaqJ<|kwoe#^%W09+=j>IKx`2F z6TgdTJ90*~N;X{A2T#GU=&QtimG6e^=$Aw$%2aPPPjzfAich<5e&={yn33AexWaa) zU`0xvx9;+xd_1{Tok5JvlP1Mgu7O76Q1LOkvy#J^O!=>RjWj!Tk6u9jEcrm;4%oJP zeH&K{dsT58j-|G4Y{S9knSj?)l3&#(L%Op7Wkx56`wkg@2kXB-DEoqI|0BlKW=Z35 zu5L8;W5gr81Dc|qCH9~Z+EqRk;sUHo_21!r_#ZHx+Qq8m-qaN-uW%}u4LY&?3moN4@i6P<#OISL`v`6C2L^10%ya!tK1B>wiFV ztBGG1imX?npO|!_J#8P@9SOXoA^8 z?I0Fnlkn4Kraq75D|%_1g>OQ3N}uZXAl>10QR@ggHd}p1)~E|agM+)7^6kZi`?7q@ z{TvSpPGqhmw_5M!KhG%8qZVHN-Sqz2BjoU0TN($M;&08KmhuEq2;OB}O03nN6YEk6 zxzKH{5j$td9zj)R72f$lK3wVCjpuM7R zyAGl7iuGd2)ZoF`2UR<1a+nAkT{%{gO!vU_a9pHeu2#z!uwYWf4b}qwYGHTgR?Rl= zG?g9L5%oIGJoXsfe$_{oiY3Py@%hLtd=O)XZY;(o#&aaPSBOFv!i~b^S`1kUaj~9S zPSq*SHT^UE6epGMi)+!ll{D6R%opwpmogpNUYgVJAx5e`+sZahz$K=oHjT;ct=22B zoi}=LhGC}lBDo6V!HZ1~bURR-yTLG#n4xPgeSuuYc&HnyDNU#+?q>fZHHfy9dh1gWHa}-+nLor{i3!v=WF`B zlnUKA-qqxW_|JF{mxKRiDWi@9pH^k_0detcsshO4ES~_+2Gbkhx8Ir0<86G>P3^() z7NZT|VDcQe4&$(|P_y7~;U2UgaFh7HU_6`@vPxv-8!OY9^M#KfrN+Uy%Ns%O43A*@ z@>OBSD)+MPas8_gY=EF#-gRXZS{=AoIEH&tJy|DT|10)4{sQfy6Dl|1*N|zLJv3f- z9W7QRvsBvC$eyxXHi1Xu8v>rQvhhw@ym$;VM3<=&xkIsCT zp+k17LelHfwqqYkgOjC6K|~);NO-=PPBoKl{LQ!h2=1{xs4~F!Gs`Z(_e9f1!1H$V z3c%-eb6=2`q*)-q`yZz1;QTE0*q|Z&8zNscJs@3BEa{EB_PxRDD$Zo@)i6Z?;z{ao z)@=SYZoTp&CyB4%Xv-ow{sIk6#XH1Q2!8jQ8GMuF;#=wc@JYyLOs>n-@6)c)Md+G! zKcTm=$><{@P2Uwi46VWcLO9h`j4${sWMD}VJ4inaYxJAIIHI4f&ESOwlh^=wctvUW zYe9k0Xz8v0$S<}2NMS@c`?PhO^{jq2cdAKbIZ1pC-$b+;rr>IJICPU(j%D)(NY?7- zVnqTXVuUUOOB7s^`eJURleRq-lH0f753S5LHs^T0AKGlCvZ4HL`0r*BcA8lJ{c2;CqE^<7=u3@Z8bP2Jyvb>f7_x=~N0h z4q2Um?}t_?Ks7ZK-~oyPJfF9Gn$NkvQG3fy~9R8j;CStAn*9~EeJn?bW6#qP^ zPE_u5ioO^c%pYH}fc1qp1X^6?W)9|`rmynr$*vdnpmz<+V+9GX(ccrRa1m}I=)@JI zL@y`r>S8bswoAKS-y8c*drvb+cL5p5lLd42d$fNC^a($xOT-QqU!<9c)##v-MZQCH zg=)I$aX=@b#WK^jlI$(1rE={Ya;V_6MQ`;kCgG|qJZpu%E3*%wHRLV@C56+~yX`~elJT>`6Mvkrn*%-euHM414eezt7D?=s2=@Sgo!J<=|=Z#A20;T-KfbVNjFI28L8`!j;cM3@`s zNW@uqe&yj}AMuUq>d?cid;Av_+v)cqBda3hBugad;%5rm%KBdTMYE9pjI~0zr+gAI z78|8!7>*G?VD-8)B)j^i+UrS>mgZz_`7tV3Ay4ckq3 zup*7w+g4|z_68Ox8$%4o=Iahb|EX8t5!k%wj=CJIV@Xe2eA?!sRGr11pZc<}3wN5W zB;{_w>C%g)!^ubTdsG}DUL=jldk3fBof3!UTt@S8B>rgTef)rTURXxz61*3=IAR<1 z(!K=5#UmV>0p78_0RCe-)d!#-r2>9JVVem2#x?t0;Fo(lztwT&Id%fS(dK*FwyEeQ z?3Ugty{s99KEzjuMVh7xDLhRum^PR-m1Qvb-~rrzy!qG(`c{^S_eT98)Q@?BzYcuI zHx1uj(}`8+Q{5pVOaC3p$5HGe)(y>pbF2Hn;p(2y6KDz9Ef7Oba(Cey_0L#-taNe# zT+hh$|EG?&{o#@TN0a?L(OLM#_KZr^{{=m@em48#kOelBl3I9d=+E4hc#O|U{JOVx zp`H*Bv!kN%vA~x8p{sq5kWSPj+t#8kp&avI%i6+G!54^6WUqo!v$qrvEh>K>J_P%d z{Wa&9I>0|hvMnnfo2R`j6{h_|2iUE)RRDXITc-efeq~AlcD&wH7u0q_rX>sTnPgi5 z_>XXG`0w8W^fY1&_>_2%F0DG0HdAE9($qtO3i!WaT?h&5Bu9e#7Ms{JN=t}-LG8I? zRQJg(Vaxd2;a&fe53a!CgT@lMqQU5`4Kt7_!q4y_e?8on*ID_&kER^W^+)>!wgzqG zlp&{l%4rPFR)iC-+7JYRAMuYDvGF3cTK8nbBJzvnBGy_}p}S&IYG(v)srX1jaJ4T@ z&_vMD-Ac;4Iz^>DTs|hUk=TblE&GQG?ZJH7aR_YG<67X7EV+?F}+}%67~yUYVJkcQtl^uiUJ5; zn3mLvKj~!rd3uki1k3i*!MsD(ccS5$~qMS>ZG zn-%7JLGT&9OgTsfR!E$&@eQdctg})uIaBMv3F~cq8_`XWZk$1O*NG)T#sd8#WLLy` z!(d_%M#=s(j3&b29kSEJCGsK$o3@(!7Hv%vnv*Om3wNfDGFBSP3(luxnBp)r|3LCs z>^M6=&ywUVpC$M{r*p#hx>yN2>x$wCkuCk2N|##oQBpd+iw&`k2X>oEB?5b$Zy5vR z>t+bpbx#u)#K)QBKHx8Eh#G)?#DfiO{0=5h0l5WR9X>$v9FN4U42CpJkE`!-Mv08r zXN>_$62HcW!IMNeg8OuNFSgFV+m^H1k*KMS=ZPPXr=tmwGz;1gj6eK6Igu z3$^Ob`5`KTe-i3y9c7q_Z)Md`myEA;8<-Ex&&coby}Yy5SLAAZg3!m5L(at0q{|I~ zWS(Jc#B!|OumQOv`)E9(-=-NH$@3P~Y(#2|)69j1FSD$scjl^sx0yJpFf`_W$@oC- zB7Vtxn%+u~NOtbcGzKBzIkI=8Y$8ltZf0pxqR}8JOtmU{5IaP#_$Et;bvEEJo^k?z zu*AF#$Q{j>0q<9h5WsRH1;!xc`dz@@`hpz%iA6eJY_2zh(UWl|B{5p)XIWUz9^PTKT2o z=b9qqJu^hI3(F+mz-I`Jt`qS)+R-o}bb>*y>!&iqH;EMN9v;f{y7NA7Ok z`t)7N5Xr(okMRpJPO_I5X)Mxjmeh-e8d!vnbgE>S;j2DWI$wCmpo6=@B2!3iY{46> z)ck!8l0OHjHQTbU?gf~^Y}a5r(zVj2s?;z z{p{p&bS^fJ@dFu*=4fj||1i8+UxhC&8Bg{L4#M-wuSo3`pDj7$mdHO5KPru!EM*em zrbT3cG+EPRUO@81rzY{)^u_BIfBvB%oFS$*G6H*BpImmz!b40N+i2Q`FMF(5n zWEB>cB6XH`nNcvW3xwX&VDUNs2IKoShS!;fL@5WmQSNDgHpqayDSe^9Z; z7O9EYY8^}tl4Rni%+HA4;!N&DbAfI&zf4d@&eWX})<>Km>vcDU`()QhyDnK6AN7LR zi$BJbs3U0ui@rxrS&yeKFFb(#Zhn!npr#`m@{VHXuvv*?bIinK z;$-}%ObdyTuN3c6HKdx{9I>sUr@033oM`zGm^&C+-i}{YX znKmfI&Uq!Y>zdnjV8@ALKo;mGNLSqzw6_{o z9ndd8%GIgLSmRZuPR%O$NOnN%nsp$T`lp^8=|w{@b=ljy^CcN<>7<__RO_x9xjKlS zP`s7IbUnD^1j~s#_$ppM>3YLD;s@U6$R5OL5Oe)QPkTyp&b-gqx9Ei`)U;QhSIC5e zNTV{kpi~uyKZDr$Wm*0=0DIr z_9*bPD%AxrZhr-4gSfbB)dL{I>e*o2KMJd3wSBIg{_%fY^XKhK*dI9#Gz2V)nn70RgUP)$HwPQGp=Bb%GTgptlcTi9pT zr(!JRxZfmAHDEE|Cae~dqZ007 z)nsi~)Wq9f9H3rQ{wIHZg$F;c+0E++KUUj9vxyf0z8T_U?wzJip{G`pbCloOX#zvDi{(mT$Zq-ooamZI9WnI?IGO zN!V@lE#NZ=x7(rTqlX=LB75 z{mP->gy5f{VD4ei6NPvkHkC^vJ$5NGLhjf!~`Td6El&*ubTtY9{5V-3Wv z6?ao{p?owUutHVN*^X)hJk4Ma2 zaZ4dA#L23{{?rBmJ0`J-z#pLAsHx3f=VKj#zo@|8gX^#j8vyLLMY|B3Ux;-B*dNz{ z^KY+rvqap{n!Xx@RSU@w3fa$j4ZVa1RUYOfK)c{c#YNC{j;}XWb3omp-_&~AC~g@i z77_Xng$#`A+Nj`XoX*UFa3c11@NxAW`fzMn$#m`1@HyJi0tUuq+|=GFJ_UDYjm91Y z@ennOjafGQh6Zw)Q8ZXj41|nmBu%Xe_hnM}LtbF<^*Ow#kVQZtPSZ++FoI-jKI`| z7&Azc@;>1KQWAcd+odcEV*oz)VFtisAFLGc)(blf@SHXX9M42yAaBsN`^Kx50eC)# z#DZ}V7PPtiVR$AcW_{w>=x4EDESXP*AJaFMyx=rJBjG`+i_B-tAGLiexdd*Sa< zCC$iZs+rgvftAOrT#RlEj}Sz#r|O&G6t)en)m1|SL+^VBhfwSlF5wec0QZ0e4lc%Cmu^9wtY;xH$UFTrRZ_)AONe>I z1kMAzvv#L;5s#-_kJIt3kP;4J29!SHeO;f3DY0e3RY4=Fo@yotL+DqPs$wDgD>R7t zocR?`X8Ps(<@ZxEOT+U5@)i^O+2OfX4kkoI?y5(k|OCdk8*F$;=GQR3htj zg7lE|+k^+DCo__d>uba9>T*;$5$ZR{WOo=dmfD%H3;15hIR8}>#v&glkKXx=CvdaED8$n(-BP6OvRWKX#p>cn}VevYuq!{H}^ThRKDcZkEU7ghp2 zhJUArhUa3zntrTuj9W^by7F&ed>MuiWm~G9@Fk zUCv_6q0*#RWFZ(0j!tctk%sG41&P5aWALXNX#4`^8{{mo%Mq9r*r`UhPn6~ZeLGZ6%T%vox}fiUjp`*V zId?$7Pu1VC??YoMFRLD~XK{ya=nmgz?uCxFBlTmTwcPQ(=F*|;_nax^Z`j$~zF228 zM!UoJ0Aj4BVNO90OZE{$swr@zPwl?f2ni?F7-B*4@yU_)3fBJpIRgr?7_ql_l zGnc_+hz(vz@5agS-_C4hP2?Fvhv1FqBi?xb7g)Ksm(3g66>N`|&kLg6#k`Hu`R^HN z-sd$Rpbv~zq+9h&ejxM^&C+(_vRDt`n(Eu$YO!Ck+7&i?S39@M>Q!)C+X#nbmgm#F z^;SYNs`Dzb2}oFaQ0{VEq7kQ-XHUfjqnzZR%jUfjJzp zL)k2+ssp_eI>4Q(%ij2o#fP4$u4`?PaZ zhVV=18|5qbUKn3%V0431LXSX4!jGbPA(QyS!$%tSlHUoq${za8_yhhTI*XaZiF=e4M+Om7xV7v{XstS$dyPF2&DA!d2JPpxkfK<)3mlx5Sa=Mt zsNkmdDky_DmGD!h=WoGYDxu`yJU_e=ffD=XbVmz$N%6s11F&iE7u_10Pk?hqti$ufOfjVX+_r{-Nq|_)zwA z@Eg8q`1Wd1Zc#PpP{w8M4DDC1|5Pixu!YqJD&G^WEaOIV_$T!qBo`hX%*9sX+sjvm zS1__^Ti|)6|J2d8U&7nPnuzG(g_uO}m?J{3Gw=J3&_*j=P;~fm<`mm6{U18O?pNP-!0%=Xx&j^#!B0WFHXI%f;*g1m8Q5(% zygT6AgYN>@;CCgU*t@Wt{|B$Vwtn+5%64W|5Eh^1%GS&bl4E`-U+r zY3MjoraK(|Yk5x-9el?>b)`uwQHN%+Ggfj&`8&SesT56Bs`1O-E|Uwf&1#X8;uTsiSS*+-UZwB0A#_8&=F)it6ye9+vB> za4*WJ*=x@eN2og4MwywC=~%jK1?z}J2>!?at;?IIl!+SauC@28`&II|=2g+K+JuPt zwyuT4Txk&}EIac@yM{|A>*nPiu3?IQ*5_r#xbryAEDw`5dj75B|8{0kPsDAzdrU`# zZK%+Es}Ii=`0(0fmG}<0Utafi$ZV7Q$ddoVjt}!+Tdu@RRWA^hTk_>>X^!}JVrcYe z!G2ygIXP+_waOSzqKUaT$fL5h=}EdX4udigC)FZeg^( zyQIOH3`v#yxr3;qb$vZD@xIEFjX&0jBDVUCXynvA5DBsHhM(OBxkKpVJ*?WTyp32^ zO|kQ)5LQjH)KUu3w&43RwpkQ`6Y;UVkhjtqY>Y9Y@p^kId6QJrSl2!(>5?>}{&dm7 zq@L1BcU0lC#D|jAuCn~*cpq_rQRcxz zZM;cbp%HC3+!+P<=Gb;~+vFkUR&YPe!W@9#BfK(@pDd7_1u{b-0&z(dFWed+pXp~1 zthUJHnW8-I3F@a9afp<6&g2u_i|%HxHD$|&tZxT(HoTHV=_^ zrH$8$9GP2%7SEVMR%WtPYc}MpPM#zf;#`;+8h=ZqaV%4!(5ZW@%|1u;Jez!0XU0V4F0DAOxwY8!vVy% zby;gUE#|_Qr^4&JLQ7rDcxe*XWGamwB3i_pXu1?NM37RBldvqCHh?|Vpq5NFY~!pp zoRXd(Mlr7ve{yb-rF1`YoKQp%Tu%jrG&sBHA~?I5q8hFUMP2kYt{c1&njS2%D-0P- z>q}qgT*mg6X5-~MF;yYz+^X6v(o%OQsFrT8XY_GHbq8!?ghEe7 z-C)}(DArB)Rq|^)sD}nk4mO_!_6k)KOw6+gL736$&bslNk}) zSkIXK438qDobT0p_34uP#BSOQ(w|>LZh~*?nguDuaIH6cujV<&K{uEeS${Yul6Cag zOxSr=W8xoWjB?J!&%pg?3HC+sc-{)Ao1+EuCt?IAY&H6n%ALaDRGscQLKkJ2j$p@X zes`|m@?BwdKRKO(pKE&5@m*|@e@#EnCWk$IoGq-Tn7SQ4$#&WqLEYlz7;$POX%p}x zKJq_nnuQV3iz9C1vBD#~AL|a~@6SIYk=En+#rZwN6Fu+pJbAq&!`;ofopb-@e{p`w z)?|MaEO3=(&CBG3Uw7V1U!0cCd*JMwoE*<&zHl%^4K7{XMqsB)>z|9-_!QTz26oNx zWC1?;wca%}-i_h@R_C>QEfes&wdPx&X@+Yn;Ge}|koO`FMAS1UlA6dtvOSQAWO~;X zZ&BUTWyy9#JXFpmC~2hVC#H}HmgaCiRn7EP9vXw^`Adl^!Ds_Q8>wdqMw0=gx5*Bt zqhkf@D^FUI>$Ec`R?mS0oaf6OteI$?<9FTBU=inojY0GYn@x|m9VKct@%&Kg5ZN9M z6`VFtC*902!3Dzt?#r5iHSL88hqzu{J6F=tMb>w%sTKX~{N(B8nkl3lx$dow?ZRJd z4A&Xk3PEqnamyl8jkxQ^Qt2hFKoT4QM@4Bl!cLIXqs{GG7!a||(=k_A_*F90?Z_!8 z=r7t;)0!QZui|rDa8^d{K*0bfmXVbWL3irHg_bj|K7D+Ad8_&qPt*Cg|NFM8M)c+yy!cjh&$30CTlicR}G|v^K*=_e;~ez z*Ge4JD|xZlM+#$p&m`FW?KX9}z>KZ6&GpG=4yYt;>kMO|3$%??UqVNN7}G5U_kjwiaf2gSEUc^^$oweePs{qh4ml3-EL5)qW*PFz4(RW z7xz+UdqIw)#I?&V5aG5}mVH){c%n5-rqM@9&R~6GR9LkHkp#JmvtAeZM2vF3$~;w+ zFWT&~W)>9k#9N(5GI9zm0;hdPx-RcX_*7eTT53*`XojO*%F&Ev>}FeIye9Et@j%;n zX|elQ!*3vV-QGA2@Yc891MD}p9s&MizlR5S45%9hu#e{oxDFRQ39>dj*Sp_?&#m?g z=RGGbNB8F^N@6XYqk@@d1sPSdqpA__+!p2!k#EZTGgk5sNw$Sd_x}?*DU@Ryp}o+b z#I1_KC3}U>OqJTnRcV}ihWpB|Tz_pJi$nT`JCuwxUl;aeox?@e&GcH{W&BqYleUYw z30`9wV|c|);pP&bp<~!2$Z4FQe^O=^_|pC$)Zqcb9_r`j?e)L9A4`25-!&C_&Um{q zcpA^So1~|ls~UFKZWFI{`qp)J<%pI!Z`NoWC&dyc-{vrP5tKS2WrJb8ZusiWpPMLlI zaWH;hCW-Ac{uwhbAqnejZC5O*AKtj`o8N6zv)g#fZjb@LvAQl7@cE->65#i+XFEX3 zGf38UUTj@%R2y#aEC=Ve?YC{+vFp5D=JQbs?;IkW%#me>jb?V#{~_&&dMlRUYeY$v zQLJ6TX3iY{$(%Fm&*>p$Ei@OpYx?%-|Npv0bcG{8=cys#O#WA-L*OM&3#$`4Q~L{Y zn9~P+!O)`Res3`p>7kVdoM6^(bZHm)M6)My{=bHAd&?ayjfdPu@mGhm5v>&pOC0m+ zgKD&bQx42yaeiQ4c4X9OZDRgiN0@D%X@vlHOpfeB-v&7OhpzS+!eGkex!!(=;65?L z^=Hv$fj{e%v2)?itX)EayEVVHDqqqlo}62NpB8r!CS?_3pSg4J!%6?p0e0uq8-V>P z-2u$D1D$HV_5Crr_JQMlYF2>nK2$3Qd1^ZO=*H*Cp6XK5uG9Ss79E= z1dGUxSR%1pyTYU`*AZulI+H~=M)Zk1sTV?9;lE8L^MC7+M%=_gH03s%)TFJ%WVRLJ zA*fU9Ydb9&>}?pZklG>s3(iroZ6m$44pbOPS;fAZELOY!Sd-MIGq|qW^HHi{@AYWi z6_RkQyPH!RD?X@t?;7sfA(~FCv(IrXmu%I1r`l&eCVD_Fk)@cIMfibO_20j#y?5Rl zROO!2UgK5>S2?E??Wq|e=xq7Bpx#w2I>RRN54lj@HX)IlRJ&WaMf4==j=PGR6y{9z z{7;_3pq2t2&zrvWef>;!27ddBF5p{y0qqClbN=F)fahBgQ$QU3uix?!Dz&bV8?8G;E-&z|Z4(VYQ3$}r|BchV|r>Wyv$L-g7XYE8P zHz*_pAX`>?`#Kwzt&nvfai(HVQt*@6KccTa5Llw z{L2yUdD|X&lcgO$-SJRfZfV%qjZ($wzkiUa*-UL)H=-DiZEC(8y=lbJ!L zS3-aLESA_jM>?IlQhgHbDcobJ5ggK-Qt@4Dr3JW*7F}Zy)G>||na*m-Wh~!6#pNe? zk38fYbFSlMVUO^m&ZW`_KR&E*tP)n^KMLPEy9!#B2Wcy9ha?(zZ%e4)o$XxRX477Q z4<+*4p*o3=*eX4L88!+w=`-AXGLSb>y09j;?5p5G6xW3d9~0tOo&B)*7AGingVozt zI`kG-Q$MBXbQWEb-ykl!o(VIrxK9_f%N!@%>82IzOP7fwYLDjyrTGevx%TArPTt1b z=2(FqCl&K`+Pa&(MZ>z-Mg3hcA1J0190dTlDO-!(OF0pD+&c5oeja8>|Z zXoCT-J*c5THd>~G^HwmAQy1j#t$#sv_Ed$$vK9K-Mw5TCj!}E-sL4N2uD}Az(I_Q# zAn?9LE1POt(r$!#iHu+mOE zql+(`iQTQLcHM*gt0M4g&W)^AZ~gNA&NWb|_6w`jnaFF>7DAsKt;`_Ak9nR_%DdI3 zJ64HCMf~EawcV85#b0@5+7YoxCGqg6QIho$x$ckFO!53Eer;Ft7SRGZ>HHJxC)%#4 zw&ig53(hEZT6!_Y2$qEOu6tcDH}{^TQ^WRx>p2agpgP}zketQBJ?@lzLH1*DpITFH zb|y;@R`XYOUOJP1#8s2IBKa)zz?GHOJNgN{)(OQrYL2@b0B@C^I>2|h2LXQ9?CuHV zziP_?KCGDtFta8EV6003&b#B74S1eeHI&MdzcL7TPFuaa&f8~u12r>dnq_54G4(F` z1=Uh@$MjehMUi2Z*5;^*Hg?cOleeEE6%%;H^gc4xMpi5#W<+kFKI75BBJ#L%EQ{~+ z!^YoSi`kdq5!!9eDd_hQ3;Wr5QokeoIR2e|7IYVe;c?DYaC;=4{n;L;I*wFuIgS>U zhqfr}4E0rU*EPr`60_wCJP%z7kxjA$&o1XV$*YK0Zo0F#bWYSq*9qGv;pynJu40>1 z+A(IbW0|R^I9dT)hY>mAj*5Q9q52r{7XCJm&f7obwrFbIsQldgQ{3lnGA}0Yt7wiJ z&V7*6U88m}a%N<&5r}J`?EaZF_8`~BjFD-}1t(k^Q{Tl)Hg0h)iTlmj=-B}L!>78N zfWJnMFW}AO`Bt|l#LWfopKwEf*9Wx>aGt9+71;l4*SC892iZZ^MKS4wgulQhjJaW$ zAb@N;qAwZJZ)im5y$y6|&!B3ovIop*NILn=#t7c=~#!=4M-g%^Ny!{7%#9vf4 z@LL=UvBAhK3Ewe;7(rVK)cg2$MX?rgzG}~zPwO&lJiT}?>Up$ zOlP}HJo_xWk7HT-+jOsThGSu>BRMU0w*8)@m2IPU35f656bf)G@Tmcg^S!fx4Dqf5 zeBbJc0Q(b<_Dlu$(L9lGqkVqux()8@#u1pdiw-j@IOj~U!d6i@AtZYs3w766oy~iN z1-i`W93xM(!0=0~#n2O8U>sO+P;V0TGVYA~jSPW@n}v)Py4ymAF+zKlbyzvvR?RwE zVThV+Kc>GLcR0pn`KsL7%&oj;y{Xuzd=tgCUebIHSsZ`Dazv*HpG~uyL)Dq8Puv04 z{;I*{+W3#boPkT6J>6`P1D)i(?Vb$x6JK;scHI#47IyVKa?;=n&?MJw`yt_3Xqbbt z6$?v*4~>vTE!ZV+#YY+>!YDXebW`^hO6N^*z04X_R3u1o_s?otbd(+CsLwPP9N?-P z(#%u&2z$OgEu(E-18btaT{@QI=Df3pq!ng%U=Oy_Q+B1?Zn@1ym$>bEpA7gFDvAg2 zYwtY*_^}W3n0O#{=G2rzDb}#a`%DuuJoUOX4+8(_7 zoE*brbs_s3n;^Hco7TKxb|;%cx3s%rBFQz-Ub3E+t?MS}W9nR{)|!NiO;5@oLzpPh zXiz<8vbEhU!+4C?j^TRq2KM^!&B{sUCM~aq-Kd1jHx->ir&digc{S11t>RXgnpEd1 z9<$?2Tf&Ws!|b1pKk7S1&ErxrF1WM%rF)-%Avo__?)d^I#}D=$cHb5mWv@I9u2+Ji znoe$qgDVUp>5kX7#e!cAH74A=Lb%W{45}wi2<41YR8PhWNGQy~NSjj3+D=99kPy8d(qJ$=?{pE8l z2>PRQg>MFkPbO2z0LM(y5}aaBVpc3aDA#b0^s|^y9G##XCdHuklNtL zWjEK*%!>ttA__8D76`Iv8;Az2X;uGqUx`-4UIi!WgZgN4&} z{XftDBcC$zS<~geYOgb%GMDnM>&4n1<3Gxi)Z>*sI8jyOh*8=_)g$Qf+VkpZYxi-- ztKX|5H7W5z-9OL&BUh>?dbhX_@UEL0yltErG2O@o?%y3co{em9y6qR4PfWqRtE?aR zTJuEmo^c&7$^yY{bjty^{?QSX#TPhE)6dSy#qBf?j5_1+A^~$1F_HbefU)MGd>t&$ zmqbmanURgT4Ka^vB9RwaP>j5)5E-BLFCE}?w5JOA8Pi>b0M~lw2oPH>b1sQ$ykViM zAMoq)-21_MKs;7}`+w_cXZ%@f&mR|F_N<*x~w9MOo%x~tCtrC_tzQA*e0{-H}a0g z&}1!i=i?`_jk09zU)&{O&C8SY+23v5zm&B!PqH73%wed=SbMQ%FzbZock2O7Ywm9O zYRez;Pt1<-1r|=#I_4s7gZT!dx$L39ZZ3`|fbaUhYKlWbCaW=vx#$m5Inm#=u#hsR z>nLJqfzh;Fmsr&%f46zMZjG#eZi?lA?gl$G+hgSzA~?C}u>F5^{LhKp@*4Cj_aI{d zj;qNcU_Z|5?g9K)=%)g?Ll+L}1KOznc<1|cFWKEizgsrwBK5D~Ue-tYwj4L)wEnF9 z264IR)(yIqg07sCmbbdMf?r}ETSgP7g?l&buq;yU4enxl*SuccO1L*X%-loutm3Hg zy&hMkSBy7i8_&>s%U#A0@}hEb}zFDOWzy9cper})71DUm&+cysoaP{URGJn zWn&U^2NSAFGL%5=VTC=~^n@FM7#&wl4Scac=a86I@m2~h+E*Ip@hBnRPLgBee}*60 z&gh?WA0m@%xVDxjME6^}uFi=Up?xe;MH~7GeAvM?=}w9R1ylA&cG>cq5V?2+VqyGRNq;D z-*AiDb$xP8FJme*wR}xkGvj;iR&0Q6x48sbhi!8B%?F`bXj_}#OmbtfFZSc+Ji#F` z&rUPXg-WrO!96se@~q-m>jXnb?k9|AdubTWJ0osmnW(+RU8wu!SX~&A-AP9}e=iVc z-86*TpXWoFM+~v{cKKl$E<?R%XJC z53r>ck8NOhBd+Zo%>ll@S-;OyoNAv5@U5~P0`+Wr0g#ba1>m#K`a7^2O)LUXpHKE+ z7m4#NNrs)wo8p$Xb%s5h+vr}~Ch{tO7xI^_z>p^R2Dh_|$vcn|US)#}ZG^jo&26oT zkHRIwtJWd>IcxQ9WsEZ4loxkIsVEbe(zru#r`cmY$a{?6wW(~E1x|dey^SqT zI1e9XA7^CUwU$#5g;&}-SPlscxW(GfbWY&LFIkrwnSyfczPa2mnLk+D-Z8YG zFn5i1q4P%mrW~nW?I_7Vm|a1Z+J$+yvR;vkZF_QZGQEZ+wkg@==_`%7RycE8YKHlU z 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�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. + +// Conversion from GLSL to HLSL is done through defines as much as possible to ease synchronization and comparison with upstream +#define ivec2 int2 + +#define vec2 float2 +#define vec3 float3 +#define vec4 float4 + +#define mat4x3 float4x3 +#define matrixCompMult(mtx1, mtx2) (mtx1 * mtx2) + +#define shared groupshared + +#define atan atan2 +#define barrier GroupMemoryBarrierWithGroupSync +#define fract frac +#define intBitsToFloat asfloat +#define inversesqrt rsqrt +// mod deals only with positive numbers here and it could be substituted by fmod +#define mod fmod + +// lerp handles bools as the third argument differently from mix +float mix(float a, float b, bool c) { + return c ? b : a; +} + +#define MIX_LERP(type1, type3) type1 mix(type1 a, type1 b, type3 c) { return lerp(a, b, c); } +MIX_LERP(float, float) +MIX_LERP(float2, float2) +MIX_LERP(float3, float) +MIX_LERP(float4, float) + +#define texture(tex, pos) tex.SampleLevel(sam_##tex, pos, 0.0) + +#define OUTPUT_pt float2(GetOutputPt()) +#define frag_pos(id) (vec2(id) + vec2(0.5, 0.5)) +#define frag_map(id) (OUTPUT_pt * frag_pos(id)) +#define HOOKED_map(id) frag_map(id) + +#define gl_LocalInvocationIndex (threadId.y*MP_NUM_THREADS_X + threadId.x) +#define gl_LocalInvocationID threadId +#define gl_WorkGroupSize (uint2(MP_NUM_THREADS_X, MP_NUM_THREADS_Y)) +#define gl_WorkGroupID (blockStart / uint2(MP_BLOCK_WIDTH, MP_BLOCK_HEIGHT)) +#define gl_GlobalInvocationID (gl_WorkGroupID*gl_WorkGroupSize + threadId.xy) + +// disable warning about unknown pragma +#pragma warning(disable: 3568) +// disable warning about too many threads (ravu-r4-rgb triggers it) +#pragma warning(disable: 4714) + +// https://www.itu.int/dms_pubrec/itu-r/rec/bt/R-REC-BT.709-6-201506-I!!PDF-E.pdf +static const float3 rgb2y = float3(0.2126, 0.7152, 0.0722); +static const float2x3 rgb2uv = { + -0.2126/1.8556, -0.7152/1.8556, 0.9278/1.8556, + 0.7874/1.5748, -0.7152/1.5748, -0.0722/1.5748 +}; +static const float3x3 yuv2rgb = { + 1, 0, 1.5748, + 1, -0.187324, -0.468124, + 1, 1.8556, 0 +}; diff --git a/src/Effects/RAVU/ravu_3x_lut2_f16.dds b/src/Effects/RAVU/ravu_3x_lut2_f16.dds new file mode 100644 index 0000000000000000000000000000000000000000..63f627f29882f8f69c011b9e1b948723e8b19a87 GIT binary patch literal 17408 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 BWf1@X literal 0 HcmV?d00001 diff --git a/src/Effects/RAVU/ravu_3x_lut4_f16.dds b/src/Effects/RAVU/ravu_3x_lut4_f16.dds new file mode 100644 index 0000000000000000000000000000000000000000..a8d4e76dff77126f6fccf52cf49dd19d9a8432c9 GIT binary patch literal 86528 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

$7p|L?_sKsvCxYFd1r{->=F2M_H zvSAx}f_#e1s@7`SD;7yUvp+^pK;yYPnq969%1vkyDi(iom0F5oh8i`rrHZnhD6pzFj?*D z&xVtk>llmv1*7O<)!%ig&ik?$M~v(lGz6QemFs$thoL#H%g(9Q9vs)N(oNMRGHFaN z;SE2!et84wp6H)P5Ski&rnZ09K+}tq@Z^~Kjxpm+LoS!LWO@|gWR)2=xIM})1Xya3EBYOuiM=P?h)3Vsx#VXd_Ex8b`Y20-CnJ& zv+zmxQr9P2l-8t=%_?hHmeRgyO=C>kYhafXZ-=)l$i0>u)0T>R7Zw?6jcqCni#^j~ zRPfI>aZHh@t))$-V83cRAq@?lqS`B+6{=Az&|FYYw{(u*=E#e3K}pnh z+Cw%f+u9V0CdX0ojdHy~S z3`RJA!AX5dFc5%mAi5bQ0AP>A!nO2<5b z$*Mh2m14BfU_6J-A?EUrDS=(X*Q@`toLovKhZ|2 zCZv6r8Jcz9yUqBhX^p>?Hkc?e{F}H^ALKpe6B;wtZ{xS~3v6eZ65Vn564nc;rMIv_ zE~jQo!M_@jwX7u;zOs$B_2*3Oa}(Q*0as$X z_POUwgVv0xC<)6bQpdDyZ48+kbxkxxcDd@wnhf)s(jF3f)D`<{`z*=yxH-}&`A>C| z^NSU4rM+y&9k=6N6u*HlDhJZf9784D5u^RGIE*eJb5T;Jq(pRuVu!pBdQN>y9*0~< z_sE>FCmrX=^Nwy+8cR~d?`2ow-&7XW1!^9si_}Z44 zGjE}f*l!|b)DTyxkcK`qE6^XHy}U?|>Ngm??%8aAZ@zFjFru+rL!NJnJ~|=afZ^BG zpIUDyJ7Lq13I4f4t@a*P zFBxYW>*}Bwl=0MH_4o8I*1jd05~|ekrWV=7S*w#vd{@?IHC8fP0#$)z<8EI`;!XaO z|8V0B-BaBT$3{&s?=a7`EhfJuJos#AEurGN*DmDSv3DA=Mh_R;2pMBxpJ6MpGFOx> zB)PMaHWd2CtdDE3W#s4dZ8rp5ecR>d*fO4r_eTZCIin9ng~mOMoF>korlIZ0b)1B& zB~PJO9E*s<(iq~b?xXeup;IIfYp6|H7JSmJLKE{Jwvl;8gd);}7WhouOdOJbB!-X= z(C?}1+(+&e`3_B^c1rfgw2&?l<%?ixNbD8K9&#U7OzubDqkEjW+>ef*ygA$zPb+>Y z_sj#lB_54zp!>9AAkiP6tsEiT4kA6>IGNYtI?4LoQwh%tMPHD$!7c(n_YzBO7Q~TZ9 zxdrS9?_KtH&zQ`u`ZsZ-OzBZQGZv#U)U|9FOa?W%8gPemuVsH1o)@yHb<0qHtJ9Hd zTjaDlWmyiNvJ9rHD3N0vyt<|mYbj}~4M%TiW@sy`yPBzowSQ*ly&RWKagQ!Nf;SDFtT;@-Y8M9Lj1Bu>T2zHh7`by zE1r@2N=5F;w1>yp0rXU1867NqhR*WwWH04PWC?$VIqGpUt=S3gH?AdomE$#ivvw;|2#1@?7!TD8JBtp~9jHx} zC1Z8SV$^J#gX!yX`OREgr&wDNvpHoxo(|ZdACZ^%5s^)Ym<*`FCtsd8(lUMB{_7IV{b8uL_`V84H%DX0^3N^Ho;u672(gn~Mayj<_Zg z8BJN4ndC;!Y7G+ZFb+q!XDRce@SW*X(qZjblf>CEovj?nw$FZ%bGz-oIsbzDi=6h^ zFW0z2G9nKaS@YY3Z7z_Ne2V;8R3z?S`%>J_`nkF>I?=fzY8EozS`sx~HQQcBDipiz zm$-iFPj;p459}W-J9ugI8{}_hEt~?vAE>X}e^8Dn8Eo(7_%kjO7)u6gK02cnX85rB zlq`)9w4+@`sKxcd@rl|(H3-M)bB?au3w4bxg{vwNkH`?>zH2X-^ z0`&*DE!Ibsk4|LHmS;JgY_L6^eulJ%dTW)cH}F&JOXMJ(K{^FWCtoO&rCH2{(w|)2 zpfRdF3R{#e-UZEDI}WiaN@TO`v+P}^*)d+#B6=JB&Q92RS`^G|o0{s)L{KuekNCbU z5z(QSlp|_8u^cr~kOLMSviZyHtd$%}AM`92RJF^kEwEAWs)~mAPs{`EwwJMY09&AU z%9E*%&^fEqoTiuuEv84gqRCS*tyq@oi`mzUt)~+4D!(RPy7co-o&fvecbBA@xE2=Er4@esv8A=6TemH z8J@%>`bw3n<-O3^iXL!^?ig@vu;f0bJ6#qt6bI;S2dhR)IE2Zz6 zmL`@6znOvpH_{33{rb3^m$|QVKIVP|_m{bGIhzZQmLZZ2`2}&8;@gSN$Jf+NkOz~S zZGV%i)(TLHxf+QzbLyvX8FCkmRt7YSxM1a8KyGA#E&ddwv2>5#0u@yKpvx(Hh|RHH zfi}>Su^ZY>>?8?KdzIfucT%;g-dgvK@cEl3P+Spl8Kj<%qoa$zo#3Hm2 zIG6r$s#$|0oIQ#cgYBih#3G1?O#B`4qYw6c%fg-<^u4FZnn-r@fAY@c`{COh7ZdJV zkFsUF(`ygpaWY0HglYz9cOg<_8~Olll+{ot*`4ek$O2?BCO02Y%~#jMQRq#q7x9B~ zK2pvnC^tgyXsi2?|1TBcgA#thmnD2-_&bX?txG9M?%a^?-R#%-6Acw@E}B~Vl2eBS z9KK`NA=ygp39<{H_oHm)I<9OD|VI%GQyzN>h!dBF2q1cJLR%2UJENJ|`?>buWH zdv^K4sokCw^-pAR_P*4)OnlbTKuGGe#`Fe%_NClKxi7)BDECsXKYMa{YU$dDHAM|A z<73W8VWCo+1*%cpbUrW7sh%#ai9(>0G5z5HbXR&(-ASGSB~nMhx9R|D68$^5OB1es zjpx95nibG84K@IctosPhaR$5os=g@u-u^~0M#HPZ9V5vB z$jYj{l_|D<>x!5{=O@=>YO2M>JheO`KkJ^^Mw+`3uT(zx2@Bh2)sGft+Kry~sM`G{ zieQd%x4cc>b9faymAJ>8XEs7+*6WjbmaA;__eJmVQdojD;;Zoq%mG~|cWZxST?=G} zZY+tYdm!T4O{EdIn;0lx85JdnD0^KOKrQh)8H}oR?rM>`-UyPmu|g(CDNV$1KUh3$nMkTK7Y`}*UwJ*so}W)x2zdp?qLO2 zT<(nA-?FN!23FNX?yHiCx~!>=75oiku7{I6bw=Q0-v7rzo+ z##8_Y+wa22u!+_tJcns3xv2}(?-mkJr!Wa!4^C@;l+6Ka2}9~9z(a*S+Rx}>GlkV_ z{!=}0&Qeyf_A*{-Bgujn{lF@fE0vs31f*u3rrn0z$GKawiP}GETE*U|>K2zF631N-jZ>Uf{ zIZS@5s^U)SzL>-Cb@*xp43|R%a4^%>w#?O$JqXu8--ai`#+uPJx9o_em=9+g95Kv! zVf@bn}V&3_YT9;GZ?)vM*+QVH;9K4ehm^eWSbyDbLdq!pWHodh&hmfq zET(q_!1kE9t5KYgn)5#65B)zTNz-8V!}_qsKTH+5!`rn6*YI`~xqp}%D&|)dhiJ?2 z@J*42BRU69uS||=UF9r)TlK1_Hu^+(wq=3ME?#V@RfGYWx`SdD5~fiHy-*$_`&Nv$ z-?hgIPX1Y4Hq`|Gte7aA27eNOtB49jkSD;TL8tW&XpXpu8b)VLtE!y?wbx`qjY7l;lj6QED!TeqNrtH~Wd$j) zJsly;btFHwHvN;yk+n4S7e#K!rDaUfHj z(Y_$wDcXR%a|$G#7Q#x9dd6w9najjsq#%LP1#k~h0*%yXk$<8~smGj_|AEwE_sJ`g zd{GN&aO}Pq7^K3Tk_>7cNSf2oQy_IpxGNwJw&I_8a=0h#70*&`i>JP>*d0e*!gFyV zx=JXqpq}mA2rot5W%s)mfIJn;)p-^vdg!LW#=4Btku_T z<|<+~a(9?;kJY*acuO3PAB8sz%@4u?D2;!wn!~n-mhi3Fqn6;R}$n{7ojFyo-LX*qkyQe+kb0j*8NW znTSpIooTG8WBR8grt+{h-Z_FzHEc^JGX|9}O8Eo3i_J^igY3{gFNt(9?gGtTtddE` zlCe;HGPzK-9(ALg@jLVmkd)0xDw@W8V80=Ux<>$x{y%D~W3;e>JjWxZd&Xe1!F0v; zE^Rm|0eP@F2{xy~_Svu394JZ;qe3RMTM z2$|+OgWZIVxuUpepq`=p#?jXK zi=|b3FGh#DSunQOJjMoKL#Wk=j=5zELD$hoa1qWBO}e9wLArf>C*Fec=+BBLW|uyN zqwvLsNatEcPE{$pGJhf;%y-#T=WOdN)q<$m_Swj+s4`L#KUfp0Naw2IN9;T2VYM>( z5^~BBf-e>}Y5sNOvExlQGe@QcrC!m8=@(*I@DsfzWoyP*?bYe=*ywmznMXU4Rd~B+!7sxwhF$~#i|I5)N2o+LZ>=ug22$ZT#0Bk99^6Y-MLmRftBtBvHIb~E{so*#J@=f3&f5g03vf9k`nC$A;3Q_Lu4ni+@k8Nc zssnr5d#C&X*Op@JpO`VK3#G}@ZqN(mPp&K`oy><9sM}&`_CBhSst<5J+DEKIN7UYz zb!HQhOG=LFk@P#W(Df&mflcFF;8SWos6ifF<@SO+*vEZ9 z(-7YRQ`WAkSPuS*<<^6qDbVN0H?TpfR1MNS#d>QeGEO$0K3o0_$#MqU+d~rt$Yy8d z9xIva_LmQ(kC~Pj2YJq$==x*n@t!CCIFJRuCc)-Z_%#o1$iEbSw5**7krc$8kDnDW z6C|}I7CE&xwjb2Z@&_U}&sQ%%>fy!M0aX;r^VdYMb&C*bA-Fts9E=-IYsag2VvOqn ze#jO~?qnNf+t8D&6se&ez`KxW=tRZVIk%OSnudm-!9*7&wVaM9qkFHej?)!V?1E&H_+9{Q}`|#YmQcO>M|stIg0ls zc&HdL@iUc+pgW}1P56GnANiLh{H20G9xTp|&k9N12eR5+W+|8>9mA4SFPa>_iZ(+6 zt$m4xqwF@vO#Z(0llNjmKfIg&3Y1e;P&LPDfgWN%==SIraY3Bk6|77__S&+j#?r5O z_C4^97FoY#bI?Tc@2ryKd@pa>>|dACxk2amXE!Io=2ZAK50(_g$E22?k6Ihi&=L#f zRRfT{mEn#Q+emU{RljwSbz{jMNDGjqX6O+0=F-j}>x{8?f$}J!C)vJ1@9)lU@%@3lbgx7FGG zmHd;mKM9pVm3*G5Vw=48m|Nbd#5w#Z_n2IUp$)mPi8VNgz z4p+~rH+t0W(ZZLgnfCW6!Q^GlNi6g$O_P0}k}uW&b5nCvm6eV$69VfJT9vS{ZSfpNz zzrwOG4|7BJ&h5kr;7&+V%~H02*Vfi+s^|w!3hVAHC6C+6q>sZ82&|b@`pc~?-o|f{ z&yVU_alw*R`#XP|F*$p&GhihZtg^y4^h@x5j4WZepwT^LYWYo4pLdMQ1IOwMnBj#T zi4_fyr-FFzGZBfj2&A*c=Apun`p+oh-J_iV&*3U{r?pej`Ekn?IP-*RC7!EUh)U2E z)HTUzYEsP^@xS^D#7b0zFJp2U7uZOC8NdQ#;rG9x<}kktZ6zbZn(&*tCs{93`pTD?lI!W@2@RY4Te6#zU~?+`ng_2} zWr+T$5y!QP?G|@l1ehy$bWII(%l>V+u?Dg9cLlS**1fimg;2Ow`B`dWGoanb9BwtV zgWRLK4tF7z;U#1mu}F9egLez>g;k8Fd~ac_u21+h^>%GXHkc`gmbqZKt*roFtr(}E zBz-DRE4?+ptvh4G>x%gpW~V)z?X7BXoL4S@3XI?APm%S8=UlL6D}RyA^6v^P6@T({ zH7=&F;Npb0jRnF9d_{eUd@|D=KPs7|QCSKDZe81Y3m(L!`_|znb>FJO@WbR6a~0Rl zl1mBp<*GSMqH22GbdYDe=+#6EWQ_I!^O6EjW{encn}}+Cg9A@DXXrm`Qgi+>4QAhG zd|3a7UeXlSs4)ypotU-S|2%!)`u)CylyrA@_eoSOm^DP*D$NZ4P-Y1Af{bQumSM^g z?HdGetuy%;@a%rzKyL%k)PA3!$<8Z~eK(kNTLvXJe{=3l`_=%Pms| zJEh_d@NS*NdR*R;$hIuDgh>|IPRQ)yT15xNFmMKNzGSTBko7}coN8rEy!RlG;yo1T z>R|B!=v2wBoK0YtOl|7fun)Qp@>-Mk7lk8hP}3((TCtEKH7Mm;^S2 zDNMPJtRQ((nV8g3_Z_S@w#O#uwX!~3y=N8N4L34d ziShVdeL?(qcr5V&B+qvAAVAUq$uE~dj~ zeMXadH1jmOnG|iNM!)i+KZR+d28BOel^RnVDQVfcX20e@{3<5hIgIQ9t7ILp5NEk& z8Wxb>(RoxkXg00Fs%-oDu}p<)HZ;XGhqwicbX~M*s7_l2Z@|s;6;*oGTBaidY9Wwc zDYy8k$Q*N{Y-#9}u#%`J;vei^0Ev1GItXVvKT?U+0pS4$xw9%_8699oDPb6w2uMx@ zq&Ap2BwVfQp~RR>pB(#_)ALUI5n-nLEZ<&V4zv2JakKc8h>L&}?dCh>nhki-I4)Fp zOuc0*sT&#sGUWdQo~ZxBUaNNi<~53J)Wu`TnypYCQK;?eE+hv!@1cj(t5W+DOLdjN zz;_!rp<(zeQLrHNie2mo{rx0UMjCfJMXNl3*CkIuZ-euezid}QNx(tv z6+TY8OZN_c;gYHg)ioLlKkiz~%%w18C#{rw%2$%N0P9-s-Y#2CcNUCfnlLK!r-UEL z7N&GqlHQN9aig-ENzrC%^eZp=dCiKDgAqMS`$X4;tX~V&e2@GMCD0p?nJ%L<1zxX6 z;%{?Zu&I0`nxmOauW~=sti}7eUtkNE4g3iDv_6>J=J^Zl$?j#hBl|Il5aGzv)mhSO zS80nKVM0hu3E)Ln)T{%%Xw159k_VzYb$+Wl{;$fGt=@`>xPg*)uD@I@u>$4?6x9?` z^@3713y=0>;Ws#gdsX?bhA!Iao}Y-NU>2ewE^5}<7wF@XdJ}Us>4t4wh$jylu6f5c z@qgm2eKVmTW47xv_r@jFe9J$;ZYtjJc{Nq!(9(QWD@KhTfF`+~Guw2F@ozkJ+8x|$ z_HTG`$`_b&1D4u5Qe#4kq?IPj^lf@^8>R8*q`ulP`Xjz0=}~$bUzrxe-A;U;dX=pf z!kKAkfA(C2!jA`*;bYyu~Gk$OP!k?Dr5*02LpIm=YU&k#$k`3;~KDo zD>+F0LuFIDoj0M9kV&%7t$vi=lg$txg||X)p{e#nn_Tg!r~`b3K1VMAyl9y@npxR$ z5%tCuLz~%u*#_%>$Xr=5GLbyZbfTWp-MsyL3oy59X7vPMap~dhA|zY$$QGj!8G!&*+xLt`?JQhAz zn;^NRSxD(^U4*A_7wDp}0C1Gq$SGMrnNE8J{RZpp%4K>wPgh<+{zr8rA4^UH*7Y7U z$6Zct7k1lNW`)U@Aod+Fjj6{nR`NakNq`moN{Tj9qhEQ^%hBQS^Md|vwM^oSdn3xP z9tKFxzihS6riwg8`?{V;g6#+RFCO5`R$)a9(iU zt35|;1ElCgM=L;$Mp54}uU#dI7MfmKJ@SjRC+}hmT#I_D-h;k$%qM@YIY@SCNcOeD zpLl;y=)sRt#o+yQP~D>Xqgv9J%<{nbIp5xo{70>kAIA>R7eIr>E2J|r0R26xMp~>s z4FU%#Gzk<{6BQf}gC$8+x^eH?Mfdr|!joG(2js;#NQVz9w@7DqC#$l!`q z$ROYl+h2Xg^RsXYFt4ov_4>HF0~eLG%rMY5%~a$~YUA~zUPIevQnZ;G{mP3b2K^Kx zkJ?jOD;^PDSN26wubvteLIIZ3ImyheosDgFt*DF9&36fS6^1CT`u@?i&|mfCXk*-| zPQUu6*7ytR(< zfE^XVPyBk-j>K{;tzKYA^cDriU=ysJ0Vx^~CIEhrGjsMzp>B0sVrHBNKd5@liQu!4 z2;CsPE-Fz=;2_m_RF}{fKP>F2d*;{|+rA1l<~yhBzHvu8W#}D43*(|}OI9H5E?_zD zB{6|{jjK^dVs9|*zLLJflbJL)y*+oZE|VFKtO?{LMi`9sPffz(Q#k=^-w0 zCDj$k9;OB##$V^AA?^7a-VcHAh-p5mZUS29Ihk2sa+L0qd6dXZJyicvn2_B}iZ)ZD z6SA3_l{MkzLo1JqM-^U*`5-E`*GV4)&o`d}ROi!zwdNsM4|0xcruMQ^t~(4(t-i#K zu%6LwcSqv|?wzXnc!NrV_OwgT9YU4%uublH2HltaT^A!;tcr1@I#G1Ba|sFA;=|G; z-4#8dSJH(oQbM|kcFVd1k1Ks@URX1Z4`Qn9N7yT>X|6TUY}kWO)ul1GzL&5HFr9Ds z^Sa&M&cY7jlkPICwY}60Y-s7Zl~CcoVmK&#)cW*)0aCQ9pGEV$*RgE4QOH3xXta8* zh*5Z`L6j#V8-9vtH8!%n;siOXdXdDSKcxFb^}SB!>PF3H!`RXF6a56(lB&^@?s-I} zwoi6!*0K~)TKlFZeOber#;Nuji9IsU`ue6GY52|;Y7|++R65IK$Sv%J(_H=i57~L_ zCs&w5EFO%OU|_D!#&f$|KSpm*PC)NyHlYK_4Yo|CoLy;o2^VVt@0t~!+>ss#PGDZ7 z#MEQnn6}NNXfrkXl^3=vqANKYHUDb1up(=aYimJSRWGDOx4?D@+s+?{&obNiw`c@y;6pG>_CIta)In3} z7-(6G>~r>0cXs3`2+hy7wiZ#XIHpomBx)0y9;XF6=2GV)azTaGHZFduc(id2@t86g z1@;^^7i6CZF0)}V6~!hbenY{;7emJSAn(74LSu>Hm~W*%n7F9U(;Te7q5Ts0Nw=A? z)%(=nLmO=O)%(`OL;nNxYOU;qbc*VOeXsPYtyS=>(5vcVbt}N6TFf4o%UMk3t)K4O zq~6ll4t?R8tdEB5IdoRKk2jTV3{Kg+-nPD#cAGIYYmNWA%tuZ4y%W-E`4Xm7Cl>}I zztA%Qy?T^vYx9szj_tHU(Wp$KG>Yk#ZH@(+B~cfEJ&%F9YX>uXC@);7K8}n)1K2O7 zcE&CGD``)(oxJtFNYy!0Gb!3kjeg}tGm6@_9#dfmDG5`@%#G?+^?TWyN{ywcE-~Ut ze4u6?bKYT*+@dE3jg?=ADx$w7))L)oJ@`U?Hl*U(v5U!IeurbO?WxXT-l&*}31lx1iqY!?00It{tg7~2>NV~sw8hl7k;iNlR0iOI%K{;I%Dez$K+ z0K=!~yEWt+Ml?nzE!$cjwR}G z=Cd_h=<7(m=!kuS{~k8ZHdh$ys@2v@Iw)4=y0Z#>qU-tFcA) zmG!HW<4yU3*Ny7?dqw)$>;}VLzK}H9hf2Z#HG4_i9T`X$D~>x}6u*_efqU6*$6Zw3 zL`sE+<}ylw4soRc-gQt$Pybuusi7&s3YgR?wJoEW6m6zPZ5f}%LxD+VNLWp7 zxA-sTdDLzbxF+_YLxxSVh=7Zw7C)ga$E<``c^mjrP61QO2Ihal(NbLZoog*VAAt?q z&=SIqSHZOjvDefx$$fDRFv;Xb?gUnuYDr&O#o^Q&bt+0xSHP=z zAGl=J1E-7ttTHqC5>F!2)zbkuUn1~H)ED7Ac|=I$uXrb{`<2agKjmh5I|7r75*mt? z=uf(43s>RAo;JcrpNcup_3^lQ(i=kiIFufa_61vvrJR`RPHX}u96nAJdjXf~&f~>! zJ@KFBKOvi!#qGvx;PGiW#_9yta7}DUkfSz&&0KBTlF{DKs2ztj$zR$I>IWuvO@By- zB&k4O#U$gOSbu$pVmn*qiPPBeC)8qM0KQy5Ecm8UM?BHh5KdQrVA^S=4PdvKWx&Du z47hNL+-I2wZB1cLO~yiGI`?08vq`4eD)ZGRqllazH5_ygK8(KD zdPeBdmisk*6z^Tv>}PBbVN!7oe&poTzpHx6E~5W~1_NJ;QHxSRjw{?kl?jPu@1uqA zEn<`+4ZnbNgmd+^mWQe-)FG-HCshO?e%F3cg}9?=clq;tD5_t~LXq8h5}0ZlM)O_WY4j%TY+z#ff)8d9YKAky{l+t2 zSf}6TSej7I`uMTPdtj1j(oOCyUs35b?lG1h_%GrspIr-bwh~v%z0doUee|RUq(_!uapLD&%|Ds(#Gim ziI3Bt3+q!(msR73lBa7g>ndv~tHXOzC)Q2mu3#$NM*Jb&10JC{tocLt!gZ4wPv@#e zVQ1O-d`G%SfVpenx2C`SGJl4?%^%OWg!kZfWxAC?>7*lzpOoEfl4-WeeD%qkZIRcq zPw1q=`C-4e{8%{DmL)5a6*_jvXFC$i|A_vf#4N;oZ~u*6?|5%6bDpseRLvA^qOxqj zFiCcH?bObM&9x9VEN-`IuhpXL#>}R6)QzPoE%WX7&5(0${^-cNAzRDM5r-;9mbMC? z95tqDbWMtQMtE?vE_h~ajAfm30QCTB>*yvAK)E$$`V3{1mat$3$y{X@JFXjK`q;=2 z;&)qjO%^s&cGoooU!PPbxkglDVdw|gT{FZQ#$5)E<#k|(Za37y`5W-rG{%KcPvhUL z{hPGM?5o)ne4_>?m&oT!JK2WXI-%201%D=1pw>AK)ZR|+tScz4BaHmFK)NBbelYb0 z`>mV$IYa$Qb%Ket z{6QCy=V~&f#j2Cazg54ZV*6vKMH!}k?KIF`^~=>yHD`cj@^$(u!&CLlj7R$HG%LOe z4b5sc$uwJKLbHO_{1W_D`eijFO;ntcFHu@-4@%zAJ?&+5pZHSM7`xA$XB_}*6_M}? zbT#m?T-6Sejbx{)hco}GTOog#lc`bAD`GS`8lSKDS!KfyIERIQ$KG>F*vU0MrG|=; z{T%*G@{@FX{0Mj#)KxXwHpRRc$|)7YpXguc7LG--gEiM(q{K^2aaGXg+08<=V}xe2 zv!`Y@vxVtH$|FX3L;Mf%b=)IOCFsL+dphya+ECuBZzc3_%mticA7`-pb@e_D2W?$G zAyyu5dr@~>`9DQFYL{y_xjW9H+@RTMAE)X9cUBv)Soue|$k_z_&iKJ|Sd@cGekga^ zqXhxo;i-i;stW_DmB<}UhXG#OP4O6%t;81tGdsyOp_b~R6?n=}zYMlPXv6@%H z^Wj)t0!%vXkada;L4&Ym8k^=v$`4FCF*T2ozv!jZ+u~8cg>x0`4WB3b3p1VV*mkCG zi5b2IQ$+pvjCAIquM=>|d^O25TV=lbWM+uW@gs{Bk=l4u++X6%n!Sp}wm%(%$Qibd z@;jETGOVN)S)=+*aZCFx@&ew8??L9VMbgVmI+YOrN^D>{Vzq`#R2#f6vOx(JisWzW zuJPk4-Ru$73*;MHcX^!bPlY==U3?7sO>qc#?5lvOCRdiJSZaIhAnKCH?`Ru?*B!Np zm@TB)BJfAvBp|e zovoe!J8ZeHl0=1Veo^H{a#5{Gxk=rcUg=t2y&fKpbVbYRYUHhf6X!CLOt`cnMK!8r zI{;_R+{zhRo%4fU)zCiSjXx8=Yv`R_l(j330Iru^Ms>rbrXjq?I485CKeO8M zIfH7C6wqs#EKuHY9MH~0z36oIA6GFsw{kjsnHov`T)PbT<;Qt` zu6^W6w0}e9@l#Cu@MvF#X_;G^*4ukunA7$@;FDRO+iaEj>XVVj9F7{8|E>fFP8ofx z1~f!n?P^lWxHHO+5O40oixQJB-CM#75aVZaVxVLZ0 zrg}IvLbIek#xEtu5r6tE3B!HG+Ed0X^>CG6+y^>l-=q2{i7G3kf=G!xp>`Sa&{l3G zl#`k5{I6h&^^l>cf1Ngdv!^pRN4*8p5PtyY%M$R*43=jaaP4#2=t~o7-An6J-Te}O z6?PiKz%O|VI^XS}^MFa_k+(gt%ABpAtXjzNtV@f)Nr;SGMRtIuB3H1^z(q7gu?zTc zIv7QU{}d7EAnyd77kSAK#OG)ulgk2=4gHx(z$fF)K9V&ftxvkp*drD4tZVq9dv1K1 zndse{_A~4-Skhj(KVzr0>3;BUWAlu|v_%QgI>f2Pw+Q|9kKtf)0JoQZBU4Ke?4zqa zyRLe_XPs|Q;EHw~FO85ou6uGaPjF8>oipd+ZBr`!cbuQHnoTmzR++Cpnb3+=B@Hc$ zM5lt^hwT-OcXpNn(~BcGl(x30np4pq^*MiLI%uWzb=_5{&~ZWfxqKJe#17H^#dm;O z;PuR2^%|{)T1&PUSK7k)1Ih?-KW3G3Hn}E#rEPIlnjLcJZ4nWAaeGCj0@!6LVpczk z=_tLPKR!xZ+o?K)OQwIbO=b^6-CU!9Pv)^^Jyzgahd<&6Yp>F~_%Hh3y=}eM3@UXe z;y+6*dM)r;=w`g&uTSjZorsMzeni5kO+FiX$Qz^8!~5N*;s4+daBlH5#U-+u9A1?s zpQ0Lp+;UbZzH_!Oktli+TC7Zxqw7dNx3*xqGbz9&6RBO-uvTB-i@*nIKWC}4mZa`# z)3vFe!QC*vsS8tYn3ZwcdopEbpxkrcsJAbKnyl|DO8D;bE9AF6y{nF%PIt1V)#V{4 zfnDcM*Gu}Hb8fK<5X~vbZuOhhOKVy)6R2`$oMsC83fgI!0!FZ@rhISTHX*)xVP@NA zlT5Q!=BrQUV)&1%2FKqI?;tU>ZZDFXlO!u*n=Fd*&$gnfN0o=99jQw;m*iy2{m4D# zskK>k*WgYX1shwH=&F;>Y}v#63$_I>5?0%XaIfhsX05i+aorn?|0S64T1hNdP&?f= zNts!vim`K~7GWOHlE7<=4~#rKxBF(~kf%xL2h zZXTG)Phoo)2L~L&+JtS!{}5Jt-Pp0|sAo^g#>Q4DdjoTT-KBTk3OL)3DK^({M*2Ex z>;FY8N{*DMF=`<6Gue^)OGzs}0VhtLc%uDL-N@QH#VpmINHj^ubYb?{k2=CPob^n{ zp!HqRW8TBWZ_>FrqL| zus_1dY(2fyp(1yaTgb+^zVHUe4q1w0H2FZC-g-4U2P#w=2nYGj*+y$XNX-wxhodpI zGpsdCO|ugJdP00Fv74r5lT5Q!=BrNzD;^PbIS7iwh4R6C%Qk>_AM_%?|~hea@)N4yO=&&(ju{LzH~rE$I6aYPhBOlJSM|pQ?DirdQB4AUlFg)c zfv$;i&^eLGO!0i+mwFbmR?lkC39(Ff$Cc~u=$Zh!8XCR13ORd7=)$)L4)2?udGSA@ zZS`l_+rr<99v(2~@rAgau$V_Gtn$M2cy1-FMb~N0Qk^*~=*u_{nlcjOr&XWBhk&H8 z5;;cz-d$+Lv5MdD(VBT_V~qdly@u}g%7p$XOl-|`nm%NVGxWe)>Rv!!P*Ko&;&Ck5If19DyYHJjE$)h{V858T3qpE_21E-W9wpvfi4TJlalUN zqU1(uyM3ro&2I&r6PfmV9Kt&IE}#qI5LYOwLZ=BE-JlNwmxjL*{?#vZCaT_%8-=^x z;ck*x?s}6@=3Xjt{Aji+k| zVZRxdq@QtrPF`GY!Y3yGqqE}o<^S5Bc#h~~xCu0DRBGGd9qFrzN1D#)BW*4-mOVnx zf*+wNpp)Y!NVr8@Ht5WlFU{e9XN-KOjBl_qp(t~p@>SXvd$2GoySZtixpm@e-^4}G zG;yqzDt}h1uE8gQ5OPw~+^7WSq1H`~geq_K-=HJojTjq z18yl<&hQQ?oQ-!fU&e-rHrc%3Bo(Dzv5~-zA4#d~2VJv++lB57`nlxS!Vplwbg_7B z%(``wic8|3qNj@Tm&-q~uc|KnA*kL&{*Xq{kR*t$FVk^hxc+p?=~ z)qb(|i(g+js^Ep?Tl=u64Wg>5&SAF@4so$wdjYw*^$<&F%0S&kWFc{fnT_R=>l_}_ zY}2T8Dd>V&p9&k7>z7h+LQ~pdcfV8!oT*o(bcv!AKa<0$?(V3HHu<;t>asP8NN5)I z$$r${$r5Q^A-Ba0lO0nVKr2Utt#kZ5BtPZ|x9O;M~+6snSK-K&aSGO#}wB@csp+t*WftVM9Ntv!4I zxeodoej%b|2YEeS!41a2q8r6>@8kC-bmd(7-zW->N*F^fu1ez1*hBe~fHx(X%hHmv zxuRjRPvR!HwXziSS%g>DE0*o6G zfKObL(So%3`h%{CuT2xptrK7SCXUAq0G$)5VIM%}gh~93buiR#b$3c*he@w&R_Ord zkYbDGTY8E#6CMixqnMb)Bayz=#&oaT@Vo3UeuiJHX-ppCPf7~)Wx)#*wb-4wAYUi+ zq<4gN1pLzdw{*1hlp-k-j|Y7dijm6yvvl5ZO`MM(XUGr0)!1}-Qu?H zZQZlZYAtS1K{f%hbC=vDmj#H{Jz8hgR$HxmQCmly)v9$?tG_4T{QlvUzkIzE33=c1 zem-xhb-AOftr?oghni|_DaOtAFF`@&HI&r25#NocIUAdm?(;~{o36C_UXT-6chr-E z@RpUSErHA0bo*{lce~l<1uDHU1W-{0ra=-vff@_69Chti^8<|B7qa z%j|ueC-5q`MN%uBX8w(B7RSOtI2)U;03{1qB{@%d2&rZNt{DwV6XKSiu+A;XvM!ok zxodO%nQzj&xBjZ_*;3s0lI*U@%39%Hp7yUd!LCWoH(8|u^DFX>2iyr#9wv^1O<<$s z6K|TSo7^wmDeX#*bwv?FN>7U3gXO~BmPpTb_eWX+-NPqaXFEYJBU>!n;g{v?ra{#L z^ehhLhf5RT>O`nFF^CzLe4+eN<(CX*Qe(pF#8UWj<669qD7QR<`cqlE(cKi^)(54xMam)c7NThXY^kWUqK2+V}-ew|{IG?Gpd zdZ5S9#m!V~GqeiI72P(Ew|{SXCFlj6s_$XFS2NYU%X5!r3j13ACC8IO_u-b^pafCt z?ThsZru&vUd#8E>KW_O>=L%ZYSG@ez&aIXHkEss=gVUl~PkH^?i}YGgL-3Q3=fB`R zM`=F!C>9)>OzW;50ZzVnPIB&!R7D^c!uV(Y8v_zG{k)e?WPn_5PnAQ}R1l6wUzllnuL#_^L*`@ zW_pYNNLEmJEp4SACkN$)OB3PhM5s3b8_qZW$<%a0S%Z`0+~6G9>nnK48R*he$J!_UDqzAk^7W zq=nO*FOf0C73o**ok$&i)}01g4JpCc)MRIzHr;a5=xmPg%t>hqDs^85-Xkkg&qJT% z`hZR1^!sE<@C2V&R11sY<_3z>j!y#h3rA9<;1e|1zKC08`y(*t%d3&=lH~E6u%@VNL&Gi%Mf|J>9mN$W+bC+)k6auY-H(ue8JM zt3+;*&A!7q-nI!p;+=>uz#ri;Ca|pv&jj_2zX>M(dDDl6T9Hgx2zne`F^4tB*~_ZM zzm{&0ysSyf$yHAzp`6{m&-I_^|J*0?!=;IEbt2T8AQHsokzg<8PhN3sMsf#dPxb-U zM?9mv13s~4dG!U@YkNzsLfEb}c|cH1$h4cG>ye$X^_=1IM?A4)XY03;E8uo;Zc0%L zVR^5vSJX9ZYwm)6(fk0#WcbnTVOLOpXy$h7WQokOA_)$nNTabhhfgYc$PBi)nrtysJBhvQwr@hiiPz^XalQ zNAtb3^T8kG_jMCpiv@3Jl%&BKN|7nWuNJKpedq9k?=GWklp~$gNbJyKp_{XaebRK? zgjZrxugE7Usu{+^Tw`oiR_oSVbVpV1ZDQ>ERwk;EfgVKeKf$>HxPpCyT=pIn877zYMc2sZfNlE8h;fv0GS#Z4N0GJY*en z`P;sMD|E?iK283X^Od{MSe3o8v~`MlQ0r<9SMYbsW$0M-cF6?6ESXU-iake19vpPP|vZ-u`{j@&YSvit;2!~(vNFK zsI$Ol&yhY3Rh(%Gf&q}$KH^{o!(YS|qKo~D_W!ld6cy`~ihC%LSjDFp5dX1@ zZO5S?7ZK!I=bNU&8A4Fy*c>A~E+0jp)(g^0l4kpHbCP6P#&~3b3enBMl!1E`giOi~ zmnOp1iAmXPaB3&u?2M1E=+CvXYdD$sx3Vpb$K0pMN?V~kiqRdk+?Ob;6ekcLwgFB> z*|K?{v_75q!97EgfNro3RP=?9sh5a{VdoWy#HfB@u*yz3{bVwo&gm+jN{r{WaDE3R zdR=@AsM06##I80_y6-F5C%xc2McIk1phdq5H0eFAuY6tUNxs|EO<%kFd&N~yjj!>h zQZ=CE{=qjHI_|s#n(n0UA3E88(6&al9Q)oq%o|}z^^K=5`OQuP+1EFg&hp(n>(G|*d=$De0pmYy=)2QL1C~T{&Qa?@m0^6&3?hL2{ zvX$um>~C{=gJ%3ptfR6>bON4*{h)oLUr8mWR4Rr617({cT4fTQCb>SnJObNpjKosV z<5-zxG}MA_Ri>KKFdsl$gz0RARGtZTp zHA%$ub^|T?P>KHktMs5pU&QE{7#sg}4aBr0KS{h|?koKT#>r|E&jg<9i(d*wc77tm zas^L;e-(h9ySf@pf_%!6)KOq#MA&|)A~!f0Pm_Bwt#}=d+V?QN6!izqdzHPI?oJCqe-^RVcxtKRo=Kjcywm8r zf^(8)(Est!v%s3dT(VAm85T(1K+v7 zy}#irTJ=Q3T+ftSgST& z1uggUpy@8AW>DS9Ph^{>1KK8%sh(N~U=7kcw&`9uUaWpW4^VBSmk@7JrrBp(K=-Iu z(d)ns^SPe1nEZ|_BP8YavTGaXZm^W?jhJ5B9+jLJ$I6cDZ)l0{fnTzA#~V!7K$ZR~ zA4)vLUJd$1*YPp90W{+`kxz7_rX4$x`n}?3?Q}F&KEk^M|63cNt(uwiEc;`1o@GhN z0cyNu3z=rCvfZX~j3t)s_F=3c*6SU&*DkX{+S`=$nZVz;O(GP|pm?&-ejdMZh31NF|MJX@jLr&Qj2#zvE2;J^Fb$f?Rd>ADRc$Yj=K2-xj840Xjfm z<%Tp>#1s1g={$Q9?8l#gHB_8?7@2L(kut>|;V0oV%S!n>BvP^&_c~(vknsr8-*tpg zmArMQ+HaCi-HpIWJ&JFlyxBeFivz}-hTyTRxW=Zy7k~#tCHmj~SEUd2=%2GGPJLob ziGOvhUVJV**9Cu zxczy@z`oSiCenJsxr(fTRmK>5IdR6B*6j8S5&;gqpL;IrvhJ9_ z0{gZ3MC)VntV)x4%qvc9c8|5(R}Y6#*+^qDG0gqBbbx%cO%0Y;zeb#8y%-gUMPfp7 ziCIKn#|YL{;jj1?xX4=IfvLIfkJh0^DcR)0slse4ToB03sr9vF{^XkIz~HG=FX;G#8dYr&kNbxqy|S6wV0}EE%N_q%L-7{6!ALZ_jn+uZ=~`rj zDVdhrDy%C_4{O-`tGvnlg`xsuP87yl99zH?)I=N4Hy#Bo`YT`;YAI(mNTEw?nJV861xzxVZs|Bm? zOay!?pyQxn!tuiAhGg!KU`66O3-tuhwZByV%-=lu#A#v`1OiGg_->K|eF5aApW`(I32Cj>|UKmLSO`y|2i#}AM4_E0!J^CpXn-Z^q7QLR?6ZGg;x{fpVi~Ph2X*Ko?217nNok7?=HUfEr9nKq=>%+dx%H6KfTetkYeS-anT#)rG zbuS~r?<0Rrf95=Gid7h#UrU$c#k_dqLECD}20Lh0*`~7YK-U|;tDj?Ow#JG!*0#gd zd=+=UVz#w6u24oW2BOcQS0Xy=d&N6BlyzU0nAU~rgT2WMm*~S)`cRL4;f9a#>+4sS z{v3CW@giZ5tD^3CeGBnx^)=gk?k$c*nPrvH`%#X27xqw?=8R8E<@C1IX$MGdVUvVE zDfVrh8}prByLE8JS8Yp0hBOA+WPID&5j)z7s3Q4GTLqA_z6FW`pA;sEV%bZji+Pte z@)BopRx(#NoNv5bgA(1?uK_C`iJwWGw&&n4nq!d1$Ww1DalrlBwTAAPWeYyr+C6K3 zOH!uSVh&i8I*U;MxAnH3<7*+#>BsmAg%b63UmkkPe-l3n-8WuiyGhvCN}aL{u?+LX zi5r*}&KyXUkRe>c{Fc2>K9Z%94HU0Nh6&z_?#M>BRl4FeH@Bs#HQR8o*&fWR$o-Pu znmu!eBkOi+)XsM737nySt$dpHNj`vmExpM2!JLeBwr@tqaa713=m6XC`Vo-dX5pk8 zC4xjKl6%s~wVoB-+1y=pJgPP7BI~18gM|P8--ssP%}e$7#krR@4Dt4tLTM& z&ixUE(N^r4b*Hca>|YgP9>9YTl^_!-E>NTC9IC-zK(~7*kbgLO`(^Y+?^jvRp=f_m z&Y$j~Stq#HeI@y03mfwXgGOf~cvX_0%BoE^GL|Nk)v;OKncW$i@ma`ck~h?p>LCtP zatfX(8*cdyuM+mB`pD9t?xvfn>*!d8Pto2u2|K5NrH{zw#GROmeh6*{82M8$ndBjy zO+HQ9?x{c)Annfj8grpxf#D;@hCv z)!qG*XEM3l`;|9Ux>Y#B6XBcfor%Uvwum>WAY}|P&E8_4=>N~l5wqzy3gt7g&X}8? z#$>?*ln0bAGKOk`@*|pufM^yfB*^*fZ8=l2yQWgwxRh6zSwqW?X{PIMdy7)Wa)v2h zYww|Z(R%4R?h9QY%-f1gOBABvU#KkoJTvU8}4Tw zpMuRyrmPgxGbl5jpXWugV=FnCmrcFBSMvmg@A7UI+$?wpUR}+z#Gi@!J|Z?=v9U28 zkIs$U;~G)3!2ZHjY(M8LG|aNMIX06F&k=m5JIa~ls&OyXUPS*wAE@WZed;24P(H(( z;0mHD?*rvsu+pws%WCSWmk}#t+%b#G$45FgoQXIWb)~kcrnu9$ z6^mHnT35{iMn2KW{uaM%8D&)yH;je0ZL%g;0W}Yfap_D)$@kQ;RI}!1&Fqv9sv>PY zT86EmlU>hMD$nQG1bU5YjB=6Vcgq@5WBEW}cDwC3nOwTR;iV~xy|QUk(y8h)<4VS| zj^A-_8Tv*I0rlz%&OP{$WH1;uoCkfcdGFq+p=48E0 ztJ4K_U9{h)Y;2r?ax-SqH&V`0(!?>^Byl&m7`#7~P<=Tkg%|MOd0OV;iv1BP^G?pq zs$ZHsh9Py+1vl9?(Ym@X8w>e+Wmj0yyf#cIH@Ow@!7%o>XA(Eq5+m+r{j z37(jp&Oe?1CwR3Zx5PTX3Fcojo`!gW1HvJaSTkm^Q0D3qQUF)O`S@1j2>Vu!l0Qkb zNY(|^(Hyb>TY*oPPIXLGOp?A8?;tK)U&|layD1prB4iDEo9t$3a4vBv39iiuzps4A z^EZ`SPCz#s*Gm|p^-!GgJ-1D=-%P;k!Fk?G`w1}%YQ*}#=PScN&pdJv zwO?|Debn?8K5QCgcerMeR%-`tgG7dZF1`fyMApdPnCAnhxKLX|e4kz7~G8t|BFNmr*Qz z4?7Sg^tP@=yxB2d9*sl`U*R9^jQf>!w~n8O(jof-N%zbD{z+!uE(5W zaH2Ou+#=dy?Z%Y3K1enS1q72>?PQaJRan5=8DGL!;5Zt3)OI}v><`z+3`VP^#jjdFQ>MZ?{c!Lgg z;!cL=FVKz712x9C)E;xAZL)noZ!6=H-HVVUGB;xi;Yx`=nsB@OPwDnkOER znCC=fE0H4J(DXL+AbgTIS<}JaWM#=$<&4YSmOWI9B~auq&Apos*|%V6`p)h))nxo{ zM-X}m_mEYH#KcRY0{TxfgMC!|NpxRaR5hnzrf@No4b@n#TUAXLxZ9v4@cd?t5iDFe zH#x64@}YmpcTU80Br987<^!Lb`+@SCm03MuNKok<->x;sI0)0Yxr|F3cH?E1; z*Ku~jnob{(Z$#&uwZc?t0y0UYb=Cy3L|xJ7;4iY#{_F5R%5~{nd2w)Y+T!L7Y1xP_ zcq14g?vXaOxj`olCQ5$MMexhSzk4U!Px&761#mC#5|)Y4uz6+T{rY|^l##Nzk1?__ zy7FOV3#+WDS3^PBS-hQk>i!@bUi#W5qMlPf1^fBxh-==1=*FOd-fdKB+uiR2`%=%- zsP;PfI?yxN-v?nO^epYsfPr>kMP!|OsqZwho&3T1o_gnHRWM{-4Swx*wcmbb4qzV5h8s9h)Lp>AaZxsOC;L9mfM0FL50n^p_6Z2jQf z+%n^ByBMth4z^4YZ?*@FgP zg~RgyF8I4(7BRY_bdepjPyy2C54c)=P6O*Br7xsvFsd$~EH;Zx%WlbBVxRug%G!~;is@6l?>Tw#^-@2zZJEwOpGy4)6?~Mwwx2$e;TYE_j=_cM3`6;rqlTS9*pA!#|uE2G$ zfp}v-ir?k#=9nvM7{Az-C-sTEYyGJvSU#0In)i&mC>ih6kDI$u&OOznAo@hD0M7@{ zCrYwYrF*?Iat;N)$~w2v>@6-x@7(&o`_8T4RdGQnKfQ8W;ts)KMxn4fc;~w1E;XEi zUs2cLj#L>7mISc+O=fQ@mIzL?8(C{$$Sbq?$ju%%}RHr`eLv{Ylcot57TL6E9~<;qinM^gS=-` zDt!kH($upynD^YY%Qn%u*1p5kg-R+ZuDWgeyu(x*)>PcYb$rKI#r%Oirs-RR=&`Ww@lP?GJI45$9~&IEazS-4Ju5af)eW6K8{<=@s`GgTo96 zo-)?)UezC|m?0h4RAe6}y=Iy#zs_zn=4ai2`@05Y|3|g!Z(3&8VFmp=y9=C!&O$eM zg%vRP=9odup8R`Bt08W3A?K*)K+|qPoaZUDiRuHD!lUGCtoh!}=mDAw&LE;Zr*&*& zdTV3K)#f&hM)F%=Wpjo3qFx^CqnG)Y!aFjg$SvcIAXnNsI9PUw|4ksXl9TW}_F3)W z#JEj|8H2e$v&A)wHl}fZV9cm(ZyIe7gB7QB;`8u4(PKQ*>9M_QTPG5zR&BW}U%cfi zmFmjNL;`I;31g%H-btE~)gzH>LR-aoU3 zsC!|4(lO5zFzjh`S^1m{rkc4SF|P79FPA->`GwlU>C3sM>Q{eG-2pj+q_iYh*Jz1t zD^t#F)64dzR^*P&{Vz?b_iPiVA8YBfU2aVfi1f|8=PCVV=}3Eu!j)~Eifnd1m-Od3 zq*LY1oW)FkZ9C(Q(ZkJVQ#DtNSq)1K6`M`*4;yWUll5PLMJ$Z!uj=HOr8;AB5yhDp zXPu-ftFPinMuY7Qx+x#&Jfzm;F#039Q~1nUh+P9bI6`c^*yLl8VL$c z8`R^J$FWD^2G@FTH$^{es&Fg%QMm$pYdr`xpzTTp7N)=u4~EGwOo1UD43lA)0z*6) zCc`iVhQ1$RGNf3OSoO&l9sMitAv{roGVzSn!-;680TF+%i$tpQ;jeH>E*+WS>c9A)E0j)o-X%Fe(}1FfwYB zQ(0woOB1>?x-;3VX~YKNlKpvQzPJE?>*!)#>0Rg%)9jcPmaBm0P?{tD&pXk-0A<^k z5(~X5-xhJaWF`tJH>q0e)9f+GSKi&;$>dgHs&uwD!Z*Ux4tR1CecN_l{1f2GEuM*B zpP?E*D%xJQ!#WL*#vjNx%l<`@KriQpY#?$OJQvuD-b0so*KvpQ`+@!F>H1@U`HE6* zdtYmZDaLW803JM_O=-IV?sU>5R?93gy$7Zu)?7fRY8L zBYmaaz@iZfl}ipu&;LIKhIlYchG7Z}@nDz?!xR|e!7v$yDKNx?VKQ{btc-aXF+Or} z`MIbw5snRW+|{P*faZ$q_0+N&jy;GbxMl#_Q+c;4raSM_f1wxArP?|22kM}_2rwZ7 z+!1ec>~tT&Yurh$DCYwEh?+fsCSSN_*$WNloZm;BiLwCNjE&EY#G@PIUz+weB$uvi ziei@;PgRdfT0{PBS>*UYXe`G`yA88HS0#g|R-a=k&lu$z*97`!jahRn^@D15N*Pv< z7HPrmh-;fH#x)OqPaP$7rng|1HlG+}y=*D8-7u<&;!aI9S85lrzO7imaMg%w7guPR zzw=b){Sm)3-K^TlDTcbiN#YXVi(bG_3j1=n88gt0jW<$e(qpvJ#Iw|#tdbloyH58q z?faB2+MsS8)L)sL{@(q)X1(jZaj$AO;K_S%iS?6fB5Q|WpY=QLvW_bmeWPv}DmaY^ zLn^}*7~;V&8HOn^#Difn3{zl;2g76-roa#nhRLwp;%|D$yV-aGS`PtUlQe+4CAUc> zvBdSh(g<^HujQAmJ3xu^k$nwXgfPTlD1_~hO?6C{z7tQ9g559<;6>vk5g4}vytqha zp)gCVxr8)T=i}9|0EYSVn@X&wp=-t=k^@4X;Hc>ed%xr`Ahubg!!^qOI^ib&82-xe znR5^|j~wWcCe`CQ%WC=XMiIkG-F4S^|MSL?ovdT!Wz^^7&5}_Pmn{LT`z0se0K9mW zY{Xg63Go2uJ_zw-kwvaH$$M^`k%0G`U)qhX_2k<+CFDRhJ6goi!f0f^{G;`2;XXoQ zUq!x$#Zs5CIAfw>jN6V1TrIYnG3l@;o12T|M2mgc`XIl>18f$vY)!hsWP=aL!Hs&4 z(K%o6#vC9$HD^oeWdUnB2{T!O+B7~;V&8HOn^#Difn3{zl;2g76- zroa#nhRN^_&(Ge$dB!{w*~p7!^M?iG*>3&cuGDK?;5B81GB>PJ=W?`JK z)KMu#wX?`-^-uN}f=cxk(72c(mbtny1;j?-2ML>>4Bf}!`duy^B!)2O2lh(VNUkAn z4r4ltO8&^6Y;UyfF>ht;=ly3sZu!{A@Zip&&JNDMxNj*Pk%#9t9-_bWrKnn|H|R&= zEWIE|1WsAjl6%xeRB!HO6$dnC{_&rH8;N=NIOk>Znd=TQhd9@8hWifiB$McB+G|zX z)VzYE4~Cg$h3P)vwWH!W4MkPi&|>h3vqIDZRM=h;VqymSKS>3Yrr&}cvbU)^yMxf* zj>-78>~XoPaKGVuvX(#Difn3{zl;2g76-roa#nhRHBYfgv6YlVQVV6JrVMe*MbC zl+7rkAM1B-nK*)f$~W2G%PW8%^LwO4h;IZNbYq);(IrZx!QvoSzAk-n^WrpJFdNyB z))mbX)dYT#MF;;;UWZ5f&pE#leLzyFTA|iCNi+eOo><;VpRhIp5ND^^3Hv&JW)&Of zRQ%F7jN4$zZ^9#%`s&<8Dd~QysvhaSExNMi?8dQ-5C@iz35lE zk=$GG&6JPWI5jificd?ZMhDAYThGdFD0^c6kUh<9$V9~vVKNL;V2B69WEiHv5D$jQ@VlCW#x~0xp0;Tm^nz7hafyqo>y|7yHwgcxt?Umx`=x!S4kSAf53k=Z4p(IyyRN>zph`U zYn*#3^AH2z41qI8bci5%XN<@3*OqeAOvawt0sN_)<=k=5joNP9>bw_|?KQ7lhbLmlzqffHo4-!n*V-p? zdC~ysIdNmX4qkyD#oyQsgdx3`)NP$2H}Uv@_fC<_?B2QAIq_c5BWPuBi3%2T6-l(t zDMLMbYUf)kd`hD-%;f0(rlJ(5~yx724DKui2x(X0s9-5bYNe2A?O#wiQsn}Y&k<}MF1D6_ZxvvAFge7IH zj?}iq^vY8HVa5)@dvoM$VI$>a`VOflVP6aZdZ*)&|@uQ_1-L)_K2aU;&DGG5F0 z1V<7xw5aW=3b(H(uj;4ezR6j?<&51m^89=iFq0CVf<3R{(lr0;=wQ(hAA+_gJCiZQ(%Y(!(8)(z zY2DT4#+2Uz8VSg+de>M-$q&$*(J0Sln5*6`IM8$y&}5va6z&6|V+V09%ZAo=qr50~lCtl8n&!Qqc{t58KlCtqfF|$z$#)MxngYCg7;pY;JtT&iERRmEE8F+?njYK@3Mafz=s~ z`vGyuKb}tY8A!7;%RiRx>pN&m_WwgK$JWRqEW^CtyFd6k&^6%aVKPMeaL*;W-F*`{ zrB@Z-D}YPtb&{)qZ@Sgzag`C1fN%PhZ$8mRiCz1oeI<6{6m9?^(Xcr>8~CE#{^yH^&C!Rz=UmQ=-0)RhFXq!^7o&jM1>b|G(z%-rWDPP0 zxuhNe^&(GVw>`P)?vU4&1XZJx)FUaMGQys%IEwKTMfR7%D>%c_4fv!f@Go#*=@oOe z2`B5soh3X|&%`2zA^Gc?*!U-jmSl*z-nqi{8$LJjiTEY{951(>@M%2vJxpRv)8F0> zbT_(G@!pFD#;69kP=Ug`$~TvsCz^#_hU?Ucpcp8WPNRPUr?}@NcLg5clQsj_v^!l) zBldTq=LA#n4s z(Wl_Nc9dM8d*H229iu!O`!?%9jxJ}hrcw93ilfR*ouWiEWf@HRk@~r8sN%kQFc!o{ z$d?&5(7lu?%75X0(mm1(@^6Vo!A$8dGF%?EL_@x4*c=U8q9I>2Y>tL4(U311Hb-Of z;|fiACkjp!gw4^F5d|I7Vr*rSa!c9V4c9gl%yIa(udXfa(SP z7F|MYq}xQm7u7tq%2ao34blPFdEk>?rNqD}{X}*rXHc^mrf{NxZ7O!EO&4ps5l14| zMQsH(syhBf)Qy-&aog=BmK@^{>oC?b>-O5~9S=}TOY(s2Io@)cs(Usj>3u=+9asvD$TrJqEuHEUS5x!POo3raka$rbZK#c$JUY z+oPt}?u&?HB_}q=_cvt6DFiFHNrwMS8Tc;4Zu1K3a?@ksx57wz7+4i45+Qu1z7UIW z?9>^&`%_E#UFox#WjRqfJ5q)E$C?K1l=MYn;FG2eamT6oPJyE%IudC{qJ#^LOQ@4c zRHuAmw&7kq#Qn#bRu^Lku%5HRmT1Tq4V$Cu{%47Xe9^Eu8n#43zG&DSeFuEe;s5hR z!{+D-Ly4h~Z-~-BheRc!@sd>cMpLzO4^@iKb@qlAcIv6>(r^;kpi-({RU$Fjd$?bM zGyHF;AP3o})XQEFQ}1)^O8QCrE6> z;hDnWkliw&Rsn3zui*?bm0XO^aXnAW0=DO1{EDXl+>d%HyXxxcc4I2wf=(v=^wa?E z>&d@G^~7pvyX%T0Y*Lk z$W=^wgiLXcbeiRpFjDdkStjjhF=A4r!a#pDYwMpz)fEdWK`;9V2n8?Z@7l6uY%@tkBm_ZTEFuV~^ETlwb%Wgv#}oPCcQQ&OMkWA$N4xItXx=wW)- z@fg$%ci^=)m$#Sm2Hx3Y6UO^ikWYw?*a!MyV6C>VuTnD+)aD1a-VHD?V2h@74X7;> zwSz=%Pg--9GT@y9jR2j+RpbdLX;m3(;4{v0A_lmq>+ExF{dr~FuYr$x%=9%_6;(@m zFLa{lLwhRx9o?gHK+eq6o1;|cBv-X(sQWRpDp{+FUh*MPHx>R?VB+c7^8EWUy8b=wV-n(F@Y=6BYr}0 z7dWM7fp0pCFSSmvf8wna4mMbmN|R%m12@|?+)jMQ_?@wdtipE~bM05eK^O2jjod&q z{n#_bb5@K8{B)&9qZRv~Huu!c^h>n@AKY@Ub+2z~>iyu*w7IRI_?Y^qt;k>1nxV=H zsu{TVua--mr|w?F+oTt=#Z(k!aBK%Y>L{~?70>Mq?%Dp+ctRS9L?C@T3XQL%643va zVFR#}@;|6*_b#w__ee23^Q~r_vP5U~bx2FZ>Ns1nDszi+`Ccd^KX6#gOaEMZN&S`X zmTXX9x8|zy58nW#31e!M)Hb+Xc2fBY>j3{Ct`j|P(3)UTjpz!nM6-b<8uCTM=4jXw zt-_GRusIsGL_@x4*c`o*zqIgBUP564_!=@tSDGrUavO*Lux6oXGH^QE=xFv}q#PKZ z$uw9RLB7=Vg!=oURTsS#%9}Me>9NdMs6aJNSgH6OiRaD%<=PDE4zU^-rN^Cfc)0A5 z@CMHdY|}+}YDGm8;<(aywP8rYPmE`*EWV7rk2794Oc)0xbDtY77(3g4bZqr5wNGbi zfbogY??g=Gxmre!4Sc7q@K4aL79+kb0Zu@Hk@#S3Q+?OuIhxPG@9G_{cVsuDhd?c5s%g|xL zbeTwE54^XIgi{os2)q2WvoGGt1viCwzG#})V*e=MGgjKemT1Tq4V$B3OElz*hRxBi zB^vTY!{+EU;ESgH&le4wquY4BjG&4Go{V79C)_(wQuDH!CCa8CjQ$xoRI5h6(EZE1 z)bdV?H}6&N;wpmspiF44)+z0dVM-pm2Fdh%W9%iL>z=3BMQ!BD(fy+1z&ULb`knKI z?8-C5ro<@~>lq_~ks1elR6X-|(?mft>w#Uj=@{{&^@GVy!7M$nJ^K?|>GO5>@u9lG zP6n_+cLr|irt%Ae&Q@J;r|u-ZJ#DD189uE`!(WMuym#HHl4W$W-5{?tiY#qJdUS^C zO=MMal`DgztE(#C$(_PDm^`?CN9_jtYRf^}UR%BSdgC2vDl1lT+Vl+Ao(5;Uv6#0U z7i1lgPq5$1_?G%L-A4i^6dRa(I4^hmmsvk=w{Fqsi!>Ipv~>kAO5b1vvZ2kx3kY%L z*oGDv*ZjoXho8ZJ!gY(vnQJ)lNk#R8V#Ahb$QKQpqhU)lu`7pHl$gaFlSVG?qO{^tQFh$Uu(*<8x_iBp*?Ir=J_M57?mEt%kIv zqOaO|+fq64X#*s6+Mg7Ygtsv8$675)usMsSIUfplVbAL;>h`#Pt!^Q1aprTc**?ZE z+;G{jx^#X0i-c>8pX1!*HTHdAbHc`9o*|Y~7Kyr0I0o3B*L_E!oA@oiP_MICl(&Hq zdQRU$aD30U+JYT{E!sWH9PnC_G9QDr))&pO#8dAY`n3x05+%JmIz4%>BeO2gSp7K8SQNU163hoIT`vVa69%i z?X~h+`at$4`ImG>ZZL1=j;+~IJ8!o-vf?$BuF-9&>YLjxsBoEPn@Tp4wNJhp87RIZ zdoLO$uy7ifabi`%9Ozs25@v?5yXXY4L_@x4#Q)6Euq7JuMK7W_Fh|3dXvh~0o1+83 zsrlI4nu3~wusP}mdoSI%@8WxwHiEsEb=)M^b{TAf>7i7Cvy+_BfNE~TeU)3WXygyI zP;y+^9W23hlA<)~+)ETIw~2b*VFJr9vPgUcwcmZCK_Xvfp91!3 z%Gez@aAT){y_$#Y^cGgK1G7H#y`GwF1x&sQlM|E(O`FXS)Y{gvn?WXfp^JVX# zcKR1;i=Xs-K?|rtsEfac=O|qc_GXq-Yn083&%oZyZ>}1!N3-9TO>TCs275F!d^3qV zREzVtRF7nXp0L`fQguhOurQM}1=2K1x9! z(6h?k*zATB&bMH%<_sEMkqPa|gqLN)D>9)yneehqcts|(Clg+lnGE)1g#X)<2`|f( zgS{66^S|=qT4VBuU?Lix48<=sR2r`@A1@>r0(%H77kliDpes?PzCB!KFkci;z zwS7y-@Xlzx;v4y8=riXX1=xF${voiS|0?hKKH74eeDnw9s?7V^&*dLa?s+M z4Os_s7Uh67nY2trJ6f393$?1BrcZF6$G(>TBl{C<(G12aWHwL}gcL00V(}c=WLdjB zgP6*`EfvV$$ipi#p*@-KvP^hICbTCLUX}^3$b|M}!pkx}@;ekR$U9zeydbK#~{fyicjjdK~fIB{B{1V7eE?eI0I4Q=+i==0GN;>0Be6PCgY)`Tm0Q-Zf#xN#H6K+3#^+7 zx2ona6NH}52`|h1|B4LQlUX8J50+)ZD>9)yneejA)Vy^CjNDoIv+~2s zGK-lNRTp{hS)=%s;!dJAIMq{Zn1IKEMHrm)i+|#MuYS#;z*@~V3l4`V`GJB7z7kf&vhs0d(s9?O` zBJE9|RH?m7oCalNMotM(9_3IYC%WWGe`Jh`S{n}H8ju2=0&wv|n`+0WKF5GE?q}lTR$Qvl5>WXlX z{ex^I@}D@gBC~8`Xip}*EE8Ul3GK;*mu12$GNC=0@UqMnz=MPT$AjTznN!es-a8)3 z(It!(>7a{HWZ*ZpLjIG#o9u7z7LLSH?<#bGuc2j`$B+j~5|XhO zHs^{~LCsKyz*Iqo-0q(VN79?5Is0R zH9SVTklS4bYeR6Y=OWGXe-iRr4*4#4Kc-gtJGTx_dl2wzPkEzSf862?^iFjJztizs zuXwHMA04}Whg*0bl34soR1&CTiQ~gmNcHbs*++oO&VZ%0xmlmjNJa@_6vIHAi|FZ4{p zFRQ0$2e2n3{gjw@(Cz=N$h7Xs1eRq2D>AKnGJ$28z=}-k zo=jj_2G3oR*FQThFAh9gmt`<(C)*<1Q{KnQi_&$HL*jqA`GUjnd9VnxfJ?SyD=up} zdARo}(aW<8`={<9cc^|xyihY+UW#o-LM0Dn!Hm_a6!xJb6`LJnBwjRB+D%+dM)Jmz z_iEgA4{Yb_pqjaHx^@raQNe&%oF|9C-iwS$XsG?!JdV5xwqOR4=OqrW6&~Y>g*?dg z#2}ZWL6uzZ|1s&4VwNw_f7F|zi*vM1x@|}`hwDaAZxktx1?&~&S+dG05}AK_P$H-XKV zti&!&pEQ)YSL5~I^%6w4Dxn=Aho1-sqaSFu^#a6qE>$d{eBu;zH?JE%)X{$3zvQCw zu@#}Dd>s{~7PJis7PgOD()OWnk9~zq1AcC9Nh&?e9=rBEH%~m)$$4-((c8yYO;7*AdrPC9p zI`<_^1e-Jmt9~*R)qc&p)V6c{#gKxsU(G3Yjk5wQzD%p#4=A#S#Bpmsum)2_KNRLk z-Z(Qe*Qf^)!_zyEOVS$MazEIT$$FkMa?1=ov$=cAvh+yxJjg&h3E3w1hVv~@fTxYMW%I6Ca^3MSdnSnlL;)#1Xg5P_hbUg zGGFJ7?eJ4pY+h_$U|D7}e7O9wJ6ACKl8QmoEs%BrT#lCz z+mU)r4P?dBohMZy`H$R2`dcTiI$Bzf?-j)p73gvBw(gag2`gw|ys@`196QM*LhsuK z@`uKM=GBD^3E$0Y7q8$Wz=H^N^h1UtJm5k6Mve5f=azWRvT~aAx?O!eQt5e5C$2<2 z6uk`1;Z8U&c@tenxZjxxRkOX1*gSVf;87&fk@y(ZS@H`v3GC5qaNYHAbOK!hyo!Y$ zoRYKs9I41F#S-!oLs2W#1Mnrpb=lC6I^aR5h)~Jb>c7w$&(F*slm+K2yMd*|gX++v z`;JMvV+y%yYsNY~li7^rYhPGe#N*IfO|EWy+7%w7wGd*&r1?+TKompSuK&0?Xg4n6 z=K{~72O*Dh@y`O!;v61OCR)9TfIJaUCR)9TfIJaUCR)9TfIKlaCpquGY$Oi>&sKS& z6YwDR$3I!UyJAs%|5$1C6zaab-qf8vMERY;uuyUXtoqzV((qA|Jas4N9E?yp>~G~I zHrN)&=;1|jR`I}o1?nYwDjy6yit|Wc$$sV1Hdn0goTTJF^s8k-v?R*j?&JF5VKdsE zZ+AZ?5qJ<84!LwS{D55SSZ8VPi(%ifq3mp%4|oy5?ke>Ha4U0}W}j^=>~mExgS>O> zo3X*n7d+BE!wyrM9Pfciu@S@S(j48~F~F+8Tw^&8wOiDID|CKl+`zN2+Gog{#OKT> zsVH(2E>~SbdqVde&s2w%Bb3#37gf_SP)RXQWO=F+s)y-~iL7cv$`kHTaxMOASyD!m z9+(qY?-ZG(H`*)lwQ8K&o%)U*LR`Sq$XVP9Y>FzyRGXD+gPuqC$94do#T9f4*-pGv z8Ht|30?I_IHxZC00?Ncb;7tVNiB@GI+tun#1muauIc@VMWuMMHog0uRZikMJnzz~* zxve5BVr1!|${mI|RCl`CG?tRu?;00ajrFsjo#0K@}!B!;75)HNN5U;WQ6R$DOu@$sA9kecV(we?)KdgD$WQAbpJrsx#AIVqceVjEEH8tTG@oqKm`q9<r1#Ok z*U#6TNNcA8-b6}aaTnFiWSz@Eh|HYf8(>v*Muu8W$4OiV>Z@!VwIyUV>&N7vbDc~#36ys{jhffb>+6ur*%n=Q_@0Fpr|={+@5*kOs|-49g5m<8^&8G@`|^m{$OCFV7i zHZGv;*85^AnL}c@EqFb&!&7Ac0L6))(k;?xTa3bwY*d{@Qq*L`UTCz>_r)0hS zIrI&D16yL*E6J=IME+&FW$GlJVKFAmh_8s3M2#$d!_)JzgvIrn$oT5b3cYMY?J8$G zM+d*bQZHZO`xf2qN4RP-T$}HeHaQZP`r~v3m1)45c?b5whtL!td ze2pBK7n%4gf4szrB@-A^hs>)ES9HX>A;aMfP@TBUa1nSG?cjhi(dtbE5veH9;Q68%z^Hbg3+)X6HHveJJZ{jE{1nJlYre5lGboPnPrlwvc+0F$ED847OU zir5yJpZ*~DRdzU99J?{@ZOOpZ>aYnhc&v+A#7>sOkP}-=ioh;Lf!_wqhzH)$*3%7g zf4;weVk$5tcItiymPC6l++%NYGz>?cIB=}qod%Y{=PJ6eTRci)E4tK?=6%Ng?)lj@ znZ8da$t|vb?Gz;t2a{{4<*=rnkX4xPTVQ*Psz|ey!|)LDA@sHS6!sbY+ufc^_YcE< z&;_B7GN0(asP?8MdQE9I?N88*v?E#GY_7R)dKHk?d!|Mu&&3AfleJ}y#YvNZN%5Z~ zUfWSO$Qy~gaCzYg;Qvii;f~VjP#1C@vJ03N0cE1qn+V7gqW>uqt=>dHo(L!tt=>dH zo|v6$0E_WZ9@M%UpEo;KZIRm2tZH6lWC!3u7fA9;zO@IGiB@kSAWsC8iB@mo_5b9FfHKkQO$6kL zK6xn}X62mDJDnGhCnm|JTMFwJD>4lQ$PtMq=&E;(tsHy9h2U{)y+Ds|#eV}om383l zAd7zK7{Yc|UV*X@a(FTYV<#%NJ;gxYo0Kppmw!nK*j(R$^ zgaJ`ved1hVFBs+-+}KmMU01HTs$;PK;EA*ZZ?9d-j@C_Ka9~nQHnx~oJ9TmGs6Ik8 z;TLOV-4J63)5^HvA*bUPhW#8VCzsh899w}1vC-BKYUa-*9+N>pi#W|D1219>^PS$S zwGulsPH_*@LVV|%jyF_f&CBIB-_f_*1aDZ8HXS|fiP+c;k#6`?c$hfm{R^HgH%J_@ zG2~I(K5JL{6YwnF$O?EeU|BpcOtc1+iB@kSAWsC8iB@kSAWsC8iB@kSAWxjho7&;J zo}b6h3&;~?NWY5r_3h9*mfPqL2^E%K{i!u0)p}nW%|!Q}iX2T>Q!Q-rRhQ1@c<4IH zNzb$;;D=-)4!q;Bx5yW&`+R}%AIEZI2z{U~U-G3sH#)PTZN0Od)_jEz{syHZqS4}W z?W91o=oin6SI1O2d&Px8*GLjhv&C3XN``py3?k0vmoji;Z$pB;Yns6k1T=|_Eg{?@ zRUcqY*qS$63z7yje$tND9&Yr@?pY_OCt=5kkIHazrY*y?BDNadP-aoQu=F9LjEM$8 zkUC~Sczy@`N45l|+&K_emq@ZcLF?NLF%tG`B!v>!%VNDcd#onehe`;*;(cc0JS6Y+0UJufR( z&;Jd0@v|vEau``jZeX*h`92+Y(KE*No}S`;&JF?AyxkM-DpxPV`Y2wyuG)@xbuN>e zV6*JwyraPh)B(ps_g<2~`{QEpo`qO0c)oXa^^Rh`Wf0G(nw@HhB87I=VZ)78;&jlW5l@CdH5n-M3IDRYAr){qoFV zs97_YJj*YEt* z3Vo|bACTz-3Vo|bACTz-3Vm1L(FbJuF*!uuqii@22G3TR-WdBR-pyOq_FCB=yprfC z;psJ({9{3Hy~@>eB6NX}PE;G>pWe=Z9~Je6)5@grH4vRBCKB@Zuj*g!G#7XU9Jd z?dtBnSN(!(IcGQs&-vBCIYj* zHx5fL8xC<0Ep^{x8@V_-tCHddJ5=mP+ZSr4^&oUinppdR%Cx`5cd7W8Q1RSJ;dRP2 zisimX)U=`-#ojZoiANn;Jk2XIVwJH19fTfaiFA$b?GPO?uM!mgahwdNVPW{U#mNSLt$ZKwn(T) zMk<%!+f`3!1NN2YBlMEl!4560Aq(ol=+*K`&I3{fBK@C2-|Epj{wLE16#7<=J|NQv z6#7<=J|NTQ=1j~Tmvt-WR!%^s|6cexY!cAo?}%PYw@Hse2dSlkDP%VFiCQ0eUAo(j zs+@8@(B^H>FUkkfaj1pTfIX{a_J7GCQaQZEc22(8TrX<_y@Gj&6qxlF9ir%dK(jw> zeF+TsG{HU5kg%ZOM&ZulNwOmG7jZ=d@Zu%3Y>aFmnMMx-mVAoCV?V|^D%ZQ(P-7e# zWmm4JS4EUDrRW30K)S!LyZ4d9?OcdfGZUy;wg16Q=6{)DAl7%LPSF#|7`n{3FnBSw zs*RC}b-Z$lC5e`)){fApqJ`Eoj!TYg;KeV5`-@JBzCte{Dr^yTL#YvT<rlk1YFV@7D!RlVAKF!4d-)W&1%Kr-BxmK=wcx_04SMS^>*ZIa@! zFqc^*Nhfi*UU?X~3uQ|i<(1YOh!H+6|9^!Zc=Q38KA_OIdh`LAKA_OIdh`LA{%Y=* zyrlo_GX!LM@Y^OTl0GXO!GACN9qio~8tz;2fhIqZZi5_F%&_c12VfY1lS}b^q+EQI z$f#i8`P6<(E|&m#MN_z$kjByrX!UP^RWFANu^8(x$?DpA`x{HXp+M478If=?W_x$KnR5;cFG?JBp3AupeJpw83ZP6Fn9`;-3X zNgG_QhM2TjS*x-yG>4_-wTy2%Ml2u*Zmxx=`M&X*Hby<#9_wCd*y5anE^x-GU`Y+i;Zvg<6kjB^nox=@2cErser#g!v#>p-;%GzJh?shw zVOYyQ?UEeqy)-^^FqdDmFYd7|9s%AxbTxjXFjy{t zN)!QwzSW}-$n*h)zSW}-$n*h)zSW~Yk?99AeOd0-yb0Nvd70qZD$`3XOUZTiGyy;S zZ(%QK56MTvUD0DH(Bwr30)F1MUREX2B;Uaa5V7a5r3U*I8)3e{#^67@7vMYPh3>h| zp5zepqJ0)Nwf3-7thyIs5Effc8W$MLjgJa<#Ya@Es$=SY;SH^RAAccs^qLrj63Inq zNqM{{5_s`cH-9qy1}g9}NHdoWT}5wb+IR*wUD8(ied-U`L9iyi+j~~^NwtG`p~5T| zp)`6ba4~yxxcZeVkzT8+u?ExQT$kiWm^sjT=`?5e_~g*VL0v<3ix$;AGL9?#TD8deohqDJz;vfD3EHxqENJ>a-{S}WTB-*)f@iVbphS(I!*rq{j0QtJ?D7yR;H|GYhkdHtWnW0wMPou zYb1X_PvpD`zZjVI#_7TrMx?$=ZFrnHj^h6s^fr7{NXwe2wi_+qNqszQnyoOmCw$Src|0V`|Gd7fHx#kdJmHL=(36 zGKr*ARYKRh2E$^`?wN)D=4hL>T^ELZo4Fp`kGt!A(30+RWLa~|Ho5ec4O=#Zq-<79 z_Z4jDfNX7!kxo`WcZLDa{<6YkJX2pxI_)0k6!~#sy=brSy>)imwjq}-=M-HMoYIBL zg6M!uA5iF9J^Fx5A5iF9J^Fx5pV(nchco*8y!^a?On()z$DOtD;WOk7@gC6$+c{dz ztpH2-wCSp%3--Nahb_dlgnXo$XPKeeq_i1()RzWtC zILjS$f*&X&;9h=%pdK4%T&h@T+v+%7cf{Hde-(}vPv>6(+WkxG4C!FWSe?5%Hz3mo30KEo66}u+joT?$8V?DVQ-2{@ zB<6a^-X$?~CRwOC3|}M~aY{8(T_W`mOX!o>7yC*sh|8wOVV|9RB1yD@_!YaXYEQhA zJSXn6XKj?dYSI*Q8{Y5`J1)p?0=YQEl3O8&Muq5Skn24_n-Bp4~;y zByY>B6tgIYQ)W2oX~!&e-J)MPm%7~a1ot4+;d)Iw@J6JgbT0FqJi>E}-o!4W&F1ep zn=P2jvFEvr79KVit&H8mstr>)oQZcYcT9GKa0473SG;Yo?Y|-uxyf`NklNM?%bX0A z%Dk5FWU(x0O0&0-CAK`a%&^Tl%{I+>1U}-tBmEV%w_7Pql{AaHTWiGw%?_%4_`#wV z>$em-Lq#R#)frLks0x~I??xMC51F^dFR(!3L)-|hK5Ja2b>cl)KLJ`C_z_#Ps)y^4 zYl3PN)gOI~YUuTFog);vWsxQPYU*kykiImoBxnyaqU5UeqIIxU4RyE8l-*NwFn?YD zDe80WPw~w$FL*_~S8zFGWtYVq;j%+M(kbjOj&5uU*~HaZwo+$o&lOuTkd(jFmP{v3GEC1pfp-lF$;)DGG zGhM#GoM@k8T^U_QmPF5nFR-7i|De0A&rpe^zd~l=up;CWl}0?bofM6Bnw*c?$AjN) zX=Ws0%hV({qvvx5h+l*;BvQdEoVWw8u7)UuCm1bwC+j{EYR=95qXD?ya<$tT2y)E~hIJw@SQ;YuyKwecj`I*V6yg-_{e}Wr=qif*VV?Mb4*m&!i0WFBTkL zBGcFr^(v$;iB) z{S0n^7Q)fU0r?X2jcvAcPNbMxYU*z4FD;L|kg##}mNgyXkCvTHDCEO}YuF^gcQKPu zuWTb|Hn<$tMiD&-vwPbr%UlJliaSnz_VJrmVK(NFs0dNuyFI&nslF7&U3NYhLB)79 zvIX#UbQ9Q?e(R`k&6Fva(auSX)&@Hwn1Ad#W^MTvOPzrOc36t>BiO$xtjR6ABsEFr zn)j$@s_vt+T-$9&nNQxk=I;Lf_<7BFeRAqCw6eX;m#A&$8`2n>nvhkTJ*|0PYI@VM z#(DH_IN>w9munvQztT!IZ-DjDk2s3!UB&P%a^AZUss&57amGev8O$p7TC%9- z(hyk+yqFDU)y{92TqKc%JVoXYKFIUVQU4vd0sR|IoJM5@&S5N`<=BJpFp<*n=zf;rO-P3fa*ubBP3aev&)F(jE$Ki8Dsq< z>%xRdJGo|HY0wp>Ck$*n1Ft>^-dqYRW~la74}e|r6ibAyf7Pm*kz_*b`l87dXTfR) z+P0}pdE^>2!VzUSsvLmKo@wV=du3Wr_ zOYP5ZdWLTGZJ}1dFWkK9Rnd{SRN*FikP+G_=7YKupH+V_k1de(Z}~{$2}Pq6 zmUb4Oh|Q4R7Jdy0m`RQZ#Zk*HWg<0zdP>f+zC#FlH1{QXc7qOV-F-^F(D08(rl0I9 z$eNqD#?Q|)=lz*ABX0(Hn!zc^FP2jBEBo)^Wx}ZH7zr%>Pd;0gByUib*Hh>{dyT_G zXQ6+iZ{62a!#srDjvvR&Hi27&7kHN7ixtnguFkjQWVEgIEjlTBk!T{ivz!*|j8SH1 z#bToW?G~uzAkDiatfhw=WPaC%6?P;QA4_I^g@vJ;>^ zSS2C#tZdQ~?|dskA287|#_98J7RISPP$y#8nnJoiy%fKu9?pq0^{z*>Qk7}HNk4VX zfO<1#C`2x!UMHA>8Y&ha{UZ+0MP!jkrdJx8T=RPq`dH zA8MjGmv$siXxi*wu1{|GBkM&%A*bZB>ALc#G+nOEQVPjr}G=%QNK+tmMIEhCrk15}||84QrhgHtFiViO7h*RzuYD_|NLj#dqh2#eE|`p{l|Uli_#= zQw{sYxTaBVnxxEWaI4aN!K?{v9Tsx0n@hwi8;%Nk;FIZPyj_i1{%*QY9-ihBzQl2o z{7PM@d%`wo&okRxA)oZiauYk}yon8k(xqK1pBa*QD(C?b|Sz`A46c`+mc_jPPbb z%QH1BKiGJ7@e0aa@ zgXnkc{hFEZ+q$u~wX%6?EAh_rGmg6Zd8SccnE0kq-t!q&NnaThS}xX~{D8kw%gF z8~<4UB56XYt&wS7q~SMehzXj@mcL?I`7zZ7*|*rDgzw4a#skJDGCB0O>4|KL#cs_t z|6OFSm|k5UlN^0K;&n~Cn#YC~Xq&|Dnkb6nvZ2z zYg!e{m%rzS3znF&O~*wGEgdEG5-U#;e2lzp4Ofn~?t-7o`c?LjWT9eM>}o&?xk2tW z)Jn3KZFSt5l&f%to?}Ako*f$Uo@BJ%k9v~Pkk_+AkZ@n@PQmKYI}?P4f0f5_%SgH4+5#`kk|qW#)Q=)bk(OLdOz^go{BEI<3-xRCJuk zC#NA9lz^>bFWF8a^<*gjK=c#d;b?ozG>{70@|RJV>n`~hf}vUDLv|*}gBxAR-iP4M zz#R|8O!BOg6nXB`OVod_FeYccXA13ipRx^fD@0%81Br{lBe>bJ zOP*YIzIPcL=GqEwAwKpLll#~`KvuP zljn+Kd#biqewQvu+ONHpxLw>+n`N-75;OYfQ!+OxONnfUyv9%FYF}vwq#aTUbjj-W ziVj*L<^tXTme7jbC8j)_Pdz6tt5y(iB}t<8AQkgLUS0)~@=0tQNXkpLs9$Py)u>{vD7GiM)a7>ZR*$ju{nVx7)XUP%BpsbhZa~s#BYey8p4kCXPb%`OGY4xUs79|TBarS$ zb?pr7q-h0o(o{nYcC4!#2gTbKw<`$!Ho_m)rfqImdC;k->-8@kHMTX-HrPXz(GkX@ zAnz@8wPW1i`N}!L{iK9;SJNP~p?lycXQ6U5_a8OXy^c*G4yt&DzD?8WVf}FOj!wW_vV<7Zi3K1J&Vr|d zJa{zz1+F&CMU9p%Y@Vw!mWSoo2dYjZz0p+Bf%+wg0Zv9oQ)YS=i7TVv?M~8#F%e)v z;(P8EZL@7+&E{aPQ#xHef*Gq%uz#!nlyn%onG;BYfmC=iM_oH6_Mku)fk)nnu~yAD zh^cP$ZKj-lZ;Z0n$o_)g!{cN8LFLc~+R7f{wCn|Ts}+^JxAs%~gFZnq%N%%NbgF%J z^c-^;ImbF%Ud&q>|1s)0uYdifn15^Y%^6Wt=*#ui)dz}1C7TP=!`q-WmLx_htF{-= ze+Z5sKS`YGC0Z9k;U?q{V+#Ag(a2F$XZExWCC!#I3OClCV8EO22ux7S$ltwv6)jBa)RVy%PUWkH!AQ|7b7Gv}f{gO>(g!f^eXl zm7%yS`Cr=wxPV#0owT``-gJ%~r++i4lqw`F;aBt!Ji~Tfy3KjaInBAs@Kz#2Zz3_W zA8pa>0ydi+LaFE~#{e`Gd5ErqZ&*gAT~cR3*E1KPO*%E&bH10Ni;k5El8z{L7rVF zE|v9!=16WL$B-1&C}^2#D9D^&B_#Ti=w1<*)4hoYl#0Z@?yZuwAP*i(KdV2cPw*_& zfm4`7_ZFbD6BC__o#ErW~wfMOm!dKYYCAp z2ECAAwz)I~Ry$cmoUs-zgC9YS${3K2LdXf?I>SdG-=r8h>DqEwaI|d8nnM1@)n^kr z#9v6*jtJphaI@$hw39i()KS((ySL0Gq6^qTSX-rvo8|iC?e5=h>yIC0?wZeQzF{EG z2VX7%c@oJY^E=NhSuuPRtY!BDXX$#EOR8gF$0U#hM>``xDpWA#aZ63JBl}BdNxPfG z)EnD)`4}f?0APnKxYkA7!;h1zutTEHz9NL*WMdTgd3|O3L~U|vJKr(X2J&E4ic9|y z+#f7SR{6L1S9{;cANb8~sfO@gy zmUT2YyWt(8^APlxXoY*E@v-Hz>Th{>0waoH6o{J+{f27Hiucyeh*0^fd zU&N{_YYy7XV-#usRGC?X#Qx^fBXQ0?kM1pSj%IIFCRKcsBp$dYd z46tG>xuuj>-xD5V4U^8mKFQLcE=(ua6{d&l8M=j1`&YsFO`(BibY!HtKf6DctTJVYH>#7_m0aqy&R-78P%HsCZzl(ZH8t* zdV8V3S)l_-lol@rsdQ(#hkolG=E*_{``_p_l^w4n^u$U;>WRl!HofyDIv!?oV1u; z!9%DLY$zSW43p)4MEtCK^ zc-6uB%vy+r=l?gwA z7{UGO9`3cubhm;d3~OcYJg9q~x}V2N{ESbdUQlDOuIhG-f;dXwql4fkTLe?=IxC9> z-bf$N`u`@PPI?g1fm8~cZdgaxm5__Mhpy%LQMN0QM!bfO<0aywf5}xJ% z*?~>en^)isKRWF@F~ohc2jWs#HZ_Wt~F~M{bT9m~cZmPvPQ*W2am?cPYq&ss4WK z2Q}Z9r~9niif$7o;m5p#d_U^G@hj0I>;@C8;~~Cd;VC{FgahoP`WDi zkojy$uDLZ2+O4g5@NXcnEQq-ya7ucXuM#!XWgF*JJgF;31}O%xRk9(Lmf9@|SHwpe zzX5j(#`&Z(L)aQ8XqaYx<7IFMu2<6$-)8;Qrd_!T{XS{W4uK>XNQFH+YzAFXGw6)w@+^Yg z(KiIYfiCAt@;bW#v^ozXSrq77LdS{m_bU3ZMbCSBhzAojcy#mxb$2`;?aQu(BD~GaOHUNrOb_zVj&<(oCawFD zY!%KD8^y7l5pMQ;%XIa=X1{kao>9yNPk-_;+d@X8hmq-44LcI_U84xFGOkFKPXV3R ze#B{Mxw?hmCMk3^iQhtYFmTpMrOxQ8Z|#p4;u^USnXBq z$h0p?oi1K2gXCJo(jVVTZs8uf#Wn&z;J8KSd78T zZX=I)33eRlypCo~Zg54^U63&holDNspXD#lG;2!WF*$*zXrMLP+815c_7C2p_>yQh z?^@ZE@M_TI{MqrE`N#2)x~9~wev1ng6zE*mDf!rQ=Ng5OMPy#AoS6e8apUrOJs4>{BS{=M{BX@^qNkfiF!#c zfsKxG+Rg9oo5Qr_W-)yBJbTi))U(`p*?Y-#6FUf6oo~RBQy1=M(G5;VX0mDA3P*!` zpuL-WoAeG+Kpax6A=h9kHmkA`G)3>R6lje~-NVSWbeFoG(0-*{lx{ze5U)x@HsUv+ z8qj*}im9-CHKR_6JnfndTB#M#WxhV+W{M&CZqfmKggTAIWPGk1Uq^%gVQVpiH*jwf=JXkkeIZIlAwz%5)B4~|2#8=CunJzQa5RJMNJE0wk#}Rt= zYx!*OJ!J>`mFEfllG(2M2pO;?_)Me?I#7Tp-#XV&h4dTeET_gHt<%}RgHxc5@JH!( zPcLRa8bbaIpHja;_A>mWdCE}FLiKjG%G!rW*FH$EPJ5TSBk5-12RzLc%XUs1nt^6$ zk?2INEmwO%JyI#xE=kcNU!WqP%u9iWY7AJJ)w*S(wG~f~l^X zY&rfM9pSjI+~`{C?(bemPxmZyomY0nl*I4a`QRP>n{=5j+=1%*Vb%KL_CF=%{(n<6 z&>GFn`Cd4K_geZnY@2kF=#JnJlCnZ;BLod&kr`+=sa zDEcL6tzLAXsy51Blur2rDIc;y<4}!KMUz-Mtg2M~;Q)tlEwlYVU)_(5$JASM>)I zkFi%lSG2V$8fcAP&6SCs7QP23slQ8#q$BtjrT-{?LFXCzljocZtV;0#$7*4H-C+DH zC>A}hI22!l4x&OTv)D}(N$;;+3;#_PE1pLG4Vsc&;3J?lIRF`8ck(`3&H?NCPW>0j zRO52N55eQ3?fi=|ui`(3MI;m&c8b~{_brFPe#u07hGlUB=^N{l8eH7hs-svkqi3IZ z4|z|B`9v3|!}dU}b~b^g<-^*axQ=W)`lM$*vK1bSKZMt*7FRu^-BOg9XgfniQ`@O; z=`fp{ZmE1@SzTKo879d$)Z1gMdr+L*M-IT`VvJadA0@)@rmg;|!i5IIx>@{(Y&CaK&RTN_ z4<3unKs|&QbS)ntr(A6v!(4ml3*hT-N$oVa4zC0YsvCvzkN`R@4VGVxk4GHE8p#n$ z@0tN*F|WIDim{$2j(!$4A|^4|P`0OZeym2L$3qbZ^+E;thj`NjU78v>);Pg@+BXLM zhMCX=mfjk54F?U8+I)6640h8E-xB$*3CK0?8qYM}`^Lw%!`ygeUz|#lU$e*14|LZ@ zL1m86+I;2+6UEp$7Tl%&BAH}tP_X5;nyJw%ebL_2{4mG?TCeiN`|2Hu4nJTAcxe?G5U2P8nt?K`iPYCZJiBZrJ zPoxqVMCBr&(@A}D@_0qa4@?Pqp9!}OMkXNN$9!gPDHGVu$VS;N=W(#koej;deFQHS zct30+jzHKcp|s5L{Y>ADNCtLomz|H6x?_-I%nN07UsRQqFTtSHvj z&0pYc=91}b=ncdmS5cM8&3)|;m!~=7&6A~jp%+jEGmtFCHd-=}Ri;e3JM|stYc608 zfxf25`I{UxTbOaK_0nK^4s=OgW8D?Mz*ua3RA>;E8&4YVh4ixS;KUv!a@f)&7a%p* z4b3I3Pu<4z0UOv<=|9Nz%`5StXpRMmm$(T!>V8Ka3{YW0=7H*26p z>N%=m%ERKG#Pr&Wj`_}CRUC9NI?B3Rdcn2Rv(D3*{iyz1z1OF*odGki7vWVY?VC%Q z;1g#G_h-E3bsIqF(CTe95BaMEV1o$?{Jr@f1`WLE-1mgYhtM`1Pk)5)nv4= zO~?FU*^@KBG3?O);R{uj1nxC=@?A2V%c}S1>!YL(RNKLX==P@NEmJi!{Ty*VvQ>Us zsnd_uFL2MtN@x~r7Cn*5KsDk4tfp(ApTtDX7X{Z^UgJ>wxXwszXM&ssq&D%hF0&EF zB3&^|cQV~yzQxu;Wp8V-=en~(QWEo9Cq-MQMicX|A_=k^B1ha$!ZY}3;v_C131J>m z32~{@^1jF}(Qy7_d=RC#_mHh8!l?`Ky>0&pilCbb$MN%$SMc+qx%`**OZNGKnF&)1 z7nx#27i)$IuW&QW4@&GYJ^8Q7O2fxh4la?$W^7mxqidTJeHK*uugW!SXVq#jllmRh zt#MS-#fE8`<$fhvsN-l64Og?z?elEb6|w_-^O#}Ia`L*&fRwSb#Sn7Wd{y>a-4eW> zyFz}%zMYz2UTNJRza!6d+~Hp^UTeG7mKdq9bgQ|gc$_~(Y=LFkasvH@req^n8%#d|bUXzR$-JllISH)-WO3u_E3%`ePsXL$9 zgh^dPz_5C<8m>Qd?oKkT>`Vc1>k)ZO3D+4g?|Dinc>{Mpei#cp_zK? zeo3B1ILe9kAXmC=wEv8Y@TIXHcY#+*_w}}gYP=7~0UA5{Ou3UuP(1MdMnCozx-85a z&mCfeN0{)HEdnK%daUlhs*7TYmq-5rN-{0(Qc#s?@!rK**K3DRc?OwcX=d!8hf|6f zwTopn@FsKzVn-$7Qq5)fymubkksYo)>Fk=`Hff4}P~tK9LCsxCs#av=WSz`dDyvn^ zbcH*1xGY*mH_;$Ma`iUsN_?$$3ONo)@1NPO-ZMlb+JUxWCsbU_C)p>wiB>3$ptrM( zoeY{gD5&mirjM3g^8Lxo1x=hs;1u#rRi0;iMw9AqTX9yih{a;3KbVV5nswyiK(};X!6wxTMJ5G@&$+Om3Qjg;E;SJ?@EJYM#~{m0Hyicy8IrF%jbFvnleG2>N?yv$#qd352`Pu^`!cudmp@k z{gr}UH{Ap5SJ(rwcD71>UO5a4R)VUF`V+HPI3AQ_RPKCGmAS+IYJ2Nk8GIL<2MOqk zy)WqD7|=Y;dblH~;*5dL%BnOgwc}-rS-<<0cRyai+)r;wIh5RxSPPWkC+sifLFs!k zk7p401vK03k@R$(L5E?UR1Gpgb3yf%{zuJmE9>&uuAX9FQjpn({&m04FqI9 zLH|X?+doJ%1os_9Qj6p%a#FHFbPe=W77O-+o(fEC1qGLs_^C1Kka0D0;$}sRty>)4 zH>|krQ&5$8zkbU4<-xm5)fTa19{Gp48$F&}Y!7!`v+orTvvwprbr;Dh&?5=*y<_7X zp!I@R;9aDT6kRpp@?RA%9gAhF!@Nez^l5frNOu6GBC8p7&(svJPn9Wr1c*%ENZ8C7IT$%)@q%`8#=Cr9VXM0e3r#1f$^Rre)Axf@j;~j1wJ~ zKwb>ERI$pHCJ(R~?i>;mt$?@j0|w@7r#3DV7qk5q2i zSlc;jnz;=g4;P3Nq0hxZC8tE^LRLt`f`0^)89t*RM@0A~KRa$arq+dc_PhLSU&l&n z2mZ1ab)rI@vL)+i|Iq4CG%fNrnM?_DEAqZ9)C!Z0E#d@L>|sD@%P59 z@|M~y#9Aj8teHkr*P-8WACf7XgCNKf$CiK*z;*Bn<;ASPv;=YcDqRhN2ZV%Jl_K)eg%qN;qeMFic zSnb~dnlcD$lulMw6YHqs9xdBm=0!8eO>~1g(f)&R72BO?axZt^a{`k{Rf{BJ;c};H zLA8qELR=a(B@x?+$)JjH)M5iC%x8FJT}RPA=y%ItqQGXmvTz-h z7^iRVTV5${ToEt?=4U3S%}Dm@+tI_^9RocB0z*dDw5&e9{pcU;Di6p1Dj;o~rOHIr zj$69++IO07n30Z)zS*uEqJsLUkSlJeN~Avuhk&ZibNC@-1ihV$^o#hPWLn;Cbb}zB zT-7+-Gu-nsu*xD<-_m7h_JF;s3(Xs{<&AyXVTL{W54o)+nbxYzhulE?F?&q;Na=gP zQuYN;?cIzF-Uvi-Au(0zR3*t|j_qs+!BO9bH)vJp0L^=+Trkkpp4mrLfgboP;WVf- z(LuZio-SK}%!I*jj7@7?PgYoi2u!j{#uuTng9; z4Ll2s^e+$G^ZizjQ_?`8XRN(_;1^XII|4Lc7V2Mk(gSUjg2+p%16~1M<-h8!au06! zMjeTC(EDUu-QVuPzON8TCP}B#UmQE#HuqinPw%giW=SLRp5Im;poOklC+gc;zoP!G zI#Q94(k}&0?Vq??--b#BMVXcLe}Z1kqs)ByDIxPEsm zKp%Jq(B%z-&?&n4s-mQ+x~Sy8T-%k~yar!q*9uC3&6k&f%Km8?gXEgFs-7bE)l=2y zl~S!kahs1a_WUxm@wujz<*2~D6uW&8#3!GPUftX1dOm>-xIw{vUJ6V^@R>>9=J#(hW z{-*ZIo#Ho+$&MQigQ$J!G$|jdght6G#&i^DDpkhV;!d?!3m?ax3TX^3DSR6qR=JP6 zfxEG^KRu5qsELeUYx`NUQBuO&>ObT=;0Y%+@OzmJiB&aQOWi~KOU0K6js0z94^e{R z8}e20G-PGn3vq=b8Wdb|)xEGbv`X0n+)eCfOyX*OGfC3L0%(9{*9YGje1|zGX@1F!OKR zHF1@79r#0e6M4Gm^AYX2e?)w@@v84N8|PY&8~K}5A!rubF0ifMSic7Dhxailp>49+ z*nIF5>oM^i+{X2rYaBx;K#K*NEyD@W;gY>^bfGzf3EB@Pi;m({>@(SMdo)?-RPvgw zeFXZrspe0%W{b$Yp(crcuNtaY6So~LwrA7llrO2Cz76a!*H0;-DJ6+Vz4Nh-&0CuG zHGG@3JLA5=rwj4hv0vD;jbFUe4GQr8$k(j}UdtxkF`u|4V)J3_H}6A1S7fGgA=q9_ z)1fX1oyM$iO`;FTocu$A+meptsZA$?FW5RM;%epuUx7`6Y!k#JI&pS~{;Gax1EcB* znmAu&C+gX)(OW9AWi1PGZ)dGGoc>=)rnM?_IKgp9?^HarWO|UjcJIsp* zWDR+y-k>TYW_S)07Eq5X-zlzxe&S6d`A(y=E4*B_)6v#8(J?v_G2Mc@P_fP!nLsEI zje#<+E#(=O!(}>anDLi>10OURf(ECN2KCtds6y z*qIo@ny97fHqD!x`!wZb9nUHOO_}{vxTc(mZR9lksXJl_atQ1NaI_{;cN;ktSl!r8 za$J7XamiKbn2jI9zR`peckCY&Q&a)TXJZKcFV!C6n}4obWxks*8yB+ETs-u5V18dw z{;mEZU!L?)hc`{sZM6?*6qW;Zd<3&gsRnZ( ziM;OEF!dSr7Ia4KCsa!ryA1Cm`HUeql7IzX*CnhDtI$<`K+6q1e zuz3)}snz=*FdKcHSpiTd+B%iqhtLS`K!-$g1T9j1rPm;Ly(8(j-V?3`t{**&W3`8Y z-mq(B57E=uSVgF7l5(22gxUk7iFkG;P$w$9OYl9eAVQ}64Y^S}i~*Q|t_Ax;dlweV zda6U@N7V~?Ihqg9b?;4f2m2lJ8>32ZPVAu%OKgjL1aIWsDtShF7M?K}u17R1K`vyg zwLaZK!vJKQ9>#juziNJW)~l8>c^<2`qjQzIm?^^gsXhW}qfW%2dy#=?XA)(10h6OZ z4O9+lv!ux3R^yBt328vynl)k@10ZW3@{*K~W&SY%i2V>Rw=z zwEd-+WQiS21K9}dm9{N1(zBAif43VI(Gf~n z1SMuq)AQ9oBkQrbz~gwqE_G~S1rcwE=U^@-QMx|Egr%$YXWc~SXXT~jC3VSZl_px% zi7q+2gZ^B9z9>ITT{JJ`htjrX{fS!JXKN4qhVi-WYiYaMDDg*ol(_`zWT`EmOCGfg z1jm4+5NWf;cIN5iBZMPjo?H6!Hgj9n*VGKLk6Aa9dm(;&?49zes@qYEIQ+`Fp~phU zg?9z&#EBqjVO7WrriDJ}L`bRKMnn-&g10rH(f?sqK#K2cn1PrkjM)3cJLN zBx5SSQP{ABvT(RC$|Kvayu)2bIGN7j+oEsChFN@emuv@+CdNAM2*0-+hz+&GfM=ds zhm6qHOo{Q;9*SNN(+<6;^eF`JR+}5|WFE#%N?xOXqMZV-QCQt2u5`ND&_A^%1=h|| zt|SkGx1Zw-Gc#=IC(%&t9pze04m?k}6bnnqBL=Cf@Zah4G8%kN9~c+XNlqR4r+u?y z2@TO7=v7oUQ%~5)qfU>bopUvPQxVLUst?M0!aI~A=^at1?uD{8saDs3jRC#i)tY%( zu-=;`NN-7<+^$ucXjLaBw_Cvd7+)qWEsvI56pRoy!@Dfyyk1m>`HeG2?2sLi8iYi2rqea-VU}B#zt1G9+=B&Q#*!JpxE^LbBbA)2E4tlpmTQ8Sl)D z0CR6-Ar&JM+LCSIaF3ck|LqSt_i3G)7+_|QFyrd#dPr)~L)vv%HS?IXcow*4c}^R) z>v<@P8L7E$oE`2i$*^aA&TK=>Q``L80t@^ZzVF?il7~r$%Qm7*6fXNsS2(@L6UN+i zECbKyGLWBT99s){6{s8Ck@oNg_@KMe#V0w!a@jddgAPSU1iG_YPlRtFWmO#4)TsAm z{N?G^D9--A!Iw2VQRr*}*2I6(M5{W{lzR$7d7~v`1AWe)!+5>gs zmd54{cnwh^Xlxb4L@eTOFgUKmfI>#w5k*Tc@s=nw!{ss0P4iWl6q)6 z^QN{v9Rn-~q4}x2#@2v@;r~eu|EUdKpkC_R)MwEE=Bl%TPAAgA&VUzQXp+c_;ZL$x zu({%~{8aTD(OpXy+gSWTMK@@lc@F17v4P8t?GJX z0|KA0VKu04USz+DFL)}^ARs~Dm{!*oHhE^Eu|xreu*2A1zINVZ+XMeS^dvM**GYX@ z(@!zbH3j{b=87i+Y2rt>7^o8u*kbEy;%&?muC1f7PO6(D+^!(hA>fPa8MD@f@I4-N_hRZl*2rfIPb|cNG$3M?6V$0!?;u2k? zGGBJ0$r%tfdi+;B-IIPwwrR=q!iH%Ld$K3j%G*6L#2e7uR%xPDoj`#%@mKssaYwuu zT8e+DJS39B3~#5k5}rUvCH1v8i6_8nm?@b{Ob2_Lp=J$?h(Fc-P3B3s#5`H0WU#T^ zJ^**beu)hdoe<9Fe}%e-IO2C#?=|7kn5iaaJs*v~&z&DPAQrAs^1&&j?hBY!SPV>y zWZPlcX?Z)j!B6?dc?Sc<^gLvjc@dXn8+FjLLQ+Hw#evdf|6b9}#+R;_@#0@s=)vjq zTcb_27OkY#DaJd?$fydGnnfR=BPAA64=;g8`=9uDq8dD#>?*ob6BXZ9d|CGtTd88D zAL_z=y}b9?nThJ;Wl3$^ALUfNF)+tJJDpBmtWVeMVpoz|fj2SO0A;0QePy$?pItk= z|jhb z*l&O(FNz4_xY@#2>7>F9;H7_yu8PR9akE zh_rZf{WtZ`168#|c(tlM`Uri;vff1B0#PsXcqa;~`1dg&9|}&`^Pqlo6`0>qsJ!Yw z(I_|*uSd2?i*U@@s{&JuvU?=uwjlzq%tTIiD(OkQbJqR5bl&MUZHX^LTWWko*My~; z(u()SUrEkR{HWa`BdyyTJ2&=f*qHJlf{FP;noNuea$7Aj5?e`oGj)vJ8BcsF-~0505GSuEmP5R=uy)E=sxP}?W` zT1_3VBtgpi6g4j@8#Ed-iq|#v2lL5z9bXitnWSB*6QlEmxVsnsGr{pK@b&QT!|tIS z(DM;}!E%33+X{X?enD|mdDJq3jFnxIp|*FnYH~E!FIG!73pxtp6aoCYd8Q-Ze$%+y zzRpBg34Th|C39!q^q35u4U8q1CVO>1qCddr%Y4mo%{fg4=~?N4G#=AKI^1gx#54w{ z!|9XB$xG56Fk|JAd?q$mb0sja`TM3OpiVrO+!ys!D#877By!rx zgFjI-ZIPBF=&zc1NgFX`=^&h89ZfXF&!i7K2P+=O;|OV&iiQM^>K^LHG-fDo8Rn)A z(_XK?z16Yhe)j5SMegs}m01n{lO|f#iH6+Uz@m>8H1PfcD*f`(2H?dHl{W)3o(I(U zXyg%j6j<&_z;tg>2Vonn4ZvG}i?m^;gZ;s1CRz0leH@)57>zAcKUA+l8?1-W3sg^; z)Om_&W^i)1;ybbre|tm%-4}ICe5=Lpms5)%fUC-X&iRo#7kHjs_~d zh3e@wOZeWcrVvdVY_sYY+MvAbo#VXa9puh(yF5ZiooA>7_RNt5W3RCmB!wweE%t5% z=0pc}AUgr5^een&_QS4pB2T#m3FiDlH`N{14#7;?p0HfjPqk2bUbWx86l-IR^9}L* z!>&U1x!xJ#5`Whn(GNks#g;Q=s-%p}tYsM!Bw=!{XSOrhp(Q*LvG*Gzv{XrjpZSpS(vY+S`^T z+!gFZ=n~rL=GTUGiQIgf!w-wl}b&*PSI7gtf7wbZPb z*TgdCOX7FpnY7qmtQJYMs_V-3ibe#O?(#%N1J%$)V4il1b0@NwB$Rcc3*a=oQ!!n! zh3u{9L+s?(h|Xjcp~2@!P#ofhMbv->Rxi%8nC~mP#^f@S*&2EWTp@n|XP3;BAM(N23pOgl$hd1B-#ii!YWB-NMv%{2$>HyYF zy`*LUR^k32DPSv^&g@aQ92a{8W`e$A$(Qw1R7p3Pe}gY+k7L=|VNhqN8-3U9ajsL1 z(x9S`9u-jU`-1=9bAu?kGHIfIlzN2nk>^6#YeT0@PrB6}EPKIbL(kcV+9%qLX@gX9 z-AjbaPEyyie~Ko!dwEZK-0V5o6gCm&SYM0JiX?a^_zEG6iG_wUZSYNKrfP!Lt3HIy zqA$ZSuGx|t$G2FOR;+lRu|T&^vp0*UNzSTEPEQKWX_e?(Rr=7J)?-(iWXNh6loG82M2*k%9$J}zcgn?5yDD;pxh<8KB(3D-unMBE5n6Z|T8()xozb6E{L z%k2f509;F#>NRzHnI`%!v#_w--p)GKnqpsS4q`9UPsP0?Tf{@`a^YHK7Y&WTvW^Ks z^4`jBq8xG|6D($;>*dE|=b47fF}&8?g}5rbWP@U^nL87mNGTOUU96nM)0&CeZ)*#* zeKqeUqU(VE@+JbWgPliEr^?9zQ#sF|v3;sAC9Ru^K1)89^sD|%`nIH}x{X=2`rs_FVN&V`VA204 z(YLDfAF_|t)C2>GzNS!;C)7b>Ww@2BNu$SACebSRdw2oi7EiGT$+*%F@+`$yFk{=t z37JZWgQUlyDLg0-6UM?H@$W1O#X3Q$a)M-~tbp!olA4}4r*jQN0$c-(XpkVuwUe1eZ7_F-H&N?|dC@bSJ*g}1mod3?1~GsTyL_M+I>QnR|16)4KcfhK z8Su2TPBWi$*+~r= zhAGRF8D7^_Y4q2E^WZ(tI;uG(Rx&`bO+8v-r2cZfCTm$UGaWZm@8mNTA@WhyL8M*Q z)&4JX9)2wC;`)J^Y=6xsfz{Q{~e~1CA_$^tFS9}1<__cVtO`+vU3_{XZ@jj z>#~FM;C~W*t4eRr?FqEy%aDRULimJ#FD(&CPyK&6GbO-RS zjM`W#KT8aY&nCYiz9l8LtKy!H-r_pT2}!BM0#`|&Mjn+NHgDw5vR|^T!M`{65tP_u z{OXto{2uWy6TI=Eg$(Zx@GhqfFz?GGRiHCbt#o?w-4Why)H3=8VHZCmhnt4DM%q!N zuW~3HM-Emf=r6Whx6uhR1T)Aq%jHz%!#33=MXK_VXtndEG!(CZXCN?<0zde?$y3CW)fccf$|&`1uiukWKa6&{XF?h3 z{*sw-!|7&vpwuKb@ZxGqWw*SS!TxC%`OnaZq=owXx_*tn`#Sjl^lPmgY<%K){ke?8 zzGIEwWuL9*XJ1Y(#fpGM&jTiXt4d##o5qi*J_bzsVS)ofJo1vTh|b0X&T?WbP~(9a zZ#t&v5%~s~?lO5Bx!B~Fi%CDfE0sZ>1?qYy@qFTnSZ}TZ68jOUO!A_(E&NYi1b>8O z7f|8z&6fDBmfIYBeHixxXIp*!K0N`mq5a{0MX>wyPP8@1Nu*fJyHID*ah$ znH$0WV188g#jHS$-{g9tT5T-H#?!snksiB85o7hf!M4C$-EpA8-$c|*Uv;hH71E6i zW}dqiFz;h8xd+sY!@m_S7cY^16)0?Hgdv7sQg^35lV3sG9)2?RBNO!Ul*Gu}AQt$o4+uy%9`KtPoc8Bf`GFbmt zLq?#yk?{2LX*g+``}XUugT7GzpNg3>QgubqfKF^2-8id$m*TagXIf)Qr<4bc4+FCr zcX`$9HqWS6NK|5rM8JerTuZmRl!(s z9RGr8h&Ue)hhEm4aGbTZw`(F?W=1^DG-bn0@vof5O%y(f7i^s-{uWvb1oj5p8zST! z6?_q~f{Bo*VnJB0Da4c&e7-K1iwSn~Uc?WGQYKuj%@CgCT&Zhji`h6}-VZYmkn0qc z@)nN{?4>QjKS-u>^}wSy!q;lDU5BBk_+R#ej!H+A>@twt_elQ`+ym(S>MA)m@=m6@9!H zJ-67G+Mo2}^a#CDI@(|AlY566rs}_S6L_dHs>?j97!+W_6{Zpq^*3LbfzH9c9hbBCyS%GW5l=RVNe7= z7wk&Rlr{Nj!dT7ocZgGA1N1X>!_sFr>}*nITN^KC#V1!vuK|nxKZ(9orN5TDSuhvI z6x~eE_-A-eh4-M_=12Hpa=hq-tv)`v=#zOpzRP~SZl(1ecqdnFnH+x;4wL*;y-7IJ zs^M>_the3cs+X0kj^Vtp5s8d7FDP5P+i&V;g~-0#HA z;ysdYl0WEoY5x`c$iLJ;)T;u6lBFrPfO$Vz$nkIY=LJL=57N%29#neiarhRdjV~qz z%3w3Ve1NJ4_7M4?T;KepWnCjFx6<#hWx8Iv8fB8Km!}?oBVEG&2}*NHbhfISas&Sd z(~rz7SGs#Q1YWDF(;-2^EPZFJLQXXvX9wAn1NHFscBzv*!t-o&Vmu+kMx!s%$ zo#AzEt3=2Bpm$?*7l$V#~ena*HNl>7znl#oRn zjCd=!W^W*OI=|zWR^8#9-So2hC&Pd=AUB6DlI(8Lw=8ZJ8}1s;0rS3rw5tEM@w{n< z=PB1xpTT_-ZenlMUzOXmF@{Noan7!?V9iR+G)%Yo*5;AT1XAX_ph?n3==QpvdtTMQ z1>M(GY#8}e{v);rwW=SBGi)go&xNqv?R{k@RY|-F;)s+g{T=K@%bo^{-yZN-BQrW@ z#HP<-r*8}1UYdQkG0?6h(~;5le-eGGO5Zm(N2rfsgva^s_)@`=O+O3PI)i0q=V9gx z<0Ky{GO0#vyEqR#!?>nCfxfWSq8FGb#LbKZ=fNySqJkI|wjWxC-Bf>3*P`!jEvVml z1fJ-8#8fajRJEdt93U);-XOTkSMWy(hL#`Tr&EMGnW#egD~Cm-&|L&meH`a2?-G_^ zGreKXZ@k0A*F1yyKV#jnY3i}g(W>sgadfQ@VRPAwo)v7=ZgRjqT3 zdb4*SdDu&{K`~$$QNa~Kwx_BxP-TpwzoY}#)@wsB?#!1$RnxC@N9ZCKY^AonRF&eBBO}& z2nuyl9#HgD6w7`hQ{^GV){UEpDMWuzXgDMpZ%>F{6qOX;nOhmxnX|FV#L1+$x^GgC z;kj}|_B^&!zT6WZdX=5$-shIG%d99{tyt(8D%^$kMjxPS_yuSj<5f|Njk)3Cx)ZoB z-0`rB%~SSOPsjGEr*QMJCig>W5!>0-mp$peYrn}3bi89qK|QRoXn&Ae~J9m<=e0xswzV={DXSo*AAN@nTO8q+C26Nr8r1JDdA3KM|u< zH|t=3-YUN> z*wbb^Z%x%LFw-!nZeUfO&@P!O8d!FxW;v%WYDr`%uV?U2d}-yD(kp-kF;>jw%#SaK zu8RnZutpFer-QSDR2%lSndutns%AEsmsDKGd*M8M75#}kO5e8P_W2H-6~halLgoU| z2|g~4mHO;Gc>-lKwhO6(uEft5i;)n)ZrfMq19+S0fNXqxp=}4OB`;fZ$Q!0;JkLJD z_MSKgjDwxdyqaMZ-{J-MTs(k2Qn#q0oKvZ39*yTu_N8VpHcB1mTm@#rHSTdNKkY{1 zDE%~45woFgI(vrMX6Tpk+HgWW9nDb;!p!nrnti&s)Q_e<>b1^~uGvtsc{aQmIYb+s zADK{RE)z^0B$^$u&Jw!9wcW*W|Ao#}29y`kUdl!KM_RA;SKTMgM$DqCMh_>=NbIGb znNgLzFR?JIy&lVaof1gCpZ!bDw(RY>+jF;ptNYo-)?0OJA)k>Wc`P^vt(6@Dg|Bbv zD+vzg9@%?%1pdCN#1SG^Lm_g9yg~Y%GMfr9zahROzTnpcu%Z~c1R;dY)>Yn?ze+h+ zS}R*i@3DlNOwNz|*Ek6`%LJlprb63Z@ps07vR@!rSWBtNk7b>#CipJB(8;&IiF#Ah zpSdNRO&=yYQvKXtY%=^K{JmJJ*hQ|Oou=uo-0yYw;+EI-$52+ zud>F>W3JM1aZyYgm(zZOo&}GP%}3P27E^oqFuW0&AZg*Lh{=xkQh&k(g#($Yn5?Ss zMB6qppFM-=aC)@zR-rpHM7lP>&lWbwv%HwwyD|4h-h%(17hM3ZHs;Ec-X1%8FK+jUTOL0(z9#%r!gTfv z`yFU+_lBIZ-qIvF$K95C&k$5HIf(j;-;OAiye6k5bU{ALUc*wd6#AFG26V~~RC`M9 z%z=t1Inp=gwtTs~QPE4#j%p|6lBfAINeOw6{6LV>rU-u&E`xjs(byI?BD8FWDU|Y^u$~;FZch? zgSp^pVs358!|KEmGY91?j9(tpJHDgsx4K%Z)RbeKSvrJIwxNs}_Kl`s!47_3c%`^E zT!Ig<-o^bUskuKiNos&9YVKP0S1saA=1&&)72XkVG(IltVd_>JRF}K4AwHyRcjUYc zhNu})#nG#xSGAcMbK7&u+s(64DuUYxC*n_qi@aOu51uO5N2VA3i~I=XQtzhMDFkRh zwMJP>qsZ9U59k$RZ`S~q&+QSr+y~WNEnTtksvGKN`9Jg-_YqWsnqQFYMpIU_Yano>IWuJejT?zgtdQQXu4$QbP=)JA;4HUzGDP6le&-rgOi z{b&_A(iak_@Lz{BB>#XiSqHQru%JE}^jS0IYf=}atWWvqKhM7P-*jE4)%x8@sJ?rq z2OZAO&%OiC$Xc9yD{)B9-?^NenRzqwIN)kX&QBHh1Y@B6rdRRJR=u&f^hRa4ahkOg z|7Y`2er!mZ#Zva0{ZHEtUXP$Z`4ya{vGe0b3QkrK(ShRL{1^Pm{2urYysQQb<@4{w z8#!@;HnrZW@ushJ<3m50Uzc2o83XkdPUkG;7n>*Zc2>T%o}vfRgPi}w=bL|kRqzt= zQWpfazF?w@l(ygDkAnLulHo(dIq5sRu6h|!LoS0^DSC0nv@BWXxeZAQi|2rUm#5T=0w(4= zn<{o^C5065*Qt1_x%Ps1*kYtNF}LV;^0SIc<<2re+$!o{=O&titN^>;?WKPiyQ*sy zO_GD&O)`#>@ZW)t(I3%S7&kM*v$C;!c0yBT)+IDJ&#ZjHYhb0lH5eT!v^E!xzfiU|40FXZQmw~5vXJIAM%eMYbrGlc-1UlRgZvNxC(vmACdrd~|@oIC#qMEyc^)W(Tc0w9=C^x)J%bix4!v8hl zrcqikvgQb9{)UxMS0P8pkF$j4@g9Jwh8uzWzz_aArUOESoUa&wRJb^vwLVh31I)y4 zvgJ^d`Ut+&^wBIvPn#1-CmHR)m~)_Z^o_Qy+|4^J?_J%K_mnsf zOO@%=QlZ;ETe3!4#Ds(Hdk<)@aUJ{|+9A4V=waBFR%%%UFRxby5TDNAHhg240eWkr z{l@~w8YG67i8m9YM5%J6tzOUvIhaQ$4ElUrAPy{NJvJ|0UDaux`fD~CoL>5t8 zkg}BS%{j?QlQhfwrlkmSEm|z7xN%W75uq1E1iT=4>viFK|GiV<%s1c6=Q|ylF~m-u z^FDc=-~XSLHC^>mw{G1cB71aGb??@#7yUCsf9M}Of9SvdzyDFuSN5bo&;P&vM&$qf zA9gYar9Anaihd{z-Sgk^@0QA##)@*8MZK{O^~KZ0|D8hJGuB@Aj|cBZ3VIx8;t%T- z-Oq_n+f%re_%3=0PZg)pGgVC2_Ne>WHbL!0U!m#vG5l_H2=jcx6OM`e8+a_&hvbO= zJ2RP|B#Saloy!T_+jtkYOZCj_D!1})?gX}R7jcf5OHYn?MEjRDOWCYh!HHZY-ibF> zIG7rhr~Wd38(-sc$&;P0ds6&|#%S*)jn-+mlgeIHs;O^neIIYT~U$16d4#7s!g?2JtoJ`Mn@lx8{^3nBKX$~%qv*Atn zbn0wF)tg+nv)E9~t0$=<2v1$Y@^8i$Gn^b8gEdq#M@>^{zl9x>+O{k{xgy6L39jLb`q z*0p#m4;aK^dJN(!CR>^<7nlFR_Ca_3Kl(k^Jxo?ryIg`2@Lc*E&*;=`hWM3EYt`77 zCz??);&2Ggt=`N`ifvN}_cV5)Mx5LE`{jzit9L2)%8Ind*kp9yZ}Wem+ii3>K5+Yl zQ~q1*z`&%=_nRd4V(R2&_WSCE++eN(Z^vztPQM~K%Q2Gw5EpSj;mPz_nMyzD=QPc> z5_y5PmW$$?cq^V6cS?Ug{;qSO;K04ODyj!Of8)iNJ>S-oq`mqh+%;sw>#<5>GnUFP zxT8&_{-NyBz_`xOd7Rj)y=^UW6sG-yC)_}C77wd*8tlnuTp^~-#K(sQ9`Ag=$HmCV z3$~%wv&?k93VlVNmpR%^Y>92FXN14Mwa_}8?J~HAa|FQ7-`gf{V)?eq=;1AK!hx)Em?{IvaI86HyT8Fmd zc0Z#&W$dYJbR7{axBx{2vc)`lvc=uH1Y4=?iInYJA5OyCuv%WKcP4Fg%;5c4!(GEq zc7D!Jij&kY*!$M4)rIi4Pz!wy+N0hybn7|8WfS(`augtA#hLVs72~ZD&IUCyOyNIA z$MM@ZGbNh+T$bF=nSA~;##aNQ#C&>2i4ke*<7Co8bLD_2W7IR)dP)J81WDd5bJ%Uc#+C9h2ui~|=y3r^uqQ@wnaJgJ(nMSs| zu#Eiy_r|mJtGIYqAK&kmjb0@wtw|%UphqJv+5f5ZxUED#&@`Ou5x9e$nrY}zOn2XG z%L1|;6*j8G)%2*uLU+D&LHCrQMmVS4Lh8IN#wg*gD;H;__wsFZZfa`HBq9-8Gbj3L z>}_bYF`H*RSMbrK_t^=iEuP1SX=rq9DQP}1JM*S^Q=FZ-m6;%&k~UR^p>XQPr~SvI zm5hGZ19=*X!7O_8p}y(5599;Z?7^ea4wQ>8`)5?f=rub=)L-D1V;k~5)Yp@8Rasl^ z)P`}>Q4K!s57fl6`YN?M)Kr4Uq42@5;kdT-@)df$E!VTddcr);K2f zPJ9oY!r7hARkqkKd4xTrra@Q2e}+EARrtHgtA?9zrMs|DhZmxKWVAS&p3&k?`3py= zdZHmjIE;S42XSj+5B8*WgnPAV5RPW21x9rG+6eJnYByV(t*35@u!<`rzu&Bn+Ak-?8FmZpYzA3@n^P8}E%LuT*Uc?BmOUR(cj~4VBivJ+ zIm|qEm#~->h#Ak*W^#M$H+YX&RQ|ZM^2T^^9X;`4y>*jpk>U(3rsHU4Ae314E6dZH6ToY*sxS7RlxFJ(C0=se=Qd**Ne{n& zpHkgbTH;^Q9_3uZUQi?oHQJ(-thT{~;OTe0nm(sVQN$d9qe_P{`)Ckx){q z{Ag5CTV0b)YsqBloTg4cHHmtMSISSW(MOot*d?SA7nT>HGc_-Jj+!G#Bz<1u#TV#_ z7jL`9Dr2-KjB3;KY#wIUg^!_HJ?;q-$#k?l}DMdy73yndAxEFrMaZI0|GRtA)if|s% z#Pm_i0J`ydi zp(k3*aD~;bRxdC#m`bR=H}DjD6&i0} z<*C-D+60tL75&aX*S3M_AA4SYf~uW`{(PwK6lRcYli4T>Hx(_zdc4bVRsVg;_m1mm zJ|2Za@XXHKIa3^8aU}Y`@;PmTU`N;R6mnlt8z`L7Vc z75F2nuc+>?{K_4|SJ2xJ^=(N$T@xeKrOgov(AW45R_ePOn+8o(QiUJ!c69J>`aaud zowP*X*VK=`u7o`1Y&YWS3HC$6BjjzA@;7}uq_^bLTGpiFc9DFN;R1c*oWBVbB$Z42 zo4#dnj_SkADDy)0X|j(Taf7}uJ1R{t5YSZOXa{)L;#A~)ze#ol1b zBPHw&9MpGw?ZmpB`rVdPwj^+pEcJrE(G96$sJf z8+!AD{ya|(vuSmcO_RB`#6?~(S| zaLEh)d{0?y-XGAS{v_zne=t2%;|)dWyBr*OzA+DjKZk3u=_Yxgn(Gbv^H!rj;RnN> zjCM~yEH^F3;Lj`cS9le9&Av$K^5?D0DQN=DSJMzn@9(4dfxMDob{&(#Xxa)#r~O^| zIbC-WO18PU2K+nP_P2Z$QZvHdpu@sKREPJGbk|kG z&u?9-Ea5-JpP?!o%vYi6FB}sMt4-1DAWZX=8}e0aVhH_SI85((FkiLVy3u?!%Vg(@ z$xkH44f!fxULq8dRopK)n6EA;#oFTx*UhnP3qBwCw+Hf7bINWZgS4|Na4=uxFjJlL z*dvy>G?l-+af27~)jaJkK_H7+Gkp%a@|8u}B*z)5EEm~#h^q0X7xLARy)CAhf#WEY z1oKs2eMb2d!?yG`XB_66axmm87h^G)ij8ikv)FUvQyMu%M=z=a^ddiTMzSY^w zx2Y+Y>U-DKVyqFikaOBPZ?GS=p&I*WqiJX`=B4GKLeKnzM-+FS(hggnv0*tjkrw#zL8sPrnIA& ze*bpe-`~~u%XTS6TAy%>J>?%5_`nT(;}hL6_P#$E+5ADivCLj4-&c?1i?|Q*PdLi~ ze4|ZTNNLAlZu{T(Mv2^PTcBMi^x_=2irjSq-D&6f`e@To zw$#5g@PZrohDvjU(x+=^Jr44XBFAlOVOogE$8RQ~fio`P8^bF9!4D*aJ4^Ec^abD> zL#-EVXPGhP<){+(Y~1PrzA;BTo&O3~p=WWBZyaIvx{tG8THMKdJvmLqKHwWujTgCU zOxO;8kZ&Nz`nv7RWpf#~kQ6t*=LNnoT(?bdk@vX=ILJ3}YO#D&uMAOJW4+s(qA>7{ z+iVA~A?FOYeL=o)gPY`;%=H_3g|O^~=3)YTL*%phU-6Q<&)i*n<3(n){Gl|i%!okZh`HoRIjOr1vi`9+%egM5;AhSv4fIE4(sPX0xBmtSA3ZmJy5-^KU1 zOZ0i^;*(?Rh4QR4*0i60g5=TXw7~Gp-k($L)L){wmvI-Lyjs&M$x|O?NHY&K9`(&> zjPv$IwX@ba5S%?o3m8-yF%E=bt8T;4kg#v@fZODnVP&cuME%ricfb zV@i{>Q+1ddz~8{9@n|KVS)uNbKwHol*fTKb6U_Dce&r_BJ?=K2M}EZ?#i!k;F-V{- zXq+oPNl&gAZP2)esb8&n9SswlWEL*4ev%rmd&>^mg2uU&nSsWBJ@0C&ELLX-PT^m~ zPI%`|rmrTnu2Wm8F|cRQxWMp%`{&eW_U`9dQ(oW+GPeFwT2`7+4%&joz@9L*Dtd-m$Ttp{%gkDeipqi2TbG@Nk_ ztF$Nk_z+WQU^6Llv}y~}Zd<{d!K1;O!J{{^TRn5MCAQ^gjJaoHB_3*xj6BO+uz@#& zM+18XkKV%-`=%P_y4}fNT5_89dX6wXT*uixZt!OCXkgFa(Y?@n-r>5sx-#yvxwvs5 zL5>{tc4mDYcr$o3uxIe-Dn1I|W)C%}t;&$?O|f2_x~=}GzE}ot29E~z3?BVFy%cr$o3uxIe-3TBpVh}6AYK+n;Bl!VtviS5X) z4#-xJv4A~8##*Z1=upefBn>x%zlQy|)V5pqL`s4UvK3^k>7Dm-y7;DHhO0fQThDT2 z69SZ%^sSquUaNb-4%rGa7O-c?SkbKH&P@4SK4W~&^lHH8Z&1fuks-nf*$OfiuxH3v zoRM>DYd5IEdC?RWSWHgaBhprD*UONtAY%c0hK%(HYWG;vPTSV9$IR-+S8=zPgYtR3 z)ehNepb$cUJwwJ?#r5&c*2lY)q~9%RO&h&unG-Z^xm=K~AY%c0hKw~0b@w?nhhny) z*_Oh_1>|wtlKmz6PbJ7!kgO&x25wv z8jMC$+8mE1X*aW>`Y8$61~87U{ySTL$#GH|lqjS7^mc8=Z&)|$S`*%tfo*`kF#83@ zQN|8;Ham3IdFYmKlGNaq_@`7aY40k)Hh^)===A3q;#z&AqtNbDoktwsO!b{6kJTMl z$J>By0OOb`PM~L|7-GEU93X|p<)Zz1wTt zuanrRrvH#FxHS2JE!^;=0&D{q2e4;g96uUcU8RbWI+>ena*?%Uo;)>0s|&LM+W^M# zOs7viBNm~TJ%#0GY9iUA=4pWllAo-1)abnuunk}wz@C9|{E6x*F+QVw%%oeI0(0;f z?QPcy<5&gQ1~3j_&%ijU(IxLaWj^y9d%|)kaGgY3-;?zQn*?kF7zeOtU>yC0JRGj+ zR=vwnl>U4pNB&^`=^1b6p#ru6j04y+Fpi1Ba=bzx>1y}v$&j1+;jP99-wy_V0U)0-z9e5~+G=yGS?Ga(0%eq4`X1BIa=hcnPsu|@PLGT5 zpHdbR74@1t2KB=Kq8TQqb1sx4GRAvKPlvwNh8lz^+;ndGO$TtlwJCEH!AfL6*8y*%@OY4ukk-?-cPPe zi;;j$0;4SG^wR>d-T0Vuf}K?NLw!vpgc8a=ee6s0>m*>4z$l*)&GbAY#*N8B$v$|4uCqs;rr)1)kJk#d-ER0Ep?MhWa0 z7-bb&(N?^~xDE~rBz0nP2hE#U9NyjIU*E zJM|OmfK39U1ojLJdK=&FQ#tx+CMH;i{6)@^720hc&M+($*d#DYV9&rP&vC6@E@idz zbL-IbMU7#E(n{Y%c2o+mNnn(~o`F$rV9v{PZT(}j&=Zt43wWya2j)QSWjPsr=TD$S zt4m)>n;p9x-=~a1*J+}fk8Sc4hK(8|Po=X33%88sPME_^7S+c8D8DKbYI*K6ejiRH z|CPsAoYNkOw$s@{gK&-N0r>^=?XP^Ki0UioSGvD(2zPYq8!y9b0cH$AeJ3hPebb=r zC{;L!f5b6T3)S~@4a^ogXABSZonU{=iL2j6hlCXJ2w5kAzR&i7*#gWMg8IfeGhBX6 zD)*a^NGix%GU(eO!E6C$3_*Qgb{uh+Mf%xF(;fUGaa4o8WpOZDfEhzj-zjvOFy3Cm zHkfYE{uWjX`mR>PYyoBrL4BhemU`(#f&IlCNtyx^>p1Am?-!)y>{gkAcE7zaq# zoS|_pbc(OV-_zHDKX0jq*&xgayZrelV{6r$uK2odPyxNw(d0=5{JAt4W`i&z4El4a z(&|!Dv$=ypDA`8BY~auHWS9-Yj4OE(uAFEBTQ+>xO;Ll^UFdKv!VbGuNDVMzS87*3D?oajyY!di$v=wH9Fe425bGRlC zcdLG&!lt?2o1}*d{P_4D7b3a9%+r~Q5LgwA|*N`l!w%=m-(YDVRVdd-dY;?Zb>en6Cmg zYPY^>Itt^C`)lx31@hI}a+vMIj6ayKl5J}oTGj8!MH6!aF0w(sdRK2mFNt@>QrBX8SPX59X_U zImW$Ay^32R{DKQfx6XXkW`o&2%=m-(syXG~o-J}ayIWX+Gf1o*@)c#$bhZyO{$ReE zr`_P)Tfdl2_{~@#Q=O2nau}HH!;C+euZHZs>3vai9JQE2$;`ke8S<4yg4sUI_=EY% z#pK{oj^-4LN##9BGRh%e_0_{{A7=c)e6`0oin!d!vy5A#4d7eRkgpE1Fx!V2e^_=-P*v)|*oi2Un>pu!#S^rM;d~}Cx@*A;EhJNIhU^fSL zbh`9CWz?xRx_T<>&_}cpZO1zt(2qV&gxwt2(Fyh=wY<^cOzOjJr}|1bp|c;A+F&;a zc65UMs6A?iE2QTw6vA)EE%*gH^rOCYu$u!rI>COFnIgGAmp?~S__y(K9N~n1)S!ml z9N5tb_9MEH{ioSN>w!!g6Tfz1x`UxI#gK?l1zu%i>~NAI(bku4s^lg%GZx`J!$(2v>> z?B>9ZPFFwL!+5Oia#mFz^auN+|E@n<0=_X@hTS^Yu?zBz-0C)EQfx6Y)9+snr&)n- zXzZ|C2Rn9M`tCMtM$&$T!-gEXRuE!Q4XX&lR{% z2EMV(4!d=*V;AHbGvn?$&&Nk`wUlVkNumw-Mu`l&bqnc^U6606G%vVIe{jxexW2Rn8_zA;?)p0|$jjBUaL z>>}&yfNvlN?AF1KU660wW~1<-hI57v{5p4K=TYtcG`zGD_~e)Nk=)bdJl&BE z^2sLYn6gu4;bu}I`3~-ofKQHA4s$o~0RHsf_+-EG>-8qp5Uz+4$^FrQ5{-bow@!v2p1gOW761=H4Q2oU delta 37 pcmZp8&DijoaYF?M3*BE(VN^ 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 TT?cr>p>DvIaAT(pu={ZUjw5cd literal 0 HcmV?d00001 diff --git a/src/Effects/RAVU/ravu_lut2_f16.dds b/src/Effects/RAVU/ravu_lut2_f16.dds new file mode 100644 index 0000000000000000000000000000000000000000..17d756f023153b1ba6f47871b08f9bdff36339b9 GIT binary patch literal 10496 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 literal 0 HcmV?d00001 diff --git a/src/Effects/RAVU/ravu_lut3_f16.dds b/src/Effects/RAVU/ravu_lut3_f16.dds new file mode 100644 index 0000000000000000000000000000000000000000..07b7c887a09d1266c5cc94fcee0941826e8755d3 GIT binary patch literal 26048 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 NAZNb1aVpZu{{g~44{-nh literal 0 HcmV?d00001 diff --git a/src/Effects/RAVU/ravu_lut4_f16.dds b/src/Effects/RAVU/ravu_lut4_f16.dds new file mode 100644 index 0000000000000000000000000000000000000000..42e19542ec1f260d4cfaf073194bbef2a8e2e22a GIT binary patch literal 41600 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 L0iskcP&NM#f=))T literal 0 HcmV?d00001 diff --git a/src/Effects/RAVU/ravu_zoom_lut2_ar_f16.dds b/src/Effects/RAVU/ravu_zoom_lut2_ar_f16.dds new file mode 100644 index 0000000000000000000000000000000000000000..1f0a4e6b1da0c78801a81d7de146c36462cfd0f7 GIT binary patch literal 373376 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

cq;KrYrQMX; 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Š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 a)Qy!s3uUR7LcOH5{>S~@t4Ce!@P7ax{!QQj literal 0 HcmV?d00001 diff --git a/src/Effects/RAVU/ravu_zoom_lut2_f16.dds b/src/Effects/RAVU/ravu_zoom_lut2_f16.dds new file mode 100644 index 0000000000000000000000000000000000000000..5cbb3f4a21a042ece6f07cac7594580afbedb4d8 GIT binary patch literal 373376 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

kQxMw;h(U18B%eZKn-#>0*Em&ruoMWXY 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 z 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

PWmX#gswsD`ljBA$NCAPiNPb-vpo! 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 u*{h>=Y&=I{D~;3~XWjWyh literal 0 HcmV?d00001 diff --git a/src/Effects/RAVU/ravu_zoom_lut3_ar_f16.dds b/src/Effects/RAVU/ravu_zoom_lut3_ar_f16.dds new file mode 100644 index 0000000000000000000000000000000000000000..1f0a4e6b1da0c78801a81d7de146c36462cfd0f7 GIT binary patch literal 373376 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

cq;KrYrQMX; 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Š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 a)Qy!s3uUR7LcOH5{>S~@t4Ce!@P7ax{!QQj literal 0 HcmV?d00001 diff --git a/src/Effects/RAVU/ravu_zoom_lut3_f16.dds b/src/Effects/RAVU/ravu_zoom_lut3_f16.dds new file mode 100644 index 0000000000000000000000000000000000000000..0dee57459fcceea12994d82917c8b658c04da455 GIT binary patch literal 933248 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
8!rl47PxLnvmuhGbP?VWp>yC{ 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 z %KhqCLIuumu#D0|Y*Yd==}uIBT#)E)Y4>J{2fzo*(6s;#$DtCo)?{ep$+w3=ty zndt9i6KIt_fwx*UBzCiIJ3CF$2SQ0&-Mi{6wumf47Wh6XXCX{HDcBSmfHaFfAKVzq z*Jslg2j$j6WN@Hu0d za8jX}T}JVczhzd~Xn?sJWf{DKy6C871(h&I+Z(ErHsi)=d+-M3TDf7`qr#%hHJt0z z-=g+nw3?yeBlo?31y=xm>A_flTm1b1zw5oRfZsQ+e}H}P*;@l%7n=(KuglpgZX>_> z1`M3}IxWICX+n_xkm}8Sb160TSJ8cR^ zS8av&y=7TlrM8`GoM~9~6wLza82J*+Eq^0Nrmg)0`@=V_kXP|uxZP7COJ&%RGWXbm zU5r_wmE~)te=%DkPJ2Rbe|jQ3%Mh2D9yJKM%sT-%`bJI|>{|`=b(%8?X}o^S;sk!g z6O|u4dj;vnYP=pL><9e1-H86b*3~uMYdnT12T<3=ZLo*RRr=-PQFuh1PNNg`!K3An z%8VbxqUibR*230U3tENz7kCDGi#bcarfMLN{Z+!(zm=`>)R@5`mas6jS3gs{k6Eg5 zkq7a7?#WQa-)wvu_kyZaTP$qH;;SBzN`4^TRdrgu2F%TWD`#@hYv0Q685bKYaTUP( zp`n3h?gdaMPPV^^JFof?+~AQrcPewZZpTD>j>^Q_L`TD~>jL-(d}w?Z%_H=COh7NJnhAG6O>wU|wW0i*KF4Mzbf|wVYo9b# zGA!6#CP-T$&JXO(|1SLx;+^kgo;H0S*4A@8J1V^&@1a$fR+*Y*yeZmXNl#4DbH$VV zC;1Jgo$N-Q(yTQgJ{e%|4D_|k-UR5z3OfYW-8HkX2Jy&q%TM6?HT@(oUue{S&6j&c zrPS%Lj_jXnOAL9U$yiW*RELP3M(jgmx-0sh z@CKBr9Zo$Il=4St@^u$@dE6Xjit@eQA3w2rkV>K-<%`CmEF+QOfd}?YCJ|Z?IOaZV z-i@yC+dWUs=TMP%i0898h_-V5=!PuQ(I`uA=TT!A-yE9HF4uiw1wwnqYGRj1pb0+* zm&qKNu7sNUKC)$5Yb2SWdg*!DTgA-+>!iimJc8w0misD;jwQL%vpQyd?seY)cG&FxS|99!%K`l3buJFl_&t_6_5pjc z%%%qI7nWt93kgH6eu9TIH|0$+(;7x}}+Rsc=1!v2CBaFZv$;A?~Td z&W*vaa=6Vc`Y@!T?ExrF^&t9A8#jHT`lD)gyi;+B>_lWB547!!S0zmZHr;#bpja=6 z)Vru*p-A(Hb}n@jJ0lS3*t%!@mq-S=O!F#c7B8S4r!wkl=yPg!DR*esdyiwawuR^% zzr)F~9Tq0}n|N)ueZms&5$^+=Lpa3k_j2q{1u6C!p2OB_=u>@H*J1M)-Wl|VkVAKj z(;ojZ{$tw}u_=;_;HZN2xsrrH@OD0$7b#gEP)K{_C5Z%nC@(heBEG|unmr-+0(#Yv zm3}UJBo{Hnil1b*)Q02zT^Cc=Xuc!vdHEu9s762|f9d}90E50>p#MAM{aT;qp643i z|Dby~=nvbuxBwS8S_7PF-vz!)f2CV9AMFiqlkeAE5dMaBt)8h(5aLANvd3hG;1V&r zRv6QZzZS!`{aDkCz66_G!(PSe>w-LidRFBz{XfuTWzVuV zy5$}VGQ&Pnu*$o@{n}oM?eRSFq7FXR!5!%@cW|&&XM1m!{U5&7gn29M9#mh~-{rH+ zggXgxte2^9b}8m&pNTJypC)Do%A_XgVR2UAbzZCd9MN;1BloH_mw4nU%w8%TD*Vy4 zJ)>vdQKYRckOb%6;jGri%4cRVH7e|qD#lFF?I1+(t-4NRN8}ks)14=Ka0g;p+BWiR)o!#(b3tC9oy7}N&k2?L z`H8l^wjXVn?z1b|*w_A}pxiadJKAv*lQ_5dCC)mGX(#=2oII?HImaLAOcD0erhESm z<-%;oyW;9=E$1~yk6ZTY??GJz0p2jCIHDPm>l>E4pkO-j!W)}&z915R z0^qzr8sIy_Zv#9J^WFsfmb<^k;U}CY0k1B{9>DW4``3LI%i~mPJmNB16c@4_3Ln9b zR4V^!og%hvt*ZUA_M>Q`d|=%3EvNAv^0v%{%5B(Ad4NSzz2-j;sGof@!UGsNcF^i`^YAtq*w#^l?O~w9|j#&J@i3kjFvas38ae-7959?Li z!{5!>9*sl}dpkLfAzW1Mx^6A!#PeR8S5OwZ5o zD(LU4MwqI^E6awI!G2wrOw3U&eOB+ZoE(U5zEgW8J*)HTsoAxz@SmNBu>7Hu-4_N;P1E zHGf7Qrw*Z3WdyUFVsK+s7uXy0TkBG5)0w2UAU4;##qt_eh&6#{b|(ITSQLzRMPmE$ zw}Ib6YokA4r~K)z)<{0K%lpN_=2s*6E~bsgZl!%|_)OlfWY;_k)#eSa-p{&h$i&7M z{!=l8Rc+%G3h4-v;L^!-;R>O~Z7vuPCBW{wPfNw|aaeozzTC6%rRa1=vn&zhuEwEd z3G3uPv73-DJm*4H;~MSr;lQb{aiFgV@cYH}wN84RH4co^9o9;@jn8ds`VQbf6a(;E zXq6+4*Z=pZpv_ZWre2F(anEbNr*4WbhZ`%OsFfn9YHi#baw2glIyq*N`iKy%?Z-Z- zE@e9N+U1{E_(8o`B=awk`RY0nhkQK?c*=a@ zqj#Z{p}2)j@gTYDBfxG5dcvMrlW}%lu6oe<8CJ@%|3Z=NL_E z^HQ!w#9G}PHy%>FR%Bnh()9=SD;Zr`=ID#wuKQL-6C(bIos7Of6^Xiuw6xaL zdVH2RYRg!XCH!98ro}P^8&Zka#0;VRpi2<-3_r#xF}y<;(_9SHaGZ;@JwR(kwL{fZ z1y^Y<6b~@1WiK_pC+3?^bKe_kh+*a$Ru^g?MmLUO_SB6Lj?(UoeNC=LLU|3gxvIQ% z`P{B`nYE`>GM|pPVs6HY3>4dsYZNtY18MF(0yWvsKhaZy)2UwGyPg11ORaQu@~$EX zYK*zRXE3&x^k9!1Z8%BMMPilZO<5_kP;%4%K=v?cb>i=V8rjdO@`SDde?fGHL89`1 zk#@_RFJA2Hk*CSbCcK`}*&Q=4BSB{%?NoY+ek|3Is!ef|*_;8sGm@^>en=x%&FxNr zFPvuqk23cipx?{gPXIQ!MZlhbEym?Unw zZbxW*f4~Nl_8-B0ai7SmN;SW`m=@Q&wqC6imqxz`lWUTQ_0dvxp@AFRd{9*Ru+Bw?h{%Cg^e%)}$Tjw1{WEr=(72bg8 zlVOFui|-x&12x_-)-woePcFnSI}KGEX}!f0Ew1v;b%!J^18mvItc1j7!IK57?8A~v z{?z=2Y(&!De<>6kog@mq@*HdSKx~k^Br`9&7n1H6k|NJMpl_voXg`_OQLhxf_byH7 z;_eLio9KxL{>4g9F2Dq@0^l}JCb;kOI02emRp5JYosj@nTh4>{(6+glY>!P+FNo6X z`1n(7Xqz`KWbIPDqVwkY0L@Q4eAiVjUUeVle&OD zjy)C2p;kfzwOcu7LjU>JSPa)0i-@7-Wt?Ke9lWEt1=mSU!g`of*pu}=1rgL=u@}e! z{;aKiYwoG8aZq@ADYy0?xs=zYu6xZ=MKdoc`dfX$xWaeCJ`%oT*zLXNd5isG{ODHr zUJwnYJZF-Bxad36H1l4c85=@X@VMS3JQ*n=zBu2hi0X}^e2Y_yL17ZFe@Fi2TwB77 zKw`cqZ?a^r|8d^1yfE=$FO-{|*Oa*LUYvCzw+P+un3uLP=a-m7OAc`|>koY~?~`jm z`j6Tw!6|QS;$H6t;9vaivw?o_xGx7_ci$>-UG3cs_+8=Y4D=XwbAY{gXMYU(E;}{c z5c)ZUF)Cvfj|BO&q&O{k49y_kG>=nQ;B{gh{YO=YSf9jL_GSyla*LkF7t5#UH;N?@ zOJjyoI=n*+gE@o3k<_^Uv=-D0Rx_#qzMwsZ4mEk;DTX3E+x%l_>|G<|n1(}z)Dgi^ zQyNXADd3lA&aB={9_9CE-&V%fZDFH)b>$%Wf~d_QeSTCuv96b=KZbDK=0~1f*Ut!H zwz@BSKjU<>+d0D@Pb8Up*;9OPh*gFU+PA(!1mi&i=1!bbs?3f!{&+?*M*1zRm!)RjKOvLRc~}P-09lw=mMjhyM$_qbuzf2 zk-D%@ddJnV7359+cI~d#L2V{K4ce}(sO!QKBTB{En&}XU>ecv~oZ8*UueB#5HdhUI z)5(wvX323+^vp#RrqhmLeh0eG#I;@U??;{+-Ww?YL@1sbNMG$sHT+&X1{>x%Y{t1T zzQaD!GMkry=jjmBO^%0n?@7$Pm;Z(M#d9XRbHQfprt5vEzQ=*kD5xh5&u@Ypv@|4& zq`gC9w|?z~Tu8T$_r;l!eT#AlKe}6`C+SCH3p_mhkzWA#{XP(x(8yPb{{YbEV_rJ2 z8&lnxNaOXJ_NQQ7!2q+#*x3HAE(rLYi+%$5xoy` zO@C9#<+rRpL`RiX4vsyaH`ttP@8>&CPB7fHj`Q#2KA=A8M1gaLg=E6|4t}Qj3$0fu zKg@004&ENYGB@A0hz|?5S=QJxk>)Jdg0U26n>io(TMlQx>(pk=G2m2JpE9A7*WA4--tZG-3)`0dQ)JtWBBbA{H6< zo_WF~kW|vfglCv^lGgO5P39WAN-CnT7`8zq?hqedvzA(nCvOSTWV+S}y(}m4a0@~= ztW+EQDq@jg0y%|qM9~6n$L}20u3`hd0`XRVsyMptHj0ofYr1b4D9F^Tmh+n7SeoWQ zoM+u&ETCQ$>n{)OX|DQ(9v9IY$uH}`9A7K4?sT8velp4!4*zWHWfhHI8Yr}fSC1ET z30$$a;`9}U>ZLn6AzEy{ceisaieoI-H0K7ve%=CIH~S)F2X838+kA#w!*(10O#DOk zME9IusyZ(#(uMNTJG#o6Qj_sc?xqFxx=uL5Gg0~rbqrtUsmz^3(eTIa;;fVU8bO#- zn0#2r53mRltw9rZWNiut0nR@c1UdVQb`7lkg9~DWWjIcMBW_ z_Z#mu9y^vLC59ag9$Xo2Yw6Z1L^R59+@o zV4px5uKyYDJ$aR$ha!+roU)yBj@fIn@rAMl!< z0^1v(FG@ZL+U~?|fah;zG@j4VzpYhE+TszUgdQ(}i2F6$plc!?F}-RegG2ane^qB_ zE0%;!jGfFp8_M?3rgjf>H?HS@&tHV(^wBn_CXwAGyQ?p1mr`Ab>2Vjelk|&FN98{C zU_%blOpzP4*qoK#5}!q7P~`b+LYe0&oXhyO>$|D15KHlSbo zl`#?UT&3v^^jS)lkd2Qt)5n9j@Hv?P)_q-NUHPxrw3EIa*^Rixbs7e!Zi{OL;goz$ zuMp1@R;imeL@D4UFkCt?a*CCU% z%>b|aEJwcD3EK`ZKQ-C*HLq)|?F!g8*kDTre)2f07|g4*4Aq@$7umV z@qeH&Lw99Y@fE=U>H^a$9)q)~a89~76K|#+$bO5r!ba=doT=C-#H-~p+o3kDhAd%U zYw}+1*SrbkD1V__p?fJmzHNhOU-cQ)^0ht1zd)}v%QdMYKD14EZA}e&G%XnE=9pUx zMS(BwCDt~W+;_;GX5Sw77FJ_f!5+XiHUI#bG zmSt>D=o(u0Rh#))0tYPx9kQB87W$t`=VYA|9re)ja;fM{#?c;W>?^L)WX|25}+ zOE0X0Bg`-+9W1$papmlFBzOW6lf!`x*3ud%b^vc;t?xDF7dnd$k&j$zDL&G*!e|!4k?7vo~b5;tU1QZK4EgL5*O) z#>xdPs48|Y_KsJghgt8DT-Kye#x96MS5=es%23fNs()?Qwrw~;RKp*kf?1?sqA)CC zVC^g9olqGgk^kCu6Pn1KtX`n%hdzO2@>~N2XYsyN&8Nn~tyrsQf0NDF%b54sH!AYn z$M7o;T>%O1eUAhgQ;uxRV zC+|AuF)35YoDl+ZF4DLq! zfOVx5uoLSlq#Gi5p)5&=L)V0(7O)w9ogMOW+G>ug9JM1V`cWM?XH}&90=FnM(^09Y z_`PmaQs>+t+Jv@Q6rZ(|w-R<}RwTcMIw6DYgKXD=w}3zQIv5T7=$8Qq zwDq_pU7+;8SG>T{~nE?~+E&E%i1W>>4Ck<&Y_akON-vnguBen7Nc3mc2v#p@7H<(F zg&k0#oQG92xL+!U>zBIL8Tbq;oQV)!&;ez3F4By4ZY58QC>M*gNA z`HCI$dHIHM?xj|J#6WVZb(sDk*%bbZJp=8o%?a(B=VmUIG0}PU@6t)xGIWReOG+;p zBrxg{l7lZqiSTRWVOgTb(`YqkxZ> zRsVHf<#Heo@I24|k!aNOeD8C>GvY=7{$Sq@^!lzj0QluwQjx~z7Rld{-61`uCpp!d z;VAJxR2$}EVYnpT&xg-jl^cgSgd=sgSO?I2K2LL<)r4QJIHTOI zux@rywZgWh6>>@;#fO?s#mJ~d!~wle-d!I{bRd^0D=9bTXFaSI8`@wHGn6`p8pp3= zuPLk2x#1$FioS=;WG*Qm0M*NTW8wZ7sADK6H# z?SWjUo4bN)>F?*rf<%Tf?n3L_x>1H?YZtv*uTyNtN`)2FXysK_3c0i}lGYhIi~cI( z@hnJ`MJp5Wo1^`#fr4N7rRXusd1+@P7wM$a=EflVpk-)D=F`xgr7nacArmT|oa+CiKs^apr==0cg4M+ZL6 zR|#ML{)VTT7HAUHHF&mE>}c+a`_+lX{0 zSp8@-nfc_mG8)f^i7(dU6rVpCZ(lF5SFm_!Fer6SY}JuFJRox3S3Ho%`oxaUWTAeB ztGSJ?Pp9Jal=jHK{czbT5*F|EFE8B16c7i!D`lrxhw~`Kx3MDkR%tKJOFf$iiHD|il+lV9%Z1yag}PC0h1LEc_@R5l+c{8;C^}FB`_Y=YQ(2~G0&pf^Z3G*-VOx6rUeC{^x zi^e5_A8lRi?MzYV5EzM?V|WC7sQ<{3h3dITn8BLDKHhPXrGYZp6G3mucY*H<)+VhI zkM>WOUP;jt<(|5n@YD~;pSIWOy^~LC1$b-AG{EV90PrIH)_=vyJvEOE8$}W{XG?~;uQ*8TjA>&`79SDwp$*h+qPKW5 z=eG8mpjfn+b$M$OULkfH@-WWQcf%bRH`%+@!RXf8IoGSGd4*ThzZ)0vlF_rxT)K3M9x9|Up*q9#x%?CT zHvNLBdmxYB3Le(#&w$Hb&arWO1qXS?#_T}e`n!5b)DP%Y_e& zL+w6mnjn|Ik20F>!@EUvyshG8`0a$F^_7J;tv@Bu>W|B+lHVo#8SEIZ>BQph0bp4$5dj^-eF`kq1D($S{spyNjA?c;1YtlpiXoDtR40tVD^+Rmq_gL=i0QRYDv-huPY&SJe1=w0K3dGD%WSQ|G&fv?SG}9iD zgvettjOD}taUEw8CB?Rj;&ydQ1d8vq!Y$(@OX|Y`;X{(?1S-^xflNg@d61}HPmVnHr3b3N-}JT@9O)@Vr`QSF^8+DgURuwK-B^u%~&>=$tGh%#xQrE_)cs$4_ECGBML<$$Gai^|HBN;`cr? z+Q}sZ{n;qbI$$rRd#{4_B5yL%$Y+Ho8Q6>S?m2+>BaSg(e4k~z0@mS~Ox-{n(+w&! zl;GvOrmWY-)wl=m0RKkCViqEw{g-Ygx*gxno}_%lxF>iDIT#<6clr4cEAFDY6+Ar7 zL0_($S^0f*IGxZoAvK&*vf6w|@=7pVpJypaP!gl4W#$c{J0g#MrLno-7tv}tqF<#? zCYHy}Q+G3W#NwF4w!~Q`@sF|z_HnaAKAM)rrJD@CWIWY+7ro-^?Kav@Vy(Ok-)YAi z{JC?JuiVu}gd5AeCGIzPCI5{3y-SZp;h59u_!%8Y958DvM>uTa3U3g5rY1Wfv3^g% z>zri?FM|j3`{%t7#{}5YOL^0YzdfsSZseUquiLPUWqFTim-v~9A9L>OE5$7xRav)9 zlM`lpx~H`^cTRZc#gS6qAz(u^{!-BY?e-Uf_9%Y?;62U<1HKuauXWPHU7G>lW9%aU zzu~q%;Jf_Jy=8P^2yX~{-0)uT5c`p1(oaXii5aZz@+Yhh!Wh=Q%AxWv==bzLXp70W z$S0bK*-5Kn4~i>>UXkakJJYZ-8F@y1m-i=m#I#?$9#1mR&C5h#;?Ssu@tR<(SVZp9 zL;AL2v0|7e#<-1OL3<(p2M%5oY-61j}(eG+M&El z)Fz3?{UK|uv0Nez@!ZdtD4FYNO5Y!t2>gt^U^&1a0|x-#Klwia|82Tg5A^w^TLtV% zg7X5mQO`HnWq|)`dpLNmp8J}*gN)*hfye8OytUY$oC3`VR%fgpnzZe`vIuL=3XAJS zS_LH$B@j>B9PJ&GMQ=r(VqkGU#I+)$YW1|E@n;pb&=&}&UWPI^bP@e+_=k!@T1bXc z&$JiyQIaW|37Vy*5#njIg{=#$xJUx^rTt{tkNv{#%uTjTMh>u+bN87>sdx-Gdjr+o z)y*uhKf?CfE_q)&pAcN_cmCm?rs5xj1N=g7KM`B}r!UNV8$Tg>=AqmR1v7|G&bJO8 zd=2CgAX+d9b6=)mX9ejyzXl_lxJ8ZM3Pj-YX6J2F@q&Jlb*lQT85(EVw)W3@+ zJKjkbY9$i8yM3OPnkZ@Jd6)G$v^KD%dvj_c)gRyGFkA5Y+aNy4s4oK;5sU_LVSoQa zpwFpZ70}yjuCM(5VZQ^~4%-ZHzuJxhzb^-Fs&C*_a%XY5qGi<=sIZd(;8z(yI^Iv01b zxT|rM=9Ye;#7gn%Mwo_#GU2R``(&9ac0d9y)0!rF%jyY-Sw~CI(CThe}o~6fP8}ce-9Q2Q|_IUvBnaqIaspe(CUSRgG`v4w6xvD$bF@pD;M`bkQ_jocS zV)Qr4M0xUTw%VvCy2rIK<~sS=WnWI3u~Ot(%DZ@N@1_^D$u+Zy%R! z>Hr(LGhvs0teQ#d#~7^~f%ARMElm8P_?CZxvkT!)NDWT)lo9(9wg-OpBx3U=#r|iW za&(&Ly=R4c1>>aPm7~I8CZBG@OblZTwSe3#=#D?toz*mjw^JJmTWRx!M%yzPgL*8M zdxNq$lsEwjWx{+%?MR6BUy}}@=#u*$ZEk}$jyUKToq1MS&*mth#2&PCDqQ69Ua8js zo}c>TfgbPiz6JI`=4=MWx)tFqfj?rv2WT7ZMRy_rjE}BC9)j^Bzim9w=f-=DhjEjJ z-pf2tJftF&91ADfSf3Gx*ivDS*O($2C6T4F_fUIK4eP^WPx4PY z!BBk-j%{T+f72mVcie9M_FWp!$9ZkQ4)EY?U1Qsr$S^lzc*|@HQUy<~L0gN|o*oK@WH2yTV*xV&)Kh&Q0$effoBYG_&wTzJLrqAM@ zr}hcdjP5mKDklCPo*Rs#*dy%2lB8xXw9?)^ahZ91`~llzaeL#S%1+jo_*wOFa=m4SBNE#fwYmj1YaB++TQ>RB5&me|wGa4rsnCAKiB zv=+ZfGK_kRMtgQ(c~yIbdHMl{f530~KeA+DVbhb;_2$AZo}S5l>Nm*Xq@~H~VDkbf zy(X!B;6h%P%-52DcS*J(Gk{HS@Y59OlgY(Mnd4L9e`Ng6$vQz-pbNY0%>myAcNFLk z_j}iY{xQwB10d7009WzbV4-DRxci>;YS z&mt}%M=g;FvuMXTH>eyuI%+~C626m(KzEhvxUl{WG)Vgno^Bpyc*$yKf0lT|5MZox z{FJ0OI9v8{3{BjpfmIq?6Y&V{&svq4i~fZwb)EJ3+U4kM?R4m8s_Ujm8lT&e>c@W= zd674kn(lvO<67MK>2?D<`cVf;C;)Y9=QJ)Rbi?m7NewoY6)5W3OONj&QRHE5mYoAa54CYHZIKPg6 zw)3_F_M?{{0rvWg|1?03e-Ge!u{!|#i+J`bU`Hkp8mf_Rb=;M*mSi(=cj#B>gt;zJ z!g>IwSPPRjZ*Ga~wDd?=z?8H47<-Fyn8CV^${D;Dj0V+6XmH&&MlrbwZee)9%GUKj z@0cS^9pMr?p7_|HWwmtJ5^MBTG`{^$@lgI8ozl#~-UuJ*3#ii7;rIdF)u?UM2H_mi z7y4y{A!lO=R3q!{l;bou5RMCFxE+Dk*V+Pq&l-_L{_F z-V2Ua?ybPSPVp@TJjMo+fW0;ZN&uz=E&!ev|Ihx4NY_>1*R6rS^1D!?0CuGSx<(Tl zMvJYq-8{eLenLa#JmkDZlrVyx%-w0yi++rs#O$n{j67rxQ?lbuLQR;1Lp#8~P;jX7 z?JGXZq-2V<@rckYwzNeq+J2N+s0h{zn@AEB$}o{+*@s=g2I}Wiw6*g@BPd#3XT1wQ zLCy}9H_FF@swccUPz+A}{^Ca`A;4Wg9 zVI+5cKxHiDOchM=?R9m;lLdUY!QFuvie_4J-R$3D6C&u(XxuVsDRih>&e&u9Ie!ToNYnMkAFhS@}*kBGzT z0Kdx;v+a$SAJL=W7G|Azc@rmZwPm>EBx3?+y6LzmGiF6BO7=wEap&u%YGM&Ti>V8T zuj~6mWxA34?xvM2fqn_n$<&SI(hcUnH8z;v^DbG(i0`m=)@?WUz+2%k)iLCLwJ-Q_%>>yU>3v7+piRJleqOJv3Mec=gpUO={$;xc)w99}hGIdi=LH9_afL zXEm@BOg_ib_}o58nXM5;N&5iL6JlO*QPXG9wWdQk38p`YbMb2;)@awD`Lqej81e{D z$(p5Y3z@VHtXlnb-a5k*=&Dx5+hydiZfNt6i^d_L%ERCBA`FSf*W8Pyf!H}=tZtS5 z38zMUlUlMhoHB}c=$pW&3i;9_EW_Kl zmWOYM6WcL}m!(}vcFfFnn3iOZ?TJ zm?Cv7jI%KlY94If3;3pQ@dCMRQ!w!3kopTC4#)f0fbS>aAkapsO#05XZ*mggdo6i0 zkQIW~P*dA}>5Jg6+;65+SbIUz<>+*NY;o{P<~AYlP{BDWV+^4M%Yw7?z^zf;+%T`s4nO!~%;=`l&A6KOjyO zn1w%}HX;E^_*|P%&m^SASNmD@D-v2!vz<-qTO{04Tp;h&5b+Ajo47w1F1f|BEq)Vf zre8_l`?OgbOG1T7&ezHBOVX^4_^FZSY@L z>UbcpB%^?@G=30>A3IoEf+ktiR0pW3cD#||Uw~E{{HoK6Y48kFe=Nx&fm2PRMFn;N zd?rBuvW*hx40_?879})Qn~$)y9QbNw2gR1kYjL+MY5WZ1lElZ>S)!JXMM+&PgQ;iE znxsPkzM;;0iIK*1vWE>%xK=S&SZDlMf};bGPqKONo!FG%?CAZbukd5l6nK#I*V-el z{p5y(K6P7a_a#hDMCv=%+Y@>xyso)We>`E9^rPoV{kepx$Vy98{qSao0{h$F@_WTS zOB>$@nj-een%QBn%o%_*{B2B5|Y=HsiJ@xCp_aFHf@LbX_ zF$Hj}O7G=s;Cnh_oWDUzG7bUGnuHy;2Ay&q{ExO~I&Zc1rE!1=<4rS);37*bZi)&ja zj81%8yQh9a;@J4({$U&6CjKVQXZmkUOiWhhpvCpa;@6qHV!wY68Dh#5^VBJpe?I^J zWeLZfk=kyvqIo1UIrZ44u_ZU$XHu?g+*3;N+Er~Cl;w$B^}xOUAp*EGCuVfH#8XJ)S#a34ci8m7Q>0VjB? zUCqohiS|`%?Iq@uM0WYVZ8WS;>80)H?p3nDqR~m5dByQ~2mM0F?LsBFMAyeDFR+O> z>n6H%d4nZInwxG(j##|Al=3`JT^JU^JDr2 z=x@HO^Tsq>FVhbI*Bj2kfyeMJ!c*0why%Dy1XX9?OYpbCL9#Ne82?$=i5re=MLom~ zs0-2vYbE>&KZTTVdjdlIF)~PjFNJ4B&8hea3*vWz+iu83eq)l5)2s*hGtVvF(dx!{ zAI}|LyJ{R=!_4H(k$;7Mb1B*BDi_w;*|yxMyo;yWzA1iG4iwJNhseLm#CTgMo*55U z7)SHk`6n91hU^vd{Xs^qz#I$tXPGu(7o+vwAI#&3laU)emo06D?N&Et5UWu*tF({f zqBTRZrG1zqHBqH z&>{FD?8HyPZ4d%^h_g{8Q~>j6HJA#RbY4*#tYAq_YyAh z%;7ar#S;A)9$YW`f{BrE_sEf2du`dkv_kr4tvU9?^$9ABhGQNJnOB$3P*EKxO!Th z!nbUpBik}sc%pGj{hdG_WY5Z<1lxSAi+kk6qMQ7G6yZ5PN0Gkmg+sF)>_^@+1tYV% ztUcvvlaFU^;cfNy%tbO@3)*|DvMi}hgcrO+Q)NjI@dpDtW{OSBA<(bf%ackp_+`4g zBhXo{D}e7;`y{|qXnzORW0BTGpx?CQ1HV6HR0GZl$oLS2Y?fdOHWpq6J%C!EpOJ4^ zf4&zHqT_HYx*L9pObg_1-Xi!L&c)xO-2_^}eXJ3>KjIIb8SRN&X00jz#2d*^MIJ1F zg|2nK4fI?8N*rfkB(&6rH)9;|rpnd$S=V^@bfp$4b54Vzst@C>?0PO&^&J0ZUdbJ* zcuSnuT#V^0%fjzO_HkMRIT>Da?sy9H6Ld*}m);H5A9+il^WF@*3XOnwcz(8ZBHBTh znNPL{#8p8fcb#>K@CkRW=CpygdZD~uvVTCNWnZS;rk_wL% z#ATKDEAZ=FPa7cDx^Dr_Bb*69raKM+t|c}N@aJLHet^5ja2SjaUWU4_|5?>JkfAvX z-pU$;1zJ|f47d;03BHHiK~wP?+(_s=>_fNlLJ$SY!uN1c{sx4D-VG#EZwlwa52|Oe zm+-ptcf$`NcB9!Y1|GYih*;`2z&EOnV}U)IkuH@eKH7=GkJg)!BwGSJyLuGf(|VKt zS{{vGGWgjql`i~|d;{B2c@7)Kw+8YQbugS@mwTF6M$w)5v0l=_@ct5v^P)}yTL?E} zPTB(5%V3&m?PyK3g=1Y8tsn6}pQ7N&Hr$@dZ+wcK`8%Qluf)5TfpxYuT7@IwgXA}Gh z4~o#o4rR^dt$;Y;htPwL+fb{h=lEe~BbZ$|k|=Zh4Xv&`jQQb#K@0dNy`$Vx&KSXPFYQ*s zTDY&L+9kziB0n)_oNLiL@I)8K5s6)b&)CnJGticT4klUU0%Sg?9QAk(=RGTQ6B)ii zd3A-yi80=pxqlaY#CCdS(A^fL3{|c{tEo}r0FCW{|=^E>l!#u z5VVGOtK+d`I0a|%gM_QOUaS@Jffx)Wmr4~CDe{X9GSy_+KLDso~mFs7rGb{=SswhD+ zjc4F*ijHU_?c&%GswGIK;4Ck=`U%{WXdQD~_FV89=P<$6qlQMytGs!P&v1z+@;36A z6}#Xb-aej>(Kq0FCW@)y1R=SM(!G*nKu0=TIpyn<;ZS=M>wpLt<`~6mhjD)74#bU2 z*PK?xErq{&UIf|mvywTJzmNz&-}CC1k&0alQA#912)TDoT|*di>13#6Q$Wl z@CxU8)0VW|*fCoO6SPL}n+p82(7zAFkCvV(fUnQ}6NnEn4lm&P(7FZ8F969 zLZbtS;_$1G9T|a}h3yKaw%8fT8zHn}%N%|)2k&T1V`-TPl z0qZBjCEBTiTV+$=Ub55Bby*N{8a@YIl&Sb_h_xIdc2vwYQ79{2yPZplI3AB{nDIL2 zj<<_1&-^Rj>AmhtF?4~SdV2dt>mH(N=7xvVwM8epg8~tJ1NOqfb@$Rsu`}~bg194 zHLgwGVnks-X1I`Dg`Be7bbHfgq8ej{hp>0@{Q&$l-nSm`jbJhW*Hw;q!1a>(4TuX@ z=sBQGc~gEz*1(mo(*wSvWey-4${LQRu?6^b{5SkTtN{N7YfH@J=OZ+di-&HQ4gUlS zh+Yv_;81i2CSp(FtcETkr`HR){tYL=g=nlvw%dhI;Y7L7R#RpVf;2%&0<7>FRVZ359QXE#r z>mB_Wo>_h`Rw;>i8wv7rKGW zE`CJi-`bztyWpi!a`j(Mmf&-RRe9R6g40*_66V|TSsNkM&QLt#Xe3J7azC*-PbZ}hYYee4^@2pYsRB{Vo@PFT}B(Oh# z<()mG1VO%9FvrQFbJSr=H;1NhiPUOY+R^;|KNNW>#5TySC&l> zC8~z;#;JxAt=13Z^<1mL5ME=*$o~;-R#6tao4*L_wi@A#g*y;)tM{;1!9SyO8f$o~ z;jYjs<;cozPy*auK52a)j~1FxJtAtX_Z?It+gWkaBS0nv*1cY2w!_(_ZNmn*!=av4 zx8Wd{1DPIZ@9`adBaX=5i6Sh1mN0g|aHoE|Llf6ot5F?f^l=kdZPhs*g>*E&S)K05 zkW3Kes(8#zasjDTY;o5U)2LI5XxBY{8D*6RI~Hj^k&(*v<`c5zWcw8ZObgtNO7M*3 z7ArHfxN%0kr7hF8$d_Jb9l*pDV(A+!GUj7`URsD{x94_lRq6$U$vZXMm~t(4v~OKn zQ1U0iSC88klpuC>2KC$|mjJ}$%Z>@k2Cf6`)qtbPvP##WmzzQj4YI&+5b#da?E%*V z!-1NHavhqkze~sQ4-lp5o0@~{J?Q6hzJlcTMB7yUu_}o(4QZ*0s@6bv&^hu)3Lm@< zzE{<1#oxSrNSdnW$|0}>y}RyYbuDKXQd4=A?P0>vzvP>tSnpw|X>^hR^&EyvRF`=M z<~q`S#Y5f(*9l}|_$aK-nF%df_X)plyA1uUju*)-)A(f((}{bA?t%WutLtT|rOe^D zBIJO26Ej@Wh3KL9%=|8HNj8bN?0zgFs14)IQ z(m$q@42{@on8chf>X%b!`rXs32+0{~3ios`9Fg6{yw)?bU}@G`Q>^Dy-k?meajG{g zw<4ppTIlVVS%W=Rt z&6EYkN^$M4fb;ZNEs)WIfq?gFBu@X6L5zIFN$pvEFfs{$CvT~J3(4_M>T1<7_%M{a z!L06vRH9B)BDfE^3W3S2hvrB@5#;W(e$zd3dyf0R3k&bDdr{ql99!=?(LjALwt#=Kx7?9D4I%A0OH;h9sgI`^XKw5L!0!JM&1r^lar zEc*go;1%Sw%=)8zq&FmUea5fo4Db8o?WuE74b#KXx!Fs1A*k=ln3G_faG{F<-1<5$ z0KVretAIXSKM&|j*p~tCZ&)1AhvLlv?`tqi7iAiZ#^AS<>Bb9zC$6Wf3UwaKwCN|_@TxnyKJr|QwRRxuk?Rf0 z4(v?Tg}H^MS9OdMy6>a!DrK<4H4tqU+fLBf(Ft(g^C+(%U!&K0 zcIFo4b<-sIXX6UD^9K9%#Ji!o|_zw+PN6|p2; zu3iOSQ=|)4J0lUU@;Z9QH5wT$>xf3V6oS9i!{9;A)_4pz4P9vOjh2;i@UxaP$i=eX z@Ynh)@R)Kx@oVf?zPEf5-Wr+V&JZ6Vj%c5G8VfIyXEcf4e%fYYx_YZ8$Y>Xz<^0K% zn|6t7n|5JLrkB(gsLoYxI*nKU>CcCF$nn+ zmm!e;J|;s>AY9E<)P)R3W$IDrHs}i!q5TVbfpGYr>02BvFO~m7vtBSskk31>)2^5h zJ3eZzZddgT-sH+Y$Tj<8p1m>*zv0LhuoVN)t@a4`X5}&TlI;cDXT>W7v$Vt(#5}}1 z7`qCdDiSdRYb88FR*e6JcNg@jEJBls#msg5x$uDIz4w4w7Z_Cd;CXNTf$Aa;_dc@c zijVOoF@e!{Y8@QKw6e`7n+P^K*IHO)5I)KwHMJtb;NzBys%$)&9~wQv-6Q8*(JS^l z=2-UdqHe+6m}OZb3%ylUOloFzL5X5YAe$qezns6%U70dHcO;zRu4~pZyBhE0dSX|n z%kjTTg( zOg(CR*CTWbs4?(7=BzWDY=zEuPjI?~xq+FG5=YZO|JLu;50=inWVp=KOuv>h6?Q@$ zU2sN7$u*?bO{R}3cJYR|FQxVgf)O^?XaVp00Bhbs?@9{%OeFA*DO8W!8C2`;D!O}Q3 z;9Msqfj>9+cEhm(K1qDy{R;8mNMa%Eha)N%qm$t0@D6T2v@gF9e#rA8D7!bW9lJ5y zJUErVAZii+sB$G}tADrf{dJSdQT7>$Hyo|!`<<#wKk z)f+yHw1V1H?}EAszw&Y`PVqzjr(Zq7yUyK${8AC>Iq2>sispA>-nym<{m3oXCFjw= zJpVh6fzA_15}sw_I@H&NbG>HlRXXtlYOsiEvXG7azyqrR`_ z4w2*ojvi?r@Z1+47YEw#i{kqJ$8+F6_I9d*Xl?Z~UKhX}aq%ub<*Epi4Xc}t|tKWjU_#Yb$auIYaIzu` z0<(3K<#5qHtck8r%_(e(kD@x*ALoD=)K{X9z3hQ6)* z!t0|f*DG~*p$VE@x^~*H+%=l7`pxuU&SzRdXKIJXc2ytLy{G?*dZz48AJ8s}&?;Bb z_vzys4u`(eZBd_JodBz&TF}c3J5e)hseY=ZHPVi|OqXH`^r-PW=r5VVkiU3)wX+O` z=r?FF-QRc}o+0S3sn@@TCqQD=F8wNq5j@d0)%GasM9k-JRU~M7h!T)($~D?5;sIi> zdZsfG?eOy(^60(TeC*fd5`7muk+4P^X(cin*RZN}gOMSGkejICLp!nN94^h%LPfDT z7Q+(VsKTP`7J*R%O+iuC7=ztVo8Kd|sm`iL^O|Qo(>F3{a@=WG>19TKR%yz9y4cK3 zYniw^FyGP|`9XMsHUrK<`c%MAtw{v@o+!=$xuC2)kc(L(!S##0RzPn8uK=<&^a9)m zU)61O5-r2KuIOP{sC&&BrB2rGq1SU;s8$&t7`&Xh$}zeV^x38rs@=MNx(h2tDqHKG z>G~^&$m=vMbo=F>t5YOi+(ZO-r$>y`@U0zq6*F<7}3YzLVn06s< z$VDd_|3V7kui8lCN&-Lw%Kjz)Z*6WjvaBjb>1^T%rTlS5N8@gO`qfCDq zq-|>cl+qzNNzFHYQG61b=z)N9zP=6c-^nTo;JIJs0Wy!>0r1?mt%c6ZAE-ybKf+T2Ks3fh z@=baveh>?;sxo8-{C8v2JzWNpj+@y_3_TDP!RKWeFo6yKiJxw$5OgN?3mWSVHlBl| z!#lN8wb2Eff*Jb2o=W+d`R#P61|lyhuZ2F>h~{SH>S)Liog>LH>l&NbS%b6YE6*E0 zq_@lPYp0lgP1dA@s`Q2{+8m;(t{LDMOn+}TY*5_<{3eDL138G-62#*p@FMU&15*9n z|8WbD9QX&&AMH|2pwsE|ob~eC^doIngjqXE-%UL>{E;e5w@UZ(>LS&j^jzJzHB03W zwaay*<<;fO0)5h8e9;Qy~fUG)xmD5{d9vLmRk{a5A5! zU&Y=-J%ZWvT^*dqFEr3QjU#fG6dc!Q8?`xy^TqnDMo0F-ytBGxMow0GZip_?vMS?l zb^*Q8cq+9^<^p=6X-VSZ)MLt{`e5BaqDp%RaO|rc47k2g^#Fby*eMw3J>YhL?@+7; zyibc=0{+_re*$zTR-tI93#ZBYYo)X_c1?8=yeV>wxa2kjg^W!Mk{4h9)wO#X-70mBlwN}1Y zKN0ny_F#4(vLD4q1T{5!pm}(27Hmoq$cRK<2SYBW03XJ0VvOK)BQ8OhVR}S19t=AT zDP>B$3(|#t9TW}o~bsGa7eoQ@dgRV00ORC=>OPVg#Wa{rj zgZa1AT!Tq)jQ@9KhM`1oPcT>gRww6A7aUS%(SzVE@DpV|eS{YVU5QDo=*}&I4y`m) zvSP>c>Q~QMTVagg-^4Q&7fd4q^Ol5xJ@oMCTlhV;z%*+$MttUfF-)xJjUN_>OijwZ z;m={Mak#b&{{y+B-=lnh{)kMXKPisFg>X7;)kkHBiks6uL$maDMMB*J11D`%p*@i0 z;#9f+0x`j`x|Z1bq2QovC$w|vC;69 zYB`=8bRB{eA8>eJpq$0FoyJq$%~RR~U;RHjffG&z3(ON(#p=vzC~u@03iSE(a1a;H=q~UZ%ER<0 zc@6T2?#6%k&O(z{)JD8i5Mg5^vUs)#GmViKcqHFPKm13k)k2u zS>!R*0BkOKn)pCBixndqMWal=BVcY{6~>{7-Wg2^@ID)}x=3^ll>jj^q{IdZc8 zzN?RcL7&(An03ZDq+flBC*8bMu(!4*Fb-bBZ&S0DnN5FWDZIbA2JuTcYaKHjGtg5p zJB3{gckyEtJEVi^-eqYI7DQwBxT3*S>v~i+dHS3EurkxeG_unpvPwOJG z`@DHgQcqBWyhQf-q+-cc_n(Oi;zx*IyC?hiYCgJH;MuT=E3oP@aGY|AfKR-3WMU2a zLdW-c2Uf=vP(HksEKge$M(4ZIGBDR3s6}AdA^9PLZA@R_Hc}*Gl}N&Dz1@ zX3`W=qdF%%LM;=s(Rj zuF7cX71uQQkL9M4OFYIA+}pj!Li*oL~LF4(b!D5+b{{AL@4&Z%QOa$6p{vqtO@S*G%w{-X@f zG7Z`4al812eu8n1C5{Qz5Bb~SCc1mPPJBw*p+3GOG3W2N5A|4yBquP+So=#+c#eje zTf3vMXZ8W|g+I4|n-wHB`A_AZ%a}y9_pQv5rzJ|ycxEImPP!@PGMM)l(IYPe)&UOk zRgw+7YCSqI&+Y?b2OOWdeSq)p?o^ppyx-<&$=Jj{B=3nfoF2);7rgm9oGidP-; z7}qIhvda~@NV2d~Okd@A!8W1MvkO-_$78J87Vdk_Mxx-l&z_&0F1&B;K<{g|All?y}hU; zUn?10cc{>x_ka@A+6oTl-XW7}KIiSt8AQ$X@68cr-x6=}WoPcs$d?@SOiyG|GQ@+K zJ)FQpCj1lj;tqR)nm!WWV(1r854-hjm47aMa1uT66vbmOVkQmk%(#l@-;B8BZ{8E z&q6vPTdD^u-d1emiq%6{I?)}cJ!U=BkE(NyhDroM%H=ReOF-5J6kYX0=5xK?1Q zn(IE;)s&dyd(Q+$Zv|Ptt)3N*6X*hFpgXWC1B-C@?3;}wK1DSVsnXwvvnZ-Ir7*eh zk|et>G$5x?=W99@R2N($Th+k%&+;>f0-qrFkK9|LYrf*_`kV(KgB;=~!JVT0owrZmYTzokXw5rP{41 zk4O;h)LOaOa6Rf(G^-f7A(m^^*9b-tzu331d%}U0ht{{qV5nL+%gTlx!xcn3iywa; z?IViJIml)1DJ+Cu2d8qAvBU6ZZq0_-f;u9vafGrzG>A|$S1ejr2V%Ux-j~Nzkdhin z%`taiCYk@a|E_B+CieI8_jcXGioEsScxN;o&B&P(_P|tCdvRb!(rbLIY8Nt78;`dk zZ~8Ox4;Nh*AF6qjce3aa_0azH9r(4wKNIi{^Cf_|vcnzwz^1bw{b{qaHH9&fS?jed0Tck0n$AVF$mg=G% zM=Tai5Vxz2;>F`X37cwGa{57PY_u%2G(`S%ouEp=ZiDF!@8On$Yw)w^3SFPY>iM_GtxeC|xz5h@-}9i@>m6X-L~YG6zU zc%A{iKKD1^zgbLYz<-rX3;g?!YDk5mt0ge~RD(!}cn3X(ds4DE{-EwTYL*O)(`k?4 z3>7W)XeJ|*Mf=39)DIxOs3j>4_f$pj9-tee=gNXrtycHqcB-(I4-k^V*wA0-KgkxN zQGz^GJ$Xr(%I_ybMQWl9o*f#5M+h(Q-iD6HJw!s~>Wca36m*rktMYP8)yjUVZ;Cgt z-`&RVbq*1>VJ6m(b;poOZ$R2#x@1b@0;1X^~|KwO^Tedfr) zdD`|4ljS`AQy`1&1=U9M30~nkobs+DSEzU1O*&q(fcVY%Dp^ueO7wNcB-a-ep(7kn zV&lSk?7nTW^nIQVdT07ebtn7BaxZMQO-gxLItA~>-1qjV|DKPuTfGx-UQkm8{CS#p z5b)iI4j;QZK~^! z|46aL+11_QU&yYMPW2F$3R{zHmEWQ+VOC;7X=;^;qxlaT4R(eQtvKg&>%}dFUn6ojnW{>x6u zMpy+$`#+YXVh_|JkGSLobk^9$U0>7)j@NB>L4`}?R^@1SO#Z;~6G(gai|l$WLXu2T z%D-%YQ~dwuliuWl$%cY~#%jR#v#>Y#n^VZypgp&MXa?jD`rY8U1$_8lFFQ>4#q2nZ z0W(@8+oYRyB|4?}s2Eio*UY9CQ&x4EvP7gL8zX}?eQ}B$h!!gk$Ho)Sz~B0pnV`44 ze$j);X^f*Zl6RU+W#Uyc`01pCvC3x&9*8PjNOe{076NiCk*9OUA%7aAs*ADhqhI`w zozZm{Y(m3CcuZZ41EN{6(`v^$ep5Xu9aUp+>Jyq*e)fdq-${51*LV_h zdNj62gyPA45evR z6t&M8r5YbQhs%RGb3wneV-sG5kvvDJ}q@r&Xt<4f2^KU1&+b?51>bu(`Y+dk0 z^<$jdEg1-}zJ=?nQ5n3Z*6BJ=D_Mm#o81z6ZB?CjtNW6=chhx_Bv)}P9t9I#YY}`r zdbBjT?odgqGT^k=w|{a);$3lj&rRPR=^gh<5NB_=Zh<(UaPvs@K#dU#~c> z(}WGEOQegPlZc14<+h)#TLm-g#=7=fQ+PEsDwo1|eC2O`E|Xx&Ulr;Vy9}DCjh{I7 zJCn47Vqn297L0wJZrCV&9dAtnGW$7e^FM4423ky_bRbR>O09V%sKDQW|+@THt^f)`@Rnk%PRx?c6u~` z|8T|u{MNxN2K>9b8w0LUOa-|9))@u#^V%-tCzg;i(6UqVmTJA~i@Cj2CE0*dW{w1s z9K;I)YmiB?l+YTN2;Wc{LZPt@9!Y&BRK^a_GMrDWp(iSQTo^ekpU1yIZF7I6M?o#5 zKe~5lHgkU$uXVMdBY1nnPaQg19o1Gm)h5#VSN$y-s*6%&EBfLRV&saMielCSN**1i ze#GlXJ@sCT4{=3vCe~J#CA#k5Np&lo^^VzmXYB!ZJKHplr6z{CV7XH{-e1VXn!80k z^lWxlnu1u7&RFMBLo)B4VU97W$xp23;osqTH2>>Lg9nFrqboL z{R^TAQ^6>)(s^IIoa3Tu9p5x1ti9Aa+i|72(R$%|3!%(jIh35F=v@vq z7U6A)BHnS;VBSv3$(0254ojfy-X-z(ot3P;HI?Sof!TN;YjWKk9i=hcTD~X55nL76 zFV)R6u2x3)A29Q*t(6ZMk$bl3$ogZB366uNfw9Alc6zkxS@|pKX$`9oF8o~@T6eMl zD%>i0RufjBEciomv}S!Cx1gtx^80gg^4^OV``cs{=T?bBefepT*?lB#&s;Jj<1cEa zd!YA3!jqb3-#ORDfS7&R4*~tN?;+r5V$Op2%=R1vJW=NI_qfe`_v1d!k);jy!vnQk zI8qf)z~(#(qO4@3=@TiDm?)(whq@-7MWq>8q(D5Gd}p|V&mlXLpY>rVTlASYrrR4e z9lee}*3^~_RCHpQH1pWeWRc^B{t`5a47FBi*YO_;*BQ5~=B_<2Os4xNdxk?IfAvb< zt~FP2C2^7WZOw4lM$QcMPIpj>#0f}Ibw+p&>GHl2pLTAP53VV6w{>%{do}O89;b&j zsz&Ww<_Ik}`+xWH>~{4{FXFvpV^;TKRE)wF8a2y4$x&t*4=vJiD@W_-ayxa(pOs%# zR3+VCvoWu_C_;+WxN;vCP7<&1PtIvv_)Q$)ADZjNpz|1ziuN?a?MWRM9dF)jXJ3}iHs)=R<-T;U#a5v4P9$2(D}ftgsJ z;37gLjG;TQD+MR;G}#~3bt<7CQrVu9h@iUpy8Uno+!XDhWwD21Bcgs%H05nWMi9qK zN0k1Frr{HyjzLEL333Ijl1K5El9@=1tZS)=jE4zjxH_5~;@xE#;ELqe`?vVa?z5=T z-`gMS%;#?R2m0BZ!-EN5mOsZ)w{Ev*hHtCGS{3T{GG(^O9KzDx(aBy7KVy$X#~InY zXzG}^Z%(6%tHMQ5fCTnBSGpddEO2(gsFqzOXinX#OG8fWAu!#nlH;C9!R|)+1Zk-!&mir%)4gR^p#|1Ky`TV_|;mQI1q#Yc) z!91CBKS)fZdhz_~Pfeo;9mg#*>$-4XX{-6|m46d!R2SeKhNEH!Z>V4z{fxTE zD&e(KZKW1-dvY6BM^TUQdn@9rj*~5LMMP^=VD~y~1*`WCyA$gg1I`t-LjdP0UlxcPKe}-chwYYK zpg($^Y6;!I|FwQR=>PBJ$OYxC?KYq{Tx&S6>Y?iHl1b7-S~=^jBvd+qju*_3>=ED7 zc7PMbAyhGaRIpK~A+J`RmbJjgh#;;`b)@nsxM#jw`2N~V^GOh7jF9Y?4}ezcUE;>t zPwckpV(Ma*F!q)*lm#K{-PQ^$M%}vhHP!jwOkVHAuxl-!s2`&k~Ddi70Q;lhrhtoOnV&RAa(y^s{)^* z=`4(5u43uo%Y-ii>tKsj)xw#s!8n&YTA1!kK}S~IAR--icPE-Yik4Ia|he^ zeChw#*~O114w;0eG1?TdK|9lyq_R*6h7ER3&>PCD8)@HKb%~7A-?Y8e%ppIl$+SJ8 z?-0w;^_FC#67vf`>o*1JI~=W2zb8g&Q%M#xm55e75YJ?`5<%)olE6A3Vv0;h;cge6 zyy7Ia-brEHG9$Ido)sO*o=5ez+|uwX6{6vdugIQrw-c-Q%iMUg50*s32;bf~r>TuT z)_*dv7xEMH2j2n-m)v9d+pDJZ;un^w-lxP_3Ez_E5oljZKA3-W9XGEKBPPUl%MdQk z(I3$M;t>Sar?An*z7@sE8BO3ny;F*MW$db`^L8vu%ZOGC^P&Yz`Yhyv_iOHxv$vJ>S#*pZJEYTX-_gtkh3&lpUVr{6$6?&+Abrh)Mt%O>DMe!)Sa#3DAYtr$$TGez6ma@6E_(@agx2IU^EoS`ei<-?iY1kG?%|sS zaD`Yp$5oh|w$H}#61(9p>$>+{(d3*9_+l z-t??7L>FIdt|Idx0eL%Tg=ZWUH}l>~2}-+46*EDuk%`-x+kms((+$WB<}(-%417Zn z9~7?J;2uhMy)ia$eQ$@%4U%#cm>Oi9CBo7mUGP;r-g?CpCC{VgnnUgDwG4I8P~iBa zs-RN!ukEp_H-XIYPwg{x5#;n}wXKK2CR_^lvGy=Z@k8ibbAR1g^oih@K|o6dJo!IsX-Dky?_t9@AAKB}ka zXH2K=0>8l{u;1J>5@K~c+dHqa*&-;^{?)fqx`axxpYZh|S4mNOxDUr}#{Fb#=WTBo z6wk8-d%`S&_)V5TgtElMruZUrmS?}FjNbDZ?##849iEz`AJWUHTK6v3o5X7#5%AwL zUKWVU8V>>dx14DYxE^r{tPLD*IkSQ6;5ZFrPium$p&Zq}1-cLN5}U08^Hdc=#aXu7 z3>7!Xd1|h`i1tw>hTrW|SBw&FH00PSXsf6rYr3scx0`s%J7B2^tU+yu^fZs9P4F4P zJHuwmM4L#L^C$@!j*E9X8Q~u?u6UR81Uip5T-?+)8J&xCCc9gUD_X%X$?1k(r8}VM zqKD;>!oYe+G(GiGds>;U*K^m zugB$CKYLQG>iGTE5ljc`hqwpkiLNl4Ic~M-puN!CN&1oQ$64;JET9X*L^1yOg0Tg~ zXp--9-iiF)!j-=5xli*pp(;=JoN2j*)J$)9mMLdGwaW7{tu*Vn*vl}@q#0$@3fE4z zDRHd#GN|tYNm;-+w#ai0@Ey!lSQfE9w)f#e+NMdv zW|VBnmcyJlamvih%*>F&mfIw4IF3=4Wyj2R%FNv|Y+<(y+bwRl%kb>w=r;-7s(I`S_TAa1r5B-bPD=J>X(Ig6LCyLzw;o#VXq_p| zT?jp~N2TA(J_t{=H%XnEMHB3>wMjH*91(1`uHh|B4TFC%O|ad>PCDKJJt22~1w5~{ zj|KX`ZJh<$X?xQ=z+;Xf7x0SXa)AAdHUiwhA;I-}c_yz9(O#d2r@-%vUXz6?KmTiZ zgyFlk6nengW$3Dz#@oU$lXC5QZZx+g`LmkMiDaR~F-;{6;wV&?)C(vamP$2)`%+mL z%;Qx@$&|O{)5w0sS#%Yz8}YYRNpHo!syvA&ur=J2h|lvr-$}q z*dWSgs7`q?P9LY`?X;Bz<6m3W^>@A{CPTL1ey~+_1BIOodmS$=!DQx!Li-}iVAM%G zvgKJ(v_J8|A~Ux|o~v=wA(KjwrTLRwK(2>M)rnlKZDi*6yfA^yuFfFxe&<~c=GWFp z7r>GB+o>;d$3QIGhvXAELtw-fn;4rt6DqY7iCbs3gP)mZm`YNY^6wj-+g6KqJEnuU z!M_|bMML|PSZ9+B$Tm0Xg-Jvh;PXZFc7W}r-<1;D&u4zGs$!<65-Qxyk^n|LVy zJa2<;8$OLsLh<@h_}|>UJf{Ag<~$eT?I4^u#+k<#=?(?=H9pGipd6?QtIXs+W!RN7 zS{$Se4}VA*-)1X&2!0Ab5;L0FJMIdxh{|C9piCv3(vvt^_E~)~{R5NBsn&0z?O=rR z-{_*^%n=*-bF`OhAyoj%Q10FOqSDF#+qMB8!Ic(zk0v*y=}H&YV8&H+gI5W4_F-tUZTsHc;5f)B@f@%gYps>=gXQ zGCf(FPlYdAnkUufU4~j&XbC?_C6Ltc;P(y82H5bO zhC{Cz%60RW;49VJIWKr5?$>H~CwZm1C#r9Zb-XF~7F92%fQP7As_7IHcTYuOt)x7d zrv%uFjS?C^-Q@2Kj53D3pS;hI#_`w`Ln!NcZrC|_Fho3dWrRjeKDLA8)|{)b`#B0vJ zXxL+Y%v`{oqBEJlRGL9w^$$5R3$KH5g_$99@H!fnnBV02c<&7&%P}dNH_NcVT9JE^ z6GQg5oyZ=@*`RaTre^kKS1J43*{T1K0ZxquHLxT8;Cuuag}elMV;5Qm`1Xiq0X_wy z0#H7Q?giKXS56oqrZ1KBf!5%A**TK$@aWp>+$2mbAj@X(Mu-XogK7O)1|$Tkp--p2 zhJNCWWkknbq@M#i>z}eVstqcooQeEYvrHq(!Bc5N|g^?PpHcki)(k)^7A4 zlseBEOE*RvYNk_FH>#`$?JRka_!5=|#u)xjPS8(rqb%Qy0=;J}@`ro5jO)l2)Vjvy zKQo3*Z0(l*?8ASN8xch~55G!5mejN9NnXgF^;!pJ|%uA?oO2suaHTXGJXN}Ok?CBF!J z;cdBYY!PBnuHrlu6$@8Xm2vs#I(TN3fYk|J%VSVBGDDgCxZlFAwyxA3*Km}Z<-brz zBZu)Js!K$+PUXS;Ot=}Ig4?FZc?7t>r{HyW_2;~ zQ4cdjwNzp)y_;_}yi+rmUKL2Mtgl+Zg6lt7#B?cpL_isw154tz@b9s`QUAiZ>2X>6 zYPNF3&I#rLcou69xsiOT8Azw20nU_KDn%qAl+>#xgbQa!j`ka=ZIJ>+Js^a-2XQ_{cAHCzag>@ES*VUM^ zfM4>$EClaxs%2?d1Ak6)>&AMM55z=8nRZbd>UD2#Lr>#u?LlU9p@!8y`f>GJi8HWD)<2^^?ZJI%B$MrDtreCH*kk*0nmTIIUJV-_|s3QObON)Rsw%_X$Hd z>)~B)HJtBq3LAJ^^r<9tTy5eFgQo)oP^-)m*O1at{HNxg&{j+{r%sZMk6!+gO;1&u>+?ff08 zMVuk>4EhSirm&>y71|utQn`|MA)+L#BOVp8Qy5_P$3InR;B@XNU1#-k&L!>)?RM>R z?irp0f212gt>b*s{EB<35VlVhPng2B45Lbo@8vXccjb&T_k)J|q8vNw(%_@MgD$R# z3p0JMUE@r3&?(PxSDk4NG{?2V3Dx;{KHFN`Q^N($Ykf{#wzdo7J1?D&tLW6r7&|aM zzjqELz9=BdFV4A(4fYH3dgnC3xW0?I#n~rB1)kU0)meSeYtF39?98RY@78%KlhS5D zC_!y=E^!_2N{!dml-tKE0r|=AdCLGc^=5!^yVve&q=8R{y9V&z-1Q#tAM0o-XsFM$ zd7uXDV0i{G1y7@yIgg=1I6~Vj9F4N^JZ>)1PIO&!oV!|>EAlBXbKAizM5_*FU4{HY zsv?uSi6wwARWxU7MA`;UZU5M(s%NUmszjB66O6p)#OqY0K8V4cqhnQjIdRZ;ypOt^ zbC6e|xm(DmLtoqx|^c6~G@z$>k}_TLSWTp@X_F}^q|$XWGc)I8aGvU0T2ahVdrS-l;fbSFDQowg7Hx2OJ)ZMtA z=7!@8;CZ(#8}J`$yA1eWr0yScfbm`MO*@%kf;NhFXdkh93PQ0kjg_|mP7!}lKjUUX zBGD`LF@Ae)C=#h&&Vw0Sp)!@8V+?u7fYkSxK9xc{rTUhpGlQZi;4RV@mg-m!_#<_L zm19|1@Iw7Q_3YXca6q?Gb%wGU`hg?b8g&W39=9l!n!6k^epQvGy39<~?5^q={oEF7 zYir3DtZ=^ayfyU}E_E&OMOcmsUO2n?mRQn+?;IPwt1M;kVcTf;7SjOk1M_spHA6i2 zroO3(rj4a-;Pim%;to+oqF8U|oW=Qr#O=JU?DhFv(K&Zb*2}yx=u}t7%m>neNQ{%7 z?#dk^)Y(?1tjg{T&omEC7?m-AKf%z8e>CwVXDP0*F)V!p5=le5!~;0MGJh|?_e@_6 z;JbzQ4B%VrP6xQy*&pzJ$94$t{K(okA5$%7)~3s0WNU?BYftub@q1M<;|p&ec15|4 z&EMs33wUN3zN~xJtd{Bea$EjEH zwfd*>VpSeYBkrqq&_=;@;+5*6x(_TNG>TxK2S3$LQ@Zipoco%!)ot;6Y@4c84S>jB_5)e#L)Z)pwM^?1uA(4MzZ7OStSKcO$_`&IYwc@nxZ zs?8SW?-FK38siRosw7)Q+f+5!b z%KVD^mtl~1hG_=(j^VOXX*f&IGb-xJ)q7Rhl_@C9DX*4tel^w!rx)#vVYXu83G@NR~JMmB0ilU3^Q@lH# zmw|PFUwWVoz}>z|!0#!~Ex>1y>ltXbhwS44pD)cDfj)MsUW5Mev4H`~4evz5F`L5I zZm0YtIa`q&bAUcnvaV)5buCwj2~_#)@La9BW@%rTUp?xOvu=5ZvH| zjs2>Ys+Sw|xC+FO{X>qdTs0Ft<(*kT4?irdasMP^F=xYtu8H}Jr-@zk+Poai} zfO)HbJPSDeq?}K#lB|XK%B#e9iC(C$eybUaZ5I9_H>vxHrwOl9MriILM+ISwN447^ zDmms3HvWv9m24>S<&ucB6Hox;?Q2jiSiZ`FH?fRs38#kH{15 zuSl&a)FJ!>YrmJrX`BD+nf3(e)+2DPygbm#{wx1A^{T(dp3LdQIPP=UbC|p78$Fr! zT;{K|w~p%;8f$dKYW+4tVvOOxfnSnL-3#!QdOH}$ zH*1;$B&&}DKP8@946gtGGDc|PNSe5uB8c2zIx0CLbjnv6?@G=f>lKqpp`$?RxdJSU}Y?&rk>14pEB2}2NE;5hZ&!0N2wx=Zf0F|x`spi z>PtZ;lCN1&^--os70l^cf77-WKhB#Gxb3)v*YFV>8o8t!0Sc?)zLGFLQ)cNxEqy9iGMBS^n@%KA()W=|#DkoDQ|6L)v9`W35|eWb=+8#F z8uvx7bmfEc1Q!SBW7M??YT)q?XX8GDdWRL1+u1vS>+!Zzpu9;f#pfa3=yjTSa-P@- zmn-h*e-ekFNO)0jZ@J;9y>vC+4@p6zVrHr__^jY?^wg61?7mQ^@TReSq9)ZiDppdH zG|Bjq+QOzmV^;+8@8La-q49d&RNYL&d+Z*>AX*p(iMenQkwl(DS_lpk*NDT=S7@2; z4xUmm40@|Os>#v6=fr7C6(PD^-dhs6y-=9$A83}^i;<@OyH2-lHPX~4a(A~4M7Fpq z+?Xu{iF538EweNes*Ewt6q5_OC-`Bh*9&;VMeTLCqL8r_^8|OX8lBTe5*@gb*F3is zcGOoPmE^{W-gqdv?{Wqqb6m+;opYp6fh|7me%4n?pK3^ykvWyPFWTcekUEEm7XR>O zC4_jd1AAhJmjn90S>BGI{KKOI`g*EI3-Gv`4)BPpaUbvN&KaOQ&+!BFlQ)!Ov|J%U zxl(mgZ$V3iBWmC19wI!nw0N{G6PY6FQ?j;(2UiQ57w=T2@`BMwH5}@~SONc4>ru3_ z(n0cm)oIl3>U+A9a?4s6$5A$<*9{2nF?R#<;j4&2qW$n_om}4reG2u~t;Lta#|39~ zN_;zKCcGZMqLwK4K#=Z2t(e@&-K-rKjAbwOe8uV=>ybF$F`L&>jDGecyZ6}dBe?sh z=b8N@Qs?aEZe5BwCVe*m!Oe7?tk@991{!1kVzfKQL-8sI^; zw3|6`NHlp{^_MD5@LCsFTue-YB)TQhkI6*N1MTtP`KOC6m8``=ep^jiD1_Y z?-fUg=vRAZUuv+vr?ri*((Xe93~xiGB_vZwWbSmnJ70pnAwICf;l5istxoh*rckAHXrD1MO$lgnWfe5 zk;n>?dPi=AK38#>*JIDt43+0I237^|1g6KhjaTQm-T-u zc2o-xFY#XPQSKHtCu*vv60-zXbt_7G>wf1?)E$UjL{4I?(BOHnU#y zPI2@T(XID=gB|hcZ-%k{R0oPe!~|atdl%tnw#X~9wGg0Cwo7Bq=5L19T2|rx*@ch* z`h#<*Wet48k(04f=7Q+3oZ^Jwgubl%wQO#zHgSmQ!mU3xB+xT>^cr`j${&&PlL>%-QUKnCfn7mBs zMz%*66PqI55~q+&gfgx@ISnb-71P@oeu58cy^Is&SWcdn!|JTRST;!&!qDn;x@+#K z*1kxQc)R}>+cLBc-4Qr#M^OhdB9P;_B|IgR`it!Q1VUt;*JFDQ^@hj09-6{=Wtd({2}Y?np}jh{}zd0lHtFS0qZ98YRqKpqw* zY9~+xdWZ14YIW=fVzMAql~1qK)8K~+I{l-*IVZZhfI079eo71MU|_Tbh1+7*fWx*F zI*UdG-q><@YtZMuZuSqX>qwk;s%=52XJli*^ z;ILXF(s@_OzNi9dYwv`7iK-Xc!BZ|hRU3{xa*fIvQ+kDe+cqkL63M6BAvOW-{voHy zEw>r;XFIG4;HMZXGr(`p7lo=C?wcV_1XwA00P+;vgJQvYrGLt3IEN{bda*=cx)eS< zxMS)XQ&P=${2bQI)JxtDkHD11r7^KYmZ%LuhP~CU7R;pDBhD*Fu{!+AZwh6trOqeC za4qe5v_$_ySiv}4(Lo~?MAH5a%Tqms=c)TpeM+rBS;>r}#*T%0mDF$UNr9RF`#kS` zJmjf~$8YYR0_`&H=DB=>dAAJ9xyQU+)lJAa&Lek;aRZ*p4mdn!NpNk0(*RpNl*TpP z|0gTxr`Sa_?*rKl#}0J3hbHrBw*+^pw&i^hFBOh)Go+{ES3omeEpjpwrO{6NrHmd4 zAJlCu$q6~}|0m-=Cxys4FkgjnKLdZ|19={d_cP5)I1RUySjqtxSIxTsuC`P+jz|CJ z`vHoEoQ-MCKK4#iX2M)k4Ru0YYyw(0JobQbR{TPvE_S)$4Axas5EDU;5CvmwgBghq zL2SX4mB&M8mv65EY>GWm|_1cc<)D1-1-R) z4=mywvZO+z{CD-&Om+MYzBCKVaF*?G_qHoEHcp0ps3Vp|Fud?-`+Zg@^SrpgRsemF zcf*Xn2eP9Hc8uz;l3hu9AzJ3!lfNZ(H@ex&&0C(fSQzV>pZhj#RWLHqnYBNyO1Im_ zOZ%A0Gx2GwiJIiahJKLK+beOqehBdMu9G8l4U~1Y{t5h!F7`C2p}gHO0JQxA=U0Hk zon1k@#~f`zd9Hmw!1EzJNDS*_iJ}j$+Z4~Sl*G6UyCs(P5_yAdqW57jXFG0iG2$L~~B*6iVTR+*~W#y%{07L2n9RE<#_@xD*Q z9S4N-{gsk5$7$gg-+IAN3zxUf_uV|vbe=oSGr&GmIfU}TImp$Vf2O9y^3)lJ^wDXM zH_kX=y`~+8+0{a|j)R$e6j@Ye3YP5OnO~Y|6mfjgyqK(M$W_n7+;LgG`1f50v&C64 zwIPlp84og#YnEHqB|9?0O%vd+c1s#!gwdPc4@vDE34qU&&WAwn?s8QDy}Qu88R%)X zdpy97o;+axjc_;GADFus*dZKe<38WJA{6?3afVeBV>g&39V~-maRXnnkQ^2D&X9r~ zSDvTt(Z{3XgdgH`x&o*hS`{~1bF67K`U|bRv@^L6nbT%yaV2?6&=UEotJlpySkNi$ zcakq|%i5&)M2rxvvdWE20{NeQj+~RcreD9eC@VmP;!2QlN@W1pcABfkAl$Omg_sIp==emT@V|s>o zr|Mr;8 z_5|rr=48jl%q-~{<}}-lw6xrj`f&zk!igL!d7skWL}by8>w^(k6EpZ^7&^pTlkD*R z3fk#LUlHJKn$HNZ%r^(vA-6nV0smjTjdsZb4+-wy=H3I)>sST!M&;IK_&%i6q>Ft{ zK%$K`A#ue-cceQKAFIMQK!1vm*eygW=z{o6^gHEB#Y%B@+_=gb;trY}^ELWDS%wtH z&Wy<-_0U;(ijJ=xE8M}zR&Tm)WOqes@nZowO~1HoGKlrtx6yU-m5T zWBzyj8_R9)7&NQyhi;U23)-vBEcoOehzzOYizu!fB;MFhlwylQ9LA}_XRdp}`1w#? zjH@h*mcP8Fm3>dfrMx2IhDni%4n0I2q@0+{T}0@%W91^4~pZVK?3>o>sv3j0Q&cU(=H zYv%@6JhzPKi#wrVh?SBN^xjUPqbOqS&vDYAA*9Nh-eyhlz4(Z z+j5uTB7YIsLO)UW>v8UTs2smqIUk}_Zyl*WzIX6lwJJTBq|Nw9a;cbKSAt)zntSPqiQR z1gL&}J2T;fpx;T6KG8QB8C}<(f5Iyi-Zp+0)VeGWBxE9-o(?m6&jAX86M9Pzl zk6CSK&D6IHam-|jp*mI{$$3C|t~jqOVaA3IE|D@;GI~<-Rl)stqSWE`b;CUkM^EbB+IZb*Y%nEGwOTh-Vvg0-4#9t5v*P@U zkN86Db$E~F{mA}e{sxRbo-`vfHx8v+h?)PgpWhjWurq_R9lW|Tte#95pJd{5i0D$e zr%uQ|O_`wBPAVCXsHasgtFJ`a`ZB9o7D_KLR`yD-Q>pv^Ua^lL&4bZ|C7>0h8r*}&ih<; z!4TX5*dvx*A)kqyo@;p*^)Jv2PdDiZq9*hnWOxO{l4l1i{{;CJF4o`V!ZR5xfWkXeXb4Q*R-6F|B@pM z##@We`<54s@ES#zJZoh4ZB?RQ-8K2W>o%g(T)1==yaTDQQF8i-$HU|CKhuwjvzf;b zhpy45{--P!(vNH?e~;Y&?C6x5Nbt;8)HeZEYhnT4+cZl6USyM+e}4a&{x@y4=oD`% z>CnxPY!wj10?Gr)JERS9irHDx5&f!N!D3)5g&NHmt_+pJOSLmOBVZP{y)vAc&g|7X z0^eBW4z4DR&^gtIHxx_Mx@g@wyh;4bQV|}4zZSQM9$&SJ_!*tXYF+uAI0=pB#L&3p z66GewPt4v#A~}K{%qD{;7#>wDpmo+}mr?zvk?|CWrVUVHuBiEZO?|v=s>Z{+61Z)D zLSEnsf}=_NItI_-S!{1<>d61i9*lmgOXIMJV6?1p9lI6wjF+t&RGtvOpniG5=(?+t zsKC#%NAVpc3;mO2?!?=MtY*_Q73oi?N%m#VU2|Y0*sXDJ4_0 zK+vAMmbwLJ@b2*rGDm7K-4D)1)(dTleh2^%G^a8P$@fellN>>Bc(yo=OL2-WON8nYnS9M??ec#>|cx z{gE@eP06#<+QB@ejWsuUSu`o~dzOk1IGO|hInC7_UoIWuB=bP1f#(=}CUFRP&YVDK@cZI&fy{80QiPQw??^6Zk9ail62D37 zDGC)-leahlWD2JxxrUPhe`hWwJi*A8_*r>MK$GMR$0; z)Eg^lNGkzVJvs6MXPw|aD;7Udy#;>998-IXYz57TyQ_Le{>;5nF{GSEu8r+gwt~?| zmFn4v-m`2LZ1df-g<8XqYd)4cVDlpnz2Dqp?1Pa?x5(qR|0;ZDhusnOk-}Z3XO36a z3s76$dJETt@)+oJ)e~JZ?F7~@uqFR-wolS65RzY)Ba?jgJ(J$gp<;JDb8{Ev6o|#H zGg*7GkE8k4jP!|FmyqM?X9=A$xbRFtsI6TJ!K*;tx`&Fscv=9v;fwbn=*9A8g(ME8Urhzs;2@j!G0 zxtD!KxaDxaqPxTt)+i1uxJ;)^nb2kwIizNH?VM;x zNae4=H%GsK_rS{(GG!CqGvV!+8|vK^34&(P=c|jgbiriC@0tjs4{FD%Ee|u~^9HKa z5o?LHluTs;V?)gi*I4dsTMwkzGv9U0b{VPjyzsCc95l|I?7QdahJJJeJZ~H=k-63$ z9A4dDUmeiLyy_k553`d<_kDRqx0+${z~UNB;C5p zx682v>1q!3Zm@rY+ZqPCvaN@>JEPRrN95G-LvWe=2V-)T8^JuWIcxGu(B1BYY+rsN zTIzIUj?15gWZGou8}f8WuBl&2Uugtl)fXhL$O#B&rIF~c%u2Y3eafIqUchDWPudi9 zTLXUpes2Vp0=w?-|E#xrbxVo;$^DreR>4FLp^ zU#~)qKVY`}*Jh&)0;sfBK;!9@tW0$Ut4y=eFxe4|g+N{!&-hx~NTj_94dgmjp%0Cj zffJ5ugjtvEmpR%Ajv3g#F18eC5?SPun7`9lc!brhq2X1Wr3{S6Q;+4l?AOu@Ws&e? z8zW6CyC;}tvL*MEJ%e-gcM_)NKZ6m?LhO)qxG<;X2K3JyDtsp9m@qxFDI`-5fV;QfGa5#YI{cQxRV>AnkiZR_X+u-GaE_?smZAg<=? z2D6KiUdpxVEgU{JO}~kO3Ii@(a)N~q>dsV}q@ z3*S`H>nZku@EYYVe=mD9-$ADPo?Bl~?-~}kI+&Kp#~W(QFYse{Xzev2gv`=6Q7PGp zpsvMzu8Ejj~AGZgZ?k1`YorS zJriVO9-4;ph9gXyu2wM^@xKy990$)L@dtAoG6nlFy1op$3w0F>h+OCe^ee(qhjBxo zW>9bS>$tw$XkaTgN@)DNj$W^Os2QaS6)hy%tA5ozL7QnltA-IB(N>jxwM+Gn1fj7r z)XT`e&?d%r`CUE1$_zVC*#>NOa+9Q+nbR+|BrCdX=D6o@a1O-1sX> zBYTS}Q!-kyk2|(*l}H&nkE1p8=ciMvxGB0F!1n*AoVWGuY!37jzNS9P?h~%S!|M;) zR|faws`3l$zi=}&B5#3h9BqvHi(|bh9)Dg#W6-HPv{(Mi$8CtCr(r4nih>%?Qc-)K zT=vwOCHm;C&sPxL(V?Dz^e{43KsvFUG2$|g#B?bABU(w^MH5VO{`I>K3)0Aj=Nl9A z1w8BE(kc3e@)Xq|fH~orWJ4KetpwN{@d0e8YdAJ&Rds)1S2?TXUCbr%&tQFUXZOAd z(~uInzYdMxjbO}3!&2;<;5yTc!{{siciQ!67H<-RM*qR=rQ)dHS0Idm#8`5MwyS)S zX=&m?oEG=e9G3JZI2Je3JTp-gQNTumnfit@q2SQ_04#x9&V6R6g?I5P*j6H6f0#>Q zy-^*n>&op;d0bv-&JXBBGnCWg(&`gAm-RcDKkB<$;z%;rvCon>KJ|uB>aNaxl1k%8+1Ob}Q-_pa<#$Q`kdkcVNZht&Nuy2f#JIpz#2Ggk z@cPKq32>idSpmu_>r3!1_p~+xZ7MTYIn% z7c}=AchuMu1*2{K97F6d+>!msHq>?+8iDn&Y_fFW|0T)M4>nYA`(g6~n`LLx?AW3} zJK432WO0oDd)}$cRmjrdxOAT^3%tSsW%tUu$8zdArX9`vgntp)_!BY)7+WP=_8dtS znK+4k{Ie3@*)oBD2RY9I40qW<9CD%y25~;8oD*6!@cGy=7|a*?>|sEUMA`DW4fR&5 z8R+fE%JC+uq`4uAnrm7hxyrf}b-}O?E9P6Nk>nE5Z%{uS`ZpvEbEYCL|6|DI z?1B$8D_9@%O}P==-z^&iGm_^R#|L{AUT(?|HBqw#&D zdR=$ywtZ^uPNJivzlV`MpZrU5-TOYhGucr>_4Q8b>}y;fciguV*cWj z+dNAFuY){K0RLOv$H09e_bFhPs9mAJPPxT8W5^NZ7&011rnV~%gH`%h4@le-+ccS!XRwz-z7#sdu>_|LMcLCPpvq=)o z5UI!`#2i?J4I@_K`MLz`3Vu@F$20+ZLm=yqnX|>0bl(}jSgxZn`c<5z7QOI?p20!P z1E3oH0#1f$kNX$Nc2}bKhBMRo-Ia;i%wn(8O~u5#G~e^!Tt$0qy|0(sBVI1q>D}tA zMt4YdyO-E{3+a+2j!eTw9*m`$`trBaAMqpH-t3Y22HtSzTb` zK`W`rkxboI(bUS@%xk*$=)LM!tTuWT@?n;*=zcA`?qOx2Ext)`A{*0wgF z3Pth_TumEpIHooBRfmxtOl_c0dYCR^E6LB{qs&xnoc=WRkvT_vU;mi-+S~)(pdTA- zzsKRX_;PNBX#;07af-8>Ilfpj)Du_T_SV^-JMK!+hkasuOjM4NhMnvxaRo_DS~3u4+_} z7+ES4X*{UK{wDvLcAGfGy*jT_lOmqs-jz$mvqj@vrCB<)RxsHhA;e0LvE(_|5e02mChmdQT`2h8-_FMMc%PYc&2rTs_!#S) zd@#utr7~)wstr%E=;kcSdIMK7M*cHvq~Waid(3Y|+wpnm!m_!sCe>xQJi6oNZPYUq zcHAa;9n+0pM{m|ist=PAY_f?K7j05u-Hgp*7n?|U+Wq_G`%C#1%svr)uSthGPV@mUlT|0WRU(u+>Se+lTF zY_v=KP5*UADzXb3>AP#|z*~&|>7ts4Q4VrfTQ|@j>qga-!#|_(#C+TbO*3sOFym|B zD)STBP0eGG(7jjoSo=lP%F{yT)1cx9?t;9g>J{jiV5a_G6=m>f+r-Ql)JVkwO6#Qb z${M{b-9PzmMF10lm@IHL9^a+Z*+X&~^au{=}RK?q6pg4E~=6 z9p7*`Bek?+CMdqRG>XnOy^`2Vqga*3Jc+3`o?RVWhyO?QN5%|%XD~hESz1zU3iJmp zrDh)^`(L*B1yQ%UqqJ?Ng`!;jT&CR=FPf$9$~<7wp=+yWQB8HN5FWDwn=}?d6IdHr zN^*4ARJMsa<-f+n8=j|2;_vmfmLAB*gt_%~wx00b_|E~FL&K|+EcJi3`&oa8zIra( zAk`))#yQul(9PAgl|PD0Bpbf_k3%+&aA0lxn+vXL*NY>3#WJa8gLs3tIDb~VbXU%akKxY=&QLXx z{0-mSw1!0$edfzz`ZITMXK+u(+-N=iUw&oUHj{a{xCfcD?V_+9Z883|enk9h^FrqM zKxV>z+dv-I*D8L2JsLjh^k6e=68IDK2pVQhf&S}xf_};|sK!SY#CrGO2R&Aq!}XQ? z%^eKea7m0mx%AQ}_88LvTTIS4>l;HqVr6=n^$eMekmfG`;yE9AT+<+1A?gq8uMJ`k?4tmi$_7jZfnS0p}V z53hWwmnEgaQ>Y*01&Jcz3)&BsDE_vvW6Ut#OOZr)y5tvjB7Yb(hPom`sO!bgiun{d z(GLPv33yeq~(@ak%S$Vw6 z{D*T%o<8ZDInmNDH#P+`ZHQcv8AzE-?nR;!A0}TUyx0hL{{)sHGJ#$HC4L+H4z$-O zZWMUuGSF3q2Hv`e_5$Dh3Hqt7p}ZD}13YhoJ>dER;cBv>ej0uqw4oTzUR&p+u?{2G zYL82nITG1xZ9S5LQQ_1QbK8U|wl$0yh7sa5rh3|X1(WX~u2Ii(REAreHw+v;YM~0- zFm?#Uwhp47;3(D^?U#g5#KOd5=!q>vU25O6x$&*V3gtZhd-NjOTGN#i&J96RRll`X z;6mhr25z~}cmqDFYp)z&nXJC0T8h6l=hWXxO>zx|v$vrsdtAeWBkSdfTine>BL5cb zwfmN6i2HF(hTxta&Hrb5 zvi!b89(bP`1yjJ7i4JPh$S*?)c&)4*1$doYR}T38&GH5CdeL?tjMX^p`#|j1D;JD3 z@co>bZyT8u<5qB_LB7kKG4$Ey&+*B26XjEI^;W6*BBP(88BeW4=!KjEWC65|L5ELU z{zBU`=Li(GewdaifVs9JEJ2*ASi{MZB#Ix_{>17h8Gyyci?~R0 zyg5p|L~XjZwF8V)l_OgkA@GCSw?)xQ=#NuHM54L^%=%};Vllqaxl z-iz7IW8Yxs{C%@JvBX%@z|HjF>@MJOg{d6yd&7DYlrj54fCL5__cm$j?JcFb3I~y^EQI zRcaR~&g+k$Ifk^FmL!e}$xzim(>*FxpQY<+VrzLsUn1U=Tem!-n@(b!>Nlj{@?Dk; z^9@hd_?AjaTr-%Dyu&1S>drWey%iXN{Nc%URfwM_sD1mLG2(ZL=X}d)3_<&(F}}aW ztr`6iKf95H7ACg&o#R!mEBB!Jk*P3ejx@7wX6&@g_flo>0hT6n^6ujskZUTnlv^zl zquwOxUDiZ#s2|F8bHhY){jan3anB%+eT&nJ?dt)*(^lK}S%Hx0ZEeer6SAkX!`^%Ey(xPZD0@T5a2yXwmK|?Pwlmnf zY$&rpOQBFkDXRraq3roOhv#`e+|R8){L^(LUs1lge1>#Jd?%!_ats%e*dJ=GyvoTF zN5S7IDDQ`O1NFAS z58SEMCG?K_sdh%qf%wx&%eI&TE#nU+U)d5K?A_HQrNfrexJ^(_^7C3>;^Rbxa;&iDnro^auJMH{A!F=MHNO_L#&4-t*H!2D zBr?^v>vHopk;QZtwk`#H`)(Z$`hdi3$pz|wrdeZR=W!RM{k6@JO;wGcjNnXQ?P8BYDdcwV(uBt7 zDbmFiB{f7Yk!QGRNiecYao@WoI0dm4+3&g=w;b9kBW&B1y%R1w`US`G+>Re%KPM=( zb&9`Wzhdlde;%AOaSS`z;f3~Bk-TV@!*kAllY8xk>i1XH^)O?PgnlyXsH-R4Ui<94O{oVFCW?k~2tvzDx z*ny;zb+&{Kw&aArs_CRBPN%vH_fxRUUtn*gu%%BZ%B&nqh9vANij`KWK6=&^EySpp zAF9)eW)ts~f7Hel-Y1VMlyznK&|>-2}4U9<=2b!1vRZu7K~8EuTUBMs3{#_;Pg}fi{4B>pQdgavL0i1Q@=?n zO;CIrXR~5a)yMb(M>k`QZF1bN_E(I~J{S4LnqsZ8-L@HxyDaN0SDZa09?LK0L}#Yt z84Z=~akdfaj4idHwzW`9_%sQkSRJ@k?Mzr5Z>}@dOikFAG+bI-bIfb)jB#(=N5rZ-5h zzbEyZ5yllWxV=e@VYR}~jYy7!+7m_G$mE}-A;f*p(4-0SGC0q*G(HS!F8sxsr>=xf z(473lf3;J(#VGCfnR_-h+fG}@ZnKVY?n4io8?u$IA8-+Cq9Dg`!pIyg?rA@Qdn$)V zZeZKO%cHJ=z9e6+%PK z;qLM>sF^ENJ4Yu%?$~q{Ez9-jlK*O_%=U|!Fm0EzNWXMwRG0*Hx3I2X z^9x87d(u^$CsU3wM|w;-aY~V~hZonFNrB)9cPI5E$Q!=)C3VR`J8z!7LSCP~z?KW1 zKWnVJKz}3&yAssnrkM*tz2jS^?|;k<@GTlrQi^ZY&%wtcf0Ba@y|F)#z2t|cB=TPT zld6I7I{YV8P9#A?pefK`;xrNkb&&mybw|~5Ys5{Mg+51j)mKZ>p~>Q+vLf_*PAyqg za+|2(A4YG~R$!lkBcx&(23f^zlUf_G$S{vJ;;4QZ_P~|Zcw$8Z{FbA?K0zNwgj-sc zUn$SR-snGhMY3n?_2}rpD9c2O6SoVbRmF*Sh0Fa9XszUt;U%ACb09Yb2RV-o!8%0t z_8hPcK==lWYAEgX2e#e>1i>fdBg{6r^Wb27&hYIN54l3HrNm4c1rMM6pCX z7Y>wmCN7|3ktcFOQHN}S5+r_Hk7h#C#dC2fHdDG$kcCB}8)Y3UTS7Nsr?{7~Rscf} zrERs{Fcs&K-YpFfUHRDP4}w4NNbZiPNcR>y=Pi;>DBpyxc3&3X)$PVsxw=KFD|TW% z?L^7J%9D6-6`V%X%g161P5s=}*l_E=VfnsEbO{?H>E?^EJr%t#KHkO?C{>nA7 zJx3x1?YPsn@322b3isHmENp3n()NuN$3jAr^;4Dfymnog0yHL$cJ@JG(*pYxo|o&776;j41KVNNJh)H@=qQ zB`1*Es828ryMg|UxTH;p-B=XdLz+Tt#9zyu;ygSJZv&-?J7Xw5O|~XdiSED(rFQKZ z`7>l^WSF5})E?-T^xxUhOH&;whIk)eXR!xC>-A zbWgC2&MHZWPJ*Acos2HikH*giR|)B&9fF=WF|HJ1k+qRv79VF;T9U;hd^7FC^^pS1 z_pL)OyC!VHf409yoTBF3NP8mIS)AuyRuzJMD?DUF%~EW2G+Z`XhM*H8A{%w{|CN6# zr!7<+e2%d&M=t%x|5IK~b{|Q)|6%Sq&9CAGK55R*EE1mP8>zXTF$8Pl8FO-umnc&)6i^TOmHR5 zKQ>P;Plq1DbF{rfSZOm3kmBnHg?3)Cp%1FGCWu~lzx`1`07fJ%UR!ClDq?^YUS=+9T=1)~E zw6qXz=eODqHNR=*BFFgeGpn-( zAx-(aY0(*Dh(}yhV&9bA*bg4m^-O8^y#R5!&#wi1r}74nKkKG*VbhwL}menl;G9J+x-kuzl)=o*?xHj@mJ z{RIC?luAxZ^57`qr~nfFC3}r+6I#VCnF`6+w5F1)(8%8je_Ef6{_Hv@8nJ#Ee$qW$ zGE>(Pce)Jn720O_D(5gLbrXxa>|s!0MQ<#j>JRxYZ4G*f;U(*J_pm7yMPf_&G-yTC zd$%Z*v1XQ)^L<<|EXyUazOA0Orp}TR`~{CFvbp>Mx7a;I_Pczyx4SD7^-M|13?)R|zS!8*-gu6CwmXk(@BazJW0$~N5Wk~+b3pmF zmm9gNp5F$~vf_HZTj_Ht!uI>vU0-$`1Bf4$s}F6Y)zRn z8dlM&cT`xRMY$rx;&tqM{b=OL>ststV5Ko8KdqHk8w=oR4@ z@sBzUY=<+&siw&s>9+17+Ov_RYolk)vFd4)@f5x&n^_Y0EnM*Pjp z@AFq;*SLy|TY0yTVy`lNX72Bp);lewB>OHt&NDFq&LWA??sv2^^#pd@k?frza`+np zZoLCu5Wk~&8Q@mPMeFPN-Ez${)N8F%t*ckP-Po*N|ExL(zSoR30;R-9A$7%N;u}d8 zrbBuu?}R@=`(Opibn#|50Xsu>lX#K4PybVu=m+iQefl#L@U^ZnS4jm3`$ppWJ`ZCW6v@%lsZoBX|{m$v1^9 zfO~Nn`~KNa9O>p7WRkv|%fxpj#h@|4JR*Pyt}oZeV}=M4RktWdnM{YQ^I6~%bV zQI2%x`R`Ko+|vEqKtGIJZVs^H+%}*i?SB~Sk26(Y=As?OCIj9^%TSd&d) za-%EIT)2zkr0@W8Ah@#9J;4Sf4PA-b^_}3~plJMT_(muh>WE1;jgr0)?Sy|WZ7%uT zv;+7peev++)1&JpiGsb-4be@+)zB+Rrf6pPawt|7BL7R6ELX~p$=XV@S)s{ujO>c&;za_YiqvtnnI{O(}?%M0UVqOm) zvww08wuB&aE#6>@z5tY2UtLd8V?4q2+0ngd7W%tmPq3T7D4D}P-F`hk2l>keIXCA$ zg|}98=9u7}m{~TW|dkIxl$ne|psq*pqtEdJ!C%IAn4HAh> zN5aB~L1(dfP!_XF^bwT7U;BBi>!9bUiQFb5YMep!^NuW=9(CIk=ZT6OTX{l%-nCqC zsKTS~<RX3L;6u&N|oU zZ&T4Wk84<-L~X5l?w*meRlU$U)T`FqRI_0qSsp(7otb$|9Tg>ysIztP1E%=uMAqnW)jWBUXrS+W>gj|~St=i8>lC-e^Dk7-YqB>S=vMbdkl!wK zeFwOXbJ)Oh{pYs9KuOyt5cfMR`+)w&Tmk84k^UB?><4TlzJ^sI)A5FA1cPD)_+jiF zL!n)W_0Vpn8tO?rLx!>k%E}aV=n(e14Os+(aIC;&BgO_fhw7(e36c(#pQH0Q!>ZM$ z{<7)(63GgqQZk5}Ae*c|B}(9$!rinL(vF_@&_nG(WUxC2dRf{HEp_^#tK~(+6?;HF zXBCW>RxNUzQKvJf=~bRr>VDeXV5_-W^^0u2d9XJ^^$F>0#@(k$ANGOX;2KIk#j}}N z_FswFxP)rU<}2Re25Lc*>BMtPZkSs&mOD}~P_xIjjn65F(7?7MTwZ=w))-p`KQ^y# zrrNfFJCdW!c*F+yknFDM?~RlAQJHb61K?i16Dh5e%aLjhx0&KTc#ng6@Ivl!Xg%){ zp2i@KXS=_=H@W4g0z6OIw}JPDd#x{lja#MzdnA<&>>uQfto^ks@d4ObcDi(mA{Et{ zpUJ;f9D#eVxTqW14IXcv5y>n3a5!6|^(bD#->~aVBNaaAlI0S+2Ae03VnyaPSQup0 zua7i%t7W}{D=ajEyL%VKYP4Jr~jY5vwbO{u}(u(=*5nL;#V z!rc?eUx{bbDTj{iq{uYwv29d{$V5YXW;MAVml|)gC7dCj$vJ4f!z=S+bM9H!^AqyE z$v$tLz_-hFY0B94yenIu6~(YTrumR@t%;XU&gh+v61BWOc~;5_RLqI&&Nvw-0Oj8q z?j^`?hkC<7d`@>4SnIjBbZ!DXKiPu4--6p@%L0&o-zWuISl$Vwe~`yoXk)D+3LVSN z(HTeu@-K62ElwhcgE>(=l&lq%ExON0`*wVr^RsCRH7j~IV5fF838;y%aMQluCv?eWUqiXNsn7NK$qF-31?$8$6DX6OCGZsWu9&^#^s ziu*MO%8g|E@msT@oPNwj?*Pp{jXb(FKPc0l1xYFHXj);09=*slOVp$eMsIjZovq_C zxj4Y}0{3OzpEA#4z^%1A9_Ut^8K}1E1>ic8ng?{8qylIGyc!&DB1tvhVg6N2!e&uQ zQyE!>bfgf&e)0o6%+x_&MJ|D#QC%p4JT9GTieSbo=0dILI+n*zK=bJ&s~<5p)l!En z3y?k1RKp3VhucySP3?qNdp1DRjW+a%dl4LGoPz%C!m#an7Oscd8`3C^zXi&#yy;VN=W`A-Zq|1LWtzmzKC zq3l(8r12w{psC2^bp~#9W<<_T**R`*x=phQ>CT0w^v)biH0MmQP1B~~I`=YnbZl?V z4Sx3zxe%b8yX_NC%2I!wEl z76tn+R<4XP%q9PVy_@WYv5E}YGJRM2EO7+7sGVjO6F&LUDSODs0IBU&?H%o-Z z+13uSrqQbna`dM2x!|y|4!`LdD4S;(hgqDj;D!2K*c-<>^gtPc?6c)!V%=?QS=C;& zq@o$-HM@}kWjnD8`qt>NjiE?eZCmekq9=s2-}3v6GqGs)7&qU#9hcH)If2a<%pY!h zip~EJttu9J1SSV@wPe0)FZ2zb7xAa#PlXGgX9%?=DQWDEep=JtyuCDs3erU>{E4hK z1qY)$avL(c=ZA{tbDc6)?5QG#Bp0iOQ19yDQv-R zP#j19L>?Pmqy~Kfe+W+2)d<=NJ#D&_G(aWd?~VP4gYvDSHgs2fr3{Xkz&1krO16hc ztlgxcqN|&iSm&2BrOEoq7-H|C8?2{^;CgO?ANB9hXSSEHXWblhhIK2luB;s0&Tc{9 zmb^#9sdnfM-AClGP>aD$nxZ|>G}u(J4NgLRoS1EZv1ZI?bG65AQ5N3g=5WmLio51o zN#qC;ygxYR;ax;;-3M)Zu&2^?t`zz%d`x!6-W1y*>?UemHJ+rP;lgRMJ04~Flfrl` znQN2Qs_-wwTM5rF7%8CiaO>1RkPm#y@~z;xK0Vad}t8depR*yT$5wWAdc@Te*^hW z{jvJ(4@iu>UVn&a4gCy%kZAD@VkdMuq6dTXq8oNBsz`dqG#*Zphf4?3Wzy!+ zPlXnCBPfHvc=+-;q4-mS91LSiM5pvc7(pX)CbAXUo|3`S!@9yZv{`Vg;vQI`I32AL zzK4&%`S4ZkLHRcPYajLdjrnZPx7aRy0yo2R3C*bZ-Lo{f+O%4l>sGk7BkSdHE}6pt zMZxpze^}XdAK+)!HIZ3@W1#N!m9L_UP=tGh^+Dl&sJ|=3w!NS&bksT6z9GLe#5qnn zN93u|M)sZVxjE0#em0L+qZy00w*13AO8d$O*iE*T+v;~x#g75cAMr2c+*$HVz7nQ- z3hK*eRXL!(R}dov^%C&quRc&COO;0cEBi%{o6;k0%NYGyYSb#T{JY99>hwl|d~Rh2 z>Uqf=`GhhnHCDV_l3UJGTHTj5ExvNopoeIiZWObPwMhy}_fyl%OQe%F&7nQ!p|U>f zCR0-xi!6WBzovL*20T}I#CV(zgXr*Q`V0ScP3fhBaeKKZs+YC_@*!-c{$cr2GIVR|%jLh1BMW?aNRxC!%u-WakF z-Vq#y*1e=3tTN7EChKlMX$CJ7ub%;X3`d!jhF;h!BSgD(4tQ8ZZ+#O}p|l2x))q5u zE&b#(*Y+~UT3bRtmFk#jmIKhdjq8|K>^SKB=DtiV+Zyf&DT7b&byx%WW9q8;iR@2p zwDC4wBwH&RvT`_cqL~1@DUULCDej8rMjbUcwWqO;q5;P46~TUG(iMi^v~o-T%x&4#RnrE{^vo9v@XP&Z(tV8jk^kp_bZCb3Ke$G~j=MxG#9Pp~8 zlYlydYYEh|ql{nX)#xrr2k|>ie+#5{)xQAt1$_r_eoxU95a(^m=bC02e}c89Bj$<{ z7qZoKls&NeZ+JcR)Errvhxm*i>ECr1p$EqH<~Ifi&MFhrHS~7aPTgUg##!(&s+%cG z-&FpMJbS}@V~u4UWGF5$e`m$vQ)}n5rECP!J7TT*isf%;MdTzJX2-#Q$fncR+4aZ| z`rnLq=z*wT^v=YZ4?~6UjEa`jHt{p8Fv_dfXqysaBn8F^Wh%V8?6JPNfycW+^9F+@rp6;0k>$A0Ps9*49=q$+_=g=fjuR9A<$c)=YXmrmI1ye8_osxc+(4drLG0M zmimr89h#4!l!WSSSOPzwQrV_P4|1rok6CSM4VRfR&8enn7^mda6)Ft+r=o?q7hNSQ zGY+IL8ZS%Zp(~qj&_;G3x=^fSgCj&BNO#OAw_Zl3L~SuIw!|Qzk?G7Ewg$-;ZJ;aI zorq5yrl(mq{O9UOswsOJ`YAHkIErq)QHIYIhZ&}YhAG;?W2p`%7{86&rpisf;yU<{ z;jF=eje##1e1=CDhg{JqjYqIS=;eyuhR)b>WMsIlVl&bOhNTJ2TUwYe&)LVmXBXv7 z$ezG5tUH&}{A^yxj?FonHO72}m1nohl$t-XuB_wf2aO(!JYz%ZeEN|^n({pH&4!_D zYaxsGpq~TI)6IVXu2AJ9!27C!030V88iR7KbAu3I4+yOUdP$ZI&OZXtK#hhZMxh@L zccAW=&l-9ldkq7a^ZJ(X0BWXro52g6FkYwc8br`1{UU~-MnRJeLS{VGOV-=?hL+Rw zWT&Zq=3b^Zl7rB?$Q^Vi_AhuslY`76%T^eRxI(XCQ<1k3#~F!*h4%`dQNzubkdD%k z)EG7sxhv{R-DXZ8q~veokIZU#osgt+slK|`*e7Z8%Abw<@KI2%;kwa_t%FAC1EwFb z-{9-|<;J<_I#^s@O|8Kipu0EEGxF$lWLa6daV+)y)-IiW#j?ySJ-!fe+P-eHx40;S3kzSa-h`Pl#PhOsk z>xJgS4TQul>N&`7VR|cw%WZ}`KvRRyw(8@#cH@`);)2)!>{;S}!0}S)XJBik-vhgY zUeDmvCv=C&%^Wa9U~7#OBR5yqp8jQR=cW!g@4t}H}b7*;Y#bTf!DN$CBi3c(y* z1Lk{Xeb{a73e!Srzu>XFV7;1I$)1MR%SJO1mM3td<~4L9iv<}TobTMjZikUzxhG~8 zquoV^s6lKQd^h@_k*E7$=B5oz>E@ddBOY1VpW41EAIp|4)!#D(un|yq(+DQ`tQ)Q{ zL^FM`$H)`i0D}jYpv(08>ABcMtjW5c4U3To^cQUc^8!o76Dyw^pTRc7+&nl4)GW>s z<^Rh(F^|q(l$U4T%o;RXa(#@Jb!N@XIcc6_5oX3`7c$c=W$Bl)j+^$H-=?(AI6`%@ zoJ`o5(!>yAo~)mNAE83wSEOv zO@&KlR&=Ebm9ZkBjI*;kv`dR`kzE_^QKn0y_X(gGA`z z;Hbh|$U^E*x(6IUgq3IMICwTPYdyAa;gt%Jsg7DE zjNO13o6zdWw`B)Rx9G)929~WiT%_OV4oe1?H>44ElVq%UF?Q1`BHb>xq7M01F5s_BuG~Hds9C8|h z8%>~(gdT^QM82o4M0JGQ2?tS&g&t^`Ktx}GR|N0v*FJ*#MaK+&S|@-C$3%{%&IqLi zWrogle5o)$!VpfcsEo|pr(H*-n4~#r6>X@SRFuZ78%f_WOVa<3p9a?GEr8qo$bo?C z8hJxtKZFz@|DFIZ1ey%{!2hxe9s%tC>t~xqslsCqL#0$(RjE1)O>0m^j#H%|<&w4v zM7aeeD#jD>imf^#T z;+$utGdWMewO|{4rZ+l&i;6+!df(?9Rdqz2o`+e%uJr`$O-TMyH~ZRGMb$x!*+v%|Tx9|yl8nWQb;?VM49ZC?!*?jgGZ+L1d*1b?@^u9D5}GgG zuccIbJinkFsn#*e-Sd(DdXp-QyNCQ+p-?vASa?!&WAcD!h^)aT9xrrVl!xg@$^@2s zlC6e+7!mQHWJJaO(urit>T{O!mNIB-U2|_c!)4i-x?)bneuPr${^6Ec%Aw^ov$_73 zT6_=XWFE(A3%?%E$ zqCH+3JQLXL`59eGkWSAp~VwzF`(eT2S> z4<#=OWwv>$t}#!EGx}NNgBTYfqwXp@$8;f|>cYs5$|OQSeF~1P$s_+U%Fr>`Tl@)g zUA|Q^CCK?>qdVG1GHv*#h+LJ$`&`)MnJT9s?z116|8quDf7G<==Qn?3Xi*+ zG@NqYtVJIPu-EO8^r6HNnEL; zr#QQI2|wCVi1w3gk z@PWj(i8ZQR?kC=>i1)(^z{x*QS+95bFtT2U@Q*;-JcJt$c%Jc=0bA>7^yN41=}Xj~ zx72kH*dI$NY!`X}YsAQv%au2YK~$x3pvtH`q<51ClmX?1s0778aviBRc2F>chulVK zQ4U+77)s|yH;0X=(=cZ96Mai4KnG-9m8IS_Vzszhwa$A$@VDfVvYFS@;J)+``PhA4 z+DDo}UUt1~{z({0hB(}!sbQy3H?^+xUPVVpk8dvRzP=DXi1p<)_*M5T{9N^8&wY0| zQB%Y7KKEJzs`-OI;F^quR8QtLu9e79|4VM9GZt^mqu#%4{~#eQ#CeG&Q8a2(DQ)}# z8mvsH-CmHFdr{r9&Qg$``?o5wc7Hyd^F;Zn+MZXN-CP-2-7wdy$yH7XoY6GSs#cZy zJ7iR)7ssUe?kAKaFH#QTdUE$v_X1l1=f%|vRQ22{|7ShT1b-&r_y^w!#CZ~L1Dw}z zU*bN4YXiRb#{C0G?;=V^^@1^EH)E+{hGLcS8$C>(Bs;2pTyuulLuRTD3Kn7le3~Lt zw*ogHf04f!Jn&y|IT1x&lG>s}&?EXe&2LxUmM5Cu%9F@#p4Eoe@;=Is?%tb1U#qOE?wnVg_nJ(umgio{eTk*{k?hOaH^`g* zK3R6nB~s>llJ-Leqx_f4jbEIynjGW3=bflj)@&l{`TkV%2jHx#t^)S(KpfBvzBh>H zC;Vf;`vBJw=sNB@!1=fTiSH}rXOMQ~9h5HW7Pf%A9rKbNL2gjyt8q%KaFM5;aG%DVf`xFqy(?Xlu!9cP zUS>aw<(V3iJJ^q?guEQc%-vgXPE}X^d(Pp4i^}VP#yKDIDY8xAvF25tluYzb%Q~1l zo_xx`OgCg-#kO-XDSu}&B;jot^D(%d<|EfB?=4Ag?L3fQkaZhD|MIal`vLDGfd+u{ zJiiR^6!~_5_#VS&gY>_+EDnK*bGG>;fnks#|SNrgM;LMtXl4%4MFYvqmMG3?!jS7bBc zH-;sWC$h0fTe_p{DRdZ`UfCRKDgPGUpt~p^Dkz4pgcOMsvJB`BWR<F80=XYVF&aLspx(9c#6<5bF@{akgWw+|i}kkuq}ZoHRoL7>KS5go+O^iT1u$A@}; z^Hw@>NN+oDpX<1X%OyCex2(lb@{uo2qb^#fJmBYp^An#@wDLX6yjSqA;waB#Jj=g_ z@mxy!w|T>e72a7XGjm$uF`k@+^;s>URrWlVONqtrT3y~US6tnRmCO&!hufpbp(9N`B1=nJ~tfL-M9?ExsBHaI5*UntnG=E#(bd9R(4mdi5q1889Jg` z5@%xMm|4{}b|yUo>p@1xq?-n!6BVshJq<6VFR>=%qDFFUBHRo1Rpf+M>8I(7Hg^xz zR?v6>p1!GsdaCS+f0lJIejt0}?c`k|i-_;>TQDpB2ZQjjayS&hu41iMjw`v1bVY6& zh8RSW@5INAW5YDaQEzsjwPzl2o9k3}%=?kN*Njr<;jsxU0U@x@UlM zd|hkMcV&lnpLZbym-z{=hbp3srK13ssR1NWEbxV!>AsGb-OpCSmFL!3Iy(6v%dhy37|3 zUp^7+V6#@{(3mhhMY4x_LaxD<$mZ(S5J~8MX^r+29))p|H(Cc)jvb3wZrFgRux{FS zy33%B^tGP=*Sk*U>40tJWOWU^gQ0!gFEvfPy(I^{<<-kPOC(*~Edoc~k3wO4F<<4n zC9^jj>#DF%{l9*SOu=`#<^ESiJ&`%);~Y_Bgkvlo4_B}OI>8R|1lubTd&N^vqg-bF zTCAJ*b(V-3qs-+xC4YS__4~~NS!BIF@l=9%HCbDMzqJ@r0~HZDpng{+Lx6qP;*i## z|9`i1OI}Q2Op)cLxp~ZH)k3q*WK=FE#~2n07L((NLju34l30k#pg{%^UWqM5el|9M zm2m6-xL5T)VflDbG&!5=Doz%RB#XGal|#g+;!p2nQzy}0+~|=S6C@{asVi6ayevh= zTN{@T+$0Q(17*qA*L19Aw{whPfS|0Voolq-E#a!0xYA6=qb-47EVA{N#c*>O++%|2!`x zE=MwsZ=M?)HvrS{X&R%t6~2l;mBNt!;U{RY){mebEU<$WU`N z*_Z5&Ll%`{7v2{C$ew{aqT}!@lyLpls2FruljctvW$xeYCM5t4Y z-KpJZ?`$82$m%+|&e^6y-D>}Gjj}C-_f_w4b*~yG-5eO@F<8qakv@fIj`gnOkSoQ# z!8li@MlhS9vJLdTYFEw9qSDk?>KU~Qims&&QVDBZg{RZ5kR7Yj3Qnal3R}RJ7n8P` zToG8CBTp5n(7^1h^5l}3F+L*sZ2WCiIbZ3!6_d$50`a@n>jv7vI}@nUGX%s~z-<8e zMPK(65G%)BZ9)2Q*ZnWYozXxu*xTeT=|T97?OSyZ@&{>K_JYbn#9#pn7ZXmh*pG}# zsmG4uM$0F1AJ&h!&Ai535|*g5G(?@yNc^bzsZgU^38%A8`5&r2T()@<)J8pp>%u&h zZct@#2bnV2Ayr@RG#VBSRc5=-(XYf^NUePe^LEvrct3i!-c?#t_Jm9>y{zpKeJq$C zkB#-a4`JGxO89$s7eZ8X(URus0@F3WI8$7W(NBR8S0~3xWMJT;E6cGL&gYGeg;fvX zj_wF&S=DHy3H6Ekf%zTU7$d6vt8jwmu{xDQqq&;8!@@Onb)=G;YUDu_uRh(|AgxR@@FUaBj7*J`vP#i?u`J)|8f5g>>_HB!o;c-E3L0$q}X%(iseF#3;&Z? zZXsi?U>1eVY*f}E=M+;dwIqu~DwbL95N;?yJg{V8=R{92wYf?**K`q?XlW&Bpo-%L zTK6IUs-n3w>?GMjRe^UQyHc`KIn+Jgd_k~Ind8c&Mn@SHKUo%2e}~M#FzGdY*#=1B zBXuQB_0yovir@H2Eg)|Odb&D6@x6DfVrtD>+h|WQ-k_$9YrdOAmDPP+PFFr07C7XR zyPSxdzu>HJ^hV0u_p9vo3M9E|C^pR^f!eEP)XXW+on#GF2iVNwx$RMjgiQvZZJjZ6j<0b3vBG*ddqo zuq0J^&2zUZ1D2~&Jclec*>!T8tBs|D=p%W?nW&$y9jbU}FQ%WaicqvMFV?QC=z_h5 zMprDTJR~)erz2}Cc0>CW5Bc#e81DxduYMbxNx?an8b)ttMD=Qupl|F>h2 z^POP1|BCCH>l^4kcg4QWse_8$1ijJ`fzY-nvbpsi@h7sTxSoa|EzwQ);kz8E&0rZ z{nd#ejtACU0GuBNMgzVB1E&GU&HOfyU%cg;0={oJKj8X?O9jWLdk=wlwipTthb2#S z$0Ao9mH(|8Z#}Mr2~o^_%Q7WS3{hpUC&>PA7iAr*BYuVtldahTB1U?EU|0#7S-b@O ziy8xEP&qO~)sIlAVuLHywhURKcw=vA)k1B^N48n4O_rsYZE0y<67iHcz>xZLk(bd` z=#tIdO4>_*A>In|bgj$hDklm@=@SKu6rcG!>d)Th=-WVJS1q?kv8Z|{cip=IhpS`x zN1lGzm_SGFjN1x5^u>8+xTivUxM{BEu1>+8Wu2HvS06-UTddSoy_WSG8XQ=sxu3U9x!do}yqF^b#Kgups4&<4nf3gaK&kk-{ za?{(9+3o{88Na;d%Q_N$YhQwP%BkwpfcvJvmwL3^9|L&4;X{G;;}d|k;#UF9^!5Xs zQ|U?gTmu}VvlNoUh#u-0=06nk@K>spmYXC&?o)kZ9<6wXJ|{P@XNWk=K)UE=*iZq1 z&!a{{4}}kr_QqDSm(&*Nk*aI*&B#d0-Kq-oANYIG-%O@hgl6l@%qL}Mp!4YN3U9NE za4h197%VhO-V=4Q5r%D&d&EikSbcx`Jb6wQYwS#&P<-Nxsi)rgI30M)*93oilLL!= zH#{cP68PZn>79x+^55itb++jqDZUdNAaDV2isxx&Dn#_c#?v@KBb95t= zg`rQQZd6)HIg~6qZRkMu4~`v2 zO?jr;;+i8Ca^}DoSFK=_JKMkB#R^8+8u4z|W8rc6SXaQQ1pnh#eu`v>*m9BIS(J^q zSU-2CP>n3JCUbKOy1!+3|J8=8Kd&7AR^HUoL3m&G7>=(>+dLFr z30G?BsxUny;@pP3N=^nV>ZILw5iHK5HvG9(`j=!)w1kuJMVs};jHGI9A9j+fW$Y4XktmWsr(Wxbllu9g>T9-RhH}26T2LjXk8`j( z-h7Ff#YM%iR01=`%PTb%!3T=&H^lehTlMYjXUGH4MmkNhgl|?9l|DB(UVC!k?KB!a z#}6zxmbM#O!sq6`h}Koea##9pW?lI=W>O%v4+9h?d%MJ7duI2E$no8MrO&a8;Jf|YQny_-rU2lB4vtTMv0RS{~@ zszmM(QpBz%gQHl99W1F_TJ;(~Z|tU!(u~W|BFq(UILJ9#^l*hyySP)a6Kp%#3;fTq zR_l+J-?+rsK~!jPUF0hDES=wqc}rvb@DXbpk6GnH8dz65E0tr2gXSW5uJ8APk(z;| zATXk!h2{m?($^<{S=I&oci*bK3z=EiZ~Xh59T~qW#`==7ucp5wmhigF#%bq*s~lfQ z5vKT+!?}3-viPx_4e%xTNhILqy$JYy@@@x;c)s0KpMJpeWqfxV_gL_5dWYK$+TBvu zYr6jUO~kWN>H0zWPWTu0v+HvgZ#F*3S{kF|rYQneJm$3bqXMzL48Aw~ zgG{z=Ri(PW3-T^eiCmA#wU#)g)gB<1uz!(jS)M$^ge#29IoIg;yN(#kO>SB|<_fTh zzHTk{+6PHAvv!VWBsf14rQNKH1$u({itcL81Fltou#=?PV#9qXEN_7 zoB7&h$TOzIRPa-ix1|;-Be@=qNeS6}28i3%zMg>h0{%-rae!+DINtDnFxGQy?cJ%Z z*Xf>DRJ}%cG=T4X=L1WN8 z$N6n>?B-oqh4U=af*ycp+1D|Hm^1h!dptXrA#mDO$A*y4tbdc=d0r3)t9VtY_bfT2 zs#v+fO(@@3SEwerhbe`YzNFcCT$yhDQ+dLXrJQHckQ=QNl>68O@*Z=UbTh1Cckwp& z?)YWSq^h@E%lJo*&sCXxkGLF5ge@Ytc1kC`+&+fWs5fG5?0xunwVbH3!`yV$T1BZn z%v%uSAThhmwO+MLxz_go$hzwICep24D1{;|wKP7Nnao70RMWI6i@UqKyE}_(OEsRE z$wV8sB8#&)%i_xdi~HiTz`|l*`f~66ale~C^2~W><}`is=FB;-oHK({KiqHE6^wv; zyIBRr1@Z85*ZcfgvZb)ubv&;kU(T01C+4Q+oku=67iIU%Wh0H9_cNPik42r1&(hPG zd*H&FP1Z{3C+BWpe|4_Afbag!(ct-Z&v6*^+q<@hL>-UU>{|h!<87}2GHfcUu3cwV z&~>;WxtNu1je@&sOi+cD;y$hZ3Z+_SB>t>*g;%zRJ+G=b!6J)Qe@?#uDmE8W$Mn0Q zNYg?pkt~2*#^dBEjhFkzXeROmB((}ovuzOMg=^IHuyusR#vO>>x(c36%|Yar6-aku z6Xb#E9-<8AJ+316B7ACxAdd*b4~Y-_xyj3sSB8Q7v+?Kb36f&-B>IT+yy&>OE#2A0 z#}X;j)XFs%X%^AL6mZIswftVDe$M*v80d^?i=!Am0e__1)?_2qaG@z2uOK0WFq(LS zowodK@`K1OSN;4^^2vzA1?TN6n2ua=rsp;(xCwW4PRQ2g^U>cO^IC}W#-QCDFVhC) z1kqD9UGNbt9>J8Yh5d^p(=`%2-#WXKfL%W1{I-vNljGaEx%8T`fX^uVS%4F4KLT`H z?-}d(wVE!_b$GCH314dI#24wW30&sH{jh)CuB9p(|Ffm+n9uTr2P11%8tV8vZ2gvR zEy~)5u9MrFh5?*uz7BXEPL}~WM|+X?8(kdNnHU1UAWXVyeWoCTyke--CkxIJZK%KW zF6ax9ZX95k4AnREG!ECj<|XSSRDr%DH?L|Axkp>e9aS=fqMY|3{sSXI|sxyS0&=rtCC+Oa1tyD1ImY-@3=DKLrc;J1g5% z7W3yj?(l1=X7mFmW^QauGJbOA*?Oxk8|BXKwg$Wwbfsg8^%bo$KC@5)PqB4L8!Ue# zxMMvjEiMqlYpv7pY57eAQ!R^Cy>k0PkLYasv=-ZW{mBYPIKQ~_GVm4o&e>qxS!&nm z>-elSf2)r-m~01lgmhg2>cUyv>&~AizwNIusRx4gy0*F(t}{S`lXSd$H<6B1&1MB>9{uPW+8Kg6fSj!>n6XUz9{ zDjoCfb1H(w^_rnIdCWv&K~2N(C`SiEXII!K3)T=LZ3As>p;v}WmiE?5y#1P7(^NCT zO9aoL@AN3rp|A8cOSD4AZ%cnRUo1SpKSpC#zue4UZ2Zf*reFt;XMAAWk-w0;hdgGV zkUN~cQai)Zr^R99u5L56Ep@0ZvO6# zMV(_-OaFw*4TE{f(o0CWngj@t=$$PHJ6&t#qo^-X zibEmmz&yfxPv_^ng?F+{yc5V7U?cvcCwy>TSOo0AXu(F%w^W>sfbTWz8Q{6sykr5e zCrZ|EaK0W7{;xhbneLQK;g4Az=r`(K(syt@V+nh=^mh~?F7WS2+F-+UGx!6=>x2zT zhx0OV3K2IAmxD(*f(Z$~v#spii90ISH9ll8Dxd3b#_VQI7RHiB?K~=8+FLhUze?K? zpP{dB=w@J{`ijH4U1Vp0H%_f{QGbW4%KT<1HO^9gWYp8zjSI+E39YJhWGbgepc2W` zW+r(;gYlqtwpgu6OUWChFI5^UOYK zwa&{5VO(Cg3T@0(sVg+0*dsh69T|G5sE~{g*Q=SRxRNRmCkMh=7}Hev6|YR*HN77e z=dQ`ur`eI=HdeMTH6g}>?SxFy*6e8XqdyB0SbOp6_|CBY2<&utnK+1n-8Lz}VYWTM zo~*Nu0)6h5MFViGxdgNmWFN2&%xvt+`i#UtXJ`#~k$5;dlcJ&5;z)c5nI`BaK86)3 z5Ao9QH^Nyu1wRu@MF&?-=l;TX3bd+^tbNSc>;_6XqpN;|POev|Msk{<$5auzn`O)K ze$lfDRizY_Ck!IWb(;_`w=W?l_HZE91A~Qf@)_Jtx?@x!t0SjG=QR#sLd@2xvs4T> z!xusqSibVN1b12I((U+fgD0JH=ppd(V6JO4t$;*!q5|BE`U*KH)s*6BVU7FC@00wdju=xnyHNT-YgRiD-7X z4#m7|8Q#HT$m^8#T4->r3h`J_eugwnd{o6=1w>ss{zJc(&)P4p zP6hbh2?3jDaW(}Qj?|#K@8yf_8t_kku!@0vhTO@yC)fZ-(pz~w@I%-vavBd3iA1^K z{5NxPGyYX43a__2jB&IU{&VCe`lGTn?+HI2o~dcay%)bL>1nkuagKJnMyt)Kdc_l$ zwXW`KfSB9Sm+|+BftsbLpMA`*SChl*!+%2%god9EiO3V=FUd^aB%-151!GotUv8Ok z0%t#CrFOS2ixc6s@&2^E5-bQTa!$0ekaK~Ko>taUqBNwzXpQW#q+WwvEKcC^&LSU(%j{I4 z8sAQ2K-+~2MEmte`3ocQH$d^9f~weY}z6#Ci}K!?)2|6#(q{)kRaob&g$m4+`&M>pkOgFUXD9eOH@oOTi`7;W(N(J^wcH!sbdH zp7Rql*z_~hIK7I~Ucbw+(AFe$4e(nX(n{<2DhbX2^85e|c<$`y0qpI44S0U+o(yoc z^IKi-){Y^7=d0CGs*H_%tgVt6tK~2xX7%JGBU~wo(#+z$6AY7FQ5m`Y1x-a3{Xpn% zetmpqp6YV7ZINnYDpH-N4JF7~6abwqTO`&SH-P#aM zv+oQih zRVb6{p`94-;&I{c?!ufEiV@f%w={c`VurA_t5a5-;t0Cj@gVa-A&PKn&Zpwj+Xi=H>psEqVMWrpBJF z^iXzV^94(1O@d}x`AMt;x2Y)W36@AVu-8`pNy zn|ZNGT6b@Byh7~mwD|1`Ny{{OE$T|Yx# z>0Zd7Q4<5DJan*XL!3f6*hk)`qn-63*==t{&MRZmiY8u=1*wxF52pG<}~ zW1X?D&G|*RN%`JT4v)TV>Dr%+2au@5$r>m5S*uR&ugoInGXD&W!v~r^@n+UeFS%>% z0hw!C+RCU1=w7IWBg?o8o)rAikxKKR#s23tP3S(5+r82DlKg|;fHoPVdJp>rPP3ON zX-0zNU2t%5J&{E6BKVi$my}vjySxnBM2CxV!L9$aDQpK4~DQ#3^ zwUdo0($~$ZwMnK=lD`?}bSJ_UqdIY#5gd9Gew9;XC^o)B34XMpF=bC)!e6F)MXY2D z2w0?7YBCXZXe08xCP7#d;@bMvu!Qe}D#vI033O86s-wGoA&U4eg}s5H#@4pebt13@jLtz+>Tsgm@0k)U(q>To0y6j9!Y(hJPcHj0+GNenL(n{cIUj zMyw`JaUc8VrEYdfuzkT%f^1g~?g}a#_nrOlgMqfLInJN4jsAx2{?2Wf-ZRUU?C6g5 zaHt(;?3uzhTYj*Pw8BV~5QQ$7x(l9&&|r(Ap0e%Y0l{O1M`T5!J^`KliOhlx^ko&S zlCgwyJgU4i`9t81j^DC2<-KRKjMpUWTpuwW_j`m{cQn7_lEC`3w!R`@ms$Qu@Z3A) zYX#)KJ_*2BUu%F1y`R8y@QbGtkVkp81MKBa2WU6US+fm}gO6)h6T|W8!pXXUhQ&A= zKcrqt7;y$JuDr6P4{}nty;7+jgbL8LrTX$7yr=xV)tczv*ynXwjk;BPla?4)8Mxk4f>C|dxJt5!xm3N0Xe?e1eKNE)Iz;EWH}wpnOt>7elexwa+8nt;J}1sV9S{dK zRKF#5TzE8g36aQb=zo-Q%iR{Q2sAWBdX|U^0tGIv+l(vy>pk_|S8&K{bIlLWr9`_C z&oHM0+iCmD@lVYHVGH(2%NW~MWE5%?JT#TSGjMibxO|m-Hy$0hUT{?22J7bAFWV?j z5H9hk^IFJzBC}mRbD)AhpiQ>e47O}6M`l>YIF~zA9~-WKRcZ4Aqk(^X zI1u{gF9!^OZ%H5m$WmW(z~c?yW6-|BD+bugi-7Y>J?nrxSB0o@`Mr>#nr%dPYz}s+ z{E;C6(}{MK*E5u&0a1swut9^S;(N<^8c6UFb*g8uuW*Z@?veiTD=-uz$??IQU+04coo2NsvDk%bSJ%31=bE#P<^PU=%464Y6#H=#?hx#g}$We zWaKra&=T5@&|P9d1)*8z?JmJRkZ6K0(A8xUmG`1^x3t@N4tK- zf35lAnc{qkwKQ2>+iThhuRud={jIskF=RUYk{%#9B|Pj+lJzXQB^>CjpRX?Z0S&lI za`TGfk!a`ZtRaO-&~96+j2?0e=ZsM-`Ybz>kT00v=#lqMe;o^X=4HLpityIHVJUNi z`+%SPFgO9kC*6YvAS(k_z+>Y;M}RT@t^l)rX92GC=7HgXuX-)<59|}$x17=$;rZg=rs2wV&^}zDd=UMdcVCDopC?^s?G`jvJxQL+xTQ9% z>KA{SvCDXB_1)?%>ZeE#JVh<6+`%vnqHZxVh0a0>r=WHP2w&fKchS3X!1thCVO##YEuiO*p;96O4(L;(KV#S zVtqaAuv^5735^H*4h{JM#sy~s{?-Pr06xF^t^ppW`FaC6%{va@F^>dX_t^cd->*vk zY;eaN#!N|l^(V+9lGwPf+SIBAQbyyp`i-nJk|i-4sItbdoNy8z$Qbv+k+YB<{T=LhAoeUp^N@8BTA#9oR2y@&kLwi)Am$4oj zlaN(?2mNf>9p?|N(hv`Gj-f@k9 z-!_N;ZGF-L!EzvH#$5pCzt>TB{2{zb<%|#}&udo+j$+H`=^8sUM0l6_s{Wn#16o1Y zqwS1pG|_M(c9d=}($(Ng`lx>(Xaju6?{#IV=d<}_p>C9N0Baa2yp(8;B$r-Hd{-TZK25x{siTGkp4H#$dG6oI*-lEdU(+M~@;Rq5>`R9#rgh9Ycbi z`ihsFZjpIvQbZE!*LT}PW-2DV8bSyPfO2b}&#PxxS{a2uG1 zdI@6yJMs^McqAif4Twi7q8|VpugnDatF|A&f9n{aeE^m6hb5iTmh-jZHKuv0X53NY zPIP145N@=%wRxFxA#=0{H+9~UqfQrHq6a1QA!6`c<6YKk<9J~@xr5!#I2oQtnyCa{ z8Kq?QXXUadneX5an+usr+JO(}42b)KT7dUu+>f7OOvKl4&cs;BJ@{CDZ52XZ$EQNL z>Wp?7_JKcI6G{FgT<<$Cy&8@Hmj&e#dCe{U)?lPK#_=9*8_W?EIn2n?z!PjoO@E}d z{}dcmQ;PiI$*fe_{)T_5siIq3rU=T(Y)ysfv;e}l`}ZqWq?s{hV5x$Yeie!LJBwJE zf56#3N#XX)Rf6R3{^JHMR>fR&x6WUkiHEb+EzI7Wp)=p77^3ZIJ*iE^4)2i^i)jv+ z7tAtR09q^)z#LnOZHK0gL)`v5m@j!`p9$iV)S92cZ+w?s1m<75JKBNozAZ5kZpx{N zS7~qae#Q5gV)R~JQ7D&us~D1K+n3sQ~C1XDCK zr~x87yegcL>j<_2nP&(u#l_aZGYN^I9eTniNl$a%7IqHOX=ZmVb}jHUWu5Dmuz8Rt zEqArV;sX=KmClYrgRdA(azMrUatA`!yv^l zMJ&BX(B1b(`VeOn`2C-E{tbA$w7~g3NM{nbA!jr9jZ87tiXsxxLDx&PFsIPVArh)pCqVd-I%|(Pl6lMJ< z=^ttgPM9aMpBj5&x#ru6UC3_805e4NkAI<+BX3JBEC)SLG>1QT3xkdnkAzCK71SP4 zbHQw)zA-3jg%}MF$av8gq$in4%)^f&@5mv9OSlkiL3K9F5bp4KGAcY#_}hRX{jH~- z=u2Qo>Qc{qd{KawRJz%Cxql2^$y8Qr ze9Wtlas1N?BV~NFyZ?(kLpA_r`ra1g%3g7fd)%^P`EF)A_wc+{`G*WD$Jp$#c@@T~ z)@5mvb0wxC9^1Jxd%Uq8yvpa!40%L=zx;o#yxZEPdi|;)!Ufh5 z^{m81k;eKW_5hKK?KdxHMNzfF&gS#ULMj@e&8CXiCG*LKXgc#$Nn<)Bs)R17Ays8emKRUclo`uMf!e z{pG-q%k#Yf?J6G+_$LM4eL#k^2RM&-kIB%ccy%ql%Ur*bPplTX%xTf*iJhWl=B7y1v)PeDs3J7l)S0taKULnQwYQ{c8H1vgT#cgl6W-tnCIlg9_sC3b8 zs8HX8;E1-tByn8d8Baz|Q!-*0ZbxW})IJb)Ltj&RRSTgnTz{3SH%o8|X-cN({)W?i z2h*>5?%`$reJP#1S41&kJDl!u;IJ>%vdT3byWt7iJ&v(zOM&}FZ&_5Wfy?#N6V_9!@S{{-Lb0I{{*1aAKZI&1 zN-(r!%%dJ)nbfv;1u4S%>A6Xh4IzX}WhP4umw5^epE21moZZiGhu2lJL|cOX!ds`_ zt>xhL;RJH6;l6MkbXadwH^F{@=aXpV93&NfZYWaaBR9i&dpE0F3N(U221CVN#!~2@ z_H*OEnTI`DU z2B+EBJkAL%aqx{hSnUv@xsW%+Ff@6GLz&Y+5lvwBtyzhRwHmH%LW?Fvr>P%FTiSxc zBJxkoHF1UKM6PR8tJb{F`3TiG#opeobnLO?O*o?rgxs#l_wTlC;pW=b`X*XdDUVV2 zyxWOo;rW6eJ5t8qACKd}o2H-GnbO0^?Fn^enY5=+?# zYqC0*SjQmZ<|H&HTQXK`SQPu1XvNHre-O?x=weQ1aP*J#<(yxcNx&!lPECZ?n&W>$ z&raG(fAQA zxJ8b`CwqTUBv6%jgg0I>fvCprdiE4fA!cHGJ)Pv0I*V|aM=x8iN<(|QO}R^}P9oi0 zfBw(@lsL~fpE}yn6^wJ1TKm9tf5&9J4E(lf6$5}D@>%l>keeHR1M+vD1sn#cV{Cqk z6Maj};y;i+6jtjRz*i+JF-XaTXz^R2v|%Q{1oy)eRT6#&LviK4oL71^N@y%UEZ;$Unoo#h6M{>TBGq47u?D@hb~szM_6I ze6OSK_(AO!x-F_ujjnBCZwA+6yb4(y&v>Th^Mgwr5eavzi^Ajl%T&9!INj52xAZNP zm#Du;o8AxBdjCh4A{<|cO9G3EQ~lARmcBKL;jSKdq1R9}!2Swb>$b})3{cn`&yy`f z*28dBlboJ-7dDPZ5|RHCr~ECPP1os7<8?LGAu~n+`bPca`ao`5eiMAhbC@4Ne6kXn z{aAxeQ>nPx>#l@5l*bSgh5B^J9(vEd2QL)c_pJLs`ET6o`Z7uthAhr{!6 zyx)>iAZzR6W_`;T?tivJp+aONS*dBsd-*0;z zSJyt4tYOk>>=dz&Z;}kd{6s6L zop>fnlMLQod?PPFjORW>UL>3+2eNN)S{c%GziG}!FEAESGKM9oN;Ej>OE{fNLy3}Y zjDN2@De40AlYZ4TL(hhH3Vzl9#9fQZSYr*(R1n%UDL`%_HXs=dlF0H}yzIHzc zcHx{m1mqL0d%!+)bL{}w-?<62n`*x8(>!I%0{3$a5!6G>1{G6rWU8d05Fxje=_FgR zl~gX@D_)EpFg9h!iPs^?#%AyZ>=-oE*p2rZnN@v?n#Qc*jimI%O8xw}H?+-Qi+RLY zD16L1TYirj!0$soMqEM{^c5;#>eYRD{YSTPy1A`I@&XzZ&o1Se4x}uP?TNY?xM5L}iBED{738ocq|`-D>8H!!|3QlSkuciY^9L$xGzf;?h8b{FuCh zi0Ow4%<|`W!1F9mCf8v{o%Wo<0w31j*0hB!|B0{@bwR?-eF#_c6Kf({Y=c)Ievb<0 z2G@M^+k$DpPrDyD3H*pPfrbEyfANj_1i=5BcbkjLuJ!5pD!`K&&Bl|EG5;L7z>m29QaB*v!Z>qB;-p9Q)aNK3V>bvd*db$-j z?pPQwxE$z0+bLg9=NovLX@F;+9fNZj$7+U{PN;uGrG|bn_R3pArte<_6wbyi9rL{ z1D)H6siD?jeT*kG4B+eFD8To#z#+ghGtduUoG%UFYL5i)dd@io$PDK$fVAO}u_xRN z8A`-cjf9i&ON2~y36qQG(K?t#j`SniDIa!RZp- zLG4*;rQ@&AVZd+W+T8#j2O|K_Hv>Nb{@VJ#%@?-wzW8P*T;KZjU`IUQdxiZeXy2v( zY@EeCjor~&$ba~gC4G%e)PJE_Qjw9x*P^#2erhZ93wlU2fVvG`K%NVKB@RG^@LK+4 zO>3SnycaWE>rS1|T5rO!d@HUUT6GVXS!Xm~Ng2dC)9|JciHlEBd$c^dSe!~cRF%@p zMdOLZo43%l*kHr9$`!_;=n%t{GB>%AKf-t;Dbw&0iwWoqzX~PT?O;cf9G%TyUE9AV zMfh`kX6@G+4KkiQ6YT0}$scHH8Q5<-8}rPx&0{m)RV(REcB95%)G_A>=L_S=mFnsw z)D-sUk_yx;1D=bgf~3_J(7 zBn=18#S_%{{~B8_)7R5A;+~UkAQ1Lc9wD7fo`=T3*CoRVE$o4oi`x+E1kq4F)=)E0 z&>);?Exr0Pw~TT2fBfDBctcA^?bC{Vco+JKGKN?o+HbgHSg0F=cdfXkY;Ck-&T3;d zO4*Se)qL$M;y37pW>MU&|ME5K{;$vCkF`wJb3qQiw)VLBcg`ayruH9uLsp0#3?8<( z(P!(uez9#qc+JgSx5gAr%8WTQ#F!6!+PeGy^-?UP28dS#78bWqZNfYHRw#z7x{ht| zRu`RHwGd-^NcprV1Wj|q$vQEn@tYcsWy{y4G~kL}n*Xif-?+nn9`M@5eF=<{Vh#}) zXZBDj4eG8LjZ^?X?-{=B+y5e})&2Y4@6o53Woeqq#E!(Au*^x73xf?CnbxN)5;oZb)IZFjY#%>NB~^OiG;AzF@}EgW(`!Iy;)01ANl&_3*ZivgYC}!{b`LwS}-R zv8dK-gN6HzAA&Wu^I`8ZKG4*50cOxmJUi*D{99C%VTZ zzJ9`sK9wTM9fvmb)fUA$|AZ;eZuu1Zbspp#BFnKn-F%AtlKs1JHE9>QtY<9$(ebZ? zd+4_{fFk4+;PGg9{cGK+a`fB0%6#D#@Eva!LIC&UJ?Vel3SfXvXdNoOD!8k@ZQGVw z3uUZ*Wo?~S10Q4LTgRrFVQ=zG^G<0e=qBf9dYJeh=0#QvsYfSkZnJr60rMu28Z$;W zOn0AV8DGVZ4nI*Q(2+?~El1PJsiAC{`D|*O!O3lA9+dJ`*_G4Cgi5xvtgK991@exc z&1pmS(+w9SmYvnSvRDM8o6ONPvR(`Q5Z>FeFTTOnaS{t1UcI?>yRgdGAl_9wEPjpY zLHxF$&N$U{N9phlF!{`fl@}f13h?F`B~4+3C@`Onc_!`4A3~QUY!$B#l@vF(r-;PC zpB1a6CTv8YwcjB>r=_t^T9mX`!zJxYt>xjKaf6L{tKJHt7 zd4}p2D<jU=O^7I z%HV~>tu>Ll^2D}uu>Lm9A#H*=&h(a7Wr|EYO$xZ-bx3Io)iIoO)7O-(yoKDRMzy3X zbcWrDP+~`sW6TrUgB3BtPpSc$^YjvIAt6ruXdQt5tal|x+xmw3WbAfu;Cfp-rUo1c za=dmwjyoezNhqHe zq69Uy$+>q^MN;tL_Y)A<7_|GaA~&A~ju=WVGScitJi>H*A9BYW^Xjo3z?nmUqWkFI5)2l4CYrPFWVZ+#GGnW~n>>C|i3Ijca6Q4tr9iIZHEL{c$}`(Ts}xg1IX<>LRi4Jb)Nc~|`@vERL+Kt$9?*80hO1KCCTIWQr2AvspMB6zXI zdfx!hAEW*8fIrx80`gc@wDV3A#Yw6dr11onkLEH2j211W|FRrJse;m0BaHXMohnmCGIql{13QIL?aVSQuCVp7fMVBRdrr3+a@turMF zW*Ixuc0p`6t9T3>B4$|;ep4HXEjJ(Jt+Vd)jZc5!^@uaPM%z_yPsvedzW0;2y`+UH z(|^TVD5=4OfkH1SW=rPyuerO37fW|}+lS+stJ3N2iMA}PQkqe7gBp$QRjzf#=NA{* z$^(wMxwS=2RRPn57M`MPm71TH!Y!Jn9e|fRdloj-O%vsKKNNh?tP{chclpVND$yu^ zbZ(V?3y%6_nbQIq&@V3qe*e}#10w*Ufp6Pjz0(Zdu#nEfY*z@Jpc{9&j9-+ zis_5!GfDjQM-|+!je_-6{A=b{-K{dKEo7J)j8Jlj5C17b-4RpGUqr8Yn_l4~1nOPvKqF9AP+DUV*%72Ws;a zh9aCv*k9s(fiw1P@JsxZH(+YQ>kOZCH03WO zj`RO!CE!tpxg-G(wwD&4(-!iJ?Qa#mb$3yg=b)m!W-j{3ldRAv@4zO{oBK6<-`Zi3&xCa?wYnibdp`txjmF_3%ujsoO) zPXoT&d3uBEH#(03`HL$9@Lp%T>t3JZ-Zr(Eho!VlzLd1dY)l!x`95m`jimT0&$EZo zMbdd2-z4M_WuhI;Buu(WhxUoN6Sp9FFj(XMO~beMWB78@qNHc$Zuli?5W{O3hi@R! zq($ZnSQPmrK46+H%+m~FkEJzm&uTC8S8@e=d{q-x7Vwe2*F&Y^TaTJkgkMs=)Mi-w z2_jM|YVX@_@!CpTglOAj#&c0-;GLxrQG`tJtfViHXOmBu=0MBo?{$Qa6?2KD__)C4 z;*%<^aE`A+@kqT5x#+bOEof2(t@60#BdUI4B|350;x$i+X9ibxVd8GOuh>!Z|MWyO z^7DcHmALD{b?2TqxB%x^8vztiV}QL*fOY{nn>P)};Y-9fz<>0Lh zTN7!>v|uY!I8pS0F4+2yWEC#6z_o^yVZt^RZtzgb7&zA4!P`^X8-8k%Sc)a-6%*+1 zKTF;I6q2y{YKxhH&nDQtOOfh-Z}K}X7JczYSpKkHkeB+6rt+j8WrXj7$%wtlKHyzV z|0I5GlY9P4Pgv;1AI+_68;wQ*Kcl^j0Bl7t#e!~`xT&&Jh^6kQ{J<=Y-cZ~zKZA&XwwI|ze zYo1YJ9&9Y#`Z#@(bv@+@Nz#e%z~WB-;?&mm=7vpzuHRuEQpAf7&{vwW%qMYfwX_H*-1@QtfCu*Lf=uwTjZNJD83B zp!-NmYSve<)R!=!b#@Gv46*MTWvqM9VCxg^gygP*88$z3!ny;MB>b3CWBP)|^0!Fu z7&M3sS|B#X@{kbk0DKA>C^*DzrFS7Q;ktGUEQwg_$fC#}tp+TIur+-#@l(#Lsz}a2$v*#mf!1~hT zJj1Z;bfdGkyBwdLp>cP07Kv#3)X7h5KRVrb`_5Y z{dA=GB*4*l378*z1R(%B&RwWh=1ccD&Nll=I|Hk=`V-c1nyYF31Xd+~o@F8bDmxXn+6Q45nNy&LwgJN4*59xI z@1Qu6NXI(D{V{@{i1vrBartN_`~z>XaV8exr6xZzH^xtuo>OtH!$tArRD;0A!28f8 z}0ftNd;iH`bz6-~y4 z4xg`7JT&c*=cHFH8Je-r_k*XIbWFy0U$vvY^qB3lbwQyp_oMAA)>i&kF4MY1B9@KH zk1;KguE=R4`@_&ix>w39*k2-*xV^lBzgfG)iJ`}`5O1jHel0B95H8Y$Y+ajIDrye+ ziV^PvHgXx3V5;k%^NUru)bV@?T?S|6pRdOj#G zn?tF`-J4d;H6D}jowH)vYtylYwqZ$kH7np;^JvzzaDKJDXboG%6WCT_vpMUaRW+o@ z#a;kiw-fkX^<&{a{$FTgL4t57oM70DxuC_o-;J-ZQT$e{ahAR!Ikm4U(KJ=`gs;RcKD^)SA9HeU)6>j1r#I)`+?;d2 zet(X*{)hOtbxpHV>rL_h`1_`Z)n_Dr4t&SuI)CDth$hUs+IdO*l-D)+wV#qcr9{-- z@(oUIpSH4YlxKbN=hO|g3#`1PEA~}VPC-(^CEE{4)wxFtlFikLNY?biiKI8NDDH7# zU)7rU1h=Lz4;>OWseX6iJ5*0#8}1c^;yKub4dQ~+SQ}inVNY%d@d$7{g%#KWcpIr~ z!9aiQdI#hR-(A3Wr(X>8oH`r0)(oxJfqr~59lpbZQt}V^JS>HaX%y%jMe0|TP_x8SM>-xt@hvGi_>~*h`qFSix zRJCW4r>69;f91QL{3WGt{XO@oy_yY15Z6(> z{`!t_I)=rqM(o^ts5!=2iK@P?9MUKDm+L>BL8O&Yci!A$TxA|*qoQ0rx!VI4= z@lf0>L!bEC7BfnQ3%bV+b)6{L!CQ(a`urs_v=r)5Gri;uHcrQ?-Ba8ITV<)LDJj~D zu`HYXGYe**UR%C*RIU(hYdz=Qm~qPM2Auo)D*@lPH5A}GuI?q67d6$N1aXF8!#QaK z-=-Uff%v&};}gJl{f6scoH7~OthmOSp)D0`5>(g)i6h{D_`@7OC0Fuq@Gdykw>X0Q z6E@M2+oBng%715nnX7LcwA{)x27WP2g)+ZKWo*d$vuj5EYm#|`UO-!QqeeEi91HUabhXLQ# zb+x(%J+1x>+8}q-&x~o1;TtZ4amnNQnSigVo&tPJ>yncj-v9Si3w`15cT8$g3SHm? zvfHM7fEROBj;xdl;hU&tj_xf&p`H=A&7YJh99%ipXpTEA@M{X?H2AK6Z8XRm;!$QF z8BE3LwMM^YFN?D5p_|bipjd0F;T>5k)Y}3x3L39qqdAP~t}#R1j7P{hQE?z<`rc0S zKPnxr70TFlxKC%6#mkAPlenOj#FB5N~$uaHg3zG(`x3JgvJ0(sc`o)g`;)?;kl(SJ$4s_k3T>pFiZ-PI} zP2xsoFK>()rzff%-`N10vui(r|8+*qXuP3ef6Z6GcX-W8&_C?m2;&kD#rrU&f5N{x#?joKSInQVD zM~3thju3ul0&M;i%$FrYZJ9(iC-C#gaGeOgpjjlm;jpUash);v>;m?2k^7qL@}!%V3)+?)aHFOnFe`F4GuBv&gs6u)R~g+% zTg4DtGjkItEpnX7YZ@<{0%EZL*eMCj{~E74+m_rj?Kd2=6UAS-f6~qDX9`zht?9n@ z)dl?}lXba{s=OevQC03la^9gA*#*qsX)Qp^{2x1kjq&y`V4Tw5+6`RaZkyKw-&kzi z58~+N^kBf^oUS<-Bd;L0fjIkL8{9yx@gMLV+E|PS)e>(M_YgT0CFM8j1tmgX2?ewV zO5~lym%wYGLY`9m8My$(v69j4@M~edGF_;KB6t(EC!@DR)}R;bTZ#rSC9Lxi^Tb8& zF0x1RB=LGCxS~v9K+d`5l%XLt@Q;qRO~+Lxh@AF6)~{E*MkiX^C?jRB(UrzmRl;>| z5tgpEYijjmgOatwJKx+xOA4-fXPW1%e;zFGCRvgMEoC9@BW9l9J?n<+4|5~9d2p6} zuek@D!8)KGZH^Jt1^rCCr1tZsH?GuQ_H-z@nqEn5@qQ^@n4U-9a~~**O5a7Z+{+5% z(%$QoOkP1)>J&{gw;-=^$|25=?v>dKleE|^Hx^h8HV!?-Jh3OCc}!<;KX4{<7WnfA z=On<}uv7=XSwx{$Ofi|%xl5;L}gkD#)$=nJkWm+fIn!?V}tm!(OIjlcnU-c z9`fAy0Z|>2!js{4G+MAVC`7UxT`mk-xkOxm4d&0OoQGzi?*wbrowpU z2lI8#>lNFav&=n(gE-HuJmXx!>Ch|k8T3)!ya=UaIjbkHa~Vs!+?!cEDCd++>HDn+ z&AFpI=kXSH$)2aRc@7t}%nH?%x{LCkWK3ZNd3xvWPVW!TbCX$VsiVa#PgSZuDI6Qj zT(z{o3*AY8Z<=Q<;JuXT0r*~ZWdeSS9Cg5df3xob{vBn50C%310;`x{d{?a@WZ!A_qiQ)Gp$Hkc7&f0b2BVwy?etCDSqxd?%he{~Q#P+b< zf#)h$pb&e67Gd#_cdYnjV+BK9VeAv@4q;uGvS@|uFLa7)B(HVFY&6$7OAuYvLv+Mm z&z&z%K}XwsQA6a3XsTrcTcetYbvNlE7ghcSZPCxNHN#@e=sZ zB&WZ-%4$;P^I9@9EDNIJI9;97%tu)Z*@!L5Fqd1%8WmVa@++@AayZ%*oypr@ex{0(hUa zz5|>y%+H!N`1y|luC_gVLVOU)RMn&JBthIE5zWN6Bpm1tJ5gMT_lQ~}qeY9v%LSWd zu_z|_i)WGbf|p}Ac+1qoIVtFE&J4}8up`J0|{q=$2C^oU9g_R{$$r|Y_(;du^y zWFz%3bfAN&Y9Z?{8e)yDm?2w&p0d2<4psDo5>36M45}j0Gde*PwkjPyO}(|{q5qgB zs>d=(=3w($?lESdZL~g;|BxxNlPXiAZ0CMcUd8T+6z6iYk(JJITaQy?BiC@28@eDR zg2Vjd{HC~tcXH^ucE1Ay z_YV&`DnO2vr?$mly{OpMer?11Vdm8!Kj~7zI`!5FspJ8FAv7{jQ*Hz#XSG60h>QH) z+}mgqVgN5Q%qJR*ziqlqxdJJd1aX>H3WW}ABWJg=_j0%BA*)cul1+zau9zBh7OAxd zDeoz-pi>?FS%!)rY?-|~S19X(CfSY(x>k)4SuKl%+htv0m1!!!Off{%+TdiXm8qhh zR2A1({sWJz3wLy`_|g2l>I~D--qZ3CTIinZED!V_k?w5gK-~=@f^tev+x|e!8Cn3e+9k!d%Mmu<5n6`v52Rw{a9A7tMl5qPx~4ZH^U z;sM_>PjA32)V&ID9^rZcuDxd*39^R$X4uEAY>)!m!?FhX-n5{qL5}5*4f?Ap22X(2 z^Lq&|5VQDu`7epPB%Z{H{z{@yBgyKn^aM# zo)+@8vY+4(@?Er4IU4q@rCF}3#r&MI(aw1DN%P^ArS9jh-j>yZAa_S*rExEx<(|!~ zr+*MsyF#6zx@bP_l-VEZ@}NZfc~dmCMDQf=Ol+j?Iq!jPH!)LvJR%A0<{q4rRlHR! z^91MID0+m7+z+!h79K>eFt*I|1-NLrt3$^4{8+5QCYZ*7$pzm}112}%P9|C@#XKVM3t5p%)@cwmE z5%BjD-0S>&)jV9r+l4HG2T4=83ZxM2AU)5z4*iDEgiII&O%goDgR5u2qq$!sV)i_q zE&8db7ps7WRC=JcQM}44q&M=UhU7$v3XQn3E|3NEgZ^W5phN}yfZW1w75*6+NA?qp ztqes()X#j4ya-xBw&iXP-32ukaJkE>vYN~iKCbMfcJu0lEtv#ojD;w>>^|!0XdMiz z-DA8i^9=Y3)7$fd=_|a!Rm-$Ao`Fs{%A6sF9%znzft77o#GhmC$ysIOL&5Y(VikFa zKMTub&ZKuNnJZx!B>ijgBkWgKe%g_uA$A!SXW9@RSvTND?Nfg0B<6O!_Fpe)-R zWJh+I*leEa(55Xwrx=5ocGh6;YcOBI@xBCHe`eO}8u)E@1XeT$UfDJ^&^4B}AkO&P zJPGW_vrGs5M`xq$|Kw~+uO2L%EmYyn*nh%5!Ts=-;Xgw|sn+%-nW)5e+9WL= ziuAO~&1VaH1@0ErSymV1AW^0P_UgPl$OO8rQIwZQKaf<^MQvvDqonQI41rK zJ>g$ccEjS3N?sCGkG>F{7S?OSkR;S3d>g1zegRyAzqge|wWwZ7esMk`{Z-G^zdNR? z7pjJ8zuLDew#&;^b+#Ug<;p0{Ny}%2Q1%0>gW0K=*9?Qo{@;C>R*q(Y44($g0*4C< zmJiV^vOD4Z$`9Hm)>LSKYCjoiyu;tCl9M|l9Sr~IoUaHY3UONA&x~N{H@jKFjxT^j9zwFZ* zhspmIgxTcbzo>cz;%GOkPvjHmlgVSAP9z%g^|u|7_%z)Ua+s4Z`JJ4nD|4iXn`mNm zzgbsezbk*!jW7wZa%GV2d1M`WU;Tz$haW)aX%^|WNf(K?t9NV8n&&uwFV4(3YmQ+g z#ebwfHvj4jD@snkZhqkWQqVumX|8ad$?ueU&v4ImGPfw@o_;Q~Bzs-*)3RVUCw*Ar z*vQ@tm%1C1>(l|hL9TCgtR^~6hBmO9Y`1`Oy3|?^c-C6BfOSeM&5wX=X8Hp9@l%Fj zpkG-C35-eDC`>QAOsCyeZhu6PrukMW5rQ8H8>sd`Zr>*^_s(q!=FGgY!fnobeJTus)GAs2^7yB2V6 zDVeqTj&|i4)Trk39Ot=zs16I;*|zZnRWFdO)`5^g*%G>Cjxsfi(FLAYd1mh|jWvwb zCpjkJ7Sg8=a*V@6v{PxmwMMdKZG^6mK_@vS;E~f*{qcpegSvWgEU`+Nq3eaC#3^>R zuA7O^c#HbxJU7O;MMX_=dYalW35CtF$C#Ee{R*Hgjp3SWOWwnb3Hp;vNbZO95t<*F zIa%t|fdbqepBCSO;Tv6TG{41GyV615*qW&WadMXPXK=k!I~c&zY;%DAqnYj7I?+$& zZ}}j`n!n}Y{>?~(ex^N7Wt@R<@u{L8jj0%ippeD11AB=>@L)qTtUK`|_dUHvG@3XI zX$_<>l^6&W8z)BG$IrrFjh{4byo4WRTtSYOj9xWJ6S97~vn{zrJByDqvf!oU65cA; z98P;u%UR)E-aM09#xHg-!uRU20+$_!Tq+^7!*&~rQkEi{t$)DNWD&wQ=E?>((!>)Os!MI+uU%yI#x*7!}yn#Ea6n^e&kn`4i2(57QL&k z3N4At92#ZD0H(YNH>h&cnr=w{O*W^BRu0<*5r{Wd?mpiaMFH5(Pap%6w zE!C6Gp*fbEaK)5B9f}dz-MJTC{EViVK3K%$wz!(Q9D3!bGxmu)`UQ7^?Tkt8-cXdxZ$VP6wyOb!M@-hG3=3{GXa|36>5)AGKT8wExX3=J_U#Z3iJ|~B}>)%ioA`r$?Y~^+7 zENC@Z8JR1s6XsAWANT#@?pCZlyCmy!+@e$_-dN_jPc zJLF=!7276=C%0N&5gmDR$oA&(v0>~Hx*zGEV*eC2A_r8Wu5LNrA`5>Lvoo70`iFDY zRh5+$n9u+0>XTVo(2F<1$;!BwcNX66RHk;w4M(>*+9rR@YAV(`;_&I|H_$Hj!}fkL zdtFTduO5sM@Eh(B0%^7dfqDON=5yfvAmeEu-%{Z~E>NuovJ1Nh;JhBXu6{(t5XGX) ztlP4{Dr9Kky3Rob($#SBs*M#p3AXT!{Ht1vKj*Jk+@s!0+QBE(%jj)bn7~@eGwnw% zAp)w6DGKVNyeQ8@V=ZeHI2k97v4pd?%KD%S%%!Zk>pQ>-(+mFe#zDvg${2Iwn4i_>Lt>0WVs8nLYo|c7ozjfoi^sq& zSHE;|@pD-1Oibex^+RqtZlyFY#Nhk(ugMSc`=AHyR}voQ-bJJB?-9V>p5!|pl6wf0p5|Cp8?PQJP1f3TnxCzLfygdAQU|UWP{H) zyexqV5L*<#;2dZ&HzVS_qy$c7&6ZsdpW%*V`xQp4op46jF702ahyS;7Fs&8nI3ps? z((l3C;5Q53{vzcO5rGjfoyon^v=3URD~9%kE{AKW-=OyE4nb!F*?V(U$AyTt7+PAs zRM3ny1#Vq27%ByGUEkYj%49jVR=m`#adveWR|m@G_ZD}vS5$~PL> ztNDRkuCi*`b#|(;E54xeI_G;Ef$fsLqUH7j^oinUqEcI`fi5};O|ece{ahFWx3jdj z^eGq&Y0PhIlk&J&oiWXknezrEjERBg2mi}XqeAlpb3>a^(*p240<8u-o1@17M?(Ao z#2tsRU%_=US{w&t!)LyKwN!u93>WC3G0kf5{mUsvVkrS~;(oqD=D)#G2pRInC0;Z28aX6U#Wzl!|aw)5s9`Q&>;M zP3|eEyDVD66OKj7qva|u|2@QtDplSQZijOtd0?#YA3G(1x(`$fm7ti<52Ly$Sw+(X z2z65#U8s!WP~BA#1-AvWbn!Y~UIL;a50Vi%E@(UXk>X`cf&XLUe>c3^#UNgus~!zx z8zltfRQ0bQ9@(oL`fZ$|JO%WXsu3Wr{@2cHjg|5T@;IEP)cVa(20ES$(Th3L;AE;R zCE&Lak>ps7iPto6)jCFlq>XC3O!sVr_59rpANHHhlGu=$vvZzx!pWaCgE$o-JP#;Fk zF6fX-2c9*=^4q6e*YWj3a;fCzR1-ss>=lW*`Wc3<>HN5v+HzedsFUar2?2g1$vnXC zPpTUDsZE;;ICfQgfaGXmLHlOaB;eO0HQ#C_?Unn%`${sa@WKN(y>X5wDjFxmVP325T+d@s$<5>e!#_JLdxoMXZwd5<^WJrl-QgMLO zM!gwuo=QCd^PnMt-)4iaPEokQZ*h!D2J}0scOVX&s@edgUG^G$exYoP{$bTqXb#zy zKHR*oSVC^lKW#n{{he%~Zx!xFD>MZCBU_K|(LB~ise`c=+C05e@tbH9*_eJHx1y7^ zgpN@@gMCm|qh5LoeLz^H=Fl$;m!WR*HTs^09`G=^Nf&G&kd2iheWBqZB9u3$F4Ano zRH>rG^smq^#Tg2vv*3i4xnv7nO=z}g8uwS#qKNI1bK#}bv1Mv(H1DJKWaA^)S>9-J z9>XuI{EU(X$JMdDG~*^!$Q} zxsfzZJMv9APxXE2F?sv52hza?IJYFLmA=SOmwg~3NUx^FnRC)k>fCfm>dEB0h-39#lvTi8gmP>x~&o|opfGesl0PTxa9e^Kqly?Stuqq7b=PG)G{X(@lx-Bc^ zqQ06R^ov$(MuRnLbbTwDp>p+L{YlwUR2%p`BvoBO7LZ)MQjvsikPoC^$so~Ea;W}{ zs#;`MQ`8hy2|P+Dl6fc*{R4bdIa1fv@EJ;#J*9r6Z@@>Ye$fRP`oYU(N6FQ?p-6Xy zh3ZJ(frnIz^;XJ?45=7KuF?;IWy=?7_fUf95bPrBh6Y}pEbhTOKn|{s!d~&Mn!d`T zSiP_-`RCd)^o?Mb`tFLy*m`I(`8BdDHV7)!j*83{^WhkBZ{&WoAJkRdQ@2nTSrAna zN{^$7{P=uGKVA>#5qaAKJdxal+~t(Wz{(Nj{H7aD$7Hq7ilYze1Q~f5-6=UOO_`rE zfV`pe^Q*9PCUVpG>_H=r`3mpjXH)0=>Ti1zaCjsz5ukydThSH=71HW16Sb zjmo2U30C?yBoPO|hTs^_EsXe|1Fl>5+=>T9|~%CDk7)MNDL)JoAX?Vr?h6<2hx z(Mf$3IT~K3xMjFds}_104I1GXcL&+QC3(knw=yBP|!i8#~M2g7#faUjaFAtrfgqE$9by zxvHKtE6R|^N~u0gy&J7rca%13N|BSgt<+}4Jkb>OV{)x39#N|qYMEMz{Gcq<>?WTG zZmN`IFWnNMN@16EB7+3K2zyrC*Ur{WLmnySQcju$KU+5*-9XzB@ru*rI{gtiNVQzi zh6?aq8BBiB4Hu#8N@aU}4r*uDswR;*q!M(}45GZMP&At-Q!gg7u;x&*b~zbX-zVsx z-bSKmFf1T*lu77PAx_FQ8_@3XX7xI4yl4@^mIaYU)F%p3{-)Y4`Y2qazDWK$HeZk#zRq9e|gJ^~FE$@wffk3JnK)of^FkF_dDc1b~$)ieDTmN!B)6`B}En^9buOop}1HsbXlFL%SE`N^z}2<8qq4KR2EJSqarf+#eD5F zTA1Fds8rQVCrBGsm>Rh5a8iFRXs(UYg{Bbse`yZro+pjW?MMmfki_C_qjDoPSvod- zgesF-q&X!LsfPe=#cV6!g>h>D?>4OApg(BNiv-ufh5V0Tzk%GIV86rATF`!w_pRUg zH@@Sl-$!gvUlgXSSfskHAOzK_T2-cs3td^iTJ=UP=eCfQDrCy#vVtZ*D5KTq*`3N= zDuwoP^uM3~SIPykm2JZBkfFkhmFe<%nj&}zuaR7$T@A%^8drVNw1)mL67{m46cWWR9;NqKkCXdM5F3Z&ZrH;tiDjz|fCz1a*PWf}iG{A8rM+f-jLm`0kH9=c&?Ary| z;CeZLe+B591vi2I-LZhpO8NqEB=!|=h1^ffj?F>;376pQq{pE$o`rme*iP~vm@NCyn(GBe_IK(vue#q*BZE;P73t89UKF;O> zX~h=d6uV5YLN+gAjd?3SPc~H68qD#2Z>ykgsdED6uN2mObcIS*tErmRuD?0aijMw1 zu5tXvs@-05FaAHS|JN*;Bc*cs z1fzIOe07G1&XK{fvCihmpH*|DC^HgytcW0Dm|oCQIW3v)+=E0YoY->vGT|QiPWX`t z;!M*}R1Vsn*Gko8wL|>X=QgJrUO@V~D(4z?1gx!l!tA2CNO0Xh%mqp?8up!=Cqt;!bkwLP{)z+c$&i9v=iIGM$YiK=^AQj!`JH=u4yNk-~wVq{Ht z$)Gfsxc zTHL@%;5vu_Ud|xkTMkDQ(x7j!PZ2c8a$5($z1n&LoQDmj+o1hN(-LrgYBgGsO|lez zPybHbm97#huBAAY5Q+ALCSgi(GJajvR5Tafg?-YEfVWoc zL4P8*uRg7o@pmc)g+tOR*HK;~dqK=2S0Q&!bv)!(jXwiLmvyjn{pGUt-Ou&axxW$(XOTl9H^P zpg3b4uLRF|O^mDAR&*tMI?=dhW8v$pWTMiSTd+0rLLl$<_1w7`uL7B^wq@N+4T+8N zl(g_CDWt2Jq3#$=;tj?dIGViUz&*pyZV%uc7@h$B1mgp|&$})G{!N`X;D-I}j&F6D zI@p(j_8^{sHyl|c-bJmz+e@7okL-!xB^DAH5utb?ae$Ci_LA8X6t&${;f2;!CNd}tIWEr!QrmaP*Emu9)%%YGEj#7mup z>TqZ@zT7b-cmQt@#2?m<(L0NA*%o3;nU>B~mh+1`+uE|?S?DSg;l(~(G8$MS4+ME%Ada;*t4rY}G zvN6ucoRQHdhT~bAJTOH|D44mfuEZ^06yUquKM%-XeEabRj=j9K-#B{`fxO4`7d5oo z864=*Oe0By-pRQOa9+pDWPjo%5S1zec2?X}+OhH#whF%~9UV3t>n>r(hy`-EBT|H4 zUilOqfqunTtO$pc{Aw{w>Nx7k+ek(E9z_#!U|`nY1_j}>oCozi;3LFJXRRgy>51DM zFSU2!Irwq=Anj_wNVM9vN4*4^DDGexp?U?)6)mSHtIQSiM4kEJ+D4&6kx9Zp0n*46 zSA=++Zz$7<2|P#a!#(GmsaR9L*Q0m7#zuOgn8o(f@MOpGT1X7G#F;-CFQVSM3N>FJuc1%kp$_!57If`tVH5$YG`Z_S^Io%F=zZp+QU zY45!3)j3u8bvK$}$#fCH?pukIQpe*)*Ba*wJfx-r-oVRLa}2E4$NbxXKGL@ta9rcw z1pK+RM+W$QW*z{4-@zOK`V^NJ=s&J`AZW@7k{YzB;`i8-m`R$WVm>}7_Ld?7n@X@_ zuqZn!!d^*_maRv<$SM4~c891Jd_ep{Yv(Pff+TyCKdrl~$YS?1u7r1E{p<<45V%#K zlKpB@D!Pt+wfM_wp+n+4>l0NgcuHV}V*l!ug0-l|Fd@nu6(YKzzNatX4S|NC54200 z8=M51`@8;DOZ6WsiBJv&=MiT{rI+_m) z%EW(rDzcgU)sh2lB6D%BO|pSmn0g|s5uWL~7JDM~3mWb4I+t)7*TTS$ztpm08+iAu zc?5K!zZ%Fh-syn%3XcHDv+fPxJe*)OK=PS=fcGR>jo^1aE9Nt`AW(<~it{LzVsFH@ z*h?f^%)y|!06iC_2G)Yna0b-WP`$Dip^z6UwXl?R30g&lvR*(}_+P^&2uDV2gHDANM9q$z z)@T+|B70r2f*pnwxpuiKU90dvJ*)f*<~=^!+s= z_FQ!C5~VxiT@URS(McBAB(bf*#Oucs;l^J?TO}-ST8^Zo3314~J6l}R4$tv4&Hk-O zC2_cSWd2#0i4A4?WK1n+Bl+s`rVh?CptNIS5|s_1Mb}U;VgFp~0e(Ea zt_4`Pukqgo{LcBl0-5NY2l|Uo?p;9tl}QC$|7J?SdD!fF0Q4U;39QC291H8lH6J0( ziD&D(A-_xS#)VMt&=f)ww<0jN@0U!D8LNVkAn`@wt6Bp8i0#APSECh^;NB2#{hY{u z6vMR?iSq7L{)%-+Z^-*=(}}hyA^hC$Z0mX!GM`8E^+%fW!Xa?#Oz#%`N2?&dG zy1WF0T94vaLVhFL`wtPkB3pPqK3>IX%c#}(*`n=?Z_@*;EWlxC; zqnyiA1SMNBi=#=3rKkj%Z$FasxnLP|(jtg|l9$F$HkyT(vPV|kMebO8qzG3IMO!dc zo`|};fOB}=Vc^fB{XYPHDPAM+-=$0};8^Es4f=SCEL$eRb4^-g&N&Q-sgGFIORcE2MPz*L!xt}v0BL3g~ zluPIvmQ?pe`cyPrkW95A^e7v8tC}qdK}QLaqb%5ck&naGLRg7N$bBOZL%E{4RZS}O zAQt-fSQ=z4lU3KnxlZI|-qs#**1{ExrRJJbz(43}?;q_v#IiXqdKpIwzq_@b(b(e< zM7zUw!P4r#?UbxX*3(VB&r22|ed$&VQj!iWGCXitipB>@im!G=6&~e}lD~2^&A+Lb zjU94c$tI~z1e+O_^8K+iYzO;_@CGS#tpq%qS=69k_K}q!ZhO1@CXgyc6`225nDij- zX!y+cuaCMr#AxCMO;c+F*|Z1iqGU6059U`5Tr*o-EV>gkgB6N(h2jP6sX+c3=mQi( zDnw`2q2Rl|w{s5O(|oFA7;_WiEq6=AjK6vYuNK?k%2%vo_r%saW8}-(%S1EmG3>h$ z(~za6ZLI9*kpkO)-*0O4$^Y8^OrS42@6T{V3le$Hd^_!f6}whE@*cAf)I>&nbpK;N zpxq~E%QSavC=)l6S;yO3a-00$@lHvjM!S(`9;T$9Qvyrf$BIRUQO$=lLyLsCj3s3L zE>KF(MNVa!<{y{hsER4dX)Ga;`%HS85X>=u|9^Ed&IcT$=s&@@=4J$;2L}FpA)rr9Uyv$#^JO zdYw^{6NDaOI+H=I;}65xuI}1?>@j$mJy{jZj}5HJG*$Jf?4tQGFdix_n;&@w%k^&K zhFkZ;P;IC!!*mT!ueICl=E2aYnh*9RW(oWxP{q5_?1Y>7Iy-(bIgp>+8}03kxS-a~ zvyu9%NH6#wdY66&tRmXhxJvYC?_*BaOe@)t)}EN*uPpAAJ`~^Xi!1skZL}o8=P4*m ztHeWmhP>ER4l&u-V^thB&WpTbL6AT_&txYtWC=3Bn(y)Fsp4qZ@82UC*30>JU}T zY386Y58h6UU``uSh3g5ME5URUE+Ni2iURr8((rw@QS>p+bZnz3LH{@BB3py`$aWDE zp8tQRNw?;Gye*P=)KLDtERP1rym$C7A2BwFX4Wo>1DiLPN# zW4U!M8tYISHduy=D+86Pb*4PgX{n;-Lh-T_Ra{6TE+9>{u?b}J^$J1V7JN@`3mcPxX%|KYigH~6R8JM>#W z?YRp2+ih+sXjd^Ifd6Dh59CUhADoA)uAM*+b9eJm=~}6t zyen<5e~0hZz9mAbi9{w{EImfA!TZoz(nLcGTyEHpi;OR^cl2w?N$Lvx$`Hs`Y-t7? ziP?x?NFy;XAOC8J&>AL`nAhE{caRBk&6UNTb^27qk3>ERgFjY`V{3?&|D`Nxh#; zK1ZbZ74ua0)?SD0bM%Bq+d1OKX0x=jrJHCwkyJCXC_aB$Y_Hn*qLBP!fh@y)3xCWz zDc#{8R6ylcNt^l&dG$G`q-%V1&VcOKF+si_nF*P{#BBF?lhL#Z(opwKXJz6t-?zMI zss2_m4ZLUi8Ux-|FAAj3GY;^+;r>?NxRtvV(7En!9Ptx9Ira->#+MlQvCY?;(fh`o(zd#vanjIQI$VDW3o!;01%?9>gAvC+P$u|- zu`#~F`WcBPMz~Ph0rVp=-8skd6{*C>IVejnQ93cwKG=9NI!xlXwK2bhOU3g|8w~?^ z6=;TP2i=uZFMKA-rEs|w$%XyQwfHqmA~xA~8~egs#5elB8hbD|#aDfwEFsKu@p#V| z%IsJRJ@>paesl(l%bAHhk3)}zIj`dV9Am@-Eem6VY}2u;!~*}Df_DYWV%pZ!7u+p4 zOceSX74$1uNJRLpd769_@9zC0=VWf0G}QMt>qL%^nD5z^K0iwlc9O6l}^ODx>3^SbR&E#-G}&K^CuJy ziz)V7@8UXiy$9Wg-o?28fud&>h;b|Q3p9l@ z(uhKnSzl2R*)n)1zX+Y7^YeyNWANwN*ic9_QPSN#URcAtk`(z=%o2B`^p*D(lf?`c zxAi4>w9FCgst09cuH)!kcZPGTtAqHsOKINg@Sz**J+L;;F_J}QYwS^LXS6R~=joMm zsdyTk)a*&l6eGii+?P?#Y?1LY~CH>`xyW$OF-waiu8oyz zq!DK-&4S_lO|VtoTBsujao?G{p$S}ARAcIfk$SFltl_w*OZimEL%mFNOdX7ekmrR^ zb4;AC_$ZVq_DfEO&JaA;UX=X8TEJ_e>n-^deYtEGr569?HoL-@jp8hCp1*==iC^@R z{>s2y!36I^Uu$L)de+_EOS!TUJF~$($0b0YIPA_V&KYPU^9=*#n1wx~@R*g>4rn{^ zJ=c^pU&%Ph2G^w2xh3yV+Icl)L$P0S)KSplhobJHg?2LWTET4Op!FploiBltO-Z)F zIl{`t@I>Zv+FtG#B-%65*0*L2;78Pa1b&?4>kRaV?md9tuda2VUwGi03a)#9ITJuT zmx%%U#k&@O_D28vdPcSp?ZnH83~CL!7q{SQY9hK=vQqp9DZ|#F6r4vAXm8O#0TNj4 zS%~!E4{YKKi9+Jm{rmZUWg_(vnm~?{Vw%qannVajvq~_j;wpZ+8JmAlep?d7P2sgv z&5)o_?^Tzz8gXx^s`&--+Z^M+HX7tT_XYn+$2?J?d!N6pV>BG@zV5>uslvvL&HI=A ze#BPCbGO2tz-eac9yuDa4nOOj@&BGr8Rq^K#A~DNTo9+R3<)5PYajUu zNI5hW%r_@0NN^0VO@IFPv4DT?py0T6kghBINLWl(>&l=x&~KF3&{DKYIGAizFQIHaIZCx`luZ#G`RNh_NeNl|@5O<#if;k2ZYGP=P_A`w7zyDiFqegq9Iy#${a12d(b@r1* zal$#_1MSwr^Wv=)=k4l=)KF-_}$bW5|75V8b(|zI*J4^oDd=H-_6w1>r6Nzo` zQ1vy7o`B%KWMk_O#Lnn<)ppBFB3&koPPQ~7#?c$#?&i^wdgab2he?8CroZ|3!~>ZO zQw#1@;uUk!ppefc_A^}!mz3}EV#cl~$&o~f3)OE4MB#`tRe{esBtf{7A)pTLv(N}|-30>v@c3ECDY+Lh#62f{U7}xNWEOMQ#NKu61-|se(H`^% z3j#4s1G_ekKSBE@`#QjLr@a->f3jx)owiQ~danHmIQK1)Kj@)WSFDOtNru{8vG?KK zx=+^P*sk2Ws+RWn*x`bnP-7nY1x|K^?K_t=@;E6;Vo+~B2qsHaa!`l z?TnO0M5Hi3n-TR#X%qJ$eGC0(Jb_83v-D1BO9oT@K=&k!&ND%mbql4j&S?Hey&CUs z=d!!$zTlX3vFI_?25)9+V;LVm-Z4gS!`VGP!Z{y_aCL}VZ2vW+FS9;wru~;lw#yf& zDtA_u;8MoDwoENY9ocbznkmgHds#qkl$8c509>aZQIi7CXI>9HpK^-$;2m5PoijBs z)7Pi4b@p0Z=~-PcFYC3W)*X~TBr}ER;Ax*bDI**2>pq+{B5juR4|i$W;FP<>0%i)8 znAnS10r;l7zu*mgBN+kUoWyWJd$@}acxqhV>ckFoo&bLS#yJvJWaNUvK+{CaG z82d0yBy%D@(e_xUb}8ap+Y0sfoOk0FSVa0w4o*UlC4!o4TM=JPYYk>>WgtHRlb0gp z`&t&Z&f80L@h&US=4MD6c^Btj%^5?C@m$SqoFkI9^z_e}ko7`3)Ki(cCu4q0otvME zrS&Cx1@1rIN*wO40zB7vmVxV<(~Se(S#Ailmow$Sf4ea|fsA2Jg8qZYYy#(_%JBls zgWN|LdbRy^oVxKi^-jl^xL2G(s$u^_)^`UsZFPNzgpojY9LGblC0X*wfb1Ri-g{H_ zo@H++8xk_TE!nayZ+RpEN||Lt3uTsB_MT-HXn}st<>~wNd0+j(Pe-y(#Lrjvo^$WH z=h*7;%@Ow1Q*FQEVZ3x*HRF&pQC;KCv=vIkY8ltZsIU%Xxo{4HpucIy^2@D*k!Vs* z6`?I1snk=lQLqx@8fBz$D(bKwj9O>hgblNA6l#rAkr&KZh%&xFhcSC$H#G;*na7Im z8|#rGx*75p*$xqzRtLB7N$h1>vtx<;jonk#+j&kp+~(Eaby}sbnV$_;?VY6e>C05M zvsm`nj8d4Rkt{f&Nlmnmmt8QTR2g$cIzv0b2#Zkn^87XVZ?MrGUVc_S7OWoqDR*R^ z0MoiJ z+-kt@OxIB$SGYK!z0P;M2K$3HJKF$$XE-JTUOzY{fO)59Hixd^J!q6zti8faBnCwe zQcbYUA`(=6`LlyOKh|J^K{k$Lef4%;Yg?3Lm@Y~fYg41BK3+JAS&F1nEkvUkDbh_H z$8T<3FZx^CmiiI7Z1a%o$d~8}+m>n}eFpv3HkZ@R*b=?SOoOJF_-G3zOSIRdLLQh= z(Hi4=ak(j6w2Yb|^64XxtrQ`;L$ctqp`)E%ncVTZGSl^hSZ3>}{phSGW-{-&vN_$j*g2n=VfIn+&JyVax}5smeoFd>@s8movq*YWne-Q-d}c7ZQ}deuV_G1+^poIl=DcXU_DFEelY(jT zCj8R;PN>rLhm_{7f*i_0wnt)_Yr%SLgONY1bxAKM6a0ABQ<`xwc$p@pgJIGXV>g& zg&i@0%b7K$@GKJT+>|-9U_7?O`Ax>Q{7c9TM`Zf^yjAEd$Fj7ab0#8L_SVT~vv72i z?FV>kdSj#ybIdkYzSDgX@R|Rgb?@iSv!K5{<6H~cZ(GNp)eXGL9S$%r>ae+$4e~qt zIWS*ZWZR}~kc-q~p$`^0x{>@_Txu>s9NGoJIf6WRs$rGrGCfDIOG`mZ%-{;OXN&=oSlNsF{40 zEECk|F2hF+sZbLg2J^@)?(vvK@EJqZ6PHLCW-IFizj=Na@$1lYjTKA z$jry~#hxK~;yiN&&o@U3WpdzTwb-{$Q8w$A||0W?H|- zgOb)zO@lnk`W*BV3{wtbwJut?WW)7;4x?5lB8)q0l=?W)7qX@HCrvTTQmgfMwP&Eo z)IHsK?N#V8Ig&Iey~2)4+R$Fx4RUHdhJU{Q4=!j?T@@AkAZBO$DCN$LeBK9stg?c$ zky9)9puHA9lPeNdX%$hQ1tO?i{Y=$Huo>E2eM{8`yo>+nXuy1DEhC|~8WuRJY*xyt z`)qG&>#q(WKiV1x=ljKEFI%$3m{6ko#!As|%lBvxT8-5-E1?KO&>Q3n!{?4lA^8uy{5&;)u*RBWc7t>z_eE;iNz^T_rLtPXGk&xUW%2Jde zy)^^HS@JAw_0|cnTN;M;-+TyOj_*Yz0w~^&zJVeWUnC&B|GPHRNgt`1S|!5bwV}Eq zT?esF^G5qi%~;)!;k)&1^d;1=(wW*NoWRfKK4h4@<;(EYqKmJz0>wIn%xPFU=0(2yv2lw9#zwVp(N5?Qa zf?rQ~xNGU&kqX5f@=)}kID1!p8Db9%Tg(xxj7CRPb8sei(W}%u^jQZ zxDNc~Nz;=SRY@bS846VkwP$Od2)bZZltI~<+$=97Y2CNlmUymyzV5YdHELI%*IqNs z7jRU+*K9JWg&ks_>BCGbxsm*s?)|baF4(wl+bVB?Wmg%$C5H(QT;_` zdFUcYUANp}j%o}g*FJVE)XstD`d{1B`Uiq|Hk9d4E`irsi>UK@Rbm`I5&l!Pfs>%n z)=e#8C2B>-y0^uUypKG(c3QC_<+1doKecF8>KA;gw^M;WbtB%*b2zts>J)U4EjtrS zxsccaZ;C8eEP+NL*ZdhGf;kQ~a23Xg0QVI(2#j|wTQlHiXW3#w`*t%?(G8#LW*yeN z0XtZ6@cC)fIPlw#FiH6r(eK4u>ACPG=_pA{Q=z!2oW$EurQ%FkTVjS*51+xqaj`ZR z{wRr%Oj7O%&e155#X6QhJLv%LzH(ZU*>JyHOFpk`2`gbVxUEzeF#_MNiZjgTRU&Yu z!0=Q%LmbX+V#v}`yurNIkD;fo5r4eULMBpAdGm!$$s5!jzK6TW&>=WC(2TcU zqaaCm2Rl``%oadK2MS$dna{}0KnfeptU^Zw=CC8JQY_ogVLLEQ(FkvBcSEj4blgV#Xb;veQ?G@ z5|AFy4TU&(gzTDf44j3S@g2H8B1YT`PY5nWbmbSJceFq7=+zNPOVvLl7U+1&P5La= zE71w^Xxw^|A2ScGO!&j_I{ps#6SRZmYVHVlf=b;I=^q|?7h$FeQ48Q7k$~j`}Ro5eYPJfv2O~l zo+?-ua}t^76g#_EFNyA%ADc;f6Hmx9qFr^@`Q2ql1M3PZ3zo?L2y`hR3*@pV{x$j1 zf@s-pUtwNpz5%afr8$ps*Wj<+y3Bq#e`7LdcFT5|FOZJbo1#`}3lY-T+*7ZA8(0tW zvL@B0$s72Z7FZ1OT7LhZy52+oQ%@8376QKedwK!>XS+57?C0zP_-?N~*<>`&E}5_6 zv{;L5lQz@M7PP@S$VY24p`XyxGKY2=v=iwn4N;4sX-F+TBA8VsTPQ-Env1-=_y>Xv zWygg1nnvoS`jI-Ew@*(9Uy_~TY6K6ULlmUB&i@tmQ4=(-$a$iN21cXhq>FEoO?4C1 zT3AIMP<_Z)r?=T^2^}V&lNuIFn0`F{U$tE@~(98Y| zh1t8lZ2J@Rwkz6umsyJhvq-rt79srJ3|S0DI#>{U6WT%Zj+-jI?(3X4rD&hDng3Ak zvLb=>r1zJcbA^M6Rcv|ofr5LILeJjJP5Cb+x1Fui`{iCoCH9f2X<3NKY(9vbN^J^p z$RC_tZ1Huc0KZe}iWChzFRuMszhiR13-})Bj|EufT?Ke<%B}{u(Dfehyxut%V9%Po zt&*B=@X^}E@fV;b@^&f zHM(%YPEG;8q`V(@sJ5xPW!WdgsiusFx0*B<5lhSVB+YZcu7$d6QS z4S(xf@qTh=aHoX|o<+6MtkTYgLJYSeCE9g~J@rs{u1agJ^Heim(98DPzypg7TkGmy z>#{+Td9Iw=gEk*_*BKMA+Rh<WY>fV&mym$$A-q|Dle4!4l3$6pSERdnAZ1YkDc`e0!>t^|m ztozVqx<>LO*47OG{NAbC{~w+OfcNUa4}jk~-`BdNUA=ukf6~^I26#?$ z76E=&+xLL>+?5wW&Zs;{j7#L}HfjbahSo&KY!hBr+^g_#K8s+*R#mt_4XX98f*IIiO;3TIlL?{9O`Nx3Bgg^V?o^gm6m?G&We(8{q_WY$bd&0Px@uHz zvgjtL7NHBsp4yE%3v!)QMjfEe!d|^Gz6mv2&|McMz^Rgip*11gYV9g+JAbw*5>1t~ zuj?m@M!quzEj;rBbdYsH-C!mL{f=o|E3%1^F4k}TRn})vjfKZ{q&xAJncrEv>F%jE zMA`8fLRRx0x@VE%lS*d7W9f@%qmoWAZZ45*EZ!u_HWApeB3e{oY%ehuD532J3Y(L6 zLb#N&;LEf8yeRr7SqJ$oWztq@{5~I3_b1?0SoaCw;Xno8H_iXGZf3H#72x%myB*;3 zlH&r>(C&XF-C+D{Vm%AwhHDMScy0^bkG$E6FwQG&Q_)koy5i!N<>F5AHdXoDlcEXI zbJcVCBcVEctm>^Gi}yR`tXah0)p(NN>$m^^zfHtPjP1x_f;2ROI;H)YI~+?j%C&>y zI%1#o&nptNOAxU>dTXivFf>y)C2nR$L>*XsM$Ol2L|8}ct*#o3y_@Jaru zCEZJJVsYN(#oIZF=mpP&qOQCGB;2hlSP@@fQVZt+@yzwz&9I#oR}xbOIa zB(&;-My7K~s%xGqJL$(DDe9T(tvZglwlboUCZ{6en!K9N~-Z>VTRAmXYb)FOTNWAJB?uZjTuI937w!h#_u?v_)b5A(> zzx|!!kPry(?(bDH$U6reu>6)h6FXXSMlb>~g82eO_B z3bsmVy=>n9@#Qw6pMn2z5Sjw~69zf~Ce5sbud!@gU z)s;i&GsFko<;r?`5q?PdP5E|H7oq+Y+YA<}X z?t`t^xDZ}ZyV0It+yg}f4%n_3bKni^PV)@Y5a>PQ<6R{?@P9?3v4v!)fRL@L?OqZl z?=LH>eOp|eyo1;n=v6!_Z3dp|e^A(?g*Be(6 zt?bU^e(HS5_&^uD5%U`O8#|e+0Hf^#fq!DLg#o;8n+)3RZ_EaOLm45s{?a-LwCkAQ z99sj|e$!-x62#yOO{1Wf#0UImW19Fd@gp&es)56#snTWo^Sn&lK@8BeND5{W!Ru7c z#4*rq%uxEGGKG&qXF?-XpEd6Im6mL1q;3ZB(fqSOLZ>KVXaQ%1v0V0>(Y&rN9VOpn zTA47=v{QPKbVheEHx?3Tr`YLuj4Z2rg^hOX zLHpM!&C!ldSZtl$*2vKh3k3eQ&9?uDCI+j+rrS+u1pCqat!+4R%XWr0jTtT89vOpo z3g%ujOFPt#Dz3=#$(Y*K#bMbY((eM&qITIrVv+yH0yMjiWS}=Le|?q%J?DO%Juma7 zcyDlB@KJhO-7PfEMYY^sc>@2_|4s7C|HK>FJYUzZCwm?Nza+&IgEa6r#{D(!wyV1k z$SYil0Pi~Q0G#Xe16*wiZjz~af`2lu6fKkpq)#addWS!i>Pd}o5xz>g%y3IEO>%-5 zuC3-OOke;8|I$QW0EsA z3N8=Ydk3h-(u1}*^aJ4waEm(SZIJ#EI9RC6>q9gNcnj9#32}vQbpE^C`{+8BlMCgJ zK}NYwWH!lx;dG`$>clKUGZBsOn9|*``Pf|l)YK2&uW|fkzOVJ=GknW{9bxre2jkvQ zZwZj^vaf)=juiq~#Lfic<6U z`_)~zeMO^)7;O*kVZ?;DRQKfU6-+^|E9+tjPE+CY%GZ^%wpx{TrUG_pb0vJsbYTl) zn9NE?@@`QT(jwCn&Jg-1=^W#W_%nt{_yQGFVKcqOyK$(R6~+M)ZlXkWi0X`nBey>8o?w!~HA+W%IMgRM=2CJ1QfxiZ5y6XHv0%AJ}VS0(SxK^q&R% zE%T#5X1!s6N5VG)$V0r}gZq!!?|?jtoei*yAqnE^R}v!Kimh+ZCDL5o3gri^N>-s6 z@?9pDCQH*EQ+AZ}C&p|&y`{hS8~kd`xR@^R0_0=mtBvyohbp&MT#ap~ZmoM@T@UAK z+esk$LQ)mgMjFgr5H*&1LF9+`s1z871p~qJD}x#Fh*3h0evI)DHWG@|naS(Ow{TCx zT|*1lp7@uBHr$6tc^ApsvrZz~pXD6Hc94boD_MfINyWa8>^Vpe=j@` zj7R#C8C`f>;abS62NgqC<(#IC6}5Tobvqo45$C3mY2KR#1R6QY9xw^X=8`Dz=on zIZm?BObViO2hjlUeK6jm6+W5QR!dPs@P(q;x_;Dc?2zb|elFPz4M(OL-s>)js>LS^ zELjVU6IYYVH@>KOEjXlyt6Ee?cute)o>=J_&pGcLk5*dDHuF#PWJ!6RhyDdYWL%I> z?M@~locGvAt}i&k#JW~FQzd;3)9L9p61~lzOiZ$_N37z{u69||ifza`S9!+9;<#WW z^YHY>#cA*x21?@;^%7n)-;i%E*pSq=x`&pR-=B9CDs*yk9_!;IRqk==CE9(GRCXJt zspSK{Lh9xL`?)@V10IJ2`T+doTMu{~;5!3wpf>_s|Ak!#up3(duxCOK{e1pP{3+K( z4dX46cjJUn$)c}45KFU_GqVQ^TkWiMzl-Wi8~c*XAIR&hX@H_G-%H8@1UpjpSRW}=3`p&SnMBa z9y)`Hs(fYmK3JRa2mYU?d>*A!Bt%dH?7y<3UGMRbX7g(YI)5O%7OZZpOGKQv?yBA9 zx`RVjeV~m?DtV^;%h$yz!ZIoo*v+=4=sf|!yrK?53CK)*qD~XsM>y27Qrf@dA#WHp zB%WJxmDkr0O;;9=3)a<{WHT3?;@lDa;kZ|@vFvyFoRgcM5kD8ncW%jEU8RJ_TQ{Wc z)@GosojW|+YmI>CQMCgB<^<*gJ}Z3XpnpKUDu5l?wE#c3hXLH}iU*&IavuV6$bXLE zyn)6?;tW}C(DE-s*30_G^&}ajkF-nUVoiqFgtv zZcG#T^*edBrhn^bIDa7OUw4HOp}mp8bxrKck>lK*wL2UfaZAw;fpLybB1|myU$mWr zcA^8=%~o?#FRZ(Ls{Y0QexBmaHQObL{(dD9$}3o@cV2PNtq0H~@2DbYi)YBUtf3&R zY8zVWvE_911Na;N)-$~NE^nN^v89>@Y&qM2GaL)XN|v2c^7Zp!x_ zpf^NWLZ`FK=nu--2^-wy^bg#ZQSF`8!HB4u_{*+uQ zVf4>%rE!xaUej7qZ>+@1)aTHfnp&hZ!VKL{dLs%X&Cr&L_e2~|RB8BvgNff-m7)h^ zOR6P(7HVseV(ZMoP)2$<(%TX$`i&N#0W$)Rpi?EY=wG3p^aXq+CFGk;s8mqtP1s^O zB7LqcPm-G+5#O^T@a{~gV0GXHa@4|2s0;K&`Y|^C%s?f2i&4P){HYSk)=Cucm0(|( z5K)d-fIhbN7U|v7P}o`l%N>t!+B#aa13T^W7E`IG&=bM^DF;#;Beh;l(YdrkqU&sO z;iELakjrk*SEhx>t#Vi7-cCJca5#Hp?MV67^s|LXkttRfhFXg}zY@*pDPPyGO<(g5 zPotj$-~JF?4*b7^^ml;&CFZdJXIju+R8;8gNCR|YBw>{gt0t-)3YW-4yE)}dSdV#Ora zZItKVAwTH)N%DsMR{qJ^A5(cm@=eY-iP5=KE_Sp+r(tT}>7r{{&Ct8PxkdV{YO&fY zD?F5SMtGhj3VLR(;cxbs^44ay(;joB<@}QINZrx7C!;KVKV4}ml{Rj5&L}3Au`N^6 zonP}03~)~1G_*^#GY<#h{tIwF@j!%{iM1t+7dSgS`;~5_*7tzo)f=H z^_w``NJsYKoC)R{o#wP+Pf5N=;v6d(VRjLR?U&KfW>~t`#v*d_L}{390Fq?p%RJ^1 z5yx~{`a6XS`qHgs6SV|CxSk@L!P%+2WK5LK^?K7}Y;U|rAU$m`tHPauR;gXtp2Up6 zxD<#DCm#E;l)pS%h~vJN$#Rbs|HeCCaoydIIPO`gh;%>0i(PJo&8d`>ps&3>3eV*t zV#4>R;6UzQP?)z-!P?wQ+(zu1yq7tNHM88m=5)-dCp$V9XRXK{LY-&cv`o+9)6>+e zseu`rjP2Cd*zA^do*w{TiR{<77#@4)YhTHJ-G9}d-3;!xW}hJqzrz5w4d}UHfU3mmuQbM>R}>kJ{=t2JTa76EZxI{=$!yoPmDn~_X&KXiE6e9>Tj2W7i0 zP57gPLeiNqTzL{XLHk3Fl%0h((}+`#E;n98Qk_CcruiCi*QP?|nr`AM+gW5Yy<57{ zye!F29g`fU1@HnoxU#Fc6}OezLi`;O!x=~ANY!v-?Ktue+~ytC@-dr1L>_4CF{ z-}r~7e$VzLq=Bm`FIcHm;R{ch;`v@O!Z#>+0Q;EO%^p!)ao@y6p7#omy9e>bc~Vj7 z{ESTs?x#8)+?Ub;s$_@eU&ycJG%JqPIw!+l+|H)LHt< zvQ3<6oFrXs;y_wcvh<`nI_Wq$i|7@d$6?44;wp4mtupxWzeEp%na18q^xj8ldETpp z%WqC~d2P~z{;=e4yoaQH{kP-~*~>&XUy7VzTTAKR&AC$w@5SZ2Pv;CTw5h$$ZP|AV2I^Doe`d-GZm2bkH9c6rhPqB! zQ=8=Vr+(&kgF5Ae(#euRp1(8C8-3^+@9ma@eP7oBzxb{KUcdK^1iTLQRRdlNeCGiQ ze2oFGTwf(XiH`(!b6f9fAdAXI!w2Zu#P+q({BiIrv`zU-{vE+du`B+s=DV?EjuA1|URxR<-P~z{}LR3pP<}RaNVA)n{;wwWja*e*pyhG+tYDots2mL}0B*xP> zpo@kj_$!KqJ5aCjvbc}2-xwtLI^l56AcF`WF5aUq*I6ZcWP`d%H6J;Nyf*xyoR0j# zqN(xTE5rcbY}q33HR&O57s(=4Lb$#2^epQmyliCrCeH%=zGsPcvgZk2=1N7bxDH8{ z+HawqT|eM_<~%XbA(yDQ+Z|-qjiO81jW$l^xuQg^m1&l-tFT0W(X^-~Qg~Xo&EQSB zlb=jofzKho=1rhlz*76f93!<|V)rOB|E453;Z06^=&J?1ZuM^hNcg_4m(1{;0sJ!F z*8rROb^<=TcuxYn;Y|QM`$; zCH5t`#Gj^BiG|b#{DP?$=U3_;rZHYmNH>l~+fsb)V{*GVl%8a|3ZX%N@T}pk=xxFb zL{e4)1tYVtY{3=Yna$nA(QqSMl$v1>gt{DC{z1G^=X2d-i6eJ&&R#c{~>IXM2cWQv_7 z&MWB9ShrQ+c!2fgGMuKCPU8KlPsaACb;ZlHxsi}!ZSi$=@7NGoqv9~lWEh2a7N%;u zid>eF1##M?NLOcg{yXJuMB(n1v$U!!mgPyyxT{aXlG$$ZC%(mi-@QIBzzT0V;Pn%m z1aLN+53n1%24Dtz1>kzN9PrzWwF9}K?`}An@)J!Hh(a3TH8uH&0rX6+o{A&7Tc&YQ zY5`tt`N)|=b;Fxm)+hEL@1Sdp83|s)UGd@nvJo5fT!)9oPOIiaSK;qtt+8|0j1!Ag z`nVxOC~tzpEXudv^cLGl z=#wqWTghbbW0`~OQ0p7+w{#=cWPQl35-8nWEZumk(SFX(#&y6JXn2nQ9L2XQ+hcRs zx?;)Ju9BIa_eBvkYP6k)Dx4qk0d4QeFBr4=4RY6Q$-}oi6E}75%5ELqA35g=P5(#1 zKiJOG6KOcNI6c6gm|%Yn#=p}{5s*d9Rp6)0V7|_m9^^|9t-+RFQVg z_^spQ8$&hfNUDms0zIz0N@D2mkUI7hRV8`|TT5HgU83tmQ#o7c+lEQd!o>H+<^MY_ zF63FgMJdPHX}+mfFp;8NHFxSnj#~J#c2RAqgP*j@(8J%_@j4bIYdjrnI^BWFR`d+I zTHPMlu>U+ugP(FwIz6zUWTyX5{73Jq;?|x<1jVX~t~;0D2DhUiojHz)?HPH=k$R*V zFC}XO`Wy-&GRa8L7ypl*;E535L^sG<@k`LQxFQ6|gy=UIbiQtc$UxA@0L>hD z7M9IFsBI*e3Qf@bYUoqCL8Yc{lWh`?2+HJ__2Rf~x*>{5oWN$Ts#a=)^WuxiZg`RS zKw_rp9Fm1*3#v`6xUs=N>QZ9_)dXu6=Q2f6Jz!JSQj=PssLhamGHEP0ijsGU-LBKf)Oq8~0YrtXzyd(#Tqr>!IkToZCvq+O9D z(rYpz($2!?@E9aD^$x6&T@O@CzmR=F8^~s^L^kjxVUV>A_>g%6+E{S^K8W`k#2f{_ zsLL8FY`EXmx)#`f+l{-xJEkYpkn z`FqP_9Z`Z7bu-Dw_KN~{U7VA)Pl2x0?sf5;M+Bn+f4e?9viWPh3GTxVmoVUTI6K<2 z_)6Va+gWB>>~4HSnb2~V7pB--x1iXc*<0~z-Pq#XtVW9ZT6fX1ERnozAi8jK);Xyu zm@ny%%<0mJ?q)gtGJUw1`JvU#bgASV%(HcD`9{12zv!E+SmPc9+IBC`8(_~(_gqIB zc)aW$2as^@1jxEd0EW9>0lew>3w(ZzeL27h+JzK^A4E#YHk$LYmBIbS25y4BujmnRC$M<@8TWzq6}%GHB<)pRiO(TA^B<6-sY%2GZGUnh8MGX9xc+)D zyGS!bKjl(wq>m?k=WL2>54^Q=T@S>61yHt+YXj0Du#Mg0T7pdSJ!VT?@knn^*I?!^ zQ!q)GqUFy6p9`ksMaug5 z>HObvL#1cf?zxG%5z+}RIO{?76ud2ypLQ#AFQ%yC+t;=lhnhtk-#fX{w-}6PL;ODj zeC+!=zu(8V4~%anF99%^hYa8zPbL^Ix4Di0xx%Ri$W-<*DJ49tSQAa1CH}-G8ah>d zFI_18*>FD5DRmOB^j_!){t}x&+W2P4BV>W@fS?^(*>Ff{Q8Sbm- zedjE1?_iAoGiyKhA_p#B%jelQGr#ci@EIFh({}}jh*N>Z1)B>>rK&)af;|PBh_U{h z{8a@LiSFLExlIbD;Xk_5v!nCJ;?te_^gg*&l5$JO>SXNTaft=q2-#>v%ZPLt3O?le7#UNNl1AXau$x9i~0SKaXVar|6c%^@4_yt@ZuL z8PEW_D^Ez~Yk%TF_!wg$w<>Wuan;b4b4?j0>#lpG?q!tA`WXTt*Nr0CY>MJC=3&x0 z6Q*xUZy}bO%c}^Qzy{FI1^20w&X3GaS3JJmt@N#R4G2aPl?B$j!|`0VGw{T{O!B~) zA0XV%k9zGKd_;=e3MJX`FE@S4Qtj(6q}t9xLNRHn*!u1nI_cR6=W(M?H`FEv+N z6oRh_=Bdjr%E8{bK4*3*JclAqQ#w*G0-I*jrM1rMkA5(#R0eA_ZIxT~FY zo>29yYX{p741;{_tT%s+a zIaqUDQ&UH@wd^z5K}SlmC>+Mh(oLfxn%{kq6eBe%i4S9&Mh>dad#Ve@%Nw9(iAPQk2Fy4LztPpjh|j%oW9j zaAy~sp)P&{wRC*bs%>$qc)ATs>s)jh-eeJ`7z_G}1Lgw7;kCI z30y*WO+CC~xK6!cGmS~Yt@els%})>n^C@vX*O|VKoXDVe#k8S2;_c{M-WF31@*~|P>7bFp!voLN6z0K0>nf<<(SD*)^(l4> zwo)ak*V*$Bj`3jaDEmctggGy8n0ct$Yu2&b=rHXtx~IKeRlM=Oa6YD$n2d~JTa}Yu zRB}#vmb?bvF0P8p-gwojDPAA{n&-B%MRAEsp#}8Wf<5J*&7lFN zp|Z;4J4q_t9b%<_O8swuUvKRy!0*|>S3lbAp9cDiuHKGdoLueB1moRAdo36Tb1NSM zd%BQ{1^so%KZkw>)kV-K`J=u|^&U}$VmNt1cpG^mAF0a@<`ummJE7%>o z(s)DCOt+}!2-QaXhXHQf8rYow=xD$yS=hEeMIvz%oT~q1+9|AoKG&ITUDV?$_tYL| z#_JiwKL347mGLee&(5Xq7*Ue2gotA4f9nXI7k4#HmW~K4EZIuF!>@W*7VlAI;L*WM zN$ILkNxny4AXlwJZ`$MX?nNJf&vJgwjIB}f#!9DI|CgSSqkb{q^{!_VnEzZC%&*e$ zna);TO#`lmA+iA(q8aeH4iGKW4f6j!Uh8|CZzS8XPwQUM5h?X(3}+pco$N;!^S+Rg zig{?N0HY|`Cpby4&(IgY!doRAO+6L$0(0R1*419SN%xr^nLJ7pqgK=H6_G8DY7uk2 zETcL`nPA=~UC8UIjG<3TPV!<^Lru4!Z}{0U*Qqe@%>ULCyUlL;MRHenseYK*g{Bxf z)~{g_Fd6x-wlcU2cdn5en8wblJtSL&?CArhn^b@Kbsc?E>pc_WK%3 z8v81XD?L8+2}>4TbxlP^czgvNo$a7?j*fZVY zX{+^K%4ejbfUvGf;h`&_spiKD5&sjkg3geK#qJSEs6=85wLsXO9D}v7%t;)hFM@Kd zlj)5~lg-^zKAYMr{g(czQPjiof#&VWov6^*60=TGSz}(elRhflo%p1xF?|fJhwv?W zYIrpvW|brKjjbH<+bSOUGkq^O-aIgNQ@7t1oxI+{6D--bO18l~DJgUtE4f9-aFXh3 z(Z%N3vAg^i1d--bRr#J-@EJ26w$`u%`Pn?a^gF2+FE!;>Ib;cSYfIiS66wpp@#1N6 zE#4wfQoJsCAojxRDO{2|LbTLP<}XRB74VqcoS)NfX+}tTwfr%yoPMC#&vs4wXpTzF zuV1Mc$2kJp(s#xszz_M`R0VJ;9R=FPAyaRFr|1cwowM|Q;Fp{+#{hq&xAFkE{|35b z{Y6GfnhNGJo0Auz1BIWgSCTW)M({aHTCz%bLa>A0D|aXAg!x9JG>xj_CmL(;!REo- zTFqkA&-6-c8e9+m$V_BN!8rP4a)r4aTx;r^l1RVg!6r`fT*}5@WYow)%3JW~Qm624 z@a)(|B*g8BAi9^D7N$;^TmOejY^@NXEu>Xp%-XskEvGvNiRIf&sXse)qVR1K6xGfx zh_kMbY`F6?d?D}$HqIF;9_oDyPjYS-$2uP-t#%NIT~se#ZfC_c(s5F${jvBG{v|M} z_}h&6_~`&zyfhQV#`>=oPRM#AqS@vJXR~Gtt~w{?p3icYFVfG=*psCrFA`>*F;ho> zQPc$bXKXR&rzF)cZuQQV4*J>t4lY2o<2K-rcBF_J+G)JA4M4(a0P`6cPA<}LUF>`Z z@NzJRXM;Qy{%EG9E6{pa$DCCd1zExy7NcSg>=&k*>*agGuL|Soa@hex5^oW?7e8te za_lM!tFexXdLFY2*d6>TseWqYek;E&B7K@?Ar?_DNo&kr zm-MdNBY)_5DLEc^ie2=SNKjuFdZwohe$>_7y3Ku8a+JPr-s`%8F+`TO))^z2B-@U^ za~#J|G&1n1Ff$iNr~9)D!}B`9nciRX*W`sIJ#($h{Wh-&mt=Njw$9^dI>LjJC*__d z4bod|+nia(E{e&uKV-$x8x?2k5;Dr%vjI>0JTfrO^=3DMaSvlR1MJS~07}^^Fy5uI z(?LHT&K?A~#zO+^5BITjmo|g0!%dk@@@!ro=#|+eV?=F)*XSeCXFQC*!uTuhOzh0d zGPJ{bnch|Wr12uHEdx|CelGNc8B{hs1QH7DY8w|lrNv~qbhY@FZohPOXe;6N@N&sQ z(axk*RX*rX(W1@YYi=dv;R4;**dj}Bd^}YdanZa3A4`ja(Rl@usr1f-FIK!ZHvK)@ zoye^h3O_uF6|Dn;2WyESuT!K&|4%vmiD<{#D$ z$0j@5=TFs7Azqb{DNShpX#^v!Omr_oyp8B{avDYW+<-UposU;6|G#M88L_ zqtP|m>TA3;_)Fd1#3!cKLN+TC0$#x4h+zWHw{pn)fE6 z4D0(jZM}E9w9dOEy0^EZY=>u=rl#Lkl&x|U+JpO*WL#b+TLh89dEq{rQ&41%x$l~rT~lPNo@^hIvAn32_9)#g^={#X zU>>4oOmtx*!*rw(dn7-FtdLCi?aR$J;P?W6Ty~_P6&@RCm)NRJTZ@!o--%M-7!BW60G*P-DZq%TG{wU zmO{x9%YvjebbHrlVma%T2AGlFStl)AXgqv-Ag;)oH;94t;xijBHAAiat;M zlDS(HuOG>)cg-tAG-G%!&yD=M+F?*6o0@A<&EZHr(V2zXcBK{WW+~?bMS!=IS}(wT z0WQFafvx}rfw2Hf{gHsrI^Q6G54{Tj4)W#$Y%7?i?OhgvUgBr0cA8E|e@Zm0`ApWx zEsa(rtssxcKPL1|tk=wv#kSz`4O`aXqiY5UjwR|v_sS*-KkzQ-2Q&*6&Q8oRYq3`J zc2!U6II+R9Imu|jrElpmjl@C!dXstcR+hd?+%?~BdYfj5!)9ab_w-DBx%vEtYsS-P z3$v7SoytNoEbX~Hj1I|oU%0DUx=+@&Hr3gmXfD4}_uk1NVuCopnTmfW3$1%$H%KJG zdF4{36H*zBSA1kz1s#CeI>(9U>24$L#HRSFsFP%wif`Xq(n5Pc{md3pa!$L2Q{vuL zd{$ePzUw-=Piq>4_|_?Uob&9sd*5a{{k2 zZ&z=pPvE=go9ZQWHnE(dlKi}W6g2|+Am13Yq=yR^%Ujhwq9>M$q+O+507H5awejfB7RcnUUFD>+*nIeF%? zrMh1#&6#6LF_TjEoBe<335oJ|1O4!?9u|y;J={uwI~*ecwzb|t8ora?To3GyaNbEE zH(dMo5v+2kZ!G(W7paaIpUI0QBR9720kB| z6t6cf$NB*q=iho}KoF&*FUft;Z*`%@8oA9dTbpEBFTYGt%F6~?_Rx4zIhZVx){sZ5 z+vt6gGlu3NOVxjaXZ^RH<@Nns^|B4rU-j=8lk^9Ys@E}%iNEgA z$-;Jn>zHIBK$-O0#D@F-9NGG85|beET`_;!E~ZSxbGJNV9;FmY{%HOq6Pr3)JSVmr zgQff+Si^0@D3bS+$6_+f!JgfGFyVzUlNinP=S-w85#4P$%pZaj^YWB#3{l(FqtsmuUwQ1+Ljo} z`P#N6C777CaxmjaStYPV zLN;+~bF(dWf%RkZZL1{mvH5`_(k_fSPOIfJ9A)t%gAsXh=ZdwYvAb00igEk!{>ISM zVpkV@o1sn01?NdTOSeaXI^Rp?C=XvTt-Td@ZuH%OB zf!(dnyO)=iv$I>?4Eltxq4>1fY^M0Vba$#NXw%L!KXLadewwN_zp}q6%1BGIWRgP) ze{OZ1ej=&NuS_3h%9O9lNzK?yzEf;!bt5CpxF>n9J38})o|C$$zFj6mCZ_J%wkYEz zatiSG9IXY|RKfxN-9gEbvIc(Tl3T#fUMuNuXpl|fTfjd*46g)zVO!H0Fn7~KIn{hf z_6yN%{YYEe)V7vh${|e4)N!^;%`aMKrgV3_ik@qknY`5*8ok!ENdB8sQdX(oBu#YX zZA?<}@rkY;6(4my@q4artX5W}out_B&XdVEJeAvB8mTw&HZjo&OYcMpF^%mb?g<$u zaM05vA2eC?xTG=YY|T~1jRj!5a=LvIK8{x!n`{?sdy;k19br1W?eDBicCQKE_9e5C z*QuRT_b$WjjZK^oc#%Hbhl^UVi&~xbjSX7e3(}(e8vME9W{M(cV@*t+k#f{GNA{O_ z4AY~qcXo|=u4rh%_u21E>BRoLuFW~5{J@%ZS>Xy%+%Tg18U=+vZ9+f6x#1?;4{?aQ<8$~qEF z{LP6mX_~N3mIip_%0dBugTy&tOy#lut);0xz&;+Jzv~k~w&x9~ca)R1j|tm(J2ZXi z>n+!~W|TD88k1VNZj_cz+j3u5YJ4%Vc9b-OeiNQ$ zgqjY1GbR1qQtz;YMs16Pi5`B!ePMF!112i|(Z=&wGiPR8aMcNXkUckci|%d3n5bK_ z`*>S=kL)1Y+0d76DgQxGOjJ1c#-$r0OZPjvZ*yi3sLL$tx~+G1RQ+Y>;1*5hf%;Y0 z^ZK}q^oEbJ9<|NWSq%r|`)rqzCpTP=dnRv}l-V#mVOjFF*oX#sVp;Ms`MbKpM8rB> z60DFaxTei=zub9>Lu7s2v8+>yQ$g_wgHoF3FIdNpe<)Kc1|bCriyP_{H2|5Yr<{ut+!9gnJvr&Jn@hQ&^{YX6M($V+RfU;Yb3J=@M&ctZB4SF#suVZ z-t_fTm1m7|rfth~f_bWP+~TX<48=2q}b%a(+$uI22fruT6hTh3Q zMN9TM3!-6`010*d9sUBs%}X7|imCiRwLBNwBTkqBFOfcRO^V+nh=bL1bli=SUgRt4 z_n1EV3bUW&jPyP}-`5YEhs-7y+wr(d#4>z69T`8}JWTgHy(7NVdayd$(RE8&c9(`h zvXu=hGiw@V#GJ0ZlyO?g=UJuz7WZH1S+ghLhWHKk;Jn zat5l;ODauP(}!xGCQdT$i%rg+Snx)FLSC1CqhJ9yLH;f=v`~f|iRHL27tBCg%0JhQ zEf|Y*js3$n)Za-I7yEq6Rz))MR@P^0pS)hkQ(4!op*d>DDZuAU=RLsN4kj1KT|Msr z#(FmboL@Tx)E}#>1;0mFgA&9$ncR?q`Dpf2v89%7aSl4fe;Uen&`iPE|Rx3Z5X2fvN-Xw0xk{?q4Mip6i#zE#c29eDg7iT?(r(4g*nd}|N zf!6%EXZ9!B6iZ<3qjXclV|i=$k)$ULo8qrHHrWjg-h}N&7LMTBvtnOS+GuEW&#JbAN-JTf0 zBjOzguvcwsfPr;Zz-xYeZ@??mpak=sw>Rtr<4Unx8l_GAzHc}M{6QYK50Qqktk?Oe zRYNU}@<{0S%5qEJ_^*5}Z?#nuKO36Ly=M)HzXw^OlWe@WU!Xw257u=tcli6XY3AqR z3c=|0?X7>I1Esm*AWb1PCuVGm;l5n6)v?cf@p?KK=gaq+OvFz{TApw1VEAZUF7Ihe z_eF^P9J|#%mh>~dm%g;ERVAypNH^GjSB4YUOd>~BeR_f{uCbwIU8jU~aUHiRYX>DH zCG6e$$@^2niiFu)TX^p!bWd2mWxv~#V2nRsKg!wB=ZWsA;TikIkCnG@dy#^;I<8Up z-c!*^qH$K;^o(m2&q;y*sQFTKm*ZiFc?T5fq4AYPHU5Pg!&a0$b0_DQa@uYj$IQ-c zUwotbh9xYcA<9m|mTD}dz7ag%rqsm)d%>=s4eYhL{s%CQ|Ec~Bh^N-E;ku-W*P#tH zU|gwl!)3tlf`)R?Uu>#t+6KU9tG8IP;+62l(zCY3iQR?wSwn0O5+Z~b)=sb;PPi=O zhIwoq6XKy}E&&p`f7QWZBCUNh!E3U6{MWSN+L8~RUA|Yt| zW=nJVfP_}tdO_o2_s5;y(n1yy^P5av-^DlIAr<|p=C}B7F(|*&Q&a+7!VBtjt@d$M zR7%aZqI29=tt9gdHxSs#fhilT;SobY2 zTW0Owz+dZLI~#2(=hbqtCfx2_3fga)_cGwQr`Hek2b=1?--1L+-T-Mjegvj@`>`37 zzWnZj9BdJ%M$pI&#Te}x?f&*z)@1^Uh0M6j0mdp!e7c81H~GS~F- zP0f!%sm{KeT9s&dxsKtLud3hh#B^mz|K?GU#P*`fuQCG~XbBDHX!pZ3@G-yFbJ6pY z^)d%zmv}~4j|%pN&2yi&3=mukmN8>|b5-Y;I2|m@FT6t~N-JbJ&3YRiiQ<-6&6NM> z8#MJ(SmrIxRz(4phsHrPRJdm2bYqtNME)LO3RP=gt+0#s5Oe8`xtHJx8nr`^&5m4J z-Nkh+^)&F+zP}#_eHipp4%=+NziVwR0Dkfr<9SZgc?m`~@b`Wu$Adm{rA7w)?tklG z3B|YzV`-|9fGDMGM|FXyfoGGsd2->8yw}oS;UYmdHi<13J`;|KZYePfYXy5Mrz5Gt z<4xHt*`9CSU|hgG8+K4bKL^%dA~yp`0hqG18ptBE(5=Du=OmE z_nEtb-(in23h=)cT1zmJ`TQS6!?hNv4Q>Z3g4ST?kYt!$qL)UZgL%IxbFhDq3H*C1 zM3RlZ;xd}wkTJ*zelGD=uv&P6>rb9!w-g3ey<8h5Omm&BtSYZV=P-@oSxSH8rgN)5 zsyr=P?#zt{s?3G!=!(D<%H_UyMLRZ~tq2hoTRAF!?n~h?OLqCOiuKStDwytHHr$fV z7P`+{_~v%}dF~5V7MaW$>Hg8C!^seq>xf0985-8b;j%1IjfoandKkYdxuId`MDnWc zMo^+mBj}>;AFvo-Qj=UbJUdRi%zL5$&K`qr_So{Xv!aOMo`VWmX0kTaotJkpJ(s0& z_s^M{wide2*fXyu_d?gZ52pN)FdVt>nrm5v4087Z{p*1q8{nB>&VzO>XSM(yk2$IU zzik|20l$arRRBNP4gs8PnE-hHz)vRIqOVXcw3#fyGR3c;G1YG{R5A)0U#-D5Nn*I8 zl$qE}EQs&bwh~_#Kjw+_p~wj|niGT1jGl_{qneRA9w{26T2UGZ&2v^&JTKFt7hHS+(ee(O*qU4UM{=#vYrM+*DY^4Xt80$?;u5b2ae98stIv+% zAN0l7UY^w(qTDmGbr~6=p6(49LKTk-Wkl5jkBBR3W3B37k0rL82B8h+ABoB68FBi1mivnwI8=tPWvggtx5Hkh$t|c%pe~ zi_ukXh;4oo`bw$d1{f1<2cUIUXX#W|ly#-`2q%RJr>C18yrIlEI^Woun@3+aF5&-0 zyr*}Xxnu*^Z3(N|jvp0ts^p6w<4?m+B7EsFO)KTfi0vMu!lbAbK;C|ep^97Fa?h~5 zxp_DF{XGe}y>pHD9}JUyHoI6D=l&yedR8Vp-WQMRbh-!a!E|r=BKe-Eg>#25W`@P{ zEzaNhnk3MEAGp^6eskQ{)->7PagJ|mD6cw;i<{)9v?QVlm(Y>GZlAJJ&6;F?Zclun zAPzgh9uvMCIwDQruUJ3Kw|=5na3m5&UQ3rmyerlCqVH9**wr20bfp`pkQ+j@R|RSvq) z7R=36wuXmW@*^lscjzC}MgPO4W8na!U&H~`6K;3I4ZB?P#hMe4#1OQfy%WdFOm-SA z47V>6=&Ump@-I4{(X$Q5s!|-MEm@R=JJQx){mIZKs)X8rxkz?&9Cw>6NqetyB-GM# zIQMq`?})W#crKMshzy>^ITsb{MDN^dv;WR3MPD=TGTZ02Le?`M(hb?S5I^Qo%BPI6 z;zHMmgoi0Jk$>nU+i7u3jR)ino8;qQyPv2I@UXyk%zKyi4)aM63q ztH`mTI#Ir*ANR-NU68=klk<*i7X_IzSZmAup^=7|@O4@iJd)rwTdEz+%fg2`R$DgM z(BOJzlxw+tgRnn?Fz+nS1xuMuOtPg&(8oE_aol)|XLJm+D@-Gv|rfj@#JSR06qdtD}!<7u4hc-=nX$1L!}K?!7?1!XyJ9X@e62 z{&awIpstBef^G!oEudl0o@=bSfTr@f99i%Ub${t;4jY;ReUgo1t>a&Y_sRwd{^T~m z&1Gc7Z0$wYAslpWE7hYn-YPejl=6x)C19j9s;GEtt5-O{fg#Q#8!6muF z{L=&WasRH)aQ)(#YU^GhcDp>E?3u!w%oR_Z?I*Z5^VOYfeF9mWZJ2lFa(J5Kq$9#2 zhlkilS$dhrKoSco=9te5S{W3v;|-G{$Dswx?`f@y21xcW`Dt$oD}1^6hNSK&c!c22 z_>@)o8xgT%P0L&bg-oUACdA|hqjfe!%4D5D##p-Bt5fTcGSegH2%F1u9E=+&YPJJj z=QAsTJjb~T;2_!s%4z!r!2f642QdHKWmXC()6DcrMEC!rR3k!VBVU^V`WK_}3z5hW#N3{SRNWNt=Rs z?^$Q-0u{PSJS?jm7CGm-`&%mDmvlN)X8sJD?TwCArgXT2Rc$?NTnJw>g}}p%3;tV= zFF(y4`cG?{q9ml3oo#{&mA-foT+`3_>x7i0oq3(2PG~T_wQb7H5_-uH2b{eNo~4R+ zy-oeUZ}jbGh*Jc{=eV|`fZr&S4fGQi7^Hw_9{C*Dk96uRXwPp=ZZN*_-+CBGtqqcP z+h~KDsRm$f_9As$#41S$G==w|x|?`E^pZDG_W|h*Z{+Fm2SSW@4n9Ku3LQoMTaOCw zS+-bn$T3~FQj?%O?aOm~uzF~5y>INoUVT!PV)N4ls&XnmTG}Xks>X#6Fz?g)`!`0` z82?+(IXXy_Mm|@+pigMn+O66W`+fC9{UGfvi=VayK1f$+=%W!5Y~47KsdA>FgQmUg zp|X?`gJ=K$*Hz@_*Td4rwzDvhyV)$ZRu)tuUyVmBGxGmNKNxpfyC^=Q3C2&hVY%nf zPlnEPLiRmj1M%K*KkYB!|JU)agIqfT{N+H~JYaX{T6Cbl9c^w7?DjEZDBu?|4gttF z9#MU-BZc3>_zPAJJH>U>F{xf~3En`Sl#-$|u$qXI{)2c!5yJqCEp7!>8EA2+__N>$ zwHA4W*1Y~)C%A1aj zxWD$Kekje>z17SJ4xk$~OO(RsdA3gKt<{_PYpfruhJ*)42rQ#aTC}g}nI^;0Tc|R6 zwA~yf0;l1EZY=$ZS4B=X^tSv3wW98*5BpN)vZ%MXSo{V)PO))KOj~4z(TvZHZ7xnS zcGCGqwwyl|rlhA^l&;{yQ)$h7@?ZHMQw`=jjyH#xX0sKd1J1M|3<`@EaPNmOjn|M5AH2{2W-2w2E zWm$Mr`2fptV6Uf{Hv-(pTW+ExUs0n_Z|WhPCHYI>psr&EiHaL-ypDOX5>C7^$d~cz z1pgn35Z}k<@*0g1hyWA7gn74M2o{cZHMD^!$vu6I=4JI4M<8j|a=BMr7xdk<6GPIS zf9m(^ABHz~HrI64hiE3z*VVADm9iC$`daDy@JqIZs;AW-d7o^7A%Ch{8gSD`;u4l* z9)dr#MPZN4C-9~A6G$r~O}wymMh{RFiJA7J!wgDNps`7oQED*Yrk=?3(kL(dDj@gbW=Rd2r+7$HM!f;mr?gz zfjLXkp6Z6WHe^atP)>JdW-34F3pvN}RM=Bi=^Pf_#2bg90KXy5h5zy^q=45(I}Ysf zK6_vAJdCpS0LZt!2Ic9NMZm6z!lF!VeSUKlTx5>KmP!*usA&dvQ`(v5GOdyvllpPb z81uv)sY0;Ir1i}-|4k5NW(hN-ccD7-E_S%|M0B0$Uf5J@27X){R=&x>Cs*s&aXPq) z^cw9();wo`{-*v+`E5sYRXF~pdN-|B8uedV_#&WHZPKn{?XurlM`=XtUiRPClt$#1 zuebIkxU%KuzGQz}w6v||AZfO@l%S>`$sqe?@l@kklBO zI30k`t@M0gr#sLXu-jeie*t;8tu>I>S~38d*~?AYq5;zV&~uX%rDYd+JB%yQ-m<0q zOzISp6C-6kH?o8w(h7E}=@{HrHkyCa)QX=keZn7V-cs!^P3GP=r{Rr~NYy)C)aE#c zjOau7@wz#=)iwBWRu{+OO)@+&GR|>iePu=C=DD`u(joZT&`>&?W7f8elG)F)e%1D2 zJ+z5@kqA z?WkqcLhhKD(PSui6yp?WnvcxWysvpKB9}Rodp{Q; zx-)dnjhrmqZpX;%vg~7;Mi-eW&01R-{PK3u!R7bWfKELEa$;_r+ANzjhv0rO8BnvPgoiA z9_nXoFB%!MRq%jnA?h6SfZNhI6(IRB_prU;j?w3`c3WOsxUxg0&IS`5DT%ZMQW1{j@Q=oWhN<*NAx$X^!8VRW zMcy?Gw(OAZHRKXs$mG~Rh@Z&|(JSN{GKUI*eKVZ2E2&Gmm9AB}EAz)FZ!r&YLh~ET zrZdqwqZCJ*MKI~vJ@Q&ta9kCcr*i(}Ww?G$pPIb@Zgd8we$7}cTI$S6EKbdVHq+CM z*|EV)5#Y(ld;-|PwGZ(3i{l-@&h#Gu-`lQ&dba&5@Jp6ivqAYrlN?|d-g>HId6w*! za0K;h^qH7xf@|bE{%hGXD1!0`OfiMro`%^Gjnejlsnk!J-=#~qeW~-hGRyI~e@*2COj{cOmW zjGL#_GW^|^pvf`f7%q(Z$cqjYMBZHYqidgvl|1oNo|O z2W?@((Zn3$uyr`5AxDzkOeWcM;u4W=D3{aZBr;puRlZsiY_LY`a(2ij3-&@2nVnhD z1t>q%rOuS)_ZIx+oSiXDk;0qoNKHSL`y2eX<8?}UPCKE%A#8a&lZ)m!7RUBZJ1gvI zH(B?}b~sO3n(T8Ih6ni5JB9$GjMGGE}2Qm+=onWyr_ zn%VGl(=2|qF9L6n>0;QV&}!&UBagpI9V$3y?C(g|q!_mnBU~eGt<7z4r*ob?(O9T= zJ9b!GQ1`U0=pw^iyoXj}s}!V>GjzKxh0^B)seNv|A3MsBf}0Ej4OCi26ZuQ#t}l3q`A5VsrTke(Tl-VljMU**4`iv6#2ItWJ9ySIH(Bv5$C|`*js(ku26p3 z=GM@D{2V{CswWf%Y~Z&$`L>_pbo%m0oYKy7=;-m}!OCuQxqSmMqhyUuZz;i72j*ID zl3Vb~FcQ z#-0Z-EHWN^mzeUqz~2BDf494Y|Ar?DOW;+ycG|7{fr1=mGG|rbTx45BKix{+T)}N! zoKC|Ff>x<;?IG?9fmju!?ZW@|Zs9vMe&;jo9b=PpS|Ly8h zd^i3sFhDKCC*i}x$?7&bSQi}LS^ZjjP4m5ursHY+V7QCkR*}cLBG_Gi6rZRWD%{Po5_`>7=AH#h0MjkgB; zrQ&PAXC2k(fge(;k%RBhL9-cPPwmtHxR>erFp?B0pbq#NqC&_;y6S83DexlEVZDH2 z;9SuL{RrO-%f6yMM2Rk$|5zA+rx1JjYeY+Re;GPKn~~4D-6SV+1@ekJT7QCy^JQixwydv@_Jc_H`O63_|MefrsBeZ0{==Hjzz7@wu*mCU%BAg88N0*|(uxYY? zapVq-j6A^WjmYr@#A_&7G*2tl-{S2N^3-ZwcYeL_M8yLAHGZJTQ?W%q4ibwZl@<6` z_>AaC`DOhubE+dOolkn!0iG&M9=>^nMqNpGz?N{<6J|sUsbrbm`zCh7B z<#)0jA*z{WAH2EoH78#eW>`zbacvqY`JU{^8=xIbJTNThAJtqT78$CcJ^Jlr z3quOeslJOB6Td)0M5>C@cYwAcJJmtNPTmdCEad`xpWqI{DgOswB#1!-0c-IrI0lVr z5lkH9XQHbkPvMMcfVj2lPvRZC$(L`0k3S;)NsceSV{bz(H8j6v)(d=vL8C~{4EE)n zWb!gHu95j9lADljGgKJJ?7^u4hEysgvwt#XxNqp4dN`p6F@#(!lp*7YRe;CiqyX?O zB51%{HlYD>iar@&82%4HvF;SW4#Y0tXCKkT06C6y>AS*mu^m5Yzy$r#8@Qh#588@0 z!xIfcXfN6me@GlG?TUWIpOW`^E6@)3O>#Ro1MR6_OFA}JqgnW4@>*#++CKVI5O+q3A1CAa3FN28}p>5PkWF z(Rb{5ga8VbXt=Y8dx9|WdhQJT0LeE*Dxwq^)t{2(#pTfkxj~dG&3$ReqRy2<3<^JL@ze{pxlK#(Ox5*Rc%B&!Uy5&h}niD zUhirxd5rqRAFkU+%%>8d9=eyra%yh0t=d73_1TF7+EMu5#4~8W){ofh%avCXGz$-- z{)X-N4Sg~Bg&Qj__36#@X63A;bW`N7IT><|G!@tdYY|x&=*M`hPSXCRy!^)-N%RYN^CA=@% zM^{4}U(*qtS1lrzSEM04y^u_*3`M)?JW@rs~AddM&o zDpNhu4k6-7s*njGz3?*K2UNt85U-WTkp+B;NLN2Zo<+7Nv8pLZ4=#rHDZPVM@U{{; zo429^xt)mgwOX-&_fj`7ycT`R`$c~UZ$?IDa|;d-^^`DcM81Qtkm5|eVlXk(fMj^{ zPT~_tPP#NVjvx&3RC_jtpYzSgEzF#TUor?1W~N@$og?yD1t^0L2RvHwyMXWe_OMl04J6Y#V2UmqkXk~H9d73&~w#s_=NK5$c4=V zs2xfPQmz%_^Q*n0UsbvITGd3+-Rezvv9_yll)4^I(wT(Mt6P!n%Rlhb;Pk*_`gC$T zGzNdYt~V7aIOZECm5`74(<6^Zq>x>p0QGXMoG69}Qio zmT*KcAMdX1gzrWQ_!^>4qd;153yfd&ci~Fb0{s(x58>$OboC}JNA!o!=KE=yA@g~^ z>%8it$W7h_Jy-J??F+5J1EU9u@39_L&C)lJ!Rc^e4YAsklGe6hl<&EYrVh=&v+*Vg zr7To$ zt0w^7XRF5m`&?S=4|rrZ&j95G{xLvinso-()vEdd{I{=pRk>TcRyA5!S`n-%RsIYW z=*;T#%FEDRPJd0ViUmzB>7t*d&x5B2o>A3p4uRfPc2?cNkArvT|JKojk^FP|P1VUb zhj+GeUgaI#MP4)IjH>Ip(Y%Y*Y~^^JaotV*K%f0=&J&lktG< z2ot}Y{fNlLPjYrfqngEf7njWvX=mup@LIBhbZwOe!VMD`aN9wKm6yWbDA~< zbxNv@?F;#`2TGsC?1%HByJ1q#IA6DqY3Gb88L@zc?D;epQ8n<#ZK1O5Ks~XPv;? ztRl+q{7*kc-T=9*lGzoz>rc6ULK)?lx*M*Z@a5|0+7YgKkZ|*`8nZJFI#XW5%y&!{ zzNu($W9;W(d*uJ!iSMY$&##wckoQSZmHUFIkDFUGgnlWQ<nCQMi;@$p|Dnex95e+(O=bHH+W}6X`hoX*-3RPupzio8yeuWl!WV+V=-c!$Ivr7Ok5 zl+CeW5}Ww0ej2(386;kB2tflirRZDT?XdCWFZ><+H5#jQk&7p?;i)lN=T%X*_J(u- zlPOe|x0eoM1`AsiPeyZG3!ty%Fp4^kL!NR{=w}@Qt?=0&G2ESXUF8hsAV<6`TUYWL zcable_5*I5pt#{ObIG@+ueSapQ;O5@{#sv@7Xs!D_41el1Sy#3e&uYgJkLh#J?(4Y z{78}PI<+CXHLqNDw*E=cpp?qkmJQpBl2T|Xr!J(ZdFoNI%e%hdY)Tu+3g4>1_>>Eh zEuQ+^Us|S0@4AO)y-Em=S<75Y>LHWJ`Z0HE@+^VOZE+J%y93s>z9p1;JlC3_n<`VjVOYehqa4&gdSF|6i38Nk)W*J zl1?%j>lW1m9f<7|r&RSucA>#oebpMl56~L1f_yJLsC$7-*0ZXN_%L{|wpa9L>Cdj9 z$oFe!$K)`xSlp<=(n3ZW-I4PdJLG!AeOVnW>FHd}*~LL5%jnM4>7^#5r4*@>kXW69Z zYq#c~%}kY+com9O83&~K-e)=K>7lYyo=cgfDFyvThJ@cziPRoEo&a*YK1^PO%WCpo%;`cOJa)Kt&r*Q(~D72@ftuSlG< z27BaJF8)z!l7cFw%3N}FE@7y7X~8?tiA8(i1KP}u8$5{a=o_9-OaHMonBk(PIQbxyLwMB zB%SQbHZNut*qfsq=Az@C^&0Z4^|{4p{)|*1$-*_1R+KM2U*{;u%x+EDGw?>I`f zy>3VT54rQDYiezZK|Bd+o; z@Z54gFh}Vt2g>d3fGtq|%d>W6t>n8&YG;nv#81^1FLr`n-%Q*c0Yb zVsOeB%;_59I4`+STL5^q)O`i>nw!4i~{wm zU1A_lU@Z(v;g`xXwAqLqmBdOl;o>Z;XY9z$Uy%J`S#0q70AwkWEc>}aDLNrKi=}Fg z3CFOHOXT=1sOyFUaF6m$YrEq=30$Vm@MP3VQ&gfzDc)&cO*|3?iF?|g>V6frLc7`C z=n2?_cClWl-VHAo<(TGbI`IF3rx0#+OMekGl3S)r4%rRu;F_HI)*$AkxOdGHPc<`F zI?lV=JB`W2_}(;cAQK>otkHQsIG3ZV+>krV`4S!GQaeH%-O#7D%f5GrlsHa1PPW2Q ziv(cXz43XTg4MDmwfA%F1$(3(FDLhA{yOY-jbF|sMJDF^EJs@LxP6TFU zuKE_g$*@kYad8_`R*0uK#yb3!*Xk|;zOL3ALEM54b=iRLx8A3q{8mkG!0&EP3m}Jk z)&N}V9u9tw&df$oKTQJ*3@tXq@Q6D|U-5_7FY2$NC#WU%tM(CEFUgPHuMI~=3;koJ zX?7s6s6e_%J4xi^&PBIqPx1wv&w>e>hmqmsQJUt)WBh#4X!Cx2Ahbw`6Y8o&_!L}E zZK`m>FX4-ZkE%amwn(o(U0DhphX>=4VRHU#en#~V5oMM4xN_*9s^**fa<4&+&P%Qj zE(%-c8Bx27SuBgF$*N6cT1sZttg4;I$g$?0i#0P{575(0f#-?SCT`_~oR8>($Rt}C z)yLjLd|We6cEa2O3CBMA;?s$WI!pJ~T+HGZy^&xZZr1UFg%Y#-e#W)@9CRErHGPtz z8a23{ru53~f^2roPAbm&U8J+!L4HUH7v8pronps<`c8n?z75~wy){Be{aih9wfzH#;((~5aQVNn4{Wy z(G~GF=|AdfWI2Li^Q&&anZn^{hI%ZVCK5syD%g?jUSFfQUw1AOZem8(-F99Q&@OImPbZJ%aTL`obm#>$Y>muddJXRdb-Yo$KrE4+V z0BL(kOC(-uzB*j81@TlzbE-ub;9oVrHCu#+v9lvO=)a&sbw1asKZkVEebe1^{lB+a zqUND#;zT9^xl}R>jbgamJeCF>>pCZR75zmR*gpG3>R zJBfemXu|EaryS+NPrBu`u(KILsy29kb>PwX8mwlv<3{8#%>*~kQCEH?db8^xeTKI+ zG|gH-KNeX3b52{4pWgxDDvz~D>e4`Cn8SrLEkAOmxcV2gjj{?tT~8HDgtL@7S8yIj z=zuk@HrZWt3CIMdN9s00{xTzWH7g>d?+peesd4?>f$E3Ez}+K zN#kKjb(8$>O+aLdXCY^}znRy?P7(7Fl)53iDo#KP^aG`N=sjeQa*jkLNJn=P2PF3c z)5OgULhNV#UU9xzBaJtmMPdwvLW2QD@9HP;9%5&iyX;ZytJ0NBs;ZD*D80&b)nbB` z*m@?ILDgpC6X4D@lnqsW2n_nw5skV zJ;Brg($xLzaGQ4tytR?e=jNBtAa55(S4(gBwP(KLPtycg#Vn(r7$5RW=^3^NJX@H9 z7LXi6FdQWPr`B4uKJ~e5eBI=tWvP);PHk!7j#Rg#gEyw2UFu8mvYH0P@RW8~j~XVo zAo(Nqi|6;O;>5So2X1c4k=S|C)$VLYrXyVbpdCwGdVsT?+dz9B@Av}R?I?O9z!2I5 z+Vxx84?u2htp@#-Oe+n3AFDnL$<;r>RK^_Hu_z^0qg^GoMDLas;6}_hekARLA3#Hh z4bt7dRV<~{8L85jZ@PwhitREcV#CeDv0$n-(%SM=9BC;NR!YsxQ&Wio$RB$P-RXvCBN(daJgUsO474tGDRO5?}93U7g0Gl#GS z$7kfN7dCfy+(D=N)|=j=cO(9_S@b>HhW4mQwJoD3A`?7wZR6?JNP;WOxW}eOV0sn4 z+E#$>EJwt(7Mo~;Y)l&` z9iGH^0RL^7Wxzfsy1s(nq0HG2)F=32DmPufmz~L3Vw@K{%b<{AMqX@lvIF*pEb`^2 zkz&74gJWOm*NNYl;$oMR0h0NqV=={scj8pbBUzSdrI@hnkuD%vLYJu?i?`>Y{jsIY z7u!4ZSE-hnWxI;(mc}p%wse%h{&Z&A4k352=Z;m@0OXvwjs2Kqis&(FFhdp$-hs>w zx0pQaVDu*<#l?{$OujhCdyqSv@nA-82kS*wC^p2~&X(vJEnZqP+;Yx&T`ctMG6|e> z#Qhl#KG!i*yo;`soTukVG7K$ZAJ~G#zeumw4l3a0rNut1!wUY${UrNR+dIE?Zi1|+ zcBEo_&H~wf@9x}r*YT8p~71S`0iaJ0=VK|@xXp^uLtL?c0U35l-UjNjmrr5$Jvoh^myCP2qyNo4Yn>2 zu13xoFIrB*U7!`=%gmYFzVIB)2&aGCMF#iz$^XC-cPr_Wnsycq(?!DfzO}ArI$-VH ztyONPO?1ya1V7@ME!pE5C!Xp&ARgw(jCtbNAz5PCF7HlXM>C|DFW%P+gCA-G+R1>=3$;1Gf3Eco0P+OyQGfxSG{EB%Pd1Q$cTWNQ{^G6y@+n3H+V$|V@xtwv zxAIQD82XzmL*p9BEa?-|Gx=0QsC1gSOddou!vl1UGtZ;L0P>+SwDF5!tESYbPcR-qzmf^92u zU3iL`VD(4hVB3aAmLN(~I=-oaNXDW?IUmtl`)>*Ke_x z(qve7XQ5Laf4{aL;Ok`F+iyJAo&oLps5cT|kasAkA5k+6pxJX9V72F4ezzERGr;>Z z-5~_BT#;Y)WvY8-I3>S?nV=hTf z*UWUw+>0>SQ|KJWToT*d9(oNEEm`dPOl)&@5`UyWV*Q=#B+=H>a)y2^zK)IZbj?0j zSc>`A{F+4<24lP2Pcw%U@UTH{O@=!E4cd{Brgv5x5kGWwO_`f(MAMzC5_#Dq(vprb z{hT%eski1b5i!&21_C~@`boflKIH8Qcr<#Ypggk119-gWxe3ZO?n)s4C{3aip-hwzW`9`c~K5q7W+l8NZcfj5xG%grtx8F>)bjop^xx3975Y(O6Rv zk`Ofq$)h?8$?_$LANd7drrjtm)bHfk^(VzciP797JV;XL{^Fd#w8i#&pxW2W-&kBt zM(t;&1$Nmp(|eR@KsUMvcofWegl6_KkxXlGKWBuawdT;yaF47|TPAJ7z*cut&5GHphz=d{tQ{pAXIQR$Kk3((Gt z2iIjYDj+wV)3lWnhfp=@FZI{=5jUa$^w~Y3IU!5D8Lig{7bJg|Z00Y} zdc-QI1NW4!gX9;%4tAOL2zVxcucz8QueP=G1_HT<)V_E07oK3cdKt$wD2#dH8Rj?) zg*j#Je`tYVkG+L!Fx`%CHMg-&w*3Trsqgd@&4Pv--3(o%;=QIiIFA+<@=S(Nju8b% zIU)KNj^~QH^@V|loZP&0mA^2a>6gvmt+0dQQV!B%>VJpdkT+zNFN6#HUk$KZE_ zeD(tkvmxmO}SI*J9D*J%X`u?7{l<(C)($6)Fn$Bq_%5ZL@Rgjl z0L$Xb@usV*IQjER1hv|LB zvs607*vFISC>6=i&_7X1MZR@rynfE$qR*BfNK2nD zsModOT4;CvVa_e(NP3xqhUc*#((c@CFvjcd7@mDLG6rtu8j$|4IY{5#RG{hGx(OqR z1OGVExE}BsXxs}vlQFV*O{ecAzU9#yYE1o)d$GZ-Eskot^dDB7X&aR+4HR@U_As87 zx}h}lWTQrw!|7sdVJeoX*iWh1rZ%!tH& zdS@8Tgz!vPx)zX2TKbpE~laP zmQY_*zckJ{v%spAm+@Ac5o?jWWr*7(upN*mb2b|})^k2T`<`x+?Nw}p@BMI|)g0?@ zZ!g@4O=fQS`u#jv7q{A$$R)9%%qV+*{!{6ArqGt8dWCg!eX+sNSm|qLou#Atltk{x zu`P#3W5M)EQ@^km60@y4aW(cY$5_!gx<{;^ODeuVhr~>F1S5@(H!&w2PUIHdI+map z3un@oV+T8o$O3D}x<{B6A~>JMLGhV_TY}`te}B2|0bcW%93VIUmw)`obp@Q)$N2&9n&lFK`ge|tp#A$Jdwdama&y zT!sG>!%5plxq!BComda%H9Z!YE_=_6rLPK(O4l$K?I$_+qyi?yekfp{bf)X6?f&Kp zX{K-X_I^QU=_tqF*6k4j?6|$y6tf`&``Px2ToFIl@F)RO$@ zJ!b!_YUZsVu|eXEDVGCeUjlnjgBY{YFNC7}sQLy}b| z?#$?K*lG=th*(17dW%<-&d4=-tsTV&Do<&1tQ|y|>I&uW*4CnZ)$P?2EKwrdx@^4* zrX7uK%b6KyIJL^6svHRCIv!c7n$JN}9dk^b)msD`Z3E20%C^WN+h+2J;)_6FjUi`N zd=OkWf76F6QNdJ`$JkBs($S2WYLiOFP!oBVY_zDYL(PhJG!d_M^yVJ0Iz*wit5vA| zka)EH2~%!8D^9Z2FxFYON=&wQEX>?bLR;olG=RIi78Wck_=2=^vkTG++98nZdtS@@ zEOdhFac+;i4T8hehMYG!c0}d8lNFW|hMcD+XONkr(1y;q6lQuugike5K9ltNkKf(V zy#(-k#`$C2;R13RS7u^9B@ljD0DxYk?ZQ3|29 z$ktQRzvhG{)plH*sCc0cvCS8MtyraD*^5-|X$I@8WjA4EsCtrSLSki%n$yRoMgHZ=Gq1iRuD3 zw0~=Qu2G=8Wg_s02|9N(u?7bNC>~ zV$LoHA+p;KFLfzxz2(pbhNWe&cpnrNThRb)|g;>|BHH%@jhn{LQssfZ&_L-lzJ{fGx`SS zVpfr;^mo^1z*i!D8t{C{^<#aojq4m}udAIn;J2T%HNa?RJ8*xNb0zrxqT~1vJ7nWs zHPiZ3#MAuEyk(sz?h?_cCc^p|f2_jeNNYdQ@!&juSL<;+PurZm$vOd#ke4U!vaH2o ziN7JK)rL7WJa(+*g>a$8ny{Nc%ev7T&R)bHXdPklSM=u{uoReQFSGC%7L;@ZbJmP9 zbtGq358?GE5&bbGo10*`YS>pQ;S{Nt=|bcOxvw<8*xrh6IJU6{QTH($HGucK<0)#g zrzTWUV}+THoy@O}ENrE1Z_H;$KfIk?ocPJ+#bws+F$}v+{M|a4oo=lXzcH6Y+=GWv zt#Td|#vsj{+q0(>^58QLb=G8=4QWeF&D>PbNAT2+XH3t(0`nZ_Qh(1q%ztisnY2H< zBOI_DLl$Q|bE|e{SWMVZje-|r5o0=aA=KRRRoF_ikXLLukG@pDfm)a! zAQ75*Jf(RQvRB)h|B8%2wCYXJMpFe`XEG$T=N6K|oK@U|iB}1}DI?)7tE=8-)I^9_ z4fIX*%$k!dpBf@Ug8N_J$m4V?B0D7XU3iG^OoD_^vL4h`E6}G(`Fa-=by7)OC4AEomXVtoYGhJ3s-D?pOjzFo7dNp zEE${kGt|y(M!MzP@ir;2HLB@ z{uuDN*^U6-zu0>M-XGiAgZb$O|0x62H~AaMoxJ(VQ@qBcihE1Fg8wV2;qIzB$c-Z3 z1b2{pg;I?-;vXtoK$QML%x}sR{u2G#hX4HjA3Q?jGm{vABiKRW6$ieg#cS?ZQIbm*Hm>})j^K51PmWHn zvV;|TSiQ9KO=k=JP^^B4$s;RfXXtvGmlUX2QQBy0U0y;HZZ+37KIdc1s;XV~sTu#H zr$I-X6T~{bH+2Q^FW-$NU><+9KCNl}y<_xeE9wz9o{y}@WRvW_=K1UE>Ps8LF{niP zGq0Pz8h$8gg*4Ulf*VWDB9~(J@P>;gAWO;v{NC7ffj9ODdn3|;uS)nkq8Q2rYYRU# z{P;Yn^;V|G4u&tOa@DM=b!l;X8MNj;g7 zE`MmK13uNi_1vi4NsNVOEBDnlwK@e9m`!>~%VFVVYwi-p8`0NGZbJ$?qq#^eP=eUtH<Up4jk z0vZD3`s@0VLtf-O#4d1NkRv#cBnZ;T_>JF9$`Cq;j)H5F3&E_V?cw$!udwIF=bVxF zaO75HcjysvlJ}r-C-#%XyX=;Hp)xMoV3 ztu}%`M(f~8>VCF%k6p!<*B08BDS`*z1qjEdgd422zHT-`-4ep-bjx`i&Y5DB=*&bO z=eTeVuSjt`;i=@;+OZ|8urg^@?Z@KI;*;W+{$Gk`C;3D!UuMzaWHw&v`B@g9(gyqF zx|-J}xdEDJpPkh@X*2U3dKXTXw&(ZaZS&>u+FP^1-`W&Q2eAH^Y&!t@i4Yk@7(CG%sjaN#0#DOAHh0ROEX!@19F$cfaxX0mkqqvsNPS8w5!C2rL3 zuBl*kK~uFuHH%pfxyy8K72`^WLszO+>-wwx5trqNnybIbrXo@_xZytQN_?1lfAAS{ z8NbU{=@mS$M+3h!8+qdc%Yqq@0??U2j#FgpFQ^O{odd}pyllVJiIW9_ao!%(LUIW| z&7EXRAWuU^Ydd{`{(Eo-2nWv4$FVv{N7c?P9+~|?x~FzZadGxu$&^5C(a>x}GRfbq z(3-^;4foa*?8!Wg&!OMtR%Fb_N}Pu>p|rM0H?pztZqh+PTxD-hKGKK|0rR0b^kRT_ z-43{(*MMsiz++AdjCUgEkMmU4I+la?@`r5=z*wsgV6ssIP2nF!x*JdOYOqt7#LxhC z;C)0S@qzEaYw^9B+k&TP8$3rdj!z&g>@O7q`p(nBN3Sw*ATZ#KND-J zyTHT9IQ0_UHm)9`)CV<_Sbi>AHk6pih?DnWdvr(C?1Y8!jdaz-tj2RW0qu8vbN152 zR@w|FSI;|Tln_5r&*P7 zmgl2$h&dL{aLMhx%=>wNTa1SB7p z@8zu!H}OZv!t;)cdUzM)f6wWU7Y5f;W@Ov3E>3mEmW=%fW^F0#m~s=YFa?urvswQ+ zS7MB;6;@intwN`PxFxBi$s{S8cQ^3K|gkM7e^|$JiF?Lp)Mj z7(JN5KzjA_nj&V3<|m>DJ25!*TdjG>8smzxL^@1JhBq%bKNli=<9+HuY@?C)-akE8 zZ5Voi#^@0?DV#-X-6GpdcrA6qp*4?y&RHH9W|QgM1B_8ZwtgpTp_ulskX6fiNN)SP z%ht(mica{50*36n=$v6EHU%-24?BoO9*;F~e5Unas z%={=krJWyr1P&E%&_3tfL3xry&1;Skb%~FuTkt*zZiv3Aq)-U|9`;I|1pUR`iriGU zWbX|91DdPa9BV_bo^@veY~efu zc>kID9bn`}sOoi0L+pt1+Qv2fD9IK1SH>-vlDt>fuz!b#OExRta~r|1=#%meXQp5z zen9y*w;lUWc%k|?_It)Fwxs4OMD;ux-)pWp}V||aL zJGT2TnmVFSoE-vNtdQ`aQyR#&*^o@Cf0*cpu52iqjb~1JcqS zn))HHGn{YrOJ`;`;Y|w8n%znIz#eNDXWHYMTZ;pJ&(R7WPO+{7Zm zSz~KW&Z?n^)Ob-nuoM%#(PgV3eX!wS;N3F=(2f1eD2U0D|d0ng%d=~R0-XrsScYCr$ z!c7vjrfC){=QH+V5_Ybdgvu>ru(2g&yjSFEVWW~@rg^g%UsaqZxJDkwCl{RxuGUY( zl`=o{nP`WP$=7mey$K(lJ%x3Ed?~&oK2+zrBXK;vn&<9CG=oUpk{%1*#D(8ls0+z&6 zDo%`sx8WIba~ugR!&+9fV%=d^AYs)hiHg|6zz6zAM?FTv=M2ATQlV_bt#79u$-IxW z)(zG)V+}>S675uYqZ~L-Sy8d8x*K$->c;Zt#74HEat`}PE|7ogL7@k=gR4gIRPs}` z4&!6)QIb*Xwcg|oGd=b{vaaNGBp-MYD~o-XKxon^l}nUkEUz_?`rkT&*Tr1rY%Iw) zwq(Wn6m&bis5p|H0cW_!6?qvh_^7i+R?6rX+~v_e|6m-S_rfqRJ6`bxx{(kGIQzG* zDBl*)K9lI1aDBbhc?9ry&?W))1k>aO^Zd6es)4;{hNl1T+73{+SKlAb79ZpA@?ri+YPH}_)m-mB`+aCrcqF~j+L{*@F0%C{ zTXE6<_Q8r9G*~1wds~+zd4?gs(W8qKoQvT1?!2O9wlLV@S}4mgOMd1J0N73trv0~$ zrN$M=B*AQ?ooNTc7sZK6j7^YKu|TxdkcsZWXNXete+4rSH5dJ^>CL}^Cg3X7H*Q1z zFkwBdybbA0x3& z0_|9Ao(<#(vN^cFl1vsd3>Wb)!4r`#z<-IhlfMWr!MDZt45v{8@}8Em_P{2a z)7XT53BJMfo@LPY!=8|_%<$mJHqFQk)(Y|%*3#%?jWIpOv<6e+b>j}~z4x~GseL>A zJrE_BZXbu74z#ya*v|)1Vry>y4zKk;w?4Kpk?uZ^<-YAPJchojfr4ircB0y&2CIk9 zHuVubwtV6Z5Jd-mF7{;i7mp4U7hlVE;_dxOMc=aDVfQ#`CSxs$j{u$lY;9TV| zP+OfHUu2mI_0cEd4s#jzqrMgXoDAXKFpBU;B$r)A4#V3SLzpJA51wE;&o&xEu_SL> z=_coHlpPqvAK=_1oDx`Ro#bqez4!C&?SokCA8q3}*9tp$@0k6R3hhK!sluok=rF3M zaG1k^L|F$((rrZoH9o=LxTr9HyomDeEgY3!iGTGSl41EPv3&3Pf?x7dg@@?%dF8oF z&{9`}obfq>V5dWo)-&rV=bnCz{g3qV5Kn#4Q<_xc=?wbi*4}t9-ktFL2ILl=M_{~r zL^lHRWcnx2r`NiFocqXh4*~VrE-t`>1Rr%-B$BPcIGDc_rIH7PU9gX}L-LuJ0}o;y zko=@t&Yw*v#396f{?cY{QIYC2r!uqz682JHdYy)&vsTApT+X zJZykf&%3Y5z@jaUc`t|re58fL%h!!T5=~RsvkYzVGExL(>MseO7!EO>8ea3FI4I zBfuh0IN(v`sRnW_9bDH8mJ#$@fOp)p0bbFJ7Yr~x4E7H#c(d8D5}xiUbPGBw`J@i# zU58{6x%PKn5i~<=SG;0xW^3_a))`2)(J4$&Hs$ctq5LfMN;YJOf}Yu!f}d1_1eeWU zp;g+)*hbSUE?fT`DF$ef@Vs!b-4C!NdUbH;#2jqB zGuI+?I)uAzO@uP)2s+!mOLE*k5{VRc^EAun7R?p5^bE^uS(GH4MR(5i6?Q=uyFzmI z$`-+QsF9h0g4cq3w!^8P@)XeTrX83(XA_g+^mkGj?-{@Gn|QR+P5$qI-?YFqU@xov zV&I>A^(jHU_&|L%avk=5xR}Ft*VK_n4ggq^3{oVBd2lZRo#lOR9DwLGd19h zQ05}Hi6ODkx~oDqaX4y`ectRu7qzpMOo8}+rYt$=$R*q zzVgcLX!^;*0I#ccdP-;6E6yNOqnI(#bxgV71WJ%mC6b?bDxB|1h{}- zPhc*#%RX#KY{;J!p9>%T_oY2jV z(kr!Guhz!At-r(kSzQ`?K<%;brLRzTux!()KsQGX7TkXq_=8%C;f@}GJZB2_r!C#z z(z#g}YVGcANA*E#3_0!@wpVao9A^1wR6*6ex0qPJ4m!x5V+oUVDEYuGF{fi;C25?? zeM9ctqUVWGzH$Ti03!Y$yp?%NKsyzC2+(g7(uV;)cm0Sf{ge9Pzch3$1NYVUCH3Wcg2Es| zx8O6GlMEh|D^kbi5Pi^1So`R&>QwX_5*z_6^)d3bWT{Q$xG>ZRoLP z4yzXFVlPv_ZT>%citCgu&=POElIyWP*hx<+e!pTToJ@BqniWI+QAcQS=Y&eo+qMw+*#Fjb!P6d$bIV*~fIT7m&-oKowthffYq-1n)%o$(|q1>bsymk^DBP7ayDwQeCLNL!qL~}(}F=Yk;r?~ z4*r))BmV}8!T+m=$ulW-D8^e~Ldoh7O};rH(NNY*)x|7itgiY~jhRvzg#4abqaV$D zRWpES#_i5nBbVvs{~tY{=-Unw9;hkzv~@7yDe4_`Bgay{Tyx5;uz%(EQ>}C@wCM#u zYY-=4y~N8`e70S(^oHN6|Lb{ze#&0{MYp|ptjou7Id2q|I)3H0bFL^nZ)?RRD5mVX z^%;0)hbWiQd8nqFxR~ ze&qM*05=7G$^hg?Uhewu>PthzM7)KgM65L&5Fc|egZA8UQKF-h?)nK@Z^(_WjVt7+DYs_pD#%*g{%{^&O zfd=ZY)eN(A;Gu?g;U$)M-gtdW=$iR8RAtCT(#;K^W`;7X*ffloxWq7%#dkEt;>mC9F-Vq|DqfV*S8&xcs@Rm$iGPCLSoA5S5%jk^tFR`ein-sl zzo1!4R!o_5M_xtJb2UzF%RVlN(ZkmAlmM2ZequdBU5zsvoJv5H;m0`>4-CtJ%u%X< zANXG15#VRtKu~{1e*>%&M(Np#`ro}b-d<6Ur}gLXxlTjUE5l~-pU$sI`}IRaBb~aW zd&Ct{sxvYvRyPj6PQ91L=rDXR)mC~y(+BfAs)OUC0u|WLi5sgwB5Q4}#4<{PK*R}^ zjS>k{jas+^)fT-*Oy@>YTahr5Knkd#2-CO+9q9NOF&Pp3sl6HUr?Dme)uw{Aq+LA0 zRwalgNzo4Xe91n?DZbPYu*1kp#& zku;+=!f7;DI?9m(yPSQbC+$n&p72f2-lFPk6F=HJsVFP^5wx35FMOT#nH@>z%8IjC zj0vs_`NJ}U`%$U6xr;J<3Xh|I*5$MmeJ4|Xk}0J<(Uino$0aN5~-}> zxj-xzU3NZ5<`WO`InI&EXLWu&%XuP6sVT#LruIpPYM59D$9Ks+#T|sSJru9kK1A-? z8cKe4Wnx2g%c_m8!`L{oy|ANe8g|UsUwF(p4eMg;j_q)+!(z#Y*c)oKFqAxrFQO8J z(c~)8O@|U~8$9v(u6;OiKtDwkLGw~Hu2KZ|4NYF=ibQYveo5Nvnub!o^rVxn7f36g zE$O>!KDx-eH>twaM5y&7CW~CHgl76h@-t_&aIcG*GST@KEfGX`iV6*R*LkU)`?8^V zMotnPD*Kwdj&aNtRnRl{)rM#%FOSH1rC8%&<&iZGh51)Du`r-xO(Jg7MzJZL*2?P&mYUIbo9vy%_DSItm`r}a(8Mwn_8v1vKJY@ zvt*{>nI57Gvn#zlwSc|~#oEL>GQ6d4 ze9|YHiSvEgNw;VdMtScfU81Mr-#xdJ%IRi!f@faxAbJj-Kw~LQ=~BG2Yf#Ej*HY@Q}T{$!=qk_ zw&nbxKMmic(z7}cdV!Y?N&DGj1ibC?JOI27_xy-g4D}2H_221}0I$*n;PVST9@r%k z&r)FLDe1ugMe@~fx;-Q5p*#)lXc0=A%WuN8Ww<1FUA|zA;ksyGrHGG`r}2lSMLfAG zR;a7)!b#MV=(>dS>jThx=ArOFOglxf;FR+P_FCH?neUu{_a+iC7u6LzNi-0qQnRoU zeI!;IQ~4(x+a;XcVaI*m&MII zD1O*u7Hy}GVP8D~>^yw|OZOCtXVV95CX2wwQnEX{5 zJ-efcn@j0hqMKZ3Ruh7WR?_=YnBH)}UyZjD;IqQ>BmQfRrvlVB^&|jZagPJ-gfmGb?v$#fV38r#-UZdD`@rWdI&`lpL@>~-LLMsof@Y== zq*U3CKh;r`NDv+wbklcFLXJ^8@D@02z#4%@ZM6> zvHj-ZqK^&>x-x2*aeRuacwoX8!jUw)ctYF~-QSXnMY;{2m_6{SLb@uMdxxDT^CcL9 zdzcRA?=Qc|4aPv_Hd4%jJGdTaAj-etd+zCyzTOdlPnLHoK%Qq0Kpp)fPFF%Zf!u;# z3V7zxivi}+QvlyQdJn(`|0%r~?TJ+Uwn@cc>*nGG)|-s^L@V52oy~ZlnuT4k9*lDY zTc69SO*l$4z<$Tsk0h85k;{`@TK?-YfWhiU7U}3@? zd1}ou_(E(#oQ>^7NO^U6M|BZ8O|dw>>3`e3L1n9`?sO4V%Xc~U(s_=Re3Rp=JIXPe z`@&Y|I%bdH{bF4k%)b%NOVcZ;Oq-MEW4E($EjG}X{_`wBERKr%MKH-9f%l!Ja`T`)STUaqu@fjrti5!@F~i2>Gs_wTaA)Db=@Z3OF$)$k6f0p{x)p(`ZK z(E$n$GDxgIYP2WeCwM96y?hM+B4TA*swQ(qQ11Wn2lo?y%X`H%lpJa1P(I`_hvaa0R zL(qQxwc6))h?}ig9C&Q!L+YBPzIpcD35^vx_XgWvHJ#;iNgJ7}bjbg$qdwnPdr^sh zcF9Jc8XMtRQ5;3{upYFkXo$0&@K+}#Yh_PB*IHZUA2&K+Hzdkl3YYQ@;LY`;;Q!JS z6uM)V$@;pl@GO99d9w}m@)K@vfIsuD=j>BsN~Mk~lGhQ93Xi7bPI6&q+M`fBh-dTPUk)uxpkcil(xZ^psw=(+^Eg8VCS zVE}iuG@oSW`IuCQxgjgxJ-|N7^qASe9BT|4ssMY;I#}C+bt%5p4(f+k9|QZk*xDQT{&CiU?0SBA`bNP1 z+iJL7bq33algO1&AIVd+nrs3mNOf3>;aB*kqzId*3xl7CPNFyTR|JhkUwDW09r#Ox zQ-jRbK)qlGvD1*vI1tQpG>ja@J_6NXlZf9~KXV{aY3$YbO;97Om^%%Ut?Ucu3VL!{ z5Ko{f$aMBMjZMLTzjGx9h3+Gguk2_r$*Y*}6CY?8j7Q$#VzvDe?@3^hF4nFWRMyrw z{<1w1TnMyv&UHk=zxszdSJ^)cu6af|huL2VraD8Y-)v@{+BnJD&oZ0eSNMt5%6JI6 zF4+@|`*LKBlRl{(SNtYxvSd@>_oA@uhvFgrjKW7*0TJe%Uyz!$693>DmFvxn##h)% zGkRy_V!74p$(5;_;Un+_ZkeGcSB3j0fU)kYpntgGN&s?{D+=@*@0`~_{T`|p zsBb{+2mMBToZOHD#R_aQ_O2n#du3kuV<|Q*|`Tpu{p3B&EDjT)< zciV4J1JLh&gFDn2Dje<~LWelNqZaRK`UMp(453x-T&e|n#UXH_j@1ZP=d|KhHGD#- z<-1KXfl7?jPAqDeKTDEX+q|f4zE_L{#D%f>y+pOXQw4MLdW+V2PUpFD=i*CUO>^eu zw7`bjwP`6?3xr3E2)R4WilW3Y4=mAnj{tjNh))aVH(z_70eQN20zj{4Cm83h(?9mj zPIG?(<6yY!M;u2bbr#5vDt8zX(TUgtZJBmG{ujPblT{WbY9juk>BI>WwH39hu7>7g zD(r!J2K$cCg+5g=n5oE9PPuAE%xV5#`c2wp@?MaNyb_FTIu5e*2hWOuOM4h zhb*lu5G+Cyd8ahP_|x$x{yDNLSsA{=&yi8GtC-O@sGzUxHulkTAn#~_3T;UHbBy_` zg(Xf)=EGdOaGm{WN@4bKL}va|eJX7g{84?>U5G^m`ht1qPJvp0$NV$F{OADxkN6my z_ch=-(c1*P2Rr=$@K3o60Ovb@tiN1R&m-3$=~#}sTQKWGWAP%*b?p;uyhN;;&Nzb| z7MG|+tQErF@R8aMoH%rru%{-Hy&JCJ)yE!Mxn8wf&Lb+=PmGf4$IXXuW-!;ok5!Gi zo8oGPEbVGexVjE=mu4}$>ud2&3R`UbIo=ltHY1h1f+gx%A$GDDQq+^P+A2z_X$-9l3iH&z}^wZ8Z_zaiI-`tgsjd#ZRJ3Frn&p5t&m{f0cvh{S( z(rW@o$}ih4855xxv^03G<}dv5=zQ|G7ePtOC`-L(MV2xt2r^=l;L7w$AHzpC2Egdxd7)kfVV^tPl# zJ+i@Y)FLS=*GI2M4vQ+QSFxKT!<>tJ^ zX+{)2X$YEvx}*)u-TQ4q?5y#uKiV-ETV`!gyPBGey|Xr{HB$S8ZtF>Z5%m%7WbNvk zYd^}5H!zH=Oyi5_gz82YU!S+Hk?pcB54!*lF1jW6J2CPGB)wd$e*m=BfGHK8(J_AsnZqJ z7XHKKX~MQRRC~4Z3KGp)w#`z_&x|!r&^jdKn zRTm;nSy|jc^+7$EQ(fd)-(7uxzfwQD&<^z7W1-b%$KmKQZ@V1Wt{P{d{LBH|Ybr$$53j2@z1suhX{hfd4TY&yKIFy2- zs99{ZaH5iitCBTx_>lCWq9Nk}j7i(eTd*Pp55zGQbAq8ma(q%u4vXL#k-4lo#XaU- zuxH~R9rdWh5Hk`J0!_wW8{ambA9Dj&>w89ARrJMYYcNJ8p}=|(SGPY6dm5x9M5#_pf((Z5$A*|p?e?}&(?5emau7RJd;A>U*5#F%~rFuI0 zH}~55rNn0LTwo*qTVG$p)#_aJ1IZ_iT-`=DTk=HlMxLbhirOnTDxT^G;Yo4n@>qh8 z&8Ui3mJu?+_lQKLM1KOH0q>4^ z;Dan*1gli3bd<3@Z*s*n>p|rcmgvWv{6C6;aOrz?tz zUAF~@%PzA}kU)?1Hfk{ zdr%-w!h`)k#Iuu?hMaW@}OtYNFi(-&gvrJ%mC`txAE#esnUOG1y+^v;GL8F- z(U?5cY-QcmoR(fQ#k1b&-bh4bqr`LrTf#sSKM z@(KFLsA;u#B(II@A#BqH>0R>*!O%@A(F*cs!M(bPSQSa~vuf`l{mDa6hM$duo0y82WW$1SNv#;+cZtc!B}H_r}_`m z5^098K)J%?mkz}uDt<97lAb}d@(9x;3B~uv=uCseQ>zo0m&w~$7wzTJ2ByK-LDRja z?a2e^YV#m_nV^gAL2&Qy4#6^=R+?n{2Hn>-kq)sicoVcj@j7!qh}2S8^PpAnRJ%wZ z(FdXz6ZxE1F{Row>K%q*`dwv>b*;!70deX|svLP&cQ`qR3PV5EZI|>7&I^62tq^r^ zEJ0fZESS^&4Eg4rfnBx#gkE+RVe4&Y5x%{lc!aG0{S=ldU1wc@+!4Lom5`7f}?MeMQ*CGgO9WSD=Us&3~4491gY0vX^J2@pi#BsWP(<%Oct39hKo* zcUp?nUQDfa{Fq;!NVNg}#xg1u_$6Z~F2FvN6t3s>H^+~CnU@^%!F?MX(?Ned#6AgN z0n0+ZN6+9-7$s(%nN%r`b@iBgxV(~D~a9WEjA4KTj3X#SrP;}>Ts;W^o2Ko zSO8f_|(@m^8t$4pU<> z{x^lQ@`mGweEkc<^S2Ancto<~{5j}f?y>oo^3*VwnvpX%Z@u6n*)e@hZj@jEI^I4h z=L$Pc!u9vdDq$u`t_Jp`e{gRBZ_9^nqs%56fvM1QmL*_Vw*WQ(mJXmhpI?!nI3lF-IP752^A0{Ki-qo}DD+)>j4 zt|V*uyHw9uORETO0#TqqAe%4_|wux(k8qx;FWS{ zk?5d*JU^CJiG031YdHN}bj7n+J=NVoByuk^xm?#o7RPqvtaGO5tNuIQjta*6aAqVu zcZftY(EXnK1#M-!&|#iV1uJFYh{bKon;_HiFHn7RFxgAqHd}IL`+~;MQPpwrulW|} zAiUHyEO&PTjR$;%*?XcEiNXVDMsIH|;EUzU`C+elQ-Dl+f5aKB_TWJN>hS=~^)v_f zMR;g{4*EW*@5XIpdWCF4HbQ&N>+#hn#mhC1#Fq+-c=Jq3tToyR8f&_N74d`7ljIJe zTs{Rd8E&DJxmWNU-jm1?YXqy8aUC+ow#MEajntPQmyLRUclB?)X*v#M)2!nB%Du%b zR<2ex6U-=AY9vHwI7By8bs!kCA~gJ>zCvyijyJtf;ATSbRc}|mGxhO~O)=9aL~-8E z);6?Q+{g3W_1%3~eAV5TKITpmZ*k_)UECMMo9vIA6P-6jv&=1Q>#63Vqfz&utF~A8 z9YJSFf?bc7zykO6-0nqTh}U&AXJgSa-aKkgR?DIgPG8&W^c97h z=YpGz)^N1@Rc;7NhL(BGWKCc!!5F^kw4VO^fUhHdEwGc<`Xhjh`E>x__;vwos<420f~u=&AR2ADt?WVeb}kUKaGOO^ zhshJ-&K2YKrv6G7Ca$pz^S5@56u%>-zSYh;kxIA2^WD)^bSDmRwY3%Ddj3qy1adlN zMH*p#y$rLmZrZ2I4D%tzITHQRC|xqERZ=DpxJUS0Gop4N>vvI}1%2o+Q9 zOAGQ7zB8{Pu*duMzpHm5e*_8MCzoDpbk6=HLd7rwKmP@!F*ri*k6c(nqz zFNWhe@8MehpD4;7pl++|YFk%wOSMGZ(H2^AM2%OhqFlvVb>nC`b-T!`ZJ#)Vf(kd( zSPX;ZNyR&Pvs2;)7&A^FqW8 zB2sdcWsTXcdx@uVW0{}z9N{yzmGxDh1Z?#m8h(79!B(5jsIv84u?FNWWr?mG9zljF z?x}ynJ{Tv|4AgbTIvM4adDeaPGg2qHJOT+(9>0r1FcZs-#FVjXqt&v3{ zndS(z1Ii8VC!EDwUX?38S0xR}Wj7Y@Xf9TfEDN4eRj7HV#lSoMx4L#PL+>^&5jABT zQ@=MRh?R+7)a}TwqH{6hiDqQFXn|s?Ne_gxS*TQqYumZ5U;}j117n;i_*PYw{|q%6_vj{jJJ@GptF>ckrqzvC|Ceu2 zzn+o^S9(U5I6O9}n|npE#@z~P<|-@d@9xIxO`VW^cd;t&TN@Tka>Xbv>w4t$aYhl{ zk*~?q-T!`;`s-(`5)fx}jnNeNLZ#dc;Qw{v{S5rRBB*g?{e5Y$8hoE3oS>2ra>SzX&-Zi`WJ6(N+l7a7JA}SCRN1;v*54r z4lkMHXvt~jc~g8xU%~9;Zc)tVEsY&U9Vkpkf748}JS^BHY@|NI|CYNC zcmn|cu&_5+kJ&^p_-m->wEfyWnige`Qasu&sy?iFDNaRyvKqUb^sT0nyo2?W&SG3P zXN#tY1Tpi>Oi`N96nD&WMNE@^Mx^z%IF~G@2MXt!Ov#gi@$6qsu_*<#3wvW4mmEpY z!e)_ulT7Yun836~`iCnPbCac#1eXx2Fia93r6kxyVu^4+m4WdInXpgYnUvXZmHw|y zn^Gf#JL0cxDoni=H&k!m^ey#_`VIkYs!1y}G|+l#Q`66zcd1!{wdoD*7Zd{DfD8$B zBtqjEpHWV&O}I?(-MPiG^bqBB=Yt|Ry`6TVeQn|3j9>M$bZ-jAWZWS%LTg@&3`+l8 ztj=nganQJ4IzzlYy{j=X<-9*JeHh71nN~MDwSvb0{$5YcXTaYJ=q_llwY;W)M+NUR z;IS9CIj9fg;Q+t$je!3_>_-3-wS6iD_N{3xRQt$3(V;16^4q2;(fOo1)s4-=#TO;U z@HneRG8}sxbIPKW6miqyimjI=>DHfOW2`088meR5|3}tW2DXiCZMSLDKtoOpk}TP> z<1i;q;y~LpDQ%g#-7;^xr7dGpNJDmFkYt%2-%dvQCd3?|; z&)&2}o_M^4q0*6>yIwwlj$~Hk1ZIw)f2!!?-S2gRoFx64nVH#_J{i3>JuI_^E{d&) zUoYRKm&fm^%an&1-p8-nFf=2?cs<^G$TqDAa{*iQ(wnoZNuP7MSHSv3^O~1H_Jv1* z^^Uu(Is%+W1%vgDAoI`Qxy#nxK%QN_$7G?GCY6NoY`vpB@x7aq)KFy zt*Dx4c^5S^vKU&$6vlOOjN)y#&57;lvyb8_YL^4jXTq8*aHOq>(TUdS3Nm=V?ugrEfTh8LwtI?M;_K@{lTDDKUMh|GhAd2#PHZp+XZDgb|R zmPEi;f$bZ>XBG!2f6w><>~Eg})|m!6JA?1#mNNvDuW)_OTlh)fvY?`M@n3_UTi?d` zMJferZNp8FbyeBB~WT5l*nkqdu^Q z;albnvgxifh|`oSz2l03vdujrSyv~|-q>Q*D15dHjh(B$CGN=1kGZct&A-a5iXNdl zs;xKMqEb0O8dzwq>;^B^JXA7Ox0oLu>*BuRO z;?Y(&8g0U)`tNZt=hPE;lU!UM0MM1WYTyJU_bCK}l<(p(N#fDs7ocUSwTXSo^(DX3o zk}*yYWmY+!NITRol)c~|s!ypqE;|M%H_oW5h`KE9*vQmvjXE0nq9LZPK5B22rM}iP zF8a@?)t)7_nbG^AZ?Tuz3sE((E0~S0M^SIeR&yA~v^JwvC}+GgvrV36B@*S@oqx2f z9{$A@k^ihpC0y+CX1*f!p%+{?6w|arV8|7h^_wnPu)!XbwwUM}_Q5$dPTo)r_#^9I z0~}I+6JTilHLQup`*lfp6TYr%0Wi4!d%Tm=|2lX0x_;k(%u~JzR~jaY?ik-9q4fE% zv*JeN3VEE{fc%EsBVwwuVIADNBDFrN%LVmuf7 zo258noAGpPp(TO$#8?sgx7p5ZZ(bN{u#S%iHlr~mR<)qBK_0WhX5-wVoBI0COBjo8 zNOP~2t%`lOp(}efa(pbYpfvQO-X^$||9v~#R*eP?@7q$8%H;Q=*TVvQM4_eDGe ztU>;xo&4R^C7ii+Q`=;y=2jHeR_6bq?y7s@a^}UTi)yB`&vX2%#6-AVqzE9E6MyKZ z%1zo$-srW-iT`K=+y>PDiZ|Vi@JIlrdrkvfQ+oxVsP<2QsqW>V51!ihU|!SgzphF+ zrsWTklIqvcMt*CF_g#wMCN~*Zhvf-cLgU22(CM&0px&q?JdwX9_ye?)`#a~Hsw_Af z_&on?s`tv|7OkNjj+vzcn_Y!Q+E@D#t-1=TnO>Z;>bru=wh(21)dXa>C3poMGQm6U zohl#VV-VzkG2@@@Y;pIo4dk!q_Hlo(wuR1wX1fBc{!l~s8s{QQGAE}Z!G6&!feQJF zW}f+Ba8g8!D9IG5{^dX4qvbbicGe(r#R+2Hb>E<_!Q_8F`^i zaws_n*yAqRYF?B4@5>5*)2Ss#OCr%w)oW>Jg#iu^LnGJmBH^bIZKYxGN3Npv1^h1< zgMJHdjw^)}6ruD*t%5Po-Rd>a&ROT1#JdUgbdIlD?>_~LVwY6bwsr}H z&bgInO7p`;vJ?Q zHQjhGWYy$i>R128^cHts{>_vd`h?nhc~ep{4Jj^n?)KyhbRj!E=XR1npX*Fg7!t2n ze{zOr9g6o4PiE(5)WjsBYuG`_yCf(170#WuXk#b#F0c@gJ1T*K>Xj_HB<89q)ZmXsU)>)(~!OAz#M)UZJ zv8$58pBau?&3c!)Q-p_oZVfYE6`W(|*-~kz7ZaK0`nTM0$5P7u~oZz&FF5 z0_ztFwi@s}#nA`wO4w%tzJFxSg7TTR!2ta&)3{B%C-YX3eZ@nta(FV4CGo-D^R{Xi zO9qPP@LXz{WTx1}$%x@v9JXvm*gSW#5r3pH5#RcVw{1xqal ztD~1c5KJ_;R1fiA7A`Q}F%NFN)p8;Hi{pspj0F)aV&^e^%-gtuY&z@e7<9+0sXz_3 zr#G`i75gVurCbTq{>pcO^ObUA*DCPNDE-VkO+%I4) z11c^k*Fs!#-L$b$bPl@>3m5^1CwL0RIla_CgbD@K5%ZzRr=Y$8Hqf;AFY4n=&bHcX7 zp-74SAZZtA-Gf2=zoWGgfX7R&8DL$bpKE(rlb%j;2uquAxU&e@XS01Zcpuxr9tWP! zvMu#*s-F`oC-=ik@a=-t-iS39B+%k*#PJ1GA-Ly13&iiJewdrug7V|jHEaQ!!pEX*^4~C9m ztA$&nYv`2~T_Jz>zO1V`StwmQAgdzhIx@|@F!QKlEwaM3M*bu_33jubjFhY$LOIJ% ztB@C-QaTfjlp0U>>nY)%_BT#boqKF_` zz-Y`jZN0)=&I`_R#swET=dmf)bMR~@&fc_q5wy2|V`9yVz1a+8)~@EZyevzVdZRJ2 z^+H2i>1pG-u-4@hWM}l}D#r=?xdzFld7VV7+=21~xsljowt0pnCm*%5C(`yQo*0>*OfoMXjYcQBs z^IdZQW;(}%`oA4wZBzXbyA;@s!}jUGp4_y(2E6|sQLZW}yCS()CF4eN6Cm{AOHQe7hBrVT@S9cHygtxp(dm$WJ_R9cWCu*c&$yH~9H&S+cqdk)O5>d`t-CTPwVRvVqdn5A*8s$9WI%HjfY_#8UMp>>x zHyPZ1$eagXwQ}fDW)Z|OFT)R*`az$m`Iuu1F+96nH#=M{Qvu6IiI<4r6VPm zm2Bu=C2jGJ;r5^joU7smWn#g&P_bxC>v195gR{{gVTU6=t-dRmrF+MN2+z8IfBxSX zT7Fs31Af3m*Q)q~;Bd&7pT=!~>q9O_eByiH_!cvH%Yq|#1A-25OGCQy4unn&JRW+| zKLCss|8AoRXE?3yRkkVcBF8j$to0eP%-+eRusnvITkknZ^DW*>tH}PrSPRQ6)6CP2 z%e>hzU!rpin}II@su6oSpv^{c7Dn2j|U3qbwohfgBsuXg*+Eriev88-gsw zS>uo*>b6ZFk3!>#pY3mw|Ir4xl{h|w^^KL*(}3S7v+g_p^aH@}e#1?m&)(EvU_O4p zBL5G5|J~j|7}BOnx|TMFDrzF}CzYFd%c{HJaf1H*S4x|xCqICvP-kF=c_F;1L<*YB zz0LiD+=s~jho40R8p=_f_U1L78F;0#uk9u=QT1AV(0WMIrS+)bj+T>J-0~sbGFH+#x3i&tcjdpX%7+j<$Am16ietGPC+Ogla9H+)TBi zwpWy+DsrX%{ECoBjyB&g+UMVY55W9p&6b&7SsL=@wCH0zXD-eC$_qCZnkVM;6QMp?DKii_Mdw}2Z&HN{@yH?{K@VBorwg>A) z6ATl>nx0=n%fL8zkk0szIoy4IXTv7R?{FG=gzhGdN7PV_o{=6#Pe57JO-V1bJaibr z;Jbw?-U%ume}YoHHuNXV7j?kR3_j>3co=W0aX&N&?M>`2*J!Hj52>D^k=&yW33)iQ zdHF3nM4sg!%EwF}!+R~Q6)@T4%koFn`>Y>`K9xDu^_E1UXUOCT*z!qRu&z_}YO{jw zp}b@|#cjs)rrgHkep8wD)FH#ODw*vwb(jt&pBoQy%ZYE{4duP6ml|iQ7vsaji;d^h zmg49DB>`%e}f3(9pXYgLJb}6vC z5aSEZqfl0VFg{MR>VO??X9-%~^jxjE6_DGTTLv`A0^S(oU3>}F2H9yGBIS#V1#Z1j zGE{tlj~H4?{cwN(VfypC_cbFVYrQL5KR@FF>XM2iKN`4h6JI%sGELB z)g<+BdrSIiNp;v^$6a#2@`vl#1BAh6(btLbpW~u|2E5yi}Kg(2B zJ9(3LOZkU2g1Dk8*4{FQ`_0Ep=KY#Y<`Gb+B~Wd&6b5CPZfcL1BSLqXY`Sg4c=%7# zS?vb6Cpy)o{FpJ9j5b)DMD7oAnW2$wnR_uqNdM^M z=bTLE8U{GKC=R9FqxahzvoxtS)KiClW?0HoqDY)!E)rR4&#! z!hqg>bPfhKDbSG!^me_yC-B$8nG=BLLgp5*7x%3>z#rk+jMYv2cClPgH(_+}apNoT z67g*Kq$ycaB6-CRHJ+5@NpQZv7%Oo~HggUchT%gcaa@J5mG~3x;N3RzuwnRY{y5VX z;cUDh0y9oWHi`FjKI$&0pH|PeF=TFafC{z+XvNhBG~F#8{!Q^8=IzuB(>CnA<&yfTH_y;*^Ijs` z9DsB(SCjLoSnQx_Kj{+K#s208W`s{jg^TcCcwMGE|p zErB-U&!RXz|h&8-?Ub3-3jlgm}vv#BWEh=?r=mu#sqm91oMXoGZX zG^ti2(NXuhy3tlgy0w2*TCIBswVJEjVx6a?)hZof(N>(tM_XFzUYjzw+(|lVv*1V7EM5cx3wQZJ%5 zIfp8SD3)svu@ACeXSdXaum`d(X2t1lJ8LtKWF`}%?PKMO<-Y1Sj>h!n8Mm9qJ4U2# zO+DGV$T2!GA!*lIZ_vjOl{>WBn>T_V#C_#2;@zCa$qL;&P6 zT7YLP*FgQnppS-NVLxdAyvqn-mm}}<0*#$Tvmz__iw&2t*^v)9y$$=(aZ;T3&~O-O zBjpHM7&U^nk{7%oCLRx$ycRSw9j-Ep+fi%O&BFYczVz6dOOUU$TZ(LM?McmDzt*+_4PO%zyxF>+Xi%@LnrwZm{H&og66;`^FM%ynDcE`k zU2Gjq?z7$r8f_^epIeHca`PZ6$P_7hZ^HD&`Wcc3rYwC2&hyCTrU*TWu~F|$K6HO9 zCd!BIM}Mp7>s*+%Ag7VDmA#+YA}4We92=TBNMUHT)Txl?W_J%*?Qo>;%;a(>J07JD zl3x@AIQk`@OIs&6VGoM$ocsV@Y+I-_OO4J1;8$#7#elD!&NBe#d80!%*@HNHI>5_J zD8K^dZ@{mdc>s{KbO7ZO1&wq~cvtB$!Abf#lq_q`_ode$T_a0)%jq;k6}gDNM!yrv zmimU#^jGd%$!@NaP6>A5-soMlPSXh=$(=!8Q0Ixe>#>?-L77!ZrP5s^3%~jg^&+h8sTY16fI6!2F2Pg8nUDVoha~yX0QtYB96lV7u(kX)YuFF z6PRIuPlc@$(DxeK0>JYyOK0%CZ05eDg1jf^@4?~Z-Wp|OEnh`s@uo&53VeucZi93J zFPu2b{VEL-cF9>xa?-jgfU1H>cwU&wA$uxLB)6_rHq$7YkgwBBe?=3l7Vh(zoc z?_RHxR=40SrZp8?Dy!hDrc$5FVRUzQ@4tj zDrv+`(?i=c<#}@w_1fOe+RvJ;&a%sG5=*XTF*DhMm@liJSZ>f?O~327mbLJ5V}<6m z@q`35?$-{~7e-l(KWXk0pQHZro+T)Um)a$%+w=AaJ37XsG|!uf^tF#k{+iPksbtsA>(({-`XkMo$?BiTFzMoVqXUX{N_atA;1Mp z1wf!{if>@FH8MPwMUY`D_4H=yNSQy zUQ^!j?yh+nu~?Z{*-n%kVbr)+zQty7R%!ks9-?2ut7=YD-`8HhxA6U^yXqom7*au% z1P+7VL$ir!PIO3>U^?+@=z_I(_=|`XZhgQ^UU%v&_jF|%Y@!O+$y!h1{RR5=&vqpC zTqefcNz<1pWBQuTgh$x?Y_*2z+pK?*{GH44of;w;H+zP0i;RZ-)kUai&Za!V_f z%XEjq*!<77K60i9@71oZp2mF<+*UiQQlOm59jOe_bmp3iTWL0G#-mF((+DNM1dW4T z8dx&~-6rT;P5x&)`OTVj&?m1Fi>K$?(|XzFO-%l)%I)x=D&PP9$82l#XO1RwYxQ?*7gKKg}q*EKya*UbSu zHxlhY`M=v>iI~dI!q;#&VmrASOGBl~&U#-o4q>!cw9#m_@K3c==Z6eIAz}#i7|BGA zYkCrDWP$Lbt~2RG0@1>nXiX~QhU?YcLw_U==?_;8B{xtK1H$pCUZ%(NsazXb_G?W^1=l zyP;RYbme;84(}Vv`DzDI3;oTTTD@4O6n+*K5ih7y=x@j~(xg6uT@a4e6jK)T7~Dm< zn(9nMQ*a(9^^@M8F34@0a+qjF4$0}3ETNLfUlh4X6UhcroZT+*GnJqpnYkmroA<49 zT81TdB1P*5r)-yn(y?^8aFg&4st4e&GxZy=yGyA9fWNuaNKkIn^#gcEKMv@##XJ5t zar>HL0gA{E-({kRsuX_4Qt27gd(A@pdckcWkD(O_*l`3tfQ3(|?n0mxYF7bHE<7r;Y>MOep~WW9b&ae%vI6138X5 z0iKW0y#UV{wA;yf!j>39@`)l5E_Qo$lAzN>3y9AY3_C?W#3+5C5Eq3L z8ge(%N>ogo(=USei#rg()L_U*oT^$|(}I-JS2TX)a_Vo>)(Wa>DfKtKqgfIyCHB&3 z;WspI=&f{d`8zUJx0P-PvFrNKx2U(3C^cE{_2x=$5w)b6sumtYM-b2SPtgEz5!Hn< zz?abXx-HZ(WGnVcGv2TgEfNK&R?}@zL=>RgPV7h5iQJ?Qb*@{E z7OFEHkppFo@$Twgt{9)`U5Ybo^u9+K?LB!oIcsl5q5c&emDx5ukWMuGma!#up1u#A zkv2Jbq(0FwIH_4eGF9e1k?>WNPL~0FEiv2!W5|2`Pk_HRdJ5R-hXnLp&-FO~H_&!a zzfxZec=sjyg3s;Mxv6f#4d@3FBfp?NSdx#z_!d1ZW^{e22KYLbp}k3bh1z1Hh!KX9 zhzh%|v*}N_&Jh>+zSZyGw!t3|ABmgLQ(-4P^>$cjfQ)VEZV{h! zXGj(OS5ThrDKV6KQQ}WV>3j)a{#89sJD0W!3bjjWex|t<;p8sD<&A$rh~6vr5erZi zx{w^L$I(>r7Lqm0gA%dzWCgVsf-$$M9oZc9#iP7AQ`=%P{Hty~sf5kqotn#ZD(dy5 zy*w}VW?|we!WFBiE&8PF$n1S|OMOgMd{z~;ofc=tXRadmPy#tBPu2IN73po#^Y!=X ztklBPE|kcSnK(VMfH+P&&{EM>x;NnOBRv%G)ktdq#u>iHhp!;s13qU{{XzM0Z7VQd zUZuK#?_m}h2jn$kP z1VKa_NWP8C)^{@;2#X@eYJ1Q>LBEsP-adTb-qCfS{-7^KRH)x*|Ik->?Z#}al6ry^ z;>kpTew?6CR95qc{x)xn=v(z+y%26MKBBegk3+-6$CYY*1{^7Vrv6O*C44K1(Q%F4 zpwpuDtzqglHH{WzMdXy|1B~M{7btAxT%$qWn7x7MXV{Q2JuAbA>eJHWGk0r9noT{H zah+UF=Oy<@o2VaYsEIF08lsCME~m;Ecyng3o)JG z>AR^KHBU8F)budDE>5>pf7cs-X^XCz{w2pwn+_BA(`_Mr92r zUg!nMPWb|&g&t4LO3xq{8v4W*Cm$tj`k?S7;whv6=w+GyDd6)C(GTEIeHg&0#CJQq zTAu~v#kxNLp3tFy?^aqJushu~32Kyo1XU?-P`a>oqLHft^wYwRV7jD0ucj}RtZsp}QZFS;&6U{IYFo{*>IcG|6;ahk)NXAfrxh`xawIJa zU!binnNO#1pX-{by3-v(PHO9PPl(~%&AM|nSro?IN6yv`)$jGq(7CHV5@8W>T1ikd zYMkZ|p)}~W_DRh;G*d03_Njgsj<5cmBcL%9&Utw{jm*i-L#)#OLC)%^ib zM(hLFQ>y}YWrsQ#$UmtE0e;&OO90<}Av=Kq!B4JgQZcM~N_5C&5wKXehbSwO*|MYvk&GpyygSM(3 z>-rELI9460JE*rI*UIeVh%yL?;UR&OR108VzYf$wbrG^GC|Rvn)u0Om{@`!^|GjCJ zAFQe+Z*ibJQ`JHuM8L}}55BG&PH=NhsY8kG5v>*L))o-k*7CB9LB7Ofb*Nm`yghM9 zi~P?#B}jb~@ZD402jD2;Ias&rU7Zi)`J@i;e6}(H=r2F)?SJo3^^kKq-et#BvYj5h_Df<-{Ws<*=1yks;<-GI!|+L3?!P2jdS`jc+I zD8%^|&DAzy-yBhBf8}q`1BVMS6i-329MQrbl;3zprZrNk$>OD3HbKAEOlx-bfBF>O zxZODpZ_pYWcx-!7Uu{l3hYc1URX_2pbzX#91|`&*92V$V*>V=PcY;4EM_b0&Qqcmi z2K;}0%J=GzNaT5#Z*pNM$Gdy+GIIv@^{z_?874z%cK@9IS~VoKf6ZdmncjFDA2W^{ z8?ZO_g^6u!|JTO9ZiX9&!cDjB^%wX}cuc<^yf=BI9RPHsv+q&xyKCS)z;h$^!++?` z6QV6TNSaudXAF?$M^%eUwVUuZQ9|*ohyi%4te-fN+XJH{E-XA$g$)!B67^8A*d;hv zMCf(c31TkxNpmUWJhhj9Jh>s$b(ai*mee`f%Q^>N>XEU58i#k6OJ4_1lg#UAP4~XIy~%qc^)dMHpNG$v zZfkgyKPG9q%&&2MzAWiFzPBzQ|7y~5e2Hg8Ze`N%qL#IPC^jdK$9ucCXWfp^kZf@+ z$nc3hB^}2`C-Cs|l0oc@+Pl_RcBZI_*Qw6;SQFlL!~+~-KLL0j#jw1l@{QK-c_0(b zPr-YXeElLYf7DWcaGUCP`VR_SAXx}2$T6ad$av8+P93^fnt}6qf!F})74Zh>7pOa4 zC3+v`hG$~0MFT7MaKAtTOhGJ!X6edMt@;O5M=}&1t43O{l!UYOyu~XgM^0h?SVx2| z!Xw!wf~ye(&Sxib;v#yA>K$8nuF!EJ)IQI5RWOA~tu48W)svv{RNr+El#Q@VS>tMB zuD0HT3+h|2TP<(UU3K@_pDh?1T0h_QyCqdv6WFWN3vUF8CZ3quZ+H`4cMSsaIM=U$ z?`uvA;JesaiZ<0hvFpJ9cnPx;$h~ae^LxMbE=UVRXRyMcX-I&i6u-vx7mB54@E5$D zNP^@SNvvQkZ?UM2WNG+es1o%TpA0_5E#@~DovF!<&}cUapR9CiP;F<(qvt_x9AN`= z9{v>RFxF5dgduP2p%U#2L2taZQ?A>@?StR3|D>G7yX4IR_G?W7_YP{Ye5|pqX@OqS zD$xn4| z#n4O`S9_wfJIhlgcWRqw7N&2P1k|2Sd!BMw>f;tB`X$X+7>G-IyWzb2{8_6ub zNAO&HPZ}&(1K$$INfi*G+J$tM#0bWQ_kic(Q(MGBYnQhXC92Gv^Qu>H^WZt;iOQ$Y zEF*!yqGyg{dR({$4|Pf@0pcruXa7QV5%v+kwJ+6K(HLPV^B1vGkb_0r#_4+TdDv<5 zB;s&bIP#fVOCX_7kW}3&`#po&`3;lRK4)99)4j3ud%Jf!3Ng87wR@xEFD%Jb&OWk7 z3nse!*jW2Q(QW&WOpWak`r3S!&a~uW^~h6kw7D7f2)|S(%n{{;MV8gSQ?$r&c{6bS zpctcgfuHoGXD`gQibuG+W>#g6#3O63W&9u?fFE#`re>wBmdIR8{LVxOzv-;DO@>d_ z6$4)9)^`LvBX#G2T;f>{aDi)0L^JQDb3X#S_HxYtJo~spLH!BmbRb7@(^Zq9@zS4_ zl}ILbDe`dnYILipw~TEy61^=N8re1kLg%0|DJN(ql7{?+Pb*%GWCg6oKCA7#vY-vn zb|o52>drv1rbuKC_JP@<&qP*_MkUEYq6)8)#BB)8Jv_9bWe+ zOP6~bFZYPE&g6{1UA2PDBMMezbl=RFon0?Bxk}TzXLc4ZW&0%0Nxvc<=|p3DCzW7j z_FJ}Z#Qu5}*f+kZVLjM4-laYc@Xe|F0(eaD6ab8?{R!Z3_hj(=7FR96e(XxXe|F8g zU?j9hWT~zSWw9f&mE{{?6{eJV)G};4Hbb^Es29`$@r`_=>5cvYzroum^WYf~JW+e1 z9aP8Vau+BMM$D=l>ZdYvgDk>ivyb+MU_U&LPE|G+WWa7yTlIcnh>$V-N)#gRV3S^4 zsfI5=@%m_jgxU(`Ybsg?Ya0dQc*6+4vJ+uh{8e_C^YiSwVt>GQxU{v)oNF)>%W(%f6U2AyQ|;#%3ud%B>3P;|nD=;5u1ET+^KRX zKS$D7`!FLsKM{xA?K8IJJ`~M!`K2GvIf%+xW9k6KKCGv6YI082LE$YsKVf7>EShf{ zE$Nq(iM%v_W=OlMVLafqW8-je{y|%J5b%lAb)3MF({skmPDs7CHx30o`0v|RKr)PzT9zQHrm z7wAKch9?#7tRAR_!w>Q*sO8#-;6Gd6f_jPe5dCz?csH~=Pu+4G>JhGk&ij3aec%lE zKvh8a9APbddSwS_JPK7egiHAo(M#$#H9MjH{IA-~@)Y>KBhoX*X~D0sVU2H{b<$vW za-){5z(d^r4SKeX=rh~4PR3rtWbEDA21k*gubp7Gc z?SS7J=PdAivwvMSQzs4~YC#D@OycXz8Gu?PxI43O}rRi-=LZFhrA# z+(stzjwmniSHSoFV=cR>sf*Z^)kV|Zo+BY!_~=XKX@81 zTD4U;6ulL;tHK3s6fV;AsQwX*+5hfK6E?7|8W%d|p;~rngOAe>UBIT+w{`A-9y@P& zXh*%^Z@X`8m3=ExW-Dd6%oFY#<8PJ)X1Cyi;>Pa;4S@_`Bj91jaQUQw;iC zU^xcnYQ?7g01uh}1m!bq$>6#F>QA$-x(s{>K2m={^;+B@ooD;55zJb>=)rh6K6bi8Xiq6-L;unIs)Ia;Ato!D8fpsKi)cxTYEgY}z z=BMQihi*;W5+qv;%dtT5ee%QrYn zA(TCkM_YS@FLMme-DCK`Ep$9lgpp#dzr!!PFTET}akP>9nTv#aXHoLG|Cy)EHPnFl ziIm(3{Nb162jDkj+8i)nSsiu}yfaIHs=>aQHSqoam@@^d&k72~hG4B>dE`rM8b;|( z;Mw>Z6fK)2zKIRP)&@R+rRWS{p1KpJ@kTlMg}f$Wh?`g|<9mFsaV{pK6vAHgW8}{u zNh=uN%Fcp1RJD{$Vk>#vu-@MP{(-CCL<|!RWsiqUkJv1JHQW3aYFj_m5v9K-D5{_1TwqAx^{HFuyh@+rpQ~jZ zB?gus<*sz>q!03?>|VxA^%dA`7c6(mE#YnO3jHi?1XL_(QP1R$PySn)S3e~`Jz0le z@F?@TB@e}=o}^qyQfJWx_a?>e#MZdOy)i30AsUyv-(}>-rbvoieUmogSMXfdPtN1! zZcZn#3ws<{0KeEZKu^CiDZo#bGv2wf_wuo|0{R?drNRG{$ovDq?q+{bf2=|hyo*0a zoZyW=%s{*FV-?BpQe++8sk&ac4nB|f_O0Wpc{TVl%{ZY!SByVbKMfm3Ou&N-iQ<)} z_u?F4J-^=AD1K!ei?o;QVKKvEq*mhVq6~k-8}LeYk>L#-D4E9|HQa#aii4bDLn-`N zG|&EtE{F)hmfC)%q~R-tsQx*La7}6I3Jli*kq5xc8r;iZm<2oXqltv7*Cp` z7qbCv96xO}gqu&!h7V(&afQa2{2INgS)c({soX{C}V&x_1})ZUV7?sgf2llamj?#iUj zaZ!>2*I8?ksIz+wuoq_cce}jK)c|CH>wCP#SoV7!`qu0&@IBmd^Z|%FFz{T2eIxi@ z?(#d+yUSY2&S`SdrNkeRvgOy1a%D4F8`W*NwZ=#08zJB>Co3a$s-f^)Lv&<~ZkN!{ zI7#ZKpXZG*)Iri-leKOuJyDWv8;17A9c-gjft7jr-fr1|UcslZO3Os_6u#7X(~^Tu z7Bh}F=AFU@(Ho}Dd=8n5wYPH2j|EGF3+Y5tF+T}48H1P?IOR+g&2#rR2eV4NwPzRe zlXHl8N$p+clEYWr!rk4r$bpCtu&XS`>6napDmuz{MHbl3VBI9U z>-y!k%>FZSL%k&TSk_m`-MaocXqH3rw`ZavE3;9u#B(t#U*0J3^W2vIlzv$9ndRsB6#AdgRI=`OOvRY_1Q z<6K#irV{#Q>J+&~-&iV=@l9w)RLa*d5cqew4`C?S-y61qeC3U9&&o<9l!1D~xK7a-8@A*{jyMF+( z!o3wd|GVoMz=v!F;C*V?xaz0I=TWP5`>@{%=`_VjC=Alkv-n>4N=IVZe81pFUDQ3B-zvzx#%Lv7tM4|S{%tWye z8_VprxkWhk*ml;2i27l)^@MdI<||AxhgjDO|AJ9^zxU*FvY>l-h-DDs5m37E_9fDM z*A)D*D~-A2nk1FgZgT$M>MgnCb~wJU_4qBTw`AkY= zp<@vqWF8oOl#z>e;qjiYS%Y&W(%(Fmth8LaB+~PH=E9sFI9_{PUZd!NFLW=+D9Ub$ z>s%euMrQ`$m)P*+jEn{1=4`82B&9X3aqP35i~7CJ2>7$rZv*obQ{4o>_YO}zD3A5* z0I06b1GwJ371Wozzw3XYYaie{O(jD@O%+jZ$v(Kt=pSv=4ni5)6}5wSE}m(yMs3$L zU^|SPW%q~_F=336z46Xp+L(%@TCy4Tj^^MoL=3jakb?JRUSe@@AIo^#P|<#5p6R3Y zFI0pMG>6(oh_1p9=)WzU&>PS~x|wwbHdf%#23rmbn?Z+Ga?Ke~L0AFoW4;P43Y!c0 zIBlfD^$ss^w{q=qjg(^UeJtOViT~~{arJlY$7i?*M=i_8zp`3pl6PKy$g#ghq@=f|GE0H42k zG6A2fYP$egQELJCr)x0aHO@_e`b1YbknihKFuga&RkHq~cqg(^_LBHfe3bX6Oh>fB z*OdPtTdeyeDyIfUZr5GL%E*4wON0fhQ;!rAL=bj6cou(vwj)xk?}~o1yhoq#zg3?# zkZ5ex9<<(g2t6BQLPnS-V}(8y&~VcjG&yuAJi<5x^)KFtDkuy5wITu?q?yX?t6q%_ z({BnxHEyh$Wu1DqC;rUUzV05|OR~~kP}jmW4DaY3>$%JZh&#IC-J{uNqIv8}Hj#ZJ zk~@TUi({Q=l{J$*#%M)vOpP+k_D*yU&2kP%w&y>>9y)d>P0z1FTRSEt8S^FzA2V|j z3v&0v9hhbDClqI)xz_8^FSF91K4vAFA-@(nkeb8{N$w)Bs;9Bd7*73rz>|OdEx_9Z zj|a$a+`Rz)=&AyCp}ng)kPos#fUmqUs+)PQ73@e*-*n$}{i(5Ir(jBwM6?mjLc;KQ z#46F@pyuKj?MdvqrY)9OGZNbuuo4=lEkb*8dam+@+J|B|FaBqqGT$2p?SR)G=~p@r zdZG!%W3>z&8R7)S054su=il%@dReKg`)#!(fH{g(0nV8^IX;y(iy)7P#it z9dN8g>)67&F^;Rk*=&)gvtu;W;GFONW*>mWJD#w(eFx8nsdHp7FX2*?$;?>(2ENrl z+R5Jo`OrVHj(n7hQ%mdz@^S@3X&o~(mkk)DE@xgUY}KQ=)9pdo^{VB_d`BnwB9%!r zhaI2%k2b*V3D*SRH)J_>0Dtb7jROAKkJbVp|7f`ees_j7P1y8-flOO~|J_b=URT3d z@kb*beox;MOEB!<>I`p1?dcudYD0IdgT7tx48zY}?|GUMC%eM6T20ME4UW7Z|GS;i z;45LiaImw2vn2E}{LMa?Sj{CNtG!$Gh>!sIJhOz@!R>|gVeB8#lFH> zmj7<2g}sc4)l3aLWIt(ZS%tPDnLf5_YAoDo8E+w!??U}dDoahoX~8h^ruli`n6Pf% zY@^G09x#XazqY*d6o)}4krku-$fvwsxD-?y)5`m8SHLJB@ zh9KBJP>vXz^Se9xr+)mO{+#umJ7{Wmv+e?zmweUf!0(!_Spdpk>3$Dts^3x54y^MB z)^sm!lK*|R6%<(W@teYpstl6|O%fjBvStIe6O(awo2MfiF(vPiH^aeN(W3Go^8{#` z_=>utH

xW8(ywT%|q+{^=6#m1kD+gp}U0&`pN?)lF>Z(nP_SZ+Pt`iDlzng8yk1)S>3?R_4Mbo@kIyAoXV|Ub4rpu3YK3Kk5}H&G{y#D!+bepDrGm;^4ZTq z>uT|;rCmuazPILp@e5fmfpOi6F@oRZSY{X)_kKnJ=9ih~&w%eig$tk=IvWRIw!p^cR_=+NHk-K}1JoIdveCgDk`VBNv7k^6)g%*G<`$ ztFXxy6xo36UT)-TKs+alb(}@4%OW%AXmeNNEJ9>GZHh4jD|TDUj9*GWqNmKiQo&Rz zLY7g+fw~0A-_RjbbmKG3nqZeKgc zF}exzxbhRT&iWqy!_}MaZfPTbW%0mE=>td|Vj_`ltcH)MS5{BTaU|_i@2;Mblb+N{ z{ncMDXM19y>V?mlg(a?5uB-Zx(IKI(va@$aT4H=tvWF`vsY~n`#cKO1@$7R z^A>IA8V!CU?OmV2d~t@m2>49mRDj1$>>1geR#rO)iOnNUC?yqowNzU>vOnsMFMAUU}PSnJ2Qhaj$ zteL49t+;KU=<-^-SCU};XjP>V;C8PX;4hwO0MED&06u59mV>n(2dhJC$Gh3l9`yIJ z4+YOB96_xiI7bYW%PnT2R27dPCWTV3UJUQky(W$7FnEmqDW0e52gOsnu^3gcqz_do zHW5AZwou;;GcjrT4eE%gp0uH98+45P#>mP_OW%`4wyzP(w2#R%OfYm?mq0eRXNvpi zPY|o@qng#HqKQ2=r}!!5!%Y@v`7fr2*mvE8vI@RF%LHMS^B&v5@)Dixo#3rcKg5q! z9;nQ=T*T0-X_Z-)I#{ZAi^py)M7w&Px{~RJXm56^J(Hde`%DJu)v_|=AU=}}Z8{yf zL!9+Z&76_BntbFNnAtJ&B+<=xGvj#1bK-85ia+;7DDHaOr+rGD!tck^U zC3H`yz!$LXqn4?q=skOD=Lz>Y__F@h*3M>57Z^HiDoHu)9fLXn%S_zluI;M{|=8f ziZG>Wu;f=`wd`kdhoqtoM*By=zm%BR*Z}WSTVIIJ01$?veDO?lIQQ`U~FCti{?{Uty1p zN3f~%2b?jkMhzATKFRnqI^Q}9y=98So><$$)uu9Zy=AVXl~$dn(KD9A{vcc|pUCD_bMOju5%<|YtSAGn&u#H#>2}Iau)`|*Xdg+;jtJMeu#Uw$ zEr)0oVhxQ(x)2qpCM2pz;<T%qa_5!!l`A0WL$*Y+pIelepCuQDb6XN_ zX1s{GL49--ooljfZu)9?*Sh0-vm56eZK>q zD=HJfIPdTI8Sp%qodCO^0zo*^Q zdKy8@_Z1@AA#+g-F@O$|ouG>GUyW^KA$$aei8>{F!S5k{F&~voH=mV?%st>^#_4%W zOoOB{Y8d&@m#7>K??ZQ0w^uJIduF>?vqv#i@Xe81vk)G2wU!|=OeY9vsd5 z-}yoS&s(c90nd}XnSfspw;b?0)}{yJSD|PG&YS;4?D&^&&_pXTb|eVR?(z}(wuDLZ zvf_(yHW8zF68dLhh@x2CPS833BfeYNT_7r}#(pIxiT72I81*k5{PZ8t6_2zII&XUv|p@>D&A=R$fSBk8m3b7EkkTGg*T~x z>fqZsZ|Rm~MAi7*_C_Jr)U!NikoJ&l5m%DES$B)i=IhK{Q<@)n&-8P8h;XCcjtP^8 zXkQ4|663Z1r6(Z7w+@WkJ)Vhx&(ZGrU|tx+dePeNF1O-f{6?Y}c<&7%_5ZS;|D(_L z6-n2~5!e!i^wTJyH~hG#)MfBJa~E`)QUzQ2v#|>lJCS((D(NcuCmDYzL%N0fkxTYJ zI{3x|8-#p950m$-r=Un=4B6CD1f7K!;-@U{ptQ(|e5&U6(jCS3vDZ{xX#?sHY>6pF z+TAz=-1|TE+^=4v90N@%E29bG=^%iUkorp?Rak$ecg#E+-{HpP^JQO*M zEA(kd15=b@Zc!V^W?Q02)GPVSd-w6j^atT(;vMy!c1c2s*$UD!R2)d~QQGuc@lkvx zGTodZ>V__WmYBMU55tor3k-&^9U(&m?R9H6j-hmc`}ulUkMvsU!m34Nsa_bd$bVIJ z%Ct__xY|Zcqo#_N`H$gt!wf+W-*N1Sp=Q$|Z#ouYx>W*msYs0xEj=QTA|_Mgg5!jZ zcxIYgHbgzDdQ$ExI#7Mse@}$<(07P27ZfxUIEUB zwly^aem89yE~))|1@!{#yVR|JhPr~BQ1}e|ks(4JO4GqzE z@I10bg$f--wImoS4a5g+C;n9VW5QndF9~K}sCZ-Cu_B2);|QW|=@*mLjKC18 zYfqY)u6oEYlelg>psmn#QdBa-O1tVPbd#+jw45qOc3NkJY@`;5>sdeN57%zs<2cQ( z71E#SH_+>A@^BlLq`%Ym09em!K2?O8XVY>(V%h5JgD>4($lSDS{gMTF^h%1_Ch&kk@ zP4gsLYyhc|Zj(KNa>-s{g^*8QNQ@~m!Xis1abIv3aWE_Jy5g^)O_*-@NQqTnOg`cI zK);!$ka27p{LR#!6tdmm98+Vm89N&pYRXpxJ142jvDz+^E_1JxQ#ZY`@!Gr z6%fB(jd&b4ZFWbZc?ERMQ_NAuG~|HS?z(2YE&J}N>pDjvl4wsLx5`jooW<646w|0s zWIW7Qo@yc168XqM+P`L-x?J&`CDTi zzLz`)D~u||NOGopxv2o{sYrrtjeBVa6V0IkI-Kf+Plm3nd2I>9`XG-hURadqc9hTE zOfcMHyqxYyJY$XcEOS5N6x#=9d3!OIjl_+n{`e90B5tMQuocclJf@u6+N7coTDopPI(7A9+A@&5G1JdRBBbuYc@WzN$l3NE=fY?k3Sc%P)kD@yaszAac&fsPeIO0Hw59vKGOQIoVuo$3m)Jd zOn33EtdBTmwc;2%g?wq9j(>6vA#U)tb6@9L;+RE-^>h{yFX{gL3GYcnh@~46=A1=5 zvBpSNI@;q&bP4pvF;3aoyT`N`2`SF?%|hb%6HR8HgU@u(&8qROkGv_~Nb_-0;!&%n zNLF}el;)Jj5_PyL-58x%b=0a2{mbxOy+K-}dsO}lVfWUgiL*1w(Us+CH?qc%*SukA z^|Kfv*_)YqG2;{Q*)uF9IQ=P+@zaSBt}ijchWq#*>{;@p=c+FX z*mDnjMF7)$rvcw=A$fy zq+Oh6zN+|zoF!Opj8?>vYVl4gM6ncK8kA5Gg_fe0hOa9W=!vp8K~>meae^^OC^tTo zETUQwQ!EeV;e7s#YFiz7GQW?KYQxd}jF#MHoh0AQG$kikCP71)uf!HhPk0aWici7Y zS+<48e58P)9xs~g$^m*S~^TO z46SE@%f@Ki%Q@RqMN`{7(FxNlY>l-H?ro_@%(k4Am6`@B&e1)gHO9uoE}D>;O(ztc z%_ZW+rWT3?CV!-iUaVMQ9?b8vBq#>cEjLmoN_o!5r$&(uQqQlBP@mMUChOL4MEcqo zVt%!VNY~cIMSdeTUw;E{UG)XJL!Cr-yDx}a824Zp1D8xPH6o)R3T|f3kZhrK)P!8O zth+4_zmXHl=Nr0049wBNnao3F(`*mC*|tiJWp+mz*}7>4r?r%)*orkv60ggnZCOz* zY^&f?W=MJ47g{|5@Y}*44zQbV2jJCEIT`R-==rhUag}`tc$HYYgZcR|(Fv^6g%NGR zd$INz)Ls#~Kzb71QGH4~hL1dMt{zGqq!JYqmD4CnkK_5oLcU@Tg`Y-l>z`FL!uB_N zs~@K=#AX0n@`r{Wf5VVL=E0)*=rum)S_knPI0kJ(S;gJt3Fs0n7THRENxoG#FrYQG z3<)edTsTM4TAo=RT=pZU??3faD#SHM$uH%lcvba$0@9Vk&8pXmJZrCVZ;cgXr%a{grvIoLHYFz$9PtMQgQA8&`!n+|=fNk^4&dH=8tfjkuc5=lO zv@tg$b5Rk4Vve_Ia|KuA)ztc=w7l+E6m-h=4;`S{qsj?*+~6rdYdfyFIsx3oa)8IL zd={+Qegatv*7?T}55T%~ZQnny#-=L@p|nb|#?(Pk0yCJKT7jFx8{y}vt@s0-343O! z!P*!?F%7jBePDQkd^IdbJDFRf|I|_2o=7E2=OJfpPju7xN=et~#kviW9?;LWB<)0L zKj^Xbh4vXAr8U#Cyev<0J7PO!DW}CF1!}NI@lRcC{ikI83lgX}e;s&u`3YSI-$=n6 zZH{4YWiLsI&OzPs?1i6dSLmN|-LS8QEW;JMpXf%xhJWe^;Qf>YY>hWN_qk^ndec2P zXD}bV6Xy!gzRhakI$Zb6`Oej_kZqd2-u^eg-&`lTl_iYN!Sa)G2mLQSys#XO1wK$D z6bSA$pRWs1`yH`V4RC{?Z$YixB;o`(|FtLd63A;%+gE$tQe-%z)jdkSBO+$II+AXM zjj&%*w=}!3FHA>u4|)Uko+(i2%!{xX`$6Sn+K*}Nhm;Z4hUh@17b&!z!w7qdBFXS4 zv?L-;@xnD&-XVN}!psuri||ssFSiWc6E*~Y%C$qoBd1{txmH+JxF7w_9z|yfR-<}$ zAa*`-8Is{FfzJvFv=w`X>*pwu#nZE@rt=wqR@05Df}F2}HS{F!JZA&pYC6sR$PpX3 zm@ajEw42wgqfbk&+LAVGqfM%lroysQ^eD|%zP4NfpZm9+uY2xF1w`ih8t1CfzJ#o5 zY)%BBQ+)Ii*%uW}38{BvW*%-=^zvkD7OPB80DogBf8$!YpCPZT7SHRK1Ac$j?pj$Zn+ruCF6H8;5a7oQRX_J| zv460ndc5au%t~hqb!X4R|BtP&j&B=j{w_BhJ26PMWXlk0IB_^-W@cvYm6fx3>7?s& z9Lv`=$?W3CNBGdB9A;kJB5&Wsqpsd@y}iz68(pb!N4zHz19`mUS4n|4&E|I>uI-yu-Z&t+6dmIn2yMCt0K9dDTM-ccs(vkeXhF4bq3on^ZdsrlqCIQ>%LB zze;H$_xqpaUJTSrY3je5ZB7W6FY)mdXT{fLTfO>}c8(6RD$gVAgL{yJ262fE9GzLU z_^qU8fc?M|_SG9}`4g6V>uYJK#R_m%8N2Cfd8KMS(EmL43NVkHmTKSv_ml_{xxhX&38x;Sy$ss@J%Za~YIw^Pg`o-@yj*)A8viOh2 zL2{)pGCs^SQ$E>;#do0;^47jHv6GBWd74j=(zd!IQU7SXC zza@(NAqkJF2B)3&Cnn6V5~r#CGZNfYytKpqTk-s=8>wo4tAw6a z%Tf>cAIHD-N2m7j-;TfM|B_PS-y46+ADcSQKQO+5^`5+??@oME>jOFJI~o7GrA*%5 zm!3ddcFTMFQsOU~H_PLEqJ;65&4G4fe1c`I{Hga!d|;(kF7_qIKQu3rAN2m2BB}X9 z8f5(~Ibsu6*4;KD`Af|YX+zt^C98bWJbkW6cGdSew{xyBP}gH_?#LWO3i*!a+{>~^dV3pZ z7b;py+Io*E+NR%=NWD`s<|pBj$sTK}k@iR)xQ{h^>Fej2kJRdCea~q?Q`}#`dRz}C z2#j}6oGP#%`#XK6thS$s=9kveC8owekJlOF0c{ZP_P;RKQw-g zb&srxr&U5{8&{5aq7$-h!SaLvon`$Yo9cNSKi1ksHr7)wVXpPCY_;c0yd*&Hxp&70 z)-7bCJagkeTX^yZZd3A%8m$zwG)Vq)(+_`QO;xgi))mQdn|8<* zHg3wanhr6YZO2ops=vzRw$7<|)zH{{`|;E&f6v%aHnt?!b1QpfeoINHwavsiEU!L+$46R=r9W_TEZ5<9!sP^Bzx%@|DJ5-jzv>edA(K zZ(hz7FxzYzHK;b3ptS+ZODzV_p0*+jVS}b4mOIt4v~da^n|T?SZV> z?c*<4w_>}TP2(q67f5=zuEzbayum&=H^(ip_L6jU2@;hxnX<;lpk}ho^8>M^6B5R5 zUL43P{wCr6rk~QwrkTw|o4(2_O)C@I)%2C;n59Y2t1@EpEfIV67QYbB5P-XkX##K$ zch=>k#Vlumota@63hcQ)kYAFDN0?EPMod=1A9hTV;kpvfr@4|2u9$>74u#~NvpBw) zbG)RXt0?}Y^A$GKc{^^tQ!DX1hsOm9reS*=H{;UX=9rCEsbIeLzWji-vEZ74kIXPPd{`k7n6P0hWfCyfNWI1mpu++q?yMyF^{ z%{Z|WsvmoObEYgy&_qUT9w@on;H2b_O|8U(SnH)1YgUQ(s&w+z)w3j8!`GO8{%YwR zf*T*^O^}Bh-^5O23St&hoA{J5FGkUP47ANWBldA&GYGP{- zeO<6x%JXP|-#nao2G-@i)9CuxtB2tjGOYed$pC#IJ1uXt^ppOQ zAXPIMv*Ik_2jz3oSzTM+z5Q0Itg_@zlrV{L-ANyx=2l3 z(m%vDBcbFLJX4a26cK~<%_S@0WyE}nT zxlQvoW$VTvLT6IVVndvu*il)v(x8BrI0)Zh<$HdzZH{{YZ%`Ct`(!&PZVuLZ{~@Qa zJJC|I*x#}_U%Lz&;vG@gQ~yJ(c5@3j+8v_3Os~9b%`c*R&gh)YmB&!X5u6#KeIbr_ zoB(saf5@p9?LUIm@;Xml-19v~2=FX%T?h6$-7yy6InHt$_$S-UlK<~KUBM7;ecl*u9`>F)n9GJPiRyFjG?~NsC_E8zi!+gOY@{ z#jVet1U;}PaV|F61!-*MQ4O2ifh^XDsAZuopk0<}d#sAfH#-7dNa=SU?Hkfmc)6X)=GM95F z`X%zwR24lF?8*H{R$*ZLGQV@=77n()r9N0A3$7S@P`{dvo&bD%n7ROZn^XY$ zn79n=^}pp5Ko`jz$)fPl&?)^4*?k@Z!JL~?1Ah_cbJQ~FC-@5M6zd6giGP$e1KuJ2 zn>!$?73&DnF>-xTVW}MYt}G}yz0%74Q+rUenD;a~aF!-&aO7HHSI0D76lYOjkCV%O z9=;WtXdhA1vt$-8#X7oS->?qC71p2S8#ok~u*_Up80v#KmgB12uvw*RjDI)^o!d-p zkPV)xjFadkJnfM(qt!E^3+@=#PF)fl6R1zqb?p*C7snLZtv$mpG_h^RwIjIsShV@Q zdOP=%{5%d55v<)5=_x3@m)hD8h*vLYnQA9ZOig~@lvxz+oR^oMJkU_jk)FFXvAe#K z7G+7h@wCFQUsu2FOQ0_%9kM5aB!_Y#8vJ6xaf0X<&l+zx1tV*|jm zFP#ne@ir9Dy_UMq`?*p6%<6qSEfq03bP~6H_=EFkw#Ht zdAqSSf?tag!lz>WVFia&J4AQ*A0ut*`ogk}?(pww3c6m|Shq1sUOADbgN{V4hPTnj z%GR>?^E2!@mCM;pc&lxdWusXxZk~01<(}{c(Z5=LFJBwJKQz`dUo$Lp9DBC8lQyPN zV$*aAv!v2@tb5?UT`yfftYeTYrjrY`G!f=8ty~Sw`GRo{u|s6+2zhNo=vP!PsHe_l zSzuTKU6fQ%Ck)?sff(cUj|`qDKGDS+Q!q#oqHp0lksqw6!1ueId2chu5RKg@a`&aT z*Nt@b${C(UsINJH3FIYirCjQGk-MHGEasZw`oL2$P2b{Tp*Ek}839UjLsjf5c^|6XD83K&3X;)MGtnAS*}4J zEsyN4%xX9{sHufA_2l=FOe%h8%;7(fS>T3LPfiQnSI>>Sec6uid|yRgzwC&$PdsOH z7iA4lu5!Q4S)u5s@50A3;G|tTR zTnGL_jkhPjP3Ktv^wZ*Q5AfZ_Oapczk7)whm%By*T+5wPK>rbR7~t8;S-My;hIWYP zu3dvE#OF)PH0790ykB)xQ-jUHsEW6o#iBzfR6&Qb#i^ogC4-eW(C2XFhR!M^kkxj2 z`G<;VWGiP2fGs8I;%51^O;pDZ~O*W=ka^te^3G*w7HtL*){=H@Uxg z`{#DgeO3J4Jte14PCw;rclYeL?C*^?I1ed|inft$UE?$V%-F)-;n|{aZFdaZVLRK9xUK~Znf z1dhD&uxN~MO!*078uA0Wu(5gNK;d9sq+tsDXURqzgf29T0_U8`a zq?&2fT6TxXW5%Jn+Yzf-h%t<4%Y9MW-Dof*^9p$%DKXKlftLdresFJFjySe+?bcSV z6HYg>h@Q=CcRUl03e>If(hfn5&F#psUxlAoTG}z27OEtdQ7P8R+{c0i*bK`-c#-I( zWUMhb@)DfpIhB1QuO%|XJ3PB6FH+Fdqscm)TLyh(JcUFOM?;*xr zcYgB?qXRg589tyK=MR8C6ggG(Xr&k9u!EI5;2h~9_Iph>`cd+!Y|WZk=sn5jwT()h z$W`&C_1hW@Ky$>`OK%j9LCzvG)^(5U29M;9(3~iL4j<;`Q+bg!+yjMIh3A-rOmkkEusI{l*pusq zQ0LLK^qd*6+0i<+XV!J72VI@SWO(5&_F?gFlF#z{TetF3O>Mn%floEfR}9ue2Yc!$ z-?N&i#ox=gz1S_J!eV%S87Kz#El@| zLA$wZQ=`>;;V@_cna(~2quegKu~8B1(NX<1OI8JOKJZxjJ5BC$Gb0h*A@awS>_$g%B;0Mg8pz-G z8|1Lj+u`MlF1+Ph15~r60|GxDK)RqAEMRf0Pip+LR;JJXQl$2vs@LxuGF^GUY#0W z3CmZHmF#I`Z91vZUs(NeX;2O8BG$3&_x0N738Di6Y^*1xrn(O1+-$-`t=b} zabON#C!y|VO2lk<7x!h&Xj{QmUdp8h3#)=ReO=7&zZ#-f7ufP=;rij#9<>H;5!- zVEsGq0Lh^|`gXZu<3{obJ}~=@`4t{xh*Lbbh7&o)`e_RKKQjJx)5NX=c6P3{cb%VM zsheMKFxS=hAWe1arq_*i>!=xIU$Bn%Z#fbTMb(!}HAxkJ5rbrhBGAzD8nvuFH;#M0 zbiec)Cjxh|_DV`Qh7#_oS6F)KyPy@NC&dGFhjfwZYBb59R8=UqBTsNHHI&~Cud*y8 zHb7f6U2RQ>ySxV4W>zt=m3vM%-13_2!cNw9F^wdqMz7L&OlhPox}C0>$xn9X_0a7w zP9WBCc)CL*Ti1|2Z&@l>X7e~!Sn4Bkd#dArc|Y9U+JO!=d!fPPW?P~86lWZ~*Mggp zdHW>0jVb0G(P=RX@}zkMe@o2MHC-$dI4)B?=e`12n!z;7*|1- z?M-e<@@>-|%c-1CiR-E7mP=Xf68r|1)t}iW=2v{X)tTBpxIeYpvQc!+#{4V)?R4iF zU#{}o^ z%=~1$W~V=K^KKb-+^JwnHT{^tU9G-`Ev zr0y`8AVq|4RYL=LrlLia`pJd?vTLG^+8lg^Y!6zY+poPVy^XZfPt(h#Z{W7NY5KX6 z!~8sDJzbdO1M7o!o2oBnA9c$f*tS9!+Bl9V!D!)9 zdpONu_v4+k+U%j6XXq)@J=^NC6v<{1vh`;-l~3Z$w~eT$ikXbgvW-x;ig_>cSbtM1 zD1&QZ-ok9m;A9%*JT`%iU+R`-uj2-8h@}gS21~8Fee`C32dYDXe4a)7GJDyN8A9J4N>?K}0FK6%1eooGEp3HJ(1sPcMQpHHc z3X-B5WilCM)C)V4HYg1zVY*%Ngrp+|owcEi5Ds+-$y$6bG5x?8@`vjs@FzC8CIdfj zh9eQQzjy8i?*nr72e?N&y8(O+bSvOzuf*RFzXa+!`pef*!zFhm9W~#`Vu?)x=~t7B zC8(r}HjpnvG8{Xi?LZ)s&f@0E-8vLoB-#-EJ6R)MgFI5V(e4!+1t(2eVGT70EIZ7l z(INV1TfQlicMiX4aZn?`9y)7j%GkNJaXSbYg~%EC8| ziO`d+P2;fToICVH-59jOG}(EBy$Y6CH#pqEp>VLJf<7416s3tc`m1KOxFx*bu2i3r z{1C6Up9woAt(G0N9m11jlVyXgY505XN9T&{`FYU|mox9Pe&pUzFLNblb;&)Ae{&2{ zh;ugMsN-XXB`Xg9jqaVEsn|kD>5SCX>1~KYIx>k$en2>^O{JYgJ6(&ZTAXF>cEGQj z#moT|V)8+IrfUUw5B*(70p0^#8-Rbuc141Dqrfo`?04gpDsmqB9J7_Rr~VchrQw=5 za+3Iqq)X-BgaG4838fvkiBDou-8^zX24hc@M*O;HhUik+Jz}?L2eNogk(Mu7Bm881 z9KA;~%i=PPfNy97)`QeA&NIEoe4T2~*{t7f-WAxtnU9y7x>C0)I%{Q?(WYkMetn+# zjp;c2hS*~{X*?hP2tRA;hWZU^6J+oncVAH{Q zF$2o$RLnTergzM(R%Ow6T6K1q?y@~9wMmw&^sw#MByEO*)!W`T!J1M}pKon|Jw_+G zmIME73o{MSk*?PO-|4QFfR{Sk06x!k2;f}cWC0&+h|37Leyi; zGh=5;!AaN1%+bau=yf?`9%PE;YIQR$hOks(u0xC;CzENDQyv{fmC-vLQ%Xt=iS}c3 zqp~)-c_z%>vWU^V3EFPctGYKeWAm+O*%5fX{HD_wX;USVmj>Ll3bh)vsB&_S5! ztV#Wz-wt|7pG*0Wcbp@oPbELk<%YblRVVGuITQB58kKl7s}s9@;6O%6=1}EH%YAvD z)ZLX?fr$C*@K7hqRIASl*GE9_Ihq4Mx`zV?{4P2i;Jw=MJHR{0$p`v<+F6%Zw4-Af zurswXYA-|NNIa7BND?1r)pJ;9u!!Qfx`CW_*l6W#?cdx(qDGZ1^j^*@#2Ma8w~S*J z4ra57$@~UjOs$hp_p?ZMhQGP2v5{4Agl7*Lgl{SrMu(Qo!>3mcl3xzWqN9B@jqn*?h8r5I9pHNj)DZ}o5coi%-_!YX|@W+=N;uF zoBo8`=AMb@V?4v}m;EtN@#PPmT+tl*m6}Zkr~QwddhKmD0KO+IKLD;hEn5MtvHS%1 zBDMv9!uBTs=h5_Qpx^&1XOt?P)j|lDTEbRyV}-5;Pbz|W`Ors|O*Mi=A?dsr&He@_ zxnWRoWo|SH2bbQixXX3JKY{K4FIl>Vjr;1hR=O&?moLQUM|>_%T}x|bvh>Qfr3>{j zl^58z)Oosu%GBcXWp>T)sYc-Jf#!ArV7h-tupH?RIKb2{Z@mdoTa#-G?Pbkvb5L#=kK~g>;&T;p|t}0 z+q_Hz;*MOzX3*C{zGc_`-kYk`U@uRBzW{dQ-_O#Xn8@ji-qbw9lN(vktgywJ#@st- z4(Er~#JY*h4ldO0VmC*E>hIIFXT3weR*upB&F+M#iZ<(}v#Nz#)z`J_qn8Qal+P*C zHm3B?^h@xStV7yC+Dq!Gm0R>@l+E;*>JGj^^-Mojy-VM|g25*!58;WGJM@Z*q4?91 zaBZQw3-NgMD}Bk@jrf&FH_`{^;``Ybgpakw zUP8(xB1Shq7f$|)d(^U=&?LU`q;`DP*M#H5Fl}aLeWNru(-Ob zrBg)<+3)r5*e;PPvL*f|Vy&o%tI^q5KaetZ70y#%7Y*T!Am?+Ii*8ju#zjySlFv5k z+j1h%w~>v>9x5)mK}%^PHEcqPPa-Dkj}ltV7Q#}TMDA8c5Lc9)2wHiL_^R@2f^{Fs zQOZu#^a?LAs={Gt7v<0{C9}x-Auo{3`doYo@c{i$>Z9PI+vw#Am*D`%h)xeaYk02z z4Vez@Q9vn>@tv+^hBRpqHCMepr9*rV!xn9} zD4lD^p8(uqjm?2QFdF&*eQig*1w7vn0p3HAfer9KuWtwB=O zQ6DD_AIWheM>rY8d36XO&^Dk(tvPRKt;;2gGy}=^n%RVwOr&;lMiVua7l;(qW8$g) zoPkmn8dhtI$aUO?;sur@-!~XipdD2-s2}S>9o=KCOjiOE~P2;H$EqMM6(Nl z72NfxADV&J<)X)pH2_B?RR-|I^i2Vdegg{lTq+3Aqtt$2r`u6oLH`NFKF~f@vv|XF zbQ;Vitr5DwDdHRYsg35L5_p?Zvg%Rb{MiZh_8<;g1GUoM4c&&`heGg!p^Z@liowT3 zK0sT;uwf&62wKWJh)>cr$46^7kjwE`h8yZ=0?`r#sn zx^9?3MhCLzCz0KV+o%riYG_2B3GD5J1+saJ5~m^yDJ8L5bWpI9cuaJ|=aP}Rk-1^i zaxx)Dp7V`(K}fRE?9F5*Da%5$j*u5{p@OGqXOI&G8HpJLIUY|-lcwD=T)}4~bxq2m z#_H>dEQDsvPWIJ?%le8 zeT%Idg0JSoUr;pN(ASdDBWFx$Xrl(G&$s=|XJG5~Iy%r&w5?_gOjluYe z9b!mY_l>xYcOfro7}AQPRLDjgU!=DZE2BmuGX!d43Z95g5WJ+e5-(7{z(|Fd+MrxP z0aanRf_#B<3^Z|BWI;cg?i;#^nj`PY7UZzN5!3C4ae z>!BUt)4C;`Hp1WeV&Xn-B?bC)L$dyoVTz%W*r^R87b%l89m#&gat#|_qSfO$x=F-I z;sY@!U|&X;MUW%(;rcNo&u~PaN9@t&kYrF2@>nRNCX>%#H!|8djGQfOE%X@r672`L}cF)O-|zY=Ye;xoRH6se6Ln$lJK zkhmuZMn)Q90A31X4!~7mxCLlKd?uia$hvVcgsRi?j?@>>zrdIT@E&dW8{q8Hnk$#V zUg5M=SJgk^ROGArq_U@=T==K90edDg9zCP&q^g1Q1zPo>(wneY&dt#X-_W0DuDL~YjVxOR zaQ?S{x4Y7>3gu@ZJ#~(aBYBhHjg@Wd1%>zIU)Kb4Zo_;yNc&c;V;$sV;<4+t@_%D% zIQH@yo*er3_y0{>e46oi)wzkn)MjKUI4PK6|bH zcde^@nes2qW7TctA7F0!ZyB{TI(k0z#n40jS9BuxCq79#tD<>CMPr5s zF)W-5YddIr@V;}O79Wi`#chBP+IaA{{zFb-g|a6e%z+EuXoAUIoap?pXp`pfI(A-b zT{NkI!*Zvq8;8*0k=c)m#;R?VEQOh<&`ymK{GWMB5OE2}?y7ADa66^T1yml0%BlT* zm(~4%U%iy5!8?!KR7Rhdf_ZlfwRA`oxVF#-&KPwQ7`2m4y=*~>CSS~ zo$G~i^;~X0N3!6R<`)0Dy%DrtEs1^v=34)JrUo@SMj`d<_0={;kImBYtL8E7kk@4= ze3xCBLT^y0m+d?t6qgNW7TI?Trj|;r!_5<5(SN_M!g}>mL^r+93Y&Y@1?ufa7do8z zLM^S&m(xRqg|^_lQ2QzPfaPa)FfBpWTYqM99AfmAeSXq*=RcpN_I^nqXHG3;QJ28q zEHXCb*YfrCv32|1;fX72`SZvcfUgfb`d>Kr3HzY?EGyw#w3AU&ObbaU_aDPbjosYodrg%1(li%Jws(v67vO)svzAGJcG!&| zTbf^$)K6UIex93`n2h~ke$Up&x5vgZ*34^n{!2BeNyFa?Ne?xc-Su7m`74R_a z9yumj&s$j;FE2%h2zFF12Vf9d{4nwwcnM@PCfK``0>-hGh@L!$iSJp%JH;b?!VcbM@Z zyv4iJeZlw~{^Y*ItTOBt(2h{&eY~4sCH0r}&$W@!U!}?Tttf@?f^=IoT$riQ%iGmN z72e5INcQ-5<+sQzk_i3h^1h^Rz{&&hGjv)b3D29AJt@VCEpU&`9F%xQy4;N<-;i{b zE@NgnuG3FEt+8612=6CALp%_`y|?=Up!tEC!L^@vbJfMw?Qm=YxR0~DL3>y0F|a?7 zAV@VIk?iIlgU^$zWd))fL3=z+eoy?nfYCc-n?)-GWkeqdjkJOX>1>!6dCnE-iqII? z9=sBd6)a@OM=v89L2b34N{?|Sh*OwR(2-T85;J2G91fp|O<|e~28YFqZ@SXBccJm< zZs$hs+K^Z1UB`FmxcWL;Lyu***G@veTi2E>sdrwOW^QO}?nrjDMit(X9xt6BF8BT6 zO`rv$eBVSbX&;Xkd-`~q*}tRLnV-yUOBbZvK{!_#^U#45+jdF627W9VwYIlz2OKLg zR9W-IIXwBEYJL8b?48m0Zeg&)kd& zDFxDf?(WG+@t?#qnG*6>yVVy4@a^t@4q}JPeNO?u!Mj#mi|-Q81AymJcXz;VX6oup zk8~XeywR}{ypQ#Qy~dRiB~k$mHY^OB^M(c2@bS|9*fBvYHC391B|w>E7FLK9z=r~J zGE8uhb48Pge&m&LUXj1G+C@2-9P(Keso4RBRf=|G%$g1-jvXMJA*jy*g#0M0yb zN5JoMPXV8YxXS=dVC0~E6MqiXQgly*^Ty*tuu~E*w@7&h6G@Uw$&G(W657F?doroQ<|S9`Nh{gds|*QHpe?GP?!FPSQfxHF=x1V zfV+9dH$}R*gt?r0DgCPWdLTbDKS_#qaW;Vq=<2GEb+}f)1abXStM&oC9^|j9LsQ|K z06u@})dAYX>jR&&JoCYOsb+kj{R(@J)(<60-mZMi9U^)z3+1+1b58WPv_-U@yI0gv zHe=0bc6YG>>l6Kyy9Z6i+Ly}04f-TmWNE2QZEVQ?1m*9GW*Tzr?BRWC7h&PcX znxUML(akL5-Hn*L7{Vk~&0)sNb}(N5LPjrH>uyjrig|*KWZL?^JCiXE^SkGnV~V)9 zW4CjZtsknf4KdrO`+~o;J+N2mK#Fh46;HZ?U)WAk;tf%R7jnhV+!dLg{5#_I?$V5H zc}Xb3WTzMA=A%npmr}oFeMcTRUMGFeFr&NZA92}9IY=7)2a(DU)dc{zt~G-|-hsD% zGr(yc!URK6`N4gLjPFF{qWpiO8a?1K`8@1iFJW>1>9}?5N#9+X|q|Y$~Pf7 zhRv)`yvwX=J(ss4`iXssFOqp8VO$+*=DAwS{$_gCEMh7oQg`R-?!l*9P7wJ(>1b?OI57+SIM}>vrQLgahO@%q4ea@Z9 zL4|`5tz&ZXs{ATJF6~abmHRu#Z__l}nZ24p z1N5?CO&5Uke*Z;)^Eh7#!1tTy1MolCo)MsZoqI2!-Iy})y;;nCfP1}vT{HDBh4tW4 z`D)!}bSC_VbcXVwa5hgX=@|yWec?3hvGxK|1vM1z*Q^y@5J*G(`t$I6XzPFZh_#}Q zW0AyHU1JQBtXGZEQ|K(Tl#{QyBA}4qXq);aG#yd1)a66?6X7|LoQmntb%exYgFk^W z`rpq|OL133O}cA~XqL-Y-N#jq?s1`2i(HR{&0VK_ffy`7k~7_VnNEY=(5;y=YdAE) z*3;UKY{2=ajKF=NTzJ8_-TkDnt)MFs1@9A;6(oih;2-D1Y z0Bx%~=R9T?ihAj;S$bC>X!ZwePH>=DO z9x#uV4J0-QUK)2x+Tk{MdZ2#6PfdT;blp_we1wOiFhnAShMhqVj^PLKpQ%r0{`MV zod)#!oV_d1UzP25px==eKA_+A9FYI3p|&Z|^OK?v_7*X7jdoEzdQc2a7NDQ4c`?%s zU(q;wo0uf(EYjRoBJX1S9bwyk%3P-Y@D59JX^t@yZe0Ml5xjwW5H9TR|7_K1Zu!UYf%Bd0~G^T2-AaXs%#nud0j%e`Kzc-0}^`|2sn~ zG5J>K?Mt7EweaTU_Dj2qef0Frew^GLyXAhL`Af4(3GC^TTE?G;g}Pf}Y0mfVy8Oa! zj}oiZ&DCxeu*)w3l^<&PFeVw`-^CRT{N(qJx_tbh^i#lN_GjRIyhAJK2{F@*cSZ99 zIduXcW$wEg_xn`(j>3b!lf zvYqc6jMd`l@NEU-8RV<07uL+H2knDB3jv+$9s_WH%0vVHnac-wn==;BSLhmgpZq8O ziztKMDz79Lic0NX`4Bx<^tb)Ed^{--ZnZU)pC&`lLOU#%nUV$TtoNj0Ca$o|S|JHF z+hNE$U0P!Li#o_3Al}F1Leik4*i)tnr(;;Scqns{`+d;+QXZj<>_;=H=7`m(HoAZjuLu);A zoCn2MsZXv%hXHM2TFCUI{|M}El{%JNZzDS-o2=7JtC0AZH~Q7azKBo~;r}!DVQ!?% z?%$WoG6!QP+*{I>Y2lI!?xd74 zi62ECMi?7q`RKa|a8vpF0sn#YwF7vM^|c3du}1)KlzMHT-$VCCK-anJ{O$?NP{8j) z?%MKXMetgbZ9`;bP4kh())1MPJ6kx?DwU0jDnX=y8iFe{ei*Y}lsqKDP>*GgL}oPe zVl8aR?ZD|og=Ms405!`vk@E>Hb+w0kYwBU2Tux|3!?A&ye&czAHg**|oex=CqNByj zoWYPplP&J%u)`yDw~zz$Ucqakp@^|hRU(>s=y%%&tSxP4Y=I2Bm7Yt?XUTK=mUj+A zVlU~I-kYw?*e&}jceE=KyJ+1IsIx+e7$f4`W3!=hL8kR@(-g!ZT?U^ug&>)j*w-kh zZ@x(C_MOj`cMLYj(@ODM_HW`+_mqs=icKQO-8=0|dV7hF zDN1^o#15PfFO>^TyZoyGp6)6&@P`9_9l-m$?<{Da<5K||>AM8z0PkHu)gB1+i*vUE zd>Wi!-XwAfJ%KaWLD-*yg@R4y1njD)ji9*^!|uW(Ae%7)`;*rT78uL1`|5mtUy}^e z>kmg=CF@~AbJOVN6iXay{Gy>F6=*$2C`J<#1t0A>tRAe^NEiC6p#9qJ$a;EJQxESq zVWwRTeNpv8Hrvjx3Td(u(b$@aZ&7Tt#F7&3Bv53j`M0Qv&TC8~$rQS)uY=ny`Gel> z-OXsR;m&rxd5i_~&_CRLT=zt$=_vOO$8*sdi`Wq!$cfJ~rdgL#!vqS1C!R`OLC=Y~ zo_30(1&gs$9#~OXAQz8xugGkkpDhk|7iA2~lcP~gyL47=5E{+!)1G8KM<+YSCg)_L zXs&Z;LTR!e5jsLdo$WDIT!2^8>T>|+H2*4q8_RzVP|Rlp`ilAL_}@Ks^K^%2C-~kV zcRuKcb9R({+1Lb=C>@XhsfQ&6&cP0a_hMP$q0yvZBi1B*t1=m8qv=slIVso!%?_U% z-U8jH|EO6Vy%{Yx-iR2bu7+okJYJ|a8yanKNV^)BLMar3z0vRGvW+ydG^iT7Xq*Kv zjv5O2jVZ`$6$@%eofrK=By(QiHvGN7KQm~SJ zJvbctAw*R{L0beabcUvaZ2-Q|zh%_YKqV+Yhar*Y&Vl|}u1&}z=K!C;^$pH&nmv~t z4B~h2-5cp(_!9ld*&|S&e!IO%AolkZSabh}oWfWhK~=lx!khel2A=I;!6VKj;wI5Q z|3oF1Jgs?_d#=g;jhl!jIq{m8+?}R;#SKjn+{fPa|C~?h>3IkIhBW37pvBJNz+b!M zhy;FgXXkOiqyIWz6{w2{{J(!Z3%K1U7;J&0g*F!yZK=RQt!Yp*%e_E;x(MC_lMTbH zr#QEamEs+i$9#_w7RfEUq1MJ=QFqJ#%8A7i)FGkE9kgh!W*V=AUV;v*yw7LTnP`FP zCb!t$7!_)I^1ZfFw6o?r+|jlOxnCIzh1>pD&L=ybGpf)_i{YX6NBNU% zy`cHlZF%>spSew~YjbbghHx%gc4UXs-y#_6L`8&SAxmr@pXU8P`zao6L6cg!PgMuO zykwV7*r1l5seRqJmWq`u5br!Mtf8`&Pv#u?uf3g?fourB#Nzf{;t>vEY&-i^l&0^; zRNFov6?9e1OnYl#6WSKj&i(~HX73pjXKyJm+y0V2vTa4K*<|vDwsOIEt4co5Hi-AR z@}7Xh3=?_uLNUpd2?H4bP#F^`WNY(6P7!)S_XW*!E*1U6 zd4W8Rslwx`8N#7-tn{VRV@`u>sFh4TYF`A)+=5{lvpDfo2J<^!&DoAfTn~vhoOEo9 zQ>vLCF;{leahT$><>0xa?N($tdY+uec#W1LNQ1w58V5a0AzwnD>rz^i^Rk zZjFAj?=?(WWF3k!?8z4YV0`?&YbA35_yPSf9fIdje@=a@%={$0=fBQL~G<}-*J ztBi#peyK^P|A<@Qvo@vlIKxMOag38mtW{7OTTkg~^Jln)9hJpfQ-rCu71HjOY`B&U zlQyts342(3OZesiFkw?mFWA0_7FZyOmkH7IQC^0IvlG|!S2hg#(YrNc!`DMG?4sh^ z8+bwP)77I^Ng%yrL-cP-uXwv-yK-yEg5cj+2R&7JkuHu+8%8R%&}3T!NuITfH4SP) zx*VS^i$%w=zV>`eEzx}Z564wABUnme_GwIs;0QU#UXL*ew^Adl9fRIws%(k%*YbW! zRJNO`(hm@np<%8U1zFh$7UBM_U}aXGm~oDmmu7ZG8*p3m$7WO@Pubyl8R@HoHTurw zJW81kwPUqeLz9N0InI9R&xkLOggqx+Yp%&A1N%FM?GL2XF&)Guqa2@sr2dt+0JA58 zc4u2E;D6Y<3%tLb^+!B84r*`b$>!1hgFdZ6*21hpUfE~J?B?yz1bc7UR>lVpuy>c; zHeZM0>@8(`&Bx(uwosYSvQ7NE?TR$SlEm+1&63Vz1~N_Jd%=s?e#Q@_E_9@Gv!SwN z8FY)yH6AWDB8%8m(_i(bB0bo{+M8wBVuFp)pDdq=baYHnZ&atCYaFNa;Wc-|k8HiA z#qn)a4%v>tCn(x>D_FhLDp_P}Vl_cKr0uMW%vI2s z;CHOUsG;ey_NHH%1<+FD7Pm=Wk$WVVExxC`c5W#4h2!$maxS6@?nYkE><7qcXRq9w znca{w=iTgg>C2Ik&XbwFQX61HoHx>n6RO}&>}*+oZHDv5I6cm_MXUSuFU}kw3FjX` zZfBbU*_W*iq?A1a`0jGJfShJe0db)gdSm0HN3=7=UxRf?uNrMIZ2wDIVCo4^x65R) zbT0p+HCO62?0_MA16eUGf^u!Mq+{qwa66k*I+Zyk>|(7U&7{*Th5ROP5!=Hoje~<@ z24Ut!vHt{pryb15nA_s!Y(4W+UeJ%Tf2RvWAmonYvgyxKg?NX3ps__cg50oInCy{3 z|IhY8VqUe!@j)z;n3*(IjBY1STgE%Sh;NV;)=Wn{(u|_%Yqn&#NV3X&*_MMIm*mmU zt)Jmqva!bNL916&=B$uew!j5QOKwsAynGz{%1QE}{5Uj>Ynm6GHw1m)EXaMAlMMgH z-U{xcUx|>;OIhJrosjM9=#0wrw!!(7<*Cb(Uk87SwPiWtTy8Aj74I4fIP$qcKt^)k zf&8644>-|!8yu}6XAv9rPF--r@yQIe6djJT2AF6pRV2S2f`lf16D23c)x zNwDNHWU)Pv=yhYE99y~Mmf=;EKpO&HuI5~ z8%REjT1Lle#9JM&&C?@>1oJKaZZ^lQ7k{u1V18Np8$886hVEUFij1_!n<^?BptbDB z=!X%bM7yl*sVC4HcB?p+Tt-JbMQBT0XVI{=(3SWFb2$4LjVHG;wBsn!A($6-q5Z13 zGj&|Q$5w@+lGf#0ta;-3l1TAH>m>1caiLR_TP6RF$~ZK)y?iD*&N(utEZ>M!vC3>y z-lZVd)mh=WA;?PhT*i{@ZAdg5nf^6Hiw(W z6;>bRgnIM0S$O37_&Xxpx`v!t`kY^7?nu@tSq)9H3?N%;KJ))(nv$p0tu0UDCy1um ziY(1yO>m5Tg?T$a8ER-7Z21`9Ufj-BH<-caEL37W&HNov25+{CnVPWz=#`}_jZ{8^ z3$0nE4eLsT@5~&U2TfwTAdf`->F&-V^ssO$-GaR#=EZHYu4n6@AK)_MVn=XAE3(Q! zIR+!OusV?oZQJ2t_<87&H4kwTBwEut2~LNvIP$aqDtI7X#_rFWR*(hfIqqi;l6#TH zj%OK_`3=PF?8k%q=q<=b`|7kAIl&C-w$v0TtG~E|y-s4kG%Ym5))R;E7u+7eIm*2e za0}(G0z15(>kW98I)CJkZ^V^>cF4cx!H+vfg7`TVw~K4@s% z0yE7YE7Y1z!P>b(!A0f^{ddg$;8@5+hK(x~WHTq3N%2X7+w>JWAu>%cp6+8DR=P*9 z(9~7;Ufo2PWNcvkeZ5!o+0<1}#gAdf!Xub7)_>U5;(^Q{+ZMK^cmiE!O=t7O_YI%v zZjL;0vEeTRW4|I^8_cO4Vrwie4_2wZZRrR94mTk>SRgng7}GCHi&S(KW>}x5E-oAa zC0hrkPAr%&nrtag=_a2e++|*poSffG;5A=QY?eDazMFZzEH*nubb}d3)JiYn&ob{Q zE5zj7ZE#;Z$(;clIp+_%D|AYLz3{Pz!Rt5KA9dQEvJkiqan54EcR8yE@2l~zqayD9 z+99Uh$d)K&>2||cI5s9n-CQphw_Vmn-CoySd}GluQH z0j0V6KP&!WHr_AT9CKHhsH>7U;MY`l)h^E8 z5dT$mSL@I19aFXLiD7W|l2v~-@-ltWf6@U?yW4HC)h8#drNCe7X4Qc9IO|6s9aa>K zH)q;90KX1(KtTSto`J@8*asOSx~c7jt7Kiprz?+OZfPZE2;YO9p`7Bq~ zaJ|D0`2UOJ`sjv4ilLEOje4!}ee802P{n5T$Qr*}-)xYVtgkuOIx?zX zWi2hwvMjuRS&Sji^gVKQ`7^yO>c79wUsY#>8^!6G9aTA%r$xu2zXpOMxzNF=KmG5R zFT$y7zj|vh$#FH}8@gG;CuQ^a71nt*R;mpkCi}N8MU5I8gL!gC7bW`!5`=rM!sy_4k8nHzWTiS2%(?AHK=DX@k}&!Rdz}E%5WR& zk}wcmr8|o4mi>Z_2+pjokzB@BssBLv)D>jahT$-aIU#{6N_a~cEu5zPC4RNOVpXzE z89f-k$r$wLx-m%8;0#N@@_I;~dAV9rc?>GFj@r;weMOjR{a$vybZGf;CNaLbdbxgw zQ5ZW-DKsK6pJJDnPtlBr#lGq45dQuRt*W-6jWqXS?p5tDALJXN23FxVOwcUuyWeAb zSFb+5uWzx{S%Nndx=%5m)%*B%>nKxa%^4m>W{OU#u7tmkEvOn<^nxf%s8v;~s6A04 z-Rxhc*g_qUbn#6nJSXvz%{?l)gK9zzaP`Uym6(V;c4k%+>Huaj;xe722L8;f_r~f! zne8ABdBpsv&mC^T!L@vD(Str#Os|Qk=9tS|0sUG+FJDsKcG0cD^M~tf2XUdtU>M$A#)M>|RHo!tB^zJAqNe(~V7Y66Ia2*RrqUnDeu(`PMFpC3wV?wM zk%0(qXk3P9t8apHbJ;sygg2dStPJoc24@3g zASEo3WFWT_8|}k6qs8hf!K=AVc9j8nmNSC;Td8vvu)hL!0@qKmYt8^rZ$ss2!(tZYMsu#1#)G~MwI_Dzj6x)^M({a$Qm?Gm)u z-W}?pH^QOzqr8=x+oH+VF2ZfvKvZ8Qz%SRdSz<6;j@7C+$A*O5cXVTYhMl6h-e&GV zd_zI3pYmYwr-e4(P4}_TbAl4@Iyb3I5qjNx?!9`5V5-yNsHa`W+hATu*ROmN^$o2F zJIZc1Dv<363@Oad>z5#{8d&%wcb%+Bz+C|4ZkBfTm&o5|*Od~!U-PwDGD$DbtDM-3 zzbJuwXJ*rsaB7KjL^4KhB380HYzWJG+kia$wS09Y)x2MLO2GPplkVPNobfOiVr5!@H&sGjRQ_+xmIsyS~axri*Ocp^-rYEZh^aOfM^pXwL) zm3J2Z2fwSF2lv7!;pFYA`*qwr)$ z3_nb-Knv_9K{NdhL}iZ%avcKKvcKZZ4z9&tW8E%TuUi8-EgHdS-R&6M^o?g#w-UtY z2Qw<}4Sht6yIXpN(O;qdo(SJ6l@_|=x#MlFISOBJop(26>cW+-R_;wIF7A?}4ZBg> zf!~wPWlpNJ4PmsN_;x(5oFU!lUngH6M`SPk%jLb~@zO;9mwZRQO)|*WJ>QczI#}Oh zdafpCGWC!9VfMh-4Zjk4iY(6+?j&nVKZSM@ zHX&mr>PB^8IdO_SR4Y+51``lX*3yDO;sIzYbtu1u=ar6hHg-VEe|f$YlTy->qND5ulQpvna~H_tN6O+;rv%R2ajjU z6~0xEhTdwHs|LE8F-?%mY$tzL=o7rvb=QvzI>Z0ChWd@_B6zB6kne-03ADipdo0T0 zsDt(gPIZ}aT^N1GEDisv+J}UoeE!YK(bN;~z`X8-#gZJ~FL|kjx2S2}Q@OngqNq8Z zKXWj-kUHhQna$;i$PF%0)~oF6!JNva>4(yTm5tckWRi5E2kog)n41f%l~woCx>Y-X z6bH@$-h6*5;9cnb1p4>e~1tiKzbi zh#5qLY;zbMKaDU;+3+TU<+z3_Dm^A-&_c3}$}U)hv_M}~xFUtZt?@IdIu;xh~6ivZJsaQV}f}vX|otJPKe#doP%t-Te0sMJ-kOhkoSVw3a!#91=r|f z!cMwVLWSuduUn;$U!d=Ro%M8q2EgYma{}3Tr061hG7ux24`(?m0#SSwggWK^PTIbL zNOpubG4x!_ZEL(ME=sLRF+H<%G zS(^%DiDlfB%)SK^&=lv)3`hQM>>N8ZJu-JJy2SA*<#EOd^7mX1DO`1(q@TzQ!V2= z8p=>8LDit5OpK3As0_D8?ZHpT(!=}5_^=C->uWv>s?bX6N!e3g6L>r>P-=tg>we>B zsNXg$Y`904%$sP6TU^8NSIjUPTT^5VW__d=l+DnuM*5n{%Z0kZ=rY5|vK#u<@FOju z+++ACnxeZGxy!Uos8^A~w}!p3jn(UeJJQae1^z|o2&g`~w~8+dReiU#-8c}Z`G@Rf zRkuW~pog~XK-S8SQGeLVeY<07sc)Nc_o4NT%5x3-Em@k*`r1$u`72E7+QWk^hsohZ zkD%V>!P3vcbziC04vCW#d~pXWlcXp-3lFnek_O1nK&fVF(&OCaa09b6ab@Nw!3MKC zp#d6F@4WT{a@se$>MG!zQ}q{+PyFeCv%~j0=*M=?1R&+EGk|ZfDl_0Z2d7ol*JZfS z0{oTg^Xg-1Xh<**#BJH?h=ma~v1_u^YS5q2tcbgTRA?`%YXsNmV;d9#^e=e=( z|6zUZC5+Mr+vsPm9qMsvTzlB^N8}LTyZ)p{L8y78);pqTQAKa8sp~hz_4+1Q$qp+l zk9-QrZENIfV>&_i>9%>Hl}T`|xOQ1w#Rtg6uMd9vKk2El$oGS11J6vf`uRbwALDX_ z^GAN--|T$AVvXqwm}__-8Ui@~tfTteZWu>|QD%I(K7p)HJtv;2h7$dW7I>}7!*~zu zAzoG42p=FuvEk~MXcTl(tgCE{{H2};VxymReKRPd?unaQ*O+3WWJ5=Ai_LWZ;+u_PRNMc1zNyB^z)+?P*;{reFq5tjt3!B! z*OpmOL3yEHVd(%l%6fV07_<1w+Ocj^=-lFW^`q_i=zIMSU+UlACm5&f!moOo6`l2% z(W~4DMFaO+@j%VpU>qLbX z0&XI47Vw9c!b>ZvUz#m02eJ*^6UayKQV`=bKo9>%-_fZCM>i(7@VA+|;HM>#*lJxg zmMUwGp_;GgV@WtsPnCqCR5@0sA`xvs1S@^3H$if&mS~->JDeH$D(>a*{PzIoxQXh@5&|vRx@cHM9sfti zcyS-qd(Rk~2I46{aIKj3G0yOM)+UjAgB!f=k&)sd%HQL>5=EeSkxh0>A`8?m+AFz1 zLHdT;kafy74^c#7qDWD(ia&F01ON0DzhI6F@Nj>ux1Oic>>=Met74ONwW*KJ`l2;j0r}ZENAN-uLY{TD6pYnigx}d+ zYcJb7_7XHQCRmlh)e>)6vC`Yu9fu82 z9`)wB16YFcygT2;q8n6J*M6rSeXcoSQ#(}ffR!b2`^<}>2vw0(rYja5)>KHM1AP?} zvQ*Mlfgy_WOq*o9-&*(}BVF>|S6VPNy$?0pTTebVHAHgOQq-CH(;t>ZSKvnv}hTZ5I!NzEVlKei~8)(({M zm{9bJCQG97^9mc}A=0mYq)?wbN;1Shy{E$fsA29wX_pzA+~|@^ZgIJu>%dko@st67Lg$VF?XrKZ+po)=2HXo+A-MnT zv9W+ZOqT)fBMldU-CitaY*kV(BMsWrP}xJ>e7L>ko75gHhi{luWXE}8G0zf^)Hf*L zVx~y4N!w94gWgFFrtb*O(&zA1^e@n2#({NaSY(+#mR!#*z+ag9kW;zl7|-~a2;+R% zY~wZJj&meBSvMLR=Nyi$4c6P^IkV6*-B+w5drvIUXJYLfJn?qTF7&+ZyF})u4Up)W z8TRdjKSW2c-F!!dmwA-4*k?zYmyWQ?J?^+!OJ`ceo@gvm&BZq1rlWneAIQND3GUPD zW!dJJXjA=Ha)_^|JXda~9{Re-zvo9#*Sx3m+vXFL(c32fQ|@Nsk$Yio!<@}zXHQm6 zNoFQF(7h{jNa|#=w!2+gJM{zN8#hdL!}ZZC0scghPXywU5brv`JJvG|@LuVP1AfL} z?#DWf$!rwhKG?bi@Lp^l31mIQW^E-&W*$QgtXrf*RP|x2rL$~}@B-A)TwgX^*c9$) zhNTJXmWz5ZxCBsYo z*W<@n6G78nYz5nrxMl2tC9}ta)pI%2=WtS-8}zNq#u8!?Y;jN(zQ{cW1hb$5+AR%o%4yY1?oHIm!4AWf@WTPZTD*8wtg7- zE1OJujAkir{uA4)e?b&`a`QeFj3Z^e^@TWX& z0e7d%1bFkD24G)W*f7BRh~*;a=kj4DU--GL0d!u9Y6QE(1 zSyXLrjPe7NvtfAPBUT)1u?`A66Bh7C+6D#=Bl;+>HOcRXUsOoVr@V(SwKiMJb05ba z==c~#UPLve)#(p*&Bgddk<1gx8<3iD=xT}U`Xm<@0bw`(u%w`%8H-ld7X~TOW z%Dh#0P_GVh|C^s`tV8-}qo9vrB~fl#BmC76h95U{31)46gUry6;D0pf;RubKkJ3Bg z@tWa+;f7Xxm+#w(TF_GdzN$n?)7pB=v#JU_EY@plR<#xx75~Qi+20jDU3bA*xURuVP)ne(JjU#%c(pNCos+yzVl`W`T)*IKm#P? zzXSMA@ESos{_2hfd>gt>gMM6(y$tL`&xnn{KWWFj1mj7;TPZm9Rh*0xp#>7SvRl-v^-Xn1A8hLM9$_X3YdDGHbjDZ z^v`-!)-QoI<#EDF+sA+-Y*>7XBQ0>$G$p3LqnSU>5YApRi}L2eM8fKALnayt|&TyB0$sGz?ipP4OqxF8(<)p7(c%E6O9?%^f>qcb3Sx#rBVpAJ;Z=ZnO5S zw{XKV$5azi(l$bCS)(p3pH%-p^aSISVemE1uUH$b0#?XADcs2JfS%Y_6(q5Tgtu+5 z9A-}lEw+AncOC16<86zxU5=K)Ir>Ry1K9u26Ks4C%v@Xj+*Ig?{|pJghg7#W3yK<4 z%eev`@Rtp|;SHR;f%rXOQ#Qzn2LjTSC1t!t==0iwW`3I=k`t89QXf61v^4XY~ zI|W5o48Z>6@?hhJ8|Yu$0!Y8^9=e=cCPd1nVzC@0*tu>dR>wJ`w8`2L7@s{56}PS? z9>V?w8MzRoL#3D7zzu>U)X%u(u7AY+)wr|2%LgB;46~2o=EF_Yb1c)He~OD$jkRJn zQhcbg3)VJRN#<8ojBK)%MSiJF!a}@W#kAy(=pN5>#la*B-R?eGs81Y))OF7+*dd#O z!me=nS+Y5byC&sr2;Yca=B(L+t=G_fT>W$zn~HaFZ6!HwI(-jtBk7jlHzzjg!>YOY zE7t+;yDM~Hzt8x3%hp#ve>DCShzFIza=`hDSP5PqKz-*Tl2cfz_sHGTjOIiw+Vx*1e>BBL5N)=k#iM$ zh)S*@vO+nYD07+;9IjgMeQj#6KHyI57u^!_xqB#3377-F@(Ky+}I3 z{Wo@9vp7NF3MC431&KSIhX_PpkTjOuSebdR9o_0eRpdlvP#?gaju`x*IGGlgg!te@%9d?tQzwm{VTKoJ>VBFtK8-^|-QsLx;u5r>yH-XI^Fnli zD=XQ_6*{AVojuHc1-#EVwt#ky{Q>CD<<)K0tx$NZ5 zTy3hHOGqBhwF%Z5v?N`1?jV!&0ep_@Q*eDy8@#rA9_7_P$A-DeB!l$(@#C(33K&v%PEx?=K2uR zJNk-il^#iEp}n}LNhMCw6#?#VIj#%9fABelKyGD!)brTm__2?Tu$e$VzGs~e?DQW- z4Dg*{JO=nbAO>=QX-mT+Y>#uagfnbMXFAIzazhPlpff|lH!Q@wEJJqCzr)Je;|X)Pfu?2Zx3agM z2~ZRLJ*n243*Xb%k!|yaVj~QkEW$eq|87i3nCF>BDh!_!Zo5MzcTHCl!`!{3b4`nr z&N`h`v0*a&*h%MR6&w)O(eYyf?Y*fO8JFAJ}Wu83OFd6~{(k zPcGTo0^Tppe*n&>m{`DhD3;EOlWsUqU|Lp~+}k=&-2A+YUlYCczK zI=#9M+1SfhCF`}=63=puO}6rP~xbui)4+f4e>$WPd38U zPCA87NO-|!O6nSy3X>eJ;QUFB@RL0`Yk1){{v7)snW+UWM5FEBG79AVh3jpf)8FTH z4!>`ElBUjSDqLk-ma;!{JAaSuS>ltV5dLA?OmZQs@Pq)rZH6Znt+oTL-JO6xH^fyR zaR2I*1I}*t_R8wlzd5FY{#<1p0PKm|d>n8#3fIyrB@G>{NNG+9oey=k43rIIZwX5*Q)CJ@m^q0#AfX-gseEI*_||l? zERkL)Gz7<_N{knHyO}qVD+VSQV`7r_`ggn}`abnsf02KYZcD+2Uq#o0wP9!L|KXoE zwj(1ATLlO77wExUOKabV;dC3HML$qE*3!>sqwA`C7OmG{RH%D1qdi+RF}g_OA@>|e zqe+e8T)*OK-7NHp6O}NAO<2vK-(=Mtjp)Ppl3faE{CDPJ@-PJ=Xu`ZpRux`~G}8-{ za|^7oX4AT)UHNSzThRUlSMG%{6Fo?}EvpgloGAofk~}dKGWBOr_LQd~TFq~g=g0oc zY3@US`vO-a;GD>n@~dALI~9QUNcJRH^E1=t2mN}0{W#!W{hsOrQs<#B<3YWuSy(^1EA-U*Tfvl)OgP>eCSMgA!oOi@miMu& zDLmKOCwr2568zP6=Kt+aY3iy8><8pD0lrDB6pV*j9D{)!;Wrwhz$$VUmk2y4)d$wdh>V5RXTxkna`oHYDRoREG;`WYYN_ej5RyKX2d$6gDX z8hVRki$4Qj@@HLJjJuSbg(vXqsxNAHxt!O6AFoYS5{y1JMBPxA%^Zbvr4goW#%p|U z)F6|{NC+N99iSV7@BXu%uN(JM$Dpa`taIDhiyC*=8x~)hz@kr^ipxWZN592 z+8RrPhHjhThNdGwni;ZkvEet+xBjh15!~-Uh4?2GS$#|KfcrOv!QBqK!!0j_U42oM zt&ksJqfm!AIfI1G+*yr+b0e`rmqjCnu=grt0=X{71et7#jlYf)m-d zr26@;!XG&WmV}3{s%}Tb%mTct&#MoP-iSg}f8;B32EQds76&U9kaWU!EY8%6j86E3 zebFS7MzMZ!%g%Aau8ml&qH79GNC3k1ihpGT0MZ-UfO`1Bpg7u-mnel z!NW8udLdDR5vwli{peZqYW@y&SK&O%OTiKiKdd+NK=_ZQhiQ_>Ms_A}U9p4GO7jBC6rm(1k@}|<4krJk zP_Id@mRu*}-A(gEve9G?TR&^HED7&t5GPn=_lYsOyS{VeGSfBi8);{*33v*b*tg!H`#_fYdD2H#~b6g{v(mbXIx22TP6*8yA>-~FdXH6Gi#+zcT z&A^bKYi68BL-1)!mj+T}i71;qhSt|j77R@A2iJYA&779-wQ8~AW=4rjP$g2lP46p9 z4BRbHq$fzD{e|+|sU4*6JzsLCrzj=S?$oT4NlmCZEI(O4OxGzlOBi$H!AdjuB6e8bBq>wxE-u-;tZ8C&kP7Bd}aaGw4@w&Dcd$8vhc%!G?c`xfQR3 zDrO4yrB?mYDU1wBGGr<})N$B)311mQu~otWtB%qa#dEc&o*^$fY6h!Xs>o*S5LClBNZPRg3uk^I?>cg^B}^?c zl0ArgWB$a~+4qa5nJ?pCY}=t7%yV=bqpo>|u8B1Z5_?gV3$pe38<*sd=O?mI40S=0~WenW2)Ns-HVVMI6Y zyWEk5J;=x2usmsDCvvsdk=v&rhP>suo+Fk|#&bR2v&ZGVz}mRIS#)*}+|ThcTBk?h zxN~5N0&9((bX+8-xznoZ$*TM3gsMM*92U@k@%~Q!QotSa<^b-|?pJ_&ymJBI?y%Md zydPNR1KtUUH~8znNREPf80_c+*&*njHUpO>M2fe^NUdvocgV0mOg9g)B25}Ib>H} zO4(z04!0$9TCg4-%NaArE2`iH+}zCjg>I;jLo-Jd%n`M9PRQ`*>w^0Sccfp;NrUs) zsIZ#(K4Q$Uz@xj90oa6YmruhPbJs1{rG*bBTO%Ny7nBFVciaoXSR^FEEwE~ zZbUUVABx{^@{;*xW&CBj0r9taOR$Qr6C;?d(e-EoZb63$`qR0}Qq!Qg9{OYCTfbP6 z0MS@^aNQSPX*Fv%nuFU7|F(Uo`ikzZyk?&qaKSIN59|d#rr|!F!hVIDsM@UQU>#u! z*Y?-uN4%q+h==Q%8XcO~+DSzZ4J{b8?2O{8_Am1t*)+vyO%01Av2EckZMr2U=~sDA zbqmYxq}{px=+2h(Bv~e0-rL+VF^weE{ZvwFnZNnQ&4BOAKmm}Eff&GfudfhrZsO?( z_*OdS1HO$d#i0MTBz6P;V-NWw&rdb$>SLqYr{0N9O_&_rGJY~LGa)hZyugE9mUSzK z#9PIB>E8G(VXF8v6~jL%{3tBJ+1RUsw)_)7*AERp9x?n+CRLd6EdcH4@;!MH(&!?yOm#_@ck$~wR`w4%(=m8oay8vD%fUwRZ)W)U^aH@PT{ zCh#`y#fp~3IJ6B{URckVg$#7qeCkS*ryJlOCzbW2bpi!#hY`k<|i|D~r!oc|8s z8Rhvg|7~*pm=7#xI{~h9EVY3h{*0aiOeRr3_O1N4o~GuVWQnY{z8e!kzL#w=Na=?} zk<3%MmFANhB#$*|COvK-Q#1$kJJCpNnU*q~LZ_?GsQz0|y74GH>S&0sM}ZYH%^ld z)uhA}SG^(cS8NR*87L)Zt1Bxu`yz=!!KizH`x|n#azUeOw$I`MP0Qu~p(hxpL=#Tm zxS}kd7X9p=rMTd3f(qOd3ZJ?eqFNqKVs9fn(x?tbSylaUV&k< ztJ)OPSRz!mHRhY?F;O9{%R6p7LPSuPphd>DL`zH|iZI3#*HzD8zVQ`ymsZ0q^>%!u zRRkZ?ij+^ON%o-?P0Qn`1NuM9HmJr>8fMLUQk_bjW7bsMD$OER({a51>lDGY1!OQ! z^jtBeUm|P~%w=v8ro`tKCn|djZ+bKF=6WQ4X&_2M)4QSks`|vNVC9}`f%B+MH$t$> z9|ITYzVLnCHqaq`NW?o%9#*}I!^~W%9Ix5cpaLI`V%mYlwPmBK78I>BuaIsEd{DI0 z@0274)+#2LJ=9QtY2g>eO|uMMU&uXS@50LC}An2!U$dA9Kz$YU@b zy=QuXbwYcHcEOThZMjoC3h7UE#Y1@gv1oD)-ac*{8jYR8?^JBXw^UriTWKi#7X1}Z z(q|IOtXh0q-sxVoNIwy*vI;Tyyb{Qt9j0~Zv*kj6zdAOx*cJi2UW{_^N+k6 zY4nfy@Rb1v;~y~D(GF9e#XIoT%qg-q)gDbY$|(c+9o?>FiF0Haaz2`ehEbW~5j<~Y z1!)l_L0y?F@>6mlcdT0}`Reajn4bHqv^X%husEk!k{-BGurRx$WS{??d{JhCWT5{}esX%D!&*Z1k|g1MEm7oU2}O|B zPxwCa8yYaYF5XB<(c#9G`aE&~0_*=aKP7SzgQ2x$Ei{CPPsYy;+G@HqzUa~LwO8PvxoUNI> z!+RZ>E80zt@z)^#j?)=h`IGQuK|_nv_Z;uWQwr*Ocfe(AgS0dsBKvU}NOS86 z%Ew(q>RR_ur<}Kt4wf_29p@QXXz@_fogE;lxgV9_jD>G75!4oT1Y|XzBiFL~1q2;M zX0m;frT#~FOHt#5?STu_H$fG7FL0c+3hv@~AdJvQuElfw;RL#(X)umkB3`ZRCVkA6 zLxkF!u-m?z-%0a(l8qS%P0_C*4h>bGG4c-J`RA%_NAqZhPj_M1&}C4^Nl4n+12!yOJqC;}-(|ZKJ;v@aN|LYafu^ zQwIExy6!cA_coRf;*);X$AEWJaSOnEtT-0flc#8?eLS@n?}NtLCXj<=nc_xPn(QV! zFJ59%5$l6~^J_*-43vaI$+Q9PLj5NCWXu;d!b=6KbWZ&}^dpo=Up7!;A5z1z79Y#D zN6W0=@fvI}CAYN}an-&>ywWm(xEYN9`kG(htL^_l9n3L=(tZYFm>0O%eoi!p>5FZ& zZRby>lQEC&ZPI4{Y055iB;2h!D}Bp%Ns~ABl$zsnB(ti#lrpw6_1&LC4yfov#rVEq zDHYp-^TyB7JbiE3Li;CSrgmGx3KK27t4l=ae z{dYjWc6xUM&MLPOaPH-t2RJ`8PY0Ya?8kn45mg6p-ch$7vw`?Zy7bCyEs(XTO<)}V9zC_y# zm0C{0w6S6QUb7N~%z2`x%nc-)?h4Ok%xDFTh+5J-G=*-%YiC5zoAeM-g7J&^6#a?c z!O%f`hW_eZtFvjT;79RwRDUw}z~-$dh7oJ2sSB%90+Xi=q%~SQ3xjU#q|rE?pTA zR!s$bI|odlUw80t1AK>jX9B(*+;M>KXx0h(?-u=!{<}v~3dW~rOZx)B!P1WyLN`fo<^Yn|t@1lfctd73{Le~<5HJ)XU#goO)bQ8lq!5wu! zKK*}>96y2HR%*v7zRWO1xD@Rs8mkvZhhxfERR2dTf(9!yDkns#;3mrW(6HjEqEOYi zCD+0#!9Dr^v;^063x{tEkp;9b_>DHslH_R*8;4d+BVk>kDK#*J*sb29&-P8m9_vPG zIhS7CPoEb%n)xW+3Vhg~^eFx?kz}NAYEc84hxKvKQ~ain!B}o`VRJ(OJ6~ZUkAYTOK^vH^%MWN{s3`FPiHZ>-_5b@1^2sS zaa+KC<2K~@3h=@IdKjX7BRxg8A>J9IWOphQNUGtZbe(Z#FcV-S*%{Ll@op0%olox< zN*R@;r=g=VpGlYYF<%Eh`p>Fr>Mjb7A_8ZL+QT;@M;vFA`uJEx#VS>+1qYEDtf1bW zc%!(7eL>tZ{u^;y3nYBVJ0P|(KkKMI9});5T)O;<&4Jm(TlL?{)Ic1*TsNThG`}Ud zC;FwTtItpVrk9k8JvFHtT9tAJ_e%0vAN`;Io1#XImP8|OQ83_|N#wgnD0;f|SW8#y z!u8G=!oyX{SF?%4D`!>SIQu4iGmB*Ntr6s8=gg$BVD9AS?=%6LvZ1=&T2L3vlYEMt zzNETcy5R+=;i+AhQ@6UUE6)S-0DR4{lIr&V9sPlGdVt!etQ*5& znbb*9Bf|__ON!B+%v>ys{0m)T$v~dtOE8gjB;*qxCpuXF)~v*5k$lJB@C5ywNCBSa zd90}wxda!x$7$&-X1-oTKe{ zvA49asihRJ;e94QYkfsnJw^F^yNIMbkvX*;(@DGgW9lp0l>Z^?s{`A%y1vt-kTm2N zC0nv($6;m%x^k0t?FwsGX2zAfa*9dAX33V!AXA_WD>F00%G?#!t+2x9+&+81J@2bO z`qR0(x>0}k`0CuNbI*}>_uG?!u7#?>fZvIl-C(`}hdcoOM=Ex3RWpbF)V_dEG13|I zv4VdGj29NP8t7n8v^$tHCnrgK!{Y11gOY;09mHd#=M%F$-}!R~uS*Pd4~A|cow?vP1l;O%jvxYoOb3dG-FNxr4z zEp5JdhA*2+(hL?a_Dv_(YFHA3uaeZNuZlgsE5r)T0SVz7tI+9p`+WtZDRF|mH1SVm^Y$JcMe`cwDfy7)>Fua1|v%UddZPb!nPdT>Dq6_j$@HH_0o z2c=GN@Ki4eB<-GUHqlA{N*`KZQgkJ~9TRF8T+}gb7EfP)yl`VmJXBJDt{^vY7aUNp z&KE@oimv%O$S7+uw%vC%hv~kL)%e_*8ZRaM-CLZ>s82Rk0RB1|HUJD#)dHU1@OJ5% zd3FeU0?fsx8cw&@I;svZR)SqI~ z1FN$P7ch=@u&xi)UOd2inS8DvFW%+#k%826@lmguI;ZO|5&KS12k`<)o{vdM^f$%D zzP?n9?rii(-=XwJjSpgWQYX_EHHF45p{i0xHz{Iv8Y0tJO=f8cwIof`SROr#Leqye zl#3In>hz>~f8-+SP5Kru6S+zJkn!4cSX4vaHVVAHg04Az3{SiV3$)oZwbR?9AU+Et zS9mM(12Y(SwRek*nbMA&;9Zr+lU!6S^Va3~+y|KD-gQ}f>SL81ygSo(H2!2;4){B4 zT?=>~W8?vS)iBcmpBBss(4S-u@VQ^g1!ImZZicCu-wAPp0REZCXe>|b>9!=rG%`|o z_GL-(hG8k4Y=@G5YKTwnM8+qrub-ZL&t^*+U;k@-kf?pq9^aR^DyUadN8fhIUh$ua zQs1+fiV!2lH8I7jXb}=>S}i_F@8Xa5`$0T*oh_ejyeLj~H}bC;DkW_^J4q9@SQ6){ z)@2ydqyO@l4PQu+gzfF4zempY``uCLhnl4EzZ+(x|FM2pywMPxPOq28RU0Mg2N3S;x zaP5$7%-d%uaZQu`l&dlpyLd7~cAV)NP3Hk%M-Hnao0{)j*Tdq#Hv{5oQa0IyN;Q2@V>-wW`0 ze2a!xClK`yldH{fi8JbdPpYK8Bs}-EOB}-yCR%(S z<2Ug>B*gnV#r!I2Nch96jpv&BMVFWz;%Tla_rWA20tt3tvBE@&;EUM19OWfNPu6j$wi8EarQZF?EjrR?a`@NlgeGzGQfZ2ySsz;-4ApL7^m0SN`PM9Ax8k7 z{juADUbpo7_BGe<7>@(qz47-=&GPD)6W*1n2G7e_*mp3+=)4$v*}E*|y(2U3y7y7C z*cKQ^c;_VN*}BBd@oq}$XikXh=rtyaEah>0@1FQf!W66a>`iE}_K!)j2(d;|AZ=-V zBAl(CApL6biDHe7;%#OdCNW*Y4x2MXN6l8jTT_;}#vjk|s)@kn+xBWROnF#}EuLL# z+=F>+om3OqgFU&``rGm4 z23g93#^2&)hUC;+4cp>1hEu7V>*vSMH>@P%P4W!1h$O$57iK&tG*CXHCW9`(4cX>S z8O8Z5>b%jLUX}OG(8m8;S)461=uAziXj-uGfGItt(lePnV#-Zi-}uZM0M^~^d1s-` zd>wMn1nYJ+bkaBb!@d>hc_Zf>7+K zV=D>AH76-t`?omURhpDemPr1lPbGfTO_H!(EfeP`Zb%wwRzixVYxH?KD&8lUi=A{9 z#Lu@8u^X&vv?cmmwALCfY{zp*^p@MgHU61nf<+~iLo2W!%qN9AAqahHnktm?-f$#7!h24&9iU@Rf`aS8Na`tRTxI z%Jt58hH+lZf~G_9^Qq2pZ5tQHSNQ!I&-(1~eW=6nUA@=iuTi^+j;c&yR=Wg4H)U?j z<)VHDMtSS_^rAS!cBUqNbHO}A&%mAWZ)C-W5Z0*plHB7I5_KWYoKZyGuWE=p@9aR% zNBo`;4N$`zFu&_xFUOksy5N<7^@=C%R=j4pD;>pe#$~p>VEn$sqk)|?hm;Lf z>AT=|Y1IF*Gx^ciO&;DkalJUvgustQgT<8L4D<)~7k0w1gmVWwDQZt`g)s3UD4nW+ zreYWPKTrj{DPS$;pJ!>tsq~LcqUa_~y0f-Pby ziIL1uaR$OK+gig$G2Kzwpb!7ujt%Y{upAm>;qd>cJ`VRZ7crpKJio7GEjw_{8-H$! zL(D>X0Gw+a9@Vt&4AjABYn!%m7WC%7`n{(~y8m#rgkC{QT>I?vIhDM0 znzD_6IM78q*UAy3v2U1lrdbfmsfSKcqoG2u*8V@wQ{>NgW4vYmuIQ2ZPil;rUzlPH zpr(??^O?p0#8!Nztcy7k*WeYo_pBT0N_2wkzV;~uI+Z0IXHBO9<#V|#! zV{EsiaCb%O`Ng&Z&OA;z^uThzY6x>2$7%VC(Y9@O$YMGc^|b6QRAss#Cz;ooUehLq zIc&0jFQR?Lrob}hV*N&Y4`-y|7N2l;blG*okazCO^m6Sbeuz7cUaTA^=t~cFOjp_9 zmJX@CWA%CnF%PkJWAB1Uw4*VSoxv%T4km2nO!j_qhr3rUgWwAxd@SU0cQWDc-AcMPCU zq0L;m>2LWYo;mA*yvgwk!0+v2fqqxongEWp7(qF0;sgAh8VJh&hz!Gj!!EX7%L!Fj zC55n>NwsYwStHQNcUBz~w@0YZWcJ^f9QIVaV@|^?(AhS3*zJTu&PP@1+9!fbRoBa- zqeG9-s`?r0X5^EW#ceVPi zdMGvrqAGW*_lfT!>?n5CC-G@?Z1{<&2C)^@%S%}z@p>dRB0sDU^YBMkS{Yk}R^GjJ zEvp#lNyeipwADR9N!U|${OSRUOv}>MiR|MM3@h29jD54!Gt-5Zeb^c7Jw{>eOUAgU zr_`3(15pXQ7t}iC$jC#CLu8G5G7GAiN`9|76uv{*1%DPSvW>H?f_vFu`idZ6Opx7YJj9=Y|6$%v?SUh(`TD8kV0eM#6j!5v%ywx? zJa_XC>b@eIlcQJs;0ls0%ziD8qZA&vWI3K zP8r8rVf&aOjUNzYHTMuLwsdgM1>?a}&jrBWcDDoYdewyh3~{-^_<+;J;Cd7d0bb*r zX`o-W+P=m8x*0xdMLoJ6j*kir-XU6srd5ShuE9hichzmiWh`9utZpxJmFOT6S$C8f zf*nUXm5D>=3NOMpTP3JhA))NBkhjWv{LaC1^%&JKbH% zZN{E71H1=&x+($Bqv)Z4|GqR6@Xc^^2lC09CS?zQp6-k5hRTzKa;&N1bYPI^B^IO7 zaNA=yumiQjB9@6tMZKy*BK8Syqo$e@VFAKBf(mW&n%4*mx)t=Oyfvcbyde@e!tf#H zJ(`*DLiTd=X2mhyd*((%^omR@f6c%ja&PG&2@R}sB6Z<%e{uEbjs?YSRY zrQxITstQjzq)Orsw@h%rP_Ah?-Q>K$-7M3%^7AiPtx@lWv zsrCCN>@=P<9pV>rQu!su`GQYqEw-6VW^-V%`$+Ds{A6UIXGU&aek1(ZWyv`#JIcLF z@5sK8SHsadtFxH7RqSDo`iybe!JIUEb=ty=R!}F~F;NP$0-IuBc!a=DV1@VY z+GbuidF18Ic*RYEb&hwg;HYNV=TZSXZ?Fpm{SodO2<(&Fjv;{mct+o~?|3^z1mkk} zB>q?N=+c!z!;zlixZ2(=Emmuin8j+n|*b$xW zMzT*7*aTj>i+?k496y$pW$u;T;2pI;OwY+%5VhN`PwSb(gqXIk$@Z%J>TZpHQteUGoPE?e1OZ`PXOk-&VYHL&$Sou9p)+mJpbaV1N!`%69GI= z3Sm|KsQMKfR0@T5snbYysCuyFP+Ii$>X?vga4X5nx+7tk0u2^dTM{8cYDK@ueCq$Dr!alFF&< zOz!8`*`zRfsRUZC!-RkXPl!BTG^!<~&By&JXvI0r0`akOUucN@4klr2tzE>BV2V1~ng;Gd;roj1 z!FPDc=(&m^!7sTfaLJkvHK*7U+28K||Nm~}Ea&fM^kZy=Rzn{m&hqNHFm#`_l>La~ z=JaSC!TE)=n;jg!i){+O!L_r*?83U6oK#jR_y+O+Tk+>3w>)r9aL(XAG&|hEj(mQt zsoeF+_6B-mN}}!7I*2ea9p#oG@G{dhbB(bdzn%XZL>rR)FPqihUeQ{_Yddc!DhlBr zwfw<>3N`$$=6d8v{%mfgkwQylTX_%3Tgb}XUl{VdJr{;UOH zPUf*ehGzMO)d+YFw@n4S+iiQmJaC`=IneVd&dn>D>;3OT%&0316ZcbD!Ujajv53Ih z(w3|wEHULE{BCk>U7(@^;+c`81JTc8hx$x(oiszuQ_E5eYq1jU?k& zBy$=S7xcH=PT>fv=V>Y`@>n&iLW$=gLpf>dlJSr7Q>@fARoXvQ*__GM4Dj3gcRMMz ziH@MXWu?d#aB%cUF}`L;24Pn6`iiOKy-%;@e); z|7oWvAfU5pfoWS|EP2RKp{pxsMH;C%#mxLUR1dO}*ur0hsr z4??^mBz>&?f79l5ynt5pqp5YN-3WM-NFW_oeCkeQ`Dq8 zTqj|VK>JX^b;WQm!4_&BQN@kX=NSg5mcu9!X=tfi3bXM?VvPNo=~w;;;_s&V{b zppaW;x&57C0l${iS!)c(q3*n{mMc^d+*@2=@=#UK7U>}B1_i^rV*2PGQV+T1#v;d_ z!szr!(-22!VehmSCX2OoLATVOj7;-KS&NhbhFHVpytPRm$wlOEIrZ`VNW`!^OCKFX zwxG78y)z6U+xT2pOPTRqv;;LFnSGlzGgDJjpSUEMx7Nl zSYmH^Kxv0MV2yZB^+I+GmQ8L~UgG>HOe0s4EH0(D7&?#wK~J*O@LFeJ>hS~AHGKu| zlCGMZqL1Ya*A3E*HQ;cS?lSR&2!$?_Q}MpkaA>u@zitqDn7vcCZ>OHs4%DI zTuRZC64Q&!prj?#O4ER}66r0ni9(~97NK(@u-hilnZTad1lZXh^{u(ybn7+1ze%@CHAZrQ-2s28-4cC-zYX7|tcn&PWANS80nv~B z+eWHbha{!2Q7sCZCE3QNwMW=%#Vh5V)o0j2;v;y3`T+N-Xajzoy1^NuKW8{VWy9C? zZ;hR)-u^7e52%;a{;1dbu9m8)*2=B4f9d zM(f5{7IWvtgmF?V%Q$e%LimH}mz9Iav(D1|#ktqXdO9rsVNNAA)HzZXnR9^}Zts_u znf-=ZWV@JCnR(7|%Q`XpLi%E=yCpF5@03B*VslMuLP8fR#5huVf;!_o2*$L(>EA%y zhvoEFfLSyR)}h(XjbM$ZtMgCrjydjF4|pzjM1JGf)*r}AbS>0gaS1;{y^TO6DX0lQ zrJf)W3ZH22R<@2_ExfCi$S+~9kt6sU1|}KH-=Gn*hKPG|)@kb6-oj?99h%3Xi?Dw3 z`Gy{xt`ur)FeE{lIHv9C-@~wx{ZXH& zA7KzitR~}0(vZL?CA%qiO9qmO_Q_gY9Ak-d4ClP_#|ee)VG%Qh=PdVZF9S5f`P3jw z_u5-xJ$cFMiC{&uSyl@t;_a-dJY9!lquZg-qd1~L)u4PcHiSKNdR+*9-WRbO1@XP2_akTYi)a~d}@kH~%x`C=W&NaD9@`IGs zbUlY@FsTn>&_ZBW6uNQ&?xcqTETxy|oB3@`D*?vQdja1lJ+H30TuckWc=E!Y1Ll)H z)o}bM8i`#~mk=6}T-;sxBQY5JPJFClv66-L7q8dMQ})32i6&@%RUX5B6H0Lh>$7OM zU@*H_Bg7W+i{&kXt3?}Fg$9@tfj>6hplbNTh`){1`rpG~d=F(OM{4pkH~z(MBAV84nm2#r)@>>1d%^?kmX)fC-H5G!19i(70-mJChzlHuJmD*+$ch zNwgG<-%}lVU_6OZj3MShCF1k)QN%~Mi{yc#Jzfuwk;w7(ntSLj@$=Oz0uv6$ep9|s z&lgS*i8W&N1!NhzCXijr6)_O1MqJk@6mU0@!H`((Fig-t5pdK8sh4^oZOPT)2ETKr>YiZ-rR1gHf0Ie*F5_6oOx!k(NV@V*a$~e&$Ww zwrG`fz45ME1HZMWrtc}7%3tX?p4PgsFFV!#IQ8#*xJ|B&k@`l~UUkp%DS3b1aMgYD z>7+wBlPiy#CMHy7&Bg;v6Jq3^hG6!+>X8zR(*D<;YJYo0kKx(Y zpV?arr*hTir$|jfd+vLaKSyakJN%iUhp<>?t@%i$3y0)ph8-ZcBC*+~3WypbXp#Q! zXK6mST53$qINiJ*@S0=p1~Aal7wEOe>H$1Yx2*!>w$>g2u=$>UA7ktKu!qA-itwOH&K6E5ML%^v?seWsJefU-E#)0ob*s(iIwCu&PpoZ#dhsUypZP_qs%70c z^{lX9Wo&Su`W@>_^$!|`;ycD{MF&+vtM2Sw>Q>ClLE#ahikM&~vpaW~e631dHxk%P z|9+lm&N1AfxgfvGJgjx9HI*ftf$GW1zG^#XwpybKsnhbpG>0@VSw~>0=85VyqrIS3 zaYNbXzj-bS2)Ly+RI>|z4s&atM6e2CA{J?(u*m$IVZDf_%ure9sx|V0@~GUu<&W^+ zBAMAicxz283r(K~e*6D^o+j-FpqG<0Z^8Oepr*RC`FfJ(29SBU5!ioSw1=vj%MF^s z)y??N(MGU_K)L3jBLc^JeO#43`5 zCUDmXzRIW9Jb*^<1)9+{=Qt_QWK|4~Rn67x4hzCt)J?-vLi?&)DRyfQu+L~SsvfC( zuup0RDzY>e86EV(+Hh??yM^|gqJXd}JK<+k2K6{Dj9*twQ;uSBkQ?gD#CT0hK^gvz z*rhrL>F`&0vgWnm7`~Tysu;oFry79QC_5rvWh;C>-U%hv)o6z(j-g44h4==A1@YCr z!mV{blEGT2Ff2Vzm#!%+5T$)3S`kC?*{OqxYSA1T6kkC3L|A*vY=gs|$W z)Dw7x2(Rw3d^2|#KU}^^^@!I`kfRc;D&!O)*Q;%KoH|BzJ$$`xq^e0bnC-W}RkThS zl|bB9ZN)Pq`Vw^AbX>~mO|(+J!B;YW*S=HhHF2y;f>v$DyRgS-G-@`rl~sp~k1W;= z^+)gP)M7vR9KS9QDVFPQYw{3@g3?9fO~?YpHlmk03MHyP6GOEQ+ zP1#6lIw7k|%?wXw=wB(vq(;VX)YjItM|!KYL>jOou9DyUyV~m}0=bR;J-{K+)W_M^kQt0r4U01w&18<(zUECrZ$>6-Z?Ou6a~SJ2 zzeKG?8^YJBXzl<+q^Qu+(4WZ8@^*L+_zf~hen&Z&H%Ab!s3b^y2OhJofhbi^AZ}C- z)}2$Ci4x8LU6fW$*jHX6^qR@UQMnUujc>;N3#dd_Z4+L~eyzu00aR^EBCi=n{w-x!$aGy1RHx zjwExF?v8p_mO4F_?5i%!h)rFlJy5wgrE_A4Zl$sgy~l~wuLk-XO@6bVbIB0!o@0}n zf&PBcZ3gd_wZsm<>oEOPP~M%)2KD|Reg*vyrudl|frhY!Y8oPiUAVn)dbI^@$6>4D zp=H7`)mycF;4HKSRDrL6eiTlMdRbKr4MsQAx`?p?qfpMs*LeJT9$M$bZ{wxf78(_K zur!ev9lTvXSm*a0RejRUR3rGp$ap=W(c{}|#JZ2_S-R26$HX$#arFsiDw(ZG)(2>K zx}*4P&HbqDXe_5nrzQ4_vI=bpu#o&4T$hr3aGghf`%a*)D_|LrZCp&#gA*rw2v;j;yuA@oNCe1zGDx@ESsgZJ{(LuocQOE$g!xEM6qUr z)-Es85Akcjqq?uUU$g;uN==DwyXL))t$d(6u8trFMjX}k)qce%huT+UF(0JWm z{1Cn)d;#&7st*4({4r9=JFYJyCJDi4Pnku0Qg=fK^VPbafqrIE z4*+j(^d|u_$*BM*lKa5*g`^YUY*GXCe*pQ-H~a_vY#^5?rm>gv=Rv_5XGD?E0?kqt zG13I1d11GE=IO;TnZz*E%J_YU0VnJfQE;?t9=`mAz02G zs4mk)Ym#c;6U%WLZ>1{4muOc!9UXTTzK(}jn*yU8WGWBlXngSxYLK5~)sQU3!m6$#_1 zbfbtd$oEh`{Xk+oG7IM8_jEGh4CJ_e12G%f>d!nh0l%z%jfZA43ohbobqQGm^Ve#} z;L(|K*n0cRTkA&61UfvvK6JwWPCufVY zC~~;K@4n9s`WZ=*)>&NT|7?VOEoJ0E?j|jty)ma@>>s9ZGY8| zxJ+$TUaT8Oywsl6Fzb@>ztk4|Y~2a|4Q{=jMdx6Q#8oG*GjP9Sr`K5m_VYOY(AdFkT0_&AU6ohcZfBk2j8zERw1-?^jpUy; zn(-wOr=3oWP-L{3tG=QVs44t}e+RNi)v0QMVx@wrRj8U29cw36Dbxw-bE@8T^ZlM5 zy;W1e8rZ+v>CPL*X+<$e`Pxy;UOKsY0q3v4&N_=m!tKYNt-6A@=dI@)(lXU+d4=$P zRXcSKX2F-pDs>JgB440NRynz$vOd)(<$NeA zx1%~s)rZ$Q`?v~Kf8ucd&pf4EK?AD1#W3N){b!$=@;EWoEp_ea7;W83gA@o--&voGr869LgYudcf|mtfqRwz zu&y(IpJvpVu2pN#Mmq!E zRAZpI)=$ttWlw+RLxg|ozvj3BMgH{$(QePPqP6Z!;A>ogxuZlOQ_#%ZW)>k?#F%w=&5rysHzR9TM!M zq~3i_6EZ^~Y>aXlu!xBG#x?GVqK3MFhPiHvNw4nVo8mgiKh1jP@y8>E+lB3-W9%y4 zYz}NrGf1Ek&Ex1d@&vATRi)%~!;7MJDNCen8@ClLO`a|+#NO@1uO@~8?*k}#b~B;%VVr`c`gP++9&?dS{k@#Y|l5%uHsQr(=0elUwg>NylQ%JiT-LfHdP@jtgir zUbZd&#=A`cc(1gC04y|&0`tQfxKmkky$|qn&<|QpIh7Wj&GYau^>OJL;SzWOzEt`O zCEyFy-${QLcILm+^p*?|On{0R6!yK~H_i{`{m>tnFV^L>oB*9*8!C9XOwm!knI)>c ziv`egkRilp@m5+ds8YNU<@qz}9#ZFsdeHu_XLU*F_f8c;D;6Wi9cQ3ts<+5_+c{{V zdM$d^vW)S)x)r~NVTW^?qnl|1f0S>6`+;sdKgjpkeaWy#Fx@xY(~|5WsPNFP6jIKA z?Yc~N(`o#9m;xLF)IDG+RcHy|?Pcwb9wz^TbA`EBvadlyt|>n4cH>C;H#S`pTr?vFIC`AKxxIf3uwJVK(J8~CrnpQ2Cf z<@{ppXMbKMCO1T5Mg~}3hJ{q_7qm7WGgmn7+2YU-?ley)+gsrRZzr$Ox)&9D!@OTD z7PQKJ$lb~^2t7r&bFDB9^GDy0aFY7*NHn?E+^xlUxIyez{j@F!4iaCh_ZCR=UPRw$ zuom3OJuE4yzm^}7J6zntcUJZ(+lIaJl;y3@!m;b_Q8_&`xMJ9?$-I|xQM|%cld?4S zM^Pr-xw?Y_oD#q^aFrHoEt&^*zIG0+z-}M zKVb_5U-_Si3~`O<7ihCaE_oxG%b$+-l=K&^m#v4|yYmJb)Pk0$rjgE85;joD5B0l{dzQGuQK6L!d{~0Dxvm*_9&)NmY+T(eh zS?>is?5$WiVGjiP*1^yM^?W4Vytk@Lt9Qs|!_#$R9e+8*qS5qv&s#?)vD7`wo92ke zzIV^@-nX~Jt~l+kKDH}}nD)5X){!F8R^UiA?L>F_^Gz2Mv4V;INJ8uDuEG7V(>`H7 zoNts&t#6(GM%GLGmv^$Ps|>;Bdu#KgdF%Zd3=KIsIg79v?$Oz%tQMHmH9lihdPnRu z9h`E)A20Wr^OP{ve#lqwjo13)fakuxo=>2^Em94~b_rYX-m2PQqmWxH zV_mqYh_OUrs~&+I)NmQowKL#4yr1eA`w|l7XoC)E*-{kdXh7m3H=|4K?a@{2Y{3m1 z1}%jb33Rq{!6@bqfxy}cI#bsMIc8qL3CH^(J&bZyp;8Ycd0N-fE{KBL{SX}t7E z7S_b)%EQ})ATQCNy4fqbqxTe@q=Da%PTxT+gJ$+8fg z&UwjSWLba=V1D59%?lAn)md(qxj3T#x?I6HLw7ihmxaHWlXgbebS6;9Tm@hC8cqD1BJ`kY3R+fZl=4pe;VP^Of+4Gt)cVzEIH9A#qJK zrwb-ngDrd6gH)jgi)0{w826}9KzB)bS~Ojl?_{TJDzczU97j_^iZYRY_9H1v3QoXT zHb%-V8IxISIg*6u{sbA#+v9)As(}+Ij$~6}K64gz$n=}%M1vgg6yLZI@chPi6X>nV zTMGDX@A($%cZj^GH&uVaSo~WAwM9GYF7Jm`o88H)UuG5z!v@IQJRtAWHn|vhx@ac zH#AtCN6;?W;J4HeK zzsdcsXGK55BHdIQyJ!!*fSj+_6_oMV%Cp=y`PCd)H;Df^_eM=Ibc=YFm9FZBSj|5s z|Empf+Rdv5@3S1&bzo2AImO_aAKN3rw}my1JWg}PW%h6TS5`RgfN}eOx3d?9b+O`h zXdpCQlYpH;6W~hiBjHl$5~nwQ6e;DlWK3xz;@xLmWVd4Ul7EEOM+WlBG#u{#Zs!+a zFMOt;t7A1fNgIfqw5!7ei$92(mF&|9IYdY%qjyS z=q|02iojwVVv+pll;uyr$m$-y@umhuv_xytddbAazb0zJ4xBYO5< z&ytN6SZbwL^}nMjrjVF)l#S+@o=7wJ`;b@0w$cYsp#S@_L2^R%k$;F9AYQB-2@lrY z6ArHK&I!Z^!&9QJFwKOO{}<5?9f*^nadc-9sgD!?PRC)(bgM;|=y2=+5hOCx9uW&~ zk7m>JMH=lUA&-8IzQ;vE%=sI?sJ4Y@jy(@f!VTzb>q*A|R~WRB@y5HwJwW79wf1%O zB%#ap|QV&Re_f0FRPN~NvUaBx8Wt52LZePGiP7yZJ=Vfyf{uK74Kj*HOeh|gcy|Vio zgkm{;E>+;X>wm`I&AnY?on|mEx!~9Wknea0^fcaH1F)wp9pF@p9_aT{BNt#?c_`?I z`LzeZoH<(EC+EwEY%iB&(3Qmi!nA`3{YuRC)7=HH<*unXRu@5fd$Vqd6Fewd45GkhTm>3ma)@6VIKF4+;%A~ zuwoaS{bNF}=nVJOv<%}L(IYy|pIh@g_a-n7KXre_niX}uYY33DTz9}Y(wANiP~|KG z$Z>p&N1SMD1?n9!j|Ah42VG%XAG6$)kA>PZV+R?35i)JtVrCmQBe}M9F{M<1P+&bP zWtk!bWtJbMy^LzU)m#=m%G8Sg-n3La-8hkZ&NyEzG)?0X)m{oH?Q?`XiXhQNSOI>ruDOE7d!f z*-r@vnJ0SY*h+i(yOIn$`5XCJbV;C9a8&ZW zeK=efksEv7Bx86Xt@w;@P(fgxK6-n7`vQHgS5o0C&u`3eiJQDuS!4E0@n4>4c}ZE9 zF{YklE>%yWBh0k9`ZJ)1!} z?Oq9Rk82sgAQubZHRo!81&%;~kI|(zC}xH6xNwnea7;(zAINzt6vLyAqW7)iVmcW4 zP?aTJdfo69IcOO!^_gDqJDR&j=a~lZN0|i@wP^)(*zidVo94-2`bY@c1r(`YuJ zVYbGYX^vl<=R{liAKcTNSFm}e?Vb`x0QSht@*eQdQ{JycT+?i4(5|{!u5lKIKhFC) zXNoZx!J=KZg>@9ad(5wfQtcPPXH4RICA%ZbkKW@uDs#vzV!O9M_Bn67xW9LJo;UXk z`j>y6@*?{>cHdo>Ez9bHopE8A`RVE6E3P-Gw-as%x6@POkJ>oC-vLi&{uB54j&~N| z+2ySTynl8d1$wLVTm4zu+4!cL*sZR+ItXz!2hFdTF( zvdtG2s>10RrWxpalxeHR_X>ifFjS`Az~Jo!)wYiQbz4?H(DpzQkPw>L<7sf%3_MWYc=gyZTp1WDtsKpoi<_e~+ZUrVYqugdY*E-+Z430Q?V13qia^tBHNwxtCM3YNQ_x?VfV{D& zM2jga`p!I4!1LSSOH5LXMIWc{iw{%3dv*RSQ-jR|yaxJDjA6U(?MaUjYs_L#y@L?l zw`9BPZ3Uu@)B{JnYeZ@QAhU=*@p{FShOc2du`!;p~1B$ zE2jV#4Rqbj?3-^z$J54)Rfw)g~w59z~x92J2) z6z1@Hs?H-ni!SoI<3o}CsGE0-2t(CSDz}ligsT19Ibl_fus1PJURMz=lu!%9%hWbh zKv~cucpcQzoGfi+yu;Z+t&wcfRdL%H3G8QWJiOI-OQ@7Hpn=9wqUS1)--cR*#p zgQ%m}7=s3$i!+d3`lb9TlA=P~NBnQogSOH2n`x!^v3*JXBRX09(q7}!&{wdY_HN!8 z&Ywl!+mE=X*f*oIYy;>g=61+@3&%DYJ|6kIzPGSHFN8;+a%WwtvFIy`I)6zWSENLy zIS!_-Ej%Gm*axNx3zGOpY)ewSvcKW)Y+aJAxsSQ0Er%1%XAObJo9{}KQs%&A=KTSE z=;yxu;CDZyz6R)Lq;DaRi@hxXuJV+CapOnNWFWtEzXllQ{-)QJE<4~o;6KNkl^6Xh z-Y2l~;7j~)-AiG9KpWP0Vg{;U{uXjqF#;M_-G+NQs4HVzc`4_`s-24Rx{HvH>%jlH z{~v58K99>Q1%fSDl{#C|fp-Ue$k`em%PT}{f}_d__7XI|t|J4B?27U=Golh%J<(Wv zO4zqG+<)3=#vS%`zAp4W^s;@mZ-a9hy5By-JJ$Ipe~DP9bLXEcHoKDe_4jr|Mu@jVw}0 z6(fyZ(c9|JA#uho2(0R}_M4B|zuWrV+M0gBIVeA4`|N09C)6FW{^-by`noRKyxGp> z^j_E2c-uA{9;5gT?_xU$A6JTzXO>@1f82&V1oSla}ua1?M+4SfOJUVi!EeO4&O=XH~eZ+IgQ2r-t9lw<> zi2I%SpyYe!SK}u*62DHrqh@oLQfB%gxd=L{UqCmJ?bw~6+0Fv$9p?qYcN%daw?Qm& ztmZro=qru;e`I}SVB1);cG{HEHfhi?$g(6$vK?kFGq+pXGGmHc?v^3Nq#-*7*_LhD zmTj4mGH#ifnVGlkw%zTvpL2Tme*3;xKl11ZCi0`v(ah+a8S5c__m~8-J(JGw#J?bT z?r2irNnR{@>zJOuH7Qa&g&mW3HSv<@uI;B>SHeTVersmV^Eke6k99;=lsr`Mz}h+B zFg${EwiPK0&HW-Otfz<#Hoo-^@K1(Wf6VW$Z*2waC=P63dgwI^0Y?qaEC8vOzKxrDmyZpNVyNK zVh?0iCr%fn*sIg;#?^z@uuD=_VPX8=Y+dEunAU6+;PVPA1^w(U`&Ym_%KosI&)Tkm z{`oK4kGOw3>jJQ!wLSvd^~^VL{`z$p%wyR$OPH{|wS)WxGcmj~b60kanG-E%IN29w zPsMVxNVc6R+j!YzCtor*HYS=zlPj5ekpoRH2?Gb3G5ymFjLY}s*wWLVS z$--Y+t`*wtpX5{MF^&dEt=`UXCIGwP zpyP+1GRA=d-aoV7!2Yf50MK5-4h4AC9uIJz?IGa%ba)73kh#sdg4YZ#hnU;J<18y= z_bityXIWm!mNC~=pXgcSpXR`nSd&P$iBVMcFfAq1m@%tlrom)q=4w@rek(E1vWK24 zyw3j=sEWHfVwbQVTV?#rj}}a|k27eZ-$g&RMbO#&cx8R-cKxX6@|d4(do{sj$uR@1 zkCl9NHh-8ESMS@fzjCG}UM{EI_A=zP>^UQ5e@6R}VYUqWFbNl^DR1FH<$y4$d<}piP*NDHYi`kjz1Ol@Kv%8So zK)*uRKOief$f~e4LqC$&Ecw>6$UfP0^HfVFVw6ocxXg#)5VYLEWO2Ep5XhO7)iO5{ z^*a`47Uj%AP{*c>RoO4#8um!~+ssPD%F5FwWPF#*V5g@XO1&hR$5M%^#4)0`wp6)8 zw9MHC@EF4l1H83xz5KzivjDVPI)CI(5;)g^?Lp4EVEYzFUx1_7-vG~_Vvm}mh#*5B z(E`Rq453BQv^j=2Zs^Vb*)o>MGZ~uXn>!Kv>CosCrpd&9)6rU$r+?i^LmOc0Ug z!f=${if5WC=>oxSfyVm9_&IW+xZJjm9we;fcd=shYd!~EwH`9=<41_LF-eBRrelTY zm}LEyXg+_j#agvZ9T*nGoYlpsNq!@X4d13|%Qi&>cy9)AbU+_szc6X+aETP3U>nGO zLJ(Zee6>A;N8vr0eKr=EhM%YFSl#ecVu|s+<+emitkbkNC!rtV`fR6+8+l`qee9d` z!Fj*KL+#Ddd*yC`gV@}(;v5>jJCxEt(;`;bP9?rfJ0|&R`!)Vm(sJmC z^$3wK);dQ5p5MC!fVamE7wB&nJ8uF0<~zaxHgjqK&*6?<;P}UmCg6An%Ln^$VHZ;~ z6fG%)76hstS+q32)Wo4Flr^@!DFS;;O$>9>sn|Sya4cq8gVpHMVwTfoSZ_nOSd>o3 zQs}3#UkvlH@%mYGsgNg(XP)STqdE(Jv(z<|M|Tx1v2-xp;cJ9;^K1QUenHx( zgiToA{6Qx#ZNb-=T5qh>+!j5i7pMl6^cO;=Q&2nI67~vQ7Ui-2!9wT zl3P0`kIP>oe$8A;>Yry9pJF1D+T_lFnlr*gaZaRI#zZ9GS=rD7%MC^SjKCOVi;29H zJe$vFwjqbb9~};050^P30AK4Jp#Z}iF9F{c_9U<;VjYQ~9p$(Su(RVwTw?}11+;_y zX9?vG2+SeAESMhCf_fJ=KQb!1g`USBvtnV)G`&$2NZAnYF)kLpwDItBOmS9MUuxx6fakKzfKT#q1M|57+V z=O;l0HB@NNdd|mXl$bDuup|@oD7rvgdl@|BSEuRGlpuE#@mPRrlq$5p51>R(;H{PDCgl`2wj4 z1&jEoceUY4yfa*cLWqMAO-#GdQ*vYEd#VU)p@@+j z(A~i*)p+^|aU#006E!9;uovaau_s4!S zU(z+IdmH&yuF-N;rIKrwKI&b{{bI_BMr$>ndBd#_8l`J88y&OU7fh;ps*%y(_@sKF zVRh8@sHtTSw9Vjp-jm9y5jCaK>Rsq;4HosVT0_ql%#H3*y_8wZ-&*Ip&&B)_5*$0n z``El`?X;MN9Bo>n6~}C6P-7R(6TU}!K=533sVSr=tsdVz8BbM&R0lVIgnX9m^Q|uU zCaoendKcvP!*38>-TGXol)(eF8nSnxZSYD~oxT<8hwY|4@;`|n>3n9cr<;C{xi#>& zF%tvsA!!-*!w)nIfW8u@WX{#9(6u!%7q z-AeM1i_}8&ylkBGS|E#XgzOt8-!LywWTXi;UHc80fXBgmiZ;XDB@^H%>Q!Kr|BaaY zl!d=v)2PC#5r>YDhT4AC^r)(mA~tJfu9ii`_Kg*fbv==#_Nh_7sN0EK*wdiyR1&{C zbD6h0P|tL#`Lt-4u9Y^Sss(?4)$~w};7?~K=38+@=xkpH_8rtA0`n(3-$3EKNdHO4 z1PJE2yn`HFLchnf@yPA3HT^^zoRh7kQD1mErpWM6^DVX^+BlGLSs2w?F{64>LG$$6 ziUZXv3nrxQz=E9vndxlfXY$_#EvwmsoJ@we+pdWC!paez%p zxQ+D3L)c4>56ouQXz)Ip?s^X1bF-bNkXqiR2Pz5G;#>RfAN{gzJh&f1<}A1mPUBj@ zd&jEv0O6{2>K+&YWm0S5?gSSbudc z+zMU^2di3(8VlM-+|ure8KM5DYFR#9eNK9j{k9IFCQ6I!@s&MwQ!#`+B`nbMkUFe3 z_M9$K(#XCc)~Q<~Dzpv~4WjfhE6w?VoX$+?3qu|LUhPO;)5-}}(y>(4MQR7v{C|56khQ$l^VER&D90s$_?^i$7VzK6 zu^Fk||Cfye_C`n`M^eiH=13 zz_{W+F+ZB8>?>gdAJG);eyE;(9ehncR`S@|ADXC}D;UT8E;4DK^H6#QuU8;b z#4b$}s?0T5M?%Fejpt|hl}PFy;9Vt{Cos6fydNPOZ;$H^*V>Q_&2n|*guD=5V|E%_ zq*~f&CEeKcd;P|hI%GBC4bQ7+FT3Td%w3w>SI+Zmb35d=kahM6a!Ye~vLoJkIlp9E z@!{_MS=}<96SLe&nQzlD;xAYGw4$V@L}TalM4NEF^b7k+Q0m(0+bpZ)>$Yz`z^C3> zfbZM?Q+IGV*BS6V-1Vcr<9PNWQhR&{%V41A^$Y_6{#<-Z_Zu9A25m?SZGrD0I;?Lb zn2Jx7-P>>$D#6o8F5)e;S}G#Wm1m1jpjB8}xl7Oz79wNSoA}2Cr=vsFl1f>_3iZb5 zH`E*Cq)jGhVLXXkwA~e5Fk0cSRtVZ^5W}5qyTn`|gXt*iUr{D%PFA-;D&&s%#ifLYu@z&Fp)73jCXTm$%RPv1dm&$|#Esowiy^(+4u51-W+KMxueg^6qQ4iD#omVndVD!Wv`+zFYZD07+7iG-X}kM8T%$ z0qV`gxn*IRBHl!U0BXrR5$>gFaVWD$Jb?a7xXj`Zrx{lX7FqU)%k?{BtC+ozntBjZ zVvZIMqe#I;(;2}MT{XXyZX{f!WrSub3GeE$NVY+5O>Y19K)%>{>{tH^0|P8~2dvZ-D2+)$;+*!~H+%YfkqGfnN9bdPUMa3;*Znp3&Vffy~rkP3#q91#z)55t<}! zjro-A1;0n$74EM}Tg^qJQSD-Lj1QuBP_LEKX*M#Su7E@|T|VBhBf#_Fk}LXpk}LYb z$|PeeaR{YrRz}woF3_xwZf436y;F4)cA%lC-c^47VD)*luMd)%c^f5HtFOr$>)J3w zYM$Z`qBSock2>wH_>9%01Kb93n1+S&16fF_L|NBRpEtDpgMr4 zjb#r$rukHHnR$@>Q^7>o&-96(Qg9Sn$qY|O&i@(4m_-Raa|eqXFrtJrSq;Q-mPzp) z(kS6elwFmLK z0^F&o)nhZ#_CM_CmcbvD#gcqQ?`2I&+o25^hlOtdw&y=GYSC!?Qr%l>ii~4URWCzCP5RmDSHDy5 z=cm~2`MOg%%ez?Ld!)Mf4FdBA*PP0}>O$Rpb6n$*;J5utPC>S&FTTt(wt3o`$;ff% z{DR9o3Jzn(=g)3-1@6GC&COfd4w^`{%{GJn!{+U-sWJYS*vo`$~(6dDt;(7=Dg$VYf7) zxE${-eXm-DMN0ohwYm<{DUwC#$Us$zqvG$P>*|N_IOR$p``@w#8P7)cK;ANk4bEnF zVT*ORo?2fe>TExu|JGoq=#6c$W_n46Xts4!)sS_c%XXW3m)r~ATwYZ1ZyB}gAN?CO zL&R{nxH?*y3>}Uf=-+F+2(gi~ebY4&qM0$fJh7!qOBX~>;pE5>O(`F;kHLBx+We>A z6!25FVB6dsn@{%mB_`+O0+t($B(pv8G0qMbS=G5tS8w>EMW6k*!y!?b!ZMx&Mu(3x zUsP0B|NDAKbPdo2l|&AF;0|yOz&?_N;NB)lwkvDT3G|C#yB>!A!`JD&eqm`NJO?V! z8_*51>!-aLehF{uIB%fq(RdEKOn;#?6YuSqr_U@OE~?V6qO#flMA9EAxc z^L4zr^N#ZZTZf^+b6;wH1n@pxQLmQIF@`!DYO$j(3iz@eB2xj+qlF~6A8(*cfFF^` z0JFqL%`J$w>h`?JnsV|;pia_ssz|m5UC9rQ{z&%0F7vjRZz6t2zC=%noh03dWQDI2 ze1^}6&sGRy6Qe%zmzSI@muVM;-r;}H_=(}J@5&XL7UWu&qWGFRFk#p=UTM-j3iw;JIlBP#ux?;SMA_9KzSNN!2cDrax(DzV zN2`Zd*7AQqG7#u<1lkVhcN^q}b(w4+y%-L&Opv8Y62%!NT>cPwDQ;q#Ci9}T^@tae zsmPi@%tB7IgZkB6jL~O??wfXOG78sl18G?Nj7U z+*i??ReAQmJ#mCfQ|wCf&L=`EDVN#PiP)u0a-MZ>!&_>kYz|ikKdCM@ZE>u|Zc`fU zm{p37(aw_ZFx^GwQZkbDN%KEv@nj-@i~ONkc2eW3&g+=@nfU5GkozLNfF!+}a|WcY zBu9FhWKT`ZB?I~WGrmdnq{4kW<+9@g}hqCkn!2d3B6Tq)YG63j*^FXqla#?Sa9Qlj6ESn{G2e)H7$j^u`z{4%H zY&()D>2BdjW9c7onQ0X<1(HDp#`@CR<%fi04O1okR94|b<7Y{Jz-#}>a2dbgia^8Z zkN8_xU8J6|1n=N_EV-rk;x1RFB$fID+vU6|{+&7`-R5itrRWY~10BPJOEjynL+pG= zrAQe63FUQwmhUAKJ4io1+>vNW6 zy_R-#M`V{|yd@5}-(+@9J%E4Wnr0NnuOpn?fs|m!6TAucB7UD+?i~l-e~I3o0q%Ee z0N*#bAAaC>rwj0YgpB}vkGHl3JXfn902|?5B@SmCZ6Cl50!@`86m@lE5fs za_oj!WVsaf{dWnTOUWva_d(c_zVnKJ! z40NeIM%Y0OqdB(pK)sd&;+*LE(x3dRNlbT{w)?je)tYM-(w{?iqk1xjNROSx?IMmDKjO>S*uZy+IQa(4HtBW4vOwLc)a-A0v+y`iVfMDXhtl0{B>PZq z6I|||nzb?q!*6hvnai@8;q$rK8F$iK;sWm1w4|gGe3UCR<%9hew$#}pzO`qJPXg?> z8ebz|&u#Kv1$;+)e$*|saCTsSv~}(TeBZJ0K)(`5d=L7OWu={go^#?f=1D+LIEb=X z$akn;M4BbClV}uFX6`4OBu$5AnzG14h(MBPd= z=ZhpP+Bmwx3zMS_%0?TwF2ogM2Ta9&#TU@)$Tg;GczxOsu;QxI`xJCWTe+^J=NEKB zX=hLdlAnXFa&An&oI4BAI8XH9o`BpPA47tc#u1_fEZ zDr(Fc;dlBbddJ(@F9ZDM`uhS*_3Z-uZu0yF`j1R^Q-BYhS)jib*)M{AViEcypTt}K zK@c~s<+^s!Rt@FPl%&fRDJLx-jiE9_)o^}GR7u>goFT|Yr{JinYeW;YI~JiFCzv7m z4Srp9Hl~&EJ(x4_L&A^0A;>}f3Uv-5N80H}s(Qd}&}u5TvJ~2lOr!*wn~)gpq3K`Q z1v&|>sT!z+1T&+ygv%Sv{y%p33kI%!DH&Wg&K6f4gAOV?XCL8D=C!Mn$*b zvwD-oz3E?b@0ad|Cg=;Zoysrb677lfo9erg?S@~05BP6cde1t*=NYaQQoFq=w-@N` zcIPC}FL!qI0sMYv1_JwoZ*I7>_PGCE8bN$9W8OgQ7lk3OEH=W#e=q)pSw^%GOp_dD zF5(lzhNCj89Zz368|}ly;e#ssV)K|;z~}t8tZLn*s2Z_`&7!iK;!p#2ihfe;Bxsub zt>#HY3je-sp7#7Yo_M@1Sid3WzIcdr8s!L|EWT*@w~X5L6mA|%3ofla!QHXFiV6y^ z&keSh3o^^SPJyj?oso?mIM!HRsg}g1ZEHb{J!`V0KV|CJT+Q$E41T%Lj; zP63~0-{*I8{stegYx7<>NXaK#X6}bT^@vYaUG{nh0smw>kbyaZ1M|E)rz~{*uZ;g$ z84O>Y&Wo^&!!I~G+ zSxgan1?!G^%tex;QX>{;ej+H6hN3leWLYt`U&7N(*Vn_>!HvtUhKW)gG>U(Lc1v}9 zMa(Tj9^w^+lqX50+$r^vr8ffDsaI9(KW%QQ4!eQmS%gYxrSTrOjQ3 zH4BPnN;^6w`qN=+@nwz!8eQZ?=`eOI@xoPt1gUxKZ5N6RQI2NEeU0pdeu(66%>( zfW)mu2=|@*`EoNdkJIJ##%*Xe*EY8y6@q1PFS0*b-=g7MT4tC-gZ<1&Q|CMLqzbOL zB8{tS+yr>U^?ks5t-Yqhnp)lpd1K0J@t{xw?B#3X48ZeBcqs5!+De`@sNG+L_0!hk z0HTqzUEBrhG2*@>PI1%x2cF=VEuUn0h)-oNl0$VdxXnI@;0&FmZEb#RZX}1kXGWn) ztpy!n>A~9$-<62Wgm`_-puiWc5%>`<7!6dCAQIhUkQ8Mf{5027Iex(oXk2kJwk7sP!yu2` z$Mc7zr^7QnTt1wpLdLqOyztaL$Wr&C+(yYy(Z=q>Ijs_6FvPtuyFS5UFS&%wuI5m@ zlY3IyW)}}X$te==aenKEs9K&5F%-~Kt@$9((=_81U?0oW?E&BRKsKA&<6Q8Myfbs8 zMc_N)Rcr^~c_UHm>YUKlp(YQwUdB&kN%E`nSzM<54AI?rUGd(ULcDi;m%n4~;eW8N zWWy}cIL>|~&eQ9qJbN^rPc1^XTJ`t|x)IK382mV=z`tubJi)zRnxxr=^W5XHRCOHw zmivenR=vg_aRZUwBeTu4meZVK8gH4@#qCs4=r=W&ILPDI>7bgEvT(8`-a z1nIlS7kPUVeGM<;277-duImfquXz>`lMEZ;!#t}A%n+TB>|RGq)6Y%F!bm z(|D3|v!a9jsmumKq}M%^7fu_B)o& z;ly)w9{wxWRa&aalpb=~q>Q>4Pv-tc1S$_6!CjT`mDTul*CR=GVE683pMk$U6ggo*A~#0bOLgk4;e z?5+M$!cVUGq|q>0EaDF4?8=!1wdFK9-E#QiU@ki+FZ;YWg{#UwoJk-ZUBay988$eK z>zLUgwXfu)>stEJgjYxwr%LV0yhjl(A&KEWyMB!KOm@u!eZSY?1^ve~wmtBx$J%cK zJx{h2gLm*$!;cAsnc~C7TAodi4QyYGE1gRc<~idCv1@U{Gv_DV=1fk&oVW4*&KdE) zItuZ>9e>6pI>z9W9p@EMY(8Gsk)qgdlSy;g26Dn0jCHj4l69~uiDQBJg;Si#viR_*+Oqc)z0t4W(r1sbxt5&X}e=PoR{#=niuF&=Su8nC4qH!W}>FjL}`}uCelnj zP`cNVl`x3g5dA^>CVsd#9w+G=aRMKUC(@R5lQ2J((m%o8v#Y zwK6YVknoX9lW(ENC;aX_Mm{$r3OGk;RzaRK`jTT{){We8yi<<%ne_s7CgwQ?WH!vH zCmi80W`tzT7p-!z>EF`3L3u_!i zu#M(B^?>gu>`S2MUu@q%zoE4Z0s6aDsRKOUR-Fdz$=DtikM}y{((mky_*5q$z0Pir zD{@3ikFYo6`a24-xoo4j^Xxz@fnB3WW80%P`vbYk-V&{{J(qR0`jDH}dVz7Jmx)n^ zZO{n&McF=s6l!e$i5#o9L%Zx2vYCD~#Mp-u+jK3(lk9#xSJw;vYX2;~u9YJu`(@;D z`ADSL-Vl9WwNC=uZSp{$z0st7B`fq!#l&=D*+oyTq>h0l|MZ@ghSU3HFFeEWBqJhM zc@oKM#xwGdoSKL?%u#IMrpOP{fhht`T-M!qI0UyXNdGNAqzTU!mOe2*DJs|YC@n6p zSxi$~hqTn(pvtz^k*UYB3!Cn>u1}eqX^oj|JD1cU?Q+B{+u4L7#ovObws^&P=T>(S zu#4+@Qh*)DaC4zrJ*~^d0=@@3^{Z;zXILM2|ApIEf%x2Z`aaO(GDACnS2duy@dIuQ@jftzaj9#ktUi4jk7Ik1eGK7sz4{gju7a2t z3H?jL=z>eA+;qTBk#t>?K)nDm_ZnN3erDTwDv??quez@So}X}5acw)1%LDrT+KGTT#(BrR@Y?OK?0JCiHgJ<+#ateyVB=Ah9qhM;(R@i5MkiVtr{=nCV zRe3*^qezrhlFQd$K`NQi*_V`s$YN$y#wyi8B-u7I`Cl@?Y9nqY;5pj41?clg$0fk? zJN7g1Pg=42>eU`t$NneaeYR~({r{Fx+xD4;;8Af!{C>u0!lm$tM4C-R9mNO9cJ(a0 zzI-%vOg9!khc^)QR?kB(pe-Zz=@yGC`L8tpE$fZ$ugagrW02=ni&U*tH!3fMBiiSh z9hPXJsFbFDHm{1l+vI`a3hj#(G;K(y824>#C45c?foJpIvi_`@L*~ZpE?ZwSPI@@H zRaJ1!Eddn6Q~LaUBL2{H3e$KeRM|>8RbF?UrC{o5%vw`ghd@UHq_IR!yMpYi?P zna%6@E(PWjE-Gm0-Yf}ruFW6JT@-e;X>vC?*jRsH9{p2mLtY_zJnc<%i`dTiV)Gl| zTmP?|z{)Ek8Q2d|_ zTr;!sqWP&nRrOAD-tcF$>%39=2-Q%vEXqcCu?Syte7d0B`bYki_zZofuyc)zx2*gI z?|OBKW}BwJV6i`w4%0r4J>?BI52nog`rIjcrTTQtGE22Vt(5a&VxoAb>Kw0rTwcwr z<_C=juuB+wi4}C{qPhV*Mp#KKn}Kr0&6ct#aWZU94!dcoPylw-0CKQI5+q&OMko1Pn+_$S%LGc#Kk zuOo7}N9jVvKw`3Ee!_Nq5x&+AJNi+m(**j9BPt&&8_{k){NxFPkf^S8-qZQnm^ARZYi#ClBDQR0D|t#A9iN zwk}bI4MhtKA^0%SA=pK$q^GN{@fXs1WTIhj%m8fxwJvat)9QaWGDL>s1%Ei5L40*6 z#j*4SobPNV?q}?ecXix@>d{@$xAsEuV51VjZ5#OS^x<$8-91vFJ1Lr>SzukjHs>FL zx_Q1h2gm5)EbnbIgh)3x^rClM_86Rsq;laEE`&@n`a?3!o? z(h;AHH{hj9&myhyKh(2O3_648sHx~o!wqO3wOyQPsKaYgsix-PiyigXv@?z-ScemG z(iGm<*-rSL9)W*$jD<7?qx7O94{AsEz^=0QggfXJ=uI2Le_+@yS#L?K;^|LH^5`L= zZ0=_f17C1zJ)a~EkpXUrH%h!;{J_1)^OHa*@pJpQkV=mznhSNp`szTv*ih@wlvTK! zz8d{Ph4Is|O=ufoO>7(4N8jq)ak)oiseV;%WbTH*Fq*cxgK}&{FWU zkui?Q_8iHqN*#+=aQyVrgx~NN&NE4{sSkd~p&*jEbG{ZJ9%}Qs03P!W1^B_;9mM}r zxD9~!qmCT_N89Xx?>|fs;JKmU3()f`qJ}09_8l`vt8^@WU3OX6DEbASE{_uDB6@s_ z3=@2joWxwDQrH*m0zbjeMToKWF%;&eJ|RPO8ze+oJwZL%DH>SWhdPfb*?#bEre64S zHcjF&7fX)@W)9ak|AFQ?j1mw17xt1hi{F`cpnchM&@Q?UvcUFM_{el0p_nPW`Sdi& zBRY}%-ThS366t6?>eEY?ArBpi{uiha$#AXpMaQb)b*_gVcX)5n6-NrUrgFC+lD%Z> zu4~9UV)Coa8^4$CmcV!?L7m7~_$<%ctl{|^@K|qZcH{iN@duvoS)#o9IOZ9Ybv|c@ zbd!61=JBkz*imjo#>eyl*lAa2TKA;c(r*rT(o9Qlw3?;lm)x<{c_2pGqB;bOlR^B8 zK>MIK1fb6C1H7ZIrT|0j6@c#|+6MH!zOpyq`&@X6DIH<(6?~=c541pD6TLdJSc)hf z^EZmGU|#ut;b94kX2?zoDfFVKF*%a=tK=9zO`25|jlQ8uBv(tPiAEXaVv*<&-2+wF zHX(Ty1-i(_p<>Ge$yDnY%wWDMd132?oHr%FD{SW^bIp&%lWljQQqv@Oj`c2IVftH) zS@uV)G;W0cq{HPOJlF7W_)n-_wTW0M(OTK+0r>CY2=>0eEs`Ui&QA5U6TTG`vL5%; zh?g760(qz!myZrom}7K}!ZI|pcqCp&7_AMKbadL&rWQ0uJGri;jV@RqiE`aY`z^n* zWRcUDmXNm|j&VxUX6BrboOP@Wd{4q3ZD@(ZexiwsI+*4hh0Qfyu zy%pd-e=xx5z7~LI%wq@R?b2MifahXcDd72JG4BV@XbYgv)54q5-Nmy=NhnGcz-tw0 zm6P~6*j+{Em?&ryGFM@V+$%=WO!rt{T$p|Gjxv+}&2YC2i}f)M&|$(BQZVmqsE%Ps4qrmZy-i5Jn6n6R4V(&6Q= ztPA`-B_mX@P3j#SR#P?K+S{2^8BJX`kEYrf;xuanH6$W#K!sEHsWNJM^A);n<~+s8 zf5@>8>xjB$sY+Oo^>^KlmZ1rj)W!T$mR|86BqO3# zR7dibFS+Iz;PrvO7r=18AMks|`y1dl%Pj)@u63*f{YWSCL(p%O;UZvPe;|f{{yFG> zmfy6K)x+T9ifL83F(^7&(R}G7;Rf`C{BZel_#<2(JI$lS+r)SA(y(xGC*dq?N|;MH zwfr5hVg8X(i+cik+gmpXTZ>5O%~iCx2KDOuQYGSSwae6)hts%AYFF8Q)3&BJXJD z8yiWlN!#e!8}}gwDA@4dvQB6^iW^{iHV&$CiWk6Bl(W@g;tt{~`V|{KLsJCdfhuC7 z#d9LAXbwd56y2m2i6#i9iW&#LQ2w`^+co1A23;#^M~zdyNApmdTeCuTUrkUE)&0n` zs%KO$p96O_Jx2w*|3XrtB6R*huFM``!T;$u6$Ay%m$vrKY2M#E0G+_CD0s;o4dgkg z%pc7?M_M@8+y>4gh|AU?`>oB0)G>cZ`xMauy&5AbzNR}dFXQ~$_EoTclm`}g^abqCP{$O@>Jsj+m3yeSn$*To;m+wu)`J7SHz zqbP+whVPI?3%i-G;mh#{&^mJ@VT8Adx>~y6y)-Gjw&uywE2b|cq4W}QBDtC!V3-fv ziH6n<#uWG-@zwT+;Scd;9I=Jyw?nt2sn&DUNbx>ww&@CW2T}*Bl;u;OpuU3jl789) zq8kFcbg)MVPt`Wp&GXMBn$W9M8>&BJJpC-{*Xlab>ALpRG`|%cOGQzCdF_(!x{o>| z_Zt*iRY;}SZfN#Ll~BXsIjBxEURx}C?_b^gs&x+;;;-BMDHBYV`CJ7v*=Iz3-;?~I zY(Zc=5}p^rjvz0(({s#L59#J~8EwrqM2fR<;!ntSGSr2+4?^8E4}kyYQNsZ9D^6C_ z^0%z)A!tLYtQEEGP8D0gGkLDk2;%55>Y$+hSX5f zSmGyUNk?dhV+{xguBVzy?_naGPgmeA#bNjw(=GhH9>O+Tc*G&|BQ(YwEIq{FaG7}l z^oG3YT5YyKewoT;Ha!xmWkIe9<_IW9Hrn~fG#1K~*&PE+tmqoioDDO*7V?Ox)?eu? zNQ58PXVd+K@puQ_GGv{jMQoXBtb09MtqUuD>uqH}rjDs<>C3TRr6SaAy}c}9`u-Zb zdy!sc9Im_VP?km*8O?r+TP&sbQa$jW(XYnORk*C4e@VgXl&`X(enUa0q}$|oUyp+E z@vlkFSCPL0CuMDXMBWa%uZ;Ds%K2=2Df`{y&Ftl9CU58&ovL$$$%5USVw$tq_8$0q zd}|)SF!RI6T3*)}4WM7xtA;`R=t{FY{MzjnaRP{MbP{ENJ~dqY2poS6J8j#H48jW$ z*iwXjBX7eYhNsfWG6&R5y90Ym9t$MwT@QaH`>2Bgndc(O^+pEGHra@|roe0;>qz{Q z5yHk>Z5ZG3R78>2xXBD63X@Ie6ij+-PgxGf56p`xm(}G&j9=JN*2A^lyeIN5dDn5# za+S}L8g`~7SGbM1WNlzR5xs_(Z*?X3Jm-*OY8$=W6C|NjTb)Io_9*zb&mNS;x0B&z$^)Jn2>DRw^4BO7`CNASFHpQNb?@|1Xe6hZhVsT-}EhZWBD*~e)Ecf9SiY(|my?ujN{wjjj zzA-)`e^M`v>SuXEkm~E|E0%P8tEpIhTYAjdlDSqj0DtDZW*M#NiVqJ=&=XXA!V{eX znf7WC(bT!oQlRwUV#h${Oo3%w0l)3vfdrcGi&zY=N)oG@A74`pWjt$}^>{aWi@*oQU4eI6hvVDg9*K`KezaNqThRy0dL%{B zg-@Ag3plwc>b=oeQb;zc8c*?Pf~YRrr*WHH(r5Hp?QEnGE3~}OO-EX=g{C!nF`8gM zWd0?Px3rzTjd^qB3$(s{vU!2}4)WUi(Oj*ZhAOQyESt)&BW7l?*;WyODw*zyq1E5z z?{(Ya15;5H;rfOO`KBZCEb6$dRZSCFL)|rep1&7vq{8sd-k&A&0y$TrxI==S)G2ba z^{$@MjZs|I)i*q*?xS~XTT%xUL|~8X9nxe4Jpw-H^|bGKfs*0u$F#1w5oodfWLm@Q z#+ZyPe)XIIJm2LCfge)s zcn0))o;e$!6{`Sx?UtVh{dG>91;p#NmiIGt#$#kff)wU4IyGL#+hKl-UW-qOdTSbh z#l=64UTrcV!EsHZ`qSH?8acY|s{U28XT-{~7uqelmD2H54X72GVkDJ%Y;4PaX-u(f z)0c`jnR84(Q5NV|dM!Odw-DY%+v!}@aj25^&}S-x#CCcwy}o!YbdJ72S2Pxgis*i( zNt%27quQ}@b-?qQPX))d+q61<1MMg0ZE`C*8&=^>H|>=_HSELsRxc+5wF9w%zAuW z^?m?6E8PtM&zGH#fj)0$#shvgB0~YceHDAbckpR(SN|gp9YPgrR-x_V4r`}XEp)6%};WZ4^&%uFk)xni9w$YRPRIs5%hHq>{a@{JLb0 z>1`UL6iEA;UYY(&PS7Rq9>8x4w;SkfAMQuq=eLd@anC=jEx>PhQSW$V?YU!!djDZR z|08dPVV!)B4u#jzL*=8;tr1RowLD#v$qzHlmVXnUT32HVl3$SY*VZ!^k~T?017nUS zXF|v5f6o60`{)yFk%Tpb}V(YKFI^#3HI zb*szPc^k^A z?#@DS*oDP)fn8+r#pRb?zVH3^y*Gd4Gw06D>GU%vch0qQOk&s^tExF=S_oyv$!ZFX zgQ2IfF5d;iBKUl4ns*Rg#EXc#$!ybKg&c8R-FKt?(H6-Vo}zXHr&ePK4Xbae-a)Qp z71l3Df6{kuaiFfZ_`Y7v)z#jWL>h*%wZ5IP6|_03h5LuNg|wC5+tDjwsOdD6F1S}a ztxcdms@%}p^fp&rN6-$nI}0nAVC-WJtMCr<1$$jnmS5uDAr{o$kd1S1k4~;l%eljR zh-TNe&B%8aN&41ZNId4+4OO;myyimz_OhpNlKZ|h?_A3s>UU$!lc_>bn{N`>aIcbSfPQgQJ+gb-G3}Rm0bnC&O zwi2R_w1g=RN{-g8wTvr5W6#$Ov5ct5k5ku$Tk-=%@zT1Jrq|)4;*ZqsHsNejyrlN` zbVcp2cymrc>fRa@`^H(;`n>OV;X3}&geRV_>Q^w9AZH?I8@wZapRJp5fY6;lb4tx@ zM3guruBSzbtZ&^qzOVI*e|KGow@cx#sYXKWn^HJBDVS9Hph9-+T;0#UX$3FrTO(6z zM&x(!bb`$_NZw`NKIF&R%3N7(4sNfF%68YD!j9JlWiG92E$CU=$kzxs8_YenL^}dI zCD7P)jpdzCHF(d3;saQX@_x}1@En@p-}5pR;%T6KXrit5d7?wyD{)gzIxbK6E5YKc zC+{aX63V>gj(LeQ5@vh4FuM|O#iuhD+#M6&#Eo x_23H^ThEyD)(h$Fh`q*Co_i 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�bbGov5Bg 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 literal 0 HcmV?d00001 From ceefeb245bafcc41fe9ac2af1dcd645ef9504c9e Mon Sep 17 00:00:00 2001 From: Xu <34770031+Blinue@users.noreply.github.com> Date: Mon, 22 Jan 2024 20:55:33 +0800 Subject: [PATCH 102/155] =?UTF-8?q?chore:=20=E6=9B=B4=E6=96=B0=E4=BE=9D?= =?UTF-8?q?=E8=B5=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Magpie.App/conanfile.txt | 2 +- src/Magpie/conanfile.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Magpie.App/conanfile.txt b/src/Magpie.App/conanfile.txt index 14884cd1e..f0e8967ad 100644 --- a/src/Magpie.App/conanfile.txt +++ b/src/Magpie.App/conanfile.txt @@ -1,5 +1,5 @@ [requires] -fmt/10.2.0 +fmt/10.2.1 spdlog/1.13.0 parallel-hashmap/1.37 rapidjson/cci.20230929 diff --git a/src/Magpie/conanfile.txt b/src/Magpie/conanfile.txt index 3f2293cb8..e2b38b9f1 100644 --- a/src/Magpie/conanfile.txt +++ b/src/Magpie/conanfile.txt @@ -1,5 +1,5 @@ [requires] -fmt/10.2.0 +fmt/10.2.1 spdlog/1.13.0 parallel-hashmap/1.37 From fcfec25831b6b2ddb21608c92dbfdf9a31dbc66e Mon Sep 17 00:00:00 2001 From: Xu <34770031+Blinue@users.noreply.github.com> Date: Mon, 12 Feb 2024 22:24:59 +0800 Subject: [PATCH 103/155] =?UTF-8?q?chore:=20=E9=87=8D=E6=96=B0=E7=A6=81?= =?UTF-8?q?=E7=94=A8=20Up-to-date=20=E6=A3=80=E6=9F=A5=EF=BC=8C=E4=BB=A5?= =?UTF-8?q?=E5=8F=8A=E6=9D=82=E9=A1=B9=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Magpie.App/App.cpp | 5 ----- src/Magpie.App/App.h | 18 +++--------------- src/Magpie.App/App.idl | 5 ++--- src/Magpie/Magpie.vcxproj | 3 +++ src/Magpie/MainWindow.cpp | 20 ++++++++++---------- src/Magpie/MainWindow.h | 4 ++-- src/Magpie/XamlApp.cpp | 2 +- src/Magpie/XamlApp.h | 6 +++--- src/Magpie/XamlWindow.h | 23 ++++++++--------------- 9 files changed, 32 insertions(+), 54 deletions(-) diff --git a/src/Magpie.App/App.cpp b/src/Magpie.App/App.cpp index 043c60d4e..9bfe6acd3 100644 --- a/src/Magpie.App/App.cpp +++ b/src/Magpie.App/App.cpp @@ -127,12 +127,7 @@ void App::IsShowTrayIconChanged(event_token const& token) { } void App::HwndMain(uint64_t value) noexcept { - if (_hwndMain == (HWND)value) { - return; - } - _hwndMain = (HWND)value; - _hwndMainChangedEvent(*this, value); } void App::RootPage(Magpie::App::RootPage const& rootPage) noexcept { diff --git a/src/Magpie.App/App.h b/src/Magpie.App/App.h index 3213a243c..ad4ae3685 100644 --- a/src/Magpie.App/App.h +++ b/src/Magpie.App/App.h @@ -27,14 +27,8 @@ class App : public App_base { return (uint64_t)_hwndMain; } - void HwndMain(uint64_t value) noexcept; - - event_token HwndMainChanged(EventHandler const& handler) { - return _hwndMainChangedEvent.add(handler); - } - - void HwndMainChanged(event_token const& token) noexcept { - _hwndMainChangedEvent.remove(token); + void HwndMain(uint64_t value) noexcept { + _hwndMain = (HWND)value; } // 在由外部源引发的回调中可能返回 nullptr @@ -51,14 +45,8 @@ class App : public App_base { private: Hosting::WindowsXamlManager _windowsXamlManager{ nullptr }; - - HWND _hwndMain{}; - event> _hwndMainChangedEvent; - weak_ref _rootPage{ nullptr }; - - event> _hostWndFocusChangedEvent; - bool _isHostWndFocused = false; + HWND _hwndMain = NULL; bool _isClosed = false; //////////////////////////////////////////////////// diff --git a/src/Magpie.App/App.idl b/src/Magpie.App/App.idl index 980fb4a2e..bcf2d350a 100644 --- a/src/Magpie.App/App.idl +++ b/src/Magpie.App/App.idl @@ -11,6 +11,8 @@ namespace Magpie.App { #include "TextBlockHelper.idl" #include "SimpleStackPanel.idl" #include "WrapPanel.idl" +#include "CaptionButtonsControl.idl" +#include "TitleBarControl.idl" #include "PageFrame.idl" #include "SettingsCard.idl" #include "SettingsExpander.idl" @@ -35,8 +37,6 @@ namespace Magpie.App { #include "ScalingConfigurationPage.idl" #include "ProfilePage.idl" #include "SettingsPage.idl" -#include "CaptionButtonsControl.idl" -#include "TitleBarControl.idl" namespace Magpie.App { enum ShortcutAction { @@ -71,7 +71,6 @@ namespace Magpie.App { event Windows.Foundation.EventHandler IsShowTrayIconChanged; UInt64 HwndMain; - event Windows.Foundation.EventHandler HwndMainChanged; RootPage RootPage; diff --git a/src/Magpie/Magpie.vcxproj b/src/Magpie/Magpie.vcxproj index d5fa8b679..639458f61 100644 --- a/src/Magpie/Magpie.vcxproj +++ b/src/Magpie/Magpie.vcxproj @@ -10,6 +10,9 @@ 10.0.22621.0 $(SolutionDir)bin\$(Platform)\$(Configuration)\ + + + true diff --git a/src/Magpie/MainWindow.cpp b/src/Magpie/MainWindow.cpp index 069a4094b..03ddd15d9 100644 --- a/src/Magpie/MainWindow.cpp +++ b/src/Magpie/MainWindow.cpp @@ -12,13 +12,14 @@ namespace Magpie { bool MainWindow::Create(HINSTANCE hInstance, winrt::Point windowCenter, winrt::Size windowSizeInDips, bool isMaximized) noexcept { static const int _ = [](HINSTANCE hInstance) { - WNDCLASSEXW wcex{}; - wcex.cbSize = sizeof(wcex); - wcex.lpfnWndProc = _WndProc; - wcex.hInstance = hInstance; - wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(CommonSharedConstants::IDI_APP)); - wcex.hCursor = LoadCursor(nullptr, IDC_ARROW); - wcex.lpszClassName = CommonSharedConstants::MAIN_WINDOW_CLASS_NAME; + WNDCLASSEXW wcex{ + .cbSize = sizeof(wcex), + .lpfnWndProc = _WndProc, + .hInstance = hInstance, + .hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(CommonSharedConstants::IDI_APP)), + .hCursor = LoadCursor(nullptr, IDC_ARROW), + .lpszClassName = CommonSharedConstants::MAIN_WINDOW_CLASS_NAME + }; RegisterClassEx(&wcex); wcex.style = CS_DBLCLKS; @@ -93,8 +94,6 @@ bool MainWindow::Create(HINSTANCE hInstance, winrt::Point windowCenter, winrt::S } Win32Utils::SetForegroundWindow(_hWnd); - - _isWindowShown = true; }); // 创建标题栏窗口,它是主窗口的子窗口。我们将它置于 XAML Islands 窗口之上以防止鼠标事件被吞掉 @@ -289,6 +288,7 @@ std::pair MainWindow::_CreateWindow(HINSTANCE hInstance, winrt::Poi hInstance, this ); + assert(_hWnd); if (windowSize.cx == 0) { const HMONITOR hMon = MonitorFromWindow(_hWnd, MONITOR_DEFAULTTONEAREST); @@ -339,7 +339,7 @@ std::pair MainWindow::_CreateWindow(HINSTANCE hInstance, winrt::Poi } } -void MainWindow::_UpdateTheme() { +void MainWindow::_UpdateTheme() noexcept { XamlWindowT::_SetTheme(_content.ActualTheme() == winrt::ElementTheme::Dark); } diff --git a/src/Magpie/MainWindow.h b/src/Magpie/MainWindow.h index cd4dc4010..3fa2f7cfe 100644 --- a/src/Magpie/MainWindow.h +++ b/src/Magpie/MainWindow.h @@ -5,7 +5,7 @@ namespace Magpie { class MainWindow : public XamlWindowT { - friend class base_type; + friend base_type; public: bool Create(HINSTANCE hInstance, winrt::Point windowCenter, winrt::Size windowSizeInDips, bool isMaximized) noexcept; @@ -17,7 +17,7 @@ class MainWindow : public XamlWindowT private: std::pair _CreateWindow(HINSTANCE hInstance, winrt::Point windowCenter, winrt::Size windowSizeInDips) noexcept; - void _UpdateTheme(); + void _UpdateTheme() noexcept; static LRESULT CALLBACK _TitleBarWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) noexcept; diff --git a/src/Magpie/XamlApp.cpp b/src/Magpie/XamlApp.cpp index 238b1b248..ed01ad243 100644 --- a/src/Magpie/XamlApp.cpp +++ b/src/Magpie/XamlApp.cpp @@ -214,7 +214,7 @@ void XamlApp::_InitializeLogger() { winrt::Magpie::App::LoggerHelper::Initialize((uint64_t)&logger); } -bool XamlApp::_CreateMainWindow() { +bool XamlApp::_CreateMainWindow() noexcept { if (!_mainWindow.Create(_hInst, _mainWindowCenter, _mainWindowSizeInDips, _isMainWndMaximized)) { return false; } diff --git a/src/Magpie/XamlApp.h b/src/Magpie/XamlApp.h index ce17690d6..696dc94a6 100644 --- a/src/Magpie/XamlApp.h +++ b/src/Magpie/XamlApp.h @@ -31,11 +31,11 @@ class XamlApp { XamlApp(); ~XamlApp(); - bool _CheckSingleInstance(); + bool _CheckSingleInstance() noexcept; - void _InitializeLogger(); + void _InitializeLogger() noexcept; - bool _CreateMainWindow(); + bool _CreateMainWindow() noexcept; void _QuitWithoutMainWindow(); diff --git a/src/Magpie/XamlWindow.h b/src/Magpie/XamlWindow.h index 7b48d2850..4acd3ea92 100644 --- a/src/Magpie/XamlWindow.h +++ b/src/Magpie/XamlWindow.h @@ -19,10 +19,6 @@ class XamlWindowT { } } - operator bool() const noexcept { - return _hWnd; - } - void HandleMessage(const MSG& msg) { // XAML Islands 会吞掉 Alt+F4,需要特殊处理 // https://github.com/microsoft/microsoft-ui-xaml/issues/2408 @@ -47,6 +43,10 @@ class XamlWindowT { return _hWnd; } + operator bool() const noexcept { + return _hWnd; + } + const C& Content() const noexcept { return _content; } @@ -161,6 +161,8 @@ class XamlWindowT { return 0; } + _isWindowShown = IsWindowVisible(_hWnd); + NCCALCSIZE_PARAMS* params = (NCCALCSIZE_PARAMS*)lParam; RECT& clientRect = params->rgrc[0]; @@ -236,7 +238,6 @@ class XamlWindowT { // XAML Islands 和它上面的标题栏窗口都会吞掉鼠标事件,因此能到达这里的唯一机会 // 是上边框。保险起见做一些额外检查。 - if (!_isMaximized) { RECT rcWindow; GetWindowRect(_hWnd, &rcWindow); @@ -306,15 +307,6 @@ class XamlWindowT { EndPaint(_hWnd, &ps); return 0; } - case WM_SHOWWINDOW: - { - if (wParam == TRUE) { - // 将焦点置于 XAML Islands 窗口可以修复按 Alt 键会导致 UI 无法交互的问题 - SetFocus(_hwndXamlIsland); - } - - break; - } case WM_KEYDOWN: { if (wParam == VK_TAB) { @@ -466,7 +458,6 @@ class XamlWindowT { uint32_t _currentDpi = USER_DEFAULT_SCREEN_DPI; bool _isMaximized = false; - bool _isWindowShown = false; bool _isDarkTheme = false; private: @@ -540,6 +531,8 @@ class XamlWindowT { HWND _hwndXamlIsland = NULL; winrt::DesktopWindowXamlSource _xamlSource{ nullptr }; winrt::com_ptr _xamlSourceNative2; + + bool _isWindowShown = false; }; } From abf58e86460cd139254803298fab0bb0be160779 Mon Sep 17 00:00:00 2001 From: Xu <34770031+Blinue@users.noreply.github.com> Date: Mon, 12 Feb 2024 22:34:32 +0800 Subject: [PATCH 104/155] =?UTF-8?q?chore:=20=E4=BF=AE=E5=A4=8D=E7=BC=96?= =?UTF-8?q?=E8=AF=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Magpie.App/App.cpp | 4 ---- src/Magpie/XamlApp.cpp | 4 ++-- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/src/Magpie.App/App.cpp b/src/Magpie.App/App.cpp index 9bfe6acd3..a2a3af561 100644 --- a/src/Magpie.App/App.cpp +++ b/src/Magpie.App/App.cpp @@ -126,10 +126,6 @@ void App::IsShowTrayIconChanged(event_token const& token) { AppSettings::Get().IsShowTrayIconChanged(token); } -void App::HwndMain(uint64_t value) noexcept { - _hwndMain = (HWND)value; -} - void App::RootPage(Magpie::App::RootPage const& rootPage) noexcept { // 显示主窗口前等待 EffectsService 完成初始化 EffectsService::Get().WaitForInitialize(); diff --git a/src/Magpie/XamlApp.cpp b/src/Magpie/XamlApp.cpp index ed01ad243..abd01d266 100644 --- a/src/Magpie/XamlApp.cpp +++ b/src/Magpie/XamlApp.cpp @@ -157,7 +157,7 @@ XamlApp::XamlApp() {} XamlApp::~XamlApp() {} -bool XamlApp::_CheckSingleInstance() { +bool XamlApp::_CheckSingleInstance() noexcept { static constexpr const wchar_t* SINGLE_INSTANCE_MUTEX_NAME = L"{4C416227-4A30-4A2F-8F23-8701544DD7D6}"; static constexpr const wchar_t* ELEVATED_MUTEX_NAME = L"{E494C456-F587-4DAF-B68F-366278D31C45}"; @@ -200,7 +200,7 @@ bool XamlApp::_CheckSingleInstance() { return true; } -void XamlApp::_InitializeLogger() { +void XamlApp::_InitializeLogger() noexcept { Logger& logger = Logger::Get(); logger.Initialize( spdlog::level::info, From e3dc41b7a93050beeac6b183dbdb62e73486a403 Mon Sep 17 00:00:00 2001 From: Xu <34770031+Blinue@users.noreply.github.com> Date: Thu, 15 Feb 2024 12:13:10 +0800 Subject: [PATCH 105/155] =?UTF-8?q?refactor:=20XamlWindow=20=E7=A6=81?= =?UTF-8?q?=E6=AD=A2=E5=AD=90=E7=B1=BB=E7=9B=B4=E6=8E=A5=E8=AE=BF=E9=97=AE?= =?UTF-8?q?=E6=88=90=E5=91=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Magpie.App/CaptionButtonsControl.cpp | 4 + src/Magpie/MainWindow.cpp | 115 ++++++++++++----------- src/Magpie/XamlWindow.h | 35 +++++-- 3 files changed, 88 insertions(+), 66 deletions(-) diff --git a/src/Magpie.App/CaptionButtonsControl.cpp b/src/Magpie.App/CaptionButtonsControl.cpp index 9090ddcd8..872f96530 100644 --- a/src/Magpie.App/CaptionButtonsControl.cpp +++ b/src/Magpie.App/CaptionButtonsControl.cpp @@ -64,8 +64,10 @@ void CaptionButtonsControl::ReleaseButton(CaptionButton button) { switch (_pressedButton.value()) { case CaptionButton::Minimize: + { PostMessage(hwndMain, WM_SYSCOMMAND, SC_MINIMIZE, 0); break; + } case CaptionButton::Maximize: { POINT cursorPos; @@ -80,9 +82,11 @@ void CaptionButtonsControl::ReleaseButton(CaptionButton button) { break; } case CaptionButton::Close: + { PostMessage(hwndMain, WM_SYSCOMMAND, SC_CLOSE, 0); break; } + } } _pressedButton.reset(); diff --git a/src/Magpie/MainWindow.cpp b/src/Magpie/MainWindow.cpp index 03ddd15d9..372de1aa7 100644 --- a/src/Magpie/MainWindow.cpp +++ b/src/Magpie/MainWindow.cpp @@ -33,32 +33,32 @@ bool MainWindow::Create(HINSTANCE hInstance, winrt::Point windowCenter, winrt::S const auto& [posToSet, sizeToSet] = _CreateWindow(hInstance, windowCenter, windowSizeInDips); - if (!_hWnd) { + if (!Handle()) { return false; } - _SetContent(winrt::Magpie::App::RootPage()); + _Content(winrt::Magpie::App::RootPage()); - _content.ActualThemeChanged([this](winrt::FrameworkElement const&, winrt::IInspectable const&) { + _Content().ActualThemeChanged([this](winrt::FrameworkElement const&, winrt::IInspectable const&) { _UpdateTheme(); }); _UpdateTheme(); - - // 窗口尚未显示无法最大化,所以我们设置 _isMaximized 使 XamlWindow 估计 XAML Islands 窗口尺寸。 - // 否则在显示窗口时可能会看到 NavigationView 的导航栏的展开动画。 - _isMaximized = isMaximized; + + if (isMaximized) { + _SetInitialMaximized(); + } // 1. 设置初始 XAML Islands 窗口的尺寸 // 2. 刷新窗口边框 // 3. 无法获知 DPI 的情况下 _CreateWindow 创建的窗口尺寸为零,在这里延后设置窗口位置 // 4. 防止窗口显示时背景闪烁: https://stackoverflow.com/questions/69715610/how-to-initialize-the-background-color-of-win32-app-to-something-other-than-whit - SetWindowPos(_hWnd, NULL, posToSet.x, posToSet.y, sizeToSet.cx, sizeToSet.cy, + SetWindowPos(Handle(), NULL, posToSet.x, posToSet.y, sizeToSet.cx, sizeToSet.cy, (sizeToSet.cx == 0 ? (SWP_NOMOVE | SWP_NOSIZE) : 0) | SWP_FRAMECHANGED | SWP_NOACTIVATE | SWP_NOCOPYBITS); // Xaml 控件加载完成后显示主窗口 - _content.Loaded([this, isMaximized](winrt::IInspectable const&, winrt::RoutedEventArgs const&) { + _Content().Loaded([this, isMaximized](winrt::IInspectable const&, winrt::RoutedEventArgs const&) { if (isMaximized) { - // ShowWindow(_hWnd, SW_SHOWMAXIMIZED) 会显示错误的动画。因此我们以窗口化显示, + // ShowWindow(Handle(), SW_SHOWMAXIMIZED) 会显示错误的动画。因此我们以窗口化显示, // 但位置和大小都和最大化相同,显示完毕后将状态设为最大化。 // // 在此过程中,_isMaximized 始终是 true。 @@ -66,17 +66,17 @@ bool MainWindow::Create(HINSTANCE hInstance, winrt::Point windowCenter, winrt::S // 保存原始窗口化位置 WINDOWPLACEMENT wp{}; wp.length = sizeof(wp); - GetWindowPlacement(_hWnd, &wp); + GetWindowPlacement(Handle(), &wp); // 查询最大化窗口位置 - if (HMONITOR hMon = MonitorFromWindow(_hWnd, MONITOR_DEFAULTTONEAREST)) { + if (HMONITOR hMon = MonitorFromWindow(Handle(), MONITOR_DEFAULTTONEAREST)) { MONITORINFO mi{}; mi.cbSize = sizeof(mi); GetMonitorInfo(hMon, &mi); // 播放窗口显示动画 SetWindowPos( - _hWnd, + Handle(), NULL, mi.rcWork.left, mi.rcWork.top, @@ -88,12 +88,12 @@ bool MainWindow::Create(HINSTANCE hInstance, winrt::Point windowCenter, winrt::S // 将状态设为最大化,也还原了原始的窗口化位置 wp.showCmd = SW_SHOWMAXIMIZED; - SetWindowPlacement(_hWnd, &wp); + SetWindowPlacement(Handle(), &wp); } else { - ShowWindow(_hWnd, SW_SHOWNORMAL); + ShowWindow(Handle(), SW_SHOWNORMAL); } - Win32Utils::SetForegroundWindow(_hWnd); + Win32Utils::SetForegroundWindow(Handle()); }); // 创建标题栏窗口,它是主窗口的子窗口。我们将它置于 XAML Islands 窗口之上以防止鼠标事件被吞掉 @@ -109,7 +109,7 @@ bool MainWindow::Create(HINSTANCE hInstance, winrt::Point windowCenter, winrt::S L"", WS_CHILD | WS_MINIMIZEBOX | WS_MAXIMIZEBOX, 0, 0, 0, 0, - _hWnd, + Handle(), nullptr, hInstance, this @@ -130,7 +130,7 @@ bool MainWindow::Create(HINSTANCE hInstance, winrt::Point windowCenter, winrt::S ); } - _content.TitleBar().SizeChanged([this](winrt::IInspectable const&, winrt::SizeChangedEventArgs const&) { + _Content().TitleBar().SizeChanged([this](winrt::IInspectable const&, winrt::SizeChangedEventArgs const&) { _ResizeTitleBarWindow(); }); @@ -138,11 +138,11 @@ bool MainWindow::Create(HINSTANCE hInstance, winrt::Point windowCenter, winrt::S } void MainWindow::Show() const noexcept { - if (IsIconic(_hWnd)) { - ShowWindow(_hWnd, SW_RESTORE); + if (IsIconic(Handle())) { + ShowWindow(Handle(), SW_RESTORE); } - Win32Utils::SetForegroundWindow(_hWnd); + Win32Utils::SetForegroundWindow(Handle()); } LRESULT MainWindow::_MessageHandler(UINT msg, WPARAM wParam, LPARAM lParam) noexcept { @@ -151,7 +151,7 @@ LRESULT MainWindow::_MessageHandler(UINT msg, WPARAM wParam, LPARAM lParam) noex { LRESULT ret = base_type::_MessageHandler(WM_SIZE, wParam, lParam); _ResizeTitleBarWindow(); - _content.TitleBar().CaptionButtons().IsWindowMaximized(_isMaximized); + _Content().TitleBar().CaptionButtons().IsWindowMaximized(_IsMaximized()); return ret; } case WM_GETMINMAXINFO: @@ -159,8 +159,8 @@ LRESULT MainWindow::_MessageHandler(UINT msg, WPARAM wParam, LPARAM lParam) noex // 设置窗口最小尺寸 MINMAXINFO* mmi = (MINMAXINFO*)lParam; mmi->ptMinTrackSize = { - std::lroundf(500 * _currentDpi / float(USER_DEFAULT_SCREEN_DPI)), - std::lroundf(300 * _currentDpi / float(USER_DEFAULT_SCREEN_DPI)) + std::lroundf(500 * _CurrentDpi() / float(USER_DEFAULT_SCREEN_DPI)), + std::lroundf(300 * _CurrentDpi() / float(USER_DEFAULT_SCREEN_DPI)) }; return 0; } @@ -177,7 +177,7 @@ LRESULT MainWindow::_MessageHandler(UINT msg, WPARAM wParam, LPARAM lParam) noex break; } - HMENU systemMenu = GetSystemMenu(_hWnd, FALSE); + HMENU systemMenu = GetSystemMenu(Handle(), FALSE); // 根据窗口状态更新选项 MENUITEMINFO mii{}; @@ -188,24 +188,25 @@ LRESULT MainWindow::_MessageHandler(UINT msg, WPARAM wParam, LPARAM lParam) noex mii.fState = enabled ? MF_ENABLED : MF_DISABLED; SetMenuItemInfo(systemMenu, item, FALSE, &mii); }; - setState(SC_RESTORE, _isMaximized); - setState(SC_MOVE, !_isMaximized); - setState(SC_SIZE, !_isMaximized); + const bool isMaximized = _IsMaximized(); + setState(SC_RESTORE, isMaximized); + setState(SC_MOVE, !isMaximized); + setState(SC_SIZE, !isMaximized); setState(SC_MINIMIZE, true); - setState(SC_MAXIMIZE, !_isMaximized); + setState(SC_MAXIMIZE, !isMaximized); setState(SC_CLOSE, true); SetMenuDefaultItem(systemMenu, UINT_MAX, FALSE); - BOOL cmd = TrackPopupMenu(systemMenu, TPM_RETURNCMD, cursorPt.x, cursorPt.y, 0, _hWnd, nullptr); + BOOL cmd = TrackPopupMenu(systemMenu, TPM_RETURNCMD, cursorPt.x, cursorPt.y, 0, Handle(), nullptr); if (cmd != 0) { - PostMessage(_hWnd, WM_SYSCOMMAND, cmd, 0); + PostMessage(Handle(), WM_SYSCOMMAND, cmd, 0); } } break; } case WM_ACTIVATE: { - _content.TitleBar().IsWindowActive(LOWORD(wParam) != WA_INACTIVE); + _Content().TitleBar().IsWindowActive(LOWORD(wParam) != WA_INACTIVE); break; } case WM_DESTROY: @@ -288,15 +289,15 @@ std::pair MainWindow::_CreateWindow(HINSTANCE hInstance, winrt::Poi hInstance, this ); - assert(_hWnd); + assert(Handle()); if (windowSize.cx == 0) { - const HMONITOR hMon = MonitorFromWindow(_hWnd, MONITOR_DEFAULTTONEAREST); + const HMONITOR hMon = MonitorFromWindow(Handle(), MONITOR_DEFAULTTONEAREST); MONITORINFO mi{ sizeof(mi) }; GetMonitorInfo(hMon, &mi); - const float dpiFactor = _currentDpi / float(USER_DEFAULT_SCREEN_DPI); + const float dpiFactor = _CurrentDpi() / float(USER_DEFAULT_SCREEN_DPI); const winrt::Size workingAreaSizeInDips = { (mi.rcWork.right - mi.rcWork.left) / dpiFactor, (mi.rcWork.bottom - mi.rcWork.top) / dpiFactor @@ -329,7 +330,7 @@ std::pair MainWindow::_CreateWindow(HINSTANCE hInstance, winrt::Poi // 确保启动位置在屏幕工作区内 RECT targetRect; - GetWindowRect(_hWnd, &targetRect); + GetWindowRect(Handle(), &targetRect); windowPos.x = std::clamp(targetRect.left, mi.rcWork.left, mi.rcWork.right - windowSize.cx); windowPos.y = std::clamp(targetRect.top, mi.rcWork.top, mi.rcWork.bottom - windowSize.cy); @@ -340,7 +341,7 @@ std::pair MainWindow::_CreateWindow(HINSTANCE hInstance, winrt::Poi } void MainWindow::_UpdateTheme() noexcept { - XamlWindowT::_SetTheme(_content.ActualTheme() == winrt::ElementTheme::Dark); + XamlWindowT::_SetTheme(_Content().ActualTheme() == winrt::ElementTheme::Dark); } LRESULT MainWindow::_TitleBarWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) noexcept { @@ -376,17 +377,17 @@ LRESULT MainWindow::_TitleBarMessageHandler(UINT msg, WPARAM wParam, LPARAM lPar return HTNOWHERE; } - if (!_isMaximized && cursorPos.y + (int)_GetTopBorderHeight() < _GetResizeHandleHeight()) { + if (!_IsMaximized() && cursorPos.y + (int)_GetTopBorderHeight() < _GetResizeHandleHeight()) { // 鼠标位于上边框 return HTTOP; } static const winrt::Size buttonSizeInDips = [this]() { - return _content.TitleBar().CaptionButtons().CaptionButtonSize(); + return _Content().TitleBar().CaptionButtons().CaptionButtonSize(); }(); - const float buttonWidthInPixels = buttonSizeInDips.Width * _currentDpi / USER_DEFAULT_SCREEN_DPI; - const float buttonHeightInPixels = buttonSizeInDips.Height * _currentDpi / USER_DEFAULT_SCREEN_DPI; + const float buttonWidthInPixels = buttonSizeInDips.Width * _CurrentDpi() / USER_DEFAULT_SCREEN_DPI; + const float buttonHeightInPixels = buttonSizeInDips.Height * _CurrentDpi() / USER_DEFAULT_SCREEN_DPI; if (cursorPos.y >= buttonHeightInPixels) { // 鼠标位于标题按钮下方,如果标题栏很宽,这里也可以拖动 @@ -418,7 +419,7 @@ LRESULT MainWindow::_TitleBarMessageHandler(UINT msg, WPARAM wParam, LPARAM lPar [[fallthrough]]; case WM_NCMOUSEMOVE: { - auto captionButtons = _content.TitleBar().CaptionButtons(); + auto captionButtons = _Content().TitleBar().CaptionButtons(); // 将 hover 状态通知 CaptionButtons。标题栏窗口拦截了 XAML Islands 中的标题栏 // 控件的鼠标消息,标题栏按钮的状态由我们手动控制。 @@ -429,7 +430,7 @@ LRESULT MainWindow::_TitleBarMessageHandler(UINT msg, WPARAM wParam, LPARAM lPar captionButtons.LeaveButtons(); // 将 HTTOP 传给主窗口才能通过上边框调整窗口高度 - return SendMessage(_hWnd, msg, wParam, lParam); + return SendMessage(Handle(), msg, wParam, lParam); } case HTMINBUTTON: case HTMAXBUTTON: @@ -464,13 +465,13 @@ LRESULT MainWindow::_TitleBarMessageHandler(UINT msg, WPARAM wParam, LPARAM lPar GetCursorPos(&cursorPos); // 先检查鼠标是否在主窗口上,如果正在显示文字提示,会返回 _hwndTitleBar HWND hwndUnderCursor = WindowFromPoint(cursorPos); - if (hwndUnderCursor != _hWnd && hwndUnderCursor != _hwndTitleBar) { - _content.TitleBar().CaptionButtons().LeaveButtons(); + if (hwndUnderCursor != Handle() && hwndUnderCursor != _hwndTitleBar) { + _Content().TitleBar().CaptionButtons().LeaveButtons(); } else { // 然后检查鼠标在标题栏上的位置 LRESULT hit = SendMessage(_hwndTitleBar, WM_NCHITTEST, 0, MAKELPARAM(cursorPos.x, cursorPos.y)); if (hit != HTMINBUTTON && hit != HTMAXBUTTON && hit != HTCLOSE) { - _content.TitleBar().CaptionButtons().LeaveButtons(); + _Content().TitleBar().CaptionButtons().LeaveButtons(); } } @@ -487,12 +488,12 @@ LRESULT MainWindow::_TitleBarMessageHandler(UINT msg, WPARAM wParam, LPARAM lPar case HTCAPTION: { // 将 HTTOP 传给主窗口才能通过上边框调整窗口高度 - return SendMessage(_hWnd, msg, wParam, lParam); + return SendMessage(Handle(), msg, wParam, lParam); } case HTMINBUTTON: case HTMAXBUTTON: case HTCLOSE: - _content.TitleBar().CaptionButtons().PressButton((winrt::Magpie::App::CaptionButton)wParam); + _Content().TitleBar().CaptionButtons().PressButton((winrt::Magpie::App::CaptionButton)wParam); // 在标题栏按钮上按下左键后我们便捕获光标,这样才能在释放时得到通知。注意捕获光标后 // 便不会再收到 NC 族消息,这就是为什么我们要处理 WM_MOUSEMOVE 和 WM_LBUTTONUP SetCapture(_hwndTitleBar); @@ -518,17 +519,17 @@ LRESULT MainWindow::_TitleBarMessageHandler(UINT msg, WPARAM wParam, LPARAM lPar case HTCAPTION: { // 在可拖拽区域或上边框释放左键,将此消息传递给主窗口 - _content.TitleBar().CaptionButtons().ReleaseButtons(); - return SendMessage(_hWnd, msg, wParam, lParam); + _Content().TitleBar().CaptionButtons().ReleaseButtons(); + return SendMessage(Handle(), msg, wParam, lParam); } case HTMINBUTTON: case HTMAXBUTTON: case HTCLOSE: // 在标题栏按钮上释放左键 - _content.TitleBar().CaptionButtons().ReleaseButton((winrt::Magpie::App::CaptionButton)wParam); + _Content().TitleBar().CaptionButtons().ReleaseButton((winrt::Magpie::App::CaptionButton)wParam); break; default: - _content.TitleBar().CaptionButtons().ReleaseButtons(); + _Content().TitleBar().CaptionButtons().ReleaseButtons(); } return 0; @@ -537,7 +538,7 @@ LRESULT MainWindow::_TitleBarMessageHandler(UINT msg, WPARAM wParam, LPARAM lPar case WM_NCRBUTTONDBLCLK: case WM_NCRBUTTONUP: // 不关心右键,将它们传递给主窗口 - return SendMessage(_hWnd, msg, wParam, lParam); + return SendMessage(Handle(), msg, wParam, lParam); } return DefWindowProc(_hwndTitleBar, msg, wParam, lParam); @@ -548,13 +549,13 @@ void MainWindow::_ResizeTitleBarWindow() noexcept { return; } - auto titleBar = _content.TitleBar(); + auto titleBar = _Content().TitleBar(); // 获取标题栏的边框矩形 winrt::Rect rect{0.0f, 0.0f, (float)titleBar.ActualWidth(), (float)titleBar.ActualHeight()}; - rect = titleBar.TransformToVisual(_content).TransformBounds(rect); + rect = titleBar.TransformToVisual(_Content()).TransformBounds(rect); - const float dpiScale = _currentDpi / float(USER_DEFAULT_SCREEN_DPI); + const float dpiScale = _CurrentDpi() / float(USER_DEFAULT_SCREEN_DPI); // 将标题栏窗口置于 XAML Islands 窗口上方 const int titleBarWidth = (int)std::ceilf(rect.Width * dpiScale); @@ -582,7 +583,7 @@ void MainWindow::_ResizeTitleBarWindow() noexcept { // 设置标题栏窗口的最大化样式,这样才能展示正确的文字提示 LONG_PTR style = GetWindowLongPtr(_hwndTitleBar, GWL_STYLE); SetWindowLongPtr(_hwndTitleBar, GWL_STYLE, - _isMaximized ? style | WS_MAXIMIZE : style & ~WS_MAXIMIZE); + _IsMaximized() ? style | WS_MAXIMIZE : style & ~WS_MAXIMIZE); } } diff --git a/src/Magpie/XamlWindow.h b/src/Magpie/XamlWindow.h index 4acd3ea92..a9a7e4b1f 100644 --- a/src/Magpie/XamlWindow.h +++ b/src/Magpie/XamlWindow.h @@ -75,7 +75,7 @@ class XamlWindowT { return DefWindowProc(hWnd, msg, wParam, lParam); } - void _SetContent(C const& content) { + void _Content(C const& content) { _content = content; // 初始化 XAML Islands @@ -99,6 +99,24 @@ class XamlWindowT { }); } + const C& _Content() const noexcept { + return _content; + } + + uint32_t _CurrentDpi() const noexcept { + return _currentDpi; + } + + bool _IsMaximized() const noexcept { + return _isMaximized; + } + + // 窗口尚未显示无法最大化,通过这个方法设置 _isMaximized 使 XamlWindow 估计 XAML Islands 窗口尺寸。 + // 否则在显示窗口时可能会看到 NavigationView 的导航栏的展开动画。 + void _SetInitialMaximized() noexcept { + _isMaximized = true; + } + void _SetTheme(bool isDarkTheme) noexcept { _isDarkTheme = isDarkTheme; @@ -447,19 +465,12 @@ class XamlWindowT { } } - int _GetResizeHandleHeight() noexcept { + int _GetResizeHandleHeight() const noexcept { // 没有 SM_CYPADDEDBORDER return GetSystemMetricsForDpi(SM_CXPADDEDBORDER, _currentDpi) + GetSystemMetricsForDpi(SM_CYSIZEFRAME, _currentDpi); } - HWND _hWnd = NULL; - C _content{ nullptr }; - - uint32_t _currentDpi = USER_DEFAULT_SCREEN_DPI; - bool _isMaximized = false; - bool _isDarkTheme = false; - private: void _UpdateIslandPosition(int width, int height) const noexcept { if (!IsWindowVisible(_hWnd) && _isMaximized) { @@ -528,11 +539,17 @@ class XamlWindowT { winrt::event> _destroyedEvent; + HWND _hWnd = NULL; HWND _hwndXamlIsland = NULL; winrt::DesktopWindowXamlSource _xamlSource{ nullptr }; winrt::com_ptr _xamlSourceNative2; + C _content{ nullptr }; + + uint32_t _currentDpi = USER_DEFAULT_SCREEN_DPI; + bool _isDarkTheme = false; bool _isWindowShown = false; + bool _isMaximized = false; }; } From 3a7d507bce8466687721c32565a519809ecfc1f9 Mon Sep 17 00:00:00 2001 From: Xu <34770031+Blinue@users.noreply.github.com> Date: Mon, 19 Feb 2024 20:07:35 +0800 Subject: [PATCH 106/155] =?UTF-8?q?chore:=20=E5=BE=AE=E5=B0=8F=E4=BC=98?= =?UTF-8?q?=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Magpie.App/LocalizationService.cpp | 2 +- src/Magpie/MainWindow.cpp | 32 +++++++++++++------------- src/Magpie/XamlWindow.h | 4 ---- 3 files changed, 17 insertions(+), 21 deletions(-) diff --git a/src/Magpie.App/LocalizationService.cpp b/src/Magpie.App/LocalizationService.cpp index 0675bb27f..08d6fa760 100644 --- a/src/Magpie.App/LocalizationService.cpp +++ b/src/Magpie.App/LocalizationService.cpp @@ -41,7 +41,7 @@ void LocalizationService::EarlyInitialize() { double bestScore = 0.0; // 没有支持的语言则回落到英语 - const wchar_t* bestLanguage = L"en-US"; + const wchar_t* bestLanguage = L"en-us"; for (const wchar_t* language : SUPPORTED_LANGUAGES) { double score = 0.0; HRESULT hr = GetDistanceOfClosestLanguageInList(language, userLanguages.data(), 0, &score); diff --git a/src/Magpie/MainWindow.cpp b/src/Magpie/MainWindow.cpp index 372de1aa7..314bee3a6 100644 --- a/src/Magpie/MainWindow.cpp +++ b/src/Magpie/MainWindow.cpp @@ -39,7 +39,7 @@ bool MainWindow::Create(HINSTANCE hInstance, winrt::Point windowCenter, winrt::S _Content(winrt::Magpie::App::RootPage()); - _Content().ActualThemeChanged([this](winrt::FrameworkElement const&, winrt::IInspectable const&) { + Content().ActualThemeChanged([this](winrt::FrameworkElement const&, winrt::IInspectable const&) { _UpdateTheme(); }); _UpdateTheme(); @@ -56,7 +56,7 @@ bool MainWindow::Create(HINSTANCE hInstance, winrt::Point windowCenter, winrt::S (sizeToSet.cx == 0 ? (SWP_NOMOVE | SWP_NOSIZE) : 0) | SWP_FRAMECHANGED | SWP_NOACTIVATE | SWP_NOCOPYBITS); // Xaml 控件加载完成后显示主窗口 - _Content().Loaded([this, isMaximized](winrt::IInspectable const&, winrt::RoutedEventArgs const&) { + Content().Loaded([this, isMaximized](winrt::IInspectable const&, winrt::RoutedEventArgs const&) { if (isMaximized) { // ShowWindow(Handle(), SW_SHOWMAXIMIZED) 会显示错误的动画。因此我们以窗口化显示, // 但位置和大小都和最大化相同,显示完毕后将状态设为最大化。 @@ -130,7 +130,7 @@ bool MainWindow::Create(HINSTANCE hInstance, winrt::Point windowCenter, winrt::S ); } - _Content().TitleBar().SizeChanged([this](winrt::IInspectable const&, winrt::SizeChangedEventArgs const&) { + Content().TitleBar().SizeChanged([this](winrt::IInspectable const&, winrt::SizeChangedEventArgs const&) { _ResizeTitleBarWindow(); }); @@ -151,7 +151,7 @@ LRESULT MainWindow::_MessageHandler(UINT msg, WPARAM wParam, LPARAM lParam) noex { LRESULT ret = base_type::_MessageHandler(WM_SIZE, wParam, lParam); _ResizeTitleBarWindow(); - _Content().TitleBar().CaptionButtons().IsWindowMaximized(_IsMaximized()); + Content().TitleBar().CaptionButtons().IsWindowMaximized(_IsMaximized()); return ret; } case WM_GETMINMAXINFO: @@ -206,7 +206,7 @@ LRESULT MainWindow::_MessageHandler(UINT msg, WPARAM wParam, LPARAM lParam) noex } case WM_ACTIVATE: { - _Content().TitleBar().IsWindowActive(LOWORD(wParam) != WA_INACTIVE); + Content().TitleBar().IsWindowActive(LOWORD(wParam) != WA_INACTIVE); break; } case WM_DESTROY: @@ -341,7 +341,7 @@ std::pair MainWindow::_CreateWindow(HINSTANCE hInstance, winrt::Poi } void MainWindow::_UpdateTheme() noexcept { - XamlWindowT::_SetTheme(_Content().ActualTheme() == winrt::ElementTheme::Dark); + XamlWindowT::_SetTheme(Content().ActualTheme() == winrt::ElementTheme::Dark); } LRESULT MainWindow::_TitleBarWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) noexcept { @@ -383,7 +383,7 @@ LRESULT MainWindow::_TitleBarMessageHandler(UINT msg, WPARAM wParam, LPARAM lPar } static const winrt::Size buttonSizeInDips = [this]() { - return _Content().TitleBar().CaptionButtons().CaptionButtonSize(); + return Content().TitleBar().CaptionButtons().CaptionButtonSize(); }(); const float buttonWidthInPixels = buttonSizeInDips.Width * _CurrentDpi() / USER_DEFAULT_SCREEN_DPI; @@ -419,7 +419,7 @@ LRESULT MainWindow::_TitleBarMessageHandler(UINT msg, WPARAM wParam, LPARAM lPar [[fallthrough]]; case WM_NCMOUSEMOVE: { - auto captionButtons = _Content().TitleBar().CaptionButtons(); + auto captionButtons = Content().TitleBar().CaptionButtons(); // 将 hover 状态通知 CaptionButtons。标题栏窗口拦截了 XAML Islands 中的标题栏 // 控件的鼠标消息,标题栏按钮的状态由我们手动控制。 @@ -466,12 +466,12 @@ LRESULT MainWindow::_TitleBarMessageHandler(UINT msg, WPARAM wParam, LPARAM lPar // 先检查鼠标是否在主窗口上,如果正在显示文字提示,会返回 _hwndTitleBar HWND hwndUnderCursor = WindowFromPoint(cursorPos); if (hwndUnderCursor != Handle() && hwndUnderCursor != _hwndTitleBar) { - _Content().TitleBar().CaptionButtons().LeaveButtons(); + Content().TitleBar().CaptionButtons().LeaveButtons(); } else { // 然后检查鼠标在标题栏上的位置 LRESULT hit = SendMessage(_hwndTitleBar, WM_NCHITTEST, 0, MAKELPARAM(cursorPos.x, cursorPos.y)); if (hit != HTMINBUTTON && hit != HTMAXBUTTON && hit != HTCLOSE) { - _Content().TitleBar().CaptionButtons().LeaveButtons(); + Content().TitleBar().CaptionButtons().LeaveButtons(); } } @@ -493,7 +493,7 @@ LRESULT MainWindow::_TitleBarMessageHandler(UINT msg, WPARAM wParam, LPARAM lPar case HTMINBUTTON: case HTMAXBUTTON: case HTCLOSE: - _Content().TitleBar().CaptionButtons().PressButton((winrt::Magpie::App::CaptionButton)wParam); + Content().TitleBar().CaptionButtons().PressButton((winrt::Magpie::App::CaptionButton)wParam); // 在标题栏按钮上按下左键后我们便捕获光标,这样才能在释放时得到通知。注意捕获光标后 // 便不会再收到 NC 族消息,这就是为什么我们要处理 WM_MOUSEMOVE 和 WM_LBUTTONUP SetCapture(_hwndTitleBar); @@ -519,17 +519,17 @@ LRESULT MainWindow::_TitleBarMessageHandler(UINT msg, WPARAM wParam, LPARAM lPar case HTCAPTION: { // 在可拖拽区域或上边框释放左键,将此消息传递给主窗口 - _Content().TitleBar().CaptionButtons().ReleaseButtons(); + Content().TitleBar().CaptionButtons().ReleaseButtons(); return SendMessage(Handle(), msg, wParam, lParam); } case HTMINBUTTON: case HTMAXBUTTON: case HTCLOSE: // 在标题栏按钮上释放左键 - _Content().TitleBar().CaptionButtons().ReleaseButton((winrt::Magpie::App::CaptionButton)wParam); + Content().TitleBar().CaptionButtons().ReleaseButton((winrt::Magpie::App::CaptionButton)wParam); break; default: - _Content().TitleBar().CaptionButtons().ReleaseButtons(); + Content().TitleBar().CaptionButtons().ReleaseButtons(); } return 0; @@ -549,11 +549,11 @@ void MainWindow::_ResizeTitleBarWindow() noexcept { return; } - auto titleBar = _Content().TitleBar(); + auto titleBar = Content().TitleBar(); // 获取标题栏的边框矩形 winrt::Rect rect{0.0f, 0.0f, (float)titleBar.ActualWidth(), (float)titleBar.ActualHeight()}; - rect = titleBar.TransformToVisual(_Content()).TransformBounds(rect); + rect = titleBar.TransformToVisual(Content()).TransformBounds(rect); const float dpiScale = _CurrentDpi() / float(USER_DEFAULT_SCREEN_DPI); diff --git a/src/Magpie/XamlWindow.h b/src/Magpie/XamlWindow.h index a9a7e4b1f..0f0a0d4d9 100644 --- a/src/Magpie/XamlWindow.h +++ b/src/Magpie/XamlWindow.h @@ -99,10 +99,6 @@ class XamlWindowT { }); } - const C& _Content() const noexcept { - return _content; - } - uint32_t _CurrentDpi() const noexcept { return _currentDpi; } From 701b5cc2f4b3324e7f266d137f53555346be298c Mon Sep 17 00:00:00 2001 From: Xu <34770031+Blinue@users.noreply.github.com> Date: Tue, 20 Feb 2024 23:30:36 +0800 Subject: [PATCH 107/155] =?UTF-8?q?feat:=20=E7=A7=BB=E6=A4=8D=20Anime4K=5F?= =?UTF-8?q?Upscale=5FGAN=5Fx3=5FL=201?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Effects/Anime4K_Upscale_GAN_x3_L.hlsl | 462 ++++++++++++++++++++++ 1 file changed, 462 insertions(+) create mode 100644 src/Effects/Anime4K_Upscale_GAN_x3_L.hlsl diff --git a/src/Effects/Anime4K_Upscale_GAN_x3_L.hlsl b/src/Effects/Anime4K_Upscale_GAN_x3_L.hlsl new file mode 100644 index 000000000..3c9e1dc1d --- /dev/null +++ b/src/Effects/Anime4K_Upscale_GAN_x3_L.hlsl @@ -0,0 +1,462 @@ +// Anime4K_Upscale_GAN_x3_L +// 移植自 https://github.com/bloc97/Anime4K/blob/8e39551ce96ed172605c89b7dd8be855b5502cc9/glsl/Upscale/Anime4K_Upscale_GAN_x3_L.glsl + +//!MAGPIE EFFECT +//!VERSION 4 + +// 圆括号内的输入只被采样一次 +// INPUT -> tf, tf1, tf2 +// tf, tf1, tf2 -> 1_tf, 3_tf, 3_tf1, 3_tf2 +// 3_tf, 3_tf1, 3_tf2, (1_tf) -> 4_tf, 6_tf, 6_tf1, 6_tf2 +// 6_tf, 6_tf1, 6_tf2, (1_tf), (4_tf) -> 7_tf, 9_tf, 9_tf1, 9_tf2 +// 9_tf, 9_tf1, 9_tf2, (1_tf), (4_tf), (7_tf) -> 11_tf, 10_tf, 12_tf, 12_tf1, 12_tf2 +// 12_tf, 12_tf1, 12_tf2, 11_tf, (1_tf), (4_tf), (7_tf), (10_tf) -> 0ups, 0ups1, 0ups2 +// 0ups, 0ups1, 0ups2 -> 1ups, 1ups1 +// INPUT, 1ups, 1ups1 -> OUTPUT + +//!TEXTURE +Texture2D INPUT; + +//!TEXTURE +//!WIDTH INPUT_WIDTH * 2 +//!HEIGHT INPUT_HEIGHT * 2 +Texture2D OUTPUT; + +//!SAMPLER +//!FILTER POINT +SamplerState sam; + +//!SAMPLER +//!FILTER LINEAR +SamplerState sam1; + +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +//!FORMAT R16G16B16A16_FLOAT +Texture2D tex1; + +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +//!FORMAT R16G16B16A16_FLOAT +Texture2D tex2; + +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +//!FORMAT R16G16B16A16_FLOAT +Texture2D tex3; + +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +//!FORMAT R16G16B16A16_FLOAT +Texture2D tex4; + +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +//!FORMAT R16G16B16A16_FLOAT +Texture2D tex5; + +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +//!FORMAT R16G16B16A16_FLOAT +Texture2D tex6; + +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +//!FORMAT R16G16B16A16_FLOAT +Texture2D tex7; + +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +//!FORMAT R16G16B16A16_FLOAT +Texture2D tex8; + +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +//!FORMAT R16G16B16A16_FLOAT +Texture2D tex9; + +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +//!FORMAT R16G16B16A16_FLOAT +Texture2D tex10; + +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +//!FORMAT R16G16B16A16_FLOAT +Texture2D tex11; + + +//!PASS 1 +//!DESC Conv-4x3x3x3 +//!IN INPUT +//!OUT tex1, tex2, tex3 +//!BLOCK_SIZE 16 +//!NUM_THREADS 64 + +void Pass1(uint2 blockStart, uint3 threadId) { + uint2 gxy = (Rmp8x8(threadId.x) << 1) + blockStart; + uint2 inputSize = GetInputSize(); + if (gxy.x >= inputSize.x || gxy.y >= inputSize.y) { + return; + } + float2 inputPt = GetInputPt(); + + uint i, j; + + float3 src[4][4]; + [unroll] + for (i = 0; i <= 2; i += 2) { + [unroll] + for (j = 0; j <= 2; j += 2) { + float2 tpos = (gxy + uint2(i, j)) * inputPt; + const float4 sr = INPUT.GatherRed(sam, tpos); + const float4 sg = INPUT.GatherGreen(sam, tpos); + const float4 sb = INPUT.GatherBlue(sam, tpos); + + // w z + // x y + src[i][j] = float3(sr.w, sg.w, sb.w); + src[i][j + 1] = float3(sr.x, sg.x, sb.x); + src[i + 1][j] = float3(sr.z, sg.z, sb.z); + src[i + 1][j + 1] = float3(sr.y, sg.y, sb.y); + } + } + + [unroll] + for (i = 1; i <= 2; ++i) { + [unroll] + for (j = 1; j <= 2; ++j) { + uint2 destPos = gxy + uint2(i - 1, j - 1); + + if (i != 1 || j != 1) { + if (destPos.x >= inputSize.x || destPos.y >= inputSize.y) { + continue; + } + } + + float4 result = mul(src[i - 1][j - 1], float3x4(-0.26345107, 0.18636681, 0.068192646, 0.06335259, -0.5026903, -0.39884016, -0.14562744, -0.24653248, -0.44533378, 0.52169526, -0.35453957, 0.25303423)); + result += mul(src[i - 1][j], float3x4(-0.22396083, 0.1324318, 0.47152156, -0.3061965, -0.06026671, -0.26795772, 0.0081171375, -0.32897332, -0.16401465, -0.1018444, 0.48241594, -0.09054633)); + result += mul(src[i - 1][j + 1], float3x4(0.25090155, -0.15917313, 0.028407926, -0.24014995, 0.4114972, -0.45535553, 0.08742311, 0.16796699, 0.0995656, -0.4009339, 0.21471445, 0.2708967)); + result += mul(src[i][j - 1], float3x4(-0.16269766, 0.16389379, -0.12857921, -0.1602467, -0.16460834, 0.15754342, 0.46217716, 0.20442651, 0.0548621, -0.018400457, 0.38643107, -0.29171357)); + result += mul(src[i][j], float3x4(-0.24035631, -0.33344224, -0.3904698, -0.4168555, -0.42237657, 0.36649242, 0.41396108, -0.38945103, -0.5806718, 0.035621256, 0.09171773, -0.54301006)); + result += mul(src[i][j + 1], float3x4(0.15957133, -0.035278857, 0.1318051, 0.6896821, 0.18556473, 0.16378926, 0.32670698, 0.2675555, 0.08802092, 0.41140598, 0.05322177, 0.5030955)); + result += mul(src[i + 1][j - 1], float3x4(-0.082798496, 0.24381381, -0.30908522, 0.04553323, 0.25664318, 0.4123797, -0.29377607, 0.15920162, 0.13717672, 0.027625162, 0.25476956, 0.21843456)); + result += mul(src[i + 1][j], float3x4(0.14534818, -0.239681, 0.22961527, 0.3814783, 0.1233398, 0.2449555, 0.015051085, 0.1661234, -0.27740797, -0.29109767, -0.19438179, -0.027439274)); + result += mul(src[i + 1][j + 1], float3x4(0.0011904882, -0.01287622, -0.1573707, -0.13167281, -0.12803882, -0.079415865, -0.04034391, -0.09625339, 0.23190106, -0.26743674, -0.48981485, -0.2063946)); + result += float4(0.034235504, 0.039522275, -0.032817896, -0.0031068379); + tex1[destPos] = result; + + result = mul(src[i - 1][j - 1], float3x4(-0.17155029, -0.084075995, 0.2281505, 0.38326037, 0.18672232, -0.2562305, 0.30811027, 0.30188802, -0.24588907, 0.088734694, 0.14092724, -0.18793459)); + result += mul(src[i - 1][j], float3x4(-0.47514066, 0.51882815, 0.1561294, -0.043147214, -0.19554369, 0.19514531, -0.14636773, 0.11425865, -0.2772368, 0.5388449, 0.54875004, -0.4526634)); + result += mul(src[i - 1][j + 1], float3x4(0.11270131, 0.44642356, -0.066219814, 0.15781905, 0.056682296, 0.026522577, 0.05600635, -0.13799536, 0.15637676, -0.15661198, 0.53794587, 0.09693692)); + result += mul(src[i][j - 1], float3x4(-0.23679815, 0.16397353, 0.37343305, 0.07477207, -0.36061585, 0.24027273, 0.3222875, 0.05577238, -0.17547923, 0.11737104, 0.10193468, -0.056727592)); + result += mul(src[i][j], float3x4(0.2335428, -0.5571976, 0.13586389, -0.3443148, 0.4537042, -0.59349614, -0.24114902, 0.08669349, 0.2881981, -0.29106617, -0.47775048, 0.22723311)); + result += mul(src[i][j + 1], float3x4(0.006350133, -0.28196353, 0.22710627, 0.30080464, -0.3500525, 0.09254133, -0.48047104, -0.30452347, -0.077637784, -0.11856046, 0.07377078, 0.44280833)); + result += mul(src[i + 1][j - 1], float3x4(0.2200762, 0.3665277, 0.043291833, 0.21484855, 0.15553318, -0.035003938, 0.14891839, -0.29007155, 0.23154758, -0.2348225, 0.48130423, 0.00733271)); + result += mul(src[i + 1][j], float3x4(0.28228128, 0.054867495, 0.08010268, -0.2980908, 0.15146615, -0.058449056, -0.43990552, -0.5963296, 0.09321943, 0.20146254, -0.08043876, 0.017381484)); + result += mul(src[i + 1][j + 1], float3x4(0.076894, 0.16354772, 0.25471574, 0.24382424, -0.15274979, -0.19706573, -0.30667382, 0.523845, 0.023073493, 0.34462887, -0.3384359, 0.18867111)); + result += float4(0.014904483, -0.009271063, 0.04884906, 0.0106121525); + tex2[destPos] = result; + + result = mul(src[i - 1][j - 1], float3x4(-0.34360278, -0.28731042, -0.017787619, 0.36802426, 0.33655256, -0.24784079, 0.29148427, 0.28857, -0.3111454, 0.0030706236, -0.25914, 0.5528963)); + result += mul(src[i - 1][j], float3x4(0.12459981, -0.17094392, -0.18776429, 0.37819883, 0.1320519, 0.21927781, -0.16188109, 0.050895408, -0.06871313, 0.16754176, 0.29934305, 0.052247107)); + result += mul(src[i - 1][j + 1], float3x4(-0.016753385, -0.0935026, -0.3025131, 0.029084548, -0.17713268, 0.23525053, 0.015773006, 0.5464473, 0.49457568, 0.03073306, 0.18685353, 0.28700578)); + result += mul(src[i][j - 1], float3x4(0.135332, 0.07585244, 0.05262212, -0.15484884, -0.13468477, 0.5161883, 0.10347934, -0.37127933, 0.12426171, 0.48973167, 0.19040361, -0.24403319)); + result += mul(src[i][j], float3x4(-0.54557467, 0.07250278, 0.37912187, 0.0044768555, -0.47080016, -0.4050018, 0.64416456, -0.58235925, -0.28048036, -0.32962233, -0.28131053, 0.022653949)); + result += mul(src[i][j + 1], float3x4(0.17059836, 0.016603703, 0.34638256, 0.028987328, 0.43271738, -0.15030707, 0.072848, 0.1422675, -0.23391044, -0.12179815, 0.37569857, -0.056668952)); + result += mul(src[i + 1][j - 1], float3x4(-0.0428437, 0.15237094, -0.26750615, 0.053740855, -0.04772152, -0.13561963, -0.20043467, -0.018060924, 0.29031327, -0.17592178, -0.5016104, -0.36639994)); + result += mul(src[i + 1][j], float3x4(0.39091983, -0.257284, -0.39293087, -0.1182859, -0.46328986, -0.1585645, -0.32158652, 0.41519204, 0.21179573, -0.3613411, -0.032484483, -0.03755994)); + result += mul(src[i + 1][j + 1], float3x4(0.42772895, 0.11436431, -0.115817815, -0.29173127, 0.57807744, -0.21997264, -0.49362126, 0.021626333, 0.1258072, -0.062251803, -0.16541855, 0.061321106)); + result += float4(-0.017981518, -0.012223751, -0.0033700857, 0.013441364); + tex3[destPos] = result; + } + } +} + + +//!PASS 2 +//!DESC Conv-4x3x3x24, Conv-4x1x1x40 +//!IN tex1, tex2, tex3 +//!OUT tex4, tex5, tex6, tex7 +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 + +void Pass2(uint2 blockStart, uint3 threadId) { + uint2 gxy = Rmp8x8(threadId.x) + blockStart; + uint2 inputSize = GetInputSize(); + if (gxy.x >= inputSize.x || gxy.y >= inputSize.y) { + return; + } + + float2 inputPt = GetInputPt(); + float2 pos = (gxy + 0.5f) * inputPt; + + // [ a, d, g ] + // [ b, e, h ] + // [ c, f, i ] + float4 a1 = tex1.SampleLevel(sam, pos - inputPt, 0); + float4 b1 = tex1.SampleLevel(sam, pos + float2(-inputPt.x, 0), 0); + float4 c1 = tex1.SampleLevel(sam, pos + float2(-inputPt.x, inputPt.y), 0); + float4 d1 = tex1.SampleLevel(sam, pos + float2(0, -inputPt.y), 0); + float4 e1 = tex1.SampleLevel(sam, pos, 0); + float4 f1 = tex1.SampleLevel(sam, pos + float2(0, inputPt.y), 0); + float4 g1 = tex1.SampleLevel(sam, pos + float2(inputPt.x, -inputPt.y), 0); + float4 h1 = tex1.SampleLevel(sam, pos + float2(inputPt.x, 0), 0); + float4 i1 = tex1.SampleLevel(sam, pos + inputPt, 0); + + float4 na1 = max(-a1, 0); + float4 nb1 = max(-b1, 0); + float4 nc1 = max(-c1, 0); + float4 nd1 = max(-d1, 0); + float4 ne1 = max(-e1, 0); + float4 nf1 = max(-f1, 0); + float4 ng1 = max(-g1, 0); + float4 nh1 = max(-h1, 0); + float4 ni1 = max(-i1, 0); + + a1 = max(a1, 0); + b1 = max(b1, 0); + c1 = max(c1, 0); + d1 = max(d1, 0); + e1 = max(e1, 0); + f1 = max(f1, 0); + g1 = max(g1, 0); + h1 = max(h1, 0); + i1 = max(i1, 0); + + float4 a2 = tex2.SampleLevel(sam, pos - inputPt, 0); + float4 b2 = tex2.SampleLevel(sam, pos + float2(-inputPt.x, 0), 0); + float4 c2 = tex2.SampleLevel(sam, pos + float2(-inputPt.x, inputPt.y), 0); + float4 d2 = tex2.SampleLevel(sam, pos + float2(0, -inputPt.y), 0); + float4 e2 = tex2.SampleLevel(sam, pos, 0); + float4 f2 = tex2.SampleLevel(sam, pos + float2(0, inputPt.y), 0); + float4 g2 = tex2.SampleLevel(sam, pos + float2(inputPt.x, -inputPt.y), 0); + float4 h2 = tex2.SampleLevel(sam, pos + float2(inputPt.x, 0), 0); + float4 i2 = tex2.SampleLevel(sam, pos + inputPt, 0); + + float4 na2 = max(-a2, 0); + float4 nb2 = max(-b2, 0); + float4 nc2 = max(-c2, 0); + float4 nd2 = max(-d2, 0); + float4 ne2 = max(-e2, 0); + float4 nf2 = max(-f2, 0); + float4 ng2 = max(-g2, 0); + float4 nh2 = max(-h2, 0); + float4 ni2 = max(-i2, 0); + + a2 = max(a2, 0); + b2 = max(b2, 0); + c2 = max(c2, 0); + d2 = max(d2, 0); + e2 = max(e2, 0); + f2 = max(f2, 0); + g2 = max(g2, 0); + h2 = max(h2, 0); + i2 = max(i2, 0); + + float4 a3 = tex3.SampleLevel(sam, pos - inputPt, 0); + float4 b3 = tex3.SampleLevel(sam, pos + float2(-inputPt.x, 0), 0); + float4 c3 = tex3.SampleLevel(sam, pos + float2(-inputPt.x, inputPt.y), 0); + float4 d3 = tex3.SampleLevel(sam, pos + float2(0, -inputPt.y), 0); + float4 e3 = tex3.SampleLevel(sam, pos, 0); + float4 f3 = tex3.SampleLevel(sam, pos + float2(0, inputPt.y), 0); + float4 g3 = tex3.SampleLevel(sam, pos + float2(inputPt.x, -inputPt.y), 0); + float4 h3 = tex3.SampleLevel(sam, pos + float2(inputPt.x, 0), 0); + float4 i3 = tex3.SampleLevel(sam, pos + inputPt, 0); + + float4 na3 = max(-a3, 0); + float4 nb3 = max(-b3, 0); + float4 nc3 = max(-c3, 0); + float4 nd3 = max(-d3, 0); + float4 ne3 = max(-e3, 0); + float4 nf3 = max(-f3, 0); + float4 ng3 = max(-g3, 0); + float4 nh3 = max(-h3, 0); + float4 ni3 = max(-i3, 0); + + a3 = max(a3, 0); + b3 = max(b3, 0); + c3 = max(c3, 0); + d3 = max(d3, 0); + e3 = max(e3, 0); + f3 = max(f3, 0); + g3 = max(g3, 0); + h3 = max(h3, 0); + i3 = max(i3, 0); + + float4 conv2d_2_tf = mul(a1, float4x4(0.1881249, -0.14544061, -0.022969106, 0.088232316, 0.0058642747, -0.049336948, -0.039974928, 0.06410949, -0.09211665, -0.034005307, -0.1095955, 0.10930763, -0.26397142, 0.1384094, 0.017342392, -0.21376696)); + conv2d_2_tf += mul(b1, float4x4(-0.14526816, -0.0639951, 0.11742242, -0.006982521, -0.05208895, 0.089485295, -0.19564004, -0.08121572, -0.11621622, 0.15375662, -0.15378582, 0.0596373, 0.14132364, -0.06385903, 0.05449634, -0.047440365)); + conv2d_2_tf += mul(c1, float4x4(-0.082622305, -0.23856479, 0.06367865, -0.019509695, 0.094882965, -0.04511791, 0.16706854, 0.20536391, 0.1409632, -0.10635743, 0.038904104, -0.0039008786, 0.16198882, -0.17409256, 0.13213669, 0.08329318)); + conv2d_2_tf += mul(d1, float4x4(-0.1186756, 0.2009846, -0.086417995, 0.20491274, -0.13763973, -0.0800847, 0.16069777, 0.10931271, 0.14152408, 0.047218926, 0.041168302, -0.054257084, -0.08315953, -0.1573787, 0.20787828, 0.118524544)); + conv2d_2_tf += mul(e1, float4x4(-0.19046788, 0.10213364, -0.112078644, -0.16287695, 0.011410189, -0.016858546, -0.09383451, -0.063516155, -0.17561492, -0.15199865, -0.112707786, -0.18099716, 0.19017689, -0.20048961, -0.5382596, -0.24332014)); + conv2d_2_tf += mul(f1, float4x4(-0.1465597, 0.044423096, 0.04632811, -0.015121401, -0.051081203, -0.09574356, -0.10018257, -0.019390205, -0.1562855, 0.041693382, -0.012624074, 0.057703923, 0.09825134, 0.1544577, 0.1683734, 0.018580355)); + conv2d_2_tf += mul(g1, float4x4(-0.22240564, -0.051839057, 0.12950379, 0.0048653902, 0.0144696245, -0.10698864, -0.08654499, -0.131132, 0.15429983, 0.025204081, -0.09136411, -0.053068906, -0.005858075, -0.02560129, 0.0469077, 0.018962694)); + conv2d_2_tf += mul(h1, float4x4(-0.4698737, -0.053354982, 0.27541625, -0.020424731, 0.06935965, 0.008045162, -0.11538889, -0.038876567, -0.049084928, 0.1629101, -0.012742019, 0.12038333, -0.0705842, 0.12735052, 0.17640172, 0.050716672)); + conv2d_2_tf += mul(i1, float4x4(-0.10064598, 0.016594354, -0.14633141, -0.09175336, -0.12889755, -0.1671076, 0.22031903, 0.0759859, 0.102435045, -0.072596334, -0.17714, 0.03531571, -0.022843607, 0.047148425, 0.105391234, 0.05260699)); + conv2d_2_tf += mul(a2, float4x4(-0.1057386, 0.020954097, -0.022159133, 0.064248964, -0.031145383, -0.008180922, -0.023611609, 0.05197287, -0.017418958, 0.02461813, 0.0584847, -0.10087345, -0.16315617, 0.15651843, 0.10478647, 0.08347392)); + conv2d_2_tf += mul(b2, float4x4(-0.01323452, 0.044956483, -0.007983463, 0.10643116, -0.030048033, -0.11766427, -0.101889476, 0.015120098, 0.031690307, 0.014470776, -0.10197176, -0.10045749, -0.065616645, -0.15230782, -0.26183948, -0.071056716)); + conv2d_2_tf += mul(c2, float4x4(0.026220636, -0.044518135, 0.17167594, 0.3016424, 0.12054841, 0.042369425, 0.04208856, 0.14938886, -0.07018442, -0.008244587, 0.14260693, -0.094418734, -0.032693435, 0.042990524, -0.053002246, -0.003936231)); + conv2d_2_tf += mul(d2, float4x4(-0.10141095, 0.17178011, -0.10951717, -0.28119737, 0.008288983, 0.14197187, 0.10903869, 0.017220182, 0.041842293, -0.03106527, -0.05892881, 0.02668739, 0.072505936, -0.060759444, 0.00032896115, -0.03440771)); + conv2d_2_tf += mul(e2, float4x4(0.13831837, -0.13864368, 0.15232176, 0.31198958, 0.033965178, 0.053397447, -0.30352455, -0.17199865, -0.06429645, 0.013913047, 0.10764071, -0.12238359, -0.04544379, 0.17074125, 0.024108075, -0.14521888)); + conv2d_2_tf += mul(f2, float4x4(-0.11011318, -0.0102100335, -0.37701187, -0.36465186, 0.16052358, -0.06683314, 0.16916892, 0.23348652, -0.17332914, 0.007918098, -0.055450343, 0.12134491, 0.002598775, 0.050541576, 0.16586582, -0.08609246)); + conv2d_2_tf += mul(g2, float4x4(0.055008903, -0.038048673, 0.12065314, -0.034293417, 0.026340824, 0.0635937, 0.0072025824, 0.1099919, -0.022833373, 0.06988719, 0.098066956, 0.09838032, 0.027212605, -0.10769643, 0.025036965, 0.07822364)); + conv2d_2_tf += mul(h2, float4x4(0.12550583, -0.015590264, -0.20009072, -0.2595937, -0.040573828, -0.07032441, 0.13428123, 0.0024277875, -0.103335135, -0.08461066, 0.05634581, -0.113169014, 0.05591198, -0.16420694, -0.06915715, -0.19497992)); + conv2d_2_tf += mul(i2, float4x4(0.088232726, -0.05118527, 0.119473234, 0.23262945, 0.06746001, 0.14686997, -0.25685823, 0.08349066, 0.120035954, 0.11132579, 0.1024914, 0.008478224, -0.054700002, -0.029634893, 0.050064556, -0.08939752)); + conv2d_2_tf += mul(a3, float4x4(0.022236016, -0.14602192, -0.011037687, 0.09127931, 0.14263593, 0.2303995, -0.07378528, 0.07426219, -0.25500375, 0.18845809, -0.065374866, 0.016772734, 0.02813176, 0.15021992, -0.032982655, 0.0046127643)); + conv2d_2_tf += mul(b3, float4x4(0.110158965, 0.02073459, 0.1380525, 0.017634321, -0.3546499, -0.099760525, -0.1195462, 0.057210118, -0.53130746, 0.23352407, -0.18252264, -0.19651698, -0.10013627, -0.006907238, -0.022171183, 0.023419948)); + conv2d_2_tf += mul(c3, float4x4(-0.009217382, 0.00943576, 0.005295363, 0.010542551, -0.21079898, -0.14469005, -0.19105618, 0.2098414, 0.18261504, 0.19765937, 0.044775106, -0.25939676, 0.072466746, -0.08828442, 0.066161856, 0.05692894)); + conv2d_2_tf += mul(d3, float4x4(-0.051633067, 0.019243274, 0.28932014, -0.029704608, -0.06255436, -0.4573925, -0.10963281, 0.121834375, 0.10874706, -0.093909726, 0.06983889, 0.048236616, -0.15379356, -0.06354611, -0.10668147, -0.02901699)); + conv2d_2_tf += mul(e3, float4x4(-0.044167574, 0.022249546, -0.3618917, -0.054136246, -0.105739385, -0.22325896, -0.070169605, -0.19650152, 0.07689512, -0.17047665, -0.07742679, 0.031095566, -0.01903123, -0.033752028, -0.2286711, 0.044381924)); + conv2d_2_tf += mul(f3, float4x4(-0.05709193, 0.15251294, -0.16776492, 0.09025173, 0.18235344, 0.3685535, -0.053927444, 0.10351524, -0.0938133, -0.26824594, -0.036424845, -0.106756285, -0.13051414, -0.07613318, -0.10721611, -0.13445549)); + conv2d_2_tf += mul(g3, float4x4(-0.0268394, 0.017245602, 0.1185864, 0.031915247, -0.037321728, 0.037805032, 0.13701047, 0.025731707, 0.03791209, -0.16549957, 0.08953334, -0.13901101, -0.1287722, 0.072961085, 0.06859001, 0.18934746)); + conv2d_2_tf += mul(h3, float4x4(-0.11152981, 0.13712928, -0.05714947, 0.05542204, -0.32208005, -0.015176284, 0.10014709, -0.030125491, -0.04422843, 0.12897238, 0.108573034, -0.025267191, 0.02247499, -0.058167085, -0.15205052, 0.043249656)); + conv2d_2_tf += mul(i3, float4x4(-0.12951276, -0.14417744, 0.012708804, -0.0040302873, 0.09192804, -0.092346616, -0.09659876, -0.13512622, -0.0737095, 0.002481852, 0.048459593, 0.05455724, -0.14035852, 0.07777282, 0.07471883, 0.107781895)); + conv2d_2_tf += mul(na1, float4x4(0.028793033, -0.039604917, -0.0045903274, -0.05023892, 0.04976248, -0.026074547, 0.1733191, -0.06694405, -0.12434122, 0.12477937, -0.105804294, 0.06170465, 0.33725888, -0.15944988, 0.09790923, 0.030690596)); + conv2d_2_tf += mul(nb1, float4x4(0.005191585, 0.08373177, -0.018288689, 0.020527333, -0.055718876, -0.12754384, 0.17755422, 0.1597085, 0.17601304, -0.0258804, 0.16454586, 0.106551126, -0.20891763, -0.05360957, -0.24229631, -0.15886526)); + conv2d_2_tf += mul(nc1, float4x4(0.03740399, -0.0043318006, -0.010840595, -0.01674406, -0.17876416, 0.09188681, -0.12203759, -0.09808559, 0.1243873, -0.184597, 0.07484877, 0.14448164, -0.15161137, 0.033237204, -0.054772068, -0.085399576)); + conv2d_2_tf += mul(nd1, float4x4(0.071139924, 0.025827989, 0.021663137, -0.12484576, -0.07799051, 0.20053016, 0.014714873, -0.041652568, 0.046397317, -0.07650734, 0.06753141, 0.080667324, 0.4557549, -0.029605106, -0.25674006, -0.27842438)); + conv2d_2_tf += mul(ne1, float4x4(0.16805562, -0.03722638, 0.021958483, -0.04969856, -0.15340807, -0.22158863, -0.25280216, -0.024268134, 0.085401855, 0.22427009, -0.04698029, -0.071075134, -0.10739174, 0.030285811, 0.31068414, 0.2882289)); + conv2d_2_tf += mul(nf1, float4x4(-0.010069354, -0.045132317, -0.08054911, 0.19212297, -0.11246117, 0.203382, 0.10145021, 0.1476792, -0.022835081, 0.16916804, -0.018178321, 0.076025024, -0.29570428, -0.007177177, -0.1047155, -0.0178633)); + conv2d_2_tf += mul(ng1, float4x4(0.076137505, 0.117270656, -0.077183075, -0.052782975, -0.08236995, 0.053947527, 0.13501388, 0.17139077, -0.2424162, -0.15007298, 0.123724684, 0.09327283, 0.19777925, 0.07314544, -0.18668725, -0.010371631)); + conv2d_2_tf += mul(nh1, float4x4(0.15866037, 0.053233996, -0.026709981, -0.1574147, -0.012303242, 0.06893102, 0.031804018, 0.10116885, -0.016902728, -0.082480945, 0.05133729, -0.20160739, -0.012635841, 0.032104325, 0.00968726, -0.018941477)); + conv2d_2_tf += mul(ni1, float4x4(-0.02683365, 0.14024723, 0.0020279875, 0.035137076, -0.019948762, 0.3120297, -0.018649966, -0.17814124, -0.14863688, -0.12977526, -0.09194036, 0.19637106, 0.12040974, 0.09383599, 0.10559805, -0.0319509)); + conv2d_2_tf += mul(na2, float4x4(-0.07015076, -0.07818044, 0.12413185, -0.0018199648, -0.015275738, -0.21548629, 0.046161238, -0.10475311, 0.082367115, 0.0053079966, 0.09559984, 0.039583992, -0.1681236, -0.23862287, -0.09229484, -0.12317666)); + conv2d_2_tf += mul(nb2, float4x4(-0.17587087, -0.097817905, 0.08857801, 0.14012139, -0.20023742, 0.029083535, 0.056073546, -0.06810832, 0.08625035, 0.023427716, 0.1797412, 0.048568305, -0.09278378, -0.09250215, -0.12440772, 0.2587798)); + conv2d_2_tf += mul(nc2, float4x4(-0.24181388, -0.016290328, -0.026988767, -0.005399553, -0.061761368, -0.0013004051, -0.1990831, -0.07799404, 0.03282008, 0.079514205, -0.07474829, -0.36701006, 0.078521594, -0.156468, 0.09041213, 0.1292482)); + conv2d_2_tf += mul(nd2, float4x4(-0.21960634, 0.041841425, 0.122728646, 0.06800145, 0.07355482, 0.26123464, -0.13518283, -0.05085496, -0.099832244, 0.04960356, 0.066544525, 0.09741243, -0.10965899, -0.16163626, 0.09816793, -0.014595947)); + conv2d_2_tf += mul(ne2, float4x4(0.07614604, -0.062298786, -0.07941662, -0.22525579, -0.29955792, 0.11145522, 0.123146005, 0.13863817, 0.15309983, 0.025902487, -0.08610474, -0.07598799, -0.26134565, -0.2818921, 0.0046356185, 0.007307074)); + conv2d_2_tf += mul(nf2, float4x4(-0.15936229, -0.10145381, 0.058567517, 0.21258314, -0.18010478, -0.22477242, -0.039975245, -0.34447697, -0.21647838, 0.31467855, -0.0674453, -0.5146147, 0.05382176, -0.026282668, -0.24090777, 0.10222359)); + conv2d_2_tf += mul(ng2, float4x4(-0.1045028, -0.027515164, 0.013251722, 0.108239084, 0.03163253, -0.030052185, 0.10836872, 0.15349132, 0.09593661, 0.0062710177, -0.19837233, -0.098303355, -0.23947543, -0.04082913, 0.16908304, -0.031784274)); + conv2d_2_tf += mul(nh2, float4x4(-0.07773699, 0.30408737, 0.10054892, 0.36721498, 0.51369953, -0.11931886, -0.17019019, -0.3288588, 0.11095048, -0.29225063, -0.075574756, -0.18392691, -0.10289336, 0.06882282, 0.20403436, 0.12073833)); + conv2d_2_tf += mul(ni2, float4x4(0.024539007, 0.053005982, -0.099204265, -0.084534295, -0.2587164, -0.31929657, 0.07193254, 0.18271501, -0.043669797, 0.062497724, -0.055462, 0.057130013, -0.015285072, -0.030743862, -0.07051513, -0.13783172)); + conv2d_2_tf += mul(na3, float4x4(-0.4343681, 0.35928357, -0.004770178, -0.079942055, 0.014088603, -0.20866469, -0.1378781, -0.06831558, 0.21436058, -0.08427488, 0.2455502, -0.065596916, -0.06559933, -0.027101375, 0.023555819, -0.20939256)); + conv2d_2_tf += mul(nb3, float4x4(-0.37720296, -0.111260146, -0.25392932, -0.33377793, -0.17806955, -0.008747484, 0.17404033, 0.058826912, 0.0039355545, -0.18436235, 0.15803719, 0.15143508, 0.11155828, 0.09333553, -0.17960371, -0.036842924)); + conv2d_2_tf += mul(nc3, float4x4(-0.087490946, 0.0959697, -0.08301798, -0.19364063, -0.00996324, 0.014655412, 0.021732382, 0.07269497, 0.012744119, 0.01542146, 0.109438084, 0.18674947, -0.05728511, 0.017406877, 0.036412247, -0.044986803)); + conv2d_2_tf += mul(nd3, float4x4(0.30902067, 0.25019556, -0.079495244, -0.26099077, 0.08450634, -0.08346094, 0.004498276, -0.119334444, -0.08587327, -0.019446453, -0.1811446, -0.16136086, 0.006683898, 0.0005228834, -0.11937812, -0.2045503)); + conv2d_2_tf += mul(ne3, float4x4(0.19326456, -0.052496854, 0.12926556, 0.10167019, 0.090374604, 0.07595169, -0.0048561483, 0.12414255, 0.19320521, -0.027459998, 0.08993327, -0.035830285, 0.006461366, 0.023297347, 0.0691706, -0.00831113)); + conv2d_2_tf += mul(nf3, float4x4(0.13971736, 0.0788502, 0.12267767, 0.004433991, -0.053574555, -0.08087108, -0.26019198, -0.04175351, -0.13934188, 0.04144695, -0.070562504, -0.068388134, -0.1347503, -0.02173245, -0.1099242, -0.020897312)); + conv2d_2_tf += mul(ng3, float4x4(0.07843604, 0.04441641, -0.016214373, -0.15351163, -0.021339556, 0.023823377, -0.01442564, -0.09113205, -0.02552644, 0.14885889, -0.16178642, 0.14472331, 0.14082494, 0.05760455, -0.11503234, -0.16907685)); + conv2d_2_tf += mul(nh3, float4x4(-0.042953692, -0.3268466, 0.13181087, -0.06399399, 0.17543526, 0.111214496, 0.07369484, -0.003378238, 0.040965978, -0.0073295045, 0.07711077, -0.033094298, -0.08758825, -0.01715938, 0.056862406, -0.010732023)); + conv2d_2_tf += mul(ni3, float4x4(-0.039256442, -0.07153648, 0.10314899, -0.1192048, -0.033410206, 0.13077301, 0.19343375, -0.07479033, 0.10759806, -0.037313893, 0.06156247, 0.021744521, -0.18148352, -0.15683053, 0.017884498, -0.11338723)); + conv2d_2_tf += float4(-0.077597156, 0.024995416, 0.0048880246, -0.06210122); + float4 nconv2d_2_tf = max(-conv2d_2_tf, 0); + conv2d_2_tf = max(conv2d_2_tf, 0); + + float4 conv2d_1_tf = mul(a1, float4x4(0.10368956, 0.09174666, 0.07265347, 0.009965846, 0.04307676, 0.018726716, 0.064217605, -0.024381645, 0.013237381, 0.039251406, 0.13164084, -0.05265028, -0.08619517, 0.015469731, 0.10171868, -0.11194108)); + conv2d_1_tf += mul(b1, float4x4(-0.055484463, 0.1386706, -0.22939423, -0.2222723, 0.04815343, 0.05425625, 0.08234074, 0.12962975, 0.030559294, -0.07823733, 0.12347866, -0.13917705, -0.031347297, 0.010592373, -0.38942683, -0.302033)); + conv2d_1_tf += mul(c1, float4x4(0.06968848, -0.03574659, 0.11817242, 0.044270225, 0.0481696, 0.045347195, -0.14479072, 0.06971279, 0.012434736, 0.03927546, 0.13076504, 0.032268204, 0.040274065, 0.053418823, -0.05195065, 0.1341056)); + conv2d_1_tf += mul(d1, float4x4(0.1314648, 0.08953099, -0.058160458, -0.098807305, -0.08652445, -0.19136623, -0.012327089, 0.14297265, 0.11436408, 0.031837817, -0.0038611747, 0.08295747, 0.19534546, -0.033664998, -0.51042134, -0.21606028)); + conv2d_1_tf += mul(e1, float4x4(-0.332711, -0.2260786, 0.35732532, 0.026584813, 0.16421017, 0.21153966, -0.112725854, -0.048803244, 0.059562314, -0.010458478, 0.0063304375, -0.007279937, -0.41918445, 0.10137393, -0.0989079, -0.17768846)); + conv2d_1_tf += mul(f1, float4x4(-0.22947264, 0.008074958, -0.03876367, 0.28019628, -0.18640186, 0.072562195, -0.001338717, 0.17349707, 0.13131878, 0.05085823, -0.11547487, -0.084437385, -0.18131672, 0.026830718, 0.0960529, -0.014084568)); + conv2d_1_tf += mul(g1, float4x4(0.13153158, 0.079937235, -0.14291838, -0.062477887, -0.0690248, 0.15090927, 0.060723048, -0.044703092, 0.005483621, -0.113471694, 0.048640195, -0.024538955, -0.01751092, 0.19206041, -0.1859277, -0.22007878)); + conv2d_1_tf += mul(h1, float4x4(-0.04971548, -0.38541326, -0.080354154, -0.1132633, -0.13348146, 0.11406493, 0.05543971, 0.022810424, -0.09030199, -0.053045455, -0.084034644, 0.0014670533, 0.0007018557, -0.24078067, 0.047226585, 0.08619653)); + conv2d_1_tf += mul(i1, float4x4(-0.08993396, -0.09246378, 0.11467184, 0.060891952, -0.022887891, -0.008537377, 0.13542707, 0.08030356, -0.06174077, -0.07314582, -0.111782126, -0.08939319, -0.09756803, -0.15771574, 0.073002145, 0.035939205)); + conv2d_1_tf += mul(a2, float4x4(-0.09398606, -0.118093155, 0.024832802, 0.049131367, 0.06665196, -0.039545495, -0.107865654, -0.043897964, -0.03278348, -0.111089505, 0.12056342, -0.10977613, -0.05880801, -0.08684503, -0.15480064, -0.09669209)); + conv2d_1_tf += mul(b2, float4x4(-0.12028866, -0.0130571015, 0.010480521, 0.28919983, 0.050575808, -0.07968808, -0.15499628, -0.13613448, 0.030993043, 0.13226634, -0.12666325, -0.010337325, -0.025353834, 0.017561335, -0.08171704, -0.17280379)); + conv2d_1_tf += mul(c2, float4x4(-0.0008190666, 0.017923795, -0.13926646, -0.00083633314, -0.14120303, 0.109396234, 0.026602108, 0.2108425, 0.15093753, -0.0016773659, 0.028220268, 0.09914804, -0.045055833, 0.040082425, 0.007756443, -0.04522211)); + conv2d_1_tf += mul(d2, float4x4(0.059589684, 0.04780217, 0.30785602, 0.25626636, 0.08686253, 0.11348654, 0.042249523, -0.2264382, -0.058502045, 0.05044742, 0.0031711252, -0.021721566, -0.011926813, 0.042892855, -0.08586602, -0.029168598)); + conv2d_1_tf += mul(e2, float4x4(0.09367661, -0.019030625, -0.34638473, -0.10968469, -0.16300671, 0.21311292, 0.11657136, -0.044009518, 0.10225506, -0.044505168, 0.20920436, -0.018161744, -0.018144146, 0.026626088, -0.056913715, 0.15370414)); + conv2d_1_tf += mul(f2, float4x4(-0.28757727, 0.14743091, -0.021321807, -0.048045393, -0.109708, -0.14760888, 0.15246773, -0.028329216, 0.009206364, -0.06396112, 0.12593451, 0.052947026, 0.066429235, -0.08044728, 0.0070432564, -0.057647638)); + conv2d_1_tf += mul(g2, float4x4(-0.023919886, -0.20876022, 0.05590491, 0.12671952, -0.07277091, 0.024939056, 0.03633482, -0.10239475, -0.12012349, -0.17192347, 0.014865882, 0.1858935, -0.013352806, -0.04451544, 0.0032296637, 0.09310079)); + conv2d_1_tf += mul(h2, float4x4(-0.29340369, 0.1377685, -0.018134177, -0.0819466, 0.2541578, -0.1270915, -0.12300359, 0.114513785, 0.21511158, -0.060876742, 0.07682154, 0.09775888, -0.09133818, 0.04477866, 0.058042303, -0.027626123)); + conv2d_1_tf += mul(i2, float4x4(-0.098641984, -0.09568759, 0.27307647, 0.044102278, -0.03640084, -0.10440432, -0.011212675, -0.22568303, -0.008232321, 0.14870772, -0.17107275, -0.023316732, 0.03395947, 0.14223643, -0.08063479, 0.14301774)); + conv2d_1_tf += mul(a3, float4x4(-0.08714423, -0.12230681, -0.22175795, -0.10298021, 0.0009175108, 0.19820437, 0.04215484, 0.2772454, 0.046766162, 0.023245906, 0.36313313, -0.29657102, 0.0010776661, 0.047935788, 0.113361314, -0.05614472)); + conv2d_1_tf += mul(b3, float4x4(0.15069975, 0.06458973, 0.08984772, -0.08219822, -0.37328726, -0.03008995, 0.31162828, 0.07075847, -0.13914284, -0.10216768, 0.22251949, -0.30631062, 0.17172062, 0.058428258, -0.11345689, 0.08461611)); + conv2d_1_tf += mul(c3, float4x4(0.007734305, 0.042484675, -0.15685312, -0.048171967, 0.10970874, 0.061090663, -0.08464978, 0.08347133, -0.17933917, 0.2308347, -0.053314723, 0.09323812, -0.04228206, 0.055042125, -0.046495847, -0.032692812)); + conv2d_1_tf += mul(d3, float4x4(-0.09439761, 0.03567186, -0.17220385, -0.103939146, -0.064900115, -0.16004047, 0.004621011, -0.014501001, -0.14071538, -0.05238438, -0.04519603, 0.21972013, -0.007383857, -0.07692677, -0.14034486, 0.08030412)); + conv2d_1_tf += mul(e3, float4x4(-0.22748968, 0.12067121, -0.05225513, 0.04308743, -0.081648685, 0.28658885, 0.37694585, -0.018508147, -0.019247225, 0.095557846, 0.015747357, 0.12365868, -0.076417744, -0.03912286, 0.18391648, -0.09244896)); + conv2d_1_tf += mul(f3, float4x4(-0.00221828, -0.0894836, 0.038467363, -0.019945016, 0.13546647, 0.17713489, -0.17275713, 0.08575425, -0.019129591, 0.16340882, -0.16357088, -0.0033604207, -0.06446814, -0.15712759, 0.18558913, -0.115558594)); + conv2d_1_tf += mul(g3, float4x4(-0.09995351, 0.18885328, -0.057601925, 0.01172547, -0.031203317, -0.1181948, 0.006120215, 0.25098777, -0.06316651, 0.047607217, -0.056073133, -0.029685916, 0.12195799, -0.056664392, -0.054523658, 0.03753435)); + conv2d_1_tf += mul(h3, float4x4(0.007936505, -0.021070726, 0.040594626, 0.061293513, -0.074233375, 0.10112329, -0.19424592, -0.14433385, -0.04661142, -0.09192385, 0.034151867, -0.11941847, 0.046759605, -0.15323174, 0.09908571, 0.18290807)); + conv2d_1_tf += mul(i3, float4x4(-0.012291647, 0.114136524, 0.10576901, -0.012061901, 0.2356885, 0.048024837, 0.18102467, -0.034004245, -0.06746709, 0.09405117, 0.12362687, 0.0254422, 0.22654915, 0.04224264, -0.049588405, 0.11478716)); + conv2d_1_tf += mul(na1, float4x4(-0.021690933, 0.13663062, -0.161411, 0.06806553, -0.1773275, -0.0940566, -0.18002738, 0.047475196, 0.0072157113, -0.008688586, -0.15493456, 0.022294179, 0.041401867, -0.10311516, -0.006603416, 0.059536614)); + conv2d_1_tf += mul(nb1, float4x4(-0.13541889, 0.047185, -0.027699882, 0.060225613, -0.035152074, 0.05752177, -0.026204573, 0.11251955, -0.0049166707, 0.17533402, -0.15755837, 0.16124752, 0.04805776, -0.10309488, 0.15945134, 0.025226792)); + conv2d_1_tf += mul(nc1, float4x4(-0.015074193, -0.094979845, 0.027753184, -0.071142055, -0.17082961, -0.06833402, 0.13620014, -0.24564765, 0.036582932, 0.13075556, 0.036705326, 0.03863992, -0.018921472, -0.0016482361, 0.13597268, -0.038188133)); + conv2d_1_tf += mul(nd1, float4x4(-0.14212462, -0.1483275, 0.05649678, 0.05684924, -0.11407954, 0.13978885, 0.070467845, -0.07458527, -0.19702937, 0.23950967, -0.15242746, -0.26435548, -0.14437793, 0.21487178, 0.4991241, 0.18331984)); + conv2d_1_tf += mul(ne1, float4x4(0.20045248, 0.066468574, -0.015601024, 0.012849705, -0.14952832, -0.06828453, 0.16009094, -0.09515789, -0.1071139, -0.021629127, -0.012993768, -0.022518635, 0.19255438, -0.09875012, 0.07555782, 0.0780372)); + conv2d_1_tf += mul(nf1, float4x4(-0.028311213, -0.025465565, 0.020059558, -0.116105095, -0.042490575, 0.020179577, 0.010893176, -0.11184776, -0.1702318, -0.025035636, 0.008381181, 0.0586714, 0.03539251, -0.0448198, -0.056921933, -0.029987138)); + conv2d_1_tf += mul(ng1, float4x4(0.049813945, 0.08434948, 0.09337763, 0.06701621, -0.061224304, -0.24754077, -0.017353527, -0.042758185, 0.013161995, -0.22947139, 0.019135898, 0.11039477, 0.16954716, -0.25619635, 0.18368678, 0.03542052)); + conv2d_1_tf += mul(nh1, float4x4(-0.15430786, 0.07348774, 0.15545642, 0.20969617, 0.1067826, 0.15255202, 0.020220853, 0.09658389, -0.088782035, -0.19119574, 0.13885954, 0.15108526, -0.07552868, -0.11574438, -0.034102093, -0.031383175)); + conv2d_1_tf += mul(ni1, float4x4(0.061409608, -0.00082869077, -0.08336049, -0.01866603, 0.07322213, -0.1152386, -0.004205211, -0.18793713, 0.091782115, 0.05387527, 0.069104694, 0.25387684, -0.101916246, 0.065856785, -0.020407397, 0.035098225)); + conv2d_1_tf += mul(na2, float4x4(0.06225989, -0.039721318, 0.19908188, 0.08382035, -0.024357362, 0.014932128, -0.060558856, -0.049815435, -0.03166011, 0.0339055, -0.12810327, 0.008812703, 0.06120202, 0.085533425, 0.21571258, -0.20605975)); + conv2d_1_tf += mul(nb2, float4x4(-0.045329664, 0.02261115, -0.0335033, -0.058562186, -0.0099387, 0.0046313554, 0.21475597, 0.04558062, 0.17891279, 0.005057579, 0.22518916, 0.1998231, 0.09627137, -0.2318303, -0.08868813, -0.27863982)); + conv2d_1_tf += mul(nc2, float4x4(-0.15865076, 0.077262044, 0.036153752, 0.07885703, 0.13166751, -0.12820594, -0.05823962, -0.2583444, -0.2245552, -0.04434666, -0.13453422, -0.27865237, 0.014107271, 0.045582164, 0.0064884513, -0.019007552)); + conv2d_1_tf += mul(nd2, float4x4(0.0643133, 0.06440001, -0.14517003, -0.101694606, 0.058990445, 0.11955667, 0.45094532, 0.20261864, 0.07944409, -0.061399437, 0.022036074, 0.046660237, -0.17064287, -0.076766625, 0.25972953, 0.29821205)); + conv2d_1_tf += mul(ne2, float4x4(-0.11031386, -0.05850727, 0.055557184, 0.11549242, 0.12120408, -0.33330265, 0.095613986, 0.09242419, -0.011835885, -0.19384164, -0.01893125, 0.27290896, -0.18104021, 0.044360142, 0.06759539, -0.0027218745)); + conv2d_1_tf += mul(nf2, float4x4(0.19390257, -0.13378039, 0.07428329, 0.016053686, -0.18574655, 0.055462763, -0.2527128, -0.47279125, -0.17490762, 0.21626428, -0.1473371, -0.35594228, 0.054865763, -0.04086486, -0.061911695, 0.051812805)); + conv2d_1_tf += mul(ng2, float4x4(-0.029701848, 0.24927482, 0.00581731, -0.10748679, -0.07500632, 0.033424605, 0.14734372, -0.18966366, 0.031880617, 0.17622112, -0.031867832, -0.10119831, -0.15391265, -0.14308685, 0.093484215, 0.18867014)); + conv2d_1_tf += mul(nh2, float4x4(0.19035357, -0.19525306, -0.025621792, 0.09154427, -0.07798503, -0.22271548, 0.11034287, -0.04197031, -0.24772005, 0.43681505, -0.19703668, -0.2614237, 0.05807699, -0.2631317, -0.020604266, -0.048005704)); + conv2d_1_tf += mul(ni2, float4x4(-0.08587588, 0.13374045, -0.09263761, -0.13216262, -0.11242246, -0.12541875, -0.09835177, 0.1586739, -0.21013282, 0.087373346, 0.107112356, 0.47657737, 0.0459955, -0.07181196, 0.07818155, -0.10435423)); + conv2d_1_tf += mul(na3, float4x4(-0.091803394, -0.32280564, 0.28972253, 0.12908047, 0.06683764, -0.039376236, 0.024078066, 0.18940936, -0.055246543, 0.12222864, -0.0177199, 0.09346665, 0.07164098, 0.065791056, -0.08516637, -0.10187257)); + conv2d_1_tf += mul(nb3, float4x4(-0.12561126, -0.28730518, 0.190799, -0.17922764, 0.04376582, -0.08152354, -0.0690038, -0.10861494, -0.03100546, 0.10962334, -0.20492296, 0.12868984, 0.06536495, 0.08559974, 0.033028, -0.07235402)); + conv2d_1_tf += mul(nc3, float4x4(-0.012734173, -0.12211726, 0.057524282, 0.015053666, -0.052275516, 0.11774483, 0.08221696, -0.024205929, 0.122006595, 0.054565493, -0.049608365, 0.02801238, 0.07593017, 0.074450806, 0.097137615, -0.008985974)); + conv2d_1_tf += mul(nd3, float4x4(-0.32826158, -0.022971062, 0.37642807, 0.38614145, -0.06932448, 0.0641898, -0.09011684, -0.019884817, -0.004897904, 0.07661578, -0.050405186, -0.24849766, 0.04642452, 0.09120379, 0.26060387, -0.2533109)); + conv2d_1_tf += mul(ne3, float4x4(0.09669597, -0.045555357, -0.24132517, -0.28401875, 0.11226361, 0.08378312, -0.07415474, -0.036874313, -0.001286788, 0.14013582, 0.14750466, -0.048925027, 0.13374946, 0.10844033, 0.123459235, -0.10933974)); + conv2d_1_tf += mul(nf3, float4x4(-0.03275827, 0.27429518, -0.0983686, -0.010947437, -0.18409865, 0.12616666, -0.05766888, 0.07149005, -0.13777009, 0.022123039, 0.084938325, 0.015972659, 0.20145003, -0.09534558, -0.0082679195, -0.1515079)); + conv2d_1_tf += mul(ng3, float4x4(0.13148536, -0.3421452, 0.08851102, 0.012056574, -0.1525749, 0.09364548, -0.02235517, -0.1775178, 0.18052714, -0.14639667, 0.07453223, 0.03912742, -0.284782, 0.023833552, 0.09671063, -0.168578)); + conv2d_1_tf += mul(nh3, float4x4(-0.24303597, -0.05585747, -0.21645154, -0.084838174, -0.15413773, -0.15403214, -0.021544017, 0.15751824, -0.027032627, -0.18457665, -0.02174098, -0.0070916233, -0.1609649, -0.32226282, -0.18423033, -0.29629233)); + conv2d_1_tf += mul(ni3, float4x4(0.1602529, 0.026087781, 0.01551678, 0.07093837, -0.007075046, -0.0061597642, -0.0057887356, -0.08935906, 0.0028665168, -0.1038671, -0.093715765, -0.035213456, -0.041290607, -0.15825188, 0.11327359, -0.20286629)); + conv2d_1_tf += float4(-0.062293675, 0.09216847, 0.010529031, 0.03100192); + tex4[gxy] = conv2d_1_tf; + float4 nconv2d_1_tf = max(-conv2d_1_tf, 0); + conv2d_1_tf = max(conv2d_1_tf, 0); + + float4 target = mul(e1, float4x4(-0.02357968, 0.13800439, 0.054744735, -0.32328397, -0.2263118, -0.3222542, -0.15286992, -0.3053175, -0.20046607, 0.025345843, 0.032755207, 0.40165102, 0.03166696, 0.29110438, 0.28861988, 0.05585125)); + target += mul(e2, float4x4(0.11055126, -0.33034575, 0.039494887, -0.17843343, 0.35742196, 0.00032650787, 0.21049741, 0.18823248, -0.1741954, 0.27586365, -0.043366615, 0.02092058, -0.082515135, -0.15504313, 0.13261497, 0.14650741)); + target += mul(e3, float4x4(0.39276633, -0.031067554, -0.08830738, -0.23975314, -0.20294978, 0.030291535, 0.4623106, 0.06494191, 0.042467684, -0.28105733, -0.053258326, -0.17269841, 0.09479501, 0.11930515, 0.1258843, 0.11058792)); + target += mul(ne1, float4x4(-0.18343425, -0.4381688, -0.08248827, -0.42846557, -0.08277779, 0.45192116, 0.21961756, 0.23076119, -0.2093829, -0.29050866, 0.26212537, -0.25469857, -0.4832557, -0.45126852, -0.35072148, -0.18368497)); + target += mul(ne2, float4x4(0.10529696, 0.5964488, 0.13258573, -0.07494986, -0.3341919, 0.19418421, -0.18307082, 0.34982273, -0.0430461, 0.21097268, 0.03212202, -0.015623122, 0.43791813, 0.16207397, 0.123477034, -0.087993294)); + target += mul(ne3, float4x4(-0.01878982, 0.007308694, 0.25769314, 0.18407181, 0.00095180905, -0.2600526, -0.31043288, -0.24622385, 0.07832029, 0.05502411, 0.37793204, -0.07329948, -0.28405467, -0.15038961, 0.19259417, 0.105486296)); + target += mul(conv2d_2_tf, float4x4(0.047820415, 0.3303589, 0.035807017, -0.41168606, -0.2118325, -0.045765184, -0.15234827, 0.28021428, -0.2084036, -0.40200952, -0.3261011, -0.13480914, -0.06876906, -0.19167677, -0.20444186, -0.44851676)); + target += mul(nconv2d_2_tf, float4x4(-0.24726203, -0.0097923195, -0.23193192, 0.31947026, 0.4274281, -0.36929542, 0.10095328, -0.19663717, 0.3244895, 0.49458218, 0.24745567, 0.15722558, 0.43052208, 0.377559, 0.22543637, 0.13009055)); + target += mul(conv2d_1_tf, float4x4(0.01817998, 0.111477636, -0.12727399, 0.27395004, 0.19770023, -0.1636959, 0.25407487, -0.24871433, -0.08552937, 0.3223687, 0.30668882, 0.40221208, -0.20192504, 0.14656074, 0.5100356, -0.0948956)); + target += mul(nconv2d_1_tf, float4x4(0.40383592, -0.043663148, 0.4813348, 0.10317451, -0.049076255, -0.022925228, 0.0872564, 0.21741754, 0.23656987, -0.22309794, -0.2260013, 0.20823886, -0.055542476, 0.016604664, -0.1964831, 0.11962174)); + target += float4(-0.049604952, -0.039514415, -0.06137416, -0.0015509313); + tex5[gxy] = target; + + target = mul(e1, float4x4(0.029635962, 0.08045753, 0.03622311, 0.06677362, 0.14780864, -0.087087184, 0.22309896, -0.1772139, -0.08716722, 0.1075154, 0.044472143, 0.021324798, 0.10346262, -0.24718447, -0.2489118, 0.4517737)); + target += mul(e2, float4x4(0.20637918, -0.11695054, 0.27656725, 0.009858572, -0.62555677, 0.12796827, -0.057749186, -0.02636826, 0.11764726, -0.034879886, -0.062285252, -0.048256125, 0.37146622, -0.17392562, 0.24782267, 0.3184173)); + target += mul(e3, float4x4(0.2624149, 0.007052751, 0.1595428, 0.26269603, -0.33775207, -0.66331345, 0.18036188, -0.25012106, -0.15003558, 0.12337829, -0.3230818, 0.06187628, 0.096601635, 0.24300486, -0.13784438, 0.27110842)); + target += mul(ne1, float4x4(-0.180413, 0.039972585, 0.48966697, -0.4130023, -0.03654654, -0.27514896, -0.025462124, 0.06652415, 0.28900522, 0.035381883, 0.20655172, 0.0073647103, -0.5028713, -0.0061578755, -0.09185675, -0.52771837)); + target += mul(ne2, float4x4(-0.3205473, -0.23172325, -0.20749244, 0.058195353, 0.20280065, -0.106998004, 0.08968707, 0.10981961, -0.13291806, 0.0028465164, 0.11793527, 0.11942547, 0.100123264, -0.14852245, -0.032194547, -0.118260525)); + target += mul(ne3, float4x4(0.004620961, -0.13271236, 0.110130526, -0.075169735, 0.35998157, -0.046072174, 0.02044828, -0.1019322, -0.038753018, -0.12328749, -0.28227237, 0.18373057, -0.23704045, 0.20384738, 0.097455874, -0.23102747)); + target += mul(conv2d_2_tf, float4x4(0.30397, -0.007688397, -0.2519374, -0.14401323, -0.031671453, 0.10171321, -0.18295656, -0.029794114, 0.19171898, 0.23662621, 0.09319509, -0.3479054, 0.036986895, 0.13572362, 0.1142681, -0.17851138)); + target += mul(nconv2d_2_tf, float4x4(-0.19525734, 0.36855492, 0.05751295, -0.12524441, 0.06309533, 0.20228319, -0.07533531, 0.26733333, -0.21407285, -0.2900094, -0.28743416, 0.18039729, -0.27968687, -0.23786859, -0.21049118, -0.006130187)); + target += mul(conv2d_1_tf, float4x4(0.34406897, -0.14967814, 0.56049985, -0.18166065, -0.061995413, 0.117799215, 0.3054206, 0.4034068, -0.2116504, -0.6017806, 0.004660423, 0.051566444, 0.4380975, -0.3172436, -0.09930328, -0.16182126)); + target += mul(nconv2d_1_tf, float4x4(-0.09316841, 0.036305115, -0.30209473, 0.098138526, -0.012532953, -0.050068337, -0.22571203, -0.30636647, -0.124337815, 0.07323685, -0.15504828, 0.19263308, -0.017216058, 0.34484297, -0.1460544, -0.24951003)); + target += float4(0.10388342, 0.00828351, 0.14884935, 0.034392886); + tex6[gxy] = target; + + target = mul(e1, float4x4(-0.15275823, 0.31693572, 0.03429309, -0.06982273, 0.08535909, 0.019838037, -0.03189405, 0.3190016, 0.16633914, 0.48730284, -0.27923077, 0.31791112, 0.43154097, 0.005003616, -0.26277873, -0.009333685)); + target += mul(e2, float4x4(0.23504019, -0.12419379, 0.07217815, -0.090434305, -0.0380588, -0.14686479, -0.33812302, -0.20242776, -0.20776805, 0.24741934, -0.16489775, 0.07052134, -0.08030772, 0.23784883, -0.28709608, -0.17689173)); + target += mul(e3, float4x4(-0.05109775, -0.40860242, -0.003464472, -0.19893257, 0.23186824, -0.12760048, -0.22718583, 0.02299852, 0.27083093, 0.073904194, -0.056870755, -0.35324985, -0.023004858, -0.29591596, -0.020298446, -0.05753052)); + target += mul(ne1, float4x4(0.0035456547, -0.37682405, 0.047876693, 0.1168026, 0.015805494, -0.04388269, 0.12970346, 0.2497829, -0.009891778, 0.116980106, 0.13058232, 0.22570355, 0.13866597, 0.036246244, 0.10916998, -0.040503114)); + target += mul(ne2, float4x4(-0.25300103, -0.065156855, 0.063345924, 0.11406543, -0.1902478, 0.16440767, 0.043949526, 0.43318078, -0.03932035, -0.08510957, 0.19621156, -0.045045726, -0.08339006, -0.04335483, 0.37129655, -0.22328225)); + target += mul(ne3, float4x4(0.16169593, 0.2758587, 0.38249364, 0.12606645, 0.4582731, 0.09374545, -0.10988087, -0.21678255, -0.004099455, -0.09436347, 0.33964127, 0.20880581, -0.06742301, -0.025149476, 0.12146305, 0.5012377)); + target += mul(conv2d_2_tf, float4x4(0.11523535, 0.31662583, -0.0709322, -0.066175185, 0.08868106, -0.042457394, 0.32469732, -0.1987238, 0.41399983, 0.015568244, 0.14037918, 0.2879998, -0.32157704, 0.22491854, -0.07769691, 0.2052648)); + target += mul(nconv2d_2_tf, float4x4(-0.299831, -0.247278, -0.2011737, -0.3759366, -0.14935663, -0.095033385, 0.06259881, -0.23891686, -0.4340098, 0.07340212, -0.0012697511, -0.16527005, 0.0814454, -0.43962866, -0.3040046, 0.06242604)); + target += mul(conv2d_1_tf, float4x4(0.11802704, 0.2323739, 0.13466287, -0.25053164, -0.08020803, 0.1628004, -0.030645542, -0.40872335, -0.24624921, 0.15931502, 0.40752286, -0.07906199, 0.4286516, -0.1651973, -0.07021073, 0.0867332)); + target += mul(nconv2d_1_tf, float4x4(-0.23617363, 0.053548977, -0.14130518, -0.37744048, -0.11805406, -0.13757266, -0.026939899, 0.028020354, 0.24626125, -0.06998214, -0.02793638, 0.10509643, 0.06577935, -0.17211749, -0.12747282, -0.16999653)); + target += float4(-0.022106458, -0.012578552, 0.016203664, 0.026009269); + tex7[gxy] = target; +} + + +//!PASS 3 +//!STYLE PS +//!IN tex1 +//!OUT OUTPUT +float4 Pass3(float2 pos) { + return tex1.SampleLevel(sam1, pos, 0); +} From dd048204093c56a7983d3975a4e4b997cba0c0c6 Mon Sep 17 00:00:00 2001 From: Xu <34770031+Blinue@users.noreply.github.com> Date: Wed, 21 Feb 2024 23:45:14 +0800 Subject: [PATCH 108/155] =?UTF-8?q?feat:=20=E7=A7=BB=E6=A4=8D=20Anime4K=5F?= =?UTF-8?q?Upscale=5FGAN=5Fx3=5FL=202?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Anime4K/Anime4K_Upscale_GAN_x3_L.hlsl | 1932 +++++++++++++++++ src/Effects/Anime4K_Upscale_GAN_x3_L.hlsl | 462 ---- src/Effects/Effects.vcxproj | 5 + src/Effects/Effects.vcxproj.filters | 3 + 4 files changed, 1940 insertions(+), 462 deletions(-) create mode 100644 src/Effects/Anime4K/Anime4K_Upscale_GAN_x3_L.hlsl delete mode 100644 src/Effects/Anime4K_Upscale_GAN_x3_L.hlsl diff --git a/src/Effects/Anime4K/Anime4K_Upscale_GAN_x3_L.hlsl b/src/Effects/Anime4K/Anime4K_Upscale_GAN_x3_L.hlsl new file mode 100644 index 000000000..ff02f64ae --- /dev/null +++ b/src/Effects/Anime4K/Anime4K_Upscale_GAN_x3_L.hlsl @@ -0,0 +1,1932 @@ +// Anime4K_Upscale_GAN_x3_L +// 移植自 https://github.com/bloc97/Anime4K/blob/8e39551ce96ed172605c89b7dd8be855b5502cc9/glsl/Upscale/Anime4K_Upscale_GAN_x3_L.glsl + +//!MAGPIE EFFECT +//!VERSION 4 + +// 圆括号内的输入只被采样一次 +// INPUT -> tf, tf1, tf2 +// tf, tf1, tf2 -> 1_tf, 3_tf, 3_tf1, 3_tf2 +// 3_tf, 3_tf1, 3_tf2, (1_tf) -> 4_tf, 6_tf, 6_tf1, 6_tf2 +// 6_tf, 6_tf1, 6_tf2, (1_tf), (4_tf) -> 7_tf, 9_tf, 9_tf1, 9_tf2 +// 9_tf, 9_tf1, 9_tf2, (1_tf), (4_tf), (7_tf) -> 11_tf, 10_tf, 12_tf, 12_tf1, 12_tf2 +// 12_tf, 12_tf1, 12_tf2, 11_tf, (1_tf), (4_tf), (7_tf), (10_tf) -> 0ups, 0ups1, 0ups2 +// 0ups, 0ups1, 0ups2 -> 1ups, 1ups1 +// INPUT, 1ups, 1ups1 -> OUTPUT + +//!TEXTURE +Texture2D INPUT; + +//!TEXTURE +//!WIDTH INPUT_WIDTH * 3 +//!HEIGHT INPUT_HEIGHT * 3 +Texture2D OUTPUT; + +//!SAMPLER +//!FILTER POINT +SamplerState sam; + +//!SAMPLER +//!FILTER LINEAR +SamplerState sam1; + +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +//!FORMAT R16G16B16A16_FLOAT +Texture2D tex1; + +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +//!FORMAT R16G16B16A16_FLOAT +Texture2D tex2; + +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +//!FORMAT R16G16B16A16_FLOAT +Texture2D tex3; + +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +//!FORMAT R16G16B16A16_FLOAT +Texture2D tex4; + +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +//!FORMAT R16G16B16A16_FLOAT +Texture2D tex5; + +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +//!FORMAT R16G16B16A16_FLOAT +Texture2D tex6; + +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +//!FORMAT R16G16B16A16_FLOAT +Texture2D tex7; + +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +//!FORMAT R16G16B16A16_FLOAT +Texture2D tex8; + +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +//!FORMAT R16G16B16A16_FLOAT +Texture2D tex9; + +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +//!FORMAT R16G16B16A16_FLOAT +Texture2D tex10; + +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +//!FORMAT R16G16B16A16_FLOAT +Texture2D tex11; + +//!TEXTURE +//!WIDTH INPUT_WIDTH * 3 +//!HEIGHT INPUT_HEIGHT * 3 +//!FORMAT R16G16B16A16_FLOAT +Texture2D conv1ups; + +//!TEXTURE +//!WIDTH INPUT_WIDTH * 3 +//!HEIGHT INPUT_HEIGHT * 3 +//!FORMAT R16G16B16A16_FLOAT +Texture2D conv1ups1; + + +//!PASS 1 +//!DESC Conv-4x3x3x3 +//!IN INPUT +//!OUT tex1, tex2, tex3 +//!BLOCK_SIZE 16 +//!NUM_THREADS 64 + +void Pass1(uint2 blockStart, uint3 threadId) { + uint2 gxy = (Rmp8x8(threadId.x) << 1) + blockStart; + uint2 inputSize = GetInputSize(); + if (gxy.x >= inputSize.x || gxy.y >= inputSize.y) { + return; + } + float2 inputPt = GetInputPt(); + + uint i, j; + + min16float3 src[4][4]; + [unroll] + for (i = 0; i <= 2; i += 2) { + [unroll] + for (j = 0; j <= 2; j += 2) { + float2 tpos = (gxy + uint2(i, j)) * inputPt; + const min16float4 sr = INPUT.GatherRed(sam, tpos); + const min16float4 sg = INPUT.GatherGreen(sam, tpos); + const min16float4 sb = INPUT.GatherBlue(sam, tpos); + + // w z + // x y + src[i][j] = min16float3(sr.w, sg.w, sb.w); + src[i][j + 1] = min16float3(sr.x, sg.x, sb.x); + src[i + 1][j] = min16float3(sr.z, sg.z, sb.z); + src[i + 1][j + 1] = min16float3(sr.y, sg.y, sb.y); + } + } + + [unroll] + for (i = 1; i <= 2; ++i) { + [unroll] + for (j = 1; j <= 2; ++j) { + uint2 destPos = gxy + uint2(i - 1, j - 1); + + if (i != 1 || j != 1) { + if (destPos.x >= inputSize.x || destPos.y >= inputSize.y) { + continue; + } + } + + min16float4 result = mul(src[i - 1][j - 1], min16float3x4(-0.26345107, 0.18636681, 0.068192646, 0.06335259, -0.5026903, -0.39884016, -0.14562744, -0.24653248, -0.44533378, 0.52169526, -0.35453957, 0.25303423)); + result += mul(src[i - 1][j], min16float3x4(-0.22396083, 0.1324318, 0.47152156, -0.3061965, -0.06026671, -0.26795772, 0.0081171375, -0.32897332, -0.16401465, -0.1018444, 0.48241594, -0.09054633)); + result += mul(src[i - 1][j + 1], min16float3x4(0.25090155, -0.15917313, 0.028407926, -0.24014995, 0.4114972, -0.45535553, 0.08742311, 0.16796699, 0.0995656, -0.4009339, 0.21471445, 0.2708967)); + result += mul(src[i][j - 1], min16float3x4(-0.16269766, 0.16389379, -0.12857921, -0.1602467, -0.16460834, 0.15754342, 0.46217716, 0.20442651, 0.0548621, -0.018400457, 0.38643107, -0.29171357)); + result += mul(src[i][j], min16float3x4(-0.24035631, -0.33344224, -0.3904698, -0.4168555, -0.42237657, 0.36649242, 0.41396108, -0.38945103, -0.5806718, 0.035621256, 0.09171773, -0.54301006)); + result += mul(src[i][j + 1], min16float3x4(0.15957133, -0.035278857, 0.1318051, 0.6896821, 0.18556473, 0.16378926, 0.32670698, 0.2675555, 0.08802092, 0.41140598, 0.05322177, 0.5030955)); + result += mul(src[i + 1][j - 1], min16float3x4(-0.082798496, 0.24381381, -0.30908522, 0.04553323, 0.25664318, 0.4123797, -0.29377607, 0.15920162, 0.13717672, 0.027625162, 0.25476956, 0.21843456)); + result += mul(src[i + 1][j], min16float3x4(0.14534818, -0.239681, 0.22961527, 0.3814783, 0.1233398, 0.2449555, 0.015051085, 0.1661234, -0.27740797, -0.29109767, -0.19438179, -0.027439274)); + result += mul(src[i + 1][j + 1], min16float3x4(0.0011904882, -0.01287622, -0.1573707, -0.13167281, -0.12803882, -0.079415865, -0.04034391, -0.09625339, 0.23190106, -0.26743674, -0.48981485, -0.2063946)); + result += min16float4(0.034235504, 0.039522275, -0.032817896, -0.0031068379); + tex1[destPos] = result; + + result = mul(src[i - 1][j - 1], min16float3x4(-0.17155029, -0.084075995, 0.2281505, 0.38326037, 0.18672232, -0.2562305, 0.30811027, 0.30188802, -0.24588907, 0.088734694, 0.14092724, -0.18793459)); + result += mul(src[i - 1][j], min16float3x4(-0.47514066, 0.51882815, 0.1561294, -0.043147214, -0.19554369, 0.19514531, -0.14636773, 0.11425865, -0.2772368, 0.5388449, 0.54875004, -0.4526634)); + result += mul(src[i - 1][j + 1], min16float3x4(0.11270131, 0.44642356, -0.066219814, 0.15781905, 0.056682296, 0.026522577, 0.05600635, -0.13799536, 0.15637676, -0.15661198, 0.53794587, 0.09693692)); + result += mul(src[i][j - 1], min16float3x4(-0.23679815, 0.16397353, 0.37343305, 0.07477207, -0.36061585, 0.24027273, 0.3222875, 0.05577238, -0.17547923, 0.11737104, 0.10193468, -0.056727592)); + result += mul(src[i][j], min16float3x4(0.2335428, -0.5571976, 0.13586389, -0.3443148, 0.4537042, -0.59349614, -0.24114902, 0.08669349, 0.2881981, -0.29106617, -0.47775048, 0.22723311)); + result += mul(src[i][j + 1], min16float3x4(0.006350133, -0.28196353, 0.22710627, 0.30080464, -0.3500525, 0.09254133, -0.48047104, -0.30452347, -0.077637784, -0.11856046, 0.07377078, 0.44280833)); + result += mul(src[i + 1][j - 1], min16float3x4(0.2200762, 0.3665277, 0.043291833, 0.21484855, 0.15553318, -0.035003938, 0.14891839, -0.29007155, 0.23154758, -0.2348225, 0.48130423, 0.00733271)); + result += mul(src[i + 1][j], min16float3x4(0.28228128, 0.054867495, 0.08010268, -0.2980908, 0.15146615, -0.058449056, -0.43990552, -0.5963296, 0.09321943, 0.20146254, -0.08043876, 0.017381484)); + result += mul(src[i + 1][j + 1], min16float3x4(0.076894, 0.16354772, 0.25471574, 0.24382424, -0.15274979, -0.19706573, -0.30667382, 0.523845, 0.023073493, 0.34462887, -0.3384359, 0.18867111)); + result += min16float4(0.014904483, -0.009271063, 0.04884906, 0.0106121525); + tex2[destPos] = result; + + result = mul(src[i - 1][j - 1], min16float3x4(-0.34360278, -0.28731042, -0.017787619, 0.36802426, 0.33655256, -0.24784079, 0.29148427, 0.28857, -0.3111454, 0.0030706236, -0.25914, 0.5528963)); + result += mul(src[i - 1][j], min16float3x4(0.12459981, -0.17094392, -0.18776429, 0.37819883, 0.1320519, 0.21927781, -0.16188109, 0.050895408, -0.06871313, 0.16754176, 0.29934305, 0.052247107)); + result += mul(src[i - 1][j + 1], min16float3x4(-0.016753385, -0.0935026, -0.3025131, 0.029084548, -0.17713268, 0.23525053, 0.015773006, 0.5464473, 0.49457568, 0.03073306, 0.18685353, 0.28700578)); + result += mul(src[i][j - 1], min16float3x4(0.135332, 0.07585244, 0.05262212, -0.15484884, -0.13468477, 0.5161883, 0.10347934, -0.37127933, 0.12426171, 0.48973167, 0.19040361, -0.24403319)); + result += mul(src[i][j], min16float3x4(-0.54557467, 0.07250278, 0.37912187, 0.0044768555, -0.47080016, -0.4050018, 0.64416456, -0.58235925, -0.28048036, -0.32962233, -0.28131053, 0.022653949)); + result += mul(src[i][j + 1], min16float3x4(0.17059836, 0.016603703, 0.34638256, 0.028987328, 0.43271738, -0.15030707, 0.072848, 0.1422675, -0.23391044, -0.12179815, 0.37569857, -0.056668952)); + result += mul(src[i + 1][j - 1], min16float3x4(-0.0428437, 0.15237094, -0.26750615, 0.053740855, -0.04772152, -0.13561963, -0.20043467, -0.018060924, 0.29031327, -0.17592178, -0.5016104, -0.36639994)); + result += mul(src[i + 1][j], min16float3x4(0.39091983, -0.257284, -0.39293087, -0.1182859, -0.46328986, -0.1585645, -0.32158652, 0.41519204, 0.21179573, -0.3613411, -0.032484483, -0.03755994)); + result += mul(src[i + 1][j + 1], min16float3x4(0.42772895, 0.11436431, -0.115817815, -0.29173127, 0.57807744, -0.21997264, -0.49362126, 0.021626333, 0.1258072, -0.062251803, -0.16541855, 0.061321106)); + result += min16float4(-0.017981518, -0.012223751, -0.0033700857, 0.013441364); + tex3[destPos] = result; + } + } +} + + +//!PASS 2 +//!DESC Conv-4x3x3x24, Conv-4x1x1x40 +//!IN tex1, tex2, tex3 +//!OUT tex4, tex5, tex6, tex7 +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 + +void Pass2(uint2 blockStart, uint3 threadId) { + uint2 gxy = Rmp8x8(threadId.x) + blockStart; + uint2 inputSize = GetInputSize(); + if (gxy.x >= inputSize.x || gxy.y >= inputSize.y) { + return; + } + + float2 inputPt = GetInputPt(); + float2 pos = (gxy + 0.5f) * inputPt; + + // [ a, d, g ] + // [ b, e, h ] + // [ c, f, i ] + min16float4 a1 = tex1.SampleLevel(sam, pos - inputPt, 0); + min16float4 b1 = tex1.SampleLevel(sam, pos + float2(-inputPt.x, 0), 0); + min16float4 c1 = tex1.SampleLevel(sam, pos + float2(-inputPt.x, inputPt.y), 0); + min16float4 d1 = tex1.SampleLevel(sam, pos + float2(0, -inputPt.y), 0); + min16float4 e1 = tex1.SampleLevel(sam, pos, 0); + min16float4 f1 = tex1.SampleLevel(sam, pos + float2(0, inputPt.y), 0); + min16float4 g1 = tex1.SampleLevel(sam, pos + float2(inputPt.x, -inputPt.y), 0); + min16float4 h1 = tex1.SampleLevel(sam, pos + float2(inputPt.x, 0), 0); + min16float4 i1 = tex1.SampleLevel(sam, pos + inputPt, 0); + + min16float4 na1 = max(-a1, 0); + min16float4 nb1 = max(-b1, 0); + min16float4 nc1 = max(-c1, 0); + min16float4 nd1 = max(-d1, 0); + min16float4 ne1 = max(-e1, 0); + min16float4 nf1 = max(-f1, 0); + min16float4 ng1 = max(-g1, 0); + min16float4 nh1 = max(-h1, 0); + min16float4 ni1 = max(-i1, 0); + + a1 = max(a1, 0); + b1 = max(b1, 0); + c1 = max(c1, 0); + d1 = max(d1, 0); + e1 = max(e1, 0); + f1 = max(f1, 0); + g1 = max(g1, 0); + h1 = max(h1, 0); + i1 = max(i1, 0); + + min16float4 a2 = tex2.SampleLevel(sam, pos - inputPt, 0); + min16float4 b2 = tex2.SampleLevel(sam, pos + float2(-inputPt.x, 0), 0); + min16float4 c2 = tex2.SampleLevel(sam, pos + float2(-inputPt.x, inputPt.y), 0); + min16float4 d2 = tex2.SampleLevel(sam, pos + float2(0, -inputPt.y), 0); + min16float4 e2 = tex2.SampleLevel(sam, pos, 0); + min16float4 f2 = tex2.SampleLevel(sam, pos + float2(0, inputPt.y), 0); + min16float4 g2 = tex2.SampleLevel(sam, pos + float2(inputPt.x, -inputPt.y), 0); + min16float4 h2 = tex2.SampleLevel(sam, pos + float2(inputPt.x, 0), 0); + min16float4 i2 = tex2.SampleLevel(sam, pos + inputPt, 0); + + min16float4 na2 = max(-a2, 0); + min16float4 nb2 = max(-b2, 0); + min16float4 nc2 = max(-c2, 0); + min16float4 nd2 = max(-d2, 0); + min16float4 ne2 = max(-e2, 0); + min16float4 nf2 = max(-f2, 0); + min16float4 ng2 = max(-g2, 0); + min16float4 nh2 = max(-h2, 0); + min16float4 ni2 = max(-i2, 0); + + a2 = max(a2, 0); + b2 = max(b2, 0); + c2 = max(c2, 0); + d2 = max(d2, 0); + e2 = max(e2, 0); + f2 = max(f2, 0); + g2 = max(g2, 0); + h2 = max(h2, 0); + i2 = max(i2, 0); + + min16float4 a3 = tex3.SampleLevel(sam, pos - inputPt, 0); + min16float4 b3 = tex3.SampleLevel(sam, pos + float2(-inputPt.x, 0), 0); + min16float4 c3 = tex3.SampleLevel(sam, pos + float2(-inputPt.x, inputPt.y), 0); + min16float4 d3 = tex3.SampleLevel(sam, pos + float2(0, -inputPt.y), 0); + min16float4 e3 = tex3.SampleLevel(sam, pos, 0); + min16float4 f3 = tex3.SampleLevel(sam, pos + float2(0, inputPt.y), 0); + min16float4 g3 = tex3.SampleLevel(sam, pos + float2(inputPt.x, -inputPt.y), 0); + min16float4 h3 = tex3.SampleLevel(sam, pos + float2(inputPt.x, 0), 0); + min16float4 i3 = tex3.SampleLevel(sam, pos + inputPt, 0); + + min16float4 na3 = max(-a3, 0); + min16float4 nb3 = max(-b3, 0); + min16float4 nc3 = max(-c3, 0); + min16float4 nd3 = max(-d3, 0); + min16float4 ne3 = max(-e3, 0); + min16float4 nf3 = max(-f3, 0); + min16float4 ng3 = max(-g3, 0); + min16float4 nh3 = max(-h3, 0); + min16float4 ni3 = max(-i3, 0); + + a3 = max(a3, 0); + b3 = max(b3, 0); + c3 = max(c3, 0); + d3 = max(d3, 0); + e3 = max(e3, 0); + f3 = max(f3, 0); + g3 = max(g3, 0); + h3 = max(h3, 0); + i3 = max(i3, 0); + + min16float4 conv2d_2_tf = mul(a1, min16float4x4(0.1881249, -0.14544061, -0.022969106, 0.088232316, 0.0058642747, -0.049336948, -0.039974928, 0.06410949, -0.09211665, -0.034005307, -0.1095955, 0.10930763, -0.26397142, 0.1384094, 0.017342392, -0.21376696)); + conv2d_2_tf += mul(b1, min16float4x4(-0.14526816, -0.0639951, 0.11742242, -0.006982521, -0.05208895, 0.089485295, -0.19564004, -0.08121572, -0.11621622, 0.15375662, -0.15378582, 0.0596373, 0.14132364, -0.06385903, 0.05449634, -0.047440365)); + conv2d_2_tf += mul(c1, min16float4x4(-0.082622305, -0.23856479, 0.06367865, -0.019509695, 0.094882965, -0.04511791, 0.16706854, 0.20536391, 0.1409632, -0.10635743, 0.038904104, -0.0039008786, 0.16198882, -0.17409256, 0.13213669, 0.08329318)); + conv2d_2_tf += mul(d1, min16float4x4(-0.1186756, 0.2009846, -0.086417995, 0.20491274, -0.13763973, -0.0800847, 0.16069777, 0.10931271, 0.14152408, 0.047218926, 0.041168302, -0.054257084, -0.08315953, -0.1573787, 0.20787828, 0.118524544)); + conv2d_2_tf += mul(e1, min16float4x4(-0.19046788, 0.10213364, -0.112078644, -0.16287695, 0.011410189, -0.016858546, -0.09383451, -0.063516155, -0.17561492, -0.15199865, -0.112707786, -0.18099716, 0.19017689, -0.20048961, -0.5382596, -0.24332014)); + conv2d_2_tf += mul(f1, min16float4x4(-0.1465597, 0.044423096, 0.04632811, -0.015121401, -0.051081203, -0.09574356, -0.10018257, -0.019390205, -0.1562855, 0.041693382, -0.012624074, 0.057703923, 0.09825134, 0.1544577, 0.1683734, 0.018580355)); + conv2d_2_tf += mul(g1, min16float4x4(-0.22240564, -0.051839057, 0.12950379, 0.0048653902, 0.0144696245, -0.10698864, -0.08654499, -0.131132, 0.15429983, 0.025204081, -0.09136411, -0.053068906, -0.005858075, -0.02560129, 0.0469077, 0.018962694)); + conv2d_2_tf += mul(h1, min16float4x4(-0.4698737, -0.053354982, 0.27541625, -0.020424731, 0.06935965, 0.008045162, -0.11538889, -0.038876567, -0.049084928, 0.1629101, -0.012742019, 0.12038333, -0.0705842, 0.12735052, 0.17640172, 0.050716672)); + conv2d_2_tf += mul(i1, min16float4x4(-0.10064598, 0.016594354, -0.14633141, -0.09175336, -0.12889755, -0.1671076, 0.22031903, 0.0759859, 0.102435045, -0.072596334, -0.17714, 0.03531571, -0.022843607, 0.047148425, 0.105391234, 0.05260699)); + conv2d_2_tf += mul(a2, min16float4x4(-0.1057386, 0.020954097, -0.022159133, 0.064248964, -0.031145383, -0.008180922, -0.023611609, 0.05197287, -0.017418958, 0.02461813, 0.0584847, -0.10087345, -0.16315617, 0.15651843, 0.10478647, 0.08347392)); + conv2d_2_tf += mul(b2, min16float4x4(-0.01323452, 0.044956483, -0.007983463, 0.10643116, -0.030048033, -0.11766427, -0.101889476, 0.015120098, 0.031690307, 0.014470776, -0.10197176, -0.10045749, -0.065616645, -0.15230782, -0.26183948, -0.071056716)); + conv2d_2_tf += mul(c2, min16float4x4(0.026220636, -0.044518135, 0.17167594, 0.3016424, 0.12054841, 0.042369425, 0.04208856, 0.14938886, -0.07018442, -0.008244587, 0.14260693, -0.094418734, -0.032693435, 0.042990524, -0.053002246, -0.003936231)); + conv2d_2_tf += mul(d2, min16float4x4(-0.10141095, 0.17178011, -0.10951717, -0.28119737, 0.008288983, 0.14197187, 0.10903869, 0.017220182, 0.041842293, -0.03106527, -0.05892881, 0.02668739, 0.072505936, -0.060759444, 0.00032896115, -0.03440771)); + conv2d_2_tf += mul(e2, min16float4x4(0.13831837, -0.13864368, 0.15232176, 0.31198958, 0.033965178, 0.053397447, -0.30352455, -0.17199865, -0.06429645, 0.013913047, 0.10764071, -0.12238359, -0.04544379, 0.17074125, 0.024108075, -0.14521888)); + conv2d_2_tf += mul(f2, min16float4x4(-0.11011318, -0.0102100335, -0.37701187, -0.36465186, 0.16052358, -0.06683314, 0.16916892, 0.23348652, -0.17332914, 0.007918098, -0.055450343, 0.12134491, 0.002598775, 0.050541576, 0.16586582, -0.08609246)); + conv2d_2_tf += mul(g2, min16float4x4(0.055008903, -0.038048673, 0.12065314, -0.034293417, 0.026340824, 0.0635937, 0.0072025824, 0.1099919, -0.022833373, 0.06988719, 0.098066956, 0.09838032, 0.027212605, -0.10769643, 0.025036965, 0.07822364)); + conv2d_2_tf += mul(h2, min16float4x4(0.12550583, -0.015590264, -0.20009072, -0.2595937, -0.040573828, -0.07032441, 0.13428123, 0.0024277875, -0.103335135, -0.08461066, 0.05634581, -0.113169014, 0.05591198, -0.16420694, -0.06915715, -0.19497992)); + conv2d_2_tf += mul(i2, min16float4x4(0.088232726, -0.05118527, 0.119473234, 0.23262945, 0.06746001, 0.14686997, -0.25685823, 0.08349066, 0.120035954, 0.11132579, 0.1024914, 0.008478224, -0.054700002, -0.029634893, 0.050064556, -0.08939752)); + conv2d_2_tf += mul(a3, min16float4x4(0.022236016, -0.14602192, -0.011037687, 0.09127931, 0.14263593, 0.2303995, -0.07378528, 0.07426219, -0.25500375, 0.18845809, -0.065374866, 0.016772734, 0.02813176, 0.15021992, -0.032982655, 0.0046127643)); + conv2d_2_tf += mul(b3, min16float4x4(0.110158965, 0.02073459, 0.1380525, 0.017634321, -0.3546499, -0.099760525, -0.1195462, 0.057210118, -0.53130746, 0.23352407, -0.18252264, -0.19651698, -0.10013627, -0.006907238, -0.022171183, 0.023419948)); + conv2d_2_tf += mul(c3, min16float4x4(-0.009217382, 0.00943576, 0.005295363, 0.010542551, -0.21079898, -0.14469005, -0.19105618, 0.2098414, 0.18261504, 0.19765937, 0.044775106, -0.25939676, 0.072466746, -0.08828442, 0.066161856, 0.05692894)); + conv2d_2_tf += mul(d3, min16float4x4(-0.051633067, 0.019243274, 0.28932014, -0.029704608, -0.06255436, -0.4573925, -0.10963281, 0.121834375, 0.10874706, -0.093909726, 0.06983889, 0.048236616, -0.15379356, -0.06354611, -0.10668147, -0.02901699)); + conv2d_2_tf += mul(e3, min16float4x4(-0.044167574, 0.022249546, -0.3618917, -0.054136246, -0.105739385, -0.22325896, -0.070169605, -0.19650152, 0.07689512, -0.17047665, -0.07742679, 0.031095566, -0.01903123, -0.033752028, -0.2286711, 0.044381924)); + conv2d_2_tf += mul(f3, min16float4x4(-0.05709193, 0.15251294, -0.16776492, 0.09025173, 0.18235344, 0.3685535, -0.053927444, 0.10351524, -0.0938133, -0.26824594, -0.036424845, -0.106756285, -0.13051414, -0.07613318, -0.10721611, -0.13445549)); + conv2d_2_tf += mul(g3, min16float4x4(-0.0268394, 0.017245602, 0.1185864, 0.031915247, -0.037321728, 0.037805032, 0.13701047, 0.025731707, 0.03791209, -0.16549957, 0.08953334, -0.13901101, -0.1287722, 0.072961085, 0.06859001, 0.18934746)); + conv2d_2_tf += mul(h3, min16float4x4(-0.11152981, 0.13712928, -0.05714947, 0.05542204, -0.32208005, -0.015176284, 0.10014709, -0.030125491, -0.04422843, 0.12897238, 0.108573034, -0.025267191, 0.02247499, -0.058167085, -0.15205052, 0.043249656)); + conv2d_2_tf += mul(i3, min16float4x4(-0.12951276, -0.14417744, 0.012708804, -0.0040302873, 0.09192804, -0.092346616, -0.09659876, -0.13512622, -0.0737095, 0.002481852, 0.048459593, 0.05455724, -0.14035852, 0.07777282, 0.07471883, 0.107781895)); + conv2d_2_tf += mul(na1, min16float4x4(0.028793033, -0.039604917, -0.0045903274, -0.05023892, 0.04976248, -0.026074547, 0.1733191, -0.06694405, -0.12434122, 0.12477937, -0.105804294, 0.06170465, 0.33725888, -0.15944988, 0.09790923, 0.030690596)); + conv2d_2_tf += mul(nb1, min16float4x4(0.005191585, 0.08373177, -0.018288689, 0.020527333, -0.055718876, -0.12754384, 0.17755422, 0.1597085, 0.17601304, -0.0258804, 0.16454586, 0.106551126, -0.20891763, -0.05360957, -0.24229631, -0.15886526)); + conv2d_2_tf += mul(nc1, min16float4x4(0.03740399, -0.0043318006, -0.010840595, -0.01674406, -0.17876416, 0.09188681, -0.12203759, -0.09808559, 0.1243873, -0.184597, 0.07484877, 0.14448164, -0.15161137, 0.033237204, -0.054772068, -0.085399576)); + conv2d_2_tf += mul(nd1, min16float4x4(0.071139924, 0.025827989, 0.021663137, -0.12484576, -0.07799051, 0.20053016, 0.014714873, -0.041652568, 0.046397317, -0.07650734, 0.06753141, 0.080667324, 0.4557549, -0.029605106, -0.25674006, -0.27842438)); + conv2d_2_tf += mul(ne1, min16float4x4(0.16805562, -0.03722638, 0.021958483, -0.04969856, -0.15340807, -0.22158863, -0.25280216, -0.024268134, 0.085401855, 0.22427009, -0.04698029, -0.071075134, -0.10739174, 0.030285811, 0.31068414, 0.2882289)); + conv2d_2_tf += mul(nf1, min16float4x4(-0.010069354, -0.045132317, -0.08054911, 0.19212297, -0.11246117, 0.203382, 0.10145021, 0.1476792, -0.022835081, 0.16916804, -0.018178321, 0.076025024, -0.29570428, -0.007177177, -0.1047155, -0.0178633)); + conv2d_2_tf += mul(ng1, min16float4x4(0.076137505, 0.117270656, -0.077183075, -0.052782975, -0.08236995, 0.053947527, 0.13501388, 0.17139077, -0.2424162, -0.15007298, 0.123724684, 0.09327283, 0.19777925, 0.07314544, -0.18668725, -0.010371631)); + conv2d_2_tf += mul(nh1, min16float4x4(0.15866037, 0.053233996, -0.026709981, -0.1574147, -0.012303242, 0.06893102, 0.031804018, 0.10116885, -0.016902728, -0.082480945, 0.05133729, -0.20160739, -0.012635841, 0.032104325, 0.00968726, -0.018941477)); + conv2d_2_tf += mul(ni1, min16float4x4(-0.02683365, 0.14024723, 0.0020279875, 0.035137076, -0.019948762, 0.3120297, -0.018649966, -0.17814124, -0.14863688, -0.12977526, -0.09194036, 0.19637106, 0.12040974, 0.09383599, 0.10559805, -0.0319509)); + conv2d_2_tf += mul(na2, min16float4x4(-0.07015076, -0.07818044, 0.12413185, -0.0018199648, -0.015275738, -0.21548629, 0.046161238, -0.10475311, 0.082367115, 0.0053079966, 0.09559984, 0.039583992, -0.1681236, -0.23862287, -0.09229484, -0.12317666)); + conv2d_2_tf += mul(nb2, min16float4x4(-0.17587087, -0.097817905, 0.08857801, 0.14012139, -0.20023742, 0.029083535, 0.056073546, -0.06810832, 0.08625035, 0.023427716, 0.1797412, 0.048568305, -0.09278378, -0.09250215, -0.12440772, 0.2587798)); + conv2d_2_tf += mul(nc2, min16float4x4(-0.24181388, -0.016290328, -0.026988767, -0.005399553, -0.061761368, -0.0013004051, -0.1990831, -0.07799404, 0.03282008, 0.079514205, -0.07474829, -0.36701006, 0.078521594, -0.156468, 0.09041213, 0.1292482)); + conv2d_2_tf += mul(nd2, min16float4x4(-0.21960634, 0.041841425, 0.122728646, 0.06800145, 0.07355482, 0.26123464, -0.13518283, -0.05085496, -0.099832244, 0.04960356, 0.066544525, 0.09741243, -0.10965899, -0.16163626, 0.09816793, -0.014595947)); + conv2d_2_tf += mul(ne2, min16float4x4(0.07614604, -0.062298786, -0.07941662, -0.22525579, -0.29955792, 0.11145522, 0.123146005, 0.13863817, 0.15309983, 0.025902487, -0.08610474, -0.07598799, -0.26134565, -0.2818921, 0.0046356185, 0.007307074)); + conv2d_2_tf += mul(nf2, min16float4x4(-0.15936229, -0.10145381, 0.058567517, 0.21258314, -0.18010478, -0.22477242, -0.039975245, -0.34447697, -0.21647838, 0.31467855, -0.0674453, -0.5146147, 0.05382176, -0.026282668, -0.24090777, 0.10222359)); + conv2d_2_tf += mul(ng2, min16float4x4(-0.1045028, -0.027515164, 0.013251722, 0.108239084, 0.03163253, -0.030052185, 0.10836872, 0.15349132, 0.09593661, 0.0062710177, -0.19837233, -0.098303355, -0.23947543, -0.04082913, 0.16908304, -0.031784274)); + conv2d_2_tf += mul(nh2, min16float4x4(-0.07773699, 0.30408737, 0.10054892, 0.36721498, 0.51369953, -0.11931886, -0.17019019, -0.3288588, 0.11095048, -0.29225063, -0.075574756, -0.18392691, -0.10289336, 0.06882282, 0.20403436, 0.12073833)); + conv2d_2_tf += mul(ni2, min16float4x4(0.024539007, 0.053005982, -0.099204265, -0.084534295, -0.2587164, -0.31929657, 0.07193254, 0.18271501, -0.043669797, 0.062497724, -0.055462, 0.057130013, -0.015285072, -0.030743862, -0.07051513, -0.13783172)); + conv2d_2_tf += mul(na3, min16float4x4(-0.4343681, 0.35928357, -0.004770178, -0.079942055, 0.014088603, -0.20866469, -0.1378781, -0.06831558, 0.21436058, -0.08427488, 0.2455502, -0.065596916, -0.06559933, -0.027101375, 0.023555819, -0.20939256)); + conv2d_2_tf += mul(nb3, min16float4x4(-0.37720296, -0.111260146, -0.25392932, -0.33377793, -0.17806955, -0.008747484, 0.17404033, 0.058826912, 0.0039355545, -0.18436235, 0.15803719, 0.15143508, 0.11155828, 0.09333553, -0.17960371, -0.036842924)); + conv2d_2_tf += mul(nc3, min16float4x4(-0.087490946, 0.0959697, -0.08301798, -0.19364063, -0.00996324, 0.014655412, 0.021732382, 0.07269497, 0.012744119, 0.01542146, 0.109438084, 0.18674947, -0.05728511, 0.017406877, 0.036412247, -0.044986803)); + conv2d_2_tf += mul(nd3, min16float4x4(0.30902067, 0.25019556, -0.079495244, -0.26099077, 0.08450634, -0.08346094, 0.004498276, -0.119334444, -0.08587327, -0.019446453, -0.1811446, -0.16136086, 0.006683898, 0.0005228834, -0.11937812, -0.2045503)); + conv2d_2_tf += mul(ne3, min16float4x4(0.19326456, -0.052496854, 0.12926556, 0.10167019, 0.090374604, 0.07595169, -0.0048561483, 0.12414255, 0.19320521, -0.027459998, 0.08993327, -0.035830285, 0.006461366, 0.023297347, 0.0691706, -0.00831113)); + conv2d_2_tf += mul(nf3, min16float4x4(0.13971736, 0.0788502, 0.12267767, 0.004433991, -0.053574555, -0.08087108, -0.26019198, -0.04175351, -0.13934188, 0.04144695, -0.070562504, -0.068388134, -0.1347503, -0.02173245, -0.1099242, -0.020897312)); + conv2d_2_tf += mul(ng3, min16float4x4(0.07843604, 0.04441641, -0.016214373, -0.15351163, -0.021339556, 0.023823377, -0.01442564, -0.09113205, -0.02552644, 0.14885889, -0.16178642, 0.14472331, 0.14082494, 0.05760455, -0.11503234, -0.16907685)); + conv2d_2_tf += mul(nh3, min16float4x4(-0.042953692, -0.3268466, 0.13181087, -0.06399399, 0.17543526, 0.111214496, 0.07369484, -0.003378238, 0.040965978, -0.0073295045, 0.07711077, -0.033094298, -0.08758825, -0.01715938, 0.056862406, -0.010732023)); + conv2d_2_tf += mul(ni3, min16float4x4(-0.039256442, -0.07153648, 0.10314899, -0.1192048, -0.033410206, 0.13077301, 0.19343375, -0.07479033, 0.10759806, -0.037313893, 0.06156247, 0.021744521, -0.18148352, -0.15683053, 0.017884498, -0.11338723)); + conv2d_2_tf += min16float4(-0.077597156, 0.024995416, 0.0048880246, -0.06210122); + min16float4 nconv2d_2_tf = max(-conv2d_2_tf, 0); + conv2d_2_tf = max(conv2d_2_tf, 0); + + min16float4 conv2d_1_tf = mul(a1, min16float4x4(0.10368956, 0.09174666, 0.07265347, 0.009965846, 0.04307676, 0.018726716, 0.064217605, -0.024381645, 0.013237381, 0.039251406, 0.13164084, -0.05265028, -0.08619517, 0.015469731, 0.10171868, -0.11194108)); + conv2d_1_tf += mul(b1, min16float4x4(-0.055484463, 0.1386706, -0.22939423, -0.2222723, 0.04815343, 0.05425625, 0.08234074, 0.12962975, 0.030559294, -0.07823733, 0.12347866, -0.13917705, -0.031347297, 0.010592373, -0.38942683, -0.302033)); + conv2d_1_tf += mul(c1, min16float4x4(0.06968848, -0.03574659, 0.11817242, 0.044270225, 0.0481696, 0.045347195, -0.14479072, 0.06971279, 0.012434736, 0.03927546, 0.13076504, 0.032268204, 0.040274065, 0.053418823, -0.05195065, 0.1341056)); + conv2d_1_tf += mul(d1, min16float4x4(0.1314648, 0.08953099, -0.058160458, -0.098807305, -0.08652445, -0.19136623, -0.012327089, 0.14297265, 0.11436408, 0.031837817, -0.0038611747, 0.08295747, 0.19534546, -0.033664998, -0.51042134, -0.21606028)); + conv2d_1_tf += mul(e1, min16float4x4(-0.332711, -0.2260786, 0.35732532, 0.026584813, 0.16421017, 0.21153966, -0.112725854, -0.048803244, 0.059562314, -0.010458478, 0.0063304375, -0.007279937, -0.41918445, 0.10137393, -0.0989079, -0.17768846)); + conv2d_1_tf += mul(f1, min16float4x4(-0.22947264, 0.008074958, -0.03876367, 0.28019628, -0.18640186, 0.072562195, -0.001338717, 0.17349707, 0.13131878, 0.05085823, -0.11547487, -0.084437385, -0.18131672, 0.026830718, 0.0960529, -0.014084568)); + conv2d_1_tf += mul(g1, min16float4x4(0.13153158, 0.079937235, -0.14291838, -0.062477887, -0.0690248, 0.15090927, 0.060723048, -0.044703092, 0.005483621, -0.113471694, 0.048640195, -0.024538955, -0.01751092, 0.19206041, -0.1859277, -0.22007878)); + conv2d_1_tf += mul(h1, min16float4x4(-0.04971548, -0.38541326, -0.080354154, -0.1132633, -0.13348146, 0.11406493, 0.05543971, 0.022810424, -0.09030199, -0.053045455, -0.084034644, 0.0014670533, 0.0007018557, -0.24078067, 0.047226585, 0.08619653)); + conv2d_1_tf += mul(i1, min16float4x4(-0.08993396, -0.09246378, 0.11467184, 0.060891952, -0.022887891, -0.008537377, 0.13542707, 0.08030356, -0.06174077, -0.07314582, -0.111782126, -0.08939319, -0.09756803, -0.15771574, 0.073002145, 0.035939205)); + conv2d_1_tf += mul(a2, min16float4x4(-0.09398606, -0.118093155, 0.024832802, 0.049131367, 0.06665196, -0.039545495, -0.107865654, -0.043897964, -0.03278348, -0.111089505, 0.12056342, -0.10977613, -0.05880801, -0.08684503, -0.15480064, -0.09669209)); + conv2d_1_tf += mul(b2, min16float4x4(-0.12028866, -0.0130571015, 0.010480521, 0.28919983, 0.050575808, -0.07968808, -0.15499628, -0.13613448, 0.030993043, 0.13226634, -0.12666325, -0.010337325, -0.025353834, 0.017561335, -0.08171704, -0.17280379)); + conv2d_1_tf += mul(c2, min16float4x4(-0.0008190666, 0.017923795, -0.13926646, -0.00083633314, -0.14120303, 0.109396234, 0.026602108, 0.2108425, 0.15093753, -0.0016773659, 0.028220268, 0.09914804, -0.045055833, 0.040082425, 0.007756443, -0.04522211)); + conv2d_1_tf += mul(d2, min16float4x4(0.059589684, 0.04780217, 0.30785602, 0.25626636, 0.08686253, 0.11348654, 0.042249523, -0.2264382, -0.058502045, 0.05044742, 0.0031711252, -0.021721566, -0.011926813, 0.042892855, -0.08586602, -0.029168598)); + conv2d_1_tf += mul(e2, min16float4x4(0.09367661, -0.019030625, -0.34638473, -0.10968469, -0.16300671, 0.21311292, 0.11657136, -0.044009518, 0.10225506, -0.044505168, 0.20920436, -0.018161744, -0.018144146, 0.026626088, -0.056913715, 0.15370414)); + conv2d_1_tf += mul(f2, min16float4x4(-0.28757727, 0.14743091, -0.021321807, -0.048045393, -0.109708, -0.14760888, 0.15246773, -0.028329216, 0.009206364, -0.06396112, 0.12593451, 0.052947026, 0.066429235, -0.08044728, 0.0070432564, -0.057647638)); + conv2d_1_tf += mul(g2, min16float4x4(-0.023919886, -0.20876022, 0.05590491, 0.12671952, -0.07277091, 0.024939056, 0.03633482, -0.10239475, -0.12012349, -0.17192347, 0.014865882, 0.1858935, -0.013352806, -0.04451544, 0.0032296637, 0.09310079)); + conv2d_1_tf += mul(h2, min16float4x4(-0.29340369, 0.1377685, -0.018134177, -0.0819466, 0.2541578, -0.1270915, -0.12300359, 0.114513785, 0.21511158, -0.060876742, 0.07682154, 0.09775888, -0.09133818, 0.04477866, 0.058042303, -0.027626123)); + conv2d_1_tf += mul(i2, min16float4x4(-0.098641984, -0.09568759, 0.27307647, 0.044102278, -0.03640084, -0.10440432, -0.011212675, -0.22568303, -0.008232321, 0.14870772, -0.17107275, -0.023316732, 0.03395947, 0.14223643, -0.08063479, 0.14301774)); + conv2d_1_tf += mul(a3, min16float4x4(-0.08714423, -0.12230681, -0.22175795, -0.10298021, 0.0009175108, 0.19820437, 0.04215484, 0.2772454, 0.046766162, 0.023245906, 0.36313313, -0.29657102, 0.0010776661, 0.047935788, 0.113361314, -0.05614472)); + conv2d_1_tf += mul(b3, min16float4x4(0.15069975, 0.06458973, 0.08984772, -0.08219822, -0.37328726, -0.03008995, 0.31162828, 0.07075847, -0.13914284, -0.10216768, 0.22251949, -0.30631062, 0.17172062, 0.058428258, -0.11345689, 0.08461611)); + conv2d_1_tf += mul(c3, min16float4x4(0.007734305, 0.042484675, -0.15685312, -0.048171967, 0.10970874, 0.061090663, -0.08464978, 0.08347133, -0.17933917, 0.2308347, -0.053314723, 0.09323812, -0.04228206, 0.055042125, -0.046495847, -0.032692812)); + conv2d_1_tf += mul(d3, min16float4x4(-0.09439761, 0.03567186, -0.17220385, -0.103939146, -0.064900115, -0.16004047, 0.004621011, -0.014501001, -0.14071538, -0.05238438, -0.04519603, 0.21972013, -0.007383857, -0.07692677, -0.14034486, 0.08030412)); + conv2d_1_tf += mul(e3, min16float4x4(-0.22748968, 0.12067121, -0.05225513, 0.04308743, -0.081648685, 0.28658885, 0.37694585, -0.018508147, -0.019247225, 0.095557846, 0.015747357, 0.12365868, -0.076417744, -0.03912286, 0.18391648, -0.09244896)); + conv2d_1_tf += mul(f3, min16float4x4(-0.00221828, -0.0894836, 0.038467363, -0.019945016, 0.13546647, 0.17713489, -0.17275713, 0.08575425, -0.019129591, 0.16340882, -0.16357088, -0.0033604207, -0.06446814, -0.15712759, 0.18558913, -0.115558594)); + conv2d_1_tf += mul(g3, min16float4x4(-0.09995351, 0.18885328, -0.057601925, 0.01172547, -0.031203317, -0.1181948, 0.006120215, 0.25098777, -0.06316651, 0.047607217, -0.056073133, -0.029685916, 0.12195799, -0.056664392, -0.054523658, 0.03753435)); + conv2d_1_tf += mul(h3, min16float4x4(0.007936505, -0.021070726, 0.040594626, 0.061293513, -0.074233375, 0.10112329, -0.19424592, -0.14433385, -0.04661142, -0.09192385, 0.034151867, -0.11941847, 0.046759605, -0.15323174, 0.09908571, 0.18290807)); + conv2d_1_tf += mul(i3, min16float4x4(-0.012291647, 0.114136524, 0.10576901, -0.012061901, 0.2356885, 0.048024837, 0.18102467, -0.034004245, -0.06746709, 0.09405117, 0.12362687, 0.0254422, 0.22654915, 0.04224264, -0.049588405, 0.11478716)); + conv2d_1_tf += mul(na1, min16float4x4(-0.021690933, 0.13663062, -0.161411, 0.06806553, -0.1773275, -0.0940566, -0.18002738, 0.047475196, 0.0072157113, -0.008688586, -0.15493456, 0.022294179, 0.041401867, -0.10311516, -0.006603416, 0.059536614)); + conv2d_1_tf += mul(nb1, min16float4x4(-0.13541889, 0.047185, -0.027699882, 0.060225613, -0.035152074, 0.05752177, -0.026204573, 0.11251955, -0.0049166707, 0.17533402, -0.15755837, 0.16124752, 0.04805776, -0.10309488, 0.15945134, 0.025226792)); + conv2d_1_tf += mul(nc1, min16float4x4(-0.015074193, -0.094979845, 0.027753184, -0.071142055, -0.17082961, -0.06833402, 0.13620014, -0.24564765, 0.036582932, 0.13075556, 0.036705326, 0.03863992, -0.018921472, -0.0016482361, 0.13597268, -0.038188133)); + conv2d_1_tf += mul(nd1, min16float4x4(-0.14212462, -0.1483275, 0.05649678, 0.05684924, -0.11407954, 0.13978885, 0.070467845, -0.07458527, -0.19702937, 0.23950967, -0.15242746, -0.26435548, -0.14437793, 0.21487178, 0.4991241, 0.18331984)); + conv2d_1_tf += mul(ne1, min16float4x4(0.20045248, 0.066468574, -0.015601024, 0.012849705, -0.14952832, -0.06828453, 0.16009094, -0.09515789, -0.1071139, -0.021629127, -0.012993768, -0.022518635, 0.19255438, -0.09875012, 0.07555782, 0.0780372)); + conv2d_1_tf += mul(nf1, min16float4x4(-0.028311213, -0.025465565, 0.020059558, -0.116105095, -0.042490575, 0.020179577, 0.010893176, -0.11184776, -0.1702318, -0.025035636, 0.008381181, 0.0586714, 0.03539251, -0.0448198, -0.056921933, -0.029987138)); + conv2d_1_tf += mul(ng1, min16float4x4(0.049813945, 0.08434948, 0.09337763, 0.06701621, -0.061224304, -0.24754077, -0.017353527, -0.042758185, 0.013161995, -0.22947139, 0.019135898, 0.11039477, 0.16954716, -0.25619635, 0.18368678, 0.03542052)); + conv2d_1_tf += mul(nh1, min16float4x4(-0.15430786, 0.07348774, 0.15545642, 0.20969617, 0.1067826, 0.15255202, 0.020220853, 0.09658389, -0.088782035, -0.19119574, 0.13885954, 0.15108526, -0.07552868, -0.11574438, -0.034102093, -0.031383175)); + conv2d_1_tf += mul(ni1, min16float4x4(0.061409608, -0.00082869077, -0.08336049, -0.01866603, 0.07322213, -0.1152386, -0.004205211, -0.18793713, 0.091782115, 0.05387527, 0.069104694, 0.25387684, -0.101916246, 0.065856785, -0.020407397, 0.035098225)); + conv2d_1_tf += mul(na2, min16float4x4(0.06225989, -0.039721318, 0.19908188, 0.08382035, -0.024357362, 0.014932128, -0.060558856, -0.049815435, -0.03166011, 0.0339055, -0.12810327, 0.008812703, 0.06120202, 0.085533425, 0.21571258, -0.20605975)); + conv2d_1_tf += mul(nb2, min16float4x4(-0.045329664, 0.02261115, -0.0335033, -0.058562186, -0.0099387, 0.0046313554, 0.21475597, 0.04558062, 0.17891279, 0.005057579, 0.22518916, 0.1998231, 0.09627137, -0.2318303, -0.08868813, -0.27863982)); + conv2d_1_tf += mul(nc2, min16float4x4(-0.15865076, 0.077262044, 0.036153752, 0.07885703, 0.13166751, -0.12820594, -0.05823962, -0.2583444, -0.2245552, -0.04434666, -0.13453422, -0.27865237, 0.014107271, 0.045582164, 0.0064884513, -0.019007552)); + conv2d_1_tf += mul(nd2, min16float4x4(0.0643133, 0.06440001, -0.14517003, -0.101694606, 0.058990445, 0.11955667, 0.45094532, 0.20261864, 0.07944409, -0.061399437, 0.022036074, 0.046660237, -0.17064287, -0.076766625, 0.25972953, 0.29821205)); + conv2d_1_tf += mul(ne2, min16float4x4(-0.11031386, -0.05850727, 0.055557184, 0.11549242, 0.12120408, -0.33330265, 0.095613986, 0.09242419, -0.011835885, -0.19384164, -0.01893125, 0.27290896, -0.18104021, 0.044360142, 0.06759539, -0.0027218745)); + conv2d_1_tf += mul(nf2, min16float4x4(0.19390257, -0.13378039, 0.07428329, 0.016053686, -0.18574655, 0.055462763, -0.2527128, -0.47279125, -0.17490762, 0.21626428, -0.1473371, -0.35594228, 0.054865763, -0.04086486, -0.061911695, 0.051812805)); + conv2d_1_tf += mul(ng2, min16float4x4(-0.029701848, 0.24927482, 0.00581731, -0.10748679, -0.07500632, 0.033424605, 0.14734372, -0.18966366, 0.031880617, 0.17622112, -0.031867832, -0.10119831, -0.15391265, -0.14308685, 0.093484215, 0.18867014)); + conv2d_1_tf += mul(nh2, min16float4x4(0.19035357, -0.19525306, -0.025621792, 0.09154427, -0.07798503, -0.22271548, 0.11034287, -0.04197031, -0.24772005, 0.43681505, -0.19703668, -0.2614237, 0.05807699, -0.2631317, -0.020604266, -0.048005704)); + conv2d_1_tf += mul(ni2, min16float4x4(-0.08587588, 0.13374045, -0.09263761, -0.13216262, -0.11242246, -0.12541875, -0.09835177, 0.1586739, -0.21013282, 0.087373346, 0.107112356, 0.47657737, 0.0459955, -0.07181196, 0.07818155, -0.10435423)); + conv2d_1_tf += mul(na3, min16float4x4(-0.091803394, -0.32280564, 0.28972253, 0.12908047, 0.06683764, -0.039376236, 0.024078066, 0.18940936, -0.055246543, 0.12222864, -0.0177199, 0.09346665, 0.07164098, 0.065791056, -0.08516637, -0.10187257)); + conv2d_1_tf += mul(nb3, min16float4x4(-0.12561126, -0.28730518, 0.190799, -0.17922764, 0.04376582, -0.08152354, -0.0690038, -0.10861494, -0.03100546, 0.10962334, -0.20492296, 0.12868984, 0.06536495, 0.08559974, 0.033028, -0.07235402)); + conv2d_1_tf += mul(nc3, min16float4x4(-0.012734173, -0.12211726, 0.057524282, 0.015053666, -0.052275516, 0.11774483, 0.08221696, -0.024205929, 0.122006595, 0.054565493, -0.049608365, 0.02801238, 0.07593017, 0.074450806, 0.097137615, -0.008985974)); + conv2d_1_tf += mul(nd3, min16float4x4(-0.32826158, -0.022971062, 0.37642807, 0.38614145, -0.06932448, 0.0641898, -0.09011684, -0.019884817, -0.004897904, 0.07661578, -0.050405186, -0.24849766, 0.04642452, 0.09120379, 0.26060387, -0.2533109)); + conv2d_1_tf += mul(ne3, min16float4x4(0.09669597, -0.045555357, -0.24132517, -0.28401875, 0.11226361, 0.08378312, -0.07415474, -0.036874313, -0.001286788, 0.14013582, 0.14750466, -0.048925027, 0.13374946, 0.10844033, 0.123459235, -0.10933974)); + conv2d_1_tf += mul(nf3, min16float4x4(-0.03275827, 0.27429518, -0.0983686, -0.010947437, -0.18409865, 0.12616666, -0.05766888, 0.07149005, -0.13777009, 0.022123039, 0.084938325, 0.015972659, 0.20145003, -0.09534558, -0.0082679195, -0.1515079)); + conv2d_1_tf += mul(ng3, min16float4x4(0.13148536, -0.3421452, 0.08851102, 0.012056574, -0.1525749, 0.09364548, -0.02235517, -0.1775178, 0.18052714, -0.14639667, 0.07453223, 0.03912742, -0.284782, 0.023833552, 0.09671063, -0.168578)); + conv2d_1_tf += mul(nh3, min16float4x4(-0.24303597, -0.05585747, -0.21645154, -0.084838174, -0.15413773, -0.15403214, -0.021544017, 0.15751824, -0.027032627, -0.18457665, -0.02174098, -0.0070916233, -0.1609649, -0.32226282, -0.18423033, -0.29629233)); + conv2d_1_tf += mul(ni3, min16float4x4(0.1602529, 0.026087781, 0.01551678, 0.07093837, -0.007075046, -0.0061597642, -0.0057887356, -0.08935906, 0.0028665168, -0.1038671, -0.093715765, -0.035213456, -0.041290607, -0.15825188, 0.11327359, -0.20286629)); + conv2d_1_tf += min16float4(-0.062293675, 0.09216847, 0.010529031, 0.03100192); + tex4[gxy] = conv2d_1_tf; + min16float4 nconv2d_1_tf = max(-conv2d_1_tf, 0); + conv2d_1_tf = max(conv2d_1_tf, 0); + + min16float4 target = mul(e1, min16float4x4(-0.02357968, 0.13800439, 0.054744735, -0.32328397, -0.2263118, -0.3222542, -0.15286992, -0.3053175, -0.20046607, 0.025345843, 0.032755207, 0.40165102, 0.03166696, 0.29110438, 0.28861988, 0.05585125)); + target += mul(e2, min16float4x4(0.11055126, -0.33034575, 0.039494887, -0.17843343, 0.35742196, 0.00032650787, 0.21049741, 0.18823248, -0.1741954, 0.27586365, -0.043366615, 0.02092058, -0.082515135, -0.15504313, 0.13261497, 0.14650741)); + target += mul(e3, min16float4x4(0.39276633, -0.031067554, -0.08830738, -0.23975314, -0.20294978, 0.030291535, 0.4623106, 0.06494191, 0.042467684, -0.28105733, -0.053258326, -0.17269841, 0.09479501, 0.11930515, 0.1258843, 0.11058792)); + target += mul(ne1, min16float4x4(-0.18343425, -0.4381688, -0.08248827, -0.42846557, -0.08277779, 0.45192116, 0.21961756, 0.23076119, -0.2093829, -0.29050866, 0.26212537, -0.25469857, -0.4832557, -0.45126852, -0.35072148, -0.18368497)); + target += mul(ne2, min16float4x4(0.10529696, 0.5964488, 0.13258573, -0.07494986, -0.3341919, 0.19418421, -0.18307082, 0.34982273, -0.0430461, 0.21097268, 0.03212202, -0.015623122, 0.43791813, 0.16207397, 0.123477034, -0.087993294)); + target += mul(ne3, min16float4x4(-0.01878982, 0.007308694, 0.25769314, 0.18407181, 0.00095180905, -0.2600526, -0.31043288, -0.24622385, 0.07832029, 0.05502411, 0.37793204, -0.07329948, -0.28405467, -0.15038961, 0.19259417, 0.105486296)); + target += mul(conv2d_2_tf, min16float4x4(0.047820415, 0.3303589, 0.035807017, -0.41168606, -0.2118325, -0.045765184, -0.15234827, 0.28021428, -0.2084036, -0.40200952, -0.3261011, -0.13480914, -0.06876906, -0.19167677, -0.20444186, -0.44851676)); + target += mul(nconv2d_2_tf, min16float4x4(-0.24726203, -0.0097923195, -0.23193192, 0.31947026, 0.4274281, -0.36929542, 0.10095328, -0.19663717, 0.3244895, 0.49458218, 0.24745567, 0.15722558, 0.43052208, 0.377559, 0.22543637, 0.13009055)); + target += mul(conv2d_1_tf, min16float4x4(0.01817998, 0.111477636, -0.12727399, 0.27395004, 0.19770023, -0.1636959, 0.25407487, -0.24871433, -0.08552937, 0.3223687, 0.30668882, 0.40221208, -0.20192504, 0.14656074, 0.5100356, -0.0948956)); + target += mul(nconv2d_1_tf, min16float4x4(0.40383592, -0.043663148, 0.4813348, 0.10317451, -0.049076255, -0.022925228, 0.0872564, 0.21741754, 0.23656987, -0.22309794, -0.2260013, 0.20823886, -0.055542476, 0.016604664, -0.1964831, 0.11962174)); + target += min16float4(-0.049604952, -0.039514415, -0.06137416, -0.0015509313); + tex5[gxy] = target; + + target = mul(e1, min16float4x4(0.029635962, 0.08045753, 0.03622311, 0.06677362, 0.14780864, -0.087087184, 0.22309896, -0.1772139, -0.08716722, 0.1075154, 0.044472143, 0.021324798, 0.10346262, -0.24718447, -0.2489118, 0.4517737)); + target += mul(e2, min16float4x4(0.20637918, -0.11695054, 0.27656725, 0.009858572, -0.62555677, 0.12796827, -0.057749186, -0.02636826, 0.11764726, -0.034879886, -0.062285252, -0.048256125, 0.37146622, -0.17392562, 0.24782267, 0.3184173)); + target += mul(e3, min16float4x4(0.2624149, 0.007052751, 0.1595428, 0.26269603, -0.33775207, -0.66331345, 0.18036188, -0.25012106, -0.15003558, 0.12337829, -0.3230818, 0.06187628, 0.096601635, 0.24300486, -0.13784438, 0.27110842)); + target += mul(ne1, min16float4x4(-0.180413, 0.039972585, 0.48966697, -0.4130023, -0.03654654, -0.27514896, -0.025462124, 0.06652415, 0.28900522, 0.035381883, 0.20655172, 0.0073647103, -0.5028713, -0.0061578755, -0.09185675, -0.52771837)); + target += mul(ne2, min16float4x4(-0.3205473, -0.23172325, -0.20749244, 0.058195353, 0.20280065, -0.106998004, 0.08968707, 0.10981961, -0.13291806, 0.0028465164, 0.11793527, 0.11942547, 0.100123264, -0.14852245, -0.032194547, -0.118260525)); + target += mul(ne3, min16float4x4(0.004620961, -0.13271236, 0.110130526, -0.075169735, 0.35998157, -0.046072174, 0.02044828, -0.1019322, -0.038753018, -0.12328749, -0.28227237, 0.18373057, -0.23704045, 0.20384738, 0.097455874, -0.23102747)); + target += mul(conv2d_2_tf, min16float4x4(0.30397, -0.007688397, -0.2519374, -0.14401323, -0.031671453, 0.10171321, -0.18295656, -0.029794114, 0.19171898, 0.23662621, 0.09319509, -0.3479054, 0.036986895, 0.13572362, 0.1142681, -0.17851138)); + target += mul(nconv2d_2_tf, min16float4x4(-0.19525734, 0.36855492, 0.05751295, -0.12524441, 0.06309533, 0.20228319, -0.07533531, 0.26733333, -0.21407285, -0.2900094, -0.28743416, 0.18039729, -0.27968687, -0.23786859, -0.21049118, -0.006130187)); + target += mul(conv2d_1_tf, min16float4x4(0.34406897, -0.14967814, 0.56049985, -0.18166065, -0.061995413, 0.117799215, 0.3054206, 0.4034068, -0.2116504, -0.6017806, 0.004660423, 0.051566444, 0.4380975, -0.3172436, -0.09930328, -0.16182126)); + target += mul(nconv2d_1_tf, min16float4x4(-0.09316841, 0.036305115, -0.30209473, 0.098138526, -0.012532953, -0.050068337, -0.22571203, -0.30636647, -0.124337815, 0.07323685, -0.15504828, 0.19263308, -0.017216058, 0.34484297, -0.1460544, -0.24951003)); + target += min16float4(0.10388342, 0.00828351, 0.14884935, 0.034392886); + tex6[gxy] = target; + + target = mul(e1, min16float4x4(-0.15275823, 0.31693572, 0.03429309, -0.06982273, 0.08535909, 0.019838037, -0.03189405, 0.3190016, 0.16633914, 0.48730284, -0.27923077, 0.31791112, 0.43154097, 0.005003616, -0.26277873, -0.009333685)); + target += mul(e2, min16float4x4(0.23504019, -0.12419379, 0.07217815, -0.090434305, -0.0380588, -0.14686479, -0.33812302, -0.20242776, -0.20776805, 0.24741934, -0.16489775, 0.07052134, -0.08030772, 0.23784883, -0.28709608, -0.17689173)); + target += mul(e3, min16float4x4(-0.05109775, -0.40860242, -0.003464472, -0.19893257, 0.23186824, -0.12760048, -0.22718583, 0.02299852, 0.27083093, 0.073904194, -0.056870755, -0.35324985, -0.023004858, -0.29591596, -0.020298446, -0.05753052)); + target += mul(ne1, min16float4x4(0.0035456547, -0.37682405, 0.047876693, 0.1168026, 0.015805494, -0.04388269, 0.12970346, 0.2497829, -0.009891778, 0.116980106, 0.13058232, 0.22570355, 0.13866597, 0.036246244, 0.10916998, -0.040503114)); + target += mul(ne2, min16float4x4(-0.25300103, -0.065156855, 0.063345924, 0.11406543, -0.1902478, 0.16440767, 0.043949526, 0.43318078, -0.03932035, -0.08510957, 0.19621156, -0.045045726, -0.08339006, -0.04335483, 0.37129655, -0.22328225)); + target += mul(ne3, min16float4x4(0.16169593, 0.2758587, 0.38249364, 0.12606645, 0.4582731, 0.09374545, -0.10988087, -0.21678255, -0.004099455, -0.09436347, 0.33964127, 0.20880581, -0.06742301, -0.025149476, 0.12146305, 0.5012377)); + target += mul(conv2d_2_tf, min16float4x4(0.11523535, 0.31662583, -0.0709322, -0.066175185, 0.08868106, -0.042457394, 0.32469732, -0.1987238, 0.41399983, 0.015568244, 0.14037918, 0.2879998, -0.32157704, 0.22491854, -0.07769691, 0.2052648)); + target += mul(nconv2d_2_tf, min16float4x4(-0.299831, -0.247278, -0.2011737, -0.3759366, -0.14935663, -0.095033385, 0.06259881, -0.23891686, -0.4340098, 0.07340212, -0.0012697511, -0.16527005, 0.0814454, -0.43962866, -0.3040046, 0.06242604)); + target += mul(conv2d_1_tf, min16float4x4(0.11802704, 0.2323739, 0.13466287, -0.25053164, -0.08020803, 0.1628004, -0.030645542, -0.40872335, -0.24624921, 0.15931502, 0.40752286, -0.07906199, 0.4286516, -0.1651973, -0.07021073, 0.0867332)); + target += mul(nconv2d_1_tf, min16float4x4(-0.23617363, 0.053548977, -0.14130518, -0.37744048, -0.11805406, -0.13757266, -0.026939899, 0.028020354, 0.24626125, -0.06998214, -0.02793638, 0.10509643, 0.06577935, -0.17211749, -0.12747282, -0.16999653)); + target += min16float4(-0.022106458, -0.012578552, 0.016203664, 0.026009269); + tex7[gxy] = target; +} + + +//!PASS 3 +//!DESC Conv-4x3x3x24, Conv-4x1x1x48 +//!IN tex5, tex6, tex7, tex4 +//!OUT tex8, tex1, tex2, tex3 +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 + +void Pass3(uint2 blockStart, uint3 threadId) { + uint2 gxy = Rmp8x8(threadId.x) + blockStart; + uint2 inputSize = GetInputSize(); + if (gxy.x >= inputSize.x || gxy.y >= inputSize.y) { + return; + } + + float2 inputPt = GetInputPt(); + float2 pos = (gxy + 0.5f) * inputPt; + + // [ a, d, g ] + // [ b, e, h ] + // [ c, f, i ] + min16float4 a1 = tex5.SampleLevel(sam, pos - inputPt, 0); + min16float4 b1 = tex5.SampleLevel(sam, pos + float2(-inputPt.x, 0), 0); + min16float4 c1 = tex5.SampleLevel(sam, pos + float2(-inputPt.x, inputPt.y), 0); + min16float4 d1 = tex5.SampleLevel(sam, pos + float2(0, -inputPt.y), 0); + min16float4 e1 = tex5.SampleLevel(sam, pos, 0); + min16float4 f1 = tex5.SampleLevel(sam, pos + float2(0, inputPt.y), 0); + min16float4 g1 = tex5.SampleLevel(sam, pos + float2(inputPt.x, -inputPt.y), 0); + min16float4 h1 = tex5.SampleLevel(sam, pos + float2(inputPt.x, 0), 0); + min16float4 i1 = tex5.SampleLevel(sam, pos + inputPt, 0); + + min16float4 na1 = max(-a1, 0); + min16float4 nb1 = max(-b1, 0); + min16float4 nc1 = max(-c1, 0); + min16float4 nd1 = max(-d1, 0); + min16float4 ne1 = max(-e1, 0); + min16float4 nf1 = max(-f1, 0); + min16float4 ng1 = max(-g1, 0); + min16float4 nh1 = max(-h1, 0); + min16float4 ni1 = max(-i1, 0); + + a1 = max(a1, 0); + b1 = max(b1, 0); + c1 = max(c1, 0); + d1 = max(d1, 0); + e1 = max(e1, 0); + f1 = max(f1, 0); + g1 = max(g1, 0); + h1 = max(h1, 0); + i1 = max(i1, 0); + + min16float4 a2 = tex6.SampleLevel(sam, pos - inputPt, 0); + min16float4 b2 = tex6.SampleLevel(sam, pos + float2(-inputPt.x, 0), 0); + min16float4 c2 = tex6.SampleLevel(sam, pos + float2(-inputPt.x, inputPt.y), 0); + min16float4 d2 = tex6.SampleLevel(sam, pos + float2(0, -inputPt.y), 0); + min16float4 e2 = tex6.SampleLevel(sam, pos, 0); + min16float4 f2 = tex6.SampleLevel(sam, pos + float2(0, inputPt.y), 0); + min16float4 g2 = tex6.SampleLevel(sam, pos + float2(inputPt.x, -inputPt.y), 0); + min16float4 h2 = tex6.SampleLevel(sam, pos + float2(inputPt.x, 0), 0); + min16float4 i2 = tex6.SampleLevel(sam, pos + inputPt, 0); + + min16float4 na2 = max(-a2, 0); + min16float4 nb2 = max(-b2, 0); + min16float4 nc2 = max(-c2, 0); + min16float4 nd2 = max(-d2, 0); + min16float4 ne2 = max(-e2, 0); + min16float4 nf2 = max(-f2, 0); + min16float4 ng2 = max(-g2, 0); + min16float4 nh2 = max(-h2, 0); + min16float4 ni2 = max(-i2, 0); + + a2 = max(a2, 0); + b2 = max(b2, 0); + c2 = max(c2, 0); + d2 = max(d2, 0); + e2 = max(e2, 0); + f2 = max(f2, 0); + g2 = max(g2, 0); + h2 = max(h2, 0); + i2 = max(i2, 0); + + min16float4 a3 = tex7.SampleLevel(sam, pos - inputPt, 0); + min16float4 b3 = tex7.SampleLevel(sam, pos + float2(-inputPt.x, 0), 0); + min16float4 c3 = tex7.SampleLevel(sam, pos + float2(-inputPt.x, inputPt.y), 0); + min16float4 d3 = tex7.SampleLevel(sam, pos + float2(0, -inputPt.y), 0); + min16float4 e3 = tex7.SampleLevel(sam, pos, 0); + min16float4 f3 = tex7.SampleLevel(sam, pos + float2(0, inputPt.y), 0); + min16float4 g3 = tex7.SampleLevel(sam, pos + float2(inputPt.x, -inputPt.y), 0); + min16float4 h3 = tex7.SampleLevel(sam, pos + float2(inputPt.x, 0), 0); + min16float4 i3 = tex7.SampleLevel(sam, pos + inputPt, 0); + + min16float4 na3 = max(-a3, 0); + min16float4 nb3 = max(-b3, 0); + min16float4 nc3 = max(-c3, 0); + min16float4 nd3 = max(-d3, 0); + min16float4 ne3 = max(-e3, 0); + min16float4 nf3 = max(-f3, 0); + min16float4 ng3 = max(-g3, 0); + min16float4 nh3 = max(-h3, 0); + min16float4 ni3 = max(-i3, 0); + + a3 = max(a3, 0); + b3 = max(b3, 0); + c3 = max(c3, 0); + d3 = max(d3, 0); + e3 = max(e3, 0); + f3 = max(f3, 0); + g3 = max(g3, 0); + h3 = max(h3, 0); + i3 = max(i3, 0); + + min16float4 conv2d_1_tf = tex4.SampleLevel(sam, pos, 0); + min16float4 nconv2d_1_tf = max(-conv2d_1_tf, 0); + conv2d_1_tf = max(conv2d_1_tf, 0); + + min16float4 conv2d_5_tf = mul(a1, min16float4x4(0.001049049, 0.017747996, -0.067229465, -0.020442853, -0.04868684, 0.09733606, -0.07313501, 0.02070675, 0.01012683, -0.034293324, -0.026002094, 0.008298949, -0.045532364, -0.069049254, 0.109774776, -0.092840426)); + conv2d_5_tf += mul(b1, min16float4x4(0.3071666, 0.108723, -0.018787129, 0.17321438, -0.07934712, 0.11855833, -0.032467257, -0.048425578, -0.091413595, -0.08235019, -0.050003942, -0.007800964, -0.07821158, 0.120108165, -0.15341766, -0.04518874)); + conv2d_5_tf += mul(c1, min16float4x4(-0.0038995466, 0.059817232, -0.13333397, 0.022390908, -0.054531172, -0.12521502, 0.061349645, 0.08832908, 0.015541151, -0.005833245, -0.103023596, -0.031728514, -0.1393958, 0.12932369, -0.024058655, -0.02949061)); + conv2d_5_tf += mul(d1, min16float4x4(0.10676212, -0.0919305, -0.045313094, 0.036725752, -0.2360789, 0.08090541, 0.08044168, -0.088691026, 0.05462964, -0.047420587, 0.011766264, -0.044065233, -0.09330811, -0.04302891, -0.09276843, 0.01615573)); + conv2d_5_tf += mul(e1, min16float4x4(0.14728056, 0.014297587, 0.20523176, -0.016391741, -0.25267518, -0.09126818, 0.14681858, 0.0720258, -0.034471154, -0.103409246, 0.029827712, 0.09607032, -0.12944661, -0.09812552, 0.19399726, 0.18891408)); + conv2d_5_tf += mul(f1, min16float4x4(0.0793041, -0.18886381, -0.08229493, -0.13476922, -0.034637094, -0.06667868, 0.09988945, -0.08209682, -0.07416632, 0.10529841, -0.14161663, -0.088301264, 0.0029876695, 0.11381751, 0.083498895, 0.15414985)); + conv2d_5_tf += mul(g1, min16float4x4(0.20285544, -0.16456522, 0.06494461, -0.013555718, -0.07797077, -0.13418226, -0.0014035929, 0.056061633, -0.024789125, -0.053674392, 0.048963223, 0.121051155, 0.064334966, -0.0482476, 0.068401285, -0.07039275)); + conv2d_5_tf += mul(h1, min16float4x4(0.098433256, -0.3636959, 0.2678772, -0.046356395, -0.1771877, -0.017444499, -0.06527938, 0.073921666, -0.1880833, 0.1873346, 0.10331725, -0.05711381, 0.049431477, -0.047258172, 0.13095368, -0.35352108)); + conv2d_5_tf += mul(i1, min16float4x4(0.10444254, -0.16424808, -0.00615067, 0.1023235, -0.122729294, -0.2563471, 0.00030699265, 0.09230543, 0.07732433, -0.03397466, -0.03141724, 0.2431111, 0.009742008, -0.07286298, -0.015188814, 0.025636861)); + conv2d_5_tf += mul(a2, min16float4x4(-0.06326144, -0.045018848, -0.130233, -0.015639791, -0.015171213, -0.009451374, 0.06830251, 0.07718799, 0.009820809, -0.10778585, 0.011396909, -0.067577444, 0.16482629, 0.099055305, 0.0517957, 0.008594935)); + conv2d_5_tf += mul(b2, min16float4x4(-0.037354734, 0.09272911, -0.11168438, 0.1708543, -0.12653585, -0.042765, 0.008014873, 0.22469266, 0.019282004, 0.0041092015, -0.029787902, 0.025127187, -0.05086034, 0.0077483514, 0.010261478, 0.07023893)); + conv2d_5_tf += mul(c2, min16float4x4(0.055195954, 0.004654069, -0.02118881, -0.05352797, -0.021830624, -0.010750989, -0.032053873, 0.18029462, -0.0703946, 0.06940036, 0.011578795, 0.049051903, 0.12236165, 0.1469314, -0.04752202, -0.02873477)); + conv2d_5_tf += mul(d2, min16float4x4(0.11799468, -0.022473548, 0.0045530205, 0.0870364, 0.1895775, -0.041058388, 0.079169616, -0.08769193, -0.012526104, 0.03904729, 0.016011083, -0.010498281, 0.08499936, -0.050380737, 0.14939919, 0.009984251)); + conv2d_5_tf += mul(e2, min16float4x4(0.10477428, 0.16810521, -0.1314053, 0.084377944, 0.17922944, -0.304226, 0.25293878, -0.15422472, 0.20214307, 0.10322054, -0.13431601, 0.04898287, 0.09717359, -0.07664543, 0.14711176, 0.15777126)); + conv2d_5_tf += mul(f2, min16float4x4(-0.027849296, -0.107415505, -0.048003152, -0.14503942, 0.16935585, -0.11120448, 0.19879252, 0.25992575, 0.10300595, 0.044460453, 0.095423825, -0.0006854256, 0.04321415, -0.042708825, 0.02633511, -0.06220348)); + conv2d_5_tf += mul(g2, min16float4x4(-0.004024937, 0.05021026, -0.00765448, 0.18315202, -0.078596614, -0.022813313, 0.09930163, 0.08525698, -0.0024254897, -0.06150155, 0.12159309, 0.056743085, -0.19437842, 0.02563038, -0.14668292, -0.0805431)); + conv2d_5_tf += mul(h2, min16float4x4(0.037370156, -0.13586049, -0.11521326, -0.07453397, -0.025900846, -0.0823091, -0.14436729, 0.14114335, 0.055820756, 0.05531836, -0.1474026, 0.10203739, 0.053665128, 0.00896543, 0.13431323, -0.12663968)); + conv2d_5_tf += mul(i2, min16float4x4(-0.20144333, 0.05849729, 0.06303023, -0.17678042, 0.03238696, -0.19829398, 0.12956308, -0.20013878, -0.1353999, -0.001031907, 0.10556917, -0.14760506, 0.03315909, -0.10838441, 0.16175537, -0.001477876)); + conv2d_5_tf += mul(a3, min16float4x4(0.087629505, -0.05908092, 0.16011593, -0.11285914, -0.4358247, 0.18938082, -0.31105244, -0.3638732, -0.0069619874, 0.029419519, -0.2156866, -0.13693112, -0.113110565, -0.09906378, -0.11164287, -0.084068194)); + conv2d_5_tf += mul(b3, min16float4x4(0.072181284, 0.035425037, 0.028820323, 0.12786204, 0.37121117, -0.076626934, 0.058864776, -0.20865935, -0.0014984896, 0.05978116, 0.117927864, 0.013273026, 0.088378325, 0.13492325, 0.018144222, 0.22580223)); + conv2d_5_tf += mul(c3, min16float4x4(0.045780275, 0.13346507, 0.056960598, -0.0019664192, -0.24231891, -0.13189796, 0.11114239, -0.07587297, 0.03099761, 0.10284658, 0.094186746, 0.04669001, -0.20374449, -0.12047404, -0.10640337, -0.03541381)); + conv2d_5_tf += mul(d3, min16float4x4(0.14384045, 0.12343541, -0.029074568, 0.13204664, 0.18878254, 0.115503244, -0.20217639, 0.16410889, -0.79949176, 0.5460196, -0.09889672, 0.27109572, 0.10628155, 0.13510233, -0.20859608, -0.07706875)); + conv2d_5_tf += mul(e3, min16float4x4(-0.11215904, 0.08981538, -0.10094039, -0.054024383, 0.2652237, -0.2002571, -0.15960355, 0.032049023, 0.007806114, 0.10592316, -0.3487021, 0.048408728, 0.10263737, -0.026020324, 0.072276175, -0.1190967)); + conv2d_5_tf += mul(f3, min16float4x4(-0.03184955, -0.00798831, -0.028087616, -0.010780139, -0.05444991, 0.09402867, 0.30834422, 0.14518146, -0.010965188, 0.14643683, -0.02568113, 0.068982124, 0.044459574, -0.05092265, -0.0028792082, 0.17158687)); + conv2d_5_tf += mul(g3, min16float4x4(0.0869746, 0.15908171, -0.0033584125, 0.049515188, -0.15995023, 0.20953654, -0.16041277, -0.08435643, 0.42034048, 0.096904315, -0.1927207, -0.0792477, 0.078221194, -0.10053459, -0.17969237, 0.08374661)); + conv2d_5_tf += mul(h3, min16float4x4(0.10612468, -0.23303585, -0.08996894, 0.10191982, 0.10724305, 0.1258089, -0.08111434, 0.103680536, 0.00824538, 0.2173516, -0.601468, -0.17365147, -0.09311857, -0.045947216, 0.20118287, 0.00016345571)); + conv2d_5_tf += mul(i3, min16float4x4(-0.07453406, 0.02476293, -0.089717, -0.14455949, -0.1427004, -0.21921235, 0.1878364, -0.023677701, -0.29442346, 0.13739492, -0.10435927, -0.35067815, 0.00956389, 0.049088918, -0.055482347, 0.1527778)); + conv2d_5_tf += mul(na1, min16float4x4(-0.20727113, 0.23718962, 0.17435564, -0.017858913, -0.042935595, 0.1996666, -0.059547734, 0.09735509, 0.019539079, -0.012399102, 0.057370137, 0.027493393, -0.10042333, -0.07915818, 0.07218426, 0.1309558)); + conv2d_5_tf += mul(nb1, min16float4x4(-0.032295313, 0.07833535, 0.22808518, 0.012292011, 0.09856554, -0.01996994, -0.028461069, 0.029348027, -0.25023523, 0.21794361, 0.14906348, 0.039845698, -0.004544177, -0.031246802, 0.019103816, 0.07738693)); + conv2d_5_tf += mul(nc1, min16float4x4(-0.15647748, -0.048666175, -0.03838509, 0.22003315, 0.048363995, -0.077338494, 0.109276325, -0.000109877525, -0.10441263, 0.18494262, -0.08754767, 0.12850273, 0.03408794, 0.15086798, -0.19896401, 0.048397515)); + conv2d_5_tf += mul(nd1, min16float4x4(0.011858143, -0.121841036, 0.0048841173, -0.062427614, 0.14153655, 0.011297287, 0.12778129, 0.004588582, 0.021572713, 0.15850346, 0.06464319, 0.06260356, 0.0838926, 0.04272777, 0.0733926, -0.08732838)); + conv2d_5_tf += mul(ne1, min16float4x4(0.20364462, 0.15701732, 0.053049877, -0.46085536, -0.037331745, -0.05813282, 0.036300424, 0.05660442, 0.14007641, 0.12849629, 0.08266283, -0.07872285, 0.07497584, -0.102409676, -0.12487048, -0.06305082)); + conv2d_5_tf += mul(nf1, min16float4x4(0.26158065, -0.090300985, 0.3522249, 0.18087223, -0.06095069, -0.10725335, 0.285748, 0.15195337, -0.19382374, -0.11163994, -0.10937165, -0.05908017, 0.0042464877, -0.14594594, -0.16316739, -0.17099144)); + conv2d_5_tf += mul(ng1, min16float4x4(-0.10028552, -0.18077525, 0.29705408, 0.12354066, 0.0198171, -0.08987044, 0.26377577, 0.075702764, 0.06952089, 0.0049671913, -0.3116211, 0.017268507, 0.37579817, -0.037516277, -0.09738986, 0.0917646)); + conv2d_5_tf += mul(nh1, min16float4x4(0.17661515, -0.17850937, -0.0018308868, 0.18318558, -0.0013081668, -0.113424055, -0.22193146, 0.15262845, -0.13412614, -0.13704826, -0.22099695, 0.24989522, 0.0740908, -0.3789193, -0.05141985, 0.14818457)); + conv2d_5_tf += mul(ni1, min16float4x4(0.31471825, 0.16524819, 0.03326876, -0.14611365, -0.1191457, -0.06510173, -0.13893965, -0.33106923, 0.13048746, -0.527816, 0.01877066, 0.26005507, -0.06294366, -0.24761125, -0.102864824, 0.094261676)); + conv2d_5_tf += mul(na2, min16float4x4(0.023637002, -0.07186282, 0.0946568, 0.13016573, 0.27244806, -0.08329611, 0.049762517, 0.14729369, 0.15868294, 0.07715838, -0.039478883, -0.06753388, 0.13460182, -0.092146814, -0.11814287, 0.12007007)); + conv2d_5_tf += mul(nb2, min16float4x4(0.06190745, -0.023566067, 0.239366, -0.0068376404, -0.15343493, 0.043685004, -0.047154866, 0.06527902, 0.11998191, -0.2565534, -0.091910206, -0.24104144, -0.12814765, 0.18195467, 0.11766466, 0.06181653)); + conv2d_5_tf += mul(nc2, min16float4x4(-0.06866098, 0.11969287, 0.00997188, 0.09261804, -0.14177154, -0.0052282973, 0.008734555, -0.20822202, 0.0068409014, -0.00470473, 0.031823143, -0.0601048, 0.05632819, 0.01690721, 0.01305342, -0.05824624)); + conv2d_5_tf += mul(nd2, min16float4x4(0.20557542, -0.10924632, 0.012821291, -0.11472336, -0.012862975, -0.09720539, 0.016499901, 0.053605244, 0.2183789, -0.014083709, -0.052786104, -0.075659566, -0.15531872, -0.1454758, 0.032142643, 0.28776056)); + conv2d_5_tf += mul(ne2, min16float4x4(-0.09832725, 0.3388722, -0.092447765, -0.16408351, -0.2557467, 0.031259898, 0.12057204, -0.018744074, -0.46363798, 0.042668946, 0.06506717, -0.25751963, 0.043604825, 0.11740889, 0.07365291, -0.027296776)); + conv2d_5_tf += mul(nf2, min16float4x4(-0.060943104, -0.00371101, 0.13572243, 0.013030143, 0.01196217, -0.14187267, -0.016784329, -0.048273906, 0.2050283, -0.02000498, -0.069050424, -0.09851947, 0.028769497, 0.1289265, -0.0022706073, -0.00296877)); + conv2d_5_tf += mul(ng2, min16float4x4(-0.015049836, 0.01153945, -0.006021933, -0.022156725, -0.030286482, 0.24230544, 0.040056467, -0.021735856, 0.20740065, -0.08999259, 0.006861033, -0.104062624, 0.26829463, 0.051726963, -0.12235904, 0.19572715)); + conv2d_5_tf += mul(nh2, min16float4x4(0.12676726, 0.17367609, -0.03689342, -0.034580305, -0.006836569, -0.06386566, 0.30929026, 0.09361281, -0.06405332, 0.26401913, -0.33314535, -0.06335476, -0.10960964, 0.13062708, 0.058030583, -0.1269144)); + conv2d_5_tf += mul(ni2, min16float4x4(0.03625719, 0.07449099, 0.021113826, 0.008309737, -0.09200202, -0.13108951, -0.0054502958, 0.19819209, -0.24836262, 0.22340319, -0.06844758, -0.22940424, -0.03410828, 0.03854127, -0.050844472, 0.019776637)); + conv2d_5_tf += mul(na3, min16float4x4(0.014228765, -0.013087027, -0.18055649, 0.001141047, 0.14329694, -0.008534367, 0.006927009, -0.058499523, -0.030727612, -0.07256724, 0.0025644915, 0.007111054, 0.036673337, -0.026148604, 0.120233335, 0.110904366)); + conv2d_5_tf += mul(nb3, min16float4x4(-0.008129229, 0.047908727, -0.1769762, 0.013220415, 0.066762984, 0.06523022, -0.016525066, -0.014394631, -0.008272182, -0.029847749, -0.10351308, 0.036801845, 0.11523106, -0.055156656, 0.11873017, -0.128935)); + conv2d_5_tf += mul(nc3, min16float4x4(0.21848068, -0.002019241, -0.06304477, 0.026670042, 0.039536465, -0.14145948, -0.06304873, 0.023532849, -0.122648045, 0.036414735, -0.037745856, -7.688992e-06, 0.059370764, -0.015019475, -0.029084614, 0.015826277)); + conv2d_5_tf += mul(nd3, min16float4x4(-0.09427522, -0.001972529, -0.09509679, -0.104867265, 0.05705236, 0.00031401246, 0.096889675, 0.15868911, -0.033721585, 0.08299121, -0.095194876, -0.1062834, -0.029866459, -0.041780088, -0.023895228, -0.0026728562)); + conv2d_5_tf += mul(ne3, min16float4x4(-0.27093527, -0.026471421, 0.09702481, 0.036061123, -0.1268649, 0.099340335, 0.15685195, -0.070615016, -0.13991052, -0.04212775, 0.096722156, 0.056507673, 0.02626438, 0.030435594, -0.00033173471, -0.024930432)); + conv2d_5_tf += mul(nf3, min16float4x4(-0.21608484, 0.038410295, -0.10975598, 0.12944944, -0.034110125, 0.03908566, -0.030190451, 0.031670973, -0.018954927, 0.0726848, 0.023156218, 0.017966276, -0.09825987, 0.023912448, 0.07257811, -0.008502145)); + conv2d_5_tf += mul(ng3, min16float4x4(0.044695053, -0.046481512, -0.098602146, -0.13273694, -0.09406325, -0.0062411693, 0.10242225, 0.025881069, 0.061662897, 0.019632077, -0.069696225, -0.14693011, 0.034227923, 0.037439592, -0.17188378, -0.19963826)); + conv2d_5_tf += mul(nh3, min16float4x4(-0.25531536, -0.050288115, 0.11258405, -0.24783169, -0.034263797, 0.054084245, 0.119918555, -0.027509615, 0.10056127, -0.09610037, 0.16208062, 0.005269051, 0.08660796, 0.11050934, -0.012584769, -0.0040703616)); + conv2d_5_tf += mul(ni3, min16float4x4(0.07649277, 0.13011539, -0.052341804, 0.07836859, 0.18562089, 0.07701519, -0.15669914, 0.007145429, 0.018427812, -0.12513049, -0.03395353, 0.14632194, -0.108091615, -0.01585824, 0.0602756, -0.11572579)); + conv2d_5_tf += min16float4(0.028852103, -0.003142654, 0.019121574, 0.026819304); + min16float4 nconv2d_5_tf = max(-conv2d_5_tf, 0); + conv2d_5_tf = max(conv2d_5_tf, 0); + + min16float4 conv2d_4_tf = mul(a1, min16float4x4(-0.032557677, 0.15826401, -0.11499422, -0.08640765, -0.09198991, -0.007192731, 0.010252954, 0.023780089, 0.15372203, -0.0009684923, 0.051660325, 0.011104123, 0.023871671, 0.005045307, 0.10722681, 0.065446004)); + conv2d_4_tf += mul(b1, min16float4x4(0.04723326, 0.21495502, -0.4453857, -0.020825233, 0.021379868, 0.04798187, 0.11383445, 0.08597329, 0.05730255, -0.046370696, -0.105095126, -0.03220056, -0.10122536, 0.06955123, -0.023051325, -0.04296927)); + conv2d_4_tf += mul(c1, min16float4x4(-0.02551809, 0.16179861, -0.15771814, -0.00045056897, 0.05842655, 0.11279471, 0.08018674, 0.05973765, 0.044070918, 0.08054599, -0.070336945, 0.05499731, -0.039118823, 0.003635353, -0.019759493, -0.040480837)); + conv2d_4_tf += mul(d1, min16float4x4(-0.04707628, 0.040738698, -0.013698143, -0.047391538, 0.031729057, -0.01837267, -0.10985463, -0.0028168112, -0.03167109, 0.0007989082, 0.011234699, 0.06895626, -0.12226361, 0.016290974, -0.055669673, -0.17432979)); + conv2d_4_tf += mul(e1, min16float4x4(-0.05069543, 0.15450205, 0.06981913, -0.377529, -0.14111535, 0.124757245, 0.021858096, 0.044034548, -0.16741593, 0.09746289, -0.045757677, -0.11644043, -0.09906484, 0.19128124, 0.061969943, -0.14589702)); + conv2d_4_tf += mul(f1, min16float4x4(0.12177423, 0.077437244, 0.059054222, 0.14925033, 0.016682645, -0.004765056, -0.2194741, 0.11314126, 0.2384071, -0.12049565, 0.12753354, 0.19679058, 0.03558123, 0.018636368, -0.11018761, -0.027520377)); + conv2d_4_tf += mul(g1, min16float4x4(-0.03618456, -0.030103968, 0.02968891, -0.00393875, -0.07128213, 0.022181263, -0.08430743, -0.027601235, -0.09228556, 0.04661313, 0.054729965, 0.052708175, 0.050483003, -0.022951633, 0.099321984, -0.043519083)); + conv2d_4_tf += mul(h1, min16float4x4(0.034695346, 0.10380181, -0.043013666, 0.037639238, 0.118943654, 0.027931944, 0.07628075, -0.12427217, 0.14970858, -0.065848, 0.0030750742, 0.011039123, 0.27721024, -0.055808693, 0.25105593, -0.1825985)); + conv2d_4_tf += mul(i1, min16float4x4(0.03627934, -0.17293514, 0.09188732, 0.11569783, -0.035355445, -0.10536353, -0.0068529076, -0.0929389, 0.09053234, 0.05907859, 0.049182277, 0.15194432, -0.09835422, 0.00061943196, 0.066343345, -0.06307589)); + conv2d_4_tf += mul(a2, min16float4x4(0.10120336, -0.10855617, 0.13412404, -0.018874792, 0.037988223, 0.0957435, 0.015402347, -0.08589699, -0.07694196, -0.03258571, 0.064437136, -0.0495422, 0.24836332, -0.0041739377, 0.093993485, -0.0076778256)); + conv2d_4_tf += mul(b2, min16float4x4(-0.20205948, 0.035698004, 0.0120531265, 0.03971649, 0.07550046, 0.047750015, -0.049045984, 0.04001014, -0.030263485, -0.0030697742, 0.05283423, -0.00014085052, -0.062447365, -0.0503476, -0.085151225, -0.04436882)); + conv2d_4_tf += mul(c2, min16float4x4(0.1516312, -0.073820546, -0.01047401, 0.0002717457, -0.17057727, 0.20856272, -0.09357496, -0.17346743, -0.068092465, -0.023344085, -0.03279074, -0.077289, -0.09844614, -0.035491887, 0.048796505, -0.03633584)); + conv2d_4_tf += mul(d2, min16float4x4(0.0073127835, 0.041834716, 0.015633723, -0.042742077, 0.08359733, -0.13898548, 0.1343008, 0.04692816, 0.051663343, -0.1277769, 0.029269615, 0.021745533, 0.09920264, 0.032076713, -0.05319438, 0.040574815)); + conv2d_4_tf += mul(e2, min16float4x4(0.052737534, -0.02136074, -0.18437223, 0.030766862, 0.23291707, -0.010449272, 0.032748792, 0.1304141, 0.27302903, 0.008562884, 0.13475919, 0.044446316, -0.17819557, 0.08270108, 0.06075267, -0.112788476)); + conv2d_4_tf += mul(f2, min16float4x4(-0.093748294, -0.004655885, -0.044859763, -0.11719146, -0.4701752, 0.09076277, -0.2283514, -0.34524822, -0.11999304, -0.010338027, 0.026785752, 0.029790966, -0.0635327, -0.024085084, -0.12074973, 0.080456585)); + conv2d_4_tf += mul(g2, min16float4x4(-0.023425102, -0.105786875, 0.1220016, 0.017974272, -0.12736784, -0.050550908, -0.1985566, 0.09139255, -0.18943925, -0.0067088404, -0.15007311, -0.015332959, 0.16430685, 0.006736225, -0.009263825, -0.08230126)); + conv2d_4_tf += mul(h2, min16float4x4(-0.15165123, 0.057155497, -0.09756418, 0.0475568, -0.14430566, 0.05169595, -0.24240975, 0.061147846, 0.0017831615, 0.028189357, -0.12519005, 0.03604646, -0.0460214, 0.05936097, -0.0213775, -0.28192145)); + conv2d_4_tf += mul(i2, min16float4x4(-0.019390648, 0.005514995, -0.0024649797, 0.056670878, -0.10385216, -0.05531206, 0.23233996, -0.16394126, 0.1718211, -0.08723329, 0.08580946, -0.028214762, -0.060853615, 0.0458013, 0.106201656, 0.031685878)); + conv2d_4_tf += mul(a3, min16float4x4(-0.105268896, 0.0106684705, -0.10355101, -0.07401398, 0.12425712, -0.21308881, 0.05200582, -0.024954682, -0.1120292, 0.07799603, -0.031506516, 0.0031533986, -0.05264893, -0.11141642, 0.107277475, 0.049987797)); + conv2d_4_tf += mul(b3, min16float4x4(0.08439962, -0.14181082, -0.20358182, 0.09080642, -0.061622817, 0.24017061, -0.12030436, 0.17224449, -0.0220505, 0.20025904, 0.1032571, 0.032335218, -0.09232964, -0.06172056, -0.1011141, -0.07322099)); + conv2d_4_tf += mul(c3, min16float4x4(-0.10896482, 0.06107763, -0.100641444, -0.018832406, 0.020139545, -0.0037260412, -0.10512619, -0.24599148, 0.014342631, 0.056689363, -0.06662091, 0.03999069, 0.00824376, 0.030449467, 0.027041748, -0.056902107)); + conv2d_4_tf += mul(d3, min16float4x4(-0.18174766, 0.040627997, 0.1140224, -0.20088135, 0.07404639, 0.01215843, -0.050341435, -0.0011868333, -0.5206288, 0.53214884, -0.60289955, 0.25364086, -0.05814184, 0.21600877, 0.07475344, 0.0624221)); + conv2d_4_tf += mul(e3, min16float4x4(-0.07710521, 0.030054979, -0.28164682, -0.13994755, 0.028757188, 0.04356096, -0.14357159, 0.2761477, -0.5300268, 0.44994202, -0.15364286, -0.18580483, 0.084563375, -0.13093601, 0.08291044, 0.017790407)); + conv2d_4_tf += mul(f3, min16float4x4(0.013963807, 0.0032885068, 0.0069646467, 0.03777879, -0.30103573, -0.047965538, 0.057550967, -0.3402889, 0.0026557294, 0.2289777, 0.01937088, 0.18484715, 0.083694465, -0.056240357, -0.0023172104, -0.13328342)); + conv2d_4_tf += mul(g3, min16float4x4(-0.05847699, 0.06990862, -0.0076244893, 0.03992696, 0.088809974, -0.059422277, -0.10557949, 0.058280375, -0.37764055, -0.19777957, -0.86350954, -0.21546844, 0.21863134, -0.074350335, 0.039010234, -0.021216504)); + conv2d_4_tf += mul(h3, min16float4x4(-0.18698102, -0.024641648, -0.16558538, -0.06499548, 0.10435924, 0.0030438402, -0.021636335, 0.046050593, -0.22217542, -0.14033853, -0.21516539, -0.4834089, 0.061894827, -0.024107188, 0.045805957, 0.20019397)); + conv2d_4_tf += mul(i3, min16float4x4(-0.0657418, 0.074276686, -0.07074239, -0.0101531055, -0.17146541, -0.016556345, -0.16196094, -0.13551502, -0.017605018, 0.065230414, 0.10717515, 0.41153327, 0.07095331, -0.05611257, -0.09297768, -0.054604497)); + conv2d_4_tf += mul(na1, min16float4x4(-0.051999312, 0.28559515, -0.09147715, 0.04536181, 0.077552326, 0.052161235, 0.006652824, 0.12593806, -0.07654755, 0.056134425, 0.029163264, -0.05461885, 0.04772557, 0.14073811, 0.07795857, -0.0397234)); + conv2d_4_tf += mul(nb1, min16float4x4(-0.0698435, 0.17774913, -0.07301677, -0.14336437, -0.104051985, 0.14831689, 0.045199208, -0.1867252, 0.07530157, 0.12153924, 0.1397731, -0.026905237, 0.056165505, 0.21213025, 0.073159344, 0.03143804)); + conv2d_4_tf += mul(nc1, min16float4x4(0.029820994, -0.079599164, 0.12901585, 0.014192698, -0.0816397, 0.02425821, 0.10938256, 0.0077257096, -0.009784561, 0.20602871, -0.07226973, -0.16234052, 0.0064664064, -0.023469927, 0.0037447219, 0.015258041)); + conv2d_4_tf += mul(nd1, min16float4x4(-0.028296372, 0.23841251, 0.04076168, 0.061052933, -0.082375534, 0.11200519, 0.025308013, 0.1736187, 0.23024227, -0.004161287, 0.16408522, -0.0141539015, 0.01496407, -0.037708607, 0.15057993, 0.14573294)); + conv2d_4_tf += mul(ne1, min16float4x4(0.22485349, -0.2217838, -0.011602474, 0.22668324, 0.2172098, -0.21826234, -0.09506227, -0.06592076, 0.14401191, 0.014868243, 0.41509256, 0.2799861, 0.04998898, -0.121938676, -0.29612163, 0.16926381)); + conv2d_4_tf += mul(nf1, min16float4x4(0.009154201, -0.14300221, 0.0121250935, -0.049595118, -0.3256411, -0.07036471, -0.066481166, -0.32643607, 0.13287841, -0.096211806, -0.24969384, -0.36735064, -0.14625767, 0.07217462, 0.06205977, 0.13962744)); + conv2d_4_tf += mul(ng1, min16float4x4(0.10122661, -0.042678952, 0.08920629, -0.022906423, -0.048781462, 0.008094098, 0.16410494, 0.01511925, 0.009355741, -0.034123767, 0.06522056, -0.04114966, 0.025140515, -0.046565775, 0.18292467, 0.009392873)); + conv2d_4_tf += mul(nh1, min16float4x4(-0.06604219, -0.10034091, 0.10934946, 0.18707348, -0.19358878, 0.11417287, -0.024397675, 0.04772407, -0.10278711, -0.03847901, -0.025120566, 0.047323767, -0.26464674, 0.15394583, -0.042590924, -0.09511779)); + conv2d_4_tf += mul(ni1, min16float4x4(-0.13339657, 0.13506593, 0.011463314, 0.077461444, -0.022262955, 0.06132727, -0.113292165, -0.1987806, 0.0027555283, -0.016475892, 0.14219329, -0.211625, 0.11405046, -0.12044097, -0.088240534, 0.17436995)); + conv2d_4_tf += mul(na2, min16float4x4(-0.08783496, 0.06564822, -0.10796846, -0.13460107, 0.10140343, 0.08105866, 0.0040176474, -0.045305755, -0.09299188, -0.18928377, -0.099694185, 0.11314726, -0.018881949, 0.04591721, 0.117965475, -0.00035760578)); + conv2d_4_tf += mul(nb2, min16float4x4(0.043456256, 0.10901491, 0.010485461, -0.061420415, -0.04018357, 0.1689085, 0.015425885, 0.061508525, 0.069377325, -0.18156749, 0.19194232, -0.25884745, -0.036184482, -0.0069973134, 0.021037813, -0.08046543)); + conv2d_4_tf += mul(nc2, min16float4x4(-0.044377886, 0.18098527, -0.07314578, -0.00287104, 0.038114406, -0.044841792, -0.063126855, 0.19896339, -0.09739791, -0.24212237, 0.19623765, -0.06326722, 0.062247403, 0.054567214, 0.10500492, 0.04231698)); + conv2d_4_tf += mul(nd2, min16float4x4(0.12399143, -0.09728722, 0.06730315, -0.011540306, -0.116925925, 0.0074092527, 0.21276267, 0.068349704, -0.05713399, 0.17656437, -0.10295556, -0.12709019, 0.102335855, 0.2679535, -0.06597912, -0.022839248)); + conv2d_4_tf += mul(ne2, min16float4x4(0.1265364, 0.16177331, -0.075765, -0.06347739, -0.056721687, 0.18794554, 0.006572088, -0.00011200755, 0.05219661, 0.21530084, -0.101604566, 0.04750483, -0.09394214, -0.11256657, 0.11389309, -0.011598962)); + conv2d_4_tf += mul(nf2, min16float4x4(0.015922887, -0.046698473, 0.0130271325, -0.052948795, 0.16426764, 0.09934194, -0.07745314, 0.038738497, -0.040967297, 0.06423774, 0.034312535, -0.013723525, -0.0030767843, 0.041221425, 0.041528914, 0.027097305)); + conv2d_4_tf += mul(ng2, min16float4x4(-0.13077654, 0.046842843, 0.034140635, 0.10109363, 0.20840693, -0.012975956, -0.041564208, 0.009877259, -0.033334266, -0.106034294, 0.2507187, -0.01512933, -0.008589095, 0.1849223, -0.06436464, 0.087347835)); + conv2d_4_tf += mul(nh2, min16float4x4(0.13326278, -0.035467118, 0.12698379, -0.034838732, 0.023856519, 0.05274121, -0.09120117, 0.070493534, -0.14804247, 0.08772896, -0.1343374, -0.058013596, -0.1194792, -0.07288297, 0.074856065, 0.021033823)); + conv2d_4_tf += mul(ni2, min16float4x4(0.023594514, -0.018284807, -0.037060708, -0.06051526, 0.13681069, 0.09436225, -0.044987947, 0.21031074, -0.14567234, 0.04987286, -0.24576813, -0.091558464, 0.0040201824, -0.045261826, 0.050834723, 0.04080285)); + conv2d_4_tf += mul(na3, min16float4x4(-0.12843935, 0.11059404, 0.035774253, 0.016019672, 0.13419932, -0.082884714, 0.086934, -0.027470622, -0.0055711996, 0.14726739, 0.00025540774, -0.082832016, 0.015134819, -0.1869738, -0.15580305, 0.118347436)); + conv2d_4_tf += mul(nb3, min16float4x4(-0.03210018, -0.07439424, 0.09171389, 0.0061248797, -0.122092225, -0.0055175424, 0.060848907, 0.05447007, -0.1005626, -0.13843839, -0.11508479, 0.034595586, 0.16528612, 0.07630222, 0.10175574, -0.034656286)); + conv2d_4_tf += mul(nc3, min16float4x4(0.05687666, -0.1130296, -0.038044114, 0.1376985, 0.02434624, -0.21984427, -0.0038558878, -0.10872551, 0.00807944, 0.019718373, 0.07016335, 0.001672884, -0.051990695, -0.04958167, -0.036594924, -0.0008506928)); + conv2d_4_tf += mul(nd3, min16float4x4(-0.07842389, -0.0907049, 0.10945533, -0.14496571, 0.03524454, -0.12881151, -0.13281278, -0.023060825, -0.037150636, -0.0001619192, 0.07462792, 0.19251943, -0.048907887, -0.09152158, 0.077018015, -0.0076050037)); + conv2d_4_tf += mul(ne3, min16float4x4(-0.06379491, 0.22390717, -0.044009656, -0.19816853, -0.14713046, 0.114638254, -0.008227305, -0.014490413, 0.04359834, 0.10032826, -0.17928778, -0.13981889, -0.07729277, 0.11685862, 0.21970165, -0.09117455)); + conv2d_4_tf += mul(nf3, min16float4x4(0.21068226, 0.030921075, 0.109845765, 0.058498275, 0.015876649, -0.0067828237, -0.10064077, 0.13756661, 0.017506564, 0.041748323, 0.17195722, 0.012285508, -0.023290245, 0.07060226, 0.069730066, -0.018874977)); + conv2d_4_tf += mul(ng3, min16float4x4(0.19153018, -0.07691863, -0.03687873, -0.069982305, -0.097453654, 0.060358603, -0.030159682, -0.048520114, 0.12498585, -0.07376571, -0.01039302, -0.099845245, 0.00042995642, 0.035783857, -0.12854497, -0.024975097)); + conv2d_4_tf += mul(nh3, min16float4x4(0.11177764, -0.02895167, 0.09053559, -0.24130683, -0.09276382, 0.04739869, -0.005453787, 0.031923447, 0.089385964, -0.048109047, 0.061177306, 0.117845595, 0.014615613, 0.1153759, -0.0007218852, -0.10042441)); + conv2d_4_tf += mul(ni3, min16float4x4(0.041179586, 0.00042151578, 0.07818137, 0.06354339, 0.0049364083, -0.055836283, -0.0073542926, 0.047470722, -0.15328479, 0.03497268, -0.17375292, 0.0006636334, -0.043640774, -0.007737031, 0.10040319, -0.09145891)); + conv2d_4_tf += min16float4(-0.0542914, -0.045369092, 0.029350873, -0.018128533); + tex8[gxy] = conv2d_4_tf; + min16float4 nconv2d_4_tf = max(-conv2d_4_tf, 0); + conv2d_4_tf = max(conv2d_4_tf, 0); + + min16float4 target = mul(e1, min16float4x4(0.15610647, -0.15150696, -0.076018915, 0.030773202, -0.13935511, 0.17644633, 0.028819937, 0.30125114, 0.38625193, 0.35517895, 0.0975343, 0.114022225, 0.25494647, -0.23291643, 0.29096943, 0.15063812)); + target += mul(e2, min16float4x4(-0.22949804, -0.1368772, -0.07729264, 0.08470473, -0.06426131, -0.0064847367, 0.08241476, -0.1476949, -0.13712044, -0.36110023, -0.081719294, 0.19409889, 0.05562042, 0.26609465, 0.020447321, 0.2567414)); + target += mul(e3, min16float4x4(0.03337578, 0.2905731, 0.21772428, -0.074480034, 0.071880735, 0.27764675, -0.17273173, -0.0037474795, -0.1842544, 0.21896398, -0.30134472, 0.1711769, 0.23913746, -0.0435854, -0.12745531, -0.050227556)); + target += mul(ne1, min16float4x4(0.34923258, -0.5455803, -0.2904644, -0.5446842, -0.040965725, -0.055288248, -0.50672686, -0.10309429, 0.045286313, -0.04284262, -0.19785875, -0.16594213, -0.10000842, 0.47245356, -0.32767087, 0.32854807)); + target += mul(ne2, min16float4x4(0.05952625, -0.062991776, 0.3438396, -0.08141334, -0.2488028, -0.04746144, 0.06563561, 0.45020792, -0.19996788, 0.015523991, -0.19214569, -0.24849077, -0.022107737, 0.28190804, 0.13384444, -0.12800638)); + target += mul(ne3, min16float4x4(-0.37812218, 0.09970516, 0.015231938, 0.07226164, -0.33720142, -0.05899804, -0.0025790115, -0.17770731, 0.111127384, 0.008749534, -0.09077738, -0.060420215, -0.10196339, 0.09641038, 0.25222716, 0.12781976)); + target += mul(conv2d_5_tf, min16float4x4(0.24168618, 0.18625724, -0.012904225, -0.011732107, 0.085045695, -0.4754185, 0.10896487, 0.09179793, -0.31662637, -0.117563, 0.5133052, -0.09457646, -0.15872721, -0.09779008, 0.56810176, 0.3339073)); + target += mul(nconv2d_5_tf, min16float4x4(-0.09105348, -0.17617023, -0.21897802, -0.14157395, 0.16165406, -0.46579927, 0.24905841, 0.11579037, 0.09073764, 0.36771873, -0.29340085, -0.04271419, -0.11684365, -0.17138094, 0.12188604, -0.14749436)); + target += mul(conv2d_1_tf, min16float4x4(0.10943254, -0.17193961, -0.07027378, -0.26047203, 0.04288517, 0.21311204, 0.03997142, -0.17006959, 0.16181368, 0.28361118, 0.26655135, -0.097007245, -0.15998597, -0.09568138, -0.27558687, -0.11706871)); + target += mul(nconv2d_1_tf, min16float4x4(0.365517, 0.5422966, -0.0013869518, 0.3447622, -0.25885904, -0.098901175, -0.048043057, 0.15867509, -0.12303401, -0.15362008, 0.270228, -0.2756776, -0.44207478, -0.0419657, 0.09387863, -0.07240854)); + target += mul(conv2d_4_tf, min16float4x4(0.15073416, -0.032387026, -0.039117433, -0.50999755, 0.073477276, -0.14495571, 0.15120687, -0.3443857, -0.29039595, -0.16189122, 0.14190345, -0.10934344, -0.21965231, -0.45768484, 0.11907852, 0.5091087)); + target += mul(nconv2d_4_tf, min16float4x4(0.23260471, 0.16441877, 0.16760987, 0.10740154, -0.21663232, -0.10124566, -0.20843595, 0.066555224, 0.24608357, 0.16345865, -0.11965141, 0.18451719, 0.41683537, -0.044497896, 0.39102596, -0.11944608)); + target += min16float4(-0.02423156, 0.015124756, -0.02608139, 0.030428935); + tex1[gxy] = target; + + target = mul(e1, min16float4x4(-0.12407633, -0.027812717, 0.23094666, 0.060302667, -0.16624144, -0.0007371851, -0.28186718, 0.22369424, 0.022404855, 0.09096415, 0.0017822908, 0.336001, -0.09130467, 0.034111694, 0.19113103, -0.14513424)); + target += mul(e2, min16float4x4(-0.014768806, -0.31290373, 0.015769936, -0.13507901, -0.010203078, 0.4945444, -0.01088852, -0.1582938, -0.14903755, -0.1840089, -0.009966903, -0.19425109, -0.21303283, 0.26285252, -0.046254523, -0.15465552)); + target += mul(e3, min16float4x4(0.07533467, 0.26080438, 0.024856985, 0.34277654, -0.3129344, 0.30575162, 0.06931557, -0.044698272, 0.18042412, 0.45999247, -0.5192437, 0.022618707, -0.020097036, -0.27706465, -0.0050434433, -0.12770803)); + target += mul(ne1, min16float4x4(0.098648146, -0.21701503, 0.10266521, -0.085537605, 0.02402345, -0.28643832, 0.19378376, -0.12658586, 0.115897186, 0.01580828, 0.11827048, 0.29019687, -0.19341177, 0.09564265, 0.03476779, 0.11699004)); + target += mul(ne2, min16float4x4(0.058346223, 0.25530934, -0.026972264, 0.3190419, 0.12263199, 0.124316074, 0.04734691, 0.011293402, -0.17419139, -0.15893947, 0.093723476, 0.23282392, 0.19400646, -0.0533148, 0.026266033, 0.19663234)); + target += mul(ne3, min16float4x4(-0.06663804, 0.20435949, 0.044924624, -0.24982749, 0.20327586, 0.12442739, -0.3155765, -0.18541007, 0.18991531, -0.19276267, 0.21697456, 0.03178544, -0.3381796, -0.15325621, -0.25820518, -0.07297032)); + target += mul(conv2d_5_tf, min16float4x4(0.098007046, -0.17018083, 0.3390076, -0.2280134, 0.12989196, -0.044336785, -0.10702673, -0.37464848, 0.028437488, 0.24224928, -0.107826136, 0.0031239046, -0.34256136, -0.17936559, 0.091159485, -0.054418396)); + target += mul(nconv2d_5_tf, min16float4x4(0.053965975, -0.17428857, -0.43524495, -0.15119378, -0.25487635, 0.16371927, 0.1467712, -0.08216164, -0.5624722, -0.11886804, -0.058240388, 0.17669299, -0.15173754, 0.13094892, 0.39045286, -0.017048221)); + target += mul(conv2d_1_tf, min16float4x4(-0.15798661, -0.36355045, 0.1957264, -0.05392931, 0.098283805, 0.14677107, 0.16887192, -0.11125151, -0.113571666, 0.15960959, -0.09331763, -0.032195523, 0.17286941, 0.33965907, 0.09051416, -0.25542957)); + target += mul(nconv2d_1_tf, min16float4x4(0.16866244, 0.05636189, -0.100324616, 0.20495924, -0.102705345, -0.08387417, -0.09328024, 0.21541446, 0.1430065, 0.0308464, -0.0793588, -0.029477509, -0.28854427, -0.29555637, 0.33754608, -0.18144317)); + target += mul(conv2d_4_tf, min16float4x4(-0.11338383, 0.019528843, -0.24414338, -0.36290777, 0.54908705, -0.083018646, 0.007534378, -0.1406417, 0.37853354, 0.09911941, -0.047861155, -0.3186758, 0.2125856, -0.114667036, -0.07411896, 0.050717812)); + target += mul(nconv2d_4_tf, min16float4x4(0.2961511, 0.28937215, -0.36593223, -0.16141813, -0.087650776, -0.47516292, 0.0052091824, 0.033959586, -0.06072628, -0.0012637508, -0.037578013, -0.35235298, 0.11726439, 0.6064031, 0.34058803, 0.45300734)); + target += min16float4(-0.0038817346, -0.052502215, 0.008882693, -0.017785465); + tex2[gxy] = target; + + target = mul(e1, min16float4x4(-0.21563801, -0.12204513, 0.31932783, 0.28290224, -0.17011476, -0.06448831, 0.004365267, -0.07169507, 0.21165244, -0.07712424, 0.14979824, 0.2240992, 0.48357385, -0.015724417, -0.3836641, 0.07599027)); + target += mul(e2, min16float4x4(-0.20743755, -0.119118474, 0.1009234, -0.2842955, -0.24531132, 0.062108602, 0.11733637, 0.06687575, -0.065953426, 0.15715389, 0.21475503, -0.1019138, 0.08085453, -0.24522887, -0.108375534, 0.29179853)); + target += mul(e3, min16float4x4(0.16713834, 0.030504826, -0.2423963, -0.41885766, -0.20249867, -0.061683156, -0.14999944, 0.54505223, 0.16486095, -0.023248592, -0.17566164, 0.089543514, -0.1884646, 0.15263423, 0.14438081, -0.21730141)); + target += mul(ne1, min16float4x4(0.37399703, 0.2731133, 0.11279373, 0.004775496, -0.19443156, -0.071899086, 0.17512012, -0.11265631, 0.01926881, -0.31321192, -0.32160205, -0.23714963, 0.097321026, 0.13937393, -0.28038052, -0.046872586)); + target += mul(ne2, min16float4x4(0.124041334, 0.083966166, 0.13945055, 0.087915726, 0.11154068, -0.09223973, -0.012948238, 0.16114026, 0.13717382, 0.11968761, 0.076536775, -0.15866219, -0.19017774, -0.11172013, 0.024816172, 0.096302085)); + target += mul(ne3, min16float4x4(0.081017025, -0.1537902, 0.193927, 0.22226687, 0.441012, 0.18478638, 0.30040395, 0.032401927, -0.13839063, 0.017778423, -0.42750338, -0.19760555, -0.21953818, -0.2148397, -0.084683254, 0.20916465)); + target += mul(conv2d_5_tf, min16float4x4(-0.3921892, 0.2123992, 0.14027761, 0.10175143, -0.11134986, -0.16432697, -0.1097465, -0.21807413, -0.09732297, -0.11108596, -0.39636138, -0.06654249, 0.18766358, -0.0061503067, 0.1286225, 0.2418667)); + target += mul(nconv2d_5_tf, min16float4x4(-0.0039234986, 0.17088562, 0.12906016, -0.13476452, -0.09124947, 0.3098052, 0.09895542, 0.18631962, -0.06776231, 0.19485205, 0.14722902, 0.32147923, -0.1811334, 0.15313488, 0.0796922, 0.0012897709)); + target += mul(conv2d_1_tf, min16float4x4(0.032229863, 0.025498863, 0.06695979, 0.019412167, -0.16543043, -0.12314033, 0.112201385, 0.16554663, 0.13644108, 0.3098045, 0.081390016, -0.006008416, -0.016406069, 0.22883923, 0.22282913, -0.13947442)); + target += mul(nconv2d_1_tf, min16float4x4(0.010251363, 0.08210024, -0.33465254, -0.012109372, 0.027115503, 0.1481351, -0.081793204, -0.20716506, 0.0056828605, -0.30995828, 0.11498873, 0.15678942, -0.061227474, -0.14681229, 0.1498136, 0.11219651)); + target += mul(conv2d_4_tf, min16float4x4(0.21796124, -0.12195326, 0.44734144, -0.124715045, -0.05986958, -0.25252253, -0.13802508, 0.16756216, 0.28327593, 0.38355786, -0.27178785, -0.19969118, -0.26010805, -0.074593216, 0.10679648, 0.15610766)); + target += mul(nconv2d_4_tf, min16float4x4(-0.07648412, -0.18866923, -0.2592641, 0.32486007, -0.6200149, 0.09312683, 0.42827863, -0.2703639, 0.08144911, -0.054994784, -0.24911343, 0.41974616, 0.036914464, -0.32325324, 0.012920313, -0.48379797)); + target += min16float4(-0.013587518, 0.049618572, -0.065549955, -0.007242324); + tex3[gxy] = target; +} + + +//!PASS 4 +//!DESC Conv-4x3x3x24, Conv-4x1x1x56 +//!IN tex1, tex2, tex3, tex4, tex8 +//!OUT tex9, tex5, tex6, tex7 +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 + +void Pass4(uint2 blockStart, uint3 threadId) { + uint2 gxy = Rmp8x8(threadId.x) + blockStart; + uint2 inputSize = GetInputSize(); + if (gxy.x >= inputSize.x || gxy.y >= inputSize.y) { + return; + } + + float2 inputPt = GetInputPt(); + float2 pos = (gxy + 0.5f) * inputPt; + + // [ a, d, g ] + // [ b, e, h ] + // [ c, f, i ] + min16float4 a1 = tex1.SampleLevel(sam, pos - inputPt, 0); + min16float4 b1 = tex1.SampleLevel(sam, pos + float2(-inputPt.x, 0), 0); + min16float4 c1 = tex1.SampleLevel(sam, pos + float2(-inputPt.x, inputPt.y), 0); + min16float4 d1 = tex1.SampleLevel(sam, pos + float2(0, -inputPt.y), 0); + min16float4 e1 = tex1.SampleLevel(sam, pos, 0); + min16float4 f1 = tex1.SampleLevel(sam, pos + float2(0, inputPt.y), 0); + min16float4 g1 = tex1.SampleLevel(sam, pos + float2(inputPt.x, -inputPt.y), 0); + min16float4 h1 = tex1.SampleLevel(sam, pos + float2(inputPt.x, 0), 0); + min16float4 i1 = tex1.SampleLevel(sam, pos + inputPt, 0); + + min16float4 na1 = max(-a1, 0); + min16float4 nb1 = max(-b1, 0); + min16float4 nc1 = max(-c1, 0); + min16float4 nd1 = max(-d1, 0); + min16float4 ne1 = max(-e1, 0); + min16float4 nf1 = max(-f1, 0); + min16float4 ng1 = max(-g1, 0); + min16float4 nh1 = max(-h1, 0); + min16float4 ni1 = max(-i1, 0); + + a1 = max(a1, 0); + b1 = max(b1, 0); + c1 = max(c1, 0); + d1 = max(d1, 0); + e1 = max(e1, 0); + f1 = max(f1, 0); + g1 = max(g1, 0); + h1 = max(h1, 0); + i1 = max(i1, 0); + + min16float4 a2 = tex2.SampleLevel(sam, pos - inputPt, 0); + min16float4 b2 = tex2.SampleLevel(sam, pos + float2(-inputPt.x, 0), 0); + min16float4 c2 = tex2.SampleLevel(sam, pos + float2(-inputPt.x, inputPt.y), 0); + min16float4 d2 = tex2.SampleLevel(sam, pos + float2(0, -inputPt.y), 0); + min16float4 e2 = tex2.SampleLevel(sam, pos, 0); + min16float4 f2 = tex2.SampleLevel(sam, pos + float2(0, inputPt.y), 0); + min16float4 g2 = tex2.SampleLevel(sam, pos + float2(inputPt.x, -inputPt.y), 0); + min16float4 h2 = tex2.SampleLevel(sam, pos + float2(inputPt.x, 0), 0); + min16float4 i2 = tex2.SampleLevel(sam, pos + inputPt, 0); + + min16float4 na2 = max(-a2, 0); + min16float4 nb2 = max(-b2, 0); + min16float4 nc2 = max(-c2, 0); + min16float4 nd2 = max(-d2, 0); + min16float4 ne2 = max(-e2, 0); + min16float4 nf2 = max(-f2, 0); + min16float4 ng2 = max(-g2, 0); + min16float4 nh2 = max(-h2, 0); + min16float4 ni2 = max(-i2, 0); + + a2 = max(a2, 0); + b2 = max(b2, 0); + c2 = max(c2, 0); + d2 = max(d2, 0); + e2 = max(e2, 0); + f2 = max(f2, 0); + g2 = max(g2, 0); + h2 = max(h2, 0); + i2 = max(i2, 0); + + min16float4 a3 = tex3.SampleLevel(sam, pos - inputPt, 0); + min16float4 b3 = tex3.SampleLevel(sam, pos + float2(-inputPt.x, 0), 0); + min16float4 c3 = tex3.SampleLevel(sam, pos + float2(-inputPt.x, inputPt.y), 0); + min16float4 d3 = tex3.SampleLevel(sam, pos + float2(0, -inputPt.y), 0); + min16float4 e3 = tex3.SampleLevel(sam, pos, 0); + min16float4 f3 = tex3.SampleLevel(sam, pos + float2(0, inputPt.y), 0); + min16float4 g3 = tex3.SampleLevel(sam, pos + float2(inputPt.x, -inputPt.y), 0); + min16float4 h3 = tex3.SampleLevel(sam, pos + float2(inputPt.x, 0), 0); + min16float4 i3 = tex3.SampleLevel(sam, pos + inputPt, 0); + + min16float4 na3 = max(-a3, 0); + min16float4 nb3 = max(-b3, 0); + min16float4 nc3 = max(-c3, 0); + min16float4 nd3 = max(-d3, 0); + min16float4 ne3 = max(-e3, 0); + min16float4 nf3 = max(-f3, 0); + min16float4 ng3 = max(-g3, 0); + min16float4 nh3 = max(-h3, 0); + min16float4 ni3 = max(-i3, 0); + + a3 = max(a3, 0); + b3 = max(b3, 0); + c3 = max(c3, 0); + d3 = max(d3, 0); + e3 = max(e3, 0); + f3 = max(f3, 0); + g3 = max(g3, 0); + h3 = max(h3, 0); + i3 = max(i3, 0); + + min16float4 conv2d_1_tf = tex4.SampleLevel(sam, pos, 0); + min16float4 nconv2d_1_tf = max(-conv2d_1_tf, 0); + conv2d_1_tf = max(conv2d_1_tf, 0); + + min16float4 conv2d_4_tf = tex8.SampleLevel(sam, pos, 0); + min16float4 nconv2d_4_tf = max(-conv2d_4_tf, 0); + conv2d_4_tf = max(conv2d_4_tf, 0); + + min16float4 conv2d_8_tf = mul(a1, min16float4x4(-0.11553467, -0.14921814, -0.085377395, 0.10231987, 0.08155549, 0.07075523, 0.012124212, 0.013545821, 0.103393115, -0.007523045, 0.060739517, -0.05890024, 0.21902815, 0.020522034, -0.1402768, 0.1280077)); + conv2d_8_tf += mul(b1, min16float4x4(0.051253397, -0.040904667, 0.1898603, -0.11879134, 0.069219105, -0.04280286, -0.022459755, 0.14305754, -0.063906856, 0.21501009, 0.0023572869, 0.09840124, -0.072510734, 0.057598237, 0.06159614, -0.13078417)); + conv2d_8_tf += mul(c1, min16float4x4(0.09612547, -0.11506342, -0.0017697238, 0.082210004, 0.14244868, -0.018724512, 0.12827, -0.011984352, 0.08484893, 0.0534688, 0.06480922, 0.14134778, 0.0876346, -0.010892883, 0.15595037, -0.040623467)); + conv2d_8_tf += mul(d1, min16float4x4(-0.15201004, 0.0093916925, 0.25506935, 0.003084567, -0.06869725, -0.27494308, 0.12937209, -0.12043822, -0.1918611, -0.09398222, 0.045312967, -0.1111442, -0.1376949, 0.0053297062, -0.28389412, -0.1396928)); + conv2d_8_tf += mul(e1, min16float4x4(-0.12742004, -0.23415208, 0.12804613, -0.1406368, 0.09349193, -0.12212758, -0.05245734, -0.39274624, 0.23036338, 0.04170077, -0.12391477, -0.00871988, 0.012228075, 0.31633002, -0.17377669, -0.124939)); + conv2d_8_tf += mul(f1, min16float4x4(-0.01582657, 0.018224325, -0.01147676, -0.09984998, -0.026615107, -0.21468964, 0.21078119, 0.19190042, -0.096901044, -0.041285027, -0.014912263, 0.17798825, 0.06570931, 0.09232608, -0.1068993, 0.089612365)); + conv2d_8_tf += mul(g1, min16float4x4(0.051225413, -0.07643113, 0.058832865, 0.083958775, 0.11160564, -0.14167392, -0.021870648, 0.10238029, 0.047018003, 0.11449065, 0.08001371, -0.06804109, 0.033969186, 0.10051381, -0.0008517809, -0.07459736)); + conv2d_8_tf += mul(h1, min16float4x4(0.09263853, -0.09833199, 0.042132426, -0.13103375, -0.03731804, -0.039324153, 0.10190401, 0.024146391, 0.110644914, -0.12685625, -0.12852249, 0.021824492, 0.0784485, 0.11471671, -0.09116125, 0.010305502)); + conv2d_8_tf += mul(i1, min16float4x4(0.005317984, -0.055282168, 0.09082919, -0.10774655, 0.21394931, 0.0045357225, -0.06699662, 0.2507622, 0.15671767, 0.11952803, -0.06123182, 0.13399701, 0.046645127, 0.0026899239, 0.022635492, 0.07161002)); + conv2d_8_tf += mul(a2, min16float4x4(-0.017425103, 0.12552156, -0.093341894, -0.071356304, 0.15947455, 0.24979044, -0.03843421, 0.14001197, 0.15455416, -0.05550835, -0.011375887, -0.07661705, -0.12418336, 0.056913756, 0.16633298, 0.11513766)); + conv2d_8_tf += mul(b2, min16float4x4(-0.08778774, 0.057353538, -0.092138395, 0.002837398, 0.22633068, 0.120333284, 0.09834124, 0.05738123, 0.059130516, 0.22035405, -0.024255643, 0.02477418, 0.04645929, 0.39426094, 0.276884, -0.01479481)); + conv2d_8_tf += mul(c2, min16float4x4(0.18796739, 0.083501674, 0.07283311, 0.06415875, -0.024382524, 0.04679669, -0.15093789, -0.22831221, 0.058881074, 0.16446854, -0.028955745, 0.1956661, 0.0516941, 0.16135721, 0.11951658, 0.10451706)); + conv2d_8_tf += mul(d2, min16float4x4(0.008279574, 0.23456147, -0.12539841, -0.17107405, 0.12736088, -0.028486755, -0.18606788, -0.15545112, -0.025036227, 0.028735701, 0.17332946, -0.1413287, 0.050435208, -0.07583189, 0.14276801, 0.08007638)); + conv2d_8_tf += mul(e2, min16float4x4(0.23048489, -0.045157567, -0.014840823, 0.041994587, -0.0002087858, -0.01711496, -0.08994919, -0.05393212, -0.048546836, 0.18694918, -0.014523763, -0.14133967, 0.02896907, 0.08478857, 0.020594146, -0.0013243662)); + conv2d_8_tf += mul(f2, min16float4x4(-0.1141037, -0.11394802, 0.11164606, 0.12330282, -0.044497687, -0.06207866, 0.08016056, 0.16055691, -0.062488995, 0.051081542, 0.086364634, 0.10802774, 0.16742289, -0.08850773, 0.26072827, -0.34441397)); + conv2d_8_tf += mul(g2, min16float4x4(0.06775539, -0.19385163, 0.12488108, 0.11025669, 0.028568348, 0.051090416, -0.15175076, -0.17447716, -0.14535129, -0.15599817, -0.10742375, 0.23767987, -0.071634814, -0.19241351, -0.052424364, 0.105806515)); + conv2d_8_tf += mul(h2, min16float4x4(-0.044398658, 0.0027700714, -0.22429284, 0.11238373, -0.081747256, -0.016608216, 0.012278578, 0.036800906, 0.015081323, 0.12504977, -0.05880422, -0.05670147, -0.051358018, 0.03139849, -0.0058919964, -0.029613987)); + conv2d_8_tf += mul(i2, min16float4x4(-0.05326926, -0.06667389, -0.15082167, 0.011100974, -0.17428419, 0.06436674, 0.12850241, 0.07432186, 0.08191501, 0.24600182, -0.085727975, -0.22370532, 0.15681425, -0.112885654, 0.10803866, 0.09235784)); + conv2d_8_tf += mul(a3, min16float4x4(-0.15705872, -0.1011224, 0.11024848, 0.100342564, -0.112648144, -0.18259776, -0.0134320175, -0.19909476, 0.09715426, 0.015931793, -0.13415024, -0.1476672, -0.07625902, 0.11680044, -0.02269237, 0.013758246)); + conv2d_8_tf += mul(b3, min16float4x4(-0.24389952, 0.1949585, -0.08155146, -0.14432955, 0.061777957, 0.0053770593, 0.11755161, -0.053200334, -0.18301581, -0.015372121, -0.10212801, 0.27215135, 0.089837484, 0.011281987, -0.1765269, 0.060139008)); + conv2d_8_tf += mul(c3, min16float4x4(0.1613523, -0.051561244, -0.08003759, -0.15677674, -0.010480271, -0.05442542, 0.03414788, -0.054194316, -0.087549254, 0.22978279, -0.0047125067, 0.16779551, 0.0654713, 0.055772237, -0.009877759, 0.04076752)); + conv2d_8_tf += mul(d3, min16float4x4(-0.018052207, -0.07168355, -0.1447087, 0.2920458, 0.1345294, -0.0847823, 0.0014948811, -0.10205125, -0.044011697, -0.16249846, -0.052916005, -0.0181699, -0.08360677, -0.06418388, -0.036664434, -0.15985154)); + conv2d_8_tf += mul(e3, min16float4x4(-0.0043584667, 0.1973149, 0.07195116, 0.07608803, -0.10798404, 0.11076036, 0.23318382, -0.23839737, -0.29880977, -0.03647466, -0.13977784, -0.27129006, 0.14539374, 0.003516734, -0.17389128, -0.14548092)); + conv2d_8_tf += mul(f3, min16float4x4(-0.039712217, -0.14402422, 0.115726, 0.026172435, 0.088555016, 0.07606563, 0.047167692, -0.048009936, -0.19357018, 0.01590195, -0.08144182, 0.11633417, 0.044445038, -0.038849603, 0.02644488, 0.12953997)); + conv2d_8_tf += mul(g3, min16float4x4(-0.2535649, -0.09789916, -0.059466388, -0.17749946, -0.024909042, 0.07494422, -0.0817595, 0.20722246, 0.049061295, -0.26182574, 0.11551785, -0.11284367, -0.19183765, -0.075118415, 0.023913708, -0.13905819)); + conv2d_8_tf += mul(h3, min16float4x4(-0.009345336, 0.06655174, -0.002273717, -0.06538255, -0.015212964, 0.039716627, -0.08802585, -0.112940565, 0.018324325, 0.24168438, -0.2545027, 0.025853468, -0.11133557, -0.028638441, 0.026320668, -0.09357033)); + conv2d_8_tf += mul(i3, min16float4x4(-0.23745783, -0.032814, 0.2784286, -0.04626241, -0.02654139, -0.018567635, -0.0013748549, -0.064650096, 0.08974625, 0.04735343, -0.027304498, 0.14134395, 0.009515457, -0.0011779714, -0.001755572, 0.008599811)); + conv2d_8_tf += mul(na1, min16float4x4(-0.053202473, -0.17543721, 0.03065013, -0.11342283, 0.13609491, 0.15735649, 0.040357295, -0.062337715, 0.060803644, -0.0032487542, -0.13659185, -0.09013045, -0.058906827, -0.116660595, 0.03664988, 0.059270184)); + conv2d_8_tf += mul(nb1, min16float4x4(0.21752366, -0.06447607, -0.083456226, -0.06617954, -0.013684511, -0.1191609, -0.2506009, -0.08164425, 0.1306491, 0.19933657, 0.13410534, 0.09191758, -0.039843913, -0.06834293, 0.08471115, -0.09353382)); + conv2d_8_tf += mul(nc1, min16float4x4(-0.027393917, -0.08497713, 0.26017472, 0.2136785, -0.1488196, -0.07492567, 0.14468898, 0.16119008, 0.0121641755, 0.22242029, -0.06302512, 0.062499605, 0.06213177, -0.09802615, -0.30932772, 0.011748043)); + conv2d_8_tf += mul(nd1, min16float4x4(0.1187535, 0.04582557, -0.12194581, -0.039476555, 0.20283094, -0.10453671, 0.09578921, -0.22217935, 0.2739068, 0.09089512, -0.3268319, 0.17347647, -0.08915248, -0.13531092, 0.14857613, -0.07792796)); + conv2d_8_tf += mul(ne1, min16float4x4(-0.082583435, 0.16037074, 0.034193352, -0.07133332, -0.0669728, -0.24518156, 0.11620159, -0.10171298, -0.03303509, -0.0028717325, 0.0760564, -0.07741538, 0.046745025, -0.25254723, -0.01662034, 0.055250034)); + conv2d_8_tf += mul(nf1, min16float4x4(0.12526712, -0.0023898773, -0.3012884, -0.047304068, -0.09815741, 0.013686822, -0.050375015, 0.14987841, -0.038195454, 0.040165856, 0.014663741, 0.16414583, -0.15489048, 0.0926139, -0.21309514, -0.1200608)); + conv2d_8_tf += mul(ng1, min16float4x4(-0.09133431, -0.16783749, -0.062135316, 0.018470682, 0.022288319, -0.02211177, 0.13391319, -0.18012549, 0.49915206, 0.13974468, -0.08988157, 0.12178317, 0.0401673, 0.053748768, 0.019889776, 0.03453906)); + conv2d_8_tf += mul(nh1, min16float4x4(0.14379664, 0.08435809, 0.036211815, 0.07440852, -0.06631962, -0.12839338, 0.14946012, -0.21335278, 0.34956563, 0.5433695, -0.2727362, -0.086059555, 0.15091617, -0.1394221, 0.19740397, 0.14155756)); + conv2d_8_tf += mul(ni1, min16float4x4(-0.020419724, 0.07860248, -0.25041556, 0.043661647, -0.018286234, -0.059268583, -0.018467212, 0.04894847, -0.06933085, 0.31178948, -0.11954371, -0.0636989, 0.07150373, -0.04530066, -0.0018285213, 0.019425247)); + conv2d_8_tf += mul(na2, min16float4x4(0.09962638, -0.17088315, -0.06602017, -0.06087763, -0.1418266, -0.13101861, -0.13441323, -0.246784, -0.11813881, -0.28987116, 0.0533919, 0.058272794, -0.005445841, 0.015091582, 0.20249642, -0.105762914)); + conv2d_8_tf += mul(nb2, min16float4x4(-0.21612363, -0.1450863, -0.23284402, 0.006895393, -0.017744822, -0.20156701, 0.012746878, 0.018686332, 0.07711055, -0.10632525, -0.12213612, 0.051344417, -0.0141962785, -0.08607468, -0.05173791, -0.012742015)); + conv2d_8_tf += mul(nc2, min16float4x4(-0.35659614, 0.06504701, 0.0072779786, 0.3384698, -0.14741105, -0.107767306, -0.14098823, 0.22308472, -0.08386747, 0.09358457, 0.052461777, 0.16237038, -0.0059022917, -0.088671595, 0.14027567, -0.04549793)); + conv2d_8_tf += mul(nd2, min16float4x4(-0.23274305, 0.087585405, -0.006931044, -0.23876844, 0.08388762, -0.3022666, -0.16896221, 0.06452799, 0.2715658, -0.10732195, -0.057401773, 0.11985068, -0.06397641, -0.04235397, -0.026778454, 0.21212392)); + conv2d_8_tf += mul(ne2, min16float4x4(0.0082654, 0.28741485, -0.14546123, 0.20393674, -0.02755474, -0.120006405, 0.3581759, 0.12956442, 0.009266114, 0.012998164, 0.032407217, 0.06048391, 0.041528724, -0.13716324, 0.10482829, 0.084386185)); + conv2d_8_tf += mul(nf2, min16float4x4(-0.11990044, 0.092382684, -0.27219963, 0.15899557, -0.001977273, 0.120091155, 0.046375066, -0.21674563, 0.055842437, 0.07407933, 0.123498544, -0.08587901, 0.06925744, -0.07803027, -0.18120557, -0.0013798468)); + conv2d_8_tf += mul(ng2, min16float4x4(-0.025172636, 0.0014970741, -0.12216828, -0.07777998, -0.11570999, -0.2672482, -0.04927161, 0.047932815, 0.017598571, 0.06150582, -0.006943665, 0.06608355, 0.09816235, -0.02132959, 0.022629065, -0.11914383)); + conv2d_8_tf += mul(nh2, min16float4x4(-0.03462315, 0.0662906, 0.043817297, -0.09336832, -0.02393236, 0.12857129, -0.08293834, -0.079446144, 0.07298153, -0.22665861, 0.19360217, -0.027094053, 0.067512356, 0.054872043, 0.07353051, -0.019753326)); + conv2d_8_tf += mul(ni2, min16float4x4(0.052837294, 0.122079946, 0.10026166, -0.16611442, -0.20202795, 0.10773466, 0.016957153, -0.06257964, 0.065463126, -0.0070094382, 0.0057103466, 0.0263681, -0.083057486, 0.011921135, 0.18715331, -0.009138652)); + conv2d_8_tf += mul(na3, min16float4x4(-0.039395697, 0.047360536, 0.08876623, -0.051131938, 0.079491556, -0.062068135, -0.11143306, -0.1600982, 0.1182525, 0.0990501, 0.032290936, 0.16515383, 0.048210137, 0.27581617, 0.2143776, -0.26727012)); + conv2d_8_tf += mul(nb3, min16float4x4(0.009885355, -0.10188308, 0.014354376, -0.07466153, -0.09686006, 0.03712243, -0.07547052, -0.2513815, -0.1224751, 0.28383356, -0.11245158, -0.0022227417, 0.10997654, -0.12797359, -0.026750803, -0.15781246)); + conv2d_8_tf += mul(nc3, min16float4x4(-0.03825075, 0.0119200265, 0.13641061, 0.08023444, -0.05399191, -0.029703232, 0.11449091, 0.104263976, 0.13190906, 0.03559845, 0.00035285854, -0.24578363, -0.030404888, 0.03632663, 0.2665158, 0.287037)); + conv2d_8_tf += mul(nd3, min16float4x4(0.19444078, 0.04411847, 0.10453107, 0.16204067, -0.10203096, -0.1057438, -0.10478279, -0.10320498, 0.0060342676, 0.20314808, -0.080608025, -0.13728383, 0.23798111, 0.03982377, 0.0018392511, -0.17587116)); + conv2d_8_tf += mul(ne3, min16float4x4(0.093861975, -0.037806403, -0.023811158, 0.08989214, 0.16903597, -0.11738837, 0.057141513, 0.03039443, 0.07186046, -0.16815007, 0.041725967, 0.023349155, -0.21743254, -0.054814734, 0.21988024, -0.19913116)); + conv2d_8_tf += mul(nf3, min16float4x4(-0.098907694, 0.12669978, -0.022410035, -0.09411821, -0.037412155, 0.04395231, -0.15797623, -0.14484851, -0.036790654, -0.038002916, 0.16846262, 0.21878582, -0.053109415, -0.03769754, -0.24775061, -0.010048842)); + conv2d_8_tf += mul(ng3, min16float4x4(-0.12894969, 0.0033566963, 0.030691003, 0.033040218, -0.08500356, -0.043196633, 0.06903723, -0.17297482, -0.102706455, 0.13380836, 0.20812829, -0.054975122, -0.058504406, -0.08924625, 0.0967954, -0.12462231)); + conv2d_8_tf += mul(nh3, min16float4x4(-0.020506827, 0.040906876, 0.15277289, -0.11496513, 0.19803853, 0.011656168, 0.0041951393, 0.16394733, -0.052599292, -0.2028797, -0.012671829, 0.12447954, -0.042609632, 0.18015629, -0.047704864, -0.20819715)); + conv2d_8_tf += mul(ni3, min16float4x4(-0.04611932, -0.04080319, 0.1732811, -0.16310379, -0.0759677, -0.012633483, -0.12658887, -0.10228954, 0.11699648, 0.020952728, -0.1922721, 0.079663426, -0.017287953, 0.050658427, -0.061943304, -0.26140955)); + conv2d_8_tf += min16float4(-0.020329567, 0.07771538, 0.06740593, -0.00038238944); + min16float4 nconv2d_8_tf = max(-conv2d_8_tf, 0); + conv2d_8_tf = max(conv2d_8_tf, 0); + + min16float4 conv2d_7_tf = mul(a1, min16float4x4(0.09670644, -0.04566203, -0.10664036, -0.11654977, 0.10353238, -0.026668113, -0.06772906, -0.058057647, -0.04721855, -0.019877478, -0.16225834, -0.18661498, -0.1137224, 0.01452415, 0.09002202, -0.07991262)); + conv2d_7_tf += mul(b1, min16float4x4(0.12247382, 0.10237518, 0.04044118, -0.04867563, 0.106729075, 0.19503647, -0.01294371, 0.12316606, 0.08497549, -0.01606401, 0.031219587, 0.1474753, -0.14370713, -0.24351072, -0.17444824, 0.12567697)); + conv2d_7_tf += mul(c1, min16float4x4(-0.05373204, -0.11406721, -0.04307548, -0.0011615923, 0.09172633, -0.034839034, 0.12179155, -0.032049768, -0.036665026, 0.02375685, 0.01977139, -0.115673535, -0.065757565, 0.12521514, 0.03739438, -0.012122441)); + conv2d_7_tf += mul(d1, min16float4x4(0.0037090098, -0.09165263, -0.22216173, -0.09436383, -0.018459387, 0.15764487, 0.106846556, -0.15703869, -0.1056327, 0.100443825, 0.15728104, -0.07118126, -0.071113996, 0.07175751, 0.1066827, 0.015554562)); + conv2d_7_tf += mul(e1, min16float4x4(-0.08138076, -0.005017353, 0.0024575114, -0.0280491, -0.1689416, -0.24320668, -0.07413122, -0.026848925, -0.17659375, 0.095876895, 0.1875987, -0.0052445224, 0.0041429237, -0.13173698, -0.21236134, 0.14331093)); + conv2d_7_tf += mul(f1, min16float4x4(-0.023982342, -0.028810123, -0.1591679, -0.02026218, -0.16651444, 0.050990265, -0.1640659, -0.109770395, -0.06517823, 0.06647583, 0.09519326, -0.14313333, 0.061294477, 0.066543005, 0.12260083, -0.1436599)); + conv2d_7_tf += mul(g1, min16float4x4(0.07363797, -0.07069135, -0.01332299, -0.1166729, -0.17299873, 0.10319499, 0.17256232, -0.15059224, 0.12490272, 0.03816397, -0.07081764, -0.0005555199, 0.009463498, -0.080442056, 0.05372971, -0.01984048)); + conv2d_7_tf += mul(h1, min16float4x4(0.07747191, 0.038767997, -0.042611655, -0.025650622, -0.20976418, 0.11478602, 0.05521954, 0.03552756, 0.012396808, 0.10836491, 0.01147957, 0.17223893, -0.09354668, -0.061399113, 0.03731426, -0.095968515)); + conv2d_7_tf += mul(i1, min16float4x4(0.0029518164, -0.07522048, -0.30731654, 0.14996396, -0.09563301, -0.1635997, 0.16482228, -0.33490175, 0.034455117, -0.124511935, 0.003454064, -0.011791387, -0.08124914, -0.020552732, 0.14202276, -0.053646516)); + conv2d_7_tf += mul(a2, min16float4x4(0.029005067, -0.019747132, 0.041804817, 0.10725602, 0.09535564, 0.17670439, 0.18999198, 0.06499296, 0.09519827, -0.09794806, 0.10868586, -0.038871128, -0.092565574, -0.018548176, 0.028203959, -0.050549477)); + conv2d_7_tf += mul(b2, min16float4x4(0.10629401, -0.01204608, -0.0766338, 0.112705976, -0.103695825, 0.10200874, 0.008448839, 0.017780313, -0.024469525, 0.1860687, 0.14225325, 0.15677285, -0.14190355, -0.22543404, 0.024092557, -0.2790124)); + conv2d_7_tf += mul(c2, min16float4x4(0.08649951, 0.040031336, -0.010628009, -0.04257323, 0.052871518, 0.06654039, -0.07866483, 0.09136843, -0.10960993, -0.029104995, 0.18752916, 0.022354944, -0.15167497, -0.04915799, -0.03720373, 0.18194139)); + conv2d_7_tf += mul(d2, min16float4x4(-0.029030664, 0.063362755, 0.010331715, 0.034228537, -0.010749333, 0.026652085, -0.06266523, -0.047827587, 0.19567958, -0.07156196, 0.080418445, 0.040099807, 0.06901692, -0.10262759, 0.10190994, 0.1662688)); + conv2d_7_tf += mul(e2, min16float4x4(-0.04938947, 0.20808902, -0.012551209, 0.13833791, -0.08467056, -0.06768094, -0.0035055066, 0.2141383, 0.011813273, -0.094283104, -0.11627318, 0.0035407832, -0.16360888, -0.04307167, 0.18481791, 0.07308102)); + conv2d_7_tf += mul(f2, min16float4x4(0.058353335, 0.09541393, 0.013101275, -0.081891365, 0.08742119, -0.005137093, 0.025961146, -0.037318625, -0.14933549, 0.06090928, 0.12738119, -0.10817076, -0.13165309, 0.16108744, -0.13503371, 0.15482368)); + conv2d_7_tf += mul(g2, min16float4x4(-0.034848627, -0.0430948, -0.048124265, -0.04486795, -0.035008915, 0.08321689, -0.04977505, 0.048597503, 0.020555262, -0.07508485, 0.20037362, 0.06753769, 0.058704067, -0.009009662, -0.05421176, 0.20524938)); + conv2d_7_tf += mul(h2, min16float4x4(-0.12115005, 0.045643892, 0.112293474, 0.022908293, 0.073470674, -0.067966096, -0.017103313, -0.13648018, -0.07021163, 0.031020392, -0.048876107, 0.10397969, -0.005251243, -0.2611716, -0.07903786, 0.3444416)); + conv2d_7_tf += mul(i2, min16float4x4(0.10680049, -0.09858707, -0.0010306702, 0.10842332, -0.09013634, 0.02091661, 0.22192872, -0.15876925, 0.035971455, -0.04786045, 0.009500665, 0.09247623, 0.013221849, 0.1912487, -0.12753724, -0.061068386)); + conv2d_7_tf += mul(a3, min16float4x4(-0.03980972, -0.1474463, 0.22852057, -0.030534718, 0.103116564, -0.024893943, 0.023735823, -0.19768827, -0.088497065, -0.20338957, -0.022078201, -0.058560856, 0.16291575, 0.014483492, -0.093514696, 0.14760342)); + conv2d_7_tf += mul(b3, min16float4x4(-0.09319041, 0.08757541, 0.024344994, -0.004351115, 0.0023287807, 0.036806494, -0.02552934, -0.06227957, -0.1354203, 0.0283256, 0.2185213, -0.087060206, -0.022696337, -0.16076073, -0.20330715, 0.036380492)); + conv2d_7_tf += mul(c3, min16float4x4(-0.041115735, -0.023528732, -0.10124798, 0.21328308, -0.009342506, 0.07328608, 0.009285847, -0.23402044, 0.13117228, 0.1009154, 0.18027642, 0.074597865, 0.09881346, -0.00081656995, -0.002189424, -0.105243)); + conv2d_7_tf += mul(d3, min16float4x4(0.11213601, -0.23114498, 0.10217712, -0.083360896, 0.07913656, -0.039601568, 0.11367716, -0.034739245, -0.14472133, -0.035573903, -0.35375246, 0.040547356, -0.1504422, -0.15183373, -0.08146184, -0.015926573)); + conv2d_7_tf += mul(e3, min16float4x4(0.007678496, 0.045396518, 0.067442104, 0.357935, 0.1795549, -0.028398065, 0.26147032, -0.22306849, -0.028738718, -0.10074325, -0.08521542, -0.020190565, -0.175108, -0.26179528, -0.1149573, 0.05406529)); + conv2d_7_tf += mul(f3, min16float4x4(0.030697253, 0.06005289, 0.024412693, -0.013535843, 0.030500244, 0.14023077, -0.047582973, 0.07610684, 0.0571624, 0.19386198, 0.021660715, 0.03154867, -0.03788935, -0.08817162, 0.0053847465, -0.015165054)); + conv2d_7_tf += mul(g3, min16float4x4(-0.26646808, -0.2275448, -0.0619738, 0.104571655, 0.024079306, 0.033514917, 0.016844772, -0.14415953, -0.01694689, -0.0072623887, -0.12263149, 0.030444223, -0.03220662, 0.022894913, 0.03112325, -0.036533017)); + conv2d_7_tf += mul(h3, min16float4x4(-0.15611476, -0.19298914, -0.17546865, -0.080604054, 0.07597506, 0.097353615, 0.029924694, -0.078176685, -0.12268953, -0.05687716, -0.05294087, -0.18172315, -0.0773961, 0.084935166, -0.009803619, 0.040560953)); + conv2d_7_tf += mul(i3, min16float4x4(-0.10773278, -0.0012994999, 0.004722267, -0.057820093, -0.10506255, 0.029771779, 0.015667265, 0.14186347, -0.108355746, -0.11185942, 0.022062123, -0.123649485, -0.0666645, -0.0107138315, -0.0130763, -0.046252076)); + conv2d_7_tf += mul(na1, min16float4x4(-0.031815648, -0.0084208995, -0.072824255, -0.1508182, -0.064399414, 0.021369422, -0.18965991, 0.03649226, 0.15370539, -0.117377125, 0.15578026, 0.15059558, 0.1423233, 0.013444947, -0.16911474, -0.21899599)); + conv2d_7_tf += mul(nb1, min16float4x4(-0.050074972, 0.06591971, -0.20185336, -0.19894198, -0.045794237, -0.09582899, 0.019117232, 0.054774716, 0.00469303, 0.08466791, -0.10310348, 0.03430011, -0.05189703, 0.08612288, -0.09612641, 0.15337339)); + conv2d_7_tf += mul(nc1, min16float4x4(-0.058103696, -0.13447452, -0.06501768, -0.08269111, -0.043869898, 0.0398948, 0.033771295, -0.021524182, 0.0027115596, -0.030671224, 0.045388903, 0.04590158, -0.26087472, -0.16301683, 0.03324832, 0.024285218)); + conv2d_7_tf += mul(nd1, min16float4x4(-0.051421262, 0.15028518, 0.06384462, -0.08590671, 0.101886876, -0.012882116, -0.051741008, 0.11888618, -0.15590154, -0.38625813, 0.042900138, 0.22492291, -0.09111901, -0.005388837, 0.051056426, 0.043860577)); + conv2d_7_tf += mul(ne1, min16float4x4(-0.079883516, 0.05735032, 0.10719803, 0.16519663, -0.11724404, 0.25990528, 0.012375103, -0.010302452, 0.49185735, 0.1696493, 0.060474537, 0.3722603, 0.014323083, -0.16412182, -0.059749532, -0.24289557)); + conv2d_7_tf += mul(nf1, min16float4x4(-0.034733526, -0.084441185, -0.04596736, -0.0042962483, -0.0392975, -0.11149175, 0.14051792, 0.0702665, 0.117540844, -0.102869704, 0.27858627, 0.069043316, 0.04871729, -0.24745311, -0.058776632, -0.0017110928)); + conv2d_7_tf += mul(ng1, min16float4x4(-0.06277427, 0.16004023, -0.11507597, 0.15097888, 0.027060283, 0.1953599, -0.0031669976, -0.0005737168, -0.19876455, -0.23691651, 0.17741823, -0.12453466, -0.040428206, -0.0018632353, 0.023173677, -0.076046385)); + conv2d_7_tf += mul(nh1, min16float4x4(0.13513252, 0.0295901, -0.006554118, 0.06786791, 0.15473233, 0.012762339, 0.1927368, -0.06255987, -0.30587965, -0.44131213, -0.086936355, 0.011615333, 0.097696826, 0.02502633, 0.08837973, -0.07914361)); + conv2d_7_tf += mul(ni1, min16float4x4(-0.013541286, -0.034861088, 0.052821327, 0.037984103, 0.04338181, -0.0133451065, 0.041617934, -0.034278907, -0.053211715, -0.16200064, 0.11068738, -0.0867221, 0.04498939, 0.045188803, -0.05908562, 0.081477076)); + conv2d_7_tf += mul(na2, min16float4x4(-0.15266198, 0.22576767, 0.030019565, -0.045541495, 0.04881405, 0.0142783765, -0.1529103, 0.18320109, -0.00480197, 0.094124764, -0.010995377, 0.01641767, -0.010706163, 0.100903675, 0.19038767, -0.18477328)); + conv2d_7_tf += mul(nb2, min16float4x4(0.008087569, 0.13434748, -0.32156894, 0.07736676, 0.10494717, -0.11782738, -0.0029439328, -0.09557844, 0.015514035, -0.089648925, -0.17554814, -0.14883392, -0.04063905, 0.050346915, -0.08932905, -0.010719376)); + conv2d_7_tf += mul(nc2, min16float4x4(-0.11777635, -0.33014166, 0.34624732, 0.11740032, 0.1543961, -0.019076902, -0.12216481, -0.017081184, -0.00078788324, 0.031078909, -0.028584918, -0.026835786, 0.091864, 0.05272115, -0.12571204, 0.008416047)); + conv2d_7_tf += mul(nd2, min16float4x4(-0.043549653, 0.1039711, -0.20336658, -0.010299696, -0.27827185, 0.019381372, -0.1632188, 0.077465065, 0.20229691, -0.069236994, 0.014810417, 0.22877559, 0.02143673, 0.17381601, 0.09082899, -0.053508762)); + conv2d_7_tf += mul(ne2, min16float4x4(0.2391153, -0.19723871, -0.25610062, 0.07108974, -0.03182384, 0.2192639, -0.09241812, 0.048452295, -0.021405702, -0.2554734, -0.1965786, 0.20361422, -0.14465299, 0.058985952, -0.025833346, -0.10550291)); + conv2d_7_tf += mul(nf2, min16float4x4(-0.39593056, -0.4537898, 0.023792682, 0.37393433, 0.041772638, -0.020854915, 0.050651625, 0.0766088, 0.23962118, -0.06411897, -0.106468715, 0.17854762, 0.03402648, 0.0236968, -0.033498786, -0.12094796)); + conv2d_7_tf += mul(ng2, min16float4x4(-0.2517486, -0.011749091, -0.08157814, 0.1392019, 0.042420883, -0.23219018, 0.05053571, 0.13250825, -0.050171047, 0.15462638, -0.043420136, -0.014093825, 0.16176236, -0.14638837, -0.0071619265, -0.055462677)); + conv2d_7_tf += mul(nh2, min16float4x4(-0.3264325, -0.30403548, -0.15088049, -0.010203428, -0.018360123, -0.060466267, -0.090672255, -0.13885537, -0.038393795, 0.20886149, -0.10593147, 0.017991208, 0.08373391, 0.20925963, 0.028997745, 0.06881825)); + conv2d_7_tf += mul(ni2, min16float4x4(0.19107129, -0.16896184, -0.12929466, 0.07562441, 0.064231046, 0.0864716, -0.03966105, 0.09153016, -0.0628452, -0.015886426, -0.07048391, -0.24076262, 0.011216516, 0.07708032, -0.03814493, 0.13395755)); + conv2d_7_tf += mul(na3, min16float4x4(-0.05879415, -0.019550052, -0.023919582, -0.11289196, -0.0064408537, 0.07402445, 0.058795378, 0.15885338, -0.043667927, 0.10769252, 0.030309072, 0.048533317, -0.2524471, 0.059829284, 0.0797783, -0.019442867)); + conv2d_7_tf += mul(nb3, min16float4x4(-0.0038486274, -0.04580634, 0.07400007, -0.031162377, 0.10273923, 0.008071164, 0.11991736, 0.026728682, 0.026876984, -0.07799812, 0.1297364, 0.14695424, -0.06859438, -0.10330936, -0.07446633, 0.02616857)); + conv2d_7_tf += mul(nc3, min16float4x4(-0.16036308, 0.04957999, 0.01030331, -0.1962486, 0.103015296, -0.007340536, -0.049429756, 0.07165493, 0.008103339, 0.083655335, 0.098038, -0.1358248, -0.25885662, 0.029940864, -0.008321852, 0.2294651)); + conv2d_7_tf += mul(nd3, min16float4x4(-0.06087098, 0.00019651231, 0.03534409, 0.03318348, -0.0879954, 0.034764756, -0.30367124, -0.09713905, -0.026543869, -0.089636214, 0.12096616, -0.034594636, 0.054902434, -0.09290082, -0.07779638, -0.0821119)); + conv2d_7_tf += mul(ne3, min16float4x4(0.13779263, 0.18896884, -0.076830864, -0.09442952, -0.23735744, -0.014474691, 0.009051341, 0.10342686, 0.041046456, -0.10701024, -0.18442988, 0.02789949, -0.00074035715, -0.025513707, -0.040514592, 0.036068246)); + conv2d_7_tf += mul(nf3, min16float4x4(-0.048401676, 0.20745294, 0.0070508514, -0.0705337, -0.022934115, -0.043547787, 0.04628692, -0.07658743, -0.10154497, -0.13417569, -0.0013773212, 0.14263885, -0.07437275, -0.13121726, 0.12632057, 0.034687687)); + conv2d_7_tf += mul(ng3, min16float4x4(-0.027830327, -0.030560987, 0.12718935, -0.102934904, -0.02562363, 0.008175067, -0.0028858446, -0.015783066, 0.15272577, 0.10772941, 0.043485314, 0.014232708, 0.08577555, -0.16121073, 0.026591625, -0.055126593)); + conv2d_7_tf += mul(nh3, min16float4x4(-0.06485661, -0.11781964, -0.1421969, -0.16376711, 0.18121801, 0.123108625, -0.15428194, -0.06915854, 0.05089843, 0.08377868, 0.09607435, -0.02494757, -0.076740764, -0.19782536, -0.3470603, 0.037040427)); + conv2d_7_tf += mul(ni3, min16float4x4(0.10614744, 0.09086957, -0.02948694, 0.017862784, 0.027194018, 0.069870904, -0.021802098, 0.21401364, 0.11846571, -0.056183722, -0.071595654, 0.029162262, -0.124404505, -0.072095454, 0.040073395, -0.02816261)); + conv2d_7_tf += min16float4(-0.034254678, 0.047492404, -0.00038721046, -0.00072104816); + tex9[gxy] = conv2d_7_tf; + min16float4 nconv2d_7_tf = max(-conv2d_7_tf, 0); + conv2d_7_tf = max(conv2d_7_tf, 0); + + min16float4 target = mul(e1, min16float4x4(-0.20878315, 0.073090814, 0.34913197, 0.04554434, -0.3036766, 0.04255219, 0.060676616, 0.24025755, -0.019680336, -0.15252031, -0.03416314, -0.072506554, 0.013241457, -0.10496547, 0.050562985, -0.033250205)); + target += mul(e2, min16float4x4(-0.18049034, 0.09664636, 0.41482204, 0.23575203, -0.05704124, -0.044852983, 0.1783455, -0.017561441, -0.06852369, 0.014129533, -0.21115111, -0.22699773, 0.38242704, 0.01165174, 0.04190493, -0.2141891)); + target += mul(e3, min16float4x4(-0.011946614, -0.16289592, 0.041371312, 0.40975794, 0.0041022287, -0.23657559, 0.10817027, -0.26924378, -0.12006245, 0.26678962, 0.072988346, -0.2085322, 0.0048250603, 0.12894252, 0.07966851, 0.24471562)); + target += mul(ne1, min16float4x4(0.18590502, 0.0845459, -0.12875262, 0.26096, 0.029233042, 0.36381075, 0.117661506, 0.006412487, 0.20946807, 0.07426911, 0.029169528, 0.0654646, 0.16450708, 0.12593012, -0.109644994, 0.14572893)); + target += mul(ne2, min16float4x4(0.1973355, -0.2275125, -0.28223652, 0.31719315, 0.3813502, 0.2693579, -0.037815563, -0.16148391, 0.12829015, -0.0030689894, 0.022164742, 0.035949815, -0.3378249, -0.13235879, 0.15883659, -0.17731927)); + target += mul(ne3, min16float4x4(-0.2885664, 0.14904943, -0.19845994, 0.23251331, -0.30293494, 0.02003626, 0.20378608, 0.27291408, -0.16427508, -0.1587996, -0.22501752, -0.04937006, -0.115756296, 0.09290222, -0.26140857, -0.014537909)); + target += mul(conv2d_8_tf, min16float4x4(-0.1513065, -0.31879196, -0.2727547, -0.4583672, 0.3103975, -0.09158548, 0.009788355, -0.09834531, 0.011489709, 0.042706747, 0.37254226, 0.15954055, 0.2172001, 0.09373807, 0.29088458, -0.35286763)); + target += mul(nconv2d_8_tf, min16float4x4(0.23374696, 0.33407655, 0.23616461, -0.09521148, -0.14927168, 0.11939751, 0.42869845, -0.16612507, -0.2706815, 0.16172597, -0.5814591, -0.11577833, 0.065650895, -0.3334003, -0.41168052, 0.32357255)); + target += mul(conv2d_1_tf, min16float4x4(0.3248823, -0.27207342, -0.048840526, -0.217887, -0.018053366, -0.24292938, 0.1603505, 0.06505262, -0.010766065, 0.07076721, 0.22251016, -0.041497335, -0.09878612, 0.2061045, 0.080330074, -0.029014835)); + target += mul(nconv2d_1_tf, min16float4x4(-0.26376098, -0.04971863, -0.03045489, 0.009807002, 0.11108562, 0.0693266, 0.15279642, -0.1372833, 0.18326105, -0.059612468, -0.005589879, 0.021735538, -0.027800532, -0.14984077, -0.116767704, -0.06531209)); + target += mul(conv2d_4_tf, min16float4x4(0.19206688, 0.21824414, 0.03791829, 0.22117318, 0.01257811, -0.044042267, 0.25616458, 0.082941554, -0.1181948, -0.17940602, -0.20808466, -0.06987383, 0.0019713745, -0.1609917, 0.153718, -0.32214788)); + target += mul(nconv2d_4_tf, min16float4x4(-0.19472712, -0.007020553, -0.36049378, -0.24589752, -0.011828978, 0.38882232, -0.3257698, 0.08382738, -0.09556564, -0.20949766, -0.32732338, 0.08303877, -0.107999764, 0.2836336, -0.0661124, 0.24043255)); + target += mul(conv2d_7_tf, min16float4x4(-0.1972939, 0.12734106, -0.09953153, -0.45152718, -0.15855458, 0.08746372, 0.11452114, 0.030538268, 0.11946308, 0.17044471, -0.24375156, -0.10093911, 0.19120134, -0.14312318, -0.14860255, -0.1223525)); + target += mul(nconv2d_7_tf, min16float4x4(0.14979935, -0.3136038, -0.25878516, 0.12995318, -0.075706124, -0.104598634, 0.1455947, -0.6167443, 0.06843719, -0.16347055, 0.04413483, 0.08870554, -0.29839858, 0.07214889, 0.049274225, -0.15555117)); + target += min16float4(-0.004266169, -0.020547107, -0.0031655694, 0.0643683); + tex5[gxy] = target; + + target = mul(e1, min16float4x4(0.06760422, 0.16268754, -0.14517367, -0.023386402, -0.23272006, 0.48739922, 0.06399116, -0.032946702, -0.17306012, 0.334446, 0.17779559, -0.2660973, -0.3468709, 0.51220256, -0.010311926, -0.040047005)); + target += mul(e2, min16float4x4(-0.0538168, -0.048309397, 0.064760834, 0.09675621, 0.20269404, -0.2615111, -0.27282992, -0.12584937, 0.10904846, -0.15973651, -0.076846495, -0.09462694, 0.12722874, 0.21629119, -0.35314724, -0.086036965)); + target += mul(e3, min16float4x4(-0.049174394, -0.05765949, 0.21250841, 0.17151582, 0.15764381, 0.040890984, 0.05118504, -0.14658877, 0.05469671, 0.13701054, 0.20377803, -0.39008877, -0.0016028697, 0.13317284, -0.11653242, 0.12591232)); + target += mul(ne1, min16float4x4(0.21234287, -0.3048995, -0.12653783, -0.109162085, -0.050768167, -0.17156011, 0.05592974, 0.27197394, -0.19419932, -0.046344608, -0.05445905, -0.13253787, 0.05778321, 0.16979085, -0.04466505, -0.06867837)); + target += mul(ne2, min16float4x4(-0.18974759, 0.22814974, -0.007522141, -0.10096491, -0.26759568, 0.32048568, 0.2660603, 0.112091035, 0.41875598, -0.1051111, 0.06525224, 0.27191457, 0.017352497, -0.31743342, 0.29108858, 0.26573792)); + target += mul(ne3, min16float4x4(0.031855166, -0.122523904, -0.28207538, 0.12833035, -0.025733596, 0.008542537, -0.1891138, 0.16361842, 0.058317598, -0.007289248, 0.03349703, -0.038986582, 0.18147361, -0.3912238, 0.024964351, 0.14339498)); + target += mul(conv2d_8_tf, min16float4x4(0.37369347, -0.012460246, -0.037854888, 0.067713045, -0.06288331, 0.26436228, -0.058873445, 0.04463945, -0.04286497, -0.04824939, 0.17835206, -0.036378298, 0.33058742, -0.14685723, 0.1025378, 0.051385757)); + target += mul(nconv2d_8_tf, min16float4x4(-0.131484, -0.040644694, -0.14443769, 0.1950223, 0.09507341, 0.48859578, -0.26267928, 0.24538381, -0.063596986, -0.18749404, -0.031884808, -0.07132067, -0.04606875, 0.03708701, -0.26145473, 0.2371378)); + target += mul(conv2d_1_tf, min16float4x4(0.094301306, -0.08795415, -0.035933804, 0.21765485, -0.29858732, 0.11440603, 0.14095801, 0.18262209, -0.08135902, -0.45404965, 0.20399955, -0.06393024, 0.023793167, 0.16001467, -0.11817577, -0.16322103)); + target += mul(nconv2d_1_tf, min16float4x4(0.07168084, 0.0879652, -0.083207026, -0.045181375, 0.07845201, -0.15828066, 0.05710845, 0.05699917, -0.061211787, 0.039662443, 0.036026876, 0.14224064, -0.23701179, 0.01259322, -0.091701694, 0.42408752)); + target += mul(conv2d_4_tf, min16float4x4(0.017442457, -0.1311232, -0.22520894, -0.049517628, -0.20945188, -0.035541452, -0.13055338, -0.04001523, -0.09402065, -0.19641486, -0.10066238, 0.115912616, -0.10684873, 0.02787531, 0.28450257, 0.02690632)); + target += mul(nconv2d_4_tf, min16float4x4(-0.2659566, 0.43625832, -0.0695883, -0.2624756, -0.2827253, -0.22893822, 0.26025924, 0.24121284, 0.2272709, 0.2178127, -0.15199527, 0.32607552, 0.005909836, 0.056527212, 0.19446251, -0.010751997)); + target += mul(conv2d_7_tf, min16float4x4(0.1273358, -0.28996274, -0.19322409, 0.018734567, 0.48555133, -0.17389202, 0.13595583, 0.46163267, -0.08973322, -0.30239192, 0.49897516, 0.021815563, -0.2589829, 0.0039008032, 0.056682784, 0.048075546)); + target += mul(nconv2d_7_tf, min16float4x4(0.415353, 0.112207405, 0.20997275, 0.033321556, -0.1327579, 0.12338585, 0.61820966, -0.3411527, 0.018252999, 0.05708125, -0.24571265, 0.11019793, 0.24145919, 0.20340635, -0.0693869, 0.16271423)); + target += min16float4(-0.07107039, 0.0061239223, 0.0013546069, 0.02994767); + tex6[gxy] = target; + + target = mul(e1, min16float4x4(0.0014731521, -0.15165007, 0.04889816, -0.23228844, 0.11362322, 0.07071926, -0.23770805, -0.04347728, -0.16787082, -0.008313435, -0.42370048, 0.08681679, 0.10611205, -0.012660734, 0.10022364, 0.027629996)); + target += mul(e2, min16float4x4(-0.35393402, 0.018436229, 0.10629333, 0.029471794, -0.21129252, -0.301571, 0.0045201713, -0.15636055, 0.298371, 0.11426107, 0.018450111, -0.13657977, 0.22216578, 0.009629214, 0.5373198, 0.30699998)); + target += mul(e3, min16float4x4(-0.1504586, -0.16447587, -0.2739809, -0.14074785, 0.39510623, -0.08384201, 0.14561974, -0.43195033, -0.055713434, 0.12800978, 0.2829296, -0.23494978, 0.14326042, -0.09509476, -0.3169162, 0.124649614)); + target += mul(ne1, min16float4x4(-0.23705968, 0.15959233, 0.11467344, 0.15141489, -0.096755706, 0.023953263, 0.13856179, 0.024189185, 0.13272291, 0.46271062, 0.55494446, -0.14286532, 0.1501738, 0.28827608, 0.058801714, 0.029045105)); + target += mul(ne2, min16float4x4(-0.002308931, 0.07281086, -0.5197955, 0.079986535, 0.38919175, 0.3164044, 0.35857818, 0.09364757, 0.17373051, -0.1447216, -0.05244769, 0.15533692, 0.046295535, -0.19459103, -0.33215967, -0.15369573)); + target += mul(ne3, min16float4x4(0.11478203, -0.29375935, -0.19501545, -0.081721894, -0.103483915, 0.041965716, 0.056954723, 0.19596405, -0.13819647, 0.010641367, -0.11124998, -0.08675409, 0.036859434, 0.23720297, 0.14129876, -0.044769786)); + target += mul(conv2d_8_tf, min16float4x4(0.08397742, -0.12651941, 0.17676216, -0.084249385, 0.36716628, 0.039452277, -0.27606088, -0.36796048, 0.31680533, 0.14186403, 0.4466997, 0.13315229, 0.011085958, -0.17513317, 0.13940759, 0.27495402)); + target += mul(nconv2d_8_tf, min16float4x4(-0.1870658, 0.18817395, 0.010469263, -0.39973256, -0.57167524, -0.38714117, -0.26255277, 0.14361858, 0.018649995, 0.15935089, -0.21745402, -0.0056655053, -0.15408997, -0.03154883, -0.29631105, 0.27472818)); + target += mul(conv2d_1_tf, min16float4x4(-0.07735958, 0.042861674, 0.36729267, -0.2362879, -0.15516327, -0.009109079, 0.063800156, -0.253287, 0.4471074, 0.0944695, -0.26948866, -0.07759066, 0.045151226, -0.13749917, 0.14566323, -0.13593693)); + target += mul(nconv2d_1_tf, min16float4x4(0.28955856, 0.09293573, 0.07423561, 0.1616493, 0.22285056, 0.01639275, 0.026332684, -0.14958683, -0.32087958, -0.3138252, -0.17335242, -0.38171476, -0.25562596, -0.022701526, 0.17425084, -0.042576227)); + target += mul(conv2d_4_tf, min16float4x4(0.24964347, -0.07078707, 0.18416835, -0.054758202, -0.061644293, -0.0964391, 0.14583856, -0.34874785, -0.3402768, 0.14743538, 0.36047265, 0.04471611, 0.015971184, 0.25227246, -0.011749087, -0.18359871)); + target += mul(nconv2d_4_tf, min16float4x4(-0.059328917, -0.07904788, -0.23883855, -0.06956805, -0.040810965, 0.09536262, 0.0018617791, -0.1898438, 0.1794419, 0.11382087, -0.16192305, 0.22020166, 0.03995484, -0.19086155, -0.2970539, 0.14597812)); + target += mul(conv2d_7_tf, min16float4x4(-0.034995254, 0.060782332, -0.0519364, 0.41303346, -0.06989344, 0.21384521, 0.31474474, 0.12592849, 0.17633408, -0.2764535, 0.36884397, -0.015302021, 0.02951528, 0.094452016, 0.13392285, 0.14435606)); + target += mul(nconv2d_7_tf, min16float4x4(0.13522784, 0.101011604, 0.04657966, -0.043399148, 0.008192044, 0.0027336285, 0.011269824, 0.09976881, -0.026473437, -0.124423906, -0.19602631, -0.09871594, -0.10603456, 0.057509303, -0.09007557, -0.14438893)); + target += min16float4(-0.07283617, -0.09245546, -0.006695486, -0.013076421); + tex7[gxy] = target; +} + + +//!PASS 5 +//!DESC Conv-4x3x3x24, Conv-4x1x1x64 +//!IN tex5, tex6, tex7, tex4, tex8, tex9 +//!OUT tex10, tex11, tex1, tex2, tex3 +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 + +void Pass5(uint2 blockStart, uint3 threadId) { + uint2 gxy = Rmp8x8(threadId.x) + blockStart; + uint2 inputSize = GetInputSize(); + if (gxy.x >= inputSize.x || gxy.y >= inputSize.y) { + return; + } + + float2 inputPt = GetInputPt(); + float2 pos = (gxy + 0.5f) * inputPt; + + // [ a, d, g ] + // [ b, e, h ] + // [ c, f, i ] + min16float4 a1 = tex5.SampleLevel(sam, pos - inputPt, 0); + min16float4 b1 = tex5.SampleLevel(sam, pos + float2(-inputPt.x, 0), 0); + min16float4 c1 = tex5.SampleLevel(sam, pos + float2(-inputPt.x, inputPt.y), 0); + min16float4 d1 = tex5.SampleLevel(sam, pos + float2(0, -inputPt.y), 0); + min16float4 e1 = tex5.SampleLevel(sam, pos, 0); + min16float4 f1 = tex5.SampleLevel(sam, pos + float2(0, inputPt.y), 0); + min16float4 g1 = tex5.SampleLevel(sam, pos + float2(inputPt.x, -inputPt.y), 0); + min16float4 h1 = tex5.SampleLevel(sam, pos + float2(inputPt.x, 0), 0); + min16float4 i1 = tex5.SampleLevel(sam, pos + inputPt, 0); + + min16float4 na1 = max(-a1, 0); + min16float4 nb1 = max(-b1, 0); + min16float4 nc1 = max(-c1, 0); + min16float4 nd1 = max(-d1, 0); + min16float4 ne1 = max(-e1, 0); + min16float4 nf1 = max(-f1, 0); + min16float4 ng1 = max(-g1, 0); + min16float4 nh1 = max(-h1, 0); + min16float4 ni1 = max(-i1, 0); + + a1 = max(a1, 0); + b1 = max(b1, 0); + c1 = max(c1, 0); + d1 = max(d1, 0); + e1 = max(e1, 0); + f1 = max(f1, 0); + g1 = max(g1, 0); + h1 = max(h1, 0); + i1 = max(i1, 0); + + min16float4 a2 = tex6.SampleLevel(sam, pos - inputPt, 0); + min16float4 b2 = tex6.SampleLevel(sam, pos + float2(-inputPt.x, 0), 0); + min16float4 c2 = tex6.SampleLevel(sam, pos + float2(-inputPt.x, inputPt.y), 0); + min16float4 d2 = tex6.SampleLevel(sam, pos + float2(0, -inputPt.y), 0); + min16float4 e2 = tex6.SampleLevel(sam, pos, 0); + min16float4 f2 = tex6.SampleLevel(sam, pos + float2(0, inputPt.y), 0); + min16float4 g2 = tex6.SampleLevel(sam, pos + float2(inputPt.x, -inputPt.y), 0); + min16float4 h2 = tex6.SampleLevel(sam, pos + float2(inputPt.x, 0), 0); + min16float4 i2 = tex6.SampleLevel(sam, pos + inputPt, 0); + + min16float4 na2 = max(-a2, 0); + min16float4 nb2 = max(-b2, 0); + min16float4 nc2 = max(-c2, 0); + min16float4 nd2 = max(-d2, 0); + min16float4 ne2 = max(-e2, 0); + min16float4 nf2 = max(-f2, 0); + min16float4 ng2 = max(-g2, 0); + min16float4 nh2 = max(-h2, 0); + min16float4 ni2 = max(-i2, 0); + + a2 = max(a2, 0); + b2 = max(b2, 0); + c2 = max(c2, 0); + d2 = max(d2, 0); + e2 = max(e2, 0); + f2 = max(f2, 0); + g2 = max(g2, 0); + h2 = max(h2, 0); + i2 = max(i2, 0); + + min16float4 a3 = tex7.SampleLevel(sam, pos - inputPt, 0); + min16float4 b3 = tex7.SampleLevel(sam, pos + float2(-inputPt.x, 0), 0); + min16float4 c3 = tex7.SampleLevel(sam, pos + float2(-inputPt.x, inputPt.y), 0); + min16float4 d3 = tex7.SampleLevel(sam, pos + float2(0, -inputPt.y), 0); + min16float4 e3 = tex7.SampleLevel(sam, pos, 0); + min16float4 f3 = tex7.SampleLevel(sam, pos + float2(0, inputPt.y), 0); + min16float4 g3 = tex7.SampleLevel(sam, pos + float2(inputPt.x, -inputPt.y), 0); + min16float4 h3 = tex7.SampleLevel(sam, pos + float2(inputPt.x, 0), 0); + min16float4 i3 = tex7.SampleLevel(sam, pos + inputPt, 0); + + min16float4 na3 = max(-a3, 0); + min16float4 nb3 = max(-b3, 0); + min16float4 nc3 = max(-c3, 0); + min16float4 nd3 = max(-d3, 0); + min16float4 ne3 = max(-e3, 0); + min16float4 nf3 = max(-f3, 0); + min16float4 ng3 = max(-g3, 0); + min16float4 nh3 = max(-h3, 0); + min16float4 ni3 = max(-i3, 0); + + a3 = max(a3, 0); + b3 = max(b3, 0); + c3 = max(c3, 0); + d3 = max(d3, 0); + e3 = max(e3, 0); + f3 = max(f3, 0); + g3 = max(g3, 0); + h3 = max(h3, 0); + i3 = max(i3, 0); + + min16float4 conv2d_1_tf = tex4.SampleLevel(sam, pos, 0); + min16float4 nconv2d_1_tf = max(-conv2d_1_tf, 0); + conv2d_1_tf = max(conv2d_1_tf, 0); + + min16float4 conv2d_4_tf = tex8.SampleLevel(sam, pos, 0); + min16float4 nconv2d_4_tf = max(-conv2d_4_tf, 0); + conv2d_4_tf = max(conv2d_4_tf, 0); + + min16float4 conv2d_7_tf = tex9.SampleLevel(sam, pos, 0); + min16float4 nconv2d_7_tf = max(-conv2d_7_tf, 0); + conv2d_7_tf = max(conv2d_7_tf, 0); + + min16float4 conv2d_11_tf = mul(a1, min16float4x4(-0.47819614, -0.0145807015, -0.14235033, -0.06459091, 0.051679384, -0.24727756, 0.16531977, 0.23668537, -0.044610042, -0.03163047, -0.024059737, 0.21251118, -0.02900184, -0.11218355, 0.085020125, -0.08413842)); + conv2d_11_tf += mul(b1, min16float4x4(-0.083133794, 0.08406656, 0.20940667, 0.21155417, -0.12855776, -0.061865382, 0.2486309, 0.13191856, -0.028019775, 0.11366226, 0.13459402, 0.18391807, -0.09688631, 0.011591497, -0.2466206, -0.02237942)); + conv2d_11_tf += mul(c1, min16float4x4(0.0037495645, 0.019915475, 0.07625364, 0.07119373, 0.18423386, 0.07686032, -0.013689673, -0.11513128, -0.12845139, 0.273121, 0.077030145, 0.13114497, 0.04543684, 0.09308563, 0.19357756, 0.24509594)); + conv2d_11_tf += mul(d1, min16float4x4(0.03458686, -0.42040396, -0.104271114, 0.1918791, -0.25708342, 0.03583752, 0.2589993, -0.050576445, 0.0043004244, 0.19324894, 0.080590524, 0.14723596, 0.041485116, 0.13033897, 0.28028202, -0.058933)); + conv2d_11_tf += mul(e1, min16float4x4(-0.09480703, -0.13742156, -0.30406207, -0.03582789, 0.12367775, 0.064455606, -0.061555192, 0.06453598, 0.0917327, 0.04270991, 0.21958654, 0.13570474, -0.12048236, -0.024039079, 0.11226094, 0.050419748)); + conv2d_11_tf += mul(f1, min16float4x4(0.02062305, -0.10862912, 0.12883052, 0.18951532, -0.03850205, 0.11498875, 0.16137509, 0.009759631, -0.09211893, 0.0708826, 0.15651149, 0.19246778, 0.056577608, -0.0871854, 0.090261444, -0.019027064)); + conv2d_11_tf += mul(g1, min16float4x4(0.2780629, -0.054287303, -0.13351089, 0.021154758, -0.12753387, 0.031183334, 0.29430825, -0.06750467, -0.044209514, -0.042159047, -0.12532234, 0.006239919, -0.1961551, 0.099502094, 0.11470277, 0.10832906)); + conv2d_11_tf += mul(h1, min16float4x4(-0.2063426, -0.24898255, -0.28594568, 0.15958025, 0.03609107, 0.06394462, 0.022269696, -0.058725126, -0.104284525, 0.16744058, -0.14197277, -0.0051877275, -0.14164501, 0.021519974, -0.12835859, -0.12090698)); + conv2d_11_tf += mul(i1, min16float4x4(-0.45966595, 0.015630098, -0.3182287, 0.10282032, 0.14680836, -0.23460387, 0.15356645, 0.017346757, 0.05120857, -0.035891768, -0.092325106, 0.005394217, -0.09328155, -0.012819384, 0.14028293, 0.012717323)); + conv2d_11_tf += mul(a2, min16float4x4(0.06736054, -0.0044496846, -0.061849196, -0.04067691, -0.06897966, 0.12449442, -0.2508966, -0.090206414, -0.0938398, 0.013633642, 0.1409954, -0.08719504, -0.06788997, 0.098299906, 0.06095718, -0.071988545)); + conv2d_11_tf += mul(b2, min16float4x4(-0.036788728, 0.0037640312, 0.0037646547, -0.021026969, 0.09899778, -0.054118365, 0.08308994, 0.10520542, -0.2592658, 0.113168575, -0.15985844, -0.15588784, -0.114530176, 0.0118468655, -0.08904175, -0.106764145)); + conv2d_11_tf += mul(c2, min16float4x4(-0.027948795, 0.004584627, -0.03517112, -0.0007581547, -0.025537577, -0.035759352, 0.0973176, 0.03644148, -0.16327894, -0.12705119, -0.028998915, 0.123633325, -0.19453679, 0.113648765, 0.012692621, 0.057508085)); + conv2d_11_tf += mul(d2, min16float4x4(-0.010877041, -0.03980561, 0.013339347, 0.061969575, 0.2810196, 0.058558464, -0.1776418, 0.16630451, 0.05817873, 0.07262613, -0.03700459, -0.04399585, -0.16587572, 0.08260915, -0.009857085, 0.04391152)); + conv2d_11_tf += mul(e2, min16float4x4(0.13224548, -0.074267186, 0.03054752, -0.07024831, 0.074185595, -0.02313642, 0.065747924, -0.004960654, 0.14500527, 0.04731656, -0.117002204, -0.08217113, -0.07336124, -0.084052, 0.12326484, 0.09011222)); + conv2d_11_tf += mul(f2, min16float4x4(-0.16047195, 0.076803066, -0.2786948, 0.1176941, -0.0131406775, 0.009936233, 0.1374073, -0.09565009, 0.10070214, 0.11528786, -0.0730813, -0.13431457, -0.21621323, -0.013119195, -0.18385343, -0.058667593)); + conv2d_11_tf += mul(g2, min16float4x4(0.0040132185, 0.134705, -0.011815555, -0.094924495, -0.05727005, 0.0950522, 0.04084158, 0.016365912, -0.02917897, -0.03862751, 0.012003192, 0.03835569, -0.096041076, 0.004406702, -0.10389978, -0.0009610953)); + conv2d_11_tf += mul(h2, min16float4x4(-0.10157398, -0.10319637, -0.012073916, -0.19039184, -0.02369365, -0.021698838, 0.015538155, -0.051231697, 0.041044284, -0.02691978, -0.1713024, -0.12904704, -0.03471921, 0.037977315, 0.064845525, 0.1264632)); + conv2d_11_tf += mul(i2, min16float4x4(-0.08406344, 0.044064984, 0.056877784, -0.13283873, -0.0058603142, 0.075482026, -0.09246969, -0.065718174, -0.025745329, 0.015633717, -0.06059284, 0.08149079, -0.022848418, 0.061127402, 0.047879003, 0.04544503)); + conv2d_11_tf += mul(a3, min16float4x4(-0.21875143, 0.053516608, 0.04243476, -0.08509983, 0.406294, -0.060116358, -0.13793904, -0.1559247, -0.017128536, 0.021633752, 0.08865264, -0.032922007, 0.08250139, -0.17353764, -0.16137601, 0.12943612)); + conv2d_11_tf += mul(b3, min16float4x4(-0.27127337, -0.057137657, 0.005031509, 0.10027777, 0.20500132, 0.0073007634, -0.09760265, -0.2428409, -0.16160156, 0.32289484, -0.096351616, -0.15562637, -0.24892123, 0.13368145, 0.31498823, 0.09549184)); + conv2d_11_tf += mul(c3, min16float4x4(0.01444343, 0.07115736, -0.17920075, -0.024846312, 0.057884447, 0.14358939, 0.043788955, -0.013016863, 0.087220736, -0.0060180086, 0.19609165, -0.025888423, -0.06294847, 0.03406598, -0.04250465, -0.04808649)); + conv2d_11_tf += mul(d3, min16float4x4(-0.02662509, 0.24295834, -0.07612864, -0.20615683, 0.16377121, -0.05186765, -0.1750536, -0.04726876, 0.29443663, 0.0983683, -0.18610948, -0.1949004, -0.1446201, 0.11045659, 0.013536009, 0.18919495)); + conv2d_11_tf += mul(e3, min16float4x4(-0.080005094, -0.29404542, 0.14548069, 0.013500291, -0.011395713, -0.048017073, -0.053436857, -0.13627477, 0.041908856, -0.30820572, 0.17044339, 0.22999896, -0.32405153, 0.12114645, -0.080108374, -0.06520369)); + conv2d_11_tf += mul(f3, min16float4x4(0.062350888, 0.170049, 0.04211445, 0.12288375, 0.010835714, -0.17722476, -0.18930283, 0.11607083, -0.054421842, -0.004191082, 0.14655825, -0.1229237, -0.058039404, 0.09008831, -0.017603457, 0.027497675)); + conv2d_11_tf += mul(g3, min16float4x4(0.24208143, 0.04073837, -0.014191606, -0.069054805, 0.33024073, 0.25458166, -0.062864356, 0.028975246, 0.17692459, 0.22093695, -0.17666881, -0.03709188, -0.2001521, -0.06491504, 0.199202, 0.08666711)); + conv2d_11_tf += mul(h3, min16float4x4(0.053933676, -0.058177974, 0.006558046, -0.018798346, -0.05610966, 0.21288905, -0.06513558, -0.012686734, 0.11635233, -0.039428618, 0.21562201, -0.07206132, 0.065123, -0.056875434, 0.08877115, -0.10216625)); + conv2d_11_tf += mul(i3, min16float4x4(-0.03294463, 0.011720216, 0.056083966, -0.05530083, -0.16838011, -0.0026962461, -0.17402422, -0.009680605, -0.0064969915, 0.14410603, 0.090527765, 0.048180934, -0.06482277, -0.17573984, 0.36281663, 0.14240478)); + conv2d_11_tf += mul(na1, min16float4x4(0.026252843, 0.01621395, -0.03018171, 0.20843759, -0.05987382, -0.13891932, 0.008612968, -0.03674587, 0.055803657, -0.020272622, -0.12338887, -0.21429133, -0.026188683, -0.08283737, -0.07952566, 0.11333926)); + conv2d_11_tf += mul(nb1, min16float4x4(-0.03251504, -0.04554576, 0.012727539, 0.06115098, -0.23113467, -0.21784578, 0.10390341, -0.028863542, 0.1405748, -0.092941806, 0.04094931, 0.26037696, 0.014778488, -0.0012763811, 0.120576814, 0.017626097)); + conv2d_11_tf += mul(nc1, min16float4x4(-0.18005073, 0.08914073, -0.19792715, 0.07666369, -0.040389247, 0.06043132, -0.068735644, 0.006061951, -0.09742132, -0.015570641, -0.05810036, -0.06305046, 0.06286483, -0.1669205, -0.15426171, 0.046022687)); + conv2d_11_tf += mul(nd1, min16float4x4(-0.045976873, 0.028456753, 0.037186757, 0.05231241, -0.12909305, -0.16277504, -0.0035813665, -0.06294949, -0.04205357, -0.15816367, -0.021810539, -0.108161986, -0.08399507, -0.12965044, -0.00611913, -0.029711436)); + conv2d_11_tf += mul(ne1, min16float4x4(0.2537032, -0.018604688, 0.16584206, -0.20883793, -0.10245589, -0.06570063, -0.16321684, 0.02899805, -0.1427425, 0.20915249, -0.1761724, -0.09594, -0.10995607, -0.11155546, 0.037878104, 0.028106442)); + conv2d_11_tf += mul(nf1, min16float4x4(-0.1628865, -0.17466225, -0.14372015, 0.05667306, 0.10472602, -0.018716356, 0.087850116, -0.056246866, 0.083403885, -0.082255535, -0.10299376, -0.1840543, -0.35220358, -0.059505656, -0.21391232, 0.16591822)); + conv2d_11_tf += mul(ng1, min16float4x4(0.040541083, -0.1146205, -0.021495365, -0.033008795, 0.007970957, 0.007984478, 0.02606323, 0.012668774, 0.12771203, -0.09947922, -0.14149466, -0.1890857, -0.14682727, 0.033072542, -0.11833484, -0.038956877)); + conv2d_11_tf += mul(nh1, min16float4x4(-0.14274059, 0.08827524, 0.011712704, 0.10902492, 0.060481314, 0.003578728, 0.029129535, 0.08889746, -0.09685511, -0.095264345, -0.13920794, -0.11014531, -0.05436568, 0.060371455, 0.07251505, 0.20626338)); + conv2d_11_tf += mul(ni1, min16float4x4(-0.07604635, -0.035359483, 0.010230144, 0.030468917, -0.008423673, 0.0273416, -0.10538517, 0.10806335, 0.03605524, -0.082360476, -0.06390322, -0.19094782, -0.10980772, 0.13070256, -0.009116851, 0.094997086)); + conv2d_11_tf += mul(na2, min16float4x4(0.06696349, 0.02884076, -0.21400648, 0.10645195, -0.15960447, 0.07844191, 0.09057932, -0.022310507, -0.20641366, -0.20897295, 0.05159085, -0.042257026, 0.16398512, -0.22846761, -0.033591952, 0.3359712)); + conv2d_11_tf += mul(nb2, min16float4x4(-0.024236226, -0.13937415, 0.29392216, 0.075087205, 0.07763272, 0.27571923, -0.28625518, -0.37574485, -0.0041614594, 0.051519327, -0.1727601, -0.002199689, -0.32436445, 0.059740037, 0.006543187, 0.11488307)); + conv2d_11_tf += mul(nc2, min16float4x4(-0.025740145, 0.10688955, 0.3432225, 0.04467087, 0.033870216, 0.16714002, 0.20819634, -0.11762629, 0.19059974, 0.0661928, 0.022394795, -0.14459209, -0.16684553, 0.08020461, -0.37147745, 0.04065124)); + conv2d_11_tf += mul(nd2, min16float4x4(-0.006134667, -0.0031798254, -0.101459935, 0.15463492, 0.039860703, 0.077067874, 0.17671694, -0.06597644, -0.12203232, -0.058787927, 0.008942991, 0.0570718, -0.043793175, -0.06388724, 0.0247615, -0.09814649)); + conv2d_11_tf += mul(ne2, min16float4x4(0.009333359, -0.10666345, 0.19417302, -0.08021104, 0.071850464, 0.18651992, 0.1487532, 0.03132098, -0.21202543, 0.02972519, 0.028346745, 0.17178747, -0.24139602, -0.18386513, -0.03009887, -0.17363264)); + conv2d_11_tf += mul(nf2, min16float4x4(0.006349671, -0.0199598, 0.14889078, -0.14921328, -0.08713048, 0.14722322, 0.041971955, -0.019181551, 0.07069949, -0.12362262, 0.08554868, 0.16224997, -0.11218193, 0.3132043, -0.18114331, -0.104602315)); + conv2d_11_tf += mul(ng2, min16float4x4(0.047690846, -0.26872492, 0.2183612, 0.19340567, -0.06084255, 0.04798949, 0.19492827, 0.14699973, -0.07016259, 0.14654481, -0.06714773, 0.07936776, 0.073397264, -0.10646918, -0.13238135, 0.07208961)); + conv2d_11_tf += mul(nh2, min16float4x4(0.07382223, -0.044347115, -0.032497067, -0.02002406, 0.18200569, -0.09839878, -0.0027670355, -0.032592446, -0.05297432, 0.11200702, -0.019955616, 0.112369545, -0.2748285, -0.139697, -0.26332188, -0.303972)); + conv2d_11_tf += mul(ni2, min16float4x4(-0.23713836, -0.003925555, 0.16436225, 0.15221255, 0.1077621, -0.027760457, 0.0059113647, -0.11066059, -0.0980858, 0.011830199, 0.040253483, 0.06447465, -0.0827841, 0.04048125, 0.04551489, -0.12471252)); + conv2d_11_tf += mul(na3, min16float4x4(0.010833946, -0.058524415, -0.19618602, -0.11400699, -0.088038966, -0.08249501, 0.025192872, -0.04508469, -0.017629553, 0.10654934, 0.007814974, 0.041299284, 0.054442752, 0.14059617, 0.09760092, -0.060198124)); + conv2d_11_tf += mul(nb3, min16float4x4(-0.16173755, 0.14454803, -0.036523324, 0.016083395, -0.04597214, 0.019925527, 0.10551423, 0.07915449, -0.09191786, 0.040694106, 0.079085656, 0.04860138, -0.00920608, 0.015785221, 0.08149557, -0.070038155)); + conv2d_11_tf += mul(nc3, min16float4x4(0.09396598, -0.27780503, 0.057351794, 0.17856738, 0.06403465, -0.019479418, 0.13132542, 0.09766009, -0.13038878, 0.106342256, 0.19923963, -0.107940085, -0.11207263, 0.07427199, 0.122141175, -0.17083314)); + conv2d_11_tf += mul(nd3, min16float4x4(-0.0129763335, 0.029884486, -0.1591489, 0.05743726, -0.10154112, -0.05951815, 0.038755298, 0.31987077, 0.041023176, 0.15760195, 0.020455543, 0.117823385, 0.008611401, 0.10392111, -0.029049959, -0.00561999)); + conv2d_11_tf += mul(ne3, min16float4x4(0.11115114, 0.13910228, -0.15370879, 0.14353245, -0.106912665, 0.16457058, -0.0007093892, -0.16065751, 0.12172275, -0.0071658283, -0.13790236, -0.05790294, 0.0258849, 0.047155324, 0.028826248, 0.077854194)); + conv2d_11_tf += mul(nf3, min16float4x4(0.04222945, 0.016645031, -0.22052032, -0.108474314, -0.037527397, 0.1508435, 0.13960642, 0.051745985, 0.17182018, -0.0071819094, 0.13896792, 0.12522686, 0.1307583, 0.09315921, 0.031736225, -0.24318463)); + conv2d_11_tf += mul(ng3, min16float4x4(0.12233872, 0.16193391, -0.045825243, -0.021991767, -0.06857775, 0.019997157, 0.26207915, 0.017674582, 0.14816906, -0.011254348, 0.11932189, -0.06385669, -0.08113471, 0.13287768, -0.008416972, -0.039866585)); + conv2d_11_tf += mul(nh3, min16float4x4(0.15459004, -0.029546147, -0.20761466, -0.12011381, -0.09814943, -0.12983616, 0.0019625768, 0.086729765, 0.22380745, 0.112912305, -0.073421806, -0.061414655, -0.00015528004, -0.10514693, 0.0449276, 0.1197672)); + conv2d_11_tf += mul(ni3, min16float4x4(0.031599533, -0.0699447, 0.10802751, -0.011152619, 0.08078543, 0.10828058, 0.10941837, -0.07911565, 0.16324246, -0.034676578, 0.04017893, 0.01809475, -0.0054880627, 0.027349245, -0.041267768, 0.041391887)); + conv2d_11_tf += min16float4(-0.022754392, 0.009821446, 0.06426939, -0.052443504); + tex10[gxy] = conv2d_11_tf; + min16float4 nconv2d_11_tf = max(-conv2d_11_tf, 0); + conv2d_11_tf = max(conv2d_11_tf, 0); + + min16float4 conv2d_10_tf = mul(a1, min16float4x4(0.31697825, -0.38101152, 0.26027805, 0.19195847, -0.15098146, 0.17915927, 0.263392, -0.108211316, 0.004631585, -0.06989657, 0.057514362, 0.013759571, -0.06416892, 0.033370133, -0.04808954, -0.1563251)); + conv2d_10_tf += mul(b1, min16float4x4(0.15827416, -0.17950794, 0.16834997, 0.13073751, 0.030396005, 0.040662624, 0.16062944, 0.041357074, -0.13926722, -0.06929913, 0.10808029, -0.06798461, 0.10745701, -0.102971874, -0.06641405, 0.0885879)); + conv2d_10_tf += mul(c1, min16float4x4(0.017569518, -0.074986644, -0.0381504, -0.108356364, -0.028105393, 0.107422166, 0.010693419, -0.03790183, -0.056355134, -0.17228265, 0.19153535, 0.014339309, -0.072250925, 0.25570604, 0.06766601, 0.10274542)); + conv2d_10_tf += mul(d1, min16float4x4(0.11808023, 0.03209569, -0.047605, 0.10232121, -0.089450955, 0.22296266, -0.031239472, 0.12547736, -0.13355453, 0.09658202, 0.14639929, 0.1722445, -0.16578807, -0.01587181, -0.06775275, 0.106690586)); + conv2d_10_tf += mul(e1, min16float4x4(-0.08015724, -0.09917064, 0.17005561, -0.11093009, -0.033904083, -0.18723048, -0.42410555, -0.34870258, -0.024956835, -0.057636626, -0.17249386, 0.3452565, -0.0781917, 0.048283495, -0.1849922, 0.10712763)); + conv2d_10_tf += mul(f1, min16float4x4(-0.19845031, 0.018594265, 0.11669769, 0.04427017, -0.13347605, 0.14735079, -0.20751207, -0.08490434, -0.077883884, -0.17200643, 0.03127422, 0.11106135, -0.04682848, -0.04392586, 0.11629085, -0.03191463)); + conv2d_10_tf += mul(g1, min16float4x4(-0.035416074, 0.032688126, -0.034218192, -0.35819814, -0.07167647, -0.032766674, -0.09849224, 0.27033108, -0.040135793, 0.11793038, 0.024326177, 0.056732934, 0.0072507905, -0.15076852, -0.007368895, -0.07758195)); + conv2d_10_tf += mul(h1, min16float4x4(0.03677586, 0.088763975, 0.04954433, -0.047844727, -0.07487822, -0.06698103, 0.12568145, -0.22909173, 0.1671084, -0.17893419, 0.09722236, 0.20345661, 0.057767022, 0.044742733, 0.06905004, -0.010992711)); + conv2d_10_tf += mul(i1, min16float4x4(0.0028451576, -0.27325574, 0.14329389, -0.07025869, -0.09781529, 0.0151023185, 0.08696752, -0.056844577, -0.19665222, 0.09358589, 0.16416575, 0.06988374, 0.16515698, 0.09760437, 0.023626767, 0.16473217)); + conv2d_10_tf += mul(a2, min16float4x4(-0.01080354, 0.014449004, 0.11467091, -0.07119837, 0.18900962, -0.06401898, -0.025841001, 0.13663737, -0.04860565, 0.15505394, 0.11083383, -0.06831929, -0.12395706, 0.04564376, -0.132784, 0.095948376)); + conv2d_10_tf += mul(b2, min16float4x4(-0.009644828, 0.05351468, -0.086626254, -0.07883177, 0.12082235, 0.16186416, 0.20026602, -0.12537873, -0.02765183, -0.19664048, -0.14943156, 0.17649364, -0.15099925, -0.16448402, 0.04770359, 0.08525748)); + conv2d_10_tf += mul(c2, min16float4x4(-0.07529481, 0.057762332, 0.02256763, 0.0037007954, 0.052606575, 0.008619477, 0.035252705, -0.060551647, 0.03680644, 0.1457205, 0.0970469, 0.00867666, -0.0931654, -0.046189044, -0.118787736, 0.059376143)); + conv2d_10_tf += mul(d2, min16float4x4(0.024567254, -0.07128407, -0.02618071, -0.16522972, 0.02537496, 0.09393943, -0.018046979, -0.12497053, 0.041589152, 0.028847594, 0.072174646, -0.12484334, -0.096903354, 0.07245438, -0.03219862, 0.037360255)); + conv2d_10_tf += mul(e2, min16float4x4(0.05599119, -0.0027604182, -0.004961665, -0.1297362, 0.10879746, 0.14088875, -0.031004267, -0.016735828, 0.07093551, 0.024946349, 0.16840066, -0.10094298, -0.04150052, 0.09933387, 0.09332617, -0.121228844)); + conv2d_10_tf += mul(f2, min16float4x4(0.099246845, -0.17000747, -0.17089754, 0.0021521626, 0.046584304, -0.037944607, 0.1009471, 0.110904016, 0.17920195, -0.00022254961, 0.07443117, 0.07490046, 0.1700909, -0.18371364, -0.15320961, -0.0344897)); + conv2d_10_tf += mul(g2, min16float4x4(0.10543544, 0.04469465, 0.14627467, -0.07649682, -0.082381524, 0.12919065, 0.090079635, -0.07820535, -0.06769879, -0.12625079, -0.06946243, -0.19333136, 0.02998107, 0.01594043, 0.12332583, 0.015775004)); + conv2d_10_tf += mul(h2, min16float4x4(0.025815854, 0.015107419, -0.045278236, 0.13242702, -0.059958965, 0.031560495, 0.047686167, 0.064922616, 0.09818797, -0.07938157, -0.08586279, 0.079509474, -0.031728156, 0.052335043, 0.046583798, 0.17072229)); + conv2d_10_tf += mul(i2, min16float4x4(-0.07827454, -0.033509843, 0.054832056, -0.011652403, -0.029872715, -0.13623856, 0.013034195, -0.009600983, -0.08374398, 0.0022505643, 0.042340405, 0.050227124, -0.072084844, -0.044353593, 0.06991293, -0.024949703)); + conv2d_10_tf += mul(a3, min16float4x4(0.08938938, -0.092218116, -0.016011834, 0.038319822, 0.12462916, 0.30430344, -0.2225195, 0.23016618, 0.16917962, -0.10025298, 0.03197825, -0.0028935818, -0.20949106, 0.16084236, 0.02389285, -0.07628905)); + conv2d_10_tf += mul(b3, min16float4x4(0.008811933, -0.07407284, 0.06164061, -0.08511243, 0.23705618, -0.04852394, -0.09615244, -0.14999956, 0.14771207, -0.31061637, 0.053693004, 0.12648372, 0.13281338, -0.052495755, -0.10527891, 0.055210527)); + conv2d_10_tf += mul(c3, min16float4x4(-0.002706158, -0.08600029, 0.067195736, 0.11638961, 0.22492133, 0.21856707, -0.07640264, -0.06916772, 0.06080084, 0.11333604, 0.06812178, -0.033994764, 0.18698989, -0.0062931813, -0.07839693, -0.19759217)); + conv2d_10_tf += mul(d3, min16float4x4(0.016470285, -0.08823432, 0.22680223, 0.09997554, 0.23114151, 0.19813643, -0.35361916, 0.2194339, 0.11047473, 0.068083756, 0.067214124, 0.43412095, -0.012517998, 0.15817562, 0.041793827, -0.12873247)); + conv2d_10_tf += mul(e3, min16float4x4(0.072530076, 0.13730067, 0.2244758, -0.07199118, -0.052385315, 0.10464238, 0.26556495, -0.2717685, -0.11540168, -0.018752037, 0.025696546, -0.12900795, -0.010386023, -0.020768933, 0.24903738, -0.14111607)); + conv2d_10_tf += mul(f3, min16float4x4(-0.24632111, -0.015176092, -0.02656606, 0.009465184, -0.0051622107, 0.14365524, 0.110313326, 0.075529456, -0.041912608, -0.012926297, 0.099115536, -0.043660834, 0.14709431, 0.069978856, 0.19860862, 0.30215213)); + conv2d_10_tf += mul(g3, min16float4x4(0.003388868, 0.000683922, 0.025133248, 0.004995937, -0.06642034, 0.028584523, -0.14691937, -0.2014579, 0.15427552, -0.027058927, 0.04456965, 0.084938034, -0.24065961, -0.014348999, -0.093859546, -0.032467082)); + conv2d_10_tf += mul(h3, min16float4x4(-0.067999065, -0.061825316, -0.056987073, 0.0009880592, -0.014163033, -0.30605268, 0.22628185, 0.01192761, -0.08495571, 0.17559315, -0.17546391, -0.0027795131, -0.289151, -0.41655365, 0.11138813, -0.18327911)); + conv2d_10_tf += mul(i3, min16float4x4(-0.032702215, 0.072819114, -0.06573772, -0.023648093, -0.28138083, 0.0492584, 0.17402509, -0.04257587, 0.109756455, 0.086533375, -0.017961387, 0.02175586, -0.12014975, 0.0101643065, 0.34295502, -0.04737776)); + conv2d_10_tf += mul(na1, min16float4x4(-0.043654937, 0.030818325, 0.009349365, 0.0058960635, 0.075968295, 0.10992966, -0.056467474, -0.053309787, -0.020969287, 0.13869311, 0.118167736, 0.20124547, -0.071703844, 0.16065824, 0.0333816, 0.16069882)); + conv2d_10_tf += mul(nb1, min16float4x4(-0.00913058, 0.11581215, -0.08088577, 0.048499383, -0.002100561, 0.14013395, -0.021854091, 0.022357881, -0.007194664, 0.2258521, 0.28041685, 0.035750967, -0.17555529, -0.06302401, 0.006144002, 0.073763065)); + conv2d_10_tf += mul(nc1, min16float4x4(0.13105561, 0.033134516, -0.123544686, 0.036164157, 0.081316054, -0.09048299, -0.034898795, -0.04975392, -0.118228555, 0.0013148085, -0.024866905, -0.07593515, -0.058713235, 0.081549294, 0.09502267, -0.06489622)); + conv2d_10_tf += mul(nd1, min16float4x4(-0.013302538, 0.14520672, -0.041146558, 0.08169293, 0.1506187, 0.062507726, 0.19582897, 0.05240332, 0.015582799, 0.08783006, 0.016972601, -0.23824452, -0.056192238, -0.087197326, 0.0045260703, -0.012997719)); + conv2d_10_tf += mul(ne1, min16float4x4(-0.074937195, -0.018988643, -0.07370074, 0.048774365, 0.07236563, 0.0904083, -0.10467449, 0.10507359, 0.12723474, -0.1263123, -0.17705469, -0.15779553, -0.23850663, -0.119912334, 0.21794695, 0.19370297)); + conv2d_10_tf += mul(nf1, min16float4x4(-0.04097957, -0.0038975494, 0.11273524, -0.049562607, -0.041399803, 0.013795214, -0.07912852, 0.06913985, -0.039762158, 0.031136844, -0.22443683, -0.07978295, 0.15926225, -0.021239735, 0.02987538, 0.0073201153)); + conv2d_10_tf += mul(ng1, min16float4x4(-0.00022499492, 0.07021377, 0.10080298, -0.049646243, 0.08742822, -0.05083212, 0.11067444, 0.0028296155, -0.06948983, -0.032108277, -0.17148562, 0.031176677, 0.028853005, 0.06482861, 0.0068417406, 0.20317557)); + conv2d_10_tf += mul(nh1, min16float4x4(0.11648821, -0.17146581, 0.067954056, 0.08905258, -0.08075704, 0.019719714, -0.11522013, 0.07268729, 0.0639498, 0.19816676, 0.014075983, -0.032495353, -0.017302783, 0.001971279, -0.03852454, 0.13213885)); + conv2d_10_tf += mul(ni1, min16float4x4(-0.043073803, 0.013491542, -0.0071037943, 0.104073495, 0.02311169, 0.058454588, -0.036697295, -0.048574958, -0.02161516, 0.10554709, 0.07252144, 0.013570617, -0.08058747, -0.050845098, 0.11659161, 0.12994757)); + conv2d_10_tf += mul(na2, min16float4x4(-0.065163076, 0.19974495, -0.4120684, 0.07145881, 0.113002166, 0.23591681, 0.09600776, -0.12980238, -0.032298863, -0.09617708, -0.09807077, -0.019956803, -0.0144692, -0.11556348, -0.080140986, -0.088292986)); + conv2d_10_tf += mul(nb2, min16float4x4(-0.012835261, -0.04646276, 0.072318554, -0.08490823, 0.1648558, -0.15578964, 0.07145768, 0.12143512, 0.007787767, 0.07922046, -0.10203864, -0.15637778, 0.17195338, -0.16184372, -0.01940918, -0.0037627215)); + conv2d_10_tf += mul(nc2, min16float4x4(-0.118128635, -0.06761304, 0.20045926, -0.11828058, 0.022446023, -0.09117082, 0.11077834, 0.12605691, -0.094919816, -0.016070768, -0.025274863, 0.13070245, 0.14234897, -0.080053166, -0.14352201, 0.24688406)); + conv2d_10_tf += mul(nd2, min16float4x4(-0.038446598, 0.06076558, 0.011793446, -0.027539631, 0.12532312, 0.12770405, 0.05115926, 0.07202868, 0.00048553053, -0.20094085, 0.14294891, 0.27486032, 0.09690127, -0.19488129, -0.010087613, -0.32277402)); + conv2d_10_tf += mul(ne2, min16float4x4(-0.03640304, -0.03347442, -0.14699876, 0.084367014, -0.0931957, 0.0046109143, -0.10012045, -0.21788213, -0.22289619, -0.15080798, 0.053079627, 0.058909237, 0.0033036254, -0.266638, 0.15794982, 0.15606833)); + conv2d_10_tf += mul(nf2, min16float4x4(-0.16570765, -0.19292961, -0.040884703, 0.0350054, 0.044223823, -0.05094823, -0.10369617, -0.026184212, -0.07026344, 0.08071905, -0.05532503, -0.105882615, 0.11906692, -0.12926123, 0.18500324, 0.09285109)); + conv2d_10_tf += mul(ng2, min16float4x4(-0.30376035, -0.015966324, -0.080935225, -0.054857124, 0.008181847, -0.051866602, 0.086870745, -0.205586, -0.13184556, -0.03217006, 0.029946566, -0.10589564, 0.045322973, -0.1656244, -0.08579307, -0.121582575)); + conv2d_10_tf += mul(nh2, min16float4x4(-0.06772616, -0.14879958, -0.17823575, 0.020676576, -0.04157187, -0.019993478, -0.026832247, -0.22187601, -0.12282354, -0.101527624, 0.10540906, -0.09816911, 0.01171376, -0.35307917, -0.21599512, -0.12673624)); + conv2d_10_tf += mul(ni2, min16float4x4(0.13506149, -0.12476234, -0.23067783, 0.0016245812, 0.27068454, 0.085986294, 0.08674341, 0.07736311, 0.04183122, 0.09630597, 0.005955931, -0.033355173, -0.19212, -0.2707448, -0.18517534, -0.035879433)); + conv2d_10_tf += mul(na3, min16float4x4(-0.0151614295, 0.047397353, 0.0923022, 0.08485078, 0.15618569, -0.11042138, 0.12418296, -0.07967247, 0.053651772, 0.015027734, 0.048835948, 0.07711154, 0.020557769, 0.023958597, 0.04587901, -0.0014006038)); + conv2d_10_tf += mul(nb3, min16float4x4(0.038551513, -0.10045045, 0.06231501, 0.043190606, 0.011727592, 0.10791629, 0.022111481, -0.053163722, 0.11845128, -0.102105886, 0.08789077, -0.0027942352, -0.08893058, 0.008466707, 0.011015023, -0.047280762)); + conv2d_10_tf += mul(nc3, min16float4x4(0.013820725, 0.1256963, 0.041195784, -0.057415746, -0.07633132, -0.025274424, 0.029755162, -0.046797376, -0.037444938, -0.09385259, 0.14993298, 0.040402364, 0.057619866, 0.0044342144, 0.044209216, 0.13005155)); + conv2d_10_tf += mul(nd3, min16float4x4(0.07646884, 0.18639803, -0.021711063, 0.021434348, 0.11517055, 0.010340496, -0.0018932755, -0.3739696, 0.1309672, 0.08240308, 0.08870368, 0.09622062, -0.07567563, -0.08575518, 0.12712875, 0.16571298)); + conv2d_10_tf += mul(ne3, min16float4x4(-0.028878238, -0.06821328, -0.048233025, 0.010556409, 0.08252249, 0.12659778, 0.10306397, 0.041443437, -0.008534995, -0.08196783, -0.13689299, 0.048229158, 0.12889823, 0.12517701, -0.06344265, 0.11288182)); + conv2d_10_tf += mul(nf3, min16float4x4(0.20085302, 0.024324976, 0.012985146, 0.045487225, -0.14292689, 0.091915675, 0.030304266, -0.007919423, -0.09057523, -0.13942213, 0.22375956, -0.15821122, 0.13392857, 0.06950518, -0.009899817, -0.19455001)); + conv2d_10_tf += mul(ng3, min16float4x4(-0.18937646, 0.13056205, -0.09389302, -0.06861626, 0.030355467, -0.07237441, 0.079272114, -0.018099891, -0.057733692, 0.14460595, -0.068894215, 0.073404275, -0.005731954, -0.16851021, 0.029365558, 0.04029561)); + conv2d_10_tf += mul(nh3, min16float4x4(-0.11247864, -0.026352342, -0.26439467, 0.021711655, -0.17112786, 0.09201832, 0.058435153, -0.18282679, -0.058647767, -0.0882594, -0.09513095, 0.046603747, 0.118426494, -0.06860188, 0.14646193, -0.10118678)); + conv2d_10_tf += mul(ni3, min16float4x4(-0.08203177, 0.049650684, 0.11541628, 0.07473622, -0.06572682, -0.018375592, -0.0739239, -0.08190655, -0.012673694, 0.0003337712, 0.041397918, -0.047579113, -0.13510825, 0.025625594, -0.035801806, -0.045355853)); + conv2d_10_tf += min16float4(0.03802586, 0.06033134, 0.0405485, 0.00039835402); + tex11[gxy] = conv2d_10_tf; + min16float4 nconv2d_10_tf = max(-conv2d_10_tf, 0); + conv2d_10_tf = max(conv2d_10_tf, 0); + + min16float4 target = mul(e1, min16float4x4(0.2216899, -0.006199309, -0.14865121, 0.06256912, 0.082141966, 0.069441915, -0.064958416, -0.014999604, -0.017270254, 0.054063573, -0.30066323, 0.09460075, 0.17069338, -0.26000282, 0.026078973, -0.0024098607)); + target += mul(e2, min16float4x4(0.22918217, 0.2753827, -0.2260137, 0.0074888375, 0.007864308, 0.01738929, 0.036404576, 0.15125586, 0.12692557, -0.1064573, -0.105954304, 0.17095445, -0.295937, 0.2284073, -0.28089303, 0.17836742)); + target += mul(e3, min16float4x4(-0.23949356, -0.20830329, 0.043005105, 0.11848222, 0.26292896, 0.13052817, 0.14105777, -0.14028162, 0.033770017, -0.12098709, -0.19063175, -0.020637099, 0.032703582, -0.31454226, 0.07559202, 0.067997165)); + target += mul(ne1, min16float4x4(-0.26934767, 0.25418487, 0.2089665, -0.15689164, 0.068669625, -0.19087234, 0.034052055, -0.038685646, 0.037284948, 0.14673525, -0.001882231, 0.07179596, -0.054052413, 0.2954734, 0.108455196, 0.21742904)); + target += mul(ne2, min16float4x4(0.24180835, 0.012385412, -0.017178789, 0.032714315, -0.26524556, 0.024244266, -0.226589, -0.0358992, -0.2241718, 0.08004254, -0.017615836, -0.2492002, 0.09387765, 0.18154638, -0.034240507, 0.3605678)); + target += mul(ne3, min16float4x4(0.24151021, -0.014141217, -0.1259467, -0.19366209, -0.07166293, 0.08856931, -0.08999051, 0.31848234, -0.07388433, -0.16038652, 0.28902727, 0.2382835, -0.15296587, -0.12924191, 0.16233487, 0.05408346)); + target += mul(conv2d_11_tf, min16float4x4(-0.18532315, 0.116318375, -0.043276392, -0.20643523, -0.1317004, -0.025412546, -0.32449946, 0.08039049, -0.18457016, -0.015615943, -0.01645252, 0.21732457, 0.082662076, 0.1900878, -0.11705433, 0.14767131)); + target += mul(nconv2d_11_tf, min16float4x4(0.052993804, -0.11595191, 0.32436988, -0.003765943, 0.2296748, 0.119828835, -0.019125028, -0.3126433, -0.039699726, -0.24760635, 0.08949547, -0.012501165, 0.33296522, -0.349697, -0.081094205, 0.061596226)); + target += mul(conv2d_1_tf, min16float4x4(-0.033869196, 0.12660468, 0.12152309, -0.18401411, 0.1442463, 0.18430543, 0.22487932, 0.29795903, 0.17951487, -0.24413475, -0.13472381, 0.3147198, -0.22021247, -0.15316834, 0.013162168, -0.20238425)); + target += mul(nconv2d_1_tf, min16float4x4(-0.0015613904, -0.09523476, 0.024224702, -0.17930624, -0.061623972, 0.06495367, 0.3776854, -0.17299566, -0.36212873, 0.13202415, 0.07052771, -0.1219512, 0.29942214, -0.011110212, 0.36104754, 0.0010065075)); + target += mul(conv2d_4_tf, min16float4x4(0.16467105, 0.29388088, 0.13385788, 0.118168965, 0.15695275, -0.2269201, 0.097460486, -0.04286567, 0.020316202, -0.07753041, -0.18018067, -0.111885116, -0.17371373, 0.04722513, 0.2188871, 0.1295067)); + target += mul(nconv2d_4_tf, min16float4x4(0.2567296, 0.0027146419, -0.18108767, -0.10636566, -0.04075492, 0.08977396, 0.27601838, 0.041642547, -0.29131287, -0.0026349663, 0.16847563, 0.29684088, 0.23944439, -0.12667872, -0.31902757, -0.023768846)); + target += mul(conv2d_7_tf, min16float4x4(-0.12111429, 0.046077378, 0.07920395, -0.3619861, 0.0030046673, -0.21324079, -0.14134064, 0.07692796, 0.2308601, 0.050601542, -0.20067136, 0.1312576, 0.078878105, -0.07905382, 0.04887801, 0.11589316)); + target += mul(nconv2d_7_tf, min16float4x4(0.18035689, 0.022012187, -0.05441432, -0.13895841, 0.1792498, 0.06579118, -0.3518265, 0.19284686, -0.36724597, -0.19384578, 0.052024953, 0.069351286, -0.17106277, 0.01428955, -0.022695465, -0.03882866)); + target += mul(conv2d_10_tf, min16float4x4(0.12341931, 0.21374431, 0.14095145, 0.11081035, -0.1377048, 0.2957615, 0.2647214, -0.21324296, 0.18657272, -0.16867872, 0.13558641, -0.14022234, -0.00384067, -0.19601567, -0.20603377, 0.006892211)); + target += mul(nconv2d_10_tf, min16float4x4(0.05891213, 0.17766091, -0.11099863, -0.10597074, 0.4759035, -0.20892517, -0.35479382, -0.057822235, -0.10161365, -0.11828349, -0.021581944, 0.057930104, -0.46801752, -0.25330284, 0.30126703, -0.31744412)); + target += min16float4(0.011156243, 0.004168819, 0.082229175, 0.043994825); + tex1[gxy] = target; + + target = mul(e1, min16float4x4(0.137003, -0.06089221, -0.108805895, 0.27130327, -0.3015222, -0.26373127, 0.019133324, 0.035202216, 0.040255867, 0.09030984, -0.46218738, -0.3097094, -0.057662863, 0.123317555, 0.037645355, 0.010423522)); + target += mul(e2, min16float4x4(0.29102653, -0.17060617, 0.31592718, -0.15487169, -0.09719322, 0.08212171, -0.24112037, -0.5323616, 0.050776903, 0.26745227, -0.0123307025, -0.0076298076, -0.044822518, -0.15961778, 0.26758936, 0.019300641)); + target += mul(e3, min16float4x4(0.19517086, -0.2878986, 0.12765801, -0.12057966, 0.27521843, 0.028182628, 0.32267106, 0.035355434, -0.065272234, -0.015919037, 0.38220987, 0.14314096, 0.052418232, 0.07207548, -0.41493666, -0.03195114)); + target += mul(ne1, min16float4x4(0.18309553, -0.11183888, -0.052814357, -0.08971906, -0.14353213, -0.20144752, -0.20325397, -0.16143575, 0.028960846, -0.16557908, 0.266044, -0.2373641, 0.12750591, -0.11190832, 0.35028338, 0.17638433)); + target += mul(ne2, min16float4x4(0.058721025, 0.21000905, -0.2719825, -0.16923684, 0.2887994, 0.08877727, -0.1274528, 0.12557751, -0.09804875, -0.37839252, -0.1465434, -0.1059692, 0.07212408, -0.101579584, -0.16375211, -0.09519384)); + target += mul(ne3, min16float4x4(-0.145749, -0.15073515, -0.2661711, -0.21265043, -0.3345085, -0.16820145, 0.07732321, 0.13837157, 0.014605319, -0.14113256, -0.3269443, -0.100293055, 0.114504874, -0.4271041, -0.17389913, 0.0033216716)); + target += mul(conv2d_11_tf, min16float4x4(0.022264633, -0.19477129, 0.050657783, -0.08318149, -0.5125155, 0.030831251, 0.110084355, -0.25779435, 0.08368584, 0.48425493, -0.28335044, 0.23433922, 0.31263804, -0.12789254, -0.14072786, 0.10106589)); + target += mul(nconv2d_11_tf, min16float4x4(0.007650675, -0.082783565, -0.1599306, 0.22329025, -0.01190027, 0.09498623, -0.06526687, -0.074669816, 0.13880949, -0.0060707824, -0.044009406, 0.15161307, -0.121638715, 0.012903123, 0.047266923, -0.41495043)); + target += mul(conv2d_1_tf, min16float4x4(0.1315474, 0.2878135, -0.03521026, 0.31479505, 0.4425801, 0.22921802, -0.19864602, -0.0049938424, -0.39346734, 0.09232505, 0.20387846, 0.08173493, -0.2582244, -0.23351125, 0.04481434, -0.105453715)); + target += mul(nconv2d_1_tf, min16float4x4(-0.10668876, -0.026544912, 0.19446668, 0.0045490777, -0.024656052, -0.11874863, 0.21377616, 0.16957945, 0.36561254, -0.19234993, -0.16987774, 0.05442733, -0.13925838, -0.09912278, -0.06849117, 0.2862709)); + target += mul(conv2d_4_tf, min16float4x4(0.33045495, -0.13048914, -0.023560356, -0.21611182, 0.031752963, 0.14722162, -0.18900181, -0.214494, -0.014231522, 0.23605579, 0.04047805, 0.4060913, -0.13969432, -0.20286381, -0.29891747, -0.043839972)); + target += mul(nconv2d_4_tf, min16float4x4(0.12433207, 0.20156589, -0.16986352, 0.07386095, -0.08681933, -0.055620465, -0.043641977, 0.25392216, -0.19010517, -0.018021587, -0.040169913, 0.3845108, -0.18094495, -0.07285529, 0.1848976, -0.24628341)); + target += mul(conv2d_7_tf, min16float4x4(-0.038218584, 0.1562106, -0.14935517, 0.14979756, -0.24085392, -0.32680586, -0.015209841, 0.31288582, 0.15819284, -0.084411524, -0.18117775, 0.16964395, 0.29338664, -0.020204993, 0.011733066, -0.03798886)); + target += mul(nconv2d_7_tf, min16float4x4(-0.020065956, -0.043856975, 0.016091857, 0.19466555, 0.16528654, 0.049655683, -0.3676622, -0.14080617, -0.094320625, 0.27908608, -0.084430434, -0.07656003, 0.19461128, 0.11947404, -0.05046522, -0.12625407)); + target += mul(conv2d_10_tf, min16float4x4(-0.013265381, -0.015804514, -0.12068759, -0.06364535, -0.040848896, -0.07602193, -0.04744431, 0.29088646, 0.1358165, 0.010972456, -0.04270195, -0.091147564, -0.2690454, 0.23030208, -0.39135924, -0.22463588)); + target += mul(nconv2d_10_tf, min16float4x4(0.20590256, 0.098045684, 0.3285928, 0.04094028, 0.12415101, 0.244203, 0.048238404, 0.17298737, 0.22513592, 0.048016686, -0.11171281, 0.12644528, -0.40468216, -0.02186692, -0.09637657, -0.20869099)); + target += min16float4(-0.01212462, -0.018702446, -0.0063916473, -0.015887083); + tex2[gxy] = target; + + target = mul(e1, min16float4x4(0.06816948, 0.34817252, -0.046539452, 0.0051957658, -0.1393289, -0.123660676, -0.28295487, -0.09683893, -0.3166085, 0.112649016, 0.016630042, 0.12213537, 0.048850413, 0.10865108, 0.36645818, -0.1570077)); + target += mul(e2, min16float4x4(0.16992034, 0.15695556, 0.23111318, -0.07952356, 0.008467285, -0.11592582, -0.18852152, 0.11257074, 0.24210866, 0.1062648, -0.101493195, 0.04611632, -0.13289067, -0.07632904, 0.012860103, -0.08678244)); + target += mul(e3, min16float4x4(0.19332299, -0.06392618, -0.18013911, 0.23211008, -0.0025107847, 0.4468814, -0.15807462, -0.27148855, 0.24238719, 0.16024797, -0.22240195, 0.2425211, 0.008685379, -0.43995225, 0.28782377, -0.04508348)); + target += mul(ne1, min16float4x4(-0.038411126, -0.0034189979, -0.10616163, -0.22397435, 0.005768774, 0.13181472, 0.091235116, 0.07068676, 0.08932033, 0.025967117, -0.053367026, -0.22340903, -0.13413511, 0.24192514, -0.011392121, -0.09885669)); + target += mul(ne2, min16float4x4(-0.13691483, 0.058308467, 0.14866434, 0.005773672, -0.16254735, -0.03150588, 0.16304344, 0.31798756, -0.22399272, 0.033883456, -0.09658691, -0.12437203, -0.117079385, 0.21686973, -0.037619635, -0.085622996)); + target += mul(ne3, min16float4x4(-0.24666454, -0.06097481, -0.08042751, -0.09151835, -0.09213628, 0.06706758, -0.12596707, 0.05328458, 0.25016794, -0.21868211, 0.22890028, -0.16557315, 0.036212686, 0.13603954, -0.20226133, -0.22868301)); + target += mul(conv2d_11_tf, min16float4x4(0.022882584, -0.023618432, 0.08065757, 0.33173925, 0.07162631, -0.010860303, 0.15222527, -0.21064946, 0.023574507, 0.06347729, -0.2955436, 0.31633475, -0.3643237, -0.087610714, -0.089636534, 0.13809934)); + target += mul(nconv2d_11_tf, min16float4x4(-0.22458415, -0.01961852, -0.014363966, -0.2820657, -0.20567393, 0.106780864, -0.43547606, 0.3259588, 0.42431846, -0.30789465, -0.053756483, 0.18392731, -0.43784657, 0.23359884, 0.25319567, -0.1464313)); + target += mul(conv2d_1_tf, min16float4x4(0.06667747, 0.011182004, 0.26176485, -0.15575507, -0.017922953, 0.0014675539, -0.13763407, -0.086996995, -0.00082739035, 0.03939667, -0.09286956, 0.29952076, 0.014103506, 0.10058367, 0.16165632, 0.23478027)); + target += mul(nconv2d_1_tf, min16float4x4(-0.1966405, 0.11404606, -0.12005759, -0.22895505, -0.0848272, 0.021871557, 0.044186037, -0.111861885, -0.16986093, -0.24633476, 0.07282808, -0.26975635, 0.34241816, 0.030470898, -0.09903839, -0.22579415)); + target += mul(conv2d_4_tf, min16float4x4(0.10059369, 0.010142443, 0.061046213, 0.6807189, 0.005402132, -0.21700516, 0.16900781, -0.09973772, -0.025505878, 0.14216411, 0.14366129, -0.02743741, 0.09240224, 0.055595424, -0.22342968, 0.32391673)); + target += mul(nconv2d_4_tf, min16float4x4(-0.24940865, -0.042881966, -0.19815244, -0.05011009, 0.32227826, 0.07563262, -0.22649106, 0.10700333, -0.14117172, 0.1359497, -0.14451554, 0.34859756, 0.060239617, 0.09917812, 0.13169186, 0.077682465)); + target += mul(conv2d_7_tf, min16float4x4(-0.0714192, 0.12607583, -0.3341241, 0.18375745, -0.18943295, 0.11634349, 0.06633747, -0.13485552, 0.045528308, 0.2432545, 0.26417813, 0.0074096527, 0.004411052, -0.5647283, 0.021793056, -0.1910634)); + target += mul(nconv2d_7_tf, min16float4x4(0.04678379, 0.15781826, -0.14137928, -0.065010436, 0.1379615, -0.07252597, -0.05457498, 0.049137864, 0.054244712, -0.24069838, -0.11444052, 0.27642834, 0.19889133, 0.31845504, -0.102143094, 0.088378325)); + target += mul(conv2d_10_tf, min16float4x4(-0.1163185, 0.19226453, -0.1896929, -0.30681732, -0.013604632, -0.12468549, 0.018667353, 0.09807849, 0.030277459, 0.18578297, 0.14520812, 0.43598676, 0.24981564, 0.22188906, -0.12707953, 0.35956743)); + target += mul(nconv2d_10_tf, min16float4x4(-0.1817424, 0.27081814, -0.16284765, 0.033412658, -0.29831278, -0.1345311, 0.27491164, 0.14552177, -0.054520354, -0.2996891, -0.1279112, -0.64904505, 0.049450837, -0.021562194, -0.6366078, 0.15545636)); + target += min16float4(0.019361967, -0.009793055, 0.03647491, -0.010136049); + tex3[gxy] = target; +} + +//!PASS 6 +//!DESC Conv-4x3x3x24, Conv-4x1x1x72 +//!IN tex1, tex2, tex3, tex10, tex4, tex8, tex9, tex11 +//!OUT tex5, tex6, tex7 +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 + +void Pass6(uint2 blockStart, uint3 threadId) { + uint2 gxy = Rmp8x8(threadId.x) + blockStart; + uint2 inputSize = GetInputSize(); + if (gxy.x >= inputSize.x || gxy.y >= inputSize.y) { + return; + } + + float2 inputPt = GetInputPt(); + float2 pos = (gxy + 0.5f) * inputPt; + + // [ a, d, g ] + // [ b, e, h ] + // [ c, f, i ] + min16float4 a1 = tex1.SampleLevel(sam, pos - inputPt, 0); + min16float4 b1 = tex1.SampleLevel(sam, pos + float2(-inputPt.x, 0), 0); + min16float4 c1 = tex1.SampleLevel(sam, pos + float2(-inputPt.x, inputPt.y), 0); + min16float4 d1 = tex1.SampleLevel(sam, pos + float2(0, -inputPt.y), 0); + min16float4 e1 = tex1.SampleLevel(sam, pos, 0); + min16float4 f1 = tex1.SampleLevel(sam, pos + float2(0, inputPt.y), 0); + min16float4 g1 = tex1.SampleLevel(sam, pos + float2(inputPt.x, -inputPt.y), 0); + min16float4 h1 = tex1.SampleLevel(sam, pos + float2(inputPt.x, 0), 0); + min16float4 i1 = tex1.SampleLevel(sam, pos + inputPt, 0); + + min16float4 na1 = max(-a1, 0); + min16float4 nb1 = max(-b1, 0); + min16float4 nc1 = max(-c1, 0); + min16float4 nd1 = max(-d1, 0); + min16float4 ne1 = max(-e1, 0); + min16float4 nf1 = max(-f1, 0); + min16float4 ng1 = max(-g1, 0); + min16float4 nh1 = max(-h1, 0); + min16float4 ni1 = max(-i1, 0); + + a1 = max(a1, 0); + b1 = max(b1, 0); + c1 = max(c1, 0); + d1 = max(d1, 0); + e1 = max(e1, 0); + f1 = max(f1, 0); + g1 = max(g1, 0); + h1 = max(h1, 0); + i1 = max(i1, 0); + + min16float4 a2 = tex2.SampleLevel(sam, pos - inputPt, 0); + min16float4 b2 = tex2.SampleLevel(sam, pos + float2(-inputPt.x, 0), 0); + min16float4 c2 = tex2.SampleLevel(sam, pos + float2(-inputPt.x, inputPt.y), 0); + min16float4 d2 = tex2.SampleLevel(sam, pos + float2(0, -inputPt.y), 0); + min16float4 e2 = tex2.SampleLevel(sam, pos, 0); + min16float4 f2 = tex2.SampleLevel(sam, pos + float2(0, inputPt.y), 0); + min16float4 g2 = tex2.SampleLevel(sam, pos + float2(inputPt.x, -inputPt.y), 0); + min16float4 h2 = tex2.SampleLevel(sam, pos + float2(inputPt.x, 0), 0); + min16float4 i2 = tex2.SampleLevel(sam, pos + inputPt, 0); + + min16float4 na2 = max(-a2, 0); + min16float4 nb2 = max(-b2, 0); + min16float4 nc2 = max(-c2, 0); + min16float4 nd2 = max(-d2, 0); + min16float4 ne2 = max(-e2, 0); + min16float4 nf2 = max(-f2, 0); + min16float4 ng2 = max(-g2, 0); + min16float4 nh2 = max(-h2, 0); + min16float4 ni2 = max(-i2, 0); + + a2 = max(a2, 0); + b2 = max(b2, 0); + c2 = max(c2, 0); + d2 = max(d2, 0); + e2 = max(e2, 0); + f2 = max(f2, 0); + g2 = max(g2, 0); + h2 = max(h2, 0); + i2 = max(i2, 0); + + min16float4 a3 = tex3.SampleLevel(sam, pos - inputPt, 0); + min16float4 b3 = tex3.SampleLevel(sam, pos + float2(-inputPt.x, 0), 0); + min16float4 c3 = tex3.SampleLevel(sam, pos + float2(-inputPt.x, inputPt.y), 0); + min16float4 d3 = tex3.SampleLevel(sam, pos + float2(0, -inputPt.y), 0); + min16float4 e3 = tex3.SampleLevel(sam, pos, 0); + min16float4 f3 = tex3.SampleLevel(sam, pos + float2(0, inputPt.y), 0); + min16float4 g3 = tex3.SampleLevel(sam, pos + float2(inputPt.x, -inputPt.y), 0); + min16float4 h3 = tex3.SampleLevel(sam, pos + float2(inputPt.x, 0), 0); + min16float4 i3 = tex3.SampleLevel(sam, pos + inputPt, 0); + + min16float4 na3 = max(-a3, 0); + min16float4 nb3 = max(-b3, 0); + min16float4 nc3 = max(-c3, 0); + min16float4 nd3 = max(-d3, 0); + min16float4 ne3 = max(-e3, 0); + min16float4 nf3 = max(-f3, 0); + min16float4 ng3 = max(-g3, 0); + min16float4 nh3 = max(-h3, 0); + min16float4 ni3 = max(-i3, 0); + + a3 = max(a3, 0); + b3 = max(b3, 0); + c3 = max(c3, 0); + d3 = max(d3, 0); + e3 = max(e3, 0); + f3 = max(f3, 0); + g3 = max(g3, 0); + h3 = max(h3, 0); + i3 = max(i3, 0); + + min16float4 conv2d_11_tf = tex10.SampleLevel(sam, pos, 0); + min16float4 nconv2d_11_tf = max(-conv2d_11_tf, 0); + conv2d_11_tf = max(conv2d_11_tf, 0); + + min16float4 conv2d_1_tf = tex4.SampleLevel(sam, pos, 0); + min16float4 nconv2d_1_tf = max(-conv2d_1_tf, 0); + conv2d_1_tf = max(conv2d_1_tf, 0); + + min16float4 conv2d_4_tf = tex8.SampleLevel(sam, pos, 0); + min16float4 nconv2d_4_tf = max(-conv2d_4_tf, 0); + conv2d_4_tf = max(conv2d_4_tf, 0); + + min16float4 conv2d_7_tf = tex9.SampleLevel(sam, pos, 0); + min16float4 nconv2d_7_tf = max(-conv2d_7_tf, 0); + conv2d_7_tf = max(conv2d_7_tf, 0); + + min16float4 conv2d_10_tf = tex11.SampleLevel(sam, pos, 0); + min16float4 nconv2d_10_tf = max(-conv2d_10_tf, 0); + conv2d_10_tf = max(conv2d_10_tf, 0); + + min16float4 conv2d_13_tf = mul(a1, min16float4x4(0.18203236, 0.08024887, -0.036568414, 0.13316368, -0.04578262, -0.06611782, -0.006320991, 0.19218548, 0.21009454, -0.08195536, 0.02459481, 0.037244156, -0.09028578, 0.025431598, 0.118399516, -0.11004066)); + conv2d_13_tf += mul(b1, min16float4x4(-0.057694096, 0.016725041, 0.09517554, -0.063389495, -0.15092854, -0.17499524, -0.023841592, -0.0021040211, -0.15481879, 0.058758404, -0.11097904, -0.026721174, 0.0025346193, 0.05679149, 0.0072498247, -0.13605994)); + conv2d_13_tf += mul(c1, min16float4x4(-0.029078262, 0.009836967, 0.07132015, 0.06620542, -0.21533649, 0.13504961, -0.026253965, 0.15687846, -0.041120164, -0.11824143, -0.03505001, -0.069189556, -0.020444538, -0.040636882, 0.104192354, 0.02525567)); + conv2d_13_tf += mul(d1, min16float4x4(-0.0033649271, 0.11870954, -0.29426005, 0.06678275, -0.21843383, -0.06478074, 0.055388454, 0.03360907, 0.15619075, 0.03552764, -0.004492958, -0.11098848, 0.0945473, -0.12231036, 0.060498584, -0.017200515)); + conv2d_13_tf += mul(e1, min16float4x4(0.11771511, 0.19074214, 0.2556847, -0.00011035888, -0.06266651, -0.18949944, -0.08458407, -0.4617736, 0.049839392, 0.0028800126, 0.112179466, -0.23129073, 0.07304365, 0.08169297, 0.010470617, -0.10990468)); + conv2d_13_tf += mul(f1, min16float4x4(0.2365061, -0.011560716, 0.040669534, 0.05682574, -0.108832434, 0.108204864, -0.016406072, -0.35809964, 0.19385669, 0.011194286, 0.022534747, -0.18770002, 0.040628985, -0.106064685, -0.12965748, -0.11940811)); + conv2d_13_tf += mul(g1, min16float4x4(-0.07578536, 0.055741407, -0.07985701, -0.08520933, -0.119309366, -0.001639899, -0.045735355, 0.060324576, -0.04602573, -0.067629695, -0.024497611, 0.11022731, 0.0866483, 0.023369456, 0.092412636, -0.15647933)); + conv2d_13_tf += mul(h1, min16float4x4(0.1151201, -0.06150153, -0.007215896, -0.027420595, -0.27713504, -0.30414173, -0.25002155, 0.04579516, 0.07746921, -0.039378557, -0.0007037489, 0.05171079, 0.04729991, -0.24362347, -0.03316277, -0.029248973)); + conv2d_13_tf += mul(i1, min16float4x4(0.08882578, -0.089215234, -0.027231896, 0.09565371, -0.040585488, -0.0666667, -0.10971792, -0.18664278, 0.08676577, 0.011609924, -0.11474831, -0.0032087977, -0.14733344, -0.013885521, -0.0600112, -0.028661741)); + conv2d_13_tf += mul(a2, min16float4x4(-0.16421804, 0.13640842, -0.053869005, -0.105430946, 0.33498198, -0.19186987, -0.044760693, 0.12338264, 0.04087762, 0.35624924, 0.16211961, -0.16837841, -0.21358813, 0.07136877, 0.09507147, 0.15890902)); + conv2d_13_tf += mul(b2, min16float4x4(-0.3021354, -0.3319794, 0.070228204, 0.1157857, -0.23864768, -0.124694765, -0.035166927, -0.2196196, 0.11144565, 0.15449396, 0.31777796, 0.23201036, 0.36269313, 0.0791044, -0.14027423, -0.10298774)); + conv2d_13_tf += mul(c2, min16float4x4(0.0045441133, 0.14908041, -0.04037237, 0.012396483, -0.41045487, -0.049013153, -0.25163352, -0.18674599, -0.020136787, -0.04309944, 0.16324212, 0.20724443, 0.0013537789, 0.10984782, -0.050586786, 0.07564281)); + conv2d_13_tf += mul(d2, min16float4x4(-0.35524195, -0.08884062, -0.061092835, 0.0016606712, -0.18841584, -0.28330895, 0.110710636, -0.20210983, 0.01599891, -0.019640112, -0.06881855, -0.2822387, 0.16723692, 0.42387784, 0.17316435, 0.014779502)); + conv2d_13_tf += mul(e2, min16float4x4(-0.14352255, 0.2557878, 0.14022757, -0.09769558, -0.08192019, 0.4160667, 0.20182422, -0.29740554, -0.16924635, 0.044684824, -0.21592674, -0.04393559, -0.44846448, -0.2268265, -0.15033214, -0.1552571)); + conv2d_13_tf += mul(f2, min16float4x4(-0.46804324, -0.05876729, 0.0023225946, -0.1399195, -0.12917824, 0.12800436, 0.5672086, 0.42298177, -0.25502345, -0.15043756, -0.010454711, -0.16799574, 0.1695203, 0.31919575, 0.090758204, -0.03608345)); + conv2d_13_tf += mul(g2, min16float4x4(-0.20859653, -0.025662629, 0.11013811, 0.021071844, -0.21565554, -0.08014497, -0.041803278, 0.15999684, -0.09659372, -0.2930284, 0.22263159, -0.058361106, -0.06474458, -0.18948506, -0.22297342, 0.002085207)); + conv2d_13_tf += mul(h2, min16float4x4(-0.25466987, 0.07562997, -0.046997566, 0.01815494, 0.015587753, 0.19885786, 0.17028151, -0.20973559, -0.13089986, 0.056037027, -0.16056974, -0.09570157, 0.36515233, 0.2177508, -0.19389395, 0.042368103)); + conv2d_13_tf += mul(i2, min16float4x4(-0.09177028, 0.029719152, 0.035980605, -0.111842036, -0.14203559, -0.0016779151, -0.23984708, -0.24259119, -0.32218066, -0.16303101, -0.042665064, 0.018674236, 0.132396, -0.07117317, -0.11266681, -0.25140917)); + conv2d_13_tf += mul(a3, min16float4x4(-0.2254921, -0.089444794, -0.03250626, -0.002422312, -0.07599525, 0.06057337, 0.09297158, -0.13625564, -0.05718329, 0.1393445, -0.14238319, -0.035561938, 0.10357985, 0.14509755, -0.05125032, 0.071264446)); + conv2d_13_tf += mul(b3, min16float4x4(0.14345558, -0.13649228, 0.07141237, -0.31665677, -0.106410414, -0.024022767, 0.022847228, -0.066274576, 0.27855787, 0.27377915, 0.100737795, 0.2585287, 0.065262236, 0.3338305, 0.013705893, 0.15107758)); + conv2d_13_tf += mul(c3, min16float4x4(0.24887003, 0.27924842, 0.011750549, 0.02100809, -0.060978264, 0.09022114, 0.10060977, -0.117189266, -0.064989, 0.050291102, 0.02154075, 0.07428455, 0.0128874695, -0.0824151, -0.0955003, 0.1240542)); + conv2d_13_tf += mul(d3, min16float4x4(0.09787086, -0.038460266, -0.012216873, 0.020269781, -0.14274825, -0.10365878, 0.107120685, 0.005830931, 0.18160833, -0.039512586, 0.054537058, -0.10175313, 0.2583083, 0.12110453, 0.11164319, -0.097267024)); + conv2d_13_tf += mul(e3, min16float4x4(0.04403219, -0.06616097, -0.1881836, -0.17728293, -0.30001318, 0.14179994, 0.077847786, 0.009201645, 0.2055038, 0.10847946, 0.034566265, 0.0823046, 0.016860636, -0.029249087, -0.16692844, 0.15714505)); + conv2d_13_tf += mul(f3, min16float4x4(0.01654197, -0.005030059, 0.15659711, 0.029457249, -0.10084003, -0.17541635, 0.20056525, 0.11890777, 0.041007854, -0.021843065, -0.047474306, 0.02461869, 0.09578964, -0.054728534, -0.022951778, 0.1384323)); + conv2d_13_tf += mul(g3, min16float4x4(-0.17401876, 0.0050307186, -0.14960738, -0.06744025, -0.026341015, -0.015185451, 0.097973764, 0.01230041, 0.043848213, -0.022325305, -0.01173514, -0.12744233, -0.1192904, -0.019170178, 0.16593695, -0.11961721)); + conv2d_13_tf += mul(h3, min16float4x4(0.16905174, -0.05465901, -0.10304148, 0.06422409, -0.06595216, 0.032311443, 0.06506821, 0.06866468, 0.12749052, 0.2812222, 0.10223055, -0.009964554, 0.10145132, 0.05452548, 0.21845295, 0.060436632)); + conv2d_13_tf += mul(i3, min16float4x4(0.009076048, -0.075771615, -0.010236168, -0.049228482, -0.009111011, 0.0032872239, 0.030809326, -0.021389242, -0.13207865, -0.20758687, 0.06795314, 0.16716966, 0.022448925, 0.005127875, 0.14822717, 0.1543517)); + conv2d_13_tf += mul(na1, min16float4x4(0.15177163, -0.059483033, -0.061815593, -0.048359588, 0.08666249, 0.01303385, -0.0797276, 0.00045918894, 0.044986565, -0.16032507, 0.001627205, -0.11240742, 0.36031052, 0.3453977, 0.20082399, -0.0872419)); + conv2d_13_tf += mul(nb1, min16float4x4(0.20732729, 0.29925603, -0.027490204, -0.07813189, -0.16492629, 0.13322815, 0.0031292376, 0.041497275, -0.08320837, 0.10200068, -0.17992872, -0.06903506, 0.12075557, 0.10240156, 0.17685287, -0.07302424)); + conv2d_13_tf += mul(nc1, min16float4x4(0.09832397, 0.072229534, -0.038651302, 0.23663157, -0.049382553, -0.11816951, -0.095177956, -0.0063895187, -0.22133054, 0.027618079, -0.010867105, 0.20221426, -0.055768233, 0.123813964, -0.04770652, 0.031318672)); + conv2d_13_tf += mul(nd1, min16float4x4(0.19019139, -0.0055707553, 0.26110023, 0.053353935, -0.09224678, 0.103274055, 0.054068115, -0.028470352, -0.050636273, 0.044128064, -0.1790452, -0.01937518, -0.22987902, 0.13224003, 0.06837358, -0.21524249)); + conv2d_13_tf += mul(ne1, min16float4x4(-0.06441057, -0.14875272, 0.1966193, -0.19311902, 0.116319604, -0.015221862, 0.22331011, -0.12665007, 0.1492529, -0.060963593, -0.13987945, -0.00267954, 0.17791282, -0.017524656, 0.009128157, -0.19969128)); + conv2d_13_tf += mul(nf1, min16float4x4(-0.15118724, -0.02174076, 0.18955654, 0.004134554, -0.074481554, -0.022116778, -0.23729491, -0.21471047, -0.17819612, 0.13824348, -0.0189012, 0.2410327, 0.122907236, 0.115833536, 0.07078602, 0.1497625)); + conv2d_13_tf += mul(ng1, min16float4x4(-0.0030512493, -0.004724951, 0.13259876, 0.009409425, -0.09696517, -0.12920079, -0.13467522, -0.05229473, -0.03711706, -0.038291495, -0.1493357, 0.09193146, -0.11654958, -0.1384159, -0.0809269, 0.12138653)); + conv2d_13_tf += mul(nh1, min16float4x4(-0.111716144, -0.033208963, 0.19639781, -0.28904846, 0.043729085, 0.016957026, -0.078926295, -0.19079417, 0.06363828, -0.019629745, 0.058766138, -0.120303996, -0.15203112, -0.16788657, -0.15019903, -0.20598294)); + conv2d_13_tf += mul(ni1, min16float4x4(0.09737031, 0.19906493, 0.31577814, 0.09887659, -0.10737645, 0.03927124, 0.008865094, 0.030515334, -0.03767332, 0.19419806, 0.052343797, -0.12595782, 0.018560758, -0.004252203, 0.12685028, -0.19064935)); + conv2d_13_tf += mul(na2, min16float4x4(-0.107926846, 0.05654491, 0.039178263, -0.022938857, -0.055884767, 0.01403891, 0.040060706, -0.0876108, -0.08530536, 0.035486717, -0.1397322, -0.111439094, 0.3098693, 0.031957068, -0.1323169, 0.036736827)); + conv2d_13_tf += mul(nb2, min16float4x4(-0.042637993, -0.13947937, -0.06313642, -0.013281999, -0.07746704, -0.0033614477, 0.062081654, -0.028974544, -0.09252038, 0.23787987, -0.03051402, 0.08857487, -0.10345242, 0.08111023, 0.012858327, 0.025468932)); + conv2d_13_tf += mul(nc2, min16float4x4(-0.057991188, 0.06572571, -0.17195612, -0.18226011, 0.13167764, -0.029910656, 0.07416073, 0.011874738, 0.020921603, 0.1790944, -0.02713754, -0.04678265, 0.0025504003, -0.07831189, 0.0022889362, 0.17452945)); + conv2d_13_tf += mul(nd2, min16float4x4(-0.08273035, -0.06628758, 0.09288723, 0.17525311, -0.015099176, -0.02920585, 0.01664239, 0.16360165, -0.058821842, 0.023668878, 0.13803177, 0.05805197, -0.033553623, -0.020296576, -0.2126249, 0.054712847)); + conv2d_13_tf += mul(ne2, min16float4x4(0.11607657, 0.09721635, 0.076664194, 0.107737765, -0.18090104, -0.09323497, 0.1018825, 0.025112988, -0.037965916, 0.07314205, 0.16523585, -0.16451308, 0.011332593, 0.05381852, 0.053742763, -0.051402804)); + conv2d_13_tf += mul(nf2, min16float4x4(0.08998201, -0.09690652, -0.090980336, 0.21645999, -0.1421605, 0.017344419, -0.080088496, -0.1686495, 0.13406368, 0.004237983, 0.028970357, -0.015848784, -0.07229926, -0.08199748, 0.14972275, 0.11688227)); + conv2d_13_tf += mul(ng2, min16float4x4(-0.10923993, -0.006186229, -0.0059918985, -0.056261536, 0.12305135, 0.07601222, 0.015556293, 0.039497726, 0.004694121, 0.03006972, -0.11686323, -0.1083031, -0.053210545, 0.06765771, 0.1847543, 0.12722884)); + conv2d_13_tf += mul(nh2, min16float4x4(-0.15110816, -0.114151604, 0.06755774, 0.1535812, -0.0055134855, 0.124444366, 0.116650686, 0.015837835, -0.13255565, -0.023659749, 0.012672263, -0.014328633, -0.25721112, 0.03517644, 0.07895924, 0.017762167)); + conv2d_13_tf += mul(ni2, min16float4x4(-0.0048434106, -0.15848884, 0.07007013, -0.0040173456, 0.12461628, -0.006840197, 0.054776177, 0.030113375, 0.011075732, -0.12137928, 0.039907288, 0.041261338, -0.03539033, -0.010571816, 0.17591824, 0.07626049)); + conv2d_13_tf += mul(na3, min16float4x4(-0.09215494, -0.047397707, 0.020372266, -0.03961589, -0.2969749, -0.23441714, 0.041512486, -0.23838238, 0.15105574, 0.030688843, 0.10364508, -0.037372112, 0.24514282, 0.11799978, -0.25672802, -0.05064504)); + conv2d_13_tf += mul(nb3, min16float4x4(-0.22321941, -0.22637981, 0.12784286, -0.15949993, -0.1747607, 0.019964136, -0.101212226, -0.14332725, -0.0040852833, 0.13991846, -0.121760346, -0.074741244, -0.14598946, 0.017030315, -0.21471639, 0.023562988)); + conv2d_13_tf += mul(nc3, min16float4x4(-0.025941253, -0.085331805, 0.006736805, 0.080889955, -0.06974209, -0.20366986, -0.2243817, -0.18153073, -0.0024152526, 0.047323234, 0.03407195, 0.016644841, -0.0060426793, -0.1146607, 0.11816627, -0.09477427)); + conv2d_13_tf += mul(nd3, min16float4x4(-0.11221949, -0.016993113, -0.028873868, 0.30510077, -0.10090775, -0.56358117, -0.2178131, -0.3253011, 0.05903533, 0.23069671, -0.040006876, -0.2242038, -0.10916342, -0.038909998, -0.081489064, 0.06539624)); + conv2d_13_tf += mul(ne3, min16float4x4(-0.059550002, -0.07048971, 0.08075795, 0.07341893, 0.08720143, -0.08745607, -0.28628471, 0.004085622, -0.059510656, -0.07080941, -0.17805275, 0.010445313, 0.08262345, 0.14971328, 0.086313516, 0.4270992)); + conv2d_13_tf += mul(nf3, min16float4x4(-0.25829327, -0.25821465, -0.025910528, -0.1256417, -0.32173184, -0.012251011, -0.31182033, -0.17723739, 0.05439974, -0.0018167618, 0.06974409, -0.024687098, 0.05163715, 0.011181801, 0.060559656, 0.18320788)); + conv2d_13_tf += mul(ng3, min16float4x4(0.048055783, 0.030901788, 0.00014199098, -0.015663194, -0.27395675, -0.1374474, 0.055429243, 0.09942114, -0.037852254, -0.033255827, 0.022523645, 0.04666904, 0.16599222, -0.02004086, 0.21397619, -0.11373404)); + conv2d_13_tf += mul(nh3, min16float4x4(-0.23445702, -0.06371413, -0.08418856, 0.06907252, 0.20780656, -0.13808912, 0.018577656, -0.0046262434, 0.09724245, -0.114031695, 0.022883652, 0.107561804, -0.010228, 0.0033352477, 0.12142382, -0.035946723)); + conv2d_13_tf += mul(ni3, min16float4x4(0.058773417, -0.06617424, -0.13876313, -0.007238876, -0.17449926, 0.14130935, -0.17021981, 0.09241347, 0.018518088, 0.085447155, -0.14430992, 0.035074715, -0.02784563, 0.15934117, -0.00036379634, -0.040411446)); + conv2d_13_tf += min16float4(-0.0258258, -0.014007201, -0.0051976936, 0.023554644); + min16float4 nconv2d_13_tf = max(-conv2d_13_tf, 0); + conv2d_13_tf = max(conv2d_13_tf, 0); + + min16float4 target = mul(e1, min16float4x4(0.13381699, 0.17966591, -0.0866034, -0.15282217, -0.2567282, -0.38080183, 0.10091161, 0.32172382, -0.064547606, -0.08161712, -0.033353675, -0.0019234467, 0.027740227, 0.2277078, 0.06759129, -0.22699283)); + target += mul(e2, min16float4x4(-0.122093834, 0.20621717, -0.08142724, 0.16477586, 0.4863212, -0.24032472, 0.00055996195, 0.50562304, 0.028121283, 0.56215876, 0.014577866, 0.06960302, -0.15964645, 0.14526807, -0.026474794, -0.02554081)); + target += mul(e3, min16float4x4(-0.101622745, 0.022395104, -0.14208415, 0.09508211, 0.20496333, 0.11371943, -0.024784304, 0.09519364, 0.09233463, 0.03117482, -0.15262024, -0.16956648, -0.2432608, -0.12877996, -0.13148616, 0.043081667)); + target += mul(ne1, min16float4x4(-0.28086182, -0.15846887, -0.058738094, -0.181707, -0.018847898, 0.05197007, 0.09753647, -0.19714034, -0.062462445, -0.17604835, 0.1268098, 0.15334699, 0.05568127, 0.16867611, -0.1686486, 0.28579247)); + target += mul(ne2, min16float4x4(0.20252296, -0.27393097, 0.06578763, -0.12628423, -0.10547165, 0.030740904, -0.19412865, -0.034658667, -0.09081653, -0.19958268, 0.16915733, 0.056093715, 0.10596871, -0.1742866, 0.004890009, 0.19515324)); + target += mul(ne3, min16float4x4(0.32077652, -0.004434404, -0.12717858, -0.13544025, -0.450333, 0.04072708, 0.04316467, -0.2578049, -0.011932833, 0.18828999, 0.12326536, -0.016795376, -0.0054118615, 0.061453808, 0.28015187, 0.13463841)); + target += mul(conv2d_11_tf, min16float4x4(0.08942177, -0.0021343376, 0.23693596, -0.15413974, -0.32839566, -0.010874302, 0.033822935, 0.038676813, 0.18920816, 0.019961799, -0.055697896, -0.042120066, 0.10387084, 0.047366753, 0.17899887, -0.071130194)); + target += mul(nconv2d_11_tf, min16float4x4(0.0010777018, -0.071475126, -0.16156957, -0.08781234, -0.08701292, 0.29084647, -0.34587428, 0.06969663, 0.036580127, 0.106745, -0.1534462, 0.106189206, -0.22758242, 0.20691736, -0.018554503, -0.056773946)); + target += mul(conv2d_1_tf, min16float4x4(0.14826776, -0.03700497, 0.066144, 0.023859248, -0.16708666, -0.23908418, 0.062023632, -0.16278005, 0.06265635, -0.039846748, -0.13978398, -0.027952245, 0.099891245, 0.18235108, 0.00991435, 0.0423486)); + target += mul(nconv2d_1_tf, min16float4x4(-0.17948383, -0.082759954, 0.10543674, -0.18660031, 0.0664088, -0.06837087, 0.04300318, 0.011699623, -0.017162412, -0.030628186, 0.07547453, 0.20060332, -0.19182351, 0.04914753, 0.040280227, -0.12417484)); + target += mul(conv2d_4_tf, min16float4x4(0.04074336, -0.041421015, -0.0372822, 0.1647266, -0.13993263, 0.0029407872, -0.39398977, -0.1778468, 0.21322449, 0.19134948, -0.02818874, 0.226251, 0.06352273, 0.12620094, 0.24221466, 0.20657893)); + target += mul(nconv2d_4_tf, min16float4x4(-0.094572894, -0.046852108, 0.21210444, -0.14082888, -0.050984625, -0.13443558, 0.24309658, 0.1573335, 0.21941295, 0.11642813, 0.09684106, -0.08597462, 0.15502413, -0.018070435, 0.1292023, -0.1557655)); + target += mul(conv2d_7_tf, min16float4x4(0.025215387, 0.16676718, -0.068287216, 0.017648363, 0.2779579, 0.059142746, -0.096408874, 0.22609432, 0.20962398, 0.24879578, 0.023621194, -0.29692242, 0.02272032, -0.33367038, 0.15799981, -0.1699598)); + target += mul(nconv2d_7_tf, min16float4x4(0.08816878, 0.076234445, -0.06670541, 0.024926793, -0.12045598, 0.07443171, 0.22081238, -0.044906516, -0.02448027, -0.22067828, -0.016471038, 0.21801811, 0.16276583, 0.34590468, -0.18487914, 0.0554853)); + target += mul(conv2d_10_tf, min16float4x4(-0.085593045, -0.002904318, 0.049969394, -0.06931361, -0.10722648, -0.08499641, -0.25997344, 0.22650665, 0.069008924, -0.23179024, 0.20058884, -0.20237185, -0.1606995, 0.0758858, -0.09946377, -0.21032207)); + target += mul(nconv2d_10_tf, min16float4x4(0.11210572, 0.055658836, 0.041539114, 0.078087114, -0.060435783, 0.08331363, 0.07356019, 0.0842336, -0.38098484, 0.020591227, -0.45916042, 0.06386686, -0.19348675, 0.041925576, -0.23489946, -0.06711732)); + target += mul(conv2d_13_tf, min16float4x4(-0.13721304, 0.15404533, 0.102312036, -0.090253755, 0.08690545, 0.034154307, 0.07618604, -0.15844443, -0.10604342, 0.2646684, -0.08719668, 0.19331944, 0.10569642, -0.058054388, -0.0110980645, -0.08710107)); + target += mul(nconv2d_13_tf, min16float4x4(0.15567884, -0.11589786, 0.031855986, 0.005064268, 0.37850487, 0.30044487, -0.2604449, 0.061879188, -0.015081224, -0.30759993, -0.07571204, -0.0077929585, -0.08748009, 0.22546281, -0.06377379, 0.435342)); + target += min16float4(0.0053140894, -0.030208405, 0.04287835, -0.059097543); + tex5[gxy] = target; + + target = mul(e1, min16float4x4(0.0029025443, 0.021165721, 0.0070854356, 0.065646365, 0.024636142, 0.20825955, -0.0917655, -0.1706138, -0.1827491, 0.13347003, 0.12910214, 0.06828513, -0.026193604, -0.11451178, 0.0356333, -0.08071165)); + target += mul(e2, min16float4x4(-0.027241195, 0.032633994, -0.17490302, -0.5352789, -0.15734912, 0.24714436, 0.029301014, 0.212763, -0.051665317, -0.06783505, -0.040298667, 0.041179724, 0.49683514, -0.35600296, -0.2518442, -0.22965558)); + target += mul(e3, min16float4x4(-0.061614696, -0.10463926, 0.1594845, 0.036565617, 0.09095015, -0.15100475, -0.09242749, 0.08335822, -0.027257469, 0.4156707, 0.03322028, 0.19685929, 0.07034635, 0.10204465, 0.03657313, 0.30920812)); + target += mul(ne1, min16float4x4(-0.20980133, -0.054115582, 0.031674277, -0.040077273, -0.21693806, 0.016596884, -0.029177245, -0.16924128, 0.121823296, -0.0004884774, 0.10644538, 0.068388954, 0.16517027, -0.12152921, -0.18299894, -0.17595083)); + target += mul(ne2, min16float4x4(-0.0006413291, -0.09444853, 0.15260176, 0.23014128, 0.09366626, 0.06947763, 0.04956597, -0.07001088, -0.075523324, 0.16111156, -0.11700089, 0.14528704, -0.096407495, 0.027310526, -0.03946532, 0.15302157)); + target += mul(ne3, min16float4x4(0.086061105, -0.0070365844, -0.25230658, 0.18741103, -0.36380208, -0.058444727, 0.25284684, -0.26617825, -0.08817363, -0.12209333, 0.011920746, -0.031505488, -0.21880315, 0.16762236, 0.14518112, 0.13803998)); + target += mul(conv2d_11_tf, min16float4x4(-0.17088315, -0.06812898, -0.085912764, 0.25550255, -0.26439053, 0.23305506, 0.18186118, -0.06186191, 0.0075220955, 0.10316868, 0.04271979, -0.008083033, -0.19474187, -0.06700431, 0.15485007, -0.11886802)); + target += mul(nconv2d_11_tf, min16float4x4(0.06597312, -0.31435877, -0.08179224, -0.2568261, 0.29904976, 0.21664406, -0.15343861, -0.11589945, 0.12654455, -0.042093027, -0.17231914, -0.26832506, -0.12008876, 0.11483079, 0.10222754, 0.12562539)); + target += mul(conv2d_1_tf, min16float4x4(-0.09949413, 0.01479024, -0.16933955, 0.025359191, -0.2210058, -0.19663176, 0.19453603, -0.111461386, -0.12529027, 0.14243664, 0.122677036, -0.101476125, 0.011010597, -0.014422488, -0.048979994, 0.03657997)); + target += mul(nconv2d_1_tf, min16float4x4(-0.06923051, -0.1223873, 0.021781938, 0.1323696, -0.11582021, -0.018292433, 0.07495496, 0.043008957, 0.0070410958, -0.14431225, -0.06380941, -0.17411429, 0.052226365, 0.021460915, 0.097367965, 0.37138346)); + target += mul(conv2d_4_tf, min16float4x4(0.16420697, 0.008790036, 0.17185563, -0.025144322, -0.108827055, -0.13030754, -0.14254087, 0.05208047, 0.03751449, 0.06774824, -0.07746288, 0.2250457, 0.039049506, 0.101244815, -0.18138403, -0.12212992)); + target += mul(nconv2d_4_tf, min16float4x4(-0.05138809, 0.19150224, 0.05698308, 0.015970863, 0.23931703, -0.085039265, -0.18294281, 0.03647365, -0.041568805, -0.2920049, 0.013272974, -0.41181135, -0.08101046, 0.028989056, 0.2952233, 0.16312017)); + target += mul(conv2d_7_tf, min16float4x4(0.093839854, -0.038790308, -0.086285874, -0.17890124, -0.2598202, 0.069419555, -0.0065180454, 0.01453452, -0.090191156, 0.012278203, -0.13148692, -0.025104592, 0.09296121, -0.1833281, 0.074660525, -0.031280298)); + target += mul(nconv2d_7_tf, min16float4x4(-0.05336347, 0.08608969, -0.074649446, 0.014608438, 0.22511393, 0.18610351, -0.0029040743, 0.096127085, -0.20254624, 0.14036441, -0.005226189, 0.055212848, 0.20482111, 0.06645607, -0.12018032, 0.062814355)); + target += mul(conv2d_10_tf, min16float4x4(0.13722958, -0.077169575, 0.07269382, 0.20902501, -0.103985704, -0.21184038, -0.12424109, -0.3059887, -0.185413, -0.1964241, -0.14370187, 0.07646031, -0.057924826, 0.28884047, -0.06701312, -0.14548934)); + target += mul(nconv2d_10_tf, min16float4x4(0.14129579, 0.12990993, -0.08791828, 0.07986884, -0.006362554, 0.005971629, 0.016816271, 0.075642705, -0.060138028, 0.13658188, 0.0020529197, -0.38745758, -0.16191563, 0.20532359, 0.34441018, 0.0071060034)); + target += mul(conv2d_13_tf, min16float4x4(-0.03236983, -0.08242242, 0.065607354, -0.072457135, 0.024461512, 0.15522943, 0.120296456, 0.052112654, 0.21442589, 0.19565494, 0.06760742, 0.37604833, 0.097620994, -0.002347599, 0.09269131, -0.34238556)); + target += mul(nconv2d_13_tf, min16float4x4(0.3276042, -0.17974046, -0.095954694, -0.123248585, 0.08306674, -0.3486506, -0.4620704, -0.40518835, -0.17438394, 0.24350463, 0.05616052, -0.14715664, 0.2078043, -0.007834002, -0.21199054, 0.026597755)); + target += min16float4(-0.015380624, 0.018387195, 0.052286647, 0.055403516); + tex6[gxy] = target; + + target = mul(e1, min16float4x4(0.029018598, -0.09923186, -0.1346201, -0.084818475, 0.013764684, 0.054601744, -0.023713779, -0.16826102, 0.038605224, -0.17664196, -0.16562279, 0.14602208, -0.046339583, 0.08062112, 0.20166601, -0.15399997)); + target += mul(e2, min16float4x4(-0.022488657, 0.28881705, 0.22283012, -0.1935156, 0.22948948, -0.26604095, 0.12130448, 0.35176682, -0.044228308, -0.14734231, 0.07643742, -0.008511517, 0.04313213, -0.03179344, 0.048205808, -0.046295088)); + target += mul(e3, min16float4x4(-0.2531207, 0.10446124, 0.12730333, -0.13316457, 0.2988587, 0.025091104, -0.00482534, 0.037484948, -0.04006528, 0.14588606, -0.2078635, -0.18636562, 0.112230495, 0.15386717, -0.11122423, 0.1115416)); + target += mul(ne1, min16float4x4(0.058421213, 0.086035125, -0.042249937, -0.22377387, -0.055913106, 0.020280339, 0.10572877, 0.124147646, -0.16199678, 0.25662583, 0.051422223, -0.11681551, 0.3789257, -0.21530285, -0.18586366, -0.2222266)); + target += mul(ne2, min16float4x4(-0.11123776, 0.056422785, -0.20566264, -0.07211227, -0.011873865, 0.30742383, 0.1306618, 0.06808572, 0.068643585, -0.045474447, -0.11596973, 0.0069175013, 0.0331586, -0.013221628, -0.089815594, -0.17750767)); + target += mul(ne3, min16float4x4(0.45630908, 0.11607409, -0.05464286, 0.013246808, -0.28643015, 0.025237702, -0.1445959, 0.05237954, -0.07100623, -0.34417382, 0.13903524, 0.21305767, -0.17371523, -0.13203263, -0.09479281, 0.018392125)); + target += mul(conv2d_11_tf, min16float4x4(-0.018931253, -0.14936836, -0.06770882, 0.10720343, -0.10476732, 0.1157603, -0.2245781, 0.23242487, -0.21631289, 0.12723672, 0.4190526, 0.38829032, -0.192142, 0.034754496, -0.1103798, -0.17207326)); + target += mul(nconv2d_11_tf, min16float4x4(0.10311498, 0.08424212, -0.048713315, -0.2784966, 0.034522116, -0.13184515, -0.22852737, 0.003882436, 0.36972147, -0.21263883, -0.3308556, 0.10331102, 0.2462766, -0.12618823, -0.040451203, 0.03362719)); + target += mul(conv2d_1_tf, min16float4x4(-0.0150432745, 0.11757923, 0.23359092, -0.19003578, -0.22206408, 0.15738077, -0.14019541, -0.14201044, 0.19273758, -0.003298494, -0.16530107, 0.17979017, 0.24293105, -0.049160067, -0.14296743, -0.12812854)); + target += mul(nconv2d_1_tf, min16float4x4(-0.0020534277, 0.016410163, -0.012038507, -0.0028629426, 0.016464395, 0.0755886, 0.20384903, -0.029324949, -0.13087441, 0.2138074, 0.03701677, -0.1671415, -0.10499825, -0.042930905, -0.007613907, -0.05984843)); + target += mul(conv2d_4_tf, min16float4x4(-0.07029106, 0.05386552, 0.101365924, -0.008048512, -0.090149835, 0.024272785, -0.16436198, 0.2721913, 0.17460534, 0.0034964401, -0.023265982, -0.0120567605, -0.10151709, 0.059922412, -0.13204409, -0.36116782)); + target += mul(nconv2d_4_tf, min16float4x4(-0.12569033, 0.08523279, -0.047763485, -0.0025170774, -0.108375974, -0.032045245, 0.232404, -0.24801816, -0.09875204, -0.14990453, -0.10958757, -0.23116525, 0.015989894, -0.09210713, 0.19653663, 0.14138049)); + target += mul(conv2d_7_tf, min16float4x4(0.17831743, 0.04722249, 0.22804007, -0.29099363, 0.29851902, 0.2542661, 0.0067702304, 0.17606215, 0.25847578, -0.3118978, 0.122089565, -0.07010249, 0.014281751, 0.16585219, -0.1659864, -0.30643156)); + target += mul(nconv2d_7_tf, min16float4x4(0.19042191, -0.028259574, -0.009187334, 0.21004388, -0.08070036, -0.07838277, -0.023598602, 0.13891627, -0.10481482, 0.05874796, -0.256131, 0.19640857, 0.19515458, -0.07920633, 0.020810237, 0.11040215)); + target += mul(conv2d_10_tf, min16float4x4(-0.093089096, -0.09344762, 0.24232084, 0.21563776, -0.23910145, 0.09092736, 0.12202717, 0.27240792, -0.008079913, 0.07417433, -0.11870247, -0.35385913, 0.107840456, 0.033915944, 0.16016287, 0.023731219)); + target += mul(nconv2d_10_tf, min16float4x4(0.21967673, 0.09896617, 0.04236673, -0.20100762, 0.02077549, -0.075936705, 0.008608214, -0.09693712, 0.44249, -0.31763947, -0.027664369, 0.6166134, -0.43993565, -0.025720617, -0.3275949, 0.041507874)); + target += mul(conv2d_13_tf, min16float4x4(0.20305479, -0.06975863, -0.18130508, -0.11641104, 0.119906515, -0.27588886, -0.15420493, -0.1399163, 0.075970694, -0.16776691, 0.05045285, 0.44775927, -0.036058784, -0.28161573, 0.1877619, 0.10209392)); + target += mul(nconv2d_13_tf, min16float4x4(-0.4250348, -0.007887921, 0.307136, -0.18842702, 0.30411714, 0.05816079, 0.26664746, -0.007951849, -0.18454021, 0.30914694, -0.34967366, -0.18838291, 0.06042888, 0.1902336, -0.062413342, 0.015706044)); + target += min16float4(-0.0011628491, -0.0046341973, 0.0007886035, -0.04435556); + tex7[gxy] = target; +} + +//!PASS 7 +//!DESC Conv-4x3x3x24 +//!IN tex5, tex6, tex7 +//!OUT conv1ups, conv1ups1 +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 + +void Pass7(uint2 blockStart, uint3 threadId) { + uint2 gxy = Rmp8x8(threadId.x) + blockStart; + + const uint2 outputSize = GetOutputSize(); + if (gxy.x >= outputSize.x || gxy.y >= outputSize.y) { + return; + } + + float2 outputPt = GetOutputPt(); + const float2 pos = (gxy + 0.5f) * outputPt; + + outputPt *= 2; + + // [ a, d, g ] + // [ b, e, h ] + // [ c, f, i ] + min16float4 a1 = tex5.SampleLevel(sam1, pos - outputPt, 0); + min16float4 b1 = tex5.SampleLevel(sam1, pos + float2(-outputPt.x, 0), 0); + min16float4 c1 = tex5.SampleLevel(sam1, pos + float2(-outputPt.x, outputPt.y), 0); + min16float4 d1 = tex5.SampleLevel(sam1, pos + float2(0, -outputPt.y), 0); + min16float4 e1 = tex5.SampleLevel(sam1, pos, 0); + min16float4 f1 = tex5.SampleLevel(sam1, pos + float2(0, outputPt.y), 0); + min16float4 g1 = tex5.SampleLevel(sam1, pos + float2(outputPt.x, -outputPt.y), 0); + min16float4 h1 = tex5.SampleLevel(sam1, pos + float2(outputPt.x, 0), 0); + min16float4 i1 = tex5.SampleLevel(sam1, pos + outputPt, 0); + + min16float4 na1 = max(-a1, 0); + min16float4 nb1 = max(-b1, 0); + min16float4 nc1 = max(-c1, 0); + min16float4 nd1 = max(-d1, 0); + min16float4 ne1 = max(-e1, 0); + min16float4 nf1 = max(-f1, 0); + min16float4 ng1 = max(-g1, 0); + min16float4 nh1 = max(-h1, 0); + min16float4 ni1 = max(-i1, 0); + + a1 = max(a1, 0); + b1 = max(b1, 0); + c1 = max(c1, 0); + d1 = max(d1, 0); + e1 = max(e1, 0); + f1 = max(f1, 0); + g1 = max(g1, 0); + h1 = max(h1, 0); + i1 = max(i1, 0); + + min16float4 a2 = tex6.SampleLevel(sam1, pos - outputPt, 0); + min16float4 b2 = tex6.SampleLevel(sam1, pos + float2(-outputPt.x, 0), 0); + min16float4 c2 = tex6.SampleLevel(sam1, pos + float2(-outputPt.x, outputPt.y), 0); + min16float4 d2 = tex6.SampleLevel(sam1, pos + float2(0, -outputPt.y), 0); + min16float4 e2 = tex6.SampleLevel(sam1, pos, 0); + min16float4 f2 = tex6.SampleLevel(sam1, pos + float2(0, outputPt.y), 0); + min16float4 g2 = tex6.SampleLevel(sam1, pos + float2(outputPt.x, -outputPt.y), 0); + min16float4 h2 = tex6.SampleLevel(sam1, pos + float2(outputPt.x, 0), 0); + min16float4 i2 = tex6.SampleLevel(sam1, pos + outputPt, 0); + + min16float4 na2 = max(-a2, 0); + min16float4 nb2 = max(-b2, 0); + min16float4 nc2 = max(-c2, 0); + min16float4 nd2 = max(-d2, 0); + min16float4 ne2 = max(-e2, 0); + min16float4 nf2 = max(-f2, 0); + min16float4 ng2 = max(-g2, 0); + min16float4 nh2 = max(-h2, 0); + min16float4 ni2 = max(-i2, 0); + + a2 = max(a2, 0); + b2 = max(b2, 0); + c2 = max(c2, 0); + d2 = max(d2, 0); + e2 = max(e2, 0); + f2 = max(f2, 0); + g2 = max(g2, 0); + h2 = max(h2, 0); + i2 = max(i2, 0); + + min16float4 a3 = tex7.SampleLevel(sam1, pos - outputPt, 0); + min16float4 b3 = tex7.SampleLevel(sam1, pos + float2(-outputPt.x, 0), 0); + min16float4 c3 = tex7.SampleLevel(sam1, pos + float2(-outputPt.x, outputPt.y), 0); + min16float4 d3 = tex7.SampleLevel(sam1, pos + float2(0, -outputPt.y), 0); + min16float4 e3 = tex7.SampleLevel(sam1, pos, 0); + min16float4 f3 = tex7.SampleLevel(sam1, pos + float2(0, outputPt.y), 0); + min16float4 g3 = tex7.SampleLevel(sam1, pos + float2(outputPt.x, -outputPt.y), 0); + min16float4 h3 = tex7.SampleLevel(sam1, pos + float2(outputPt.x, 0), 0); + min16float4 i3 = tex7.SampleLevel(sam1, pos + outputPt, 0); + + min16float4 na3 = max(-a3, 0); + min16float4 nb3 = max(-b3, 0); + min16float4 nc3 = max(-c3, 0); + min16float4 nd3 = max(-d3, 0); + min16float4 ne3 = max(-e3, 0); + min16float4 nf3 = max(-f3, 0); + min16float4 ng3 = max(-g3, 0); + min16float4 nh3 = max(-h3, 0); + min16float4 ni3 = max(-i3, 0); + + a3 = max(a3, 0); + b3 = max(b3, 0); + c3 = max(c3, 0); + d3 = max(d3, 0); + e3 = max(e3, 0); + f3 = max(f3, 0); + g3 = max(g3, 0); + h3 = max(h3, 0); + i3 = max(i3, 0); + + min16float4 target = mul(a1, min16float4x4(-0.04461327, 0.026094772, -0.04326873, -0.022564206, 0.041758694, -0.13209347, -0.022546854, 0.004888482, 0.041229382, 0.078778535, -0.09928822, 0.045134705, 0.07555903, 0.095968306, 0.017260674, -0.16633268)); + target += mul(b1, min16float4x4(0.074613005, -0.024822153, 0.006285665, 0.064223155, 0.08983999, -0.04401517, 0.0021585347, -0.05762909, -0.04529031, -0.081778474, -0.006732511, -0.11184791, 0.10299652, -0.23328288, 0.15988354, 0.100146465)); + target += mul(c1, min16float4x4(0.035105877, -0.0018613822, -0.10513717, -0.033936206, -0.015839642, 0.036846053, 0.057443213, 0.0151035935, 0.073372714, -0.032272663, -0.10095864, 0.11976275, 0.019719468, -0.03309878, -0.09841568, 0.02204194)); + target += mul(d1, min16float4x4(0.030945469, -0.17030734, -0.012849732, 0.015892556, 0.056250833, 0.24895169, -0.13764419, 0.16325791, -0.01160465, 0.006647464, -0.026491588, -0.17801395, -0.02435574, -0.2039599, -0.02686966, -0.026576484)); + target += mul(e1, min16float4x4(-0.037470777, 0.019415256, 0.09230313, 0.018368619, 0.12947397, 0.055918667, 0.03108532, -0.112716034, -0.18622373, 0.13083778, 0.11290179, 0.02457941, -0.055062827, 0.2621282, -0.47111708, 0.14229195)); + target += mul(f1, min16float4x4(-0.028525796, -0.044668507, 0.0581049, -0.05924212, -0.16126277, 0.02257456, -0.08723546, 0.0291216, 0.08648604, 0.1816661, -0.10166446, 0.054426763, -0.049978323, -0.014283805, 0.08187003, -0.33347195)); + target += mul(g1, min16float4x4(0.0660737, 0.07962152, -0.08272859, 0.06791631, -0.055610694, -0.04899803, 0.001302826, 0.034116816, 0.055754438, -0.090739936, -0.058503445, -0.21402411, 0.08279316, -0.017558504, -0.06069706, -0.009158945)); + target += mul(h1, min16float4x4(0.004801658, 0.19979613, -0.12919085, -0.08680655, -0.07869315, 0.13493058, 0.09466464, -0.06683993, 0.45278597, -0.031217117, -0.36346734, 0.007986247, -0.034918886, -0.06899428, -0.17898467, 0.048572816)); + target += mul(i1, min16float4x4(-0.058319356, -0.11041357, -0.038064227, 0.008961388, 0.059284043, -0.006377162, -0.08503998, 0.08246113, -0.042524133, -0.009021081, -0.06406861, -0.036977306, 0.015088326, 0.007376721, 0.045255665, -0.048585415)); + target += mul(a2, min16float4x4(-0.04103631, -0.041285936, 0.032812588, 0.0030869239, 0.04834749, -0.0023517366, 0.01230978, 0.09776701, 0.08415344, 0.20653047, -0.19338459, -0.04812796, -0.084704414, 0.038988277, 0.075450994, -0.08053876)); + target += mul(b2, min16float4x4(0.13506958, -0.2392332, 0.07425533, -0.05262753, -0.06849319, -0.0686977, 0.09134643, 0.032770213, 0.0725978, -0.12106999, 0.068602145, 0.0030026592, -0.0808173, 0.06421806, -0.08257931, 0.21460927)); + target += mul(c2, min16float4x4(-0.008367152, 0.0035576785, -0.012087096, -0.08389121, -0.01598755, 0.12065467, 0.099018045, -0.14851409, 0.030730573, 0.028257858, -0.08153201, -0.08644078, -0.114632666, -0.03989634, 0.005787138, -0.080551155)); + target += mul(d2, min16float4x4(0.063049294, -0.13418451, -0.020768259, -0.12566003, -0.038050238, 0.024393935, 0.040856704, -0.10639481, -0.0021406382, 0.12272091, 0.039621927, 0.009142157, -0.12273027, 0.06595554, 0.03680899, -0.045653462)); + target += mul(e2, min16float4x4(0.14783141, 0.062921695, -0.2287169, 0.17810576, 0.12781417, -0.23455006, 0.08652726, -0.05671725, -0.0154688135, -0.0757278, 0.028468473, -0.055354204, 0.3387407, 0.06741395, -0.21965146, 0.28021505)); + target += mul(f2, min16float4x4(0.12927511, -0.083112024, -0.026347974, 0.11680802, -0.046030812, 0.04145888, 0.029390097, 0.07615963, 0.21023202, 0.015840504, -0.03812723, -0.03267151, -0.03871269, -0.009839764, 0.09856007, -0.07423972)); + target += mul(g2, min16float4x4(0.017651597, 0.020432748, 0.1884304, -0.004845205, 0.009974344, -0.022273665, 0.03930962, -0.035542846, 0.036834106, 0.14699532, -0.099249355, 0.10607033, -0.027745333, -0.0970868, 0.114169724, -0.023726419)); + target += mul(h2, min16float4x4(-0.028299367, -0.15123722, -0.00423565, 0.06813279, 0.00024022427, -0.025944803, 0.022504266, -0.08420193, -0.20596851, -0.1337249, 0.1062062, -0.01428787, 0.014752737, -0.012875446, 0.030165028, 0.035561644)); + target += mul(i2, min16float4x4(-0.09437882, 0.088986255, -0.019357264, -0.07609514, -0.11045937, -0.09335526, 0.0051609105, 0.046330493, -0.102482855, 0.16320266, -0.07661479, 0.033833966, -0.06805305, 0.051780142, -0.015298791, 0.010972507)); + target += mul(a3, min16float4x4(0.0022961323, 0.10782266, -0.06649802, -0.006361161, -0.13554603, 0.032311134, 0.01145253, -0.018523335, -0.051428523, -0.0073554716, -0.11821805, -0.0227195, -0.06375, 0.029970335, -0.038386237, -0.046592798)); + target += mul(b3, min16float4x4(-0.0839258, -0.0200528, 0.004925492, -0.035113, 0.08860089, 0.052822098, -0.16518101, -0.052028593, 0.042811155, 0.13656183, 0.06579406, -0.26585788, -0.00531827, -0.12001242, -0.07681884, -0.021055153)); + target += mul(c3, min16float4x4(0.0678669, 0.038901877, -0.096601896, -0.081621505, 0.0028282998, -0.04645044, 0.04284913, 0.015117329, 0.104568556, 0.006391826, -0.021010842, -0.036205173, 0.06698969, 0.08495347, 0.065073915, 0.07002784)); + target += mul(d3, min16float4x4(-0.041274223, -0.065267585, 0.0070607257, -0.067357324, 0.056948107, 0.04808867, 0.07966329, -0.017361488, 0.030913807, -0.119355716, -0.004582609, 0.050158955, 0.03867934, -0.13543603, -0.0011923639, -0.06866172)); + target += mul(e3, min16float4x4(0.11586327, -0.047302328, 0.062475067, 0.018575871, 0.12420718, -0.03602303, 0.021922488, 0.16011192, -0.16549775, 0.123044305, 0.065160766, -0.30708137, 0.07341779, -0.12929793, 0.08692529, 0.0007729847)); + target += mul(f3, min16float4x4(-0.013340411, 0.058056828, -0.028747091, -0.0020311237, -0.1070798, 0.13726988, 0.017587787, -0.06898856, 0.03802266, 0.13165978, -0.035371024, 0.098588474, -0.036178526, -0.1068027, -0.03172579, 0.0816444)); + target += mul(g3, min16float4x4(0.025470722, -0.010980958, -0.08286821, -0.031260632, -0.0134636145, 0.041295316, -0.09980376, 0.07899825, 0.046056226, 0.17291167, -0.066611394, 0.03685817, -0.020917175, 0.11551815, -0.016370535, -0.003991822)); + target += mul(h3, min16float4x4(-0.039056864, 0.011015572, 0.014014594, -0.08614736, -0.08130745, 0.045282196, -0.04879853, -0.07139807, 0.09670427, -0.07834781, -0.022022815, 0.053423326, -0.055300128, 0.23542596, -0.11442394, -0.05190056)); + target += mul(i3, min16float4x4(0.12978806, -0.020104066, -0.032463916, -0.04754379, 0.05811374, 0.029061198, -0.013163837, 0.051058855, 0.04294865, -0.12551701, 0.17822845, -0.16549106, 0.12024249, -0.0790749, 0.035424378, 0.0062358896)); + target += mul(na1, min16float4x4(0.030824278, 0.06636776, -0.047206167, 0.02480193, 0.071935624, -0.18845995, -0.028480597, -0.10213147, -0.03973547, 0.025171004, 0.016600806, -0.10615915, -0.07395773, -0.050147526, -0.011541545, -0.027081985)); + target += mul(nb1, min16float4x4(-0.035749037, -0.052818663, -0.020621216, -0.023525307, -0.02461827, 0.3019646, -0.024478583, -0.1398278, 0.17499511, 0.22476715, -0.13090259, -0.05484457, -0.023759075, 0.002843161, 0.014099166, -0.011660793)); + target += mul(nc1, min16float4x4(-0.008461302, 0.14787683, 0.07476249, -0.035538696, 0.007945418, 0.04992842, -0.2388183, 0.0061813896, 0.016805701, 0.019992555, 0.034271393, -0.040170603, -0.039961495, 0.009210595, 0.07606321, 0.05323195)); + target += mul(nd1, min16float4x4(-0.017007355, -0.01304119, -0.011782462, 0.043480955, 0.041575707, 0.20513225, -0.16858323, 0.019438695, -0.02795952, -0.032667078, 0.08400571, 0.012488913, -0.025382128, 0.06756553, 0.14349163, -0.012960532)); + target += mul(ne1, min16float4x4(-0.015847925, 0.035881996, 0.09946923, -0.2583748, -0.11036338, 0.02174868, 0.023047017, -0.023119839, 0.0014623358, -0.05400468, 0.1088209, 0.056070726, 0.09849772, 0.106276534, -0.2869582, 0.122843154)); + target += mul(nf1, min16float4x4(0.120457835, 0.0030220735, 0.011593652, 0.04870485, 0.051817082, -0.12444271, -0.0030080245, 0.03186695, -0.119991936, -0.03661239, 0.0462927, 0.047734156, 0.035473768, -0.050326344, 0.048162602, 0.0044394233)); + target += mul(ng1, min16float4x4(0.004526382, -0.040592365, 0.038592715, 0.06312635, -0.012543924, -0.03860053, 0.013131243, -0.11894808, -0.05983815, -0.09653036, 0.14409515, -0.022803063, 0.02864931, 0.014170389, 0.091406494, 0.08613508)); + target += mul(nh1, min16float4x4(0.12344745, -0.034350697, 0.10549495, -0.11843059, -0.041916244, -0.035728436, -0.052881684, -0.07620879, 0.06760638, -0.039527662, -0.006650022, -0.05049626, 0.12109734, -0.005554175, 0.17754045, -0.098896034)); + target += mul(ni1, min16float4x4(0.017840233, -0.0118570635, -0.080244206, -0.14309776, -0.03778345, 0.12812364, -0.011180574, -0.03749929, -0.013458457, 0.028993722, 0.03479446, -0.11635739, -0.01636896, -0.010422004, -0.022923285, 0.013722603)); + target += mul(na2, min16float4x4(0.0022784397, -0.026745517, 0.07457438, -0.023941608, -0.056146793, -0.012885049, 0.010106243, -0.13570426, -0.055139925, -0.0553148, 0.037558038, -0.015558114, 0.055840485, -0.08124391, -0.013017814, 0.18931141)); + target += mul(nb2, min16float4x4(0.10672792, 0.129464, 0.1233261, -0.062469885, -0.08835128, 0.17588028, -0.02560139, -0.07349341, -0.08052734, 0.03086464, 0.12930822, 0.107045054, 0.03136081, -0.11335949, 0.09541032, -0.015009924)); + target += mul(nc2, min16float4x4(0.023294786, -0.17904189, -0.036457974, -0.060965557, 0.088545635, 0.001061151, -0.016771115, 0.082081355, -0.0030623788, -0.05096391, 0.022067994, -0.078540295, -0.12912196, -0.045786213, 0.05568379, -0.16344398)); + target += mul(nd2, min16float4x4(0.043200932, 0.006267473, -0.081682056, 0.044593308, 0.03179784, 0.20806344, -0.038468197, 0.06644582, 0.01704569, -0.029287282, -0.0036700617, 0.018897371, -0.075105995, 0.09612947, -0.06442493, 0.012179776)); + target += mul(ne2, min16float4x4(-0.21926114, 0.18097721, -0.037700515, 0.016763914, -0.057943042, -0.06129067, 0.04456528, -0.2304425, 0.013301696, 0.11028081, -0.18095498, 0.14712757, 0.2271199, -0.3185643, -0.19932592, -0.08554962)); + target += mul(nf2, min16float4x4(0.0117652705, -0.041661818, 0.029219367, -0.046232816, 0.047820047, 0.068789035, -0.113418594, 0.1141295, -0.027060978, 0.07267708, 0.093252845, -0.049717877, -0.087836266, 0.14460698, 0.10277318, -0.04977497)); + target += mul(ng2, min16float4x4(0.022564596, -0.037228584, -0.065915406, -0.011077084, 0.030235467, -0.04677627, -0.06419004, -0.018991074, 0.034164365, -0.019168181, 0.022525655, -0.029373096, -0.079060145, 0.13279332, -0.08545939, -0.045388315)); + target += mul(nh2, min16float4x4(-0.14000517, -0.08309406, 0.13520917, -0.10369978, -0.016325317, 0.00970006, -0.048059512, 0.1412818, 0.040955327, 0.030759163, -0.108052924, 0.005294165, -0.10046129, 0.16592641, -0.035368618, -0.29051507)); + target += mul(ni2, min16float4x4(-0.09455044, 0.0005962807, 0.0006215668, -0.038142636, -0.03929331, -0.01591621, 0.0056410446, -0.036902174, -0.056509133, -0.10841171, 0.07702632, -0.08160013, 0.040747657, -0.08348532, 0.019081287, 0.020851197)); + target += mul(na3, min16float4x4(-0.03399592, 0.10141488, -0.0077629937, -0.17129703, -0.025233645, 0.052428465, -0.019579021, -0.072962284, 0.022322712, -0.18443614, -0.00848578, 0.0376278, 0.055581484, 0.06439001, -0.026564457, 0.015072123)); + target += mul(nb3, min16float4x4(0.11295866, -0.1541795, 0.11074539, -0.12757398, -0.11353885, 0.12023232, -0.07913168, 0.25957996, -0.0064171744, 0.08077023, 0.09673833, 0.008732368, 0.03630595, 0.059769, 0.028521406, 0.029331883)); + target += mul(nc3, min16float4x4(-0.081345834, -0.06722959, -0.13713932, 0.03613845, -0.084334835, 0.046838246, -0.004890033, -0.08524675, 0.15460378, -0.09410546, -0.058240023, 0.11844812, 0.00092362246, 0.028734036, 0.0028451593, 0.03558664)); + target += mul(nd3, min16float4x4(0.067000724, 0.08689177, 0.003695697, 0.08341895, -0.08124141, -0.20499983, 0.09505712, -0.07436812, -0.028131844, 0.050506454, -0.107579716, 0.058785282, 0.031196257, 0.021408495, -0.100359544, 0.07999305)); + target += mul(ne3, min16float4x4(-0.16514844, 0.117525734, 0.24123909, 0.09518423, 0.17757961, -0.28094006, 0.081966326, 0.0802129, 0.0011662474, 0.06366135, 0.07578068, -0.08616794, 0.19857462, -0.10196374, -0.13831666, -0.18653043)); + target += mul(nf3, min16float4x4(-0.06649859, 0.0935902, -0.19097336, 0.16118656, 0.2938468, -0.10315292, 0.08256489, -0.06169784, -0.05889727, -0.018046174, -0.17596339, 0.20343648, -0.08962845, -0.027532624, 0.059598826, -0.14278376)); + target += mul(ng3, min16float4x4(-0.0070921015, -0.07634683, -0.066166356, -0.06432544, 0.050059035, 0.20213397, -0.071587585, 0.031234715, 0.10629024, 0.044645656, -0.023101477, -0.022136679, 0.009119783, -0.10172394, 0.024746796, -0.1161207)); + target += mul(nh3, min16float4x4(-0.046572298, -0.06981039, 0.08314394, 0.043344617, 0.1914716, 0.0046652057, -0.0683364, 0.086023554, 0.06213587, -0.0077511827, -0.03336288, 0.1474879, -0.032717533, 0.078666836, -0.001740435, 0.048321523)); + target += mul(ni3, min16float4x4(0.18346673, -0.20763724, 0.05431475, -0.08291483, -0.0073792376, -0.053458065, 0.08561732, -0.103502, -0.06856406, 0.05193988, -0.009717332, 0.06446446, 0.050632656, 0.013681985, -0.02556495, 0.05056843)); + target += min16float4(-0.01824226, 0.05140684, 0.010533643, 0.017739987); + conv1ups[gxy] = target; + + target = mul(a1, min16float4x4(0.070670135, -0.026429666, 0.09446684, -0.04920855, -0.08720965, -0.022478819, -0.15962029, 0.29240617, -0.10499224, 0.10415364, 0.11922523, -0.08293139, 0.07846739, -0.15612845, -0.19753109, -0.033664245)); + target += mul(b1, min16float4x4(-0.10003188, 0.088794544, -0.028137686, -0.1375475, 0.079632774, -0.012540568, -0.092962824, 0.10438857, -0.12865996, -0.040098958, -0.030862473, 0.009116932, -0.14513193, 0.13843827, -0.14862274, 0.27156416)); + target += mul(c1, min16float4x4(0.03148634, -0.13966283, -0.022684515, 0.080294125, -0.013548243, -0.01112399, 0.021930493, -0.24562296, -0.029252343, -0.0053704586, 0.088651545, -0.10468119, 0.0077052945, 0.027455118, -0.008439029, -0.08633876)); + target += mul(d1, min16float4x4(-0.073491044, 0.11097277, -0.02937573, 0.045977436, -0.015563786, 0.04763272, -0.17349051, 0.02479734, 0.12201058, -0.09606755, -0.064500526, -0.068423286, -0.10828311, 0.0025430934, 0.060595006, 0.10702606)); + target += mul(e1, min16float4x4(-0.10012673, -0.026187293, 0.039673958, 0.25377232, 0.16539277, 0.015475691, -0.017826023, -0.037547242, 0.27426562, 0.039105, -0.29495236, -0.20741108, 0.3893781, -0.00018520994, 0.18736628, 0.016120607)); + target += mul(f1, min16float4x4(-0.0902328, -0.035078812, 0.0423949, 0.10428684, -0.012309703, -0.0022217801, 0.12843162, 0.008824024, 0.10457806, -0.13958204, 0.042961385, -0.17798209, 0.13051195, -0.2078117, 0.014258071, 0.27743495)); + target += mul(g1, min16float4x4(0.0037268966, -0.002057136, -0.086700045, -0.04034686, -0.039582066, -0.05536445, -0.013854305, 0.13898304, 0.08383669, -0.1389377, 0.09724791, 0.27256468, 0.0012985421, 0.026786802, -0.09553305, -0.08505046)); + target += mul(h1, min16float4x4(0.047094945, -0.15165734, -0.16622189, 0.27696493, 0.04804586, 0.017589863, -0.048407666, -0.1423487, -0.18051605, -0.037678123, -0.083375834, 0.21356659, 0.056051373, 0.058305956, 0.020808164, 0.20114677)); + target += mul(i1, min16float4x4(-0.06873173, 0.056631878, -0.09389161, -0.026553899, -0.005246827, 0.011163956, 0.0807366, 0.018891184, 0.037806395, -0.08414753, -0.29572666, 0.12225136, 0.028108165, -0.12746434, -0.1242189, 0.06427617)); + target += mul(a2, min16float4x4(-0.054436807, 0.0463667, -0.3160585, -0.26496625, -0.0016307884, 0.0027304688, 0.13524249, 0.14023106, 0.15203272, -0.0055950717, -0.047067486, -0.1299749, -0.023347244, -0.011924935, 0.04708069, 0.14064)); + target += mul(b2, min16float4x4(-0.15567084, -0.03462954, 0.014766895, 0.28104082, -0.015955932, 0.048590813, 0.14149605, 0.016979203, 0.15654798, -0.124170296, -0.000571697, 0.18732761, -0.15969957, 0.036891263, -0.08222836, 0.007162299)); + target += mul(c2, min16float4x4(-0.027358167, -0.05515796, -0.21783291, -0.061588667, 0.14288566, 0.034540724, -0.0779948, -0.004935965, 0.087642424, -0.03457867, 0.26657468, -0.08798545, 0.06278833, 0.01650169, -0.15035287, 0.043133624)); + target += mul(d2, min16float4x4(0.05577383, 0.058146708, 0.0057744626, -0.043521628, 0.14279243, -0.22507532, 0.0896487, -0.03373711, -0.29882178, 0.12674153, 0.21856095, -0.03654502, 0.09770278, 0.011492664, 0.01397184, 0.11037485)); + target += mul(e2, min16float4x4(0.14057921, -0.18916433, -0.10062621, -0.19464967, -0.19286343, -0.08279728, 0.0062218676, -0.15246014, 0.0960211, -0.3964747, -0.016336296, 0.028859172, -0.047788087, 0.032031618, 0.054299697, -0.11431765)); + target += mul(f2, min16float4x4(-0.15350376, 0.1362609, -0.011803502, 0.2660655, -0.037387744, 0.18536955, -0.0015025261, -0.011900626, -0.023042146, -0.15995252, 0.060023192, 0.08954088, 0.07074839, 0.059100557, -0.08593189, -0.045180846)); + target += mul(g2, min16float4x4(-0.031948235, 0.07176401, -0.007034352, -0.12552954, 0.049458012, -0.07971771, 0.0093457, -0.10731874, 0.07024961, 0.27386668, 0.07679444, -0.28798524, -0.06428793, -0.0057761013, 0.014161652, -0.0065095956)); + target += mul(h2, min16float4x4(-0.1427731, 0.0833077, 0.13927783, 0.016691789, -0.16832228, 0.10298729, 0.1446675, -0.2656778, 0.0788247, 0.13420862, 0.050337754, -0.08008961, 0.07605825, 0.04659439, -0.054331373, 0.074493684)); + target += mul(i2, min16float4x4(0.07614274, -0.050090652, -0.066727035, 0.055715825, -0.07636078, 0.08155946, -0.061731443, -0.022193443, 0.057011697, -0.009381379, 0.176684, -0.05981099, -0.04690691, 0.051825907, -0.019666756, 0.0017494732)); + target += mul(a3, min16float4x4(0.12878093, -0.091072194, 0.03426444, -0.0014821129, 0.04648442, -0.056241687, 0.12965083, -0.2177644, 0.03271057, 0.013664906, -0.27382636, 0.009116637, -0.020398485, 0.026515692, 0.0059792865, -0.10869647)); + target += mul(b3, min16float4x4(0.017064014, 0.012380988, 0.015886486, 0.041969348, -0.056818817, 0.057386417, -0.19103225, 0.02042478, 0.022307403, -0.16955635, -0.25923833, -0.19144051, 0.044084065, 0.09931404, 0.08665806, -0.17140177)); + target += mul(c3, min16float4x4(-0.034919903, -0.00735085, -0.0040107057, 0.013110185, 0.008756165, -0.11104751, -0.03863784, 0.20081028, 0.008359515, 0.056265604, 0.0035791632, 0.14127707, 0.008306366, -0.061028276, -0.01180833, 0.11239347)); + target += mul(d3, min16float4x4(-0.055210557, -0.0047766017, -0.040911432, 0.04214669, 0.015301695, 0.035733294, -0.09534393, 0.3189227, -0.043539703, 0.10847848, 0.052175194, 0.25319937, -0.075755194, 0.07450996, -0.2392008, 0.17029741)); + target += mul(e3, min16float4x4(0.008697264, -0.062783785, 0.23503996, 0.06680282, -0.10700762, -0.05921618, 0.12575574, 0.12539467, 0.21779932, -0.27365687, -0.08419621, -0.23255387, -0.097952545, -0.33015022, -0.27839977, 0.54275817)); + target += mul(f3, min16float4x4(0.043178167, -0.07644931, -0.002126049, -0.0041748723, 0.12747553, 0.05624526, 0.08894693, 0.1273868, 0.13564228, -0.029284991, -0.1010155, 0.0144336475, -0.067769796, 0.12993337, 0.23458317, -0.1404509)); + target += mul(g3, min16float4x4(0.037086505, 0.04712714, 0.00080463936, 0.026554452, -0.032055024, -0.0346718, 0.14792679, 0.025423491, 0.045839246, 0.040022433, -0.010968567, -0.03638554, 0.03469138, -0.048995998, -0.080627054, -0.15703341)); + target += mul(h3, min16float4x4(0.0022719046, -0.11156194, -0.1660571, 0.07095863, 0.06325309, 0.03638195, 0.011129683, -0.16795434, 0.05859281, -0.050576515, 0.025492875, 0.14741158, 0.16042823, -0.021238782, -0.10693587, 0.062508605)); + target += mul(i3, min16float4x4(0.04699144, -0.06268154, -0.032550193, 0.1368816, -0.046266492, -0.09626834, 0.035877157, -0.017621659, -0.025884021, 0.016501589, -0.033517126, -0.16266182, 0.0063534426, -0.034565207, 0.107733876, -0.19080792)); + target += mul(na1, min16float4x4(-0.01089889, -0.046437796, -0.2864276, -0.059123863, 0.010273228, 0.035363402, -0.18365921, 0.002496715, 0.010531512, -0.044639286, -0.14159343, -0.04712995, 0.031355694, 0.041651487, 0.04172989, -0.072659165)); + target += mul(nb1, min16float4x4(-0.29903612, 0.016968794, 0.2026591, 0.14354537, 0.210121, -0.1271222, 0.11928214, 0.075612746, 0.07222206, -0.113600664, -0.031380497, -0.04970697, -0.040690526, -0.024844045, -0.14514743, 0.10170265)); + target += mul(nc1, min16float4x4(0.00901007, -0.0077540767, -0.16780637, -0.0772044, -0.08349278, 0.035623573, -0.0036132522, -0.1559422, 0.079474956, -0.024358552, 0.05147624, -0.095216155, -0.001963766, 0.026185913, 0.041633602, -0.068779185)); + target += mul(nd1, min16float4x4(0.11536367, 0.06698426, -0.019352471, -0.027348887, 0.12543406, -0.017715944, -0.22333942, -0.07524913, -0.023550004, 0.09020137, 0.15082505, -0.019156344, 0.014714152, -0.100751296, -0.10988814, 0.013269792)); + target += mul(ne1, min16float4x4(0.23938964, -0.015321653, -0.085038215, -0.21858668, -0.15793826, -0.1725926, 0.16878416, -0.15579711, -0.21086636, -0.023652412, -0.10312092, 0.047774162, 0.11063097, 0.02804365, -0.049057744, -0.20330532)); + target += mul(nf1, min16float4x4(0.058630574, 0.10365072, -0.112122595, -0.10462442, -0.04204145, 0.0060419035, -0.038622607, -0.22971797, -0.081746876, 0.110261, -0.03279762, 0.10083948, -0.07525642, 0.096350044, -0.15403591, 0.01831559)); + target += mul(ng1, min16float4x4(-0.013126955, 0.11560779, 0.06401061, -0.014257845, -0.078378044, 0.07452937, 0.030035159, 0.07133207, -0.072352365, -0.049404953, -0.2006817, -0.04745451, -0.0645119, 0.0849615, 0.053003483, 0.07766129)); + target += mul(nh1, min16float4x4(0.07683494, -0.47826648, 0.05708172, 0.12041683, 0.18084203, -0.08476069, 0.093064874, 0.016264802, 0.06801874, -0.01283242, -0.13347803, -0.035351828, -0.0011718989, -0.12699558, -0.0240836, -0.08060763)); + target += mul(ni1, min16float4x4(0.0521042, -0.062541164, 0.05483789, 0.14211908, 0.08606814, 0.06433033, -0.23270494, 0.05307593, 0.09299324, 0.04586578, -0.1193637, 0.12056507, -0.06442679, 0.06762315, -0.010547303, 0.031680685)); + target += mul(na2, min16float4x4(-0.09215318, -0.115724616, -0.061507307, 0.08273653, 0.0265886, -0.092683844, -0.22037667, -0.023114366, 0.028223295, -0.029118685, -0.088996224, 0.1023557, -0.089898214, 0.15436162, 0.16985597, 0.1431367)); + target += mul(nb2, min16float4x4(0.10560199, 0.13460231, 0.024534458, 0.1370791, 0.16920403, 0.013769043, -0.004941373, -0.22188903, -0.1193022, 0.07823969, -0.097713776, 0.044269208, 0.036816355, -0.11568587, -0.07947363, 0.022213666)); + target += mul(nc2, min16float4x4(0.002128253, 0.014331295, 0.09004623, -0.12958615, 0.0048723617, -0.072075516, 0.024190098, 0.011900665, 0.038696863, 0.07110043, -0.10347002, 0.082676366, 0.017796163, 0.004747536, 0.11188511, -0.21652836)); + target += mul(nd2, min16float4x4(-0.051317807, 0.13453357, 0.05310306, -0.033790052, -0.06231268, 0.11130248, -0.075370945, 0.2774124, 0.04305133, -0.045057327, -0.04373203, -0.10055409, 0.042824138, -0.021799369, -0.08762204, -0.16729161)); + target += mul(ne2, min16float4x4(0.08727262, -0.074025065, -0.113067836, -0.07882044, 0.04476854, -0.14519121, -0.0434838, -0.010525559, -0.0425304, 0.106957085, -0.28644025, -0.105096966, 0.12650728, -0.15108573, 0.013723224, 0.5163331)); + target += mul(nf2, min16float4x4(-0.021519013, -0.05317946, 0.0036545463, 0.0003156711, 0.12984163, -0.11362556, 0.061670557, -0.030158816, 0.04674806, 0.16352096, -0.23135264, 0.074876174, 0.0047455966, -0.120593436, 0.032926966, -0.20865184)); + target += mul(ng2, min16float4x4(-0.029197322, -0.09204084, -0.13026133, -0.020570219, 0.043402288, -0.016610064, 0.08961119, -0.09460752, -0.057213686, -0.14044005, 0.080606215, 0.12573113, 0.094055034, 0.06523493, -0.16264567, -0.0716556)); + target += mul(nh2, min16float4x4(-0.020557933, 0.077145614, 0.04620034, 0.22271551, 0.114781894, 0.11590448, -0.03233266, 0.13224865, -0.054499403, -0.01435028, -0.09684464, 0.022300925, 0.16768926, -0.019053463, 0.08804071, -0.14398381)); + target += mul(ni2, min16float4x4(0.0025323853, -0.016476262, 0.12608051, 0.016324151, -0.0035798363, 0.020308342, 0.06474364, -0.042083416, -0.08742628, 0.016960703, -0.120870225, 0.07373239, -0.06463355, -0.018745359, -0.02229239, -0.1039809)); + target += mul(na3, min16float4x4(-0.008440462, -0.15268475, -0.09420959, -0.07718843, 0.35601637, -0.0010803771, 0.050411247, -0.09859693, -0.008227993, 0.06407621, -0.19121973, -0.15547852, -0.033705134, 0.023920614, -0.12611681, 0.021967601)); + target += mul(nb3, min16float4x4(-0.24474435, 0.07716706, -0.24876165, -0.18184067, -0.020811914, 0.07414089, -0.21809489, 0.015727887, 0.12278457, -0.08471355, -0.06071567, -0.07017344, -0.064291485, -0.07627711, 0.076017715, 0.2072293)); + target += mul(nc3, min16float4x4(0.013676314, -0.04966636, 0.06895822, 0.15210962, 0.07330876, -0.034188077, -0.0173066, 0.11160374, -0.12326202, -0.002551885, 0.0015338673, 0.1079974, 0.03733164, 0.077835836, -0.07733004, -0.0058571417)); + target += mul(nd3, min16float4x4(-0.1854433, 0.02924247, -0.14843488, 0.18941449, -0.17652206, -0.13730201, -0.29041716, -0.12161381, -0.04599312, 0.16662349, 0.045855995, -0.005569671, -0.050993398, 0.019462017, -0.10552683, -0.19930908)); + target += mul(ne3, min16float4x4(0.08246259, 0.2602547, 0.16599776, -0.12149122, -0.048151806, 0.12042248, -0.16163243, 0.00087805535, 0.0536958, 0.05350576, 0.08406917, -0.060227945, 0.19056156, -0.2276745, -0.13755281, 0.39423308)); + target += mul(nf3, min16float4x4(-0.0775391, 0.105803244, 0.08474868, -0.019011196, 0.026801828, -0.036453005, -0.018443616, -0.03005072, -0.10748735, 0.080679856, 0.07718584, 0.07871323, 0.030023575, 0.022230582, -0.090973295, -0.1363233)); + target += mul(ng3, min16float4x4(-0.14770739, -0.09530047, 0.10400556, -0.115337685, 0.14459239, 0.1432794, -0.070606485, -0.053847175, 0.09378594, -0.09445331, 0.088633865, 0.071158156, 0.04437499, -0.04694172, -0.059354205, -0.00041449978)); + target += mul(nh3, min16float4x4(0.016041227, -0.2313572, -0.011389983, 0.030348316, 0.07260269, 0.009828401, -0.06116872, 0.026138552, -0.15607156, 0.042709354, 0.079162516, -0.16348995, -0.019872159, 0.13251646, 0.020712351, -0.16324571)); + target += mul(ni3, min16float4x4(-0.08813695, 0.093021385, 0.019460218, 0.096429825, -0.010391231, 0.0216966, -0.1490125, -0.04100963, -0.024641959, 0.044109546, 0.08043847, -0.03676336, -0.026315603, 0.025947884, -0.10771212, 0.0010732685)); + target += min16float4(0.003290131, -0.0154397, 0.04528908, -0.04218369); + conv1ups1[gxy] = target; +} + +//!PASS 8 +//!DESC Conv-3x3x3x16 +//!IN INPUT, conv1ups, conv1ups1 +//!OUT OUTPUT +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 + +void Pass8(uint2 blockStart, uint3 threadId) { + uint2 gxy = Rmp8x8(threadId.x) + blockStart; + + const uint2 outputSize = GetOutputSize(); + if (gxy.x >= outputSize.x || gxy.y >= outputSize.y) { + return; + } + + const float2 outputPt = GetOutputPt(); + const float2 pos = (gxy + 0.5f) * outputPt; + + // [ a, d, g ] + // [ b, e, h ] + // [ c, f, i ] + min16float4 a1 = conv1ups.SampleLevel(sam, pos - outputPt, 0); + min16float4 b1 = conv1ups.SampleLevel(sam, pos + float2(-outputPt.x, 0), 0); + min16float4 c1 = conv1ups.SampleLevel(sam, pos + float2(-outputPt.x, outputPt.y), 0); + min16float4 d1 = conv1ups.SampleLevel(sam, pos + float2(0, -outputPt.y), 0); + min16float4 e1 = conv1ups.SampleLevel(sam, pos, 0); + min16float4 f1 = conv1ups.SampleLevel(sam, pos + float2(0, outputPt.y), 0); + min16float4 g1 = conv1ups.SampleLevel(sam, pos + float2(outputPt.x, -outputPt.y), 0); + min16float4 h1 = conv1ups.SampleLevel(sam, pos + float2(outputPt.x, 0), 0); + min16float4 i1 = conv1ups.SampleLevel(sam, pos + outputPt, 0); + + min16float4 na1 = max(-a1, 0); + min16float4 nb1 = max(-b1, 0); + min16float4 nc1 = max(-c1, 0); + min16float4 nd1 = max(-d1, 0); + min16float4 ne1 = max(-e1, 0); + min16float4 nf1 = max(-f1, 0); + min16float4 ng1 = max(-g1, 0); + min16float4 nh1 = max(-h1, 0); + min16float4 ni1 = max(-i1, 0); + + a1 = max(a1, 0); + b1 = max(b1, 0); + c1 = max(c1, 0); + d1 = max(d1, 0); + e1 = max(e1, 0); + f1 = max(f1, 0); + g1 = max(g1, 0); + h1 = max(h1, 0); + i1 = max(i1, 0); + + min16float4 a2 = conv1ups1.SampleLevel(sam, pos - outputPt, 0); + min16float4 b2 = conv1ups1.SampleLevel(sam, pos + float2(-outputPt.x, 0), 0); + min16float4 c2 = conv1ups1.SampleLevel(sam, pos + float2(-outputPt.x, outputPt.y), 0); + min16float4 d2 = conv1ups1.SampleLevel(sam, pos + float2(0, -outputPt.y), 0); + min16float4 e2 = conv1ups1.SampleLevel(sam, pos, 0); + min16float4 f2 = conv1ups1.SampleLevel(sam, pos + float2(0, outputPt.y), 0); + min16float4 g2 = conv1ups1.SampleLevel(sam, pos + float2(outputPt.x, -outputPt.y), 0); + min16float4 h2 = conv1ups1.SampleLevel(sam, pos + float2(outputPt.x, 0), 0); + min16float4 i2 = conv1ups1.SampleLevel(sam, pos + outputPt, 0); + + min16float4 na2 = max(-a2, 0); + min16float4 nb2 = max(-b2, 0); + min16float4 nc2 = max(-c2, 0); + min16float4 nd2 = max(-d2, 0); + min16float4 ne2 = max(-e2, 0); + min16float4 nf2 = max(-f2, 0); + min16float4 ng2 = max(-g2, 0); + min16float4 nh2 = max(-h2, 0); + min16float4 ni2 = max(-i2, 0); + + a2 = max(a2, 0); + b2 = max(b2, 0); + c2 = max(c2, 0); + d2 = max(d2, 0); + e2 = max(e2, 0); + f2 = max(f2, 0); + g2 = max(g2, 0); + h2 = max(h2, 0); + i2 = max(i2, 0); + + min16float3 target = mul(a1, min16float4x3(-0.009692998, -0.008524317, 0.0010432196, 0.00057165127, -0.011818117, 0.0014487396, 0.0049518407, -0.001888361, -0.013262905, 0.05004511, 0.023134997, -0.016969386)); + target += mul(b1, min16float4x3(0.008501838, -0.001176035, -0.0035942376, 0.009015378, 0.011752493, 0.0061198603, -0.056669727, -0.035067406, -0.040517025, -0.039194923, 0.007251104, -0.0124227265)); + target += mul(c1, min16float4x3(0.010942934, 0.0100984, 0.0133265015, -0.019482462, -0.014820488, -0.021098822, -0.02860967, -0.10633767, -0.03296336, -0.011277147, -0.007915212, 0.008589044)); + target += mul(d1, min16float4x3(-0.004447993, -0.0019008318, 0.0054705385, -0.008042658, -0.0007432871, -0.0091506895, 0.010537624, 0.047716837, 0.01504048, -0.108882375, -0.06776622, -0.04354868)); + target += mul(e1, min16float4x3(-0.0030183722, 0.007729766, -0.007144855, 0.029383881, 0.024865916, 0.028182652, 0.16122057, 0.16675095, 0.18204775, 0.12284804, 0.031072017, 0.042543165)); + target += mul(f1, min16float4x3(0.0012941018, -0.00043673834, 0.009252594, 0.009156994, 0.0138289975, 0.015774839, -0.051840767, -0.07687406, -0.069361895, 0.017338578, 0.022834148, -0.0025963243)); + target += mul(g1, min16float4x3(0.01646397, 0.0028061832, 0.007990534, -0.0073729097, -0.011168949, -0.0024975399, -0.0066431006, -0.014508122, -0.005740217, -0.06746655, -0.02083968, -0.05371696)); + target += mul(h1, min16float4x3(-0.013606154, 0.0062064505, 0.008410423, 0.0038487792, 0.012054022, 0.007878108, 0.034913104, -0.008084116, 0.014990575, -0.005912989, 0.021872269, 0.055241022)); + target += mul(i1, min16float4x3(0.014251287, 0.0016604483, -0.006772879, 0.0028646574, 0.0015996173, -0.002210879, -0.0323296, 0.015729006, -0.017242312, -0.03718726, -0.03889927, -0.041001298)); + target += mul(a2, min16float4x3(0.007536155, 0.009848646, 0.007846354, 0.019176869, 0.019928271, 0.031777207, 0.026086887, 0.01971131, -0.017595863, 0.012899679, 0.0026994154, 0.008934449)); + target += mul(b2, min16float4x3(0.017639438, 0.01536491, 0.011161806, 0.034244597, 0.025257796, 0.031185368, -0.18240982, 0.038758054, 0.13050976, -0.0075258785, -0.0034674285, 0.008525112)); + target += mul(c2, min16float4x3(0.01788933, 0.017623115, 0.020215526, 0.0045994874, -0.0031487814, 0.003752946, -0.06494309, -0.07747321, 0.06544584, -0.004555707, -0.001776991, -0.017493976)); + target += mul(d2, min16float4x3(0.01359033, 0.02045422, 0.008234278, -0.008073938, -0.036093507, -0.0027978886, -0.37033105, 0.009709281, 0.28951523, 0.003258166, 0.0044517294, -0.003740991)); + target += mul(e2, min16float4x3(-0.036449786, -0.03035285, -0.025356997, 0.097153045, 0.10745537, 0.08421458, 0.043944303, -0.004867672, -0.15142196, 0.007044417, -0.00785739, 0.007504869)); + target += mul(f2, min16float4x3(-0.007951127, -0.008863303, -0.012213915, 0.007273406, 0.00944796, -0.002621692, 0.2919848, 0.06830943, -0.16119143, -0.0033908382, 0.007383878, 0.007847461)); + target += mul(g2, min16float4x3(0.011670784, 0.00805604, 0.013980011, -0.032067183, -0.045659855, -0.03957935, 0.14678614, 0.014678316, -0.11203954, -0.002894618, 0.008089503, 0.0056759617)); + target += mul(h2, min16float4x3(0.008941132, -0.008732514, -0.004122878, -0.01872218, 0.0058594598, -0.014218105, 0.15922345, -0.00061763515, -0.10605325, 0.0059564817, 0.0062196897, -0.0031137357)); + target += mul(i2, min16float4x3(-0.027044835, -0.0113663385, -0.018061407, -0.01064461, 0.0004394501, 0.0068360637, 0.12218274, -0.025980305, 0.060082816, 0.002298275, -0.005121948, -0.0018933173)); + target += mul(na1, min16float4x3(-0.014044151, -0.0055593867, -0.0091519095, 0.018282808, -0.054974634, -0.02104256, 0.004737865, 0.009833153, 0.0050819647, 0.009256364, 0.004517343, -0.0012567915)); + target += mul(nb1, min16float4x3(0.035084303, 0.019331766, -0.006399992, -0.08042094, -0.14020248, -0.13438301, -0.0014871466, -0.0071605383, -0.0070841024, 0.001705956, -0.010914731, -0.0022737188)); + target += mul(nc1, min16float4x3(-0.024562238, -0.025555398, 0.00043982622, 0.04687896, 0.062265635, 0.06194832, 0.016357735, 0.0056735775, 0.01868422, 0.0035063815, 0.0050708377, 0.009102912)); + target += mul(nd1, min16float4x3(0.024276884, 0.031309772, 0.053946678, 0.027081756, 0.023922514, 0.051302873, -0.005081098, -0.013981954, -0.007141123, -0.017242068, -0.00036468913, 0.0071311933)); + target += mul(ne1, min16float4x3(0.096000426, 0.12978247, 0.089689955, 0.03013154, 0.09065384, 0.010782777, -0.009774296, -0.010487119, -0.018002238, 0.027585275, 0.018800229, 0.007482455)); + target += mul(nf1, min16float4x3(-0.031725004, -0.05638542, -0.06471826, -0.038512804, -0.036520924, -0.026658544, 0.0019714478, 0.004168433, 0.0036675548, 0.009312959, -0.009726487, 0.003937418)); + target += mul(ng1, min16float4x3(0.008056586, -0.03609238, -0.0035044104, -0.0052967947, 0.010446542, 0.010737699, -0.00941154, -0.005599727, -0.0071648047, 0.0028106347, 0.0063315486, 0.0005620387)); + target += mul(nh1, min16float4x3(-0.10104362, -0.06228799, -0.057575073, -0.0008651546, -0.010849562, -0.0066441186, -0.016244762, -0.0053532585, -0.012414173, -0.012507298, 0.005470365, 0.0032063425)); + target += mul(ni1, min16float4x3(-0.019126823, -0.022827078, -0.01918732, -0.0049576303, -0.010899637, -0.01990915, 0.019013962, 0.007385637, 0.015615745, 0.025586424, 0.02317941, 0.019631773)); + target += mul(na2, min16float4x3(-0.011578009, -0.0037521352, -0.0044622095, -0.0022668878, 0.0022691146, -0.00570573, 0.0052153515, 0.005547525, 0.0033032992, 0.009927488, -0.0061824876, -0.016856432)); + target += mul(nb2, min16float4x3(-0.07627339, -0.0595728, -0.08247348, -0.016201988, -0.019643232, -0.021891698, -0.0033560628, 0.0056153075, 0.005510208, -0.0061155884, 0.004726241, 0.03613314)); + target += mul(nc2, min16float4x3(-0.026918657, -0.017315133, -0.021586075, -0.021625597, -0.008547036, -0.011233614, -0.0047514364, -0.0029167454, -0.00583421, 0.012949899, 0.0035817428, -0.0045735473)); + target += mul(nd2, min16float4x3(-0.08581085, -0.07063111, -0.06381294, -0.0040735947, -0.012934923, -0.0057904166, -0.0077691195, -0.00034605907, 0.0023017807, -0.00029635165, -0.042357627, -0.057994146)); + target += mul(ne2, min16float4x3(0.05193261, 0.047533646, 0.071092665, -0.015042884, -0.023481138, -0.020945435, 0.008216166, 0.004034294, 0.0030410702, 0.10532969, 0.13052966, 0.11042539)); + target += mul(nf2, min16float4x3(0.052652936, 0.045103617, 0.036393207, 0.0018712351, -0.009865708, -0.00591473, -0.0008652197, 7.966737e-05, -0.004292879, -0.013765752, -0.0603564, 0.032057546)); + target += mul(ng2, min16float4x3(0.0020095943, -0.014555452, -0.008721001, 0.00085926603, -0.0012287357, 0.007974135, 0.004697991, -1.4738258e-05, -0.0048043244, 0.047545042, 0.099660076, 0.09649951)); + target += mul(nh2, min16float4x3(0.024352267, 0.03303334, 0.02903438, 0.0062978864, 0.014672455, 0.0043003284, -0.0017531263, -0.0032476797, 0.001345206, -0.20736417, -0.1745426, -0.32957983)); + target += mul(ni2, min16float4x3(0.027512033, 0.029760962, 0.033007182, 9.0356014e-05, 0.0061743665, 0.0036443318, -0.016802983, -0.019364875, -0.014311061, 0.021530075, 0.059616566, 0.07120056)); + target += min16float3(-0.0007544955, -0.0007692414, 0.00032997545); + + OUTPUT[gxy] = float4(target + INPUT.SampleLevel(sam1, pos, 0).rgb, 1); +} diff --git a/src/Effects/Anime4K_Upscale_GAN_x3_L.hlsl b/src/Effects/Anime4K_Upscale_GAN_x3_L.hlsl deleted file mode 100644 index 3c9e1dc1d..000000000 --- a/src/Effects/Anime4K_Upscale_GAN_x3_L.hlsl +++ /dev/null @@ -1,462 +0,0 @@ -// Anime4K_Upscale_GAN_x3_L -// 移植自 https://github.com/bloc97/Anime4K/blob/8e39551ce96ed172605c89b7dd8be855b5502cc9/glsl/Upscale/Anime4K_Upscale_GAN_x3_L.glsl - -//!MAGPIE EFFECT -//!VERSION 4 - -// 圆括号内的输入只被采样一次 -// INPUT -> tf, tf1, tf2 -// tf, tf1, tf2 -> 1_tf, 3_tf, 3_tf1, 3_tf2 -// 3_tf, 3_tf1, 3_tf2, (1_tf) -> 4_tf, 6_tf, 6_tf1, 6_tf2 -// 6_tf, 6_tf1, 6_tf2, (1_tf), (4_tf) -> 7_tf, 9_tf, 9_tf1, 9_tf2 -// 9_tf, 9_tf1, 9_tf2, (1_tf), (4_tf), (7_tf) -> 11_tf, 10_tf, 12_tf, 12_tf1, 12_tf2 -// 12_tf, 12_tf1, 12_tf2, 11_tf, (1_tf), (4_tf), (7_tf), (10_tf) -> 0ups, 0ups1, 0ups2 -// 0ups, 0ups1, 0ups2 -> 1ups, 1ups1 -// INPUT, 1ups, 1ups1 -> OUTPUT - -//!TEXTURE -Texture2D INPUT; - -//!TEXTURE -//!WIDTH INPUT_WIDTH * 2 -//!HEIGHT INPUT_HEIGHT * 2 -Texture2D OUTPUT; - -//!SAMPLER -//!FILTER POINT -SamplerState sam; - -//!SAMPLER -//!FILTER LINEAR -SamplerState sam1; - -//!TEXTURE -//!WIDTH INPUT_WIDTH -//!HEIGHT INPUT_HEIGHT -//!FORMAT R16G16B16A16_FLOAT -Texture2D tex1; - -//!TEXTURE -//!WIDTH INPUT_WIDTH -//!HEIGHT INPUT_HEIGHT -//!FORMAT R16G16B16A16_FLOAT -Texture2D tex2; - -//!TEXTURE -//!WIDTH INPUT_WIDTH -//!HEIGHT INPUT_HEIGHT -//!FORMAT R16G16B16A16_FLOAT -Texture2D tex3; - -//!TEXTURE -//!WIDTH INPUT_WIDTH -//!HEIGHT INPUT_HEIGHT -//!FORMAT R16G16B16A16_FLOAT -Texture2D tex4; - -//!TEXTURE -//!WIDTH INPUT_WIDTH -//!HEIGHT INPUT_HEIGHT -//!FORMAT R16G16B16A16_FLOAT -Texture2D tex5; - -//!TEXTURE -//!WIDTH INPUT_WIDTH -//!HEIGHT INPUT_HEIGHT -//!FORMAT R16G16B16A16_FLOAT -Texture2D tex6; - -//!TEXTURE -//!WIDTH INPUT_WIDTH -//!HEIGHT INPUT_HEIGHT -//!FORMAT R16G16B16A16_FLOAT -Texture2D tex7; - -//!TEXTURE -//!WIDTH INPUT_WIDTH -//!HEIGHT INPUT_HEIGHT -//!FORMAT R16G16B16A16_FLOAT -Texture2D tex8; - -//!TEXTURE -//!WIDTH INPUT_WIDTH -//!HEIGHT INPUT_HEIGHT -//!FORMAT R16G16B16A16_FLOAT -Texture2D tex9; - -//!TEXTURE -//!WIDTH INPUT_WIDTH -//!HEIGHT INPUT_HEIGHT -//!FORMAT R16G16B16A16_FLOAT -Texture2D tex10; - -//!TEXTURE -//!WIDTH INPUT_WIDTH -//!HEIGHT INPUT_HEIGHT -//!FORMAT R16G16B16A16_FLOAT -Texture2D tex11; - - -//!PASS 1 -//!DESC Conv-4x3x3x3 -//!IN INPUT -//!OUT tex1, tex2, tex3 -//!BLOCK_SIZE 16 -//!NUM_THREADS 64 - -void Pass1(uint2 blockStart, uint3 threadId) { - uint2 gxy = (Rmp8x8(threadId.x) << 1) + blockStart; - uint2 inputSize = GetInputSize(); - if (gxy.x >= inputSize.x || gxy.y >= inputSize.y) { - return; - } - float2 inputPt = GetInputPt(); - - uint i, j; - - float3 src[4][4]; - [unroll] - for (i = 0; i <= 2; i += 2) { - [unroll] - for (j = 0; j <= 2; j += 2) { - float2 tpos = (gxy + uint2(i, j)) * inputPt; - const float4 sr = INPUT.GatherRed(sam, tpos); - const float4 sg = INPUT.GatherGreen(sam, tpos); - const float4 sb = INPUT.GatherBlue(sam, tpos); - - // w z - // x y - src[i][j] = float3(sr.w, sg.w, sb.w); - src[i][j + 1] = float3(sr.x, sg.x, sb.x); - src[i + 1][j] = float3(sr.z, sg.z, sb.z); - src[i + 1][j + 1] = float3(sr.y, sg.y, sb.y); - } - } - - [unroll] - for (i = 1; i <= 2; ++i) { - [unroll] - for (j = 1; j <= 2; ++j) { - uint2 destPos = gxy + uint2(i - 1, j - 1); - - if (i != 1 || j != 1) { - if (destPos.x >= inputSize.x || destPos.y >= inputSize.y) { - continue; - } - } - - float4 result = mul(src[i - 1][j - 1], float3x4(-0.26345107, 0.18636681, 0.068192646, 0.06335259, -0.5026903, -0.39884016, -0.14562744, -0.24653248, -0.44533378, 0.52169526, -0.35453957, 0.25303423)); - result += mul(src[i - 1][j], float3x4(-0.22396083, 0.1324318, 0.47152156, -0.3061965, -0.06026671, -0.26795772, 0.0081171375, -0.32897332, -0.16401465, -0.1018444, 0.48241594, -0.09054633)); - result += mul(src[i - 1][j + 1], float3x4(0.25090155, -0.15917313, 0.028407926, -0.24014995, 0.4114972, -0.45535553, 0.08742311, 0.16796699, 0.0995656, -0.4009339, 0.21471445, 0.2708967)); - result += mul(src[i][j - 1], float3x4(-0.16269766, 0.16389379, -0.12857921, -0.1602467, -0.16460834, 0.15754342, 0.46217716, 0.20442651, 0.0548621, -0.018400457, 0.38643107, -0.29171357)); - result += mul(src[i][j], float3x4(-0.24035631, -0.33344224, -0.3904698, -0.4168555, -0.42237657, 0.36649242, 0.41396108, -0.38945103, -0.5806718, 0.035621256, 0.09171773, -0.54301006)); - result += mul(src[i][j + 1], float3x4(0.15957133, -0.035278857, 0.1318051, 0.6896821, 0.18556473, 0.16378926, 0.32670698, 0.2675555, 0.08802092, 0.41140598, 0.05322177, 0.5030955)); - result += mul(src[i + 1][j - 1], float3x4(-0.082798496, 0.24381381, -0.30908522, 0.04553323, 0.25664318, 0.4123797, -0.29377607, 0.15920162, 0.13717672, 0.027625162, 0.25476956, 0.21843456)); - result += mul(src[i + 1][j], float3x4(0.14534818, -0.239681, 0.22961527, 0.3814783, 0.1233398, 0.2449555, 0.015051085, 0.1661234, -0.27740797, -0.29109767, -0.19438179, -0.027439274)); - result += mul(src[i + 1][j + 1], float3x4(0.0011904882, -0.01287622, -0.1573707, -0.13167281, -0.12803882, -0.079415865, -0.04034391, -0.09625339, 0.23190106, -0.26743674, -0.48981485, -0.2063946)); - result += float4(0.034235504, 0.039522275, -0.032817896, -0.0031068379); - tex1[destPos] = result; - - result = mul(src[i - 1][j - 1], float3x4(-0.17155029, -0.084075995, 0.2281505, 0.38326037, 0.18672232, -0.2562305, 0.30811027, 0.30188802, -0.24588907, 0.088734694, 0.14092724, -0.18793459)); - result += mul(src[i - 1][j], float3x4(-0.47514066, 0.51882815, 0.1561294, -0.043147214, -0.19554369, 0.19514531, -0.14636773, 0.11425865, -0.2772368, 0.5388449, 0.54875004, -0.4526634)); - result += mul(src[i - 1][j + 1], float3x4(0.11270131, 0.44642356, -0.066219814, 0.15781905, 0.056682296, 0.026522577, 0.05600635, -0.13799536, 0.15637676, -0.15661198, 0.53794587, 0.09693692)); - result += mul(src[i][j - 1], float3x4(-0.23679815, 0.16397353, 0.37343305, 0.07477207, -0.36061585, 0.24027273, 0.3222875, 0.05577238, -0.17547923, 0.11737104, 0.10193468, -0.056727592)); - result += mul(src[i][j], float3x4(0.2335428, -0.5571976, 0.13586389, -0.3443148, 0.4537042, -0.59349614, -0.24114902, 0.08669349, 0.2881981, -0.29106617, -0.47775048, 0.22723311)); - result += mul(src[i][j + 1], float3x4(0.006350133, -0.28196353, 0.22710627, 0.30080464, -0.3500525, 0.09254133, -0.48047104, -0.30452347, -0.077637784, -0.11856046, 0.07377078, 0.44280833)); - result += mul(src[i + 1][j - 1], float3x4(0.2200762, 0.3665277, 0.043291833, 0.21484855, 0.15553318, -0.035003938, 0.14891839, -0.29007155, 0.23154758, -0.2348225, 0.48130423, 0.00733271)); - result += mul(src[i + 1][j], float3x4(0.28228128, 0.054867495, 0.08010268, -0.2980908, 0.15146615, -0.058449056, -0.43990552, -0.5963296, 0.09321943, 0.20146254, -0.08043876, 0.017381484)); - result += mul(src[i + 1][j + 1], float3x4(0.076894, 0.16354772, 0.25471574, 0.24382424, -0.15274979, -0.19706573, -0.30667382, 0.523845, 0.023073493, 0.34462887, -0.3384359, 0.18867111)); - result += float4(0.014904483, -0.009271063, 0.04884906, 0.0106121525); - tex2[destPos] = result; - - result = mul(src[i - 1][j - 1], float3x4(-0.34360278, -0.28731042, -0.017787619, 0.36802426, 0.33655256, -0.24784079, 0.29148427, 0.28857, -0.3111454, 0.0030706236, -0.25914, 0.5528963)); - result += mul(src[i - 1][j], float3x4(0.12459981, -0.17094392, -0.18776429, 0.37819883, 0.1320519, 0.21927781, -0.16188109, 0.050895408, -0.06871313, 0.16754176, 0.29934305, 0.052247107)); - result += mul(src[i - 1][j + 1], float3x4(-0.016753385, -0.0935026, -0.3025131, 0.029084548, -0.17713268, 0.23525053, 0.015773006, 0.5464473, 0.49457568, 0.03073306, 0.18685353, 0.28700578)); - result += mul(src[i][j - 1], float3x4(0.135332, 0.07585244, 0.05262212, -0.15484884, -0.13468477, 0.5161883, 0.10347934, -0.37127933, 0.12426171, 0.48973167, 0.19040361, -0.24403319)); - result += mul(src[i][j], float3x4(-0.54557467, 0.07250278, 0.37912187, 0.0044768555, -0.47080016, -0.4050018, 0.64416456, -0.58235925, -0.28048036, -0.32962233, -0.28131053, 0.022653949)); - result += mul(src[i][j + 1], float3x4(0.17059836, 0.016603703, 0.34638256, 0.028987328, 0.43271738, -0.15030707, 0.072848, 0.1422675, -0.23391044, -0.12179815, 0.37569857, -0.056668952)); - result += mul(src[i + 1][j - 1], float3x4(-0.0428437, 0.15237094, -0.26750615, 0.053740855, -0.04772152, -0.13561963, -0.20043467, -0.018060924, 0.29031327, -0.17592178, -0.5016104, -0.36639994)); - result += mul(src[i + 1][j], float3x4(0.39091983, -0.257284, -0.39293087, -0.1182859, -0.46328986, -0.1585645, -0.32158652, 0.41519204, 0.21179573, -0.3613411, -0.032484483, -0.03755994)); - result += mul(src[i + 1][j + 1], float3x4(0.42772895, 0.11436431, -0.115817815, -0.29173127, 0.57807744, -0.21997264, -0.49362126, 0.021626333, 0.1258072, -0.062251803, -0.16541855, 0.061321106)); - result += float4(-0.017981518, -0.012223751, -0.0033700857, 0.013441364); - tex3[destPos] = result; - } - } -} - - -//!PASS 2 -//!DESC Conv-4x3x3x24, Conv-4x1x1x40 -//!IN tex1, tex2, tex3 -//!OUT tex4, tex5, tex6, tex7 -//!BLOCK_SIZE 8 -//!NUM_THREADS 64 - -void Pass2(uint2 blockStart, uint3 threadId) { - uint2 gxy = Rmp8x8(threadId.x) + blockStart; - uint2 inputSize = GetInputSize(); - if (gxy.x >= inputSize.x || gxy.y >= inputSize.y) { - return; - } - - float2 inputPt = GetInputPt(); - float2 pos = (gxy + 0.5f) * inputPt; - - // [ a, d, g ] - // [ b, e, h ] - // [ c, f, i ] - float4 a1 = tex1.SampleLevel(sam, pos - inputPt, 0); - float4 b1 = tex1.SampleLevel(sam, pos + float2(-inputPt.x, 0), 0); - float4 c1 = tex1.SampleLevel(sam, pos + float2(-inputPt.x, inputPt.y), 0); - float4 d1 = tex1.SampleLevel(sam, pos + float2(0, -inputPt.y), 0); - float4 e1 = tex1.SampleLevel(sam, pos, 0); - float4 f1 = tex1.SampleLevel(sam, pos + float2(0, inputPt.y), 0); - float4 g1 = tex1.SampleLevel(sam, pos + float2(inputPt.x, -inputPt.y), 0); - float4 h1 = tex1.SampleLevel(sam, pos + float2(inputPt.x, 0), 0); - float4 i1 = tex1.SampleLevel(sam, pos + inputPt, 0); - - float4 na1 = max(-a1, 0); - float4 nb1 = max(-b1, 0); - float4 nc1 = max(-c1, 0); - float4 nd1 = max(-d1, 0); - float4 ne1 = max(-e1, 0); - float4 nf1 = max(-f1, 0); - float4 ng1 = max(-g1, 0); - float4 nh1 = max(-h1, 0); - float4 ni1 = max(-i1, 0); - - a1 = max(a1, 0); - b1 = max(b1, 0); - c1 = max(c1, 0); - d1 = max(d1, 0); - e1 = max(e1, 0); - f1 = max(f1, 0); - g1 = max(g1, 0); - h1 = max(h1, 0); - i1 = max(i1, 0); - - float4 a2 = tex2.SampleLevel(sam, pos - inputPt, 0); - float4 b2 = tex2.SampleLevel(sam, pos + float2(-inputPt.x, 0), 0); - float4 c2 = tex2.SampleLevel(sam, pos + float2(-inputPt.x, inputPt.y), 0); - float4 d2 = tex2.SampleLevel(sam, pos + float2(0, -inputPt.y), 0); - float4 e2 = tex2.SampleLevel(sam, pos, 0); - float4 f2 = tex2.SampleLevel(sam, pos + float2(0, inputPt.y), 0); - float4 g2 = tex2.SampleLevel(sam, pos + float2(inputPt.x, -inputPt.y), 0); - float4 h2 = tex2.SampleLevel(sam, pos + float2(inputPt.x, 0), 0); - float4 i2 = tex2.SampleLevel(sam, pos + inputPt, 0); - - float4 na2 = max(-a2, 0); - float4 nb2 = max(-b2, 0); - float4 nc2 = max(-c2, 0); - float4 nd2 = max(-d2, 0); - float4 ne2 = max(-e2, 0); - float4 nf2 = max(-f2, 0); - float4 ng2 = max(-g2, 0); - float4 nh2 = max(-h2, 0); - float4 ni2 = max(-i2, 0); - - a2 = max(a2, 0); - b2 = max(b2, 0); - c2 = max(c2, 0); - d2 = max(d2, 0); - e2 = max(e2, 0); - f2 = max(f2, 0); - g2 = max(g2, 0); - h2 = max(h2, 0); - i2 = max(i2, 0); - - float4 a3 = tex3.SampleLevel(sam, pos - inputPt, 0); - float4 b3 = tex3.SampleLevel(sam, pos + float2(-inputPt.x, 0), 0); - float4 c3 = tex3.SampleLevel(sam, pos + float2(-inputPt.x, inputPt.y), 0); - float4 d3 = tex3.SampleLevel(sam, pos + float2(0, -inputPt.y), 0); - float4 e3 = tex3.SampleLevel(sam, pos, 0); - float4 f3 = tex3.SampleLevel(sam, pos + float2(0, inputPt.y), 0); - float4 g3 = tex3.SampleLevel(sam, pos + float2(inputPt.x, -inputPt.y), 0); - float4 h3 = tex3.SampleLevel(sam, pos + float2(inputPt.x, 0), 0); - float4 i3 = tex3.SampleLevel(sam, pos + inputPt, 0); - - float4 na3 = max(-a3, 0); - float4 nb3 = max(-b3, 0); - float4 nc3 = max(-c3, 0); - float4 nd3 = max(-d3, 0); - float4 ne3 = max(-e3, 0); - float4 nf3 = max(-f3, 0); - float4 ng3 = max(-g3, 0); - float4 nh3 = max(-h3, 0); - float4 ni3 = max(-i3, 0); - - a3 = max(a3, 0); - b3 = max(b3, 0); - c3 = max(c3, 0); - d3 = max(d3, 0); - e3 = max(e3, 0); - f3 = max(f3, 0); - g3 = max(g3, 0); - h3 = max(h3, 0); - i3 = max(i3, 0); - - float4 conv2d_2_tf = mul(a1, float4x4(0.1881249, -0.14544061, -0.022969106, 0.088232316, 0.0058642747, -0.049336948, -0.039974928, 0.06410949, -0.09211665, -0.034005307, -0.1095955, 0.10930763, -0.26397142, 0.1384094, 0.017342392, -0.21376696)); - conv2d_2_tf += mul(b1, float4x4(-0.14526816, -0.0639951, 0.11742242, -0.006982521, -0.05208895, 0.089485295, -0.19564004, -0.08121572, -0.11621622, 0.15375662, -0.15378582, 0.0596373, 0.14132364, -0.06385903, 0.05449634, -0.047440365)); - conv2d_2_tf += mul(c1, float4x4(-0.082622305, -0.23856479, 0.06367865, -0.019509695, 0.094882965, -0.04511791, 0.16706854, 0.20536391, 0.1409632, -0.10635743, 0.038904104, -0.0039008786, 0.16198882, -0.17409256, 0.13213669, 0.08329318)); - conv2d_2_tf += mul(d1, float4x4(-0.1186756, 0.2009846, -0.086417995, 0.20491274, -0.13763973, -0.0800847, 0.16069777, 0.10931271, 0.14152408, 0.047218926, 0.041168302, -0.054257084, -0.08315953, -0.1573787, 0.20787828, 0.118524544)); - conv2d_2_tf += mul(e1, float4x4(-0.19046788, 0.10213364, -0.112078644, -0.16287695, 0.011410189, -0.016858546, -0.09383451, -0.063516155, -0.17561492, -0.15199865, -0.112707786, -0.18099716, 0.19017689, -0.20048961, -0.5382596, -0.24332014)); - conv2d_2_tf += mul(f1, float4x4(-0.1465597, 0.044423096, 0.04632811, -0.015121401, -0.051081203, -0.09574356, -0.10018257, -0.019390205, -0.1562855, 0.041693382, -0.012624074, 0.057703923, 0.09825134, 0.1544577, 0.1683734, 0.018580355)); - conv2d_2_tf += mul(g1, float4x4(-0.22240564, -0.051839057, 0.12950379, 0.0048653902, 0.0144696245, -0.10698864, -0.08654499, -0.131132, 0.15429983, 0.025204081, -0.09136411, -0.053068906, -0.005858075, -0.02560129, 0.0469077, 0.018962694)); - conv2d_2_tf += mul(h1, float4x4(-0.4698737, -0.053354982, 0.27541625, -0.020424731, 0.06935965, 0.008045162, -0.11538889, -0.038876567, -0.049084928, 0.1629101, -0.012742019, 0.12038333, -0.0705842, 0.12735052, 0.17640172, 0.050716672)); - conv2d_2_tf += mul(i1, float4x4(-0.10064598, 0.016594354, -0.14633141, -0.09175336, -0.12889755, -0.1671076, 0.22031903, 0.0759859, 0.102435045, -0.072596334, -0.17714, 0.03531571, -0.022843607, 0.047148425, 0.105391234, 0.05260699)); - conv2d_2_tf += mul(a2, float4x4(-0.1057386, 0.020954097, -0.022159133, 0.064248964, -0.031145383, -0.008180922, -0.023611609, 0.05197287, -0.017418958, 0.02461813, 0.0584847, -0.10087345, -0.16315617, 0.15651843, 0.10478647, 0.08347392)); - conv2d_2_tf += mul(b2, float4x4(-0.01323452, 0.044956483, -0.007983463, 0.10643116, -0.030048033, -0.11766427, -0.101889476, 0.015120098, 0.031690307, 0.014470776, -0.10197176, -0.10045749, -0.065616645, -0.15230782, -0.26183948, -0.071056716)); - conv2d_2_tf += mul(c2, float4x4(0.026220636, -0.044518135, 0.17167594, 0.3016424, 0.12054841, 0.042369425, 0.04208856, 0.14938886, -0.07018442, -0.008244587, 0.14260693, -0.094418734, -0.032693435, 0.042990524, -0.053002246, -0.003936231)); - conv2d_2_tf += mul(d2, float4x4(-0.10141095, 0.17178011, -0.10951717, -0.28119737, 0.008288983, 0.14197187, 0.10903869, 0.017220182, 0.041842293, -0.03106527, -0.05892881, 0.02668739, 0.072505936, -0.060759444, 0.00032896115, -0.03440771)); - conv2d_2_tf += mul(e2, float4x4(0.13831837, -0.13864368, 0.15232176, 0.31198958, 0.033965178, 0.053397447, -0.30352455, -0.17199865, -0.06429645, 0.013913047, 0.10764071, -0.12238359, -0.04544379, 0.17074125, 0.024108075, -0.14521888)); - conv2d_2_tf += mul(f2, float4x4(-0.11011318, -0.0102100335, -0.37701187, -0.36465186, 0.16052358, -0.06683314, 0.16916892, 0.23348652, -0.17332914, 0.007918098, -0.055450343, 0.12134491, 0.002598775, 0.050541576, 0.16586582, -0.08609246)); - conv2d_2_tf += mul(g2, float4x4(0.055008903, -0.038048673, 0.12065314, -0.034293417, 0.026340824, 0.0635937, 0.0072025824, 0.1099919, -0.022833373, 0.06988719, 0.098066956, 0.09838032, 0.027212605, -0.10769643, 0.025036965, 0.07822364)); - conv2d_2_tf += mul(h2, float4x4(0.12550583, -0.015590264, -0.20009072, -0.2595937, -0.040573828, -0.07032441, 0.13428123, 0.0024277875, -0.103335135, -0.08461066, 0.05634581, -0.113169014, 0.05591198, -0.16420694, -0.06915715, -0.19497992)); - conv2d_2_tf += mul(i2, float4x4(0.088232726, -0.05118527, 0.119473234, 0.23262945, 0.06746001, 0.14686997, -0.25685823, 0.08349066, 0.120035954, 0.11132579, 0.1024914, 0.008478224, -0.054700002, -0.029634893, 0.050064556, -0.08939752)); - conv2d_2_tf += mul(a3, float4x4(0.022236016, -0.14602192, -0.011037687, 0.09127931, 0.14263593, 0.2303995, -0.07378528, 0.07426219, -0.25500375, 0.18845809, -0.065374866, 0.016772734, 0.02813176, 0.15021992, -0.032982655, 0.0046127643)); - conv2d_2_tf += mul(b3, float4x4(0.110158965, 0.02073459, 0.1380525, 0.017634321, -0.3546499, -0.099760525, -0.1195462, 0.057210118, -0.53130746, 0.23352407, -0.18252264, -0.19651698, -0.10013627, -0.006907238, -0.022171183, 0.023419948)); - conv2d_2_tf += mul(c3, float4x4(-0.009217382, 0.00943576, 0.005295363, 0.010542551, -0.21079898, -0.14469005, -0.19105618, 0.2098414, 0.18261504, 0.19765937, 0.044775106, -0.25939676, 0.072466746, -0.08828442, 0.066161856, 0.05692894)); - conv2d_2_tf += mul(d3, float4x4(-0.051633067, 0.019243274, 0.28932014, -0.029704608, -0.06255436, -0.4573925, -0.10963281, 0.121834375, 0.10874706, -0.093909726, 0.06983889, 0.048236616, -0.15379356, -0.06354611, -0.10668147, -0.02901699)); - conv2d_2_tf += mul(e3, float4x4(-0.044167574, 0.022249546, -0.3618917, -0.054136246, -0.105739385, -0.22325896, -0.070169605, -0.19650152, 0.07689512, -0.17047665, -0.07742679, 0.031095566, -0.01903123, -0.033752028, -0.2286711, 0.044381924)); - conv2d_2_tf += mul(f3, float4x4(-0.05709193, 0.15251294, -0.16776492, 0.09025173, 0.18235344, 0.3685535, -0.053927444, 0.10351524, -0.0938133, -0.26824594, -0.036424845, -0.106756285, -0.13051414, -0.07613318, -0.10721611, -0.13445549)); - conv2d_2_tf += mul(g3, float4x4(-0.0268394, 0.017245602, 0.1185864, 0.031915247, -0.037321728, 0.037805032, 0.13701047, 0.025731707, 0.03791209, -0.16549957, 0.08953334, -0.13901101, -0.1287722, 0.072961085, 0.06859001, 0.18934746)); - conv2d_2_tf += mul(h3, float4x4(-0.11152981, 0.13712928, -0.05714947, 0.05542204, -0.32208005, -0.015176284, 0.10014709, -0.030125491, -0.04422843, 0.12897238, 0.108573034, -0.025267191, 0.02247499, -0.058167085, -0.15205052, 0.043249656)); - conv2d_2_tf += mul(i3, float4x4(-0.12951276, -0.14417744, 0.012708804, -0.0040302873, 0.09192804, -0.092346616, -0.09659876, -0.13512622, -0.0737095, 0.002481852, 0.048459593, 0.05455724, -0.14035852, 0.07777282, 0.07471883, 0.107781895)); - conv2d_2_tf += mul(na1, float4x4(0.028793033, -0.039604917, -0.0045903274, -0.05023892, 0.04976248, -0.026074547, 0.1733191, -0.06694405, -0.12434122, 0.12477937, -0.105804294, 0.06170465, 0.33725888, -0.15944988, 0.09790923, 0.030690596)); - conv2d_2_tf += mul(nb1, float4x4(0.005191585, 0.08373177, -0.018288689, 0.020527333, -0.055718876, -0.12754384, 0.17755422, 0.1597085, 0.17601304, -0.0258804, 0.16454586, 0.106551126, -0.20891763, -0.05360957, -0.24229631, -0.15886526)); - conv2d_2_tf += mul(nc1, float4x4(0.03740399, -0.0043318006, -0.010840595, -0.01674406, -0.17876416, 0.09188681, -0.12203759, -0.09808559, 0.1243873, -0.184597, 0.07484877, 0.14448164, -0.15161137, 0.033237204, -0.054772068, -0.085399576)); - conv2d_2_tf += mul(nd1, float4x4(0.071139924, 0.025827989, 0.021663137, -0.12484576, -0.07799051, 0.20053016, 0.014714873, -0.041652568, 0.046397317, -0.07650734, 0.06753141, 0.080667324, 0.4557549, -0.029605106, -0.25674006, -0.27842438)); - conv2d_2_tf += mul(ne1, float4x4(0.16805562, -0.03722638, 0.021958483, -0.04969856, -0.15340807, -0.22158863, -0.25280216, -0.024268134, 0.085401855, 0.22427009, -0.04698029, -0.071075134, -0.10739174, 0.030285811, 0.31068414, 0.2882289)); - conv2d_2_tf += mul(nf1, float4x4(-0.010069354, -0.045132317, -0.08054911, 0.19212297, -0.11246117, 0.203382, 0.10145021, 0.1476792, -0.022835081, 0.16916804, -0.018178321, 0.076025024, -0.29570428, -0.007177177, -0.1047155, -0.0178633)); - conv2d_2_tf += mul(ng1, float4x4(0.076137505, 0.117270656, -0.077183075, -0.052782975, -0.08236995, 0.053947527, 0.13501388, 0.17139077, -0.2424162, -0.15007298, 0.123724684, 0.09327283, 0.19777925, 0.07314544, -0.18668725, -0.010371631)); - conv2d_2_tf += mul(nh1, float4x4(0.15866037, 0.053233996, -0.026709981, -0.1574147, -0.012303242, 0.06893102, 0.031804018, 0.10116885, -0.016902728, -0.082480945, 0.05133729, -0.20160739, -0.012635841, 0.032104325, 0.00968726, -0.018941477)); - conv2d_2_tf += mul(ni1, float4x4(-0.02683365, 0.14024723, 0.0020279875, 0.035137076, -0.019948762, 0.3120297, -0.018649966, -0.17814124, -0.14863688, -0.12977526, -0.09194036, 0.19637106, 0.12040974, 0.09383599, 0.10559805, -0.0319509)); - conv2d_2_tf += mul(na2, float4x4(-0.07015076, -0.07818044, 0.12413185, -0.0018199648, -0.015275738, -0.21548629, 0.046161238, -0.10475311, 0.082367115, 0.0053079966, 0.09559984, 0.039583992, -0.1681236, -0.23862287, -0.09229484, -0.12317666)); - conv2d_2_tf += mul(nb2, float4x4(-0.17587087, -0.097817905, 0.08857801, 0.14012139, -0.20023742, 0.029083535, 0.056073546, -0.06810832, 0.08625035, 0.023427716, 0.1797412, 0.048568305, -0.09278378, -0.09250215, -0.12440772, 0.2587798)); - conv2d_2_tf += mul(nc2, float4x4(-0.24181388, -0.016290328, -0.026988767, -0.005399553, -0.061761368, -0.0013004051, -0.1990831, -0.07799404, 0.03282008, 0.079514205, -0.07474829, -0.36701006, 0.078521594, -0.156468, 0.09041213, 0.1292482)); - conv2d_2_tf += mul(nd2, float4x4(-0.21960634, 0.041841425, 0.122728646, 0.06800145, 0.07355482, 0.26123464, -0.13518283, -0.05085496, -0.099832244, 0.04960356, 0.066544525, 0.09741243, -0.10965899, -0.16163626, 0.09816793, -0.014595947)); - conv2d_2_tf += mul(ne2, float4x4(0.07614604, -0.062298786, -0.07941662, -0.22525579, -0.29955792, 0.11145522, 0.123146005, 0.13863817, 0.15309983, 0.025902487, -0.08610474, -0.07598799, -0.26134565, -0.2818921, 0.0046356185, 0.007307074)); - conv2d_2_tf += mul(nf2, float4x4(-0.15936229, -0.10145381, 0.058567517, 0.21258314, -0.18010478, -0.22477242, -0.039975245, -0.34447697, -0.21647838, 0.31467855, -0.0674453, -0.5146147, 0.05382176, -0.026282668, -0.24090777, 0.10222359)); - conv2d_2_tf += mul(ng2, float4x4(-0.1045028, -0.027515164, 0.013251722, 0.108239084, 0.03163253, -0.030052185, 0.10836872, 0.15349132, 0.09593661, 0.0062710177, -0.19837233, -0.098303355, -0.23947543, -0.04082913, 0.16908304, -0.031784274)); - conv2d_2_tf += mul(nh2, float4x4(-0.07773699, 0.30408737, 0.10054892, 0.36721498, 0.51369953, -0.11931886, -0.17019019, -0.3288588, 0.11095048, -0.29225063, -0.075574756, -0.18392691, -0.10289336, 0.06882282, 0.20403436, 0.12073833)); - conv2d_2_tf += mul(ni2, float4x4(0.024539007, 0.053005982, -0.099204265, -0.084534295, -0.2587164, -0.31929657, 0.07193254, 0.18271501, -0.043669797, 0.062497724, -0.055462, 0.057130013, -0.015285072, -0.030743862, -0.07051513, -0.13783172)); - conv2d_2_tf += mul(na3, float4x4(-0.4343681, 0.35928357, -0.004770178, -0.079942055, 0.014088603, -0.20866469, -0.1378781, -0.06831558, 0.21436058, -0.08427488, 0.2455502, -0.065596916, -0.06559933, -0.027101375, 0.023555819, -0.20939256)); - conv2d_2_tf += mul(nb3, float4x4(-0.37720296, -0.111260146, -0.25392932, -0.33377793, -0.17806955, -0.008747484, 0.17404033, 0.058826912, 0.0039355545, -0.18436235, 0.15803719, 0.15143508, 0.11155828, 0.09333553, -0.17960371, -0.036842924)); - conv2d_2_tf += mul(nc3, float4x4(-0.087490946, 0.0959697, -0.08301798, -0.19364063, -0.00996324, 0.014655412, 0.021732382, 0.07269497, 0.012744119, 0.01542146, 0.109438084, 0.18674947, -0.05728511, 0.017406877, 0.036412247, -0.044986803)); - conv2d_2_tf += mul(nd3, float4x4(0.30902067, 0.25019556, -0.079495244, -0.26099077, 0.08450634, -0.08346094, 0.004498276, -0.119334444, -0.08587327, -0.019446453, -0.1811446, -0.16136086, 0.006683898, 0.0005228834, -0.11937812, -0.2045503)); - conv2d_2_tf += mul(ne3, float4x4(0.19326456, -0.052496854, 0.12926556, 0.10167019, 0.090374604, 0.07595169, -0.0048561483, 0.12414255, 0.19320521, -0.027459998, 0.08993327, -0.035830285, 0.006461366, 0.023297347, 0.0691706, -0.00831113)); - conv2d_2_tf += mul(nf3, float4x4(0.13971736, 0.0788502, 0.12267767, 0.004433991, -0.053574555, -0.08087108, -0.26019198, -0.04175351, -0.13934188, 0.04144695, -0.070562504, -0.068388134, -0.1347503, -0.02173245, -0.1099242, -0.020897312)); - conv2d_2_tf += mul(ng3, float4x4(0.07843604, 0.04441641, -0.016214373, -0.15351163, -0.021339556, 0.023823377, -0.01442564, -0.09113205, -0.02552644, 0.14885889, -0.16178642, 0.14472331, 0.14082494, 0.05760455, -0.11503234, -0.16907685)); - conv2d_2_tf += mul(nh3, float4x4(-0.042953692, -0.3268466, 0.13181087, -0.06399399, 0.17543526, 0.111214496, 0.07369484, -0.003378238, 0.040965978, -0.0073295045, 0.07711077, -0.033094298, -0.08758825, -0.01715938, 0.056862406, -0.010732023)); - conv2d_2_tf += mul(ni3, float4x4(-0.039256442, -0.07153648, 0.10314899, -0.1192048, -0.033410206, 0.13077301, 0.19343375, -0.07479033, 0.10759806, -0.037313893, 0.06156247, 0.021744521, -0.18148352, -0.15683053, 0.017884498, -0.11338723)); - conv2d_2_tf += float4(-0.077597156, 0.024995416, 0.0048880246, -0.06210122); - float4 nconv2d_2_tf = max(-conv2d_2_tf, 0); - conv2d_2_tf = max(conv2d_2_tf, 0); - - float4 conv2d_1_tf = mul(a1, float4x4(0.10368956, 0.09174666, 0.07265347, 0.009965846, 0.04307676, 0.018726716, 0.064217605, -0.024381645, 0.013237381, 0.039251406, 0.13164084, -0.05265028, -0.08619517, 0.015469731, 0.10171868, -0.11194108)); - conv2d_1_tf += mul(b1, float4x4(-0.055484463, 0.1386706, -0.22939423, -0.2222723, 0.04815343, 0.05425625, 0.08234074, 0.12962975, 0.030559294, -0.07823733, 0.12347866, -0.13917705, -0.031347297, 0.010592373, -0.38942683, -0.302033)); - conv2d_1_tf += mul(c1, float4x4(0.06968848, -0.03574659, 0.11817242, 0.044270225, 0.0481696, 0.045347195, -0.14479072, 0.06971279, 0.012434736, 0.03927546, 0.13076504, 0.032268204, 0.040274065, 0.053418823, -0.05195065, 0.1341056)); - conv2d_1_tf += mul(d1, float4x4(0.1314648, 0.08953099, -0.058160458, -0.098807305, -0.08652445, -0.19136623, -0.012327089, 0.14297265, 0.11436408, 0.031837817, -0.0038611747, 0.08295747, 0.19534546, -0.033664998, -0.51042134, -0.21606028)); - conv2d_1_tf += mul(e1, float4x4(-0.332711, -0.2260786, 0.35732532, 0.026584813, 0.16421017, 0.21153966, -0.112725854, -0.048803244, 0.059562314, -0.010458478, 0.0063304375, -0.007279937, -0.41918445, 0.10137393, -0.0989079, -0.17768846)); - conv2d_1_tf += mul(f1, float4x4(-0.22947264, 0.008074958, -0.03876367, 0.28019628, -0.18640186, 0.072562195, -0.001338717, 0.17349707, 0.13131878, 0.05085823, -0.11547487, -0.084437385, -0.18131672, 0.026830718, 0.0960529, -0.014084568)); - conv2d_1_tf += mul(g1, float4x4(0.13153158, 0.079937235, -0.14291838, -0.062477887, -0.0690248, 0.15090927, 0.060723048, -0.044703092, 0.005483621, -0.113471694, 0.048640195, -0.024538955, -0.01751092, 0.19206041, -0.1859277, -0.22007878)); - conv2d_1_tf += mul(h1, float4x4(-0.04971548, -0.38541326, -0.080354154, -0.1132633, -0.13348146, 0.11406493, 0.05543971, 0.022810424, -0.09030199, -0.053045455, -0.084034644, 0.0014670533, 0.0007018557, -0.24078067, 0.047226585, 0.08619653)); - conv2d_1_tf += mul(i1, float4x4(-0.08993396, -0.09246378, 0.11467184, 0.060891952, -0.022887891, -0.008537377, 0.13542707, 0.08030356, -0.06174077, -0.07314582, -0.111782126, -0.08939319, -0.09756803, -0.15771574, 0.073002145, 0.035939205)); - conv2d_1_tf += mul(a2, float4x4(-0.09398606, -0.118093155, 0.024832802, 0.049131367, 0.06665196, -0.039545495, -0.107865654, -0.043897964, -0.03278348, -0.111089505, 0.12056342, -0.10977613, -0.05880801, -0.08684503, -0.15480064, -0.09669209)); - conv2d_1_tf += mul(b2, float4x4(-0.12028866, -0.0130571015, 0.010480521, 0.28919983, 0.050575808, -0.07968808, -0.15499628, -0.13613448, 0.030993043, 0.13226634, -0.12666325, -0.010337325, -0.025353834, 0.017561335, -0.08171704, -0.17280379)); - conv2d_1_tf += mul(c2, float4x4(-0.0008190666, 0.017923795, -0.13926646, -0.00083633314, -0.14120303, 0.109396234, 0.026602108, 0.2108425, 0.15093753, -0.0016773659, 0.028220268, 0.09914804, -0.045055833, 0.040082425, 0.007756443, -0.04522211)); - conv2d_1_tf += mul(d2, float4x4(0.059589684, 0.04780217, 0.30785602, 0.25626636, 0.08686253, 0.11348654, 0.042249523, -0.2264382, -0.058502045, 0.05044742, 0.0031711252, -0.021721566, -0.011926813, 0.042892855, -0.08586602, -0.029168598)); - conv2d_1_tf += mul(e2, float4x4(0.09367661, -0.019030625, -0.34638473, -0.10968469, -0.16300671, 0.21311292, 0.11657136, -0.044009518, 0.10225506, -0.044505168, 0.20920436, -0.018161744, -0.018144146, 0.026626088, -0.056913715, 0.15370414)); - conv2d_1_tf += mul(f2, float4x4(-0.28757727, 0.14743091, -0.021321807, -0.048045393, -0.109708, -0.14760888, 0.15246773, -0.028329216, 0.009206364, -0.06396112, 0.12593451, 0.052947026, 0.066429235, -0.08044728, 0.0070432564, -0.057647638)); - conv2d_1_tf += mul(g2, float4x4(-0.023919886, -0.20876022, 0.05590491, 0.12671952, -0.07277091, 0.024939056, 0.03633482, -0.10239475, -0.12012349, -0.17192347, 0.014865882, 0.1858935, -0.013352806, -0.04451544, 0.0032296637, 0.09310079)); - conv2d_1_tf += mul(h2, float4x4(-0.29340369, 0.1377685, -0.018134177, -0.0819466, 0.2541578, -0.1270915, -0.12300359, 0.114513785, 0.21511158, -0.060876742, 0.07682154, 0.09775888, -0.09133818, 0.04477866, 0.058042303, -0.027626123)); - conv2d_1_tf += mul(i2, float4x4(-0.098641984, -0.09568759, 0.27307647, 0.044102278, -0.03640084, -0.10440432, -0.011212675, -0.22568303, -0.008232321, 0.14870772, -0.17107275, -0.023316732, 0.03395947, 0.14223643, -0.08063479, 0.14301774)); - conv2d_1_tf += mul(a3, float4x4(-0.08714423, -0.12230681, -0.22175795, -0.10298021, 0.0009175108, 0.19820437, 0.04215484, 0.2772454, 0.046766162, 0.023245906, 0.36313313, -0.29657102, 0.0010776661, 0.047935788, 0.113361314, -0.05614472)); - conv2d_1_tf += mul(b3, float4x4(0.15069975, 0.06458973, 0.08984772, -0.08219822, -0.37328726, -0.03008995, 0.31162828, 0.07075847, -0.13914284, -0.10216768, 0.22251949, -0.30631062, 0.17172062, 0.058428258, -0.11345689, 0.08461611)); - conv2d_1_tf += mul(c3, float4x4(0.007734305, 0.042484675, -0.15685312, -0.048171967, 0.10970874, 0.061090663, -0.08464978, 0.08347133, -0.17933917, 0.2308347, -0.053314723, 0.09323812, -0.04228206, 0.055042125, -0.046495847, -0.032692812)); - conv2d_1_tf += mul(d3, float4x4(-0.09439761, 0.03567186, -0.17220385, -0.103939146, -0.064900115, -0.16004047, 0.004621011, -0.014501001, -0.14071538, -0.05238438, -0.04519603, 0.21972013, -0.007383857, -0.07692677, -0.14034486, 0.08030412)); - conv2d_1_tf += mul(e3, float4x4(-0.22748968, 0.12067121, -0.05225513, 0.04308743, -0.081648685, 0.28658885, 0.37694585, -0.018508147, -0.019247225, 0.095557846, 0.015747357, 0.12365868, -0.076417744, -0.03912286, 0.18391648, -0.09244896)); - conv2d_1_tf += mul(f3, float4x4(-0.00221828, -0.0894836, 0.038467363, -0.019945016, 0.13546647, 0.17713489, -0.17275713, 0.08575425, -0.019129591, 0.16340882, -0.16357088, -0.0033604207, -0.06446814, -0.15712759, 0.18558913, -0.115558594)); - conv2d_1_tf += mul(g3, float4x4(-0.09995351, 0.18885328, -0.057601925, 0.01172547, -0.031203317, -0.1181948, 0.006120215, 0.25098777, -0.06316651, 0.047607217, -0.056073133, -0.029685916, 0.12195799, -0.056664392, -0.054523658, 0.03753435)); - conv2d_1_tf += mul(h3, float4x4(0.007936505, -0.021070726, 0.040594626, 0.061293513, -0.074233375, 0.10112329, -0.19424592, -0.14433385, -0.04661142, -0.09192385, 0.034151867, -0.11941847, 0.046759605, -0.15323174, 0.09908571, 0.18290807)); - conv2d_1_tf += mul(i3, float4x4(-0.012291647, 0.114136524, 0.10576901, -0.012061901, 0.2356885, 0.048024837, 0.18102467, -0.034004245, -0.06746709, 0.09405117, 0.12362687, 0.0254422, 0.22654915, 0.04224264, -0.049588405, 0.11478716)); - conv2d_1_tf += mul(na1, float4x4(-0.021690933, 0.13663062, -0.161411, 0.06806553, -0.1773275, -0.0940566, -0.18002738, 0.047475196, 0.0072157113, -0.008688586, -0.15493456, 0.022294179, 0.041401867, -0.10311516, -0.006603416, 0.059536614)); - conv2d_1_tf += mul(nb1, float4x4(-0.13541889, 0.047185, -0.027699882, 0.060225613, -0.035152074, 0.05752177, -0.026204573, 0.11251955, -0.0049166707, 0.17533402, -0.15755837, 0.16124752, 0.04805776, -0.10309488, 0.15945134, 0.025226792)); - conv2d_1_tf += mul(nc1, float4x4(-0.015074193, -0.094979845, 0.027753184, -0.071142055, -0.17082961, -0.06833402, 0.13620014, -0.24564765, 0.036582932, 0.13075556, 0.036705326, 0.03863992, -0.018921472, -0.0016482361, 0.13597268, -0.038188133)); - conv2d_1_tf += mul(nd1, float4x4(-0.14212462, -0.1483275, 0.05649678, 0.05684924, -0.11407954, 0.13978885, 0.070467845, -0.07458527, -0.19702937, 0.23950967, -0.15242746, -0.26435548, -0.14437793, 0.21487178, 0.4991241, 0.18331984)); - conv2d_1_tf += mul(ne1, float4x4(0.20045248, 0.066468574, -0.015601024, 0.012849705, -0.14952832, -0.06828453, 0.16009094, -0.09515789, -0.1071139, -0.021629127, -0.012993768, -0.022518635, 0.19255438, -0.09875012, 0.07555782, 0.0780372)); - conv2d_1_tf += mul(nf1, float4x4(-0.028311213, -0.025465565, 0.020059558, -0.116105095, -0.042490575, 0.020179577, 0.010893176, -0.11184776, -0.1702318, -0.025035636, 0.008381181, 0.0586714, 0.03539251, -0.0448198, -0.056921933, -0.029987138)); - conv2d_1_tf += mul(ng1, float4x4(0.049813945, 0.08434948, 0.09337763, 0.06701621, -0.061224304, -0.24754077, -0.017353527, -0.042758185, 0.013161995, -0.22947139, 0.019135898, 0.11039477, 0.16954716, -0.25619635, 0.18368678, 0.03542052)); - conv2d_1_tf += mul(nh1, float4x4(-0.15430786, 0.07348774, 0.15545642, 0.20969617, 0.1067826, 0.15255202, 0.020220853, 0.09658389, -0.088782035, -0.19119574, 0.13885954, 0.15108526, -0.07552868, -0.11574438, -0.034102093, -0.031383175)); - conv2d_1_tf += mul(ni1, float4x4(0.061409608, -0.00082869077, -0.08336049, -0.01866603, 0.07322213, -0.1152386, -0.004205211, -0.18793713, 0.091782115, 0.05387527, 0.069104694, 0.25387684, -0.101916246, 0.065856785, -0.020407397, 0.035098225)); - conv2d_1_tf += mul(na2, float4x4(0.06225989, -0.039721318, 0.19908188, 0.08382035, -0.024357362, 0.014932128, -0.060558856, -0.049815435, -0.03166011, 0.0339055, -0.12810327, 0.008812703, 0.06120202, 0.085533425, 0.21571258, -0.20605975)); - conv2d_1_tf += mul(nb2, float4x4(-0.045329664, 0.02261115, -0.0335033, -0.058562186, -0.0099387, 0.0046313554, 0.21475597, 0.04558062, 0.17891279, 0.005057579, 0.22518916, 0.1998231, 0.09627137, -0.2318303, -0.08868813, -0.27863982)); - conv2d_1_tf += mul(nc2, float4x4(-0.15865076, 0.077262044, 0.036153752, 0.07885703, 0.13166751, -0.12820594, -0.05823962, -0.2583444, -0.2245552, -0.04434666, -0.13453422, -0.27865237, 0.014107271, 0.045582164, 0.0064884513, -0.019007552)); - conv2d_1_tf += mul(nd2, float4x4(0.0643133, 0.06440001, -0.14517003, -0.101694606, 0.058990445, 0.11955667, 0.45094532, 0.20261864, 0.07944409, -0.061399437, 0.022036074, 0.046660237, -0.17064287, -0.076766625, 0.25972953, 0.29821205)); - conv2d_1_tf += mul(ne2, float4x4(-0.11031386, -0.05850727, 0.055557184, 0.11549242, 0.12120408, -0.33330265, 0.095613986, 0.09242419, -0.011835885, -0.19384164, -0.01893125, 0.27290896, -0.18104021, 0.044360142, 0.06759539, -0.0027218745)); - conv2d_1_tf += mul(nf2, float4x4(0.19390257, -0.13378039, 0.07428329, 0.016053686, -0.18574655, 0.055462763, -0.2527128, -0.47279125, -0.17490762, 0.21626428, -0.1473371, -0.35594228, 0.054865763, -0.04086486, -0.061911695, 0.051812805)); - conv2d_1_tf += mul(ng2, float4x4(-0.029701848, 0.24927482, 0.00581731, -0.10748679, -0.07500632, 0.033424605, 0.14734372, -0.18966366, 0.031880617, 0.17622112, -0.031867832, -0.10119831, -0.15391265, -0.14308685, 0.093484215, 0.18867014)); - conv2d_1_tf += mul(nh2, float4x4(0.19035357, -0.19525306, -0.025621792, 0.09154427, -0.07798503, -0.22271548, 0.11034287, -0.04197031, -0.24772005, 0.43681505, -0.19703668, -0.2614237, 0.05807699, -0.2631317, -0.020604266, -0.048005704)); - conv2d_1_tf += mul(ni2, float4x4(-0.08587588, 0.13374045, -0.09263761, -0.13216262, -0.11242246, -0.12541875, -0.09835177, 0.1586739, -0.21013282, 0.087373346, 0.107112356, 0.47657737, 0.0459955, -0.07181196, 0.07818155, -0.10435423)); - conv2d_1_tf += mul(na3, float4x4(-0.091803394, -0.32280564, 0.28972253, 0.12908047, 0.06683764, -0.039376236, 0.024078066, 0.18940936, -0.055246543, 0.12222864, -0.0177199, 0.09346665, 0.07164098, 0.065791056, -0.08516637, -0.10187257)); - conv2d_1_tf += mul(nb3, float4x4(-0.12561126, -0.28730518, 0.190799, -0.17922764, 0.04376582, -0.08152354, -0.0690038, -0.10861494, -0.03100546, 0.10962334, -0.20492296, 0.12868984, 0.06536495, 0.08559974, 0.033028, -0.07235402)); - conv2d_1_tf += mul(nc3, float4x4(-0.012734173, -0.12211726, 0.057524282, 0.015053666, -0.052275516, 0.11774483, 0.08221696, -0.024205929, 0.122006595, 0.054565493, -0.049608365, 0.02801238, 0.07593017, 0.074450806, 0.097137615, -0.008985974)); - conv2d_1_tf += mul(nd3, float4x4(-0.32826158, -0.022971062, 0.37642807, 0.38614145, -0.06932448, 0.0641898, -0.09011684, -0.019884817, -0.004897904, 0.07661578, -0.050405186, -0.24849766, 0.04642452, 0.09120379, 0.26060387, -0.2533109)); - conv2d_1_tf += mul(ne3, float4x4(0.09669597, -0.045555357, -0.24132517, -0.28401875, 0.11226361, 0.08378312, -0.07415474, -0.036874313, -0.001286788, 0.14013582, 0.14750466, -0.048925027, 0.13374946, 0.10844033, 0.123459235, -0.10933974)); - conv2d_1_tf += mul(nf3, float4x4(-0.03275827, 0.27429518, -0.0983686, -0.010947437, -0.18409865, 0.12616666, -0.05766888, 0.07149005, -0.13777009, 0.022123039, 0.084938325, 0.015972659, 0.20145003, -0.09534558, -0.0082679195, -0.1515079)); - conv2d_1_tf += mul(ng3, float4x4(0.13148536, -0.3421452, 0.08851102, 0.012056574, -0.1525749, 0.09364548, -0.02235517, -0.1775178, 0.18052714, -0.14639667, 0.07453223, 0.03912742, -0.284782, 0.023833552, 0.09671063, -0.168578)); - conv2d_1_tf += mul(nh3, float4x4(-0.24303597, -0.05585747, -0.21645154, -0.084838174, -0.15413773, -0.15403214, -0.021544017, 0.15751824, -0.027032627, -0.18457665, -0.02174098, -0.0070916233, -0.1609649, -0.32226282, -0.18423033, -0.29629233)); - conv2d_1_tf += mul(ni3, float4x4(0.1602529, 0.026087781, 0.01551678, 0.07093837, -0.007075046, -0.0061597642, -0.0057887356, -0.08935906, 0.0028665168, -0.1038671, -0.093715765, -0.035213456, -0.041290607, -0.15825188, 0.11327359, -0.20286629)); - conv2d_1_tf += float4(-0.062293675, 0.09216847, 0.010529031, 0.03100192); - tex4[gxy] = conv2d_1_tf; - float4 nconv2d_1_tf = max(-conv2d_1_tf, 0); - conv2d_1_tf = max(conv2d_1_tf, 0); - - float4 target = mul(e1, float4x4(-0.02357968, 0.13800439, 0.054744735, -0.32328397, -0.2263118, -0.3222542, -0.15286992, -0.3053175, -0.20046607, 0.025345843, 0.032755207, 0.40165102, 0.03166696, 0.29110438, 0.28861988, 0.05585125)); - target += mul(e2, float4x4(0.11055126, -0.33034575, 0.039494887, -0.17843343, 0.35742196, 0.00032650787, 0.21049741, 0.18823248, -0.1741954, 0.27586365, -0.043366615, 0.02092058, -0.082515135, -0.15504313, 0.13261497, 0.14650741)); - target += mul(e3, float4x4(0.39276633, -0.031067554, -0.08830738, -0.23975314, -0.20294978, 0.030291535, 0.4623106, 0.06494191, 0.042467684, -0.28105733, -0.053258326, -0.17269841, 0.09479501, 0.11930515, 0.1258843, 0.11058792)); - target += mul(ne1, float4x4(-0.18343425, -0.4381688, -0.08248827, -0.42846557, -0.08277779, 0.45192116, 0.21961756, 0.23076119, -0.2093829, -0.29050866, 0.26212537, -0.25469857, -0.4832557, -0.45126852, -0.35072148, -0.18368497)); - target += mul(ne2, float4x4(0.10529696, 0.5964488, 0.13258573, -0.07494986, -0.3341919, 0.19418421, -0.18307082, 0.34982273, -0.0430461, 0.21097268, 0.03212202, -0.015623122, 0.43791813, 0.16207397, 0.123477034, -0.087993294)); - target += mul(ne3, float4x4(-0.01878982, 0.007308694, 0.25769314, 0.18407181, 0.00095180905, -0.2600526, -0.31043288, -0.24622385, 0.07832029, 0.05502411, 0.37793204, -0.07329948, -0.28405467, -0.15038961, 0.19259417, 0.105486296)); - target += mul(conv2d_2_tf, float4x4(0.047820415, 0.3303589, 0.035807017, -0.41168606, -0.2118325, -0.045765184, -0.15234827, 0.28021428, -0.2084036, -0.40200952, -0.3261011, -0.13480914, -0.06876906, -0.19167677, -0.20444186, -0.44851676)); - target += mul(nconv2d_2_tf, float4x4(-0.24726203, -0.0097923195, -0.23193192, 0.31947026, 0.4274281, -0.36929542, 0.10095328, -0.19663717, 0.3244895, 0.49458218, 0.24745567, 0.15722558, 0.43052208, 0.377559, 0.22543637, 0.13009055)); - target += mul(conv2d_1_tf, float4x4(0.01817998, 0.111477636, -0.12727399, 0.27395004, 0.19770023, -0.1636959, 0.25407487, -0.24871433, -0.08552937, 0.3223687, 0.30668882, 0.40221208, -0.20192504, 0.14656074, 0.5100356, -0.0948956)); - target += mul(nconv2d_1_tf, float4x4(0.40383592, -0.043663148, 0.4813348, 0.10317451, -0.049076255, -0.022925228, 0.0872564, 0.21741754, 0.23656987, -0.22309794, -0.2260013, 0.20823886, -0.055542476, 0.016604664, -0.1964831, 0.11962174)); - target += float4(-0.049604952, -0.039514415, -0.06137416, -0.0015509313); - tex5[gxy] = target; - - target = mul(e1, float4x4(0.029635962, 0.08045753, 0.03622311, 0.06677362, 0.14780864, -0.087087184, 0.22309896, -0.1772139, -0.08716722, 0.1075154, 0.044472143, 0.021324798, 0.10346262, -0.24718447, -0.2489118, 0.4517737)); - target += mul(e2, float4x4(0.20637918, -0.11695054, 0.27656725, 0.009858572, -0.62555677, 0.12796827, -0.057749186, -0.02636826, 0.11764726, -0.034879886, -0.062285252, -0.048256125, 0.37146622, -0.17392562, 0.24782267, 0.3184173)); - target += mul(e3, float4x4(0.2624149, 0.007052751, 0.1595428, 0.26269603, -0.33775207, -0.66331345, 0.18036188, -0.25012106, -0.15003558, 0.12337829, -0.3230818, 0.06187628, 0.096601635, 0.24300486, -0.13784438, 0.27110842)); - target += mul(ne1, float4x4(-0.180413, 0.039972585, 0.48966697, -0.4130023, -0.03654654, -0.27514896, -0.025462124, 0.06652415, 0.28900522, 0.035381883, 0.20655172, 0.0073647103, -0.5028713, -0.0061578755, -0.09185675, -0.52771837)); - target += mul(ne2, float4x4(-0.3205473, -0.23172325, -0.20749244, 0.058195353, 0.20280065, -0.106998004, 0.08968707, 0.10981961, -0.13291806, 0.0028465164, 0.11793527, 0.11942547, 0.100123264, -0.14852245, -0.032194547, -0.118260525)); - target += mul(ne3, float4x4(0.004620961, -0.13271236, 0.110130526, -0.075169735, 0.35998157, -0.046072174, 0.02044828, -0.1019322, -0.038753018, -0.12328749, -0.28227237, 0.18373057, -0.23704045, 0.20384738, 0.097455874, -0.23102747)); - target += mul(conv2d_2_tf, float4x4(0.30397, -0.007688397, -0.2519374, -0.14401323, -0.031671453, 0.10171321, -0.18295656, -0.029794114, 0.19171898, 0.23662621, 0.09319509, -0.3479054, 0.036986895, 0.13572362, 0.1142681, -0.17851138)); - target += mul(nconv2d_2_tf, float4x4(-0.19525734, 0.36855492, 0.05751295, -0.12524441, 0.06309533, 0.20228319, -0.07533531, 0.26733333, -0.21407285, -0.2900094, -0.28743416, 0.18039729, -0.27968687, -0.23786859, -0.21049118, -0.006130187)); - target += mul(conv2d_1_tf, float4x4(0.34406897, -0.14967814, 0.56049985, -0.18166065, -0.061995413, 0.117799215, 0.3054206, 0.4034068, -0.2116504, -0.6017806, 0.004660423, 0.051566444, 0.4380975, -0.3172436, -0.09930328, -0.16182126)); - target += mul(nconv2d_1_tf, float4x4(-0.09316841, 0.036305115, -0.30209473, 0.098138526, -0.012532953, -0.050068337, -0.22571203, -0.30636647, -0.124337815, 0.07323685, -0.15504828, 0.19263308, -0.017216058, 0.34484297, -0.1460544, -0.24951003)); - target += float4(0.10388342, 0.00828351, 0.14884935, 0.034392886); - tex6[gxy] = target; - - target = mul(e1, float4x4(-0.15275823, 0.31693572, 0.03429309, -0.06982273, 0.08535909, 0.019838037, -0.03189405, 0.3190016, 0.16633914, 0.48730284, -0.27923077, 0.31791112, 0.43154097, 0.005003616, -0.26277873, -0.009333685)); - target += mul(e2, float4x4(0.23504019, -0.12419379, 0.07217815, -0.090434305, -0.0380588, -0.14686479, -0.33812302, -0.20242776, -0.20776805, 0.24741934, -0.16489775, 0.07052134, -0.08030772, 0.23784883, -0.28709608, -0.17689173)); - target += mul(e3, float4x4(-0.05109775, -0.40860242, -0.003464472, -0.19893257, 0.23186824, -0.12760048, -0.22718583, 0.02299852, 0.27083093, 0.073904194, -0.056870755, -0.35324985, -0.023004858, -0.29591596, -0.020298446, -0.05753052)); - target += mul(ne1, float4x4(0.0035456547, -0.37682405, 0.047876693, 0.1168026, 0.015805494, -0.04388269, 0.12970346, 0.2497829, -0.009891778, 0.116980106, 0.13058232, 0.22570355, 0.13866597, 0.036246244, 0.10916998, -0.040503114)); - target += mul(ne2, float4x4(-0.25300103, -0.065156855, 0.063345924, 0.11406543, -0.1902478, 0.16440767, 0.043949526, 0.43318078, -0.03932035, -0.08510957, 0.19621156, -0.045045726, -0.08339006, -0.04335483, 0.37129655, -0.22328225)); - target += mul(ne3, float4x4(0.16169593, 0.2758587, 0.38249364, 0.12606645, 0.4582731, 0.09374545, -0.10988087, -0.21678255, -0.004099455, -0.09436347, 0.33964127, 0.20880581, -0.06742301, -0.025149476, 0.12146305, 0.5012377)); - target += mul(conv2d_2_tf, float4x4(0.11523535, 0.31662583, -0.0709322, -0.066175185, 0.08868106, -0.042457394, 0.32469732, -0.1987238, 0.41399983, 0.015568244, 0.14037918, 0.2879998, -0.32157704, 0.22491854, -0.07769691, 0.2052648)); - target += mul(nconv2d_2_tf, float4x4(-0.299831, -0.247278, -0.2011737, -0.3759366, -0.14935663, -0.095033385, 0.06259881, -0.23891686, -0.4340098, 0.07340212, -0.0012697511, -0.16527005, 0.0814454, -0.43962866, -0.3040046, 0.06242604)); - target += mul(conv2d_1_tf, float4x4(0.11802704, 0.2323739, 0.13466287, -0.25053164, -0.08020803, 0.1628004, -0.030645542, -0.40872335, -0.24624921, 0.15931502, 0.40752286, -0.07906199, 0.4286516, -0.1651973, -0.07021073, 0.0867332)); - target += mul(nconv2d_1_tf, float4x4(-0.23617363, 0.053548977, -0.14130518, -0.37744048, -0.11805406, -0.13757266, -0.026939899, 0.028020354, 0.24626125, -0.06998214, -0.02793638, 0.10509643, 0.06577935, -0.17211749, -0.12747282, -0.16999653)); - target += float4(-0.022106458, -0.012578552, 0.016203664, 0.026009269); - tex7[gxy] = target; -} - - -//!PASS 3 -//!STYLE PS -//!IN tex1 -//!OUT OUTPUT -float4 Pass3(float2 pos) { - return tex1.SampleLevel(sam1, pos, 0); -} diff --git a/src/Effects/Effects.vcxproj b/src/Effects/Effects.vcxproj index 41edb8bf4..0e93377ba 100644 --- a/src/Effects/Effects.vcxproj +++ b/src/Effects/Effects.vcxproj @@ -404,5 +404,10 @@ Document + + + Document + + \ No newline at end of file diff --git a/src/Effects/Effects.vcxproj.filters b/src/Effects/Effects.vcxproj.filters index 4620695f7..1de33b9df 100644 --- a/src/Effects/Effects.vcxproj.filters +++ b/src/Effects/Effects.vcxproj.filters @@ -354,6 +354,9 @@ + + Anime4K + From cec40f7841179ce8b01e3a487079af901902cce9 Mon Sep 17 00:00:00 2001 From: Xu <34770031+Blinue@users.noreply.github.com> Date: Thu, 22 Feb 2024 20:57:21 +0800 Subject: [PATCH 109/155] =?UTF-8?q?feat:=20=E7=A7=BB=E6=A4=8D=20Anime4K=5F?= =?UTF-8?q?Upscale=5FGAN=5Fx2=5FM?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Anime4K/Anime4K_Upscale_GAN_x2_M.hlsl | 1324 +++++++++++++++++ .../Anime4K/Anime4K_Upscale_GAN_x2_S.hlsl | 3 +- .../Anime4K/Anime4K_Upscale_GAN_x3_L.hlsl | 2 +- src/Effects/Effects.vcxproj | 5 + src/Effects/Effects.vcxproj.filters | 3 + 5 files changed, 1335 insertions(+), 2 deletions(-) create mode 100644 src/Effects/Anime4K/Anime4K_Upscale_GAN_x2_M.hlsl diff --git a/src/Effects/Anime4K/Anime4K_Upscale_GAN_x2_M.hlsl b/src/Effects/Anime4K/Anime4K_Upscale_GAN_x2_M.hlsl new file mode 100644 index 000000000..6ab5ce8bf --- /dev/null +++ b/src/Effects/Anime4K/Anime4K_Upscale_GAN_x2_M.hlsl @@ -0,0 +1,1324 @@ +// Anime4K_Upscale_GAN_x2_M +// 移植自 https://github.com/bloc97/Anime4K/blob/8e39551ce96ed172605c89b7dd8be855b5502cc9/glsl/Upscale/Anime4K_Upscale_GAN_x2_M.glsl + +//!MAGPIE EFFECT +//!VERSION 4 +//!SORT_NAME Anime4K_Upscale_GAN_x2_2 + +// 圆括号内的输入只被采样一次 +// INPUT -> tf, tf1 +// tf, tf1 -> 1_tf, 3_tf, 3_tf1 +// 3_tf, 3_tf1, (1_tf) -> 4_tf, 6_tf, 6_tf1 +// 6_tf, 6_tf1, (1_tf), (4_tf) -> 7_tf, 9_tf, 9_tf1 +// 9_tf, 9_tf1, (1_tf), (4_tf), 7_tf -> 11_tf, 10_tf, 12_tf, 12_tf1 +// 12_tf, 12_tf1, 11_tf, (1_tf), (4_tf), (7_tf), (10_tf) -> 0ups, 0ups1, 0ups2 +// (INPUT), 0ups, 0ups1, 0ups2 -> OUTPUT + +//!TEXTURE +Texture2D INPUT; + +//!TEXTURE +//!WIDTH INPUT_WIDTH * 2 +//!HEIGHT INPUT_HEIGHT * 2 +Texture2D OUTPUT; + +//!SAMPLER +//!FILTER POINT +SamplerState sam; + +//!SAMPLER +//!FILTER LINEAR +SamplerState sam1; + +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +//!FORMAT R16G16B16A16_FLOAT +Texture2D tex1; + +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +//!FORMAT R16G16B16A16_FLOAT +Texture2D tex2; + +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +//!FORMAT R16G16B16A16_FLOAT +Texture2D tex3; + +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +//!FORMAT R16G16B16A16_FLOAT +Texture2D tex4; + +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +//!FORMAT R16G16B16A16_FLOAT +Texture2D tex5; + +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +//!FORMAT R16G16B16A16_FLOAT +Texture2D tex6; + +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +//!FORMAT R16G16B16A16_FLOAT +Texture2D tex7; + +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +//!FORMAT R16G16B16A16_FLOAT +Texture2D tex8; + +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +//!FORMAT R16G16B16A16_FLOAT +Texture2D tex9; + +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +//!FORMAT R16G16B16A16_FLOAT +Texture2D tex10; + + +//!PASS 1 +//!DESC Conv-4x3x3x3 +//!IN INPUT +//!OUT tex1, tex2 +//!BLOCK_SIZE 16 +//!NUM_THREADS 64 + +void Pass1(uint2 blockStart, uint3 threadId) { + uint2 gxy = (Rmp8x8(threadId.x) << 1) + blockStart; + uint2 inputSize = GetInputSize(); + if (gxy.x >= inputSize.x || gxy.y >= inputSize.y) { + return; + } + float2 inputPt = GetInputPt(); + + uint i, j; + + min16float3 src[4][4]; + [unroll] + for (i = 0; i <= 2; i += 2) { + [unroll] + for (j = 0; j <= 2; j += 2) { + float2 tpos = (gxy + uint2(i, j)) * inputPt; + const min16float4 sr = INPUT.GatherRed(sam, tpos); + const min16float4 sg = INPUT.GatherGreen(sam, tpos); + const min16float4 sb = INPUT.GatherBlue(sam, tpos); + + // w z + // x y + src[i][j] = min16float3(sr.w, sg.w, sb.w); + src[i][j + 1] = min16float3(sr.x, sg.x, sb.x); + src[i + 1][j] = min16float3(sr.z, sg.z, sb.z); + src[i + 1][j + 1] = min16float3(sr.y, sg.y, sb.y); + } + } + + [unroll] + for (i = 1; i <= 2; ++i) { + [unroll] + for (j = 1; j <= 2; ++j) { + uint2 destPos = gxy + uint2(i - 1, j - 1); + + if (i != 1 || j != 1) { + if (destPos.x >= inputSize.x || destPos.y >= inputSize.y) { + continue; + } + } + + min16float4 result = mul(src[i - 1][j - 1], min16float3x4(-0.17498326, -0.14677401, -0.43065637, 0.10841958, 0.24096319, -0.008683959, -0.29844064, 0.3567803, 0.43360776, 0.11304715, -0.0802437, 0.190904)); + result += mul(src[i - 1][j], min16float3x4(0.24688073, 0.086462855, 0.05716678, -0.1739644, 0.3236298, 0.23382919, 0.20481811, -0.022618154, -0.336325, -0.21624258, -0.18736486, -0.14936537)); + result += mul(src[i - 1][j + 1], min16float3x4(0.38230455, 0.410552, 0.34809712, 0.2510045, 0.30689523, 0.09889703, -0.26991332, 0.1108426, 0.5083409, 0.2854462, -0.1912902, 0.40354714)); + result += mul(src[i][j - 1], min16float3x4(0.46870667, -0.03530456, 0.13705169, -0.11884997, -0.0772201, 0.17073877, 0.03287621, -0.14975251, -0.18155691, 0.14545092, -0.1584816, 0.051269397)); + result += mul(src[i][j], min16float3x4(-0.5830986, -0.009166566, 0.54358304, -0.4545001, -0.27541155, 0.6697277, -0.29205534, -0.61038095, -0.64781004, 0.32052672, 0.14704794, -0.6479083)); + result += mul(src[i][j + 1], min16float3x4(-0.04402336, 0.05461938, -0.18035333, 0.5464947, 0.21475682, -0.6899343, 0.49390903, 0.62440956, 0.75365967, -0.26500008, 0.59187347, 0.10037025)); + result += mul(src[i + 1][j - 1], min16float3x4(-0.25319895, -0.1764162, -0.22574338, 0.03075524, -0.29618785, -0.491323, 0.008427114, -0.363144, -0.17214127, -0.11891048, -0.19321653, -0.13424487)); + result += mul(src[i + 1][j], min16float3x4(0.17425235, 0.07049646, -0.1759216, 0.05697634, -0.39496303, 0.35450256, -0.09984144, 0.15470548, -0.03375828, 0.06442114, 0.14598753, 0.46114844)); + result += mul(src[i + 1][j + 1], min16float3x4(-0.19262458, -0.17141157, -0.11393742, -0.07778959, -0.006366565, -0.16713034, 0.2135569, 0.23494779, -0.37996295, -0.2767951, -0.1515432, -0.110363424)); + result += min16float4(0.010385515, 0.011541315, -0.002942497, -0.00020902864); + tex1[destPos] = result; + + result = mul(src[i - 1][j - 1], min16float3x4(0.8031736, -0.1500194, -0.23398483, -0.060760673, 0.5049785, -0.099199474, -0.035531044, 0.0310586, -0.0310334, 0.15932913, 0.08973915, 0.08766925)); + result += mul(src[i - 1][j], min16float3x4(-0.2187303, 0.20974335, 0.016500302, 0.15386087, 0.2381243, -0.176845, -0.003643712, 0.08195259, 0.18417378, -0.18228108, 0.19170114, -0.3758241)); + result += mul(src[i - 1][j + 1], min16float3x4(0.4429508, -0.025832538, -0.021855514, 0.11322045, -0.08459551, -0.17815724, -0.19924322, -0.03736318, -0.22390507, -0.50430673, -0.13770194, 0.03014482)); + result += mul(src[i][j - 1], min16float3x4(-0.15976174, 0.31052437, 0.2498092, -0.29137832, -0.10121105, 0.35164458, 0.4901633, -0.35297948, -0.2569739, -0.14258477, 0.12585007, -0.2552164)); + result += mul(src[i][j], min16float3x4(-0.5260107, -0.8547037, 0.92173797, 0.37817466, -0.4162576, 0.10989847, 0.26875922, 0.8614761, 0.069195434, 0.045593478, 0.03790176, 0.7332446)); + result += mul(src[i][j + 1], min16float3x4(0.14287843, -0.283008, -0.28487602, -0.13313514, -0.019538656, -0.02361782, 0.28037757, -0.10543745, 0.1586713, 0.12037641, 0.24249536, 0.2524637)); + result += mul(src[i + 1][j - 1], min16float3x4(-0.037178896, 0.23858358, -0.18704462, -0.13747689, 0.07629898, 0.2710832, -0.71619016, -0.09074896, 0.30446374, -0.0052702115, -0.27990812, -0.1392364)); + result += mul(src[i + 1][j], min16float3x4(-0.086045384, 0.695562, -0.23519892, -0.23438415, 0.16208446, 0.2172693, -0.16647956, -0.3718635, 0.024940055, 0.5650778, 0.20409326, -0.13530363)); + result += mul(src[i + 1][j + 1], min16float3x4(-0.19389555, -0.028506106, -0.35060602, 0.22244014, 0.055054635, -0.17651209, -0.19871834, -0.02667603, -0.1402023, -0.02455308, -0.57856905, -0.2174221)); + result += min16float4(0.02648044, -0.0017647704, -0.016136197, 0.0011179475); + tex2[destPos] = result; + } + } +} + + +//!PASS 2 +//!DESC Conv-4x3x3x16, Conv-4x1x1x32 +//!IN tex1, tex2 +//!OUT tex3, tex4, tex5 +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 + +void Pass2(uint2 blockStart, uint3 threadId) { + uint2 gxy = Rmp8x8(threadId.x) + blockStart; + uint2 inputSize = GetInputSize(); + if (gxy.x >= inputSize.x || gxy.y >= inputSize.y) { + return; + } + + float2 inputPt = GetInputPt(); + float2 pos = (gxy + 0.5f) * inputPt; + + // [ a, d, g ] + // [ b, e, h ] + // [ c, f, i ] + min16float4 a1 = tex1.SampleLevel(sam, pos - inputPt, 0); + min16float4 b1 = tex1.SampleLevel(sam, pos + float2(-inputPt.x, 0), 0); + min16float4 c1 = tex1.SampleLevel(sam, pos + float2(-inputPt.x, inputPt.y), 0); + min16float4 d1 = tex1.SampleLevel(sam, pos + float2(0, -inputPt.y), 0); + min16float4 e1 = tex1.SampleLevel(sam, pos, 0); + min16float4 f1 = tex1.SampleLevel(sam, pos + float2(0, inputPt.y), 0); + min16float4 g1 = tex1.SampleLevel(sam, pos + float2(inputPt.x, -inputPt.y), 0); + min16float4 h1 = tex1.SampleLevel(sam, pos + float2(inputPt.x, 0), 0); + min16float4 i1 = tex1.SampleLevel(sam, pos + inputPt, 0); + + min16float4 na1 = max(-a1, 0); + min16float4 nb1 = max(-b1, 0); + min16float4 nc1 = max(-c1, 0); + min16float4 nd1 = max(-d1, 0); + min16float4 ne1 = max(-e1, 0); + min16float4 nf1 = max(-f1, 0); + min16float4 ng1 = max(-g1, 0); + min16float4 nh1 = max(-h1, 0); + min16float4 ni1 = max(-i1, 0); + + a1 = max(a1, 0); + b1 = max(b1, 0); + c1 = max(c1, 0); + d1 = max(d1, 0); + e1 = max(e1, 0); + f1 = max(f1, 0); + g1 = max(g1, 0); + h1 = max(h1, 0); + i1 = max(i1, 0); + + min16float4 a2 = tex2.SampleLevel(sam, pos - inputPt, 0); + min16float4 b2 = tex2.SampleLevel(sam, pos + float2(-inputPt.x, 0), 0); + min16float4 c2 = tex2.SampleLevel(sam, pos + float2(-inputPt.x, inputPt.y), 0); + min16float4 d2 = tex2.SampleLevel(sam, pos + float2(0, -inputPt.y), 0); + min16float4 e2 = tex2.SampleLevel(sam, pos, 0); + min16float4 f2 = tex2.SampleLevel(sam, pos + float2(0, inputPt.y), 0); + min16float4 g2 = tex2.SampleLevel(sam, pos + float2(inputPt.x, -inputPt.y), 0); + min16float4 h2 = tex2.SampleLevel(sam, pos + float2(inputPt.x, 0), 0); + min16float4 i2 = tex2.SampleLevel(sam, pos + inputPt, 0); + + min16float4 na2 = max(-a2, 0); + min16float4 nb2 = max(-b2, 0); + min16float4 nc2 = max(-c2, 0); + min16float4 nd2 = max(-d2, 0); + min16float4 ne2 = max(-e2, 0); + min16float4 nf2 = max(-f2, 0); + min16float4 ng2 = max(-g2, 0); + min16float4 nh2 = max(-h2, 0); + min16float4 ni2 = max(-i2, 0); + + a2 = max(a2, 0); + b2 = max(b2, 0); + c2 = max(c2, 0); + d2 = max(d2, 0); + e2 = max(e2, 0); + f2 = max(f2, 0); + g2 = max(g2, 0); + h2 = max(h2, 0); + i2 = max(i2, 0); + + min16float4 conv2d_2_tf = mul(a1, min16float4x4(-0.14656883, -0.044076134, -0.40314636, -0.08023388, 0.12564746, -0.21633625, -0.0210282, -0.19231434, -0.019945038, 0.020343186, -0.007134301, 0.013607319, 0.07334655, -0.050848506, 0.0011201366, 0.26975143)); + conv2d_2_tf += mul(b1, min16float4x4(-0.043205153, -0.13764456, -0.5368405, -0.04096279, 0.009450832, 0.23953767, -0.022408254, -0.124040656, 0.53450584, 0.02690831, 0.39857075, 0.42423433, 0.014167992, 0.055189077, -0.038074926, 0.12800713)); + conv2d_2_tf += mul(c1, min16float4x4(-0.05354771, -0.06626498, 0.0092389295, 0.100637995, 0.05051714, -0.0033487207, -0.0076860636, 0.013058279, 0.10727092, -0.31131467, 0.058990292, 0.46365786, 0.08736531, 0.038865663, -0.008022449, -0.067517675)); + conv2d_2_tf += mul(d1, min16float4x4(-0.25327486, -0.0041089035, 0.04877498, -0.36375836, 0.0003920389, -0.09273049, 0.016388323, 0.11530572, -0.14216854, 0.07370458, -0.27584067, -0.34536567, 0.0848517, -0.1954229, -0.22656868, -0.13531597)); + conv2d_2_tf += mul(e1, min16float4x4(0.7035245, 0.1131446, 0.1833189, 0.63726306, -0.20649737, 0.14149575, -0.084267326, 0.020898562, -0.026810758, -0.17932594, -0.08032681, 0.07790513, -0.01148237, -0.19930641, 0.33902612, -0.013703277)); + conv2d_2_tf += mul(f1, min16float4x4(-0.2862842, 0.01491211, -0.30474076, 0.19604082, 0.21565811, 0.29193363, 0.024934597, -0.17113955, 0.26136434, -0.12819171, 0.3874644, -0.30533502, 0.004006889, -0.07340657, -0.04817435, -0.013651047)); + conv2d_2_tf += mul(g1, min16float4x4(-0.14331155, -0.09605764, -0.06941299, -0.09740676, 0.0059936745, -0.27215815, -0.31393203, 0.17594862, 0.045626156, 0.060231503, 0.10607796, -0.030635068, 0.15021041, -0.19662435, -0.14648037, 0.028361326)); + conv2d_2_tf += mul(h1, min16float4x4(0.25090003, -0.2845429, -0.30109838, -0.070956856, -0.08051349, -0.07526823, 0.13524723, 0.14151429, -0.1232367, 0.08824123, 0.28804728, 0.31701297, 0.014839836, -0.09193038, 0.30188346, -0.07903937)); + conv2d_2_tf += mul(i1, min16float4x4(0.21150468, 0.13863595, -0.2624825, 0.1652623, -0.026336774, -0.45599234, 0.015901498, 0.23009071, 0.19700526, -0.11013044, 0.19850798, -0.19702299, 0.060643747, -0.03162518, -0.18272553, 0.24863112)); + conv2d_2_tf += mul(a2, min16float4x4(0.16361383, 0.0028921412, 0.18107067, 0.0720563, 0.06378758, -0.09442821, -0.3054202, 0.06843394, 0.20913927, -0.17700543, 0.14682317, 0.21683829, 0.02948067, -0.34866366, -0.04474257, -0.011365872)); + conv2d_2_tf += mul(b2, min16float4x4(0.008512374, 0.19717449, 0.4456541, -0.15356806, -0.24209222, 0.12543896, -0.18232138, 0.012759448, 0.052473016, 0.17268041, 0.25826934, -0.16848944, 0.10150518, -0.30244592, 0.38495708, -0.2090818)); + conv2d_2_tf += mul(c2, min16float4x4(-0.07227807, -0.10066125, -0.1090768, 0.13579647, 0.023154313, 0.079166815, -0.20014893, -0.21884407, 0.09634875, -0.22551452, 0.20771019, 0.16381831, -0.23455033, 0.12578821, -0.43342614, -0.23609087)); + conv2d_2_tf += mul(d2, min16float4x4(-0.11084086, -0.03875876, -0.17912252, -0.24158017, 0.070904315, 0.21862641, 0.02659038, -0.36572614, 0.06265698, 0.32029516, 0.12044166, 0.18424052, 0.050192874, 0.15095103, 0.13794746, -0.111053675)); + conv2d_2_tf += mul(e2, min16float4x4(-0.11362966, 0.5249116, 0.27814335, -0.023295242, 0.022581467, 0.3195408, -0.06865207, -0.13818301, 0.18826036, 0.21182717, -0.30241874, 0.02916674, -0.19999875, 0.8222055, -0.2981789, -0.31122693)); + conv2d_2_tf += mul(f2, min16float4x4(0.058648925, -0.39456168, -0.36158726, 0.4050607, 0.0609484, 0.01624418, -0.2699451, 0.25976416, 0.31131884, 0.18382475, 0.12856431, 0.3285595, 0.4798488, -0.26074353, 0.78901637, -0.071622506)); + conv2d_2_tf += mul(g2, min16float4x4(-0.038631868, -0.20723929, 0.045573164, 0.10398485, 0.20236868, 0.14958549, 0.18842755, -0.23352885, 0.18624173, 0.2800279, 0.23280786, -0.12909916, -0.037398554, 0.1557195, -0.04866289, -0.13633357)); + conv2d_2_tf += mul(h2, min16float4x4(-0.15441336, 0.0968205, -0.32649723, -0.021546176, -0.10667603, 0.18065608, 0.017242601, 0.027690934, -0.23079967, 0.093206555, -0.11170116, 0.19002458, -0.352287, 0.008375842, 0.2459501, -0.09389683)); + conv2d_2_tf += mul(i2, min16float4x4(0.2130623, -0.4781421, -0.53600657, 0.44947717, -0.018234696, -0.17257519, -0.063182175, 0.22729957, -0.037309792, 0.13939567, -0.013829814, -0.20586358, 0.052985236, -0.04452726, 0.1880475, 0.096934296)); + conv2d_2_tf += mul(na1, min16float4x4(0.026266143, -0.03171053, 0.2277772, 0.01093641, -0.007701242, 0.115488306, 0.029304042, 0.33619022, 0.14467055, 0.075788446, -0.076583475, -0.051929206, 0.02211152, 0.031270072, -0.075583085, -0.20198274)); + conv2d_2_tf += mul(nb1, min16float4x4(-0.010648877, 0.21413183, 0.24339998, -0.22960022, -0.16156821, -0.45364898, -0.105244495, -0.07713787, -0.31945667, -0.097204186, -0.2457385, 0.04241939, -0.16228637, 0.13461526, 0.009693403, -0.13537757)); + conv2d_2_tf += mul(nc1, min16float4x4(0.058250688, 0.007912516, -0.071061306, 0.01889538, -0.14592043, -0.10374761, 0.07840785, 0.008756123, -0.045008816, 0.05261628, -0.2615482, -0.01929421, -0.23048545, 0.010220507, -0.16385053, 0.031251106)); + conv2d_2_tf += mul(nd1, min16float4x4(-0.03350765, 0.0737811, -0.09780837, -0.031780828, -0.1919008, 0.36382285, 0.19377235, -0.2797014, -0.12267188, 0.023496462, 0.38848102, -0.010005188, -0.09733866, 0.51535326, 0.47232744, 0.0073942994)); + conv2d_2_tf += mul(ne1, min16float4x4(-0.27284998, 0.14916854, -0.25612846, -0.029941292, 0.18539569, -0.43832946, -0.119871736, 0.044226155, -0.106426276, 0.05740293, -0.046056107, -0.17616963, -0.52316684, 0.33400205, -0.08133327, 0.0948221)); + conv2d_2_tf += mul(nf1, min16float4x4(0.32683802, -0.26026967, 0.19948171, -0.011760837, -0.30256173, -0.45944482, 0.051236197, 0.84710604, -0.08078167, 0.2675028, -0.27241448, 0.27764642, 0.13335843, 0.068502, -0.033614077, 0.19930291)); + conv2d_2_tf += mul(ng1, min16float4x4(0.07075588, 0.029963106, 0.055358, 0.042518128, -0.1441339, 0.42236832, 0.1387107, -0.40421516, 0.02318193, -0.36765453, -0.21558793, 0.21393713, 0.31122518, -0.3358225, -0.4967671, 0.46344024)); + conv2d_2_tf += mul(nh1, min16float4x4(-0.28364134, 0.19475235, 0.42310834, 0.060645495, -0.14013693, -0.049322303, -0.09870014, 0.23229486, -0.033104394, -0.37716264, -0.18488638, 0.17441164, -0.24427529, -0.26787207, -0.16721556, -0.10374529)); + conv2d_2_tf += mul(ni1, min16float4x4(-0.3376618, -0.09682554, 0.3423445, 0.047880173, 0.3354013, -0.21854481, -0.40352795, 0.1841921, 0.008460585, -0.03459756, -0.22880521, 0.35112804, -0.01764322, -0.16448145, 0.107058726, -0.28482538)); + conv2d_2_tf += mul(na2, min16float4x4(-0.032480888, 0.0034003556, -0.032999255, 0.16414961, 0.098690405, 0.0887987, 0.32215804, -0.002440519, -0.16814353, 0.0029867117, -0.28380692, 0.060728613, 0.15944195, 0.16642234, 0.110365815, 0.22413619)); + conv2d_2_tf += mul(nb2, min16float4x4(-0.088509634, 0.047311794, -0.30038288, -0.27227867, 0.41235012, 0.23889793, 0.7280631, 0.13555974, -0.08230139, 0.09955461, -0.13654864, 0.0314745, -0.275061, -0.10253638, -0.34706068, 0.03781376)); + conv2d_2_tf += mul(nc2, min16float4x4(0.09819424, -0.017704371, -0.031446967, 0.061441656, -0.110502265, -0.19236599, 0.2783733, 0.12798637, -0.047672354, -0.018956421, -0.17555775, -0.018790504, 0.43967727, -0.62039405, 0.08790998, 0.4353703)); + conv2d_2_tf += mul(nd2, min16float4x4(-0.019217307, 0.14623284, 0.015177701, 0.15983194, -0.106374666, -0.0131188845, 0.033161264, 0.41326195, 0.052029386, -0.11639186, -0.026856689, -0.020853983, -0.024652582, -0.12368135, -0.39344305, 0.17345576)); + conv2d_2_tf += mul(ne2, min16float4x4(-0.047131967, -0.28568837, 0.4201909, -0.28901812, -0.13973507, 0.03312194, -0.16265458, -0.10710893, 0.21189946, -0.32837728, 0.12424836, -0.30587387, 0.036961686, -0.8623908, 0.3661179, -0.1692949)); + conv2d_2_tf += mul(nf2, min16float4x4(0.1143412, 0.07707313, 0.3981437, -0.17059685, -0.094056316, -0.27234176, 0.12281097, -0.16966031, -0.1512859, -0.0524175, 0.1654043, 0.13700214, -0.3156236, -0.27636334, -0.52670264, 0.9250529)); + conv2d_2_tf += mul(ng2, min16float4x4(0.16162306, -0.15842794, -0.06699449, 0.059618954, 0.06798694, -0.060685594, -0.14878511, 0.17194197, -0.05110082, -0.12152871, -0.2020905, 0.09337634, 0.0602552, -0.07327089, 0.07043988, 0.15926042)); + conv2d_2_tf += mul(nh2, min16float4x4(-0.10312201, -0.13890414, -0.07694594, -0.29262447, 0.0597966, -0.228, -0.00046558332, 0.09373052, 0.2520174, -0.2992283, -0.01796473, -0.052195024, 0.09554047, -0.25678295, -0.38657847, 0.16130428)); + conv2d_2_tf += mul(ni2, min16float4x4(0.21114396, -0.64854, -0.52819866, -0.67061704, 0.05760163, -0.121914886, 0.05448798, -0.1352843, 0.007051261, 0.065677196, -0.09763541, 0.032613076, -0.17908493, -0.7194699, -0.6342276, 0.031814635)); + conv2d_2_tf += min16float4(0.051319666, 0.019196881, 0.0759832, 0.050857317); + min16float4 nconv2d_2_tf = max(-conv2d_2_tf, 0); + conv2d_2_tf = max(conv2d_2_tf, 0); + + min16float4 conv2d_1_tf = mul(a1, min16float4x4(0.10187621, 0.11053595, 0.14810364, -0.18582201, 0.16617906, -0.011798966, 0.09280227, 0.13307849, -0.044728525, 0.10914104, 0.075626835, -0.10416733, -0.094498746, -0.06870642, -0.07571491, 0.04897303)); + conv2d_1_tf += mul(b1, min16float4x4(0.33485547, 0.03678466, -0.29866266, -0.048795477, -0.010474432, -0.10252797, 0.036609326, -0.013254512, -0.14475596, 0.011886287, 0.11828754, -0.13557065, -0.28870094, -0.17330378, 0.044048756, -0.019826433)); + conv2d_1_tf += mul(c1, min16float4x4(0.105582856, -0.039765045, 0.0818729, 0.09955303, 0.023201315, 0.09243788, 0.07389467, -0.012808492, 0.0492865, 0.19755632, -0.06548781, 0.08533675, -0.013952, 0.017339202, -0.20518751, -0.054678205)); + conv2d_1_tf += mul(d1, min16float4x4(-0.26653445, 0.04810761, -0.23108084, -0.19818014, 0.23671885, 0.016349426, 0.0045669116, 0.077428445, -0.140711, 0.11972277, 0.101062275, -0.18716832, -0.190941, -0.34035257, -0.09143259, 0.04359683)); + conv2d_1_tf += mul(e1, min16float4x4(-0.14573975, 0.23356283, -0.3772715, -0.22460096, -0.053278442, 0.069576025, 0.05169695, 0.17249753, 0.028048603, -0.25471392, -0.09931249, 0.2095619, 0.22173007, 0.38787642, -0.30738685, 0.01936576)); + conv2d_1_tf += mul(f1, min16float4x4(0.081078954, -0.16813248, 0.1542311, 0.17158946, -0.15383756, 0.025605323, 0.2360881, -0.14753577, -0.016537111, 0.048651446, -0.35849985, 0.01651406, 0.17044473, 0.13180882, 0.324054, -0.18812656)); + conv2d_1_tf += mul(g1, min16float4x4(-0.15537027, -0.08164218, 0.049979087, -0.31885874, -0.15126401, -0.14352658, 0.18948728, 0.020951044, 0.054829888, -0.18936221, -0.22699763, 0.14384085, 0.055476833, -0.011031805, -0.23653851, 0.02768591)); + conv2d_1_tf += mul(h1, min16float4x4(-0.34108123, -0.28492066, 0.50347435, 0.0034134283, 0.041766707, 0.12375689, -0.08600751, 0.22726676, 0.10521852, 0.16621545, 0.038216297, 0.029870255, 0.07065742, -0.03542451, 0.38924676, -0.117774665)); + conv2d_1_tf += mul(i1, min16float4x4(-0.19437145, -0.01827461, 0.15408134, -0.14991991, 0.13832837, 0.0668659, 0.092678316, 0.05341174, 0.21633142, 0.09575402, -0.111060366, -0.00874764, -0.21256353, -0.052944425, 0.16459747, 0.07091838)); + conv2d_1_tf += mul(a2, min16float4x4(0.022236984, 0.19067548, 0.049743406, 0.05148808, 0.23003219, 0.08688227, 0.030773275, -0.059972208, -0.039038613, 0.21701579, -0.11092254, -0.10850967, -0.17777155, -0.20399293, -0.006843039, 0.24139926)); + conv2d_1_tf += mul(b2, min16float4x4(-0.07928885, -0.011657496, -0.03982505, -0.031084592, -0.09403157, -0.13860224, 0.15166754, 0.1279725, -0.084909394, 0.18945958, 0.055481352, -0.24365151, -0.04130202, 0.105171725, -0.47306657, -0.2218246)); + conv2d_1_tf += mul(c2, min16float4x4(-0.06171395, 0.0029490888, 0.055825688, -0.01362009, 0.045571987, -0.04197536, -0.024671398, -0.11600467, 0.02611751, -0.06675449, 0.38841903, 0.109969236, 0.1846224, -0.22673915, -0.11488994, -0.18271959)); + conv2d_1_tf += mul(d2, min16float4x4(-0.08073766, -0.1512685, 0.09596278, 0.061552938, -0.23016383, 0.044725727, -0.1058148, -0.09081257, 0.25391936, 0.13075152, 0.1153331, 0.035533328, 0.14628118, 0.053434838, -0.061957166, -0.11092296)); + conv2d_1_tf += mul(e2, min16float4x4(0.004972408, 0.26720062, -0.0014180156, -0.15569477, 0.08964792, 0.39218047, -0.113748655, -0.20653862, -0.0182982, -0.009456181, 0.096566215, 0.19871894, -0.45192167, -0.19494532, 0.5282211, -0.033234302)); + conv2d_1_tf += mul(f2, min16float4x4(0.11633487, 0.055492207, -0.09550419, 0.019721292, 0.05191187, 0.110391244, 0.13541168, 0.108687185, -0.3231262, -0.071254596, 0.12103068, -0.063508354, 0.16086432, 0.22202429, -0.2793211, -0.059888415)); + conv2d_1_tf += mul(g2, min16float4x4(0.09845572, -0.11364447, -0.06817361, 0.20479278, 0.008171668, -0.10222864, -0.12512983, 0.11285637, 0.2092848, 0.12593135, -0.054839488, 0.1560058, 0.109415986, -0.04229047, -0.21525817, 0.10153635)); + conv2d_1_tf += mul(h2, min16float4x4(-0.26443723, 0.18267378, 0.2874903, -0.15007962, 0.23901714, -0.039331976, -0.4055973, 0.18869716, 0.060133275, -0.030050457, -0.16689767, -0.024223989, 0.43243858, -0.004281818, -0.5925553, 0.08473984)); + conv2d_1_tf += mul(i2, min16float4x4(-0.11769163, -0.6005158, -0.0700652, 0.0062212353, -0.022391787, 0.08070833, 0.10332995, 0.100591965, 0.1680161, 0.1209537, -0.11606606, -0.0032385625, -0.30508906, -0.11541758, 0.27825746, 0.18774803)); + conv2d_1_tf += mul(na1, min16float4x4(-0.06629365, -0.14032914, -0.2580204, 0.18303558, -0.1916567, 0.029803488, -0.12213443, -0.07165115, 0.012936617, -0.11358297, -0.19138688, 0.10422416, 0.18062063, 0.14369549, 0.10535131, -0.036331207)); + conv2d_1_tf += mul(nb1, min16float4x4(-0.23739359, -0.14102252, 0.16535138, -0.055494435, 0.11510639, -0.02530117, 0.13571805, -0.11962709, 0.14311576, -0.11346015, -0.053082045, 0.23039193, 0.2412315, 0.34595123, -0.057626486, 0.1273758)); + conv2d_1_tf += mul(nc1, min16float4x4(-0.031894613, 0.04056866, -0.14806709, -0.061261263, -0.05113628, -0.150074, -0.05885426, 0.025318084, -0.028839143, -0.14976048, -0.061418023, -0.10849576, 0.10669465, 0.025044547, 0.13002798, 0.033596892)); + conv2d_1_tf += mul(nd1, min16float4x4(0.31830126, -0.109857574, 0.022382054, 0.19084917, -0.21992075, -0.06509279, 0.04586319, -0.10979886, 0.07565896, 0.008375114, -0.025531407, 0.112079956, 0.32532254, 0.39258766, 0.15983114, -0.047324624)); + conv2d_1_tf += mul(ne1, min16float4x4(0.06333816, -0.43997836, 0.28480944, -0.037927028, -0.16247569, 0.14209846, -0.5309942, -0.23058164, -0.18387268, 0.3324917, 0.010288075, -0.2516956, -0.42476243, -0.19866063, 0.32058033, 0.052254338)); + conv2d_1_tf += mul(nf1, min16float4x4(-0.019851776, 0.17185202, -0.14713249, -0.1373522, 0.23155597, -0.009191596, -0.15395427, 0.24423079, -0.11106813, -0.034888845, 0.17169674, -0.08786573, -0.08697707, -0.28842747, -0.25445274, 0.13578549)); + conv2d_1_tf += mul(ng1, min16float4x4(0.2099323, 0.09262897, -0.08977398, 0.30791095, 0.12376861, 0.24654338, -0.097672515, 0.008614657, 0.006388779, 0.076170854, 0.25119394, -0.12392118, 0.3138793, -0.015998395, 0.15131904, -0.3009305)); + conv2d_1_tf += mul(nh1, min16float4x4(0.33982292, 0.26557416, -0.3754559, -0.110353656, 0.08402225, -0.053171434, 0.051136248, -0.2696132, -0.14568366, -0.048726343, 0.06216166, 0.018804165, -0.084439, 0.15103953, -0.020082679, 0.15082058)); + conv2d_1_tf += mul(ni1, min16float4x4(0.14522389, -0.0462971, -0.10824406, 0.14163211, -0.08392773, -0.22920173, -0.23795773, -0.2580316, -0.22207144, -0.15956368, 0.12665017, -0.08286834, 0.09581649, 0.12603259, -0.15513468, -0.010735423)); + conv2d_1_tf += mul(na2, min16float4x4(0.00818024, -0.15539199, -0.011369519, 0.05717366, -0.25330603, -0.018393422, 0.027386196, 0.121692196, 0.059138533, -0.1631142, 0.10282322, 0.08011751, 0.10027271, 0.255391, 0.010682224, -0.3095357)); + conv2d_1_tf += mul(nb2, min16float4x4(0.117767766, 0.120644994, 0.09232613, -0.018057318, -0.038398392, 0.14537762, -0.016560853, -0.08958423, 0.06743331, -0.23562634, -0.123906426, 0.028323429, -0.09386831, -0.16833909, 0.019829117, -0.08108203)); + conv2d_1_tf += mul(nc2, min16float4x4(0.05462869, -0.031615634, -0.121678494, 0.05315917, -0.012636353, -0.13374922, 0.18577711, 0.0005971412, -0.099537544, -0.060773082, -0.28754288, -0.20077203, -0.15873533, -0.11387871, -0.17841183, -0.120239034)); + conv2d_1_tf += mul(nd2, min16float4x4(0.13845754, 0.223389, -0.20315485, -0.03479761, 0.1806296, 0.057029717, 0.010771242, 0.15245064, -0.0040082, 0.015283898, -0.34807077, 0.078581005, 0.026417086, -0.058825746, 0.07728649, 0.066044815)); + conv2d_1_tf += mul(ne2, min16float4x4(-0.13820273, -0.050027788, 0.061389934, 0.11189863, 0.008062022, -0.17326912, 0.18159898, 0.08510656, 0.22065656, 0.3918094, -0.05124615, -0.22959533, 0.85480285, 0.5621734, -0.817405, 0.065126896)); + conv2d_1_tf += mul(nf2, min16float4x4(-0.15309735, 0.1396192, 0.16662036, -0.10952867, -0.03473452, -0.08712044, -0.2422528, -0.19236326, 0.49887487, 0.2615184, -0.076631024, 0.16010238, -0.09836315, -0.27126545, 0.17968613, -0.21053861)); + conv2d_1_tf += mul(ng2, min16float4x4(-0.18809205, 0.050410215, 0.1418759, -0.2876976, -0.13414268, 0.07458343, 0.096421175, -0.060676426, -0.17345451, -0.13678914, -0.06512698, -0.102106765, -0.12989639, 0.09089589, 0.07377932, -0.07263102)); + conv2d_1_tf += mul(nh2, min16float4x4(0.45035192, 0.2393797, -0.045452517, -0.04553052, -0.26037264, -0.021321824, 0.24618645, -0.108074926, -0.030116243, 0.04612789, 0.2273845, -0.07468269, -0.48789972, 0.12628402, 1.0130231, -0.14672706)); + conv2d_1_tf += mul(ni2, min16float4x4(0.5591947, -0.0326075, 0.12768768, -0.7916967, 0.023168698, -0.042015456, -0.12410894, -0.033611402, -0.14815444, -0.124497496, 0.08198418, -0.014488041, 0.4252749, -0.20253694, 0.042329047, -0.50953263)); + conv2d_1_tf += min16float4(-0.048558664, 0.11006767, -0.074099846, -0.016021004); + tex3[gxy] = conv2d_1_tf; + min16float4 nconv2d_1_tf = max(-conv2d_1_tf, 0); + conv2d_1_tf = max(conv2d_1_tf, 0); + + min16float4 target = mul(e1, min16float4x4(-0.26519376, -0.45442572, -0.24128473, 0.56122154, 0.45048368, 0.32492852, -0.14123245, -0.027976234, -0.11764467, -0.47563952, -0.09401533, 0.024141679, -0.19278349, -0.5169275, -0.26203018, 0.04326379)); + target += mul(e2, min16float4x4(-0.14198317, 0.18704857, -0.20165806, 0.3868074, 0.26532957, 0.13556235, -0.5872983, 0.13357028, 0.48151335, -0.3750496, 0.020972235, -0.32213062, -0.46967435, 0.10506199, 0.24039303, -0.3906582)); + target += mul(ne1, min16float4x4(0.10981934, -0.0040414287, -0.0025180888, -0.23061854, -0.6781062, -0.27331296, -0.1538456, 0.31020573, -0.05341261, 0.45214307, 0.23456645, 0.3261386, -0.020520406, 0.46579385, 0.57791334, 0.441774)); + target += mul(ne2, min16float4x4(0.11475315, 0.18062253, 0.21255025, -0.1963313, -0.22190428, -0.19369084, 0.5878038, -0.051808596, -0.39728877, -0.044071846, 0.0066692936, -0.0066007506, 0.03501876, 0.27602142, 0.11396466, 0.81461775)); + target += mul(conv2d_2_tf, min16float4x4(-0.44411597, -0.11377309, 0.16160126, 0.47119814, 0.22932883, -0.43011594, 0.01986201, 0.01446102, -0.2783236, -0.07647468, -0.5016725, 0.4227215, 0.31808656, 0.23829709, -0.12855907, -0.15950239)); + target += mul(nconv2d_2_tf, min16float4x4(-0.4784548, -0.042179376, -0.4882858, -0.046462137, -0.21421364, -0.35029694, -0.15496174, 0.11386904, 0.22592051, 0.1590684, 0.49690887, -0.37077406, -0.48519966, -0.14407466, 0.24836525, 0.38462397)); + target += mul(conv2d_1_tf, min16float4x4(-0.043213595, -0.004892144, 0.29046863, 0.57064444, 0.37136674, -0.5603234, -0.30733815, 0.26740906, 0.016959883, -0.26567596, 0.101653986, 0.34387913, -0.13222592, -0.34239995, 0.32046688, 0.023962379)); + target += mul(nconv2d_1_tf, min16float4x4(-0.2955613, 0.44671535, 0.056253802, -0.6011664, -0.30715483, 0.16890973, 0.041257784, -0.1544008, 0.4653661, -0.22183, -0.23155628, -0.063779, 0.10350268, 0.02045104, -0.22509801, 0.14633855)); + target += min16float4(-0.00089101185, -0.038285345, 0.023986168, -0.122330956); + tex4[gxy] = target; + + target = mul(e1, min16float4x4(-0.6336626, -0.23328744, 0.054100014, -0.6572063, 0.22899812, 0.47125596, 0.087406546, 0.5788615, -0.24324284, -0.17465535, 0.23223022, -0.4417298, -0.1195797, -0.14119461, -0.2301777, -0.1748931)); + target += mul(e2, min16float4x4(0.2554768, -0.0835268, 0.13054265, 0.033940453, -0.22754695, 0.053536188, -0.10300488, -0.10146903, 0.3104604, -0.5024146, 0.089460805, -0.20216464, 0.6033507, 0.12908716, -0.29953086, 0.292064)); + target += mul(ne1, min16float4x4(0.09586759, -0.037499018, -0.23253569, 0.63889295, 0.18920106, -0.6646685, 0.07218118, -0.61459464, -0.16397415, 0.3131906, -0.39399612, 0.36777702, 0.39545253, 0.030677503, 0.29420745, -0.02527333)); + target += mul(ne2, min16float4x4(-0.2464485, -0.117239855, -0.13390337, 0.43170166, 0.10044111, -0.13811369, -0.007668335, 0.06387773, -0.11786689, 0.23223364, 0.12805769, 0.06410502, -0.2818576, 0.21286973, 0.17026524, -0.22247931)); + target += mul(conv2d_2_tf, min16float4x4(0.12590794, 0.25101408, -0.014941272, -0.06091461, -0.106272854, -0.23196393, 0.64016813, 0.0025616125, 0.16706267, 0.008579063, 0.04476896, -0.5403641, -0.011274305, -0.014704461, -0.068788156, 0.47190762)); + target += mul(nconv2d_2_tf, min16float4x4(0.10427173, -0.11386145, -0.6048206, -0.20245847, -0.011730377, -0.0119483, 0.06255473, -0.5017671, -0.07181296, -0.08626898, -0.035322662, 0.42718327, 0.041101683, 0.017210655, -0.07089471, -0.6541289)); + target += mul(conv2d_1_tf, min16float4x4(-0.43911383, -0.099413894, -0.22120018, -0.3121928, -0.32394376, 0.1159015, 0.04434728, 0.014404674, 0.040322874, 0.06727233, -0.046662346, -0.066591434, -0.004613069, -0.6566657, -0.13442427, -0.081967555)); + target += mul(nconv2d_1_tf, min16float4x4(0.7393613, 0.059159152, 0.21900342, 0.26184326, 0.15656939, -0.05151207, -0.02730003, -0.055701576, -0.50296444, 0.09566756, -0.10248052, -0.39747316, 0.5877897, 0.83397114, -0.07968032, -0.3097048)); + target += min16float4(-0.010642331, -0.050244823, -0.009665539, 0.26457447); + tex5[gxy] = target; +} + + +//!PASS 3 +//!DESC Conv-4x3x3x16, Conv-4x1x1x40 +//!IN tex4, tex5, tex3 +//!OUT tex6, tex1, tex2 +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 + +void Pass3(uint2 blockStart, uint3 threadId) { + uint2 gxy = Rmp8x8(threadId.x) + blockStart; + uint2 inputSize = GetInputSize(); + if (gxy.x >= inputSize.x || gxy.y >= inputSize.y) { + return; + } + + float2 inputPt = GetInputPt(); + float2 pos = (gxy + 0.5f) * inputPt; + + // [ a, d, g ] + // [ b, e, h ] + // [ c, f, i ] + min16float4 a1 = tex4.SampleLevel(sam, pos - inputPt, 0); + min16float4 b1 = tex4.SampleLevel(sam, pos + float2(-inputPt.x, 0), 0); + min16float4 c1 = tex4.SampleLevel(sam, pos + float2(-inputPt.x, inputPt.y), 0); + min16float4 d1 = tex4.SampleLevel(sam, pos + float2(0, -inputPt.y), 0); + min16float4 e1 = tex4.SampleLevel(sam, pos, 0); + min16float4 f1 = tex4.SampleLevel(sam, pos + float2(0, inputPt.y), 0); + min16float4 g1 = tex4.SampleLevel(sam, pos + float2(inputPt.x, -inputPt.y), 0); + min16float4 h1 = tex4.SampleLevel(sam, pos + float2(inputPt.x, 0), 0); + min16float4 i1 = tex4.SampleLevel(sam, pos + inputPt, 0); + + min16float4 na1 = max(-a1, 0); + min16float4 nb1 = max(-b1, 0); + min16float4 nc1 = max(-c1, 0); + min16float4 nd1 = max(-d1, 0); + min16float4 ne1 = max(-e1, 0); + min16float4 nf1 = max(-f1, 0); + min16float4 ng1 = max(-g1, 0); + min16float4 nh1 = max(-h1, 0); + min16float4 ni1 = max(-i1, 0); + + a1 = max(a1, 0); + b1 = max(b1, 0); + c1 = max(c1, 0); + d1 = max(d1, 0); + e1 = max(e1, 0); + f1 = max(f1, 0); + g1 = max(g1, 0); + h1 = max(h1, 0); + i1 = max(i1, 0); + + min16float4 a2 = tex5.SampleLevel(sam, pos - inputPt, 0); + min16float4 b2 = tex5.SampleLevel(sam, pos + float2(-inputPt.x, 0), 0); + min16float4 c2 = tex5.SampleLevel(sam, pos + float2(-inputPt.x, inputPt.y), 0); + min16float4 d2 = tex5.SampleLevel(sam, pos + float2(0, -inputPt.y), 0); + min16float4 e2 = tex5.SampleLevel(sam, pos, 0); + min16float4 f2 = tex5.SampleLevel(sam, pos + float2(0, inputPt.y), 0); + min16float4 g2 = tex5.SampleLevel(sam, pos + float2(inputPt.x, -inputPt.y), 0); + min16float4 h2 = tex5.SampleLevel(sam, pos + float2(inputPt.x, 0), 0); + min16float4 i2 = tex5.SampleLevel(sam, pos + inputPt, 0); + + min16float4 na2 = max(-a2, 0); + min16float4 nb2 = max(-b2, 0); + min16float4 nc2 = max(-c2, 0); + min16float4 nd2 = max(-d2, 0); + min16float4 ne2 = max(-e2, 0); + min16float4 nf2 = max(-f2, 0); + min16float4 ng2 = max(-g2, 0); + min16float4 nh2 = max(-h2, 0); + min16float4 ni2 = max(-i2, 0); + + a2 = max(a2, 0); + b2 = max(b2, 0); + c2 = max(c2, 0); + d2 = max(d2, 0); + e2 = max(e2, 0); + f2 = max(f2, 0); + g2 = max(g2, 0); + h2 = max(h2, 0); + i2 = max(i2, 0); + + min16float4 conv2d_1_tf = tex3.SampleLevel(sam, pos, 0); + min16float4 nconv2d_1_tf = max(-conv2d_1_tf, 0); + conv2d_1_tf = max(conv2d_1_tf, 0); + + min16float4 conv2d_5_tf = mul(a1, min16float4x4(-0.11527973, 0.18487021, 0.0010509634, -0.3687562, -0.012861112, -0.37319645, -0.31061935, -0.051598914, 0.061436053, -0.2643697, -0.032551475, 0.59398615, 0.17265628, 0.1634019, 0.026527049, -0.0040123775)); + conv2d_5_tf += mul(b1, min16float4x4(-0.19826698, -0.29437867, 0.15727736, 0.44590214, 0.27655315, 0.28220633, 0.12990361, -0.09000104, -0.26396993, -0.53520125, 0.40639028, 0.7958488, 0.043264065, -0.08110669, -0.28618547, 0.12722827)); + conv2d_5_tf += mul(c1, min16float4x4(0.26455724, -0.36315665, -0.22116943, 0.049996275, 0.28526706, -0.0045478707, -0.20538875, 0.03192557, 0.04443011, -0.48084733, -0.32755423, 0.0075373487, 0.34481105, 0.04272154, -0.11092845, -0.07401724)); + conv2d_5_tf += mul(d1, min16float4x4(0.28374255, 0.13204694, 0.041846596, -0.57726663, 1.0038753, 0.42640173, -0.045806255, 0.3795911, 0.52897507, -0.2522673, 0.37759414, 0.158503, 0.111165345, -0.033814687, -0.37906894, 0.14007671)); + conv2d_5_tf += mul(e1, min16float4x4(0.30553007, -0.032092307, 0.6779135, -0.32720757, 0.29837027, 0.13522549, 0.21653146, 0.4553826, -0.22200927, -0.20921928, 0.36475468, 0.27989116, 0.6222863, -0.37027213, 0.06746388, 0.16675332)); + conv2d_5_tf += mul(f1, min16float4x4(0.31677073, -0.37482786, 0.4029838, 0.43627468, 0.32849845, -0.3442297, 0.1752726, 0.37502408, -0.1561963, -0.17489041, 0.7141825, -0.13179696, 0.17682795, 0.052273672, 0.07300372, 0.20322469)); + conv2d_5_tf += mul(g1, min16float4x4(0.07722791, 0.51997215, 0.2052519, -0.6162976, 0.07318059, -0.16653596, -0.0609372, -0.13199529, -0.011298448, -0.066250905, 0.11658636, -0.07317175, -0.068134755, 0.032443475, -0.27242857, 0.26479205)); + conv2d_5_tf += mul(h1, min16float4x4(-0.46400046, 0.34256476, -0.074927844, -0.082626544, 0.38616362, 0.10320202, 0.7306549, -0.41960227, -0.33295953, -0.35537082, 0.040369444, 0.18173583, 0.36835003, -0.078561984, -0.13071333, -0.06847678)); + conv2d_5_tf += mul(i1, min16float4x4(0.0951899, -0.21144655, 0.12174552, 0.09496668, -0.17025085, -0.36465582, 0.20724316, 0.07027979, 0.17988989, -0.16671456, -0.15068638, 0.26715076, 0.022114933, 0.14284599, -0.06316286, 0.017598677)); + conv2d_5_tf += mul(a2, min16float4x4(0.22179046, -0.19104601, 0.10500515, 0.22017653, -0.065115064, -0.027006533, -0.21086605, 0.00932852, -0.6196575, 0.04396425, 0.52487534, 0.61164427, 0.15172893, 0.219877, 0.103516005, -0.103571504)); + conv2d_5_tf += mul(b2, min16float4x4(0.122733794, 0.19491453, 0.22410785, -0.17341182, -0.18816754, 0.22092234, -0.055087283, -0.14617631, 0.4338981, -0.45366564, -1.4062341, 0.19594707, 0.2178627, 0.016837195, -0.2226328, 0.079190396)); + conv2d_5_tf += mul(c2, min16float4x4(0.16418308, 0.14917587, 0.35162288, 0.04064204, -0.037038237, 0.06579139, -0.08464511, -0.2156906, 0.22791082, -1.1695892, 0.53665465, -0.77753544, 0.0065266103, 0.15857838, 0.010236925, 0.14953533)); + conv2d_5_tf += mul(d2, min16float4x4(0.64548135, -0.02291521, -0.14370848, 0.049308565, 0.13637903, 0.14568083, -0.1488358, -0.0038734428, 0.0809154, -0.15466721, -0.06614126, -0.047732286, 0.311668, 0.22075401, 0.26094854, -0.27763176)); + conv2d_5_tf += mul(e2, min16float4x4(0.12075334, -0.23920162, 0.19115442, -0.33920774, 0.15199614, 0.27974042, -0.05022236, -0.15280685, 0.37271795, -0.76389724, -0.56503266, 1.4975219, 0.24002175, -0.12661129, 0.045953903, 0.2102559)); + conv2d_5_tf += mul(f2, min16float4x4(-0.02855315, -0.16729961, -0.27380818, -0.08810453, 0.061245166, 0.27268958, 0.2282609, 0.072155826, -0.65736717, -0.46307757, -0.5473049, 0.50772667, -0.1581774, 0.28763455, -0.1870661, -0.16523343)); + conv2d_5_tf += mul(g2, min16float4x4(0.23464368, 0.25850806, -0.054024473, -0.13788947, -0.24835043, -0.028147692, -0.23022775, 0.11494646, 0.31069988, -0.21450949, 0.40749013, -0.073832974, -0.16241223, 0.15673774, 0.23648019, -0.34203738)); + conv2d_5_tf += mul(h2, min16float4x4(-0.10198349, -0.052500926, 0.02638934, 0.19718044, -0.09078705, 0.07717591, 0.44648582, -0.30146563, -0.10124157, 0.12145466, -0.2133955, 0.16855773, -0.12310728, 0.35327804, -0.44273457, 0.20639896)); + conv2d_5_tf += mul(i2, min16float4x4(0.08033835, 0.0977811, 0.007069267, -0.110171854, -0.008568571, -0.10922981, 0.12048108, -0.0835261, 0.019930357, -0.12652875, 0.02870121, 0.12214532, -0.024486745, 0.3588685, -0.16501926, 0.11914434)); + conv2d_5_tf += mul(na1, min16float4x4(0.24003507, -0.040643565, -0.4267142, 0.34356147, -0.2618635, -0.1550601, -0.18566506, 0.33267352, -0.17584917, -0.24971883, 0.167064, -0.20808934, 0.3197215, 0.19626021, -0.16993162, -0.16976681)); + conv2d_5_tf += mul(nb1, min16float4x4(0.159248, -0.33713767, -0.37823528, 0.25286102, -0.6171255, 0.01159639, 0.08387377, -0.0796005, -0.18405017, -0.11881008, -0.03026552, 0.030733835, 0.17692643, 0.17118043, 0.23938146, -0.40504465)); + conv2d_5_tf += mul(nc1, min16float4x4(0.11274836, -0.023647472, 0.083114825, 0.5222033, -0.07415273, -0.3251913, -0.034298245, -0.07125199, 0.09593269, -0.23062208, -0.3168607, -0.13040248, -0.41249517, 0.39030293, 0.47400078, -0.109306306)); + conv2d_5_tf += mul(nd1, min16float4x4(-0.49999082, 0.012254524, -0.035179958, 0.212335, -0.10354367, -0.19730526, 0.092015326, -0.07317916, -0.21900047, -0.13948579, -0.3228226, -0.22363624, -0.06421761, 0.16125691, 0.38075948, -0.31371582)); + conv2d_5_tf += mul(ne1, min16float4x4(-1.0006356, -0.13763155, -0.8414047, -0.051852856, -0.44105098, 0.526086, 0.23091859, -0.6621191, -0.015348964, 0.37972412, -0.24986422, 0.13964157, -0.03184678, 0.25394693, -0.051659737, -0.34171197)); + conv2d_5_tf += mul(nf1, min16float4x4(0.14520285, 0.1346628, 0.047271203, 0.64346415, -0.25639483, 0.052174076, 0.28681588, -0.32156095, 0.014350296, 0.028580237, 0.33776954, 0.06681965, -0.27312553, 0.44097883, -0.16519593, -0.7293824)); + conv2d_5_tf += mul(ng1, min16float4x4(-0.65626615, -0.20801732, -0.18783297, 0.27998376, -0.51550066, -0.23272751, -0.3744558, 0.11267917, -0.1879591, 0.043539204, -0.17665562, 0.28546363, -0.20627682, 0.33176526, 0.34412766, -0.4310386)); + conv2d_5_tf += mul(nh1, min16float4x4(0.51410156, -0.08615402, -0.2396778, -0.027256064, 0.11491742, -0.20842157, 0.3855824, -0.19823207, 0.0062098945, -0.2629099, 0.13158852, -0.08746773, -0.46980307, 0.57169086, -0.13392213, 0.13375558)); + conv2d_5_tf += mul(ni1, min16float4x4(0.09988252, 0.19396676, -0.011215926, 0.2714918, 0.07985461, 0.30587563, 0.21915142, -0.14004244, -0.336268, 0.023702772, 0.15740578, -0.06307948, 0.06453276, 0.26978606, 0.45891464, -0.35511568)); + conv2d_5_tf += mul(na2, min16float4x4(-0.33263445, -0.13086738, -0.30128893, 0.03720744, 0.46366304, -0.13430476, -0.26493385, 0.14521147, -0.025578065, -0.043376725, 0.055235144, -0.08467402, 0.12879072, 0.2621278, -0.030150373, -0.079033755)); + conv2d_5_tf += mul(nb2, min16float4x4(-0.15686864, 0.06962337, -0.24032803, 0.05093969, 0.12118379, 0.2144539, 0.21314697, -0.15564163, -0.15193312, -0.15797225, 0.061610706, 0.06689548, 0.42354256, 0.24339569, 0.14413804, -0.08890708)); + conv2d_5_tf += mul(nc2, min16float4x4(0.021830576, -0.0682399, -0.25052184, 0.035374403, -0.0022370394, 0.23796171, 0.40747103, -0.14309348, -0.22325014, 0.12337428, -0.0727028, 0.12374459, -0.24148722, 0.34091887, 0.5052561, -0.13712624)); + conv2d_5_tf += mul(nd2, min16float4x4(-0.583754, -0.10253819, -0.26736188, -0.084894784, 0.7130811, 0.5888696, 0.24837445, 0.20670207, 0.08242887, -0.03090308, 0.24002716, -0.04146999, 0.33550006, -0.006085788, -0.2078999, 0.016955601)); + conv2d_5_tf += mul(ne2, min16float4x4(-0.23921615, 1.0534316, -0.29723012, -0.06626253, 0.022887046, -0.6139072, 0.22857629, 0.4203786, -0.02951169, 0.0501039, -0.054740574, -0.15496075, 0.9533812, 0.21038955, 0.33969748, 0.18853404)); + conv2d_5_tf += mul(nf2, min16float4x4(-0.13571729, -0.045776337, 0.23663524, 0.1457326, -0.23159564, -0.44608104, -0.35497522, -0.14684997, 0.042379193, 0.16966693, 0.2560789, -0.07091574, 0.010749883, -0.26966086, -0.16322245, 0.095426805)); + conv2d_5_tf += mul(ng2, min16float4x4(-0.027934154, -0.25037688, 0.19623838, 0.16128206, 0.21479255, 0.4066385, -0.06756232, -0.19681008, 0.09168842, 0.46935177, -0.059632402, -0.3419115, 0.2789002, 0.012714867, 0.15322958, 0.05255599)); + conv2d_5_tf += mul(nh2, min16float4x4(0.2074098, -0.19564646, 0.21713807, -0.29207307, -0.08546043, 0.122562535, -0.5150736, 0.5190804, -0.116998374, 0.17080544, -0.29132518, 0.47585255, -0.14625762, -0.026589578, -0.13111407, 0.03473621)); + conv2d_5_tf += mul(ni2, min16float4x4(-0.3399405, 0.063775875, -0.0121724615, 0.13809827, -0.1575877, 0.13529225, -0.28708464, -0.063552216, 0.08623843, 0.034867074, 0.25082812, -0.038863987, 0.08048017, -0.43998414, -0.05038377, -0.20123458)); + conv2d_5_tf += min16float4(0.19016464, 0.19431238, -0.073604904, 0.101166695); + min16float4 nconv2d_5_tf = max(-conv2d_5_tf, 0); + conv2d_5_tf = max(conv2d_5_tf, 0); + + min16float4 conv2d_4_tf = mul(a1, min16float4x4(0.259803, 0.14121838, -0.3216694, 0.16912009, -0.24997918, -0.024859427, 0.07951931, -0.17898253, 0.14770418, -0.38608834, 0.7155576, -0.008749993, 0.106385805, -0.08190305, 0.06277034, 0.05247095)); + conv2d_4_tf += mul(b1, min16float4x4(-0.10331291, 0.29847905, -0.20864278, -0.34607938, -0.0629403, 0.24202278, 0.15617771, 0.09471163, 0.29827452, -0.5237911, 0.8446165, -0.038001515, 0.085504964, -0.012998129, -0.12903701, -0.068084855)); + conv2d_4_tf += mul(c1, min16float4x4(-0.028803846, 0.117718086, 0.11924323, -0.23554896, -0.31169716, 0.2164557, 0.054745417, -0.2886858, 0.34304592, -0.15872054, 0.21533915, 0.23624876, -0.02507208, 0.16001348, -0.14645866, -0.013143789)); + conv2d_4_tf += mul(d1, min16float4x4(0.12311184, 0.16843726, -0.5478087, 0.036556758, -0.0024939126, -0.12264501, 0.090127975, -0.14638199, -0.33366996, 0.1817309, 0.018728942, -0.025097579, -0.00233696, 0.15182042, -0.072947, -0.15065937)); + conv2d_4_tf += mul(e1, min16float4x4(0.3238381, 0.19316678, 0.23307748, -0.10455285, -0.35405514, -0.06559013, 0.4206979, 0.08059919, -0.26130152, -0.23416454, -0.21285532, 0.07799376, 0.12372864, -0.3774056, 0.022239799, 0.22356819)); + conv2d_4_tf += mul(f1, min16float4x4(0.066345, 0.20370135, -0.01601085, 0.014701113, 0.27098605, 0.25511372, -0.048403386, -0.014162313, 0.11301996, -0.09638182, 0.12047054, -0.010323633, 0.21627729, 0.18377618, -0.12752205, -0.0668105)); + conv2d_4_tf += mul(g1, min16float4x4(0.18890683, -0.21100806, -0.38314816, 0.12188494, -0.09069559, 0.1785706, -0.19502263, -0.22853898, -0.096488185, 0.18105212, -0.0045291157, -0.018952737, 0.14934972, -0.17416078, 0.05363704, -0.17642738)); + conv2d_4_tf += mul(h1, min16float4x4(-0.15392087, 0.13997103, -0.12765433, -0.054465868, 0.0061383434, 0.03424787, -0.08585949, -0.10249745, -0.055375032, -0.047258787, -0.10105776, 0.09468892, 0.32030013, -0.14938186, 0.18287018, 0.007592655)); + conv2d_4_tf += mul(i1, min16float4x4(0.109669484, 0.02212132, 0.038995523, -0.0041161263, -0.12115841, -0.048061926, 0.06674463, -0.33846095, 0.04251217, -0.05917749, 0.17834029, 0.010219928, 0.2690458, 0.09282476, 0.077470005, -0.07310091)); + conv2d_4_tf += mul(a2, min16float4x4(0.4314233, 0.035379685, 0.27331847, 0.19597715, -0.09619968, -0.055907905, 0.07898602, 0.031254813, -0.09366987, -0.37436283, 0.061305135, -0.32644534, -0.16999187, 0.06906536, -0.1228417, -0.09826574)); + conv2d_4_tf += mul(b2, min16float4x4(0.6059936, -0.10060162, -0.18080838, 0.26205355, 0.033052504, -0.10625297, -0.0038814575, 0.026052764, 0.19484659, -0.24242568, 0.8054419, -0.3437365, -0.010305425, -0.079504244, 0.11879563, -0.14375582)); + conv2d_4_tf += mul(c2, min16float4x4(0.23313539, -0.026485069, 0.13332158, 0.28462213, -0.19786534, 0.048259735, 0.024113638, 0.23403068, -1.0330093, 0.0059400625, 0.23721488, -1.379481, 0.12166913, -0.07133997, 0.060898513, 0.092720084)); + conv2d_4_tf += mul(d2, min16float4x4(0.16513251, 0.013819962, -0.009859532, -0.037474833, 0.25651336, -0.131653, 0.03145131, -0.27886832, 0.27808505, -0.099978246, -0.11189488, 0.053313572, 0.11455811, 0.10826371, 0.0017301271, -0.041959)); + conv2d_4_tf += mul(e2, min16float4x4(-0.037442397, 0.061722398, 0.099159, -0.18970016, -0.13042277, 0.16767356, -0.028342545, 0.18715699, 0.22246139, 0.3154743, -0.39717823, 0.26053482, -0.012097491, 0.1746896, 0.3899962, -0.13013846)); + conv2d_4_tf += mul(f2, min16float4x4(-0.14552362, -0.26800197, 0.09035887, 0.24266347, -0.14494316, 0.033814326, -0.06647855, -0.16609156, 0.30540654, 0.037082594, 0.14951941, 0.12753695, -0.045153987, -0.28476146, 0.37640104, -0.04667195)); + conv2d_4_tf += mul(g2, min16float4x4(0.2071077, -0.09297775, -0.04906301, -0.24280597, 0.15925987, -0.05631783, 0.08169953, -0.20124075, 0.23060048, -0.05786468, 0.23959383, 0.1620485, 0.14333409, -0.12757483, -0.1424963, 0.13118197)); + conv2d_4_tf += mul(h2, min16float4x4(-0.101942524, -0.02240319, 0.11718157, -0.13591368, 0.11223302, -0.042933583, -0.07766777, 0.01667011, 0.07462998, 0.020704709, -0.04329035, -0.01358702, 0.13569939, 0.015980164, -0.08001042, 0.13890027)); + conv2d_4_tf += mul(i2, min16float4x4(0.01755685, -0.047599614, 0.06456479, -0.08004052, 0.08108282, 0.06789228, -0.14048836, -0.020240005, 0.039701223, 0.023405846, 0.06305444, -0.046804685, 0.040620867, 0.013529182, -0.094961315, 0.02959053)); + conv2d_4_tf += mul(na1, min16float4x4(-0.053775985, -0.0060494044, 0.14724614, 0.07248909, -0.056616947, 0.0004714896, -0.18737504, -0.15240799, -0.030883765, -0.007487297, -0.0044565946, 0.15024893, -0.16870505, 0.09338804, -0.21873595, -0.14493267)); + conv2d_4_tf += mul(nb1, min16float4x4(-0.045113027, -0.2153715, 0.04520989, 0.26561612, -0.12634845, -0.10975088, -0.3677834, -0.4343602, -0.34146985, 0.29135808, 0.026339425, -0.0995021, 0.012693227, 0.07312179, 0.21671581, 0.11961088)); + conv2d_4_tf += mul(nc1, min16float4x4(0.19766524, -0.31538734, 0.35708517, 0.33092737, 0.027086282, 0.024219114, -0.15289012, -0.18128034, -0.16041638, 0.057314564, 0.079830885, -0.08828221, 0.11828446, -0.13336371, -0.078453206, 0.21232514)); + conv2d_4_tf += mul(nd1, min16float4x4(-0.13100033, -0.24849984, 0.3087074, 0.017271562, -0.17455627, -0.014364008, 0.077686995, -0.015820628, 0.18584616, -0.16705278, -0.3169503, 0.09107534, -0.04958684, -0.008202742, 0.024148908, -0.04654239)); + conv2d_4_tf += mul(ne1, min16float4x4(-0.16020702, -0.18623418, -0.29434547, 0.5008317, 0.23796988, -0.11154579, -0.5167728, -0.14195764, 0.15495163, -0.028505204, -0.2105556, 0.22491512, -0.11658545, 0.31665426, 0.35085753, -0.40148884)); + conv2d_4_tf += mul(nf1, min16float4x4(0.24866697, -0.3752738, 0.8472619, 0.16663249, -0.25808626, -0.037561346, -0.1440471, -0.107407264, 0.016663626, 0.1599037, -0.31926402, 0.15272903, -0.14700623, -0.05275371, 0.061130624, 0.084672675)); + conv2d_4_tf += mul(ng1, min16float4x4(-0.24184473, -0.016008917, 0.040023588, 0.1517675, -0.1339458, 0.009985992, 0.15634708, -0.07649679, 0.0021696684, -0.07027257, -0.07509208, -0.27060902, -0.21299353, 0.12154156, -0.3159698, 0.2511261)); + conv2d_4_tf += mul(nh1, min16float4x4(0.19845779, 0.023986215, -0.073409855, 0.0812208, 0.013382121, -0.049414996, -0.12990347, 0.052681953, -0.12787153, -0.100129806, -0.036296804, -0.13915883, -0.24022135, 0.167096, -0.15128131, 0.17779276)); + conv2d_4_tf += mul(ni1, min16float4x4(-0.05787442, -0.19698323, 0.13090582, 0.1501304, -0.09954089, -0.008470983, -0.095334776, 0.114635326, -0.16330223, -0.046815667, -0.086304545, -0.15729928, -0.1982723, 0.10607274, -0.25540838, 0.09633669)); + conv2d_4_tf += mul(na2, min16float4x4(-0.25680968, -0.18444876, 0.053333476, 0.10470261, 0.17798793, -0.108659215, 0.1787569, -0.027407814, 0.12637395, -0.038193744, -0.16185284, 0.14068736, 0.092281684, 0.022276353, 0.013779975, 0.026369803)); + conv2d_4_tf += mul(nb2, min16float4x4(-0.17329752, 0.21632285, -0.036964342, 0.30856085, 0.015225849, 0.04158692, -0.010607313, 0.16295516, 0.18873654, 0.24728407, 0.09787, -0.14381099, -0.091119304, 0.12914585, -0.039659716, -0.10700463)); + conv2d_4_tf += mul(nc2, min16float4x4(-0.037163302, 0.05201725, -0.149489, -0.05682234, -0.022634465, -0.074764505, -0.010783339, 0.028970495, -0.045976285, -0.1923207, -0.037494432, -0.13024884, -0.1957353, 0.013454359, -0.30236122, -0.078870796)); + conv2d_4_tf += mul(nd2, min16float4x4(-0.17753989, -0.1549664, 0.08087595, 0.046868976, -0.09354348, 0.22648604, 0.002651186, 0.11890617, -0.0073132347, 0.05030891, -0.08128038, 0.14395374, -0.001108739, -0.030957213, -0.03568773, 0.055131156)); + conv2d_4_tf += mul(ne2, min16float4x4(-0.029484594, -0.013036961, -0.31721568, 0.11611545, -0.24111903, -0.33007705, 0.5950326, -0.070911475, -0.04757172, -0.037676062, -0.14590797, 0.076822214, -0.1672743, -0.41848892, 0.39202756, -0.30958134)); + conv2d_4_tf += mul(nf2, min16float4x4(0.17605461, 0.12216047, -0.02412872, -0.14132546, -0.052373543, 0.08169531, 0.18497281, 0.074685514, -0.055427983, 0.14018987, -0.11671619, 0.108945735, -0.032986425, 0.11385016, 0.05801377, -0.1457665)); + conv2d_4_tf += mul(ng2, min16float4x4(-0.27222672, -0.0074164676, 0.35768685, 0.0074552484, 0.16729778, 0.14860032, -0.3657366, 0.24510175, -0.0621289, -0.0137252435, -0.26145887, 0.0556681, -0.07332952, 0.13122542, -0.020396946, 0.113705456)); + conv2d_4_tf += mul(nh2, min16float4x4(0.08118381, -0.06442098, 0.00044297878, 0.13279027, -0.20708169, 0.11252618, -0.033728387, -0.0105973175, -0.2138218, 0.34612998, -0.15597765, 0.18179017, -0.007853463, -0.045547944, 0.22064093, 0.0548327)); + conv2d_4_tf += mul(ni2, min16float4x4(-0.10656318, -0.014200068, 0.062040597, -0.037210476, -0.07271065, -0.027337732, -0.14988437, -0.14711551, -0.028843492, -0.0046596485, -0.15023676, 0.08530336, -0.016875269, -0.024734195, 0.055177588, 0.010381644)); + conv2d_4_tf += min16float4(-0.021330277, -0.09496422, -0.1339419, 0.012216251); + tex6[gxy] = conv2d_4_tf; + min16float4 nconv2d_4_tf = max(-conv2d_4_tf, 0); + conv2d_4_tf = max(conv2d_4_tf, 0); + + min16float4 target = mul(e1, min16float4x4(-0.4756803, -0.16041027, 0.30747655, 0.27719444, 0.33626345, -0.093426555, -0.08751585, -0.025898175, 0.12469858, 0.162526, 0.071950376, 0.36727026, -0.26165214, 0.17652564, -0.081568465, 0.17669047)); + target += mul(e2, min16float4x4(0.10045615, -0.47277164, 0.13970673, -0.036603283, 0.10723418, -0.0733819, 0.07046736, 0.04479655, -0.5100679, 0.4051206, -0.3043826, 0.07709692, 0.25090587, -0.5827475, 0.27195984, 0.42297873)); + target += mul(ne1, min16float4x4(-0.34415862, -0.056642354, -0.32332316, 0.049897127, 0.08399151, 0.683046, -0.16349371, -0.4878456, -0.097749546, 0.7214421, -0.2821467, -0.16691755, 0.3712332, -0.71557045, 0.40365914, 0.37325174)); + target += mul(ne2, min16float4x4(-0.333854, 0.11971563, -0.26533902, -0.033346854, 0.09896302, -0.19311592, -0.006087015, -0.104003794, 0.05347405, -0.16057043, 0.15876219, 0.1538847, -0.07954591, 0.24062383, -0.025401022, -0.33599105)); + target += mul(conv2d_5_tf, min16float4x4(0.11794056, -0.0031797416, 0.08360105, 0.12222232, -0.16638078, 0.26014742, -0.047267277, -0.27900735, 0.17616066, -0.12788172, 0.22856903, -0.39034957, -0.36313176, 0.12272574, 0.2235959, -0.31102005)); + target += mul(nconv2d_5_tf, min16float4x4(0.03297161, 0.19597028, -0.068131894, -0.059938233, 0.18935929, -0.12004069, 0.08705267, 0.26411813, -0.021374375, 0.24630849, -0.08980925, 0.15982057, 0.3533297, -0.15414584, -0.19008748, 0.11310849)); + target += mul(conv2d_1_tf, min16float4x4(-0.4622819, 0.31923467, -0.38989246, 0.5539857, -0.035433546, -0.12729715, -0.0669769, -0.048216928, -0.32078394, 0.26958883, 0.08897814, -0.31043166, 0.26743132, 0.38835636, -0.30535862, -0.22241123)); + target += mul(nconv2d_1_tf, min16float4x4(0.47431698, -0.755935, -0.075302646, 0.27771655, 0.052087527, -0.17221431, 0.0008429987, 0.15527548, -0.04587466, -0.11802989, 0.39905685, -0.07758683, -0.11415051, 0.004637339, -0.19803126, 0.19956517)); + target += mul(conv2d_4_tf, min16float4x4(0.36277947, -0.13364364, 0.18459712, -0.1705512, -0.46083033, 0.43629453, 0.112646095, -0.18511245, 0.037818372, 0.1220617, -0.22268273, -0.11983507, -0.5432721, -0.2102279, -0.014456884, 0.16428374)); + target += mul(nconv2d_4_tf, min16float4x4(0.22811654, 0.16262956, 0.18411161, 0.49102694, -0.15078211, -0.6144134, -0.11632199, 0.2740543, -0.11322067, -0.16751853, 0.18453367, 0.14305107, 0.36418238, -0.34248996, -0.055178564, 0.37168074)); + target += min16float4(0.07878663, -0.045328207, -0.07142425, -0.006036755); + tex1[gxy] = target; + + target = mul(e1, min16float4x4(-0.35645446, -0.01804877, -0.53608185, 0.32968932, 0.13975728, -0.1716116, 0.09503091, -0.12088551, 0.30239868, 0.9217966, 0.016221086, -0.26894137, -0.0047026747, 0.54764843, -0.2826915, 0.0016894634)); + target += mul(e2, min16float4x4(-0.15123259, 0.2014175, 0.05961645, -0.32386652, -0.25275725, 0.3658508, -0.104193784, -0.02756655, 0.2696138, 0.17608197, 0.17685752, 0.6808081, -0.40293297, 0.48387393, 0.25278264, 0.28291366)); + target += mul(ne1, min16float4x4(-0.18928573, -0.18908137, 0.47045723, 0.5454373, 0.31339395, -0.0064702537, -0.37307036, -0.37479213, 0.2235379, -0.370863, 0.02827034, 0.024350066, -0.32538193, -0.33686417, 0.8949382, 0.3324315)); + target += mul(ne2, min16float4x4(-0.17215039, -0.14995, -0.4451278, 0.30758965, 0.21607, 0.08995007, 0.09553425, -0.21233945, -0.14442022, 0.09295349, -0.29228872, -0.3875935, 0.11704046, -0.4206096, 0.35226774, -0.08189522)); + target += mul(conv2d_5_tf, min16float4x4(-0.12517966, 0.060051568, -0.38888076, 0.08354471, 0.17010468, -0.34286287, -0.06961373, 0.032387406, -0.025718998, -0.1661844, -0.075671494, 0.10289619, -0.28309906, -0.14461538, 0.22726184, 0.4752376)); + target += mul(nconv2d_5_tf, min16float4x4(0.15411675, 0.17533994, 0.3406641, -0.0597274, -0.21072194, 0.1517182, 0.032032263, 0.18653658, 0.20970167, -0.10793765, -0.05335404, -0.095203936, 0.2917104, -0.1170929, -0.11652503, -0.46912733)); + target += mul(conv2d_1_tf, min16float4x4(-0.272871, 0.07467413, 0.16981912, 0.57318956, 0.35038894, -0.06679483, 0.3777534, -0.01522816, 0.2588504, -0.008976239, 0.31769443, 0.07070477, 0.059302222, 0.28855336, -0.14700443, -0.08605704)); + target += mul(nconv2d_1_tf, min16float4x4(-0.27067363, -0.2191635, -0.2377148, -1.0028448, -0.25673935, 0.10997322, -0.39032057, 0.06524818, 0.5248202, 0.40049195, 0.6711809, 0.2878331, 0.19606547, -0.092196286, 0.27838528, 0.03120515)); + target += mul(conv2d_4_tf, min16float4x4(0.3029178, -0.027027214, 0.13855064, -0.16550988, 0.2354576, -0.1715326, 0.12981784, 0.5013446, 0.24411377, -0.13030572, -0.08595908, -0.104394995, 0.16794646, -0.044388745, 0.2807999, 0.39108425)); + target += mul(nconv2d_4_tf, min16float4x4(-0.05535261, -0.15662162, 0.14935054, 0.10706811, 0.026958441, -0.15323113, -0.19261432, -0.24361719, -0.2607876, 0.038486157, -0.04509224, 0.18722118, -0.14478058, 0.03614682, -0.12608361, -0.5203596)); + target += min16float4(-0.17363991, 0.071162574, -0.09289675, 0.013446863); + tex2[gxy] = target; +} + + +//!PASS 4 +//!DESC Conv-4x3x3x16, Conv-4x1x1x48 +//!IN tex1, tex2, tex3, tex6 +//!OUT tex7, tex4, tex5 +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 + +void Pass4(uint2 blockStart, uint3 threadId) { + uint2 gxy = Rmp8x8(threadId.x) + blockStart; + uint2 inputSize = GetInputSize(); + if (gxy.x >= inputSize.x || gxy.y >= inputSize.y) { + return; + } + + float2 inputPt = GetInputPt(); + float2 pos = (gxy + 0.5f) * inputPt; + + // [ a, d, g ] + // [ b, e, h ] + // [ c, f, i ] + min16float4 a1 = tex1.SampleLevel(sam, pos - inputPt, 0); + min16float4 b1 = tex1.SampleLevel(sam, pos + float2(-inputPt.x, 0), 0); + min16float4 c1 = tex1.SampleLevel(sam, pos + float2(-inputPt.x, inputPt.y), 0); + min16float4 d1 = tex1.SampleLevel(sam, pos + float2(0, -inputPt.y), 0); + min16float4 e1 = tex1.SampleLevel(sam, pos, 0); + min16float4 f1 = tex1.SampleLevel(sam, pos + float2(0, inputPt.y), 0); + min16float4 g1 = tex1.SampleLevel(sam, pos + float2(inputPt.x, -inputPt.y), 0); + min16float4 h1 = tex1.SampleLevel(sam, pos + float2(inputPt.x, 0), 0); + min16float4 i1 = tex1.SampleLevel(sam, pos + inputPt, 0); + + min16float4 na1 = max(-a1, 0); + min16float4 nb1 = max(-b1, 0); + min16float4 nc1 = max(-c1, 0); + min16float4 nd1 = max(-d1, 0); + min16float4 ne1 = max(-e1, 0); + min16float4 nf1 = max(-f1, 0); + min16float4 ng1 = max(-g1, 0); + min16float4 nh1 = max(-h1, 0); + min16float4 ni1 = max(-i1, 0); + + a1 = max(a1, 0); + b1 = max(b1, 0); + c1 = max(c1, 0); + d1 = max(d1, 0); + e1 = max(e1, 0); + f1 = max(f1, 0); + g1 = max(g1, 0); + h1 = max(h1, 0); + i1 = max(i1, 0); + + min16float4 a2 = tex2.SampleLevel(sam, pos - inputPt, 0); + min16float4 b2 = tex2.SampleLevel(sam, pos + float2(-inputPt.x, 0), 0); + min16float4 c2 = tex2.SampleLevel(sam, pos + float2(-inputPt.x, inputPt.y), 0); + min16float4 d2 = tex2.SampleLevel(sam, pos + float2(0, -inputPt.y), 0); + min16float4 e2 = tex2.SampleLevel(sam, pos, 0); + min16float4 f2 = tex2.SampleLevel(sam, pos + float2(0, inputPt.y), 0); + min16float4 g2 = tex2.SampleLevel(sam, pos + float2(inputPt.x, -inputPt.y), 0); + min16float4 h2 = tex2.SampleLevel(sam, pos + float2(inputPt.x, 0), 0); + min16float4 i2 = tex2.SampleLevel(sam, pos + inputPt, 0); + + min16float4 na2 = max(-a2, 0); + min16float4 nb2 = max(-b2, 0); + min16float4 nc2 = max(-c2, 0); + min16float4 nd2 = max(-d2, 0); + min16float4 ne2 = max(-e2, 0); + min16float4 nf2 = max(-f2, 0); + min16float4 ng2 = max(-g2, 0); + min16float4 nh2 = max(-h2, 0); + min16float4 ni2 = max(-i2, 0); + + a2 = max(a2, 0); + b2 = max(b2, 0); + c2 = max(c2, 0); + d2 = max(d2, 0); + e2 = max(e2, 0); + f2 = max(f2, 0); + g2 = max(g2, 0); + h2 = max(h2, 0); + i2 = max(i2, 0); + + min16float4 conv2d_1_tf = tex3.SampleLevel(sam, pos, 0); + min16float4 nconv2d_1_tf = max(-conv2d_1_tf, 0); + conv2d_1_tf = max(conv2d_1_tf, 0); + + min16float4 conv2d_4_tf = tex6.SampleLevel(sam, pos, 0); + min16float4 nconv2d_4_tf = max(-conv2d_4_tf, 0); + conv2d_4_tf = max(conv2d_4_tf, 0); + + min16float4 conv2d_8_tf = mul(a1, min16float4x4(-0.162897, -0.21250516, -0.11219427, 0.30969706, 0.078927204, -0.14922144, 0.5486932, 0.2884913, 0.07018745, 0.45946357, -0.23759702, -0.18914284, 0.19762751, 0.56881535, -0.2141465, 0.27216902)); + conv2d_8_tf += mul(b1, min16float4x4(-0.17507325, -0.577772, -0.46351492, 0.09431303, 0.023881523, -0.068162896, -0.0029204858, -0.076631226, -0.07645065, 0.28997856, -0.0349899, 0.087704636, 0.29194608, 0.7767595, 0.17478088, -0.295144)); + conv2d_8_tf += mul(c1, min16float4x4(0.23039296, -0.000184939, -0.032427344, 0.0926983, -0.4264918, -0.44138262, 0.39098918, -0.0102598835, 0.066287994, 0.15478721, -0.062338993, 0.15079321, 0.120016515, 0.7005824, -0.12260436, 0.090042405)); + conv2d_8_tf += mul(d1, min16float4x4(0.014269367, 0.21645544, -0.4203915, 0.0077638677, -0.18618487, 0.30165052, 0.6985895, -0.014695781, -0.071353786, -0.49996287, -0.79902583, -0.06343025, 0.291085, 0.28801495, 0.46547806, 0.1311194)); + conv2d_8_tf += mul(e1, min16float4x4(0.17163453, 0.21760814, -0.67896426, 0.1487859, 0.05881719, -0.08391752, 0.44536906, 0.24853623, -0.7685656, 0.45705163, -1.0204223, 0.1884743, -0.3251896, -0.49221343, 0.38116506, -0.09428967)); + conv2d_8_tf += mul(f1, min16float4x4(0.2759429, 0.22141403, -0.13269989, 0.06833041, -0.29562923, -0.26589182, -0.34452415, 0.36388424, -0.3184807, 0.08254464, -0.15477169, 0.03237491, -0.34190834, -0.2777646, -0.15713428, -0.22231084)); + conv2d_8_tf += mul(g1, min16float4x4(-0.36887082, -0.34607458, 0.5719879, 0.09200919, 0.12724651, 0.20281908, 0.39280674, 0.09216231, 0.3126475, -0.0075341803, -0.046779484, 0.10883631, 0.20136468, 0.70330596, -0.024237871, -0.061087623)); + conv2d_8_tf += mul(h1, min16float4x4(-0.08114617, -0.02456657, 0.1287709, 0.5486885, -0.10143632, -0.39116892, 0.24008204, 5.8133483e-05, -0.36640543, -0.52113515, 0.3836287, 0.09541327, 0.01115865, -0.2044513, 0.07734024, -0.29509112)); + conv2d_8_tf += mul(i1, min16float4x4(0.25962162, -0.05327207, -0.28945914, 0.320823, 0.049143463, 0.011241379, 0.004193257, 0.3872085, -0.47137228, -0.44385332, -0.2591483, -0.20189615, 0.08729277, -0.14813553, -0.29911307, 0.0067013856)); + conv2d_8_tf += mul(a2, min16float4x4(0.13526323, 0.6637005, 0.09491454, -0.038491655, -0.5078187, -0.5782128, -1.0748478, 0.18678135, 0.16064858, 0.0795754, 0.116070546, 0.06408978, 0.085641995, -0.39126787, -0.16669247, -0.024058852)); + conv2d_8_tf += mul(b2, min16float4x4(-0.30658495, -0.08933112, 0.38358685, -0.048228927, 0.050148476, -0.08750905, -0.5015779, 0.4012965, -0.068299964, 0.08993712, 0.03617703, -0.030809006, 0.05144756, -0.7659615, -0.33359128, 0.0054376507)); + conv2d_8_tf += mul(c2, min16float4x4(-0.24894494, 0.08617524, -0.095747314, 0.14710969, -0.09528072, 0.19016005, 0.060339417, -0.059556015, 0.01127292, -0.021082405, 0.5204205, 0.23831797, -0.035384487, 0.001653611, -0.28902745, -0.0060615037)); + conv2d_8_tf += mul(d2, min16float4x4(0.2978602, 0.2580722, 0.11472323, -0.06937241, -0.45087403, -0.35747236, -0.38835877, 0.22520676, 0.09162963, 0.50932664, -0.41183934, -0.08526183, -0.043625794, -0.27782285, -0.4119391, -0.339948)); + conv2d_8_tf += mul(e2, min16float4x4(-0.005034612, 0.010024151, 0.55194247, -0.16040643, 0.0072234212, -0.047230296, 0.011222393, -0.017184192, 0.2156304, 0.02429907, 0.41669923, -0.06159069, -0.39241523, 0.009254305, 0.35784644, -0.45379582)); + conv2d_8_tf += mul(f2, min16float4x4(-0.18008694, -0.35366225, 0.12110043, -0.102665015, 0.2763678, -0.61502653, 0.3051717, -0.23991431, 0.6076138, -1.142571, 1.2579885, 0.15013893, -0.13282573, -0.16185799, -0.26278257, 0.044563264)); + conv2d_8_tf += mul(g2, min16float4x4(-0.043284204, -0.1374118, -0.6523209, -0.1682561, -0.002918912, 0.2768846, 0.045174655, -0.046218265, 0.10686049, -0.004872297, 0.04118156, -0.07015327, -0.3329307, 0.19972506, -0.38307762, 0.11627049)); + conv2d_8_tf += mul(h2, min16float4x4(0.09306764, -0.5036807, -0.25358048, -0.033543527, 0.07199686, -0.28982875, -0.022885432, -0.078454, -0.0836088, -0.08261633, 0.38759607, 0.021209864, 0.09516953, -0.1896164, -0.12284774, 0.16532375)); + conv2d_8_tf += mul(i2, min16float4x4(0.27196047, -0.6199637, 0.12209493, -0.0055379267, -0.08997175, -0.0025996822, -0.20710677, 0.15223576, -0.07073166, -0.20732503, -0.044538528, 0.35751408, 0.33849528, -0.14603287, 0.19472563, 0.20992133)); + conv2d_8_tf += mul(na1, min16float4x4(0.018979501, 0.030001618, 0.09530055, -0.22441792, -0.11513775, -0.05383842, 0.042144198, -0.2824055, 0.20338169, 0.9622458, -0.20780474, 0.5217952, 0.11518432, 0.24126045, -0.046675194, -0.07326568)); + conv2d_8_tf += mul(nb1, min16float4x4(-0.13768856, 0.17157272, -0.32123035, -0.08968111, 0.011915078, -0.08129057, -0.71480066, 0.24239756, 0.5093838, 0.29058817, -0.07181868, -0.22533971, 0.24244072, -0.2716092, 0.03331018, 0.008624937)); + conv2d_8_tf += mul(nc1, min16float4x4(0.21304299, 0.5180637, 0.40324917, -0.078679435, 0.17033757, -0.4813804, -0.47702515, -0.017285354, -0.054009005, -0.5853617, -0.5427995, 0.13533083, 0.12440328, -0.6455633, 0.0012186684, 0.031838413)); + conv2d_8_tf += mul(nd1, min16float4x4(0.04057183, -0.27768528, -0.07563423, 0.13400203, -0.03429928, -0.32794374, -0.085426375, -0.3724642, -0.19195397, 0.1349262, -0.2909766, -0.43096116, 0.056601644, 0.5106557, -0.267059, -0.046354882)); + conv2d_8_tf += mul(ne1, min16float4x4(0.14343774, -0.29267886, -0.2406526, -0.30307195, -0.10270894, 0.008828463, -1.5378821, 0.017785087, 0.48302534, -0.310974, 1.5381073, 0.08598342, 0.82111055, -0.0049781636, 0.4820726, 0.301231)); + conv2d_8_tf += mul(nf1, min16float4x4(0.012052944, -0.090234, 0.52199095, -0.3329521, 0.110252894, 0.2897882, -0.37447298, 0.17326026, 0.18148576, -0.23976558, 0.1848407, 0.5042414, 0.33321953, 0.2712571, 0.18124644, 0.20849751)); + conv2d_8_tf += mul(ng1, min16float4x4(0.066107936, 0.035174694, -0.1587501, -0.22672103, 0.012212267, -0.05451626, -0.6004301, 0.013387352, -0.04113352, 0.53583735, -0.15342614, -0.0018758774, 0.09947345, -0.18213694, 0.02965846, -0.044368513)); + conv2d_8_tf += mul(nh1, min16float4x4(0.099831305, 0.2666737, -0.12301129, -0.113591194, 0.018106552, 0.290373, 0.1480011, 0.032558106, 0.0024403003, 0.11745559, 0.7669008, -0.18195944, 0.21291047, 0.49549788, -0.04361018, 0.6138144)); + conv2d_8_tf += mul(ni1, min16float4x4(-0.24335642, -0.023037815, -0.22853605, -0.49450716, 0.04834612, 0.040727314, 0.36239302, -0.076259434, -0.08173315, 0.14689375, 0.3357786, 0.34003472, -0.11701219, -0.35594055, 0.55640507, 0.3573448)); + conv2d_8_tf += mul(na2, min16float4x4(0.039600838, -0.08580259, -0.25375724, -0.41294497, 0.052295998, 0.34286344, 0.23627926, 0.08080187, 0.0015981429, 0.37459275, -0.11763548, 0.027264152, 0.11372706, 0.34742436, 0.30963847, -0.2995273)); + conv2d_8_tf += mul(nb2, min16float4x4(-0.035936117, -0.42153218, -0.40176156, 0.20363232, 0.22382015, 0.48679677, 0.07365761, -0.20890754, 0.22791456, -0.28418672, -0.17189962, 0.0968373, -0.70834696, -0.41918173, -0.13482817, 0.037949625)); + conv2d_8_tf += mul(nc2, min16float4x4(0.11910686, 0.0473921, 0.37869528, 0.17928337, 0.17311068, 0.21572089, 0.34996882, -0.26002827, -0.014036688, -0.6574892, -0.14409806, -0.06467717, -0.33688435, -0.18185017, 0.04036214, 0.06086553)); + conv2d_8_tf += mul(nd2, min16float4x4(-0.15657301, -0.05661294, -0.36640826, -0.13215317, 0.060342815, 0.19098124, 0.18715985, -0.40765548, 0.090474375, -0.07720432, -0.016231487, 0.0885778, 0.0272616, 0.22065723, 0.1691866, -0.19491237)); + conv2d_8_tf += mul(ne2, min16float4x4(-0.13054666, 0.3278881, -1.3170725, -0.4575742, -0.061401486, 0.15868792, 0.2789515, 0.13829961, 0.09607008, -0.7175924, 0.01804374, 0.41284522, 0.044577077, 0.04847126, -0.25607756, -0.02249741)); + conv2d_8_tf += mul(nf2, min16float4x4(0.22145797, 0.8114419, -0.17527157, 0.09274125, -0.25224185, 0.2955128, -0.37553602, -0.17377761, -0.9684024, 0.42457148, -0.64265996, 0.10394252, -0.11231096, 0.064703405, 0.42858216, -0.21214609)); + conv2d_8_tf += mul(ng2, min16float4x4(0.1910386, -0.0065560606, 0.18119961, -0.026436953, 0.07887997, 0.15127628, -0.11523928, -0.0679343, 0.031198656, 0.16947536, 0.05943052, 0.060350783, 0.32215032, -0.1347014, 0.017390233, -0.06527528)); + conv2d_8_tf += mul(nh2, min16float4x4(-0.19811153, -0.033103824, 0.0053317053, 0.008003428, -0.020805335, 0.17872533, -0.3161484, -0.11559199, -0.24902378, -0.2596549, 0.034520704, -0.006125487, 0.13173361, -0.10967251, -0.7860965, -0.035326626)); + conv2d_8_tf += mul(ni2, min16float4x4(-0.124631934, 0.21335506, 0.375809, -0.13598146, 0.047685858, 0.14553228, -0.068173625, -0.117949426, 0.07296198, 0.08935096, -0.26368606, 0.29653412, -0.27378097, 0.060699224, -0.09753418, -0.08484599)); + conv2d_8_tf += min16float4(-0.009278051, 0.62221414, 0.22868732, 0.14880095); + min16float4 nconv2d_8_tf = max(-conv2d_8_tf, 0); + conv2d_8_tf = max(conv2d_8_tf, 0); + + min16float4 conv2d_7_tf = mul(a1, min16float4x4(0.018128054, -0.14104486, -0.027475944, 0.22669935, -2.7264505e-05, 0.14775783, 0.13441783, 0.11450963, -0.09942102, 0.29735768, 0.04839269, -0.14066552, -0.024448555, 0.3104163, -0.03636913, 0.002947356)); + conv2d_7_tf += mul(b1, min16float4x4(-0.20438337, 0.35419708, 0.037506625, 0.100693576, -0.074241616, -0.15304284, 0.0054191337, -0.12816934, 0.028913809, -0.098240785, 0.5653599, -0.38662913, 0.018716848, 0.0021957273, 0.061397206, -0.111899704)); + conv2d_7_tf += mul(c1, min16float4x4(-0.18681246, -0.23609419, 0.21475013, 0.051762715, 0.04889926, -0.033886652, 0.26262638, -0.27322114, 0.049140245, 0.3380464, -0.13617653, -0.05796957, 0.080669545, 0.21348572, -0.10067047, -0.0016244814)); + conv2d_7_tf += mul(d1, min16float4x4(0.025566151, -0.027286734, -0.10856872, 0.108885765, -0.07635088, 0.13037659, 0.2892404, -0.2160093, -0.30649704, 0.34650138, -0.021391464, 0.08717436, -0.02000013, 0.027722841, 0.43060175, -0.04844848)); + conv2d_7_tf += mul(e1, min16float4x4(0.09925131, -0.11167345, -0.14262813, -0.21267861, -0.15972298, -0.1823657, -0.073309824, 0.15542479, 0.005081145, -0.40594074, 0.24862696, 0.19943975, -0.36283687, -0.38990027, 0.4759463, 0.45561194)); + conv2d_7_tf += mul(f1, min16float4x4(-0.13126811, 0.24284562, 0.06109369, -0.15402594, 0.016967572, -0.08234942, -0.053873185, 0.026438333, 0.13412815, -0.10839792, -0.345438, 0.0720746, 0.21260333, -0.15989558, -0.012461376, 0.20363508)); + conv2d_7_tf += mul(g1, min16float4x4(0.09231617, 0.17787862, 0.22783166, 0.09095521, -0.0935426, -0.22921127, 0.2591894, -0.19451278, -0.0046325484, -0.60839254, 0.061737422, -0.024267042, -0.04048761, 0.2450175, 0.14390652, 0.07999217)); + conv2d_7_tf += mul(h1, min16float4x4(-0.09204067, -0.05434134, 0.32136026, -0.053413626, 0.044170942, 0.10284346, 0.10827547, -0.03207593, -0.036979157, -0.37019014, -0.07072617, 0.07745549, 0.026007036, 0.13402742, 0.22873925, -0.09879518)); + conv2d_7_tf += mul(i1, min16float4x4(-0.039409183, -0.15304323, 0.110744946, 0.04479048, 0.073402554, -0.31955537, 0.13518381, 0.09020946, 0.21437532, -0.08866372, 0.062359575, -0.08147204, -0.012339588, 0.038986444, -0.059496317, 0.04353628)); + conv2d_7_tf += mul(a2, min16float4x4(-0.029447578, 0.18052183, 0.026130654, -0.18024941, -0.2357611, 0.92272073, -0.40873498, 0.3829195, -0.049990416, -0.2626007, 0.07313907, -0.20231684, 0.23846717, 0.06304234, -0.072538964, 0.34895507)); + conv2d_7_tf += mul(b2, min16float4x4(-0.21427542, 0.33398184, 0.19135003, -0.079177245, -0.047564022, 0.25006044, 0.19287021, -0.07119212, -0.0064072064, 0.14020945, -0.15136649, -0.04587045, -0.113710366, 0.05126853, -0.084781885, 0.1418395)); + conv2d_7_tf += mul(c2, min16float4x4(0.04655672, -0.010115347, 0.18253572, 0.017085062, -0.04543099, 0.08404545, 0.07929449, 0.17069206, -0.045596916, 0.12133366, 0.12615037, -0.11942128, -0.07431312, -0.0975234, 0.17188828, -0.021951154)); + conv2d_7_tf += mul(d2, min16float4x4(0.013333504, -0.22424631, -0.25461286, -0.09366057, -0.24168679, -0.1413706, -0.084172204, 0.1557298, 0.023721283, 0.18159337, -0.029377997, -0.12690134, -0.07779016, 0.49728185, 0.060146395, 0.17318316)); + conv2d_7_tf += mul(e2, min16float4x4(0.08302447, 0.86936367, -0.17584775, -0.2508983, 0.16770333, 0.106514744, 0.056097895, -0.1516464, -0.04237734, 0.3350473, 0.08797126, 0.053822745, 0.36157215, -0.04365805, -0.20060433, -0.23983552)); + conv2d_7_tf += mul(f2, min16float4x4(0.09215062, 0.0729301, 0.2564446, -0.09456067, -0.04279617, 0.009632537, -0.067693666, 0.07115211, -0.58410543, 0.7954688, -0.6856004, -0.0039867237, 0.05259691, -0.19899113, 0.34015554, -0.1301164)); + conv2d_7_tf += mul(g2, min16float4x4(-0.08229732, 0.22852908, -0.17944984, -0.053203765, 0.01401186, -0.01731911, -0.017196467, 0.017660033, -0.06473575, 0.11841842, -0.09651762, 0.08812678, 0.15789783, 0.41068667, -0.17433365, 0.112683386)); + conv2d_7_tf += mul(h2, min16float4x4(0.19192256, -0.048173536, -0.27452058, -0.086614236, 0.03459962, -0.076093, -0.13129567, 0.10529364, -0.003243667, -0.11558274, 0.15014142, -0.11415493, -0.058378108, -0.23308878, 0.016655494, -0.06092205)); + conv2d_7_tf += mul(i2, min16float4x4(0.053656723, -0.2520498, -0.06450468, 0.14063323, -0.07785553, 0.06996582, 0.043691944, -0.09447727, -0.19854756, 0.08710172, 0.103271045, -0.20072943, -0.10393605, -0.19852036, -0.01656043, 0.19936512)); + conv2d_7_tf += mul(na1, min16float4x4(-0.043692272, -0.15573448, -0.07609012, -0.25906095, 0.042468645, 0.06499704, 0.021691361, -0.14418614, 0.007778065, -0.04098781, 0.16854198, 0.1880123, -0.0024735837, -0.38171276, 0.29813913, -0.13975172)); + conv2d_7_tf += mul(nb1, min16float4x4(0.0786739, -0.13743922, -0.16762766, 0.0551441, -0.16237186, 0.47069517, -0.16434868, 0.38760075, 0.29262593, 0.21078295, 0.1564407, -0.19921672, -0.07819381, 0.045407712, 0.25388238, 0.12049804)); + conv2d_7_tf += mul(nc1, min16float4x4(0.13686253, 0.15139718, -0.14193471, -0.037212268, 0.017021572, -0.13029522, -0.07875422, 0.22883393, -0.117323294, -0.11999564, 0.074406326, 0.029792523, 0.071242705, 0.04940517, 0.27540857, 0.094216466)); + conv2d_7_tf += mul(nd1, min16float4x4(0.05651692, -0.09319446, -0.15223487, -0.16004439, 0.09602424, 0.114855476, 0.13851804, 0.11632249, -0.15697844, -0.03465572, -0.6334014, 0.0043645306, -0.13810518, -0.24692737, -0.13962403, -0.17288178)); + conv2d_7_tf += mul(ne1, min16float4x4(-0.1125169, 0.2582768, 0.14571975, 0.3412717, 0.046649273, 0.053606547, -0.5402628, -0.14801335, -0.12299524, 0.79026186, -0.3587726, -0.040698707, 0.18239951, 0.18461016, -0.13213885, -0.6929199)); + conv2d_7_tf += mul(nf1, min16float4x4(-0.009360833, 0.22758053, -0.334423, 0.35250792, 0.05025162, -0.1640276, 0.21909785, -0.12123492, -0.33830088, -0.26451996, 0.09280175, -0.18673559, -0.20446195, 0.13918248, 0.09164517, -0.20213476)); + conv2d_7_tf += mul(ng1, min16float4x4(-0.03443797, -0.25032473, -0.0018426777, -0.065064386, 0.03455914, 0.022166712, -0.2954429, 0.012212829, -0.0223488, 0.1161553, -0.106024936, 0.028343895, 0.15230536, -0.5538007, -0.24089493, 0.06740007)); + conv2d_7_tf += mul(nh1, min16float4x4(0.09501347, -0.0845406, -0.13952151, 0.031915456, 0.05118853, -0.25089842, -0.113984115, 0.08745874, 0.14493734, 0.17449388, 0.037183553, 0.060414817, 0.045083977, -0.50209135, -0.25451177, 0.23309624)); + conv2d_7_tf += mul(ni1, min16float4x4(0.08991499, 0.14019197, -0.12056033, -0.05024532, -0.07585356, 0.073596515, 0.017992107, -0.0009288775, -0.17292187, 0.07525249, 0.14620323, -0.058494095, 0.09669742, -0.28342497, 0.10102461, 0.0075472025)); + conv2d_7_tf += mul(na2, min16float4x4(-0.059322756, 0.07296391, -0.22688308, 0.17183779, 0.0921908, -0.18311407, -0.10553935, -0.2998603, -0.05373476, -0.08882287, 0.009316159, -0.09303765, 0.08415284, -0.044707574, 0.07481887, 0.06931905)); + conv2d_7_tf += mul(nb2, min16float4x4(-0.26374707, 0.17429374, -0.54841083, 0.23039351, 0.1550329, -0.0991982, -0.07031106, -0.23306605, -0.076208115, 0.058818877, 0.48602778, -0.116065495, 0.13632986, 0.5399192, -0.088733315, -0.04031161)); + conv2d_7_tf += mul(nc2, min16float4x4(-0.118198454, -0.04607605, -0.10619185, 0.034395956, 0.0023600461, 0.1470174, -0.21100855, -0.024570175, -0.0016899678, 0.1612513, -0.03985272, 0.01355469, 0.30949214, -0.056687307, 0.1295898, 0.031099077)); + conv2d_7_tf += mul(nd2, min16float4x4(-0.37869355, 0.06961967, 0.2779311, 0.3090361, 0.23564096, -0.014765556, -0.097406775, -0.08233581, -0.05444356, -0.056364074, -0.13940345, -0.1710778, 0.053456437, -0.5668305, -0.21371025, -0.11354647)); + conv2d_7_tf += mul(ne2, min16float4x4(-0.2009931, -0.46823156, 0.04674297, -0.33720648, -0.48212242, -0.022402052, 0.4083246, 0.3498801, -0.12801081, 0.080993176, 0.12559398, 0.30281347, -0.36876208, -0.19425368, 0.040795308, 0.4358033)); + conv2d_7_tf += mul(nf2, min16float4x4(-0.008429336, -0.007929484, -0.21348138, 0.19799937, -0.0032136212, -0.037011284, 0.060586747, -0.012355498, 0.37488303, -0.626778, 0.45391387, -0.030982537, 0.26613617, -0.027296683, -0.094556324, 0.03054091)); + conv2d_7_tf += mul(ng2, min16float4x4(-0.0032568173, -0.3056237, 0.0007252052, 0.052250773, -0.05099108, 0.23182255, -0.044636346, 0.08786388, -0.12470104, -0.16238213, 0.16018245, -0.11313074, -0.044513255, -0.2792024, 0.13793966, -0.20955163)); + conv2d_7_tf += mul(nh2, min16float4x4(-0.14750522, -0.022307748, -0.15649515, 0.15537989, -0.061475005, 0.19822353, 0.0671258, -0.06628393, -0.04068137, 0.22010179, 0.12955783, -0.0517817, 0.02655539, 0.17269138, -0.1296634, 0.030146338)); + conv2d_7_tf += mul(ni2, min16float4x4(0.061146796, 0.31339607, 0.034430694, 0.10376425, 0.03029668, -0.0401898, -0.1825413, 0.06257798, 0.08390942, -0.31551626, 0.010347497, -0.0031549276, 0.21435012, -0.13221692, -0.021980911, -0.1482502)); + conv2d_7_tf += min16float4(0.039428633, 0.032666046, 0.16482623, -0.016402772); + tex7[gxy] = conv2d_7_tf; + min16float4 nconv2d_7_tf = max(-conv2d_7_tf, 0); + conv2d_7_tf = max(conv2d_7_tf, 0); + + min16float4 target = mul(e1, min16float4x4(0.13591515, 0.21395922, 0.040862843, 0.3054825, -0.088837944, -0.6928339, -0.15643471, 0.13081591, 0.07604966, 0.37446347, -0.34723157, -0.17870799, -0.2037286, -0.106576756, 0.25523958, -0.13762575)); + target += mul(e2, min16float4x4(0.21503459, 0.0373132, -0.008046219, -0.18440363, -0.09729587, 0.043958187, 0.23459528, -0.044009138, 0.1686642, -0.1615934, -0.13173419, -0.079085656, -0.07647595, -0.37286422, -0.06148421, 0.015342882)); + target += mul(ne1, min16float4x4(-0.14785692, -0.2707874, -0.017647093, -0.2908642, 0.5612585, 0.4271698, -0.48191005, 0.11905855, -0.21741737, -0.2821245, 0.29278705, -0.20538986, 0.03150152, 0.03138199, 0.10423793, -0.045527548)); + target += mul(ne2, min16float4x4(0.31277063, 0.07915742, -0.34087706, 0.39680582, -0.022496004, -0.33672526, -0.111507386, 0.025953399, -0.15757395, 0.11465282, 0.28329894, 0.12420795, -0.36261007, 0.46334505, 0.30303243, -0.03249052)); + target += mul(conv2d_8_tf, min16float4x4(0.57927984, 0.06878386, -0.24236098, 0.31338137, 0.10464923, -0.07153124, 0.13588428, -0.02373762, -0.19124955, -0.1138502, 0.17388438, 0.01707623, -0.24228282, 0.04736911, 0.6398566, -0.32334659)); + target += mul(nconv2d_8_tf, min16float4x4(-0.54402775, -0.24674532, 0.11212342, -0.09593871, -0.17339998, 0.1323692, -0.1680261, 0.025882099, -0.19121705, 0.1832492, -0.08548955, -0.14068407, 0.13255714, 0.10409962, -0.01394588, 0.22216345)); + target += mul(conv2d_1_tf, min16float4x4(0.2702694, -0.56255573, -0.5357781, 0.05541389, 0.070275396, -0.08012564, -0.13473864, -0.113696516, 0.06642909, 0.23810093, 0.0728827, -0.17656006, 0.48172018, -0.25749484, -0.1752313, 0.33768335)); + target += mul(nconv2d_1_tf, min16float4x4(0.46950498, 0.059317388, -0.09860531, -0.006304164, -0.4128484, -0.049649406, 0.2954393, -0.190237, -0.20938443, 0.034176145, 0.063109055, 0.07802573, -0.20652357, -0.23180202, -0.11936575, 0.2589604)); + target += mul(conv2d_4_tf, min16float4x4(0.3843954, -0.08686217, 0.18839231, 0.01876761, -0.03335079, -0.12043262, -0.42323095, -0.02321388, -0.22252762, -0.049455926, 0.2268798, 0.082169, 0.2473631, 0.23347862, 0.002254042, 0.2757807)); + target += mul(nconv2d_4_tf, min16float4x4(0.1020188, -0.037612554, -0.33062017, 0.1570476, 0.19851524, 0.35976177, -0.016449552, 0.22057539, 0.20401593, 0.07004227, -0.062413715, -0.10547836, 0.14671406, -0.3905135, -0.038352408, -0.28926837)); + target += mul(conv2d_7_tf, min16float4x4(0.4110517, 0.06280497, 0.16709873, -0.49500167, -0.10045096, -0.2238529, 0.012172345, 0.19666891, -0.16135901, 0.017100533, 0.35809904, 0.35188627, 0.20347194, -0.14602524, 0.71737736, 0.14195462)); + target += mul(nconv2d_7_tf, min16float4x4(-0.5236819, 0.4352016, -0.4066126, -0.04252335, 0.1086945, 0.145471, 0.21984594, -0.24670586, -0.07109616, -0.2711473, -0.89353126, -0.3953869, 0.17096898, 0.12978637, -0.42527854, -0.019720567)); + target += min16float4(-0.027689768, -0.16386859, -0.009289161, 0.09287236); + tex4[gxy] = target; + + target = mul(e1, min16float4x4(0.19380243, 0.020101497, 0.021015864, 0.40521726, 0.038862754, -0.3473658, 0.22289194, -0.2075226, -0.15960178, 0.20686232, -0.19066268, -0.24524036, -0.19289994, -0.6356018, 0.040245753, -0.22887161)); + target += mul(e2, min16float4x4(-0.06837712, -0.59243137, 0.08107887, -0.18099897, 0.08890105, -0.20113088, 0.0076543097, -0.28404838, -0.39403212, 0.124420464, 0.07661543, -0.16511264, 0.440653, 0.17841326, -0.40957427, -0.055862557)); + target += mul(ne1, min16float4x4(-0.052128255, -0.17906874, -0.0063690864, -0.3027001, -0.12118662, 0.5986499, -0.35075194, 0.11334461, -0.13089949, 0.48732534, 0.31238684, 0.0636065, 0.21470545, -0.12680373, 0.20702313, -0.14277203)); + target += mul(ne2, min16float4x4(-0.13521394, 0.5266374, -0.4765612, 0.32102558, -0.07704129, -0.26604977, 0.36475307, 0.27245706, 0.16729634, -0.04975267, 0.18763311, 0.07594951, -0.20137721, 0.07614109, -0.056586545, 0.35838535)); + target += mul(conv2d_8_tf, min16float4x4(0.22150421, -0.023909386, -0.30742592, 0.54860467, 0.038963366, -0.47929683, 0.001491465, -0.2016597, 0.14891255, -0.12298715, 0.12770613, 0.16882578, 0.52988553, -0.34417477, -0.11196754, 0.038432673)); + target += mul(nconv2d_8_tf, min16float4x4(0.10892675, 0.15687913, 0.4061297, -0.2549851, -0.12231971, 0.7066191, -0.038577385, 0.1871752, -0.23520122, 0.6384404, -0.04857454, -0.23879313, -0.26810166, -0.08090798, 0.3287431, 0.15214305)); + target += mul(conv2d_1_tf, min16float4x4(0.16076286, 0.08942198, 0.79264593, -0.5107746, -0.10051664, -0.18325275, 0.31161344, 0.023725776, 0.09911152, 0.1552438, -0.22447744, -0.2995641, 0.27984253, -1.107023, 0.010454479, 0.6606262)); + target += mul(nconv2d_1_tf, min16float4x4(0.041668475, 0.16935597, -0.11855577, 0.2013473, 0.2991738, -0.38238418, 0.17906274, -0.27559698, -0.4381387, 0.39814267, -0.40905684, 0.57992136, 0.2830281, 0.12482517, -0.30402762, 0.47808015)); + target += mul(conv2d_4_tf, min16float4x4(0.05201121, 0.3396993, -0.04965309, -0.25744373, -0.13495848, -0.120026626, 0.15645088, -0.20658544, 0.414069, -0.03110071, 0.070210315, 0.028046172, -0.17324251, 0.14329922, -0.14353131, 0.028436944)); + target += mul(nconv2d_4_tf, min16float4x4(-0.15607943, 0.98266315, -0.15506491, 0.34884667, -0.16584046, 0.07532187, 0.0062847883, 0.8719761, -0.30521882, -0.34961814, -0.055313803, 0.041199762, 0.2634066, 0.31106153, 0.029962108, -0.017541675)); + target += mul(conv2d_7_tf, min16float4x4(0.1285044, 0.41011113, 0.16163284, -0.40202442, 0.33554438, -0.2626098, 0.18437132, 0.06627138, 0.26390168, -0.23918642, -0.17191365, -0.16348109, 0.30074367, -0.99079835, 0.60264456, 0.050881945)); + target += mul(nconv2d_7_tf, min16float4x4(0.3971443, -0.034655187, 0.11870823, 0.39984652, -0.45068088, -0.054210827, -0.27554438, -0.16074227, -0.14983663, 0.35434055, 0.42479035, 0.07799301, -0.4260275, 0.66214204, -0.095251344, 0.09080398)); + target += min16float4(-0.012729538, -0.13335368, 0.14840336, 0.025965473); + tex5[gxy] = target; +} + + +//!PASS 5 +//!DESC Conv-4x3x3x16, Conv-4x1x1x56 +//!IN tex4, tex5, tex3, tex6, tex7 +//!OUT tex8, tex9, tex1, tex2 +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 + +void Pass5(uint2 blockStart, uint3 threadId) { + uint2 gxy = Rmp8x8(threadId.x) + blockStart; + uint2 inputSize = GetInputSize(); + if (gxy.x >= inputSize.x || gxy.y >= inputSize.y) { + return; + } + + float2 inputPt = GetInputPt(); + float2 pos = (gxy + 0.5f) * inputPt; + + // [ a, d, g ] + // [ b, e, h ] + // [ c, f, i ] + min16float4 a1 = tex4.SampleLevel(sam, pos - inputPt, 0); + min16float4 b1 = tex4.SampleLevel(sam, pos + float2(-inputPt.x, 0), 0); + min16float4 c1 = tex4.SampleLevel(sam, pos + float2(-inputPt.x, inputPt.y), 0); + min16float4 d1 = tex4.SampleLevel(sam, pos + float2(0, -inputPt.y), 0); + min16float4 e1 = tex4.SampleLevel(sam, pos, 0); + min16float4 f1 = tex4.SampleLevel(sam, pos + float2(0, inputPt.y), 0); + min16float4 g1 = tex4.SampleLevel(sam, pos + float2(inputPt.x, -inputPt.y), 0); + min16float4 h1 = tex4.SampleLevel(sam, pos + float2(inputPt.x, 0), 0); + min16float4 i1 = tex4.SampleLevel(sam, pos + inputPt, 0); + + min16float4 na1 = max(-a1, 0); + min16float4 nb1 = max(-b1, 0); + min16float4 nc1 = max(-c1, 0); + min16float4 nd1 = max(-d1, 0); + min16float4 ne1 = max(-e1, 0); + min16float4 nf1 = max(-f1, 0); + min16float4 ng1 = max(-g1, 0); + min16float4 nh1 = max(-h1, 0); + min16float4 ni1 = max(-i1, 0); + + a1 = max(a1, 0); + b1 = max(b1, 0); + c1 = max(c1, 0); + d1 = max(d1, 0); + e1 = max(e1, 0); + f1 = max(f1, 0); + g1 = max(g1, 0); + h1 = max(h1, 0); + i1 = max(i1, 0); + + min16float4 a2 = tex5.SampleLevel(sam, pos - inputPt, 0); + min16float4 b2 = tex5.SampleLevel(sam, pos + float2(-inputPt.x, 0), 0); + min16float4 c2 = tex5.SampleLevel(sam, pos + float2(-inputPt.x, inputPt.y), 0); + min16float4 d2 = tex5.SampleLevel(sam, pos + float2(0, -inputPt.y), 0); + min16float4 e2 = tex5.SampleLevel(sam, pos, 0); + min16float4 f2 = tex5.SampleLevel(sam, pos + float2(0, inputPt.y), 0); + min16float4 g2 = tex5.SampleLevel(sam, pos + float2(inputPt.x, -inputPt.y), 0); + min16float4 h2 = tex5.SampleLevel(sam, pos + float2(inputPt.x, 0), 0); + min16float4 i2 = tex5.SampleLevel(sam, pos + inputPt, 0); + + min16float4 na2 = max(-a2, 0); + min16float4 nb2 = max(-b2, 0); + min16float4 nc2 = max(-c2, 0); + min16float4 nd2 = max(-d2, 0); + min16float4 ne2 = max(-e2, 0); + min16float4 nf2 = max(-f2, 0); + min16float4 ng2 = max(-g2, 0); + min16float4 nh2 = max(-h2, 0); + min16float4 ni2 = max(-i2, 0); + + a2 = max(a2, 0); + b2 = max(b2, 0); + c2 = max(c2, 0); + d2 = max(d2, 0); + e2 = max(e2, 0); + f2 = max(f2, 0); + g2 = max(g2, 0); + h2 = max(h2, 0); + i2 = max(i2, 0); + + min16float4 conv2d_1_tf = tex3.SampleLevel(sam, pos, 0); + min16float4 nconv2d_1_tf = max(-conv2d_1_tf, 0); + conv2d_1_tf = max(conv2d_1_tf, 0); + + min16float4 conv2d_4_tf = tex6.SampleLevel(sam, pos, 0); + min16float4 nconv2d_4_tf = max(-conv2d_4_tf, 0); + conv2d_4_tf = max(conv2d_4_tf, 0); + + min16float4 conv2d_7_tf = tex7.SampleLevel(sam, pos, 0); + min16float4 nconv2d_7_tf = max(-conv2d_7_tf, 0); + conv2d_7_tf = max(conv2d_7_tf, 0); + + min16float4 conv2d_11_tf = mul(a1, min16float4x4(-0.22341304, 0.26908797, 0.04134543, 0.06961319, 0.32176727, 0.07702703, 0.03751845, -0.13761088, -0.09979559, 0.06891045, -0.01716057, -0.031486046, -0.016294012, 0.0262252, 0.012725462, -0.054174248)); + conv2d_11_tf += mul(b1, min16float4x4(0.0758998, 0.044578414, -0.058127478, -0.04941571, 0.1685694, 0.9547572, 0.3217995, 0.04913146, 0.08628588, -0.49687696, 0.05530926, -0.19010891, 0.0077229803, 0.3938303, 0.18076055, -0.048131783)); + conv2d_11_tf += mul(c1, min16float4x4(0.03656385, 0.23112705, 0.13059878, 0.16223684, -0.2766845, 0.053392846, 0.06446786, 0.19696166, -0.14884388, -0.23103243, -0.07006061, -0.021727445, 0.026394684, -0.31138313, -0.0976933, -0.062459927)); + conv2d_11_tf += mul(d1, min16float4x4(-0.36985022, -0.3396681, 0.035750575, 0.019713784, 0.10074354, -0.34114882, -0.01150834, -0.1436701, -0.36870074, -0.3272402, -0.03879516, -0.094077155, 0.016875539, 0.23895474, -0.14396004, -0.06785279)); + conv2d_11_tf += mul(e1, min16float4x4(0.057131216, -0.5966212, -0.13011967, -0.3684052, 0.6414469, 0.45823926, 0.043126952, -0.12702179, 0.029217511, 0.43957123, 0.06747733, 0.35508418, -0.13576074, 0.28117993, 0.1785782, 0.20060769)); + conv2d_11_tf += mul(f1, min16float4x4(0.112133466, 0.2773932, -0.047416527, -0.06561597, 0.093935706, 0.032524325, 0.02208551, 0.10400939, -0.0062363064, 0.20578235, 0.124429, 0.045867924, 0.024913216, -0.07508951, -0.1506746, -0.07368737)); + conv2d_11_tf += mul(g1, min16float4x4(0.029188056, 0.13675697, -0.10047892, -0.15162368, 0.11152231, 0.17758776, 0.04638467, -0.15375991, -0.08195171, -0.00092798605, -0.11137887, -0.20476487, -0.06701632, -0.38742077, 0.10833869, 0.07575963)); + conv2d_11_tf += mul(h1, min16float4x4(0.12579612, -0.13082299, 0.022704111, -0.049295194, 0.02813974, 0.06766161, 0.021488592, -0.22899324, -0.13967377, -0.42789128, -0.15561862, -0.13880157, -0.31957027, -0.051553562, -0.15501565, -0.17607704)); + conv2d_11_tf += mul(i1, min16float4x4(-0.014785312, -0.3358245, 0.09859993, 0.17852743, 0.06758491, 0.040827237, -0.014897847, -0.027630018, -0.041637477, -0.10967412, -0.10507281, 0.058183335, -0.01929858, 0.09047934, -0.19679205, -0.16896065)); + conv2d_11_tf += mul(a2, min16float4x4(-0.19059956, 0.059083544, -0.07367043, 0.10374235, -0.12928921, 0.16821185, 0.03542259, 0.07853399, -0.029948441, 0.045060057, 0.10522493, 0.15548709, 0.13417992, 0.12784965, 0.068737574, 0.024369959)); + conv2d_11_tf += mul(b2, min16float4x4(-0.2539489, -0.15361321, -0.024794202, 0.23387837, -0.021986792, 0.035640705, -0.053465687, 0.041275553, -0.12349385, 0.11599216, -0.12158652, -0.0016647653, 0.03552641, 0.15126309, 0.10521408, 0.022221778)); + conv2d_11_tf += mul(c2, min16float4x4(-0.09391041, 0.21640098, 0.06468435, 0.021124857, -0.017427467, 0.14731239, 0.0888631, 0.06669842, 0.16802992, -0.042000934, -0.007442969, -0.17762569, -0.106376246, -0.007006815, 0.048836768, 0.07634349)); + conv2d_11_tf += mul(d2, min16float4x4(-0.08242374, -0.35055616, 0.11752318, 0.06287576, -0.08078838, 0.015269983, 0.07802465, 0.036515962, -0.047435157, -0.23535018, 0.10882656, 0.00760307, 0.20816213, 0.16291322, -0.17480974, -0.09656055)); + conv2d_11_tf += mul(e2, min16float4x4(0.3776239, 0.48836887, 0.046571143, -0.0005301381, 0.111404456, -0.2056147, 0.0976322, -0.07087254, -0.23208277, 0.64508325, 0.029519977, -0.32163903, 0.12203931, 1.2488136, 0.0713469, -0.12589021)); + conv2d_11_tf += mul(f2, min16float4x4(-0.1458724, -0.2927259, -0.11825573, 0.050236594, 0.005908592, 0.009147886, 0.014676971, -0.09960781, -0.031219782, 0.0008116867, -0.16999915, -0.08393424, -0.017762119, 0.15271363, 0.17894958, 0.104973435)); + conv2d_11_tf += mul(g2, min16float4x4(0.15102111, -0.017580042, -0.009878415, 0.09603493, -0.14158034, 0.01766169, 0.026301328, 0.14016923, 0.07513633, 0.12250821, 0.14139763, 0.119470306, 0.056335848, 0.011718554, -0.051952817, -0.1087701)); + conv2d_11_tf += mul(h2, min16float4x4(0.12267096, 0.22258927, -0.23374331, -0.336529, -0.03149633, -0.26095635, 0.00365308, 0.048830956, 0.035902984, -0.04686918, -0.08079191, -0.17013429, 0.0254567, -0.05592242, 0.0968047, 0.07426071)); + conv2d_11_tf += mul(i2, min16float4x4(-0.16953564, 0.074455656, 0.0029755495, 0.20576377, -0.050961535, 0.060958825, 0.014226229, 0.104992926, 0.06942283, 0.29077423, 0.040234245, 0.12337425, -0.012045997, -0.11109262, 0.020255094, 0.08945579)); + conv2d_11_tf += mul(na1, min16float4x4(0.2978639, -0.24613461, -0.083074145, -0.2367985, -0.13995647, -0.21201506, -0.16809967, -0.08163256, 0.22451796, -0.21319884, 0.097241744, 0.17276905, 0.059754357, -0.21800114, 0.016986718, 0.059852242)); + conv2d_11_tf += mul(nb1, min16float4x4(0.10399378, 0.016165858, 0.006949626, -0.00957426, -0.07206657, 0.85400176, -0.069736175, 0.11563255, -0.15550873, 0.21035826, -0.09730208, 0.21803263, -0.029731166, 0.07174115, -0.075019605, 0.06605764)); + conv2d_11_tf += mul(nc1, min16float4x4(0.008660154, -0.1689362, -0.13275097, -0.14157207, -0.06571528, 0.2641335, 0.17738026, 0.016201235, -0.058384545, -0.089386165, -0.10691102, 0.03380599, 0.07696467, 0.010921241, -0.05858657, 0.044599395)); + conv2d_11_tf += mul(nd1, min16float4x4(0.29438433, 0.39757052, -0.12448894, -0.14726874, 0.054101802, 0.19893955, 0.0081761405, -0.030686913, -0.09465847, -0.09517581, 0.0046200817, 0.2743172, 0.18768987, 0.2577441, 0.3185588, -0.0043636197)); + conv2d_11_tf += mul(ne1, min16float4x4(0.30364004, 0.45719072, -0.002478791, -0.25550374, 0.044718135, 0.9974692, 0.27661783, 0.38724384, 0.20643012, -0.36335453, 0.04044719, -0.15773767, 0.019318745, -0.015368104, -0.13033883, -0.21446472)); + conv2d_11_tf += mul(nf1, min16float4x4(0.17225221, -0.2870429, -0.11031537, -0.20985241, -0.1813215, 0.47034717, 0.19177493, 0.1565604, -0.22090979, -0.1778559, -0.15998572, 0.20591277, -0.27751637, -0.17734572, -0.22385214, 0.2001247)); + conv2d_11_tf += mul(ng1, min16float4x4(0.09103924, 0.012440279, -0.11811386, -0.28955194, -0.024203198, -0.014690502, -0.041423846, 0.0062359073, 0.06732812, -0.040848043, -0.0807372, -0.06598595, -0.020464217, 0.35617942, 0.054869782, -0.06990699)); + conv2d_11_tf += mul(nh1, min16float4x4(-0.22022852, -0.30250633, -0.008539953, -0.17535509, 0.048545327, -0.06961757, 0.1520779, 0.15551318, 0.145789, 0.41386685, 0.19608185, 0.02285933, 0.19650589, 0.1140758, 0.058065582, 0.06438903)); + conv2d_11_tf += mul(ni1, min16float4x4(0.17500387, 0.009752107, -0.08735754, -0.40322778, -0.04718948, -0.1520063, 0.015334469, 0.055586398, -0.06315823, 0.01381341, 0.06333497, 0.20780154, -0.14789844, 0.008873181, 0.20424104, 0.18570045)); + conv2d_11_tf += mul(na2, min16float4x4(0.17809622, -0.054737452, 0.045792647, -0.05761767, 0.1530876, -0.058534857, -0.008100565, 0.036446143, 0.27693272, 0.3004126, -0.1283306, -0.50103384, -0.3350802, 0.09919993, -0.10481551, 0.059236333)); + conv2d_11_tf += mul(nb2, min16float4x4(0.08178473, 0.01796507, 0.045470674, -0.1395204, -0.07053285, -0.15308544, -0.016434597, 0.09957456, 0.07303232, 0.5558379, 0.1058254, -0.12340164, -0.37540868, 0.20688659, 0.11254531, 0.08988308)); + conv2d_11_tf += mul(nc2, min16float4x4(-0.115479395, -0.04145597, -0.02444945, -0.0012505532, -0.016777854, -0.21254961, -0.11969028, -0.10986302, 0.34061527, 0.35168666, 0.19457188, -0.25304377, 0.089430355, -0.13593785, -0.03715568, -0.07161111)); + conv2d_11_tf += mul(nd2, min16float4x4(0.135465, 0.16024914, -0.16819438, -0.076060556, 0.14722055, -0.12402309, -0.091675736, -0.11345004, 0.3370019, 0.21161243, 0.08165217, 0.26650387, 0.11799823, 1.1248134, 0.031586587, 0.40626523)); + conv2d_11_tf += mul(ne2, min16float4x4(-0.3881156, 0.075572714, -0.2955678, -0.04820779, -0.14431494, 0.17108414, -0.031334974, 0.14272547, 0.10431918, -0.92185026, -0.550305, -0.09849551, -0.19279402, 0.47034186, 0.38574138, 0.5469418)); + conv2d_11_tf += mul(nf2, min16float4x4(0.07301299, -0.1655295, 0.0851716, 0.0349889, 0.037978686, -0.34476924, -0.09894407, -0.09279173, -0.017504893, 0.16626996, 0.23299451, -0.29538614, -0.035250418, 0.102075204, 0.014679606, 0.05283856)); + conv2d_11_tf += mul(ng2, min16float4x4(0.082496785, -0.047353677, -0.1036778, -0.014507561, 0.091381975, -0.07229443, -0.03069601, -0.07463806, 0.2173226, 0.061551273, 0.01672064, 0.065622196, 0.1645865, 0.08651663, 0.18979368, 0.2012662)); + conv2d_11_tf += mul(nh2, min16float4x4(-0.2116467, -0.26988897, -0.049475558, 0.18609211, -0.08837133, -0.219245, 0.05900789, -0.007832284, -0.028579885, 0.20587349, -0.07297767, -0.19551088, 0.052455146, -0.24630548, 0.12438646, -0.017073039)); + conv2d_11_tf += mul(ni2, min16float4x4(0.15815273, -0.13286865, -0.036927793, -0.118895106, 0.06876401, -0.08193885, -0.073907554, -0.17851423, 0.025570622, -0.05206693, 0.0054880823, -0.14550385, 0.031355973, -0.0617539, -0.09522895, 0.007602468)); + conv2d_11_tf += min16float4(0.10656278, 0.12657918, 0.16990805, -0.12699938); + tex8[gxy] = conv2d_11_tf; + min16float4 nconv2d_11_tf = max(-conv2d_11_tf, 0); + conv2d_11_tf = max(conv2d_11_tf, 0); + + min16float4 conv2d_10_tf = mul(a1, min16float4x4(-0.07384766, -0.027958225, 0.37361667, -0.082532816, 0.14156812, 0.02939518, 0.22737388, 0.19935979, -0.090212055, 0.04403584, 0.18456662, -0.026585983, 0.22868252, 0.09938934, -0.08726494, -0.115827106)); + conv2d_10_tf += mul(b1, min16float4x4(-0.09788985, -0.3116416, 0.35298944, -0.08990593, 0.16181462, -0.22193117, -0.5422943, 0.23932208, 0.15739329, -0.06103239, 0.7953177, -0.047183976, 0.21341586, 0.19858226, 0.0016054768, 0.054749873)); + conv2d_10_tf += mul(c1, min16float4x4(-0.026696216, 0.061291914, -0.35742328, 0.00082715444, 0.10632543, -0.09428293, -0.12645036, -0.043706786, 0.09915236, 0.13788143, 0.15950204, -0.089837976, 0.04461279, -0.054954246, 0.04740199, 0.07014664)); + conv2d_10_tf += mul(d1, min16float4x4(-0.12016896, 0.16669498, 0.26552972, -0.35876223, 0.045097463, -0.15016092, -0.0988156, -0.416339, -0.0101760905, 0.26459762, 0.31927487, -0.16307381, 0.12096833, -0.06770049, -0.017283063, 0.013299284)); + conv2d_10_tf += mul(e1, min16float4x4(0.15951112, 0.14506923, 0.6747884, -0.24716964, -0.3413045, -0.2017185, -0.9612693, 0.5421329, -0.16023788, 0.32216108, 0.062496744, 0.21633703, 0.004581572, 0.2359334, -0.35295007, 0.09726352)); + conv2d_10_tf += mul(f1, min16float4x4(0.13874753, -0.0063067, -0.14469895, 0.11554976, -0.019183924, -0.04544159, -0.29430693, -0.10431769, 0.15769906, 0.00601582, -0.454376, -0.11790236, 0.16000259, 0.29670846, -0.9759625, 0.31053123)); + conv2d_10_tf += mul(g1, min16float4x4(0.014491841, 0.0074491766, -0.09696308, -0.09127842, -0.03579932, -0.20163259, -0.21284793, -0.261139, 0.24359487, 0.14113441, 0.23983651, -0.16634561, -0.09547295, 0.10859189, 0.13468629, 0.33521304)); + conv2d_10_tf += mul(h1, min16float4x4(0.008276171, 0.12959969, 0.5093179, 0.002464717, 0.016199486, -0.03156574, -0.4428472, -0.10885838, -0.049632378, 0.2476587, 0.07033375, -0.20044556, 0.04982328, 0.19631135, -0.33776414, -0.6421577)); + conv2d_10_tf += mul(i1, min16float4x4(-0.04192616, 0.06393284, 0.07120974, 0.076716706, -0.09867013, -0.13239172, 0.012114291, -0.038557116, 0.029985918, 0.022090917, 0.07777519, 0.008410333, 0.0034299784, 0.062100925, -0.38884223, -0.01593217)); + conv2d_10_tf += mul(a2, min16float4x4(-0.013629574, -0.06545711, 0.14423661, -0.03981215, -0.052800525, -0.058425374, -0.05814048, -0.11337634, 0.05479856, -0.010584571, -0.22650285, 0.056241333, -0.1396656, -0.0010838923, -0.30166936, 0.040658727)); + conv2d_10_tf += mul(b2, min16float4x4(0.045267094, -0.086306006, -0.05226326, 0.1539859, -0.02723665, -0.13326567, 0.22143897, -0.018399606, 0.12181383, 0.1452545, -0.3973738, -0.10285705, -0.15147118, -0.28072536, 0.4379245, -0.06340889)); + conv2d_10_tf += mul(c2, min16float4x4(0.14590915, 0.034363795, -0.02217679, 0.15465777, -0.020056443, 0.06256286, 0.00068213895, -0.004845135, 0.10313473, 0.13895464, -0.0957288, 0.10452721, -0.06313026, -0.06739777, 0.16052145, -0.115432285)); + conv2d_10_tf += mul(d2, min16float4x4(-0.083468825, 0.15143521, 0.19880214, -0.0054416056, -0.1074472, 0.027439727, -0.16624895, -0.026701076, -0.046576414, -0.061388403, 0.34304553, -0.08921803, 0.09399348, -0.043658186, -1.3050584, -0.07285428)); + conv2d_10_tf += mul(e2, min16float4x4(-0.2544287, -0.38059148, 0.7181705, -0.44567156, 0.10387618, 0.06472145, 0.08178852, -0.016514499, -0.1630076, -0.16066378, -0.19193888, -0.24423774, -0.14821364, -0.28755048, -0.1322022, 0.25716448)); + conv2d_10_tf += mul(f2, min16float4x4(0.13228743, 0.24624044, 0.10462062, 0.26341802, 0.035913363, 0.09206641, 0.044785645, 0.010443224, 0.05206244, 0.008345797, -0.32408288, -0.2484674, -0.027154556, 0.0006338974, 0.09008037, 0.027416239)); + conv2d_10_tf += mul(g2, min16float4x4(-0.061936356, -0.07008738, -0.22344092, 0.20339371, 0.03216865, 0.103117235, 0.10232644, 0.10809929, 0.08320763, 0.058004253, -0.06520991, 0.038012277, -0.12916973, -0.1150849, -0.03713365, -0.0886423)); + conv2d_10_tf += mul(h2, min16float4x4(0.3213531, 0.1826207, 0.022152286, 0.025484305, -0.054090437, 0.08160166, 0.13491987, -0.06896833, 0.10781034, 0.08944192, -0.34036443, -0.018937334, -0.18917687, -0.13239872, 0.11581373, -0.038915917)); + conv2d_10_tf += mul(i2, min16float4x4(-0.20916902, 0.08310064, 0.19347866, 0.29880634, -0.007023385, 0.005319598, -0.06649972, 0.03248317, -0.04066817, -0.06176127, -0.41747397, 0.14132817, -0.021392342, -0.021360394, 0.101215124, -0.05375729)); + conv2d_10_tf += mul(na1, min16float4x4(-0.008702178, -0.03840238, 0.13321695, 0.065163925, -0.062342774, -0.030948557, 0.0069512874, -0.2634128, -0.09415655, 0.02985776, 0.021763485, 0.27137864, -0.21608604, -0.19126832, -0.37335086, -0.16941321)); + conv2d_10_tf += mul(nb1, min16float4x4(0.04631249, 0.33492458, -0.6266605, 0.20180638, 0.039800193, -0.14341171, -0.8203481, 0.04878081, 0.008235832, 0.15065777, -0.32971388, 0.1828355, -0.1510293, -0.17637968, 0.125366, -0.06719769)); + conv2d_10_tf += mul(nc1, min16float4x4(-0.014685718, -0.04156494, 0.2728874, -0.106735535, -0.1312142, -0.05991217, 0.15173748, -0.09276527, 0.027946949, 0.12980466, 0.017537035, 0.058945708, -0.11254791, -0.06708247, -0.28308856, -0.058375884)); + conv2d_10_tf += mul(nd1, min16float4x4(0.2220684, -0.19030218, -0.1259754, 0.09647918, -0.20530927, -0.16737363, -0.055208467, -0.067288965, 0.1428622, 0.08903465, 0.494294, 0.28669015, -0.17464463, -0.2190753, 0.13515279, 0.24887499)); + conv2d_10_tf += mul(ne1, min16float4x4(-0.24211104, -0.11129136, 0.03340221, 0.49835417, -0.11755811, -0.732711, -0.3876752, 0.6178176, 0.1437329, -0.05131951, -0.16705558, -0.3823752, -0.23198022, -0.27967533, 0.7223488, -0.5565778)); + conv2d_10_tf += mul(nf1, min16float4x4(-0.04738433, -0.14606567, 0.22317784, 0.0055712103, -0.064653076, -0.16446865, -0.10802961, -0.10179589, 0.060855757, 0.22762765, -0.037358448, 0.24772792, -0.15458576, -0.0770241, 0.43480682, 0.008342627)); + conv2d_10_tf += mul(ng1, min16float4x4(0.117756896, -0.06760757, 0.12629354, -0.13241243, -0.05329636, 0.031004142, 0.19809054, 0.1504123, -0.024029436, -0.011011192, -0.014698134, 0.12855798, 0.027526522, -0.102618076, -0.2597635, -0.23887417)); + conv2d_10_tf += mul(nh1, min16float4x4(-0.012681944, 0.088339254, 0.58977854, 0.020116867, -0.30643263, -0.11593101, 0.2829653, -0.060883448, 0.027514484, -0.19997032, -0.12530403, 0.3302542, -0.10344085, -0.0644199, -0.11374762, 0.38778695)); + conv2d_10_tf += mul(ni1, min16float4x4(0.073869206, -0.059440095, -0.016326021, -0.08571949, -0.04171866, 0.042949438, 0.13984677, -0.15829174, -0.025245706, 0.0059198164, -0.0432442, 0.20765327, -0.058762096, 0.11539401, 0.036120266, 0.24331446)); + conv2d_10_tf += mul(na2, min16float4x4(0.012567978, 0.07251118, -0.12190053, 0.10283353, 0.088345066, 0.0017397653, -0.2381744, 0.101314925, 0.022791719, -0.043069735, -0.15024713, -0.072577685, 0.19976862, -0.059844784, 0.38824072, 0.0020866133)); + conv2d_10_tf += mul(nb2, min16float4x4(0.27314463, 0.0739519, 0.08960633, 0.03709254, 0.032681584, 0.22859, -0.41635752, -0.07382896, 0.13144481, -0.24017848, 0.07981319, 0.15370876, 0.059314378, 0.29214182, -0.39464346, -0.13867916)); + conv2d_10_tf += mul(nc2, min16float4x4(-0.005685388, -0.039528795, -0.055917054, -0.06578973, 0.020702876, -0.00709528, 0.08486715, -0.0075865295, 0.05714374, -0.27417144, 0.4555885, 0.013780273, 0.05096835, 0.159233, -0.05228782, 0.15794256)); + conv2d_10_tf += mul(nd2, min16float4x4(-0.0010807351, -0.022064442, 0.13078515, 0.11357431, 0.11269685, 0.029679844, 0.14385091, 0.10241993, 0.030162932, -0.016101424, 0.20761637, 0.4683215, 0.03091817, -0.58406824, -0.3438075, 0.3653469)); + conv2d_10_tf += mul(ne2, min16float4x4(-0.016927537, 0.13944507, -0.38772225, -0.11645372, -0.1683389, -0.081295304, 0.271328, 0.14980802, 0.47266555, 0.04091753, 0.006903156, -0.00832747, -0.056511678, 0.06924621, -1.0780094, 0.1268596)); + conv2d_10_tf += mul(nf2, min16float4x4(-0.21017683, -0.077091806, 0.28906518, 0.022843512, -0.062092084, -0.017447937, 0.25115407, -0.1367289, 0.0021664056, 0.0034106125, 0.5305142, -0.029012429, -0.014483031, 0.05575314, -0.35784876, -0.09252365)); + conv2d_10_tf += mul(ng2, min16float4x4(0.008859689, 0.06481962, 0.09483335, 0.18473764, 0.0015982646, -0.06144117, 0.054042596, -0.19934553, -0.20250106, 0.096015476, 0.21697922, 0.6265738, -0.16049659, -0.33120447, 0.27775142, 0.14459921)); + conv2d_10_tf += mul(nh2, min16float4x4(-0.11195867, 0.21663944, 0.5021048, 0.04712746, 0.08637696, 0.07792573, 0.23626573, -0.075164914, 0.06574307, -0.16795279, 0.06829719, -0.027584063, -0.015064924, -0.057976205, 0.14589287, -0.15683101)); + conv2d_10_tf += mul(ni2, min16float4x4(0.07626267, -0.03523683, 0.106941625, -0.15825523, 0.032598946, 0.038718563, -0.016688785, -0.054390162, 0.05544311, 0.13933052, 0.078817375, -0.10183935, 0.041770034, 0.032732744, 0.062236354, 0.0068387473)); + conv2d_10_tf += min16float4(-0.11589812, -0.123082116, -0.003926807, -0.15363532); + tex9[gxy] = conv2d_10_tf; + min16float4 nconv2d_10_tf = max(-conv2d_10_tf, 0); + conv2d_10_tf = max(conv2d_10_tf, 0); + + min16float4 target = mul(e1, min16float4x4(-0.25229862, 0.22394362, 0.0050771693, -0.07544911, -0.11078993, -0.14940143, 0.009394699, 0.0110528935, 0.044721916, 0.26324025, -0.046336185, 0.38099283, 0.053437576, -0.07238376, -0.090147175, 0.5568665)); + target += mul(e2, min16float4x4(0.036739275, -0.2334262, 0.032853063, 0.24364692, -0.122930475, 0.1975849, -0.01315444, -0.13528247, -0.014283123, 0.057573725, 0.058717266, 0.16260214, 0.03097313, -0.11750414, -0.18610783, -0.23006414)); + target += mul(ne1, min16float4x4(0.37318927, -0.26915783, 0.035015646, 0.2676218, 0.1748369, 0.094052985, -0.11020892, -0.14514406, 0.004877109, -0.26225975, 0.13958913, -0.16787122, 0.06908459, -0.10446216, -0.028498875, -0.28281447)); + target += mul(ne2, min16float4x4(0.1980342, 0.021963626, -0.03271427, 0.28889674, 0.043385092, -0.16916741, -0.008713317, 0.00013464666, 0.0819348, 0.0152427135, -0.14862345, -0.15659885, -0.050634, 0.04153691, 0.042288564, 0.00585241)); + target += mul(conv2d_11_tf, min16float4x4(-0.17560056, 0.3521319, 0.20137301, -0.25535235, 0.030570813, 0.2411823, 0.053508975, -0.34454364, 0.22279017, -0.41471666, -0.15029109, 0.22158626, -0.08751699, -0.09357398, 0.20704596, -0.20073438)); + target += mul(nconv2d_11_tf, min16float4x4(0.15419295, 0.31318265, 0.004593545, 0.78029615, -0.16751337, -0.32214537, -0.44051525, 0.22405408, -0.0064655836, 0.36599794, -0.26032063, 0.1850997, 0.13661511, -0.49070612, -0.34533858, 0.16373816)); + target += mul(conv2d_1_tf, min16float4x4(0.09806042, 0.36764845, 0.11531638, 0.073847674, -0.16854957, -0.19408809, -0.16800502, -0.12827317, -0.5168489, 0.030958507, -0.03509507, 0.086487584, 0.01842899, -0.10123225, -0.17940263, -0.028054722)); + target += mul(nconv2d_1_tf, min16float4x4(0.21619087, -0.05322262, -0.31423846, 0.37783054, 0.20402598, 0.53124064, -0.012658878, 0.20003271, -0.17958061, -0.37326333, -0.24583863, 0.057008818, -0.13031931, -0.031875104, -0.2130229, 0.44612458)); + target += mul(conv2d_4_tf, min16float4x4(0.25865164, -0.28258085, 0.09512834, 0.054259088, 0.25939894, 0.38799945, -0.33007956, 0.6692063, -0.22719514, 0.16910313, 0.056874167, 0.016987909, -0.19956954, -0.20683451, -0.19937307, -0.41771019)); + target += mul(nconv2d_4_tf, min16float4x4(0.23592101, -0.15792374, -0.06965535, 0.30855724, -0.22757038, 0.12033792, 0.3199687, 0.2674324, 0.112318985, -0.14153072, -0.13629095, 0.13337436, 0.09185144, 0.24124412, 0.028630963, 0.22709718)); + target += mul(conv2d_7_tf, min16float4x4(0.44043523, 0.32490492, -0.117098905, 0.38431495, 0.07962198, 0.1517891, 0.22628377, 0.13990402, 0.38505656, -0.014830039, 0.20684186, 0.065970615, -0.054330014, -0.046108313, 0.49422976, 0.13082288)); + target += mul(nconv2d_7_tf, min16float4x4(-0.08174229, -0.013488396, -0.09494761, 0.31210786, -0.14530393, -0.22510533, -0.30971226, -0.17040919, -0.64233893, -0.07164386, -0.20537859, -0.17981663, -0.0060102916, -0.10167985, -0.24380594, 0.36305648)); + target += mul(conv2d_10_tf, min16float4x4(-0.23301682, -0.19649999, -0.0016176507, 0.7897105, -0.68460715, -0.06446943, -0.5841334, -0.17928797, 0.021772655, 0.46175778, 0.36450028, 0.27175686, -0.03546283, -0.19889158, -0.24603742, -0.090037055)); + target += mul(nconv2d_10_tf, min16float4x4(0.1085313, 0.04249687, 0.13247591, 0.09551512, -0.37197208, 0.3261908, -0.13848339, -0.13538006, 0.13875476, -0.3748712, -0.21430004, 0.09772982, -0.35635203, 0.13196826, -0.09840773, -0.21841893)); + target += min16float4(0.062238827, 0.069814906, -0.107347876, 0.64385885); + tex1[gxy] = target; + + target = mul(e1, min16float4x4(0.22607668, 0.021170171, -0.06774968, -0.019062893, -0.029051676, 0.029224426, 0.097410545, 0.07505055, 0.17470665, -0.025774082, -0.041022647, 0.07615996, 0.031361237, -0.18075092, -0.01981288, 0.30251572)); + target += mul(e2, min16float4x4(-0.2228827, -0.18372375, 0.17952546, 0.031262513, 0.10978829, 0.095414534, -0.11202218, -0.017824037, 0.13419671, -0.056704585, 0.086960495, 0.089463, 0.0436869, 0.1987542, -0.24825421, -0.14668585)); + target += mul(ne1, min16float4x4(-0.2848745, -0.09242928, 0.24002336, -0.06059541, -0.0066300016, 0.050746392, -0.26092768, -0.060129635, -0.2699064, -0.13927452, 0.3134039, -0.21668927, 0.0028670141, 0.044556674, 0.040246494, -0.26040232)); + target += mul(ne2, min16float4x4(0.08408219, -0.038882803, -0.08522774, 0.1714629, -0.03067602, -0.10863579, 0.072058044, -0.012343554, -0.0076697394, 0.17840211, -0.2823912, 0.11976201, -0.05657313, 0.092938855, -0.060931504, 0.06991858)); + target += mul(conv2d_11_tf, min16float4x4(0.09868284, 0.054261737, 0.13327791, -0.14897001, -0.06348394, 0.11385057, 0.09684055, -0.084950894, -0.3038146, -0.08645148, 0.035114545, -0.07148952, -0.15862693, 0.26620075, -0.018059343, 0.35772058)); + target += mul(nconv2d_11_tf, min16float4x4(-0.4964452, -0.32340884, 0.5129584, -0.090460144, 0.28658384, -0.117274396, 0.25311428, 0.119918026, 0.27442876, -0.19332558, -0.40261742, -0.0627285, -0.36318043, -0.07865861, -0.11114984, -0.1290027)); + target += mul(conv2d_1_tf, min16float4x4(0.42158237, -0.032889403, 0.034080755, 0.25719455, -0.18799819, 0.0981468, 0.22785765, -0.07262642, 0.22532979, -0.09519116, -0.1005627, 0.1767603, -0.100850165, -0.06818755, 0.0059797456, -0.0718568)); + target += mul(nconv2d_1_tf, min16float4x4(0.12787001, -0.20670003, 0.0034799385, -0.024907416, 0.04423561, -0.13276835, -0.102332935, 0.14673741, 0.08700579, 0.08124997, -0.009865786, 0.041748982, -0.076119795, 0.09744985, 0.13542135, 0.12240728)); + target += mul(conv2d_4_tf, min16float4x4(-0.1702021, 0.18497302, 0.06786661, -0.09040049, 0.15212716, 0.055503774, 0.020584844, 0.24927403, 0.23556694, -0.1571619, -0.02012801, 0.08423509, -0.114376806, -0.04171382, 0.040876187, -0.116261706)); + target += mul(nconv2d_4_tf, min16float4x4(-0.0854133, -0.023111762, 0.3320211, -0.21760856, -0.169973, 0.22671382, 0.4513697, 0.35962802, -0.1499719, 0.24696982, -0.29979527, 0.006662296, 0.20241787, -0.2276791, 0.059445832, 0.18853071)); + target += mul(conv2d_7_tf, min16float4x4(-0.026398154, 0.124663144, 0.20381314, 0.2053697, 0.010302614, -0.050437275, 0.033807695, 0.014369258, -0.20720173, 0.05919782, 0.008449617, -0.31949872, 0.011598942, -0.0432789, 0.12732887, 0.049919438)); + target += mul(nconv2d_7_tf, min16float4x4(-0.06617085, 0.023928246, 0.1698239, 0.19584818, 0.022199618, -0.0040151025, -0.14364237, -0.06734091, 0.49634683, 0.40206975, -0.023004102, 0.16953272, 0.13243976, -0.47359994, 0.18358715, -0.15007599)); + target += mul(conv2d_10_tf, min16float4x4(0.03754883, -0.84370553, -0.0057923268, -0.06449944, 0.09488198, -0.09577232, 0.31362334, -0.09768442, 0.15369056, -0.16346063, 0.41194627, 0.10364933, -0.2073915, -0.15944852, -0.57649344, 0.1580545)); + target += mul(nconv2d_10_tf, min16float4x4(-0.3224099, -0.17332473, 0.12429976, -0.12284861, 0.32270268, 0.2888736, -0.20192772, 0.15415959, -0.10240418, 0.09524166, -0.14117688, -0.1239787, 0.0015336396, 0.10390812, 0.20461708, -0.12672688)); + target += min16float4(0.01866206, -0.01430976, -0.04231479, 0.06331023); + tex2[gxy] = target; +} + +//!PASS 6 +//!DESC Conv-4x3x3x16, Conv-4x1x1x64 +//!IN tex1, tex2, tex8, tex3, tex6, tex7, tex9 +//!OUT tex4, tex5, tex10 +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 + +void Pass6(uint2 blockStart, uint3 threadId) { + uint2 gxy = Rmp8x8(threadId.x) + blockStart; + uint2 inputSize = GetInputSize(); + if (gxy.x >= inputSize.x || gxy.y >= inputSize.y) { + return; + } + + float2 inputPt = GetInputPt(); + float2 pos = (gxy + 0.5f) * inputPt; + + // [ a, d, g ] + // [ b, e, h ] + // [ c, f, i ] + min16float4 a1 = tex1.SampleLevel(sam, pos - inputPt, 0); + min16float4 b1 = tex1.SampleLevel(sam, pos + float2(-inputPt.x, 0), 0); + min16float4 c1 = tex1.SampleLevel(sam, pos + float2(-inputPt.x, inputPt.y), 0); + min16float4 d1 = tex1.SampleLevel(sam, pos + float2(0, -inputPt.y), 0); + min16float4 e1 = tex1.SampleLevel(sam, pos, 0); + min16float4 f1 = tex1.SampleLevel(sam, pos + float2(0, inputPt.y), 0); + min16float4 g1 = tex1.SampleLevel(sam, pos + float2(inputPt.x, -inputPt.y), 0); + min16float4 h1 = tex1.SampleLevel(sam, pos + float2(inputPt.x, 0), 0); + min16float4 i1 = tex1.SampleLevel(sam, pos + inputPt, 0); + + min16float4 na1 = max(-a1, 0); + min16float4 nb1 = max(-b1, 0); + min16float4 nc1 = max(-c1, 0); + min16float4 nd1 = max(-d1, 0); + min16float4 ne1 = max(-e1, 0); + min16float4 nf1 = max(-f1, 0); + min16float4 ng1 = max(-g1, 0); + min16float4 nh1 = max(-h1, 0); + min16float4 ni1 = max(-i1, 0); + + a1 = max(a1, 0); + b1 = max(b1, 0); + c1 = max(c1, 0); + d1 = max(d1, 0); + e1 = max(e1, 0); + f1 = max(f1, 0); + g1 = max(g1, 0); + h1 = max(h1, 0); + i1 = max(i1, 0); + + min16float4 a2 = tex2.SampleLevel(sam, pos - inputPt, 0); + min16float4 b2 = tex2.SampleLevel(sam, pos + float2(-inputPt.x, 0), 0); + min16float4 c2 = tex2.SampleLevel(sam, pos + float2(-inputPt.x, inputPt.y), 0); + min16float4 d2 = tex2.SampleLevel(sam, pos + float2(0, -inputPt.y), 0); + min16float4 e2 = tex2.SampleLevel(sam, pos, 0); + min16float4 f2 = tex2.SampleLevel(sam, pos + float2(0, inputPt.y), 0); + min16float4 g2 = tex2.SampleLevel(sam, pos + float2(inputPt.x, -inputPt.y), 0); + min16float4 h2 = tex2.SampleLevel(sam, pos + float2(inputPt.x, 0), 0); + min16float4 i2 = tex2.SampleLevel(sam, pos + inputPt, 0); + + min16float4 na2 = max(-a2, 0); + min16float4 nb2 = max(-b2, 0); + min16float4 nc2 = max(-c2, 0); + min16float4 nd2 = max(-d2, 0); + min16float4 ne2 = max(-e2, 0); + min16float4 nf2 = max(-f2, 0); + min16float4 ng2 = max(-g2, 0); + min16float4 nh2 = max(-h2, 0); + min16float4 ni2 = max(-i2, 0); + + a2 = max(a2, 0); + b2 = max(b2, 0); + c2 = max(c2, 0); + d2 = max(d2, 0); + e2 = max(e2, 0); + f2 = max(f2, 0); + g2 = max(g2, 0); + h2 = max(h2, 0); + i2 = max(i2, 0); + + min16float4 conv2d_11_tf = tex8.SampleLevel(sam, pos, 0); + min16float4 nconv2d_11_tf = max(-conv2d_11_tf, 0); + conv2d_11_tf = max(conv2d_11_tf, 0); + + min16float4 conv2d_1_tf = tex3.SampleLevel(sam, pos, 0); + min16float4 nconv2d_1_tf = max(-conv2d_1_tf, 0); + conv2d_1_tf = max(conv2d_1_tf, 0); + + min16float4 conv2d_4_tf = tex6.SampleLevel(sam, pos, 0); + min16float4 nconv2d_4_tf = max(-conv2d_4_tf, 0); + conv2d_4_tf = max(conv2d_4_tf, 0); + + min16float4 conv2d_7_tf = tex7.SampleLevel(sam, pos, 0); + min16float4 nconv2d_7_tf = max(-conv2d_7_tf, 0); + conv2d_7_tf = max(conv2d_7_tf, 0); + + min16float4 conv2d_10_tf = tex9.SampleLevel(sam, pos, 0); + min16float4 nconv2d_10_tf = max(-conv2d_10_tf, 0); + conv2d_10_tf = max(conv2d_10_tf, 0); + + min16float4 conv2d_13_tf = mul(a1, min16float4x4(0.09638616, 0.041973136, 0.032690834, 0.0017506832, 0.035889357, 0.046528358, 0.06497702, 0.06353481, -0.07129311, -0.027845494, 0.003971696, 0.015161773, -0.016153565, -0.02228567, -0.011083082, 0.037676543)); + conv2d_13_tf += mul(b1, min16float4x4(0.2134379, 0.26289365, 0.1335757, 0.13036838, -0.08787389, -0.106764, -0.048054244, 0.17788094, -0.15528837, -0.11408854, -0.06642222, -0.07838564, -0.09646518, -0.116988175, -0.22729287, -0.11145718)); + conv2d_13_tf += mul(c1, min16float4x4(0.09568265, 0.006643416, 0.11656759, -0.049414653, 0.14153476, -0.04269765, 0.09150523, 0.26861703, 0.16641477, -0.1080059, 0.22390138, -0.08730618, -0.01928994, -0.06351, -0.0022028533, 0.04301657)); + conv2d_13_tf += mul(d1, min16float4x4(-0.11731019, -0.040432923, -0.1977298, -0.17696093, -0.09182833, 0.071209684, -0.120773874, 0.021507429, -0.016429326, 0.04448132, 0.0681032, 0.044070866, -0.14647268, 0.008662263, -0.06507026, -0.075289875)); + conv2d_13_tf += mul(e1, min16float4x4(0.5694518, -0.6138523, 0.28939885, -0.06047394, 0.11681902, -0.7026379, 0.20342608, 0.07128985, 0.06697409, 0.2678358, 1.1430641, 0.20436136, -1.6117494, 0.2799715, -0.01652429, -0.16711035)); + conv2d_13_tf += mul(f1, min16float4x4(0.15830286, 0.16772346, -0.03232187, 0.029600514, -0.18494213, -0.25623813, 0.15487063, 0.06255487, -0.058094956, 0.19903323, 0.4756497, 0.6381142, -0.036022857, -0.09470495, 0.046093524, 0.031300675)); + conv2d_13_tf += mul(g1, min16float4x4(-0.38466138, 0.16052443, -0.13819315, -0.059899956, 0.14069949, -0.1297194, 0.105595976, 0.13371274, 0.06298681, -0.038837492, 0.08675327, 0.1501906, 0.031129224, 0.029751344, -0.06775066, -0.047534525)); + conv2d_13_tf += mul(h1, min16float4x4(0.097809926, -0.14269543, -0.14661346, -0.1819761, -0.023082452, 0.19019675, -0.15678905, -0.07669464, -0.07322769, -0.30472377, 0.33603573, 0.22620338, 0.05328552, 0.030486144, -0.037603505, -0.081246674)); + conv2d_13_tf += mul(i1, min16float4x4(-0.15090303, -0.0650902, 0.11741429, -0.003369476, 0.043803368, 0.13717425, -0.038966697, -0.05230889, -0.0042353314, -0.017051768, 0.102879845, 0.044044945, -0.012893164, 0.0152335, 0.015073082, 0.08049258)); + conv2d_13_tf += mul(a2, min16float4x4(-0.07802851, -0.07544602, -0.0039040581, -0.03915584, 0.115673676, -0.024907975, -0.011459969, 0.026098263, 0.043594692, 0.10627707, 0.027093858, 0.051561285, 0.071452856, -0.1758179, 0.28485832, 0.28952092)); + conv2d_13_tf += mul(b2, min16float4x4(-0.052147392, 0.18546684, 0.19015399, -0.053752594, -0.29468048, 0.010600442, -0.09287294, -0.09246605, 0.17687573, -0.04858957, 0.06478161, -0.0035372626, 0.5927226, 0.38359696, 0.33155236, 0.13010578)); + conv2d_13_tf += mul(c2, min16float4x4(0.04136322, 0.11806175, 0.19966072, 0.07308716, -0.09563447, -0.064514905, -0.0077517326, 0.11964638, -0.1460613, 0.02240298, 0.014256963, -0.0123070385, 0.1897282, -0.0058207656, 0.040057864, -0.49406672)); + conv2d_13_tf += mul(d2, min16float4x4(-0.43775788, -0.25118434, -0.3468631, -0.30180287, -0.27033472, -0.0023914252, 0.053275872, -0.021835659, 0.02879347, 0.036559265, 0.044093054, 0.12771723, 0.2702892, -0.2581491, -0.059361164, -0.046974897)); + conv2d_13_tf += mul(e2, min16float4x4(-0.03310008, -0.5622936, 0.5419483, -0.3599514, 0.2634039, 0.3500813, 0.4152074, 0.24876466, -0.2629078, -0.18554081, -0.76194984, -0.54471385, 0.72921526, 0.3316481, -0.20936906, -0.16736485)); + conv2d_13_tf += mul(f2, min16float4x4(0.07884802, 0.16494922, 0.2734585, -0.09396988, -0.14178166, -0.105561115, 0.006780099, 0.063054875, 0.12384575, -0.163967, -0.19682601, -0.1647527, 0.59927565, 0.24755491, -0.29760644, -0.074884824)); + conv2d_13_tf += mul(g2, min16float4x4(-0.186745, 0.21136905, 0.027726538, 0.08498169, 0.009122279, 0.01566938, -0.051473126, 0.014151464, 0.04580383, 0.02071651, 0.14929157, 0.17253524, -0.034080226, 0.07048439, -0.11602547, -0.12655921)); + conv2d_13_tf += mul(h2, min16float4x4(-0.2831727, -0.21816732, -0.37266397, -0.26041594, -0.18912914, -0.13482115, -0.10902061, -0.110694066, -0.20758803, -0.07158453, 0.14401175, 0.1590672, 0.27700564, -0.3202948, -0.23177631, 0.060082316)); + conv2d_13_tf += mul(i2, min16float4x4(0.16861005, -0.13237478, -0.12109852, -0.16306286, 0.032467425, 0.009778175, -0.05084063, 0.02528882, -0.028993038, -0.06119019, 0.0124081755, -0.0819979, -0.2308113, -0.23910572, 0.3170529, 0.22742116)); + conv2d_13_tf += mul(na1, min16float4x4(-0.19654512, 0.037653327, -0.015190324, 0.038381096, 0.034783594, -0.16242851, 0.07052334, 0.0019672879, 0.08069976, 0.090035714, 0.12597767, -0.00065050717, -0.10528094, 0.015088367, -0.045706235, -0.14849594)); + conv2d_13_tf += mul(nb1, min16float4x4(-0.0981129, -0.0044483114, 0.00918156, 0.28903985, 0.23872024, 0.11113565, 0.23359483, 0.21115206, 0.2144387, 0.106830046, 0.03875094, -0.14864162, 0.19366172, 0.21310017, 0.06280982, -0.0581721)); + conv2d_13_tf += mul(nc1, min16float4x4(-0.22814496, -0.08812413, -0.25392863, -0.02752917, 0.05930787, 0.08304853, -0.04027662, -0.010756739, 0.034590207, 0.070662424, 0.15285444, 0.058270697, -0.022838322, 0.024096202, 0.01309858, -0.10489201)); + conv2d_13_tf += mul(nd1, min16float4x4(0.17219496, -0.0066256993, 0.1442649, -0.07291206, 0.34312358, -0.24952441, 0.040031537, 0.18302973, 0.0015231773, 0.24825755, -0.01807878, -0.037405558, 0.21687117, 0.02481246, -0.08312088, -0.14397743)); + conv2d_13_tf += mul(ne1, min16float4x4(0.2859165, 0.6145777, 0.060804237, 0.22117847, -0.25534254, 0.3753605, 0.4193899, 0.06387241, -0.13308842, 0.0012660836, -0.055252563, -0.2552111, 0.8831952, -0.16249466, 0.76958305, 0.3658401)); + conv2d_13_tf += mul(nf1, min16float4x4(-0.14865848, -0.13086087, 0.17719927, 0.2801542, 0.3776111, 0.20903045, 0.1710449, 0.25524843, 0.11910105, 0.034738105, -0.12101939, -0.22116004, 0.11605619, 0.16838482, -0.07223086, -0.15225673)); + conv2d_13_tf += mul(ng1, min16float4x4(0.101802975, -0.12683764, -0.21380596, -0.19243564, 0.017763488, 0.0076850834, -0.0107422285, 0.058099743, 0.03071978, 0.02958345, 0.09209252, -0.012379192, -0.058930825, -0.07321041, -0.09178575, -0.09764888)); + conv2d_13_tf += mul(nh1, min16float4x4(0.2205578, -0.053928245, -0.14290524, -0.18790527, 0.002521159, -0.23389481, 0.11274272, 0.17174199, 0.2128134, 0.14586388, 0.08666812, 0.052028902, 0.024853414, -0.027658377, 0.033780072, -0.0045349374)); + conv2d_13_tf += mul(ni1, min16float4x4(-0.053073518, 0.12716359, 0.008456044, 0.014315154, 0.01918925, -0.13495505, 0.08007481, 0.08627198, 0.024612406, 0.0021514448, 0.04478567, -0.034171678, 0.0027070146, 0.0149149615, -0.15999815, -0.1866448)); + conv2d_13_tf += mul(na2, min16float4x4(0.040357295, -0.12759757, 0.03543834, -0.029329961, -0.078925595, 0.07807751, 0.08971355, -0.05469623, -0.08630596, -0.11219292, -0.08082983, -0.020131797, -0.04191703, 0.22003745, -0.28878415, -0.132956)); + conv2d_13_tf += mul(nb2, min16float4x4(0.021098461, 0.048261415, -0.121181525, -0.24724431, 0.32716268, 0.03046708, -0.28138334, -0.22871564, -0.15983087, 0.10721642, -0.14833531, -0.115366876, -0.393837, -0.62930757, -0.29534766, 0.02588463)); + conv2d_13_tf += mul(nc2, min16float4x4(-0.03972534, -0.051577512, -0.04452277, -0.12650263, 0.15491997, -0.026459083, 0.009715449, -0.20551588, -0.042652152, 0.119186826, -0.13313279, -0.13183416, -0.20730016, 0.003008999, -0.19962612, 0.1760052)); + conv2d_13_tf += mul(nd2, min16float4x4(0.1724579, -0.3179752, 0.18908302, 0.40730157, 0.44569418, -0.038390577, -0.13144472, -0.18369946, -0.1654486, -0.2106428, -0.084723935, 0.10262653, -0.26097777, 0.15257284, -0.36599034, -0.30871773)); + conv2d_13_tf += mul(ne2, min16float4x4(-0.21338613, 0.680362, 0.079820015, 0.6081361, -0.9754953, -0.33735132, -1.2323227, -0.17950675, -0.31327835, 0.4732144, 0.22757599, 0.23051551, -0.8099572, -0.49106973, 0.96547806, 0.30975753)); + conv2d_13_tf += mul(nf2, min16float4x4(0.16933723, 0.17994887, -0.38310486, -0.4208871, 0.373761, 0.20749316, -0.080664486, -0.26229286, -0.04797456, 0.28605196, -0.040223103, -0.034632236, -0.5650002, -0.38834664, 0.14565933, 0.1488285)); + conv2d_13_tf += mul(ng2, min16float4x4(0.32558438, -0.18572666, 0.049500592, 0.2319145, -0.23547912, 0.2740939, 0.027905073, -0.022077003, 0.10860379, -0.15617043, -0.097419575, -0.11391895, -0.4266203, 0.060962453, -0.12154808, -0.19734453)); + conv2d_13_tf += mul(nh2, min16float4x4(-0.07880791, -0.2247225, 0.445858, 0.3889803, 0.14111102, 0.378859, 0.040187526, -0.021096235, 0.04169405, -0.075737596, 0.046068836, 0.11624106, 0.08169536, 0.3022304, -0.24427707, -0.34422734)); + conv2d_13_tf += mul(ni2, min16float4x4(0.13501012, -0.07389663, -0.010668981, -0.069029465, 0.06960202, -0.067375034, 0.08431378, 0.04207825, -0.121635035, -0.051126126, -0.1546829, 0.00073073455, -0.20674464, 0.27346626, -0.15771666, -0.024096)); + conv2d_13_tf += min16float4(-0.17614856, -0.14261112, 0.14600825, 0.20389698); + min16float4 nconv2d_13_tf = max(-conv2d_13_tf, 0); + conv2d_13_tf = max(conv2d_13_tf, 0); + + min16float4 target = mul(e1, min16float4x4(-0.3378193, 0.013861057, 0.19208853, -0.05050854, 0.08691835, 0.16724123, 0.10351982, -0.40157926, -0.055889476, -0.040115904, -0.13351472, -0.7937818, 0.18700145, 0.109559685, -0.119053595, -0.12651901)); + target += mul(e2, min16float4x4(0.05863214, -0.011048432, 0.22007701, -0.21624403, -0.06139813, -0.06766812, 0.022506371, 0.17585056, -0.37994936, -0.018394569, 0.5127985, -0.19700864, -0.07880973, 0.15687309, -0.12574019, -0.19570859)); + target += mul(ne1, min16float4x4(0.5059051, -0.010676642, -0.47922808, -0.017590942, -0.20583269, -0.10777252, -0.33185184, -0.0025075034, -0.1518394, 0.14268444, 0.005011664, 0.09016961, -0.46011007, -0.09428751, 0.34915137, 0.13334215)); + target += mul(ne2, min16float4x4(-0.15615676, 0.09427065, 0.006016912, -0.0003997069, 0.16170138, 0.09666374, 0.14158808, -0.23772424, 0.39373854, 0.004074768, -0.28073287, 0.0032489141, 0.23473479, -0.12678933, -0.24589436, -0.21988034)); + target += mul(conv2d_11_tf, min16float4x4(-0.12682347, 0.033012364, 0.18928578, 0.12523666, 0.12809147, 0.008567846, -0.10653368, -0.03712133, 0.075765386, -0.042196997, 0.039182812, 0.17273012, 0.21258987, 0.039698593, -0.0018848967, -0.07930902)); + target += mul(nconv2d_11_tf, min16float4x4(0.013454855, -0.18023406, -0.49323913, -0.032017395, 0.11903338, -0.043025218, -0.46579728, 0.21894619, -0.21387324, -0.13455649, 0.30638975, 0.3472243, 0.09305909, -0.015791988, 0.071368046, -0.038680866)); + target += mul(conv2d_1_tf, min16float4x4(0.012506262, 0.09754124, -0.092920735, 0.23061672, 0.08051618, -0.38472125, 0.17626029, 0.009075537, -0.18316247, -0.1338181, 0.2650675, 0.0516641, 0.080453254, 0.22033659, -0.13004474, -0.07781194)); + target += mul(nconv2d_1_tf, min16float4x4(-0.12412428, -0.11978811, 0.06780084, -0.1710261, -0.09355731, 0.31283846, -0.022725523, -0.16437142, -0.11865966, 0.10907317, 0.22463441, 0.017325362, 0.02512185, -0.49577957, 0.2016018, 0.14196795)); + target += mul(conv2d_4_tf, min16float4x4(0.02570746, 0.22231244, -0.10168496, -0.21518417, -0.0054759895, -0.32655567, -0.34048972, 0.11826245, -0.002854444, -0.11257602, -0.09318273, -0.10332744, 0.078923725, -0.11612356, -0.030546617, -0.12474622)); + target += mul(nconv2d_4_tf, min16float4x4(-0.11420135, -0.24489257, 0.15446539, 0.12646616, -0.07092042, 0.110105604, 0.054362826, 0.07867222, -0.15557991, 0.071640015, 0.21894808, 0.24164975, 0.0062167975, 0.10681122, -0.32373384, 0.06931269)); + target += mul(conv2d_7_tf, min16float4x4(0.0769479, -0.09528171, -0.38724712, 0.010703831, -0.016925508, -0.018486671, 0.035855293, -0.17932071, -0.078450575, -0.036463127, 0.20942347, 0.060895607, -0.16549253, -0.008952913, 0.20420915, -0.009001661)); + target += mul(nconv2d_7_tf, min16float4x4(0.074243605, 0.015648128, -0.05003613, 0.10121142, -0.0218682, 0.006933849, 0.101385176, 0.16132122, 0.0013466089, 0.14042993, -0.25816667, -0.040413387, -0.19570185, -0.08637437, 0.17934911, 0.24961887)); + target += mul(conv2d_10_tf, min16float4x4(-0.40401492, -0.16131033, 0.454142, 0.56882274, -0.013024656, -0.04423676, -0.023137214, 0.36117804, -0.0901519, -0.03237353, 0.010538879, -0.033432953, 0.105834074, -0.0549062, 0.05576519, -0.092626475)); + target += mul(nconv2d_10_tf, min16float4x4(-0.0017419134, -0.022569131, 0.027351622, -0.1289159, -0.0823291, -0.020735232, -0.28244564, -0.21001048, -0.048950948, 0.022033915, 0.14678808, -0.010097721, -0.06839686, 0.031720705, 0.11333891, 0.05049834)); + target += mul(conv2d_13_tf, min16float4x4(-0.2191025, -0.005935159, 0.24627906, 0.058490098, -0.011270337, -0.019233467, -0.17698613, -0.0052346545, 0.2288101, -2.5289672e-05, 0.267102, -0.026019678, -0.17386179, -0.017672652, -0.35420522, 0.2836498)); + target += mul(nconv2d_13_tf, min16float4x4(0.19294678, 0.011570707, -0.34666267, -0.09040537, 0.18127288, 0.10182209, 0.08549184, -0.48737645, -0.040560674, 0.20645715, -0.68665904, -1.3146902, 0.18629448, 0.09806124, 0.09953519, -0.5450951)); + target += min16float4(-0.24792486, -0.09899526, 0.3761066, 0.022595163); + tex4[gxy] = target; + + target = mul(e1, min16float4x4(0.15938057, -0.23559119, -0.28445953, 0.05912659, 0.5229142, -0.02843545, -0.004113748, -0.056947608, 0.1367782, -0.026573306, -0.0056468234, 0.2564603, 0.25593445, 0.08957574, 0.26139608, -0.053708326)); + target += mul(e2, min16float4x4(0.1382045, -0.103480555, 0.05831098, 0.000735441, 0.20176832, -0.087079, -0.07839967, -0.0750771, -0.31373122, -0.27509713, -0.23071732, -0.2560584, 0.110963896, -0.052200988, 0.0015331429, -0.30707568)); + target += mul(ne1, min16float4x4(-0.056460302, 0.2147989, 0.40628514, -0.058157466, -0.17940372, -0.033689886, -0.022241283, -0.0018471872, 0.26578268, -0.098452985, -0.01501511, -0.35676336, -0.07152056, -0.07245194, -0.32194778, 0.03888747)); + target += mul(ne2, min16float4x4(0.09541087, 0.24680884, -0.045627397, -0.08557985, 0.08790337, 0.10179883, 0.3007415, 0.044102084, 0.1064372, 0.2994135, 0.15280741, 0.2683849, 0.24750276, -0.021364288, -0.004039902, 0.28266376)); + target += mul(conv2d_11_tf, min16float4x4(-0.26525706, -0.08389754, -0.10918147, -0.06878537, -0.080960914, 0.03737948, 0.107663736, -0.0025957434, -0.10748625, 0.03004828, 0.03505711, 0.075969726, 0.06360464, -0.02740913, 0.025467616, 0.017698402)); + target += mul(nconv2d_11_tf, min16float4x4(-0.2370006, -0.07687027, 0.015225365, 0.17986605, 0.37507248, 0.2088343, 0.17946883, 0.2379337, -0.25194344, 0.035336476, -0.15362923, -0.008527836, 0.045963865, 0.025127884, 0.06973296, 0.063168526)); + target += mul(conv2d_1_tf, min16float4x4(0.09583503, 0.15350054, -0.15248272, 0.045916792, -0.18339546, -0.29747355, 0.027330166, -0.39461568, 0.095963046, -0.1775004, -0.19221638, -0.15368307, 0.056089737, 0.18232727, 0.03182419, 0.30851522)); + target += mul(nconv2d_1_tf, min16float4x4(-0.053062204, -0.0018095247, -0.04514637, 0.05689337, 0.07561519, 0.17035827, -0.0048587993, 0.38348997, -0.063476466, 0.09454219, 0.03969728, 0.11693653, -0.0012066896, -0.25955358, -0.14428577, -0.19967856)); + target += mul(conv2d_4_tf, min16float4x4(0.034378257, 0.16030714, 0.05160261, 0.21927983, -0.14469208, 0.041181874, 0.034202367, 0.07983977, 0.22149332, -0.08595994, -0.102985874, -0.07265774, -0.123233125, -0.12819915, 0.08662329, -0.12866889)); + target += mul(nconv2d_4_tf, min16float4x4(-0.1511104, -0.056531575, -0.023363205, -0.1909304, -0.15387732, 0.0671428, -0.15435332, 0.32735124, -0.3293996, 0.055349957, -0.043602336, 0.08102016, 0.200238, 0.13393362, 0.0044564987, 0.16932343)); + target += mul(conv2d_7_tf, min16float4x4(-0.09768015, 0.09503259, 0.12768175, 0.109941825, 0.006567291, -0.102840215, -0.05611706, -0.06865725, -0.2605998, 0.00585688, -0.035119556, -0.06810342, -0.090756536, -0.079376444, -0.22370447, -0.05727839)); + target += mul(nconv2d_7_tf, min16float4x4(-0.101120085, 0.028628688, 0.07296149, 0.15868604, 0.047761433, 0.07732842, -0.016735386, 0.049528413, 0.45619023, 0.062347047, -0.026208224, 0.046785966, -0.05715451, 0.04459997, -0.13676195, 0.07778552)); + target += mul(conv2d_10_tf, min16float4x4(-0.051393595, -0.12524572, -0.36763692, 0.039426118, 0.0349489, 0.07154008, -0.12969223, 0.30249006, -0.15237582, -0.06685149, -0.042049125, -0.0065471376, 0.017375907, -0.07143284, -0.018227521, -0.02778629)); + target += mul(nconv2d_10_tf, min16float4x4(-0.048270147, -0.07275859, 0.05502608, -0.034233145, 0.12822276, -0.02580663, -0.035358194, 0.05195595, 0.044340245, 0.04435722, 0.017985033, 0.007126749, -0.052825354, -0.059360538, -0.09412195, 0.060212586)); + target += mul(conv2d_13_tf, min16float4x4(-0.18645881, -0.04506676, -0.035483524, 0.0063163475, -0.13747677, -0.046985928, 0.0015511635, 0.019160518, -0.4315584, -0.06979354, -0.001936674, 0.0034739177, 0.3490474, 0.15375568, -0.0085117165, 0.017511753)); + target += mul(nconv2d_13_tf, min16float4x4(0.20412005, 0.017221482, 0.08719384, -0.016668927, 0.10308073, -0.1013255, 0.087567665, -0.1004404, 0.9800944, -0.25387812, 0.36526182, -0.21970014, 0.36388537, -0.111629054, 0.21855496, -0.10375334)); + target += min16float4(-0.14657217, -0.04252579, -0.24773599, 0.13271233); + tex5[gxy] = target; + + target = mul(e1, min16float4x4(-0.22553514, -0.086349756, -0.07735866, 0.48776403, -0.33010843, 0.28214008, -0.2242988, -0.11439686, -0.14720698, 0.2391116, 0.017813087, 0.4352493, -0.16412133, -0.12791261, -0.019643517, 0.19420698)); + target += mul(e2, min16float4x4(-0.9178235, -0.6335296, 0.11146894, -0.0759723, -0.4519685, -0.3007054, 0.014501872, 0.49081457, 0.10673664, 0.035011876, 0.10259641, 0.106546804, 0.5186602, 0.44900152, 0.20597687, -0.39562696)); + target += mul(ne1, min16float4x4(-0.11399027, -0.19542706, 0.087422565, -0.70140034, -0.41029623, -0.049330976, 0.19682989, 0.22516033, -0.22858454, -0.12200487, -0.14852463, -0.40852943, -0.035900578, 0.1886829, 0.019452838, -0.16703403)); + target += mul(ne2, min16float4x4(0.077843145, 0.7323388, -0.022324003, 0.09445821, 0.026166735, -0.1790519, 0.086004496, -0.40011314, 0.01210975, -0.053515363, -0.2501869, 0.06671936, -0.71530163, -0.57196116, -0.38604704, 0.5024949)); + target += mul(conv2d_11_tf, min16float4x4(0.30748057, 0.12223383, 0.059069566, 0.18568543, 0.008148904, 0.009438993, 0.053996127, -0.19665428, 0.38345802, 0.20945628, 0.01368962, -0.2834185, -0.15974379, -0.4628119, -0.18307796, 0.22361058)); + target += mul(nconv2d_11_tf, min16float4x4(0.00833237, -0.10446639, -0.028896136, -0.18917766, -0.24016596, -0.034934085, -0.013062447, 0.079293504, -0.16635038, -0.11056953, 0.2618598, 0.07227063, 0.057050053, 0.013885738, 0.09385356, -0.27068567)); + target += mul(conv2d_1_tf, min16float4x4(-0.5675842, 0.13328329, -0.0252242, 0.34746942, 0.34712863, 0.13635597, 0.02356317, -0.1617803, -0.16861948, -0.018621348, 0.02680753, 0.30408886, -0.034069773, 0.08948961, -0.057724215, 0.111602895)); + target += mul(nconv2d_1_tf, min16float4x4(-0.03835732, -0.11742271, 0.025922403, 0.24378933, -0.36450952, -0.15091905, 0.1214089, 0.21004228, 0.28717628, 0.17053549, 0.10836553, -0.08449643, 0.17507422, -0.03195037, -0.03947606, 0.050725944)); + target += mul(conv2d_4_tf, min16float4x4(-0.21257977, -0.0043600267, -0.12929972, -0.233982, -0.26728988, -0.21511734, 0.07835361, -0.24275993, -0.359975, -0.23956355, -0.07852281, 0.40282407, 0.17184453, 0.11672362, 0.0433819, -0.032416925)); + target += mul(nconv2d_4_tf, min16float4x4(0.20235331, 0.16114245, 0.015931258, -0.17612378, 0.2449233, 0.0031623375, -0.2784109, 0.3347522, 0.46005112, 0.20291579, 0.13030154, -0.23390344, -0.39526668, -0.09738018, 0.013237711, 0.15512206)); + target += mul(conv2d_7_tf, min16float4x4(-0.1434995, -0.12447443, 0.095140964, -0.08841888, -0.05424789, -0.11747197, -0.097216785, 0.12958516, 0.34194428, 0.111434594, -0.02794559, -0.22843723, -0.043816507, -0.16116165, -0.29044297, 0.33768278)); + target += mul(nconv2d_7_tf, min16float4x4(0.39615574, 0.05410518, -0.07885892, -0.22024721, 0.011598219, 0.1446308, 0.11650995, -0.020602686, -0.51892537, 0.14221898, -0.01697185, 0.05188913, 0.07683384, 0.122416414, 0.02296055, 0.2932525)); + target += mul(conv2d_10_tf, min16float4x4(-0.058334768, -0.12389275, -0.02024463, 0.46323973, 0.17553197, 0.35435143, 0.19796194, 0.06836581, 0.15947883, -0.056819815, -0.091066726, 0.22499265, -0.21629064, -0.22203816, 0.053594038, 0.09816408)); + target += mul(nconv2d_10_tf, min16float4x4(-0.016514458, -0.14323495, 0.017527288, -0.19750872, -0.47891942, -0.073656894, -0.086305656, 0.38173944, 0.1016976, 0.15224999, 0.048396923, -0.19529565, 0.13985658, 0.07292602, 0.06549534, 0.210662)); + target += mul(conv2d_13_tf, min16float4x4(0.3459035, 0.0071707424, -0.019186711, 0.2527976, 0.29675815, 0.35949966, -0.06114439, -0.02610484, 0.5475115, -0.13828747, 0.019238133, 0.101953685, -0.52718824, 0.017254699, 0.08887026, -0.19507161)); + target += mul(nconv2d_13_tf, min16float4x4(-0.3064509, -0.031613164, 0.040971015, -0.24252266, -0.21725285, -0.35069898, 0.0951283, -0.065222666, -0.98867434, 0.08824426, 0.06094605, -0.21000125, -0.72066385, -0.34141323, 0.049487203, 0.0690126)); + target += min16float4(0.25545248, -0.112931795, -0.073284395, 0.29349956); + tex10[gxy] = target; +} + +//!PASS 7 +//!DESC Conv-3x3x3x24 +//!IN INPUT, tex4, tex5, tex10 +//!OUT OUTPUT +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 + +void Pass7(uint2 blockStart, uint3 threadId) { + uint2 gxy = Rmp8x8(threadId.x) + blockStart; + + const uint2 outputSize = GetOutputSize(); + if (gxy.x >= outputSize.x || gxy.y >= outputSize.y) { + return; + } + + const float2 outputPt = GetOutputPt(); + const float2 pos = (gxy + 0.5f) * outputPt; + + // [ a, d, g ] + // [ b, e, h ] + // [ c, f, i ] + min16float4 a1 = tex4.SampleLevel(sam1, pos - outputPt, 0); + min16float4 b1 = tex4.SampleLevel(sam1, pos + float2(-outputPt.x, 0), 0); + min16float4 c1 = tex4.SampleLevel(sam1, pos + float2(-outputPt.x, outputPt.y), 0); + min16float4 d1 = tex4.SampleLevel(sam1, pos + float2(0, -outputPt.y), 0); + min16float4 e1 = tex4.SampleLevel(sam1, pos, 0); + min16float4 f1 = tex4.SampleLevel(sam1, pos + float2(0, outputPt.y), 0); + min16float4 g1 = tex4.SampleLevel(sam1, pos + float2(outputPt.x, -outputPt.y), 0); + min16float4 h1 = tex4.SampleLevel(sam1, pos + float2(outputPt.x, 0), 0); + min16float4 i1 = tex4.SampleLevel(sam1, pos + outputPt, 0); + + min16float4 na1 = max(-a1, 0); + min16float4 nb1 = max(-b1, 0); + min16float4 nc1 = max(-c1, 0); + min16float4 nd1 = max(-d1, 0); + min16float4 ne1 = max(-e1, 0); + min16float4 nf1 = max(-f1, 0); + min16float4 ng1 = max(-g1, 0); + min16float4 nh1 = max(-h1, 0); + min16float4 ni1 = max(-i1, 0); + + a1 = max(a1, 0); + b1 = max(b1, 0); + c1 = max(c1, 0); + d1 = max(d1, 0); + e1 = max(e1, 0); + f1 = max(f1, 0); + g1 = max(g1, 0); + h1 = max(h1, 0); + i1 = max(i1, 0); + + min16float4 a2 = tex5.SampleLevel(sam1, pos - outputPt, 0); + min16float4 b2 = tex5.SampleLevel(sam1, pos + float2(-outputPt.x, 0), 0); + min16float4 c2 = tex5.SampleLevel(sam1, pos + float2(-outputPt.x, outputPt.y), 0); + min16float4 d2 = tex5.SampleLevel(sam1, pos + float2(0, -outputPt.y), 0); + min16float4 e2 = tex5.SampleLevel(sam1, pos, 0); + min16float4 f2 = tex5.SampleLevel(sam1, pos + float2(0, outputPt.y), 0); + min16float4 g2 = tex5.SampleLevel(sam1, pos + float2(outputPt.x, -outputPt.y), 0); + min16float4 h2 = tex5.SampleLevel(sam1, pos + float2(outputPt.x, 0), 0); + min16float4 i2 = tex5.SampleLevel(sam1, pos + outputPt, 0); + + min16float4 na2 = max(-a2, 0); + min16float4 nb2 = max(-b2, 0); + min16float4 nc2 = max(-c2, 0); + min16float4 nd2 = max(-d2, 0); + min16float4 ne2 = max(-e2, 0); + min16float4 nf2 = max(-f2, 0); + min16float4 ng2 = max(-g2, 0); + min16float4 nh2 = max(-h2, 0); + min16float4 ni2 = max(-i2, 0); + + a2 = max(a2, 0); + b2 = max(b2, 0); + c2 = max(c2, 0); + d2 = max(d2, 0); + e2 = max(e2, 0); + f2 = max(f2, 0); + g2 = max(g2, 0); + h2 = max(h2, 0); + i2 = max(i2, 0); + + min16float4 a3 = tex10.SampleLevel(sam1, pos - outputPt, 0); + min16float4 b3 = tex10.SampleLevel(sam1, pos + float2(-outputPt.x, 0), 0); + min16float4 c3 = tex10.SampleLevel(sam1, pos + float2(-outputPt.x, outputPt.y), 0); + min16float4 d3 = tex10.SampleLevel(sam1, pos + float2(0, -outputPt.y), 0); + min16float4 e3 = tex10.SampleLevel(sam1, pos, 0); + min16float4 f3 = tex10.SampleLevel(sam1, pos + float2(0, outputPt.y), 0); + min16float4 g3 = tex10.SampleLevel(sam1, pos + float2(outputPt.x, -outputPt.y), 0); + min16float4 h3 = tex10.SampleLevel(sam1, pos + float2(outputPt.x, 0), 0); + min16float4 i3 = tex10.SampleLevel(sam1, pos + outputPt, 0); + + min16float4 na3 = max(-a3, 0); + min16float4 nb3 = max(-b3, 0); + min16float4 nc3 = max(-c3, 0); + min16float4 nd3 = max(-d3, 0); + min16float4 ne3 = max(-e3, 0); + min16float4 nf3 = max(-f3, 0); + min16float4 ng3 = max(-g3, 0); + min16float4 nh3 = max(-h3, 0); + min16float4 ni3 = max(-i3, 0); + + a3 = max(a3, 0); + b3 = max(b3, 0); + c3 = max(c3, 0); + d3 = max(d3, 0); + e3 = max(e3, 0); + f3 = max(f3, 0); + g3 = max(g3, 0); + h3 = max(h3, 0); + i3 = max(i3, 0); + + min16float3 target = mul(a1, min16float4x3(0.009331738, 0.018572107, 0.022010602, 0.0039357482, -0.016444422, -0.02944063, -0.03631314, -0.056094132, -0.050672945, 0.0077923858, -0.023002634, 0.021950275)); + target += mul(b1, min16float4x3(-0.015352033, -0.018134398, -0.031076321, 0.09254242, 0.07433854, 0.094745025, 0.09154548, 0.10833595, 0.084574744, -0.06755486, 0.022037052, -0.09424632)); + target += mul(c1, min16float4x3(0.019884977, 0.021337362, 0.026944455, 0.11712925, 0.021360623, -0.017487818, -0.14924358, -0.1149652, -0.12671575, 0.012104617, -0.039750118, -0.002691512)); + target += mul(d1, min16float4x3(0.00344861, -0.0071971808, -0.011530234, 0.039175995, 0.12297611, 0.15838134, 0.033669177, 0.018021118, -0.010552058, -0.048705686, 0.03920792, -0.00043378037)); + target += mul(e1, min16float4x3(-0.09026871, -0.09393277, -0.0849584, -0.16249315, -0.15300421, -0.1383744, -0.10384136, -0.04767781, 0.022754611, 0.14949107, 0.06619118, 0.016498014)); + target += mul(f1, min16float4x3(0.0138111375, 0.0033931104, 0.010171692, -0.037168514, -0.029690385, -0.045251988, 0.074186325, 0.056937214, 0.06968052, -0.057218343, -0.060974367, -0.030270662)); + target += mul(g1, min16float4x3(-0.0028436058, 0.010812401, 0.012844112, 0.050941236, -0.035253663, -0.061899442, -0.01614737, 0.01752726, -0.023620276, -0.04961744, -0.06673698, 0.039417736)); + target += mul(h1, min16float4x3(0.042587858, 0.03904053, 0.028782798, -0.09807107, -0.01929461, -0.034585416, 0.029584344, -0.053522006, 0.0068953806, -0.04451219, 0.018451538, -0.029895604)); + target += mul(i1, min16float4x3(-0.0041629653, 0.0070575047, 0.004515914, 0.043267716, 0.0020689464, 0.010954458, -0.0013374113, 0.009222025, -0.0272451, 0.00645634, -0.037133303, -0.03209227)); + target += mul(a2, min16float4x3(-0.010575585, -0.00065620174, -0.009598815, -0.068592854, -0.06461729, -0.05058234, 0.03790364, 0.044340994, 0.049410254, -0.009466368, 0.081484325, 0.07265021)); + target += mul(b2, min16float4x3(-0.01598744, -0.025267042, -0.010857686, 0.0771284, 0.081469566, 0.07138724, -0.00555409, -0.006099002, -0.02123016, -0.29761449, -0.10614364, -0.1027762)); + target += mul(c2, min16float4x3(0.02664693, 0.027294884, 0.019080907, 0.010511018, 0.01179118, 0.02403106, 0.05436632, 0.07234358, 0.08310484, 0.03146414, -0.02122628, -0.021377526)); + target += mul(d2, min16float4x3(0.027889153, 0.018621879, 0.025370836, -0.14017807, -0.14772555, -0.14436993, -0.017539013, -0.028932836, -0.06139342, 0.0007456944, -0.00086823467, -0.05282406)); + target += mul(e2, min16float4x3(-0.0017060362, 0.00777287, 0.003343087, 0.20926197, 0.21706305, 0.23307496, -0.16601992, -0.183019, -0.139133, 0.13933188, -0.013340946, -0.021960167)); + target += mul(f2, min16float4x3(-0.018459205, -0.023415336, -0.0173199, 0.08558963, 0.10207333, 0.06444232, -2.5721886e-06, -0.015806457, -0.036833573, -0.20488425, -0.009690944, 0.020323949)); + target += mul(g2, min16float4x3(0.010601256, 0.007344732, 0.0056538777, 0.021578439, 0.017345639, 0.0032158173, 0.031785835, 0.04436094, 0.05920955, 0.23948166, -0.06085234, -0.14597872)); + target += mul(h2, min16float4x3(0.00777581, 0.012557825, 0.0123206265, -0.0691877, -0.0861206, -0.077578135, -0.018104369, -0.024902673, -0.036656447, 0.10611258, 0.09515675, 0.118361965)); + target += mul(i2, min16float4x3(0.0021278602, 0.003906813, 0.0016891633, -0.06379228, -0.060215514, -0.051921096, 0.039505195, 0.052035928, 0.05059492, -0.047328927, -0.0066980706, 0.09447027)); + target += mul(a3, min16float4x3(0.18920127, -0.045531996, -0.044905778, 0.013732142, 0.019208554, 0.011500921, -0.0040531917, -0.02001873, -0.0023935249, -0.033091005, -0.017751431, -0.009764133)); + target += mul(b3, min16float4x3(0.15241088, -0.13676398, -0.01825122, -0.003517022, -0.004041717, 0.003177141, 0.011362495, 0.03685609, 0.008397426, -0.08597375, -0.111830845, -0.110682696)); + target += mul(c3, min16float4x3(-0.046171717, 0.23827009, -0.119844295, 0.005446854, 0.00826863, 0.002206898, -0.11165099, -0.14702465, -0.1203897, 0.12169146, 0.11585612, 0.10473949)); + target += mul(d3, min16float4x3(-0.18456058, 0.13293917, 0.06901046, 0.010084839, -0.0006403412, -0.011852079, -0.062180433, -0.06781299, -0.08111614, -0.02218764, -0.015271581, -0.019768957)); + target += mul(e3, min16float4x3(0.034135204, -0.20479187, 0.27587336, -0.058966126, -0.065613195, -0.056132246, 0.07697151, 0.0706985, 0.098771244, 0.06747748, 0.10971204, 0.13186967)); + target += mul(f3, min16float4x3(0.017322296, -0.06730298, 0.07034802, 0.013449086, 0.007968637, 0.012679429, 0.0902275, 0.11269024, 0.08805874, -0.06179092, -0.06705483, -0.13040404)); + target += mul(g3, min16float4x3(-0.052505482, -0.018989135, 0.03388015, -0.068704374, -0.05350174, -0.057223134, 0.011537428, 0.017847707, 0.0270268, -0.008713432, -0.02698126, -0.017463546)); + target += mul(h3, min16float4x3(0.15220639, -0.05387876, -0.08352881, 0.026893694, 0.027608246, 0.025959803, 0.035518423, 0.035180617, 0.01858579, -0.021064412, -0.014214504, -0.0051168953)); + target += mul(i3, min16float4x3(-0.11906418, 0.13103563, -0.06997703, 0.005664134, 0.0075536724, 0.009519002, -0.025366528, -0.013528652, -0.015087253, 0.0071858848, -0.027586544, 0.016723866)); + target += mul(na1, min16float4x3(0.015307254, 0.02070064, 0.012568325, 0.06845904, -0.033312738, -0.0058661965, -0.016281582, -0.01631146, -0.021667928, -0.012522515, -0.020992521, -0.015833912)); + target += mul(nb1, min16float4x3(0.04937768, 0.0405066, 0.041023023, 0.05503905, -0.13230717, -0.14439866, 0.01618014, 0.0122084245, 0.016226485, 0.0014116488, 0.011495032, 0.002382562)); + target += mul(nc1, min16float4x3(-0.04847043, -0.050508745, -0.041216835, -0.067119725, -0.0448592, -0.011477939, -0.035635237, -0.037191708, -0.034170575, -0.016549444, -0.027191242, -0.017883684)); + target += mul(nd1, min16float4x3(0.034498286, 0.026938718, 0.052970096, -0.10511612, -0.13200648, -0.09493861, -0.0018118658, -0.0072637545, 0.0043198126, -0.038338073, -0.031448375, -0.035546694)); + target += mul(ne1, min16float4x3(0.048043568, 0.057704087, 0.06386534, 0.04542113, 0.20604704, 0.2598609, 0.049180254, 0.064697154, 0.05789202, 0.08370016, 0.08105142, 0.08807082)); + target += mul(nf1, min16float4x3(-0.018156562, 0.008306473, -0.014604633, 0.18912326, 0.024388695, -0.08006485, 0.009333483, 0.011596536, 0.0056475243, 0.027749287, 0.039271932, 0.02655462)); + target += mul(ng1, min16float4x3(-0.030157864, -0.035259083, -0.05771176, -0.22293729, 0.0768592, 0.14670776, -0.013287718, -0.011300663, -0.01670879, -0.009928094, -0.016364388, -0.013879692)); + target += mul(nh1, min16float4x3(-0.013415757, -0.013257486, -0.01940959, 0.014077903, 0.05088362, 0.04006286, -0.0033998038, -0.0062313867, -0.00833104, 0.015246904, 0.017004015, 0.01802002)); + target += mul(ni1, min16float4x3(-0.0016801689, -0.022088053, 0.0031654288, 0.027371893, -0.007083684, -0.10904292, -0.015408179, -0.01793058, -0.010933266, -0.023707654, -0.026440954, -0.025527867)); + target += mul(na2, min16float4x3(0.009003153, 0.0078040734, 0.037757806, 0.054483943, 0.058831017, 0.060899608, -0.011133613, -0.01601666, -0.007977876, -0.07686641, -0.049250316, -0.045481566)); + target += mul(nb2, min16float4x3(0.04344093, 0.07054628, 0.037604738, -0.0914579, -0.105631486, -0.108511426, 0.04426105, 0.0492282, 0.048829302, 0.14961997, 0.16839094, 0.16053638)); + target += mul(nc2, min16float4x3(-0.0032967671, -0.019857304, -0.014145445, -0.013525817, 0.001614058, -0.009782301, -0.044629153, -0.07325184, -0.07655591, -0.08667146, 0.024955297, 0.04591592)); + target += mul(nd2, min16float4x3(0.04816059, 0.030722216, 0.032487474, 0.09684092, 0.10024655, 0.101904154, 0.08137448, 0.092595905, 0.1118598, 0.0796932, 0.009548236, 0.0013610915)); + target += mul(ne2, min16float4x3(-0.17208904, -0.19137467, -0.17717223, -0.10827683, -0.11960323, -0.1204814, -0.030430049, -0.019306151, -0.05230355, -0.021787236, -0.015395303, -0.093210146)); + target += mul(nf2, min16float4x3(0.04527227, 0.057978027, 0.10569097, -0.1015645, -0.12595437, -0.097537845, 0.060087565, 0.09157804, 0.060251515, 0.05170573, 0.042533275, 0.08233745)); + target += mul(ng2, min16float4x3(-0.01908824, 0.0039797956, -0.015060464, 0.008187719, 0.013936167, 0.008152853, -0.02618239, -0.056918032, -0.0504624, -0.083657, 0.02122987, 0.022906482)); + target += mul(nh2, min16float4x3(0.058020473, 0.08750743, 0.032107625, 0.021999976, 0.030119067, 0.03513493, 0.06583862, 0.08137626, 0.09867312, -0.0021064964, -0.1227668, -0.0912879)); + target += mul(ni2, min16float4x3(0.022279112, -0.012710205, -0.0011416139, 0.05606448, 0.066590145, 0.061043978, -0.008292685, -0.019583363, -0.006212003, -0.053282585, -0.029954918, -0.021437356)); + target += mul(na3, min16float4x3(0.019198919, 0.020138288, 0.02048463, -0.012281223, -0.01964347, -0.010557296, 0.00830553, 0.02714052, 0.016606145, -0.0047117253, -0.0060619717, 0.0015284229)); + target += mul(nb3, min16float4x3(-0.01620369, -0.018634152, -0.018486649, -0.0037721654, -0.005256878, -0.0032221128, 0.048627518, 0.033200823, 0.05459796, 0.0064762663, 0.005607537, 0.0014544157)); + target += mul(nc3, min16float4x3(-0.0049319286, -0.003757374, -0.008033526, -0.009529666, -0.01023788, -0.011724289, 0.08779079, 0.11368912, 0.10699827, 0.014564745, 0.017019482, 0.018130492)); + target += mul(nd3, min16float4x3(-0.018128838, -0.020529313, -0.021291668, 0.022232227, 0.032956265, 0.030233478, 0.057042982, 0.052126013, 0.039634123, 0.04395578, 0.042147905, 0.047779605)); + target += mul(ne3, min16float4x3(-0.008916549, -0.011398656, -0.006473247, 0.07594334, 0.07910866, 0.0726948, -0.1670962, -0.17030263, -0.18856722, 0.0067814733, 0.01550948, 0.002108076)); + target += mul(nf3, min16float4x3(-0.0020052418, -0.0015789939, 0.0024248413, -0.018381692, -0.012541983, -0.016114611, -0.054943718, -0.08546223, -0.045788202, -0.02116913, -0.02479526, -0.02281286)); + target += mul(ng3, min16float4x3(0.004089441, 0.004577225, 0.009165186, -0.023352642, -0.03344756, -0.03359231, 0.051127084, 0.055484984, 0.06788994, -0.009284511, -0.0026670755, -0.011205212)); + target += mul(nh3, min16float4x3(-0.008048874, -0.003658728, -0.011127851, 0.0034879802, 0.014905489, 0.016252292, -0.07353042, -0.0754597, -0.09509333, 0.009990113, -0.0003871956, 0.0049740863)); + target += mul(ni3, min16float4x3(0.009073377, 0.006138898, 0.006741848, -0.009877169, -0.019738095, -0.015525384, 0.057441086, 0.06538757, 0.053950094, -0.0011834118, 0.0010558038, 0.004649949)); + target += min16float3(-0.008654677, -0.008960475, -0.009207461); + + OUTPUT[gxy] = float4(target + INPUT.SampleLevel(sam1, pos, 0).rgb, 1); +} diff --git a/src/Effects/Anime4K/Anime4K_Upscale_GAN_x2_S.hlsl b/src/Effects/Anime4K/Anime4K_Upscale_GAN_x2_S.hlsl index f9d49cf48..0ee08c7aa 100644 --- a/src/Effects/Anime4K/Anime4K_Upscale_GAN_x2_S.hlsl +++ b/src/Effects/Anime4K/Anime4K_Upscale_GAN_x2_S.hlsl @@ -1,8 +1,9 @@ // Anime4K_Upscale_GAN_x2_S -// 移植自 https://github.com/bloc97/Anime4K/blob/master/glsl/Upscale/Anime4K_Upscale_GAN_x2_S.glsl +// 移植自 https://github.com/bloc97/Anime4K/blob/8e39551ce96ed172605c89b7dd8be855b5502cc9/glsl/Upscale/Anime4K_Upscale_GAN_x2_S.glsl //!MAGPIE EFFECT //!VERSION 4 +//!SORT_NAME Anime4K_Upscale_GAN_x2_1 //!TEXTURE Texture2D INPUT; diff --git a/src/Effects/Anime4K/Anime4K_Upscale_GAN_x3_L.hlsl b/src/Effects/Anime4K/Anime4K_Upscale_GAN_x3_L.hlsl index ff02f64ae..1ea2119d1 100644 --- a/src/Effects/Anime4K/Anime4K_Upscale_GAN_x3_L.hlsl +++ b/src/Effects/Anime4K/Anime4K_Upscale_GAN_x3_L.hlsl @@ -12,7 +12,7 @@ // 9_tf, 9_tf1, 9_tf2, (1_tf), (4_tf), (7_tf) -> 11_tf, 10_tf, 12_tf, 12_tf1, 12_tf2 // 12_tf, 12_tf1, 12_tf2, 11_tf, (1_tf), (4_tf), (7_tf), (10_tf) -> 0ups, 0ups1, 0ups2 // 0ups, 0ups1, 0ups2 -> 1ups, 1ups1 -// INPUT, 1ups, 1ups1 -> OUTPUT +// (INPUT), 1ups, 1ups1 -> OUTPUT //!TEXTURE Texture2D INPUT; diff --git a/src/Effects/Effects.vcxproj b/src/Effects/Effects.vcxproj index 0e93377ba..7538cce38 100644 --- a/src/Effects/Effects.vcxproj +++ b/src/Effects/Effects.vcxproj @@ -409,5 +409,10 @@ Document + + + Document + + \ No newline at end of file diff --git a/src/Effects/Effects.vcxproj.filters b/src/Effects/Effects.vcxproj.filters index 1de33b9df..9fb781e2c 100644 --- a/src/Effects/Effects.vcxproj.filters +++ b/src/Effects/Effects.vcxproj.filters @@ -357,6 +357,9 @@ Anime4K + + Anime4K + From df92b3512dfc8a74bcb4b9ede0b204af7d178712 Mon Sep 17 00:00:00 2001 From: Xu <34770031+Blinue@users.noreply.github.com> Date: Thu, 14 Mar 2024 19:53:52 +0800 Subject: [PATCH 110/155] =?UTF-8?q?=E5=9C=A8=E5=8F=A0=E5=8A=A0=E5=B1=82?= =?UTF-8?q?=E4=B8=AD=E6=98=BE=E7=A4=BA=E6=95=88=E6=9E=9C=E5=A4=84=E7=90=86?= =?UTF-8?q?=E6=97=B6=E9=97=B4=20(#821)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: 支持查询每个效果的渲染时间 * feat: 支持在叠加层中显示渲染时间 * feat: 降低渲染时间更新频率 * chore: 添加注释 * fix: 缓解文字跳跃 * UI: 调整布局 * UI: 优化文字换行 * fix: 优化渲染 * UI: 竖直居中时间线中文字 * chore: 修复编译警告 --- src/Magpie.App/conanfile.txt | 2 +- src/Magpie.Core/EffectDrawer.cpp | 4 +- src/Magpie.Core/EffectDrawer.h | 3 +- src/Magpie.Core/EffectsProfiler.cpp | 99 +++ src/Magpie.Core/EffectsProfiler.h | 42 ++ src/Magpie.Core/ImGuiImpl.cpp | 4 +- src/Magpie.Core/Magpie.Core.vcxproj | 2 + src/Magpie.Core/Magpie.Core.vcxproj.filters | 2 + src/Magpie.Core/OverlayDrawer.cpp | 640 +++++++++++++++++++- src/Magpie.Core/OverlayDrawer.h | 30 +- src/Magpie.Core/Renderer.cpp | 107 +++- src/Magpie.Core/Renderer.h | 16 +- src/Magpie.Core/ScalingWindow.cpp | 2 +- 13 files changed, 893 insertions(+), 60 deletions(-) create mode 100644 src/Magpie.Core/EffectsProfiler.cpp create mode 100644 src/Magpie.Core/EffectsProfiler.h diff --git a/src/Magpie.App/conanfile.txt b/src/Magpie.App/conanfile.txt index f0e8967ad..b59cb4412 100644 --- a/src/Magpie.App/conanfile.txt +++ b/src/Magpie.App/conanfile.txt @@ -6,7 +6,7 @@ rapidjson/cci.20230929 kuba-zip/0.3.1 muparser/2.3.4 yas/7.1.0 -imgui/1.90 +imgui/1.90.4 [generators] MSBuildDeps diff --git a/src/Magpie.Core/EffectDrawer.cpp b/src/Magpie.Core/EffectDrawer.cpp index 2709ec78d..2ccc97e64 100644 --- a/src/Magpie.Core/EffectDrawer.cpp +++ b/src/Magpie.Core/EffectDrawer.cpp @@ -10,6 +10,7 @@ #include "DirectXHelper.h" #include "ScalingWindow.h" #include "BackendDescriptorStore.h" +#include "EffectsProfiler.h" #pragma push_macro("_UNICODE") // Conan 的 muparser 不含 UNICODE 支持 @@ -250,7 +251,7 @@ bool EffectDrawer::Initialize( return true; } -void EffectDrawer::Draw() const noexcept { +void EffectDrawer::Draw(EffectsProfiler& profiler) const noexcept { { ID3D11Buffer* t = _constantBuffer.get(); _d3dDC->CSSetConstantBuffers(0, 1, &t); @@ -259,6 +260,7 @@ void EffectDrawer::Draw() const noexcept { for (uint32_t i = 0; i < _dispatches.size(); ++i) { _DrawPass(i); + profiler.OnEndPass(_d3dDC); } } diff --git a/src/Magpie.Core/EffectDrawer.h b/src/Magpie.Core/EffectDrawer.h index d69043d27..b2bec6d64 100644 --- a/src/Magpie.Core/EffectDrawer.h +++ b/src/Magpie.Core/EffectDrawer.h @@ -8,6 +8,7 @@ namespace Magpie::Core { struct EffectOption; class DeviceResources; class BackendDescriptorStore; +class EffectsProfiler; class EffectDrawer { public: @@ -23,7 +24,7 @@ class EffectDrawer { ID3D11Texture2D** inOutTexture ) noexcept; - void Draw() const noexcept; + void Draw(EffectsProfiler& profiler) const noexcept; private: bool _InitializeConstants( diff --git a/src/Magpie.Core/EffectsProfiler.cpp b/src/Magpie.Core/EffectsProfiler.cpp new file mode 100644 index 000000000..da1e8f63d --- /dev/null +++ b/src/Magpie.Core/EffectsProfiler.cpp @@ -0,0 +1,99 @@ +#include "pch.h" +#include "EffectsProfiler.h" +#include "DeviceResources.h" +#include + +namespace Magpie::Core { + +void EffectsProfiler::Start(ID3D11Device* d3dDevice, uint32_t passCount) { + assert(_passQueries.empty()); + _passQueries.resize(passCount); + + D3D11_QUERY_DESC desc{ .Query = D3D11_QUERY_TIMESTAMP_DISJOINT }; + d3dDevice->CreateQuery(&desc, _disjointQuery.put()); + + desc.Query = D3D11_QUERY_TIMESTAMP; + d3dDevice->CreateQuery(&desc, _startQuery.put()); + for (winrt::com_ptr& query : _passQueries) { + d3dDevice->CreateQuery(&desc, query.put()); + } +} + +void EffectsProfiler::Stop() { + _disjointQuery = nullptr; + _startQuery = nullptr; + _passQueries.clear(); +} + +void EffectsProfiler::OnBeginEffects(ID3D11DeviceContext* d3dDC) { + if (_passQueries.empty()) { + return; + } + + d3dDC->Begin(_disjointQuery.get()); + d3dDC->End(_startQuery.get()); + + _curPass = 0; +} + +void EffectsProfiler::OnEndPass(ID3D11DeviceContext* d3dDC) { + if (_passQueries.empty()) { + return; + } + + d3dDC->End(_passQueries[_curPass++].get()); +} + +void EffectsProfiler::OnEndEffects(ID3D11DeviceContext* d3dDC) { + if (_passQueries.empty()) { + return; + } + + d3dDC->End(_disjointQuery.get()); +} + +template +static T GetQueryData(ID3D11DeviceContext* d3dDC, ID3D11Query* query) noexcept { + T data{}; + while (d3dDC->GetData(query, &data, sizeof(data), 0) != S_OK) { + Sleep(0); + } + return data; +} + +void EffectsProfiler::QueryTimings(ID3D11DeviceContext* d3dDC) noexcept { + if (_passQueries.empty()) { + return; + } + + D3D11_QUERY_DATA_TIMESTAMP_DISJOINT disjointData = + GetQueryData(d3dDC, _disjointQuery.get()); + + if (disjointData.Disjoint) { + return; + } + + const float toMS = 1000.0f / disjointData.Frequency; + + uint64_t prevTimestamp = GetQueryData(d3dDC, _startQuery.get()); + + std::scoped_lock lk(_timingsMutex); + _timings.resize(_passQueries.size()); + for (size_t i = 0; i < _passQueries.size(); ++i) { + uint64_t timestamp = GetQueryData(d3dDC, _passQueries[i].get()); + _timings[i] = (timestamp - prevTimestamp) * toMS; + + prevTimestamp = timestamp; + } +} + +SmallVector EffectsProfiler::GetTimings() noexcept { + std::scoped_lock lk(_timingsMutex); + + // 没有渲染新帧时 _timings 为空 + SmallVector result = std::move(_timings); + _timings.clear(); + return result; +} + +} diff --git a/src/Magpie.Core/EffectsProfiler.h b/src/Magpie.Core/EffectsProfiler.h new file mode 100644 index 000000000..b39f0e1dc --- /dev/null +++ b/src/Magpie.Core/EffectsProfiler.h @@ -0,0 +1,42 @@ +#pragma once +#include "SmallVector.h" +#include "Win32Utils.h" + +namespace Magpie::Core { + +class DeviceResources; + +class EffectsProfiler { +public: + EffectsProfiler() = default; + + EffectsProfiler(const EffectsProfiler&) = delete; + EffectsProfiler(EffectsProfiler&&) = delete; + + void Start(ID3D11Device* d3dDevice, uint32_t passCount); + + void Stop(); + + void OnBeginEffects(ID3D11DeviceContext* d3dDC); + + void OnEndPass(ID3D11DeviceContext* d3dDC); + + void OnEndEffects(ID3D11DeviceContext* d3dDC); + + void QueryTimings(ID3D11DeviceContext* d3dDC) noexcept; + + // 从前端线程调用 + SmallVector GetTimings() noexcept; + +private: + SmallVector _timings; + Win32Utils::SRWMutex _timingsMutex; + + winrt::com_ptr _disjointQuery; + winrt::com_ptr _startQuery; + std::vector> _passQueries; + + uint32_t _curPass = 0; +}; + +} diff --git a/src/Magpie.Core/ImGuiImpl.cpp b/src/Magpie.Core/ImGuiImpl.cpp index f2b75353b..781130847 100644 --- a/src/Magpie.Core/ImGuiImpl.cpp +++ b/src/Magpie.Core/ImGuiImpl.cpp @@ -89,7 +89,6 @@ bool ImGuiImpl::Initialize(DeviceResources* deviceResources) noexcept { ImGuiIO& io = ImGui::GetIO(); io.BackendPlatformUserData = nullptr; io.BackendPlatformName = "Magpie"; - io.ImeWindowHandle = ScalingWindow::Get().Handle(); io.ConfigFlags |= ImGuiConfigFlags_NavNoCaptureKeyboard | ImGuiConfigFlags_NoMouseCursorChange; if (!_backend.Initialize(deviceResources)) { @@ -174,6 +173,7 @@ void ImGuiImpl::Draw() noexcept { const RECT& scalingRect = ScalingWindow::Get().WndRect(); const RECT& destRect = ScalingWindow::Get().Renderer().DestRect(); + ImGui::Render(); ImDrawData& drawData = *ImGui::GetDrawData(); drawData.DisplayPos = ImVec2( float(scalingRect.left - destRect.left), @@ -217,7 +217,7 @@ void ImGuiImpl::Tooltip(const char* content, float maxWidth) noexcept { void ImGuiImpl::_UpdateMousePos() noexcept { ImGuiIO& io = ImGui::GetIO(); - /*if (ScalingWindow::Get().Options().Is3DGameMode() && !MagApp::Get().GetRenderer().IsUIVisiable()) { + /*if (ScalingWindow::Get().Options().Is3DGameMode() && !MagApp::Get().GetRenderer().IsUIVisible()) { io.MousePos = ImVec2(-FLT_MAX, -FLT_MAX); return; } diff --git a/src/Magpie.Core/Magpie.Core.vcxproj b/src/Magpie.Core/Magpie.Core.vcxproj index 8de0b640f..bae8e4658 100644 --- a/src/Magpie.Core/Magpie.Core.vcxproj +++ b/src/Magpie.Core/Magpie.Core.vcxproj @@ -55,6 +55,7 @@ + @@ -85,6 +86,7 @@ + diff --git a/src/Magpie.Core/Magpie.Core.vcxproj.filters b/src/Magpie.Core/Magpie.Core.vcxproj.filters index a190db757..e8797d7e8 100644 --- a/src/Magpie.Core/Magpie.Core.vcxproj.filters +++ b/src/Magpie.Core/Magpie.Core.vcxproj.filters @@ -88,6 +88,7 @@ Overlay + @@ -138,6 +139,7 @@ Overlay + diff --git a/src/Magpie.Core/OverlayDrawer.cpp b/src/Magpie.Core/OverlayDrawer.cpp index eb68b2651..024cafda0 100644 --- a/src/Magpie.Core/OverlayDrawer.cpp +++ b/src/Magpie.Core/OverlayDrawer.cpp @@ -17,10 +17,145 @@ namespace Magpie::Core { +static const char* COLOR_INDICATOR = "■"; +static const wchar_t COLOR_INDICATOR_W = L'■'; + OverlayDrawer::OverlayDrawer() : _resourceLoader(winrt::ResourceLoader::GetForViewIndependentUse(CommonSharedConstants::APP_RESOURCE_MAP_ID)) {} +static constexpr const ImColor TIMELINE_COLORS[] = { + {229,57,53,255}, + {156,39,176,255}, + {63,81,181,255}, + {30,136,229,255}, + {0,137,123,255}, + {121,85,72,255}, + {117,117,117,255} +}; + +static uint32_t GetSeed(const std::vector& effectInfos) noexcept { + uint32_t result = 0; + for (const Renderer::EffectInfo& effectInfo : effectInfos) { + result ^= (uint32_t)std::hash()(effectInfo.name); + } + return result; +} + +static SmallVector GenerateTimelineColors(const std::vector& effectInfos) noexcept { + const uint32_t nEffect = (uint32_t)effectInfos.size(); + uint32_t totalColors = nEffect > 1 ? nEffect : 0; + for (uint32_t i = 0; i < nEffect; ++i) { + uint32_t nPass = (uint32_t)effectInfos[i].passNames.size(); + if (nPass > 1) { + totalColors += nPass; + } + } + + if (totalColors == 0) { + return {}; + } + + constexpr uint32_t nColors = (uint32_t)std::size(TIMELINE_COLORS); + + std::default_random_engine randomEngine(GetSeed(effectInfos)); + SmallVector result; + + if (totalColors <= nColors) { + result.resize(nColors); + for (uint32_t i = 0; i < nColors; ++i) { + result[i] = i; + } + std::shuffle(result.begin(), result.end(), randomEngine); + + result.resize(totalColors); + } else { + // 相邻通道颜色不同,相邻效果颜色不同 + result.resize(totalColors); + std::uniform_int_distribution uniformDst(0, nColors - 1); + + if (nEffect <= nColors) { + if (nEffect > 1) { + // 确保效果的颜色不重复 + std::array effectColors{}; + for (uint32_t i = 0; i < nColors; ++i) { + effectColors[i] = i; + } + std::shuffle(effectColors.begin(), effectColors.end(), randomEngine); + + uint32_t i = 0; + for (uint32_t j = 0; j < nEffect; ++j) { + result[i] = effectColors[j]; + ++i; + + uint32_t nPass = (uint32_t)effectInfos[j].passNames.size(); + if (nPass > 1) { + i += nPass; + } + } + } + } else { + // 仅确保与前一个效果颜色不同 + uint32_t prevColor = std::numeric_limits::max(); + uint32_t i = 0; + for (uint32_t j = 0; j < nEffect; ++j) { + uint32_t c = uniformDst(randomEngine); + while (c == prevColor) { + c = uniformDst(randomEngine); + } + + result[i] = c; + prevColor = c; + ++i; + + uint32_t nPass = (uint32_t)effectInfos[j].passNames.size(); + if (nPass > 1) { + i += nPass; + } + } + } + + // 生成通道的颜色 + size_t idx = 0; + for (uint32_t i = 0; i < nEffect; ++i) { + uint32_t nPass = (uint32_t)effectInfos[i].passNames.size(); + + if (nEffect > 1) { + ++idx; + + if (nPass == 1) { + continue; + } + } + + for (uint32_t j = 0; j < nPass; ++j) { + uint32_t c = uniformDst(randomEngine); + + if (i > 0 || j > 0) { + uint32_t prevColor = (i > 0 && j == 0) ? result[idx - 2] : result[idx - 1]; + + if (j + 1 == nPass && i + 1 != nEffect && effectInfos[(size_t)i + 1].passNames.size() == 1) { + // 当前效果的最后一个通道且下一个效果只有一个通道 + uint32_t nextColor = result[idx + 1]; + while (c == prevColor || c == nextColor) { + c = uniformDst(randomEngine); + } + } else { + while (c == prevColor) { + c = uniformDst(randomEngine); + } + } + } + + result[idx] = c; + ++idx; + } + } + } + + return result; +} + bool OverlayDrawer::Initialize(DeviceResources* deviceResources) noexcept { HWND hwndSrc = ScalingWindow::Get().HwndSrc(); _isSrcMainWnd = Win32Utils::GetWndClassName(hwndSrc) == CommonSharedConstants::MAIN_WINDOW_CLASS_NAME; @@ -45,18 +180,29 @@ bool OverlayDrawer::Initialize(DeviceResources* deviceResources) noexcept { return false; } + // 将 _fontUI 设为默认字体 + ImGui::GetIO().FontDefault = _fontUI; + // 获取硬件信息 DXGI_ADAPTER_DESC desc{}; HRESULT hr = deviceResources->GetGraphicsAdapter()->GetDesc(&desc); _hardwareInfo.gpuName = SUCCEEDED(hr) ? StrUtils::UTF16ToUTF8(desc.Description) : "UNAVAILABLE"; - // 将 _fontUI 设为默认字体 - ImGui::GetIO().FontDefault = _fontUI; + const std::vector& effectInfos = + ScalingWindow::Get().Renderer().EffectInfos(); + _timelineColors = GenerateTimelineColors(effectInfos); + + uint32_t passCount = 0; + for (const Renderer::EffectInfo& info : effectInfos) { + passCount += (uint32_t)info.passNames.size(); + } + _effectTimingsStatistics.resize(passCount); + _lastestAvgEffectTimings.resize(passCount); return true; } -void OverlayDrawer::Draw(uint32_t count) noexcept { +void OverlayDrawer::Draw(uint32_t count, const SmallVector& effectTimings) noexcept { bool isShowFPS = ScalingWindow::Get().Options().IsShowFPS(); if (!_isUIVisiable && !isShowFPS) { @@ -69,7 +215,8 @@ void OverlayDrawer::Draw(uint32_t count) noexcept { count = 3; } - for (uint32_t i = 0; i < count; ++i) { + // 很多时候需要多次渲染避免呈现中间状态,但最多只渲染 10 次 + for (int i = 0; i < 10; ++i) { _imguiImpl.NewFrame(); if (isShowFPS) { @@ -77,10 +224,17 @@ void OverlayDrawer::Draw(uint32_t count) noexcept { } if (_isUIVisiable) { - _DrawUI(); + if (_DrawUI(effectTimings)) { + ++count; + } } - ImGui::Render(); + // 中间状态不应执行渲染,因此调用 EndFrame 而不是 Render + ImGui::EndFrame(); + + if (--count == 0) { + break; + } } _imguiImpl.Draw(); @@ -230,7 +384,7 @@ void OverlayDrawer::_BuildFontUI( extraRanges = fontAtlas.GetGlyphRangesKorean(); } } - builder.SetBit(L'■'); + builder.SetBit(COLOR_INDICATOR_W); builder.BuildRanges(&uiRanges); ImFontConfig config; @@ -321,39 +475,239 @@ void OverlayDrawer::_BuildFontFPS(const std::vector& fontData) noexcept (void*)fontData.data(), (int)fontData.size(), fpsSize, &config, (const ImWchar*)L" FFPPSS"); } -int OverlayDrawer::_DrawEffectTimings(const _EffectTimings& /*et*/, bool /*showPasses*/, float /*maxWindowWidth*/, std::span /*colors*/, bool /*singleEffect*/) noexcept { - return 0; +static std::string_view GetEffectDisplayName(const Renderer::EffectInfo* effectInfo) noexcept { + auto delimPos = effectInfo->name.find_last_of('\\'); + if (delimPos == std::string::npos) { + return effectInfo->name; + } else { + return std::string_view(effectInfo->name.begin() + delimPos + 1, effectInfo->name.end()); + } +} + +bool OverlayDrawer::_DrawTimingItem( + const char* text, + const ImColor* color, + float time, + bool isExpanded +) const noexcept { + ImGui::TableNextRow(); + ImGui::TableNextColumn(); + + const std::string timeStr = fmt::format("{:.3f} ms", time); + const float timeWidth = _fontMonoNumbers->CalcTextSizeA( + ImGui::GetFontSize(), FLT_MAX, 0.0f, timeStr.c_str()).x; + + // 计算布局 + static constexpr float spacingBeforeText = 3; + static constexpr float spacingAfterText = 8; + const float descWrapPos = ImGui::GetCursorPosX() + ImGui::GetContentRegionAvail().x - timeWidth - spacingAfterText; + const float descHeight = ImGui::CalcTextSize( + text, nullptr, false, descWrapPos - ImGui::GetCursorPosX() - (color ? ImGui::CalcTextSize(COLOR_INDICATOR).x + spacingBeforeText : 0)).y; + + const float fontHeight = ImGui::GetFont()->FontSize; + + bool isHovered = false; + if (color) { + ImGui::Selectable("", false, 0, ImVec2(0, descHeight)); + if (ImGui::IsItemHovered()) { + isHovered = true; + } + ImGui::SameLine(0, 0); + + ImGui::PushStyleColor(ImGuiCol_Text, (ImU32)*color); + + if (descHeight >= fontHeight * 2) { + // 不知为何 SetCursorPos 不起作用 + // 所以这里使用占位竖直居中颜色框 + ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2()); + ImGui::BeginGroup(); + ImGui::Dummy(ImVec2(0, (descHeight - fontHeight) / 2)); + ImGui::TextUnformatted(COLOR_INDICATOR); + ImGui::EndGroup(); + ImGui::PopStyleVar(); + } else { + ImGui::TextUnformatted(COLOR_INDICATOR); + } + ImGui::PopStyleColor(); + + ImGui::SameLine(0, spacingBeforeText); + } + + ImGui::PushTextWrapPos(descWrapPos); + ImGui::TextUnformatted(text); + ImGui::PopTextWrapPos(); + ImGui::SameLine(0, 0); + + // 描述过长导致换行时竖直居中时间 + if (color && descHeight >= fontHeight * 2) { + ImGui::SetCursorPosY(ImGui::GetCursorPosY() + (descHeight - fontHeight) / 2); + } + + if (isExpanded) { + ImGui::PushStyleColor(ImGuiCol_Text, ImVec4(1, 1, 1, 0.5f)); + } + + ImGui::PushFont(_fontMonoNumbers); + ImGui::SetCursorPosX(descWrapPos + spacingAfterText); + ImGui::TextUnformatted(timeStr.c_str()); + ImGui::PopFont(); + + if (isExpanded) { + ImGui::PopStyleColor(); + } + + return isHovered; +} + +// 返回鼠标悬停的项的序号,未悬停于任何项返回 -1 +int OverlayDrawer::_DrawEffectTimings( + const _EffectDrawInfo& drawInfo, + bool showPasses, + std::span colors, + bool singleEffect +) const noexcept { + int result = -1; + + showPasses &= drawInfo.passTimings.size() > 1; + if (_DrawTimingItem( + std::string(GetEffectDisplayName(drawInfo.info)).c_str(), + (!singleEffect && !showPasses) ? &colors[0] : nullptr, + drawInfo.totalTime, + showPasses + )) { + result = 0; + } + + if (showPasses) { + for (size_t j = 0; j < drawInfo.passTimings.size(); ++j) { + ImGui::Indent(16); + + if (_DrawTimingItem( + drawInfo.info->passNames[j].c_str(), + &colors[j], + drawInfo.passTimings[j] + )) { + result = (int)j; + } + + ImGui::Unindent(16); + } + } + + return result; } -void OverlayDrawer::_DrawTimelineItem(ImU32 /*color*/, float /*dpiScale*/, std::string_view /*name*/, float /*time*/, float /*effectsTotalTime*/, bool /*selected*/) { +void OverlayDrawer::_DrawTimelineItem( + ImU32 color, + float dpiScale, + std::string_view name, + float time, + float effectsTotalTime, + bool selected +) { + ImGui::TableSetBgColor(ImGuiTableBgTarget_CellBg, color); + ImGui::PushStyleColor(ImGuiCol_HeaderActive, color); + ImGui::PushStyleColor(ImGuiCol_HeaderHovered, color); + ImGui::PushStyleColor(ImGuiCol_Header, color); + ImGui::Selectable("", selected); + ImGui::PopStyleColor(3); + + if (ImGui::IsItemHovered() || ImGui::IsItemClicked()) { + std::string content = fmt::format("{}\n{:.3f} ms\n{}%", name, time, std::lroundf(time / effectsTotalTime * 100)); + ImGui::PushFont(_fontMonoNumbers); + ImGuiImpl::Tooltip(content.c_str(), 500 * dpiScale); + ImGui::PopFont(); + } + + // 空间足够时显示文字 + std::string text; + if (selected) { + text = fmt::format("{}%", std::lroundf(time / effectsTotalTime * 100)); + } else { + text.assign(name); + } + + float textWidth = ImGui::CalcTextSize(text.c_str()).x; + float itemWidth = ImGui::GetItemRectSize().x; + float itemSpacing = ImGui::GetStyle().ItemSpacing.x; + if (itemWidth - (selected ? 0 : itemSpacing) > textWidth + 4 * _dpiScale) { + ImGui::SameLine(0, 0); + ImGui::SetCursorPosX(ImGui::GetCursorPosX() + (itemWidth - textWidth - itemSpacing) / 2); + // 竖直方向居中 + ImGui::SetCursorPosY(ImGui::GetCursorPosY() - 0.5f * _dpiScale); + ImGui::TextUnformatted(text.c_str()); + } } void OverlayDrawer::_DrawFPS() noexcept { } -void OverlayDrawer::_DrawUI() noexcept { +// 返回 true 表示应再渲染一次 +bool OverlayDrawer::_DrawUI(const SmallVector& effectTimings) noexcept { const ScalingOptions& options = ScalingWindow::Get().Options(); const Renderer& renderer = ScalingWindow::Get().Renderer(); - //auto& gpuTimer = renderer(); + + const uint32_t passCount = (uint32_t)_effectTimingsStatistics.size(); + + bool needRedraw = false; + + // effectTimings 为空表示后端没有渲染新的帧 + if (!effectTimings.empty()) { + using namespace std::chrono; + steady_clock::time_point now = steady_clock::now(); + if (_lastUpdateTime == steady_clock::time_point{}) { + // 后端渲染的第一帧 + _lastUpdateTime = now; + + for (uint32_t i = 0; i < passCount; ++i) { + _lastestAvgEffectTimings[i] = effectTimings[i]; + } + } else { + if (now - _lastUpdateTime > 500ms) { + // 更新间隔不少于 500ms,而不是 500ms 更新一次 + _lastUpdateTime = now; + + for (uint32_t i = 0; i < passCount; ++i) { + auto& [total, count] = _effectTimingsStatistics[i]; + if (count > 0) { + _lastestAvgEffectTimings[i] = total / count; + } + + count = 0; + total = 0; + } + } + + for (uint32_t i = 0; i < passCount; ++i) { + auto& [total, count] = _effectTimingsStatistics[i]; + // 有时会跳过某些效果的渲染,即渲染时间为 0,这时不应计入 + if (effectTimings[i] > 1e-3) { + ++count; + total += effectTimings[i]; + } + } + } + } #ifdef _DEBUG ImGui::ShowDemoWindow(); #endif - const float maxWindowWidth = 400 * _dpiScale; - ImGui::SetNextWindowSizeConstraints(ImVec2(), ImVec2(maxWindowWidth, 500 * _dpiScale)); + { + const float windowWidth = 310 * _dpiScale; + ImGui::SetNextWindowSizeConstraints(ImVec2(windowWidth, 0.0f), ImVec2(windowWidth, 500 * _dpiScale)); - static float initPosX = Win32Utils::GetSizeOfRect(renderer.DestRect()).cx - maxWindowWidth; - ImGui::SetNextWindowPos(ImVec2(initPosX, 20), ImGuiCond_FirstUseEver); + static float initPosX = Win32Utils::GetSizeOfRect(renderer.DestRect()).cx - windowWidth; + ImGui::SetNextWindowPos(ImVec2(initPosX, 20), ImGuiCond_FirstUseEver); + } std::string profilerStr = _GetResourceString(L"Overlay_Profiler"); if (!ImGui::Begin(profilerStr.c_str(), nullptr, ImGuiWindowFlags_NoNav | ImGuiWindowFlags_AlwaysAutoResize)) { ImGui::End(); - return; + return needRedraw; } - // 始终为滚动条预留空间 - ImGui::PushTextWrapPos(maxWindowWidth - ImGui::GetStyle().WindowPadding.x - ImGui::GetStyle().ScrollbarSize); + ImGui::PushTextWrapPos(); ImGui::TextUnformatted(StrUtils::Concat("GPU: ", _hardwareInfo.gpuName).c_str()); const std::string& captureMethodStr = _GetResourceString(L"Overlay_Profiler_CaptureMethod"); ImGui::TextUnformatted(StrUtils::Concat(captureMethodStr.c_str(), ": ", renderer.FrameSource().Name()).c_str()); @@ -370,8 +724,256 @@ void OverlayDrawer::_DrawUI() noexcept { } ImGui::PopTextWrapPos(); + ImGui::Spacing(); + const std::string& timingsStr = _GetResourceString(L"Overlay_Profiler_Timings"); + if (ImGui::CollapsingHeader(timingsStr.c_str(), ImGuiTreeNodeFlags_DefaultOpen)) { + const std::vector& effectInfos = renderer.EffectInfos(); + const uint32_t nEffect = (uint32_t)effectInfos.size(); + + SmallVector<_EffectDrawInfo, 4> effectDrawInfos(effectInfos.size()); + + { + uint32_t idx = 0; + for (uint32_t i = 0; i < nEffect; ++i) { + auto& effectTiming = effectDrawInfos[i]; + effectTiming.info = &effectInfos[i]; + + uint32_t nPass = (uint32_t)effectTiming.info->passNames.size(); + effectTiming.passTimings = { _lastestAvgEffectTimings.begin() + idx, nPass }; + idx += nPass; + + for (float t : effectTiming.passTimings) { + effectTiming.totalTime += t; + } + } + } + + float effectsTotalTime = 0.0f; + for (const _EffectDrawInfo& drawInfo : effectDrawInfos) { + effectsTotalTime += drawInfo.totalTime; + } + + bool showSwitchButton = false; + for (const _EffectDrawInfo& drawInfo : effectDrawInfos) { + // 某个效果有多个通道,显示切换按钮 + if (drawInfo.passTimings.size() > 1) { + showSwitchButton = true; + break; + } + } + + static bool showPasses = false; + if (showSwitchButton) { + ImGui::Spacing(); + const std::string& buttonStr = _GetResourceString(showPasses + ? L"Overlay_Profiler_Timings_SwitchToEffects" + : L"Overlay_Profiler_Timings_SwitchToPasses"); + if (ImGui::Button(buttonStr.c_str())) { + showPasses = !showPasses; + // 需要再次渲染以处理滚动条导致的布局变化 + needRedraw = true; + } + } else { + showPasses = false; + } + + SmallVector colors; + colors.reserve(_timelineColors.size()); + if (nEffect == 1) { + colors.resize(_timelineColors.size()); + for (size_t i = 0; i < _timelineColors.size(); ++i) { + colors[i] = TIMELINE_COLORS[_timelineColors[i]]; + } + } else if (showPasses) { + uint32_t i = 0; + for (const _EffectDrawInfo& drawInfo : effectDrawInfos) { + if (drawInfo.passTimings.size() == 1) { + colors.push_back(TIMELINE_COLORS[_timelineColors[i]]); + ++i; + continue; + } + + ++i; + for (uint32_t j = 0; j < drawInfo.passTimings.size(); ++j) { + colors.push_back(TIMELINE_COLORS[_timelineColors[i]]); + ++i; + } + } + } else { + size_t i = 0; + for (const _EffectDrawInfo& drawInfo : effectDrawInfos) { + colors.push_back(TIMELINE_COLORS[_timelineColors[i]]); + + ++i; + if (drawInfo.passTimings.size() > 1) { + i += drawInfo.passTimings.size(); + } + } + } + + static int selectedIdx = -1; + + if (nEffect > 1 || showPasses) { + ImGui::Spacing(); + ImGui::PushStyleVar(ImGuiStyleVar_CellPadding, ImVec2(0, 0)); + ImGui::PushStyleVar(ImGuiStyleVar_SelectableTextAlign, ImVec2(0.5f, 0.5f)); + ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(5, 5)); + ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(0, 0)); + + if (effectsTotalTime > 0) { + if (showPasses) { + if (ImGui::BeginTable("timeline", (int)passCount)) { + for (uint32_t i = 0; i < passCount; ++i) { + if (_lastestAvgEffectTimings[i] < 1e-3f) { + continue; + } + + ImGui::TableSetupColumn( + std::to_string(i).c_str(), + ImGuiTableColumnFlags_WidthStretch | ImGuiTableColumnFlags_NoResize | ImGuiTableColumnFlags_NoReorder, + _lastestAvgEffectTimings[i] / effectsTotalTime + ); + } + + ImGui::TableNextRow(); + + uint32_t i = 0; + for (const _EffectDrawInfo& drawInfo : effectDrawInfos) { + for (uint32_t j = 0, end = (uint32_t)drawInfo.passTimings.size(); j < end; ++j) { + if (drawInfo.passTimings[j] < 1e-5f) { + continue; + } + + ImGui::TableNextColumn(); + + std::string name; + if (drawInfo.passTimings.size() == 1) { + name = std::string(GetEffectDisplayName(drawInfo.info)); + } else if (nEffect == 1) { + name = drawInfo.info->passNames[j]; + } else { + name = StrUtils::Concat( + GetEffectDisplayName(drawInfo.info), "/", + drawInfo.info->passNames[j] + ); + } + + _DrawTimelineItem(colors[i], _dpiScale, name, drawInfo.passTimings[j], + effectsTotalTime, selectedIdx == (int)i); + + ++i; + } + } + + ImGui::EndTable(); + } + } else { + if (ImGui::BeginTable("timeline", nEffect)) { + for (uint32_t i = 0; i < nEffect; ++i) { + if (effectDrawInfos[i].totalTime < 1e-5f) { + continue; + } + + ImGui::TableSetupColumn( + std::to_string(i).c_str(), + ImGuiTableColumnFlags_WidthStretch | ImGuiTableColumnFlags_NoResize | ImGuiTableColumnFlags_NoReorder, + effectDrawInfos[i].totalTime / effectsTotalTime + ); + } + + ImGui::TableNextRow(); + + for (uint32_t i = 0; i < nEffect; ++i) { + auto& drawInfo = effectDrawInfos[i]; + if (drawInfo.totalTime < 1e-5f) { + continue; + } + + ImGui::TableNextColumn(); + _DrawTimelineItem( + colors[i], + _dpiScale, + GetEffectDisplayName(drawInfo.info), + drawInfo.totalTime, + effectsTotalTime, + selectedIdx == (int)i + ); + } + + ImGui::EndTable(); + } + } + } else { + // 还未统计出时间时渲染占位 + if (ImGui::BeginTable("timeline", 1)) { + ImGui::TableSetupColumn("0", ImGuiTableColumnFlags_WidthStretch | ImGuiTableColumnFlags_NoResize | ImGuiTableColumnFlags_NoReorder); + ImGui::TableNextRow(); + ImGui::TableNextColumn(); + + ImU32 color = ImColor(); + ImGui::PushStyleColor(ImGuiCol_HeaderActive, color); + ImGui::PushStyleColor(ImGuiCol_HeaderHovered, color); + ImGui::Selectable(""); + ImGui::PopStyleColor(2); + + ImGui::EndTable(); + } + } + + ImGui::PopStyleVar(4); + + ImGui::Spacing(); + } + + selectedIdx = -1; + + if (ImGui::BeginTable("timings", 1, ImGuiTableFlags_PadOuterX)) { + ImGui::TableSetupColumn(nullptr, ImGuiTableColumnFlags_WidthStretch | ImGuiTableColumnFlags_NoResize | ImGuiTableColumnFlags_NoReorder); + + if (nEffect == 1) { + int hovered = _DrawEffectTimings(effectDrawInfos[0], showPasses, colors, true); + if (hovered >= 0) { + selectedIdx = hovered; + } + } else { + size_t idx = 0; + for (const _EffectDrawInfo& effectInfo : effectDrawInfos) { + int idxBegin = (int)idx; + + std::span colorSpan; + if (!showPasses || effectInfo.passTimings.size() == 1) { + colorSpan = std::span(colors.begin() + idx, colors.begin() + idx + 1); + ++idx; + } else { + colorSpan = std::span(colors.begin() + idx, colors.begin() + idx + effectInfo.passTimings.size()); + idx += effectInfo.passTimings.size(); + } + + int hovered = _DrawEffectTimings(effectInfo, showPasses, colorSpan, false); + if (hovered >= 0) { + selectedIdx = idxBegin + hovered; + } + } + } + + ImGui::EndTable(); + } + + if (nEffect > 1) { + ImGui::Separator(); + + if (ImGui::BeginTable("total", 1, ImGuiTableFlags_PadOuterX)) { + ImGui::TableSetupColumn(nullptr, ImGuiTableColumnFlags_WidthStretch | ImGuiTableColumnFlags_NoResize | ImGuiTableColumnFlags_NoReorder); + + _DrawTimingItem(_GetResourceString(L"Overlay_Profiler_Timings_Total").c_str(), nullptr, effectsTotalTime); + ImGui::EndTable(); + } + } + } + ImGui::End(); + return needRedraw; } void OverlayDrawer::_EnableSrcWnd(bool /*enable*/) noexcept { diff --git a/src/Magpie.Core/OverlayDrawer.h b/src/Magpie.Core/OverlayDrawer.h index 82171c07e..ba8ff586b 100644 --- a/src/Magpie.Core/OverlayDrawer.h +++ b/src/Magpie.Core/OverlayDrawer.h @@ -3,6 +3,7 @@ #include "SmallVector.h" #include #include "ImGuiImpl.h" +#include "Renderer.h" namespace Magpie::Core { @@ -14,9 +15,9 @@ class OverlayDrawer { bool Initialize(DeviceResources* deviceResources) noexcept; - void Draw(uint32_t count) noexcept; + void Draw(uint32_t count, const SmallVector& effectTimings) noexcept; - bool IsUIVisiable() const noexcept { + bool IsUIVisible() const noexcept { return _isUIVisiable; } @@ -29,19 +30,31 @@ class OverlayDrawer { void _BuildFontUI(std::wstring_view language, const std::vector& fontData, ImVector& uiRanges) noexcept; void _BuildFontFPS(const std::vector& fontData) noexcept; - struct _EffectTimings { - const struct EffectDesc* desc = nullptr; + struct _EffectDrawInfo { + const Renderer::EffectInfo* info = nullptr; std::span passTimings; float totalTime = 0.0f; }; - int _DrawEffectTimings(const _EffectTimings& et, bool showPasses, float maxWindowWidth, std::span colors, bool singleEffect) noexcept; + bool _DrawTimingItem( + const char* text, + const ImColor* color, + float time, + bool isExpanded = false + ) const noexcept; + + int _DrawEffectTimings( + const _EffectDrawInfo& drawInfo, + bool showPasses, + std::span colors, + bool singleEffect + ) const noexcept; void _DrawTimelineItem(ImU32 color, float dpiScale, std::string_view name, float time, float effectsTotalTime, bool selected = false); void _DrawFPS() noexcept; - void _DrawUI() noexcept; + bool _DrawUI(const SmallVector& effectTimings) noexcept; void _EnableSrcWnd(bool enable) noexcept; @@ -56,6 +69,11 @@ class OverlayDrawer { std::deque _frameTimes; uint32_t _validFrames = 0; + std::chrono::steady_clock::time_point _lastUpdateTime{}; + // (总计时间, 帧数) + SmallVector, 0> _effectTimingsStatistics; + SmallVector _lastestAvgEffectTimings; + SmallVector _timelineColors; struct { diff --git a/src/Magpie.Core/Renderer.cpp b/src/Magpie.Core/Renderer.cpp index 475ffad97..5e3ec86a2 100644 --- a/src/Magpie.Core/Renderer.cpp +++ b/src/Magpie.Core/Renderer.cpp @@ -15,6 +15,7 @@ #include "ScalingWindow.h" #include "OverlayDrawer.h" #include "CursorManager.h" +#include "EffectsProfiler.h" namespace Magpie::Core { @@ -113,7 +114,7 @@ static bool CheckMultiplaneOverlaySupport(IDXGISwapChain4* swapChain) noexcept { } void Renderer::OnCursorVisibilityChanged(bool isVisible) { - _backendThreadDqc.DispatcherQueue().TryEnqueue([this, isVisible]() { + _backendThreadDispatcher.TryEnqueue([this, isVisible]() { _frameSource->OnCursorVisibilityChanged(isVisible); }); } @@ -256,7 +257,8 @@ void Renderer::_FrontendRender(uint32_t imguiFrames) noexcept { // 绘制叠加层 if (_overlayDrawer) { - _overlayDrawer->Draw(imguiFrames); + SmallVector effectsTimings = _effectsProfiler.GetTimings(); + _overlayDrawer->Draw(imguiFrames, effectsTimings); } // 绘制光标 @@ -303,18 +305,31 @@ void Renderer::ToggleOverlay() noexcept { } } - if (_overlayDrawer->IsUIVisiable()) { + if (_overlayDrawer->IsUIVisible()) { _overlayDrawer->SetUIVisibility(false); } else { _overlayDrawer->SetUIVisibility(true); } + // 初始化 EffectsProfiler + _backendThreadDispatcher.TryEnqueue([this, isVisible(_overlayDrawer->IsUIVisible())]() { + if (isVisible) { + uint32_t passCount = 0; + for (const EffectInfo& info : _effectInfos) { + passCount += (uint32_t)info.passNames.size(); + } + _effectsProfiler.Start(_backendResources.GetD3DDevice(), passCount); + } else { + _effectsProfiler.Stop(); + } + }); + // 立即渲染一帧 _FrontendRender(); } bool Renderer::IsOverlayVisible() noexcept { - return _overlayDrawer && _overlayDrawer->IsUIVisiable(); + return _overlayDrawer && _overlayDrawer->IsUIVisible(); } bool Renderer::_InitFrameSource() noexcept { @@ -435,6 +450,19 @@ ID3D11Texture2D* Renderer::_BuildEffects() noexcept { } } + // 初始化 _effectInfos + _effectInfos.resize(effectDescs.size()); + for (size_t i = 0; i < effectDescs.size(); ++i) { + EffectInfo& info = _effectInfos[i]; + EffectDesc& desc = effectDescs[i]; + info.name = std::move(desc.name); + + info.passNames.reserve(desc.passes.size()); + for (EffectPassDesc& passDesc : desc.passes) { + info.passNames.emplace_back(std::move(passDesc.desc)); + } + } + // 输出尺寸大于缩放窗口尺寸则需要降采样 { D3D11_TEXTURE2D_DESC desc; @@ -462,34 +490,40 @@ ID3D11Texture2D* Renderer::_BuildEffects() noexcept { _backendResources, _backendDescriptorStore, &inOutTexture - )) { + )) { Logger::Get().Error("初始化降采样效果失败"); return nullptr; } + + // 为降采样算法生成 EffectInfo + EffectInfo& bicubicEffectInfo = _effectInfos.emplace_back(); + bicubicEffectInfo.name = std::move(bicubicDesc->name); + bicubicEffectInfo.passNames.reserve(bicubicDesc->passes.size()); + for (EffectPassDesc& passDesc : bicubicDesc->passes) { + bicubicEffectInfo.passNames.emplace_back(std::move(passDesc.desc)); + } } } // 初始化所有效果共用的动态常量缓冲区 - { - for (uint32_t i = 0; i < effectDescs.size(); ++i) { - if(effectDescs[i].flags & EffectFlags::UseDynamic) { - _firstDynamicEffectIdx = i; - break; - } + for (uint32_t i = 0; i < effectDescs.size(); ++i) { + if(effectDescs[i].flags & EffectFlags::UseDynamic) { + _firstDynamicEffectIdx = i; + break; } - - if (_firstDynamicEffectIdx != std::numeric_limits::max()) { - D3D11_BUFFER_DESC bd{}; - bd.Usage = D3D11_USAGE_DYNAMIC; - bd.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; - bd.ByteWidth = 16; // 只用 4 个字节 - bd.BindFlags = D3D11_BIND_CONSTANT_BUFFER; - - HRESULT hr = _backendResources.GetD3DDevice()->CreateBuffer(&bd, nullptr, _dynamicCB.put()); - if (FAILED(hr)) { - Logger::Get().ComError("CreateBuffer 失败", hr); - return nullptr; - } + } + + if (_firstDynamicEffectIdx != std::numeric_limits::max()) { + D3D11_BUFFER_DESC bd{}; + bd.Usage = D3D11_USAGE_DYNAMIC; + bd.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; + bd.ByteWidth = 16; // 只用 4 个字节 + bd.BindFlags = D3D11_BIND_CONSTANT_BUFFER; + + HRESULT hr = _backendResources.GetD3DDevice()->CreateBuffer(&bd, nullptr, _dynamicCB.put()); + if (FAILED(hr)) { + Logger::Get().ComError("CreateBuffer 失败", hr); + return nullptr; } } @@ -608,14 +642,17 @@ ID3D11Texture2D* Renderer::_InitBackend() noexcept { dqOptions.dwSize = sizeof(DispatcherQueueOptions); dqOptions.threadType = DQTYPE_THREAD_CURRENT; + winrt::Windows::System::DispatcherQueueController dqc{ nullptr }; HRESULT hr = CreateDispatcherQueueController( dqOptions, - (PDISPATCHERQUEUECONTROLLER*)winrt::put_abi(_backendThreadDqc) + (PDISPATCHERQUEUECONTROLLER*)winrt::put_abi(dqc) ); if (FAILED(hr)) { Logger::Get().ComError("CreateDispatcherQueueController 失败", hr); return nullptr; } + + _backendThreadDispatcher = dqc.DispatcherQueue(); } { @@ -699,17 +736,28 @@ void Renderer::_BackendRender(ID3D11Texture2D* effectsOutput, bool noChange) noe d3dDC->CSSetConstantBuffers(1, 1, &t); } + _effectsProfiler.OnBeginEffects(d3dDC); + if (noChange) { // 源窗口内容不变则从第一个动态效果开始渲染 - for (uint32_t i = _firstDynamicEffectIdx; i < _effectDrawers.size(); ++i) { - _effectDrawers[i].Draw(); + for (uint32_t i = 0; i < _effectDrawers.size(); ++i) { + if (i >= _firstDynamicEffectIdx) { + _effectDrawers[i].Draw(_effectsProfiler); + } else { + uint32_t passCount = (uint32_t)_effectInfos[i].passNames.size(); + for (uint32_t j = 0; j < passCount; ++j) { + _effectsProfiler.OnEndPass(d3dDC); + } + } } } else { for (const EffectDrawer& effectDrawer : _effectDrawers) { - effectDrawer.Draw(); + effectDrawer.Draw(_effectsProfiler); } } + _effectsProfiler.OnEndEffects(d3dDC); + HRESULT hr = d3dDC->Signal(_d3dFence.get(), ++_fenceValue); if (FAILED(hr)) { return; @@ -724,6 +772,9 @@ void Renderer::_BackendRender(ID3D11Texture2D* effectsOutput, bool noChange) noe // 等待渲染完成 WaitForSingleObject(_fenceEvent.get(), INFINITE); + // 渲染完成后查询效果的渲染时间 + _effectsProfiler.QueryTimings(d3dDC); + // 渲染完成后再更新 _sharedTextureMutexKey,否则前端必须等待,会大幅降低帧率 const uint64_t key = ++_sharedTextureMutexKey; hr = _backendSharedTextureMutex->AcquireSync(key - 1, INFINITE); diff --git a/src/Magpie.Core/Renderer.h b/src/Magpie.Core/Renderer.h index 641d0aed2..1e95955e8 100644 --- a/src/Magpie.Core/Renderer.h +++ b/src/Magpie.Core/Renderer.h @@ -5,6 +5,7 @@ #include "Win32Utils.h" #include "CursorDrawer.h" #include "StepTimer.h" +#include "EffectsProfiler.h" namespace Magpie::Core { @@ -43,6 +44,14 @@ class Renderer { void MessageHandler(UINT msg, WPARAM wParam, LPARAM lParam) noexcept; + struct EffectInfo { + std::string name; + std::vector passNames; + }; + const std::vector& EffectInfos() const noexcept { + return _effectInfos; + } + private: bool _CreateSwapChain() noexcept; @@ -89,6 +98,7 @@ class Renderer { std::vector _effectDrawers; StepTimer _stepTimer; + EffectsProfiler _effectsProfiler; winrt::com_ptr _d3dFence; uint64_t _fenceValue = 0; @@ -101,7 +111,7 @@ class Renderer { uint32_t _firstDynamicEffectIdx = std::numeric_limits::max(); // 可由所有线程访问 - winrt::Windows::System::DispatcherQueueController _backendThreadDqc{ nullptr }; + winrt::Windows::System::DispatcherQueue _backendThreadDispatcher{ nullptr }; std::atomic _sharedTextureMutexKey = 0; @@ -110,6 +120,10 @@ class Renderer { RECT _srcRect{}; // 用于在初始化时同步对 _sharedTextureHandle 和 _srcRect 的访问 Win32Utils::SRWMutex _mutex; + + // 供游戏内叠加层使用 + // 由于要跨线程访问,初始化之后不能更改 + std::vector _effectInfos; }; } diff --git a/src/Magpie.Core/ScalingWindow.cpp b/src/Magpie.Core/ScalingWindow.cpp index 959430e7e..5562a9644 100644 --- a/src/Magpie.Core/ScalingWindow.cpp +++ b/src/Magpie.Core/ScalingWindow.cpp @@ -289,7 +289,7 @@ int ScalingWindow::_CheckSrcState() const noexcept { if (!_options.IsDebugMode()) { HWND hwndForeground = GetForegroundWindow(); // 在 3D 游戏模式下打开游戏内叠加层则全屏窗口可以接收焦点 - if (!_options.Is3DGameMode() /*|| !IsUIVisiable()*/|| hwndForeground != _hWnd) { + if (!_options.Is3DGameMode() /*|| !IsUIVisible()*/|| hwndForeground != _hWnd) { if (hwndForeground && hwndForeground != _hwndSrc && !_CheckForeground(hwndForeground)) { Logger::Get().Info("前台窗口已改变"); return 1; From 16cbc773a9a5739d7770e743111278b50c8d4e98 Mon Sep 17 00:00:00 2001 From: cunnyplapper <160966585+cunnyplapper@users.noreply.github.com> Date: Thu, 14 Mar 2024 23:57:38 +0900 Subject: [PATCH 111/155] Add CuNNy-NVL upscaler (#848) * add CuNNy upscaler * apply proposed changes * fix types + tidy prefix --------- Co-authored-by: Xu <34770031+Blinue@users.noreply.github.com> --- src/Effects/CuNNy/CuNNy-16x16C-NVL-DN.hlsl | 7635 ++++++++++++++++++++ src/Effects/CuNNy/CuNNy-16x16C-NVL.hlsl | 7635 ++++++++++++++++++++ src/Effects/CuNNy/CuNNy-2x4C-NVL-DN.hlsl | 340 + src/Effects/CuNNy/CuNNy-2x4C-NVL.hlsl | 340 + src/Effects/CuNNy/CuNNy-3x4C-NVL-DN.hlsl | 413 ++ src/Effects/CuNNy/CuNNy-3x4C-NVL.hlsl | 413 ++ src/Effects/CuNNy/CuNNy-4x16C-NVL-DN.hlsl | 2223 ++++++ src/Effects/CuNNy/CuNNy-4x16C-NVL.hlsl | 2223 ++++++ src/Effects/CuNNy/CuNNy-4x4C-NVL-DN.hlsl | 486 ++ src/Effects/CuNNy/CuNNy-4x4C-NVL.hlsl | 486 ++ src/Effects/CuNNy/CuNNy-4x8C-NVL-DN.hlsl | 921 +++ src/Effects/CuNNy/CuNNy-4x8C-NVL.hlsl | 921 +++ src/Effects/CuNNy/CuNNy-6x8C-NVL-DN.hlsl | 1247 ++++ src/Effects/CuNNy/CuNNy-6x8C-NVL.hlsl | 1247 ++++ src/Effects/CuNNy/CuNNy-8x16C-NVL-DN.hlsl | 4027 +++++++++++ src/Effects/CuNNy/CuNNy-8x16C-NVL.hlsl | 4027 +++++++++++ src/Effects/CuNNy/CuNNy-8x4C-NVL-DN.hlsl | 778 ++ src/Effects/CuNNy/CuNNy-8x4C-NVL.hlsl | 778 ++ src/Effects/CuNNy/CuNNy-8x8C-NVL-DN.hlsl | 1573 ++++ src/Effects/CuNNy/CuNNy-8x8C-NVL.hlsl | 1573 ++++ src/Effects/Effects.vcxproj | 62 + src/Effects/Effects.vcxproj.filters | 63 + 22 files changed, 39411 insertions(+) create mode 100644 src/Effects/CuNNy/CuNNy-16x16C-NVL-DN.hlsl create mode 100644 src/Effects/CuNNy/CuNNy-16x16C-NVL.hlsl create mode 100644 src/Effects/CuNNy/CuNNy-2x4C-NVL-DN.hlsl create mode 100644 src/Effects/CuNNy/CuNNy-2x4C-NVL.hlsl create mode 100644 src/Effects/CuNNy/CuNNy-3x4C-NVL-DN.hlsl create mode 100644 src/Effects/CuNNy/CuNNy-3x4C-NVL.hlsl create mode 100644 src/Effects/CuNNy/CuNNy-4x16C-NVL-DN.hlsl create mode 100644 src/Effects/CuNNy/CuNNy-4x16C-NVL.hlsl create mode 100644 src/Effects/CuNNy/CuNNy-4x4C-NVL-DN.hlsl create mode 100644 src/Effects/CuNNy/CuNNy-4x4C-NVL.hlsl create mode 100644 src/Effects/CuNNy/CuNNy-4x8C-NVL-DN.hlsl create mode 100644 src/Effects/CuNNy/CuNNy-4x8C-NVL.hlsl create mode 100644 src/Effects/CuNNy/CuNNy-6x8C-NVL-DN.hlsl create mode 100644 src/Effects/CuNNy/CuNNy-6x8C-NVL.hlsl create mode 100644 src/Effects/CuNNy/CuNNy-8x16C-NVL-DN.hlsl create mode 100644 src/Effects/CuNNy/CuNNy-8x16C-NVL.hlsl create mode 100644 src/Effects/CuNNy/CuNNy-8x4C-NVL-DN.hlsl create mode 100644 src/Effects/CuNNy/CuNNy-8x4C-NVL.hlsl create mode 100644 src/Effects/CuNNy/CuNNy-8x8C-NVL-DN.hlsl create mode 100644 src/Effects/CuNNy/CuNNy-8x8C-NVL.hlsl diff --git a/src/Effects/CuNNy/CuNNy-16x16C-NVL-DN.hlsl b/src/Effects/CuNNy/CuNNy-16x16C-NVL-DN.hlsl new file mode 100644 index 000000000..b2e2953c1 --- /dev/null +++ b/src/Effects/CuNNy/CuNNy-16x16C-NVL-DN.hlsl @@ -0,0 +1,7635 @@ +// CuNNy 16x16C BILINEAR RGB NVL DN - https://github.com/cunnyplapper/CuNNy + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +//!MAGPIE EFFECT +//!VERSION 4 +//!SORT_NAME CuNNy-DN-D16N16 + +//!TEXTURE +Texture2D INPUT; + +//!TEXTURE +//!WIDTH INPUT_WIDTH * 2 +//!HEIGHT INPUT_HEIGHT * 2 +Texture2D OUTPUT; + +//!SAMPLER +//!FILTER POINT +SamplerState SP; + +//!SAMPLER +//!FILTER LINEAR +SamplerState SL; + +//!COMMON +#define O(t, p) t.SampleLevel(SP, pos + p * pt, 0) +#define V4 min16float4 +#define M4 min16float4x4 + +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +//!FORMAT R8G8B8A8_SNORM +Texture2D t0; + +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +//!FORMAT R8G8B8A8_SNORM +Texture2D t1; + +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +//!FORMAT R8G8B8A8_SNORM +Texture2D t2; + +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +//!FORMAT R8G8B8A8_SNORM +Texture2D t3; + +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +//!FORMAT R8G8B8A8_SNORM +Texture2D t4; + +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +//!FORMAT R8G8B8A8_SNORM +Texture2D t5; + +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +//!FORMAT R8G8B8A8_SNORM +Texture2D t6; + +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +//!FORMAT R8G8B8A8_SNORM +Texture2D t7; + +//!PASS 1 +//!DESC in +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 +//!IN INPUT +//!OUT t0, t1, t2, t3 + +#define l0(x, y) min16float((dot(float3(1.813e-01, 3.616e-01, 7.758e-02), O(INPUT, float2(x, y)).rgb) + -1.943e-01)) + +V4 f0(min16float s0_0, min16float s0_1, min16float s0_2, min16float s0_3, min16float s0_4, min16float s0_5, min16float s0_6, min16float s0_7, min16float s0_8) { + V4 r = 0.0; + r += V4(-7.980e-03, -3.076e-02, -4.968e-02, -5.507e-02) * s0_0; + r += V4(-1.630e-03, 9.011e-02, 1.569e-01, -1.171e-01) * s0_1; + r += V4(6.748e-03, 3.943e-02, -2.483e-02, 8.049e-02) * s0_2; + r += V4(1.366e-02, 7.292e-03, 1.892e-01, -7.788e-02) * s0_3; + r += V4(-1.200e-01, -4.487e-01, -6.842e-02, 5.161e-02) * s0_4; + r += V4(-6.519e-02, 2.036e-01, -1.251e-02, 1.274e-01) * s0_5; + r += V4(-3.159e-02, 2.875e-02, -1.077e-01, 1.257e-02) * s0_6; + r += V4(2.857e-01, -6.175e-02, -1.141e-01, 1.544e-01) * s0_7; + r += V4(4.700e-02, 1.641e-01, 1.432e-02, -1.952e-01) * s0_8; + r += V4(2.289e-02, -9.738e-03, -1.114e-02, -6.420e-03); + return r; +} + +V4 f1(min16float s0_0, min16float s0_1, min16float s0_2, min16float s0_3, min16float s0_4, min16float s0_5, min16float s0_6, min16float s0_7, min16float s0_8) { + V4 r = 0.0; + r += V4(2.687e-01, -3.137e-02, 2.714e-02, -4.394e-02) * s0_0; + r += V4(2.045e-02, 8.505e-02, -4.982e-03, -9.058e-02) * s0_1; + r += V4(6.386e-02, -5.317e-02, -6.019e-02, -6.573e-03) * s0_2; + r += V4(-1.215e-01, -1.615e-02, 9.762e-02, 9.438e-02) * s0_3; + r += V4(-7.273e-02, -8.166e-02, -1.773e-01, 1.022e-01) * s0_4; + r += V4(-1.313e-01, -2.619e-01, 1.178e-01, 4.578e-02) * s0_5; + r += V4(1.567e-01, 7.322e-02, -6.227e-02, -2.403e-03) * s0_6; + r += V4(-2.226e-01, -9.741e-02, -2.121e-02, -7.671e-02) * s0_7; + r += V4(2.273e-02, 1.006e-01, 2.815e-02, -3.005e-02) * s0_8; + r += V4(1.315e-02, -4.822e-02, 1.570e-03, 1.289e-02); + return r; +} + +V4 f2(min16float s0_0, min16float s0_1, min16float s0_2, min16float s0_3, min16float s0_4, min16float s0_5, min16float s0_6, min16float s0_7, min16float s0_8) { + V4 r = 0.0; + r += V4(-1.161e-02, 9.096e-02, 1.460e-01, 9.043e-02) * s0_0; + r += V4(4.599e-02, 1.247e-01, 1.297e-02, 2.141e-01) * s0_1; + r += V4(-7.605e-03, -8.120e-02, 8.736e-02, 6.155e-02) * s0_2; + r += V4(9.851e-02, -1.175e-02, -4.543e-03, -1.553e-01) * s0_3; + r += V4(-1.685e-01, 1.256e-01, -2.056e-01, -6.121e-02) * s0_4; + r += V4(4.006e-03, 6.040e-02, -1.224e-02, 1.277e-01) * s0_5; + r += V4(4.245e-02, 3.785e-02, 8.967e-02, -1.193e-01) * s0_6; + r += V4(-2.506e-02, -2.161e-03, -2.012e-01, -1.872e-01) * s0_7; + r += V4(5.837e-02, -1.905e-02, -9.231e-02, 2.377e-02) * s0_8; + r += V4(8.704e-03, 3.978e-02, -2.434e-02, 9.064e-03); + return r; +} + +V4 f3(min16float s0_0, min16float s0_1, min16float s0_2, min16float s0_3, min16float s0_4, min16float s0_5, min16float s0_6, min16float s0_7, min16float s0_8) { + V4 r = 0.0; + r += V4(2.014e-03, -5.120e-03, 1.469e-01, -2.760e-03) * s0_0; + r += V4(6.458e-03, -3.387e-02, 1.152e-01, -1.061e-01) * s0_1; + r += V4(-6.233e-03, 7.249e-02, 2.964e-03, 9.741e-02) * s0_2; + r += V4(-4.754e-03, -1.019e-01, 2.455e-01, -8.219e-02) * s0_3; + r += V4(6.881e-03, 1.177e-01, 2.419e-02, 4.032e-02) * s0_4; + r += V4(2.764e-01, -9.610e-02, -5.004e-02, 1.126e-01) * s0_5; + r += V4(1.787e-02, 1.606e-01, 1.749e-02, -1.304e-01) * s0_6; + r += V4(-2.934e-02, -9.155e-02, -5.788e-02, -2.840e-02) * s0_7; + r += V4(-2.607e-01, 5.171e-03, 2.436e-02, 1.191e-01) * s0_8; + r += V4(1.194e-02, 7.492e-03, -1.938e-01, 6.217e-03); + return r; +} + +void Pass1(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = Rmp8x8(tid.x) + blockStart; + uint2 size = GetInputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = (gxy + 0.5) * pt; + + min16float s0_0 = l0(-1.0, -1.0); + min16float s0_1 = l0(0.0, -1.0); + min16float s0_2 = l0(1.0, -1.0); + min16float s0_3 = l0(-1.0, 0.0); + min16float s0_4 = l0(0.0, 0.0); + min16float s0_5 = l0(1.0, 0.0); + min16float s0_6 = l0(-1.0, 1.0); + min16float s0_7 = l0(0.0, 1.0); + min16float s0_8 = l0(1.0, 1.0); + + t0[gxy] = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8); + t1[gxy] = f1(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8); + t2[gxy] = f2(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8); + t3[gxy] = f3(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8); +} + +//!PASS 2 +//!DESC conv1 +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 +//!IN t0, t1, t2, t3 +//!OUT t4, t5, t6, t7 + +#define l0(x, y) V4(O(t0, float2(x, y))) +#define l1(x, y) V4(O(t1, float2(x, y))) +#define l2(x, y) V4(O(t2, float2(x, y))) +#define l3(x, y) V4(O(t3, float2(x, y))) + +V4 f0(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(8.232e-03, -1.263e-02, 1.604e-02, 1.024e-01, -3.414e-01, -6.902e-02, -2.683e-02, -9.299e-02, -7.921e-02, -9.931e-02, 1.531e-02, 2.957e-02, 1.157e-01, 1.279e-01, -1.983e-02, -2.226e-01)); + r += mul(s0_1, M4(4.282e-02, 4.810e-02, 2.519e-02, -2.683e-02, -2.278e-01, 1.087e-01, 2.035e-01, -2.022e-02, -4.101e-02, -2.410e-01, -1.590e-01, -1.869e-01, 2.409e-01, -7.862e-02, 5.305e-02, -2.379e-01)); + r += mul(s0_2, M4(6.824e-02, 4.298e-03, -3.620e-02, 6.571e-02, 1.014e-01, -6.163e-02, -4.906e-03, 1.129e-01, -4.051e-01, 1.088e-01, 4.718e-02, 9.828e-02, 2.015e-01, -1.438e-01, -3.376e-02, -3.588e-01)); + r += mul(s0_3, M4(-1.032e-01, -3.451e-02, 1.023e-01, 1.668e-01, -3.269e-02, 1.371e-01, 2.365e-01, 1.415e-02, 1.336e-01, 2.168e-01, 1.946e-02, -8.461e-02, -7.150e-02, -3.241e-01, -6.226e-02, -1.517e-01)); + r += mul(s0_4, M4(-3.957e-02, 1.035e-01, 2.231e-01, 1.377e-01, -1.762e-01, -8.220e-02, -6.978e-02, 2.561e-01, -9.208e-02, -1.297e-01, 3.774e-02, -2.095e-01, -1.958e-03, -3.276e-01, 1.283e-01, -1.089e-01)); + r += mul(s0_5, M4(5.492e-03, 6.888e-02, 4.573e-04, 1.222e-03, -7.004e-02, 1.235e-01, 7.911e-02, 1.326e-01, 1.109e-01, -5.032e-02, 2.981e-02, -7.277e-02, -1.899e-01, -3.998e-01, 3.372e-02, 1.580e-02)); + r += mul(s0_6, M4(9.754e-02, -2.830e-02, -5.702e-02, 5.207e-02, -3.047e-01, -2.664e-01, -1.230e-02, 8.129e-02, 1.607e-02, -1.711e-01, -2.426e-02, -1.682e-01, -1.057e-01, 5.643e-02, 8.680e-02, 7.754e-02)); + r += mul(s0_7, M4(-3.861e-02, 6.737e-02, -1.089e-01, -8.752e-02, -3.457e-01, -1.598e-01, -8.906e-03, 7.005e-02, -1.116e-01, 1.432e-01, -3.431e-02, -1.621e-01, 7.981e-02, 5.537e-02, -1.455e-01, 4.108e-01)); + r += mul(s0_8, M4(3.274e-02, 7.273e-03, -4.861e-02, -5.922e-02, 1.132e-01, 2.571e-02, 1.105e-01, 6.493e-04, -2.355e-01, -1.652e-01, -9.999e-02, -2.700e-01, -1.294e-01, 5.101e-02, -1.395e-01, -7.676e-02)); + r += mul(s1_0, M4(-2.194e-03, -7.369e-02, -1.714e-01, -1.710e-01, -7.343e-02, -2.065e-02, -6.641e-02, -5.477e-02, 1.710e-01, -1.409e-01, -1.086e-02, -2.295e-02, 1.003e-01, -1.355e-01, 8.370e-02, -3.968e-02)); + r += mul(s1_1, M4(1.456e-01, -2.707e-01, 5.298e-02, -4.356e-01, -4.610e-02, -1.830e-01, 8.627e-02, -7.877e-02, -1.260e-01, 3.420e-02, -4.331e-02, 6.292e-02, -1.356e-01, 3.717e-02, 9.696e-03, 1.419e-01)); + r += mul(s1_2, M4(-4.370e-02, 1.515e-01, -1.471e-01, 5.180e-02, 1.941e-01, -3.475e-02, -2.119e-02, 4.992e-02, -7.970e-02, 1.016e-01, 4.215e-02, -6.728e-02, -9.104e-02, 1.109e-01, 2.284e-02, 1.356e-01)); + r += mul(s1_3, M4(-4.121e-01, 2.762e-01, -1.719e-01, 3.415e-02, 1.492e-01, 2.398e-01, 1.802e-01, -1.359e-01, 1.048e-01, -1.091e-01, 5.598e-02, 5.408e-02, 8.922e-02, 1.237e-01, -1.087e-01, -2.341e-02)); + r += mul(s1_4, M4(-4.086e-01, 3.231e-02, -8.000e-01, 1.567e-01, -3.440e-02, 1.166e-01, -8.848e-02, 2.378e-01, -5.513e-02, -6.543e-03, -9.741e-02, -3.948e-02, 1.110e-01, -7.642e-02, 6.105e-02, 1.034e-01)); + r += mul(s1_5, M4(-2.552e-01, 4.160e-02, 1.345e-01, 2.989e-02, -8.820e-02, -3.577e-02, 1.492e-01, -4.709e-02, -4.680e-02, -1.114e-01, 3.098e-02, -5.875e-02, 5.616e-02, -6.438e-03, 4.510e-02, 1.104e-02)); + r += mul(s1_6, M4(-3.260e-01, -2.310e-02, 9.558e-04, -8.444e-02, -1.877e-01, 9.342e-02, 1.272e-01, -2.466e-01, 1.322e-01, 1.308e-02, -1.377e-02, 5.056e-02, -1.029e-01, -8.177e-02, 6.398e-02, -9.232e-02)); + r += mul(s1_7, M4(-4.628e-01, -2.434e-01, -1.955e-02, -1.592e-01, -1.218e-01, 1.512e-01, -3.348e-01, -1.380e-01, -5.974e-02, 6.669e-02, 2.932e-02, 7.818e-02, -9.201e-02, 9.057e-02, -5.445e-02, -2.324e-02)); + r += mul(s1_8, M4(-1.298e-01, -3.600e-01, -1.398e-02, 2.785e-01, 3.239e-02, 1.024e-01, 4.002e-02, -1.654e-01, 1.207e-01, 1.935e-01, 2.551e-02, -3.661e-03, 7.205e-02, -5.778e-02, -4.316e-02, -1.053e-01)); + r += mul(s2_0, M4(-7.089e-02, -8.723e-02, 5.822e-02, -1.300e-01, -2.327e-01, -1.664e-01, 5.151e-02, 7.662e-02, -2.503e-03, 1.583e-01, -7.790e-02, -2.311e-02, -4.394e-03, -6.863e-02, -7.991e-02, 6.175e-02)); + r += mul(s2_1, M4(-1.789e-01, -5.748e-02, 6.327e-02, -4.628e-02, -1.190e-02, -5.142e-02, -1.517e-01, 3.932e-01, -1.007e-02, 3.506e-01, -3.729e-02, -2.814e-02, 8.168e-02, 4.268e-02, -1.572e-02, 6.749e-02)); + r += mul(s2_2, M4(-6.394e-02, 6.625e-02, -3.661e-02, -3.363e-02, -1.152e-01, 9.530e-02, 1.485e-01, 1.582e-01, -2.685e-01, 6.743e-02, 1.000e-01, 1.363e-01, -2.344e-02, 1.054e-01, -9.292e-03, -3.414e-02)); + r += mul(s2_3, M4(-1.325e-02, 5.769e-02, 9.497e-02, -1.102e-01, -8.531e-02, 4.940e-01, -2.478e-01, 5.556e-02, 1.253e-01, 1.196e-01, -7.608e-02, -9.433e-02, -2.328e-01, 5.913e-02, 2.705e-02, 6.825e-02)); + r += mul(s2_4, M4(-2.225e-02, 2.734e-02, -2.433e-01, -4.216e-02, 1.270e-01, 5.062e-01, 7.176e-02, 3.093e-01, 1.390e-01, 1.153e-02, 6.485e-02, 5.247e-02, -1.734e-02, -6.897e-02, -5.755e-02, -5.145e-02)); + r += mul(s2_5, M4(-4.082e-02, 1.448e-01, 9.686e-02, 3.773e-02, -1.496e-02, 3.650e-01, 6.160e-02, -2.780e-02, -1.849e-01, 4.693e-02, -1.304e-01, -1.975e-01, 1.455e-01, -1.066e-01, -2.135e-02, -4.541e-02)); + r += mul(s2_6, M4(-1.796e-02, -7.124e-02, -5.399e-02, 6.812e-02, 1.207e-01, 4.614e-01, 1.302e+00, -2.446e-01, -2.134e-01, -9.068e-02, -8.372e-02, -2.020e-02, -1.306e-01, 1.112e-01, 1.321e-02, 7.761e-02)); + r += mul(s2_7, M4(4.480e-02, 6.023e-02, -1.196e-01, 4.332e-02, 3.713e-01, 3.954e-01, 8.121e-01, -3.093e-01, 2.232e-01, 5.831e-02, -4.077e-02, -1.415e-01, 1.256e-01, -9.794e-03, 6.676e-02, 8.091e-03)); + r += mul(s2_8, M4(-6.303e-02, 1.297e-01, -2.822e-01, 1.475e-01, 1.822e-01, 2.403e-01, 6.199e-01, 1.607e-01, -1.782e-02, 6.645e-02, -3.818e-02, 4.054e-01, 1.471e-01, -1.032e-01, 4.629e-02, 2.921e-02)); + r += mul(s3_0, M4(2.935e-01, 1.957e-01, -2.266e-02, 3.264e-02, -3.908e-02, 1.400e-01, -6.904e-02, -1.184e-01, 1.400e-01, -3.520e-02, -5.787e-02, -3.441e-02, 2.693e-02, -1.742e-01, -2.707e-02, 1.949e-02)); + r += mul(s3_1, M4(-2.875e-02, -6.801e-02, 4.792e-03, 1.226e-02, 1.318e-03, -3.648e-02, -2.690e-02, 5.585e-03, 4.851e-02, 4.054e-03, 7.015e-02, 8.548e-02, -6.633e-02, 4.076e-01, 8.485e-03, -2.852e-01)); + r += mul(s3_2, M4(2.192e-03, -1.598e-02, -5.636e-02, -1.786e-02, -8.461e-03, -7.038e-02, -4.633e-02, 7.459e-02, -4.072e-02, -2.260e-02, -2.599e-02, -1.689e-01, -2.695e-01, 3.035e-01, 1.049e-01, -5.409e-02)); + r += mul(s3_3, M4(1.142e-01, 1.198e-01, 3.545e-02, 1.778e-01, 9.564e-03, -4.826e-02, 7.830e-02, 1.123e-01, 2.424e-02, 9.883e-02, 3.808e-02, 9.802e-03, -7.263e-02, 2.442e-01, 1.354e-02, -8.291e-03)); + r += mul(s3_4, M4(-8.273e-02, -1.434e-01, -2.165e-01, 1.566e-01, -5.180e-02, 4.937e-02, 5.564e-03, 1.229e-01, -4.729e-02, -1.214e-01, 3.427e-02, 9.345e-02, -2.942e-01, -5.558e-02, -4.219e-01, -1.772e-01)); + r += mul(s3_5, M4(5.593e-02, 1.818e-02, 2.035e-01, 1.659e-01, -4.378e-02, -6.190e-02, -8.371e-02, 2.842e-02, 4.158e-02, -8.044e-02, 2.686e-02, 4.061e-02, -1.102e-01, 3.095e-01, -7.692e-02, 3.397e-03)); + r += mul(s3_6, M4(-7.776e-02, 2.238e-01, -1.441e-01, 4.501e-02, 2.254e-01, -1.272e-01, 1.171e-02, 1.119e-02, -7.533e-02, 1.687e-01, -1.100e-03, 1.080e-03, -2.423e-02, -3.446e-01, -2.180e-01, -9.774e-03)); + r += mul(s3_7, M4(5.486e-02, -1.573e-01, -9.305e-02, -6.218e-02, 5.573e-02, -7.214e-02, -1.015e-01, -7.444e-03, -4.333e-02, -2.102e-01, -7.572e-02, -9.376e-02, -3.271e-01, 1.398e-01, 7.296e-01, 6.384e-02)); + r += mul(s3_8, M4(1.001e-01, -2.694e-01, -4.672e-02, -1.425e-01, -7.395e-02, -5.039e-03, -2.449e-02, -3.480e-03, 2.517e-02, -2.365e-02, -2.376e-02, -4.630e-03, 1.519e-01, -4.867e-02, 9.130e-02, 4.954e-02)); + r += mul(s4_0, M4(-1.190e-02, 3.105e-02, -5.302e-02, 2.839e-02, -1.766e-01, -2.932e-02, 3.040e-02, 4.314e-02, 2.831e-01, 2.573e-01, -4.039e-02, 2.720e-01, 9.287e-02, 4.324e-02, 3.882e-03, 1.599e-01)); + r += mul(s4_1, M4(8.672e-03, -5.654e-02, 1.299e-02, -1.554e-02, 5.415e-02, -4.059e-02, 3.943e-02, 2.054e-02, 3.076e-01, 3.693e-01, -2.222e-01, 1.096e-01, -6.335e-02, -2.677e-02, 1.427e-02, -9.692e-02)); + r += mul(s4_2, M4(1.783e-01, -3.502e-02, 7.618e-03, 7.304e-02, 9.326e-02, 8.295e-03, -1.252e-02, -2.887e-03, -3.823e-01, 4.908e-02, 2.382e-02, -3.313e-02, 5.280e-02, -4.991e-02, -7.152e-03, -1.737e-01)); + r += mul(s4_3, M4(-5.825e-02, 1.393e-01, -3.566e-02, 6.874e-02, -1.361e-01, 9.102e-02, -4.185e-02, -4.120e-02, -2.030e-01, 1.278e-01, -6.667e-02, -3.361e-02, 1.890e-01, 1.746e-01, 8.857e-02, 3.206e-02)); + r += mul(s4_4, M4(-5.837e-02, -4.659e-02, -1.099e-02, 9.193e-02, 1.919e-01, 9.881e-02, 2.039e-02, -6.581e-02, -1.028e-01, 2.360e-01, 6.861e-02, 8.700e-02, 8.960e-02, 1.889e-02, -1.942e-01, 3.711e-02)); + r += mul(s4_5, M4(1.235e-01, -6.465e-02, 6.970e-03, -1.458e-01, 1.019e-02, 7.978e-02, 1.156e-01, -1.568e-01, -3.517e-01, -1.489e-01, -7.682e-02, 2.566e-01, -3.646e-03, 8.862e-02, -4.665e-02, -1.264e-01)); + r += mul(s4_6, M4(-1.168e-01, 7.567e-02, 4.442e-02, -1.496e-01, 2.950e-02, 2.805e-02, 1.348e-01, -6.303e-03, -2.002e-02, -7.925e-02, 1.072e-01, 1.361e-01, 9.353e-02, -5.266e-03, 3.989e-03, 8.648e-02)); + r += mul(s4_7, M4(6.570e-02, 3.402e-02, 1.471e-04, -4.474e-02, -4.834e-03, -5.764e-02, 8.183e-02, -9.186e-02, 5.233e-02, 2.400e-01, 3.102e-01, -3.024e-02, -7.292e-02, 1.583e-02, -4.936e-02, -2.610e-01)); + r += mul(s4_8, M4(-3.826e-03, -6.294e-02, 2.547e-02, -2.491e-02, -5.972e-02, 2.935e-02, 1.576e-02, -9.063e-02, 2.044e-02, 6.679e-03, 1.096e-03, 2.228e-01, -2.407e-01, 1.354e-01, -7.616e-02, 9.792e-02)); + r += mul(s5_0, M4(5.608e-03, 8.229e-03, -2.456e-02, -1.006e-01, -4.599e-01, -8.566e-02, -1.052e-01, 3.307e-01, -4.093e-02, -2.267e-02, 1.253e-02, -6.191e-02, 8.924e-02, 8.230e-02, 1.199e-02, 5.318e-02)); + r += mul(s5_1, M4(-2.619e-01, -4.897e-01, 1.833e-02, -2.030e-01, -1.539e-01, -1.435e-01, -2.970e-01, -6.604e-02, -1.095e-01, -3.638e-03, -1.213e-01, 1.524e-02, 2.464e-02, -1.593e-01, -2.723e-02, 1.168e-01)); + r += mul(s5_2, M4(-1.785e-01, 2.530e-01, -2.439e-01, 2.566e-01, 1.387e-01, -1.182e-01, -3.776e-01, -4.125e-01, -3.954e-02, 1.032e-01, 7.002e-02, 2.044e-01, -4.406e-02, -8.684e-03, 1.155e-02, -2.161e-01)); + r += mul(s5_3, M4(-1.777e-01, -2.579e-01, -4.535e-02, 2.068e-01, -9.316e-02, -4.666e-01, -9.052e-02, 6.572e-02, 1.703e-01, -1.078e-01, -5.785e-02, -6.235e-02, -1.023e-01, -8.569e-02, 6.376e-02, -3.068e-01)); + r += mul(s5_4, M4(-4.940e-01, 3.483e-01, -6.921e-02, 2.380e-01, 1.427e-01, -6.275e-01, -4.544e-01, -3.053e-01, -5.621e-02, 1.289e-01, -1.396e-01, 6.402e-02, 1.020e-01, -8.552e-02, -1.554e-01, 5.649e-02)); + r += mul(s5_5, M4(9.104e-03, -3.946e-02, -3.489e-01, 3.821e-02, 1.626e-01, -5.198e-01, -5.062e-01, -6.730e-02, 8.234e-03, 8.062e-02, -2.827e-02, 7.927e-02, -5.086e-02, 2.596e-02, -1.753e-01, -3.009e-02)); + r += mul(s5_6, M4(-3.913e-01, 1.101e-01, 1.442e-01, 7.216e-02, -2.240e-01, -7.264e-01, -4.422e-01, 5.701e-01, -1.410e-01, 3.260e-02, -4.088e-02, -2.344e-02, 8.190e-03, -9.536e-02, 5.690e-02, 1.618e-02)); + r += mul(s5_7, M4(-9.386e-01, -1.086e-01, -1.548e-01, 8.514e-04, -8.171e-02, -8.063e-01, -1.166e+00, -2.847e-01, -5.213e-02, -1.733e-01, -1.278e-01, 4.072e-04, 2.080e-01, -1.636e-01, 8.938e-02, 1.357e-01)); + r += mul(s5_8, M4(-3.893e-01, 2.112e-01, 2.145e-01, 3.330e-01, -1.034e-01, -6.189e-01, -8.157e-01, -2.690e-01, 3.968e-02, -5.141e-02, 2.373e-02, 7.592e-02, -9.925e-02, -2.414e-02, -2.636e-02, 2.153e-02)); + r += mul(s6_0, M4(1.136e-01, 8.093e-02, -9.985e-02, 1.499e-02, -6.009e-02, 1.862e-02, -5.180e-02, 1.059e-02, 2.233e-01, -8.905e-01, 1.255e-01, -1.679e-01, 1.036e-01, 9.730e-02, -6.267e-02, -5.428e-02)); + r += mul(s6_1, M4(-2.109e-03, 6.298e-02, 3.134e-03, -1.532e-01, -1.769e-01, -1.546e-01, 3.674e-02, -8.395e-02, 3.887e-01, 3.715e-01, 2.054e-01, -7.510e-01, 1.340e-01, -1.268e-02, -5.245e-02, 7.880e-02)); + r += mul(s6_2, M4(-1.101e-01, -2.842e-02, -1.595e-04, 5.668e-02, 7.653e-02, 1.617e-02, -6.329e-02, 9.278e-02, 4.830e-01, 2.833e-02, 4.292e-01, -2.053e-01, 2.326e-02, 1.637e-01, -1.947e-02, -8.910e-02)); + r += mul(s6_3, M4(-1.725e-02, 1.329e-01, -2.409e-01, -1.431e-01, -6.088e-02, -1.209e-01, 6.302e-03, -4.155e-03, 2.497e-01, -1.025e+00, 1.091e-01, -8.530e-01, -1.597e-01, -1.489e-01, 1.854e-01, -6.847e-02)); + r += mul(s6_4, M4(8.771e-02, -1.043e-01, -6.309e-02, -3.651e-03, -9.639e-02, -1.604e-02, -8.599e-02, -2.125e-02, -1.450e-01, 2.313e-01, 1.777e-01, -5.452e-01, -2.405e-03, -1.849e-01, 4.595e-02, 2.129e-03)); + r += mul(s6_5, M4(6.450e-02, -4.157e-02, 1.194e-01, 1.012e-01, 1.620e-01, 1.771e-01, 8.360e-02, 1.448e-02, 1.998e-01, 5.925e-01, 4.185e-01, -5.502e-01, 8.328e-02, -4.896e-02, -1.595e-01, -1.282e-02)); + r += mul(s6_6, M4(-1.301e-01, -5.223e-02, 1.743e-01, 1.901e-01, -1.524e-01, 1.624e-01, 2.464e-02, -2.137e-02, -4.599e-01, 4.252e-02, 4.269e-01, -8.681e-01, -3.066e-01, 4.993e-02, 1.657e-02, 1.455e-02)); + r += mul(s6_7, M4(7.055e-02, -1.138e-02, -3.697e-02, 6.304e-02, 7.056e-02, 8.624e-02, 3.157e-02, 1.738e-03, -5.091e-02, -1.116e-01, 6.074e-01, -8.667e-01, 4.539e-02, -1.009e-02, 3.756e-02, 2.695e-02)); + r += mul(s6_8, M4(2.303e-03, -2.149e-02, 8.215e-02, 9.044e-02, 1.001e-01, -1.099e-01, 2.439e-02, -6.588e-02, 1.238e+00, 1.123e-01, 1.204e+00, -5.638e-01, 4.821e-02, 2.375e-03, -5.836e-03, 3.382e-02)); + r += mul(s7_0, M4(2.280e-01, -4.209e-01, 6.084e-03, -2.358e-01, 1.567e-01, -1.142e-01, -2.985e-02, 1.016e-01, -6.077e-02, -3.948e-02, -7.984e-03, -6.340e-02, -2.348e-01, -6.651e-02, -3.006e-02, -1.758e-01)); + r += mul(s7_1, M4(4.794e-02, -9.253e-02, -6.952e-02, 1.584e-01, -3.184e-01, 1.867e-01, 8.533e-02, 5.744e-03, 9.830e-03, 6.881e-02, 8.306e-02, 1.439e-01, -1.774e-01, -1.299e-01, 3.531e-02, 2.743e-01)); + r += mul(s7_2, M4(2.150e-01, -9.738e-02, -2.491e-02, 1.611e-01, 5.285e-01, -1.843e-01, -9.378e-02, 5.800e-02, -1.332e-02, 2.594e-02, 4.409e-03, -2.908e-02, -1.850e-01, 5.331e-02, 1.562e-02, 2.035e-02)); + r += mul(s7_3, M4(1.859e-02, -3.335e-03, -1.779e-01, -2.356e-02, -6.775e-02, -3.462e-01, 6.554e-03, 4.673e-01, -3.758e-02, -7.708e-02, 1.072e-01, 7.910e-02, -2.035e-01, -1.150e-01, 2.485e-01, 4.250e-02)); + r += mul(s7_4, M4(1.317e-01, 4.584e-02, -1.015e-01, 1.026e-01, 2.818e-02, -6.962e-02, -2.352e-01, 8.511e-03, -1.362e-01, 1.974e-01, -4.170e-02, 5.235e-02, -8.838e-02, 6.127e-02, -5.776e-02, 2.008e-01)); + r += mul(s7_5, M4(4.451e-02, 1.866e-01, 3.327e-02, -9.457e-02, 1.774e-01, -3.330e-01, -1.942e-02, -1.345e-01, -1.723e-02, -1.108e-01, 7.892e-02, 4.799e-02, 8.422e-02, 2.290e-02, -1.273e-01, -7.738e-02)); + r += mul(s7_6, M4(9.301e-02, -9.386e-02, -1.273e-01, -2.132e-02, 8.577e-02, -5.984e-02, -3.506e-03, 3.370e-01, 1.480e-01, -1.095e-01, 1.172e-01, -3.318e-02, -7.578e-02, -1.567e-01, 9.427e-02, 8.845e-02)); + r += mul(s7_7, M4(-3.632e-02, 1.124e-01, 8.124e-02, 1.514e-01, -2.447e-01, -7.509e-02, 1.311e-01, -5.810e-02, 5.562e-02, 1.533e-02, 1.313e-01, -3.108e-02, -9.952e-02, 7.539e-02, 2.049e-01, 3.185e-01)); + r += mul(s7_8, M4(-9.766e-02, -1.952e-03, 4.433e-02, 1.406e-01, 6.114e-02, 1.562e-01, 1.502e-02, -2.778e-01, 6.818e-02, 8.618e-02, 1.895e-01, 7.110e-02, 4.375e-02, 5.454e-02, 9.155e-03, 1.353e-01)); + r += V4(-2.169e-02, -7.251e-02, -1.396e-01, 3.650e-02); + return r; +} + +V4 f1(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-1.775e-01, -1.666e-02, 2.113e-02, -1.239e-01, 1.264e-02, 2.318e-01, -5.209e-03, 9.788e-02, 3.047e-01, -6.490e-02, -3.152e-02, -3.440e-01, -1.708e-01, 1.047e-01, 2.269e-01, -2.688e-02)); + r += mul(s0_1, M4(7.222e-02, -1.354e-02, -9.023e-02, 7.743e-02, -1.774e-01, 1.933e-02, 1.082e-01, 1.154e-01, 7.841e-02, -1.001e-01, 2.004e-01, -3.504e-01, -2.600e-02, 6.343e-02, -2.025e-01, -1.070e-02)); + r += mul(s0_2, M4(-1.828e-02, 2.302e-02, 3.921e-02, 3.057e-02, 6.901e-02, -1.374e-01, 1.080e-01, -6.520e-02, -1.584e-01, -2.177e-02, -9.491e-02, -1.289e-01, -1.461e-01, -2.556e-02, 1.921e-01, 1.474e-01)); + r += mul(s0_3, M4(-1.343e-01, 6.336e-02, 1.862e-01, 9.577e-02, -4.924e-02, 1.149e-01, -3.575e-02, 2.123e-01, -1.659e-01, 9.363e-02, 3.628e-01, 3.677e-02, 2.087e-01, -1.171e-01, -1.263e-01, -3.249e-02)); + r += mul(s0_4, M4(3.837e-02, -6.882e-02, 2.254e-01, 8.898e-02, -8.437e-02, -1.221e-01, 3.803e-01, -1.880e-01, -2.448e-01, -1.350e-01, 2.000e-01, 5.808e-02, 6.826e-02, 9.996e-03, -2.128e-01, 7.567e-03)); + r += mul(s0_5, M4(3.019e-02, -3.115e-02, -3.425e-02, 3.495e-02, 8.757e-02, 1.741e-02, 7.830e-02, 2.187e-01, 3.421e-01, 1.835e-01, 1.304e-01, 2.987e-01, 5.425e-03, 5.812e-02, 3.939e-02, 8.306e-02)); + r += mul(s0_6, M4(-1.755e-02, 1.265e-02, -6.516e-02, -4.036e-02, -1.449e-01, 8.036e-02, -9.509e-02, -2.841e-01, 6.021e-02, 1.190e-01, 3.651e-02, -1.777e-01, -8.464e-02, 7.716e-02, -5.514e-02, -3.438e-01)); + r += mul(s0_7, M4(6.529e-02, 6.229e-02, -6.483e-02, -3.224e-02, 1.174e-02, -2.118e-01, -3.957e-01, -9.645e-02, 1.996e-01, -5.530e-02, -9.620e-03, -3.575e-02, -1.937e-01, -4.422e-02, -1.885e-01, -1.128e-01)); + r += mul(s0_8, M4(-6.677e-02, 4.985e-03, 5.960e-05, -5.510e-02, -1.532e-03, -2.686e-02, 8.343e-02, 1.080e-01, 7.810e-02, 1.712e-01, -9.339e-03, 2.619e-02, 1.932e-01, -1.233e-01, 2.490e-02, -1.811e-01)); + r += mul(s1_0, M4(1.961e-01, 1.267e-02, -1.162e-02, -9.608e-02, 2.658e-01, -5.419e-02, -1.469e-02, -1.295e-01, 7.791e-02, 9.548e-02, 7.228e-02, 1.439e-02, 7.483e-02, -8.509e-02, 1.010e-01, -6.508e-02)); + r += mul(s1_1, M4(2.794e-01, 2.878e-01, -5.265e-01, 1.560e-01, -1.515e-01, 9.347e-02, 7.951e-02, -9.054e-02, 5.093e-02, -2.977e-02, 1.010e-01, 4.830e-03, 1.338e-02, 2.748e-02, -2.289e-01, -1.024e-01)); + r += mul(s1_2, M4(7.681e-02, -8.505e-03, 3.200e-01, -5.171e-02, 1.745e-02, -5.962e-02, -4.359e-02, 6.329e-02, 1.122e-01, -6.580e-02, 1.511e-02, -2.182e-02, 1.381e-02, 5.334e-02, 9.869e-03, -3.874e-03)); + r += mul(s1_3, M4(-5.790e-02, 4.297e-01, 2.180e-01, -3.490e-01, 5.206e-01, 1.042e-01, -2.797e-03, -8.630e-02, -5.800e-02, -1.127e-01, -1.039e-02, -6.326e-02, 4.866e-02, 4.524e-02, -1.471e-01, 5.535e-02)); + r += mul(s1_4, M4(2.486e-02, 5.458e-01, -1.845e-01, -2.061e-01, -3.408e-01, 4.788e-03, 4.484e-01, -7.937e-02, -3.388e-02, 9.579e-02, -1.823e-01, 4.135e-02, 6.400e-02, 3.829e-03, -1.028e-02, -1.141e-01)); + r += mul(s1_5, M4(-2.133e-01, -1.242e-01, -1.956e-01, 6.902e-02, 1.134e-02, 6.592e-02, 1.245e-01, 1.885e-01, 5.202e-02, 3.551e-02, -7.043e-02, -3.911e-02, -3.874e-02, -3.652e-02, 1.795e-01, 1.084e-01)); + r += mul(s1_6, M4(-7.038e-02, -1.997e-02, -7.819e-02, -6.066e-02, 2.418e-01, -1.132e-01, -2.147e-02, 1.733e-01, 4.530e-02, 6.559e-02, -2.115e-02, 1.483e-01, -7.494e-02, -1.038e-01, 3.806e-02, 1.279e-01)); + r += mul(s1_7, M4(-1.047e-01, 1.030e-01, -1.559e-01, -2.634e-01, -7.276e-02, -1.085e-01, -4.366e-01, -1.306e-01, 3.752e-02, -7.724e-02, -1.336e-01, -1.201e-01, 6.546e-02, 8.972e-02, 1.402e-01, 6.884e-02)); + r += mul(s1_8, M4(-3.296e-02, -5.481e-02, -8.518e-02, 5.481e-02, -5.662e-02, -1.010e-01, -8.579e-02, -2.996e-02, -2.077e-02, -3.781e-02, 1.152e-01, 5.694e-02, -6.651e-02, -2.632e-02, 1.062e-02, -6.098e-02)); + r += mul(s2_0, M4(6.375e-02, 5.409e-02, 4.370e-02, -3.229e-02, -9.817e-02, -1.247e-01, -1.783e-01, 2.652e-01, -1.650e-01, 6.811e-02, 1.056e-01, -1.367e-01, 9.807e-02, -3.406e-02, 2.187e-02, 2.229e-01)); + r += mul(s2_1, M4(-1.144e-01, 3.300e-02, 1.841e-01, 2.472e-02, -3.033e-01, -5.392e-01, 4.039e-01, -7.624e-03, 1.104e-01, -4.457e-02, 1.784e-01, 2.715e-01, 2.169e-02, 1.997e-02, 3.160e-02, 1.185e-02)); + r += mul(s2_2, M4(5.688e-02, -2.599e-02, -2.319e-01, -1.469e-01, 7.917e-02, 1.217e-01, -5.545e-02, -1.032e-01, -1.998e-01, 5.322e-02, 6.770e-03, -1.039e-01, -8.576e-02, -6.547e-02, -7.809e-02, -2.821e-01)); + r += mul(s2_3, M4(1.753e-02, 2.562e-02, 3.190e-02, 5.736e-02, -5.852e-01, 3.539e-03, 3.772e-01, 1.215e-01, -3.855e-02, 2.189e-01, -1.070e-01, 4.810e-02, -2.566e-02, -1.954e-02, -6.151e-02, 6.944e-02)); + r += mul(s2_4, M4(-6.889e-02, 3.412e-03, 6.761e-03, -2.931e-02, -6.143e-01, -3.518e-01, 5.373e-02, 7.054e-02, -1.948e-02, -1.110e-01, 1.130e-01, -8.545e-02, 2.696e-02, -3.268e-02, -9.364e-02, -4.108e-02)); + r += mul(s2_5, M4(-1.225e-01, 6.195e-02, -1.952e-02, 9.308e-02, -2.384e-01, 1.145e-01, -1.627e-01, 2.213e-01, -1.555e-03, 9.597e-02, -1.522e-01, 1.507e-01, -2.537e-02, 1.745e-02, -7.436e-02, -1.538e-02)); + r += mul(s2_6, M4(-3.516e-02, 1.166e-01, -1.581e-01, -7.152e-02, -2.311e-01, -5.554e-01, 1.196e-01, 9.133e-02, -5.553e-02, -7.650e-02, 6.208e-03, 9.953e-02, -3.923e-02, 1.282e-01, 8.115e-02, -9.125e-02)); + r += mul(s2_7, M4(-4.273e-02, -1.592e-02, -2.201e-01, 1.755e-01, 2.373e-01, -3.873e-01, -2.481e-01, -2.088e-01, -3.757e-02, -6.478e-02, -1.204e-01, -4.478e-02, -3.462e-02, 2.490e-02, 1.454e-01, -2.777e-02)); + r += mul(s2_8, M4(6.972e-03, -1.572e-01, -2.195e-01, -1.669e-01, 9.833e-02, -9.097e-02, -2.890e-01, 4.248e-01, -5.493e-02, 1.569e-01, -1.205e-01, -3.168e-02, -2.535e-02, 7.545e-02, 6.862e-02, 3.931e-02)); + r += mul(s3_0, M4(7.353e-02, -3.805e-04, 3.388e-02, 1.743e-01, -4.692e-03, -5.937e-02, 2.209e-02, -2.106e-02, 4.100e-02, -7.074e-02, 3.180e-02, -9.841e-02, 3.646e-02, -5.433e-02, -1.609e-01, 8.015e-03)); + r += mul(s3_1, M4(-1.315e-01, 1.033e-03, 1.096e-01, -7.715e-02, -1.812e-01, 1.179e-02, 1.870e-02, 3.131e-02, -2.752e-02, 1.077e-01, -9.963e-03, 1.084e-01, -6.595e-02, -2.094e-01, 1.140e-01, -4.945e-02)); + r += mul(s3_2, M4(5.571e-02, 6.210e-02, -1.623e-02, 8.368e-03, -1.408e-01, -9.622e-03, 4.700e-02, 1.432e-02, -7.276e-03, 1.324e-02, 5.876e-02, -1.067e-01, -4.464e-02, -9.793e-02, -9.425e-02, -1.411e-01)); + r += mul(s3_3, M4(-3.458e-02, -5.870e-02, 6.770e-02, 1.029e-02, 6.527e-02, -1.635e-02, 5.908e-02, -4.672e-02, 9.661e-02, -1.748e-02, -1.440e-01, -1.449e-01, -1.096e-01, -3.897e-02, -3.221e-02, -1.150e-01)); + r += mul(s3_4, M4(1.564e-02, -8.144e-02, 5.939e-02, -4.613e-02, -1.032e-01, -7.433e-02, 1.248e-01, 1.520e-02, -4.192e-02, -1.883e-02, 1.772e-01, 5.885e-02, -1.387e-01, -1.972e-01, 1.235e-01, 7.554e-02)); + r += mul(s3_5, M4(-1.157e-01, 4.967e-02, 1.229e-01, 1.896e-03, -1.007e-01, -4.251e-02, 5.625e-02, 9.364e-02, 6.603e-02, -7.735e-03, -6.559e-02, -1.652e-01, -4.909e-02, -1.829e-02, -1.763e-01, -3.099e-02)); + r += mul(s3_6, M4(1.098e-02, 2.031e-01, 9.523e-02, 1.802e-01, -2.358e-02, -2.145e-02, -1.352e-01, -1.158e-01, 9.923e-02, 8.149e-03, 1.769e-02, 8.410e-02, -1.697e-01, 1.352e-01, 1.234e-01, 1.555e-01)); + r += mul(s3_7, M4(2.095e-01, 3.668e-02, -1.419e-01, -1.490e-01, 5.141e-02, -1.244e-01, -5.789e-02, -2.059e-02, 2.748e-02, -3.486e-02, -7.727e-02, -5.393e-02, -1.747e-01, -1.610e-01, -1.276e-02, -9.515e-02)); + r += mul(s3_8, M4(1.033e-02, -3.392e-02, -2.311e-01, -3.520e-02, 1.150e-01, -3.758e-02, 7.600e-03, 1.172e-01, -1.360e-02, 1.151e-02, -2.404e-02, 2.077e-01, 2.845e-01, -1.232e-01, -8.156e-02, -1.894e-01)); + r += mul(s4_0, M4(-9.735e-02, -3.486e-02, -6.713e-02, -2.585e-02, -6.854e-02, 6.316e-02, 8.265e-03, -6.834e-02, 7.139e-02, -5.798e-02, 6.760e-02, -1.391e-01, 7.996e-02, -2.167e-02, -1.062e-01, 2.066e-01)); + r += mul(s4_1, M4(-8.635e-02, 2.987e-02, -4.322e-02, -3.828e-02, 5.137e-03, 4.678e-02, -1.404e-01, 5.578e-02, -2.783e-01, -1.015e-01, 3.459e-01, -2.319e-01, 1.553e-01, 2.762e-04, 1.473e-01, 1.165e-01)); + r += mul(s4_2, M4(-7.463e-02, -4.850e-02, -7.089e-02, -2.267e-02, -4.120e-02, -5.133e-02, -4.900e-02, 1.918e-02, -1.260e-01, 2.254e-03, -2.160e-01, 6.045e-02, 2.996e-02, -6.463e-03, -1.101e-02, 5.736e-02)); + r += mul(s4_3, M4(1.193e-02, -2.418e-02, 4.533e-02, 5.430e-02, -9.467e-02, 3.288e-02, -5.260e-02, 8.023e-02, 1.474e-01, -4.439e-02, -8.914e-02, -1.458e-01, -3.892e-02, 8.081e-02, -9.803e-02, 1.021e-01)); + r += mul(s4_4, M4(-2.304e-01, 1.246e-02, 1.935e-01, -1.178e-01, 1.601e-01, 4.687e-02, 4.043e-02, 8.424e-03, 7.338e-03, -1.905e-01, 1.704e-01, 1.178e-01, -3.089e-02, -1.439e-02, -1.412e-01, -1.774e-01)); + r += mul(s4_5, M4(1.828e-02, -1.877e-03, 1.229e-02, 7.833e-02, 1.167e-02, 1.347e-01, -1.139e-02, -1.327e-02, -1.475e-01, 5.962e-02, -2.596e-01, -1.411e-01, 9.417e-02, 3.386e-02, -3.430e-02, -5.016e-02)); + r += mul(s4_6, M4(1.449e-02, 2.653e-03, 2.908e-02, 6.208e-02, 6.766e-02, 1.268e-01, 1.136e-01, 1.258e-01, -1.932e-02, 3.102e-02, -1.572e-02, 3.379e-02, 5.706e-02, -4.562e-02, 7.471e-02, 5.423e-02)); + r += mul(s4_7, M4(6.315e-02, -1.922e-02, -7.600e-02, -1.088e-01, 5.920e-02, 5.026e-02, 4.642e-02, 8.855e-02, 3.478e-02, -2.381e-01, -4.820e-02, -1.841e-01, 4.603e-02, 1.440e-02, -2.844e-01, -6.164e-02)); + r += mul(s4_8, M4(5.340e-02, 3.927e-02, -3.356e-02, 9.408e-02, 6.674e-02, 1.403e-01, -1.937e-02, -3.005e-02, -1.384e-01, -7.463e-02, -2.501e-01, -1.620e-01, -9.500e-03, -1.138e-01, -1.036e-01, 2.868e-02)); + r += mul(s5_0, M4(2.800e-01, -1.215e-01, -1.408e-01, -5.378e-01, 5.833e-03, 2.368e-02, -9.039e-03, -3.018e-01, 5.485e-02, 7.920e-02, 4.624e-02, -4.291e-02, 5.511e-02, -2.629e-02, -8.483e-02, -1.310e-02)); + r += mul(s5_1, M4(2.315e-01, 2.562e-01, 5.922e-02, 5.734e-01, 1.729e-01, 2.301e-02, -1.977e-01, 1.018e-01, -1.037e-01, -6.595e-02, 6.467e-02, -1.063e-01, -2.122e-02, -1.615e-01, 5.164e-02, 5.493e-02)); + r += mul(s5_2, M4(1.994e-02, -5.266e-02, -5.133e-02, -1.698e-01, 2.320e-01, 2.233e-01, -1.157e-01, 4.154e-01, -2.680e-02, -9.549e-02, 7.711e-03, 4.158e-02, 6.469e-02, 1.245e-01, -3.013e-02, -7.501e-04)); + r += mul(s5_3, M4(2.144e-01, 1.362e-01, -2.548e-02, -1.641e-01, -2.607e-02, 1.424e-01, -1.871e-01, -2.545e-01, 1.510e-01, 4.586e-02, -1.526e-01, 1.189e-01, 1.640e-02, -7.506e-02, -5.653e-03, -3.108e-03)); + r += mul(s5_4, M4(-1.110e-01, -8.102e-02, 1.704e-01, 1.739e-01, 8.720e-02, -2.242e-02, -1.892e-01, -3.763e-01, -1.164e-01, -4.511e-02, 1.446e-01, -4.661e-03, -3.799e-02, -1.243e-01, -8.787e-03, -1.173e-01)); + r += mul(s5_5, M4(2.429e-01, -4.189e-03, -1.239e-01, 7.303e-02, -3.365e-04, 2.011e-01, -1.538e-01, -4.140e-02, -1.297e-01, -6.552e-02, -3.407e-04, 5.280e-02, -1.188e-01, 1.448e-02, 6.314e-02, 6.178e-02)); + r += mul(s5_6, M4(2.389e-01, 3.353e-02, 9.744e-02, -4.271e-01, -3.359e-01, 1.520e-01, 7.034e-02, 6.372e-02, 1.122e-01, -6.739e-02, -1.923e-01, 7.455e-02, -3.936e-02, -2.021e-02, 1.964e-02, 1.082e-01)); + r += mul(s5_7, M4(2.993e-01, 9.326e-02, 2.733e-02, 2.784e-01, -8.332e-02, 2.112e-01, 1.602e-01, 6.696e-02, -9.538e-03, -1.055e-01, -1.819e-01, 5.099e-02, 1.543e-01, -6.303e-02, -1.475e-01, 1.866e-01)); + r += mul(s5_8, M4(-4.296e-02, 7.301e-02, -1.854e-01, 1.012e-01, -1.827e-02, 1.379e-01, 2.076e-02, 4.075e-01, -9.882e-02, -5.355e-02, -2.266e-01, -2.860e-02, 1.387e-01, -6.984e-02, 1.198e-02, 4.958e-02)); + r += mul(s6_0, M4(-4.199e-02, -6.949e-02, 6.321e-03, 1.020e-01, 1.012e-01, 1.717e-02, -1.264e-01, -1.463e-03, 1.513e-01, 3.324e-01, 2.602e-01, 5.010e-01, -9.360e-02, 6.098e-02, 5.095e-02, 1.808e-01)); + r += mul(s6_1, M4(-2.671e-02, 3.535e-02, -3.235e-02, 1.113e-02, -5.662e-02, -2.013e-02, -3.218e-02, -1.404e-01, -2.585e-01, 3.519e-01, 3.055e-02, 1.426e+00, -5.909e-02, -8.276e-02, 1.303e-01, 4.591e-02)); + r += mul(s6_2, M4(2.104e-02, -1.997e-02, -1.282e-02, -1.288e-01, -4.834e-02, -8.819e-03, -1.001e-01, 1.190e-01, -6.097e-01, 4.538e-01, 3.375e-02, 7.287e-01, -4.996e-02, 1.007e-02, -6.780e-02, -9.774e-02)); + r += mul(s6_3, M4(8.145e-02, -1.226e-02, -2.695e-01, -1.840e-01, -2.791e-03, 3.953e-02, 5.544e-02, 1.626e-01, -8.656e-02, 8.049e-01, 8.527e-02, 1.007e+00, 1.289e-01, 6.034e-02, 5.650e-02, 5.077e-02)); + r += mul(s6_4, M4(-5.059e-02, -5.942e-02, -1.618e-01, -1.326e-01, 4.363e-02, -8.956e-02, -1.675e-02, 5.685e-02, -7.273e-02, 7.846e-01, -1.943e-01, 9.296e-01, -1.506e-02, -6.739e-04, -1.322e-01, -5.708e-02)); + r += mul(s6_5, M4(-5.501e-02, 7.983e-02, 8.777e-02, 6.892e-02, 2.920e-02, -7.697e-02, 1.084e-01, 8.862e-02, -2.660e-01, 6.913e-01, -4.073e-01, 9.941e-01, -1.284e-01, 5.222e-03, -3.999e-02, 8.610e-03)); + r += mul(s6_6, M4(6.583e-02, 4.271e-02, 2.569e-01, 8.534e-02, -1.704e-01, 5.589e-02, -3.546e-03, -1.523e-01, -1.311e-01, 8.730e-01, 3.699e-02, 6.776e-01, 6.118e-02, 1.445e-02, 1.026e-02, 2.652e-02)); + r += mul(s6_7, M4(1.279e-02, -1.900e-03, 7.960e-02, -1.289e-01, 8.040e-02, 2.170e-02, 7.302e-02, -1.060e-01, 1.450e-01, 7.483e-01, 9.028e-02, 1.651e-01, -2.201e-01, 9.073e-02, 2.536e-01, -1.352e-01)); + r += mul(s6_8, M4(-2.910e-02, 4.179e-03, 1.675e-02, -3.174e-02, -2.982e-02, -2.929e-02, 1.555e-03, 2.411e-03, -3.180e-01, 9.460e-01, 1.352e-01, -1.250e-01, -2.457e-02, 6.235e-02, -4.464e-02, 7.891e-03)); + r += mul(s7_0, M4(-6.169e-02, -1.517e-01, -1.996e-02, 1.295e-01, -2.849e-02, -1.885e-01, -1.792e-01, -8.735e-02, -8.643e-02, -1.027e-01, -2.212e-02, 1.958e-02, -9.077e-02, 1.214e-01, -8.204e-02, -1.169e-01)); + r += mul(s7_1, M4(-2.212e-01, -7.720e-02, 1.765e-02, -3.732e-01, 1.117e-01, -2.174e-01, 1.636e-01, -8.238e-02, 2.783e-02, 2.234e-02, -1.158e-01, -1.121e-01, 7.623e-02, -8.504e-02, -1.329e-01, 9.974e-02)); + r += mul(s7_2, M4(-6.344e-02, 2.761e-02, -1.002e-01, -8.684e-02, 2.075e-01, 1.503e-01, -1.899e-01, 8.479e-03, 1.561e-02, -6.885e-02, 1.325e-02, -4.810e-02, -5.711e-02, -1.432e-02, -6.513e-02, -7.492e-02)); + r += mul(s7_3, M4(-2.427e-01, 2.396e-01, 8.939e-02, 4.002e-01, 1.633e-01, 7.055e-02, 2.189e-01, -6.663e-02, -1.279e-02, 4.636e-02, -8.664e-03, 1.132e-02, -2.329e-01, 6.385e-02, -8.100e-02, 2.979e-02)); + r += mul(s7_4, M4(-2.821e-02, 5.042e-02, 1.950e-01, 2.954e-02, 2.501e-01, 8.593e-02, 1.409e-02, 2.578e-01, -1.368e-01, 1.928e-01, -6.146e-02, -7.787e-02, -8.456e-02, -1.480e-01, -2.411e-02, 3.021e-02)); + r += mul(s7_5, M4(-1.217e-01, 1.643e-01, -3.103e-02, -7.779e-02, -1.296e-01, 1.216e-01, 1.362e-01, 2.597e-01, 6.748e-02, -9.254e-04, -4.988e-02, -1.005e-01, -5.144e-02, -1.559e-01, -8.093e-02, -7.864e-02)); + r += mul(s7_6, M4(-1.545e-01, 1.825e-01, 2.664e-01, 3.557e-01, -2.919e-01, 3.683e-02, 1.001e-01, -5.162e-03, -5.217e-02, -1.259e-01, 3.705e-02, 6.868e-02, 2.186e-01, -6.010e-02, -1.280e-01, -8.277e-02)); + r += mul(s7_7, M4(1.190e-01, 2.876e-02, 1.043e-02, 4.347e-01, 5.788e-02, -8.798e-02, 1.988e-01, -1.649e-01, 1.316e-02, 3.971e-02, -6.393e-03, 1.290e-01, -2.058e-03, -1.706e-01, 1.685e-01, 2.529e-01)); + r += mul(s7_8, M4(-7.538e-02, 1.036e-01, -1.008e-01, 2.185e-01, -3.579e-02, 2.764e-01, 1.386e-03, -1.145e-01, -2.264e-02, -2.090e-02, 5.644e-02, -1.025e-01, -1.019e-01, 1.294e-01, -2.593e-02, 8.675e-02)); + r += V4(-7.017e-03, -3.288e-02, -1.861e-02, -1.819e-02); + return r; +} + +V4 f2(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-7.581e-03, 5.764e-02, 6.289e-02, 1.514e-02, 1.221e-01, 4.928e-01, -5.057e-02, -1.483e-02, -1.792e-01, 8.489e-03, -1.431e-01, 5.868e-02, -3.492e-02, -7.226e-02, -2.105e-01, -1.764e-01)); + r += mul(s0_1, M4(-6.464e-02, 1.506e-01, 1.133e-01, -3.755e-02, -2.756e-01, 5.449e-02, -7.036e-02, -1.405e-01, -1.942e-01, -2.099e-01, 2.038e-02, -1.083e-01, -1.265e-01, 5.352e-04, -8.953e-02, 1.424e-01)); + r += mul(s0_2, M4(1.567e-01, 6.428e-03, -5.115e-02, -1.072e-01, -2.739e-01, 1.045e-01, 8.730e-02, -8.456e-02, -4.602e-02, -2.847e-01, 1.083e-01, -1.294e-01, -1.015e-01, -1.025e-02, 1.041e-02, -1.304e-01)); + r += mul(s0_3, M4(-4.572e-02, -1.455e-02, 5.614e-02, -2.425e-02, 2.413e-01, -1.611e-01, 1.586e-02, -8.876e-02, -1.026e-01, -1.917e-01, -2.480e-03, 2.035e-01, 6.331e-03, -3.646e-01, -1.175e-01, 2.484e-01)); + r += mul(s0_4, M4(1.387e-01, 4.597e-02, -1.948e-01, -1.308e-01, 1.082e-01, 3.149e-01, -1.774e-01, 6.195e-02, -2.746e-01, -7.085e-02, -3.781e-01, -5.056e-02, -2.648e-01, -3.117e-01, 4.133e-02, -8.854e-02)); + r += mul(s0_5, M4(-1.232e-01, 7.906e-02, -1.870e-01, 2.458e-02, -5.047e-02, -1.065e-01, 3.048e-02, -4.759e-02, -2.323e-01, -2.952e-02, -2.927e-01, -1.625e-01, -3.878e-02, -1.678e-02, -1.532e-01, 1.148e-01)); + r += mul(s0_6, M4(1.387e-02, -2.661e-02, -2.866e-04, 5.459e-02, -3.236e-01, 1.805e-02, -1.612e-01, -1.243e-01, -1.931e-01, -8.690e-02, 1.062e-01, -2.763e-01, -1.862e-01, 1.799e-01, -7.901e-02, 1.175e-02)); + r += mul(s0_7, M4(-2.899e-02, -2.938e-02, 8.832e-02, -9.537e-04, -3.940e-02, 2.951e-03, 1.549e-01, 7.872e-02, -8.307e-02, -9.757e-02, -6.711e-02, 1.056e-02, 2.290e-01, 2.113e-01, -4.343e-02, -3.240e-01)); + r += mul(s0_8, M4(-4.447e-02, -4.737e-02, -8.591e-02, -1.686e-01, 2.065e-02, 2.123e-01, 1.514e-01, -1.460e-01, -6.031e-02, 1.517e-01, -1.982e-01, -1.426e-01, -4.185e-02, -1.391e-01, -1.208e-01, -3.198e-04)); + r += mul(s1_0, M4(-2.046e-02, 4.678e-03, 2.224e-01, 3.020e-01, -3.632e-02, -7.535e-02, 1.002e-02, -8.862e-02, -6.067e-03, -1.110e-01, 5.225e-02, 1.497e-01, -1.390e-01, -1.191e-01, -2.232e-02, -6.692e-03)); + r += mul(s1_1, M4(-1.366e-01, -5.478e-02, 2.148e-01, 2.632e-01, -2.041e-01, -2.066e-01, -2.040e-01, -1.025e-01, 7.493e-02, 3.911e-02, -1.173e-04, 7.517e-02, 3.558e-02, 9.945e-02, 6.047e-02, 4.600e-02)); + r += mul(s1_2, M4(4.576e-01, 1.579e-01, -3.173e-02, -2.815e-01, -1.532e-01, 2.862e-02, 5.831e-02, 1.509e-01, 3.045e-02, 9.582e-02, 1.986e-02, -6.961e-02, 1.850e-02, -1.108e-01, 4.282e-02, -3.387e-02)); + r += mul(s1_3, M4(1.732e-01, 1.267e-01, 4.647e-01, 2.656e-02, 2.940e-01, -1.993e-01, -4.426e-02, 9.008e-02, 8.253e-02, 7.108e-03, -1.494e-01, -1.288e-01, 9.136e-02, 3.714e-02, 2.129e-02, -1.684e-01)); + r += mul(s1_4, M4(-5.636e-02, -2.412e-01, 4.480e-01, -2.122e-01, 2.270e-01, 3.985e-01, -2.752e-01, 9.774e-02, -3.704e-03, 2.587e-01, 1.135e-02, 3.374e-02, -1.561e-01, 1.880e-02, 1.153e-01, -1.707e-01)); + r += mul(s1_5, M4(7.268e-02, -3.111e-01, -8.362e-02, -1.898e-01, 3.023e-02, 1.225e-01, 4.258e-02, -9.576e-03, -8.835e-02, 7.056e-02, 6.475e-02, -1.310e-01, 1.088e-02, -2.065e-02, -1.054e-01, -1.411e-01)); + r += mul(s1_6, M4(-8.884e-02, 2.483e-01, -6.000e-02, 1.005e-01, -1.314e-01, -3.988e-02, -1.323e-01, 1.256e-01, -1.535e-03, -2.209e-02, -3.661e-02, 6.688e-02, 5.027e-02, 3.482e-02, 6.547e-03, 1.188e-01)); + r += mul(s1_7, M4(6.344e-02, 1.579e-01, 1.679e-01, 2.667e-01, 1.531e-01, -2.901e-02, 1.724e-01, 2.930e-01, -1.711e-02, 8.647e-02, 1.046e-01, 1.191e-02, 1.342e-01, 8.340e-02, 8.214e-03, 2.079e-01)); + r += mul(s1_8, M4(-3.021e-01, 1.907e-02, -2.016e-01, 1.267e-01, -2.294e-02, -5.400e-02, 9.827e-02, -5.517e-02, -5.363e-02, -4.889e-02, 6.296e-02, -9.737e-03, 3.925e-02, 5.326e-02, 7.340e-03, -7.322e-04)); + r += mul(s2_0, M4(-1.444e-01, 1.028e-01, -1.690e-01, 4.507e-03, -3.979e-01, -5.055e-01, 8.414e-02, -2.992e-01, -1.153e-01, 1.809e-01, 4.605e-02, -5.255e-02, 1.754e-01, 2.028e-02, 8.436e-02, 2.540e-02)); + r += mul(s2_1, M4(-1.711e-01, -4.863e-02, -6.410e-02, -1.019e-01, -4.134e-01, 4.277e-02, -2.486e-01, -3.703e-01, -2.274e-01, -2.226e-01, 1.523e-01, 2.370e-01, -4.884e-02, -1.029e-01, -1.104e-01, 8.226e-02)); + r += mul(s2_2, M4(-8.140e-02, 1.081e-01, 1.777e-01, 1.003e-02, -3.272e-01, 9.784e-03, 2.820e-01, -8.613e-03, 9.318e-02, -3.326e-01, -3.971e-02, 1.246e-01, 1.257e-01, -6.054e-02, -6.647e-02, 7.432e-02)); + r += mul(s2_3, M4(1.508e-01, -8.128e-02, -5.221e-02, -6.611e-02, 3.457e-01, 4.610e-01, -4.847e-01, -7.489e-01, -4.416e-02, 1.110e-02, 1.604e-02, -1.602e-01, 2.462e-02, -1.182e-01, -1.151e-02, -5.689e-03)); + r += mul(s2_4, M4(1.936e-01, 6.475e-02, 4.692e-03, 1.287e-01, 1.099e-01, -6.930e-04, -6.362e-01, -8.032e-01, 3.933e-03, 6.387e-02, -1.938e-01, -5.386e-02, -1.930e-01, -1.201e-01, -5.197e-02, 2.089e-02)); + r += mul(s2_5, M4(1.472e-01, 1.752e-02, 1.642e-01, 5.075e-02, -1.939e-01, -1.430e-02, -2.506e-01, -2.485e-01, -1.068e-01, -1.327e-01, -6.546e-02, -2.278e-01, 2.349e-02, 3.054e-02, 1.091e-01, -1.302e-01)); + r += mul(s2_6, M4(-8.224e-02, 3.867e-02, -4.681e-02, -6.327e-02, 3.796e-01, -2.604e-01, -1.010e-01, -2.640e-01, 1.778e-01, 2.419e-02, 1.026e-01, -6.207e-02, -7.240e-03, -1.114e-02, 1.119e-01, 1.810e-02)); + r += mul(s2_7, M4(-5.650e-04, 1.023e-02, -8.498e-03, -1.265e-02, 1.975e-01, -1.816e-01, -1.205e-01, -3.322e-01, -1.140e-01, 1.550e-01, 3.409e-02, 1.268e-01, -1.322e-02, 5.101e-02, -2.385e-02, -1.287e-01)); + r += mul(s2_8, M4(-1.391e-01, 8.706e-02, 2.942e-01, 1.300e-01, 4.721e-02, -3.099e-01, -2.001e-01, -5.063e-01, 4.158e-02, 4.024e-02, -1.037e-01, 2.470e-02, -2.557e-02, 1.965e-02, -2.441e-02, 9.164e-02)); + r += mul(s3_0, M4(1.647e-01, -1.805e-02, -3.406e-02, -1.294e-01, -1.415e-01, -4.049e-02, 2.216e-02, 1.185e-01, 1.929e-02, -5.613e-02, 8.207e-02, 6.108e-02, 3.670e-02, -2.089e-01, -7.717e-02, 2.253e-01)); + r += mul(s3_1, M4(-7.123e-02, -3.315e-01, -4.448e-02, -5.631e-02, -3.428e-02, -1.262e-01, -4.484e-02, -1.613e-02, -2.587e-03, -1.097e-01, 1.216e-01, -1.016e-01, 5.639e-02, -4.027e-01, 5.756e-02, -1.267e-02)); + r += mul(s3_2, M4(-7.166e-02, 2.423e-01, 3.399e-02, 6.326e-02, -1.613e-01, 5.102e-02, 3.494e-02, 7.078e-03, -8.212e-02, 5.988e-02, -3.490e-02, -8.170e-02, -2.060e-01, 3.550e-02, 7.665e-02, -6.092e-03)); + r += mul(s3_3, M4(3.093e-02, -6.196e-02, -1.018e-01, 1.027e-02, 2.010e-03, -2.233e-02, -3.281e-02, -7.155e-02, 1.719e-01, -2.694e-02, 3.917e-03, -3.190e-02, -2.370e-01, 2.511e-01, 2.929e-02, 8.000e-02)); + r += mul(s3_4, M4(-8.777e-02, 9.786e-02, 4.368e-02, 5.115e-02, 1.074e-01, 4.259e-02, 1.114e-01, 2.402e-01, 2.019e-02, 1.234e-01, -1.880e-01, -6.301e-04, -2.513e-01, -8.639e-03, -7.225e-02, 1.418e-01)); + r += mul(s3_5, M4(-2.268e-01, 2.029e-01, -1.185e-01, -5.495e-02, -1.163e-01, 4.372e-02, 8.053e-02, -1.812e-02, -9.069e-02, -3.884e-02, 8.661e-02, 2.608e-01, 1.140e-01, -7.601e-03, 5.186e-02, 3.865e-02)); + r += mul(s3_6, M4(2.052e-02, 4.939e-03, 1.158e-01, -6.508e-02, 8.047e-02, -4.546e-02, 3.617e-02, -1.138e-01, -2.398e-02, -6.332e-02, -1.038e-01, 8.081e-02, -2.302e-01, 8.088e-02, 3.060e-01, 2.446e-01)); + r += mul(s3_7, M4(1.062e-01, 1.106e-01, 1.035e-02, 1.028e-01, 1.072e-01, -3.130e-02, 1.465e-01, -1.049e-01, -4.924e-02, 1.304e-02, -9.063e-02, 6.612e-02, 4.834e-01, -1.259e-01, 7.290e-02, 4.857e-01)); + r += mul(s3_8, M4(1.174e-02, 5.546e-02, 1.373e-01, 7.799e-02, -1.851e-02, -6.496e-03, -1.534e-02, -1.367e-02, 5.389e-02, 8.490e-02, 6.008e-02, -2.141e-02, -1.899e-01, 8.971e-02, 1.200e-01, -4.990e-01)); + r += mul(s4_0, M4(-7.002e-03, 5.508e-02, 1.741e-02, 6.846e-02, 4.935e-02, 1.226e-01, 5.007e-02, -2.383e-02, -1.428e-01, 8.378e-02, -5.937e-02, -1.099e-01, 2.281e-01, -2.436e-02, 1.209e-01, -3.198e-02)); + r += mul(s4_1, M4(-7.399e-02, -4.566e-02, -7.268e-02, -1.275e-02, -5.746e-02, 7.156e-02, 4.005e-02, 1.183e-01, 5.846e-02, 2.354e-01, -3.516e-02, -5.764e-02, 1.953e-01, 3.119e-02, 1.454e-01, -1.406e-02)); + r += mul(s4_2, M4(3.127e-02, -8.150e-02, 8.277e-02, 1.413e-01, 5.123e-02, 2.205e-02, 3.230e-02, 5.683e-02, 4.894e-03, -1.257e-01, 9.340e-02, 2.224e-02, 1.370e-01, 7.398e-02, -6.368e-03, 1.608e-02)); + r += mul(s4_3, M4(6.881e-02, -3.375e-03, 1.056e-01, -5.304e-02, -1.064e-01, -4.148e-02, 8.624e-02, -4.904e-02, -7.752e-03, -7.298e-02, -7.932e-04, -1.262e-01, 2.048e-01, 3.475e-02, -1.271e-01, 1.224e-02)); + r += mul(s4_4, M4(2.041e-04, -4.132e-02, -2.237e-01, -3.584e-02, 3.167e-02, -3.019e-03, 2.618e-02, -5.664e-02, 1.946e-01, 1.340e-01, -1.109e-01, -2.126e-01, 3.268e-01, 2.296e-01, -9.041e-02, 1.938e-01)); + r += mul(s4_5, M4(-3.432e-02, 1.126e-01, -1.291e-02, 1.289e-01, 3.903e-02, -1.367e-01, 6.517e-02, -5.216e-04, -4.940e-02, 1.556e-01, -2.347e-02, -1.418e-01, 2.151e-01, 2.646e-01, -6.822e-02, 4.200e-02)); + r += mul(s4_6, M4(-2.471e-02, 7.440e-02, -5.017e-02, -1.015e-01, -6.059e-02, -3.496e-02, 4.484e-02, -9.797e-03, 2.390e-01, 4.988e-02, 6.820e-02, 1.513e-01, -4.653e-02, 7.645e-02, 1.273e-01, 2.260e-02)); + r += mul(s4_7, M4(3.388e-02, -1.471e-01, 4.271e-02, -2.965e-05, -6.814e-02, -4.665e-04, -4.201e-02, -4.251e-02, 3.050e-01, 1.337e-01, -1.464e-01, 8.366e-02, 8.331e-03, 2.890e-02, -4.571e-03, 8.624e-02)); + r += mul(s4_8, M4(1.735e-02, -4.533e-02, 5.140e-02, -1.281e-01, -8.486e-03, 4.054e-03, -8.573e-03, -1.170e-02, -1.231e-01, -1.433e-01, 9.381e-02, 3.782e-02, 2.768e-02, -7.110e-02, 5.206e-02, 8.258e-02)); + r += mul(s5_0, M4(-2.181e-01, 6.178e-02, -8.720e-02, -1.409e-01, 1.476e-01, 3.411e-01, 9.144e-02, 6.769e-02, -8.762e-02, -7.521e-02, 2.938e-02, -1.200e-02, 2.207e-02, 1.687e-01, -3.703e-02, -3.066e-02)); + r += mul(s5_1, M4(9.949e-02, 3.700e-01, 1.149e-01, 2.050e-01, 2.727e-02, 9.261e-02, 9.753e-02, 3.320e-01, -6.206e-03, -8.850e-02, -1.404e-01, 2.072e-02, 7.878e-03, 1.309e-01, 8.403e-03, -1.107e-01)); + r += mul(s5_2, M4(-2.403e-01, 2.991e-02, 2.990e-01, -2.211e-01, 4.919e-02, 2.493e-01, 8.766e-02, 2.302e-01, -7.887e-02, 9.146e-02, 4.180e-02, 1.044e-01, 3.087e-02, -4.650e-02, 2.782e-03, -9.519e-02)); + r += mul(s5_3, M4(-6.979e-02, -2.377e-01, 1.708e-01, -1.276e-02, 1.923e-02, 8.070e-02, 3.884e-01, 8.077e-02, 2.241e-01, 1.601e-02, -1.076e-01, -1.517e-02, -1.445e-01, -1.506e-01, -6.133e-02, -1.256e-02)); + r += mul(s5_4, M4(4.506e-01, 7.498e-01, -3.484e-02, -4.042e-02, -9.386e-02, -1.795e-01, 1.740e-01, 4.823e-01, -5.567e-02, 3.168e-02, 1.078e-01, 8.777e-02, 1.062e-01, 8.114e-02, -1.237e-01, -1.974e-03)); + r += mul(s5_5, M4(-1.471e-01, -6.964e-02, -1.597e-02, 3.554e-02, 6.958e-02, 7.652e-02, 4.270e-02, 4.024e-01, -1.123e-01, 1.554e-03, 1.842e-01, -1.366e-01, 2.237e-02, 5.522e-02, -9.837e-02, -3.022e-02)); + r += mul(s5_6, M4(5.915e-02, -1.744e-01, -4.662e-04, 2.549e-01, -1.787e-01, 4.083e-01, 3.959e-01, 2.818e-01, 2.729e-01, -8.656e-02, -4.996e-02, -2.870e-04, 5.173e-03, -1.345e-01, 2.743e-02, 7.207e-02)); + r += mul(s5_7, M4(-4.325e-02, -1.319e-01, 3.855e-01, 2.217e-01, -3.173e-01, -8.804e-02, 1.035e-01, 5.375e-01, 4.128e-02, -3.985e-03, 7.725e-02, -1.015e-01, -2.278e-02, -1.185e-01, 2.272e-01, -1.947e-01)); + r += mul(s5_8, M4(-4.690e-03, -7.318e-02, 1.432e-01, 4.873e-01, 4.692e-02, 2.026e-01, 1.888e-01, 4.836e-01, 4.146e-02, 8.686e-03, 1.694e-01, 5.939e-02, -8.867e-03, -9.594e-02, -6.524e-02, -1.929e-01)); + r += mul(s6_0, M4(1.568e-01, -2.073e-02, 8.341e-02, -2.046e-01, -9.280e-03, 2.334e-02, -2.938e-02, -5.672e-02, 4.066e-01, 2.305e-01, -1.271e-02, 6.631e-01, 1.497e-01, 4.212e-02, 8.599e-02, -7.885e-02)); + r += mul(s6_1, M4(2.515e-01, -9.740e-02, 3.432e-02, -1.194e-01, -9.355e-02, 3.657e-02, -5.205e-02, 8.594e-02, 5.878e-02, 7.739e-01, -1.422e-01, 3.957e-01, 1.517e-01, 3.349e-02, 9.690e-02, -7.139e-03)); + r += mul(s6_2, M4(1.954e-02, -1.181e-01, 4.747e-02, 1.045e-01, 4.518e-02, 1.305e-01, -2.697e-02, 6.527e-02, 7.863e-02, 8.908e-01, -1.274e-01, 4.605e-01, 1.267e-02, 9.088e-02, -1.163e-01, -5.796e-03)); + r += mul(s6_3, M4(1.233e-02, -6.354e-02, 3.720e-02, 7.892e-02, -5.153e-02, 1.068e-01, -1.965e-02, 8.320e-02, 8.402e-01, 4.660e-01, -3.976e-01, 4.275e-01, -2.392e-02, -1.018e-01, -6.422e-02, 5.182e-02)); + r += mul(s6_4, M4(-2.903e-02, 3.879e-02, 2.918e-02, 8.715e-02, 4.102e-02, -1.282e-01, 1.751e-01, 8.530e-02, 4.392e-01, 1.070e+00, -6.528e-01, 9.735e-02, 2.811e-02, -6.109e-02, -1.582e-01, 1.365e-01)); + r += mul(s6_5, M4(-2.513e-02, 1.878e-02, -2.251e-02, -2.193e-02, 1.118e-01, 1.221e-02, -1.193e-01, -4.231e-02, 3.048e-01, 9.500e-01, -5.301e-01, 6.359e-01, 1.858e-02, -3.289e-02, -1.076e-01, 4.126e-02)); + r += mul(s6_6, M4(-4.805e-02, 1.302e-01, 9.917e-02, -1.466e-02, -7.287e-02, -2.519e-02, 3.926e-02, -9.813e-02, -9.269e-02, 4.149e-01, -4.088e-01, 9.631e-01, 9.875e-02, -9.482e-02, 5.801e-02, 4.301e-02)); + r += mul(s6_7, M4(-9.555e-02, -8.370e-02, -6.806e-02, 2.162e-02, -1.121e-02, -7.891e-02, -4.695e-02, -5.281e-03, -3.754e-01, -2.820e-01, 1.180e-02, 1.720e-01, -3.990e-02, 1.057e-01, -5.257e-02, 1.805e-02)); + r += mul(s6_8, M4(-2.579e-02, -1.194e-01, -8.538e-03, 1.739e-01, 3.480e-02, -4.258e-02, 4.300e-02, 2.388e-02, 5.042e-02, 2.960e-01, 1.991e-01, 1.114e+00, -5.936e-03, -3.309e-02, -1.775e-03, -1.074e-02)); + r += mul(s7_0, M4(-4.948e-01, -5.235e-01, -5.783e-02, 1.154e-01, 3.577e-02, 2.507e-01, -7.143e-02, -4.314e-01, -6.553e-03, -4.330e-02, 3.033e-02, -3.339e-02, -1.357e-01, 8.840e-02, -1.361e-01, -3.746e-02)); + r += mul(s7_1, M4(-3.641e-01, 5.871e-02, -8.952e-02, 4.781e-01, -1.201e-01, -2.183e-01, -1.605e-01, -4.684e-01, 1.597e-01, -1.616e-01, 1.642e-02, -2.894e-02, -1.706e-01, -4.990e-02, 2.802e-02, 6.643e-02)); + r += mul(s7_2, M4(-4.576e-02, 1.907e-01, 1.280e-01, -1.856e-02, 1.723e-01, -3.408e-01, -1.564e-02, -6.472e-02, 1.314e-01, -7.113e-02, -7.765e-02, 8.551e-02, 5.081e-02, -3.404e-01, -1.670e-01, -3.953e-02)); + r += mul(s7_3, M4(-1.001e-01, -4.048e-01, -1.702e-01, 1.433e-01, -1.750e-02, -1.612e-02, 1.528e-02, -1.222e-01, -3.094e-02, 7.821e-02, -2.875e-02, -4.723e-02, 1.174e-01, 5.041e-02, -3.062e-03, -1.971e-01)); + r += mul(s7_4, M4(-1.204e-01, -7.649e-02, -1.210e-01, 5.221e-02, 2.542e-01, 5.947e-02, 2.175e-01, 2.127e-01, -7.925e-02, 7.789e-02, 1.044e-01, 9.239e-02, -2.241e-01, 1.293e-01, 2.459e-01, -1.729e-01)); + r += mul(s7_5, M4(-1.291e-01, 1.958e-01, -1.094e-01, 1.646e-01, 1.794e-01, -1.150e-01, 1.523e-01, 1.430e-02, -3.675e-02, -5.951e-02, 1.841e-01, -7.548e-02, -7.641e-02, 7.561e-02, 1.775e-01, 9.342e-03)); + r += mul(s7_6, M4(-1.779e-01, 1.218e-01, -6.176e-02, 2.127e-01, -1.294e-01, -1.136e-01, 6.021e-02, 1.557e-02, 2.650e-02, 7.300e-02, 4.451e-02, 3.111e-03, 1.138e-01, 2.764e-02, -7.746e-02, 3.992e-02)); + r += mul(s7_7, M4(-1.950e-01, -2.336e-02, -1.849e-01, 6.938e-02, -1.039e-01, -3.789e-02, 3.041e-02, -2.017e-01, -1.126e-01, -6.084e-02, 1.352e-01, 1.157e-02, -6.909e-02, 5.668e-02, 2.388e-01, 7.445e-03)); + r += mul(s7_8, M4(2.975e-02, -7.086e-02, -5.371e-02, -1.105e-02, -1.465e-01, -8.496e-02, 6.396e-02, 2.739e-01, 2.182e-03, 4.118e-02, -1.874e-01, -7.968e-02, -3.285e-02, -3.565e-02, 1.240e-02, 8.849e-02)); + r += V4(-1.179e-02, -2.914e-02, 6.564e-02, 3.234e-02); + return r; +} + +V4 f3(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(1.753e-02, 1.160e-01, -1.269e-01, 9.143e-02, 1.019e-01, 7.000e-02, -6.194e-02, -5.348e-02, 5.273e-01, 4.315e-02, -2.275e-01, 1.919e-01, -3.212e-01, -2.432e-01, -1.944e-01, 2.996e-01)); + r += mul(s0_1, M4(-4.951e-02, 1.357e-03, 1.031e-01, -4.953e-02, -1.417e-01, -1.463e-01, -6.715e-02, -1.217e-01, -6.400e-01, -5.599e-02, -2.127e-01, 3.810e-02, -8.862e-03, 2.585e-02, -3.099e-02, 1.269e-01)); + r += mul(s0_2, M4(-8.903e-02, -1.431e-01, 1.724e-01, 8.231e-03, 6.244e-02, 4.866e-02, 8.680e-02, 1.017e-01, -2.014e-01, -7.754e-02, -3.044e-03, -2.485e-01, -2.124e-01, 7.233e-02, -9.456e-02, 1.639e-01)); + r += mul(s0_3, M4(1.051e-02, 6.900e-02, -3.804e-02, 7.057e-02, -2.420e-01, 1.190e-01, -1.950e-02, 9.890e-02, 1.897e-02, -1.311e-01, -2.827e-01, 2.823e-01, 5.921e-02, 3.560e-01, -3.249e-01, -1.611e-01)); + r += mul(s0_4, M4(6.422e-02, -3.729e-02, -1.152e-01, 6.029e-02, 2.641e-01, -1.811e-01, -1.823e-01, 6.399e-03, -2.417e-01, -1.529e-01, -5.156e-02, 2.731e-01, 3.111e-01, 5.217e-02, 2.734e-02, -4.023e-04)); + r += mul(s0_5, M4(5.829e-02, -5.505e-02, -1.138e-01, -4.952e-02, -6.139e-02, 2.337e-01, -1.819e-01, 8.360e-02, 4.169e-02, -3.438e-02, 2.903e-02, 2.498e-01, 6.296e-02, -4.415e-02, 1.939e-02, 7.194e-02)); + r += mul(s0_6, M4(1.292e-01, 4.660e-02, -1.532e-02, -9.872e-03, 4.496e-02, 2.380e-01, 1.217e-01, -1.109e-01, -5.028e-02, 1.675e-01, -1.568e-01, 6.519e-02, -1.263e-01, -1.036e-01, 1.377e-02, -1.131e-01)); + r += mul(s0_7, M4(-1.659e-02, -7.879e-02, -2.418e-02, -3.019e-02, -1.356e-01, 4.405e-02, 2.832e-01, -3.750e-02, -1.432e-01, -8.256e-02, 1.373e-02, 3.424e-02, -1.050e-01, 1.883e-01, 4.134e-02, 7.965e-02)); + r += mul(s0_8, M4(2.675e-02, -5.278e-02, -1.958e-01, -2.066e-02, -1.344e-01, 2.913e-02, 7.606e-02, -2.964e-02, -1.313e-01, -9.613e-03, -1.319e-01, 1.505e-02, 1.136e-01, 1.523e-01, -1.058e-01, 4.408e-02)); + r += mul(s1_0, M4(-3.900e-01, 2.456e-01, -4.285e-02, 2.658e-01, -6.556e-02, -3.491e-02, 5.756e-02, 1.538e-01, 1.134e-01, -2.795e-02, 7.565e-03, -7.198e-02, 9.609e-02, -1.510e-01, -5.964e-02, -2.881e-01)); + r += mul(s1_1, M4(1.668e-01, 2.787e-01, 4.333e-02, -2.974e-01, 1.094e-01, -2.211e-01, -8.154e-02, -2.189e-01, 1.551e-01, -3.197e-02, -8.719e-02, -1.484e-01, 4.442e-02, 7.316e-02, -2.625e-02, -8.610e-02)); + r += mul(s1_2, M4(5.845e-02, -1.389e-01, -3.456e-01, -1.044e-01, 3.292e-02, 1.487e-01, -7.203e-02, 8.379e-02, 3.166e-02, 3.898e-02, -5.670e-02, 2.292e-02, 6.872e-02, -4.522e-02, -1.448e-01, 6.844e-02)); + r += mul(s1_3, M4(-3.155e-01, -2.408e-01, -5.448e-02, 4.171e-02, -2.457e-01, -9.897e-02, 8.344e-02, -4.598e-02, 1.920e-02, 4.171e-02, -6.982e-02, 4.977e-02, -6.839e-02, 5.980e-03, 1.086e-01, -1.904e-01)); + r += mul(s1_4, M4(-2.159e-01, 2.080e-01, -9.792e-02, 3.998e-01, 2.786e-01, -1.400e-01, -2.510e-01, 3.333e-01, 2.438e-01, 1.157e-02, 4.421e-02, -2.785e-02, -1.499e-01, 1.087e-01, -1.468e-01, -6.480e-02)); + r += mul(s1_5, M4(1.131e-01, -8.773e-02, 1.201e-01, -3.160e-02, -2.395e-02, 2.306e-01, -2.283e-02, 3.290e-02, -5.039e-02, -1.410e-02, -4.766e-02, 8.466e-02, 9.510e-02, -9.014e-02, 1.913e-01, 4.092e-02)); + r += mul(s1_6, M4(-1.842e-01, -1.553e-01, 9.553e-02, 9.113e-02, -1.162e-01, 7.742e-02, -2.725e-03, -1.880e-02, -1.337e-01, 1.846e-02, 5.310e-02, -5.656e-02, -4.915e-02, 7.530e-03, 8.957e-02, 1.642e-01)); + r += mul(s1_7, M4(-4.356e-01, -1.068e-01, 1.175e-01, -1.185e-01, -1.105e-01, -7.094e-02, 2.674e-01, -5.722e-02, -1.175e-01, 3.593e-02, 5.452e-02, 5.885e-02, 8.733e-02, -2.635e-03, 5.368e-02, -6.987e-03)); + r += mul(s1_8, M4(8.769e-02, 1.854e-01, -1.942e-02, -4.662e-02, -5.551e-03, 4.066e-03, -1.519e-01, 8.958e-02, -6.454e-02, -1.071e-02, 4.913e-02, -7.078e-02, -4.383e-02, -1.590e-02, 6.319e-02, 1.095e-01)); + r += mul(s2_0, M4(-1.729e-01, -2.021e-02, -4.229e-02, 9.926e-02, -3.796e-01, -1.775e-01, -7.721e-01, 4.283e-01, -4.649e-02, -8.597e-02, 7.155e-02, -1.387e-01, -8.587e-02, 5.203e-02, 2.037e-01, 1.290e-01)); + r += mul(s2_1, M4(-9.028e-02, -1.608e-02, 4.919e-02, 4.651e-02, 7.455e-02, 3.268e-01, -1.519e-01, -3.667e-01, -9.927e-02, -2.468e-01, 2.008e-01, 2.132e-01, -1.325e-01, -8.896e-06, 1.261e-01, -4.802e-02)); + r += mul(s2_2, M4(-1.879e-02, 2.161e-01, -1.026e-01, 6.351e-02, -1.240e-01, -1.133e-01, -3.072e-01, -4.096e-01, -2.990e-02, 1.434e-01, -7.412e-02, -1.324e-01, 7.264e-02, 9.586e-02, -4.112e-02, 1.843e-02)); + r += mul(s2_3, M4(2.250e-02, 1.458e-02, -6.317e-02, 1.976e-01, 7.670e-01, -1.387e-01, 1.173e-01, 2.007e-01, -9.971e-02, -2.958e-03, 1.879e-01, -1.306e-01, 8.892e-03, -2.086e-02, 1.666e-01, 9.401e-03)); + r += mul(s2_4, M4(1.537e-01, 3.129e-02, 6.454e-02, -4.913e-02, 4.720e-01, -1.061e-01, -3.422e-01, 1.372e-01, 2.658e-01, -1.857e-01, -2.166e-01, -2.046e-01, 1.218e-01, -2.499e-02, -2.471e-02, -1.758e-01)); + r += mul(s2_5, M4(3.431e-01, 1.888e-01, -1.755e-01, -1.416e-01, 3.933e-01, -3.451e-01, 9.913e-03, 2.057e-01, 4.078e-02, 1.771e-01, 5.514e-02, 1.610e-01, 2.854e-02, 2.748e-02, -1.872e-01, 3.411e-02)); + r += mul(s2_6, M4(-1.003e-01, 8.879e-03, 2.002e-01, 7.435e-03, 2.879e-01, 1.927e-01, 5.846e-02, 5.309e-01, 2.174e-02, -5.902e-02, 2.934e-02, -2.275e-01, -4.843e-02, 3.327e-02, -2.839e-02, 4.788e-04)); + r += mul(s2_7, M4(-6.818e-03, 5.386e-02, 1.705e-01, 1.055e-01, -2.552e-01, 2.348e-01, -5.376e-01, 8.415e-01, 9.206e-02, -2.165e-01, -6.736e-03, 1.054e-01, -5.970e-02, -2.189e-02, 2.291e-02, 8.281e-02)); + r += mul(s2_8, M4(-9.683e-02, 7.370e-02, -1.486e-03, 5.930e-02, -1.231e-01, 5.585e-02, -2.850e-02, 3.915e-01, -1.038e-01, 2.451e-01, 9.171e-03, -8.992e-02, 1.089e-02, -5.349e-02, -7.425e-02, 2.983e-02)); + r += mul(s3_0, M4(6.806e-02, -4.765e-02, -4.098e-02, -1.450e-02, 1.719e-01, -1.118e-01, 7.612e-02, 2.340e-02, -3.503e-02, -1.497e-01, -1.946e-01, 6.818e-02, 2.024e-01, -8.164e-02, -1.750e-01, -1.483e-01)); + r += mul(s3_1, M4(-1.791e-01, -2.131e-01, -1.254e-02, 1.586e-02, 1.273e-01, 1.195e-01, -6.582e-02, 8.326e-02, 4.553e-02, -1.516e-02, 1.181e-01, -4.220e-02, -3.388e-03, 4.326e-02, -2.783e-01, 2.707e-02)); + r += mul(s3_2, M4(-8.434e-02, 1.290e-01, 1.284e-01, 5.182e-02, 1.122e-01, 5.347e-02, 1.215e-01, 1.662e-01, -9.834e-02, 8.082e-04, 1.051e-02, 5.248e-02, -9.915e-02, -2.159e-01, 5.827e-02, -1.049e-01)); + r += mul(s3_3, M4(1.346e-01, -8.483e-02, -1.476e-01, 2.748e-02, 1.791e-02, -4.909e-02, -1.327e-02, -6.284e-02, -4.048e-02, -2.921e-03, 2.202e-02, 8.188e-02, 3.256e-01, 1.427e-01, -9.825e-02, 2.977e-02)); + r += mul(s3_4, M4(-1.412e-01, -1.176e-01, 1.140e-01, 1.489e-01, -6.777e-02, -4.582e-02, 9.809e-02, 2.975e-02, 5.165e-02, -8.093e-02, -6.055e-02, 7.214e-02, 3.706e-01, -4.749e-01, -2.525e-02, -2.335e-01)); + r += mul(s3_5, M4(8.684e-02, 4.703e-02, -1.277e-01, 2.117e-01, -2.123e-02, 1.276e-01, -6.533e-02, 7.431e-02, -6.904e-02, 1.692e-01, 1.729e-02, 1.353e-01, -2.167e-01, 1.675e-01, 1.109e-01, 2.392e-01)); + r += mul(s3_6, M4(3.277e-02, -2.271e-02, -4.455e-02, -1.837e-02, -1.161e-01, -1.299e-01, -3.771e-02, -1.140e-01, -6.393e-02, 1.766e-02, 6.553e-03, -4.404e-02, 6.962e-02, 1.692e-01, -6.897e-02, -6.590e-05)); + r += mul(s3_7, M4(-1.314e-01, -1.961e-01, 8.045e-02, -1.115e-01, -8.862e-02, -4.149e-02, -2.506e-02, -1.571e-03, -6.118e-02, 6.175e-02, 1.056e-01, -1.248e-01, 1.067e-01, -1.729e-01, -8.977e-02, -1.716e-01)); + r += mul(s3_8, M4(-1.046e-01, 1.136e-01, -8.508e-03, 1.211e-01, -8.917e-02, 3.733e-02, 8.172e-02, -5.733e-03, 2.049e-01, 1.795e-01, -1.721e-01, -5.420e-02, 2.037e-01, 2.319e-02, 3.012e-01, -3.095e-01)); + r += mul(s4_0, M4(-6.174e-02, 1.823e-01, 6.577e-02, 7.931e-02, 5.619e-02, 6.599e-02, -2.907e-02, -1.747e-02, 2.922e-02, 4.411e-02, -2.690e-02, -2.129e-01, 2.936e-02, -2.412e-02, -1.066e-02, 3.026e-02)); + r += mul(s4_1, M4(-9.450e-02, -1.038e-01, -1.717e-02, 7.076e-02, -2.367e-01, 1.526e-02, -1.049e-02, 1.390e-02, 8.487e-02, -1.204e-02, -6.444e-02, 1.747e-01, -4.432e-02, -1.778e-01, 5.627e-02, -3.594e-02)); + r += mul(s4_2, M4(1.912e-02, -1.306e-02, -1.746e-01, -4.288e-02, -4.139e-02, 2.986e-02, -4.016e-02, -4.361e-02, 1.453e-01, 6.837e-02, -8.332e-02, -1.564e-01, -3.011e-02, 2.196e-02, -2.421e-02, -2.315e-01)); + r += mul(s4_3, M4(1.118e-01, 6.878e-02, 5.315e-02, 1.246e-01, 3.269e-02, 7.104e-02, 4.679e-02, 3.018e-03, -9.116e-02, -4.459e-02, 8.972e-02, -6.690e-02, -3.056e-02, 1.471e-01, 6.756e-02, 6.757e-02)); + r += mul(s4_4, M4(1.698e-01, -7.062e-02, 6.763e-02, -7.260e-02, -8.372e-02, 4.456e-02, 7.913e-02, -9.825e-02, 1.527e-01, -4.960e-02, -1.660e-01, 1.954e-01, 3.782e-02, -1.666e-01, 1.953e-02, 1.209e-01)); + r += mul(s4_5, M4(-9.017e-02, -1.464e-02, -1.876e-02, 1.001e-01, -1.053e-01, -7.557e-02, -1.448e-01, -9.475e-02, 1.274e-01, 3.928e-01, -4.408e-02, 1.633e-01, 4.701e-02, -2.134e-01, -1.312e-02, 1.216e-02)); + r += mul(s4_6, M4(4.620e-02, -1.978e-02, 6.714e-02, -6.474e-02, 1.636e-02, 9.339e-02, -4.837e-03, 1.756e-03, 8.870e-03, -5.370e-02, -5.992e-02, -1.971e-01, -9.497e-02, -2.736e-02, 6.098e-02, -1.200e-01)); + r += mul(s4_7, M4(-8.177e-02, -8.742e-03, -3.711e-02, 2.097e-02, 8.538e-02, 5.007e-02, -2.769e-02, 6.117e-02, 1.209e-01, -5.349e-02, 2.031e-01, -1.272e-01, -1.418e-01, 8.815e-02, 1.173e-01, 4.758e-02)); + r += mul(s4_8, M4(-2.341e-02, -4.843e-02, -6.954e-02, -1.073e-01, 1.958e-02, -1.200e-02, -1.276e-01, 5.947e-02, -2.526e-01, 1.087e-01, -4.189e-01, -3.295e-02, -7.157e-03, -9.873e-02, -3.551e-02, 2.754e-02)); + r += mul(s5_0, M4(2.855e-01, -9.893e-02, 4.629e-01, 3.685e-01, 1.554e-01, 2.264e-01, 8.320e-02, 3.088e-01, -7.983e-02, -1.085e-01, -1.017e-02, 9.117e-02, 1.422e-01, 1.047e-01, 5.215e-03, -1.489e-01)); + r += mul(s5_1, M4(2.404e-01, 8.492e-02, 1.039e-01, 2.752e-03, 2.740e-01, 1.184e-02, 3.245e-01, 3.345e-01, -4.420e-02, 5.843e-02, -5.644e-02, 5.527e-02, -8.163e-02, -6.649e-02, -8.762e-02, 4.387e-02)); + r += mul(s5_2, M4(-5.425e-02, 1.489e-01, -1.437e-01, -2.529e-01, -1.157e-01, -6.165e-02, 1.275e-01, 3.054e-01, 1.627e-02, 2.292e-01, -4.550e-02, 1.312e-02, -2.202e-01, -9.887e-02, 1.580e-01, -1.435e-02)); + r += mul(s5_3, M4(-1.697e-01, 1.959e-02, 6.914e-02, 4.129e-02, 1.584e-01, 8.147e-02, 1.958e-01, -4.450e-01, 6.746e-02, -1.768e-02, 6.434e-02, 1.126e-01, 3.588e-02, -3.752e-02, -2.925e-02, -2.701e-02)); + r += mul(s5_4, M4(-2.298e-01, 2.289e-01, -2.091e-01, 2.205e-01, 1.286e-01, 3.793e-02, 2.837e-01, 8.140e-02, 2.141e-01, -1.052e-01, -5.835e-02, 1.332e-01, -1.450e-01, -2.986e-02, 5.020e-02, -7.013e-02)); + r += mul(s5_5, M4(-1.075e-01, -3.479e-01, 1.246e-01, -1.686e-01, -7.951e-02, -4.929e-02, 3.006e-01, -2.037e-01, 9.014e-02, 1.676e-01, 5.972e-02, 8.490e-03, -9.535e-02, -8.521e-03, 6.319e-02, 9.563e-02)); + r += mul(s5_6, M4(-1.586e-01, -8.457e-02, 4.014e-01, -2.831e-01, -3.806e-01, 8.747e-02, 7.486e-02, 9.824e-02, -2.501e-02, -8.783e-02, -1.230e-01, 7.386e-02, 2.113e-01, -3.155e-02, -8.221e-02, 4.656e-02)); + r += mul(s5_7, M4(1.175e-02, -9.179e-02, 1.514e-02, 2.905e-01, -3.416e-01, -7.666e-02, -2.358e-01, -5.337e-02, -1.582e-01, 6.928e-02, 1.278e-01, -1.203e-01, 5.235e-02, 6.887e-02, 3.206e-02, -4.626e-02)); + r += mul(s5_8, M4(3.329e-01, -3.605e-02, 2.378e-01, -6.314e-02, -4.085e-01, -1.875e-01, -1.258e-01, -3.102e-01, -4.072e-02, 1.975e-01, 2.059e-02, -3.668e-02, -1.472e-01, -1.499e-01, 6.695e-02, 2.047e-02)); + r += mul(s6_0, M4(-2.750e-01, 5.779e-02, 1.428e-01, -2.794e-03, 1.336e-02, 3.631e-02, 9.575e-02, 1.314e-01, -2.453e-03, 2.720e-01, 3.414e-01, 7.753e-01, 2.981e-01, 2.486e-02, 1.996e-02, 5.238e-02)); + r += mul(s6_1, M4(-2.172e-01, -3.708e-02, -5.879e-02, 9.169e-02, -3.380e-02, -6.326e-02, -2.337e-01, -3.298e-02, 1.424e-01, 5.494e-01, -1.648e-01, 5.078e-01, -1.090e-02, 3.645e-02, 2.296e-02, 1.901e-02)); + r += mul(s6_2, M4(3.577e-02, 6.006e-02, 6.164e-02, 1.085e-01, 6.524e-02, 5.457e-02, -1.931e-01, 4.378e-02, -5.000e-01, 3.868e-01, -2.808e-01, 1.434e+00, -2.766e-01, -1.873e-01, 1.011e-01, -2.703e-01)); + r += mul(s6_3, M4(-4.899e-03, -3.966e-02, 2.964e-01, -1.368e-01, 3.748e-02, 3.274e-02, 5.521e-02, 1.617e-02, 1.966e-02, 2.033e-01, -3.028e-01, 8.351e-01, -3.167e-02, -3.855e-02, -6.558e-02, 1.280e-01)); + r += mul(s6_4, M4(7.920e-02, -2.379e-02, 1.778e-02, 1.055e-03, -2.762e-02, 1.177e-01, 9.482e-02, -6.561e-02, 4.040e-01, 6.195e-01, 1.967e-01, 1.053e+00, -5.925e-02, -1.213e-01, 9.595e-02, -1.081e-01)); + r += mul(s6_5, M4(-2.577e-02, 6.871e-03, 1.317e-01, -4.759e-02, -1.998e-02, -2.636e-02, 1.609e-02, -1.392e-01, -8.404e-01, 3.874e-01, 1.802e-01, 1.588e+00, -1.716e-03, -1.695e-01, 1.894e-01, -4.657e-02)); + r += mul(s6_6, M4(-2.028e-03, 5.885e-02, 1.136e-02, 9.104e-02, 7.997e-03, 3.105e-02, 1.839e-03, 1.654e-01, -4.107e-01, 8.543e-02, 1.357e-01, 1.067e+00, -1.180e-01, -1.710e-02, 8.009e-02, 5.065e-02)); + r += mul(s6_7, M4(7.280e-02, 4.661e-02, -9.582e-02, -1.309e-01, -2.232e-03, -9.439e-02, 3.515e-02, -1.917e-01, -7.614e-01, 6.188e-01, 3.196e-01, 9.877e-01, -9.609e-02, 1.005e-02, -1.771e-01, 1.163e-01)); + r += mul(s6_8, M4(-1.872e-02, -9.173e-02, 1.890e-02, 7.081e-03, -5.329e-02, -5.919e-02, 2.833e-02, 1.134e-01, -9.223e-01, 3.772e-01, -1.301e-01, 6.352e-01, -2.958e-02, -1.044e-01, -1.302e-01, -7.854e-02)); + r += mul(s7_0, M4(1.434e-01, -3.259e-01, -8.240e-02, -1.579e-01, 1.615e-01, -6.471e-02, -4.002e-02, -1.113e-01, -1.132e-02, 4.376e-02, -6.766e-02, -9.032e-02, 5.690e-02, 1.125e-01, -1.094e-01, -1.650e-01)); + r += mul(s7_1, M4(-2.541e-02, 6.512e-02, -9.465e-02, -2.184e-01, -2.772e-01, 7.455e-03, -3.263e-02, 2.454e-01, 4.006e-02, 3.165e-02, 1.181e-02, -5.626e-02, 1.704e-01, 1.682e-01, -8.115e-02, 2.731e-02)); + r += mul(s7_2, M4(-2.395e-02, -9.132e-02, -9.520e-02, 6.978e-03, 1.864e-03, -1.293e-01, -9.969e-02, 3.719e-01, 1.173e-01, -6.817e-03, 6.705e-02, 8.744e-02, -1.032e-02, -7.968e-02, -3.208e-02, -1.314e-01)); + r += mul(s7_3, M4(9.108e-02, 7.856e-02, 4.842e-02, 1.747e-01, 2.279e-01, 9.139e-02, -8.356e-02, 1.165e-01, -7.116e-02, 9.958e-02, -5.151e-02, -4.524e-02, 1.658e-01, 2.940e-01, 8.399e-02, -2.767e-01)); + r += mul(s7_4, M4(5.245e-01, -4.385e-01, -2.367e-01, 3.836e-02, -3.209e-01, -4.128e-02, 3.896e-03, 3.336e-01, 4.742e-02, 4.354e-02, 1.015e-01, 2.345e-02, -5.708e-02, 1.239e-01, 2.494e-02, -3.044e-02)); + r += mul(s7_5, M4(1.659e-01, -1.262e-01, -2.488e-01, 1.157e-01, -1.470e-01, -5.262e-01, -3.503e-03, -1.144e-01, 9.953e-03, -4.331e-02, 6.715e-02, -4.391e-02, 2.829e-02, -8.685e-02, -1.009e-01, 1.625e-01)); + r += mul(s7_6, M4(3.642e-01, 6.941e-03, -3.161e-01, 1.724e-01, -1.356e-01, 8.346e-02, -1.899e-02, -2.575e-01, 5.002e-03, 3.191e-02, 6.711e-02, 6.119e-03, 9.062e-02, -5.186e-02, 3.093e-01, -8.964e-02)); + r += mul(s7_7, M4(1.857e-01, -4.822e-02, 7.918e-02, -1.658e-02, 1.364e-01, -5.057e-03, -1.313e-01, 5.012e-01, -6.122e-04, 1.199e-02, -3.115e-02, 1.149e-01, 2.614e-01, 1.622e-01, -1.727e-01, 1.666e-01)); + r += mul(s7_8, M4(-5.647e-02, -1.514e-01, -1.514e-01, 5.845e-02, -1.107e-01, -1.344e-01, -1.261e-01, 7.256e-02, -3.303e-02, -1.809e-01, 5.185e-02, 1.081e-01, 1.400e-01, 5.002e-02, 2.903e-01, -1.358e-01)); + r += V4(3.312e-02, 1.493e-02, 4.529e-02, 2.631e-02); + return r; +} + +void Pass2(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = Rmp8x8(tid.x) + blockStart; + uint2 size = GetInputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = (gxy + 0.5) * pt; + + V4 s0_0 = l0(-1.0, -1.0); + V4 s0_1 = l0(0.0, -1.0); + V4 s0_2 = l0(1.0, -1.0); + V4 s0_3 = l0(-1.0, 0.0); + V4 s0_4 = l0(0.0, 0.0); + V4 s0_5 = l0(1.0, 0.0); + V4 s0_6 = l0(-1.0, 1.0); + V4 s0_7 = l0(0.0, 1.0); + V4 s0_8 = l0(1.0, 1.0); + V4 s1_0 = -max(-s0_0, 0.0); + V4 s1_1 = -max(-s0_1, 0.0); + V4 s1_2 = -max(-s0_2, 0.0); + V4 s1_3 = -max(-s0_3, 0.0); + V4 s1_4 = -max(-s0_4, 0.0); + V4 s1_5 = -max(-s0_5, 0.0); + V4 s1_6 = -max(-s0_6, 0.0); + V4 s1_7 = -max(-s0_7, 0.0); + V4 s1_8 = -max(-s0_8, 0.0); + s0_0 = max(s0_0, 0.0); + s0_1 = max(s0_1, 0.0); + s0_2 = max(s0_2, 0.0); + s0_3 = max(s0_3, 0.0); + s0_4 = max(s0_4, 0.0); + s0_5 = max(s0_5, 0.0); + s0_6 = max(s0_6, 0.0); + s0_7 = max(s0_7, 0.0); + s0_8 = max(s0_8, 0.0); + + V4 s2_0 = l1(-1.0, -1.0); + V4 s2_1 = l1(0.0, -1.0); + V4 s2_2 = l1(1.0, -1.0); + V4 s2_3 = l1(-1.0, 0.0); + V4 s2_4 = l1(0.0, 0.0); + V4 s2_5 = l1(1.0, 0.0); + V4 s2_6 = l1(-1.0, 1.0); + V4 s2_7 = l1(0.0, 1.0); + V4 s2_8 = l1(1.0, 1.0); + V4 s3_0 = -max(-s2_0, 0.0); + V4 s3_1 = -max(-s2_1, 0.0); + V4 s3_2 = -max(-s2_2, 0.0); + V4 s3_3 = -max(-s2_3, 0.0); + V4 s3_4 = -max(-s2_4, 0.0); + V4 s3_5 = -max(-s2_5, 0.0); + V4 s3_6 = -max(-s2_6, 0.0); + V4 s3_7 = -max(-s2_7, 0.0); + V4 s3_8 = -max(-s2_8, 0.0); + s2_0 = max(s2_0, 0.0); + s2_1 = max(s2_1, 0.0); + s2_2 = max(s2_2, 0.0); + s2_3 = max(s2_3, 0.0); + s2_4 = max(s2_4, 0.0); + s2_5 = max(s2_5, 0.0); + s2_6 = max(s2_6, 0.0); + s2_7 = max(s2_7, 0.0); + s2_8 = max(s2_8, 0.0); + + V4 s4_0 = l2(-1.0, -1.0); + V4 s4_1 = l2(0.0, -1.0); + V4 s4_2 = l2(1.0, -1.0); + V4 s4_3 = l2(-1.0, 0.0); + V4 s4_4 = l2(0.0, 0.0); + V4 s4_5 = l2(1.0, 0.0); + V4 s4_6 = l2(-1.0, 1.0); + V4 s4_7 = l2(0.0, 1.0); + V4 s4_8 = l2(1.0, 1.0); + V4 s5_0 = -max(-s4_0, 0.0); + V4 s5_1 = -max(-s4_1, 0.0); + V4 s5_2 = -max(-s4_2, 0.0); + V4 s5_3 = -max(-s4_3, 0.0); + V4 s5_4 = -max(-s4_4, 0.0); + V4 s5_5 = -max(-s4_5, 0.0); + V4 s5_6 = -max(-s4_6, 0.0); + V4 s5_7 = -max(-s4_7, 0.0); + V4 s5_8 = -max(-s4_8, 0.0); + s4_0 = max(s4_0, 0.0); + s4_1 = max(s4_1, 0.0); + s4_2 = max(s4_2, 0.0); + s4_3 = max(s4_3, 0.0); + s4_4 = max(s4_4, 0.0); + s4_5 = max(s4_5, 0.0); + s4_6 = max(s4_6, 0.0); + s4_7 = max(s4_7, 0.0); + s4_8 = max(s4_8, 0.0); + + V4 s6_0 = l3(-1.0, -1.0); + V4 s6_1 = l3(0.0, -1.0); + V4 s6_2 = l3(1.0, -1.0); + V4 s6_3 = l3(-1.0, 0.0); + V4 s6_4 = l3(0.0, 0.0); + V4 s6_5 = l3(1.0, 0.0); + V4 s6_6 = l3(-1.0, 1.0); + V4 s6_7 = l3(0.0, 1.0); + V4 s6_8 = l3(1.0, 1.0); + V4 s7_0 = -max(-s6_0, 0.0); + V4 s7_1 = -max(-s6_1, 0.0); + V4 s7_2 = -max(-s6_2, 0.0); + V4 s7_3 = -max(-s6_3, 0.0); + V4 s7_4 = -max(-s6_4, 0.0); + V4 s7_5 = -max(-s6_5, 0.0); + V4 s7_6 = -max(-s6_6, 0.0); + V4 s7_7 = -max(-s6_7, 0.0); + V4 s7_8 = -max(-s6_8, 0.0); + s6_0 = max(s6_0, 0.0); + s6_1 = max(s6_1, 0.0); + s6_2 = max(s6_2, 0.0); + s6_3 = max(s6_3, 0.0); + s6_4 = max(s6_4, 0.0); + s6_5 = max(s6_5, 0.0); + s6_6 = max(s6_6, 0.0); + s6_7 = max(s6_7, 0.0); + s6_8 = max(s6_8, 0.0); + + t4[gxy] = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t5[gxy] = f1(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t6[gxy] = f2(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t7[gxy] = f3(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); +} + +//!PASS 3 +//!DESC conv2 +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 +//!IN t4, t5, t6, t7 +//!OUT t0, t1, t2, t3 + +#define l0(x, y) V4(O(t4, float2(x, y))) +#define l1(x, y) V4(O(t5, float2(x, y))) +#define l2(x, y) V4(O(t6, float2(x, y))) +#define l3(x, y) V4(O(t7, float2(x, y))) + +V4 f0(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-1.106e-01, 7.670e-03, -1.286e-01, 3.018e-01, 4.581e-02, -1.217e-01, 1.187e-01, -1.327e-02, -3.080e-01, 4.486e-01, -2.847e-01, 5.405e-01, -1.992e-01, -2.933e-01, -1.790e-01, 2.018e-01)); + r += mul(s0_1, M4(6.861e-02, -2.420e-01, 1.315e-01, 7.517e-02, -4.806e-02, -1.086e-01, -9.308e-02, 1.835e-01, 1.853e-01, 3.102e-01, -9.225e-02, 2.640e-01, -1.481e-01, -1.542e-01, -2.495e-01, 3.864e-01)); + r += mul(s0_2, M4(-2.908e-02, 4.023e-03, 7.872e-03, 3.708e-03, -1.186e-01, -4.844e-02, 3.922e-02, -4.161e-02, -4.872e-01, -2.191e-02, 3.183e-01, 5.081e-01, -8.175e-02, 7.931e-02, 2.249e-01, -1.870e-01)); + r += mul(s0_3, M4(2.636e-02, 1.090e-01, -1.625e-01, -2.987e-01, 1.163e-01, 5.129e-02, -2.591e-01, 7.786e-03, 3.786e-01, -1.351e-02, -2.464e-01, 1.982e-01, -2.095e-01, 1.984e-01, 6.387e-02, -3.157e-02)); + r += mul(s0_4, M4(-2.258e-01, 4.148e-02, -4.479e-01, -3.390e-01, -9.786e-03, 2.094e-01, -3.566e-02, 5.195e-02, -2.070e-01, 2.975e-02, -1.083e-01, 5.773e-01, 5.147e-01, -5.604e-02, 4.930e-02, 1.321e-01)); + r += mul(s0_5, M4(3.594e-01, 1.268e-02, 1.728e-01, 7.189e-02, 1.150e-01, 5.564e-02, -9.940e-02, -1.487e-02, -1.964e-01, -3.537e-01, 2.455e-01, 2.112e-01, -3.369e-01, 1.388e-01, 8.150e-02, 1.431e-01)); + r += mul(s0_6, M4(-1.118e-01, -1.718e-03, 1.401e-01, 1.372e-01, 2.374e-02, -5.415e-02, -1.005e-01, 7.274e-02, -2.817e-01, 1.803e-01, 3.102e-02, 5.768e-01, 1.678e-02, -1.261e-01, -8.865e-02, 1.719e-01)); + r += mul(s0_7, M4(-2.923e-02, 2.963e-01, 1.036e-01, -8.971e-02, 7.788e-02, 1.097e-02, 1.250e-01, 1.545e-01, 1.096e-01, 1.449e-01, -1.111e-01, 1.741e-01, 9.997e-02, -1.627e-01, -5.352e-02, 4.582e-02)); + r += mul(s0_8, M4(1.907e-01, 7.104e-02, 3.369e-01, 4.789e-02, 2.948e-02, 5.076e-02, 1.535e-01, 1.651e-03, -1.650e-02, -4.324e-01, 8.895e-02, 5.674e-02, -5.023e-04, 1.787e-01, -3.778e-01, -2.155e-02)); + r += mul(s1_0, M4(-5.160e-02, 3.976e-02, -9.952e-02, -4.953e-02, -9.583e-02, 7.235e-02, 8.871e-02, 5.601e-02, -1.450e-01, -7.690e-02, -9.010e-02, 5.021e-02, -1.281e-01, 1.148e-01, 3.020e-02, -2.530e-02)); + r += mul(s1_1, M4(1.300e-02, -9.556e-02, -1.150e-01, 3.666e-02, 3.252e-02, 3.251e-03, -1.276e-01, 1.543e-01, 7.399e-02, -1.355e-01, -1.185e-01, -2.143e-01, 1.719e-01, 2.554e-02, 6.463e-02, 3.932e-02)); + r += mul(s1_2, M4(-7.282e-02, -1.820e-02, 1.919e-02, 1.074e-02, -2.097e-01, 9.752e-02, -1.958e-02, -8.647e-02, 6.535e-02, -2.755e-02, 1.022e-01, -2.680e-02, -3.509e-03, -7.656e-02, -3.162e-02, -1.080e-01)); + r += mul(s1_3, M4(4.049e-02, 1.557e-01, -1.394e-02, -2.459e-02, -1.799e-01, 1.076e-02, 3.295e-02, -7.567e-03, -4.113e-02, -1.389e-01, 7.414e-03, -6.812e-02, 4.436e-02, -7.321e-02, -6.320e-02, 3.476e-02)); + r += mul(s1_4, M4(6.296e-02, 1.105e-02, 8.425e-02, -1.598e-02, -1.032e-02, 1.704e-02, -7.022e-02, 6.957e-03, 2.220e-02, 6.579e-02, 5.622e-02, 6.265e-02, -8.197e-02, 2.071e-02, 9.494e-02, 1.237e-01)); + r += mul(s1_5, M4(-9.015e-02, -1.011e-01, -4.560e-02, 7.887e-02, 5.623e-02, 2.528e-02, 5.075e-03, -1.046e-02, 3.357e-02, -3.218e-02, -2.049e-02, 1.284e-02, -3.689e-02, -1.521e-01, -7.719e-02, 1.521e-01)); + r += mul(s1_6, M4(1.903e-01, -1.253e-01, 7.906e-02, 7.562e-02, -1.305e-01, -9.010e-02, -2.324e-02, 7.094e-02, 5.681e-03, 8.103e-02, -1.556e-02, -1.164e-02, -7.473e-03, -7.018e-02, 7.782e-02, 2.081e-02)); + r += mul(s1_7, M4(-5.258e-02, 4.002e-02, -2.441e-03, 2.738e-02, 2.307e-01, 1.964e-02, 5.693e-02, 5.497e-02, -9.583e-02, -2.712e-02, 6.319e-02, 4.404e-02, -1.437e-02, -5.799e-02, 2.038e-02, -1.081e-01)); + r += mul(s1_8, M4(-1.771e-01, -3.819e-02, 4.159e-02, -7.371e-03, 1.103e-01, -3.843e-02, 1.053e-01, 9.504e-03, -6.042e-03, 1.495e-01, 6.809e-02, 1.753e-02, 1.258e-01, -2.334e-01, 3.983e-03, 9.594e-02)); + r += mul(s2_0, M4(8.470e-02, -1.773e-01, 9.455e-03, 4.759e-02, -1.431e-01, 3.932e-03, -1.545e-01, -7.367e-02, -4.871e-02, 6.728e-02, 3.994e-02, -4.476e-02, -2.842e-01, 1.265e-01, 1.751e-01, -3.460e-02)); + r += mul(s2_1, M4(5.692e-02, -3.552e-02, 1.946e-02, -1.704e-02, 6.537e-02, -1.294e-01, -2.161e-03, 7.778e-02, 1.616e-01, 1.401e-01, 2.866e-02, -9.264e-02, 1.368e-01, 1.787e-01, -1.987e-02, -8.060e-02)); + r += mul(s2_2, M4(-1.114e-01, -1.410e-02, 4.794e-02, -2.637e-02, -2.495e-02, -4.884e-03, -7.775e-02, -6.720e-02, -5.142e-04, 1.518e-01, -1.261e-02, -2.380e-01, 8.331e-02, -1.208e-01, -7.970e-02, -6.441e-02)); + r += mul(s2_3, M4(1.778e-01, 1.209e-02, -1.997e-01, 3.192e-02, 2.430e-01, 4.024e-02, -5.513e-02, 7.519e-02, -1.167e-01, -1.249e-01, 1.249e-01, -1.446e-01, 7.126e-02, -6.795e-02, -8.406e-02, 1.305e-02)); + r += mul(s2_4, M4(-9.427e-02, -8.138e-03, -8.036e-02, -1.474e-01, 7.301e-02, -1.313e-01, 8.006e-02, 5.452e-02, 1.127e-01, 4.325e-03, 2.758e-01, 2.219e-01, 1.501e-02, 1.454e-01, 1.056e-01, 3.213e-02)); + r += mul(s2_5, M4(3.789e-02, 9.747e-02, 3.788e-02, 9.989e-02, 1.223e-01, -3.660e-02, 8.788e-02, 4.626e-02, -1.673e-01, 5.030e-02, 7.130e-02, -6.818e-02, 1.002e-01, -5.157e-02, 2.846e-02, -1.019e-01)); + r += mul(s2_6, M4(5.866e-02, -1.172e-01, 5.294e-02, 1.291e-02, -1.841e-01, 1.076e-01, -1.009e-01, -6.028e-02, 1.089e-02, 4.124e-02, 3.907e-02, 6.840e-02, 1.165e-01, -1.340e-01, 8.841e-02, -5.944e-02)); + r += mul(s2_7, M4(-8.505e-02, 3.822e-02, 1.127e-01, 5.977e-02, 2.905e-02, 1.477e-01, 3.378e-02, -3.830e-02, 7.395e-02, 7.332e-02, 2.368e-01, -1.645e-01, 7.004e-02, 5.115e-02, -4.602e-02, 9.389e-02)); + r += mul(s2_8, M4(1.146e-01, 1.376e-01, 1.859e-01, -1.260e-03, 4.046e-02, 1.407e-01, 5.402e-02, -3.509e-02, -8.465e-02, 7.918e-02, -2.051e-01, 1.289e-01, 3.716e-02, -6.743e-02, -1.306e-01, 9.368e-02)); + r += mul(s3_0, M4(-8.518e-02, 2.708e-02, -5.449e-03, -3.024e-02, 2.116e-01, -1.750e-01, -5.726e-02, 1.729e-01, -1.523e-01, 1.187e-02, -6.049e-02, 8.550e-02, -1.797e-01, 5.282e-02, -7.250e-02, -4.983e-02)); + r += mul(s3_1, M4(1.751e-02, 1.192e-02, 1.091e-01, -3.897e-02, -1.735e-01, -1.346e-01, 2.168e-02, -2.314e-01, 3.644e-03, 1.259e-01, 3.968e-02, 7.563e-02, -5.672e-02, 9.338e-02, 4.882e-03, -1.688e-01)); + r += mul(s3_2, M4(4.182e-02, 8.886e-02, 1.246e-01, -2.448e-01, -1.897e-01, 1.382e-02, 8.624e-02, 1.035e-01, -1.952e-02, 6.874e-02, 2.193e-01, -9.409e-02, 5.727e-02, -1.276e-01, 9.849e-03, -8.370e-02)); + r += mul(s3_3, M4(-1.089e-02, -1.891e-01, 8.993e-03, 8.074e-03, 2.076e-01, -1.243e-01, -1.613e-01, -3.196e-02, 1.255e-01, 4.043e-03, -3.341e-02, -8.549e-02, -1.131e-01, 1.215e-01, -1.069e-01, 7.707e-03)); + r += mul(s3_4, M4(2.400e-01, -1.286e-01, -1.168e-01, -1.283e-01, -3.051e-01, -1.333e-01, -1.961e-01, 1.049e-01, -6.058e-03, 2.434e-01, -5.507e-02, 2.330e-01, 5.414e-02, -4.292e-02, -6.215e-03, 6.113e-02)); + r += mul(s3_5, M4(1.987e-01, -1.559e-01, 5.049e-02, -6.321e-02, -1.371e-01, -4.967e-02, 7.531e-02, 4.293e-01, 6.067e-02, 2.865e-01, 8.815e-02, -5.601e-02, -7.575e-02, 3.643e-02, 6.242e-02, 5.949e-02)); + r += mul(s3_6, M4(1.069e-01, -4.535e-03, -4.047e-02, 2.504e-01, 7.440e-02, 2.122e-03, 7.750e-02, -3.155e-01, -6.375e-02, 6.073e-02, -2.885e-02, 1.821e-01, 1.692e-01, -2.458e-02, 6.111e-02, 7.549e-03)); + r += mul(s3_7, M4(8.820e-02, -4.547e-03, -4.999e-02, 1.704e-01, 1.116e-01, 4.329e-01, 2.396e-02, 1.519e-01, 1.402e-01, 1.259e-01, -8.280e-02, 2.102e-02, -1.875e-02, 8.996e-02, -1.889e-02, 3.921e-02)); + r += mul(s3_8, M4(1.528e-01, -2.168e-01, -4.028e-03, -1.300e-01, 1.285e-01, 4.750e-01, 1.400e-01, 2.065e-01, 2.631e-02, 1.038e-01, -4.665e-02, 6.579e-02, 1.235e-01, 7.133e-02, -1.172e-01, -5.303e-03)); + r += mul(s4_0, M4(-1.340e-02, 2.074e-01, -1.705e-02, -7.420e-02, 1.053e-02, -9.147e-02, 2.526e-02, 1.026e-02, -7.592e-02, -1.404e-01, 8.351e-03, 1.730e-02, 4.360e-02, -6.868e-02, -1.140e-01, -1.605e-02)); + r += mul(s4_1, M4(8.707e-02, 1.055e-01, -1.279e-02, -3.775e-02, -5.099e-02, 6.661e-02, -1.315e-02, -4.065e-02, 2.320e-02, -4.357e-02, -1.313e-01, 1.870e-02, 2.267e-02, 9.643e-02, 3.252e-02, 6.173e-02)); + r += mul(s4_2, M4(-1.146e-01, 1.701e-01, -2.906e-02, 4.315e-02, -2.166e-02, -1.823e-02, -4.847e-02, 4.414e-02, 8.021e-02, -1.982e-01, -1.249e-01, 1.342e-01, -1.880e-01, 1.307e-02, 8.718e-02, -1.784e-02)); + r += mul(s4_3, M4(-1.524e-01, 1.792e-02, 1.293e-01, -1.338e-01, -9.022e-02, 2.274e-02, 9.638e-03, -2.646e-01, -1.919e-01, -1.435e-01, -2.097e-01, 1.255e-01, 1.651e-01, -3.011e-02, 8.854e-02, -8.389e-02)); + r += mul(s4_4, M4(-2.367e-01, -9.871e-02, -2.830e-03, -8.051e-02, 3.013e-01, 4.373e-02, -2.674e-02, 3.491e-02, 2.304e-01, -5.362e-02, -9.155e-02, -1.227e-01, -7.575e-03, 8.455e-02, -9.711e-02, -1.671e-01)); + r += mul(s4_5, M4(6.942e-02, 9.524e-02, -9.299e-02, 8.153e-03, 5.888e-02, -7.219e-02, -6.424e-02, 1.187e-01, -1.179e-01, -7.678e-02, 6.407e-02, 3.443e-02, 3.539e-02, -1.277e-02, 1.201e-01, -5.887e-02)); + r += mul(s4_6, M4(-4.164e-02, 5.339e-02, 3.651e-02, -3.101e-02, 9.081e-02, 1.674e-01, -1.281e-01, -6.046e-02, 1.913e-01, 3.205e-02, -9.261e-02, 5.055e-06, 2.909e-02, -8.520e-02, -1.762e-02, -4.433e-02)); + r += mul(s4_7, M4(1.197e-01, 6.880e-02, -3.625e-02, 1.798e-01, -2.881e-01, 1.125e-01, -5.999e-02, -2.046e-01, -1.051e-01, -1.701e-01, 9.698e-02, 2.261e-02, 2.416e-02, -1.367e-01, -5.911e-02, 9.895e-02)); + r += mul(s4_8, M4(4.871e-02, 1.336e-01, -2.433e-02, 1.234e-02, -1.234e-01, 1.144e-01, 1.246e-01, 8.938e-02, 7.953e-02, -9.458e-02, 6.365e-02, -1.207e-01, -7.731e-03, -1.426e-02, -1.368e-01, 9.274e-02)); + r += mul(s5_0, M4(-1.005e-01, 2.445e-03, 5.230e-02, 1.152e-01, -1.592e-01, -2.043e-01, -7.492e-02, 1.011e-01, -1.755e-01, -8.817e-02, -1.179e-02, -4.539e-02, -4.091e-02, -5.761e-02, 2.523e-01, 1.103e-01)); + r += mul(s5_1, M4(1.641e-02, -3.067e-01, 9.185e-02, 9.128e-02, 3.286e-02, 1.947e-02, -4.989e-02, 5.360e-02, -1.157e-01, 4.087e-02, 8.444e-02, 1.411e-01, 3.768e-02, 1.976e-02, 2.049e-01, 1.071e-01)); + r += mul(s5_2, M4(1.134e-01, -6.178e-02, 3.290e-02, 6.283e-02, 1.023e-04, 8.330e-02, 2.145e-01, -1.397e-01, -8.124e-02, 1.013e-01, -2.137e-02, -7.958e-02, 1.534e-01, -5.867e-03, -6.494e-02, -9.285e-02)); + r += mul(s5_3, M4(-2.051e-02, 6.925e-02, 6.149e-02, 3.242e-01, -6.243e-01, 1.179e-01, 2.106e-01, -3.046e-01, -5.706e-04, -1.155e-01, 8.130e-03, 3.356e-02, -2.281e-03, 1.334e-01, -1.241e-01, -6.799e-02)); + r += mul(s5_4, M4(-2.705e-02, 1.060e-01, 1.528e-01, 1.223e-01, 3.211e-01, -1.730e-01, 1.253e-01, 5.410e-01, 1.508e-01, 2.882e-03, -9.738e-02, -4.871e-03, 6.994e-02, 2.571e-02, -9.819e-02, -1.700e-01)); + r += mul(s5_5, M4(4.869e-02, 2.421e-01, -7.101e-02, 1.245e-01, 2.406e-01, -1.675e-01, -4.183e-01, -1.827e-01, -2.084e-01, -1.768e-02, 1.672e-01, 7.756e-02, 1.056e-02, 1.765e-01, -1.561e-01, -7.703e-02)); + r += mul(s5_6, M4(6.569e-02, 1.023e-01, -4.162e-02, -4.910e-02, 2.085e-01, -2.971e-01, 1.728e-01, -2.518e-01, 1.621e-01, 1.735e-02, 3.280e-02, 9.486e-02, 5.738e-02, 1.501e-01, 4.067e-02, 5.826e-02)); + r += mul(s5_7, M4(1.475e-01, -1.313e-01, -3.392e-01, -6.234e-02, 1.607e-01, -8.255e-02, 9.700e-02, 5.601e-01, -9.607e-02, -5.716e-04, 9.148e-02, -2.466e-02, -1.983e-01, 2.422e-02, 6.771e-02, 6.628e-02)); + r += mul(s5_8, M4(1.197e-01, -2.585e-02, -9.683e-02, 8.054e-02, -3.877e-01, -4.829e-02, 5.832e-02, -9.984e-02, 1.697e-01, 2.958e-02, -1.363e-01, 1.280e-01, 2.276e-01, -1.047e-01, -2.271e-01, 8.008e-02)); + r += mul(s6_0, M4(-2.387e-01, -2.552e-01, 3.395e-01, -5.265e-02, -4.866e-03, 1.072e-02, 7.850e-02, 8.140e-02, 1.753e-01, 1.958e-01, 1.330e-01, 1.653e-01, 6.228e-02, 1.308e-02, -8.889e-02, -2.958e-02)); + r += mul(s6_1, M4(1.223e-01, -2.539e-02, -2.974e-01, 3.280e-03, 1.140e-01, -2.521e-02, -1.109e-01, -1.236e-01, 3.579e-02, -4.744e-02, 3.749e-02, 1.404e-01, -2.275e-02, -1.076e-02, -1.870e-02, -1.125e-01)); + r += mul(s6_2, M4(6.481e-02, 1.559e-01, 8.548e-02, -1.091e-01, 4.069e-02, 9.493e-04, 1.436e-02, -9.013e-02, -2.222e-02, 4.476e-02, -1.482e-01, 1.574e-01, -2.415e-02, 2.352e-01, 1.177e-01, 1.094e-01)); + r += mul(s6_3, M4(-3.810e-02, 8.932e-02, 1.747e-02, -1.814e-01, 2.592e-01, -7.350e-02, -2.803e-01, 8.401e-02, 4.885e-01, -4.088e-02, 1.891e-01, 1.402e-01, -1.697e-01, 3.032e-01, -6.832e-02, 2.520e-01)); + r += mul(s6_4, M4(5.080e-01, -1.330e-01, 4.702e-02, 3.560e-01, 1.971e-01, -5.934e-02, -2.050e-01, -1.404e-01, -2.276e-01, 9.001e-02, -1.257e-02, -1.844e-01, -3.716e-01, -5.842e-02, 1.151e-01, -1.315e-01)); + r += mul(s6_5, M4(-8.018e-02, 2.536e-01, -1.156e-01, -1.679e-01, -9.114e-02, 6.778e-03, -6.799e-02, 1.115e-02, -1.072e-02, 1.227e-01, 1.080e-01, 7.753e-02, 1.393e-01, -2.807e-01, 2.770e-02, 2.628e-01)); + r += mul(s6_6, M4(3.951e-02, -1.216e-01, 1.179e-01, -6.518e-02, -1.211e-02, 4.296e-02, -2.270e-01, 1.071e-01, 9.939e-02, 2.098e-01, -1.493e-02, -2.716e-02, 2.526e-01, -2.241e-02, 7.088e-02, 3.245e-02)); + r += mul(s6_7, M4(2.067e-01, -4.707e-01, -7.482e-02, 3.539e-01, 1.177e-01, -1.092e-01, -1.023e-01, 4.164e-02, -3.600e-02, 1.516e-01, -2.437e-01, 8.298e-02, -9.193e-02, -1.452e-01, 4.257e-02, -2.124e-01)); + r += mul(s6_8, M4(-2.915e-01, 1.080e-02, 9.993e-03, -8.805e-02, -2.745e-02, -5.484e-02, -7.195e-02, -8.099e-03, 5.414e-02, 3.017e-01, 9.490e-02, 2.250e-02, 1.981e-01, -1.306e-01, -1.162e-02, -3.500e-02)); + r += mul(s7_0, M4(-7.985e-02, 8.566e-02, -7.230e-02, -3.377e-02, 4.579e-02, 6.077e-02, -1.418e-01, 1.145e-01, 3.962e-02, -1.011e-01, -1.120e-01, -8.656e-02, 2.178e-02, 9.423e-02, 2.644e-02, 1.217e-01)); + r += mul(s7_1, M4(-3.308e-02, 1.354e-01, -1.195e-01, -9.986e-02, -1.597e-01, 7.120e-02, 9.256e-02, -9.827e-02, 1.653e-02, 4.166e-02, -4.236e-02, -7.087e-02, 2.284e-02, 6.135e-02, -7.818e-02, 5.338e-02)); + r += mul(s7_2, M4(-7.062e-02, -3.890e-02, -4.435e-02, -2.382e-02, 1.791e-02, -1.045e-01, -3.526e-02, 9.678e-02, -7.565e-02, 7.253e-02, -1.510e-01, 3.099e-03, -5.306e-02, 9.983e-02, 3.110e-02, -1.298e-01)); + r += mul(s7_3, M4(1.554e-02, -1.892e-02, 6.554e-02, -9.729e-04, -1.477e-01, 6.217e-02, 5.542e-03, 6.975e-02, 3.759e-02, 4.232e-02, 3.292e-02, 1.204e-01, 5.064e-04, -4.057e-02, 6.802e-02, 3.772e-02)); + r += mul(s7_4, M4(3.781e-02, -9.765e-02, 7.612e-02, -4.848e-02, -2.151e-01, 7.928e-03, -4.992e-02, -6.911e-02, 9.894e-02, -4.879e-02, 9.217e-02, -1.417e-01, 5.228e-05, -6.974e-02, -1.455e-02, 5.341e-02)); + r += mul(s7_5, M4(-2.148e-02, 9.837e-02, 6.053e-02, 1.387e-01, -6.492e-02, 8.200e-02, -4.534e-02, 6.754e-02, 1.607e-02, 7.394e-02, -3.567e-02, -8.860e-02, -6.110e-02, -2.350e-03, 1.426e-02, -1.123e-01)); + r += mul(s7_6, M4(-3.090e-02, -4.675e-03, 3.797e-03, 1.764e-01, -1.302e-02, 4.235e-02, -1.232e-01, -1.248e-01, 1.384e-02, 1.040e-01, 1.289e-01, 1.555e-03, -1.215e-01, -1.021e-02, 6.856e-02, 2.160e-02)); + r += mul(s7_7, M4(1.848e-02, -1.505e-02, 4.518e-02, -2.168e-01, 1.555e-02, -1.385e-01, 1.732e-01, 5.792e-02, -8.967e-02, -1.573e-01, -6.748e-02, 6.622e-02, 1.793e-01, -1.737e-02, -8.133e-02, 3.772e-02)); + r += mul(s7_8, M4(-1.528e-01, -4.560e-02, 4.371e-03, 6.002e-02, 1.841e-01, 5.361e-02, 1.400e-02, -4.889e-02, -1.744e-01, -4.758e-04, 2.771e-02, -1.233e-01, -1.299e-02, 1.363e-01, -2.682e-01, -2.026e-01)); + r += V4(-4.037e-02, -1.675e-02, 3.704e-02, 1.400e-02); + return r; +} + +V4 f1(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(5.359e-02, 9.392e-02, -1.478e-01, 8.028e-02, 2.418e-02, -1.892e-02, 6.965e-02, -9.329e-03, 2.970e-01, -2.939e-01, 1.871e-01, -4.107e-02, -1.957e-01, 9.889e-02, -2.289e-01, -1.716e-01)); + r += mul(s0_1, M4(7.159e-02, 7.395e-02, 1.411e-02, 1.908e-01, -1.529e-01, 5.522e-02, 6.274e-02, -4.293e-02, 7.288e-02, -4.996e-01, -1.728e-01, 7.171e-02, 3.953e-01, 3.121e-02, -1.144e-01, -2.980e-01)); + r += mul(s0_2, M4(1.281e-01, 2.113e-01, -1.793e-02, -1.434e-01, -3.459e-02, -1.502e-01, -1.265e-01, -8.224e-02, 2.602e-02, -1.770e-01, 1.371e-01, 2.355e-01, -1.329e-01, 8.931e-02, 1.303e-01, -1.144e-01)); + r += mul(s0_3, M4(7.054e-02, -3.927e-02, 2.427e-01, 8.472e-02, 4.186e-02, 3.723e-02, 8.074e-02, -9.314e-02, 5.253e-01, -1.610e-01, 1.036e-01, 3.180e-01, -7.711e-02, -2.627e-01, -1.591e-01, -1.161e-01)); + r += mul(s0_4, M4(1.364e-01, -7.588e-02, 1.185e-01, 1.617e-01, 1.008e-02, 1.126e-01, -1.458e-01, -1.110e-01, 3.619e-01, -4.962e-02, -1.534e-01, 2.996e-01, -4.501e-01, 1.993e-01, -3.799e-01, 4.546e-02)); + r += mul(s0_5, M4(-4.318e-01, 1.466e-01, -3.836e-02, -2.268e-01, 3.750e-02, -7.447e-02, 1.090e-02, -1.200e-01, 5.559e-01, -6.123e-02, -1.486e-01, -1.172e-01, -2.707e-02, -1.418e-01, -2.744e-01, -7.687e-02)); + r += mul(s0_6, M4(2.797e-01, 6.728e-02, 1.223e-01, -1.082e-04, -2.560e-03, 6.357e-02, 1.290e-01, -4.615e-02, 3.593e-01, -1.852e-01, -1.198e-01, -5.259e-02, -8.925e-02, -9.296e-02, 5.557e-02, 1.834e-01)); + r += mul(s0_7, M4(-9.005e-02, -1.121e-01, -1.477e-01, 1.781e-02, -1.100e-01, 1.190e-01, -5.723e-02, -1.282e-01, 2.722e-01, -1.359e-01, 4.613e-01, 3.558e-01, -2.149e-01, -3.125e-02, 3.621e-02, -4.010e-02)); + r += mul(s0_8, M4(-4.799e-02, 2.708e-03, -5.212e-03, -1.705e-01, -1.316e-01, -1.425e-01, 1.505e-01, -5.512e-02, 3.036e-01, -1.299e-02, -2.344e-03, -1.990e-02, 1.391e-02, -1.951e-01, 1.276e-01, -1.054e-01)); + r += mul(s1_0, M4(3.800e-02, 9.656e-02, -6.685e-02, 1.867e-01, 4.085e-02, 1.031e-02, 9.019e-02, -2.565e-02, -1.535e-02, 9.396e-02, 1.368e-01, -6.468e-03, 5.725e-02, -4.208e-02, 7.414e-02, -2.342e-02)); + r += mul(s1_1, M4(-6.740e-02, 3.539e-02, 2.409e-02, 1.803e-02, 6.601e-02, 1.697e-02, -2.279e-02, 1.011e-01, 9.741e-02, -3.994e-02, -5.265e-02, -6.697e-03, 2.065e-03, -4.452e-02, 8.573e-02, 1.119e-01)); + r += mul(s1_2, M4(-3.638e-03, 1.285e-02, 4.366e-02, -5.360e-02, 5.436e-02, 6.215e-03, -5.649e-02, 6.265e-02, -2.411e-02, 8.766e-02, -8.103e-02, -3.148e-02, 8.132e-02, 9.113e-03, 4.695e-02, 4.233e-02)); + r += mul(s1_3, M4(7.019e-02, -2.512e-01, -5.508e-02, -4.033e-02, -2.620e-01, 3.060e-02, -5.995e-02, 2.043e-01, -4.539e-02, -6.491e-02, 1.768e-01, 7.705e-02, 4.870e-02, 1.053e-02, 4.352e-02, 1.674e-02)); + r += mul(s1_4, M4(1.164e-01, -9.858e-03, 1.457e-01, 6.112e-02, 6.947e-04, 4.087e-02, -2.676e-02, 8.315e-02, -7.122e-02, 2.029e-02, -9.414e-02, -5.512e-03, 1.954e-02, 1.362e-01, -9.850e-03, -1.051e-01)); + r += mul(s1_5, M4(6.618e-02, 5.335e-02, 5.182e-02, -1.430e-01, -1.251e-02, -8.332e-02, 1.674e-01, -3.576e-02, 1.417e-02, -4.650e-02, 2.594e-02, -6.467e-02, 2.801e-03, -4.410e-02, -1.009e-01, -2.563e-02)); + r += mul(s1_6, M4(-6.718e-02, 6.018e-02, 9.142e-02, -4.475e-02, 1.592e-02, -1.879e-02, 2.796e-02, -5.731e-02, -8.798e-02, -3.738e-02, -5.375e-02, -4.677e-02, 5.755e-02, -1.558e-01, -2.621e-04, 7.923e-02)); + r += mul(s1_7, M4(-7.345e-02, -2.241e-02, -1.339e-01, 3.816e-02, -2.457e-02, 6.471e-02, 2.474e-02, 3.074e-02, -3.547e-02, 2.760e-02, 7.020e-02, 6.069e-03, -7.161e-02, -4.419e-02, 5.787e-02, 5.445e-02)); + r += mul(s1_8, M4(-1.805e-01, -5.921e-02, 3.022e-02, -8.273e-02, -1.053e-01, -1.721e-02, -4.414e-02, -2.392e-02, -6.442e-02, 3.035e-03, -7.375e-02, 2.852e-02, -4.651e-02, 1.898e-02, 9.078e-02, -1.200e-01)); + r += mul(s2_0, M4(-1.281e-01, 5.373e-02, 2.685e-02, 1.292e-02, 8.557e-02, 5.859e-02, -1.068e-02, 1.038e-01, 5.150e-02, -1.111e-01, 6.592e-02, 3.929e-02, -1.668e-01, -1.356e-01, 1.001e-01, -3.902e-02)); + r += mul(s2_1, M4(1.962e-02, 6.647e-02, 4.700e-02, 9.000e-02, 9.737e-03, -4.224e-03, -7.276e-02, 5.652e-02, -2.292e-04, -1.822e-01, -3.527e-02, 7.265e-02, 9.374e-02, 1.317e-01, -3.114e-02, 2.456e-02)); + r += mul(s2_2, M4(1.597e-02, -2.637e-02, 9.580e-02, -6.369e-02, 5.057e-02, 8.468e-02, 4.267e-03, 7.474e-02, 1.078e-01, -9.482e-03, -1.727e-01, 2.970e-02, 5.134e-02, 1.363e-01, -6.067e-02, 4.048e-02)); + r += mul(s2_3, M4(-2.884e-02, -8.832e-02, -6.075e-02, -3.294e-03, 3.834e-02, -2.263e-02, -5.452e-02, 6.482e-03, 1.428e-02, 5.782e-02, 3.720e-01, -4.082e-02, -1.178e-01, 9.901e-03, 1.791e-01, 4.845e-02)); + r += mul(s2_4, M4(-5.438e-02, -9.899e-02, -2.456e-01, 1.285e-01, 4.232e-02, -1.557e-02, 5.495e-02, 1.077e-01, -3.258e-02, 7.771e-02, 2.900e-01, 1.432e-01, -1.675e-02, 5.543e-03, 1.078e-02, 1.532e-01)); + r += mul(s2_5, M4(2.182e-02, 1.227e-01, -5.033e-02, -6.187e-02, 1.330e-01, -6.431e-02, -9.959e-02, 1.091e-01, 2.743e-02, 1.172e-01, -2.246e-01, -1.348e-01, -5.197e-02, -8.711e-04, -5.547e-02, 9.522e-03)); + r += mul(s2_6, M4(-1.206e-01, 7.882e-03, -1.090e-02, 2.974e-02, 3.590e-03, -1.111e-01, 8.554e-02, 1.091e-01, -1.601e-02, 1.324e-01, -1.966e-03, -3.257e-02, 5.852e-02, -2.458e-02, 1.611e-02, -3.468e-02)); + r += mul(s2_7, M4(-1.929e-01, 1.215e-02, 8.072e-03, -1.662e-01, 1.130e-01, -6.542e-03, 2.019e-02, 6.547e-02, 7.990e-02, -4.069e-02, 9.728e-02, -2.795e-01, 1.114e-01, -8.817e-03, -8.428e-02, 6.218e-02)); + r += mul(s2_8, M4(1.551e-01, -3.498e-02, -7.700e-03, 1.575e-02, 1.430e-01, -4.726e-02, -1.064e-02, -6.947e-03, 9.397e-02, 3.900e-03, 1.258e-01, -3.835e-02, 1.277e-01, 2.509e-02, 8.729e-02, -9.870e-04)); + r += mul(s3_0, M4(-2.635e-02, 1.782e-01, -1.694e-02, 5.306e-02, 1.580e-01, 6.969e-03, 3.944e-02, 6.108e-02, -4.229e-04, -1.987e-01, 3.180e-02, 7.524e-02, -4.798e-02, -1.567e-01, 7.564e-02, -1.183e-01)); + r += mul(s3_1, M4(6.275e-02, 5.701e-02, -7.258e-02, 7.556e-02, 1.801e-01, 7.088e-02, -1.084e-01, 2.409e-01, -1.257e-01, -5.239e-01, -8.246e-02, -3.461e-02, -1.147e-01, 2.545e-01, 1.385e-01, -1.835e-01)); + r += mul(s3_2, M4(5.300e-02, 4.263e-02, -6.859e-02, -1.132e-01, 1.989e-01, 2.543e-01, -1.528e-01, -4.319e-02, 3.084e-02, -9.744e-02, 6.969e-02, 8.086e-02, -1.547e-01, -6.636e-02, 1.025e-01, -1.728e-01)); + r += mul(s3_3, M4(1.060e-01, 5.446e-02, 1.170e-01, -2.163e-02, -1.162e-01, 2.090e-02, 2.091e-01, -9.561e-02, 9.790e-02, 2.899e-02, -1.844e-01, 1.636e-01, 6.397e-02, 1.750e-01, -1.875e-02, -8.913e-02)); + r += mul(s3_4, M4(2.836e-01, 9.436e-02, 4.142e-02, 2.304e-01, 2.979e-02, -3.237e-01, -1.735e-02, 3.771e-01, -1.150e-01, 2.209e-01, 2.394e-01, 7.586e-02, -1.756e-01, -1.931e-01, 8.589e-02, -2.265e-04)); + r += mul(s3_5, M4(1.088e-01, 6.678e-02, -2.916e-02, -3.234e-02, 5.359e-02, -1.229e-01, -8.072e-02, 2.183e-01, -4.825e-02, 1.674e-03, -2.927e-02, 8.313e-02, -1.081e-01, -7.192e-02, -2.553e-01, -1.865e-01)); + r += mul(s3_6, M4(1.575e-02, 2.193e-02, 4.950e-02, 8.411e-02, -5.007e-02, -6.622e-02, 1.987e-01, 2.368e-01, -1.061e-01, 1.255e-01, -4.007e-02, -2.425e-02, 7.443e-02, 4.368e-02, 1.239e-02, -1.162e-02)); + r += mul(s3_7, M4(6.849e-03, 9.556e-03, 2.016e-01, 2.675e-01, -2.552e-01, 8.692e-02, -1.800e-02, 2.611e-01, -5.581e-02, 3.036e-02, 7.863e-03, -1.557e-01, 3.245e-02, 8.553e-02, -1.081e-01, -1.361e-01)); + r += mul(s3_8, M4(2.556e-02, 9.324e-02, 8.321e-02, -4.573e-03, 7.401e-02, 4.903e-02, -9.715e-02, -1.496e-01, -4.412e-02, 2.469e-02, 7.537e-02, 4.379e-02, -1.750e-02, 1.513e-02, 1.219e-01, -1.819e-01)); + r += mul(s4_0, M4(-3.690e-02, -3.441e-02, -3.924e-02, -6.007e-02, 5.748e-02, -9.919e-03, -1.154e-01, -1.501e-02, -3.522e-02, 6.309e-04, 4.868e-02, 9.365e-02, 6.030e-02, 3.201e-03, 2.582e-02, -1.564e-02)); + r += mul(s4_1, M4(3.904e-02, -7.788e-02, 4.307e-02, 2.538e-02, -2.324e-01, 7.691e-02, 6.854e-03, 4.209e-02, -2.631e-02, 1.592e-01, -3.820e-02, -5.688e-02, -1.343e-01, -1.334e-01, 3.546e-02, -5.380e-04)); + r += mul(s4_2, M4(9.549e-02, -7.248e-02, -1.325e-01, -1.463e-02, -1.133e-01, -1.068e-02, 3.268e-02, 8.634e-03, 7.654e-02, -1.712e-01, -2.000e-01, -8.355e-02, 2.194e-02, 5.199e-02, 6.314e-02, -2.819e-02)); + r += mul(s4_3, M4(-4.752e-02, 2.464e-02, -1.639e-02, 1.384e-02, 3.763e-02, 7.014e-03, 7.251e-03, -3.992e-02, -2.566e-02, 1.835e-02, 2.827e-01, -1.739e-01, 1.858e-01, -4.782e-02, -1.730e-01, -8.191e-02)); + r += mul(s4_4, M4(4.778e-02, 4.010e-01, 5.081e-03, -9.438e-02, -7.711e-03, -1.183e-02, 4.648e-02, 3.270e-02, 2.426e-02, -1.146e-01, -9.082e-02, -4.269e-02, -1.494e-01, 8.305e-03, -1.883e-02, -8.324e-02)); + r += mul(s4_5, M4(-9.889e-02, 1.005e-01, 1.832e-01, 4.781e-02, -8.160e-02, -7.781e-02, 1.390e-01, 1.247e-03, -1.654e-01, -2.202e-02, 8.227e-02, 1.056e-02, -8.250e-02, 7.482e-02, -1.573e-02, 1.059e-01)); + r += mul(s4_6, M4(1.319e-01, -6.502e-03, -5.332e-02, -7.135e-02, -6.270e-03, -6.166e-02, 6.672e-02, 5.700e-02, 7.430e-02, 1.376e-02, 3.540e-02, 9.783e-02, 5.452e-02, -2.676e-02, -2.449e-02, -1.114e-01)); + r += mul(s4_7, M4(-1.140e-01, 8.221e-02, -9.009e-02, -2.045e-02, 1.120e-01, 3.351e-02, 9.168e-02, 8.984e-02, 6.165e-02, 5.846e-03, -1.170e-01, 9.888e-02, -5.968e-02, -1.768e-02, -1.493e-02, 3.218e-02)); + r += mul(s4_8, M4(-3.808e-03, 6.917e-02, -1.208e-02, -8.708e-02, 1.538e-01, -1.203e-02, -3.871e-02, -6.714e-02, 5.404e-02, -1.747e-02, -9.208e-02, 1.674e-03, 2.795e-02, -2.504e-02, 8.272e-02, -1.598e-02)); + r += mul(s5_0, M4(1.849e-02, -1.106e-01, -1.307e-01, -1.809e-02, 2.501e-01, 3.170e-02, -3.167e-02, 1.846e-02, -5.607e-02, 3.111e-02, 1.516e-01, 1.052e-01, -8.117e-02, 2.545e-03, 1.696e-01, 5.196e-02)); + r += mul(s5_1, M4(-3.450e-02, 3.294e-02, 1.150e-01, -9.631e-02, -2.406e-01, -2.215e-01, 1.461e-02, 9.308e-02, 9.157e-02, 2.553e-01, 7.148e-02, 1.042e-02, 7.841e-02, -7.270e-02, 9.864e-02, 1.496e-01)); + r += mul(s5_2, M4(5.166e-02, 4.302e-02, -7.258e-03, 5.968e-02, -1.219e-02, -4.505e-02, 2.568e-01, -9.986e-02, -2.914e-02, 1.338e-01, 4.162e-02, 5.395e-02, -1.360e-01, -2.342e-02, 1.640e-01, 1.126e-01)); + r += mul(s5_3, M4(5.679e-03, -1.634e-02, -2.614e-01, 6.877e-03, -2.579e-02, -2.627e-01, -4.804e-02, -5.215e-02, -3.290e-02, -6.036e-02, 5.714e-02, -1.647e-01, 2.247e-01, -1.278e-02, -1.708e-01, 1.154e-01)); + r += mul(s5_4, M4(-3.261e-02, 4.729e-02, 5.397e-02, -1.239e-01, 6.622e-02, 3.045e-01, 2.128e-01, -4.741e-01, 2.397e-01, 1.441e-02, 8.847e-03, 1.231e-01, 1.921e-01, -3.118e-02, -1.782e-02, -1.320e-01)); + r += mul(s5_5, M4(-6.610e-04, 2.221e-02, 1.163e-01, 2.642e-02, 1.497e-03, -2.122e-01, 1.083e-01, 7.362e-02, 7.281e-02, 1.397e-01, 4.682e-02, 3.093e-01, 7.155e-02, 1.126e-02, -1.913e-01, 1.475e-02)); + r += mul(s5_6, M4(-8.450e-02, -1.207e-01, -1.391e-01, -4.209e-02, 1.201e-01, -1.023e-01, 2.736e-01, 2.171e-01, -4.266e-02, 9.532e-02, 6.658e-02, 4.056e-03, -9.055e-02, 3.366e-02, 1.447e-01, 5.828e-02)); + r += mul(s5_7, M4(1.398e-01, 1.394e-01, -3.104e-01, -1.527e-02, -1.108e-01, -2.226e-01, -3.162e-01, 4.604e-01, -1.103e-01, -2.872e-02, 5.296e-02, 6.879e-02, 1.880e-01, -2.118e-03, 3.585e-02, 2.129e-01)); + r += mul(s5_8, M4(6.985e-02, -2.443e-02, -4.665e-02, -5.924e-02, -1.070e-01, 1.001e-01, 2.506e-02, -8.091e-02, 1.955e-02, 1.376e-02, 1.636e-01, -3.354e-02, -1.254e-01, -1.351e-02, 1.439e-01, 1.434e-01)); + r += mul(s6_0, M4(2.055e-01, -9.397e-02, 1.412e-01, 1.193e-01, -7.398e-02, 2.422e-02, 4.889e-02, 6.445e-02, -1.966e-01, -1.331e-01, 8.664e-02, 1.070e-01, -1.076e-01, -3.743e-03, -3.440e-02, 1.573e-01)); + r += mul(s6_1, M4(-1.183e-01, -2.183e-01, 1.809e-01, -2.173e-01, 1.747e-01, -7.500e-02, 7.648e-02, 2.389e-02, -1.144e-01, -3.135e-02, -1.397e-01, -4.562e-02, 1.011e-01, -5.550e-02, 3.267e-02, 6.254e-02)); + r += mul(s6_2, M4(-1.003e-01, 8.644e-03, -1.189e-01, 2.301e-02, -2.309e-02, 1.970e-02, -9.311e-02, 1.215e-02, -1.689e-01, 8.210e-02, -1.385e-02, 4.341e-02, 1.155e-01, -1.890e-01, -5.568e-02, -6.058e-02)); + r += mul(s6_3, M4(-9.299e-02, -2.571e-01, -2.069e-01, 3.947e-02, 4.162e-02, 1.204e-01, 2.203e-01, -9.760e-02, -4.572e-02, -1.029e-01, -4.367e-03, 9.108e-02, -2.537e-01, -6.520e-02, 3.719e-02, -1.694e-01)); + r += mul(s6_4, M4(2.415e-01, 3.740e-01, 3.292e-01, -1.215e-01, -1.114e-01, -4.160e-02, 5.061e-03, 4.549e-02, 2.401e-02, -6.357e-02, -2.312e-01, -3.438e-02, 4.018e-02, -5.289e-02, -1.294e-01, -1.304e-01)); + r += mul(s6_5, M4(-1.445e-01, -2.017e-01, -9.538e-02, -1.315e-02, 2.716e-02, 4.953e-02, -9.832e-02, 1.230e-02, 5.241e-02, 1.703e-01, 1.064e-01, -8.697e-02, 5.406e-02, 2.517e-02, -7.605e-02, -1.602e-02)); + r += mul(s6_6, M4(1.227e-01, -1.989e-01, -1.872e-02, 2.003e-01, 2.548e-01, -6.034e-02, 1.542e-01, -4.469e-03, 8.203e-02, 4.234e-02, 1.523e-01, 2.219e-02, 1.997e-01, -1.103e-01, -3.337e-01, 7.199e-02)); + r += mul(s6_7, M4(-1.763e-01, 2.622e-02, 8.851e-02, 3.764e-01, -8.470e-02, -2.142e-02, 1.045e-01, 5.815e-02, 4.777e-02, -1.656e-03, -2.274e-02, 3.622e-03, -1.004e-01, 1.950e-02, -3.939e-01, 9.619e-03)); + r += mul(s6_8, M4(1.669e-01, 3.680e-02, -2.683e-01, -1.763e-01, 7.757e-02, 1.858e-02, 5.891e-02, 7.372e-03, -1.652e-01, -6.328e-02, 1.398e-02, 1.452e-01, -2.534e-01, 1.047e-01, 6.606e-02, 1.251e-01)); + r += mul(s7_0, M4(-4.698e-02, 4.001e-02, 1.513e-02, -6.184e-02, -1.538e-01, -5.059e-02, 1.702e-01, 5.881e-02, 2.812e-02, 8.479e-02, -1.627e-01, 7.281e-02, 1.658e-01, -3.580e-02, -1.803e-01, -4.138e-02)); + r += mul(s7_1, M4(-3.242e-02, 2.335e-02, 2.019e-02, -1.190e-01, 3.045e-03, 7.206e-02, 3.620e-02, -3.594e-02, 7.757e-02, 8.746e-02, 1.343e-01, -1.438e-02, -1.177e-01, -3.528e-02, -4.854e-03, -3.678e-02)); + r += mul(s7_2, M4(1.456e-01, 9.068e-02, -8.379e-02, -4.816e-02, -1.514e-02, 1.022e-03, -4.484e-02, 1.095e-01, 8.802e-03, 1.059e-02, -1.524e-02, 5.501e-02, 4.891e-02, -4.176e-02, 6.690e-02, 2.803e-02)); + r += mul(s7_3, M4(4.880e-02, -9.778e-02, 7.139e-02, -3.403e-02, -1.265e-01, 1.243e-01, 4.718e-03, -9.577e-02, 1.154e-01, -6.257e-02, -5.989e-02, -1.084e-01, 1.630e-02, 1.882e-02, 3.142e-02, -1.523e-01)); + r += mul(s7_4, M4(1.631e-02, 5.055e-02, 1.642e-01, 5.091e-02, 2.055e-01, -4.724e-02, -6.370e-02, 2.239e-02, -1.355e-01, -9.611e-02, 4.697e-03, -3.559e-02, 4.487e-02, 1.632e-01, 5.328e-02, 4.724e-02)); + r += mul(s7_5, M4(-2.235e-02, 3.882e-02, -3.194e-02, 9.299e-02, -1.983e-02, 7.830e-02, 6.663e-02, -1.378e-01, 5.669e-02, 9.130e-03, 1.249e-01, 3.432e-02, 4.857e-02, -1.639e-01, -2.301e-02, 7.515e-02)); + r += mul(s7_6, M4(-1.004e-01, 4.822e-02, 3.599e-02, -1.124e-02, 2.083e-01, 1.402e-01, -7.544e-02, -5.453e-02, -9.656e-03, -8.927e-02, -5.573e-03, -6.093e-02, 6.438e-02, 9.692e-03, -8.695e-03, 1.205e-02)); + r += mul(s7_7, M4(2.545e-02, -9.701e-02, 3.757e-02, -6.665e-02, -9.585e-02, -9.654e-02, -2.686e-01, 1.593e-02, 2.550e-02, 2.506e-02, -8.576e-02, 1.587e-01, -1.345e-01, 7.874e-03, -1.132e-02, 7.404e-02)); + r += mul(s7_8, M4(-9.947e-02, 2.029e-02, -9.657e-03, -9.297e-02, -3.285e-02, 2.794e-03, -1.467e-01, -1.324e-01, 1.945e-02, -4.082e-02, -3.194e-02, -5.236e-03, 2.245e-01, 1.092e-01, 8.064e-02, -4.513e-04)); + r += V4(-3.849e-02, -1.365e-02, -7.279e-03, 4.354e-02); + return r; +} + +V4 f2(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-2.802e-02, -5.156e-02, 1.206e-01, -3.892e-01, 9.234e-03, -2.731e-02, 1.182e-01, -6.746e-02, -2.030e-01, 6.598e-02, 3.799e-01, 3.176e-01, 3.402e-02, 3.375e-03, -2.049e-01, 3.869e-01)); + r += mul(s0_1, M4(5.085e-02, 9.497e-03, -1.361e-01, 1.211e-01, 2.047e-02, -2.909e-02, 7.192e-02, -3.160e-02, 6.266e-01, -7.379e-01, 3.400e-01, 4.910e-01, -3.014e-02, -2.511e-01, -7.872e-02, 5.207e-03)); + r += mul(s0_2, M4(5.088e-02, 2.924e-01, 2.247e-01, 3.032e-01, -9.986e-02, 9.435e-02, -9.937e-02, 6.549e-02, 1.634e-01, 3.651e-01, 7.896e-02, 4.499e-01, 1.107e-01, -8.795e-02, 1.298e-02, 3.925e-01)); + r += mul(s0_3, M4(-1.226e-01, -2.052e-01, 9.700e-02, 3.455e-01, -9.883e-03, 5.352e-02, -1.109e-01, 1.370e-01, -3.751e-01, 1.816e-02, -1.321e-01, 2.390e-01, -2.378e-01, -3.816e-02, 3.457e-01, 2.798e-01)); + r += mul(s0_4, M4(1.096e-01, -1.880e-02, -6.901e-02, 3.486e-01, 9.603e-02, -1.650e-01, 1.648e-02, 2.145e-01, 1.302e-01, 8.368e-02, 1.101e-01, 1.574e-01, -4.341e-01, 3.264e-01, -4.945e-02, -3.723e-02)); + r += mul(s0_5, M4(-1.711e-01, 2.180e-01, 2.788e-02, -1.105e-01, -4.460e-02, 1.254e-01, -3.483e-02, 4.794e-03, 1.091e-01, 6.501e-02, 1.169e-01, 3.037e-01, -1.726e-01, -1.524e-01, 1.148e-01, -6.807e-02)); + r += mul(s0_6, M4(-1.816e-02, 2.070e-01, 3.857e-03, -7.230e-02, 5.213e-02, -1.013e-01, -1.852e-02, 5.578e-02, -1.822e-01, 5.943e-02, -6.860e-02, 3.346e-01, 1.336e-02, 1.881e-03, 1.706e-04, -1.993e-02)); + r += mul(s0_7, M4(-1.091e-01, -1.831e-01, 7.351e-02, 5.954e-02, -1.961e-01, 3.039e-02, 3.556e-02, 1.123e-01, -1.606e-01, -8.329e-02, -3.582e-02, 1.874e-01, 2.041e-01, 1.687e-01, 1.214e-01, -2.145e-01)); + r += mul(s0_8, M4(-1.759e-01, 3.716e-01, 1.810e-01, 1.497e-01, 2.445e-01, 3.580e-02, -4.696e-02, 6.966e-02, -1.795e-01, -1.277e-01, 8.469e-02, 2.548e-01, 2.237e-02, -1.727e-01, 9.870e-02, -1.800e-01)); + r += mul(s1_0, M4(-4.170e-02, -5.407e-02, -2.206e-02, -4.477e-02, 7.677e-02, -1.467e-01, 1.297e-01, -7.096e-02, -7.251e-02, 1.257e-02, -1.232e-01, -8.921e-02, 5.899e-02, 2.376e-02, -1.022e-02, 3.457e-02)); + r += mul(s1_1, M4(-4.335e-02, 1.874e-03, -1.954e-02, -5.067e-02, -3.084e-02, -7.801e-02, -5.762e-02, -4.240e-02, -1.198e-02, 2.986e-02, 9.301e-02, 2.905e-02, 3.990e-02, -1.610e-01, 1.314e-02, 3.194e-02)); + r += mul(s1_2, M4(4.938e-02, 1.901e-03, -2.677e-02, -9.100e-02, 2.205e-03, 1.424e-01, -6.446e-02, -1.117e-01, -6.649e-02, -5.324e-03, 4.897e-02, -7.976e-02, 1.293e-03, -5.757e-02, 4.666e-02, -8.052e-03)); + r += mul(s1_3, M4(-1.181e-01, 8.895e-02, -3.002e-02, 2.494e-03, 6.048e-02, 9.794e-02, 7.071e-02, -1.105e-01, 2.595e-03, -4.194e-02, 9.149e-02, 5.148e-02, 4.510e-02, -1.003e-01, -2.136e-01, -9.856e-02)); + r += mul(s1_4, M4(8.952e-02, 4.227e-02, -9.305e-02, -5.687e-02, 5.234e-02, -1.249e-01, 2.152e-02, 6.812e-02, 1.520e-01, -8.037e-02, -1.195e-01, 1.176e-01, 1.126e-02, 1.979e-01, -1.536e-01, 6.813e-02)); + r += mul(s1_5, M4(7.858e-03, -1.131e-01, -1.845e-02, -2.885e-02, -1.907e-01, -2.352e-02, -9.424e-02, 7.438e-02, -1.977e-03, 1.714e-02, -9.526e-04, 1.184e-01, -7.097e-02, -1.900e-01, 1.357e-01, -1.178e-02)); + r += mul(s1_6, M4(1.399e-02, 1.570e-02, 8.513e-02, 4.497e-02, -5.835e-02, -1.206e-01, 2.929e-02, -7.731e-02, -2.053e-02, -1.783e-02, 1.242e-02, -7.639e-02, 1.098e-02, 1.347e-01, -2.134e-02, -9.737e-02)); + r += mul(s1_7, M4(5.280e-02, 1.558e-02, 5.262e-02, -2.740e-02, -9.981e-02, 1.174e-01, 1.792e-01, -5.477e-02, 2.825e-03, 1.184e-02, -1.019e-01, 4.856e-02, -7.495e-02, 2.933e-02, 3.793e-02, -4.763e-02)); + r += mul(s1_8, M4(4.504e-02, -6.129e-02, -8.692e-02, 2.067e-01, 1.957e-01, 2.407e-01, -9.113e-02, -1.615e-01, -2.641e-03, -9.470e-02, -1.203e-02, 4.439e-02, 3.156e-02, -1.854e-02, 4.911e-02, -5.385e-02)); + r += mul(s2_0, M4(-2.898e-02, 1.585e-02, -6.785e-02, -3.388e-02, -5.240e-02, -7.491e-02, 5.920e-03, 8.501e-02, -2.700e-02, 2.790e-02, -6.616e-02, 9.314e-02, 2.613e-03, 4.740e-02, -1.952e-02, 3.159e-02)); + r += mul(s2_1, M4(2.105e-01, -1.568e-01, 7.612e-02, -8.321e-02, 4.020e-02, 6.669e-02, 6.664e-02, 1.237e-01, -1.096e-01, -1.486e-01, 3.096e-02, 2.008e-02, -4.263e-02, 1.113e-02, 1.185e-01, 1.281e-01)); + r += mul(s2_2, M4(-1.161e-02, 1.698e-02, -4.592e-02, 6.924e-02, 4.046e-02, 1.279e-01, -4.622e-02, 3.728e-02, 3.625e-02, 7.702e-02, -6.480e-02, 1.553e-01, -1.106e-01, 2.186e-02, 1.083e-02, -1.135e-02)); + r += mul(s2_3, M4(-1.065e-01, -9.866e-02, -5.545e-02, -9.504e-03, -4.676e-02, -4.768e-02, 3.364e-02, 1.528e-01, 2.147e-01, 4.792e-02, -2.744e-01, 1.018e-01, 3.624e-02, -5.829e-02, 5.161e-02, 1.064e-01)); + r += mul(s2_4, M4(2.242e-01, -6.267e-02, 7.893e-02, -3.285e-03, 6.343e-02, -1.234e-02, -8.881e-03, 5.795e-02, -2.264e-01, 2.534e-01, -4.626e-01, 6.956e-02, 8.826e-02, -1.142e-01, -2.645e-01, -1.276e-02)); + r += mul(s2_5, M4(3.328e-02, -2.416e-02, -1.345e-01, -1.615e-02, 5.329e-02, 2.259e-02, 1.267e-02, -2.176e-02, 4.219e-02, 2.430e-03, -2.007e-01, 6.283e-02, 9.299e-02, -5.957e-02, 1.196e-01, -1.401e-01)); + r += mul(s2_6, M4(-1.372e-01, 5.980e-02, -4.472e-02, -2.230e-04, -2.846e-02, -1.046e-02, 9.732e-02, 7.188e-02, 8.358e-02, -9.484e-03, -4.320e-02, 4.657e-02, -1.000e-01, 6.414e-02, 5.864e-02, -4.058e-02)); + r += mul(s2_7, M4(2.689e-01, 5.418e-02, 1.132e-01, 5.436e-02, 2.305e-02, 8.284e-02, -8.678e-02, 7.193e-02, -1.923e-01, 6.689e-03, 4.396e-03, -1.197e-01, 3.617e-02, -5.872e-02, -1.023e-01, 1.241e-02)); + r += mul(s2_8, M4(2.724e-02, -6.824e-02, -3.476e-02, -6.227e-03, 1.405e-02, 1.160e-01, 2.937e-02, 1.500e-01, 5.183e-02, -6.483e-02, -3.462e-02, -1.028e-02, -2.252e-02, 3.933e-02, 9.059e-03, -1.151e-02)); + r += mul(s3_0, M4(-6.616e-02, 7.941e-03, -7.667e-02, 9.626e-02, -5.899e-02, 5.067e-02, 1.123e-01, -7.155e-02, -9.984e-02, 8.379e-03, 1.885e-01, -4.505e-02, -1.377e-01, -7.615e-02, -1.460e-01, 1.968e-02)); + r += mul(s3_1, M4(-6.391e-02, -1.772e-01, -5.519e-02, -1.564e-01, 2.967e-03, -1.374e-01, -2.468e-01, -3.889e-01, -2.793e-02, -1.800e-01, 1.317e-01, 3.061e-02, -2.984e-02, 7.570e-02, -9.489e-02, 2.382e-01)); + r += mul(s3_2, M4(-7.658e-02, 1.526e-02, -1.444e-02, 1.143e-01, 3.034e-03, 3.447e-02, 1.152e-01, 6.495e-02, 8.716e-02, 4.289e-02, 2.336e-02, 6.799e-02, -1.327e-01, 1.032e-01, 6.880e-03, 8.986e-02)); + r += mul(s3_3, M4(-3.334e-02, -4.563e-02, -7.153e-02, 5.970e-02, 1.871e-01, -6.696e-02, -6.439e-02, 2.520e-01, -1.090e-01, 3.417e-02, -1.971e-02, -9.568e-02, -1.305e-02, 1.863e-01, 1.025e-01, -2.313e-03)); + r += mul(s3_4, M4(-1.017e-01, -3.506e-01, -9.725e-02, -3.023e-02, 1.184e-01, 7.168e-02, -4.717e-01, 3.008e-01, -3.493e-01, -6.348e-02, -9.199e-02, -7.848e-03, 1.379e-01, -1.452e-01, -2.035e-01, 8.566e-02)); + r += mul(s3_5, M4(-9.457e-02, -1.684e-01, 7.912e-02, -4.504e-02, -1.344e-01, 1.922e-01, 2.359e-01, 3.596e-01, 7.699e-02, 2.859e-02, -5.206e-02, -2.060e-01, 9.835e-02, 3.742e-02, -4.881e-02, -3.242e-03)); + r += mul(s3_6, M4(-8.423e-02, -5.352e-02, -8.182e-02, 9.426e-02, -2.998e-02, 3.028e-02, 5.481e-02, -2.197e-01, 1.147e-01, 6.420e-04, 1.152e-01, -3.011e-03, 8.877e-02, 9.533e-03, -2.035e-01, 1.808e-01)); + r += mul(s3_7, M4(-5.532e-02, -3.217e-01, 1.923e-02, -1.066e-02, 6.336e-02, 3.110e-02, 7.060e-02, -6.651e-02, -1.623e-01, -1.309e-01, 3.931e-02, -1.972e-02, 7.495e-02, -2.356e-01, 5.781e-02, 3.142e-03)); + r += mul(s3_8, M4(-8.396e-02, -7.026e-02, 3.163e-02, -4.612e-02, 2.304e-01, 1.903e-01, 6.762e-03, 3.414e-01, -1.054e-03, -1.374e-02, 2.692e-02, -8.614e-02, 1.355e-02, -5.218e-03, -1.359e-02, -6.684e-03)); + r += mul(s4_0, M4(-4.822e-02, 6.151e-03, 1.156e-02, 1.258e-01, 1.186e-01, -3.688e-02, -4.881e-02, -2.237e-02, -1.432e-01, 1.391e-01, -7.915e-02, -4.125e-02, -9.872e-03, -1.622e-01, 5.435e-02, 9.903e-02)); + r += mul(s4_1, M4(2.703e-02, 1.311e-01, 6.639e-02, 5.176e-03, -5.718e-02, -3.089e-02, -8.949e-03, -8.158e-03, -1.306e-01, 5.654e-02, 8.562e-02, 3.945e-02, -1.173e-01, 8.266e-02, -1.476e-01, 1.633e-03)); + r += mul(s4_2, M4(-5.208e-02, 4.768e-02, 1.031e-02, 1.786e-01, 7.597e-03, 2.836e-01, -4.354e-02, -8.829e-02, 5.808e-02, 1.167e-01, 2.405e-03, 1.354e-01, 4.777e-02, -3.373e-02, -6.581e-02, -5.401e-02)); + r += mul(s4_3, M4(1.481e-01, 3.910e-02, 1.066e-02, 2.328e-02, 3.709e-02, -5.371e-02, 3.497e-02, -1.132e-01, 1.859e-02, -6.759e-02, 3.889e-02, -5.446e-02, 5.095e-02, -8.579e-02, 4.652e-02, 1.072e-01)); + r += mul(s4_4, M4(-9.275e-02, 1.607e-02, -8.003e-02, 3.099e-02, -7.704e-02, 7.382e-02, 8.479e-02, 5.053e-02, -9.539e-02, 8.376e-02, 1.122e-01, 7.184e-03, 5.598e-02, 1.336e-01, 4.726e-02, 5.561e-02)); + r += mul(s4_5, M4(-6.532e-02, -1.142e-02, 2.389e-02, 6.100e-02, -5.159e-03, -8.185e-02, -1.234e-01, 9.162e-02, 3.504e-02, 1.170e-01, -1.275e-01, -1.137e-01, 2.591e-02, -1.459e-01, -1.475e-01, -8.061e-03)); + r += mul(s4_6, M4(-5.724e-02, -7.243e-02, -1.139e-02, -1.672e-01, -4.244e-02, -1.267e-01, -2.326e-02, -9.063e-02, -5.881e-02, -4.040e-02, -7.768e-02, -2.173e-01, -1.426e-01, 9.559e-02, 6.449e-02, -7.141e-02)); + r += mul(s4_7, M4(1.598e-01, 1.262e-01, 1.558e-01, -5.444e-02, 3.989e-02, -2.002e-02, 1.427e-01, 8.954e-03, -1.607e-02, 1.143e-01, -1.499e-02, 1.431e-01, 1.431e-01, 1.025e-01, -3.980e-03, 3.351e-02)); + r += mul(s4_8, M4(-4.759e-02, -1.156e-03, -4.510e-02, -1.927e-02, 5.402e-02, 2.333e-01, 1.037e-01, 8.638e-02, 4.829e-02, 8.402e-02, 6.311e-02, -1.432e-01, 1.010e-02, -9.231e-02, -1.179e-01, -6.892e-02)); + r += mul(s5_0, M4(2.913e-02, -2.549e-03, -1.849e-02, -1.047e-01, 1.137e-01, -1.432e-01, -1.483e-02, -2.535e-01, 1.068e-01, -2.117e-02, -5.043e-02, 7.363e-03, 1.117e-01, 1.255e-02, 3.333e-02, -1.697e-01)); + r += mul(s5_1, M4(1.014e-01, 2.990e-02, -1.086e-01, -4.205e-02, 8.811e-02, 1.411e-01, 4.324e-02, 2.712e-02, -1.168e-01, -6.908e-02, 7.386e-02, -3.770e-02, -1.730e-02, 3.807e-01, -2.026e-02, -2.077e-01)); + r += mul(s5_2, M4(7.198e-03, -1.615e-02, -7.113e-02, -7.417e-02, 3.233e-02, 1.465e-01, 3.877e-02, 1.170e-01, 1.342e-01, -3.204e-02, 1.353e-01, 1.315e-01, -1.601e-02, 1.509e-03, -1.582e-01, -1.458e-01)); + r += mul(s5_3, M4(1.164e-01, 5.345e-03, 2.005e-02, -3.676e-02, 2.190e-01, 1.469e-01, -8.587e-02, -6.513e-02, -3.172e-01, -3.607e-02, 1.723e-01, 2.307e-02, 1.115e-02, -3.679e-02, 1.605e-01, 2.028e-01)); + r += mul(s5_4, M4(2.060e-01, 2.299e-02, -2.166e-02, 4.765e-02, -2.165e-01, 2.464e-01, -2.905e-01, -5.862e-02, 3.866e-02, 3.496e-02, 1.835e-01, -1.279e-02, -1.741e-01, 2.865e-01, 6.864e-02, -1.401e-01)); + r += mul(s5_5, M4(-1.086e-01, -2.790e-01, -1.446e-01, 1.313e-01, -1.805e-01, -2.065e-02, 9.124e-02, -1.430e-01, 3.229e-02, 1.767e-02, -1.588e-01, -7.295e-02, 6.204e-02, 1.200e-01, -1.326e-01, -5.273e-03)); + r += mul(s5_6, M4(2.269e-01, -9.886e-02, 1.361e-01, -1.473e-01, -2.404e-01, 7.051e-02, -9.116e-02, -1.986e-01, -8.099e-02, -9.891e-02, -4.235e-02, -6.047e-02, -1.654e-01, 1.165e-01, 1.611e-01, -9.142e-03)); + r += mul(s5_7, M4(2.170e-02, 2.024e-01, 2.867e-01, -8.679e-02, 3.076e-01, 3.922e-02, -8.530e-02, 5.478e-01, 5.273e-02, -2.640e-02, -1.919e-01, 1.131e-01, 1.696e-01, 5.603e-03, -3.013e-02, -1.121e-01)); + r += mul(s5_8, M4(-8.068e-03, 3.940e-02, 3.067e-01, 6.644e-03, -6.139e-02, -2.007e-01, -9.687e-03, 3.392e-01, 1.211e-01, -1.120e-01, -1.171e-02, -3.860e-02, 1.217e-01, -2.424e-02, 1.843e-01, -1.736e-01)); + r += mul(s6_0, M4(6.439e-02, -6.336e-02, -1.081e-01, 4.337e-02, -3.236e-02, 1.752e-02, 8.909e-02, -4.700e-02, -3.128e-02, -4.913e-02, 1.235e-01, -9.853e-02, -1.651e-02, 3.878e-01, -3.516e-02, -3.919e-02)); + r += mul(s6_1, M4(2.277e-01, 4.336e-02, 7.852e-02, 1.576e-01, -1.563e-02, -1.959e-01, 1.693e-01, 1.596e-01, -1.672e-01, -6.992e-02, -5.763e-02, -2.148e-02, 6.415e-02, -1.158e-01, 7.301e-02, -8.661e-02)); + r += mul(s6_2, M4(-4.668e-02, 8.039e-02, 2.044e-02, 2.014e-02, 4.289e-02, -9.399e-02, -9.409e-02, 1.101e-01, 6.680e-02, 1.579e-01, 1.659e-01, 6.766e-02, -1.477e-01, 8.359e-02, 5.109e-02, 9.460e-02)); + r += mul(s6_3, M4(3.234e-01, 1.618e-01, -1.801e-01, -1.483e-01, -2.036e-01, 2.286e-02, 3.435e-02, 9.168e-03, 1.707e-01, 1.538e-01, -1.954e-01, 6.670e-02, -1.488e-01, 3.419e-04, 1.204e-01, -1.939e-02)); + r += mul(s6_4, M4(-2.884e-01, 1.031e-01, -2.009e-01, -2.042e-01, -2.182e-02, -4.738e-02, -2.117e-03, -6.116e-02, 2.673e-02, -4.994e-01, 1.248e-01, -1.820e-01, -1.018e-01, 7.883e-02, -8.556e-02, -1.523e-01)); + r += mul(s6_5, M4(-6.129e-03, 3.436e-01, -4.294e-02, 3.408e-02, -5.108e-02, 1.636e-02, 1.194e-01, -2.425e-02, -1.486e-01, 1.052e-01, -2.564e-02, 6.141e-03, -7.817e-02, -7.600e-02, 2.309e-02, -1.317e-01)); + r += mul(s6_6, M4(-3.343e-01, 1.562e-01, 2.314e-02, -8.994e-02, -1.566e-01, -1.302e-01, -1.503e-01, -3.620e-02, 3.442e-02, -4.477e-02, 8.212e-02, 1.376e-02, -1.104e-01, 2.407e-01, 8.167e-02, 1.373e-01)); + r += mul(s6_7, M4(1.755e-01, -2.458e-01, -8.140e-02, 5.062e-02, -7.652e-02, 1.068e-02, 1.579e-01, 7.307e-02, -5.127e-02, -1.075e-01, -1.052e-01, -1.181e-01, -1.447e-01, -1.229e-01, 7.682e-02, -3.210e-01)); + r += mul(s6_8, M4(7.308e-04, -1.060e-01, 1.500e-02, 2.670e-01, -3.298e-02, -1.744e-02, 4.964e-02, -2.915e-02, 1.542e-01, 3.643e-02, -2.617e-02, 8.074e-02, -1.216e-01, -2.563e-02, -2.689e-02, 1.399e-01)); + r += mul(s7_0, M4(9.782e-02, -5.249e-02, -1.006e-01, 1.151e-01, -1.402e-01, -3.647e-02, 6.410e-02, 9.094e-03, 4.262e-02, -3.584e-02, -1.978e-02, 5.485e-02, -2.607e-04, 7.551e-02, -6.126e-02, -1.940e-02)); + r += mul(s7_1, M4(6.846e-02, 2.305e-01, -4.094e-02, 1.400e-01, -1.560e-02, -1.438e-02, 5.824e-05, -1.448e-02, -9.337e-02, -5.603e-03, 1.820e-02, 2.381e-02, 2.165e-02, -9.807e-02, -3.444e-02, -3.379e-02)); + r += mul(s7_2, M4(-4.101e-02, -7.144e-02, 3.168e-02, -1.573e-02, -5.890e-04, 7.380e-02, -7.336e-02, -4.920e-03, 3.547e-02, 1.015e-01, 5.512e-02, 4.064e-02, -6.814e-02, -3.267e-02, -5.650e-02, 2.536e-02)); + r += mul(s7_3, M4(1.159e-01, 4.143e-02, -7.666e-02, -3.528e-02, -1.557e-01, 1.066e-01, -1.218e-01, 1.546e-04, 1.202e-01, 2.015e-01, -5.828e-02, -1.662e-02, 1.083e-01, 1.395e-01, 4.536e-02, 3.132e-02)); + r += mul(s7_4, M4(-5.859e-02, 3.619e-02, -4.449e-02, 3.329e-03, 1.145e-01, -1.256e-01, -1.127e-01, 3.612e-02, 5.740e-02, 1.154e-01, 1.674e-01, -1.153e-03, 1.617e-02, -1.630e-02, -9.418e-02, 8.744e-02)); + r += mul(s7_5, M4(3.250e-02, -7.466e-03, 1.048e-01, 2.813e-02, 3.007e-02, -6.485e-02, -2.396e-02, 1.130e-01, 1.517e-02, -1.140e-01, 3.263e-02, 4.794e-02, 9.150e-03, -1.624e-01, -7.188e-02, -2.948e-02)); + r += mul(s7_6, M4(-5.930e-02, -9.788e-02, 1.161e-01, 1.467e-02, -1.963e-02, 5.350e-02, 1.978e-02, -3.094e-02, -6.057e-02, 1.543e-01, -5.657e-02, -1.053e-01, -2.314e-02, 1.829e-02, 3.077e-02, 3.972e-02)); + r += mul(s7_7, M4(-1.266e-01, 4.303e-02, -4.994e-02, 3.032e-02, -9.509e-02, 1.854e-01, -1.631e-02, 4.650e-02, -5.716e-02, -1.233e-02, -3.943e-02, -1.468e-01, -1.487e-02, 2.762e-02, 9.000e-02, 3.216e-02)); + r += mul(s7_8, M4(1.010e-02, -6.407e-02, -2.538e-02, -5.266e-02, 7.357e-03, -6.038e-02, -1.984e-02, 3.594e-02, -7.398e-03, -1.875e-01, -3.417e-02, -1.130e-03, -7.340e-02, -7.423e-02, -4.463e-02, 3.237e-02)); + r += V4(-3.010e-02, -1.824e-02, 2.032e-02, -3.652e-02); + return r; +} + +V4 f3(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(1.458e-01, -1.057e-01, -3.860e-01, 3.604e-01, -5.817e-02, -8.183e-02, -6.805e-02, 8.234e-02, -5.423e-03, 5.963e-02, 2.290e-01, 3.974e-04, 2.429e-01, -1.556e-02, -9.961e-02, -1.299e-01)); + r += mul(s0_1, M4(2.341e-01, -4.703e-02, 2.257e-02, 5.068e-01, 1.539e-01, 6.969e-02, -1.353e-01, 3.199e-04, -1.972e-01, 9.778e-02, -4.482e-01, 3.351e-01, 8.723e-02, -1.328e-01, 3.968e-01, -6.975e-02)); + r += mul(s0_2, M4(-2.142e-01, 3.969e-02, -3.004e-01, -2.884e-02, -1.830e-02, 1.636e-01, 2.705e-02, -6.598e-02, 1.193e-01, -4.205e-02, -6.471e-01, 6.102e-01, 2.572e-01, -1.189e-01, -2.108e-01, -2.460e-01)); + r += mul(s0_3, M4(3.241e-02, -1.809e-01, -6.209e-02, -2.740e-01, -9.664e-02, -4.631e-02, 1.004e-02, -8.167e-03, -2.651e-01, 1.124e-01, -3.589e-01, -5.007e-01, -5.856e-02, -2.368e-01, 1.615e-01, -4.301e-01)); + r += mul(s0_4, M4(2.754e-02, 8.503e-02, 1.093e-01, -2.404e-01, -2.841e-03, -3.447e-02, 4.092e-02, 2.156e-01, -4.043e-01, 3.334e-01, -2.567e-01, -7.555e-01, 4.484e-01, -2.664e-01, -2.881e-02, -1.850e-01)); + r += mul(s0_5, M4(-4.196e-02, 1.179e-01, -2.343e-02, -2.367e-01, 2.046e-01, 3.918e-02, 1.311e-01, 1.751e-01, 3.000e-01, -1.206e-01, -4.298e-01, 4.896e-01, 6.354e-01, 5.186e-01, 3.271e-01, -2.650e-01)); + r += mul(s0_6, M4(-2.206e-01, -1.766e-01, 1.442e-01, 1.336e-01, 1.546e-01, 1.824e-02, 1.466e-01, -2.096e-01, -3.067e-01, 3.769e-01, -1.642e-01, 3.411e-01, -2.238e-01, 2.257e-01, -1.335e-01, -2.824e-01)); + r += mul(s0_7, M4(5.319e-02, -1.473e-01, 9.736e-02, 2.883e-02, -3.570e-01, -6.722e-02, -7.487e-02, 2.148e-01, -4.199e-01, 3.485e-02, -5.580e-02, -3.259e-01, -2.798e-02, 1.914e-01, 2.524e-01, -1.967e-01)); + r += mul(s0_8, M4(-1.292e-01, 1.673e-01, -1.227e-01, 2.136e-01, 3.612e-02, 5.502e-02, -4.655e-03, -9.540e-02, 2.594e-02, -4.818e-02, -1.172e-01, -4.448e-03, -7.485e-02, 6.047e-02, 1.883e-01, 3.448e-02)); + r += mul(s1_0, M4(2.700e-02, -5.188e-02, 5.934e-02, 1.762e-01, 5.025e-02, -4.472e-02, -7.632e-02, -1.632e-02, -3.359e-02, 5.183e-02, 5.725e-02, 1.816e-01, 2.679e-02, -1.176e-01, 1.402e-01, 4.902e-02)); + r += mul(s1_1, M4(1.645e-01, -4.533e-02, 1.421e-01, -2.275e-02, -4.301e-02, 4.713e-02, 2.986e-01, 6.367e-02, -6.663e-02, 1.499e-01, -4.491e-02, 2.421e-03, 1.310e-01, -9.423e-03, 7.218e-02, -6.969e-02)); + r += mul(s1_2, M4(-3.249e-02, 1.498e-01, 6.415e-02, 1.244e-01, -1.128e-01, -4.648e-02, -1.526e-02, 8.026e-02, -5.200e-02, 5.942e-02, 1.186e-01, -1.078e-01, -2.788e-02, -1.210e-01, -1.752e-02, -4.173e-02)); + r += mul(s1_3, M4(-6.615e-02, -3.023e-02, -2.472e-02, -9.554e-02, 5.002e-03, 4.139e-02, -1.589e-01, -1.873e-01, 1.275e-01, -7.109e-02, -9.129e-02, 7.003e-02, -2.288e-02, 2.433e-02, 9.158e-02, -2.862e-02)); + r += mul(s1_4, M4(-6.587e-02, -3.614e-02, 1.100e-03, 6.735e-02, 1.356e-01, 9.111e-02, 9.717e-02, -1.448e-01, 8.483e-02, -1.013e-01, 3.991e-02, -1.816e-02, -1.464e-02, -1.150e-02, -4.866e-02, 2.912e-03)); + r += mul(s1_5, M4(-4.282e-02, 1.452e-01, -9.649e-02, -1.703e-01, -3.860e-02, 5.221e-02, -2.984e-01, -2.036e-01, -1.365e-02, 8.505e-02, -9.315e-03, 2.664e-02, 6.935e-02, 5.125e-02, -1.443e-01, -1.144e-01)); + r += mul(s1_6, M4(-1.330e-01, 2.596e-02, 1.121e-01, 5.089e-02, -1.685e-02, -1.642e-01, 2.425e-01, 1.509e-01, -2.067e-02, -1.228e-01, -5.734e-02, -2.298e-02, -7.177e-02, -2.879e-02, -5.220e-02, -5.664e-02)); + r += mul(s1_7, M4(-4.861e-02, -1.351e-01, -4.328e-02, -4.571e-02, -5.402e-02, 4.793e-03, 3.349e-01, 5.714e-02, -1.283e-02, -3.564e-02, 1.486e-02, 5.641e-02, -4.300e-02, 1.057e-01, -7.635e-03, 1.724e-01)); + r += mul(s1_8, M4(7.989e-02, 3.316e-02, -8.216e-02, -6.660e-02, -1.776e-01, -6.948e-02, 2.577e-02, 2.058e-01, -2.778e-02, -3.578e-02, -1.244e-02, -2.773e-02, -2.935e-02, 1.343e-02, -8.059e-02, 1.333e-01)); + r += mul(s2_0, M4(6.232e-02, -3.149e-02, 1.008e-01, -1.106e-02, -3.848e-02, -8.277e-02, 6.132e-02, 5.282e-02, -3.018e-02, -3.332e-02, -4.491e-02, -4.111e-03, 2.646e-01, 6.702e-03, 8.115e-02, -9.399e-02)); + r += mul(s2_1, M4(-5.254e-02, 1.544e-02, -1.533e-01, 9.559e-03, 1.267e-01, 1.300e-01, -6.107e-02, 3.549e-03, 7.784e-02, -2.019e-01, 4.710e-02, 1.812e-02, -1.439e-01, -5.178e-02, -3.601e-02, -1.172e-02)); + r += mul(s2_2, M4(1.030e-02, 1.181e-01, 1.131e-02, 1.816e-02, -2.074e-02, 6.633e-02, -6.371e-02, 3.127e-02, 5.810e-02, -1.121e-01, -4.048e-02, 5.210e-02, 4.552e-02, -1.315e-01, 2.048e-02, 9.477e-02)); + r += mul(s2_3, M4(-9.004e-03, 6.638e-02, 2.992e-02, 7.252e-02, -8.015e-03, 3.287e-02, -1.135e-01, 9.058e-02, -1.739e-01, 7.196e-02, 1.993e-01, 1.446e-02, -1.300e-01, 1.280e-01, -1.393e-01, -3.597e-02)); + r += mul(s2_4, M4(-1.705e-01, 1.210e-03, 3.184e-02, 9.400e-02, 3.255e-02, 1.192e-01, -7.085e-03, -7.351e-02, -8.781e-03, -5.180e-02, 2.926e-02, -1.694e-01, 8.069e-02, 1.388e-01, 1.032e-01, 1.272e-01)); + r += mul(s2_5, M4(-1.014e-01, 1.645e-02, -2.046e-02, -4.512e-02, 6.069e-02, 1.121e-01, -6.333e-02, -5.930e-03, 1.885e-01, 5.901e-03, 1.992e-01, -1.039e-01, 2.526e-02, 5.944e-02, 1.636e-01, -2.309e-02)); + r += mul(s2_6, M4(3.584e-02, 2.289e-02, 4.466e-02, -1.670e-01, 3.483e-02, -1.253e-01, -4.845e-02, -1.067e-01, -3.520e-02, -4.303e-02, 7.572e-02, 7.915e-03, -6.681e-02, 5.621e-02, -9.969e-03, 7.440e-03)); + r += mul(s2_7, M4(-1.897e-01, -9.183e-02, -7.758e-02, -2.510e-03, -5.537e-02, 1.171e-03, -2.415e-02, -3.851e-02, 8.360e-02, -5.710e-02, 2.774e-02, 2.952e-02, 1.164e-01, 8.237e-02, -1.203e-01, -2.561e-02)); + r += mul(s2_8, M4(9.266e-03, -5.956e-02, 9.509e-02, 5.436e-02, -1.968e-02, -2.842e-02, -6.990e-02, -1.198e-01, -4.262e-02, -1.328e-01, 1.243e-01, -6.755e-02, 6.468e-02, -1.296e-01, -1.240e-01, -7.022e-02)); + r += mul(s3_0, M4(1.413e-02, 4.781e-02, 1.564e-01, -6.482e-02, 1.809e-01, -9.167e-02, -2.371e-02, 2.177e-01, 7.312e-02, -1.957e-01, 8.278e-02, -1.701e-02, -1.665e-01, 2.045e-02, 2.567e-01, -3.322e-02)); + r += mul(s3_1, M4(2.266e-01, 1.190e-01, -1.189e-01, -4.612e-03, -2.023e-01, 3.506e-01, 5.051e-02, -5.788e-03, 9.186e-02, -5.926e-02, -6.753e-02, 7.830e-03, -7.641e-02, 7.843e-03, 2.000e-01, -1.995e-01)); + r += mul(s3_2, M4(-3.059e-01, 1.439e-02, -2.829e-02, -9.502e-02, -1.778e-01, 5.261e-02, 1.083e-01, 2.346e-01, 1.277e-02, 2.619e-02, -1.854e-01, 1.131e-01, -4.176e-03, 5.011e-03, 6.163e-02, 8.296e-02)); + r += mul(s3_3, M4(-2.323e-02, -3.141e-02, -1.047e-01, -1.028e-01, 1.246e-01, 9.232e-02, -2.727e-01, -2.723e-01, -1.058e-01, 2.544e-02, -6.973e-02, -1.832e-01, -1.606e-01, -9.955e-02, -4.539e-02, 9.036e-03)); + r += mul(s3_4, M4(2.623e-02, -4.559e-02, -1.179e-01, 9.006e-02, -4.979e-02, -1.042e-02, -3.673e-02, -4.996e-01, 7.021e-02, -1.124e-01, -5.125e-03, -1.706e-01, 5.848e-03, -1.593e-01, 1.029e-02, -5.513e-02)); + r += mul(s3_5, M4(-7.010e-02, -3.848e-02, 1.459e-01, -1.935e-02, 3.735e-01, 1.714e-01, 8.493e-02, 1.259e-01, 4.226e-03, -7.313e-02, 4.575e-02, -6.714e-02, 5.353e-02, 1.139e-01, -4.538e-02, 4.854e-02)); + r += mul(s3_6, M4(4.551e-02, -4.272e-02, 5.300e-02, -6.099e-03, -5.680e-02, -3.682e-01, 4.008e-02, 3.812e-01, 6.084e-03, 4.887e-02, 3.415e-02, 5.117e-02, 1.555e-03, -5.922e-02, 8.022e-02, 2.330e-04)); + r += mul(s3_7, M4(2.511e-01, -1.463e-01, -1.421e-01, 3.722e-01, -1.537e-01, -3.415e-01, -4.897e-02, 1.385e-01, 2.084e-01, -6.924e-02, 4.013e-02, -7.006e-03, 1.067e-01, 1.622e-01, 8.471e-02, 1.176e-01)); + r += mul(s3_8, M4(4.099e-02, 1.062e-02, -8.365e-02, 2.326e-01, -7.736e-02, 2.510e-02, 4.253e-02, -5.139e-02, -7.250e-02, 2.679e-02, -5.142e-02, 1.117e-02, -1.339e-01, -3.943e-02, -9.308e-02, 6.173e-02)); + r += mul(s4_0, M4(-3.013e-02, 1.576e-01, 1.254e-02, 1.647e-02, 5.044e-03, -5.229e-02, -4.009e-03, -1.699e-02, 3.875e-02, -5.560e-02, 8.825e-02, 4.523e-02, 7.351e-02, 1.831e-02, -2.503e-02, -2.665e-02)); + r += mul(s4_1, M4(6.452e-02, -5.458e-02, -5.632e-02, 1.595e-01, -7.125e-02, 1.512e-01, -9.220e-02, 1.126e-01, -7.965e-02, -1.315e-01, 1.354e-01, 5.626e-02, -2.081e-02, 5.125e-03, 6.471e-03, 6.599e-02)); + r += mul(s4_2, M4(1.958e-02, 6.594e-02, 1.108e-01, 2.743e-02, 1.106e-01, 8.074e-02, 1.238e-02, 1.530e-01, -1.547e-03, -7.476e-02, -2.067e-02, 2.805e-02, 4.422e-02, -1.744e-02, -3.843e-02, 6.642e-02)); + r += mul(s4_3, M4(-1.299e-01, 6.686e-02, 1.589e-01, -7.593e-02, 1.923e-01, 5.234e-02, -8.208e-03, -1.401e-03, 1.549e-01, -1.942e-01, -1.506e-01, 1.181e-01, 9.531e-02, 6.049e-02, 1.813e-01, 8.355e-02)); + r += mul(s4_4, M4(-2.774e-02, -1.567e-01, -7.373e-02, 6.260e-02, 5.863e-02, -1.018e-02, -1.111e-01, -3.510e-02, -1.002e-01, 6.370e-02, -1.535e-03, 1.797e-01, 7.641e-02, -4.574e-02, -1.022e-01, -9.351e-02)); + r += mul(s4_5, M4(-1.200e-01, -1.160e-02, -6.534e-02, -1.067e-01, 5.484e-02, 1.177e-01, 1.267e-01, -1.225e-01, -2.964e-02, 2.300e-02, -1.816e-01, -2.683e-01, -8.582e-02, 1.671e-02, -6.333e-02, 4.319e-02)); + r += mul(s4_6, M4(4.055e-02, 7.781e-02, -3.199e-02, -2.787e-02, -1.216e-02, -7.212e-03, -1.433e-01, 2.704e-02, 4.327e-02, -4.886e-02, -9.572e-02, -6.567e-02, 3.094e-02, -1.714e-02, 7.660e-02, 1.517e-01)); + r += mul(s4_7, M4(-1.141e-01, 1.709e-02, -1.614e-01, -1.094e-01, 9.059e-02, -7.837e-02, -4.849e-02, -8.270e-02, -6.884e-02, 1.992e-01, -8.652e-03, 1.141e-01, -1.778e-01, 8.916e-02, 6.338e-03, 3.520e-02)); + r += mul(s4_8, M4(5.285e-02, 1.784e-02, 9.877e-02, -4.795e-02, -1.474e-02, 5.813e-02, 1.600e-02, -2.331e-01, 6.161e-02, 1.326e-02, -2.269e-02, -9.264e-02, -7.120e-02, -6.561e-02, -1.330e-01, -1.070e-01)); + r += mul(s5_0, M4(-3.443e-02, 1.211e-02, 7.835e-02, 8.088e-02, 6.290e-02, -1.237e-01, 3.414e-02, -4.064e-02, -3.365e-02, -8.764e-02, 1.468e-01, -1.177e-01, 1.902e-01, 3.332e-03, 7.480e-02, 2.019e-01)); + r += mul(s5_1, M4(1.156e-01, 1.688e-01, -1.575e-01, 2.182e-02, 2.382e-01, -1.034e-01, 9.477e-02, 1.114e-01, -4.447e-02, 1.162e-01, -1.532e-02, -1.506e-01, -2.357e-01, -2.335e-02, -2.261e-01, 9.156e-02)); + r += mul(s5_2, M4(1.047e-01, -3.653e-02, -6.395e-02, 6.790e-03, -8.731e-02, 1.351e-02, -1.481e-01, 3.597e-02, -7.186e-02, -1.126e-01, -4.724e-02, 1.909e-02, 5.390e-02, 1.135e-01, 7.112e-02, 1.034e-01)); + r += mul(s5_3, M4(1.474e-01, 1.468e-01, -4.779e-02, 3.081e-02, 2.681e-03, 2.823e-01, 2.609e-01, 1.840e-01, 5.953e-02, -6.490e-02, 6.995e-02, 1.097e-01, 1.500e-03, 9.816e-02, -7.883e-02, -2.856e-01)); + r += mul(s5_4, M4(1.473e-01, 3.564e-01, -1.592e-01, 9.082e-02, 3.926e-01, 3.493e-02, 3.395e-02, -1.690e-01, -1.149e-01, 3.361e-01, 1.345e-01, -7.451e-02, -3.164e-01, -6.502e-02, -7.120e-02, -7.121e-02)); + r += mul(s5_5, M4(1.170e-01, 6.699e-02, -9.870e-03, -2.853e-03, 6.475e-02, 6.402e-02, 3.185e-01, -5.999e-01, -1.418e-02, -6.196e-02, -2.738e-01, 1.501e-02, 1.551e-01, -9.429e-02, 9.613e-02, 1.801e-01)); + r += mul(s5_6, M4(1.714e-01, 9.871e-03, 7.027e-02, -1.070e-01, 1.474e-01, 1.584e-01, -5.971e-02, -3.344e-01, -7.838e-02, -1.431e-01, 9.112e-02, -1.975e-02, -1.336e-01, 5.051e-02, 7.399e-02, -2.969e-01)); + r += mul(s5_7, M4(6.431e-02, 1.743e-01, 6.981e-02, 1.151e-01, 1.525e-01, 3.157e-02, 2.851e-01, 1.275e-02, -2.096e-01, 2.519e-02, 9.657e-02, 1.002e-01, -9.906e-02, 2.752e-01, -4.120e-02, -3.626e-01)); + r += mul(s5_8, M4(9.874e-02, 1.203e-01, 5.129e-02, 1.009e-02, 3.056e-01, -6.610e-03, 5.447e-03, 7.317e-01, -1.282e-01, -3.201e-02, 4.725e-02, 9.542e-02, 1.964e-02, -2.541e-01, -1.279e-01, -1.049e-01)); + r += mul(s6_0, M4(1.578e-01, -3.237e-01, 2.350e-02, -6.793e-02, 8.381e-02, 4.005e-02, -7.837e-02, 1.254e-01, 1.684e-01, -1.441e-01, -1.255e-01, -9.504e-02, -8.860e-02, 5.765e-02, 8.474e-02, 2.351e-02)); + r += mul(s6_1, M4(-1.006e-02, 1.862e-01, 9.833e-02, 2.697e-01, -1.419e-02, 1.021e-02, 5.005e-02, -1.079e-01, 2.202e-01, 3.633e-02, 1.289e-01, 2.221e-01, -1.699e-01, -1.060e-01, -1.264e-01, 1.018e-01)); + r += mul(s6_2, M4(6.856e-02, -1.482e-01, -4.429e-02, -2.246e-02, -3.099e-02, -1.002e-01, -3.366e-03, -1.192e-01, -2.949e-02, 1.752e-01, -1.146e-01, 1.870e-01, -1.321e-01, -3.956e-02, -4.185e-02, -1.567e-01)); + r += mul(s6_3, M4(4.985e-02, 3.060e-01, 1.996e-01, -2.055e-01, 8.430e-02, -2.116e-01, -1.391e-01, 6.589e-02, -1.074e-01, 1.493e-01, -1.257e-01, -9.184e-02, 2.587e-01, -9.467e-02, -1.248e-01, 3.444e-01)); + r += mul(s6_4, M4(2.068e-01, -8.650e-02, -3.576e-01, -1.830e-01, 2.032e-01, 6.428e-02, 6.387e-02, -1.238e-01, 1.180e-01, -6.822e-02, -9.796e-02, -3.811e-02, -3.004e-02, -1.787e-01, 1.575e-01, 1.338e-01)); + r += mul(s6_5, M4(4.840e-02, 3.701e-01, -1.104e-01, 8.398e-02, 2.643e-02, -7.537e-02, 5.299e-02, 3.334e-02, -2.874e-01, -1.612e-02, 8.122e-02, 8.529e-02, 5.994e-02, -4.841e-02, 3.470e-02, -9.663e-02)); + r += mul(s6_6, M4(2.399e-01, -1.344e-02, 4.854e-02, -7.704e-02, 2.154e-01, -7.763e-02, -1.018e-01, 1.362e-01, -1.389e-02, -8.421e-02, 2.387e-02, 1.391e-01, -1.868e-01, -1.023e-02, 9.095e-02, 7.046e-04)); + r += mul(s6_7, M4(-3.735e-01, -1.332e-01, -3.959e-03, -1.446e-01, -6.002e-02, 6.089e-02, 8.194e-02, -1.282e-01, -9.532e-02, -6.605e-02, 5.474e-02, -2.218e-02, 9.658e-02, -1.103e-01, -5.073e-01, 1.831e-01)); + r += mul(s6_8, M4(-6.805e-02, -1.718e-01, -1.616e-01, 8.859e-01, -9.957e-02, -2.877e-02, 8.855e-02, 1.533e-03, 2.438e-01, -3.730e-02, 7.614e-03, -2.106e-02, -1.311e-01, 4.054e-02, -3.424e-01, -1.383e-01)); + r += mul(s7_0, M4(6.965e-03, -5.751e-02, -8.842e-03, 1.654e-02, 9.443e-02, 3.511e-02, -8.971e-02, 2.087e-01, -1.560e-01, -1.594e-01, -4.946e-03, -1.539e-01, -5.362e-02, 3.822e-02, 1.008e-01, -8.965e-02)); + r += mul(s7_1, M4(-7.483e-02, 1.594e-01, 1.747e-02, -4.957e-02, -8.034e-02, 3.226e-03, -9.016e-02, 6.601e-02, 6.784e-02, 9.068e-02, 1.376e-02, 1.284e-01, -6.647e-02, -1.523e-01, 1.083e-01, -1.671e-01)); + r += mul(s7_2, M4(3.809e-02, -2.300e-01, 9.337e-02, -7.427e-02, 2.687e-02, 7.178e-02, -3.732e-02, 1.850e-01, 9.315e-02, -5.495e-02, -1.183e-02, -1.315e-02, -3.891e-02, -5.993e-02, 3.488e-02, 6.137e-03)); + r += mul(s7_3, M4(-3.894e-02, -1.127e-02, -3.305e-03, -1.909e-01, 7.313e-02, -2.764e-02, -1.817e-03, 6.986e-02, 1.268e-03, 7.042e-02, -4.240e-02, 8.969e-02, -4.727e-02, 7.670e-02, 4.900e-02, 4.966e-02)); + r += mul(s7_4, M4(-4.756e-04, 5.827e-02, -1.501e-02, -2.065e-02, -3.107e-02, 5.694e-02, -1.732e-01, 1.295e-01, 9.486e-02, 4.963e-03, 1.125e-01, -1.603e-02, -1.566e-02, 8.881e-03, -1.428e-01, 1.537e-02)); + r += mul(s7_5, M4(-1.593e-01, -3.419e-02, -6.503e-02, 2.058e-01, 5.016e-02, -6.579e-02, -5.439e-02, 5.561e-03, -1.958e-02, -5.906e-02, -5.460e-02, -1.838e-01, 1.928e-01, 8.075e-02, 3.020e-02, -4.424e-02)); + r += mul(s7_6, M4(9.986e-02, -1.588e-02, 4.622e-02, 7.410e-02, 1.925e-01, -6.696e-02, -4.680e-02, 4.967e-02, -1.223e-01, 2.824e-02, -2.625e-02, 3.808e-02, -8.269e-02, -1.127e-01, 2.749e-02, 9.222e-03)); + r += mul(s7_7, M4(6.322e-02, 1.169e-01, -5.795e-02, -1.079e-03, -7.010e-02, 1.980e-01, -3.895e-02, -6.577e-02, -1.422e-01, 3.416e-02, -4.720e-02, -1.617e-01, 2.709e-02, 8.447e-02, -1.373e-01, 3.151e-02)); + r += mul(s7_8, M4(-1.497e-01, -5.371e-02, 1.870e-02, 4.774e-02, 6.793e-03, -8.559e-02, 3.785e-02, -5.313e-03, 1.966e-02, 2.851e-02, -6.064e-03, 1.514e-01, 2.522e-01, 1.173e-01, 9.527e-02, 1.197e-01)); + r += V4(-2.679e-02, 2.861e-03, 2.983e-03, 1.786e-02); + return r; +} + +void Pass3(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = Rmp8x8(tid.x) + blockStart; + uint2 size = GetInputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = (gxy + 0.5) * pt; + + V4 s0_0 = l0(-1.0, -1.0); + V4 s0_1 = l0(0.0, -1.0); + V4 s0_2 = l0(1.0, -1.0); + V4 s0_3 = l0(-1.0, 0.0); + V4 s0_4 = l0(0.0, 0.0); + V4 s0_5 = l0(1.0, 0.0); + V4 s0_6 = l0(-1.0, 1.0); + V4 s0_7 = l0(0.0, 1.0); + V4 s0_8 = l0(1.0, 1.0); + V4 s1_0 = -max(-s0_0, 0.0); + V4 s1_1 = -max(-s0_1, 0.0); + V4 s1_2 = -max(-s0_2, 0.0); + V4 s1_3 = -max(-s0_3, 0.0); + V4 s1_4 = -max(-s0_4, 0.0); + V4 s1_5 = -max(-s0_5, 0.0); + V4 s1_6 = -max(-s0_6, 0.0); + V4 s1_7 = -max(-s0_7, 0.0); + V4 s1_8 = -max(-s0_8, 0.0); + s0_0 = max(s0_0, 0.0); + s0_1 = max(s0_1, 0.0); + s0_2 = max(s0_2, 0.0); + s0_3 = max(s0_3, 0.0); + s0_4 = max(s0_4, 0.0); + s0_5 = max(s0_5, 0.0); + s0_6 = max(s0_6, 0.0); + s0_7 = max(s0_7, 0.0); + s0_8 = max(s0_8, 0.0); + + V4 s2_0 = l1(-1.0, -1.0); + V4 s2_1 = l1(0.0, -1.0); + V4 s2_2 = l1(1.0, -1.0); + V4 s2_3 = l1(-1.0, 0.0); + V4 s2_4 = l1(0.0, 0.0); + V4 s2_5 = l1(1.0, 0.0); + V4 s2_6 = l1(-1.0, 1.0); + V4 s2_7 = l1(0.0, 1.0); + V4 s2_8 = l1(1.0, 1.0); + V4 s3_0 = -max(-s2_0, 0.0); + V4 s3_1 = -max(-s2_1, 0.0); + V4 s3_2 = -max(-s2_2, 0.0); + V4 s3_3 = -max(-s2_3, 0.0); + V4 s3_4 = -max(-s2_4, 0.0); + V4 s3_5 = -max(-s2_5, 0.0); + V4 s3_6 = -max(-s2_6, 0.0); + V4 s3_7 = -max(-s2_7, 0.0); + V4 s3_8 = -max(-s2_8, 0.0); + s2_0 = max(s2_0, 0.0); + s2_1 = max(s2_1, 0.0); + s2_2 = max(s2_2, 0.0); + s2_3 = max(s2_3, 0.0); + s2_4 = max(s2_4, 0.0); + s2_5 = max(s2_5, 0.0); + s2_6 = max(s2_6, 0.0); + s2_7 = max(s2_7, 0.0); + s2_8 = max(s2_8, 0.0); + + V4 s4_0 = l2(-1.0, -1.0); + V4 s4_1 = l2(0.0, -1.0); + V4 s4_2 = l2(1.0, -1.0); + V4 s4_3 = l2(-1.0, 0.0); + V4 s4_4 = l2(0.0, 0.0); + V4 s4_5 = l2(1.0, 0.0); + V4 s4_6 = l2(-1.0, 1.0); + V4 s4_7 = l2(0.0, 1.0); + V4 s4_8 = l2(1.0, 1.0); + V4 s5_0 = -max(-s4_0, 0.0); + V4 s5_1 = -max(-s4_1, 0.0); + V4 s5_2 = -max(-s4_2, 0.0); + V4 s5_3 = -max(-s4_3, 0.0); + V4 s5_4 = -max(-s4_4, 0.0); + V4 s5_5 = -max(-s4_5, 0.0); + V4 s5_6 = -max(-s4_6, 0.0); + V4 s5_7 = -max(-s4_7, 0.0); + V4 s5_8 = -max(-s4_8, 0.0); + s4_0 = max(s4_0, 0.0); + s4_1 = max(s4_1, 0.0); + s4_2 = max(s4_2, 0.0); + s4_3 = max(s4_3, 0.0); + s4_4 = max(s4_4, 0.0); + s4_5 = max(s4_5, 0.0); + s4_6 = max(s4_6, 0.0); + s4_7 = max(s4_7, 0.0); + s4_8 = max(s4_8, 0.0); + + V4 s6_0 = l3(-1.0, -1.0); + V4 s6_1 = l3(0.0, -1.0); + V4 s6_2 = l3(1.0, -1.0); + V4 s6_3 = l3(-1.0, 0.0); + V4 s6_4 = l3(0.0, 0.0); + V4 s6_5 = l3(1.0, 0.0); + V4 s6_6 = l3(-1.0, 1.0); + V4 s6_7 = l3(0.0, 1.0); + V4 s6_8 = l3(1.0, 1.0); + V4 s7_0 = -max(-s6_0, 0.0); + V4 s7_1 = -max(-s6_1, 0.0); + V4 s7_2 = -max(-s6_2, 0.0); + V4 s7_3 = -max(-s6_3, 0.0); + V4 s7_4 = -max(-s6_4, 0.0); + V4 s7_5 = -max(-s6_5, 0.0); + V4 s7_6 = -max(-s6_6, 0.0); + V4 s7_7 = -max(-s6_7, 0.0); + V4 s7_8 = -max(-s6_8, 0.0); + s6_0 = max(s6_0, 0.0); + s6_1 = max(s6_1, 0.0); + s6_2 = max(s6_2, 0.0); + s6_3 = max(s6_3, 0.0); + s6_4 = max(s6_4, 0.0); + s6_5 = max(s6_5, 0.0); + s6_6 = max(s6_6, 0.0); + s6_7 = max(s6_7, 0.0); + s6_8 = max(s6_8, 0.0); + + t0[gxy] = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t1[gxy] = f1(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t2[gxy] = f2(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t3[gxy] = f3(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); +} + +//!PASS 4 +//!DESC conv3 +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 +//!IN t0, t1, t2, t3 +//!OUT t4, t5, t6, t7 + +#define l0(x, y) V4(O(t0, float2(x, y))) +#define l1(x, y) V4(O(t1, float2(x, y))) +#define l2(x, y) V4(O(t2, float2(x, y))) +#define l3(x, y) V4(O(t3, float2(x, y))) + +V4 f0(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-3.824e-03, 1.984e-02, -1.947e-01, 9.803e-03, 2.174e-01, -3.263e-02, -1.526e-01, 1.593e-03, -1.912e-02, -1.175e-01, -1.088e-01, -8.861e-02, -8.019e-02, 3.020e-02, 4.746e-02, -3.358e-02)); + r += mul(s0_1, M4(-1.177e-01, 8.201e-02, 1.411e-01, 3.350e-03, 4.358e-02, -1.561e-01, -6.960e-02, 2.106e-01, 1.618e-01, -6.133e-02, -2.230e-03, -3.605e-03, -1.173e-02, -1.137e-01, 6.437e-03, -1.214e-02)); + r += mul(s0_2, M4(8.418e-02, -1.156e-02, -1.589e-02, 7.733e-04, 1.901e-02, -2.164e-01, 7.217e-03, -5.674e-02, 1.313e-01, -2.424e-01, 3.826e-02, 5.194e-02, 8.220e-02, -1.985e-01, 3.844e-02, 2.949e-02)); + r += mul(s0_3, M4(1.491e-01, -1.970e-01, 1.615e-02, 4.271e-02, 5.862e-02, 5.701e-02, -6.334e-02, 7.912e-02, -9.144e-02, -1.073e-01, 3.700e-02, 1.672e-02, 1.982e-03, -1.455e-03, -1.904e-02, 7.679e-02)); + r += mul(s0_4, M4(-1.377e-01, -1.900e-01, -8.234e-02, -6.595e-02, 1.306e-02, 1.309e-01, -5.066e-02, 8.366e-02, -1.082e-01, -9.153e-02, 8.381e-02, 1.153e-01, -1.096e-01, 4.144e-02, 1.572e-01, -9.698e-02)); + r += mul(s0_5, M4(6.954e-02, 1.007e-01, 5.669e-03, 6.376e-02, -8.465e-02, -1.026e-01, -9.748e-02, -6.989e-03, 5.987e-02, -9.004e-02, -1.457e-01, 1.234e-01, 1.343e-01, 6.650e-02, 4.572e-02, 1.591e-02)); + r += mul(s0_6, M4(-1.079e-02, 2.281e-01, -5.435e-03, -4.308e-03, -3.168e-02, 1.446e-02, 5.164e-02, -1.238e-01, 1.077e-01, -1.439e-01, 3.583e-02, 7.127e-03, -2.933e-02, 1.393e-01, -4.583e-02, -2.124e-02)); + r += mul(s0_7, M4(-9.039e-02, -1.761e-02, 1.885e-01, 1.782e-02, 3.468e-02, 1.284e-01, 1.500e-01, 1.329e-01, 4.006e-02, 7.862e-02, -4.609e-02, 8.688e-02, 6.303e-02, -2.599e-01, -7.164e-02, -9.295e-02)); + r += mul(s0_8, M4(-9.183e-02, 9.019e-02, -1.442e-01, 3.553e-02, -1.751e-02, -2.352e-01, -1.772e-01, 1.164e-01, 2.843e-02, -1.063e-01, -3.228e-02, 9.867e-02, -2.188e-01, 8.323e-02, 6.436e-02, 7.404e-03)); + r += mul(s1_0, M4(1.096e-01, -7.150e-02, -2.326e-01, 3.074e-02, 6.687e-02, 4.780e-02, -2.172e-02, 6.202e-02, -3.545e-02, -8.431e-02, 2.420e-02, 9.476e-03, 2.568e-02, -5.384e-02, -2.290e-02, 5.260e-02)); + r += mul(s1_1, M4(4.047e-02, -1.417e-01, 3.742e-01, 2.130e-01, -1.026e-02, 2.140e-01, -2.203e-01, 8.287e-02, 3.059e-03, -5.168e-02, 7.797e-02, -7.983e-03, -4.622e-02, -1.208e-02, -2.153e-01, 1.757e-01)); + r += mul(s1_2, M4(3.949e-02, -3.499e-01, 2.211e-02, -4.854e-02, -3.249e-02, -8.875e-02, 1.019e-01, 9.838e-02, -2.568e-02, 6.213e-02, 1.026e-01, 8.773e-02, 3.195e-02, -2.138e-01, -9.769e-03, 1.023e-01)); + r += mul(s1_3, M4(3.489e-01, 7.578e-02, -1.384e-01, -1.000e-01, 2.159e-01, -1.537e-01, 8.139e-02, 1.081e-01, 6.928e-02, 3.479e-03, -2.065e-01, 4.685e-02, 1.345e-01, -5.114e-02, 1.397e-03, -3.190e-04)); + r += mul(s1_4, M4(-1.131e-02, -3.310e-01, -2.831e-01, -1.713e-01, -4.212e-02, 1.771e-02, 2.622e-02, 7.984e-02, -1.656e-02, 3.108e-02, 1.089e-01, -3.210e-02, -1.209e-01, -7.105e-02, -2.352e-01, -4.034e-03)); + r += mul(s1_5, M4(4.338e-01, 2.230e-01, 1.184e-01, 1.444e-01, -2.695e-01, -2.069e-01, -5.883e-02, 5.791e-02, 1.479e-01, -6.455e-02, -4.461e-02, 5.482e-02, 9.545e-02, 2.171e-01, -8.118e-02, 6.398e-02)); + r += mul(s1_6, M4(-3.037e-02, -4.636e-02, 1.223e-01, -1.255e-01, -8.541e-02, 3.001e-02, 1.393e-01, -4.605e-02, -8.531e-02, 9.275e-02, 1.362e-01, -9.073e-03, -2.249e-02, 3.716e-03, 1.433e-01, 1.285e-01)); + r += mul(s1_7, M4(3.612e-02, 3.724e-02, 2.517e-01, 3.506e-02, 6.147e-02, 1.538e-01, -2.245e-02, 3.803e-02, -1.459e-01, -4.336e-02, 3.873e-02, 2.860e-02, -5.779e-02, 2.527e-02, -8.128e-02, -1.848e-01)); + r += mul(s1_8, M4(-2.045e-01, 3.185e-01, 1.897e-01, -3.090e-01, 1.303e-01, -4.772e-02, -1.929e-02, 5.857e-03, -8.579e-02, 1.297e-01, 3.964e-02, -1.187e-01, -5.910e-02, 8.492e-02, 7.102e-02, 2.462e-02)); + r += mul(s2_0, M4(-5.622e-02, -3.406e-02, 1.625e-01, -2.395e-02, 7.981e-02, -8.697e-02, -1.340e-02, -7.849e-02, 8.512e-02, -6.636e-02, 6.628e-02, 1.257e-01, 9.518e-02, -1.967e-02, 3.263e-02, -1.632e-02)); + r += mul(s2_1, M4(-8.568e-02, -2.104e-02, -9.114e-02, 2.791e-02, 4.465e-02, 5.472e-02, -1.561e-01, -8.667e-02, -8.310e-02, -2.272e-01, 8.860e-02, 3.920e-02, 2.148e-02, -4.088e-04, -3.415e-02, -9.479e-02)); + r += mul(s2_2, M4(1.967e-02, -1.177e-01, -8.033e-02, -1.082e-02, 8.279e-02, -4.859e-02, 8.015e-03, -1.620e-03, -5.299e-02, -1.518e-01, 1.951e-02, -9.250e-02, 1.210e-03, 8.942e-03, 6.476e-02, 8.816e-02)); + r += mul(s2_3, M4(6.961e-02, -2.541e-02, -8.874e-02, -8.571e-02, -6.565e-02, -8.235e-02, -7.851e-02, -2.462e-02, -5.045e-02, 1.492e-02, -1.060e-01, 9.583e-02, 7.954e-02, 1.517e-01, 9.226e-02, -5.570e-03)); + r += mul(s2_4, M4(4.027e-03, 5.900e-02, -9.730e-02, 9.346e-02, 2.364e-02, -5.125e-02, -1.369e-01, -1.545e-01, -2.032e-01, -1.652e-01, -1.208e-01, -1.012e-01, 4.560e-02, -1.362e-01, 4.839e-02, 3.833e-02)); + r += mul(s2_5, M4(-1.356e-01, -9.492e-02, 6.686e-03, 1.573e-01, 1.015e-01, -4.342e-03, -6.012e-02, 5.045e-02, -1.773e-01, 2.489e-02, -6.572e-02, -8.431e-02, 1.251e-01, 1.012e-01, -7.313e-02, 1.060e-01)); + r += mul(s2_6, M4(4.918e-02, -2.224e-02, 1.051e-02, -7.640e-02, -4.369e-02, -3.976e-02, -1.676e-01, -2.006e-02, 8.876e-02, 2.020e-02, 5.471e-02, -9.058e-02, 4.734e-02, -6.211e-02, 9.784e-02, -5.968e-02)); + r += mul(s2_7, M4(-3.554e-03, 1.414e-01, -7.057e-02, 2.734e-04, -1.762e-01, 2.698e-02, -4.323e-02, 6.518e-02, -2.096e-03, 2.544e-02, 1.057e-01, -1.179e-01, -3.325e-02, -9.233e-02, -9.906e-02, 5.904e-03)); + r += mul(s2_8, M4(-5.982e-02, 1.036e-01, -7.251e-02, -5.751e-02, 2.274e-02, -5.704e-02, -2.759e-02, -3.227e-03, 3.411e-02, -2.169e-01, 4.238e-02, -5.646e-02, 6.166e-02, -8.737e-02, -5.433e-02, -2.193e-02)); + r += mul(s3_0, M4(9.979e-02, 6.667e-02, -2.051e-01, 3.280e-01, 6.811e-02, 8.896e-03, -6.806e-03, -5.281e-02, -1.662e-02, 7.599e-02, -2.618e-02, -9.118e-04, -1.773e-01, -1.096e-01, 2.660e-01, -3.410e-02)); + r += mul(s3_1, M4(7.067e-02, 1.609e-01, -4.891e-01, 1.395e-01, -2.836e-02, 4.949e-02, 5.419e-02, -1.912e-02, 1.265e-01, 9.371e-02, -2.274e-01, -2.388e-02, 1.294e-01, 1.215e-01, -6.401e-02, 2.552e-02)); + r += mul(s3_2, M4(-3.948e-01, 1.481e-01, 1.238e-01, 8.896e-02, 5.564e-02, -4.630e-02, 8.182e-02, -5.120e-02, 3.065e-02, 2.289e-02, -4.132e-02, 5.470e-02, -5.811e-04, 4.488e-02, 4.771e-02, 1.252e-01)); + r += mul(s3_3, M4(1.083e-01, 3.190e-01, 3.322e-02, 1.615e-02, -6.420e-03, 7.514e-02, 1.930e-02, 9.305e-02, -1.854e-02, -6.599e-02, -1.284e-01, 4.180e-02, -2.438e-01, -3.204e-01, -1.481e-01, 2.012e-01)); + r += mul(s3_4, M4(1.541e-01, -1.294e-01, 3.407e-01, -2.888e-02, 2.320e-02, -1.261e-01, 1.244e-01, -9.444e-02, 1.904e-01, 7.003e-02, -2.908e-02, -4.724e-02, -1.739e-01, -1.706e-01, 2.284e-01, 3.447e-01)); + r += mul(s3_5, M4(2.852e-01, -3.790e-02, -1.617e-01, 3.981e-01, 4.763e-02, -9.060e-02, -5.601e-02, -3.278e-02, 3.698e-02, 1.148e-01, 7.054e-02, 2.161e-02, -5.027e-02, 1.229e-01, 3.213e-01, -2.440e-02)); + r += mul(s3_6, M4(6.498e-02, -2.845e-02, 4.051e-01, -4.428e-02, 6.620e-03, -6.252e-02, -1.915e-02, -8.686e-02, -8.271e-02, 5.187e-02, -2.114e-02, 3.542e-02, 3.496e-02, 4.899e-02, -1.401e-01, -2.056e-01)); + r += mul(s3_7, M4(-8.188e-02, 8.977e-02, 3.044e-02, -3.808e-01, -1.818e-02, -8.713e-02, 1.459e-01, -1.006e-01, 6.703e-02, 7.376e-02, 4.647e-02, -8.068e-03, -8.089e-02, -4.263e-02, -1.011e-02, -5.059e-02)); + r += mul(s3_8, M4(4.991e-03, 1.335e-01, 2.895e-01, -2.575e-02, 2.970e-02, 1.426e-02, -3.004e-02, -9.444e-02, -7.585e-02, 7.416e-02, 1.773e-01, 2.740e-02, -1.133e-01, -1.625e-01, -2.058e-01, 1.230e-01)); + r += mul(s4_0, M4(-2.102e-02, 3.131e-02, -1.211e-01, -7.470e-03, -1.591e-02, -7.396e-02, 1.130e-01, 8.145e-02, 9.655e-02, -1.283e-01, -2.491e-02, -9.100e-02, -7.133e-02, 8.901e-03, -6.968e-03, 6.504e-02)); + r += mul(s4_1, M4(-3.988e-02, 3.759e-02, -2.350e-01, -3.543e-02, -1.110e-02, -1.670e-01, -2.306e-01, -6.088e-02, 4.749e-02, 4.387e-02, 4.186e-02, -8.751e-02, 5.597e-02, -1.072e-01, -3.988e-03, 1.393e-01)); + r += mul(s4_2, M4(1.889e-02, -4.900e-02, 1.151e-01, 5.871e-02, 1.303e-01, 5.656e-02, 2.618e-02, -2.952e-02, 1.727e-01, 1.147e-03, -1.948e-01, -1.243e-01, -4.239e-02, 7.484e-02, -9.689e-02, 9.238e-02)); + r += mul(s4_3, M4(1.297e-01, -4.217e-02, -3.800e-02, -6.907e-02, 1.070e-01, -4.291e-02, -1.046e-01, 3.485e-02, -5.988e-02, 2.235e-02, -1.191e-01, 7.352e-02, -2.498e-01, 9.790e-02, -6.694e-02, 2.014e-02)); + r += mul(s4_4, M4(-2.211e-02, 1.964e-01, -6.388e-03, 2.147e-01, -9.189e-02, 2.813e-02, 1.456e-01, -6.744e-02, -8.596e-02, 1.435e-01, -8.166e-02, -3.708e-02, 2.932e-02, -3.732e-03, -5.609e-02, 4.482e-02)); + r += mul(s4_5, M4(5.921e-02, 2.883e-02, -3.935e-02, 9.551e-03, -4.956e-02, 6.194e-02, -4.123e-02, -1.835e-03, -1.528e-01, -9.703e-02, -1.265e-01, -5.136e-02, -4.934e-03, 2.766e-02, -2.725e-02, 1.749e-01)); + r += mul(s4_6, M4(-2.997e-02, 6.308e-02, -9.442e-02, -5.405e-02, -4.856e-02, 1.301e-04, -2.347e-02, -3.285e-02, -5.298e-03, 1.065e-01, 9.091e-02, 1.112e-01, 1.438e-01, -2.032e-02, 9.683e-03, -7.034e-02)); + r += mul(s4_7, M4(-6.707e-02, -1.933e-01, 1.524e-01, 1.439e-01, -7.010e-02, 1.156e-01, 3.741e-03, -5.321e-02, 1.095e-01, 3.952e-02, 1.725e-01, 5.637e-02, 2.454e-02, -1.182e-02, 3.138e-02, 4.080e-02)); + r += mul(s4_8, M4(7.707e-02, -1.650e-01, -5.874e-02, 9.839e-02, 9.945e-03, -7.412e-02, -2.603e-02, -1.213e-02, -3.176e-02, 1.431e-01, 1.369e-01, -2.394e-02, 4.046e-02, -1.273e-01, 2.042e-03, 5.492e-02)); + r += mul(s5_0, M4(-6.479e-02, -3.666e-02, 3.631e-02, -1.134e-01, 1.970e-01, -2.427e-02, 2.536e-01, 1.759e-01, 3.687e-02, -2.974e-02, -1.511e-01, -1.112e-01, 3.452e-03, 1.038e-01, -3.214e-02, -6.203e-03)); + r += mul(s5_1, M4(-9.080e-02, -1.463e-02, 8.569e-02, -1.903e-02, -3.211e-01, -5.551e-02, -4.583e-02, 1.149e-01, 9.762e-02, 9.307e-02, 4.994e-02, -7.576e-03, 2.918e-01, 1.427e-01, -1.242e-01, -1.260e-02)); + r += mul(s5_2, M4(1.430e-02, -1.786e-01, 8.093e-02, -7.370e-02, 2.378e-01, 7.734e-02, 6.844e-02, 2.921e-01, -3.155e-02, -2.868e-02, -4.562e-02, 9.424e-02, -2.106e-01, -1.462e-01, 2.395e-01, 4.309e-02)); + r += mul(s5_3, M4(9.591e-02, -9.144e-02, -4.656e-02, 4.231e-02, 2.264e-02, 1.354e-02, -2.381e-01, -1.298e-01, -3.961e-02, -4.566e-02, -5.357e-02, -1.811e-01, -1.441e-01, 5.399e-02, 3.584e-01, 7.013e-02)); + r += mul(s5_4, M4(-3.230e-02, -8.598e-02, -1.194e-01, 1.281e-01, 4.380e-01, -2.147e-01, 1.278e-01, -2.084e-01, 1.027e-01, -5.091e-02, 1.104e-02, -2.743e-02, 2.803e-01, -4.974e-02, 6.860e-02, -4.789e-02)); + r += mul(s5_5, M4(-1.439e-01, -1.892e-01, -5.241e-02, -2.163e-02, -1.568e-01, 3.539e-01, 2.662e-02, -1.477e-01, -1.227e-01, -1.204e-01, -6.518e-02, 8.005e-02, 5.432e-02, 1.226e-03, -2.454e-03, 4.690e-02)); + r += mul(s5_6, M4(-3.239e-02, 1.420e-02, -3.429e-02, -3.895e-02, 6.057e-01, 4.380e-02, -6.836e-01, 1.556e-01, 6.391e-03, -7.455e-02, 2.477e-02, -5.640e-02, -3.121e-01, 4.938e-02, -9.663e-02, 1.507e-01)); + r += mul(s5_7, M4(3.230e-03, -5.809e-02, -1.020e-02, 4.602e-02, 1.941e-02, 9.688e-02, 3.482e-01, 9.593e-02, 6.448e-02, 1.075e-01, 7.606e-02, 3.724e-02, -6.785e-02, 3.216e-01, -3.050e-01, 1.372e-01)); + r += mul(s5_8, M4(2.103e-01, 1.393e-01, 1.636e-01, -9.668e-02, 4.504e-02, -1.291e-01, -8.852e-04, -1.928e-01, 7.878e-02, -3.617e-02, 6.621e-02, 4.323e-02, -1.529e-01, 8.576e-02, 5.715e-02, 1.650e-01)); + r += mul(s6_0, M4(-2.095e-01, 9.915e-02, -4.596e-02, -1.748e-01, -1.098e-01, -6.448e-02, 1.780e-01, 1.125e-01, -2.114e-01, 4.083e-01, 1.558e-03, 1.899e-02, 4.266e-02, 1.046e-01, 3.426e-02, -9.806e-03)); + r += mul(s6_1, M4(1.583e-01, -9.478e-02, 4.572e-02, -1.527e-02, 1.246e-01, -7.757e-02, -2.957e-02, -4.569e-02, 3.186e-01, 1.932e-01, -3.262e-02, 1.058e-01, 2.350e-01, -1.374e-01, 2.152e-01, 1.027e-01)); + r += mul(s6_2, M4(4.265e-02, 1.480e-01, 1.762e-01, -2.729e-01, -7.674e-02, -2.616e-01, -5.785e-02, -6.605e-02, -9.494e-02, -7.623e-03, 5.629e-02, 1.979e-02, 6.318e-02, 1.119e-01, -1.775e-01, 4.471e-02)); + r += mul(s6_3, M4(1.416e-01, 6.286e-02, 2.753e-01, 4.370e-02, 2.555e-02, 1.217e-01, 2.916e-02, -8.370e-02, -3.478e-01, 9.489e-03, -2.076e-01, 6.405e-02, 7.222e-02, 8.956e-02, 1.820e-02, -1.510e-01)); + r += mul(s6_4, M4(-4.919e-02, 3.645e-02, -2.264e-01, -1.779e-02, 3.702e-02, -1.291e-01, -1.130e-01, 8.156e-02, 7.529e-02, -1.063e-01, 9.065e-02, -3.642e-02, -2.478e-02, -5.106e-02, 2.422e-02, 1.540e-01)); + r += mul(s6_5, M4(-2.097e-02, -9.303e-02, -5.754e-02, -1.113e-01, -2.005e-02, 2.385e-02, 2.058e-02, -8.553e-02, -2.611e-01, -2.323e-01, -2.546e-02, 9.836e-02, -3.118e-02, 1.810e-01, 4.481e-02, 6.158e-02)); + r += mul(s6_6, M4(-1.205e-01, 3.792e-02, -2.491e-01, 1.104e-02, 6.093e-02, -6.249e-03, 2.042e-02, -4.415e-02, -7.268e-02, 4.343e-01, 2.416e-01, 8.859e-02, 1.997e-01, 2.222e-01, -1.322e-01, 3.828e-02)); + r += mul(s6_7, M4(5.871e-02, -3.529e-01, 2.206e-02, 3.605e-03, -2.877e-01, 1.420e-01, -1.695e-02, -5.085e-02, 1.826e-01, -1.024e-01, -1.523e-01, -1.639e-01, 5.823e-02, -1.405e-01, -1.124e-01, -2.890e-02)); + r += mul(s6_8, M4(4.023e-02, -3.477e-02, -7.664e-02, 6.820e-02, 5.723e-02, 1.819e-01, -9.973e-02, -1.035e-01, -1.219e-01, -2.891e-01, 2.666e-01, -3.550e-02, -1.744e-01, -7.098e-02, -9.127e-02, -9.753e-02)); + r += mul(s7_0, M4(9.776e-02, 3.419e-02, 7.676e-02, -4.181e-02, -1.284e-01, 7.161e-02, 5.880e-02, -9.813e-02, 1.232e-01, -7.420e-02, -6.708e-02, -7.536e-02, -3.379e-02, -3.744e-02, -4.778e-02, 2.363e-02)); + r += mul(s7_1, M4(-1.066e-01, -1.720e-02, 1.412e-01, 3.237e-03, 7.086e-03, 9.996e-02, -1.067e-01, 3.318e-02, -7.187e-02, 1.859e-01, 1.658e-02, 5.164e-02, 1.636e-01, 5.624e-02, -5.522e-02, 2.799e-02)); + r += mul(s7_2, M4(-3.080e-02, 5.477e-02, -6.302e-02, 2.429e-02, -1.038e-01, -1.639e-03, 4.041e-02, -2.281e-02, 9.072e-02, -6.279e-02, 1.764e-02, -2.716e-02, -4.723e-02, -2.239e-02, -3.870e-02, -2.529e-02)); + r += mul(s7_3, M4(-9.795e-02, -1.404e-01, 3.984e-02, 5.945e-02, -2.916e-01, -7.429e-02, -3.369e-02, 5.798e-02, -3.809e-02, -8.103e-02, 9.385e-02, -9.303e-02, -2.433e-02, 1.103e-01, 6.621e-02, -5.597e-02)); + r += mul(s7_4, M4(6.292e-03, -4.406e-02, -3.898e-02, 1.096e-01, 1.658e-01, -3.856e-02, 2.735e-02, 1.190e-01, 1.086e-02, 6.992e-02, -6.964e-02, 1.049e-01, -8.304e-02, -2.879e-01, -2.934e-03, -6.641e-02)); + r += mul(s7_5, M4(9.370e-03, -1.240e-01, 3.014e-02, 5.018e-02, 2.381e-01, -6.004e-02, -3.740e-02, -4.776e-03, -2.297e-02, 1.405e-01, -5.090e-02, -2.799e-02, -1.277e-02, 6.238e-02, -7.780e-03, -8.577e-02)); + r += mul(s7_6, M4(-5.754e-02, 1.323e-01, 1.598e-01, 1.861e-03, 7.371e-02, 3.565e-02, -5.038e-02, -3.091e-02, -1.125e-02, -1.466e-02, 3.518e-02, 1.336e-02, 1.662e-01, 1.033e-02, 1.263e-02, 7.036e-03)); + r += mul(s7_7, M4(3.799e-02, 7.738e-02, -1.830e-01, 1.088e-02, 2.345e-02, -8.913e-02, 4.484e-03, -7.087e-04, 2.995e-02, 6.962e-02, 6.441e-03, -1.072e-01, -1.717e-01, -6.303e-02, -6.593e-03, -3.927e-02)); + r += mul(s7_8, M4(-5.977e-02, 3.553e-02, -5.340e-02, -1.383e-03, -1.593e-01, -5.221e-02, -6.791e-02, -4.706e-03, -3.981e-02, -8.876e-02, -5.683e-02, -4.046e-02, -4.187e-02, 6.329e-02, 1.353e-01, -4.508e-02)); + r += V4(5.171e-03, -3.519e-03, 1.162e-02, 4.614e-03); + return r; +} + +V4 f1(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(1.748e-01, -1.615e-01, 1.196e-01, 9.843e-02, 4.946e-02, 1.034e-01, -1.539e-01, 1.314e-01, 7.507e-02, -2.103e-01, -4.577e-02, 4.777e-02, -1.197e-03, -7.288e-02, -3.140e-02, 3.566e-02)); + r += mul(s0_1, M4(-7.328e-02, 1.621e-03, -1.413e-01, -1.474e-01, 2.385e-02, 7.395e-02, 1.558e-02, -1.473e-01, -2.019e-03, -1.272e-01, -8.000e-02, 8.127e-02, -5.842e-02, 1.357e-01, 1.823e-02, 3.446e-02)); + r += mul(s0_2, M4(7.100e-02, 2.505e-01, 5.390e-02, -2.937e-02, -7.170e-02, -7.104e-02, -1.392e-01, 5.778e-02, 1.155e-01, -2.112e-01, -1.450e-02, 7.374e-02, 1.321e-02, 8.969e-02, 1.288e-02, -5.910e-02)); + r += mul(s0_3, M4(1.684e-02, 2.163e-02, 7.136e-02, 8.144e-02, 1.947e-01, -2.859e-02, 9.785e-02, 1.356e-01, -9.415e-03, -1.112e-01, 7.570e-02, -1.091e-01, -2.500e-01, 1.681e-01, -9.164e-02, 8.519e-02)); + r += mul(s0_4, M4(-1.422e-01, -9.273e-03, -1.359e-02, -3.367e-02, 1.059e-01, -5.308e-02, 1.559e-01, -9.744e-02, 2.041e-01, 1.342e-01, -6.243e-02, 9.553e-02, -1.557e-02, 2.216e-01, 4.646e-02, 3.626e-02)); + r += mul(s0_5, M4(5.181e-02, -4.935e-02, 6.051e-02, 6.619e-02, 1.311e-01, -5.899e-02, -1.714e-02, 9.745e-02, 8.865e-02, -1.504e-01, -1.081e-01, -6.180e-02, -1.285e-01, 6.585e-02, -5.292e-02, -1.062e-01)); + r += mul(s0_6, M4(4.277e-02, 1.043e-01, -1.369e-01, 6.853e-02, 5.930e-02, 3.663e-02, -4.107e-02, -1.006e-01, -9.768e-03, -3.706e-02, 6.806e-02, -9.002e-02, 5.096e-02, -1.300e-01, -7.291e-02, 1.431e-01)); + r += mul(s0_7, M4(1.037e-01, -9.086e-02, 7.090e-03, 8.210e-02, -7.251e-02, -9.346e-02, -3.284e-02, 8.748e-02, 4.957e-02, 9.675e-02, 6.061e-02, -5.284e-02, 6.728e-03, -7.363e-02, 9.566e-02, 6.330e-02)); + r += mul(s0_8, M4(-2.623e-02, 1.047e-01, -8.739e-04, -2.738e-02, 1.967e-01, 3.078e-02, 1.638e-01, 8.194e-02, -3.152e-02, 5.328e-02, 1.483e-02, -5.355e-02, -1.456e-01, -1.638e-03, 5.093e-02, 8.867e-02)); + r += mul(s1_0, M4(-2.947e-01, -4.130e-01, 9.883e-02, -6.187e-02, -9.668e-02, -6.321e-02, 9.855e-02, 1.098e-01, 3.308e-02, -2.460e-02, 8.938e-02, 1.724e-01, 1.259e-01, 4.671e-02, -5.314e-02, 1.246e-02)); + r += mul(s1_1, M4(1.907e-01, -3.510e-02, 1.183e-01, -2.284e-02, -4.719e-02, 2.314e-01, -2.440e-01, 7.838e-02, 3.864e-02, -1.380e-01, 4.039e-02, 6.139e-02, -5.638e-02, 1.308e-02, -5.999e-02, -8.289e-02)); + r += mul(s1_2, M4(-6.946e-02, -2.491e-01, -3.473e-01, -3.905e-03, -2.543e-02, -1.474e-01, 1.076e-01, 6.376e-02, -1.941e-01, 1.551e-01, 9.853e-02, 2.544e-02, 1.372e-01, -2.749e-02, -7.466e-02, 1.019e-01)); + r += mul(s1_3, M4(-5.817e-03, 1.422e-01, 2.063e-02, -1.789e-01, 2.091e-02, 1.212e-01, 9.807e-02, -2.877e-02, 1.791e-02, 5.875e-02, 7.261e-02, -4.916e-02, -1.170e-01, -1.439e-01, -3.418e-02, 7.885e-02)); + r += mul(s1_4, M4(-5.330e-01, -6.688e-02, -8.916e-03, 1.409e-01, 1.859e-01, 2.055e-03, 8.773e-02, 1.338e-01, 1.177e-01, -1.205e-01, 2.362e-01, 9.410e-02, 2.480e-01, 2.385e-01, 5.357e-02, -3.786e-03)); + r += mul(s1_5, M4(2.259e-01, 1.886e-01, -3.190e-01, -3.224e-01, 5.312e-02, -2.302e-02, -3.165e-02, -1.275e-01, -7.705e-02, 1.638e-01, -6.539e-02, -4.015e-02, -3.581e-03, 1.161e-02, -2.000e-02, 1.375e-03)); + r += mul(s1_6, M4(-4.769e-02, 1.558e-01, -1.516e-01, -9.477e-02, -4.890e-02, 8.982e-02, -4.474e-02, 5.636e-02, -1.303e-01, -2.098e-02, 8.743e-02, 7.577e-02, 7.475e-02, -3.978e-02, 1.887e-03, 4.019e-02)); + r += mul(s1_7, M4(4.887e-01, 1.727e-01, 1.540e-01, 1.387e-01, -6.586e-03, 1.452e-01, -1.666e-01, -3.717e-02, 1.178e-01, -7.970e-02, 1.419e-01, 1.066e-01, -4.486e-02, -1.489e-01, 1.204e-01, 9.282e-03)); + r += mul(s1_8, M4(7.865e-03, 2.430e-01, 9.405e-02, 2.463e-01, -9.942e-02, -1.766e-02, 8.818e-02, 4.626e-02, -1.734e-01, 1.733e-01, 6.431e-02, 1.807e-02, 1.419e-01, 1.384e-03, 1.402e-01, -4.538e-03)); + r += mul(s2_0, M4(-5.657e-02, 1.028e-01, 3.944e-02, -6.775e-03, -1.748e-02, 4.732e-02, -7.919e-02, 5.948e-03, -1.338e-02, -5.615e-02, -7.276e-02, 9.564e-02, 2.020e-02, -4.129e-02, -7.555e-02, -1.745e-01)); + r += mul(s2_1, M4(5.225e-02, -4.729e-02, 1.293e-02, -3.269e-02, 1.056e-01, -7.550e-02, 4.480e-02, -1.898e-02, -6.565e-02, 7.022e-02, -7.420e-02, -2.915e-02, -4.022e-02, -1.859e-01, -3.307e-02, -6.515e-02)); + r += mul(s2_2, M4(7.045e-04, 3.107e-03, 7.490e-02, -1.396e-02, -1.606e-02, -7.554e-02, 7.387e-02, 8.452e-02, 9.357e-02, -3.828e-02, -4.244e-02, 8.902e-02, 1.833e-03, -5.397e-02, -8.971e-02, 1.277e-01)); + r += mul(s2_3, M4(1.095e-02, 1.951e-01, 2.717e-02, -1.180e-02, 1.469e-02, -6.277e-02, 4.388e-02, -2.989e-02, -6.168e-02, -1.791e-01, 5.965e-02, -2.100e-02, -3.944e-02, 4.708e-02, -5.720e-02, 9.102e-02)); + r += mul(s2_4, M4(7.482e-02, 7.287e-02, 1.403e-02, -9.716e-03, 7.961e-02, -1.097e-01, -3.964e-02, 1.354e-01, 3.683e-02, 1.352e-01, 1.112e-01, 1.081e-01, -4.575e-02, -1.005e-01, 6.648e-02, 6.886e-02)); + r += mul(s2_5, M4(-7.712e-02, -7.929e-02, 3.142e-02, 4.174e-02, -7.125e-04, 6.194e-02, -5.649e-02, 3.229e-02, -1.864e-02, 6.764e-03, 6.032e-02, 2.846e-02, 1.494e-01, -8.652e-03, -1.685e-02, -4.379e-03)); + r += mul(s2_6, M4(6.293e-02, 1.324e-01, 9.080e-02, -1.523e-01, 7.835e-02, 1.507e-01, -3.016e-02, 2.567e-02, -6.138e-02, -7.353e-02, 3.133e-02, 3.352e-02, -2.064e-02, 9.068e-02, -8.710e-02, -7.440e-02)); + r += mul(s2_7, M4(2.154e-02, 8.069e-02, -1.166e-02, 5.221e-02, 1.772e-01, -3.329e-03, 5.671e-02, -5.385e-02, 4.746e-02, 1.224e-01, 9.627e-02, -5.288e-02, 2.469e-02, 1.710e-01, -1.491e-02, 1.499e-01)); + r += mul(s2_8, M4(-6.704e-04, 1.070e-01, 2.679e-02, -5.011e-02, 1.453e-01, 7.252e-02, -1.393e-01, -1.075e-01, -4.456e-04, 2.186e-02, -4.725e-02, -1.362e-01, 1.527e-02, 2.724e-02, 2.545e-02, 8.717e-02)); + r += mul(s3_0, M4(3.017e-01, -1.501e-01, -1.961e-01, -7.417e-02, 1.654e-02, -1.148e-01, -6.167e-02, 7.964e-02, 9.864e-02, 9.110e-02, 5.213e-02, -4.144e-02, 1.049e-01, 1.637e-01, 8.912e-02, -1.214e-02)); + r += mul(s3_1, M4(-3.045e-02, -2.177e-02, -3.691e-02, 4.217e-01, 2.646e-02, -9.921e-02, -2.771e-02, -3.207e-02, 6.110e-02, 1.510e-02, -1.159e-01, -3.572e-02, -6.402e-02, -1.384e-01, -6.026e-02, -3.557e-01)); + r += mul(s3_2, M4(1.718e-02, -1.570e-01, 3.399e-01, -3.092e-01, 2.826e-02, 2.188e-02, 2.107e-02, -4.435e-02, 1.802e-01, -1.031e-01, -7.824e-03, 1.364e-02, -1.114e-02, -2.933e-01, 1.581e-01, -1.537e-01)); + r += mul(s3_3, M4(2.864e-01, 1.998e-01, -2.899e-01, -1.224e-01, 2.005e-02, -1.923e-02, -1.397e-02, 1.772e-01, -5.151e-02, -2.643e-02, 2.733e-02, -6.762e-02, -2.189e-02, 8.119e-02, -5.560e-02, -2.332e-01)); + r += mul(s3_4, M4(-1.826e-01, -1.490e-01, -2.736e-01, -4.559e-02, 1.390e-01, 6.365e-03, 1.035e-01, 9.957e-02, 1.353e-01, -5.694e-02, 5.557e-02, -9.781e-03, 1.258e-01, -5.048e-02, -3.724e-01, -2.814e-01)); + r += mul(s3_5, M4(1.173e-01, -9.484e-02, -8.183e-02, 1.112e-01, -8.685e-02, 2.307e-01, 4.268e-02, 7.449e-02, 5.437e-03, -2.596e-02, 6.978e-02, 9.838e-02, -6.126e-02, -2.213e-01, 2.726e-02, -1.269e-01)); + r += mul(s3_6, M4(-2.323e-02, -3.830e-02, 1.485e-01, -1.917e-01, 3.082e-02, 1.853e-02, -6.795e-02, 7.886e-02, 9.713e-03, 1.821e-01, 5.631e-02, 9.517e-02, -1.825e-01, -1.390e-01, 1.019e-01, 1.430e-01)); + r += mul(s3_7, M4(1.461e-02, -1.586e-01, -2.037e-01, -6.212e-02, -2.341e-01, 4.101e-02, -4.673e-02, -5.431e-02, -1.974e-01, -5.334e-02, 1.144e-02, 1.407e-03, -3.401e-02, -9.971e-02, 7.023e-02, 1.888e-01)); + r += mul(s3_8, M4(-9.911e-03, 5.079e-02, 1.603e-03, 1.441e-01, -1.524e-01, 2.441e-01, 3.075e-02, -7.364e-02, 6.665e-03, 5.184e-02, -3.165e-02, -1.421e-01, -1.619e-01, 6.534e-03, -1.063e-01, -2.173e-02)); + r += mul(s4_0, M4(1.057e-01, 9.868e-02, 2.256e-02, -3.395e-02, -3.246e-03, 1.111e-01, -3.631e-02, 1.443e-02, -1.252e-01, 3.224e-02, 3.818e-02, 1.087e-02, -2.653e-02, 1.160e-01, 6.845e-03, 1.214e-01)); + r += mul(s4_1, M4(3.058e-02, -6.265e-03, 1.794e-01, -8.032e-02, -2.890e-02, 8.468e-02, 1.151e-01, 1.418e-02, -4.156e-02, 5.453e-02, 1.970e-01, 5.255e-02, 1.206e-01, -4.842e-02, -1.200e-01, 5.315e-02)); + r += mul(s4_2, M4(1.562e-01, -8.529e-02, -1.301e-01, -6.048e-02, -1.460e-01, 1.099e-01, -2.493e-02, -1.052e-01, 3.668e-02, -4.395e-02, 2.758e-02, 9.260e-02, -6.341e-03, 1.488e-01, 1.854e-02, -1.228e-01)); + r += mul(s4_3, M4(7.929e-02, -9.089e-02, -1.114e-01, -9.822e-02, -1.339e-03, 4.170e-02, -3.721e-02, 1.412e-02, -1.804e-01, -2.298e-03, -8.089e-02, 5.274e-02, -6.457e-03, -2.378e-01, -1.845e-02, -1.076e-01)); + r += mul(s4_4, M4(-1.244e-02, 1.377e-01, -3.954e-02, -1.343e-01, 1.463e-03, -7.157e-03, 1.271e-02, -3.069e-02, -1.434e-01, 7.176e-02, 1.542e-01, -1.758e-02, -4.979e-02, -3.072e-02, -1.705e-02, -4.326e-02)); + r += mul(s4_5, M4(1.421e-01, -7.427e-02, -4.890e-02, 1.688e-02, 9.534e-02, -2.860e-02, -5.040e-02, -5.590e-02, -1.669e-01, 1.852e-02, 8.911e-02, -1.499e-03, 9.191e-02, -7.256e-02, -5.635e-02, -1.770e-01)); + r += mul(s4_6, M4(9.657e-02, 1.743e-01, -6.738e-03, 9.367e-02, 5.639e-02, -1.266e-01, -5.179e-02, -1.271e-01, 1.155e-01, 9.245e-02, 8.212e-02, -8.191e-02, 3.643e-02, -1.235e-01, -5.844e-03, -1.685e-01)); + r += mul(s4_7, M4(-6.505e-02, -1.373e-01, -7.947e-03, -4.844e-02, 1.172e-01, -5.261e-02, -3.373e-02, 2.592e-02, 1.092e-01, 5.494e-02, 5.989e-02, 1.640e-02, -1.102e-01, -1.626e-02, -2.203e-01, 2.464e-02)); + r += mul(s4_8, M4(-1.233e-01, 2.385e-02, -1.691e-03, -1.214e-01, 7.522e-02, -1.268e-01, 4.043e-02, 2.823e-02, 3.916e-02, 5.684e-02, -3.064e-02, -5.190e-02, -3.799e-02, 5.107e-02, -1.892e-01, -4.348e-02)); + r += mul(s5_0, M4(-5.303e-02, 5.702e-02, -8.550e-02, 7.232e-02, -7.413e-01, 4.604e-01, -4.028e-02, 3.394e-01, 1.833e-01, -1.569e-01, -1.436e-01, -3.062e-02, -1.673e-01, 8.320e-02, 4.586e-02, -7.652e-03)); + r += mul(s5_1, M4(-8.396e-02, 7.796e-02, -6.078e-02, 6.849e-02, -1.824e-01, 3.107e-01, 1.817e-02, -1.860e-01, 5.479e-02, -6.675e-02, 1.574e-02, 2.615e-02, -5.817e-02, -7.982e-02, 1.045e-01, -1.335e-01)); + r += mul(s5_2, M4(5.750e-02, -9.499e-02, -1.621e-01, 4.559e-02, -2.783e-01, -1.867e-01, 3.312e-02, 1.404e-01, 1.107e-01, 1.630e-01, -1.072e-01, 1.740e-01, -1.165e-01, 8.215e-02, 2.852e-01, -1.126e-01)); + r += mul(s5_3, M4(-1.659e-02, -7.775e-02, 5.727e-02, -1.463e-01, 4.364e-02, -3.235e-02, 2.315e-01, -2.474e-01, 1.484e-01, -1.107e-01, 3.104e-03, -1.521e-01, 6.964e-02, -2.303e-02, -6.717e-02, 1.543e-01)); + r += mul(s5_4, M4(-1.395e-01, -2.826e-02, -4.643e-02, -1.125e-01, 3.335e-01, 5.176e-01, 2.013e-01, 3.713e-01, 8.691e-02, -6.559e-02, -1.357e-01, -4.651e-02, 5.091e-02, -2.091e-01, -1.030e-01, -1.264e-01)); + r += mul(s5_5, M4(-1.997e-01, -1.546e-01, 1.519e-01, 7.314e-02, 4.439e-01, 2.572e-01, 2.348e-02, -5.472e-02, 1.685e-01, -8.481e-02, 3.522e-03, 5.953e-02, -5.739e-03, -2.416e-01, -1.984e-02, -8.440e-02)); + r += mul(s5_6, M4(-1.437e-01, -1.509e-02, -1.688e-02, -4.559e-02, 1.703e-01, 8.404e-02, -1.447e-01, 2.836e-01, 6.791e-02, -4.945e-02, 1.353e-02, 9.114e-02, -2.826e-01, 1.348e-01, 1.145e-02, 1.919e-01)); + r += mul(s5_7, M4(5.095e-02, 1.377e-01, -5.523e-02, 1.399e-02, -4.539e-01, 6.555e-02, 2.816e-01, -7.605e-02, -3.078e-02, -3.283e-02, -6.590e-02, 8.787e-02, 6.161e-03, 4.405e-01, -4.672e-02, 7.676e-02)); + r += mul(s5_8, M4(-1.126e-01, 2.139e-01, 1.042e-02, 8.322e-02, -1.688e-01, -1.951e-01, -1.810e-01, -5.828e-02, 3.061e-03, 8.707e-02, -8.261e-02, 9.187e-02, -2.217e-01, -1.355e-01, -5.980e-02, 8.894e-02)); + r += mul(s6_0, M4(3.375e-02, -6.837e-03, 8.504e-03, 7.628e-02, -2.573e-02, 7.264e-02, 1.587e-01, 1.557e-02, -1.811e-01, -1.192e-01, 1.897e-01, 2.055e-01, -3.040e-02, -1.131e-03, 8.485e-02, 1.370e-01)); + r += mul(s6_1, M4(4.436e-03, 1.918e-01, -5.534e-02, 1.431e-01, -2.456e-01, 6.074e-02, 9.280e-02, -2.043e-02, 2.538e-01, -3.557e-01, -1.565e-01, 3.277e-01, -6.989e-02, -8.344e-02, 4.863e-01, 1.682e-01)); + r += mul(s6_2, M4(9.147e-02, 1.444e-01, 4.041e-02, 9.281e-02, -4.971e-02, -6.443e-02, -9.659e-02, 9.822e-02, -4.897e-01, 1.339e-01, 1.057e-01, -8.598e-02, 7.949e-02, 1.796e-01, 1.406e-01, -1.317e-01)); + r += mul(s6_3, M4(-3.108e-02, 1.187e-01, -1.405e-01, -2.096e-02, -1.240e-02, 2.296e-02, -7.784e-02, 1.341e-02, -1.308e-02, 1.270e-01, -2.542e-02, -5.869e-02, -4.655e-02, 6.312e-02, -6.959e-02, -2.146e-02)); + r += mul(s6_4, M4(-6.897e-02, -1.439e-01, 1.375e-02, -5.901e-02, 8.027e-02, -9.178e-02, -1.270e-01, -3.970e-02, 3.945e-02, -1.408e-01, -6.189e-01, -5.693e-02, -2.586e-01, -7.398e-02, 3.017e-01, 6.918e-02)); + r += mul(s6_5, M4(2.303e-02, 6.761e-02, -2.823e-02, -2.381e-01, 6.317e-02, -2.130e-01, 9.502e-02, 1.910e-01, -3.220e-01, -1.783e-01, -8.975e-02, 2.929e-01, -2.166e-01, -3.300e-04, -8.396e-02, 4.748e-02)); + r += mul(s6_6, M4(8.997e-02, 9.390e-02, 3.089e-02, 6.613e-02, -7.310e-02, -6.031e-02, 4.047e-03, 3.567e-02, -6.620e-02, -4.536e-02, 4.968e-02, 1.109e-01, 7.025e-02, 1.981e-02, 1.885e-01, -1.674e-01)); + r += mul(s6_7, M4(9.632e-02, -1.427e-01, 6.963e-02, 8.605e-03, -1.484e-01, 2.370e-02, -2.559e-02, -9.231e-02, 1.958e-01, 2.344e-01, -3.780e-02, 5.337e-02, -8.072e-03, -2.691e-01, 1.615e-01, 6.801e-03)); + r += mul(s6_8, M4(3.382e-02, 3.745e-02, -1.950e-01, -3.597e-02, -9.278e-03, -5.420e-02, -5.932e-02, -7.582e-02, -9.291e-02, 2.071e-02, 6.282e-02, -2.184e-01, 7.254e-02, -8.537e-02, 1.136e-01, 3.059e-02)); + r += mul(s7_0, M4(5.663e-02, -1.343e-02, 5.780e-02, -8.611e-02, 6.815e-03, -5.406e-02, 3.681e-02, 1.104e-01, -3.168e-02, -8.807e-02, 1.690e-01, 5.809e-02, -4.456e-02, -1.519e-02, 2.311e-02, 5.913e-02)); + r += mul(s7_1, M4(5.982e-02, -1.091e-01, 5.650e-02, 6.565e-02, -9.883e-02, 2.926e-02, -1.342e-01, -1.565e-01, 7.153e-02, 1.869e-01, 8.656e-02, -3.569e-02, -5.679e-02, -6.900e-02, -1.143e-02, 4.873e-02)); + r += mul(s7_2, M4(-4.890e-02, 2.329e-02, 4.757e-02, -4.350e-02, 1.223e-01, -9.936e-02, -1.299e-01, 1.133e-01, 4.006e-02, -1.584e-01, -2.698e-02, -4.945e-02, 6.293e-02, 7.017e-02, -1.704e-01, -1.799e-01)); + r += mul(s7_3, M4(2.485e-02, -5.407e-02, -8.527e-02, -1.510e-01, 1.643e-01, -5.463e-02, -6.835e-03, 5.878e-02, -5.531e-02, -2.257e-03, -5.767e-02, -6.246e-02, 1.384e-01, 8.035e-02, -6.237e-03, 5.670e-02)); + r += mul(s7_4, M4(8.087e-02, -7.150e-02, -5.149e-02, 1.542e-01, -1.815e-01, 1.715e-02, -1.012e-01, -2.905e-03, 2.317e-02, 1.235e-01, -1.332e-02, -2.943e-02, 8.026e-02, 1.686e-01, 2.589e-02, 1.300e-01)); + r += mul(s7_5, M4(-1.076e-01, 5.289e-03, 1.478e-02, -5.922e-02, 6.083e-02, 1.112e-01, 5.104e-02, -2.085e-02, -8.144e-02, 1.094e-01, 2.394e-02, -2.996e-02, -3.953e-02, 6.552e-02, -1.242e-01, 3.664e-02)); + r += mul(s7_6, M4(-2.648e-02, 3.515e-02, 1.103e-01, 7.541e-02, 9.822e-02, 1.516e-01, 6.112e-02, -9.476e-02, 5.026e-02, -4.293e-02, -7.005e-02, -8.219e-02, -1.015e-01, -8.383e-02, -1.067e-01, -2.989e-03)); + r += mul(s7_7, M4(-9.236e-02, -5.836e-02, -2.822e-02, 1.138e-01, 1.048e-01, 9.065e-02, -5.784e-02, -1.620e-01, -1.461e-01, 1.087e-01, 2.606e-02, 3.185e-02, 1.948e-01, -2.235e-02, -6.895e-03, -4.220e-02)); + r += mul(s7_8, M4(6.419e-02, 2.451e-02, -7.139e-02, -7.798e-02, 1.275e-01, 3.751e-02, 8.619e-02, 4.441e-02, -1.117e-01, -1.395e-02, 7.185e-02, -1.220e-02, 2.262e-02, -4.089e-02, 8.666e-02, -2.434e-02)); + r += V4(-7.995e-03, -1.224e-02, -1.444e-02, -2.582e-02); + return r; +} + +V4 f2(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(5.957e-02, -3.049e-03, 2.515e-03, 7.423e-03, 9.982e-02, 1.812e-01, 1.187e-01, 2.259e-01, 1.165e-01, -1.347e-02, -3.428e-02, 8.958e-02, -1.029e-01, 2.937e-02, 2.708e-02, -1.298e-01)); + r += mul(s0_1, M4(-1.847e-01, -5.502e-02, -1.051e-01, -7.236e-02, -1.206e-01, 1.803e-01, 1.486e-01, -7.366e-02, 3.302e-02, -7.880e-02, 5.818e-02, 1.179e-01, 1.430e-01, 1.488e-01, -5.780e-02, 2.994e-02)); + r += mul(s0_2, M4(1.800e-01, -1.022e-01, -1.171e-03, -6.833e-03, -1.753e-02, -1.434e-01, 1.970e-02, -3.685e-02, 4.655e-02, 1.126e-01, -2.728e-02, 7.717e-02, -2.154e-02, 4.008e-02, 1.455e-01, 4.344e-02)); + r += mul(s0_3, M4(-3.641e-02, 5.033e-03, -1.325e-02, -1.015e-01, 8.481e-02, 2.554e-01, -1.070e-01, 1.024e-01, 1.923e-02, -1.010e-03, -4.799e-02, 1.288e-01, -7.996e-02, -1.427e-01, -2.689e-01, 5.776e-02)); + r += mul(s0_4, M4(1.833e-01, -4.067e-03, 7.679e-03, 5.957e-02, -8.062e-02, -2.109e-02, 8.797e-02, -7.552e-02, 1.492e-01, -1.806e-01, -4.736e-02, 1.260e-01, 9.266e-02, 5.566e-02, 7.952e-02, -1.757e-01)); + r += mul(s0_5, M4(-7.300e-02, 7.447e-02, 5.468e-02, 3.852e-02, -4.063e-02, -7.468e-03, -1.014e-01, 3.237e-02, 1.435e-01, -8.569e-02, 3.054e-02, -4.666e-02, 1.150e-01, 6.880e-03, 7.433e-02, 1.294e-01)); + r += mul(s0_6, M4(-7.807e-02, -3.489e-02, 9.954e-02, -2.053e-02, 1.920e-02, -6.982e-02, -7.709e-02, 4.164e-02, -2.460e-02, 4.299e-02, -2.332e-02, 6.819e-02, -8.945e-02, -5.789e-02, -9.769e-02, -9.254e-03)); + r += mul(s0_7, M4(-3.709e-02, 1.226e-03, -1.219e-01, 4.918e-03, -7.907e-02, -4.814e-02, 9.349e-02, -8.402e-02, -2.609e-02, -4.457e-02, 8.509e-03, 7.508e-02, 8.673e-02, -9.438e-02, -9.328e-02, 5.861e-03)); + r += mul(s0_8, M4(3.006e-02, 1.393e-02, 7.983e-02, 8.630e-02, 1.689e-02, -8.399e-02, -1.049e-01, -5.334e-02, 1.484e-01, -7.935e-02, 1.386e-01, 4.845e-02, -5.598e-02, -2.523e-02, 8.228e-02, -8.778e-02)); + r += mul(s1_0, M4(-2.164e-01, -9.404e-02, 1.043e-01, 2.007e-01, 8.723e-02, 2.391e-01, 9.450e-02, 7.558e-02, -4.033e-02, 3.938e-02, -1.114e-01, 1.119e-02, 5.581e-02, -7.281e-03, 1.876e-02, -1.019e-01)); + r += mul(s1_1, M4(-9.791e-02, -7.794e-02, 2.162e-02, -3.561e-02, -5.282e-02, -1.422e-02, 8.914e-02, -2.121e-02, -8.363e-02, 2.216e-01, 4.317e-02, 1.991e-01, 1.373e-01, 8.835e-02, -1.499e-02, 6.239e-02)); + r += mul(s1_2, M4(4.177e-01, -2.990e-01, 5.412e-03, 7.816e-02, -2.068e-01, -1.488e-01, -3.840e-02, -4.823e-03, -2.806e-02, 2.133e-01, 2.451e-03, 1.602e-02, -2.125e-01, -1.082e-01, -1.455e-02, 2.847e-03)); + r += mul(s1_3, M4(2.299e-02, -8.708e-02, -3.546e-02, 1.070e-01, 8.130e-02, 1.195e-01, -7.525e-02, 1.726e-01, -2.942e-02, 2.129e-01, -9.805e-02, 5.453e-02, -4.581e-02, 1.577e-02, -8.092e-02, 1.111e-01)); + r += mul(s1_4, M4(4.460e-03, -1.676e-02, -9.924e-02, -1.566e-02, -1.788e-01, 1.211e-02, 5.756e-02, -9.596e-02, 2.085e-01, 5.858e-02, -5.055e-02, 2.971e-02, 2.450e-01, -1.739e-01, 2.155e-01, -1.562e-01)); + r += mul(s1_5, M4(2.001e-01, 7.301e-02, 2.093e-01, 1.053e-01, -1.331e-02, -3.578e-02, -7.708e-02, 3.420e-02, -8.389e-02, 4.010e-02, -2.524e-04, -3.785e-02, 1.020e-01, -1.071e-01, 3.095e-03, 1.411e-01)); + r += mul(s1_6, M4(7.020e-02, -1.008e-03, 1.983e-02, -6.337e-02, 5.443e-02, 2.197e-02, -1.557e-02, 2.523e-02, -2.901e-02, 9.682e-02, -7.168e-02, -4.479e-02, -5.737e-02, -7.622e-02, -1.268e-01, 5.257e-02)); + r += mul(s1_7, M4(-8.855e-02, -8.280e-03, -1.156e-01, -3.358e-02, -1.597e-01, -1.030e-01, 1.370e-02, 4.266e-02, -8.264e-02, 1.193e-01, -9.311e-02, -2.361e-02, 6.552e-03, -2.326e-02, -1.029e-01, 2.257e-02)); + r += mul(s1_8, M4(8.102e-02, 1.553e-01, -1.178e-01, 6.726e-02, 6.600e-02, -1.267e-02, -4.002e-03, -4.638e-02, 5.313e-02, 8.323e-03, 6.413e-02, 9.978e-02, 1.108e-01, -9.390e-02, -1.744e-02, -8.957e-02)); + r += mul(s2_0, M4(4.738e-02, -9.025e-02, -1.875e-02, 1.161e-01, -1.321e-02, 1.354e-01, 1.405e-02, 1.416e-01, -1.197e-01, -1.130e-02, 5.646e-03, 1.371e-02, 1.499e-01, -1.998e-01, 6.524e-02, -1.900e-01)); + r += mul(s2_1, M4(-3.611e-02, 1.329e-01, -6.656e-03, -1.775e-01, 1.026e-02, 9.408e-02, -5.093e-02, 1.961e-02, -2.624e-01, 2.131e-02, 4.280e-02, -1.226e-01, 1.730e-01, 1.343e-01, -1.671e-01, -6.461e-03)); + r += mul(s2_2, M4(2.938e-02, -1.179e-01, 7.802e-02, -1.769e-02, -5.427e-02, -3.815e-02, 2.688e-02, 3.222e-02, 1.737e-01, 5.565e-02, -8.783e-02, 5.011e-02, 2.056e-01, 3.965e-02, -7.423e-02, 7.593e-02)); + r += mul(s2_3, M4(-4.279e-02, 1.892e-02, -1.629e-01, 8.270e-02, 5.401e-02, -6.041e-02, -9.506e-02, 2.218e-01, -5.125e-02, 1.004e-01, -3.841e-02, 9.423e-02, -6.710e-02, 8.415e-02, 1.696e-02, -1.256e-01)); + r += mul(s2_4, M4(-3.843e-02, 2.114e-02, -1.109e-01, -8.447e-02, -5.302e-02, -2.032e-01, 1.450e-01, 3.852e-02, -1.481e-01, -5.735e-02, 2.225e-01, 9.101e-03, -1.746e-01, 8.228e-02, 4.341e-02, 1.278e-01)); + r += mul(s2_5, M4(-1.138e-02, 3.630e-02, 1.412e-01, 3.819e-02, -9.534e-02, 1.548e-01, 1.390e-01, -3.959e-02, -4.372e-02, 1.395e-01, 7.127e-02, 2.372e-02, -9.610e-03, -9.713e-02, -3.195e-02, 2.132e-02)); + r += mul(s2_6, M4(1.045e-01, 8.938e-02, 9.943e-02, 1.064e-02, -1.489e-02, -6.177e-02, -7.106e-02, -5.035e-02, 8.367e-02, -5.951e-02, 1.692e-02, -1.152e-02, -8.637e-03, 7.272e-02, -2.973e-02, -9.375e-02)); + r += mul(s2_7, M4(-1.147e-01, 7.269e-02, -1.572e-02, 1.538e-01, -1.678e-01, 1.536e-01, 7.278e-02, 6.957e-02, -2.188e-02, 9.501e-02, -3.409e-02, 1.484e-01, -7.706e-02, -5.266e-02, 1.234e-01, 1.243e-02)); + r += mul(s2_8, M4(1.371e-01, -6.741e-02, -1.627e-01, -3.880e-02, -4.867e-02, 1.805e-01, 1.315e-01, 9.806e-02, -2.459e-02, -1.065e-02, -6.366e-02, -7.442e-02, -3.105e-02, 3.967e-02, 9.181e-02, 3.679e-02)); + r += mul(s3_0, M4(-4.685e-02, 2.092e-01, -3.243e-02, 1.201e-01, -9.950e-02, 1.814e-01, 2.770e-02, -1.061e-01, 6.173e-02, -3.614e-02, -3.884e-03, -1.754e-02, -6.866e-02, 1.386e-02, 4.887e-02, -2.357e-02)); + r += mul(s3_1, M4(-2.743e-01, -9.328e-02, 3.926e-01, -2.396e-01, -5.040e-02, 5.586e-02, -3.486e-02, -7.192e-02, 1.664e-02, 2.172e-02, 3.996e-02, -1.952e-01, 1.958e-01, 1.802e-02, -1.209e-01, 2.013e-02)); + r += mul(s3_2, M4(-7.065e-02, -2.231e-01, -1.740e-01, -1.036e-01, -4.724e-02, 1.182e-02, 9.885e-02, 1.422e-02, 1.404e-01, -7.340e-02, -1.123e-04, -1.421e-01, 2.634e-01, -7.101e-02, -2.584e-02, 1.234e-01)); + r += mul(s3_3, M4(1.386e-01, -1.280e-01, -3.779e-01, -3.310e-01, 7.156e-02, -1.150e-01, 1.079e-02, 7.545e-02, -1.125e-02, -1.691e-02, -1.538e-01, -3.010e-02, -8.678e-02, 2.458e-02, 5.418e-02, -7.666e-02)); + r += mul(s3_4, M4(1.449e-01, 9.721e-02, -2.594e-01, 2.108e-01, 2.351e-01, -3.130e-01, -8.903e-02, -4.188e-02, 2.007e-01, -2.197e-01, 1.613e-01, -3.164e-01, -3.532e-01, 6.255e-02, 2.272e-01, 7.759e-03)); + r += mul(s3_5, M4(-2.253e-02, -7.612e-02, -9.930e-02, -1.385e-01, -1.933e-01, -1.089e-01, -1.863e-02, 3.789e-02, 2.229e-02, 6.735e-02, 3.127e-01, -1.855e-02, -1.775e-01, -2.837e-02, 1.607e-01, 7.195e-02)); + r += mul(s3_6, M4(1.558e-01, 2.682e-02, 1.504e-01, 9.806e-02, 6.693e-02, 3.296e-02, -1.118e-01, -3.649e-02, 2.780e-02, -5.672e-02, -3.103e-02, 1.411e-01, 1.649e-02, 9.769e-02, 1.311e-01, -3.010e-02)); + r += mul(s3_7, M4(2.929e-02, 1.012e-01, -5.385e-02, 3.901e-02, 3.679e-02, 8.885e-03, -2.742e-01, 5.118e-02, 2.344e-03, 1.122e-03, -6.791e-02, -5.733e-02, 3.292e-01, 6.902e-02, -5.233e-02, 8.570e-02)); + r += mul(s3_8, M4(-7.097e-02, 1.848e-02, -3.787e-02, 4.900e-03, 6.421e-02, 7.465e-02, -1.535e-01, 1.406e-02, -1.187e-01, 2.577e-03, 9.254e-02, 5.308e-02, 2.464e-02, -7.548e-02, -1.966e-01, -1.053e-01)); + r += mul(s4_0, M4(3.893e-02, -4.947e-02, -7.893e-03, 6.037e-03, 6.807e-02, -8.136e-03, 7.377e-02, 5.098e-02, -5.985e-02, -3.314e-02, -1.090e-01, -1.603e-01, -6.519e-02, 1.479e-02, -4.851e-02, -6.077e-02)); + r += mul(s4_1, M4(1.111e-01, 1.671e-01, -1.255e-01, -3.826e-03, -6.154e-03, 1.481e-01, -2.236e-02, 2.436e-04, -1.970e-02, -2.319e-01, -3.602e-02, 7.956e-02, -1.163e-01, 1.890e-01, -5.660e-02, 3.174e-02)); + r += mul(s4_2, M4(1.580e-02, 4.120e-02, 6.110e-02, -1.322e-01, 3.182e-03, 3.036e-02, 7.864e-02, -1.343e-02, -1.131e-01, -2.483e-02, 3.549e-03, 1.102e-01, 1.428e-01, 5.457e-03, 1.126e-02, 5.344e-02)); + r += mul(s4_3, M4(-1.522e-01, 1.218e-02, 3.848e-04, -1.357e-01, -7.722e-02, -6.365e-02, -1.327e-02, 1.026e-01, -1.313e-01, -8.871e-02, -4.374e-03, -2.673e-02, -2.268e-02, 6.203e-02, 2.476e-02, -7.891e-02)); + r += mul(s4_4, M4(1.277e-01, 2.146e-01, -1.622e-01, 3.286e-02, -1.704e-01, 9.845e-03, 2.795e-02, -7.210e-02, -3.702e-01, 5.903e-02, -2.025e-01, 2.572e-02, -2.745e-02, -2.299e-02, 3.136e-02, 9.026e-02)); + r += mul(s4_5, M4(5.797e-03, -3.580e-02, -4.552e-03, -1.105e-01, 8.373e-02, -4.397e-02, -5.189e-03, -6.894e-02, -2.798e-02, -5.324e-02, -5.876e-02, 9.981e-03, 1.140e-01, -7.434e-02, 7.077e-02, 2.092e-02)); + r += mul(s4_6, M4(1.196e-02, -8.666e-02, 1.137e-01, 4.510e-02, 4.648e-02, -1.031e-01, -7.070e-02, 1.777e-02, -5.807e-02, 6.463e-02, 3.425e-02, 5.167e-02, 1.442e-02, -4.559e-02, 7.944e-03, -9.425e-02)); + r += mul(s4_7, M4(-5.318e-02, 5.288e-02, 1.233e-01, -1.647e-02, 5.040e-02, 3.649e-03, -2.084e-02, -3.695e-02, 3.423e-02, 1.215e-01, 7.316e-02, 4.451e-02, -1.786e-01, 9.964e-02, 7.429e-02, -2.555e-02)); + r += mul(s4_8, M4(-1.145e-02, -4.109e-02, -1.333e-01, 9.021e-02, 8.219e-02, 4.919e-02, -1.678e-02, 6.022e-02, 3.826e-04, -9.322e-02, 5.648e-02, -4.974e-02, -5.503e-02, -2.237e-02, 2.452e-02, 1.236e-01)); + r += mul(s5_0, M4(-3.120e-02, -2.506e-02, 8.325e-03, 4.761e-02, -4.672e-01, -2.430e-01, 5.374e-02, -1.592e-01, 1.392e-01, 9.341e-02, -1.893e-01, 8.724e-03, -5.083e-02, -7.755e-02, 3.613e-02, -1.841e-01)); + r += mul(s5_1, M4(4.977e-02, 1.632e-01, -9.581e-02, 3.688e-01, 2.764e-01, 1.806e-01, -1.471e-01, -9.434e-02, -1.930e-01, -1.048e-02, 1.817e-02, 1.018e-01, 4.963e-02, -2.904e-02, -1.284e-01, -8.687e-02)); + r += mul(s5_2, M4(-2.475e-01, 1.064e-01, -2.106e-02, -1.520e-02, -5.434e-02, -9.044e-02, -2.736e-03, 1.030e-01, -2.364e-01, 2.136e-01, 1.391e-01, -1.069e-01, 1.714e-01, -1.077e-02, -9.362e-02, 7.189e-02)); + r += mul(s5_3, M4(-1.841e-01, -3.266e-02, 9.362e-02, -3.814e-02, -5.682e-01, 3.984e-01, 4.681e-01, 2.657e-01, -2.097e-02, -9.244e-03, 9.430e-03, -2.963e-02, -9.612e-02, 7.458e-02, 4.870e-02, -5.087e-02)); + r += mul(s5_4, M4(-1.757e-01, 1.198e-01, -1.528e-01, 3.579e-01, 6.719e-01, -5.689e-01, -1.907e-01, -2.981e-01, -3.525e-02, 8.262e-02, 2.617e-03, -7.026e-02, 3.087e-01, -2.135e-02, -1.579e-02, 8.239e-02)); + r += mul(s5_5, M4(1.460e-01, -9.163e-02, -6.629e-02, 2.753e-02, -1.082e-01, 2.592e-02, -7.397e-02, -1.469e-01, 9.262e-02, -1.249e-02, 5.569e-02, 9.788e-02, 2.121e-02, -1.666e-01, -1.258e-01, 1.772e-01)); + r += mul(s5_6, M4(6.194e-02, -3.392e-02, 5.301e-02, -7.029e-02, 1.058e-01, 2.590e-02, 3.245e-01, 2.971e-01, 8.965e-02, 1.275e-01, -5.641e-03, -4.784e-02, -7.069e-02, 2.989e-02, -1.026e-01, -1.121e-01)); + r += mul(s5_7, M4(-4.134e-02, 9.351e-02, -2.658e-02, 1.898e-02, -1.142e-01, -9.247e-02, -1.610e-01, -8.344e-02, -1.560e-01, -7.492e-02, 5.762e-02, -2.066e-02, -1.029e-01, 1.144e-01, 1.237e-01, 1.510e-02)); + r += mul(s5_8, M4(1.234e-01, 1.372e-02, -3.129e-02, 1.210e-02, -1.381e-01, 7.946e-02, 4.540e-02, -4.533e-02, -8.761e-03, -4.579e-02, -4.991e-02, -1.097e-01, -3.653e-01, -1.008e-01, 9.064e-02, -1.664e-02)); + r += mul(s6_0, M4(1.035e-01, -5.898e-02, 7.442e-02, 4.579e-02, 9.165e-02, -8.487e-02, -7.653e-02, -1.472e-01, 1.458e-01, -2.610e-01, 5.489e-02, -3.148e-02, -1.961e-02, -1.283e-01, -1.550e-03, 1.396e-01)); + r += mul(s6_1, M4(3.029e-02, 1.203e-01, 1.137e-01, -4.167e-02, 2.036e-01, 5.974e-02, 9.833e-03, -4.837e-03, 2.107e-02, 5.559e-02, -1.459e-01, 8.987e-02, -2.228e-01, -1.185e-01, -1.612e-01, -1.318e-01)); + r += mul(s6_2, M4(2.158e-01, 1.618e-01, 4.534e-02, 1.148e-01, 7.521e-02, 8.428e-02, -3.577e-02, 8.668e-02, -2.172e-01, 1.231e-01, -3.659e-02, -7.905e-02, -9.192e-02, -2.736e-02, -1.080e-01, -3.183e-02)); + r += mul(s6_3, M4(-5.911e-02, -1.347e-01, 3.753e-02, 5.744e-02, 1.702e-01, 9.262e-02, -7.533e-02, 1.787e-02, 2.806e-02, -6.910e-02, 7.101e-02, -3.144e-02, -6.674e-02, 1.759e-02, 8.950e-02, 1.166e-01)); + r += mul(s6_4, M4(2.470e-01, 4.738e-02, 9.160e-02, 1.635e-02, -1.139e-02, -7.980e-02, -8.763e-02, 2.369e-01, 8.297e-02, -3.180e-01, 1.388e-02, -3.104e-02, 1.348e-02, 2.618e-01, 2.261e-02, -1.885e-01)); + r += mul(s6_5, M4(-7.889e-02, 1.627e-01, 9.866e-03, -2.770e-02, 6.266e-02, -4.376e-02, -6.148e-03, 1.318e-01, 3.748e-02, -1.347e-01, 3.466e-02, -7.621e-02, -4.696e-02, 8.234e-02, 1.539e-01, 4.679e-02)); + r += mul(s6_6, M4(-9.591e-03, -9.131e-02, -2.189e-02, -3.906e-03, -8.384e-02, -1.096e-01, -4.869e-02, 1.044e-01, 6.963e-03, 3.361e-02, -4.759e-03, 7.508e-02, -3.060e-03, -1.384e-01, -3.605e-02, 1.665e-02)); + r += mul(s6_7, M4(1.625e-01, -3.431e-02, -3.472e-02, 6.639e-02, 4.569e-02, 2.451e-02, -1.030e-01, 5.134e-02, 3.258e-01, 9.507e-02, 9.125e-03, 1.037e-01, 1.091e-01, 3.748e-02, 6.382e-02, 2.083e-02)); + r += mul(s6_8, M4(-4.303e-02, -4.050e-02, -1.151e-01, -6.843e-02, 5.202e-02, -3.790e-02, 4.180e-03, -6.684e-02, 1.225e-01, 1.198e-01, 4.950e-02, 7.972e-02, 2.018e-02, 1.512e-01, 1.024e-01, 1.460e-02)); + r += mul(s7_0, M4(-1.173e-01, 1.072e-01, 5.356e-03, 1.385e-01, -6.036e-02, -1.034e-01, -6.001e-02, 6.160e-02, -4.321e-02, 5.623e-02, -1.003e-01, 1.845e-03, -4.557e-02, 2.336e-03, -5.258e-02, 6.187e-02)); + r += mul(s7_1, M4(-1.835e-02, 8.510e-03, 9.641e-02, -6.166e-02, -6.591e-02, 1.562e-02, -1.011e-01, -5.767e-02, -1.791e-01, -4.820e-02, -4.084e-02, 3.447e-02, 7.111e-02, -8.455e-02, 9.572e-02, -2.570e-02)); + r += mul(s7_2, M4(2.063e-04, 7.999e-02, -2.165e-02, 1.236e-02, 1.408e-02, -5.522e-02, -3.566e-02, 8.257e-02, -1.279e-01, 1.305e-01, -1.413e-03, 4.585e-02, 2.789e-03, 1.053e-02, -7.205e-02, -6.562e-02)); + r += mul(s7_3, M4(4.291e-02, -4.951e-02, 8.818e-02, 3.302e-02, 1.800e-02, -7.639e-02, 2.755e-02, -7.894e-02, 5.420e-02, -3.219e-02, -1.015e-01, -5.315e-02, -4.991e-02, 7.107e-02, 1.468e-02, -2.473e-02)); + r += mul(s7_4, M4(1.823e-01, -8.644e-03, 7.152e-02, -2.014e-01, -3.008e-02, 3.164e-02, -2.384e-01, 1.322e-01, -6.781e-02, 5.100e-02, 3.457e-02, 1.042e-02, 4.205e-02, 6.503e-02, -3.424e-02, -4.911e-02)); + r += mul(s7_5, M4(1.248e-01, -2.998e-02, 2.813e-03, -5.579e-02, 8.234e-02, -6.763e-02, -7.895e-02, 2.507e-04, 5.331e-03, -9.873e-02, 1.283e-01, 4.402e-02, 2.722e-02, -6.559e-02, -8.504e-02, 1.554e-02)); + r += mul(s7_6, M4(-8.137e-02, -3.382e-02, -4.983e-03, 1.141e-01, -7.500e-02, -1.591e-01, 7.594e-02, 1.251e-01, 7.075e-02, 4.401e-02, -5.485e-02, -1.526e-02, -1.338e-01, -1.707e-01, -2.600e-02, 2.292e-02)); + r += mul(s7_7, M4(-8.672e-02, -2.362e-02, -7.777e-02, 1.356e-02, -3.393e-02, -7.631e-02, -2.710e-01, -6.589e-02, 1.881e-01, -9.581e-02, 2.370e-02, -8.766e-02, -4.940e-02, 5.028e-02, 2.167e-02, 4.738e-03)); + r += mul(s7_8, M4(4.778e-02, 7.154e-02, 5.355e-02, -2.512e-02, -8.144e-02, 1.947e-02, -1.547e-01, -2.908e-02, -3.783e-02, 3.476e-02, 3.998e-02, 4.067e-02, 1.007e-02, 2.896e-03, -3.280e-02, -2.884e-03)); + r += V4(2.792e-02, 6.402e-03, 2.704e-02, 8.885e-03); + return r; +} + +V4 f3(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(2.150e-02, 2.098e-02, -1.908e-03, 1.370e-01, -1.004e-01, 3.667e-02, 1.652e-01, -1.928e-01, -1.453e-01, -8.522e-02, -1.028e-02, -9.115e-02, -1.022e-01, -1.301e-01, 1.325e-01, -9.540e-02)); + r += mul(s0_1, M4(-4.920e-03, 4.564e-02, -9.749e-02, -7.350e-02, -9.275e-02, -2.181e-01, 5.228e-03, -1.274e-02, -1.396e-01, -1.462e-02, -2.177e-01, -3.610e-01, 9.250e-02, -4.713e-02, 8.113e-02, -1.250e-01)); + r += mul(s0_2, M4(2.999e-02, 1.197e-01, 3.022e-02, 7.073e-02, -3.234e-02, 4.483e-03, 3.886e-02, -5.276e-02, 4.253e-02, -1.674e-01, -7.591e-03, -1.164e-01, -6.967e-02, 6.605e-02, -3.461e-02, 2.936e-02)); + r += mul(s0_3, M4(-3.725e-02, 3.155e-02, -7.687e-02, -2.039e-02, 4.441e-02, 1.862e-02, 1.289e-01, -8.736e-02, -2.970e-02, 2.526e-01, 1.500e-01, -2.748e-01, 1.343e-01, 5.158e-02, 3.829e-02, -1.029e-01)); + r += mul(s0_4, M4(1.480e-01, -1.204e-01, 1.481e-01, 6.791e-02, -2.369e-02, -1.166e-01, -1.001e-01, 2.066e-01, 5.810e-02, 1.231e-01, -2.750e-02, -2.348e-02, -1.851e-01, -1.561e-01, 9.651e-03, 1.222e-01)); + r += mul(s0_5, M4(-2.281e-02, 7.214e-02, 4.872e-02, -3.459e-02, 1.557e-01, -4.078e-02, -5.643e-02, 7.592e-02, 7.703e-02, -1.563e-01, 7.854e-02, -1.026e-01, 8.463e-02, -2.650e-01, 1.179e-01, 5.095e-02)); + r += mul(s0_6, M4(-1.307e-01, 5.779e-02, -5.937e-02, -8.787e-02, -1.897e-01, 4.236e-02, -3.115e-02, 5.699e-02, 9.361e-02, 1.806e-02, -1.096e-01, -1.321e-01, 1.118e-01, -1.057e-01, -6.268e-03, -3.682e-03)); + r += mul(s0_7, M4(-3.039e-03, -3.794e-02, 2.495e-02, -5.958e-02, 3.056e-02, -1.187e-02, 4.943e-02, 1.002e-02, -1.508e-02, 8.286e-02, -1.137e-01, -3.081e-02, -9.305e-02, 2.237e-01, 1.300e-01, 1.462e-01)); + r += mul(s0_8, M4(3.845e-02, -2.379e-02, 7.917e-02, 5.293e-02, -9.989e-02, -8.364e-02, 4.484e-02, -7.819e-02, 1.247e-01, -6.405e-02, -4.323e-02, -9.018e-02, 1.771e-02, 6.845e-02, -3.819e-02, 2.506e-01)); + r += mul(s1_0, M4(1.505e-01, 4.282e-02, 2.325e-01, -1.088e-01, -1.533e-01, 6.644e-02, 1.375e-01, -7.004e-02, 9.644e-02, 9.485e-02, 6.898e-02, -5.298e-03, -4.165e-02, -1.174e-01, -8.163e-02, -4.830e-02)); + r += mul(s1_1, M4(8.243e-03, -1.574e-02, -4.337e-02, -4.904e-02, -6.238e-02, 2.752e-02, -1.450e-01, 1.297e-02, 8.632e-02, 2.109e-01, 2.266e-03, -1.468e-01, 5.894e-02, 7.963e-02, -1.032e-01, -2.958e-02)); + r += mul(s1_2, M4(-4.761e-01, 3.923e-01, -2.083e-01, 1.344e-01, -5.242e-02, -6.285e-03, 3.866e-02, -6.010e-02, 5.071e-02, 5.493e-02, 6.665e-02, 4.845e-03, -2.614e-02, 3.681e-02, -2.129e-01, -2.912e-02)); + r += mul(s1_3, M4(-9.229e-02, -2.160e-01, -3.112e-01, 7.508e-02, -2.224e-01, -1.128e-01, 1.067e-01, 6.648e-02, 6.660e-02, 6.957e-02, 1.109e-01, -5.484e-02, 8.785e-03, -1.616e-01, -9.332e-03, -8.794e-02)); + r += mul(s1_4, M4(1.016e-01, 1.375e-03, -2.052e-02, 1.088e-01, 8.379e-02, 1.776e-01, 6.166e-02, -3.273e-02, -2.966e-03, 1.742e-02, 8.485e-02, 2.937e-02, -1.109e-01, 9.783e-02, -1.222e-01, 6.124e-02)); + r += mul(s1_5, M4(-5.278e-02, -2.068e-01, -1.875e-01, -9.722e-02, 1.369e-01, 1.573e-01, 2.855e-02, 1.431e-01, 1.175e-01, 1.476e-02, 1.504e-01, -1.062e-01, -9.199e-02, 2.577e-02, 6.478e-03, 1.121e-01)); + r += mul(s1_6, M4(2.704e-01, -5.489e-02, 1.746e-01, -1.111e-01, -1.860e-01, -1.403e-01, -5.571e-02, -1.211e-01, 4.785e-02, -7.522e-02, -9.783e-03, 1.015e-01, 4.958e-03, -1.289e-01, -5.302e-02, 5.505e-02)); + r += mul(s1_7, M4(-4.411e-02, -1.045e-01, 4.994e-02, -1.574e-01, 5.788e-02, 2.045e-01, 3.314e-02, -3.551e-02, 7.251e-02, -5.918e-02, -9.556e-03, 4.214e-02, -3.630e-02, 2.468e-01, -2.294e-02, -1.261e-02)); + r += mul(s1_8, M4(-2.821e-01, 5.553e-03, -9.473e-02, -2.821e-01, -1.144e-01, -1.501e-02, -4.085e-02, -6.069e-02, 1.062e-01, -1.199e-01, 5.926e-02, -2.123e-02, -6.757e-02, -1.281e-02, -2.638e-02, 4.982e-02)); + r += mul(s2_0, M4(4.639e-03, -8.981e-02, -3.127e-02, -1.559e-01, -1.868e-01, 5.938e-02, 7.574e-02, -7.216e-02, 1.794e-01, 1.192e-01, -1.298e-02, -4.886e-02, 4.221e-02, -8.491e-02, -1.210e-01, 1.066e-01)); + r += mul(s2_1, M4(-1.867e-01, -1.192e-01, -1.711e-01, 7.593e-02, -7.570e-02, 5.431e-02, 1.509e-01, -8.083e-02, -7.039e-02, 1.170e-01, 1.004e-01, -9.263e-02, 6.978e-02, 5.257e-02, -1.963e-02, 5.092e-02)); + r += mul(s2_2, M4(1.716e-01, 1.621e-02, -1.479e-01, -1.278e-01, 9.007e-02, -4.578e-02, 5.916e-02, -4.273e-02, -1.310e-01, 1.857e-01, -3.085e-02, 6.763e-02, 3.874e-02, 1.704e-01, -9.613e-02, 8.957e-02)); + r += mul(s2_3, M4(1.064e-02, 2.534e-02, -5.788e-03, -4.810e-02, 8.883e-02, 6.142e-02, 3.759e-02, -1.599e-02, -2.281e-01, 4.078e-02, -2.529e-02, -1.290e-03, -3.682e-02, 2.757e-02, 3.746e-02, 6.837e-02)); + r += mul(s2_4, M4(4.689e-02, -1.032e-01, 2.029e-02, -1.496e-02, 3.248e-02, 1.349e-01, -1.425e-02, -4.335e-02, -1.864e-01, 2.204e-01, -1.185e-01, -3.788e-02, 7.017e-03, -2.078e-02, 2.113e-02, 6.477e-02)); + r += mul(s2_5, M4(-6.346e-02, 1.536e-01, -5.008e-02, -7.137e-02, 5.735e-02, -1.805e-01, 1.751e-02, -1.993e-02, -8.088e-02, 1.131e-01, 2.861e-02, -5.225e-02, 7.813e-02, -1.596e-01, -5.213e-02, -2.286e-02)); + r += mul(s2_6, M4(6.213e-02, -1.340e-01, -4.045e-02, 5.417e-02, 1.412e-02, 2.320e-02, 3.999e-02, -4.847e-03, 3.844e-02, 2.233e-02, -1.047e-01, -7.587e-03, -7.185e-02, 2.859e-02, -2.312e-02, -5.680e-02)); + r += mul(s2_7, M4(-4.109e-02, 2.704e-02, -8.921e-02, 4.878e-02, -1.897e-01, 3.091e-02, 7.605e-02, -2.485e-01, 7.590e-02, -1.513e-02, -8.579e-03, 4.597e-02, -6.991e-02, -3.877e-02, -5.631e-02, -5.555e-02)); + r += mul(s2_8, M4(-1.464e-02, 5.491e-03, 8.155e-02, 4.692e-02, 1.756e-01, 5.157e-02, -2.228e-01, -9.451e-02, 2.240e-02, -2.119e-02, -8.800e-02, -2.836e-02, 1.321e-03, 5.610e-03, 6.110e-02, -1.010e-01)); + r += mul(s3_0, M4(-2.863e-01, 1.281e-01, 3.390e-01, 2.793e-02, 8.745e-02, -3.212e-02, -7.006e-02, -8.724e-02, 1.313e-01, -5.727e-04, -2.541e-03, 9.595e-02, 1.818e-01, 1.798e-01, -7.001e-02, 1.867e-01)); + r += mul(s3_1, M4(-7.490e-01, 2.820e-01, -8.783e-02, -8.340e-02, -5.457e-02, 2.979e-02, 6.042e-02, -5.967e-02, 4.259e-02, 3.115e-02, 1.132e-01, -1.519e-01, -1.058e-01, 1.261e-01, -1.253e-01, -1.140e-01)); + r += mul(s3_2, M4(-1.103e-01, 1.477e-01, -8.571e-02, -2.903e-03, -6.956e-02, -1.613e-03, 9.327e-02, 1.674e-02, 9.031e-02, -9.055e-03, 5.152e-02, -4.042e-02, -2.994e-02, -8.168e-02, -2.455e-01, -2.800e-02)); + r += mul(s3_3, M4(1.524e-01, 2.541e-01, -2.778e-02, -5.655e-02, -4.606e-02, 8.783e-02, 7.691e-02, 4.097e-02, -7.642e-02, 2.777e-02, 1.949e-02, -6.352e-02, 3.537e-01, 1.018e-01, -3.824e-02, -1.221e-02)); + r += mul(s3_4, M4(-3.948e-01, 1.403e-01, -3.365e-01, -1.501e-01, 1.689e-01, 5.901e-02, -9.550e-02, 1.362e-01, -2.804e-02, 3.937e-02, -1.233e-01, -3.170e-02, 6.212e-02, 1.210e-01, -3.112e-01, 5.814e-03)); + r += mul(s3_5, M4(-2.880e-01, -7.068e-02, -3.583e-02, -1.900e-02, -1.555e-01, -9.420e-02, -1.856e-03, 5.042e-02, -6.842e-02, 5.013e-02, -5.946e-02, -8.058e-02, -1.084e-01, -5.146e-03, -7.522e-02, 5.965e-03)); + r += mul(s3_6, M4(6.954e-02, 2.202e-02, 1.715e-01, -1.923e-01, -2.088e-01, -2.457e-01, -8.212e-02, 6.059e-02, -6.665e-02, 5.656e-03, -3.019e-02, 5.139e-02, 3.282e-01, 1.749e-01, 1.477e-02, -5.291e-02)); + r += mul(s3_7, M4(-5.721e-02, -1.348e-01, -1.032e-01, 2.518e-03, -1.444e-01, -1.540e-01, -1.222e-01, 2.705e-01, -5.951e-02, -5.826e-02, 3.968e-02, 1.580e-02, 4.005e-03, -1.579e-01, -7.896e-02, -1.453e-01)); + r += mul(s3_8, M4(-6.637e-02, -2.803e-01, 6.848e-02, 6.454e-02, -7.755e-04, 6.420e-02, 4.581e-03, 6.191e-02, 2.481e-02, -5.033e-02, -3.187e-02, -9.523e-02, 4.138e-02, -4.772e-03, -1.821e-02, -1.466e-01)); + r += mul(s4_0, M4(6.172e-02, 4.860e-02, -1.050e-01, 1.161e-01, 1.948e-01, 4.551e-02, -3.890e-02, 1.641e-01, -7.216e-02, -1.356e-01, -9.914e-02, -4.317e-02, 6.625e-03, -6.305e-02, -1.298e-01, -2.164e-02)); + r += mul(s4_1, M4(1.006e-01, -1.191e-02, -1.051e-01, 2.251e-01, 9.049e-03, 1.394e-01, 8.543e-02, -4.219e-02, 1.124e-01, -4.260e-02, -1.078e-02, 1.445e-01, 7.338e-02, 1.046e-01, -9.125e-02, -5.300e-03)); + r += mul(s4_2, M4(1.374e-01, -1.830e-01, 1.657e-01, -5.735e-02, 3.288e-02, -5.684e-02, 1.186e-02, -1.383e-02, 8.108e-02, 1.465e-02, 7.691e-02, 4.414e-02, 3.654e-04, 2.120e-01, -2.360e-02, 4.260e-02)); + r += mul(s4_3, M4(-5.470e-02, -1.727e-01, -9.758e-02, 1.201e-01, -1.376e-01, 1.443e-01, -2.002e-03, -1.086e-01, -8.649e-02, -1.393e-01, -9.284e-02, 1.437e-01, 5.944e-03, -1.920e-02, -6.170e-02, 2.351e-02)); + r += mul(s4_4, M4(8.198e-02, 8.723e-03, -2.378e-01, -9.163e-02, -1.058e-02, 6.321e-02, 1.436e-01, 3.090e-03, -7.826e-03, 1.253e-01, 5.161e-02, 2.252e-01, -4.539e-02, 2.287e-02, 4.011e-03, 1.571e-02)); + r += mul(s4_5, M4(1.134e-01, -1.501e-01, 1.345e-01, 8.493e-02, 3.416e-02, -1.753e-01, -3.733e-02, -2.671e-02, -1.743e-01, 8.097e-04, -7.299e-02, 8.528e-02, 1.934e-02, -6.367e-02, -9.613e-02, -9.835e-02)); + r += mul(s4_6, M4(-1.071e-01, 1.109e-01, -6.513e-03, -1.421e-02, 7.728e-02, -2.574e-02, 2.111e-02, -4.417e-02, 2.104e-02, -1.677e-01, -8.871e-02, 1.657e-02, -1.920e-01, 4.121e-02, -9.233e-02, -7.041e-02)); + r += mul(s4_7, M4(-1.750e-01, 1.759e-01, -1.211e-01, 4.576e-02, 4.790e-03, 2.754e-02, -5.749e-02, -5.159e-02, -9.071e-02, 7.544e-02, 5.648e-02, 2.652e-02, -4.998e-02, 5.046e-03, -6.872e-02, -9.695e-02)); + r += mul(s4_8, M4(-4.520e-02, -1.272e-01, -4.931e-02, 1.418e-01, -1.038e-01, 1.825e-02, -5.155e-02, 4.532e-02, 8.587e-02, -1.928e-02, -1.674e-02, -6.196e-02, 9.840e-02, -2.571e-02, -3.161e-03, -1.645e-02)); + r += mul(s5_0, M4(-1.004e-02, -1.549e-02, 4.202e-02, 3.765e-02, 3.177e-01, -6.272e-02, -4.354e-01, 3.390e-02, 2.077e-02, -1.162e-01, -5.451e-02, -4.558e-02, -1.102e-01, 8.683e-02, 4.586e-02, 1.046e-01)); + r += mul(s5_1, M4(-2.387e-02, -1.223e-02, 2.966e-02, -3.690e-02, 6.212e-02, -1.667e-01, 1.442e-01, 1.095e-02, 3.150e-02, -9.111e-02, 4.348e-02, -2.276e-01, 3.239e-02, 1.461e-01, -7.576e-02, -2.275e-02)); + r += mul(s5_2, M4(7.439e-05, -6.544e-02, 5.617e-02, 6.543e-02, -1.848e-01, 1.469e-01, -1.609e-01, -1.088e-01, 1.695e-01, -4.279e-02, 1.413e-01, 3.313e-02, 1.424e-01, 3.390e-02, 3.491e-02, -4.123e-02)); + r += mul(s5_3, M4(6.728e-03, -1.499e-01, -2.789e-02, -1.596e-01, -3.184e-01, -6.526e-01, -1.408e-01, 2.954e-01, 4.372e-02, 5.506e-02, 6.864e-03, 2.858e-02, -8.610e-02, -1.349e-01, -7.156e-02, 1.250e-01)); + r += mul(s5_4, M4(1.145e-01, 2.027e-01, -6.550e-02, -1.407e-02, -2.456e-01, -5.884e-02, 2.882e-01, 1.430e-01, -2.385e-02, 1.494e-01, -5.016e-03, 5.681e-02, 3.792e-02, 2.435e-01, 1.533e-02, -9.062e-02)); + r += mul(s5_5, M4(4.646e-03, -6.645e-02, -2.206e-02, 1.096e-01, 1.602e-01, -2.943e-02, 2.762e-01, -3.057e-02, 1.723e-02, 7.497e-02, -1.430e-01, -4.040e-02, 4.436e-01, -1.915e-01, -3.968e-02, -3.058e-02)); + r += mul(s5_6, M4(2.339e-01, 6.296e-02, -1.281e-02, -3.622e-02, 8.146e-01, 5.991e-01, 2.123e-01, -5.318e-02, -1.350e-01, -1.494e-01, -8.924e-02, 2.989e-02, -4.053e-01, -2.480e-03, -6.285e-02, -1.024e-01)); + r += mul(s5_7, M4(-1.237e-01, 5.261e-02, 1.015e-02, -5.028e-02, 3.307e-01, -1.153e-01, -2.319e-02, 1.187e-02, -3.670e-02, -1.935e-02, -7.525e-02, -1.157e-01, -3.444e-01, 5.113e-02, 8.425e-02, -2.187e-01)); + r += mul(s5_8, M4(-6.028e-02, 1.487e-02, 4.743e-02, 8.088e-02, -2.379e-02, 1.973e-01, -6.041e-02, 7.984e-02, 1.320e-02, -3.280e-02, 2.315e-03, -7.257e-02, 6.421e-02, -1.990e-01, 9.782e-02, -1.607e-01)); + r += mul(s6_0, M4(-1.746e-01, -1.096e-01, -4.016e-02, 2.316e-02, -1.189e-01, 9.210e-02, -1.773e-02, -8.569e-02, -4.666e-02, 3.651e-01, 4.906e-03, 2.222e-01, 2.055e-01, 1.802e-01, 1.129e-01, 1.117e-01)); + r += mul(s6_1, M4(-1.525e-01, 1.392e-01, 4.853e-02, 2.790e-02, 6.696e-02, 1.395e-01, -5.621e-02, 1.454e-01, -5.803e-02, 1.297e-01, 7.659e-02, 8.137e-02, 7.510e-03, 2.824e-03, 8.717e-02, 2.927e-02)); + r += mul(s6_2, M4(-1.327e-02, 8.183e-03, 1.518e-01, -2.946e-03, 7.108e-02, 1.311e-01, -2.148e-02, 2.953e-02, -9.645e-02, 3.880e-01, 8.442e-02, 1.101e-01, 9.102e-02, -1.020e-01, 2.197e-02, -1.570e-01)); + r += mul(s6_3, M4(-1.404e-01, 1.216e-01, 1.599e-02, -1.471e-01, -1.515e-02, 6.933e-02, -1.272e-01, -9.458e-03, -2.156e-01, -2.151e-01, -1.655e-01, -4.164e-02, -1.211e-01, -9.239e-02, -3.468e-02, 1.937e-03)); + r += mul(s6_4, M4(2.207e-02, 1.661e-02, 6.881e-02, -4.938e-02, -1.981e-02, 8.082e-02, -1.806e-02, 1.308e-01, -1.566e-01, -1.687e-01, 4.704e-02, -3.613e-01, -9.430e-02, -2.023e-01, 1.244e-01, 5.668e-02)); + r += mul(s6_5, M4(-1.438e-02, 8.418e-02, 5.582e-02, 4.658e-02, 9.767e-03, 1.296e-01, -8.625e-02, 6.566e-02, -4.197e-02, -4.831e-02, 7.632e-02, -3.700e-02, 2.381e-02, -1.422e-01, 2.721e-01, -1.149e-01)); + r += mul(s6_6, M4(1.040e-01, 1.133e-02, 2.081e-02, 1.203e-02, 2.419e-01, 4.390e-02, 4.088e-02, 1.739e-01, 1.626e-01, 1.626e-01, 7.494e-02, 9.982e-02, 7.710e-02, 1.424e-01, 6.593e-03, -1.490e-01)); + r += mul(s6_7, M4(1.593e-02, -8.501e-02, -3.821e-02, 5.587e-02, 1.242e-01, -1.739e-01, 6.258e-03, 2.321e-02, 2.304e-01, 5.343e-02, 7.296e-02, 3.140e-02, -8.605e-02, -1.336e-02, -2.243e-01, -1.296e-01)); + r += mul(s6_8, M4(-7.701e-03, -2.540e-02, 6.064e-02, 4.354e-02, -5.639e-02, -1.145e-01, -2.456e-02, -6.280e-02, 2.549e-01, 8.659e-03, 2.024e-01, 2.090e-01, 1.751e-01, 1.903e-01, -2.858e-01, -4.304e-03)); + r += mul(s7_0, M4(-1.837e-02, 2.402e-02, 3.309e-03, 8.617e-03, 6.836e-02, 2.067e-01, -3.861e-03, 4.940e-02, -9.221e-02, 2.281e-02, -1.917e-02, -8.949e-02, -3.042e-02, -6.460e-02, -4.224e-02, 3.207e-02)); + r += mul(s7_1, M4(-2.121e-01, 5.468e-02, 2.221e-02, -2.191e-03, -5.089e-02, 9.094e-03, 3.493e-02, 3.266e-02, 4.843e-02, 6.992e-02, 1.177e-01, -2.361e-02, -3.117e-02, 1.798e-01, -2.280e-01, -5.832e-02)); + r += mul(s7_2, M4(8.313e-02, -3.986e-02, 4.971e-02, 6.207e-02, 9.079e-02, 9.608e-02, 1.472e-02, 2.360e-02, 3.350e-02, -7.497e-02, 5.004e-03, 2.574e-02, -3.489e-02, 1.469e-03, 5.901e-02, -7.264e-02)); + r += mul(s7_3, M4(1.947e-01, -1.781e-01, 3.008e-03, -1.291e-01, 7.364e-02, 6.604e-02, -6.041e-02, 1.262e-01, -1.353e-01, 1.625e-02, 3.219e-02, 2.061e-02, -6.350e-02, -1.169e-01, -8.725e-02, 7.904e-02)); + r += mul(s7_4, M4(-4.648e-02, -1.010e-02, 1.896e-02, 2.226e-01, 3.922e-02, 1.277e-01, 9.701e-02, -3.059e-02, 3.853e-03, -1.012e-01, 1.153e-02, -4.876e-02, -4.124e-02, 4.852e-02, -5.050e-02, 1.209e-01)); + r += mul(s7_5, M4(-1.581e-02, 3.426e-02, -9.987e-02, 6.714e-02, 1.979e-01, -1.942e-02, -1.218e-01, -4.330e-02, -9.028e-02, -1.265e-02, 9.580e-02, -4.611e-02, -5.395e-02, -1.992e-01, 7.735e-02, 5.766e-03)); + r += mul(s7_6, M4(1.670e-01, 1.696e-01, 6.262e-02, -4.667e-02, 3.841e-02, 6.407e-02, -8.766e-02, -5.676e-02, 8.497e-02, -3.010e-02, -3.407e-02, 2.600e-02, 5.656e-02, 6.309e-03, -2.136e-02, -9.589e-02)); + r += mul(s7_7, M4(1.196e-01, 6.606e-02, -1.223e-01, -2.459e-02, -4.519e-02, 6.432e-02, 6.285e-02, 1.156e-01, -1.890e-02, 8.361e-02, -1.170e-02, -1.684e-02, 1.223e-01, 2.185e-01, 4.274e-02, -2.461e-02)); + r += mul(s7_8, M4(1.232e-01, -5.513e-02, -1.628e-02, -3.733e-02, 1.027e-02, 3.609e-02, 6.349e-02, -9.551e-02, 1.832e-01, -9.725e-03, -1.850e-02, -5.244e-03, -6.073e-02, -1.743e-01, 1.350e-02, -2.928e-02)); + r += V4(-1.309e-02, -2.129e-02, 4.474e-03, 1.972e-02); + return r; +} + +void Pass4(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = Rmp8x8(tid.x) + blockStart; + uint2 size = GetInputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = (gxy + 0.5) * pt; + + V4 s0_0 = l0(-1.0, -1.0); + V4 s0_1 = l0(0.0, -1.0); + V4 s0_2 = l0(1.0, -1.0); + V4 s0_3 = l0(-1.0, 0.0); + V4 s0_4 = l0(0.0, 0.0); + V4 s0_5 = l0(1.0, 0.0); + V4 s0_6 = l0(-1.0, 1.0); + V4 s0_7 = l0(0.0, 1.0); + V4 s0_8 = l0(1.0, 1.0); + V4 s1_0 = -max(-s0_0, 0.0); + V4 s1_1 = -max(-s0_1, 0.0); + V4 s1_2 = -max(-s0_2, 0.0); + V4 s1_3 = -max(-s0_3, 0.0); + V4 s1_4 = -max(-s0_4, 0.0); + V4 s1_5 = -max(-s0_5, 0.0); + V4 s1_6 = -max(-s0_6, 0.0); + V4 s1_7 = -max(-s0_7, 0.0); + V4 s1_8 = -max(-s0_8, 0.0); + s0_0 = max(s0_0, 0.0); + s0_1 = max(s0_1, 0.0); + s0_2 = max(s0_2, 0.0); + s0_3 = max(s0_3, 0.0); + s0_4 = max(s0_4, 0.0); + s0_5 = max(s0_5, 0.0); + s0_6 = max(s0_6, 0.0); + s0_7 = max(s0_7, 0.0); + s0_8 = max(s0_8, 0.0); + + V4 s2_0 = l1(-1.0, -1.0); + V4 s2_1 = l1(0.0, -1.0); + V4 s2_2 = l1(1.0, -1.0); + V4 s2_3 = l1(-1.0, 0.0); + V4 s2_4 = l1(0.0, 0.0); + V4 s2_5 = l1(1.0, 0.0); + V4 s2_6 = l1(-1.0, 1.0); + V4 s2_7 = l1(0.0, 1.0); + V4 s2_8 = l1(1.0, 1.0); + V4 s3_0 = -max(-s2_0, 0.0); + V4 s3_1 = -max(-s2_1, 0.0); + V4 s3_2 = -max(-s2_2, 0.0); + V4 s3_3 = -max(-s2_3, 0.0); + V4 s3_4 = -max(-s2_4, 0.0); + V4 s3_5 = -max(-s2_5, 0.0); + V4 s3_6 = -max(-s2_6, 0.0); + V4 s3_7 = -max(-s2_7, 0.0); + V4 s3_8 = -max(-s2_8, 0.0); + s2_0 = max(s2_0, 0.0); + s2_1 = max(s2_1, 0.0); + s2_2 = max(s2_2, 0.0); + s2_3 = max(s2_3, 0.0); + s2_4 = max(s2_4, 0.0); + s2_5 = max(s2_5, 0.0); + s2_6 = max(s2_6, 0.0); + s2_7 = max(s2_7, 0.0); + s2_8 = max(s2_8, 0.0); + + V4 s4_0 = l2(-1.0, -1.0); + V4 s4_1 = l2(0.0, -1.0); + V4 s4_2 = l2(1.0, -1.0); + V4 s4_3 = l2(-1.0, 0.0); + V4 s4_4 = l2(0.0, 0.0); + V4 s4_5 = l2(1.0, 0.0); + V4 s4_6 = l2(-1.0, 1.0); + V4 s4_7 = l2(0.0, 1.0); + V4 s4_8 = l2(1.0, 1.0); + V4 s5_0 = -max(-s4_0, 0.0); + V4 s5_1 = -max(-s4_1, 0.0); + V4 s5_2 = -max(-s4_2, 0.0); + V4 s5_3 = -max(-s4_3, 0.0); + V4 s5_4 = -max(-s4_4, 0.0); + V4 s5_5 = -max(-s4_5, 0.0); + V4 s5_6 = -max(-s4_6, 0.0); + V4 s5_7 = -max(-s4_7, 0.0); + V4 s5_8 = -max(-s4_8, 0.0); + s4_0 = max(s4_0, 0.0); + s4_1 = max(s4_1, 0.0); + s4_2 = max(s4_2, 0.0); + s4_3 = max(s4_3, 0.0); + s4_4 = max(s4_4, 0.0); + s4_5 = max(s4_5, 0.0); + s4_6 = max(s4_6, 0.0); + s4_7 = max(s4_7, 0.0); + s4_8 = max(s4_8, 0.0); + + V4 s6_0 = l3(-1.0, -1.0); + V4 s6_1 = l3(0.0, -1.0); + V4 s6_2 = l3(1.0, -1.0); + V4 s6_3 = l3(-1.0, 0.0); + V4 s6_4 = l3(0.0, 0.0); + V4 s6_5 = l3(1.0, 0.0); + V4 s6_6 = l3(-1.0, 1.0); + V4 s6_7 = l3(0.0, 1.0); + V4 s6_8 = l3(1.0, 1.0); + V4 s7_0 = -max(-s6_0, 0.0); + V4 s7_1 = -max(-s6_1, 0.0); + V4 s7_2 = -max(-s6_2, 0.0); + V4 s7_3 = -max(-s6_3, 0.0); + V4 s7_4 = -max(-s6_4, 0.0); + V4 s7_5 = -max(-s6_5, 0.0); + V4 s7_6 = -max(-s6_6, 0.0); + V4 s7_7 = -max(-s6_7, 0.0); + V4 s7_8 = -max(-s6_8, 0.0); + s6_0 = max(s6_0, 0.0); + s6_1 = max(s6_1, 0.0); + s6_2 = max(s6_2, 0.0); + s6_3 = max(s6_3, 0.0); + s6_4 = max(s6_4, 0.0); + s6_5 = max(s6_5, 0.0); + s6_6 = max(s6_6, 0.0); + s6_7 = max(s6_7, 0.0); + s6_8 = max(s6_8, 0.0); + + t4[gxy] = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t5[gxy] = f1(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t6[gxy] = f2(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t7[gxy] = f3(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); +} + +//!PASS 5 +//!DESC conv4 +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 +//!IN t4, t5, t6, t7 +//!OUT t0, t1, t2, t3 + +#define l0(x, y) V4(O(t4, float2(x, y))) +#define l1(x, y) V4(O(t5, float2(x, y))) +#define l2(x, y) V4(O(t6, float2(x, y))) +#define l3(x, y) V4(O(t7, float2(x, y))) + +V4 f0(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-1.403e-02, -3.617e-02, 6.562e-02, 5.876e-02, -6.178e-02, 1.725e-01, 1.095e-01, 8.162e-02, -1.465e-01, 2.106e-02, 2.242e-01, -8.096e-03, 5.256e-02, 4.765e-03, 3.636e-03, -1.354e-01)); + r += mul(s0_1, M4(-5.538e-02, -1.166e-01, -5.697e-02, -8.648e-02, -1.756e-01, 6.405e-02, -3.340e-01, 1.930e-01, 1.808e-01, -5.507e-01, -1.670e-01, 2.021e-02, -3.780e-02, -4.192e-02, 1.718e-03, -5.116e-02)); + r += mul(s0_2, M4(-2.934e-02, -9.119e-02, -1.676e-01, -1.473e-02, -8.223e-02, -3.447e-01, 1.063e-01, 6.842e-03, -1.147e-01, 1.334e-01, 2.362e-01, -1.720e-01, -2.902e-02, 4.821e-02, 1.806e-03, -6.014e-03)); + r += mul(s0_3, M4(1.224e-01, 9.122e-02, 2.484e-02, -1.232e-01, 8.127e-02, -2.319e-01, 1.683e-01, -2.717e-03, 3.447e-01, 4.864e-01, -3.165e-01, 1.025e-01, 1.120e-01, -9.687e-02, -1.213e-01, -3.732e-02)); + r += mul(s0_4, M4(1.194e-01, -1.310e-02, 4.169e-03, 4.984e-02, 1.139e-02, 3.027e-01, 8.156e-02, -1.198e-01, 2.414e-02, -1.129e-01, 2.602e-01, 4.357e-01, 1.966e-02, 4.241e-02, -1.662e-02, -1.402e-01)); + r += mul(s0_5, M4(7.734e-02, 7.766e-03, -1.040e-01, 4.922e-02, 7.198e-02, -3.357e-02, 7.957e-02, 2.508e-02, 2.455e-02, -2.451e-01, -8.346e-02, -9.900e-02, -4.279e-02, 6.600e-02, -1.474e-01, 6.493e-02)); + r += mul(s0_6, M4(-1.662e-02, 1.719e-01, 1.430e-01, -1.996e-01, -6.115e-02, 1.890e-01, 8.272e-02, 2.100e-01, -1.199e-01, -8.902e-04, -4.773e-02, -1.766e-02, 1.617e-01, 1.993e-03, 8.756e-02, -8.822e-04)); + r += mul(s0_7, M4(-3.232e-02, -9.500e-02, -5.929e-02, 8.015e-03, -5.343e-02, 1.559e-01, 7.296e-02, 1.787e-01, -1.910e-01, -4.287e-01, -2.358e-01, 1.208e-01, -5.813e-03, 9.995e-03, 4.872e-02, -5.149e-02)); + r += mul(s0_8, M4(-7.287e-02, 8.100e-02, 8.894e-03, -6.739e-02, 4.589e-02, -5.955e-02, 3.243e-02, 1.166e-01, 7.412e-02, 4.255e-01, -1.286e-01, 3.347e-01, 9.307e-02, -2.762e-02, -4.989e-02, -5.027e-02)); + r += mul(s1_0, M4(2.221e-03, -1.009e-02, 5.894e-02, -5.153e-03, -4.216e-02, 4.741e-02, -2.521e-02, 2.051e-02, 7.111e-02, 1.454e-02, -1.271e-01, 4.734e-02, 1.520e-01, -2.913e-02, -1.744e-02, -3.606e-04)); + r += mul(s1_1, M4(-7.256e-02, -5.916e-02, -1.794e-01, -9.403e-02, -3.887e-02, -1.682e-02, -1.125e-01, 1.256e-01, -1.047e-01, 1.052e-01, 3.306e-02, -1.035e-01, 3.830e-02, 6.017e-02, -1.455e-01, -3.673e-02)); + r += mul(s1_2, M4(-4.656e-02, 6.576e-02, -1.206e-02, 7.373e-02, 4.382e-02, -1.212e-01, 1.372e-02, 8.064e-02, -2.083e-02, -3.965e-02, 9.661e-02, 1.333e-01, -1.871e-02, 6.751e-02, -7.939e-02, -5.082e-03)); + r += mul(s1_3, M4(-4.448e-02, 1.242e-01, 1.363e-01, 1.097e-02, 3.059e-02, 1.664e-01, 6.723e-03, -2.766e-02, 2.248e-01, 3.909e-02, -3.693e-02, -2.665e-02, -6.694e-02, -6.712e-02, -2.997e-02, -5.125e-02)); + r += mul(s1_4, M4(-8.008e-02, -8.090e-02, 2.143e-02, 1.325e-01, 2.997e-02, 4.596e-03, 4.955e-02, -1.075e-01, -1.620e-01, -1.642e-02, -7.744e-02, 4.908e-02, 1.461e-01, 4.913e-02, 1.980e-01, 1.527e-03)); + r += mul(s1_5, M4(7.835e-02, 2.489e-03, -1.135e-01, -7.925e-03, -6.510e-02, -5.075e-03, -1.535e-01, -5.507e-02, -3.445e-03, -6.483e-02, -4.045e-02, -5.231e-02, 6.616e-02, -1.497e-01, 1.292e-01, -1.680e-01)); + r += mul(s1_6, M4(7.055e-02, 4.363e-04, -8.264e-02, 1.886e-01, 1.036e-01, -3.691e-02, 6.142e-02, -8.803e-02, 3.578e-02, 4.038e-02, 2.817e-02, 3.503e-02, 1.955e-02, 6.893e-02, -9.415e-02, -1.477e-01)); + r += mul(s1_7, M4(1.175e-01, -4.995e-02, 2.677e-02, 1.575e-01, -5.070e-02, -1.014e-01, -4.180e-02, 9.582e-02, -6.029e-02, -4.345e-03, 1.650e-01, -1.279e-01, -5.815e-02, 2.293e-01, -1.717e-01, -1.789e-03)); + r += mul(s1_8, M4(6.751e-02, 2.129e-02, -1.387e-01, 1.960e-01, 7.240e-02, -9.169e-02, 2.059e-02, -2.487e-02, 3.175e-02, 8.674e-02, 1.437e-02, 1.178e-01, 1.861e-01, 9.650e-02, 9.152e-02, 1.052e-01)); + r += mul(s2_0, M4(-1.147e-02, -1.573e-01, -1.140e-01, -1.091e-01, 5.245e-02, 1.415e-01, -1.954e-02, -1.658e-02, 8.472e-02, 5.175e-02, 1.571e-02, -6.254e-03, 3.042e-01, -7.161e-02, -2.180e-01, 1.224e-01)); + r += mul(s2_1, M4(-4.226e-02, 2.147e-01, 4.965e-02, 1.262e-02, 7.037e-02, 1.135e-01, 2.018e-02, -9.901e-03, 1.053e-01, 3.991e-02, -4.108e-02, 1.931e-01, -1.279e-01, -7.678e-02, -2.745e-01, -4.086e-02)); + r += mul(s2_2, M4(1.274e-01, 2.729e-02, -3.767e-02, -9.551e-02, -8.582e-04, 6.972e-02, 5.652e-02, -1.703e-01, -1.039e-01, 2.611e-02, 5.974e-02, 1.935e-03, 7.292e-02, 1.259e-01, -1.342e-01, 1.929e-01)); + r += mul(s2_3, M4(-6.665e-02, -7.866e-02, -8.065e-02, 1.293e-02, -8.966e-02, 2.920e-01, -1.036e-01, 1.502e-02, -5.053e-02, -8.296e-03, 5.614e-02, -3.914e-02, -4.724e-02, 1.787e-01, -1.154e-03, 1.690e-01)); + r += mul(s2_4, M4(6.822e-02, 1.516e-01, -3.617e-02, -4.529e-02, -1.694e-01, 5.198e-02, 1.686e-01, 2.174e-02, -2.447e-02, 6.691e-02, -5.546e-03, -2.035e-01, 6.614e-02, -5.093e-03, -4.064e-02, -1.165e-01)); + r += mul(s2_5, M4(4.233e-03, -1.801e-02, 4.971e-02, 1.083e-01, -1.115e-01, 2.789e-01, 2.396e-02, 9.253e-02, 1.171e-01, -2.170e-01, -5.590e-02, 1.451e-01, 1.054e-01, 4.272e-01, 7.070e-02, -1.768e-01)); + r += mul(s2_6, M4(-8.236e-02, -8.419e-02, 7.004e-02, -2.031e-02, 6.163e-03, -5.510e-02, 2.173e-01, -2.632e-03, -1.647e-01, 1.409e-01, -2.231e-01, 4.268e-02, -8.566e-02, 1.053e-01, 3.142e-02, -2.915e-02)); + r += mul(s2_7, M4(-2.966e-02, 5.465e-02, 6.451e-02, -2.482e-02, 1.275e-01, -1.012e-02, 2.244e-01, -5.186e-02, -1.035e-01, -3.406e-02, -1.420e-01, 1.346e-01, -1.446e-01, 6.941e-02, 1.040e-01, -2.175e-01)); + r += mul(s2_8, M4(-3.278e-02, -1.629e-01, -7.868e-02, 1.538e-02, -6.383e-02, 1.542e-01, 1.447e-02, -4.754e-02, 1.373e-01, 6.638e-02, -9.902e-02, 1.489e-01, -6.896e-02, 2.958e-01, 1.456e-01, -4.785e-02)); + r += mul(s3_0, M4(2.547e-01, 3.212e-01, 8.020e-02, -1.309e-01, 5.922e-02, 7.839e-02, -4.911e-02, 1.490e-01, -5.825e-02, 7.189e-02, -3.384e-03, -2.041e-02, -1.284e-03, -1.997e-01, -1.863e-01, -8.275e-02)); + r += mul(s3_1, M4(-1.870e-01, 4.164e-02, -3.392e-02, 1.332e-01, 5.288e-03, 9.235e-02, 1.344e-01, 1.175e-01, 5.099e-02, 2.085e-02, 9.926e-02, -2.592e-02, 1.802e-01, 1.656e-02, -3.266e-02, -7.870e-02)); + r += mul(s3_2, M4(2.632e-01, -3.499e-02, -8.815e-02, -3.241e-02, 1.468e-01, 1.008e-01, 9.987e-02, -1.061e-01, 7.046e-02, -7.794e-02, -9.205e-03, -6.827e-02, -6.186e-02, 9.601e-02, 1.487e-01, -5.550e-02)); + r += mul(s3_3, M4(-2.477e-01, 3.069e-02, -9.052e-03, -4.887e-02, -1.160e-02, -1.008e-01, -1.210e-01, 8.770e-03, 2.958e-02, 1.116e-01, -6.531e-02, -1.139e-01, -1.901e-02, -1.002e-01, 5.271e-02, 7.910e-02)); + r += mul(s3_4, M4(-3.314e-02, -1.590e-02, -3.390e-01, -4.169e-02, -1.809e-02, -3.746e-02, -1.133e-01, -1.072e-02, 2.649e-03, -5.970e-02, 1.974e-03, -9.189e-02, -6.000e-02, -3.674e-02, 8.258e-02, -3.241e-02)); + r += mul(s3_5, M4(4.051e-02, -2.999e-02, 3.019e-01, 2.686e-01, -3.148e-02, -2.528e-03, -4.993e-02, 1.105e-02, 3.181e-02, 3.027e-02, -1.154e-01, -1.808e-02, -5.615e-02, -6.097e-02, 4.423e-02, 1.191e-02)); + r += mul(s3_6, M4(-5.900e-02, 1.167e-01, -1.050e-01, 6.975e-02, -5.700e-02, 7.639e-02, -1.640e-01, 5.529e-02, -2.196e-02, -5.372e-02, -3.286e-03, 1.109e-03, 7.070e-02, 2.862e-02, -2.767e-03, 3.804e-03)); + r += mul(s3_7, M4(-2.711e-03, 1.331e-01, -2.052e-02, -7.003e-02, 7.249e-02, -2.045e-01, 9.754e-02, -5.843e-03, -1.166e-01, -1.128e-01, 6.700e-03, -8.543e-03, 7.056e-02, 5.545e-02, -1.505e-03, 1.847e-02)); + r += mul(s3_8, M4(1.887e-02, -1.313e-01, 2.085e-02, -1.108e-01, -2.634e-02, -1.174e-01, 7.497e-02, -9.914e-02, 3.341e-02, 6.734e-03, -3.777e-02, -8.734e-02, -1.343e-01, 2.762e-02, 4.527e-02, 7.153e-02)); + r += mul(s4_0, M4(-1.545e-02, -3.653e-02, -5.942e-02, 1.156e-01, 6.447e-03, -5.395e-02, -9.426e-03, 1.245e-01, 1.464e-01, 1.203e-01, 1.234e-02, 6.136e-02, 5.830e-02, -2.980e-02, -5.208e-02, -6.155e-02)); + r += mul(s4_1, M4(6.423e-02, 1.237e-01, 3.567e-03, 8.611e-02, -7.281e-02, -6.306e-02, 2.345e-02, 1.440e-01, 1.770e-01, 2.031e-01, -4.515e-02, -1.793e-01, 7.675e-02, -3.717e-02, 5.172e-02, 7.787e-02)); + r += mul(s4_2, M4(-1.312e-02, 1.646e-01, 1.046e-02, 2.364e-02, 7.445e-02, 9.217e-02, -5.421e-02, 3.565e-02, -3.234e-02, -3.305e-02, 1.478e-01, -6.713e-02, 4.497e-02, 7.324e-02, 1.659e-02, 7.569e-03)); + r += mul(s4_3, M4(-8.683e-02, 1.411e-01, -6.177e-02, 6.614e-03, 1.355e-01, -1.229e-01, -2.661e-04, 4.569e-02, 1.053e-01, -4.977e-03, 5.875e-02, -3.044e-03, -9.842e-02, 1.890e-02, 1.434e-02, 1.655e-02)); + r += mul(s4_4, M4(-9.536e-02, -1.763e-01, 7.815e-02, -1.333e-02, 7.132e-02, 5.331e-02, -7.482e-02, 1.781e-01, 7.652e-02, -1.080e-01, 1.546e-02, -5.917e-02, -2.365e-01, 7.391e-02, 1.376e-02, 5.754e-02)); + r += mul(s4_5, M4(-4.995e-03, -2.146e-02, 9.806e-02, 4.611e-02, -4.164e-02, -8.312e-02, -1.299e-01, 7.270e-02, -3.732e-02, 1.034e-01, 6.050e-02, -1.064e-02, -9.351e-02, 8.942e-02, -2.541e-01, -1.477e-01)); + r += mul(s4_6, M4(-1.657e-02, 8.071e-03, -2.339e-03, -1.180e-01, -1.259e-01, -4.578e-02, -7.240e-02, -9.815e-02, -3.630e-03, -1.096e-01, -3.503e-02, 3.489e-02, -1.277e-02, 1.032e-01, -1.663e-02, 1.283e-01)); + r += mul(s4_7, M4(1.148e-01, -1.073e-01, -5.350e-02, -6.558e-02, 1.551e-01, 5.418e-02, 5.600e-02, -3.793e-02, 2.760e-02, -9.009e-02, 1.656e-01, -1.353e-01, -7.874e-02, 9.518e-02, -2.130e-01, 2.211e-02)); + r += mul(s4_8, M4(1.467e-02, -1.723e-01, -1.542e-01, 3.568e-02, 1.502e-01, 1.887e-01, 4.048e-02, -9.308e-02, 9.895e-02, -6.491e-02, 3.288e-02, 3.030e-03, -1.132e-01, -6.092e-02, -1.132e-01, -8.899e-02)); + r += mul(s5_0, M4(1.955e-01, 8.898e-02, -1.181e-01, 2.091e-01, -2.980e-02, 9.983e-04, 6.224e-02, 1.254e-01, 1.760e-01, -7.738e-02, 1.133e-01, 3.441e-04, -7.540e-02, -3.831e-03, -9.871e-02, -1.331e-01)); + r += mul(s5_1, M4(1.465e-01, 1.291e-01, -1.122e-02, 1.248e-02, 2.605e-02, 6.992e-02, -2.890e-02, 6.967e-02, 1.604e-01, 4.109e-02, -1.681e-01, -1.727e-01, -6.260e-02, -5.841e-02, 7.631e-02, 1.554e-01)); + r += mul(s5_2, M4(-5.447e-02, -1.075e-02, 1.339e-01, 5.172e-02, -1.473e-01, -4.341e-02, -7.417e-03, -1.221e-01, 6.087e-02, -6.401e-03, -2.981e-02, 1.068e-02, 9.820e-02, -1.350e-01, 7.692e-02, -3.415e-02)); + r += mul(s5_3, M4(-8.800e-02, 2.183e-01, -1.861e-01, 8.092e-02, -1.644e-02, 5.692e-02, 5.083e-02, -3.447e-02, 7.326e-02, -4.875e-02, 4.948e-02, 9.255e-02, -8.272e-02, 1.329e-01, -2.294e-01, 5.548e-02)); + r += mul(s5_4, M4(1.760e-01, -1.564e-01, 1.384e-01, 7.514e-02, 1.817e-01, 2.840e-01, -3.442e-02, 7.496e-02, 2.412e-02, -1.839e-01, 2.331e-02, -6.661e-02, -1.343e-01, 1.361e-01, 5.822e-02, 1.591e-01)); + r += mul(s5_5, M4(-3.173e-02, 3.841e-02, 2.363e-01, -2.262e-02, -7.230e-02, -2.509e-01, 1.558e-01, 1.509e-02, 1.496e-02, -1.069e-01, -4.598e-02, 7.440e-02, 1.208e-01, -1.768e-01, 1.889e-03, -1.900e-03)); + r += mul(s5_6, M4(2.696e-01, 1.620e-01, -8.768e-02, -2.647e-01, 1.032e-02, -1.206e-01, 2.903e-02, -2.450e-01, 1.581e-01, 1.221e-01, -3.151e-02, -1.756e-02, 1.783e-02, -5.833e-02, -1.955e-03, -3.332e-02)); + r += mul(s5_7, M4(-1.619e-02, -1.299e-01, -3.026e-02, -1.959e-01, 2.244e-01, 4.688e-02, -3.125e-02, -1.485e-02, -1.218e-01, 1.568e-01, -3.067e-01, -1.595e-01, 1.118e-01, -1.011e-03, 5.350e-02, -2.963e-03)); + r += mul(s5_8, M4(1.541e-01, -4.289e-02, -1.134e-01, -3.869e-02, 4.947e-03, -1.265e-01, 6.246e-02, -1.231e-01, -8.599e-02, -9.106e-02, -7.921e-03, -2.395e-01, -4.238e-02, 1.077e-01, -1.513e-02, -1.894e-02)); + r += mul(s6_0, M4(2.234e-02, -4.553e-02, 1.398e-01, 1.044e-01, 6.616e-02, -6.898e-02, -6.531e-02, -9.138e-02, 6.607e-03, 1.845e-01, 1.200e-01, 8.614e-03, -5.389e-02, -7.037e-02, -6.011e-02, -7.417e-02)); + r += mul(s6_1, M4(1.756e-01, 7.443e-02, 7.561e-03, -6.561e-02, 1.822e-01, 3.157e-01, 1.129e-01, -9.867e-02, 9.461e-02, -1.430e-02, 4.898e-02, -1.162e-02, -1.654e-01, -1.253e-01, 5.611e-02, 1.337e-02)); + r += mul(s6_2, M4(-1.100e-01, -4.007e-02, -1.145e-01, -1.359e-02, 4.556e-02, -1.674e-01, -2.648e-02, 3.427e-02, -4.420e-02, 1.863e-01, -2.892e-02, 9.546e-02, 5.401e-02, 8.755e-02, -7.285e-02, 8.890e-02)); + r += mul(s6_3, M4(1.080e-02, 8.277e-02, -4.599e-03, 5.186e-02, -3.957e-02, -3.767e-02, -2.234e-02, 1.051e-01, -1.412e-01, -4.216e-02, 1.428e-01, 4.970e-02, 4.656e-02, 4.265e-02, -9.892e-02, -1.250e-01)); + r += mul(s6_4, M4(-1.043e-01, -1.390e-01, 1.606e-01, -9.595e-03, -1.813e-01, -7.386e-02, 2.139e-02, 1.030e-01, -9.393e-02, -1.933e-01, -3.866e-02, -7.151e-02, -1.906e-01, 4.585e-02, -7.522e-02, -7.019e-02)); + r += mul(s6_5, M4(3.033e-01, 2.124e-01, -2.764e-01, 2.947e-02, -1.150e-01, 1.872e-01, -1.574e-01, 5.572e-03, -1.556e-03, 2.202e-01, -1.994e-01, -2.116e-02, -3.251e-02, -1.068e-01, -1.175e-01, 6.481e-02)); + r += mul(s6_6, M4(-9.177e-02, 1.527e-03, 2.124e-01, -9.220e-02, 1.814e-01, -9.471e-02, -3.132e-02, 1.653e-02, 9.774e-02, -6.811e-02, 1.044e-01, 1.755e-01, 5.873e-02, 7.586e-02, -3.951e-02, 5.926e-02)); + r += mul(s6_7, M4(-1.676e-02, 2.192e-01, -5.895e-02, 8.951e-02, -3.314e-02, -1.216e-01, 2.604e-01, -6.996e-02, -6.390e-02, 1.267e-01, 1.534e-01, 1.274e-02, -4.624e-02, -1.175e-01, 1.763e-01, -1.708e-03)); + r += mul(s6_8, M4(-1.782e-01, 5.198e-02, -1.841e-01, -8.423e-02, 2.654e-02, 1.502e-02, 7.709e-02, 1.042e-01, -1.621e-01, 7.380e-02, 3.352e-01, -2.183e-01, 7.550e-02, -1.664e-01, 5.871e-02, 6.341e-02)); + r += mul(s7_0, M4(2.787e-02, -1.106e-01, 1.183e-01, 9.263e-02, -1.182e-01, -2.032e-02, 2.971e-02, -2.570e-02, 7.528e-03, 1.364e-01, -1.684e-02, 1.154e-02, 1.148e-02, -1.973e-01, 1.085e-02, 8.788e-02)); + r += mul(s7_1, M4(6.795e-02, -6.052e-02, -4.651e-02, -3.076e-02, -3.892e-02, 9.608e-02, 1.010e-02, 2.401e-02, 9.185e-02, 6.770e-02, -2.561e-02, 3.853e-02, 7.608e-02, -1.193e-01, -6.173e-02, -1.462e-02)); + r += mul(s7_2, M4(-2.358e-01, -5.858e-02, 8.549e-02, -6.835e-02, -1.159e-01, -1.814e-01, 6.819e-02, -9.286e-03, 7.542e-03, 3.463e-02, -7.895e-02, 1.015e-02, 7.713e-03, 2.471e-01, -7.800e-02, -5.346e-04)); + r += mul(s7_3, M4(3.231e-02, -1.111e-02, 1.412e-02, 2.273e-02, -1.642e-02, -5.983e-04, -8.450e-04, -1.484e-01, 1.165e-01, -7.660e-02, -2.169e-02, 1.688e-03, -7.418e-02, -1.375e-01, 6.957e-02, 1.065e-01)); + r += mul(s7_4, M4(-9.288e-03, 7.980e-02, -2.395e-02, 1.716e-02, 4.346e-02, -1.573e-02, -5.085e-02, 8.665e-02, 4.425e-02, -2.547e-02, 2.819e-02, -4.830e-02, -1.122e-01, 1.073e-01, -8.217e-02, -1.054e-01)); + r += mul(s7_5, M4(3.645e-02, -1.349e-01, -9.587e-02, 4.121e-02, 1.509e-01, 1.081e-01, -1.608e-02, -2.710e-03, -1.228e-02, -9.014e-02, -6.461e-02, -6.745e-02, -8.735e-03, 1.363e-01, 1.944e-02, -1.469e-01)); + r += mul(s7_6, M4(4.604e-02, 6.706e-02, 4.920e-02, -6.415e-02, -2.627e-02, 2.023e-02, -7.547e-02, 9.757e-03, 6.469e-03, -3.236e-02, 1.086e-01, 1.333e-01, -4.419e-02, 1.301e-01, -9.470e-02, 1.160e-01)); + r += mul(s7_7, M4(-1.934e-02, -8.758e-02, -2.389e-02, 4.202e-02, -9.827e-02, 2.160e-03, 4.170e-02, 1.612e-01, -1.579e-01, 6.141e-04, -6.358e-02, 1.494e-01, 8.995e-03, 3.656e-03, -1.656e-02, -1.924e-02)); + r += mul(s7_8, M4(-8.968e-02, -5.243e-02, -1.008e-01, 2.100e-02, 6.757e-02, 3.647e-02, 9.779e-02, -2.094e-02, 6.224e-02, 1.040e-01, 7.031e-02, 4.442e-02, 4.028e-02, -1.658e-01, 1.233e-01, -4.432e-02)); + r += V4(1.948e-04, -1.211e-02, -1.102e-02, -4.060e-03); + return r; +} + +V4 f1(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(7.666e-02, 9.032e-02, -2.201e-02, -6.146e-02, 2.565e-02, -1.249e-01, -2.453e-01, 1.563e-01, 3.906e-02, -1.881e-01, -1.185e-01, -6.974e-02, -7.445e-02, 2.590e-02, 1.370e-01, 9.587e-02)); + r += mul(s0_1, M4(1.485e-02, -5.406e-02, 1.198e-01, -3.525e-02, -2.749e-01, 7.934e-02, -8.831e-02, -1.235e-01, 2.601e-02, -3.620e-01, 4.006e-01, 6.251e-02, 1.061e-01, -4.198e-02, -1.020e-01, 7.027e-02)); + r += mul(s0_2, M4(8.552e-02, -8.702e-02, -1.050e-01, 8.812e-02, -8.084e-02, -1.278e-01, -5.957e-02, -7.390e-02, 9.906e-02, 3.698e-03, -2.657e-02, 1.046e-01, 3.750e-02, -4.238e-02, -6.149e-02, 9.148e-02)); + r += mul(s0_3, M4(-2.718e-02, 2.005e-01, 3.921e-02, -1.183e-01, 2.641e-02, -3.971e-01, 3.685e-01, 2.269e-01, -3.809e-01, 1.650e-02, -1.960e-02, 9.178e-02, -4.059e-02, 1.761e-01, 6.480e-03, -6.381e-02)); + r += mul(s0_4, M4(-9.580e-02, 7.215e-02, -2.382e-02, -1.245e-01, 1.164e-01, 2.302e-01, -2.095e-01, 7.592e-03, -9.482e-03, 6.913e-02, -2.947e-01, 8.693e-02, -7.960e-02, -1.149e-01, -9.717e-02, 1.169e-01)); + r += mul(s0_5, M4(6.824e-02, -3.740e-02, -1.515e-02, 1.262e-02, -2.050e-01, 3.256e-02, 7.667e-02, -9.143e-03, 3.358e-01, 1.383e-01, 1.427e-02, 3.629e-02, 1.372e-01, -1.802e-01, 1.532e-02, -9.561e-02)); + r += mul(s0_6, M4(-6.141e-02, -3.787e-02, -2.865e-02, 1.904e-02, -5.788e-02, -1.007e-01, -1.655e-01, -2.909e-02, 4.200e-01, -7.197e-02, 1.794e-01, -1.511e-01, -2.651e-02, 3.723e-02, 1.975e-02, -5.730e-02)); + r += mul(s0_7, M4(-2.352e-01, 5.721e-03, -6.843e-03, -1.756e-02, -2.442e-01, 1.376e-01, 1.743e-01, -1.157e-01, 8.620e-02, -3.409e-01, 2.808e-01, 1.574e-02, -2.012e-01, -1.460e-01, 1.815e-02, -3.646e-02)); + r += mul(s0_8, M4(-7.671e-02, -7.516e-03, 7.112e-03, 1.314e-01, -1.211e-01, 2.989e-02, -1.114e-01, 8.195e-02, 1.931e-01, -3.090e-01, 2.236e-01, -1.479e-01, -1.198e-01, 1.394e-01, 6.682e-02, 2.823e-02)); + r += mul(s1_0, M4(2.086e-03, 7.605e-02, 2.401e-02, 4.246e-02, 1.589e-02, 1.838e-01, 3.515e-02, 8.184e-02, -3.673e-02, -9.430e-02, 2.514e-02, 6.057e-02, 2.841e-01, -6.646e-02, -1.239e-01, 2.357e-01)); + r += mul(s1_1, M4(8.877e-02, -9.418e-02, 3.641e-02, 1.261e-01, -6.069e-02, -8.376e-02, -1.186e-01, 1.055e-01, -1.299e-01, -9.798e-02, -3.721e-03, 1.341e-01, -5.935e-02, 1.766e-01, -1.779e-02, 2.536e-01)); + r += mul(s1_2, M4(-1.483e-02, -7.602e-02, 9.671e-02, 2.947e-02, 2.799e-02, -8.214e-02, 1.456e-02, -3.581e-02, 6.073e-02, -4.709e-02, 3.617e-02, 1.108e-01, -3.386e-02, 2.226e-01, -8.220e-02, 8.424e-02)); + r += mul(s1_3, M4(1.184e-01, -1.050e-01, 1.171e-01, -1.030e-01, -2.208e-02, 4.890e-02, 9.540e-03, 2.225e-02, -4.529e-02, -1.523e-01, 7.643e-02, 2.764e-02, -1.046e-01, 4.842e-02, -9.415e-02, -3.510e-02)); + r += mul(s1_4, M4(1.693e-01, 1.102e-01, 3.030e-02, -8.288e-02, 1.280e-01, -6.049e-02, -6.572e-02, 5.382e-02, 7.693e-02, -4.614e-02, 5.881e-02, -5.057e-02, -7.652e-02, 6.112e-02, 4.165e-02, 1.633e-01)); + r += mul(s1_5, M4(2.528e-01, -2.931e-03, 5.261e-02, -9.514e-02, 6.023e-02, -1.958e-01, 1.570e-01, -7.941e-02, 1.139e-01, 1.269e-01, 8.440e-02, -2.689e-02, -9.776e-02, 2.662e-01, 1.035e-01, -3.723e-02)); + r += mul(s1_6, M4(-1.351e-02, -1.382e-01, -3.532e-02, -2.055e-02, -1.894e-02, 2.036e-01, 1.207e-01, 3.210e-02, 3.033e-02, 2.978e-02, -7.349e-02, -2.898e-02, 4.164e-02, -7.748e-04, -4.873e-03, -1.019e-01)); + r += mul(s1_7, M4(1.637e-01, 6.672e-02, -3.445e-02, -1.153e-01, -7.795e-02, 2.590e-02, 8.038e-03, -7.181e-03, 7.782e-02, 1.270e-01, -8.117e-02, 1.058e-01, -1.331e-01, -1.909e-02, -1.573e-01, -1.063e-01)); + r += mul(s1_8, M4(2.150e-02, 1.225e-01, -5.032e-02, 4.249e-02, -4.711e-02, -2.849e-02, 2.106e-02, 6.465e-02, -1.970e-01, -7.572e-02, -5.393e-02, -1.200e-02, 2.129e-02, 1.024e-01, 1.226e-01, -3.303e-03)); + r += mul(s2_0, M4(-5.706e-02, 1.852e-02, -1.208e-01, 3.757e-02, 2.709e-01, 9.974e-02, 3.542e-02, -3.886e-02, -1.522e-01, 1.936e-02, -7.223e-03, 4.352e-02, 1.106e-01, -1.664e-01, 6.247e-02, 5.651e-02)); + r += mul(s2_1, M4(-4.986e-02, 1.104e-01, -2.070e-02, 1.312e-02, -2.313e-02, 9.140e-02, -1.958e-02, 6.337e-02, 1.447e-01, -7.056e-02, -6.767e-02, -7.895e-03, -3.117e-01, -1.126e-01, 5.749e-02, -1.313e-01)); + r += mul(s2_2, M4(1.639e-01, 6.634e-02, -8.794e-02, -1.775e-02, 1.660e-01, 1.250e-01, -2.245e-01, -7.732e-03, 4.920e-02, 4.479e-02, 2.068e-01, -5.093e-02, 1.976e-01, -8.390e-02, 2.176e-01, -1.004e-01)); + r += mul(s2_3, M4(-3.828e-03, 1.570e-01, 1.870e-02, 5.240e-02, -4.134e-02, -1.812e-01, -7.654e-02, 4.044e-02, -1.988e-01, 7.861e-02, -1.080e-01, 2.211e-01, -1.910e-01, 1.124e-01, -1.051e-01, 9.256e-02)); + r += mul(s2_4, M4(3.312e-03, -3.115e-01, -3.936e-02, -1.400e-01, -1.562e-01, 7.303e-02, 3.164e-02, -2.597e-01, 4.709e-02, 8.292e-02, -2.773e-01, -7.151e-02, -1.589e-02, -7.293e-02, -1.918e-01, -3.138e-01)); + r += mul(s2_5, M4(1.104e-01, 3.507e-02, -3.472e-02, 1.219e-01, 7.315e-02, -4.458e-02, 1.653e-02, -1.176e-01, 2.262e-01, 1.725e-01, -3.199e-02, 2.294e-01, -4.454e-01, 7.487e-02, 7.350e-02, 6.679e-02)); + r += mul(s2_6, M4(-2.130e-01, 1.176e-02, 3.890e-02, -2.579e-02, 9.297e-02, 1.060e-01, 8.130e-02, 1.334e-01, -1.224e-02, -6.851e-02, 1.174e-01, 5.566e-02, 1.802e-01, -2.152e-02, -1.306e-01, 3.551e-02)); + r += mul(s2_7, M4(-1.007e-01, -1.406e-02, 7.112e-02, 7.262e-02, -6.888e-02, -6.141e-02, 6.369e-02, 1.721e-02, -2.350e-02, 1.393e-01, -4.095e-02, -8.129e-02, -1.207e-01, 1.489e-01, -3.054e-03, 5.149e-02)); + r += mul(s2_8, M4(-6.981e-02, 4.287e-02, -5.023e-02, -5.744e-02, 9.653e-02, 1.017e-01, -1.565e-01, -4.122e-02, 2.834e-02, -5.081e-02, -6.699e-02, -1.666e-01, 2.145e-01, 2.819e-01, 1.927e-01, -7.054e-02)); + r += mul(s3_0, M4(1.677e-01, 1.473e-01, 3.507e-01, -4.333e-02, -8.797e-03, -6.254e-02, -5.991e-02, -6.359e-02, 2.555e-02, -5.722e-02, -1.022e-01, 2.396e-02, -1.831e-03, -9.545e-02, 2.552e-02, 9.494e-02)); + r += mul(s3_1, M4(3.567e-01, 1.140e-01, -3.827e-02, 2.076e-02, -1.553e-02, 1.175e-02, 1.953e-02, -4.080e-02, 3.106e-02, -2.799e-02, 1.818e-02, 6.441e-02, 7.938e-02, 3.981e-02, 7.466e-02, 3.005e-02)); + r += mul(s3_2, M4(5.776e-02, 8.585e-02, 1.620e-01, 7.642e-03, -2.849e-03, -1.101e-02, -1.019e-01, 3.324e-02, -4.136e-02, -7.884e-02, -3.288e-02, 2.354e-02, -3.060e-02, -3.389e-02, 2.350e-02, 1.188e-01)); + r += mul(s3_3, M4(-1.462e-01, 7.524e-02, 1.006e-01, 1.034e-01, -1.036e-01, -1.128e-01, -1.691e-02, 1.681e-02, -2.843e-02, 1.467e-01, 2.567e-02, 6.833e-04, -9.970e-03, 9.909e-03, 2.123e-02, -1.002e-01)); + r += mul(s3_4, M4(6.614e-03, -3.403e-02, -1.475e-01, 9.263e-02, 1.236e-01, -5.917e-02, 4.470e-02, -5.797e-02, -9.955e-02, 1.586e-01, -5.972e-02, 7.191e-03, 1.374e-01, 6.408e-03, -8.691e-02, -5.325e-02)); + r += mul(s3_5, M4(1.359e-01, -1.171e-01, -1.458e-01, -1.435e-01, -8.667e-02, -9.621e-02, 5.608e-02, -2.996e-02, 9.120e-02, 6.453e-02, -8.623e-03, -1.160e-01, 3.232e-02, 9.819e-02, 8.440e-02, -1.131e-02)); + r += mul(s3_6, M4(1.741e-01, -1.437e-01, -1.568e-01, -8.545e-02, -7.874e-02, 4.162e-02, 5.367e-03, 4.751e-02, 1.575e-03, 6.930e-02, -1.165e-01, -4.856e-02, 2.079e-03, -2.181e-02, -4.974e-04, -1.268e-01)); + r += mul(s3_7, M4(1.503e-01, -2.117e-02, 1.944e-02, 1.516e-01, 5.005e-04, -9.844e-03, 8.157e-02, -5.608e-02, -1.814e-03, 1.025e-02, 1.097e-01, 2.607e-02, 1.773e-01, -7.290e-02, 1.030e-01, -3.631e-03)); + r += mul(s3_8, M4(3.999e-02, -4.659e-02, -5.558e-02, -7.875e-02, 2.126e-02, 7.585e-02, 1.009e-02, 1.504e-01, 6.764e-02, 3.493e-02, 1.973e-02, 1.869e-02, -6.713e-02, -1.065e-02, 3.534e-02, -1.395e-02)); + r += mul(s4_0, M4(-1.134e-01, 8.116e-02, -3.079e-02, 4.865e-02, 3.037e-02, -8.456e-03, 2.037e-02, 4.035e-02, 8.870e-02, -5.168e-02, -7.097e-02, 1.182e-02, 8.179e-02, 6.262e-02, -1.896e-02, -1.180e-02)); + r += mul(s4_1, M4(-7.539e-02, -1.209e-02, 5.066e-02, 5.975e-02, 3.251e-02, 1.350e-01, 1.070e-01, -1.179e-01, 5.979e-02, -1.042e-01, 3.319e-02, 6.937e-02, 1.298e-02, 1.025e-01, 4.439e-02, 1.572e-02)); + r += mul(s4_2, M4(1.715e-01, 1.622e-02, -1.270e-02, -2.385e-02, 9.077e-02, 3.933e-02, 3.160e-02, -3.490e-02, -8.716e-02, 2.980e-02, 1.200e-02, 1.393e-02, -1.437e-02, -1.855e-02, 6.809e-02, 5.919e-02)); + r += mul(s4_3, M4(1.477e-03, 1.297e-02, 1.144e-01, -6.711e-02, 5.587e-02, 2.710e-02, -5.822e-03, 4.206e-02, 9.215e-02, -1.196e-01, -7.597e-02, -1.183e-01, -1.901e-01, -3.141e-02, -2.777e-02, 1.525e-02)); + r += mul(s4_4, M4(-4.174e-02, -3.953e-02, 4.881e-02, 8.356e-02, 1.196e-01, 8.192e-02, 6.524e-03, 3.029e-01, -1.256e-01, -2.574e-01, -2.211e-02, -1.309e-01, 1.115e-02, 8.013e-02, -1.392e-01, 4.997e-02)); + r += mul(s4_5, M4(1.356e-01, -1.733e-02, 1.330e-02, -6.480e-02, 3.517e-02, 2.987e-02, -4.573e-03, -2.763e-02, 1.162e-01, 9.809e-03, 3.198e-02, -3.287e-02, 1.137e-02, 7.550e-02, -1.550e-02, 3.757e-02)); + r += mul(s4_6, M4(-4.280e-02, 1.226e-01, -2.720e-02, -1.766e-01, 1.696e-01, -3.785e-02, -1.127e-01, -7.823e-02, 8.688e-02, -4.526e-02, 4.855e-02, 1.790e-02, 3.076e-02, -1.223e-01, 7.112e-02, -1.042e-02)); + r += mul(s4_7, M4(-1.149e-01, -1.131e-01, 1.137e-02, -1.700e-02, 7.438e-02, -5.237e-02, -2.700e-02, -1.385e-01, -5.454e-02, 2.996e-02, 1.073e-01, -1.845e-02, -2.428e-02, -2.637e-01, -3.791e-02, -9.931e-03)); + r += mul(s4_8, M4(1.571e-02, 4.287e-02, 1.423e-03, -4.407e-02, -3.704e-02, 1.618e-02, -2.138e-02, -1.316e-02, 3.961e-02, -8.012e-03, 3.706e-03, -4.285e-03, 9.088e-02, -5.418e-02, 3.478e-02, -4.119e-02)); + r += mul(s5_0, M4(4.162e-02, -1.331e-01, -5.190e-02, 5.715e-02, 2.217e-02, -1.053e-01, 2.508e-02, 1.156e-02, -2.425e-01, 1.921e-01, 8.250e-03, 1.186e-01, -3.488e-02, 6.156e-03, -1.557e-01, 9.502e-02)); + r += mul(s5_1, M4(3.882e-02, -2.317e-01, 6.298e-02, 8.951e-02, -6.931e-02, -3.340e-02, 8.133e-03, -6.065e-02, -7.284e-02, 2.075e-01, 1.225e-01, 1.334e-01, -7.015e-02, 1.558e-01, -1.325e-01, 2.827e-02)); + r += mul(s5_2, M4(-1.140e-01, -8.167e-03, 8.685e-02, -1.204e-01, 5.963e-02, -5.059e-02, -2.958e-02, 2.435e-02, -3.522e-02, 6.776e-02, 4.747e-02, 1.390e-02, -7.056e-02, 4.729e-02, -3.997e-02, 1.950e-02)); + r += mul(s5_3, M4(-2.847e-01, 8.763e-03, 3.029e-03, -8.931e-02, 4.601e-02, -1.008e-01, 1.617e-01, -1.121e-01, -3.437e-02, -2.914e-01, -6.525e-02, -2.407e-02, -1.468e-01, -1.163e-01, -2.765e-02, 1.279e-01)); + r += mul(s5_4, M4(-3.532e-01, -5.370e-01, -2.293e-01, -1.509e-01, -1.627e-01, -1.320e-01, 8.390e-02, 2.549e-01, 6.796e-02, -1.001e-01, 1.203e-01, -1.304e-01, 2.196e-01, -1.370e-01, -4.373e-02, 1.462e-01)); + r += mul(s5_5, M4(6.871e-02, 1.861e-01, 3.017e-02, -1.267e-01, -5.801e-02, -4.496e-02, 7.975e-03, -2.299e-03, 4.447e-02, 7.482e-02, 1.188e-01, -4.312e-02, 2.429e-02, -3.091e-02, -7.634e-02, -6.494e-03)); + r += mul(s5_6, M4(6.759e-02, 2.705e-01, 7.172e-02, -1.114e-01, 2.264e-02, -3.490e-02, 1.427e-01, -1.086e-01, -7.622e-02, -1.221e-01, 6.731e-02, 3.163e-02, -5.137e-03, 6.783e-02, 6.506e-02, 1.396e-02)); + r += mul(s5_7, M4(-2.853e-02, -1.336e-02, -2.271e-01, -2.608e-01, 8.926e-03, -5.704e-02, -1.149e-01, -5.734e-02, 2.139e-01, 1.250e-01, -3.221e-02, 7.016e-02, 3.786e-02, -4.232e-02, 2.596e-02, -1.358e-02)); + r += mul(s5_8, M4(-1.766e-01, 9.220e-02, -1.463e-01, 9.172e-02, -3.084e-02, 4.158e-03, 3.663e-02, 1.392e-01, 2.581e-02, 4.948e-02, 7.296e-02, 6.705e-03, 9.721e-02, 5.589e-02, 9.313e-02, 5.676e-02)); + r += mul(s6_0, M4(1.389e-01, -5.061e-02, -1.088e-01, -5.382e-02, -1.983e-01, -1.810e-01, -5.466e-02, 1.263e-01, 1.119e-01, -5.409e-02, 1.548e-01, -1.145e-02, -1.095e-01, 8.266e-02, -1.538e-01, -8.467e-02)); + r += mul(s6_1, M4(-1.058e-01, 2.745e-03, -1.151e-01, 8.218e-02, 1.352e-01, 2.115e-02, 1.762e-01, -2.165e-01, -8.160e-02, 9.388e-02, -9.487e-02, -3.961e-02, -2.485e-01, 8.816e-02, 1.005e-01, -3.592e-02)); + r += mul(s6_2, M4(-3.547e-02, 1.115e-01, -9.055e-02, 1.703e-02, -4.863e-02, -8.964e-03, 8.184e-02, 1.259e-01, 1.277e-01, 7.002e-02, 8.729e-02, -5.827e-02, -1.313e-01, -1.059e-02, 5.656e-02, -6.988e-02)); + r += mul(s6_3, M4(1.333e-01, 2.085e-02, -8.655e-02, 8.451e-03, 5.484e-02, 4.948e-02, -2.670e-02, 1.193e-01, -7.518e-02, -2.204e-02, -3.060e-01, -3.716e-02, -2.628e-01, -6.542e-02, 1.778e-02, 5.259e-02)); + r += mul(s6_4, M4(-1.002e-01, 5.889e-02, -1.626e-02, 6.611e-02, 4.457e-02, -1.635e-01, 1.607e-01, -4.766e-02, 1.387e-01, 7.029e-02, -2.287e-02, -1.344e-01, -5.337e-02, 3.612e-01, -3.124e-02, 6.267e-03)); + r += mul(s6_5, M4(-3.155e-02, -1.333e-01, -2.880e-01, -8.074e-02, 1.202e-02, -1.220e-01, 7.272e-02, -8.412e-02, 3.824e-02, -2.659e-02, -1.101e-01, -1.081e-01, 9.377e-02, 7.997e-02, 7.275e-02, -3.931e-02)); + r += mul(s6_6, M4(2.572e-01, -1.077e-01, -1.644e-02, 1.457e-01, 5.132e-02, 9.947e-03, 4.456e-02, -6.646e-02, 6.961e-02, -8.575e-02, 1.134e-03, -1.151e-01, 1.080e-01, -8.681e-02, -1.298e-01, -1.321e-02)); + r += mul(s6_7, M4(3.594e-02, 3.047e-02, -2.546e-02, 6.505e-02, 1.297e-02, 7.161e-02, 7.782e-03, 7.071e-02, -2.103e-01, 1.381e-01, 6.068e-02, 4.778e-03, 2.234e-01, 5.741e-02, -3.634e-02, 1.066e-01)); + r += mul(s6_8, M4(1.112e-01, 6.533e-02, 9.034e-02, 6.432e-03, -6.278e-02, -5.334e-02, -4.704e-02, -8.631e-02, 7.447e-02, -2.760e-02, 3.754e-02, -6.832e-03, 1.714e-01, -6.705e-02, 1.092e-01, 4.948e-03)); + r += mul(s7_0, M4(3.159e-02, 1.240e-01, -5.362e-02, 1.381e-02, 8.764e-02, 5.201e-02, -1.034e-01, -5.419e-02, -4.280e-02, -4.836e-02, -1.431e-02, 8.510e-03, 3.429e-02, -3.161e-03, 1.769e-01, -2.308e-02)); + r += mul(s7_1, M4(1.021e-01, -1.192e-02, 1.610e-02, 6.216e-02, -4.984e-02, 7.992e-02, 3.379e-02, -1.361e-01, -4.569e-02, 2.165e-02, 1.517e-02, -9.636e-02, 1.179e-01, 3.497e-02, -4.487e-03, -9.354e-02)); + r += mul(s7_2, M4(-8.054e-02, 1.085e-01, -1.880e-01, -1.110e-02, 7.848e-02, 1.598e-01, -1.752e-02, -3.300e-02, -2.045e-02, -5.159e-04, -1.080e-01, 9.817e-03, 2.359e-01, -1.174e-01, 1.120e-02, 3.895e-02)); + r += mul(s7_3, M4(-1.928e-01, -1.955e-01, -6.519e-02, -5.186e-02, -6.512e-02, 8.111e-02, 2.676e-02, 1.932e-01, -4.831e-02, -7.808e-02, -1.497e-01, -1.236e-01, -2.210e-02, 2.161e-02, -1.781e-02, 8.890e-02)); + r += mul(s7_4, M4(-6.295e-02, -3.097e-02, 9.677e-02, -5.350e-02, -7.605e-02, 7.948e-02, 1.186e-02, 1.029e-02, 6.487e-02, 8.562e-02, -2.551e-02, -7.505e-02, 5.046e-02, -1.407e-01, 6.605e-02, 2.090e-02)); + r += mul(s7_5, M4(-7.145e-02, -2.834e-01, -2.368e-01, -6.555e-03, 1.479e-02, -6.847e-03, -7.866e-02, -6.069e-02, -2.575e-02, -3.028e-02, -1.240e-01, 5.744e-03, 7.801e-02, -2.100e-01, -5.000e-02, 1.188e-01)); + r += mul(s7_6, M4(1.041e-01, 8.486e-02, 3.132e-02, 7.366e-02, -2.167e-03, -3.460e-02, 6.584e-02, -6.718e-03, 2.570e-02, 7.664e-02, -5.134e-02, -4.992e-02, -3.093e-02, 1.045e-01, -1.632e-02, -6.519e-02)); + r += mul(s7_7, M4(2.307e-01, -9.116e-02, 6.069e-02, 1.480e-01, -3.872e-02, 1.230e-02, -1.795e-02, -4.544e-02, 2.310e-02, -1.826e-01, -4.322e-04, -5.085e-02, -1.604e-01, -1.015e-01, 1.450e-01, 8.899e-02)); + r += mul(s7_8, M4(-2.918e-02, -1.560e-02, 7.724e-02, 2.655e-02, 1.305e-02, -3.557e-02, 1.672e-02, -1.096e-01, -1.017e-01, -8.922e-02, -1.382e-02, -4.060e-02, -2.747e-02, 1.763e-01, -5.824e-02, 7.754e-02)); + r += V4(5.032e-02, -4.577e-02, 1.268e-02, -1.043e-02); + return r; +} + +V4 f2(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(5.596e-02, 6.943e-02, -9.947e-02, 6.927e-03, -2.689e-01, 1.489e-01, 1.433e-01, -8.788e-02, -2.760e-01, -1.684e-01, 3.374e-01, -1.597e-01, 1.809e-01, -4.356e-02, -3.220e-02, 3.343e-02)); + r += mul(s0_1, M4(2.311e-03, 6.202e-02, 5.539e-02, -2.832e-02, -1.119e-01, 2.494e-03, 8.241e-02, 4.263e-02, 5.947e-02, 5.792e-01, 7.347e-03, -5.233e-01, -2.318e-02, -3.264e-02, 9.149e-02, 1.913e-01)); + r += mul(s0_2, M4(7.400e-02, 2.716e-02, 8.377e-02, -5.535e-02, -1.384e-01, -2.959e-02, -2.358e-02, 4.064e-02, -3.272e-01, -1.154e-01, -1.282e-02, 1.296e-01, 1.348e-01, 7.577e-02, 5.781e-02, -8.975e-02)); + r += mul(s0_3, M4(-1.644e-02, -3.264e-02, 1.552e-01, -2.369e-02, -1.587e-01, -6.883e-02, -2.633e-01, 1.207e-01, -3.596e-02, -4.935e-02, 1.061e-01, 1.171e-01, -9.021e-02, -1.341e-01, 9.733e-02, 4.458e-02)); + r += mul(s0_4, M4(-7.350e-02, 1.915e-02, 3.980e-02, -1.548e-01, 2.778e-02, 6.400e-02, -2.679e-02, 2.614e-01, -5.313e-02, -3.638e-01, 3.060e-03, -1.356e-01, 8.916e-02, -6.320e-02, 1.008e-01, -1.072e-01)); + r += mul(s0_5, M4(-1.026e-01, 3.062e-02, 1.216e-01, 2.672e-02, -7.390e-02, 5.774e-02, 3.043e-01, -3.872e-02, 9.893e-02, -1.651e-01, -4.124e-01, -5.980e-02, 1.284e-01, 9.903e-02, -1.100e-01, 5.260e-02)); + r += mul(s0_6, M4(-1.704e-02, 2.078e-02, -4.136e-02, -1.215e-01, 7.739e-02, 3.368e-02, 2.705e-01, 1.507e-01, 6.234e-02, 8.265e-02, 8.168e-02, -2.070e-01, -4.027e-02, -1.179e-01, -2.789e-02, 2.922e-02)); + r += mul(s0_7, M4(-5.078e-02, -1.269e-01, 7.594e-02, -2.399e-02, -2.337e-01, -2.242e-01, -1.177e-01, -3.980e-02, 9.262e-02, 1.368e-01, 3.213e-01, 1.154e-02, 2.914e-02, 1.221e-02, 4.595e-02, -3.833e-02)); + r += mul(s0_8, M4(8.054e-03, 2.570e-02, -2.123e-02, -5.568e-02, -1.061e-02, 4.955e-02, 3.951e-02, -4.474e-02, 2.179e-01, 1.455e-01, 2.215e-01, -4.518e-02, 2.380e-02, -5.217e-02, 8.083e-02, 1.411e-01)); + r += mul(s1_0, M4(-1.332e-02, 1.908e-01, -1.272e-01, -8.897e-02, 6.893e-02, 4.808e-02, -1.235e-02, 1.406e-01, 9.182e-02, 1.199e-01, -6.087e-02, -2.790e-02, 7.823e-02, -7.443e-02, -2.908e-02, 7.824e-02)); + r += mul(s1_1, M4(-5.931e-02, -2.106e-01, -7.093e-03, 3.143e-01, -7.278e-03, -8.448e-02, -6.706e-02, 7.873e-02, -1.372e-01, 1.503e-02, 4.273e-03, 2.550e-01, 7.066e-02, 1.156e-02, 2.972e-02, 6.368e-02)); + r += mul(s1_2, M4(-1.457e-01, -1.103e-01, -5.727e-02, 1.685e-01, 8.429e-02, -4.365e-02, 9.143e-02, 4.470e-02, 7.318e-02, -6.442e-02, 5.918e-02, 1.633e-01, -1.041e-01, -1.029e-01, 1.642e-01, 8.357e-02)); + r += mul(s1_3, M4(-2.876e-02, -6.630e-02, -6.576e-02, 9.062e-02, -1.580e-01, -5.584e-02, -8.636e-02, 9.241e-02, -3.216e-02, 1.613e-01, -4.132e-02, 2.281e-02, 2.734e-02, 2.553e-02, 1.083e-01, -5.546e-02)); + r += mul(s1_4, M4(9.239e-02, -2.471e-02, 5.862e-02, -5.237e-02, -5.395e-02, 1.035e-01, -1.003e-01, 2.782e-02, -1.126e-02, -2.389e-01, -3.320e-02, -7.841e-02, 5.396e-02, 2.841e-02, 9.477e-02, -2.390e-01)); + r += mul(s1_5, M4(-1.362e-01, 3.032e-02, -7.620e-02, 1.458e-01, -1.179e-01, 1.034e-02, 1.727e-02, -4.245e-02, -7.083e-02, 7.070e-02, -4.095e-02, 5.322e-02, -1.408e-02, 3.720e-02, 5.996e-02, -4.981e-02)); + r += mul(s1_6, M4(1.119e-01, 8.073e-02, 5.773e-02, 2.301e-02, 5.561e-02, 2.241e-03, -7.863e-02, 5.573e-02, -7.112e-02, -9.685e-02, -1.772e-01, -3.446e-02, -1.049e-01, 1.026e-02, 1.957e-02, -1.111e-01)); + r += mul(s1_7, M4(1.788e-01, -2.716e-02, 1.019e-01, 2.178e-02, 1.246e-01, 1.107e-01, 1.697e-01, 1.167e-01, 3.394e-02, -1.176e-01, -2.129e-02, -3.989e-02, 2.066e-01, 8.348e-02, -3.966e-02, 1.921e-02)); + r += mul(s1_8, M4(1.814e-01, 1.194e-02, -3.687e-03, -2.048e-02, -5.610e-02, -1.853e-02, 4.549e-02, 6.164e-04, -5.818e-02, 5.473e-02, -1.331e-02, -1.554e-02, 7.833e-02, 9.653e-02, -4.808e-03, -1.758e-02)); + r += mul(s2_0, M4(6.169e-02, 5.514e-02, 3.773e-02, -6.746e-02, 6.614e-02, -8.601e-03, 1.393e-01, 1.328e-01, -3.773e-02, -9.326e-02, 7.894e-02, -3.562e-02, 4.718e-02, 8.964e-02, 8.342e-02, -2.218e-02)); + r += mul(s2_1, M4(2.138e-02, 4.727e-05, -7.793e-02, -1.449e-02, -9.726e-02, 2.636e-01, -1.008e-01, -1.360e-01, 9.358e-02, -2.191e-01, -1.389e-01, 1.010e-01, 1.833e-01, -2.234e-02, 8.280e-02, 1.099e-01)); + r += mul(s2_2, M4(-1.759e-02, 2.214e-02, -9.699e-02, -7.946e-02, 3.458e-01, 2.307e-01, 1.965e-02, -5.948e-02, -1.102e-01, 1.136e-01, 6.058e-02, -2.060e-01, -1.455e-01, 2.091e-01, -1.234e-01, -2.595e-02)); + r += mul(s2_3, M4(-3.891e-02, -4.991e-02, 7.644e-02, 8.675e-03, -1.237e-01, -1.090e-01, -6.923e-02, 1.674e-01, 6.834e-02, -1.947e-03, -2.001e-01, -2.587e-01, -6.223e-02, -1.757e-02, 4.044e-02, -2.019e-01)); + r += mul(s2_4, M4(-1.240e-01, -1.421e-01, -1.120e-02, 1.355e-01, -1.043e-01, 1.205e-01, -6.896e-02, 8.419e-02, 1.083e-01, -3.586e-01, -2.787e-01, 3.128e-01, 2.695e-01, 6.336e-02, 1.496e-01, 7.207e-02)); + r += mul(s2_5, M4(-1.943e-02, 4.023e-02, -9.246e-02, -2.339e-02, -1.184e-01, 1.636e-01, -1.181e-01, -6.135e-02, 1.293e-01, 7.349e-02, -3.035e-02, 1.341e-03, 1.462e-01, -1.693e-01, -6.412e-02, 1.047e-01)); + r += mul(s2_6, M4(1.248e-01, -4.353e-02, -6.607e-02, 3.145e-02, -1.563e-01, -1.372e-01, 1.860e-05, -4.642e-02, 1.864e-02, 7.264e-02, -9.642e-02, 1.876e-01, -4.477e-02, 1.522e-01, 1.609e-01, 1.611e-01)); + r += mul(s2_7, M4(6.286e-02, 1.131e-01, 4.975e-02, -6.677e-02, -2.744e-01, -4.851e-03, 1.142e-01, -8.230e-02, 1.155e-01, 1.004e-03, 3.373e-02, 1.243e-01, -1.140e-02, 3.190e-01, 1.543e-01, -2.304e-01)); + r += mul(s2_8, M4(1.952e-02, -3.838e-02, -1.306e-01, -2.731e-04, 1.470e-01, 2.674e-03, -2.177e-01, 2.223e-02, -2.050e-02, 2.408e-01, 6.113e-02, -1.239e-01, 1.999e-01, -7.711e-02, -1.954e-01, -2.232e-01)); + r += mul(s3_0, M4(1.559e-01, 3.444e-01, 2.037e-01, -1.465e-01, 1.257e-03, -9.577e-02, -6.696e-02, -1.273e-02, 4.017e-02, 3.491e-02, -8.291e-04, 1.119e-01, -8.614e-02, 7.718e-02, 2.744e-02, 5.497e-02)); + r += mul(s3_1, M4(-4.794e-02, -1.063e-01, -2.436e-02, 7.873e-02, 5.152e-02, 1.919e-02, 1.182e-01, 1.987e-01, -3.528e-02, -3.674e-02, -6.329e-02, 6.244e-02, 3.650e-02, -1.095e-01, -6.021e-02, 9.880e-02)); + r += mul(s3_2, M4(8.782e-02, -2.972e-02, -5.703e-02, 1.306e-01, 8.701e-02, -8.616e-02, 4.235e-03, -4.952e-02, -2.192e-02, 2.296e-02, -4.155e-02, 4.513e-03, -8.387e-02, 9.915e-02, 6.844e-02, 4.860e-02)); + r += mul(s3_3, M4(1.609e-01, 1.368e-01, 6.485e-02, 7.794e-02, -2.713e-03, -1.406e-02, -3.511e-03, 4.021e-02, -1.304e-01, 1.322e-02, 4.628e-02, -8.888e-02, -2.384e-02, -7.348e-03, 8.772e-02, 1.494e-02)); + r += mul(s3_4, M4(-1.010e-01, -9.351e-02, -1.047e-01, 2.298e-02, 1.029e-01, 9.090e-02, 6.553e-03, -7.160e-02, -8.154e-05, 2.276e-02, 9.211e-03, 1.375e-02, 1.216e-02, -5.997e-02, -2.742e-02, 9.009e-02)); + r += mul(s3_5, M4(1.007e-01, 3.867e-01, -5.350e-02, 4.043e-02, -1.333e-01, 2.413e-02, -5.320e-02, -5.714e-02, -3.149e-02, 1.844e-03, 4.310e-02, -1.117e-01, -2.069e-02, 2.987e-03, -1.693e-02, 4.311e-02)); + r += mul(s3_6, M4(1.419e-01, 5.698e-02, 5.687e-03, 6.534e-02, 8.299e-05, 9.204e-02, 6.563e-02, -2.972e-02, 2.281e-01, -1.643e-02, 4.670e-02, 1.436e-01, -1.159e-01, -5.028e-02, 1.157e-01, -7.019e-02)); + r += mul(s3_7, M4(-4.644e-02, -4.332e-02, -2.600e-01, 6.519e-02, -5.878e-02, 1.854e-02, 1.260e-01, -2.437e-02, 6.990e-02, 3.990e-02, 2.418e-02, 8.748e-02, 2.327e-02, 5.167e-03, -5.180e-02, -1.586e-01)); + r += mul(s3_8, M4(-7.066e-03, 1.938e-01, 2.519e-02, -5.551e-03, 1.238e-01, -1.177e-01, -8.184e-02, -6.361e-02, 7.968e-02, 3.828e-02, -2.906e-02, -2.967e-02, 7.054e-02, -6.567e-02, -4.154e-02, -8.246e-02)); + r += mul(s4_0, M4(-5.226e-03, -5.506e-02, 1.084e-01, 6.104e-02, -7.084e-02, -1.369e-02, 5.770e-02, 9.369e-03, 7.137e-02, 3.812e-02, -1.163e-01, -1.801e-01, -2.820e-02, -4.895e-02, -3.198e-02, -1.199e-01)); + r += mul(s4_1, M4(-7.016e-03, -1.376e-01, 1.139e-01, 3.146e-02, 4.089e-02, 1.179e-01, -7.702e-02, 7.841e-02, -9.047e-03, 5.866e-02, 1.310e-02, -1.178e-01, -1.314e-03, 9.423e-02, -1.281e-01, 8.136e-02)); + r += mul(s4_2, M4(-2.164e-02, -1.157e-01, 2.769e-03, -1.675e-01, 2.046e-02, -3.547e-02, -5.441e-02, 1.125e-01, 6.445e-02, 9.884e-02, 5.804e-02, -5.950e-02, -7.545e-02, 1.221e-02, -1.022e-01, 1.132e-02)); + r += mul(s4_3, M4(-5.272e-02, 9.168e-02, 7.058e-02, -1.049e-01, -1.167e-01, 1.090e-01, 3.349e-02, 1.393e-02, -2.392e-02, -2.323e-02, -7.106e-02, 5.207e-02, 1.703e-01, -1.519e-02, 1.283e-02, 2.979e-02)); + r += mul(s4_4, M4(1.874e-01, -1.966e-03, -5.432e-02, 5.125e-02, -2.042e-01, -2.495e-02, 5.208e-02, 1.425e-02, 7.137e-02, -1.373e-01, 5.823e-02, 1.683e-01, 1.286e-01, -1.747e-01, -9.492e-02, -4.643e-02)); + r += mul(s4_5, M4(1.174e-01, 9.680e-02, -3.946e-02, -5.568e-02, 1.585e-01, -1.490e-01, 5.321e-02, -2.085e-01, -1.114e-02, 2.950e-02, -2.756e-02, -1.348e-01, -1.992e-01, -3.037e-01, -9.906e-03, 1.090e-01)); + r += mul(s4_6, M4(1.406e-02, 1.203e-01, 8.815e-02, -7.641e-02, 1.344e-01, -8.767e-02, -1.154e-01, -7.974e-02, 9.987e-03, -6.403e-02, -8.446e-02, -3.506e-02, 5.380e-02, 6.236e-02, 7.203e-04, -3.519e-02)); + r += mul(s4_7, M4(1.950e-01, 3.658e-02, 6.341e-03, 7.395e-03, -7.013e-03, -1.984e-01, 9.983e-02, 2.809e-02, 1.391e-01, 9.638e-03, -1.054e-01, 3.263e-02, 5.608e-02, 6.084e-02, -4.368e-02, -1.041e-01)); + r += mul(s4_8, M4(-8.957e-03, 3.743e-02, -3.755e-02, -3.630e-03, -5.561e-02, -9.400e-02, 2.827e-02, 9.386e-02, -8.381e-02, -1.216e-02, 1.436e-01, 1.519e-02, -8.019e-02, -1.944e-01, -6.004e-02, -7.721e-02)); + r += mul(s5_0, M4(-3.770e-02, -3.560e-02, 1.079e-01, 1.237e-02, 5.456e-03, -3.473e-02, 7.107e-02, 1.288e-01, -1.319e-01, -2.477e-02, -2.558e-02, -2.240e-01, -2.778e-02, -5.581e-02, 2.795e-02, -1.127e-01)); + r += mul(s5_1, M4(4.309e-02, -7.101e-02, -1.136e-01, -4.001e-02, -5.329e-02, 2.163e-02, -1.911e-01, 1.211e-01, 3.649e-01, 1.931e-01, -1.604e-01, -1.174e-01, -1.129e-01, -7.409e-02, 8.196e-02, -1.679e-02)); + r += mul(s5_2, M4(1.002e-02, 4.060e-03, 2.965e-02, 6.396e-02, -2.982e-02, -2.065e-02, -5.606e-02, 6.198e-02, -2.529e-01, -8.005e-02, -2.032e-01, 1.956e-01, 2.000e-01, 8.002e-02, 1.950e-01, -8.213e-02)); + r += mul(s5_3, M4(-5.168e-02, -4.015e-02, -1.103e-01, -2.920e-01, 7.194e-02, 4.356e-02, 5.759e-02, -4.769e-04, -2.601e-01, -2.538e-02, -2.720e-02, -9.741e-02, -1.163e-02, 4.238e-02, 1.093e-02, 1.766e-01)); + r += mul(s5_4, M4(9.714e-02, -2.569e-01, -2.301e-01, 2.634e-01, 5.650e-02, 2.310e-01, 1.422e-01, -1.343e-01, 1.473e-01, 1.136e-01, -2.179e-02, 1.065e-02, -3.685e-01, -1.466e-01, 2.465e-01, -1.020e-02)); + r += mul(s5_5, M4(-2.277e-01, 3.379e-02, 1.500e-01, -1.561e-01, 8.026e-02, -1.333e-01, 1.360e-01, 1.892e-03, -2.089e-01, -1.216e-01, -2.138e-01, 3.848e-02, -2.357e-02, -5.525e-02, 1.345e-01, -6.481e-02)); + r += mul(s5_6, M4(-4.744e-01, 1.842e-01, -1.170e-01, 6.383e-02, 4.721e-02, 8.683e-02, 1.298e-02, -1.428e-02, -1.004e-01, 7.408e-02, 7.070e-02, 5.249e-02, -8.792e-02, -8.696e-02, 2.164e-02, -1.972e-02)); + r += mul(s5_7, M4(6.505e-02, 7.645e-02, 5.747e-02, -2.255e-02, 7.953e-02, 3.267e-02, -4.402e-02, 6.919e-02, 3.438e-02, 1.884e-01, -1.650e-01, 9.716e-03, -2.982e-02, -1.122e-02, 2.533e-01, -6.158e-02)); + r += mul(s5_8, M4(-3.201e-02, 4.400e-02, -3.622e-02, 1.647e-02, 1.066e-01, 5.696e-02, -9.074e-02, 9.751e-02, -2.343e-01, 7.295e-02, -1.021e-01, -1.173e-02, -4.465e-02, -3.944e-02, -8.525e-02, -4.887e-02)); + r += mul(s6_0, M4(9.043e-02, 7.508e-03, 2.129e-02, 1.540e-02, -7.932e-02, -1.045e-01, -1.140e-01, -1.687e-01, 1.802e-01, 7.851e-02, -7.967e-02, -7.167e-03, 6.469e-02, -8.154e-02, 4.053e-02, 5.567e-02)); + r += mul(s6_1, M4(2.664e-02, 1.391e-01, 3.487e-02, -4.714e-02, -1.321e-01, 9.727e-02, -6.896e-02, -8.919e-02, -1.120e-01, -8.822e-02, 1.392e-01, -3.856e-02, 2.445e-02, 1.520e-01, 5.066e-02, -7.421e-02)); + r += mul(s6_2, M4(3.721e-02, -1.419e-01, -2.924e-02, 1.156e-01, 7.611e-03, -9.886e-02, -1.088e-01, 1.078e-01, -1.667e-01, -4.557e-03, -1.189e-03, -5.344e-02, -2.037e-01, -1.039e-01, -5.445e-02, -1.639e-02)); + r += mul(s6_3, M4(-8.285e-02, 7.651e-02, 6.793e-02, -1.327e-01, -7.476e-02, 2.957e-02, -1.402e-01, -1.597e-02, 1.087e-01, 4.267e-02, -4.866e-02, 7.123e-02, 1.043e-01, 7.398e-02, 6.662e-02, 2.380e-01)); + r += mul(s6_4, M4(2.692e-02, -1.144e-02, -1.297e-01, 4.209e-02, -2.075e-02, -2.428e-01, 1.093e-01, -4.059e-03, 8.527e-02, -3.677e-02, -2.378e-01, 2.416e-01, 3.793e-02, 5.192e-02, -1.743e-01, 1.241e-01)); + r += mul(s6_5, M4(-6.434e-02, 4.554e-03, 5.535e-02, 1.197e-01, 1.461e-01, -2.247e-01, 2.250e-02, 1.630e-01, 1.435e-01, -2.037e-01, -1.038e-01, 3.018e-01, -1.497e-01, 2.416e-02, -1.329e-01, -1.305e-01)); + r += mul(s6_6, M4(1.234e-02, 2.975e-02, -1.131e-01, -9.281e-02, -1.997e-01, 8.254e-02, -4.436e-02, 2.195e-01, 2.740e-02, -1.035e-02, 7.146e-02, 4.567e-02, 9.093e-03, 1.457e-01, 1.219e-01, 6.470e-02)); + r += mul(s6_7, M4(-1.102e-01, 1.520e-01, 2.849e-02, 4.548e-02, -8.167e-02, -2.549e-02, 1.165e-01, 1.373e-02, -5.793e-02, -1.113e-01, 1.568e-01, 9.372e-02, -1.171e-01, 1.456e-01, -9.427e-02, -9.116e-02)); + r += mul(s6_8, M4(6.940e-03, -1.677e-01, -2.775e-01, -3.968e-02, -8.314e-02, 4.127e-02, -1.911e-02, -6.754e-02, -1.979e-01, -1.001e-02, 1.990e-01, 5.028e-03, 1.673e-02, 4.765e-02, -9.003e-02, 4.037e-02)); + r += mul(s7_0, M4(-1.145e-01, 8.301e-02, 6.208e-02, 2.215e-01, 9.340e-02, 5.217e-02, -2.014e-02, -1.154e-01, 1.706e-01, -7.559e-02, -3.903e-02, -7.485e-02, 3.039e-02, -1.909e-02, 3.608e-02, -6.160e-02)); + r += mul(s7_1, M4(1.332e-01, 1.916e-01, -3.478e-02, 9.917e-02, -4.658e-02, -7.133e-03, -2.925e-02, -1.005e-01, 8.696e-02, -1.323e-01, 6.163e-02, -1.092e-01, 5.049e-02, -9.551e-02, 2.854e-02, -2.305e-02)); + r += mul(s7_2, M4(1.011e-01, 1.017e-01, -3.755e-02, 1.079e-01, 6.972e-03, 1.535e-02, -2.212e-02, 6.117e-02, -7.020e-02, -7.368e-03, -1.125e-01, -3.364e-03, 6.300e-02, 6.487e-02, -1.301e-02, -2.883e-02)); + r += mul(s7_3, M4(-1.024e-01, -5.268e-03, 4.721e-03, -1.492e-01, 3.963e-03, 1.960e-02, -1.616e-01, 5.027e-02, -1.413e-01, -2.592e-02, 4.603e-02, -9.958e-02, 1.733e-02, -3.088e-03, -3.237e-02, 3.956e-02)); + r += mul(s7_4, M4(2.329e-02, -1.743e-01, 2.547e-02, -4.663e-02, -4.411e-02, -1.693e-01, 1.284e-01, -1.596e-02, 9.503e-03, -6.803e-02, -7.773e-02, 7.189e-02, 2.373e-01, 1.594e-03, 9.512e-03, 6.362e-02)); + r += mul(s7_5, M4(7.467e-02, -9.632e-03, 9.902e-03, 2.912e-03, 1.204e-01, 4.616e-02, 4.934e-04, 1.086e-01, -5.761e-02, -5.369e-02, 1.120e-01, 7.251e-02, 1.033e-01, 1.897e-01, -2.853e-02, -2.763e-01)); + r += mul(s7_6, M4(-6.446e-02, -1.460e-02, 2.759e-02, -5.637e-03, -1.906e-01, 1.099e-03, 5.191e-02, 7.905e-02, 3.978e-02, 1.765e-02, -2.394e-02, 3.328e-02, 6.826e-03, -1.233e-01, -1.859e-02, 3.114e-02)); + r += mul(s7_7, M4(-4.130e-02, 1.134e-01, 7.295e-02, 6.430e-02, 1.268e-01, 1.275e-01, 1.018e-01, 5.018e-02, 6.976e-04, -6.946e-02, -7.873e-02, -3.524e-02, -1.080e-02, 2.427e-02, 1.715e-01, 3.197e-02)); + r += mul(s7_8, M4(-6.846e-02, -2.906e-02, -1.030e-01, -8.272e-02, -1.521e-01, 8.494e-02, 8.006e-02, -1.111e-02, -3.839e-02, 5.480e-02, 1.092e-01, 7.521e-02, 2.335e-01, -1.159e-01, 1.500e-02, 4.809e-02)); + r += V4(-6.811e-02, 2.117e-02, 1.429e-02, 1.018e-02); + return r; +} + +V4 f3(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-8.859e-02, 6.322e-02, 2.170e-02, -5.152e-02, -9.958e-02, -5.578e-02, -3.615e-02, -3.355e-02, 8.025e-02, -4.163e-01, 1.121e-01, -7.176e-02, 8.557e-02, -6.191e-02, -8.471e-03, 1.507e-01)); + r += mul(s0_1, M4(-1.701e-02, 6.147e-02, -2.650e-02, -1.173e-01, 2.083e-01, 2.300e-01, -2.547e-01, 9.541e-02, 2.725e-01, -1.345e-01, -7.233e-02, 5.820e-02, 2.792e-02, 1.222e-02, -6.244e-02, 3.862e-03)); + r += mul(s0_2, M4(2.715e-02, 3.736e-02, 2.085e-02, -7.133e-02, 1.404e-01, -6.124e-02, -9.407e-02, 9.857e-02, -9.245e-02, -3.528e-01, 2.955e-02, 1.487e-01, 5.531e-02, 6.103e-04, 1.288e-02, 7.338e-02)); + r += mul(s0_3, M4(1.545e-02, -9.382e-02, -1.221e-01, 5.337e-02, 1.660e-01, 1.326e-01, 6.217e-02, -1.993e-01, -8.731e-04, -1.082e-01, -3.228e-01, 3.264e-01, -1.631e-01, 1.135e-01, -6.737e-02, -5.544e-02)); + r += mul(s0_4, M4(-3.348e-02, -3.130e-02, -3.545e-02, -5.740e-02, -1.497e-02, -2.188e-01, 1.266e-01, 1.900e-01, -1.525e-01, -3.757e-01, -9.728e-02, 1.389e-01, -2.877e-02, -1.662e-01, -1.350e-01, 1.802e-01)); + r += mul(s0_5, M4(-1.022e-01, -5.672e-03, -6.475e-02, -9.060e-03, -1.336e-01, -2.171e-02, 2.962e-02, -2.329e-01, 6.908e-02, -4.969e-02, -2.102e-01, 8.120e-03, 1.004e-01, 2.172e-01, 1.249e-01, 5.419e-02)); + r += mul(s0_6, M4(1.206e-01, 6.503e-02, -1.735e-02, 4.117e-02, -3.794e-02, 5.942e-02, 7.644e-02, -2.022e-01, 2.359e-01, 1.387e-01, -2.564e-01, 2.318e-01, -5.847e-03, -3.742e-02, -1.891e-01, 1.058e-01)); + r += mul(s0_7, M4(8.511e-02, 9.170e-02, -1.099e-01, 1.121e-01, -5.193e-02, 8.655e-02, 1.825e-01, 1.038e-01, 3.536e-02, 2.280e-01, 9.794e-02, 1.558e-01, -2.327e-02, -7.911e-02, 5.903e-02, -1.061e-01)); + r += mul(s0_8, M4(-1.947e-02, -3.460e-02, 1.847e-01, -5.716e-02, 8.408e-02, 2.013e-01, -1.249e-01, -8.687e-02, -4.326e-01, 2.425e-01, -2.433e-01, -1.076e-01, 1.519e-01, -1.366e-02, 6.007e-02, -6.044e-02)); + r += mul(s1_0, M4(-6.492e-02, -2.177e-02, -7.928e-03, 5.827e-02, -1.468e-02, -8.457e-02, -9.106e-02, -6.499e-02, 7.837e-02, 3.092e-03, 2.215e-02, -1.439e-01, 1.451e-01, -1.505e-01, 1.376e-02, -4.341e-02)); + r += mul(s1_1, M4(-1.178e-01, 1.866e-01, 9.888e-02, -9.040e-02, -1.063e-03, 1.315e-01, -4.355e-02, 1.449e-02, 3.112e-02, -4.436e-02, -2.143e-02, -3.597e-02, 1.361e-02, -9.821e-02, -1.438e-01, -1.918e-02)); + r += mul(s1_2, M4(1.723e-01, 9.304e-02, -5.218e-02, 1.128e-01, -2.047e-02, -3.860e-02, -1.294e-01, 5.198e-02, -2.544e-02, -5.171e-02, 5.576e-02, 2.431e-02, 2.018e-03, 1.655e-01, 1.084e-01, -7.961e-02)); + r += mul(s1_3, M4(1.431e-01, 1.264e-01, 2.663e-01, -7.861e-02, -2.184e-01, 2.635e-02, -8.562e-02, -8.998e-02, -5.756e-02, -1.606e-01, -1.756e-02, -5.559e-03, 9.406e-03, 1.182e-01, -3.550e-01, 4.964e-02)); + r += mul(s1_4, M4(1.833e-01, 4.676e-03, 3.887e-02, 1.008e-01, 3.551e-02, 7.158e-02, 9.204e-02, -1.118e-01, -1.294e-01, -6.548e-02, -8.796e-02, -2.444e-02, -2.510e-02, -2.399e-01, -2.330e-01, 1.147e-01)); + r += mul(s1_5, M4(6.889e-02, -1.060e-03, -1.414e-01, 5.237e-02, 2.064e-02, -8.606e-03, 1.036e-01, 2.518e-02, -1.206e-02, 1.614e-02, -8.587e-02, -7.272e-02, 5.863e-02, -9.660e-03, -6.705e-02, -1.294e-01)); + r += mul(s1_6, M4(7.851e-02, -8.792e-02, 1.285e-01, -1.097e-01, 6.968e-02, 3.942e-02, 8.202e-02, 1.824e-02, 6.559e-02, 2.335e-02, 1.814e-02, 6.063e-02, 6.711e-03, 1.874e-04, -1.354e-01, 1.427e-01)); + r += mul(s1_7, M4(-7.320e-02, 2.411e-01, 4.008e-02, -1.093e-01, 7.410e-03, -8.033e-04, 5.956e-02, -1.279e-01, 8.079e-02, -6.280e-03, -6.561e-02, 1.949e-02, 1.092e-02, 2.485e-02, 5.006e-03, 8.929e-03)); + r += mul(s1_8, M4(4.080e-02, -4.657e-02, -1.572e-01, -1.018e-01, 1.786e-02, 3.402e-02, -1.280e-01, 4.746e-02, 1.041e-01, -6.042e-02, 6.023e-02, -2.181e-02, 1.002e-01, 1.014e-01, 5.495e-02, -8.713e-02)); + r += mul(s2_0, M4(1.541e-02, -1.639e-02, 2.137e-02, -8.870e-02, -2.421e-01, 1.216e-01, 8.481e-03, -1.146e-01, -8.107e-03, -1.252e-01, 1.507e-02, -1.246e-02, 1.972e-01, -2.484e-01, 1.043e-02, 9.379e-02)); + r += mul(s2_1, M4(7.847e-02, 2.798e-02, 4.175e-02, 4.999e-02, 3.078e-02, 6.905e-02, -1.325e-01, -7.661e-02, -2.406e-01, 4.476e-02, 1.869e-02, -7.977e-02, 4.665e-02, -1.554e-01, -5.259e-02, -2.868e-02)); + r += mul(s2_2, M4(-8.034e-03, -5.185e-02, -3.441e-02, 6.072e-02, -1.140e-01, 1.360e-01, -5.936e-02, -2.627e-01, 5.693e-02, -1.242e-01, -1.696e-01, -9.322e-02, -1.642e-01, 3.444e-02, -8.812e-02, -2.324e-01)); + r += mul(s2_3, M4(-5.840e-02, 4.646e-02, -1.123e-01, 1.928e-02, -5.682e-02, 1.747e-01, -1.014e-02, -3.330e-03, -8.661e-02, 1.380e-01, 1.094e-01, 2.438e-01, 1.066e-01, 1.375e-01, -6.315e-02, 1.153e-02)); + r += mul(s2_4, M4(2.190e-01, -4.420e-02, 4.606e-02, -4.466e-02, 2.064e-01, 4.502e-02, -9.403e-03, 3.311e-02, -8.319e-02, 5.644e-01, -6.043e-02, 5.784e-02, -1.040e-01, 3.443e-02, -1.610e-02, -3.490e-01)); + r += mul(s2_5, M4(-1.043e-01, -2.458e-01, 5.993e-02, 1.761e-02, 8.658e-02, 1.438e-02, 2.610e-02, 9.675e-02, 4.919e-02, 2.783e-01, -3.483e-02, -6.773e-02, 2.021e-01, -5.194e-02, 2.805e-01, -3.834e-02)); + r += mul(s2_6, M4(-2.257e-03, -8.335e-03, -8.261e-02, 3.041e-02, -7.001e-02, 1.016e-02, -2.078e-01, -1.798e-01, -3.439e-02, 2.334e-01, 2.715e-01, 3.900e-02, 8.569e-02, -1.696e-01, -3.142e-01, 3.344e-02)); + r += mul(s2_7, M4(7.281e-02, 6.357e-02, 1.869e-03, 4.939e-02, -1.440e-01, 4.230e-02, -8.573e-02, -1.929e-01, 8.670e-02, -1.610e-01, 2.438e-01, 6.542e-02, 1.191e-01, -1.737e-01, 5.330e-02, -1.193e-01)); + r += mul(s2_8, M4(-8.114e-02, 2.759e-02, -6.027e-02, 8.285e-02, 1.792e-01, -8.401e-02, 2.750e-02, 7.538e-02, -4.844e-02, -4.237e-01, 1.403e-01, -6.548e-02, 1.480e-01, -1.369e-01, -1.154e-02, -1.547e-01)); + r += mul(s3_0, M4(-5.719e-02, 7.109e-02, -1.870e-01, 9.910e-02, -8.484e-03, 4.225e-02, 1.670e-01, -2.912e-02, 4.867e-02, -1.222e-01, 9.972e-02, -8.255e-02, 2.865e-02, -7.476e-02, 8.196e-02, -6.590e-02)); + r += mul(s3_1, M4(2.877e-02, 1.382e-01, 2.887e-02, -1.182e-01, 1.169e-01, -7.158e-02, -5.751e-02, -4.480e-02, 4.399e-02, -1.564e-01, -5.860e-02, -1.704e-02, 5.989e-02, -6.261e-02, -6.685e-02, 6.785e-02)); + r += mul(s3_2, M4(2.990e-01, -1.112e-01, -5.059e-02, 3.883e-02, -1.041e-01, 1.087e-01, 9.495e-02, 7.279e-02, -1.640e-02, -1.135e-01, -9.370e-02, -1.178e-01, 6.239e-02, 1.673e-03, -1.302e-01, -9.523e-02)); + r += mul(s3_3, M4(2.498e-01, 1.568e-01, 3.136e-01, -8.231e-02, 1.195e-02, 3.503e-02, -1.552e-01, -1.291e-02, -6.553e-02, 1.039e-01, 5.600e-02, 7.192e-02, -6.076e-02, 1.011e-01, 1.472e-01, -7.687e-02)); + r += mul(s3_4, M4(-1.014e-01, 6.270e-03, -5.076e-02, -3.396e-01, -7.819e-02, -1.129e-01, -3.489e-02, -1.763e-02, 3.223e-02, 1.190e-01, -4.928e-02, -1.744e-01, 4.950e-02, 1.974e-02, 8.423e-02, 6.390e-02)); + r += mul(s3_5, M4(1.391e-01, -9.050e-02, -1.123e-01, -9.988e-02, -9.684e-02, -1.058e-01, 5.984e-02, 8.850e-03, 1.291e-01, -6.571e-02, -9.918e-03, -3.292e-02, -9.868e-02, -2.736e-02, 2.082e-02, -7.922e-02)); + r += mul(s3_6, M4(-1.762e-02, -3.843e-02, 8.312e-02, 2.341e-02, 8.817e-02, 3.820e-03, -5.261e-02, 3.950e-02, -3.782e-04, 5.334e-02, 8.513e-02, 1.353e-02, 1.302e-02, -7.066e-02, 5.351e-03, 7.396e-02)); + r += mul(s3_7, M4(2.824e-02, 1.439e-01, 5.632e-02, 1.106e-01, 5.794e-02, -2.101e-02, 1.550e-01, -1.765e-02, -5.208e-02, -4.870e-02, -1.031e-01, -2.989e-02, 3.582e-02, 1.657e-02, -6.794e-02, 8.592e-02)); + r += mul(s3_8, M4(-1.181e-01, 1.001e-01, -2.164e-01, -3.062e-02, -9.708e-03, -1.127e-01, -5.188e-02, 1.136e-01, -4.283e-02, -4.564e-02, -1.081e-01, -8.180e-02, 1.733e-01, 7.093e-03, 4.043e-02, 2.436e-02)); + r += mul(s4_0, M4(1.127e-01, 4.974e-02, -1.839e-02, 6.811e-02, -4.333e-02, -1.329e-02, 2.155e-02, -2.119e-02, -2.256e-02, -2.323e-02, -1.048e-01, -1.424e-01, -1.072e-02, -1.559e-02, -1.120e-01, -7.210e-02)); + r += mul(s4_1, M4(-4.518e-02, 1.753e-01, 1.002e-02, 1.710e-01, -2.514e-02, 1.031e-01, -1.332e-01, 1.399e-01, 9.279e-03, -2.348e-01, 1.424e-03, 9.753e-02, -1.115e-01, 2.149e-02, 5.900e-02, 6.065e-02)); + r += mul(s4_2, M4(-7.765e-02, -5.987e-02, -4.236e-02, 1.478e-02, -1.527e-01, 1.483e-02, 5.999e-02, -1.747e-01, 2.443e-02, -3.329e-02, 2.952e-02, -1.813e-02, 1.967e-01, 6.332e-02, -5.620e-02, -3.235e-02)); + r += mul(s4_3, M4(5.791e-02, 4.891e-04, 9.614e-02, -6.785e-02, -2.669e-02, 5.869e-04, 1.837e-02, -1.353e-01, -3.811e-02, 1.064e-01, 1.230e-01, -4.896e-02, -8.791e-03, -6.746e-02, -1.566e-01, 6.373e-02)); + r += mul(s4_4, M4(-7.715e-02, -3.067e-02, 1.021e-02, -7.027e-02, -9.642e-02, -1.257e-01, 1.760e-01, 8.355e-02, 8.765e-02, -2.392e-02, 1.708e-02, 4.817e-02, 2.521e-01, -1.255e-02, -2.305e-03, 1.793e-01)); + r += mul(s4_5, M4(-1.933e-02, 2.397e-03, 3.774e-02, -6.654e-02, 1.599e-01, -1.372e-02, 7.945e-02, 3.182e-03, -1.790e-01, -1.861e-02, 2.315e-02, 6.369e-02, 3.996e-01, 2.077e-01, 4.052e-02, 7.993e-02)); + r += mul(s4_6, M4(5.925e-02, 5.322e-02, -6.143e-02, -2.917e-02, -4.093e-02, 2.257e-02, -2.946e-03, -1.271e-02, -9.013e-02, 8.076e-02, 2.692e-02, -1.875e-02, -1.806e-02, -2.695e-02, -2.003e-01, -7.395e-02)); + r += mul(s4_7, M4(6.590e-02, -1.440e-01, 7.175e-02, 5.587e-02, 3.464e-02, -1.546e-02, -3.360e-01, -6.753e-02, 2.334e-02, 3.456e-02, 1.933e-01, -7.728e-02, 8.228e-02, -4.761e-02, -3.199e-01, 8.885e-02)); + r += mul(s4_8, M4(-6.131e-02, 1.422e-01, -9.556e-02, -4.104e-04, 2.658e-01, -2.449e-01, 9.356e-02, -5.919e-02, 1.237e-01, -1.111e-01, 1.264e-01, 5.252e-03, 2.174e-01, -8.301e-02, -7.269e-02, -2.009e-02)); + r += mul(s5_0, M4(1.831e-01, 7.275e-02, -1.597e-01, -1.629e-02, 1.007e-01, -1.088e-01, 2.198e-01, 3.281e-03, 1.399e-02, -1.966e-02, -1.126e-01, -2.027e-01, -4.323e-02, 7.016e-02, -5.852e-02, 6.758e-03)); + r += mul(s5_1, M4(1.122e-02, -1.328e-01, 4.639e-02, -2.091e-01, 8.031e-02, 1.596e-01, -4.684e-02, 9.917e-02, -2.690e-01, -1.123e-02, 1.155e-01, -3.281e-02, -2.568e-02, -8.358e-03, -7.061e-03, -3.356e-02)); + r += mul(s5_2, M4(-5.978e-02, -8.479e-02, -2.281e-03, -1.070e-01, -4.493e-02, -2.604e-03, -4.411e-02, -1.266e-01, 2.704e-01, 2.154e-01, -8.255e-02, -4.801e-02, -1.554e-02, -2.474e-02, 5.383e-02, -9.288e-02)); + r += mul(s5_3, M4(-1.631e-01, 6.184e-02, -1.479e-01, 1.227e-01, 2.307e-02, -1.954e-02, 1.013e-01, 3.237e-03, 1.406e-01, -9.271e-02, -7.872e-02, -2.719e-03, -1.360e-01, -2.956e-02, 1.636e-01, -7.006e-02)); + r += mul(s5_4, M4(-1.343e-01, 2.153e-01, -2.239e-01, -4.053e-01, 6.613e-02, -1.090e-02, 8.518e-02, 2.240e-01, -2.118e-01, 3.041e-02, -1.363e-01, 4.843e-03, 8.550e-02, 3.119e-02, 2.152e-01, -1.063e-01)); + r += mul(s5_5, M4(-1.837e-02, -1.025e-01, 7.395e-02, -1.662e-01, 1.619e-01, -8.360e-02, 7.945e-02, 1.230e-01, -4.636e-02, 1.337e-01, 1.534e-01, 1.928e-01, -1.803e-02, 9.599e-03, 6.785e-02, -4.536e-02)); + r += mul(s5_6, M4(9.095e-02, 3.857e-01, 1.256e-01, 3.445e-01, 5.654e-02, 1.214e-01, 2.543e-02, 9.302e-02, 1.886e-02, 1.136e-02, -1.681e-01, -7.571e-02, -1.642e-01, 7.446e-02, 1.367e-01, -3.871e-02)); + r += mul(s5_7, M4(2.691e-02, -2.795e-01, -5.362e-02, 1.358e-01, -1.050e-02, 2.046e-01, 1.565e-01, 1.966e-02, 2.583e-02, 2.795e-01, -1.754e-01, -5.247e-02, -1.777e-01, -3.521e-02, 1.460e-01, -4.981e-02)); + r += mul(s5_8, M4(1.238e-01, 3.012e-02, -5.700e-02, 1.567e-01, -6.813e-02, 5.409e-02, 1.131e-01, -1.371e-01, 1.154e-01, 1.418e-01, -2.079e-01, -6.996e-02, 1.199e-01, -5.648e-02, 1.825e-01, 1.458e-02)); + r += mul(s6_0, M4(1.084e-01, 3.154e-02, -5.662e-02, -4.178e-02, -3.714e-02, -1.673e-02, -5.654e-03, 3.828e-02, 3.957e-02, 1.144e-01, -1.146e-01, -2.938e-02, 9.624e-02, -3.715e-02, 1.081e-02, 5.599e-02)); + r += mul(s6_1, M4(9.831e-02, 1.365e-01, 2.181e-01, 1.342e-01, -7.069e-02, -2.787e-02, -1.186e-02, 1.142e-01, 8.013e-02, 1.136e-01, 9.548e-02, -2.485e-02, -6.512e-02, 2.538e-02, -2.026e-01, -4.354e-03)); + r += mul(s6_2, M4(-4.875e-02, 1.382e-01, 1.491e-01, -3.889e-02, -9.066e-02, -9.944e-02, 4.987e-02, 1.776e-01, -1.305e-03, -6.886e-02, 7.841e-02, 4.010e-02, -4.577e-02, 8.094e-04, 1.313e-01, 2.731e-02)); + r += mul(s6_3, M4(-1.122e-01, 1.067e-01, -3.704e-02, 9.418e-02, -5.281e-02, -2.233e-02, -1.779e-02, 5.766e-02, 1.673e-01, 9.455e-02, -2.049e-01, -2.730e-01, 4.742e-02, -1.450e-01, 5.864e-02, -6.473e-02)); + r += mul(s6_4, M4(9.616e-03, 1.394e-01, -9.777e-02, 7.508e-02, 4.562e-02, 7.005e-02, -2.097e-02, 1.196e-01, -5.153e-02, -1.973e-01, 2.292e-03, -1.021e-01, 2.530e-02, -9.281e-03, -1.504e-02, -1.252e-02)); + r += mul(s6_5, M4(-1.160e-01, 7.719e-02, 3.648e-02, 1.606e-01, -3.811e-02, -6.909e-02, 1.368e-01, -7.477e-03, -1.987e-03, -1.014e-01, -4.389e-02, -2.695e-02, -9.125e-02, -9.361e-02, 2.056e-01, -8.178e-02)); + r += mul(s6_6, M4(4.554e-02, 9.046e-02, 1.427e-01, -4.304e-02, -5.428e-03, 3.404e-01, 7.173e-02, -1.005e-02, -2.768e-03, -3.836e-03, -2.008e-01, -1.955e-01, -9.907e-03, -2.243e-03, 1.743e-02, -3.008e-03)); + r += mul(s6_7, M4(7.102e-02, -2.657e-02, 2.590e-01, 1.251e-01, 1.525e-01, 2.843e-02, -1.870e-01, 1.200e-01, -1.873e-01, 9.268e-02, 6.729e-02, -1.300e-01, 4.985e-02, 1.899e-01, -2.683e-02, 1.719e-02)); + r += mul(s6_8, M4(-1.102e-01, -7.919e-02, 4.716e-02, 8.983e-02, -1.152e-01, -1.537e-02, 9.967e-02, 1.016e-01, -5.071e-03, 1.274e-01, -8.979e-02, -4.063e-02, -1.750e-02, 1.179e-01, 1.003e-01, 1.702e-01)); + r += mul(s7_0, M4(5.322e-02, 4.872e-02, -1.469e-01, -6.719e-02, -1.084e-01, 7.051e-03, 6.497e-02, -5.518e-02, 4.297e-02, 1.155e-01, 2.677e-02, -2.306e-02, -2.999e-03, 5.815e-02, -1.004e-03, 1.849e-04)); + r += mul(s7_1, M4(-2.266e-02, 7.573e-02, -9.788e-02, -7.704e-02, 4.220e-02, -4.042e-03, -4.925e-02, -8.605e-04, -1.845e-02, 1.041e-01, 3.969e-02, -3.472e-02, -3.225e-02, 3.116e-02, 1.546e-01, -4.323e-02)); + r += mul(s7_2, M4(1.660e-02, -7.495e-03, 2.067e-02, 3.520e-02, -3.139e-02, -9.697e-02, -5.558e-02, 1.428e-01, 1.365e-02, -8.805e-02, 1.264e-01, 7.365e-02, 1.769e-01, -6.739e-02, 4.272e-02, 5.651e-02)); + r += mul(s7_3, M4(-1.428e-02, -8.794e-03, -1.057e-01, -8.956e-02, -5.146e-02, -3.932e-02, 2.349e-01, -9.492e-03, 3.855e-02, -6.862e-02, -1.941e-02, -9.356e-02, 3.056e-02, -1.250e-01, -1.463e-03, -1.228e-02)); + r += mul(s7_4, M4(6.866e-02, -5.040e-02, -1.617e-01, -3.817e-02, 6.959e-02, -1.202e-03, 1.496e-01, 9.141e-03, -1.083e-02, -6.471e-02, -6.832e-03, -1.079e-01, -2.617e-02, 1.955e-02, -6.724e-03, -9.354e-02)); + r += mul(s7_5, M4(-2.314e-03, 4.890e-03, 5.785e-02, 1.236e-01, 5.738e-03, 7.076e-02, -1.323e-01, -6.343e-02, 6.766e-02, -2.212e-02, -1.208e-01, -3.177e-02, 1.398e-02, -1.363e-02, 7.405e-03, 6.040e-02)); + r += mul(s7_6, M4(8.466e-03, 1.666e-02, 2.547e-02, 1.559e-02, 3.841e-03, -5.136e-02, -1.325e-01, -1.469e-01, 3.979e-02, 1.388e-02, -7.887e-02, -5.276e-02, 1.130e-02, 3.160e-03, 1.594e-01, -2.606e-02)); + r += mul(s7_7, M4(-9.227e-02, -1.744e-01, -2.784e-03, -9.271e-02, 1.806e-01, -1.583e-01, -7.984e-02, -5.001e-02, -2.769e-02, -5.131e-02, -2.440e-02, -9.161e-02, -1.992e-01, -1.213e-01, 5.715e-02, 4.442e-02)); + r += mul(s7_8, M4(-2.856e-02, 1.083e-01, -8.283e-02, -1.027e-01, -9.016e-02, -1.557e-01, -2.356e-02, -1.704e-02, -3.342e-02, 1.072e-01, 5.325e-02, -1.008e-01, 1.323e-01, -1.333e-01, -1.458e-02, -6.686e-02)); + r += V4(-3.986e-02, 1.071e-02, 2.911e-02, -3.068e-02); + return r; +} + +void Pass5(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = Rmp8x8(tid.x) + blockStart; + uint2 size = GetInputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = (gxy + 0.5) * pt; + + V4 s0_0 = l0(-1.0, -1.0); + V4 s0_1 = l0(0.0, -1.0); + V4 s0_2 = l0(1.0, -1.0); + V4 s0_3 = l0(-1.0, 0.0); + V4 s0_4 = l0(0.0, 0.0); + V4 s0_5 = l0(1.0, 0.0); + V4 s0_6 = l0(-1.0, 1.0); + V4 s0_7 = l0(0.0, 1.0); + V4 s0_8 = l0(1.0, 1.0); + V4 s1_0 = -max(-s0_0, 0.0); + V4 s1_1 = -max(-s0_1, 0.0); + V4 s1_2 = -max(-s0_2, 0.0); + V4 s1_3 = -max(-s0_3, 0.0); + V4 s1_4 = -max(-s0_4, 0.0); + V4 s1_5 = -max(-s0_5, 0.0); + V4 s1_6 = -max(-s0_6, 0.0); + V4 s1_7 = -max(-s0_7, 0.0); + V4 s1_8 = -max(-s0_8, 0.0); + s0_0 = max(s0_0, 0.0); + s0_1 = max(s0_1, 0.0); + s0_2 = max(s0_2, 0.0); + s0_3 = max(s0_3, 0.0); + s0_4 = max(s0_4, 0.0); + s0_5 = max(s0_5, 0.0); + s0_6 = max(s0_6, 0.0); + s0_7 = max(s0_7, 0.0); + s0_8 = max(s0_8, 0.0); + + V4 s2_0 = l1(-1.0, -1.0); + V4 s2_1 = l1(0.0, -1.0); + V4 s2_2 = l1(1.0, -1.0); + V4 s2_3 = l1(-1.0, 0.0); + V4 s2_4 = l1(0.0, 0.0); + V4 s2_5 = l1(1.0, 0.0); + V4 s2_6 = l1(-1.0, 1.0); + V4 s2_7 = l1(0.0, 1.0); + V4 s2_8 = l1(1.0, 1.0); + V4 s3_0 = -max(-s2_0, 0.0); + V4 s3_1 = -max(-s2_1, 0.0); + V4 s3_2 = -max(-s2_2, 0.0); + V4 s3_3 = -max(-s2_3, 0.0); + V4 s3_4 = -max(-s2_4, 0.0); + V4 s3_5 = -max(-s2_5, 0.0); + V4 s3_6 = -max(-s2_6, 0.0); + V4 s3_7 = -max(-s2_7, 0.0); + V4 s3_8 = -max(-s2_8, 0.0); + s2_0 = max(s2_0, 0.0); + s2_1 = max(s2_1, 0.0); + s2_2 = max(s2_2, 0.0); + s2_3 = max(s2_3, 0.0); + s2_4 = max(s2_4, 0.0); + s2_5 = max(s2_5, 0.0); + s2_6 = max(s2_6, 0.0); + s2_7 = max(s2_7, 0.0); + s2_8 = max(s2_8, 0.0); + + V4 s4_0 = l2(-1.0, -1.0); + V4 s4_1 = l2(0.0, -1.0); + V4 s4_2 = l2(1.0, -1.0); + V4 s4_3 = l2(-1.0, 0.0); + V4 s4_4 = l2(0.0, 0.0); + V4 s4_5 = l2(1.0, 0.0); + V4 s4_6 = l2(-1.0, 1.0); + V4 s4_7 = l2(0.0, 1.0); + V4 s4_8 = l2(1.0, 1.0); + V4 s5_0 = -max(-s4_0, 0.0); + V4 s5_1 = -max(-s4_1, 0.0); + V4 s5_2 = -max(-s4_2, 0.0); + V4 s5_3 = -max(-s4_3, 0.0); + V4 s5_4 = -max(-s4_4, 0.0); + V4 s5_5 = -max(-s4_5, 0.0); + V4 s5_6 = -max(-s4_6, 0.0); + V4 s5_7 = -max(-s4_7, 0.0); + V4 s5_8 = -max(-s4_8, 0.0); + s4_0 = max(s4_0, 0.0); + s4_1 = max(s4_1, 0.0); + s4_2 = max(s4_2, 0.0); + s4_3 = max(s4_3, 0.0); + s4_4 = max(s4_4, 0.0); + s4_5 = max(s4_5, 0.0); + s4_6 = max(s4_6, 0.0); + s4_7 = max(s4_7, 0.0); + s4_8 = max(s4_8, 0.0); + + V4 s6_0 = l3(-1.0, -1.0); + V4 s6_1 = l3(0.0, -1.0); + V4 s6_2 = l3(1.0, -1.0); + V4 s6_3 = l3(-1.0, 0.0); + V4 s6_4 = l3(0.0, 0.0); + V4 s6_5 = l3(1.0, 0.0); + V4 s6_6 = l3(-1.0, 1.0); + V4 s6_7 = l3(0.0, 1.0); + V4 s6_8 = l3(1.0, 1.0); + V4 s7_0 = -max(-s6_0, 0.0); + V4 s7_1 = -max(-s6_1, 0.0); + V4 s7_2 = -max(-s6_2, 0.0); + V4 s7_3 = -max(-s6_3, 0.0); + V4 s7_4 = -max(-s6_4, 0.0); + V4 s7_5 = -max(-s6_5, 0.0); + V4 s7_6 = -max(-s6_6, 0.0); + V4 s7_7 = -max(-s6_7, 0.0); + V4 s7_8 = -max(-s6_8, 0.0); + s6_0 = max(s6_0, 0.0); + s6_1 = max(s6_1, 0.0); + s6_2 = max(s6_2, 0.0); + s6_3 = max(s6_3, 0.0); + s6_4 = max(s6_4, 0.0); + s6_5 = max(s6_5, 0.0); + s6_6 = max(s6_6, 0.0); + s6_7 = max(s6_7, 0.0); + s6_8 = max(s6_8, 0.0); + + t0[gxy] = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t1[gxy] = f1(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t2[gxy] = f2(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t3[gxy] = f3(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); +} + +//!PASS 6 +//!DESC conv5 +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 +//!IN t0, t1, t2, t3 +//!OUT t4, t5, t6, t7 + +#define l0(x, y) V4(O(t0, float2(x, y))) +#define l1(x, y) V4(O(t1, float2(x, y))) +#define l2(x, y) V4(O(t2, float2(x, y))) +#define l3(x, y) V4(O(t3, float2(x, y))) + +V4 f0(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(5.352e-02, -6.003e-02, -2.211e-02, 4.433e-02, 4.953e-02, -9.998e-03, 5.663e-02, 3.074e-02, -1.461e-01, -7.925e-02, 1.596e-01, 1.770e-02, 3.897e-02, -4.709e-02, 7.008e-02, 2.094e-01)); + r += mul(s0_1, M4(1.156e-01, 6.543e-03, 1.958e-01, 5.386e-02, 3.292e-02, -5.440e-02, -6.076e-02, -3.825e-02, 6.736e-03, 1.117e-01, 4.416e-02, -1.791e-01, -4.239e-02, -2.295e-02, 4.666e-02, -1.696e-02)); + r += mul(s0_2, M4(-1.186e-01, -4.513e-02, -5.032e-02, 1.159e-01, 6.085e-02, -9.254e-02, -2.380e-02, -1.167e-01, -1.666e-01, 1.264e-01, -5.614e-02, -1.464e-01, -4.733e-02, -4.771e-02, 3.514e-03, -6.613e-02)); + r += mul(s0_3, M4(2.116e-02, 1.091e-01, -3.674e-02, -5.242e-02, 6.910e-02, -8.886e-02, 8.346e-02, 5.647e-02, -1.209e-01, -3.142e-01, -7.856e-04, 1.316e-01, 7.465e-02, 6.473e-02, 2.104e-02, 1.197e-01)); + r += mul(s0_4, M4(1.050e-01, 4.251e-02, -2.173e-01, -1.448e-01, -5.025e-02, 2.500e-01, 4.104e-02, 2.790e-02, -1.075e-01, 7.254e-02, 2.046e-01, 1.821e-02, 2.764e-02, -1.820e-01, 2.087e-01, 3.294e-02)); + r += mul(s0_5, M4(-3.813e-03, -3.270e-02, -5.619e-02, -6.237e-02, -8.666e-02, -5.051e-02, -4.036e-02, 4.378e-02, -9.974e-02, 1.327e-01, -1.024e-01, 1.066e-01, 3.751e-02, 1.488e-01, -7.101e-02, -4.326e-02)); + r += mul(s0_6, M4(-3.769e-02, 1.476e-01, 5.328e-03, 8.061e-02, -1.262e-01, 2.233e-02, -2.814e-02, 5.004e-02, -1.220e-03, 1.606e-01, 2.252e-02, 2.342e-01, 1.199e-01, 1.138e-01, -6.507e-02, 2.135e-01)); + r += mul(s0_7, M4(-4.111e-02, -3.667e-02, -4.015e-02, 7.155e-02, 9.064e-02, -1.618e-01, 1.331e-01, 6.908e-03, 1.260e-01, -7.548e-02, -1.234e-01, -3.638e-02, -1.596e-02, 1.630e-01, -3.623e-02, 4.260e-02)); + r += mul(s0_8, M4(-1.971e-02, 3.143e-02, -1.254e-01, -8.149e-02, -3.711e-02, -2.610e-02, -9.066e-02, -7.625e-02, 4.546e-02, -3.873e-02, 7.123e-02, -1.698e-01, 5.370e-02, 1.463e-01, -8.262e-02, 5.914e-02)); + r += mul(s1_0, M4(-4.456e-02, 9.059e-02, -5.945e-03, 8.410e-03, -5.316e-02, 1.826e-01, 3.103e-02, -1.228e-01, 4.338e-02, 7.191e-03, -6.517e-02, 4.575e-02, -5.153e-02, 2.403e-02, -6.266e-02, -2.030e-02)); + r += mul(s1_1, M4(-2.190e-03, 4.591e-03, 8.481e-03, 1.023e-02, -2.173e-02, -2.044e-01, -3.023e-01, -4.659e-02, -1.410e-02, -4.269e-02, 2.231e-03, 9.745e-02, 8.884e-02, -9.949e-02, 9.654e-02, 1.859e-02)); + r += mul(s1_2, M4(-1.202e-01, -8.493e-02, -1.220e-01, -5.496e-02, 1.908e-02, 1.421e-01, -5.350e-02, 8.420e-02, -1.172e-01, 1.707e-01, 3.295e-02, 3.927e-02, -5.777e-04, -1.265e-01, -2.614e-02, -7.910e-02)); + r += mul(s1_3, M4(3.880e-02, -6.074e-02, -1.442e-03, -1.654e-01, 9.664e-02, 3.303e-02, 3.226e-02, -7.141e-02, -1.076e-01, -1.150e-01, -2.339e-02, 1.651e-01, -3.130e-02, -1.802e-02, 4.318e-03, 3.434e-02)); + r += mul(s1_4, M4(-5.016e-03, -5.464e-02, -1.663e-02, 8.145e-02, 4.547e-02, -1.759e-01, -9.492e-02, -1.771e-01, -9.245e-03, 5.359e-02, 7.425e-02, 1.827e-03, -4.575e-02, 1.871e-01, 1.058e-01, -1.076e-01)); + r += mul(s1_5, M4(-1.027e-02, -1.968e-02, 1.940e-02, -5.706e-03, 7.775e-02, 2.402e-02, 1.660e-01, 2.068e-01, 7.661e-02, -5.935e-02, -1.205e-01, 1.600e-02, -1.972e-02, 1.954e-02, -7.720e-02, 4.828e-02)); + r += mul(s1_6, M4(-3.072e-02, -1.125e-01, 1.832e-02, 6.532e-02, -7.836e-02, -9.945e-03, 4.052e-04, -9.759e-02, 2.556e-02, 3.925e-02, -1.759e-02, 1.740e-04, 7.344e-02, 2.705e-02, -5.123e-03, 3.745e-02)); + r += mul(s1_7, M4(-1.653e-01, 2.419e-01, 1.005e-02, 1.101e-01, 2.671e-02, -1.024e-01, 5.774e-02, 4.496e-02, 1.642e-01, -1.284e-01, 1.539e-02, -1.165e-01, -9.144e-02, -3.061e-02, 8.213e-02, 3.711e-02)); + r += mul(s1_8, M4(-7.638e-02, -1.175e-01, -1.755e-01, -5.906e-02, -8.853e-02, 2.312e-01, -4.578e-02, 1.944e-01, -1.024e-02, 4.099e-02, -1.490e-01, -1.750e-02, -1.237e-02, -6.959e-02, 6.619e-02, 4.807e-02)); + r += mul(s2_0, M4(-9.459e-02, -4.447e-02, 1.633e-02, 7.760e-02, 1.663e-02, 5.495e-02, -2.123e-01, -8.782e-02, 9.847e-02, -2.494e-01, 5.506e-02, 2.300e-02, 9.393e-02, -2.066e-03, -2.887e-02, -1.034e-02)); + r += mul(s2_1, M4(-6.060e-04, -2.843e-02, 1.193e-01, 7.511e-02, 8.971e-02, -1.729e-01, 8.784e-02, 2.401e-01, -3.400e-03, -1.440e-02, 6.544e-02, 1.016e-01, 1.385e-01, -8.282e-02, 2.683e-02, 3.792e-02)); + r += mul(s2_2, M4(-3.848e-02, -1.576e-01, 7.396e-02, -3.511e-03, -4.518e-02, 1.550e-02, -8.470e-02, -1.773e-03, -4.893e-02, 6.221e-02, 2.359e-02, 3.289e-02, -1.229e-02, -2.320e-01, 1.303e-01, 5.384e-02)); + r += mul(s2_3, M4(8.782e-02, 6.043e-02, 3.194e-02, 6.482e-02, -4.146e-02, 3.285e-02, 2.284e-01, -1.415e-01, 1.369e-01, 2.055e-01, 5.368e-02, -1.428e-01, 7.800e-02, -1.314e-01, 3.297e-02, -9.278e-02)); + r += mul(s2_4, M4(1.024e-01, 1.363e-01, -5.119e-02, 2.565e-02, 6.343e-03, 2.352e-01, 6.082e-02, -1.322e-02, 7.261e-02, -4.301e-02, 4.693e-02, -7.804e-02, -5.509e-02, -4.039e-02, -1.404e-01, -8.930e-02)); + r += mul(s2_5, M4(-7.801e-04, 2.480e-02, -1.927e-02, -7.391e-02, 1.095e-01, 3.992e-02, -1.621e-01, 6.971e-02, 6.987e-02, 1.023e-01, 1.446e-01, 1.184e-01, -1.187e-01, -1.961e-01, 4.407e-02, 2.737e-02)); + r += mul(s2_6, M4(-8.438e-02, -3.381e-02, -2.215e-02, -1.105e-01, 3.365e-02, 4.503e-02, -1.213e-01, -4.697e-02, 3.623e-02, 3.179e-02, -2.838e-02, 1.815e-02, 7.213e-02, -5.479e-02, 2.897e-02, -3.150e-02)); + r += mul(s2_7, M4(-4.557e-02, 1.267e-02, -1.491e-02, 1.259e-01, 8.430e-02, 1.924e-01, -8.617e-02, -1.781e-01, -2.634e-02, 1.175e-02, -7.070e-02, 3.062e-03, 6.270e-02, -2.510e-01, -2.626e-01, -4.705e-02)); + r += mul(s2_8, M4(7.945e-02, -3.057e-02, -2.458e-02, -8.121e-02, -7.519e-03, 9.856e-02, -5.723e-02, -5.697e-02, -2.230e-02, -6.706e-02, -9.360e-02, -7.224e-02, 4.266e-02, -7.034e-02, -2.337e-02, -1.566e-02)); + r += mul(s3_0, M4(3.309e-03, -2.313e-01, -1.734e-01, 1.240e-01, -6.625e-03, 4.509e-02, -1.171e-01, -1.023e-02, -3.997e-02, 7.266e-02, -7.198e-02, -1.391e-01, 5.669e-02, 2.601e-02, 8.004e-02, 2.964e-03)); + r += mul(s3_1, M4(1.932e-02, -2.117e-01, -2.602e-01, 1.114e-01, 8.733e-02, 1.008e-04, 1.115e-01, -2.662e-02, -1.801e-02, -9.135e-02, 1.514e-02, -2.415e-02, 6.470e-02, -5.469e-02, 2.046e-02, -1.580e-02)); + r += mul(s3_2, M4(-3.705e-02, -6.550e-02, 7.516e-02, 7.553e-02, -3.976e-02, -7.871e-02, 4.571e-02, -7.532e-02, -1.995e-03, -6.403e-02, -4.546e-02, -8.693e-02, 9.039e-02, -1.995e-02, 1.345e-01, 2.267e-02)); + r += mul(s3_3, M4(1.233e-01, 1.825e-02, 1.725e-01, 1.778e-01, -6.270e-02, -9.425e-02, 1.606e-01, -4.391e-02, 4.171e-02, 1.050e-01, 4.089e-02, -1.759e-01, 2.781e-02, 2.277e-01, -9.549e-02, 5.448e-02)); + r += mul(s3_4, M4(-5.577e-02, 2.223e-01, -1.202e-01, -1.332e-01, 4.160e-02, 1.016e-01, 8.875e-02, -5.305e-02, 3.856e-02, -1.608e-01, -2.582e-02, 5.141e-02, 2.402e-02, 3.814e-02, -6.229e-02, -2.160e-02)); + r += mul(s3_5, M4(-6.361e-02, -1.239e-01, -4.564e-02, -8.119e-02, -2.117e-02, -1.723e-01, 9.629e-02, 1.111e-03, 1.104e-01, -2.014e-01, 1.567e-01, -1.490e-01, -1.243e-01, 7.170e-02, 7.954e-02, -2.288e-02)); + r += mul(s3_6, M4(-2.335e-03, -3.111e-01, 1.315e-01, -1.854e-01, 7.739e-02, -8.189e-02, -3.183e-02, 1.474e-01, -3.443e-02, 1.429e-01, 2.144e-02, 1.426e-01, 4.218e-02, 9.482e-02, 3.630e-02, 5.003e-02)); + r += mul(s3_7, M4(-4.766e-02, 2.926e-01, 9.300e-02, -1.212e-01, -1.090e-01, 5.079e-03, -9.414e-02, 4.644e-02, 8.026e-02, -1.791e-01, 1.471e-01, -1.189e-01, 1.029e-01, 5.472e-04, -3.538e-02, -1.394e-02)); + r += mul(s3_8, M4(-2.357e-02, -4.969e-03, -2.550e-04, 3.760e-02, -2.231e-02, -1.263e-01, 5.122e-02, -7.788e-03, 3.626e-02, 9.300e-02, 1.542e-02, -1.115e-01, -2.267e-02, -1.465e-01, -2.458e-02, -4.479e-02)); + r += mul(s4_0, M4(-4.892e-02, 9.998e-02, -5.485e-02, 1.855e-01, -5.268e-02, -1.911e-01, 1.163e-02, 7.336e-02, -2.790e-02, -8.902e-02, 3.962e-02, 4.102e-02, -1.586e-01, 2.007e-01, -2.357e-01, -6.856e-02)); + r += mul(s4_1, M4(-2.509e-02, -3.597e-02, 1.446e-01, -1.538e-01, 2.892e-02, -3.173e-01, 7.050e-03, -7.445e-02, 3.322e-02, 2.004e-01, -2.075e-02, -2.078e-01, -1.709e-01, 4.825e-01, 1.906e-01, -3.348e-01)); + r += mul(s4_2, M4(-1.132e-01, 8.326e-02, -2.015e-01, -4.702e-02, -3.892e-02, -4.820e-03, 6.851e-02, 1.764e-01, 4.587e-02, -1.529e-01, -1.397e-01, 5.021e-02, -5.849e-02, -6.847e-02, -2.166e-01, -1.023e-01)); + r += mul(s4_3, M4(5.897e-02, 7.060e-02, 4.643e-02, -8.388e-02, -1.709e-01, 3.313e-02, 1.540e-02, 7.965e-02, -2.783e-02, -1.881e-01, -3.390e-02, -5.080e-02, 6.688e-02, 4.503e-01, 1.965e-01, -8.467e-02)); + r += mul(s4_4, M4(-4.286e-02, 1.484e-01, 1.718e-01, 5.384e-02, -6.666e-04, -4.541e-02, 1.290e-02, -1.162e-01, 1.018e-01, 5.695e-02, -1.323e-01, -8.818e-02, 4.924e-02, -5.815e-02, 2.325e-01, -3.691e-01)); + r += mul(s4_5, M4(-8.393e-03, -3.255e-02, 1.356e-01, 1.442e-01, -6.673e-02, 1.993e-01, 5.101e-02, -9.806e-02, -3.885e-03, 1.357e-01, -1.321e-01, 4.698e-02, -2.377e-02, -3.456e-01, -1.460e-01, -7.247e-01)); + r += mul(s4_6, M4(1.248e-01, -2.129e-01, -5.683e-02, 2.821e-02, 1.448e-02, 6.522e-02, -6.485e-02, 9.213e-02, 4.527e-03, -5.447e-02, 1.178e-01, -9.981e-02, 1.705e-01, 5.612e-01, 3.391e-02, -1.881e-01)); + r += mul(s4_7, M4(-7.766e-03, 3.777e-02, -7.707e-02, -2.180e-01, 1.218e-01, -4.018e-02, 5.356e-02, -5.481e-02, -8.015e-02, 1.189e-01, -1.416e-02, 6.809e-02, 4.150e-01, -2.107e-01, 5.750e-01, -1.605e-01)); + r += mul(s4_8, M4(9.450e-02, 1.037e-01, -2.835e-01, 4.411e-02, 9.148e-02, 4.021e-02, 3.793e-02, 8.474e-02, -1.125e-03, 7.616e-02, -4.859e-02, 1.827e-01, -5.379e-01, 5.020e-01, -4.090e-01, -4.793e-03)); + r += mul(s5_0, M4(-1.701e-01, 2.345e-01, -1.211e-02, 4.541e-02, 2.961e-02, 5.266e-02, 1.307e-01, 3.609e-02, 4.605e-02, -3.558e-02, 9.512e-02, 5.914e-02, 2.102e-02, -4.461e-02, -1.372e-02, 1.155e-01)); + r += mul(s5_1, M4(1.162e-01, -7.298e-02, -5.473e-02, 3.611e-02, 2.875e-03, 5.088e-02, 1.664e-02, -1.070e-01, -7.892e-02, -5.052e-02, -1.098e-01, 5.957e-02, -2.351e-02, 3.243e-03, -7.514e-02, -8.618e-02)); + r += mul(s5_2, M4(4.716e-02, -1.338e-01, -3.799e-02, 7.695e-02, 1.243e-01, 2.060e-02, 8.676e-02, 2.973e-02, 1.469e-01, -1.873e-01, 5.251e-02, -6.448e-02, 6.517e-02, -1.267e-01, -3.481e-02, 8.992e-02)); + r += mul(s5_3, M4(4.285e-02, 1.942e-02, -1.713e-01, 6.129e-02, 1.438e-02, 8.497e-02, -6.502e-02, 6.613e-02, -4.295e-02, 4.772e-02, -1.120e-01, 3.155e-04, -2.833e-02, 1.322e-02, 3.454e-02, -4.402e-02)); + r += mul(s5_4, M4(-1.615e-02, -6.930e-02, -1.766e-02, 3.873e-02, 1.728e-02, -4.751e-02, -7.133e-02, -2.653e-01, 3.786e-02, 1.410e-01, -1.479e-01, -3.649e-02, -6.534e-02, 5.146e-02, -7.122e-02, 4.381e-02)); + r += mul(s5_5, M4(-7.064e-03, -4.123e-02, -2.359e-02, 8.662e-02, 1.207e-01, 2.232e-01, 2.433e-01, 2.088e-01, 8.066e-02, 3.004e-02, 6.141e-02, -1.586e-01, -7.547e-02, -5.052e-02, 1.366e-01, 6.911e-02)); + r += mul(s5_6, M4(6.411e-03, 1.104e-01, -1.522e-02, 1.386e-01, 9.939e-03, -5.831e-02, -8.926e-04, 1.216e-02, -2.496e-02, 5.979e-02, 8.775e-03, 1.148e-01, 8.860e-02, 5.929e-02, -4.231e-02, 4.682e-02)); + r += mul(s5_7, M4(4.344e-02, -8.809e-02, 8.222e-02, -2.465e-01, -7.923e-02, 1.042e-01, 1.952e-01, -7.851e-02, -1.864e-02, 7.215e-02, -3.670e-02, 4.777e-02, -1.010e-01, 6.572e-02, -1.777e-02, -7.108e-02)); + r += mul(s5_8, M4(-8.068e-02, 9.414e-02, 9.702e-03, 1.204e-02, 3.309e-02, 8.979e-02, 3.771e-02, 1.383e-01, 8.931e-04, -5.920e-02, 9.616e-02, 5.289e-02, 8.472e-02, -1.638e-02, 4.468e-03, -2.117e-03)); + r += mul(s6_0, M4(3.289e-02, 2.284e-02, -3.119e-02, 2.566e-02, 1.347e-02, -5.070e-02, 5.969e-02, -1.102e-01, -1.147e-01, 1.709e-02, 1.959e-02, 1.604e-01, 6.736e-02, -7.710e-02, -4.285e-02, 4.158e-02)); + r += mul(s6_1, M4(7.121e-03, -1.564e-01, -1.001e-02, 8.996e-02, -2.329e-02, -1.416e-01, 1.530e-01, 5.474e-03, 9.776e-02, -1.706e-01, 1.192e-02, 2.380e-01, 7.527e-02, -1.134e-01, 6.843e-02, 3.326e-02)); + r += mul(s6_2, M4(-6.078e-02, 5.706e-02, -4.583e-02, -3.080e-02, 2.456e-02, 6.659e-02, 1.978e-01, -7.113e-02, 1.076e-02, 2.574e-02, 6.166e-02, 6.886e-02, -3.931e-02, 1.514e-02, -2.805e-02, 1.093e-01)); + r += mul(s6_3, M4(1.128e-02, 1.021e-01, 3.399e-02, -1.714e-01, 1.169e-01, 1.522e-01, 2.364e-02, 6.626e-02, -4.942e-03, -6.701e-02, -7.163e-02, 2.261e-02, 5.026e-03, 5.555e-02, -8.452e-02, -1.618e-01)); + r += mul(s6_4, M4(8.260e-02, 1.394e-01, -3.437e-02, -2.420e-02, 6.662e-02, -1.391e-01, -5.692e-03, 1.088e-01, 1.298e-01, 2.227e-01, -2.342e-02, -1.256e-01, 9.542e-02, 1.525e-01, -7.337e-02, -1.027e-01)); + r += mul(s6_5, M4(8.994e-02, 1.354e-01, -9.008e-02, 3.849e-02, -2.093e-02, 4.631e-02, -2.421e-01, -1.823e-02, -3.046e-02, 3.960e-02, -4.829e-02, -1.686e-01, 1.191e-01, -4.892e-02, -5.579e-02, -1.901e-02)); + r += mul(s6_6, M4(-9.693e-02, -5.007e-02, 1.206e-02, -8.020e-02, 5.086e-02, 1.398e-01, -5.576e-02, 8.612e-03, -1.313e-01, -1.433e-02, -1.111e-02, 1.519e-01, 3.079e-02, 2.418e-02, 1.939e-02, 1.782e-02)); + r += mul(s6_7, M4(7.926e-02, -6.074e-02, -1.768e-01, -1.748e-02, -7.136e-02, -1.362e-01, -1.489e-01, -1.288e-01, -7.120e-02, -1.594e-01, 1.150e-01, -9.829e-04, 1.873e-01, 5.800e-03, 5.079e-02, -9.980e-03)); + r += mul(s6_8, M4(-1.047e-01, 1.090e-02, -4.031e-02, 4.984e-02, 1.676e-02, 8.937e-02, -5.950e-02, 9.969e-02, 5.061e-02, -8.463e-02, -1.415e-01, 6.871e-02, 6.857e-02, 9.592e-02, 1.104e-02, 4.270e-02)); + r += mul(s7_0, M4(-8.631e-02, 4.665e-02, -8.895e-02, -1.461e-01, -2.317e-01, 2.104e-01, 3.963e-02, -3.532e-01, 3.795e-02, -1.502e-01, 8.124e-02, -7.193e-02, 2.124e-01, -2.453e-01, -1.988e-01, 8.618e-02)); + r += mul(s7_1, M4(2.688e-02, 8.635e-02, 1.727e-02, -6.922e-02, 1.255e-02, 9.244e-02, -5.431e-03, 5.034e-02, -5.071e-02, 1.155e-01, 7.984e-02, 2.210e-01, -1.402e-02, -3.125e-01, 5.878e-02, 1.485e-01)); + r += mul(s7_2, M4(3.618e-02, 1.528e-02, 2.318e-02, -6.709e-03, 2.473e-02, 1.492e-01, -6.647e-02, 1.353e-01, -3.731e-02, 1.335e-01, -3.427e-02, -1.461e-01, 1.150e-01, -1.794e-01, -3.323e-02, 1.929e-01)); + r += mul(s7_3, M4(-5.277e-02, -1.363e-01, -7.280e-02, -1.981e-01, 1.313e-01, 9.950e-02, -3.511e-02, -8.209e-02, 5.781e-03, -1.295e-01, -7.449e-02, -6.425e-02, 1.034e-01, -1.895e-01, -1.182e-01, -3.808e-02)); + r += mul(s7_4, M4(2.256e-02, 3.111e-01, -8.042e-02, 2.155e-02, -6.160e-02, 4.626e-02, -1.338e-01, 1.412e-02, 3.955e-02, 4.709e-02, 2.207e-02, 2.577e-02, 3.569e-01, -2.610e-01, 1.168e-01, -3.008e-01)); + r += mul(s7_5, M4(-7.569e-02, -1.578e-01, -1.208e-01, -6.976e-02, 1.733e-01, -1.821e-01, -1.684e-01, 4.462e-02, 1.019e-01, -7.874e-03, 5.979e-02, -9.098e-02, 2.738e-01, -7.549e-02, 2.460e-02, 1.610e-01)); + r += mul(s7_6, M4(-9.334e-02, 4.098e-02, -6.013e-03, -3.997e-02, -3.501e-02, -2.160e-01, -9.129e-02, 8.863e-02, -3.472e-02, -8.100e-02, 9.985e-02, -5.826e-02, 1.061e-01, 6.911e-03, -7.054e-02, -1.854e-01)); + r += mul(s7_7, M4(2.929e-02, 1.824e-01, -1.064e-01, 1.334e-01, 5.439e-02, 3.309e-02, -8.525e-02, -6.769e-02, -1.394e-01, -2.316e-02, -1.789e-02, 9.320e-03, 1.287e-01, -1.315e-01, -1.557e-01, -2.243e-02)); + r += mul(s7_8, M4(-7.720e-02, 3.992e-02, -2.953e-02, -2.195e-02, -1.529e-01, -6.945e-02, 1.175e-01, 2.004e-02, 4.700e-03, 4.726e-02, 1.380e-01, 8.438e-02, -6.662e-02, 1.652e-01, -2.526e-01, 3.833e-01)); + r += V4(8.813e-03, -2.534e-02, -1.974e-02, 3.490e-02); + return r; +} + +V4 f1(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(4.122e-02, 8.383e-02, 3.338e-02, 1.074e-01, 6.216e-02, 1.477e-01, -1.380e-01, -6.255e-02, 1.996e-01, -3.722e-02, 5.276e-02, 1.167e-01, -7.417e-02, 5.647e-02, -5.606e-02, 1.827e-02)); + r += mul(s0_1, M4(-1.417e-01, 1.031e-01, 8.936e-02, -2.534e-02, 4.818e-02, -1.266e-02, 7.397e-02, -8.276e-03, 3.212e-02, 1.235e-01, -5.494e-02, -1.396e-01, 5.486e-02, 3.028e-02, 1.206e-01, 3.576e-02)); + r += mul(s0_2, M4(7.835e-03, -2.252e-02, -6.244e-02, 5.518e-02, 1.196e-02, 6.549e-02, -9.242e-02, 6.011e-02, 7.738e-02, 5.543e-02, 4.658e-02, 1.604e-01, -1.440e-01, -2.203e-01, 2.094e-01, 5.055e-02)); + r += mul(s0_3, M4(1.827e-02, 2.703e-01, -1.737e-02, -1.322e-01, 1.175e-01, 5.652e-03, -7.876e-02, -7.422e-02, -8.563e-02, 1.274e-01, 2.360e-01, -9.820e-02, -1.245e-01, -1.965e-01, -1.857e-01, -4.621e-02)); + r += mul(s0_4, M4(3.942e-02, -1.100e-02, 2.788e-01, -2.336e-01, 8.881e-02, -1.333e-01, 1.003e-01, 1.164e-01, 7.883e-02, 8.033e-02, 2.043e-02, 1.624e-01, 1.383e-01, -2.519e-02, -5.318e-02, 1.520e-01)); + r += mul(s0_5, M4(-3.216e-02, 5.697e-02, -5.701e-02, 4.658e-02, 3.494e-02, 3.336e-02, -7.436e-02, 7.364e-02, 8.382e-02, -2.202e-02, -1.743e-01, -1.839e-01, 1.417e-01, -1.635e-01, -3.120e-01, -8.505e-02)); + r += mul(s0_6, M4(-7.515e-03, 4.343e-02, -5.703e-02, -7.557e-02, 3.959e-02, -5.061e-02, 3.424e-03, -7.574e-02, 5.731e-02, 1.219e-01, 2.614e-01, -1.606e-01, -1.916e-01, 1.833e-01, 2.208e-01, 2.684e-02)); + r += mul(s0_7, M4(-3.595e-02, 7.421e-02, -8.721e-02, -1.584e-01, -2.372e-01, 6.072e-03, 1.349e-01, -6.225e-02, 7.371e-02, -1.628e-02, 9.391e-03, 5.127e-02, 1.093e-01, -6.543e-02, -6.491e-02, -1.025e-01)); + r += mul(s0_8, M4(1.666e-01, -6.585e-02, -3.190e-02, -1.870e-02, -2.152e-02, 2.299e-02, -7.148e-02, -5.189e-02, 3.208e-02, 3.908e-02, 9.250e-02, -5.921e-02, -1.940e-01, 2.204e-01, 7.993e-02, -1.537e-01)); + r += mul(s1_0, M4(-2.020e-01, -8.556e-02, 1.969e-01, 4.061e-02, -2.778e-01, 2.953e-02, -8.298e-02, 2.652e-02, -1.784e-01, -2.365e-01, -9.816e-02, 4.397e-02, -4.537e-02, -2.409e-03, 7.802e-02, -3.368e-02)); + r += mul(s1_1, M4(-4.658e-02, 8.550e-02, 7.848e-03, -3.993e-02, 1.831e-01, 1.087e-01, -4.718e-02, 1.597e-01, -2.204e-02, 8.192e-03, -1.598e-01, 1.384e-03, -8.970e-02, 1.891e-02, -6.039e-02, 1.696e-01)); + r += mul(s1_2, M4(-1.113e-01, -4.528e-02, 1.062e-01, 1.203e-01, 9.039e-02, 7.922e-03, -4.449e-02, 2.844e-02, -1.424e-01, -7.929e-02, 2.053e-02, -3.185e-03, 6.237e-02, -1.203e-01, 8.945e-02, -3.631e-02)); + r += mul(s1_3, M4(-5.671e-03, -3.451e-02, 1.500e-01, -1.569e-01, 1.268e-01, -1.226e-01, 6.915e-04, -2.778e-02, -3.379e-02, 4.271e-02, 1.354e-01, -9.886e-02, -1.241e-01, 7.640e-03, 3.774e-02, -3.300e-02)); + r += mul(s1_4, M4(1.919e-01, -9.819e-02, -3.668e-02, -1.755e-01, -6.389e-02, 1.992e-01, -3.709e-02, 5.672e-02, -9.270e-02, 1.810e-02, -5.355e-02, -1.391e-01, 3.739e-02, 1.339e-01, -1.631e-01, 1.079e-01)); + r += mul(s1_5, M4(-2.162e-02, 1.105e-01, -3.219e-02, 5.079e-02, -8.272e-02, -5.169e-02, 1.417e-01, 1.084e-01, 1.151e-01, -3.524e-03, 8.167e-02, -7.284e-02, 4.550e-02, -3.263e-02, 3.912e-03, 2.087e-02)); + r += mul(s1_6, M4(-1.941e-01, -9.595e-02, 3.628e-02, -6.315e-02, -1.131e-01, -7.642e-02, 7.751e-03, -1.500e-01, -2.586e-02, 1.070e-02, 1.509e-01, 2.150e-02, 2.203e-01, -4.958e-02, -7.005e-02, -5.625e-02)); + r += mul(s1_7, M4(-1.845e-01, 2.111e-01, -1.228e-01, -1.447e-01, -3.468e-01, 3.155e-01, 1.562e-01, -3.004e-03, 1.479e-02, -1.853e-01, 3.506e-03, 6.235e-02, -2.529e-02, 5.032e-02, 1.300e-02, 4.364e-02)); + r += mul(s1_8, M4(1.870e-01, 4.247e-02, -1.505e-01, -1.313e-01, 3.916e-01, 7.202e-03, 9.710e-02, -8.099e-02, 1.619e-01, 9.561e-04, 2.766e-02, 6.239e-03, -4.921e-03, 7.273e-02, -1.201e-02, -2.343e-02)); + r += mul(s2_0, M4(2.606e-01, -5.136e-02, -1.860e-01, 8.581e-02, 9.574e-02, 1.568e-01, -1.763e-02, -5.978e-03, 5.550e-02, 1.568e-02, -5.198e-02, -4.383e-02, -4.906e-02, 1.675e-01, 1.535e-01, 4.199e-02)); + r += mul(s2_1, M4(8.128e-02, -4.188e-02, 8.789e-02, 1.059e-02, 5.317e-02, -2.500e-01, -1.083e-02, -1.010e-02, 1.883e-02, -1.240e-03, -6.292e-02, -7.543e-02, -2.780e-01, 1.280e-02, 7.872e-02, -1.048e-01)); + r += mul(s2_2, M4(-7.516e-02, 3.264e-02, 1.078e-02, 1.077e-01, -1.360e-01, -1.113e-01, -2.177e-03, -5.041e-02, 1.569e-01, 1.391e-01, -4.030e-02, -1.241e-01, -8.740e-02, -5.520e-02, 2.185e-02, 1.608e-02)); + r += mul(s2_3, M4(2.306e-03, 1.567e-01, -7.209e-02, -4.525e-02, -9.415e-02, 6.306e-02, 1.450e-01, -1.169e-01, 5.780e-02, -1.133e-01, -5.446e-02, 3.259e-02, -4.961e-02, -1.976e-02, -2.447e-02, -2.290e-02)); + r += mul(s2_4, M4(2.386e-02, -5.238e-02, 1.207e-01, 3.735e-02, 9.597e-02, -4.174e-02, -6.034e-03, 1.518e-01, 4.247e-02, 2.257e-01, 1.078e-01, 1.793e-03, -5.901e-02, 9.326e-02, -1.338e-01, 1.885e-01)); + r += mul(s2_5, M4(7.380e-02, -1.063e-02, 3.345e-02, 1.479e-02, 3.495e-02, 4.331e-02, -8.697e-02, 7.413e-02, -4.597e-02, 7.436e-02, -3.669e-02, 5.752e-02, -5.799e-02, -8.522e-02, 3.640e-02, 2.072e-01)); + r += mul(s2_6, M4(-1.877e-01, 1.551e-02, -6.828e-02, -1.350e-01, -6.230e-02, -3.119e-02, -7.443e-02, -4.987e-03, -2.192e-01, -1.508e-02, 2.726e-02, -3.162e-02, 9.302e-02, -3.278e-02, -1.812e-01, -1.685e-01)); + r += mul(s2_7, M4(-8.226e-02, -9.430e-03, -2.783e-02, -1.507e-01, -1.194e-01, 4.480e-02, -3.096e-01, 1.221e-02, -1.314e-02, -3.632e-02, -8.366e-02, -9.450e-02, 8.160e-02, -4.070e-02, 1.684e-02, -1.591e-01)); + r += mul(s2_8, M4(-9.698e-02, -5.036e-02, 7.702e-03, -1.561e-02, -2.036e-01, 7.757e-04, -7.320e-03, -9.980e-02, 1.523e-03, -1.953e-02, 1.121e-01, -2.196e-02, 6.359e-02, -2.313e-02, -9.189e-02, 9.476e-02)); + r += mul(s3_0, M4(1.074e-01, 6.465e-02, 5.784e-02, -5.239e-02, 1.372e-01, 2.996e-02, 4.506e-02, -4.303e-02, 6.389e-02, -1.702e-01, 5.712e-02, -2.878e-02, 1.114e-01, -1.466e-01, 1.442e-02, -4.859e-02)); + r += mul(s3_1, M4(2.695e-01, 8.036e-02, 1.020e-02, -2.345e-02, -3.177e-02, -1.214e-01, 2.157e-02, -9.057e-02, -7.833e-02, -1.223e-01, 1.324e-01, 4.208e-02, 4.594e-02, -3.441e-02, -1.455e-01, -1.347e-01)); + r += mul(s3_2, M4(-1.776e-01, 3.311e-02, 2.599e-01, 1.538e-01, 5.780e-02, -1.014e-01, -6.213e-02, -6.103e-02, -8.818e-02, 6.784e-03, 2.126e-01, -4.447e-02, 2.162e-02, 6.845e-03, 2.213e-02, 4.315e-02)); + r += mul(s3_3, M4(-3.691e-02, 9.170e-02, -1.353e-01, -3.568e-02, -2.263e-02, -3.033e-02, 1.431e-01, 1.084e-02, -8.167e-02, -1.828e-01, -1.531e-02, 1.328e-01, -1.693e-01, -1.139e-01, -1.416e-01, 4.815e-03)); + r += mul(s3_4, M4(2.757e-01, 1.825e-01, 5.124e-02, -2.846e-02, 1.989e-02, 4.312e-02, -7.312e-02, 5.850e-02, 1.033e-01, -1.880e-02, -4.189e-02, 2.893e-02, 3.430e-02, -6.482e-03, 6.486e-02, 1.755e-01)); + r += mul(s3_5, M4(-9.942e-02, -2.805e-01, -7.769e-02, 3.849e-03, -1.070e-01, -4.338e-02, 6.514e-02, 3.316e-02, 1.383e-01, 2.742e-01, 3.685e-02, -4.829e-02, 1.068e-01, 1.266e-01, -2.506e-03, 1.291e-01)); + r += mul(s3_6, M4(-2.415e-01, -8.057e-02, 3.857e-02, -1.124e-02, -2.277e-02, 9.862e-02, -2.556e-02, 1.701e-01, 1.303e-01, -4.520e-02, 1.029e-01, -3.540e-03, -2.677e-02, -2.015e-01, 4.437e-02, -9.656e-02)); + r += mul(s3_7, M4(-1.609e-01, 7.057e-02, 6.680e-02, -8.852e-02, -4.068e-02, 5.505e-02, -2.040e-01, 4.326e-02, 2.155e-01, -7.881e-02, 2.034e-01, -2.155e-02, 1.404e-01, -6.881e-02, 1.369e-02, -1.505e-01)); + r += mul(s3_8, M4(3.738e-02, -4.088e-02, -9.538e-02, -1.224e-02, -5.381e-02, 7.745e-02, 1.922e-03, -4.366e-02, -2.528e-01, 6.610e-02, 1.876e-01, 3.537e-02, 1.399e-01, 1.328e-02, -2.380e-02, -1.166e-02)); + r += mul(s4_0, M4(1.192e-01, -4.218e-02, 8.971e-02, -1.203e-03, 3.736e-02, 7.362e-02, 1.852e-01, -9.320e-02, -8.487e-03, -4.872e-02, 4.593e-02, 5.427e-02, -1.876e-01, 2.224e-01, 1.574e-01, -6.391e-02)); + r += mul(s4_1, M4(2.717e-02, -2.327e-01, 2.254e-02, -1.382e-01, 9.461e-02, 5.224e-02, -1.192e-02, 1.295e-01, -1.813e-01, 1.258e-01, 1.800e-01, 4.340e-02, -1.290e-01, -1.914e-01, -4.951e-02, -1.204e-01)); + r += mul(s4_2, M4(-1.256e-01, 6.234e-03, 9.556e-02, -4.207e-02, -5.784e-02, -5.792e-02, 8.548e-02, 1.648e-01, -9.047e-02, -2.218e-03, -3.778e-02, 8.343e-02, -9.056e-02, -1.292e-02, 2.514e-03, 1.063e-01)); + r += mul(s4_3, M4(-8.758e-02, -7.533e-02, -3.850e-02, -9.839e-02, -5.909e-02, 9.537e-02, -2.824e-02, -4.447e-02, -1.371e-01, 5.032e-03, -6.339e-02, -2.186e-01, 3.136e-02, 2.361e-02, -9.746e-02, -8.115e-02)); + r += mul(s4_4, M4(-2.552e-01, 9.643e-02, -6.941e-02, 1.155e-01, 3.640e-02, -4.759e-02, 1.096e-02, 1.720e-01, 6.097e-03, 1.744e-02, -5.312e-02, -2.109e-03, 1.329e-01, -3.999e-01, 2.500e-01, -3.880e-01)); + r += mul(s4_5, M4(-1.890e-01, -2.049e-02, -5.403e-02, 6.456e-02, -6.021e-02, 1.860e-02, -3.521e-02, 1.354e-01, 8.995e-02, -9.078e-02, 4.511e-02, 1.512e-01, -4.562e-01, -1.406e-01, 2.990e-01, 2.225e-01)); + r += mul(s4_6, M4(-1.407e-01, 3.263e-02, -1.526e-01, -7.049e-02, 2.062e-01, -2.468e-03, 1.486e-01, -2.106e-01, -1.939e-02, -2.468e-02, 9.569e-03, 3.444e-02, -7.420e-01, 7.872e-01, 3.873e-01, 2.897e-02)); + r += mul(s4_7, M4(3.851e-02, 9.604e-02, -1.353e-01, 5.790e-02, 1.505e-01, 9.856e-02, 2.537e-02, -3.294e-02, -4.353e-02, -1.397e-01, -7.199e-02, -2.963e-02, 5.805e-01, -3.699e-01, 1.366e-01, 3.243e-01)); + r += mul(s4_8, M4(2.228e-01, -1.228e-01, 2.280e-01, 5.593e-02, 3.115e-02, -7.131e-02, -7.441e-02, 1.255e-01, 8.876e-02, -2.383e-02, -8.210e-02, 4.344e-02, 8.000e-02, 3.931e-02, -1.807e-01, -1.223e-02)); + r += mul(s5_0, M4(1.995e-01, 1.478e-02, 1.361e-01, 1.052e-01, -6.110e-02, -1.409e-02, 4.745e-02, -9.579e-02, -6.960e-02, 1.767e-02, 6.126e-02, -6.174e-02, 2.066e-02, 1.905e-02, 1.185e-01, 4.444e-02)); + r += mul(s5_1, M4(1.894e-02, 5.374e-02, -3.895e-02, -6.910e-02, -8.066e-02, -7.286e-03, 3.333e-02, -2.389e-02, 4.153e-02, 1.519e-01, 5.669e-02, 1.348e-01, 1.514e-01, 8.843e-02, -5.111e-02, -6.478e-02)); + r += mul(s5_2, M4(-1.113e-02, -4.382e-02, 1.277e-01, -6.272e-02, 3.374e-02, 5.874e-02, 1.987e-02, 5.267e-03, -1.998e-01, -1.951e-02, -1.162e-01, 5.619e-02, 2.949e-02, -2.699e-02, 1.024e-01, 1.130e-01)); + r += mul(s5_3, M4(1.431e-01, -9.473e-02, -2.907e-02, 1.652e-02, -8.979e-02, -5.443e-02, 8.121e-02, -1.787e-01, 7.685e-03, 2.413e-02, -5.653e-02, -7.984e-02, -8.301e-02, 5.845e-02, 7.076e-02, -7.164e-02)); + r += mul(s5_4, M4(9.803e-02, -2.012e-01, -3.996e-02, -3.059e-02, 1.333e-01, 1.097e-01, 4.228e-02, 1.154e-01, 4.830e-02, 4.718e-02, -1.158e-01, -2.837e-02, -4.066e-02, -1.155e-01, 2.084e-02, 2.952e-03)); + r += mul(s5_5, M4(-1.548e-01, 2.054e-02, 5.285e-02, 2.615e-02, -1.192e-01, -1.256e-02, -2.001e-02, 9.973e-02, 1.317e-01, -2.092e-02, 6.632e-02, -7.791e-02, 4.145e-03, 1.330e-01, -1.645e-01, 1.230e-02)); + r += mul(s5_6, M4(-3.373e-02, 1.389e-03, -5.204e-02, 1.417e-01, 2.750e-02, -2.121e-01, 3.537e-02, -1.165e-01, -9.734e-02, -1.177e-01, -1.281e-01, 1.998e-03, -2.342e-02, -2.233e-02, 2.014e-02, -3.454e-02)); + r += mul(s5_7, M4(1.243e-01, 4.646e-02, 3.739e-02, -1.566e-01, -1.649e-01, 3.730e-03, -1.185e-01, -4.354e-02, -1.778e-02, -1.135e-01, -1.348e-01, 5.122e-02, 2.792e-02, -7.921e-02, -1.160e-01, 8.289e-02)); + r += mul(s5_8, M4(8.194e-03, 4.714e-02, 2.052e-01, 1.422e-01, -4.842e-02, 2.618e-02, -2.984e-02, -6.504e-02, 1.182e-01, -1.162e-02, -1.997e-01, 2.425e-02, 4.452e-02, -1.259e-02, -9.730e-02, 7.280e-02)); + r += mul(s6_0, M4(-8.571e-02, 1.186e-01, 1.233e-02, 1.387e-02, 9.057e-02, 1.115e-01, 2.179e-03, 6.594e-02, 2.330e-01, 3.804e-02, 1.034e-01, 4.844e-02, -9.847e-03, -2.905e-02, 5.979e-03, 1.292e-01)); + r += mul(s6_1, M4(2.553e-02, 2.555e-02, -7.010e-02, -3.260e-02, 4.235e-02, -8.416e-03, 5.704e-03, -6.912e-02, 3.865e-02, -2.399e-01, 2.407e-02, -6.606e-02, 1.687e-02, -1.138e-01, 2.578e-02, -1.999e-02)); + r += mul(s6_2, M4(-3.888e-02, 1.122e-02, -2.795e-02, 9.662e-02, 2.591e-02, 2.528e-02, 8.205e-02, 2.072e-02, -3.163e-01, -5.685e-02, -1.805e-01, -1.097e-01, -2.322e-01, 4.193e-02, 2.081e-01, 6.192e-02)); + r += mul(s6_3, M4(-1.587e-01, -1.986e-01, -1.124e-01, -5.828e-02, 6.789e-02, 9.969e-02, -3.875e-03, 8.378e-02, -1.463e-01, 3.364e-02, 5.932e-02, 4.116e-03, 7.922e-02, -6.432e-03, 1.013e-02, -2.830e-02)); + r += mul(s6_4, M4(8.316e-02, -6.667e-02, -1.269e-01, -2.602e-02, -1.090e-01, -2.036e-02, 4.056e-02, -1.868e-02, -1.277e-01, -9.614e-02, -1.978e-03, 3.213e-02, 1.918e-01, -3.292e-03, 3.931e-02, 4.892e-02)); + r += mul(s6_5, M4(-1.863e-02, 7.901e-02, -1.337e-01, -2.784e-02, -2.582e-02, -4.822e-02, -1.474e-01, -1.068e-01, -9.478e-02, -4.451e-02, -5.566e-02, -2.354e-02, 1.543e-01, -2.465e-02, -1.499e-01, 2.466e-02)); + r += mul(s6_6, M4(1.499e-01, -4.591e-02, -8.516e-03, -6.246e-02, -1.189e-01, 3.637e-02, -1.299e-01, 1.627e-01, 1.222e-01, 8.852e-02, 3.212e-03, 7.118e-02, -1.357e-02, 2.100e-02, 4.570e-03, -1.142e-01)); + r += mul(s6_7, M4(4.662e-02, 1.060e-02, 5.149e-02, 4.118e-02, -6.327e-02, 1.159e-01, -1.288e-03, -8.900e-02, 2.912e-01, -6.238e-02, 1.235e-02, -9.573e-02, 1.437e-02, 5.830e-02, 1.094e-01, 2.949e-02)); + r += mul(s6_8, M4(-3.209e-02, 5.889e-02, -1.010e-01, -6.904e-02, 6.960e-02, 3.590e-03, -5.111e-02, -4.199e-02, 1.622e-01, 3.661e-02, -3.815e-02, 8.151e-02, -1.278e-01, 1.048e-01, -1.009e-01, -2.499e-02)); + r += mul(s7_0, M4(4.288e-02, 2.392e-01, 2.314e-02, 8.080e-02, 2.546e-02, -1.373e-01, 1.117e-01, -1.685e-01, -1.819e-01, 1.207e-01, 2.163e-01, 8.378e-02, 3.947e-02, -3.408e-01, 8.933e-02, -4.154e-02)); + r += mul(s7_1, M4(9.584e-02, -4.602e-02, 1.720e-03, -1.151e-01, 1.934e-02, 6.536e-02, -3.617e-02, -3.821e-02, -2.219e-01, 1.750e-02, 1.317e-02, -3.834e-02, 5.001e-01, 2.384e-01, 1.160e-01, 9.402e-03)); + r += mul(s7_2, M4(1.313e-01, 3.794e-02, 7.627e-02, -4.446e-02, 1.638e-02, -5.554e-02, -4.113e-02, 7.161e-02, -2.881e-02, 6.571e-02, -5.144e-02, -2.328e-02, 1.982e-01, 4.741e-02, 7.447e-02, -1.606e-01)); + r += mul(s7_3, M4(3.180e-01, -6.699e-02, -2.630e-02, 2.820e-01, -7.095e-02, -2.209e-02, 4.669e-02, 2.435e-01, 1.191e-01, 5.831e-02, -1.845e-01, 5.569e-03, -2.660e-01, 1.263e-01, 1.461e-01, -1.263e-01)); + r += mul(s7_4, M4(-9.744e-02, -9.800e-03, 4.730e-02, 2.280e-01, -4.158e-02, 1.705e-01, -1.756e-01, -7.229e-02, 9.002e-02, 1.229e-01, -1.380e-02, 1.392e-01, -2.255e-01, 8.003e-03, 1.042e-01, 3.708e-01)); + r += mul(s7_5, M4(1.447e-01, 2.116e-02, 9.953e-02, -3.550e-02, 5.017e-02, 1.057e-01, -8.217e-02, 8.744e-03, 1.345e-01, 2.721e-02, 1.029e-01, -9.431e-02, -3.924e-01, 1.097e-01, -2.832e-01, 1.546e-01)); + r += mul(s7_6, M4(-3.546e-02, -1.809e-01, -9.086e-02, 1.546e-01, -8.928e-02, -8.232e-02, -8.062e-02, -8.184e-02, -1.697e-02, -1.375e-01, -7.805e-02, -1.554e-02, 2.654e-02, -3.685e-01, -3.469e-01, -1.440e-01)); + r += mul(s7_7, M4(-2.244e-01, -2.795e-02, -3.074e-02, 7.153e-02, 2.436e-02, -7.016e-02, -1.603e-02, 1.083e-01, -1.362e-01, -5.181e-02, 7.052e-02, 5.746e-02, 1.820e-01, 6.327e-03, -1.165e-02, 1.657e-01)); + r += mul(s7_8, M4(-1.553e-01, 2.828e-02, 5.395e-02, -4.372e-02, 3.593e-01, 2.295e-02, -4.591e-02, -4.522e-02, -5.343e-02, 6.061e-02, 3.451e-02, -3.592e-02, 4.702e-02, 2.445e-01, 5.456e-02, -4.491e-02)); + r += V4(1.188e-02, -5.847e-03, -6.198e-03, 1.196e-02); + return r; +} + +V4 f2(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(4.931e-02, -1.620e-02, 3.840e-02, -1.549e-01, 1.687e-01, 1.586e-01, 2.465e-02, 7.422e-03, -8.848e-02, 1.450e-01, -2.154e-01, 6.384e-02, 6.475e-02, 1.585e-01, -6.220e-02, 8.563e-02)); + r += mul(s0_1, M4(9.150e-02, 6.232e-02, 1.791e-02, -2.287e-02, 1.222e-02, -7.374e-03, -9.660e-02, 1.058e-01, 2.371e-02, -6.607e-02, 2.011e-01, -4.123e-02, 4.755e-02, 8.962e-02, -7.784e-02, 1.115e-01)); + r += mul(s0_2, M4(1.253e-01, -1.645e-02, 2.724e-03, -7.293e-03, 1.582e-02, -7.734e-02, 9.847e-02, -6.540e-02, 5.937e-02, -1.585e-02, -2.111e-01, -6.382e-02, 1.210e-01, -9.965e-02, 1.147e-01, 2.300e-02)); + r += mul(s0_3, M4(1.140e-01, -1.274e-01, -5.101e-02, -5.984e-02, -9.800e-02, -1.215e-01, 1.383e-01, 1.945e-02, 4.608e-02, 8.946e-02, 1.683e-02, 7.257e-03, 1.265e-01, 6.532e-02, 1.383e-01, -1.018e-01)); + r += mul(s0_4, M4(2.188e-02, 1.722e-01, 1.655e-02, -3.794e-02, -3.063e-02, 1.064e-01, -6.348e-02, 2.423e-02, 1.154e-01, -2.119e-01, 6.006e-02, 4.074e-02, 6.261e-02, 2.229e-02, -1.479e-01, 1.137e-01)); + r += mul(s0_5, M4(1.043e-01, 3.299e-02, -2.709e-02, 2.662e-02, 7.709e-02, 3.069e-02, 5.687e-02, -7.690e-03, -1.651e-01, 2.707e-02, -3.127e-02, -1.623e-02, 3.458e-02, 6.050e-02, -5.945e-02, -4.582e-02)); + r += mul(s0_6, M4(8.463e-02, 3.034e-02, -3.368e-02, -5.227e-03, 1.183e-02, 2.833e-02, 7.060e-02, -5.617e-02, -7.726e-02, -1.494e-01, 8.997e-02, 2.586e-02, -9.478e-02, -1.036e-01, -1.880e-01, 3.941e-02)); + r += mul(s0_7, M4(-5.805e-03, -5.985e-02, -2.067e-02, 6.773e-02, 8.510e-02, -4.496e-02, -9.020e-02, 4.270e-03, 9.125e-02, -7.380e-02, 1.010e-02, -8.613e-03, -1.178e-01, -1.061e-01, -2.188e-02, 1.044e-02)); + r += mul(s0_8, M4(-3.733e-02, 3.283e-02, -4.618e-02, -4.285e-02, -6.668e-02, -9.029e-02, 1.092e-01, -2.894e-03, -5.508e-02, -6.132e-02, 5.218e-02, -8.097e-02, -6.732e-02, 1.058e-01, -5.113e-02, 1.074e-01)); + r += mul(s1_0, M4(1.130e-01, 6.127e-02, -1.749e-02, -6.534e-02, -1.035e-01, 1.048e-01, -1.353e-01, 3.567e-02, -1.930e-02, -7.667e-02, -7.980e-02, -1.448e-01, -5.444e-02, 1.102e-01, -9.306e-03, 5.581e-02)); + r += mul(s1_1, M4(-7.318e-02, 2.685e-02, 2.261e-02, 7.976e-02, -1.067e-01, -2.688e-01, 4.436e-02, 7.789e-02, -6.288e-02, 1.418e-01, 3.727e-02, 1.334e-01, -1.607e-01, -1.550e-01, -2.507e-02, -2.109e-03)); + r += mul(s1_2, M4(-1.630e-01, 9.466e-02, -4.983e-02, -4.514e-02, -2.337e-01, -1.183e-01, 8.778e-03, 1.591e-02, -2.269e-02, -3.599e-02, 3.178e-02, 1.132e-02, 4.432e-02, 1.343e-01, 2.935e-02, 9.254e-02)); + r += mul(s1_3, M4(1.499e-02, -2.522e-01, -5.516e-02, -3.723e-02, 7.456e-02, -5.486e-02, 3.520e-02, 1.543e-01, -6.918e-02, 1.577e-01, 8.023e-02, -2.114e-02, -2.013e-02, -9.676e-03, -5.755e-02, 1.012e-02)); + r += mul(s1_4, M4(9.258e-02, -1.213e-01, -1.900e-01, -1.896e-02, -5.598e-02, 8.796e-02, 9.096e-03, 7.257e-02, -1.115e-01, -1.095e-01, -1.428e-01, 4.173e-02, 1.057e-02, -1.400e-01, -6.675e-02, 1.536e-01)); + r += mul(s1_5, M4(1.526e-01, 2.140e-01, 1.820e-02, -3.331e-02, 3.502e-01, 7.911e-03, -1.580e-01, -2.524e-02, 6.383e-02, 9.007e-02, 5.348e-03, -1.111e-01, -6.671e-02, 1.192e-01, -6.390e-02, 1.555e-02)); + r += mul(s1_6, M4(1.229e-02, -9.820e-04, 5.709e-03, 1.341e-02, -6.908e-02, 5.506e-02, -2.072e-01, 2.365e-02, 1.616e-01, -2.105e-02, -2.334e-02, 4.507e-02, 7.618e-02, -1.112e-01, 1.182e-01, -1.386e-01)); + r += mul(s1_7, M4(-2.034e-02, 7.350e-02, 1.186e-01, 4.581e-02, 2.846e-02, 5.164e-02, 1.030e-01, 5.490e-02, -4.674e-02, -1.053e-02, -4.939e-02, 8.077e-03, 1.548e-01, 1.337e-01, -3.645e-03, 1.178e-01)); + r += mul(s1_8, M4(-1.786e-01, 5.271e-02, -1.207e-02, 8.533e-02, -2.222e-01, 1.050e-01, 1.098e-01, -4.937e-02, 9.097e-02, 3.310e-02, -4.412e-03, -1.354e-02, -3.125e-02, 1.033e-01, 6.936e-02, 2.212e-02)); + r += mul(s2_0, M4(-5.982e-02, 5.552e-02, -9.409e-03, -2.199e-02, 7.282e-02, -6.714e-02, 3.140e-02, 1.189e-01, -1.357e-01, 4.945e-02, -9.183e-02, -4.823e-02, -1.664e-01, -6.090e-02, 1.250e-01, 2.663e-02)); + r += mul(s2_1, M4(2.770e-02, 4.888e-02, -1.101e-01, 1.018e-02, 1.057e-01, 3.733e-02, -3.370e-02, -9.007e-02, 5.054e-02, 1.355e-01, 5.278e-02, -4.290e-02, -4.388e-02, 1.006e-01, -8.385e-02, -5.278e-02)); + r += mul(s2_2, M4(4.752e-03, 1.637e-02, 4.455e-02, -8.651e-02, -4.853e-02, 5.247e-04, 4.343e-02, 4.057e-02, 4.907e-02, 4.106e-02, -4.624e-02, -3.159e-02, 2.605e-02, 4.703e-02, 8.334e-03, -1.679e-01)); + r += mul(s2_3, M4(5.956e-03, -9.383e-02, -3.345e-02, 1.447e-02, 1.451e-01, 1.704e-02, -2.239e-01, 4.357e-02, 7.440e-02, -1.747e-01, 3.916e-02, 5.365e-02, 8.042e-02, 7.271e-02, -2.975e-01, -3.541e-02)); + r += mul(s2_4, M4(-5.668e-02, -1.859e-01, 1.089e-02, 4.463e-02, 2.718e-02, -3.862e-02, 1.065e-01, -3.353e-02, -5.402e-02, -9.449e-02, -1.545e-01, -1.360e-01, -1.601e-01, -1.531e-01, -1.968e-01, 8.281e-02)); + r += mul(s2_5, M4(-5.144e-02, -3.722e-02, 8.142e-02, -5.951e-02, 1.182e-01, -9.840e-02, 2.036e-01, 7.334e-02, -1.637e-02, 1.501e-02, 1.250e-01, 1.854e-03, -9.333e-04, 1.256e-02, 1.218e-01, 1.536e-01)); + r += mul(s2_6, M4(-1.765e-01, 4.622e-02, 2.283e-02, 5.905e-02, -9.045e-02, 1.294e-01, -8.123e-02, -1.271e-01, -2.697e-02, 6.241e-03, -6.811e-02, 4.590e-02, -1.384e-01, 6.209e-02, 3.734e-02, 1.074e-01)); + r += mul(s2_7, M4(-1.121e-02, 2.714e-03, -1.445e-02, 8.286e-02, -1.551e-01, 1.810e-01, -1.864e-02, -7.961e-02, -2.730e-02, 8.485e-02, 7.550e-02, -1.792e-02, 2.392e-02, -9.604e-02, 1.290e-01, 8.964e-02)); + r += mul(s2_8, M4(6.928e-02, -4.838e-02, -3.492e-02, 5.158e-02, -7.985e-02, -5.230e-03, -1.658e-01, 1.593e-01, -4.329e-02, 6.040e-03, 8.456e-02, 4.682e-02, 6.816e-02, 4.399e-02, 5.442e-02, -1.964e-02)); + r += mul(s3_0, M4(5.881e-02, -4.879e-02, 1.846e-01, 1.472e-01, 5.419e-02, 8.747e-02, -6.970e-02, 4.205e-02, -5.599e-02, -7.376e-03, -3.877e-02, 5.823e-02, -9.323e-02, -8.103e-02, -2.349e-03, 8.759e-02)); + r += mul(s3_1, M4(1.022e-01, 2.743e-01, -2.047e-01, 7.111e-02, 7.135e-02, 1.308e-01, -1.863e-01, -1.110e-01, 1.067e-01, 6.486e-02, 3.243e-02, -6.511e-02, -2.439e-02, 1.668e-04, -1.157e-02, 2.933e-02)); + r += mul(s3_2, M4(1.244e-01, -7.002e-02, 7.723e-03, -3.796e-02, 8.125e-02, -3.934e-02, -4.218e-02, -1.444e-03, 7.520e-03, -1.074e-01, -1.940e-02, 7.347e-02, -2.173e-02, 5.112e-02, 2.157e-02, -1.640e-01)); + r += mul(s3_3, M4(6.504e-02, -2.780e-02, -7.144e-02, -3.487e-02, 1.528e-02, 6.679e-02, 2.926e-02, 5.872e-02, 1.227e-01, 6.072e-02, 1.872e-02, 7.009e-02, 3.820e-02, 1.365e-01, 3.983e-02, -2.216e-02)); + r += mul(s3_4, M4(-1.734e-02, 9.274e-02, -6.396e-02, 5.379e-02, 5.036e-02, -2.001e-01, 2.124e-03, -1.608e-02, -1.849e-01, 7.496e-02, -4.061e-02, -2.447e-03, 2.164e-02, -1.727e-01, -6.730e-02, 1.730e-01)); + r += mul(s3_5, M4(-2.699e-02, 6.652e-02, 7.248e-02, 2.157e-01, 3.969e-02, -1.370e-01, -5.664e-02, 1.411e-02, 1.697e-02, -6.388e-02, 5.160e-02, 9.844e-03, -1.168e-03, -5.753e-02, -9.196e-02, 1.159e-01)); + r += mul(s3_6, M4(1.232e-01, -1.785e-01, 1.381e-01, -1.288e-01, -1.078e-01, -2.209e-02, -3.333e-02, -1.648e-01, -5.078e-02, -7.208e-02, 1.227e-01, -9.708e-02, -4.265e-02, 1.253e-02, 2.227e-02, 1.477e-01)); + r += mul(s3_7, M4(1.667e-01, 1.519e-01, 5.866e-02, 6.226e-02, -4.685e-02, 5.933e-02, 2.744e-02, -1.257e-03, -1.805e-02, 1.363e-01, -1.859e-02, 1.137e-02, 1.244e-01, -4.332e-02, 7.954e-02, -6.113e-02)); + r += mul(s3_8, M4(-4.157e-02, -2.668e-02, 1.479e-01, 9.121e-02, -7.333e-02, -5.809e-02, 3.353e-02, 8.973e-02, -1.920e-04, -1.736e-02, 3.458e-02, -8.027e-02, 5.179e-02, -7.594e-02, 6.121e-02, -1.449e-01)); + r += mul(s4_0, M4(2.404e-02, -1.164e-01, -1.138e-02, 5.854e-02, 9.871e-02, -1.055e-01, 2.907e-02, -1.130e-01, 1.670e-03, 3.422e-01, -1.455e-01, 3.089e-03, -8.779e-03, -4.675e-02, 1.635e-02, 5.429e-02)); + r += mul(s4_1, M4(-4.927e-02, -1.494e-01, -1.363e-01, -8.057e-02, -3.957e-02, 5.070e-03, 9.885e-02, -2.611e-01, 1.661e-02, 7.429e-02, -1.809e-01, -3.009e-02, 1.109e-02, -5.557e-02, 1.494e-01, -1.566e-02)); + r += mul(s4_2, M4(-1.329e-01, -6.097e-02, 2.384e-01, -4.837e-02, 5.236e-02, 6.857e-02, 4.869e-02, -6.618e-02, -2.154e-01, 9.844e-02, 2.918e-02, 1.900e-02, -1.062e-02, -7.214e-02, 1.180e-01, -6.203e-02)); + r += mul(s4_3, M4(1.281e-01, -1.015e-02, -8.635e-02, 6.216e-02, 5.106e-02, 4.553e-02, -9.132e-02, -2.484e-02, -7.828e-02, -2.227e-01, -1.006e-01, 1.009e-01, -1.450e-01, -1.877e-01, 1.200e-01, 3.058e-02)); + r += mul(s4_4, M4(8.169e-03, 9.841e-02, 1.590e-01, -8.570e-02, -4.525e-03, -7.477e-02, -2.096e-01, -1.915e-01, 8.201e-03, -1.837e-01, 2.929e-03, 1.767e-01, -3.800e-01, 4.100e-01, -7.337e-02, -5.512e-01)); + r += mul(s4_5, M4(-1.698e-02, 9.353e-03, -2.194e-02, 3.709e-02, 1.136e-01, 1.274e-01, -2.037e-02, -7.867e-02, -3.543e-02, -2.823e-02, -1.751e-01, -1.625e-02, -6.710e-01, 2.510e-01, -8.507e-02, 8.663e-02)); + r += mul(s4_6, M4(-5.057e-02, -1.664e-01, 4.927e-02, 1.236e-01, 6.142e-02, -7.625e-02, -1.189e-01, 4.509e-02, -4.795e-02, 4.793e-02, 2.019e-01, 3.237e-02, 3.277e-01, 9.403e-03, 4.279e-01, -4.445e-01)); + r += mul(s4_7, M4(5.685e-02, -3.024e-02, 1.198e-01, -1.815e-01, 1.008e-01, -5.949e-02, -1.880e-02, 6.315e-02, 1.006e-01, 1.555e-01, 1.411e-02, 2.371e-02, -1.432e-01, -4.057e-01, 2.001e-01, 4.903e-01)); + r += mul(s4_8, M4(-1.706e-01, -2.948e-02, 1.877e-02, 6.796e-02, 4.987e-02, 2.595e-02, -6.672e-02, -1.169e-01, 1.050e-01, -2.239e-02, -1.343e-01, 1.567e-01, 1.017e-01, 7.630e-02, 6.812e-02, -2.360e-01)); + r += mul(s5_0, M4(-1.026e-01, -9.333e-03, -1.186e-02, 1.726e-02, -2.644e-02, 6.857e-02, -9.080e-02, -1.468e-02, -4.155e-02, 9.636e-03, -1.099e-02, -2.825e-02, -1.214e-01, -1.480e-01, 8.756e-02, -6.853e-02)); + r += mul(s5_1, M4(4.594e-02, 1.473e-02, -3.919e-02, -9.868e-02, 5.624e-02, -9.622e-03, -1.046e-01, 7.397e-03, -4.288e-02, -9.412e-02, -7.071e-02, 6.349e-02, -3.281e-02, 7.772e-02, 1.582e-02, 1.875e-03)); + r += mul(s5_2, M4(-6.861e-02, -5.088e-04, -2.646e-02, -9.557e-03, -6.081e-03, 7.298e-02, -2.280e-02, 9.319e-04, -7.459e-02, 1.291e-01, -2.097e-01, 1.813e-02, -1.205e-01, -2.198e-02, -3.807e-02, 1.295e-02)); + r += mul(s5_3, M4(-1.126e-01, 3.457e-02, -1.185e-01, -3.790e-02, -9.439e-02, 2.656e-01, -5.974e-02, -3.799e-02, -2.252e-02, -1.287e-01, -1.324e-01, 1.224e-02, 1.002e-01, 4.122e-02, 7.938e-02, -1.297e-01)); + r += mul(s5_4, M4(1.739e-01, 2.231e-01, 7.596e-02, 9.382e-02, 1.795e-02, 1.921e-02, -1.567e-01, -1.585e-01, 1.174e-01, -4.394e-02, 2.407e-01, 1.421e-01, 1.677e-01, 1.530e-02, 9.640e-02, -9.999e-02)); + r += mul(s5_5, M4(1.078e-01, -1.276e-01, 9.488e-03, 9.875e-02, 1.593e-01, -8.027e-02, -1.457e-01, 7.180e-02, 1.792e-01, 1.438e-01, -6.062e-02, -1.219e-02, -4.171e-02, 8.089e-02, -9.086e-02, -8.803e-02)); + r += mul(s5_6, M4(9.794e-02, -3.144e-02, 4.680e-02, -1.580e-01, -4.249e-03, -1.870e-01, 3.627e-03, 7.838e-03, 1.359e-02, -1.264e-01, 6.932e-02, 7.400e-02, -1.946e-02, 1.593e-02, 4.671e-02, 7.116e-02)); + r += mul(s5_7, M4(-1.665e-01, 1.720e-02, 5.782e-02, -4.723e-02, 6.617e-02, -5.133e-02, 8.327e-02, 1.317e-01, 6.304e-02, -1.321e-02, 1.514e-01, -1.111e-03, -1.049e-01, 1.437e-01, -6.917e-02, 1.570e-01)); + r += mul(s5_8, M4(-5.411e-02, -4.024e-02, -6.895e-02, 9.743e-02, 3.381e-02, -5.184e-02, 7.640e-02, -4.415e-02, 1.827e-01, -5.557e-02, -9.430e-02, 9.215e-02, 2.314e-02, -1.233e-01, 9.551e-02, -5.879e-02)); + r += mul(s6_0, M4(1.019e-01, -1.160e-01, -1.117e-01, 7.118e-02, 2.089e-03, 5.206e-02, 4.623e-02, 3.643e-02, -3.738e-02, 5.755e-04, -1.176e-01, -2.748e-02, 7.664e-02, 5.507e-03, 4.856e-02, -7.044e-02)); + r += mul(s6_1, M4(-3.747e-02, -3.721e-02, -1.471e-01, -9.818e-02, -1.362e-02, 9.418e-02, -8.926e-02, -1.773e-01, 1.578e-02, 1.980e-01, 1.631e-02, -1.074e-01, -2.902e-02, -5.877e-02, -1.368e-01, -1.013e-01)); + r += mul(s6_2, M4(9.635e-02, -3.415e-02, -1.096e-02, -2.239e-02, -3.471e-02, -4.742e-02, -2.250e-03, -8.195e-02, 2.635e-01, 1.230e-01, -1.409e-01, -2.675e-02, 8.787e-02, 1.284e-01, 3.220e-02, 1.199e-01)); + r += mul(s6_3, M4(-7.406e-02, 2.281e-02, -7.353e-02, -2.355e-02, -1.000e-01, -8.840e-02, 6.633e-02, 9.242e-02, -3.978e-02, -9.135e-02, -4.362e-02, 8.695e-02, 1.624e-01, 2.886e-02, 4.969e-02, -2.134e-02)); + r += mul(s6_4, M4(2.339e-01, 1.537e-01, -8.771e-02, 4.382e-02, 1.293e-01, 7.131e-03, -3.922e-02, 1.542e-01, -9.606e-02, -1.144e-01, 1.106e-01, 1.071e-01, -2.441e-02, -5.037e-02, 9.706e-03, 5.595e-03)); + r += mul(s6_5, M4(-1.365e-02, -6.977e-02, -1.378e-01, -1.183e-01, -1.450e-01, 4.283e-02, 3.894e-02, 9.293e-04, -9.859e-03, 1.991e-03, 1.413e-01, -1.364e-01, -2.911e-02, -1.346e-01, 2.264e-01, -7.699e-02)); + r += mul(s6_6, M4(1.082e-01, -3.785e-02, 1.042e-01, 7.449e-02, -4.076e-02, 1.806e-01, -4.700e-02, -3.203e-02, 3.828e-02, -1.632e-01, 6.974e-02, 8.389e-02, 2.752e-02, 7.529e-02, -2.757e-02, 9.510e-03)); + r += mul(s6_7, M4(1.642e-02, -3.839e-02, -1.549e-01, 1.151e-01, 3.545e-03, -1.838e-01, 6.595e-02, -9.679e-03, -2.515e-02, -1.950e-01, 7.938e-02, 7.677e-03, 2.181e-02, 1.664e-01, -3.621e-03, 3.611e-02)); + r += mul(s6_8, M4(2.674e-02, -2.492e-02, -5.711e-02, 9.085e-02, 1.396e-01, 2.214e-02, -6.456e-02, 4.379e-02, 2.190e-01, 1.475e-01, -9.394e-02, 8.779e-02, 6.055e-03, -1.129e-01, 3.130e-02, -1.999e-02)); + r += mul(s7_0, M4(2.205e-02, -2.363e-02, 1.441e-01, 5.374e-02, 7.935e-02, -1.424e-02, -2.127e-01, 1.159e-01, -4.861e-02, 1.047e-01, -9.611e-02, -5.270e-02, -4.079e-01, 6.181e-02, -5.217e-02, 1.953e-01)); + r += mul(s7_1, M4(-1.238e-01, 7.560e-02, 1.279e-01, 4.693e-02, 5.662e-02, -1.319e-01, 3.728e-02, 1.490e-02, -4.409e-02, -1.999e-02, 2.201e-01, -6.893e-04, 3.261e-01, -1.014e-01, 1.694e-01, -4.550e-02)); + r += mul(s7_2, M4(1.303e-01, 1.327e-01, 2.736e-02, -4.189e-03, 8.621e-03, -1.371e-01, 2.693e-03, 2.422e-02, -3.366e-01, 2.291e-02, -7.167e-02, -6.592e-02, -1.545e-01, 2.992e-01, -1.505e-01, 2.432e-01)); + r += mul(s7_3, M4(-1.066e-01, 4.974e-02, 1.635e-02, 1.384e-01, -2.753e-01, 2.443e-02, 1.366e-01, 7.437e-02, -1.866e-02, -2.068e-01, 4.871e-02, -9.708e-05, 1.050e-01, -1.108e-01, 2.510e-01, -7.779e-02)); + r += mul(s7_4, M4(9.602e-03, 1.465e-01, 2.812e-01, 1.650e-01, 1.805e-01, 9.178e-02, -1.847e-01, 5.806e-02, 8.891e-02, -2.861e-01, -9.379e-02, -2.006e-03, 2.273e-02, -1.977e-01, -2.671e-01, -1.935e-01)); + r += mul(s7_5, M4(-9.270e-03, -5.858e-03, 8.844e-02, 1.220e-01, -1.117e-01, -3.462e-02, -1.914e-01, -9.941e-02, 4.355e-02, 3.478e-02, 2.279e-02, -8.352e-03, 9.003e-02, -1.728e-01, 1.180e-01, 4.944e-02)); + r += mul(s7_6, M4(-2.112e-02, 1.466e-01, -3.346e-02, -5.734e-03, 4.897e-02, -1.847e-01, -1.042e-01, 3.695e-02, 9.723e-02, 9.810e-03, 3.768e-02, 5.925e-02, -2.518e-02, 9.795e-02, -1.788e-01, 1.317e-01)); + r += mul(s7_7, M4(-5.512e-02, -1.030e-01, -1.277e-01, 2.627e-03, 9.803e-03, -1.003e-01, 1.075e-01, -8.339e-02, 4.143e-02, 1.451e-01, 6.543e-02, 2.479e-02, 1.328e-01, 2.868e-01, 5.144e-02, -1.236e-01)); + r += mul(s7_8, M4(-1.184e-01, -4.673e-02, 7.195e-02, -4.310e-02, 6.142e-02, 9.421e-02, 1.790e-02, -4.130e-02, -4.211e-02, 1.720e-01, -6.732e-02, 1.266e-01, -5.543e-01, -4.747e-02, -1.062e-01, -2.950e-02)); + r += V4(-1.614e-02, 2.521e-02, 3.821e-02, 2.764e-02); + return r; +} + +V4 f3(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-8.326e-02, -5.179e-02, -1.014e-01, -1.485e-02, 3.131e-02, -1.124e-01, 1.421e-01, 7.704e-02, 1.518e-01, 1.619e-01, -1.141e-01, -4.209e-02, 1.536e-01, -4.357e-02, 1.472e-01, -1.684e-01)); + r += mul(s0_1, M4(1.771e-02, 4.705e-02, -2.494e-02, 1.011e-01, -8.396e-02, -1.821e-02, 3.958e-02, -3.671e-02, 2.742e-02, 2.128e-01, 5.280e-02, -9.654e-02, 1.749e-01, -3.305e-02, -8.326e-02, -2.381e-02)); + r += mul(s0_2, M4(1.627e-02, -1.545e-02, 3.017e-02, -9.665e-02, 5.771e-02, 4.235e-02, 1.274e-01, -1.735e-02, 1.687e-02, 4.105e-02, -9.621e-02, -7.352e-02, 1.323e-01, 1.548e-01, -3.420e-01, -1.192e-01)); + r += mul(s0_3, M4(-6.757e-02, -1.626e-01, -9.287e-03, 2.987e-02, 5.314e-02, 9.609e-02, 2.799e-02, 2.372e-02, 8.674e-02, -8.658e-02, 4.220e-02, 1.121e-02, 1.641e-01, 7.780e-02, -1.461e-01, 4.765e-02)); + r += mul(s0_4, M4(1.400e-02, 2.520e-02, 1.801e-01, -1.146e-02, 2.241e-02, 9.752e-03, 6.976e-02, 1.272e-02, -1.368e-03, -1.537e-01, 2.347e-01, -8.087e-02, -1.757e-02, -1.548e-01, -3.905e-01, 1.874e-01)); + r += mul(s0_5, M4(-6.312e-03, 7.002e-02, 1.704e-01, -9.698e-02, 2.582e-02, 9.538e-02, -1.104e-01, 6.735e-02, 1.160e-01, -1.162e-01, 1.503e-01, 1.101e-01, 1.290e-01, -1.252e-01, 2.056e-01, 1.420e-01)); + r += mul(s0_6, M4(-9.448e-02, -6.469e-02, 2.558e-02, -6.533e-02, -4.299e-02, -6.361e-02, -6.671e-02, 1.207e-01, -3.438e-02, -4.458e-02, 3.696e-02, -9.743e-03, 7.698e-02, 1.019e-01, 1.135e-01, -1.964e-01)); + r += mul(s0_7, M4(-1.068e-01, 1.702e-01, 1.021e-01, 5.547e-02, -2.979e-02, 1.792e-01, 6.735e-02, -9.586e-02, 3.221e-02, -2.029e-02, 2.762e-02, 1.472e-01, 1.998e-01, 1.276e-01, -3.826e-01, -1.524e-01)); + r += mul(s0_8, M4(7.166e-02, -1.939e-02, -4.533e-02, 5.115e-02, 3.885e-02, 3.863e-02, 5.534e-02, 6.745e-02, -1.177e-01, 5.674e-02, -1.116e-01, 1.091e-02, 7.271e-02, 1.971e-01, 5.825e-02, 2.648e-02)); + r += mul(s1_0, M4(-2.985e-02, -6.977e-03, 1.502e-02, -4.237e-02, -6.150e-02, -8.724e-02, 9.823e-02, -7.877e-02, -1.148e-01, -2.574e-02, -7.462e-02, 3.344e-03, -6.090e-02, 5.604e-02, 8.273e-03, -1.186e-02)); + r += mul(s1_1, M4(-6.173e-02, 1.370e-01, -6.726e-02, -3.736e-02, -1.585e-01, 9.732e-04, 3.423e-02, -2.137e-01, -1.070e-01, -6.263e-02, 1.619e-01, -1.274e-01, 9.716e-02, -8.335e-02, 2.113e-01, -1.214e-01)); + r += mul(s1_2, M4(-6.260e-02, -5.981e-02, -8.393e-02, 8.858e-02, -8.536e-02, 2.466e-02, -7.342e-02, -1.135e-01, -8.817e-02, -6.417e-02, 2.687e-01, -9.302e-03, 4.948e-02, -2.724e-02, 3.542e-02, -1.847e-01)); + r += mul(s1_3, M4(-1.947e-01, -5.129e-02, -5.875e-02, -1.294e-01, 7.456e-02, -3.294e-02, -1.164e-01, 3.147e-02, 1.105e-01, -7.800e-03, -1.341e-01, 5.646e-02, 2.305e-02, 6.816e-02, -1.050e-01, -1.981e-02)); + r += mul(s1_4, M4(-1.374e-01, 1.100e-01, -1.970e-01, -2.040e-01, 1.153e-01, -8.221e-03, 1.182e-02, 7.866e-02, -4.267e-02, -2.319e-02, 1.139e-01, 5.023e-02, 1.279e-02, -2.280e-01, -2.890e-02, 5.584e-02)); + r += mul(s1_5, M4(5.544e-03, -9.470e-02, 1.354e-02, 7.002e-02, -7.227e-02, 5.340e-04, 1.252e-01, -3.061e-02, -2.357e-02, -3.469e-04, -3.324e-02, 1.115e-01, 1.028e-01, 4.810e-02, -1.727e-02, -3.001e-02)); + r += mul(s1_6, M4(4.899e-02, 1.318e-01, 1.553e-01, -2.315e-02, -4.646e-03, 1.413e-01, 1.029e-01, -2.475e-02, -1.527e-02, 9.400e-02, 1.119e-03, -2.839e-02, -4.058e-02, -6.777e-02, -6.896e-02, 7.025e-04)); + r += mul(s1_7, M4(1.038e-02, 7.905e-02, 2.851e-02, -1.023e-01, -2.227e-02, 1.609e-01, -1.733e-01, -1.304e-01, 2.193e-01, 3.562e-02, -5.497e-02, -2.394e-02, -7.459e-03, -1.197e-01, -2.663e-02, -1.888e-02)); + r += mul(s1_8, M4(6.417e-02, 1.725e-01, 1.523e-01, 2.154e-04, 1.190e-01, -1.166e-01, -7.423e-02, 7.596e-02, 1.757e-02, 1.179e-01, -6.535e-02, -3.646e-02, -1.772e-01, 5.586e-03, -8.030e-02, -2.306e-03)); + r += mul(s2_0, M4(-9.393e-02, 1.287e-02, -1.328e-01, -6.069e-02, -7.914e-03, -6.174e-03, -2.700e-02, -2.981e-02, -4.530e-03, 1.140e-01, -1.473e-01, 5.666e-03, -3.409e-02, 2.801e-02, -1.334e-02, 2.986e-02)); + r += mul(s2_1, M4(2.549e-02, 2.743e-02, -2.851e-02, -2.756e-02, 9.961e-02, -3.039e-01, 8.524e-02, -2.354e-01, 3.423e-02, -2.416e-01, -3.891e-02, -2.150e-02, 2.046e-01, -8.982e-02, -1.130e-01, -4.199e-02)); + r += mul(s2_2, M4(-2.586e-02, -4.030e-02, 3.935e-02, -7.586e-02, 4.642e-02, 9.049e-02, 2.109e-01, 6.298e-02, 4.561e-02, 1.509e-01, -1.819e-02, 1.339e-05, 2.124e-01, -5.311e-02, 7.544e-02, -5.366e-02)); + r += mul(s2_3, M4(-1.209e-01, -1.920e-02, 9.824e-02, -6.932e-02, -1.006e-01, 7.977e-02, -1.363e-01, -1.108e-01, 1.081e-01, -9.327e-02, 1.160e-01, -1.157e-01, -1.970e-01, 4.551e-02, -1.152e-01, 8.449e-02)); + r += mul(s2_4, M4(1.356e-01, -8.713e-02, -1.004e-01, 1.772e-01, -9.327e-02, 2.204e-03, 6.566e-02, 1.488e-01, 2.008e-01, -2.937e-04, 1.013e-03, -1.063e-02, -8.310e-02, 9.119e-02, -1.981e-01, 2.115e-01)); + r += mul(s2_5, M4(-2.908e-02, 5.297e-02, 1.070e-02, -7.295e-02, 4.276e-02, 7.299e-02, -1.499e-01, -6.412e-02, 3.087e-03, -1.347e-01, -3.191e-02, 5.867e-02, -5.096e-02, 1.994e-01, -9.654e-02, -6.233e-02)); + r += mul(s2_6, M4(-7.457e-02, 1.169e-02, 6.041e-02, 2.287e-02, 3.144e-02, 9.443e-02, 8.522e-02, 2.124e-01, 1.692e-02, 8.102e-02, 5.781e-02, -7.383e-02, 7.701e-03, -1.401e-01, 6.164e-02, 4.776e-02)); + r += mul(s2_7, M4(2.287e-02, 7.160e-02, 5.061e-02, 2.345e-01, 3.142e-04, 3.323e-02, 4.118e-02, 1.516e-01, -1.404e-01, -5.534e-02, 8.570e-02, -1.280e-01, -1.049e-01, 6.664e-02, -8.468e-03, -4.457e-02)); + r += mul(s2_8, M4(3.520e-02, -6.025e-02, 8.219e-03, -1.640e-02, 3.324e-02, -8.053e-02, 4.475e-02, -5.586e-02, -7.904e-02, 1.436e-01, -1.856e-01, 1.145e-01, -1.769e-02, -4.285e-02, 1.588e-01, 1.335e-02)); + r += mul(s3_0, M4(4.944e-02, -1.403e-01, -2.631e-02, 1.373e-02, -5.896e-02, -2.219e-02, 2.393e-02, 1.464e-01, -1.430e-01, -1.396e-01, 9.449e-02, -2.762e-03, 2.572e-02, 1.400e-01, -2.872e-02, -6.719e-02)); + r += mul(s3_1, M4(-2.288e-01, -6.178e-02, -7.404e-03, 2.681e-01, -2.969e-02, 7.872e-02, -2.298e-01, 1.912e-02, 7.017e-02, -1.880e-01, -2.289e-02, 1.225e-01, 3.652e-03, -2.404e-02, -1.499e-02, -1.863e-02)); + r += mul(s3_2, M4(1.464e-01, 1.823e-02, 3.211e-02, -9.460e-02, 5.059e-02, 3.725e-02, 9.253e-02, 1.757e-01, -1.211e-02, -8.096e-02, 2.255e-01, -8.469e-02, -1.871e-02, 3.408e-02, -4.358e-02, 9.228e-02)); + r += mul(s3_3, M4(5.826e-02, -1.529e-01, 2.406e-01, -4.118e-02, 9.928e-03, -2.752e-02, -7.460e-02, -1.104e-01, 2.616e-02, -4.191e-03, 1.889e-01, 2.877e-02, -2.461e-02, 1.909e-01, -1.758e-02, 8.529e-02)); + r += mul(s3_4, M4(1.911e-01, -1.963e-01, 7.031e-02, -2.712e-02, -6.693e-02, -1.253e-01, -7.022e-02, 1.076e-01, 7.105e-02, -5.231e-02, -1.812e-02, -2.366e-01, -5.431e-02, -3.507e-02, 1.831e-01, 1.688e-01)); + r += mul(s3_5, M4(1.715e-01, 3.983e-02, 3.387e-02, -7.281e-02, 8.577e-02, 4.920e-02, -4.497e-02, 3.540e-02, -1.968e-01, 1.319e-02, -5.080e-03, 1.160e-01, -1.669e-02, 9.543e-02, 8.210e-02, 3.069e-02)); + r += mul(s3_6, M4(1.154e-01, 3.190e-01, -1.976e-01, -5.784e-02, 2.538e-04, -1.695e-02, 6.684e-03, -4.450e-02, -1.390e-01, -2.080e-02, 7.287e-03, 2.422e-02, -5.000e-02, 6.889e-03, 1.045e-02, -9.254e-02)); + r += mul(s3_7, M4(2.238e-01, 2.884e-01, -3.807e-02, -5.091e-02, 6.215e-02, 3.840e-02, 4.476e-02, -6.182e-02, -1.363e-01, -3.109e-02, 5.029e-02, -1.368e-01, -8.338e-02, 8.136e-02, -9.682e-02, 2.684e-02)); + r += mul(s3_8, M4(3.755e-03, 6.056e-02, 2.195e-01, -1.970e-01, -1.904e-02, 5.641e-02, 2.645e-02, -1.016e-01, -1.372e-01, 6.136e-02, -6.334e-02, 1.308e-02, 3.897e-03, 9.121e-02, -4.263e-02, -3.809e-02)); + r += mul(s4_0, M4(-3.172e-03, 9.071e-02, -7.858e-02, 3.536e-02, -2.662e-02, -3.669e-02, 1.433e-01, 1.548e-01, -1.451e-02, -5.087e-02, -9.387e-02, -2.118e-02, -8.711e-02, -1.018e-01, -5.008e-02, 4.548e-02)); + r += mul(s4_1, M4(-1.240e-01, -8.119e-02, -5.809e-02, 8.099e-02, 5.574e-02, 1.394e-01, -1.312e-02, 3.641e-02, -1.113e-01, 1.367e-02, 1.004e-01, 9.562e-02, 3.457e-01, 1.205e-01, -3.849e-02, -1.098e-01)); + r += mul(s4_2, M4(8.104e-02, -4.261e-03, 1.763e-02, 9.447e-02, -1.450e-01, -1.122e-01, 8.809e-03, 5.113e-02, -1.808e-02, 1.881e-02, -5.663e-02, 1.502e-01, 6.830e-03, 2.102e-01, -1.834e-01, -2.410e-01)); + r += mul(s4_3, M4(-4.601e-02, 4.841e-02, 6.165e-02, 1.204e-01, 9.738e-03, -6.767e-02, -1.472e-01, -5.010e-02, 9.939e-02, 1.177e-02, 9.922e-02, 8.187e-02, -2.389e-01, 1.037e-02, -1.685e-01, -1.365e-01)); + r += mul(s4_4, M4(-1.151e-01, 8.682e-02, 1.895e-01, -7.463e-02, 2.587e-01, -1.716e-01, -1.493e-02, 2.002e-02, -4.644e-02, 1.521e-02, -1.502e-01, 4.996e-02, 6.616e-02, 2.235e-01, 1.984e-01, -5.131e-01)); + r += mul(s4_5, M4(1.073e-01, 2.072e-02, -1.991e-02, 1.435e-02, 1.780e-02, -1.657e-01, -1.046e-01, 1.713e-01, 2.489e-02, 1.301e-01, 1.917e-01, -1.351e-02, 1.654e-01, 3.337e-01, 1.812e-01, 3.168e-01)); + r += mul(s4_6, M4(8.512e-02, -3.333e-02, 9.591e-02, -5.042e-02, -3.283e-02, -3.229e-02, -8.062e-02, 1.006e-01, 2.752e-02, 7.964e-02, 1.035e-02, -1.490e-01, -3.342e-01, 2.648e-01, 6.379e-01, -3.260e-01)); + r += mul(s4_7, M4(-9.161e-02, 1.714e-02, 1.680e-01, 4.406e-02, -1.144e-01, 8.663e-02, -9.845e-02, -2.556e-02, 9.220e-02, 1.626e-01, 1.158e-01, 4.907e-02, 6.413e-01, 1.818e-02, -1.944e-01, -1.364e-01)); + r += mul(s4_8, M4(1.471e-01, -1.823e-01, -4.626e-02, 1.105e-02, -8.338e-02, 2.499e-02, -9.495e-02, 1.042e-02, 1.812e-01, -1.420e-01, 1.377e-01, -2.406e-02, 1.597e-01, -3.467e-02, 2.917e-01, 4.666e-01)); + r += mul(s5_0, M4(4.290e-02, -1.051e-01, -1.730e-01, -4.856e-02, 7.349e-02, -1.305e-01, -1.831e-01, -7.525e-02, -1.404e-01, -1.015e-01, 4.582e-02, -5.793e-02, 4.695e-02, -2.183e-01, -4.480e-02, -1.574e-02)); + r += mul(s5_1, M4(-7.326e-02, -1.802e-02, 1.807e-01, 9.089e-02, 4.307e-02, -8.857e-02, -7.099e-03, -1.575e-01, 2.923e-03, 2.159e-02, -6.711e-02, 7.366e-02, 5.115e-02, -1.337e-02, 5.908e-02, 2.605e-02)); + r += mul(s5_2, M4(1.969e-02, -1.552e-02, 1.921e-02, 5.537e-02, -1.210e-02, 7.316e-02, -1.328e-01, 2.061e-01, -1.096e-01, -6.762e-03, -1.443e-01, -1.107e-01, -2.937e-02, -7.886e-02, -3.149e-02, 1.044e-02)); + r += mul(s5_3, M4(-2.950e-02, 1.404e-02, -5.290e-02, 5.214e-02, -1.184e-01, 5.320e-03, 1.431e-01, -1.879e-02, 6.318e-02, 2.520e-02, 1.179e-01, 1.001e-01, -6.463e-02, 6.231e-02, 9.036e-02, 5.547e-02)); + r += mul(s5_4, M4(-5.697e-02, -5.924e-02, -8.632e-02, -1.336e-01, 8.515e-02, 5.283e-02, -4.273e-02, 3.461e-02, -2.676e-02, 3.365e-03, -1.777e-01, 2.445e-03, -2.637e-03, -7.010e-02, 1.057e-01, -3.378e-02)); + r += mul(s5_5, M4(6.635e-02, 1.693e-01, 1.918e-02, -1.284e-01, -7.682e-02, -1.273e-02, 1.417e-01, 9.456e-02, 5.123e-02, -4.772e-02, -1.610e-01, 1.006e-01, -3.030e-02, -1.897e-02, 1.088e-02, -1.585e-02)); + r += mul(s5_6, M4(-1.387e-02, 9.614e-02, 1.759e-01, -3.788e-02, 4.005e-03, -9.632e-02, -4.344e-02, 4.098e-02, -8.902e-02, 3.125e-03, 1.147e-01, -1.063e-01, 6.886e-02, 1.318e-01, -2.154e-02, -4.268e-02)); + r += mul(s5_7, M4(4.173e-02, -6.529e-02, -1.632e-01, 3.183e-03, 4.653e-02, 1.396e-01, 1.584e-01, -7.254e-02, -5.903e-02, -6.068e-02, 2.455e-01, -2.021e-02, -1.261e-02, 9.884e-02, -6.960e-02, -6.464e-02)); + r += mul(s5_8, M4(1.284e-01, -6.525e-02, -1.950e-02, -1.040e-01, -1.568e-02, 2.538e-02, 9.358e-02, 1.045e-01, -4.221e-02, 1.556e-02, 6.616e-02, 1.142e-02, 1.454e-02, 1.488e-01, -1.081e-01, -1.477e-02)); + r += mul(s6_0, M4(-6.093e-02, 2.248e-03, -8.130e-02, -1.425e-02, 8.215e-02, -5.382e-02, -1.047e-01, 3.129e-02, -1.344e-01, 6.608e-02, -1.014e-01, 7.938e-02, 1.366e-01, 8.760e-02, 3.761e-02, -1.142e-01)); + r += mul(s6_1, M4(5.009e-02, 4.462e-02, 2.240e-02, -1.194e-01, 1.243e-02, -3.372e-02, -5.153e-02, -8.741e-02, 1.277e-01, 1.411e-01, 1.695e-01, 5.858e-03, -1.322e-01, -5.106e-02, 1.162e-02, 1.106e-01)); + r += mul(s6_2, M4(5.891e-02, -5.044e-02, -1.767e-01, -1.131e-01, 2.995e-02, 7.030e-02, 8.358e-02, 1.021e-01, -7.201e-02, -1.833e-01, 1.101e-01, 1.205e-01, 4.529e-02, -5.023e-02, 3.671e-02, -1.023e-01)); + r += mul(s6_3, M4(-7.851e-02, 8.958e-02, -9.316e-02, 8.568e-02, 8.191e-02, -4.034e-02, 4.920e-02, 1.540e-02, 8.760e-02, -1.744e-01, 3.072e-02, -3.126e-02, 1.852e-02, 1.684e-01, 1.118e-02, 7.336e-02)); + r += mul(s6_4, M4(5.848e-02, -4.185e-02, -2.660e-01, 3.162e-02, -1.262e-01, -6.983e-02, -2.314e-02, -1.236e-01, 1.154e-01, -1.043e-01, 1.932e-01, -1.070e-03, -1.083e-02, -1.873e-02, -1.542e-02, 1.558e-01)); + r += mul(s6_5, M4(9.919e-02, -5.183e-02, 1.712e-01, 7.021e-02, 6.103e-02, -5.641e-02, -1.925e-02, 5.430e-02, 2.400e-02, -3.171e-02, -1.422e-01, 9.672e-02, -1.302e-01, 8.982e-02, -5.216e-02, 6.914e-02)); + r += mul(s6_6, M4(-2.529e-02, -4.269e-02, 3.431e-02, -7.789e-02, -3.025e-02, -6.084e-02, -7.403e-03, 2.723e-02, -2.770e-03, 6.116e-03, -4.762e-02, -8.540e-02, -7.102e-02, -2.686e-01, 5.625e-02, -5.279e-02)); + r += mul(s6_7, M4(5.902e-02, 1.260e-01, 9.028e-03, 1.185e-02, 1.374e-01, -1.108e-01, 2.352e-02, 1.627e-01, 2.036e-02, 1.147e-01, 1.065e-02, -3.920e-02, -5.666e-02, -6.423e-02, -6.060e-02, -6.509e-02)); + r += mul(s6_8, M4(1.495e-01, 5.329e-02, -6.012e-02, 1.328e-01, 6.940e-03, 6.332e-02, -7.290e-02, 3.060e-02, -7.503e-02, 4.437e-03, -2.798e-02, 3.905e-02, 4.219e-02, 3.876e-02, -5.012e-02, -1.359e-02)); + r += mul(s7_0, M4(-1.164e-01, 1.792e-01, 4.010e-02, -3.066e-02, 2.112e-02, 8.116e-02, -1.087e-01, 8.802e-02, -3.026e-02, 3.427e-02, -7.300e-02, -8.114e-02, 2.046e-01, 9.216e-02, -1.241e-01, -2.265e-01)); + r += mul(s7_1, M4(-1.077e-02, 8.379e-02, 1.208e-01, 1.856e-01, 1.915e-01, 5.306e-02, -8.455e-02, -1.074e-01, 3.913e-02, 2.445e-02, 1.463e-01, -7.386e-02, -1.439e-01, -2.010e-01, 3.727e-02, 8.294e-02)); + r += mul(s7_2, M4(8.590e-02, -6.305e-02, 1.390e-01, 1.522e-01, -1.772e-01, -3.036e-03, -2.138e-01, -1.135e-02, 3.467e-03, 6.760e-02, -2.061e-01, 4.310e-02, 3.918e-02, 3.694e-03, 2.378e-02, 8.366e-02)); + r += mul(s7_3, M4(-1.140e-01, 3.584e-02, 7.992e-02, 1.224e-01, -7.709e-02, -1.140e-01, 1.688e-01, 6.161e-02, -8.701e-02, 7.456e-02, 2.540e-02, -1.134e-01, -1.200e-01, 2.231e-01, 2.131e-01, -2.430e-01)); + r += mul(s7_4, M4(8.158e-02, -4.486e-02, -4.271e-02, -1.219e-02, -1.679e-01, -3.975e-01, -2.590e-01, -1.145e-02, 1.170e-02, 4.893e-02, 2.747e-01, -2.922e-02, -3.748e-01, -5.284e-02, -6.393e-02, -3.812e-02)); + r += mul(s7_5, M4(1.268e-02, -1.999e-01, -2.030e-01, -7.797e-02, -1.315e-01, -1.759e-01, -6.633e-02, 6.865e-02, 3.407e-02, 5.684e-02, 1.380e-01, 9.850e-02, -2.613e-01, 5.287e-02, -6.630e-02, -2.530e-01)); + r += mul(s7_6, M4(-3.978e-02, 2.952e-02, 1.307e-02, 1.344e-01, -1.538e-01, 3.273e-02, 1.265e-01, -1.160e-01, 1.004e-01, -6.073e-02, -3.581e-02, 1.277e-01, 6.928e-02, 1.397e-02, -2.060e-01, -3.559e-02)); + r += mul(s7_7, M4(2.507e-02, -8.799e-02, 1.324e-01, 1.161e-01, -1.029e-02, -1.028e-01, -1.763e-01, 7.636e-02, -5.917e-03, -8.763e-02, -3.848e-02, -3.817e-02, -1.545e-01, -9.856e-02, 1.606e-01, -2.051e-02)); + r += mul(s7_8, M4(-6.716e-02, 9.246e-02, -6.366e-02, 5.885e-02, -6.213e-03, 6.166e-02, -4.931e-03, 1.102e-02, 3.940e-02, 6.723e-02, -2.166e-02, 1.470e-02, 1.415e-01, 8.718e-02, -1.368e-01, 7.478e-03)); + r += V4(1.274e-02, -1.970e-05, 2.618e-02, -7.558e-02); + return r; +} + +void Pass6(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = Rmp8x8(tid.x) + blockStart; + uint2 size = GetInputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = (gxy + 0.5) * pt; + + V4 s0_0 = l0(-1.0, -1.0); + V4 s0_1 = l0(0.0, -1.0); + V4 s0_2 = l0(1.0, -1.0); + V4 s0_3 = l0(-1.0, 0.0); + V4 s0_4 = l0(0.0, 0.0); + V4 s0_5 = l0(1.0, 0.0); + V4 s0_6 = l0(-1.0, 1.0); + V4 s0_7 = l0(0.0, 1.0); + V4 s0_8 = l0(1.0, 1.0); + V4 s1_0 = -max(-s0_0, 0.0); + V4 s1_1 = -max(-s0_1, 0.0); + V4 s1_2 = -max(-s0_2, 0.0); + V4 s1_3 = -max(-s0_3, 0.0); + V4 s1_4 = -max(-s0_4, 0.0); + V4 s1_5 = -max(-s0_5, 0.0); + V4 s1_6 = -max(-s0_6, 0.0); + V4 s1_7 = -max(-s0_7, 0.0); + V4 s1_8 = -max(-s0_8, 0.0); + s0_0 = max(s0_0, 0.0); + s0_1 = max(s0_1, 0.0); + s0_2 = max(s0_2, 0.0); + s0_3 = max(s0_3, 0.0); + s0_4 = max(s0_4, 0.0); + s0_5 = max(s0_5, 0.0); + s0_6 = max(s0_6, 0.0); + s0_7 = max(s0_7, 0.0); + s0_8 = max(s0_8, 0.0); + + V4 s2_0 = l1(-1.0, -1.0); + V4 s2_1 = l1(0.0, -1.0); + V4 s2_2 = l1(1.0, -1.0); + V4 s2_3 = l1(-1.0, 0.0); + V4 s2_4 = l1(0.0, 0.0); + V4 s2_5 = l1(1.0, 0.0); + V4 s2_6 = l1(-1.0, 1.0); + V4 s2_7 = l1(0.0, 1.0); + V4 s2_8 = l1(1.0, 1.0); + V4 s3_0 = -max(-s2_0, 0.0); + V4 s3_1 = -max(-s2_1, 0.0); + V4 s3_2 = -max(-s2_2, 0.0); + V4 s3_3 = -max(-s2_3, 0.0); + V4 s3_4 = -max(-s2_4, 0.0); + V4 s3_5 = -max(-s2_5, 0.0); + V4 s3_6 = -max(-s2_6, 0.0); + V4 s3_7 = -max(-s2_7, 0.0); + V4 s3_8 = -max(-s2_8, 0.0); + s2_0 = max(s2_0, 0.0); + s2_1 = max(s2_1, 0.0); + s2_2 = max(s2_2, 0.0); + s2_3 = max(s2_3, 0.0); + s2_4 = max(s2_4, 0.0); + s2_5 = max(s2_5, 0.0); + s2_6 = max(s2_6, 0.0); + s2_7 = max(s2_7, 0.0); + s2_8 = max(s2_8, 0.0); + + V4 s4_0 = l2(-1.0, -1.0); + V4 s4_1 = l2(0.0, -1.0); + V4 s4_2 = l2(1.0, -1.0); + V4 s4_3 = l2(-1.0, 0.0); + V4 s4_4 = l2(0.0, 0.0); + V4 s4_5 = l2(1.0, 0.0); + V4 s4_6 = l2(-1.0, 1.0); + V4 s4_7 = l2(0.0, 1.0); + V4 s4_8 = l2(1.0, 1.0); + V4 s5_0 = -max(-s4_0, 0.0); + V4 s5_1 = -max(-s4_1, 0.0); + V4 s5_2 = -max(-s4_2, 0.0); + V4 s5_3 = -max(-s4_3, 0.0); + V4 s5_4 = -max(-s4_4, 0.0); + V4 s5_5 = -max(-s4_5, 0.0); + V4 s5_6 = -max(-s4_6, 0.0); + V4 s5_7 = -max(-s4_7, 0.0); + V4 s5_8 = -max(-s4_8, 0.0); + s4_0 = max(s4_0, 0.0); + s4_1 = max(s4_1, 0.0); + s4_2 = max(s4_2, 0.0); + s4_3 = max(s4_3, 0.0); + s4_4 = max(s4_4, 0.0); + s4_5 = max(s4_5, 0.0); + s4_6 = max(s4_6, 0.0); + s4_7 = max(s4_7, 0.0); + s4_8 = max(s4_8, 0.0); + + V4 s6_0 = l3(-1.0, -1.0); + V4 s6_1 = l3(0.0, -1.0); + V4 s6_2 = l3(1.0, -1.0); + V4 s6_3 = l3(-1.0, 0.0); + V4 s6_4 = l3(0.0, 0.0); + V4 s6_5 = l3(1.0, 0.0); + V4 s6_6 = l3(-1.0, 1.0); + V4 s6_7 = l3(0.0, 1.0); + V4 s6_8 = l3(1.0, 1.0); + V4 s7_0 = -max(-s6_0, 0.0); + V4 s7_1 = -max(-s6_1, 0.0); + V4 s7_2 = -max(-s6_2, 0.0); + V4 s7_3 = -max(-s6_3, 0.0); + V4 s7_4 = -max(-s6_4, 0.0); + V4 s7_5 = -max(-s6_5, 0.0); + V4 s7_6 = -max(-s6_6, 0.0); + V4 s7_7 = -max(-s6_7, 0.0); + V4 s7_8 = -max(-s6_8, 0.0); + s6_0 = max(s6_0, 0.0); + s6_1 = max(s6_1, 0.0); + s6_2 = max(s6_2, 0.0); + s6_3 = max(s6_3, 0.0); + s6_4 = max(s6_4, 0.0); + s6_5 = max(s6_5, 0.0); + s6_6 = max(s6_6, 0.0); + s6_7 = max(s6_7, 0.0); + s6_8 = max(s6_8, 0.0); + + t4[gxy] = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t5[gxy] = f1(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t6[gxy] = f2(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t7[gxy] = f3(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); +} + +//!PASS 7 +//!DESC conv6 +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 +//!IN t4, t5, t6, t7 +//!OUT t0, t1, t2, t3 + +#define l0(x, y) V4(O(t4, float2(x, y))) +#define l1(x, y) V4(O(t5, float2(x, y))) +#define l2(x, y) V4(O(t6, float2(x, y))) +#define l3(x, y) V4(O(t7, float2(x, y))) + +V4 f0(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-6.420e-02, -1.408e-02, 6.421e-02, -1.120e-01, 6.585e-02, 1.732e-01, -7.802e-02, 1.447e-01, -3.318e-02, -1.495e-01, 1.499e-01, -1.212e-01, -5.066e-03, 1.468e-01, -4.072e-02, 5.189e-02)); + r += mul(s0_1, M4(-1.060e-02, 3.925e-02, 6.566e-02, -7.563e-03, -7.597e-02, 1.650e-01, 1.341e-02, -2.018e-01, 1.312e-01, -8.820e-02, -1.806e-01, -2.112e-01, 4.851e-02, -1.760e-02, 5.317e-02, 9.209e-02)); + r += mul(s0_2, M4(1.814e-02, 1.049e-02, 9.710e-02, -3.510e-02, -6.424e-04, 1.102e-01, 6.702e-02, 7.945e-03, -1.158e-01, 1.386e-01, 1.870e-01, -4.197e-02, 1.954e-03, 7.398e-02, -6.745e-02, -2.169e-02)); + r += mul(s0_3, M4(-5.532e-02, -9.536e-03, -8.015e-02, 1.653e-01, -7.766e-02, 4.322e-02, -1.833e-02, -1.230e-01, 5.629e-02, 4.360e-02, -1.794e-01, 8.885e-02, -2.327e-02, 1.834e-02, 3.619e-02, 1.028e-01)); + r += mul(s0_4, M4(7.088e-02, 6.654e-04, -1.787e-01, 2.024e-02, 2.222e-01, 2.436e-01, 8.089e-02, 2.634e-02, 6.307e-02, 8.557e-02, -1.021e-01, 2.179e-01, -2.483e-02, 1.462e-01, -5.920e-02, -1.461e-01)); + r += mul(s0_5, M4(1.415e-02, -6.086e-02, 1.375e-01, -8.521e-02, -1.530e-01, -3.861e-02, 3.039e-02, -9.823e-02, 4.396e-02, 1.644e-02, -6.289e-02, -1.010e-01, -4.978e-02, -1.729e-01, 3.676e-02, 1.843e-02)); + r += mul(s0_6, M4(7.050e-02, -3.634e-02, 9.230e-03, 1.214e-01, 2.396e-01, 2.339e-02, 1.581e-02, 3.219e-02, -2.194e-01, 1.217e-01, 1.276e-01, 7.059e-02, -1.698e-02, 1.083e-02, -5.574e-02, 8.680e-03)); + r += mul(s0_7, M4(7.696e-02, 3.400e-02, -4.987e-02, -2.888e-02, -2.122e-01, -9.791e-02, -9.778e-02, -1.035e-01, -1.108e-01, 2.658e-02, 2.048e-01, 5.571e-02, 1.599e-01, -2.214e-01, 6.763e-02, 5.798e-02)); + r += mul(s0_8, M4(6.366e-02, -5.842e-03, 6.962e-02, 2.804e-02, 1.311e-01, 2.959e-01, -7.168e-02, -9.768e-03, -4.726e-02, -1.068e-01, 2.900e-02, 8.545e-02, -8.765e-03, -1.213e-01, -2.983e-02, 1.298e-02)); + r += mul(s1_0, M4(-1.797e-01, 1.253e-01, 2.317e-02, 1.295e-01, 3.940e-04, -3.863e-02, -2.826e-02, -6.212e-02, 2.816e-02, -1.279e-01, 3.808e-02, 7.194e-02, -1.989e-01, 2.267e-02, 5.064e-02, -4.622e-02)); + r += mul(s1_1, M4(-1.049e-01, -2.455e-02, 1.040e-01, -7.724e-02, 1.184e-01, 8.219e-02, -1.300e-01, 5.256e-02, 1.790e-01, 2.355e-02, -1.684e-01, -3.476e-02, 8.151e-02, -1.007e-01, 2.998e-02, 2.710e-02)); + r += mul(s1_2, M4(1.268e-01, 3.741e-01, -3.234e-02, 8.925e-03, -7.476e-03, -3.866e-02, 2.604e-02, 2.359e-02, 5.237e-02, -1.980e-02, 4.127e-02, 4.160e-03, 7.368e-02, 9.397e-02, 4.852e-02, 3.071e-02)); + r += mul(s1_3, M4(8.868e-02, 9.922e-02, -2.954e-02, 5.330e-02, -1.325e-01, -1.474e-01, -8.702e-03, -3.887e-02, 4.102e-02, 9.639e-02, 7.465e-02, -1.872e-01, 3.933e-02, 7.587e-02, -1.168e-01, 2.842e-02)); + r += mul(s1_4, M4(1.347e-01, 1.460e-01, 1.790e-01, -3.097e-02, 1.784e-01, 1.079e-01, 1.010e-01, 2.803e-02, 1.493e-01, -1.321e-01, -5.476e-02, 1.066e-01, 1.362e-01, 8.967e-02, 1.136e-01, 7.082e-02)); + r += mul(s1_5, M4(-8.171e-02, -1.510e-01, -2.092e-02, 7.351e-02, -3.666e-02, 9.393e-02, -2.663e-02, 1.266e-01, 8.663e-04, -2.387e-02, 3.578e-02, -1.449e-01, -8.520e-02, 2.782e-01, -1.312e-01, -2.170e-01)); + r += mul(s1_6, M4(2.298e-01, 2.012e-01, -7.026e-02, 1.761e-01, 8.041e-02, -1.424e-01, 1.218e-01, -1.337e-01, -7.734e-02, 4.400e-02, 8.352e-02, -3.196e-03, -1.645e-01, 1.180e-01, 1.074e-01, -1.028e-01)); + r += mul(s1_7, M4(-2.012e-02, 1.786e-01, -3.740e-02, -1.502e-01, -2.025e-02, 8.334e-02, -1.648e-01, -4.983e-02, -6.138e-02, -1.115e-01, -4.707e-03, 2.583e-02, 7.925e-02, -5.074e-02, -9.400e-03, 9.414e-02)); + r += mul(s1_8, M4(-3.650e-02, -1.678e-01, -3.133e-02, -1.101e-01, 1.610e-02, -4.766e-02, 1.251e-02, 7.809e-02, 5.504e-03, 1.289e-01, -2.330e-02, 5.268e-02, 1.673e-02, -3.482e-01, 2.402e-02, 2.704e-01)); + r += mul(s2_0, M4(-7.827e-02, -3.079e-02, 1.018e-02, 2.897e-03, -3.808e-02, -9.789e-02, 1.090e-02, 1.135e-01, 3.019e-01, 2.101e-01, -1.533e-01, -1.324e-01, -3.141e-02, 9.272e-02, 4.798e-02, -3.225e-02)); + r += mul(s2_1, M4(-5.913e-02, 4.003e-02, -2.838e-03, -1.787e-02, -1.815e-02, -1.663e-02, -1.608e-02, -5.393e-02, 6.822e-02, 4.517e-02, -5.463e-02, 6.754e-02, -5.816e-02, 4.339e-02, 1.504e-01, 4.613e-02)); + r += mul(s2_2, M4(-5.325e-03, -1.351e-01, 4.729e-02, -3.259e-02, 4.487e-02, -1.025e-01, 4.505e-02, 1.417e-01, -1.208e-01, 9.062e-02, 9.642e-02, -4.068e-02, -6.048e-02, 4.366e-02, 2.457e-01, 4.117e-02)); + r += mul(s2_3, M4(-7.820e-02, 1.105e-04, 2.462e-03, -2.818e-02, -4.798e-02, 9.599e-02, 3.060e-02, 1.989e-02, -3.079e-02, 4.186e-02, -9.482e-02, 1.349e-02, -1.401e-01, 2.226e-02, 8.061e-02, -1.628e-02)); + r += mul(s2_4, M4(5.090e-02, 9.183e-02, 2.343e-02, -1.108e-01, 7.770e-02, -9.551e-03, -7.795e-03, 7.014e-02, 3.370e-04, 2.133e-01, -1.324e-01, 1.027e-01, 1.202e-01, -2.202e-01, 2.004e-01, -3.432e-03)); + r += mul(s2_5, M4(9.979e-02, -2.255e-01, 3.197e-02, 2.156e-02, 3.894e-02, 5.951e-02, 3.748e-02, -5.444e-02, -2.226e-02, -3.578e-02, -7.463e-02, 6.022e-02, 3.890e-02, 2.723e-01, 1.939e-01, 3.002e-02)); + r += mul(s2_6, M4(9.141e-02, -7.810e-02, -4.206e-02, -4.264e-03, -2.025e-02, 1.348e-01, 6.310e-02, -1.474e-02, 3.425e-02, -3.399e-01, 5.481e-03, -1.614e-02, -2.261e-02, 3.572e-02, -6.834e-02, -1.787e-02)); + r += mul(s2_7, M4(-3.352e-02, 1.370e-01, -2.628e-03, -8.065e-02, -8.944e-03, -8.675e-03, -9.380e-02, 6.008e-03, 5.125e-02, 8.410e-02, -5.763e-02, -3.422e-02, -6.367e-03, -6.574e-02, -9.948e-03, 1.323e-01)); + r += mul(s2_8, M4(-5.706e-02, -1.304e-01, -6.616e-02, -1.274e-01, -1.153e-02, -1.034e-01, 1.546e-02, -3.198e-02, 7.165e-02, 4.668e-02, -5.618e-02, -4.781e-02, 8.207e-02, 8.158e-02, 4.356e-02, 1.783e-01)); + r += mul(s3_0, M4(4.395e-02, 9.069e-02, -1.479e-01, -1.507e-02, -6.110e-02, 1.443e-02, -3.081e-02, 1.250e-01, -5.002e-02, 1.119e-01, -3.709e-02, -9.127e-02, -5.768e-02, -7.338e-02, 2.705e-02, -1.133e-01)); + r += mul(s3_1, M4(-8.219e-02, 1.077e-01, 1.075e-01, 6.657e-02, 1.384e-03, 6.907e-02, -2.241e-02, -2.334e-02, -1.096e-01, 6.372e-02, 4.354e-02, 7.508e-02, 2.263e-01, 4.511e-03, -1.133e-01, -2.272e-02)); + r += mul(s3_2, M4(9.062e-02, -1.120e-03, -4.467e-02, 7.195e-02, -2.795e-01, 2.950e-01, 7.506e-02, 1.363e-01, -4.873e-02, -2.462e-02, 3.791e-02, 9.310e-02, 8.765e-02, 1.191e-01, -8.419e-02, -9.431e-02)); + r += mul(s3_3, M4(1.655e-02, 5.639e-02, -4.404e-03, -9.981e-02, 1.148e-01, -8.272e-02, -1.390e-01, 5.672e-02, 6.335e-02, 1.684e-01, -7.871e-02, -1.311e-01, 3.674e-02, -1.126e-02, 3.918e-02, 1.493e-02)); + r += mul(s3_4, M4(-6.878e-02, 4.664e-02, 1.452e-02, 7.693e-02, 3.577e-01, -8.820e-02, -8.393e-02, 4.577e-01, 9.147e-02, 2.705e-02, -9.579e-02, 2.560e-02, 3.955e-01, -3.702e-02, 1.694e-01, -1.545e-01)); + r += mul(s3_5, M4(-9.865e-03, 5.487e-02, 7.788e-02, 1.573e-01, 3.029e-01, 1.801e-01, -2.430e-02, -2.202e-01, -5.984e-02, -7.608e-02, -8.305e-02, 4.260e-02, 2.726e-01, 1.149e-01, 2.123e-01, -1.036e-01)); + r += mul(s3_6, M4(3.139e-02, -1.450e-02, -3.944e-02, -7.140e-02, 1.567e-01, -3.974e-02, -5.314e-02, -2.869e-01, -6.654e-03, -5.902e-02, 2.141e-02, 1.691e-02, -6.033e-02, 1.637e-03, 2.190e-02, -7.007e-02)); + r += mul(s3_7, M4(-4.549e-02, 1.072e-01, 9.260e-02, -9.793e-03, -5.349e-01, -8.617e-03, 2.488e-02, 2.192e-01, -5.906e-02, -9.705e-02, -7.527e-03, 2.429e-02, -1.062e-01, 2.541e-02, -1.134e-01, 9.786e-03)); + r += mul(s3_8, M4(-2.199e-02, -5.997e-03, 1.201e-01, -2.807e-03, -1.319e-01, 8.213e-01, 2.262e-01, 1.678e-01, 6.571e-02, 6.900e-02, 3.964e-02, 7.886e-02, 8.979e-02, -3.309e-02, 1.736e-02, -6.964e-02)); + r += mul(s4_0, M4(2.849e-02, 7.353e-02, -3.211e-02, -8.134e-02, 4.359e-02, -1.312e-01, 5.510e-02, 2.191e-02, 7.560e-02, -7.792e-02, 7.575e-03, 9.009e-02, 1.078e-02, -2.289e-01, 9.238e-02, 1.665e-01)); + r += mul(s4_1, M4(1.843e-02, -9.599e-03, -6.341e-03, 5.533e-02, -5.045e-02, -1.068e-01, -9.065e-02, -4.897e-03, 1.227e-02, -4.836e-02, -5.728e-02, 4.099e-02, 6.644e-02, -9.681e-02, -8.812e-02, -1.834e-01)); + r += mul(s4_2, M4(-7.421e-02, -5.071e-02, 4.374e-02, -4.480e-02, -1.981e-02, 1.823e-01, 5.533e-02, -2.245e-01, 1.109e-03, -4.267e-02, 2.546e-04, 1.194e-02, 6.800e-02, -4.168e-02, 1.175e-01, -5.438e-02)); + r += mul(s4_3, M4(-5.560e-02, -3.011e-02, -1.020e-04, -3.312e-02, -1.877e-02, -1.602e-01, 1.846e-02, 5.569e-02, 1.562e-03, 8.524e-02, 9.787e-02, -8.073e-02, 7.374e-02, 1.205e-01, -1.051e-01, 1.893e-01)); + r += mul(s4_4, M4(5.501e-02, -7.378e-02, -1.440e-02, 9.642e-02, 2.593e-02, 2.482e-02, -1.697e-02, 5.443e-02, -2.308e-01, 1.820e-01, 1.203e-01, 3.431e-02, -8.536e-03, 5.633e-02, -7.276e-02, 2.111e-02)); + r += mul(s4_5, M4(-5.069e-02, -3.155e-02, 3.042e-03, 1.255e-01, 1.033e-01, 4.543e-02, 4.432e-02, 1.121e-01, 5.034e-04, 1.365e-01, -1.683e-02, -2.542e-01, 1.169e-01, 2.666e-01, 8.883e-02, -6.667e-02)); + r += mul(s4_6, M4(4.482e-04, 6.168e-02, -2.344e-02, 1.217e-01, -1.227e-01, -6.663e-02, -1.012e-01, -1.716e-02, -9.351e-02, 5.405e-02, -4.279e-02, 2.607e-02, -5.496e-02, 1.796e-02, -5.819e-03, 7.678e-02)); + r += mul(s4_7, M4(9.358e-02, -3.402e-02, -2.491e-02, -1.184e-01, 8.778e-02, 4.548e-02, -5.376e-02, -1.011e-01, -4.591e-02, 7.198e-02, 3.395e-02, 7.768e-03, -1.642e-01, -9.311e-02, -4.887e-02, -1.391e-03)); + r += mul(s4_8, M4(-4.708e-02, 3.883e-03, 3.773e-02, -3.976e-02, -9.629e-02, 6.306e-02, 4.530e-02, 1.733e-01, 1.792e-02, 5.135e-02, 5.748e-02, -2.131e-02, -1.650e-02, 1.543e-01, -1.282e-02, 3.647e-02)); + r += mul(s5_0, M4(9.375e-02, -1.108e-02, -2.394e-02, -7.815e-02, 8.934e-02, -1.021e-01, 1.423e-02, 6.238e-03, 8.501e-02, 3.090e-02, 5.463e-02, -1.356e-01, -2.088e-02, -1.338e-01, 1.054e-01, 8.263e-02)); + r += mul(s5_1, M4(1.654e-01, 3.170e-02, -9.520e-02, 1.154e-01, -7.324e-02, 8.083e-02, -1.294e-01, 1.087e-01, 1.302e-01, 1.537e-01, -2.128e-01, 1.744e-01, -1.119e-03, -5.597e-02, -1.003e-01, -6.166e-02)); + r += mul(s5_2, M4(-1.160e-01, 1.011e-01, -2.055e-03, -2.750e-01, 1.208e-01, 1.557e-01, -2.758e-02, 7.742e-02, 2.210e-01, -1.112e-01, -8.638e-02, 1.312e-01, -4.294e-02, 5.259e-02, 4.718e-02, -1.276e-01)); + r += mul(s5_3, M4(-4.629e-02, -1.478e-01, -3.667e-02, 2.156e-01, -4.458e-02, -1.432e-01, 1.463e-02, 3.319e-02, -2.418e-02, 5.942e-03, -7.920e-02, 6.860e-02, 5.644e-02, 8.405e-02, -1.435e-01, 1.163e-02)); + r += mul(s5_4, M4(5.875e-02, 2.975e-01, 2.153e-01, -7.192e-03, -7.809e-02, 5.250e-03, 7.988e-02, 5.700e-02, -2.801e-02, 6.919e-02, 4.960e-02, 1.850e-01, 6.536e-02, 2.241e-02, 5.430e-03, 4.156e-03)); + r += mul(s5_5, M4(-1.805e-02, 3.047e-02, -1.341e-01, 1.430e-01, -5.530e-02, 4.731e-02, 6.101e-02, 1.117e-01, 2.167e-02, 1.384e-01, 1.504e-01, 1.005e-01, 5.895e-03, 1.357e-01, 5.338e-02, -1.135e-01)); + r += mul(s5_6, M4(3.260e-02, 9.813e-03, 8.360e-02, -4.573e-02, 1.927e-02, 6.459e-02, 4.829e-03, 4.062e-02, 1.382e-01, -7.578e-02, -1.764e-01, -2.434e-02, -6.793e-02, 4.379e-03, -1.479e-02, 3.745e-02)); + r += mul(s5_7, M4(6.105e-02, 9.865e-02, 1.202e-01, 1.670e-01, -3.379e-02, -1.383e-01, 8.565e-02, -2.551e-02, 1.332e-02, -6.082e-02, 3.290e-02, -1.452e-01, -4.283e-02, -6.428e-02, -5.956e-02, 7.832e-02)); + r += mul(s5_8, M4(-3.303e-02, 4.059e-03, 1.373e-01, -3.176e-02, -1.815e-02, 6.239e-02, -1.368e-02, 1.090e-01, 1.357e-02, -9.123e-02, -1.375e-01, -6.569e-03, 9.805e-02, 1.702e-01, 6.732e-02, -4.295e-02)); + r += mul(s6_0, M4(-1.183e-01, -5.906e-04, 1.914e-02, 9.910e-02, 6.500e-02, 5.681e-02, -2.011e-02, -5.261e-02, 1.462e-01, -5.584e-02, -3.575e-02, 1.046e-01, -7.241e-02, -1.346e-01, -2.918e-03, 1.026e-02)); + r += mul(s6_1, M4(2.892e-02, 1.631e-01, -3.074e-02, -8.735e-02, 8.155e-02, -2.551e-02, -2.036e-01, -1.591e-01, -3.379e-02, 6.374e-02, -1.008e-01, -9.758e-02, 4.372e-02, -3.677e-02, 1.248e-01, 3.071e-02)); + r += mul(s6_2, M4(8.023e-02, 2.997e-02, 9.962e-03, -4.284e-02, -8.497e-02, -7.355e-02, -1.333e-03, -1.613e-02, 7.704e-02, 1.743e-01, -1.519e-01, -2.440e-02, -2.547e-02, 5.258e-02, 3.014e-02, -5.597e-02)); + r += mul(s6_3, M4(-2.592e-02, -2.281e-03, 1.595e-02, 2.075e-01, 6.063e-02, 2.393e-02, -1.292e-02, 6.372e-02, -6.155e-03, -1.293e-01, 7.879e-03, 3.101e-01, -2.769e-03, 8.199e-02, 5.373e-02, 2.221e-02)); + r += mul(s6_4, M4(7.649e-02, 1.889e-03, 1.334e-01, -1.798e-01, -1.333e-01, 2.581e-01, -2.934e-01, -2.100e-01, -1.362e-01, -2.313e-02, -4.790e-02, -1.720e-02, 1.017e-01, 3.175e-02, -5.074e-02, -2.047e-02)); + r += mul(s6_5, M4(4.797e-02, 9.415e-02, -3.937e-02, -7.297e-02, -7.981e-02, 9.044e-02, 4.661e-02, 2.250e-01, 9.266e-02, -4.083e-02, -9.222e-02, -5.229e-02, -8.320e-02, 1.539e-01, 3.377e-02, -1.144e-02)); + r += mul(s6_6, M4(7.769e-02, 5.734e-02, 6.139e-02, 6.552e-03, -6.897e-02, 2.645e-01, -5.784e-02, -7.483e-02, 4.382e-02, 6.870e-02, 8.941e-02, 1.264e-01, -8.896e-02, -1.026e-01, 8.097e-02, -9.642e-02)); + r += mul(s6_7, M4(-2.266e-02, 2.104e-02, -3.382e-02, -3.462e-02, 9.502e-02, -1.571e-01, -1.757e-02, -1.374e-01, -3.187e-01, 7.587e-02, 2.071e-01, 1.266e-02, 4.439e-02, 9.037e-02, 8.120e-03, 1.309e-01)); + r += mul(s6_8, M4(8.620e-02, -4.691e-02, 2.277e-02, 1.641e-02, 1.618e-01, -2.630e-02, -1.355e-01, 6.158e-02, 5.100e-02, -1.458e-01, 1.792e-01, 5.744e-02, 4.810e-02, -1.794e-01, 1.061e-02, -5.211e-02)); + r += mul(s7_0, M4(1.782e-01, -1.285e-01, -4.400e-02, 2.687e-02, -3.637e-02, -6.006e-02, 5.586e-04, -2.999e-03, -4.826e-02, -1.120e-01, -1.835e-02, -4.651e-02, -5.114e-02, -3.110e-02, 4.545e-02, -6.177e-02)); + r += mul(s7_1, M4(1.359e-01, -6.796e-02, 9.988e-02, -1.300e-01, 2.658e-02, 1.018e-02, -2.886e-02, 3.023e-02, 1.529e-01, -2.311e-02, -1.042e-01, -1.049e-01, 5.034e-02, 1.629e-01, 1.013e-01, 1.131e-01)); + r += mul(s7_2, M4(1.665e-01, -6.278e-02, -1.281e-02, -9.744e-02, -5.604e-02, 4.553e-02, -3.810e-02, -1.705e-01, -4.072e-02, 3.091e-02, -4.414e-02, -1.192e-02, -8.198e-02, 5.345e-02, -4.512e-02, -1.265e-01)); + r += mul(s7_3, M4(-1.983e-01, -1.369e-01, 2.508e-03, 2.284e-01, 2.661e-02, 1.146e-01, -3.674e-02, -5.617e-02, -1.196e-02, 7.266e-02, 1.285e-01, 6.571e-02, -2.698e-02, -6.623e-02, -5.135e-02, -2.303e-02)); + r += mul(s7_4, M4(4.264e-02, -2.439e-02, 1.718e-01, 5.959e-02, -2.041e-02, 6.559e-02, -6.376e-02, 5.568e-02, -4.303e-02, -7.649e-02, -1.284e-01, -1.305e-02, 1.496e-01, 4.092e-02, 5.225e-02, 3.690e-02)); + r += mul(s7_5, M4(-4.911e-02, -1.207e-01, -7.077e-02, -6.792e-02, 1.525e-01, -9.885e-02, 9.327e-02, -2.998e-02, 6.104e-02, -7.417e-03, 9.437e-02, -8.500e-02, -6.068e-03, 1.033e-02, 6.057e-02, 1.605e-02)); + r += mul(s7_6, M4(3.902e-02, 1.314e-01, 9.531e-02, 1.205e-01, -3.243e-02, -6.969e-02, -1.650e-02, 1.962e-02, -1.102e-01, -6.405e-03, -1.269e-02, -6.945e-02, 6.765e-02, 3.643e-02, -6.798e-02, 5.591e-03)); + r += mul(s7_7, M4(-5.830e-02, 3.405e-02, 8.745e-02, -5.615e-02, -5.131e-02, 4.023e-03, -1.450e-01, 8.837e-02, -4.772e-02, -9.055e-02, -1.177e-01, 5.408e-02, -1.225e-01, 1.633e-01, -3.784e-02, 6.974e-02)); + r += mul(s7_8, M4(1.450e-01, 3.805e-02, -8.117e-02, 1.247e-01, -2.925e-03, 5.569e-02, -1.040e-02, 1.200e-01, -1.094e-01, 2.800e-03, 7.729e-02, -1.525e-02, -1.471e-02, 1.847e-02, -1.044e-01, 2.992e-02)); + r += V4(2.304e-02, 2.078e-02, -1.771e-02, -7.974e-04); + return r; +} + +V4 f1(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(7.999e-02, -1.620e-03, 2.616e-03, 8.012e-02, -7.071e-02, -9.453e-02, -1.397e-01, 3.745e-02, 5.401e-02, -9.012e-02, -4.641e-02, -3.268e-02, -2.616e-02, 1.138e-02, -3.360e-02, 2.415e-02)); + r += mul(s0_1, M4(-1.609e-01, -1.081e-01, 1.692e-02, 5.023e-03, -1.996e-01, 2.482e-02, -3.838e-02, 8.200e-02, -1.350e-02, -8.538e-02, -2.835e-02, -2.008e-01, 1.623e-02, 9.711e-02, 7.625e-02, -2.950e-03)); + r += mul(s0_2, M4(-7.191e-02, 1.884e-02, 1.333e-01, -2.174e-02, -1.457e-01, 3.607e-02, 2.046e-02, -2.411e-02, 1.312e-01, 1.607e-02, 5.230e-02, -9.962e-02, -1.802e-01, 7.325e-02, -1.963e-02, -1.184e-01)); + r += mul(s0_3, M4(-8.421e-02, 8.179e-02, -3.473e-02, 1.207e-01, 1.599e-01, -6.990e-02, 9.169e-02, 1.210e-01, -1.189e-01, -1.529e-01, 9.446e-02, 1.413e-01, 5.838e-02, -6.803e-02, -7.839e-02, 7.547e-02)); + r += mul(s0_4, M4(-3.628e-02, -8.204e-03, 2.381e-02, 1.897e-01, -1.094e-01, 3.305e-03, -1.440e-01, 2.822e-01, 4.703e-01, -4.863e-02, -4.803e-02, -7.620e-03, -4.566e-02, 6.281e-03, 4.042e-02, -4.703e-03)); + r += mul(s0_5, M4(-1.283e-01, -3.658e-02, -1.392e-02, -2.535e-02, 4.043e-02, -1.622e-01, -2.733e-02, -8.380e-02, 3.171e-02, -2.183e-01, -8.571e-02, 1.247e-01, 1.086e-01, -1.587e-01, -1.130e-01, -4.680e-02)); + r += mul(s0_6, M4(-1.463e-02, 4.385e-03, 6.179e-03, -5.464e-02, 6.592e-02, 8.451e-02, -1.945e-02, 5.451e-02, -2.327e-01, -3.674e-03, 7.472e-02, 1.153e-01, -1.051e-02, 1.979e-02, 9.898e-02, 7.161e-02)); + r += mul(s0_7, M4(5.507e-02, -5.591e-02, -2.784e-02, -5.306e-02, -4.063e-02, 3.657e-01, -1.359e-01, 1.332e-01, 4.139e-02, -8.004e-02, -9.011e-03, -1.151e-01, 8.198e-02, -1.104e-01, 9.509e-03, -1.679e-02)); + r += mul(s0_8, M4(8.065e-02, 1.347e-02, 3.794e-02, -5.829e-02, 1.720e-01, 4.496e-02, 3.187e-02, 1.112e-01, -4.350e-02, 8.388e-02, 1.034e-01, -1.892e-02, -2.137e-01, -5.312e-02, 1.345e-01, -3.885e-02)); + r += mul(s1_0, M4(-8.546e-02, -7.385e-02, -1.005e-01, -9.412e-02, -6.122e-02, 3.501e-02, -2.484e-02, -6.044e-02, -1.262e-03, -4.078e-02, 8.990e-03, 3.442e-02, 1.667e-01, -5.292e-02, -8.578e-02, -1.017e-01)); + r += mul(s1_1, M4(-1.591e-01, 8.649e-02, 1.936e-01, -1.675e-01, 5.445e-02, -5.177e-02, 1.256e-01, -3.050e-02, 1.217e-02, -5.676e-02, 1.510e-01, -5.381e-02, 7.436e-03, 1.418e-02, -3.656e-03, -5.954e-02)); + r += mul(s1_2, M4(-1.587e-01, -4.549e-02, -1.032e-01, -2.612e-02, -9.453e-03, 4.694e-02, -3.459e-02, -2.469e-02, 7.204e-02, -2.343e-02, -3.167e-02, 4.009e-02, 4.523e-02, 1.167e-01, -2.459e-02, -6.980e-02)); + r += mul(s1_3, M4(5.893e-02, -1.072e-01, -2.244e-01, 9.065e-02, 8.110e-02, -2.783e-02, 1.611e-01, -1.078e-01, 9.832e-02, -1.784e-01, -3.238e-02, 3.152e-03, 2.439e-01, 3.922e-04, 2.059e-02, 1.391e-01)); + r += mul(s1_4, M4(-1.186e-01, 1.060e-01, 2.611e-01, 2.536e-02, 3.097e-02, 2.366e-02, -3.775e-02, -3.918e-02, -3.971e-02, -4.988e-02, -6.630e-02, 1.792e-01, 4.950e-02, 2.763e-01, -1.243e-01, -6.249e-02)); + r += mul(s1_5, M4(-5.325e-02, -7.006e-02, 1.882e-01, 3.596e-02, 7.997e-02, -8.836e-02, -1.889e-01, 4.237e-02, -2.434e-01, 7.031e-02, -1.146e-02, -1.163e-02, 2.505e-01, -4.368e-02, -2.249e-01, -1.309e-01)); + r += mul(s1_6, M4(8.930e-02, -3.275e-02, 9.076e-02, -9.582e-02, 3.224e-02, -1.109e-01, 8.775e-02, -3.492e-02, -3.691e-03, -1.507e-01, 1.391e-01, 1.705e-02, 5.119e-02, 1.323e-01, -8.738e-02, 3.481e-02)); + r += mul(s1_7, M4(-7.445e-02, -9.360e-02, 1.949e-01, -2.640e-01, 7.285e-02, 6.967e-02, 1.469e-01, -1.146e-01, 7.315e-05, 6.037e-02, 3.447e-02, -2.215e-03, -9.679e-02, -1.745e-01, 3.088e-02, 1.227e-02)); + r += mul(s1_8, M4(-2.196e-02, -2.083e-01, 6.747e-02, -5.662e-02, -8.165e-02, 5.244e-02, 1.161e-01, -2.417e-02, 2.538e-02, -1.887e-02, -5.177e-02, -8.775e-02, -1.634e-01, 2.158e-01, 1.430e-01, -1.185e-01)); + r += mul(s2_0, M4(1.416e-02, -2.729e-03, -6.712e-03, 1.679e-01, 9.746e-02, -3.308e-02, 3.119e-02, -2.757e-02, 1.507e-03, -1.257e-01, -1.163e-02, 1.702e-02, 2.982e-02, 5.174e-02, -5.909e-02, -9.968e-03)); + r += mul(s2_1, M4(-6.318e-02, 6.115e-02, -1.590e-01, -1.880e-01, 2.189e-01, -5.003e-02, 5.183e-02, -7.485e-02, 7.363e-02, 1.857e-02, 1.678e-01, -1.711e-02, 1.165e-01, 3.703e-02, -2.523e-01, -2.358e-02)); + r += mul(s2_2, M4(3.419e-02, 3.932e-02, 7.664e-02, 1.920e-01, -5.878e-02, -4.309e-02, -7.888e-02, -1.210e-02, 9.921e-02, -7.974e-02, -7.892e-02, -1.368e-01, -1.106e-01, 6.524e-02, 4.530e-02, 3.731e-02)); + r += mul(s2_3, M4(1.122e-01, 4.290e-02, 6.229e-03, -5.814e-02, -8.716e-02, -3.329e-02, -3.989e-02, 5.030e-02, -8.717e-02, 7.386e-02, 1.774e-02, -1.027e-01, 1.304e-02, 6.706e-02, -3.998e-03, -1.373e-02)); + r += mul(s2_4, M4(7.571e-02, 9.108e-02, 1.515e-01, -3.229e-02, 1.363e-01, -6.226e-02, 8.916e-02, -3.928e-02, -2.106e-03, 3.530e-02, -4.458e-02, -9.075e-03, 4.753e-02, -6.515e-02, 1.183e-01, 3.796e-02)); + r += mul(s2_5, M4(-6.416e-02, -7.677e-02, 1.812e-01, 4.696e-02, -7.591e-02, 6.010e-02, 2.132e-03, -8.509e-02, -2.236e-02, 5.432e-02, 3.393e-02, 1.354e-01, 1.391e-01, 2.640e-02, -1.029e-02, 4.559e-02)); + r += mul(s2_6, M4(2.302e-02, 1.361e-01, 1.578e-01, 8.174e-03, 3.473e-02, 7.651e-02, -1.799e-02, 6.476e-02, 4.752e-03, -4.013e-02, 1.431e-01, -7.007e-02, -9.436e-02, 1.011e-01, -4.980e-02, -1.059e-02)); + r += mul(s2_7, M4(9.090e-02, 5.888e-02, 9.000e-02, -3.742e-02, 5.067e-02, 2.931e-03, 5.460e-02, 4.517e-03, -1.107e-02, 1.579e-01, 3.834e-02, 9.015e-02, 7.654e-02, -8.582e-04, -3.566e-02, -3.666e-02)); + r += mul(s2_8, M4(-1.902e-01, -6.281e-02, 1.274e-01, 1.703e-02, -6.806e-02, 8.779e-02, -1.885e-01, 3.918e-02, 8.967e-02, -8.760e-02, 9.290e-02, -2.748e-02, 6.798e-03, 1.434e-02, -1.477e-02, -1.213e-01)); + r += mul(s3_0, M4(-4.167e-02, -6.296e-02, 1.694e-01, -1.619e-01, -5.172e-02, 3.976e-02, 1.511e-02, -6.793e-02, -4.164e-02, 7.498e-02, -3.502e-02, 1.430e-01, 2.042e-02, 1.119e-03, -5.693e-02, 4.382e-02)); + r += mul(s3_1, M4(-2.133e-02, -8.130e-02, -1.180e-01, -1.165e-01, -3.496e-01, 1.115e-01, 1.996e-01, 4.404e-02, 8.458e-02, 7.163e-02, 1.094e-02, 4.361e-02, -4.895e-03, 3.641e-02, -3.300e-02, -8.676e-03)); + r += mul(s3_2, M4(-4.757e-02, 5.155e-02, -3.629e-03, 5.710e-02, 2.900e-01, -7.436e-02, 2.527e-01, -1.666e-01, 2.816e-02, -6.282e-02, -7.414e-02, 9.729e-02, -1.450e-01, -2.380e-02, 6.081e-02, 7.674e-02)); + r += mul(s3_3, M4(-5.416e-02, 4.368e-02, -9.068e-02, -9.732e-02, -4.119e-01, 6.885e-02, -9.626e-02, -2.044e-02, 2.765e-02, -9.241e-04, -3.130e-03, 1.777e-02, -2.878e-02, -7.006e-02, 6.017e-02, -8.017e-02)); + r += mul(s3_4, M4(6.011e-02, 2.476e-02, -7.871e-03, -3.067e-02, -1.666e-01, 2.471e-01, -1.384e-01, -1.670e-01, -2.046e-02, 4.711e-04, -4.056e-02, -1.043e-02, -6.928e-02, -1.034e-01, 1.530e-01, -1.081e-01)); + r += mul(s3_5, M4(-6.437e-02, -2.059e-03, 1.335e-01, -9.360e-02, -6.898e-01, 3.446e-01, 8.080e-02, -1.326e-01, 2.047e-01, -1.710e-01, 1.809e-02, 8.229e-02, 1.048e-01, -2.134e-02, 2.202e-01, -5.295e-03)); + r += mul(s3_6, M4(-8.757e-02, 3.572e-02, -1.984e-02, 3.324e-02, 1.682e-01, -9.900e-02, -3.028e-02, -6.892e-02, -1.136e-01, 1.243e-02, -1.335e-01, 9.428e-02, -4.810e-02, -5.990e-02, 2.229e-02, -9.369e-02)); + r += mul(s3_7, M4(1.028e-03, -9.446e-02, -1.577e-01, 3.588e-02, -3.531e-01, 1.472e-01, -3.714e-01, -7.450e-03, 5.036e-02, 7.070e-02, -2.362e-03, -8.038e-02, -3.325e-03, 1.388e-03, -1.553e-02, 9.550e-02)); + r += mul(s3_8, M4(-8.163e-02, -1.237e-01, -7.440e-02, -4.663e-02, -5.525e-01, 2.020e-01, -9.522e-02, -5.103e-02, 6.793e-02, -4.918e-02, 7.321e-02, 2.461e-02, 1.587e-01, 1.852e-02, -3.698e-02, -6.401e-03)); + r += mul(s4_0, M4(7.860e-03, 3.884e-02, 5.483e-03, 5.174e-03, -3.893e-02, -6.120e-02, 1.887e-03, 1.142e-01, 3.721e-02, -1.634e-01, 1.052e-01, -4.523e-02, 8.545e-02, -6.886e-02, 1.515e-01, -1.370e-01)); + r += mul(s4_1, M4(9.963e-02, -9.395e-02, 1.836e-02, -3.191e-02, -1.768e-01, 3.712e-02, -4.629e-02, 6.314e-02, 2.586e-02, -9.573e-02, 1.088e-01, 1.255e-01, 1.712e-01, 1.425e-01, 1.209e-01, 2.170e-02)); + r += mul(s4_2, M4(-2.128e-02, 5.724e-02, 1.005e-02, 5.762e-02, -1.540e-01, 5.492e-02, -4.018e-02, 1.316e-01, 6.741e-02, 7.806e-02, -6.408e-02, 4.491e-02, 5.640e-02, 5.481e-02, 4.540e-02, -5.886e-02)); + r += mul(s4_3, M4(-1.801e-02, -1.554e-01, 1.069e-01, 1.312e-01, -1.322e-02, -1.649e-01, -1.783e-01, -5.706e-02, 1.447e-01, 5.617e-02, -8.603e-03, 8.138e-02, -1.422e-01, 7.130e-02, 3.093e-02, -1.061e-01)); + r += mul(s4_4, M4(5.832e-02, -2.313e-02, -7.741e-03, -1.037e-01, 1.611e-01, 1.601e-01, -1.605e-01, 6.488e-02, 4.587e-02, 7.448e-02, 4.622e-05, 1.951e-01, 1.929e-01, 2.702e-01, 3.835e-02, 1.293e-01)); + r += mul(s4_5, M4(-3.686e-02, 2.329e-02, -1.811e-02, -2.372e-02, 3.541e-02, -5.643e-02, -7.094e-02, 7.574e-02, -6.198e-02, -5.071e-02, 1.720e-02, 1.528e-01, -5.980e-02, 1.051e-01, -1.504e-01, 9.834e-02)); + r += mul(s4_6, M4(-3.692e-02, 1.263e-02, 3.742e-02, -1.246e-01, -1.047e-01, 2.976e-02, 1.274e-01, 6.227e-02, 1.215e-01, 1.237e-01, -9.143e-02, 1.762e-02, -6.094e-02, -2.488e-03, 9.006e-02, -1.239e-02)); + r += mul(s4_7, M4(4.501e-02, 7.817e-02, 1.274e-02, -3.442e-02, 1.184e-01, 5.412e-02, -6.588e-03, -9.060e-02, -2.775e-02, 9.915e-02, -2.931e-02, -1.805e-02, -9.197e-02, -4.583e-02, 5.251e-02, 8.606e-02)); + r += mul(s4_8, M4(-6.336e-03, 7.080e-02, 7.193e-02, -8.116e-02, -6.069e-02, 7.960e-02, 4.466e-02, -1.234e-01, 3.669e-02, -1.267e-01, 4.789e-02, 9.546e-02, -1.251e-01, 1.596e-01, -5.935e-03, -1.457e-02)); + r += mul(s5_0, M4(-1.131e-01, 2.031e-03, -2.170e-01, 9.359e-02, 7.448e-02, -6.712e-02, 2.227e-02, -8.335e-03, -1.201e-01, 2.041e-03, -7.554e-02, 3.226e-02, 4.219e-02, 1.368e-02, -7.555e-02, -3.879e-02)); + r += mul(s5_1, M4(-8.146e-02, -4.065e-02, -6.824e-02, 2.306e-01, 9.171e-02, -9.450e-02, -9.963e-02, -1.612e-01, -1.035e-01, -2.014e-01, -5.606e-02, -1.103e-01, 6.326e-02, 8.356e-02, -1.101e-01, -3.499e-02)); + r += mul(s5_2, M4(-6.828e-02, 4.353e-02, 4.308e-02, -5.173e-02, -7.365e-02, 1.957e-04, -9.301e-02, 3.017e-02, 9.228e-02, -1.073e-01, 9.554e-02, -6.032e-03, 4.334e-02, 8.985e-02, 1.425e-02, 3.057e-03)); + r += mul(s5_3, M4(-1.820e-01, -3.243e-01, 4.594e-01, 2.017e-01, 2.362e-02, 1.450e-01, -3.296e-02, -1.968e-01, 4.588e-02, -1.155e-01, 1.189e-01, -8.530e-02, -2.630e-02, -9.324e-02, 1.008e-01, 7.584e-02)); + r += mul(s5_4, M4(2.302e-01, -1.174e-01, 3.527e-03, 1.558e-02, 9.033e-02, 9.558e-02, 8.247e-02, -1.767e-01, -3.612e-02, 8.947e-02, -5.578e-03, -2.079e-01, -1.438e-01, 6.322e-02, 3.686e-02, 5.993e-03)); + r += mul(s5_5, M4(9.295e-02, 1.557e-01, 6.068e-02, 2.223e-02, -1.008e-02, -1.868e-02, 1.444e-01, -6.666e-03, 2.329e-02, 2.803e-02, 5.175e-02, 2.903e-02, -3.607e-02, 3.059e-02, 5.683e-02, 5.372e-02)); + r += mul(s5_6, M4(2.503e-01, 4.217e-03, 2.266e-02, -9.277e-02, -8.317e-02, 5.995e-02, 6.297e-03, 2.473e-02, -1.268e-01, 1.181e-01, 1.405e-01, -1.039e-01, -6.847e-03, -4.872e-02, -9.843e-02, 8.868e-02)); + r += mul(s5_7, M4(1.709e-01, -5.937e-02, 4.764e-01, 3.679e-02, 7.183e-02, -1.304e-01, 1.472e-03, 1.494e-02, 2.637e-02, -5.433e-02, -3.825e-03, -8.601e-02, -5.135e-02, 1.348e-01, 1.563e-01, -7.091e-02)); + r += mul(s5_8, M4(-9.578e-02, 3.730e-02, 1.338e-02, -3.171e-03, -9.686e-02, 2.701e-02, 2.475e-02, 5.352e-02, 1.130e-01, 1.037e-01, -7.294e-02, 1.155e-01, -1.874e-02, -4.895e-02, -8.928e-02, 4.230e-02)); + r += mul(s6_0, M4(4.921e-02, -2.864e-02, 9.962e-02, -1.616e-01, -4.359e-02, 3.743e-02, -8.323e-02, 8.412e-04, -3.199e-02, 2.923e-02, -7.784e-02, -1.324e-01, 1.150e-01, 6.624e-02, 2.112e-02, -9.146e-03)); + r += mul(s6_1, M4(2.497e-02, 8.942e-02, 4.448e-03, -4.835e-02, -1.912e-01, 1.012e-02, 1.050e-01, -1.184e-01, 2.731e-03, 1.496e-02, -1.011e-02, -8.049e-02, 3.949e-02, 1.983e-02, -6.960e-02, 3.667e-02)); + r += mul(s6_2, M4(-1.267e-01, 1.528e-01, 1.032e-01, -1.747e-02, -2.512e-01, 6.264e-02, 4.478e-02, -7.420e-02, 1.971e-02, -1.210e-02, 6.577e-02, -1.485e-01, 8.669e-02, 2.808e-02, -2.027e-01, -9.546e-03)); + r += mul(s6_3, M4(-5.131e-02, 2.670e-02, -7.644e-02, 3.217e-02, -1.250e-01, -2.789e-02, 1.098e-01, 1.061e-01, 5.801e-02, -1.449e-01, -1.785e-01, 6.115e-03, -1.588e-01, 5.088e-02, 9.708e-02, 8.950e-02)); + r += mul(s6_4, M4(6.558e-02, -8.009e-02, -1.274e-01, -9.429e-02, -1.121e-01, -1.436e-01, 1.718e-01, 1.111e-01, -9.270e-02, -9.540e-02, 7.031e-02, -1.759e-01, 5.097e-02, -1.088e-01, 4.010e-02, 4.602e-02)); + r += mul(s6_5, M4(-2.712e-02, -1.345e-01, 2.232e-02, 2.669e-02, 3.503e-01, -5.749e-03, 8.629e-02, 4.931e-02, 7.628e-03, 1.580e-01, 1.701e-01, -8.106e-02, 1.535e-02, -5.827e-02, 1.061e-01, -7.086e-02)); + r += mul(s6_6, M4(1.574e-02, 2.954e-02, -3.332e-03, -9.029e-02, -6.109e-02, -3.010e-02, -7.304e-02, 8.621e-02, 2.478e-02, -1.433e-02, -9.557e-02, 1.353e-01, 1.971e-01, -6.685e-02, 4.943e-02, 1.762e-01)); + r += mul(s6_7, M4(1.119e-01, 3.119e-02, 9.649e-02, -1.372e-01, 9.541e-02, 1.287e-01, -1.209e-01, -1.336e-01, -5.958e-02, -9.256e-02, -4.365e-02, 9.556e-02, 1.614e-02, 4.822e-02, 7.347e-02, 1.568e-01)); + r += mul(s6_8, M4(-5.852e-03, -5.064e-02, 1.870e-01, -5.772e-02, -1.432e-01, 3.698e-03, 1.276e-01, -1.390e-01, -6.877e-03, -3.936e-02, 8.278e-02, 3.605e-03, -3.207e-02, -1.130e-01, -1.071e-01, 2.186e-02)); + r += mul(s7_0, M4(1.382e-01, 1.066e-02, 1.112e-01, -2.032e-01, 1.821e-02, 6.938e-04, 5.903e-02, 1.176e-02, -1.381e-01, -7.692e-02, -1.254e-01, -6.592e-03, 1.094e-02, -2.691e-02, -3.247e-02, -1.120e-01)); + r += mul(s7_1, M4(3.450e-01, -9.358e-02, -7.091e-03, -1.259e-02, 1.100e-01, -2.740e-02, -6.952e-02, -4.548e-02, 7.692e-02, -4.172e-02, -3.717e-02, -8.551e-02, 3.655e-02, 5.882e-02, -9.729e-03, -3.302e-02)); + r += mul(s7_2, M4(6.189e-03, 4.251e-02, -6.474e-02, 2.334e-02, -4.998e-02, 6.903e-02, 7.593e-02, -1.005e-01, 1.668e-03, 1.395e-02, -9.261e-02, -3.769e-02, -5.664e-02, 4.900e-02, -1.949e-02, -3.177e-02)); + r += mul(s7_3, M4(4.695e-02, 8.681e-02, 7.893e-02, 4.932e-02, -4.687e-02, 8.626e-03, -2.098e-03, -1.537e-01, 5.335e-02, -7.062e-02, 1.179e-01, 9.341e-03, -3.518e-02, 1.097e-01, -1.079e-01, -9.958e-02)); + r += mul(s7_4, M4(2.912e-01, 8.360e-02, 3.996e-02, -1.659e-01, -7.513e-02, -2.769e-02, 5.027e-02, 2.613e-01, 1.307e-01, 4.392e-03, -4.296e-02, 1.132e-01, 6.710e-02, -1.828e-01, 3.217e-02, -5.482e-02)); + r += mul(s7_5, M4(1.063e-01, -6.933e-03, -1.220e-01, 2.037e-01, 1.207e-01, -2.337e-02, -2.119e-02, 4.235e-02, -9.710e-02, 7.359e-03, 1.674e-01, 1.008e-01, 1.264e-01, 6.562e-02, 2.172e-02, -2.759e-02)); + r += mul(s7_6, M4(-2.009e-01, -3.470e-02, 4.713e-02, -2.868e-01, -1.296e-02, 5.734e-02, 8.538e-02, -8.481e-03, -1.077e-01, -3.312e-02, 4.065e-02, 1.199e-01, -3.355e-02, 4.408e-02, 6.869e-02, 7.852e-02)); + r += mul(s7_7, M4(-1.488e-02, -9.504e-02, -5.499e-02, -1.036e-01, -8.776e-02, 5.539e-02, -7.250e-02, 8.325e-02, 4.185e-02, 8.300e-02, 3.218e-02, 2.410e-01, 1.812e-01, -3.772e-02, -7.048e-02, -2.958e-02)); + r += mul(s7_8, M4(5.901e-02, 5.462e-02, 1.877e-02, 1.296e-02, -3.299e-04, 4.156e-02, -1.330e-01, -1.156e-01, 9.044e-03, 1.101e-02, -1.311e-01, -1.336e-01, 1.801e-01, 7.683e-02, -1.230e-01, 2.210e-02)); + r += V4(-3.601e-02, 2.785e-02, 1.684e-04, -7.248e-02); + return r; +} + +V4 f2(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-1.511e-01, 6.291e-02, -4.318e-02, 4.797e-03, 7.914e-02, 5.092e-02, -2.714e-02, 3.254e-03, -6.260e-02, 1.222e-01, 7.157e-02, -5.641e-02, -1.388e-01, -7.529e-02, 1.045e-01, -1.507e-03)); + r += mul(s0_1, M4(8.468e-02, 2.170e-01, 1.647e-01, 8.689e-03, 9.086e-02, 1.816e-01, 9.235e-03, 7.385e-02, -1.458e-02, -2.316e-02, 2.719e-02, 8.236e-02, -4.202e-02, 6.168e-02, -6.452e-02, 4.523e-03)); + r += mul(s0_2, M4(-9.053e-02, 5.428e-02, -7.223e-02, -1.326e-01, -1.022e-01, 1.603e-01, 1.160e-01, -1.811e-01, -1.709e-01, -1.445e-01, 2.000e-01, 9.591e-02, 1.133e-01, 6.793e-02, 5.220e-02, 3.587e-02)); + r += mul(s0_3, M4(1.357e-01, -4.035e-02, -7.542e-02, -1.238e-01, -1.316e-01, -1.207e-02, -1.653e-02, -6.519e-02, 5.752e-02, -1.875e-01, 4.793e-02, -9.157e-02, -2.477e-02, -1.841e-02, -2.652e-02, 1.056e-01)); + r += mul(s0_4, M4(1.456e-01, 1.258e-02, -7.971e-02, -4.622e-03, 2.229e-01, 9.433e-02, 1.444e-01, 1.025e-01, 9.825e-02, 2.889e-02, -4.671e-02, 2.770e-02, 7.783e-02, -9.808e-02, -6.966e-02, 8.734e-02)); + r += mul(s0_5, M4(-1.451e-01, -4.161e-02, -7.557e-02, -4.700e-02, -2.362e-01, -4.973e-02, 1.858e-03, -4.063e-02, 2.257e-01, -2.317e-02, -1.216e-01, 9.751e-02, 4.200e-02, 2.132e-02, -4.459e-02, 7.851e-03)); + r += mul(s0_6, M4(-5.414e-03, 6.019e-02, -3.878e-02, 1.580e-01, 4.609e-01, -1.148e-01, 4.239e-02, 7.252e-02, 1.666e-02, 6.721e-02, 1.354e-01, 4.201e-02, 5.184e-02, 2.784e-02, -2.395e-02, 4.399e-02)); + r += mul(s0_7, M4(9.582e-02, -1.141e-01, 1.359e-01, 1.092e-01, 2.539e-02, -1.223e-01, -8.734e-03, -2.589e-01, -2.802e-02, 2.185e-01, 2.233e-02, -1.094e-01, 6.573e-02, 1.053e-01, 6.570e-02, -4.853e-02)); + r += mul(s0_8, M4(-4.426e-02, -2.154e-02, 3.121e-03, -3.852e-02, -5.457e-02, 1.207e-03, 1.977e-01, -7.048e-02, 9.662e-02, 9.187e-02, -3.300e-02, -9.639e-02, -5.657e-02, -1.752e-02, 1.350e-01, -2.091e-02)); + r += mul(s1_0, M4(-1.525e-01, 1.467e-01, -1.882e-01, -9.671e-02, -8.896e-02, -4.265e-02, -3.285e-02, 1.379e-02, 7.665e-02, 5.953e-03, 6.120e-02, -6.980e-02, -7.102e-02, -2.386e-02, -2.886e-02, -1.403e-01)); + r += mul(s1_1, M4(1.566e-01, 1.743e-01, 6.076e-02, -8.198e-02, -2.121e-02, -1.783e-02, 8.034e-02, -4.218e-03, 4.352e-02, 2.568e-02, -2.166e-01, -7.963e-03, 6.286e-02, 1.651e-01, -1.422e-01, -8.033e-02)); + r += mul(s1_2, M4(-1.433e-01, 1.123e-01, 1.040e-01, -1.238e-01, -3.072e-02, -1.398e-02, 1.370e-01, -9.717e-02, 6.875e-03, -1.036e-01, 1.524e-01, 6.576e-02, 3.454e-02, 3.696e-02, -6.506e-02, 9.144e-03)); + r += mul(s1_3, M4(3.416e-02, 1.681e-01, 4.973e-03, -1.784e-02, 1.433e-01, -3.586e-02, -6.171e-02, 5.305e-02, 1.669e-01, -6.170e-02, 2.149e-01, -1.927e-02, 1.244e-02, -5.511e-02, -2.138e-01, -5.206e-02)); + r += mul(s1_4, M4(4.795e-02, 5.456e-02, -8.320e-02, 2.625e-02, -4.835e-03, 5.101e-02, 1.760e-01, -4.447e-02, 3.431e-02, 4.533e-02, -7.802e-02, -6.762e-02, 1.274e-01, -3.599e-04, -2.310e-01, 5.342e-02)); + r += mul(s1_5, M4(-9.627e-02, 1.068e-02, -1.488e-01, 8.066e-02, 5.780e-02, 8.952e-02, -1.372e-01, -1.067e-02, 2.786e-02, 6.846e-02, -9.092e-02, -1.315e-01, 1.724e-01, 1.178e-02, -1.968e-01, 6.223e-02)); + r += mul(s1_6, M4(-1.254e-01, -1.597e-02, -9.678e-02, 4.643e-03, -1.380e-02, -4.123e-02, -4.689e-02, 4.474e-02, 2.131e-02, 1.007e-01, 1.677e-02, 4.482e-02, 1.120e-01, 5.918e-02, -1.698e-01, -6.037e-02)); + r += mul(s1_7, M4(8.032e-02, 1.316e-02, 1.546e-01, 1.446e-03, -1.208e-01, -1.349e-02, -1.146e-01, 5.901e-02, 3.247e-02, 2.274e-01, 1.425e-02, -5.002e-02, -6.477e-02, 3.140e-01, 2.705e-01, 3.952e-02)); + r += mul(s1_8, M4(1.709e-02, 5.680e-02, 5.499e-02, -1.227e-02, 5.584e-02, -2.021e-02, -5.704e-02, 1.497e-01, -1.477e-01, -1.815e-02, 5.863e-02, 3.848e-02, -1.686e-01, -4.496e-03, -2.946e-02, 3.112e-01)); + r += mul(s2_0, M4(-5.505e-02, -8.205e-02, -9.848e-03, 4.871e-02, -6.139e-02, 7.057e-02, -9.198e-02, -4.509e-02, 1.479e-01, 7.591e-02, 3.395e-02, 7.347e-02, -4.939e-02, 5.614e-02, 8.329e-02, -1.111e-01)); + r += mul(s2_1, M4(-1.309e-02, 3.023e-02, 5.362e-02, -5.243e-04, 6.147e-03, 1.381e-01, 7.541e-02, 6.699e-03, -3.014e-02, 9.167e-02, 5.641e-02, 5.618e-02, 3.285e-02, 6.500e-02, -9.409e-02, -1.153e-01)); + r += mul(s2_2, M4(-8.556e-02, 2.180e-02, -1.062e-01, -4.832e-02, 4.095e-02, 4.088e-02, 5.495e-02, -3.893e-02, 7.819e-02, 7.236e-03, -2.708e-01, 3.541e-02, 1.015e-02, 1.035e-01, 4.725e-02, -1.274e-01)); + r += mul(s2_3, M4(-1.225e-02, -4.637e-02, -1.343e-01, 5.954e-04, -5.979e-02, -5.189e-02, -3.641e-02, -1.261e-02, 7.673e-02, 2.366e-02, -5.871e-02, 1.500e-01, 1.868e-03, 7.390e-02, 3.925e-02, -2.019e-01)); + r += mul(s2_4, M4(6.534e-02, -3.131e-02, -3.835e-02, 1.024e-01, 2.550e-02, -2.252e-01, -1.511e-01, 3.961e-02, 6.134e-02, -8.533e-02, 2.423e-01, 3.648e-03, 3.086e-02, 2.955e-01, 4.568e-02, -1.388e-01)); + r += mul(s2_5, M4(9.419e-02, 6.610e-02, -9.343e-03, 1.570e-01, 1.163e-01, -6.123e-02, 1.423e-01, -2.549e-02, -3.459e-02, -4.878e-02, 1.442e-01, 2.279e-02, 2.613e-03, 8.214e-02, -9.397e-02, -3.986e-01)); + r += mul(s2_6, M4(7.450e-02, -3.281e-02, 6.155e-02, 1.158e-01, 4.246e-02, -4.966e-03, -4.972e-02, 1.587e-01, 3.878e-02, -1.533e-02, -7.299e-02, 9.350e-02, -1.141e-01, 2.466e-02, 4.101e-02, -5.603e-02)); + r += mul(s2_7, M4(1.040e-01, -1.231e-03, 3.496e-02, 1.730e-01, -4.405e-02, -6.203e-02, -1.186e-01, -2.842e-02, 2.053e-01, -7.939e-03, 1.057e-02, 4.796e-02, -1.228e-01, 8.233e-02, 3.011e-03, 5.167e-02)); + r += mul(s2_8, M4(3.120e-03, -1.315e-01, -3.174e-02, -3.502e-03, -2.544e-02, -1.667e-01, 9.923e-02, 5.171e-02, -4.162e-02, 4.400e-02, -1.520e-03, -1.266e-01, 3.305e-02, -4.683e-02, -6.430e-02, -2.213e-01)); + r += mul(s3_0, M4(1.791e-01, 8.767e-02, -1.035e-01, -5.746e-02, 1.932e-01, 1.365e-01, -1.041e-01, -1.190e-01, -5.021e-02, -9.372e-02, 1.518e-01, -8.073e-03, 8.354e-02, 1.443e-02, -3.073e-02, 4.436e-04)); + r += mul(s3_1, M4(1.749e-01, 1.111e-01, -9.453e-02, 6.243e-03, -8.159e-02, 1.294e-01, -2.138e-01, -2.047e-01, -6.285e-02, -1.430e-01, 1.827e-01, -1.306e-01, 1.589e-01, -1.626e-01, 9.451e-02, 1.382e-01)); + r += mul(s3_2, M4(1.246e-01, 3.725e-02, -2.836e-02, -7.300e-02, -4.093e-01, -2.419e-01, 8.773e-02, -2.995e-01, 1.032e-02, 6.422e-02, -1.224e-01, -3.108e-02, 5.925e-02, -2.313e-02, 7.758e-02, 2.530e-02)); + r += mul(s3_3, M4(2.111e-02, 1.246e-01, 9.110e-02, -5.404e-03, -2.955e-01, -1.573e-01, -3.030e-02, -1.409e-01, -1.599e-01, 3.792e-02, 1.226e-01, -4.558e-02, 3.511e-02, -4.587e-02, -1.939e-02, 2.639e-02)); + r += mul(s3_4, M4(7.720e-02, 2.084e-02, 8.917e-02, 1.445e-02, 4.673e-01, 2.153e-01, 1.753e-01, -2.931e-01, 6.767e-02, 6.694e-02, 1.008e-01, 2.111e-02, 7.684e-02, -4.892e-02, 1.308e-01, 1.391e-01)); + r += mul(s3_5, M4(-1.162e-02, -7.123e-03, -1.536e-02, -1.242e-01, -5.258e-01, 2.133e-01, 9.476e-02, -2.865e-01, -1.337e-01, 6.592e-02, 1.598e-01, 5.042e-02, 1.470e-01, -2.654e-01, -7.099e-02, 6.915e-02)); + r += mul(s3_6, M4(2.419e-02, 1.382e-02, 1.608e-01, -4.062e-02, 3.155e-01, -8.156e-02, 1.359e-01, -2.261e-02, -8.081e-02, -1.597e-02, -8.854e-02, -8.236e-02, 3.261e-02, 1.229e-02, -1.461e-02, -8.523e-03)); + r += mul(s3_7, M4(-6.260e-02, 3.053e-02, -1.282e-01, 3.057e-02, 3.895e-01, 7.897e-02, -1.159e-01, -3.442e-02, 1.594e-01, -2.652e-02, 1.039e-01, -5.180e-02, -7.941e-04, 2.955e-02, 8.395e-02, 3.421e-01)); + r += mul(s3_8, M4(-1.731e-01, -4.189e-02, 4.495e-02, -4.503e-02, -6.134e-03, 1.436e-01, -2.564e-02, -5.602e-01, 3.015e-02, 3.406e-02, -1.213e-01, -8.228e-02, 9.247e-02, -1.539e-01, -7.955e-02, 1.516e-01)); + r += mul(s4_0, M4(-5.650e-02, -1.684e-01, 4.824e-02, 1.060e-01, 3.347e-02, 2.775e-03, 1.072e-01, 4.624e-02, 2.303e-02, 3.802e-02, 1.435e-02, 2.096e-02, -2.840e-02, -6.238e-02, -6.434e-02, -8.860e-03)); + r += mul(s4_1, M4(4.276e-02, -2.617e-03, -1.503e-02, 8.597e-02, 2.836e-02, -3.066e-02, 1.198e-01, 1.579e-01, 7.397e-02, 3.772e-02, -1.218e-02, -4.990e-02, 2.318e-01, 1.096e-02, -2.781e-02, 8.578e-02)); + r += mul(s4_2, M4(5.226e-03, -2.910e-02, 7.799e-03, 5.320e-02, 6.157e-02, -6.031e-02, 2.537e-01, 2.064e-02, -1.604e-02, -5.053e-02, 3.938e-02, 4.349e-02, 9.145e-02, 5.544e-02, -1.214e-01, 1.123e-01)); + r += mul(s4_3, M4(-6.617e-02, -9.174e-02, -9.785e-02, -1.779e-02, -6.589e-03, -9.741e-03, 4.801e-03, -2.262e-02, 1.830e-01, 1.203e-01, -6.135e-02, 1.599e-03, 2.769e-01, -7.650e-02, -2.721e-02, -5.785e-02)); + r += mul(s4_4, M4(2.603e-02, 1.843e-02, -4.574e-02, 1.129e-01, -2.174e-02, 9.855e-02, 9.537e-03, 1.742e-01, -8.932e-02, -7.845e-02, 6.868e-02, -3.103e-02, 2.979e-02, 1.596e-01, 1.723e-01, -1.214e-01)); + r += mul(s4_5, M4(4.591e-02, 1.412e-02, 1.122e-01, 4.529e-02, 4.654e-02, -8.696e-02, -1.899e-01, -1.347e-01, 1.343e-01, -2.258e-02, -1.283e-01, 1.312e-01, 5.779e-02, -5.568e-02, -2.225e-01, -1.675e-01)); + r += mul(s4_6, M4(5.667e-02, 5.176e-02, -6.943e-02, -6.500e-02, 1.061e-01, -8.167e-02, -9.606e-02, 1.021e-01, -1.497e-02, 5.960e-02, 1.350e-02, -9.938e-02, 1.023e-01, -2.373e-02, -6.568e-02, 1.451e-01)); + r += mul(s4_7, M4(1.299e-01, -7.720e-03, 7.879e-02, 4.712e-02, 1.314e-01, 1.196e-03, -1.748e-02, -1.014e-01, 3.276e-02, -4.651e-02, -5.061e-02, -5.489e-02, 8.441e-02, 1.724e-02, -1.137e-01, -6.442e-02)); + r += mul(s4_8, M4(5.671e-02, 4.130e-02, 6.218e-02, -2.464e-02, -6.562e-02, -4.754e-02, 4.596e-02, -6.954e-02, 3.372e-02, -1.087e-01, 1.087e-01, 1.233e-01, 1.730e-01, -1.170e-01, 6.077e-02, -1.734e-01)); + r += mul(s5_0, M4(4.058e-02, -1.032e-01, 2.975e-01, -6.645e-03, -3.148e-02, 1.065e-01, -3.101e-02, -1.095e-02, -4.078e-02, 3.742e-02, 3.146e-02, 1.516e-02, -8.725e-02, 5.109e-02, 8.896e-02, -1.127e-02)); + r += mul(s5_1, M4(-1.999e-01, 2.049e-01, -7.905e-02, 1.578e-01, -3.631e-03, 3.358e-02, -6.989e-02, 2.414e-02, 1.249e-01, 6.485e-02, -8.061e-02, -9.337e-02, -1.166e-01, 1.110e-03, -1.951e-02, 3.245e-03)); + r += mul(s5_2, M4(-2.752e-01, -5.711e-02, 5.200e-02, -1.697e-01, -1.621e-02, 1.003e-01, -5.501e-02, -9.240e-02, -3.534e-01, -9.596e-02, -3.872e-03, -1.727e-01, 4.123e-02, 1.767e-02, -5.866e-02, 7.239e-02)); + r += mul(s5_3, M4(1.877e-01, 1.430e-01, 1.501e-01, -1.773e-01, 5.531e-02, 2.192e-02, 2.932e-02, -1.146e-01, 9.320e-02, -3.421e-02, 1.994e-02, 3.734e-02, -2.613e-02, -4.764e-02, 7.802e-02, -2.090e-02)); + r += mul(s5_4, M4(-1.952e-01, 3.962e-02, -3.031e-01, -2.278e-01, -4.020e-02, 4.581e-02, 1.124e-02, 4.139e-02, 1.343e-01, 4.335e-02, 3.382e-03, 1.526e-01, -1.343e-01, -1.078e-01, 1.909e-01, 5.437e-02)); + r += mul(s5_5, M4(-1.601e-01, 1.749e-02, 8.916e-02, -8.576e-02, 4.084e-02, -8.203e-03, -5.241e-02, -3.195e-02, 1.517e-01, -9.517e-02, -1.732e-02, 1.465e-03, 1.045e-01, -4.128e-02, 3.516e-02, 5.704e-03)); + r += mul(s5_6, M4(1.836e-01, -1.892e-01, -1.645e-02, -2.708e-01, -2.982e-02, 1.039e-01, -5.709e-02, 6.855e-03, 1.518e-01, -2.389e-01, 7.761e-02, 1.398e-01, 3.486e-02, 8.888e-03, -4.878e-03, 7.297e-02)); + r += mul(s5_7, M4(-3.935e-01, -3.510e-01, -1.532e-02, -3.040e-01, 1.982e-01, -7.558e-02, 4.646e-03, -4.347e-02, -2.576e-02, -2.793e-02, -1.142e-01, 1.072e-02, -1.271e-01, 2.376e-02, -2.919e-02, 1.754e-01)); + r += mul(s5_8, M4(-1.721e-01, 9.197e-02, 4.387e-02, -4.041e-02, -4.891e-02, 1.678e-01, 9.660e-02, 2.045e-02, -8.280e-02, 1.116e-02, 5.892e-02, -1.442e-02, 4.817e-02, -5.926e-02, -4.628e-02, -1.710e-01)); + r += mul(s6_0, M4(4.076e-02, 1.745e-02, -4.922e-02, -5.246e-03, -5.877e-02, -1.241e-01, -9.602e-02, 1.698e-01, -3.920e-02, 5.714e-02, -9.600e-03, -2.555e-02, 5.121e-02, -9.031e-02, 4.058e-02, 4.738e-02)); + r += mul(s6_1, M4(6.272e-02, 3.070e-02, -1.185e-02, 7.250e-02, -2.702e-01, -3.660e-02, 2.202e-01, 4.325e-02, 2.098e-02, -6.503e-02, -1.124e-01, 2.763e-02, -8.107e-02, 9.856e-03, -1.116e-01, 5.262e-02)); + r += mul(s6_2, M4(2.319e-02, 8.325e-03, 4.507e-02, 4.918e-02, 3.141e-02, -4.429e-02, -1.345e-01, -7.937e-02, 8.226e-02, 2.372e-02, -6.866e-02, 1.314e-02, -6.150e-02, 5.907e-02, 2.756e-03, 1.298e-01)); + r += mul(s6_3, M4(-7.615e-02, 1.892e-02, 9.781e-03, 9.630e-02, 1.171e-03, 1.199e-01, -2.645e-01, 9.165e-02, 6.175e-02, 1.452e-02, -1.812e-01, -3.817e-02, -1.544e-01, -7.561e-02, 2.979e-02, 7.044e-02)); + r += mul(s6_4, M4(-1.160e-01, -1.998e-01, 3.482e-03, -1.134e-01, 8.170e-02, -1.845e-01, 1.016e-01, -2.109e-03, 4.811e-02, 8.274e-02, 1.119e-01, 8.181e-02, 3.400e-02, 9.369e-02, 1.696e-01, -3.128e-02)); + r += mul(s6_5, M4(1.119e-01, 5.919e-02, -1.984e-01, -2.139e-01, 1.810e-01, -8.087e-02, 2.033e-01, 6.013e-02, 8.696e-02, 1.415e-01, -1.027e-01, -2.925e-02, 1.681e-01, -1.126e-01, 8.547e-02, 4.805e-02)); + r += mul(s6_6, M4(1.747e-01, 3.428e-02, 7.244e-03, -5.035e-02, 8.084e-02, 6.784e-02, -1.583e-01, 7.107e-02, -4.842e-02, 1.178e-03, -5.551e-02, 8.604e-02, -8.817e-02, 6.024e-02, -1.826e-02, 7.900e-02)); + r += mul(s6_7, M4(1.577e-02, -1.867e-01, -1.363e-01, -1.760e-01, 2.417e-01, -5.955e-02, -2.692e-02, 3.311e-02, -9.635e-03, -3.663e-02, -9.130e-02, -8.953e-02, 5.533e-02, 6.716e-02, 2.129e-01, 4.762e-02)); + r += mul(s6_8, M4(-1.495e-01, -7.207e-02, 1.694e-01, 2.312e-02, 4.239e-02, -3.068e-01, 1.220e-01, -1.715e-02, 1.505e-03, 5.579e-02, 4.435e-02, 4.457e-02, 8.412e-02, 7.905e-02, -1.441e-01, -6.379e-02)); + r += mul(s7_0, M4(1.149e-01, 4.722e-02, 2.133e-02, 1.424e-02, 1.859e-04, -5.039e-02, 8.952e-02, -5.078e-02, 5.445e-02, -6.543e-02, 1.279e-03, -1.213e-02, 3.382e-02, 7.118e-02, 1.440e-01, -8.769e-02)); + r += mul(s7_1, M4(3.510e-02, 1.894e-01, 2.843e-02, 2.383e-01, 1.534e-02, -4.750e-02, 5.790e-02, 1.143e-01, 1.421e-01, 8.004e-02, -1.165e-01, 3.773e-02, 7.492e-02, -9.116e-03, -6.398e-02, 4.644e-02)); + r += mul(s7_2, M4(-8.713e-02, -7.557e-02, 1.099e-01, 2.060e-01, 1.509e-01, 2.796e-02, 1.096e-01, 1.008e-02, -4.055e-03, -1.191e-01, 6.065e-02, -5.197e-02, -2.927e-02, 1.449e-02, 2.451e-02, 1.353e-02)); + r += mul(s7_3, M4(-1.485e-01, -4.476e-03, -1.168e-02, -3.132e-02, -2.069e-02, 9.355e-02, -5.367e-02, -2.892e-02, 4.750e-02, -6.783e-03, 3.523e-02, 6.289e-02, -2.410e-02, -9.802e-04, -1.093e-01, -1.362e-01)); + r += mul(s7_4, M4(-3.914e-02, 7.821e-02, -7.844e-02, -1.809e-01, -5.085e-02, -4.832e-02, -1.591e-01, 4.669e-02, -4.627e-02, -5.537e-03, 1.355e-01, -7.233e-02, 4.326e-02, 9.683e-02, -2.192e-02, -9.251e-02)); + r += mul(s7_5, M4(-1.110e-01, 6.131e-02, -1.894e-01, -3.019e-01, -2.254e-01, -6.784e-03, 1.363e-01, 6.567e-02, 8.258e-02, -1.173e-01, 1.777e-02, -1.289e-02, -4.105e-02, -1.242e-01, 3.670e-02, 2.759e-03)); + r += mul(s7_6, M4(8.101e-02, 1.016e-01, 1.437e-02, 8.071e-02, 4.204e-02, 6.510e-02, 7.350e-02, 6.318e-02, -1.183e-02, -8.410e-02, 8.633e-02, 1.911e-02, 2.520e-02, 1.194e-01, 6.253e-02, 7.282e-02)); + r += mul(s7_7, M4(-1.113e-02, -1.675e-01, -5.954e-02, 6.680e-02, 6.762e-02, 3.308e-02, -1.173e-01, 3.375e-02, 1.235e-01, -1.005e-01, 3.653e-02, 1.881e-02, -2.134e-01, -8.765e-02, -1.791e-02, 3.922e-02)); + r += mul(s7_8, M4(-1.919e-01, 1.342e-01, 1.823e-01, 9.905e-02, -5.655e-02, 1.171e-02, 2.232e-01, -2.340e-01, -1.177e-01, 3.993e-04, 7.806e-03, -1.813e-01, -4.798e-02, -2.597e-01, -6.103e-02, 1.486e-02)); + r += V4(-6.495e-04, -3.848e-02, 1.047e-02, 2.015e-02); + return r; +} + +V4 f3(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-3.159e-02, -6.705e-02, 1.406e-02, 8.403e-02, -3.497e-03, 5.376e-02, 7.178e-02, -3.957e-02, -3.736e-02, 3.345e-02, 2.996e-02, -1.880e-01, 4.603e-02, 1.004e-01, -8.805e-02, 3.509e-02)); + r += mul(s0_1, M4(-5.347e-02, -5.708e-02, -1.278e-01, 2.970e-02, -3.279e-02, 1.100e-01, -2.325e-02, 1.411e-01, 4.305e-02, 3.041e-02, -2.008e-02, -4.983e-02, -2.828e-02, 4.511e-02, 1.111e-01, 4.899e-02)); + r += mul(s0_2, M4(5.854e-05, -5.055e-02, 1.885e-02, 4.298e-02, -1.795e-02, 8.471e-02, 2.948e-03, 7.111e-02, -1.569e-01, -6.827e-02, -4.522e-02, 2.649e-03, -5.399e-03, -2.765e-02, -1.723e-02, -1.115e-02)); + r += mul(s0_3, M4(2.824e-02, -1.127e-01, 2.280e-02, -3.797e-02, -1.024e-02, -2.479e-02, 5.625e-02, 2.136e-01, 4.185e-01, -3.488e-02, -3.187e-01, -1.726e-01, 1.141e-01, -9.213e-02, 1.387e-02, -4.887e-02)); + r += mul(s0_4, M4(3.438e-02, -6.397e-02, -5.044e-02, -1.373e-01, 3.172e-02, -1.102e-01, 2.146e-01, 9.459e-03, 9.015e-02, 4.659e-02, -1.226e-01, -5.517e-02, 5.106e-02, 5.617e-02, -1.364e-02, -1.413e-03)); + r += mul(s0_5, M4(-4.550e-02, -3.588e-02, 7.481e-02, 4.303e-02, 5.176e-02, 2.496e-01, 1.190e-01, -2.034e-02, -6.099e-02, 1.139e-01, -3.098e-02, -1.325e-02, -3.811e-02, 3.667e-03, 9.665e-02, -1.792e-01)); + r += mul(s0_6, M4(2.194e-02, -5.856e-02, 1.208e-01, 1.092e-02, -5.891e-02, 9.008e-02, -5.660e-02, 9.063e-02, -6.928e-02, -6.372e-02, 1.417e-01, 1.157e-01, -3.776e-02, 7.638e-02, 8.563e-02, -7.157e-02)); + r += mul(s0_7, M4(-7.473e-02, -1.458e-01, 2.874e-02, -4.756e-02, -1.148e-01, 1.311e-02, -1.951e-01, 6.415e-02, -1.319e-01, 7.188e-03, 1.038e-01, -1.325e-01, -1.117e-01, 3.131e-02, -8.221e-02, -1.748e-02)); + r += mul(s0_8, M4(-1.608e-02, -1.291e-01, -7.986e-02, 1.517e-01, -5.935e-02, 1.569e-01, -4.486e-02, 4.935e-02, -5.661e-02, 1.693e-01, 1.163e-01, 7.722e-02, -1.655e-02, 3.182e-02, -4.696e-02, 6.367e-02)); + r += mul(s1_0, M4(-6.963e-02, -3.487e-02, -1.631e-01, -1.077e-01, -4.652e-02, -1.246e-02, -2.988e-02, -1.017e-02, 1.289e-01, -6.770e-02, 3.828e-02, -5.813e-02, -3.392e-02, -8.819e-02, -1.841e-01, -1.657e-01)); + r += mul(s1_1, M4(-2.651e-01, 7.461e-03, 5.940e-02, 1.063e-01, -8.123e-02, 1.449e-01, -6.067e-02, 1.113e-01, -3.371e-03, -1.156e-01, -9.170e-02, -4.502e-02, -1.540e-02, 1.307e-01, 4.423e-02, 4.225e-02)); + r += mul(s1_2, M4(1.609e-01, 4.713e-02, -5.573e-03, -6.268e-02, -1.734e-02, -1.168e-01, 1.544e-02, -5.528e-02, -2.135e-03, 2.001e-02, 3.267e-02, -1.550e-02, -2.343e-02, 5.691e-02, 1.771e-01, 1.450e-02)); + r += mul(s1_3, M4(1.445e-02, -1.291e-01, 1.128e-01, -1.166e-01, -1.172e-01, -7.896e-02, 3.477e-04, -1.610e-02, 1.550e-01, 6.943e-02, 3.919e-02, -9.096e-02, 1.666e-02, -6.882e-02, 2.141e-01, 1.631e-01)); + r += mul(s1_4, M4(-1.641e-01, -1.595e-01, 3.082e-02, -6.409e-02, -6.885e-02, 1.860e-02, 6.810e-02, -5.758e-02, 2.216e-02, 2.606e-02, -5.397e-02, 3.736e-02, -7.740e-02, 1.974e-01, -3.292e-01, -1.246e-01)); + r += mul(s1_5, M4(-8.176e-02, -1.095e-01, -1.079e-01, -6.857e-02, 3.199e-02, 7.660e-03, -7.556e-02, -5.478e-02, -4.592e-02, 1.068e-01, -3.159e-02, 6.177e-02, 1.165e-01, -1.117e-01, 1.025e-01, -1.159e-01)); + r += mul(s1_6, M4(5.382e-02, -2.003e-01, -2.884e-01, -1.508e-01, -4.384e-03, -6.806e-03, 5.757e-02, 6.070e-03, -2.252e-02, -3.155e-02, 4.240e-02, 1.965e-02, -5.008e-02, -1.744e-01, 2.378e-02, 1.946e-01)); + r += mul(s1_7, M4(7.065e-03, -1.934e-01, -2.132e-01, 7.295e-02, 1.288e-01, -1.343e-01, -1.200e-01, -1.150e-01, 1.013e-01, 1.330e-02, -2.353e-02, -2.356e-02, 2.432e-01, -2.708e-02, 2.156e-02, -8.016e-02)); + r += mul(s1_8, M4(1.323e-01, -7.270e-02, -1.247e-02, -3.603e-02, 1.168e-01, -8.455e-02, -1.407e-01, 1.392e-01, 3.015e-02, -3.628e-02, -3.984e-02, 5.628e-02, 7.819e-02, -5.224e-02, -2.634e-02, 9.179e-02)); + r += mul(s2_0, M4(3.436e-02, -1.717e-01, 8.809e-02, 9.274e-02, 4.959e-02, -9.298e-03, -3.566e-03, -7.553e-02, 2.096e-01, 1.975e-03, -1.735e-01, -3.056e-02, 2.566e-03, 6.520e-02, -2.846e-02, 7.517e-02)); + r += mul(s2_1, M4(6.167e-02, -2.440e-02, -1.303e-02, -1.264e-02, 1.362e-01, 4.410e-03, -5.669e-02, 5.663e-03, 1.103e-01, 2.676e-02, -2.537e-01, 1.203e-01, -1.513e-01, 5.708e-02, -1.333e-01, -1.070e-02)); + r += mul(s2_2, M4(1.883e-02, -7.058e-02, -1.755e-02, -9.315e-02, -7.877e-02, -2.632e-02, 1.701e-03, 1.646e-02, 3.673e-02, -7.855e-02, 1.919e-01, 8.576e-02, -1.538e-01, 2.239e-01, -3.572e-02, 3.906e-02)); + r += mul(s2_3, M4(-1.348e-01, 9.100e-02, 4.750e-02, -4.391e-02, 9.521e-02, -1.966e-03, -1.461e-04, -4.581e-02, 6.728e-02, 2.979e-03, -1.134e-01, 1.917e-01, 5.138e-02, 6.732e-03, -7.290e-02, 2.281e-02)); + r += mul(s2_4, M4(3.199e-02, -6.431e-02, 6.152e-02, -3.397e-03, -5.878e-02, -7.019e-02, 3.432e-03, 3.159e-02, -8.416e-02, -1.046e-02, -1.246e-01, 1.008e-01, -1.923e-01, -9.668e-02, 2.751e-01, 2.231e-02)); + r += mul(s2_5, M4(-2.464e-03, 6.058e-02, -5.415e-02, -1.797e-01, -5.133e-02, 6.884e-02, -3.154e-02, -1.150e-01, 2.659e-03, -1.659e-02, 1.029e-01, 1.120e-01, -1.944e-01, 1.481e-01, 1.409e-01, 2.801e-02)); + r += mul(s2_6, M4(4.667e-02, -1.064e-01, 2.535e-02, 7.449e-02, 6.001e-02, -1.077e-01, 7.760e-02, 7.536e-02, 8.011e-02, -1.427e-01, 2.664e-02, -9.192e-02, -8.377e-02, 2.433e-02, 2.297e-02, 7.049e-02)); + r += mul(s2_7, M4(-5.233e-02, -4.193e-02, -1.651e-02, -2.001e-01, 4.654e-02, -1.089e-02, -4.719e-02, 2.223e-02, -9.302e-03, -4.426e-02, 2.210e-02, 5.566e-02, -5.970e-02, 1.829e-01, -3.557e-02, 1.214e-01)); + r += mul(s2_8, M4(4.346e-02, 4.874e-02, -4.945e-02, 1.150e-01, -6.326e-02, -2.545e-02, -9.380e-02, 3.646e-02, 1.263e-02, 1.527e-01, 4.378e-02, -7.941e-02, -4.891e-02, 6.231e-02, 6.571e-03, 2.289e-02)); + r += mul(s3_0, M4(-7.488e-02, 9.791e-02, -1.234e-02, -5.133e-02, 1.198e-02, 1.559e-01, -8.043e-02, -1.844e-01, 3.635e-02, -3.648e-03, 1.702e-02, 1.019e-02, 1.025e-01, -1.095e-01, 4.961e-02, 3.802e-02)); + r += mul(s3_1, M4(-8.831e-02, 2.470e-02, -1.290e-02, 6.433e-02, 1.367e-01, 5.948e-02, -7.454e-03, -2.061e-01, 4.250e-03, -1.381e-02, -2.909e-03, -3.023e-02, -1.174e-02, -1.387e-02, 1.262e-01, -3.551e-02)); + r += mul(s3_2, M4(-1.020e-01, -2.204e-02, -1.008e-01, -5.846e-02, -3.360e-02, -5.542e-02, 9.575e-02, 4.696e-01, 6.233e-02, 1.315e-02, 1.965e-01, -1.491e-02, -1.792e-02, -5.658e-02, -1.228e-01, 1.385e-02)); + r += mul(s3_3, M4(-1.464e-01, 1.780e-02, -6.589e-03, 4.249e-02, -2.666e-01, -1.224e-01, 2.077e-01, -2.693e-01, -1.083e-01, 2.998e-03, -1.048e-01, -1.893e-02, 6.824e-02, -2.977e-02, 3.503e-02, -9.067e-02)); + r += mul(s3_4, M4(4.541e-02, 1.987e-02, 3.981e-02, 1.155e-01, 1.834e-02, -3.408e-01, 8.681e-02, 8.392e-02, -9.493e-04, -1.603e-02, -5.829e-02, -1.074e-01, 1.148e-01, -8.128e-02, 1.758e-01, 1.002e-01)); + r += mul(s3_5, M4(-8.241e-03, 1.119e-01, 1.522e-02, 6.100e-03, 2.799e-01, 6.308e-02, -2.371e-01, 5.814e-01, 1.264e-02, 1.048e-01, 1.182e-01, -1.407e-01, 4.045e-02, -8.033e-02, -7.350e-02, 1.101e-02)); + r += mul(s3_6, M4(-1.178e-01, 2.715e-02, -2.532e-02, 1.441e-01, 1.125e-01, 1.964e-02, -1.099e-01, 2.368e-01, -4.709e-02, -4.507e-02, -6.058e-02, 1.336e-01, -1.799e-02, -5.699e-02, -4.070e-02, -4.618e-02)); + r += mul(s3_7, M4(1.472e-02, 7.965e-02, 1.853e-01, 8.426e-02, -1.636e-01, 1.166e-02, -1.313e-01, -1.365e-01, -5.363e-02, -5.387e-02, -8.976e-02, -4.583e-03, 2.475e-02, 4.945e-02, 7.521e-02, -7.343e-02)); + r += mul(s3_8, M4(-4.064e-02, 2.779e-02, -1.238e-01, 2.416e-01, 1.142e-01, 1.864e-01, 3.874e-01, 2.042e-01, 1.807e-02, 4.914e-02, -3.000e-02, 1.741e-02, -2.914e-02, -3.022e-02, -6.543e-02, -2.672e-02)); + r += mul(s4_0, M4(9.304e-02, -6.264e-02, 9.383e-02, 1.634e-01, 1.372e-01, -2.039e-02, 1.033e-02, -5.786e-02, -6.631e-03, -7.443e-02, -6.661e-02, 2.310e-02, 1.424e-01, 3.788e-02, -1.264e-01, -4.219e-02)); + r += mul(s4_1, M4(1.216e-01, -2.118e-02, -1.199e-01, 4.403e-03, -2.567e-03, 2.012e-02, -2.615e-02, 4.259e-02, 3.099e-02, -1.118e-02, 1.342e-01, -2.927e-02, 1.122e-01, -6.252e-02, 1.628e-04, 5.354e-02)); + r += mul(s4_2, M4(7.041e-02, -2.867e-02, -6.862e-02, 1.254e-01, -1.607e-01, -1.539e-01, -1.603e-02, -6.348e-02, -7.181e-03, 1.102e-02, 2.390e-02, -5.249e-02, 2.245e-02, 2.943e-02, -1.301e-01, -7.982e-02)); + r += mul(s4_3, M4(-1.387e-01, 1.504e-02, 5.752e-02, 1.460e-01, 6.862e-02, -4.562e-02, 2.216e-02, -1.442e-01, -7.839e-02, 8.544e-02, -1.911e-02, 2.450e-01, -6.672e-02, -1.830e-01, 1.179e-01, -2.594e-02)); + r += mul(s4_4, M4(1.345e-02, -9.782e-04, 3.954e-02, -7.969e-02, 8.862e-02, 1.382e-01, -1.612e-01, -2.439e-01, -5.334e-02, 1.125e-01, -1.972e-02, -4.682e-02, -2.351e-01, 7.199e-02, 1.401e-01, 3.230e-01)); + r += mul(s4_5, M4(-5.918e-02, 2.463e-02, 1.006e-01, 1.020e-01, -1.814e-01, -2.376e-02, -3.208e-02, -9.613e-02, -9.487e-02, 2.239e-02, 1.853e-01, -8.625e-03, -1.745e-02, 3.099e-01, 3.099e-02, 4.514e-02)); + r += mul(s4_6, M4(-1.100e-01, 6.927e-02, -3.307e-03, 4.325e-02, 7.185e-02, -1.418e-01, 1.960e-02, -1.491e-01, -3.582e-02, 2.388e-03, -1.615e-02, -2.427e-02, -5.100e-02, -2.715e-02, 1.057e-01, 7.667e-02)); + r += mul(s4_7, M4(-1.088e-01, 3.447e-02, -8.186e-02, -1.929e-02, -1.827e-02, 4.351e-02, -1.521e-01, -3.296e-02, 6.372e-02, 4.873e-02, 6.193e-02, -3.363e-03, 3.941e-02, 2.499e-02, 1.494e-05, -2.036e-01)); + r += mul(s4_8, M4(-6.369e-02, -9.751e-02, -5.096e-02, 3.151e-02, 2.607e-03, -3.898e-02, 4.627e-02, -4.268e-02, 6.320e-02, -3.223e-02, 4.721e-02, 4.625e-02, -3.867e-02, 2.063e-01, -2.207e-02, 9.412e-02)); + r += mul(s5_0, M4(6.974e-02, 8.564e-02, 7.933e-02, 9.495e-02, 1.332e-02, 7.017e-02, 1.227e-01, 2.723e-02, -4.159e-02, -2.808e-02, -1.196e-01, -1.683e-01, 4.032e-02, 7.238e-02, -3.882e-02, -1.556e-03)); + r += mul(s5_1, M4(-3.493e-01, -3.536e-02, -2.793e-02, -5.408e-02, -3.388e-02, 7.883e-02, 8.640e-02, 2.626e-01, 2.461e-02, 5.804e-02, -1.028e-02, -2.498e-02, -5.312e-02, -2.278e-03, 7.602e-02, -2.814e-02)); + r += mul(s5_2, M4(-5.896e-02, -7.446e-02, 4.512e-02, -1.565e-02, -7.230e-02, 6.534e-02, -4.524e-02, 6.396e-02, -2.574e-02, 1.876e-01, -4.695e-02, -7.508e-02, 4.575e-02, 3.811e-02, 2.866e-02, -1.009e-01)); + r += mul(s5_3, M4(-1.961e-01, -2.216e-01, -1.780e-01, 8.053e-02, -6.757e-02, -1.014e-01, 8.794e-02, 1.344e-01, 3.602e-02, -2.847e-02, -9.301e-02, 1.179e-01, -4.238e-02, -1.468e-01, -6.555e-02, 1.076e-01)); + r += mul(s5_4, M4(1.393e-01, -1.116e-01, -7.653e-02, -4.183e-01, 1.063e-01, 1.543e-01, 2.485e-02, -1.206e-01, -8.073e-02, -1.115e-03, -2.209e-01, 9.112e-02, -1.151e-01, 8.174e-02, 8.418e-02, 4.526e-03)); + r += mul(s5_5, M4(1.294e-01, -9.347e-02, 4.701e-02, 6.548e-03, -1.788e-02, 2.933e-02, 4.442e-02, 1.193e-01, -1.264e-01, -6.081e-02, -6.942e-02, 4.344e-02, 8.834e-03, 3.778e-02, -4.672e-02, -5.692e-02)); + r += mul(s5_6, M4(-1.012e-01, 1.823e-01, -2.943e-01, 8.989e-02, 1.116e-01, -6.032e-02, 4.802e-02, 1.264e-01, -8.633e-02, -8.766e-02, -5.426e-02, -1.209e-01, -1.093e-01, -5.602e-02, 6.528e-02, -2.349e-03)); + r += mul(s5_7, M4(-1.343e-01, 2.034e-01, -2.338e-02, -3.787e-01, 8.539e-02, -7.340e-03, 8.520e-03, 2.321e-01, 1.384e-01, -3.985e-02, 1.855e-02, 3.639e-02, 3.894e-02, -7.443e-02, 2.595e-02, -8.674e-02)); + r += mul(s5_8, M4(1.689e-01, -2.342e-02, 2.393e-02, -1.950e-01, 6.529e-02, -6.319e-02, -7.799e-02, 1.220e-01, -6.824e-02, -1.041e-01, 2.629e-02, -8.307e-02, 1.752e-02, 6.461e-02, -3.246e-02, -6.551e-02)); + r += mul(s6_0, M4(1.200e-01, -3.222e-02, -7.397e-02, -8.474e-03, 8.909e-02, -2.369e-01, 8.842e-02, 5.556e-02, -1.596e-01, 1.205e-01, 9.819e-02, 7.308e-02, 1.404e-01, -6.079e-02, -4.573e-02, 5.620e-02)); + r += mul(s6_1, M4(1.630e-01, -1.440e-02, 8.108e-02, 1.382e-01, -7.006e-02, 8.254e-02, -1.172e-01, -1.031e-01, -1.038e-01, -5.618e-02, -9.967e-02, -5.119e-02, 8.641e-03, 1.343e-01, 2.280e-03, 5.211e-03)); + r += mul(s6_2, M4(-9.802e-03, 7.003e-02, -8.588e-02, -2.847e-02, 1.438e-01, 2.113e-01, 2.720e-01, -4.048e-02, -1.776e-02, -8.309e-02, -1.082e-01, 9.919e-02, 1.127e-01, 3.300e-02, 1.817e-02, 1.831e-02)); + r += mul(s6_3, M4(3.430e-02, 1.022e-01, -1.684e-02, -1.033e-01, 9.907e-03, 3.670e-02, 1.316e-01, -1.978e-01, 5.608e-02, 6.323e-03, 2.175e-02, 9.470e-03, 1.618e-01, -5.147e-02, 2.082e-02, -7.631e-03)); + r += mul(s6_4, M4(5.919e-02, 6.625e-02, -1.752e-01, -1.298e-02, -7.827e-04, -3.498e-02, -4.234e-02, -7.318e-02, 1.128e-01, -6.479e-02, 7.675e-03, -9.922e-02, -1.988e-01, -1.343e-01, -1.326e-02, 7.510e-02)); + r += mul(s6_5, M4(-1.705e-01, 7.369e-02, 8.016e-02, 1.041e-01, -1.254e-01, -2.403e-02, -1.032e-01, 7.417e-02, 1.379e-01, 1.247e-02, 1.053e-01, 7.891e-02, -1.324e-01, -6.220e-02, -5.934e-02, -1.184e-02)); + r += mul(s6_6, M4(3.798e-02, 3.235e-02, -8.631e-02, -8.324e-02, -2.662e-02, -1.828e-02, 8.318e-03, 1.571e-01, 7.448e-02, 3.965e-02, 1.034e-01, 5.027e-02, -2.221e-02, -4.772e-02, 1.205e-01, 8.987e-02)); + r += mul(s6_7, M4(7.982e-02, 8.061e-03, -1.110e-02, -5.908e-03, -1.598e-01, 2.922e-03, -6.329e-04, 1.107e-01, -6.714e-02, -5.439e-02, 6.170e-02, 7.335e-02, -1.515e-01, -4.121e-02, -4.943e-02, 6.217e-02)); + r += mul(s6_8, M4(2.163e-02, 4.998e-03, -8.032e-02, -1.288e-02, -3.356e-03, 1.042e-02, 9.992e-02, 2.381e-02, -1.914e-03, 7.537e-02, -1.247e-01, 5.745e-02, 2.516e-02, -1.156e-01, -1.405e-01, -8.950e-02)); + r += mul(s7_0, M4(-3.289e-02, 1.005e-01, -1.664e-01, 3.229e-02, -3.539e-02, 3.863e-02, 6.170e-02, 4.147e-02, -1.179e-01, 3.243e-02, 6.216e-02, 3.144e-01, 8.066e-02, 6.194e-02, 2.796e-02, -1.411e-01)); + r += mul(s7_1, M4(5.339e-02, -8.321e-02, -5.431e-02, 6.086e-02, 1.075e-02, -8.840e-03, -2.585e-02, 3.593e-02, -1.144e-01, 1.016e-01, 2.744e-02, -5.795e-02, 1.170e-01, 1.227e-01, 5.666e-02, -4.038e-02)); + r += mul(s7_2, M4(3.297e-02, 8.648e-02, -7.364e-02, 8.771e-02, 1.966e-02, -7.449e-02, -1.062e-01, -2.157e-02, -4.111e-03, -1.992e-01, 8.065e-02, 1.122e-02, 7.465e-02, 1.470e-01, 7.417e-03, 2.789e-02)); + r += mul(s7_3, M4(2.386e-02, 2.310e-01, -2.804e-01, -1.344e-01, -1.257e-01, 1.236e-01, 4.911e-02, -5.946e-02, 9.337e-02, 1.174e-02, -1.178e-01, -1.304e-01, 9.177e-02, -1.628e-02, -2.609e-02, -1.484e-01)); + r += mul(s7_4, M4(1.706e-01, 9.529e-02, -1.168e-01, 3.993e-01, 6.630e-02, -2.149e-02, 1.253e-02, 1.085e-01, 1.032e-01, 2.347e-01, -7.329e-02, 2.084e-01, -1.968e-01, -1.076e-01, -4.499e-02, 1.235e-01)); + r += mul(s7_5, M4(6.215e-02, -1.109e-01, 4.257e-02, -3.023e-02, -1.347e-01, -1.378e-02, 1.745e-02, -6.140e-02, -6.328e-02, -3.266e-02, 1.099e-02, -2.281e-01, -9.936e-02, 2.338e-02, -3.435e-02, 6.569e-02)); + r += mul(s7_6, M4(7.853e-02, -1.601e-01, -2.296e-01, 1.106e-02, -6.369e-02, -1.100e-02, 3.984e-02, 9.032e-03, -6.465e-03, -1.149e-01, -4.831e-02, 1.183e-01, 6.930e-02, -9.638e-02, -1.169e-01, -8.368e-02)); + r += mul(s7_7, M4(-9.578e-02, 5.014e-02, 1.226e-01, 5.544e-02, -9.871e-03, -5.196e-02, -3.061e-02, 5.372e-02, 1.728e-01, -4.305e-02, 1.110e-02, -9.630e-02, -2.940e-02, -5.671e-02, 4.415e-02, 7.129e-02)); + r += mul(s7_8, M4(2.522e-02, -1.403e-01, -6.496e-02, -1.193e-02, -1.643e-02, 1.158e-01, 1.042e-01, -1.039e-01, -7.068e-02, -6.970e-03, -9.279e-02, -1.022e-01, 5.406e-02, -1.954e-02, 4.493e-02, 2.320e-02)); + r += V4(1.686e-02, -1.796e-02, -1.824e-02, -3.183e-02); + return r; +} + +void Pass7(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = Rmp8x8(tid.x) + blockStart; + uint2 size = GetInputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = (gxy + 0.5) * pt; + + V4 s0_0 = l0(-1.0, -1.0); + V4 s0_1 = l0(0.0, -1.0); + V4 s0_2 = l0(1.0, -1.0); + V4 s0_3 = l0(-1.0, 0.0); + V4 s0_4 = l0(0.0, 0.0); + V4 s0_5 = l0(1.0, 0.0); + V4 s0_6 = l0(-1.0, 1.0); + V4 s0_7 = l0(0.0, 1.0); + V4 s0_8 = l0(1.0, 1.0); + V4 s1_0 = -max(-s0_0, 0.0); + V4 s1_1 = -max(-s0_1, 0.0); + V4 s1_2 = -max(-s0_2, 0.0); + V4 s1_3 = -max(-s0_3, 0.0); + V4 s1_4 = -max(-s0_4, 0.0); + V4 s1_5 = -max(-s0_5, 0.0); + V4 s1_6 = -max(-s0_6, 0.0); + V4 s1_7 = -max(-s0_7, 0.0); + V4 s1_8 = -max(-s0_8, 0.0); + s0_0 = max(s0_0, 0.0); + s0_1 = max(s0_1, 0.0); + s0_2 = max(s0_2, 0.0); + s0_3 = max(s0_3, 0.0); + s0_4 = max(s0_4, 0.0); + s0_5 = max(s0_5, 0.0); + s0_6 = max(s0_6, 0.0); + s0_7 = max(s0_7, 0.0); + s0_8 = max(s0_8, 0.0); + + V4 s2_0 = l1(-1.0, -1.0); + V4 s2_1 = l1(0.0, -1.0); + V4 s2_2 = l1(1.0, -1.0); + V4 s2_3 = l1(-1.0, 0.0); + V4 s2_4 = l1(0.0, 0.0); + V4 s2_5 = l1(1.0, 0.0); + V4 s2_6 = l1(-1.0, 1.0); + V4 s2_7 = l1(0.0, 1.0); + V4 s2_8 = l1(1.0, 1.0); + V4 s3_0 = -max(-s2_0, 0.0); + V4 s3_1 = -max(-s2_1, 0.0); + V4 s3_2 = -max(-s2_2, 0.0); + V4 s3_3 = -max(-s2_3, 0.0); + V4 s3_4 = -max(-s2_4, 0.0); + V4 s3_5 = -max(-s2_5, 0.0); + V4 s3_6 = -max(-s2_6, 0.0); + V4 s3_7 = -max(-s2_7, 0.0); + V4 s3_8 = -max(-s2_8, 0.0); + s2_0 = max(s2_0, 0.0); + s2_1 = max(s2_1, 0.0); + s2_2 = max(s2_2, 0.0); + s2_3 = max(s2_3, 0.0); + s2_4 = max(s2_4, 0.0); + s2_5 = max(s2_5, 0.0); + s2_6 = max(s2_6, 0.0); + s2_7 = max(s2_7, 0.0); + s2_8 = max(s2_8, 0.0); + + V4 s4_0 = l2(-1.0, -1.0); + V4 s4_1 = l2(0.0, -1.0); + V4 s4_2 = l2(1.0, -1.0); + V4 s4_3 = l2(-1.0, 0.0); + V4 s4_4 = l2(0.0, 0.0); + V4 s4_5 = l2(1.0, 0.0); + V4 s4_6 = l2(-1.0, 1.0); + V4 s4_7 = l2(0.0, 1.0); + V4 s4_8 = l2(1.0, 1.0); + V4 s5_0 = -max(-s4_0, 0.0); + V4 s5_1 = -max(-s4_1, 0.0); + V4 s5_2 = -max(-s4_2, 0.0); + V4 s5_3 = -max(-s4_3, 0.0); + V4 s5_4 = -max(-s4_4, 0.0); + V4 s5_5 = -max(-s4_5, 0.0); + V4 s5_6 = -max(-s4_6, 0.0); + V4 s5_7 = -max(-s4_7, 0.0); + V4 s5_8 = -max(-s4_8, 0.0); + s4_0 = max(s4_0, 0.0); + s4_1 = max(s4_1, 0.0); + s4_2 = max(s4_2, 0.0); + s4_3 = max(s4_3, 0.0); + s4_4 = max(s4_4, 0.0); + s4_5 = max(s4_5, 0.0); + s4_6 = max(s4_6, 0.0); + s4_7 = max(s4_7, 0.0); + s4_8 = max(s4_8, 0.0); + + V4 s6_0 = l3(-1.0, -1.0); + V4 s6_1 = l3(0.0, -1.0); + V4 s6_2 = l3(1.0, -1.0); + V4 s6_3 = l3(-1.0, 0.0); + V4 s6_4 = l3(0.0, 0.0); + V4 s6_5 = l3(1.0, 0.0); + V4 s6_6 = l3(-1.0, 1.0); + V4 s6_7 = l3(0.0, 1.0); + V4 s6_8 = l3(1.0, 1.0); + V4 s7_0 = -max(-s6_0, 0.0); + V4 s7_1 = -max(-s6_1, 0.0); + V4 s7_2 = -max(-s6_2, 0.0); + V4 s7_3 = -max(-s6_3, 0.0); + V4 s7_4 = -max(-s6_4, 0.0); + V4 s7_5 = -max(-s6_5, 0.0); + V4 s7_6 = -max(-s6_6, 0.0); + V4 s7_7 = -max(-s6_7, 0.0); + V4 s7_8 = -max(-s6_8, 0.0); + s6_0 = max(s6_0, 0.0); + s6_1 = max(s6_1, 0.0); + s6_2 = max(s6_2, 0.0); + s6_3 = max(s6_3, 0.0); + s6_4 = max(s6_4, 0.0); + s6_5 = max(s6_5, 0.0); + s6_6 = max(s6_6, 0.0); + s6_7 = max(s6_7, 0.0); + s6_8 = max(s6_8, 0.0); + + t0[gxy] = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t1[gxy] = f1(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t2[gxy] = f2(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t3[gxy] = f3(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); +} + +//!PASS 8 +//!DESC conv7 +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 +//!IN t0, t1, t2, t3 +//!OUT t4, t5, t6, t7 + +#define l0(x, y) V4(O(t0, float2(x, y))) +#define l1(x, y) V4(O(t1, float2(x, y))) +#define l2(x, y) V4(O(t2, float2(x, y))) +#define l3(x, y) V4(O(t3, float2(x, y))) + +V4 f0(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-1.094e-01, 6.562e-02, -6.635e-02, -1.664e-02, -1.806e-01, 2.640e-02, -1.701e-02, -5.263e-02, 7.153e-03, 3.917e-02, -1.463e-01, -2.494e-03, -7.370e-02, 5.850e-02, 3.016e-02, -2.480e-03)); + r += mul(s0_1, M4(-7.920e-02, -8.043e-03, -2.752e-01, -4.750e-02, 4.629e-03, 1.198e-02, 5.820e-02, 1.212e-01, -1.189e-01, -1.568e-02, -1.020e-01, -4.512e-02, 7.941e-02, 1.033e-01, -7.474e-02, 4.613e-02)); + r += mul(s0_2, M4(6.666e-03, -1.996e-01, 4.654e-02, 2.725e-02, 4.535e-03, 1.941e-02, -5.382e-02, -8.718e-03, -7.150e-02, 7.631e-02, 2.212e-03, -7.028e-03, 1.519e-02, -3.138e-02, -1.136e-01, 2.660e-02)); + r += mul(s0_3, M4(7.989e-02, 6.219e-02, 9.160e-02, -2.573e-04, 3.206e-02, -1.039e-01, 7.312e-02, 1.047e-01, 6.879e-02, 8.840e-02, -1.349e-01, -3.978e-03, 6.849e-03, 3.076e-02, -4.591e-02, 1.194e-01)); + r += mul(s0_4, M4(-4.859e-02, 8.254e-02, -1.963e-01, 1.308e-01, -1.704e-01, -4.744e-02, -5.579e-02, 8.055e-02, -5.632e-02, 9.476e-02, -6.365e-02, -7.092e-02, 1.192e-02, -1.031e-01, -2.293e-02, -8.946e-02)); + r += mul(s0_5, M4(-1.563e-01, -2.251e-01, -9.731e-02, 1.459e-02, -5.055e-02, 7.008e-03, -1.155e-01, 5.742e-02, -1.312e-01, 9.039e-03, 5.052e-02, -3.125e-02, -9.343e-02, 6.572e-03, -3.902e-02, -3.151e-03)); + r += mul(s0_6, M4(3.861e-02, -4.867e-02, -2.904e-02, 7.517e-02, -1.442e-02, -1.293e-01, 4.353e-02, 6.431e-03, -9.509e-03, -3.284e-02, -1.018e-01, -7.121e-02, 8.958e-02, -3.625e-02, 1.074e-02, -5.836e-02)); + r += mul(s0_7, M4(8.242e-02, 8.586e-02, -3.794e-03, 2.286e-01, 6.752e-02, 1.001e-01, 7.140e-02, 5.756e-02, 9.403e-03, -2.792e-02, 4.411e-02, 1.023e-01, 6.906e-02, -5.778e-02, -4.631e-02, -1.568e-01)); + r += mul(s0_8, M4(-1.261e-01, -1.466e-01, -2.753e-02, 1.525e-01, 2.462e-02, -1.988e-01, -1.876e-02, -4.975e-02, 8.446e-03, 1.146e-01, 1.661e-02, -2.526e-02, 7.944e-02, -4.065e-02, 1.104e-03, -1.452e-01)); + r += mul(s1_0, M4(-6.833e-02, -2.755e-02, 7.771e-02, -1.336e-02, 1.837e-02, 8.552e-02, 1.024e-01, -1.455e-01, -2.393e-01, 1.461e-01, 1.814e-02, -4.929e-02, -1.674e-01, -6.073e-02, 7.018e-02, -2.940e-02)); + r += mul(s1_1, M4(4.082e-03, 1.052e-01, 3.842e-03, -1.587e-01, 9.835e-02, 2.139e-02, 8.668e-02, 2.165e-02, -2.663e-02, 8.162e-02, -3.735e-02, -1.560e-02, -6.443e-02, -1.933e-01, -1.607e-01, 1.926e-01)); + r += mul(s1_2, M4(5.791e-02, -1.695e-02, 1.488e-02, -6.007e-02, -7.197e-02, -8.771e-02, -1.639e-02, 5.865e-02, -5.406e-02, 2.676e-02, -4.350e-02, -3.119e-02, 2.097e-02, 3.892e-02, 1.711e-02, 9.656e-03)); + r += mul(s1_3, M4(-2.595e-01, 5.729e-02, 9.107e-02, 1.011e-01, -2.027e-01, 9.770e-02, 8.845e-02, -5.835e-03, 9.669e-02, -7.060e-02, 2.229e-02, -1.412e-02, -5.990e-02, -1.414e-01, -7.674e-02, 2.120e-02)); + r += mul(s1_4, M4(-1.436e-02, 2.800e-01, 2.802e-02, 1.332e-01, -5.009e-02, 3.089e-02, 4.827e-02, -1.219e-01, 5.801e-02, 4.186e-01, -1.186e-02, -8.125e-02, 2.004e-01, -1.175e-02, 1.882e-01, -6.973e-02)); + r += mul(s1_5, M4(-7.152e-02, 9.121e-02, 3.823e-02, 5.854e-02, 1.238e-01, 8.679e-02, -5.175e-02, 4.602e-02, 3.259e-03, 2.433e-01, -6.799e-02, -1.315e-02, -1.607e-01, 1.049e-01, 1.580e-01, -1.395e-01)); + r += mul(s1_6, M4(-4.564e-02, -9.812e-02, 2.360e-02, 7.224e-02, -1.049e-01, 7.822e-02, 1.828e-01, -6.342e-02, -2.681e-01, 3.954e-02, -1.436e-01, -9.720e-03, 8.550e-02, -2.766e-06, 1.479e-02, 3.158e-03)); + r += mul(s1_7, M4(2.409e-02, 1.690e-01, -1.089e-02, 4.386e-02, -3.649e-02, -4.483e-02, 5.605e-02, -9.339e-02, 2.634e-01, 3.361e-02, -1.892e-01, 1.432e-01, 1.738e-01, -8.852e-02, -4.950e-02, 2.896e-02)); + r += mul(s1_8, M4(8.637e-02, 6.159e-02, -3.538e-02, -7.172e-03, 1.321e-01, 1.411e-01, 4.990e-03, -7.475e-02, -1.335e-02, -4.698e-02, -6.161e-02, 5.824e-02, 2.177e-01, 2.154e-01, 5.215e-02, -7.138e-02)); + r += mul(s2_0, M4(2.174e-01, 4.123e-02, -8.292e-02, -5.252e-02, 7.025e-02, -9.466e-03, -5.904e-02, -5.454e-02, 6.876e-02, -9.031e-02, 5.278e-02, 6.207e-02, 5.541e-02, 6.821e-02, -9.390e-02, 9.013e-02)); + r += mul(s2_1, M4(-9.286e-02, 9.109e-05, 1.541e-01, -1.452e-01, -5.603e-02, 1.127e-01, 1.113e-02, -1.623e-01, -1.885e-02, -5.289e-02, 1.681e-02, 4.134e-02, -7.683e-03, 2.098e-01, 1.892e-01, 7.369e-02)); + r += mul(s2_2, M4(-1.571e-01, -5.388e-02, -1.203e-02, -1.810e-01, -4.085e-02, -7.166e-02, -3.599e-02, -4.272e-02, -5.114e-02, -5.852e-03, -4.504e-02, 2.492e-02, 6.584e-02, 5.583e-02, 3.093e-02, -8.858e-02)); + r += mul(s2_3, M4(2.666e-01, -4.169e-02, 1.900e-01, 5.311e-02, -2.534e-02, 1.372e-01, -5.283e-02, -4.175e-02, -1.966e-01, 8.141e-02, 7.509e-02, 2.269e-02, 1.992e-01, 1.056e-01, 1.450e-01, -2.845e-01)); + r += mul(s2_4, M4(-1.957e-01, 6.279e-02, 1.413e-01, -4.627e-02, 5.501e-02, 4.127e-02, -2.825e-03, -7.130e-02, -4.654e-02, -6.061e-02, -1.728e-02, 1.095e-01, -8.350e-02, -8.155e-02, -2.309e-02, 1.007e-01)); + r += mul(s2_5, M4(2.874e-02, -1.179e-02, 2.625e-01, -1.289e-01, -5.714e-02, -1.313e-01, -9.355e-02, 7.594e-02, 1.294e-01, 1.140e-01, -7.714e-02, 1.368e-01, -4.774e-02, -8.704e-02, -3.935e-02, -6.379e-03)); + r += mul(s2_6, M4(2.177e-01, 4.111e-02, -2.230e-01, -2.031e-02, -1.858e-02, 2.777e-02, 8.506e-04, 5.563e-02, 1.100e-02, 1.980e-02, 3.650e-02, 6.127e-02, -9.054e-02, 1.709e-01, -8.951e-02, -5.801e-02)); + r += mul(s2_7, M4(1.400e-01, 4.955e-02, -9.260e-02, 7.465e-02, -1.298e-02, 6.411e-02, 9.795e-02, 9.944e-02, 5.240e-02, 2.981e-02, 3.059e-02, -9.015e-02, -2.287e-02, -2.969e-02, 1.617e-01, -4.204e-02)); + r += mul(s2_8, M4(-1.400e-01, -1.179e-01, -1.857e-02, 1.462e-01, -2.608e-02, -1.977e-02, 2.275e-02, 5.050e-04, 2.683e-02, -4.022e-02, 1.758e-03, 2.148e-02, 1.991e-01, -4.555e-02, -6.202e-03, -3.282e-02)); + r += mul(s3_0, M4(4.792e-02, 2.772e-02, -4.696e-02, -9.907e-03, 3.481e-02, -1.944e-01, -1.612e-01, 4.374e-02, -1.935e-01, 1.306e-01, -6.511e-02, 6.717e-02, 4.647e-02, 1.421e-01, -6.739e-02, 6.141e-02)); + r += mul(s3_1, M4(-1.762e-01, 3.426e-02, 2.946e-02, -2.496e-02, 7.081e-02, -5.038e-02, -6.860e-02, 1.665e-01, -4.061e-02, -9.788e-03, 7.561e-02, 1.779e-01, -4.286e-02, -8.701e-03, -1.064e-02, -1.274e-01)); + r += mul(s3_2, M4(5.357e-02, 3.849e-03, 4.175e-02, 3.995e-02, 9.148e-02, 8.457e-02, -7.468e-03, -4.689e-02, -1.287e-01, 6.958e-02, -6.353e-02, -1.477e-01, -1.527e-02, -8.207e-02, 3.981e-02, 2.494e-02)); + r += mul(s3_3, M4(-1.686e-01, -3.953e-02, -3.361e-02, 2.511e-02, -3.888e-01, -1.431e-01, -9.050e-03, 2.181e-01, -1.614e-01, -1.381e-01, 1.600e-01, 9.912e-02, 2.128e-02, 3.555e-02, 4.428e-02, -1.076e-01)); + r += mul(s3_4, M4(-6.739e-02, 4.936e-02, 1.614e-02, 3.981e-02, -1.361e-01, 1.175e-01, 2.878e-02, 6.779e-02, 6.161e-02, -1.996e-01, 1.353e-01, -2.633e-02, -6.449e-02, -9.670e-02, -1.103e-01, 2.391e-02)); + r += mul(s3_5, M4(-5.152e-02, -2.634e-02, 5.286e-02, -3.503e-02, -1.304e-01, -1.028e-01, -9.635e-02, -3.594e-02, -4.392e-02, 7.375e-02, -1.322e-01, -4.372e-02, -1.225e-01, -1.920e-01, -1.833e-01, 1.163e-01)); + r += mul(s3_6, M4(2.130e-02, -1.053e-01, -1.098e-01, -3.188e-02, 2.582e-02, 6.738e-02, -3.954e-02, 4.855e-02, 1.174e-02, -1.605e-02, 5.528e-02, -1.552e-01, 3.938e-04, 6.833e-02, -1.971e-03, -1.657e-02)); + r += mul(s3_7, M4(9.644e-02, -5.851e-02, 9.306e-02, -2.021e-02, -8.492e-02, 1.645e-01, 6.027e-02, 1.179e-01, 1.247e-03, 7.693e-02, 1.392e-01, 2.644e-02, 5.708e-02, 8.585e-02, -1.024e-02, -9.170e-02)); + r += mul(s3_8, M4(-6.458e-02, -1.116e-01, 1.344e-02, -3.360e-03, -4.397e-02, -9.242e-02, -1.821e-01, 9.750e-02, -1.151e-01, 2.338e-02, 2.907e-02, 6.785e-02, 1.321e-01, -2.873e-03, 2.923e-02, -3.002e-02)); + r += mul(s4_0, M4(-3.549e-03, 6.322e-02, 2.612e-02, -5.727e-02, -2.213e-02, -4.023e-02, 1.537e-01, -8.374e-02, -1.378e-01, -1.213e-02, 1.032e-01, 1.619e-01, -4.502e-02, -3.248e-02, 9.939e-02, -1.793e-02)); + r += mul(s4_1, M4(-1.140e-01, -8.592e-02, -1.221e-02, 3.357e-02, -1.243e-01, -3.610e-02, 3.100e-02, 1.831e-01, 6.935e-02, 1.819e-01, -5.356e-02, 1.049e-03, 1.013e-01, -2.999e-02, 1.002e-01, 8.481e-02)); + r += mul(s4_2, M4(-5.074e-02, -3.137e-02, -3.769e-04, -3.506e-02, 1.469e-01, 1.220e-01, -2.581e-02, 4.897e-02, -1.507e-01, -1.310e-01, 1.399e-01, 2.146e-04, 3.223e-02, -1.708e-01, 1.749e-02, 8.381e-02)); + r += mul(s4_3, M4(-5.579e-02, -7.501e-02, -7.396e-02, -4.601e-02, -2.077e-01, -1.652e-01, 4.609e-02, -6.161e-02, 1.811e-01, -1.606e-01, 8.042e-02, 1.432e-02, 2.420e-02, 1.674e-01, -2.385e-01, 3.584e-02)); + r += mul(s4_4, M4(-6.357e-02, -5.652e-02, -1.085e-01, -3.533e-02, -1.473e-01, -6.429e-02, 1.168e-01, 4.730e-02, 1.236e-01, 1.275e-02, 1.529e-01, 1.793e-01, 9.834e-02, 9.068e-02, 1.846e-02, 1.012e-01)); + r += mul(s4_5, M4(-3.437e-02, -2.088e-02, 1.614e-02, 4.094e-02, -3.318e-02, 6.311e-02, 3.066e-02, 1.211e-01, -4.561e-01, 2.340e-01, 2.849e-01, -2.053e-02, 9.824e-03, 1.057e-01, 5.524e-02, 1.544e-01)); + r += mul(s4_6, M4(5.406e-02, -5.447e-02, 6.346e-02, -9.657e-02, -7.456e-02, 1.372e-01, 9.634e-02, 1.778e-02, 7.337e-02, 1.822e-01, -2.336e-01, -1.964e-01, 8.473e-03, 5.990e-02, -7.229e-02, 3.078e-02)); + r += mul(s4_7, M4(-7.364e-02, 9.612e-03, 1.151e-01, -4.973e-02, 6.506e-02, -5.687e-02, 1.550e-02, -8.652e-02, 2.556e-01, -1.941e-01, 9.252e-02, -1.199e-01, 1.270e-01, -9.150e-03, 5.799e-02, 4.810e-02)); + r += mul(s4_8, M4(-1.076e-02, 8.242e-03, 3.017e-02, -3.253e-02, -1.396e-02, 6.635e-02, -2.149e-02, -3.102e-04, -4.295e-01, 1.726e-01, -1.077e-01, -8.705e-02, 1.395e-01, -4.076e-03, 3.286e-03, -3.146e-02)); + r += mul(s5_0, M4(-2.396e-01, 1.979e-01, 2.413e-01, -4.524e-02, 8.260e-03, -5.002e-02, 5.122e-02, 5.775e-02, 3.915e-04, -1.085e-01, 1.610e-01, -7.457e-02, -8.283e-02, -1.344e-01, 2.998e-02, 1.015e-01)); + r += mul(s5_1, M4(1.838e-01, -1.508e-01, 3.490e-02, -6.098e-02, -1.108e-01, 7.571e-02, -2.342e-01, 1.749e-02, -5.878e-02, -8.278e-03, -1.278e-01, -4.971e-04, -1.599e-02, -9.004e-02, -1.931e-02, -3.202e-02)); + r += mul(s5_2, M4(-5.693e-02, -3.888e-02, 6.823e-02, -8.981e-02, -4.565e-02, -4.465e-03, -8.576e-02, 7.549e-02, 4.481e-02, 8.552e-02, 1.471e-02, 2.529e-03, -7.205e-02, 3.349e-02, -7.793e-02, -3.257e-03)); + r += mul(s5_3, M4(-2.139e-01, 1.130e-01, -2.518e-03, -2.936e-02, 9.204e-02, -6.996e-02, -6.080e-02, 4.065e-02, 9.765e-03, -5.972e-02, -1.922e-02, -7.230e-02, -1.372e-01, 1.099e-01, -9.439e-03, -1.574e-01)); + r += mul(s5_4, M4(3.184e-01, -9.080e-02, -8.721e-02, 1.063e-01, 8.019e-02, 1.045e-01, 5.305e-02, 3.222e-02, -2.309e-02, -3.510e-02, 5.475e-02, 6.860e-03, -2.792e-02, -4.265e-02, 7.462e-02, -1.000e-01)); + r += mul(s5_5, M4(1.510e-01, 9.356e-02, 9.770e-02, 8.079e-02, -2.077e-02, -3.420e-03, 5.702e-02, -9.642e-02, -3.297e-02, 4.951e-02, 1.024e-02, 1.284e-02, -9.640e-02, 1.576e-01, 5.242e-02, -9.510e-02)); + r += mul(s5_6, M4(-1.131e-01, -5.611e-03, 1.260e-01, -6.498e-02, 5.024e-02, -3.976e-02, -9.643e-02, 6.266e-02, -1.811e-02, 2.216e-02, -5.924e-02, -9.393e-02, -7.965e-02, -8.372e-02, 1.139e-01, 1.632e-02)); + r += mul(s5_7, M4(1.830e-01, -1.842e-01, -8.532e-03, 1.438e-01, -2.825e-02, -8.659e-02, 1.932e-02, 2.102e-02, 1.315e-01, -5.124e-03, 1.882e-02, -5.826e-03, -8.456e-03, 8.750e-02, 8.762e-02, 2.405e-02)); + r += mul(s5_8, M4(3.706e-02, 1.210e-01, -2.112e-02, 3.086e-02, -4.797e-02, -1.435e-02, -3.086e-02, 6.154e-02, 7.946e-03, -1.777e-02, -5.891e-02, 8.237e-02, -1.340e-02, 7.156e-02, 7.066e-02, 2.263e-02)); + r += mul(s6_0, M4(-1.527e-01, -2.308e-02, 1.031e-01, -9.168e-02, 2.770e-02, 4.815e-02, -9.231e-02, -2.969e-02, -1.034e-01, -1.003e-01, -1.571e-01, 8.946e-02, -7.229e-02, 2.558e-02, -1.862e-02, -2.815e-03)); + r += mul(s6_1, M4(3.370e-04, 1.161e-01, 7.904e-03, 5.765e-03, -1.190e-01, 4.035e-03, 1.496e-01, -1.210e-01, -1.030e-01, 2.940e-01, -2.090e-01, 1.547e-01, 3.627e-02, 1.232e-02, 8.922e-02, 5.802e-03)); + r += mul(s6_2, M4(-6.811e-02, 1.911e-02, 1.301e-01, -2.034e-02, -1.718e-02, -8.416e-02, -3.227e-02, 1.555e-02, -6.753e-02, 1.002e-01, -1.419e-01, 4.822e-02, -3.553e-02, -6.993e-03, -2.976e-02, 5.075e-02)); + r += mul(s6_3, M4(1.028e-01, -9.826e-02, -2.043e-02, -4.282e-02, -1.015e-02, 5.062e-02, -7.217e-02, -6.270e-02, 2.555e-01, 1.865e-04, 4.284e-02, 3.526e-02, 1.324e-01, 1.001e-01, 7.429e-02, -1.082e-01)); + r += mul(s6_4, M4(9.982e-02, 8.600e-02, 5.599e-02, 1.019e-01, -1.997e-01, 2.329e-02, 9.757e-02, -9.782e-02, -9.100e-02, 5.542e-03, 8.590e-02, 1.341e-01, 6.680e-02, 1.142e-01, -3.108e-02, 1.664e-02)); + r += mul(s6_5, M4(5.982e-02, -6.894e-02, 1.043e-02, 7.815e-02, -2.898e-02, -1.015e-01, 8.456e-02, -2.549e-02, -1.887e-01, 3.432e-02, -2.346e-01, -1.983e-01, 2.210e-02, -5.568e-02, -1.398e-02, -6.344e-03)); + r += mul(s6_6, M4(1.528e-01, -2.713e-02, 1.025e-01, 2.460e-02, -1.941e-01, -8.926e-02, -6.091e-02, 3.426e-02, 1.105e-01, 1.129e-03, 1.461e-02, 7.950e-03, -1.082e-01, -5.553e-02, -7.231e-02, 3.168e-02)); + r += mul(s6_7, M4(1.582e-01, 5.038e-02, 1.620e-01, 4.924e-02, 1.917e-01, 1.978e-01, 1.543e-01, 4.565e-02, 7.157e-02, -2.466e-02, 2.363e-01, 1.268e-01, 3.259e-02, -1.481e-02, 5.469e-03, -1.927e-02)); + r += mul(s6_8, M4(-3.274e-02, 9.584e-02, 7.582e-02, 3.171e-02, 1.340e-02, 3.428e-02, 1.861e-02, 8.205e-04, -1.479e-01, -7.486e-02, 6.135e-02, -2.173e-01, 8.072e-02, 1.614e-02, 7.643e-02, 7.684e-02)); + r += mul(s7_0, M4(-3.495e-03, -7.745e-02, 1.208e-01, -5.674e-02, -2.190e-02, -5.537e-03, -7.982e-02, -5.191e-02, -1.259e-01, 2.270e-02, -2.604e-02, 4.138e-02, -2.793e-02, 3.706e-02, -7.213e-03, -1.064e-01)); + r += mul(s7_1, M4(1.135e-01, -1.115e-02, 5.197e-02, -6.151e-02, -5.704e-02, 2.382e-02, -1.556e-03, -7.628e-02, 4.024e-02, 1.051e-01, -1.004e-02, 3.111e-02, -9.817e-02, 5.772e-02, 7.609e-02, -6.089e-02)); + r += mul(s7_2, M4(-4.865e-03, 1.303e-01, -1.522e-02, 7.056e-02, 1.393e-01, 4.428e-02, -8.566e-02, 7.840e-02, -8.433e-02, -1.209e-02, -4.745e-02, -1.311e-01, 9.661e-02, 3.457e-02, 2.445e-02, 1.207e-01)); + r += mul(s7_3, M4(-4.056e-02, 1.168e-02, -3.411e-02, -3.930e-02, -2.268e-01, 2.466e-03, -1.287e-01, -2.696e-02, 1.901e-02, 2.281e-02, 1.648e-01, -1.948e-02, -3.647e-02, -5.890e-02, 2.151e-02, 1.851e-02)); + r += mul(s7_4, M4(1.090e-01, 4.344e-02, 9.973e-02, 5.995e-02, -9.834e-02, 4.627e-02, 1.579e-02, -4.333e-02, -4.674e-02, 6.055e-02, 1.179e-01, 1.393e-01, -2.063e-01, -7.704e-02, -5.538e-02, 9.934e-02)); + r += mul(s7_5, M4(1.671e-01, -5.808e-02, 1.099e-02, 3.928e-02, -5.584e-03, -9.890e-02, 3.165e-02, 3.469e-02, 1.424e-01, 6.162e-02, 8.217e-03, -1.903e-02, 5.581e-02, -4.533e-02, -1.257e-01, -4.698e-02)); + r += mul(s7_6, M4(-1.862e-02, -1.673e-02, 8.471e-02, 4.346e-02, -2.911e-03, -7.640e-02, -1.346e-02, 1.239e-01, 1.030e-01, -3.699e-02, 2.548e-02, -3.951e-02, -7.803e-02, -6.745e-02, 2.174e-01, 1.784e-01)); + r += mul(s7_7, M4(5.429e-02, -3.890e-02, -3.193e-02, 1.398e-01, -3.613e-02, -4.545e-03, 1.747e-01, -3.892e-02, -7.894e-03, 8.938e-02, -6.410e-02, 9.848e-02, 2.122e-04, -1.926e-02, 1.200e-01, -3.913e-02)); + r += mul(s7_8, M4(9.066e-02, 1.003e-01, 8.942e-02, 2.592e-02, 7.945e-02, 6.145e-02, -3.691e-02, -3.155e-02, 6.701e-02, 6.215e-02, 1.511e-02, 7.923e-02, -1.016e-01, -5.384e-02, 1.000e-01, -9.423e-02)); + r += V4(-1.138e-02, 2.464e-02, 4.285e-02, 3.644e-02); + return r; +} + +V4 f1(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(1.729e-03, -2.254e-02, -1.744e-01, -9.125e-02, 2.046e-02, 2.762e-02, 5.534e-02, -1.482e-03, -8.561e-02, -3.427e-02, -2.666e-02, -8.006e-02, 8.221e-02, -9.192e-02, -1.170e-02, -1.189e-02)); + r += mul(s0_1, M4(-1.153e-01, -3.245e-02, 1.439e-02, -5.300e-02, 9.817e-03, -4.178e-02, -5.941e-02, -2.114e-02, -1.534e-01, -1.211e-01, 1.250e-01, -3.088e-02, -7.634e-02, 5.608e-02, -9.212e-02, 3.649e-02)); + r += mul(s0_2, M4(7.142e-02, -7.284e-02, 1.252e-01, -6.431e-02, -2.975e-02, 1.125e-03, 5.923e-02, -3.391e-03, -1.135e-01, 7.447e-03, 2.585e-02, -8.507e-02, 2.353e-02, -3.786e-02, 2.699e-03, -5.200e-02)); + r += mul(s0_3, M4(6.371e-02, 6.001e-02, -9.614e-02, -2.696e-02, -5.555e-02, -7.743e-02, -1.671e-02, 3.010e-02, -7.935e-02, 8.815e-02, -2.964e-02, 3.666e-02, -6.476e-03, 1.233e-01, -5.623e-02, -1.599e-02)); + r += mul(s0_4, M4(-3.674e-02, -3.006e-01, 2.545e-01, 5.876e-02, -6.356e-02, 8.586e-02, -1.498e-02, -2.176e-02, -9.812e-02, -1.406e-01, 6.643e-02, -1.857e-01, -3.230e-02, 1.400e-01, 2.269e-01, 1.178e-01)); + r += mul(s0_5, M4(2.677e-02, -2.124e-01, -1.017e-01, 1.325e-01, 1.358e-02, -6.512e-02, -1.187e-01, 1.181e-02, -3.256e-02, -3.551e-02, -2.776e-02, 7.520e-02, -6.454e-02, -1.606e-01, -9.878e-02, -1.435e-02)); + r += mul(s0_6, M4(-4.028e-02, -4.131e-03, 3.061e-02, 3.977e-02, -2.998e-02, -8.966e-02, 1.969e-01, 2.158e-02, -7.177e-02, 3.715e-02, 4.213e-02, -6.517e-02, -3.402e-02, -1.920e-02, 9.819e-03, -3.927e-02)); + r += mul(s0_7, M4(6.645e-02, 2.757e-02, -4.598e-02, 9.114e-02, -6.951e-02, -2.374e-02, 8.852e-03, -1.130e-01, -8.206e-02, 3.982e-03, 4.484e-02, -3.798e-02, 7.936e-02, -9.804e-03, 5.960e-02, -8.859e-02)); + r += mul(s0_8, M4(-5.545e-02, 8.134e-02, 5.924e-02, 9.790e-02, -6.810e-02, -1.845e-02, 7.648e-02, -5.781e-02, 2.050e-02, 6.863e-02, 1.100e-01, 1.235e-01, 3.950e-02, -3.621e-02, -7.890e-02, 1.882e-02)); + r += mul(s1_0, M4(6.511e-02, 8.445e-03, -1.497e-01, 6.653e-02, 1.452e-01, 1.195e-01, 5.411e-02, -1.902e-02, 1.324e-01, 4.688e-02, 6.516e-03, -5.909e-02, 1.871e-01, -1.824e-02, 1.369e-01, -6.272e-02)); + r += mul(s1_1, M4(8.474e-02, -6.450e-02, 9.576e-02, 1.412e-01, 3.813e-02, -4.383e-02, 7.060e-03, 1.103e-01, -3.901e-03, -1.998e-01, 1.009e-01, 8.163e-02, -1.379e-01, -1.609e-01, 4.879e-02, 7.951e-02)); + r += mul(s1_2, M4(7.465e-02, 4.864e-02, 1.110e-01, -1.301e-02, -1.781e-03, 5.838e-02, 6.237e-03, 5.422e-02, -3.923e-02, 3.430e-02, 1.450e-01, -1.343e-01, -1.255e-01, 5.629e-02, 3.434e-02, -4.666e-02)); + r += mul(s1_3, M4(-1.247e-01, -7.170e-03, -1.318e-01, -4.028e-02, 1.527e-01, -8.669e-03, -1.660e-02, -1.115e-01, 3.093e-02, -3.498e-02, -1.031e-01, 1.345e-01, -2.094e-02, 1.080e-01, 9.520e-02, 3.174e-02)); + r += mul(s1_4, M4(1.960e-02, -2.152e-01, -5.272e-02, -5.503e-03, -8.628e-02, 1.454e-01, -4.903e-02, -1.123e-02, -1.059e-01, -3.930e-01, 5.321e-02, -1.420e-01, 5.778e-02, 1.822e-01, 2.204e-01, 9.447e-02)); + r += mul(s1_5, M4(-1.345e-02, 8.841e-02, -4.786e-02, 4.486e-02, 5.109e-02, 2.087e-02, -1.878e-01, -4.448e-02, -8.064e-03, 8.815e-02, -3.612e-01, 2.870e-02, 1.136e-01, -5.213e-02, -3.119e-03, -1.653e-01)); + r += mul(s1_6, M4(-1.411e-01, -3.511e-02, -8.128e-02, 2.965e-03, -5.781e-02, -1.920e-02, 2.130e-02, -9.284e-02, 1.356e-01, -1.645e-02, -6.429e-02, -2.718e-02, 2.786e-02, 9.168e-02, -1.069e-01, 1.189e-02)); + r += mul(s1_7, M4(-1.228e-01, 3.885e-02, -9.280e-02, 2.120e-02, -6.863e-02, 5.108e-02, 6.707e-03, 1.515e-03, 6.154e-02, -5.704e-02, 1.902e-01, -5.617e-02, -6.916e-03, 4.455e-03, -1.171e-01, 8.232e-02)); + r += mul(s1_8, M4(6.637e-02, 3.427e-02, -2.434e-03, -5.802e-03, -1.092e-01, 5.008e-02, -8.846e-02, -9.690e-02, -4.769e-02, 1.564e-01, -1.072e-02, 6.166e-02, 1.037e-03, 1.656e-01, -6.777e-02, 1.529e-01)); + r += mul(s2_0, M4(-8.657e-02, -1.683e-01, -8.438e-02, -1.262e-02, 4.213e-02, 4.478e-02, -2.364e-02, 4.354e-02, -1.705e-02, 1.555e-02, 1.303e-02, 3.047e-02, 1.144e-02, 1.014e-02, 7.722e-02, 2.513e-02)); + r += mul(s2_1, M4(-6.315e-03, 1.265e-01, -1.380e-01, 7.690e-03, 3.008e-03, -1.853e-02, 1.512e-02, 1.030e-01, -1.156e-01, -2.136e-02, 4.247e-02, 2.354e-02, -1.225e-01, 4.783e-02, -3.002e-02, -8.387e-02)); + r += mul(s2_2, M4(9.205e-03, -1.489e-01, 1.314e-01, 7.084e-02, -3.115e-02, -3.416e-02, -6.130e-02, -3.573e-03, -4.312e-02, -5.232e-03, -7.607e-02, -3.608e-02, -5.017e-02, 7.033e-02, -6.234e-02, 5.745e-02)); + r += mul(s2_3, M4(-2.089e-02, -5.410e-02, -8.417e-02, 1.406e-01, -2.626e-02, 7.849e-02, 5.396e-02, -2.270e-02, 5.093e-02, -6.051e-02, 7.279e-02, -6.783e-02, -5.295e-02, -9.793e-02, -9.941e-02, -2.618e-02)); + r += mul(s2_4, M4(4.010e-02, 9.791e-02, 1.034e-01, 4.750e-02, 2.232e-02, 1.779e-01, 8.533e-02, 4.675e-02, 3.716e-02, -1.273e-02, -6.090e-02, 2.041e-02, 6.300e-02, 1.023e-01, -5.345e-02, -2.280e-02)); + r += mul(s2_5, M4(1.838e-01, -1.282e-02, -1.857e-01, 4.965e-02, 4.660e-02, -8.981e-02, 4.691e-02, 7.740e-03, 4.574e-02, -6.827e-02, 6.828e-03, -5.449e-02, -4.020e-02, -6.164e-02, 3.373e-01, 2.602e-03)); + r += mul(s2_6, M4(1.133e-02, -7.793e-02, 8.614e-02, 2.504e-02, 1.168e-02, -5.753e-02, 9.968e-02, -1.020e-01, -8.425e-02, -1.568e-02, 1.029e-01, -2.861e-02, 1.748e-02, 1.094e-01, 1.656e-01, -1.022e-02)); + r += mul(s2_7, M4(-7.059e-02, -2.138e-02, -8.280e-02, -5.897e-02, 5.956e-02, -9.888e-02, -2.802e-02, -1.706e-02, -1.351e-01, 1.230e-01, 7.644e-03, -1.443e-02, 1.220e-01, -2.055e-01, -1.977e-02, 2.979e-02)); + r += mul(s2_8, M4(5.847e-02, -1.408e-01, 1.266e-01, -6.190e-03, 1.284e-01, -1.300e-03, 8.179e-02, -9.440e-02, -7.300e-03, -9.068e-02, 8.197e-02, -1.620e-01, 2.682e-01, -8.393e-02, -1.648e-01, -7.976e-02)); + r += mul(s3_0, M4(-4.442e-02, -1.199e-02, 2.013e-02, -3.906e-02, 1.005e-01, -3.356e-02, -2.241e-01, -2.535e-02, -1.345e-02, -1.797e-02, -4.521e-02, 8.524e-02, 5.123e-02, 2.131e-02, -4.011e-02, 5.759e-02)); + r += mul(s3_1, M4(-3.284e-02, 8.050e-02, -2.653e-02, 3.487e-03, 3.558e-02, -6.469e-02, -6.312e-02, 1.345e-01, -1.509e-01, 9.212e-02, 5.070e-02, -1.091e-01, 4.122e-02, -1.963e-02, -7.931e-02, 4.906e-03)); + r += mul(s3_2, M4(-1.307e-02, 3.662e-02, -3.480e-02, -5.718e-02, -4.032e-02, 2.256e-02, 2.065e-01, 6.587e-02, 4.812e-04, 9.005e-02, -1.605e-01, -1.074e-01, 1.466e-01, -2.251e-02, 2.198e-02, -2.744e-02)); + r += mul(s3_3, M4(2.438e-02, -2.521e-02, -2.428e-02, 3.919e-02, 2.668e-01, 9.647e-02, 2.685e-01, -7.129e-02, -1.831e-01, -8.313e-02, 4.906e-02, 2.703e-02, -1.305e-01, 1.368e-02, -5.768e-02, 2.027e-03)); + r += mul(s3_4, M4(5.094e-02, 1.714e-02, 1.254e-01, -5.990e-02, -8.004e-02, 1.239e-01, -1.881e-01, -2.966e-02, -7.121e-02, -1.130e-01, -6.533e-02, 4.745e-02, -1.690e-01, -5.414e-02, -3.060e-02, -2.106e-02)); + r += mul(s3_5, M4(-8.028e-02, 8.060e-02, 5.008e-02, 8.212e-02, 3.428e-02, 3.296e-02, 9.783e-02, -1.039e-01, 8.464e-02, 1.349e-01, -1.113e-01, 5.679e-02, -3.802e-03, 8.044e-03, 4.043e-03, 8.317e-02)); + r += mul(s3_6, M4(3.431e-02, 3.496e-02, 7.038e-02, -3.111e-02, 4.533e-02, -7.965e-02, -9.517e-02, 3.298e-02, -1.059e-01, 2.824e-02, 1.665e-02, -1.818e-02, -6.589e-02, 1.536e-01, -4.950e-02, -4.898e-02)); + r += mul(s3_7, M4(4.211e-02, -4.371e-02, -3.204e-03, -2.210e-02, -1.089e-01, -2.018e-01, 1.237e-01, -5.726e-02, 2.136e-01, -8.615e-02, -5.962e-02, -6.428e-02, -2.377e-04, -6.213e-02, -1.395e-01, -6.767e-02)); + r += mul(s3_8, M4(3.999e-02, -7.282e-03, 2.643e-02, -6.319e-02, 4.068e-02, 1.332e-01, 1.258e-01, -3.770e-02, 7.424e-03, 2.775e-02, 1.428e-01, -1.009e-01, 1.093e-01, 4.892e-02, -4.967e-02, -3.466e-02)); + r += mul(s4_0, M4(8.501e-02, 3.383e-02, -5.774e-02, 5.613e-02, -1.644e-01, 6.198e-02, 1.756e-01, 2.447e-02, -3.727e-02, -1.792e-02, -5.936e-03, -1.228e-01, 4.292e-03, -7.566e-02, 1.219e-01, 8.670e-02)); + r += mul(s4_1, M4(-5.112e-02, -2.118e-02, -4.575e-02, -3.103e-02, -4.089e-02, 2.808e-02, -6.258e-02, -1.398e-03, -1.654e-01, 5.027e-02, 9.681e-03, 3.003e-02, 2.430e-01, -6.095e-02, -1.100e-01, 8.279e-02)); + r += mul(s4_2, M4(-1.179e-02, -1.193e-02, -2.892e-02, -6.276e-02, -4.313e-02, 1.351e-01, -7.226e-03, -9.222e-02, 1.969e-01, -7.974e-02, 7.191e-02, -3.026e-02, 2.339e-01, 2.023e-02, 5.213e-02, -2.488e-02)); + r += mul(s4_3, M4(1.140e-02, -8.909e-03, -7.873e-02, -1.323e-02, -3.844e-02, 5.506e-02, -3.270e-01, 8.929e-03, -2.479e-02, -5.558e-02, -1.106e-01, -7.180e-02, 9.166e-02, 6.054e-02, -1.063e-01, -6.591e-02)); + r += mul(s4_4, M4(5.246e-02, -2.151e-01, -2.901e-02, 2.235e-02, 1.954e-01, 8.036e-02, -4.048e-02, 3.235e-02, 8.113e-02, 1.880e-01, 1.339e-01, -4.269e-02, 6.020e-02, 1.229e-01, -7.152e-02, -3.236e-02)); + r += mul(s4_5, M4(-8.713e-02, 2.404e-02, -2.114e-02, -2.255e-02, 2.670e-03, -5.205e-02, -1.573e-01, 1.249e-01, 1.333e-01, -6.351e-04, -2.112e-02, -1.401e-01, 5.596e-02, -8.153e-02, 1.756e-02, -1.811e-01)); + r += mul(s4_6, M4(3.555e-02, -2.808e-03, 3.335e-02, 1.557e-02, -9.802e-02, -2.207e-02, 7.928e-02, 1.615e-02, 1.877e-01, 7.622e-02, 3.180e-01, -1.062e-01, 1.027e-01, -3.208e-02, 3.778e-02, -7.205e-02)); + r += mul(s4_7, M4(-2.431e-02, 5.161e-03, -1.301e-01, 3.674e-02, -6.399e-02, 1.295e-02, 1.965e-02, -5.844e-02, 2.093e-01, -1.116e-01, -2.932e-01, -1.137e-01, 1.008e-01, -9.623e-02, -1.487e-01, -2.974e-02)); + r += mul(s4_8, M4(2.896e-02, -4.900e-02, -7.973e-02, -3.879e-02, -6.687e-02, -3.486e-02, 6.078e-03, -6.165e-02, 4.432e-02, 2.105e-01, -3.078e-01, 3.181e-01, 7.459e-02, -6.405e-02, 2.317e-02, -1.176e-01)); + r += mul(s5_0, M4(-6.517e-02, -8.222e-02, 2.485e-03, 7.133e-02, -9.379e-02, -6.617e-02, -4.647e-02, 8.790e-03, -1.087e-02, 1.703e-02, 1.943e-02, -2.242e-02, -4.682e-03, 1.004e-02, -3.044e-03, -5.008e-02)); + r += mul(s5_1, M4(-1.715e-01, 8.083e-02, -2.528e-01, -2.576e-01, -5.399e-02, 4.051e-02, 1.056e-02, 4.317e-02, -1.016e-01, -3.923e-02, -6.484e-02, 4.782e-02, -6.041e-02, 3.697e-02, 2.728e-02, -2.102e-02)); + r += mul(s5_2, M4(-1.143e-01, -4.641e-02, 1.607e-01, -2.974e-02, 5.074e-02, 2.419e-02, 1.151e-01, 2.244e-03, 2.447e-03, -7.315e-03, -2.897e-02, 1.462e-02, -6.107e-02, 9.528e-02, 1.742e-02, -1.224e-01)); + r += mul(s5_3, M4(3.139e-02, -1.042e-01, 3.502e-01, 1.316e-01, 4.263e-06, 7.788e-02, -1.001e-01, 1.368e-01, -1.714e-02, 1.022e-01, -7.639e-02, 9.745e-02, -1.262e-01, 1.065e-01, 1.174e-02, 1.209e-01)); + r += mul(s5_4, M4(-2.895e-03, 2.755e-02, 2.364e-01, -5.040e-02, 7.315e-03, 8.171e-02, 6.080e-02, 9.226e-02, -4.391e-02, -1.097e-01, 9.140e-02, 1.581e-01, -4.942e-02, 1.714e-01, -7.025e-02, 7.177e-02)); + r += mul(s5_5, M4(-1.390e-01, -5.209e-02, 1.909e-01, 5.650e-02, -3.279e-02, -3.216e-02, 1.367e-02, 1.828e-02, -1.384e-02, 5.998e-02, -7.345e-03, 8.610e-02, -7.273e-02, 1.086e-01, -6.571e-02, -1.284e-01)); + r += mul(s5_6, M4(5.034e-02, -1.828e-01, 1.473e-01, -1.247e-01, 1.692e-02, -1.216e-01, -4.455e-02, -8.595e-03, 1.730e-02, 6.486e-02, -6.406e-02, 2.810e-02, -6.608e-02, -9.698e-02, 7.211e-02, -1.030e-02)); + r += mul(s5_7, M4(-9.417e-02, 5.507e-02, 1.827e-02, -9.012e-02, -6.143e-02, 1.451e-02, 5.554e-02, 1.589e-01, -9.232e-02, -2.268e-01, -5.109e-02, -2.465e-02, -9.571e-03, 1.592e-02, 7.154e-02, 3.195e-02)); + r += mul(s5_8, M4(1.122e-01, 2.526e-02, 1.345e-01, -1.378e-02, -3.588e-02, 3.086e-02, -1.854e-02, -2.739e-03, -6.601e-03, -2.751e-02, 6.659e-02, -4.153e-02, -4.977e-02, 5.489e-02, 1.320e-01, -2.698e-02)); + r += mul(s6_0, M4(2.353e-02, -1.135e-02, 4.539e-02, -3.690e-02, 1.588e-02, 1.124e-01, -6.236e-03, -5.471e-02, 3.487e-02, 9.397e-02, 1.113e-01, -5.103e-02, 9.854e-03, -1.466e-02, -4.279e-02, -4.463e-02)); + r += mul(s6_1, M4(4.381e-02, 2.766e-02, 5.584e-02, -9.172e-02, 1.119e-02, -4.151e-02, -1.586e-01, 3.715e-02, -1.467e-01, -3.013e-02, -2.240e-03, 4.990e-02, -1.190e-01, 1.239e-02, 4.518e-02, -6.321e-02)); + r += mul(s6_2, M4(-9.381e-02, -6.567e-02, -4.507e-02, 2.242e-02, 5.115e-02, 2.880e-02, 6.675e-02, -1.370e-02, -1.846e-01, -3.458e-02, 1.782e-01, -5.527e-02, 3.700e-02, 3.149e-02, -1.797e-02, 2.019e-03)); + r += mul(s6_3, M4(-8.134e-02, 3.108e-02, -7.165e-02, 6.033e-02, 4.819e-02, 4.188e-03, -3.899e-02, 4.798e-02, -5.876e-02, -7.930e-02, 6.983e-03, -4.751e-02, 6.847e-02, 2.736e-02, -9.448e-02, -1.418e-01)); + r += mul(s6_4, M4(-1.572e-01, 9.606e-02, -7.588e-02, -8.889e-02, -1.969e-02, 3.222e-02, -1.435e-01, -4.279e-02, 1.019e-01, -4.039e-02, -2.811e-02, 8.374e-02, 3.470e-02, -8.823e-02, 1.589e-02, 8.212e-02)); + r += mul(s6_5, M4(-1.517e-01, 2.006e-03, 1.170e-01, 1.126e-02, -9.371e-02, 2.775e-03, 9.179e-02, -7.633e-03, -9.387e-02, -1.895e-02, -3.722e-03, -6.392e-02, 6.610e-02, -3.510e-02, 1.864e-02, -8.583e-02)); + r += mul(s6_6, M4(1.429e-02, -1.857e-01, -9.834e-02, 4.205e-02, -9.407e-02, 2.892e-02, 1.544e-02, 9.583e-02, 4.782e-02, 9.223e-02, 6.596e-02, -5.788e-02, -8.740e-02, -3.463e-02, 1.284e-01, -5.233e-03)); + r += mul(s6_7, M4(3.617e-02, -2.159e-01, -1.628e-01, -1.198e-01, -4.794e-03, 2.093e-02, 1.201e-02, -8.133e-02, -2.638e-02, 5.355e-02, -1.989e-01, 1.090e-01, 9.783e-02, 1.182e-01, 1.286e-01, -1.415e-02)); + r += mul(s6_8, M4(4.042e-02, 3.907e-02, -5.044e-02, 1.136e-01, 1.351e-02, -8.938e-02, 7.441e-02, 1.342e-01, 1.967e-01, -5.279e-02, 7.863e-04, -9.997e-02, -2.084e-03, 9.957e-02, 4.909e-02, -7.433e-02)); + r += mul(s7_0, M4(-4.084e-02, -3.212e-02, -1.794e-01, -1.152e-01, -2.028e-02, 2.823e-02, 1.099e-01, -1.089e-02, -8.768e-02, 4.997e-02, -6.084e-02, -8.466e-02, 1.776e-01, 1.520e-01, -2.691e-02, 8.493e-02)); + r += mul(s7_1, M4(1.827e-01, 7.171e-02, 1.889e-01, -3.011e-02, 7.199e-02, -3.183e-02, 2.527e-02, -2.381e-03, -1.245e-01, -3.135e-03, 1.139e-01, -1.420e-02, -1.221e-01, -7.495e-02, -1.821e-01, -1.277e-02)); + r += mul(s7_2, M4(6.847e-02, -1.250e-01, -2.697e-02, 2.539e-02, 5.613e-02, -3.526e-02, -1.045e-01, 1.635e-02, -6.816e-02, -6.310e-02, -2.924e-02, 1.206e-02, -1.618e-02, 2.308e-01, 1.952e-02, -9.057e-02)); + r += mul(s7_3, M4(2.349e-05, -3.286e-02, -1.420e-01, -4.500e-02, 3.800e-02, 3.560e-02, 4.923e-02, -4.756e-02, 1.107e-03, -1.182e-01, -1.359e-01, 2.942e-02, -3.852e-02, 1.207e-01, -1.016e-01, -1.363e-02)); + r += mul(s7_4, M4(-1.065e-01, -3.812e-03, 2.468e-02, -5.968e-02, 8.090e-02, 9.870e-02, -1.239e-01, -1.764e-01, -4.936e-02, -4.465e-02, 1.318e-01, -1.242e-02, 1.837e-02, -9.250e-02, -6.623e-02, 3.246e-01)); + r += mul(s7_5, M4(-2.284e-02, -6.922e-02, 9.377e-02, 1.242e-01, -5.890e-02, 4.002e-02, -1.991e-02, -1.977e-02, -4.955e-02, 1.347e-02, 5.959e-02, -7.623e-03, -1.573e-02, 1.391e-01, 1.271e-01, -6.322e-02)); + r += mul(s7_6, M4(-5.371e-03, 2.781e-04, -2.736e-02, -6.368e-02, -7.276e-02, -5.966e-02, 4.382e-02, -1.299e-03, 5.660e-02, 7.911e-02, -4.893e-02, 1.085e-02, 1.875e-03, -5.381e-02, -1.343e-01, -8.671e-03)); + r += mul(s7_7, M4(-8.190e-02, -3.811e-02, 3.224e-02, -8.747e-02, -9.664e-02, -8.016e-02, -4.470e-02, -4.944e-02, 3.981e-03, 9.605e-02, -3.912e-02, -2.054e-02, -2.541e-02, -7.516e-02, -1.922e-01, -8.374e-02)); + r += mul(s7_8, M4(-2.115e-01, 1.455e-01, 7.647e-02, 1.253e-01, -5.201e-02, 2.892e-02, -1.013e-01, 1.007e-01, 1.441e-01, 6.061e-02, -9.842e-03, -1.271e-01, -3.331e-02, -3.965e-02, 8.546e-02, -1.729e-01)); + r += V4(-6.477e-03, 3.775e-02, -2.850e-02, -2.859e-03); + return r; +} + +V4 f2(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-8.396e-02, 6.257e-02, 2.046e-01, 4.715e-02, 8.119e-02, 3.792e-02, -5.588e-02, -4.133e-02, -7.613e-02, 6.871e-02, 3.404e-03, -3.979e-02, -3.971e-02, 5.339e-02, 5.938e-02, -6.581e-03)); + r += mul(s0_1, M4(-8.824e-02, 2.829e-02, -1.519e-01, 1.856e-03, 3.305e-02, -6.249e-02, 6.808e-03, -5.331e-02, 1.412e-01, -3.578e-02, -3.772e-02, 5.877e-02, 3.664e-02, -1.509e-01, 6.215e-03, -1.218e-01)); + r += mul(s0_2, M4(-1.489e-02, -9.221e-02, -5.628e-02, -7.312e-02, -4.338e-02, 4.579e-02, 1.131e-01, -2.055e-02, -3.589e-02, -3.988e-02, 1.304e-02, -1.342e-01, 3.737e-02, 2.073e-01, 1.726e-02, 3.786e-02)); + r += mul(s0_3, M4(-2.719e-02, -3.733e-02, -3.726e-02, 1.658e-02, 1.124e-01, 1.442e-02, 2.669e-02, -8.319e-02, -1.084e-02, 1.207e-02, -1.302e-01, 2.021e-03, -7.741e-02, -1.868e-02, -1.055e-01, -2.045e-02)); + r += mul(s0_4, M4(4.953e-02, -1.142e-01, -1.336e-01, 5.330e-02, 6.012e-02, 7.107e-02, 1.274e-02, -1.497e-01, 1.689e-01, -1.159e-01, -1.850e-01, -9.835e-03, 6.214e-02, 2.969e-02, 2.910e-02, 1.322e-01)); + r += mul(s0_5, M4(2.856e-02, 4.993e-02, -1.014e-01, -4.757e-02, 1.783e-02, 2.150e-02, 6.456e-02, -8.850e-03, 4.848e-02, 1.232e-01, -1.940e-02, 2.387e-02, 2.107e-02, 7.759e-02, 1.312e-02, -8.911e-02)); + r += mul(s0_6, M4(1.169e-01, -3.837e-03, -1.560e-01, -6.673e-02, 2.033e-02, -7.245e-02, -2.519e-02, -6.096e-02, -7.451e-02, -4.305e-02, -1.036e-01, 2.808e-02, 1.520e-02, -1.628e-02, -3.010e-02, 2.474e-02)); + r += mul(s0_7, M4(-5.442e-03, -1.942e-02, -1.479e-02, 2.604e-02, 3.023e-02, 1.808e-02, 4.114e-02, 6.142e-02, -3.394e-02, 3.443e-02, 4.459e-03, -4.054e-02, -5.407e-02, -7.083e-02, 3.597e-02, 2.541e-02)); + r += mul(s0_8, M4(1.896e-01, -6.667e-02, -2.874e-02, -1.202e-01, -2.225e-02, -1.835e-02, 4.985e-02, -1.007e-03, -4.515e-02, -1.612e-02, -6.822e-02, 2.557e-02, -4.599e-03, 2.108e-02, 1.646e-02, 1.822e-01)); + r += mul(s1_0, M4(8.316e-02, 4.972e-02, 5.940e-02, -3.601e-02, -2.570e-02, -3.406e-02, 1.026e-01, 1.224e-01, 3.587e-02, 6.016e-03, 1.227e-01, -9.876e-02, 1.664e-02, 9.671e-02, -1.050e-03, 8.077e-02)); + r += mul(s1_1, M4(1.094e-02, 6.376e-02, 1.504e-01, 9.308e-02, 1.487e-01, 1.374e-01, -7.933e-02, 1.163e-01, 6.827e-02, -1.194e-01, 1.051e-01, 6.315e-03, 1.051e-01, -1.439e-01, 3.877e-02, -1.417e-01)); + r += mul(s1_2, M4(-8.041e-03, 1.070e-01, -3.588e-02, 7.473e-02, 5.798e-02, -3.620e-02, -1.266e-01, -2.034e-02, -6.879e-02, -1.322e-01, 8.333e-02, -1.265e-01, 7.251e-02, -6.806e-02, -2.084e-01, 3.071e-02)); + r += mul(s1_3, M4(-1.856e-02, 3.163e-02, 7.100e-02, -9.220e-02, -1.164e-01, -1.826e-01, 1.023e-01, 9.672e-02, 1.518e-01, -6.912e-02, 2.306e-01, 1.432e-01, -9.888e-02, -5.789e-02, -6.058e-02, -1.396e-01)); + r += mul(s1_4, M4(-5.385e-02, -1.271e-01, 8.932e-02, 5.435e-02, 2.220e-03, 1.040e-01, -1.587e-01, -4.732e-02, -1.000e-01, 7.554e-02, 5.049e-02, 4.207e-02, -1.358e-01, 1.794e-02, 8.754e-02, 6.202e-02)); + r += mul(s1_5, M4(4.379e-03, 1.836e-02, 7.793e-02, -1.987e-02, -6.199e-02, 9.397e-02, -7.464e-02, 5.137e-02, 5.078e-02, -3.277e-02, -3.652e-02, 1.251e-01, -7.142e-02, -2.838e-02, 1.065e-01, 9.548e-02)); + r += mul(s1_6, M4(2.106e-02, 1.698e-02, 1.823e-01, -1.049e-02, -1.023e-01, 7.420e-02, 6.849e-02, -2.680e-02, 1.588e-02, -2.739e-01, 6.962e-02, -6.241e-02, 2.071e-02, -2.705e-02, 1.457e-01, -1.072e-01)); + r += mul(s1_7, M4(-5.482e-02, 9.531e-02, 2.216e-02, 1.134e-01, 6.476e-02, 1.798e-01, -5.868e-02, -5.474e-02, 1.957e-02, 8.487e-03, -1.855e-02, -5.016e-02, -9.990e-02, -4.489e-03, -4.724e-02, -1.959e-02)); + r += mul(s1_8, M4(-5.301e-02, -3.228e-02, -3.431e-02, -1.756e-02, -5.888e-02, -1.213e-01, -7.543e-02, -1.655e-02, -8.627e-02, -8.473e-02, -1.860e-01, -9.430e-02, -9.301e-02, -1.847e-02, -1.846e-01, -2.675e-02)); + r += mul(s2_0, M4(-1.116e-03, 1.984e-01, 8.365e-02, -1.080e-01, 3.379e-02, 1.197e-01, -6.953e-02, -1.108e-01, -8.161e-02, -1.120e-01, -1.096e-01, 3.466e-02, -8.288e-02, -2.875e-02, 5.789e-02, -1.645e-01)); + r += mul(s2_1, M4(-4.304e-02, -3.669e-01, -1.122e-03, 3.619e-02, 1.861e-02, -1.261e-02, 1.334e-02, 4.227e-02, -2.607e-02, -1.268e-01, -4.250e-02, 9.329e-02, 2.142e-02, 2.399e-01, -3.785e-02, -2.165e-01)); + r += mul(s2_2, M4(1.717e-01, 4.601e-02, 7.285e-02, 1.641e-01, 3.082e-02, 4.744e-02, 1.024e-01, -1.805e-02, 1.980e-02, 7.636e-02, 1.307e-01, 3.199e-03, 1.031e-01, 6.953e-02, 5.313e-02, 8.578e-02)); + r += mul(s2_3, M4(-3.959e-02, 9.776e-02, -3.648e-02, -6.317e-02, -1.881e-02, -1.470e-01, -7.160e-02, -2.812e-02, -9.151e-02, -2.812e-02, 3.204e-02, -1.560e-01, -2.561e-01, 2.194e-02, -1.352e-01, 5.714e-02)); + r += mul(s2_4, M4(1.179e-01, -9.014e-02, -1.723e-01, -3.048e-02, 2.041e-01, 1.623e-01, -5.811e-02, 2.392e-02, 2.907e-02, 7.798e-02, -1.402e-01, 5.638e-02, -1.392e-01, -6.102e-02, -1.454e-01, -8.343e-02)); + r += mul(s2_5, M4(-6.665e-02, -1.900e-01, 3.355e-02, -3.858e-02, 1.273e-01, 5.205e-02, 6.613e-02, -1.686e-01, 5.957e-02, 2.084e-01, 4.997e-02, -1.078e-01, -1.243e-01, 1.989e-01, 3.212e-02, -7.405e-02)); + r += mul(s2_6, M4(2.811e-02, 2.827e-02, -8.699e-02, 5.391e-03, -1.677e-02, 5.194e-02, -1.205e-01, -4.094e-02, 2.947e-02, -1.030e-01, -8.520e-02, -4.418e-03, -8.797e-02, -7.821e-02, -1.151e-01, -6.517e-02)); + r += mul(s2_7, M4(-1.696e-01, -1.334e-01, 3.738e-02, -2.598e-02, -5.932e-02, 1.256e-02, -3.674e-02, 4.801e-02, -2.234e-02, -5.203e-02, -2.763e-02, 4.107e-02, -2.292e-01, 1.440e-02, -7.571e-02, -8.242e-02)); + r += mul(s2_8, M4(4.696e-02, 1.477e-01, 8.007e-02, -9.830e-02, 3.139e-02, -1.273e-01, 7.095e-03, -6.454e-02, -5.214e-02, 2.861e-02, 1.585e-01, 1.357e-02, 1.475e-01, -3.230e-02, -4.577e-02, -1.059e-01)); + r += mul(s3_0, M4(-2.252e-02, 1.338e-02, -1.358e-01, -6.354e-02, 4.917e-02, 4.904e-02, -8.928e-02, -1.837e-01, 1.973e-02, 4.783e-03, 1.707e-01, -3.115e-02, 7.732e-02, -5.697e-03, 4.607e-02, 5.169e-02)); + r += mul(s3_1, M4(1.296e-02, -1.086e-01, -5.551e-02, -5.133e-02, 1.030e-02, -1.204e-01, 1.266e-01, -3.791e-03, -8.365e-02, 1.510e-01, 5.554e-02, -4.317e-02, 2.934e-02, -4.857e-02, -9.000e-02, -8.174e-02)); + r += mul(s3_2, M4(2.791e-02, -5.920e-02, 8.420e-03, 2.844e-02, -1.942e-02, -1.035e-01, 5.318e-02, 1.820e-02, 5.579e-02, 2.278e-02, 1.166e-01, 2.042e-01, 5.956e-02, 1.558e-03, 1.131e-01, 7.742e-02)); + r += mul(s3_3, M4(8.458e-02, -6.920e-02, 5.021e-02, -4.591e-02, 1.219e-01, 1.240e-01, 4.117e-02, -1.473e-02, 2.851e-02, -9.032e-02, 1.518e-01, 1.034e-01, -7.163e-02, -1.222e-01, 2.318e-02, 9.159e-02)); + r += mul(s3_4, M4(1.075e-01, 4.295e-02, 1.551e-02, -1.004e-02, 6.269e-02, 1.251e-01, -1.786e-01, 2.617e-01, 5.514e-02, 1.150e-01, 3.540e-02, -4.715e-02, -2.372e-02, -2.104e-02, -3.770e-02, -3.209e-02)); + r += mul(s3_5, M4(-2.779e-02, -1.541e-02, 3.910e-02, 6.499e-02, 1.786e-01, 2.785e-02, 1.080e-01, 6.422e-02, 8.128e-02, -5.753e-04, 6.851e-02, -9.486e-03, 5.335e-02, -2.182e-02, 7.441e-02, -1.735e-01)); + r += mul(s3_6, M4(-6.663e-02, 1.650e-02, -7.590e-04, 5.202e-02, 1.628e-03, -4.763e-02, -9.231e-03, -6.298e-02, -1.443e-01, -1.467e-01, -1.160e-02, -3.925e-02, -5.014e-02, -3.762e-02, 3.894e-02, 7.811e-02)); + r += mul(s3_7, M4(-1.213e-01, 9.338e-02, 7.873e-02, 1.343e-01, 1.435e-01, 2.037e-01, -2.489e-01, 1.518e-02, 9.782e-02, 6.091e-02, -7.512e-02, -9.813e-02, -1.407e-01, -3.279e-02, 2.124e-02, 8.105e-02)); + r += mul(s3_8, M4(-9.767e-02, 1.018e-01, 7.291e-02, 6.664e-02, 1.303e-01, 9.835e-02, -3.387e-02, -1.254e-01, -7.274e-02, -6.490e-02, -8.099e-02, 8.225e-02, 1.014e-01, -9.791e-02, 1.910e-02, -1.359e-02)); + r += mul(s4_0, M4(6.237e-02, -2.098e-02, -3.524e-02, -1.842e-02, -6.025e-03, -1.339e-02, -1.479e-01, -1.391e-01, -1.004e-01, 7.957e-02, 1.256e-01, 2.416e-02, 4.468e-02, -5.897e-02, 4.880e-02, 1.064e-01)); + r += mul(s4_1, M4(1.518e-01, 2.555e-02, -2.027e-02, 4.877e-02, -1.120e-01, -7.960e-02, -1.309e-01, -1.421e-02, -1.558e-01, -1.644e-01, -5.664e-02, -3.298e-02, -8.471e-02, -1.006e-01, 1.330e-01, -1.327e-01)); + r += mul(s4_2, M4(-4.238e-02, -1.514e-02, 2.417e-02, 3.420e-03, 4.216e-02, 9.089e-02, 8.527e-02, 8.454e-03, -7.779e-02, -7.727e-03, 2.072e-01, -1.901e-01, -1.010e-02, 3.595e-02, -1.229e-01, 4.745e-02)); + r += mul(s4_3, M4(-6.419e-02, -5.132e-02, -6.213e-02, 5.459e-02, -6.912e-02, 2.448e-02, 8.193e-02, -3.265e-02, -1.697e-01, 2.783e-01, -1.581e-01, -2.180e-01, -7.239e-03, 7.356e-02, 1.891e-01, -7.637e-02)); + r += mul(s4_4, M4(-1.999e-02, -1.105e-01, 6.978e-02, -4.610e-02, -6.091e-02, 5.815e-02, -1.244e-01, -8.634e-02, -2.659e-01, -2.601e-01, 3.830e-01, 2.879e-02, -1.113e-01, 1.182e-01, 1.204e-01, 5.876e-02)); + r += mul(s4_5, M4(-1.752e-02, 9.014e-02, 1.071e-01, -1.964e-02, 1.287e-02, -1.100e-01, -1.074e-01, -5.476e-02, 2.557e-02, -1.321e-01, 5.911e-02, -6.585e-02, 8.432e-02, -7.117e-02, 3.125e-02, -3.480e-02)); + r += mul(s4_6, M4(4.746e-03, -7.302e-02, -7.874e-02, -6.524e-02, -1.089e-01, 5.395e-02, -1.219e-01, 8.346e-02, -6.767e-02, 2.019e-01, 5.432e-02, 9.575e-02, -5.070e-04, -5.142e-02, 1.177e-01, 1.051e-01)); + r += mul(s4_7, M4(-5.428e-02, 5.602e-02, 2.857e-02, 1.466e-01, -2.225e-02, -3.678e-02, -7.365e-02, -4.064e-02, -2.390e-02, 8.908e-02, -1.751e-01, -3.483e-01, 2.630e-03, -2.349e-01, 1.084e-01, 2.868e-02)); + r += mul(s4_8, M4(-1.447e-02, 1.434e-01, 6.197e-02, 8.041e-02, 1.320e-01, -2.235e-01, -7.857e-02, 1.787e-02, -2.865e-02, 3.762e-01, -1.852e-01, 4.053e-01, 7.515e-03, -3.925e-02, 8.597e-02, 3.091e-02)); + r += mul(s5_0, M4(-2.934e-02, 2.034e-01, -7.735e-02, -3.193e-02, -1.826e-02, 8.642e-03, 2.075e-02, 3.363e-02, 4.635e-02, 7.288e-02, -1.349e-01, 4.498e-02, -5.291e-02, 3.082e-02, -9.191e-03, 1.239e-02)); + r += mul(s5_1, M4(4.098e-02, 2.291e-01, -4.124e-02, 2.460e-02, -5.447e-02, -1.430e-01, -2.160e-02, 3.745e-02, 1.351e-02, -3.519e-02, -1.025e-02, -1.228e-02, 1.061e-01, -2.792e-02, -1.762e-01, -1.218e-02)); + r += mul(s5_2, M4(-1.660e-01, -1.650e-01, -6.943e-02, 6.321e-03, 1.122e-03, -6.026e-03, -1.170e-02, -3.466e-02, 2.570e-02, 1.026e-01, -1.145e-02, -8.252e-02, 1.478e-01, 1.972e-02, -3.516e-02, 6.122e-02)); + r += mul(s5_3, M4(-1.429e-01, -1.929e-01, 7.832e-02, 2.394e-02, -5.004e-02, 7.451e-02, -1.243e-01, -1.176e-01, 6.872e-02, -1.054e-01, -4.966e-02, -1.551e-01, 3.259e-02, 1.193e-01, -7.004e-02, -7.566e-02)); + r += mul(s5_4, M4(1.310e-02, 2.361e-01, 6.625e-02, -1.173e-01, -8.591e-02, 5.668e-02, -9.263e-02, 1.032e-02, -6.205e-02, -2.309e-01, 6.959e-02, 5.009e-02, 1.304e-02, 1.370e-01, 1.630e-02, -1.975e-02)); + r += mul(s5_5, M4(-4.677e-02, -1.617e-01, -1.872e-01, -1.676e-02, -2.004e-02, 4.053e-02, -8.716e-02, 1.984e-02, -7.915e-02, 1.496e-01, 9.948e-02, 4.470e-02, -7.834e-02, 1.324e-01, -5.536e-03, -9.670e-02)); + r += mul(s5_6, M4(-1.224e-01, 4.783e-02, 8.669e-02, -2.685e-01, 1.836e-03, 1.538e-02, 7.833e-03, -3.458e-02, 1.378e-02, 4.714e-02, 2.101e-02, -6.275e-02, 8.374e-02, -2.789e-02, -1.473e-01, -7.346e-02)); + r += mul(s5_7, M4(1.537e-01, 7.065e-03, 2.026e-01, 6.581e-02, -2.118e-02, -1.650e-01, -5.360e-02, -7.651e-02, 1.194e-01, 6.108e-02, 6.343e-02, -2.503e-02, 3.796e-02, 8.866e-03, 1.308e-02, 1.915e-02)); + r += mul(s5_8, M4(-6.067e-02, -1.150e-01, -5.869e-02, -1.623e-01, 7.534e-02, 1.269e-01, -1.742e-02, 1.379e-01, 1.134e-01, 4.200e-05, 1.298e-01, -1.327e-01, -2.172e-02, -6.698e-02, -8.754e-02, -1.267e-01)); + r += mul(s6_0, M4(-4.926e-02, -1.760e-02, 3.980e-02, 2.508e-02, -3.775e-02, 2.076e-02, -1.081e-01, -1.151e-02, 1.168e-02, -1.424e-01, -1.228e-01, 2.343e-02, -8.698e-02, 6.311e-02, 6.102e-03, 2.650e-02)); + r += mul(s6_1, M4(-5.825e-02, -4.032e-02, 1.147e-01, 2.680e-02, 1.414e-01, 5.679e-02, -9.813e-02, -3.283e-02, -1.126e-01, -7.862e-02, 1.747e-01, 1.466e-03, 1.422e-02, -6.262e-02, -1.687e-02, -2.384e-02)); + r += mul(s6_2, M4(4.493e-03, 1.772e-02, -7.808e-02, -9.538e-02, 1.030e-02, 7.319e-02, -1.175e-01, -1.446e-02, -4.204e-02, 1.384e-01, 5.252e-02, -2.037e-02, -1.241e-01, -1.529e-03, -4.452e-04, -3.906e-02)); + r += mul(s6_3, M4(4.798e-02, -2.439e-02, -3.515e-02, 4.722e-02, 2.403e-01, -1.254e-01, 1.519e-02, 3.248e-02, 7.053e-02, -1.518e-02, -2.982e-02, -6.945e-02, -1.278e-01, 1.423e-01, 5.746e-02, -3.201e-02)); + r += mul(s6_4, M4(-3.080e-02, 1.561e-02, 2.768e-02, 2.669e-01, 1.858e-01, 3.711e-02, 7.019e-02, 1.011e-01, -5.844e-02, 9.352e-02, -3.138e-02, 1.805e-01, 1.252e-02, 5.338e-02, 2.771e-02, -2.996e-02)); + r += mul(s6_5, M4(-1.191e-01, -2.572e-02, -2.064e-02, 6.565e-02, 1.165e-01, -2.582e-02, 1.819e-01, -4.633e-02, 3.829e-02, 4.124e-02, 2.464e-01, -7.015e-02, 7.747e-02, -4.253e-02, -5.876e-02, 1.819e-02)); + r += mul(s6_6, M4(-1.295e-02, 1.090e-01, -9.345e-02, 9.165e-02, -2.594e-02, -9.639e-02, -4.320e-02, 8.351e-02, -1.298e-01, -1.167e-02, -1.856e-01, -1.277e-01, 9.414e-03, 1.105e-01, -3.130e-02, 6.221e-02)); + r += mul(s6_7, M4(3.444e-03, -2.271e-01, 3.192e-02, 1.126e-01, 4.436e-02, 9.578e-02, -1.035e-01, 1.076e-01, 5.406e-02, -7.431e-02, -4.377e-03, -5.885e-02, -6.816e-02, -2.066e-01, -2.767e-02, -5.711e-02)); + r += mul(s6_8, M4(-1.181e-01, 2.311e-01, -2.831e-02, 1.385e-01, -3.545e-02, 1.610e-01, 3.820e-02, 4.875e-02, 2.075e-01, -1.311e-01, -3.649e-02, 6.766e-02, 2.862e-02, 9.259e-03, 9.902e-02, -6.406e-02)); + r += mul(s7_0, M4(-5.053e-02, -2.136e-02, -1.745e-02, 4.108e-02, 2.853e-03, -6.905e-02, -4.749e-02, 7.346e-02, 1.699e-02, -1.325e-01, -7.159e-02, 1.764e-02, -4.939e-02, -9.260e-02, 1.443e-02, -1.301e-02)); + r += mul(s7_1, M4(1.267e-02, 2.617e-02, -1.330e-02, 1.707e-01, 2.547e-02, -6.053e-02, -5.732e-02, -4.795e-02, -8.427e-02, 3.053e-04, -2.630e-02, -6.587e-02, 3.033e-02, -9.484e-02, -9.448e-02, 8.488e-02)); + r += mul(s7_2, M4(-3.125e-02, 6.712e-02, 7.077e-03, -7.110e-02, -2.445e-02, 9.009e-02, -7.513e-02, 7.024e-02, -2.663e-02, -5.283e-03, -3.805e-02, 2.211e-03, 1.910e-02, 3.563e-02, -1.786e-02, -7.405e-02)); + r += mul(s7_3, M4(2.590e-02, -9.905e-02, -3.188e-02, -5.647e-02, 8.916e-02, -1.490e-01, 1.306e-01, -3.185e-02, -1.564e-02, 3.120e-02, 1.037e-01, 1.424e-02, 7.963e-02, 4.173e-03, 9.197e-02, 1.390e-01)); + r += mul(s7_4, M4(1.105e-01, -2.338e-01, 2.474e-02, 5.860e-02, 2.509e-01, 1.125e-01, 1.008e-01, 9.209e-02, -5.383e-02, 1.035e-01, 4.327e-02, 3.693e-02, 1.499e-01, 3.680e-02, 6.475e-02, 1.107e-01)); + r += mul(s7_5, M4(-2.218e-02, -1.690e-01, -4.273e-02, -1.628e-02, 3.745e-02, 2.656e-02, 1.162e-01, 1.176e-01, 5.675e-03, -7.341e-02, 7.056e-02, 4.805e-02, 7.543e-02, 1.842e-02, 4.577e-02, 1.140e-02)); + r += mul(s7_6, M4(-1.473e-02, -2.266e-02, -7.544e-02, 1.373e-02, 1.795e-01, -4.898e-02, -1.475e-02, 1.673e-01, 5.746e-03, -9.764e-02, -5.334e-02, 9.037e-02, -4.687e-03, 1.181e-01, -1.183e-02, 6.647e-02)); + r += mul(s7_7, M4(1.130e-01, -1.421e-01, 4.181e-02, 6.442e-02, 1.211e-01, -2.209e-02, -3.875e-04, -5.382e-02, -1.280e-01, 1.888e-01, 1.304e-01, 1.089e-02, -6.041e-02, 2.358e-01, 4.996e-03, -1.448e-01)); + r += mul(s7_8, M4(-1.302e-01, -8.352e-02, -1.199e-01, 1.755e-01, -1.887e-02, -9.609e-03, -1.532e-02, 9.148e-02, 6.745e-02, -8.519e-02, -1.737e-01, -1.573e-01, 9.497e-02, -3.531e-02, -1.095e-01, -2.586e-01)); + r += V4(2.920e-02, 2.727e-03, 2.658e-02, 7.202e-02); + return r; +} + +V4 f3(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(1.324e-01, 3.098e-02, -5.610e-02, -4.146e-02, 2.549e-03, -7.130e-02, -1.110e-01, 7.283e-02, 1.845e-02, -9.657e-02, 3.844e-03, 2.523e-02, -5.975e-02, -1.173e-01, 3.095e-02, 9.501e-02)); + r += mul(s0_1, M4(-1.426e-01, -1.228e-01, -1.281e-01, 2.389e-02, -2.692e-02, -4.660e-02, -9.459e-02, -2.750e-02, -8.558e-02, -4.009e-02, 3.787e-02, 7.417e-03, -6.477e-02, 6.138e-02, 9.170e-02, -4.381e-02)); + r += mul(s0_2, M4(-1.730e-01, -5.044e-02, -1.070e-01, 6.243e-02, -5.736e-02, -5.904e-02, 4.201e-02, 1.623e-02, -1.295e-01, 2.815e-03, 2.265e-02, 5.778e-02, -9.029e-02, 1.748e-02, 1.011e-02, -2.713e-02)); + r += mul(s0_3, M4(-6.038e-02, 8.951e-02, -7.483e-02, -5.819e-02, 9.276e-02, -1.233e-01, -8.590e-02, -1.409e-01, -3.259e-02, 4.039e-02, -4.817e-03, -1.018e-01, -1.746e-01, -6.002e-02, -7.211e-02, -8.386e-02)); + r += mul(s0_4, M4(-1.231e-01, 3.177e-02, 2.555e-03, -1.744e-01, -1.353e-02, -1.207e-01, 1.175e-01, -1.910e-01, -2.753e-02, -1.688e-01, 5.652e-02, 1.298e-01, -4.414e-02, 1.817e-01, 8.418e-02, -5.938e-02)); + r += mul(s0_5, M4(4.654e-02, -2.205e-01, -9.299e-02, 6.869e-02, -2.001e-02, -1.276e-02, 1.292e-01, -1.016e-01, 6.783e-02, -5.872e-02, -7.446e-02, 8.189e-02, 4.320e-02, 1.480e-02, 6.159e-02, -6.716e-02)); + r += mul(s0_6, M4(1.373e-01, 1.687e-02, -8.457e-02, 1.829e-03, -2.415e-02, 5.841e-03, 2.825e-02, 2.903e-02, -6.525e-02, 9.673e-02, 2.568e-02, -8.981e-02, 4.992e-02, -1.157e-01, -1.493e-02, 2.380e-02)); + r += mul(s0_7, M4(8.304e-02, 1.067e-01, 1.375e-01, -2.046e-02, -7.120e-02, 6.355e-02, -3.328e-02, -1.201e-01, -2.240e-02, 2.329e-02, 6.133e-02, -8.430e-03, 5.728e-02, 1.656e-02, 1.803e-02, -1.021e-01)); + r += mul(s0_8, M4(1.901e-03, -1.383e-01, 7.359e-02, -1.758e-02, -3.607e-02, -3.771e-02, -2.204e-02, 1.258e-01, -6.274e-03, 2.672e-02, 8.706e-02, -3.942e-02, -3.532e-02, -6.095e-02, -2.052e-02, -1.085e-01)); + r += mul(s1_0, M4(8.602e-04, 8.446e-02, 5.132e-02, 3.456e-02, -1.910e-02, 1.225e-01, -5.233e-02, 1.062e-01, 1.613e-01, -1.027e-01, -9.407e-02, -2.353e-01, 6.873e-02, 5.204e-02, 9.637e-02, -2.035e-03)); + r += mul(s1_1, M4(-3.258e-02, 3.236e-02, 1.585e-01, 1.841e-01, 6.017e-03, -8.298e-02, -9.286e-02, -7.971e-02, -3.589e-02, 9.189e-02, 8.931e-02, -7.546e-02, 6.572e-02, 2.627e-02, -1.412e-01, -1.148e-01)); + r += mul(s1_2, M4(-9.811e-03, 8.210e-03, -1.522e-02, -1.445e-01, -1.339e-01, -2.461e-02, -3.405e-03, 1.385e-01, -2.507e-01, -3.665e-02, -9.215e-02, -6.471e-03, -1.242e-01, 2.180e-01, 3.822e-02, 1.153e-01)); + r += mul(s1_3, M4(6.760e-02, 4.069e-02, -4.637e-02, 1.038e-01, -3.410e-02, 1.763e-01, 1.336e-01, 8.865e-03, -5.930e-02, 3.881e-01, -2.500e-01, -2.094e-02, 9.937e-02, 5.619e-02, 1.528e-01, -1.557e-01)); + r += mul(s1_4, M4(6.235e-02, 2.350e-01, -7.527e-02, -1.680e-02, -1.354e-01, -7.105e-02, -2.478e-02, -6.784e-02, -1.697e-01, -2.013e-01, 2.555e-01, 2.012e-01, -2.957e-02, -1.685e-02, 1.850e-01, 6.340e-02)); + r += mul(s1_5, M4(3.966e-02, -1.723e-01, -1.228e-01, 8.802e-02, 4.809e-02, -9.692e-02, -6.344e-03, -7.978e-02, 1.669e-01, -1.779e-01, 6.291e-03, 6.059e-02, 3.993e-03, -2.133e-01, -3.395e-02, 1.342e-02)); + r += mul(s1_6, M4(-5.133e-02, -1.657e-02, 1.592e-02, 5.386e-02, 1.022e-01, 1.524e-01, 8.132e-02, 4.798e-02, 1.245e-01, 1.184e-01, -1.525e-01, -1.911e-01, -1.381e-02, -5.021e-02, -8.596e-03, 3.106e-01)); + r += mul(s1_7, M4(-1.818e-02, 2.232e-01, -4.030e-02, 4.948e-03, -3.336e-02, 9.223e-02, -2.868e-02, -1.187e-01, 2.736e-02, 1.980e-01, -4.715e-02, -6.880e-02, -3.155e-02, 2.444e-02, 1.473e-01, 9.269e-02)); + r += mul(s1_8, M4(-5.057e-02, 2.620e-02, 2.795e-02, 8.563e-03, 1.028e-01, 4.350e-02, 7.139e-03, -1.082e-01, 1.869e-01, -1.683e-02, 3.172e-02, 8.075e-02, 8.004e-02, -1.671e-01, -4.036e-02, 3.039e-01)); + r += mul(s2_0, M4(1.180e-02, -1.184e-02, -6.574e-02, -1.048e-01, -3.686e-02, -6.367e-03, -8.990e-02, 6.084e-02, -8.842e-02, 5.817e-02, 8.876e-02, 1.218e-01, 1.387e-01, -1.046e-01, 3.739e-02, 7.670e-02)); + r += mul(s2_1, M4(7.315e-02, -5.979e-02, 1.453e-01, -1.965e-01, 2.788e-02, -2.264e-02, -6.827e-02, 5.191e-02, -1.430e-01, 3.145e-03, 4.147e-02, 1.067e-01, -3.394e-02, -2.290e-01, -2.004e-01, 8.971e-02)); + r += mul(s2_2, M4(-2.835e-01, -5.782e-02, -4.523e-02, -4.873e-02, 7.985e-02, 1.438e-02, 6.609e-03, -8.096e-02, 1.605e-02, -3.455e-02, -4.986e-02, 7.196e-03, -6.071e-02, -5.082e-02, 4.941e-02, -7.414e-02)); + r += mul(s2_3, M4(-5.490e-02, 9.303e-02, 1.482e-01, 9.336e-02, -6.466e-02, -2.197e-02, -1.126e-01, 3.278e-02, 1.232e-01, 6.193e-02, -4.222e-02, -7.636e-02, 1.215e-02, -4.407e-02, 3.692e-02, -2.260e-01)); + r += mul(s2_4, M4(-3.508e-02, -1.683e-01, 8.935e-02, -4.702e-02, 1.243e-01, -5.206e-02, 7.074e-02, 1.417e-01, 5.942e-02, -1.391e-03, 2.317e-02, 2.775e-02, 2.099e-01, -4.575e-02, 1.754e-01, -1.390e-01)); + r += mul(s2_5, M4(-2.350e-01, 1.311e-01, -1.077e-01, 1.464e-01, 1.809e-01, -2.669e-04, -6.422e-02, -3.863e-02, 8.083e-02, 1.275e-01, -3.113e-02, 4.285e-03, -2.051e-01, 1.352e-01, -8.773e-02, 2.944e-02)); + r += mul(s2_6, M4(-3.024e-01, 6.652e-02, 8.992e-03, 1.629e-01, -7.257e-02, -3.108e-03, 2.366e-02, -1.174e-01, 1.096e-01, 1.167e-01, -6.839e-02, 2.846e-02, 4.916e-02, -6.639e-02, 2.082e-02, -5.918e-02)); + r += mul(s2_7, M4(-7.346e-02, -1.019e-01, -1.342e-02, 3.497e-02, 9.453e-03, 3.333e-03, 1.372e-01, 3.164e-02, -8.270e-02, 7.919e-02, -5.118e-02, 5.324e-02, -8.807e-02, 1.842e-01, 2.262e-01, 2.480e-02)); + r += mul(s2_8, M4(-1.017e-01, 2.074e-02, 5.007e-03, -1.334e-01, 4.727e-02, 2.447e-02, 7.362e-02, 1.111e-02, 1.149e-03, -5.188e-02, -4.095e-02, -7.496e-02, -4.799e-02, -1.475e-01, -1.799e-01, 1.101e-01)); + r += mul(s3_0, M4(-2.391e-02, -3.236e-02, -2.395e-02, -4.702e-02, -7.691e-02, 1.187e-02, -1.053e-01, 6.970e-03, 6.224e-02, -7.598e-02, 1.975e-01, -8.765e-02, 8.864e-02, 2.953e-02, -3.562e-02, 4.886e-02)); + r += mul(s3_1, M4(1.388e-01, -5.233e-02, 3.314e-03, 4.763e-02, 1.214e-01, 1.726e-01, 2.096e-02, 1.307e-01, 6.915e-02, -3.984e-02, 1.126e-01, -1.379e-01, -4.996e-03, -1.407e-02, -9.647e-02, -6.811e-02)); + r += mul(s3_2, M4(8.456e-02, -1.095e-02, -6.309e-02, -1.719e-02, 5.154e-02, 1.870e-01, 1.533e-01, -2.619e-02, 2.311e-01, -1.102e-01, -3.136e-02, -1.424e-02, -9.414e-02, 4.845e-02, 2.837e-02, -1.301e-02)); + r += mul(s3_3, M4(9.095e-02, -8.971e-02, -1.215e-02, -9.743e-02, -1.912e-01, -1.567e-02, -6.240e-02, 1.240e-01, -1.016e-01, -2.279e-01, -7.441e-02, 2.731e-02, 2.472e-02, -1.268e-01, 4.355e-03, 1.256e-01)); + r += mul(s3_4, M4(1.504e-01, 2.074e-01, -4.563e-02, 9.107e-02, 6.975e-02, -2.268e-02, 2.963e-01, 7.521e-02, -2.058e-01, 1.920e-01, -8.490e-02, -2.095e-01, 1.311e-01, -4.082e-02, 1.062e-01, -3.973e-02)); + r += mul(s3_5, M4(-2.132e-01, -1.528e-01, -2.973e-02, -4.818e-02, 2.202e-01, -1.653e-01, -3.830e-03, -1.751e-02, -7.094e-02, 8.933e-03, -5.851e-03, -5.554e-02, -2.070e-01, -1.704e-02, 2.700e-02, -4.136e-02)); + r += mul(s3_6, M4(6.727e-02, -8.846e-02, 6.397e-02, -1.020e-02, -1.508e-01, -9.940e-02, 7.372e-02, 2.904e-02, -3.266e-02, -1.201e-01, -3.074e-02, 3.378e-03, 3.186e-02, 2.257e-02, 5.726e-02, 4.939e-02)); + r += mul(s3_7, M4(7.298e-02, 9.083e-02, 1.039e-01, -2.973e-02, -1.102e-01, 4.364e-03, 1.732e-01, 3.399e-02, 2.200e-02, 8.622e-03, -8.569e-02, 1.179e-01, -1.467e-01, -5.801e-03, 6.517e-02, 1.460e-03)); + r += mul(s3_8, M4(7.603e-02, 1.223e-02, -3.089e-02, 7.583e-02, 1.471e-03, 3.472e-02, 3.394e-02, -1.371e-02, -4.960e-04, -1.172e-01, 1.305e-03, -1.425e-01, 2.795e-03, -2.720e-03, -5.219e-03, -6.907e-02)); + r += mul(s4_0, M4(5.505e-03, -8.819e-03, -4.014e-03, -1.244e-02, -1.126e-01, 8.135e-04, 9.623e-02, 3.676e-02, -1.720e-01, -2.153e-01, 1.957e-01, -2.243e-02, 1.522e-01, 2.124e-01, -1.470e-01, -1.231e-01)); + r += mul(s4_1, M4(3.341e-03, 4.275e-02, -1.164e-03, -1.806e-01, -5.828e-03, -2.089e-01, -1.698e-02, 2.542e-01, -2.417e-02, 6.649e-02, 4.735e-02, 1.805e-01, 1.254e-01, 2.262e-01, -1.286e-01, 1.099e-01)); + r += mul(s4_2, M4(6.665e-03, 6.571e-02, 3.929e-03, 5.843e-02, 1.745e-01, -4.256e-02, -7.602e-02, -1.089e-01, 2.779e-01, -2.963e-03, -1.710e-01, -1.459e-01, 1.136e-01, 4.401e-02, -2.303e-02, -8.939e-04)); + r += mul(s4_3, M4(5.475e-03, -4.728e-02, -1.140e-01, 2.885e-03, -4.551e-02, 1.432e-01, 2.654e-02, 6.426e-02, 7.432e-02, -1.165e-01, -3.742e-02, -7.785e-02, 7.110e-02, -1.741e-02, -1.233e-01, 7.455e-02)); + r += mul(s4_4, M4(-4.256e-02, -1.787e-01, 1.026e-01, -1.440e-01, 1.520e-01, -4.770e-02, -1.609e-01, 1.174e-01, -1.175e-01, 2.220e-01, -1.170e-01, -2.981e-01, 8.738e-02, 2.689e-01, 1.559e-01, -7.396e-02)); + r += mul(s4_5, M4(4.258e-02, -1.854e-02, -4.987e-03, 6.224e-02, 2.917e-02, 7.084e-02, 1.824e-02, 7.055e-02, 2.346e-01, -3.433e-02, -1.227e-01, 4.578e-01, 2.186e-01, 1.179e-01, 3.552e-02, 5.816e-02)); + r += mul(s4_6, M4(-1.070e-01, -1.684e-02, -2.785e-03, 8.654e-03, -1.638e-01, -1.542e-02, 6.987e-02, -2.803e-02, 6.555e-02, 5.128e-02, 1.075e-01, -8.537e-02, -1.663e-01, -5.931e-02, -5.726e-02, -9.191e-02)); + r += mul(s4_7, M4(-6.936e-02, 1.002e-03, 7.349e-02, 6.119e-02, 1.093e-01, -1.090e-01, -6.324e-02, -1.775e-01, 8.135e-02, -2.989e-01, 1.243e-02, -4.426e-01, -1.983e-02, 6.458e-02, 5.099e-02, 2.519e-02)); + r += mul(s4_8, M4(8.977e-02, -4.270e-02, -9.077e-02, 8.007e-02, 1.254e-02, -9.442e-04, 7.493e-02, -1.994e-01, 6.976e-02, -3.175e-01, 1.506e-01, 9.311e-02, 1.037e-01, 1.043e-01, -1.493e-03, 4.551e-02)); + r += mul(s5_0, M4(-1.727e-02, 1.585e-01, 1.534e-01, -5.754e-02, -5.938e-02, -1.065e-01, 9.408e-02, -8.807e-02, 9.271e-03, 8.039e-03, 3.994e-02, -5.039e-03, -3.846e-02, -4.278e-02, -1.818e-02, -3.180e-03)); + r += mul(s5_1, M4(2.943e-01, -1.033e-01, -2.299e-02, -7.260e-02, 9.817e-02, 1.076e-01, 3.952e-03, -8.467e-02, -3.766e-03, -2.596e-02, -8.277e-02, 2.235e-02, -5.010e-02, -2.123e-01, -1.041e-01, 1.164e-01)); + r += mul(s5_2, M4(-1.255e-01, 9.527e-02, 2.084e-02, -1.064e-01, 1.871e-01, 3.352e-02, 1.445e-02, -6.823e-02, 1.345e-01, -2.076e-02, -1.071e-02, 1.201e-02, -1.752e-01, -8.163e-02, 4.540e-02, 1.464e-01)); + r += mul(s5_3, M4(-6.320e-02, 4.607e-02, -1.641e-01, 1.168e-01, 2.291e-02, -1.263e-01, 1.411e-02, 1.158e-01, -2.324e-03, 2.538e-02, -2.747e-02, 3.697e-02, -1.417e-01, -3.010e-02, -5.565e-02, 2.884e-02)); + r += mul(s5_4, M4(2.759e-01, 7.719e-02, -6.069e-02, -1.723e-01, 6.530e-02, -3.680e-02, -1.286e-01, 3.704e-02, -6.962e-02, 4.937e-02, -5.575e-02, -1.117e-01, -1.436e-02, -2.980e-02, 4.777e-04, 5.934e-02)); + r += mul(s5_5, M4(9.114e-02, -1.044e-01, -1.212e-04, -1.155e-02, 1.682e-01, 4.008e-02, 2.893e-03, 4.331e-02, -6.575e-02, -9.670e-02, -5.614e-02, 4.495e-02, -2.225e-02, -2.677e-02, 2.591e-03, 7.499e-02)); + r += mul(s5_6, M4(8.086e-02, -2.553e-02, -4.962e-02, -8.640e-03, -9.971e-02, -9.166e-02, 4.908e-02, 4.199e-03, -2.085e-02, -3.249e-02, 7.374e-02, 1.215e-01, -2.563e-02, 1.172e-01, 4.091e-03, 9.290e-03)); + r += mul(s5_7, M4(2.444e-01, 9.946e-02, -2.357e-01, 2.056e-01, -8.576e-02, 4.988e-02, 1.605e-01, 6.576e-02, 1.992e-02, 1.709e-01, -1.757e-02, -1.304e-02, -1.743e-01, 5.605e-02, 4.984e-02, 5.520e-02)); + r += mul(s5_8, M4(3.324e-01, -2.642e-03, 6.995e-02, -3.095e-01, 7.170e-02, -5.416e-02, -4.709e-02, -2.787e-02, -1.225e-02, 1.133e-01, 2.788e-02, 6.324e-02, 4.011e-04, -1.079e-01, -4.384e-02, 3.440e-02)); + r += mul(s6_0, M4(6.823e-02, 1.395e-02, 2.126e-01, 1.723e-02, 2.425e-02, -5.360e-02, -7.007e-02, -1.563e-02, 1.486e-01, -1.016e-01, -2.771e-02, -1.009e-02, 7.417e-03, -8.494e-02, -2.465e-02, -8.861e-02)); + r += mul(s6_1, M4(-1.253e-01, -1.780e-02, 1.781e-02, 1.649e-01, -1.070e-01, 3.239e-02, 9.397e-02, 8.197e-02, 7.706e-02, 1.910e-02, -8.823e-03, 1.915e-01, -2.050e-02, -3.583e-02, 1.441e-01, 4.264e-03)); + r += mul(s6_2, M4(1.674e-01, 1.013e-01, -3.249e-02, 1.133e-01, -5.729e-02, -1.209e-01, 1.029e-01, -1.727e-02, -1.044e-01, -8.951e-02, 4.933e-02, 5.606e-03, -6.829e-02, 2.937e-02, 6.334e-02, -1.043e-01)); + r += mul(s6_3, M4(-7.871e-02, 7.712e-02, 5.320e-03, 1.078e-01, 5.800e-02, -6.099e-02, 3.971e-02, 1.548e-01, 8.109e-03, 7.153e-03, -1.472e-02, 5.344e-02, 2.580e-02, -1.591e-01, 8.739e-02, -3.712e-02)); + r += mul(s6_4, M4(-2.111e-03, 7.265e-03, 3.405e-02, 3.830e-02, -1.882e-01, 8.751e-02, 2.707e-01, 6.005e-02, -9.426e-02, 3.892e-02, 4.236e-02, 8.881e-02, -1.930e-02, -6.025e-02, -1.088e-01, 3.448e-02)); + r += mul(s6_5, M4(1.040e-01, -6.059e-03, -2.065e-01, 5.620e-02, 6.967e-02, 4.260e-02, -7.522e-03, 1.348e-01, -5.463e-03, -5.115e-02, 7.386e-02, -6.398e-02, -5.838e-02, 4.261e-02, 7.914e-02, 2.047e-01)); + r += mul(s6_6, M4(1.204e-01, -9.487e-03, -7.892e-03, 3.023e-02, 2.809e-02, -1.235e-01, 8.795e-03, 5.906e-02, 4.211e-02, -1.922e-01, 1.323e-01, -2.147e-02, -6.397e-02, 1.699e-02, 2.492e-02, -5.821e-02)); + r += mul(s6_7, M4(-8.937e-02, 4.861e-02, 1.152e-01, -1.752e-03, -4.958e-02, -1.301e-02, 1.152e-01, -8.827e-02, 2.432e-03, -2.854e-02, 2.425e-01, 9.628e-02, 3.210e-02, 6.959e-02, -7.081e-02, 4.659e-02)); + r += mul(s6_8, M4(1.240e-01, 6.450e-04, 1.001e-01, -3.919e-03, 9.075e-02, -7.864e-02, 6.180e-03, 6.982e-02, -2.058e-01, 5.582e-02, 2.836e-02, 3.417e-02, -6.305e-02, -2.997e-02, -9.853e-02, -7.349e-02)); + r += mul(s7_0, M4(-3.616e-02, 2.904e-02, -4.637e-02, 6.489e-02, 1.687e-02, 3.052e-02, -7.060e-02, -1.709e-02, -5.865e-02, -1.052e-01, 7.886e-03, -5.491e-02, 1.828e-02, -1.454e-02, 1.469e-01, -2.592e-03)); + r += mul(s7_1, M4(4.408e-02, -1.408e-01, 1.018e-01, 7.013e-03, -1.115e-01, 7.468e-02, 2.113e-02, 7.162e-03, 1.654e-02, -3.238e-03, -2.668e-02, -2.272e-01, -4.302e-02, -1.023e-01, 1.773e-01, 1.297e-01)); + r += mul(s7_2, M4(-1.150e-02, 1.006e-01, 3.549e-02, -6.321e-03, 5.296e-02, -1.781e-02, 2.044e-02, 1.454e-02, 5.696e-02, 9.587e-03, 6.962e-02, -5.980e-02, -4.713e-02, -5.724e-02, 8.912e-02, 5.109e-02)); + r += mul(s7_3, M4(-8.174e-02, 3.685e-03, -3.495e-02, 1.455e-01, 6.260e-02, 2.383e-03, 4.992e-02, 6.729e-02, -3.815e-02, 1.347e-01, -1.718e-02, -5.853e-04, 3.688e-02, 2.927e-02, 1.373e-01, -3.212e-02)); + r += mul(s7_4, M4(2.866e-02, 8.243e-02, 2.121e-02, 1.013e-01, -8.082e-02, -1.408e-01, 7.371e-02, 8.894e-02, -1.777e-02, 4.296e-02, -1.108e-01, -1.136e-01, -1.227e-01, -3.547e-02, -2.402e-01, 6.650e-02)); + r += mul(s7_5, M4(5.925e-02, 3.045e-03, -1.978e-02, -1.133e-01, 1.058e-01, -1.937e-02, 4.209e-02, 6.281e-02, 7.367e-02, -2.282e-02, 7.629e-02, 7.343e-02, -1.214e-01, 2.380e-01, -1.013e-01, -1.038e-01)); + r += mul(s7_6, M4(-6.004e-02, -3.998e-02, -2.468e-02, 1.327e-02, 1.390e-01, 1.489e-01, -4.934e-02, 6.800e-05, -4.161e-02, -1.543e-02, 2.262e-02, -4.679e-02, 1.088e-02, -4.917e-02, 2.046e-01, 2.502e-01)); + r += mul(s7_7, M4(-1.189e-01, -1.247e-02, -1.499e-01, -3.603e-02, -1.487e-01, -3.209e-02, 2.411e-02, -8.302e-02, -9.279e-02, 7.351e-02, -1.716e-02, 5.948e-02, 4.101e-02, -1.640e-01, 2.718e-02, 1.554e-02)); + r += mul(s7_8, M4(6.335e-02, -9.028e-02, 6.124e-02, -9.490e-02, 8.380e-02, -1.819e-01, -3.584e-02, -2.386e-02, 5.599e-02, 1.539e-02, 5.710e-03, 3.523e-02, 7.735e-02, -1.713e-02, -1.353e-01, 1.159e-01)); + r += V4(-8.380e-03, -1.580e-02, 2.399e-02, 1.683e-02); + return r; +} + +void Pass8(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = Rmp8x8(tid.x) + blockStart; + uint2 size = GetInputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = (gxy + 0.5) * pt; + + V4 s0_0 = l0(-1.0, -1.0); + V4 s0_1 = l0(0.0, -1.0); + V4 s0_2 = l0(1.0, -1.0); + V4 s0_3 = l0(-1.0, 0.0); + V4 s0_4 = l0(0.0, 0.0); + V4 s0_5 = l0(1.0, 0.0); + V4 s0_6 = l0(-1.0, 1.0); + V4 s0_7 = l0(0.0, 1.0); + V4 s0_8 = l0(1.0, 1.0); + V4 s1_0 = -max(-s0_0, 0.0); + V4 s1_1 = -max(-s0_1, 0.0); + V4 s1_2 = -max(-s0_2, 0.0); + V4 s1_3 = -max(-s0_3, 0.0); + V4 s1_4 = -max(-s0_4, 0.0); + V4 s1_5 = -max(-s0_5, 0.0); + V4 s1_6 = -max(-s0_6, 0.0); + V4 s1_7 = -max(-s0_7, 0.0); + V4 s1_8 = -max(-s0_8, 0.0); + s0_0 = max(s0_0, 0.0); + s0_1 = max(s0_1, 0.0); + s0_2 = max(s0_2, 0.0); + s0_3 = max(s0_3, 0.0); + s0_4 = max(s0_4, 0.0); + s0_5 = max(s0_5, 0.0); + s0_6 = max(s0_6, 0.0); + s0_7 = max(s0_7, 0.0); + s0_8 = max(s0_8, 0.0); + + V4 s2_0 = l1(-1.0, -1.0); + V4 s2_1 = l1(0.0, -1.0); + V4 s2_2 = l1(1.0, -1.0); + V4 s2_3 = l1(-1.0, 0.0); + V4 s2_4 = l1(0.0, 0.0); + V4 s2_5 = l1(1.0, 0.0); + V4 s2_6 = l1(-1.0, 1.0); + V4 s2_7 = l1(0.0, 1.0); + V4 s2_8 = l1(1.0, 1.0); + V4 s3_0 = -max(-s2_0, 0.0); + V4 s3_1 = -max(-s2_1, 0.0); + V4 s3_2 = -max(-s2_2, 0.0); + V4 s3_3 = -max(-s2_3, 0.0); + V4 s3_4 = -max(-s2_4, 0.0); + V4 s3_5 = -max(-s2_5, 0.0); + V4 s3_6 = -max(-s2_6, 0.0); + V4 s3_7 = -max(-s2_7, 0.0); + V4 s3_8 = -max(-s2_8, 0.0); + s2_0 = max(s2_0, 0.0); + s2_1 = max(s2_1, 0.0); + s2_2 = max(s2_2, 0.0); + s2_3 = max(s2_3, 0.0); + s2_4 = max(s2_4, 0.0); + s2_5 = max(s2_5, 0.0); + s2_6 = max(s2_6, 0.0); + s2_7 = max(s2_7, 0.0); + s2_8 = max(s2_8, 0.0); + + V4 s4_0 = l2(-1.0, -1.0); + V4 s4_1 = l2(0.0, -1.0); + V4 s4_2 = l2(1.0, -1.0); + V4 s4_3 = l2(-1.0, 0.0); + V4 s4_4 = l2(0.0, 0.0); + V4 s4_5 = l2(1.0, 0.0); + V4 s4_6 = l2(-1.0, 1.0); + V4 s4_7 = l2(0.0, 1.0); + V4 s4_8 = l2(1.0, 1.0); + V4 s5_0 = -max(-s4_0, 0.0); + V4 s5_1 = -max(-s4_1, 0.0); + V4 s5_2 = -max(-s4_2, 0.0); + V4 s5_3 = -max(-s4_3, 0.0); + V4 s5_4 = -max(-s4_4, 0.0); + V4 s5_5 = -max(-s4_5, 0.0); + V4 s5_6 = -max(-s4_6, 0.0); + V4 s5_7 = -max(-s4_7, 0.0); + V4 s5_8 = -max(-s4_8, 0.0); + s4_0 = max(s4_0, 0.0); + s4_1 = max(s4_1, 0.0); + s4_2 = max(s4_2, 0.0); + s4_3 = max(s4_3, 0.0); + s4_4 = max(s4_4, 0.0); + s4_5 = max(s4_5, 0.0); + s4_6 = max(s4_6, 0.0); + s4_7 = max(s4_7, 0.0); + s4_8 = max(s4_8, 0.0); + + V4 s6_0 = l3(-1.0, -1.0); + V4 s6_1 = l3(0.0, -1.0); + V4 s6_2 = l3(1.0, -1.0); + V4 s6_3 = l3(-1.0, 0.0); + V4 s6_4 = l3(0.0, 0.0); + V4 s6_5 = l3(1.0, 0.0); + V4 s6_6 = l3(-1.0, 1.0); + V4 s6_7 = l3(0.0, 1.0); + V4 s6_8 = l3(1.0, 1.0); + V4 s7_0 = -max(-s6_0, 0.0); + V4 s7_1 = -max(-s6_1, 0.0); + V4 s7_2 = -max(-s6_2, 0.0); + V4 s7_3 = -max(-s6_3, 0.0); + V4 s7_4 = -max(-s6_4, 0.0); + V4 s7_5 = -max(-s6_5, 0.0); + V4 s7_6 = -max(-s6_6, 0.0); + V4 s7_7 = -max(-s6_7, 0.0); + V4 s7_8 = -max(-s6_8, 0.0); + s6_0 = max(s6_0, 0.0); + s6_1 = max(s6_1, 0.0); + s6_2 = max(s6_2, 0.0); + s6_3 = max(s6_3, 0.0); + s6_4 = max(s6_4, 0.0); + s6_5 = max(s6_5, 0.0); + s6_6 = max(s6_6, 0.0); + s6_7 = max(s6_7, 0.0); + s6_8 = max(s6_8, 0.0); + + t4[gxy] = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t5[gxy] = f1(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t6[gxy] = f2(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t7[gxy] = f3(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); +} + +//!PASS 9 +//!DESC conv8 +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 +//!IN t4, t5, t6, t7 +//!OUT t0, t1, t2, t3 + +#define l0(x, y) V4(O(t4, float2(x, y))) +#define l1(x, y) V4(O(t5, float2(x, y))) +#define l2(x, y) V4(O(t6, float2(x, y))) +#define l3(x, y) V4(O(t7, float2(x, y))) + +V4 f0(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(3.124e-02, -5.130e-02, -1.787e-03, 8.818e-02, 4.984e-02, -1.121e-01, 9.460e-02, 3.339e-02, 7.946e-02, -3.062e-02, 5.278e-02, 5.440e-03, 1.711e-02, 4.054e-02, -1.141e-01, 1.288e-01)); + r += mul(s0_1, M4(5.309e-02, -3.390e-02, 1.321e-01, 1.092e-01, -1.388e-01, -8.624e-03, 2.151e-02, 1.979e-02, -8.138e-02, 7.397e-03, 1.617e-01, 1.973e-01, -4.960e-02, 1.862e-02, -3.960e-03, -8.960e-02)); + r += mul(s0_2, M4(7.778e-02, 3.204e-02, 8.291e-02, -1.327e-01, 3.065e-02, -7.843e-02, -3.681e-02, 2.162e-02, 7.884e-03, -1.019e-01, -2.793e-02, 1.007e-01, -6.140e-04, -1.387e-01, 1.230e-01, 7.260e-02)); + r += mul(s0_3, M4(-6.266e-02, -1.561e-03, 9.634e-02, -9.794e-02, 6.055e-02, -5.282e-02, 9.105e-02, 7.726e-02, -5.617e-02, 8.143e-02, 4.430e-03, -7.008e-02, -1.017e-01, -8.139e-02, -9.779e-02, 4.958e-02)); + r += mul(s0_4, M4(1.650e-02, 4.615e-02, 2.963e-03, -1.076e-01, -1.435e-01, -1.646e-01, 6.921e-02, 7.088e-02, 1.342e-01, -7.077e-02, 1.517e-01, 2.435e-02, 2.455e-01, -3.089e-02, -1.496e-02, 2.904e-02)); + r += mul(s0_5, M4(1.193e-01, -1.123e-01, -2.309e-02, -5.959e-02, 1.889e-05, 1.146e-01, 1.482e-01, 4.795e-02, 2.048e-01, 2.549e-02, -3.481e-02, -3.296e-02, 4.897e-02, -8.950e-02, -4.280e-03, -1.567e-03)); + r += mul(s0_6, M4(1.450e-01, 2.803e-02, 1.840e-02, -8.276e-02, -6.706e-02, -3.088e-02, 1.742e-02, 3.721e-02, -2.495e-02, 2.764e-02, 8.144e-03, -1.611e-01, 1.160e-01, -4.256e-03, 2.108e-02, -5.918e-02)); + r += mul(s0_7, M4(-1.328e-01, 7.529e-02, 1.391e-01, 2.563e-02, -1.192e-01, -2.107e-02, -1.355e-01, 9.936e-02, -2.000e-01, 3.467e-01, -6.629e-02, -1.384e-01, -6.821e-02, 7.839e-02, 7.809e-02, -1.136e-01)); + r += mul(s0_8, M4(-3.557e-02, -8.994e-02, 5.623e-02, -3.802e-02, 4.783e-02, 1.048e-01, -5.520e-02, -4.335e-02, -1.120e-01, -1.588e-02, -3.592e-02, -4.832e-02, 4.606e-02, 2.668e-02, 1.129e-01, -4.405e-02)); + r += mul(s1_0, M4(-8.748e-02, 1.203e-02, -5.771e-02, -3.631e-02, -5.534e-02, -7.679e-02, 2.935e-03, 1.125e-01, 4.920e-02, -1.189e-01, 4.831e-02, 6.072e-02, 2.471e-02, 1.016e-02, -2.971e-02, 5.571e-02)); + r += mul(s1_1, M4(-2.075e-02, 2.195e-01, -6.517e-02, 9.558e-02, -5.612e-02, 6.054e-02, 4.759e-02, 8.232e-02, -1.495e-01, -1.329e-02, 9.611e-02, -3.800e-02, -1.341e-01, 1.209e-02, 1.875e-01, -5.003e-03)); + r += mul(s1_2, M4(7.123e-02, 1.644e-01, -4.899e-02, 2.409e-02, 4.736e-02, -4.217e-02, -1.069e-01, 1.008e-01, -7.966e-02, -1.316e-01, -4.347e-03, 6.992e-02, -3.527e-02, -7.104e-03, -2.468e-02, -5.213e-02)); + r += mul(s1_3, M4(-9.210e-02, -3.570e-02, 3.117e-02, -1.709e-02, 6.131e-02, -8.828e-02, 4.977e-02, 9.107e-02, 1.307e-01, -9.185e-02, -7.107e-04, -1.570e-01, 3.320e-02, -4.837e-02, 9.636e-02, -1.617e-01)); + r += mul(s1_4, M4(1.071e-01, -1.831e-01, -8.204e-02, -8.219e-02, 2.204e-01, -1.851e-01, -5.428e-02, 2.497e-02, 1.762e-02, -1.438e-01, 4.264e-02, -1.996e-01, -5.739e-02, -2.194e-02, 2.351e-02, -1.555e-01)); + r += mul(s1_5, M4(1.995e-02, -7.711e-02, -3.127e-01, -1.545e-01, 1.087e-01, -6.717e-02, -3.386e-02, -3.439e-02, -6.425e-02, -1.417e-02, -9.704e-03, 3.258e-02, -1.786e-01, -7.814e-02, 7.339e-02, 1.150e-01)); + r += mul(s1_6, M4(3.818e-03, 8.071e-02, -1.410e-02, -1.407e-02, -1.744e-01, -5.763e-02, -1.927e-01, 3.831e-02, 1.584e-01, 7.533e-02, 3.399e-02, 7.658e-03, -8.963e-02, -4.506e-02, -4.843e-02, -1.250e-01)); + r += mul(s1_7, M4(-1.005e-01, 1.244e-01, -1.298e-01, 1.610e-01, -1.078e-01, 3.248e-02, -1.189e-01, 2.034e-02, -1.146e-01, 2.402e-01, 2.474e-02, -8.074e-02, 1.049e-01, 1.237e-01, 1.052e-01, 7.348e-02)); + r += mul(s1_8, M4(-9.359e-02, -1.032e-01, -1.450e-01, 4.403e-02, 6.272e-02, 1.148e-01, -2.433e-01, -5.160e-03, 7.080e-02, -2.387e-02, 4.122e-02, 7.547e-02, -9.222e-02, -9.204e-02, 1.121e-01, -6.432e-02)); + r += mul(s2_0, M4(5.519e-02, 6.806e-02, 9.748e-02, -2.149e-02, 2.170e-01, 5.902e-02, -9.839e-02, 1.249e-01, -1.353e-02, 2.961e-02, 1.827e-01, 6.570e-02, 1.371e-02, 5.585e-02, -4.444e-02, 1.533e-01)); + r += mul(s2_1, M4(4.773e-02, -1.665e-01, 5.589e-02, -8.909e-02, -2.246e-01, 3.200e-01, -1.041e-01, -8.414e-02, 1.580e-01, 3.261e-02, 5.637e-02, 1.576e-02, 2.131e-02, -3.541e-02, -4.463e-02, -2.095e-02)); + r += mul(s2_2, M4(1.036e-01, 2.589e-02, 2.904e-02, -7.143e-02, -1.696e-02, 1.774e-02, -7.084e-02, 3.157e-02, 6.868e-02, -2.945e-01, 5.057e-02, -1.008e-01, 8.910e-02, 8.413e-02, -6.435e-02, -4.051e-03)); + r += mul(s2_3, M4(-7.418e-02, -6.193e-02, 8.327e-02, 5.191e-02, 1.067e-01, -1.189e-01, -4.391e-02, -2.164e-01, 1.092e-02, 4.494e-02, 7.165e-02, -7.741e-02, 4.445e-02, -7.055e-02, -2.172e-01, -5.087e-02)); + r += mul(s2_4, M4(2.256e-02, 7.924e-02, -1.469e-02, 1.252e-02, 2.585e-02, 4.741e-01, 3.142e-02, -3.884e-03, 4.117e-02, -7.126e-02, -1.259e-01, -5.454e-02, 1.522e-01, -1.540e-01, 1.024e-01, 9.160e-04)); + r += mul(s2_5, M4(2.940e-02, -1.633e-01, -2.713e-02, 5.467e-02, -1.586e-01, 7.529e-03, 8.433e-02, 5.386e-02, 3.499e-02, -4.718e-02, 4.734e-02, 1.388e-03, -7.104e-02, -9.965e-02, 4.349e-02, 4.619e-03)); + r += mul(s2_6, M4(2.689e-02, 3.681e-02, 1.567e-01, -5.400e-02, 4.834e-02, 7.037e-02, -4.478e-02, 1.335e-01, -3.430e-02, -4.039e-02, -1.772e-02, 5.856e-02, 8.410e-02, -2.157e-01, 2.341e-02, 1.083e-02)); + r += mul(s2_7, M4(-2.147e-01, -1.803e-03, 1.678e-02, -6.482e-02, 2.857e-02, 1.997e-01, -4.290e-03, -9.494e-02, 8.619e-03, 2.462e-02, 2.078e-02, 6.033e-02, -3.540e-02, -5.141e-02, -1.394e-01, -3.610e-03)); + r += mul(s2_8, M4(1.420e-01, 1.700e-02, 7.208e-02, 6.421e-02, 8.379e-02, 4.514e-02, 7.367e-02, 6.906e-02, 2.213e-02, -7.140e-02, -7.118e-02, -4.912e-02, 1.182e-02, 1.214e-01, -1.221e-01, -5.433e-03)); + r += mul(s3_0, M4(-4.753e-02, 6.931e-02, -6.908e-02, -3.847e-02, 5.197e-03, 8.429e-03, -2.645e-02, -1.567e-02, 1.779e-01, -1.916e-02, 3.229e-02, -7.113e-02, -1.738e-02, -4.335e-02, -2.875e-02, -6.892e-02)); + r += mul(s3_1, M4(-3.704e-02, -8.374e-03, -1.469e-01, -2.289e-02, 1.303e-01, 6.911e-02, -2.123e-02, 4.849e-03, 2.334e-05, 9.183e-02, -1.740e-01, 1.321e-01, -1.002e-01, 1.355e-01, 7.750e-03, 5.359e-02)); + r += mul(s3_2, M4(-2.163e-01, -7.288e-03, -8.867e-02, -1.089e-01, -1.800e-02, 1.012e-01, 4.257e-02, -7.175e-02, -1.499e-01, 3.862e-02, -8.924e-02, 8.527e-02, -4.943e-02, 8.094e-02, 4.473e-03, -5.153e-02)); + r += mul(s3_3, M4(-1.294e-01, -9.081e-02, 1.170e-01, -6.287e-02, -2.409e-02, -7.843e-02, 1.081e-01, -1.228e-01, 6.556e-02, 3.745e-02, -1.265e-01, -1.149e-01, 7.995e-02, -1.064e-01, -4.103e-02, -1.770e-01)); + r += mul(s3_4, M4(7.123e-02, 1.010e-01, -2.841e-02, 1.940e-02, 2.383e-02, 1.075e-01, 1.142e-01, 7.052e-02, -1.260e-01, -2.067e-01, -2.080e-02, 9.393e-02, 7.256e-02, -1.270e-01, -6.239e-02, 9.681e-03)); + r += mul(s3_5, M4(-7.998e-03, -5.025e-02, 4.491e-02, 1.617e-01, 4.243e-03, 1.684e-02, 9.257e-02, 5.489e-02, -4.699e-02, -2.670e-02, 1.045e-01, -1.136e-01, 5.581e-02, -3.778e-02, 7.120e-02, 6.498e-02)); + r += mul(s3_6, M4(4.308e-03, -7.796e-03, 1.878e-01, -2.290e-01, -7.900e-02, 4.194e-02, -1.923e-02, -7.889e-02, 1.046e-01, 2.528e-02, -2.173e-01, 4.992e-02, -5.578e-02, -4.376e-02, -8.227e-02, -1.437e-01)); + r += mul(s3_7, M4(-1.714e-01, 4.549e-02, -5.604e-02, 1.178e-01, -1.652e-02, 9.276e-02, 7.400e-02, -2.862e-02, -1.776e-01, -1.282e-02, -4.909e-02, -1.218e-01, -8.023e-02, -1.684e-02, 7.598e-03, 4.162e-02)); + r += mul(s3_8, M4(9.347e-02, -8.901e-02, -1.304e-01, -6.794e-02, -4.605e-03, 5.944e-02, 1.136e-01, -9.450e-02, 2.883e-02, 5.992e-02, -6.510e-02, 1.774e-01, 1.138e-02, 5.769e-02, -1.313e-01, -5.079e-02)); + r += mul(s4_0, M4(5.049e-02, -3.380e-02, -1.054e-01, 6.772e-02, 4.020e-02, -1.913e-02, -3.185e-02, -2.899e-02, -6.698e-02, -2.485e-02, -6.283e-02, 1.835e-01, -1.031e-01, 5.999e-03, 1.490e-02, -1.784e-01)); + r += mul(s4_1, M4(-1.064e-01, -2.199e-01, 1.466e-01, 8.568e-03, 4.387e-02, -7.174e-02, -1.109e-02, 6.368e-02, 7.634e-02, 2.304e-02, 4.350e-02, -2.990e-02, -2.516e-02, -1.149e-02, -9.044e-03, -7.891e-03)); + r += mul(s4_2, M4(9.905e-02, 6.525e-02, 9.026e-02, 4.470e-02, 1.315e-03, -1.239e-02, -1.332e-01, 9.560e-02, -8.204e-02, 1.249e-01, 2.174e-01, -2.688e-02, 3.787e-02, -1.084e-01, -5.702e-02, 4.371e-02)); + r += mul(s4_3, M4(2.746e-02, 4.288e-02, -2.094e-01, -2.320e-02, -4.883e-02, -1.676e-02, -8.811e-02, 8.300e-02, 6.404e-02, 1.274e-01, 2.470e-02, -6.681e-02, 1.095e-01, 1.005e-01, 4.594e-02, -4.148e-02)); + r += mul(s4_4, M4(-1.802e-01, 5.122e-02, -5.737e-02, -1.075e-01, -1.205e-02, 3.844e-02, -4.666e-02, -1.431e-01, 2.786e-02, -3.764e-02, 5.673e-02, 6.577e-02, 4.471e-02, -1.484e-01, -5.142e-02, -5.054e-03)); + r += mul(s4_5, M4(2.149e-02, 6.915e-02, 1.145e-01, -1.189e-01, -5.877e-03, 2.061e-02, 5.708e-03, 6.259e-04, 3.541e-02, 3.211e-02, -2.670e-02, -1.668e-02, -9.188e-02, 1.706e-01, -4.118e-02, -2.265e-01)); + r += mul(s4_6, M4(9.618e-02, 6.636e-02, 7.511e-02, 9.216e-02, 1.049e-01, 4.239e-02, 4.988e-02, 2.455e-02, -9.820e-02, -1.717e-01, -2.323e-02, -8.221e-02, 1.424e-02, -2.146e-02, 2.142e-02, 8.807e-02)); + r += mul(s4_7, M4(-1.336e-02, 2.385e-02, -3.954e-02, -8.075e-03, 5.851e-02, -6.145e-02, 4.194e-02, 1.621e-01, -7.676e-02, -1.024e-01, 4.955e-02, 1.105e-01, -6.878e-03, -2.184e-02, -4.202e-03, 1.053e-01)); + r += mul(s4_8, M4(-1.642e-02, 1.181e-01, -2.130e-02, -8.524e-02, -1.581e-01, 1.508e-03, -1.421e-02, 6.296e-02, 7.533e-02, -2.317e-02, -1.147e-02, -6.421e-02, -2.778e-04, -2.823e-03, -5.921e-02, -2.012e-02)); + r += mul(s5_0, M4(8.415e-03, -6.028e-02, -1.751e-02, 1.548e-01, -3.270e-02, -4.412e-02, -9.120e-02, -8.805e-02, 4.282e-02, 5.193e-02, -1.485e-01, -2.785e-02, -2.536e-01, 1.438e-02, 2.982e-02, -2.936e-02)); + r += mul(s5_1, M4(-4.830e-02, -1.672e-01, 2.365e-01, -6.885e-02, -5.857e-02, -9.746e-02, -2.243e-02, 1.249e-01, 7.829e-02, 4.724e-03, -4.529e-03, -1.414e-01, 1.286e-01, 1.551e-02, -7.143e-02, -8.086e-02)); + r += mul(s5_2, M4(-2.138e-02, 8.716e-02, 8.449e-02, -1.476e-02, 1.615e-01, 5.934e-02, -9.844e-02, 5.758e-02, -1.017e-01, 8.195e-02, -8.195e-02, -2.562e-02, -6.803e-03, -1.538e-01, -9.863e-02, 5.102e-02)); + r += mul(s5_3, M4(-2.320e-02, 1.252e-02, 8.025e-02, 2.578e-02, 5.918e-02, -1.294e-03, -7.928e-02, 4.524e-02, -1.868e-02, 2.818e-02, -1.418e-01, 4.349e-02, 1.122e-01, 7.893e-02, 1.034e-01, 1.828e-01)); + r += mul(s5_4, M4(-1.013e-01, -7.174e-02, 4.332e-02, -1.217e-01, -6.073e-02, 1.344e-01, 2.161e-01, -3.117e-02, 3.859e-03, 2.590e-02, 4.436e-02, 4.931e-03, 1.766e-01, -5.240e-02, -9.816e-02, -7.606e-02)); + r += mul(s5_5, M4(-2.801e-02, -1.917e-02, 7.311e-02, -6.512e-02, 1.118e-01, 3.616e-02, 3.519e-02, -1.820e-01, -9.950e-02, -7.744e-03, 1.019e-01, 4.537e-02, 2.160e-02, 6.432e-02, 7.089e-02, 1.152e-02)); + r += mul(s5_6, M4(2.180e-03, 5.749e-02, 1.428e-01, 5.017e-02, 1.869e-01, 4.851e-02, 1.389e-01, 6.792e-04, 1.045e-01, -2.566e-02, -8.384e-02, -1.547e-01, 1.075e-01, 3.059e-02, -4.049e-02, 1.085e-02)); + r += mul(s5_7, M4(5.945e-02, 3.321e-02, -9.207e-02, -2.509e-02, 4.073e-02, -1.089e-01, -1.625e-02, 1.379e-02, -1.111e-03, -3.685e-02, -1.283e-01, -1.069e-01, -1.421e-01, -9.058e-02, -1.036e-01, 1.138e-01)); + r += mul(s5_8, M4(-2.612e-02, 1.336e-01, -9.740e-02, -4.554e-02, 2.979e-02, -7.052e-03, -4.852e-02, -4.545e-03, 4.801e-02, -2.438e-04, -5.739e-02, 4.333e-02, 3.390e-03, -1.577e-01, 2.403e-02, 5.650e-02)); + r += mul(s6_0, M4(3.236e-03, 5.534e-02, -4.418e-02, -4.075e-02, 3.276e-02, -3.427e-02, 2.378e-02, 6.431e-02, 7.598e-02, -7.310e-02, -5.276e-02, 3.837e-02, 6.279e-02, 3.920e-02, 1.304e-01, -2.992e-02)); + r += mul(s6_1, M4(-6.662e-02, 3.669e-02, 1.856e-01, -1.944e-02, 1.691e-01, -1.861e-01, -5.360e-02, -6.607e-03, 3.012e-02, -1.674e-02, 1.990e-02, -9.414e-03, 8.199e-02, -3.132e-02, -8.794e-02, 5.374e-02)); + r += mul(s6_2, M4(8.092e-02, -4.533e-02, -1.180e-02, -6.647e-02, -1.927e-01, -3.415e-02, -1.194e-01, 9.213e-02, 6.425e-02, -3.130e-02, -2.920e-02, -1.045e-02, -5.180e-02, 9.980e-02, -7.554e-03, -9.558e-02)); + r += mul(s6_3, M4(-5.473e-02, 9.536e-02, 2.336e-01, 2.384e-01, -3.298e-02, -6.046e-02, -4.906e-02, -4.915e-02, -7.887e-03, -5.920e-02, -1.091e-01, 7.041e-02, -8.894e-02, -4.592e-02, 2.140e-02, 1.735e-01)); + r += mul(s6_4, M4(6.208e-02, -2.608e-02, -1.066e-01, 1.094e-03, 1.958e-01, -9.529e-03, 1.481e-01, 5.728e-02, -6.199e-02, 2.168e-02, -3.580e-02, -1.589e-01, -2.392e-01, -1.200e-01, -4.925e-02, -7.520e-02)); + r += mul(s6_5, M4(6.825e-02, 9.426e-02, -5.642e-02, 4.394e-03, 5.755e-02, -1.180e-01, 5.083e-02, -8.122e-02, 5.416e-02, -3.902e-02, -2.842e-01, -1.468e-01, -1.510e-01, -9.730e-02, 8.778e-02, -8.978e-02)); + r += mul(s6_6, M4(-8.778e-02, 6.068e-02, 3.351e-02, -2.043e-01, -7.854e-02, 7.319e-02, 1.240e-02, -1.226e-01, 1.410e-02, 6.336e-03, 6.147e-02, 4.013e-02, 8.160e-02, 1.311e-01, -2.852e-02, -3.663e-02)); + r += mul(s6_7, M4(7.029e-02, -1.694e-01, 1.453e-01, 1.021e-01, -7.482e-02, -7.034e-02, 1.067e-01, -6.123e-02, 1.143e-01, -4.063e-02, -6.213e-02, -1.135e-01, -1.179e-01, -1.617e-01, -2.237e-01, -2.470e-02)); + r += mul(s6_8, M4(-5.890e-02, 8.569e-02, 1.383e-01, -6.613e-02, -5.659e-02, 6.558e-02, 1.452e-04, -2.267e-02, -3.246e-02, -9.784e-02, -1.064e-01, 3.582e-02, 5.807e-02, 5.263e-02, 2.534e-02, 9.334e-02)); + r += mul(s7_0, M4(2.126e-01, -3.965e-02, -6.040e-03, 1.445e-02, -4.166e-02, 4.742e-02, -8.664e-02, 5.568e-02, 6.662e-02, -8.717e-02, 1.718e-01, 2.674e-02, -1.090e-01, -1.022e-02, 1.726e-02, 1.323e-01)); + r += mul(s7_1, M4(8.978e-02, 6.943e-02, 1.115e-02, 6.326e-02, 1.048e-01, 1.267e-01, 5.543e-03, 1.492e-01, -9.506e-02, -3.199e-02, 1.146e-02, -3.752e-03, -7.690e-02, 1.866e-01, 2.825e-02, 5.971e-02)); + r += mul(s7_2, M4(-6.166e-02, 3.839e-02, -2.729e-02, 7.142e-02, 2.880e-02, 1.294e-01, -5.555e-02, -3.306e-03, 4.696e-02, -7.416e-03, 9.044e-02, -8.489e-02, 1.730e-02, 4.475e-02, -5.271e-02, 2.289e-02)); + r += mul(s7_3, M4(-3.251e-02, 6.556e-03, -3.212e-03, -1.414e-02, 1.450e-02, -8.137e-02, 9.345e-02, 5.045e-02, -2.866e-02, -3.191e-02, 6.239e-02, 1.788e-03, -2.839e-02, -5.030e-02, -1.687e-02, 2.879e-02)); + r += mul(s7_4, M4(-4.092e-02, -7.110e-02, -9.456e-02, 1.835e-02, 7.861e-02, 5.918e-02, 2.124e-01, 8.800e-02, -1.590e-01, 1.002e-01, 4.616e-02, -8.691e-02, 2.178e-02, -1.333e-02, 2.349e-02, -7.837e-02)); + r += mul(s7_5, M4(7.628e-02, 5.166e-02, -1.514e-02, -1.198e-01, -3.981e-02, -7.346e-03, 1.422e-01, 9.788e-02, 4.526e-02, 7.582e-02, 3.629e-02, 3.230e-01, -7.322e-02, -9.469e-02, -1.592e-02, -7.371e-02)); + r += mul(s7_6, M4(-5.822e-02, -1.253e-02, -8.465e-02, -3.110e-02, -1.102e-02, -3.346e-04, 2.758e-02, 9.501e-02, -1.179e-01, -1.198e-01, 1.321e-01, -6.008e-02, -8.633e-03, -1.439e-02, -2.763e-02, -5.576e-02)); + r += mul(s7_7, M4(9.527e-02, -7.521e-02, -5.449e-02, 8.966e-02, 9.526e-02, -1.341e-02, -1.805e-02, -4.273e-03, 1.667e-01, -2.610e-02, -3.437e-02, -3.887e-02, -1.084e-01, -9.102e-02, -1.352e-01, -3.787e-02)); + r += mul(s7_8, M4(-1.350e-01, -5.633e-02, -8.886e-02, 1.508e-01, 1.708e-02, 8.339e-02, 5.514e-02, 5.951e-03, 2.865e-02, -3.225e-02, 1.506e-01, 8.627e-02, 8.100e-02, 2.859e-03, 7.099e-02, -1.714e-02)); + r += V4(-1.959e-02, -1.607e-02, 2.678e-03, 3.647e-02); + return r; +} + +V4 f1(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(1.590e-02, -3.110e-02, -5.343e-02, 1.844e-02, 7.342e-03, 3.303e-02, 1.736e-01, 3.715e-03, -4.183e-02, -3.792e-02, 3.487e-02, 2.242e-01, -9.557e-02, -2.172e-02, 8.764e-02, -3.268e-02)); + r += mul(s0_1, M4(6.388e-02, -3.818e-02, 4.609e-02, 3.996e-02, -6.768e-02, -1.970e-02, 1.285e-02, -8.580e-02, 5.195e-02, 5.021e-02, 7.898e-03, -2.762e-02, -3.387e-04, 5.472e-02, 3.084e-02, 1.434e-01)); + r += mul(s0_2, M4(3.166e-02, -5.894e-02, 5.915e-02, 3.985e-02, -4.421e-02, -3.876e-02, 7.038e-03, -6.328e-02, -4.077e-02, -8.372e-02, 5.535e-02, 3.628e-02, -1.039e-03, -5.280e-04, -6.163e-02, 9.013e-02)); + r += mul(s0_3, M4(2.717e-02, -1.076e-02, 1.405e-02, 1.800e-01, 3.261e-02, -5.774e-03, -5.891e-02, 1.254e-01, 1.157e-01, -6.435e-02, 3.639e-02, -4.932e-02, 3.157e-02, -5.578e-02, 4.085e-02, 1.272e-01)); + r += mul(s0_4, M4(4.370e-03, -1.914e-01, 2.501e-02, 6.614e-03, 4.624e-02, 9.182e-02, -1.160e-01, 1.983e-02, -1.177e-01, -2.725e-01, -2.444e-01, -5.267e-02, 1.670e-01, 3.638e-03, 1.756e-02, 1.624e-02)); + r += mul(s0_5, M4(3.460e-02, -2.745e-01, 1.139e-01, 1.029e-01, 2.006e-02, 9.844e-02, 2.325e-02, -1.451e-02, 1.353e-01, 9.225e-02, -4.067e-02, 1.927e-01, 1.685e-01, -1.072e-02, -5.754e-02, 2.313e-02)); + r += mul(s0_6, M4(-5.847e-02, 3.581e-02, -2.012e-02, -6.789e-02, 1.380e-02, -4.919e-02, -1.183e-01, -6.287e-02, 2.998e-02, 1.971e-01, 2.000e-01, -1.879e-03, -1.302e-02, -8.027e-02, -1.116e-01, -1.198e-01)); + r += mul(s0_7, M4(3.188e-02, 1.171e-02, -2.499e-01, 2.871e-02, 8.527e-02, -8.520e-02, -2.996e-02, -2.599e-02, -4.322e-02, -8.885e-02, -1.367e-01, 6.895e-02, 6.368e-02, 2.506e-02, -2.611e-02, -1.471e-01)); + r += mul(s0_8, M4(-5.684e-02, -7.597e-02, -1.881e-01, -5.687e-02, 3.325e-02, 1.130e-01, -6.854e-02, 2.383e-03, 1.246e-01, 1.974e-02, 8.954e-02, -6.438e-03, -1.599e-01, -2.827e-02, 4.963e-02, -3.256e-02)); + r += mul(s1_0, M4(-4.162e-02, 1.987e-01, -2.119e-02, -8.128e-02, 1.152e-02, 8.857e-02, 1.907e-01, 8.436e-02, -3.137e-02, 8.293e-02, -1.405e-02, 2.704e-02, 8.655e-02, -3.663e-02, 1.099e-01, 5.457e-02)); + r += mul(s1_1, M4(-5.241e-02, 7.595e-02, -8.220e-02, -2.789e-02, 5.280e-02, 1.105e-01, 2.167e-02, 9.167e-02, -3.544e-03, -7.002e-02, 1.089e-03, 1.149e-02, -2.671e-02, -3.081e-02, -7.905e-02, 8.840e-02)); + r += mul(s1_2, M4(-1.234e-02, 9.964e-02, 8.661e-02, -1.308e-01, -6.105e-02, 6.715e-02, -2.462e-02, -9.010e-02, 1.985e-02, 1.281e-02, -2.655e-02, -5.739e-02, -1.161e-01, -2.814e-02, 6.001e-02, 2.301e-02)); + r += mul(s1_3, M4(-5.796e-02, 1.801e-01, -9.560e-02, 1.335e-01, 1.099e-02, -6.033e-02, -5.202e-02, 1.635e-01, 1.770e-02, -1.323e-01, 4.147e-02, 8.472e-02, -1.089e-01, 2.684e-01, -6.604e-02, 9.575e-02)); + r += mul(s1_4, M4(-1.456e-01, 8.853e-02, -4.921e-03, -7.301e-02, 9.708e-02, 8.831e-02, 1.773e-03, 1.722e-01, -4.105e-02, -1.195e-01, -6.714e-02, -7.913e-02, -2.420e-02, 5.004e-02, 1.116e-01, 1.293e-01)); + r += mul(s1_5, M4(-7.842e-02, 2.580e-02, 1.357e-01, -1.304e-01, -8.766e-02, -4.131e-02, -4.978e-02, 8.374e-02, 1.924e-01, -6.467e-02, -7.540e-02, -1.794e-02, 1.040e-01, -1.228e-01, -1.131e-01, -6.994e-02)); + r += mul(s1_6, M4(-2.254e-02, -7.200e-03, -5.046e-02, 9.115e-03, -1.037e-01, -3.738e-02, -8.190e-02, -1.775e-01, 3.517e-03, 3.532e-02, 7.561e-02, 4.706e-03, 4.358e-02, -7.764e-02, 8.520e-02, -1.015e-02)); + r += mul(s1_7, M4(-1.611e-02, 2.476e-01, -2.432e-02, -1.583e-02, -4.018e-02, 1.071e-01, 8.575e-02, 3.484e-02, 1.520e-01, 4.716e-03, -2.497e-02, 1.696e-01, -1.108e-01, -4.485e-02, 4.509e-02, -4.546e-02)); + r += mul(s1_8, M4(-6.576e-03, -9.228e-02, 1.373e-01, -9.949e-03, -7.073e-03, 4.201e-02, 2.402e-02, -4.963e-02, -6.371e-03, 9.453e-02, -2.234e-02, 1.741e-02, -9.118e-02, 1.014e-01, 3.908e-03, -4.366e-02)); + r += mul(s2_0, M4(6.863e-02, 3.414e-02, -2.653e-02, 2.633e-02, 1.998e-01, -2.907e-02, 1.251e-01, -7.200e-02, 7.589e-02, -1.495e-03, -1.100e-02, 9.860e-02, 1.296e-02, -9.353e-02, 2.282e-01, -1.075e-01)); + r += mul(s2_1, M4(-6.242e-02, -1.099e-01, 3.064e-02, 1.066e-01, -2.413e-03, -1.544e-01, -3.160e-02, -1.192e-01, -5.256e-02, -1.040e-01, -5.898e-02, 1.146e-02, -1.371e-01, 1.769e-01, 1.877e-01, -7.063e-02)); + r += mul(s2_2, M4(6.056e-03, 1.196e-01, 6.621e-03, 5.906e-02, 1.004e-02, 7.377e-02, -4.564e-02, 1.033e-01, 4.088e-02, 6.371e-02, 4.876e-02, -9.700e-02, 6.133e-02, 3.265e-03, 9.627e-02, -4.853e-02)); + r += mul(s2_3, M4(-8.618e-02, 2.361e-02, 2.306e-02, 2.338e-02, 1.455e-01, 2.213e-02, 2.779e-01, -1.930e-01, 1.413e-01, 3.542e-02, -1.063e-01, -2.486e-02, 1.034e-01, -1.830e-01, -3.106e-02, -2.160e-01)); + r += mul(s2_4, M4(-1.389e-02, 8.223e-02, 1.201e-01, 1.706e-01, -1.186e-01, -1.825e-01, 9.056e-03, 7.458e-02, -4.595e-02, -1.092e-01, 1.343e-01, -2.154e-02, -2.586e-01, -1.892e-03, -3.889e-03, 5.850e-03)); + r += mul(s2_5, M4(-1.136e-01, 1.982e-02, 3.331e-04, -3.975e-02, 1.881e-03, -3.929e-02, 9.770e-02, 8.461e-02, -1.051e-01, 3.264e-03, -2.358e-02, 5.921e-02, 2.493e-02, 4.953e-02, 7.066e-02, -3.072e-02)); + r += mul(s2_6, M4(1.886e-02, 1.277e-02, 3.918e-02, 7.419e-02, -6.785e-02, 3.313e-02, -1.838e-02, 2.983e-02, 5.504e-02, 2.602e-02, -6.254e-02, 3.636e-02, 1.083e-01, -1.801e-01, -8.274e-02, 1.667e-02)); + r += mul(s2_7, M4(7.890e-02, -7.701e-02, -9.203e-02, 8.960e-02, -3.452e-02, 1.039e-01, -1.697e-01, 1.136e-01, -3.416e-02, 8.475e-02, -9.041e-02, 9.931e-03, 8.038e-02, -1.292e-01, -4.484e-03, 2.517e-01)); + r += mul(s2_8, M4(-1.775e-03, 1.181e-01, 2.082e-02, 5.564e-02, 1.352e-01, 1.749e-01, -2.519e-02, -9.326e-02, 1.243e-02, -3.042e-03, -3.586e-02, -1.242e-02, -1.886e-02, 7.223e-02, 4.050e-03, -1.565e-01)); + r += mul(s3_0, M4(-1.018e-01, 1.416e-02, -1.012e-01, -2.921e-01, -3.719e-03, 4.453e-02, 6.208e-02, 6.302e-02, -2.990e-02, -5.834e-02, 2.999e-02, -5.499e-02, 1.150e-02, -1.652e-02, -4.041e-02, -4.852e-02)); + r += mul(s3_1, M4(-1.862e-01, -6.003e-02, 6.366e-03, -1.071e-01, 9.639e-02, 5.844e-03, 9.584e-02, -5.846e-03, 8.865e-02, -1.776e-01, -1.649e-01, -4.859e-03, -4.392e-02, -7.421e-02, 2.612e-03, -3.602e-02)); + r += mul(s3_2, M4(-1.813e-01, 1.274e-01, -7.660e-02, -1.141e-01, -7.542e-03, -1.065e-02, 9.674e-03, 2.061e-02, -6.439e-03, -1.230e-02, -1.123e-01, -5.417e-02, 3.718e-02, -6.594e-02, 5.417e-02, 6.099e-02)); + r += mul(s3_3, M4(-9.982e-02, 1.328e-01, -6.842e-02, 7.849e-03, 8.076e-02, 6.480e-02, 3.816e-02, -4.609e-02, -5.017e-02, 2.053e-02, -1.976e-02, -8.944e-02, 1.305e-01, -9.935e-02, 5.136e-02, -8.934e-02)); + r += mul(s3_4, M4(2.970e-02, 2.572e-01, 2.418e-01, -2.262e-02, -5.754e-02, -5.101e-02, 1.061e-01, 1.150e-02, 1.246e-01, -5.406e-02, -1.217e-01, -5.303e-02, -2.295e-03, 1.318e-01, 1.894e-01, -2.032e-01)); + r += mul(s3_5, M4(-7.984e-02, -2.415e-02, 5.613e-03, -2.421e-01, -1.214e-02, -2.134e-01, -6.162e-02, 2.134e-02, -1.086e-01, -1.858e-01, 4.495e-02, -2.550e-02, 5.153e-02, 6.359e-02, -7.375e-03, -6.049e-02)); + r += mul(s3_6, M4(-5.793e-02, 1.419e-02, -6.912e-02, 3.221e-02, -5.328e-02, 4.926e-02, 4.026e-02, 6.780e-02, -3.927e-02, 5.506e-02, 5.599e-02, -5.676e-02, 1.683e-02, -1.534e-02, -3.519e-02, -7.504e-02)); + r += mul(s3_7, M4(3.167e-02, -1.083e-01, 1.771e-01, 7.894e-02, 7.396e-03, -7.355e-02, -7.834e-02, -1.662e-01, -1.075e-01, 1.908e-01, -4.130e-02, -1.544e-01, 4.089e-02, 2.716e-02, 4.991e-02, 1.006e-01)); + r += mul(s3_8, M4(8.130e-02, -2.307e-02, 2.258e-01, -1.702e-01, -5.174e-03, 7.052e-02, -1.868e-02, -2.389e-02, 1.193e-01, -5.332e-02, 2.500e-02, 7.811e-02, 1.416e-02, 7.437e-02, 1.395e-02, -1.400e-01)); + r += mul(s4_0, M4(4.121e-02, -2.477e-02, 3.316e-02, -5.069e-02, 1.654e-02, 2.731e-02, -5.538e-02, 1.603e-02, 7.782e-02, 6.690e-02, -6.802e-02, -9.293e-02, -1.002e-02, 1.889e-02, -1.141e-01, -3.351e-02)); + r += mul(s4_1, M4(-5.217e-02, 6.161e-02, -4.193e-02, -6.295e-02, 9.101e-04, 1.352e-01, -1.879e-02, -5.071e-02, 1.265e-01, 2.192e-02, -1.221e-03, -6.355e-02, 4.557e-02, -5.211e-04, -5.280e-02, -1.080e-03)); + r += mul(s4_2, M4(8.481e-02, 7.269e-03, 7.575e-04, 7.683e-02, 3.219e-02, 2.291e-02, -1.431e-02, 6.218e-03, 6.404e-02, -1.347e-03, -1.045e-01, -5.670e-02, -9.829e-02, -1.256e-01, -6.270e-02, -3.812e-02)); + r += mul(s4_3, M4(-2.407e-01, -4.111e-02, 1.126e-01, 4.934e-02, -3.288e-02, 8.998e-02, -7.661e-02, -4.144e-04, -3.361e-03, 1.834e-02, -1.180e-01, -3.153e-02, 4.357e-02, 5.519e-02, -4.810e-02, -1.510e-02)); + r += mul(s4_4, M4(-1.391e-01, -5.460e-02, 1.079e-01, -1.000e-01, -6.315e-02, 1.372e-01, -1.143e-01, 6.703e-02, 1.145e-01, -1.889e-02, 9.035e-02, 1.031e-01, 1.311e-01, 3.571e-02, 8.697e-02, 2.037e-03)); + r += mul(s4_5, M4(9.495e-02, 9.257e-02, 9.830e-02, 1.196e-03, 2.120e-02, -7.858e-02, 2.426e-02, 5.286e-02, 1.095e-01, -3.742e-02, -1.869e-02, 3.153e-02, -4.070e-02, -6.705e-02, 7.344e-02, -2.352e-02)); + r += mul(s4_6, M4(-1.948e-01, 1.040e-01, 1.133e-01, -5.870e-02, 4.856e-02, 5.025e-02, 3.938e-02, -3.379e-02, 4.228e-02, 1.662e-01, 5.011e-02, -4.837e-02, -2.938e-02, 2.523e-03, -2.985e-02, 2.952e-03)); + r += mul(s4_7, M4(1.069e-01, -1.289e-02, -1.304e-01, 1.352e-01, 5.513e-02, -6.971e-02, -5.266e-03, 9.616e-02, 2.094e-01, -1.744e-02, 4.187e-02, 1.510e-01, 1.264e-01, 4.890e-03, -6.329e-02, -1.145e-02)); + r += mul(s4_8, M4(-1.590e-02, 3.200e-03, 8.619e-02, -1.428e-01, 8.215e-02, -9.859e-02, -4.675e-02, 2.689e-02, -3.777e-02, 1.753e-01, -7.441e-02, -3.221e-02, -2.031e-02, -1.153e-01, 1.363e-01, 1.844e-01)); + r += mul(s5_0, M4(1.515e-01, -2.016e-02, -5.047e-03, 3.562e-02, -1.864e-01, -1.531e-01, 1.729e-02, 5.759e-02, 8.454e-03, 3.906e-02, -5.451e-02, 1.320e-02, -6.558e-03, 9.826e-02, -1.302e-01, -6.306e-02)); + r += mul(s5_1, M4(-2.160e-02, 2.547e-02, 6.341e-02, -1.780e-02, 2.864e-03, -4.790e-02, 8.105e-02, -1.995e-01, -1.708e-03, 2.987e-02, 1.015e-02, -8.499e-02, -3.817e-02, 9.095e-02, -1.822e-01, -1.101e-02)); + r += mul(s5_2, M4(2.311e-02, -2.671e-02, 5.648e-02, 6.421e-02, -1.514e-01, -1.763e-01, -8.416e-02, 6.549e-02, -9.514e-02, 5.539e-02, -8.377e-04, 7.457e-02, -1.727e-01, -1.828e-01, -1.163e-01, -6.494e-02)); + r += mul(s5_3, M4(-2.060e-01, -7.085e-03, 7.469e-02, 4.907e-02, -2.527e-01, -2.608e-01, 5.313e-02, 1.760e-01, -8.158e-02, -7.513e-02, -4.557e-02, -8.827e-02, 2.459e-01, 2.116e-01, 4.177e-02, 9.706e-02)); + r += mul(s5_4, M4(-8.207e-02, 6.713e-02, -1.241e-01, -4.085e-02, -4.241e-01, -2.051e-01, -2.963e-02, -1.237e-01, 1.151e-02, 7.767e-02, 1.969e-01, -1.872e-01, 7.294e-04, -1.502e-01, 2.878e-01, 2.020e-01)); + r += mul(s5_5, M4(-1.524e-02, -8.226e-02, 1.199e-01, 9.689e-02, -3.195e-02, -5.830e-02, 3.958e-02, -1.260e-01, 1.386e-01, -2.399e-02, -1.258e-01, 5.275e-02, 1.007e-01, 4.434e-02, 1.313e-01, 2.186e-02)); + r += mul(s5_6, M4(-1.757e-01, -3.246e-02, -1.415e-02, 4.278e-02, -5.272e-02, 4.532e-02, 1.979e-02, 5.368e-03, -4.621e-02, 1.805e-02, 4.910e-02, 7.873e-02, -5.996e-02, 1.241e-01, -1.192e-01, 1.480e-01)); + r += mul(s5_7, M4(6.249e-02, -3.158e-02, -2.466e-02, -5.536e-02, -2.296e-01, -1.226e-01, 6.021e-02, 1.391e-01, -3.438e-02, -1.871e-02, -5.718e-02, 9.415e-02, 6.558e-02, 1.641e-02, -1.713e-01, -2.197e-01)); + r += mul(s5_8, M4(-3.256e-03, -3.506e-02, 1.623e-01, -6.274e-02, 7.654e-03, -1.939e-01, -4.765e-03, -1.295e-01, 9.933e-02, 2.003e-02, 9.965e-03, 5.707e-02, -2.183e-02, -2.713e-02, 1.215e-01, 9.745e-02)); + r += mul(s6_0, M4(-1.090e-01, -1.152e-01, 2.460e-03, 4.796e-02, 2.755e-02, 2.983e-02, 4.337e-02, 2.985e-02, 1.026e-01, 1.752e-02, 5.032e-02, -1.199e-01, 1.055e-01, -1.054e-01, 4.206e-02, 1.051e-01)); + r += mul(s6_1, M4(2.026e-01, -4.514e-02, -1.722e-01, 3.648e-02, -4.413e-02, 1.019e-01, 2.769e-02, -8.508e-02, 4.680e-02, 7.041e-02, -2.414e-02, 1.759e-02, -2.522e-02, 8.350e-02, -2.077e-02, 6.958e-03)); + r += mul(s6_2, M4(-3.116e-02, -1.302e-01, -1.195e-02, 2.560e-02, -9.033e-02, -5.811e-02, 3.653e-02, -3.877e-02, 6.517e-02, 2.153e-01, 1.416e-01, 1.106e-01, -1.300e-02, 1.685e-01, 2.437e-03, 1.604e-04)); + r += mul(s6_3, M4(1.487e-01, 4.270e-02, 1.526e-01, 6.293e-02, -1.350e-01, -2.366e-01, -7.172e-02, 5.710e-02, -2.211e-02, -4.022e-02, 4.349e-02, 2.249e-03, 2.711e-01, 4.068e-02, -2.228e-01, 1.218e-01)); + r += mul(s6_4, M4(-1.098e-02, -4.339e-02, 1.202e-01, -8.716e-02, -2.145e-01, -1.815e-01, -1.335e-01, -3.087e-02, -1.077e-01, -1.044e-02, -6.819e-02, -8.384e-02, 1.648e-02, 5.418e-02, 6.638e-02, -1.989e-01)); + r += mul(s6_5, M4(3.548e-02, 1.502e-01, -1.120e-02, -1.836e-02, -6.830e-02, 5.039e-02, 7.547e-02, -7.908e-02, -4.105e-02, -2.698e-01, -2.745e-02, -6.625e-02, 4.007e-02, -8.148e-02, -1.544e-01, 5.530e-02)); + r += mul(s6_6, M4(9.983e-02, -5.071e-02, 9.065e-02, -4.156e-02, -6.846e-02, -6.359e-02, 2.337e-02, -2.178e-01, 3.106e-02, -4.579e-02, 1.234e-01, -7.015e-02, 7.251e-02, -1.132e-01, 3.569e-02, 6.967e-02)); + r += mul(s6_7, M4(1.498e-01, -2.674e-02, -2.983e-02, -6.621e-02, 1.042e-02, -7.544e-02, -8.134e-03, 1.430e-01, 5.768e-02, -1.481e-02, 1.103e-02, 5.662e-02, -4.365e-03, 4.097e-02, 1.368e-01, 8.332e-02)); + r += mul(s6_8, M4(7.457e-02, -3.248e-02, -8.708e-02, -9.401e-02, 1.810e-02, -6.809e-02, 8.030e-02, -2.026e-01, 2.086e-02, 1.320e-02, -2.712e-03, 7.659e-02, 5.204e-02, 8.754e-02, 1.649e-01, 1.309e-01)); + r += mul(s7_0, M4(-3.163e-02, 3.620e-02, -3.094e-02, 1.678e-01, 5.136e-02, 9.350e-02, -1.322e-02, 6.079e-04, 1.147e-01, -1.646e-01, 5.951e-02, -6.937e-02, 4.531e-02, 4.423e-03, -1.073e-01, 2.816e-02)); + r += mul(s7_1, M4(6.097e-02, -3.721e-03, 1.297e-01, 2.043e-03, 4.694e-02, 7.640e-02, -6.045e-02, 9.431e-02, 4.080e-02, 4.768e-02, -1.154e-01, -6.744e-02, 2.081e-03, 7.172e-03, 5.627e-02, 9.120e-03)); + r += mul(s7_2, M4(-3.928e-02, -5.564e-03, 4.455e-02, 3.625e-02, -3.834e-02, -1.259e-02, -2.303e-02, -5.317e-02, 2.345e-02, -2.036e-01, -5.532e-02, -1.497e-02, -2.768e-03, 1.263e-02, -8.531e-02, -7.579e-04)); + r += mul(s7_3, M4(8.706e-03, -5.076e-02, -1.403e-01, -7.356e-02, -4.071e-02, 1.831e-01, -3.623e-02, 9.057e-02, 5.028e-02, 4.501e-02, 2.522e-02, -9.645e-02, 1.070e-01, 1.581e-02, 2.683e-02, 1.828e-02)); + r += mul(s7_4, M4(-4.991e-02, 7.480e-02, 4.730e-02, 7.487e-02, -3.904e-02, 5.020e-02, 1.929e-01, 2.029e-01, -2.223e-02, -6.129e-02, -1.038e-01, -8.008e-02, 1.022e-01, -2.192e-02, 1.285e-01, 3.667e-02)); + r += mul(s7_5, M4(-2.875e-02, -2.168e-02, -9.253e-02, 1.754e-02, 2.110e-01, 1.509e-01, 2.660e-02, 2.250e-01, 4.431e-02, -3.156e-01, -1.295e-01, 7.250e-02, -4.291e-02, -9.290e-02, 6.327e-02, 2.415e-02)); + r += mul(s7_6, M4(-5.187e-02, -8.576e-02, 4.336e-02, 9.868e-02, 6.822e-02, 9.902e-02, 1.039e-02, 4.301e-02, -5.396e-02, 1.798e-04, 1.348e-01, -7.698e-02, 2.397e-02, -7.087e-03, -4.507e-02, -8.344e-02)); + r += mul(s7_7, M4(-2.913e-02, 6.067e-02, 4.437e-02, -7.690e-02, -1.153e-01, -1.310e-02, 6.175e-02, 1.078e-01, 8.214e-02, 1.278e-01, -2.377e-01, -1.081e-01, 8.874e-02, -7.998e-02, 2.247e-02, -1.505e-02)); + r += mul(s7_8, M4(-6.634e-02, 1.412e-01, 3.046e-02, 2.276e-02, 6.834e-02, -1.809e-02, -2.036e-02, 1.500e-02, 1.822e-02, 1.063e-01, -9.810e-02, -6.572e-03, -8.266e-02, 1.112e-02, 1.025e-01, -3.403e-02)); + r += V4(-6.306e-03, 8.006e-03, 6.571e-03, 1.262e-02); + return r; +} + +V4 f2(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(3.412e-02, 3.051e-02, 8.225e-02, -1.024e-01, 7.559e-02, -1.081e-01, 2.765e-02, -9.220e-03, -8.263e-02, -1.271e-01, 2.911e-02, -4.563e-02, -1.370e-03, 1.308e-02, -5.000e-02, -8.016e-02)); + r += mul(s0_1, M4(-1.237e-01, 3.243e-02, -2.655e-03, -2.804e-02, 1.442e-01, -7.090e-02, -1.282e-01, -8.525e-02, -3.692e-02, -3.291e-02, 4.044e-02, -2.841e-02, 9.882e-02, -1.408e-01, 7.823e-02, 7.577e-02)); + r += mul(s0_2, M4(-4.266e-03, -1.042e-01, -2.781e-03, 1.189e-01, -4.019e-02, 4.284e-02, 3.647e-02, -3.917e-02, 2.519e-02, 2.713e-02, -2.684e-02, -5.395e-02, -3.944e-02, 1.009e-01, 1.614e-02, -3.454e-02)); + r += mul(s0_3, M4(5.231e-02, -1.247e-03, 4.723e-02, 3.690e-02, -3.373e-02, -8.962e-02, 6.245e-02, 7.159e-02, -9.852e-03, -1.045e-01, -3.930e-02, -7.045e-02, 3.296e-03, -2.380e-02, -6.767e-02, 1.425e-02)); + r += mul(s0_4, M4(-5.032e-02, 1.616e-01, 2.793e-02, -6.640e-04, -4.264e-02, -1.984e-03, 7.180e-02, -1.646e-01, -1.706e-03, 1.785e-01, 1.815e-01, 7.529e-02, -1.628e-02, -9.082e-02, -8.031e-04, 2.452e-02)); + r += mul(s0_5, M4(-5.703e-02, -8.024e-02, 7.129e-02, -4.083e-02, 5.158e-03, -2.297e-02, 3.771e-02, 9.569e-03, -1.159e-01, 1.244e-03, 1.017e-01, 1.623e-02, -3.491e-02, 4.120e-02, -2.884e-02, 5.029e-02)); + r += mul(s0_6, M4(-1.580e-02, -3.969e-02, 6.006e-03, 4.013e-02, -7.220e-02, -2.069e-02, 1.059e-01, -3.396e-02, 1.080e-03, -4.293e-02, -2.114e-02, 9.736e-02, -1.408e-02, -1.083e-02, -1.794e-01, 1.529e-02)); + r += mul(s0_7, M4(-8.711e-03, -6.727e-02, 1.151e-02, 8.747e-02, 1.200e-01, 4.677e-02, -2.146e-02, -5.483e-02, -1.362e-01, 7.609e-02, -6.761e-02, 2.470e-02, -1.201e-02, 2.028e-02, -5.247e-02, 2.490e-02)); + r += mul(s0_8, M4(-1.624e-01, -1.219e-02, 8.491e-03, -1.459e-02, -6.650e-02, 5.021e-02, 8.549e-02, 1.407e-01, -4.661e-02, -1.431e-02, -8.125e-02, -1.043e-01, 5.141e-02, 8.380e-02, 3.613e-02, 7.793e-02)); + r += mul(s1_0, M4(1.073e-02, 2.244e-02, 6.590e-02, -5.961e-02, -2.497e-02, 1.584e-02, 5.910e-02, -5.007e-02, 3.457e-03, -2.497e-02, 2.563e-02, -1.448e-02, 4.348e-02, -1.611e-01, 3.845e-02, -1.537e-02)); + r += mul(s1_1, M4(-2.009e-01, -3.046e-03, -9.702e-02, -1.795e-03, 2.785e-02, -3.820e-02, -7.666e-02, -6.119e-02, 8.082e-02, 2.343e-02, 3.437e-02, -2.124e-02, 4.315e-03, -3.716e-02, -5.562e-02, -1.339e-01)); + r += mul(s1_2, M4(-1.177e-01, -6.318e-02, 1.391e-01, 1.453e-01, -5.396e-02, 2.690e-02, -6.522e-02, -8.111e-02, 3.221e-02, 4.900e-02, -4.916e-02, -1.069e-01, -4.759e-02, -8.181e-02, -4.537e-02, 1.752e-02)); + r += mul(s1_3, M4(1.239e-01, 3.868e-03, 4.798e-02, 6.149e-02, -7.047e-02, -8.473e-02, -8.423e-02, 3.387e-02, -8.123e-02, -1.806e-02, -4.482e-03, -6.674e-02, 1.751e-01, -1.346e-01, -7.599e-02, -3.724e-02)); + r += mul(s1_4, M4(2.541e-02, 2.182e-01, -1.363e-01, 2.653e-01, -2.468e-01, -8.282e-03, -3.059e-02, -1.982e-01, 1.033e-01, -1.830e-02, 2.651e-01, 1.480e-01, 1.894e-01, 1.038e-01, -1.743e-01, -1.837e-02)); + r += mul(s1_5, M4(5.579e-02, 2.130e-02, 1.556e-01, -1.163e-02, -1.242e-01, -2.948e-02, 1.057e-01, 8.414e-02, -8.984e-02, 4.301e-02, 4.905e-02, 1.295e-01, 5.426e-02, 2.003e-01, -5.208e-03, 2.143e-02)); + r += mul(s1_6, M4(6.868e-02, 6.985e-02, 2.228e-02, 7.773e-02, -6.927e-02, 7.728e-02, 2.786e-02, -3.791e-02, -5.486e-02, -3.999e-02, -1.448e-02, 3.122e-02, 2.140e-01, -1.048e-02, -3.925e-02, -9.152e-02)); + r += mul(s1_7, M4(-7.144e-02, -1.071e-01, 3.923e-02, 1.559e-01, -2.798e-02, -2.728e-02, -4.025e-02, -3.240e-02, -6.226e-03, 3.900e-02, -3.820e-02, 6.497e-02, 1.878e-01, 1.847e-02, -7.449e-02, -1.152e-02)); + r += mul(s1_8, M4(1.180e-01, -7.984e-03, 1.227e-02, 1.984e-01, -1.984e-04, 3.139e-03, -8.780e-02, -4.568e-02, -5.782e-03, 1.962e-02, -1.174e-02, 7.476e-02, 5.276e-02, -5.013e-02, 8.049e-02, -3.299e-02)); + r += mul(s2_0, M4(6.274e-02, -3.757e-02, 4.032e-03, -2.051e-02, 1.837e-03, -1.974e-01, 7.678e-02, -3.274e-01, 5.467e-02, -1.360e-01, -9.023e-03, -2.604e-02, -2.287e-01, -2.250e-01, 1.458e-01, -9.307e-02)); + r += mul(s2_1, M4(3.460e-02, -2.941e-02, -6.582e-02, 6.535e-04, 2.547e-02, -6.687e-02, 1.538e-01, -1.264e-01, -5.819e-02, -8.358e-02, -1.514e-01, -1.045e-01, -8.542e-02, -2.199e-02, -4.406e-02, -3.557e-02)); + r += mul(s2_2, M4(4.431e-02, 5.701e-02, 5.174e-02, 5.303e-02, -1.493e-01, 2.189e-02, -5.680e-02, -5.502e-02, -2.864e-02, 2.450e-02, -2.843e-02, 3.108e-02, 1.450e-01, -8.313e-02, 2.644e-02, 5.104e-03)); + r += mul(s2_3, M4(1.122e-02, -2.386e-02, 1.068e-01, -1.310e-01, 1.776e-01, -2.188e-02, 8.302e-02, 4.588e-02, 1.062e-01, 3.849e-02, 7.865e-03, -3.305e-02, -1.519e-01, 2.451e-01, 1.687e-01, -2.046e-01)); + r += mul(s2_4, M4(-6.623e-02, 3.129e-02, -4.648e-02, 3.467e-02, -1.850e-01, 8.717e-02, -1.732e-01, -1.963e-02, 9.305e-02, 5.430e-02, -5.825e-02, 7.086e-02, 4.960e-02, 1.532e-01, 1.190e-01, -6.810e-02)); + r += mul(s2_5, M4(1.002e-02, 4.163e-02, 9.688e-02, -5.312e-02, -8.392e-02, -1.959e-02, -3.397e-02, -5.165e-02, 4.046e-02, 6.424e-02, -6.193e-02, 1.590e-01, -8.976e-02, -5.310e-02, 3.080e-02, 1.688e-02)); + r += mul(s2_6, M4(1.002e-01, 1.196e-01, 1.772e-02, 1.004e-01, -4.129e-02, 4.581e-02, 1.411e-01, -5.263e-02, 7.226e-02, 1.399e-03, -4.616e-02, 2.784e-02, 1.522e-01, 1.689e-01, 5.797e-02, -1.318e-01)); + r += mul(s2_7, M4(-1.265e-01, 1.050e-02, -1.032e-01, 9.369e-02, -9.171e-02, -1.025e-01, 7.834e-04, 8.201e-02, -1.705e-02, -9.497e-02, 6.001e-03, -3.667e-03, -8.255e-02, 1.664e-01, -1.120e-01, -7.231e-02)); + r += mul(s2_8, M4(-2.385e-02, -2.511e-02, -7.844e-02, 5.658e-02, -2.686e-01, -3.069e-02, -1.796e-01, -9.825e-02, 2.015e-02, -4.184e-02, -1.065e-02, 4.393e-02, -2.244e-02, -2.192e-02, 1.323e-01, 7.817e-02)); + r += mul(s3_0, M4(-4.813e-02, 1.033e-01, -1.239e-01, 6.212e-02, 1.533e-01, -2.186e-02, -2.467e-02, 3.213e-02, -1.298e-01, -1.125e-01, -9.258e-02, -1.515e-01, -7.075e-02, -2.428e-03, 7.884e-02, 6.828e-03)); + r += mul(s3_1, M4(5.317e-02, -3.419e-02, 1.167e-01, 9.786e-02, 2.063e-01, -3.340e-02, -9.822e-02, -5.292e-02, -1.874e-02, -2.924e-02, -5.514e-02, -1.358e-01, 9.802e-02, 3.840e-02, 1.669e-01, 3.956e-02)); + r += mul(s3_2, M4(4.065e-02, 2.140e-01, -8.572e-02, 1.068e-01, 7.986e-03, -3.785e-02, -1.737e-01, -1.523e-01, -7.119e-02, 7.340e-02, -2.244e-03, -2.892e-01, -5.133e-02, -6.415e-02, 1.915e-02, 6.207e-02)); + r += mul(s3_3, M4(5.088e-02, -1.354e-02, 1.215e-01, -1.009e-01, 1.794e-02, -2.970e-02, -4.194e-02, 1.087e-02, 8.814e-02, 3.610e-02, 1.164e-01, -1.416e-03, 7.457e-02, -1.265e-01, 6.800e-02, -5.186e-02)); + r += mul(s3_4, M4(2.519e-01, -9.643e-02, 1.317e-01, 1.881e-01, -7.010e-02, 1.428e-01, -2.471e-01, 8.716e-02, 5.371e-02, -4.401e-03, 1.313e-01, 2.013e-01, -3.015e-03, -7.544e-02, 8.619e-03, -9.775e-02)); + r += mul(s3_5, M4(-1.297e-02, 4.165e-03, -7.193e-03, 1.914e-02, -7.983e-02, -1.689e-02, -5.825e-02, 1.628e-02, -1.490e-01, -8.353e-02, -2.394e-02, 2.999e-01, 3.445e-02, -2.139e-02, -1.960e-01, -1.962e-02)); + r += mul(s3_6, M4(1.288e-01, 3.710e-02, 3.362e-02, 6.824e-02, 6.457e-02, 4.753e-02, -9.122e-03, 1.365e-01, -1.270e-01, -9.739e-02, -4.656e-02, -4.114e-02, -9.094e-02, 5.110e-02, 1.864e-02, 8.357e-02)); + r += mul(s3_7, M4(-5.630e-02, 4.449e-02, -1.477e-02, 2.891e-02, -5.712e-02, -6.406e-02, -9.827e-02, 1.897e-01, -4.576e-02, -1.096e-02, 1.091e-01, 1.543e-01, -2.284e-02, 7.189e-02, -7.863e-02, 3.536e-02)); + r += mul(s3_8, M4(1.807e-02, -2.432e-02, 1.106e-01, 1.279e-01, -7.728e-02, -3.835e-02, -3.217e-02, 4.699e-02, 3.170e-02, 1.835e-01, -8.757e-02, -1.042e-01, 2.634e-02, 6.942e-02, 8.071e-02, 9.839e-02)); + r += mul(s4_0, M4(-1.538e-01, -2.602e-02, 1.891e-02, -8.224e-03, -1.816e-01, 1.599e-01, 1.674e-01, 1.331e-02, 3.443e-02, 1.460e-01, 1.016e-01, -3.254e-02, 4.689e-02, -5.821e-02, -1.509e-01, 9.806e-02)); + r += mul(s4_1, M4(-1.019e-01, -9.918e-02, 6.636e-02, -1.472e-01, -6.238e-03, -1.363e-02, 1.981e-02, -1.289e-01, 7.159e-02, -1.360e-02, 5.624e-02, 4.866e-03, 1.200e-01, -3.857e-02, 8.216e-02, 1.323e-02)); + r += mul(s4_2, M4(-6.875e-02, -7.830e-03, -1.558e-02, 4.815e-02, 5.018e-02, 4.960e-02, 3.086e-02, 4.705e-02, -8.153e-02, -9.493e-02, 4.873e-02, 8.447e-02, -2.078e-01, -7.069e-02, -3.925e-02, -2.010e-03)); + r += mul(s4_3, M4(-7.266e-02, -1.724e-01, -1.151e-01, -8.214e-02, -8.020e-02, 5.829e-03, 5.332e-02, 9.192e-03, 7.477e-02, 1.010e-01, 5.775e-02, 5.201e-02, 4.840e-02, -3.975e-02, -1.657e-01, 3.806e-02)); + r += mul(s4_4, M4(-1.093e-01, -1.978e-01, 5.909e-03, -1.565e-02, 6.150e-02, -2.998e-02, -6.659e-02, 2.187e-02, -1.034e-01, 1.714e-02, -5.031e-02, 2.722e-02, 1.045e-01, -1.683e-01, 7.837e-02, -6.727e-02)); + r += mul(s4_5, M4(-8.220e-02, -7.769e-02, 7.054e-02, -3.796e-03, -4.555e-02, 6.034e-03, -1.139e-01, -1.368e-02, -5.277e-02, 1.387e-02, -7.393e-02, 1.994e-02, 1.304e-02, -1.483e-01, 2.206e-02, 7.279e-02)); + r += mul(s4_6, M4(-1.813e-02, -2.197e-02, 3.052e-02, 6.914e-02, 2.676e-02, -2.537e-02, -6.034e-02, 5.296e-02, 6.004e-02, -6.212e-02, 1.521e-01, 1.622e-01, 1.602e-03, -7.222e-02, -1.101e-02, 2.386e-02)); + r += mul(s4_7, M4(-9.607e-02, 9.544e-03, 5.164e-02, 1.002e-01, -1.144e-01, -1.255e-01, -6.142e-02, 6.983e-02, 1.422e-02, -1.975e-02, -2.548e-01, 7.490e-02, 2.403e-03, -5.085e-02, 5.349e-02, -6.616e-02)); + r += mul(s4_8, M4(-5.790e-02, -8.023e-03, 8.465e-02, 2.406e-02, 1.545e-02, 1.657e-01, -1.985e-01, 4.316e-03, 6.002e-02, -3.890e-02, 7.282e-02, 9.914e-02, 1.402e-02, -7.114e-02, 1.408e-02, -1.331e-02)); + r += mul(s5_0, M4(-3.207e-02, -4.764e-02, -1.063e-02, -5.365e-02, -2.986e-01, -7.219e-02, 1.914e-02, 2.135e-02, 1.244e-02, 1.220e-01, 3.385e-02, 8.071e-03, -4.089e-03, -6.386e-02, -6.054e-02, 9.283e-02)); + r += mul(s5_1, M4(-8.330e-02, -5.058e-02, 3.033e-02, -1.244e-01, 6.578e-03, -1.420e-01, -2.040e-01, 9.333e-02, -2.393e-03, -3.761e-02, -8.599e-02, -6.285e-02, -7.790e-02, -1.335e-01, 2.028e-02, 1.926e-02)); + r += mul(s5_2, M4(7.877e-02, -8.371e-02, -1.002e-02, -5.710e-02, -1.489e-02, 2.493e-02, -5.286e-02, -1.145e-01, -2.937e-02, 2.563e-02, -1.184e-03, -6.418e-02, -1.025e-01, -2.766e-02, 5.943e-02, -8.713e-02)); + r += mul(s5_3, M4(1.068e-01, -9.158e-02, 1.896e-03, 2.792e-02, -8.789e-02, -1.465e-01, -1.578e-01, 8.613e-02, -1.861e-01, -2.352e-03, -7.249e-02, 2.557e-02, -1.146e-02, -1.058e-01, -1.144e-01, 3.150e-02)); + r += mul(s5_4, M4(-4.093e-02, -1.068e-01, -1.299e-01, -6.073e-02, -7.316e-02, -3.338e-02, -2.007e-01, 1.125e-01, -1.403e-02, -3.370e-02, 7.929e-02, 8.132e-03, -2.240e-02, -9.686e-02, -7.760e-02, -2.562e-01)); + r += mul(s5_5, M4(-1.838e-02, -1.478e-01, 8.911e-02, -9.288e-02, -9.564e-02, 4.152e-02, 5.487e-03, 2.782e-02, 1.532e-05, -6.229e-02, 1.078e-01, -1.351e-01, 8.619e-02, -1.287e-01, 6.642e-02, 6.440e-02)); + r += mul(s5_6, M4(1.045e-01, 5.052e-02, 6.712e-02, -2.107e-02, -9.970e-02, -5.605e-02, -8.618e-02, -1.237e-01, -1.632e-02, -3.516e-02, 9.641e-02, -3.554e-02, 2.565e-02, -1.265e-01, -3.317e-02, 1.816e-01)); + r += mul(s5_7, M4(-1.556e-01, -1.894e-01, 8.868e-02, 1.173e-01, -6.388e-02, -4.323e-02, -4.345e-02, -1.665e-01, -5.893e-02, -1.059e-01, -1.366e-01, 1.528e-01, -6.229e-02, -2.086e-02, -5.327e-02, -4.549e-02)); + r += mul(s5_8, M4(8.045e-03, 4.800e-02, 5.039e-02, 7.994e-02, -1.237e-03, 2.920e-02, -9.876e-02, -1.288e-01, -5.698e-03, -5.525e-02, -3.574e-02, 9.175e-03, 6.371e-02, -1.240e-02, 1.351e-01, 6.024e-02)); + r += mul(s6_0, M4(2.828e-02, 1.965e-02, 1.490e-01, 2.001e-02, -4.527e-02, -1.522e-02, -6.560e-02, 1.899e-02, -7.161e-04, 3.954e-02, 2.182e-02, -8.346e-02, 5.627e-02, 7.930e-02, -4.601e-02, 8.760e-02)); + r += mul(s6_1, M4(8.574e-02, -3.002e-02, -2.937e-02, 1.063e-01, 2.496e-02, -9.862e-02, -1.770e-01, -1.110e-01, -9.144e-02, 1.810e-02, -1.744e-01, -5.627e-02, 1.310e-01, 4.031e-03, -1.585e-01, -4.121e-02)); + r += mul(s6_2, M4(9.241e-02, -2.275e-02, -1.309e-02, 7.213e-02, 1.015e-01, -1.783e-02, -7.431e-03, -5.384e-03, 2.948e-02, 6.340e-03, 3.754e-02, -5.846e-02, 1.207e-01, 1.802e-02, -1.990e-02, 3.674e-02)); + r += mul(s6_3, M4(-1.832e-02, -6.422e-02, 4.143e-02, -1.453e-01, -9.265e-02, 5.180e-02, 9.589e-02, -5.447e-03, 5.748e-03, -7.328e-02, -9.024e-03, 3.179e-02, -1.236e-01, -4.200e-02, 2.265e-01, -2.848e-02)); + r += mul(s6_4, M4(-7.733e-02, -7.612e-03, 6.791e-02, 2.708e-01, -1.297e-01, -3.706e-02, 5.483e-03, -1.733e-01, 2.083e-02, -7.664e-02, -1.085e-02, 6.393e-02, -1.301e-01, -7.315e-02, 6.778e-02, 5.425e-02)); + r += mul(s6_5, M4(1.491e-01, -4.559e-02, -1.056e-01, 9.649e-02, -1.003e-01, -7.416e-02, -1.937e-01, -2.114e-01, -1.697e-02, 2.611e-02, -3.463e-02, 1.848e-01, -1.343e-01, -6.746e-02, 1.171e-01, 1.465e-01)); + r += mul(s6_6, M4(1.543e-02, 5.129e-02, 1.042e-01, -7.938e-02, 3.628e-03, 2.461e-02, 1.371e-01, -4.618e-02, -9.957e-02, 8.025e-02, 6.072e-02, -3.525e-02, -9.659e-03, 9.961e-02, -6.593e-02, -1.723e-01)); + r += mul(s6_7, M4(9.083e-02, -1.791e-02, -1.005e-01, -1.208e-01, -2.040e-01, 9.235e-02, -2.770e-01, -3.079e-02, 1.300e-02, 1.283e-01, 4.077e-02, -3.577e-02, -1.172e-02, -1.946e-02, -8.694e-03, -1.229e-01)); + r += mul(s6_8, M4(1.806e-01, -1.792e-01, -3.185e-02, 2.441e-03, -3.422e-03, 8.922e-02, -4.029e-02, 6.716e-02, -3.862e-02, 8.746e-03, -4.267e-02, -1.570e-02, 1.449e-01, 2.626e-02, -7.646e-02, -5.130e-02)); + r += mul(s7_0, M4(-2.875e-02, 8.786e-02, 1.334e-02, 6.942e-02, 8.895e-02, -7.631e-02, -1.100e-01, 9.594e-02, 2.409e-02, -8.514e-02, -3.642e-02, -9.446e-02, -5.823e-02, 3.858e-02, -8.311e-02, 4.733e-02)); + r += mul(s7_1, M4(-3.546e-02, -3.038e-02, -2.878e-02, 4.740e-02, -8.561e-02, -1.373e-01, 8.296e-02, -1.290e-02, -3.045e-02, 1.038e-01, -2.055e-01, -2.954e-02, 3.776e-02, -5.471e-02, 6.002e-02, 7.293e-02)); + r += mul(s7_2, M4(6.057e-02, 1.546e-02, 5.669e-02, 3.663e-02, 4.085e-02, -2.098e-02, 7.776e-02, 6.614e-02, -1.542e-02, -9.302e-02, 5.701e-02, -9.272e-02, -1.250e-01, 4.578e-02, -8.437e-03, 9.115e-02)); + r += mul(s7_3, M4(6.185e-02, -2.202e-01, 7.967e-03, -9.857e-02, -2.723e-02, 1.841e-02, 1.273e-01, 3.254e-02, 2.590e-01, 8.602e-02, 9.159e-02, -4.988e-02, 3.447e-02, 2.103e-02, 6.784e-02, 3.961e-02)); + r += mul(s7_4, M4(2.385e-02, -7.818e-02, 1.619e-01, -3.209e-03, -9.151e-02, 1.217e-01, 6.772e-02, 1.509e-02, -2.823e-02, -8.978e-03, -1.980e-01, -1.466e-01, -9.524e-02, -5.529e-02, -7.337e-02, -6.094e-02)); + r += mul(s7_5, M4(2.174e-03, -5.178e-02, 6.162e-02, 4.149e-02, 7.712e-02, 5.177e-02, 5.302e-02, 3.632e-03, 2.082e-02, -7.131e-02, -1.286e-01, 8.588e-02, -7.042e-02, -7.842e-02, 8.844e-02, 9.351e-02)); + r += mul(s7_6, M4(-6.205e-02, 4.255e-02, -8.082e-02, -2.441e-02, -3.209e-02, -2.325e-02, 9.024e-02, 5.961e-02, 1.037e-03, -7.930e-02, 3.916e-02, 2.978e-02, -4.254e-02, -5.137e-03, 5.158e-02, -1.721e-01)); + r += mul(s7_7, M4(1.791e-02, 9.385e-02, -8.735e-02, -2.050e-02, -1.073e-01, -4.466e-03, 3.865e-02, 9.567e-02, -9.625e-03, -7.356e-03, -2.480e-01, 7.732e-04, -6.223e-02, -5.133e-02, -3.773e-02, -5.325e-02)); + r += mul(s7_8, M4(1.846e-01, 8.673e-02, -3.553e-02, -6.473e-02, -1.091e-02, 9.152e-02, 1.568e-01, 1.596e-01, 3.280e-03, 7.550e-02, -1.286e-01, -1.041e-01, 3.720e-02, 1.909e-02, 3.416e-02, 1.090e-01)); + r += V4(-1.363e-02, -2.900e-02, -2.210e-02, 1.111e-03); + return r; +} + +V4 f3(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-7.126e-02, -7.247e-04, -3.122e-02, 2.116e-02, -3.723e-02, -9.954e-02, 2.972e-02, 4.943e-02, 8.003e-03, -2.690e-02, 7.984e-02, 6.263e-02, -8.211e-02, -6.764e-02, -4.135e-02, 6.039e-02)); + r += mul(s0_1, M4(5.830e-02, 1.285e-02, 7.099e-02, -4.560e-03, 8.228e-02, -1.186e-03, -2.813e-02, 3.480e-02, 5.724e-03, 1.300e-01, -1.130e-01, 9.393e-02, -1.396e-01, -1.024e-01, 1.050e-01, -3.689e-02)); + r += mul(s0_2, M4(-1.445e-01, -1.361e-02, -1.928e-03, -7.339e-02, 4.109e-02, 3.337e-02, -7.051e-02, 4.490e-02, 1.794e-02, 1.487e-01, 6.199e-02, -3.464e-02, 9.704e-03, 1.357e-01, -1.067e-01, -3.007e-03)); + r += mul(s0_3, M4(3.851e-02, 8.292e-02, 6.964e-02, 1.097e-01, -9.202e-03, -3.033e-02, 2.125e-02, -1.388e-01, 1.225e-01, 2.218e-01, -7.917e-02, 3.989e-02, 7.261e-02, 8.114e-02, 2.188e-02, 1.304e-01)); + r += mul(s0_4, M4(-7.015e-02, -1.509e-01, 3.573e-02, 9.922e-02, -1.031e-01, -1.975e-01, -1.503e-01, -1.347e-01, -1.262e-02, 9.282e-02, 1.539e-02, 9.161e-02, -1.169e-01, -9.168e-02, 1.710e-01, -3.346e-01)); + r += mul(s0_5, M4(1.647e-02, 4.881e-02, 1.414e-01, -6.869e-02, 6.553e-02, 1.547e-01, -1.020e-01, -5.219e-02, -8.433e-02, 4.309e-02, 1.166e-01, -1.088e-01, 1.023e-02, -5.849e-02, 1.620e-02, 8.377e-02)); + r += mul(s0_6, M4(-4.575e-02, 6.467e-02, 1.170e-03, -2.556e-02, 3.145e-02, 9.286e-03, 3.206e-02, -6.519e-02, -2.116e-02, -6.765e-02, 1.437e-01, -2.522e-02, 3.575e-02, 4.578e-02, 2.849e-02, -1.786e-02)); + r += mul(s0_7, M4(-4.970e-02, -1.295e-02, 6.483e-02, 1.023e-02, 3.229e-02, -1.275e-01, 1.493e-02, -1.851e-02, 2.568e-02, -1.378e-01, -1.731e-01, 7.308e-02, -1.196e-02, -1.353e-01, -5.414e-02, -5.738e-02)); + r += mul(s0_8, M4(-5.610e-02, 1.264e-02, -2.637e-02, -6.981e-03, -7.200e-02, -3.804e-02, -3.347e-02, -6.615e-02, -6.806e-02, 1.835e-02, 5.020e-03, -5.896e-02, -8.009e-03, -5.058e-02, -2.846e-02, -3.286e-03)); + r += mul(s1_0, M4(2.826e-02, -6.972e-02, 6.646e-02, -1.937e-02, -4.960e-02, 4.112e-02, -4.586e-03, 4.412e-02, -1.050e-01, 7.587e-02, -3.497e-02, 1.925e-02, -4.369e-02, -5.518e-03, -8.173e-02, 9.181e-04)); + r += mul(s1_1, M4(8.079e-02, 5.067e-02, -4.166e-02, -1.012e-01, -4.963e-02, 3.017e-01, -1.724e-02, 8.974e-03, -3.852e-02, 1.977e-01, -4.152e-02, 5.895e-03, -1.592e-01, -3.467e-02, -1.516e-01, -2.013e-02)); + r += mul(s1_2, M4(-8.313e-02, -8.997e-02, 3.377e-02, -2.411e-02, -2.017e-01, 1.865e-01, -5.694e-02, 8.816e-02, 1.376e-01, 1.049e-01, -2.350e-02, 4.271e-02, 9.899e-02, 6.745e-02, -3.975e-02, -6.863e-02)); + r += mul(s1_3, M4(5.925e-02, 1.559e-01, 6.156e-03, 4.048e-02, 1.250e-02, 2.398e-02, 8.804e-02, -4.237e-02, -4.170e-02, 4.149e-02, 2.181e-02, 7.136e-02, 2.892e-02, 8.658e-02, 2.268e-03, -2.417e-02)); + r += mul(s1_4, M4(-4.868e-02, 7.944e-02, -1.372e-01, -2.727e-02, 2.788e-02, -1.206e-01, 8.242e-02, -3.327e-02, -2.795e-01, 1.392e-01, 1.089e-01, 2.941e-02, -1.655e-01, 8.764e-03, 1.022e-01, -1.603e-01)); + r += mul(s1_5, M4(-2.580e-02, -2.588e-02, 4.601e-02, 8.667e-02, 1.813e-02, 3.697e-02, 1.031e-01, -8.340e-02, 5.900e-02, -5.842e-02, 3.073e-02, -6.901e-02, -8.921e-02, -1.443e-01, 9.465e-02, -5.144e-02)); + r += mul(s1_6, M4(-1.368e-02, -1.491e-01, 2.026e-02, 2.348e-02, 3.990e-02, -2.543e-02, -4.058e-02, -1.896e-03, 5.931e-02, -4.988e-02, 9.193e-02, 3.546e-02, -6.484e-02, -4.291e-02, -1.792e-01, -6.140e-02)); + r += mul(s1_7, M4(2.351e-02, 6.548e-02, -1.768e-01, -9.328e-02, -1.765e-02, 2.108e-03, -2.375e-01, -3.263e-02, 1.729e-01, -2.271e-01, -5.603e-02, 4.236e-02, 8.235e-02, 8.566e-02, 2.103e-01, -1.981e-02)); + r += mul(s1_8, M4(9.506e-02, 1.263e-02, 1.854e-02, 6.688e-04, -1.127e-02, 1.481e-03, 3.282e-02, -4.943e-02, 7.309e-02, -3.832e-02, -2.619e-02, 5.873e-03, 6.340e-02, -4.196e-02, -5.152e-03, -2.681e-02)); + r += mul(s2_0, M4(-7.027e-02, -6.243e-02, -1.227e-01, 4.001e-03, -5.670e-02, 1.637e-01, 1.078e-02, 1.421e-01, -9.280e-02, 8.196e-03, 4.920e-02, -1.188e-02, -7.051e-03, -1.646e-01, 1.017e-01, 9.108e-02)); + r += mul(s2_1, M4(5.477e-02, 9.244e-02, -7.607e-02, 8.935e-02, -4.048e-02, -1.733e-01, 1.030e-01, -2.324e-01, 1.824e-02, -6.173e-02, -9.619e-02, -1.130e-02, 4.611e-01, -5.878e-02, 9.265e-02, -2.637e-02)); + r += mul(s2_2, M4(-1.460e-01, 5.308e-02, -2.754e-02, 2.505e-02, -1.231e-01, 1.615e-01, -8.279e-02, -1.995e-02, -9.777e-02, -4.318e-02, -2.021e-02, 8.769e-02, -4.796e-02, 1.218e-01, -2.690e-02, -6.418e-02)); + r += mul(s2_3, M4(1.154e-02, 1.256e-01, 8.180e-02, 2.951e-02, -3.289e-02, 2.349e-02, 1.231e-01, 3.046e-01, 3.799e-02, 6.160e-02, -1.790e-01, 2.928e-02, 9.993e-02, -1.598e-02, 2.755e-02, 8.909e-02)); + r += mul(s2_4, M4(5.434e-02, 1.287e-02, -1.480e-01, -2.214e-02, 2.240e-01, -2.299e-02, 4.142e-02, 3.686e-01, -5.318e-02, -1.182e-02, 1.023e-01, 9.137e-02, -6.045e-02, 3.257e-01, -1.219e-01, -1.693e-01)); + r += mul(s2_5, M4(-5.925e-02, -3.942e-02, 2.518e-02, 1.538e-01, 9.416e-02, 4.207e-02, 1.825e-03, -2.104e-02, -2.411e-02, 1.415e-02, -1.914e-02, 3.616e-02, -4.726e-02, 7.355e-02, -9.432e-02, -4.546e-02)); + r += mul(s2_6, M4(-7.602e-02, 1.276e-01, 1.036e-01, 6.267e-02, -8.192e-03, 1.104e-01, 3.117e-02, 7.487e-02, -1.647e-01, 3.801e-02, -3.767e-02, 1.686e-02, 8.254e-02, 2.054e-01, 1.282e-01, 1.160e-01)); + r += mul(s2_7, M4(2.513e-02, -4.661e-02, -1.646e-01, 1.059e-01, 4.162e-02, -3.316e-02, -2.061e-02, 1.450e-01, 3.720e-02, 2.961e-02, -2.373e-02, -2.018e-02, -1.052e-02, 1.730e-02, -2.290e-01, 1.025e-01)); + r += mul(s2_8, M4(-1.045e-02, 1.154e-01, -3.244e-02, -1.231e-02, 2.361e-02, 2.220e-01, -4.822e-02, 1.373e-02, 3.730e-02, 2.129e-02, 3.138e-02, -9.593e-02, 5.947e-02, 7.943e-02, -5.219e-02, -5.749e-02)); + r += mul(s3_0, M4(-3.113e-02, -1.308e-01, -1.655e-01, -2.455e-01, 2.974e-02, 9.728e-02, -3.163e-02, 4.485e-02, 5.875e-02, -3.217e-02, 6.025e-02, 4.174e-02, 1.693e-02, 1.690e-01, 2.334e-01, -6.609e-02)); + r += mul(s3_1, M4(7.416e-02, -5.665e-03, -3.190e-02, 2.151e-01, -1.274e-01, 1.052e-01, -7.711e-02, -1.091e-01, 1.016e-01, 2.149e-02, -6.221e-02, 7.541e-02, -5.916e-02, 9.233e-02, 2.208e-02, -1.398e-01)); + r += mul(s3_2, M4(-1.293e-01, -2.505e-01, -4.961e-02, -4.325e-03, -8.909e-02, -5.243e-02, -4.196e-02, -8.554e-02, -6.182e-02, -6.022e-03, -9.220e-02, 1.184e-01, -2.595e-02, 6.671e-02, 5.215e-02, 3.472e-02)); + r += mul(s3_3, M4(6.543e-02, 2.403e-02, -6.021e-02, -1.541e-01, 6.134e-02, -1.275e-03, 1.020e-01, 5.550e-02, 1.106e-01, 1.172e-01, 2.676e-02, 3.177e-02, 1.433e-01, -2.681e-02, 2.454e-01, 9.405e-05)); + r += mul(s3_4, M4(4.769e-02, 6.531e-08, -1.651e-01, -6.990e-02, 1.442e-01, 9.021e-02, -2.311e-01, 1.189e-01, 1.624e-01, 2.221e-02, -7.074e-03, -2.182e-01, 5.419e-02, 5.294e-02, 4.279e-02, -1.160e-01)); + r += mul(s3_5, M4(1.730e-01, -9.544e-02, 2.981e-02, 7.448e-02, 9.235e-02, -5.488e-02, 2.427e-02, 1.188e-02, 1.206e-01, 5.847e-02, -1.284e-01, -7.989e-02, 8.960e-02, -6.168e-02, -1.400e-01, -3.726e-02)); + r += mul(s3_6, M4(-7.833e-02, -6.758e-02, -9.048e-03, -1.075e-01, 3.901e-04, -8.693e-02, 2.570e-02, -6.323e-02, -9.009e-02, -2.170e-02, -2.026e-01, -5.850e-02, -4.147e-02, -3.386e-02, 5.005e-02, -3.887e-02)); + r += mul(s3_7, M4(-1.351e-01, -1.409e-01, -2.287e-01, 7.224e-02, 2.347e-02, -5.290e-02, 7.585e-02, 3.648e-03, -1.602e-02, -4.140e-02, 5.352e-02, -9.657e-02, -2.243e-02, -1.901e-01, -1.525e-01, -2.205e-02)); + r += mul(s3_8, M4(7.836e-02, -2.075e-02, -9.366e-03, -6.423e-02, -2.740e-02, -8.143e-02, -4.192e-02, -4.417e-02, 1.902e-01, 6.497e-02, -6.885e-02, 5.171e-02, 1.274e-02, 2.152e-03, -4.668e-02, -6.472e-02)); + r += mul(s4_0, M4(2.638e-03, -1.166e-01, -5.258e-02, -2.857e-02, 3.570e-03, 5.189e-02, -5.776e-03, 5.083e-02, 7.780e-02, 4.474e-02, -1.454e-02, 6.246e-02, -1.195e-02, 7.774e-02, 5.109e-02, 3.706e-02)); + r += mul(s4_1, M4(2.811e-02, -1.047e-01, -2.778e-02, 1.325e-03, -1.898e-01, -1.619e-01, 8.374e-02, -2.495e-02, -1.249e-01, 1.881e-02, 5.845e-02, -1.045e-02, -7.614e-02, 7.772e-02, 3.462e-03, 4.337e-03)); + r += mul(s4_2, M4(-1.081e-01, -1.844e-02, -2.425e-02, -8.712e-02, 9.626e-02, -2.870e-02, 8.200e-03, 7.206e-02, -9.789e-02, -7.239e-02, 1.054e-01, -7.063e-02, 4.623e-02, -9.341e-03, -1.331e-02, -4.766e-03)); + r += mul(s4_3, M4(-1.731e-01, -7.794e-02, -1.038e-01, -3.761e-02, 1.016e-01, -4.419e-02, -3.551e-02, -1.499e-02, -6.625e-02, 6.585e-02, 9.775e-02, 5.992e-02, 3.358e-02, -9.332e-03, 3.855e-04, -3.535e-02)); + r += mul(s4_4, M4(1.253e-01, 3.168e-02, -1.671e-02, 8.456e-02, 7.014e-02, 9.437e-02, -2.283e-02, 8.996e-02, -3.857e-02, 1.580e-01, -1.474e-01, -1.849e-02, -2.709e-03, 1.190e-01, 1.056e-01, -1.893e-02)); + r += mul(s4_5, M4(-1.756e-02, -1.646e-01, -7.868e-02, 1.745e-02, -1.479e-01, 6.384e-02, -7.011e-02, -8.907e-02, 2.050e-02, 1.111e-01, 1.083e-02, -2.870e-03, 6.436e-02, -3.034e-02, 5.931e-02, -1.074e-02)); + r += mul(s4_6, M4(1.168e-01, -3.357e-02, -1.142e-02, -2.795e-02, 2.887e-02, 3.087e-02, 2.933e-02, 8.376e-02, -1.546e-01, 3.309e-02, 4.429e-02, -1.846e-02, 5.743e-02, -3.849e-02, 1.220e-02, -5.880e-02)); + r += mul(s4_7, M4(-5.729e-02, -3.743e-02, 8.573e-04, -4.337e-03, 7.938e-02, 8.001e-02, 2.539e-02, 1.801e-02, 6.096e-02, 1.785e-01, -3.002e-01, -1.276e-01, -1.379e-02, 1.333e-01, 6.545e-02, -2.278e-02)); + r += mul(s4_8, M4(7.242e-02, -6.667e-02, 1.744e-02, -2.643e-02, 6.848e-02, 9.631e-02, 6.165e-03, -1.126e-02, -1.362e-01, -1.566e-01, 1.365e-01, -5.437e-02, -1.701e-02, 3.085e-02, 6.582e-02, 2.239e-02)); + r += mul(s5_0, M4(3.485e-02, -3.668e-02, -9.379e-02, 4.608e-02, -1.083e-01, 5.040e-02, 1.639e-01, 3.794e-02, 1.706e-01, -1.481e-01, -5.080e-02, -2.196e-02, -6.141e-02, 1.909e-02, 1.798e-01, 1.096e-01)); + r += mul(s5_1, M4(-3.518e-03, -5.432e-02, 3.152e-02, 7.982e-02, 3.017e-02, -2.535e-02, 6.478e-02, -6.047e-02, -1.980e-04, 6.107e-03, -7.009e-03, -9.743e-03, -1.016e-01, -8.004e-03, -4.981e-02, -5.635e-02)); + r += mul(s5_2, M4(-2.465e-02, 7.711e-02, 5.971e-02, -7.692e-02, -6.137e-02, -8.310e-02, -3.373e-02, -1.117e-02, 1.393e-02, -1.375e-02, 1.055e-01, -3.949e-04, 4.322e-02, -6.462e-02, -3.294e-03, -3.712e-02)); + r += mul(s5_3, M4(-2.744e-01, -4.534e-03, -8.512e-02, -6.026e-03, -2.157e-02, -2.000e-01, 9.898e-02, -1.939e-01, -6.091e-02, 5.310e-03, -7.081e-03, -6.215e-02, 9.339e-02, 1.379e-01, 7.161e-02, 9.545e-02)); + r += mul(s5_4, M4(1.003e-01, -7.804e-02, -1.457e-03, 2.427e-01, 5.836e-02, 1.779e-01, 1.408e-01, -2.114e-01, -1.353e-01, 5.005e-03, 5.650e-02, -3.772e-02, -2.707e-01, -6.220e-02, -1.619e-01, 1.186e-02)); + r += mul(s5_5, M4(7.088e-02, -1.084e-01, -2.443e-02, 2.401e-02, -1.880e-01, -2.545e-02, -1.450e-01, -1.789e-01, 9.716e-02, 2.647e-02, 1.603e-02, -4.438e-02, 5.517e-02, 1.466e-01, 2.205e-01, 6.970e-02)); + r += mul(s5_6, M4(1.056e-01, -9.803e-02, -6.850e-02, -1.242e-01, 9.164e-02, -4.308e-02, -1.765e-01, -3.360e-02, -1.304e-01, -1.477e-01, 1.813e-02, 3.482e-02, 4.066e-02, -5.432e-02, 7.176e-02, 2.660e-02)); + r += mul(s5_7, M4(1.009e-01, -1.469e-02, -1.816e-02, -4.866e-02, -7.614e-02, 4.750e-02, 1.168e-01, 4.196e-03, 5.586e-02, -2.694e-02, 1.265e-02, -6.180e-02, 5.872e-03, -1.858e-02, -7.922e-02, 3.537e-02)); + r += mul(s5_8, M4(9.445e-02, -8.611e-02, -3.937e-02, -1.209e-02, -7.928e-02, -3.819e-02, 1.253e-02, 3.102e-02, -5.391e-02, 5.845e-02, 5.602e-03, -3.271e-02, 7.669e-02, 2.167e-02, 6.229e-02, -1.607e-02)); + r += mul(s6_0, M4(-3.817e-02, 7.554e-02, 3.810e-02, 1.102e-02, -5.145e-02, -7.391e-02, -9.496e-02, -3.712e-02, -7.890e-02, -3.002e-02, -1.056e-01, -2.948e-02, 7.406e-02, 1.170e-02, -5.408e-02, -9.105e-02)); + r += mul(s6_1, M4(-6.936e-02, -6.525e-02, -4.428e-02, -1.449e-01, -1.186e-01, -2.092e-01, 8.401e-02, -2.094e-02, -8.598e-02, -3.757e-02, -7.045e-02, 3.440e-02, -6.230e-02, 8.633e-02, -3.325e-02, -8.327e-03)); + r += mul(s6_2, M4(6.608e-02, -5.417e-02, -2.856e-02, 4.913e-02, 1.676e-01, -7.598e-02, -1.182e-01, -9.989e-02, -9.116e-02, 3.218e-03, -6.444e-02, -6.054e-02, 1.373e-03, -1.817e-01, 7.257e-02, 4.189e-02)); + r += mul(s6_3, M4(-8.349e-02, -1.761e-01, 1.926e-02, -8.051e-03, 2.890e-02, 5.756e-02, 5.508e-02, 7.201e-02, -6.564e-02, 1.493e-01, 1.557e-01, -4.202e-02, -1.503e-01, -5.685e-02, 4.112e-02, -4.202e-02)); + r += mul(s6_4, M4(-2.522e-01, 9.170e-02, -5.085e-02, 4.871e-02, 1.325e-02, 5.299e-02, -9.726e-02, -1.509e-01, 2.206e-02, 5.833e-02, -1.520e-01, 1.705e-01, 1.815e-01, -8.368e-02, 7.542e-02, -4.656e-02)); + r += mul(s6_5, M4(5.460e-02, -1.326e-01, 9.804e-03, 4.768e-02, 1.948e-02, 1.841e-01, -3.059e-02, -4.378e-02, -5.324e-02, -1.720e-01, 1.640e-01, -1.044e-02, -1.189e-01, -2.363e-02, -3.141e-03, 3.028e-03)); + r += mul(s6_6, M4(-1.256e-02, -2.922e-03, -3.309e-02, 6.149e-02, 1.574e-01, 3.430e-02, -1.243e-02, 5.443e-02, 6.524e-02, -2.052e-02, -6.959e-02, 1.194e-02, 4.077e-02, -5.340e-02, -1.997e-02, 1.787e-01)); + r += mul(s6_7, M4(-2.905e-02, 2.323e-02, -7.598e-02, 3.521e-02, 1.162e-01, -8.760e-02, 8.426e-02, -4.821e-02, -1.586e-01, 3.038e-02, 1.047e-02, -4.834e-02, -5.454e-02, 8.682e-02, -5.218e-02, 4.248e-02)); + r += mul(s6_8, M4(4.779e-02, -2.518e-01, -3.873e-02, -9.263e-02, -8.541e-02, 3.432e-02, -4.013e-02, -4.646e-03, 1.992e-02, 3.899e-02, 2.601e-02, -2.114e-02, -1.431e-02, 1.219e-02, -4.987e-02, 5.297e-02)); + r += mul(s7_0, M4(-2.618e-02, 6.244e-02, 4.090e-02, -1.789e-02, -1.284e-01, 7.390e-02, -2.420e-02, -4.756e-02, 2.653e-02, 1.199e-02, 1.500e-02, -8.259e-02, -1.319e-01, 7.918e-02, 7.601e-02, 2.422e-02)); + r += mul(s7_1, M4(-1.305e-01, 4.577e-02, 1.122e-01, -2.843e-03, -3.707e-02, 5.125e-02, 1.366e-01, -1.041e-02, 5.613e-02, -9.621e-02, -8.862e-02, 7.272e-02, -3.575e-02, -5.884e-02, 7.940e-02, -9.598e-02)); + r += mul(s7_2, M4(9.856e-02, 7.648e-02, 9.986e-02, -7.698e-02, 2.003e-01, 1.748e-02, -2.276e-02, -8.972e-02, 3.264e-02, 1.762e-01, 5.533e-02, 1.765e-02, -8.475e-03, 7.884e-02, 3.955e-02, 5.335e-03)); + r += mul(s7_3, M4(-9.397e-02, -3.801e-02, 6.843e-02, 2.567e-02, 1.120e-01, 7.550e-02, 9.477e-02, 9.341e-04, 1.808e-01, 5.695e-02, -3.728e-02, 2.665e-02, 7.058e-03, -5.299e-02, 8.963e-02, -3.561e-03)); + r += mul(s7_4, M4(-3.374e-02, -1.857e-02, -3.614e-02, 8.170e-02, -1.471e-01, 2.489e-02, -1.751e-01, -7.823e-02, 6.604e-02, 1.243e-01, 2.393e-02, 3.367e-01, 1.737e-01, -1.744e-01, -5.261e-02, 6.651e-02)); + r += mul(s7_5, M4(-7.199e-02, -3.134e-02, 5.129e-02, 9.402e-02, -1.373e-01, 3.540e-02, 1.971e-02, 3.625e-02, 1.792e-01, 3.117e-02, 2.413e-02, 2.022e-02, 6.528e-03, 5.192e-02, -8.928e-02, 7.384e-02)); + r += mul(s7_6, M4(-8.301e-02, 7.934e-02, -1.039e-01, -1.798e-02, -6.817e-02, 1.008e-01, 3.415e-02, 2.928e-02, 1.649e-01, 1.101e-02, 1.681e-01, -1.356e-02, 9.431e-02, -3.286e-02, -9.072e-03, 2.947e-02)); + r += mul(s7_7, M4(5.793e-02, -8.944e-02, -2.206e-02, 1.027e-01, -4.778e-03, -2.849e-02, 1.601e-02, -2.093e-02, 1.085e-02, 1.385e-01, 7.147e-02, -2.726e-02, -1.256e-01, 7.112e-02, -8.096e-02, -9.431e-02)); + r += mul(s7_8, M4(-3.778e-02, -2.232e-03, -7.789e-02, 2.074e-02, -2.782e-02, -2.413e-02, -1.399e-01, -5.036e-02, 6.334e-02, 2.185e-02, -8.764e-02, 1.518e-02, 4.458e-02, 7.670e-02, -1.081e-03, -5.524e-02)); + r += V4(1.175e-02, 3.705e-03, 4.932e-03, 6.758e-03); + return r; +} + +void Pass9(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = Rmp8x8(tid.x) + blockStart; + uint2 size = GetInputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = (gxy + 0.5) * pt; + + V4 s0_0 = l0(-1.0, -1.0); + V4 s0_1 = l0(0.0, -1.0); + V4 s0_2 = l0(1.0, -1.0); + V4 s0_3 = l0(-1.0, 0.0); + V4 s0_4 = l0(0.0, 0.0); + V4 s0_5 = l0(1.0, 0.0); + V4 s0_6 = l0(-1.0, 1.0); + V4 s0_7 = l0(0.0, 1.0); + V4 s0_8 = l0(1.0, 1.0); + V4 s1_0 = -max(-s0_0, 0.0); + V4 s1_1 = -max(-s0_1, 0.0); + V4 s1_2 = -max(-s0_2, 0.0); + V4 s1_3 = -max(-s0_3, 0.0); + V4 s1_4 = -max(-s0_4, 0.0); + V4 s1_5 = -max(-s0_5, 0.0); + V4 s1_6 = -max(-s0_6, 0.0); + V4 s1_7 = -max(-s0_7, 0.0); + V4 s1_8 = -max(-s0_8, 0.0); + s0_0 = max(s0_0, 0.0); + s0_1 = max(s0_1, 0.0); + s0_2 = max(s0_2, 0.0); + s0_3 = max(s0_3, 0.0); + s0_4 = max(s0_4, 0.0); + s0_5 = max(s0_5, 0.0); + s0_6 = max(s0_6, 0.0); + s0_7 = max(s0_7, 0.0); + s0_8 = max(s0_8, 0.0); + + V4 s2_0 = l1(-1.0, -1.0); + V4 s2_1 = l1(0.0, -1.0); + V4 s2_2 = l1(1.0, -1.0); + V4 s2_3 = l1(-1.0, 0.0); + V4 s2_4 = l1(0.0, 0.0); + V4 s2_5 = l1(1.0, 0.0); + V4 s2_6 = l1(-1.0, 1.0); + V4 s2_7 = l1(0.0, 1.0); + V4 s2_8 = l1(1.0, 1.0); + V4 s3_0 = -max(-s2_0, 0.0); + V4 s3_1 = -max(-s2_1, 0.0); + V4 s3_2 = -max(-s2_2, 0.0); + V4 s3_3 = -max(-s2_3, 0.0); + V4 s3_4 = -max(-s2_4, 0.0); + V4 s3_5 = -max(-s2_5, 0.0); + V4 s3_6 = -max(-s2_6, 0.0); + V4 s3_7 = -max(-s2_7, 0.0); + V4 s3_8 = -max(-s2_8, 0.0); + s2_0 = max(s2_0, 0.0); + s2_1 = max(s2_1, 0.0); + s2_2 = max(s2_2, 0.0); + s2_3 = max(s2_3, 0.0); + s2_4 = max(s2_4, 0.0); + s2_5 = max(s2_5, 0.0); + s2_6 = max(s2_6, 0.0); + s2_7 = max(s2_7, 0.0); + s2_8 = max(s2_8, 0.0); + + V4 s4_0 = l2(-1.0, -1.0); + V4 s4_1 = l2(0.0, -1.0); + V4 s4_2 = l2(1.0, -1.0); + V4 s4_3 = l2(-1.0, 0.0); + V4 s4_4 = l2(0.0, 0.0); + V4 s4_5 = l2(1.0, 0.0); + V4 s4_6 = l2(-1.0, 1.0); + V4 s4_7 = l2(0.0, 1.0); + V4 s4_8 = l2(1.0, 1.0); + V4 s5_0 = -max(-s4_0, 0.0); + V4 s5_1 = -max(-s4_1, 0.0); + V4 s5_2 = -max(-s4_2, 0.0); + V4 s5_3 = -max(-s4_3, 0.0); + V4 s5_4 = -max(-s4_4, 0.0); + V4 s5_5 = -max(-s4_5, 0.0); + V4 s5_6 = -max(-s4_6, 0.0); + V4 s5_7 = -max(-s4_7, 0.0); + V4 s5_8 = -max(-s4_8, 0.0); + s4_0 = max(s4_0, 0.0); + s4_1 = max(s4_1, 0.0); + s4_2 = max(s4_2, 0.0); + s4_3 = max(s4_3, 0.0); + s4_4 = max(s4_4, 0.0); + s4_5 = max(s4_5, 0.0); + s4_6 = max(s4_6, 0.0); + s4_7 = max(s4_7, 0.0); + s4_8 = max(s4_8, 0.0); + + V4 s6_0 = l3(-1.0, -1.0); + V4 s6_1 = l3(0.0, -1.0); + V4 s6_2 = l3(1.0, -1.0); + V4 s6_3 = l3(-1.0, 0.0); + V4 s6_4 = l3(0.0, 0.0); + V4 s6_5 = l3(1.0, 0.0); + V4 s6_6 = l3(-1.0, 1.0); + V4 s6_7 = l3(0.0, 1.0); + V4 s6_8 = l3(1.0, 1.0); + V4 s7_0 = -max(-s6_0, 0.0); + V4 s7_1 = -max(-s6_1, 0.0); + V4 s7_2 = -max(-s6_2, 0.0); + V4 s7_3 = -max(-s6_3, 0.0); + V4 s7_4 = -max(-s6_4, 0.0); + V4 s7_5 = -max(-s6_5, 0.0); + V4 s7_6 = -max(-s6_6, 0.0); + V4 s7_7 = -max(-s6_7, 0.0); + V4 s7_8 = -max(-s6_8, 0.0); + s6_0 = max(s6_0, 0.0); + s6_1 = max(s6_1, 0.0); + s6_2 = max(s6_2, 0.0); + s6_3 = max(s6_3, 0.0); + s6_4 = max(s6_4, 0.0); + s6_5 = max(s6_5, 0.0); + s6_6 = max(s6_6, 0.0); + s6_7 = max(s6_7, 0.0); + s6_8 = max(s6_8, 0.0); + + t0[gxy] = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t1[gxy] = f1(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t2[gxy] = f2(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t3[gxy] = f3(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); +} + +//!PASS 10 +//!DESC conv9 +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 +//!IN t0, t1, t2, t3 +//!OUT t4, t5, t6, t7 + +#define l0(x, y) V4(O(t0, float2(x, y))) +#define l1(x, y) V4(O(t1, float2(x, y))) +#define l2(x, y) V4(O(t2, float2(x, y))) +#define l3(x, y) V4(O(t3, float2(x, y))) + +V4 f0(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-3.746e-02, -1.063e-02, -8.489e-02, -3.248e-02, 5.400e-02, 4.809e-01, -2.443e-03, 5.665e-01, -3.019e-02, -2.483e-02, 4.610e-02, 1.613e-01, -5.230e-02, 5.904e-02, 8.962e-02, 5.099e-03)); + r += mul(s0_1, M4(-2.674e-02, -7.768e-03, 6.571e-02, 8.847e-02, -3.693e-01, -3.040e-01, 1.111e-01, 3.321e-01, -3.900e-02, -5.431e-02, -7.441e-02, 2.141e-02, 3.205e-02, 1.226e-01, -8.272e-02, 8.495e-02)); + r += mul(s0_2, M4(1.091e-01, 3.933e-02, -3.238e-03, 6.477e-02, -3.042e-02, 4.195e-01, 1.768e-03, -8.476e-02, -6.201e-02, 2.166e-03, 4.313e-02, 5.970e-02, 1.758e-01, -7.663e-02, 1.494e-01, 4.458e-02)); + r += mul(s0_3, M4(-1.272e-02, 5.261e-02, 9.092e-02, -7.005e-03, 9.554e-02, 3.528e-02, -4.595e-01, -2.179e-01, 1.709e-01, 1.809e-02, -2.651e-02, 6.484e-02, -4.482e-02, 1.309e-01, -6.953e-04, -1.990e-02)); + r += mul(s0_4, M4(-9.892e-03, -1.371e-01, -1.750e-01, 2.506e-03, -1.380e-01, 1.237e-01, 3.433e-01, 1.102e-01, 8.615e-02, 3.165e-02, 1.141e-01, 6.900e-02, -5.708e-02, -2.790e-01, -1.438e-01, -4.015e-02)); + r += mul(s0_5, M4(5.655e-02, 8.936e-02, 3.225e-02, -1.050e-01, 1.298e-01, -2.953e-01, -8.823e-02, 1.979e-01, 2.702e-02, 1.291e-01, -7.544e-02, 4.281e-02, -7.200e-02, 6.900e-02, 8.878e-02, -1.220e-01)); + r += mul(s0_6, M4(9.888e-02, -1.017e-02, 2.095e-02, -3.808e-02, -8.481e-01, 3.486e-01, -3.861e-01, -6.509e-01, -7.530e-02, 5.185e-02, 4.696e-02, 3.270e-02, -8.286e-02, 7.794e-02, -2.126e-02, 9.819e-03)); + r += mul(s0_7, M4(-2.224e-02, -6.169e-02, -1.213e-01, -4.395e-02, 1.505e-01, -5.035e-02, 2.646e-01, 3.699e-02, -1.477e-01, 4.680e-02, -9.876e-02, 1.034e-01, 4.846e-02, -3.061e-02, 3.804e-02, -1.026e-01)); + r += mul(s0_8, M4(1.750e-02, 3.698e-02, -3.884e-02, -1.252e-02, -1.126e-01, -2.019e-02, 2.261e-01, -1.821e-02, -3.083e-02, 8.816e-02, 3.508e-02, 9.136e-05, -1.009e-02, 3.874e-03, -3.811e-02, 8.129e-02)); + r += mul(s1_0, M4(-4.230e-03, -2.298e-04, 1.523e-01, -6.054e-02, -6.622e-02, -2.713e-02, -6.034e-02, -6.909e-02, -6.743e-02, -1.200e-01, -3.476e-02, -2.414e-02, -7.619e-02, -1.420e-01, -5.435e-02, 4.688e-02)); + r += mul(s1_1, M4(1.250e-01, 1.436e-01, 8.983e-02, 3.571e-01, -2.948e-02, -3.203e-02, -2.803e-02, -4.456e-02, -1.587e-01, 5.683e-02, 1.874e-01, -1.582e-01, 1.688e-03, -1.092e-02, -3.675e-02, -1.959e-02)); + r += mul(s1_2, M4(-2.990e-03, 1.935e-01, 3.609e-02, 1.016e-02, -2.889e-02, 2.713e-02, -2.222e-02, -9.948e-02, 1.432e-02, 6.372e-02, -6.483e-02, -1.950e-01, 1.130e-01, -2.562e-03, 6.376e-02, -1.279e-01)); + r += mul(s1_3, M4(-6.518e-02, 6.288e-02, 2.188e-01, 6.239e-02, 3.956e-03, -7.743e-03, 1.854e-01, -8.057e-02, 3.433e-02, -3.217e-02, 5.964e-02, -1.372e-01, 9.831e-02, -7.300e-02, 1.069e-01, -3.985e-02)); + r += mul(s1_4, M4(4.612e-02, -2.329e-01, -1.418e-01, 6.836e-02, 2.446e-02, 1.418e-01, 1.809e-02, -4.002e-02, -3.699e-02, 2.437e-01, -1.954e-01, 1.403e-01, 7.050e-02, 4.695e-02, -2.736e-02, 3.702e-02)); + r += mul(s1_5, M4(1.983e-03, -9.384e-02, -1.356e-01, -1.143e-01, 4.695e-02, -9.757e-02, -3.093e-03, -5.178e-02, 9.466e-03, -1.137e-01, -1.644e-01, -9.603e-02, 1.446e-01, 1.238e-01, -1.503e-01, -6.958e-02)); + r += mul(s1_6, M4(-6.411e-02, 5.986e-02, 3.339e-02, -3.836e-02, 8.848e-02, 6.235e-03, 5.062e-02, -6.397e-02, 5.037e-02, 5.440e-04, -5.456e-02, -9.788e-02, 2.729e-02, 5.484e-02, -8.123e-02, -1.712e-03)); + r += mul(s1_7, M4(-2.417e-03, -1.044e-01, -2.962e-02, -1.297e-01, -8.800e-02, 1.249e-01, -1.124e-01, 4.114e-02, -4.990e-02, 5.685e-02, -2.012e-01, 1.477e-01, 3.261e-02, 6.424e-02, 1.169e-01, -6.667e-02)); + r += mul(s1_8, M4(-3.504e-02, -1.125e-01, -9.715e-02, -6.348e-02, -7.047e-04, 1.460e-01, -2.088e-02, 3.352e-02, -1.966e-02, -7.403e-03, 7.786e-02, -8.478e-02, -2.298e-02, 1.993e-01, -8.736e-02, 7.286e-03)); + r += mul(s2_0, M4(7.822e-02, 3.222e-02, -1.139e-02, -1.078e-01, -6.741e-02, 4.379e-02, -7.163e-02, -1.814e-01, 4.628e-02, -6.410e-02, -6.759e-02, 1.772e-01, -5.401e-02, 8.797e-02, -1.319e-01, -1.376e-01)); + r += mul(s2_1, M4(1.437e-02, 1.314e-02, 1.388e-01, 1.275e-01, 5.123e-02, 1.599e-01, 2.074e-01, 8.537e-02, 3.981e-02, -1.166e-01, 1.190e-01, -4.606e-05, 2.425e-01, -3.455e-02, 7.800e-02, 3.116e-02)); + r += mul(s2_2, M4(-2.019e-02, 1.103e-01, -8.463e-02, 8.798e-02, 6.113e-02, 8.817e-02, 6.368e-02, -9.119e-02, -2.864e-02, -1.606e-01, 1.183e-02, -1.085e-01, 9.193e-02, -8.555e-02, 7.734e-02, -2.207e-02)); + r += mul(s2_3, M4(2.104e-02, 1.017e-01, 1.313e-01, 3.233e-02, 1.792e-01, 4.766e-02, -1.387e-01, -4.995e-02, -6.797e-02, 1.045e-01, -8.918e-02, 6.009e-02, -4.944e-02, 3.522e-02, 8.032e-02, -1.131e-01)); + r += mul(s2_4, M4(-1.039e-02, -8.695e-02, -1.877e-03, 8.820e-02, 6.811e-02, 4.012e-01, -7.742e-02, -1.753e-01, 1.521e-01, 1.809e-02, -1.851e-01, -1.758e-01, -2.625e-02, 8.133e-02, 8.653e-02, -2.330e-02)); + r += mul(s2_5, M4(-6.217e-02, -1.063e-01, -5.858e-02, 9.908e-02, 2.980e-01, 1.273e-01, 2.495e-01, -2.617e-01, 3.477e-02, -8.927e-02, 4.738e-02, -8.602e-03, 6.325e-03, -2.658e-02, 8.764e-02, -1.869e-03)); + r += mul(s2_6, M4(1.724e-02, -3.356e-02, -5.360e-02, -2.070e-02, -1.485e-02, 5.440e-04, 4.944e-02, -1.195e-01, -1.795e-01, -9.285e-02, 6.373e-02, 1.272e-01, 1.539e-01, -3.187e-02, -2.463e-02, -2.533e-02)); + r += mul(s2_7, M4(9.800e-02, 4.864e-02, -1.405e-01, 4.289e-02, 5.748e-02, -1.004e-01, 3.591e-01, -1.286e-01, -2.668e-02, -1.087e-01, -6.929e-03, -1.889e-01, 2.281e-02, 6.056e-02, -2.504e-02, 4.111e-02)); + r += mul(s2_8, M4(9.116e-03, -7.397e-02, -2.395e-02, -2.543e-02, 1.348e-01, 2.859e-01, 1.487e-02, 1.299e-01, -2.400e-02, -7.597e-02, 9.158e-02, -6.117e-02, 8.673e-02, -5.555e-02, -8.472e-02, -5.237e-02)); + r += mul(s3_0, M4(-2.097e-02, -8.450e-02, 4.401e-02, -5.289e-02, -3.726e-02, -1.816e-03, -6.092e-02, -1.044e-01, 8.542e-02, -7.704e-02, 1.390e-02, 1.826e-02, -3.318e-02, 2.143e-01, 2.861e-02, 1.425e-01)); + r += mul(s3_1, M4(8.973e-02, -1.307e-01, -1.220e-01, -6.823e-02, 1.085e-02, -3.867e-02, 6.683e-02, 9.690e-02, 1.379e-02, 6.643e-02, -9.761e-02, 2.067e-02, -2.649e-02, 1.353e-01, -1.133e-01, 9.359e-03)); + r += mul(s3_2, M4(-6.108e-02, 6.151e-02, 4.260e-02, 5.874e-02, 1.029e-02, -1.497e-01, 3.234e-02, -3.021e-02, -7.880e-02, -1.415e-01, 1.451e-02, 4.842e-02, -7.586e-02, 5.174e-02, -1.371e-01, -6.023e-02)); + r += mul(s3_3, M4(-4.003e-02, 5.891e-02, 4.206e-02, 2.595e-02, -4.624e-04, -5.921e-02, -9.890e-02, -1.363e-01, -5.014e-02, 6.857e-02, -1.145e-01, -7.750e-02, 1.879e-01, 2.044e-01, 3.940e-02, 9.905e-02)); + r += mul(s3_4, M4(-1.609e-01, -1.548e-01, -9.780e-02, -7.351e-03, -1.326e-01, 1.169e-01, -2.296e-02, 1.092e-01, 6.315e-03, 5.901e-02, -1.063e-01, 8.840e-02, 1.121e-01, -8.684e-02, -7.752e-02, -1.278e-01)); + r += mul(s3_5, M4(2.414e-02, -9.160e-02, -3.597e-02, 2.934e-02, -7.608e-04, 1.769e-01, 1.248e-01, 5.430e-02, 4.766e-02, -9.389e-03, 1.599e-01, 3.968e-02, 1.360e-01, -1.909e-01, 7.670e-02, 2.346e-01)); + r += mul(s3_6, M4(-1.540e-01, -1.227e-01, -5.861e-02, 5.111e-03, -3.895e-02, -7.678e-02, -4.987e-02, -4.852e-02, 5.709e-02, 4.096e-03, -2.075e-02, 5.795e-02, -9.926e-02, -1.391e-01, 1.977e-02, -3.418e-02)); + r += mul(s3_7, M4(7.224e-03, 1.367e-01, -1.950e-01, -1.376e-02, -8.416e-02, -7.056e-02, 3.701e-02, -5.724e-02, 1.451e-02, 1.350e-02, -6.172e-02, -1.460e-01, -6.291e-02, 3.015e-03, -9.637e-02, -4.193e-02)); + r += mul(s3_8, M4(-2.196e-02, 4.590e-02, 3.496e-02, 7.020e-03, 2.558e-02, 3.325e-02, -7.600e-02, 6.062e-02, 4.024e-02, 6.211e-02, 5.333e-02, -1.504e-02, -7.808e-03, 1.016e-02, -2.206e-01, 5.911e-02)); + r += mul(s4_0, M4(1.141e-01, 5.394e-02, -1.343e-01, 2.928e-02, 7.011e-02, 4.775e-02, -4.685e-02, 6.133e-02, 1.138e-01, 4.619e-02, 1.735e-01, 1.146e-01, -9.044e-02, -5.406e-02, -7.782e-02, -2.691e-02)); + r += mul(s4_1, M4(-7.985e-02, -2.100e-03, -7.870e-02, -1.137e-01, -1.776e-01, 2.370e-01, -6.002e-02, -2.018e-02, -2.921e-02, 4.966e-02, -1.691e-01, -1.508e-01, -1.700e-01, -9.586e-02, -6.593e-02, -8.877e-02)); + r += mul(s4_2, M4(6.554e-02, 8.899e-02, -6.075e-02, 1.546e-01, -4.404e-02, -2.603e-02, 1.095e-01, -3.720e-02, -1.349e-01, -1.897e-02, 1.437e-01, -7.739e-02, -2.546e-02, -4.693e-02, -7.665e-02, -1.305e-01)); + r += mul(s4_3, M4(-5.318e-02, 4.581e-02, 1.697e-02, 1.420e-01, 8.522e-02, -1.481e-01, 8.667e-02, -6.982e-02, -1.240e-01, 3.817e-02, -1.287e-01, 2.916e-01, -1.577e-01, 4.871e-02, 2.518e-02, -4.820e-02)); + r += mul(s4_4, M4(-1.995e-02, -2.088e-01, -2.847e-01, 3.681e-02, -2.316e-01, 1.783e-02, 3.289e-02, -1.353e-01, -1.544e-01, -2.805e-01, -4.242e-02, -3.656e-02, 1.272e-01, -2.347e-02, -1.163e-01, -1.299e-01)); + r += mul(s4_5, M4(-6.111e-02, -2.113e-01, -1.109e-01, -2.393e-01, 1.231e-03, -8.862e-02, 1.512e-03, 4.795e-03, 8.128e-02, -4.732e-02, 9.545e-02, -1.428e-01, 7.313e-02, -1.712e-01, 8.908e-02, -5.289e-02)); + r += mul(s4_6, M4(-2.565e-02, 9.523e-02, 2.868e-02, 9.607e-02, 8.456e-02, -6.568e-02, -3.945e-02, 2.131e-02, 9.711e-02, -1.713e-01, -7.788e-02, -6.405e-02, 1.443e-01, 1.123e-01, -1.300e-02, -3.461e-02)); + r += mul(s4_7, M4(-5.005e-02, 7.592e-02, 1.669e-02, 4.349e-03, -1.532e-01, -2.379e-02, -2.528e-02, -9.192e-02, 1.091e-01, -3.325e-01, 1.515e-01, -4.767e-02, -1.799e-02, 1.858e-02, 2.747e-02, -1.220e-01)); + r += mul(s4_8, M4(8.359e-02, -6.374e-02, -2.862e-02, 1.920e-01, 9.856e-02, 5.909e-02, 4.765e-02, 9.984e-02, -9.049e-02, 2.197e-01, -1.110e-01, 8.181e-02, 8.008e-02, -2.233e-01, 5.183e-02, 3.313e-02)); + r += mul(s5_0, M4(-3.837e-02, -2.881e-02, -7.039e-02, -1.581e-02, 1.084e-01, 8.017e-02, -3.526e-02, 7.989e-02, -5.161e-02, -3.689e-02, 1.312e-02, -1.418e-01, -6.472e-02, 9.976e-02, 6.215e-02, 3.439e-02)); + r += mul(s5_1, M4(1.005e-01, 5.089e-02, 3.631e-02, 5.686e-02, -3.182e-02, 6.229e-02, -4.766e-02, 3.519e-02, 6.282e-02, 9.004e-02, 3.656e-02, -8.098e-02, -1.453e-01, -9.801e-02, -1.470e-01, -1.058e-01)); + r += mul(s5_2, M4(1.509e-01, 5.055e-02, 3.283e-02, -2.458e-03, 4.075e-02, -9.094e-02, 6.107e-02, -4.027e-02, -9.183e-02, 1.017e-01, 3.388e-02, -1.159e-01, -6.618e-02, -9.384e-03, 5.678e-02, 2.558e-02)); + r += mul(s5_3, M4(6.552e-02, 2.544e-03, -1.213e-01, -3.366e-02, 4.405e-02, -6.705e-03, 1.764e-01, 2.911e-02, -1.539e-01, 3.564e-02, 5.182e-02, 3.039e-02, -8.454e-03, 5.669e-02, 1.040e-01, -6.103e-02)); + r += mul(s5_4, M4(-1.056e-01, 2.622e-02, -1.184e-01, 4.384e-02, -2.213e-01, 1.339e-02, 1.164e-01, -3.597e-02, -7.377e-02, -6.467e-02, -1.230e-01, -1.001e-02, 9.561e-03, 1.961e-02, 7.407e-03, 8.048e-02)); + r += mul(s5_5, M4(-1.135e-01, 1.733e-03, -1.516e-02, -1.174e-01, -1.122e-02, -1.409e-01, -1.217e-01, 1.516e-02, 7.002e-02, -1.479e-01, -1.264e-01, 1.806e-01, -7.715e-02, 2.212e-02, 7.268e-02, 5.128e-02)); + r += mul(s5_6, M4(-5.913e-02, 8.225e-02, 1.093e-01, -1.635e-02, 8.655e-02, 5.632e-02, -8.827e-02, -3.750e-02, -5.103e-02, 2.164e-02, -8.208e-02, 4.437e-02, 9.051e-02, -3.004e-02, 7.682e-02, -1.150e-01)); + r += mul(s5_7, M4(8.483e-02, -2.123e-02, 6.602e-02, 1.265e-01, 6.961e-02, 3.508e-02, -3.658e-02, -6.129e-02, 3.346e-02, 5.090e-02, 5.109e-02, 2.092e-02, -4.876e-02, 6.051e-02, -1.371e-01, 9.408e-02)); + r += mul(s5_8, M4(9.064e-02, -7.780e-02, 4.702e-02, 9.918e-02, 4.362e-02, 3.045e-02, -3.481e-03, -2.898e-02, -2.436e-02, 5.820e-03, 2.807e-02, -1.516e-01, 6.365e-02, -5.261e-02, 2.994e-04, 6.343e-02)); + r += mul(s6_0, M4(1.103e-01, -9.613e-02, -2.650e-01, -1.155e-01, -1.295e-02, -5.461e-02, -9.266e-02, -1.543e-01, 8.375e-02, -2.737e-03, 3.942e-02, -8.917e-02, -1.190e-02, 7.522e-02, 9.202e-02, 3.157e-02)); + r += mul(s6_1, M4(-1.159e-01, 6.081e-02, -1.577e-01, 1.546e-01, 1.597e-01, 6.105e-02, 1.902e-02, 1.799e-02, -2.426e-01, -1.284e-01, 1.009e-01, -1.209e-01, -7.567e-02, -5.278e-02, -2.751e-01, -8.851e-02)); + r += mul(s6_2, M4(-1.282e-01, 1.184e-01, 9.726e-02, 5.932e-03, 1.127e-01, -1.175e-02, 1.653e-02, 1.528e-01, 4.978e-02, -1.152e-01, -1.831e-02, 7.319e-02, -3.583e-02, 2.718e-02, -6.719e-03, 6.104e-02)); + r += mul(s6_3, M4(-1.288e-01, 5.219e-02, -1.049e-01, -5.532e-02, 9.779e-02, 1.473e-02, 7.424e-03, -5.110e-02, 1.360e-02, -7.652e-02, 2.543e-01, -1.142e-03, -1.404e-02, 4.899e-02, -1.146e-01, -6.175e-02)); + r += mul(s6_4, M4(9.685e-02, -9.235e-02, -2.548e-01, 1.457e-01, 1.395e-01, 1.691e-01, 2.257e-02, 8.836e-02, -2.705e-01, -2.745e-01, 9.071e-02, 2.695e-03, 1.882e-01, 1.345e-01, 9.377e-02, -9.117e-02)); + r += mul(s6_5, M4(-9.752e-02, -2.447e-01, -8.646e-02, 9.079e-02, -5.149e-02, 3.259e-02, -1.244e-01, 3.561e-02, -1.179e-01, -5.298e-02, -1.130e-01, 6.661e-02, 7.199e-02, -1.177e-01, -4.176e-03, 6.025e-02)); + r += mul(s6_6, M4(-1.983e-02, -1.090e-01, 3.897e-02, -9.106e-03, 1.161e-01, -2.020e-01, -1.279e-02, 5.516e-02, 3.743e-02, -4.719e-02, -1.047e-02, -7.391e-02, -1.281e-02, -7.450e-02, -1.839e-02, 2.007e-02)); + r += mul(s6_7, M4(-1.649e-01, -1.227e-01, -7.207e-02, 1.142e-01, 1.175e-01, 1.422e-01, 8.784e-02, 1.011e-01, -1.071e-01, -1.152e-01, 1.256e-01, -1.020e-02, -9.848e-03, -6.948e-02, 4.149e-02, 4.457e-02)); + r += mul(s6_8, M4(-9.028e-03, -1.629e-01, 5.114e-02, 1.825e-02, -6.076e-04, 3.088e-02, -1.628e-02, 6.999e-02, -3.939e-02, -1.080e-01, 1.004e-01, -1.541e-02, -6.098e-03, 3.446e-03, -2.326e-02, 1.133e-01)); + r += mul(s7_0, M4(-1.475e-02, -2.118e-02, 8.626e-02, 2.885e-02, -3.604e-02, -1.372e-01, -7.127e-02, -7.823e-02, -4.009e-02, -2.106e-02, -7.218e-02, 1.072e-02, 8.193e-02, 5.086e-02, 1.940e-01, 8.729e-02)); + r += mul(s7_1, M4(3.113e-02, 1.907e-02, -2.103e-03, 4.830e-02, -3.199e-02, -2.161e-01, 1.361e-01, -9.514e-02, 7.175e-02, 8.776e-02, 9.203e-02, 9.890e-03, -2.824e-01, 9.455e-02, -2.438e-01, -1.908e-01)); + r += mul(s7_2, M4(7.323e-02, -2.772e-03, 5.055e-02, 5.675e-02, -6.364e-02, -1.402e-01, -3.153e-02, 4.667e-02, 1.014e-01, 9.252e-02, -6.996e-02, 1.175e-01, 1.235e-01, -1.825e-01, 9.365e-02, 2.135e-01)); + r += mul(s7_3, M4(-8.998e-03, 1.080e-02, -6.999e-02, -5.092e-02, 1.320e-01, -4.903e-02, -7.523e-02, -6.216e-02, -1.324e-02, -7.563e-02, 1.143e-01, 3.717e-02, -1.831e-01, 1.333e-01, -4.844e-01, 6.768e-02)); + r += mul(s7_4, M4(9.990e-02, 1.006e-01, 1.993e-01, -3.065e-02, 8.778e-03, 1.426e-01, 3.600e-02, -5.554e-02, -1.035e-01, -5.076e-02, -1.843e-01, 1.523e-01, 7.083e-02, -2.764e-01, 6.749e-01, -1.867e-01)); + r += mul(s7_5, M4(6.027e-02, -4.173e-02, -4.620e-02, 2.347e-02, -1.925e-02, 1.530e-01, -6.159e-02, -1.304e-01, 4.629e-03, 2.058e-01, -1.747e-01, 1.216e-01, 1.216e-01, -1.857e-01, 1.719e-01, 2.433e-02)); + r += mul(s7_6, M4(-1.687e-02, -4.113e-02, 2.712e-02, -1.166e-02, 2.373e-02, -1.509e-01, -3.001e-02, 2.273e-02, 7.160e-02, 1.554e-02, -7.796e-02, 1.504e-01, -1.118e-01, -6.248e-02, -1.827e-01, -9.236e-02)); + r += mul(s7_7, M4(-5.314e-02, 5.682e-02, -1.427e-01, 8.743e-02, -2.283e-02, -1.107e-01, 5.489e-02, -1.170e-01, -2.970e-02, 9.758e-02, 2.663e-02, 1.618e-01, -1.143e-02, -2.074e-01, -9.698e-02, -2.611e-01)); + r += mul(s7_8, M4(2.741e-02, 6.521e-02, -8.427e-02, -1.180e-01, -1.419e-01, 2.104e-01, -3.639e-02, -8.045e-02, 1.144e-01, 5.270e-02, -4.358e-02, -1.047e-04, -4.723e-02, -1.555e-01, -1.430e-01, 3.500e-02)); + r += V4(1.195e-03, 2.615e-02, -6.276e-04, 5.206e-03); + return r; +} + +V4 f1(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-1.986e-02, 6.822e-03, 5.753e-02, -1.520e-02, -3.827e-01, -1.135e-01, -1.228e-01, -2.208e-01, -8.115e-03, -1.213e-01, 3.219e-02, 1.296e-02, -2.308e-02, -1.520e-01, 5.786e-03, -7.677e-02)); + r += mul(s0_1, M4(-4.018e-02, 3.547e-02, 3.448e-02, -1.302e-02, 9.990e-02, 1.241e-01, 9.569e-02, 1.260e-01, -1.066e-01, -1.508e-01, -8.142e-02, 1.013e-01, -1.144e-01, -1.158e-01, -1.012e-01, -2.324e-01)); + r += mul(s0_2, M4(5.159e-02, 6.002e-02, -2.956e-02, -7.201e-02, -6.089e-02, 8.855e-02, -1.617e-02, -2.567e-01, 2.620e-02, -3.999e-02, 1.103e-02, -1.445e-02, -1.175e-01, -7.938e-02, -2.475e-02, 8.953e-02)); + r += mul(s0_3, M4(4.320e-02, -8.602e-02, 5.374e-02, -7.855e-03, -1.130e-01, 5.571e-01, -6.088e-01, 3.930e-01, 4.070e-02, 9.112e-02, -5.713e-02, -9.503e-02, -1.969e-02, 2.999e-02, 1.179e-01, 7.852e-02)); + r += mul(s0_4, M4(1.322e-01, 1.195e-01, -8.777e-02, 5.713e-02, -9.338e-02, 8.141e-02, 6.251e-02, -2.821e-02, -1.453e-01, -1.133e-02, -1.109e-01, 2.815e-01, 1.847e-02, 4.758e-02, -1.011e-01, 1.856e-01)); + r += mul(s0_5, M4(5.368e-02, 5.577e-02, -4.115e-02, 5.112e-02, -1.030e-02, 6.773e-02, -2.048e-02, -8.983e-02, -1.955e-02, -5.164e-02, -4.356e-02, -1.102e-01, -2.729e-02, 4.254e-02, -8.942e-02, -1.909e-01)); + r += mul(s0_6, M4(8.982e-02, 1.226e-01, 1.211e-02, -3.601e-02, 1.469e+00, -6.215e-01, 1.481e+00, -8.902e-01, -6.957e-02, -3.144e-02, -3.928e-02, -1.012e-02, -2.337e-02, -6.282e-02, -1.052e-02, -1.148e-01)); + r += mul(s0_7, M4(-6.852e-03, 1.922e-01, -1.358e-01, 1.629e-01, 5.828e-02, 1.423e-01, 4.401e-01, 1.005e-02, -7.037e-02, 7.975e-02, -1.301e-01, 3.026e-02, 6.336e-02, 6.242e-02, 7.869e-02, 1.673e-01)); + r += mul(s0_8, M4(-2.037e-02, -1.039e-01, 3.734e-02, -1.426e-02, -1.313e-01, -2.785e-01, -3.737e-02, 1.120e-01, -5.427e-02, 1.937e-01, 5.597e-02, -1.602e-01, -5.150e-02, 2.788e-02, -5.521e-02, -4.702e-03)); + r += mul(s1_0, M4(-6.905e-03, -1.235e-01, -2.206e-02, -1.223e-01, -3.602e-02, 1.295e-01, -2.288e-02, 4.790e-02, 3.671e-02, 2.010e-01, 1.423e-03, -5.066e-02, 6.901e-02, 2.673e-02, 1.370e-03, 8.036e-02)); + r += mul(s1_1, M4(7.908e-02, -1.020e-01, -4.662e-02, -1.245e-01, 3.420e-02, -6.349e-02, -6.105e-03, 6.072e-02, 1.535e-01, -3.444e-02, -2.064e-02, 5.312e-02, 2.549e-02, -8.848e-02, 1.074e-02, -1.463e-01)); + r += mul(s1_2, M4(-5.909e-02, -5.896e-02, -5.014e-02, -1.310e-01, -1.054e-02, 2.578e-02, 5.319e-03, -3.809e-02, -1.382e-02, 2.672e-02, -6.116e-02, 3.984e-02, 8.119e-02, 7.160e-02, -1.933e-02, 1.464e-01)); + r += mul(s1_3, M4(-6.907e-02, -1.581e-01, 7.727e-02, 5.224e-02, -2.186e-02, 1.105e-01, 1.388e-02, 8.138e-02, 5.225e-02, -7.229e-02, 7.312e-02, -2.665e-02, 2.633e-02, -1.984e-02, 3.467e-03, 1.131e-01)); + r += mul(s1_4, M4(2.284e-02, -7.500e-02, -2.100e-01, 4.631e-02, 8.797e-02, -1.436e-01, 1.444e-02, -9.599e-02, -4.338e-02, -1.270e-01, -1.653e-01, -7.205e-02, -5.843e-03, -5.963e-02, -4.226e-02, 1.703e-01)); + r += mul(s1_5, M4(1.025e-02, 1.461e-01, -1.463e-01, 2.240e-01, -8.927e-03, 1.690e-01, 3.487e-02, -2.054e-02, -1.247e-01, -5.465e-02, 7.278e-02, 5.314e-02, 3.617e-02, 6.145e-03, -6.355e-02, 1.058e-01)); + r += mul(s1_6, M4(-1.548e-01, -5.650e-02, -1.887e-02, -7.951e-02, -5.997e-02, 1.256e-01, -9.311e-03, -4.018e-02, -5.056e-02, 2.421e-02, -7.796e-02, 4.530e-02, 7.250e-03, -3.022e-02, -3.022e-04, -9.500e-02)); + r += mul(s1_7, M4(-1.235e-01, -2.393e-01, 1.156e-01, 6.419e-02, 4.952e-03, -8.780e-02, 1.671e-01, 6.066e-02, 5.458e-02, 1.372e-01, 2.770e-02, 4.037e-02, -2.154e-02, -3.429e-02, 1.164e-01, -1.703e-01)); + r += mul(s1_8, M4(-2.125e-02, -2.629e-01, -4.850e-02, -1.570e-01, -2.562e-02, -8.194e-02, 7.728e-02, -6.326e-02, 6.335e-02, 1.607e-02, 1.454e-02, -3.578e-03, 6.082e-02, -5.576e-02, -7.196e-03, 2.837e-02)); + r += mul(s2_0, M4(-1.354e-01, 6.717e-02, 9.011e-02, 3.049e-02, 7.582e-02, -3.819e-02, 5.722e-02, -6.210e-02, -3.614e-02, 1.732e-01, 2.581e-02, -1.227e-01, -9.396e-02, -3.042e-02, -5.997e-02, 7.691e-02)); + r += mul(s2_1, M4(1.229e-01, 1.254e-01, -1.884e-02, -1.712e-01, 1.013e-01, -5.457e-02, 1.000e-01, 8.942e-02, 1.469e-01, 1.948e-01, 1.774e-01, 2.932e-02, -7.101e-02, -9.929e-02, 8.720e-02, 6.885e-02)); + r += mul(s2_2, M4(-6.101e-02, -2.211e-02, 4.748e-02, -3.044e-02, -6.137e-02, 1.617e-01, 5.654e-02, 3.131e-01, 2.435e-02, -2.560e-02, -2.790e-02, 2.966e-01, -1.586e-01, 4.883e-02, -8.577e-02, 3.480e-02)); + r += mul(s2_3, M4(1.129e-01, -3.321e-02, -8.915e-02, 2.356e-01, -1.635e-02, -3.314e-02, 4.316e-02, -6.194e-02, 1.002e-01, -8.583e-02, 8.522e-02, -1.088e-01, 7.135e-02, -7.710e-02, -9.304e-02, -1.736e-01)); + r += mul(s2_4, M4(4.598e-02, -1.520e-01, -3.031e-02, -1.877e-01, 2.440e-01, 7.995e-02, 9.139e-02, -1.998e-01, 1.518e-01, 8.131e-03, 1.610e-02, -5.858e-02, -1.043e-01, -8.885e-02, 2.743e-02, 5.627e-02)); + r += mul(s2_5, M4(7.694e-02, -1.287e-01, 5.624e-03, 1.564e-01, -7.886e-02, -3.133e-01, -1.258e-01, -6.350e-03, 6.086e-02, 2.019e-02, 1.615e-01, -6.151e-02, 8.397e-03, 1.362e-02, 6.039e-02, -5.354e-02)); + r += mul(s2_6, M4(-1.030e-02, 1.151e-02, -1.782e-02, -7.826e-02, -1.055e-01, -1.306e-01, 5.878e-02, 1.993e-01, -4.366e-01, 5.715e-02, 7.987e-03, 7.973e-02, 7.199e-02, 1.254e-01, 2.116e-02, -1.284e-01)); + r += mul(s2_7, M4(-5.671e-02, -7.490e-02, -3.972e-02, 9.643e-02, -1.404e-01, -7.338e-02, -1.980e-01, -2.044e-01, -3.438e-01, 1.263e-01, -5.936e-02, 1.683e-01, 1.006e-01, -2.836e-02, -5.692e-03, 1.708e-01)); + r += mul(s2_8, M4(8.514e-02, 6.994e-02, -1.013e-01, 1.542e-03, -7.350e-02, -1.482e-01, 3.252e-03, -4.503e-02, -1.242e-01, 9.806e-02, -1.469e-01, -2.331e-01, -4.649e-02, -1.426e-02, -2.206e-02, 2.883e-02)); + r += mul(s3_0, M4(-3.571e-02, -4.402e-02, -2.314e-02, -6.688e-02, 9.486e-03, -3.747e-02, -1.563e-02, 3.119e-02, 4.435e-02, 9.836e-02, -6.820e-02, 2.743e-02, -9.986e-02, 1.237e-01, -7.874e-02, -1.298e-01)); + r += mul(s3_1, M4(1.066e-01, 1.047e-01, 9.566e-02, -1.392e-02, 5.801e-02, -1.048e-01, 8.749e-02, -3.110e-02, 4.480e-02, -1.415e-01, 3.925e-02, 5.377e-03, -5.845e-02, 3.466e-02, -3.553e-02, 1.092e-01)); + r += mul(s3_2, M4(-1.030e-03, 1.358e-01, 4.032e-02, -2.549e-01, -7.238e-02, 7.306e-03, -1.746e-02, -7.322e-02, 9.659e-02, 6.262e-02, -3.096e-02, 1.859e-01, -6.342e-02, 4.422e-02, -6.971e-03, -8.132e-02)); + r += mul(s3_3, M4(-1.036e-02, -4.418e-02, 8.162e-03, -1.495e-02, -1.440e-02, 3.705e-03, -7.110e-02, 1.073e-01, 2.864e-02, -1.342e-01, 1.404e-02, -1.110e-01, 2.607e-01, 6.219e-03, -6.216e-03, -6.741e-02)); + r += mul(s3_4, M4(-1.665e-01, -1.968e-01, 1.526e-01, 1.592e-01, -4.854e-02, 7.407e-02, 3.999e-02, -1.254e-01, -7.611e-02, -1.210e-01, 4.380e-02, -1.194e-01, 1.725e-01, 4.165e-02, 7.649e-02, -2.743e-02)); + r += mul(s3_5, M4(7.561e-02, -1.677e-01, 7.481e-02, 1.806e-01, -5.974e-02, -1.384e-01, -4.500e-02, -5.669e-02, -1.689e-01, -1.343e-01, 1.064e-01, -1.950e-01, -1.293e-02, 9.747e-02, -3.915e-02, -1.126e-01)); + r += mul(s3_6, M4(-4.416e-02, -2.337e-03, -2.228e-02, -1.596e-01, 4.264e-02, 9.522e-02, -2.105e-02, 1.255e-01, 2.971e-04, 1.379e-01, 1.845e-02, -6.566e-02, 4.997e-02, -3.263e-02, 9.562e-02, 6.351e-02)); + r += mul(s3_7, M4(-8.212e-03, 1.173e-01, 1.054e-01, 7.538e-02, -1.105e-01, 8.184e-02, -4.330e-02, 5.937e-02, -1.263e-01, 2.382e-01, -4.970e-02, 7.818e-02, 6.604e-02, -9.197e-02, 4.356e-02, 6.887e-02)); + r += mul(s3_8, M4(5.619e-02, 9.161e-02, 1.717e-01, -5.996e-02, -1.034e-02, -4.474e-02, -3.005e-02, 1.492e-01, 9.353e-02, -4.681e-02, -1.008e-01, -1.182e-01, 2.204e-04, 1.649e-02, 5.204e-02, -3.632e-02)); + r += mul(s4_0, M4(1.618e-01, 1.440e-01, 2.946e-03, 1.621e-02, 5.865e-02, -4.953e-02, -1.768e-03, -2.534e-02, 1.805e-01, -1.013e-01, 5.760e-02, -1.804e-01, -2.309e-02, -5.472e-03, -4.686e-02, 1.970e-03)); + r += mul(s4_1, M4(2.577e-01, 2.609e-01, 2.364e-03, 8.060e-02, 1.305e-03, 7.613e-02, -1.744e-01, 1.190e-01, -2.858e-02, -2.411e-02, -2.228e-03, 4.932e-02, 1.226e-02, 1.388e-01, -9.890e-02, -4.603e-03)); + r += mul(s4_2, M4(3.535e-02, -9.065e-02, -7.221e-02, 1.631e-02, 5.460e-02, -6.296e-02, 1.561e-01, -3.317e-02, -3.537e-02, -8.641e-02, 3.827e-02, 3.396e-02, -3.916e-02, 1.825e-02, 7.734e-02, -5.479e-02)); + r += mul(s4_3, M4(8.959e-02, -1.148e-01, 2.783e-02, -7.273e-02, 1.180e-01, -2.340e-02, -3.300e-02, -1.382e-01, -2.296e-01, 1.344e-01, -1.764e-01, 3.269e-02, 4.208e-02, -1.100e-01, 4.651e-02, -2.444e-01)); + r += mul(s4_4, M4(5.090e-02, -1.270e-01, 3.455e-02, -1.171e-01, 2.836e-01, 3.501e-03, -2.007e-01, 1.595e-03, -2.573e-03, 3.730e-02, 5.707e-02, -1.163e-01, 5.308e-03, -1.788e-02, 1.323e-01, -7.576e-03)); + r += mul(s4_5, M4(4.045e-02, 8.176e-02, -7.298e-04, -1.575e-01, 1.848e-01, -8.641e-02, -6.485e-03, -7.190e-02, 3.545e-02, -6.044e-02, -1.548e-02, -1.619e-01, -2.513e-01, -1.906e-01, 1.054e-01, 1.993e-01)); + r += mul(s4_6, M4(-2.613e-02, 5.697e-02, 5.588e-02, -1.724e-02, -3.324e-02, 6.878e-02, 4.254e-02, 1.559e-01, 1.419e-01, -1.105e-01, -8.374e-02, 1.909e-01, -5.703e-02, 2.265e-02, -1.545e-02, -1.220e-01)); + r += mul(s4_7, M4(-1.032e-01, 1.042e-01, 7.131e-02, 9.728e-03, 1.273e-01, -1.841e-01, 4.237e-02, 9.465e-03, 2.121e-02, 1.010e-01, -1.246e-01, 8.562e-02, 4.298e-02, -1.094e-01, 6.559e-05, -2.083e-02)); + r += mul(s4_8, M4(-4.223e-02, 2.901e-01, 1.016e-02, 4.068e-02, -2.434e-02, 7.889e-02, 5.558e-02, -1.286e-01, -5.586e-02, 1.887e-01, 7.568e-02, -1.709e-01, 3.264e-03, 1.424e-01, 2.017e-01, 5.328e-02)); + r += mul(s5_0, M4(2.289e-02, -1.985e-02, 1.911e-03, -1.736e-03, 4.676e-03, -6.639e-02, 4.538e-02, -8.575e-02, 4.059e-02, -6.372e-02, -2.257e-02, -3.280e-02, 2.993e-02, -3.446e-02, -2.250e-02, -3.210e-02)); + r += mul(s5_1, M4(6.721e-02, 6.856e-02, 8.555e-03, -6.471e-02, -1.120e-01, -1.849e-02, 6.424e-03, 1.815e-01, -7.078e-02, 8.081e-03, -5.353e-02, -4.131e-02, -9.650e-02, 1.586e-01, -7.327e-02, 1.632e-01)); + r += mul(s5_2, M4(-4.732e-02, -1.429e-01, -2.673e-02, 1.000e-01, 6.563e-02, 1.312e-02, -2.896e-03, 5.481e-03, 7.972e-03, 3.480e-02, 4.318e-02, 2.591e-02, -7.582e-02, -1.581e-02, -7.921e-04, -1.373e-01)); + r += mul(s5_3, M4(2.248e-03, -2.054e-02, 6.049e-02, 5.953e-02, 1.831e-01, 2.980e-02, 8.772e-02, -1.613e-01, 6.612e-02, -9.887e-02, 3.382e-03, 1.342e-01, -8.885e-02, 8.843e-03, -1.922e-02, -1.048e-02)); + r += mul(s5_4, M4(2.009e-01, 4.434e-02, 1.210e-02, 1.625e-02, 1.055e-01, 6.703e-02, -7.031e-02, 8.557e-02, -1.515e-02, -8.043e-02, -8.440e-02, 1.456e-01, -5.386e-02, -1.905e-02, 6.964e-02, 8.901e-05)); + r += mul(s5_5, M4(1.971e-02, 1.069e-02, -5.078e-02, -2.352e-02, 1.143e-01, -1.166e-01, -6.763e-02, 8.697e-02, -6.270e-02, 9.384e-02, -1.432e-03, -5.115e-02, -6.805e-02, -1.019e-01, -2.959e-02, 6.550e-03)); + r += mul(s5_6, M4(-2.476e-02, -3.203e-02, 1.215e-01, 1.066e-01, 3.076e-02, 1.604e-01, 1.136e-02, -1.005e-01, 1.175e-02, -9.072e-02, 3.472e-02, -1.048e-01, 3.720e-02, -4.246e-02, 2.792e-02, 5.211e-02)); + r += mul(s5_7, M4(-9.140e-02, -3.781e-02, 1.193e-01, -5.316e-02, -4.498e-02, 1.195e-02, 2.241e-02, -2.840e-02, 6.979e-02, -6.277e-02, 5.606e-02, 1.864e-02, -7.186e-02, 9.823e-02, 1.157e-01, -1.972e-02)); + r += mul(s5_8, M4(-3.606e-02, 3.154e-01, 7.019e-02, 8.492e-02, 7.642e-03, -9.079e-02, 2.235e-02, -3.428e-02, 1.301e-03, -1.673e-02, 7.810e-02, 2.383e-02, 2.591e-02, 1.089e-01, 5.137e-02, 1.102e-01)); + r += mul(s6_0, M4(4.447e-02, -6.679e-02, 1.368e-02, 2.215e-01, 3.629e-02, -7.108e-02, -7.062e-02, -1.028e-01, 1.437e-01, -1.505e-02, 1.080e-01, 7.552e-02, -1.821e-02, -8.658e-02, 6.763e-02, -6.099e-02)); + r += mul(s6_1, M4(3.100e-01, 8.374e-02, 2.073e-03, -3.276e-01, -3.915e-02, -4.229e-02, -4.466e-02, 8.721e-02, 2.250e-01, -1.480e-01, 1.668e-01, 3.566e-02, -1.490e-01, 1.378e-01, 1.024e-01, -8.984e-02)); + r += mul(s6_2, M4(1.756e-01, -7.324e-02, -7.008e-02, -1.154e-01, 4.844e-02, 9.920e-02, -9.209e-03, 2.015e-02, 6.384e-02, -2.329e-01, -1.049e-02, -1.012e-01, -3.391e-02, -7.065e-02, 1.926e-02, -2.107e-01)); + r += mul(s6_3, M4(4.980e-02, 5.197e-03, -1.297e-01, 2.779e-01, -5.990e-02, -1.192e-01, -1.931e-02, -1.196e-01, 1.153e-02, 3.145e-02, 1.005e-01, 4.722e-02, 4.867e-02, -5.040e-02, 9.400e-02, -7.509e-03)); + r += mul(s6_4, M4(2.063e-01, 4.555e-01, -8.566e-02, 1.910e-01, 1.244e-01, 1.213e-01, 9.179e-02, 3.046e-01, 8.209e-02, 1.313e-01, -4.185e-02, -5.557e-02, -7.440e-02, -3.492e-02, 1.808e-02, 8.745e-03)); + r += mul(s6_5, M4(-6.659e-02, 2.696e-01, 6.018e-02, -1.151e-01, 1.323e-01, -1.084e-01, -4.879e-02, 1.189e-01, -1.340e-02, -1.495e-02, -6.454e-02, -9.728e-02, 1.110e-01, -8.076e-02, 1.528e-01, 6.004e-02)); + r += mul(s6_6, M4(1.959e-01, 1.357e-01, 1.386e-01, -1.108e-01, -2.578e-02, 7.557e-03, -8.948e-02, 1.025e-01, 6.418e-02, -9.741e-02, 7.775e-02, 6.005e-02, 5.412e-02, -3.505e-03, -3.937e-02, 3.171e-02)); + r += mul(s6_7, M4(1.635e-01, 5.757e-02, 9.609e-02, -4.970e-02, -8.507e-02, -1.574e-01, 2.353e-02, -3.626e-01, 3.217e-02, -3.547e-02, 3.992e-02, 1.444e-01, -1.525e-01, -9.004e-02, -5.342e-02, 8.247e-02)); + r += mul(s6_8, M4(7.167e-02, 8.103e-02, 1.406e-01, -9.421e-02, -2.194e-02, -1.048e-03, 7.390e-02, -9.496e-02, -4.531e-02, -1.193e-02, -4.896e-02, 8.149e-02, -4.743e-02, 1.126e-01, -8.515e-02, -6.805e-02)); + r += mul(s7_0, M4(-1.121e-01, -1.278e-02, -8.863e-02, 2.300e-02, -2.201e-02, -1.399e-01, -1.536e-02, -5.916e-02, -2.724e-03, 9.229e-02, 7.675e-02, 3.021e-02, -3.299e-02, 5.690e-02, -1.076e-01, 2.151e-02)); + r += mul(s7_1, M4(-2.834e-02, -3.503e-04, -1.616e-02, 1.354e-01, 6.473e-02, -2.932e-02, 8.013e-03, -6.101e-02, 4.714e-02, 2.595e-02, 1.401e-01, 6.043e-02, -3.675e-01, -5.563e-02, -1.248e-01, -1.177e-01)); + r += mul(s7_2, M4(-6.996e-04, -6.545e-02, -1.193e-02, -8.868e-03, 3.028e-02, 7.079e-02, 1.105e-02, -6.737e-02, -3.216e-04, -1.410e-01, 5.733e-02, -8.100e-02, 2.609e-02, -8.698e-02, 1.476e-03, -3.165e-03)); + r += mul(s7_3, M4(7.213e-03, 1.243e-02, -5.497e-02, -4.193e-02, 5.657e-03, -2.381e-02, -8.174e-02, -5.500e-02, 1.466e-02, 1.246e-01, 9.604e-03, 1.296e-01, -1.523e-01, 1.194e-01, -4.447e-02, -1.892e-01)); + r += mul(s7_4, M4(-4.059e-02, -2.957e-02, 2.509e-02, 1.123e-01, 3.719e-02, 2.019e-01, 1.411e-02, 5.486e-02, 6.567e-02, 1.341e-01, -1.903e-02, -1.988e-02, -1.076e-01, -1.181e-01, -3.153e-02, 4.874e-02)); + r += mul(s7_5, M4(2.475e-04, -1.004e-01, -5.032e-02, 1.755e-01, 2.327e-02, -4.958e-02, 1.686e-02, 1.904e-01, -7.471e-02, -7.154e-02, -7.071e-02, -8.508e-02, 1.441e-01, -9.300e-02, 2.251e-01, -8.240e-02)); + r += mul(s7_6, M4(6.208e-02, -2.324e-02, 6.566e-02, -2.202e-01, 3.150e-02, -1.214e-02, -2.382e-02, 1.375e-01, 4.706e-02, 8.534e-02, 1.390e-01, -1.694e-01, 2.515e-01, -1.183e-01, -1.791e-01, -2.025e-01)); + r += mul(s7_7, M4(-1.438e-03, -1.104e-03, 7.943e-02, -6.275e-02, -2.148e-02, -1.899e-01, 1.292e-01, -1.585e-01, -1.296e-02, 6.378e-02, 4.362e-02, -4.874e-02, 1.644e-01, -5.298e-02, -1.193e-01, 1.313e-01)); + r += mul(s7_8, M4(-1.098e-01, -6.661e-02, 1.479e-01, 7.224e-02, 6.840e-02, 5.659e-02, 2.417e-01, -6.040e-02, -1.625e-01, 7.338e-02, 7.262e-02, -4.029e-03, -3.036e-02, 1.887e-01, -4.878e-02, -1.562e-01)); + r += V4(-2.014e-02, 4.866e-03, 2.592e-02, 7.493e-03); + return r; +} + +V4 f2(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-1.008e-01, -3.916e-02, 1.010e-01, 6.845e-02, 3.399e-01, -1.606e-01, -5.091e-02, 1.703e-02, -4.789e-02, -9.451e-03, 4.035e-02, 9.350e-02, 2.814e-02, -6.340e-02, -2.785e-02, 1.318e-01)); + r += mul(s0_1, M4(3.055e-02, -4.238e-02, 7.044e-02, -2.653e-02, -3.053e-01, -8.548e-02, 8.775e-02, 6.196e-02, -1.515e-03, -1.879e-01, 2.451e-02, -8.076e-02, 2.415e-01, 4.137e-02, 6.065e-02, -5.155e-02)); + r += mul(s0_2, M4(-5.146e-02, 3.458e-02, -4.560e-02, 3.390e-02, -1.537e-01, 7.741e-02, -6.436e-02, -1.263e-02, -7.760e-02, 5.328e-02, -1.590e-02, 1.418e-01, 8.197e-02, -6.740e-02, 9.695e-02, 8.204e-02)); + r += mul(s0_3, M4(-6.662e-02, 1.059e-01, 8.080e-04, -5.476e-02, 1.777e-01, -3.447e-01, -4.629e-01, -1.898e-01, 1.417e-01, 1.464e-01, -3.460e-03, 6.394e-03, 1.006e-01, -1.495e-01, -3.108e-02, -1.354e-01)); + r += mul(s0_4, M4(2.424e-02, 1.511e-02, -4.347e-02, -1.348e-02, -3.829e-01, 4.027e-01, -6.761e-01, 1.932e-01, -2.802e-02, -6.379e-02, -1.569e-03, -9.520e-02, 2.448e-01, -3.034e-01, -4.726e-02, -9.743e-02)); + r += mul(s0_5, M4(9.581e-02, -1.057e-01, -2.580e-02, 2.276e-02, -1.719e-01, -5.643e-02, 5.240e-02, 1.784e-02, -8.405e-03, -1.637e-01, 1.738e-01, 3.104e-02, 6.445e-02, -1.124e-01, -3.481e-02, -6.256e-02)); + r += mul(s0_6, M4(2.497e-02, 1.180e-02, 4.137e-02, -5.304e-02, -6.517e-01, 9.059e-02, -1.180e+00, -5.478e-01, -2.872e-02, 1.207e-02, 8.378e-03, -6.560e-02, -2.827e-02, 5.121e-02, 6.275e-02, 6.468e-02)); + r += mul(s0_7, M4(2.286e-02, 9.867e-02, 2.494e-02, 8.407e-02, 6.351e-03, 2.930e-02, 2.861e-01, 1.563e-01, -6.029e-02, 9.740e-02, 5.489e-02, -7.501e-02, 5.178e-02, -1.199e-01, -1.896e-02, 1.576e-01)); + r += mul(s0_8, M4(-2.593e-02, 7.859e-02, 7.854e-02, 1.255e-01, -4.862e-02, -1.027e-01, 8.092e-02, 7.862e-02, 7.277e-03, -3.922e-02, 3.413e-02, -4.888e-02, 9.482e-03, 6.531e-02, 6.533e-02, -1.082e-02)); + r += mul(s1_0, M4(-1.092e-01, -1.309e-01, 2.092e-01, 1.873e-01, -1.052e-02, -3.344e-02, -6.844e-02, -6.866e-02, -2.449e-02, -2.638e-02, 3.731e-02, -2.757e-02, -5.234e-02, 6.412e-03, 8.183e-03, 4.165e-03)); + r += mul(s1_1, M4(-1.361e-01, -8.128e-02, 9.945e-02, 2.035e-01, -1.116e-01, -4.339e-02, 3.222e-02, -4.847e-02, 1.682e-02, 5.067e-02, 7.394e-02, 1.533e-02, 4.123e-02, 6.091e-02, -6.075e-03, 4.583e-02)); + r += mul(s1_2, M4(-7.005e-03, -4.706e-02, -1.425e-01, 3.193e-02, 2.992e-02, 2.992e-02, -5.016e-02, -8.966e-02, -4.400e-02, -6.918e-03, -5.816e-02, -8.850e-02, 1.587e-02, -3.190e-02, 3.408e-02, -9.859e-02)); + r += mul(s1_3, M4(-1.231e-01, 4.057e-02, 1.879e-01, -6.859e-02, -1.013e-01, 9.888e-02, -3.559e-02, -7.970e-02, 6.961e-02, 5.653e-02, -7.000e-02, 6.589e-02, -1.478e-02, -1.277e-01, 2.843e-02, -5.412e-02)); + r += mul(s1_4, M4(-4.678e-02, -5.131e-02, -3.270e-03, 1.746e-01, 1.063e-01, 4.275e-03, -2.326e-02, -7.831e-02, -9.495e-02, -4.468e-02, -9.005e-02, 1.607e-01, 1.817e-01, -1.634e-01, 1.678e-03, -1.685e-01)); + r += mul(s1_5, M4(-1.658e-02, 5.195e-02, -1.156e-01, -1.038e-01, -3.957e-02, -1.587e-02, -5.761e-02, -6.746e-02, 1.075e-02, 5.486e-02, 5.067e-02, -7.913e-02, 2.812e-02, 1.681e-01, -3.576e-02, -2.748e-01)); + r += mul(s1_6, M4(-2.988e-02, -5.385e-03, 2.411e-01, -2.254e-01, -6.225e-02, -4.964e-02, -2.798e-02, 4.692e-02, -3.240e-02, -5.173e-02, 7.077e-02, -1.813e-01, -2.905e-02, 8.668e-02, 4.005e-02, -7.292e-02)); + r += mul(s1_7, M4(-2.912e-02, 9.705e-02, 1.795e-01, -2.074e-02, -1.717e-02, -1.351e-01, 1.336e-02, 6.337e-02, -5.253e-02, 8.671e-02, 2.364e-02, -7.599e-02, 1.080e-02, 7.499e-02, -6.414e-02, -4.584e-02)); + r += mul(s1_8, M4(-1.087e-01, 5.665e-02, -1.078e-01, 2.889e-02, 4.027e-02, -4.402e-02, 5.508e-02, 6.452e-02, -3.496e-02, -7.027e-02, -2.180e-02, -1.293e-01, 5.026e-02, -5.078e-04, 1.732e-02, -1.501e-01)); + r += mul(s2_0, M4(-3.671e-02, 7.856e-03, -2.443e-02, -1.531e-02, -5.352e-02, 6.252e-02, -2.774e-02, 5.152e-03, 2.753e-02, -9.750e-02, -9.400e-02, 2.185e-02, -7.625e-03, 4.389e-02, 7.790e-03, 1.192e-02)); + r += mul(s2_1, M4(-2.192e-01, 3.237e-02, -8.307e-02, 1.826e-01, 1.406e-02, -4.539e-02, 1.026e-01, 1.231e-01, 6.083e-02, 1.084e-01, 1.293e-02, -1.103e-01, 4.078e-02, -7.499e-02, 1.408e-01, -9.862e-02)); + r += mul(s2_2, M4(-1.668e-02, -8.959e-02, -2.557e-03, 4.462e-03, 1.400e-01, 1.951e-01, -7.688e-02, 1.030e-01, 3.071e-03, 3.503e-03, 5.728e-03, -3.091e-01, -4.406e-02, 2.517e-02, -1.225e-01, -1.108e-01)); + r += mul(s2_3, M4(-5.356e-02, 1.346e-01, 1.545e-01, -4.702e-02, 4.145e-02, -1.388e-01, -5.938e-02, 1.375e-01, 1.042e-01, 1.030e-01, -2.785e-02, -3.777e-02, -1.161e-01, -1.252e-01, 7.686e-02, 1.854e-01)); + r += mul(s2_4, M4(8.108e-02, 1.545e-01, -9.479e-02, -9.649e-02, -2.991e-02, 1.379e-01, -1.532e-01, -7.997e-02, 1.364e-01, 1.927e-01, -1.008e-01, -1.324e-01, -9.811e-03, -1.180e-01, 2.127e-02, -2.427e-02)); + r += mul(s2_5, M4(1.284e-02, 6.614e-02, -2.443e-02, 1.896e-02, -3.812e-02, 1.838e-01, -4.791e-02, -3.341e-02, 5.916e-02, 1.480e-01, -5.429e-02, -3.131e-02, -1.818e-02, 3.326e-02, 3.054e-02, 9.534e-02)); + r += mul(s2_6, M4(-3.783e-02, -3.659e-02, 1.287e-02, -2.306e-02, -8.206e-02, -5.854e-02, -1.082e-01, 1.305e-01, -2.610e-02, -1.637e-01, 1.781e-01, 1.751e-01, 8.290e-02, 1.125e-01, -2.836e-02, 2.926e-02)); + r += mul(s2_7, M4(6.580e-03, 5.339e-02, -8.924e-02, 6.558e-02, -1.142e-01, 6.927e-02, -5.860e-02, 2.088e-02, 1.394e-01, 8.620e-02, 5.780e-02, -1.332e-01, -2.791e-02, 6.050e-02, -2.671e-02, 4.709e-02)); + r += mul(s2_8, M4(5.441e-03, 5.049e-02, -4.891e-02, -4.387e-02, -9.769e-03, -3.104e-02, 4.246e-02, -3.497e-01, 1.708e-01, -2.097e-01, -1.046e-02, -6.400e-04, -7.334e-02, 2.186e-02, -1.378e-02, 4.845e-02)); + r += mul(s3_0, M4(2.658e-01, 5.756e-02, 8.229e-04, 5.429e-02, 9.246e-02, -3.045e-03, -3.316e-02, -1.508e-02, -9.681e-03, -2.741e-02, -3.148e-02, 5.369e-02, -8.267e-02, -3.702e-02, 3.685e-02, 3.233e-02)); + r += mul(s3_1, M4(-2.783e-01, -6.481e-02, -1.671e-01, 6.387e-02, 1.322e-01, 6.065e-02, 1.008e-01, 7.013e-02, 1.295e-01, 9.118e-02, 6.833e-02, 2.235e-01, -6.723e-02, 1.381e-03, -6.050e-02, -7.017e-02)); + r += mul(s3_2, M4(1.354e-02, 9.146e-03, -5.852e-02, -1.990e-01, -4.583e-02, -5.566e-02, -3.195e-02, 6.211e-03, 2.113e-02, 1.178e-02, -2.842e-02, -6.357e-02, -1.509e-01, 2.841e-02, -9.607e-02, 4.578e-02)); + r += mul(s3_3, M4(1.028e-01, -3.498e-02, 1.358e-01, -4.864e-02, 1.267e-01, 7.651e-02, -6.803e-02, -3.683e-02, -3.046e-02, -3.911e-04, -8.320e-02, -1.267e-02, -9.810e-02, -5.653e-02, 2.510e-01, 7.365e-02)); + r += mul(s3_4, M4(9.615e-02, -6.909e-02, 2.706e-03, 8.430e-02, 6.544e-02, -8.425e-02, -1.024e-01, 4.985e-02, 4.863e-02, 6.675e-02, 1.092e-01, 5.400e-03, -1.514e-02, 2.700e-01, -1.184e-01, -1.450e-01)); + r += mul(s3_5, M4(5.401e-02, -1.141e-01, 1.341e-01, 6.636e-02, 2.054e-02, 9.014e-03, -1.037e-02, -9.457e-03, -9.401e-02, -1.564e-02, 3.566e-02, 8.868e-02, -6.657e-04, 5.736e-02, -2.355e-02, 2.052e-02)); + r += mul(s3_6, M4(-3.002e-02, -3.003e-02, -4.129e-02, 1.064e-01, 8.557e-02, 6.851e-02, -1.117e-01, 2.930e-02, -2.581e-02, 1.051e-01, -8.577e-02, -6.659e-02, -2.273e-02, -1.715e-01, -1.470e-02, -7.442e-03)); + r += mul(s3_7, M4(1.125e-01, 1.331e-02, -1.246e-02, 5.825e-02, 1.756e-02, -8.701e-02, 6.392e-02, 1.824e-02, 8.065e-02, 7.785e-02, 2.374e-02, -1.394e-01, -2.717e-02, 1.178e-01, 9.271e-02, -1.530e-01)); + r += mul(s3_8, M4(1.323e-02, -7.379e-02, 2.424e-02, -1.389e-01, -5.386e-02, -3.862e-02, -4.150e-02, 2.732e-02, 6.020e-02, -1.514e-01, 1.884e-02, -5.014e-02, -2.019e-02, 1.374e-01, -1.084e-01, 6.373e-02)); + r += mul(s4_0, M4(-8.808e-02, 3.429e-02, 1.013e-01, -3.341e-01, -7.959e-02, 1.194e-01, -5.354e-02, 5.882e-02, -5.993e-02, -2.896e-02, 8.839e-02, -1.031e-01, -4.339e-02, 7.098e-02, -2.804e-02, 2.744e-02)); + r += mul(s4_1, M4(9.648e-04, 2.408e-01, 2.017e-02, 3.314e-02, -2.142e-03, -1.039e-02, 1.387e-02, -1.590e-02, -3.084e-02, 7.650e-02, -4.970e-02, -1.405e-02, -4.142e-02, -2.851e-01, -6.241e-02, 3.391e-03)); + r += mul(s4_2, M4(-8.964e-02, 2.112e-02, -3.446e-02, 6.552e-03, 7.698e-02, -6.241e-02, 9.886e-02, 5.670e-02, 8.158e-02, -9.800e-02, 1.245e-01, 2.136e-01, 2.148e-02, -1.728e-03, -1.094e-01, 2.660e-01)); + r += mul(s4_3, M4(-3.053e-02, -2.172e-01, 1.221e-01, 9.487e-02, 2.165e-02, -8.438e-02, 1.171e-02, 1.298e-03, 7.446e-02, 1.966e-01, -2.453e-01, 1.166e-01, 1.633e-02, -2.862e-03, 6.918e-02, 2.827e-02)); + r += mul(s4_4, M4(-1.083e-01, -2.386e-02, 1.212e-01, 1.950e-01, 1.193e-01, 1.277e-01, 3.869e-02, -1.443e-03, 5.198e-02, 7.316e-02, -1.790e-01, 8.578e-02, 5.957e-03, 1.503e-01, 2.082e-01, 2.256e-01)); + r += mul(s4_5, M4(-1.064e-01, 1.372e-01, -1.877e-02, -1.348e-02, -5.566e-02, -9.086e-02, 2.651e-02, 6.765e-02, -6.230e-02, -1.736e-01, 3.186e-02, -1.308e-02, 5.899e-02, 1.227e-01, 2.968e-02, 3.636e-02)); + r += mul(s4_6, M4(-6.961e-03, -1.043e-01, 8.080e-02, -6.653e-02, -1.519e-02, -3.350e-02, -4.550e-02, -5.541e-02, 5.834e-02, -1.444e-01, -2.354e-03, -4.099e-03, 2.516e-02, 1.928e-01, 1.690e-01, -8.711e-02)); + r += mul(s4_7, M4(-1.251e-01, 7.012e-02, 6.696e-02, -4.789e-02, 5.799e-02, 1.241e-01, 1.203e-03, 3.225e-02, -6.642e-02, 1.606e-01, 2.856e-02, 7.654e-02, 6.001e-02, -1.007e-01, 6.379e-02, 6.739e-02)); + r += mul(s4_8, M4(7.172e-02, 1.117e-01, -8.373e-02, 5.826e-02, 8.146e-03, 9.333e-02, -8.752e-02, -1.107e-01, 5.070e-02, -8.970e-02, 2.036e-02, -8.545e-02, -1.303e-02, -6.134e-02, 1.345e-01, -2.092e-02)); + r += mul(s5_0, M4(-3.420e-02, -4.286e-02, 5.820e-02, -4.666e-02, -1.387e-02, -9.200e-03, 8.678e-02, 7.305e-02, -1.391e-02, -1.391e-01, -2.701e-03, -2.183e-02, 2.512e-02, 8.134e-02, 1.446e-02, -6.738e-02)); + r += mul(s5_1, M4(2.315e-02, 1.556e-02, 9.546e-02, -8.261e-02, -4.704e-02, -1.952e-02, 9.274e-03, 8.298e-02, -2.296e-02, 1.468e-01, 9.009e-02, 9.296e-02, -4.212e-02, -3.072e-03, 2.659e-02, -9.766e-02)); + r += mul(s5_2, M4(-3.174e-02, 7.869e-02, 6.973e-02, 9.292e-02, 4.679e-02, -7.720e-02, -6.137e-02, -3.849e-02, 3.740e-02, -2.823e-02, 2.053e-02, -1.582e-02, -2.069e-02, -4.009e-02, 1.819e-02, 5.816e-02)); + r += mul(s5_3, M4(-2.408e-02, -1.402e-02, 8.030e-02, -7.538e-04, -6.870e-02, 6.374e-02, -2.680e-02, 6.959e-02, -5.629e-02, 1.634e-02, -1.036e-01, 8.784e-02, 4.241e-02, 1.180e-01, 2.967e-02, 5.800e-02)); + r += mul(s5_4, M4(8.412e-03, -1.434e-01, 2.068e-02, 1.126e-01, -2.408e-02, 5.598e-02, 6.866e-02, -6.318e-02, -7.580e-03, -1.624e-01, 1.690e-01, 1.567e-01, 3.018e-02, 3.697e-02, 1.022e-01, 5.549e-03)); + r += mul(s5_5, M4(-2.753e-02, 6.398e-03, -1.630e-04, 8.630e-02, -7.732e-02, -1.156e-01, -3.458e-02, -5.389e-03, 2.963e-02, -4.424e-02, -6.577e-02, 1.644e-01, 5.889e-02, -1.389e-02, 5.595e-02, 3.759e-02)); + r += mul(s5_6, M4(-3.680e-02, -1.139e-01, 2.077e-01, 8.976e-03, 3.099e-02, -2.741e-03, -3.880e-02, -6.108e-02, 7.025e-03, -1.111e-01, -7.592e-02, -7.150e-02, 6.323e-02, 1.183e-01, 1.126e-01, -1.196e-01)); + r += mul(s5_7, M4(-9.568e-02, -1.353e-01, 9.138e-05, 1.103e-01, 4.564e-02, 4.804e-02, 2.993e-02, -2.955e-05, 6.861e-02, -1.118e-02, -5.157e-02, -1.125e-01, -1.353e-02, 2.401e-02, -7.281e-02, 7.283e-02)); + r += mul(s5_8, M4(3.341e-02, 9.544e-03, 3.887e-02, 1.109e-02, -1.954e-02, 1.813e-01, -3.185e-02, -1.201e-01, 6.204e-03, 4.629e-02, -1.049e-01, -1.434e-02, -2.835e-02, -2.521e-02, 1.122e-01, 2.099e-02)); + r += mul(s6_0, M4(1.845e-01, 7.140e-02, -2.296e-02, -4.522e-01, -8.474e-02, -1.015e-01, -5.319e-02, 1.101e-01, 1.284e-01, 1.388e-02, -9.949e-02, -4.648e-02, -9.801e-02, 7.390e-02, 9.625e-02, 6.383e-02)); + r += mul(s6_1, M4(7.417e-02, 2.408e-01, 5.027e-02, -1.958e-01, -2.282e-02, -2.957e-02, 2.635e-02, 2.840e-02, 1.937e-01, 3.764e-02, 2.358e-02, 2.496e-01, -1.975e-01, 6.422e-03, -1.198e-01, -2.480e-01)); + r += mul(s6_2, M4(-6.464e-03, 6.839e-02, 1.742e-02, 5.729e-02, 5.231e-02, -4.147e-02, 1.640e-02, -3.261e-03, 3.850e-02, -2.173e-02, -5.474e-02, 2.090e-02, -5.563e-02, 3.820e-02, -9.706e-04, 5.112e-02)); + r += mul(s6_3, M4(5.517e-02, -1.175e-01, -1.632e-02, -2.209e-01, -7.623e-02, 1.509e-01, 1.945e-02, 1.775e-01, -5.883e-02, -1.288e-01, 1.850e-02, 9.276e-02, 1.260e-01, 8.077e-03, -3.461e-02, -1.318e-01)); + r += mul(s6_4, M4(2.518e-01, 2.093e-01, -3.392e-01, -3.699e-01, -1.533e-01, -5.155e-03, 2.224e-01, 1.088e-01, 1.740e-02, 7.310e-02, 1.691e-02, 1.149e-01, -2.053e-01, 7.916e-02, -8.970e-03, -6.942e-02)); + r += mul(s6_5, M4(7.398e-03, -1.139e-02, 5.134e-02, 4.369e-02, 3.504e-02, -2.624e-02, -1.932e-02, -8.406e-02, -5.470e-02, 1.063e-01, 1.024e-01, 3.087e-02, 3.550e-02, 2.259e-02, 1.528e-01, 1.171e-01)); + r += mul(s6_6, M4(-3.539e-02, -2.213e-01, -7.176e-02, 8.298e-02, -4.917e-02, 3.198e-02, -3.727e-02, 9.915e-03, -2.613e-03, -8.586e-02, 1.400e-03, -7.126e-02, -3.262e-02, -2.155e-02, -1.023e-01, 1.680e-02)); + r += mul(s6_7, M4(4.906e-02, -2.937e-02, -2.405e-02, 8.911e-02, -2.111e-02, -7.278e-02, 6.475e-02, -2.134e-01, 1.474e-02, -6.657e-02, 1.101e-01, -1.045e-01, -6.551e-02, 9.400e-02, 7.675e-03, 1.311e-02)); + r += mul(s6_8, M4(-7.607e-03, 1.046e-01, 6.737e-02, 1.893e-01, -3.036e-02, -3.295e-02, -5.342e-02, -1.158e-02, 2.028e-02, 3.606e-03, 6.415e-02, 1.806e-02, -2.892e-03, -7.854e-02, 6.960e-04, -1.778e-02)); + r += mul(s7_0, M4(4.071e-02, -8.310e-02, 3.682e-02, 2.568e-01, 1.042e-02, 5.130e-03, -1.003e-01, 1.055e-01, -1.793e-01, -1.907e-02, -8.712e-02, 5.897e-02, 1.614e-01, -1.085e-01, 1.510e-01, -5.698e-02)); + r += mul(s7_1, M4(1.770e-02, 6.137e-02, 4.827e-02, 2.183e-02, 5.895e-02, 1.145e-02, -9.344e-02, 2.193e-01, -1.240e-01, -7.384e-02, 1.296e-01, 1.158e-02, 1.164e-03, 1.199e-01, 2.286e-02, -3.528e-02)); + r += mul(s7_2, M4(3.107e-02, -8.318e-02, -3.956e-02, 2.245e-02, 6.957e-02, 2.143e-02, -6.687e-02, 1.294e-02, 1.749e-02, -2.284e-02, 1.119e-01, 8.031e-03, -3.842e-02, -1.248e-01, 1.727e-01, 7.133e-02)); + r += mul(s7_3, M4(5.292e-02, 8.579e-02, -3.654e-02, -9.238e-02, -1.451e-02, 1.251e-01, 1.535e-03, 8.453e-02, -3.673e-02, -6.283e-02, 1.648e-02, 4.689e-02, 1.727e-01, -3.341e-03, -1.745e-01, -9.239e-02)); + r += mul(s7_4, M4(9.484e-03, 1.112e-01, -3.333e-02, -1.463e-01, -4.327e-02, 7.501e-02, 6.370e-02, -5.664e-02, -5.735e-02, -2.845e-02, -4.963e-02, 8.615e-02, 4.983e-02, 2.317e-01, 9.224e-03, 3.614e-02)); + r += mul(s7_5, M4(-4.812e-02, -1.102e-01, -3.947e-02, -7.464e-02, 4.965e-02, 1.356e-01, 7.896e-02, 5.029e-03, -3.786e-02, -5.606e-02, 2.761e-02, -2.699e-02, 7.781e-02, -2.900e-01, 9.253e-02, 1.759e-01)); + r += mul(s7_6, M4(2.075e-02, 9.525e-02, 3.078e-02, 7.512e-02, -3.387e-02, 1.460e-01, -7.847e-02, 3.001e-02, -3.900e-02, 2.520e-01, 3.179e-02, -1.522e-01, 1.620e-01, 5.111e-02, -6.999e-02, 1.060e-01)); + r += mul(s7_7, M4(8.715e-03, 5.712e-02, -5.084e-02, 2.632e-02, 3.210e-02, -5.303e-02, -4.228e-02, -7.933e-02, -1.078e-01, 9.788e-02, 1.451e-01, -1.347e-01, 3.977e-02, -1.189e-01, -1.289e-01, 7.335e-02)); + r += mul(s7_8, M4(-5.911e-02, 1.363e-02, 3.665e-02, 4.175e-02, 1.131e-02, -3.395e-02, -1.990e-02, -9.542e-03, -2.874e-02, -4.118e-02, 1.667e-02, -7.509e-02, 3.075e-02, -9.451e-02, 9.701e-02, 1.274e-01)); + r += V4(-2.087e-02, 8.365e-03, 3.822e-02, -1.004e-02); + return r; +} + +V4 f3(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-5.186e-02, -5.537e-03, 2.369e-02, -5.261e-02, -1.789e-01, -5.089e-02, -7.291e-03, -1.065e-01, -2.531e-02, -3.347e-02, 5.976e-03, 8.518e-02, 1.445e-02, -3.676e-02, 1.651e-02, -1.422e-02)); + r += mul(s0_1, M4(7.365e-03, -5.514e-02, -5.771e-02, -3.514e-03, 4.978e-01, -1.261e-01, 2.827e-01, 8.266e-02, 9.005e-02, -1.923e-01, 4.595e-02, 2.282e-01, 9.758e-02, -4.172e-03, 7.787e-02, 9.638e-02)); + r += mul(s0_2, M4(5.664e-03, 6.797e-03, 4.860e-02, 7.314e-03, -2.101e-01, -8.617e-02, -4.768e-02, 5.512e-02, -3.253e-02, -1.228e-01, -3.881e-02, -5.309e-02, 6.288e-02, -7.397e-02, 1.233e-01, -6.095e-03)); + r += mul(s0_3, M4(9.081e-02, 2.910e-02, 2.229e-02, 5.761e-02, -1.061e-01, 5.928e-01, -9.201e-01, -1.884e-02, 6.669e-02, -1.057e-02, -8.456e-03, -1.213e-01, 6.156e-02, 4.088e-03, 4.034e-02, -9.234e-03)); + r += mul(s0_4, M4(1.579e-02, 1.365e-02, 2.926e-02, 5.481e-02, 8.783e-01, 5.205e-01, -1.973e-01, 2.039e-02, -1.500e-02, 4.624e-02, -3.470e-02, 6.766e-02, 1.261e-01, -9.425e-02, 1.121e-01, -1.359e-01)); + r += mul(s0_5, M4(8.009e-03, -7.407e-02, -7.806e-02, 3.210e-02, 1.047e-01, 6.242e-02, -1.968e-01, 1.861e-02, 5.884e-02, 1.685e-01, 3.460e-02, 9.654e-02, -1.731e-02, 5.947e-02, 1.207e-02, -2.139e-02)); + r += mul(s0_6, M4(-6.461e-04, -7.738e-02, -6.154e-02, 2.020e-02, 6.114e-01, 8.338e-01, -2.539e-01, 1.945e-01, 3.715e-02, 8.291e-02, -1.281e-01, -1.962e-02, -8.719e-02, -5.726e-02, 1.984e-02, -2.301e-02)); + r += mul(s0_7, M4(8.944e-03, -1.180e-01, -3.260e-02, -8.288e-02, 5.580e-01, 1.819e-01, -1.055e-01, -4.954e-02, -2.117e-03, 6.767e-02, 1.805e-01, -2.507e-02, -7.247e-02, -2.483e-02, 6.030e-02, 7.295e-02)); + r += mul(s0_8, M4(8.174e-02, -1.312e-02, -1.040e-03, -7.740e-02, 1.428e-01, -1.759e-01, 2.594e-01, 3.677e-03, 4.413e-02, 5.259e-02, -1.474e-02, 1.009e-02, -1.727e-02, -1.805e-02, 1.198e-01, 3.637e-03)); + r += mul(s1_0, M4(-1.429e-01, -3.566e-02, -3.506e-02, -1.421e-02, -9.504e-02, -8.328e-02, -2.046e-02, -1.898e-02, 8.700e-03, 1.643e-02, 4.432e-02, 9.043e-02, -3.787e-02, -4.207e-02, 3.174e-03, -5.154e-02)); + r += mul(s1_1, M4(7.942e-02, 1.860e-02, 1.844e-01, -1.654e-02, 6.416e-02, -5.572e-02, 4.771e-02, 5.403e-02, -2.890e-02, -6.370e-02, -6.170e-02, 9.796e-03, 9.547e-03, -1.810e-02, -5.481e-02, -3.555e-02)); + r += mul(s1_2, M4(-6.011e-02, -8.863e-02, 1.471e-01, 8.182e-02, -3.416e-02, -1.819e-02, -4.760e-02, 7.041e-03, -2.055e-02, 1.766e-03, 1.199e-01, 1.697e-01, -1.382e-01, 3.750e-02, 2.883e-02, -1.150e-01)); + r += mul(s1_3, M4(-7.160e-02, 5.820e-02, 8.351e-02, 1.104e-01, -3.941e-02, 1.396e-02, -1.016e-01, 6.790e-02, 1.341e-01, 5.572e-02, -5.254e-02, -8.326e-02, 5.552e-02, 1.079e-01, 9.147e-02, 1.187e-01)); + r += mul(s1_4, M4(1.958e-02, -2.435e-01, -7.386e-02, 2.677e-02, 2.828e-02, -1.012e-02, -3.403e-02, 4.901e-03, 4.395e-03, 3.006e-02, 5.583e-02, -7.418e-02, 1.435e-01, -5.313e-02, -5.963e-02, 6.607e-02)); + r += mul(s1_5, M4(-2.027e-01, -1.539e-02, -1.039e-01, -1.066e-01, 4.238e-03, 2.528e-02, -1.514e-02, 4.263e-02, -9.176e-02, -6.023e-02, 4.109e-02, -5.228e-03, -7.283e-02, 1.362e-01, 3.012e-02, -1.114e-01)); + r += mul(s1_6, M4(2.261e-02, 1.224e-02, 8.824e-02, 1.870e-01, 1.328e-01, 2.603e-03, -5.553e-02, 1.089e-01, 1.792e-02, -2.273e-03, -1.100e-01, 3.768e-02, -1.192e-01, -8.333e-03, -4.026e-03, 1.260e-02)); + r += mul(s1_7, M4(5.822e-02, 7.994e-02, 1.209e-01, 3.664e-02, 9.369e-02, -1.645e-01, -6.200e-02, -1.238e-01, -1.373e-01, 3.009e-02, 1.260e-02, -1.854e-01, 7.095e-02, 6.288e-02, -6.089e-02, 1.096e-01)); + r += mul(s1_8, M4(-7.676e-02, 1.116e-01, -7.151e-02, 3.894e-02, 1.127e-02, 3.901e-02, -1.526e-02, 9.455e-02, -8.459e-02, -1.803e-01, -9.597e-02, -9.799e-02, -1.211e-01, 3.434e-02, 5.533e-02, -1.471e-02)); + r += mul(s2_0, M4(-2.601e-03, 1.487e-02, 8.944e-02, -6.765e-03, 6.154e-02, 1.853e-02, -2.615e-02, 1.179e-02, -2.676e-02, 7.439e-02, 2.106e-02, -2.097e-02, 3.093e-02, -8.687e-02, 5.337e-02, 3.475e-03)); + r += mul(s2_1, M4(-1.257e-01, 1.475e-01, 1.754e-02, -5.200e-02, -2.007e-01, 7.249e-02, 5.663e-02, -1.978e-01, -1.158e-01, -6.672e-02, 1.056e-01, -1.236e-01, 8.004e-03, -8.248e-02, 9.023e-03, 6.292e-02)); + r += mul(s2_2, M4(7.154e-02, 1.291e-01, -3.540e-02, 1.070e-01, -1.601e-01, -4.243e-02, 1.840e-01, -4.435e-02, 9.572e-03, 1.984e-01, -1.119e-02, -1.818e-01, 3.998e-02, -1.749e-01, -4.146e-02, -4.526e-03)); + r += mul(s2_3, M4(4.276e-02, -8.397e-02, 2.252e-02, 4.302e-02, -9.437e-02, -3.633e-02, 1.379e-01, -1.274e-01, 5.799e-02, 2.590e-01, -2.307e-02, -2.396e-02, 4.338e-02, 1.536e-02, 2.341e-02, 1.301e-01)); + r += mul(s2_4, M4(-1.189e-01, -2.813e-02, 1.248e-01, 1.002e-01, -1.256e-01, -9.355e-02, 4.911e-02, -1.429e-01, -1.471e-02, 8.852e-02, -1.080e-01, 8.591e-02, -4.678e-02, 6.644e-02, 2.068e-01, 9.896e-02)); + r += mul(s2_5, M4(-7.221e-02, -4.096e-02, -6.655e-03, -1.175e-02, 3.419e-02, -1.814e-01, -1.664e-02, 1.859e-02, 9.448e-02, 1.096e-01, -9.677e-02, -8.571e-02, -3.325e-02, 1.176e-01, 7.737e-02, 9.706e-02)); + r += mul(s2_6, M4(2.384e-02, 5.983e-02, -2.370e-02, 4.370e-02, -4.737e-02, 1.621e-01, 1.168e-01, 5.861e-02, 4.508e-02, -5.758e-02, 5.496e-02, 1.514e-02, -1.413e-01, -5.880e-02, -2.348e-02, -3.277e-03)); + r += mul(s2_7, M4(-9.729e-02, 2.059e-03, 3.092e-02, -3.349e-02, 1.803e-01, 7.051e-02, -6.959e-02, 4.558e-02, 1.372e-02, 1.978e-01, 9.990e-02, 9.627e-02, -4.061e-02, -7.983e-02, 5.642e-02, 1.376e-02)); + r += mul(s2_8, M4(-6.405e-02, 1.463e-03, -4.239e-02, -2.958e-03, -3.957e-02, -2.787e-02, -1.185e-01, 8.049e-02, 5.641e-02, -7.839e-02, -1.478e-02, 5.297e-02, -1.052e-01, -2.614e-02, 3.366e-02, -2.113e-02)); + r += mul(s3_0, M4(1.090e-01, 9.970e-02, 4.323e-02, -8.377e-02, 1.532e-01, -3.260e-02, -9.920e-03, -8.339e-03, 2.015e-02, -2.037e-02, -5.245e-02, 7.484e-02, 2.756e-02, 1.694e-02, 9.995e-02, -1.103e-01)); + r += mul(s3_1, M4(-1.893e-01, 7.219e-02, -2.182e-01, -1.209e-01, -5.359e-02, 2.129e-02, -1.369e-02, 4.418e-03, -6.035e-02, -5.682e-02, 4.640e-02, 6.798e-02, 6.897e-02, -9.109e-02, -2.157e-02, -3.555e-02)); + r += mul(s3_2, M4(4.793e-02, -1.105e-01, -5.833e-02, 3.987e-02, -4.859e-03, 1.350e-02, -2.157e-02, 4.861e-02, 7.932e-03, -8.539e-02, 3.680e-03, -1.255e-01, -4.018e-02, 3.915e-04, -1.081e-01, -7.704e-02)); + r += mul(s3_3, M4(-1.794e-02, -8.453e-02, 4.418e-02, 8.425e-02, 4.736e-02, -2.773e-02, 3.350e-02, 3.066e-02, -8.311e-02, -7.339e-02, -6.158e-02, 4.223e-03, 1.174e-01, -1.238e-01, -1.274e-01, -3.384e-02)); + r += mul(s3_4, M4(-7.496e-02, -2.420e-02, 1.306e-01, 1.313e-01, 3.237e-02, -2.935e-02, 2.360e-01, 1.410e-01, -8.003e-02, -5.377e-02, -7.184e-02, 5.397e-02, -1.046e-01, 1.099e-02, -1.025e-01, -3.341e-02)); + r += mul(s3_5, M4(-6.928e-03, -1.140e-01, 4.074e-03, -1.397e-01, 7.265e-02, 8.207e-02, 1.169e-01, 9.509e-02, 5.067e-02, 7.042e-02, -4.241e-02, -7.893e-02, -1.161e-01, 1.654e-01, -1.081e-01, 4.884e-02)); + r += mul(s3_6, M4(1.366e-01, 3.662e-02, 2.739e-02, 1.724e-02, 3.352e-02, -8.119e-02, 4.512e-02, -6.095e-02, 3.507e-02, -2.561e-03, 1.192e-02, 2.593e-02, 2.648e-02, -2.577e-04, -6.683e-02, -1.309e-01)); + r += mul(s3_7, M4(1.421e-01, 5.626e-02, 4.526e-02, -5.287e-02, 1.482e-02, -3.645e-03, 4.018e-02, -1.501e-02, -9.036e-03, 6.154e-02, 3.938e-02, 6.123e-02, 9.404e-02, -3.154e-02, 2.484e-02, -8.405e-02)); + r += mul(s3_8, M4(1.375e-01, 5.461e-02, -1.043e-01, 2.440e-02, 5.996e-02, 5.291e-02, 5.187e-03, 2.591e-02, 3.009e-02, -3.233e-02, -5.586e-02, 2.986e-02, -4.387e-02, 4.745e-02, -8.559e-02, -2.285e-02)); + r += mul(s4_0, M4(-1.211e-01, 1.178e-02, -1.310e-01, -1.610e-01, 6.647e-02, 9.235e-02, 1.913e-02, -4.300e-02, -7.907e-02, -1.415e-02, 2.711e-02, 2.482e-01, -2.717e-02, 2.984e-02, 1.237e-02, 6.918e-02)); + r += mul(s4_1, M4(-5.608e-02, 1.109e-01, 9.857e-03, -1.931e-01, 3.601e-02, -1.316e-01, 2.161e-01, 1.744e-01, -1.295e-01, -4.955e-02, -1.476e-02, 8.352e-02, 8.242e-03, -1.597e-01, -2.525e-01, 3.094e-02)); + r += mul(s4_2, M4(-5.709e-02, 4.297e-02, -6.204e-03, -1.451e-01, 1.232e-01, 4.680e-02, -7.479e-02, 1.103e-01, 4.190e-02, -4.362e-04, 1.231e-01, -7.856e-02, -4.570e-02, 1.372e-01, -8.977e-02, -6.952e-03)); + r += mul(s4_3, M4(-6.566e-02, 7.624e-02, -8.168e-02, 3.406e-02, -3.176e-02, 3.998e-02, -6.471e-02, -5.760e-02, -5.961e-02, 1.382e-01, 6.583e-03, -1.000e-01, -1.831e-01, -1.154e-01, -1.380e-01, -6.434e-02)); + r += mul(s4_4, M4(6.403e-02, -2.450e-01, 2.792e-01, 7.430e-02, 1.759e-01, -1.725e-01, -1.845e-02, 3.502e-02, -3.869e-01, -3.381e-02, -4.831e-02, 1.339e-01, -1.262e-01, 1.916e-01, -2.321e-01, 2.760e-02)); + r += mul(s4_5, M4(6.912e-02, -2.182e-01, -1.369e-02, -9.720e-02, 5.835e-02, 9.719e-02, -8.650e-03, -5.648e-02, 1.346e-01, -3.950e-02, 2.490e-02, 8.071e-02, 2.864e-01, -2.457e-01, 1.326e-01, -3.384e-02)); + r += mul(s4_6, M4(-7.945e-02, -5.946e-02, -2.633e-02, -3.784e-03, 7.830e-02, 3.878e-02, -6.279e-02, 6.114e-02, -1.734e-01, -2.466e-01, -7.366e-02, 7.738e-03, 2.224e-01, -4.195e-02, 1.471e-01, 2.958e-02)); + r += mul(s4_7, M4(-3.012e-02, -4.977e-02, 2.020e-02, -1.498e-02, 5.735e-03, -1.735e-02, -1.485e-01, -1.320e-01, -3.990e-03, 3.615e-02, -4.818e-02, 1.846e-01, 2.854e-02, 4.293e-02, -8.675e-02, 9.421e-02)); + r += mul(s4_8, M4(1.392e-02, 7.286e-02, 1.063e-01, 9.212e-02, 4.501e-02, 1.268e-01, -5.199e-02, 1.414e-01, 7.748e-02, 1.673e-01, 1.055e-01, 4.698e-02, 9.681e-02, 1.470e-02, -1.188e-02, 2.931e-02)); + r += mul(s5_0, M4(-2.778e-02, 7.259e-03, -1.944e-02, -8.716e-02, 7.302e-02, -1.512e-02, 1.064e-01, -1.628e-02, 1.714e-02, -1.652e-02, -6.626e-02, 9.806e-03, 7.275e-02, 2.299e-02, -1.215e-02, 5.639e-02)); + r += mul(s5_1, M4(-1.405e-02, 6.730e-02, 4.423e-03, -1.781e-02, -5.842e-02, -5.191e-02, 8.031e-02, 1.321e-01, 9.880e-02, -8.154e-02, 1.329e-01, 8.414e-02, 2.984e-02, -8.208e-02, -2.121e-01, 3.640e-02)); + r += mul(s5_2, M4(4.550e-02, -5.010e-02, 9.170e-02, -9.450e-02, 3.401e-02, -2.799e-03, -3.152e-02, 9.824e-02, 2.436e-02, -2.393e-02, -2.029e-02, 6.419e-02, 4.413e-02, -2.446e-03, -2.047e-02, 1.147e-01)); + r += mul(s5_3, M4(-2.840e-02, -7.165e-02, 7.020e-02, -8.385e-02, 5.416e-02, 3.992e-02, 1.816e-02, 7.835e-02, -1.086e-01, -1.053e-02, -1.199e-01, -4.429e-02, 5.368e-02, 9.435e-02, 5.670e-02, 3.818e-02)); + r += mul(s5_4, M4(1.626e-02, -8.816e-02, -4.112e-02, 3.632e-02, 7.316e-02, 6.900e-02, -1.175e-02, 9.253e-02, -1.146e-02, -3.119e-02, 1.160e-01, 8.238e-02, -4.943e-02, 1.098e-01, 8.908e-05, 1.880e-01)); + r += mul(s5_5, M4(5.537e-02, -1.917e-01, 7.857e-03, -3.432e-02, 1.487e-01, 4.405e-02, -1.281e-02, -5.382e-02, -4.463e-02, -7.680e-02, 4.381e-02, 9.402e-02, -5.056e-03, 1.299e-01, 1.167e-01, 3.922e-02)); + r += mul(s5_6, M4(7.272e-02, -1.016e-01, 7.230e-02, -6.521e-03, 3.164e-02, -8.305e-04, -1.127e-01, 4.924e-03, -1.151e-01, 8.617e-04, -2.434e-02, -4.304e-02, -5.518e-03, 1.628e-02, 8.518e-02, -2.193e-02)); + r += mul(s5_7, M4(5.172e-02, -4.530e-02, -9.674e-03, 5.678e-02, 2.628e-02, -2.106e-02, -7.339e-02, 2.674e-02, -1.353e-01, -6.893e-02, -4.627e-03, 9.704e-02, 3.844e-02, -1.789e-02, 6.056e-02, 7.471e-02)); + r += mul(s5_8, M4(1.141e-01, 2.858e-02, 1.699e-02, 5.123e-02, 5.192e-02, 7.121e-02, -7.796e-03, 3.388e-02, -3.085e-02, -6.441e-02, 4.687e-02, 8.458e-02, 4.593e-02, 5.097e-02, -4.951e-02, 1.479e-02)); + r += mul(s6_0, M4(1.509e-01, -2.423e-01, -1.645e-01, -1.774e-01, -4.401e-02, 4.057e-02, -4.384e-02, 5.572e-02, 1.538e-01, 2.158e-02, 1.057e-01, 3.614e-03, -1.312e-01, 1.864e-02, -2.287e-02, -1.765e-02)); + r += mul(s6_1, M4(-9.463e-02, -2.675e-02, -2.744e-01, 3.083e-02, 4.534e-02, 1.117e-01, 5.833e-02, 1.769e-01, -2.594e-02, 1.808e-01, 4.166e-02, -2.937e-01, 5.296e-02, -1.342e-01, -1.411e-01, -7.903e-04)); + r += mul(s6_2, M4(1.083e-02, -1.455e-01, 7.690e-02, -8.471e-02, -5.061e-02, -3.029e-02, -1.210e-01, -2.602e-02, 6.333e-03, 1.336e-01, 5.051e-02, 1.871e-01, -6.528e-02, -9.885e-03, -1.005e-01, 4.859e-02)); + r += mul(s6_3, M4(1.362e-01, 1.818e-01, -1.686e-01, -5.426e-02, 2.551e-02, -1.676e-01, 5.143e-02, 1.961e-01, 8.181e-02, 1.676e-02, 2.382e-02, 7.826e-02, -8.471e-02, 1.614e-02, -7.251e-02, -1.279e-01)); + r += mul(s6_4, M4(-1.480e-01, -9.214e-02, -2.628e-01, -1.936e-01, 4.964e-03, -1.214e-01, 3.683e-02, -2.254e-02, -6.095e-02, -6.845e-02, -9.225e-02, -1.052e-01, -5.893e-02, 1.209e-01, -1.291e-01, -2.439e-01)); + r += mul(s6_5, M4(3.835e-03, -6.351e-02, -9.311e-02, -7.334e-03, -1.209e-01, 5.373e-02, -1.767e-01, 4.527e-02, 3.871e-02, -4.796e-02, 9.536e-02, -4.771e-02, -4.192e-02, 1.118e-01, -1.233e-01, 1.245e-01)); + r += mul(s6_6, M4(1.432e-01, 3.526e-02, -8.615e-03, -5.596e-03, -8.724e-02, -1.202e-05, 1.354e-01, 1.440e-02, 1.297e-01, 3.398e-02, 2.254e-02, 8.219e-03, -1.078e-01, -8.905e-02, -7.674e-02, -9.887e-02)); + r += mul(s6_7, M4(4.810e-03, -3.622e-02, 1.863e-03, 6.525e-03, -9.613e-02, 5.216e-02, -1.495e-01, 4.366e-02, 2.703e-02, -6.686e-02, -1.057e-01, -5.789e-02, -5.245e-02, -4.184e-02, 4.506e-02, -8.658e-02)); + r += mul(s6_8, M4(8.041e-02, 3.344e-02, -1.428e-01, -7.399e-03, -3.671e-02, -4.430e-02, 4.760e-02, 5.942e-02, 9.507e-02, -9.050e-02, 5.261e-02, 1.832e-02, 3.325e-02, 4.292e-02, -3.349e-02, 7.272e-02)); + r += mul(s7_0, M4(4.832e-02, -4.859e-02, 9.221e-02, 6.436e-02, 1.284e-01, 7.635e-03, -4.190e-02, -3.847e-02, -6.610e-03, 7.178e-03, 4.257e-02, -3.234e-02, 1.537e-01, -7.209e-02, -2.415e-02, 1.619e-02)); + r += mul(s7_1, M4(4.043e-02, -7.037e-02, 2.596e-02, 5.261e-02, 1.106e-03, 5.223e-02, -6.416e-04, -4.329e-02, -4.023e-02, 2.219e-02, 1.111e-01, 6.614e-03, 2.460e-01, -2.125e-01, -1.595e-01, 4.183e-01)); + r += mul(s7_2, M4(-1.914e-02, -7.829e-02, -1.925e-02, 4.404e-02, 5.143e-02, 6.391e-03, 6.923e-02, -1.394e-01, -7.542e-02, -3.202e-02, -9.787e-02, -1.178e-02, 3.474e-01, 9.006e-02, 4.054e-02, 1.489e-01)); + r += mul(s7_3, M4(8.782e-02, 4.702e-02, 9.328e-03, -6.809e-02, 5.176e-02, -8.772e-02, 3.221e-02, -2.936e-02, 1.601e-02, 5.282e-02, 4.535e-02, 1.194e-01, -1.057e-01, -1.289e-01, -8.726e-02, 4.259e-02)); + r += mul(s7_4, M4(-8.521e-02, 1.477e-02, -3.481e-02, -5.570e-03, 1.721e-02, -6.721e-02, -2.596e-02, 1.141e-01, -9.061e-02, 5.655e-02, 4.107e-02, 4.639e-02, -8.228e-02, 3.297e-01, -1.414e-01, -7.709e-02)); + r += mul(s7_5, M4(-4.180e-02, 6.089e-02, -3.896e-02, 2.700e-02, 2.710e-02, 4.737e-02, 5.740e-03, -8.129e-02, -1.322e-01, 6.664e-02, 1.096e-01, 1.229e-01, -2.098e-02, -4.566e-03, -1.994e-01, 1.441e-01)); + r += mul(s7_6, M4(4.268e-02, -5.790e-02, -1.169e-02, -4.623e-02, -9.484e-02, -1.706e-02, -3.299e-02, 5.764e-02, 6.127e-02, -1.248e-01, -1.142e-01, -8.612e-02, -3.881e-02, -1.761e-01, -7.335e-04, -1.433e-01)); + r += mul(s7_7, M4(-8.534e-02, -1.768e-02, 1.435e-01, -3.567e-02, 9.773e-03, 1.343e-01, -1.104e-02, -5.990e-02, -2.977e-02, -7.796e-02, 3.464e-02, 3.066e-02, -1.320e-01, 8.156e-02, -2.225e-01, -1.418e-01)); + r += mul(s7_8, M4(-7.379e-02, 1.992e-02, -8.426e-02, 2.140e-02, 9.552e-02, 2.910e-02, -4.536e-03, 2.327e-02, -4.916e-02, -2.219e-02, -8.136e-02, 5.215e-02, 2.548e-01, 3.631e-02, -7.345e-02, -4.995e-02)); + r += V4(-2.222e-02, -7.473e-03, 1.007e-02, 2.959e-02); + return r; +} + +void Pass10(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = Rmp8x8(tid.x) + blockStart; + uint2 size = GetInputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = (gxy + 0.5) * pt; + + V4 s0_0 = l0(-1.0, -1.0); + V4 s0_1 = l0(0.0, -1.0); + V4 s0_2 = l0(1.0, -1.0); + V4 s0_3 = l0(-1.0, 0.0); + V4 s0_4 = l0(0.0, 0.0); + V4 s0_5 = l0(1.0, 0.0); + V4 s0_6 = l0(-1.0, 1.0); + V4 s0_7 = l0(0.0, 1.0); + V4 s0_8 = l0(1.0, 1.0); + V4 s1_0 = -max(-s0_0, 0.0); + V4 s1_1 = -max(-s0_1, 0.0); + V4 s1_2 = -max(-s0_2, 0.0); + V4 s1_3 = -max(-s0_3, 0.0); + V4 s1_4 = -max(-s0_4, 0.0); + V4 s1_5 = -max(-s0_5, 0.0); + V4 s1_6 = -max(-s0_6, 0.0); + V4 s1_7 = -max(-s0_7, 0.0); + V4 s1_8 = -max(-s0_8, 0.0); + s0_0 = max(s0_0, 0.0); + s0_1 = max(s0_1, 0.0); + s0_2 = max(s0_2, 0.0); + s0_3 = max(s0_3, 0.0); + s0_4 = max(s0_4, 0.0); + s0_5 = max(s0_5, 0.0); + s0_6 = max(s0_6, 0.0); + s0_7 = max(s0_7, 0.0); + s0_8 = max(s0_8, 0.0); + + V4 s2_0 = l1(-1.0, -1.0); + V4 s2_1 = l1(0.0, -1.0); + V4 s2_2 = l1(1.0, -1.0); + V4 s2_3 = l1(-1.0, 0.0); + V4 s2_4 = l1(0.0, 0.0); + V4 s2_5 = l1(1.0, 0.0); + V4 s2_6 = l1(-1.0, 1.0); + V4 s2_7 = l1(0.0, 1.0); + V4 s2_8 = l1(1.0, 1.0); + V4 s3_0 = -max(-s2_0, 0.0); + V4 s3_1 = -max(-s2_1, 0.0); + V4 s3_2 = -max(-s2_2, 0.0); + V4 s3_3 = -max(-s2_3, 0.0); + V4 s3_4 = -max(-s2_4, 0.0); + V4 s3_5 = -max(-s2_5, 0.0); + V4 s3_6 = -max(-s2_6, 0.0); + V4 s3_7 = -max(-s2_7, 0.0); + V4 s3_8 = -max(-s2_8, 0.0); + s2_0 = max(s2_0, 0.0); + s2_1 = max(s2_1, 0.0); + s2_2 = max(s2_2, 0.0); + s2_3 = max(s2_3, 0.0); + s2_4 = max(s2_4, 0.0); + s2_5 = max(s2_5, 0.0); + s2_6 = max(s2_6, 0.0); + s2_7 = max(s2_7, 0.0); + s2_8 = max(s2_8, 0.0); + + V4 s4_0 = l2(-1.0, -1.0); + V4 s4_1 = l2(0.0, -1.0); + V4 s4_2 = l2(1.0, -1.0); + V4 s4_3 = l2(-1.0, 0.0); + V4 s4_4 = l2(0.0, 0.0); + V4 s4_5 = l2(1.0, 0.0); + V4 s4_6 = l2(-1.0, 1.0); + V4 s4_7 = l2(0.0, 1.0); + V4 s4_8 = l2(1.0, 1.0); + V4 s5_0 = -max(-s4_0, 0.0); + V4 s5_1 = -max(-s4_1, 0.0); + V4 s5_2 = -max(-s4_2, 0.0); + V4 s5_3 = -max(-s4_3, 0.0); + V4 s5_4 = -max(-s4_4, 0.0); + V4 s5_5 = -max(-s4_5, 0.0); + V4 s5_6 = -max(-s4_6, 0.0); + V4 s5_7 = -max(-s4_7, 0.0); + V4 s5_8 = -max(-s4_8, 0.0); + s4_0 = max(s4_0, 0.0); + s4_1 = max(s4_1, 0.0); + s4_2 = max(s4_2, 0.0); + s4_3 = max(s4_3, 0.0); + s4_4 = max(s4_4, 0.0); + s4_5 = max(s4_5, 0.0); + s4_6 = max(s4_6, 0.0); + s4_7 = max(s4_7, 0.0); + s4_8 = max(s4_8, 0.0); + + V4 s6_0 = l3(-1.0, -1.0); + V4 s6_1 = l3(0.0, -1.0); + V4 s6_2 = l3(1.0, -1.0); + V4 s6_3 = l3(-1.0, 0.0); + V4 s6_4 = l3(0.0, 0.0); + V4 s6_5 = l3(1.0, 0.0); + V4 s6_6 = l3(-1.0, 1.0); + V4 s6_7 = l3(0.0, 1.0); + V4 s6_8 = l3(1.0, 1.0); + V4 s7_0 = -max(-s6_0, 0.0); + V4 s7_1 = -max(-s6_1, 0.0); + V4 s7_2 = -max(-s6_2, 0.0); + V4 s7_3 = -max(-s6_3, 0.0); + V4 s7_4 = -max(-s6_4, 0.0); + V4 s7_5 = -max(-s6_5, 0.0); + V4 s7_6 = -max(-s6_6, 0.0); + V4 s7_7 = -max(-s6_7, 0.0); + V4 s7_8 = -max(-s6_8, 0.0); + s6_0 = max(s6_0, 0.0); + s6_1 = max(s6_1, 0.0); + s6_2 = max(s6_2, 0.0); + s6_3 = max(s6_3, 0.0); + s6_4 = max(s6_4, 0.0); + s6_5 = max(s6_5, 0.0); + s6_6 = max(s6_6, 0.0); + s6_7 = max(s6_7, 0.0); + s6_8 = max(s6_8, 0.0); + + t4[gxy] = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t5[gxy] = f1(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t6[gxy] = f2(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t7[gxy] = f3(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); +} + +//!PASS 11 +//!DESC conv10 +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 +//!IN t4, t5, t6, t7 +//!OUT t0, t1, t2, t3 + +#define l0(x, y) V4(O(t4, float2(x, y))) +#define l1(x, y) V4(O(t5, float2(x, y))) +#define l2(x, y) V4(O(t6, float2(x, y))) +#define l3(x, y) V4(O(t7, float2(x, y))) + +V4 f0(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-7.443e-02, -2.491e-02, 5.251e-03, 2.278e-03, 7.358e-03, 3.232e-02, 6.993e-04, 8.365e-02, 1.406e-01, -1.463e-02, -4.391e-02, -5.550e-02, -8.043e-02, -2.190e-02, 5.767e-03, 1.002e-01)); + r += mul(s0_1, M4(-9.990e-03, 3.600e-02, 1.256e-01, 8.596e-02, -3.771e-02, 3.026e-02, -8.820e-02, -1.091e-01, -7.490e-02, -3.519e-02, -1.456e-01, 1.001e-01, -6.054e-02, 1.960e-02, 1.759e-02, -8.544e-02)); + r += mul(s0_2, M4(1.548e-02, -6.636e-02, 7.641e-02, -6.122e-02, -7.148e-02, -6.168e-02, -1.443e-01, 2.369e-02, -2.372e-03, 1.086e-01, -4.066e-02, 3.865e-02, -5.652e-02, -1.638e-02, -3.904e-02, 9.811e-03)); + r += mul(s0_3, M4(7.849e-02, -3.489e-02, -5.032e-02, 2.365e-02, -1.519e-01, 2.447e-02, 9.641e-02, -6.077e-02, 7.374e-02, 1.298e-01, 3.015e-02, 6.463e-02, -7.396e-02, -7.937e-02, -3.670e-02, 1.363e-01)); + r += mul(s0_4, M4(1.697e-01, -6.906e-02, 7.260e-02, 1.256e-01, -2.378e-01, -1.406e-01, -2.639e-01, 4.905e-02, -5.264e-02, -1.421e-01, 1.012e-02, 1.198e-01, -3.589e-02, 8.241e-02, 1.130e-02, -5.852e-02)); + r += mul(s0_5, M4(2.248e-01, -2.462e-01, -5.329e-02, 1.711e-02, -2.105e-01, -8.250e-02, -4.665e-02, 8.654e-02, 9.518e-02, 1.235e-01, 6.224e-02, -4.567e-02, -8.524e-02, -5.822e-02, 6.281e-02, 1.470e-01)); + r += mul(s0_6, M4(-7.451e-02, 1.371e-01, 1.032e-02, -5.772e-02, -1.636e-01, -1.318e-01, -8.817e-02, -8.507e-02, 6.603e-02, 1.297e-02, -4.173e-02, 1.295e-01, -6.974e-02, 4.060e-02, 5.109e-02, 1.011e-01)); + r += mul(s0_7, M4(-1.447e-01, 4.492e-02, 4.542e-02, -1.319e-01, -1.156e-01, -3.776e-02, -2.669e-02, -1.197e-01, -6.502e-02, 4.076e-02, 1.353e-02, -1.404e-01, -9.392e-02, 3.072e-02, -9.582e-02, -2.347e-01)); + r += mul(s0_8, M4(4.432e-02, -3.884e-02, 1.475e-01, -8.128e-02, 8.425e-02, -1.151e-01, 3.016e-02, 1.669e-02, 7.371e-02, 9.169e-02, -2.322e-02, 5.721e-02, -1.104e-01, 7.700e-03, -6.599e-02, -9.597e-02)); + r += mul(s1_0, M4(-4.455e-02, -1.914e-01, 1.410e-01, 8.961e-03, -4.278e-02, -3.920e-02, 1.085e-02, 4.053e-02, 4.494e-02, -1.222e-01, 3.310e-02, -9.746e-02, -4.951e-02, 2.743e-02, -2.652e-03, -1.583e-01)); + r += mul(s1_1, M4(4.930e-02, 1.019e-01, 4.969e-02, -8.982e-02, 7.666e-02, 7.991e-03, 6.734e-02, -6.309e-02, -1.391e-01, -1.741e-01, -1.507e-01, 2.061e-02, -1.027e-01, 9.436e-02, -2.202e-02, 6.426e-02)); + r += mul(s1_2, M4(-8.979e-02, -1.902e-01, 9.320e-02, 9.425e-02, 6.001e-03, 1.530e-02, -4.575e-02, -5.501e-03, -1.559e-01, -2.938e-02, 3.153e-02, -2.076e-02, -2.337e-02, -1.082e-01, -1.046e-01, -2.440e-01)); + r += mul(s1_3, M4(-1.011e-01, -6.263e-02, -8.168e-02, 1.249e-04, 3.329e-02, 6.307e-03, 7.876e-03, -3.334e-02, -1.334e-01, 4.970e-02, 1.646e-01, 1.806e-04, 2.558e-01, 3.352e-02, -7.658e-02, -4.535e-02)); + r += mul(s1_4, M4(1.211e-02, 1.877e-01, 7.255e-02, 9.566e-02, -5.844e-02, -1.944e-01, -1.337e-01, -8.781e-03, -1.953e-01, -3.020e-01, -2.492e-02, -1.460e-01, -7.804e-02, 1.704e-01, -1.269e-01, -2.229e-01)); + r += mul(s1_5, M4(-7.728e-03, 1.592e-01, -1.386e-01, 2.610e-02, 9.133e-02, 1.079e-01, -7.939e-02, -2.377e-02, -8.809e-02, 5.482e-02, 1.655e-01, -1.374e-01, 8.858e-02, -1.962e-01, 5.542e-03, -1.841e-01)); + r += mul(s1_6, M4(8.820e-02, 1.275e-01, 2.735e-02, -1.304e-01, 1.287e-03, -3.758e-02, -5.923e-02, -1.295e-02, -1.429e-01, -1.411e-01, 1.145e-03, 6.254e-02, -5.481e-02, -9.508e-03, -1.431e-01, -5.138e-02)); + r += mul(s1_7, M4(1.947e-02, 9.372e-02, 2.449e-01, -1.107e-01, 3.266e-02, -1.639e-02, 1.476e-01, -5.366e-02, -2.258e-01, -1.325e-01, 1.323e-01, -2.162e-02, 1.078e-02, 2.901e-01, -1.970e-01, 7.560e-02)); + r += mul(s1_8, M4(-5.304e-02, 5.358e-02, 5.178e-02, -7.842e-02, 2.189e-01, 2.961e-02, 3.601e-02, -7.544e-02, -7.790e-02, -3.727e-02, 4.402e-02, 9.522e-02, 3.025e-02, -4.522e-02, -2.606e-02, -1.037e-01)); + r += mul(s2_0, M4(-1.154e-02, 1.779e-02, 2.786e-02, 4.385e-02, -1.039e-01, -1.154e-01, 1.159e-03, -6.035e-02, -8.846e-02, 2.845e-01, -1.438e-01, -1.155e-01, -4.495e-03, 1.542e-03, -1.795e-02, -7.339e-02)); + r += mul(s2_1, M4(-5.627e-02, -8.331e-04, 7.773e-02, 6.266e-02, 8.456e-03, 3.525e-02, -8.042e-02, 1.025e-01, -1.650e-01, 1.121e-01, -5.114e-02, -8.998e-02, -9.728e-03, 1.164e-01, 2.115e-02, -1.314e-01)); + r += mul(s2_2, M4(8.318e-02, 4.123e-02, 5.981e-02, 5.632e-02, -1.790e-01, -7.988e-02, -2.205e-02, 2.235e-03, -1.223e-01, 1.745e-01, 9.004e-02, 1.518e-01, 2.596e-02, 6.662e-03, -1.266e-02, -6.990e-02)); + r += mul(s2_3, M4(-3.095e-02, -2.132e-02, -7.726e-02, -1.791e-01, -8.083e-02, 4.191e-02, -1.401e-01, -1.086e-01, 6.522e-02, -1.365e-01, 2.249e-03, -7.607e-03, 6.612e-02, -5.534e-02, -9.837e-03, 8.180e-02)); + r += mul(s2_4, M4(-1.416e-01, -1.603e-02, 1.606e-01, -8.351e-02, -5.110e-02, -7.777e-02, -1.040e-01, -4.049e-02, 2.306e-01, 1.093e-01, 2.252e-01, -2.493e-01, -8.255e-03, -3.764e-02, -1.309e-01, -2.717e-01)); + r += mul(s2_5, M4(1.661e-02, 4.872e-02, 4.107e-03, -4.751e-03, -2.718e-01, -2.163e-01, -1.021e-01, -8.131e-02, -4.775e-02, -1.105e-01, -2.879e-01, -6.566e-02, 1.796e-02, -1.296e-01, 5.435e-02, -1.363e-01)); + r += mul(s2_6, M4(-9.353e-03, -1.422e-01, 1.012e-01, 8.128e-02, -7.881e-02, 1.535e-02, 2.834e-02, -1.763e-02, -9.610e-02, -6.383e-02, 2.115e-01, -8.985e-02, -7.448e-02, -1.822e-02, -3.225e-02, -1.333e-01)); + r += mul(s2_7, M4(-2.725e-02, 6.905e-02, -3.076e-02, -4.011e-02, 1.015e-02, 3.368e-02, -2.343e-02, -8.495e-02, -3.992e-03, 1.671e-03, -1.227e-01, 8.509e-02, 2.870e-02, 1.598e-01, -8.185e-02, -3.310e-01)); + r += mul(s2_8, M4(2.471e-01, -4.800e-02, -1.871e-02, -1.288e-01, -1.883e-01, -1.221e-02, -1.073e-01, -3.823e-02, -2.284e-01, -6.102e-02, -2.213e-01, 9.720e-02, -2.910e-02, 1.480e-01, 1.344e-01, -1.623e-01)); + r += mul(s3_0, M4(-6.625e-02, -1.278e-01, 9.770e-03, 5.171e-03, 6.653e-02, -1.805e-02, 2.589e-02, -1.813e-02, 3.330e-02, 3.777e-02, -1.823e-02, 2.923e-02, -1.319e-02, -3.354e-02, 1.742e-02, 5.094e-02)); + r += mul(s3_1, M4(-1.434e-02, 1.097e-01, 6.345e-02, -2.408e-02, 1.177e-02, 3.874e-02, -3.680e-02, 9.753e-02, 5.189e-02, -8.722e-03, -2.205e-02, 4.765e-02, -2.195e-02, 8.370e-02, 9.772e-03, -5.094e-02)); + r += mul(s3_2, M4(-1.681e-03, -9.392e-02, 2.710e-02, -2.582e-02, -7.773e-02, 3.851e-03, -8.569e-03, -1.003e-01, 1.439e-01, 1.497e-01, 1.401e-01, 1.280e-01, 2.289e-02, 2.038e-02, 1.827e-03, 1.431e-01)); + r += mul(s3_3, M4(-7.496e-02, -7.651e-02, -3.282e-02, 5.612e-02, 7.913e-02, 9.839e-02, 1.302e-01, -1.087e-02, -5.945e-03, -3.930e-02, 7.875e-02, 1.072e-01, -9.937e-02, -6.158e-02, 1.335e-03, 8.555e-02)); + r += mul(s3_4, M4(4.512e-03, 1.190e-01, 1.447e-01, -2.056e-01, -2.066e-02, -1.238e-01, 7.966e-02, 3.101e-02, -8.977e-02, 5.626e-02, -1.133e-02, 4.758e-02, -1.055e-01, 6.230e-02, 2.705e-02, 6.279e-02)); + r += mul(s3_5, M4(1.472e-01, 1.695e-02, 1.212e-02, 5.352e-02, 4.469e-02, 1.318e-01, 6.005e-02, 4.229e-02, 9.179e-02, 3.110e-02, 8.078e-02, -1.048e-01, 3.237e-02, -9.219e-02, 5.152e-03, 4.264e-02)); + r += mul(s3_6, M4(1.300e-02, -1.061e-01, 7.375e-02, 3.379e-02, -9.305e-03, -2.850e-02, 1.233e-02, -5.745e-02, 4.290e-02, -2.740e-02, 1.314e-01, -4.919e-02, -8.486e-02, -1.148e-01, 4.299e-04, 2.414e-02)); + r += mul(s3_7, M4(8.039e-02, 1.853e-01, 4.320e-02, -7.451e-02, 3.218e-02, -3.793e-02, 2.989e-02, 1.206e-01, -6.504e-02, 4.453e-02, 6.640e-02, -4.566e-02, -8.682e-02, -6.757e-02, -4.119e-02, -5.214e-02)); + r += mul(s3_8, M4(1.294e-01, 1.236e-02, -3.015e-03, -1.850e-02, 1.132e-01, 8.811e-02, 4.899e-02, -1.517e-02, 1.160e-01, 1.911e-02, -1.769e-03, 1.473e-02, 1.039e-01, 2.801e-02, 4.685e-02, 1.242e-01)); + r += mul(s4_0, M4(7.631e-02, -4.578e-02, -3.046e-02, -4.457e-02, 5.473e-02, -7.389e-02, -1.755e-04, 4.127e-02, -1.170e-01, -2.983e-02, -7.294e-02, 5.359e-02, 2.324e-02, -1.268e-01, -1.275e-02, 5.312e-02)); + r += mul(s4_1, M4(-4.916e-02, -1.148e-01, 6.671e-02, 1.366e-01, 1.663e-02, 7.092e-02, -3.335e-02, 7.167e-02, 6.764e-02, -1.304e-01, 9.522e-02, 4.013e-02, 2.975e-03, -1.921e-02, -3.123e-03, 6.587e-02)); + r += mul(s4_2, M4(3.974e-02, 2.701e-02, 1.490e-01, -4.959e-02, 1.142e-02, -1.092e-02, -2.233e-02, 1.269e-02, -1.083e-01, -1.432e-01, -2.230e-02, -7.123e-03, -3.790e-02, 9.273e-02, 4.352e-02, 1.492e-01)); + r += mul(s4_3, M4(1.076e-01, 8.338e-02, 1.369e-01, 1.978e-01, -1.222e-01, -6.275e-02, -9.606e-03, -1.044e-02, 3.965e-02, -8.872e-02, -8.133e-02, 5.930e-02, 1.145e-01, -3.811e-02, 2.754e-02, -8.336e-03)); + r += mul(s4_4, M4(-9.006e-02, -4.032e-03, 2.766e-02, 3.885e-02, -1.054e-01, -8.623e-02, -4.689e-02, 1.125e-01, 4.194e-02, 1.574e-01, 5.132e-02, 2.440e-01, 6.018e-02, 1.935e-01, 2.242e-02, 3.120e-02)); + r += mul(s4_5, M4(2.035e-01, 1.040e-01, 3.855e-02, -1.105e-01, -7.236e-02, 1.349e-01, 3.039e-02, 3.597e-02, 9.036e-02, -1.388e-01, 1.510e-02, 2.250e-02, 8.773e-02, -3.393e-02, -5.885e-02, -1.410e-01)); + r += mul(s4_6, M4(-1.548e-02, 8.332e-02, 4.180e-02, -1.206e-01, -8.834e-02, -1.059e-02, -5.289e-02, -1.763e-02, -1.925e-01, -4.318e-03, -1.554e-02, -1.647e-01, 6.316e-02, 1.847e-02, 1.278e-01, -1.416e-01)); + r += mul(s4_7, M4(-1.227e-02, -1.627e-01, -4.217e-02, 7.992e-02, -6.900e-02, -6.248e-02, -9.509e-02, -8.385e-02, -4.068e-02, 2.836e-02, 3.756e-02, -7.659e-03, -4.632e-02, 7.643e-02, 1.584e-01, -1.997e-01)); + r += mul(s4_8, M4(1.493e-01, 1.310e-01, 1.165e-01, -6.345e-03, 4.877e-02, -1.047e-01, -2.436e-02, -9.326e-02, 3.606e-02, -4.826e-02, -6.154e-02, -8.805e-02, 6.623e-02, 2.476e-02, -3.313e-02, 1.438e-02)); + r += mul(s5_0, M4(4.002e-02, -4.604e-02, 1.079e-02, -2.595e-02, -1.511e-02, 1.383e-02, -6.206e-03, 1.663e-01, 2.442e-03, 7.468e-02, -1.914e-02, -5.290e-02, 6.660e-03, -4.580e-02, 4.426e-02, 9.765e-02)); + r += mul(s5_1, M4(2.268e-02, 3.311e-03, -5.642e-02, 5.526e-02, -4.185e-02, 2.070e-01, -4.005e-02, 5.109e-03, 1.991e-01, -1.220e-01, -3.855e-03, -6.648e-02, 4.016e-02, 5.523e-02, 5.913e-02, 2.709e-02)); + r += mul(s5_2, M4(5.045e-02, -1.075e-01, 5.775e-02, 2.553e-02, 2.226e-01, -2.762e-02, 5.378e-02, 2.212e-01, -6.276e-02, -1.003e-01, -9.307e-02, 1.153e-01, 1.548e-01, -2.839e-02, 2.308e-02, -4.647e-02)); + r += mul(s5_3, M4(4.041e-02, -2.040e-02, 5.813e-02, 7.076e-02, 1.038e-01, 2.165e-02, 2.669e-02, 9.714e-02, 6.983e-02, 4.840e-02, 2.288e-02, 1.349e-01, -3.476e-03, -1.698e-01, -3.940e-02, 9.288e-02)); + r += mul(s5_4, M4(-1.457e-02, -8.850e-04, 1.924e-01, -8.157e-02, 2.653e-01, 5.694e-02, 2.479e-02, -9.264e-02, 4.335e-02, -2.322e-02, 1.174e-01, 1.562e-01, -1.132e-02, 3.073e-02, -7.017e-02, -7.108e-02)); + r += mul(s5_5, M4(4.294e-02, -9.940e-02, 6.106e-02, 7.317e-02, -2.000e-02, 3.526e-01, 5.818e-02, 9.275e-02, -4.098e-02, 5.951e-02, -5.892e-02, -8.403e-02, -3.986e-02, 1.269e-02, -6.863e-02, 9.262e-03)); + r += mul(s5_6, M4(-1.937e-02, 1.004e-01, 1.476e-01, -3.112e-02, 9.642e-02, 7.890e-02, 7.655e-02, -1.539e-02, 7.540e-02, -7.181e-02, 9.812e-02, -1.215e-01, -7.593e-02, 5.633e-02, -2.945e-02, 1.604e-02)); + r += mul(s5_7, M4(-1.254e-01, 1.085e-01, 1.342e-01, 7.889e-02, 1.345e-01, 4.788e-02, 8.275e-02, -1.645e-01, 1.020e-01, 4.708e-02, -4.581e-02, -5.674e-02, -2.400e-02, -2.977e-02, 1.032e-01, -3.530e-02)); + r += mul(s5_8, M4(6.052e-03, -1.642e-03, 8.608e-02, -1.069e-02, 3.222e-01, 1.826e-01, 1.620e-01, 1.563e-01, -7.066e-02, 3.619e-02, 6.661e-02, 2.880e-02, 2.164e-02, -3.399e-02, 4.539e-02, 6.845e-02)); + r += mul(s6_0, M4(-3.648e-02, -2.017e-01, 1.000e-01, 1.529e-01, 7.845e-02, -6.088e-02, 1.111e-01, -3.186e-02, 7.117e-02, 7.150e-02, 7.475e-02, 3.168e-02, 9.885e-02, -6.205e-02, 1.774e-02, 2.101e-02)); + r += mul(s6_1, M4(6.775e-02, 1.105e-01, -3.794e-02, -4.679e-02, -9.210e-04, 2.132e-02, 4.863e-02, 1.474e-01, -4.066e-02, 8.994e-03, 4.689e-03, 3.249e-02, 6.345e-02, 1.142e-01, 5.827e-03, 2.765e-02)); + r += mul(s6_2, M4(-2.740e-02, -3.172e-02, 2.257e-02, 1.599e-01, 1.841e-01, 8.856e-03, 9.857e-02, -8.046e-02, -5.979e-03, -7.011e-02, 8.870e-02, -6.540e-02, -3.557e-02, -5.823e-02, 3.080e-02, 2.604e-02)); + r += mul(s6_3, M4(2.035e-01, 1.193e-01, -2.087e-01, -2.412e-02, 6.845e-02, 8.483e-03, -4.780e-02, -1.101e-02, -1.232e-01, 3.333e-02, 1.352e-01, -8.236e-02, -9.331e-02, 7.760e-02, 8.397e-02, 8.919e-02)); + r += mul(s6_4, M4(1.049e-03, 9.564e-02, -1.644e-01, 2.448e-02, 6.858e-02, -1.599e-01, 1.023e-02, 1.491e-01, -2.848e-01, -1.326e-01, 1.483e-01, -1.295e-01, -2.292e-01, 8.333e-02, 5.031e-02, -3.056e-02)); + r += mul(s6_5, M4(-8.747e-02, 6.372e-02, 3.113e-02, -1.207e-01, -3.647e-02, 9.549e-02, 2.753e-03, -1.689e-01, 1.110e-01, -1.858e-01, 5.344e-02, 3.468e-02, -1.239e-01, 2.882e-02, -1.640e-01, -1.889e-02)); + r += mul(s6_6, M4(7.600e-02, 2.307e-02, -1.154e-01, -4.341e-02, -5.626e-02, 1.161e-01, 9.799e-02, -1.271e-02, -1.660e-01, -8.406e-02, -2.498e-02, 6.879e-02, -1.858e-01, 6.289e-02, -5.796e-03, 7.048e-02)); + r += mul(s6_7, M4(1.530e-02, -2.446e-03, -5.280e-02, -2.562e-02, -2.290e-01, -5.978e-02, 1.380e-02, 7.379e-02, -2.215e-01, 4.228e-02, -9.744e-03, 5.206e-03, 2.473e-03, -2.494e-01, -5.735e-02, -3.795e-02)); + r += mul(s6_8, M4(4.346e-02, -6.795e-02, -7.263e-02, 9.408e-03, 1.760e-03, -5.968e-02, 7.807e-02, -5.669e-03, -8.536e-02, -3.529e-02, -1.235e-01, 8.264e-02, -2.686e-02, 6.961e-02, -7.985e-02, -2.726e-02)); + r += mul(s7_0, M4(-1.965e-02, -1.024e-01, 2.780e-02, 4.523e-02, 5.808e-02, -2.898e-02, -7.969e-02, -7.242e-02, 1.474e-02, 7.838e-02, -4.207e-02, 9.601e-02, 3.767e-02, -2.420e-03, -8.921e-03, -5.666e-02)); + r += mul(s7_1, M4(6.580e-02, 8.650e-02, -4.842e-02, -1.011e-01, 7.914e-02, 8.096e-02, -1.058e-01, -2.214e-01, 1.170e-01, 1.292e-01, -1.103e-01, -9.182e-02, -4.913e-02, 4.079e-02, -1.382e-02, 1.543e-01)); + r += mul(s7_2, M4(4.480e-02, 2.242e-02, -3.295e-02, 1.505e-02, -2.991e-02, 1.106e-01, -1.135e-01, -6.180e-02, -1.640e-01, 9.148e-02, 1.115e-02, 2.166e-02, -6.263e-03, -1.288e-02, 3.800e-02, 1.038e-02)); + r += mul(s7_3, M4(-2.111e-03, 6.777e-02, 2.279e-02, 2.671e-03, 8.600e-02, -1.305e-01, -1.917e-01, 6.077e-03, -4.187e-02, -3.021e-02, 1.626e-01, 2.004e-02, 2.541e-02, -1.497e-02, 9.814e-03, -9.956e-02)); + r += mul(s7_4, M4(2.606e-03, -1.421e-01, -2.209e-02, 3.440e-03, -1.119e-01, -8.762e-02, -2.179e-01, -5.119e-02, -5.721e-02, 5.455e-02, -2.261e-02, -1.807e-01, -1.014e-01, -8.314e-02, 7.701e-02, -2.304e-02)); + r += mul(s7_5, M4(-1.804e-01, 3.145e-02, 7.818e-02, 2.986e-02, -7.967e-02, 2.417e-01, -1.876e-01, 9.897e-02, -6.768e-02, -8.387e-02, 6.883e-02, -1.885e-02, 1.335e-01, 1.319e-02, -4.611e-03, -1.010e-01)); + r += mul(s7_6, M4(-7.514e-03, 1.403e-01, -9.496e-02, -3.883e-02, -1.375e-01, 2.459e-02, -6.966e-02, -1.159e-01, 3.025e-02, -3.703e-02, -3.195e-02, -3.322e-02, 1.218e-01, 3.971e-02, 4.001e-02, -2.509e-02)); + r += mul(s7_7, M4(8.323e-03, -8.484e-02, -1.194e-01, 6.347e-02, -1.486e-01, 2.084e-02, -1.090e-01, -6.186e-04, 1.719e-02, 8.260e-02, 7.180e-02, -3.495e-02, -1.865e-01, -1.264e-01, -2.023e-01, 1.941e-01)); + r += mul(s7_8, M4(-2.118e-02, -1.962e-02, -1.044e-02, -7.627e-02, -1.039e-01, -1.081e-01, -5.646e-03, -4.796e-02, -1.246e-01, -4.691e-02, -2.350e-02, -2.893e-02, -3.219e-02, 8.975e-02, -8.877e-02, 8.794e-02)); + r += V4(8.022e-02, 3.824e-02, -1.685e-02, 7.276e-03); + return r; +} + +V4 f1(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-6.531e-02, 8.363e-02, -2.453e-02, -1.133e-01, -3.351e-02, 8.886e-02, -1.069e-02, -2.856e-02, 5.394e-02, 1.066e-02, 3.697e-02, -6.636e-02, 4.380e-02, -1.576e-01, 6.195e-02, 3.535e-02)); + r += mul(s0_1, M4(-2.962e-02, -4.826e-02, 9.580e-02, 1.516e-02, 3.193e-02, 2.322e-01, -1.121e-01, -9.229e-02, 8.198e-02, -4.713e-02, 4.354e-02, -3.634e-02, 5.267e-02, 1.190e-02, 1.165e-01, 4.146e-02)); + r += mul(s0_2, M4(-6.669e-03, -1.348e-02, -3.063e-02, -3.563e-03, -1.313e-02, -1.708e-02, 1.210e-01, -1.440e-01, 4.929e-02, 3.481e-02, 2.003e-02, 3.635e-02, 1.006e-01, -1.957e-02, 1.193e-02, 5.155e-02)); + r += mul(s0_3, M4(6.497e-02, 5.019e-02, 1.077e-01, 8.697e-03, -1.177e-01, 5.571e-02, 4.494e-02, 6.833e-02, -2.233e-02, 3.133e-02, 2.125e-02, -6.909e-02, -6.918e-02, -9.107e-03, -5.253e-02, 4.534e-02)); + r += mul(s0_4, M4(8.947e-02, -6.261e-02, -5.880e-03, 4.299e-02, -1.991e-01, 2.456e-02, -1.289e-01, -1.432e-01, -9.228e-02, 7.622e-02, -1.118e-01, 7.130e-03, -8.899e-03, 9.077e-02, -1.068e-02, -3.357e-01)); + r += mul(s0_5, M4(1.132e-02, -8.700e-03, 2.290e-02, -1.156e-02, -6.521e-02, 6.597e-02, 1.345e-01, -2.025e-02, -1.252e-02, 1.239e-01, -4.732e-02, -4.772e-03, 5.255e-02, 4.451e-02, 1.591e-02, -4.018e-02)); + r += mul(s0_6, M4(-9.199e-02, 5.236e-02, 3.563e-03, -6.109e-02, -7.301e-02, 8.333e-02, 3.957e-02, 1.803e-01, 9.601e-02, -5.646e-02, 4.394e-02, -1.050e-01, -2.629e-02, -8.527e-02, 2.850e-02, 1.179e-02)); + r += mul(s0_7, M4(-7.447e-02, 7.901e-03, 6.238e-02, -5.329e-02, 2.586e-02, 2.208e-01, 2.816e-02, -4.848e-02, 7.694e-02, 4.204e-02, 5.779e-03, -6.463e-02, -1.001e-01, 1.100e-01, 1.566e-02, 3.791e-02)); + r += mul(s0_8, M4(-5.701e-02, -1.697e-02, -1.691e-03, 1.403e-01, 3.156e-01, 5.799e-02, 1.759e-02, 9.619e-02, 2.202e-02, -9.488e-02, -2.590e-02, -8.366e-02, 1.210e-01, -7.470e-02, 1.093e-02, 1.380e-01)); + r += mul(s1_0, M4(7.212e-02, 7.621e-02, 4.314e-02, -9.247e-02, -3.266e-02, 8.508e-02, -6.421e-02, -4.211e-02, 1.010e-02, -1.950e-01, 3.861e-02, 9.782e-02, -6.655e-02, 1.424e-02, -2.223e-02, -9.446e-03)); + r += mul(s1_1, M4(-4.007e-02, -7.846e-02, -7.986e-03, -7.439e-02, 4.449e-02, -4.818e-02, 1.385e-02, 3.797e-03, -1.347e-02, -1.561e-01, 9.846e-02, 3.801e-02, 1.061e-01, -2.401e-01, 1.055e-01, -4.129e-02)); + r += mul(s1_2, M4(-9.659e-03, 6.957e-02, -4.025e-02, 3.089e-02, 2.816e-02, 2.426e-02, 6.533e-02, -7.188e-02, -1.259e-01, -4.684e-02, -4.673e-02, 1.800e-01, 7.202e-02, 6.580e-02, -8.023e-02, 5.023e-02)); + r += mul(s1_3, M4(1.242e-01, 1.553e-01, 1.128e-01, 4.895e-02, 1.656e-02, -3.309e-02, -5.443e-03, -6.188e-02, 5.006e-04, -1.107e-02, 1.815e-02, 2.253e-01, -1.705e-01, 3.067e-02, 9.370e-02, 3.231e-02)); + r += mul(s1_4, M4(3.221e-02, -5.710e-02, -1.182e-01, -1.338e-01, -1.968e-02, 7.005e-02, -9.953e-02, 1.901e-02, -2.082e-02, 6.905e-03, -1.449e-01, 1.060e-01, 7.296e-02, -1.160e-01, -3.750e-03, -9.807e-02)); + r += mul(s1_5, M4(-6.937e-03, -1.401e-01, 4.706e-02, -6.033e-02, -1.286e-01, -1.091e-03, 7.979e-02, -2.000e-01, 8.344e-02, 2.063e-01, -1.064e-01, 1.659e-01, -1.475e-02, 2.853e-02, -5.520e-02, -1.019e-02)); + r += mul(s1_6, M4(-6.763e-02, 1.883e-01, -9.662e-02, 3.104e-02, 1.231e-02, -3.119e-02, -1.991e-02, 3.078e-02, -5.155e-02, 2.583e-02, 1.259e-01, 6.456e-02, -3.722e-02, -3.557e-02, 6.927e-02, -1.265e-02)); + r += mul(s1_7, M4(-1.071e-01, 1.035e-01, -1.620e-02, -1.328e-01, -1.581e-02, 1.080e-02, 7.568e-03, 5.949e-03, -1.235e-01, 7.834e-02, 3.517e-02, 1.922e-02, -1.788e-01, -9.244e-02, 1.602e-01, 2.443e-01)); + r += mul(s1_8, M4(-3.491e-01, -3.154e-02, -2.781e-02, 1.418e-01, 8.823e-02, -3.127e-03, 1.060e-02, -3.518e-02, -9.877e-02, -1.844e-02, -1.164e-01, -5.210e-02, -5.500e-03, 6.936e-02, -4.136e-03, -5.199e-02)); + r += mul(s2_0, M4(6.302e-05, 8.151e-02, 2.809e-03, -9.597e-02, 1.061e-01, -4.590e-03, -2.120e-02, 2.740e-03, -9.974e-03, 1.571e-02, -9.565e-02, 4.850e-03, -1.734e-01, 3.947e-02, -1.271e-01, 8.010e-02)); + r += mul(s2_1, M4(1.761e-02, 5.682e-02, -6.697e-02, 1.736e-02, 1.359e-01, 1.748e-01, -2.451e-02, -1.687e-01, -1.217e-02, 1.712e-01, 8.703e-02, -7.423e-02, -1.478e-01, 8.708e-02, 2.012e-02, 1.992e-01)); + r += mul(s2_2, M4(3.907e-02, 3.121e-02, 4.380e-02, -1.444e-01, -6.491e-02, 2.175e-02, -2.573e-02, 1.739e-01, -1.612e-01, 1.411e-01, -6.071e-02, -1.919e-01, -9.105e-03, 1.180e-02, 8.358e-02, 1.398e-01)); + r += mul(s2_3, M4(-1.036e-01, 5.616e-02, -1.672e-03, -1.342e-01, -3.416e-03, -2.802e-02, 1.312e-01, -5.189e-02, -7.886e-02, 1.854e-01, 2.333e-01, 3.057e-02, -6.496e-02, 6.900e-03, -9.251e-02, 1.079e-01)); + r += mul(s2_4, M4(7.962e-02, 4.148e-02, 1.700e-01, 1.411e-01, 2.020e-01, 4.063e-01, -9.855e-02, 2.657e-01, -2.426e-01, -8.691e-02, -9.874e-03, 2.689e-01, -3.121e-02, 1.277e-01, -7.531e-02, 2.294e-02)); + r += mul(s2_5, M4(-1.290e-02, -1.242e-01, 9.744e-02, -3.125e-02, 4.110e-02, 3.022e-02, 5.287e-02, 1.693e-01, -2.782e-01, 1.429e-02, 6.180e-02, 1.119e-01, 1.331e-01, 1.371e-01, -3.178e-02, 1.428e-01)); + r += mul(s2_6, M4(-4.450e-03, -2.106e-02, 5.610e-02, -3.013e-02, 2.708e-02, 6.517e-02, -1.312e-01, -6.858e-02, 1.219e-01, -4.922e-02, -1.524e-02, 4.892e-02, -6.322e-03, -3.311e-02, -8.963e-02, 2.326e-01)); + r += mul(s2_7, M4(-2.796e-01, 1.151e-01, -3.706e-02, -4.687e-02, 1.712e-02, -1.499e-01, -2.080e-01, 2.191e-01, -1.121e-01, -5.119e-02, 8.154e-03, -1.510e-01, 7.341e-02, 7.382e-02, -2.254e-01, 1.950e-01)); + r += mul(s2_8, M4(8.772e-02, 4.794e-04, 8.423e-02, -9.496e-02, 9.113e-02, 2.194e-02, -7.011e-02, 7.785e-02, -7.759e-02, 5.424e-03, 3.423e-02, -6.881e-02, 1.640e-01, 6.449e-02, -1.571e-01, 8.336e-02)); + r += mul(s3_0, M4(-3.536e-02, -1.423e-02, -1.029e-02, 6.093e-02, 1.408e-01, 1.073e-01, -1.959e-02, -1.156e-01, 9.141e-02, 5.451e-02, -9.794e-03, 9.786e-03, -3.202e-02, -2.081e-02, -5.315e-02, -7.173e-02)); + r += mul(s3_1, M4(9.979e-02, 3.956e-02, 6.290e-02, 2.500e-02, 8.001e-02, -2.648e-02, 1.628e-01, -6.749e-02, 2.743e-02, 2.207e-01, -1.027e-01, 2.202e-03, -4.041e-02, 1.042e-02, 1.899e-02, -1.587e-01)); + r += mul(s3_2, M4(-2.281e-02, 1.592e-01, 5.933e-02, 3.911e-02, -8.032e-02, 5.788e-02, -2.891e-02, -3.402e-02, 3.244e-02, 1.186e-01, 1.060e-02, 5.644e-02, -2.286e-02, 6.649e-03, 1.901e-02, -1.472e-01)); + r += mul(s3_3, M4(-2.360e-02, 2.092e-02, -4.649e-02, -3.947e-02, -1.107e-01, -8.375e-02, 1.062e-01, -7.387e-02, -8.245e-02, 4.132e-02, -9.372e-02, -4.904e-02, 1.590e-02, 3.342e-02, -5.126e-02, -6.318e-02)); + r += mul(s3_4, M4(8.237e-02, 7.139e-03, 6.742e-02, -1.915e-01, -2.912e-02, 1.144e-01, -2.675e-02, -3.869e-02, 2.174e-02, 8.929e-02, -7.668e-02, 3.221e-02, 1.072e-01, -2.226e-02, 5.747e-03, -2.013e-01)); + r += mul(s3_5, M4(1.296e-01, 5.830e-02, 2.741e-02, -5.396e-02, 4.137e-02, 1.081e-01, 5.407e-02, -1.613e-02, 4.416e-02, -4.413e-02, -1.919e-02, 2.234e-02, 1.641e-02, 3.827e-02, -5.873e-02, -3.625e-02)); + r += mul(s3_6, M4(-2.643e-02, -2.107e-02, -9.774e-04, -4.033e-02, 6.831e-02, 1.818e-02, -2.285e-02, -5.126e-02, 1.056e-01, 2.481e-02, -4.970e-02, -4.118e-02, 2.507e-03, -7.200e-02, 3.521e-02, -1.958e-02)); + r += mul(s3_7, M4(-1.419e-01, -1.939e-02, -8.252e-02, -1.226e-01, -2.463e-02, -3.110e-02, 7.933e-02, 2.225e-02, -1.125e-01, 3.870e-02, -8.449e-02, 4.435e-02, 5.833e-02, 1.431e-02, 1.874e-02, -4.861e-02)); + r += mul(s3_8, M4(6.873e-02, -1.913e-02, 5.468e-02, 3.804e-02, 8.904e-03, -1.028e-02, -5.703e-02, -3.723e-02, -1.214e-01, 3.273e-04, 5.522e-02, -5.589e-02, 6.761e-02, -2.091e-03, -1.855e-02, -1.967e-03)); + r += mul(s4_0, M4(-1.337e-02, 4.971e-02, -9.402e-02, -6.570e-02, -5.679e-02, -4.823e-02, -1.141e-02, 1.180e-01, 1.361e-02, -6.839e-02, 9.484e-03, 9.146e-02, -2.355e-02, -4.336e-02, -6.835e-02, 1.216e-01)); + r += mul(s4_1, M4(-2.744e-02, 6.125e-02, -1.307e-02, 1.858e-02, -6.888e-02, -3.563e-02, -8.818e-02, 7.357e-02, 5.087e-02, -6.322e-03, -8.044e-02, 2.251e-02, 4.736e-02, -1.195e-02, 9.993e-02, 5.329e-02)); + r += mul(s4_2, M4(-6.653e-02, -3.248e-02, -6.335e-02, -3.976e-03, 4.284e-03, -1.610e-02, 8.281e-02, 4.614e-02, 5.601e-03, 1.024e-02, 1.040e-04, 7.251e-02, -1.801e-02, -1.080e-02, 8.329e-02, 1.218e-01)); + r += mul(s4_3, M4(9.951e-02, -4.194e-02, -1.135e-01, -9.185e-02, 1.388e-02, -5.043e-02, -1.166e-01, 5.228e-03, -9.241e-02, 3.263e-02, -5.675e-02, -1.811e-02, 5.921e-03, 4.205e-02, -1.074e-01, -8.103e-02)); + r += mul(s4_4, M4(1.362e-02, 1.894e-01, -6.613e-02, 3.271e-02, -5.054e-02, 7.819e-02, 8.748e-03, 1.025e-01, 1.009e-01, 1.459e-03, -7.589e-02, 4.555e-02, 1.301e-01, 1.124e-01, -1.082e-01, 7.705e-02)); + r += mul(s4_5, M4(3.963e-03, -2.820e-01, -9.095e-02, 2.806e-02, 2.366e-02, 2.021e-02, 7.765e-02, 8.085e-02, 4.199e-04, 7.992e-02, -5.011e-02, 3.407e-02, -1.385e-01, 1.887e-01, -7.216e-02, 7.838e-02)); + r += mul(s4_6, M4(-6.037e-02, -3.763e-03, 1.471e-02, 1.150e-01, -7.843e-02, -5.048e-02, -1.682e-02, 2.911e-02, -5.132e-02, -2.132e-03, 8.913e-03, -2.785e-02, -1.884e-01, 1.110e-01, -9.448e-02, 1.446e-01)); + r += mul(s4_7, M4(2.501e-01, -4.783e-02, 1.722e-02, -7.884e-02, -2.728e-02, 1.207e-01, 2.019e-02, -4.461e-02, -7.270e-02, -5.856e-02, -5.372e-02, 1.377e-01, 5.869e-02, 1.418e-02, 3.952e-02, 2.244e-01)); + r += mul(s4_8, M4(-7.346e-04, -1.191e-01, -5.872e-04, -4.034e-01, 5.788e-02, 8.150e-03, 5.508e-02, 1.020e-01, 1.064e-02, -4.955e-02, 1.782e-02, 7.286e-02, -1.265e-02, 1.003e-01, -2.336e-02, 1.336e-01)); + r += mul(s5_0, M4(-5.339e-02, 7.846e-02, -8.860e-02, -1.306e-02, -4.494e-02, 9.703e-02, -2.568e-02, -1.864e-02, 5.356e-02, 1.834e-01, -7.658e-02, -1.251e-01, 2.626e-02, -7.564e-03, -1.302e-01, -7.820e-02)); + r += mul(s5_1, M4(-4.511e-03, -2.958e-02, -7.545e-02, 5.787e-03, -7.416e-02, -4.669e-02, -2.174e-01, -9.766e-02, 4.142e-02, -1.570e-01, -8.905e-02, -4.624e-02, 6.675e-02, -9.388e-03, 4.803e-03, -1.196e-01)); + r += mul(s5_2, M4(-2.193e-02, 2.750e-02, -1.122e-01, 3.679e-02, 5.083e-02, -2.510e-01, 9.296e-02, -3.115e-01, -2.605e-02, -1.356e-01, 6.583e-02, 3.942e-02, -1.008e-02, -6.099e-02, -6.722e-03, -1.421e-01)); + r += mul(s5_3, M4(6.270e-02, -5.455e-02, -3.061e-02, 2.553e-02, -6.918e-02, -6.845e-02, 2.002e-03, -1.087e-01, -9.001e-03, -1.043e-01, -2.609e-02, -4.171e-02, 1.259e-02, 1.074e-02, 1.576e-02, -1.376e-01)); + r += mul(s5_4, M4(4.290e-02, 6.627e-02, 6.619e-02, -7.427e-02, -1.362e-01, 9.203e-02, -9.883e-02, 4.936e-03, 3.701e-01, -1.101e-02, -1.109e-01, -2.545e-02, 1.058e-02, 1.841e-01, -2.051e-02, -1.984e-01)); + r += mul(s5_5, M4(-1.378e-02, -1.164e-01, -1.474e-01, -2.092e-02, 6.278e-02, -1.969e-02, -5.004e-02, -1.315e-01, 6.378e-02, -3.266e-02, 6.565e-02, -4.789e-03, -3.663e-02, 2.888e-03, 1.072e-01, -1.854e-02)); + r += mul(s5_6, M4(-1.867e-01, 3.630e-02, 1.074e-01, -1.969e-02, -4.586e-02, 8.270e-04, -1.691e-02, 7.145e-02, 3.306e-02, 1.202e-01, 9.361e-02, -1.188e-01, -1.424e-01, -9.281e-03, -1.762e-02, -1.624e-01)); + r += mul(s5_7, M4(-2.975e-02, 1.625e-01, 1.835e-01, 1.283e-01, 7.336e-02, 2.088e-02, -8.031e-03, -1.193e-01, -2.883e-02, 1.103e-01, -7.452e-02, 4.335e-02, -4.197e-02, -3.907e-02, 5.596e-02, -3.380e-02)); + r += mul(s5_8, M4(-1.787e-01, -7.071e-02, 3.320e-02, 6.293e-02, 1.479e-01, -5.684e-02, -4.662e-02, -3.199e-02, 1.532e-01, -4.096e-02, -7.867e-02, 1.348e-01, -2.767e-02, 2.444e-02, 3.138e-02, 1.569e-01)); + r += mul(s6_0, M4(-4.936e-02, -6.285e-02, 1.092e-01, 6.430e-03, -7.977e-02, -3.174e-02, -5.940e-02, -1.876e-02, -1.700e-01, -4.452e-02, -2.191e-03, 4.175e-02, 9.124e-02, -7.633e-02, -9.207e-02, 1.279e-02)); + r += mul(s6_1, M4(7.761e-02, -3.035e-01, 9.776e-02, 2.043e-02, 1.105e-01, 8.576e-02, -3.475e-02, 1.911e-02, 6.507e-02, 1.586e-01, -2.161e-02, -1.698e-01, -2.493e-02, -8.030e-02, -7.785e-02, -1.270e-02)); + r += mul(s6_2, M4(-2.316e-01, -8.060e-02, 3.453e-02, -9.948e-02, -1.113e-02, 6.366e-02, -1.612e-02, -9.916e-02, 8.003e-02, 5.027e-02, -6.328e-02, -3.902e-02, 1.103e-01, -8.845e-02, 5.553e-02, -5.790e-02)); + r += mul(s6_3, M4(-8.073e-02, 1.479e-02, 1.683e-01, -8.615e-02, -6.766e-02, 3.079e-02, -8.450e-02, -3.041e-03, 8.573e-03, 1.075e-01, 1.413e-01, 4.908e-04, 1.775e-01, -1.729e-01, -6.040e-02, -1.862e-01)); + r += mul(s6_4, M4(1.651e-01, -1.345e-01, 8.919e-02, 1.627e-01, 3.617e-02, 6.256e-02, -5.313e-02, 1.040e-01, -1.922e-01, 1.232e-01, 2.177e-01, -8.445e-02, 1.100e-01, 3.956e-02, -1.707e-01, -7.690e-02)); + r += mul(s6_5, M4(2.440e-01, -7.621e-02, -1.231e-01, 3.360e-02, -2.065e-01, 7.486e-02, -1.006e-01, 2.970e-02, 2.299e-02, -1.838e-02, -3.900e-02, -7.157e-02, 2.590e-01, 3.458e-02, 7.639e-02, -5.959e-02)); + r += mul(s6_6, M4(-1.726e-01, 1.210e-01, -5.207e-02, 9.992e-04, -8.525e-02, 1.903e-02, 7.126e-02, -1.506e-01, 4.732e-02, -1.352e-01, 4.222e-02, 3.378e-02, 1.458e-02, 2.951e-02, -2.284e-01, 1.385e-01)); + r += mul(s6_7, M4(2.148e-02, -1.776e-01, 5.554e-02, 1.467e-02, -1.089e-01, -4.249e-02, 1.303e-01, -2.949e-02, -1.481e-01, -1.179e-01, 5.531e-03, -1.111e-01, 1.654e-01, 3.117e-02, -2.830e-01, 7.572e-02)); + r += mul(s6_8, M4(-1.686e-01, 2.905e-02, 3.980e-02, 1.041e-01, -9.216e-02, -3.281e-02, -4.067e-02, -2.761e-02, -8.116e-02, -4.699e-02, -2.380e-02, 4.070e-02, 8.295e-02, 6.351e-02, -1.073e-01, -3.275e-02)); + r += mul(s7_0, M4(-1.322e-02, -6.995e-02, 5.721e-02, 1.080e-01, -1.460e-01, -1.359e-01, -2.668e-02, 4.627e-02, -1.111e-01, -6.099e-02, 2.290e-02, 1.181e-01, -2.615e-02, 3.432e-02, -2.858e-02, 2.675e-02)); + r += mul(s7_1, M4(-1.126e-03, -1.130e-01, 3.254e-02, 3.818e-02, 1.163e-01, -8.689e-02, 2.397e-02, 6.867e-02, 7.187e-02, 2.244e-01, -1.445e-01, -3.121e-02, -2.282e-02, 4.401e-02, -2.783e-02, -1.091e-01)); + r += mul(s7_2, M4(-1.843e-02, -5.802e-03, 1.001e-01, 4.639e-02, -2.342e-03, -1.522e-01, 1.646e-01, -3.452e-02, 9.018e-02, 2.567e-02, 7.340e-02, -4.319e-02, 3.794e-02, 5.017e-03, -5.138e-02, 5.661e-02)); + r += mul(s7_3, M4(-3.781e-02, -7.300e-02, 5.104e-02, 1.752e-01, -1.776e-01, 5.212e-02, -1.431e-02, 3.923e-02, 1.007e-01, -4.295e-02, -3.411e-02, 1.345e-01, -4.227e-02, 4.720e-02, -3.708e-02, -9.001e-02)); + r += mul(s7_4, M4(7.349e-02, -6.402e-02, -7.391e-02, 4.688e-02, -1.185e-01, 1.355e-01, -4.110e-02, -4.597e-02, -1.750e-01, -1.666e-02, -2.820e-01, -9.678e-02, 1.918e-02, 4.531e-02, -4.430e-02, 9.198e-02)); + r += mul(s7_5, M4(8.797e-02, 7.461e-02, -3.057e-02, 8.326e-02, -8.005e-02, -9.788e-02, -6.236e-02, 1.772e-01, 2.214e-01, 5.500e-02, 8.411e-03, -1.437e-02, -8.313e-02, 1.458e-01, -8.669e-02, -1.330e-01)); + r += mul(s7_6, M4(-7.259e-02, -1.133e-02, 1.599e-02, 3.559e-02, -1.174e-01, -2.649e-02, 7.589e-02, 5.969e-02, -3.749e-02, 6.788e-03, 8.883e-02, 1.105e-01, 4.012e-02, 5.030e-02, -1.823e-01, -1.431e-01)); + r += mul(s7_7, M4(-1.153e-02, -7.054e-02, 1.015e-02, -2.166e-02, -1.574e-01, -2.663e-02, 8.243e-02, -9.755e-02, -1.577e-02, -1.518e-01, -1.140e-02, -1.944e-01, 3.587e-02, 3.820e-02, -1.761e-01, 2.044e-01)); + r += mul(s7_8, M4(-1.494e-02, 5.534e-03, 1.283e-02, 6.255e-02, 9.911e-02, 4.208e-02, -6.697e-02, 5.858e-02, 2.691e-02, 1.197e-01, -4.191e-02, 1.493e-01, -1.131e-01, 3.449e-02, -1.062e-01, -5.003e-02)); + r += V4(4.014e-02, -9.109e-03, -2.919e-02, -6.429e-03); + return r; +} + +V4 f2(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-6.856e-02, 5.958e-02, -5.491e-02, -5.121e-04, -7.082e-03, 7.145e-02, 3.433e-02, -1.884e-02, 8.259e-02, -1.835e-02, -2.053e-02, -8.796e-03, -1.567e-02, -3.514e-02, -3.883e-02, 8.266e-03)); + r += mul(s0_1, M4(5.622e-02, -1.245e-01, -1.000e-02, -5.029e-02, 1.284e-01, 1.304e-01, -1.182e-01, -8.880e-02, 1.180e-01, -1.074e-01, -1.839e-03, -6.479e-02, -1.055e-01, -9.332e-02, 4.050e-02, 3.166e-02)); + r += mul(s0_2, M4(8.057e-02, -2.366e-02, 8.458e-03, -4.003e-02, 1.657e-01, -2.993e-02, -9.130e-02, -2.685e-02, 4.415e-02, -2.073e-02, 4.602e-02, 4.820e-02, -1.642e-02, -3.753e-02, -1.158e-02, -1.363e-02)); + r += mul(s0_3, M4(-3.562e-03, 3.501e-02, -5.760e-02, -8.561e-02, 1.803e-01, 9.548e-03, -4.489e-02, -1.129e-01, 1.759e-01, 2.651e-02, -9.603e-02, 4.567e-02, -2.577e-02, -7.679e-02, 1.399e-02, 2.476e-01)); + r += mul(s0_4, M4(1.174e-01, -1.482e-01, 8.969e-03, -5.009e-02, 1.937e-01, 1.298e-01, -4.125e-02, -4.130e-01, 2.279e-02, -3.595e-02, 1.802e-01, 3.422e-02, -9.759e-02, -1.371e-02, -3.081e-02, 6.392e-02)); + r += mul(s0_5, M4(5.218e-02, 4.926e-02, -3.858e-02, 4.533e-02, 1.352e-01, -2.891e-03, 1.177e-02, -2.800e-02, 4.966e-02, 5.795e-02, -3.262e-02, -4.464e-02, -9.950e-03, -5.546e-02, -7.840e-02, 2.773e-02)); + r += mul(s0_6, M4(2.823e-02, 8.325e-02, 9.167e-02, -6.963e-02, 8.086e-02, -2.964e-02, 7.290e-02, -1.416e-01, -1.841e-02, -6.262e-02, -2.303e-02, -1.569e-02, -6.437e-02, 6.167e-02, -1.038e-01, -1.276e-02)); + r += mul(s0_7, M4(-4.809e-02, 1.415e-02, 6.225e-02, 8.075e-02, 2.388e-01, 9.211e-03, 9.064e-02, -8.200e-02, 1.694e-01, -5.018e-02, -1.079e-01, -6.351e-02, -9.142e-02, -1.697e-02, -3.814e-02, -5.625e-02)); + r += mul(s0_8, M4(9.382e-02, 3.186e-02, 1.185e-02, 5.386e-02, 8.376e-02, -1.031e-01, -6.309e-02, -6.205e-02, 6.931e-02, -6.939e-02, 2.833e-02, -8.955e-03, 2.056e-02, 2.309e-02, 8.990e-02, -2.922e-02)); + r += mul(s1_0, M4(9.485e-02, 1.059e-01, -9.448e-02, 2.837e-02, -8.034e-02, 4.231e-02, 5.874e-02, 4.376e-02, -7.212e-02, -4.734e-02, -6.407e-02, -5.659e-02, -2.286e-02, 2.383e-02, -5.526e-02, 7.060e-02)); + r += mul(s1_1, M4(2.772e-02, -2.769e-02, 1.203e-01, 2.210e-02, -9.925e-02, 3.654e-02, -6.549e-02, 5.695e-02, -3.272e-02, 7.289e-02, -6.519e-02, -4.937e-02, -1.087e-02, -9.866e-02, -5.929e-02, -5.427e-03)); + r += mul(s1_2, M4(1.325e-01, 1.090e-01, -9.989e-02, -1.232e-03, -1.037e-01, -7.060e-02, -4.878e-02, -1.971e-02, -1.156e-01, 1.161e-01, 7.762e-02, -4.978e-02, 2.168e-01, 4.355e-02, -5.945e-02, -1.258e-01)); + r += mul(s1_3, M4(-4.632e-02, 5.148e-03, -1.895e-01, -1.120e-02, -1.101e-02, 4.767e-02, 6.131e-02, -3.472e-02, -1.414e-01, 3.136e-02, -3.091e-02, -1.837e-02, 2.242e-01, -2.307e-02, -9.898e-02, 3.374e-02)); + r += mul(s1_4, M4(5.654e-02, -2.654e-01, 2.302e-02, -1.334e-01, -3.182e-03, 9.778e-03, -4.265e-02, -9.722e-02, -2.784e-01, 3.271e-03, -2.737e-02, -4.457e-02, 2.242e-02, -1.072e-02, -2.345e-01, -5.289e-02)); + r += mul(s1_5, M4(1.214e-02, -1.508e-02, 1.561e-01, -3.749e-02, -1.257e-01, 1.359e-02, -5.384e-02, -7.271e-03, -1.746e-01, 1.859e-01, -8.594e-02, 3.682e-02, 1.924e-01, 6.397e-02, -1.499e-01, 5.283e-02)); + r += mul(s1_6, M4(6.474e-02, 4.045e-02, 7.998e-02, -1.044e-01, -1.953e-02, 2.763e-02, 3.969e-02, -1.972e-02, -1.679e-01, 3.241e-03, 8.822e-03, -2.743e-02, 3.568e-02, 3.401e-02, -2.322e-02, 6.862e-02)); + r += mul(s1_7, M4(9.398e-02, 5.614e-02, -8.502e-02, 2.310e-02, -5.239e-02, -5.140e-03, 1.602e-01, 8.341e-02, -2.886e-01, 1.867e-01, -9.800e-02, -1.470e-02, -1.087e-01, -1.298e-01, -2.362e-02, -1.400e-01)); + r += mul(s1_8, M4(-3.051e-02, -6.396e-02, 4.116e-02, 1.117e-01, -4.641e-02, 2.690e-02, -3.111e-02, -1.250e-02, -2.173e-01, 1.572e-02, -1.499e-01, 1.580e-02, 1.703e-01, 1.144e-01, 1.479e-02, -8.993e-02)); + r += mul(s2_0, M4(1.244e-01, 4.970e-02, -1.070e-03, 7.773e-02, -8.029e-02, -2.884e-02, -3.637e-02, -1.304e-01, -1.312e-01, 2.130e-01, -4.910e-02, -4.770e-03, 1.294e-01, 2.274e-02, 9.818e-02, 7.503e-02)); + r += mul(s2_1, M4(-5.884e-02, 8.183e-02, -8.185e-02, 1.065e-02, -1.435e-01, 6.958e-02, 3.902e-02, -2.534e-02, -1.494e-01, 5.753e-02, -2.062e-01, -7.096e-02, -2.066e-02, 1.252e-01, 4.390e-02, 7.641e-02)); + r += mul(s2_2, M4(8.514e-03, 6.807e-03, -6.165e-02, -3.644e-03, 2.428e-03, -4.480e-02, 5.208e-02, 6.871e-02, -1.813e-02, -4.059e-02, -6.820e-02, -3.910e-02, 1.024e-01, 3.187e-02, 5.265e-02, -2.288e-02)); + r += mul(s2_3, M4(3.685e-02, 9.477e-02, -3.593e-02, 4.419e-02, -1.481e-01, 1.218e-01, -7.954e-03, -1.694e-01, -1.576e-02, 1.485e-02, -1.178e-01, -2.675e-02, 7.700e-03, 1.516e-01, -1.317e-02, 3.000e-02)); + r += mul(s2_4, M4(-1.040e-01, 1.802e-01, 4.063e-02, 1.970e-01, 4.039e-02, 1.686e-01, 9.372e-02, 3.956e-02, -8.978e-02, -1.824e-01, -4.485e-01, 1.647e-01, -4.233e-02, 2.078e-01, 2.783e-02, -1.687e-02)); + r += mul(s2_5, M4(-5.382e-02, 7.601e-03, 1.531e-01, -1.537e-01, 5.936e-02, 4.119e-02, 1.738e-02, -9.958e-02, -1.441e-02, -1.581e-01, 1.304e-01, 1.832e-01, 2.048e-01, 3.706e-02, -6.517e-02, -2.421e-02)); + r += mul(s2_6, M4(-1.290e-01, 5.078e-02, 3.001e-02, -1.579e-02, -3.427e-02, -3.255e-02, 1.423e-01, 2.828e-02, -6.385e-02, 6.381e-02, -1.872e-01, 1.009e-01, -2.196e-02, 5.991e-02, 1.937e-02, -7.034e-02)); + r += mul(s2_7, M4(8.300e-02, 1.168e-01, -2.442e-01, 7.992e-02, -5.251e-02, 9.426e-02, -1.091e-01, 3.191e-02, 2.351e-02, 8.493e-02, -1.876e-01, 9.190e-02, 1.258e-01, 8.952e-02, 6.551e-02, -1.797e-03)); + r += mul(s2_8, M4(-4.132e-02, 9.893e-02, -1.577e-01, 5.819e-02, -1.900e-02, -1.933e-03, 2.067e-02, -6.572e-03, 1.310e-01, -1.984e-01, -1.135e-01, -2.853e-02, 1.574e-01, 3.272e-02, 1.053e-01, 2.372e-02)); + r += mul(s3_0, M4(-1.278e-02, 1.956e-02, 1.472e-02, -1.047e-01, 2.871e-02, -7.708e-03, -2.284e-02, -5.125e-02, 6.561e-02, 5.233e-02, 6.514e-02, 4.392e-02, -6.372e-02, -5.538e-02, 2.252e-02, 9.895e-02)); + r += mul(s3_1, M4(8.760e-02, 4.733e-02, -2.399e-03, 1.374e-01, -3.357e-02, -1.288e-02, -1.132e-01, -1.851e-02, -1.350e-01, 3.614e-02, 2.063e-02, 1.047e-02, -2.650e-02, 3.096e-02, -2.657e-02, 7.451e-02)); + r += mul(s3_2, M4(-9.244e-02, 1.058e-01, -3.306e-02, -2.094e-02, 6.164e-02, -1.685e-04, 2.070e-02, 4.812e-02, 1.481e-02, 7.771e-02, -1.181e-01, 3.211e-02, -2.177e-02, -1.001e-01, 2.578e-02, -4.489e-02)); + r += mul(s3_3, M4(-9.743e-02, 1.029e-01, 5.503e-02, 1.500e-01, 1.386e-01, 2.629e-02, -1.115e-02, -7.039e-02, 7.579e-02, -2.209e-02, -2.975e-02, -3.635e-02, -1.220e-01, -3.563e-02, 2.109e-02, -5.721e-03)); + r += mul(s3_4, M4(6.016e-02, 1.031e-01, -3.935e-02, 1.274e-01, -7.301e-02, 1.266e-01, 4.915e-02, 2.390e-02, 9.129e-03, -8.408e-02, -8.331e-02, 2.235e-01, -1.669e-01, -8.030e-04, -1.628e-02, -9.797e-02)); + r += mul(s3_5, M4(8.097e-02, -8.802e-02, 8.909e-02, -5.042e-02, 1.494e-02, 2.353e-02, -4.345e-02, -4.842e-03, -4.746e-02, -4.925e-02, 8.130e-02, 3.014e-02, -1.431e-02, -1.187e-01, 3.601e-02, -1.568e-03)); + r += mul(s3_6, M4(-3.983e-02, 8.975e-02, -1.097e-01, -2.354e-03, 2.544e-02, -6.747e-02, -2.813e-02, 2.132e-02, 4.415e-02, 2.316e-02, -7.110e-02, -1.807e-02, -1.686e-02, 1.114e-02, -6.167e-02, -9.863e-03)); + r += mul(s3_7, M4(8.592e-02, 1.271e-02, -9.243e-02, 5.828e-02, -1.367e-01, -4.598e-02, -1.202e-02, -4.801e-02, 9.932e-02, 9.926e-03, -5.031e-02, 1.650e-01, 3.893e-02, 6.156e-03, -3.474e-02, -1.083e-01)); + r += mul(s3_8, M4(1.120e-02, -3.952e-02, -4.259e-02, 1.034e-01, -7.690e-02, -7.688e-03, 2.102e-02, 5.862e-02, -3.920e-02, 2.724e-02, -1.052e-01, 3.477e-02, -7.197e-02, -3.307e-03, 1.187e-01, 1.826e-03)); + r += mul(s4_0, M4(-1.181e-01, -2.105e-03, 6.659e-02, -9.693e-02, -5.381e-02, 4.990e-02, 1.051e-01, 6.149e-02, 2.631e-03, -3.388e-02, -5.817e-02, -8.667e-02, -1.396e-01, 2.351e-02, -1.353e-02, 2.335e-02)); + r += mul(s4_1, M4(-1.239e-02, 8.171e-02, -5.804e-03, 9.792e-02, -4.276e-02, 1.050e-01, 3.182e-02, -3.140e-02, -5.871e-02, -6.173e-02, 1.148e-02, -5.548e-02, -8.282e-02, -1.731e-03, -4.758e-02, 4.939e-03)); + r += mul(s4_2, M4(-1.961e-01, 7.310e-02, 7.496e-02, 2.064e-02, 5.587e-03, 4.173e-02, -4.753e-02, 1.277e-02, 4.601e-02, -5.450e-02, -4.348e-02, -5.249e-02, -2.668e-02, -4.040e-02, -5.659e-04, -4.179e-02)); + r += mul(s4_3, M4(4.018e-02, 1.174e-01, 2.993e-02, 1.726e-01, 7.344e-03, 3.771e-02, 4.385e-02, 7.180e-02, -3.315e-02, 1.868e-02, 2.308e-02, 2.335e-02, -7.644e-02, -1.776e-03, 1.021e-01, -5.989e-02)); + r += mul(s4_4, M4(-1.093e-01, 1.338e-01, -3.326e-03, 2.741e-01, 5.125e-03, -5.155e-02, 7.349e-02, 2.113e-02, -3.361e-02, 4.438e-02, 4.073e-02, 3.265e-02, -5.326e-02, 1.109e-01, 9.573e-02, 1.011e-01)); + r += mul(s4_5, M4(-1.444e-02, -9.394e-02, 1.325e-01, 1.078e-02, -9.762e-02, -2.065e-02, -1.430e-01, -3.443e-02, 1.513e-02, 1.041e-01, -8.205e-02, -5.684e-02, -1.067e-01, -5.092e-02, 3.510e-02, 4.930e-02)); + r += mul(s4_6, M4(-1.771e-01, 6.409e-02, 2.086e-03, 3.445e-02, 1.277e-01, -2.445e-02, -1.331e-01, 2.405e-02, 4.605e-02, 2.834e-02, -1.150e-01, 1.056e-01, -1.270e-01, -1.430e-02, 1.851e-01, 5.202e-02)); + r += mul(s4_7, M4(-2.581e-01, -9.130e-04, 1.984e-02, 1.706e-02, 8.904e-02, 2.445e-02, 1.978e-02, -6.087e-02, 8.202e-02, 5.114e-02, -3.343e-02, 1.372e-01, -3.990e-02, 5.799e-02, 5.534e-02, 3.146e-03)); + r += mul(s4_8, M4(-1.432e-01, 6.463e-02, -1.744e-01, 7.203e-02, -5.544e-02, 7.475e-03, -1.297e-01, -1.000e-01, -4.786e-02, -8.024e-03, -8.030e-02, 4.410e-02, 3.240e-02, -1.657e-02, -5.415e-02, -2.264e-02)); + r += mul(s5_0, M4(-1.678e-02, 6.369e-02, 6.262e-02, 3.990e-03, -2.285e-02, -2.102e-02, -8.417e-02, 3.454e-02, 5.631e-02, -5.209e-03, -5.349e-02, 7.355e-02, 5.594e-02, -2.378e-02, -1.036e-01, 1.916e-02)); + r += mul(s5_1, M4(-8.472e-02, 1.004e-01, -4.666e-03, 2.850e-02, -7.198e-02, -4.735e-02, 4.020e-02, -9.596e-02, -6.666e-02, 4.326e-02, -1.966e-02, -1.055e-01, 1.041e-01, 2.119e-02, -5.364e-02, 1.074e-02)); + r += mul(s5_2, M4(-2.121e-02, 5.410e-02, 4.190e-02, 6.076e-02, 1.067e-01, 1.614e-02, 7.708e-02, -5.968e-02, 5.507e-02, -2.250e-02, 3.645e-02, -9.764e-03, -7.478e-03, -4.927e-02, 5.171e-03, -4.723e-02)); + r += mul(s5_3, M4(1.332e-01, 4.441e-02, -1.963e-01, 1.094e-02, 6.102e-02, 5.773e-03, -7.517e-02, 3.987e-02, 8.065e-02, -1.551e-01, -7.945e-02, -2.277e-01, 2.685e-01, 8.098e-03, -1.217e-01, -3.998e-02)); + r += mul(s5_4, M4(1.234e-01, 1.988e-02, -3.497e-02, 2.864e-03, -5.985e-02, -6.099e-02, -1.039e-01, -5.193e-02, 8.858e-02, 3.707e-02, -7.891e-02, 4.948e-02, 8.762e-02, 5.560e-02, -1.161e-01, 4.470e-02)); + r += mul(s5_5, M4(4.512e-02, -8.772e-02, 3.896e-02, -5.043e-02, 2.819e-02, -4.574e-02, 1.322e-01, 5.389e-02, -9.003e-02, 9.038e-02, -3.016e-02, 6.598e-02, 4.502e-02, -6.214e-02, 6.204e-02, 2.493e-02)); + r += mul(s5_6, M4(-1.418e-01, -6.317e-03, 4.192e-02, 1.090e-01, 4.677e-02, 2.775e-02, -4.033e-02, 1.778e-02, 1.161e-01, 8.278e-02, 1.486e-02, 1.899e-01, 4.682e-02, -1.269e-02, -5.939e-02, -4.191e-02)); + r += mul(s5_7, M4(3.808e-02, -1.382e-01, 1.624e-01, -8.867e-03, -4.352e-02, 4.613e-02, -8.485e-02, 1.962e-02, -9.782e-02, -1.877e-02, 2.046e-01, 1.311e-01, 5.570e-02, 7.291e-02, -1.629e-01, 2.372e-02)); + r += mul(s5_8, M4(7.632e-02, 2.845e-02, 9.477e-02, 4.662e-02, 2.186e-02, -1.191e-02, 3.877e-02, -2.086e-03, -7.178e-02, 9.062e-03, -1.733e-02, -2.907e-03, -1.850e-02, 4.354e-02, 2.838e-02, 1.076e-01)); + r += mul(s6_0, M4(-1.285e-01, 8.991e-02, -8.087e-02, -3.216e-02, 1.349e-02, 3.391e-02, -1.215e-02, -7.211e-02, 1.965e-03, 4.863e-02, 3.047e-02, -3.501e-02, -6.125e-02, -2.897e-03, -8.380e-02, 2.357e-03)); + r += mul(s6_1, M4(-5.757e-02, 1.372e-01, -6.267e-03, 8.437e-02, 6.323e-02, 4.447e-02, -3.204e-02, -6.612e-02, -2.887e-02, 1.434e-02, 5.392e-02, 1.096e-01, 4.232e-02, 1.115e-01, 2.729e-02, -1.276e-02)); + r += mul(s6_2, M4(2.303e-02, 5.033e-02, -8.145e-03, -1.038e-02, -1.006e-01, 2.948e-03, 6.525e-02, 1.323e-01, -1.220e-02, -4.912e-02, -2.678e-02, 4.257e-02, 6.654e-02, -1.227e-01, 2.506e-02, 9.650e-03)); + r += mul(s6_3, M4(-6.970e-02, 3.303e-02, 6.222e-02, -2.478e-02, 4.571e-02, -7.910e-03, 1.174e-01, -1.023e-01, -2.077e-01, 2.470e-02, 3.463e-02, 5.387e-03, 3.708e-02, 6.542e-02, 1.682e-02, 1.489e-01)); + r += mul(s6_4, M4(-9.703e-02, 1.665e-01, -2.678e-02, -2.903e-01, 2.605e-02, -1.837e-01, -6.346e-02, -1.372e-01, 5.312e-02, -6.241e-02, -1.031e-01, 1.010e-01, -1.034e-01, 1.392e-01, 6.485e-02, 4.498e-02)); + r += mul(s6_5, M4(1.261e-01, -5.379e-02, 1.237e-01, -7.338e-02, 9.243e-02, 1.550e-02, -3.866e-02, 1.153e-03, -1.044e-01, -9.256e-03, 3.221e-02, 2.840e-02, 1.068e-01, 7.488e-03, 3.220e-02, 2.742e-02)); + r += mul(s6_6, M4(6.648e-02, -5.628e-02, 5.234e-02, 1.653e-02, -2.854e-02, 1.178e-01, -4.848e-02, 4.922e-02, -3.475e-02, 3.335e-03, 5.270e-03, -6.638e-02, 1.035e-01, -1.178e-02, -1.055e-01, 1.954e-02)); + r += mul(s6_7, M4(2.042e-03, -2.349e-02, 5.391e-02, -1.043e-01, -3.899e-02, -8.002e-02, -3.419e-02, 1.665e-01, -2.302e-02, 7.047e-02, -4.170e-02, 1.918e-01, -1.703e-01, 3.008e-02, 3.182e-01, -1.188e-01)); + r += mul(s6_8, M4(-1.147e-01, 6.406e-02, 5.628e-02, 3.118e-02, -2.687e-02, 3.499e-02, 1.447e-02, 1.556e-01, 2.801e-02, -6.173e-02, 7.045e-02, 2.199e-02, -1.085e-01, -1.537e-02, 6.824e-02, -5.379e-02)); + r += mul(s7_0, M4(-9.648e-04, 4.945e-02, -1.580e-02, -1.928e-02, -4.261e-02, -2.873e-02, -1.721e-02, 1.632e-02, -1.067e-01, -5.818e-02, 5.599e-02, 2.674e-02, -2.359e-02, 1.152e-02, -2.086e-02, -3.648e-02)); + r += mul(s7_1, M4(-2.092e-02, 2.304e-01, 1.555e-02, -8.347e-02, 4.209e-02, 4.611e-02, 1.706e-02, -2.508e-01, 1.402e-01, -4.404e-02, 4.809e-02, -9.401e-02, 1.312e-02, 3.321e-02, -7.290e-04, -2.567e-02)); + r += mul(s7_2, M4(4.520e-03, 1.837e-01, -2.464e-02, 8.720e-02, 3.954e-02, -5.138e-02, 7.894e-02, -3.457e-02, 6.971e-02, 8.567e-02, -4.265e-02, 8.670e-02, 8.301e-03, -1.132e-02, 6.187e-02, 9.753e-03)); + r += mul(s7_3, M4(-7.253e-02, 4.552e-02, 5.727e-02, 7.030e-02, 5.003e-02, -5.706e-02, 6.038e-02, -9.776e-02, 3.438e-01, 2.599e-02, 1.471e-01, 8.453e-02, 1.411e-01, -3.744e-03, -1.581e-01, 6.738e-02)); + r += mul(s7_4, M4(8.551e-02, 1.264e-01, 1.721e-01, -1.666e-01, 1.878e-01, -1.705e-02, -9.005e-02, -1.883e-01, 1.931e-01, 4.764e-02, 1.080e-01, 3.652e-02, 2.942e-01, 6.859e-02, 1.697e-01, 2.116e-01)); + r += mul(s7_5, M4(4.700e-02, 4.284e-02, 5.256e-02, -6.432e-03, 1.579e-01, 9.761e-02, 9.664e-02, 4.621e-02, -1.928e-02, 2.427e-02, 7.885e-02, -1.989e-02, 9.267e-02, 1.829e-02, 2.837e-02, 2.120e-02)); + r += mul(s7_6, M4(-7.245e-02, -9.423e-03, 2.428e-02, -4.536e-03, -5.552e-02, 1.170e-01, -1.154e-02, 4.014e-03, -1.365e-01, -8.392e-02, 3.284e-02, 5.963e-02, 6.726e-02, 4.487e-02, -1.220e-01, -6.849e-03)); + r += mul(s7_7, M4(2.217e-02, 5.807e-02, 9.221e-02, -1.460e-01, -1.247e-01, 7.984e-02, -1.802e-01, 5.983e-02, -5.921e-03, 8.551e-02, 1.390e-01, -4.825e-03, 2.548e-01, -2.803e-02, 1.412e-01, -1.232e-01)); + r += mul(s7_8, M4(3.988e-02, 1.072e-01, -7.641e-02, -1.410e-02, 5.329e-02, 6.393e-02, -8.930e-02, 9.357e-02, -3.666e-02, -4.053e-02, -6.295e-02, 1.096e-01, -4.078e-02, 7.128e-02, 2.716e-02, -1.274e-01)); + r += V4(3.638e-02, -7.591e-03, 2.399e-02, -1.691e-02); + return r; +} + +V4 f3(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(6.122e-03, 3.221e-02, 6.415e-02, 4.652e-02, 8.167e-02, -7.381e-03, -1.575e-01, 5.303e-02, -3.314e-02, 4.220e-02, -6.893e-02, 8.922e-02, 5.497e-02, -1.050e-02, -9.800e-03, 1.611e-02)); + r += mul(s0_1, M4(-7.614e-02, -1.554e-02, -1.860e-02, 5.877e-02, -1.895e-01, 1.341e-01, 1.389e-02, 1.928e-01, 1.424e-02, 8.202e-02, -6.702e-02, 7.446e-02, -3.006e-03, -1.742e-02, 4.742e-02, -2.605e-02)); + r += mul(s0_2, M4(2.639e-02, -2.988e-03, 2.989e-03, 2.073e-02, -1.949e-01, -6.508e-02, 2.486e-02, 3.480e-02, 8.375e-02, 7.751e-02, -4.652e-02, 1.217e-01, -5.198e-02, 9.123e-02, -5.920e-03, 3.304e-02)); + r += mul(s0_3, M4(-1.204e-01, -4.366e-02, 2.654e-03, -6.506e-02, -1.330e-01, -9.774e-02, -1.598e-01, -2.019e-04, 3.756e-02, -7.465e-02, 7.482e-03, -8.724e-03, 3.620e-02, 1.860e-01, -1.966e-02, -8.684e-04)); + r += mul(s0_4, M4(-1.747e-02, -1.114e-01, 8.636e-03, -6.313e-02, 6.846e-02, -1.909e-01, -2.234e-02, 8.443e-02, 1.353e-01, -9.527e-02, -1.467e-01, -1.548e-01, 2.765e-02, 4.913e-02, -4.537e-02, 4.330e-02)); + r += mul(s0_5, M4(-6.526e-02, 1.994e-02, 9.515e-03, 2.388e-01, 1.288e-02, 4.491e-02, 9.393e-02, 1.422e-01, -1.040e-01, 1.134e-01, 2.765e-02, 4.279e-02, 2.043e-02, -4.010e-02, 7.829e-03, 5.488e-02)); + r += mul(s0_6, M4(2.325e-02, -3.689e-02, 1.841e-02, -1.125e-02, -9.640e-02, 2.857e-02, 3.618e-02, 7.420e-02, 5.475e-02, -1.613e-01, -4.310e-02, 9.549e-02, -2.707e-02, -1.212e-02, 5.390e-02, -1.092e-01)); + r += mul(s0_7, M4(6.382e-02, 6.961e-02, 1.197e-01, 3.837e-02, -1.072e-01, 6.384e-02, -4.949e-02, 1.343e-01, -1.190e-01, 1.769e-01, 9.607e-02, -5.057e-02, -1.692e-02, 4.203e-02, -4.110e-02, -7.169e-02)); + r += mul(s0_8, M4(4.697e-02, 1.007e-02, -4.633e-02, 8.848e-02, -1.414e-01, 1.499e-01, 2.593e-02, 1.987e-01, 8.290e-03, -5.479e-02, -1.708e-02, -1.725e-02, 7.765e-02, -6.238e-02, 1.249e-01, -4.455e-02)); + r += mul(s1_0, M4(2.614e-01, 2.343e-02, 3.152e-02, 1.098e-01, -2.643e-02, -1.966e-04, 1.151e-01, -1.548e-01, 7.466e-02, -3.097e-02, 3.441e-02, 1.095e-01, -9.348e-03, -3.311e-02, -2.857e-02, -1.503e-03)); + r += mul(s1_1, M4(-1.104e-01, -1.027e-01, -7.884e-02, 1.515e-01, -4.450e-02, 1.904e-03, 1.575e-01, 1.348e-01, 2.675e-01, 4.051e-02, 4.181e-02, -6.693e-02, -1.196e-01, -3.777e-02, 1.405e-02, 3.628e-02)); + r += mul(s1_2, M4(4.757e-02, -3.474e-02, 4.202e-02, -1.033e-03, -3.025e-02, 3.884e-02, -5.866e-02, 7.499e-03, 1.294e-01, -7.598e-02, 6.225e-02, -4.151e-03, -1.089e-01, -5.878e-02, 2.673e-02, -1.284e-01)); + r += mul(s1_3, M4(1.354e-01, -7.675e-02, 1.490e-01, -1.352e-01, -1.379e-02, -7.271e-02, 5.067e-02, -4.590e-02, 1.333e-01, -8.517e-02, 2.664e-03, 9.784e-02, -1.174e-01, -2.460e-02, -2.588e-01, -1.138e-01)); + r += mul(s1_4, M4(1.426e-01, 4.353e-02, -8.672e-02, 2.046e-01, 1.461e-01, -5.507e-02, -5.606e-02, -2.271e-01, 3.839e-01, -8.524e-02, 1.733e-01, -1.155e-01, -1.682e-01, 4.905e-02, -3.108e-02, -4.578e-02)); + r += mul(s1_5, M4(-5.940e-02, 8.678e-02, 5.285e-02, 1.852e-01, 1.069e-02, 6.512e-02, -6.523e-02, 1.531e-01, 1.185e-01, 9.120e-02, 9.382e-02, -4.945e-02, -1.033e-01, -3.036e-02, -3.838e-02, 4.350e-02)); + r += mul(s1_6, M4(-2.573e-03, 4.625e-02, 2.330e-01, -1.964e-01, 2.848e-02, 7.280e-03, 6.167e-03, 5.167e-02, 2.095e-01, -1.352e-01, 2.159e-02, -6.436e-02, -9.951e-02, -8.163e-02, -1.740e-03, 2.527e-02)); + r += mul(s1_7, M4(9.526e-02, -1.897e-02, -8.165e-02, 1.262e-01, 2.268e-02, -4.038e-02, -5.099e-03, -8.172e-03, 2.524e-01, -1.105e-01, 1.456e-01, 6.517e-02, -3.381e-02, -1.969e-01, 8.836e-02, -3.430e-02)); + r += mul(s1_8, M4(-9.836e-02, 2.153e-01, 3.308e-02, 4.850e-02, 7.915e-02, -4.260e-02, -4.212e-02, 6.764e-02, 1.521e-01, -1.361e-02, -1.244e-02, 5.889e-02, -2.020e-02, 1.773e-01, 3.557e-02, 1.293e-02)); + r += mul(s2_0, M4(-5.097e-02, -9.996e-02, -4.337e-02, -5.412e-02, 9.223e-03, 4.125e-02, 5.016e-02, -4.998e-02, 1.616e-01, 2.576e-02, 9.513e-02, -8.481e-02, 7.373e-02, -1.837e-02, -1.033e-02, -5.529e-02)); + r += mul(s2_1, M4(-2.437e-01, -4.166e-02, 4.871e-02, 1.655e-02, -1.347e-02, -3.214e-03, -4.125e-02, -2.885e-02, 2.194e-02, 6.872e-02, 1.936e-01, -1.485e-01, 5.305e-02, 1.856e-02, -5.319e-03, -8.416e-02)); + r += mul(s2_2, M4(3.580e-02, -5.350e-03, -2.500e-02, -8.106e-02, -8.992e-03, -1.122e-02, 2.935e-02, -6.553e-02, -9.298e-02, -6.000e-02, -8.810e-02, 8.355e-02, 3.968e-02, 4.725e-02, 5.453e-02, -2.341e-03)); + r += mul(s2_3, M4(5.013e-02, 9.650e-02, 2.147e-01, -5.275e-02, -9.588e-03, -1.680e-01, -1.210e-03, -1.026e-01, 1.637e-01, -1.267e-01, -7.794e-02, -1.377e-01, -9.077e-02, 2.929e-02, -2.320e-02, -3.885e-02)); + r += mul(s2_4, M4(3.537e-02, 2.861e-01, 1.609e-01, 6.069e-02, 1.520e-04, -9.723e-02, 1.479e-01, -1.614e-01, -2.389e-01, 7.053e-02, 4.435e-02, 2.380e-01, -2.154e-01, -2.414e-01, -5.209e-02, -2.076e-01)); + r += mul(s2_5, M4(1.066e-01, -9.957e-02, 4.507e-02, 2.493e-01, 4.581e-02, 7.302e-02, 8.105e-02, -1.858e-02, -2.431e-01, -3.741e-02, -1.559e-01, -6.571e-02, -1.112e-01, 8.648e-02, -8.348e-02, -4.152e-02)); + r += mul(s2_6, M4(-3.644e-02, 4.572e-02, -1.032e-03, 1.560e-02, -4.409e-02, -3.401e-02, -4.472e-02, 6.646e-02, 2.683e-01, 1.611e-01, 1.700e-01, -1.747e-01, 6.751e-02, 1.890e-01, 7.886e-02, -1.023e-01)); + r += mul(s2_7, M4(-6.757e-02, -9.052e-02, 2.832e-02, -1.465e-01, -4.922e-03, -9.794e-02, 1.553e-02, -1.279e-01, -8.987e-02, -1.094e-02, -6.688e-02, -1.655e-02, 7.677e-03, 2.611e-01, -2.482e-01, -6.622e-02)); + r += mul(s2_8, M4(2.499e-02, -1.209e-02, -1.115e-01, -9.601e-02, 9.146e-02, -5.758e-02, 4.364e-02, -1.167e-01, -1.097e-01, 1.173e-01, -1.560e-02, 3.475e-02, 2.849e-02, 1.014e-01, 8.593e-02, -1.590e-01)); + r += mul(s3_0, M4(-4.347e-02, -1.048e-01, -7.880e-02, -4.102e-02, 4.306e-02, 7.258e-02, -5.191e-02, 1.725e-01, 2.428e-02, 3.249e-02, -2.611e-02, -2.422e-02, 2.404e-02, -1.102e-01, 5.414e-02, -1.339e-01)); + r += mul(s3_1, M4(-1.674e-01, -7.777e-02, 2.180e-02, -5.083e-02, 8.096e-02, -3.833e-02, 6.135e-02, 1.318e-01, -1.086e-01, 8.571e-02, 1.685e-01, 6.385e-02, -1.179e-02, 2.198e-02, -2.858e-02, -1.056e-02)); + r += mul(s3_2, M4(-2.490e-02, -1.257e-02, -4.781e-02, -1.123e-01, -5.627e-02, -7.591e-02, -1.466e-01, 3.166e-02, -3.609e-02, -1.089e-02, 5.629e-02, 1.126e-01, 5.704e-02, -9.620e-03, 3.629e-02, 2.746e-02)); + r += mul(s3_3, M4(-6.588e-03, 1.090e-01, 1.702e-01, -7.298e-02, 2.883e-02, -1.147e-01, -7.601e-02, -1.193e-01, -8.575e-02, -3.435e-02, -3.054e-02, -1.020e-02, -4.655e-02, 7.413e-02, -3.645e-02, 1.089e-02)); + r += mul(s3_4, M4(-1.556e-01, 6.820e-02, 9.447e-02, 1.239e-01, -2.075e-02, -1.816e-01, 1.924e-02, -3.414e-02, -1.080e-03, 8.237e-02, 1.103e-01, 8.603e-03, 1.465e-02, -5.061e-02, -5.050e-02, -3.169e-02)); + r += mul(s3_5, M4(2.978e-03, -6.699e-02, -8.814e-03, 1.197e-01, -1.398e-02, 7.272e-02, -9.433e-02, -6.428e-02, -6.159e-03, -1.572e-01, -1.129e-02, 3.149e-02, 7.888e-02, 1.852e-02, 2.549e-02, 5.520e-02)); + r += mul(s3_6, M4(3.404e-02, 7.653e-02, 1.350e-04, -1.302e-02, -6.493e-03, 5.301e-02, 5.665e-02, 2.738e-03, 4.903e-02, 2.003e-01, -5.064e-02, 2.970e-02, -5.188e-03, 7.445e-02, 2.803e-02, -8.723e-02)); + r += mul(s3_7, M4(-3.503e-02, -9.320e-02, -7.654e-03, -2.625e-02, 4.191e-02, 4.742e-02, 1.224e-02, -8.254e-02, 3.761e-02, -9.573e-02, -9.324e-02, 2.324e-03, 4.435e-02, 4.660e-02, -2.731e-02, -5.098e-02)); + r += mul(s3_8, M4(1.075e-01, -8.816e-02, -1.708e-02, 4.243e-02, 2.831e-02, -1.839e-02, -4.368e-03, 6.529e-02, 6.338e-02, 6.434e-02, 1.710e-02, -3.947e-02, 3.058e-02, -8.413e-02, 1.092e-01, 6.166e-02)); + r += mul(s4_0, M4(9.885e-02, -2.609e-02, -6.038e-03, -2.739e-03, -3.237e-02, -1.558e-02, -5.483e-03, -9.643e-02, -7.105e-04, 5.494e-02, 5.130e-02, -1.732e-01, 5.518e-02, -3.268e-02, 1.108e-01, -2.745e-02)); + r += mul(s4_1, M4(1.702e-01, -2.706e-02, 3.278e-02, -7.609e-02, 2.094e-01, -3.217e-02, -1.866e-01, 1.230e-02, 7.174e-02, -3.407e-02, -3.769e-02, 1.175e-02, 3.143e-02, 2.576e-02, 1.159e-01, 2.635e-03)); + r += mul(s4_2, M4(1.988e-01, -8.267e-02, -5.928e-02, -1.172e-01, -8.113e-02, 1.107e-01, -3.047e-02, 1.694e-01, 6.036e-02, -1.419e-02, 4.958e-02, 1.981e-02, 2.589e-02, -2.834e-02, 9.015e-02, -4.404e-02)); + r += mul(s4_3, M4(4.116e-02, -2.129e-02, -8.551e-02, -3.631e-02, 7.849e-02, 2.772e-02, 1.066e-03, -1.486e-02, 8.836e-02, -1.642e-01, 5.603e-02, -2.434e-03, 7.719e-03, -2.007e-01, -1.681e-02, -2.288e-02)); + r += mul(s4_4, M4(-8.271e-02, 1.803e-01, -1.171e-01, -1.581e-02, 8.760e-03, -5.076e-02, -1.394e-01, 3.074e-02, -3.828e-02, 1.644e-01, 9.983e-02, 3.880e-01, -1.280e-01, -9.624e-02, 8.672e-02, -5.392e-02)); + r += mul(s4_5, M4(2.466e-01, -4.310e-02, -6.503e-02, -6.675e-02, -5.871e-02, 3.674e-02, 3.985e-02, 4.898e-02, 7.213e-02, 2.410e-02, 9.558e-02, -1.250e-02, -1.169e-02, 1.462e-01, 2.751e-02, 4.281e-02)); + r += mul(s4_6, M4(1.422e-01, 8.493e-02, -9.694e-02, -1.459e-01, -5.319e-03, 8.994e-02, -4.240e-02, -3.156e-03, -1.720e-02, 3.089e-02, -5.515e-02, 1.201e-02, 1.678e-02, 1.007e-01, 5.532e-02, -5.257e-02)); + r += mul(s4_7, M4(7.604e-02, 1.544e-01, -5.326e-03, -1.967e-04, -7.441e-02, -5.191e-02, -8.681e-03, -7.487e-02, -3.499e-02, -1.164e-01, -5.844e-02, -1.431e-01, 4.536e-02, 1.019e-01, -7.182e-02, 5.217e-02)); + r += mul(s4_8, M4(2.261e-01, 1.346e-01, -1.518e-01, -2.409e-01, 1.922e-02, -1.039e-01, 6.183e-02, 1.770e-02, -1.253e-02, -2.157e-01, 6.423e-02, -6.254e-02, -1.110e-02, -9.760e-02, 7.552e-02, 2.143e-01)); + r += mul(s5_0, M4(-1.293e-02, 3.530e-02, -4.793e-02, -2.026e-02, 7.835e-02, 7.064e-02, 1.519e-01, -3.133e-02, -8.069e-02, 7.062e-02, -3.027e-02, -7.878e-02, 1.247e-01, 5.229e-02, -5.594e-02, 1.688e-01)); + r += mul(s5_1, M4(-5.445e-03, 2.280e-02, -1.896e-02, 5.078e-02, 7.634e-02, 1.594e-03, 8.450e-03, -5.722e-03, 5.616e-02, 1.795e-02, 3.200e-02, 7.405e-03, -1.824e-01, 1.101e-01, -1.799e-02, 1.183e-01)); + r += mul(s5_2, M4(-4.660e-02, -2.095e-03, -3.316e-02, -3.642e-02, -2.935e-02, 6.936e-02, 4.058e-03, 2.224e-01, 1.972e-02, 9.378e-02, 5.085e-02, -1.652e-03, -2.666e-02, 2.385e-02, -7.901e-02, 4.147e-02)); + r += mul(s5_3, M4(6.111e-02, -1.291e-03, 9.123e-02, -7.596e-03, -3.088e-02, -2.414e-02, 8.107e-02, -4.347e-02, -1.154e-01, -7.597e-02, 3.140e-02, -9.213e-02, 2.709e-01, -3.836e-02, -6.321e-02, 1.294e-01)); + r += mul(s5_4, M4(-1.904e-01, -1.248e-02, 4.863e-02, 2.437e-02, 9.780e-02, -3.476e-02, 6.971e-02, -8.925e-02, -3.409e-02, -8.134e-02, 2.155e-01, 2.111e-01, 1.145e-01, 6.807e-02, -7.996e-02, 1.059e-01)); + r += mul(s5_5, M4(-2.078e-02, -5.235e-02, -3.481e-02, -1.279e-01, -4.278e-02, 2.770e-01, -1.707e-01, 1.052e-01, 1.513e-01, 7.838e-03, 1.237e-01, -1.042e-01, -1.111e-03, 2.036e-02, -1.705e-01, 4.461e-02)); + r += mul(s5_6, M4(9.067e-02, -8.189e-02, 8.152e-02, -1.201e-01, 5.614e-02, 4.607e-03, -1.237e-01, 1.687e-03, 4.723e-02, 4.826e-02, 1.634e-02, 9.371e-02, 5.985e-02, 7.587e-02, -6.067e-02, -7.720e-03)); + r += mul(s5_7, M4(2.234e-03, -4.154e-02, -3.238e-02, 1.585e-01, 1.864e-01, -4.508e-02, -5.011e-02, 4.000e-02, 1.318e-02, -1.099e-01, 8.159e-02, 4.908e-02, 5.029e-02, 1.217e-01, -3.190e-02, -1.377e-01)); + r += mul(s5_8, M4(-5.333e-02, 2.052e-01, -7.738e-02, -2.935e-02, 7.547e-02, -1.209e-03, -4.432e-02, -4.809e-02, -4.971e-02, 9.437e-02, 2.678e-04, 6.610e-03, 6.923e-02, -3.818e-02, -8.644e-02, -1.157e-01)); + r += mul(s6_0, M4(7.258e-02, 4.038e-02, 1.938e-01, 1.214e-01, 1.843e-02, -1.689e-02, 2.054e-02, 3.456e-02, 4.086e-02, -2.171e-03, -1.661e-02, 4.080e-02, -7.667e-03, -2.033e-02, 6.338e-02, -5.188e-02)); + r += mul(s6_1, M4(3.389e-02, 2.022e-02, 1.517e-01, -1.794e-02, 4.552e-02, -1.331e-02, -2.784e-02, 5.282e-02, -3.981e-02, 4.961e-02, -4.364e-02, -2.406e-02, 4.692e-02, 6.920e-03, -1.967e-01, 3.697e-02)); + r += mul(s6_2, M4(-8.807e-02, 5.278e-02, -1.307e-01, -5.170e-02, 6.900e-03, -2.587e-02, -2.910e-02, 1.182e-01, -1.332e-02, -8.885e-02, -3.295e-02, 6.568e-02, 7.378e-02, -1.441e-01, 1.888e-01, -6.906e-02)); + r += mul(s6_3, M4(2.135e-01, 9.815e-02, -2.317e-03, 7.926e-02, 7.139e-02, 3.568e-02, 1.005e-01, 5.436e-02, 3.522e-02, -7.201e-02, 2.137e-02, 1.105e-01, 7.763e-02, 1.051e-02, -2.502e-02, -1.303e-01)); + r += mul(s6_4, M4(1.521e-01, -4.022e-02, 1.071e-01, 2.978e-01, 2.251e-01, 1.372e-02, -8.842e-02, 8.195e-02, -1.758e-02, 1.544e-01, -7.503e-02, 2.309e-02, -1.311e-01, 6.786e-02, 6.556e-02, 1.875e-01)); + r += mul(s6_5, M4(1.487e-01, -3.226e-03, 5.028e-02, -3.164e-02, 8.212e-02, 7.144e-02, -5.512e-02, 1.067e-01, -2.526e-02, -8.824e-02, -7.579e-02, -4.321e-03, 1.298e-02, 1.498e-01, 7.777e-02, 7.105e-02)); + r += mul(s6_6, M4(-1.814e-01, -5.366e-03, 1.055e-01, 3.065e-02, -7.632e-02, 5.231e-02, -6.155e-03, -1.296e-01, 1.567e-01, -5.051e-03, -4.366e-02, 1.596e-01, -1.374e-01, 2.075e-01, -2.219e-02, -2.834e-01)); + r += mul(s6_7, M4(-1.007e-01, -1.339e-01, -1.843e-01, -2.791e-02, 1.473e-02, -3.861e-02, 9.616e-02, 4.250e-03, 4.409e-02, 1.443e-01, -3.020e-02, -3.879e-02, 1.685e-01, -1.937e-01, 5.492e-02, 1.600e-01)); + r += mul(s6_8, M4(-1.563e-01, 1.558e-01, 9.023e-02, 4.422e-02, 9.521e-02, -7.681e-03, -1.173e-01, 7.469e-03, -1.848e-02, -1.545e-01, -2.770e-02, 3.015e-02, 5.900e-02, -2.075e-02, 4.698e-02, 1.772e-01)); + r += mul(s7_0, M4(8.200e-02, 5.756e-02, 9.661e-02, 4.352e-02, -1.281e-01, 6.157e-02, 9.155e-03, -1.418e-02, 1.909e-02, 1.285e-01, -1.552e-02, -7.421e-02, -1.242e-02, -2.537e-02, -6.863e-02, 7.735e-02)); + r += mul(s7_1, M4(9.257e-03, 5.372e-04, 2.077e-02, 2.666e-02, 2.836e-02, 6.640e-02, -8.838e-02, 1.422e-01, -7.205e-03, 6.888e-02, -1.126e-01, 4.261e-02, 5.900e-02, -3.620e-02, -1.208e-01, -8.781e-02)); + r += mul(s7_2, M4(-1.545e-03, 3.824e-02, 1.034e-02, 1.034e-02, 9.623e-02, -6.105e-02, 2.341e-02, -5.951e-02, -3.689e-02, 3.023e-02, 5.508e-02, 1.259e-01, -7.240e-03, 1.046e-02, 3.698e-02, 7.760e-02)); + r += mul(s7_3, M4(8.481e-02, -1.001e-02, -3.504e-02, -6.743e-02, 1.274e-01, 1.218e-01, 1.881e-01, 1.043e-01, 1.663e-02, 1.255e-01, 6.236e-02, 1.034e-02, -1.097e-01, 2.092e-02, -9.565e-03, 3.159e-02)); + r += mul(s7_4, M4(-1.373e-01, -8.443e-02, 1.654e-02, 8.372e-02, 1.719e-01, 1.171e-01, -6.373e-02, -1.725e-01, 1.305e-01, 1.391e-01, -7.093e-02, 2.045e-01, 9.758e-03, 7.522e-02, 1.208e-01, 1.445e-01)); + r += mul(s7_5, M4(3.136e-02, 7.428e-02, 2.377e-02, -5.426e-02, -5.774e-02, -2.218e-02, 3.419e-02, -1.563e-01, 2.884e-02, 7.586e-02, 1.002e-01, -9.772e-02, -6.488e-02, 1.270e-01, -5.999e-02, 1.439e-02)); + r += mul(s7_6, M4(-6.248e-02, 2.695e-03, 5.388e-02, -4.867e-02, -1.261e-01, 1.290e-01, 8.692e-02, -2.300e-01, 1.047e-01, 1.861e-02, 1.120e-01, -9.187e-02, -1.043e-02, 6.918e-02, -1.089e-02, -1.033e-01)); + r += mul(s7_7, M4(6.349e-03, -8.782e-02, 7.311e-02, 7.680e-02, 4.490e-02, -5.650e-02, 2.508e-02, -2.658e-02, 3.531e-02, 4.187e-02, 1.274e-01, 2.816e-02, -6.453e-03, -1.352e-01, 2.652e-03, 1.852e-01)); + r += mul(s7_8, M4(1.649e-02, 2.633e-02, -2.998e-02, -5.636e-02, 1.651e-02, 3.758e-02, -1.289e-02, -2.705e-02, 1.393e-02, -3.522e-02, 9.666e-03, -5.731e-02, 3.139e-02, -3.168e-02, -3.724e-02, 1.530e-01)); + r += V4(-4.198e-02, -1.482e-02, 6.775e-02, 1.910e-02); + return r; +} + +void Pass11(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = Rmp8x8(tid.x) + blockStart; + uint2 size = GetInputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = (gxy + 0.5) * pt; + + V4 s0_0 = l0(-1.0, -1.0); + V4 s0_1 = l0(0.0, -1.0); + V4 s0_2 = l0(1.0, -1.0); + V4 s0_3 = l0(-1.0, 0.0); + V4 s0_4 = l0(0.0, 0.0); + V4 s0_5 = l0(1.0, 0.0); + V4 s0_6 = l0(-1.0, 1.0); + V4 s0_7 = l0(0.0, 1.0); + V4 s0_8 = l0(1.0, 1.0); + V4 s1_0 = -max(-s0_0, 0.0); + V4 s1_1 = -max(-s0_1, 0.0); + V4 s1_2 = -max(-s0_2, 0.0); + V4 s1_3 = -max(-s0_3, 0.0); + V4 s1_4 = -max(-s0_4, 0.0); + V4 s1_5 = -max(-s0_5, 0.0); + V4 s1_6 = -max(-s0_6, 0.0); + V4 s1_7 = -max(-s0_7, 0.0); + V4 s1_8 = -max(-s0_8, 0.0); + s0_0 = max(s0_0, 0.0); + s0_1 = max(s0_1, 0.0); + s0_2 = max(s0_2, 0.0); + s0_3 = max(s0_3, 0.0); + s0_4 = max(s0_4, 0.0); + s0_5 = max(s0_5, 0.0); + s0_6 = max(s0_6, 0.0); + s0_7 = max(s0_7, 0.0); + s0_8 = max(s0_8, 0.0); + + V4 s2_0 = l1(-1.0, -1.0); + V4 s2_1 = l1(0.0, -1.0); + V4 s2_2 = l1(1.0, -1.0); + V4 s2_3 = l1(-1.0, 0.0); + V4 s2_4 = l1(0.0, 0.0); + V4 s2_5 = l1(1.0, 0.0); + V4 s2_6 = l1(-1.0, 1.0); + V4 s2_7 = l1(0.0, 1.0); + V4 s2_8 = l1(1.0, 1.0); + V4 s3_0 = -max(-s2_0, 0.0); + V4 s3_1 = -max(-s2_1, 0.0); + V4 s3_2 = -max(-s2_2, 0.0); + V4 s3_3 = -max(-s2_3, 0.0); + V4 s3_4 = -max(-s2_4, 0.0); + V4 s3_5 = -max(-s2_5, 0.0); + V4 s3_6 = -max(-s2_6, 0.0); + V4 s3_7 = -max(-s2_7, 0.0); + V4 s3_8 = -max(-s2_8, 0.0); + s2_0 = max(s2_0, 0.0); + s2_1 = max(s2_1, 0.0); + s2_2 = max(s2_2, 0.0); + s2_3 = max(s2_3, 0.0); + s2_4 = max(s2_4, 0.0); + s2_5 = max(s2_5, 0.0); + s2_6 = max(s2_6, 0.0); + s2_7 = max(s2_7, 0.0); + s2_8 = max(s2_8, 0.0); + + V4 s4_0 = l2(-1.0, -1.0); + V4 s4_1 = l2(0.0, -1.0); + V4 s4_2 = l2(1.0, -1.0); + V4 s4_3 = l2(-1.0, 0.0); + V4 s4_4 = l2(0.0, 0.0); + V4 s4_5 = l2(1.0, 0.0); + V4 s4_6 = l2(-1.0, 1.0); + V4 s4_7 = l2(0.0, 1.0); + V4 s4_8 = l2(1.0, 1.0); + V4 s5_0 = -max(-s4_0, 0.0); + V4 s5_1 = -max(-s4_1, 0.0); + V4 s5_2 = -max(-s4_2, 0.0); + V4 s5_3 = -max(-s4_3, 0.0); + V4 s5_4 = -max(-s4_4, 0.0); + V4 s5_5 = -max(-s4_5, 0.0); + V4 s5_6 = -max(-s4_6, 0.0); + V4 s5_7 = -max(-s4_7, 0.0); + V4 s5_8 = -max(-s4_8, 0.0); + s4_0 = max(s4_0, 0.0); + s4_1 = max(s4_1, 0.0); + s4_2 = max(s4_2, 0.0); + s4_3 = max(s4_3, 0.0); + s4_4 = max(s4_4, 0.0); + s4_5 = max(s4_5, 0.0); + s4_6 = max(s4_6, 0.0); + s4_7 = max(s4_7, 0.0); + s4_8 = max(s4_8, 0.0); + + V4 s6_0 = l3(-1.0, -1.0); + V4 s6_1 = l3(0.0, -1.0); + V4 s6_2 = l3(1.0, -1.0); + V4 s6_3 = l3(-1.0, 0.0); + V4 s6_4 = l3(0.0, 0.0); + V4 s6_5 = l3(1.0, 0.0); + V4 s6_6 = l3(-1.0, 1.0); + V4 s6_7 = l3(0.0, 1.0); + V4 s6_8 = l3(1.0, 1.0); + V4 s7_0 = -max(-s6_0, 0.0); + V4 s7_1 = -max(-s6_1, 0.0); + V4 s7_2 = -max(-s6_2, 0.0); + V4 s7_3 = -max(-s6_3, 0.0); + V4 s7_4 = -max(-s6_4, 0.0); + V4 s7_5 = -max(-s6_5, 0.0); + V4 s7_6 = -max(-s6_6, 0.0); + V4 s7_7 = -max(-s6_7, 0.0); + V4 s7_8 = -max(-s6_8, 0.0); + s6_0 = max(s6_0, 0.0); + s6_1 = max(s6_1, 0.0); + s6_2 = max(s6_2, 0.0); + s6_3 = max(s6_3, 0.0); + s6_4 = max(s6_4, 0.0); + s6_5 = max(s6_5, 0.0); + s6_6 = max(s6_6, 0.0); + s6_7 = max(s6_7, 0.0); + s6_8 = max(s6_8, 0.0); + + t0[gxy] = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t1[gxy] = f1(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t2[gxy] = f2(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t3[gxy] = f3(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); +} + +//!PASS 12 +//!DESC conv11 +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 +//!IN t0, t1, t2, t3 +//!OUT t4, t5, t6, t7 + +#define l0(x, y) V4(O(t0, float2(x, y))) +#define l1(x, y) V4(O(t1, float2(x, y))) +#define l2(x, y) V4(O(t2, float2(x, y))) +#define l3(x, y) V4(O(t3, float2(x, y))) + +V4 f0(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(1.027e-02, 3.350e-02, 1.428e-02, 6.321e-02, 4.238e-02, -7.210e-02, 9.887e-02, 5.361e-02, 3.456e-02, 1.275e-01, -1.207e-01, -2.408e-03, -5.999e-02, -1.340e-02, 7.271e-02, 4.116e-02)); + r += mul(s0_1, M4(-4.305e-03, 7.823e-02, 1.873e-01, 8.701e-03, -1.526e-01, -1.319e-01, 1.577e-01, -1.227e-01, -5.320e-02, 5.097e-02, 4.025e-02, -2.267e-02, 4.957e-02, 6.809e-02, -1.239e-01, 4.480e-02)); + r += mul(s0_2, M4(2.936e-02, 2.545e-01, -2.636e-02, 9.335e-02, 1.159e-03, -1.849e-01, -8.767e-02, 3.542e-02, -2.835e-02, -6.257e-02, 5.403e-02, 7.037e-02, 6.892e-02, 9.439e-02, -1.353e-02, -3.231e-02)); + r += mul(s0_3, M4(-8.178e-02, -3.406e-02, 1.900e-01, -2.007e-01, 1.111e-01, 2.181e-02, 1.365e-01, 5.202e-02, -1.072e-01, 2.550e-02, -2.048e-01, -3.998e-02, 9.361e-02, 3.129e-04, -1.810e-02, -9.585e-02)); + r += mul(s0_4, M4(2.677e-02, 8.322e-02, 4.133e-02, 1.011e-02, -3.875e-04, -5.028e-02, 8.225e-02, 1.470e-01, 1.969e-01, 1.437e-01, 9.116e-03, -7.058e-02, -5.259e-02, 1.331e-01, -3.768e-02, -1.607e-01)); + r += mul(s0_5, M4(-1.911e-01, -2.324e-01, -5.346e-02, 4.299e-02, 2.093e-03, -1.989e-02, 5.742e-02, -3.412e-02, -3.372e-03, -9.658e-03, -1.687e-01, 1.714e-01, 5.278e-02, 1.814e-02, -2.189e-02, 5.993e-02)); + r += mul(s0_6, M4(8.498e-03, -1.256e-02, 2.460e-02, -5.061e-02, -2.528e-03, -8.265e-02, 8.679e-02, -7.378e-02, 2.867e-02, 1.050e-01, -2.118e-02, 3.698e-02, -1.119e-02, -2.787e-02, 4.916e-02, 5.612e-02)); + r += mul(s0_7, M4(-6.157e-02, 1.318e-01, 2.041e-02, -2.950e-02, 1.291e-03, 9.943e-02, 3.344e-02, -1.789e-01, 9.008e-02, -1.986e-01, -1.095e-01, 1.193e-01, -5.329e-02, -8.055e-03, 1.282e-01, -3.014e-02)); + r += mul(s0_8, M4(8.404e-02, 5.007e-02, -3.086e-02, -7.501e-02, 2.014e-02, -4.887e-02, 3.471e-02, 2.891e-02, -9.537e-02, -7.650e-02, 6.983e-02, 9.330e-02, -6.610e-02, 9.508e-02, 1.635e-02, -1.666e-02)); + r += mul(s1_0, M4(-4.352e-03, 4.436e-02, -1.928e-02, 6.807e-02, -1.587e-02, -1.885e-02, -3.777e-02, 1.072e-01, 1.705e-02, -1.222e-02, 8.458e-03, 2.098e-02, -6.163e-03, -4.240e-02, 7.474e-02, 2.001e-02)); + r += mul(s1_1, M4(-3.622e-03, 1.108e-01, 1.199e-03, -6.871e-02, -1.247e-01, -2.878e-02, -2.393e-04, -6.960e-02, 1.740e-03, -6.211e-02, 7.958e-02, 6.123e-02, -5.215e-02, -8.874e-02, -5.463e-02, -1.427e-03)); + r += mul(s1_2, M4(7.850e-02, 5.071e-04, 1.559e-02, -4.436e-02, 1.704e-02, -5.994e-02, -2.089e-03, 6.444e-02, -3.355e-02, 7.442e-02, -2.970e-02, 1.828e-02, 7.916e-03, 7.635e-03, 6.492e-02, -3.487e-04)); + r += mul(s1_3, M4(-2.986e-02, 4.872e-02, 3.465e-02, -1.199e-01, -1.510e-01, 7.831e-02, 1.277e-01, -5.327e-03, 3.122e-04, -1.056e-02, -2.310e-02, 5.508e-02, 1.646e-01, -4.631e-02, 4.147e-02, 1.827e-02)); + r += mul(s1_4, M4(9.032e-02, 5.492e-02, -1.526e-01, -9.587e-02, 3.079e-02, -5.876e-02, -4.757e-02, 5.352e-02, 3.499e-03, 9.725e-02, 1.254e-01, 2.497e-01, -1.745e-01, -3.897e-02, 1.041e-02, -1.713e-01)); + r += mul(s1_5, M4(1.645e-02, -2.164e-03, -2.104e-02, 5.136e-03, 5.553e-02, 2.830e-03, 1.231e-01, -6.042e-02, 6.551e-02, 2.146e-02, -2.451e-02, 9.546e-02, -1.102e-01, -4.046e-02, 9.812e-03, 5.146e-02)); + r += mul(s1_6, M4(-8.014e-02, -5.806e-02, -4.910e-02, 4.263e-02, 2.588e-02, 7.238e-02, 8.806e-02, -4.957e-02, 1.304e-01, -1.696e-02, -1.334e-01, 6.098e-03, 6.232e-02, -2.102e-02, 7.446e-02, 4.797e-02)); + r += mul(s1_7, M4(-6.799e-02, 5.962e-02, 4.658e-02, -1.627e-02, 3.097e-02, 7.660e-02, 9.734e-02, -1.109e-02, 8.521e-02, 2.398e-02, 1.091e-01, -5.402e-02, -3.233e-02, 2.900e-02, 8.171e-02, 5.457e-02)); + r += mul(s1_8, M4(1.813e-02, -5.903e-02, -8.821e-02, 3.328e-02, -2.800e-02, 5.176e-02, -2.824e-02, 2.950e-02, -2.937e-02, -2.933e-02, 1.451e-02, -1.768e-02, -1.294e-01, -2.657e-02, -1.093e-01, -2.449e-02)); + r += mul(s2_0, M4(-5.576e-02, 4.547e-02, 2.213e-02, -5.612e-02, -6.076e-02, -5.283e-02, 9.674e-02, -2.427e-02, 5.090e-02, -6.185e-02, 6.215e-02, 3.471e-02, 2.439e-02, 8.819e-02, -6.768e-02, -3.541e-02)); + r += mul(s2_1, M4(9.906e-02, 1.856e-04, 7.059e-02, -1.346e-02, -2.085e-02, -3.300e-02, -2.753e-02, -1.480e-02, -3.965e-03, -5.163e-03, -9.676e-02, 2.592e-02, -6.613e-02, 2.231e-02, -2.559e-02, 1.414e-02)); + r += mul(s2_2, M4(7.066e-02, -9.089e-02, 4.294e-02, 6.855e-03, 1.019e-01, 1.653e-02, 4.635e-02, 1.610e-02, 3.856e-02, 2.143e-02, 1.450e-01, -1.787e-02, -8.608e-03, 8.413e-02, -4.002e-02, -1.867e-02)); + r += mul(s2_3, M4(-8.533e-02, 1.267e-01, -2.513e-02, 5.467e-02, -1.880e-01, -3.546e-02, -1.445e-01, -9.015e-03, -6.507e-02, 8.525e-02, 8.733e-02, 6.145e-02, -1.146e-01, -1.366e-02, -3.453e-02, 1.275e-01)); + r += mul(s2_4, M4(7.469e-02, -4.658e-02, -9.446e-02, -3.588e-02, 1.319e-01, -2.569e-01, 9.587e-02, 6.460e-02, 2.033e-01, 6.380e-03, 7.087e-02, 3.207e-01, 1.154e-02, 4.893e-02, -2.383e-02, -7.729e-02)); + r += mul(s2_5, M4(1.595e-03, -9.912e-03, 7.094e-02, 8.387e-03, 1.157e-02, 7.051e-03, 1.257e-01, -6.340e-02, -8.918e-02, 4.954e-02, -1.062e-01, -3.136e-02, 2.560e-02, 4.426e-02, -5.615e-02, -6.095e-02)); + r += mul(s2_6, M4(-1.794e-02, -6.748e-02, -3.150e-03, -4.137e-02, -5.120e-02, -1.737e-01, -1.672e-01, 7.418e-02, -2.338e-03, -1.807e-02, 1.264e-02, 1.958e-02, -5.312e-02, 2.362e-02, -3.098e-02, 6.951e-03)); + r += mul(s2_7, M4(-6.799e-02, 7.544e-02, 9.480e-02, 6.688e-02, -9.454e-02, -2.227e-01, 1.661e-01, 7.126e-02, -2.606e-02, -6.588e-02, -1.764e-02, -2.451e-02, 5.529e-03, 2.664e-02, -2.938e-02, -2.994e-02)); + r += mul(s2_8, M4(-6.069e-02, 4.577e-02, -1.125e-01, -2.641e-02, 6.419e-02, 3.102e-02, -6.568e-02, 6.058e-02, -4.397e-02, 1.204e-01, -1.435e-01, 6.724e-02, -2.214e-02, 3.005e-02, -8.460e-02, -1.527e-03)); + r += mul(s3_0, M4(6.388e-02, 7.439e-02, 8.771e-02, -1.071e-01, 4.175e-03, 1.651e-02, -2.110e-02, 1.469e-02, 4.442e-02, -1.501e-01, 3.256e-02, 8.358e-03, 5.984e-02, -1.449e-02, -6.451e-02, -3.232e-02)); + r += mul(s3_1, M4(9.124e-02, -8.852e-02, -2.820e-02, 1.702e-01, -4.896e-02, -1.029e-02, -1.056e-01, 4.557e-02, 1.048e-01, -4.230e-02, -2.151e-02, 3.457e-02, 2.427e-01, 1.553e-02, 1.304e-01, 1.004e-01)); + r += mul(s3_2, M4(5.056e-02, -1.253e-01, 7.898e-02, -1.561e-02, 8.035e-02, 2.565e-02, 2.106e-02, -3.900e-02, 1.127e-01, 2.851e-02, -1.163e-02, 1.693e-01, 4.379e-02, 1.405e-02, -6.421e-02, -1.927e-02)); + r += mul(s3_3, M4(-1.382e-01, 2.770e-01, -9.469e-02, -6.580e-02, -1.002e-01, -1.981e-02, -3.225e-02, 5.722e-02, -1.903e-01, -1.401e-01, -4.509e-02, 5.948e-02, -1.062e-01, 1.216e-01, -3.595e-02, -5.656e-02)); + r += mul(s3_4, M4(-1.419e-01, 1.411e-02, -1.486e-01, -4.730e-02, 1.046e-01, 3.938e-02, 4.987e-02, 1.105e-01, 2.553e-01, 1.622e-01, -1.038e-01, 2.154e-01, 1.589e-01, 5.712e-02, -2.280e-02, -1.275e-01)); + r += mul(s3_5, M4(-1.119e-01, -6.812e-02, 1.085e-02, -8.278e-02, -7.537e-02, -7.356e-02, 8.431e-03, -7.313e-02, -1.562e-01, 7.580e-02, -1.201e-01, 4.693e-02, 1.688e-03, 8.123e-02, -1.526e-01, -1.570e-02)); + r += mul(s3_6, M4(3.434e-02, 2.129e-02, 3.146e-02, 1.193e-01, -6.725e-02, -9.413e-02, -4.018e-02, 6.954e-02, 2.412e-02, 2.030e-02, -3.220e-04, 2.826e-02, -6.690e-02, -9.628e-02, -1.657e-01, 1.762e-01)); + r += mul(s3_7, M4(-1.295e-01, -1.515e-01, 1.126e-01, 5.264e-02, -4.873e-02, -5.810e-02, 7.918e-02, 2.426e-02, -4.044e-03, -5.359e-02, -7.819e-02, 6.580e-02, -7.700e-02, -1.432e-01, -1.003e-01, 4.793e-02)); + r += mul(s3_8, M4(5.132e-02, 1.318e-01, -5.807e-02, 1.543e-02, 3.343e-02, -2.358e-02, 5.884e-02, 8.555e-02, -9.917e-02, 2.705e-02, 1.954e-02, 7.334e-03, -2.228e-02, -1.743e-01, -1.065e-02, 6.207e-03)); + r += mul(s4_0, M4(-7.787e-02, -1.987e-02, -3.034e-02, 4.881e-02, 4.049e-02, 9.913e-02, 1.125e-01, -5.630e-03, -1.277e-01, -1.210e-01, 2.032e-02, -1.912e-02, 1.864e-01, -3.915e-02, 1.205e-01, 7.250e-02)); + r += mul(s4_1, M4(-1.865e-01, 7.176e-02, -2.071e-02, 9.617e-02, -3.999e-02, 8.436e-04, 5.868e-02, 5.035e-02, 1.638e-01, 5.488e-02, 5.034e-02, 1.074e-01, 3.680e-03, 1.552e-02, 1.061e-01, 1.514e-02)); + r += mul(s4_2, M4(-1.471e-01, -7.088e-02, -5.048e-02, -1.602e-02, 2.071e-02, 1.244e-02, -5.500e-02, -1.124e-01, 8.448e-02, 8.704e-02, 3.572e-03, 2.569e-02, 6.429e-02, 3.312e-02, 7.447e-03, -7.709e-02)); + r += mul(s4_3, M4(-3.323e-03, -7.480e-02, -6.359e-03, -8.133e-02, -2.709e-02, 1.274e-01, 2.387e-01, -1.789e-03, -1.244e-01, -9.319e-02, -1.313e-02, -5.737e-02, 2.097e-01, 1.328e-01, 1.389e-01, -7.027e-02)); + r += mul(s4_4, M4(-1.533e-02, 5.026e-02, -1.738e-01, -1.808e-01, 9.018e-02, 3.262e-01, 1.511e-01, 1.832e-01, 1.525e-01, 1.369e-01, -2.421e-01, -1.503e-01, -4.022e-02, 6.431e-02, 2.300e-01, 2.242e-01)); + r += mul(s4_5, M4(1.554e-01, -1.086e-01, 2.606e-02, -2.852e-02, 2.103e-02, 9.414e-02, -8.182e-02, 1.710e-01, -1.289e-03, 9.796e-02, -7.346e-02, 6.094e-03, 2.657e-02, 3.331e-02, -6.860e-02, -1.547e-02)); + r += mul(s4_6, M4(-4.565e-02, -1.252e-01, -1.260e-01, 1.447e-01, 1.822e-02, 1.472e-01, 2.370e-01, 6.200e-02, 3.505e-02, 7.348e-02, -3.147e-02, 1.064e-02, 8.525e-02, -9.476e-02, -2.267e-02, -3.494e-02)); + r += mul(s4_7, M4(1.060e-01, -8.831e-02, 4.264e-02, 2.502e-02, 1.012e-01, 2.622e-01, 4.551e-03, -5.335e-02, -1.870e-02, 2.267e-02, -8.892e-02, -1.373e-02, -4.082e-02, 2.549e-02, 1.202e-01, -1.565e-01)); + r += mul(s4_8, M4(-5.898e-02, 2.479e-02, -3.942e-02, -3.697e-03, -1.255e-01, 1.387e-01, -1.316e-01, 8.861e-02, 4.392e-02, -1.030e-01, 6.450e-03, -3.109e-02, -1.278e-02, 7.887e-02, -6.572e-02, -4.646e-02)); + r += mul(s5_0, M4(-1.887e-02, -1.250e-01, -1.006e-02, 4.404e-02, -5.668e-02, 6.629e-02, 2.281e-02, 5.303e-03, 6.988e-02, -2.749e-02, -5.214e-02, 3.167e-02, -4.101e-02, -1.666e-02, -1.159e-02, 1.014e-02)); + r += mul(s5_1, M4(4.428e-02, 5.437e-02, 1.288e-01, 9.757e-03, 2.095e-02, -4.681e-02, -3.719e-02, 9.138e-02, 1.123e-01, -3.314e-02, -8.532e-02, 1.557e-01, -5.768e-02, -2.301e-02, 6.916e-02, 1.345e-02)); + r += mul(s5_2, M4(1.333e-02, 6.317e-02, -2.239e-02, 2.617e-02, -3.199e-02, 5.707e-02, -1.811e-02, -4.650e-02, 2.383e-02, -8.511e-02, 1.560e-02, -9.861e-02, 1.960e-02, 4.809e-02, -3.470e-02, -4.688e-02)); + r += mul(s5_3, M4(-3.797e-02, -4.800e-02, -1.630e-02, 4.191e-02, -2.801e-02, -3.671e-02, 1.489e-04, -3.431e-02, 1.077e-01, 7.320e-02, 4.196e-02, 5.629e-02, -1.585e-01, -1.169e-01, 2.734e-02, 6.072e-02)); + r += mul(s5_4, M4(5.287e-02, 1.144e-01, 2.570e-02, -2.558e-02, 1.581e-02, 4.501e-02, 1.703e-01, 5.116e-02, 1.633e-01, 9.708e-02, -1.226e-01, -1.191e-01, -1.863e-01, -5.411e-02, 1.863e-01, 2.647e-01)); + r += mul(s5_5, M4(7.694e-02, 1.329e-01, -3.723e-02, 1.601e-02, 6.980e-02, 3.843e-02, -1.607e-02, 5.129e-02, 8.915e-02, 1.707e-01, 3.626e-02, -6.211e-02, -1.157e-02, -2.449e-02, -6.461e-02, 3.962e-02)); + r += mul(s5_6, M4(1.273e-02, 4.972e-03, 8.003e-02, 3.084e-03, -2.563e-02, 1.600e-01, 1.369e-01, -6.358e-03, 3.958e-02, 7.380e-02, -6.270e-02, -2.599e-02, -2.974e-02, -5.836e-02, -9.067e-04, -1.933e-02)); + r += mul(s5_7, M4(-8.110e-03, 6.509e-02, 4.287e-02, -1.191e-02, 9.469e-02, 1.269e-01, -5.862e-03, -1.099e-01, -4.246e-02, 8.094e-05, 6.560e-02, 7.111e-02, -1.085e-01, 4.565e-04, 3.576e-02, -3.619e-02)); + r += mul(s5_8, M4(-7.703e-02, 4.137e-02, -1.278e-01, 1.509e-01, -4.019e-02, 1.154e-01, -4.917e-02, -4.517e-03, -2.795e-02, -9.270e-02, 7.441e-03, -4.642e-02, -3.896e-03, 5.552e-02, -9.551e-04, -1.710e-04)); + r += mul(s6_0, M4(3.741e-02, 2.367e-02, 4.031e-02, 5.234e-02, 5.206e-03, 3.340e-02, 1.847e-01, -1.892e-02, -1.302e-01, 1.977e-02, -1.397e-02, 1.557e-01, -4.721e-02, 5.117e-02, 5.815e-03, 5.388e-02)); + r += mul(s6_1, M4(1.490e-01, -6.906e-03, -2.045e-02, 9.492e-02, -2.670e-01, 3.501e-02, 4.475e-02, 3.518e-02, -8.545e-02, -7.837e-02, 5.113e-02, 3.450e-02, 9.494e-02, 5.137e-02, -2.409e-02, -1.630e-02)); + r += mul(s6_2, M4(1.001e-01, 7.930e-02, -2.769e-02, -8.569e-03, -2.833e-02, 7.423e-02, 5.656e-02, 1.955e-02, -2.687e-02, -1.095e-01, 5.323e-02, 1.263e-04, 9.546e-02, -3.930e-03, 1.200e-02, 7.090e-02)); + r += mul(s6_3, M4(8.177e-02, 2.099e-01, 1.219e-03, 5.645e-02, 1.903e-01, 1.848e-01, -9.204e-02, 6.842e-02, 1.345e-02, 1.227e-01, 1.105e-01, -1.011e-01, -2.807e-01, 5.359e-02, 7.534e-03, -1.919e-01)); + r += mul(s6_4, M4(-2.466e-01, -1.215e-01, -2.944e-02, -1.788e-01, -3.305e-02, -2.583e-02, 6.965e-02, 1.115e-01, -8.188e-03, 1.026e-01, 1.654e-01, -9.167e-02, 5.933e-02, -3.517e-03, -5.736e-02, 4.267e-02)); + r += mul(s6_5, M4(-4.238e-02, 1.966e-02, -4.612e-02, 4.649e-02, 3.077e-02, 1.443e-01, -1.214e-01, 5.610e-02, 6.675e-02, 2.343e-02, -8.010e-04, 6.241e-02, -7.188e-02, 9.264e-03, -5.050e-02, 2.200e-02)); + r += mul(s6_6, M4(-3.730e-02, 1.765e-02, -2.157e-02, 4.494e-02, -8.190e-02, -3.957e-02, -1.489e-02, -2.375e-02, -6.377e-02, 5.413e-02, -4.732e-02, 1.595e-02, 1.908e-02, -8.771e-03, 7.518e-02, -6.149e-02)); + r += mul(s6_7, M4(3.306e-03, -1.145e-01, -1.196e-01, 3.965e-02, -1.753e-01, 1.538e-01, 7.509e-02, 3.034e-02, -9.531e-02, -9.182e-02, 9.663e-02, -3.387e-02, 1.423e-02, -4.138e-03, -3.193e-02, -9.204e-02)); + r += mul(s6_8, M4(8.442e-02, 1.387e-01, -5.979e-02, 2.392e-02, -8.845e-02, -2.704e-02, -1.145e-01, -2.621e-03, -1.899e-02, -2.144e-02, 1.663e-02, -3.083e-02, 1.069e-02, 3.161e-02, -3.266e-03, -4.319e-02)); + r += mul(s7_0, M4(-5.123e-02, -3.657e-02, -3.869e-02, -6.674e-02, -1.697e-02, -1.439e-01, -2.765e-02, 1.092e-02, 3.349e-03, -2.223e-02, -7.069e-02, -1.561e-03, -2.408e-01, -1.226e-01, -1.894e-02, 6.401e-02)); + r += mul(s7_1, M4(-3.214e-02, -2.262e-02, -5.277e-02, -3.741e-02, -1.213e-01, -7.707e-02, -3.552e-02, 1.140e-02, -5.600e-02, 8.291e-02, 2.238e-02, -2.037e-02, 2.020e-02, -3.163e-02, 3.580e-02, 1.581e-04)); + r += mul(s7_2, M4(4.871e-02, 7.530e-02, 1.845e-02, -8.611e-02, -4.128e-02, -1.197e-02, 3.897e-02, -3.884e-02, -8.676e-02, 1.107e-01, -5.836e-02, -3.621e-03, 3.486e-04, -3.959e-02, -3.687e-03, -3.999e-02)); + r += mul(s7_3, M4(1.186e-01, 2.908e-02, -1.749e-01, 5.311e-02, 6.358e-02, 8.960e-02, -3.391e-02, -1.091e-01, -6.161e-03, -2.794e-02, -1.079e-01, -1.413e-01, -2.787e-01, -1.223e-02, -1.932e-02, -1.993e-01)); + r += mul(s7_4, M4(-1.706e-01, -1.186e-02, -2.587e-02, -7.661e-02, -7.354e-02, -1.035e-02, -5.896e-02, -7.232e-03, 6.542e-02, 2.646e-01, -1.570e-03, 8.268e-02, 1.450e-01, 2.379e-02, -5.428e-02, -1.446e-01)); + r += mul(s7_5, M4(7.825e-02, 6.404e-02, 1.175e-01, -1.253e-02, 5.442e-02, -1.039e-02, 7.739e-02, 2.245e-02, 7.787e-02, 2.019e-01, -3.032e-02, 1.489e-01, -1.078e-02, 1.432e-01, -1.520e-02, -4.307e-03)); + r += mul(s7_6, M4(1.518e-02, -5.765e-03, 1.038e-01, 4.877e-03, -6.176e-03, -4.776e-02, -5.405e-03, 4.432e-02, 3.103e-02, -3.598e-03, -1.491e-02, 6.369e-02, -4.103e-02, -8.058e-02, -1.370e-02, 7.380e-02)); + r += mul(s7_7, M4(-4.558e-02, 3.477e-02, 2.722e-02, 6.162e-02, -9.459e-02, 1.393e-02, -1.056e-02, 3.824e-02, -1.973e-01, -3.068e-02, -3.340e-02, 1.884e-02, 3.135e-02, -7.181e-02, 4.414e-02, -9.669e-02)); + r += mul(s7_8, M4(3.346e-02, 2.025e-02, 9.116e-02, -7.691e-03, -1.319e-02, -7.742e-02, -2.411e-02, -2.220e-02, -1.083e-02, -5.092e-02, -1.051e-01, 9.269e-02, 3.190e-02, -1.121e-01, 7.497e-02, -3.024e-02)); + r += V4(2.404e-02, 4.612e-02, -2.197e-02, 2.583e-02); + return r; +} + +V4 f1(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(1.279e-01, -3.366e-02, -6.106e-02, 7.234e-02, 2.575e-01, 9.499e-02, -1.607e-01, 1.009e-01, -2.040e-01, 4.915e-03, 2.064e-01, -1.916e-01, -7.249e-03, -5.613e-02, 9.941e-03, 7.943e-02)); + r += mul(s0_1, M4(2.299e-02, -4.077e-02, -1.152e-01, -3.534e-02, 2.206e-01, 1.534e-01, 2.909e-02, -6.460e-02, -1.576e-01, -1.292e-01, 7.251e-02, 1.202e-01, -7.741e-02, -3.712e-02, -3.224e-02, -1.461e-01)); + r += mul(s0_2, M4(-7.144e-02, -1.591e-02, -7.688e-02, 4.094e-02, 2.130e-01, 1.416e-01, -1.073e-02, -4.519e-03, -9.835e-02, 2.078e-02, 8.720e-04, -8.038e-02, -8.616e-02, -6.062e-02, -5.964e-02, 4.167e-02)); + r += mul(s0_3, M4(-8.807e-02, -3.156e-02, 4.208e-02, 4.239e-02, 3.079e-02, 7.417e-02, -1.900e-01, 3.545e-03, 1.907e-01, -9.657e-02, 2.109e-01, -7.153e-02, -5.825e-02, 1.168e-01, 1.213e-01, -9.887e-02)); + r += mul(s0_4, M4(3.984e-02, 4.145e-02, -3.554e-01, 4.647e-02, -1.710e-01, 2.289e-01, 5.428e-02, 1.081e-01, 1.071e-01, -7.097e-02, 7.493e-03, -4.977e-02, 1.458e-02, 1.337e-01, -1.108e-01, -5.505e-02)); + r += mul(s0_5, M4(1.629e-01, 8.552e-02, -2.103e-01, -5.147e-02, -8.944e-03, 1.279e-02, 3.232e-02, 1.568e-01, 1.322e-02, 1.217e-01, -3.924e-02, -8.033e-02, 1.411e-01, -1.682e-02, -6.152e-02, -4.818e-02)); + r += mul(s0_6, M4(-1.434e-01, -3.193e-02, -1.201e-01, 1.157e-01, 1.336e-01, -2.133e-02, -6.619e-02, -1.335e-01, 9.345e-02, -8.295e-02, 7.208e-02, 9.369e-02, 1.030e-01, -6.211e-02, 1.510e-02, -6.255e-03)); + r += mul(s0_7, M4(-1.815e-01, -1.262e-01, -1.561e-01, -4.939e-03, -9.261e-02, 2.095e-01, -1.511e-02, -1.741e-01, 1.317e-01, -1.158e-01, -4.331e-04, 8.866e-02, -7.553e-02, -2.143e-02, -5.532e-02, -5.052e-02)); + r += mul(s0_8, M4(-2.470e-02, 4.386e-02, -2.729e-02, 3.006e-02, 1.152e-01, 7.602e-02, -2.523e-02, -1.453e-01, 7.368e-02, -1.033e-01, 7.891e-02, -1.697e-01, -9.816e-02, 8.418e-02, 3.900e-02, -7.317e-02)); + r += mul(s1_0, M4(-5.105e-02, -1.298e-02, 2.407e-02, 5.246e-03, 6.278e-02, -8.287e-02, 3.093e-02, 3.455e-02, -4.439e-02, -3.267e-02, -8.388e-02, 4.421e-02, -7.185e-02, 2.124e-02, -3.238e-02, 1.844e-01)); + r += mul(s1_1, M4(3.112e-02, -5.267e-03, -1.198e-02, 4.540e-02, 6.870e-03, 1.315e-02, -2.940e-02, 2.722e-03, 1.363e-02, -3.576e-02, -4.401e-02, 6.896e-02, 3.213e-02, 9.293e-02, 9.204e-02, 4.444e-02)); + r += mul(s1_2, M4(-5.652e-02, -8.733e-02, -1.603e-02, -6.631e-02, -3.792e-02, -2.115e-02, -4.981e-02, -3.937e-02, 3.890e-02, -3.225e-02, -6.633e-03, 2.197e-03, -1.018e-01, -1.744e-01, -6.023e-02, 7.670e-02)); + r += mul(s1_3, M4(-1.227e-01, -1.529e-02, 8.825e-02, -1.428e-01, 6.615e-03, -7.766e-02, 2.002e-02, 1.091e-01, -3.180e-02, -8.135e-02, -1.047e-01, 9.672e-02, -1.086e-01, 4.518e-02, -1.033e-01, 6.713e-03)); + r += mul(s1_4, M4(6.562e-02, 6.497e-02, -5.178e-02, -4.144e-02, -1.119e-01, -4.966e-02, 1.830e-01, 5.417e-02, -1.265e-01, -8.944e-02, -1.583e-01, -2.233e-01, 1.434e-01, 2.096e-01, 3.577e-03, 2.237e-01)); + r += mul(s1_5, M4(1.973e-02, -7.771e-02, -3.364e-02, 7.592e-02, -1.178e-01, -8.351e-02, -7.591e-02, 9.629e-02, -1.125e-01, -1.656e-02, -8.947e-03, 2.037e-01, 2.216e-01, -1.094e-01, 2.478e-02, -1.058e-01)); + r += mul(s1_6, M4(-7.549e-02, -8.087e-02, 1.030e-01, 9.166e-02, 2.592e-02, 3.428e-02, 3.391e-02, 9.272e-03, -1.093e-02, -7.403e-02, -1.135e-01, 3.686e-02, 1.685e-02, 8.050e-03, -8.718e-02, 1.131e-02)); + r += mul(s1_7, M4(4.517e-02, -1.805e-01, -1.346e-01, -8.709e-02, -2.236e-02, 6.259e-03, 6.235e-02, -6.781e-02, -2.046e-01, 8.657e-04, -9.356e-02, -1.557e-02, -8.873e-02, 6.786e-02, -5.795e-02, 2.236e-01)); + r += mul(s1_8, M4(-1.957e-02, 1.486e-02, -4.926e-02, 3.940e-02, -4.909e-02, 2.867e-02, 6.275e-02, -1.317e-01, 1.014e-02, -2.516e-02, 1.059e-01, 2.583e-02, 7.398e-02, -1.656e-01, -1.807e-02, -3.563e-02)); + r += mul(s2_0, M4(3.905e-02, 4.195e-02, 2.408e-02, -5.066e-02, 2.877e-03, -5.353e-02, 6.722e-03, 3.963e-02, 3.936e-02, 1.759e-02, -5.413e-02, -1.006e-01, -1.032e-01, 1.407e-02, -1.816e-03, -4.725e-02)); + r += mul(s2_1, M4(-8.659e-02, -6.690e-02, -2.369e-02, 8.620e-02, -9.957e-02, -4.924e-02, 4.479e-03, -7.542e-02, 7.070e-02, 6.020e-02, 6.204e-02, 8.101e-02, 5.890e-03, -6.030e-02, 7.879e-02, 4.558e-02)); + r += mul(s2_2, M4(-2.502e-02, -6.068e-02, 4.304e-02, 4.327e-02, 3.423e-02, -5.258e-02, 5.167e-02, 2.573e-02, 4.979e-02, -5.505e-02, 2.229e-02, 6.239e-02, -1.855e-02, 8.684e-02, 7.693e-02, 1.272e-02)); + r += mul(s2_3, M4(5.067e-03, -2.459e-02, 2.352e-03, 9.823e-02, 1.921e-02, -8.460e-02, 1.165e-01, -3.759e-02, 4.493e-02, 2.649e-02, 6.970e-02, 1.018e-01, -4.113e-02, -6.144e-02, -7.839e-03, -7.800e-02)); + r += mul(s2_4, M4(3.751e-02, -2.392e-02, 1.363e-01, -1.343e-01, 1.052e-01, -2.994e-02, -2.411e-01, 6.704e-02, 1.204e-02, 2.038e-02, -7.752e-02, -1.959e-01, 1.357e-01, 7.517e-02, 3.376e-02, 2.537e-01)); + r += mul(s2_5, M4(-6.996e-02, 4.220e-02, 3.621e-02, -2.892e-02, -7.755e-02, 2.388e-02, 1.379e-02, 1.424e-01, -7.725e-02, 1.225e-01, 1.115e-01, 3.311e-02, -1.300e-01, 1.373e-01, 2.819e-02, 3.427e-02)); + r += mul(s2_6, M4(-5.453e-02, 4.552e-02, -2.180e-02, 2.561e-02, -1.318e-01, 2.918e-03, -2.844e-02, 2.129e-01, 3.826e-02, -5.138e-02, 7.055e-02, -2.352e-03, -9.334e-03, -3.794e-02, -2.176e-02, -5.253e-02)); + r += mul(s2_7, M4(1.225e-01, -1.233e-01, 9.290e-03, 1.017e-01, -1.422e-01, 2.826e-02, -4.448e-02, -7.646e-02, -4.387e-02, 1.225e-01, -5.220e-03, 1.012e-02, 4.607e-02, 5.358e-02, 5.278e-02, 8.320e-02)); + r += mul(s2_8, M4(5.630e-02, 7.660e-02, -1.488e-02, -4.350e-02, -2.135e-01, 8.763e-02, 6.009e-03, 3.679e-02, 2.555e-02, -1.223e-02, -4.974e-02, 1.520e-02, 3.425e-02, -6.627e-02, 6.280e-03, -1.601e-02)); + r += mul(s3_0, M4(1.028e-01, 1.002e-01, 6.515e-02, 1.996e-02, 1.337e-03, -7.797e-03, 1.001e-01, -1.168e-02, -2.405e-02, -5.076e-02, 1.096e-02, -1.736e-01, -1.959e-02, -7.104e-02, 9.389e-02, 2.230e-02)); + r += mul(s3_1, M4(1.421e-02, -2.660e-03, -1.353e-01, 8.574e-02, 4.807e-03, -2.868e-02, 1.437e-02, -7.176e-02, 3.202e-02, 8.032e-02, 2.433e-02, -2.427e-03, -4.091e-01, -5.981e-02, -1.661e-01, -4.668e-02)); + r += mul(s3_2, M4(-8.635e-02, -9.985e-02, 1.037e-02, -5.507e-02, 6.209e-02, 1.184e-01, 8.178e-02, -3.382e-02, -2.840e-02, 1.776e-02, 5.276e-02, -9.830e-02, -8.517e-02, 1.753e-01, -7.723e-02, -2.443e-02)); + r += mul(s3_3, M4(4.088e-02, 3.340e-02, -3.264e-03, 7.110e-02, 9.310e-02, -1.009e-01, 1.956e-02, -1.012e-01, 1.309e-01, -3.251e-03, 2.671e-02, 1.055e-01, -1.091e-01, 6.270e-02, 1.444e-01, 3.960e-02)); + r += mul(s3_4, M4(9.021e-02, 4.735e-02, 2.571e-02, 2.710e-02, 1.292e-01, -3.198e-02, -1.173e-01, 2.232e-02, 9.124e-02, -3.346e-02, 2.053e-02, 1.608e-02, -1.201e-01, 8.022e-02, 1.262e-01, 4.209e-02)); + r += mul(s3_5, M4(1.415e-02, -6.527e-02, 2.029e-02, 1.816e-02, 4.115e-02, -2.240e-02, 4.729e-02, 7.265e-02, -5.411e-02, -2.636e-02, 8.844e-02, -1.105e-02, -2.662e-01, 1.428e-01, 8.907e-02, 8.336e-02)); + r += mul(s3_6, M4(6.805e-02, 1.395e-01, -9.585e-02, 4.461e-02, 2.142e-02, 6.744e-04, 1.476e-02, 6.879e-03, -5.205e-02, 1.953e-02, 9.391e-02, -9.982e-02, 1.105e-01, -1.812e-02, 7.876e-02, 4.754e-03)); + r += mul(s3_7, M4(1.061e-02, -1.649e-01, 7.892e-02, 2.179e-02, -2.028e-02, 5.663e-02, 1.090e-01, -2.495e-01, -1.095e-01, 1.663e-01, 5.676e-02, 1.104e-01, 2.350e-01, -1.737e-05, 6.275e-02, -5.373e-02)); + r += mul(s3_8, M4(-3.147e-02, 2.322e-01, 1.393e-02, 6.937e-02, -6.567e-02, 2.665e-02, -1.422e-02, 5.359e-02, 1.171e-01, -3.963e-02, 2.992e-02, -6.924e-02, 1.773e-01, -3.631e-02, 1.185e-01, -1.028e-02)); + r += mul(s4_0, M4(-5.687e-02, 7.693e-03, 6.385e-02, 2.993e-02, -1.034e-01, -2.592e-02, 1.640e-03, -6.905e-02, -1.666e-02, -2.981e-02, -3.767e-02, -1.516e-02, 1.333e-01, -2.744e-02, -2.162e-01, 2.590e-01)); + r += mul(s4_1, M4(-8.843e-02, -1.823e-03, 8.369e-02, 1.177e-01, -1.970e-02, 1.472e-02, 1.363e-01, 1.451e-01, 8.558e-02, -2.608e-02, 1.457e-02, -2.496e-02, -4.943e-02, 7.773e-03, -1.686e-01, 1.476e-01)); + r += mul(s4_2, M4(-3.009e-02, -1.751e-02, 5.983e-02, -1.646e-01, -6.494e-02, -5.240e-02, 1.187e-01, -1.996e-03, -2.502e-02, 4.830e-02, -1.864e-01, 6.051e-02, -2.417e-02, -6.760e-02, -6.460e-02, 2.814e-04)); + r += mul(s4_3, M4(-8.744e-02, 5.006e-02, -2.079e-02, 9.829e-02, 1.772e-01, -1.175e-01, 9.265e-02, 9.310e-02, 3.576e-02, 6.130e-02, 4.680e-02, 1.632e-01, -1.245e-01, 8.862e-02, -2.980e-01, 2.297e-02)); + r += mul(s4_4, M4(8.308e-02, 7.544e-02, 1.629e-01, 2.374e-01, 5.315e-02, 7.817e-02, 2.026e-01, -2.530e-01, 1.486e-01, -4.941e-02, 9.442e-02, 3.796e-02, -1.124e-01, -5.497e-02, -2.431e-01, 6.729e-02)); + r += mul(s4_5, M4(3.043e-01, -2.249e-01, 8.679e-02, 8.587e-03, -3.091e-02, 1.281e-01, 1.058e-01, 1.238e-01, -1.237e-01, -2.999e-02, -7.889e-02, -1.038e-01, -4.301e-02, -7.012e-02, -1.021e-01, -2.089e-02)); + r += mul(s4_6, M4(2.500e-02, -2.472e-02, 8.017e-02, 4.952e-02, 3.016e-02, -1.007e-01, -5.812e-02, -2.393e-02, 1.429e-02, -1.669e-02, -5.088e-03, 1.606e-01, -5.341e-02, -4.039e-02, -1.368e-01, 8.641e-02)); + r += mul(s4_7, M4(1.258e-01, 2.161e-02, 2.055e-01, 1.858e-01, -2.128e-01, 1.039e-01, -1.339e-01, -1.722e-01, -1.349e-01, -8.110e-02, -7.639e-02, 6.999e-02, -2.331e-01, 8.396e-02, -4.020e-02, 1.369e-01)); + r += mul(s4_8, M4(-1.218e-01, -3.218e-02, 6.787e-02, 5.315e-02, 5.871e-02, 9.026e-02, -1.272e-01, -1.574e-02, 3.738e-02, -1.998e-02, -1.137e-02, -1.836e-02, 5.407e-04, -2.666e-02, -1.174e-01, 2.181e-01)); + r += mul(s5_0, M4(-4.300e-02, 1.067e-01, -1.611e-02, 1.408e-02, -1.082e-01, 6.859e-03, -3.246e-02, 1.440e-02, 3.127e-02, 4.931e-03, -2.008e-02, -1.087e-01, 1.869e-01, -3.763e-02, 9.214e-02, -6.139e-02)); + r += mul(s5_1, M4(2.163e-02, -1.327e-02, -7.326e-02, -1.634e-02, -9.571e-03, -1.920e-02, -6.807e-02, 6.684e-02, 1.094e-01, -1.085e-01, 5.202e-02, 7.035e-03, 2.908e-02, 1.155e-01, 1.365e-01, -9.210e-02)); + r += mul(s5_2, M4(-1.816e-01, 4.733e-02, -5.288e-02, 3.186e-02, -1.024e-01, -2.162e-02, -1.839e-02, 9.413e-03, 2.192e-02, 4.179e-02, 1.054e-02, 8.923e-03, -3.371e-02, 1.072e-02, 8.813e-02, -6.179e-02)); + r += mul(s5_3, M4(4.771e-02, 4.805e-02, 2.398e-02, -2.165e-03, 8.587e-02, -6.910e-03, 5.999e-02, -4.768e-03, 7.841e-04, -7.417e-02, -9.176e-02, 2.145e-03, 1.780e-01, 7.821e-02, 2.110e-01, 2.032e-02)); + r += mul(s5_4, M4(7.944e-02, -1.616e-02, 9.059e-05, -3.100e-02, 7.670e-02, 2.298e-03, 6.435e-02, -1.431e-01, 6.823e-02, -9.556e-02, 1.325e-02, -8.277e-02, 1.527e-01, 8.532e-02, 3.696e-01, -7.039e-02)); + r += mul(s5_5, M4(6.107e-02, -1.836e-02, 5.551e-02, 6.896e-02, 1.774e-01, 2.109e-02, 9.409e-02, -1.408e-02, -5.310e-02, -2.290e-01, 9.082e-02, -9.762e-03, 5.386e-02, 1.275e-01, 1.664e-01, -9.219e-02)); + r += mul(s5_6, M4(2.762e-02, -6.232e-02, -8.595e-02, 2.939e-02, -2.988e-02, -5.534e-03, 3.508e-03, 2.618e-04, -4.541e-02, 7.138e-02, 7.792e-02, -4.452e-02, 5.544e-02, 2.857e-02, 1.264e-01, 5.603e-02)); + r += mul(s5_7, M4(-3.177e-02, 1.966e-02, -5.840e-03, -3.527e-02, -1.901e-01, 2.063e-01, -5.171e-02, -1.624e-02, -4.568e-02, -1.109e-02, -9.732e-02, -1.645e-01, 3.332e-02, 1.855e-01, 1.683e-01, -5.122e-02)); + r += mul(s5_8, M4(-6.366e-02, -6.204e-02, -4.810e-02, 1.133e-02, -4.249e-02, 6.398e-02, -6.416e-02, -4.528e-03, 7.454e-02, -7.559e-02, -6.606e-02, -6.678e-03, 7.244e-02, 2.279e-02, -1.285e-03, 1.840e-02)); + r += mul(s6_0, M4(-1.078e-01, -2.801e-02, 7.246e-02, 4.707e-02, -1.894e-01, -2.593e-02, 2.423e-02, -3.650e-02, 1.273e-01, -4.858e-03, -5.637e-03, 1.420e-01, 1.411e-02, -6.332e-02, 3.113e-02, 1.083e-01)); + r += mul(s6_1, M4(-2.501e-02, -5.155e-02, -5.300e-02, 6.727e-03, 1.291e-02, 3.799e-02, 6.704e-02, -8.818e-03, 1.438e-01, 3.135e-02, -3.689e-02, -8.483e-02, -8.690e-02, 6.428e-02, -1.973e-02, -4.476e-02)); + r += mul(s6_2, M4(-1.165e-01, 2.959e-01, 4.430e-02, 7.807e-02, -9.287e-02, 1.312e-01, -1.275e-01, 4.720e-02, 1.288e-02, -3.103e-02, -4.469e-02, -1.277e-01, -1.358e-01, 3.453e-02, 7.734e-03, -1.723e-02)); + r += mul(s6_3, M4(1.415e-02, 4.357e-02, 9.350e-02, -1.290e-02, -1.784e-01, -1.194e-01, -6.447e-02, -1.538e-01, 3.828e-02, 8.403e-04, -9.760e-02, 3.470e-02, 7.904e-02, 6.751e-02, 6.433e-02, 9.591e-03)); + r += mul(s6_4, M4(4.858e-02, 9.642e-03, -1.416e-01, -1.765e-01, 7.997e-02, -2.211e-01, 2.500e-02, 4.583e-02, -1.211e-01, 7.273e-02, -1.105e-01, -6.780e-02, 1.552e-01, -6.610e-02, 1.221e-01, 9.713e-02)); + r += mul(s6_5, M4(8.812e-02, 1.163e-01, -3.385e-02, 5.496e-02, -1.088e-01, 5.046e-02, -9.608e-02, -6.503e-02, -5.554e-02, -1.426e-01, -1.015e-01, 7.827e-02, 2.886e-02, -9.295e-02, -1.683e-02, -5.637e-02)); + r += mul(s6_6, M4(6.530e-02, 1.705e-01, 5.023e-02, 5.670e-03, -2.066e-01, -1.008e-01, -2.584e-02, -1.695e-01, -3.472e-02, -1.673e-02, 1.132e-02, 7.294e-02, 1.806e-02, 8.904e-02, 1.301e-02, 7.587e-02)); + r += mul(s6_7, M4(-7.182e-02, 1.284e-02, 2.450e-02, 2.996e-01, -1.210e-01, 5.583e-02, -2.610e-02, 1.577e-01, 6.162e-02, -1.601e-01, 4.786e-02, 2.652e-02, -1.700e-01, -4.436e-03, 3.861e-02, 9.871e-02)); + r += mul(s6_8, M4(-1.442e-01, -6.627e-02, 5.110e-02, 8.370e-02, 9.951e-02, -8.591e-02, -5.248e-02, -9.295e-02, 4.298e-02, -1.054e-01, -3.308e-02, -1.683e-02, -1.237e-01, 4.142e-03, -1.229e-01, -1.149e-01)); + r += mul(s7_0, M4(-2.132e-02, 4.805e-02, 6.327e-02, 1.387e-01, 1.004e-02, -1.254e-02, 5.425e-02, -4.269e-03, -1.508e-01, 4.787e-02, -5.652e-02, 2.234e-02, -3.006e-02, 5.317e-02, -5.235e-02, 1.102e-01)); + r += mul(s7_1, M4(8.749e-02, 6.059e-02, -3.881e-02, -2.855e-03, 5.492e-02, 2.269e-02, -6.710e-02, -7.440e-02, 2.012e-01, -1.893e-02, 1.096e-02, -1.808e-02, 9.809e-02, -4.306e-02, 1.054e-03, -3.551e-02)); + r += mul(s7_2, M4(-6.344e-03, 6.911e-02, -8.138e-02, 3.389e-03, -3.893e-02, -2.793e-02, -3.421e-02, 1.312e-02, -1.058e-02, 2.910e-02, -6.469e-02, -5.796e-02, 5.012e-02, 8.912e-02, 3.562e-02, 4.717e-02)); + r += mul(s7_3, M4(-5.413e-02, 7.983e-02, -4.328e-02, -7.536e-02, -6.332e-02, 1.174e-02, 1.104e-01, -4.694e-02, -9.745e-02, 6.358e-02, 2.715e-02, -2.189e-02, -2.204e-01, 3.593e-02, 5.257e-02, 1.805e-01)); + r += mul(s7_4, M4(2.007e-01, -1.128e-02, -6.092e-02, 1.107e-02, 1.147e-01, 4.907e-02, 9.380e-02, -1.132e-01, -1.031e-01, 1.390e-01, 1.988e-01, -3.743e-02, -2.523e-01, -8.979e-02, 1.662e-01, 6.444e-02)); + r += mul(s7_5, M4(1.083e-01, 1.595e-02, -1.725e-01, 5.724e-03, -1.331e-01, 3.038e-02, 8.289e-03, 4.838e-02, 2.811e-02, -1.325e-02, -1.052e-01, 9.198e-03, -2.897e-02, 7.183e-02, -7.798e-03, 2.164e-02)); + r += mul(s7_6, M4(7.601e-02, -6.164e-02, -1.161e-01, -5.035e-02, 2.184e-02, 1.047e-01, 4.872e-02, 4.256e-02, -1.560e-04, -1.473e-02, -1.539e-02, 1.090e-01, 4.757e-02, -1.741e-01, -3.318e-03, 3.241e-02)); + r += mul(s7_7, M4(-2.860e-02, 1.666e-01, -1.005e-02, 1.621e-01, 5.307e-02, 8.958e-02, -5.114e-02, -3.572e-02, -2.053e-02, -8.701e-02, 1.172e-01, -1.191e-01, 1.827e-02, -9.646e-02, -1.384e-02, 1.939e-01)); + r += mul(s7_8, M4(-1.288e-01, 1.404e-02, -1.802e-01, -1.037e-01, 7.175e-03, -5.918e-02, 4.387e-02, -6.959e-02, -4.688e-02, -8.219e-02, -6.531e-02, 2.699e-02, 1.969e-02, -6.182e-02, -5.690e-02, -4.697e-02)); + r += V4(4.057e-02, 6.685e-02, 6.700e-02, -1.475e-02); + return r; +} + +V4 f2(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(3.130e-02, 2.971e-03, -1.697e-02, 1.723e-01, -2.969e-02, 5.238e-02, -6.038e-02, -1.713e-01, -2.884e-02, 2.689e-02, 1.049e-01, 9.709e-02, 7.953e-03, 5.953e-02, 8.925e-02, -3.547e-02)); + r += mul(s0_1, M4(-1.699e-01, -1.627e-01, -2.591e-02, 1.405e-01, -1.440e-01, -9.739e-02, -1.221e-02, -4.837e-02, 8.099e-02, -1.887e-02, -8.460e-02, 7.115e-02, 6.461e-02, -1.117e-02, 9.771e-02, 9.994e-02)); + r += mul(s0_2, M4(-1.191e-01, -4.843e-02, -8.051e-02, -8.403e-03, -6.654e-02, 1.643e-02, -3.486e-02, -1.460e-01, 7.868e-02, -3.679e-02, 8.537e-02, 6.625e-02, 6.675e-02, -3.406e-02, -3.296e-02, 1.288e-02)); + r += mul(s0_3, M4(-1.254e-02, 1.587e-01, -1.404e-01, -9.692e-02, -1.083e-01, -3.384e-02, -5.840e-02, -1.022e-01, -5.070e-03, 1.152e-02, 1.578e-02, 8.507e-02, -1.561e-03, -1.234e-01, 8.587e-02, -8.467e-03)); + r += mul(s0_4, M4(-2.645e-01, 1.098e-01, -1.588e-01, -4.149e-03, -2.474e-02, -6.423e-02, -5.085e-02, -3.228e-01, -2.512e-02, -1.876e-01, 1.527e-01, 7.138e-02, 3.622e-02, -7.167e-02, 5.379e-02, 1.440e-01)); + r += mul(s0_5, M4(-8.099e-02, 7.277e-03, -1.015e-01, -2.088e-02, -2.608e-02, -9.005e-02, 5.451e-02, -3.323e-02, -5.641e-02, 6.354e-02, -1.074e-01, 3.794e-02, 2.156e-02, -1.153e-01, 6.865e-02, 1.685e-01)); + r += mul(s0_6, M4(-1.037e-01, 8.738e-03, -2.146e-01, 2.522e-02, 7.273e-02, 1.562e-01, 5.971e-02, -6.630e-02, 2.006e-02, -6.878e-03, -4.255e-02, 6.355e-02, -7.011e-02, 7.403e-03, -1.004e-03, 6.821e-02)); + r += mul(s0_7, M4(3.246e-02, -9.474e-03, 3.046e-02, 8.857e-02, -1.451e-01, 1.464e-01, -2.309e-01, -2.253e-01, 1.313e-01, -1.055e-01, 1.011e-02, 8.469e-02, 1.286e-01, -1.157e-01, 4.310e-02, 2.545e-02)); + r += mul(s0_8, M4(1.688e-02, -5.121e-02, 3.931e-02, 5.312e-03, -4.991e-02, -5.310e-02, 6.352e-02, -1.698e-01, 1.023e-02, -3.237e-02, -3.106e-02, 1.126e-02, -3.956e-02, 7.182e-02, 3.462e-02, 1.284e-01)); + r += mul(s1_0, M4(-7.200e-02, -1.373e-01, 1.461e-01, 1.011e-01, -5.594e-02, 1.675e-02, 9.083e-02, 8.184e-02, -5.444e-02, -3.439e-02, -3.755e-02, -4.670e-02, -5.214e-02, 1.053e-01, -8.947e-03, -3.363e-02)); + r += mul(s1_1, M4(-9.103e-02, 1.141e-01, 6.822e-02, 2.195e-02, -3.647e-02, 2.817e-02, -6.649e-02, 1.015e-02, -2.507e-03, 6.292e-02, -3.789e-02, -5.327e-02, 3.955e-02, -4.437e-03, -5.890e-02, 1.282e-02)); + r += mul(s1_2, M4(4.900e-02, -7.565e-03, -4.303e-02, -7.926e-02, -1.776e-02, 1.173e-01, 1.059e-01, -4.628e-03, 2.424e-02, 5.327e-02, 8.622e-02, 9.865e-03, -5.063e-02, 2.139e-02, -3.283e-02, -1.076e-01)); + r += mul(s1_3, M4(4.076e-02, -1.201e-01, -1.468e-02, -7.557e-02, -9.181e-02, -5.838e-02, -9.056e-02, 8.927e-02, -8.817e-02, 4.257e-02, 1.622e-01, -3.077e-02, -2.824e-01, -1.754e-01, -4.173e-02, -3.796e-03)); + r += mul(s1_4, M4(-1.808e-01, -9.420e-02, 2.362e-01, 5.666e-02, 1.558e-01, 6.239e-02, -1.044e-01, -6.183e-02, 7.567e-03, 1.080e-01, -1.334e-01, -5.788e-03, -3.618e-02, -2.672e-01, -4.522e-02, 6.275e-02)); + r += mul(s1_5, M4(-8.083e-02, -3.153e-02, 7.586e-02, -2.597e-02, -8.238e-02, -1.108e-01, -6.356e-02, 8.368e-02, 3.564e-02, 1.147e-01, -2.603e-02, 5.378e-02, -1.115e-01, -6.909e-02, -7.367e-02, 1.292e-01)); + r += mul(s1_6, M4(4.447e-03, 3.811e-02, -7.687e-02, -2.917e-02, 6.661e-02, -5.593e-02, -9.921e-03, -2.300e-02, -3.419e-02, 2.266e-02, -7.253e-03, 3.770e-02, -9.734e-03, -5.784e-03, 4.182e-02, 2.311e-02)); + r += mul(s1_7, M4(6.541e-02, 1.123e-01, -8.935e-02, 7.808e-02, -2.990e-02, -1.476e-02, 1.612e-01, 6.376e-02, 6.191e-02, -5.186e-02, 1.945e-01, 1.909e-02, 2.268e-02, -4.369e-02, 3.291e-02, -2.180e-01)); + r += mul(s1_8, M4(-1.179e-02, 5.091e-03, -2.284e-02, 6.567e-02, 7.615e-03, 6.188e-02, 2.730e-02, 1.096e-01, -6.861e-02, -3.396e-02, -1.333e-01, -3.154e-02, -8.793e-02, -1.780e-03, -5.642e-02, 6.958e-02)); + r += mul(s2_0, M4(8.236e-02, 4.958e-02, -6.726e-03, 4.602e-03, 1.930e-02, -4.994e-02, -8.625e-03, -6.828e-02, -4.857e-02, 5.621e-04, 2.747e-02, 1.256e-01, 2.196e-02, 1.233e-02, 4.565e-02, -3.883e-02)); + r += mul(s2_1, M4(-4.036e-02, 1.410e-02, 4.532e-02, -3.577e-02, -1.095e-01, 8.027e-04, 6.363e-03, -7.028e-02, -1.750e-02, -8.614e-02, 3.487e-02, 1.905e-02, 5.269e-02, 1.186e-01, 5.839e-02, 1.010e-01)); + r += mul(s2_2, M4(-6.230e-02, -7.290e-02, -2.559e-02, 8.144e-03, -6.011e-02, -5.373e-02, 1.737e-02, -3.953e-02, -8.449e-02, 5.397e-02, 1.553e-01, -8.801e-02, 5.439e-02, -4.834e-02, 2.087e-02, 3.786e-02)); + r += mul(s2_3, M4(1.312e-03, 4.385e-02, -1.052e-01, 1.187e-01, 1.796e-01, -1.156e-01, 1.312e-01, 7.027e-03, 7.043e-02, 5.154e-02, -7.434e-02, -7.112e-02, -6.333e-02, -3.389e-02, 1.071e-02, -4.098e-03)); + r += mul(s2_4, M4(-6.067e-02, 1.708e-02, 3.357e-02, -8.908e-02, 1.508e-01, 3.211e-02, -8.900e-02, -1.560e-02, -1.030e-02, -3.789e-02, 5.975e-03, -9.308e-02, -1.062e-02, -1.841e-01, 1.484e-02, 1.164e-01)); + r += mul(s2_5, M4(-8.618e-02, -4.005e-02, 6.690e-02, 5.596e-02, -2.935e-01, -4.283e-02, -1.875e-01, 1.296e-01, -8.753e-02, -1.694e-02, -2.331e-02, -8.463e-02, -1.410e-01, -1.085e-01, 3.978e-02, -7.041e-02)); + r += mul(s2_6, M4(5.414e-02, 3.529e-02, 5.805e-02, 3.732e-04, 3.671e-02, -7.497e-03, 1.048e-01, 8.747e-02, -2.924e-02, 3.028e-02, -7.909e-02, -4.302e-03, 4.368e-02, -2.135e-02, 9.883e-02, -3.821e-02)); + r += mul(s2_7, M4(-1.323e-01, 3.368e-02, -7.996e-02, -2.019e-01, 7.806e-02, 2.529e-02, 3.800e-02, 7.636e-02, -4.905e-02, -7.635e-02, 2.038e-01, 1.055e-01, 1.360e-02, 1.124e-01, -9.663e-03, -1.235e-02)); + r += mul(s2_8, M4(1.595e-02, 8.632e-03, -3.587e-02, -1.464e-02, -3.107e-02, 4.872e-02, 4.783e-02, 5.343e-02, -9.727e-03, 7.866e-02, -2.355e-01, 6.806e-04, 2.052e-02, 7.465e-02, -3.182e-03, -7.256e-02)); + r += mul(s3_0, M4(1.681e-02, 4.112e-02, -7.830e-02, -1.704e-02, 6.887e-02, 1.142e-02, 1.087e-02, -6.558e-03, -7.073e-02, -9.275e-02, 1.470e-01, 2.685e-02, -2.009e-02, -4.445e-02, 6.022e-02, -5.597e-02)); + r += mul(s3_1, M4(-9.797e-02, 6.285e-02, 2.181e-01, -5.413e-02, -3.854e-02, 2.665e-02, -5.676e-02, -9.111e-02, -9.869e-02, -4.973e-02, 4.636e-02, 7.394e-02, -2.655e-01, -1.570e-01, 8.760e-02, 1.714e-01)); + r += mul(s3_2, M4(-8.892e-02, -8.366e-02, -5.989e-02, 1.579e-01, 2.242e-03, -7.445e-02, 2.149e-02, -6.127e-02, 1.714e-02, 5.657e-03, 2.707e-01, -3.986e-02, 5.101e-02, -1.289e-01, -7.053e-02, -3.878e-02)); + r += mul(s3_3, M4(2.501e-01, -1.295e-01, 1.204e-01, 7.735e-02, 1.076e-01, 3.385e-02, 7.283e-02, -1.388e-03, 6.986e-02, 3.354e-02, 6.278e-02, -5.167e-02, 4.310e-02, 1.368e-01, 2.254e-02, -9.449e-02)); + r += mul(s3_4, M4(4.136e-01, 5.363e-02, -1.864e-01, -4.797e-02, 4.818e-02, 8.905e-03, -2.680e-02, 2.409e-02, 8.077e-02, 1.417e-01, -1.978e-01, -3.116e-02, -7.184e-03, 4.112e-03, 1.164e-01, 6.615e-02)); + r += mul(s3_5, M4(-1.137e-01, 9.477e-02, 4.973e-02, 1.354e-01, 8.513e-04, -7.474e-02, -1.031e-01, 1.021e-01, 8.874e-02, 6.081e-02, -4.876e-01, 1.334e-02, 5.266e-02, -3.342e-02, 2.331e-01, -6.394e-02)); + r += mul(s3_6, M4(3.396e-02, 4.118e-02, 6.863e-02, -1.918e-03, -3.163e-02, -5.579e-02, -5.444e-02, 1.387e-02, 7.337e-03, -8.970e-02, 1.428e-01, 4.239e-02, 5.511e-02, -1.222e-01, 1.717e-01, -1.737e-01)); + r += mul(s3_7, M4(2.141e-01, -1.514e-01, -9.737e-03, 1.630e-02, -6.909e-03, -1.175e-02, -7.800e-02, 1.107e-01, 6.107e-03, 1.227e-02, 4.571e-01, -1.420e-02, 1.533e-01, 2.142e-02, 8.917e-02, -6.197e-02)); + r += mul(s3_8, M4(1.040e-01, -2.908e-02, -8.072e-02, 1.600e-01, 1.254e-01, -8.766e-02, 5.691e-02, 3.955e-02, 4.178e-02, 4.562e-02, -2.707e-01, -5.604e-02, 1.596e-01, -1.549e-02, -4.298e-02, 4.781e-02)); + r += mul(s4_0, M4(1.448e-02, -3.126e-03, 2.671e-01, 4.931e-02, -2.637e-02, 1.546e-02, -9.846e-02, 1.047e-01, -5.858e-03, 1.219e-01, -2.739e-02, 1.359e-01, -1.015e-01, -4.477e-02, -7.104e-02, -3.550e-02)); + r += mul(s4_1, M4(7.703e-02, 5.984e-02, 1.710e-01, 6.703e-02, -1.361e-01, 1.835e-02, 1.559e-01, -3.566e-02, 5.388e-02, 1.998e-02, -3.225e-02, -3.200e-02, -4.279e-02, -2.967e-02, -7.387e-03, -1.738e-03)); + r += mul(s4_2, M4(-3.824e-02, 1.635e-01, 2.978e-01, -6.955e-02, -2.575e-02, -4.559e-03, -8.055e-02, -3.102e-02, -1.214e-01, -1.347e-01, -1.159e-01, 8.305e-02, -5.546e-02, -7.330e-02, -9.751e-02, -2.338e-01)); + r += mul(s4_3, M4(-4.372e-02, 2.133e-01, 1.651e-01, 3.397e-02, 2.440e-01, 6.838e-02, -4.116e-02, -8.257e-02, -2.768e-02, -1.725e-01, 2.180e-01, -5.268e-02, -6.686e-02, -1.075e-02, -1.183e-01, -5.245e-02)); + r += mul(s4_4, M4(1.160e-01, -1.089e-01, -5.048e-01, -1.137e-01, 4.091e-01, -3.321e-01, 1.600e-02, -4.297e-01, 2.936e-02, -3.944e-02, 3.683e-02, -7.692e-02, 2.271e-01, -5.484e-03, 1.696e-01, -9.252e-02)); + r += mul(s4_5, M4(5.579e-02, -1.714e-02, 2.592e-01, 4.721e-02, 5.725e-03, -9.406e-02, 5.586e-02, -1.122e-01, 6.267e-02, 1.959e-01, 8.754e-02, -3.318e-02, -3.323e-02, 3.019e-02, 2.118e-02, -9.360e-03)); + r += mul(s4_6, M4(-4.322e-02, -7.796e-02, 3.892e-01, 2.526e-02, -3.016e-02, 8.906e-02, -6.579e-02, 1.023e-01, -1.739e-02, 5.853e-03, -8.500e-02, -8.065e-02, 6.131e-02, 6.489e-02, 8.976e-02, 9.891e-02)); + r += mul(s4_7, M4(8.236e-03, -1.290e-01, 1.230e-01, -4.372e-02, -1.949e-02, -3.142e-01, 1.221e-01, -3.426e-02, 4.860e-02, 2.884e-02, -2.031e-02, 2.863e-02, -1.006e-01, -1.666e-02, 7.729e-02, -4.938e-02)); + r += mul(s4_8, M4(-1.731e-01, -3.786e-02, 3.364e-02, 7.386e-02, 1.000e-01, 1.514e-01, 6.428e-02, 5.606e-02, 2.937e-03, -2.062e-02, -3.646e-02, 1.250e-02, 6.276e-02, 5.917e-02, -4.737e-02, -6.429e-02)); + r += mul(s5_0, M4(-8.829e-03, 6.971e-02, 3.541e-02, 1.809e-02, 1.065e-02, 3.218e-02, -3.046e-02, 2.121e-02, -3.480e-02, -1.838e-02, -1.096e-01, 9.808e-02, 7.617e-02, -9.112e-03, 6.525e-02, -2.143e-02)); + r += mul(s5_1, M4(-7.099e-03, 6.124e-02, 6.715e-02, 8.212e-02, 3.622e-02, 2.778e-02, 7.969e-02, -3.336e-02, 1.245e-01, 1.119e-01, 5.280e-02, -8.330e-02, 1.314e-01, 5.461e-02, 1.524e-01, 4.624e-02)); + r += mul(s5_2, M4(-8.457e-02, -3.261e-02, -5.095e-02, -1.353e-02, 6.270e-03, 5.844e-02, -7.710e-02, 2.764e-03, -2.814e-02, -6.648e-02, -5.475e-02, 3.788e-02, -2.322e-03, 7.006e-02, 4.403e-02, -3.014e-02)); + r += mul(s5_3, M4(1.144e-02, 8.144e-02, 3.215e-02, 3.551e-02, 9.567e-02, 1.714e-02, 5.139e-02, -8.414e-02, -2.402e-02, -9.189e-02, 4.432e-02, -2.306e-03, 6.175e-02, 6.143e-02, -2.534e-02, 6.956e-02)); + r += mul(s5_4, M4(1.330e-02, 5.467e-02, 2.696e-03, 1.003e-01, 1.212e-02, -1.570e-01, -1.143e-01, -1.127e-01, 1.103e-01, -9.396e-02, 3.722e-02, -1.026e-01, 2.694e-01, 9.083e-02, 6.893e-02, 1.128e-01)); + r += mul(s5_5, M4(1.806e-02, 1.141e-02, -3.325e-03, -7.681e-02, -3.333e-02, 2.338e-02, 1.130e-02, -1.251e-01, 1.135e-01, 1.119e-01, 2.687e-01, 1.495e-01, 6.523e-02, 1.089e-01, -5.855e-02, 2.052e-03)); + r += mul(s5_6, M4(-6.760e-02, 8.641e-03, -8.452e-02, -1.880e-02, -3.117e-02, -8.947e-02, -3.013e-02, 2.015e-02, -3.476e-02, 7.563e-02, -4.600e-02, 1.577e-02, 3.989e-02, -9.229e-02, 1.108e-01, -1.162e-02)); + r += mul(s5_7, M4(2.417e-02, -3.430e-02, 1.091e-01, 4.174e-02, -3.418e-02, -1.862e-01, 5.662e-02, -1.414e-02, -6.064e-02, 1.133e-02, -9.183e-02, 4.677e-02, -4.738e-02, -1.836e-02, 1.063e-02, -5.357e-02)); + r += mul(s5_8, M4(-6.421e-02, -4.079e-02, -1.277e-02, -7.411e-02, 3.395e-02, 4.268e-02, 2.553e-02, 1.373e-01, -2.912e-02, 1.767e-03, -1.459e-01, -3.006e-02, 3.724e-02, 3.353e-02, 3.408e-02, 4.427e-02)); + r += mul(s6_0, M4(-4.232e-02, -7.914e-02, -1.564e-03, -1.452e-02, -1.207e-02, -1.994e-02, -1.146e-01, -3.629e-02, 3.144e-02, -1.077e-02, -1.133e-02, 1.898e-03, -2.618e-02, -1.414e-02, 2.598e-02, 1.485e-01)); + r += mul(s6_1, M4(-1.344e-02, -7.809e-02, 1.238e-01, -4.426e-02, -7.205e-02, -4.869e-02, 6.605e-02, 1.397e-01, 1.556e-01, 1.359e-01, 3.377e-02, 3.126e-02, 3.122e-02, 6.361e-02, -9.625e-02, 2.292e-02)); + r += mul(s6_2, M4(2.738e-03, -6.746e-02, -2.412e-02, -1.041e-01, -4.460e-02, -2.827e-02, -2.519e-02, -3.964e-02, -2.333e-04, 7.666e-02, 1.125e-01, 1.630e-01, 2.247e-02, -7.670e-02, -2.341e-03, 9.385e-02)); + r += mul(s6_3, M4(-4.602e-02, 1.061e-01, -1.320e-01, 1.191e-01, -5.133e-02, 2.162e-01, -1.131e-02, -3.731e-02, -7.102e-02, -8.420e-02, 4.596e-02, 4.180e-02, 1.479e-01, -8.129e-02, 2.973e-02, -1.772e-01)); + r += mul(s6_4, M4(5.118e-02, -6.224e-02, -8.713e-03, -2.333e-02, 9.701e-02, 1.313e-01, 2.580e-02, -3.051e-01, 8.869e-02, 7.954e-02, -1.263e-01, 5.000e-02, 1.479e-01, 6.071e-02, 1.515e-01, 1.184e-02)); + r += mul(s6_5, M4(-3.628e-02, -1.571e-04, -2.533e-02, 1.203e-02, -3.362e-02, 1.008e-02, -2.868e-02, -7.585e-02, 2.280e-02, 1.390e-01, -7.603e-02, 9.155e-02, -4.598e-03, 1.854e-02, -3.700e-01, 1.594e-02)); + r += mul(s6_6, M4(7.287e-02, 1.326e-01, 2.261e-01, 6.618e-02, -2.454e-02, 9.443e-02, 9.664e-03, -9.044e-02, 9.658e-02, 1.071e-01, -1.143e-01, -9.359e-02, 2.635e-02, -3.715e-02, -2.057e-01, 1.043e-01)); + r += mul(s6_7, M4(7.176e-02, -1.768e-02, 1.042e-02, -1.732e-01, -1.269e-01, 4.046e-02, 6.187e-02, -2.409e-01, 1.033e-01, 2.011e-02, -1.234e-02, 1.175e-01, -1.142e-02, -2.077e-02, 2.295e-01, 8.248e-02)); + r += mul(s6_8, M4(4.521e-02, -7.314e-02, 1.829e-01, 4.214e-02, 8.360e-02, -1.261e-02, -5.154e-02, -5.521e-03, -3.743e-02, 3.988e-02, -3.584e-02, 1.117e-02, -3.909e-02, -7.878e-03, -5.536e-02, -4.494e-02)); + r += mul(s7_0, M4(2.108e-02, 9.581e-02, -5.059e-02, -8.275e-02, 6.127e-02, 7.517e-02, -2.609e-02, 5.254e-02, 2.820e-02, -2.989e-02, 5.125e-02, -1.002e-01, -9.809e-02, 1.553e-01, 1.773e-01, -1.271e-02)); + r += mul(s7_1, M4(3.650e-02, 1.098e-01, 2.168e-02, -1.848e-01, -9.009e-02, 3.414e-02, -3.631e-02, -3.021e-02, 1.459e-01, 2.078e-01, 6.669e-02, -1.034e-01, -5.624e-02, 1.201e-01, 2.647e-01, -9.297e-02)); + r += mul(s7_2, M4(-1.393e-02, -4.577e-02, -2.512e-02, -3.470e-02, -3.612e-03, -6.107e-02, -2.231e-02, -1.145e-01, 5.848e-02, 6.392e-02, 1.092e-01, 5.121e-02, 3.987e-02, -3.849e-02, 4.369e-02, -1.615e-02)); + r += mul(s7_3, M4(3.431e-02, 1.207e-01, 2.357e-02, 7.447e-02, 1.074e-01, 3.534e-02, 5.660e-02, -5.106e-02, -2.719e-02, -1.355e-01, 1.572e-01, -9.630e-03, 1.186e-01, -1.010e-01, 9.250e-02, 1.751e-02)); + r += mul(s7_4, M4(-4.175e-03, 7.941e-02, -3.054e-02, 6.754e-02, 1.715e-01, 1.252e-01, -3.678e-02, -2.089e-01, 9.548e-02, -2.263e-01, -1.472e-01, 1.701e-01, 1.344e-01, 6.099e-02, -9.534e-02, -1.026e-01)); + r += mul(s7_5, M4(-2.515e-02, -5.992e-02, -6.514e-02, -1.457e-02, -5.400e-03, -8.003e-03, 6.131e-02, 2.058e-03, 2.917e-02, 2.659e-02, 5.068e-02, -4.705e-02, -2.029e-02, 8.965e-02, 5.807e-02, -2.764e-02)); + r += mul(s7_6, M4(1.002e-01, -8.008e-02, 1.664e-01, -3.319e-02, -3.740e-02, -5.018e-02, -7.137e-02, -2.204e-02, 5.796e-02, 5.437e-03, 1.174e-01, 6.421e-02, 1.287e-02, -9.052e-02, 1.385e-01, -9.506e-02)); + r += mul(s7_7, M4(-5.514e-02, 2.037e-02, -1.808e-01, 2.922e-02, 1.873e-02, 6.722e-02, 3.174e-02, -4.081e-02, 1.462e-01, 5.952e-02, -5.291e-02, 1.107e-01, -2.713e-02, -1.114e-01, -1.489e-01, -2.283e-02)); + r += mul(s7_8, M4(-7.015e-02, -3.209e-02, -1.040e-02, -1.341e-01, 2.126e-02, -7.423e-02, -5.012e-02, -5.814e-02, -1.321e-02, -2.905e-02, 1.278e-01, -1.232e-01, -8.702e-02, -8.247e-02, -4.964e-02, -7.967e-02)); + r += V4(1.486e-02, -7.566e-03, 9.998e-03, -3.041e-03); + return r; +} + +V4 f3(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-2.941e-02, -2.434e-02, 3.064e-02, 3.302e-02, 1.836e-02, -5.816e-02, 2.547e-03, 8.317e-03, -4.260e-02, 5.378e-02, -3.433e-02, 1.682e-02, 2.882e-02, -8.481e-02, 4.265e-02, -1.639e-01)); + r += mul(s0_1, M4(-6.492e-05, -8.144e-03, 7.875e-02, 1.499e-01, -3.348e-03, 6.657e-03, -8.380e-02, 1.824e-02, 1.018e-01, 9.654e-02, 1.187e-01, -2.555e-02, -1.917e-02, -6.752e-02, -2.161e-02, 1.374e-01)); + r += mul(s0_2, M4(-8.274e-02, 1.562e-02, 1.319e-02, -9.855e-02, 3.076e-02, 3.649e-02, -7.952e-02, -3.981e-02, -1.685e-01, -1.958e-01, 1.766e-01, -1.922e-01, -3.663e-02, -8.032e-02, -8.093e-02, -2.836e-02)); + r += mul(s0_3, M4(-3.552e-02, 5.147e-02, 6.993e-02, -1.504e-01, 1.389e-01, -1.305e-01, 5.882e-02, -8.144e-02, -2.227e-01, -3.246e-02, -5.250e-02, 9.812e-02, -2.614e-02, 6.418e-02, -2.796e-02, 9.152e-03)); + r += mul(s0_4, M4(-9.613e-02, 6.954e-02, 4.513e-02, 2.010e-02, -4.087e-02, -1.491e-01, -1.704e-01, 7.098e-02, -2.632e-01, 3.257e-02, -1.977e-01, 1.738e-01, -5.193e-02, -5.701e-02, -5.153e-03, 1.801e-02)); + r += mul(s0_5, M4(-2.098e-01, 6.119e-02, 1.018e-02, -8.911e-02, 1.275e-01, -1.889e-02, -3.978e-02, -9.157e-02, -1.794e-01, 1.100e-01, -1.205e-01, 1.971e-02, -8.632e-02, -1.528e-01, -1.608e-01, 2.589e-02)); + r += mul(s0_6, M4(7.168e-02, -6.540e-02, 1.441e-01, -1.025e-01, -5.714e-02, -4.127e-02, -1.118e-01, 1.293e-01, -8.594e-02, -3.036e-03, -9.054e-03, 8.522e-02, -8.144e-02, -7.556e-02, -6.968e-02, -4.779e-02)); + r += mul(s0_7, M4(1.375e-01, 7.936e-02, 2.420e-02, -1.316e-02, 8.160e-02, -4.091e-02, 3.408e-02, 1.206e-01, 2.924e-02, -2.734e-02, -2.835e-02, 2.180e-02, -1.312e-01, 2.011e-02, -9.516e-02, 1.499e-01)); + r += mul(s0_8, M4(6.966e-02, -5.254e-04, 4.887e-02, 2.101e-02, 2.118e-02, -3.386e-02, -5.333e-02, -1.047e-01, 9.082e-02, -8.253e-02, 1.156e-01, -6.557e-02, -2.685e-03, 5.894e-02, -1.469e-01, 6.893e-03)); + r += mul(s1_0, M4(-6.617e-03, 2.358e-03, 5.778e-03, -1.314e-01, -4.964e-02, 4.517e-02, 2.407e-02, 4.159e-02, -3.152e-02, -2.996e-02, -6.864e-02, 8.028e-02, -2.853e-04, 9.098e-03, 3.602e-02, 7.354e-02)); + r += mul(s1_1, M4(7.501e-05, -1.132e-02, -8.446e-02, 7.754e-02, 1.079e-01, 3.431e-02, -4.273e-02, -5.457e-02, -1.149e-02, 9.484e-02, 7.025e-02, 3.203e-02, 6.332e-02, 3.711e-02, -1.046e-01, -1.178e-02)); + r += mul(s1_2, M4(-5.175e-03, -8.121e-02, -4.146e-02, 7.301e-03, 4.025e-02, 1.223e-02, 2.791e-02, 6.913e-02, 1.473e-02, 8.574e-03, 6.186e-02, -6.230e-02, 1.604e-01, 5.132e-02, 4.447e-02, 1.278e-01)); + r += mul(s1_3, M4(4.298e-02, -4.138e-02, 3.455e-02, -1.189e-01, -1.010e-01, -4.456e-02, 7.414e-02, -5.421e-03, -1.060e-01, -2.736e-02, -8.738e-02, 7.068e-02, 1.642e-02, 1.671e-02, -1.072e-02, 1.842e-01)); + r += mul(s1_4, M4(-1.000e-01, -2.205e-02, 2.536e-02, -3.240e-02, -2.124e-01, -2.686e-01, -6.321e-02, -3.527e-02, -4.732e-02, 9.274e-02, -8.798e-02, -1.492e-02, 3.769e-02, -3.042e-02, -4.481e-02, -1.013e-01)); + r += mul(s1_5, M4(1.502e-02, -3.009e-02, -6.098e-02, -3.087e-02, -4.889e-02, 1.041e-01, 1.036e-02, 8.926e-03, -6.989e-02, 2.073e-02, 3.148e-02, -3.322e-02, 8.676e-02, 5.504e-02, -2.828e-02, 1.090e-01)); + r += mul(s1_6, M4(-3.217e-02, -2.251e-02, -1.199e-01, -7.757e-02, -1.901e-02, -1.472e-02, 2.263e-02, 1.015e-02, -8.386e-02, 2.263e-02, 2.092e-02, 1.614e-01, 5.835e-02, -2.891e-02, -3.444e-02, 8.383e-02)); + r += mul(s1_7, M4(7.769e-02, 7.688e-02, 5.715e-02, 5.460e-02, -2.923e-02, -1.379e-02, -6.241e-02, -1.554e-01, -1.097e-01, 5.052e-02, 1.053e-01, -9.672e-02, -8.070e-02, -3.313e-02, 1.447e-01, 7.332e-02)); + r += mul(s1_8, M4(4.008e-02, 2.988e-02, 3.386e-03, 1.049e-01, -1.996e-02, 2.128e-02, -5.514e-02, 5.612e-02, 8.421e-02, -3.584e-02, 2.540e-02, -9.043e-02, 9.265e-02, -3.730e-02, 1.231e-01, 7.827e-02)); + r += mul(s2_0, M4(-2.922e-02, 3.207e-02, 2.187e-02, -1.270e-02, 5.509e-02, 4.332e-02, 3.532e-02, -1.507e-03, 8.765e-02, 2.985e-02, -1.912e-02, 1.365e-01, 1.321e-02, -8.696e-03, -5.703e-02, 9.480e-02)); + r += mul(s2_1, M4(2.217e-02, -1.560e-02, -4.137e-02, -4.427e-02, 2.507e-03, -4.972e-02, -9.183e-02, 6.844e-02, 1.052e-01, 3.160e-02, 7.056e-02, -1.322e-01, 2.606e-02, -7.859e-02, 6.381e-02, -7.867e-02)); + r += mul(s2_2, M4(-3.012e-02, -4.216e-02, 7.229e-02, -9.155e-02, 2.943e-02, -2.606e-03, 3.110e-02, -1.333e-01, 1.004e-01, 1.753e-01, 8.786e-02, 4.076e-02, 3.666e-02, 1.754e-02, -6.180e-03, -2.207e-02)); + r += mul(s2_3, M4(-8.370e-02, 2.884e-02, 8.631e-03, -1.328e-01, -9.496e-02, 2.105e-02, 1.071e-01, 3.868e-02, 1.920e-02, 6.074e-02, 6.057e-02, -1.481e-02, -1.764e-02, 3.089e-02, 4.285e-02, 2.929e-03)); + r += mul(s2_4, M4(5.171e-02, -2.145e-01, 1.069e-01, 1.768e-01, -3.950e-02, -4.857e-02, 1.101e-01, -8.912e-02, 2.121e-02, -1.057e-01, 1.876e-01, -3.850e-02, -6.895e-02, -1.441e-01, 7.299e-02, -1.498e-01)); + r += mul(s2_5, M4(-1.724e-02, 7.455e-02, -1.210e-01, 5.442e-02, 3.774e-02, 1.450e-01, 3.625e-02, -6.742e-02, 1.074e-01, 1.191e-01, 1.185e-01, 8.685e-02, -3.812e-02, 2.477e-02, 5.426e-02, 3.321e-02)); + r += mul(s2_6, M4(-8.299e-02, 9.370e-02, -1.897e-03, 3.656e-02, 5.494e-02, -1.649e-02, 2.368e-02, 2.402e-01, 2.794e-02, -6.437e-02, -4.304e-02, -2.421e-02, -6.197e-03, -1.259e-02, 4.286e-05, 5.580e-03)); + r += mul(s2_7, M4(9.556e-02, -4.561e-02, -5.381e-02, -7.346e-02, -5.055e-02, 4.323e-02, -5.527e-02, 6.885e-02, -1.879e-03, 9.991e-03, 1.194e-01, -1.043e-01, -1.687e-01, -6.391e-02, 8.169e-02, -1.353e-01)); + r += mul(s2_8, M4(8.130e-03, -4.097e-02, 6.273e-02, 1.351e-02, -1.246e-02, 5.399e-02, -2.276e-01, 1.029e-01, 4.988e-02, 5.196e-02, -6.267e-02, 8.859e-02, -3.213e-02, 1.041e-02, -3.953e-02, 7.868e-02)); + r += mul(s3_0, M4(4.746e-02, 1.205e-02, -1.137e-01, -5.023e-02, 5.604e-02, -3.252e-02, -1.373e-02, -8.422e-02, 4.960e-02, -5.724e-02, 7.550e-02, -3.787e-02, -8.279e-03, 8.360e-03, 8.743e-02, -6.190e-02)); + r += mul(s3_1, M4(-2.924e-01, -8.317e-02, -2.259e-01, 7.349e-03, -5.453e-02, -7.694e-02, -1.276e-02, 1.190e-01, 6.733e-02, -8.522e-02, 4.811e-02, -2.259e-01, 2.148e-02, -1.042e-01, 2.048e-01, 1.342e-01)); + r += mul(s3_2, M4(3.738e-02, 7.917e-02, -4.409e-02, 2.271e-02, 3.073e-02, 2.148e-02, -5.104e-02, -1.077e-01, 3.773e-03, 2.199e-01, 4.947e-02, 9.371e-02, -1.079e-01, -7.741e-02, -9.130e-02, -1.159e-01)); + r += mul(s3_3, M4(1.659e-01, 1.031e-01, 1.433e-02, 7.288e-02, 1.501e-02, -4.722e-02, 3.735e-02, -1.021e-02, 1.170e-02, 3.726e-02, -2.700e-02, 1.136e-02, -2.785e-03, -1.009e-02, 2.770e-02, -1.443e-01)); + r += mul(s3_4, M4(3.255e-02, -1.812e-01, 1.272e-01, 3.350e-01, -8.198e-02, 3.625e-02, 1.054e-01, -1.767e-02, 9.021e-02, 1.111e-01, 3.447e-02, -3.343e-02, 3.322e-02, 4.625e-03, -8.646e-02, -8.394e-02)); + r += mul(s3_5, M4(1.526e-01, 1.363e-01, -9.677e-02, -5.682e-02, -4.038e-02, -7.338e-02, 8.752e-03, -6.069e-02, 1.428e-01, 2.273e-02, 1.126e-04, 1.274e-01, 7.145e-02, -2.907e-02, -2.007e-01, 3.065e-02)); + r += mul(s3_6, M4(-2.294e-02, 1.287e-01, -1.624e-02, 2.358e-01, -2.306e-02, -4.672e-02, -4.526e-02, -1.324e-01, 5.202e-02, -1.641e-01, -1.009e-01, -3.234e-02, -4.125e-02, 2.795e-02, -1.845e-01, -4.797e-02)); + r += mul(s3_7, M4(5.458e-02, -4.348e-02, 5.484e-03, -7.000e-02, -1.933e-01, -3.845e-02, 9.439e-02, 1.540e-01, -2.157e-02, -6.742e-02, -4.266e-03, -6.691e-02, -1.698e-02, -9.325e-02, -1.731e-01, 8.950e-02)); + r += mul(s3_8, M4(4.234e-02, 1.992e-02, 4.979e-02, 8.673e-02, -7.786e-02, -3.021e-02, -1.684e-01, -6.725e-02, 9.105e-02, -7.153e-02, 2.010e-02, -3.460e-02, 1.903e-02, 2.604e-02, 2.235e-03, 3.280e-02)); + r += mul(s4_0, M4(-1.972e-02, 2.761e-02, -3.976e-02, 6.334e-03, -1.171e-02, -2.757e-02, 8.276e-02, -2.144e-02, 3.288e-02, 4.816e-02, 5.422e-02, -4.026e-02, 3.477e-02, -7.479e-02, 1.246e-01, -3.651e-02)); + r += mul(s4_1, M4(-3.185e-02, 1.588e-01, -9.285e-02, -2.698e-01, 9.317e-02, -4.110e-02, 7.298e-02, -2.632e-04, -2.814e-03, 2.064e-01, -2.521e-02, -7.196e-03, -1.124e-01, -4.184e-02, -6.549e-02, -1.707e-02)); + r += mul(s4_2, M4(9.104e-02, 1.520e-01, -1.255e-01, -9.692e-03, 6.623e-02, -4.432e-02, -1.353e-01, -7.303e-02, -9.051e-02, 9.743e-02, -2.979e-04, 1.306e-01, -2.737e-02, 2.494e-02, -1.054e-01, 8.342e-03)); + r += mul(s4_3, M4(1.346e-02, 2.161e-01, 8.065e-02, 7.728e-02, 5.731e-02, -1.770e-01, -1.715e-02, 3.805e-02, 4.969e-02, 1.818e-02, -5.811e-02, 7.452e-02, 3.335e-03, 4.923e-02, 1.136e-01, -1.628e-01)); + r += mul(s4_4, M4(2.199e-01, 9.253e-02, -4.181e-02, -6.793e-02, -1.518e-01, -2.418e-01, 6.812e-02, 4.592e-01, 4.662e-02, 1.026e-01, 3.776e-03, 6.055e-02, -2.150e-01, -1.610e-01, 2.031e-02, -9.005e-02)); + r += mul(s4_5, M4(9.640e-02, -1.482e-03, 3.158e-02, 2.938e-01, -8.727e-02, -1.316e-01, -3.092e-02, -1.496e-01, -5.053e-02, 1.870e-01, -1.285e-01, -1.277e-02, -5.118e-02, -1.790e-02, -2.986e-02, 9.309e-02)); + r += mul(s4_6, M4(-7.843e-03, -3.903e-02, -6.224e-02, 1.617e-01, 7.246e-02, 6.096e-02, -1.730e-02, -1.947e-01, -6.006e-02, -5.627e-02, -5.049e-03, 7.108e-02, -1.217e-02, 3.679e-02, 3.234e-02, -1.250e-02)); + r += mul(s4_7, M4(8.958e-02, 1.249e-01, 8.882e-02, -1.415e-02, 5.857e-02, -4.284e-03, 4.301e-04, 1.450e-01, 3.354e-02, 5.289e-02, -1.237e-01, 1.296e-02, -3.919e-02, -3.139e-04, -1.332e-02, 1.314e-02)); + r += mul(s4_8, M4(-6.471e-02, -4.788e-02, -2.585e-02, -5.434e-02, -4.475e-02, -3.525e-03, -5.352e-02, -1.057e-01, 8.034e-02, 7.279e-02, -6.442e-03, 6.861e-02, -2.375e-02, 1.316e-02, -4.083e-02, 1.011e-01)); + r += mul(s5_0, M4(1.985e-02, 3.916e-02, 3.798e-02, -1.692e-02, 6.397e-03, -1.355e-02, -2.031e-02, -2.817e-02, -6.168e-02, -4.464e-02, -5.530e-02, -1.036e-02, -9.005e-03, -5.387e-02, 1.100e-02, -4.647e-03)); + r += mul(s5_1, M4(-2.538e-02, 3.361e-02, 4.501e-02, 8.380e-02, -2.978e-02, 4.141e-03, 2.197e-02, 5.906e-04, -1.235e-01, -4.108e-02, -2.486e-02, 9.339e-02, -2.567e-02, -4.833e-02, -1.186e-01, -6.430e-02)); + r += mul(s5_2, M4(-8.502e-03, -6.589e-03, -2.242e-02, -7.214e-02, 2.742e-02, -5.241e-04, -1.054e-01, -2.671e-02, 3.098e-03, 1.298e-01, 5.643e-02, 1.503e-02, -1.707e-02, 3.305e-02, -9.092e-03, -1.961e-02)); + r += mul(s5_3, M4(7.064e-02, 3.020e-02, -4.359e-02, 1.923e-03, 2.287e-02, -5.756e-02, -1.084e-01, 6.016e-02, 3.864e-02, -4.458e-02, 1.514e-03, -3.369e-02, 5.824e-02, 4.178e-02, 5.598e-02, -2.114e-01)); + r += mul(s5_4, M4(3.226e-02, 1.058e-01, -1.451e-01, 8.814e-02, -2.822e-02, -6.766e-02, 1.211e-01, 2.170e-01, -9.701e-02, -5.907e-02, 6.719e-02, 1.080e-01, 1.558e-01, -1.136e-01, -2.143e-02, 2.146e-02)); + r += mul(s5_5, M4(-4.396e-02, -6.496e-02, -1.304e-01, 1.161e-02, -2.445e-03, -2.884e-02, -8.961e-02, -1.887e-02, 2.963e-02, 1.861e-01, -1.455e-02, -1.838e-02, 8.519e-02, -6.405e-02, 4.370e-03, -2.149e-02)); + r += mul(s5_6, M4(-5.832e-02, 2.541e-02, -2.242e-02, 5.767e-02, 7.318e-02, 3.783e-03, -1.337e-02, -4.162e-02, -3.102e-02, -3.865e-02, -1.660e-02, -1.414e-02, 3.334e-02, 5.308e-02, -2.364e-02, -1.214e-01)); + r += mul(s5_7, M4(1.185e-01, 4.647e-02, 1.327e-02, 1.248e-02, -5.879e-03, -7.769e-02, 3.028e-02, 1.912e-01, -5.491e-02, 4.429e-02, -1.218e-01, -3.657e-02, 1.110e-01, 3.904e-02, -1.309e-01, 3.424e-02)); + r += mul(s5_8, M4(7.027e-02, -5.632e-02, 3.849e-02, -1.103e-01, 7.069e-02, 4.495e-02, 6.745e-02, -4.776e-02, -4.377e-02, -1.048e-02, 5.689e-02, -1.101e-01, -7.026e-02, -1.670e-02, -4.685e-03, 2.207e-03)); + r += mul(s6_0, M4(-7.398e-03, 7.106e-02, 7.153e-02, -1.247e-01, -1.109e-02, -3.335e-02, -5.528e-02, 1.849e-01, -4.156e-02, -3.664e-02, -8.374e-03, 6.961e-03, 8.130e-03, -1.577e-02, 1.137e-01, -3.156e-02)); + r += mul(s6_1, M4(1.129e-01, -1.189e-01, 4.488e-02, -7.788e-02, 8.643e-02, 1.837e-01, -1.265e-01, -5.615e-02, -6.547e-02, -1.769e-02, -9.807e-02, -8.365e-02, -5.531e-02, -6.001e-02, -6.394e-03, -1.411e-02)); + r += mul(s6_2, M4(4.292e-02, -1.760e-02, -3.858e-02, -1.170e-01, 4.675e-03, 1.659e-01, -1.608e-01, 1.794e-01, -5.545e-02, -1.435e-02, 3.114e-03, 5.590e-03, -2.390e-02, 1.322e-01, 4.663e-02, 8.771e-02)); + r += mul(s6_3, M4(1.761e-02, 1.445e-02, -6.184e-03, -2.207e-02, -1.204e-01, -4.987e-03, -1.052e-01, 1.484e-01, 1.165e-01, 9.513e-03, -1.542e-02, 7.135e-02, -8.224e-03, -9.027e-02, -2.602e-02, -6.959e-02)); + r += mul(s6_4, M4(9.770e-02, 3.180e-02, -1.041e-01, -1.179e-01, -2.815e-01, -1.230e-02, -2.789e-01, 3.166e-02, -6.205e-02, -8.654e-02, -3.476e-02, 1.611e-01, -1.815e-01, -2.143e-01, 2.580e-02, -2.844e-01)); + r += mul(s6_5, M4(-8.180e-02, -7.580e-02, -4.291e-02, -1.427e-01, 5.695e-02, 9.596e-02, -2.144e-01, 2.188e-01, -1.982e-02, 7.858e-02, 8.475e-02, 1.514e-01, -8.808e-02, 1.089e-01, -4.070e-02, 4.048e-02)); + r += mul(s6_6, M4(-5.352e-02, 5.043e-03, 6.957e-02, 1.354e-01, -1.226e-01, 7.943e-03, -3.156e-01, 1.567e-01, -3.719e-02, 9.156e-03, -1.380e-02, 1.031e-02, 1.340e-01, -5.385e-02, 1.223e-01, -4.012e-02)); + r += mul(s6_7, M4(1.955e-01, -5.829e-02, -8.694e-03, -1.059e-02, -1.216e-01, -3.718e-02, 1.009e-01, -8.280e-02, -3.044e-02, 8.333e-02, -2.832e-02, 1.731e-02, -2.077e-02, -4.440e-02, 7.065e-02, -1.658e-02)); + r += mul(s6_8, M4(-6.162e-02, 3.611e-02, 4.474e-02, -6.702e-02, 4.254e-02, 7.628e-02, -8.461e-02, 1.893e-01, 1.412e-01, -7.279e-03, -1.031e-01, 1.474e-01, 9.579e-03, 3.764e-02, 3.468e-02, 1.618e-02)); + r += mul(s7_0, M4(-6.511e-03, 5.876e-02, -3.252e-02, 1.532e-02, 1.296e-02, 1.271e-02, 3.561e-02, -2.071e-01, -1.077e-03, 4.308e-03, 4.691e-02, -3.955e-02, -1.679e-02, 4.783e-02, 4.004e-02, -5.206e-02)); + r += mul(s7_1, M4(-5.695e-02, -8.795e-03, -1.695e-01, 6.811e-03, 1.029e-01, 1.873e-01, 1.672e-01, -1.096e-01, 2.623e-02, 2.085e-02, -2.169e-02, -1.332e-01, -4.755e-02, 1.629e-01, -4.913e-03, 7.361e-02)); + r += mul(s7_2, M4(-4.002e-02, -1.634e-02, -5.634e-03, 2.352e-02, -1.252e-02, -1.325e-01, 6.089e-02, -1.321e-02, -3.389e-02, 6.810e-03, 3.805e-02, 6.999e-02, -2.533e-02, 2.231e-02, -1.077e-01, -2.867e-02)); + r += mul(s7_3, M4(5.882e-02, -1.398e-02, 9.710e-02, 1.346e-01, 7.443e-02, 1.350e-02, 2.343e-01, -7.184e-02, 3.826e-02, 9.868e-02, 6.762e-02, -3.686e-03, -3.982e-02, 1.061e-01, -3.359e-03, 8.183e-02)); + r += mul(s7_4, M4(-3.034e-02, 1.242e-01, 2.341e-02, 1.437e-01, -4.342e-02, -1.100e-01, 5.104e-02, 1.598e-01, -1.597e-01, -9.473e-02, 2.654e-01, 9.261e-02, 1.447e-01, 4.627e-02, -3.673e-03, 1.930e-01)); + r += mul(s7_5, M4(5.936e-03, -3.868e-02, -4.165e-02, 5.440e-02, 1.597e-02, 5.686e-02, 1.738e-02, 4.651e-02, -1.686e-01, 3.454e-02, -4.771e-02, 1.642e-01, 2.743e-02, 1.034e-01, 1.139e-01, -7.928e-02)); + r += mul(s7_6, M4(-6.469e-02, -2.850e-02, 1.345e-02, 8.227e-02, 4.457e-02, -7.836e-02, -3.138e-02, -9.617e-02, 9.191e-02, -2.904e-02, -1.003e-02, 1.651e-02, 9.393e-03, -6.901e-02, -4.156e-02, 5.873e-02)); + r += mul(s7_7, M4(-1.520e-01, 1.625e-02, -1.396e-01, -4.198e-02, -4.981e-02, -3.990e-02, -7.033e-04, -2.569e-02, 5.678e-02, 4.969e-02, 1.535e-02, -9.080e-02, 1.120e-01, -1.128e-02, -7.185e-02, 8.777e-02)); + r += mul(s7_8, M4(-5.642e-02, -5.412e-04, -9.692e-02, -1.431e-01, -2.732e-02, 2.014e-03, 4.999e-02, 7.397e-03, 1.207e-01, 3.546e-02, -5.119e-02, 1.183e-01, -4.234e-02, 6.823e-05, 7.049e-02, -1.245e-01)); + r += V4(7.978e-02, 1.297e-02, 1.591e-02, 3.718e-02); + return r; +} + +void Pass12(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = Rmp8x8(tid.x) + blockStart; + uint2 size = GetInputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = (gxy + 0.5) * pt; + + V4 s0_0 = l0(-1.0, -1.0); + V4 s0_1 = l0(0.0, -1.0); + V4 s0_2 = l0(1.0, -1.0); + V4 s0_3 = l0(-1.0, 0.0); + V4 s0_4 = l0(0.0, 0.0); + V4 s0_5 = l0(1.0, 0.0); + V4 s0_6 = l0(-1.0, 1.0); + V4 s0_7 = l0(0.0, 1.0); + V4 s0_8 = l0(1.0, 1.0); + V4 s1_0 = -max(-s0_0, 0.0); + V4 s1_1 = -max(-s0_1, 0.0); + V4 s1_2 = -max(-s0_2, 0.0); + V4 s1_3 = -max(-s0_3, 0.0); + V4 s1_4 = -max(-s0_4, 0.0); + V4 s1_5 = -max(-s0_5, 0.0); + V4 s1_6 = -max(-s0_6, 0.0); + V4 s1_7 = -max(-s0_7, 0.0); + V4 s1_8 = -max(-s0_8, 0.0); + s0_0 = max(s0_0, 0.0); + s0_1 = max(s0_1, 0.0); + s0_2 = max(s0_2, 0.0); + s0_3 = max(s0_3, 0.0); + s0_4 = max(s0_4, 0.0); + s0_5 = max(s0_5, 0.0); + s0_6 = max(s0_6, 0.0); + s0_7 = max(s0_7, 0.0); + s0_8 = max(s0_8, 0.0); + + V4 s2_0 = l1(-1.0, -1.0); + V4 s2_1 = l1(0.0, -1.0); + V4 s2_2 = l1(1.0, -1.0); + V4 s2_3 = l1(-1.0, 0.0); + V4 s2_4 = l1(0.0, 0.0); + V4 s2_5 = l1(1.0, 0.0); + V4 s2_6 = l1(-1.0, 1.0); + V4 s2_7 = l1(0.0, 1.0); + V4 s2_8 = l1(1.0, 1.0); + V4 s3_0 = -max(-s2_0, 0.0); + V4 s3_1 = -max(-s2_1, 0.0); + V4 s3_2 = -max(-s2_2, 0.0); + V4 s3_3 = -max(-s2_3, 0.0); + V4 s3_4 = -max(-s2_4, 0.0); + V4 s3_5 = -max(-s2_5, 0.0); + V4 s3_6 = -max(-s2_6, 0.0); + V4 s3_7 = -max(-s2_7, 0.0); + V4 s3_8 = -max(-s2_8, 0.0); + s2_0 = max(s2_0, 0.0); + s2_1 = max(s2_1, 0.0); + s2_2 = max(s2_2, 0.0); + s2_3 = max(s2_3, 0.0); + s2_4 = max(s2_4, 0.0); + s2_5 = max(s2_5, 0.0); + s2_6 = max(s2_6, 0.0); + s2_7 = max(s2_7, 0.0); + s2_8 = max(s2_8, 0.0); + + V4 s4_0 = l2(-1.0, -1.0); + V4 s4_1 = l2(0.0, -1.0); + V4 s4_2 = l2(1.0, -1.0); + V4 s4_3 = l2(-1.0, 0.0); + V4 s4_4 = l2(0.0, 0.0); + V4 s4_5 = l2(1.0, 0.0); + V4 s4_6 = l2(-1.0, 1.0); + V4 s4_7 = l2(0.0, 1.0); + V4 s4_8 = l2(1.0, 1.0); + V4 s5_0 = -max(-s4_0, 0.0); + V4 s5_1 = -max(-s4_1, 0.0); + V4 s5_2 = -max(-s4_2, 0.0); + V4 s5_3 = -max(-s4_3, 0.0); + V4 s5_4 = -max(-s4_4, 0.0); + V4 s5_5 = -max(-s4_5, 0.0); + V4 s5_6 = -max(-s4_6, 0.0); + V4 s5_7 = -max(-s4_7, 0.0); + V4 s5_8 = -max(-s4_8, 0.0); + s4_0 = max(s4_0, 0.0); + s4_1 = max(s4_1, 0.0); + s4_2 = max(s4_2, 0.0); + s4_3 = max(s4_3, 0.0); + s4_4 = max(s4_4, 0.0); + s4_5 = max(s4_5, 0.0); + s4_6 = max(s4_6, 0.0); + s4_7 = max(s4_7, 0.0); + s4_8 = max(s4_8, 0.0); + + V4 s6_0 = l3(-1.0, -1.0); + V4 s6_1 = l3(0.0, -1.0); + V4 s6_2 = l3(1.0, -1.0); + V4 s6_3 = l3(-1.0, 0.0); + V4 s6_4 = l3(0.0, 0.0); + V4 s6_5 = l3(1.0, 0.0); + V4 s6_6 = l3(-1.0, 1.0); + V4 s6_7 = l3(0.0, 1.0); + V4 s6_8 = l3(1.0, 1.0); + V4 s7_0 = -max(-s6_0, 0.0); + V4 s7_1 = -max(-s6_1, 0.0); + V4 s7_2 = -max(-s6_2, 0.0); + V4 s7_3 = -max(-s6_3, 0.0); + V4 s7_4 = -max(-s6_4, 0.0); + V4 s7_5 = -max(-s6_5, 0.0); + V4 s7_6 = -max(-s6_6, 0.0); + V4 s7_7 = -max(-s6_7, 0.0); + V4 s7_8 = -max(-s6_8, 0.0); + s6_0 = max(s6_0, 0.0); + s6_1 = max(s6_1, 0.0); + s6_2 = max(s6_2, 0.0); + s6_3 = max(s6_3, 0.0); + s6_4 = max(s6_4, 0.0); + s6_5 = max(s6_5, 0.0); + s6_6 = max(s6_6, 0.0); + s6_7 = max(s6_7, 0.0); + s6_8 = max(s6_8, 0.0); + + t4[gxy] = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t5[gxy] = f1(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t6[gxy] = f2(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t7[gxy] = f3(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); +} + +//!PASS 13 +//!DESC conv12 +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 +//!IN t4, t5, t6, t7 +//!OUT t0, t1, t2, t3 + +#define l0(x, y) V4(O(t4, float2(x, y))) +#define l1(x, y) V4(O(t5, float2(x, y))) +#define l2(x, y) V4(O(t6, float2(x, y))) +#define l3(x, y) V4(O(t7, float2(x, y))) + +V4 f0(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-2.727e-02, 1.860e-02, -4.458e-03, -5.726e-03, -1.577e-01, -4.286e-02, 6.106e-02, -1.690e-02, 8.294e-02, 5.488e-02, -1.047e-01, 1.538e-01, 8.408e-02, -1.312e-01, -3.116e-02, -2.641e-02)); + r += mul(s0_1, M4(2.394e-02, -5.627e-02, 6.819e-03, -9.615e-02, -9.697e-02, 6.977e-02, 7.691e-02, 1.391e-02, 2.159e-01, -6.007e-02, 4.664e-02, 1.180e-01, -4.526e-03, -4.731e-02, -4.678e-02, 1.449e-01)); + r += mul(s0_2, M4(-3.139e-02, -4.410e-04, 7.677e-03, -5.838e-02, 2.037e-02, 3.019e-03, -5.542e-02, 1.924e-02, 1.627e-01, -6.640e-02, 1.498e-02, -6.856e-03, 1.605e-02, 7.046e-03, 2.963e-02, 1.696e-02)); + r += mul(s0_3, M4(-1.782e-02, -1.719e-02, -7.225e-02, 1.626e-01, -7.848e-03, 6.311e-03, 1.660e-01, -9.640e-02, 1.901e-01, 1.536e-01, -8.131e-02, 1.568e-01, 6.787e-02, -2.616e-01, -1.657e-01, -1.217e-01)); + r += mul(s0_4, M4(2.402e-02, -5.180e-02, 3.238e-01, 5.130e-02, -1.186e-01, -3.297e-02, 3.518e-02, -8.813e-02, -1.821e-01, 2.735e-03, -2.272e-02, -1.587e-01, 6.347e-04, -4.115e-01, 8.288e-02, -1.711e-01)); + r += mul(s0_5, M4(-4.711e-02, 5.101e-02, 4.590e-02, 1.843e-02, -4.606e-02, -5.505e-02, 1.978e-02, -9.190e-02, -5.407e-02, -6.751e-02, 6.788e-02, -1.819e-01, -3.097e-02, 5.234e-02, 2.505e-02, -1.620e-02)); + r += mul(s0_6, M4(-8.327e-02, 3.394e-02, -2.762e-02, -1.267e-02, -3.118e-02, -4.203e-02, -1.915e-02, -2.694e-02, 4.255e-02, 9.391e-02, -8.181e-02, 8.793e-02, -2.567e-02, -1.241e-01, -3.868e-02, 4.641e-03)); + r += mul(s0_7, M4(-1.265e-01, -1.142e-02, 3.078e-02, -5.078e-02, -4.318e-02, 2.410e-02, -4.860e-02, -1.372e-01, 8.228e-03, 5.283e-02, -1.799e-02, -1.085e-01, -1.308e-02, -1.410e-01, 4.549e-03, -7.541e-02)); + r += mul(s0_8, M4(-1.404e-01, -1.130e-01, 1.942e-02, -8.287e-02, 2.416e-02, -1.117e-03, 3.450e-02, -1.568e-01, -2.204e-02, -3.736e-02, -2.581e-02, -6.577e-02, 2.257e-02, -4.211e-02, -9.675e-03, 7.848e-03)); + r += mul(s1_0, M4(-1.753e-02, -1.061e-01, -1.941e-02, -3.498e-02, 3.414e-03, -2.544e-03, 7.220e-02, -5.898e-02, -5.010e-02, -7.170e-02, -4.184e-02, 1.056e-01, -3.951e-02, 7.392e-02, 3.164e-02, 6.455e-03)); + r += mul(s1_1, M4(2.132e-02, -5.912e-02, 2.541e-02, -2.657e-02, -2.691e-02, 3.691e-02, 1.310e-01, -9.893e-03, 9.223e-02, -1.409e-02, -1.525e-04, 2.587e-02, -2.021e-02, 4.569e-02, -3.204e-03, -1.490e-02)); + r += mul(s1_2, M4(1.962e-02, 2.759e-03, -7.012e-03, -8.703e-02, 2.837e-02, 3.851e-02, -6.665e-02, 6.604e-03, -5.036e-02, -1.401e-01, 4.164e-02, -8.759e-03, 8.031e-02, -5.369e-03, 5.276e-02, 3.227e-02)); + r += mul(s1_3, M4(1.417e-01, -1.105e-01, -9.827e-03, 1.260e-01, 5.429e-02, -2.316e-02, 1.919e-01, -6.179e-02, -1.329e-02, -2.445e-02, -8.840e-02, -1.849e-02, 1.295e-02, -2.922e-03, 1.952e-02, 1.974e-02)); + r += mul(s1_4, M4(1.472e-01, 6.149e-02, 3.121e-01, 9.670e-02, -2.147e-01, 1.758e-01, 3.195e-02, -2.337e-01, -1.342e-01, -1.795e-01, -1.035e-01, -1.530e-01, -8.237e-02, -2.517e-02, 1.130e-01, 4.597e-03)); + r += mul(s1_5, M4(1.694e-01, -3.804e-02, 1.006e-02, 9.050e-03, 5.036e-03, -1.017e-01, -1.326e-02, -6.292e-02, -4.628e-02, 3.079e-02, 1.096e-01, -4.227e-02, 4.572e-02, -3.040e-03, 3.162e-03, -1.087e-01)); + r += mul(s1_6, M4(8.446e-02, -7.063e-02, -5.259e-02, -4.093e-02, -2.239e-04, -6.035e-02, 3.502e-02, -4.368e-02, 5.139e-02, -2.759e-03, -5.726e-03, -4.317e-02, -5.761e-02, -1.266e-01, 1.389e-02, -4.611e-02)); + r += mul(s1_7, M4(-3.608e-03, 4.023e-02, 1.596e-01, 4.010e-02, -1.215e-01, 1.654e-01, 2.359e-02, -2.235e-02, 1.056e-02, -1.449e-02, 5.011e-02, -4.273e-02, -4.232e-02, 4.341e-02, 1.237e-02, -3.922e-02)); + r += mul(s1_8, M4(3.516e-02, -2.109e-01, 3.301e-02, -3.649e-02, 6.930e-02, -2.073e-02, -1.740e-02, -8.705e-02, -9.455e-02, -3.697e-02, -2.815e-03, -8.541e-02, 3.530e-02, -2.403e-02, -8.748e-03, 1.030e-02)); + r += mul(s2_0, M4(2.361e-03, -3.106e-02, -2.550e-02, -6.701e-03, 4.618e-02, -1.025e-02, -4.397e-02, -3.041e-02, -4.155e-02, 1.014e-01, 1.181e-02, -8.906e-02, 1.174e-02, -3.898e-02, -4.353e-02, 3.231e-03)); + r += mul(s2_1, M4(7.291e-02, -8.222e-03, 2.432e-02, -9.432e-02, -6.975e-03, 1.698e-02, 6.933e-02, -6.820e-02, 1.979e-03, 9.689e-02, -6.392e-02, 6.149e-02, 9.482e-02, -1.486e-02, 1.717e-02, -6.117e-02)); + r += mul(s2_2, M4(1.253e-02, 9.987e-02, 1.337e-02, -2.675e-02, 8.067e-02, -1.307e-02, -7.607e-02, 3.150e-02, 5.124e-02, -9.682e-02, 3.614e-02, 6.068e-02, -1.912e-02, 9.636e-02, 1.016e-01, -6.173e-02)); + r += mul(s2_3, M4(3.080e-02, 8.748e-03, 4.271e-02, 1.727e-02, 1.344e-01, 3.503e-03, 2.901e-02, 5.350e-02, 1.002e-01, -6.725e-02, 5.393e-02, 8.506e-02, 6.896e-02, -4.581e-03, -2.349e-02, 5.707e-02)); + r += mul(s2_4, M4(8.581e-03, 3.780e-02, -3.451e-02, 7.881e-03, 3.311e-02, -4.575e-03, -1.255e-01, -1.687e-01, 6.803e-03, 1.502e-01, 1.383e-01, 1.094e-01, -3.518e-02, 1.349e-01, -9.125e-02, 4.415e-02)); + r += mul(s2_5, M4(-3.615e-02, -1.587e-01, 2.283e-02, 4.116e-02, 3.003e-02, -3.900e-03, 5.371e-02, 1.825e-02, 1.142e-02, 3.305e-02, -2.310e-02, 1.300e-02, -1.215e-01, -3.361e-02, 1.091e-01, -1.498e-02)); + r += mul(s2_6, M4(-5.844e-02, -2.646e-02, 1.989e-03, -1.116e-01, -6.720e-03, -3.411e-02, 6.304e-02, -3.175e-02, 7.671e-02, -8.020e-02, -3.955e-02, -3.694e-02, 3.225e-02, -7.695e-03, -4.875e-02, 3.363e-02)); + r += mul(s2_7, M4(4.558e-02, -8.029e-02, -6.802e-02, -6.150e-03, -2.910e-02, 6.603e-02, -6.762e-02, 1.363e-02, -2.614e-02, 1.409e-01, 1.719e-01, 5.272e-02, 3.533e-02, 2.433e-02, 5.292e-04, -1.978e-02)); + r += mul(s2_8, M4(-4.681e-02, -2.284e-03, 2.970e-02, 1.770e-02, -6.477e-02, -2.109e-02, -1.928e-02, 3.776e-02, -5.004e-02, -6.337e-02, 1.841e-02, -7.409e-02, 2.241e-02, -1.198e-02, -3.168e-02, 4.554e-02)); + r += mul(s3_0, M4(-1.284e-01, -1.481e-02, 2.644e-02, -4.418e-02, -3.164e-02, -1.110e-02, -1.029e-01, -8.182e-02, 7.835e-02, -8.458e-02, -5.275e-03, 5.095e-02, 1.407e-01, 1.449e-03, 2.904e-02, 1.161e-02)); + r += mul(s3_1, M4(9.676e-02, -5.340e-03, 5.016e-03, -3.486e-02, -2.752e-02, 4.908e-02, 9.737e-02, 1.105e-01, -1.245e-02, 9.282e-02, -3.309e-02, -4.545e-03, -1.213e-01, 3.467e-01, 1.786e-01, 1.421e-02)); + r += mul(s3_2, M4(-4.647e-03, -1.704e-02, 1.311e-02, 6.546e-02, -1.045e-01, -9.303e-02, 2.685e-02, -2.411e-01, 1.881e-02, -4.017e-02, -3.385e-02, 7.156e-02, -3.419e-02, 3.292e-02, -1.625e-01, -4.494e-02)); + r += mul(s3_3, M4(-7.864e-02, 2.998e-02, 2.436e-01, 4.854e-02, -1.240e-01, 1.856e-01, -2.961e-02, 1.470e-01, 4.504e-02, 3.820e-02, -5.622e-03, 4.088e-02, -2.922e-02, -1.591e-01, 2.946e-02, 6.375e-02)); + r += mul(s3_4, M4(8.610e-03, 2.178e-01, -1.730e-02, 1.876e-01, 1.427e-01, -1.139e-01, -1.017e-01, -1.174e-01, -6.733e-02, 6.476e-02, 2.005e-01, -8.975e-02, -3.286e-01, 4.354e-02, -6.958e-02, 2.841e-01)); + r += mul(s3_5, M4(-7.768e-02, -7.174e-02, 1.144e-02, 2.104e-04, -4.001e-02, -6.212e-02, 2.774e-02, -1.382e-01, -2.531e-02, -4.546e-02, -2.461e-02, 4.117e-02, -1.225e-01, -2.037e-01, 1.509e-01, -1.360e-01)); + r += mul(s3_6, M4(-9.252e-02, -1.613e-01, 1.242e-01, -1.272e-02, 4.808e-02, 8.239e-02, 2.337e-02, 1.347e-01, 8.926e-02, 3.812e-03, -1.770e-02, 3.758e-03, -1.071e-01, -1.821e-02, -7.877e-02, 2.461e-02)); + r += mul(s3_7, M4(-1.637e-02, -2.741e-02, -5.856e-02, -8.586e-02, 1.410e-01, -1.654e-01, -1.053e-01, 1.232e-02, 5.715e-02, 4.892e-02, 4.200e-03, -8.125e-02, 5.374e-03, 1.650e-02, -7.558e-02, -2.371e-02)); + r += mul(s3_8, M4(-7.801e-03, -4.560e-02, 2.301e-02, 1.503e-02, -5.623e-02, -1.960e-02, 5.290e-03, -5.354e-02, 1.856e-03, 7.829e-02, -1.709e-02, -8.791e-02, -5.414e-02, -1.351e-01, 1.224e-02, 1.740e-01)); + r += mul(s4_0, M4(1.194e-01, -2.520e-02, -1.475e-02, 7.062e-02, -4.557e-02, 5.231e-03, 1.203e-01, -8.481e-02, -1.178e-01, -1.132e-04, 1.303e-01, 1.029e-01, 1.042e-01, 6.363e-02, -1.091e-02, -3.500e-02)); + r += mul(s4_1, M4(7.939e-02, 5.106e-02, 1.646e-02, 1.241e-02, -1.149e-01, 9.415e-03, -6.784e-02, -8.083e-02, -9.802e-02, 8.836e-02, 1.063e-01, 1.512e-03, -2.318e-02, 1.173e-01, 2.231e-02, -6.367e-02)); + r += mul(s4_2, M4(6.719e-02, -5.960e-02, -1.792e-02, -9.391e-02, -2.777e-02, 4.057e-03, 9.521e-02, -3.255e-02, -5.838e-02, 1.602e-01, 5.509e-02, -3.045e-02, -3.952e-02, -5.492e-02, 1.377e-02, -5.226e-02)); + r += mul(s4_3, M4(-1.063e-01, -1.305e-01, -1.833e-01, -1.631e-02, 6.600e-02, -3.358e-02, 1.500e-01, -7.903e-02, 4.510e-02, 8.916e-02, 1.552e-01, 1.120e-01, 2.318e-01, -5.822e-02, -6.089e-02, 9.544e-02)); + r += mul(s4_4, M4(-1.171e-01, -9.434e-02, 9.676e-02, -1.079e-01, 1.392e-01, -8.776e-02, 7.483e-02, 1.604e-01, -6.664e-02, 3.942e-02, 1.006e-02, -1.421e-02, 6.416e-03, -3.308e-02, -3.635e-02, 5.277e-02)); + r += mul(s4_5, M4(-7.795e-02, -1.596e-01, 5.188e-02, -2.112e-02, 2.212e-02, -2.934e-02, -4.072e-02, 3.688e-02, -8.796e-02, 4.554e-02, 4.613e-02, 2.220e-02, 3.293e-02, -2.018e-02, 6.763e-02, -4.271e-02)); + r += mul(s4_6, M4(5.885e-02, -2.973e-02, -2.401e-02, -3.537e-02, -3.940e-02, -8.817e-02, 2.230e-02, -6.296e-02, -1.419e-01, 1.132e-01, 1.068e-01, 3.630e-02, 4.039e-02, -4.258e-02, -1.289e-02, -7.648e-03)); + r += mul(s4_7, M4(-1.078e-01, -3.099e-02, 1.007e-01, 5.882e-02, -8.772e-03, -4.877e-02, 2.467e-02, -5.927e-02, -6.206e-02, 1.329e-01, 6.958e-02, -3.148e-02, 1.597e-01, 5.097e-02, 2.388e-02, 8.372e-02)); + r += mul(s4_8, M4(-7.924e-02, -8.737e-02, -7.882e-02, 5.712e-02, -6.122e-02, 7.157e-02, -2.899e-02, 8.360e-03, 9.493e-03, 1.692e-01, -1.013e-02, 2.343e-02, -5.570e-02, -8.550e-02, 2.770e-02, -9.453e-02)); + r += mul(s5_0, M4(8.819e-03, 2.501e-02, -3.208e-03, -4.834e-03, 1.048e-02, -1.934e-02, -1.325e-02, -1.168e-01, 2.640e-02, 1.421e-03, -1.342e-03, 2.189e-02, 4.175e-02, -2.015e-02, -4.324e-02, -4.105e-02)); + r += mul(s5_1, M4(-1.479e-01, -1.196e-02, 1.970e-01, -1.033e-01, -1.251e-01, -8.718e-02, -9.094e-02, 5.674e-03, 3.394e-02, -2.784e-02, -1.616e-02, 3.621e-03, -5.221e-02, -2.673e-02, 8.328e-03, 9.240e-02)); + r += mul(s5_2, M4(1.195e-02, 2.268e-02, -6.757e-02, -9.740e-02, -6.331e-02, -1.480e-01, -1.055e-03, 6.490e-02, 1.953e-02, -3.462e-03, 1.991e-02, 8.000e-02, -5.332e-02, -8.138e-02, 5.713e-02, -6.742e-02)); + r += mul(s5_3, M4(5.748e-02, 4.795e-02, -7.095e-02, 5.452e-02, 1.210e-01, 1.292e-01, -6.480e-02, -1.008e-01, 1.286e-01, -5.994e-02, -1.638e-02, 3.202e-02, -6.433e-02, 2.687e-02, -6.258e-02, -1.186e-01)); + r += mul(s5_4, M4(-1.261e-01, 1.389e-01, 1.851e-01, 9.956e-02, 2.162e-01, 5.637e-02, -8.870e-02, 1.544e-01, -5.564e-02, -3.457e-02, -9.623e-02, 3.453e-02, 4.398e-02, -7.065e-02, -1.803e-01, 1.055e-01)); + r += mul(s5_5, M4(4.411e-02, -5.767e-02, -2.048e-02, -6.275e-02, 3.149e-02, 6.071e-02, -7.995e-02, -3.809e-03, -4.299e-02, -2.634e-02, -1.301e-02, -2.465e-02, 4.801e-02, -5.315e-02, -7.519e-02, -1.131e-01)); + r += mul(s5_6, M4(5.184e-02, -2.393e-02, 2.978e-02, 7.869e-03, 4.903e-02, -5.779e-03, -7.840e-02, -6.297e-02, -3.251e-03, -3.650e-02, -7.022e-02, -9.058e-02, 2.345e-01, -4.798e-02, -6.965e-02, -1.047e-02)); + r += mul(s5_7, M4(-1.676e-01, 9.611e-02, 8.009e-02, 6.452e-02, -1.739e-02, 8.875e-02, -9.899e-03, 2.454e-02, -5.297e-02, -8.019e-02, -1.924e-02, -2.413e-02, 5.407e-02, -1.561e-01, -6.469e-03, -2.123e-01)); + r += mul(s5_8, M4(-1.075e-01, -1.276e-01, -4.091e-02, -2.845e-02, -5.205e-02, 6.212e-02, -4.472e-02, 5.580e-02, 1.958e-02, 6.661e-04, 3.652e-03, -3.716e-02, 4.124e-02, 7.924e-02, -1.599e-03, -1.593e-02)); + r += mul(s6_0, M4(-6.587e-02, 3.429e-02, 9.400e-02, -1.117e-01, 2.646e-02, 3.866e-02, 2.226e-02, 1.353e-01, -3.900e-02, 4.505e-02, 8.604e-02, 3.070e-02, 2.779e-02, 1.100e-02, -6.750e-02, -2.839e-02)); + r += mul(s6_1, M4(4.552e-03, 9.451e-02, -9.898e-02, -2.833e-02, -1.488e-02, 4.382e-02, -1.861e-03, 1.074e-02, 6.540e-02, -6.682e-02, 5.989e-02, -5.892e-02, 7.685e-02, 5.708e-02, -3.337e-02, 8.336e-02)); + r += mul(s6_2, M4(-2.814e-02, 2.122e-02, 4.532e-02, 5.069e-02, 3.021e-02, -7.122e-03, -8.282e-02, 1.747e-02, 9.267e-02, 3.989e-02, 1.376e-02, -3.627e-02, 1.038e-02, -1.479e-02, -2.792e-02, 2.023e-02)); + r += mul(s6_3, M4(-4.933e-02, -7.599e-02, 4.385e-02, 1.319e-02, -1.735e-02, -6.550e-02, 1.971e-01, -1.535e-02, -3.634e-02, -9.941e-03, -1.027e-01, 1.121e-01, 2.485e-02, -7.526e-02, -3.840e-02, -1.220e-01)); + r += mul(s6_4, M4(-4.438e-03, 1.176e-01, -3.435e-02, -9.323e-03, 9.122e-03, -7.171e-02, 2.342e-02, -1.868e-02, -3.795e-02, 4.210e-02, 2.311e-02, -1.366e-01, 1.071e-01, 1.121e-01, 7.830e-02, -1.276e-01)); + r += mul(s6_5, M4(4.036e-02, -1.007e-01, 9.589e-03, -4.900e-02, 1.301e-02, -6.537e-02, 9.083e-04, -1.008e-02, 4.379e-02, -7.682e-02, -4.417e-02, 1.213e-01, 2.464e-02, -9.770e-02, 2.136e-02, -2.157e-02)); + r += mul(s6_6, M4(1.200e-02, 2.753e-02, -1.293e-01, -4.456e-02, 7.210e-02, 8.744e-02, 1.314e-01, 5.778e-02, -1.460e-03, 6.104e-02, 5.880e-02, 5.512e-02, 1.923e-02, -5.177e-02, -9.954e-02, -1.065e-01)); + r += mul(s6_7, M4(3.210e-02, 1.409e-02, -4.716e-02, 6.395e-02, -1.541e-01, 1.459e-02, -3.552e-02, 1.028e-02, -6.029e-02, 2.254e-02, -4.864e-02, -1.185e-01, 5.626e-02, -3.494e-02, -1.985e-02, -1.366e-01)); + r += mul(s6_8, M4(-3.078e-02, -1.036e-01, -1.301e-02, 7.125e-03, -4.409e-02, 7.586e-03, -2.456e-02, -1.396e-02, 4.438e-02, -6.712e-03, 6.092e-03, 1.195e-01, 2.095e-02, 3.639e-02, 2.807e-02, 7.034e-03)); + r += mul(s7_0, M4(-1.064e-01, -2.040e-02, 5.966e-02, -1.144e-01, -2.941e-02, 2.149e-02, 1.126e-01, 6.964e-02, 8.057e-03, -7.718e-02, 1.058e-01, 9.676e-03, -1.611e-01, 9.774e-02, -3.619e-02, -2.273e-02)); + r += mul(s7_1, M4(1.222e-01, 7.370e-02, 6.350e-02, -2.778e-02, -5.785e-02, 1.356e-01, -3.859e-03, 1.072e-01, -1.608e-01, 5.626e-02, 4.248e-02, -1.326e-02, 1.310e-01, 3.131e-02, -7.499e-02, 1.239e-01)); + r += mul(s7_2, M4(-1.147e-01, 6.275e-02, 6.749e-02, 2.058e-03, 5.421e-02, 5.281e-03, -4.117e-02, -9.046e-03, 1.216e-02, -1.044e-01, -7.101e-02, 1.551e-01, -4.748e-02, -1.559e-02, 1.106e-01, -8.485e-02)); + r += mul(s7_3, M4(-1.428e-01, 2.568e-02, 4.139e-03, -1.026e-01, 1.045e-01, 9.863e-02, 2.783e-01, 1.663e-01, 2.259e-02, 1.498e-02, -1.033e-01, 2.928e-02, -1.649e-01, 9.702e-03, -2.491e-02, 1.559e-02)); + r += mul(s7_4, M4(4.773e-02, -2.796e-01, -1.417e-01, 3.005e-02, 4.236e-02, -1.432e-01, -4.318e-02, 2.015e-01, 2.713e-03, 7.427e-02, 1.661e-02, -1.379e-02, 8.511e-02, 1.124e-01, 1.307e-01, -4.609e-02)); + r += mul(s7_5, M4(-1.353e-01, -5.591e-02, 1.868e-02, 1.359e-02, -3.074e-03, -8.917e-02, 5.121e-02, -1.265e-02, 2.939e-02, -7.794e-02, 4.117e-02, -8.684e-02, 4.066e-02, 1.425e-02, 4.589e-02, 7.110e-02)); + r += mul(s7_6, M4(7.543e-02, 5.722e-02, -5.474e-02, 9.440e-02, 1.591e-02, 8.331e-04, 1.057e-01, 1.237e-01, 4.280e-02, 7.995e-02, 1.499e-02, 5.792e-03, -1.117e-01, 6.059e-02, 1.653e-02, 5.193e-03)); + r += mul(s7_7, M4(8.459e-02, -9.582e-02, -4.502e-02, -5.642e-02, 4.828e-02, 5.482e-02, 9.157e-02, 1.656e-01, 9.634e-03, 6.346e-02, 2.196e-02, -6.270e-02, 5.168e-02, -7.061e-03, -4.080e-03, -1.748e-01)); + r += mul(s7_8, M4(-1.326e-02, 3.705e-02, 1.875e-02, -9.729e-03, 7.288e-02, 5.390e-02, -8.273e-03, -1.523e-02, 1.830e-03, 2.142e-02, 4.581e-02, 1.018e-01, 2.352e-02, 4.956e-02, 1.290e-02, -6.372e-02)); + r += V4(-1.451e-02, 4.205e-03, -1.874e-02, 5.987e-02); + return r; +} + +V4 f1(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(2.344e-03, -9.805e-03, -2.839e-02, -3.089e-02, 1.048e-01, 2.998e-02, 4.555e-02, 7.427e-03, -8.033e-02, 2.833e-02, 6.935e-02, -9.568e-02, -6.328e-02, 2.050e-02, -5.968e-02, 2.476e-02)); + r += mul(s0_1, M4(2.240e-02, -5.632e-02, -4.306e-03, -1.022e-01, -1.093e-01, 4.465e-02, -9.950e-03, 2.156e-02, -2.778e-02, 3.831e-02, 1.898e-02, -2.200e-02, 1.370e-02, 2.085e-01, 4.253e-02, 5.573e-02)); + r += mul(s0_2, M4(9.375e-02, -2.336e-02, 8.234e-02, 4.651e-02, 6.124e-03, -1.309e-02, 9.795e-02, 1.715e-02, -6.332e-02, -8.201e-02, 8.917e-02, -2.506e-02, -4.990e-02, 1.082e-01, 5.102e-02, -9.560e-02)); + r += mul(s0_3, M4(-7.771e-02, -2.765e-02, 1.889e-02, -3.040e-02, -8.316e-03, -1.270e-02, -4.994e-02, 4.334e-02, -7.231e-02, 4.457e-02, 1.622e-01, -4.778e-02, 3.031e-02, 1.168e-01, -1.184e-02, -1.127e-02)); + r += mul(s0_4, M4(2.607e-02, -5.881e-02, 1.845e-01, -2.438e-01, -7.663e-02, -7.072e-02, -1.595e-01, 4.675e-02, -1.333e-01, -1.456e-01, -7.031e-04, 1.973e-03, -1.121e-01, -3.679e-02, 1.236e-02, -1.194e-01)); + r += mul(s0_5, M4(2.403e-02, -8.932e-02, 1.899e-02, 3.188e-02, 2.199e-03, -9.581e-02, 1.759e-02, 5.322e-02, 3.552e-02, -1.322e-01, 1.539e-01, 6.338e-03, -4.610e-02, 1.254e-01, -4.811e-02, 7.377e-03)); + r += mul(s0_6, M4(1.081e-01, -1.338e-02, 5.300e-02, -1.344e-02, 3.532e-02, 6.458e-02, 5.362e-02, -4.402e-02, -9.941e-02, -3.865e-02, -5.581e-03, -3.485e-02, -7.281e-02, 7.453e-02, -5.049e-02, -1.314e-02)); + r += mul(s0_7, M4(1.238e-01, -2.739e-02, 1.134e-01, -3.758e-02, 1.081e-01, 1.110e-01, -7.975e-02, -1.989e-02, 2.296e-03, -2.101e-01, -1.088e-02, 8.849e-02, 7.111e-02, 1.474e-01, 6.939e-02, -4.090e-02)); + r += mul(s0_8, M4(3.295e-02, -9.573e-02, -4.783e-02, -6.984e-02, 8.421e-02, -1.479e-02, -4.707e-02, 4.174e-02, 1.252e-02, -1.382e-01, 1.412e-03, 1.788e-02, -5.869e-02, -1.024e-01, 3.305e-02, 2.486e-01)); + r += mul(s1_0, M4(5.386e-02, -2.332e-04, -6.319e-02, -6.575e-02, 9.518e-02, 2.111e-02, 4.273e-02, 2.367e-03, 3.327e-03, -1.247e-02, 1.171e-01, -6.264e-04, -8.330e-02, 3.086e-02, -2.737e-02, 1.056e-01)); + r += mul(s1_1, M4(5.131e-02, -9.459e-02, 1.391e-02, -8.433e-02, -2.116e-02, 3.004e-02, -4.266e-02, -4.011e-02, 1.038e-01, 5.195e-02, 2.186e-02, 4.653e-03, 6.983e-02, 1.010e-02, -1.459e-01, 1.511e-01)); + r += mul(s1_2, M4(1.060e-01, -2.618e-02, 6.360e-02, 1.022e-01, 8.176e-03, 2.611e-02, 1.113e-01, 3.624e-02, -9.619e-03, 8.484e-03, 9.125e-02, 4.374e-02, -3.693e-02, 7.485e-04, 1.215e-02, -3.590e-02)); + r += mul(s1_3, M4(-2.750e-02, -4.485e-02, 9.890e-02, -6.311e-02, 1.524e-02, -6.605e-02, -1.650e-02, 5.478e-02, 3.148e-02, -8.228e-02, 1.109e-01, -7.090e-02, -1.741e-02, -4.447e-02, 5.358e-02, 7.489e-02)); + r += mul(s1_4, M4(2.716e-02, 1.156e-01, 6.520e-02, -1.864e-01, -5.167e-02, -2.354e-01, -2.550e-02, 1.401e-01, -3.611e-02, 5.682e-04, -1.600e-01, -1.332e-01, -1.504e-01, 4.322e-02, -1.132e-01, -2.514e-01)); + r += mul(s1_5, M4(1.397e-03, -3.174e-02, -6.599e-02, 1.456e-01, -3.225e-02, -6.391e-02, 1.805e-01, 6.478e-03, 6.731e-03, 4.296e-02, -2.010e-03, -7.334e-02, 2.013e-02, -3.991e-02, 1.716e-01, 1.178e-01)); + r += mul(s1_6, M4(2.465e-02, -1.753e-02, -5.721e-02, -6.484e-02, 6.290e-02, -6.025e-02, 1.484e-01, -5.859e-02, 1.292e-01, 1.726e-02, -2.810e-02, 2.979e-02, -4.972e-03, -2.422e-02, 5.687e-02, 2.980e-02)); + r += mul(s1_7, M4(1.368e-01, 1.486e-01, -3.852e-02, 8.255e-02, -3.771e-02, 1.432e-01, -1.848e-01, -3.078e-02, 3.680e-02, 1.328e-02, -1.199e-01, -6.755e-04, -7.118e-02, 7.359e-02, -1.523e-02, 4.401e-02)); + r += mul(s1_8, M4(2.924e-02, -8.047e-02, -7.385e-02, -1.716e-02, 5.621e-02, -2.854e-02, 6.091e-02, 5.831e-03, 3.138e-02, -6.197e-02, -1.127e-02, 3.365e-02, -6.421e-02, -1.412e-02, -1.351e-02, 1.070e-01)); + r += mul(s2_0, M4(-1.293e-02, -5.838e-02, 6.240e-02, -1.877e-01, 5.550e-02, -9.230e-02, 1.265e-01, 2.416e-02, 1.493e-04, -2.588e-02, -1.854e-01, 2.477e-01, -7.828e-02, -4.300e-02, -1.092e-01, -6.587e-02)); + r += mul(s2_1, M4(8.245e-02, -9.892e-02, 1.759e-01, 3.533e-02, -1.654e-03, 1.972e-02, -2.587e-02, 8.446e-02, -7.160e-03, 5.482e-02, -2.511e-01, -1.212e-01, -7.406e-03, -5.994e-02, 7.520e-02, -3.798e-02)); + r += mul(s2_2, M4(7.256e-03, -1.018e-01, 4.222e-02, 2.550e-03, -1.391e-02, -1.088e-02, -1.922e-02, -6.792e-02, -4.209e-02, -1.057e-02, 1.268e-03, 7.285e-02, -6.543e-02, 3.588e-02, 2.900e-02, -2.981e-02)); + r += mul(s2_3, M4(1.095e-01, -5.158e-02, -6.584e-03, -4.608e-02, 1.458e-02, -4.648e-03, 2.637e-02, 6.995e-03, -2.911e-01, 5.837e-02, 5.528e-02, -1.085e-01, -4.009e-04, 3.748e-03, 7.829e-02, -9.249e-02)); + r += mul(s2_4, M4(1.073e-01, 8.664e-03, -1.294e-01, 1.669e-01, 1.476e-03, -2.677e-02, -9.490e-03, 3.585e-02, -3.018e-01, 2.565e-01, -1.070e-01, -2.619e-01, 1.232e-02, 1.379e-01, 2.695e-02, 9.244e-02)); + r += mul(s2_5, M4(5.018e-02, -7.074e-02, -8.919e-02, 3.096e-02, -1.395e-02, 3.363e-02, -1.519e-02, 4.761e-02, -4.412e-02, -9.688e-03, 1.550e-01, -1.703e-02, 3.976e-02, 5.225e-02, -8.573e-02, 1.902e-02)); + r += mul(s2_6, M4(-2.469e-02, 2.743e-02, -4.801e-02, -3.503e-02, -1.190e-01, -3.653e-03, -6.111e-02, -7.555e-02, 8.907e-02, 3.066e-02, 4.436e-02, 6.102e-02, -1.557e-02, -1.555e-02, -9.236e-04, 1.793e-02)); + r += mul(s2_7, M4(9.239e-02, 2.052e-02, -6.767e-03, -1.165e-01, -1.404e-02, 1.715e-02, -2.119e-02, -2.680e-02, 4.578e-02, 4.789e-02, -2.823e-02, 1.048e-01, 8.417e-02, 5.547e-02, -7.012e-03, -1.722e-02)); + r += mul(s2_8, M4(-4.989e-02, -1.010e-01, 4.738e-02, 1.326e-02, -1.239e-01, -4.745e-02, 1.063e-02, 8.686e-03, 1.224e-02, 1.136e-02, 1.073e-02, 1.489e-01, -2.937e-02, 5.295e-02, -4.437e-02, 2.992e-02)); + r += mul(s3_0, M4(4.208e-02, -3.703e-04, -1.569e-01, -6.008e-02, 7.651e-02, -6.044e-02, 1.212e-01, 3.376e-02, 2.591e-02, 5.298e-03, 4.234e-02, -1.362e-01, -6.371e-02, -3.483e-04, 4.701e-02, -9.569e-02)); + r += mul(s3_1, M4(-1.979e-01, -4.556e-02, 5.086e-02, -1.667e-01, 2.496e-02, 6.713e-03, 1.485e-01, 2.983e-02, 9.088e-02, -4.213e-03, 7.270e-02, 1.251e-02, -1.967e-01, 8.713e-02, 6.949e-02, 6.630e-02)); + r += mul(s3_2, M4(-1.449e-01, -6.095e-02, 5.335e-02, -5.547e-02, 1.107e-01, -1.202e-02, 1.260e-01, 4.970e-04, -1.520e-02, -1.878e-02, 1.131e-02, -2.673e-02, -3.896e-02, -3.462e-02, 1.693e-01, 8.253e-02)); + r += mul(s3_3, M4(-7.279e-02, 1.513e-01, -6.853e-02, -9.554e-02, -4.488e-01, 1.131e-01, -3.079e-01, -9.108e-02, -3.125e-02, -1.483e-01, 1.877e-01, -4.281e-02, 2.693e-01, 5.360e-02, 1.042e-01, -8.684e-04)); + r += mul(s3_4, M4(1.337e-01, 5.500e-02, -1.685e-01, -8.454e-03, -1.487e-01, 6.688e-02, 1.803e-01, 4.025e-02, -2.288e-03, 1.328e-01, -2.330e-02, 3.808e-02, 6.442e-02, 2.379e-01, 1.518e-01, 2.082e-02)); + r += mul(s3_5, M4(-8.197e-02, -4.012e-02, -5.432e-03, -2.579e-02, 5.816e-02, -4.647e-02, -6.499e-02, -9.443e-02, -4.104e-02, -3.033e-02, 3.759e-02, -3.847e-02, 4.894e-02, 3.089e-01, 5.030e-02, 6.165e-02)); + r += mul(s3_6, M4(3.228e-03, 3.505e-02, -8.164e-02, -2.838e-02, -8.041e-02, 2.948e-02, -2.364e-02, -1.109e-01, 1.239e-02, 1.975e-02, 1.805e-02, 7.607e-02, -8.639e-02, 6.563e-02, -8.454e-02, -3.153e-03)); + r += mul(s3_7, M4(-4.569e-02, -2.611e-02, 4.161e-02, -7.171e-03, -1.369e-02, -2.254e-01, 7.921e-02, -1.140e-01, 1.063e-01, 4.064e-02, 6.557e-02, -6.192e-02, 2.136e-02, -8.469e-03, 2.204e-01, -6.957e-02)); + r += mul(s3_8, M4(-1.402e-01, -2.294e-02, 1.230e-02, 5.118e-02, -1.238e-01, -1.030e-01, 5.372e-02, -1.356e-02, 2.047e-02, -2.680e-02, -2.303e-02, 2.664e-02, 6.519e-02, 1.141e-01, -4.940e-02, -1.001e-01)); + r += mul(s4_0, M4(1.462e-01, 1.360e-02, -1.126e-03, -6.671e-02, 1.432e-01, 4.517e-03, 4.074e-02, 4.777e-02, -4.704e-02, 1.196e-01, -3.582e-02, 6.838e-02, 4.898e-02, 1.875e-02, -9.463e-03, -3.076e-02)); + r += mul(s4_1, M4(-2.508e-02, 2.834e-02, 1.278e-01, 9.014e-02, 4.667e-02, -5.542e-02, -2.249e-02, 3.323e-02, -2.201e-02, 1.178e-01, -7.320e-02, 4.906e-02, 1.513e-02, -1.928e-02, -2.721e-02, 5.136e-02)); + r += mul(s4_2, M4(1.140e-01, 4.113e-02, -8.168e-02, -3.008e-02, -3.237e-02, 1.575e-02, -1.213e-01, 8.478e-02, -1.921e-02, 1.392e-01, 5.893e-03, 1.796e-01, 2.867e-02, -1.158e-02, 5.610e-02, 1.319e-02)); + r += mul(s4_3, M4(1.879e-02, 4.729e-03, 1.568e-02, 7.471e-02, 4.814e-02, -6.075e-03, -4.665e-03, 5.821e-02, 7.452e-02, 1.179e-01, 1.133e-02, 1.727e-01, -8.217e-02, 5.060e-02, 3.670e-02, -9.247e-02)); + r += mul(s4_4, M4(6.469e-02, 1.039e-01, -8.760e-02, -1.319e-01, -7.083e-02, 7.944e-02, -4.220e-02, -2.130e-01, 1.128e-01, 5.147e-02, -5.449e-02, 2.036e-01, -5.375e-02, 6.902e-02, 5.372e-02, 2.733e-03)); + r += mul(s4_5, M4(-1.676e-01, 9.467e-03, -5.490e-02, -1.960e-01, -1.715e-01, 1.034e-01, -9.772e-02, 8.503e-03, 9.439e-02, 1.480e-01, -5.971e-02, 1.124e-01, 2.235e-02, -3.263e-02, 5.998e-02, 8.289e-02)); + r += mul(s4_6, M4(-1.038e-01, -8.226e-02, -1.567e-01, 2.170e-02, 1.291e-01, 8.024e-02, 1.948e-03, 4.178e-02, 2.871e-03, 1.282e-01, 2.812e-02, 1.055e-01, 1.089e-01, 1.132e-02, 2.708e-02, -2.635e-02)); + r += mul(s4_7, M4(-8.934e-02, -4.735e-02, -5.800e-02, -5.941e-03, -4.215e-02, 1.354e-01, 4.278e-02, -6.081e-02, -2.853e-02, 2.969e-02, -8.708e-02, 1.214e-01, 5.987e-02, 8.078e-02, 2.372e-02, -5.396e-03)); + r += mul(s4_8, M4(-4.907e-02, -1.079e-02, 1.005e-01, -6.986e-02, -5.939e-02, 1.774e-01, -1.692e-01, -1.039e-02, -4.109e-02, 9.287e-02, -6.562e-02, 9.642e-02, 6.208e-02, 1.334e-02, -5.994e-02, -1.001e-02)); + r += mul(s5_0, M4(8.164e-02, 4.011e-02, 6.939e-03, 8.032e-03, 3.212e-02, -9.251e-02, 1.170e-02, -2.023e-02, -3.300e-02, -1.767e-02, -4.043e-03, -5.685e-02, 8.116e-02, -5.937e-02, -6.877e-02, 2.343e-02)); + r += mul(s5_1, M4(-1.003e-01, -5.262e-02, 9.624e-02, 8.277e-02, -8.407e-03, -1.362e-01, -2.456e-02, -2.344e-02, -4.793e-02, -4.068e-02, 1.046e-02, -1.440e-01, 6.938e-03, 5.128e-02, 1.006e-01, 9.821e-02)); + r += mul(s5_2, M4(5.356e-02, 2.052e-02, -4.819e-02, 6.780e-03, -1.889e-02, -3.426e-02, 6.200e-02, 1.969e-02, 1.825e-02, 2.155e-02, 1.092e-01, -4.080e-02, 1.203e-01, 4.247e-02, -1.231e-02, -1.020e-01)); + r += mul(s5_3, M4(-5.032e-02, 4.816e-02, 7.752e-02, -2.300e-02, -1.198e-01, -1.443e-01, 2.161e-02, 5.853e-02, 2.987e-02, -4.013e-02, -2.463e-02, -5.912e-02, -1.189e-01, 6.843e-02, -3.794e-01, 4.953e-02)); + r += mul(s5_4, M4(2.933e-02, 9.212e-02, -2.216e-01, 3.046e-02, -6.752e-02, -1.066e-01, -5.734e-02, 1.999e-02, 4.349e-02, -9.789e-02, 5.922e-02, 1.075e-02, 3.302e-02, -4.449e-03, 7.140e-02, 8.827e-02)); + r += mul(s5_5, M4(2.336e-02, 5.605e-02, -1.168e-01, -2.738e-02, -1.068e-01, -1.342e-01, 7.226e-03, 5.034e-02, 6.440e-02, -2.983e-02, -3.400e-02, -4.761e-02, 6.747e-02, -1.067e-01, 7.144e-02, 1.726e-02)); + r += mul(s5_6, M4(-1.062e-02, -6.428e-02, -7.855e-02, -3.672e-02, 3.085e-03, -4.312e-02, -1.639e-02, -6.597e-02, -4.954e-03, -6.910e-02, 7.293e-03, -7.641e-02, -7.643e-02, 1.781e-01, -1.830e-01, 4.187e-02)); + r += mul(s5_7, M4(-7.771e-03, 6.857e-02, 1.087e-02, -8.714e-02, -1.724e-01, -5.215e-02, -8.151e-02, -8.315e-02, 1.904e-02, -3.969e-02, -2.525e-03, -9.843e-02, 9.320e-02, -6.709e-03, -1.866e-01, 1.070e-01)); + r += mul(s5_8, M4(3.333e-02, 9.300e-04, 7.545e-03, 3.959e-02, -2.973e-02, -5.905e-02, 2.414e-02, -7.486e-02, 3.673e-02, -3.521e-02, -2.630e-02, -1.747e-02, -1.480e-01, -2.285e-02, -3.720e-02, 9.578e-02)); + r += mul(s6_0, M4(-7.760e-02, 7.478e-02, -1.705e-01, -6.227e-02, -9.431e-02, 8.710e-02, 5.079e-02, -3.262e-03, 1.351e-02, 8.079e-02, -1.082e-01, 1.096e-02, -2.534e-02, -1.407e-02, -4.151e-02, 2.357e-03)); + r += mul(s6_1, M4(-6.798e-02, -6.315e-02, 5.991e-03, 8.121e-02, -8.420e-02, -2.555e-02, 5.151e-04, 1.331e-02, 4.140e-02, -4.308e-02, 1.862e-01, -7.537e-02, -1.481e-02, 1.059e-02, 1.700e-04, 5.745e-03)); + r += mul(s6_2, M4(-6.967e-02, 6.080e-02, 2.605e-02, -3.930e-02, -4.282e-02, -4.539e-02, 3.064e-02, 2.046e-02, -1.580e-02, -4.079e-02, -2.028e-02, -4.854e-02, -5.895e-02, -3.993e-02, -2.290e-03, -6.917e-02)); + r += mul(s6_3, M4(-1.466e-01, -4.031e-03, 3.942e-02, -1.060e-01, 4.836e-02, -6.690e-02, 1.602e-01, -1.370e-01, -1.037e-01, -2.140e-02, -2.851e-02, -6.891e-02, 8.217e-03, -6.676e-02, 8.412e-03, -9.480e-02)); + r += mul(s6_4, M4(9.009e-02, -4.851e-02, -2.332e-02, 1.002e-01, 6.230e-02, -1.825e-01, 3.208e-02, 1.192e-01, 6.470e-02, 3.821e-02, -2.345e-01, 4.967e-02, 2.437e-03, 1.159e-01, -1.056e-02, 2.428e-02)); + r += mul(s6_5, M4(-1.050e-01, 1.916e-02, 8.092e-02, 1.318e-02, 5.276e-02, 7.569e-03, -4.164e-02, -7.187e-02, -1.271e-01, 6.620e-02, 4.655e-02, -1.058e-01, 3.835e-03, 1.104e-02, -7.979e-02, -3.507e-02)); + r += mul(s6_6, M4(-2.637e-02, 1.293e-02, -5.877e-02, 2.606e-02, 3.808e-02, -1.190e-01, 1.087e-01, 6.010e-02, -1.083e-01, 2.846e-03, 6.642e-02, 1.077e-02, -6.618e-02, -1.059e-01, 4.072e-02, 9.681e-02)); + r += mul(s6_7, M4(-2.846e-01, -4.732e-02, -1.686e-01, 2.317e-02, -2.674e-02, -2.176e-01, 2.488e-04, -7.701e-02, 4.202e-02, -8.379e-03, -2.075e-01, -1.442e-01, 6.196e-02, -3.720e-02, 2.136e-02, -6.112e-02)); + r += mul(s6_8, M4(1.342e-02, 5.232e-03, -4.976e-02, 1.687e-02, -3.436e-02, -5.854e-02, 5.797e-02, 2.055e-04, -3.105e-02, 3.903e-03, 4.700e-02, 7.226e-02, 7.196e-02, 1.413e-02, 4.264e-02, 3.840e-02)); + r += mul(s7_0, M4(2.040e-02, 1.497e-02, 2.256e-02, 1.460e-02, -9.725e-02, 6.526e-02, -2.696e-02, 2.454e-02, 1.266e-01, -3.398e-02, 6.082e-02, 5.908e-03, -1.409e-01, 3.909e-03, -7.887e-02, 6.916e-02)); + r += mul(s7_1, M4(8.005e-02, 6.767e-02, -1.255e-01, 1.218e-01, -1.372e-01, 2.646e-02, 5.793e-02, 1.054e-02, -1.809e-01, 1.230e-04, -1.754e-01, -2.163e-01, 3.360e-02, -2.203e-02, 1.462e-01, -1.898e-02)); + r += mul(s7_2, M4(7.027e-02, 4.845e-02, 1.684e-01, -8.964e-02, -3.446e-02, -3.309e-02, 8.349e-02, 5.183e-02, -1.477e-01, 1.125e-01, -1.548e-01, -2.234e-03, -4.121e-02, 1.182e-02, 3.854e-02, -3.380e-02)); + r += mul(s7_3, M4(-5.837e-03, 3.345e-02, -7.857e-02, 1.266e-01, -8.752e-02, 1.598e-01, -1.238e-01, 3.737e-02, -4.614e-02, 6.373e-02, -1.753e-01, -9.201e-02, -9.938e-02, 1.970e-02, -7.991e-02, -1.997e-01)); + r += mul(s7_4, M4(-2.545e-01, 8.458e-02, 1.423e-01, 3.587e-02, 2.393e-02, 1.303e-01, 8.049e-02, 1.975e-01, 1.185e-01, 6.992e-03, 8.926e-03, 2.984e-02, -6.371e-02, 5.806e-02, 2.618e-01, -1.410e-02)); + r += mul(s7_5, M4(-3.266e-02, 1.660e-02, 5.827e-02, 1.212e-02, -7.540e-02, 5.256e-02, -2.155e-02, -6.183e-02, 2.177e-01, 6.338e-02, -5.074e-02, -9.758e-03, -5.153e-03, 2.625e-03, -2.261e-01, -1.068e-01)); + r += mul(s7_6, M4(5.063e-02, 1.280e-01, 6.280e-02, 4.254e-03, 2.437e-02, 3.588e-02, -4.090e-02, 7.597e-02, -3.171e-02, 4.712e-02, -1.201e-01, 2.630e-02, 2.330e-02, -4.809e-02, 6.096e-02, 1.435e-01)); + r += mul(s7_7, M4(-4.286e-02, -1.806e-01, 7.417e-02, 4.447e-02, 7.957e-02, 3.068e-01, -3.460e-02, 1.750e-01, -4.259e-03, 4.266e-03, -3.093e-02, -4.012e-02, 2.650e-01, 1.086e-01, 1.919e-01, -7.284e-02)); + r += mul(s7_8, M4(-2.275e-02, -1.156e-02, 1.682e-02, 4.636e-02, 1.449e-01, 7.291e-02, -3.986e-03, 3.819e-02, 5.878e-02, 2.092e-03, 2.601e-02, 2.768e-02, -3.431e-03, 7.016e-03, -4.034e-02, 5.688e-02)); + r += V4(-9.645e-03, 2.342e-02, -1.139e-02, 1.378e-02); + return r; +} + +V4 f2(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-2.235e-02, 1.758e-02, -1.337e-02, -1.894e-02, -1.007e-02, 3.774e-02, 3.656e-02, 4.967e-02, 3.830e-02, -5.293e-02, 5.697e-02, 1.559e-02, -3.131e-03, 1.521e-01, -7.018e-02, -2.493e-02)); + r += mul(s0_1, M4(-6.261e-02, 3.260e-02, -8.457e-03, -1.056e-01, 2.296e-02, 3.729e-02, -5.025e-02, 1.684e-02, -4.360e-02, -7.328e-03, 7.443e-03, 4.313e-02, 1.082e-02, 1.483e-01, 2.137e-02, 5.946e-02)); + r += mul(s0_2, M4(-2.812e-02, -1.622e-02, 7.932e-03, -1.053e-01, -1.674e-02, 2.378e-02, -1.198e-02, -1.223e-02, -3.115e-02, 2.124e-02, 1.056e-02, 9.962e-03, 6.215e-02, 3.674e-02, 3.996e-03, 1.621e-02)); + r += mul(s0_3, M4(4.894e-02, -4.206e-02, -1.521e-02, 3.288e-02, 9.242e-03, -3.116e-02, -1.769e-02, -1.571e-02, -5.983e-02, -1.275e-01, 1.573e-01, -5.620e-02, 1.653e-02, -6.470e-02, 8.811e-02, 2.235e-02)); + r += mul(s0_4, M4(1.422e-01, 1.464e-01, 1.462e-01, -2.127e-02, -2.044e-02, 2.511e-02, 6.318e-02, 4.210e-03, 4.909e-02, 1.642e-02, 3.219e-02, -7.011e-02, 4.381e-01, -5.414e-02, 3.604e-01, -9.337e-02)); + r += mul(s0_5, M4(-7.263e-02, 6.901e-02, -7.342e-02, 2.163e-02, 1.265e-01, 1.449e-02, 1.719e-02, 8.816e-02, 6.955e-02, -2.453e-02, -1.210e-01, -3.800e-02, 2.995e-01, 4.550e-02, 9.555e-02, 5.017e-02)); + r += mul(s0_6, M4(-2.159e-02, -1.025e-01, -2.438e-02, -3.804e-02, 3.301e-02, 4.639e-02, 1.628e-02, -3.390e-02, -6.444e-02, 5.609e-02, -1.486e-02, -4.606e-02, 6.844e-02, 2.264e-02, 2.765e-02, 4.180e-02)); + r += mul(s0_7, M4(-1.188e-01, 1.812e-02, 9.982e-02, -5.810e-02, -2.826e-02, -7.934e-02, 1.336e-01, 2.213e-02, -6.742e-02, -6.453e-02, -3.554e-03, -6.146e-02, 1.484e-02, 9.664e-02, 7.380e-03, 1.108e-01)); + r += mul(s0_8, M4(-1.089e-01, -4.001e-02, -1.961e-02, 5.396e-02, 2.787e-02, -1.072e-01, 1.750e-02, 5.926e-02, -6.103e-02, -2.486e-02, -7.206e-02, 6.456e-02, -7.149e-03, 8.422e-02, -3.065e-02, 4.495e-02)); + r += mul(s1_0, M4(4.277e-02, -2.244e-02, 2.755e-02, -2.349e-02, 9.466e-04, -5.494e-02, -4.354e-03, 6.013e-02, 2.384e-02, 2.095e-02, 6.241e-02, 3.497e-02, -1.033e-01, -1.233e-02, -3.484e-02, -3.777e-02)); + r += mul(s1_1, M4(-9.936e-03, 3.308e-02, 2.330e-02, 4.952e-02, 8.436e-02, -6.737e-02, 6.331e-03, 1.179e-01, 5.664e-02, 1.490e-01, 1.005e-02, -5.524e-02, -3.491e-02, -2.057e-01, 6.983e-03, 2.871e-02)); + r += mul(s1_2, M4(6.342e-02, 6.945e-02, -2.345e-03, -2.712e-02, -6.100e-02, 1.269e-03, -5.115e-02, -3.713e-02, -7.851e-02, 3.446e-02, 2.732e-03, 7.302e-02, 1.977e-02, -5.482e-02, 1.593e-02, 6.747e-02)); + r += mul(s1_3, M4(9.142e-02, 5.510e-02, 1.406e-02, 3.289e-02, 1.004e-01, 2.006e-02, -1.215e-01, 1.250e-01, 4.927e-02, -8.154e-02, -3.912e-02, 1.928e-01, 2.688e-02, 5.277e-02, 2.352e-02, -2.572e-02)); + r += mul(s1_4, M4(1.341e-01, 1.110e-01, 7.819e-02, -2.257e-02, 1.074e-01, 4.469e-02, -5.829e-02, -6.687e-03, 1.695e-01, -5.354e-02, -4.332e-02, -8.639e-02, 2.138e-01, -2.395e-01, 4.136e-03, -3.769e-01)); + r += mul(s1_5, M4(6.165e-03, 5.052e-02, -6.019e-02, 8.176e-02, 1.499e-01, 6.896e-02, -1.783e-01, 9.658e-02, 5.354e-02, -6.761e-02, -1.791e-02, 5.131e-02, 1.450e-01, 4.687e-03, -1.662e-03, -1.127e-01)); + r += mul(s1_6, M4(9.139e-03, -1.031e-01, 2.417e-02, 8.615e-02, 2.571e-02, -6.374e-02, 2.505e-02, -3.085e-03, 5.163e-04, -9.310e-03, -9.462e-03, -8.005e-03, 3.816e-02, -6.714e-02, 1.051e-02, 2.327e-02)); + r += mul(s1_7, M4(-8.160e-02, 3.700e-02, 1.831e-01, 1.902e-01, -1.498e-01, 7.021e-02, -2.213e-02, 3.722e-02, -2.187e-02, -3.998e-02, -9.834e-02, -9.257e-02, -5.951e-02, 3.060e-02, -7.497e-02, -3.321e-02)); + r += mul(s1_8, M4(1.002e-01, 6.325e-02, -6.622e-02, 5.457e-02, -6.951e-02, -6.234e-02, -4.655e-02, 4.833e-02, -4.063e-03, 1.984e-02, -1.433e-01, 1.359e-02, -1.088e-01, 7.846e-02, -8.814e-02, -1.061e-01)); + r += mul(s2_0, M4(5.541e-02, -6.334e-02, -3.905e-02, 1.848e-02, -2.151e-02, -2.225e-02, 2.208e-02, -8.518e-02, -1.885e-01, -1.277e-01, 3.760e-02, -2.416e-02, 3.120e-02, 6.864e-02, -6.249e-02, -2.824e-02)); + r += mul(s2_1, M4(-9.894e-03, -6.898e-02, 5.062e-02, 1.003e-02, -9.902e-03, -3.368e-02, -3.137e-02, -9.003e-02, 9.006e-02, -9.906e-02, 9.512e-02, -1.653e-01, 4.891e-02, 3.604e-02, 9.485e-03, -1.121e-01)); + r += mul(s2_2, M4(2.684e-02, -1.131e-02, -9.315e-03, -2.647e-02, 5.042e-02, 6.034e-02, -5.949e-03, -2.403e-02, -4.189e-02, 3.209e-02, -1.610e-02, 4.315e-02, 8.602e-03, -9.444e-03, 5.661e-02, 7.441e-03)); + r += mul(s2_3, M4(3.760e-02, -5.971e-02, 1.612e-02, 4.358e-02, -2.775e-02, -6.953e-02, 9.300e-03, 3.969e-02, 3.650e-02, 4.474e-02, -1.545e-01, 9.842e-03, 6.761e-02, -9.414e-02, -4.700e-02, -4.308e-02)); + r += mul(s2_4, M4(4.029e-02, 2.047e-02, 2.195e-01, 2.094e-02, 1.096e-01, -8.999e-03, 4.867e-02, 7.446e-02, -2.145e-01, -1.152e-01, -2.319e-01, -1.897e-01, -7.171e-02, 7.327e-02, -9.723e-03, 7.528e-02)); + r += mul(s2_5, M4(-1.142e-02, 4.584e-02, -3.761e-02, 5.939e-02, 3.169e-02, -6.628e-03, 3.920e-02, 4.302e-02, -2.027e-03, -8.319e-02, 1.982e-02, -3.272e-02, -3.107e-02, 9.817e-02, -1.047e-01, 1.156e-02)); + r += mul(s2_6, M4(-3.706e-02, -8.973e-03, -6.978e-02, -2.422e-02, -2.611e-02, 1.547e-02, -6.433e-02, 8.861e-02, -4.678e-02, 2.963e-02, 3.487e-02, -2.119e-02, -9.221e-03, 6.193e-02, 5.284e-02, -2.915e-02)); + r += mul(s2_7, M4(7.955e-03, -1.196e-01, 5.242e-02, -3.935e-02, -2.996e-02, -1.235e-01, 2.109e-02, -1.208e-02, -2.038e-02, 4.355e-02, -1.435e-01, 1.085e-01, -4.006e-02, 6.133e-03, 8.911e-02, -1.343e-02)); + r += mul(s2_8, M4(-2.854e-02, 2.309e-03, -9.021e-02, 3.283e-03, 8.163e-03, 3.751e-02, -1.850e-02, 2.969e-02, -7.961e-02, -1.022e-01, -1.138e-01, -7.536e-03, -3.915e-02, -4.643e-02, 1.830e-02, -4.550e-02)); + r += mul(s3_0, M4(-4.359e-02, 8.218e-02, 4.245e-02, -6.153e-03, 2.215e-03, 8.774e-02, -1.116e-02, -1.783e-01, 9.785e-02, 3.987e-02, 3.351e-02, 9.085e-02, 1.105e-01, 7.231e-02, -2.175e-02, 1.808e-02)); + r += mul(s3_1, M4(2.311e-02, -7.074e-02, 5.332e-02, -1.278e-01, -7.900e-02, -3.699e-03, 8.018e-02, -1.846e-02, 1.852e-02, -1.070e-01, -4.489e-02, -1.393e-02, 6.422e-02, 1.015e-01, 1.476e-02, -1.419e-01)); + r += mul(s3_2, M4(-1.279e-01, 5.823e-02, 2.759e-02, 2.461e-04, 1.599e-01, 1.177e-01, 5.009e-02, 2.986e-02, 1.039e-01, 5.782e-02, -8.445e-03, 1.354e-02, 1.678e-01, 2.078e-02, 7.488e-02, 1.490e-02)); + r += mul(s3_3, M4(-1.045e-01, -2.048e-01, 1.335e-01, 2.545e-02, -1.538e-01, 7.217e-02, -1.410e-01, 2.025e-01, 3.006e-02, -1.259e-01, 7.962e-02, 1.833e-02, 1.473e-01, -1.813e-01, 1.545e-01, 3.044e-02)); + r += mul(s3_4, M4(-6.705e-02, -3.876e-01, 1.550e-01, -5.262e-02, -6.240e-03, 9.039e-02, -4.094e-02, 1.597e-01, -1.069e-02, -2.105e-02, 8.805e-02, -5.060e-02, 2.486e-01, 3.276e-01, 1.192e-01, 1.125e-01)); + r += mul(s3_5, M4(-9.089e-02, -3.676e-02, 1.768e-02, -2.449e-02, 1.264e-01, -1.428e-01, 8.995e-02, -1.325e-02, -4.953e-02, -1.252e-03, 1.282e-02, 4.847e-02, 1.030e-01, 2.459e-01, -5.811e-02, -9.666e-03)); + r += mul(s3_6, M4(-3.776e-02, -3.515e-02, -2.210e-01, -4.582e-02, -6.582e-02, 8.034e-02, -2.810e-02, 1.405e-02, 4.400e-03, 7.410e-02, 6.586e-02, -5.710e-02, -3.626e-02, 5.664e-02, -4.422e-02, 1.008e-01)); + r += mul(s3_7, M4(-6.564e-02, -1.099e-01, -1.156e-01, -2.495e-02, -2.987e-02, -3.499e-02, 4.216e-02, -9.705e-02, 4.734e-02, -3.642e-02, -9.714e-02, 2.750e-02, 2.755e-02, 2.139e-01, 5.166e-02, -1.298e-02)); + r += mul(s3_8, M4(-6.614e-02, 1.701e-02, -1.155e-01, -3.313e-02, -2.935e-02, 4.937e-02, -1.587e-02, 1.261e-02, 4.688e-02, -3.234e-02, 8.733e-02, 3.656e-03, 1.723e-01, 7.253e-02, -6.274e-02, 3.554e-02)); + r += mul(s4_0, M4(4.480e-02, 2.594e-02, 2.363e-02, 3.143e-02, -6.157e-03, -1.087e-02, -3.910e-02, 8.682e-03, -8.595e-02, -2.033e-02, -2.067e-02, 1.186e-02, 6.745e-02, 4.664e-02, -3.684e-02, -1.060e-02)); + r += mul(s4_1, M4(1.330e-01, 1.048e-01, -1.090e-03, -1.513e-02, -5.701e-02, -8.469e-02, 7.335e-02, -6.900e-02, -1.178e-01, -5.928e-03, 2.121e-02, -3.117e-02, 8.259e-03, 4.294e-02, -1.111e-02, 2.341e-02)); + r += mul(s4_2, M4(-3.063e-03, 2.585e-02, 2.443e-02, 9.037e-02, -2.431e-02, 1.401e-01, -2.404e-02, 1.288e-01, -2.103e-02, -7.508e-02, -4.025e-02, -6.713e-02, 2.879e-02, -4.965e-03, -1.746e-02, 2.180e-03)); + r += mul(s4_3, M4(1.529e-02, 2.120e-01, 7.481e-03, 9.703e-03, 9.358e-03, -1.427e-02, -2.549e-02, 2.064e-02, -1.091e-01, 3.638e-02, -6.525e-02, -6.546e-02, 4.348e-02, 9.187e-02, -1.321e-01, 3.164e-02)); + r += mul(s4_4, M4(7.303e-02, 1.989e-01, -1.306e-01, -1.258e-01, -1.637e-02, -2.482e-02, -7.988e-02, -1.356e-01, -3.034e-02, -9.231e-02, -4.667e-02, 2.811e-03, -8.526e-02, 8.804e-02, 2.945e-03, 1.102e-01)); + r += mul(s4_5, M4(-7.600e-02, 1.258e-01, -1.129e-01, 6.477e-02, -1.874e-02, -2.770e-02, 6.853e-02, 7.639e-03, -4.900e-02, -3.740e-02, -8.046e-02, -7.855e-02, 3.098e-03, -1.509e-02, 4.403e-03, 6.419e-02)); + r += mul(s4_6, M4(-1.058e-02, -1.679e-02, 9.233e-02, 1.145e-01, 1.764e-02, -6.489e-03, 4.585e-02, 2.846e-02, -1.908e-03, -3.274e-02, -1.032e-01, 3.809e-02, -4.379e-04, -2.255e-02, 1.266e-01, -1.212e-02)); + r += mul(s4_7, M4(-2.584e-02, 1.015e-01, -2.037e-01, -1.191e-01, -2.744e-03, 3.012e-02, -2.084e-02, -9.935e-02, -1.232e-02, 5.877e-02, -1.169e-01, -4.421e-02, 5.101e-02, 6.005e-02, 1.136e-01, -7.112e-02)); + r += mul(s4_8, M4(2.779e-02, 2.092e-02, 3.396e-03, -6.018e-02, -5.603e-02, -6.637e-02, -6.031e-03, 8.090e-03, -7.464e-03, -6.229e-02, -1.222e-01, -5.995e-02, 1.425e-03, -7.597e-02, -8.031e-02, 3.117e-02)); + r += mul(s5_0, M4(-1.024e-03, -6.547e-02, 4.057e-02, -2.702e-02, 5.368e-02, -2.424e-02, -7.984e-02, -2.550e-02, -2.558e-02, 2.972e-03, 1.810e-02, -4.180e-02, -2.523e-03, -1.060e-01, 2.874e-02, -1.072e-01)); + r += mul(s5_1, M4(-4.545e-02, -1.463e-01, -9.852e-03, 7.608e-02, 4.909e-04, -1.093e-01, -9.807e-02, -2.105e-02, 3.853e-02, 6.383e-02, 9.544e-02, -2.734e-02, -1.198e-02, 3.637e-02, 1.506e-01, -6.324e-02)); + r += mul(s5_2, M4(-5.263e-02, 3.993e-02, 4.378e-03, -7.435e-02, 3.669e-02, 5.376e-02, -6.510e-03, -4.577e-03, 1.390e-02, 3.165e-02, 3.503e-02, -3.090e-02, -3.346e-02, -3.649e-02, -3.415e-02, 4.699e-02)); + r += mul(s5_3, M4(4.829e-02, 1.096e-01, -6.535e-02, -3.855e-02, 7.956e-02, -9.014e-03, 2.271e-02, -1.032e-01, -1.620e-02, 9.095e-03, -2.873e-02, 2.084e-02, -1.571e-02, -5.614e-02, -2.876e-02, 1.440e-02)); + r += mul(s5_4, M4(-1.019e-01, -1.715e-02, -1.982e-01, -1.791e-01, -1.267e-02, -2.079e-01, -6.014e-02, -2.296e-01, 2.631e-02, 6.505e-02, 5.515e-02, 1.870e-02, -1.078e-01, 1.743e-02, -8.485e-02, 3.567e-01)); + r += mul(s5_5, M4(4.436e-02, 8.221e-02, -2.439e-02, -7.809e-02, -6.170e-02, -9.551e-02, 1.609e-02, -7.136e-02, 4.165e-02, -4.817e-03, 4.287e-02, 2.408e-03, -4.165e-02, -1.652e-02, 2.293e-02, 8.002e-02)); + r += mul(s5_6, M4(-2.911e-02, -2.198e-04, -4.255e-02, 1.860e-02, 2.319e-02, -1.573e-02, 7.366e-02, -6.204e-02, 3.113e-02, -3.469e-02, 2.894e-02, 1.208e-02, -3.099e-02, -4.035e-02, -6.633e-02, 1.054e-01)); + r += mul(s5_7, M4(1.281e-02, -4.798e-02, -1.861e-01, -2.665e-02, -9.502e-03, 3.205e-02, -3.900e-02, -2.003e-02, 6.833e-02, 3.285e-03, 3.673e-02, -1.353e-02, 1.255e-01, 1.799e-01, 3.839e-01, -9.228e-03)); + r += mul(s5_8, M4(-4.002e-02, -4.090e-02, -5.090e-02, 2.001e-02, -1.085e-01, -5.435e-02, 8.609e-02, 4.208e-03, 5.129e-02, -3.246e-02, 1.357e-03, -1.166e-02, 2.425e-02, -4.722e-02, -5.910e-02, -1.943e-02)); + r += mul(s6_0, M4(-4.657e-02, -4.365e-02, 1.855e-02, 1.686e-02, -5.174e-03, -2.762e-02, 3.044e-02, -4.493e-03, -4.455e-02, -6.010e-02, 5.274e-02, 4.504e-02, -5.616e-02, -8.778e-02, -1.062e-02, -2.164e-02)); + r += mul(s6_1, M4(-6.377e-03, -9.762e-02, -2.371e-02, -2.708e-02, -3.744e-02, -1.692e-01, -2.715e-02, 9.584e-02, 1.100e-01, -3.519e-02, -2.840e-02, 1.568e-02, 3.629e-02, -5.320e-02, 6.654e-02, -3.467e-02)); + r += mul(s6_2, M4(-8.152e-02, -7.546e-03, -2.494e-02, 5.560e-02, 2.547e-02, 6.245e-03, -3.433e-02, -5.634e-03, 4.568e-02, 7.593e-03, 2.321e-02, 6.044e-04, 2.275e-03, 6.351e-02, 2.180e-02, 2.776e-02)); + r += mul(s6_3, M4(3.938e-02, -4.175e-02, -1.703e-02, 6.867e-02, 1.547e-02, 4.972e-03, 1.693e-01, 3.867e-02, 1.203e-02, 1.163e-01, -1.831e-02, 4.121e-02, -1.257e-02, -3.650e-02, -5.777e-02, 3.162e-02)); + r += mul(s6_4, M4(-1.089e-01, -1.033e-02, -1.311e-01, -1.149e-02, -1.438e-03, 1.024e-01, -1.596e-01, -2.566e-01, 3.615e-02, 1.599e-01, 1.222e-01, 9.341e-02, -2.748e-02, 2.028e-02, 1.122e-02, -1.354e-01)); + r += mul(s6_5, M4(-1.415e-01, 3.870e-02, -1.051e-01, -6.938e-03, -6.274e-02, 5.740e-02, 8.951e-02, -5.256e-02, 6.098e-02, 3.744e-02, 1.375e-02, -1.474e-02, 1.328e-02, -6.412e-02, 6.594e-03, -9.309e-02)); + r += mul(s6_6, M4(-1.109e-02, -2.355e-02, 6.765e-02, 5.406e-02, -2.680e-02, 1.297e-02, 7.848e-02, -6.058e-02, 6.114e-02, 7.744e-02, 1.494e-02, -4.207e-02, 4.035e-02, 4.003e-02, -7.107e-02, -1.884e-02)); + r += mul(s6_7, M4(-8.515e-02, 2.844e-02, 7.553e-02, 1.075e-02, 1.320e-01, -2.922e-01, -1.579e-01, -6.371e-02, 1.280e-02, -1.929e-02, -1.225e-01, -1.209e-02, -4.205e-02, 3.344e-02, -5.664e-02, 4.004e-02)); + r += mul(s6_8, M4(-9.777e-02, -6.582e-02, 3.920e-02, 6.389e-03, 3.322e-02, -2.803e-02, -5.406e-02, -1.865e-02, 2.119e-02, 1.149e-01, -3.422e-02, -3.817e-02, -3.067e-02, 4.716e-02, -1.032e-01, 2.235e-02)); + r += mul(s7_0, M4(8.496e-03, 5.987e-02, 4.584e-02, 5.824e-02, -3.919e-02, -4.895e-02, 1.100e-01, 3.522e-02, -7.386e-03, -9.289e-02, 5.341e-02, 1.582e-02, -7.591e-02, -6.651e-04, 9.645e-02, 6.396e-02)); + r += mul(s7_1, M4(3.472e-02, 3.446e-02, 1.222e-02, 7.000e-02, -2.298e-02, -6.086e-02, -5.135e-02, 7.823e-02, 5.182e-03, 3.576e-02, 1.775e-01, 6.364e-02, 6.662e-02, -9.483e-04, -5.751e-03, -9.270e-03)); + r += mul(s7_2, M4(3.358e-02, 2.218e-02, 1.207e-01, 1.815e-02, -9.561e-03, -1.385e-02, -8.877e-02, -3.040e-03, 5.780e-02, 5.741e-02, -5.731e-02, 8.420e-02, -2.273e-02, 6.520e-02, 1.004e-02, 3.590e-02)); + r += mul(s7_3, M4(5.142e-02, -8.508e-03, -1.159e-02, -2.834e-02, -4.526e-02, 6.746e-02, 1.057e-01, -1.036e-01, 5.933e-02, -1.548e-01, 4.227e-02, 8.383e-02, -5.301e-02, 8.128e-02, -1.236e-01, -3.375e-03)); + r += mul(s7_4, M4(-5.605e-02, -1.155e-01, -9.862e-02, 4.081e-02, 1.326e-02, 4.698e-02, -2.698e-02, 6.181e-02, -3.167e-02, -6.973e-02, 2.052e-01, 8.491e-02, -3.532e-02, 6.526e-02, -3.787e-02, -5.853e-02)); + r += mul(s7_5, M4(-5.731e-02, 1.031e-01, -9.473e-02, -8.531e-03, 2.696e-02, 8.500e-02, 5.398e-02, 1.124e-01, 1.754e-01, 5.313e-02, 1.291e-01, -1.637e-02, -3.436e-02, 9.291e-02, -1.553e-02, -4.011e-02)); + r += mul(s7_6, M4(-5.448e-03, -7.619e-02, 2.262e-01, -1.853e-02, 3.073e-03, 2.042e-01, -1.654e-01, 7.605e-02, 4.162e-02, -9.305e-02, 9.896e-02, -3.766e-02, 2.231e-02, 7.078e-02, -2.020e-02, -2.443e-02)); + r += mul(s7_7, M4(2.423e-02, 1.639e-01, 3.665e-02, 4.298e-02, 5.405e-02, 9.624e-02, -2.319e-01, -1.499e-01, 2.105e-02, -4.502e-02, -1.867e-01, -1.004e-01, -1.021e-01, -1.292e-01, -3.473e-02, 3.257e-02)); + r += mul(s7_8, M4(6.504e-03, 1.106e-01, 7.303e-02, 1.007e-01, 1.818e-01, 1.160e-02, -9.286e-03, -1.160e-01, -4.789e-02, 4.493e-02, -8.081e-02, -8.938e-02, 2.520e-02, 4.247e-02, 3.953e-02, 6.861e-02)); + r += V4(2.674e-02, 5.572e-03, -1.712e-02, -1.438e-02); + return r; +} + +V4 f3(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-3.286e-02, -5.558e-02, 5.368e-03, 3.030e-02, -1.262e-02, 1.150e-02, -3.379e-02, -7.153e-02, -4.218e-03, -5.102e-02, 1.123e-01, -7.896e-02, 6.458e-03, 3.456e-02, -1.064e-01, -1.553e-01)); + r += mul(s0_1, M4(-4.861e-02, 3.643e-02, -3.731e-02, -9.669e-02, -1.237e-03, 6.117e-02, 9.559e-02, 1.336e-01, -1.348e-01, -8.136e-03, 1.444e-01, 1.200e-01, 6.525e-02, -8.019e-02, -1.538e-01, 2.949e-02)); + r += mul(s0_2, M4(-1.352e-01, 1.882e-02, -1.003e-01, 1.790e-02, -8.007e-02, -5.233e-03, -6.482e-03, 1.315e-01, 1.054e-03, 1.917e-02, 1.244e-02, 3.169e-02, 1.513e-01, 4.209e-02, 1.209e-02, 1.450e-01)); + r += mul(s0_3, M4(3.892e-02, -5.554e-02, -1.809e-02, 3.134e-02, -6.139e-02, 6.550e-02, -2.202e-02, -1.255e-01, 1.639e-02, 7.508e-02, 2.674e-01, -2.016e-02, -3.796e-02, -7.200e-02, -1.230e-01, -2.679e-02)); + r += mul(s0_4, M4(-5.442e-02, 2.733e-02, -1.801e-03, -2.134e-02, 9.374e-02, -2.165e-02, -1.593e-01, -1.614e-01, 2.401e-01, -1.075e-01, 9.997e-02, -5.962e-02, 2.714e-01, 2.665e-01, -2.994e-01, 8.561e-02)); + r += mul(s0_5, M4(-1.654e-01, -6.863e-02, -4.063e-02, 1.015e-02, -3.911e-03, -4.761e-02, 3.745e-02, -4.014e-02, -8.392e-03, 4.647e-03, 4.148e-02, -1.184e-01, 1.168e-01, -1.158e-01, -1.479e-02, -4.154e-02)); + r += mul(s0_6, M4(3.566e-02, 1.329e-01, 5.007e-02, 1.029e-01, -5.539e-02, -1.019e-02, 4.680e-02, -5.687e-03, 6.479e-03, -1.294e-02, 1.244e-01, 7.200e-02, 2.546e-02, 5.989e-02, -6.528e-02, 8.630e-02)); + r += mul(s0_7, M4(-8.646e-02, 1.731e-01, 9.482e-02, 8.726e-02, -8.075e-02, -5.263e-02, 1.207e-01, 9.825e-02, 3.145e-02, 3.826e-02, 7.561e-02, 8.651e-02, 2.112e-01, -2.415e-02, -1.399e-01, -1.141e-01)); + r += mul(s0_8, M4(5.204e-02, 1.790e-03, 4.330e-02, 1.759e-01, 7.105e-02, 5.055e-02, 1.284e-01, 2.851e-02, 6.014e-04, -3.710e-02, 5.909e-02, 4.122e-02, 9.774e-02, -8.960e-02, 6.467e-02, -2.063e-02)); + r += mul(s1_0, M4(1.483e-04, -8.302e-02, 2.958e-02, -9.205e-02, -8.072e-02, -9.046e-03, 1.077e-02, 3.121e-02, -5.374e-02, 1.027e-02, -4.329e-02, -9.952e-02, -1.073e-02, -4.699e-02, 2.717e-02, -9.122e-02)); + r += mul(s1_1, M4(7.848e-02, 6.429e-02, -2.606e-02, 4.148e-02, 2.932e-02, -2.389e-02, 1.253e-01, 1.724e-01, -1.283e-01, 6.969e-02, -4.918e-02, 2.244e-01, 3.852e-02, -3.114e-02, 9.021e-02, 3.441e-02)); + r += mul(s1_2, M4(-1.460e-02, 6.312e-02, -4.304e-02, 5.499e-02, -1.616e-01, 1.703e-02, -1.842e-02, 1.267e-01, -6.582e-02, -1.423e-03, 3.774e-02, -6.782e-02, 1.845e-02, 2.383e-02, -7.941e-03, -3.615e-02)); + r += mul(s1_3, M4(3.129e-02, -3.667e-02, -8.854e-02, -1.084e-01, -1.353e-02, 7.837e-02, -7.423e-02, 8.332e-02, -2.522e-05, -1.771e-03, -2.036e-01, -1.220e-03, -6.209e-02, 5.654e-03, 8.280e-02, -2.826e-02)); + r += mul(s1_4, M4(1.353e-02, 1.617e-01, 1.995e-01, 3.197e-02, 1.677e-01, -5.916e-02, -4.875e-02, -1.233e-01, 2.653e-01, 8.528e-03, -2.483e-01, -1.420e-01, 1.367e-01, 1.041e-01, -4.963e-02, 2.426e-01)); + r += mul(s1_5, M4(2.180e-02, -4.062e-02, 1.189e-03, -3.950e-02, -9.090e-02, -6.138e-02, -5.669e-03, -2.549e-02, 1.697e-02, 1.645e-01, 7.228e-02, -8.677e-03, -6.223e-02, -8.186e-02, 2.890e-02, 8.978e-02)); + r += mul(s1_6, M4(5.162e-02, 4.894e-02, -7.496e-02, -1.230e-01, -4.356e-02, -3.984e-02, 5.458e-02, 4.174e-02, -1.513e-01, -1.285e-02, -5.100e-02, -3.304e-03, -3.399e-02, 1.256e-01, 1.920e-02, 1.121e-01)); + r += mul(s1_7, M4(-4.488e-02, 1.591e-01, -1.624e-01, -8.467e-02, -1.239e-01, 2.445e-02, 1.997e-02, 1.639e-02, -6.134e-02, -2.105e-02, -2.311e-02, 4.681e-02, 8.311e-02, 1.185e-02, -9.454e-02, -3.118e-02)); + r += mul(s1_8, M4(-3.601e-03, -5.132e-02, 2.023e-02, -1.442e-02, 9.517e-02, 1.182e-01, 1.941e-02, 1.040e-02, -3.218e-02, -2.666e-02, 2.423e-02, -4.021e-02, -9.206e-02, 6.915e-02, 6.492e-03, -7.742e-02)); + r += mul(s2_0, M4(-3.682e-02, 7.720e-03, 6.424e-02, -4.937e-02, -9.706e-02, -4.218e-02, -1.654e-02, -1.787e-01, 1.144e-02, -2.757e-02, -6.188e-03, -2.244e-01, -1.874e-02, -2.107e-02, -5.218e-02, -1.371e-01)); + r += mul(s2_1, M4(7.475e-02, -1.432e-02, 9.054e-02, -1.267e-01, 7.644e-02, 4.824e-02, 1.019e-01, -8.470e-02, -4.102e-02, 1.201e-01, -1.280e-01, -7.696e-02, -5.082e-02, -7.261e-03, 3.320e-03, -2.208e-02)); + r += mul(s2_2, M4(-4.459e-02, -3.978e-02, 6.344e-02, 8.882e-02, -5.338e-02, -8.955e-02, 4.356e-02, 4.547e-02, -5.658e-04, 8.348e-02, 1.458e-02, -4.076e-02, 8.107e-02, -2.509e-03, 7.839e-02, 1.782e-02)); + r += mul(s2_3, M4(-3.090e-02, 5.185e-02, -2.392e-03, 9.523e-02, -4.333e-02, 4.541e-02, -1.031e-02, -7.619e-02, -1.044e-01, 1.775e-01, -1.146e-01, -1.942e-02, 1.260e-01, -2.625e-02, 1.437e-01, -1.042e-01)); + r += mul(s2_4, M4(-7.213e-02, -1.645e-01, -1.091e-02, -1.120e-01, 1.002e-01, -6.332e-02, 4.277e-02, 9.251e-02, 1.158e-01, 1.273e-01, -1.918e-03, -3.486e-01, -1.529e-01, -9.992e-02, -6.274e-02, -1.043e-01)); + r += mul(s2_5, M4(1.229e-01, 4.003e-02, -2.590e-02, -1.465e-02, -5.746e-02, -3.314e-02, -1.168e-02, 5.900e-03, -6.562e-03, 9.581e-02, -4.788e-02, 2.590e-02, 8.387e-02, 6.084e-02, -3.417e-02, -1.483e-01)); + r += mul(s2_6, M4(-8.101e-02, -2.068e-03, 1.652e-02, 6.369e-03, 1.646e-02, -3.940e-02, -2.581e-02, -7.013e-02, 1.263e-02, -2.072e-02, -1.128e-03, 2.931e-03, 2.252e-02, -6.322e-02, 5.656e-02, -6.017e-02)); + r += mul(s2_7, M4(-1.199e-02, -4.779e-02, -2.128e-02, -9.445e-02, 6.734e-03, 8.381e-03, 4.290e-03, 1.321e-01, -2.633e-02, 2.928e-02, -2.738e-01, -8.694e-02, 7.871e-02, -1.597e-02, -4.260e-02, -1.368e-01)); + r += mul(s2_8, M4(3.368e-02, 1.480e-02, 8.021e-02, -2.883e-02, -2.109e-02, 4.231e-02, 5.099e-02, -3.689e-02, -1.832e-02, 7.323e-02, -1.495e-01, -1.800e-02, 1.340e-01, -5.175e-02, 2.019e-02, 6.081e-02)); + r += mul(s3_0, M4(-3.042e-02, 4.959e-02, -1.628e-01, -7.205e-02, -1.110e-01, 1.615e-01, 6.012e-02, -2.321e-01, 7.382e-02, -3.659e-02, 3.137e-02, -3.680e-02, -1.551e-02, -8.853e-03, 4.016e-02, 4.906e-02)); + r += mul(s3_1, M4(2.155e-02, -2.277e-02, 2.107e-02, -1.744e-01, -1.159e-01, 1.025e-02, -8.337e-02, 1.050e-01, -5.261e-02, -9.656e-04, 7.279e-02, 6.861e-02, 3.067e-02, -9.676e-02, 1.065e-01, 1.728e-01)); + r += mul(s3_2, M4(-5.673e-02, -2.262e-02, -7.513e-02, -1.410e-02, -3.755e-02, 4.702e-02, 4.710e-02, 1.799e-01, 3.802e-02, -9.390e-02, 2.261e-02, 6.757e-02, 3.401e-02, -6.094e-02, -3.018e-02, 1.129e-01)); + r += mul(s3_3, M4(-1.184e-01, 8.267e-02, 3.124e-02, 4.827e-02, 6.686e-02, -1.382e-01, -2.837e-01, -9.711e-02, 1.829e-02, 1.057e-01, -1.102e-02, -3.657e-02, 9.744e-02, 5.657e-02, 6.135e-02, 8.644e-02)); + r += mul(s3_4, M4(-1.887e-02, 1.702e-02, 3.265e-02, -1.128e-01, 5.493e-02, 6.220e-02, -4.533e-02, 1.263e-01, -1.606e-01, -9.614e-02, -8.556e-02, -7.665e-02, -2.717e-01, 1.143e-01, 5.673e-02, -1.683e-01)); + r += mul(s3_5, M4(-1.469e-01, 9.381e-02, -3.942e-02, 5.832e-03, 1.271e-02, -9.744e-02, -8.614e-02, 1.966e-01, 5.591e-02, 4.514e-02, 1.686e-02, -3.298e-02, -2.189e-01, -5.892e-02, 7.834e-02, -9.585e-02)); + r += mul(s3_6, M4(-1.253e-01, -5.154e-02, -1.194e-01, -5.413e-03, 1.384e-01, 1.661e-02, -5.402e-02, -1.933e-01, -1.163e-01, -8.053e-02, 8.213e-02, 1.045e-01, -6.139e-02, 1.008e-02, 2.682e-02, 1.001e-01)); + r += mul(s3_7, M4(4.268e-02, -3.266e-02, -1.395e-01, -6.734e-02, -5.044e-02, -6.236e-02, 7.355e-03, 4.860e-02, 8.122e-02, 3.594e-03, 3.387e-02, -1.894e-02, -2.146e-02, -6.920e-02, -9.184e-02, 6.043e-02)); + r += mul(s3_8, M4(-4.537e-02, 5.305e-02, -3.223e-02, -1.099e-01, -1.532e-03, 1.298e-02, 1.705e-03, -8.713e-02, 5.724e-02, 4.936e-02, -7.022e-03, 1.310e-01, -1.455e-01, -1.002e-01, -8.992e-02, 8.949e-02)); + r += mul(s4_0, M4(-3.697e-02, 4.361e-02, -2.610e-02, 1.920e-01, -3.173e-02, -2.363e-02, 4.914e-02, -7.926e-02, 5.642e-03, 2.515e-02, -1.312e-02, 8.478e-02, -4.425e-02, 2.898e-02, -4.333e-02, 6.784e-02)); + r += mul(s4_1, M4(-8.282e-02, -2.400e-02, 1.423e-02, 1.713e-01, -6.289e-02, 6.815e-02, 4.288e-02, 2.298e-02, 6.929e-03, 1.687e-01, -1.356e-01, 2.107e-01, -2.664e-02, 7.643e-02, -4.448e-02, -1.391e-01)); + r += mul(s4_2, M4(2.527e-02, 5.359e-02, 8.032e-02, 9.965e-02, -4.367e-02, 1.715e-01, -2.134e-02, 1.266e-02, 1.772e-02, 4.026e-02, -1.407e-02, 2.958e-02, -1.089e-01, 1.555e-02, -9.794e-02, 7.503e-02)); + r += mul(s4_3, M4(9.838e-02, -9.237e-02, 3.059e-02, 7.839e-02, -1.064e-01, -8.478e-02, -1.488e-01, 3.929e-02, -5.543e-02, -1.410e-01, -1.136e-01, 4.460e-02, 1.230e-01, 9.507e-02, -1.495e-02, -3.650e-02)); + r += mul(s4_4, M4(2.052e-01, 2.177e-01, 3.370e-03, -2.671e-01, 1.070e-01, 3.138e-02, -2.049e-02, 5.616e-03, 6.318e-02, 7.942e-02, 1.357e-01, 2.034e-01, 5.404e-02, 5.505e-04, -1.138e-01, 1.522e-02)); + r += mul(s4_5, M4(3.260e-03, -1.496e-02, -1.751e-02, -4.540e-02, 8.747e-02, -1.052e-01, -4.517e-02, -4.559e-02, 7.249e-02, 2.862e-02, -9.665e-02, 2.203e-02, 1.041e-02, -2.682e-02, -5.846e-02, -5.967e-03)); + r += mul(s4_6, M4(6.904e-02, -1.075e-02, -1.133e-02, 5.641e-03, -2.339e-02, 3.848e-02, 1.617e-02, 1.096e-01, -4.710e-02, 3.860e-02, -9.364e-02, 2.710e-01, -2.919e-02, 5.043e-02, 6.705e-02, 6.533e-02)); + r += mul(s4_7, M4(-7.306e-02, -4.041e-02, 5.129e-02, -2.081e-01, -2.225e-02, -7.482e-02, -1.030e-01, 1.455e-01, -1.215e-03, 1.760e-02, -5.955e-02, 1.670e-01, -2.868e-02, 2.015e-02, -1.719e-02, -7.865e-03)); + r += mul(s4_8, M4(3.469e-02, -1.440e-01, -2.074e-02, 4.942e-04, -6.512e-02, -1.207e-02, 3.899e-02, 4.409e-02, -4.425e-02, 1.354e-01, -5.201e-02, 5.339e-02, -1.733e-02, -1.068e-02, -4.068e-02, -8.847e-02)); + r += mul(s5_0, M4(-1.367e-02, -4.043e-03, -1.633e-01, 5.634e-02, -5.067e-02, 1.046e-02, 7.233e-02, -1.344e-01, -1.035e-02, 2.570e-02, 3.489e-02, -7.652e-02, -4.584e-02, 6.309e-02, 1.590e-02, 6.861e-03)); + r += mul(s5_1, M4(5.945e-02, -2.522e-03, 4.441e-02, -9.294e-02, 5.266e-02, 3.490e-02, 1.257e-01, -1.192e-01, 6.795e-02, -3.041e-02, 1.785e-03, -2.690e-02, 7.588e-03, -5.267e-02, -2.006e-01, 5.573e-02)); + r += mul(s5_2, M4(-2.075e-02, 2.788e-02, -6.472e-02, -1.199e-03, -7.163e-02, -1.456e-02, 8.793e-02, -3.651e-02, -2.027e-02, -9.538e-02, 4.177e-02, 6.392e-02, 1.057e-01, 1.165e-01, 1.953e-01, -1.987e-02)); + r += mul(s5_3, M4(7.941e-03, 2.435e-03, 1.518e-01, 2.483e-02, -8.035e-02, -3.836e-02, 1.098e-01, 1.050e-04, -2.651e-02, -8.799e-02, -9.291e-02, -1.290e-01, 2.334e-01, 1.460e-01, 1.496e-01, -1.747e-01)); + r += mul(s5_4, M4(1.113e-01, -2.526e-03, 2.216e-02, -2.775e-02, 1.863e-01, 1.006e-01, 2.760e-01, -1.442e-02, -7.379e-02, -4.404e-02, 7.299e-02, 4.975e-02, -5.748e-02, 2.627e-01, 3.282e-02, -4.485e-03)); + r += mul(s5_5, M4(-1.942e-01, -3.099e-02, -3.280e-02, 2.924e-02, -7.790e-02, 6.897e-02, 2.725e-02, -1.199e-01, -1.954e-02, 5.724e-03, -1.389e-02, 1.754e-02, 5.152e-02, 4.100e-03, 5.325e-02, -4.843e-02)); + r += mul(s5_6, M4(4.486e-02, 3.828e-02, -2.625e-02, -1.493e-01, -3.824e-02, 2.764e-02, 1.300e-02, -4.650e-02, 3.270e-02, 4.272e-02, -2.518e-02, -4.634e-02, 1.756e-01, 2.771e-01, -1.520e-01, -8.914e-02)); + r += mul(s5_7, M4(-2.086e-02, -6.906e-02, 3.829e-02, -5.269e-02, 1.029e-01, -7.007e-03, 2.265e-02, -7.822e-02, -6.078e-02, -6.558e-02, 1.199e-02, 3.040e-02, 1.628e-01, -1.604e-03, 7.271e-02, 7.569e-02)); + r += mul(s5_8, M4(3.105e-02, -2.946e-02, -3.952e-02, 1.162e-01, -9.094e-02, 1.909e-02, 8.129e-02, -1.816e-02, -4.012e-02, -3.152e-02, -4.212e-02, 6.397e-03, -6.599e-02, -2.003e-02, 3.821e-02, -3.672e-02)); + r += mul(s6_0, M4(4.164e-02, 2.871e-02, 3.507e-02, -2.261e-01, 4.606e-02, -5.383e-02, -3.568e-02, -4.125e-02, 1.077e-01, 4.435e-02, 1.753e-02, -4.489e-02, 5.527e-02, 4.169e-02, 6.259e-02, -1.311e-01)); + r += mul(s6_1, M4(2.440e-02, 5.512e-02, 1.154e-02, 1.627e-01, 2.868e-02, -9.865e-02, 4.651e-02, -3.851e-02, -4.680e-02, -2.606e-02, 7.456e-02, 3.369e-02, -1.593e-02, 3.015e-02, 2.959e-02, -2.216e-02)); + r += mul(s6_2, M4(2.586e-03, 1.205e-02, 3.081e-02, 1.315e-02, 2.864e-02, -2.026e-02, -2.931e-04, -6.621e-02, -6.064e-02, 3.550e-02, -1.861e-02, -5.051e-02, 2.220e-02, 2.607e-02, 7.668e-04, -5.065e-02)); + r += mul(s6_3, M4(3.330e-03, 4.963e-02, -7.611e-03, -1.310e-01, -1.458e-01, 9.381e-02, 1.141e-02, -4.524e-03, 7.509e-02, -1.537e-01, -6.698e-02, -9.922e-02, 1.177e-02, 7.349e-02, 3.935e-02, -2.087e-01)); + r += mul(s6_4, M4(-5.103e-03, 2.970e-01, -2.611e-02, -2.675e-03, -1.750e-01, -1.254e-01, 1.185e-01, -1.050e-01, -2.447e-02, -1.954e-02, -1.246e-01, 1.211e-01, -9.887e-02, -5.790e-02, 1.165e-01, -5.261e-02)); + r += mul(s6_5, M4(-5.677e-02, 5.446e-02, -7.142e-02, -2.665e-01, -9.979e-02, -7.104e-02, 2.303e-02, 4.827e-02, 2.460e-02, -1.170e-01, -2.289e-02, -1.120e-01, -1.888e-02, 1.559e-04, 4.714e-02, -4.896e-03)); + r += mul(s6_6, M4(1.157e-01, 1.833e-01, 5.169e-02, -1.331e-01, 6.034e-02, 9.362e-02, 1.058e-01, -1.742e-01, -1.202e-01, -8.411e-02, 7.993e-02, 6.521e-02, 6.710e-04, -1.153e-01, 2.861e-02, 4.359e-02)); + r += mul(s6_7, M4(-1.565e-02, 1.589e-01, 1.325e-01, 1.399e-02, 7.785e-02, -3.601e-02, 5.482e-02, -1.596e-02, 9.978e-02, 1.804e-02, 1.243e-01, 2.677e-02, -1.812e-01, -1.244e-02, -4.210e-02, -1.077e-01)); + r += mul(s6_8, M4(-2.383e-02, 9.994e-02, -1.086e-02, -1.963e-01, 9.990e-02, 6.315e-02, 1.856e-02, 5.164e-04, 2.123e-02, -6.209e-02, 3.422e-02, 1.179e-02, 7.026e-02, 9.449e-02, -2.705e-02, -1.677e-01)); + r += mul(s7_0, M4(-2.026e-02, 1.936e-02, 9.827e-03, 9.698e-02, 1.444e-02, -9.873e-02, -5.168e-02, 3.925e-02, -2.737e-02, -1.437e-02, -7.603e-02, 1.765e-01, 1.151e-01, 1.229e-02, 5.526e-02, -7.669e-02)); + r += mul(s7_1, M4(5.080e-02, -7.782e-03, 2.317e-02, 1.043e-01, 2.755e-02, -1.340e-01, 3.490e-02, 3.466e-02, 3.210e-02, 9.935e-02, 1.024e-03, 7.715e-02, -8.228e-02, -1.998e-03, 6.091e-02, 1.252e-01)); + r += mul(s7_2, M4(-7.570e-02, -7.490e-02, -6.378e-02, 1.928e-01, 6.937e-03, -4.652e-03, -1.323e-02, -6.992e-02, -1.105e-01, -1.010e-01, -6.574e-02, 5.709e-02, 1.372e-01, -5.210e-02, -1.230e-02, -2.030e-01)); + r += mul(s7_3, M4(-7.554e-02, 5.436e-03, 3.024e-02, 3.049e-02, -4.402e-02, 6.087e-02, 1.615e-01, -1.553e-01, -8.422e-02, -6.811e-02, -1.066e-01, 1.607e-02, 1.481e-01, 5.693e-02, -1.473e-01, -1.700e-01)); + r += mul(s7_4, M4(-4.538e-02, -7.853e-02, -1.336e-01, -1.226e-02, 5.502e-02, 3.131e-01, 1.725e-01, 6.103e-03, 2.748e-02, 6.264e-02, 4.061e-03, 3.578e-01, -7.168e-02, -1.584e-01, 7.857e-02, 6.613e-02)); + r += mul(s7_5, M4(-1.230e-01, -1.534e-01, -2.561e-03, -1.971e-02, 4.204e-02, -7.444e-03, 1.724e-03, -3.681e-02, 6.427e-02, -8.760e-03, 2.615e-02, -3.291e-02, 4.349e-02, -4.618e-02, 1.045e-04, -1.185e-01)); + r += mul(s7_6, M4(-7.975e-03, 7.494e-02, 1.482e-01, 1.397e-01, -2.783e-02, -1.124e-01, 3.515e-02, -6.958e-02, -1.207e-01, 9.840e-02, 6.669e-02, 4.788e-02, -4.741e-03, -3.077e-02, 8.715e-02, 9.574e-02)); + r += mul(s7_7, M4(1.235e-01, 1.762e-02, 8.508e-04, 5.826e-02, -2.263e-01, -1.343e-01, 1.080e-01, 3.797e-02, 4.121e-02, 4.401e-02, 6.985e-02, 4.008e-03, -2.648e-01, 1.059e-01, -2.543e-02, 2.075e-01)); + r += mul(s7_8, M4(-2.713e-02, -7.462e-02, 6.808e-02, 5.364e-03, 7.419e-02, -6.790e-02, -8.942e-03, 2.821e-02, -1.603e-02, 8.469e-03, 2.062e-03, 8.538e-03, 7.823e-02, 4.336e-02, -7.648e-02, -1.649e-01)); + r += V4(6.569e-03, 6.884e-03, -2.693e-02, 6.307e-03); + return r; +} + +void Pass13(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = Rmp8x8(tid.x) + blockStart; + uint2 size = GetInputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = (gxy + 0.5) * pt; + + V4 s0_0 = l0(-1.0, -1.0); + V4 s0_1 = l0(0.0, -1.0); + V4 s0_2 = l0(1.0, -1.0); + V4 s0_3 = l0(-1.0, 0.0); + V4 s0_4 = l0(0.0, 0.0); + V4 s0_5 = l0(1.0, 0.0); + V4 s0_6 = l0(-1.0, 1.0); + V4 s0_7 = l0(0.0, 1.0); + V4 s0_8 = l0(1.0, 1.0); + V4 s1_0 = -max(-s0_0, 0.0); + V4 s1_1 = -max(-s0_1, 0.0); + V4 s1_2 = -max(-s0_2, 0.0); + V4 s1_3 = -max(-s0_3, 0.0); + V4 s1_4 = -max(-s0_4, 0.0); + V4 s1_5 = -max(-s0_5, 0.0); + V4 s1_6 = -max(-s0_6, 0.0); + V4 s1_7 = -max(-s0_7, 0.0); + V4 s1_8 = -max(-s0_8, 0.0); + s0_0 = max(s0_0, 0.0); + s0_1 = max(s0_1, 0.0); + s0_2 = max(s0_2, 0.0); + s0_3 = max(s0_3, 0.0); + s0_4 = max(s0_4, 0.0); + s0_5 = max(s0_5, 0.0); + s0_6 = max(s0_6, 0.0); + s0_7 = max(s0_7, 0.0); + s0_8 = max(s0_8, 0.0); + + V4 s2_0 = l1(-1.0, -1.0); + V4 s2_1 = l1(0.0, -1.0); + V4 s2_2 = l1(1.0, -1.0); + V4 s2_3 = l1(-1.0, 0.0); + V4 s2_4 = l1(0.0, 0.0); + V4 s2_5 = l1(1.0, 0.0); + V4 s2_6 = l1(-1.0, 1.0); + V4 s2_7 = l1(0.0, 1.0); + V4 s2_8 = l1(1.0, 1.0); + V4 s3_0 = -max(-s2_0, 0.0); + V4 s3_1 = -max(-s2_1, 0.0); + V4 s3_2 = -max(-s2_2, 0.0); + V4 s3_3 = -max(-s2_3, 0.0); + V4 s3_4 = -max(-s2_4, 0.0); + V4 s3_5 = -max(-s2_5, 0.0); + V4 s3_6 = -max(-s2_6, 0.0); + V4 s3_7 = -max(-s2_7, 0.0); + V4 s3_8 = -max(-s2_8, 0.0); + s2_0 = max(s2_0, 0.0); + s2_1 = max(s2_1, 0.0); + s2_2 = max(s2_2, 0.0); + s2_3 = max(s2_3, 0.0); + s2_4 = max(s2_4, 0.0); + s2_5 = max(s2_5, 0.0); + s2_6 = max(s2_6, 0.0); + s2_7 = max(s2_7, 0.0); + s2_8 = max(s2_8, 0.0); + + V4 s4_0 = l2(-1.0, -1.0); + V4 s4_1 = l2(0.0, -1.0); + V4 s4_2 = l2(1.0, -1.0); + V4 s4_3 = l2(-1.0, 0.0); + V4 s4_4 = l2(0.0, 0.0); + V4 s4_5 = l2(1.0, 0.0); + V4 s4_6 = l2(-1.0, 1.0); + V4 s4_7 = l2(0.0, 1.0); + V4 s4_8 = l2(1.0, 1.0); + V4 s5_0 = -max(-s4_0, 0.0); + V4 s5_1 = -max(-s4_1, 0.0); + V4 s5_2 = -max(-s4_2, 0.0); + V4 s5_3 = -max(-s4_3, 0.0); + V4 s5_4 = -max(-s4_4, 0.0); + V4 s5_5 = -max(-s4_5, 0.0); + V4 s5_6 = -max(-s4_6, 0.0); + V4 s5_7 = -max(-s4_7, 0.0); + V4 s5_8 = -max(-s4_8, 0.0); + s4_0 = max(s4_0, 0.0); + s4_1 = max(s4_1, 0.0); + s4_2 = max(s4_2, 0.0); + s4_3 = max(s4_3, 0.0); + s4_4 = max(s4_4, 0.0); + s4_5 = max(s4_5, 0.0); + s4_6 = max(s4_6, 0.0); + s4_7 = max(s4_7, 0.0); + s4_8 = max(s4_8, 0.0); + + V4 s6_0 = l3(-1.0, -1.0); + V4 s6_1 = l3(0.0, -1.0); + V4 s6_2 = l3(1.0, -1.0); + V4 s6_3 = l3(-1.0, 0.0); + V4 s6_4 = l3(0.0, 0.0); + V4 s6_5 = l3(1.0, 0.0); + V4 s6_6 = l3(-1.0, 1.0); + V4 s6_7 = l3(0.0, 1.0); + V4 s6_8 = l3(1.0, 1.0); + V4 s7_0 = -max(-s6_0, 0.0); + V4 s7_1 = -max(-s6_1, 0.0); + V4 s7_2 = -max(-s6_2, 0.0); + V4 s7_3 = -max(-s6_3, 0.0); + V4 s7_4 = -max(-s6_4, 0.0); + V4 s7_5 = -max(-s6_5, 0.0); + V4 s7_6 = -max(-s6_6, 0.0); + V4 s7_7 = -max(-s6_7, 0.0); + V4 s7_8 = -max(-s6_8, 0.0); + s6_0 = max(s6_0, 0.0); + s6_1 = max(s6_1, 0.0); + s6_2 = max(s6_2, 0.0); + s6_3 = max(s6_3, 0.0); + s6_4 = max(s6_4, 0.0); + s6_5 = max(s6_5, 0.0); + s6_6 = max(s6_6, 0.0); + s6_7 = max(s6_7, 0.0); + s6_8 = max(s6_8, 0.0); + + t0[gxy] = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t1[gxy] = f1(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t2[gxy] = f2(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t3[gxy] = f3(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); +} + +//!PASS 14 +//!DESC conv13 +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 +//!IN t0, t1, t2, t3 +//!OUT t4, t5, t6, t7 + +#define l0(x, y) V4(O(t0, float2(x, y))) +#define l1(x, y) V4(O(t1, float2(x, y))) +#define l2(x, y) V4(O(t2, float2(x, y))) +#define l3(x, y) V4(O(t3, float2(x, y))) + +V4 f0(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-1.293e-01, -3.164e-02, -4.305e-02, -4.153e-02, 1.083e-02, 3.443e-02, 9.194e-03, 3.305e-03, 7.443e-02, -6.503e-02, -1.639e-02, 1.467e-02, 1.861e-01, -7.023e-03, -1.710e-02, 2.163e-03)); + r += mul(s0_1, M4(-1.831e-01, -9.969e-02, -9.017e-02, 6.240e-02, 1.156e-01, 1.227e-01, -5.195e-02, -1.414e-01, 2.352e-03, -3.372e-02, -2.448e-02, -1.223e-01, 8.668e-02, 3.721e-02, 4.414e-02, -7.547e-02)); + r += mul(s0_2, M4(-3.738e-02, 5.256e-03, -5.123e-02, -1.541e-03, 4.179e-02, -8.270e-02, -4.111e-02, -5.965e-02, 7.282e-02, 1.006e-04, -1.048e-02, 4.996e-03, -1.551e-02, 2.408e-02, 4.269e-03, -3.604e-02)); + r += mul(s0_3, M4(1.295e-03, -4.506e-02, 5.793e-02, 4.585e-02, -7.363e-02, -1.660e-01, -5.246e-02, -1.778e-01, 1.307e-01, -5.384e-02, 2.766e-02, -2.498e-02, 1.321e-01, -1.912e-02, -2.638e-02, -6.578e-02)); + r += mul(s0_4, M4(5.700e-02, -1.475e-02, 3.855e-02, -4.138e-02, 1.441e-02, 3.087e-01, -4.294e-03, 3.341e-02, -2.105e-02, -1.786e-01, 1.411e-01, 9.892e-02, 2.347e-01, 2.646e-03, 1.039e-01, -3.054e-02)); + r += mul(s0_5, M4(3.613e-02, 3.202e-02, 6.025e-02, -2.920e-03, -2.235e-02, 2.182e-02, -2.037e-03, -5.479e-02, -7.034e-02, -2.745e-01, -1.952e-01, -1.087e-01, -2.984e-02, 1.009e-01, -4.008e-02, -8.082e-02)); + r += mul(s0_6, M4(-4.063e-02, -2.746e-02, -1.033e-02, 1.731e-02, 2.938e-01, 3.660e-02, 4.929e-02, -3.881e-02, 5.079e-02, -3.675e-02, 1.402e-02, 7.380e-02, 3.691e-02, 1.402e-02, 5.604e-02, 3.162e-02)); + r += mul(s0_7, M4(9.007e-02, 7.977e-03, 3.092e-02, 1.681e-02, 1.467e-01, 9.255e-02, 2.936e-02, -1.374e-01, 2.972e-01, 7.402e-03, -2.492e-02, -5.690e-02, -1.368e-01, 5.772e-02, 9.572e-02, 3.849e-02)); + r += mul(s0_8, M4(4.821e-02, -9.248e-02, -2.006e-02, -5.064e-02, 7.278e-02, 2.933e-02, -3.106e-03, -5.832e-02, -4.986e-02, -1.631e-01, -1.189e-01, 6.368e-02, -5.563e-02, 1.126e-01, 1.435e-02, 2.510e-02)); + r += mul(s1_0, M4(-5.301e-02, -1.038e-01, -4.458e-02, 2.034e-02, -3.081e-02, 2.101e-02, -5.794e-02, 8.038e-02, -4.012e-02, -3.779e-02, 1.219e-02, 5.236e-03, 1.165e-01, 1.454e-03, 3.993e-03, -2.968e-03)); + r += mul(s1_1, M4(-7.366e-02, -1.320e-01, -7.431e-02, 6.910e-03, -9.079e-02, -1.094e-02, 5.943e-02, -1.248e-02, -7.584e-03, 3.828e-02, 1.393e-02, -7.314e-02, -3.506e-02, -8.241e-03, 7.150e-02, -3.944e-02)); + r += mul(s1_2, M4(4.268e-02, 8.010e-02, -2.553e-01, -3.435e-03, -3.556e-02, -1.023e-01, -5.027e-02, 4.978e-03, 3.110e-02, 6.913e-02, -3.337e-03, 2.373e-03, 1.011e-01, -1.089e-03, 1.063e-02, -3.405e-02)); + r += mul(s1_3, M4(-3.829e-02, -1.711e-02, 2.150e-02, 4.636e-02, -8.814e-02, -1.242e-01, 7.370e-03, -7.349e-02, 6.136e-02, 9.069e-03, 2.292e-02, -6.553e-03, -3.025e-02, 3.977e-02, -2.112e-02, -7.195e-02)); + r += mul(s1_4, M4(-1.946e-01, -6.032e-02, 1.162e-02, -1.805e-01, -1.251e-02, 2.560e-01, 2.557e-02, -2.600e-02, -6.459e-02, -1.665e-01, 2.803e-02, 2.584e-01, -1.652e-01, -8.344e-02, -2.681e-02, 5.222e-02)); + r += mul(s1_5, M4(5.220e-02, -9.697e-03, -5.502e-02, 3.250e-02, -5.076e-02, 1.502e-02, -2.256e-02, 2.525e-02, 1.060e-01, -3.222e-02, 1.589e-02, -8.002e-02, -9.389e-02, -5.412e-02, -6.140e-02, -1.801e-02)); + r += mul(s1_6, M4(2.848e-02, 2.843e-03, 1.340e-02, -1.990e-02, 8.199e-02, 1.340e-02, -2.848e-02, 4.275e-04, -5.901e-03, 3.337e-02, -3.732e-03, 1.351e-02, 2.862e-02, -3.562e-02, 5.545e-02, 4.850e-02)); + r += mul(s1_7, M4(6.224e-02, 5.282e-02, 8.999e-03, 7.328e-02, 1.065e-01, -1.930e-02, 6.903e-04, -4.263e-03, -9.940e-02, 3.987e-02, -6.854e-02, 1.161e-02, -2.139e-01, 5.007e-02, 1.676e-02, 5.381e-02)); + r += mul(s1_8, M4(3.104e-02, -7.188e-02, -8.811e-02, -8.890e-02, -1.515e-02, 3.806e-02, 2.338e-02, 7.566e-02, 6.664e-02, -1.111e-01, -5.906e-02, 7.995e-02, 5.745e-02, 2.909e-02, 4.472e-02, 2.643e-02)); + r += mul(s2_0, M4(1.828e-01, 7.161e-02, -5.382e-02, 8.720e-02, 2.770e-01, 3.190e-01, 1.109e-02, 1.240e-01, 8.591e-02, 3.506e-03, -1.773e-02, -1.598e-02, -3.199e-02, 7.221e-02, 2.003e-02, -2.213e-02)); + r += mul(s2_1, M4(-1.358e-01, 1.293e-01, -7.900e-02, 3.686e-02, 4.384e-02, 1.363e-01, -4.337e-03, 8.852e-02, 9.720e-02, 7.495e-02, 4.065e-02, -2.138e-01, -8.145e-02, -1.186e-02, -1.101e-01, 1.461e-02)); + r += mul(s2_2, M4(-1.170e-01, -1.441e-01, -1.500e-01, -4.904e-02, -1.960e-02, 3.165e-02, 8.069e-02, 4.081e-02, -1.704e-01, 2.608e-02, -1.044e-01, -6.156e-02, 1.214e-03, 8.534e-02, -3.623e-02, 2.545e-02)); + r += mul(s2_3, M4(2.213e-01, -1.509e-01, -1.883e-01, 1.552e-01, 2.009e-01, 1.419e-01, 8.180e-02, 2.316e-03, -7.246e-02, 2.027e-01, 6.280e-02, -3.107e-02, -7.235e-02, -1.269e-03, -7.734e-02, 1.197e-01)); + r += mul(s2_4, M4(7.125e-02, 1.309e-02, -9.378e-02, -2.830e-02, 8.757e-02, 2.510e-01, 3.676e-02, -7.276e-02, -1.265e-01, -1.840e-01, -2.401e-01, -2.073e-01, -1.402e-01, 2.373e-01, -1.422e-01, 4.767e-02)); + r += mul(s2_5, M4(7.518e-03, 1.447e-01, 3.432e-03, 7.814e-03, 5.761e-02, 7.782e-02, 9.553e-02, 7.358e-02, -1.961e-01, 1.566e-01, 2.421e-02, -6.521e-02, -1.866e-01, 2.626e-02, -1.451e-01, 9.506e-02)); + r += mul(s2_6, M4(-1.379e-02, -2.517e-02, -8.003e-02, -3.300e-02, 4.645e-02, 8.662e-02, -1.803e-04, 1.413e-02, 9.272e-02, 1.265e-01, 8.964e-02, 2.082e-02, -6.214e-02, -4.795e-02, -6.786e-02, -6.251e-02)); + r += mul(s2_7, M4(2.703e-02, 4.670e-02, -9.434e-04, -1.845e-02, -3.249e-02, -4.444e-02, 3.395e-02, -4.206e-03, 1.843e-01, -6.523e-02, 2.182e-02, 6.783e-03, -6.421e-02, 8.621e-02, 1.154e-02, -6.480e-02)); + r += mul(s2_8, M4(-1.291e-02, -4.946e-02, -5.154e-02, -1.505e-03, -1.007e-01, 7.686e-02, 1.823e-02, 4.207e-02, -4.411e-02, 6.437e-02, 2.013e-02, -1.028e-01, -5.362e-02, 1.166e-01, 4.791e-02, 1.842e-02)); + r += mul(s3_0, M4(-1.644e-01, -9.269e-02, -3.241e-02, 4.436e-02, 4.739e-02, -1.260e-02, -1.015e-02, 4.152e-02, 3.481e-02, -6.795e-03, 6.743e-02, 3.118e-02, 1.704e-01, 2.709e-02, 7.192e-02, 1.166e-02)); + r += mul(s3_1, M4(-1.415e-01, -1.133e-01, -6.851e-02, 9.254e-03, 9.259e-02, 5.742e-02, -1.557e-01, 1.312e-01, 8.420e-02, 5.161e-02, -3.297e-02, -3.678e-02, 3.088e-02, 1.418e-01, -3.458e-02, 7.107e-02)); + r += mul(s3_2, M4(1.333e-02, -4.073e-02, -6.169e-02, -1.772e-02, -1.517e-02, 7.551e-02, -1.725e-02, -4.259e-02, 8.651e-03, -4.193e-02, -9.653e-03, 2.440e-02, 6.045e-02, 2.762e-03, 2.259e-02, -2.915e-02)); + r += mul(s3_3, M4(2.404e-03, -8.257e-02, -2.909e-03, 4.371e-02, -1.488e-02, -1.551e-02, 1.178e-02, -2.847e-02, -7.495e-02, -1.241e-02, -4.033e-02, -5.520e-02, 7.617e-02, -7.622e-02, 9.625e-03, -4.128e-02)); + r += mul(s3_4, M4(3.427e-03, 2.843e-01, -5.127e-02, -1.121e-01, -7.183e-02, -9.594e-02, -5.560e-02, -2.600e-01, -1.983e-02, -3.479e-02, -8.615e-02, -1.030e-01, 1.907e-02, 3.300e-02, -3.690e-02, -2.423e-02)); + r += mul(s3_5, M4(7.713e-02, -2.037e-02, 6.728e-04, -1.092e-01, -1.090e-01, 7.324e-02, 1.815e-02, 1.934e-01, 5.432e-04, 8.149e-03, 3.377e-02, 1.305e-02, -1.524e-02, -6.798e-02, 6.293e-02, 3.912e-03)); + r += mul(s3_6, M4(3.055e-02, -1.343e-02, -3.071e-02, -1.147e-02, 1.201e-01, -2.132e-02, 3.523e-02, -1.675e-01, -1.808e-02, 9.744e-02, 4.147e-02, -4.336e-02, 5.417e-02, -3.875e-02, -1.704e-02, -1.180e-01)); + r += mul(s3_7, M4(-4.933e-02, 1.147e-01, 2.018e-02, 6.987e-02, 1.260e-01, -1.100e-01, -1.945e-02, -1.754e-02, 3.246e-02, 6.750e-02, -3.140e-02, -2.553e-02, 1.028e-01, 5.734e-03, 7.628e-02, 8.382e-02)); + r += mul(s3_8, M4(-1.928e-02, 1.842e-02, 8.692e-02, 5.390e-02, 4.568e-02, -4.408e-02, 4.308e-02, -1.523e-01, -2.739e-02, -1.093e-02, 4.826e-02, -4.495e-02, 9.926e-02, 5.030e-02, 5.833e-02, -2.268e-02)); + r += mul(s4_0, M4(6.914e-02, 6.811e-02, 3.761e-02, -5.384e-02, -3.618e-03, 1.077e-02, 1.239e-02, 7.690e-02, -6.556e-02, 7.989e-02, -7.325e-03, -6.799e-02, 2.380e-02, 6.660e-02, 5.495e-02, -4.745e-02)); + r += mul(s4_1, M4(4.836e-03, 2.223e-01, 6.137e-02, 1.015e-01, 1.798e-02, -5.505e-03, -8.869e-03, -7.210e-02, -1.624e-01, -6.293e-02, -2.680e-02, 9.346e-02, 1.380e-01, -8.661e-02, 4.515e-02, 4.240e-02)); + r += mul(s4_2, M4(-6.804e-02, 1.127e-02, -2.572e-02, 3.496e-02, -8.525e-03, -6.274e-02, -3.604e-02, -4.725e-02, -5.312e-02, -8.806e-02, -3.529e-02, -3.447e-02, 4.698e-02, -4.421e-04, 3.393e-02, -8.021e-03)); + r += mul(s4_3, M4(-6.061e-02, 4.285e-02, -1.218e-01, 6.028e-02, 1.878e-02, -8.686e-03, -2.590e-02, 3.975e-02, 7.884e-02, 4.833e-02, -3.334e-02, 2.402e-02, 7.826e-02, 5.420e-02, -5.012e-02, 4.519e-02)); + r += mul(s4_4, M4(-1.290e-01, 8.998e-03, -1.931e-01, 1.198e-01, -3.256e-02, 1.311e-01, -1.032e-01, 1.870e-02, -3.907e-02, -1.459e-01, -4.729e-02, 1.109e-01, -3.523e-02, -1.051e-01, -2.727e-01, -1.157e-02)); + r += mul(s4_5, M4(-7.794e-02, 4.458e-02, 6.071e-02, 9.567e-02, 4.364e-03, -1.410e-01, -1.162e-01, 5.534e-03, 4.978e-02, 1.119e-02, 4.228e-02, 1.397e-01, -3.146e-02, 3.212e-03, -7.790e-02, 4.042e-02)); + r += mul(s4_6, M4(2.847e-02, 1.136e-01, -1.699e-02, 2.081e-02, 1.397e-01, -9.842e-02, -8.220e-03, -3.794e-02, 5.221e-03, -3.120e-02, -4.743e-02, -2.860e-02, -8.238e-02, 2.748e-02, 2.975e-02, 4.382e-02)); + r += mul(s4_7, M4(-5.192e-02, -3.529e-02, -6.300e-03, -3.442e-02, 4.006e-03, 2.780e-02, 3.457e-02, -8.588e-02, -3.943e-02, 1.708e-02, -7.220e-02, -4.744e-02, -1.007e-01, -5.533e-02, 9.120e-02, 1.251e-01)); + r += mul(s4_8, M4(-8.423e-02, 1.019e-02, 1.364e-02, 6.687e-02, -1.504e-03, 3.593e-02, 4.618e-02, 5.315e-03, -8.243e-04, 7.704e-02, -1.088e-02, -6.900e-02, 3.929e-02, 3.804e-03, -6.372e-02, 7.549e-02)); + r += mul(s5_0, M4(6.951e-02, 1.242e-01, 1.260e-02, -6.354e-02, -1.712e-01, -1.040e-01, 6.037e-02, -3.848e-02, 1.165e-01, 4.112e-02, -4.670e-02, -1.185e-01, -2.004e-02, 3.090e-03, 2.409e-02, -1.401e-01)); + r += mul(s5_1, M4(9.496e-02, -2.072e-02, -1.813e-02, -2.687e-02, -6.891e-02, 3.486e-02, -6.161e-02, 1.796e-01, 1.867e-02, -4.973e-02, -4.871e-02, -4.193e-03, 5.222e-02, 6.034e-02, 6.994e-02, -1.049e-01)); + r += mul(s5_2, M4(1.804e-02, 9.443e-03, 7.466e-03, 5.868e-03, -2.372e-02, -4.161e-02, -2.034e-01, -7.148e-02, 1.966e-02, -9.410e-02, -4.377e-02, 1.338e-02, -3.065e-02, 2.147e-02, -8.088e-02, 3.253e-02)); + r += mul(s5_3, M4(-2.028e-01, -1.635e-02, 9.419e-03, 1.403e-01, 2.690e-02, 6.186e-03, -2.235e-04, 1.512e-01, 5.191e-03, 7.650e-02, -1.496e-02, 2.694e-02, -1.087e-01, 3.270e-02, -4.237e-02, -1.219e-01)); + r += mul(s5_4, M4(-1.851e-01, -1.129e-01, 1.542e-01, 3.088e-01, -1.642e-02, 8.798e-02, -2.252e-01, -5.032e-03, 3.164e-02, -3.783e-02, -1.338e-01, 1.552e-01, 3.572e-02, 1.806e-01, -8.001e-02, -3.658e-01)); + r += mul(s5_5, M4(-5.363e-02, 2.284e-03, 5.092e-03, 6.959e-02, 1.681e-01, -1.139e-01, -7.353e-02, 3.406e-02, 5.790e-02, -1.616e-01, -7.873e-03, 1.148e-01, -1.011e-01, 4.432e-02, -1.495e-02, 2.734e-02)); + r += mul(s5_6, M4(1.455e-03, -2.003e-02, -4.008e-02, -4.248e-02, -9.500e-04, 2.532e-02, 2.507e-02, -4.032e-02, -1.464e-02, -5.039e-02, -9.448e-02, -7.201e-02, -2.984e-02, -7.626e-02, -3.012e-02, 8.289e-02)); + r += mul(s5_7, M4(-4.532e-02, 5.196e-03, 9.819e-02, -4.660e-02, -1.468e-01, 2.021e-01, -1.945e-02, -5.247e-02, 2.540e-02, -6.217e-03, 1.489e-02, -7.293e-02, 5.411e-04, 2.687e-03, 4.745e-02, 1.391e-01)); + r += mul(s5_8, M4(-4.290e-02, 8.605e-02, 1.447e-02, 1.077e-01, 1.379e-02, 2.592e-02, -3.428e-02, -4.561e-02, 6.433e-03, -3.262e-02, 2.071e-02, -2.374e-02, -1.034e-02, -8.245e-02, -9.518e-02, -8.323e-02)); + r += mul(s6_0, M4(8.349e-02, -9.421e-02, 5.134e-02, -1.707e-02, -8.791e-03, -5.482e-03, 3.633e-02, -4.853e-02, -1.052e-01, -3.966e-02, 1.599e-02, 2.633e-03, -4.443e-01, 1.229e-01, -1.745e-02, -1.713e-01)); + r += mul(s6_1, M4(-6.439e-03, -6.925e-02, -9.048e-02, -1.107e-01, 1.839e-02, -1.161e-01, 1.470e-02, 4.258e-02, 4.419e-02, 7.738e-02, -2.092e-02, 2.483e-02, -3.099e-01, -2.297e-01, -1.084e-02, 8.280e-02)); + r += mul(s6_2, M4(9.559e-03, -4.827e-02, -9.305e-02, -6.416e-02, -4.962e-02, -3.425e-02, 2.045e-02, 4.995e-02, -5.017e-02, 8.078e-02, 6.253e-03, -7.790e-02, -1.252e-03, -4.170e-02, -5.411e-02, 6.629e-02)); + r += mul(s6_3, M4(7.144e-02, 6.963e-02, -2.132e-02, 3.176e-02, -1.230e-01, 5.421e-02, 1.039e-02, 1.929e-02, -8.516e-02, 7.294e-02, -6.347e-02, 8.635e-03, -4.146e-01, -1.885e-02, 5.569e-03, 4.442e-01)); + r += mul(s6_4, M4(-9.567e-02, -1.112e-01, 1.220e-02, 2.581e-02, 8.993e-02, -1.958e-01, 6.408e-02, -2.905e-02, 2.708e-01, 8.480e-02, -7.526e-02, -1.466e-01, -2.280e-01, -6.046e-01, -1.809e-01, 2.190e-01)); + r += mul(s6_5, M4(-5.326e-02, 3.185e-02, -2.826e-02, 9.173e-02, -2.587e-02, -1.031e-01, -5.476e-04, -2.940e-02, -2.556e-02, -5.077e-02, 1.519e-01, 8.880e-03, -2.770e-01, 5.091e-01, 4.729e-02, 4.104e-01)); + r += mul(s6_6, M4(1.048e-01, 2.843e-02, 4.574e-03, -7.368e-02, 4.516e-02, 5.945e-02, 8.593e-03, -1.984e-02, -1.941e-01, 2.632e-03, -4.851e-02, -1.535e-02, -2.538e-01, 3.488e-01, 1.115e-01, 2.634e-01)); + r += mul(s6_7, M4(1.284e-02, 5.093e-02, -3.114e-02, -1.141e-02, 5.259e-02, 1.410e-01, 7.318e-02, -6.865e-03, 1.326e-02, -6.977e-02, 3.681e-02, -2.936e-02, -4.111e-01, -3.874e-02, -1.568e-01, 1.240e-01)); + r += mul(s6_8, M4(5.288e-03, -8.600e-02, 2.698e-02, -1.037e-01, 2.803e-02, 3.289e-02, 8.457e-02, -3.984e-02, -2.265e-02, -4.761e-02, -7.385e-03, -1.757e-02, -1.316e-01, 3.142e-01, -1.175e-01, 1.735e-01)); + r += mul(s7_0, M4(7.491e-02, -1.450e-01, 8.576e-02, 5.617e-02, -3.344e-02, 2.116e-02, -1.389e-03, -3.231e-02, -1.292e-02, 2.020e-02, -3.643e-02, -1.820e-02, -3.722e-02, -1.588e-02, -2.642e-02, 1.483e-02)); + r += mul(s7_1, M4(-3.321e-03, -1.353e-01, -1.682e-01, -5.332e-02, 1.267e-02, -9.879e-02, -7.646e-02, 1.006e-01, -5.750e-02, 7.676e-02, 2.614e-03, 3.882e-04, -1.424e-02, -3.769e-02, 2.924e-02, 2.567e-02)); + r += mul(s7_2, M4(-1.003e-01, -1.138e-01, 3.058e-02, -3.240e-02, -1.618e-02, -6.702e-04, 1.148e-01, 8.773e-02, -9.451e-02, -1.554e-02, -7.062e-02, 5.267e-03, 8.207e-03, 3.608e-03, 2.141e-02, -3.004e-03)); + r += mul(s7_3, M4(5.165e-02, -1.245e-01, -9.583e-02, -5.102e-02, 1.679e-04, 7.018e-02, -3.064e-02, 4.600e-02, 5.836e-02, -2.394e-03, -2.430e-02, -1.958e-02, -2.138e-02, 2.727e-02, 2.183e-02, 8.838e-02)); + r += mul(s7_4, M4(-7.226e-02, 2.005e-03, 1.071e-01, 6.017e-02, -6.424e-02, -1.035e-01, 2.689e-02, 2.654e-02, 3.096e-01, -1.818e-02, -9.951e-02, -2.597e-02, -1.332e-03, -8.858e-02, 3.340e-03, -1.278e-02)); + r += mul(s7_5, M4(-2.447e-02, -8.722e-02, -2.832e-02, 5.315e-02, 1.127e-01, -5.947e-02, 1.750e-01, 9.817e-02, -7.845e-02, -1.398e-01, -7.258e-02, 1.423e-02, 2.023e-02, -6.150e-03, -3.309e-02, 1.687e-02)); + r += mul(s7_6, M4(4.939e-02, -4.202e-02, 6.098e-03, -9.119e-02, -5.623e-02, 1.111e-01, 3.059e-02, -1.916e-01, -8.250e-02, -2.965e-02, -3.353e-02, 3.289e-02, 2.014e-02, 8.089e-03, 3.355e-02, 1.456e-02)); + r += mul(s7_7, M4(8.793e-02, 4.620e-02, 1.772e-02, -3.698e-02, -1.754e-01, 2.195e-02, -5.225e-02, -8.223e-02, 5.500e-02, -3.353e-02, 6.219e-02, 7.981e-02, 5.135e-03, 2.492e-02, 9.620e-03, 7.272e-03)); + r += mul(s7_8, M4(4.143e-02, -1.326e-01, -2.472e-02, -2.514e-02, -4.798e-02, 5.893e-02, 2.183e-02, 1.762e-02, -1.149e-01, -1.014e-01, -1.063e-01, -8.116e-02, -1.596e-02, -1.941e-02, 3.506e-03, -1.465e-02)); + r += V4(1.946e-02, -2.094e-02, 4.776e-03, -2.408e-02); + return r; +} + +V4 f1(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-3.395e-02, -9.589e-02, -4.729e-02, 2.096e-02, -1.275e-02, -3.719e-02, -2.352e-02, -4.158e-02, -3.476e-02, -5.034e-02, -2.781e-03, -3.350e-02, 5.401e-02, -1.746e-02, 7.324e-02, -1.488e-01)); + r += mul(s0_1, M4(-5.659e-02, -3.776e-02, 5.233e-02, 1.225e-02, 1.488e-02, -9.189e-03, -6.037e-02, -1.054e-01, 2.389e-02, 8.954e-03, 3.286e-02, -2.802e-02, 2.526e-03, -5.204e-02, -9.638e-02, -7.811e-02)); + r += mul(s0_2, M4(4.380e-02, 2.243e-02, -6.518e-02, 1.486e-02, 1.977e-02, 1.358e-02, -7.893e-03, 2.714e-02, 1.557e-01, 1.050e-02, -2.645e-02, 5.235e-04, 6.345e-02, -5.627e-02, -6.260e-02, 6.337e-03)); + r += mul(s0_3, M4(2.202e-02, 8.299e-02, -7.433e-03, -1.090e-02, 1.698e-01, -1.941e-01, -2.176e-02, 1.132e-01, -5.596e-02, -2.321e-02, -4.190e-03, 3.170e-02, 1.381e-02, 3.042e-02, 7.087e-03, -1.939e-01)); + r += mul(s0_4, M4(6.661e-02, -1.181e-01, -6.948e-02, -9.609e-02, 8.766e-02, -9.867e-02, 2.585e-02, 2.689e-02, -1.971e-01, -5.699e-03, 2.427e-01, -2.323e-01, -1.815e-01, -2.223e-01, -2.233e-01, 9.791e-06)); + r += mul(s0_5, M4(1.100e-02, 6.502e-02, -8.512e-02, 2.930e-03, -4.183e-02, 2.569e-02, 1.240e-01, -2.598e-03, 6.811e-02, 2.417e-02, -7.222e-02, -1.529e-02, -1.149e-01, 1.964e-02, 1.848e-02, -8.152e-03)); + r += mul(s0_6, M4(-2.243e-02, -1.350e-01, -3.474e-02, -1.115e-01, 6.877e-02, -1.045e-01, 7.582e-03, 3.097e-02, -4.251e-02, -2.396e-02, 7.987e-02, 4.079e-02, 7.451e-03, 1.029e-02, -4.421e-02, -1.016e-01)); + r += mul(s0_7, M4(-6.681e-02, -1.440e-01, 1.375e-02, -6.566e-02, -5.482e-03, -2.256e-01, -4.365e-02, -6.433e-02, -5.602e-02, 1.195e-01, 1.284e-01, -6.954e-02, -4.635e-02, 1.018e-01, 4.243e-02, 7.804e-02)); + r += mul(s0_8, M4(-2.005e-02, -9.452e-02, 1.240e-02, -2.132e-02, -4.244e-02, -5.110e-02, -2.936e-02, 1.298e-02, 1.999e-01, 9.645e-02, 1.696e-01, 7.761e-02, -6.641e-02, -7.953e-02, -5.310e-02, 2.967e-02)); + r += mul(s1_0, M4(-1.961e-02, -3.548e-02, -6.879e-03, 4.221e-02, 4.586e-02, 7.381e-02, 2.304e-02, -5.193e-02, 3.275e-02, -3.699e-02, -5.471e-03, -5.813e-02, 1.009e-01, -3.249e-02, 4.309e-02, -2.740e-02)); + r += mul(s1_1, M4(-3.215e-02, -1.087e-02, -3.967e-02, 7.976e-02, -1.784e-02, -1.108e-03, -2.064e-02, 1.705e-02, 1.204e-02, -4.359e-03, -3.299e-02, -3.450e-02, -9.809e-02, 4.950e-02, -8.091e-02, -8.869e-02)); + r += mul(s1_2, M4(5.335e-02, 8.173e-02, 7.282e-02, -8.374e-02, 7.212e-02, 4.329e-03, 4.667e-02, 2.098e-03, 2.786e-02, 3.365e-02, -1.238e-02, -4.857e-02, 4.691e-02, 8.225e-03, -8.823e-03, 5.750e-02)); + r += mul(s1_3, M4(5.744e-02, 4.194e-02, -3.313e-02, 6.049e-03, 1.886e-01, -1.162e-01, -6.582e-02, 1.155e-01, -4.434e-02, 1.850e-02, -6.507e-02, 2.807e-03, 2.068e-02, 7.649e-02, 1.290e-02, -1.866e-01)); + r += mul(s1_4, M4(-9.720e-02, 6.204e-02, -1.551e-01, 7.558e-03, 1.356e-01, -8.411e-02, 5.918e-02, 4.090e-02, -1.603e-01, 4.126e-02, 3.591e-01, -2.834e-01, -9.463e-02, -1.566e-01, -2.453e-01, 6.982e-02)); + r += mul(s1_5, M4(1.202e-01, 3.790e-02, -1.541e-01, 3.033e-02, 2.230e-02, -6.520e-02, 7.259e-02, 1.530e-02, -1.810e-01, -3.178e-02, -5.645e-02, -9.320e-02, -4.207e-02, 8.256e-02, -4.344e-03, 3.775e-02)); + r += mul(s1_6, M4(-1.816e-02, -1.946e-01, -7.062e-02, -2.821e-02, 3.543e-02, 9.863e-03, -3.540e-02, -3.527e-02, 2.861e-02, 2.633e-03, 2.951e-02, 2.566e-02, -2.643e-02, 8.349e-02, -2.609e-02, 5.036e-05)); + r += mul(s1_7, M4(-6.358e-02, 9.779e-02, -1.806e-02, -3.364e-03, -3.616e-02, -1.403e-01, -5.088e-02, -5.711e-02, 1.034e-01, 2.291e-01, -2.781e-02, -1.797e-01, -3.687e-02, 1.431e-01, -9.658e-04, 9.394e-02)); + r += mul(s1_8, M4(-2.238e-02, -1.364e-01, 7.675e-02, -1.033e-01, -1.334e-02, 5.042e-03, 2.727e-02, -2.448e-02, 4.085e-03, 9.684e-02, 4.109e-02, 3.931e-02, -6.314e-04, -3.643e-02, -5.133e-02, 5.306e-02)); + r += mul(s2_0, M4(1.440e-01, 1.221e-02, -3.043e-02, -3.155e-02, 7.192e-03, 1.139e-01, -7.501e-02, 1.577e-02, -5.249e-02, 1.461e-02, -1.227e-01, -4.077e-02, -9.838e-02, -1.887e-03, 1.208e-02, 3.039e-02)); + r += mul(s2_1, M4(-3.265e-01, 7.092e-02, -7.443e-02, -2.228e-01, 6.019e-04, -4.634e-03, 3.208e-02, -8.908e-02, -5.714e-02, 6.949e-02, -9.750e-02, 9.873e-02, -1.033e-01, -7.925e-02, 2.384e-02, -8.670e-03)); + r += mul(s2_2, M4(1.060e-01, -5.553e-03, 8.267e-02, 7.304e-02, -1.123e-01, 1.227e-02, -2.054e-02, -6.947e-02, 9.932e-04, 9.875e-04, 2.093e-02, 8.527e-02, 1.137e-02, -4.719e-02, -3.301e-02, -7.840e-02)); + r += mul(s2_3, M4(-1.497e-01, -1.588e-01, -2.209e-02, -1.475e-01, 1.243e-01, -9.028e-02, -3.921e-02, 1.594e-03, 6.488e-03, 8.669e-02, -7.208e-02, 2.819e-01, -6.688e-02, 3.715e-02, 3.647e-02, 9.818e-03)); + r += mul(s2_4, M4(2.873e-01, -1.763e-02, 6.469e-02, 2.568e-01, -1.292e-01, 5.614e-02, -6.700e-02, -3.543e-01, -2.074e-01, 7.342e-02, -1.800e-01, -2.728e-02, -3.366e-02, -7.661e-02, -1.497e-01, 5.849e-02)); + r += mul(s2_5, M4(8.426e-02, -7.830e-02, -5.613e-02, -2.017e-02, -4.353e-02, -1.004e-02, -1.765e-02, 4.949e-02, 1.320e-02, -4.037e-02, 2.652e-02, -9.777e-02, 2.225e-02, -7.359e-02, 7.803e-03, -3.173e-02)); + r += mul(s2_6, M4(-3.595e-04, 2.186e-01, 4.415e-02, 9.376e-03, 1.158e-02, -2.255e-02, 4.156e-02, -4.312e-02, -1.507e-01, -7.404e-02, -1.392e-02, -5.161e-02, -4.031e-02, -5.684e-02, -7.447e-03, -3.963e-02)); + r += mul(s2_7, M4(1.258e-02, 8.734e-03, -4.634e-02, 1.838e-02, -4.625e-02, -2.428e-02, 8.228e-02, -3.899e-02, 1.047e-02, 6.135e-02, 1.386e-01, 5.174e-02, -7.872e-02, -6.136e-02, 6.400e-02, 5.132e-02)); + r += mul(s2_8, M4(1.466e-02, -2.522e-03, -4.948e-02, 8.298e-02, 6.032e-02, 2.008e-02, -1.315e-02, -9.797e-02, -2.315e-03, -6.006e-02, -6.912e-03, -7.048e-02, 3.588e-02, 1.049e-03, 5.280e-02, -8.946e-02)); + r += mul(s3_0, M4(5.880e-03, 2.187e-02, 9.695e-02, 1.129e-02, -2.751e-02, 7.634e-02, 3.715e-02, 1.509e-01, -3.497e-02, 6.772e-02, 1.171e-02, 5.376e-02, 2.103e-02, 3.223e-03, 9.906e-02, 1.251e-03)); + r += mul(s3_1, M4(1.289e-01, -8.753e-02, -1.653e-02, 1.067e-02, -4.931e-02, 1.911e-02, -4.758e-02, 8.006e-02, 1.592e-02, 1.208e-01, -1.515e-02, 2.233e-02, 5.549e-02, 7.252e-02, 2.836e-02, -1.307e-01)); + r += mul(s3_2, M4(3.939e-02, 4.301e-02, 3.538e-02, -1.421e-03, -1.255e-01, -9.881e-03, -1.600e-02, 1.885e-03, -1.582e-02, -1.391e-02, 1.638e-02, 2.772e-02, -3.851e-03, -4.136e-02, -8.607e-02, -4.196e-02)); + r += mul(s3_3, M4(-5.763e-03, -6.492e-02, -1.938e-02, -5.154e-02, 3.994e-02, -2.938e-02, -3.035e-02, 1.098e-02, 4.031e-02, -7.904e-02, 7.387e-04, -5.600e-02, 2.163e-01, 7.884e-02, 4.752e-02, -1.372e-01)); + r += mul(s3_4, M4(-4.021e-02, -1.533e-01, -1.095e-01, -1.224e-02, 5.862e-02, 2.303e-01, -8.903e-03, -5.954e-03, -2.905e-03, -2.389e-02, -1.345e-01, -1.546e-01, -8.585e-02, 5.629e-02, -1.464e-01, 9.047e-02)); + r += mul(s3_5, M4(-1.371e-01, 3.602e-02, -4.653e-02, 3.862e-03, 9.918e-02, 6.156e-03, -9.347e-02, -5.303e-02, 2.418e-02, -2.661e-02, -5.576e-02, -5.462e-02, -3.618e-02, -4.450e-02, -2.666e-02, -3.199e-02)); + r += mul(s3_6, M4(7.845e-02, 2.929e-02, -3.866e-02, -1.019e-01, 5.534e-02, -1.504e-02, -1.424e-03, 3.384e-02, 1.208e-02, -4.149e-02, 2.009e-02, -3.681e-02, 5.807e-02, 3.756e-03, 3.506e-03, -1.057e-01)); + r += mul(s3_7, M4(1.580e-03, -9.761e-02, -1.217e-02, -5.899e-02, -1.577e-02, -4.953e-02, 4.743e-02, 1.048e-01, -5.623e-02, 4.937e-02, 5.772e-02, -1.982e-03, 1.069e-01, 3.703e-02, 3.209e-02, 1.242e-01)); + r += mul(s3_8, M4(-7.262e-02, -7.243e-02, -5.480e-02, 2.458e-02, -4.308e-02, -7.542e-04, 4.099e-03, 1.009e-02, -4.056e-02, -3.928e-02, 1.769e-02, 6.411e-03, -4.956e-03, -8.744e-03, 2.739e-02, -7.552e-02)); + r += mul(s4_0, M4(6.766e-02, 1.101e-01, 5.535e-02, -5.821e-02, -4.446e-02, 3.118e-02, -1.659e-02, -3.922e-02, 4.098e-02, 8.866e-02, -5.734e-02, 5.606e-02, -3.286e-02, -2.125e-02, -3.408e-02, 8.307e-04)); + r += mul(s4_1, M4(3.255e-02, -5.237e-02, 2.893e-02, -3.657e-02, 1.381e-02, -1.508e-02, 6.604e-03, -8.554e-02, -5.511e-02, -1.482e-02, 7.612e-03, 1.046e-01, 1.003e-01, 1.696e-03, 6.910e-02, -9.445e-03)); + r += mul(s4_2, M4(-3.187e-02, -3.224e-02, 1.335e-01, 7.862e-03, -1.605e-02, -8.148e-02, 1.674e-02, 5.493e-02, 7.531e-02, -6.184e-03, -7.809e-02, -2.515e-02, -8.351e-02, -3.192e-02, -3.464e-02, -4.521e-02)); + r += mul(s4_3, M4(2.831e-01, -1.631e-01, 1.548e-01, -1.239e-01, -5.712e-02, -7.808e-02, 2.809e-02, -6.122e-03, -3.826e-02, 3.327e-02, 2.472e-02, -1.333e-01, -5.070e-02, 1.184e-01, 4.815e-02, -1.672e-01)); + r += mul(s4_4, M4(3.058e-01, -4.137e-03, 2.509e-01, -4.459e-02, -5.592e-02, 1.314e-01, -3.724e-02, -1.911e-01, 3.084e-02, 2.114e-02, 6.667e-02, -3.520e-02, 1.591e-01, -3.472e-03, -7.565e-02, -2.143e-03)); + r += mul(s4_5, M4(7.745e-02, -6.270e-02, 2.258e-02, 3.454e-02, 9.153e-03, 3.901e-02, 1.860e-02, 1.441e-02, 1.151e-01, -7.555e-02, -6.658e-02, 2.956e-02, 1.446e-01, 7.539e-02, 5.197e-02, 4.735e-03)); + r += mul(s4_6, M4(1.182e-01, 1.898e-02, 2.580e-02, -9.786e-02, -3.308e-03, -1.419e-02, 2.067e-02, -3.452e-02, 9.884e-02, 2.306e-02, -3.982e-02, 9.304e-02, -2.952e-02, 5.388e-02, -2.612e-02, -1.135e-01)); + r += mul(s4_7, M4(6.055e-02, 8.741e-02, 7.538e-02, -7.519e-02, 6.237e-02, -1.765e-01, -7.180e-02, 7.595e-02, -3.554e-02, 1.320e-01, 6.164e-02, 1.003e-01, 4.490e-02, 9.272e-02, 1.068e-01, 1.002e-01)); + r += mul(s4_8, M4(4.963e-02, -2.594e-02, 2.272e-02, 5.546e-02, -3.866e-02, -1.926e-02, 2.816e-03, 6.527e-02, 4.404e-02, 1.315e-02, -2.071e-02, -7.344e-02, -2.113e-02, 3.652e-02, -1.171e-02, 2.945e-03)); + r += mul(s5_0, M4(6.229e-02, -3.058e-02, -1.340e-02, 1.391e-02, -1.281e-03, 1.176e-01, 1.312e-01, 6.465e-02, 1.029e-01, 4.557e-03, -5.970e-02, 1.116e-02, -4.103e-02, -1.465e-02, -7.680e-02, -6.180e-02)); + r += mul(s5_1, M4(5.943e-02, -1.416e-01, 3.715e-04, -1.057e-01, -2.718e-02, 8.088e-02, -3.600e-02, 1.384e-01, -9.003e-02, -5.988e-02, 7.010e-02, 7.876e-03, 4.775e-02, 3.654e-02, -2.713e-02, 2.708e-02)); + r += mul(s5_2, M4(-3.837e-02, -1.565e-02, 2.219e-02, -6.472e-02, 3.717e-02, 1.940e-02, 1.092e-01, -3.138e-02, 1.501e-02, 1.286e-02, -1.041e-01, 2.203e-02, 3.194e-02, 9.982e-02, -1.251e-02, 1.355e-02)); + r += mul(s5_3, M4(5.853e-02, 1.831e-01, 2.112e-02, -1.985e-03, -1.118e-01, -1.320e-02, 4.744e-02, -1.625e-01, 4.859e-02, 1.197e-01, 2.712e-02, -5.726e-02, 1.294e-01, -1.522e-01, 1.166e-01, -8.268e-02)); + r += mul(s5_4, M4(4.261e-02, 2.541e-03, 1.922e-01, -5.571e-02, 4.345e-02, 1.164e-01, -1.463e-01, -5.412e-02, -1.351e-02, 6.018e-02, 1.114e-01, -9.633e-02, -6.375e-02, -2.481e-01, -7.674e-02, 1.197e-02)); + r += mul(s5_5, M4(-2.830e-03, 8.239e-02, 5.292e-02, 3.019e-02, 3.622e-02, 5.292e-02, 7.374e-02, 1.421e-01, 1.218e-01, 5.201e-02, -2.951e-02, 2.387e-02, -7.925e-02, 8.075e-02, -1.673e-02, -2.172e-02)); + r += mul(s5_6, M4(3.188e-02, 6.711e-02, -8.440e-03, 3.255e-02, 3.366e-02, -3.691e-02, -2.101e-02, 1.522e-02, 6.729e-02, 8.272e-02, 2.308e-02, -4.969e-03, 3.456e-02, -1.226e-01, 5.143e-03, 5.949e-02)); + r += mul(s5_7, M4(-1.538e-02, 8.052e-02, 3.767e-02, 3.576e-02, 1.192e-02, -1.285e-01, -1.240e-01, -1.155e-01, 1.604e-02, 9.288e-02, 7.225e-02, 1.157e-01, 1.540e-02, -1.841e-01, -4.204e-02, -7.928e-02)); + r += mul(s5_8, M4(2.011e-02, 5.070e-02, -1.360e-02, 1.586e-02, -1.096e-01, -8.943e-03, -2.883e-02, -3.937e-02, 3.098e-02, -4.729e-04, -3.013e-02, -4.197e-02, -4.662e-02, -3.031e-02, -1.028e-04, 2.773e-02)); + r += mul(s6_0, M4(-1.481e-02, 3.680e-03, 1.813e-02, 1.702e-02, 1.819e-03, -4.377e-03, -7.187e-04, -4.898e-02, 3.108e-02, -2.606e-02, -4.699e-02, 7.789e-02, -2.826e-01, 5.431e-02, 1.970e-01, 1.209e-01)); + r += mul(s6_1, M4(6.911e-02, -1.416e-02, -9.693e-02, 4.817e-02, -4.358e-02, 3.826e-02, 4.636e-02, 2.814e-02, 8.591e-02, 1.173e-02, -7.589e-02, -2.467e-03, -1.815e-01, 7.563e-02, 3.060e-02, 3.624e-01)); + r += mul(s6_2, M4(3.458e-02, -3.127e-02, 3.727e-02, 2.375e-02, 2.581e-02, -5.655e-02, 5.606e-02, -4.198e-03, -1.001e-01, 4.610e-02, 1.557e-03, -5.766e-02, -1.539e-01, 6.067e-02, 2.534e-01, -9.922e-02)); + r += mul(s6_3, M4(-2.950e-02, 7.285e-02, 7.015e-03, -1.711e-02, 4.936e-02, 4.560e-02, -4.614e-02, -1.085e-01, -1.144e-01, -1.815e-02, 2.214e-02, 5.016e-02, -4.194e-01, -2.851e-01, 2.156e-01, -2.858e-02)); + r += mul(s6_4, M4(1.187e-01, 8.610e-02, 1.643e-01, 1.513e-01, 6.280e-02, -3.520e-02, -8.953e-02, -1.304e-01, 1.336e-01, -9.314e-03, -4.739e-02, -2.907e-01, -1.902e-01, -5.034e-01, 9.737e-02, 4.044e-01)); + r += mul(s6_5, M4(2.395e-02, 2.296e-02, 3.555e-02, -1.153e-02, 5.003e-02, 4.784e-03, -3.631e-03, 2.028e-02, -1.492e-01, 5.326e-02, -1.009e-01, 2.862e-02, 1.364e-01, -4.536e-01, -3.812e-01, 3.319e-02)); + r += mul(s6_6, M4(3.443e-02, 3.912e-02, -6.775e-03, -1.025e-01, -2.452e-02, -9.198e-02, 3.827e-02, -8.314e-02, 3.334e-02, 3.962e-02, -2.296e-02, 2.559e-02, -3.215e-01, -4.423e-02, 4.716e-02, 3.208e-01)); + r += mul(s6_7, M4(-5.346e-02, 4.934e-02, 5.720e-02, 8.442e-05, -2.611e-02, -1.257e-01, -3.897e-02, 6.115e-03, 1.121e-03, -1.353e-01, -6.367e-02, -8.777e-02, -3.356e-02, 8.508e-01, -6.710e-02, 2.437e-01)); + r += mul(s6_8, M4(-3.279e-02, 4.803e-02, 1.084e-02, -1.469e-03, -1.084e-01, -3.015e-02, -1.432e-02, -2.730e-02, 7.939e-02, 1.648e-01, 5.432e-02, 6.842e-02, -2.190e-01, 4.760e-01, 1.189e-01, -1.566e-01)); + r += mul(s7_0, M4(3.039e-02, -4.042e-02, 3.707e-02, 9.572e-02, -9.552e-02, 5.214e-02, 2.919e-02, 7.078e-02, 6.632e-02, 5.363e-02, 2.971e-02, -1.054e-02, -1.973e-02, -3.739e-02, -8.141e-03, 3.426e-02)); + r += mul(s7_1, M4(1.056e-01, 8.106e-02, -1.423e-02, -1.197e-01, -9.589e-03, 7.807e-02, 1.234e-02, 1.724e-02, -9.390e-02, -6.459e-03, 6.137e-02, 6.781e-03, -2.780e-02, 3.426e-03, -4.210e-02, -2.111e-03)); + r += mul(s7_2, M4(5.906e-02, -6.837e-02, -1.526e-03, 5.797e-02, 6.039e-02, -1.754e-02, 1.022e-01, -1.539e-01, -1.161e-04, -2.746e-02, 1.525e-01, -1.059e-01, 5.706e-03, -1.552e-02, 1.843e-02, 2.712e-02)); + r += mul(s7_3, M4(1.317e-01, 8.557e-02, -3.533e-02, -1.620e-01, 2.243e-01, 5.795e-06, -4.773e-02, -4.165e-02, 1.745e-02, -1.104e-01, -4.065e-02, -7.965e-03, -1.062e-01, 5.844e-02, -1.964e-02, 2.352e-02)); + r += mul(s7_4, M4(3.415e-01, 2.737e-01, 1.364e-01, 3.602e-03, 5.410e-02, 1.907e-02, -6.755e-03, -2.686e-01, -4.820e-02, 1.914e-02, -9.279e-02, -8.144e-02, 3.230e-03, -1.465e-03, 8.159e-02, 6.788e-02)); + r += mul(s7_5, M4(4.674e-02, -1.400e-02, -1.856e-03, -2.987e-02, 8.853e-03, 2.427e-02, -2.821e-02, 8.432e-02, 7.288e-02, 7.845e-03, -6.109e-02, 1.150e-01, 2.873e-02, -5.371e-02, -3.119e-02, -7.531e-03)); + r += mul(s7_6, M4(1.787e-01, 4.830e-02, -1.587e-01, -1.785e-01, -1.709e-02, -1.119e-01, -4.879e-02, -6.821e-02, -1.583e-02, 8.248e-03, -2.813e-02, 4.111e-02, -2.005e-02, -5.693e-02, -9.208e-03, 4.814e-03)); + r += mul(s7_7, M4(-6.885e-02, 8.600e-02, -1.341e-01, -6.768e-02, -1.075e-01, 1.010e-01, -7.839e-02, 5.196e-02, -5.968e-02, -1.472e-01, 4.703e-02, -7.549e-02, -4.898e-02, 2.312e-02, -4.982e-02, 4.178e-02)); + r += mul(s7_8, M4(-1.335e-02, 1.696e-02, -9.544e-02, 2.342e-02, 7.584e-02, -6.788e-02, 5.264e-02, -3.575e-02, 6.591e-02, 4.831e-02, 5.604e-02, 5.523e-02, -3.696e-02, 4.328e-02, 4.806e-02, 1.609e-02)); + r += V4(1.163e-02, 1.111e-02, -2.674e-02, 2.569e-02); + return r; +} + +V4 f2(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(1.044e-02, 3.976e-02, -2.713e-03, -2.239e-02, -8.208e-02, -6.853e-02, -2.467e-02, 5.687e-03, 1.560e-02, -2.362e-03, -3.105e-03, -3.978e-02, -2.943e-02, 7.069e-03, 5.994e-02, -4.156e-02)); + r += mul(s0_1, M4(-4.410e-02, -6.369e-04, 1.340e-02, -3.625e-02, -4.683e-03, -4.686e-02, -2.602e-02, 1.932e-02, -7.814e-02, 2.679e-03, 4.407e-02, -9.170e-03, -5.525e-02, -9.645e-02, 4.266e-02, 1.245e-01)); + r += mul(s0_2, M4(-1.824e-02, -1.584e-02, 1.381e-02, 8.685e-03, -1.348e-02, 3.479e-02, -6.780e-02, 7.429e-02, -8.274e-03, -1.247e-02, 4.504e-02, 5.583e-03, -9.213e-02, -7.559e-02, 2.572e-02, 2.736e-02)); + r += mul(s0_3, M4(2.819e-02, -5.725e-02, -1.996e-02, -8.497e-03, -6.542e-02, -7.037e-02, -3.119e-02, 1.333e-02, 3.837e-02, -3.085e-02, -6.294e-02, 2.702e-02, 3.653e-02, 1.286e-02, 2.269e-02, -4.996e-03)); + r += mul(s0_4, M4(4.286e-02, 6.463e-02, 4.030e-03, 4.109e-02, 8.496e-02, -7.991e-02, -3.770e-02, -2.812e-02, -2.714e-02, -7.114e-02, 4.348e-01, -2.067e-01, -3.885e-02, 1.662e-01, -9.803e-02, -1.303e-01)); + r += mul(s0_5, M4(-6.420e-02, 7.644e-02, -3.945e-03, 4.843e-02, -2.071e-02, -1.295e-01, 1.053e-03, 3.202e-02, -1.646e-01, 1.946e-01, 1.409e-01, -1.667e-01, -5.841e-02, -1.496e-01, -1.809e-02, 4.810e-02)); + r += mul(s0_6, M4(-2.353e-02, 3.602e-02, -1.510e-02, -1.081e-02, -3.546e-02, 2.930e-02, -6.499e-02, -2.120e-02, 3.098e-02, 1.991e-02, -1.106e-01, 1.454e-02, -3.027e-02, -8.608e-03, -6.525e-03, -2.450e-02)); + r += mul(s0_7, M4(8.452e-02, 8.519e-02, -4.352e-02, -5.994e-02, 1.038e-01, 9.383e-02, -5.287e-02, -9.052e-02, 1.258e-01, -3.955e-02, 1.836e-01, 3.711e-02, -3.958e-02, 2.734e-02, -1.068e-01, -8.196e-02)); + r += mul(s0_8, M4(-1.004e-01, -1.266e-02, -7.782e-02, 5.638e-02, 4.760e-02, -4.956e-02, -2.831e-02, -9.750e-02, 1.263e-01, -2.467e-02, 3.367e-02, 4.778e-02, -8.891e-03, 8.083e-02, 8.543e-04, -6.149e-02)); + r += mul(s1_0, M4(7.064e-02, -3.305e-02, -6.078e-02, 4.083e-03, -3.250e-02, -6.921e-02, -4.862e-03, 5.376e-02, 6.239e-02, 1.770e-02, -2.288e-02, -6.141e-03, -5.434e-03, 2.557e-02, 4.303e-02, -7.795e-03)); + r += mul(s1_1, M4(-1.217e-02, -4.375e-03, 9.265e-02, -2.436e-02, -1.084e-03, 2.425e-02, 1.093e-01, 2.275e-02, 7.563e-03, -1.642e-02, 1.754e-02, 2.647e-02, -8.377e-02, -7.736e-02, 1.067e-01, 2.718e-02)); + r += mul(s1_2, M4(-5.520e-02, 1.269e-01, -8.435e-02, 8.448e-02, 3.444e-02, 1.022e-01, -1.862e-02, 6.598e-02, 3.329e-02, -2.967e-02, 1.146e-02, 1.238e-01, -5.812e-02, -3.343e-02, 2.878e-03, 6.665e-02)); + r += mul(s1_3, M4(2.062e-02, -1.695e-01, -7.799e-02, 1.398e-02, -1.468e-01, -2.432e-02, -3.870e-03, 1.403e-02, 5.847e-02, -2.735e-02, -6.518e-02, -1.040e-02, -5.155e-04, 1.307e-01, 1.418e-02, 9.161e-02)); + r += mul(s1_4, M4(-9.368e-02, -9.932e-02, 1.302e-01, -1.556e-01, -2.554e-02, -2.008e-01, 1.359e-02, -2.680e-02, 6.190e-02, -4.853e-02, 9.166e-02, 2.847e-02, -2.106e-01, 2.206e-01, -5.797e-02, -1.267e-01)); + r += mul(s1_5, M4(-2.516e-01, 1.810e-01, 2.429e-03, 9.165e-02, -4.417e-02, -5.359e-02, 1.532e-02, 1.811e-03, -3.734e-02, 1.192e-01, 9.250e-03, -4.431e-02, -1.382e-01, -1.226e-01, 6.487e-03, -1.302e-02)); + r += mul(s1_6, M4(-1.248e-02, 7.933e-02, -5.322e-02, 2.219e-02, 4.028e-04, 3.178e-02, 7.705e-03, 1.915e-02, 6.281e-02, 5.458e-03, -3.504e-02, -2.088e-02, -3.229e-02, -6.282e-02, -1.913e-03, -2.264e-03)); + r += mul(s1_7, M4(1.022e-01, 1.444e-01, -3.742e-03, -6.361e-02, 1.558e-01, 1.217e-01, -5.079e-02, -4.364e-02, 1.397e-01, 4.067e-02, 1.062e-01, 9.020e-02, -1.307e-01, -1.261e-02, -5.311e-02, -5.734e-03)); + r += mul(s1_8, M4(3.088e-03, -4.309e-02, -6.999e-02, -9.212e-02, 1.614e-01, 1.125e-02, 1.084e-02, -7.279e-02, 3.876e-03, 6.041e-03, -9.399e-02, 8.275e-02, -5.889e-02, 7.190e-02, -2.825e-03, 1.959e-02)); + r += mul(s2_0, M4(-8.445e-03, 1.907e-02, -2.446e-01, 1.165e-01, 5.851e-02, -3.507e-02, -2.351e-01, -5.242e-02, 2.138e-02, 1.019e-02, -1.577e-02, 4.669e-03, 9.699e-02, -4.522e-02, 3.881e-02, -7.113e-02)); + r += mul(s2_1, M4(-4.277e-02, -4.543e-02, 1.424e-02, 1.687e-02, -5.888e-03, 1.411e-02, -1.075e-01, 3.964e-02, -5.187e-02, -3.288e-02, 1.687e-01, -2.589e-01, -4.321e-03, 9.293e-02, -1.014e-02, -1.401e-01)); + r += mul(s2_2, M4(-1.085e-01, 3.257e-02, -4.122e-03, -1.857e-03, 9.057e-02, -8.602e-03, -1.726e-02, 8.968e-02, 4.722e-02, 4.112e-02, 7.975e-02, -7.304e-02, 8.705e-02, 4.329e-02, 4.175e-02, -1.431e-01)); + r += mul(s2_3, M4(2.931e-02, 2.431e-02, 4.895e-02, 8.375e-02, 2.388e-02, 1.423e-01, -2.586e-01, 1.456e-01, -6.493e-02, -1.082e-03, -6.684e-02, -7.866e-02, 2.237e-02, 6.424e-02, 9.272e-02, -3.164e-02)); + r += mul(s2_4, M4(1.627e-01, 2.827e-02, 3.059e-02, -9.400e-02, 1.152e-01, -7.012e-02, -1.099e-01, -1.231e-01, 6.033e-02, -1.182e-01, 2.324e-01, 8.117e-03, -1.818e-02, -4.512e-02, 2.717e-02, 1.116e-01)); + r += mul(s2_5, M4(-2.338e-02, 3.575e-02, -7.326e-02, 4.292e-02, -2.192e-02, 7.025e-03, -8.236e-02, 1.137e-01, -7.215e-02, 3.959e-02, 2.721e-02, 3.182e-02, -1.178e-02, 1.383e-01, 3.623e-02, -7.956e-02)); + r += mul(s2_6, M4(6.068e-02, -1.599e-01, 1.563e-02, 9.910e-02, 6.822e-02, -6.330e-03, -8.954e-02, -4.047e-02, -4.017e-02, 4.640e-02, 6.713e-02, -1.995e-02, -1.653e-02, -6.367e-02, -5.527e-02, 1.112e-03)); + r += mul(s2_7, M4(-6.325e-02, 3.405e-02, 4.576e-04, 3.678e-02, 7.667e-02, 6.580e-02, -3.727e-03, 9.988e-02, 7.735e-02, -1.517e-01, -1.384e-02, 1.075e-01, 3.524e-02, -3.428e-02, -7.878e-03, -7.362e-03)); + r += mul(s2_8, M4(2.430e-02, -2.020e-02, 6.423e-02, 1.522e-02, 6.724e-02, -6.726e-02, 2.133e-02, 1.430e-03, 6.096e-03, -2.198e-02, 2.264e-02, 3.697e-02, 1.264e-01, 1.037e-01, -1.240e-02, 5.197e-02)); + r += mul(s3_0, M4(2.169e-02, 2.504e-02, 1.037e-01, 3.411e-02, 5.118e-02, 6.041e-02, -3.748e-02, 8.401e-02, 5.622e-02, 2.256e-02, 1.919e-02, -3.586e-02, 9.630e-02, 1.443e-02, -2.763e-02, -5.427e-02)); + r += mul(s3_1, M4(8.570e-02, -8.241e-02, 4.385e-02, 4.663e-02, -2.042e-02, 2.747e-02, -1.350e-01, -5.734e-02, -2.608e-02, -2.238e-02, 3.917e-02, -6.221e-02, -5.165e-02, -4.383e-02, -8.010e-02, 1.202e-01)); + r += mul(s3_2, M4(-1.071e-01, 1.806e-02, -4.676e-02, 7.724e-02, 5.927e-03, -1.329e-02, 3.595e-02, -9.005e-02, -2.000e-02, 6.244e-02, 3.114e-02, 3.745e-02, 2.687e-02, 4.229e-02, 5.796e-02, 5.742e-03)); + r += mul(s3_3, M4(-5.645e-02, -3.711e-02, 3.449e-02, 8.653e-02, -1.124e-01, 1.150e-01, -5.544e-02, -3.011e-02, -4.542e-02, 5.861e-02, -4.486e-02, -2.321e-02, 8.433e-02, 7.359e-02, 1.777e-02, -7.155e-03)); + r += mul(s3_4, M4(9.085e-02, -2.114e-01, 1.875e-02, -8.487e-02, 8.074e-02, -8.667e-02, 5.562e-02, 6.822e-02, -2.129e-03, 8.832e-02, 9.762e-03, 1.188e-02, -2.961e-02, 3.126e-02, 2.638e-02, 1.059e-01)); + r += mul(s3_5, M4(1.846e-03, -1.158e-01, -6.764e-03, 4.821e-02, -9.654e-02, 8.251e-02, 5.516e-02, -2.189e-02, -4.252e-02, 3.444e-02, -2.140e-02, 2.518e-02, -2.090e-02, 7.050e-03, 5.051e-02, 3.882e-02)); + r += mul(s3_6, M4(1.362e-02, 7.373e-03, 2.864e-02, 6.477e-02, -3.102e-02, -9.494e-02, -9.035e-04, -1.018e-01, 7.756e-02, 2.593e-04, -5.842e-02, -4.771e-02, 2.515e-02, -5.837e-02, 5.781e-03, -3.702e-02)); + r += mul(s3_7, M4(1.259e-02, 1.449e-01, -1.064e-01, -1.181e-01, 5.822e-02, -9.368e-03, -7.623e-03, -9.724e-02, 9.437e-03, -1.174e-01, -6.045e-02, -9.132e-03, -2.510e-01, 1.724e-01, -7.339e-02, -2.843e-02)); + r += mul(s3_8, M4(-1.154e-02, -3.014e-02, 3.173e-02, -2.898e-02, -2.838e-02, -1.094e-01, 2.581e-02, -1.161e-02, 2.622e-02, 2.845e-02, -8.344e-03, -3.107e-02, 9.083e-02, 1.809e-02, -1.382e-02, 5.248e-02)); + r += mul(s4_0, M4(-1.701e-02, -1.681e-01, 3.634e-02, 4.505e-02, 1.752e-02, -4.231e-03, 7.473e-03, -4.035e-02, -7.602e-02, -7.688e-02, 1.905e-02, 1.685e-02, -1.871e-02, 6.926e-02, -4.040e-02, 8.013e-02)); + r += mul(s4_1, M4(-2.121e-02, -7.814e-02, -8.739e-02, 1.494e-01, -4.835e-02, 7.097e-02, -1.636e-02, 7.893e-02, -4.042e-02, -6.655e-03, 5.261e-02, 4.836e-02, -3.004e-02, 1.275e-01, 1.666e-02, 6.189e-02)); + r += mul(s4_2, M4(4.286e-02, -8.761e-03, 1.687e-02, 3.043e-02, 1.437e-02, -3.089e-02, 7.082e-03, -8.197e-02, -5.931e-02, 1.408e-01, 9.069e-02, -1.079e-01, 1.112e-02, 3.030e-02, -2.776e-02, 4.441e-02)); + r += mul(s4_3, M4(-1.980e-01, -7.147e-02, 2.292e-02, 2.596e-01, 6.282e-02, 2.365e-02, -9.268e-03, 1.502e-02, -1.860e-01, -1.795e-02, 4.955e-02, -4.942e-02, 8.161e-03, -2.767e-02, 4.257e-03, 6.855e-02)); + r += mul(s4_4, M4(-2.060e-01, 2.178e-01, 1.186e-01, 3.833e-01, 9.743e-02, -1.941e-01, 1.368e-01, 4.863e-02, -2.060e-01, 1.257e-01, 1.337e-01, 1.871e-01, 1.676e-01, -2.828e-02, 5.465e-02, 3.017e-01)); + r += mul(s4_5, M4(4.660e-02, -2.261e-02, -3.447e-02, 1.099e-01, -3.801e-02, -9.249e-02, -1.074e-04, -1.763e-02, -2.638e-02, 8.448e-02, -5.157e-02, 5.928e-03, 4.440e-02, -2.713e-02, 6.287e-03, 1.153e-01)); + r += mul(s4_6, M4(-5.474e-03, 1.672e-01, -6.861e-02, -1.988e-02, -1.599e-03, -7.052e-02, 3.060e-02, 3.427e-02, -3.871e-02, 4.070e-02, 4.571e-03, -3.487e-02, 3.488e-02, -1.459e-02, -3.410e-02, -9.642e-02)); + r += mul(s4_7, M4(3.777e-02, -1.552e-01, 5.797e-02, 3.750e-03, -8.534e-02, 1.230e-01, -6.731e-02, -8.019e-02, -6.913e-03, -1.968e-01, 6.628e-02, 8.678e-02, -9.774e-02, 3.702e-02, -5.709e-02, 8.746e-03)); + r += mul(s4_8, M4(-3.814e-02, -8.854e-03, 2.903e-02, 1.036e-01, -3.554e-03, 9.865e-02, -7.659e-03, -6.438e-02, 7.322e-02, -3.479e-02, 3.099e-02, 8.696e-02, 2.780e-02, -9.543e-02, -9.496e-03, 7.311e-02)); + r += mul(s5_0, M4(-3.094e-02, -4.254e-02, 6.911e-02, 6.352e-02, 1.081e-01, 4.253e-02, 1.324e-01, 8.483e-02, -7.910e-02, -1.033e-02, -2.140e-02, 8.306e-03, -7.538e-03, -1.534e-02, -2.465e-02, -1.115e-01)); + r += mul(s5_1, M4(-7.244e-02, 9.141e-02, -3.903e-02, -4.721e-02, 1.216e-02, 1.243e-02, 3.216e-02, -2.703e-04, -3.561e-02, 1.223e-01, -4.937e-02, 5.409e-02, 1.824e-02, -3.436e-02, -3.153e-02, 2.583e-02)); + r += mul(s5_2, M4(1.840e-02, -5.725e-02, -9.852e-03, 1.039e-01, 4.117e-02, 1.614e-01, 3.339e-02, -6.907e-02, 8.800e-03, 8.399e-02, 6.212e-02, -1.548e-01, -4.436e-02, -1.146e-01, 5.010e-03, -3.829e-02)); + r += mul(s5_3, M4(-7.835e-02, 5.730e-02, -4.555e-02, 4.678e-02, -3.569e-02, -3.450e-02, 1.276e-02, -1.623e-02, -8.050e-02, 5.898e-02, 6.266e-02, 6.138e-02, 3.209e-02, -5.514e-02, 3.587e-02, -1.388e-02)); + r += mul(s5_4, M4(5.885e-03, 1.810e-02, -1.060e-02, -1.665e-01, -1.328e-01, -5.792e-02, 2.064e-01, 2.821e-03, -6.837e-03, 1.071e-01, 1.029e-01, 3.014e-02, 1.233e-01, 3.574e-02, 8.126e-02, 1.382e-01)); + r += mul(s5_5, M4(-4.135e-02, -5.230e-02, -1.185e-02, -9.550e-03, -5.861e-04, 5.239e-02, -9.890e-02, 1.078e-01, -1.583e-02, 4.469e-02, 8.494e-02, -7.841e-02, -7.250e-03, -6.059e-02, -2.741e-02, 5.696e-02)); + r += mul(s5_6, M4(2.748e-02, -3.039e-02, 4.701e-02, -1.181e-02, 1.432e-02, -9.720e-03, 8.727e-03, 4.597e-02, -4.833e-02, -8.645e-02, 7.821e-02, -1.231e-02, -1.624e-02, 1.332e-01, -8.124e-02, 2.425e-02)); + r += mul(s5_7, M4(6.926e-02, 9.884e-02, 2.223e-03, -5.294e-02, -5.509e-02, 6.520e-03, 3.129e-02, -5.234e-02, -9.890e-02, -9.283e-02, 5.143e-02, 1.258e-01, -3.169e-02, 1.379e-01, -2.241e-03, -1.374e-01)); + r += mul(s5_8, M4(-2.339e-02, 4.610e-02, 9.191e-03, 3.271e-02, 3.843e-02, -7.156e-02, 9.077e-03, 5.775e-02, 5.044e-02, 2.279e-02, -6.811e-02, 4.273e-02, -2.611e-02, -6.971e-02, -1.611e-02, 6.006e-02)); + r += mul(s6_0, M4(2.505e-02, 3.766e-02, 4.054e-02, -4.322e-02, 3.788e-02, 7.105e-02, 2.766e-02, 1.881e-02, 1.769e-02, 3.557e-02, 3.017e-02, 2.461e-02, -7.103e-02, 2.165e-01, -1.108e-01, 1.162e-02)); + r += mul(s6_1, M4(-5.639e-02, -1.563e-02, 7.611e-03, -8.263e-02, 1.390e-02, 5.897e-02, 7.291e-02, 3.333e-02, -1.985e-02, -3.859e-02, -7.172e-02, 3.897e-02, 3.314e-01, -2.184e-01, 1.485e-01, -3.358e-01)); + r += mul(s6_2, M4(-4.237e-02, 2.323e-02, 2.123e-02, -6.459e-02, 3.581e-02, 4.408e-02, -2.169e-02, -1.021e-02, -5.736e-02, -1.571e-01, 3.566e-02, -9.504e-02, -2.761e-02, -2.743e-02, 3.164e-02, -1.290e-01)); + r += mul(s6_3, M4(4.800e-02, -3.069e-02, -1.506e-01, 2.946e-02, -9.870e-03, -1.109e-01, 1.050e-01, 2.674e-02, 1.095e-01, -1.704e-02, -5.751e-02, 5.679e-02, -2.885e-01, 1.443e-01, 9.681e-02, 8.549e-02)); + r += mul(s6_4, M4(-1.101e-01, -1.287e-01, 5.712e-02, 4.843e-02, -8.649e-02, 9.301e-02, 1.086e-01, -7.359e-02, 1.531e-01, 3.441e-02, -7.657e-02, 6.034e-02, 1.580e-01, 2.032e-01, 1.741e-01, -1.615e-01)); + r += mul(s6_5, M4(-1.083e-02, 3.367e-02, -2.426e-03, -3.333e-02, 2.701e-02, -1.209e-01, -2.016e-02, 1.091e-02, -7.320e-02, -2.307e-01, 2.703e-02, -2.442e-02, 1.112e-01, 1.876e-01, -2.411e-01, 1.322e-01)); + r += mul(s6_6, M4(1.312e-02, -2.243e-02, -4.825e-02, 1.113e-03, -1.856e-02, 4.430e-03, -4.659e-02, -1.388e-02, -2.014e-02, -4.208e-03, 2.505e-02, -1.212e-03, 2.191e-01, 1.855e-01, -5.144e-01, -9.088e-02)); + r += mul(s6_7, M4(1.318e-01, -3.862e-02, 1.896e-03, 1.051e-02, -2.931e-02, -5.311e-02, -3.125e-02, -7.541e-02, -4.191e-03, 2.775e-02, 5.166e-02, -6.969e-02, 4.320e-01, -3.483e-01, -2.535e-01, 2.253e-01)); + r += mul(s6_8, M4(1.595e-02, -1.106e-02, 1.332e-03, 6.104e-02, 2.432e-03, 3.079e-02, -3.708e-02, -9.332e-02, 8.644e-03, -8.420e-02, 5.762e-02, -3.917e-02, 4.429e-01, -4.880e-01, 3.146e-01, 7.947e-02)); + r += mul(s7_0, M4(1.022e-02, 4.535e-02, -1.894e-02, -2.478e-02, 2.549e-02, -7.074e-02, 7.360e-02, -9.483e-02, -4.662e-02, -3.848e-02, -1.675e-02, 3.406e-02, 2.726e-02, 5.894e-02, -3.353e-02, -1.439e-02)); + r += mul(s7_1, M4(-1.249e-01, 1.182e-01, -1.116e-01, 1.554e-01, -1.324e-02, 3.877e-02, 8.164e-02, 1.246e-01, 1.247e-02, -8.276e-02, -3.699e-04, 6.295e-02, -3.020e-02, -3.135e-02, -5.228e-03, -3.271e-02)); + r += mul(s7_2, M4(-7.242e-02, 7.685e-02, 1.332e-03, -1.996e-02, 7.416e-02, 5.993e-02, 3.891e-03, 1.467e-01, 3.795e-02, -2.813e-02, 6.276e-03, -8.736e-02, 6.288e-03, -1.671e-02, 3.157e-02, 1.137e-02)); + r += mul(s7_3, M4(2.462e-02, -5.562e-02, -1.547e-01, 7.757e-02, -5.447e-02, -2.082e-02, 6.462e-02, 3.818e-02, 7.313e-02, 3.180e-02, 6.349e-02, 4.597e-02, 3.639e-02, -5.572e-02, -2.767e-02, -3.854e-03)); + r += mul(s7_4, M4(-2.440e-01, 8.688e-02, -9.817e-02, -7.993e-03, -5.542e-02, 1.178e-01, 2.146e-01, -2.587e-01, -2.360e-02, -3.656e-02, 1.491e-01, -7.644e-02, -4.282e-02, 1.621e-03, 6.814e-02, -5.522e-03)); + r += mul(s7_5, M4(-1.154e-01, -7.271e-02, -8.417e-02, 3.505e-02, 3.125e-02, -1.586e-01, -5.020e-02, 1.130e-01, -5.825e-02, -9.207e-02, 3.888e-02, -1.213e-02, -4.179e-03, 7.084e-02, -3.835e-02, -1.931e-02)); + r += mul(s7_6, M4(-5.889e-02, -2.156e-02, -2.017e-01, 1.316e-02, 1.188e-02, 5.863e-02, -7.675e-02, -1.943e-02, 7.086e-03, -4.504e-02, 5.562e-03, 2.955e-03, 2.118e-02, -1.524e-03, 2.187e-02, -4.319e-02)); + r += mul(s7_7, M4(-1.654e-01, 2.251e-01, -8.720e-02, -6.604e-02, -7.955e-02, -3.832e-02, -4.145e-02, -3.334e-03, 5.834e-02, 1.713e-03, -4.636e-02, -3.712e-02, 9.400e-03, -4.264e-02, 2.888e-02, 4.214e-02)); + r += mul(s7_8, M4(-3.719e-02, -7.805e-02, -4.505e-02, -1.529e-02, 9.692e-02, -1.162e-02, 3.538e-02, -6.834e-02, -9.472e-02, -1.191e-01, 1.172e-01, 4.890e-02, -1.099e-02, -3.897e-02, -5.892e-03, 5.192e-03)); + r += V4(-1.394e-02, -2.699e-02, 2.224e-02, 3.281e-03); + return r; +} + +V4 f3(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-6.270e-02, 8.462e-02, 6.047e-02, -1.295e-03, -4.220e-02, 8.864e-02, 1.259e-01, 1.254e-01, -2.959e-03, 1.666e-02, -4.736e-02, 5.655e-03, 5.340e-02, -9.372e-02, -1.861e-02, 6.647e-03)); + r += mul(s0_1, M4(7.213e-02, 4.957e-02, 3.529e-02, 6.272e-02, 1.731e-03, -1.453e-01, -1.714e-01, 4.357e-02, 7.614e-02, -2.309e-02, -7.446e-02, -4.053e-03, 8.282e-02, -1.530e-01, -7.690e-02, 8.619e-02)); + r += mul(s0_2, M4(1.100e-02, 5.907e-02, -6.664e-02, -9.434e-02, -9.546e-03, -1.168e-03, -7.016e-02, -2.523e-03, 8.582e-03, -3.931e-02, 5.454e-02, -5.242e-02, 1.809e-03, 3.973e-02, 7.846e-02, 1.502e-01)); + r += mul(s0_3, M4(-4.294e-02, -8.568e-02, 4.840e-02, -5.056e-02, -1.042e-02, 1.703e-01, 2.530e-02, 1.320e-01, -9.460e-02, -1.044e-02, 2.013e-03, -3.328e-02, -6.248e-02, -1.069e-01, -9.958e-02, 3.909e-02)); + r += mul(s0_4, M4(-1.629e-02, -2.062e-01, -6.175e-02, 1.759e-01, -2.276e-02, -1.242e-01, 1.792e-01, -5.800e-02, -2.607e-01, -1.996e-01, -3.020e-01, -2.794e-01, -1.831e-01, -6.461e-03, -1.025e-01, 9.115e-02)); + r += mul(s0_5, M4(4.015e-02, 1.667e-02, 1.189e-02, 9.986e-03, -2.513e-02, -3.772e-02, -9.172e-02, 1.288e-02, 5.936e-02, -3.270e-02, -4.656e-02, -1.971e-02, -1.216e-01, 2.782e-02, 2.057e-02, -8.124e-02)); + r += mul(s0_6, M4(7.638e-03, 9.634e-02, -9.590e-03, 9.920e-02, -5.291e-02, -1.379e-01, -4.254e-02, 8.970e-02, -4.908e-02, -3.514e-02, 2.161e-02, 1.228e-01, -2.859e-02, 1.776e-02, 5.965e-02, -5.740e-02)); + r += mul(s0_7, M4(1.415e-02, 9.476e-02, 5.657e-02, -5.985e-02, -1.921e-02, -1.729e-01, 1.587e-01, -3.043e-02, -3.281e-02, -1.685e-01, 8.746e-02, -5.009e-02, -7.444e-02, 4.368e-02, -1.751e-01, 8.580e-03)); + r += mul(s0_8, M4(-9.291e-02, 8.831e-02, -4.124e-04, 1.910e-02, -1.098e-01, -3.635e-03, -1.324e-01, 3.700e-02, -6.666e-02, 1.568e-02, 1.271e-01, 3.878e-02, -8.765e-03, -4.062e-03, 5.793e-02, -2.290e-02)); + r += mul(s1_0, M4(-1.502e-02, 1.077e-01, 3.124e-02, 1.075e-02, -3.177e-02, -9.244e-03, 7.909e-03, 1.386e-02, -2.435e-02, -2.333e-02, -3.894e-03, 1.001e-01, 2.044e-02, -3.405e-02, 3.784e-02, 1.062e-01)); + r += mul(s1_1, M4(-1.820e-02, 1.045e-01, 3.270e-02, -1.421e-01, 2.323e-02, -1.212e-01, -5.815e-02, -3.536e-02, 7.484e-02, -5.398e-02, -7.591e-02, -3.319e-03, 2.994e-02, -1.205e-01, -1.216e-01, 6.506e-04)); + r += mul(s1_2, M4(-4.254e-02, 4.430e-02, 1.334e-01, -3.396e-02, -2.487e-02, 3.670e-03, -4.728e-03, 4.544e-02, -3.614e-03, -1.019e-04, 1.291e-01, 8.122e-02, 6.363e-02, -6.492e-02, 2.131e-02, 8.853e-02)); + r += mul(s1_3, M4(-6.085e-02, -7.155e-02, 6.387e-02, -3.618e-04, 9.316e-04, 1.234e-02, 3.535e-02, 1.134e-01, -8.018e-03, 2.279e-02, -7.397e-02, -1.708e-02, -2.241e-02, -7.837e-02, 6.655e-03, -3.115e-02)); + r += mul(s1_4, M4(1.340e-01, -1.899e-01, -2.069e-01, 1.068e-01, 1.531e-01, -5.987e-02, 1.272e-01, -1.749e-01, -1.591e-01, 1.187e-01, -2.502e-01, -4.704e-02, -1.795e-01, 1.684e-01, -2.850e-02, 1.977e-02)); + r += mul(s1_5, M4(2.706e-01, 1.037e-01, 1.069e-02, 6.212e-02, 9.405e-02, 5.078e-02, -1.521e-02, 1.053e-01, 5.587e-02, -1.079e-01, -1.956e-01, 1.002e-01, -9.972e-02, -4.369e-02, 2.127e-02, 3.292e-02)); + r += mul(s1_6, M4(3.024e-02, 3.504e-02, 9.144e-03, 1.017e-01, 2.052e-02, -7.253e-02, -8.188e-03, -2.040e-03, -1.034e-01, 5.712e-02, 5.073e-02, 5.633e-02, 2.876e-02, 6.714e-02, -5.819e-02, -4.248e-03)); + r += mul(s1_7, M4(-5.796e-02, -2.728e-03, 1.136e-03, -1.841e-01, -7.350e-02, -1.392e-02, -5.575e-02, -1.827e-02, 2.426e-01, -9.720e-02, 1.825e-01, -1.503e-01, 2.962e-02, 1.437e-02, -5.738e-02, -2.191e-02)); + r += mul(s1_8, M4(-4.604e-02, -2.008e-02, 1.302e-01, 5.240e-02, 5.437e-02, 9.805e-02, 1.975e-04, 2.174e-02, -2.043e-02, -6.386e-02, 2.431e-02, -2.866e-02, 5.969e-03, -5.000e-02, -2.949e-02, -3.303e-03)); + r += mul(s2_0, M4(-7.025e-02, 1.479e-02, 7.548e-02, 1.139e-01, 4.150e-02, -1.592e-02, -5.557e-02, 4.076e-02, 7.414e-02, -1.435e-02, -1.292e-01, -6.525e-03, -5.171e-02, -1.093e-02, -2.271e-02, 8.183e-02)); + r += mul(s2_1, M4(-1.431e-01, -9.856e-02, -5.329e-02, -1.580e-01, -9.302e-02, 4.383e-02, -1.289e-01, -5.199e-02, -1.177e-02, 2.312e-01, -1.031e-01, -1.042e-01, 7.490e-03, 1.560e-01, 1.859e-02, 1.362e-02)); + r += mul(s2_2, M4(-1.654e-01, 4.700e-02, 5.856e-02, 1.700e-03, -2.360e-02, -2.999e-02, -8.010e-02, -2.625e-03, -8.773e-02, 1.326e-01, -1.586e-02, -1.976e-01, -9.224e-02, 7.006e-02, -4.945e-02, 6.917e-02)); + r += mul(s2_3, M4(1.462e-01, 1.627e-01, -2.231e-01, 1.400e-01, 2.744e-02, -6.890e-02, 7.386e-02, 9.150e-02, 2.180e-02, -3.675e-02, 2.772e-01, 1.038e-02, -1.079e-01, -2.438e-02, -7.679e-02, 4.643e-02)); + r += mul(s2_4, M4(2.548e-03, 2.263e-01, -4.712e-02, 1.055e-01, 9.417e-02, 1.440e-02, -1.447e-01, 1.665e-01, -6.626e-02, -8.829e-02, -1.114e-01, 1.139e-02, -9.637e-03, 1.324e-01, 7.510e-04, 1.059e-01)); + r += mul(s2_5, M4(9.021e-04, -2.296e-02, 9.399e-02, 3.111e-02, 9.295e-02, 1.431e-02, -6.671e-02, 2.304e-02, 7.550e-02, 3.776e-02, 3.722e-02, -2.511e-01, 1.162e-01, 7.330e-02, 8.577e-02, 5.076e-02)); + r += mul(s2_6, M4(-9.806e-02, 5.990e-03, 7.983e-02, 3.230e-02, 2.660e-02, -8.077e-02, 1.827e-02, -6.324e-03, 4.518e-03, 8.430e-02, 2.824e-03, -1.820e-01, -1.280e-02, -5.062e-02, -1.508e-02, 1.335e-01)); + r += mul(s2_7, M4(-5.362e-02, -1.034e-01, 1.001e-01, -9.435e-02, 4.474e-02, 1.027e-01, 1.235e-02, -2.666e-02, -6.371e-02, 1.592e-01, -3.220e-01, 1.046e-01, -1.547e-01, 3.331e-02, 9.219e-02, 7.064e-02)); + r += mul(s2_8, M4(-6.826e-02, -9.174e-03, -3.788e-03, 5.773e-02, 3.371e-02, -5.084e-02, -4.686e-02, -3.770e-02, 3.344e-02, -3.752e-02, 8.161e-02, -9.928e-02, 1.241e-01, 1.417e-02, -2.901e-02, 6.009e-02)); + r += mul(s3_0, M4(4.130e-02, -1.358e-01, 3.513e-02, 6.201e-02, 8.036e-02, -1.246e-01, 4.951e-02, -1.407e-01, -4.433e-02, 2.066e-02, 3.889e-02, 2.549e-02, -3.015e-02, 3.265e-02, 7.889e-03, 3.115e-02)); + r += mul(s3_1, M4(-4.670e-02, 8.732e-04, 1.647e-01, 9.340e-02, -1.168e-01, 2.860e-01, 1.757e-02, -1.000e-01, -8.647e-02, -1.377e-01, -7.349e-03, -1.694e-01, 2.130e-02, -7.362e-02, 3.712e-02, -6.965e-02)); + r += mul(s3_2, M4(8.724e-03, 8.015e-02, 1.968e-02, -1.248e-02, -8.995e-02, 1.331e-01, -1.200e-01, -2.515e-02, -6.216e-02, 3.787e-02, -6.308e-02, 1.125e-02, -5.869e-02, -3.633e-02, -6.967e-02, -1.544e-02)); + r += mul(s3_3, M4(1.343e-01, 2.496e-02, -1.764e-02, -2.927e-02, 6.824e-02, 1.185e-01, -4.921e-02, 1.657e-02, 9.625e-02, -8.617e-03, 4.970e-02, 1.233e-01, 1.569e-02, -1.895e-01, -4.864e-02, 2.237e-02)); + r += mul(s3_4, M4(7.422e-02, 8.261e-02, 1.292e-02, 3.619e-02, 5.032e-03, 6.076e-02, 4.037e-02, -5.895e-02, 1.668e-01, -2.898e-02, 1.089e-01, -4.847e-02, -5.325e-03, -6.417e-02, 1.832e-01, 6.374e-02)); + r += mul(s3_5, M4(-2.028e-01, 7.917e-02, -1.164e-01, 6.820e-02, 1.844e-01, -7.435e-02, 1.413e-01, -8.915e-02, 3.007e-02, -9.739e-03, -1.970e-02, 1.246e-02, 3.375e-02, 7.348e-02, -5.958e-03, 2.043e-02)); + r += mul(s3_6, M4(7.156e-02, 4.010e-02, -1.883e-02, -1.154e-02, -6.288e-02, -1.291e-01, -6.146e-03, -5.936e-02, -1.177e-01, 3.663e-02, 4.254e-02, 2.737e-02, -2.011e-02, -1.161e-02, 2.790e-02, -9.127e-02)); + r += mul(s3_7, M4(-5.564e-02, -1.684e-02, 6.531e-03, -1.219e-02, 1.358e-02, 7.495e-02, -7.805e-03, -1.208e-01, -2.593e-02, -3.261e-02, 4.597e-02, -2.609e-02, 1.406e-02, 5.211e-02, -2.130e-02, -3.469e-02)); + r += mul(s3_8, M4(-6.137e-03, 3.430e-02, -2.481e-02, 9.161e-02, 3.659e-02, -9.274e-03, 1.206e-02, -3.099e-03, 1.999e-02, 1.012e-01, 1.704e-02, 6.203e-02, 1.089e-01, -1.184e-01, 5.553e-02, 2.902e-02)); + r += mul(s4_0, M4(1.461e-02, -1.551e-01, -2.045e-01, -9.320e-02, 1.397e-02, -7.823e-02, -1.060e-02, 2.077e-02, 3.258e-02, 5.564e-03, -2.344e-02, -4.559e-02, 4.307e-02, 7.499e-02, -5.465e-03, -1.686e-01)); + r += mul(s4_1, M4(-2.851e-02, -3.928e-02, 4.599e-02, -2.926e-02, 2.746e-02, 1.332e-01, -9.686e-02, 3.274e-02, -4.287e-02, -4.209e-02, -2.688e-02, -1.460e-01, -3.641e-03, 2.614e-02, -1.196e-01, 2.033e-03)); + r += mul(s4_2, M4(-7.486e-02, 9.743e-03, 8.107e-02, 4.110e-02, 6.560e-02, -1.585e-02, 4.181e-02, 7.497e-04, -1.332e-02, -3.652e-02, -2.131e-01, 2.791e-02, 1.158e-01, 2.130e-02, 4.607e-02, -4.526e-02)); + r += mul(s4_3, M4(3.577e-02, 1.180e-01, -1.284e-01, 1.409e-01, -3.428e-02, -1.468e-02, 2.435e-02, -1.144e-01, 7.831e-03, -2.041e-03, -4.198e-02, 4.532e-02, 1.086e-01, -1.578e-01, -3.489e-01, -1.284e-01)); + r += mul(s4_4, M4(8.087e-02, -1.882e-01, -1.204e-01, 7.248e-02, 1.596e-02, -7.498e-02, -6.765e-02, -2.250e-01, 1.619e-01, -6.744e-02, 2.562e-01, 1.598e-01, 1.870e-01, 2.074e-02, 1.371e-01, -1.859e-02)); + r += mul(s4_5, M4(-6.755e-03, -9.031e-02, 7.718e-02, 2.074e-02, -1.469e-01, -6.064e-02, -7.587e-02, -2.157e-02, -2.652e-02, -6.666e-02, 8.185e-02, 8.830e-02, -6.855e-03, -2.328e-04, -8.399e-03, 6.273e-03)); + r += mul(s4_6, M4(9.535e-02, -8.699e-02, 6.513e-02, 1.189e-02, 2.226e-03, -6.388e-02, 2.262e-02, 8.386e-02, 2.201e-02, -7.890e-02, -1.358e-02, -6.582e-02, -4.518e-02, -1.899e-02, -3.881e-02, -7.528e-02)); + r += mul(s4_7, M4(8.222e-02, 1.725e-02, 5.878e-02, 8.868e-02, 6.476e-03, -5.890e-02, 4.474e-02, -7.509e-03, 5.000e-02, -9.954e-02, 1.173e-02, 1.237e-01, 1.682e-01, 1.572e-01, -1.142e-01, 4.117e-02)); + r += mul(s4_8, M4(7.252e-03, -6.196e-02, 8.715e-03, -5.785e-02, 7.157e-02, -8.942e-03, -2.105e-02, 4.087e-02, 3.523e-02, 1.719e-04, 1.897e-02, -4.083e-02, 9.964e-02, 3.833e-02, 8.276e-02, -4.575e-02)); + r += mul(s5_0, M4(9.987e-02, 1.522e-01, -3.985e-02, -1.547e-01, -4.716e-02, -1.756e-01, 7.039e-02, -8.765e-02, 7.006e-02, -2.538e-02, -3.653e-02, 6.944e-02, -3.986e-02, 3.677e-03, -5.529e-02, 4.638e-02)); + r += mul(s5_1, M4(7.532e-02, 8.089e-02, -1.424e-01, -5.129e-02, -2.033e-01, 2.939e-01, 1.290e-01, -1.441e-01, 1.903e-02, 2.039e-02, 3.890e-02, 9.281e-02, -8.341e-02, -2.442e-01, 1.805e-01, -6.189e-02)); + r += mul(s5_2, M4(9.542e-02, 9.900e-03, 5.219e-02, 7.857e-03, -1.400e-02, 6.051e-02, -8.673e-03, -2.225e-03, 4.251e-02, 1.045e-01, -1.373e-01, -1.750e-02, -9.371e-02, -1.106e-02, 1.124e-02, -2.598e-02)); + r += mul(s5_3, M4(-1.135e-01, 4.119e-02, -1.192e-01, -6.486e-02, 1.198e-01, 1.593e-01, -1.023e-01, 2.825e-02, 1.075e-02, -4.070e-02, 2.593e-02, 4.017e-04, 1.167e-02, -1.509e-01, -2.241e-02, 6.627e-02)); + r += mul(s5_4, M4(-1.352e-01, 8.684e-02, -9.081e-02, 1.318e-02, 2.321e-01, 1.925e-02, 4.704e-02, -4.626e-02, 1.427e-01, -2.476e-02, 1.993e-01, -1.589e-01, 8.974e-02, -1.029e-01, 2.140e-01, 1.650e-01)); + r += mul(s5_5, M4(-1.082e-02, 2.109e-02, 2.120e-02, -1.738e-02, -5.482e-02, -8.325e-02, -1.201e-01, 7.260e-02, 1.420e-01, -1.273e-01, 3.075e-02, -5.140e-02, 2.211e-02, -1.099e-01, 2.451e-03, -3.116e-02)); + r += mul(s5_6, M4(-1.259e-01, -3.762e-02, -2.236e-02, 8.611e-03, 6.435e-03, -9.660e-03, 4.382e-02, -7.011e-02, 2.592e-03, -4.034e-02, 1.003e-02, -3.352e-02, -3.696e-02, -9.924e-02, -3.357e-02, -8.388e-02)); + r += mul(s5_7, M4(-8.994e-02, 4.535e-02, 1.292e-01, 2.478e-02, 7.344e-02, -6.045e-03, -2.870e-02, -3.708e-02, 3.571e-03, -7.399e-02, 5.175e-02, -6.299e-02, 1.470e-01, 2.108e-02, 1.206e-01, -7.442e-02)); + r += mul(s5_8, M4(5.749e-02, -7.397e-02, 2.704e-02, -8.600e-02, 3.798e-02, 8.833e-02, -2.785e-01, -5.148e-02, 1.037e-01, 3.420e-02, 5.157e-03, -4.084e-02, 1.466e-02, 5.439e-02, -1.119e-01, -7.561e-03)); + r += mul(s6_0, M4(2.742e-02, -6.494e-02, -4.966e-02, 1.804e-02, 2.692e-02, 2.641e-02, 9.796e-02, -1.535e-02, 7.345e-02, -4.529e-02, 3.403e-02, -6.150e-02, -5.188e-01, -1.514e-01, 2.775e-01, -2.474e-01)); + r += mul(s6_1, M4(-2.972e-02, 1.199e-01, 1.224e-01, -8.796e-02, -8.309e-04, -1.016e-01, 7.922e-02, -2.243e-02, 6.198e-02, 2.305e-01, -1.473e-02, 1.081e-03, -1.955e-01, -4.880e-01, -1.037e-01, -1.343e-01)); + r += mul(s6_2, M4(-7.005e-02, 1.528e-01, 3.989e-02, -4.230e-03, 1.467e-02, 2.213e-02, 7.629e-03, 7.286e-02, 6.699e-02, -4.735e-02, 4.664e-02, -5.761e-02, -2.448e-01, 4.807e-02, 1.443e-01, 1.173e-01)); + r += mul(s6_3, M4(-4.551e-02, 1.228e-01, 8.698e-03, -7.878e-02, 1.082e-01, 5.290e-02, 1.432e-02, 8.177e-03, -4.298e-02, -4.812e-02, -6.579e-02, 4.557e-04, 4.737e-01, 2.855e-01, -2.542e-02, -5.632e-02)); + r += mul(s6_4, M4(4.002e-02, 1.973e-01, -9.862e-02, -5.884e-02, 1.733e-01, 6.369e-02, -7.105e-02, -8.774e-03, -1.410e-01, -1.482e-02, -1.963e-01, 9.780e-02, 3.215e-01, -1.311e-01, -2.946e-01, 7.310e-02)); + r += mul(s6_5, M4(9.056e-02, 5.977e-02, 2.272e-02, -8.342e-04, -6.023e-02, -2.184e-03, -4.654e-02, -2.816e-02, 3.157e-02, -1.729e-01, -9.960e-02, -6.080e-02, 5.023e-01, 3.177e-01, 3.157e-01, 5.138e-02)); + r += mul(s6_6, M4(2.325e-02, -5.307e-03, 5.136e-02, 6.784e-02, -2.850e-03, -5.042e-03, -6.052e-02, 9.778e-02, 1.223e-01, -7.348e-02, -2.520e-02, -6.094e-02, 5.661e-02, -4.876e-01, 1.305e-01, 1.261e-01)); + r += mul(s6_7, M4(6.601e-02, 3.159e-02, -4.271e-02, -2.147e-02, -1.041e-01, -9.329e-02, 7.523e-02, 5.455e-02, -1.355e-01, 1.018e-01, 3.088e-02, 1.566e-02, -3.210e-01, -4.737e-01, -1.933e-01, 3.030e-01)); + r += mul(s6_8, M4(-1.088e-02, -4.249e-03, -5.350e-02, 1.114e-02, -2.212e-02, 2.213e-02, -7.774e-02, -2.154e-04, 9.930e-03, 4.165e-02, 4.084e-02, -1.120e-01, -1.455e-01, 1.165e-01, 2.067e-01, 2.070e-01)); + r += mul(s7_0, M4(1.044e-02, -6.727e-02, -4.017e-02, 1.033e-01, -9.177e-02, 3.331e-02, 6.122e-02, -5.224e-02, -5.090e-03, -4.668e-02, -5.551e-02, 9.474e-02, -9.753e-03, 1.037e-02, 8.602e-03, -2.863e-02)); + r += mul(s7_1, M4(7.762e-02, 1.322e-01, 3.840e-02, -1.186e-01, -4.493e-02, -7.851e-02, 1.150e-01, -9.820e-02, 1.233e-01, 6.101e-03, -5.135e-02, -8.499e-02, -8.867e-03, 5.269e-02, 2.433e-02, 2.043e-02)); + r += mul(s7_2, M4(-2.944e-02, -4.536e-02, 1.101e-01, 5.716e-02, -2.883e-03, -1.386e-01, -3.786e-02, 1.342e-01, 1.657e-03, 8.720e-02, 4.810e-02, -4.211e-02, 2.582e-02, -2.044e-02, 4.881e-02, 1.751e-02)); + r += mul(s7_3, M4(-2.891e-02, 2.374e-02, -1.471e-01, -1.000e-01, 1.052e-01, 1.472e-01, -3.824e-02, 1.123e-01, -1.409e-02, 1.099e-02, 3.039e-03, 2.359e-02, -3.325e-03, -1.590e-02, 5.841e-03, 6.255e-03)); + r += mul(s7_4, M4(-7.364e-02, 4.827e-02, -1.356e-01, -2.224e-01, 2.287e-01, -1.602e-01, -2.252e-01, -1.203e-02, -1.392e-01, 1.150e-01, -2.736e-01, 2.918e-02, 2.921e-02, 9.439e-02, -3.142e-02, 1.954e-02)); + r += mul(s7_5, M4(-4.423e-02, -1.939e-01, -1.404e-02, 1.489e-01, 2.856e-02, 4.562e-02, 1.123e-01, 3.050e-02, 7.547e-02, 1.469e-01, -4.395e-02, 4.094e-02, 2.145e-02, 4.439e-02, -4.958e-02, 2.650e-02)); + r += mul(s7_6, M4(2.550e-02, -1.502e-01, 6.659e-02, -3.936e-02, -8.184e-02, -5.807e-02, 2.311e-01, -5.460e-02, 2.067e-03, -1.785e-02, -8.422e-03, -1.067e-01, 1.877e-02, 3.037e-02, -8.897e-04, 1.152e-01)); + r += mul(s7_7, M4(-2.983e-02, -2.250e-01, 9.011e-02, -2.115e-01, -1.220e-01, -1.328e-01, -5.793e-02, -1.087e-01, 2.961e-03, 4.061e-02, -2.935e-02, 1.711e-02, 4.291e-02, 3.807e-02, -5.370e-02, 2.247e-02)); + r += mul(s7_8, M4(-4.709e-02, -6.844e-03, -1.067e-01, 9.606e-02, -4.139e-02, 5.400e-02, 6.785e-02, 2.060e-02, 1.034e-02, 1.440e-02, -3.056e-02, -4.364e-02, -5.640e-02, -2.057e-03, -3.250e-02, 5.321e-02)); + r += V4(3.028e-04, 1.783e-02, -7.192e-03, -2.224e-02); + return r; +} + +void Pass14(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = Rmp8x8(tid.x) + blockStart; + uint2 size = GetInputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = (gxy + 0.5) * pt; + + V4 s0_0 = l0(-1.0, -1.0); + V4 s0_1 = l0(0.0, -1.0); + V4 s0_2 = l0(1.0, -1.0); + V4 s0_3 = l0(-1.0, 0.0); + V4 s0_4 = l0(0.0, 0.0); + V4 s0_5 = l0(1.0, 0.0); + V4 s0_6 = l0(-1.0, 1.0); + V4 s0_7 = l0(0.0, 1.0); + V4 s0_8 = l0(1.0, 1.0); + V4 s1_0 = -max(-s0_0, 0.0); + V4 s1_1 = -max(-s0_1, 0.0); + V4 s1_2 = -max(-s0_2, 0.0); + V4 s1_3 = -max(-s0_3, 0.0); + V4 s1_4 = -max(-s0_4, 0.0); + V4 s1_5 = -max(-s0_5, 0.0); + V4 s1_6 = -max(-s0_6, 0.0); + V4 s1_7 = -max(-s0_7, 0.0); + V4 s1_8 = -max(-s0_8, 0.0); + s0_0 = max(s0_0, 0.0); + s0_1 = max(s0_1, 0.0); + s0_2 = max(s0_2, 0.0); + s0_3 = max(s0_3, 0.0); + s0_4 = max(s0_4, 0.0); + s0_5 = max(s0_5, 0.0); + s0_6 = max(s0_6, 0.0); + s0_7 = max(s0_7, 0.0); + s0_8 = max(s0_8, 0.0); + + V4 s2_0 = l1(-1.0, -1.0); + V4 s2_1 = l1(0.0, -1.0); + V4 s2_2 = l1(1.0, -1.0); + V4 s2_3 = l1(-1.0, 0.0); + V4 s2_4 = l1(0.0, 0.0); + V4 s2_5 = l1(1.0, 0.0); + V4 s2_6 = l1(-1.0, 1.0); + V4 s2_7 = l1(0.0, 1.0); + V4 s2_8 = l1(1.0, 1.0); + V4 s3_0 = -max(-s2_0, 0.0); + V4 s3_1 = -max(-s2_1, 0.0); + V4 s3_2 = -max(-s2_2, 0.0); + V4 s3_3 = -max(-s2_3, 0.0); + V4 s3_4 = -max(-s2_4, 0.0); + V4 s3_5 = -max(-s2_5, 0.0); + V4 s3_6 = -max(-s2_6, 0.0); + V4 s3_7 = -max(-s2_7, 0.0); + V4 s3_8 = -max(-s2_8, 0.0); + s2_0 = max(s2_0, 0.0); + s2_1 = max(s2_1, 0.0); + s2_2 = max(s2_2, 0.0); + s2_3 = max(s2_3, 0.0); + s2_4 = max(s2_4, 0.0); + s2_5 = max(s2_5, 0.0); + s2_6 = max(s2_6, 0.0); + s2_7 = max(s2_7, 0.0); + s2_8 = max(s2_8, 0.0); + + V4 s4_0 = l2(-1.0, -1.0); + V4 s4_1 = l2(0.0, -1.0); + V4 s4_2 = l2(1.0, -1.0); + V4 s4_3 = l2(-1.0, 0.0); + V4 s4_4 = l2(0.0, 0.0); + V4 s4_5 = l2(1.0, 0.0); + V4 s4_6 = l2(-1.0, 1.0); + V4 s4_7 = l2(0.0, 1.0); + V4 s4_8 = l2(1.0, 1.0); + V4 s5_0 = -max(-s4_0, 0.0); + V4 s5_1 = -max(-s4_1, 0.0); + V4 s5_2 = -max(-s4_2, 0.0); + V4 s5_3 = -max(-s4_3, 0.0); + V4 s5_4 = -max(-s4_4, 0.0); + V4 s5_5 = -max(-s4_5, 0.0); + V4 s5_6 = -max(-s4_6, 0.0); + V4 s5_7 = -max(-s4_7, 0.0); + V4 s5_8 = -max(-s4_8, 0.0); + s4_0 = max(s4_0, 0.0); + s4_1 = max(s4_1, 0.0); + s4_2 = max(s4_2, 0.0); + s4_3 = max(s4_3, 0.0); + s4_4 = max(s4_4, 0.0); + s4_5 = max(s4_5, 0.0); + s4_6 = max(s4_6, 0.0); + s4_7 = max(s4_7, 0.0); + s4_8 = max(s4_8, 0.0); + + V4 s6_0 = l3(-1.0, -1.0); + V4 s6_1 = l3(0.0, -1.0); + V4 s6_2 = l3(1.0, -1.0); + V4 s6_3 = l3(-1.0, 0.0); + V4 s6_4 = l3(0.0, 0.0); + V4 s6_5 = l3(1.0, 0.0); + V4 s6_6 = l3(-1.0, 1.0); + V4 s6_7 = l3(0.0, 1.0); + V4 s6_8 = l3(1.0, 1.0); + V4 s7_0 = -max(-s6_0, 0.0); + V4 s7_1 = -max(-s6_1, 0.0); + V4 s7_2 = -max(-s6_2, 0.0); + V4 s7_3 = -max(-s6_3, 0.0); + V4 s7_4 = -max(-s6_4, 0.0); + V4 s7_5 = -max(-s6_5, 0.0); + V4 s7_6 = -max(-s6_6, 0.0); + V4 s7_7 = -max(-s6_7, 0.0); + V4 s7_8 = -max(-s6_8, 0.0); + s6_0 = max(s6_0, 0.0); + s6_1 = max(s6_1, 0.0); + s6_2 = max(s6_2, 0.0); + s6_3 = max(s6_3, 0.0); + s6_4 = max(s6_4, 0.0); + s6_5 = max(s6_5, 0.0); + s6_6 = max(s6_6, 0.0); + s6_7 = max(s6_7, 0.0); + s6_8 = max(s6_8, 0.0); + + t4[gxy] = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t5[gxy] = f1(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t6[gxy] = f2(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t7[gxy] = f3(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); +} + +//!PASS 15 +//!DESC conv14 +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 +//!IN t4, t5, t6, t7 +//!OUT t0, t1, t2, t3 + +#define l0(x, y) V4(O(t4, float2(x, y))) +#define l1(x, y) V4(O(t5, float2(x, y))) +#define l2(x, y) V4(O(t6, float2(x, y))) +#define l3(x, y) V4(O(t7, float2(x, y))) + +V4 f0(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(4.520e-02, 9.061e-03, 7.165e-03, -5.094e-02, -1.655e-02, 4.687e-02, -6.105e-02, 3.508e-02, -1.043e-01, 2.113e-01, 4.505e-03, 8.240e-02, -4.876e-02, -9.482e-02, -7.693e-02, 1.161e-01)); + r += mul(s0_1, M4(4.078e-02, 1.289e-02, -8.984e-04, 3.727e-04, 4.315e-02, 1.979e-02, 2.196e-02, 9.723e-03, 8.258e-02, -1.150e-01, 5.587e-02, -2.661e-02, 3.970e-02, -8.844e-02, -1.401e-01, -3.586e-02)); + r += mul(s0_2, M4(1.090e-01, 4.265e-02, 2.487e-02, 7.634e-03, 5.478e-02, 9.598e-03, 5.827e-04, 8.746e-03, -9.220e-02, 5.258e-03, -1.203e-03, 3.657e-02, -1.666e-01, 1.389e-01, -1.942e-01, 3.285e-02)); + r += mul(s0_3, M4(-1.605e-02, 1.765e-02, -2.930e-02, 5.127e-02, 1.461e-01, 5.289e-02, 9.307e-02, -3.053e-02, -1.241e-02, 5.344e-02, 1.463e-01, -1.771e-03, -7.651e-02, -2.550e-01, -6.467e-02, 1.428e-01)); + r += mul(s0_4, M4(-2.380e-02, -1.061e-01, -7.748e-02, 6.133e-02, -3.672e-03, 3.549e-02, 1.001e-01, 7.683e-02, 9.351e-02, 1.099e-01, 1.646e-02, -1.912e-01, -2.428e-01, 1.356e-01, -2.369e-01, -1.945e-01)); + r += mul(s0_5, M4(7.313e-02, 1.045e-01, 2.327e-02, 2.226e-02, -1.120e-01, 2.471e-03, -9.548e-02, -5.460e-02, -4.372e-02, -6.836e-03, 3.352e-02, -3.382e-02, -1.532e-01, -9.464e-02, -4.272e-02, -5.013e-02)); + r += mul(s0_6, M4(-9.837e-03, -1.886e-02, -3.552e-02, 2.822e-02, -3.780e-02, 4.716e-02, 5.778e-03, 1.144e-02, -5.002e-02, -1.351e-01, -5.085e-02, 8.309e-03, -6.870e-02, -3.705e-02, -3.342e-02, 1.377e-01)); + r += mul(s0_7, M4(-2.443e-02, 6.948e-02, -2.911e-02, 3.220e-02, 3.894e-02, 2.226e-03, -5.461e-02, -3.934e-03, 2.554e-02, 1.352e-01, 5.141e-02, 1.554e-02, -1.683e-01, -5.017e-02, -1.017e-01, 6.619e-02)); + r += mul(s0_8, M4(-3.691e-03, 2.178e-02, -3.334e-02, -1.720e-02, 2.287e-02, -3.840e-03, -1.644e-02, 7.498e-03, 2.399e-02, -4.482e-03, 7.416e-02, 9.260e-02, -1.417e-02, 4.232e-02, -2.408e-02, 2.538e-02)); + r += mul(s1_0, M4(9.408e-02, 1.775e-02, 9.153e-02, -9.538e-02, -3.261e-02, -2.224e-01, 4.754e-03, 1.990e-02, 4.197e-02, -7.009e-02, 4.511e-02, -6.852e-02, -8.372e-02, -2.756e-02, -5.055e-02, 9.655e-02)); + r += mul(s1_1, M4(1.575e-01, -3.467e-01, 1.024e-01, -1.172e-01, -1.326e-01, 1.287e-01, -1.606e-01, -7.318e-02, 1.028e-01, 8.486e-02, 1.902e-01, 3.564e-02, -3.728e-02, -5.029e-02, -1.036e-01, -3.348e-02)); + r += mul(s1_2, M4(-6.901e-02, 1.075e-01, -1.412e-01, -1.619e-01, 4.286e-02, 1.851e-02, -3.348e-02, 2.328e-02, -1.746e-02, -1.882e-01, 7.348e-02, -3.591e-02, -1.307e-01, 4.958e-02, -4.621e-02, 2.819e-02)); + r += mul(s1_3, M4(-8.378e-02, -2.983e-02, -1.650e-01, 1.058e-01, -4.490e-02, -4.505e-02, -1.475e-01, 4.760e-02, 1.118e-01, -1.117e-01, 8.818e-02, 1.330e-01, -5.398e-02, -8.459e-02, -2.726e-02, 1.897e-02)); + r += mul(s1_4, M4(-9.076e-02, -1.981e-01, -3.018e-01, 3.338e-01, 1.259e-01, 2.661e-01, -3.924e-01, 1.243e-01, -5.296e-02, 5.934e-02, 3.021e-02, 1.854e-01, -1.158e-01, -3.895e-02, -1.878e-01, -2.013e-02)); + r += mul(s1_5, M4(1.515e-01, 2.450e-01, 1.439e-01, -9.116e-02, 1.503e-01, -4.574e-02, 8.095e-04, 2.724e-02, 9.322e-02, -7.895e-02, 9.896e-02, 1.443e-02, -6.188e-02, 1.225e-02, -1.009e-01, 8.640e-02)); + r += mul(s1_6, M4(-5.459e-02, -2.330e-02, 6.539e-02, -9.657e-02, -3.381e-02, -8.115e-02, -1.265e-01, -9.178e-02, -2.206e-02, -2.231e-02, 5.822e-02, 9.318e-02, -2.048e-02, 2.159e-02, -2.368e-02, 1.695e-02)); + r += mul(s1_7, M4(7.189e-02, -2.730e-02, -3.870e-02, 7.726e-03, 3.076e-02, -4.018e-02, -2.288e-01, -1.779e-02, -6.300e-02, 5.290e-02, 5.645e-02, 2.506e-03, 2.425e-04, -1.690e-02, -2.466e-02, -1.409e-02)); + r += mul(s1_8, M4(-2.173e-02, 8.077e-02, 7.793e-02, 6.126e-02, 4.669e-02, -1.724e-01, 3.943e-02, 5.754e-02, -1.738e-03, 2.877e-02, -1.084e-01, 2.391e-02, 1.628e-04, 5.397e-02, 2.224e-02, -8.554e-03)); + r += mul(s2_0, M4(-4.331e-03, -5.867e-02, -3.177e-02, 6.613e-02, 9.585e-02, -7.778e-02, -2.847e-02, 7.286e-02, 1.227e-02, -2.133e-02, 2.420e-02, -6.251e-02, 6.880e-02, -3.772e-02, -3.381e-02, -4.090e-02)); + r += mul(s2_1, M4(-1.133e-02, 5.064e-02, -1.051e-01, 3.497e-02, 1.026e-01, 1.407e-02, 1.533e-01, -4.692e-02, -1.064e-01, 1.273e-01, 1.226e-01, 4.135e-02, 7.598e-03, -3.096e-01, 1.763e-01, -7.671e-02)); + r += mul(s2_2, M4(2.982e-02, -2.636e-02, -6.052e-03, 1.350e-02, -1.630e-02, 6.478e-02, 1.856e-01, -1.314e-01, 9.092e-02, 1.019e-02, 6.708e-02, 2.351e-02, -4.831e-03, -1.038e-01, 5.885e-02, 7.098e-02)); + r += mul(s2_3, M4(1.248e-01, -6.314e-02, -4.520e-02, 4.632e-02, 2.206e-02, 7.499e-03, 6.513e-02, 1.149e-02, 4.001e-02, 8.358e-02, 9.838e-02, -1.446e-01, -1.403e-01, 4.578e-02, 1.191e-01, 1.155e-02)); + r += mul(s2_4, M4(-1.180e-01, 6.489e-02, -3.881e-02, -7.020e-02, 2.950e-01, 5.144e-02, 5.632e-02, 2.020e-01, -2.347e-01, -1.468e-01, 1.400e-02, -9.934e-02, -8.827e-02, 4.938e-02, 1.991e-01, -2.667e-01)); + r += mul(s2_5, M4(-1.132e-02, -1.172e-01, 4.511e-02, -7.538e-03, 1.501e-01, 4.288e-02, 7.285e-02, 8.796e-02, -1.319e-02, -6.738e-03, -1.969e-02, 2.739e-02, -9.828e-02, -3.924e-01, -6.699e-02, 8.011e-02)); + r += mul(s2_6, M4(-1.414e-01, 1.814e-02, -1.186e-03, -1.490e-02, -3.390e-02, 2.791e-02, -1.435e-02, 3.310e-02, 3.829e-02, -2.508e-02, 2.153e-02, 1.156e-02, 3.513e-02, 9.952e-03, 1.705e-02, 4.052e-02)); + r += mul(s2_7, M4(-7.547e-02, 7.771e-03, 5.824e-02, -1.556e-02, -6.012e-03, 2.857e-02, -4.784e-03, -3.217e-02, -4.018e-02, 4.216e-02, -6.089e-02, 6.490e-02, 1.298e-01, -7.631e-02, 5.301e-02, -1.944e-02)); + r += mul(s2_8, M4(-6.371e-02, -1.356e-02, -1.181e-02, -1.188e-02, -5.207e-03, -1.543e-02, -1.549e-02, -1.720e-02, 3.732e-02, 8.105e-03, -6.487e-02, -1.049e-01, 5.857e-02, -7.736e-02, -1.105e-01, 9.924e-03)); + r += mul(s3_0, M4(1.502e-02, 2.684e-02, -1.408e-02, 3.120e-02, 9.221e-02, -2.707e-02, 5.912e-02, 1.144e-02, -1.262e-02, 1.442e-02, -1.448e-02, -6.457e-03, -1.292e-02, -3.652e-02, 3.969e-02, 2.617e-02)); + r += mul(s3_1, M4(-1.324e-01, 4.015e-02, 9.011e-02, -6.464e-02, 1.221e-01, 1.459e-01, 1.162e-01, -1.016e-01, 9.380e-02, 7.543e-02, 9.329e-02, 5.384e-02, 2.409e-03, -7.853e-02, -7.205e-02, 2.276e-02)); + r += mul(s3_2, M4(4.667e-02, -7.248e-02, 4.400e-02, -2.877e-02, 1.212e-01, -1.721e-01, 9.711e-02, -6.876e-02, 9.737e-02, 4.954e-03, -1.006e-02, 6.376e-03, -6.289e-02, 1.046e-01, -2.945e-02, 4.816e-03)); + r += mul(s3_3, M4(1.090e-02, 5.755e-02, 4.615e-02, -1.015e-01, -9.423e-02, -2.077e-02, -3.823e-02, 6.670e-02, -5.715e-03, 1.179e-01, 3.552e-02, -1.993e-02, 4.955e-02, -4.377e-02, -1.386e-02, -2.830e-02)); + r += mul(s3_4, M4(-3.189e-01, 1.007e-01, -1.225e-01, -2.353e-01, 1.082e-01, -1.464e-01, -1.124e-01, -5.875e-03, -3.078e-01, -1.370e-01, -4.142e-02, -1.133e-01, 6.690e-03, 3.615e-02, 1.928e-01, -7.727e-02)); + r += mul(s3_5, M4(3.230e-02, -4.933e-02, 2.392e-02, 5.883e-03, 1.015e-02, 5.707e-02, -4.644e-02, -3.431e-03, 1.505e-02, -2.291e-02, 4.979e-02, 5.956e-02, -1.830e-01, -1.241e-02, -6.895e-03, -2.365e-01)); + r += mul(s3_6, M4(-3.668e-03, -1.234e-02, -5.362e-02, -3.682e-02, -1.528e-02, -8.507e-03, -3.542e-02, 1.764e-02, -1.484e-02, -3.709e-02, 5.443e-02, 4.533e-02, -5.981e-03, -6.767e-04, 4.552e-02, 2.928e-02)); + r += mul(s3_7, M4(-1.871e-03, 1.066e-01, 1.668e-01, 2.620e-02, 3.353e-02, -3.347e-02, -2.437e-02, -8.058e-02, -2.368e-03, -1.985e-02, -3.304e-02, 9.884e-02, 4.154e-02, 2.005e-02, 2.131e-03, 8.056e-03)); + r += mul(s3_8, M4(-5.042e-03, -2.574e-05, 4.282e-02, -2.479e-03, -4.246e-02, 3.508e-02, 8.919e-03, -4.266e-02, -4.886e-04, -5.371e-02, -3.269e-02, -2.143e-02, 1.787e-02, -1.015e-01, -5.345e-02, -1.446e-02)); + r += mul(s4_0, M4(-9.572e-02, 2.337e-02, -7.165e-02, -4.728e-02, 6.882e-02, -1.117e-01, -3.524e-03, 9.028e-02, 3.381e-02, -5.153e-02, 3.482e-02, 7.497e-03, -7.289e-02, 3.443e-02, -2.239e-02, -7.685e-02)); + r += mul(s4_1, M4(1.020e-01, -1.108e-01, -8.442e-03, -5.390e-02, 1.077e-01, 3.672e-01, -1.139e-01, 6.457e-03, -1.226e-01, 3.169e-02, -2.123e-02, -1.163e-01, -2.036e-02, -4.896e-02, 8.310e-03, -5.898e-03)); + r += mul(s4_2, M4(-5.486e-02, -4.220e-02, 1.462e-03, 2.205e-02, 1.165e-01, -7.539e-02, 4.054e-02, 2.338e-02, -1.018e-01, -3.474e-02, 3.885e-02, -2.415e-02, -3.153e-02, -1.360e-01, 1.864e-02, -5.074e-03)); + r += mul(s4_3, M4(5.259e-02, 2.241e-02, 7.516e-02, -3.380e-02, -1.733e-01, -2.973e-03, -3.853e-02, 1.565e-01, 5.921e-02, -4.893e-02, 2.826e-02, -3.375e-02, -1.792e-02, -7.939e-02, 1.088e-01, -3.121e-03)); + r += mul(s4_4, M4(6.188e-02, -8.176e-02, -7.622e-02, 7.011e-02, 4.541e-03, 9.299e-02, -9.473e-02, 2.367e-01, -5.478e-03, 3.866e-03, 2.117e-01, -2.372e-01, -8.894e-03, 2.171e-01, 3.491e-02, 1.617e-01)); + r += mul(s4_5, M4(-4.379e-02, -1.588e-02, 5.588e-02, 6.287e-02, -5.315e-02, 3.877e-02, -7.158e-02, 4.891e-02, -5.016e-02, -1.108e-01, 5.351e-02, -5.953e-02, -7.411e-02, -6.710e-02, -2.914e-02, 3.205e-02)); + r += mul(s4_6, M4(-7.663e-03, 9.218e-02, 6.042e-02, -1.563e-03, -7.020e-02, 1.212e-02, -3.199e-02, 9.813e-03, -4.041e-02, 6.082e-02, 9.936e-02, 3.931e-02, -1.277e-03, -7.841e-02, 1.318e-02, 7.572e-02)); + r += mul(s4_7, M4(3.668e-02, -9.931e-02, 1.053e-01, -9.885e-03, 4.724e-02, -8.108e-02, -7.853e-02, -5.578e-02, 1.704e-02, 1.017e-01, 2.760e-02, -4.296e-02, -2.657e-02, 2.308e-02, -7.335e-02, 4.273e-02)); + r += mul(s4_8, M4(5.012e-02, 1.806e-02, -4.231e-02, 1.013e-02, 7.312e-02, -4.376e-02, -4.732e-02, 3.329e-02, -4.193e-02, -7.620e-02, -1.200e-01, -3.128e-02, 6.742e-02, 3.106e-02, 8.698e-03, 1.523e-03)); + r += mul(s5_0, M4(-1.065e-01, 4.137e-02, -1.773e-01, -2.320e-03, -1.468e-02, -8.848e-02, -6.165e-02, 3.390e-02, 7.447e-02, 6.137e-02, 1.329e-02, -4.660e-02, 1.301e-01, -5.199e-02, 2.477e-02, -3.378e-02)); + r += mul(s5_1, M4(-1.872e-01, -2.124e-01, -2.401e-02, 4.330e-02, 8.121e-02, 1.337e-01, -1.342e-03, 4.743e-02, -2.453e-02, -9.993e-02, -3.550e-02, -6.161e-02, 1.301e-01, 2.105e-01, -5.685e-02, 7.897e-02)); + r += mul(s5_2, M4(2.227e-03, -4.188e-02, -1.059e-02, -2.907e-02, -1.974e-02, -1.839e-02, -5.555e-02, -2.603e-02, 6.994e-03, 1.302e-01, 4.003e-02, 1.953e-02, 7.807e-02, 3.923e-02, 9.819e-03, -1.881e-02)); + r += mul(s5_3, M4(5.839e-02, 1.733e-02, -1.987e-02, -4.801e-02, -1.187e-01, -4.304e-02, -3.163e-02, -3.404e-03, -1.042e-01, 9.301e-02, -6.772e-02, -1.653e-02, -1.270e-02, 7.968e-02, 3.777e-02, -6.998e-02)); + r += mul(s5_4, M4(1.221e-01, -9.160e-02, 1.586e-02, 1.643e-01, -1.095e-02, 5.873e-02, 8.203e-03, 2.496e-02, -3.622e-02, -9.396e-02, 3.843e-02, 1.405e-01, -4.632e-02, -2.124e-02, 5.954e-02, -4.145e-02)); + r += mul(s5_5, M4(1.068e-02, -1.200e-01, 1.693e-02, 6.453e-03, 1.618e-02, -8.935e-03, 1.501e-02, 1.059e-02, 1.518e-01, -5.564e-02, 8.039e-02, 1.901e-01, -7.955e-02, -5.667e-02, 1.806e-02, 1.921e-02)); + r += mul(s5_6, M4(-8.751e-02, -1.101e-02, 6.480e-03, 4.478e-02, -2.982e-02, -1.486e-02, 2.435e-02, 2.169e-02, -1.068e-02, -2.210e-04, 1.688e-02, -2.216e-02, 9.956e-02, 5.408e-02, 1.172e-02, -9.444e-02)); + r += mul(s5_7, M4(-1.755e-02, -3.678e-02, 8.716e-02, -2.128e-02, -1.422e-02, 4.511e-02, -4.518e-02, -9.332e-03, 4.277e-03, 4.233e-02, -2.754e-02, 2.549e-02, 1.461e-01, -1.102e-01, -4.402e-02, -9.835e-02)); + r += mul(s5_8, M4(1.146e-02, 2.644e-02, -1.486e-02, -3.141e-02, 4.945e-02, -6.558e-02, -2.407e-02, 1.095e-02, 2.877e-02, -2.930e-02, -1.080e-01, 8.884e-02, -1.842e-02, 1.077e-01, -4.447e-02, -3.499e-02)); + r += mul(s6_0, M4(1.392e-01, -1.479e-01, 1.441e-01, -1.314e-01, 9.271e-02, 4.641e-02, -1.609e-02, -4.029e-02, 1.813e-01, -1.382e-01, 1.622e-01, -2.597e-03, 7.643e-03, 4.263e-02, 4.371e-02, -1.623e-02)); + r += mul(s6_1, M4(-8.154e-02, 1.029e-01, -8.564e-02, -2.568e-02, -2.019e-02, 5.061e-02, -4.032e-02, -9.548e-02, -2.244e-01, 2.325e-01, 6.855e-02, -1.146e-02, -4.743e-02, -1.411e-01, 6.163e-02, 8.083e-02)); + r += mul(s6_2, M4(1.761e-01, 1.044e-01, 5.591e-04, 6.322e-02, 1.806e-01, -1.985e-02, -1.248e-03, -7.764e-02, 1.630e-03, 1.104e-01, 2.046e-02, -1.451e-02, -3.078e-02, 9.157e-03, 1.067e-02, 7.708e-02)); + r += mul(s6_3, M4(-1.378e-01, -8.672e-02, -9.009e-02, 1.598e-01, -1.113e-01, 1.244e-01, 8.502e-02, -8.122e-02, -3.216e-02, -6.801e-02, -1.447e-01, 1.940e-01, -5.016e-02, -4.162e-03, 2.224e-02, 1.066e-02)); + r += mul(s6_4, M4(-8.368e-02, -2.311e-02, 7.956e-02, -1.802e-01, -2.031e-01, 1.252e-01, -2.962e-01, -2.342e-01, -2.382e-01, 2.492e-01, 1.083e-01, 6.798e-03, -3.791e-02, -3.949e-02, 1.389e-01, 8.435e-02)); + r += mul(s6_5, M4(-3.845e-02, 9.809e-02, 3.301e-02, -2.086e-02, 4.575e-02, -6.166e-02, -1.299e-02, -3.755e-02, 1.417e-01, -2.103e-01, 1.357e-01, 1.637e-01, -1.740e-02, -4.272e-02, -1.657e-02, -4.078e-02)); + r += mul(s6_6, M4(6.272e-02, 9.681e-03, 4.013e-02, 4.030e-03, 1.786e-01, -9.018e-02, 7.949e-04, -1.558e-01, 7.173e-02, -1.150e-02, -3.239e-03, -1.407e-02, -1.486e-02, 1.438e-02, 1.303e-03, 1.205e-01)); + r += mul(s6_7, M4(8.837e-02, -3.278e-05, 2.059e-02, 4.563e-02, 2.288e-01, -3.011e-02, 3.220e-02, -1.446e-01, 3.866e-02, 1.946e-01, -6.171e-02, 4.608e-02, -7.248e-03, -9.509e-02, -1.101e-01, 2.514e-02)); + r += mul(s6_8, M4(6.715e-02, -3.799e-02, 1.233e-02, 3.845e-02, 4.095e-02, 1.035e-01, -7.094e-04, 1.179e-02, -5.727e-02, 7.091e-02, 1.233e-02, 3.150e-02, -1.288e-01, -6.140e-02, 3.551e-02, 1.475e-02)); + r += mul(s7_0, M4(1.559e-02, -4.546e-02, -2.498e-02, -8.263e-03, -2.595e-02, 8.080e-02, 1.693e-02, -8.455e-03, 3.973e-02, 4.903e-02, -2.466e-02, -3.502e-02, 2.535e-02, -1.616e-02, 5.256e-02, 1.726e-02)); + r += mul(s7_1, M4(6.141e-02, -1.139e-01, 9.047e-02, -1.018e-02, 1.799e-02, -2.033e-02, 5.764e-02, -2.952e-02, 2.253e-02, -2.111e-02, 2.504e-02, -4.482e-02, 4.218e-02, -1.337e-01, 4.234e-02, -1.179e-02)); + r += mul(s7_2, M4(3.754e-02, 4.565e-02, 2.561e-02, 4.498e-04, 2.121e-02, -3.992e-02, 3.079e-02, -1.898e-02, 2.024e-03, 1.188e-02, 4.278e-02, -1.906e-02, -5.639e-02, 8.857e-02, -1.211e-02, -6.092e-02)); + r += mul(s7_3, M4(3.959e-02, 6.645e-02, 4.770e-02, 6.584e-02, -1.431e-02, 6.619e-02, 3.308e-02, -2.684e-02, 5.084e-02, 1.619e-02, -3.862e-02, 6.822e-02, -8.166e-02, -8.542e-03, 3.875e-02, 5.607e-02)); + r += mul(s7_4, M4(3.997e-03, -4.094e-02, 1.107e-01, 4.913e-02, -4.575e-02, 5.941e-03, -5.463e-02, -2.670e-02, 9.170e-02, -5.643e-03, -3.445e-02, -7.159e-03, 6.417e-02, -6.162e-02, 9.118e-02, 1.656e-02)); + r += mul(s7_5, M4(3.627e-02, 4.509e-02, 1.639e-02, 4.892e-02, -1.727e-02, 5.673e-02, 1.879e-03, 1.862e-02, -5.158e-02, 3.773e-02, -9.557e-02, -4.059e-02, -1.096e-02, -6.294e-02, -9.984e-02, -4.299e-02)); + r += mul(s7_6, M4(4.716e-02, 1.426e-02, -6.331e-03, 6.964e-02, -4.209e-02, 4.494e-02, -8.120e-03, -3.092e-02, 1.962e-02, -6.431e-02, -1.813e-02, 1.151e-02, -2.888e-02, -7.188e-02, -1.600e-02, 4.232e-02)); + r += mul(s7_7, M4(-9.275e-03, 3.692e-02, 1.951e-02, 3.721e-02, -9.679e-03, -6.941e-02, 5.761e-02, -1.165e-01, 4.882e-03, 1.219e-01, -3.004e-02, -5.402e-03, -7.408e-03, -5.023e-02, -3.673e-02, 2.835e-02)); + r += mul(s7_8, M4(2.414e-02, -1.292e-02, 7.358e-03, -1.921e-02, -6.249e-02, 8.742e-02, 3.769e-02, -2.660e-02, 2.220e-02, 4.532e-02, 1.897e-02, -5.224e-02, -4.258e-02, -6.833e-02, 6.953e-02, -4.832e-02)); + r += V4(1.156e-02, -9.983e-03, -9.430e-03, 1.703e-02); + return r; +} + +V4 f1(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(4.276e-02, 3.292e-03, 4.991e-02, 1.294e-02, -2.029e-02, 5.556e-02, -3.299e-02, 2.250e-02, -3.107e-02, 1.075e-01, -4.560e-02, -7.375e-02, 8.055e-02, -4.802e-02, 1.061e-01, -7.426e-03)); + r += mul(s0_1, M4(-1.422e-03, -5.646e-02, 9.268e-02, 4.075e-02, -3.098e-02, 2.911e-03, 9.203e-02, -2.840e-02, 2.220e-02, -5.553e-02, -1.990e-01, 4.259e-02, -4.396e-02, -4.299e-02, 6.749e-02, 6.026e-02)); + r += mul(s0_2, M4(-5.280e-02, -5.906e-02, -1.509e-01, -4.675e-02, 1.426e-03, -1.100e-02, -2.137e-02, -6.311e-02, 3.037e-03, 3.620e-02, 1.628e-01, 1.833e-03, -1.729e-02, 1.082e-01, 3.468e-02, -4.741e-02)); + r += mul(s0_3, M4(4.507e-02, -1.317e-02, -4.522e-03, -3.344e-02, -8.228e-02, -4.930e-02, 2.119e-02, 1.648e-01, -1.810e-01, -4.608e-02, -4.415e-02, 6.678e-02, -7.990e-02, -3.225e-02, 2.832e-02, 8.739e-02)); + r += mul(s0_4, M4(5.128e-02, 9.946e-02, 9.086e-03, -2.913e-02, -6.700e-02, -2.583e-02, -3.194e-01, 1.770e-01, -1.268e-02, -8.137e-03, 3.033e-01, 1.250e-01, 2.784e-01, 1.067e-01, 3.498e-02, -4.576e-02)); + r += mul(s0_5, M4(4.732e-03, -5.209e-02, -2.234e-02, 3.862e-03, 1.159e-02, 2.303e-02, 1.346e-01, -2.197e-02, -6.371e-03, -1.477e-02, 2.830e-02, -7.637e-02, -3.757e-02, -7.859e-02, 2.042e-02, -1.091e-02)); + r += mul(s0_6, M4(6.354e-03, -3.975e-02, 2.362e-03, 2.314e-03, 6.096e-02, -2.846e-02, 4.908e-02, 1.946e-02, -3.325e-02, -3.436e-02, -6.850e-02, 2.433e-02, 3.478e-02, 1.909e-02, 4.114e-02, 1.673e-02)); + r += mul(s0_7, M4(4.378e-02, -5.888e-03, -3.222e-02, -4.879e-02, 4.807e-02, 1.345e-02, 1.072e-01, 3.260e-02, -9.788e-02, 1.194e-01, 2.676e-03, 4.524e-02, -4.491e-02, -1.929e-02, 6.574e-02, 1.128e-03)); + r += mul(s0_8, M4(-2.666e-02, -8.200e-03, -4.130e-03, -2.068e-02, 3.399e-02, 1.087e-02, -5.854e-04, -1.516e-02, 6.953e-02, -8.813e-02, -5.320e-02, 8.908e-03, -2.878e-02, -1.133e-02, 7.375e-02, -8.952e-03)); + r += mul(s1_0, M4(-2.563e-02, -7.491e-02, -9.621e-03, -1.227e-01, -3.171e-02, -8.522e-02, 6.067e-02, 9.253e-02, -2.715e-02, -7.993e-02, 1.507e-01, 1.848e-02, 1.079e-02, -7.792e-02, 7.729e-02, -4.658e-02)); + r += mul(s1_1, M4(1.892e-01, -3.155e-01, 1.893e-01, 3.392e-01, 3.614e-02, 4.659e-01, 1.033e-01, -1.887e-02, 4.401e-02, 6.167e-03, 2.962e-02, -8.396e-02, 2.313e-02, 1.164e-01, -3.696e-02, -5.339e-03)); + r += mul(s1_2, M4(-9.636e-03, -8.526e-02, 4.554e-02, -1.826e-01, 2.461e-02, -3.144e-02, -4.324e-02, 1.182e-02, -6.682e-02, 1.107e-02, 1.519e-01, 2.678e-03, -6.869e-03, -9.399e-03, -1.718e-01, -2.958e-02)); + r += mul(s1_3, M4(-4.291e-02, 4.962e-02, -1.813e-01, -1.020e-01, 9.803e-02, -9.502e-02, 1.171e-01, 1.104e-01, -3.743e-02, -4.506e-02, -1.147e-02, 6.518e-02, 1.088e-03, -1.364e-01, -1.902e-02, 4.867e-03)); + r += mul(s1_4, M4(3.483e-01, -1.074e-01, -8.095e-02, 4.811e-01, -2.252e-01, -1.259e-02, -6.223e-02, 2.527e-02, 4.883e-02, -2.908e-02, -1.090e-01, -1.353e-01, 8.798e-02, 1.076e-01, 4.333e-02, -1.812e-01)); + r += mul(s1_5, M4(1.269e-01, -9.028e-02, -1.876e-01, 7.151e-03, 1.090e-01, -1.186e-01, 1.518e-02, 1.353e-01, 1.843e-02, -3.524e-02, 4.887e-02, 7.737e-02, 3.845e-02, -2.931e-02, -5.800e-02, -3.861e-03)); + r += mul(s1_6, M4(2.065e-02, -7.747e-02, -1.618e-01, 4.603e-02, -1.025e-01, 4.145e-02, -1.041e-02, -9.511e-03, 4.930e-02, -8.431e-02, -5.450e-02, 3.956e-02, 1.689e-02, 1.266e-02, -5.726e-02, -1.788e-02)); + r += mul(s1_7, M4(-1.094e-01, -2.040e-01, -2.577e-01, 1.804e-01, 2.995e-01, 1.311e-01, 1.994e-01, 1.968e-01, -2.506e-02, 6.480e-02, 4.503e-02, -8.401e-04, 2.338e-02, -6.157e-02, 6.680e-03, -4.095e-02)); + r += mul(s1_8, M4(5.983e-02, 4.815e-02, -6.628e-02, -7.729e-02, -1.298e-02, 1.405e-02, -4.417e-02, 1.491e-02, 4.179e-02, 1.836e-02, 2.254e-02, 3.150e-02, 3.149e-03, -9.375e-03, 3.689e-02, 5.557e-02)); + r += mul(s2_0, M4(-8.824e-03, -9.181e-03, 1.247e-02, 3.677e-02, 5.064e-03, -2.996e-02, -7.275e-02, 2.607e-01, -4.401e-02, 2.083e-02, -8.657e-02, 1.279e-02, -7.093e-03, 1.259e-01, -8.790e-02, -2.425e-02)); + r += mul(s2_1, M4(-3.213e-02, 7.979e-02, 3.086e-02, 2.087e-02, -1.761e-02, -4.059e-02, -2.408e-01, -5.827e-02, 2.238e-02, 1.286e-01, -3.605e-02, 3.392e-02, 1.497e-01, -2.942e-03, 1.615e-02, -1.117e-01)); + r += mul(s2_2, M4(-3.316e-03, -7.754e-04, 1.906e-02, -3.301e-02, -6.677e-02, -9.814e-02, -2.373e-02, -3.117e-02, 2.255e-02, 2.341e-03, -3.144e-02, -1.664e-02, -5.039e-02, 1.212e-01, -1.224e-01, 1.795e-02)); + r += mul(s2_3, M4(2.668e-02, -2.402e-02, -2.967e-02, -1.336e-02, -8.306e-02, -4.632e-02, 1.108e-02, 3.735e-02, -3.451e-02, 5.058e-02, 9.300e-02, 3.711e-02, 3.423e-02, -4.741e-02, -1.095e-02, -3.585e-02)); + r += mul(s2_4, M4(1.100e-01, 7.056e-02, 8.282e-02, 1.530e-01, -2.870e-01, -1.375e-01, -9.497e-02, 2.027e-01, -1.328e-01, 8.856e-02, 6.696e-02, -2.361e-01, 7.305e-03, 1.722e-01, -2.136e-01, -1.850e-01)); + r += mul(s2_5, M4(8.884e-03, -5.168e-02, -2.905e-02, 5.265e-04, -5.872e-02, -1.102e-01, -6.247e-02, 1.192e-02, 1.088e-02, 1.461e-02, 3.859e-02, 1.057e-01, -4.766e-02, -2.917e-02, -1.091e-01, 2.825e-02)); + r += mul(s2_6, M4(5.104e-02, -1.285e-02, 3.879e-02, 5.841e-02, 1.865e-02, -2.791e-02, -6.057e-02, -2.473e-02, -1.034e-01, -2.275e-02, 7.575e-02, 8.749e-03, 9.533e-03, -4.123e-02, -4.295e-02, 3.354e-02)); + r += mul(s2_7, M4(3.173e-02, -4.333e-02, -1.121e-02, 4.112e-02, -1.273e-01, -4.428e-02, 5.146e-02, 1.548e-01, 5.952e-02, 1.433e-01, 6.134e-03, -1.373e-01, -2.142e-02, 3.747e-02, -1.377e-01, -1.155e-01)); + r += mul(s2_8, M4(-8.402e-04, 1.866e-02, -4.637e-02, 4.500e-02, 4.600e-02, 1.506e-02, 1.679e-02, 2.722e-02, -7.383e-02, -2.785e-02, -3.831e-02, -7.404e-02, -2.059e-02, 5.708e-02, -6.070e-02, 3.715e-02)); + r += mul(s3_0, M4(-5.871e-02, -2.882e-02, -8.989e-02, 1.916e-02, -1.357e-03, -6.500e-02, 6.279e-02, 1.670e-01, -1.998e-02, 3.869e-02, -5.028e-02, 2.372e-02, 8.465e-03, -9.501e-02, 9.572e-03, 3.625e-02)); + r += mul(s3_1, M4(7.759e-02, 2.860e-01, -4.943e-02, 1.303e-02, 9.473e-03, 1.482e-02, 8.304e-02, -1.259e-01, 1.394e-02, 1.905e-02, -4.888e-02, -8.349e-04, 7.359e-02, 1.769e-01, -7.259e-02, 5.760e-02)); + r += mul(s3_2, M4(3.953e-02, -2.994e-02, -9.992e-02, 5.483e-02, 3.137e-02, -9.053e-02, 3.821e-02, -3.146e-02, 4.306e-02, -1.100e-01, -5.266e-02, 2.499e-02, 6.665e-03, 5.605e-02, -3.151e-02, -9.822e-02)); + r += mul(s3_3, M4(-5.678e-02, -1.999e-02, 4.683e-03, 4.502e-02, 6.835e-02, -6.257e-03, 8.348e-02, -1.255e-01, -6.151e-02, 4.114e-02, 5.202e-02, -1.032e-01, -7.695e-03, -2.938e-02, -5.447e-02, -2.429e-02)); + r += mul(s3_4, M4(6.987e-02, 2.668e-01, -5.651e-02, 8.007e-02, -1.721e-01, 8.798e-03, -2.829e-02, 6.085e-02, -5.505e-02, 2.291e-01, 3.556e-02, -9.195e-02, 4.035e-03, 8.894e-02, -1.989e-01, 1.181e-01)); + r += mul(s3_5, M4(5.965e-02, -3.104e-02, -1.408e-01, 3.235e-02, 7.710e-02, 1.257e-01, 1.401e-01, -3.038e-02, -9.247e-04, -1.607e-01, -1.240e-01, 1.509e-01, -2.938e-02, 1.128e-01, 1.232e-01, 3.870e-03)); + r += mul(s3_6, M4(-1.191e-01, 2.971e-02, 4.848e-02, -4.148e-02, 8.461e-02, -3.591e-02, -5.379e-02, -4.579e-02, -9.728e-02, -3.381e-02, 8.742e-02, 6.678e-02, 5.242e-02, -4.325e-02, -1.544e-02, 6.422e-03)); + r += mul(s3_7, M4(-8.118e-02, -5.023e-02, -9.631e-02, 1.053e-01, -2.222e-01, -3.769e-02, -5.832e-02, -4.684e-03, -3.051e-02, 1.057e-01, -1.021e-01, -4.790e-02, 6.369e-02, 5.099e-02, -2.839e-02, -1.842e-02)); + r += mul(s3_8, M4(4.156e-02, 1.869e-02, -1.280e-01, 7.942e-02, 2.336e-02, 6.081e-02, 2.017e-02, -2.476e-02, -1.121e-02, -3.994e-02, -2.009e-02, -3.126e-02, -8.150e-02, 1.338e-02, -1.150e-01, -1.282e-01)); + r += mul(s4_0, M4(-6.037e-02, 1.656e-02, -7.948e-03, 1.622e-01, 5.929e-02, -3.813e-02, 9.060e-02, 1.889e-01, 4.751e-02, -2.354e-02, -6.490e-02, 3.297e-02, 9.593e-03, -3.460e-02, 4.031e-02, -7.292e-02)); + r += mul(s4_1, M4(7.467e-02, -2.272e-01, -7.408e-03, -8.043e-02, 3.338e-02, -1.559e-01, 9.580e-02, -9.651e-02, 2.954e-02, 1.834e-01, 7.362e-02, 1.125e-01, 9.323e-03, -4.286e-02, 1.238e-01, -4.365e-02)); + r += mul(s4_2, M4(1.466e-02, -1.622e-02, 5.112e-02, 5.212e-04, 1.046e-02, -5.693e-02, 1.186e-01, -4.618e-02, 2.398e-04, 2.288e-02, -1.616e-01, -6.572e-02, -5.077e-02, -5.950e-02, 4.100e-02, -5.900e-03)); + r += mul(s4_3, M4(8.164e-02, -1.050e-02, 7.152e-02, 1.763e-01, 1.477e-02, 9.761e-02, 2.061e-01, -2.763e-01, -4.070e-02, -1.053e-02, -1.024e-01, 2.789e-03, 1.721e-02, -1.149e-01, -5.316e-02, 2.251e-01)); + r += mul(s4_4, M4(-6.152e-02, -4.566e-02, 3.206e-02, -6.381e-02, 4.282e-02, 1.616e-01, -2.449e-02, 1.099e-01, 1.488e-02, 2.030e-02, -2.205e-01, -2.367e-02, -7.245e-03, 5.897e-02, -2.508e-02, -1.578e-01)); + r += mul(s4_5, M4(-5.024e-02, 1.279e-01, 7.120e-02, 3.258e-03, 5.894e-02, 9.921e-02, 2.215e-01, 5.180e-02, 7.799e-02, 9.747e-02, 7.793e-02, -9.364e-03, -1.348e-02, -3.141e-02, -3.236e-02, 5.742e-02)); + r += mul(s4_6, M4(9.676e-02, 3.061e-03, 3.606e-02, 8.734e-02, -1.257e-01, 2.836e-02, 7.202e-02, 2.260e-02, 5.660e-02, -4.800e-02, -2.797e-02, 1.071e-02, 9.543e-02, -5.729e-02, 9.324e-03, -1.327e-02)); + r += mul(s4_7, M4(7.406e-02, -3.215e-02, 5.902e-02, 1.374e-02, -1.285e-01, -1.385e-03, -3.255e-02, -1.147e-01, -1.568e-02, 3.902e-02, -1.221e-02, 1.601e-02, 5.597e-02, -2.408e-02, 9.760e-02, 4.917e-02)); + r += mul(s4_8, M4(-3.236e-02, 4.447e-02, 5.241e-02, -2.944e-02, -3.300e-02, -7.686e-02, 1.495e-01, 1.105e-02, 8.006e-02, -4.901e-03, -8.337e-02, 8.960e-02, -5.067e-02, -2.423e-02, 3.160e-03, -6.541e-02)); + r += mul(s5_0, M4(-9.224e-03, -3.012e-02, 1.654e-02, -1.741e-02, 6.193e-02, 1.194e-02, -1.138e-01, 5.334e-02, 4.494e-02, 3.817e-02, -6.868e-02, -1.206e-01, 3.800e-02, -6.390e-02, -2.415e-02, 1.189e-01)); + r += mul(s5_1, M4(1.780e-02, 2.528e-01, 2.053e-02, -2.688e-02, 2.794e-02, 9.420e-03, 3.903e-02, -2.132e-02, -2.308e-02, -1.706e-01, 2.881e-01, -9.967e-04, -7.117e-02, -1.004e-01, 1.655e-01, -2.542e-02)); + r += mul(s5_2, M4(-9.963e-04, 2.048e-02, 1.102e-01, -2.183e-02, 5.955e-02, -4.351e-02, 2.002e-02, 3.162e-02, -3.611e-02, -1.422e-02, -8.736e-02, 4.948e-02, 1.035e-03, -6.009e-02, -7.072e-02, -4.935e-04)); + r += mul(s5_3, M4(-1.619e-02, -4.737e-02, 3.625e-03, 2.913e-02, -5.581e-02, -6.796e-02, 1.227e-02, 7.568e-03, 2.369e-02, 8.190e-03, -2.758e-02, -2.920e-02, 8.449e-02, 6.266e-02, -1.172e-01, 3.430e-03)); + r += mul(s5_4, M4(-7.080e-02, -1.188e-01, -4.568e-02, -9.712e-02, 3.748e-02, -1.157e-02, -5.191e-02, 1.316e-02, 6.758e-02, -1.323e-01, -8.590e-03, -1.927e-01, -8.623e-02, 1.222e-01, -1.296e-01, -4.125e-02)); + r += mul(s5_5, M4(-3.687e-02, 5.063e-02, 5.207e-02, -6.672e-04, 8.033e-03, 1.983e-02, -1.978e-02, 1.045e-01, -2.183e-02, -4.931e-02, 2.080e-02, 4.839e-02, 1.567e-02, 1.159e-02, 2.069e-03, 3.931e-02)); + r += mul(s5_6, M4(5.989e-02, -5.406e-02, 8.648e-02, 3.946e-02, -2.754e-02, -8.323e-02, 2.472e-03, 1.602e-02, -2.517e-02, -2.794e-02, -8.966e-03, 3.794e-02, 3.412e-02, 9.293e-02, -1.335e-01, -9.274e-02)); + r += mul(s5_7, M4(9.180e-02, 3.718e-02, 2.621e-02, -2.298e-03, -1.593e-02, 3.107e-02, -1.137e-02, 3.554e-02, -5.966e-02, 5.259e-02, 1.049e-02, -4.814e-02, -2.135e-01, -5.053e-02, -1.286e-02, -1.475e-01)); + r += mul(s5_8, M4(-8.856e-03, -1.193e-02, 4.319e-02, -6.940e-03, -9.507e-03, -3.423e-03, -2.602e-02, 2.562e-02, -4.796e-02, 2.255e-02, 2.904e-02, 7.446e-02, -5.113e-03, 7.435e-02, 8.579e-02, 4.102e-02)); + r += mul(s6_0, M4(4.389e-02, -1.258e-01, 2.059e-02, 2.629e-01, 4.985e-03, 2.844e-02, -9.665e-02, 5.919e-02, 3.232e-02, -1.705e-01, 1.044e-03, 2.950e-02, 3.746e-02, 3.500e-02, 7.514e-02, 4.464e-03)); + r += mul(s6_1, M4(7.756e-02, 8.989e-02, -3.914e-03, -7.133e-02, 1.374e-02, -4.715e-03, 9.700e-02, -5.065e-02, -8.952e-03, 4.056e-02, -9.037e-02, 3.634e-02, -1.191e-02, -1.558e-01, 1.932e-01, 4.759e-02)); + r += mul(s6_2, M4(6.396e-02, -2.024e-01, -5.218e-02, -1.168e-02, 3.868e-03, -1.990e-02, -3.047e-02, 4.044e-02, -2.089e-02, -5.308e-02, -9.645e-02, 5.635e-03, -5.880e-02, -4.208e-02, 1.858e-01, 1.659e-02)); + r += mul(s6_3, M4(-1.069e-01, 4.536e-02, -7.838e-02, -1.381e-01, -2.307e-02, -1.687e-02, 4.232e-02, 4.459e-02, -1.205e-01, -1.834e-01, 6.953e-02, -3.404e-01, 5.913e-02, -7.332e-02, 1.579e-01, 6.973e-02)); + r += mul(s6_4, M4(-1.341e-01, 6.876e-02, 8.401e-03, 7.779e-02, 2.819e-02, 3.532e-01, -5.884e-02, 3.457e-02, -5.755e-02, 1.192e-01, 3.875e-01, -2.875e-01, 4.455e-02, 6.725e-02, 3.007e-02, 3.482e-02)); + r += mul(s6_5, M4(1.390e-03, 1.684e-02, -3.724e-02, 5.731e-02, 1.727e-02, -3.421e-03, -3.177e-02, 5.035e-02, 8.179e-02, -1.725e-01, -2.584e-02, 7.276e-02, 1.489e-01, -1.704e-03, 8.725e-02, -6.646e-04)); + r += mul(s6_6, M4(-8.179e-02, 3.857e-02, -5.471e-02, 4.253e-02, -5.446e-02, 8.346e-02, -5.433e-02, 1.508e-01, -9.701e-02, -1.837e-02, 2.487e-02, -3.024e-02, 1.529e-01, -1.409e-02, 5.809e-02, -6.421e-02)); + r += mul(s6_7, M4(-1.585e-01, -3.170e-02, -1.190e-01, -5.164e-02, 1.605e-02, -6.011e-03, -1.041e-01, -1.551e-02, 2.374e-02, 1.426e-01, 1.592e-01, -1.714e-01, 1.089e-02, 5.988e-02, 3.814e-02, 1.214e-02)); + r += mul(s6_8, M4(-7.375e-02, 8.089e-02, 4.910e-02, 1.020e-02, 5.646e-03, -1.113e-02, -1.495e-02, 2.421e-02, 4.807e-02, -9.493e-02, 8.929e-02, -2.548e-02, 8.632e-02, 4.068e-02, -1.793e-02, -6.503e-03)); + r += mul(s7_0, M4(-5.631e-02, 1.109e-01, -1.101e-01, 4.318e-02, -7.555e-03, 3.286e-02, 4.230e-03, -9.658e-04, 2.501e-02, 5.393e-02, -1.639e-02, -4.477e-02, 1.108e-02, -3.988e-02, 7.409e-02, -8.132e-02)); + r += mul(s7_1, M4(-1.264e-02, 3.910e-02, -4.864e-02, 8.381e-02, 7.497e-03, 6.824e-03, 5.936e-02, 2.502e-03, -5.776e-02, -5.663e-02, -2.980e-02, -1.511e-02, 2.048e-02, -1.101e-01, 7.526e-02, 6.164e-02)); + r += mul(s7_2, M4(-7.927e-03, -5.440e-02, -4.622e-02, -1.667e-02, 1.467e-03, -4.640e-02, 3.214e-02, 6.492e-03, -3.743e-02, 1.046e-01, 6.501e-03, 2.285e-02, 2.592e-02, 3.474e-02, 1.183e-01, -1.976e-02)); + r += mul(s7_3, M4(3.091e-02, -7.652e-02, -1.263e-01, 3.743e-02, -8.994e-02, 8.575e-02, 5.046e-03, -1.179e-02, 1.578e-03, -7.156e-02, 3.312e-02, -1.918e-02, -5.160e-03, -9.209e-02, 1.189e-01, -8.571e-02)); + r += mul(s7_4, M4(-6.698e-02, -7.674e-02, -6.401e-02, 8.097e-03, 1.107e-03, 7.725e-02, 5.622e-02, 1.300e-01, -4.175e-02, 1.169e-01, -1.043e-01, -1.587e-02, -1.078e-02, 4.202e-02, -7.352e-02, -2.581e-02)); + r += mul(s7_5, M4(-3.235e-02, -4.669e-03, -9.562e-02, 4.169e-02, 3.150e-02, 3.311e-02, 7.651e-02, -2.521e-02, -4.377e-03, 1.004e-01, 6.654e-02, -6.585e-02, 7.707e-02, 5.189e-02, 1.077e-01, -3.349e-02)); + r += mul(s7_6, M4(3.353e-02, -2.998e-02, -5.213e-02, -1.200e-02, 5.783e-03, 1.861e-02, 6.618e-02, -1.388e-02, -2.233e-02, -3.001e-03, 8.674e-02, -1.458e-03, 2.875e-02, 3.304e-02, 3.299e-02, -1.312e-01)); + r += mul(s7_7, M4(4.818e-02, 2.206e-02, 4.522e-02, -2.785e-02, -9.122e-02, -1.578e-02, 8.113e-02, 1.068e-01, -1.008e-02, -6.218e-02, 8.925e-02, 2.618e-02, -3.574e-02, 2.934e-02, 5.164e-02, 7.347e-03)); + r += mul(s7_8, M4(-4.466e-02, 2.015e-02, -4.114e-02, -1.581e-02, 1.891e-02, 1.774e-02, -2.226e-02, -1.056e-02, -4.274e-02, -2.640e-02, 2.741e-02, -2.143e-02, -1.275e-02, 6.932e-03, -2.697e-03, -1.463e-02)); + r += V4(8.595e-03, -1.310e-02, -3.312e-02, -2.644e-03); + return r; +} + +V4 f2(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(1.614e-02, -1.005e-02, -6.784e-04, 7.722e-03, -3.042e-02, -1.959e-02, -3.936e-02, 5.703e-02, 8.608e-02, 4.361e-02, 1.607e-02, -2.982e-02, 2.736e-02, 5.653e-02, -3.001e-02, 1.120e-01)); + r += mul(s0_1, M4(-7.235e-02, 6.935e-04, 1.750e-02, -2.335e-02, -5.189e-02, -2.955e-02, -1.816e-02, 5.784e-02, 4.978e-02, -6.952e-02, 7.076e-02, 5.682e-02, -7.723e-02, -6.976e-03, -5.206e-02, 3.530e-02)); + r += mul(s0_2, M4(5.367e-02, 1.343e-02, 3.025e-02, 1.073e-02, 3.161e-02, -2.087e-02, 9.620e-03, 2.695e-02, -4.723e-02, -4.379e-03, -7.545e-02, 5.364e-02, 8.785e-02, 1.200e-01, 4.003e-02, 5.509e-02)); + r += mul(s0_3, M4(-4.535e-02, 3.388e-02, 2.809e-02, 1.864e-02, -2.166e-02, -3.582e-03, -1.579e-02, 8.943e-02, -6.513e-02, 6.274e-02, -5.861e-02, 7.508e-02, 1.783e-01, 3.014e-02, 2.979e-02, -2.050e-02)); + r += mul(s0_4, M4(5.496e-02, 3.936e-02, -4.381e-02, -3.945e-03, 1.082e-01, 5.698e-02, -4.709e-02, -5.350e-02, 2.057e-01, -1.831e-01, 7.740e-03, 4.411e-02, 5.539e-02, 1.397e-01, 4.735e-02, 3.319e-02)); + r += mul(s0_5, M4(2.261e-02, 4.806e-02, 1.373e-02, 8.694e-03, 3.159e-02, 8.759e-02, -6.888e-02, -8.022e-02, 2.395e-02, 6.523e-02, -1.166e-01, 1.327e-02, -3.381e-02, 7.779e-02, -3.434e-02, 1.555e-02)); + r += mul(s0_6, M4(1.209e-02, 4.585e-03, 9.905e-03, 1.364e-02, -1.354e-02, 5.577e-03, 5.213e-02, -6.017e-02, -6.375e-02, -3.437e-02, -2.421e-02, -2.313e-02, 8.052e-02, 2.112e-04, 5.610e-02, 3.765e-03)); + r += mul(s0_7, M4(-3.386e-02, 4.527e-02, -5.707e-03, -4.910e-02, -2.961e-02, -3.020e-02, -4.442e-02, 8.489e-02, -1.019e-03, 1.266e-01, 6.886e-02, 7.071e-02, -2.010e-02, -5.389e-02, -2.552e-02, -1.134e-02)); + r += mul(s0_8, M4(-4.069e-03, -1.052e-02, -3.589e-02, -8.961e-02, -8.542e-03, -2.531e-03, -2.576e-02, 1.685e-02, -3.091e-02, -1.611e-02, 8.161e-02, 3.644e-02, -1.251e-02, 2.749e-02, 8.363e-02, -1.902e-02)); + r += mul(s1_0, M4(-4.832e-02, 6.763e-02, 1.693e-01, -6.850e-02, -1.692e-01, 2.277e-02, -2.988e-02, 9.687e-02, -1.567e-01, 9.008e-02, 7.988e-02, 8.103e-02, 6.072e-02, 1.966e-02, 1.069e-02, 3.073e-02)); + r += mul(s1_1, M4(1.153e-03, 7.128e-02, -1.417e-01, -7.013e-02, -9.707e-02, -4.268e-02, 1.928e-02, 9.093e-02, 1.453e-01, -8.077e-02, -1.019e-01, -7.137e-02, 6.369e-02, -1.047e-01, 5.034e-02, 2.306e-03)); + r += mul(s1_2, M4(1.078e-01, 1.220e-01, 6.449e-02, 9.159e-02, -1.270e-02, -1.106e-01, 5.049e-02, -2.057e-02, -5.039e-02, -1.887e-02, -6.338e-02, 2.725e-02, 8.502e-02, 1.561e-01, -7.513e-02, 6.572e-02)); + r += mul(s1_3, M4(5.530e-02, -1.115e-03, 2.046e-01, -4.519e-02, -3.028e-01, -7.232e-03, 4.014e-03, 5.096e-02, 1.179e-01, -9.105e-02, 8.114e-02, -1.298e-01, 7.743e-02, 4.449e-02, 1.560e-03, -4.073e-02)); + r += mul(s1_4, M4(3.588e-01, 2.170e-01, -3.909e-02, -3.370e-01, 1.009e-01, 1.970e-01, 8.040e-02, 9.738e-03, 2.206e-01, 4.629e-01, 1.215e-01, -1.200e-01, -1.037e-02, 9.784e-02, -3.198e-02, 1.268e-02)); + r += mul(s1_5, M4(1.062e-01, 1.983e-01, 1.405e-01, -9.432e-02, -5.090e-02, -7.232e-02, 1.303e-01, -3.199e-01, -3.193e-02, -3.759e-02, -1.594e-02, -3.530e-02, -2.546e-03, 5.905e-02, 7.533e-02, 1.445e-01)); + r += mul(s1_6, M4(2.811e-02, 1.152e-01, -3.190e-02, -1.156e-01, -5.659e-02, -1.193e-01, -2.246e-02, 1.797e-03, 1.593e-02, 4.996e-02, -1.089e-02, 1.032e-02, 2.749e-02, 2.593e-02, 1.733e-02, 8.334e-02)); + r += mul(s1_7, M4(5.944e-03, 5.876e-02, -2.158e-01, -5.041e-03, 9.495e-02, 1.840e-02, 6.503e-02, 1.521e-01, -1.170e-01, -1.226e-01, -3.012e-03, 1.956e-02, -4.297e-02, 5.649e-02, -7.710e-03, 1.146e-02)); + r += mul(s1_8, M4(-2.399e-03, 4.167e-02, -1.627e-01, -1.377e-01, 7.009e-03, -7.871e-02, 1.943e-02, 2.779e-02, 6.534e-02, 6.369e-02, -1.158e-02, 3.674e-02, -2.975e-02, 4.651e-02, 3.913e-02, 2.652e-02)); + r += mul(s2_0, M4(2.828e-02, -2.513e-02, 5.672e-03, -6.423e-02, 5.520e-02, -4.920e-02, 6.411e-02, -7.914e-02, 3.132e-02, -5.132e-02, -4.550e-02, 1.351e-03, 8.561e-02, -8.241e-02, -9.329e-03, 6.873e-02)); + r += mul(s2_1, M4(4.571e-02, 1.052e-01, 1.285e-02, 1.897e-02, 7.375e-02, -1.896e-01, 1.410e-02, -2.172e-01, -2.555e-02, 1.003e-01, -2.963e-02, 7.566e-02, -2.315e-01, -1.842e-02, 3.806e-03, -7.120e-02)); + r += mul(s2_2, M4(3.116e-03, 1.334e-02, 6.586e-02, -1.674e-02, -4.504e-02, -2.114e-02, -1.535e-01, -6.773e-02, -5.222e-02, -1.381e-01, 3.592e-02, -9.189e-03, 1.369e-02, -4.472e-03, -8.508e-02, -5.183e-02)); + r += mul(s2_3, M4(8.123e-02, -1.267e-02, -1.060e-02, -1.223e-01, -8.796e-03, 4.947e-02, 1.094e-02, -5.961e-02, 1.707e-02, -4.949e-02, 1.499e-02, 1.971e-01, -7.364e-03, 5.166e-02, 1.375e-02, -2.088e-02)); + r += mul(s2_4, M4(1.981e-01, 1.402e-02, -7.671e-02, -1.057e-01, -3.672e-02, 2.139e-01, -3.502e-02, 4.998e-02, -6.810e-02, 2.711e-01, 2.190e-03, 2.389e-01, -1.027e-01, -1.934e-01, 2.007e-01, -1.764e-01)); + r += mul(s2_5, M4(-3.131e-02, 9.458e-02, -4.505e-02, -8.858e-02, -8.754e-02, -1.370e-02, -3.300e-03, -1.630e-02, -7.052e-02, -1.271e-01, 9.199e-03, 1.163e-01, -1.271e-01, -1.099e-01, -1.599e-01, 8.651e-02)); + r += mul(s2_6, M4(8.813e-02, 5.411e-02, -1.438e-02, -1.103e-01, 2.566e-02, 4.505e-02, 7.295e-03, -1.022e-02, -1.135e-02, 1.019e-02, 7.076e-02, 1.678e-02, 1.878e-02, -1.681e-02, -7.175e-02, 5.882e-02)); + r += mul(s2_7, M4(-6.547e-02, -6.367e-03, -9.245e-03, 5.503e-02, 1.068e-02, -2.441e-02, -4.558e-02, -1.253e-01, 1.120e-01, 5.100e-02, -8.709e-03, 1.022e-02, 1.694e-02, 6.852e-02, -1.305e-01, -1.105e-02)); + r += mul(s2_8, M4(2.468e-02, 4.679e-02, -4.744e-02, -2.494e-03, -5.273e-03, -9.415e-03, 2.700e-02, 1.370e-02, 2.330e-02, -7.538e-02, -1.354e-02, -9.254e-02, 3.925e-02, -2.982e-02, -4.716e-02, -4.827e-02)); + r += mul(s3_0, M4(5.471e-02, -4.965e-02, -5.552e-02, 9.349e-02, -3.978e-02, 4.671e-02, 1.510e-02, -1.010e-02, -5.610e-03, -6.650e-03, -4.539e-02, -3.078e-02, -2.028e-02, -1.076e-02, 4.225e-03, 6.920e-03)); + r += mul(s3_1, M4(-8.981e-02, 2.075e-02, -1.545e-01, 8.362e-02, 3.681e-02, -6.842e-02, -3.677e-03, 7.273e-02, 3.630e-02, 1.168e-01, 9.331e-02, -1.641e-02, 8.741e-02, -1.807e-02, 5.136e-02, -5.999e-03)); + r += mul(s3_2, M4(7.980e-03, 9.239e-03, -7.776e-02, 4.121e-02, -6.007e-02, -6.668e-02, 2.904e-02, -1.818e-02, -4.358e-02, -6.546e-02, 7.827e-02, -1.531e-02, 8.845e-02, 4.541e-02, -3.799e-02, 4.981e-02)); + r += mul(s3_3, M4(-7.097e-02, 3.464e-02, -3.664e-02, 9.282e-02, -1.353e-02, -4.447e-02, 6.376e-05, -1.620e-02, 4.777e-02, 6.054e-03, -2.632e-02, 5.112e-02, -1.545e-02, -5.129e-02, 3.346e-02, 2.137e-03)); + r += mul(s3_4, M4(2.378e-01, -1.779e-01, -1.635e-01, 9.949e-02, -1.099e-02, -9.495e-02, 1.901e-02, 6.277e-02, -1.515e-01, 1.612e-01, -2.442e-02, 9.298e-03, 1.148e-01, 5.676e-02, -5.988e-02, -5.545e-02)); + r += mul(s3_5, M4(-2.331e-02, 3.820e-02, -9.015e-02, -7.512e-02, -3.124e-02, -8.487e-02, -3.251e-02, 3.748e-03, -4.415e-02, 2.026e-02, 5.457e-02, -8.815e-02, 5.846e-02, 5.226e-02, -9.859e-02, -1.642e-02)); + r += mul(s3_6, M4(4.007e-02, -6.566e-02, 5.973e-02, 1.621e-02, 3.186e-02, 4.911e-02, 5.198e-03, 2.869e-02, -3.761e-02, 6.225e-02, 3.270e-02, 7.359e-02, -2.176e-02, 5.753e-03, 1.074e-02, 3.768e-03)); + r += mul(s3_7, M4(-8.123e-02, 1.709e-01, 3.004e-03, 2.824e-01, -1.991e-02, -7.908e-03, -3.733e-02, -1.250e-01, 1.101e-01, 1.949e-02, -5.755e-02, 6.645e-02, -2.663e-03, -9.784e-03, 2.276e-02, -2.752e-02)); + r += mul(s3_8, M4(4.444e-02, 5.957e-02, -4.221e-02, -5.451e-04, 9.534e-03, -1.278e-02, -6.812e-02, -1.361e-03, 2.192e-04, -2.833e-02, 7.063e-04, -1.225e-01, 3.637e-04, -5.070e-02, 1.058e-02, -6.452e-02)); + r += mul(s4_0, M4(6.307e-02, -2.681e-02, -6.274e-02, 8.770e-02, -7.101e-02, 4.855e-02, -5.002e-02, 4.840e-02, -2.804e-02, 5.773e-02, -6.244e-03, 8.325e-02, -2.861e-02, -6.126e-03, -3.282e-03, -5.171e-02)); + r += mul(s4_1, M4(3.098e-02, 3.295e-02, 7.547e-02, 1.486e-01, 7.005e-02, 2.076e-03, -9.338e-02, 1.963e-02, -1.268e-01, -3.594e-02, -1.551e-02, 6.473e-02, 5.155e-02, -1.451e-01, 9.073e-02, 6.502e-03)); + r += mul(s4_2, M4(-2.531e-02, 4.505e-02, -9.723e-02, 1.119e-02, -3.923e-02, -1.286e-01, 3.625e-02, -9.626e-02, 1.758e-02, -9.467e-02, -3.204e-02, -1.593e-01, -4.865e-02, 3.704e-02, -5.239e-03, -6.411e-02)); + r += mul(s4_3, M4(1.624e-02, 7.311e-02, -8.259e-02, 7.513e-02, 2.413e-02, 5.958e-02, -1.074e-01, 2.137e-01, 1.173e-03, -8.354e-02, -1.466e-02, -2.959e-02, -1.028e-02, -1.759e-02, -4.829e-02, -6.977e-02)); + r += mul(s4_4, M4(-6.667e-02, -9.253e-02, -1.928e-01, 1.053e-01, 2.976e-02, 2.397e-02, 1.972e-02, -3.608e-01, -1.562e-01, -1.104e-01, -6.679e-02, 8.189e-03, 1.051e-01, 2.159e-02, -1.574e-01, 1.478e-01)); + r += mul(s4_5, M4(1.064e-03, 4.455e-02, 2.994e-02, 6.062e-02, 2.440e-02, -8.779e-02, -7.318e-03, -3.991e-02, 2.143e-02, -1.107e-01, 3.086e-02, -2.095e-01, 3.533e-02, 2.910e-03, 3.938e-02, -9.010e-02)); + r += mul(s4_6, M4(1.370e-02, 1.084e-02, 1.671e-02, 4.518e-02, -7.201e-02, -1.957e-02, 4.449e-02, 9.856e-02, 4.019e-03, 2.327e-02, 2.099e-02, 2.433e-03, -4.614e-03, -2.463e-03, -7.228e-02, 5.710e-02)); + r += mul(s4_7, M4(-6.763e-02, -7.056e-02, 4.111e-02, 1.589e-01, -5.957e-02, -1.089e-01, -4.845e-03, 5.609e-03, -1.616e-01, -7.913e-02, -8.164e-02, -6.088e-02, 2.263e-02, 1.072e-01, 9.865e-02, -1.330e-03)); + r += mul(s4_8, M4(3.810e-02, -3.161e-03, 1.591e-02, 9.792e-02, 2.835e-02, -2.595e-02, -8.879e-04, -2.684e-02, 9.845e-03, 2.914e-02, 7.703e-03, -5.742e-02, -3.035e-02, 4.963e-03, 1.384e-01, 3.100e-03)); + r += mul(s5_0, M4(4.256e-02, -1.008e-01, -1.556e-02, 6.923e-04, -5.312e-02, 5.749e-02, -2.727e-03, 5.390e-02, 7.619e-02, 5.960e-02, -2.679e-02, 1.117e-01, -1.577e-01, 1.731e-02, -1.404e-02, -3.958e-02)); + r += mul(s5_1, M4(-1.362e-01, -1.371e-02, -5.278e-02, 1.414e-01, 3.202e-02, -3.197e-02, -6.661e-02, 8.865e-03, -2.686e-01, 1.049e-02, -6.292e-02, 7.536e-02, 1.076e-01, -7.338e-03, -1.221e-01, -5.864e-02)); + r += mul(s5_2, M4(5.416e-02, 7.805e-03, 5.544e-02, 2.636e-02, -3.914e-02, -7.272e-02, -7.414e-02, 1.661e-02, -7.668e-02, -1.847e-02, 6.360e-02, -2.105e-02, 7.998e-02, 5.067e-02, -8.429e-03, -2.027e-02)); + r += mul(s5_3, M4(-2.233e-05, 5.755e-02, -3.404e-02, 1.183e-01, -1.258e-02, -2.209e-02, -8.305e-02, 7.034e-02, -5.047e-02, 6.752e-03, 5.717e-02, 4.605e-02, 3.183e-03, -1.312e-01, -5.560e-02, -1.314e-02)); + r += mul(s5_4, M4(5.782e-02, -6.304e-02, -2.183e-01, 1.023e-01, -8.243e-02, 5.312e-02, 6.326e-02, -1.013e-01, -1.482e-01, 8.340e-02, 5.306e-02, 9.693e-02, -7.022e-02, -1.078e-01, -9.109e-02, 1.012e-01)); + r += mul(s5_5, M4(2.845e-02, 7.967e-03, 3.953e-02, 8.160e-02, -3.188e-02, -8.098e-02, 8.965e-03, -2.233e-02, -1.713e-01, -9.800e-02, -1.032e-02, 1.329e-01, -4.141e-02, 2.611e-02, 2.263e-02, 4.147e-02)); + r += mul(s5_6, M4(4.944e-03, 1.338e-03, -1.373e-03, -4.234e-03, 1.164e-02, 4.842e-02, -5.568e-02, 3.876e-02, -7.883e-02, -4.474e-02, -1.606e-02, 4.802e-04, -7.402e-02, -8.163e-02, -6.966e-03, 6.448e-02)); + r += mul(s5_7, M4(-6.236e-02, 1.289e-02, 4.420e-02, 5.460e-02, 9.722e-02, 1.146e-02, -9.578e-02, -4.473e-02, -6.389e-02, 2.631e-03, -9.886e-02, 5.113e-02, -9.276e-02, -1.233e-01, 4.618e-02, 1.873e-02)); + r += mul(s5_8, M4(1.536e-02, -5.075e-04, 1.344e-02, 4.274e-02, 3.285e-02, -2.907e-02, -2.249e-02, -4.175e-02, 3.839e-02, -1.694e-02, -2.087e-02, 4.188e-02, 2.566e-02, -3.312e-02, -4.870e-02, -1.486e-02)); + r += mul(s6_0, M4(2.035e-02, 8.914e-02, -9.176e-02, 2.293e-03, 7.181e-02, 3.651e-02, 3.323e-03, 2.469e-02, 2.294e-02, 8.999e-02, -3.079e-02, 1.147e-02, 1.319e-01, 5.067e-02, -3.103e-02, 5.246e-02)); + r += mul(s6_1, M4(-2.348e-02, 1.186e-01, -1.171e-01, 8.115e-02, -1.357e-01, -3.212e-02, -1.983e-02, 9.504e-02, 7.592e-02, 2.967e-01, -2.224e-01, -7.604e-02, -4.854e-02, -2.008e-02, -2.428e-02, -1.026e-01)); + r += mul(s6_2, M4(1.907e-02, 4.944e-02, -9.952e-03, -2.858e-02, -2.479e-02, -5.892e-02, 7.922e-02, -4.188e-02, 4.176e-04, -9.048e-02, -6.651e-03, 9.881e-03, -1.035e-03, 3.687e-02, 1.044e-02, -9.535e-02)); + r += mul(s6_3, M4(-6.968e-03, -3.589e-02, -1.763e-02, -1.608e-01, -1.312e-01, 1.096e-01, -3.024e-02, 7.163e-02, -1.194e-01, 8.786e-02, -6.113e-02, -5.211e-02, 1.995e-02, 5.899e-02, 8.763e-02, -5.822e-02)); + r += mul(s6_4, M4(1.126e-01, -7.308e-02, -3.569e-02, -1.747e-01, -3.388e-02, -2.617e-01, 3.035e-02, -1.474e-01, -1.557e-02, 2.141e-01, -3.721e-01, 2.118e-01, 1.199e-01, -9.028e-02, 1.809e-01, -1.871e-01)); + r += mul(s6_5, M4(4.094e-02, 2.008e-01, -1.845e-01, 1.834e-02, -2.787e-02, -4.992e-04, -1.641e-02, -1.007e-01, -8.758e-02, -1.699e-01, 9.544e-03, 8.977e-05, -5.093e-02, -6.207e-02, 8.674e-02, -1.359e-01)); + r += mul(s6_6, M4(4.932e-03, 3.054e-02, 2.115e-02, 2.666e-02, -5.442e-02, -7.033e-02, -3.701e-02, -2.965e-02, 7.123e-03, -3.562e-03, -4.148e-02, 1.772e-01, 2.837e-03, 8.905e-02, 1.370e-02, 2.342e-02)); + r += mul(s6_7, M4(-2.051e-02, -5.216e-02, -6.625e-02, 1.395e-02, -3.178e-02, -6.876e-02, 5.125e-03, 4.695e-02, 1.508e-01, 5.439e-02, 5.286e-02, -1.213e-01, 2.426e-02, -7.170e-02, -2.314e-02, -7.301e-02)); + r += mul(s6_8, M4(-2.376e-02, -2.696e-02, -8.676e-02, -5.200e-02, 4.308e-02, -6.324e-02, 3.243e-03, 2.496e-02, 6.805e-02, 5.926e-02, -1.166e-01, -9.171e-02, 3.429e-02, -2.809e-02, -2.414e-02, -3.571e-02)); + r += mul(s7_0, M4(8.384e-02, -2.706e-02, 1.013e-01, -9.113e-02, 1.056e-02, -6.677e-03, -1.244e-02, 1.388e-02, 2.674e-03, -5.477e-02, 1.808e-02, -3.460e-02, 3.550e-02, 2.373e-02, 1.164e-02, 1.138e-01)); + r += mul(s7_1, M4(-3.523e-05, -1.094e-01, 1.434e-02, -4.561e-02, -1.619e-02, -2.251e-02, 5.216e-02, 4.408e-02, -8.221e-02, -4.150e-03, -4.067e-02, -2.003e-02, -3.024e-02, 5.350e-03, -5.504e-02, 4.436e-02)); + r += mul(s7_2, M4(3.702e-02, 7.436e-02, -1.237e-01, -3.169e-02, -5.443e-03, -4.782e-02, 2.405e-02, -1.102e-02, -3.942e-02, -8.225e-02, -4.205e-02, 3.668e-02, 5.289e-02, 7.724e-03, 1.813e-02, 4.858e-02)); + r += mul(s7_3, M4(2.945e-03, 7.254e-02, 2.675e-02, -8.459e-02, 6.718e-02, 3.384e-02, -3.787e-02, 4.449e-02, 4.266e-02, 5.028e-02, -3.294e-02, -6.624e-03, -3.943e-02, 9.206e-02, 5.073e-02, 3.251e-02)); + r += mul(s7_4, M4(-1.042e-01, -6.166e-02, -1.833e-01, 9.123e-02, 1.202e-01, -7.532e-03, -2.004e-02, 5.601e-02, 5.176e-02, -2.966e-02, -1.028e-01, 2.305e-02, 8.507e-02, -4.308e-02, 4.660e-02, -3.810e-02)); + r += mul(s7_5, M4(1.993e-03, 3.307e-02, -3.692e-02, 6.274e-02, 8.841e-02, 6.889e-02, 3.847e-02, 3.557e-03, -1.397e-02, -6.079e-02, -1.159e-01, 5.036e-02, -7.212e-02, -8.696e-02, -1.473e-02, -8.401e-05)); + r += mul(s7_6, M4(1.307e-03, 5.465e-02, 8.376e-02, 6.102e-04, 1.640e-02, -3.675e-02, 1.247e-02, 7.030e-03, 1.581e-02, -2.842e-02, 4.472e-02, 5.942e-03, -3.620e-02, -4.640e-02, 4.822e-02, 7.610e-02)); + r += mul(s7_7, M4(5.411e-03, -4.896e-02, 7.239e-02, 2.750e-02, 3.379e-03, -6.351e-02, 1.287e-02, 9.011e-03, 2.150e-02, 2.218e-02, 1.566e-02, -8.448e-03, 2.273e-02, 4.030e-02, 9.586e-03, -1.124e-02)); + r += mul(s7_8, M4(-1.543e-03, -1.198e-02, -4.999e-02, 2.786e-02, 6.909e-02, 3.947e-02, -2.309e-03, 5.050e-03, 3.616e-02, -2.521e-02, 4.467e-02, -6.620e-02, 6.803e-02, 1.796e-02, -1.544e-02, 8.682e-03)); + r += V4(1.619e-02, 2.435e-02, 1.969e-02, 4.142e-03); + return r; +} + +V4 f3(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(2.543e-02, -1.793e-02, -2.661e-02, -8.442e-03, -3.030e-02, 7.954e-02, 4.205e-03, -1.372e-02, 1.039e-01, 1.134e-01, 4.211e-02, -3.359e-02, 5.462e-02, 2.089e-02, -4.002e-02, 7.973e-02)); + r += mul(s0_1, M4(-2.038e-03, -1.586e-02, -2.208e-02, -3.928e-03, -3.969e-02, 2.543e-03, 1.281e-02, 1.219e-01, -7.411e-03, 9.921e-02, -1.890e-02, -1.119e-02, 3.633e-02, -2.426e-02, -7.610e-02, 2.071e-01)); + r += mul(s0_2, M4(1.747e-02, -1.930e-02, 2.645e-02, -3.918e-02, 5.670e-02, -3.047e-02, -2.489e-02, -2.364e-02, 1.529e-02, 3.475e-02, -1.780e-02, 3.892e-02, 7.479e-02, -6.135e-02, -2.016e-01, -2.309e-02)); + r += mul(s0_3, M4(4.840e-02, -2.967e-02, -4.442e-02, 1.850e-02, -1.576e-01, -3.390e-02, 3.628e-02, 5.351e-03, -3.437e-02, -1.698e-02, 8.110e-03, -1.047e-02, -5.011e-02, -2.863e-01, 2.716e-02, 1.364e-01)); + r += mul(s0_4, M4(1.586e-01, 3.869e-02, 4.948e-02, -1.398e-02, 1.052e-01, -1.790e-03, 1.426e-02, -1.089e-01, -2.705e-01, -4.928e-02, -1.672e-01, 8.665e-02, -3.057e-01, 1.749e-01, 6.896e-02, -2.513e-01)); + r += mul(s0_5, M4(4.361e-03, -2.893e-02, 4.167e-04, 3.450e-02, -4.229e-02, -7.990e-03, 3.401e-02, -7.631e-03, 1.931e-02, 7.449e-02, 1.669e-02, -4.852e-02, -8.031e-02, 3.757e-02, -1.409e-01, -1.088e-01)); + r += mul(s0_6, M4(1.656e-02, 7.477e-02, -2.463e-02, 2.680e-02, 6.169e-02, -1.259e-04, 6.755e-03, 2.400e-02, 4.599e-02, 2.553e-03, -1.681e-02, 5.101e-02, 1.828e-03, 6.240e-02, -2.371e-02, 5.791e-02)); + r += mul(s0_7, M4(1.073e-03, -3.600e-02, -2.445e-02, 1.764e-02, 5.542e-02, 4.947e-02, 6.553e-03, 7.913e-03, 4.885e-02, -9.868e-02, -1.274e-01, -2.245e-02, 7.077e-02, 4.840e-02, 1.096e-03, 7.830e-02)); + r += mul(s0_8, M4(1.959e-02, 2.715e-02, -7.821e-03, 2.369e-02, -8.008e-02, 4.740e-02, 7.136e-03, 1.902e-02, 9.085e-02, -4.548e-02, 9.690e-03, 7.554e-03, -2.610e-02, 8.072e-02, -1.039e-01, -9.924e-03)); + r += mul(s1_0, M4(-5.144e-02, -1.175e-01, 1.031e-01, -3.103e-01, -6.668e-02, 1.290e-01, -9.938e-02, 1.466e-01, -5.311e-02, 2.059e-02, -1.172e-01, -3.354e-02, 4.052e-02, 1.589e-02, 1.572e-02, 5.945e-02)); + r += mul(s1_1, M4(-1.275e-01, -2.448e-02, -1.102e-03, -3.236e-01, -7.084e-02, 1.954e-01, 2.087e-02, -9.257e-03, 1.603e-02, -1.903e-03, 5.313e-02, -1.290e-02, 1.675e-01, 8.260e-02, 4.374e-02, 4.229e-02)); + r += mul(s1_2, M4(-1.615e-01, -7.282e-02, -4.499e-02, -1.533e-01, 6.813e-02, 3.466e-03, 6.690e-03, 7.790e-02, -5.786e-02, 5.432e-02, 2.534e-02, -3.596e-03, 5.707e-03, -2.349e-02, -6.428e-02, -4.131e-03)); + r += mul(s1_3, M4(1.267e-01, -6.708e-03, -9.339e-02, -4.356e-02, -5.323e-02, 6.610e-02, -7.934e-02, 1.313e-01, 2.120e-02, -1.163e-02, 6.597e-02, -4.234e-02, 7.453e-02, -7.786e-02, -1.250e-02, 1.125e-01)); + r += mul(s1_4, M4(3.665e-01, 1.590e-01, -1.122e-01, 1.540e-01, 3.349e-02, -1.161e-01, 5.773e-02, 2.363e-02, 2.738e-02, 1.204e-01, -3.128e-01, 1.291e-02, -9.935e-02, -1.122e-01, -2.228e-02, 3.867e-02)); + r += mul(s1_5, M4(1.587e-01, 1.904e-01, -3.435e-01, 1.060e-01, -1.010e-01, 5.352e-02, 3.700e-02, -5.632e-02, 8.173e-02, 9.857e-02, -1.753e-01, 4.469e-03, -4.160e-02, -7.350e-02, -8.057e-02, -4.027e-02)); + r += mul(s1_6, M4(9.872e-02, 1.109e-01, 8.054e-02, -1.404e-02, -1.189e-02, -2.346e-02, 8.571e-03, -6.556e-02, 7.537e-02, 9.442e-02, 8.507e-03, 6.746e-02, -8.489e-02, -9.849e-02, -2.410e-02, 1.358e-02)); + r += mul(s1_7, M4(2.501e-02, 3.615e-02, 5.910e-02, 1.600e-02, -5.374e-02, 7.789e-02, -2.909e-02, -5.501e-03, 1.722e-01, 1.175e-01, -1.703e-01, 5.649e-02, -1.099e-01, -6.323e-02, -1.531e-02, -1.376e-02)); + r += mul(s1_8, M4(-2.230e-02, -1.235e-01, 1.060e-01, 4.907e-02, 1.111e-01, 2.390e-02, 1.095e-01, 1.002e-01, -6.648e-03, 1.470e-02, 6.574e-02, -4.105e-02, -4.060e-02, 1.489e-01, -3.608e-02, -1.929e-02)); + r += mul(s2_0, M4(-3.375e-04, 3.077e-03, 9.368e-02, 4.429e-03, 7.119e-02, 1.765e-02, 1.129e-01, -1.313e-01, -1.649e-02, -5.255e-02, 6.884e-03, 2.996e-04, -6.845e-02, -2.114e-02, 6.361e-02, -8.461e-02)); + r += mul(s2_1, M4(-5.765e-02, -1.345e-02, -5.231e-02, -1.190e-02, 2.960e-02, 7.591e-02, 5.526e-02, -1.188e-01, -9.837e-02, -1.191e-02, -2.463e-02, -1.121e-01, -4.223e-02, 5.940e-02, -6.918e-02, 1.428e-01)); + r += mul(s2_2, M4(1.044e-02, -7.264e-03, -5.687e-02, -2.949e-02, -7.140e-03, -1.959e-01, 5.113e-02, -3.021e-02, 2.139e-02, 6.523e-02, 1.018e-01, 2.631e-02, -8.545e-03, 8.892e-02, 7.265e-02, -1.880e-01)); + r += mul(s2_3, M4(1.447e-02, -8.470e-02, 7.456e-02, 2.647e-02, 8.139e-02, -6.002e-02, 2.721e-03, -9.280e-02, -1.130e-01, 7.528e-02, -1.555e-02, -6.099e-03, 9.102e-02, 3.104e-02, 1.528e-02, 3.439e-02)); + r += mul(s2_4, M4(-1.070e-01, -2.137e-04, 1.489e-01, -1.613e-01, -1.706e-01, -4.034e-03, -3.536e-02, 1.709e-02, -1.556e-01, 7.692e-02, -1.919e-01, -2.885e-01, 1.885e-01, 4.700e-02, 9.758e-02, 1.347e-02)); + r += mul(s2_5, M4(-1.500e-02, -4.942e-02, 3.868e-02, -5.220e-03, 2.736e-02, 1.739e-01, 1.519e-01, -2.263e-02, -4.559e-02, 1.208e-01, -1.024e-01, -5.350e-03, -1.364e-02, -1.881e-01, -5.185e-02, 2.927e-02)); + r += mul(s2_6, M4(3.519e-02, 5.847e-02, 1.829e-02, 5.118e-02, 2.837e-02, 5.415e-02, 1.346e-02, 6.121e-04, -3.360e-02, -1.113e-01, -2.197e-03, -3.458e-02, -1.608e-02, 3.809e-02, 9.094e-03, 3.780e-02)); + r += mul(s2_7, M4(4.761e-03, -7.532e-02, -5.880e-02, 1.926e-02, -5.061e-03, -1.367e-02, 5.288e-03, -2.457e-02, 4.434e-02, 5.182e-02, 9.892e-02, -8.780e-02, -4.478e-02, -6.584e-02, -1.004e-01, 3.399e-02)); + r += mul(s2_8, M4(-2.743e-02, 4.934e-02, 7.882e-02, -4.161e-02, 1.574e-01, 1.455e-02, -5.685e-04, 1.564e-02, -4.879e-02, -1.029e-01, -3.130e-02, -8.087e-02, 1.363e-01, -2.098e-02, 5.942e-02, -8.210e-03)); + r += mul(s3_0, M4(-1.374e-02, 7.180e-02, 6.022e-02, 8.669e-02, 6.722e-03, -5.428e-02, 4.097e-02, -5.723e-02, 1.829e-02, 6.248e-03, 8.819e-03, -1.820e-02, 2.561e-02, -8.226e-02, 3.573e-04, 9.531e-03)); + r += mul(s3_1, M4(-6.223e-03, -1.018e-01, -7.917e-02, 2.553e-02, -7.636e-02, 8.827e-02, -7.935e-02, 1.071e-02, -1.663e-02, -6.168e-02, 3.786e-02, -1.260e-01, -5.847e-02, -4.430e-02, 1.259e-02, 1.584e-02)); + r += mul(s3_2, M4(-3.766e-02, -1.428e-02, 5.059e-02, 4.313e-02, -4.671e-03, -8.941e-02, 3.086e-02, 1.166e-02, 1.931e-02, -1.941e-03, 5.253e-02, 8.497e-03, -4.258e-03, -1.427e-03, -2.630e-02, -2.615e-02)); + r += mul(s3_3, M4(1.434e-02, -7.968e-03, 3.015e-02, 1.365e-01, 3.686e-02, 2.893e-02, -1.644e-02, -6.397e-02, -1.086e-01, -3.093e-02, 3.116e-02, -2.145e-03, -2.071e-03, 7.337e-02, -8.286e-02, -3.803e-02)); + r += mul(s3_4, M4(-1.682e-01, 1.651e-01, 3.779e-01, -2.107e-01, -2.688e-01, 3.074e-02, -4.198e-02, -3.471e-02, -1.145e-01, 6.096e-02, -7.697e-02, -1.275e-01, 2.926e-02, -8.640e-02, -4.570e-02, 9.212e-03)); + r += mul(s3_5, M4(-1.003e-01, -4.532e-02, 1.185e-01, -5.018e-02, 3.630e-02, 1.052e-01, 2.156e-02, 7.973e-02, -1.824e-01, 7.134e-02, -2.839e-02, -2.972e-02, 4.604e-02, 1.248e-01, 2.946e-02, -1.004e-01)); + r += mul(s3_6, M4(-1.382e-01, -6.426e-03, 1.134e-02, -1.395e-02, 8.457e-03, 9.588e-02, 3.972e-02, 1.257e-02, -2.861e-02, -6.084e-02, 7.592e-03, -2.295e-03, 5.240e-02, 2.015e-02, 2.799e-03, 5.091e-02)); + r += mul(s3_7, M4(-9.311e-02, -6.947e-02, -1.227e-02, 3.166e-02, 1.794e-02, -5.997e-02, -3.435e-02, -8.391e-03, -2.391e-02, -3.329e-02, 7.543e-02, 3.182e-02, 1.551e-01, 9.505e-02, -5.603e-02, 5.696e-02)); + r += mul(s3_8, M4(-1.488e-02, 3.870e-02, 8.138e-02, 3.946e-02, -9.627e-03, -3.451e-02, -1.232e-02, -6.382e-03, -1.180e-02, -1.047e-01, -3.782e-02, -3.286e-02, -9.891e-02, -7.887e-02, 2.781e-03, 4.923e-03)); + r += mul(s4_0, M4(-1.543e-02, 3.364e-02, 5.388e-02, -2.789e-02, 6.275e-02, 6.273e-02, -4.797e-02, -1.786e-02, 7.741e-03, 4.798e-02, -6.949e-03, 4.940e-02, 6.214e-02, -2.850e-02, -8.802e-02, 6.091e-02)); + r += mul(s4_1, M4(-4.386e-02, -6.506e-02, -1.533e-01, -1.125e-01, -1.905e-01, 9.027e-02, -2.007e-02, 4.063e-02, -2.500e-02, -5.204e-02, -2.493e-02, 8.728e-02, 2.507e-02, -1.505e-02, 7.927e-02, 7.878e-02)); + r += mul(s4_2, M4(-4.679e-02, -6.334e-02, 2.318e-02, -3.277e-02, 2.703e-02, 9.973e-03, 4.462e-02, 5.833e-02, -3.777e-03, -6.446e-02, 3.411e-02, 4.109e-02, -4.104e-02, 3.981e-02, -2.533e-02, -1.180e-02)); + r += mul(s4_3, M4(1.431e-02, 1.575e-01, -1.386e-02, -5.258e-02, 1.460e-02, 9.747e-02, -3.904e-02, -4.721e-02, 8.228e-03, -5.732e-02, 5.413e-03, 2.851e-02, -8.223e-02, 9.280e-02, 2.836e-02, 8.095e-02)); + r += mul(s4_4, M4(2.747e-01, -2.144e-01, -8.618e-02, -1.085e-01, 2.071e-01, 2.453e-01, 1.405e-01, 1.423e-01, -1.439e-01, -1.044e-01, -7.646e-02, -2.316e-04, -3.095e-02, -5.742e-02, 6.407e-02, -1.216e-02)); + r += mul(s4_5, M4(1.107e-01, -1.380e-02, 3.637e-02, 2.192e-02, 1.241e-01, 1.456e-01, -9.515e-02, 6.993e-02, -2.811e-02, -2.833e-02, 1.723e-01, 6.716e-02, -2.092e-02, -9.826e-03, -3.243e-02, -5.823e-02)); + r += mul(s4_6, M4(-1.301e-02, -2.547e-03, 3.076e-02, -3.167e-02, 4.486e-02, 1.551e-01, -8.204e-02, 8.202e-03, 7.205e-02, 1.082e-01, -4.516e-02, 5.511e-02, -4.204e-02, -5.157e-02, -9.286e-02, 2.381e-02)); + r += mul(s4_7, M4(4.478e-02, 9.730e-02, -6.711e-02, -1.573e-02, 1.599e-01, 7.125e-04, 8.364e-02, -3.236e-02, 1.162e-01, 1.376e-01, -1.624e-03, 1.320e-02, -2.593e-02, -2.171e-02, -3.284e-02, 1.282e-02)); + r += mul(s4_8, M4(1.971e-02, 6.643e-02, 2.099e-02, -4.846e-02, 6.507e-02, 4.767e-02, -9.634e-02, -7.191e-02, -4.709e-02, 2.865e-02, 5.879e-02, 6.538e-03, 6.665e-02, 3.576e-02, -6.457e-02, -9.140e-03)); + r += mul(s5_0, M4(4.701e-02, 6.554e-02, 2.684e-02, -6.159e-02, -1.654e-02, 3.635e-02, -1.624e-02, -6.742e-02, -3.377e-03, 4.140e-02, -5.588e-02, -3.041e-02, -4.195e-02, 4.853e-02, -5.634e-02, -1.474e-02)); + r += mul(s5_1, M4(-1.170e-01, 1.339e-02, -1.540e-01, -2.260e-01, 1.586e-04, 1.326e-02, 6.470e-02, 8.587e-02, -1.361e-03, -2.062e-02, -4.187e-02, 2.213e-01, -1.077e-01, -9.440e-03, 9.954e-02, 7.201e-02)); + r += mul(s5_2, M4(5.207e-02, -2.738e-02, -5.539e-02, -7.207e-02, 2.145e-02, -1.095e-01, 4.503e-03, 3.237e-02, 1.250e-01, 6.253e-02, 3.567e-02, 8.087e-02, -2.536e-02, 1.982e-02, -5.218e-02, 2.405e-02)); + r += mul(s5_3, M4(2.712e-02, 3.756e-02, 1.426e-02, -5.842e-02, -2.080e-02, 2.785e-02, -4.829e-02, -5.688e-02, 4.663e-02, -4.626e-02, 1.441e-02, 4.917e-03, 1.114e-02, 4.579e-02, 5.647e-02, 5.263e-02)); + r += mul(s5_4, M4(6.849e-02, 6.650e-02, 1.116e-01, -1.122e-02, 3.089e-02, 1.219e-01, 3.562e-02, 7.543e-02, 1.527e-02, 2.334e-01, 1.237e-01, -8.526e-02, -2.102e-02, 1.828e-02, -7.334e-02, -8.291e-02)); + r += mul(s5_5, M4(8.283e-02, 2.493e-03, -4.096e-02, -2.882e-02, -4.520e-02, 1.016e-01, -8.556e-03, -2.354e-02, -1.379e-01, -8.510e-02, 3.279e-03, 9.362e-05, 2.788e-02, 2.075e-02, 1.810e-02, 6.659e-02)); + r += mul(s5_6, M4(-2.978e-02, -3.484e-02, 4.946e-03, -6.533e-02, 5.183e-02, 4.185e-02, -8.027e-03, 2.699e-02, 4.217e-03, 8.874e-02, -1.477e-02, -7.149e-03, -3.662e-02, -1.436e-02, -3.279e-02, -1.546e-02)); + r += mul(s5_7, M4(6.874e-02, 1.554e-02, -8.766e-02, 6.074e-03, -4.165e-02, -4.333e-02, 1.862e-02, 1.334e-02, 5.034e-02, -4.829e-02, 6.277e-02, -3.653e-02, -3.265e-02, 5.262e-02, 9.616e-02, -6.061e-02)); + r += mul(s5_8, M4(3.213e-02, 4.388e-02, -8.565e-03, -3.604e-02, 7.287e-02, -4.806e-02, -4.418e-02, 3.579e-02, 3.314e-02, 2.701e-02, 1.081e-01, 6.094e-02, -6.816e-02, 9.806e-02, 1.029e-01, -7.738e-02)); + r += mul(s6_0, M4(-8.138e-02, 1.322e-02, -3.581e-02, -3.120e-02, -3.381e-02, -1.631e-02, 1.721e-02, -5.026e-02, 2.633e-02, -6.625e-02, -3.507e-02, 6.763e-02, -2.698e-02, -7.282e-02, -1.106e-02, -3.171e-02)); + r += mul(s6_1, M4(-1.629e-01, -2.432e-02, -1.139e-01, -1.502e-01, -1.430e-01, 3.546e-02, -6.622e-02, -6.755e-02, -1.659e-02, -1.034e-01, -3.824e-02, 2.842e-02, -3.059e-02, -1.435e-02, -1.019e-03, 1.160e-01)); + r += mul(s6_2, M4(5.043e-02, 8.559e-02, -6.544e-02, 2.216e-02, 8.079e-02, 7.001e-02, -2.152e-02, -2.082e-02, -1.592e-02, -5.787e-02, 7.907e-02, 8.431e-02, -2.620e-02, -1.735e-02, 7.290e-03, 7.536e-02)); + r += mul(s6_3, M4(1.025e-01, 1.100e-01, 2.124e-02, 8.235e-02, 1.642e-02, 1.116e-02, -7.398e-02, 1.650e-01, 1.213e-01, 8.291e-02, -1.093e-01, 1.562e-01, 5.294e-02, 1.630e-02, 1.326e-02, 1.377e-02)); + r += mul(s6_4, M4(-1.477e-01, 2.659e-01, 2.785e-01, -1.702e-02, 5.381e-02, 6.180e-02, 2.255e-01, -9.250e-02, 8.226e-03, -3.286e-02, -1.113e-01, 2.175e-01, 9.517e-02, -5.973e-02, 1.623e-01, 3.531e-03)); + r += mul(s6_5, M4(-1.445e-02, 8.014e-02, 7.004e-02, -3.550e-03, -6.454e-03, -9.602e-02, -1.880e-02, -1.644e-02, -3.149e-02, 1.437e-02, -2.019e-01, 9.239e-02, 4.385e-02, -1.358e-03, 6.189e-02, 1.075e-01)); + r += mul(s6_6, M4(9.062e-02, 1.489e-01, -5.916e-03, -1.207e-02, -1.120e-01, -1.501e-01, -2.361e-02, -1.059e-01, -1.591e-02, -6.948e-02, -4.074e-02, -9.472e-02, 4.182e-02, 8.275e-02, -4.424e-02, -7.178e-03)); + r += mul(s6_7, M4(7.850e-02, -7.276e-02, 1.766e-02, -1.310e-03, -1.840e-02, -5.427e-02, 1.062e-01, -9.790e-02, -1.919e-01, -3.143e-02, -9.817e-02, -2.075e-01, -4.986e-02, -1.970e-01, 5.752e-02, 4.696e-02)); + r += mul(s6_8, M4(5.489e-02, 5.411e-02, -1.389e-02, 1.155e-02, 3.127e-02, -5.246e-02, 4.381e-02, 1.885e-02, 1.272e-01, -7.766e-03, 8.421e-02, -9.790e-02, -4.710e-02, -4.770e-02, 1.131e-02, -1.135e-02)); + r += mul(s7_0, M4(-4.978e-03, -9.304e-03, 5.564e-02, -1.056e-01, 9.026e-02, 1.009e-01, 1.372e-02, 4.889e-02, 1.704e-02, 1.378e-02, 1.201e-02, -2.870e-02, -2.174e-02, 2.770e-02, 1.059e-02, -9.119e-02)); + r += mul(s7_1, M4(4.211e-02, -8.833e-02, 3.120e-02, -7.391e-02, 2.726e-03, 3.702e-02, -1.289e-02, -5.863e-02, -1.261e-02, 1.227e-03, -5.446e-02, -1.759e-03, -3.410e-02, 5.307e-02, 7.014e-03, 7.216e-02)); + r += mul(s7_2, M4(-3.874e-02, -5.673e-02, 6.557e-02, -1.465e-02, 9.029e-03, 6.085e-03, 2.823e-02, 2.922e-02, 1.630e-02, 1.792e-02, 2.728e-02, 1.165e-02, 4.924e-02, 2.339e-02, -3.065e-03, 2.313e-02)); + r += mul(s7_3, M4(1.333e-01, 7.813e-02, 3.825e-03, 8.089e-02, -9.015e-02, -5.962e-02, 4.826e-02, 3.799e-03, 2.899e-02, -4.016e-02, -2.577e-02, 6.960e-02, 6.438e-02, -3.648e-02, -3.539e-02, -5.573e-03)); + r += mul(s7_4, M4(6.912e-02, 4.926e-02, 3.699e-02, 4.860e-02, -5.898e-02, -5.131e-02, 3.639e-02, 1.246e-02, 9.589e-02, 7.513e-02, -8.154e-02, 1.216e-01, 4.442e-02, -2.519e-02, 6.937e-02, 4.519e-02)); + r += mul(s7_5, M4(3.508e-02, 5.932e-02, 2.428e-02, 4.604e-02, -3.467e-02, -7.627e-02, -9.483e-02, 2.525e-02, 1.713e-02, -7.534e-02, 7.597e-03, 1.922e-02, -1.988e-02, -2.680e-02, 8.487e-02, 2.842e-02)); + r += mul(s7_6, M4(-4.320e-02, -3.851e-02, 2.136e-02, 3.206e-02, 2.904e-02, 5.274e-02, -1.922e-02, 6.804e-03, 1.996e-02, 4.963e-02, -7.505e-02, -1.301e-02, 3.653e-02, 6.219e-04, -3.436e-02, -5.197e-02)); + r += mul(s7_7, M4(-2.822e-02, 8.996e-03, 2.703e-02, -2.764e-02, -6.224e-02, 1.296e-01, -8.946e-02, 4.212e-04, 2.426e-02, -2.303e-02, -1.459e-02, -9.867e-03, -6.928e-03, 1.073e-02, 3.072e-02, 4.473e-02)); + r += mul(s7_8, M4(1.142e-02, 4.861e-03, -2.562e-02, 1.876e-02, 8.979e-02, 7.380e-02, 1.226e-02, 4.447e-02, -3.478e-02, 4.412e-02, -2.905e-03, -1.803e-02, -8.343e-02, -6.483e-02, 3.517e-02, -5.902e-02)); + r += V4(5.284e-03, -1.982e-02, -9.108e-03, -1.052e-02); + return r; +} + +void Pass15(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = Rmp8x8(tid.x) + blockStart; + uint2 size = GetInputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = (gxy + 0.5) * pt; + + V4 s0_0 = l0(-1.0, -1.0); + V4 s0_1 = l0(0.0, -1.0); + V4 s0_2 = l0(1.0, -1.0); + V4 s0_3 = l0(-1.0, 0.0); + V4 s0_4 = l0(0.0, 0.0); + V4 s0_5 = l0(1.0, 0.0); + V4 s0_6 = l0(-1.0, 1.0); + V4 s0_7 = l0(0.0, 1.0); + V4 s0_8 = l0(1.0, 1.0); + V4 s1_0 = -max(-s0_0, 0.0); + V4 s1_1 = -max(-s0_1, 0.0); + V4 s1_2 = -max(-s0_2, 0.0); + V4 s1_3 = -max(-s0_3, 0.0); + V4 s1_4 = -max(-s0_4, 0.0); + V4 s1_5 = -max(-s0_5, 0.0); + V4 s1_6 = -max(-s0_6, 0.0); + V4 s1_7 = -max(-s0_7, 0.0); + V4 s1_8 = -max(-s0_8, 0.0); + s0_0 = max(s0_0, 0.0); + s0_1 = max(s0_1, 0.0); + s0_2 = max(s0_2, 0.0); + s0_3 = max(s0_3, 0.0); + s0_4 = max(s0_4, 0.0); + s0_5 = max(s0_5, 0.0); + s0_6 = max(s0_6, 0.0); + s0_7 = max(s0_7, 0.0); + s0_8 = max(s0_8, 0.0); + + V4 s2_0 = l1(-1.0, -1.0); + V4 s2_1 = l1(0.0, -1.0); + V4 s2_2 = l1(1.0, -1.0); + V4 s2_3 = l1(-1.0, 0.0); + V4 s2_4 = l1(0.0, 0.0); + V4 s2_5 = l1(1.0, 0.0); + V4 s2_6 = l1(-1.0, 1.0); + V4 s2_7 = l1(0.0, 1.0); + V4 s2_8 = l1(1.0, 1.0); + V4 s3_0 = -max(-s2_0, 0.0); + V4 s3_1 = -max(-s2_1, 0.0); + V4 s3_2 = -max(-s2_2, 0.0); + V4 s3_3 = -max(-s2_3, 0.0); + V4 s3_4 = -max(-s2_4, 0.0); + V4 s3_5 = -max(-s2_5, 0.0); + V4 s3_6 = -max(-s2_6, 0.0); + V4 s3_7 = -max(-s2_7, 0.0); + V4 s3_8 = -max(-s2_8, 0.0); + s2_0 = max(s2_0, 0.0); + s2_1 = max(s2_1, 0.0); + s2_2 = max(s2_2, 0.0); + s2_3 = max(s2_3, 0.0); + s2_4 = max(s2_4, 0.0); + s2_5 = max(s2_5, 0.0); + s2_6 = max(s2_6, 0.0); + s2_7 = max(s2_7, 0.0); + s2_8 = max(s2_8, 0.0); + + V4 s4_0 = l2(-1.0, -1.0); + V4 s4_1 = l2(0.0, -1.0); + V4 s4_2 = l2(1.0, -1.0); + V4 s4_3 = l2(-1.0, 0.0); + V4 s4_4 = l2(0.0, 0.0); + V4 s4_5 = l2(1.0, 0.0); + V4 s4_6 = l2(-1.0, 1.0); + V4 s4_7 = l2(0.0, 1.0); + V4 s4_8 = l2(1.0, 1.0); + V4 s5_0 = -max(-s4_0, 0.0); + V4 s5_1 = -max(-s4_1, 0.0); + V4 s5_2 = -max(-s4_2, 0.0); + V4 s5_3 = -max(-s4_3, 0.0); + V4 s5_4 = -max(-s4_4, 0.0); + V4 s5_5 = -max(-s4_5, 0.0); + V4 s5_6 = -max(-s4_6, 0.0); + V4 s5_7 = -max(-s4_7, 0.0); + V4 s5_8 = -max(-s4_8, 0.0); + s4_0 = max(s4_0, 0.0); + s4_1 = max(s4_1, 0.0); + s4_2 = max(s4_2, 0.0); + s4_3 = max(s4_3, 0.0); + s4_4 = max(s4_4, 0.0); + s4_5 = max(s4_5, 0.0); + s4_6 = max(s4_6, 0.0); + s4_7 = max(s4_7, 0.0); + s4_8 = max(s4_8, 0.0); + + V4 s6_0 = l3(-1.0, -1.0); + V4 s6_1 = l3(0.0, -1.0); + V4 s6_2 = l3(1.0, -1.0); + V4 s6_3 = l3(-1.0, 0.0); + V4 s6_4 = l3(0.0, 0.0); + V4 s6_5 = l3(1.0, 0.0); + V4 s6_6 = l3(-1.0, 1.0); + V4 s6_7 = l3(0.0, 1.0); + V4 s6_8 = l3(1.0, 1.0); + V4 s7_0 = -max(-s6_0, 0.0); + V4 s7_1 = -max(-s6_1, 0.0); + V4 s7_2 = -max(-s6_2, 0.0); + V4 s7_3 = -max(-s6_3, 0.0); + V4 s7_4 = -max(-s6_4, 0.0); + V4 s7_5 = -max(-s6_5, 0.0); + V4 s7_6 = -max(-s6_6, 0.0); + V4 s7_7 = -max(-s6_7, 0.0); + V4 s7_8 = -max(-s6_8, 0.0); + s6_0 = max(s6_0, 0.0); + s6_1 = max(s6_1, 0.0); + s6_2 = max(s6_2, 0.0); + s6_3 = max(s6_3, 0.0); + s6_4 = max(s6_4, 0.0); + s6_5 = max(s6_5, 0.0); + s6_6 = max(s6_6, 0.0); + s6_7 = max(s6_7, 0.0); + s6_8 = max(s6_8, 0.0); + + t0[gxy] = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t1[gxy] = f1(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t2[gxy] = f2(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t3[gxy] = f3(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); +} + +//!PASS 16 +//!DESC conv15 +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 +//!IN t0, t1, t2, t3 +//!OUT t4, t5, t6, t7 + +#define l0(x, y) V4(O(t0, float2(x, y))) +#define l1(x, y) V4(O(t1, float2(x, y))) +#define l2(x, y) V4(O(t2, float2(x, y))) +#define l3(x, y) V4(O(t3, float2(x, y))) + +V4 f0(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(1.682e-02, 2.425e-02, 6.033e-03, -1.354e-02, 4.902e-02, -2.423e-02, -2.191e-02, -1.244e-02, 2.555e-02, 1.398e-02, 1.653e-03, 1.456e-02, 1.836e-02, 4.914e-02, -1.220e-02, 2.402e-02)); + r += mul(s0_1, M4(-1.415e-01, -5.750e-02, 1.052e-01, 2.448e-02, -6.458e-02, 8.314e-03, 7.921e-03, -2.826e-02, 8.116e-02, 2.587e-02, -1.653e-01, 1.925e-02, -3.094e-02, 1.172e-02, 2.412e-02, -1.644e-02)); + r += mul(s0_2, M4(2.726e-02, -2.295e-02, 3.601e-02, -3.420e-02, 2.458e-02, -3.328e-02, 2.415e-02, -3.922e-03, 1.014e-01, 3.177e-02, 8.030e-02, -3.316e-04, -1.294e-01, -3.477e-03, -2.168e-03, -4.343e-02)); + r += mul(s0_3, M4(5.999e-02, -1.569e-03, 4.338e-03, -3.949e-03, 5.016e-02, 1.272e-02, -5.577e-02, 9.612e-03, -4.428e-02, -1.158e-01, -1.747e-03, -3.783e-02, 2.071e-02, -6.513e-02, -9.574e-02, 1.217e-02)); + r += mul(s0_4, M4(-6.832e-02, 3.306e-02, 3.602e-02, -1.176e-01, -1.634e-02, 8.846e-03, -4.939e-02, 3.965e-02, -1.110e-01, 4.198e-02, -1.919e-01, 3.252e-02, -3.235e-01, -4.438e-02, 3.970e-02, -9.790e-02)); + r += mul(s0_5, M4(7.532e-04, -3.379e-02, 1.206e-01, -1.262e-02, 5.126e-03, 1.393e-02, 9.355e-02, -1.952e-02, 1.288e-02, -5.581e-02, 4.603e-02, 6.297e-03, 7.578e-02, 6.956e-02, 1.251e-02, 8.053e-02)); + r += mul(s0_6, M4(-8.240e-03, -4.579e-02, 8.483e-03, 5.418e-02, 6.400e-02, -3.510e-02, -4.983e-02, 3.210e-02, -7.979e-03, 3.418e-02, 1.844e-02, -1.444e-02, 3.045e-02, -5.388e-02, -3.282e-02, -1.676e-02)); + r += mul(s0_7, M4(-5.499e-02, 4.137e-03, 6.030e-02, 7.094e-02, -6.567e-02, -7.267e-02, -1.662e-02, -7.336e-02, -6.070e-03, -8.680e-02, -3.998e-03, 1.843e-02, -7.485e-02, 3.307e-02, 4.805e-02, 3.993e-02)); + r += mul(s0_8, M4(1.536e-02, 2.666e-02, 3.056e-02, -1.114e-02, 2.242e-02, 6.991e-03, -2.173e-03, 3.283e-02, -5.911e-02, 2.191e-02, 3.963e-02, -2.860e-02, 5.899e-02, -3.175e-02, 5.169e-02, -2.245e-02)); + r += mul(s1_0, M4(6.282e-02, 4.438e-02, -3.383e-02, -3.169e-03, -1.302e-02, 6.962e-02, -1.602e-02, 1.114e-02, -1.264e-02, -3.295e-02, 2.876e-02, 2.982e-02, -3.565e-02, 6.198e-02, -4.253e-02, 1.322e-02)); + r += mul(s1_1, M4(-2.256e-01, 4.261e-02, 7.907e-02, -4.247e-02, -1.645e-02, -4.936e-02, 4.114e-02, -4.063e-02, -2.386e-02, 4.551e-02, -1.485e-01, -1.643e-02, -2.257e-01, -4.944e-02, -2.584e-03, -9.462e-03)); + r += mul(s1_2, M4(4.578e-02, 2.807e-02, -8.221e-03, -6.325e-02, -8.816e-02, -6.825e-03, -2.188e-02, -5.079e-02, 1.666e-02, 2.919e-03, 3.045e-02, -3.505e-02, 2.878e-02, 1.035e-03, 2.864e-02, 1.354e-02)); + r += mul(s1_3, M4(2.020e-01, -8.129e-02, 4.874e-03, -4.772e-02, 1.859e-02, 2.295e-01, -8.389e-02, 1.096e-01, 1.270e-02, 9.785e-02, 1.383e-01, -8.565e-02, 3.833e-02, 5.794e-02, 1.007e-03, -1.219e-01)); + r += mul(s1_4, M4(3.020e-01, 1.345e-01, 1.214e-01, -1.476e-01, 2.721e-02, 5.156e-02, 1.066e-01, -7.236e-02, -6.882e-03, -1.193e-01, -2.321e-01, 1.603e-01, -2.560e-01, -9.591e-02, -7.915e-02, -7.280e-02)); + r += mul(s1_5, M4(5.588e-02, -3.970e-02, 5.567e-02, 9.945e-02, 7.813e-02, 2.689e-03, -4.028e-02, 5.141e-02, -1.109e-01, -1.519e-01, -2.412e-02, 5.308e-02, 4.241e-02, 1.421e-01, 8.538e-02, -3.083e-02)); + r += mul(s1_6, M4(4.734e-02, 1.498e-03, -1.688e-02, 8.204e-02, 6.827e-02, -9.353e-02, -6.352e-02, -7.212e-02, -7.166e-03, -2.990e-02, -6.335e-02, 5.694e-02, 3.916e-02, -5.895e-02, -5.882e-02, 2.516e-02)); + r += mul(s1_7, M4(4.143e-02, -8.794e-02, 2.631e-02, 2.151e-01, 5.745e-02, -2.816e-02, 2.094e-02, 4.433e-02, 1.357e-01, -8.145e-02, -5.290e-02, 1.230e-01, -1.741e-02, -3.334e-02, 7.489e-02, -1.465e-02)); + r += mul(s1_8, M4(4.237e-02, 4.545e-02, -1.561e-02, 1.046e-01, 6.236e-02, -3.658e-02, 3.117e-03, -5.313e-02, -5.248e-02, -3.058e-02, 5.975e-02, -4.943e-02, -4.859e-03, 2.759e-02, -6.380e-02, 5.511e-03)); + r += mul(s2_0, M4(-1.698e-02, 2.008e-02, 4.178e-02, 5.254e-03, -1.866e-02, 6.468e-02, 3.264e-02, 4.248e-02, -1.613e-02, 1.055e-02, 4.652e-03, -2.110e-02, -1.071e-02, -2.709e-03, -9.281e-03, 1.559e-02)); + r += mul(s2_1, M4(-1.443e-01, 8.375e-02, 2.033e-02, -3.873e-03, 1.029e-01, 4.871e-02, 5.010e-02, -1.688e-02, -7.934e-02, -9.075e-02, 3.202e-03, 6.989e-03, -1.968e-02, 4.563e-02, -3.979e-02, 5.553e-02)); + r += mul(s2_2, M4(2.630e-02, 5.112e-02, 3.405e-02, -1.654e-01, 4.047e-02, 4.512e-02, 2.716e-02, -1.259e-02, 2.451e-02, -2.394e-02, 4.361e-02, -2.896e-02, 2.850e-02, 1.479e-02, -5.123e-02, 4.183e-02)); + r += mul(s2_3, M4(7.516e-02, -8.210e-03, -4.111e-03, 4.448e-02, -5.627e-02, 2.278e-03, 4.189e-02, -4.233e-02, -2.394e-02, -2.066e-02, 1.324e-03, -3.099e-02, 3.708e-03, 3.445e-02, -1.211e-02, 8.406e-03)); + r += mul(s2_4, M4(4.450e-02, 3.494e-02, 5.925e-03, 2.108e-02, -2.367e-01, -4.596e-03, -5.752e-02, -2.565e-01, 3.773e-01, -1.032e-02, -8.405e-02, -8.625e-02, -6.044e-02, -1.957e-02, 6.003e-02, -1.532e-01)); + r += mul(s2_5, M4(-1.677e-02, -8.374e-02, 9.221e-04, -7.647e-02, -1.666e-02, -1.848e-02, -7.573e-03, -1.446e-02, -4.613e-02, -2.494e-02, 4.640e-02, 2.289e-02, -5.411e-02, 8.961e-03, 1.322e-01, -1.519e-01)); + r += mul(s2_6, M4(-4.333e-02, 4.873e-03, -2.330e-02, -1.203e-02, -1.656e-02, -5.966e-02, -2.807e-03, 2.686e-02, -4.143e-02, -4.584e-03, -2.170e-03, 8.825e-03, 1.156e-02, -5.674e-03, -1.562e-02, -5.008e-03)); + r += mul(s2_7, M4(4.915e-02, 2.856e-02, -4.347e-02, 6.325e-02, -1.408e-02, 7.563e-02, 1.125e-01, -1.700e-01, 6.698e-03, -9.449e-02, -1.623e-03, 7.157e-02, -3.837e-02, 1.442e-02, 6.002e-02, 3.344e-02)); + r += mul(s2_8, M4(1.424e-03, -1.889e-02, -2.530e-02, -1.584e-02, 3.956e-02, 2.339e-02, 1.996e-02, 9.705e-03, -5.004e-02, -4.270e-02, 1.243e-02, 2.805e-02, -2.629e-02, 1.128e-02, -2.821e-02, 4.977e-02)); + r += mul(s3_0, M4(2.344e-03, -1.510e-02, 2.258e-02, -2.662e-02, 4.342e-03, -2.228e-02, -1.850e-02, 1.700e-02, -4.349e-02, 1.978e-02, -7.904e-03, 6.129e-02, -8.322e-03, -3.489e-02, 3.685e-02, 1.218e-02)); + r += mul(s3_1, M4(1.137e-01, -2.344e-01, -2.425e-01, -2.087e-01, -7.206e-02, 2.724e-03, 2.830e-02, -3.068e-02, -8.735e-02, -2.185e-03, 3.007e-02, 5.390e-02, 1.068e-01, -1.539e-02, -8.570e-02, 4.549e-02)); + r += mul(s3_2, M4(3.499e-02, 1.594e-02, -9.933e-02, -7.474e-02, 1.051e-02, -2.210e-02, 3.491e-02, -8.810e-03, -4.210e-02, 1.901e-02, 2.575e-02, -1.876e-02, 9.872e-03, 2.527e-02, 1.904e-02, 3.485e-02)); + r += mul(s3_3, M4(1.892e-02, 5.257e-03, 6.593e-02, -1.068e-01, -1.009e-01, -2.306e-02, -1.774e-02, -1.073e-01, -6.668e-02, -3.584e-02, -7.708e-03, -3.551e-02, -3.283e-03, 3.566e-03, 1.590e-03, -2.380e-02)); + r += mul(s3_4, M4(6.213e-04, -3.430e-02, -1.038e-01, 1.743e-01, -1.318e-01, -3.481e-02, 4.391e-02, -5.380e-02, 1.526e-01, -7.420e-03, -4.670e-02, -1.651e-02, -1.487e-01, -8.589e-02, -1.704e-01, 1.922e-02)); + r += mul(s3_5, M4(1.096e-01, -4.456e-02, 1.130e-01, -2.652e-01, -4.299e-02, -1.735e-02, 1.206e-01, -5.507e-02, -2.571e-02, 7.543e-03, -5.169e-02, 1.070e-01, -6.630e-02, -2.834e-02, 1.781e-01, 4.697e-02)); + r += mul(s3_6, M4(-1.036e-02, -2.780e-02, 7.376e-03, -2.156e-02, -2.542e-02, -4.496e-02, 1.697e-02, 2.637e-02, -2.082e-02, 2.391e-02, -2.514e-03, 7.337e-02, 7.580e-02, -4.554e-02, -2.737e-02, 3.262e-02)); + r += mul(s3_7, M4(-7.323e-03, 4.827e-02, -2.236e-02, 3.041e-02, 1.176e-02, -5.546e-02, 7.340e-02, -6.719e-03, -2.321e-02, 4.693e-02, -3.563e-02, 1.035e-02, -1.612e-02, -9.980e-02, -9.701e-02, -6.659e-02)); + r += mul(s3_8, M4(-1.683e-02, 1.837e-02, -1.291e-02, -6.702e-02, -8.351e-02, 1.838e-02, 4.611e-03, 1.597e-02, -1.131e-02, -5.924e-03, -2.187e-02, 7.444e-02, 1.927e-02, 1.152e-01, 1.523e-01, 2.847e-02)); + r += mul(s4_0, M4(-1.699e-02, -1.167e-02, -1.304e-03, 2.278e-02, -6.011e-02, -8.199e-03, -2.469e-02, -2.724e-02, -7.896e-02, 3.514e-02, -4.913e-02, 4.323e-02, -4.083e-02, -2.205e-02, 4.041e-03, -3.569e-02)); + r += mul(s4_1, M4(-1.868e-02, -1.643e-03, 4.291e-02, 2.588e-02, 4.562e-02, 2.170e-02, 4.389e-02, 2.023e-02, -3.285e-02, 1.572e-01, -5.427e-02, -3.453e-02, 1.614e-01, -3.315e-02, 9.291e-02, 2.523e-02)); + r += mul(s4_2, M4(-5.716e-02, 2.952e-02, 3.345e-03, 1.417e-02, 7.218e-02, 3.521e-02, 5.576e-02, -1.665e-02, 5.210e-02, -1.169e-03, -1.382e-02, 2.093e-02, 1.369e-01, 2.903e-02, 6.485e-03, 2.985e-02)); + r += mul(s4_3, M4(-5.154e-03, -7.552e-02, -4.847e-02, -1.900e-02, -4.854e-02, -1.988e-02, 2.748e-02, 1.465e-02, -4.519e-02, -1.215e-01, -8.303e-02, -5.047e-02, 5.773e-03, 8.883e-02, -3.625e-02, 3.724e-02)); + r += mul(s4_4, M4(1.215e-01, -6.698e-02, 1.472e-01, 4.760e-02, 4.249e-02, -9.318e-02, 2.074e-01, -7.291e-02, -2.521e-02, -1.567e-01, 5.401e-02, 1.068e-01, -1.088e-01, -4.689e-02, 1.450e-01, -2.702e-02)); + r += mul(s4_5, M4(-7.204e-04, 4.627e-02, 8.406e-02, -4.793e-02, -1.044e-01, -1.752e-02, -1.223e-01, -2.838e-02, -1.513e-02, 2.866e-02, -6.117e-02, 6.588e-02, -4.003e-02, 2.135e-02, -3.993e-02, 3.138e-02)); + r += mul(s4_6, M4(-1.858e-02, 1.069e-01, 1.917e-02, -5.787e-03, 2.869e-03, -1.855e-02, 2.874e-02, -6.176e-03, 5.764e-02, -4.411e-02, 2.198e-02, -9.514e-02, -6.286e-02, 4.674e-02, -6.493e-02, 1.780e-02)); + r += mul(s4_7, M4(1.470e-01, -3.257e-02, -4.421e-02, 5.879e-02, -2.092e-02, 7.217e-02, 6.232e-02, 8.477e-03, 1.634e-02, -4.973e-03, -1.537e-02, -8.101e-02, -1.271e-01, 1.621e-01, 7.392e-02, 2.400e-02)); + r += mul(s4_8, M4(-3.555e-02, -3.285e-02, 7.891e-02, -3.678e-02, -6.757e-02, 4.733e-02, -1.116e-02, -2.527e-02, -2.691e-02, 3.767e-02, 2.019e-02, -2.048e-02, -5.428e-02, 3.365e-02, -4.707e-02, -7.004e-02)); + r += mul(s5_0, M4(-2.108e-02, 1.779e-02, -2.833e-03, 3.292e-03, 5.820e-02, 7.601e-02, 6.101e-02, -1.330e-03, -1.138e-01, 7.445e-02, -7.096e-02, 6.305e-02, -2.494e-02, 2.407e-02, 8.140e-03, -1.834e-02)); + r += mul(s5_1, M4(-2.880e-02, 5.085e-03, 2.434e-02, 2.508e-02, 1.602e-01, 1.564e-02, 5.507e-02, -7.678e-02, 9.892e-02, 3.094e-02, -2.829e-02, -7.596e-02, -3.132e-02, -5.615e-02, 1.057e-02, -3.444e-02)); + r += mul(s5_2, M4(-1.577e-01, 8.848e-03, 2.636e-02, 5.279e-02, 1.705e-02, 1.786e-02, 2.434e-02, -7.094e-02, -7.860e-03, -5.334e-03, 1.383e-02, -5.143e-03, -2.998e-02, 2.062e-02, -4.367e-02, 5.676e-04)); + r += mul(s5_3, M4(-1.425e-02, -4.238e-02, -6.793e-02, 4.202e-02, -7.728e-02, -9.246e-02, -7.324e-02, 1.616e-01, -1.074e-01, -2.153e-01, 5.838e-02, -1.196e-01, 1.985e-02, -5.314e-03, 5.793e-02, 3.626e-02)); + r += mul(s5_4, M4(-1.126e-01, 3.180e-02, 2.878e-01, -1.492e-02, 1.474e-01, -1.059e-01, 4.287e-01, -1.011e-01, -1.807e-01, -2.479e-01, 1.394e-01, 1.323e-02, -1.739e-02, 1.892e-01, -1.471e-02, 7.751e-02)); + r += mul(s5_5, M4(-2.764e-01, -2.786e-02, -2.956e-02, 3.056e-02, 1.450e-01, 8.922e-02, -3.140e-02, 9.458e-03, -8.860e-02, -2.775e-03, 1.361e-02, -3.029e-02, 6.369e-02, -1.583e-02, 2.707e-02, 3.723e-02)); + r += mul(s5_6, M4(-2.289e-02, 4.078e-02, 3.194e-02, -9.888e-02, 2.521e-02, 2.108e-02, -9.092e-03, 2.643e-02, -9.351e-03, 3.902e-02, 3.222e-02, 4.324e-02, 2.597e-02, -2.693e-02, 3.525e-02, 3.717e-04)); + r += mul(s5_7, M4(1.820e-02, 2.229e-01, 1.687e-01, 6.165e-02, -3.438e-02, -2.363e-02, 3.922e-02, -5.587e-02, -6.921e-02, 5.308e-02, -7.363e-02, -1.111e-01, 2.304e-02, -2.049e-02, 2.426e-02, -3.094e-02)); + r += mul(s5_8, M4(-3.477e-02, 7.511e-02, -1.020e-02, 1.072e-02, 1.418e-02, -1.736e-02, 4.884e-02, -1.775e-02, -5.870e-02, 2.241e-02, 1.193e-02, -3.586e-02, -1.182e-02, 3.054e-03, 8.716e-03, -5.858e-02)); + r += mul(s6_0, M4(1.296e-02, 4.521e-02, 5.553e-02, 7.200e-03, 2.228e-01, 1.527e-01, 8.212e-02, 3.697e-02, -1.005e-01, 2.319e-02, 6.224e-02, -3.363e-02, -2.382e-02, 4.781e-03, 2.328e-02, 2.167e-02)); + r += mul(s6_1, M4(6.700e-02, -8.083e-02, -5.504e-02, -4.573e-02, 8.391e-02, -1.270e-01, 1.212e-01, 1.590e-01, 5.235e-02, 5.567e-03, -9.952e-02, 5.426e-02, 1.405e-01, 2.182e-02, 2.855e-02, -5.070e-02)); + r += mul(s6_2, M4(1.222e-02, -1.297e-02, 3.429e-02, 5.959e-03, 3.504e-02, 2.729e-02, -1.018e-01, 2.322e-02, -2.360e-02, 5.587e-02, 2.109e-02, -2.796e-02, 1.145e-02, 1.383e-02, -4.523e-02, 4.067e-02)); + r += mul(s6_3, M4(3.378e-02, 4.414e-02, 4.556e-02, 9.837e-02, 9.577e-02, -1.596e-01, 5.565e-02, 3.433e-02, -3.580e-02, 6.830e-02, -8.804e-03, 1.014e-01, 6.641e-03, -3.026e-02, -1.278e-02, -8.684e-02)); + r += mul(s6_4, M4(1.560e-02, 1.232e-01, -8.372e-03, -1.660e-01, -3.968e-01, 2.330e-01, 2.028e-02, 2.646e-01, 6.223e-02, 2.275e-01, 2.140e-01, -2.405e-02, 4.579e-01, -4.541e-02, 9.614e-02, -7.645e-02)); + r += mul(s6_5, M4(-3.295e-02, -2.743e-02, -4.794e-02, 1.720e-02, -7.849e-02, 1.575e-01, -1.164e-02, -2.347e-01, 4.284e-02, 1.307e-02, 4.038e-02, -1.861e-02, 1.120e-01, -9.979e-02, 4.783e-02, 6.604e-02)); + r += mul(s6_6, M4(8.715e-03, 2.297e-02, 6.982e-02, 3.485e-02, 6.133e-04, -7.565e-02, 5.968e-02, 3.948e-02, 4.576e-02, -4.137e-02, 2.947e-02, -2.206e-02, 4.394e-02, 9.766e-03, 2.729e-02, 4.977e-02)); + r += mul(s6_7, M4(6.549e-02, -8.800e-02, -4.819e-03, 5.421e-02, -1.500e-01, 2.293e-01, -4.927e-02, -8.280e-02, -7.289e-02, 4.010e-02, -1.511e-03, 1.767e-02, 1.719e-01, -1.322e-01, 4.552e-02, 5.485e-02)); + r += mul(s6_8, M4(-2.826e-03, 3.567e-02, -1.578e-02, -4.386e-02, 1.998e-02, 5.044e-02, -6.815e-02, 9.634e-02, -1.888e-02, -3.089e-02, 2.895e-02, -3.653e-02, 2.965e-03, -2.441e-02, 6.077e-03, 1.507e-02)); + r += mul(s7_0, M4(1.559e-02, -2.477e-02, 1.646e-02, -2.687e-03, 3.154e-02, -3.535e-02, -4.525e-02, -4.382e-03, -1.899e-02, 4.651e-02, -2.069e-02, 4.084e-02, -9.179e-02, 7.984e-02, -2.161e-02, 8.234e-03)); + r += mul(s7_1, M4(3.448e-01, -1.541e-01, 2.134e-02, 1.274e-01, -2.197e-02, 1.101e-01, 5.202e-02, 5.462e-04, -2.449e-02, 3.539e-02, 5.465e-03, 5.482e-04, -5.681e-02, 6.304e-02, 3.042e-02, -6.518e-02)); + r += mul(s7_2, M4(3.896e-02, -5.241e-02, -1.705e-02, 1.453e-02, -2.905e-02, 2.946e-02, -3.594e-02, 9.768e-03, 5.370e-02, 3.684e-02, 4.114e-02, -2.328e-02, -1.514e-02, 1.587e-02, -4.130e-02, 2.270e-02)); + r += mul(s7_3, M4(5.886e-02, -1.587e-02, -1.114e-01, 1.225e-01, -1.327e-02, -1.252e-02, 1.093e-03, -2.380e-02, -7.611e-02, 1.196e-01, 3.984e-02, 1.318e-02, -2.988e-02, 2.065e-02, -2.236e-02, -1.081e-02)); + r += mul(s7_4, M4(1.103e-01, 4.765e-02, -5.338e-02, -2.094e-01, -8.771e-03, 1.563e-02, 4.116e-02, 1.174e-01, 6.051e-02, 1.695e-01, -2.698e-01, 4.236e-02, 2.473e-01, 7.253e-02, 6.745e-02, -5.874e-02)); + r += mul(s7_5, M4(1.658e-02, -2.497e-02, 2.890e-02, -4.542e-02, -1.103e-02, 8.418e-03, -6.931e-02, -4.678e-02, -5.040e-02, 3.276e-02, 5.987e-02, -8.001e-03, 6.639e-03, -1.172e-02, -1.427e-02, 3.096e-02)); + r += mul(s7_6, M4(-4.578e-02, 2.777e-02, 1.938e-02, -5.613e-02, -1.625e-03, 6.662e-03, 3.588e-03, 1.572e-02, 6.106e-02, -8.091e-02, -8.481e-03, 2.078e-02, -1.129e-02, 1.477e-02, 1.200e-02, 5.556e-02)); + r += mul(s7_7, M4(-1.667e-02, -8.641e-03, -6.570e-02, -6.897e-02, 2.494e-02, -2.685e-02, 3.873e-02, 7.151e-02, 1.727e-02, -1.895e-01, 5.898e-03, 8.379e-02, 3.347e-02, -7.388e-03, -1.169e-02, 9.291e-02)); + r += mul(s7_8, M4(-4.583e-02, 4.776e-02, 3.371e-02, 9.204e-02, 5.692e-03, -2.458e-02, -2.136e-03, -6.759e-03, -1.187e-02, -4.081e-02, -3.127e-04, -5.903e-02, -2.843e-02, 2.085e-02, 7.936e-03, -3.616e-02)); + r += V4(-3.635e-03, -1.028e-02, -3.650e-04, -1.679e-03); + return r; +} + +V4 f1(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-8.601e-03, -6.582e-03, -3.411e-02, 1.939e-02, 4.268e-02, 6.203e-02, -8.224e-03, -3.973e-02, 1.102e-03, -2.386e-02, 2.198e-03, -2.039e-02, 1.227e-02, 5.214e-02, 8.288e-02, -2.762e-02)); + r += mul(s0_1, M4(-1.028e-01, -3.378e-02, 3.985e-03, -6.257e-02, -8.930e-02, 2.849e-02, 2.765e-02, 5.202e-03, -6.127e-02, 5.845e-02, 3.884e-02, 3.214e-02, 5.885e-02, 1.254e-01, -4.733e-02, 1.318e-02)); + r += mul(s0_2, M4(-1.913e-02, -2.165e-02, -4.609e-02, -4.058e-03, 5.175e-02, -4.665e-02, -2.321e-03, 3.057e-02, 1.789e-02, -5.633e-03, 5.981e-04, 2.946e-02, -7.567e-02, 7.726e-02, -1.335e-02, -2.231e-02)); + r += mul(s0_3, M4(-4.422e-04, 3.932e-03, -3.747e-02, 4.274e-02, -9.728e-02, -3.055e-02, 8.176e-02, -1.070e-02, -5.158e-03, 3.761e-02, -6.999e-02, -7.594e-02, 5.391e-02, 5.079e-02, 1.043e-02, -5.175e-02)); + r += mul(s0_4, M4(1.082e-01, 5.860e-02, 3.859e-02, -4.705e-02, 1.514e-01, 6.110e-02, -4.016e-02, 4.433e-02, -3.790e-02, 7.997e-02, 1.072e-01, 1.340e-01, -5.815e-02, 1.407e-01, -1.296e-01, -4.753e-03)); + r += mul(s0_5, M4(-9.001e-02, -7.560e-02, -1.656e-02, -2.018e-02, -3.487e-02, -4.206e-02, -1.692e-02, -9.395e-02, -5.462e-02, -5.607e-02, -5.984e-02, -4.008e-02, -6.659e-03, 8.550e-02, 1.101e-01, -5.317e-02)); + r += mul(s0_6, M4(6.021e-02, 4.988e-03, 2.403e-02, 4.262e-02, 1.789e-02, -1.716e-02, 3.987e-02, -1.076e-01, -4.748e-02, -1.764e-02, -2.308e-02, -6.401e-03, -4.589e-02, 5.688e-03, 6.622e-02, -1.210e-02)); + r += mul(s0_7, M4(-3.895e-02, -7.578e-02, -1.271e-02, 3.790e-02, 2.351e-02, -7.459e-03, -7.894e-02, 8.670e-02, 3.250e-02, 2.430e-02, 1.983e-01, -5.784e-02, 7.884e-03, 3.934e-02, 3.260e-02, -2.293e-03)); + r += mul(s0_8, M4(-5.708e-03, 7.520e-03, 7.843e-03, -5.089e-02, 1.425e-02, -3.691e-02, 2.940e-02, -5.235e-02, -5.730e-03, 4.717e-02, -6.712e-02, -1.439e-02, 3.397e-03, -2.686e-02, -3.211e-02, 3.169e-02)); + r += mul(s1_0, M4(1.214e-01, 3.325e-02, -3.898e-02, -2.344e-02, -9.315e-04, -2.041e-02, 5.530e-02, -2.324e-02, 4.248e-02, 2.593e-02, 3.256e-02, -7.669e-02, 1.557e-01, 4.900e-02, 3.043e-02, 7.165e-02)); + r += mul(s1_1, M4(1.686e-02, -3.408e-03, 2.398e-02, 1.666e-02, 1.708e-01, 1.248e-01, 1.701e-02, 3.409e-02, 3.102e-02, -3.924e-02, -2.257e-02, 9.244e-02, -2.682e-01, -5.456e-04, -3.090e-02, -5.209e-03)); + r += mul(s1_2, M4(-2.618e-02, -1.067e-01, -4.634e-02, 4.220e-02, 2.643e-02, 9.070e-02, -5.263e-02, 3.797e-02, -5.021e-02, -1.616e-02, 4.030e-03, -3.554e-02, 2.286e-02, -1.367e-02, 3.119e-02, 1.015e-02)); + r += mul(s1_3, M4(-2.950e-02, 1.674e-02, 2.861e-02, 1.752e-02, 4.014e-02, -2.871e-02, 8.586e-02, -8.958e-02, -7.844e-02, 1.151e-01, -2.350e-02, -7.249e-02, -9.022e-02, -1.141e-02, -2.103e-02, 4.276e-02)); + r += mul(s1_4, M4(2.100e-01, 1.922e-01, 1.508e-01, -5.379e-02, -3.848e-02, 1.576e-02, -9.808e-02, -1.428e-02, 1.951e-02, 5.196e-02, 9.626e-02, 1.713e-01, 2.680e-02, 3.359e-02, 1.538e-01, -1.678e-01)); + r += mul(s1_5, M4(-2.676e-02, -5.017e-02, 1.711e-02, -8.962e-03, 4.523e-02, -7.491e-03, 1.255e-02, 5.464e-02, -1.861e-02, 1.094e-02, -1.444e-01, 1.939e-01, -5.640e-02, -8.468e-02, 8.226e-02, -5.069e-02)); + r += mul(s1_6, M4(3.551e-02, -5.975e-03, -9.157e-02, 7.229e-02, 2.613e-02, 4.336e-02, 5.629e-02, -4.503e-02, 8.956e-02, -2.216e-02, 4.932e-02, -9.898e-02, -3.663e-02, -5.785e-03, -4.379e-03, -2.736e-02)); + r += mul(s1_7, M4(-4.389e-02, -6.559e-02, -5.097e-02, 1.689e-01, 3.005e-02, -8.020e-02, -5.782e-02, -5.943e-02, -4.287e-02, -4.531e-02, 1.082e-01, 9.099e-02, 2.794e-02, -8.429e-02, 5.045e-02, 3.386e-02)); + r += mul(s1_8, M4(-5.677e-02, 1.692e-02, 1.682e-02, -4.944e-02, -3.779e-03, 7.763e-03, 6.527e-02, 4.990e-02, 6.281e-02, 4.041e-02, -3.078e-02, -1.150e-01, -2.607e-02, 1.357e-02, 2.250e-02, -1.061e-03)); + r += mul(s2_0, M4(1.168e-02, -3.367e-03, -1.838e-02, -4.618e-04, 7.513e-02, -1.033e-01, 2.657e-02, 4.725e-02, -3.215e-02, -1.714e-02, -2.661e-02, 7.999e-03, -4.803e-02, 4.129e-02, 2.604e-02, 7.083e-03)); + r += mul(s2_1, M4(-5.143e-02, -3.167e-02, -1.929e-02, 2.222e-02, 5.725e-02, -7.263e-02, -2.430e-02, 4.913e-02, 3.209e-02, -1.623e-02, -1.380e-02, -4.886e-03, 7.903e-02, -4.085e-02, 4.204e-02, 7.106e-02)); + r += mul(s2_2, M4(-1.937e-02, -3.364e-02, -1.153e-01, -3.498e-02, 1.881e-02, -5.985e-02, 1.939e-02, 1.030e-02, 9.003e-03, 4.089e-02, -1.083e-02, 3.718e-03, -1.791e-02, -4.284e-02, -4.109e-02, 2.672e-02)); + r += mul(s2_3, M4(5.432e-02, -5.027e-03, 2.724e-02, -6.687e-03, 5.104e-02, -1.343e-01, 9.001e-04, -9.696e-02, -2.136e-02, 1.197e-02, -6.296e-02, -2.861e-02, 2.310e-02, 7.527e-03, 2.415e-02, -4.223e-03)); + r += mul(s2_4, M4(-4.222e-03, -6.228e-02, -1.509e-01, -8.201e-02, 1.155e-01, -4.310e-01, -1.757e-01, 2.800e-01, -4.084e-02, 4.121e-02, -8.184e-02, -4.839e-02, -1.301e-02, 2.227e-02, -1.339e-01, 5.871e-02)); + r += mul(s2_5, M4(-9.458e-03, 7.936e-02, -1.990e-01, 1.793e-02, 2.483e-02, 4.884e-02, -5.488e-02, 4.765e-02, -5.672e-02, -6.385e-02, 4.981e-02, -2.746e-02, 7.430e-03, -3.283e-02, -6.200e-02, -5.240e-02)); + r += mul(s2_6, M4(1.438e-02, 9.243e-03, 3.567e-02, 4.069e-02, 2.272e-02, -7.911e-02, 8.448e-02, 5.721e-02, 7.491e-03, -1.728e-03, -9.171e-04, -3.387e-02, -1.349e-02, -5.936e-03, 4.996e-02, 1.358e-02)); + r += mul(s2_7, M4(-9.619e-03, -6.562e-02, 1.305e-01, -3.528e-02, -4.942e-02, -1.092e-01, 1.221e-01, -1.901e-01, 2.335e-02, -5.793e-03, 3.086e-02, 1.013e-02, -1.117e-02, -3.033e-02, 6.326e-03, -3.675e-02)); + r += mul(s2_8, M4(-2.431e-02, 9.791e-03, 2.136e-02, 6.850e-02, -1.999e-02, -4.306e-02, -1.675e-03, 5.616e-02, 2.023e-02, 2.193e-02, -1.861e-03, -1.003e-01, 4.180e-02, 1.627e-02, -4.788e-02, 3.224e-02)); + r += mul(s3_0, M4(3.267e-02, -3.499e-02, -7.962e-02, -7.279e-02, 1.523e-02, 1.956e-02, 8.232e-03, 2.147e-02, 2.011e-02, 5.484e-02, 3.180e-03, 3.681e-02, -3.856e-02, 1.450e-02, -2.829e-02, 1.920e-02)); + r += mul(s3_1, M4(-2.308e-01, -1.285e-01, -1.482e-01, 1.029e-02, -2.365e-02, -3.520e-02, -4.704e-02, 5.336e-02, 1.440e-01, -3.500e-03, -1.131e-02, 6.858e-02, -1.470e-02, 7.266e-03, -5.802e-02, -2.166e-02)); + r += mul(s3_2, M4(2.163e-02, 7.730e-02, 6.253e-02, 5.941e-03, 1.301e-02, -2.332e-02, -1.305e-02, -1.120e-02, -1.467e-03, 7.855e-03, -3.129e-03, 3.219e-02, -2.022e-02, -1.941e-01, -6.155e-02, 2.742e-02)); + r += mul(s3_3, M4(-2.398e-03, -1.927e-03, -2.212e-02, -6.206e-02, 1.487e-01, -7.284e-03, -3.888e-02, 1.234e-01, 1.429e-01, 1.726e-02, -2.675e-03, 3.603e-02, -9.363e-03, -2.200e-02, 4.138e-02, -2.461e-02)); + r += mul(s3_4, M4(5.053e-02, 5.732e-02, -1.047e-01, 3.853e-02, 1.817e-01, -5.273e-02, -1.095e-02, 6.719e-05, -5.379e-02, -2.017e-02, 6.698e-02, 1.299e-03, 8.860e-03, 6.885e-02, -2.918e-01, -2.079e-01)); + r += mul(s3_5, M4(-1.218e-02, -4.579e-02, -2.587e-01, -3.481e-02, -1.030e-01, -1.140e-01, -5.113e-02, -2.633e-02, -2.690e-02, 7.111e-02, 2.261e-02, 5.536e-02, 3.036e-03, -1.335e-01, 1.926e-01, -7.739e-03)); + r += mul(s3_6, M4(9.332e-04, -2.945e-03, -9.446e-03, -2.501e-03, -3.572e-02, -3.509e-02, -5.397e-02, 6.588e-02, -1.826e-02, 1.116e-02, -2.588e-02, 6.469e-02, -3.611e-02, -3.796e-02, -4.616e-02, 5.419e-02)); + r += mul(s3_7, M4(-3.571e-02, 5.027e-02, -3.355e-02, 1.392e-02, -4.209e-02, 1.325e-02, 9.041e-02, 6.816e-03, 5.562e-02, 5.222e-02, 7.295e-02, 3.209e-02, 9.354e-02, 6.756e-02, 2.764e-01, -6.637e-02)); + r += mul(s3_8, M4(-2.529e-02, -8.631e-03, 2.602e-02, 8.646e-03, -1.568e-02, 9.391e-02, -1.124e-01, -4.199e-02, 1.958e-02, 3.264e-02, 7.642e-02, 5.693e-02, 6.536e-02, -8.633e-02, -3.207e-01, -1.304e-01)); + r += mul(s4_0, M4(-4.815e-02, 6.615e-02, 3.727e-02, -3.287e-02, 3.298e-02, 7.714e-02, -4.852e-02, 8.404e-02, 6.533e-02, -1.181e-02, 3.470e-02, -5.589e-04, 2.704e-02, -9.294e-02, -5.252e-03, -4.516e-02)); + r += mul(s4_1, M4(9.419e-02, 2.509e-02, 2.955e-03, -2.840e-02, 5.822e-02, -8.378e-02, -7.562e-03, 4.876e-02, -6.550e-02, 1.759e-02, -7.945e-02, 8.628e-02, -1.377e-01, -9.751e-02, -2.122e-02, -1.384e-01)); + r += mul(s4_2, M4(-3.766e-02, 2.824e-02, 3.679e-02, -4.829e-02, 4.727e-02, -5.843e-02, -3.079e-03, -2.803e-03, -5.569e-03, -7.261e-02, 4.468e-02, 1.710e-02, 6.518e-02, 1.492e-03, 2.624e-02, 2.573e-02)); + r += mul(s4_3, M4(7.605e-02, -7.299e-02, 6.526e-03, 3.207e-02, -1.266e-02, -4.438e-03, -3.606e-03, 3.420e-02, 2.385e-02, 2.516e-02, 6.072e-02, -3.670e-02, -2.751e-02, -6.161e-02, 9.597e-02, 9.638e-02)); + r += mul(s4_4, M4(-2.112e-02, -2.241e-02, 7.786e-02, 5.784e-02, -1.561e-01, -4.273e-02, -2.194e-02, -1.705e-01, 6.815e-02, -6.799e-02, -2.013e-03, 1.239e-01, 2.514e-02, -1.079e-01, -7.378e-03, -1.233e-01)); + r += mul(s4_5, M4(-2.638e-02, -1.183e-01, -4.616e-02, -3.746e-03, -2.811e-02, 1.230e-01, -5.174e-02, 7.346e-02, -1.421e-02, -3.076e-02, -1.259e-02, 1.408e-02, -1.610e-02, 2.928e-02, 1.535e-01, 8.465e-02)); + r += mul(s4_6, M4(3.141e-04, 3.631e-02, -1.663e-02, 6.612e-02, -7.921e-03, -8.523e-03, -8.086e-02, 5.970e-02, -1.761e-02, 1.568e-02, -4.761e-02, 2.993e-02, 1.266e-02, -2.407e-02, 4.900e-02, 7.400e-02)); + r += mul(s4_7, M4(-8.669e-02, -9.038e-02, -1.487e-03, -1.967e-02, -1.130e-02, 2.207e-02, -5.322e-03, -8.261e-02, -3.107e-02, -6.808e-02, 4.068e-02, 4.049e-02, -5.777e-02, 1.814e-01, -1.391e-01, -3.705e-02)); + r += mul(s4_8, M4(8.472e-03, 2.173e-02, -4.385e-03, -1.425e-01, 2.747e-02, 1.203e-01, -2.519e-02, 7.543e-02, 1.353e-02, -1.914e-03, -6.678e-02, -4.278e-02, 3.939e-02, 1.849e-02, -1.356e-01, 2.123e-02)); + r += mul(s5_0, M4(2.253e-02, -3.000e-03, 2.766e-02, 4.011e-03, -1.012e-01, -1.245e-01, -1.756e-02, 1.333e-02, -5.544e-02, 8.260e-02, 6.904e-02, -6.567e-02, -2.223e-02, 1.762e-02, -5.783e-03, -1.178e-02)); + r += mul(s5_1, M4(4.984e-02, 5.925e-02, 2.222e-03, -1.903e-02, 6.858e-02, -1.444e-02, -8.342e-02, 2.042e-02, -2.418e-02, -8.804e-03, -3.907e-02, 8.371e-02, -2.057e-02, -3.821e-02, 1.112e-03, -5.150e-02)); + r += mul(s5_2, M4(-5.659e-02, 1.374e-02, 1.761e-02, -2.710e-02, 9.238e-02, 2.094e-02, -6.518e-02, -2.742e-02, 3.162e-02, 3.946e-02, 2.735e-02, -1.013e-02, 1.573e-02, 6.860e-02, 2.466e-02, 2.488e-02)); + r += mul(s5_3, M4(-5.858e-02, 3.525e-02, -2.676e-02, -7.051e-02, 1.653e-02, -1.366e-01, 6.492e-02, -1.073e-01, -4.261e-02, -1.184e-02, 4.031e-02, -7.042e-02, 2.538e-02, -6.503e-03, 1.881e-02, 6.144e-03)); + r += mul(s5_4, M4(-1.599e-01, 3.139e-01, 4.613e-02, 1.092e-01, -4.946e-02, -6.471e-02, -2.505e-01, -4.021e-01, 3.832e-02, -1.744e-01, -1.179e-01, 3.837e-02, 1.725e-02, -6.918e-03, 8.461e-02, -6.419e-03)); + r += mul(s5_5, M4(9.392e-04, 3.029e-02, -1.711e-02, -3.376e-02, -2.033e-02, -1.260e-01, 2.772e-02, 1.451e-01, 7.234e-03, 1.555e-02, 2.413e-02, -2.120e-02, -1.125e-02, -2.683e-02, -1.099e-02, -3.049e-02)); + r += mul(s5_6, M4(7.385e-03, 7.153e-02, -3.701e-03, -5.904e-03, -7.381e-03, -1.438e-02, -4.615e-02, 4.650e-04, -5.119e-02, -3.074e-02, -7.760e-02, 4.370e-03, -1.500e-02, -3.557e-02, 2.629e-02, 4.037e-02)); + r += mul(s5_7, M4(-2.458e-02, 1.187e-02, 8.390e-02, -1.328e-01, 5.794e-03, 3.009e-03, -9.953e-02, -5.775e-02, 2.016e-02, 1.212e-02, -1.308e-02, -3.056e-02, 1.866e-02, 3.148e-02, -5.295e-02, -7.660e-02)); + r += mul(s5_8, M4(2.084e-03, 1.588e-02, 2.125e-01, 3.881e-02, -1.416e-02, -3.428e-03, -8.714e-02, -1.141e-01, 1.929e-02, 1.721e-03, -6.971e-02, -2.685e-02, 2.040e-02, 2.086e-02, -6.267e-02, 1.943e-02)); + r += mul(s6_0, M4(-3.636e-02, 1.058e-02, 1.897e-02, -7.365e-03, -2.463e-01, 1.546e-01, -1.253e-02, -1.471e-01, -3.383e-02, -1.681e-01, -3.166e-02, 1.180e-02, -1.471e-02, -3.981e-02, 1.965e-02, 1.843e-02)); + r += mul(s6_1, M4(4.107e-02, 5.065e-02, 1.605e-02, -3.976e-03, 1.275e-02, 1.578e-01, 5.165e-02, -1.212e-01, 2.598e-02, -1.050e-02, 4.818e-02, -1.796e-02, -1.129e-01, 6.415e-02, -1.066e-01, 1.731e-02)); + r += mul(s6_2, M4(2.760e-03, -4.237e-03, -2.683e-02, 1.691e-02, 3.426e-02, 1.694e-01, 2.113e-03, 5.037e-02, -7.108e-04, 4.483e-03, -7.325e-03, -7.323e-03, -4.189e-02, -9.192e-03, 4.703e-02, -1.762e-02)); + r += mul(s6_3, M4(-1.324e-01, -1.428e-02, 1.538e-01, 8.059e-02, 7.247e-02, 2.456e-03, 1.478e-01, -1.011e-01, -4.779e-02, 1.501e-02, -4.858e-02, -5.523e-02, -1.955e-03, -1.013e-01, -6.627e-02, -1.644e-02)); + r += mul(s6_4, M4(7.496e-02, 1.511e-01, -1.250e-01, -6.264e-02, -9.391e-02, -2.261e-01, -2.047e-01, 7.962e-02, -2.133e-02, -8.040e-02, 4.176e-02, -3.172e-02, -8.418e-02, 2.017e-01, -1.799e-02, 3.392e-02)); + r += mul(s6_5, M4(2.756e-02, -7.527e-03, -1.715e-02, 3.766e-02, -3.255e-02, -1.122e-01, 2.799e-03, 1.650e-03, -1.328e-03, 4.273e-03, 7.832e-02, -1.947e-02, 9.840e-02, 2.162e-02, 6.598e-02, 1.782e-02)); + r += mul(s6_6, M4(-2.405e-02, -2.950e-02, -2.338e-02, -4.016e-02, -2.421e-02, -2.384e-02, -9.502e-02, 6.252e-02, -1.692e-02, -9.645e-03, 1.187e-02, 1.228e-02, -8.531e-03, -3.788e-02, 1.097e-01, 6.519e-02)); + r += mul(s6_7, M4(3.889e-02, 9.208e-03, -7.941e-02, 5.483e-02, -4.879e-02, 2.173e-02, 1.911e-02, -8.286e-03, 2.036e-02, 2.867e-02, -5.079e-02, -2.555e-02, -6.251e-02, 2.804e-02, -2.654e-01, -4.549e-02)); + r += mul(s6_8, M4(8.329e-04, -1.819e-02, -1.321e-02, 1.572e-02, -2.137e-02, -4.870e-03, -1.199e-02, 1.285e-01, 1.001e-02, 8.940e-03, -4.492e-02, -4.014e-02, 5.302e-04, 1.071e-02, -5.256e-02, 6.449e-02)); + r += mul(s7_0, M4(2.445e-03, -8.298e-02, 4.078e-02, 1.082e-01, -3.606e-03, 1.108e-02, 1.089e-02, 8.458e-03, -5.579e-02, 5.668e-03, -8.777e-03, 1.130e-02, 9.521e-02, -1.845e-02, 3.895e-02, -2.967e-02)); + r += mul(s7_1, M4(-4.886e-02, 5.319e-02, 2.510e-02, -7.867e-02, -2.855e-03, 3.997e-02, -5.932e-02, 3.093e-02, 9.879e-02, 1.408e-02, -2.786e-02, 5.785e-02, -9.988e-02, 3.938e-02, -6.418e-02, -6.088e-03)); + r += mul(s7_2, M4(1.294e-01, 1.028e-01, -4.343e-02, 2.712e-02, 1.849e-02, -5.441e-02, 4.991e-02, 1.062e-02, -1.364e-02, 4.261e-03, 2.003e-02, -3.499e-02, -3.174e-03, 3.305e-02, 5.740e-02, -3.909e-03)); + r += mul(s7_3, M4(-8.290e-02, 6.939e-02, -7.261e-04, -9.136e-03, -3.160e-03, 6.662e-02, -4.139e-02, 1.310e-04, -9.320e-03, 8.518e-02, 5.456e-03, 2.266e-02, -4.379e-02, 2.903e-02, -1.230e-02, -4.747e-02)); + r += mul(s7_4, M4(1.445e-01, -5.596e-02, -1.909e-01, 1.829e-01, -2.868e-02, 1.546e-02, 7.682e-04, -4.849e-02, 1.428e-01, 1.040e-01, 4.236e-02, 1.480e-02, 1.023e-01, 4.592e-02, -6.634e-02, -3.505e-03)); + r += mul(s7_5, M4(-6.373e-02, -8.968e-02, -1.350e-02, -6.032e-02, 8.111e-03, 6.144e-03, -4.249e-02, 3.479e-02, 1.916e-02, -2.201e-02, 4.903e-02, -3.262e-02, 2.203e-02, 1.923e-02, 2.391e-03, 6.177e-02)); + r += mul(s7_6, M4(1.166e-02, 2.687e-02, 2.417e-02, 2.158e-02, 3.096e-02, 1.273e-02, 3.190e-02, 2.190e-02, -2.712e-02, 7.696e-04, -2.388e-02, 3.130e-02, -1.967e-02, -1.655e-02, 7.839e-02, -2.687e-02)); + r += mul(s7_7, M4(-2.005e-02, -2.380e-02, 9.220e-02, -1.530e-02, -8.630e-03, -1.587e-02, 1.488e-02, -1.791e-03, 1.460e-02, -2.440e-02, 8.963e-02, 9.009e-02, -1.182e-02, 4.140e-02, -5.368e-02, 6.374e-02)); + r += mul(s7_8, M4(3.577e-02, 5.104e-02, 3.665e-02, -5.901e-02, -1.713e-02, -6.524e-02, 1.610e-05, 1.340e-02, 3.049e-02, 4.299e-02, -7.341e-02, -3.923e-02, 2.563e-02, -2.483e-02, -2.340e-02, 1.129e-02)); + r += V4(-5.671e-03, 3.110e-03, -6.021e-03, -1.366e-02); + return r; +} + +V4 f2(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(1.193e-01, -1.048e-02, -3.243e-02, 6.826e-02, -2.322e-02, 1.210e-03, -1.252e-02, 2.977e-02, -2.499e-02, -5.046e-02, 3.024e-02, -2.444e-02, -5.177e-02, 3.895e-02, -1.225e-02, 5.118e-03)); + r += mul(s0_1, M4(5.871e-02, 6.552e-02, 9.391e-02, -5.961e-02, 8.066e-02, -6.908e-03, -5.695e-02, -1.936e-02, 2.658e-02, -7.954e-04, -1.973e-01, 9.164e-02, 5.022e-02, 2.750e-02, 1.419e-01, -1.292e-01)); + r += mul(s0_2, M4(-4.930e-03, 2.126e-02, -1.352e-02, 3.179e-03, 3.715e-02, -4.556e-03, -1.389e-03, 8.522e-03, 3.613e-02, -9.409e-03, 1.362e-01, -6.348e-02, 1.835e-01, -3.183e-02, -1.226e-01, -2.973e-02)); + r += mul(s0_3, M4(1.495e-02, 1.022e-02, 4.584e-02, 5.812e-02, 8.536e-02, -1.778e-02, -9.100e-03, -1.304e-02, -7.851e-02, 5.556e-02, 9.545e-03, -7.593e-02, 4.848e-02, -1.739e-02, -2.347e-02, -4.931e-02)); + r += mul(s0_4, M4(3.443e-02, 5.691e-02, -2.898e-02, 6.016e-03, -7.971e-03, -2.753e-02, 9.017e-02, 8.716e-02, 3.454e-02, 4.737e-02, 1.046e-01, -4.884e-02, -8.845e-02, 6.886e-02, 8.998e-03, 3.288e-02)); + r += mul(s0_5, M4(5.182e-02, -2.280e-02, -6.605e-03, -4.182e-02, -1.409e-03, -6.527e-02, -5.406e-02, 3.059e-02, -4.931e-03, -3.169e-02, -6.431e-02, -2.430e-02, -1.669e-01, 9.000e-02, 7.812e-02, 1.873e-02)); + r += mul(s0_6, M4(-2.305e-03, -3.680e-02, 1.371e-02, -1.402e-02, -1.577e-01, 8.153e-03, -2.799e-04, 3.356e-02, -3.522e-03, 3.556e-02, 2.578e-02, -2.129e-03, 2.127e-02, 7.063e-02, 2.276e-02, -6.245e-02)); + r += mul(s0_7, M4(7.349e-02, -9.005e-02, -3.976e-02, -4.591e-02, 5.945e-02, -8.111e-02, 5.657e-02, -6.026e-02, 6.361e-02, -1.248e-02, 4.749e-03, -7.141e-02, -8.539e-02, -3.081e-02, -4.733e-02, 2.692e-02)); + r += mul(s0_8, M4(-5.297e-03, 2.553e-02, 1.188e-02, -3.252e-02, -9.584e-02, -4.811e-03, -5.877e-02, 1.540e-02, 5.976e-02, -6.359e-03, 1.851e-02, -7.055e-03, 1.543e-02, -6.709e-02, -5.741e-03, -1.938e-02)); + r += mul(s1_0, M4(1.027e-01, 2.668e-02, -2.635e-02, 1.201e-01, 1.320e-01, 6.001e-02, 1.124e-03, 3.838e-02, -2.793e-02, -1.959e-02, -1.672e-02, -2.363e-02, -7.897e-03, -1.262e-02, -7.426e-02, 4.808e-02)); + r += mul(s1_1, M4(8.846e-02, 1.041e-01, 1.462e-01, -7.651e-02, 8.646e-02, -6.220e-03, -1.981e-01, -1.132e-02, 7.620e-03, -5.404e-02, -1.321e-01, 1.981e-02, -1.342e-02, -4.427e-02, 4.065e-03, -8.502e-02)); + r += mul(s1_2, M4(1.697e-02, -5.188e-02, -5.134e-02, -4.116e-02, 2.190e-02, 4.750e-03, 7.617e-03, -1.969e-03, -2.589e-02, 3.952e-03, 5.049e-02, -2.411e-02, 6.015e-02, 1.877e-02, -1.146e-01, 2.766e-02)); + r += mul(s1_3, M4(2.173e-02, 3.303e-02, 5.705e-02, -2.306e-02, 2.437e-01, -4.184e-02, -4.673e-02, 1.375e-01, -1.449e-01, -7.996e-03, 8.527e-03, -3.652e-02, 1.508e-02, 6.097e-03, -2.012e-02, 5.567e-03)); + r += mul(s1_4, M4(-1.053e-01, 1.183e-01, 1.644e-01, 7.715e-02, -8.496e-02, -2.526e-01, -3.290e-01, 7.366e-02, -5.064e-02, 5.169e-02, -2.557e-01, 1.666e-01, -2.381e-03, 2.116e-01, 4.961e-02, 1.979e-03)); + r += mul(s1_5, M4(2.273e-02, 8.168e-02, 6.637e-02, -2.085e-02, -1.772e-02, -2.210e-03, 8.962e-03, 3.793e-02, 1.632e-01, 1.286e-03, -2.699e-04, -1.422e-01, -8.545e-02, -6.054e-02, -1.027e-01, -3.499e-02)); + r += mul(s1_6, M4(-2.285e-02, -1.042e-01, 9.875e-03, -2.335e-02, 1.999e-01, -6.262e-02, -6.712e-02, -1.885e-02, -1.402e-02, -6.218e-02, 2.995e-02, -1.346e-02, -1.627e-02, 5.953e-02, 2.362e-02, -7.447e-02)); + r += mul(s1_7, M4(-1.448e-02, -3.298e-01, 2.114e-02, -3.973e-02, 1.320e-02, 4.253e-02, 4.971e-02, 1.446e-02, 1.347e-01, 1.912e-02, 4.576e-02, -5.504e-02, -1.043e-02, -1.144e-01, 9.768e-03, 7.366e-03)); + r += mul(s1_8, M4(2.272e-02, -9.619e-03, -7.821e-02, 3.434e-02, 5.688e-02, -2.394e-02, 8.326e-03, 1.352e-02, -7.261e-02, 6.078e-03, -4.177e-04, 2.965e-02, -5.145e-02, 4.692e-02, -5.279e-02, 3.568e-02)); + r += mul(s2_0, M4(4.702e-02, 2.630e-03, 8.904e-03, -6.280e-03, -2.836e-02, -2.194e-02, -5.604e-02, 6.956e-03, 3.226e-02, -2.308e-02, 1.880e-02, 1.596e-02, -2.796e-04, 2.646e-02, 4.453e-03, -2.054e-02)); + r += mul(s2_1, M4(8.921e-02, 1.728e-02, -1.029e-01, 1.150e-02, -3.810e-02, 3.608e-02, -3.375e-02, -3.864e-02, 5.210e-02, 1.303e-05, -1.235e-02, 3.002e-03, 4.356e-03, -1.328e-02, 8.026e-03, -3.341e-02)); + r += mul(s2_2, M4(-3.228e-02, -3.432e-03, -2.823e-02, 5.476e-03, -1.503e-02, -2.776e-02, -2.735e-03, -3.880e-02, 2.066e-03, 6.393e-03, 4.266e-02, -2.297e-02, -5.792e-02, 5.058e-03, 5.737e-02, 1.521e-02)); + r += mul(s2_3, M4(-2.400e-02, -3.390e-02, 1.933e-02, 3.088e-03, 8.121e-02, 4.240e-02, -7.497e-02, -3.773e-02, -4.244e-02, -2.049e-02, 2.547e-02, -1.778e-04, -2.168e-02, -2.191e-02, -1.730e-02, 1.369e-02)); + r += mul(s2_4, M4(-6.762e-02, 1.373e-02, -2.620e-03, -5.704e-03, -1.055e-02, -9.187e-02, -3.544e-01, 2.344e-02, 1.125e-01, 7.307e-02, -3.805e-02, -1.709e-02, 7.488e-02, -7.591e-02, 2.404e-02, -2.459e-02)); + r += mul(s2_5, M4(3.818e-02, 2.380e-02, 3.533e-02, 3.720e-03, 2.004e-02, -9.902e-03, -3.566e-02, 1.956e-02, -4.887e-02, 2.246e-02, -7.669e-03, -2.876e-02, 5.484e-02, 1.748e-02, 1.909e-02, -5.162e-02)); + r += mul(s2_6, M4(5.008e-02, -2.726e-02, -4.822e-02, -1.584e-02, 8.802e-02, -2.961e-02, -5.532e-02, -2.233e-02, -1.975e-02, -1.024e-02, 4.558e-03, 1.366e-02, -8.069e-03, 2.464e-02, 9.495e-03, -2.194e-02)); + r += mul(s2_7, M4(-1.258e-01, 2.334e-02, -6.292e-02, 3.725e-02, 2.089e-02, 2.861e-01, -8.859e-02, 1.913e-02, 1.198e-01, -7.910e-02, 6.599e-02, -2.165e-02, -8.741e-02, 3.565e-02, 9.328e-03, -7.032e-03)); + r += mul(s2_8, M4(3.636e-02, -4.528e-03, -1.155e-02, -1.413e-02, -4.810e-02, -2.686e-02, -6.808e-02, 1.915e-02, 1.687e-02, -1.481e-03, -2.301e-02, -1.282e-02, -3.844e-02, -1.030e-02, -4.729e-02, 3.916e-02)); + r += mul(s3_0, M4(1.657e-02, -3.355e-03, 2.242e-03, -2.040e-02, 1.946e-02, 2.196e-02, -3.503e-02, 1.040e-01, 4.469e-02, 4.250e-02, -4.958e-02, 8.767e-02, -3.961e-02, 2.544e-02, -5.104e-02, -6.615e-02)); + r += mul(s3_1, M4(2.691e-02, -9.850e-02, 7.498e-02, -1.756e-01, 1.345e-02, 3.622e-02, 8.593e-02, -1.123e-02, 1.538e-02, -5.349e-03, -7.513e-02, -8.709e-03, -3.121e-02, 3.571e-02, 3.203e-02, 3.256e-02)); + r += mul(s3_2, M4(4.858e-02, -4.627e-02, 6.215e-02, -4.991e-02, 1.327e-02, 1.824e-02, 3.843e-03, -1.558e-02, -9.773e-02, -3.629e-02, -7.307e-02, 1.832e-02, 1.002e-01, -2.333e-02, 1.016e-01, -1.728e-02)); + r += mul(s3_3, M4(-4.198e-02, -2.814e-02, 3.682e-02, -2.208e-02, -7.201e-02, -7.191e-02, -1.578e-02, -5.985e-02, 3.886e-03, -3.420e-02, -9.592e-02, -4.945e-02, 5.593e-02, 1.735e-02, -6.147e-02, 3.669e-02)); + r += mul(s3_4, M4(6.282e-03, 1.437e-02, -1.631e-02, 9.143e-03, -5.601e-02, 1.139e-02, -1.762e-01, 1.844e-02, 7.251e-02, -1.309e-02, -9.165e-03, -3.403e-02, 3.223e-01, 8.518e-02, 2.687e-01, 7.502e-02)); + r += mul(s3_5, M4(-5.705e-02, 3.598e-02, 1.709e-01, -1.577e-02, 3.992e-02, -3.111e-02, -2.667e-02, -4.231e-02, -5.149e-02, 1.962e-02, -9.283e-02, 4.647e-02, -1.110e-01, -3.535e-02, -6.284e-02, 6.710e-02)); + r += mul(s3_6, M4(5.424e-02, -3.279e-02, 2.262e-02, -1.659e-02, 3.338e-02, 9.182e-03, 2.441e-02, -5.288e-02, -6.987e-02, 7.276e-03, -2.352e-02, 4.192e-02, 9.676e-02, 5.903e-02, 5.415e-02, 2.282e-03)); + r += mul(s3_7, M4(6.329e-03, 2.330e-02, 6.207e-03, -1.762e-03, 7.843e-03, -6.581e-03, -1.549e-02, -5.284e-02, -5.859e-02, 3.369e-03, -8.589e-02, 6.869e-02, 1.320e-01, -4.220e-02, -4.965e-02, -1.204e-01)); + r += mul(s3_8, M4(3.998e-02, 1.873e-02, -5.480e-03, -2.049e-02, 2.348e-02, 9.441e-03, -8.933e-02, 4.237e-02, -1.849e-02, -3.625e-02, -3.664e-02, -1.576e-02, -1.291e-01, 4.700e-02, 4.163e-02, -2.971e-02)); + r += mul(s4_0, M4(1.778e-02, 4.602e-02, -4.267e-02, 6.398e-02, -5.671e-02, -2.924e-03, -4.187e-02, 1.654e-03, -1.492e-01, -3.897e-02, 7.856e-04, -1.644e-02, -3.210e-02, -7.924e-02, -7.994e-02, -4.341e-03)); + r += mul(s4_1, M4(4.051e-03, -3.196e-03, -6.325e-02, 6.896e-02, -3.616e-02, 1.553e-02, 6.633e-02, -3.962e-02, 8.586e-02, -4.538e-02, 4.091e-02, -2.947e-02, 3.580e-03, -5.921e-02, 7.983e-02, -2.921e-02)); + r += mul(s4_2, M4(-5.366e-02, -1.155e-02, 1.324e-02, 5.973e-02, -1.614e-01, -1.876e-02, -1.515e-02, -6.311e-03, 3.802e-02, -1.583e-02, -5.839e-02, -2.794e-02, 1.295e-01, -2.356e-02, -1.839e-01, -7.227e-02)); + r += mul(s4_3, M4(-7.246e-02, -3.522e-02, 4.562e-02, -1.176e-01, 2.272e-02, 3.581e-02, -2.271e-02, 4.263e-03, 1.996e-02, 1.176e-02, 4.654e-02, -1.948e-02, -1.231e-01, 3.247e-02, 6.979e-02, -4.604e-02)); + r += mul(s4_4, M4(5.858e-02, 1.111e-02, 8.530e-02, -1.032e-01, 5.611e-02, -1.437e-02, -2.400e-03, -2.226e-01, 1.002e-01, -7.950e-02, 1.473e-01, -9.665e-03, -8.286e-02, 1.785e-01, 9.023e-03, 1.517e-01)); + r += mul(s4_5, M4(5.408e-02, -1.242e-02, -1.583e-02, -9.518e-02, 7.813e-02, 5.192e-02, -7.247e-03, 4.595e-02, -7.544e-02, -1.103e-02, -6.453e-02, 8.274e-02, -1.114e-01, 9.855e-03, 1.171e-01, 6.824e-02)); + r += mul(s4_6, M4(-2.487e-02, -8.571e-02, -2.031e-02, 7.946e-02, 7.761e-02, -5.634e-02, -1.243e-02, -8.920e-03, 7.505e-03, -5.841e-03, 4.098e-02, -7.230e-02, 4.304e-02, -8.549e-02, -4.022e-02, 7.888e-03)); + r += mul(s4_7, M4(5.391e-02, -2.885e-02, 2.040e-03, 7.783e-02, 1.013e-02, 1.372e-02, 5.941e-03, 1.007e-02, 7.528e-03, 8.803e-03, 7.997e-02, 1.211e-02, -1.978e-02, -4.108e-03, -6.149e-02, 7.661e-02)); + r += mul(s4_8, M4(-2.713e-02, 2.661e-02, 6.520e-02, 3.927e-02, 6.751e-02, -3.023e-02, -3.414e-02, -3.336e-02, -7.493e-03, 2.083e-02, 1.082e-03, 1.085e-02, -1.243e-02, 1.775e-02, -1.800e-02, -2.309e-02)); + r += mul(s5_0, M4(2.636e-03, 1.020e-02, -8.215e-03, -1.118e-02, -6.102e-02, 9.464e-03, 4.914e-02, -8.655e-03, -2.183e-01, 7.846e-02, 1.189e-01, 7.140e-02, -1.094e-01, -1.413e-02, 1.744e-02, 2.393e-02)); + r += mul(s5_1, M4(-1.423e-01, -4.273e-02, -8.643e-02, 1.187e-01, 5.468e-02, 3.297e-02, -7.118e-02, -7.003e-02, -5.719e-02, -1.376e-02, -1.145e-01, 7.838e-02, 1.588e-02, 5.242e-03, 1.901e-02, 9.863e-03)); + r += mul(s5_2, M4(-2.814e-02, 1.728e-03, 7.216e-03, -5.635e-03, -2.159e-02, 1.430e-03, -3.330e-02, -4.216e-02, -9.500e-02, 1.609e-02, 5.971e-02, 2.658e-02, 8.857e-02, 1.595e-02, -1.716e-02, -4.230e-03)); + r += mul(s5_3, M4(1.062e-01, 5.689e-02, -1.330e-02, 2.666e-02, 7.092e-03, 1.980e-02, 2.738e-02, -2.801e-02, 1.831e-01, 4.358e-02, 5.407e-02, -1.202e-01, -1.107e-01, 3.718e-02, 7.248e-03, 2.525e-02)); + r += mul(s5_4, M4(-1.238e-02, 1.395e-01, -1.252e-03, -2.829e-01, -9.818e-02, -3.294e-02, -4.447e-02, 6.977e-02, 2.017e-01, 2.108e-03, 3.438e-01, -3.522e-02, -9.348e-02, -7.006e-02, -1.200e-01, 1.091e-01)); + r += mul(s5_5, M4(8.951e-02, -2.079e-03, 1.120e-02, 9.600e-03, -7.474e-02, -1.677e-02, -3.101e-02, 7.161e-03, 4.322e-02, -1.732e-02, -1.563e-02, -1.477e-02, -4.726e-02, 2.835e-02, 1.115e-01, 5.753e-03)); + r += mul(s5_6, M4(-3.872e-02, -6.123e-02, -3.729e-02, -4.733e-02, 9.770e-02, -2.838e-02, 2.167e-02, -1.190e-02, 5.474e-02, 1.812e-02, 1.595e-02, 1.379e-03, 7.593e-02, -2.542e-02, 9.389e-03, -5.855e-03)); + r += mul(s5_7, M4(-2.313e-01, 1.062e-01, -3.426e-02, 1.271e-01, 3.036e-01, -9.294e-02, 2.472e-02, -5.963e-02, 6.419e-02, -3.441e-02, 3.463e-02, -4.723e-03, -4.168e-02, 2.209e-02, -1.402e-03, 4.069e-02)); + r += mul(s5_8, M4(2.594e-02, -4.756e-03, 1.606e-04, -4.234e-02, 4.783e-02, 1.375e-02, 4.254e-03, 5.236e-02, -3.643e-02, -2.451e-02, 3.766e-02, -2.563e-02, 7.765e-03, -2.148e-02, 2.163e-02, 2.688e-03)); + r += mul(s6_0, M4(-5.101e-02, 3.157e-02, -3.214e-02, -4.207e-02, 1.297e-01, 1.005e-01, 6.350e-02, 4.027e-02, 5.571e-03, -3.522e-02, 2.588e-02, -2.043e-02, -1.711e-01, -2.976e-02, -5.791e-02, 2.916e-02)); + r += mul(s6_1, M4(-2.868e-02, 1.625e-01, 2.508e-02, 8.476e-02, -2.056e-01, 3.901e-02, -1.984e-01, 7.514e-02, -1.486e-01, 2.581e-03, -1.576e-02, 1.384e-01, -1.174e-01, 4.931e-03, 5.469e-03, 7.396e-02)); + r += mul(s6_2, M4(-6.032e-02, 1.680e-02, 7.920e-02, 5.261e-02, -4.495e-02, -5.333e-03, 1.461e-01, 3.072e-02, 5.915e-02, 2.529e-02, 2.345e-02, 3.672e-02, 4.769e-02, 2.155e-02, 4.651e-02, -4.791e-02)); + r += mul(s6_3, M4(8.897e-02, 1.405e-01, -4.785e-02, 9.822e-02, 2.122e-01, -2.388e-03, -7.205e-02, 1.454e-02, 2.498e-01, 5.825e-02, -1.677e-02, 1.144e-01, 2.749e-02, -3.975e-02, 2.507e-03, -4.595e-02)); + r += mul(s6_4, M4(-3.615e-02, 1.473e-01, -1.444e-02, 3.093e-02, 1.880e-01, -1.874e-01, 3.967e-01, -3.327e-01, 6.655e-03, -5.960e-02, 1.457e-02, -8.659e-02, 3.706e-02, 1.732e-01, 5.386e-02, -2.847e-03)); + r += mul(s6_5, M4(-6.235e-02, -1.365e-03, 3.703e-02, 1.494e-02, 8.596e-03, -3.396e-02, -5.405e-02, -2.135e-01, 3.474e-02, 6.117e-02, -1.904e-03, -2.267e-02, 1.194e-01, 1.011e-02, 1.022e-01, -2.839e-02)); + r += mul(s6_6, M4(-2.210e-02, 3.452e-02, 2.616e-02, 5.119e-02, 4.545e-02, 2.557e-02, 1.251e-02, -2.704e-02, 9.683e-02, 1.015e-02, -3.893e-02, -2.042e-02, 7.684e-02, 1.147e-03, -2.620e-02, 2.036e-02)); + r += mul(s6_7, M4(-1.416e-02, -9.191e-02, 7.322e-02, -6.055e-02, -6.098e-02, 1.048e-01, -8.375e-02, 1.151e-02, 8.122e-02, -2.470e-02, 3.802e-02, 8.203e-03, -1.134e-01, 3.271e-02, 1.489e-01, 1.718e-03)); + r += mul(s6_8, M4(4.236e-02, -1.279e-02, -1.218e-02, -1.721e-03, -5.267e-02, 6.120e-02, -6.863e-03, -2.339e-02, 6.142e-03, 1.334e-02, 3.840e-02, -3.469e-03, 2.074e-02, -9.623e-02, 1.174e-01, -7.104e-03)); + r += mul(s7_0, M4(2.177e-02, -2.506e-02, -2.084e-03, -5.860e-02, 7.460e-02, 5.126e-02, 6.503e-03, -1.016e-02, -1.348e-01, 2.695e-02, 8.662e-02, -3.217e-02, -9.947e-02, 1.355e-02, -3.887e-02, 3.671e-02)); + r += mul(s7_1, M4(1.094e-01, 4.306e-02, 1.773e-01, 3.608e-03, -5.451e-02, 6.465e-02, 9.147e-02, 2.774e-03, 2.776e-03, 4.393e-02, -2.924e-02, 1.923e-02, -4.374e-02, -3.220e-02, -6.576e-02, -3.276e-02)); + r += mul(s7_2, M4(-4.620e-02, 2.048e-02, 3.234e-03, 5.520e-02, -8.348e-02, -3.598e-02, -8.111e-02, -5.441e-02, -6.498e-03, -2.542e-02, -3.379e-02, 2.636e-02, -8.450e-03, 2.900e-02, -4.491e-02, -1.654e-02)); + r += mul(s7_3, M4(8.686e-02, 1.716e-01, 4.222e-03, 9.780e-03, -4.509e-02, 3.392e-02, 1.422e-02, -6.869e-02, -1.595e-01, 1.251e-02, 2.913e-02, 1.104e-01, -1.547e-01, 1.027e-02, -3.729e-02, -4.566e-02)); + r += mul(s7_4, M4(1.953e-01, 2.315e-01, 1.299e-01, -1.347e-01, -4.060e-02, -7.278e-03, 3.684e-02, -6.666e-02, -1.027e-01, -5.207e-02, -2.175e-01, 1.131e-01, -6.486e-02, 8.321e-02, -2.594e-01, 1.169e-01)); + r += mul(s7_5, M4(-3.169e-02, 3.697e-03, -6.472e-02, 2.523e-02, 9.826e-03, 1.689e-02, 6.241e-02, -5.949e-04, 2.145e-02, 5.707e-02, 8.911e-02, -1.135e-02, 4.783e-02, 1.337e-02, 3.065e-02, 5.884e-02)); + r += mul(s7_6, M4(-3.587e-03, -5.693e-02, -1.929e-02, 3.601e-02, -1.485e-02, -3.759e-03, -8.937e-03, -9.948e-03, -6.001e-02, -4.211e-02, 1.906e-02, -3.279e-02, 2.514e-02, -2.525e-02, -3.893e-02, 1.116e-02)); + r += mul(s7_7, M4(8.653e-02, 7.210e-02, 1.310e-02, -4.096e-02, -4.513e-04, -1.231e-02, 3.749e-02, -3.147e-02, 6.759e-02, -3.613e-02, 7.838e-02, -5.501e-02, 9.405e-04, -3.234e-02, 1.654e-02, -6.506e-03)); + r += mul(s7_8, M4(-6.108e-02, 1.114e-02, -2.635e-03, 1.568e-02, 3.447e-02, -1.793e-02, -1.050e-02, -3.319e-02, -2.087e-02, -1.826e-02, 1.520e-02, -2.765e-02, -2.238e-02, -3.305e-02, 7.283e-03, -1.178e-02)); + r += V4(-3.774e-03, 1.083e-02, -6.759e-03, -9.530e-03); + return r; +} + +V4 f3(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-3.119e-02, 1.358e-02, 1.799e-02, -4.454e-02, 2.054e-02, -5.854e-03, 1.624e-02, 6.525e-02, 5.159e-03, -3.186e-03, 3.916e-02, 1.704e-02, 5.611e-02, -1.617e-02, -1.256e-02, 7.283e-02)); + r += mul(s0_1, M4(1.160e-01, 3.042e-02, -1.713e-03, 9.930e-03, 9.846e-03, 1.950e-02, -2.891e-02, -6.443e-02, -9.151e-02, -7.299e-02, -6.384e-02, 4.439e-02, 2.638e-02, 6.729e-02, 4.567e-02, -7.430e-02)); + r += mul(s0_2, M4(-1.383e-02, 5.194e-02, -2.212e-02, -3.194e-02, 8.244e-03, -7.213e-03, 2.814e-02, 1.385e-02, 3.453e-02, 1.509e-03, 1.318e-02, -1.627e-02, -1.133e-02, 4.094e-02, 2.866e-02, -3.095e-02)); + r += mul(s0_3, M4(6.626e-03, 1.096e-01, 8.185e-02, -7.438e-02, 2.120e-02, 4.990e-02, -2.814e-02, 4.095e-02, 6.020e-02, -5.083e-02, -3.477e-02, 4.169e-02, 3.500e-03, -1.066e-01, 2.729e-02, -2.682e-02)); + r += mul(s0_4, M4(5.029e-02, 5.265e-02, 1.227e-01, -5.728e-02, -8.232e-02, 4.752e-02, 1.365e-02, -7.925e-02, -1.746e-01, -7.669e-02, 2.813e-02, -2.357e-01, 5.048e-02, 8.521e-02, -3.115e-02, 1.222e-01)); + r += mul(s0_5, M4(5.230e-03, 8.784e-03, -8.968e-02, -3.714e-03, 1.858e-02, 1.223e-02, -3.019e-02, 1.194e-01, -1.540e-03, 5.142e-03, -3.950e-02, 2.637e-02, -1.422e-02, 2.503e-02, 5.833e-02, -7.592e-02)); + r += mul(s0_6, M4(2.645e-02, 4.579e-02, 5.154e-02, -6.487e-02, 2.590e-02, -4.852e-02, -2.230e-02, 2.822e-02, -8.089e-03, 4.508e-02, -1.007e-03, 1.641e-02, -8.618e-03, -6.170e-02, 5.916e-03, 1.807e-02)); + r += mul(s0_7, M4(-1.205e-02, 1.208e-02, 1.299e-02, 1.292e-02, 2.139e-02, -4.657e-03, 5.206e-02, -6.348e-02, 5.026e-02, -1.533e-03, 1.388e-02, 3.909e-02, 3.115e-02, 2.324e-02, 1.077e-02, -4.992e-02)); + r += mul(s0_8, M4(-3.625e-02, -2.060e-02, -3.559e-02, -2.658e-02, -7.602e-02, -1.888e-02, 1.993e-02, -6.798e-03, -4.016e-02, -1.825e-02, -2.749e-03, -2.123e-02, -4.565e-02, 7.279e-02, 5.850e-02, -1.219e-02)); + r += mul(s1_0, M4(-4.673e-02, 8.304e-03, 1.845e-02, 3.609e-02, 6.619e-02, -4.322e-02, 2.001e-02, 6.990e-02, 4.898e-02, -2.925e-02, 3.682e-02, 5.622e-02, 5.427e-02, -1.565e-02, 6.430e-02, 2.369e-02)); + r += mul(s1_1, M4(8.584e-02, 9.906e-03, 3.857e-02, -1.294e-01, 1.388e-02, -1.809e-02, -3.039e-02, 6.939e-02, -5.358e-02, -3.650e-03, 5.765e-02, -3.854e-02, -2.511e-03, -7.474e-02, 1.191e-02, 6.923e-03)); + r += mul(s1_2, M4(-7.259e-02, 5.779e-02, -7.958e-04, 1.217e-02, -3.072e-02, 1.986e-02, 1.220e-01, -1.087e-01, 4.577e-02, -2.321e-02, 1.628e-03, 1.921e-02, -4.586e-02, 1.968e-02, 1.483e-03, 1.715e-02)); + r += mul(s1_3, M4(-3.292e-03, 1.909e-01, -3.450e-02, 1.198e-01, 4.543e-02, -1.122e-01, 4.538e-02, 6.129e-02, -1.421e-03, 1.433e-03, -8.913e-02, 3.648e-02, -2.991e-02, -2.841e-03, -8.902e-02, -3.131e-03)); + r += mul(s1_4, M4(9.129e-02, 1.292e-03, 3.234e-02, -1.102e-01, -1.538e-01, 6.513e-02, -1.428e-01, 2.280e-01, -1.913e-01, -1.113e-01, -1.587e-01, -6.260e-02, -2.673e-02, 2.310e-01, 1.841e-01, 2.302e-02)); + r += mul(s1_5, M4(7.514e-02, -7.496e-02, -1.185e-01, 6.727e-02, 1.283e-02, -1.325e-02, 4.783e-02, 7.133e-02, -1.067e-01, -3.173e-02, 1.006e-01, -5.277e-02, -5.772e-02, 4.918e-02, 1.965e-02, 4.883e-03)); + r += mul(s1_6, M4(1.239e-01, -2.347e-02, 3.807e-04, 2.581e-03, 3.535e-02, -1.283e-01, -3.376e-02, 7.976e-02, 8.961e-02, -5.067e-02, 2.711e-02, -7.218e-03, 2.020e-02, -3.719e-02, -6.588e-03, 6.166e-03)); + r += mul(s1_7, M4(-6.321e-03, 3.338e-02, 3.880e-03, -5.857e-02, -3.765e-02, -1.477e-02, -7.070e-02, -3.418e-02, -1.490e-01, -1.317e-01, -1.427e-02, -8.478e-02, 3.837e-02, 5.323e-02, -3.820e-02, -7.255e-02)); + r += mul(s1_8, M4(-5.847e-02, 8.692e-03, -1.138e-01, -1.477e-02, 5.279e-03, 1.000e-02, 2.666e-02, -6.471e-02, -8.655e-02, -2.361e-02, 6.719e-02, -5.628e-03, -7.243e-02, -1.572e-02, -1.048e-02, 3.315e-02)); + r += mul(s2_0, M4(-2.288e-02, 4.273e-02, -5.397e-03, -1.220e-02, -1.201e-02, -2.187e-02, -3.532e-02, -4.551e-02, 9.285e-03, 3.374e-02, 1.875e-02, -8.249e-03, -2.919e-03, -3.004e-02, -1.433e-02, 2.247e-03)); + r += mul(s2_1, M4(4.909e-03, -3.626e-03, -8.456e-02, -1.639e-02, 2.864e-02, -6.078e-02, -1.204e-02, 3.552e-02, 5.636e-02, 5.088e-02, -6.840e-02, 5.427e-02, -4.091e-02, -5.403e-02, -1.069e-02, -6.340e-02)); + r += mul(s2_2, M4(-6.592e-02, -2.740e-03, -3.038e-02, 3.380e-02, 1.451e-02, 3.328e-02, 1.135e-02, 5.250e-02, 3.590e-02, 5.332e-02, 4.767e-02, -1.844e-02, -1.593e-02, -1.534e-02, 8.423e-03, 9.414e-03)); + r += mul(s2_3, M4(2.674e-02, -6.853e-02, 1.209e-02, 5.819e-03, 3.120e-02, -3.808e-02, 7.106e-02, 9.283e-02, 5.854e-02, -1.697e-02, 2.859e-03, -7.568e-03, -9.800e-03, -3.899e-02, -2.672e-03, 4.075e-02)); + r += mul(s2_4, M4(-4.709e-02, -2.890e-02, 2.291e-02, 2.118e-02, -1.154e-01, -1.106e-01, -5.390e-02, 4.718e-02, -3.647e-03, 2.600e-02, 7.251e-02, 5.167e-04, -4.533e-02, 1.011e-01, 3.346e-03, -1.104e-03)); + r += mul(s2_5, M4(2.589e-03, -1.781e-03, 6.664e-02, -1.719e-02, -3.848e-02, 7.312e-02, 9.325e-02, -1.775e-02, 6.812e-02, -1.021e-02, -7.496e-02, 7.818e-02, 8.188e-02, 1.107e-01, -1.334e-02, -6.705e-03)); + r += mul(s2_6, M4(3.958e-02, -1.072e-02, 1.728e-02, 1.769e-02, 3.835e-02, -1.062e-01, 1.055e-01, -2.397e-02, 6.102e-02, 7.622e-03, 6.822e-03, -1.394e-02, 6.069e-04, -2.514e-02, 4.367e-03, 1.006e-02)); + r += mul(s2_7, M4(-4.576e-02, -3.503e-02, -2.550e-02, 5.796e-02, -1.616e-01, -1.555e-01, -4.845e-02, 1.949e-01, 4.617e-03, 4.358e-02, 7.745e-02, -4.498e-02, 4.802e-02, 6.770e-02, -1.855e-02, 9.254e-03)); + r += mul(s2_8, M4(1.620e-02, -9.293e-03, -1.498e-02, -6.009e-02, -4.502e-02, -3.743e-02, -2.937e-04, 1.492e-02, -1.969e-02, -1.425e-02, -2.911e-02, 4.641e-03, -2.503e-02, 5.544e-02, 1.834e-04, -3.613e-02)); + r += mul(s3_0, M4(3.928e-02, 2.935e-02, -2.501e-03, 1.496e-02, 4.948e-03, -8.874e-03, -9.731e-03, -1.796e-02, 2.398e-02, -3.080e-02, 9.156e-03, -2.164e-03, -5.478e-02, -1.927e-02, -3.898e-02, -9.236e-03)); + r += mul(s3_1, M4(2.248e-01, 3.951e-02, 6.371e-02, 7.861e-02, 3.972e-02, 4.355e-02, 5.376e-02, -4.597e-02, 1.764e-03, -1.735e-02, 2.192e-03, -6.358e-02, 5.442e-02, 4.629e-02, 5.818e-02, 1.219e-01)); + r += mul(s3_2, M4(5.976e-02, -3.294e-02, -8.479e-02, -7.148e-02, -1.224e-02, 2.466e-02, -2.088e-02, 1.072e-02, 4.963e-02, 3.583e-02, 5.843e-02, 1.725e-02, -2.510e-02, -9.845e-02, 4.370e-02, -1.114e-01)); + r += mul(s3_3, M4(-4.351e-02, 2.608e-02, -5.137e-02, 1.292e-02, -6.503e-02, 1.173e-01, 4.085e-02, -1.101e-01, -9.750e-03, -6.098e-03, 2.314e-02, 1.507e-02, -3.360e-02, -9.189e-02, -2.685e-02, -2.520e-02)); + r += mul(s3_4, M4(1.052e-01, 3.103e-02, -2.944e-02, 1.189e-01, -6.053e-02, 3.701e-02, 6.101e-02, -1.819e-02, -6.428e-02, 1.806e-02, 8.849e-02, 4.567e-02, 2.044e-01, 3.910e-01, 2.417e-01, 2.521e-01)); + r += mul(s3_5, M4(-4.004e-02, 3.818e-02, 5.069e-02, -1.849e-02, 1.759e-02, 4.760e-02, 1.503e-02, -1.385e-02, 1.787e-02, -3.867e-03, -6.038e-03, 8.384e-02, 4.322e-01, 2.483e-02, -8.805e-02, 4.945e-02)); + r += mul(s3_6, M4(-6.358e-03, 2.774e-02, 1.409e-02, -1.912e-02, -2.601e-02, 9.155e-02, -9.666e-03, -5.030e-02, 1.351e-02, -6.274e-04, -2.323e-03, -1.666e-02, -7.202e-02, 1.367e-01, -1.121e-02, -2.320e-02)); + r += mul(s3_7, M4(-3.894e-02, -4.333e-02, -2.975e-02, 1.759e-02, -7.628e-02, 5.628e-02, -2.755e-02, -1.604e-02, 1.228e-02, 5.447e-03, 1.208e-02, -1.111e-02, 1.015e-01, -2.272e-02, -1.026e-02, 2.289e-01)); + r += mul(s3_8, M4(1.033e-02, -2.939e-02, 9.221e-03, -4.853e-03, -4.509e-02, 3.057e-02, 5.076e-04, 2.493e-02, 1.218e-02, 1.955e-03, 2.909e-02, 1.197e-02, -7.722e-02, 9.091e-03, -1.093e-01, 1.004e-02)); + r += mul(s4_0, M4(2.847e-02, 1.798e-02, 2.402e-02, -1.499e-02, -4.161e-02, 2.984e-02, -1.717e-02, -1.074e-01, 8.853e-02, -2.182e-02, 2.203e-02, -1.270e-02, 5.534e-04, 6.492e-02, -1.116e-01, -4.453e-02)); + r += mul(s4_1, M4(-3.555e-03, -4.297e-02, -3.233e-02, 5.099e-02, 1.639e-02, -4.216e-03, 2.458e-02, -3.030e-02, -7.720e-02, 1.163e-02, 5.789e-02, -1.570e-01, 1.173e-01, -5.750e-02, -1.676e-01, 5.915e-02)); + r += mul(s4_2, M4(3.692e-02, -1.966e-03, 2.417e-02, 7.655e-03, -1.724e-02, -2.010e-02, -9.557e-02, 5.027e-02, -2.674e-02, -4.045e-02, -3.849e-02, 1.158e-03, -1.059e-01, -1.222e-01, -1.585e-01, 3.536e-02)); + r += mul(s4_3, M4(-4.414e-02, 4.738e-02, 1.238e-02, -3.550e-02, -6.015e-02, 6.606e-02, 3.811e-02, 1.630e-02, 7.631e-02, -9.726e-02, 3.757e-04, 5.798e-02, -1.588e-01, 8.633e-02, -2.406e-01, -1.821e-01)); + r += mul(s4_4, M4(-1.407e-01, 3.247e-03, -1.042e-01, -1.164e-01, 1.234e-01, 2.662e-03, 3.201e-02, 1.218e-01, 1.021e-01, 3.044e-02, 1.459e-01, -9.150e-02, 3.452e-01, 2.593e-02, -4.509e-01, 1.172e-01)); + r += mul(s4_5, M4(-1.300e-02, 7.091e-03, -9.407e-03, -1.165e-01, 3.124e-02, 1.197e-02, -1.064e-02, -5.295e-02, -4.681e-02, 4.255e-02, -3.933e-02, 2.827e-02, 1.341e-01, -5.583e-02, -6.000e-02, 5.605e-02)); + r += mul(s4_6, M4(-4.452e-02, 2.418e-02, 1.215e-02, -3.909e-02, -3.841e-03, 2.902e-02, -1.198e-03, -2.443e-02, 4.346e-02, -6.597e-03, -3.284e-02, 5.183e-02, -1.531e-01, -5.310e-02, -6.984e-02, -1.613e-01)); + r += mul(s4_7, M4(-1.110e-01, 1.335e-01, -3.714e-02, 4.381e-02, -5.944e-02, -4.948e-02, -2.352e-04, -7.582e-02, 7.761e-02, 1.434e-02, 7.149e-03, -2.226e-02, -1.007e-01, -6.605e-02, -4.902e-02, 4.838e-02)); + r += mul(s4_8, M4(2.891e-02, -2.002e-02, 3.372e-02, -9.957e-03, 5.108e-02, -1.830e-02, 1.883e-02, -2.309e-04, 1.934e-02, -1.329e-02, -1.824e-02, 3.953e-02, -1.713e-03, -3.680e-02, -2.755e-02, -2.758e-02)); + r += mul(s5_0, M4(-1.945e-02, 4.566e-02, 2.691e-02, -1.237e-02, -9.059e-02, -5.569e-02, -1.480e-01, -7.409e-02, 1.380e-01, -4.678e-02, 9.957e-02, 3.396e-02, 1.657e-02, 4.533e-02, -4.204e-03, 4.965e-03)); + r += mul(s5_1, M4(-1.747e-02, -2.485e-02, -3.850e-02, 5.838e-02, -6.083e-02, -1.110e-02, -3.806e-02, 9.352e-02, -7.105e-02, 3.170e-02, -3.524e-02, -1.404e-01, 5.260e-02, 4.554e-02, 4.306e-02, -2.121e-02)); + r += mul(s5_2, M4(2.305e-02, -5.438e-03, -3.145e-03, -5.896e-02, -1.098e-01, 5.827e-03, -3.090e-02, -4.094e-02, 2.971e-02, -3.924e-03, 1.197e-02, -8.427e-03, -4.808e-02, -3.403e-02, -3.744e-03, -5.660e-02)); + r += mul(s5_3, M4(7.114e-02, -1.410e-01, 4.887e-02, 9.254e-02, -1.004e-03, -8.354e-03, 1.798e-01, 3.584e-02, 2.084e-01, 3.576e-02, -3.979e-03, 1.487e-01, -2.453e-02, 8.486e-02, -4.554e-02, -2.278e-02)); + r += mul(s5_4, M4(3.145e-02, 2.088e-01, 2.877e-01, -2.699e-02, -2.542e-02, -3.369e-01, -3.053e-01, 1.283e-01, 5.013e-02, -7.967e-04, 3.206e-01, -3.933e-01, 2.370e-02, -5.881e-02, -1.360e-01, 7.423e-02)); + r += mul(s5_5, M4(5.378e-02, 8.026e-03, 1.786e-01, -1.762e-01, -1.796e-02, 5.854e-02, -6.146e-02, 7.364e-02, 3.034e-02, 2.706e-03, 5.823e-02, -5.505e-02, 3.285e-02, -1.949e-02, -2.971e-02, 1.573e-02)); + r += mul(s5_6, M4(3.967e-02, -8.323e-02, -1.240e-02, 4.045e-03, -4.268e-02, -2.509e-02, 1.613e-02, 1.509e-02, 2.492e-02, -1.008e-02, -1.946e-02, 6.058e-03, -3.131e-02, -8.883e-03, -4.384e-03, -3.910e-02)); + r += mul(s5_7, M4(-5.820e-02, 1.896e-01, -3.927e-02, 1.346e-02, -5.433e-02, -1.373e-01, 6.063e-02, -8.771e-02, 9.632e-02, 4.942e-02, 3.403e-02, 4.189e-03, -1.560e-02, 4.081e-02, 1.924e-02, 3.389e-02)); + r += mul(s5_8, M4(8.582e-02, 1.073e-03, 6.109e-02, -3.919e-02, -1.008e-01, 4.365e-03, -7.030e-02, 7.613e-03, 7.648e-03, 5.992e-03, 2.352e-02, -3.063e-05, 9.644e-04, -8.910e-03, 7.871e-03, -2.945e-02)); + r += mul(s6_0, M4(-6.219e-02, 9.462e-03, -5.277e-02, -4.953e-02, 1.254e-03, 6.616e-02, -4.846e-02, 6.083e-02, 5.975e-03, -2.187e-02, -1.862e-01, -2.549e-02, 2.145e-02, 1.917e-02, -2.752e-02, 1.375e-02)); + r += mul(s6_1, M4(-1.423e-03, 3.281e-02, 3.788e-02, 1.870e-02, 1.062e-01, 5.928e-02, -2.608e-01, 4.040e-01, 6.632e-02, 2.468e-02, -4.309e-02, -3.497e-03, -2.710e-03, 7.529e-02, 7.273e-02, 3.638e-02)); + r += mul(s6_2, M4(4.697e-02, 8.655e-03, -1.530e-02, 8.707e-03, -5.490e-02, 3.734e-03, 4.887e-02, -2.584e-01, -2.511e-02, -2.146e-02, -7.291e-02, -8.669e-03, -5.014e-02, -4.938e-02, -3.849e-02, 9.120e-03)); + r += mul(s6_3, M4(-9.087e-02, 2.014e-02, -5.573e-02, -6.906e-02, 1.306e-01, 1.068e-02, -2.333e-02, 3.826e-02, 4.739e-02, -5.959e-02, 1.413e-01, -1.084e-02, 1.212e-02, 2.388e-02, 1.633e-03, -7.772e-02)); + r += mul(s6_4, M4(-5.059e-02, -5.444e-02, -1.575e-01, 6.070e-02, -1.403e-01, -8.611e-02, 3.665e-01, -5.033e-01, -7.558e-02, 1.507e-01, 2.363e-01, -2.066e-01, -2.612e-02, 9.084e-02, 1.593e-01, -4.946e-02)); + r += mul(s6_5, M4(6.337e-02, -5.715e-02, -1.101e-02, 3.131e-02, 2.204e-01, -1.842e-02, -4.902e-02, -4.250e-02, 1.490e-02, -4.777e-02, -6.084e-02, 2.862e-02, -4.229e-03, -2.731e-02, -1.090e-01, -9.158e-02)); + r += mul(s6_6, M4(-4.239e-02, 6.636e-02, -5.269e-03, -5.080e-02, -2.288e-02, 1.264e-01, 1.378e-02, -1.793e-02, -3.185e-02, -2.347e-02, -4.334e-02, 7.789e-03, -2.840e-02, -7.845e-02, -4.260e-02, -3.045e-02)); + r += mul(s6_7, M4(-1.550e-02, 2.201e-02, 2.482e-02, -4.016e-03, 6.373e-02, -9.692e-02, 1.513e-02, 2.924e-02, 5.650e-02, 3.793e-02, 2.864e-02, -9.912e-03, -1.011e-02, 1.524e-01, -2.573e-02, -1.628e-02)); + r += mul(s6_8, M4(8.834e-03, -3.029e-02, -4.205e-02, -1.419e-02, 3.865e-02, -2.833e-02, -2.787e-02, 4.741e-04, 1.460e-02, -2.973e-03, -6.640e-04, 4.523e-03, -4.376e-03, 3.053e-02, -1.818e-02, -1.190e-01)); + r += mul(s7_0, M4(-8.747e-02, 6.773e-02, -8.260e-02, -1.418e-01, 2.004e-03, -3.556e-02, 1.986e-02, -3.789e-02, -1.301e-02, -7.598e-02, -8.963e-02, -2.681e-02, 4.820e-02, 2.518e-02, 3.622e-02, 1.282e-02)); + r += mul(s7_1, M4(5.156e-02, -1.921e-01, -1.351e-01, 1.500e-01, 2.851e-02, -2.615e-02, -5.104e-02, -1.337e-02, -4.990e-02, 6.353e-02, 1.466e-02, -8.082e-03, -2.539e-02, 5.501e-02, 6.142e-02, -8.426e-03)); + r += mul(s7_2, M4(2.623e-02, -2.479e-02, 1.455e-02, -4.765e-02, 3.307e-02, -7.951e-03, -1.461e-02, 2.652e-02, -3.376e-02, 7.495e-05, -8.081e-02, -3.611e-02, -2.016e-02, -3.285e-02, -3.195e-02, -1.305e-02)); + r += mul(s7_3, M4(6.073e-02, -6.791e-02, 3.322e-02, 6.663e-02, 1.369e-02, 3.348e-02, 5.260e-02, -1.204e-02, -3.278e-02, -1.580e-02, -1.213e-02, -4.230e-02, 1.845e-02, -7.809e-03, 2.595e-02, 4.624e-02)); + r += mul(s7_4, M4(-1.441e-01, -2.309e-02, 1.171e-01, -2.103e-01, 5.903e-02, -5.578e-02, 5.480e-03, 2.120e-02, 1.271e-02, 3.046e-02, 9.099e-02, 7.909e-03, -1.087e-01, -1.353e-02, 1.480e-01, -9.692e-02)); + r += mul(s7_5, M4(-2.112e-02, 1.730e-02, -1.068e-01, 2.903e-02, 6.340e-03, 1.157e-02, 5.409e-02, -6.964e-02, 1.177e-01, -6.366e-02, -3.753e-02, 5.627e-02, 4.602e-03, -5.148e-03, -2.803e-02, -3.905e-02)); + r += mul(s7_6, M4(4.832e-02, 7.096e-02, 2.105e-02, 2.247e-02, 2.229e-02, -3.705e-02, -5.896e-03, -1.092e-02, -3.567e-02, -2.236e-02, -1.916e-02, -3.311e-02, 9.405e-03, -3.580e-02, -2.565e-02, 2.150e-02)); + r += mul(s7_7, M4(-4.603e-02, 1.223e-02, -4.120e-02, 3.812e-02, 5.082e-02, -5.348e-02, 3.159e-02, 2.287e-02, 2.515e-02, 9.725e-02, 6.245e-02, -2.659e-02, -3.666e-02, 1.681e-02, 1.776e-02, -3.267e-02)); + r += mul(s7_8, M4(4.920e-02, -2.549e-02, -4.974e-03, 4.321e-03, 2.267e-02, 2.283e-02, -5.713e-03, -3.793e-02, -1.503e-02, -2.335e-02, -1.049e-02, 3.006e-02, 1.663e-02, 2.374e-03, -1.261e-02, -8.854e-03)); + r += V4(1.240e-02, 8.097e-03, 8.971e-03, 1.472e-02); + return r; +} + +void Pass16(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = Rmp8x8(tid.x) + blockStart; + uint2 size = GetInputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = (gxy + 0.5) * pt; + + V4 s0_0 = l0(-1.0, -1.0); + V4 s0_1 = l0(0.0, -1.0); + V4 s0_2 = l0(1.0, -1.0); + V4 s0_3 = l0(-1.0, 0.0); + V4 s0_4 = l0(0.0, 0.0); + V4 s0_5 = l0(1.0, 0.0); + V4 s0_6 = l0(-1.0, 1.0); + V4 s0_7 = l0(0.0, 1.0); + V4 s0_8 = l0(1.0, 1.0); + V4 s1_0 = -max(-s0_0, 0.0); + V4 s1_1 = -max(-s0_1, 0.0); + V4 s1_2 = -max(-s0_2, 0.0); + V4 s1_3 = -max(-s0_3, 0.0); + V4 s1_4 = -max(-s0_4, 0.0); + V4 s1_5 = -max(-s0_5, 0.0); + V4 s1_6 = -max(-s0_6, 0.0); + V4 s1_7 = -max(-s0_7, 0.0); + V4 s1_8 = -max(-s0_8, 0.0); + s0_0 = max(s0_0, 0.0); + s0_1 = max(s0_1, 0.0); + s0_2 = max(s0_2, 0.0); + s0_3 = max(s0_3, 0.0); + s0_4 = max(s0_4, 0.0); + s0_5 = max(s0_5, 0.0); + s0_6 = max(s0_6, 0.0); + s0_7 = max(s0_7, 0.0); + s0_8 = max(s0_8, 0.0); + + V4 s2_0 = l1(-1.0, -1.0); + V4 s2_1 = l1(0.0, -1.0); + V4 s2_2 = l1(1.0, -1.0); + V4 s2_3 = l1(-1.0, 0.0); + V4 s2_4 = l1(0.0, 0.0); + V4 s2_5 = l1(1.0, 0.0); + V4 s2_6 = l1(-1.0, 1.0); + V4 s2_7 = l1(0.0, 1.0); + V4 s2_8 = l1(1.0, 1.0); + V4 s3_0 = -max(-s2_0, 0.0); + V4 s3_1 = -max(-s2_1, 0.0); + V4 s3_2 = -max(-s2_2, 0.0); + V4 s3_3 = -max(-s2_3, 0.0); + V4 s3_4 = -max(-s2_4, 0.0); + V4 s3_5 = -max(-s2_5, 0.0); + V4 s3_6 = -max(-s2_6, 0.0); + V4 s3_7 = -max(-s2_7, 0.0); + V4 s3_8 = -max(-s2_8, 0.0); + s2_0 = max(s2_0, 0.0); + s2_1 = max(s2_1, 0.0); + s2_2 = max(s2_2, 0.0); + s2_3 = max(s2_3, 0.0); + s2_4 = max(s2_4, 0.0); + s2_5 = max(s2_5, 0.0); + s2_6 = max(s2_6, 0.0); + s2_7 = max(s2_7, 0.0); + s2_8 = max(s2_8, 0.0); + + V4 s4_0 = l2(-1.0, -1.0); + V4 s4_1 = l2(0.0, -1.0); + V4 s4_2 = l2(1.0, -1.0); + V4 s4_3 = l2(-1.0, 0.0); + V4 s4_4 = l2(0.0, 0.0); + V4 s4_5 = l2(1.0, 0.0); + V4 s4_6 = l2(-1.0, 1.0); + V4 s4_7 = l2(0.0, 1.0); + V4 s4_8 = l2(1.0, 1.0); + V4 s5_0 = -max(-s4_0, 0.0); + V4 s5_1 = -max(-s4_1, 0.0); + V4 s5_2 = -max(-s4_2, 0.0); + V4 s5_3 = -max(-s4_3, 0.0); + V4 s5_4 = -max(-s4_4, 0.0); + V4 s5_5 = -max(-s4_5, 0.0); + V4 s5_6 = -max(-s4_6, 0.0); + V4 s5_7 = -max(-s4_7, 0.0); + V4 s5_8 = -max(-s4_8, 0.0); + s4_0 = max(s4_0, 0.0); + s4_1 = max(s4_1, 0.0); + s4_2 = max(s4_2, 0.0); + s4_3 = max(s4_3, 0.0); + s4_4 = max(s4_4, 0.0); + s4_5 = max(s4_5, 0.0); + s4_6 = max(s4_6, 0.0); + s4_7 = max(s4_7, 0.0); + s4_8 = max(s4_8, 0.0); + + V4 s6_0 = l3(-1.0, -1.0); + V4 s6_1 = l3(0.0, -1.0); + V4 s6_2 = l3(1.0, -1.0); + V4 s6_3 = l3(-1.0, 0.0); + V4 s6_4 = l3(0.0, 0.0); + V4 s6_5 = l3(1.0, 0.0); + V4 s6_6 = l3(-1.0, 1.0); + V4 s6_7 = l3(0.0, 1.0); + V4 s6_8 = l3(1.0, 1.0); + V4 s7_0 = -max(-s6_0, 0.0); + V4 s7_1 = -max(-s6_1, 0.0); + V4 s7_2 = -max(-s6_2, 0.0); + V4 s7_3 = -max(-s6_3, 0.0); + V4 s7_4 = -max(-s6_4, 0.0); + V4 s7_5 = -max(-s6_5, 0.0); + V4 s7_6 = -max(-s6_6, 0.0); + V4 s7_7 = -max(-s6_7, 0.0); + V4 s7_8 = -max(-s6_8, 0.0); + s6_0 = max(s6_0, 0.0); + s6_1 = max(s6_1, 0.0); + s6_2 = max(s6_2, 0.0); + s6_3 = max(s6_3, 0.0); + s6_4 = max(s6_4, 0.0); + s6_5 = max(s6_5, 0.0); + s6_6 = max(s6_6, 0.0); + s6_7 = max(s6_7, 0.0); + s6_8 = max(s6_8, 0.0); + + t4[gxy] = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t5[gxy] = f1(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t6[gxy] = f2(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t7[gxy] = f3(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); +} + +//!PASS 17 +//!DESC conv16 +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 +//!IN t4, t5, t6, t7 +//!OUT t0, t1, t2, t3 + +#define l0(x, y) V4(O(t4, float2(x, y))) +#define l1(x, y) V4(O(t5, float2(x, y))) +#define l2(x, y) V4(O(t6, float2(x, y))) +#define l3(x, y) V4(O(t7, float2(x, y))) + +V4 f0(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-2.029e-02, 4.879e-04, -8.758e-03, 1.475e-04, -1.389e-02, 2.532e-02, 9.795e-03, 8.629e-03, -1.347e-02, 2.776e-02, -1.624e-02, -1.667e-02, -1.381e-02, -1.287e-03, -1.868e-01, -6.917e-02)); + r += mul(s0_1, M4(-9.130e-03, 8.736e-03, 2.281e-02, -2.990e-02, 1.027e-02, -8.698e-02, -2.193e-02, -6.665e-02, 2.959e-02, -6.816e-02, -7.055e-03, -3.538e-02, -1.003e-01, 1.809e-02, 3.144e-02, 6.967e-03)); + r += mul(s0_2, M4(-5.170e-03, 1.345e-03, -2.046e-02, 1.422e-02, 7.018e-03, 5.548e-02, 3.150e-02, 8.275e-02, -3.599e-02, 6.821e-02, 1.848e-02, -3.536e-02, 3.895e-02, -1.010e-01, -3.898e-02, -8.420e-02)); + r += mul(s0_3, M4(8.822e-03, -4.687e-03, -4.076e-02, 2.655e-02, -1.233e-01, -1.322e-02, -1.004e-01, -4.416e-02, -9.892e-03, 1.772e-02, -3.910e-02, 4.194e-02, -8.128e-02, 5.313e-02, 1.397e-01, -8.644e-02)); + r += mul(s0_4, M4(-1.556e-03, 8.777e-02, 3.236e-02, -1.485e-02, 8.951e-02, 1.694e-01, -3.848e-02, 8.485e-02, -7.786e-02, 1.043e-01, 8.126e-02, -4.799e-02, -3.285e-01, -1.213e-01, -1.267e-01, 1.159e-01)); + r += mul(s0_5, M4(2.269e-02, -4.562e-02, -2.481e-03, -4.575e-02, -3.557e-02, -9.145e-03, 2.451e-02, 6.366e-02, 4.814e-02, 4.098e-02, -1.829e-03, 1.207e-01, -2.781e-02, 1.333e-02, -5.533e-02, -7.421e-02)); + r += mul(s0_6, M4(3.073e-02, 1.740e-02, -4.553e-02, -2.311e-02, 2.805e-02, 4.819e-03, -3.860e-02, -7.901e-03, 3.804e-02, 4.899e-02, 4.114e-02, -5.725e-02, -8.765e-02, -1.678e-03, -4.249e-02, -2.247e-02)); + r += mul(s0_7, M4(4.033e-02, -6.968e-02, -1.117e-02, 2.634e-02, 4.042e-03, 2.353e-02, -6.108e-03, -9.028e-03, 2.724e-02, -5.808e-02, 6.985e-03, 2.448e-02, -1.314e-02, -2.960e-02, 8.396e-03, 3.892e-02)); + r += mul(s0_8, M4(-6.932e-03, 1.874e-02, -5.344e-03, 1.371e-03, -1.015e-02, 2.203e-02, -2.644e-03, -4.730e-04, 1.663e-03, -5.859e-02, 1.909e-03, -1.679e-02, -8.083e-02, -2.215e-02, 5.046e-05, -8.255e-02)); + r += mul(s1_0, M4(-9.475e-03, 1.204e-02, -2.413e-02, -9.667e-03, -2.342e-02, 6.405e-03, 5.050e-02, 9.364e-03, 1.852e-02, -1.010e-02, -2.013e-02, -2.629e-02, -1.507e-02, -3.515e-02, 5.260e-02, -1.952e-02)); + r += mul(s1_1, M4(4.171e-03, 1.215e-02, -7.334e-03, -6.108e-02, -3.149e-02, 8.647e-02, -4.531e-02, 3.942e-02, 3.959e-02, -1.430e-01, 5.422e-02, 1.595e-02, 5.384e-02, -3.547e-02, 2.321e-02, -1.340e-02)); + r += mul(s1_2, M4(-4.578e-03, -8.472e-03, -1.729e-02, 1.731e-02, -2.589e-02, -6.663e-02, -9.824e-03, -5.955e-02, -3.549e-04, 5.133e-02, 2.353e-02, 2.833e-02, -2.995e-03, -1.346e-01, -9.590e-03, -1.103e-01)); + r += mul(s1_3, M4(2.615e-02, -1.288e-02, 2.305e-02, -5.901e-03, 2.133e-03, 2.662e-02, -1.271e-02, -2.611e-02, -3.497e-02, 1.143e-02, -2.019e-01, 7.622e-02, 1.902e-03, -1.654e-02, -2.624e-02, -2.593e-02)); + r += mul(s1_4, M4(-2.800e-02, -5.191e-02, 5.445e-02, -9.295e-03, 7.110e-02, -1.563e-02, -1.133e-01, 5.510e-03, -1.650e-01, 3.389e-01, -6.446e-02, -1.019e-01, -6.448e-03, 5.044e-02, -2.881e-02, -6.928e-02)); + r += mul(s1_5, M4(3.185e-02, -9.858e-02, -1.038e-02, -1.009e-01, -4.432e-02, 5.652e-03, 1.895e-03, 5.691e-02, 1.375e-03, -7.187e-02, -2.144e-03, 7.523e-02, 5.999e-03, 4.358e-03, -3.024e-02, 2.206e-03)); + r += mul(s1_6, M4(-1.016e-02, -2.193e-02, -3.216e-03, -1.971e-02, -2.304e-02, -1.332e-02, -3.761e-02, 2.391e-02, -3.940e-02, 2.974e-02, 3.480e-02, -4.996e-02, 1.474e-02, 4.306e-02, -1.169e-02, -2.536e-02)); + r += mul(s1_7, M4(-4.764e-02, -5.189e-02, 1.263e-02, 6.666e-02, -4.749e-02, -2.246e-02, 5.629e-03, 6.944e-03, -4.536e-02, -1.074e-01, 5.213e-02, 6.953e-02, -5.418e-02, -1.421e-02, -6.040e-03, 2.238e-03)); + r += mul(s1_8, M4(-8.634e-04, -1.264e-03, -2.779e-03, 5.727e-03, -2.094e-02, -4.706e-03, 3.547e-04, -1.252e-02, -2.854e-03, -3.222e-02, 8.115e-03, -4.713e-02, -1.804e-02, 2.007e-03, 1.290e-02, 1.889e-02)); + r += mul(s2_0, M4(1.122e-02, -3.919e-02, -1.199e-02, -3.199e-02, 7.789e-03, -2.405e-04, -4.022e-03, 3.353e-02, -1.405e-01, 2.972e-02, 1.821e-01, 3.272e-02, -1.102e-02, 2.506e-02, 1.137e-01, 3.607e-02)); + r += mul(s2_1, M4(6.040e-03, -7.862e-02, -8.569e-02, 2.748e-02, 7.167e-03, -7.995e-02, 3.430e-02, -1.828e-02, 2.266e-01, 1.570e-01, 3.770e-03, -5.764e-02, 3.176e-03, 6.758e-02, 9.676e-02, -6.685e-04)); + r += mul(s2_2, M4(4.624e-03, -1.709e-01, -2.355e-02, -1.184e-01, 2.503e-02, 5.855e-02, 4.564e-03, 4.577e-02, 2.700e-02, -3.105e-02, 7.368e-03, -9.087e-03, -1.610e-02, -6.342e-02, 1.078e-02, -1.683e-01)); + r += mul(s2_3, M4(-1.038e-01, -5.620e-02, 5.057e-02, -1.136e-01, 4.072e-03, -2.350e-02, -1.162e-01, 5.121e-02, 6.767e-02, 3.072e-02, -7.594e-02, -2.475e-02, 3.785e-02, 9.335e-02, 1.050e-01, 2.552e-02)); + r += mul(s2_4, M4(1.875e-01, -3.006e-01, 1.249e-01, 2.122e-01, -8.097e-02, 8.200e-02, 4.680e-02, 1.175e-01, -2.058e-01, -9.523e-02, 6.787e-03, 2.453e-01, -1.272e-01, -2.239e-01, 2.698e-01, -3.082e-01)); + r += mul(s2_5, M4(-5.849e-02, 1.395e-01, -1.039e-01, 2.000e-02, -3.971e-02, -5.141e-03, -1.663e-02, -2.269e-02, -1.253e-03, -7.699e-02, -6.501e-03, 7.125e-04, -2.391e-03, -7.280e-02, 3.890e-02, 7.424e-02)); + r += mul(s2_6, M4(-9.839e-02, -4.239e-02, -1.770e-01, -4.000e-02, -1.275e-02, 1.437e-02, 3.002e-02, -3.845e-02, -6.443e-03, -7.469e-03, -1.396e-02, 3.598e-02, -4.157e-03, -1.014e-02, 5.567e-03, -7.055e-02)); + r += mul(s2_7, M4(4.702e-02, -5.766e-02, -3.152e-02, -2.920e-01, 9.183e-02, -5.891e-02, 2.027e-02, 1.401e-01, 6.066e-03, -2.295e-02, -1.850e-02, -9.314e-03, -2.626e-02, 2.560e-02, 1.554e-02, -9.582e-02)); + r += mul(s2_8, M4(-5.667e-02, 8.757e-03, -1.063e-02, -1.721e-02, 5.953e-02, -2.878e-02, -3.201e-02, 2.957e-02, -3.086e-05, -4.542e-03, -4.631e-03, -2.061e-02, 1.549e-02, 6.634e-03, 1.177e-02, -4.624e-02)); + r += mul(s3_0, M4(-3.817e-02, -6.516e-02, 6.351e-03, -4.393e-02, 2.210e-03, -8.994e-04, -1.707e-02, -2.814e-02, 3.967e-02, 4.164e-02, -2.078e-04, 5.480e-02, -4.200e-03, 2.909e-02, 3.827e-03, 5.186e-02)); + r += mul(s3_1, M4(-1.730e-02, 5.633e-02, -6.677e-03, -2.826e-02, 1.806e-02, 5.101e-02, 4.220e-02, 9.208e-02, -1.975e-02, -3.465e-02, -4.827e-02, -2.703e-02, 3.934e-03, -5.528e-02, 1.503e-02, -1.808e-02)); + r += mul(s3_2, M4(-2.771e-03, -2.343e-02, 2.906e-03, 2.482e-02, -5.288e-03, 7.238e-03, -3.635e-03, -2.292e-02, -2.141e-03, 7.963e-02, 2.594e-02, 9.728e-02, 3.985e-03, 8.611e-03, 2.922e-02, -5.558e-02)); + r += mul(s3_3, M4(-3.361e-02, -1.143e-02, 1.257e-03, -5.252e-02, -3.814e-02, -4.063e-02, 5.435e-02, -4.041e-02, -4.214e-02, 1.422e-02, -2.499e-03, -1.482e-02, 3.867e-02, 5.719e-02, -4.521e-03, 1.558e-01)); + r += mul(s3_4, M4(3.368e-03, 2.704e-02, -4.608e-03, -2.946e-02, -4.495e-02, 1.209e-03, 5.002e-02, 1.787e-01, 8.587e-03, -7.436e-03, -1.222e-02, 1.216e-03, -8.122e-02, -1.045e-01, 6.610e-03, -2.437e-01)); + r += mul(s3_5, M4(1.244e-02, -1.966e-02, 7.155e-02, -2.583e-02, -5.333e-02, 1.328e-02, 9.831e-03, -5.143e-02, 2.557e-02, -1.996e-02, 3.396e-03, 1.462e-02, -3.415e-02, -3.247e-02, -1.521e-03, -4.948e-02)); + r += mul(s3_6, M4(3.160e-02, 1.019e-02, -4.078e-02, -6.326e-02, -4.169e-02, -5.095e-02, 7.710e-03, -5.661e-02, 1.123e-02, -1.954e-02, -1.598e-02, -2.833e-02, -2.837e-02, 4.464e-02, 2.500e-02, -1.005e-02)); + r += mul(s3_7, M4(1.256e-02, -5.163e-02, -2.687e-02, 3.633e-02, 9.786e-03, -3.010e-02, 9.320e-03, 5.050e-02, 3.911e-02, -2.263e-02, 1.790e-02, 2.694e-02, -3.798e-02, 1.774e-02, -2.614e-02, -4.926e-02)); + r += mul(s3_8, M4(-2.943e-03, 6.765e-02, 1.541e-02, 4.533e-02, 6.659e-03, -6.111e-03, 3.756e-03, 5.907e-03, 2.580e-02, 5.163e-03, -1.929e-03, 2.221e-02, -1.588e-02, -1.152e-02, 1.484e-04, 3.090e-03)); + r += mul(s4_0, M4(2.188e-03, 1.233e-02, -6.039e-03, -3.271e-03, -4.075e-02, -1.018e-01, 5.750e-02, -4.206e-02, 2.208e-02, 4.427e-03, 4.322e-03, 2.824e-02, 2.442e-02, -1.590e-03, -5.812e-02, 2.286e-02)); + r += mul(s4_1, M4(1.203e-02, -2.723e-02, 2.792e-02, 4.277e-03, -1.371e-02, 1.807e-01, -7.397e-02, 5.375e-02, 6.859e-03, -1.108e-02, 6.324e-03, -2.214e-02, 1.751e-02, -1.223e-01, 2.908e-02, -3.164e-02)); + r += mul(s4_2, M4(-1.789e-02, 2.918e-02, -2.021e-02, 1.429e-02, -8.790e-02, -1.048e-01, 4.032e-03, -1.448e-01, 4.563e-03, 1.140e-02, 1.336e-02, -5.594e-03, -9.261e-03, 2.338e-02, 2.334e-03, 4.670e-02)); + r += mul(s4_3, M4(-3.749e-02, -3.339e-02, 7.810e-03, -2.643e-02, 1.792e-02, -2.154e-02, 1.367e-02, 2.375e-02, -2.629e-02, -1.692e-02, -4.533e-02, 8.193e-03, 9.931e-03, 2.730e-02, -2.520e-02, 2.837e-02)); + r += mul(s4_4, M4(9.309e-03, 8.926e-02, -6.059e-02, 6.958e-02, 1.646e-01, -1.409e-03, 6.206e-02, -1.003e-01, -8.349e-03, 2.249e-01, -1.141e-01, 6.166e-02, -1.402e-01, -2.770e-01, -1.820e-01, 7.931e-02)); + r += mul(s4_5, M4(2.799e-02, -6.673e-02, -8.643e-03, -1.263e-02, 4.470e-02, 3.160e-02, -4.880e-02, 4.270e-04, 2.690e-03, -4.527e-02, 2.218e-02, 2.813e-02, -1.331e-02, -4.080e-02, -8.969e-03, -1.897e-01)); + r += mul(s4_6, M4(1.957e-02, 5.533e-03, -2.370e-02, 3.365e-04, -2.176e-02, -1.949e-02, 6.947e-03, -2.445e-02, 8.425e-02, 6.763e-02, -5.106e-02, 2.826e-02, -6.571e-02, -1.743e-02, -3.430e-02, 5.619e-02)); + r += mul(s4_7, M4(-4.661e-03, -3.377e-02, -3.822e-02, 1.310e-02, -2.800e-02, -8.351e-04, -1.781e-02, 1.310e-02, 4.303e-02, -2.057e-02, -1.517e-02, -2.399e-02, -8.678e-02, 1.040e-01, 3.349e-03, -1.960e-02)); + r += mul(s4_8, M4(1.441e-03, 1.279e-02, 1.996e-03, 1.996e-02, -7.728e-03, -4.151e-03, 2.081e-04, -2.267e-02, -4.927e-03, 1.815e-02, -3.295e-02, 1.235e-02, -2.610e-02, -7.928e-02, -2.486e-02, 5.305e-02)); + r += mul(s5_0, M4(-3.050e-02, 5.988e-02, 4.850e-02, 2.003e-03, -1.797e-02, -3.545e-02, 6.963e-02, -2.332e-02, -1.274e-02, 5.089e-02, -5.318e-02, 3.672e-02, 1.798e-02, 1.617e-02, -1.356e-02, -2.160e-03)); + r += mul(s5_1, M4(-9.221e-03, -3.095e-02, -1.260e-01, -3.726e-02, -2.899e-02, -1.172e-01, -1.080e-02, -8.622e-02, 5.263e-03, 6.370e-04, 2.907e-02, 8.421e-02, 3.938e-02, -8.754e-04, -2.304e-02, 5.670e-02)); + r += mul(s5_2, M4(-7.475e-02, 2.010e-02, -1.580e-02, -9.556e-02, -3.775e-02, 3.063e-02, 2.983e-02, 3.424e-03, 1.927e-02, 6.518e-02, 2.239e-02, 8.391e-02, -5.363e-03, 4.095e-02, 1.163e-02, -6.192e-03)); + r += mul(s5_3, M4(5.238e-03, -1.321e-01, -3.892e-02, -1.501e-02, 2.361e-02, -3.405e-02, 4.850e-02, -4.595e-02, -7.598e-02, 6.938e-02, 1.223e-01, 2.470e-02, 3.387e-02, 3.784e-02, -7.823e-02, 8.717e-02)); + r += mul(s5_4, M4(-5.467e-03, 4.775e-02, -2.619e-01, 1.500e-02, 3.519e-01, 2.178e-02, 1.416e-02, 5.189e-02, 9.114e-02, 3.850e-01, 1.040e-01, 2.825e-01, -1.140e-01, 5.294e-02, 1.356e-02, 8.804e-02)); + r += mul(s5_5, M4(4.030e-02, -8.907e-02, 4.373e-02, -2.419e-01, 2.962e-02, 9.283e-02, -4.764e-02, -1.203e-01, -6.276e-02, -8.897e-02, 2.790e-02, 3.085e-02, 4.104e-02, -1.067e-01, -2.282e-02, 2.516e-03)); + r += mul(s5_6, M4(8.130e-02, 3.593e-02, -1.512e-02, -2.130e-02, 3.846e-04, 1.084e-02, -1.571e-02, -3.920e-02, -1.775e-02, 3.412e-03, -3.112e-03, 3.362e-02, 2.540e-02, 2.637e-02, 1.125e-02, 2.104e-02)); + r += mul(s5_7, M4(5.058e-02, -1.020e-01, -1.193e-01, 3.974e-02, -6.795e-02, 1.397e-02, 9.795e-03, -4.394e-02, -6.067e-04, -2.733e-02, 2.546e-02, 2.650e-02, 1.741e-02, -3.900e-02, -4.500e-02, -2.266e-02)); + r += mul(s5_8, M4(5.627e-02, -6.886e-02, -2.271e-02, 2.678e-02, -2.336e-02, -8.212e-03, 9.465e-03, 1.759e-02, 1.935e-02, 7.441e-02, -3.217e-02, 3.104e-02, -9.202e-03, -7.706e-03, -1.861e-02, -6.168e-02)); + r += mul(s6_0, M4(-2.576e-02, 1.129e-01, 2.133e-03, 2.901e-03, 1.055e-02, -2.322e-02, -1.345e-02, 1.667e-02, 1.038e-02, 4.466e-02, 1.365e-02, -1.159e-02, 4.424e-03, -4.547e-02, 1.407e-02, 5.112e-02)); + r += mul(s6_1, M4(-3.459e-02, -7.740e-02, 3.556e-02, -1.876e-02, 5.276e-02, 4.453e-02, 7.842e-03, -4.327e-02, -3.259e-02, -4.898e-02, -5.375e-02, -2.294e-02, -4.080e-02, 7.458e-02, 9.618e-03, -1.069e-02)); + r += mul(s6_2, M4(5.067e-02, 5.603e-03, -1.500e-02, 5.532e-02, -2.757e-02, -7.832e-02, -2.900e-02, 1.476e-02, -1.282e-02, 4.474e-02, -1.039e-02, 1.193e-02, 3.010e-03, -1.267e-02, 1.180e-02, -3.899e-02)); + r += mul(s6_3, M4(3.801e-02, -3.406e-03, -5.913e-02, 4.177e-03, 4.284e-02, 3.299e-02, -3.133e-02, 1.868e-02, 5.249e-02, -7.641e-02, -7.446e-02, 3.435e-02, -6.008e-03, 4.739e-02, 1.140e-01, 5.544e-02)); + r += mul(s6_4, M4(-5.225e-02, 1.877e-02, 1.099e-01, 8.499e-02, -6.215e-02, -1.398e-01, 7.367e-03, -1.408e-02, 6.409e-02, 1.008e-01, -2.400e-01, -8.376e-02, 3.692e-02, 3.405e-04, -1.053e-01, 1.195e-01)); + r += mul(s6_5, M4(2.643e-02, -1.569e-02, -1.466e-02, -2.440e-02, 3.143e-02, 8.849e-02, -3.169e-02, -3.565e-02, 1.911e-02, 4.959e-02, 9.990e-03, 7.206e-02, -6.857e-03, -3.100e-02, 1.367e-02, -2.076e-02)); + r += mul(s6_6, M4(-2.594e-03, 1.125e-02, -7.613e-02, 2.455e-02, -3.486e-02, -2.049e-02, -1.238e-02, 2.837e-02, -4.413e-02, -1.939e-02, 8.693e-02, 9.861e-03, 1.894e-02, 3.119e-02, 4.539e-02, 1.646e-02)); + r += mul(s6_7, M4(-4.224e-02, -2.552e-02, -1.879e-03, 5.658e-03, 3.094e-02, 5.435e-03, 3.240e-03, 2.593e-02, -9.090e-04, 7.022e-02, -1.395e-02, 2.027e-02, 3.540e-02, 2.128e-02, -2.508e-02, 1.386e-02)); + r += mul(s6_8, M4(-3.235e-02, -6.805e-03, 1.986e-02, -5.980e-02, -1.837e-02, 4.823e-02, -4.069e-02, 4.946e-02, -5.257e-02, -5.763e-02, 1.689e-02, -7.420e-02, -7.487e-03, 3.107e-02, 1.590e-02, 4.157e-03)); + r += mul(s7_0, M4(-4.054e-02, 8.705e-03, 1.678e-02, -2.195e-02, -3.439e-02, 2.712e-02, 2.326e-02, 8.939e-03, 2.003e-03, 2.375e-02, 2.251e-02, -7.720e-03, 2.541e-02, -3.579e-02, 2.579e-02, 3.495e-02)); + r += mul(s7_1, M4(-1.394e-03, 5.266e-02, 1.313e-02, -8.081e-02, 6.935e-02, 1.109e-01, 5.465e-02, -1.385e-02, -2.348e-02, -6.624e-02, -3.073e-03, 9.761e-03, 5.321e-03, -1.357e-02, -3.844e-02, -4.074e-02)); + r += mul(s7_2, M4(-2.816e-02, -8.956e-02, -3.648e-02, -1.188e-01, 1.016e-02, -8.859e-02, 1.397e-02, 6.185e-02, -2.495e-03, -3.623e-02, 9.019e-04, -5.670e-02, -1.218e-02, 4.075e-02, -7.870e-04, -2.862e-02)); + r += mul(s7_3, M4(7.425e-02, 2.433e-02, -2.468e-02, -1.552e-02, 1.614e-02, 3.148e-02, -4.567e-02, 4.686e-03, 1.311e-02, 6.546e-03, 1.486e-02, 8.595e-03, -4.130e-03, 5.457e-02, 1.922e-02, 1.460e-02)); + r += mul(s7_4, M4(-3.507e-02, -8.057e-02, -5.361e-02, 4.949e-02, -2.027e-03, -2.628e-01, 1.921e-02, 7.200e-02, -1.868e-02, 1.318e-02, -4.976e-02, 1.480e-02, -1.817e-02, -1.079e-01, -1.634e-01, -2.196e-01)); + r += mul(s7_5, M4(9.744e-03, 7.544e-02, -6.728e-03, -9.174e-02, -2.069e-02, 3.819e-02, 5.528e-02, 1.131e-01, 2.880e-03, 1.658e-03, 1.095e-02, 6.066e-03, 1.375e-02, -4.229e-02, 5.933e-03, 1.083e-01)); + r += mul(s7_6, M4(-4.652e-02, 6.894e-03, -3.310e-02, -3.747e-02, -1.242e-02, -2.874e-02, -4.627e-02, 2.411e-02, -2.237e-03, -1.494e-03, 3.698e-02, 1.460e-03, 6.772e-03, -3.464e-03, 4.233e-02, 1.243e-02)); + r += mul(s7_7, M4(3.051e-03, -5.852e-02, -2.634e-02, 7.790e-02, 3.050e-02, 4.398e-02, 7.121e-02, -7.453e-02, 1.137e-02, 7.497e-02, -1.589e-02, 2.040e-02, -2.012e-02, 1.422e-02, -5.347e-03, -7.258e-02)); + r += mul(s7_8, M4(-1.066e-02, -4.479e-02, -6.650e-03, -8.960e-02, -1.850e-02, 1.870e-02, 1.950e-02, 5.075e-02, -4.336e-02, -3.843e-02, 1.724e-04, -2.057e-02, -6.799e-04, -2.837e-02, 6.789e-03, 5.809e-03)); + r += V4(-2.027e-03, 2.169e-03, -4.476e-03, 9.853e-04); + return r; +} + +V4 f1(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-1.602e-02, 1.944e-02, 2.057e-02, 2.308e-02, -1.138e-03, -8.687e-02, -3.301e-02, -1.328e-02, -9.598e-03, 4.121e-02, -3.381e-02, 3.510e-02, -2.909e-02, -1.159e-01, -1.384e-02, 1.851e-02)); + r += mul(s0_1, M4(-7.722e-03, -1.367e-02, 4.892e-02, -8.374e-02, 1.866e-02, -3.208e-01, -2.756e-02, -1.617e-01, 2.663e-02, 5.331e-02, -1.181e-01, 2.712e-02, -1.752e-03, 8.796e-02, -2.881e-01, 7.150e-03)); + r += mul(s0_2, M4(6.638e-03, -2.737e-02, 7.612e-03, -3.036e-02, -3.045e-02, 4.160e-03, -4.504e-02, 1.067e-01, -1.567e-02, 7.296e-03, -2.313e-02, 4.067e-02, -3.013e-02, -6.589e-02, -3.004e-02, 1.242e-01)); + r += mul(s0_3, M4(4.358e-02, 8.719e-02, 1.000e-02, -9.082e-02, -5.349e-02, 1.008e-01, -4.839e-02, -6.958e-02, 4.046e-02, 4.825e-03, 7.882e-03, -5.125e-02, -1.245e-01, -8.734e-02, -3.235e-02, 3.103e-02)); + r += mul(s0_4, M4(-6.380e-03, 5.468e-01, 8.698e-03, 3.629e-01, -4.939e-02, 3.985e-01, 1.027e-02, 1.595e-01, 2.367e-02, -4.577e-03, 6.186e-02, 6.269e-02, 5.279e-01, -3.631e-02, -3.986e-02, 7.478e-02)); + r += mul(s0_5, M4(3.021e-02, -2.171e-02, 5.334e-03, -9.941e-02, 4.840e-02, 7.097e-02, -9.422e-02, 2.264e-02, 8.765e-02, -2.527e-02, 5.788e-02, -4.662e-02, -4.417e-02, 3.999e-02, 4.138e-02, -9.514e-02)); + r += mul(s0_6, M4(6.274e-02, 7.143e-02, -2.353e-02, -6.923e-03, 6.274e-02, 6.906e-04, 1.702e-02, 1.087e-02, 6.130e-02, 3.286e-02, 1.669e-02, 2.142e-02, -2.491e-02, 1.652e-02, 2.754e-03, 2.682e-03)); + r += mul(s0_7, M4(-3.790e-03, 7.876e-02, -2.640e-02, -6.914e-02, -3.984e-02, 4.054e-02, -7.473e-03, -6.250e-03, 1.066e-02, -5.058e-02, -1.415e-02, 1.820e-03, -1.421e-01, -3.648e-03, -7.857e-03, 5.938e-03)); + r += mul(s0_8, M4(1.763e-02, 1.438e-02, -4.884e-03, 1.350e-02, -1.027e-02, 2.633e-02, 1.813e-02, 1.996e-02, -4.629e-02, -4.395e-02, -1.242e-02, -6.677e-04, 5.819e-02, 3.354e-02, 8.380e-03, 4.855e-03)); + r += mul(s1_0, M4(-2.772e-02, -8.495e-04, 2.062e-02, -1.064e-02, -1.575e-02, 6.163e-02, 4.156e-02, -1.324e-02, -2.506e-02, 2.186e-03, -3.599e-02, 6.467e-02, -4.567e-02, -6.696e-02, 2.431e-02, -2.636e-02)); + r += mul(s1_1, M4(8.213e-03, -1.493e-01, 1.733e-02, -9.047e-02, 2.738e-02, 5.871e-02, -1.676e-02, 7.615e-02, -2.371e-02, 6.123e-02, -1.460e-01, 2.579e-01, 7.783e-02, 2.332e-02, -8.649e-02, -1.917e-01)); + r += mul(s1_2, M4(7.924e-03, -8.634e-02, 2.742e-03, -3.775e-02, 2.520e-02, 1.735e-02, -4.828e-02, 1.161e-03, -2.588e-02, -1.229e-02, -1.090e-02, -1.852e-02, -1.063e-02, 6.307e-02, -3.989e-03, 4.773e-02)); + r += mul(s1_3, M4(-2.502e-02, -1.060e-02, 3.879e-02, -7.326e-02, 1.117e-02, -7.896e-03, -4.144e-02, -5.220e-02, -9.789e-03, 1.152e-02, -6.842e-02, 1.956e-02, -2.119e-02, 1.520e-02, -8.919e-04, -1.018e-02)); + r += mul(s1_4, M4(-1.167e-01, 2.910e-01, -1.212e-01, 4.229e-01, 4.912e-02, -3.232e-03, -3.651e-02, 2.089e-02, -1.031e-01, -4.355e-01, 1.091e-01, 4.724e-01, 8.100e-02, 1.825e-02, 5.617e-03, -2.689e-03)); + r += mul(s1_5, M4(2.900e-02, -8.883e-02, -1.598e-02, -4.842e-02, 7.936e-03, -4.950e-02, -4.480e-02, 4.077e-02, 2.631e-02, -3.377e-02, 1.693e-02, -1.655e-01, -7.887e-02, -5.963e-02, -2.036e-02, -4.150e-02)); + r += mul(s1_6, M4(3.880e-02, 4.446e-02, 5.978e-03, 7.119e-03, 3.092e-02, -9.694e-03, -6.194e-04, -3.426e-03, -9.249e-03, -5.280e-02, 3.246e-03, 4.194e-02, -2.533e-04, -2.178e-03, -4.813e-04, 1.268e-04)); + r += mul(s1_7, M4(-1.088e-01, 8.445e-03, -2.497e-03, -4.470e-02, -1.973e-02, -3.454e-02, 1.519e-02, -1.348e-02, -5.420e-02, -1.657e-01, -5.679e-02, 6.335e-02, 2.859e-03, -1.316e-02, -1.629e-02, 3.222e-03)); + r += mul(s1_8, M4(-3.045e-02, -1.485e-02, -4.530e-03, 1.115e-02, 5.975e-02, 6.526e-02, 7.257e-03, -2.211e-02, -1.775e-02, -3.347e-02, -1.223e-02, -7.104e-03, 1.594e-03, 1.353e-02, 1.825e-02, -1.211e-02)); + r += mul(s2_0, M4(8.946e-03, -6.597e-02, -2.839e-02, -3.916e-03, 3.179e-02, -3.892e-02, -9.478e-05, -3.378e-02, -6.274e-02, 1.027e-01, 1.648e-02, -3.358e-02, -7.541e-03, 1.094e-01, -3.723e-02, 6.050e-03)); + r += mul(s2_1, M4(-2.421e-02, -7.951e-02, 8.080e-02, 2.107e-02, 2.139e-02, 8.789e-02, -9.062e-02, 1.134e-01, 2.512e-01, 2.997e-02, 1.545e-01, -3.472e-01, 4.823e-02, 1.155e-01, -1.848e-03, -1.546e-01)); + r += mul(s2_2, M4(-4.584e-02, -6.638e-02, -1.879e-02, 9.948e-02, -3.548e-02, 4.780e-03, 5.200e-04, -6.878e-05, 8.401e-02, 2.047e-01, -6.270e-03, -2.448e-02, 1.475e-02, -4.832e-02, -8.098e-02, -1.398e-01)); + r += mul(s2_3, M4(-1.042e-01, -4.714e-02, -3.402e-02, -4.442e-02, -3.004e-02, 1.026e-01, 1.361e-02, 7.693e-02, 1.192e-01, -3.831e-02, -1.074e-02, 1.415e-02, 2.575e-02, 5.908e-02, -4.298e-02, 6.081e-03)); + r += mul(s2_4, M4(2.861e-01, 9.207e-02, -1.888e-01, 1.447e-01, -1.294e-01, -8.026e-03, 1.666e-01, 3.225e-02, -4.795e-01, -1.216e-01, -4.461e-03, -6.152e-02, -1.341e-01, 6.710e-02, -3.464e-03, 2.860e-02)); + r += mul(s2_5, M4(3.118e-02, 6.361e-02, 1.517e-01, -2.066e-01, 9.298e-02, -3.544e-02, 4.673e-02, -1.113e-01, -1.257e-02, 7.547e-03, 5.694e-03, 5.824e-02, 1.598e-02, 3.417e-02, 2.197e-02, -8.769e-02)); + r += mul(s2_6, M4(-9.891e-02, -1.657e-02, -1.123e-02, -2.551e-02, 1.037e-01, 3.091e-02, -2.608e-02, -2.351e-02, -1.279e-02, -1.557e-02, -5.095e-03, -2.388e-03, -1.545e-02, -8.277e-03, 5.444e-02, 8.015e-03)); + r += mul(s2_7, M4(1.387e-01, 6.281e-02, -1.489e-02, -1.101e-01, -4.190e-02, -5.878e-02, -1.273e-02, -9.930e-02, -1.888e-02, 2.096e-02, 7.184e-03, -2.086e-02, -3.886e-02, 2.067e-02, -1.168e-02, 3.008e-02)); + r += mul(s2_8, M4(-7.592e-02, -7.535e-02, -1.099e-02, 3.415e-02, 2.166e-02, -5.147e-02, -6.420e-03, -7.174e-03, -3.075e-02, -1.896e-02, 1.354e-03, -1.838e-03, -2.213e-02, 7.056e-03, -8.424e-03, 3.090e-02)); + r += mul(s3_0, M4(-9.595e-03, 1.169e-02, -2.990e-02, -2.690e-02, -2.824e-03, -6.516e-02, -4.582e-02, -1.122e-02, 6.029e-02, 4.170e-02, -3.837e-02, 3.339e-02, -1.077e-02, 7.446e-02, -2.923e-02, 6.549e-02)); + r += mul(s3_1, M4(-5.111e-03, 6.225e-02, -3.003e-02, 3.308e-02, 2.977e-02, -2.156e-02, -5.577e-02, 3.275e-02, -3.608e-02, -4.971e-02, 1.715e-02, -4.390e-02, -1.254e-02, -3.575e-02, 2.269e-02, -3.128e-02)); + r += mul(s3_2, M4(1.598e-02, -4.655e-02, 7.151e-02, -8.702e-02, 2.685e-03, 4.683e-02, -8.830e-03, -8.845e-03, -2.099e-02, 4.414e-02, 2.528e-02, 5.378e-02, 1.731e-02, 5.451e-02, -7.642e-02, 4.291e-02)); + r += mul(s3_3, M4(2.179e-02, -9.353e-03, 5.185e-03, -4.819e-02, -4.619e-02, -9.819e-03, -2.010e-02, 5.645e-03, -6.820e-02, 5.689e-02, 1.793e-02, -6.441e-03, 8.032e-02, 3.136e-02, -5.345e-02, 5.041e-02)); + r += mul(s3_4, M4(1.961e-02, -3.295e-02, -2.769e-02, 2.888e-02, -9.280e-02, 1.242e-01, 2.179e-02, 1.752e-01, -4.600e-03, -5.721e-02, 1.043e-01, 3.595e-02, -8.385e-02, -6.855e-02, -8.819e-02, -9.500e-03)); + r += mul(s3_5, M4(4.813e-03, 4.495e-02, -1.845e-02, 5.395e-02, 2.067e-02, -7.696e-03, 1.179e-02, -1.813e-02, 2.336e-02, -3.331e-03, 1.134e-02, 1.571e-03, -1.120e-02, 2.340e-02, 4.389e-02, -3.137e-02)); + r += mul(s3_6, M4(7.093e-03, -5.993e-03, 3.377e-02, -6.898e-03, -1.301e-02, -3.597e-03, -2.272e-02, -3.425e-02, 3.097e-02, -2.057e-02, 2.067e-04, -2.046e-03, -3.947e-02, -2.045e-02, 2.302e-02, 1.487e-02)); + r += mul(s3_7, M4(7.510e-03, -2.502e-02, -1.432e-02, -3.276e-03, -8.301e-02, -2.406e-02, -1.457e-02, -2.138e-02, -9.351e-02, -4.553e-02, -6.659e-03, -1.025e-02, -6.618e-03, 2.044e-03, -9.260e-03, 2.205e-02)); + r += mul(s3_8, M4(-3.799e-02, 3.744e-03, 2.620e-02, 1.641e-02, -3.945e-04, -2.924e-02, -1.826e-02, 1.369e-02, -1.016e-03, 4.311e-03, 1.674e-03, 1.285e-02, -7.228e-02, -5.898e-02, -1.358e-02, -2.097e-02)); + r += mul(s4_0, M4(1.102e-02, -1.521e-02, -6.008e-03, 7.398e-04, -7.296e-02, -1.620e-02, -2.665e-02, -5.316e-02, 3.510e-02, 1.202e-02, -4.560e-02, 1.993e-02, 2.631e-02, 2.444e-02, -2.006e-02, 7.418e-02)); + r += mul(s4_1, M4(-1.188e-02, -2.811e-02, -2.370e-02, -1.292e-04, -6.479e-03, 8.834e-02, 1.566e-01, 5.438e-02, -3.613e-03, 1.996e-02, -4.270e-02, -1.585e-03, -2.553e-02, -4.177e-02, -1.004e-01, 6.837e-02)); + r += mul(s4_2, M4(-7.127e-03, -5.692e-03, 1.363e-02, -1.185e-02, 2.465e-02, -7.546e-02, -3.101e-02, -4.175e-02, 5.013e-03, 1.110e-01, 2.746e-03, 1.005e-01, -6.006e-02, -1.028e-01, 7.587e-02, -4.006e-02)); + r += mul(s4_3, M4(-1.252e-02, 7.058e-03, -2.447e-02, -1.218e-02, 8.639e-02, 4.769e-02, -4.430e-02, 1.939e-02, -1.963e-02, -2.812e-02, 2.546e-02, 2.933e-02, 6.862e-02, -3.934e-03, -1.195e-02, 7.803e-02)); + r += mul(s4_4, M4(3.983e-02, 5.575e-02, 5.597e-02, -1.163e-02, 2.775e-02, 8.033e-02, -5.456e-02, 3.303e-02, 1.158e-01, -1.946e-02, 1.562e-01, -4.842e-02, 3.132e-03, 2.551e-01, -2.822e-01, -2.206e-01)); + r += mul(s4_5, M4(3.133e-02, -1.668e-03, -1.536e-02, -6.250e-03, -2.136e-02, -6.014e-02, 2.088e-02, -8.109e-02, -4.080e-02, 3.456e-02, -4.960e-03, 9.921e-02, -2.083e-03, 8.930e-02, -1.308e-02, -2.485e-02)); + r += mul(s4_6, M4(1.548e-02, -5.147e-03, 2.563e-03, 6.285e-03, -3.622e-02, 1.740e-03, -7.185e-03, 6.668e-04, 7.383e-02, -4.558e-02, 4.190e-02, 1.590e-03, -1.153e-01, 4.337e-02, 5.815e-03, 6.703e-03)); + r += mul(s4_7, M4(-4.941e-02, -3.662e-02, 8.337e-03, 1.284e-02, 1.697e-03, 2.466e-02, -2.523e-02, -6.149e-03, 2.508e-02, -4.108e-02, 1.502e-02, 1.478e-02, -3.471e-02, 1.253e-01, 3.462e-02, 7.212e-02)); + r += mul(s4_8, M4(-1.663e-02, 1.343e-02, 1.031e-02, 9.448e-03, -5.931e-02, -3.506e-02, -1.118e-04, 1.849e-02, -2.685e-02, 5.631e-03, 6.119e-03, 9.226e-03, -6.665e-04, -5.032e-02, -2.241e-02, -8.407e-03)); + r += mul(s5_0, M4(1.395e-02, 7.699e-02, -2.657e-02, -6.239e-02, -3.012e-02, 1.488e-02, -3.474e-02, -6.028e-02, 2.408e-02, 1.424e-01, -9.118e-02, 3.961e-02, -3.046e-03, -3.075e-03, -7.734e-03, 7.127e-03)); + r += mul(s5_1, M4(2.541e-02, -8.866e-02, -3.268e-02, -3.691e-02, -3.625e-02, -1.827e-01, 2.963e-01, -1.750e-01, 2.180e-02, -3.934e-02, 4.675e-02, 2.028e-01, 1.810e-02, 4.776e-02, -3.834e-02, 3.822e-02)); + r += mul(s5_2, M4(4.619e-02, -2.099e-02, 3.328e-02, 2.555e-02, -4.572e-02, -1.028e-01, 8.279e-02, -1.159e-01, 1.228e-02, 1.202e-02, 6.422e-03, -4.052e-03, 2.107e-02, -3.524e-02, 3.312e-02, 1.123e-02)); + r += mul(s5_3, M4(-1.942e-02, -4.602e-02, 7.330e-02, 4.523e-03, -1.554e-03, 6.221e-02, 1.401e-02, -1.852e-03, -6.867e-02, -1.528e-01, -7.001e-02, 3.589e-02, -1.640e-02, 5.321e-02, 4.126e-02, 8.950e-02)); + r += mul(s5_4, M4(-6.138e-02, -7.446e-02, 2.528e-01, -1.488e-01, 4.429e-02, 1.152e-01, -1.438e-03, 1.705e-01, 9.691e-02, 3.186e-02, 1.741e-01, -1.788e-01, -8.488e-02, -8.629e-02, 2.150e-02, -5.496e-02)); + r += mul(s5_5, M4(-1.204e-01, -7.041e-02, 1.513e-01, -1.264e-01, 1.680e-02, -6.029e-02, 2.497e-02, 3.013e-03, 4.852e-02, 1.025e-01, -3.057e-02, 1.842e-01, 4.622e-03, -1.222e-02, -2.721e-02, 1.157e-02)); + r += mul(s5_6, M4(-1.136e-02, -6.073e-02, 1.539e-02, -4.126e-02, -3.847e-02, 4.261e-02, 1.198e-02, 5.306e-03, 6.251e-02, -5.855e-02, 1.477e-02, -2.672e-02, -2.354e-02, -6.440e-03, 1.940e-02, 1.360e-02)); + r += mul(s5_7, M4(7.322e-02, -3.496e-02, -3.640e-02, 3.208e-02, -4.454e-02, 2.890e-02, 5.658e-03, 2.411e-02, 2.417e-02, -2.461e-02, 9.286e-03, -2.945e-02, 2.810e-02, 6.893e-02, -3.579e-03, 1.289e-02)); + r += mul(s5_8, M4(1.222e-02, 6.441e-02, 3.220e-03, -1.404e-01, -3.137e-02, -4.174e-02, -1.381e-03, 3.463e-02, -6.317e-02, -7.367e-03, 2.803e-03, 6.163e-02, -6.373e-02, 6.113e-03, 1.058e-03, -2.774e-02)); + r += mul(s6_0, M4(3.013e-02, 5.727e-02, 9.003e-03, 1.051e-02, -1.073e-02, -7.736e-02, 4.207e-02, -2.627e-03, 1.345e-02, 3.167e-02, 8.640e-03, -5.891e-03, -1.514e-02, 7.545e-02, -1.225e-02, 6.570e-02)); + r += mul(s6_1, M4(-2.280e-02, -1.438e-01, -3.557e-02, 4.780e-03, 6.770e-03, -2.738e-02, 1.773e-02, -2.045e-01, -2.987e-02, 1.402e-01, -1.868e-02, 5.535e-02, -2.222e-02, 9.094e-02, 5.169e-02, 1.007e-01)); + r += mul(s6_2, M4(2.146e-02, -1.793e-01, 7.339e-03, -2.134e-01, -1.581e-02, 1.097e-01, -6.332e-03, 1.482e-01, -7.301e-03, -2.931e-02, -7.941e-03, 2.457e-02, -2.584e-03, 2.997e-02, -1.088e-02, 2.071e-02)); + r += mul(s6_3, M4(-3.318e-03, 4.875e-02, 2.340e-02, 3.773e-02, 2.270e-02, 1.642e-03, -4.309e-02, 1.612e-02, -1.588e-02, 2.905e-03, -2.409e-02, 1.876e-02, 9.508e-02, 2.535e-03, -1.075e-01, 2.218e-02)); + r += mul(s6_4, M4(-8.570e-02, 1.575e-01, 1.420e-02, 7.448e-02, -9.357e-03, -4.404e-02, -3.117e-02, 4.668e-02, 4.308e-02, 1.477e-01, -7.957e-02, 2.017e-01, 1.419e-01, 1.729e-02, -7.883e-02, 2.105e-02)); + r += mul(s6_5, M4(7.094e-02, -9.315e-02, -5.066e-02, -8.118e-02, -8.276e-02, 1.049e-03, -3.332e-02, 5.612e-02, -4.293e-02, -1.420e-01, -1.876e-02, 1.258e-03, 2.879e-02, 1.642e-02, -4.920e-02, 7.644e-02)); + r += mul(s6_6, M4(-2.574e-02, 3.665e-02, -4.206e-03, 1.549e-04, 1.494e-02, 8.348e-03, -1.097e-02, 1.059e-03, -2.022e-02, 1.593e-02, 5.309e-03, 1.297e-02, -4.626e-03, -2.908e-02, 3.458e-02, 2.192e-02)); + r += mul(s6_7, M4(-5.627e-02, 2.994e-02, 6.623e-03, 4.265e-03, -3.984e-03, 7.208e-02, 6.464e-03, -4.584e-02, 1.076e-01, 1.804e-02, 1.932e-03, -6.164e-04, -6.080e-03, -2.187e-02, 2.705e-03, 1.286e-02)); + r += mul(s6_8, M4(-1.513e-02, -2.513e-02, 4.140e-03, 2.426e-02, 5.146e-02, 1.706e-02, 7.609e-03, 5.859e-03, 8.542e-03, 1.324e-02, -1.776e-02, -5.070e-02, -2.553e-02, 8.175e-03, -1.150e-03, 9.181e-03)); + r += mul(s7_0, M4(-3.418e-02, -6.199e-02, 2.500e-02, 1.762e-02, -4.787e-04, -1.350e-02, 2.896e-02, -2.513e-02, 1.715e-02, 9.849e-02, 9.936e-03, -1.941e-02, 1.119e-02, 5.483e-02, 1.483e-02, -9.959e-03)); + r += mul(s7_1, M4(-2.115e-02, -5.361e-03, -6.951e-02, -2.643e-02, 7.225e-02, 1.490e-01, -2.051e-02, -2.152e-01, -1.302e-02, 1.838e-01, -5.824e-03, 9.439e-02, -4.313e-02, -5.206e-03, -5.797e-03, -1.539e-02)); + r += mul(s7_2, M4(3.885e-02, 1.548e-02, -3.074e-02, -8.288e-02, 8.367e-02, -1.723e-02, 6.387e-02, -5.094e-02, -2.516e-02, -9.869e-03, -3.897e-02, 1.550e-02, 3.287e-03, 4.700e-02, 1.602e-02, 1.415e-01)); + r += mul(s7_3, M4(7.152e-02, 1.291e-02, -4.047e-02, -5.024e-03, 8.264e-03, -2.978e-02, 1.805e-02, 2.057e-02, 1.471e-02, 4.593e-02, -4.297e-03, 8.084e-03, -2.278e-02, -2.440e-02, -8.421e-02, -2.865e-02)); + r += mul(s7_4, M4(-1.690e-02, -6.615e-02, -4.751e-02, -5.177e-02, 7.508e-02, 1.110e-01, -5.521e-02, 1.004e-01, 3.390e-02, 4.147e-01, -4.732e-02, 2.533e-01, 2.246e-03, -1.897e-01, -4.463e-02, -1.165e-01)); + r += mul(s7_5, M4(-1.400e-02, 2.606e-02, -1.921e-02, 8.409e-02, -1.727e-01, -1.105e-01, -4.348e-02, 1.222e-01, -5.675e-03, 4.957e-02, -4.451e-03, 3.969e-02, -3.335e-02, -1.468e-01, -2.498e-02, 4.853e-02)); + r += mul(s7_6, M4(-2.972e-02, 1.554e-02, 8.900e-03, -1.799e-02, 1.196e-02, 3.115e-02, -1.041e-02, -1.689e-02, 6.761e-03, 2.227e-02, 8.203e-03, 8.347e-03, 4.691e-02, -5.568e-02, 1.686e-02, 2.405e-02)); + r += mul(s7_7, M4(9.098e-03, 4.191e-02, 1.316e-02, -1.388e-02, 5.256e-02, 1.206e-01, 2.180e-02, -7.718e-03, -1.895e-02, 5.764e-02, 1.609e-02, -5.554e-03, 3.754e-02, -7.394e-02, -7.340e-03, -6.948e-03)); + r += mul(s7_8, M4(2.982e-02, -4.833e-03, 7.510e-03, -3.615e-02, 1.915e-02, 4.432e-02, 8.503e-03, -5.412e-03, -6.377e-03, 2.350e-02, -3.145e-03, -4.699e-02, -2.206e-02, -1.076e-02, -1.340e-02, -2.481e-02)); + r += V4(-2.186e-03, -5.805e-03, 2.543e-03, 1.149e-03); + return r; +} + +V4 f2(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-1.403e-02, -1.690e-02, 1.299e-02, 3.203e-03, 2.440e-02, -1.197e-02, -1.009e-02, -6.249e-02, 1.807e-02, 4.913e-02, -4.275e-03, -8.835e-03, 6.496e-02, 8.654e-02, 1.910e-03, 1.207e-01)); + r += mul(s0_1, M4(5.920e-03, -1.504e-02, 1.881e-03, -9.575e-04, -5.896e-04, 1.827e-01, 9.696e-03, 7.658e-02, -1.416e-03, 7.247e-02, -6.856e-02, -5.048e-02, 5.380e-02, -1.966e-01, 4.374e-02, 1.527e-03)); + r += mul(s0_2, M4(1.538e-03, -2.058e-02, 2.313e-02, -7.205e-03, -2.522e-02, -6.646e-02, -6.501e-03, -3.213e-03, 1.374e-02, -3.847e-02, 2.466e-02, -2.767e-04, -1.093e-02, 1.194e-04, -5.333e-03, -2.761e-03)); + r += mul(s0_3, M4(1.686e-02, 5.654e-03, -1.679e-02, 3.514e-02, 6.360e-03, 3.797e-02, 1.691e-02, 5.090e-02, -3.749e-02, -1.215e-02, -2.332e-02, -4.429e-02, 3.758e-02, -1.332e-01, 4.014e-03, 1.573e-02)); + r += mul(s0_4, M4(-6.120e-02, -1.186e-02, 1.148e-02, -2.868e-03, -7.267e-02, 3.952e-01, -3.060e-01, 1.900e-02, -1.422e-02, -6.225e-02, 1.324e-01, 1.330e-01, -2.278e-01, -7.845e-02, 1.004e-01, -3.004e-03)); + r += mul(s0_5, M4(1.674e-02, 7.387e-03, -2.501e-03, 5.247e-03, -1.203e-01, 5.827e-02, -6.139e-02, 4.977e-03, -1.665e-01, -4.193e-02, 3.967e-02, 4.625e-02, -3.007e-02, 2.687e-02, -1.890e-01, 8.096e-02)); + r += mul(s0_6, M4(1.294e-02, 1.304e-02, 1.941e-02, 5.546e-03, -1.190e-02, -3.708e-02, 7.536e-03, -1.192e-02, -2.948e-03, 1.828e-02, 2.791e-02, -4.490e-02, -8.575e-03, 1.167e-03, 7.475e-03, 1.347e-02)); + r += mul(s0_7, M4(-3.207e-02, 3.181e-02, -6.068e-02, 2.886e-02, -2.113e-02, 1.308e-02, 2.800e-02, 3.551e-02, -1.551e-02, -3.550e-03, 1.875e-02, -3.930e-02, 1.351e-02, 2.954e-02, -9.125e-03, 4.094e-02)); + r += mul(s0_8, M4(-1.797e-02, -6.222e-03, 1.149e-02, -1.110e-02, 6.957e-03, -1.365e-02, 3.144e-03, 1.116e-02, -2.026e-02, 3.616e-02, -4.472e-02, -5.475e-03, 5.175e-03, -4.265e-02, -2.606e-02, -1.281e-03)); + r += mul(s1_0, M4(-2.377e-02, -1.403e-02, 3.900e-04, -8.035e-03, 6.275e-03, -3.050e-03, -1.774e-03, 3.272e-02, 1.894e-02, -3.193e-02, -1.214e-02, -3.307e-02, 1.437e-02, 4.558e-02, -5.583e-03, 3.869e-02)); + r += mul(s1_1, M4(1.842e-02, -8.569e-03, 1.108e-02, -5.062e-03, -5.962e-02, -1.085e-01, 6.689e-02, -5.252e-02, 4.097e-02, 2.783e-02, -2.389e-02, 1.015e-01, -2.116e-02, 7.249e-02, -4.569e-02, -8.347e-02)); + r += mul(s1_2, M4(-8.921e-03, 6.302e-03, -1.726e-02, -2.883e-02, 2.381e-02, 3.157e-02, 5.104e-03, 4.095e-02, -1.652e-02, -5.781e-03, -1.703e-02, -4.506e-02, 3.096e-02, 3.062e-02, -2.861e-02, 4.570e-02)); + r += mul(s1_3, M4(3.239e-02, -2.966e-02, -4.143e-02, -9.498e-02, 4.698e-02, 5.041e-02, 4.006e-02, -1.036e-02, -2.415e-02, 5.212e-02, 5.013e-03, 6.275e-02, -6.031e-03, 2.356e-02, -8.598e-03, 4.139e-02)); + r += mul(s1_4, M4(5.942e-02, -1.007e-01, 2.275e-02, -1.153e-01, -7.684e-02, 1.358e-01, -1.941e-01, 7.818e-02, -1.434e-01, -2.566e-02, 7.518e-02, 3.408e-01, -5.866e-02, 5.014e-02, 2.169e-02, 5.445e-02)); + r += mul(s1_5, M4(3.588e-02, 2.354e-02, 1.821e-03, -2.777e-02, -1.232e-02, 3.485e-03, 2.677e-02, -4.053e-02, 9.010e-02, 2.494e-02, -4.014e-02, 2.349e-02, 3.918e-02, -6.701e-03, -4.987e-02, -2.935e-02)); + r += mul(s1_6, M4(-2.898e-03, 1.400e-02, 2.918e-02, -5.003e-02, -1.320e-02, -4.515e-03, 3.208e-03, -2.984e-02, 4.325e-03, 1.145e-02, 1.401e-02, -4.900e-02, 1.295e-02, 1.852e-02, -1.632e-04, 5.149e-03)); + r += mul(s1_7, M4(2.847e-02, 8.097e-05, -6.482e-02, -3.287e-02, 2.657e-02, 7.181e-02, -1.687e-02, 2.339e-02, -5.849e-02, 5.947e-02, 1.580e-02, -2.197e-02, -1.386e-02, 7.761e-03, 1.187e-02, -1.775e-03)); + r += mul(s1_8, M4(-2.004e-02, 1.634e-02, -2.024e-02, -2.733e-04, -3.457e-02, -2.186e-02, -8.031e-03, -8.043e-04, 3.190e-02, -4.545e-03, -4.383e-03, -4.025e-02, -1.792e-02, -1.601e-02, -1.268e-02, 1.806e-02)); + r += mul(s2_0, M4(1.513e-02, 2.842e-02, -3.138e-02, 2.632e-02, -4.687e-02, 1.712e-04, -8.254e-03, -1.088e-01, 4.773e-02, 2.275e-01, 2.114e-02, -5.353e-03, -6.060e-03, 4.668e-02, -1.113e-02, -5.220e-02)); + r += mul(s2_1, M4(-4.822e-02, 5.140e-02, -6.251e-02, -2.174e-02, 6.402e-02, -1.157e-03, 4.772e-02, 3.744e-02, -8.134e-02, 2.443e-01, -1.516e-01, -2.051e-01, 3.214e-02, -1.325e-01, -1.257e-02, -1.309e-01)); + r += mul(s2_2, M4(2.891e-02, -1.136e-02, 1.066e-02, 1.125e-02, 5.477e-02, 1.702e-02, -4.648e-03, -3.087e-02, -1.364e-01, 4.794e-02, 9.983e-04, 6.055e-02, 6.746e-02, 4.293e-02, -7.007e-02, -7.499e-02)); + r += mul(s2_3, M4(1.072e-01, -6.466e-02, -1.973e-02, 1.030e-01, -1.527e-02, 4.362e-02, -4.451e-02, 1.481e-02, -1.033e-02, -5.968e-03, -8.813e-03, -3.673e-02, 8.713e-03, 4.114e-02, 1.480e-02, -2.310e-02)); + r += mul(s2_4, M4(-2.133e-01, -1.865e-02, 1.325e-01, -6.998e-03, 1.527e-02, -1.194e-01, 1.117e-02, 2.825e-02, -1.395e-01, -5.398e-02, -8.579e-02, 5.018e-02, 2.483e-01, -3.317e-04, -4.582e-02, -1.580e-01)); + r += mul(s2_5, M4(-2.050e-01, 3.415e-02, -2.992e-01, -4.628e-02, -2.045e-02, -4.760e-02, 2.570e-02, -1.789e-02, 3.450e-02, 4.739e-02, -5.818e-02, -3.416e-03, 6.491e-02, -1.692e-02, 5.092e-02, -1.269e-03)); + r += mul(s2_6, M4(5.677e-03, 2.475e-02, -2.882e-02, 4.985e-02, 4.226e-02, 2.465e-02, 1.665e-02, 1.778e-02, -1.488e-02, 8.427e-03, 7.982e-03, 4.308e-03, -2.665e-03, -2.505e-03, -2.439e-04, -8.472e-02)); + r += mul(s2_7, M4(1.160e-01, -1.843e-01, -1.577e-01, 1.610e-01, -3.755e-02, -5.904e-02, -3.916e-02, -7.304e-02, -6.454e-03, -4.502e-03, -1.938e-02, -1.544e-02, 9.156e-02, 5.040e-02, 2.782e-02, -9.789e-02)); + r += mul(s2_8, M4(-2.775e-02, 4.488e-02, -1.165e-01, -5.318e-02, 9.845e-03, -1.098e-02, 1.870e-02, -5.903e-03, 1.401e-02, -1.890e-03, -4.127e-03, -3.702e-02, 2.593e-02, 7.027e-04, 7.886e-03, -3.557e-02)); + r += mul(s3_0, M4(1.291e-02, 3.182e-02, -1.102e-02, -2.050e-02, 4.529e-02, 4.164e-02, -8.264e-03, 1.008e-02, -4.363e-03, 1.615e-02, -2.964e-02, -5.398e-03, -4.292e-02, -4.069e-02, 1.873e-02, -1.873e-02)); + r += mul(s3_1, M4(2.319e-02, 6.311e-03, -2.371e-02, 2.499e-02, -8.716e-02, 8.744e-03, 6.422e-03, -4.807e-02, 5.915e-02, -2.334e-04, 3.317e-02, 5.564e-04, 2.568e-02, 7.700e-03, -4.957e-02, -3.943e-02)); + r += mul(s3_2, M4(-6.014e-02, 2.336e-02, -3.495e-02, -4.863e-02, 1.457e-02, 4.577e-02, -2.609e-02, 4.501e-03, -3.028e-03, -2.968e-02, 1.283e-02, 1.761e-02, 3.232e-02, -2.981e-02, 3.126e-02, 3.211e-02)); + r += mul(s3_3, M4(5.939e-02, 3.790e-02, -2.935e-03, 1.023e-02, 3.549e-02, -3.577e-02, -3.997e-02, 7.911e-02, -2.807e-02, -2.543e-02, -1.237e-02, -1.489e-03, -7.716e-02, 5.463e-02, -1.140e-02, -1.054e-01)); + r += mul(s3_4, M4(1.049e-02, -8.659e-02, 1.828e-02, 3.782e-02, -1.330e-01, -1.978e-01, 1.279e-01, -7.684e-02, 1.022e-02, -5.645e-02, 3.045e-02, -1.374e-02, 5.891e-02, 5.058e-05, 5.187e-02, 2.808e-02)); + r += mul(s3_5, M4(-8.350e-02, -8.552e-02, 1.150e-01, 6.334e-02, 5.096e-03, -3.212e-02, 7.190e-04, 3.291e-02, -1.503e-02, 1.068e-02, 1.800e-02, -2.819e-02, -6.397e-03, 4.068e-02, -7.728e-02, 9.243e-02)); + r += mul(s3_6, M4(2.811e-02, -3.419e-02, 9.763e-03, 3.038e-02, 4.606e-02, 6.689e-02, -7.211e-03, -3.238e-03, 7.453e-03, -4.438e-03, 4.286e-03, -1.259e-02, 2.434e-02, 1.957e-02, 1.739e-02, -3.466e-02)); + r += mul(s3_7, M4(-2.912e-02, 4.566e-02, 2.812e-02, 6.141e-02, 2.646e-02, 1.708e-02, -9.021e-02, -6.151e-02, 1.318e-02, -2.526e-02, -6.394e-03, -3.100e-02, -3.370e-02, 2.925e-02, -1.284e-02, -2.997e-02)); + r += mul(s3_8, M4(-1.161e-02, -3.455e-02, -2.899e-02, 8.177e-04, -1.710e-02, 1.641e-02, 1.267e-02, 1.571e-03, 9.097e-04, -1.243e-02, -1.539e-02, 8.939e-03, 3.341e-02, 1.295e-02, -2.326e-03, -5.243e-02)); + r += mul(s4_0, M4(-4.412e-03, 1.828e-02, -1.095e-02, -2.410e-02, 2.840e-02, 3.710e-02, -3.585e-02, 4.476e-02, 2.330e-03, 1.955e-03, 8.971e-03, -1.877e-02, 9.953e-04, -1.743e-02, 3.433e-03, -2.462e-02)); + r += mul(s4_1, M4(-1.554e-02, -2.013e-02, 2.762e-04, 3.799e-02, -5.711e-02, -2.065e-01, 1.722e-02, 8.711e-04, 2.270e-02, 1.405e-02, -4.327e-02, -1.802e-02, 1.177e-02, 3.746e-02, -4.345e-02, 1.503e-01)); + r += mul(s4_2, M4(-1.062e-02, -3.258e-02, 1.399e-02, -8.539e-03, -1.272e-02, -5.984e-03, 4.600e-02, 7.976e-02, -9.065e-03, -9.190e-03, -7.083e-03, 3.493e-02, 1.741e-02, -4.484e-02, 2.416e-02, -5.574e-02)); + r += mul(s4_3, M4(1.711e-02, -1.917e-02, 1.507e-02, 1.370e-02, -3.999e-02, -1.430e-02, -2.882e-02, -4.323e-02, 2.306e-02, 2.904e-02, 2.624e-02, 1.199e-01, 1.480e-02, -7.574e-02, -4.492e-02, -4.352e-02)); + r += mul(s4_4, M4(-3.018e-02, -1.425e-02, -1.949e-02, 2.164e-02, 1.122e-01, -1.606e-02, 7.957e-02, 4.065e-02, -1.238e-01, -6.310e-02, 8.791e-02, 3.338e-02, -1.513e-01, 2.885e-01, 1.534e-01, 1.775e-02)); + r += mul(s4_5, M4(-4.428e-02, -1.291e-02, 5.516e-03, 3.881e-02, -2.859e-02, 3.528e-02, -6.541e-02, -5.225e-03, 5.673e-02, 2.624e-02, 2.976e-02, 5.959e-03, -1.149e-02, 1.513e-01, -2.427e-01, 1.607e-01)); + r += mul(s4_6, M4(-9.989e-03, 5.560e-03, 3.646e-03, 2.434e-02, 9.529e-03, 4.031e-02, -2.572e-02, -3.478e-02, -3.300e-02, -1.053e-01, 4.016e-02, 5.015e-02, -1.599e-02, 2.333e-02, -4.798e-02, 5.170e-02)); + r += mul(s4_7, M4(-5.325e-02, 1.108e-02, 1.797e-02, -6.959e-03, 1.219e-02, 2.704e-02, 1.240e-02, 3.468e-02, -6.517e-02, -3.558e-02, 7.436e-02, -1.016e-02, -1.981e-02, -7.618e-02, -8.978e-02, -2.096e-02)); + r += mul(s4_8, M4(-2.308e-03, -3.165e-02, -8.688e-03, -9.730e-03, -1.522e-02, 2.069e-02, -1.754e-02, -7.927e-03, 2.645e-02, -1.085e-02, -8.390e-03, -2.116e-02, -3.234e-02, 1.489e-02, 3.660e-03, 2.375e-03)); + r += mul(s5_0, M4(-3.510e-02, -6.012e-04, -3.174e-02, -1.242e-02, 1.226e-02, 1.917e-02, -3.964e-02, -2.023e-02, -2.311e-02, 6.712e-03, 1.517e-02, 9.062e-02, 8.459e-03, 1.153e-02, -8.272e-03, -5.246e-03)); + r += mul(s5_1, M4(8.618e-02, -8.955e-02, 5.913e-02, -1.343e-01, 1.315e-01, 4.682e-02, -2.247e-02, -3.938e-02, -1.179e-01, -5.145e-02, 5.443e-02, 3.886e-02, -5.119e-02, -3.541e-02, -3.904e-03, 1.687e-02)); + r += mul(s5_2, M4(2.460e-02, -8.600e-02, 4.964e-02, 1.386e-01, 2.402e-02, -2.157e-02, 2.303e-02, -3.927e-02, -5.104e-02, -7.479e-03, -4.165e-02, -2.199e-02, -2.173e-03, -6.519e-02, 7.790e-02, 4.227e-02)); + r += mul(s5_3, M4(-3.211e-02, 5.888e-02, 1.003e-02, -4.182e-03, -2.656e-02, -9.108e-02, -2.803e-02, -3.697e-02, 3.665e-02, -4.259e-03, 2.178e-02, 1.014e-01, -4.813e-02, -9.389e-03, -3.660e-02, 1.633e-02)); + r += mul(s5_4, M4(-5.209e-02, 3.928e-01, -6.218e-02, 4.783e-02, 9.125e-02, -1.971e-01, 1.959e-01, -2.692e-02, -3.901e-01, -3.436e-01, 3.787e-01, -1.215e-01, 6.860e-02, -6.028e-03, 6.013e-02, -5.339e-02)); + r += mul(s5_5, M4(2.825e-01, 3.197e-01, -4.535e-01, 2.451e-01, -2.704e-02, 2.347e-02, -3.970e-02, 3.455e-02, -4.792e-02, -6.546e-02, 8.310e-02, 5.270e-02, 5.672e-02, -5.222e-03, -1.584e-02, 2.659e-02)); + r += mul(s5_6, M4(-2.092e-03, 3.342e-02, -5.297e-02, -4.897e-03, 1.136e-02, 1.686e-02, 1.156e-02, 1.235e-02, -5.949e-02, -7.796e-02, 3.761e-02, -7.960e-02, -1.237e-02, -6.790e-02, 3.845e-02, 9.075e-03)); + r += mul(s5_7, M4(-9.697e-02, -1.451e-02, -7.202e-05, 1.720e-02, 3.105e-02, -4.131e-02, -1.384e-02, -1.688e-02, -4.193e-02, 1.140e-02, -4.853e-02, 4.692e-02, -6.361e-02, 1.024e-01, -1.936e-02, -1.864e-02)); + r += mul(s5_8, M4(2.417e-01, -5.670e-02, -2.683e-02, 1.479e-01, 1.790e-02, 1.712e-02, -4.796e-03, 5.586e-03, 1.011e-02, 7.180e-03, 2.503e-02, 7.192e-03, 1.102e-01, 5.415e-02, -9.293e-02, -7.912e-02)); + r += mul(s6_0, M4(-1.310e-02, -1.998e-02, 2.870e-02, -8.365e-03, 1.781e-02, 8.472e-02, 1.358e-02, 1.241e-02, -2.426e-02, -4.126e-02, -1.173e-02, -1.491e-02, -4.943e-02, -3.414e-03, -3.452e-02, -2.191e-02)); + r += mul(s6_1, M4(4.033e-02, -5.505e-03, 2.442e-02, 3.121e-02, -5.878e-02, 4.726e-02, -1.153e-01, 2.513e-02, 6.441e-02, -9.327e-04, 3.285e-02, 3.715e-02, -3.968e-02, -1.051e-02, -2.114e-02, 2.643e-02)); + r += mul(s6_2, M4(7.410e-03, 5.971e-02, -1.034e-02, -7.923e-02, -1.158e-02, -5.324e-02, 2.883e-02, 1.165e-01, -4.792e-02, -2.314e-02, -3.930e-03, -4.429e-02, -1.138e-02, -5.562e-03, -2.705e-02, 6.022e-03)); + r += mul(s6_3, M4(3.052e-02, 4.170e-02, -2.362e-02, 8.131e-02, 1.667e-02, -6.426e-02, -1.831e-02, -6.213e-02, -3.947e-02, 1.147e-01, -2.621e-02, -7.330e-03, -2.931e-02, -7.846e-03, -7.073e-03, -7.834e-02)); + r += mul(s6_4, M4(-8.755e-02, 2.748e-02, -1.013e-02, 1.164e-01, 3.070e-02, -2.129e-02, 3.427e-02, 2.312e-02, 2.883e-01, 1.168e-01, -9.151e-02, 5.790e-03, -1.971e-01, -7.913e-02, 1.532e-01, 9.796e-02)); + r += mul(s6_5, M4(4.299e-02, -3.184e-02, 7.484e-03, -9.968e-02, 3.603e-03, 9.438e-02, -1.002e-01, 2.020e-02, 1.727e-02, 2.998e-02, 1.908e-03, -3.632e-02, -1.007e-01, -3.760e-02, -1.044e-02, 5.097e-02)); + r += mul(s6_6, M4(-4.278e-03, -3.464e-03, -1.115e-02, 3.740e-02, -6.866e-03, 1.981e-02, -4.597e-03, -7.353e-03, 7.228e-03, -2.904e-02, -1.460e-02, -6.438e-02, -2.136e-02, -2.832e-02, 6.746e-03, -7.435e-02)); + r += mul(s6_7, M4(-7.721e-03, -8.583e-03, -2.239e-02, -4.383e-02, 5.328e-02, -2.903e-02, -3.415e-02, 2.400e-02, 5.608e-02, -6.022e-03, 5.820e-02, -5.756e-02, 9.681e-04, 3.779e-02, 4.654e-02, 2.699e-02)); + r += mul(s6_8, M4(6.099e-02, 2.623e-02, -2.629e-02, -2.693e-02, -8.624e-03, 7.311e-03, 1.022e-02, 2.943e-02, 3.370e-02, 2.451e-02, -2.233e-02, -1.465e-02, -1.173e-02, 1.131e-02, 5.762e-06, -7.292e-03)); + r += mul(s7_0, M4(8.332e-02, 7.678e-02, 7.580e-03, 1.804e-03, -7.609e-03, 3.395e-02, 4.078e-02, 2.980e-02, -1.210e-02, -3.697e-02, -3.218e-03, 5.016e-03, -6.317e-02, 8.456e-03, -4.200e-04, -7.168e-02)); + r += mul(s7_1, M4(-3.934e-02, 1.361e-02, -7.507e-02, 6.378e-02, -1.096e-01, 1.727e-02, -1.115e-01, -7.854e-03, 6.183e-03, 5.731e-03, -6.347e-03, 1.489e-02, 6.840e-02, -4.007e-03, -9.997e-03, 3.514e-02)); + r += mul(s7_2, M4(4.943e-02, 3.648e-03, 7.915e-03, -1.559e-02, -2.015e-01, -4.453e-02, -2.992e-03, 1.325e-02, 4.230e-02, -3.058e-02, -8.181e-04, 5.134e-04, -4.491e-02, -3.514e-02, -3.413e-03, 1.651e-02)); + r += mul(s7_3, M4(1.072e-02, 5.109e-02, -4.012e-02, 5.480e-04, 1.733e-02, -3.440e-02, -1.915e-02, -1.607e-02, -2.231e-02, 1.018e-02, 1.327e-02, 6.020e-02, 4.541e-02, 6.761e-02, 3.457e-02, -3.275e-02)); + r += mul(s7_4, M4(-1.640e-01, 1.440e-02, 5.193e-02, 1.382e-01, 6.455e-02, 1.126e-01, -9.477e-02, 6.182e-02, 2.558e-02, 3.332e-01, -7.944e-02, -1.218e-01, 2.038e-01, -3.560e-02, -1.784e-01, 4.907e-02)); + r += mul(s7_5, M4(-1.175e-03, 6.281e-02, -4.109e-02, 1.431e-02, -1.255e-01, 8.339e-02, -1.665e-02, -1.578e-02, -6.914e-02, -2.823e-02, -5.028e-02, 3.387e-02, -7.128e-02, 3.301e-02, 3.751e-02, 1.426e-02)); + r += mul(s7_6, M4(2.105e-02, 1.378e-02, -5.892e-03, 4.059e-02, -1.739e-02, -1.169e-02, 1.199e-02, 2.551e-02, -9.290e-03, -2.204e-02, -1.168e-02, -2.180e-02, -2.759e-02, -4.014e-02, 1.618e-02, -8.665e-02)); + r += mul(s7_7, M4(-5.288e-02, 4.240e-02, -6.100e-02, 3.484e-02, 6.646e-02, -3.599e-02, -1.280e-02, -5.046e-02, 1.113e-02, -1.903e-02, 4.971e-02, -6.456e-03, 1.147e-01, 2.411e-02, 5.515e-02, -1.526e-02)); + r += mul(s7_8, M4(6.872e-02, 1.276e-02, -1.522e-02, 2.267e-03, -3.264e-02, -3.042e-02, 6.525e-03, 3.154e-02, 5.193e-02, 3.588e-03, -3.750e-02, -3.729e-02, -6.051e-03, 3.412e-03, -8.244e-03, -2.269e-02)); + r += V4(-3.695e-03, -2.757e-03, 3.166e-03, 9.638e-04); + return r; +} + +V4 f3(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-6.092e-02, 1.339e-02, -4.554e-03, -1.395e-02, -4.689e-03, 1.342e-02, 1.254e-02, -5.389e-03, -2.701e-03, -7.961e-03, 3.034e-02, 4.658e-02, 4.680e-02, -1.012e-02, 2.197e-02, 1.284e-01)); + r += mul(s0_1, M4(-1.607e-02, 3.157e-04, -3.379e-02, 4.748e-02, 3.269e-01, -5.248e-02, -3.816e-02, -4.362e-02, 6.960e-02, -2.778e-02, 1.179e-01, -2.154e-02, 3.771e-02, 1.121e-01, 8.252e-02, -2.881e-01)); + r += mul(s0_2, M4(-2.736e-02, 1.314e-02, 3.129e-02, 2.014e-02, 3.678e-02, 1.444e-02, 8.184e-03, -9.470e-02, 3.379e-02, -5.792e-03, 2.617e-02, -3.427e-02, -2.049e-01, -1.673e-02, -2.069e-02, 5.914e-02)); + r += mul(s0_3, M4(5.289e-03, -2.656e-04, -1.474e-02, 1.589e-02, 8.334e-02, -7.580e-02, 8.112e-02, 4.596e-02, 8.272e-02, 3.640e-02, -4.519e-03, -2.104e-02, -9.967e-02, 9.191e-02, 1.247e-01, -5.016e-03)); + r += mul(s0_4, M4(-2.227e-01, -4.817e-02, 4.974e-02, 3.682e-03, 1.109e-01, 1.803e-01, 1.511e-01, -1.226e-01, 3.325e-03, 4.576e-02, -1.119e-01, 2.615e-02, -1.788e-01, -3.027e-01, 6.403e-02, -6.056e-02)); + r += mul(s0_5, M4(5.268e-02, 9.762e-03, -4.245e-02, 1.849e-02, -1.549e-02, -2.268e-02, 7.592e-02, 3.212e-02, -2.411e-02, 3.668e-02, -7.544e-02, -4.866e-04, 5.589e-02, -2.498e-02, 1.852e-02, -9.691e-02)); + r += mul(s0_6, M4(5.347e-02, 7.022e-03, 1.116e-02, 2.763e-02, -1.022e-02, -5.476e-03, 2.628e-03, -1.506e-03, 2.884e-02, 4.020e-02, -7.338e-03, 2.429e-02, 3.548e-02, 9.521e-03, 1.640e-02, 3.307e-03)); + r += mul(s0_7, M4(1.294e-01, 1.416e-02, 2.088e-02, 5.070e-03, 6.003e-02, 8.699e-02, -4.962e-03, -1.115e-02, -9.649e-03, 8.960e-02, -2.227e-02, -6.014e-03, 2.850e-02, 4.964e-02, -4.095e-02, 1.140e-02)); + r += mul(s0_8, M4(8.239e-03, -1.648e-02, 8.895e-03, 1.556e-02, -1.977e-03, 4.565e-03, -6.811e-03, 3.908e-04, -2.284e-02, -2.758e-02, -4.311e-03, -3.926e-03, -1.034e-02, -4.269e-02, -1.208e-02, 2.784e-03)); + r += mul(s1_0, M4(-2.469e-02, 1.714e-02, 8.543e-05, -5.085e-02, -1.303e-02, -3.196e-02, -2.564e-02, 6.273e-04, 7.077e-03, -3.943e-02, 3.150e-02, 2.382e-02, -1.410e-02, 2.598e-02, -2.507e-02, -2.179e-03)); + r += mul(s1_1, M4(3.810e-02, 4.908e-03, 1.884e-02, 1.513e-01, -1.236e-01, 2.266e-02, 1.428e-01, 3.874e-03, 4.718e-02, -8.402e-03, 1.354e-01, -1.199e-01, 1.073e-01, 3.814e-02, 1.159e-01, -7.765e-02)); + r += mul(s1_2, M4(1.599e-02, 2.881e-03, 2.173e-02, -1.978e-03, 6.860e-02, 1.676e-03, 3.226e-02, -4.287e-02, -1.956e-02, -1.512e-03, -1.690e-02, 2.575e-02, -7.158e-02, -3.975e-02, -5.693e-02, -1.984e-02)); + r += mul(s1_3, M4(-5.212e-02, -1.270e-02, -2.785e-02, 2.345e-03, 2.414e-03, -5.106e-03, 7.129e-02, 3.647e-03, 1.405e-01, 1.130e-01, -4.176e-02, 2.924e-02, -9.127e-03, -1.925e-02, 6.571e-03, -3.509e-02)); + r += mul(s1_4, M4(-3.083e-01, -5.015e-02, 1.360e-01, 1.230e-03, 7.366e-02, -6.510e-02, 8.663e-02, 5.433e-02, 5.167e-02, 1.388e-01, -6.000e-02, 5.815e-03, 1.775e-02, -3.996e-02, -3.119e-02, -2.133e-02)); + r += mul(s1_5, M4(8.512e-03, -2.324e-02, -3.587e-02, 2.867e-02, -1.335e-02, 1.153e-02, 5.781e-02, -7.299e-02, 9.194e-02, 5.748e-03, 3.511e-02, 2.288e-02, -3.146e-02, -9.689e-03, 6.297e-02, -4.233e-02)); + r += mul(s1_6, M4(3.845e-02, 5.955e-02, -3.526e-02, 1.363e-02, -4.100e-02, 1.820e-02, -1.857e-02, 4.804e-03, 2.709e-02, 4.436e-02, 1.196e-02, 4.346e-02, -3.318e-02, -2.132e-02, 2.696e-02, -1.101e-02)); + r += mul(s1_7, M4(5.951e-02, -7.423e-02, 3.198e-02, -8.567e-03, 1.034e-01, 5.462e-02, -5.424e-02, 2.838e-02, -8.256e-02, -1.197e-01, -3.751e-02, -9.126e-03, 5.554e-03, -1.258e-02, -2.857e-02, -3.262e-02)); + r += mul(s1_8, M4(3.627e-03, -5.324e-02, 1.199e-02, -8.622e-04, 2.323e-02, 2.939e-02, -1.582e-02, -6.721e-04, -2.331e-02, -2.138e-02, 7.226e-04, -2.562e-04, 6.237e-03, -1.082e-02, -5.595e-03, -2.109e-03)); + r += mul(s2_0, M4(2.653e-02, -1.926e-02, 1.199e-02, 9.048e-02, 5.699e-02, -1.210e-02, 8.090e-02, -2.781e-02, -1.199e-01, 4.468e-02, -8.449e-02, -8.375e-02, 5.640e-02, 1.763e-02, 1.440e-02, -2.498e-02)); + r += mul(s2_1, M4(-1.279e-01, 2.318e-02, -7.002e-02, -7.665e-02, 1.274e-01, -2.412e-02, -1.367e-02, 1.274e-02, 2.671e-01, -4.063e-02, -8.018e-02, -1.074e-01, 1.408e-02, -8.455e-03, -5.504e-02, -9.651e-02)); + r += mul(s2_2, M4(-2.118e-01, -2.689e-02, 5.992e-02, -1.555e-02, 5.128e-03, 2.630e-03, 2.998e-03, -3.045e-03, -5.662e-03, 1.739e-03, 6.779e-03, 1.238e-01, 1.021e-01, -6.391e-02, 1.074e-02, -2.479e-02)); + r += mul(s2_3, M4(-1.237e-01, -1.143e-01, 1.900e-02, 1.004e-01, -8.614e-02, -6.276e-02, -1.237e-01, -7.810e-02, -1.022e-01, -3.045e-02, 5.377e-03, -3.440e-03, 1.157e-01, 4.332e-02, 1.922e-02, 4.073e-02)); + r += mul(s2_4, M4(4.169e-01, -2.430e-02, 1.544e-01, -2.009e-02, -2.080e-01, 1.991e-03, -8.177e-02, 3.955e-02, -8.963e-02, -2.454e-01, -2.471e-03, -5.004e-02, 1.816e-01, -2.853e-01, -1.108e-01, -2.023e-02)); + r += mul(s2_5, M4(1.104e-01, -1.946e-02, -9.055e-02, -7.604e-02, 3.566e-02, 3.569e-02, 1.540e-03, 3.796e-02, 2.840e-02, 5.791e-02, -4.812e-03, 1.310e-02, -1.732e-02, -5.084e-03, 1.198e-03, 7.456e-03)); + r += mul(s2_6, M4(1.001e-01, 7.259e-02, -4.347e-02, 6.588e-03, 9.344e-02, -2.240e-02, 5.820e-02, 2.779e-02, 2.240e-02, 3.854e-02, -2.927e-02, 1.077e-02, -2.607e-02, -2.483e-02, 1.267e-02, 7.444e-03)); + r += mul(s2_7, M4(-1.756e-01, -3.373e-01, 1.279e-01, 1.143e-02, -4.817e-02, 4.807e-03, 6.882e-02, -7.765e-02, 7.232e-03, -1.424e-02, 1.421e-02, -1.518e-02, -4.488e-02, 8.130e-02, 2.393e-03, 1.352e-02)); + r += mul(s2_8, M4(-3.442e-02, -1.452e-01, 2.308e-02, -6.505e-02, -3.899e-02, -1.270e-02, -4.442e-02, 2.083e-02, -2.833e-02, 5.497e-03, 1.044e-02, -2.984e-02, -3.160e-02, 1.488e-02, 1.989e-03, 4.249e-03)); + r += mul(s3_0, M4(7.697e-03, -2.455e-02, 1.960e-02, 2.386e-02, 2.703e-02, 4.728e-04, 3.220e-02, 3.976e-02, 5.094e-02, 1.657e-02, 2.947e-02, 3.609e-02, 2.286e-03, 5.603e-03, -3.366e-03, -6.941e-02)); + r += mul(s3_1, M4(-3.139e-02, 3.118e-02, 5.715e-03, 4.829e-02, 1.522e-01, 3.641e-03, -1.124e-02, -2.385e-02, -2.348e-02, -9.260e-02, 3.022e-03, -2.601e-02, 8.581e-02, -4.490e-02, -9.472e-02, 9.227e-02)); + r += mul(s3_2, M4(1.119e-02, -4.276e-04, -7.717e-02, 2.749e-02, 3.030e-02, -2.482e-02, -8.644e-03, 2.635e-03, 2.281e-02, 3.169e-02, -5.975e-03, 2.119e-02, 3.481e-02, 1.181e-03, 4.729e-02, 8.681e-02)); + r += mul(s3_3, M4(2.554e-02, -4.979e-02, -1.684e-02, 7.986e-02, -2.542e-02, -1.278e-02, -1.498e-02, -2.338e-02, -1.193e-02, 2.727e-02, 4.043e-03, -1.298e-02, 9.618e-02, 5.320e-02, -1.820e-03, -5.392e-03)); + r += mul(s3_4, M4(-4.170e-02, 3.055e-02, 1.440e-01, -8.131e-02, -3.459e-01, -7.154e-02, 9.196e-02, -1.495e-02, -1.284e-01, 9.553e-02, -9.523e-02, 2.806e-02, 3.195e-02, -1.082e-01, -5.087e-02, -5.880e-03)); + r += mul(s3_5, M4(-7.607e-02, -3.552e-02, -2.089e-03, -1.679e-02, 1.089e-02, 3.870e-02, 1.625e-04, 1.265e-02, -2.999e-03, -1.181e-02, -1.651e-02, 1.686e-02, 3.755e-02, 4.108e-03, -7.984e-02, 4.348e-02)); + r += mul(s3_6, M4(-3.543e-02, -1.071e-02, -2.990e-02, 2.091e-03, 1.102e-01, -4.086e-02, 1.002e-02, 4.791e-02, 2.896e-02, -2.758e-02, 1.350e-02, 2.303e-02, 2.593e-02, 3.618e-02, -7.147e-03, 8.067e-03)); + r += mul(s3_7, M4(9.047e-02, 6.579e-02, -3.227e-02, -3.021e-03, 2.239e-02, 1.050e-02, 5.045e-02, -2.806e-02, -2.622e-02, -2.204e-02, 1.993e-02, 1.491e-02, -7.789e-02, -1.594e-02, 3.182e-02, -1.013e-02)); + r += mul(s3_8, M4(-2.664e-02, 6.552e-03, 2.155e-02, -6.864e-02, 9.120e-03, -3.208e-02, 1.887e-03, -4.354e-04, -1.106e-02, 1.752e-02, 2.864e-02, 9.538e-04, -3.001e-02, -3.979e-02, 1.779e-02, 1.888e-02)); + r += mul(s4_0, M4(-3.185e-02, -8.707e-03, 4.138e-02, 1.122e-02, -1.942e-02, -2.564e-02, -5.853e-02, 4.479e-02, 5.085e-02, 2.594e-02, 9.553e-03, -7.572e-06, -2.425e-02, -2.492e-02, 2.955e-03, 3.709e-02)); + r += mul(s4_1, M4(-1.505e-02, 2.215e-02, 2.096e-03, -7.442e-02, -2.422e-01, 8.188e-02, -5.513e-02, -3.617e-02, 1.075e-01, -1.344e-02, -7.358e-02, -1.538e-01, 3.205e-02, -5.018e-02, 1.508e-02, -7.682e-02)); + r += mul(s4_2, M4(-4.506e-02, -8.178e-03, 4.501e-03, -6.760e-03, 3.139e-03, -3.794e-03, 1.589e-03, 7.435e-04, 7.842e-03, -8.196e-03, -1.594e-02, -1.751e-02, -1.772e-01, -1.600e-02, -3.758e-02, 1.123e-01)); + r += mul(s4_3, M4(-1.714e-02, 6.968e-03, 2.990e-03, 1.276e-02, 3.480e-02, -1.006e-03, 3.230e-02, 4.203e-02, 2.386e-02, 1.318e-02, -1.422e-01, 6.164e-02, 2.804e-02, -2.677e-03, 9.084e-02, 3.863e-02)); + r += mul(s4_4, M4(-7.837e-02, -1.313e-02, 4.041e-02, -5.725e-02, 4.064e-02, -1.787e-02, -1.496e-03, -2.503e-02, -1.233e-01, 3.710e-02, 2.943e-03, -8.191e-04, -2.615e-01, 3.901e-01, 4.065e-01, -2.056e-01)); + r += mul(s4_5, M4(-2.254e-02, -8.021e-03, -2.046e-02, 8.472e-03, -5.713e-02, -2.529e-02, 1.694e-02, -2.429e-02, -2.456e-02, 9.997e-04, -2.681e-02, -1.772e-02, 1.567e-01, -1.521e-01, -7.455e-02, 4.456e-02)); + r += mul(s4_6, M4(1.749e-04, 7.458e-03, -2.304e-03, -2.706e-04, 1.273e-02, 1.013e-02, 2.770e-02, -9.043e-03, -8.916e-03, 9.403e-02, 1.837e-02, 1.516e-02, 1.039e-01, 9.260e-03, -6.735e-02, 2.598e-02)); + r += mul(s4_7, M4(1.304e-03, 2.834e-02, -6.175e-02, -2.986e-02, 3.633e-02, 3.645e-02, 7.959e-03, 1.110e-02, -4.079e-02, 7.844e-02, -2.673e-02, 1.087e-02, -3.180e-02, -1.883e-01, 8.895e-02, -1.684e-02)); + r += mul(s4_8, M4(-1.649e-02, 1.449e-02, -4.270e-03, -9.407e-03, -1.764e-02, -4.406e-02, -1.302e-02, 4.296e-03, -1.590e-02, 2.225e-02, 2.974e-02, -2.259e-02, 5.141e-03, -2.828e-02, 1.497e-02, -6.642e-03)); + r += mul(s5_0, M4(4.863e-03, -8.128e-03, 7.881e-02, 2.253e-02, 2.186e-02, -3.181e-02, 4.433e-02, 6.014e-02, -5.438e-02, -3.977e-02, 9.079e-02, 1.664e-01, 3.258e-02, -3.838e-03, 2.394e-02, -7.544e-02)); + r += mul(s5_1, M4(5.463e-02, -1.269e-02, 5.354e-02, -5.412e-02, 2.823e-02, -2.180e-02, -1.627e-01, -2.816e-02, 3.666e-02, -9.861e-03, -4.098e-02, -1.916e-01, -5.313e-02, 3.226e-02, 6.151e-02, -4.472e-02)); + r += mul(s5_2, M4(-1.858e-02, 2.438e-02, -8.904e-02, -8.276e-02, -4.238e-02, 1.803e-03, -2.575e-02, 3.027e-02, 6.873e-02, 2.042e-02, -3.134e-03, -4.847e-02, -7.084e-03, 2.288e-02, -2.983e-02, 3.942e-02)); + r += mul(s5_3, M4(5.432e-04, -1.867e-02, -1.480e-01, -2.152e-02, 2.918e-02, -7.173e-02, 6.171e-02, 4.939e-02, -4.211e-03, 2.114e-01, 7.824e-02, -2.539e-03, -3.472e-02, -2.033e-02, -7.886e-02, 8.806e-04)); + r += mul(s5_4, M4(1.612e-01, -1.711e-01, -2.185e-01, 3.588e-02, -2.282e-01, 1.369e-01, -7.013e-02, -9.328e-02, -1.700e-01, -5.438e-02, -1.002e-01, -1.638e-01, -3.944e-02, 4.242e-02, 9.511e-02, -2.098e-02)); + r += mul(s5_5, M4(2.925e-01, -1.649e-02, -3.357e-01, 3.610e-02, -5.713e-02, -7.204e-02, 3.271e-02, -1.081e-02, -7.453e-02, -1.894e-02, 1.793e-02, 4.783e-02, 1.899e-02, -3.242e-03, -6.474e-02, -1.724e-02)); + r += mul(s5_6, M4(-2.085e-02, 4.713e-04, 8.945e-02, -4.255e-02, 3.323e-02, 2.878e-03, 4.455e-03, 8.880e-03, 1.175e-02, -2.069e-02, 1.593e-02, 7.256e-03, 5.510e-02, 6.245e-02, -1.073e-03, 1.568e-02)); + r += mul(s5_7, M4(-1.434e-01, -4.155e-02, -1.088e-01, -1.304e-02, -2.387e-02, 5.490e-03, -2.673e-03, -3.037e-02, 2.007e-02, 2.010e-01, 7.576e-03, 2.663e-02, -7.244e-02, 1.493e-02, -1.855e-02, -7.471e-03)); + r += mul(s5_8, M4(1.646e-01, 1.502e-02, 1.110e-03, 1.039e-01, -1.581e-02, -6.403e-03, -1.292e-02, -8.818e-04, -2.267e-02, 5.440e-02, 1.540e-02, -3.064e-02, -5.141e-03, -6.073e-02, 1.734e-02, -9.134e-03)); + r += mul(s6_0, M4(-1.421e-02, -3.183e-02, 7.745e-02, 1.166e-01, -2.863e-02, 4.455e-02, -5.321e-02, -1.932e-02, 2.177e-02, -6.390e-04, 7.195e-02, -1.108e-01, -5.191e-02, -6.434e-03, -4.275e-02, -7.569e-02)); + r += mul(s6_1, M4(2.328e-02, -2.048e-02, 1.015e-02, -5.549e-02, 7.075e-02, -1.188e-02, -4.826e-02, -8.752e-02, -1.681e-01, -8.244e-03, 1.652e-01, -2.174e-02, -5.658e-02, 2.067e-02, -5.496e-02, -1.015e-01)); + r += mul(s6_2, M4(7.667e-02, 2.027e-02, 3.300e-02, -4.803e-03, -1.036e-01, 1.408e-02, 6.761e-03, 3.002e-02, -1.679e-02, 1.096e-03, 5.178e-02, 2.883e-02, -1.849e-02, 1.547e-03, -2.402e-02, 7.750e-03)); + r += mul(s6_3, M4(-5.791e-02, 3.708e-02, -5.342e-02, -3.697e-02, -1.007e-01, -4.903e-02, 1.126e-01, -1.490e-02, 4.938e-02, 2.699e-02, -3.827e-02, 4.307e-02, 1.603e-01, 2.214e-02, 1.549e-01, 5.679e-02)); + r += mul(s6_4, M4(3.202e-02, -4.333e-02, -7.531e-02, -3.408e-02, -4.115e-03, -5.899e-02, 3.860e-03, 6.792e-05, 1.024e-01, 3.625e-02, -7.766e-02, -3.037e-02, -1.183e-01, -1.473e-03, 9.003e-02, 9.680e-05)); + r += mul(s6_5, M4(2.412e-02, 6.634e-04, 6.732e-02, 1.420e-02, 5.810e-02, 2.585e-02, 3.066e-02, -6.959e-02, 7.319e-02, 3.423e-03, 5.851e-03, 1.705e-02, 1.814e-02, -9.285e-03, 5.824e-02, -2.749e-03)); + r += mul(s6_6, M4(-2.116e-02, -1.237e-02, 1.453e-02, 1.679e-02, 1.266e-02, 4.516e-03, 2.093e-03, -2.252e-03, 7.470e-03, -3.528e-02, 2.554e-03, 3.067e-02, 3.109e-02, 4.026e-02, -1.157e-03, -1.176e-02)); + r += mul(s6_7, M4(-3.356e-02, -7.234e-02, -2.846e-02, -3.722e-02, 3.819e-03, 1.008e-02, 1.845e-02, -2.988e-02, 8.924e-03, 4.281e-02, 6.533e-02, 4.260e-02, 6.298e-02, 2.217e-01, -2.953e-02, 3.301e-02)); + r += mul(s6_8, M4(1.080e-02, -4.984e-02, -2.745e-02, 3.396e-02, 1.743e-02, 2.391e-02, 1.372e-02, -6.250e-03, -1.041e-02, -3.854e-02, 1.843e-02, 2.394e-02, -2.537e-02, -3.912e-02, -1.326e-02, 2.354e-04)); + r += mul(s7_0, M4(-5.068e-02, 3.950e-03, -5.902e-02, 7.300e-02, -3.290e-02, 2.441e-02, -3.235e-02, -6.914e-02, 3.399e-02, -5.761e-03, -5.664e-03, 5.919e-03, 7.203e-02, -1.170e-03, -2.160e-02, -5.705e-02)); + r += mul(s7_1, M4(5.436e-02, -5.736e-03, 4.414e-02, -3.565e-01, -8.737e-04, 7.903e-03, 3.357e-02, -6.803e-02, -7.882e-02, 1.270e-02, 1.038e-01, -8.629e-02, -1.847e-02, -1.421e-03, -1.047e-01, 2.133e-01)); + r += mul(s7_2, M4(-9.254e-03, -1.177e-02, 3.797e-02, 2.816e-02, -8.729e-03, 1.623e-02, -7.377e-02, 9.038e-02, -5.011e-02, 7.134e-03, 3.944e-03, 7.992e-03, -1.552e-02, -7.506e-03, -2.047e-03, -2.762e-02)); + r += mul(s7_3, M4(-1.106e-02, 4.900e-02, 9.696e-02, -6.278e-02, -9.456e-02, -5.866e-02, 1.324e-02, -3.110e-02, 1.114e-01, 2.215e-02, -6.409e-02, 5.640e-02, 7.093e-02, -5.043e-02, 4.602e-02, 7.310e-02)); + r += mul(s7_4, M4(-2.782e-02, -7.644e-02, 1.632e-01, -8.296e-02, 2.731e-01, -7.495e-02, -1.284e-01, 4.100e-02, 1.436e-01, -1.086e-01, -1.241e-01, 9.629e-04, 5.897e-02, -3.782e-02, 1.235e-01, 4.526e-02)); + r += mul(s7_5, M4(-1.037e-02, -6.389e-03, 3.870e-02, 2.252e-02, 6.446e-04, -8.442e-02, 6.690e-02, -1.524e-02, 2.123e-02, -2.318e-02, 5.155e-03, -3.023e-02, -1.198e-02, 1.326e-02, 1.593e-02, -1.281e-02)); + r += mul(s7_6, M4(1.916e-02, -5.670e-02, 7.568e-03, -4.093e-03, 2.333e-02, 3.350e-02, -2.574e-02, 1.999e-03, 5.158e-02, 7.096e-03, -4.866e-03, 2.298e-02, -3.357e-02, 5.315e-02, -1.359e-02, 1.251e-02)); + r += mul(s7_7, M4(5.981e-03, 8.174e-02, -4.382e-02, -7.868e-02, 6.846e-02, 4.553e-02, 6.389e-02, -4.031e-02, 1.263e-02, 1.191e-01, 5.344e-02, 1.252e-02, 2.144e-02, 4.242e-03, 3.567e-03, 7.250e-02)); + r += mul(s7_8, M4(4.586e-02, -2.087e-03, -2.998e-02, 2.130e-02, 5.013e-03, 3.517e-02, -1.515e-02, 1.582e-02, -4.815e-03, -1.898e-02, 3.161e-02, 4.237e-03, -1.922e-02, -2.204e-02, -4.973e-03, -7.648e-03)); + r += V4(-4.054e-03, 1.792e-03, -1.629e-03, -2.239e-04); + return r; +} + +void Pass17(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = Rmp8x8(tid.x) + blockStart; + uint2 size = GetInputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = (gxy + 0.5) * pt; + + V4 s0_0 = l0(-1.0, -1.0); + V4 s0_1 = l0(0.0, -1.0); + V4 s0_2 = l0(1.0, -1.0); + V4 s0_3 = l0(-1.0, 0.0); + V4 s0_4 = l0(0.0, 0.0); + V4 s0_5 = l0(1.0, 0.0); + V4 s0_6 = l0(-1.0, 1.0); + V4 s0_7 = l0(0.0, 1.0); + V4 s0_8 = l0(1.0, 1.0); + V4 s1_0 = -max(-s0_0, 0.0); + V4 s1_1 = -max(-s0_1, 0.0); + V4 s1_2 = -max(-s0_2, 0.0); + V4 s1_3 = -max(-s0_3, 0.0); + V4 s1_4 = -max(-s0_4, 0.0); + V4 s1_5 = -max(-s0_5, 0.0); + V4 s1_6 = -max(-s0_6, 0.0); + V4 s1_7 = -max(-s0_7, 0.0); + V4 s1_8 = -max(-s0_8, 0.0); + s0_0 = max(s0_0, 0.0); + s0_1 = max(s0_1, 0.0); + s0_2 = max(s0_2, 0.0); + s0_3 = max(s0_3, 0.0); + s0_4 = max(s0_4, 0.0); + s0_5 = max(s0_5, 0.0); + s0_6 = max(s0_6, 0.0); + s0_7 = max(s0_7, 0.0); + s0_8 = max(s0_8, 0.0); + + V4 s2_0 = l1(-1.0, -1.0); + V4 s2_1 = l1(0.0, -1.0); + V4 s2_2 = l1(1.0, -1.0); + V4 s2_3 = l1(-1.0, 0.0); + V4 s2_4 = l1(0.0, 0.0); + V4 s2_5 = l1(1.0, 0.0); + V4 s2_6 = l1(-1.0, 1.0); + V4 s2_7 = l1(0.0, 1.0); + V4 s2_8 = l1(1.0, 1.0); + V4 s3_0 = -max(-s2_0, 0.0); + V4 s3_1 = -max(-s2_1, 0.0); + V4 s3_2 = -max(-s2_2, 0.0); + V4 s3_3 = -max(-s2_3, 0.0); + V4 s3_4 = -max(-s2_4, 0.0); + V4 s3_5 = -max(-s2_5, 0.0); + V4 s3_6 = -max(-s2_6, 0.0); + V4 s3_7 = -max(-s2_7, 0.0); + V4 s3_8 = -max(-s2_8, 0.0); + s2_0 = max(s2_0, 0.0); + s2_1 = max(s2_1, 0.0); + s2_2 = max(s2_2, 0.0); + s2_3 = max(s2_3, 0.0); + s2_4 = max(s2_4, 0.0); + s2_5 = max(s2_5, 0.0); + s2_6 = max(s2_6, 0.0); + s2_7 = max(s2_7, 0.0); + s2_8 = max(s2_8, 0.0); + + V4 s4_0 = l2(-1.0, -1.0); + V4 s4_1 = l2(0.0, -1.0); + V4 s4_2 = l2(1.0, -1.0); + V4 s4_3 = l2(-1.0, 0.0); + V4 s4_4 = l2(0.0, 0.0); + V4 s4_5 = l2(1.0, 0.0); + V4 s4_6 = l2(-1.0, 1.0); + V4 s4_7 = l2(0.0, 1.0); + V4 s4_8 = l2(1.0, 1.0); + V4 s5_0 = -max(-s4_0, 0.0); + V4 s5_1 = -max(-s4_1, 0.0); + V4 s5_2 = -max(-s4_2, 0.0); + V4 s5_3 = -max(-s4_3, 0.0); + V4 s5_4 = -max(-s4_4, 0.0); + V4 s5_5 = -max(-s4_5, 0.0); + V4 s5_6 = -max(-s4_6, 0.0); + V4 s5_7 = -max(-s4_7, 0.0); + V4 s5_8 = -max(-s4_8, 0.0); + s4_0 = max(s4_0, 0.0); + s4_1 = max(s4_1, 0.0); + s4_2 = max(s4_2, 0.0); + s4_3 = max(s4_3, 0.0); + s4_4 = max(s4_4, 0.0); + s4_5 = max(s4_5, 0.0); + s4_6 = max(s4_6, 0.0); + s4_7 = max(s4_7, 0.0); + s4_8 = max(s4_8, 0.0); + + V4 s6_0 = l3(-1.0, -1.0); + V4 s6_1 = l3(0.0, -1.0); + V4 s6_2 = l3(1.0, -1.0); + V4 s6_3 = l3(-1.0, 0.0); + V4 s6_4 = l3(0.0, 0.0); + V4 s6_5 = l3(1.0, 0.0); + V4 s6_6 = l3(-1.0, 1.0); + V4 s6_7 = l3(0.0, 1.0); + V4 s6_8 = l3(1.0, 1.0); + V4 s7_0 = -max(-s6_0, 0.0); + V4 s7_1 = -max(-s6_1, 0.0); + V4 s7_2 = -max(-s6_2, 0.0); + V4 s7_3 = -max(-s6_3, 0.0); + V4 s7_4 = -max(-s6_4, 0.0); + V4 s7_5 = -max(-s6_5, 0.0); + V4 s7_6 = -max(-s6_6, 0.0); + V4 s7_7 = -max(-s6_7, 0.0); + V4 s7_8 = -max(-s6_8, 0.0); + s6_0 = max(s6_0, 0.0); + s6_1 = max(s6_1, 0.0); + s6_2 = max(s6_2, 0.0); + s6_3 = max(s6_3, 0.0); + s6_4 = max(s6_4, 0.0); + s6_5 = max(s6_5, 0.0); + s6_6 = max(s6_6, 0.0); + s6_7 = max(s6_7, 0.0); + s6_8 = max(s6_8, 0.0); + + t0[gxy] = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t1[gxy] = f1(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t2[gxy] = f2(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t3[gxy] = f3(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); +} + +//!PASS 18 +//!DESC out-shuffle +//!BLOCK_SIZE 16 +//!NUM_THREADS 64 +//!IN INPUT, t0, t1, t2, t3 +//!OUT OUTPUT + +#define l0(x, y) V4(O(t0, float2(x, y))) +#define l1(x, y) V4(O(t1, float2(x, y))) +#define l2(x, y) V4(O(t2, float2(x, y))) +#define l3(x, y) V4(O(t3, float2(x, y))) + +V4 f0(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-3.170e-02, 2.448e-02, -6.568e-02, -4.856e-03, 7.756e-03, 2.695e-02, -2.034e-02, -1.152e-02, -9.123e-03, 1.096e-02, -1.194e-02, 3.436e-03, 5.642e-02, -6.383e-02, 8.516e-03, -7.348e-03)); + r += mul(s0_1, M4(1.707e-02, -2.103e-02, 3.186e-02, 6.137e-02, -7.320e-03, -3.172e-02, 8.073e-02, 7.483e-02, -3.905e-02, 1.540e-02, 7.500e-02, -8.741e-03, -6.373e-02, 7.616e-02, -2.019e-02, -4.717e-02)); + r += mul(s0_2, M4(2.383e-02, -3.848e-02, 4.500e-02, -8.700e-03, -9.590e-04, 1.952e-02, 4.646e-03, 3.524e-02, -1.623e-01, 8.300e-02, -4.089e-02, 2.941e-02, 8.041e-04, -1.368e-02, -3.280e-03, 1.389e-02)); + r += mul(s0_3, M4(1.305e-02, 1.089e-02, 2.462e-02, -9.653e-03, 3.373e-02, -2.580e-02, -4.511e-02, 1.383e-02, -2.521e-02, -8.344e-03, -1.552e-03, 1.083e-02, -2.801e-02, 1.817e-02, 1.458e-02, -5.040e-02)); + r += mul(s0_4, M4(-2.626e-02, -3.885e-02, 3.225e-02, -8.319e-03, 2.861e-02, 9.400e-02, -1.323e-02, -9.068e-02, -5.325e-02, -3.405e-02, -1.348e-01, 3.636e-02, -1.412e-03, -8.639e-03, -2.458e-02, 8.211e-02)); + r += mul(s0_5, M4(-2.241e-02, 2.480e-02, -5.949e-02, 3.283e-02, 1.708e-02, -3.191e-02, 1.170e-02, -8.865e-02, 1.219e-02, 1.932e-01, -1.464e-01, 2.297e-01, 1.451e-02, -1.641e-02, 3.309e-02, -3.171e-02)); + r += mul(s0_6, M4(3.591e-03, -7.527e-03, -1.827e-02, -5.322e-03, -8.911e-03, 4.973e-03, -1.666e-03, -2.836e-02, 1.501e-04, 8.513e-03, -1.642e-02, 3.185e-03, -9.765e-03, -5.416e-03, 8.468e-03, 1.827e-02)); + r += mul(s0_7, M4(-6.142e-03, 1.179e-02, 9.797e-03, -7.066e-03, -4.748e-02, -4.553e-02, -6.670e-03, 6.607e-02, 3.616e-02, 1.246e-02, 7.919e-03, -2.878e-02, 2.383e-02, 1.226e-02, 1.933e-02, 1.379e-02)); + r += mul(s0_8, M4(5.489e-03, -6.949e-03, -1.249e-02, -1.273e-02, -1.335e-02, -1.046e-02, -1.467e-02, 1.301e-02, -3.634e-04, 2.387e-02, -6.627e-03, 6.708e-02, 1.014e-02, 7.646e-03, -3.052e-03, -1.804e-02)); + r += mul(s1_0, M4(-5.993e-02, 3.872e-02, -8.385e-02, -2.055e-02, 3.127e-02, 2.489e-02, -1.823e-02, -7.680e-03, -1.837e-02, -3.850e-03, -1.939e-02, -4.987e-03, -3.555e-02, -8.473e-02, -2.959e-03, -9.691e-04)); + r += mul(s1_1, M4(1.471e-01, -1.696e-01, 7.404e-02, 1.358e-01, -2.949e-02, -7.137e-02, 7.931e-02, 7.524e-02, -1.398e-03, 1.968e-02, 6.140e-02, 1.004e-03, -1.041e-01, 2.717e-01, 2.352e-02, -9.992e-02)); + r += mul(s1_2, M4(-2.605e-02, 1.538e-01, 1.949e-02, -7.537e-02, 4.956e-03, 2.166e-02, 4.880e-03, 4.470e-02, -1.016e-01, -5.237e-02, -3.256e-02, 4.931e-02, 4.893e-03, -9.205e-02, -8.567e-03, 8.578e-03)); + r += mul(s1_3, M4(2.993e-02, 1.200e-02, 6.862e-02, -6.863e-04, -6.337e-02, -3.137e-02, -6.470e-02, 5.289e-02, -3.570e-02, -1.412e-02, 2.902e-03, 5.407e-03, 1.897e-01, -4.217e-02, 7.446e-02, -1.463e-01)); + r += mul(s1_4, M4(1.145e-01, 4.910e-02, -3.034e-01, 4.102e-03, -1.989e-01, 5.177e-01, 5.979e-02, -3.146e-01, 9.415e-03, -3.219e-02, 5.995e-02, 4.015e-02, -1.892e-01, -3.401e-02, -2.563e-01, 4.216e-01)); + r += mul(s1_5, M4(-3.214e-02, 4.432e-02, 1.106e-02, -1.413e-01, 4.720e-02, -1.067e-02, 1.894e-02, -1.091e-01, 9.069e-02, 3.072e-02, -1.896e-02, -1.035e-01, 2.268e-02, -5.219e-03, 4.358e-02, -9.705e-02)); + r += mul(s1_6, M4(1.562e-03, -9.512e-03, -2.244e-02, -1.654e-02, 5.496e-03, -5.039e-03, 4.016e-02, -3.034e-02, 4.426e-03, 8.628e-03, -2.512e-02, -9.072e-03, -1.572e-02, -2.058e-02, 4.438e-02, 8.002e-03)); + r += mul(s1_7, M4(-1.548e-02, 6.459e-03, 4.658e-02, 1.722e-02, -1.577e-02, -8.439e-02, -1.723e-02, 6.488e-02, 3.528e-02, 7.008e-03, 3.369e-05, -2.880e-02, 2.789e-02, 4.783e-03, -2.586e-02, -5.774e-02)); + r += mul(s1_8, M4(6.076e-03, -2.590e-03, -4.608e-03, 1.910e-02, -1.267e-02, -3.100e-02, -1.022e-02, 2.922e-02, -1.394e-02, 2.198e-02, 5.267e-03, 3.279e-02, 9.616e-03, 1.532e-02, 2.373e-03, -6.028e-03)); + r += mul(s2_0, M4(-6.614e-02, -2.182e-02, -1.388e-02, -2.440e-03, -9.562e-03, 2.454e-03, 5.310e-04, 8.280e-03, -2.452e-02, -3.225e-02, 3.147e-02, 1.186e-02, -5.556e-03, 1.584e-03, 3.588e-02, 1.071e-03)); + r += mul(s2_1, M4(-1.006e-01, -1.033e-01, 6.797e-02, -1.167e-01, 5.872e-02, -6.635e-04, -1.559e-02, 4.107e-03, 5.115e-02, 1.119e-01, -6.172e-02, -3.804e-02, -3.999e-02, 2.446e-03, 3.854e-02, 3.619e-02)); + r += mul(s2_2, M4(-3.021e-02, 2.507e-02, -2.031e-02, 1.310e-01, 1.319e-02, 2.045e-02, 8.442e-03, -1.568e-02, 2.613e-03, -8.475e-03, 4.010e-02, 1.786e-02, 5.968e-03, 2.538e-02, -2.774e-03, 2.409e-02)); + r += mul(s2_3, M4(1.206e-02, -9.481e-03, -3.632e-02, -7.142e-03, 6.906e-02, 2.239e-02, 3.409e-02, 3.912e-03, 1.751e-02, 2.146e-02, 7.899e-02, -1.307e-03, -8.623e-02, 6.119e-02, -5.315e-02, 4.924e-02)); + r += mul(s2_4, M4(8.546e-02, 7.753e-02, -6.961e-02, 9.094e-02, -3.058e-01, -1.135e-01, -1.563e-01, -9.692e-02, 5.813e-02, -3.372e-02, -7.690e-02, 7.416e-04, 9.672e-02, -2.104e-01, -6.485e-02, -1.636e-01)); + r += mul(s2_5, M4(6.507e-02, -1.349e-02, 5.284e-02, -9.991e-02, -4.316e-03, -8.037e-02, 6.635e-03, -8.991e-03, -2.188e-02, -5.964e-02, -3.078e-02, 1.082e-01, 1.135e-02, 4.011e-02, 2.729e-02, 6.621e-02)); + r += mul(s2_6, M4(-3.503e-03, 7.632e-03, 9.369e-03, 7.759e-03, -7.768e-03, -3.471e-03, 2.214e-02, 1.091e-02, -6.653e-02, -1.895e-02, -2.878e-02, 3.137e-02, 2.943e-02, 1.752e-02, -5.594e-03, 4.309e-02)); + r += mul(s2_7, M4(7.778e-03, 6.771e-03, 1.779e-03, 7.087e-03, 6.034e-02, 2.083e-02, -3.374e-02, -7.667e-03, 1.442e-02, 1.245e-02, -1.346e-02, -6.898e-02, 3.395e-03, 4.285e-02, 5.205e-02, -3.860e-02)); + r += mul(s2_8, M4(1.034e-02, 1.446e-02, 8.920e-03, -1.042e-02, 2.126e-03, 1.193e-02, 5.882e-03, -2.283e-02, -4.069e-03, -7.869e-03, 2.932e-02, -6.078e-02, 7.783e-03, 1.763e-02, 6.087e-03, 1.066e-02)); + r += mul(s3_0, M4(-1.117e-02, -3.773e-02, 4.783e-02, 1.799e-02, -1.312e-02, -1.550e-03, 1.286e-03, 5.248e-03, -3.082e-02, -3.944e-02, 3.241e-02, 4.450e-03, -8.538e-03, -6.150e-03, 3.260e-02, -5.224e-03)); + r += mul(s3_1, M4(-4.113e-01, 8.007e-02, 1.653e-01, -2.705e-01, 4.841e-02, -2.195e-05, -2.048e-02, 4.801e-04, -4.779e-04, 7.444e-02, -4.292e-02, -6.109e-04, -5.756e-02, -1.337e-02, 3.434e-02, 3.096e-02)); + r += mul(s3_2, M4(-5.278e-02, 1.767e-01, -3.923e-02, 1.401e-01, 1.043e-02, 8.874e-03, 1.041e-02, -1.616e-02, 1.214e-02, -2.069e-02, 3.683e-02, 1.199e-02, 2.470e-03, 1.989e-02, -7.253e-03, 1.975e-02)); + r += mul(s3_3, M4(3.710e-03, -6.151e-03, -4.808e-02, -1.869e-02, 6.567e-02, 1.809e-02, 2.937e-02, 2.441e-03, 1.323e-01, -1.969e-02, 2.207e-02, -8.042e-03, -1.013e-01, 7.105e-02, -6.565e-02, 4.941e-02)); + r += mul(s3_4, M4(7.788e-02, 8.375e-02, -8.080e-02, 1.812e-01, -2.842e-01, -8.450e-02, -1.230e-01, -7.689e-02, 2.533e-01, 4.913e-01, -1.572e-01, -2.203e-01, 2.837e-02, -3.141e-01, -1.344e-01, -2.363e-01)); + r += mul(s3_5, M4(5.774e-02, -3.128e-02, 5.944e-02, -7.505e-02, -1.588e-03, -7.247e-02, -1.595e-04, -1.232e-02, -1.557e-02, -1.428e-01, -2.084e-02, 1.199e-01, 1.154e-02, 2.753e-02, 2.961e-02, 5.043e-02)); + r += mul(s3_6, M4(-6.184e-03, 7.996e-03, 3.448e-03, 5.530e-03, -8.169e-03, -2.379e-03, 1.869e-02, 7.190e-03, -6.045e-02, -2.534e-02, -3.620e-03, 3.928e-02, 2.574e-02, 1.327e-02, -1.794e-02, 4.131e-02)); + r += mul(s3_7, M4(3.847e-03, 3.405e-03, 4.610e-03, 1.175e-02, 5.643e-02, 1.664e-02, -3.929e-02, -3.633e-03, 5.540e-02, 5.807e-02, -2.154e-01, -3.165e-01, -9.234e-03, 4.162e-02, 2.476e-02, -6.623e-02)); + r += mul(s3_8, M4(1.258e-02, 1.675e-02, 1.004e-02, -3.470e-04, 7.424e-04, 7.711e-03, 4.932e-03, -2.514e-02, 2.154e-02, 2.952e-02, 3.343e-02, -4.860e-02, 6.836e-03, 1.422e-02, 4.818e-03, 4.429e-03)); + r += mul(s4_0, M4(-1.991e-02, -7.818e-02, 1.753e-03, -7.982e-03, -8.459e-03, 1.715e-02, -3.093e-04, 1.164e-02, -2.252e-02, -1.032e-02, -3.003e-02, 7.538e-04, 9.509e-03, 4.878e-04, -1.529e-02, -2.684e-04)); + r += mul(s4_1, M4(2.582e-02, -7.369e-02, 1.761e-02, -9.257e-03, 6.032e-02, -7.150e-02, 1.203e-01, 5.405e-02, 3.053e-02, -7.387e-02, 6.575e-02, 6.294e-02, -4.751e-02, 3.480e-02, -4.056e-02, -3.144e-02)); + r += mul(s4_2, M4(-2.343e-02, 1.343e-02, -3.803e-03, 6.644e-02, -1.866e-02, 2.669e-02, -1.160e-02, 2.351e-02, -5.340e-04, -1.773e-02, -2.394e-02, -6.879e-02, -6.449e-03, -5.503e-02, 1.298e-02, 1.473e-02)); + r += mul(s4_3, M4(2.549e-01, 2.205e-03, 1.876e-01, -7.721e-02, 3.052e-02, 2.247e-02, 3.544e-03, -9.289e-03, -3.133e-02, 2.939e-02, 6.849e-02, -2.967e-02, -3.779e-02, -1.874e-02, 1.963e-02, -1.928e-02)); + r += mul(s4_4, M4(2.826e-01, -3.722e-01, 2.660e-01, -4.212e-01, 3.193e-01, 2.409e-01, -6.020e-01, -2.057e-01, -1.676e-02, 1.411e-01, -7.284e-02, -4.007e-02, 9.450e-02, 1.185e-02, 8.403e-02, 1.109e-01)); + r += mul(s4_5, M4(-1.082e-02, -4.602e-02, -1.661e-02, -8.544e-02, 5.456e-02, 7.028e-02, 2.377e-02, -2.090e-01, 1.850e-03, -5.624e-02, 2.329e-02, 5.773e-02, -1.543e-02, -6.734e-03, -1.854e-02, -2.026e-02)); + r += mul(s4_6, M4(-2.066e-02, -2.805e-02, 5.004e-02, -5.649e-03, -1.240e-02, -1.120e-03, 1.128e-02, 1.740e-02, -8.836e-03, -1.918e-02, 1.448e-02, 3.832e-02, 1.178e-02, 1.012e-02, -1.370e-02, 6.817e-03)); + r += mul(s4_7, M4(-1.574e-02, 6.095e-03, 1.873e-02, -2.419e-02, 1.698e-02, -2.177e-03, 1.293e-02, 3.237e-02, 1.892e-02, -6.214e-03, 3.640e-03, -3.150e-02, 9.240e-03, 7.956e-03, 1.666e-02, -3.750e-02)); + r += mul(s4_8, M4(6.335e-03, 3.346e-02, -7.784e-03, 1.793e-02, 1.143e-02, 1.155e-02, 3.650e-02, -3.451e-02, -1.071e-02, 1.390e-02, 1.723e-02, -7.698e-03, -2.032e-03, 1.901e-02, -2.404e-02, -7.579e-03)); + r += mul(s5_0, M4(-4.975e-02, -5.695e-02, 2.088e-02, 4.877e-03, 1.484e-02, 1.283e-02, -1.485e-02, -1.493e-03, -8.537e-02, 1.514e-02, 2.568e-02, 2.130e-02, -2.429e-02, -2.395e-04, -1.912e-02, -6.880e-03)); + r += mul(s5_1, M4(-4.932e-02, 2.237e-02, 2.594e-02, -2.794e-02, -3.335e-02, -7.771e-02, 9.786e-02, 3.368e-02, -4.771e-03, -3.063e-01, 1.260e-01, 1.167e-01, 2.342e-02, 2.135e-02, -5.706e-02, -2.458e-02)); + r += mul(s5_2, M4(-1.410e-02, -1.026e-02, -1.484e-02, 4.841e-02, -1.918e-02, 1.553e-02, -3.033e-02, -5.088e-03, 2.929e-03, 3.870e-02, -1.440e-02, -3.313e-02, -1.371e-02, -7.303e-02, 2.006e-02, 3.500e-02)); + r += mul(s5_3, M4(7.503e-02, 6.763e-02, -2.062e-02, -1.734e-02, -2.692e-02, 5.217e-03, 2.626e-02, 1.809e-02, -5.349e-02, 4.840e-02, 7.110e-02, -8.833e-02, -8.620e-02, -2.215e-03, -5.047e-02, 6.569e-03)); + r += mul(s5_4, M4(9.741e-03, 7.098e-04, -4.540e-02, -8.394e-03, -4.509e-02, 6.875e-02, -3.755e-02, -3.042e-02, -1.652e-02, -9.887e-02, -8.768e-02, 4.416e-01, 3.894e-01, -1.719e-01, 4.596e-01, -4.144e-02)); + r += mul(s5_5, M4(1.393e-02, -2.573e-02, 1.315e-02, -6.274e-02, 4.479e-02, -9.074e-02, 2.770e-02, -2.673e-02, -6.560e-03, -2.809e-02, 4.211e-02, -8.775e-03, -5.896e-02, -6.478e-03, -4.895e-02, -1.257e-01)); + r += mul(s5_6, M4(-1.757e-02, -1.089e-02, 4.492e-02, 2.950e-02, -9.883e-03, -1.252e-03, -3.068e-03, 1.144e-02, -8.864e-03, -2.111e-02, 1.158e-02, 4.651e-02, 7.449e-03, 8.998e-03, -3.528e-02, 6.337e-03)); + r += mul(s5_7, M4(7.524e-03, -8.958e-03, 5.724e-03, 1.279e-02, 2.790e-02, 1.130e-02, -2.957e-02, -1.026e-02, 1.624e-02, 1.139e-02, 1.602e-03, -5.824e-02, -1.166e-03, -9.779e-03, 3.063e-02, -1.145e-01)); + r += mul(s5_8, M4(2.655e-03, 2.348e-02, -6.856e-03, -4.147e-03, 1.467e-02, 2.920e-02, 2.897e-02, -4.703e-02, -1.137e-02, 5.183e-03, 2.331e-02, -9.601e-03, 1.926e-03, 4.874e-03, -3.124e-02, 3.141e-02)); + r += mul(s6_0, M4(-1.876e-02, -1.165e-02, 1.643e-02, -5.137e-03, -2.971e-02, -2.814e-02, 4.568e-02, -2.350e-03, 1.767e-02, -2.508e-02, 9.430e-03, 8.928e-03, -1.128e-02, 1.397e-02, 1.078e-03, 2.444e-03)); + r += mul(s6_1, M4(-1.603e-02, 4.883e-03, -3.543e-02, 2.508e-02, 6.303e-02, -1.529e-03, -5.630e-02, -5.166e-03, 3.772e-03, 1.235e-01, -9.009e-02, -4.480e-02, 9.319e-04, 1.023e-02, -1.260e-02, 4.646e-03)); + r += mul(s6_2, M4(2.779e-02, 4.112e-03, 1.610e-02, -2.811e-02, -5.176e-03, 1.470e-01, -3.409e-02, -4.477e-02, 1.400e-02, -2.700e-02, 2.512e-02, -3.769e-03, 3.306e-03, 1.269e-03, -4.562e-03, -5.639e-03)); + r += mul(s6_3, M4(-3.967e-02, -2.166e-02, 4.781e-03, 3.840e-03, 4.313e-02, 8.753e-03, -6.067e-03, 8.509e-04, -3.141e-02, 2.118e-02, 7.875e-02, -1.663e-02, -6.424e-02, 3.583e-02, -4.025e-02, 2.640e-02)); + r += mul(s6_4, M4(1.583e-01, 6.976e-02, -1.724e-01, -2.359e-01, -6.695e-02, -3.676e-02, 1.117e-01, -1.440e-02, -3.013e-01, -1.920e-01, 3.894e-01, 2.940e-01, 2.106e-01, -1.568e-01, 7.986e-02, -4.248e-04)); + r += mul(s6_5, M4(9.537e-06, 7.261e-02, 4.889e-02, 1.255e-01, -8.090e-03, -5.074e-02, -2.435e-02, 4.686e-02, 2.466e-02, -1.938e-01, 1.402e-03, 2.188e-01, -3.894e-02, 1.007e-02, 4.435e-03, 2.815e-02)); + r += mul(s6_6, M4(-1.334e-02, -1.331e-03, -1.216e-02, -2.382e-03, 1.886e-03, 6.733e-04, 6.726e-03, -2.342e-03, -5.683e-03, -1.460e-02, -2.966e-02, 1.401e-02, 1.776e-03, 8.501e-03, -2.850e-02, 2.280e-02)); + r += mul(s6_7, M4(-5.622e-02, -4.385e-02, 8.323e-02, 2.082e-02, -3.004e-03, 6.389e-03, -3.528e-02, -6.396e-03, 3.363e-02, 5.651e-02, -7.056e-02, -1.323e-01, 7.776e-02, -1.758e-01, 2.205e-01, -3.272e-01)); + r += mul(s6_8, M4(-2.244e-02, -1.364e-02, -4.934e-03, 5.392e-02, -9.519e-03, -8.369e-03, 1.478e-03, 2.273e-03, -1.052e-02, 1.176e-02, -7.981e-03, -5.322e-02, -1.382e-02, 3.117e-02, -5.119e-02, 3.360e-02)); + r += mul(s7_0, M4(3.142e-03, -7.278e-03, 1.644e-02, -5.327e-03, -2.223e-02, -1.115e-02, 3.171e-02, 8.298e-03, 1.801e-02, -3.280e-02, 2.533e-02, 8.254e-03, -8.665e-03, -1.002e-02, 1.963e-02, 3.322e-03)); + r += mul(s7_1, M4(1.425e-02, 3.507e-02, -4.513e-02, 1.871e-02, 4.639e-01, -2.210e-01, -2.253e-01, 2.526e-02, 5.002e-02, 1.415e-01, -6.515e-02, -2.384e-02, -3.711e-03, 2.317e-02, -2.549e-02, 7.058e-03)); + r += mul(s7_2, M4(3.407e-02, 1.647e-02, 1.747e-02, -2.392e-02, 4.284e-02, -3.438e-02, -3.217e-02, -3.457e-02, -6.072e-04, -6.325e-03, 4.104e-02, 2.124e-02, 7.593e-03, 4.929e-03, -1.343e-03, 1.344e-03)); + r += mul(s7_3, M4(-4.416e-02, -2.313e-02, 9.369e-03, 1.215e-03, 4.700e-02, 9.235e-03, 4.517e-03, -1.758e-03, -4.952e-02, 1.684e-02, 3.661e-02, -1.082e-02, 2.024e-02, 4.450e-03, -1.514e-02, -3.430e-03)); + r += mul(s7_4, M4(5.847e-02, -4.423e-02, -1.759e-01, -1.619e-01, -1.243e-01, -1.296e-02, 1.304e-01, -5.431e-02, 3.184e-02, -6.372e-02, 1.027e-02, 8.180e-02, 2.514e-02, -1.069e-01, 1.008e-01, -1.097e-02)); + r += mul(s7_5, M4(1.223e-02, 6.869e-02, 5.970e-02, 1.265e-01, -9.771e-03, -8.498e-03, -8.782e-04, 8.668e-02, -2.578e-02, -6.804e-02, -3.425e-02, 1.549e-02, -1.045e-03, 1.012e-01, 1.609e-02, 5.317e-02)); + r += mul(s7_6, M4(-9.363e-04, -1.286e-03, -2.189e-02, -1.560e-02, -2.089e-03, 5.252e-04, 9.796e-03, 4.041e-04, -2.468e-03, -9.992e-03, -1.344e-02, 1.703e-02, -2.202e-02, -1.400e-02, -9.243e-03, -1.864e-02)); + r += mul(s7_7, M4(-4.014e-02, -2.973e-02, 1.028e-01, 4.114e-02, 1.664e-03, -3.040e-03, -2.677e-02, -1.250e-02, -2.429e-03, 4.016e-02, -6.270e-03, -5.730e-02, -2.520e-02, 5.750e-02, -8.956e-02, -2.129e-02)); + r += mul(s7_8, M4(-2.496e-02, -4.739e-03, -1.972e-02, 6.053e-02, -9.747e-03, -3.898e-03, -4.896e-03, -3.456e-04, -1.009e-02, -8.804e-03, -9.338e-05, -1.609e-02, 1.923e-02, -6.568e-02, 2.607e-02, -2.522e-02)); + r += V4(-9.206e-04, -7.637e-04, -7.861e-04, -5.855e-04); + return tanh(r); +} + +void Pass18(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = (Rmp8x8(tid.x) << 1) + blockStart; + uint2 size = GetOutputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = ((gxy >> 1) + 0.5) * pt; + + V4 s0_0 = l0(-1.0, -1.0); + V4 s0_1 = l0(0.0, -1.0); + V4 s0_2 = l0(1.0, -1.0); + V4 s0_3 = l0(-1.0, 0.0); + V4 s0_4 = l0(0.0, 0.0); + V4 s0_5 = l0(1.0, 0.0); + V4 s0_6 = l0(-1.0, 1.0); + V4 s0_7 = l0(0.0, 1.0); + V4 s0_8 = l0(1.0, 1.0); + V4 s1_0 = -max(-s0_0, 0.0); + V4 s1_1 = -max(-s0_1, 0.0); + V4 s1_2 = -max(-s0_2, 0.0); + V4 s1_3 = -max(-s0_3, 0.0); + V4 s1_4 = -max(-s0_4, 0.0); + V4 s1_5 = -max(-s0_5, 0.0); + V4 s1_6 = -max(-s0_6, 0.0); + V4 s1_7 = -max(-s0_7, 0.0); + V4 s1_8 = -max(-s0_8, 0.0); + s0_0 = max(s0_0, 0.0); + s0_1 = max(s0_1, 0.0); + s0_2 = max(s0_2, 0.0); + s0_3 = max(s0_3, 0.0); + s0_4 = max(s0_4, 0.0); + s0_5 = max(s0_5, 0.0); + s0_6 = max(s0_6, 0.0); + s0_7 = max(s0_7, 0.0); + s0_8 = max(s0_8, 0.0); + + V4 s2_0 = l1(-1.0, -1.0); + V4 s2_1 = l1(0.0, -1.0); + V4 s2_2 = l1(1.0, -1.0); + V4 s2_3 = l1(-1.0, 0.0); + V4 s2_4 = l1(0.0, 0.0); + V4 s2_5 = l1(1.0, 0.0); + V4 s2_6 = l1(-1.0, 1.0); + V4 s2_7 = l1(0.0, 1.0); + V4 s2_8 = l1(1.0, 1.0); + V4 s3_0 = -max(-s2_0, 0.0); + V4 s3_1 = -max(-s2_1, 0.0); + V4 s3_2 = -max(-s2_2, 0.0); + V4 s3_3 = -max(-s2_3, 0.0); + V4 s3_4 = -max(-s2_4, 0.0); + V4 s3_5 = -max(-s2_5, 0.0); + V4 s3_6 = -max(-s2_6, 0.0); + V4 s3_7 = -max(-s2_7, 0.0); + V4 s3_8 = -max(-s2_8, 0.0); + s2_0 = max(s2_0, 0.0); + s2_1 = max(s2_1, 0.0); + s2_2 = max(s2_2, 0.0); + s2_3 = max(s2_3, 0.0); + s2_4 = max(s2_4, 0.0); + s2_5 = max(s2_5, 0.0); + s2_6 = max(s2_6, 0.0); + s2_7 = max(s2_7, 0.0); + s2_8 = max(s2_8, 0.0); + + V4 s4_0 = l2(-1.0, -1.0); + V4 s4_1 = l2(0.0, -1.0); + V4 s4_2 = l2(1.0, -1.0); + V4 s4_3 = l2(-1.0, 0.0); + V4 s4_4 = l2(0.0, 0.0); + V4 s4_5 = l2(1.0, 0.0); + V4 s4_6 = l2(-1.0, 1.0); + V4 s4_7 = l2(0.0, 1.0); + V4 s4_8 = l2(1.0, 1.0); + V4 s5_0 = -max(-s4_0, 0.0); + V4 s5_1 = -max(-s4_1, 0.0); + V4 s5_2 = -max(-s4_2, 0.0); + V4 s5_3 = -max(-s4_3, 0.0); + V4 s5_4 = -max(-s4_4, 0.0); + V4 s5_5 = -max(-s4_5, 0.0); + V4 s5_6 = -max(-s4_6, 0.0); + V4 s5_7 = -max(-s4_7, 0.0); + V4 s5_8 = -max(-s4_8, 0.0); + s4_0 = max(s4_0, 0.0); + s4_1 = max(s4_1, 0.0); + s4_2 = max(s4_2, 0.0); + s4_3 = max(s4_3, 0.0); + s4_4 = max(s4_4, 0.0); + s4_5 = max(s4_5, 0.0); + s4_6 = max(s4_6, 0.0); + s4_7 = max(s4_7, 0.0); + s4_8 = max(s4_8, 0.0); + + V4 s6_0 = l3(-1.0, -1.0); + V4 s6_1 = l3(0.0, -1.0); + V4 s6_2 = l3(1.0, -1.0); + V4 s6_3 = l3(-1.0, 0.0); + V4 s6_4 = l3(0.0, 0.0); + V4 s6_5 = l3(1.0, 0.0); + V4 s6_6 = l3(-1.0, 1.0); + V4 s6_7 = l3(0.0, 1.0); + V4 s6_8 = l3(1.0, 1.0); + V4 s7_0 = -max(-s6_0, 0.0); + V4 s7_1 = -max(-s6_1, 0.0); + V4 s7_2 = -max(-s6_2, 0.0); + V4 s7_3 = -max(-s6_3, 0.0); + V4 s7_4 = -max(-s6_4, 0.0); + V4 s7_5 = -max(-s6_5, 0.0); + V4 s7_6 = -max(-s6_6, 0.0); + V4 s7_7 = -max(-s6_7, 0.0); + V4 s7_8 = -max(-s6_8, 0.0); + s6_0 = max(s6_0, 0.0); + s6_1 = max(s6_1, 0.0); + s6_2 = max(s6_2, 0.0); + s6_3 = max(s6_3, 0.0); + s6_4 = max(s6_4, 0.0); + s6_5 = max(s6_5, 0.0); + s6_6 = max(s6_6, 0.0); + s6_7 = max(s6_7, 0.0); + s6_8 = max(s6_8, 0.0); + + V4 r = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + + static const float3x3 rgb2yuv = {0.299, 0.587, 0.114, -0.169, -0.331, 0.5, 0.5, -0.419, -0.081}; + static const float3x3 yuv2rgb = {1, -0.00093, 1.401687, 1, -0.3437, -0.71417, 1, 1.77216, 0.00099}; + float2 opt = float2(GetOutputPt()); + + pos -= 0.5f * opt; + float3 yuv = mul(rgb2yuv, INPUT.SampleLevel(SL, pos, 0).rgb); + OUTPUT[gxy] = float4(mul(yuv2rgb, float3(saturate(yuv.r + r.x), yuv.yz)), 1); + + ++gxy.x; + pos.x += opt.x; + yuv = mul(rgb2yuv, INPUT.SampleLevel(SL, pos, 0).rgb); + OUTPUT[gxy] = float4(mul(yuv2rgb, float3(saturate(yuv.r + r.y), yuv.yz)), 1); + + ++gxy.y; + pos.y += opt.y; + yuv = mul(rgb2yuv, INPUT.SampleLevel(SL, pos, 0).rgb); + OUTPUT[gxy] = float4(mul(yuv2rgb, float3(saturate(yuv.r + r.w), yuv.yz)), 1); + + --gxy.x; + pos.x -= opt.x; + yuv = mul(rgb2yuv, INPUT.SampleLevel(SL, pos, 0).rgb); + OUTPUT[gxy] = float4(mul(yuv2rgb, float3(saturate(yuv.r + r.z), yuv.yz)), 1); +} diff --git a/src/Effects/CuNNy/CuNNy-16x16C-NVL.hlsl b/src/Effects/CuNNy/CuNNy-16x16C-NVL.hlsl new file mode 100644 index 000000000..d61d2eab6 --- /dev/null +++ b/src/Effects/CuNNy/CuNNy-16x16C-NVL.hlsl @@ -0,0 +1,7635 @@ +// CuNNy 16x16C BILINEAR RGB NVL - https://github.com/cunnyplapper/CuNNy + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +//!MAGPIE EFFECT +//!VERSION 4 +//!SORT_NAME CuNNy-D16N16 + +//!TEXTURE +Texture2D INPUT; + +//!TEXTURE +//!WIDTH INPUT_WIDTH * 2 +//!HEIGHT INPUT_HEIGHT * 2 +Texture2D OUTPUT; + +//!SAMPLER +//!FILTER POINT +SamplerState SP; + +//!SAMPLER +//!FILTER LINEAR +SamplerState SL; + +//!COMMON +#define O(t, p) t.SampleLevel(SP, pos + p * pt, 0) +#define V4 min16float4 +#define M4 min16float4x4 + +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +//!FORMAT R8G8B8A8_SNORM +Texture2D t0; + +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +//!FORMAT R8G8B8A8_SNORM +Texture2D t1; + +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +//!FORMAT R8G8B8A8_SNORM +Texture2D t2; + +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +//!FORMAT R8G8B8A8_SNORM +Texture2D t3; + +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +//!FORMAT R8G8B8A8_SNORM +Texture2D t4; + +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +//!FORMAT R8G8B8A8_SNORM +Texture2D t5; + +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +//!FORMAT R8G8B8A8_SNORM +Texture2D t6; + +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +//!FORMAT R8G8B8A8_SNORM +Texture2D t7; + +//!PASS 1 +//!DESC in +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 +//!IN INPUT +//!OUT t0, t1, t2, t3 + +#define l0(x, y) min16float((dot(float3(6.280e-01, 1.208e+00, 2.567e-01), O(INPUT, float2(x, y)).rgb) + -3.744e-01)) + +V4 f0(min16float s0_0, min16float s0_1, min16float s0_2, min16float s0_3, min16float s0_4, min16float s0_5, min16float s0_6, min16float s0_7, min16float s0_8) { + V4 r = 0.0; + r += V4(-1.822e-02, -1.642e-02, -6.093e-02, -3.689e-02) * s0_0; + r += V4(-1.147e-02, -2.455e-02, 1.336e-01, 1.564e-02) * s0_1; + r += V4(4.406e-02, -2.573e-02, -4.749e-02, 1.795e-02) * s0_2; + r += V4(4.456e-02, -1.651e-02, 3.591e-02, 3.674e-02) * s0_3; + r += V4(8.599e-04, 5.169e-02, 1.467e-02, -5.650e-02) * s0_4; + r += V4(-7.104e-02, 9.408e-02, -1.980e-02, 3.932e-03) * s0_5; + r += V4(-1.400e-02, -3.072e-02, -3.497e-02, 2.479e-02) * s0_6; + r += V4(1.641e-02, -3.119e-02, 2.443e-02, 1.844e-02) * s0_7; + r += V4(2.346e-02, 7.281e-03, -2.342e-02, -3.454e-02) * s0_8; + r += V4(7.451e-03, 5.332e-03, 9.656e-03, -1.242e-02); + return r; +} + +V4 f1(min16float s0_0, min16float s0_1, min16float s0_2, min16float s0_3, min16float s0_4, min16float s0_5, min16float s0_6, min16float s0_7, min16float s0_8) { + V4 r = 0.0; + r += V4(2.452e-02, -8.793e-04, 2.884e-02, 1.094e-02) * s0_0; + r += V4(-1.529e-01, 1.290e-03, -2.407e-01, 5.000e-02) * s0_1; + r += V4(1.185e-01, -4.263e-03, -7.048e-02, -3.493e-04) * s0_2; + r += V4(5.017e-02, 6.435e-04, -7.056e-02, -9.790e-02) * s0_3; + r += V4(7.300e-02, -9.583e-03, 2.147e-01, -1.977e-01) * s0_4; + r += V4(-9.542e-02, 8.440e-03, 6.774e-02, 2.347e-01) * s0_5; + r += V4(-7.992e-02, 2.175e-01, 4.417e-02, -4.492e-02) * s0_6; + r += V4(3.449e-02, -2.192e-01, 1.774e-02, 4.249e-02) * s0_7; + r += V4(2.266e-02, 4.264e-03, 8.381e-03, 7.037e-04) * s0_8; + r += V4(-6.910e-03, 1.934e-02, -1.482e-02, -5.155e-03); + return r; +} + +V4 f2(min16float s0_0, min16float s0_1, min16float s0_2, min16float s0_3, min16float s0_4, min16float s0_5, min16float s0_6, min16float s0_7, min16float s0_8) { + V4 r = 0.0; + r += V4(-1.788e-02, -3.939e-03, 3.515e-03, 5.372e-02) * s0_0; + r += V4(9.512e-03, -1.173e-01, 1.768e-02, -1.150e-02) * s0_1; + r += V4(2.307e-02, 1.062e-01, -1.145e-02, 1.127e-02) * s0_2; + r += V4(-3.332e-02, -1.779e-02, 7.936e-04, 1.545e-01) * s0_3; + r += V4(9.399e-02, -2.767e-02, -2.517e-03, -1.732e-01) * s0_4; + r += V4(-5.877e-02, 4.553e-02, 1.549e-04, -3.632e-02) * s0_5; + r += V4(3.380e-02, 2.040e-02, 1.815e-02, -1.465e-02) * s0_6; + r += V4(-8.618e-02, -1.800e-02, -2.228e-02, 7.153e-02) * s0_7; + r += V4(1.953e-02, 6.456e-03, 3.444e-02, -4.943e-02) * s0_8; + r += V4(-1.078e-02, 4.113e-02, -1.578e-02, 4.495e-03); + return r; +} + +V4 f3(min16float s0_0, min16float s0_1, min16float s0_2, min16float s0_3, min16float s0_4, min16float s0_5, min16float s0_6, min16float s0_7, min16float s0_8) { + V4 r = 0.0; + r += V4(3.349e-03, -4.958e-02, -5.999e-02, -2.301e-02) * s0_0; + r += V4(-4.576e-02, -7.846e-02, 1.042e-01, 1.803e-02) * s0_1; + r += V4(-2.080e-02, 1.088e-02, -3.553e-02, 2.650e-02) * s0_2; + r += V4(4.505e-02, -1.640e-01, 2.588e-02, 8.898e-02) * s0_3; + r += V4(-1.618e-02, 2.072e-02, -1.249e-01, -8.836e-02) * s0_4; + r += V4(6.673e-02, -7.729e-02, 2.106e-01, 4.868e-03) * s0_5; + r += V4(2.755e-02, 4.993e-02, 1.931e-02, -1.542e-02) * s0_6; + r += V4(-7.155e-02, 3.289e-02, -1.268e-01, 1.315e-02) * s0_7; + r += V4(-5.611e-02, -4.307e-02, -2.551e-02, -1.216e-03) * s0_8; + r += V4(-2.374e-02, -6.784e-02, -1.047e-02, 6.831e-03); + return r; +} + +void Pass1(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = Rmp8x8(tid.x) + blockStart; + uint2 size = GetInputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = (gxy + 0.5) * pt; + + min16float s0_0 = l0(-1.0, -1.0); + min16float s0_1 = l0(0.0, -1.0); + min16float s0_2 = l0(1.0, -1.0); + min16float s0_3 = l0(-1.0, 0.0); + min16float s0_4 = l0(0.0, 0.0); + min16float s0_5 = l0(1.0, 0.0); + min16float s0_6 = l0(-1.0, 1.0); + min16float s0_7 = l0(0.0, 1.0); + min16float s0_8 = l0(1.0, 1.0); + + t0[gxy] = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8); + t1[gxy] = f1(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8); + t2[gxy] = f2(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8); + t3[gxy] = f3(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8); +} + +//!PASS 2 +//!DESC conv1 +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 +//!IN t0, t1, t2, t3 +//!OUT t4, t5, t6, t7 + +#define l0(x, y) V4(O(t0, float2(x, y))) +#define l1(x, y) V4(O(t1, float2(x, y))) +#define l2(x, y) V4(O(t2, float2(x, y))) +#define l3(x, y) V4(O(t3, float2(x, y))) + +V4 f0(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(3.405e-02, 1.208e-01, 8.406e-02, 1.417e-02, 3.850e-02, -1.326e-02, 1.209e-01, -1.793e-02, 9.657e-02, 1.077e-01, 7.998e-02, -2.348e-02, 2.585e-01, -1.255e-01, -7.102e-02, -2.930e-01)); + r += mul(s0_1, M4(-4.104e-02, -1.013e-01, -5.548e-02, -5.558e-02, -7.116e-02, -7.352e-02, 9.299e-02, 1.656e-01, 3.298e-03, -9.411e-02, -1.419e-02, 6.433e-02, 9.729e-02, -5.107e-03, 8.303e-02, -7.063e-02)); + r += mul(s0_2, M4(2.247e-02, 6.092e-03, 7.178e-02, 5.407e-02, 1.271e-01, -3.168e-02, -1.879e-02, -1.943e-01, -7.868e-02, -7.007e-02, 1.446e-01, -4.654e-03, -5.827e-01, 3.794e-02, -3.417e-01, 2.123e-01)); + r += mul(s0_3, M4(-3.101e-02, -1.111e-01, -2.802e-02, -1.350e-02, 1.242e-01, 1.283e-03, -2.013e-02, 7.201e-02, -5.530e-02, -4.907e-02, -1.342e-01, -6.673e-02, -9.311e-02, 1.897e-01, 9.046e-02, 2.898e-01)); + r += mul(s0_4, M4(-1.784e-02, -5.918e-02, 5.845e-02, 8.362e-02, -1.333e-01, -2.641e-01, -3.031e-02, -1.676e-02, 6.354e-02, 8.276e-02, 1.069e-01, 5.125e-02, -4.843e-02, 2.944e-01, 1.044e-01, 2.449e-01)); + r += mul(s0_5, M4(1.501e-02, 7.449e-02, -8.033e-02, -1.139e-01, 1.853e-02, 1.338e-01, -8.268e-02, -1.636e-01, -6.581e-03, -1.703e-02, -9.384e-03, 7.188e-02, -4.501e-02, -1.583e-01, -2.663e-01, -8.279e-02)); + r += mul(s0_6, M4(1.077e-02, 5.902e-02, -5.638e-02, 4.160e-02, 1.254e-01, 1.971e-01, -6.279e-02, -4.505e-02, -1.191e-01, -1.344e-01, -3.873e-02, 6.566e-02, -2.099e-01, 1.337e-01, 1.642e-01, -2.878e-01)); + r += mul(s0_7, M4(-2.701e-02, 1.882e-02, -2.052e-02, 7.546e-02, 2.460e-02, 1.171e-01, 8.827e-03, -2.274e-02, 4.265e-02, 1.404e-01, 7.646e-02, -8.588e-03, 2.457e-01, -1.233e-01, -1.493e-01, 5.879e-02)); + r += mul(s0_8, M4(-1.900e-03, 5.256e-02, 2.608e-02, -9.680e-02, -5.792e-03, 8.072e-03, 7.046e-02, -1.668e-02, -1.813e-01, 7.429e-02, -1.250e-01, 3.976e-03, 7.827e-02, 7.365e-02, 3.113e-01, -4.493e-01)); + r += mul(s1_0, M4(-2.589e-01, -2.860e-02, 3.458e-02, 1.518e-01, -8.472e-02, -2.572e-02, 1.100e-02, 2.920e-01, -4.118e-02, -8.286e-02, 1.441e-02, 3.005e-01, -2.189e-02, 3.752e-03, 6.699e-02, 2.245e-02)); + r += mul(s1_1, M4(-1.753e-02, 1.462e-01, -1.202e-01, 3.685e-02, 6.990e-02, -6.744e-02, 1.121e-01, -2.440e-01, -9.690e-02, 5.161e-02, 6.374e-02, -2.208e-01, 6.330e-02, -2.542e-02, -1.029e-01, -5.961e-03)); + r += mul(s1_2, M4(-8.907e-03, 7.720e-02, 2.137e-01, -1.415e-01, -2.575e-01, -1.161e-01, -2.410e-02, 1.523e-01, -2.136e-02, -1.143e-01, 6.256e-02, -2.706e-01, 6.094e-02, 1.216e-01, 7.402e-03, 2.078e-02)); + r += mul(s1_3, M4(-1.839e-01, 2.521e-02, -6.316e-02, -4.873e-04, -1.836e-01, 1.820e-01, -3.747e-03, -2.238e-02, -2.794e-02, -1.929e-01, 9.416e-03, 1.670e-01, 7.294e-02, -4.497e-02, 3.260e-02, -8.590e-02)); + r += mul(s1_4, M4(1.612e-01, 2.591e-01, -1.860e-01, 5.530e-01, -1.690e-02, 2.011e-02, -6.756e-02, -4.013e-02, 2.219e-01, 9.343e-02, -6.113e-02, -2.694e-01, -5.443e-02, 4.693e-02, -1.964e-03, -6.205e-02)); + r += mul(s1_5, M4(-9.952e-02, -4.111e-01, 2.484e-01, 2.142e-01, 3.349e-02, -8.974e-02, 9.233e-03, 1.371e-01, 9.616e-02, -2.994e-01, -3.412e-02, -2.624e-01, -2.777e-02, 5.845e-02, -4.256e-02, 5.163e-03)); + r += mul(s1_6, M4(-2.489e-01, 3.013e-01, -1.623e-01, 4.737e-02, -2.570e-01, -3.679e-01, 8.586e-02, -8.836e-02, 1.821e-01, -1.438e-01, -3.181e-02, 1.531e-01, -4.456e-02, 6.053e-02, -4.692e-03, 1.889e-01)); + r += mul(s1_7, M4(5.682e-02, 7.344e-02, 5.417e-02, 2.450e-01, 4.026e-03, -1.124e-01, 5.952e-02, 1.936e-01, 3.018e-01, -1.236e-02, 3.948e-02, -5.773e-02, -4.648e-02, -5.322e-02, -5.548e-03, -7.449e-02)); + r += mul(s1_8, M4(4.563e-02, 4.610e-02, 4.906e-02, -3.220e-01, 2.408e-02, 6.485e-02, -5.831e-03, -6.206e-02, 1.508e-01, 1.450e-01, -2.797e-02, -3.810e-01, -1.370e-02, -1.935e-01, 5.435e-02, 5.075e-02)); + r += mul(s2_0, M4(-3.448e-02, -6.980e-02, 5.779e-02, 6.469e-02, 3.711e-02, -3.232e-02, -7.098e-02, -3.179e-03, -8.000e-03, 2.579e-02, -2.380e-02, 3.991e-02, -1.541e-02, 9.551e-02, 1.269e-01, 1.477e-01)); + r += mul(s2_1, M4(-6.560e-02, 1.108e-02, 9.036e-02, 2.225e-02, 2.757e-02, 2.216e-01, 4.036e-02, -4.563e-02, -7.943e-02, 3.388e-02, -2.570e-02, 1.062e-02, -1.880e-01, 2.051e-01, 1.599e-02, 9.407e-02)); + r += mul(s2_2, M4(-6.447e-02, 2.987e-02, 7.575e-02, -2.814e-03, -2.009e-01, 7.443e-02, 5.020e-02, 1.241e-02, -1.464e-02, -2.127e-02, -1.959e-02, -9.106e-02, -1.876e-02, 6.003e-02, -1.087e-01, 4.157e-03)); + r += mul(s2_3, M4(1.373e-01, 8.434e-02, -7.087e-02, -2.916e-02, 9.784e-02, -1.666e-01, 4.713e-02, 2.128e-02, -7.791e-02, 1.843e-01, 1.793e-02, -6.299e-03, 5.664e-02, -1.375e-02, -5.741e-02, 5.340e-03)); + r += mul(s2_4, M4(-1.958e-01, 1.879e-01, 3.784e-02, -1.695e-01, 1.220e-01, 1.435e-02, 6.042e-02, 6.976e-02, -4.420e-02, -2.048e-01, 1.407e-01, 8.324e-02, 9.824e-02, -4.772e-03, 3.171e-02, -9.108e-02)); + r += mul(s2_5, M4(1.473e-01, 4.592e-04, -3.968e-01, -3.998e-02, 5.250e-02, -1.122e-02, 4.195e-03, -6.805e-02, -7.127e-02, -7.509e-02, -5.716e-02, -9.791e-02, 1.336e-01, 1.031e-01, 1.315e-01, 7.645e-02)); + r += mul(s2_6, M4(1.184e-01, 1.619e-01, 4.172e-02, -8.332e-02, -7.003e-02, 9.098e-03, -1.272e-02, 6.432e-02, -7.801e-02, -7.251e-02, 4.113e-02, 5.624e-02, 1.280e-03, -8.267e-02, -5.059e-03, -8.324e-02)); + r += mul(s2_7, M4(3.987e-02, 8.653e-02, -1.324e-01, 3.768e-02, 1.034e-02, -7.325e-02, -2.599e-02, 6.754e-02, -2.531e-02, 5.051e-02, 6.231e-02, -2.843e-02, -9.684e-02, 3.120e-02, 2.869e-02, -1.306e-01)); + r += mul(s2_8, M4(1.452e-01, 2.250e-02, -3.331e-02, -2.652e-01, -7.785e-02, 7.697e-02, 5.306e-02, -1.206e-02, 2.950e-02, -1.129e-02, -1.240e-02, 8.520e-02, -1.194e-01, -5.583e-03, 1.318e-01, 4.145e-02)); + r += mul(s3_0, M4(2.435e-01, 2.473e-02, -3.799e-03, 5.391e-02, -7.654e-02, 1.633e-02, 2.528e-03, 2.085e-03, -7.200e-02, -1.247e-01, 9.995e-02, 1.192e-01, 4.968e-02, -3.659e-02, 7.987e-02, -1.196e-01)); + r += mul(s3_1, M4(1.970e-02, -9.596e-02, 2.596e-02, 9.929e-02, -9.603e-02, 7.357e-02, 3.207e-02, -1.129e-01, 1.304e-01, 3.305e-02, -3.747e-02, -1.177e-02, -8.392e-02, -1.410e-02, -1.620e-01, 4.514e-02)); + r += mul(s3_2, M4(1.392e-02, -1.797e-01, -6.554e-02, -6.099e-02, -2.959e-01, 1.745e-01, 1.944e-01, -2.134e-01, 2.435e-02, -5.074e-02, 5.244e-02, -2.474e-02, -5.085e-02, -9.063e-02, -1.671e-01, -1.548e-02)); + r += mul(s3_3, M4(8.034e-02, 1.214e-01, 5.679e-02, -1.209e-01, 1.102e-01, -1.500e-03, 7.307e-02, -2.826e-02, 6.892e-02, 9.349e-02, -2.101e-02, 1.285e-01, 8.814e-02, -2.099e-02, -1.133e-01, 1.462e-02)); + r += mul(s3_4, M4(1.852e-02, -1.295e-01, -3.895e-03, 6.403e-02, -9.664e-02, -7.860e-02, 1.175e-01, -2.920e-01, 1.508e-01, -2.417e-01, -2.569e-01, -2.920e-02, -1.046e-01, 9.367e-02, -2.173e-01, 2.044e-01)); + r += mul(s3_5, M4(-8.709e-02, -3.534e-02, -9.278e-02, 3.574e-02, 3.987e-02, -8.859e-02, 1.562e-02, -2.034e-01, 1.528e-01, -3.803e-02, -2.427e-01, -5.409e-02, -3.348e-03, 7.453e-02, 6.794e-02, 3.836e-02)); + r += mul(s3_6, M4(1.220e-02, 2.105e-01, 4.535e-02, 6.563e-02, 6.836e-02, 5.600e-02, 1.560e-02, -6.164e-02, -1.412e-01, -1.103e-01, -8.076e-02, -6.528e-02, 9.211e-02, 1.990e-01, -5.119e-02, -8.996e-02)); + r += mul(s3_7, M4(-1.457e-01, -1.085e-01, 1.784e-02, -2.185e-03, 4.281e-02, 5.354e-02, -1.300e-02, -1.125e-01, 7.293e-02, 3.576e-02, -1.282e-01, -5.457e-02, -1.048e-02, 7.982e-02, 6.479e-02, -6.245e-02)); + r += mul(s3_8, M4(3.417e-02, 9.233e-02, 8.488e-02, 2.901e-02, -9.098e-02, 1.505e-01, 3.521e-02, -4.778e-02, 1.625e-01, -1.207e-01, 4.013e-02, 5.975e-02, -1.180e-02, -3.180e-03, 1.255e-01, -6.819e-03)); + r += mul(s4_0, M4(1.537e-01, 2.518e-01, 1.641e-01, -4.800e-01, -8.067e-02, -4.263e-02, -1.103e-02, 5.467e-03, -1.560e-01, 1.149e-01, -1.443e-02, 2.685e-02, 4.818e-03, -6.548e-02, -2.986e-02, -9.109e-02)); + r += mul(s4_1, M4(-2.142e-01, 2.512e-02, 1.720e-01, -1.679e-01, 8.108e-02, 6.832e-02, 9.115e-02, -2.173e-03, 1.329e-01, -3.490e-02, -5.578e-02, 1.104e-01, -4.784e-02, -3.582e-02, -9.612e-02, -6.821e-02)); + r += mul(s4_2, M4(-4.783e-02, 3.973e-01, 1.161e-01, 1.626e-01, -2.491e-02, 1.686e-02, -3.443e-02, -1.059e-01, 5.977e-02, -6.490e-02, -6.506e-02, -4.471e-02, -2.849e-02, -7.122e-03, 1.789e-02, 1.267e-01)); + r += mul(s4_3, M4(2.408e-01, -8.330e-02, -8.275e-02, -6.422e-02, 9.443e-02, -1.883e-01, -2.351e-02, 2.905e-02, 1.478e-02, 6.625e-03, 1.380e-01, 1.312e-01, -9.895e-02, -1.294e-01, -1.465e-02, -2.186e-01)); + r += mul(s4_4, M4(6.419e-01, -3.723e-01, -2.565e-01, -4.735e-01, -3.051e-02, -1.246e-01, 3.242e-02, 2.361e-02, -4.670e-02, 4.870e-02, 8.938e-02, -7.246e-02, 8.033e-02, 1.626e-01, 4.382e-02, -3.981e-02)); + r += mul(s4_5, M4(4.743e-01, 1.601e-02, 1.143e-01, 1.107e-01, -8.403e-02, -2.654e-02, 3.615e-02, -3.300e-02, 1.836e-02, -6.122e-02, -3.072e-02, 1.730e-02, -2.944e-01, -8.219e-02, 1.862e-01, -1.063e-01)); + r += mul(s4_6, M4(-1.115e-02, 4.246e-01, -5.974e-03, -1.735e-02, 5.712e-02, 3.389e-01, 3.325e-02, 9.249e-02, -3.867e-02, -1.899e-01, -1.033e-01, -7.591e-02, -8.186e-02, 1.306e-01, -3.340e-02, -9.847e-03)); + r += mul(s4_7, M4(4.828e-01, 2.198e-01, -2.150e-01, 6.362e-03, -1.232e-01, 1.776e-01, -5.929e-02, -4.373e-03, -5.813e-03, 1.354e-02, 3.540e-03, 4.267e-02, 1.379e-03, 9.057e-02, 2.345e-02, -2.193e-02)); + r += mul(s4_8, M4(-8.730e-02, 3.307e-01, -3.251e-02, -2.900e-01, 7.154e-02, 3.098e-02, 1.980e-02, -4.968e-02, 1.170e-02, 1.528e-01, 2.639e-02, -9.142e-02, 1.829e-02, -5.244e-02, 9.641e-03, -5.492e-02)); + r += mul(s5_0, M4(6.116e-02, 8.943e-02, -5.531e-02, -2.696e-02, -1.376e-01, 1.998e-01, 5.097e-02, 6.659e-03, 5.555e-02, 6.673e-02, 8.981e-02, 8.069e-02, 1.494e-01, -3.698e-02, -1.053e-01, -8.436e-02)); + r += mul(s5_1, M4(-4.488e-02, 7.922e-02, 1.704e-02, 4.343e-02, 3.390e-02, -6.945e-02, 4.841e-02, 1.197e-01, 6.671e-02, -2.253e-02, 1.270e-02, -3.095e-01, 2.412e-01, -5.589e-02, -8.286e-02, 3.333e-02)); + r += mul(s5_2, M4(-4.554e-02, -1.439e-02, 7.602e-02, -3.426e-02, -1.577e-01, 7.685e-02, 6.846e-02, 5.846e-02, -1.920e-01, -1.635e-01, -1.462e-01, 1.753e-01, -6.704e-02, 1.433e-01, 1.133e-02, -2.406e-02)); + r += mul(s5_3, M4(-1.738e-03, -8.318e-02, 2.537e-03, -1.054e-02, -1.916e-01, -2.127e-01, 4.746e-02, 7.098e-03, 2.601e-02, -8.985e-02, -7.906e-03, 3.103e-01, 7.611e-02, -5.874e-02, 3.964e-02, 6.860e-02)); + r += mul(s5_4, M4(-1.138e-01, -1.847e-01, -1.228e-02, -1.407e-01, -1.218e-01, 1.584e-01, 3.814e-02, 2.447e-01, 4.855e-02, 8.447e-03, 9.850e-02, -3.130e-02, 1.525e-01, 2.940e-01, 7.898e-02, 1.821e-01)); + r += mul(s5_5, M4(3.111e-02, -5.260e-02, -6.819e-02, 5.936e-03, 1.700e-01, 9.746e-02, 1.690e-02, 4.625e-02, -2.485e-02, 7.180e-02, 5.899e-02, -3.583e-02, 6.990e-02, 8.228e-02, 4.081e-02, 2.349e-02)); + r += mul(s5_6, M4(3.099e-02, 8.576e-02, -3.833e-03, 2.430e-03, 1.976e-01, 2.695e-01, 9.600e-02, 2.032e-01, 2.092e-01, -8.031e-02, -1.265e-01, 1.841e-02, 6.259e-02, 8.119e-02, 1.225e-02, 5.224e-02)); + r += mul(s5_7, M4(-8.051e-02, -2.677e-02, -2.939e-02, 4.138e-02, -1.644e-01, -1.498e-01, 1.202e-01, 7.046e-02, -6.764e-02, -1.100e-01, 3.688e-02, -2.193e-01, 9.462e-02, -1.360e-01, 2.253e-02, -5.379e-02)); + r += mul(s5_8, M4(5.739e-03, -2.755e-02, -2.324e-02, 1.058e-01, -7.982e-02, -1.026e-01, 2.569e-01, -1.335e-01, -1.647e-01, 9.644e-02, 9.909e-02, -1.077e-01, 3.698e-02, 6.935e-03, 5.650e-03, 6.725e-02)); + r += mul(s6_0, M4(4.240e-01, -2.918e-01, -3.133e-02, 2.327e-01, -2.695e-01, 1.043e-01, -2.850e-01, 3.208e-01, 2.258e-01, -2.135e-01, -1.859e-01, 7.547e-03, 9.245e-02, -5.596e-03, 9.937e-02, 2.943e-02)); + r += mul(s6_1, M4(2.101e-01, -3.744e-01, 1.696e-01, -1.703e-02, -9.047e-02, -1.152e-01, -1.393e-01, 3.266e-01, 7.654e-02, 2.414e-01, 3.308e-02, 3.706e-03, -1.490e-01, 4.122e-02, -5.556e-02, 1.216e-01)); + r += mul(s6_2, M4(5.715e-02, -2.730e-01, -3.063e-01, 2.882e-01, -3.335e-01, -2.502e-01, -6.934e-02, 6.301e-01, 5.091e-02, -6.457e-02, 8.581e-02, -1.191e-01, 9.755e-03, -8.909e-02, 2.613e-02, -9.604e-02)); + r += mul(s6_3, M4(5.395e-01, -1.115e-01, 1.102e-01, 1.496e-01, 1.512e-01, 1.230e-01, 1.636e-01, -5.026e-01, -1.340e-01, -7.226e-02, -2.846e-01, 8.937e-02, -4.186e-02, -9.760e-02, -4.782e-02, 8.662e-02)); + r += mul(s6_4, M4(5.268e-01, -5.914e-02, 3.737e-01, 1.957e-01, -5.624e-01, -4.037e-03, 1.324e-01, -1.029e-01, 1.476e-01, -8.394e-03, -1.478e-01, 3.448e-02, 2.002e-02, 6.459e-02, 2.170e-02, 9.597e-03)); + r += mul(s6_5, M4(4.312e-01, -1.827e-01, 3.503e-01, -1.471e-02, 2.903e-01, -6.051e-02, 4.530e-02, 1.642e-01, 1.965e-01, -9.838e-02, -2.136e-01, -2.281e-02, 4.991e-02, -5.003e-02, 9.837e-03, 2.202e-02)); + r += mul(s6_6, M4(-2.240e-02, -4.757e-01, 2.564e-02, 1.577e-01, 3.382e-01, -7.741e-02, -2.645e-01, -1.375e-01, -2.008e-01, 8.069e-03, -2.638e-02, 5.265e-02, 2.141e-02, 3.570e-02, 4.337e-03, 5.465e-02)); + r += mul(s6_7, M4(1.627e-01, -2.946e-01, 3.193e-01, 2.728e-02, -7.392e-02, -3.848e-01, 1.789e-01, 1.881e-01, 1.077e-01, -4.805e-02, 1.793e-02, -6.635e-02, 7.963e-02, 5.029e-02, -4.372e-02, 1.278e-02)); + r += mul(s6_8, M4(3.372e-01, -1.486e-01, -9.936e-02, 2.261e-01, -5.973e-02, -8.111e-02, -8.219e-02, -1.498e-01, 1.329e-02, -2.499e-02, -1.245e-01, -3.871e-02, -1.800e-02, 6.380e-03, 1.756e-02, -1.356e-01)); + r += mul(s7_0, M4(9.764e-02, -7.088e-02, 3.507e-02, -4.570e-02, 1.675e-01, 1.448e-02, -2.842e-02, -1.203e-01, 6.582e-02, -3.174e-03, -1.471e-02, 1.304e-01, -1.061e-01, 1.586e-01, 1.244e-01, 2.246e-01)); + r += mul(s7_1, M4(1.038e-01, -1.092e-02, -9.483e-02, -1.292e-02, 5.143e-02, 2.371e-02, -1.147e-01, 8.272e-02, 2.127e-02, -1.111e-02, 1.006e-02, 4.855e-02, 2.508e-01, -2.958e-01, -1.424e-01, -3.592e-02)); + r += mul(s7_2, M4(-7.218e-04, 1.665e-01, 2.076e-02, 1.902e-02, -1.085e-02, 7.997e-04, -5.125e-02, 1.165e-01, 1.279e-02, -7.016e-03, 1.398e-01, 4.262e-02, -1.469e-01, 3.665e-01, 2.113e-01, -2.286e-01)); + r += mul(s7_3, M4(-2.811e-02, -1.652e-02, -4.187e-02, -5.403e-02, 1.064e-01, 1.429e-02, 2.725e-02, -6.861e-02, 1.013e-01, 6.601e-03, 2.723e-02, -8.197e-02, -2.954e-01, -6.184e-02, 6.907e-02, -3.243e-01)); + r += mul(s7_4, M4(-2.777e-02, 6.185e-02, -5.263e-02, 2.158e-02, -6.411e-02, 1.157e-01, 4.594e-02, -6.461e-02, -4.041e-02, 6.406e-02, 1.326e-01, -9.146e-02, 3.969e-02, 1.986e-01, 1.955e-01, 1.678e-01)); + r += mul(s7_5, M4(-1.103e-01, 3.382e-03, -3.581e-02, 4.331e-02, -8.628e-02, 5.449e-02, 1.768e-02, 1.167e-01, -7.616e-02, 1.801e-03, -1.890e-01, 1.538e-01, 1.400e-01, 2.025e-02, -9.030e-02, -1.654e-01)); + r += mul(s7_6, M4(-4.734e-02, -1.122e-02, -7.030e-02, -3.296e-02, -4.429e-02, -1.066e-02, 5.152e-02, -4.982e-02, 7.570e-02, -6.662e-02, -2.449e-02, 4.657e-02, 3.968e-02, 1.738e-01, -6.707e-02, 8.950e-02)); + r += mul(s7_7, M4(2.593e-02, -8.762e-02, 2.691e-02, 2.567e-02, -2.261e-02, -8.078e-02, 2.215e-02, -1.150e-01, 4.263e-02, 3.631e-02, 2.093e-01, -1.596e-01, -2.217e-01, -5.036e-02, 3.256e-01, -4.437e-01)); + r += mul(s7_8, M4(9.507e-02, -1.750e-01, 5.547e-02, 2.569e-02, -6.372e-02, -6.292e-02, 1.046e-01, 4.929e-02, -1.081e-01, -5.278e-02, -1.532e-01, 9.554e-02, 1.158e-01, -2.101e-01, 9.519e-02, 9.693e-02)); + r += V4(1.201e-02, 1.083e-03, -4.431e-02, -2.855e-02); + return r; +} + +V4 f1(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(4.593e-02, 6.965e-02, -5.918e-03, 3.008e-02, 4.446e-02, -6.509e-02, 6.633e-02, -1.259e-01, 1.482e-01, 4.613e-02, -7.350e-03, 3.255e-02, 1.542e-01, -1.126e-01, 1.986e-01, -1.911e-01)); + r += mul(s0_1, M4(-8.134e-02, -8.285e-02, -2.539e-03, -4.290e-02, -6.715e-02, 1.421e-02, -1.284e-02, -1.869e-02, -1.153e-01, -8.007e-02, -3.951e-02, -1.923e-01, 2.231e-01, 1.209e-03, -1.015e-01, -1.954e-01)); + r += mul(s0_2, M4(-1.721e-02, 1.054e-01, -2.497e-02, -1.724e-02, -2.214e-02, -1.559e-02, -1.890e-02, -3.045e-02, 6.823e-03, -5.394e-02, -9.170e-03, -3.634e-02, 3.752e-02, 1.746e-01, 1.125e-01, 8.602e-03)); + r += mul(s0_3, M4(-5.703e-02, -9.171e-02, 1.361e-02, -3.684e-02, -4.692e-02, 3.388e-02, -1.831e-02, 1.106e-01, -1.198e-01, 1.311e-02, 3.582e-02, 3.354e-03, -2.226e-01, 6.446e-02, -1.017e-02, 2.029e-01)); + r += mul(s0_4, M4(-6.122e-02, 1.638e-02, 2.959e-02, 7.356e-02, 3.443e-02, 2.426e-02, 1.646e-02, 6.604e-02, -1.895e-02, -1.110e-02, -3.352e-02, 8.554e-02, -1.042e-01, -1.617e-01, -9.264e-02, 8.956e-02)); + r += mul(s0_5, M4(1.202e-01, -8.740e-02, -5.419e-02, 2.845e-02, 6.640e-02, -1.831e-02, -9.561e-02, 2.954e-02, -5.409e-02, -1.691e-02, 4.133e-02, 6.700e-02, 1.537e-01, -2.451e-02, 2.398e-01, 4.803e-02)); + r += mul(s0_6, M4(1.267e-01, -2.486e-02, 1.156e-02, -1.058e-01, 1.161e-01, 1.732e-03, 1.920e-02, -7.541e-02, 9.098e-02, 5.822e-02, -6.071e-03, -2.099e-02, -2.110e-01, 1.116e-01, 3.081e-02, -9.744e-02)); + r += mul(s0_7, M4(5.810e-02, 9.912e-02, -3.762e-02, 5.625e-02, 4.588e-02, 6.554e-02, -4.150e-02, 1.172e-01, -6.263e-02, -5.435e-02, 1.023e-01, -2.423e-02, -7.424e-02, -1.023e-01, 1.303e-01, 1.908e-01)); + r += mul(s0_8, M4(3.099e-03, 2.677e-02, 7.748e-02, 3.166e-03, -1.029e-01, 5.916e-02, 1.292e-01, -4.601e-02, 1.430e-01, -3.183e-02, -2.547e-02, 4.187e-02, -1.713e-01, -1.143e-01, -7.347e-02, -3.159e-01)); + r += mul(s1_0, M4(3.408e-01, -2.309e-01, -1.278e-02, -2.090e-01, -1.190e-01, 5.742e-02, 2.033e-03, -8.545e-02, -7.710e-02, -2.276e-01, -3.857e-02, 1.980e-01, 3.238e-02, -9.525e-02, -2.383e-02, 7.602e-02)); + r += mul(s1_1, M4(1.939e-01, -1.004e-02, 8.190e-02, 1.505e-01, 1.839e-01, 3.155e-03, -3.659e-02, 1.297e-01, 5.044e-02, -1.145e-01, -7.815e-03, 1.335e-01, -9.720e-03, 2.058e-02, -1.485e-02, 1.543e-02)); + r += mul(s1_2, M4(8.855e-02, 2.239e-03, -4.702e-02, -3.631e-01, -7.713e-02, -6.766e-03, 2.233e-03, 9.525e-03, 1.930e-02, -1.823e-01, 1.342e-01, -6.774e-03, 1.559e-02, 6.537e-02, -1.795e-02, -4.694e-02)); + r += mul(s1_3, M4(-4.576e-02, -6.144e-02, -6.138e-02, 1.686e-01, -2.395e-02, 9.951e-02, 7.405e-02, 3.068e-02, -1.074e-01, -4.246e-02, -2.766e-01, -1.405e-01, -9.167e-02, 1.779e-02, 5.818e-02, -5.015e-02)); + r += mul(s1_4, M4(-4.979e-01, -9.989e-03, 1.713e-01, -1.294e-01, -7.555e-02, -2.530e-02, -1.001e-01, 1.538e-01, -3.042e-02, 1.180e-01, 1.838e-02, 4.506e-02, 4.005e-02, -9.967e-03, -4.310e-02, -8.393e-02)); + r += mul(s1_5, M4(-2.830e-02, -3.461e-01, 1.282e-01, 3.577e-02, -1.393e-02, 1.394e-02, -1.023e-01, -1.135e-02, 1.627e-01, -3.099e-03, -2.302e-01, 1.441e-01, -3.462e-02, 6.403e-02, 5.452e-02, 1.090e-01)); + r += mul(s1_6, M4(-1.832e-01, 7.516e-03, 1.466e-02, 3.691e-01, -1.559e-01, -4.819e-02, 7.241e-03, 9.579e-02, -2.765e-01, -1.187e-01, -2.102e-01, -5.277e-02, 1.527e-01, 8.032e-02, 4.021e-02, -6.910e-04)); + r += mul(s1_7, M4(-2.208e-01, -1.051e-01, -2.252e-01, 9.503e-02, 1.986e-01, -2.264e-01, 1.020e-01, 2.529e-02, 1.254e-02, -1.091e-02, 1.148e-01, -1.693e-01, -6.387e-02, -3.649e-02, -2.184e-02, -5.988e-02)); + r += mul(s1_8, M4(-1.843e-01, 1.650e-02, 4.734e-02, -2.337e-01, -4.757e-02, -1.540e-01, 8.401e-02, -3.806e-02, -1.397e-01, -9.808e-02, -1.770e-03, -9.557e-02, -2.257e-02, -4.093e-02, -6.275e-02, 3.909e-02)); + r += mul(s2_0, M4(2.269e-01, 4.167e-02, -2.057e-01, 1.879e-01, -1.647e-01, 4.798e-03, -4.511e-02, 3.278e-02, -3.302e-02, -1.713e-02, -4.034e-02, -8.332e-02, -1.108e-02, -4.393e-02, -1.385e-01, -1.401e-01)); + r += mul(s2_1, M4(1.445e-01, 2.818e-02, -1.505e-01, 1.646e-02, 2.380e-02, 4.553e-02, 1.564e-01, 6.671e-02, 3.429e-02, 1.754e-02, -5.880e-02, 6.240e-02, -2.534e-01, 3.632e-01, 7.507e-02, 9.621e-02)); + r += mul(s2_2, M4(-1.752e-01, -2.406e-02, -8.135e-02, -7.007e-02, 3.708e-02, -1.097e-01, -2.867e-02, 6.910e-02, -1.798e-01, -2.029e-02, 3.509e-02, -5.026e-02, -1.245e-01, -2.131e-03, -3.901e-02, 2.729e-02)); + r += mul(s2_3, M4(6.957e-02, 5.150e-02, -9.893e-02, -3.423e-02, 1.625e-02, 1.428e-02, 4.128e-03, 2.378e-02, 6.833e-02, 7.371e-02, -4.309e-02, 2.038e-01, -5.441e-02, -1.090e-01, -5.788e-02, 6.229e-02)); + r += mul(s2_4, M4(-2.013e-01, 5.460e-03, -5.024e-02, -4.798e-02, 3.047e-02, -1.250e-01, -2.914e-02, -2.341e-02, 8.051e-02, -1.409e-01, 1.108e-02, -2.132e-01, 1.834e-01, 3.419e-01, -1.062e-02, -5.360e-02)); + r += mul(s2_5, M4(1.434e-01, -1.899e-02, 2.671e-02, -7.373e-02, 7.201e-02, -1.086e-01, -3.585e-02, 1.098e-01, -2.883e-03, 6.731e-02, 1.686e-02, -4.630e-02, -6.464e-02, -1.193e-01, 7.557e-02, 1.030e-02)); + r += mul(s2_6, M4(5.960e-03, 1.333e-01, 2.685e-01, 5.152e-02, -1.077e-01, -5.213e-03, -3.739e-02, 1.658e-02, -1.064e-01, 1.801e-01, -6.249e-02, 2.196e-02, -4.823e-02, 2.505e-03, -3.396e-02, 6.965e-02)); + r += mul(s2_7, M4(3.899e-02, 1.850e-01, -1.271e-01, -9.524e-02, -1.084e-02, -1.428e-02, 8.129e-03, -1.078e-02, -9.281e-02, 1.151e-02, -1.851e-02, 4.171e-02, 6.663e-02, 1.382e-01, 4.955e-02, -9.132e-02)); + r += mul(s2_8, M4(-3.082e-02, -8.253e-02, -3.504e-02, 8.185e-02, -1.313e-02, 2.212e-02, 2.972e-02, 5.000e-02, -1.166e-01, -5.651e-02, -5.432e-02, 4.694e-02, -1.099e-01, 2.039e-02, 2.069e-02, -4.557e-03)); + r += mul(s3_0, M4(-1.585e-02, 1.466e-02, -4.267e-02, -5.614e-02, 1.164e-01, -6.371e-02, -9.176e-02, 7.206e-02, -1.356e-02, 4.092e-02, -5.365e-02, -1.641e-03, 4.063e-02, -6.379e-02, 2.210e-02, 1.436e-03)); + r += mul(s3_1, M4(6.984e-02, -5.214e-02, -4.253e-02, -1.445e-02, 4.849e-02, 8.436e-02, 3.124e-01, -4.697e-01, 1.115e-01, -6.359e-02, -1.039e-01, 7.934e-02, -5.735e-02, -1.229e-01, 9.510e-02, 6.278e-02)); + r += mul(s3_2, M4(1.688e-02, -1.271e-01, -4.236e-03, -6.955e-03, 2.137e-01, 1.715e-01, -1.716e-01, -1.164e-01, 5.225e-02, -3.736e-02, 8.417e-02, -1.413e-02, -2.981e-02, 6.164e-03, -5.309e-02, -7.856e-03)); + r += mul(s3_3, M4(1.087e-01, -1.362e-01, 4.361e-02, -9.546e-02, 3.759e-02, -2.007e-02, 1.285e-02, 3.452e-02, 5.193e-03, 9.202e-02, 4.827e-02, 8.008e-02, 3.363e-02, 1.744e-02, 3.567e-02, -9.209e-02)); + r += mul(s3_4, M4(-1.720e-01, 2.331e-01, 3.583e-02, 1.114e-01, 1.937e-02, 1.706e-01, 9.833e-02, 9.969e-05, -1.900e-01, 8.046e-02, 9.143e-02, -1.431e-01, 1.450e-01, -1.233e-01, 7.880e-02, -3.435e-01)); + r += mul(s3_5, M4(-1.042e-01, 2.382e-02, -2.653e-02, 1.030e-01, 1.121e-01, 9.533e-02, 1.601e-01, -1.002e-01, 1.912e-01, -6.912e-02, -4.182e-02, -7.941e-03, 1.306e-01, 5.380e-02, 6.607e-02, -1.478e-01)); + r += mul(s3_6, M4(-4.080e-02, 4.066e-02, 1.245e-01, 1.445e-02, 7.831e-03, -4.103e-02, 4.853e-02, 2.722e-02, 4.773e-02, 7.711e-02, 5.442e-02, 1.356e-02, 1.513e-02, -1.077e-01, -1.314e-01, 1.031e-01)); + r += mul(s3_7, M4(8.426e-03, 9.401e-02, 2.827e-04, -7.014e-03, -1.776e-02, 2.451e-03, -3.457e-02, -3.021e-02, 1.775e-01, 1.547e-01, -4.098e-02, 8.217e-02, -6.828e-02, -1.023e-01, -1.618e-01, 1.609e-01)); + r += mul(s3_8, M4(-3.647e-02, -7.072e-02, -2.245e-02, 3.874e-02, 1.091e-01, 5.723e-02, 8.320e-02, -5.249e-02, -1.304e-01, -9.974e-03, 5.121e-03, -2.301e-02, 4.467e-02, 1.580e-02, 1.349e-02, -3.634e-02)); + r += mul(s4_0, M4(2.720e-01, 5.417e-02, 6.718e-03, 1.218e-01, -3.485e-02, 4.959e-02, 3.606e-02, 1.036e-01, -2.731e-02, 2.062e-01, -5.221e-02, 1.929e-02, -1.417e-02, -6.537e-02, -7.646e-02, 8.719e-02)); + r += mul(s4_1, M4(-1.510e-01, 1.426e-01, -2.365e-02, 1.612e-01, 6.854e-02, 8.572e-02, -2.559e-03, -2.420e-03, -7.717e-02, -6.347e-02, -2.160e-02, -4.633e-03, -9.307e-02, 1.950e-01, -9.713e-02, -5.982e-02)); + r += mul(s4_2, M4(-6.662e-02, -2.942e-01, -1.199e-01, -1.262e-01, -6.380e-02, -6.602e-02, -6.361e-02, 7.754e-02, 2.637e-02, 2.350e-02, -1.359e-02, 7.084e-03, -1.043e-04, -6.505e-02, -2.926e-02, -6.666e-02)); + r += mul(s4_3, M4(3.742e-02, -8.908e-02, 5.752e-02, -1.911e-01, -8.525e-02, -4.037e-02, 1.399e-01, -1.822e-01, 7.731e-02, -1.682e-01, 1.426e-01, -1.243e-02, 6.935e-02, -1.187e-01, 7.949e-02, -1.088e-01)); + r += mul(s4_4, M4(-6.495e-02, -3.361e-01, -5.254e-01, -1.997e-01, 5.195e-02, 7.322e-03, -8.742e-02, 7.757e-02, -6.494e-02, -4.323e-02, -6.081e-02, 3.559e-02, 1.329e-01, 6.854e-02, 1.363e-02, 2.562e-02)); + r += mul(s4_5, M4(1.904e-01, -5.556e-02, 1.531e-01, -3.999e-01, -8.230e-02, -8.662e-03, -5.523e-03, 1.186e-01, 8.731e-02, 7.370e-02, 9.071e-03, -6.335e-02, 2.061e-02, -1.069e-01, 1.168e-01, -6.441e-02)); + r += mul(s4_6, M4(-2.114e-01, 2.655e-01, -1.276e-01, 1.694e-02, 1.000e-01, -6.448e-03, 5.444e-02, -1.185e-01, -7.768e-02, 6.957e-02, -4.817e-02, -3.406e-02, -2.532e-02, 6.830e-03, 5.735e-02, -6.098e-03)); + r += mul(s4_7, M4(-1.183e-01, 2.141e-01, 3.308e-02, 8.856e-02, 1.164e-01, 7.402e-02, 5.863e-02, 2.378e-02, 8.073e-02, 8.703e-02, 1.127e-01, -3.097e-02, 6.431e-02, 7.934e-02, -1.421e-01, -1.177e-01)); + r += mul(s4_8, M4(1.911e-02, 6.064e-02, -1.190e-01, -1.652e-02, 1.772e-02, -3.202e-02, 3.647e-02, -1.037e-01, -4.549e-02, -8.411e-02, -9.706e-02, 3.851e-02, 6.431e-02, -1.152e-02, -4.240e-02, -1.974e-03)); + r += mul(s5_0, M4(7.443e-02, -6.928e-02, 2.351e-02, 4.930e-02, 1.168e-01, -1.628e-01, -4.279e-02, -1.200e-01, -1.192e-01, -2.831e-02, -1.701e-01, -3.926e-02, -5.642e-03, -3.749e-02, 3.475e-02, -7.582e-03)); + r += mul(s5_1, M4(9.183e-02, 1.007e-02, -4.422e-02, -3.565e-02, -1.265e-01, 4.932e-02, 6.144e-03, -1.169e-01, 1.116e-01, 8.644e-02, 7.402e-02, -7.735e-02, 4.172e-02, 8.963e-02, 5.663e-02, -9.079e-02)); + r += mul(s5_2, M4(1.033e-01, 1.121e-01, -6.600e-02, -7.067e-02, 8.008e-02, 5.074e-03, 2.116e-02, 1.021e-01, -2.078e-01, -3.313e-02, 2.813e-02, 2.715e-01, -7.777e-02, -5.784e-03, 4.669e-02, 1.617e-01)); + r += mul(s5_3, M4(-3.387e-02, 6.943e-04, -3.529e-02, 3.672e-02, 9.172e-03, 1.474e-01, -1.151e-01, 3.213e-01, -6.365e-02, 8.501e-02, 3.243e-02, -1.321e-02, 9.236e-03, -1.537e-02, 8.765e-02, -1.485e-01)); + r += mul(s5_4, M4(-4.213e-02, 4.288e-02, -3.889e-02, -4.191e-02, 9.213e-02, 1.161e-02, 2.505e-02, 6.496e-02, 2.284e-01, 1.543e-02, 1.013e-01, 2.034e-01, -4.164e-02, 1.233e-01, 3.504e-02, 1.310e-01)); + r += mul(s5_5, M4(-5.845e-02, -3.905e-02, 1.690e-01, 9.346e-02, 1.464e-01, -3.299e-02, 7.769e-02, 1.264e-01, -1.575e-01, -5.546e-02, 1.137e-01, -3.536e-01, -1.947e-01, 6.519e-02, -9.272e-02, 2.226e-01)); + r += mul(s5_6, M4(-8.464e-02, -2.263e-02, 3.167e-02, 2.957e-02, 8.858e-02, 3.201e-02, 1.245e-01, 7.283e-02, 1.784e-01, -3.979e-01, -1.130e-01, 2.907e-01, -4.962e-02, 5.083e-02, -3.487e-02, 8.182e-02)); + r += mul(s5_7, M4(5.534e-03, -1.940e-02, 3.034e-02, 4.015e-02, -2.632e-01, -5.820e-02, 2.558e-01, 5.220e-03, 2.039e-01, 1.333e-01, 1.526e-01, -7.479e-03, -2.902e-02, -1.619e-02, -9.738e-02, 1.753e-01)); + r += mul(s5_8, M4(-4.383e-02, 3.273e-02, -6.726e-02, -1.053e-01, -3.610e-02, 5.577e-04, 4.668e-02, 2.124e-01, -1.050e-01, -7.297e-02, 1.163e-01, 6.734e-02, 1.420e-01, 3.221e-02, -5.040e-02, -6.009e-02)); + r += mul(s6_0, M4(-1.058e-01, 3.534e-04, -1.015e-01, -9.649e-02, -4.728e-01, 1.573e-01, -3.659e-01, -2.692e-02, -4.242e-02, 1.645e-01, -6.681e-02, 1.180e-01, 7.109e-02, -1.146e-01, 3.909e-03, -1.175e-01)); + r += mul(s6_1, M4(3.918e-01, -2.804e-01, 5.742e-02, -2.888e-01, -1.907e-01, 3.226e-01, -2.286e-01, 9.371e-02, -1.390e-01, 3.166e-02, -1.320e-01, -1.048e-01, 2.455e-02, 8.532e-02, -3.389e-02, 3.829e-02)); + r += mul(s6_2, M4(-1.743e-01, 5.073e-03, -1.500e-01, 1.373e-01, -9.960e-02, 4.622e-01, -1.019e-01, 2.484e-01, 6.440e-02, 1.303e-01, -4.173e-02, -2.134e-01, -1.767e-03, -2.657e-02, 5.925e-03, -1.008e-01)); + r += mul(s6_3, M4(1.635e-01, 7.175e-02, -4.210e-01, 1.910e-01, 7.190e-02, -1.673e-01, -6.935e-01, 2.881e-01, 5.265e-03, 1.428e-01, -1.461e-02, -2.738e-01, -8.529e-02, 4.118e-02, 3.806e-02, -9.775e-02)); + r += mul(s6_4, M4(-9.109e-02, 5.585e-02, -2.096e-01, 1.308e-01, 2.013e-02, -2.556e-01, -3.225e-01, -3.229e-02, 1.656e-01, 2.901e-02, -5.006e-02, 2.315e-01, 5.263e-02, 5.577e-02, -7.882e-02, 1.656e-01)); + r += mul(s6_5, M4(-4.867e-02, -3.351e-01, -2.222e-01, 2.360e-01, 2.046e-01, -4.787e-02, -2.503e-01, -1.280e-02, -1.055e-01, 1.078e-01, -7.193e-02, 3.649e-02, -1.851e-02, -5.966e-02, 3.070e-02, 6.660e-02)); + r += mul(s6_6, M4(1.316e-02, 2.458e-01, 5.478e-02, -2.485e-01, -1.203e-02, 3.974e-01, -7.347e-02, -2.075e-01, 6.866e-02, 4.869e-02, 4.098e-02, -3.162e-02, 9.583e-02, 1.312e-01, 9.177e-02, 6.787e-02)); + r += mul(s6_7, M4(1.409e-01, 3.337e-02, 2.823e-01, -2.116e-01, 1.947e-01, -2.228e-01, -5.020e-03, -1.945e-01, 1.279e-01, -8.825e-03, 1.868e-02, -1.351e-01, -6.698e-03, -1.001e-01, -1.419e-02, -9.151e-02)); + r += mul(s6_8, M4(-1.715e-01, -1.497e-01, 2.395e-01, 1.945e-01, -1.208e-01, 1.860e-01, -1.754e-01, -1.688e-01, -1.292e-01, 1.353e-01, -1.265e-01, 4.984e-02, -5.171e-02, 1.889e-02, -7.019e-02, 3.984e-02)); + r += mul(s7_0, M4(9.075e-02, 8.094e-02, -2.149e-02, -6.784e-02, 2.235e-02, -5.264e-02, -5.977e-02, 5.019e-02, 1.832e-01, -1.327e-01, -1.141e-01, 1.721e-02, -2.538e-01, -2.081e-01, -2.252e-02, 1.571e-01)); + r += mul(s7_1, M4(1.406e-01, 8.845e-02, 1.564e-01, 8.247e-02, 1.556e-02, 2.105e-02, 6.567e-02, 5.888e-02, -1.152e-01, 6.683e-02, -2.451e-04, -1.430e-02, -2.407e-01, 1.812e-02, 2.030e-01, -6.477e-02)); + r += mul(s7_2, M4(5.620e-02, -5.195e-02, -1.895e-01, 2.763e-02, -2.476e-02, -2.111e-03, -1.099e-02, 1.055e-01, -4.108e-02, -6.049e-03, 7.379e-02, -6.549e-04, 3.281e-02, -2.394e-01, 1.271e-01, -2.240e-01)); + r += mul(s7_3, M4(-9.938e-02, -7.305e-02, -4.676e-02, -6.918e-04, 6.597e-02, 3.119e-03, 8.736e-02, -1.131e-01, 5.605e-02, -5.043e-02, 7.552e-02, 1.419e-01, 2.350e-01, 1.710e-01, -3.276e-03, 5.825e-02)); + r += mul(s7_4, M4(-4.384e-02, 1.668e-01, -7.362e-02, 3.042e-03, -5.063e-02, -9.813e-02, 1.210e-01, -3.284e-02, 9.641e-02, 2.211e-01, -4.330e-03, 1.904e-01, 2.611e-01, 2.184e-01, 4.924e-02, 2.242e-01)); + r += mul(s7_5, M4(6.132e-02, 6.682e-03, 4.634e-02, 6.060e-02, -3.296e-02, 7.170e-02, 5.495e-02, 8.781e-03, -4.459e-02, 1.182e-02, -9.498e-03, -1.233e-01, -3.024e-01, 2.043e-01, -1.788e-01, -2.906e-01)); + r += mul(s7_6, M4(2.928e-02, 3.034e-02, 3.178e-02, -1.419e-03, -3.095e-02, 3.273e-02, 5.712e-02, 7.300e-03, 2.612e-02, -1.759e-02, 7.935e-02, -6.945e-02, -1.108e-01, 1.324e-01, -5.111e-02, 2.983e-01)); + r += mul(s7_7, M4(-1.131e-02, 6.068e-02, -3.666e-02, 9.163e-02, 3.126e-02, -3.859e-02, 6.360e-02, -1.437e-01, 2.207e-02, -6.323e-02, 1.945e-02, -2.169e-02, 1.127e-01, -1.509e-01, -1.471e-01, 2.640e-01)); + r += mul(s7_8, M4(-1.762e-01, -1.563e-01, 3.054e-02, -1.832e-02, 2.611e-02, -1.305e-02, 6.246e-02, 1.010e-02, 1.143e-02, -3.576e-02, -9.686e-02, 1.106e-01, -1.309e-01, -2.044e-01, -2.538e-02, -1.611e-01)); + r += V4(-2.302e-03, 5.607e-03, 2.301e-01, -2.287e-02); + return r; +} + +V4 f2(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-2.704e-02, 4.119e-02, -1.107e-02, 1.828e-02, -4.632e-02, 1.098e-01, 4.771e-02, -5.593e-02, -3.240e-02, -7.122e-02, -3.222e-02, -9.674e-03, -6.694e-02, 2.575e-02, 1.674e-02, 1.786e-01)); + r += mul(s0_1, M4(4.567e-02, -1.971e-02, 1.176e-02, 5.100e-02, -3.136e-02, -2.753e-03, -1.019e-02, -1.290e-01, 5.878e-02, 2.891e-02, -1.587e-01, -8.956e-02, -7.898e-02, -3.058e-01, 1.099e-02, 2.315e-02)); + r += mul(s0_2, M4(-1.749e-02, -3.178e-02, -1.223e-02, 1.942e-03, 9.650e-02, 7.544e-02, -9.168e-02, -9.126e-02, -4.168e-02, -4.084e-02, 9.683e-02, -4.930e-02, 2.975e-02, 4.417e-02, 1.359e-01, -2.128e-01)); + r += mul(s0_3, M4(-5.991e-02, -3.668e-02, -1.044e-02, -7.535e-02, 1.101e-01, 1.680e-01, 2.074e-02, 7.483e-02, 1.019e-01, 7.522e-02, 6.974e-02, -1.916e-02, -9.800e-02, -1.716e-01, -1.917e-02, -4.692e-03)); + r += mul(s0_4, M4(1.008e-01, 4.064e-02, -7.615e-02, 1.377e-02, -2.184e-02, 8.471e-02, 2.393e-01, 3.580e-02, -2.858e-01, 1.165e-02, -1.603e-01, 3.959e-02, -3.520e-01, 2.286e-01, 3.095e-01, 8.209e-02)); + r += mul(s0_5, M4(5.105e-02, 9.846e-02, -4.108e-02, 4.437e-02, 1.197e-01, 1.152e-02, 2.312e-01, 9.272e-02, -6.910e-02, 1.006e-02, 6.812e-02, 8.346e-02, -8.388e-02, -9.457e-02, -1.832e-01, -5.835e-02)); + r += mul(s0_6, M4(3.764e-02, -1.213e-01, -4.007e-03, -1.155e-01, -1.117e-01, -1.373e-01, -8.250e-02, 5.700e-02, -5.925e-02, -5.457e-02, -1.250e-01, -2.913e-02, 2.378e-01, 1.483e-01, 4.152e-02, -1.239e-01)); + r += mul(s0_7, M4(-3.888e-02, 7.090e-02, 4.034e-02, 3.863e-02, 2.613e-02, -1.153e-02, -2.250e-01, 1.420e-01, 1.299e-01, -1.318e-01, -7.944e-02, 8.884e-02, -6.052e-02, -6.205e-02, 2.843e-02, 2.440e-01)); + r += mul(s0_8, M4(-6.049e-02, -3.063e-02, 8.144e-02, 1.838e-02, 7.390e-02, -1.663e-02, -3.010e-02, -2.802e-02, -1.919e-01, 3.979e-03, 2.597e-01, 7.772e-02, 7.641e-02, 1.254e-01, 1.572e-01, 5.541e-02)); + r += mul(s1_0, M4(-3.671e-01, 7.588e-02, 6.621e-02, 2.213e-01, 1.526e-01, -5.132e-02, -1.760e-02, -8.277e-02, 2.952e-01, -1.816e-01, 8.647e-03, -1.812e-03, 2.321e-03, 2.707e-02, -7.167e-03, -1.863e-02)); + r += mul(s1_1, M4(-2.608e-02, 1.196e-01, -3.251e-03, -5.070e-02, 8.266e-02, -1.079e-01, -9.725e-02, -1.451e-02, 4.633e-03, 1.263e-01, -9.275e-02, 9.332e-03, 8.173e-02, 9.255e-03, -4.296e-03, 2.027e-02)); + r += mul(s1_2, M4(-1.099e-01, -6.099e-02, -5.077e-02, -5.578e-02, 3.175e-02, -4.658e-02, 2.868e-02, 5.742e-02, 9.943e-02, -6.563e-02, 8.187e-02, 9.414e-03, -4.800e-02, -8.106e-03, 1.858e-02, 1.403e-02)); + r += mul(s1_3, M4(9.989e-02, -8.257e-02, -1.219e-02, -6.931e-02, -6.557e-02, -5.428e-02, -8.126e-02, -9.715e-02, 9.848e-02, -8.316e-02, 7.289e-03, -3.675e-01, 6.269e-03, 3.037e-02, 1.013e-01, -8.937e-02)); + r += mul(s1_4, M4(-2.259e-01, -1.506e-01, -1.612e-01, 6.220e-02, -1.166e-01, 7.580e-02, 4.015e-02, -5.506e-02, 2.777e-01, 1.057e-01, -9.536e-02, 6.809e-02, 9.972e-02, -1.624e-02, -5.486e-02, -6.122e-02)); + r += mul(s1_5, M4(1.593e-01, 1.424e-01, -1.001e-01, 6.205e-02, -1.405e-01, -5.176e-02, 3.637e-02, -1.473e-02, 3.244e-01, 7.078e-02, -1.401e-02, -7.216e-02, -3.488e-03, 2.172e-02, -8.795e-02, 5.266e-02)); + r += mul(s1_6, M4(1.479e-01, -1.625e-01, -3.014e-03, 3.855e-02, 1.537e-01, 4.484e-02, -4.470e-02, 1.050e-01, -1.931e-01, 1.252e-01, -2.244e-02, 1.603e-02, -7.039e-02, -1.379e-01, -7.265e-02, -4.966e-02)); + r += mul(s1_7, M4(-3.219e-01, 2.311e-01, 4.962e-02, 8.471e-02, -1.078e-01, 7.598e-02, -9.423e-02, 8.618e-03, 1.271e-01, 1.630e-01, -9.076e-02, -3.370e-02, 5.630e-02, -4.028e-02, 9.981e-02, 1.128e-01)); + r += mul(s1_8, M4(-3.702e-02, 7.422e-02, 1.541e-01, -1.435e-01, -1.915e-01, 1.921e-02, -6.697e-02, 2.995e-03, 1.786e-01, 1.306e-01, 8.562e-02, 1.303e-01, -1.676e-02, 1.746e-01, 2.462e-02, 2.796e-03)); + r += mul(s2_0, M4(3.366e-01, -4.757e-03, -3.828e-02, -1.766e-01, -8.184e-02, -2.720e-02, 2.907e-02, 1.040e-02, 1.321e-02, -6.691e-04, 1.528e-02, -8.315e-02, 6.216e-02, -4.957e-02, 7.242e-03, -5.866e-02)); + r += mul(s2_1, M4(-5.713e-02, 1.256e-01, -4.166e-02, 9.245e-02, 2.673e-02, 1.048e-01, 8.198e-02, -2.185e-01, 7.978e-02, 2.214e-02, 3.528e-02, -1.856e-02, 9.841e-02, -5.330e-02, 1.050e-01, 4.323e-02)); + r += mul(s2_2, M4(9.369e-02, -1.272e-01, 7.039e-02, 4.077e-02, -5.287e-02, 3.679e-02, -2.594e-01, 9.411e-02, -9.286e-02, -4.824e-02, 3.952e-02, 5.785e-02, 9.744e-02, 1.937e-02, 7.451e-02, 8.110e-02)); + r += mul(s2_3, M4(-2.094e-02, 3.822e-02, 3.571e-03, 7.506e-02, 1.505e-01, 3.495e-02, 2.335e-02, 1.998e-02, 1.719e-01, 3.476e-02, 2.892e-02, -9.099e-02, 1.641e-01, -1.109e-01, -7.744e-02, 1.493e-01)); + r += mul(s2_4, M4(-1.261e-01, 9.058e-02, -1.296e-01, 6.449e-02, 8.341e-02, 9.417e-02, 1.340e-01, -1.847e-01, -2.666e-02, -2.729e-02, 5.653e-03, 1.913e-02, 2.631e-01, -2.436e-01, 2.820e-01, 2.498e-01)); + r += mul(s2_5, M4(-3.645e-02, -9.327e-02, 1.228e-01, -1.038e-01, 9.788e-02, -4.783e-02, -2.781e-01, -1.842e-01, -8.214e-02, -5.840e-02, 1.142e-01, -7.196e-02, -2.648e-03, 7.155e-02, -1.845e-01, 1.416e-01)); + r += mul(s2_6, M4(1.153e-01, -3.824e-03, -8.120e-03, 4.746e-02, 7.938e-02, -9.856e-02, 3.290e-03, -2.859e-02, 1.614e-02, 6.969e-02, 1.000e-03, 2.190e-01, 4.881e-02, -2.336e-02, 1.215e-02, 1.337e-01)); + r += mul(s2_7, M4(-2.900e-01, -1.165e-01, 1.287e-01, -3.523e-02, -7.180e-02, -3.137e-02, -1.323e-02, -1.565e-02, -3.780e-02, 2.262e-01, 7.472e-02, 1.192e-01, -1.169e-01, 1.284e-01, 1.988e-01, 6.072e-02)); + r += mul(s2_8, M4(-2.491e-01, -1.996e-01, -9.671e-02, -1.332e-01, -5.703e-04, -1.790e-02, -1.025e-01, 2.045e-02, -3.150e-03, -9.094e-03, -2.392e-01, 4.622e-02, 9.624e-03, -1.643e-02, 1.445e-01, 4.723e-02)); + r += mul(s3_0, M4(-3.168e-02, -8.366e-02, -2.659e-02, 3.702e-02, -8.294e-02, 1.381e-02, 5.830e-02, 1.874e-01, 7.915e-02, -3.209e-02, 5.806e-04, -2.349e-02, 6.262e-03, 2.250e-02, -8.750e-03, 2.664e-02)); + r += mul(s3_1, M4(-4.382e-02, -4.891e-02, 2.312e-02, 8.793e-02, 1.782e-01, -1.829e-01, 1.088e-01, 9.672e-02, 5.949e-02, -1.157e-02, -2.554e-05, 6.398e-02, -6.874e-02, -9.942e-02, 1.337e-02, 6.515e-02)); + r += mul(s3_2, M4(-4.311e-02, -3.124e-02, 7.939e-02, -1.573e-02, -3.802e-04, -1.142e-01, 4.008e-02, 2.125e-01, 6.733e-02, 9.101e-03, 1.485e-02, -2.233e-02, -4.651e-02, 3.218e-02, 6.055e-02, -3.819e-02)); + r += mul(s3_3, M4(-1.060e-01, -1.063e-01, -4.364e-03, 3.000e-02, -2.110e-01, -1.171e-01, 2.608e-02, 1.687e-01, -1.311e-01, 8.075e-02, -1.713e-02, 5.390e-02, -2.806e-02, 3.210e-02, -8.352e-02, 1.346e-01)); + r += mul(s3_4, M4(1.472e-02, 8.261e-02, -1.026e-01, -3.850e-02, -7.406e-02, 2.109e-01, 1.440e-01, 2.049e-01, 6.016e-03, -4.091e-02, -2.023e-02, 4.947e-02, -8.169e-02, -1.949e-01, 3.551e-01, 1.635e-01)); + r += mul(s3_5, M4(1.951e-04, 5.917e-02, 1.018e-01, -3.967e-02, -1.626e-01, 3.372e-02, 4.666e-02, 1.537e-01, 2.234e-01, 1.110e-01, 1.100e-01, -9.203e-02, -2.231e-02, -4.048e-02, -1.615e-01, 2.928e-03)); + r += mul(s3_6, M4(1.628e-01, 1.837e-02, -7.830e-03, 1.189e-01, 4.063e-02, 5.098e-02, -2.359e-02, 1.483e-02, -1.524e-02, -4.939e-02, -1.179e-01, 1.755e-01, -6.125e-02, 5.565e-02, 6.117e-02, 1.694e-02)); + r += mul(s3_7, M4(1.042e-01, 6.966e-02, 1.168e-01, -5.148e-02, 9.320e-03, 1.017e-01, -3.727e-03, -1.017e-02, 2.702e-02, 3.255e-02, -1.465e-01, 2.200e-01, -3.505e-03, 2.000e-01, 2.568e-01, -2.003e-01)); + r += mul(s3_8, M4(1.459e-01, -2.493e-02, -1.126e-01, -1.174e-01, 3.386e-02, 1.020e-01, -1.687e-01, -2.750e-02, 4.996e-02, 1.166e-01, -2.836e-01, 6.469e-03, -2.094e-02, 6.162e-02, 1.218e-01, -3.918e-02)); + r += mul(s4_0, M4(-5.989e-02, -1.275e-01, -1.069e-02, -1.562e-01, 1.509e-02, -3.651e-02, -2.489e-02, 5.102e-02, -9.109e-03, 8.227e-02, 2.166e-02, 2.914e-02, 1.190e-01, 3.730e-02, 2.797e-02, -7.265e-02)); + r += mul(s4_1, M4(-1.879e-01, 1.295e-01, 1.702e-01, 9.584e-02, -1.735e-02, 7.957e-02, 5.189e-02, 6.472e-02, -8.307e-02, 6.680e-02, 3.311e-02, 4.058e-02, -1.224e-02, 4.445e-02, -7.185e-02, -8.199e-02)); + r += mul(s4_2, M4(5.254e-01, -3.634e-01, 1.662e-01, -2.114e-01, 1.411e-01, -2.478e-02, -5.932e-02, 3.418e-02, -1.432e-02, -3.958e-02, 1.435e-02, -8.904e-03, 8.548e-02, -5.572e-03, -2.835e-02, 6.525e-02)); + r += mul(s4_3, M4(-1.715e-01, 7.230e-02, 6.736e-02, 1.704e-01, 7.206e-02, 2.094e-02, -2.504e-02, -1.880e-02, -5.422e-02, -1.249e-02, 1.255e-02, 7.395e-02, -1.611e-02, -2.501e-02, -2.455e-02, -5.480e-02)); + r += mul(s4_4, M4(-1.826e-01, 3.723e-01, 1.412e-02, 5.877e-02, 4.934e-03, -3.280e-02, 5.855e-02, 6.245e-02, 1.276e-01, -9.475e-03, 3.968e-02, -1.804e-01, 4.664e-02, -1.505e-02, -1.136e-01, 6.298e-02)); + r += mul(s4_5, M4(3.330e-01, -3.862e-01, 1.600e-01, 6.900e-02, 2.724e-02, 1.359e-01, -2.742e-02, -9.879e-03, -1.471e-02, 4.607e-02, -4.352e-02, -3.443e-02, -1.949e-01, 7.837e-02, -2.380e-01, -1.305e-01)); + r += mul(s4_6, M4(5.690e-01, -7.987e-02, 7.209e-02, -1.874e-01, 9.314e-02, -5.132e-02, 3.539e-02, -7.483e-02, -5.569e-02, 5.700e-03, -3.336e-02, 2.188e-02, -2.922e-02, -3.125e-02, 1.676e-02, -1.950e-02)); + r += mul(s4_7, M4(-3.250e-01, -1.844e-01, 7.516e-02, 3.934e-02, -2.323e-01, 2.582e-02, 1.669e-01, 6.127e-02, 1.601e-02, -1.399e-01, -8.601e-02, 2.964e-02, -6.863e-02, 2.621e-02, 8.180e-02, -2.546e-02)); + r += mul(s4_8, M4(-2.926e-01, -1.685e-01, 1.073e-01, -1.693e-01, 2.371e-02, -7.114e-03, -1.195e-01, -6.144e-02, -1.576e-03, 1.150e-03, 4.983e-02, 2.978e-02, 4.129e-02, -8.080e-02, -1.987e-01, -5.699e-02)); + r += mul(s5_0, M4(-5.547e-02, 5.564e-02, -3.508e-02, 6.241e-02, 9.668e-03, 1.678e-01, 1.267e-02, 1.256e-01, 1.004e-01, -2.921e-02, 8.177e-02, 1.503e-02, -5.694e-02, 2.443e-02, -1.275e-03, 4.726e-02)); + r += mul(s5_1, M4(1.197e-01, -5.710e-02, 4.705e-02, -5.166e-02, 1.163e-05, 5.874e-02, 3.331e-02, -6.039e-02, -4.023e-02, -4.927e-02, -1.532e-02, -4.419e-02, -1.910e-01, 6.584e-02, -1.220e-01, 1.078e-02)); + r += mul(s5_2, M4(-1.161e-01, -2.322e-02, -6.482e-02, -2.701e-02, -3.645e-02, 3.033e-03, -4.483e-02, 1.678e-02, -2.286e-01, -1.095e-02, 1.366e-02, 6.744e-02, 5.017e-02, 1.416e-02, -7.673e-03, -6.489e-02)); + r += mul(s5_3, M4(-8.640e-02, 1.609e-02, 2.547e-02, 3.356e-02, 1.516e-01, 7.014e-02, -3.872e-02, -1.409e-01, 2.643e-01, -2.685e-01, -3.616e-02, 8.870e-02, 1.947e-01, -1.644e-01, -7.013e-02, 1.115e-03)); + r += mul(s5_4, M4(-1.069e-01, -5.233e-02, -9.943e-02, -1.125e-01, -6.419e-02, -1.226e-02, 1.305e-02, 2.079e-01, -2.032e-01, 2.021e-01, 1.009e-01, -6.994e-02, 9.324e-02, 3.447e-02, -5.153e-02, 1.470e-01)); + r += mul(s5_5, M4(5.229e-02, 1.494e-02, 8.839e-02, 3.341e-02, -1.026e-01, 1.777e-02, -1.833e-02, -1.176e-03, 2.667e-01, 5.999e-02, -8.439e-02, -1.041e-01, 9.569e-02, 9.370e-02, -1.087e-01, -1.321e-03)); + r += mul(s5_6, M4(8.497e-02, -5.761e-03, 5.910e-02, -4.775e-02, -3.771e-02, 2.980e-01, -7.506e-02, -1.460e-01, -7.385e-03, 2.882e-02, -5.731e-02, 2.208e-01, 1.702e-02, 5.164e-02, -3.545e-02, 2.515e-02)); + r += mul(s5_7, M4(-2.783e-02, -8.353e-02, -2.801e-02, 2.072e-03, 8.138e-02, 2.568e-01, -3.335e-01, 1.420e-02, 8.183e-02, 1.000e-01, -9.473e-02, -1.010e-01, -1.686e-01, 6.347e-02, 1.110e-01, -7.072e-02)); + r += mul(s5_8, M4(1.209e-01, 4.431e-03, 7.417e-02, 5.090e-02, 9.886e-03, -2.089e-02, -2.449e-01, -1.106e-03, 1.540e-01, 1.048e-01, 8.591e-02, 1.617e-01, -8.105e-02, -4.884e-02, -1.619e-01, -1.208e-01)); + r += mul(s6_0, M4(1.547e-01, -1.760e-01, -4.262e-03, -7.136e-03, 1.178e-02, 4.044e-02, -5.617e-02, -2.178e-01, 1.054e-02, -8.355e-02, -5.946e-02, -3.096e-01, 5.723e-02, 4.477e-02, 6.218e-02, -7.704e-02)); + r += mul(s6_1, M4(1.116e-01, 2.293e-01, 5.531e-02, -2.665e-02, -6.177e-04, 7.252e-02, 1.280e-02, 3.330e-01, 8.625e-02, -3.961e-02, -6.907e-03, -6.870e-02, -3.605e-02, -5.864e-02, -7.659e-02, 1.959e-02)); + r += mul(s6_2, M4(1.637e-01, 1.836e-01, 1.450e-01, -8.673e-02, -2.056e-01, -2.885e-01, -4.169e-02, -1.281e-01, -1.098e-02, -7.054e-03, 3.404e-02, -1.208e-01, 4.963e-02, -7.820e-02, 2.431e-03, -3.848e-02)); + r += mul(s6_3, M4(-1.303e-01, -2.074e-02, 1.467e-03, -6.021e-01, -3.079e-01, -6.886e-02, 1.388e-01, 4.609e-01, 7.498e-02, -1.014e-01, -9.830e-02, -9.333e-03, -8.884e-03, 1.278e-02, -1.449e-02, -3.219e-02)); + r += mul(s6_4, M4(-1.143e-01, 1.794e-02, 2.329e-01, -1.630e-02, 8.577e-02, -1.221e-01, -7.285e-02, 2.222e-01, -1.776e-01, -2.464e-01, 2.885e-01, 8.662e-02, 8.845e-02, 1.274e-01, -2.733e-02, 5.147e-02)); + r += mul(s6_5, M4(3.759e-01, 2.169e-01, -3.161e-02, 5.758e-02, 2.007e-01, -2.794e-02, -3.164e-02, 1.858e-02, -2.600e-02, -3.249e-02, -1.475e-01, 3.748e-02, 2.038e-02, 1.406e-01, -8.668e-02, 4.246e-02)); + r += mul(s6_6, M4(-1.611e-01, 1.157e-01, 2.592e-02, 1.471e-01, -2.053e-01, 2.816e-01, 4.534e-02, -6.995e-02, -4.584e-02, 1.075e-01, 5.757e-03, 1.091e-01, 2.551e-02, -9.300e-03, -2.473e-02, 4.925e-02)); + r += mul(s6_7, M4(-2.261e-01, 9.102e-02, 2.608e-02, 3.204e-01, 3.703e-01, -1.067e-01, -2.237e-02, -5.974e-02, -1.959e-02, 1.104e-01, -1.742e-01, -5.755e-02, -2.644e-02, -4.180e-02, 1.236e-01, -5.114e-02)); + r += mul(s6_8, M4(3.876e-01, 4.009e-01, 2.010e-01, -2.782e-02, -1.762e-01, 1.997e-01, 4.941e-02, -1.995e-01, -8.606e-02, -1.616e-02, 3.457e-02, 1.450e-01, -1.172e-01, 1.029e-02, 2.820e-02, -1.025e-02)); + r += mul(s7_0, M4(1.647e-02, -5.545e-02, -2.490e-02, -1.293e-02, -7.596e-02, -8.660e-03, -2.008e-02, 3.545e-02, -5.051e-02, -3.824e-02, 1.400e-02, 1.164e-02, -4.095e-02, -1.023e-01, 1.365e-01, 9.583e-02)); + r += mul(s7_1, M4(1.787e-02, -4.811e-02, -3.144e-02, -6.334e-02, -7.119e-03, 4.822e-02, -1.003e-01, 9.954e-02, 1.284e-01, -4.100e-02, 1.033e-01, -6.504e-02, 9.758e-02, -3.433e-01, -1.493e-02, 1.551e-01)); + r += mul(s7_2, M4(-6.225e-02, -9.759e-02, -1.172e-01, -5.663e-02, -4.019e-02, -2.128e-02, -2.677e-02, 2.618e-02, -3.027e-02, 3.373e-02, -9.503e-02, -1.677e-02, -2.570e-01, 1.408e-01, 7.404e-03, -6.859e-03)); + r += mul(s7_3, M4(1.006e-01, -5.592e-02, 6.538e-02, -6.578e-02, -2.373e-02, -1.070e-01, 6.332e-02, -4.559e-02, 1.217e-01, 9.091e-02, 1.280e-01, 1.921e-02, 1.554e-01, -1.313e-01, -5.379e-02, -1.016e-01)); + r += mul(s7_4, M4(2.410e-02, -4.736e-02, 2.086e-01, -9.212e-02, -9.352e-03, 6.391e-02, -1.045e-01, 5.797e-02, 6.874e-02, 4.194e-02, 3.504e-01, 1.034e-02, 6.150e-01, -2.923e-01, 1.252e-01, 1.000e-01)); + r += mul(s7_5, M4(-5.019e-02, 6.172e-02, 2.991e-02, -8.221e-02, 1.669e-02, -1.289e-01, -6.205e-02, -1.288e-02, 2.764e-03, 6.436e-02, -4.164e-02, -1.640e-02, 9.159e-02, -1.842e-01, 1.880e-01, 1.557e-01)); + r += mul(s7_6, M4(7.682e-03, -5.789e-02, -2.496e-02, -2.562e-02, -8.123e-02, -1.616e-04, 4.920e-02, 6.997e-02, -1.362e-01, -7.653e-02, -1.092e-01, -2.418e-02, -2.005e-01, -1.490e-01, -1.786e-02, 8.711e-02)); + r += mul(s7_7, M4(2.645e-02, -3.008e-03, -8.682e-03, -9.011e-02, 1.142e-01, 5.017e-02, 5.841e-02, -3.095e-02, 7.273e-02, 4.477e-02, -1.209e-01, -1.854e-01, -3.026e-01, -1.674e-01, 1.946e-01, 9.873e-02)); + r += mul(s7_8, M4(2.496e-03, 8.130e-02, -3.001e-02, -1.115e-02, 3.656e-03, 2.615e-01, 8.014e-02, -4.353e-02, 3.521e-02, 1.113e-02, 1.758e-01, 1.082e-01, -9.329e-02, 2.969e-01, 2.252e-02, -8.666e-02)); + r += V4(7.159e-03, -3.758e-03, 2.665e-02, -4.427e-04); + return r; +} + +V4 f3(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-4.947e-02, 8.051e-02, -2.570e-02, 1.068e-02, -1.013e-01, -1.273e-01, 4.331e-02, -9.162e-03, -7.351e-02, 4.432e-02, -9.921e-02, 1.293e-02, -3.328e-01, -1.960e-01, 1.701e-01, -6.579e-02)); + r += mul(s0_1, M4(2.520e-02, -7.575e-03, -5.535e-03, -9.261e-03, -3.295e-02, 4.939e-02, 4.853e-02, 4.567e-02, 1.335e-01, 8.591e-02, 9.288e-03, -6.721e-02, -5.151e-03, -3.211e-02, 3.165e-01, 1.095e-01)); + r += mul(s0_2, M4(-5.395e-02, -3.941e-02, 7.402e-02, -8.885e-03, 1.486e-02, 8.849e-02, -4.877e-02, -1.498e-03, -1.978e-02, -2.693e-02, 8.446e-02, -2.550e-02, 3.174e-01, -8.859e-02, -9.404e-02, -1.002e-01)); + r += mul(s0_3, M4(2.095e-02, 3.997e-02, 8.597e-02, -3.698e-02, 1.128e-01, -1.407e-01, -7.529e-02, 1.333e-01, 8.401e-03, -5.745e-02, -9.140e-02, -1.229e-02, -2.379e-01, 4.148e-02, 2.596e-01, -9.078e-02)); + r += mul(s0_4, M4(8.500e-03, -1.577e-02, 8.539e-03, 4.712e-02, -2.357e-03, -1.641e-02, 9.686e-02, -7.687e-02, 5.286e-02, 3.013e-02, 1.254e-01, 7.323e-02, -1.755e-01, -1.398e-01, 4.896e-01, 3.644e-02)); + r += mul(s0_5, M4(-4.679e-02, 1.382e-01, 3.106e-03, 7.874e-03, -3.112e-03, 6.567e-02, -9.367e-03, -7.449e-02, -1.115e-01, 8.487e-02, 1.757e-02, 1.521e-02, 1.222e-01, -4.063e-02, -1.877e-02, 1.400e-01)); + r += mul(s0_6, M4(-6.195e-03, -8.237e-02, -8.502e-02, 1.466e-02, -1.581e-01, 1.419e-01, -1.118e-01, -2.992e-03, -4.297e-02, -7.925e-02, -1.709e-01, -8.587e-02, 1.534e-01, -1.336e-01, 6.284e-02, -2.807e-02)); + r += mul(s0_7, M4(4.441e-02, 8.600e-03, 1.872e-02, -2.364e-02, 1.109e-01, -6.685e-02, 3.983e-02, -1.081e-01, 2.319e-02, 1.708e-02, 7.053e-02, 6.897e-02, 2.854e-01, -3.227e-04, -2.221e-01, 3.208e-02)); + r += mul(s0_8, M4(3.877e-02, -5.845e-02, -4.021e-02, 5.879e-03, 1.469e-02, 4.745e-02, 4.817e-02, 9.870e-02, -4.810e-02, -1.029e-02, 2.124e-01, 4.661e-02, 5.580e-02, 2.815e-01, -3.902e-02, 7.007e-02)); + r += mul(s1_0, M4(1.851e-01, 1.982e-01, -8.419e-02, -6.920e-02, 3.217e-02, -1.721e-02, -1.412e-01, 3.260e-02, 1.819e-03, -1.164e-01, 9.689e-02, 7.218e-02, -6.876e-02, -6.621e-03, 4.684e-02, 3.613e-02)); + r += mul(s1_1, M4(1.213e-01, -5.728e-02, 6.839e-02, -6.103e-02, 5.075e-02, 3.953e-02, 1.449e-02, -1.030e-01, 3.124e-03, -8.353e-02, 1.924e-01, -4.414e-02, 8.485e-03, 6.598e-03, -8.983e-02, 1.859e-02)); + r += mul(s1_2, M4(-1.130e-01, -5.227e-03, 1.393e-01, 2.985e-02, -6.197e-02, -1.564e-01, 1.609e-02, 9.519e-02, 1.025e-01, 7.023e-02, -4.166e-02, 6.305e-02, 3.051e-02, 1.308e-02, 7.536e-03, -7.300e-02)); + r += mul(s1_3, M4(-1.041e-01, -7.686e-02, -3.057e-01, 1.432e-02, -1.866e-01, 2.454e-02, -1.028e-01, 2.281e-01, 8.083e-02, -8.418e-02, -1.414e-01, 3.425e-02, -3.559e-03, -7.205e-02, -3.959e-02, -3.331e-02)); + r += mul(s1_4, M4(7.435e-02, -2.117e-01, -1.796e-02, 1.073e-01, -1.093e-01, -1.060e-02, 9.349e-02, -1.212e-01, 9.875e-02, -1.692e-01, 1.687e-02, 1.410e-02, 2.623e-02, -1.389e-02, -5.446e-02, 2.347e-03)); + r += mul(s1_5, M4(-9.770e-02, 1.584e-01, 5.546e-02, 8.240e-02, -3.345e-03, 7.296e-03, -2.089e-02, -1.144e-01, -1.143e-01, -1.234e-01, -2.419e-01, 3.390e-02, -3.451e-02, 7.053e-02, 5.652e-02, 3.383e-03)); + r += mul(s1_6, M4(2.227e-01, -2.378e-01, -7.366e-03, 1.727e-01, 3.661e-03, 7.563e-02, 1.158e-01, 4.744e-02, 1.571e-01, -7.862e-02, 6.584e-02, 6.647e-02, 3.937e-02, 3.059e-02, 7.411e-02, -5.458e-02)); + r += mul(s1_7, M4(1.126e-01, -1.318e-01, 6.760e-02, -7.502e-02, -8.506e-02, 6.361e-02, -1.131e-01, -3.764e-02, -9.932e-02, 1.804e-02, -1.972e-01, -1.371e-01, -5.165e-03, -1.804e-02, -5.013e-02, 2.435e-02)); + r += mul(s1_8, M4(-1.332e-01, -1.041e-01, 4.485e-02, -1.181e-01, -2.204e-02, -6.541e-03, -9.146e-02, 4.346e-02, 6.873e-02, 1.732e-01, -1.697e-01, 1.764e-02, -2.447e-02, -3.191e-02, 1.106e-02, 6.543e-02)); + r += mul(s2_0, M4(-7.285e-02, -8.081e-02, -2.882e-02, 5.116e-02, -9.595e-02, -3.134e-02, -5.852e-03, 4.262e-02, 2.221e-02, -7.012e-02, 6.421e-02, -5.627e-02, 1.563e-02, -1.101e-01, -3.699e-02, -5.017e-03)); + r += mul(s2_1, M4(-1.895e-02, -1.349e-01, 4.072e-02, -8.592e-02, 9.225e-02, 5.737e-02, -3.620e-01, -6.333e-02, -1.187e-02, -5.571e-02, 6.266e-02, -1.954e-02, -9.780e-02, -9.125e-03, 2.080e-02, -7.937e-02)); + r += mul(s2_2, M4(-3.584e-02, -2.629e-02, -1.013e-02, -1.518e-02, -1.020e-01, 2.964e-02, -2.759e-02, -7.744e-02, 3.073e-02, 7.335e-02, 2.058e-02, 8.198e-03, 3.367e-02, -2.003e-01, 1.013e-01, 4.883e-03)); + r += mul(s2_3, M4(6.493e-02, -1.854e-01, -3.271e-02, -1.926e-03, -3.097e-02, 1.588e-02, 1.135e-01, 8.857e-02, 3.956e-02, -5.410e-02, 7.366e-02, 2.646e-01, -2.577e-01, -8.662e-02, 1.704e-01, 6.882e-03)); + r += mul(s2_4, M4(-8.632e-02, 5.495e-02, -1.114e-01, -7.373e-02, -1.587e-01, -5.582e-02, 4.193e-02, -5.838e-03, -1.714e-01, 7.996e-02, 1.193e-01, 1.880e-01, 6.001e-02, -2.543e-02, -5.180e-02, -1.304e-01)); + r += mul(s2_5, M4(-4.703e-02, -7.633e-02, -4.091e-02, 7.437e-02, -3.345e-02, -6.761e-02, -3.374e-02, -1.427e-01, 1.371e-01, 1.601e-01, 4.610e-02, 1.685e-02, 1.720e-01, -2.320e-01, -7.731e-02, 3.362e-03)); + r += mul(s2_6, M4(-4.414e-02, 2.003e-02, -1.657e-01, -1.797e-01, 3.099e-02, -7.790e-03, -2.465e-03, 7.397e-02, -4.738e-02, 3.872e-02, -4.779e-03, -1.760e-01, 5.178e-02, 1.254e-01, 4.062e-02, -1.959e-02)); + r += mul(s2_7, M4(7.194e-03, 9.460e-02, 1.942e-02, -1.386e-01, -3.507e-02, 9.574e-02, -4.142e-02, 5.273e-02, 1.645e-01, 2.898e-02, -1.497e-02, -9.664e-02, 7.539e-02, 4.883e-02, -3.846e-02, 2.114e-02)); + r += mul(s2_8, M4(-2.434e-02, 7.672e-02, -2.805e-02, 7.755e-02, -3.408e-02, -4.293e-02, 5.407e-02, 3.070e-02, -6.660e-02, -4.597e-02, 1.648e-01, -2.008e-02, -2.521e-02, -1.408e-01, -4.347e-02, -9.289e-03)); + r += mul(s3_0, M4(1.012e-01, 6.055e-03, 4.149e-02, 7.759e-02, 1.419e-01, -1.508e-01, 2.115e-03, -1.247e-01, 3.161e-02, 5.292e-02, -9.686e-02, -3.136e-02, 1.120e-01, -4.613e-02, 7.987e-02, 2.106e-02)); + r += mul(s3_1, M4(2.114e-01, 1.876e-02, -1.502e-02, -6.683e-02, 3.650e-02, 4.148e-02, 1.993e-01, 1.808e-01, -3.406e-02, -9.241e-02, -2.440e-02, 6.059e-02, -1.536e-01, 5.586e-02, -2.191e-02, -1.032e-01)); + r += mul(s3_2, M4(3.923e-02, -1.849e-02, 2.949e-02, 2.600e-02, -2.316e-01, 7.968e-02, -5.900e-02, -9.448e-02, -6.059e-02, 1.785e-02, 3.615e-02, -1.606e-02, -5.339e-02, 4.620e-03, -2.418e-03, 1.238e-03)); + r += mul(s3_3, M4(7.162e-02, -8.434e-03, 3.068e-02, -3.827e-02, -3.382e-02, 6.050e-02, 5.946e-02, -1.926e-02, 2.248e-02, 7.102e-02, -1.229e-01, 5.999e-02, -5.849e-02, 5.146e-02, 8.067e-02, 2.308e-01)); + r += mul(s3_4, M4(-1.226e-01, 2.114e-02, -5.832e-02, 6.470e-02, 1.614e-01, 1.545e-02, 2.034e-01, -9.283e-02, -1.988e-01, 7.386e-02, 1.004e-01, 7.819e-02, 3.907e-02, -1.181e-02, -5.301e-03, -2.760e-01)); + r += mul(s3_5, M4(9.548e-02, 1.890e-01, 4.343e-02, -5.520e-02, -8.640e-02, -2.114e-01, 1.054e-01, 2.162e-02, 4.599e-02, 9.750e-02, 4.538e-02, 1.413e-02, 3.427e-02, -1.288e-02, 1.115e-01, 2.414e-02)); + r += mul(s3_6, M4(-1.637e-01, -6.740e-02, 2.678e-02, 4.619e-02, -5.243e-02, -2.195e-02, -1.711e-01, 1.221e-01, -1.425e-02, -7.919e-02, 2.556e-03, -5.645e-02, -4.940e-02, 1.180e-01, 1.081e-01, 1.125e-01)); + r += mul(s3_7, M4(-8.975e-03, -8.873e-02, 1.425e-03, -3.873e-02, 1.571e-02, -2.780e-02, 3.422e-03, 8.513e-02, 3.560e-02, -2.184e-01, 1.488e-02, 3.050e-02, 6.037e-03, -1.835e-01, 2.810e-02, -8.370e-02)); + r += mul(s3_8, M4(1.999e-03, -5.704e-02, -1.171e-02, 2.724e-02, -9.886e-02, -1.501e-01, 3.304e-02, 8.635e-02, -5.235e-02, -1.000e-01, -1.874e-02, -2.803e-02, -6.573e-02, 9.588e-03, 1.990e-03, -1.261e-03)); + r += mul(s4_0, M4(3.205e-02, -9.399e-02, -6.611e-02, -9.457e-03, -6.284e-02, -1.119e-01, 3.832e-02, 5.318e-02, 9.238e-03, -7.695e-02, -9.238e-03, -4.017e-02, -2.402e-02, 8.154e-03, -1.508e-02, 1.066e-02)); + r += mul(s4_1, M4(-1.332e-01, -1.601e-02, 2.876e-03, -8.483e-02, -4.600e-02, 8.589e-02, 3.150e-02, 6.373e-02, -3.873e-02, -2.948e-02, 2.025e-02, 3.242e-02, -2.013e-02, -8.295e-02, -4.246e-02, -2.076e-02)); + r += mul(s4_2, M4(4.445e-01, 2.664e-03, 7.754e-02, 6.927e-02, -3.116e-02, 3.909e-02, -1.533e-01, -8.617e-02, 1.688e-01, 5.947e-02, 7.590e-02, 2.037e-04, 1.257e-01, -5.657e-02, 8.065e-02, -8.020e-02)); + r += mul(s4_3, M4(-1.600e-01, -2.895e-01, 6.957e-02, -2.824e-01, -3.329e-02, 3.042e-02, 1.389e-01, 1.333e-01, -8.765e-03, 7.704e-02, -3.357e-02, 7.192e-02, 1.768e-01, 1.249e-02, 7.956e-02, -4.813e-02)); + r += mul(s4_4, M4(-3.023e-01, 2.612e-01, 7.912e-02, -1.408e-01, -1.839e-01, 5.725e-03, -9.410e-03, -8.858e-02, 2.097e-02, -1.919e-02, -1.433e-02, -6.510e-02, 8.973e-02, 1.642e-02, -3.251e-01, -1.458e-01)); + r += mul(s4_5, M4(3.546e-02, -5.626e-02, 4.315e-02, 6.790e-02, -1.167e-01, 9.421e-04, -5.773e-02, -9.024e-02, -9.923e-02, -4.666e-02, 1.084e-01, -2.120e-02, 4.064e-02, -1.441e-01, -6.815e-02, 2.756e-02)); + r += mul(s4_6, M4(-9.100e-02, -3.818e-01, -4.212e-02, -1.122e-01, 4.123e-02, -8.688e-02, 8.607e-02, 1.704e-01, -4.244e-03, 4.439e-03, -8.617e-02, -2.501e-03, 7.886e-02, -8.174e-03, 1.000e-01, 6.876e-02)); + r += mul(s4_7, M4(1.803e-01, 3.233e-01, 2.117e-01, -1.421e-01, 1.628e-01, 4.659e-02, 3.521e-02, -8.703e-02, 1.315e-02, 5.076e-02, -3.939e-02, 3.778e-02, -1.133e-01, 1.274e-01, 2.083e-02, 8.438e-02)); + r += mul(s4_8, M4(2.643e-02, -1.661e-01, 1.507e-01, -1.802e-01, 1.450e-01, -1.900e-03, 8.990e-03, 5.479e-02, -6.823e-02, -3.225e-02, -4.038e-02, -1.074e-02, -5.143e-02, 4.436e-02, -8.175e-02, 9.150e-02)); + r += mul(s5_0, M4(-6.334e-02, -9.309e-02, -3.135e-02, -3.076e-02, -8.207e-02, -3.958e-02, -5.049e-02, 1.179e-01, -8.811e-02, -8.125e-03, 4.048e-02, 8.021e-02, -1.135e-01, 4.696e-03, -6.265e-02, 3.116e-02)); + r += mul(s5_1, M4(1.649e-01, 3.319e-02, 3.213e-02, 3.601e-02, 2.087e-01, 2.173e-01, -9.656e-02, 4.548e-02, -7.523e-02, -1.476e-01, -3.387e-02, -1.510e-01, -4.976e-02, 1.161e-01, 2.292e-01, -4.014e-02)); + r += mul(s5_2, M4(9.400e-02, 6.971e-02, -7.026e-02, 6.791e-02, -5.204e-02, 3.833e-03, -6.243e-02, -2.815e-02, -1.347e-01, 8.703e-02, -2.383e-01, -2.568e-02, 3.358e-02, 2.220e-02, -5.739e-02, -1.125e-01)); + r += mul(s5_3, M4(1.075e-01, 3.235e-02, -3.910e-02, 1.644e-02, 1.422e-01, 1.588e-01, -5.108e-01, -6.150e-02, 1.071e-01, -2.141e-01, -1.436e-01, 3.852e-02, -2.299e-01, 1.624e-03, 1.762e-01, -2.059e-01)); + r += mul(s5_4, M4(-2.080e-01, 2.677e-02, 6.496e-02, -1.136e-01, -9.508e-02, -5.801e-02, 3.331e-03, -1.121e-01, -2.301e-03, -8.857e-02, -5.760e-02, 3.679e-02, 6.023e-02, -2.398e-01, 3.457e-02, 1.996e-01)); + r += mul(s5_5, M4(-1.309e-02, -4.267e-02, -6.198e-02, 7.217e-02, 1.339e-01, 1.572e-02, -8.580e-03, -4.055e-02, 3.805e-02, -2.509e-02, -2.210e-02, -2.344e-02, 1.386e-01, 1.647e-02, 7.771e-03, -2.897e-02)); + r += mul(s5_6, M4(8.146e-04, -5.321e-02, 1.214e-02, 5.411e-03, 1.198e-01, 3.410e-01, -7.843e-01, 3.745e-01, 1.624e-02, 1.452e-01, 2.391e-01, -1.338e-01, -6.920e-02, 7.982e-02, 1.024e-01, -2.698e-02)); + r += mul(s5_7, M4(2.488e-02, -9.830e-02, -7.100e-03, -5.339e-02, -1.140e-01, -2.442e-01, -1.729e-01, -8.192e-02, -4.503e-02, 2.773e-02, 1.752e-01, 9.685e-02, 9.042e-02, 9.545e-02, 1.029e-01, 1.363e-01)); + r += mul(s5_8, M4(-8.806e-03, 1.473e-01, 1.098e-01, 2.410e-02, 2.657e-02, -1.344e-01, -1.432e-01, -7.008e-02, 8.632e-02, 5.413e-02, -5.891e-02, -1.166e-01, 1.192e-01, -1.548e-02, -8.526e-02, 7.829e-02)); + r += mul(s6_0, M4(2.450e-01, 7.761e-02, 3.561e-01, -1.446e-01, 4.047e-01, 1.167e-01, 1.745e-01, 2.382e-03, 1.416e-01, -7.666e-02, -1.050e-01, -6.977e-02, 7.872e-02, 2.556e-02, -5.153e-03, 9.230e-02)); + r += mul(s6_1, M4(3.802e-01, 1.542e-02, 4.255e-01, -9.081e-02, 2.666e-01, 2.526e-01, 8.105e-02, 1.429e-01, -4.946e-02, 2.067e-02, 4.394e-02, -1.590e-01, 6.722e-02, 5.235e-02, -4.439e-02, -8.620e-02)); + r += mul(s6_2, M4(8.481e-02, -2.127e-01, 2.365e-01, 4.175e-02, 7.039e-02, -7.309e-02, -3.229e-01, -1.621e-01, 1.070e-01, -1.676e-01, -4.287e-02, 3.196e-03, -5.899e-03, 5.405e-02, 4.468e-03, -4.450e-02)); + r += mul(s6_3, M4(-1.412e-01, 3.433e-01, -2.101e-01, -3.041e-01, -2.616e-01, -1.542e-01, -9.384e-02, -2.081e-01, 1.167e-01, 8.468e-03, -2.153e-01, -1.362e-01, -4.372e-02, 2.660e-02, 3.163e-02, -5.996e-02)); + r += mul(s6_4, M4(-2.437e-01, 3.818e-01, -1.644e-01, 1.349e-01, -8.518e-02, 2.374e-01, 6.275e-02, -1.298e-01, -1.531e-02, 6.807e-02, -3.120e-01, 7.608e-02, 2.047e-02, 1.276e-02, -1.387e-01, 7.087e-02)); + r += mul(s6_5, M4(-1.766e-01, 4.749e-03, -1.868e-01, -1.667e-01, 2.142e-01, -1.492e-01, -1.395e-01, -1.233e-01, -8.077e-02, -8.612e-02, -1.417e-02, -6.332e-02, -6.332e-02, 5.724e-03, 5.660e-02, -1.328e-02)); + r += mul(s6_6, M4(1.225e-01, 2.327e-01, 1.340e-01, -2.051e-01, 1.648e-02, -2.087e-01, -3.521e-01, -8.182e-02, 9.954e-02, -8.236e-02, 1.116e-01, -2.865e-02, -1.693e-03, -6.582e-02, -1.012e-02, -2.251e-02)); + r += mul(s6_7, M4(1.455e-01, 1.452e-01, -1.597e-01, 6.380e-02, -1.356e-01, 9.840e-02, 1.455e-01, -3.021e-01, -5.766e-02, 1.418e-02, -2.394e-01, 1.894e-02, 6.877e-02, 1.787e-02, -2.350e-02, 9.355e-02)); + r += mul(s6_8, M4(9.602e-02, -1.250e-01, 1.102e-01, -1.857e-01, 8.558e-02, 1.271e-01, 6.047e-02, -5.316e-02, 6.796e-03, 7.151e-02, -4.392e-02, -4.725e-02, -9.142e-02, -1.618e-01, 5.364e-02, -5.614e-02)); + r += mul(s7_0, M4(1.304e-01, 1.012e-01, -1.233e-02, -1.521e-01, 3.336e-02, 1.118e-01, -4.931e-02, -1.025e-02, 8.478e-02, -2.517e-02, 3.591e-02, 4.479e-02, 3.422e-02, -2.221e-02, -7.071e-02, 4.681e-02)); + r += mul(s7_1, M4(1.072e-01, -4.905e-02, -7.925e-02, -2.376e-02, -2.374e-02, -5.839e-02, -4.969e-02, 3.719e-02, -8.523e-02, -4.878e-02, -1.247e-01, -5.047e-02, -1.749e-01, -3.122e-01, 5.099e-02, 1.078e-01)); + r += mul(s7_2, M4(-8.340e-02, -2.672e-02, -1.344e-01, 7.982e-02, 1.739e-02, -8.374e-02, -1.019e-01, -7.983e-02, 8.299e-02, -6.768e-02, 9.196e-02, -1.012e-02, -5.912e-01, 2.317e-01, 2.071e-01, -7.993e-02)); + r += mul(s7_3, M4(-1.920e-02, 8.939e-02, 4.551e-02, -6.470e-02, -5.342e-02, -8.767e-04, 5.145e-02, -1.230e-01, -8.962e-02, 7.062e-02, 2.208e-01, 1.125e-01, -3.309e-02, 9.531e-02, -2.021e-01, -2.237e-01)); + r += mul(s7_4, M4(-7.611e-02, -6.968e-02, 2.872e-02, 5.603e-02, -1.452e-02, -8.395e-02, 1.104e-01, -8.210e-02, 1.484e-01, 5.219e-02, -1.372e-01, -6.380e-02, 2.342e-01, -5.879e-01, 6.368e-03, 2.740e-01)); + r += mul(s7_5, M4(-7.619e-02, -6.900e-04, -1.678e-01, 4.266e-02, 7.434e-02, -1.416e-01, -1.516e-01, -1.948e-01, -8.917e-02, 5.449e-02, -8.011e-02, 1.085e-02, -5.211e-03, 2.239e-01, -7.341e-02, 2.314e-01)); + r += mul(s7_6, M4(2.660e-03, 3.388e-02, 7.300e-02, -1.387e-01, -5.790e-02, 8.450e-02, 1.907e-01, -1.624e-01, -3.738e-02, 2.133e-02, -1.700e-02, 7.501e-03, -1.577e-02, -4.350e-02, 2.273e-01, 2.076e-02)); + r += mul(s7_7, M4(3.879e-02, -4.186e-03, 7.965e-02, 5.320e-02, -4.165e-02, -4.829e-02, -1.182e-02, -2.168e-01, -4.293e-02, -9.301e-02, 3.442e-02, -6.015e-02, 1.039e-01, -8.428e-03, 2.337e-02, -7.242e-02)); + r += mul(s7_8, M4(1.261e-02, -4.033e-02, -1.000e-01, -3.256e-02, 1.559e-02, 6.993e-02, 4.303e-02, -8.646e-02, -7.752e-04, -8.626e-03, 7.203e-03, -1.830e-02, -1.236e-02, -4.381e-03, 1.953e-01, -9.189e-02)); + r += V4(8.737e-03, -8.144e-02, 2.217e-03, 4.256e-03); + return r; +} + +void Pass2(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = Rmp8x8(tid.x) + blockStart; + uint2 size = GetInputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = (gxy + 0.5) * pt; + + V4 s0_0 = l0(-1.0, -1.0); + V4 s0_1 = l0(0.0, -1.0); + V4 s0_2 = l0(1.0, -1.0); + V4 s0_3 = l0(-1.0, 0.0); + V4 s0_4 = l0(0.0, 0.0); + V4 s0_5 = l0(1.0, 0.0); + V4 s0_6 = l0(-1.0, 1.0); + V4 s0_7 = l0(0.0, 1.0); + V4 s0_8 = l0(1.0, 1.0); + V4 s1_0 = -max(-s0_0, 0.0); + V4 s1_1 = -max(-s0_1, 0.0); + V4 s1_2 = -max(-s0_2, 0.0); + V4 s1_3 = -max(-s0_3, 0.0); + V4 s1_4 = -max(-s0_4, 0.0); + V4 s1_5 = -max(-s0_5, 0.0); + V4 s1_6 = -max(-s0_6, 0.0); + V4 s1_7 = -max(-s0_7, 0.0); + V4 s1_8 = -max(-s0_8, 0.0); + s0_0 = max(s0_0, 0.0); + s0_1 = max(s0_1, 0.0); + s0_2 = max(s0_2, 0.0); + s0_3 = max(s0_3, 0.0); + s0_4 = max(s0_4, 0.0); + s0_5 = max(s0_5, 0.0); + s0_6 = max(s0_6, 0.0); + s0_7 = max(s0_7, 0.0); + s0_8 = max(s0_8, 0.0); + + V4 s2_0 = l1(-1.0, -1.0); + V4 s2_1 = l1(0.0, -1.0); + V4 s2_2 = l1(1.0, -1.0); + V4 s2_3 = l1(-1.0, 0.0); + V4 s2_4 = l1(0.0, 0.0); + V4 s2_5 = l1(1.0, 0.0); + V4 s2_6 = l1(-1.0, 1.0); + V4 s2_7 = l1(0.0, 1.0); + V4 s2_8 = l1(1.0, 1.0); + V4 s3_0 = -max(-s2_0, 0.0); + V4 s3_1 = -max(-s2_1, 0.0); + V4 s3_2 = -max(-s2_2, 0.0); + V4 s3_3 = -max(-s2_3, 0.0); + V4 s3_4 = -max(-s2_4, 0.0); + V4 s3_5 = -max(-s2_5, 0.0); + V4 s3_6 = -max(-s2_6, 0.0); + V4 s3_7 = -max(-s2_7, 0.0); + V4 s3_8 = -max(-s2_8, 0.0); + s2_0 = max(s2_0, 0.0); + s2_1 = max(s2_1, 0.0); + s2_2 = max(s2_2, 0.0); + s2_3 = max(s2_3, 0.0); + s2_4 = max(s2_4, 0.0); + s2_5 = max(s2_5, 0.0); + s2_6 = max(s2_6, 0.0); + s2_7 = max(s2_7, 0.0); + s2_8 = max(s2_8, 0.0); + + V4 s4_0 = l2(-1.0, -1.0); + V4 s4_1 = l2(0.0, -1.0); + V4 s4_2 = l2(1.0, -1.0); + V4 s4_3 = l2(-1.0, 0.0); + V4 s4_4 = l2(0.0, 0.0); + V4 s4_5 = l2(1.0, 0.0); + V4 s4_6 = l2(-1.0, 1.0); + V4 s4_7 = l2(0.0, 1.0); + V4 s4_8 = l2(1.0, 1.0); + V4 s5_0 = -max(-s4_0, 0.0); + V4 s5_1 = -max(-s4_1, 0.0); + V4 s5_2 = -max(-s4_2, 0.0); + V4 s5_3 = -max(-s4_3, 0.0); + V4 s5_4 = -max(-s4_4, 0.0); + V4 s5_5 = -max(-s4_5, 0.0); + V4 s5_6 = -max(-s4_6, 0.0); + V4 s5_7 = -max(-s4_7, 0.0); + V4 s5_8 = -max(-s4_8, 0.0); + s4_0 = max(s4_0, 0.0); + s4_1 = max(s4_1, 0.0); + s4_2 = max(s4_2, 0.0); + s4_3 = max(s4_3, 0.0); + s4_4 = max(s4_4, 0.0); + s4_5 = max(s4_5, 0.0); + s4_6 = max(s4_6, 0.0); + s4_7 = max(s4_7, 0.0); + s4_8 = max(s4_8, 0.0); + + V4 s6_0 = l3(-1.0, -1.0); + V4 s6_1 = l3(0.0, -1.0); + V4 s6_2 = l3(1.0, -1.0); + V4 s6_3 = l3(-1.0, 0.0); + V4 s6_4 = l3(0.0, 0.0); + V4 s6_5 = l3(1.0, 0.0); + V4 s6_6 = l3(-1.0, 1.0); + V4 s6_7 = l3(0.0, 1.0); + V4 s6_8 = l3(1.0, 1.0); + V4 s7_0 = -max(-s6_0, 0.0); + V4 s7_1 = -max(-s6_1, 0.0); + V4 s7_2 = -max(-s6_2, 0.0); + V4 s7_3 = -max(-s6_3, 0.0); + V4 s7_4 = -max(-s6_4, 0.0); + V4 s7_5 = -max(-s6_5, 0.0); + V4 s7_6 = -max(-s6_6, 0.0); + V4 s7_7 = -max(-s6_7, 0.0); + V4 s7_8 = -max(-s6_8, 0.0); + s6_0 = max(s6_0, 0.0); + s6_1 = max(s6_1, 0.0); + s6_2 = max(s6_2, 0.0); + s6_3 = max(s6_3, 0.0); + s6_4 = max(s6_4, 0.0); + s6_5 = max(s6_5, 0.0); + s6_6 = max(s6_6, 0.0); + s6_7 = max(s6_7, 0.0); + s6_8 = max(s6_8, 0.0); + + t4[gxy] = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t5[gxy] = f1(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t6[gxy] = f2(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t7[gxy] = f3(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); +} + +//!PASS 3 +//!DESC conv2 +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 +//!IN t4, t5, t6, t7 +//!OUT t0, t1, t2, t3 + +#define l0(x, y) V4(O(t4, float2(x, y))) +#define l1(x, y) V4(O(t5, float2(x, y))) +#define l2(x, y) V4(O(t6, float2(x, y))) +#define l3(x, y) V4(O(t7, float2(x, y))) + +V4 f0(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(8.402e-02, -1.835e-01, 6.598e-02, -1.548e-01, 5.878e-02, -5.101e-03, -2.593e-03, -7.877e-02, 4.725e-02, -9.164e-03, -1.804e-02, -3.882e-02, -3.345e-02, -7.255e-02, -3.130e-02, -5.227e-02)); + r += mul(s0_1, M4(-2.789e-02, 7.644e-02, 9.874e-02, -9.174e-02, -1.019e-01, 8.883e-02, -1.955e-02, -1.056e-01, -2.237e-02, -1.551e-01, 9.123e-02, 1.360e-04, 1.684e-01, -2.681e-03, 7.962e-03, -3.443e-02)); + r += mul(s0_2, M4(-1.995e-01, -6.410e-02, 1.272e-02, 6.584e-02, 2.568e-02, 4.247e-02, 2.778e-03, -4.476e-03, 7.411e-02, -4.275e-02, 1.673e-03, -1.613e-01, -2.389e-01, 1.794e-02, -4.776e-02, 1.287e-01)); + r += mul(s0_3, M4(2.962e-01, 2.757e-01, 1.657e-02, -1.746e-01, 3.828e-02, -1.434e-01, 4.698e-02, 3.134e-02, 1.626e-01, 1.804e-01, 2.535e-01, 9.081e-02, 6.562e-02, -5.491e-01, 2.183e-03, 2.761e-01)); + r += mul(s0_4, M4(-1.751e-01, 1.097e-01, -1.143e-01, 9.638e-02, -1.796e-01, -2.485e-01, -9.071e-03, 2.298e-02, -1.646e-01, -5.756e-02, 5.953e-02, 4.503e-02, 2.645e-02, 2.751e-02, 7.197e-02, 4.666e-02)); + r += mul(s0_5, M4(5.779e-02, 2.535e-01, -9.481e-02, -3.661e-02, 3.967e-02, 8.468e-02, 8.229e-03, 2.280e-02, 6.538e-02, 1.966e-02, -2.516e-02, 1.073e-01, 4.655e-02, 1.398e-01, -1.964e-02, 5.247e-02)); + r += mul(s0_6, M4(-7.597e-02, -4.377e-01, 8.354e-02, -1.889e-02, 1.302e-01, -9.488e-02, -5.391e-03, 2.192e-01, 1.187e-01, -5.301e-01, 4.636e-02, 6.813e-02, -3.251e-01, 1.225e-02, -6.616e-02, -8.459e-02)); + r += mul(s0_7, M4(-1.257e-01, 1.175e-02, 1.530e-01, 2.926e-02, -2.093e-02, 1.052e-01, 4.853e-03, -8.562e-02, 4.867e-02, -8.620e-02, -3.634e-03, 9.557e-02, 7.241e-02, -3.576e-02, -1.028e-01, -1.234e-01)); + r += mul(s0_8, M4(-1.866e-01, -3.209e-02, -2.943e-02, -5.855e-02, 2.794e-04, 3.564e-02, 4.627e-03, -3.217e-02, -1.304e-01, 5.295e-02, -1.062e-01, 6.101e-02, 5.828e-04, -1.247e-01, -5.507e-02, 3.192e-02)); + r += mul(s1_0, M4(1.164e-01, -7.474e-02, -2.857e-02, -6.668e-02, 2.265e-01, -5.164e-02, -1.004e-02, 6.276e-02, -3.215e-02, 5.380e-02, -3.521e-02, -4.491e-02, 3.978e-02, -5.505e-02, -2.772e-02, -3.175e-02)); + r += mul(s1_1, M4(8.632e-02, -2.542e-02, 4.180e-02, -1.574e-03, 1.349e-01, 5.947e-02, -1.205e-01, 1.823e-01, -4.069e-02, -1.011e-01, 2.783e-02, 5.925e-02, 8.958e-03, 5.379e-03, 2.129e-02, -1.198e-02)); + r += mul(s1_2, M4(8.469e-02, -6.346e-02, -3.136e-02, 3.843e-02, -1.799e-01, 1.197e-01, 6.340e-02, 2.738e-02, -2.734e-03, -2.145e-02, -1.682e-03, -3.851e-02, -1.415e-01, 4.641e-02, -3.239e-02, 8.861e-02)); + r += mul(s1_3, M4(3.989e-03, 1.631e-01, 3.869e-03, 1.441e-01, 1.246e-01, -1.019e-01, 1.252e-01, 4.696e-02, -1.789e-02, 2.595e-01, 1.141e-01, 4.445e-03, -9.038e-02, -7.196e-03, -2.213e-03, -1.800e-02)); + r += mul(s1_4, M4(-1.560e-02, -9.329e-02, 2.696e-02, -2.862e-02, -1.369e-01, -2.104e-01, 2.051e-01, 9.208e-02, 2.653e-02, 1.976e-02, -8.770e-04, -1.043e-01, -1.875e-02, -1.249e-01, 8.375e-02, 1.273e-02)); + r += mul(s1_5, M4(-1.079e-01, 2.550e-02, 1.182e-02, 5.653e-02, 4.882e-02, 1.534e-01, 3.794e-03, -4.484e-02, 8.980e-02, 6.711e-03, -2.761e-02, -2.076e-02, 7.742e-02, -9.804e-02, 1.470e-02, -2.654e-02)); + r += mul(s1_6, M4(-6.320e-02, 9.802e-02, -2.265e-02, 2.200e-02, -5.478e-02, -1.041e-01, -2.820e-02, 6.110e-03, -9.439e-02, -2.064e-02, -7.192e-03, -3.419e-02, 1.188e-01, 1.138e-01, -4.089e-03, 2.878e-02)); + r += mul(s1_7, M4(-1.218e-02, 3.202e-02, 2.396e-03, -8.416e-02, 1.513e-01, 2.373e-02, 3.390e-02, -8.421e-02, 4.312e-02, 1.243e-01, -3.633e-02, -1.061e-01, -6.732e-03, 3.347e-02, -4.659e-02, 7.279e-02)); + r += mul(s1_8, M4(5.111e-02, 4.784e-02, -1.719e-02, 3.597e-02, -1.890e-01, 6.043e-02, -7.685e-03, 4.533e-02, -9.896e-02, 1.394e-02, -1.045e-01, -8.497e-02, 1.063e-01, 5.015e-02, 5.828e-03, -6.269e-02)); + r += mul(s2_0, M4(2.285e-01, -3.687e-02, 6.187e-02, -1.497e-02, 9.003e-02, 3.358e-02, -2.267e-02, 1.189e-01, 3.308e-03, -3.413e-02, 1.361e-02, -5.823e-02, -1.229e-01, -1.184e-01, -3.262e-02, -7.547e-02)); + r += mul(s2_1, M4(-5.018e-02, 2.910e-02, -4.259e-03, 5.347e-02, 5.978e-02, -2.165e-02, -2.054e-03, -1.875e-02, -5.987e-02, 6.383e-02, 5.556e-02, 2.577e-02, 7.559e-02, 7.018e-02, 2.289e-02, 6.137e-03)); + r += mul(s2_2, M4(-6.007e-02, -4.349e-02, 1.945e-02, -1.882e-02, -3.415e-02, -5.427e-02, 2.093e-02, 8.056e-02, 1.078e-01, -5.950e-02, 1.008e-01, 2.744e-02, 2.153e-02, -1.352e-01, -5.578e-03, -1.774e-01)); + r += mul(s2_3, M4(2.468e-01, -9.416e-02, -1.857e-01, -8.229e-02, -4.687e-02, -3.897e-02, -3.143e-02, -2.024e-02, 2.018e-01, -1.233e-02, 1.028e-01, -8.787e-02, 5.332e-02, -6.006e-02, 5.621e-02, -5.948e-02)); + r += mul(s2_4, M4(-3.283e-01, -4.601e-03, 6.829e-05, -1.760e-02, 7.659e-02, 1.189e-02, 5.334e-02, 1.243e-02, -4.190e-02, -6.888e-02, -2.090e-02, 4.872e-02, -2.428e-01, 1.594e-01, -6.708e-02, -4.925e-02)); + r += mul(s2_5, M4(-5.396e-02, 4.187e-02, -4.452e-02, 9.492e-02, -1.380e-01, 1.535e-01, 2.170e-02, -1.384e-01, 4.016e-02, 2.773e-02, 1.567e-02, -8.716e-02, -9.485e-02, 2.299e-01, 8.372e-02, -1.730e-01)); + r += mul(s2_6, M4(2.509e-02, 1.046e-01, 1.253e-01, -2.533e-01, -8.064e-03, -1.683e-01, -3.098e-02, 2.254e-02, 1.242e-01, -5.642e-02, 9.277e-02, -4.424e-03, -5.620e-02, -2.193e-01, 9.624e-02, -8.891e-02)); + r += mul(s2_7, M4(-2.898e-01, 1.479e-01, -2.662e-02, -2.493e-01, -3.300e-02, 1.319e-02, -3.639e-02, 4.491e-02, -1.567e-02, 7.557e-02, -7.205e-04, -3.277e-02, 4.877e-02, 3.076e-01, 6.273e-02, 6.527e-02)); + r += mul(s2_8, M4(-1.365e-01, -3.416e-02, 5.075e-03, -7.978e-02, 4.832e-02, -5.712e-02, 7.845e-02, -5.435e-02, 4.310e-02, 2.942e-03, 8.831e-02, -1.021e-01, -1.602e-01, 8.820e-02, 3.409e-02, 3.347e-02)); + r += mul(s3_0, M4(9.747e-02, 2.207e-02, 1.317e-02, -9.682e-02, 2.017e-01, -6.119e-03, 1.220e-02, 2.629e-02, -1.393e-02, 5.451e-02, 8.014e-02, -3.469e-02, -3.029e-02, -7.257e-02, -2.248e-02, 4.954e-02)); + r += mul(s3_1, M4(1.043e-01, 9.222e-02, -1.606e-02, -1.053e-01, 1.731e-01, -5.331e-02, -7.956e-03, -1.294e-01, 1.511e-01, 4.706e-02, -3.527e-04, 2.963e-01, -3.024e-02, -2.760e-02, 6.659e-02, 3.214e-02)); + r += mul(s3_2, M4(4.838e-02, -9.306e-02, -6.023e-03, 4.483e-02, -3.687e-02, -9.697e-02, -3.225e-02, -1.746e-01, 1.721e-02, -4.435e-02, 1.228e-01, 3.103e-01, 5.914e-04, -3.446e-02, -1.994e-02, 5.386e-02)); + r += mul(s3_3, M4(-1.939e-01, -1.580e-01, -4.895e-02, 1.412e-03, -4.898e-03, -1.639e-01, -4.504e-02, -2.401e-02, 1.711e-01, -1.822e-01, 1.008e-01, 1.034e-02, 3.407e-02, -4.789e-02, -9.452e-03, 7.574e-02)); + r += mul(s3_4, M4(5.688e-02, -1.474e-01, 4.510e-02, -4.189e-02, 1.122e-01, -1.644e-01, 4.926e-02, -5.456e-02, -6.581e-02, -4.086e-01, 2.528e-01, -1.017e-01, 3.020e-02, -8.277e-02, -1.366e-02, 8.426e-02)); + r += mul(s3_5, M4(-7.230e-03, 5.720e-02, 3.569e-02, -3.742e-02, 1.180e-01, 1.606e-01, -2.458e-02, -1.471e-02, -1.738e-01, 7.709e-03, 2.068e-01, -1.951e-02, 4.671e-02, 7.615e-02, 1.091e-03, 7.760e-02)); + r += mul(s3_6, M4(2.175e-03, 1.722e-01, 2.253e-02, 2.303e-01, -9.743e-02, -1.569e-01, -1.029e-01, -3.046e-02, -5.847e-02, 1.876e-01, 9.724e-02, -1.385e-01, -3.451e-03, 2.051e-01, -4.468e-02, -3.382e-02)); + r += mul(s3_7, M4(-2.835e-02, -4.078e-03, -4.575e-02, 4.651e-02, 4.832e-02, -1.773e-01, -3.178e-03, -1.705e-01, 8.595e-02, -3.243e-01, 2.306e-01, -3.663e-01, 6.979e-02, 7.939e-02, -6.449e-02, -8.105e-02)); + r += mul(s3_8, M4(6.073e-03, -3.105e-04, 2.874e-03, 8.638e-02, -5.350e-02, 2.503e-01, -2.975e-02, 1.869e-01, 2.408e-01, -1.582e-02, 1.506e-01, -1.568e-01, -1.046e-01, -4.320e-03, 1.539e-02, -8.431e-02)); + r += mul(s4_0, M4(3.759e-02, 5.250e-02, 2.585e-02, -1.190e-01, -2.020e-01, -1.738e-01, -1.521e-01, -2.284e-01, 1.748e-01, -6.553e-03, 3.122e-02, 1.068e-01, -4.484e-02, 6.121e-02, 5.943e-03, -2.170e-02)); + r += mul(s4_1, M4(-6.344e-02, 1.005e-01, 1.640e-02, -1.009e-01, 2.528e-01, 1.125e-01, -6.701e-02, -5.406e-02, -1.221e-01, -1.250e-01, 1.085e-01, 1.870e-01, -8.933e-03, 5.957e-02, -1.302e-02, -1.364e-01)); + r += mul(s4_2, M4(1.354e-01, -4.092e-02, 2.189e-02, -2.721e-02, -2.853e-01, 1.884e-01, 3.689e-02, -4.418e-01, 1.393e-02, -2.359e-03, 8.880e-03, -7.302e-02, 5.377e-02, -9.811e-02, 9.482e-02, -7.366e-02)); + r += mul(s4_3, M4(-4.037e-02, -6.727e-02, -1.165e-02, 5.868e-02, 1.135e-01, 1.528e-02, -9.808e-02, 3.825e-02, -9.465e-03, -3.143e-02, -2.417e-01, -1.116e-02, -3.929e-02, -7.951e-02, 3.391e-02, -9.762e-02)); + r += mul(s4_4, M4(-2.092e-02, -2.204e-01, -1.407e-02, 1.174e-01, 1.338e-01, 2.886e-01, -1.430e-01, -2.413e-01, -3.739e-02, -1.132e-01, 1.138e-01, -2.281e-02, -9.746e-02, 5.206e-02, 1.268e-01, 1.185e-01)); + r += mul(s4_5, M4(-7.319e-02, 1.822e-02, -1.961e-02, -1.779e-03, 2.727e-01, 1.450e-01, -2.256e-02, -1.149e-01, 4.839e-02, 7.495e-02, 5.834e-03, 2.721e-02, 5.098e-03, -4.490e-02, 1.423e-01, 1.510e-02)); + r += mul(s4_6, M4(1.201e-01, -1.831e-01, -3.828e-02, 3.226e-02, -3.452e-01, -1.794e-01, -1.403e-02, -9.156e-02, 1.067e-01, -4.264e-02, -2.530e-02, 1.946e-02, 2.963e-02, -2.627e-01, -6.242e-02, -5.993e-02)); + r += mul(s4_7, M4(-1.202e-01, 1.040e-01, 2.414e-02, -6.253e-02, 8.447e-02, -2.435e-01, -2.410e-02, 9.560e-03, 2.747e-02, 5.268e-03, 2.616e-02, 1.051e-01, -6.211e-02, 7.567e-02, -8.283e-03, -1.307e-01)); + r += mul(s4_8, M4(3.009e-02, -6.296e-03, 1.735e-02, 5.828e-02, 1.022e-01, -9.718e-02, 2.726e-03, -1.039e-01, 1.170e-02, -4.387e-02, 5.666e-03, -3.432e-02, -9.777e-02, -4.244e-02, -1.039e-01, -1.724e-01)); + r += mul(s5_0, M4(-7.951e-02, -3.666e-02, 5.021e-02, 1.265e-01, -1.276e-01, 4.888e-02, -2.024e-02, 7.572e-02, -5.228e-02, 7.304e-02, 4.496e-02, 1.333e-01, -3.121e-02, 1.321e-01, -1.742e-02, 3.417e-02)); + r += mul(s5_1, M4(1.194e-01, -7.352e-02, 6.184e-02, 2.131e-01, -2.250e-02, -1.762e-01, 4.106e-03, 9.620e-02, -1.975e-01, -6.519e-02, 1.051e-01, 1.721e-01, 5.495e-02, 1.228e-01, -7.668e-02, -1.179e-01)); + r += mul(s5_2, M4(1.922e-01, -4.991e-02, -4.261e-02, 1.487e-01, 5.878e-02, -5.169e-02, -6.040e-02, -1.530e-02, 1.252e-02, -2.512e-02, -2.008e-02, 2.385e-02, 6.140e-03, 8.180e-04, 1.241e-02, 8.055e-02)); + r += mul(s5_3, M4(-1.951e-01, 1.221e-01, 4.860e-02, -1.653e-01, 6.190e-02, 2.393e-01, 6.098e-02, 1.480e-01, 1.565e-03, -1.047e-01, -2.786e-01, -3.447e-03, 7.533e-03, 1.296e-01, 1.720e-02, 6.717e-02)); + r += mul(s5_4, M4(9.892e-03, -2.393e-01, -6.465e-02, 7.031e-03, -8.029e-02, 1.763e-01, 2.851e-02, 1.690e-02, 1.832e-02, -1.088e-01, 6.066e-02, 1.175e-01, 1.053e-01, -1.132e-01, 8.121e-02, 1.441e-01)); + r += mul(s5_5, M4(-6.115e-02, 3.854e-02, 2.771e-02, -2.917e-01, 8.953e-02, 8.536e-02, -5.394e-02, 4.004e-02, -5.287e-02, 7.258e-02, 1.048e-02, 2.022e-02, 8.242e-02, -3.174e-02, -3.985e-02, 1.039e-01)); + r += mul(s5_6, M4(9.701e-02, -2.529e-01, 5.811e-02, 1.978e-01, -6.219e-02, 2.106e-01, 2.179e-02, -1.517e-01, -1.459e-01, 6.421e-02, 2.274e-02, 3.116e-03, 1.915e-02, -1.672e-01, -6.981e-02, 4.877e-02)); + r += mul(s5_7, M4(2.666e-01, -5.971e-02, 2.709e-02, 4.966e-02, 4.099e-03, 1.801e-02, -3.899e-02, -8.567e-02, 2.451e-02, -1.638e-02, 2.967e-02, 6.272e-02, -6.061e-02, 6.665e-02, 7.756e-03, 7.877e-02)); + r += mul(s5_8, M4(-1.622e-01, 3.626e-02, -2.753e-02, 2.666e-01, 5.491e-02, -7.876e-02, 4.837e-02, -6.127e-02, -4.035e-02, 5.379e-03, 1.362e-02, -5.027e-02, -5.938e-02, -1.966e-02, -4.458e-02, 1.219e-01)); + r += mul(s6_0, M4(-1.073e-01, -2.268e-02, -5.501e-03, -1.056e-01, 9.025e-02, 5.071e-02, 8.031e-02, 5.300e-02, -1.550e-02, -3.503e-02, -7.288e-03, -7.107e-02, -9.045e-03, 5.579e-02, -7.203e-04, -7.520e-02)); + r += mul(s6_1, M4(8.352e-02, -7.482e-03, 1.065e-02, -1.990e-02, -5.408e-02, -3.289e-02, -7.212e-03, 2.428e-01, -5.297e-02, -3.798e-02, -1.253e-02, -8.234e-02, 3.211e-02, -5.380e-02, -1.238e-01, -2.021e-02)); + r += mul(s6_2, M4(9.075e-02, -4.485e-02, -2.579e-02, 2.019e-02, -2.033e-02, 1.251e-02, -2.849e-03, -6.163e-02, -1.619e-02, 9.033e-02, -5.164e-02, -1.889e-01, -2.819e-02, 1.528e-01, -7.519e-02, 8.862e-02)); + r += mul(s6_3, M4(8.999e-03, 1.290e-02, 3.210e-02, -3.479e-02, -1.223e-01, 3.118e-02, -1.110e-01, -1.087e-01, -7.495e-02, 1.912e-02, -2.434e-02, -2.479e-02, 8.889e-02, -9.007e-02, -9.235e-02, -5.254e-02)); + r += mul(s6_4, M4(-1.233e-01, 8.849e-02, 8.545e-02, 4.886e-03, 9.337e-02, 1.546e-01, -4.189e-02, 1.109e-01, 4.722e-02, 2.499e-01, 3.091e-02, 6.654e-02, -1.390e-01, -9.918e-02, -2.202e-01, -2.963e-02)); + r += mul(s6_5, M4(8.837e-02, 5.132e-02, -9.932e-02, -2.470e-02, 1.230e-01, -1.539e-02, -1.717e-03, 9.658e-02, -9.416e-02, -1.711e-01, -2.158e-02, -4.066e-02, 1.597e-01, 2.003e-01, -1.581e-01, -4.412e-02)); + r += mul(s6_6, M4(7.939e-02, 1.110e-01, -1.445e-02, 1.051e-01, 1.901e-01, -1.137e-01, 6.565e-03, 2.951e-02, -3.434e-02, 2.136e-01, 4.927e-02, -1.229e-01, -4.579e-02, -7.279e-02, 3.103e-03, 9.711e-02)); + r += mul(s6_7, M4(3.305e-02, -6.877e-02, 4.758e-02, -9.783e-03, -1.096e-01, 1.412e-01, 4.420e-04, 6.503e-02, 8.466e-02, -6.394e-02, 8.932e-02, 5.979e-02, 1.053e-01, -7.737e-02, -6.675e-02, 1.117e-02)); + r += mul(s6_8, M4(-9.356e-02, 1.015e-01, -2.942e-03, -4.394e-02, 5.934e-02, 4.966e-03, -5.267e-02, -8.942e-02, 6.933e-02, 1.135e-02, -3.072e-02, 1.648e-01, -7.249e-03, -2.476e-02, 6.294e-02, 4.891e-02)); + r += mul(s7_0, M4(1.170e-01, -1.665e-02, -5.844e-02, 2.310e-01, -1.053e-01, -3.471e-02, 3.217e-02, 5.597e-03, -7.930e-03, -1.157e-01, -3.151e-02, 1.755e-02, -4.055e-01, 2.308e-01, 1.365e-01, -1.197e-02)); + r += mul(s7_1, M4(-1.190e-02, -2.708e-02, 2.930e-02, 1.566e-01, -8.527e-03, 2.480e-02, 3.832e-03, -7.143e-02, 1.495e-02, -3.769e-02, -6.756e-02, 2.383e-02, 2.074e-01, -7.796e-02, -2.250e-01, -1.741e-01)); + r += mul(s7_2, M4(-7.789e-02, -1.086e-02, -1.675e-02, 1.756e-01, 7.499e-02, 4.148e-02, -2.802e-02, 1.173e-02, 1.317e-01, 5.065e-02, -2.032e-02, 1.834e-01, 1.752e-01, 2.146e-01, -3.923e-02, -1.357e-01)); + r += mul(s7_3, M4(-6.958e-02, 9.580e-03, 8.851e-02, -7.930e-02, -1.558e-01, -3.778e-02, -6.097e-02, 2.811e-02, -2.334e-02, 1.998e-02, -1.205e-02, 1.894e-02, 5.476e-03, -1.280e-02, -1.022e-01, 1.428e-01)); + r += mul(s7_4, M4(6.006e-02, -1.223e-01, 1.589e-01, 6.598e-02, 1.343e-01, 1.586e-01, -6.632e-02, 5.271e-02, 9.392e-02, 1.218e-01, -5.771e-02, 9.682e-03, 5.840e-01, -3.489e-01, -3.396e-01, -1.786e-01)); + r += mul(s7_5, M4(-3.016e-02, -6.150e-02, -8.569e-02, -4.323e-02, -6.244e-02, -2.575e-02, -6.612e-02, 5.142e-02, -2.008e-01, 1.263e-02, 7.861e-03, 1.032e-01, 6.973e-01, 3.473e-04, -2.266e-01, -4.332e-02)); + r += mul(s7_6, M4(1.376e-01, 5.724e-02, 4.438e-02, -7.243e-02, -5.893e-02, -3.061e-02, 1.273e-02, -1.863e-02, 7.112e-03, 2.118e-02, -6.513e-03, 6.162e-02, 1.186e-01, 2.414e-01, 1.728e-01, -6.667e-02)); + r += mul(s7_7, M4(1.400e-01, 1.383e-02, -7.103e-02, -1.366e-01, -1.084e-01, 1.477e-01, -2.983e-02, -8.506e-02, -5.073e-02, -4.197e-02, 2.801e-02, 5.587e-02, 7.099e-01, -9.430e-02, -1.155e-01, 1.032e-01)); + r += mul(s7_8, M4(-4.641e-02, 1.204e-02, 4.037e-02, -1.185e-01, -8.472e-03, 4.617e-02, -4.495e-02, 8.632e-03, 3.586e-02, 9.629e-02, -2.544e-02, 6.781e-02, 4.206e-01, 4.385e-02, 1.276e-01, -1.737e-01)); + r += V4(-2.705e-02, 3.527e-02, 3.627e-01, -1.176e-02); + return r; +} + +V4 f1(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(2.051e-01, -1.114e-01, -1.216e-01, 1.105e-01, 8.499e-02, -6.663e-02, 3.991e-03, 6.458e-02, -7.665e-02, -8.809e-02, 1.040e-01, -2.485e-02, -1.012e-01, -9.021e-02, 8.377e-02, 2.340e-01)); + r += mul(s0_1, M4(-1.931e-01, -7.857e-02, 1.292e-01, -1.716e-01, 6.330e-02, -2.973e-02, 1.371e-02, 5.827e-02, 8.144e-02, 9.241e-02, 2.017e-03, 3.057e-03, -1.029e-01, -4.298e-02, 1.090e-01, -3.017e-01)); + r += mul(s0_2, M4(-1.690e-02, 1.600e-01, -1.662e-01, 1.337e-01, -7.108e-02, 2.756e-02, 4.058e-02, -9.522e-02, 4.137e-03, -9.349e-03, -1.089e-01, -9.164e-02, -3.924e-02, -9.906e-03, -1.061e-01, -1.744e-01)); + r += mul(s0_3, M4(-3.095e-02, 2.730e-01, 1.041e-01, 3.858e-01, 2.290e-02, 9.362e-02, 3.441e-02, 6.260e-02, 1.465e-02, -7.561e-02, 5.372e-02, 3.513e-02, 1.353e-02, -1.222e-01, -3.884e-02, -1.430e-01)); + r += mul(s0_4, M4(-2.386e-01, 3.587e-02, -1.912e-01, -3.013e-01, -6.317e-02, -1.056e-01, -1.407e-01, -1.712e-01, -2.643e-02, 7.672e-03, -2.874e-02, 1.912e-01, 7.532e-02, -8.689e-02, 3.293e-02, 1.470e-01)); + r += mul(s0_5, M4(-1.332e-01, -1.546e-01, 9.643e-02, -2.599e-02, 8.934e-03, -1.228e-01, -4.493e-02, 2.042e-01, -8.228e-02, 1.075e-02, -5.997e-02, -6.339e-02, -8.336e-02, -3.334e-03, 3.381e-02, 3.368e-01)); + r += mul(s0_6, M4(5.030e-02, -4.626e-01, -1.869e-01, 4.965e-01, 9.817e-03, 5.342e-02, 5.986e-02, 5.861e-02, -1.183e-01, 2.203e-02, 5.520e-02, -1.429e-01, -5.020e-02, 2.073e-01, 7.864e-03, -2.852e-01)); + r += mul(s0_7, M4(2.176e-01, 2.152e-01, -1.788e-01, -5.080e-01, -1.122e-01, 8.691e-03, -9.614e-03, -3.106e-02, 4.894e-02, 6.166e-03, 7.439e-02, 1.690e-01, 1.803e-01, -9.130e-02, 2.321e-02, -1.665e-01)); + r += mul(s0_8, M4(9.277e-02, -9.217e-02, -2.009e-01, 2.199e-01, 5.131e-02, -6.504e-02, -6.013e-02, -5.409e-02, -2.226e-02, -2.786e-03, -1.661e-02, 4.217e-02, -1.431e-02, -3.201e-02, -6.179e-02, 8.740e-02)); + r += mul(s1_0, M4(5.791e-02, -1.342e-01, 1.181e-02, 1.169e-01, -2.401e-01, 1.451e-01, 5.932e-02, 1.637e-01, 3.013e-02, -4.731e-02, 2.029e-03, 1.286e-01, -5.358e-02, -1.128e-01, -1.991e-02, 1.099e-01)); + r += mul(s1_1, M4(6.223e-02, 6.101e-03, 1.201e-01, 8.313e-02, -8.887e-02, 1.035e-01, 2.002e-01, -1.245e-01, -3.890e-02, -7.083e-02, -1.125e-01, 2.253e-01, 7.171e-02, 2.084e-02, 1.537e-01, -6.827e-03)); + r += mul(s1_2, M4(2.259e-02, 1.401e-02, -8.702e-02, -5.172e-02, -8.238e-02, 3.951e-01, 4.718e-04, -2.622e-01, -7.200e-03, -3.022e-02, -1.731e-02, -1.051e-01, 6.473e-02, -5.861e-02, 6.686e-02, -1.402e-02)); + r += mul(s1_3, M4(1.818e-02, 1.564e-01, -5.097e-02, -6.576e-02, 7.355e-02, 1.180e-01, -7.400e-03, -5.576e-02, 1.021e-01, -5.665e-03, 5.615e-02, 2.363e-01, -2.641e-02, 1.016e-01, -1.045e-02, 4.678e-02)); + r += mul(s1_4, M4(2.484e-02, 1.577e-01, -1.466e-02, -1.573e-01, 2.610e-02, -3.650e-01, -1.553e-02, 1.881e-01, -3.113e-02, -1.647e-01, 9.964e-02, -7.754e-02, -6.019e-02, 8.320e-02, -8.445e-02, -1.022e-01)); + r += mul(s1_5, M4(-3.212e-02, -9.051e-02, 1.200e-02, 2.126e-01, 8.613e-02, -1.371e-01, 1.414e-01, 3.601e-03, 6.368e-02, -2.634e-02, 2.608e-02, -5.757e-02, -1.123e-02, -8.145e-02, -5.911e-02, 4.555e-02)); + r += mul(s1_6, M4(-2.184e-02, -4.911e-02, -3.778e-02, 1.812e-01, 5.428e-02, -1.398e-01, 2.522e-02, 7.816e-02, -9.922e-02, 3.210e-02, -4.167e-02, 9.021e-04, 6.767e-03, -6.228e-02, 6.149e-02, -7.836e-02)); + r += mul(s1_7, M4(-1.528e-03, -1.183e-01, 7.824e-03, 8.210e-02, -2.946e-02, 3.472e-01, 1.122e-01, -3.994e-04, 3.110e-02, 1.902e-02, -5.257e-02, 6.723e-02, -6.471e-02, -1.212e-02, -2.051e-02, -7.960e-02)); + r += mul(s1_8, M4(-4.947e-02, 1.218e-01, 1.486e-02, -1.141e-01, 5.986e-02, -9.915e-02, -3.834e-03, 2.886e-02, -2.646e-02, 3.957e-03, -3.546e-02, 1.315e-01, -3.214e-02, 2.432e-02, 2.367e-02, 6.176e-02)); + r += mul(s2_0, M4(5.123e-02, 5.989e-02, -6.815e-02, 9.743e-02, -3.462e-02, -8.530e-02, 6.288e-02, -2.515e-02, -6.732e-02, -1.728e-02, -4.539e-02, -2.716e-03, -6.797e-02, 8.885e-02, -9.367e-02, -9.246e-03)); + r += mul(s2_1, M4(6.126e-02, 1.034e-01, -1.436e-01, 1.068e-01, 6.247e-02, 9.696e-02, -2.424e-02, 1.688e-01, -3.992e-02, -9.006e-02, 7.081e-02, 6.454e-02, -1.187e-01, -5.075e-02, 7.586e-02, -5.934e-02)); + r += mul(s2_2, M4(-7.571e-02, 1.086e-01, -1.870e-01, -4.357e-02, -3.151e-02, 4.510e-03, 1.129e-02, 6.293e-02, 4.355e-02, 1.003e-02, -2.586e-02, 1.030e-02, -3.310e-02, 1.197e-01, 1.317e-02, -1.287e-01)); + r += mul(s2_3, M4(-1.821e-01, -5.221e-02, -6.573e-02, -1.790e-02, -3.118e-02, 5.614e-02, 5.421e-02, 1.202e-02, -6.092e-02, 2.164e-02, 2.650e-02, -1.051e-01, 2.480e-02, -1.092e-01, 2.620e-01, -1.028e-01)); + r += mul(s2_4, M4(-1.148e-01, -3.157e-01, -2.715e-01, 1.825e-01, -4.377e-02, -3.740e-02, -1.248e-01, -2.072e-04, 1.325e-02, 2.442e-02, -6.368e-02, 5.754e-02, -1.426e-01, 2.100e-02, 1.788e-02, -2.557e-01)); + r += mul(s2_5, M4(1.143e-02, 4.976e-03, -5.215e-04, 2.190e-01, 5.087e-02, -1.155e-02, 1.746e-01, 1.392e-01, -1.745e-02, -4.258e-02, 1.637e-01, -3.673e-02, -1.797e-01, 3.567e-03, 1.886e-01, 3.290e-01)); + r += mul(s2_6, M4(8.078e-02, -5.942e-02, -6.795e-02, 3.094e-01, -6.489e-02, -6.927e-02, -2.532e-02, -4.067e-02, -1.402e-02, -6.488e-03, 7.648e-02, 9.025e-02, 1.130e-01, -1.261e-01, -8.126e-02, -9.004e-02)); + r += mul(s2_7, M4(3.884e-02, 2.023e-01, 6.625e-02, 6.108e-02, 1.205e-02, 9.322e-03, 6.163e-02, -8.168e-02, 5.798e-02, 1.973e-02, 8.854e-03, 9.005e-02, 1.195e-01, -1.639e-01, -1.471e-01, 6.780e-02)); + r += mul(s2_8, M4(-3.076e-01, 2.985e-01, -1.318e-01, 6.138e-02, 1.681e-02, -3.053e-02, 8.927e-02, 3.131e-02, 4.618e-02, 7.467e-02, -8.657e-02, -1.095e-01, 1.209e-01, -2.500e-01, -3.690e-01, 1.925e-02)); + r += mul(s3_0, M4(-3.576e-02, -5.877e-02, -4.620e-02, 1.437e-02, 7.191e-02, -1.027e-01, -1.292e-01, 2.874e-03, -2.148e-02, -2.312e-01, 1.928e-01, 1.189e-01, 4.168e-03, 9.991e-02, 2.619e-02, -9.109e-02)); + r += mul(s3_1, M4(8.459e-02, -5.825e-02, 1.192e-01, 9.633e-04, 1.364e-01, 1.481e-01, -2.684e-01, -2.158e-02, 2.941e-02, 5.594e-01, 2.594e-02, -9.532e-02, -2.989e-02, 8.519e-02, 9.496e-02, 2.129e-01)); + r += mul(s3_2, M4(-8.653e-02, 1.469e-02, 3.830e-02, -3.940e-02, 1.102e-03, -1.709e-01, -1.039e-01, -2.331e-01, -1.292e-01, 3.492e-01, -1.175e-01, -3.262e-02, 2.708e-02, 6.536e-02, 1.758e-02, -1.578e-01)); + r += mul(s3_3, M4(1.008e-01, 5.336e-03, 1.987e-02, 2.761e-02, 1.080e-01, -2.102e-01, 3.839e-02, 1.827e-01, -1.258e-01, -1.818e-01, 2.859e-02, -5.134e-02, 7.261e-02, -9.374e-02, 1.013e-01, 9.994e-03)); + r += mul(s3_4, M4(-7.610e-02, 8.429e-02, -5.786e-02, 1.165e-01, -9.639e-02, -1.452e-01, -1.060e-01, 4.033e-01, -4.765e-02, -3.415e-02, -3.791e-02, 2.257e-01, 5.831e-02, -3.548e-02, 1.256e-03, -3.516e-02)); + r += mul(s3_5, M4(1.950e-02, 1.418e-02, -6.498e-03, -6.196e-02, 1.770e-02, -5.317e-02, -1.264e-01, -4.619e-01, -1.301e-01, -1.639e-03, 1.875e-02, -2.892e-01, -6.607e-02, -6.523e-03, 5.238e-02, 1.304e-01)); + r += mul(s3_6, M4(-6.517e-02, -4.494e-02, 5.729e-02, -4.323e-03, -5.584e-02, -1.577e-02, 3.936e-02, 9.087e-02, 3.935e-02, -1.382e-01, -1.728e-02, 1.404e-01, -2.122e-02, -2.349e-02, -9.270e-02, -9.217e-02)); + r += mul(s3_7, M4(1.215e-01, -1.047e-02, 6.047e-03, -1.998e-01, -4.287e-02, 1.967e-02, -2.010e-01, 2.046e-01, -3.913e-02, -8.821e-02, -2.432e-01, 4.894e-02, 7.895e-02, 1.095e-01, 4.640e-02, -3.483e-02)); + r += mul(s3_8, M4(2.018e-03, -2.716e-03, -1.596e-02, -1.916e-01, -3.315e-02, -1.665e-01, -1.173e-01, -8.551e-02, -3.230e-02, 1.273e-01, -8.199e-02, -1.331e-01, -5.627e-02, 5.167e-02, -3.181e-02, -1.333e-01)); + r += mul(s4_0, M4(6.189e-02, 9.147e-03, -1.257e-02, 1.175e-01, 5.045e-02, -2.184e-01, 8.163e-02, -5.065e-02, -9.018e-02, -9.549e-02, 9.756e-02, 1.040e-01, -7.600e-02, -1.415e-01, 5.857e-02, 1.576e-01)); + r += mul(s4_1, M4(-3.889e-04, -3.811e-03, -7.045e-02, -1.290e-01, 1.675e-01, -1.672e-01, -7.413e-02, 1.036e-01, 1.580e-01, 1.675e-01, -2.016e-01, -9.586e-02, 7.723e-02, -1.377e-01, -6.372e-02, 3.977e-02)); + r += mul(s4_2, M4(-1.076e-02, 4.677e-02, -7.688e-03, -9.809e-02, 2.044e-01, 8.981e-02, -4.126e-02, 3.244e-01, -2.681e-02, 8.702e-02, 4.261e-02, 2.472e-02, -3.153e-02, -8.140e-02, -4.853e-02, 1.707e-01)); + r += mul(s4_3, M4(2.806e-02, -1.416e-01, -7.901e-02, 1.045e-02, 6.336e-03, -4.741e-01, -2.487e-01, 5.238e-02, 1.209e-02, 2.783e-01, 1.835e-01, -4.384e-02, -9.517e-02, -7.745e-02, -1.052e-01, -1.239e-01)); + r += mul(s4_4, M4(-9.428e-02, -1.833e-02, -2.601e-02, 7.356e-02, -1.486e-01, 2.948e-02, 2.502e-01, -2.314e-01, 1.104e-01, -1.343e-01, -2.981e-01, -9.674e-02, -2.600e-02, -1.356e-01, -5.424e-02, -2.577e-03)); + r += mul(s4_5, M4(8.080e-02, 3.808e-02, -5.635e-02, -1.385e-01, 1.128e-01, 2.107e-01, 4.262e-02, 5.565e-01, 1.292e-02, 5.516e-02, -5.578e-02, 1.006e-01, -1.165e-02, -1.283e-01, -1.195e-02, 3.710e-02)); + r += mul(s4_6, M4(-7.956e-02, -3.898e-02, -3.705e-02, -6.141e-02, 1.204e-01, -1.527e-01, 9.714e-02, -1.856e-01, -8.911e-02, 2.328e-02, -4.341e-02, 5.749e-02, -1.302e-01, -1.636e-01, -1.153e-01, 4.291e-02)); + r += mul(s4_7, M4(2.943e-02, 1.157e-01, 7.623e-04, -2.658e-02, -2.001e-01, -4.169e-02, 5.792e-02, 2.248e-01, 5.508e-03, 5.892e-03, -3.907e-02, 6.471e-02, -2.077e-03, -2.288e-01, -3.274e-02, -1.980e-01)); + r += mul(s4_8, M4(1.155e-02, -8.695e-03, 4.365e-02, 8.192e-02, 1.437e-03, 2.241e-01, 1.615e-01, -1.287e-03, -6.141e-02, -4.430e-02, 3.162e-02, 5.725e-02, -8.957e-02, -1.880e-02, -3.154e-02, 2.495e-01)); + r += mul(s5_0, M4(6.698e-03, 2.446e-01, 1.064e-01, -2.333e-01, 8.398e-02, 1.259e-01, 1.300e-01, -4.527e-03, -1.450e-01, -1.342e-01, 1.158e-01, -6.956e-02, -7.463e-02, -4.917e-02, 6.212e-02, 1.041e-01)); + r += mul(s5_1, M4(-5.109e-02, 1.202e-01, 1.301e-01, 2.447e-01, -2.661e-02, 1.459e-01, 4.081e-03, 9.255e-02, 6.270e-03, 9.833e-03, -1.827e-01, 1.978e-01, 1.042e-01, -6.184e-02, 1.129e-01, 2.724e-02)); + r += mul(s5_2, M4(-9.528e-02, 7.638e-02, -6.379e-02, -3.093e-01, 7.835e-03, 5.860e-02, -1.221e-02, -7.426e-02, -8.886e-03, -8.248e-02, -2.452e-02, 4.934e-02, 6.254e-02, -9.158e-02, -1.431e-01, -8.059e-02)); + r += mul(s5_3, M4(5.516e-02, 1.060e-01, 1.076e-01, -2.141e-01, -6.265e-02, -9.982e-02, -2.924e-02, 2.221e-02, -3.913e-02, 3.002e-01, 1.047e-01, -9.692e-02, -2.233e-02, 8.167e-02, -1.788e-02, 9.185e-02)); + r += mul(s5_4, M4(-1.033e-01, -1.085e-01, -1.545e-01, 2.828e-01, 3.280e-02, 6.244e-02, 4.462e-02, -4.086e-02, 2.783e-02, -7.351e-02, -1.294e-01, -1.053e-01, 1.550e-01, 1.063e-01, -8.768e-02, -3.760e-02)); + r += mul(s5_5, M4(-1.171e-01, -2.230e-01, -7.730e-02, -1.134e-01, -1.817e-02, -1.421e-01, -5.315e-02, -4.395e-04, -6.779e-02, 1.147e-02, -2.157e-02, 3.958e-02, 4.972e-02, -1.580e-02, 2.947e-02, -1.692e-01)); + r += mul(s5_6, M4(-9.404e-02, -7.301e-02, -3.278e-02, 1.819e-01, 9.315e-02, 1.353e-01, 4.351e-02, 8.531e-03, -4.843e-02, 9.107e-02, -4.694e-02, -1.637e-02, 4.969e-03, -1.248e-02, -1.670e-02, -2.470e-04)); + r += mul(s5_7, M4(6.462e-02, 4.478e-02, 8.927e-02, -1.264e-01, -5.183e-02, 1.347e-03, 2.785e-02, 4.317e-02, -7.223e-03, -1.428e-02, 7.643e-04, 1.053e-01, 2.188e-02, -1.182e-01, 1.179e-01, 6.074e-02)); + r += mul(s5_8, M4(1.897e-01, -8.327e-02, 7.416e-02, -1.695e-02, 4.508e-02, 1.182e-01, 6.454e-02, -1.191e-01, -1.309e-02, 4.376e-02, 1.515e-02, -3.969e-02, 5.553e-02, -2.351e-02, 9.684e-02, -1.221e-02)); + r += mul(s6_0, M4(-4.527e-02, -9.728e-02, 9.743e-03, 5.919e-02, -1.075e-01, -8.651e-02, 5.333e-02, 4.852e-03, 1.093e-02, -3.015e-02, -8.744e-02, -1.731e-02, -8.862e-02, 6.434e-03, 3.455e-02, -8.617e-03)); + r += mul(s6_1, M4(6.181e-02, -4.134e-02, -1.274e-01, -2.780e-02, 9.931e-02, 3.614e-02, 1.857e-01, -2.142e-01, 3.274e-02, -2.344e-01, -1.061e-01, 1.320e-01, -1.500e-01, -1.382e-01, -3.919e-03, 1.593e-03)); + r += mul(s6_2, M4(-1.193e-02, -5.966e-02, -4.917e-02, -1.712e-02, -1.225e-01, 6.671e-02, 8.546e-02, -1.695e-01, 4.812e-02, 1.271e-01, -1.225e-01, -7.102e-03, -2.274e-01, -4.425e-02, -1.270e-03, 6.183e-02)); + r += mul(s6_3, M4(1.253e-01, 1.469e-01, -5.953e-02, -1.821e-01, 1.218e-02, -6.910e-02, 8.267e-02, -2.724e-01, 6.948e-02, 6.374e-02, -1.253e-01, -1.573e-01, 3.327e-02, -2.731e-02, -5.794e-02, -8.764e-02)); + r += mul(s6_4, M4(-1.470e-01, -1.318e-02, 1.086e-01, 2.166e-02, 1.640e-01, -2.715e-02, 7.695e-02, -7.937e-02, 4.435e-02, 6.541e-02, 1.362e-01, 9.317e-02, -1.293e-01, 6.498e-02, 6.115e-02, -2.732e-02)); + r += mul(s6_5, M4(-1.062e-01, 7.520e-02, -1.024e-03, -2.449e-02, 1.120e-01, 3.211e-02, -7.203e-02, 3.927e-01, -1.297e-02, -6.928e-06, -7.026e-02, 1.230e-01, 1.202e-02, 2.639e-02, -6.227e-02, 5.431e-02)); + r += mul(s6_6, M4(-8.389e-02, 1.630e-02, 7.006e-02, 1.890e-02, -5.597e-03, -1.783e-01, -6.151e-03, -1.118e-01, -5.326e-02, 2.527e-01, 3.765e-02, -2.475e-02, -1.187e-01, 1.054e-01, 6.812e-02, -1.675e-04)); + r += mul(s6_7, M4(1.121e-01, 1.753e-03, 1.272e-02, -3.274e-02, -1.554e-02, 1.828e-02, 7.942e-02, -4.052e-02, 1.010e-01, -2.468e-02, 8.385e-02, 1.280e-01, -3.523e-02, -7.376e-02, 5.747e-02, 6.557e-02)); + r += mul(s6_8, M4(7.530e-02, 1.398e-03, -3.553e-02, 1.229e-01, 6.035e-02, -3.222e-02, 6.983e-03, 1.919e-01, 1.019e-01, -1.546e-03, -1.724e-02, 2.234e-01, 7.674e-02, 3.747e-02, -3.599e-02, -1.326e-02)); + r += mul(s7_0, M4(-1.416e-01, -2.534e-01, 6.959e-02, 4.909e-02, 5.168e-02, 1.637e-02, 4.515e-02, -4.846e-02, 5.483e-02, -3.688e-02, -3.717e-02, -6.822e-02, 7.247e-02, 3.603e-01, 1.765e-01, -2.696e-01)); + r += mul(s7_1, M4(-1.218e-02, -3.408e-01, 2.292e-02, -1.435e-01, 1.395e-01, 1.190e-02, 7.423e-03, -3.210e-02, 1.329e-02, -1.986e-01, -9.972e-03, -3.261e-02, 1.019e-01, -6.167e-01, -2.890e-02, -3.107e-01)); + r += mul(s7_2, M4(8.059e-02, -5.207e-02, -3.553e-02, -1.822e-01, -3.392e-02, 1.620e-02, -1.094e-01, -3.267e-02, -6.855e-02, 2.069e-02, 5.989e-02, -1.125e-01, -1.526e-01, -8.064e-02, -5.341e-02, 8.461e-02)); + r += mul(s7_3, M4(2.222e-01, -1.026e-01, 1.373e-02, 1.260e-01, -5.944e-02, -7.264e-02, 2.722e-02, -2.172e-02, 7.230e-02, -3.942e-03, -1.013e-01, 7.697e-02, -3.213e-01, -1.067e-02, 1.809e-01, 2.742e-01)); + r += mul(s7_4, M4(-5.250e-02, -3.701e-02, -1.064e-01, 1.576e-01, 4.320e-02, 8.763e-02, 4.999e-02, 2.818e-02, 1.200e-01, -1.260e-01, -2.616e-02, -6.935e-02, -9.278e-02, -4.988e-02, 4.001e-01, -3.712e-01)); + r += mul(s7_5, M4(-3.058e-02, 4.468e-02, -1.586e-01, 1.079e-01, 2.566e-02, -2.422e-02, 5.597e-02, -6.913e-02, 8.615e-02, -4.592e-02, -8.361e-02, -2.085e-01, -2.418e-01, -5.534e-02, 4.826e-02, -1.660e-01)); + r += mul(s7_6, M4(-4.661e-02, -2.368e-01, -7.790e-02, -1.367e-01, 1.023e-01, 2.490e-02, -4.375e-02, 2.494e-01, 2.857e-02, 3.380e-02, 9.195e-02, -4.993e-04, 8.457e-02, 1.930e-01, -1.219e-01, -2.545e-01)); + r += mul(s7_7, M4(2.656e-02, 8.901e-03, -9.662e-02, 6.076e-02, 1.533e-02, -9.063e-02, -1.670e-01, 5.721e-02, 2.601e-02, 8.227e-02, 1.087e-01, 7.810e-03, 4.441e-02, 4.057e-01, 4.137e-02, 1.901e-01)); + r += mul(s7_8, M4(-9.190e-02, -1.211e-02, -5.945e-02, -1.734e-03, -9.425e-02, 5.072e-02, -9.240e-02, 3.546e-02, -1.003e-01, -2.467e-02, -2.442e-02, 9.600e-02, 2.682e-01, -3.375e-02, 7.697e-02, 1.923e-01)); + r += V4(3.100e-02, -1.857e-02, -6.864e-02, 8.263e-03); + return r; +} + +V4 f2(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(6.963e-02, -2.252e-02, -1.448e-01, 2.277e-02, -3.770e-02, -1.320e-02, -1.452e-01, -1.153e-01, -3.604e-02, -5.332e-02, -9.732e-02, -6.503e-02, 7.152e-02, -1.186e-01, 3.170e-01, -2.347e-01)); + r += mul(s0_1, M4(4.306e-02, -4.997e-04, -4.649e-01, -2.117e-01, -1.229e-01, 2.042e-02, -2.969e-02, -7.675e-02, 9.907e-02, -4.484e-02, 1.025e-02, 2.717e-02, -2.286e-01, -7.177e-02, 8.781e-02, -1.635e-01)); + r += mul(s0_2, M4(1.548e-01, -8.983e-02, -1.161e-01, -1.496e-01, -2.478e-02, -9.860e-02, 1.299e-01, 1.345e-01, 1.057e-03, -3.365e-02, 2.476e-02, 8.473e-03, -1.789e-01, 3.040e-02, 9.071e-02, -4.536e-02)); + r += mul(s0_3, M4(-2.717e-01, 2.572e-03, 2.506e-01, -9.201e-02, 1.012e-02, 6.912e-02, 1.405e-01, 8.530e-02, -7.757e-02, -6.426e-02, 2.328e-01, 5.584e-02, 3.363e-01, 5.617e-02, 1.332e-02, 1.869e-02)); + r += mul(s0_4, M4(-2.072e-02, -1.647e-01, 6.103e-02, -7.830e-02, 3.174e-01, -1.248e-01, -5.962e-02, -9.131e-02, 9.164e-02, 2.699e-03, -1.759e-01, -8.091e-03, 7.812e-02, -1.084e-01, 1.606e-01, 4.792e-02)); + r += mul(s0_5, M4(-1.059e-02, -5.786e-02, -4.665e-03, -2.343e-01, -8.026e-03, 5.300e-02, 2.951e-02, -5.558e-02, -5.785e-02, 9.929e-02, 2.625e-02, 3.589e-02, -4.308e-02, -8.178e-02, 2.463e-01, 2.174e-01)); + r += mul(s0_6, M4(-2.118e-01, -1.159e-01, 1.469e-01, 1.273e-01, 3.896e-02, 2.342e-02, -6.598e-02, -7.138e-02, 8.046e-02, -9.429e-02, -2.509e-01, 5.849e-02, -1.988e-01, -6.292e-02, 2.115e-01, -2.360e-01)); + r += mul(s0_7, M4(9.683e-02, -6.480e-02, 1.769e-01, -8.659e-02, -2.455e-02, 5.751e-02, 1.021e-01, 7.640e-02, -1.255e-01, -1.125e-01, -1.075e-01, -1.787e-01, 4.571e-03, -1.284e-01, -7.242e-02, 5.501e-02)); + r += mul(s0_8, M4(2.078e-02, -8.726e-04, -4.439e-02, 1.042e-01, 2.962e-02, -7.772e-02, -1.045e-01, -7.690e-03, 9.935e-02, 2.160e-02, 9.949e-02, 4.120e-02, -9.711e-02, -6.273e-02, 1.308e-01, 1.546e-02)); + r += mul(s1_0, M4(6.029e-02, 4.278e-02, 5.769e-02, 1.442e-02, -1.756e-01, 4.015e-02, -7.010e-02, 1.137e-01, -2.495e-03, -6.332e-02, 1.721e-02, 1.212e-02, 6.808e-02, -8.886e-03, -2.085e-01, -4.819e-02)); + r += mul(s1_1, M4(6.642e-02, -4.447e-02, -2.059e-02, -7.015e-02, -7.824e-02, -1.525e-02, -9.670e-02, -2.820e-02, -8.941e-02, -3.547e-02, -1.716e-02, -3.731e-02, 3.170e-02, 4.354e-02, -6.386e-02, 9.780e-02)); + r += mul(s1_2, M4(-3.524e-02, 4.504e-02, 4.981e-02, 8.960e-02, -8.128e-02, -1.493e-01, 1.161e-01, 1.018e-01, -1.724e-03, 2.717e-02, -1.312e-01, -1.677e-02, 2.003e-02, 9.196e-03, 1.623e-01, 7.206e-02)); + r += mul(s1_3, M4(-3.745e-02, 2.151e-02, -6.851e-02, -6.277e-02, 3.111e-02, 4.912e-02, 2.569e-01, 5.158e-02, 6.237e-02, -8.986e-02, 5.848e-02, -6.014e-02, 1.487e-02, 4.474e-02, -2.111e-02, 3.169e-02)); + r += mul(s1_4, M4(8.277e-02, -2.327e-02, -1.339e-01, 6.819e-03, 6.774e-02, -1.567e-01, -3.982e-02, 1.687e-01, 5.872e-02, 1.736e-01, -1.741e-02, 1.435e-01, -1.060e-01, -5.864e-02, 1.010e-01, 3.586e-02)); + r += mul(s1_5, M4(-2.038e-01, -6.883e-03, -3.415e-03, -4.187e-02, -1.266e-01, 2.903e-01, -7.235e-02, 1.061e-01, -3.151e-02, -7.008e-04, -7.758e-02, 8.958e-02, -3.681e-02, -2.896e-03, -1.110e-01, 5.328e-02)); + r += mul(s1_6, M4(-1.477e-02, -6.669e-02, 3.919e-02, -4.940e-02, -1.115e-02, 1.150e-01, -2.095e-01, 4.050e-02, 8.635e-02, 1.358e-01, 8.773e-02, -8.047e-02, -2.117e-02, -7.302e-04, 4.855e-02, 5.096e-02)); + r += mul(s1_7, M4(4.030e-02, 5.739e-02, 3.768e-02, -9.838e-02, 3.036e-02, 1.810e-01, 4.812e-02, 1.165e-02, -1.139e-01, 5.497e-02, 1.245e-01, 2.073e-02, -8.034e-03, 2.284e-02, 1.594e-02, 3.528e-02)); + r += mul(s1_8, M4(2.289e-02, -8.156e-02, 5.705e-02, 1.072e-01, 1.589e-03, 3.123e-03, 2.118e-01, 1.151e-02, -2.937e-02, 9.989e-02, -5.238e-02, 1.003e-01, 4.185e-02, -8.527e-02, -6.298e-03, -6.371e-02)); + r += mul(s2_0, M4(1.107e-01, 2.752e-02, 1.281e-01, 1.714e-01, 1.164e-01, -7.284e-02, -1.190e-01, 8.111e-02, -8.035e-03, -6.762e-02, 1.776e-02, -1.030e-01, 2.693e-02, 5.256e-02, 1.354e-01, -2.064e-02)); + r += mul(s2_1, M4(-4.988e-03, -6.097e-02, -4.041e-02, -3.558e-02, -1.518e-01, 1.663e-03, -2.821e-02, -1.361e-02, 2.478e-02, 8.943e-02, -1.308e-01, -6.894e-02, -1.212e-01, 1.641e-02, 2.404e-01, 1.694e-01)); + r += mul(s2_2, M4(-7.777e-03, 5.803e-02, 2.689e-01, 1.791e-01, 6.316e-04, 4.763e-02, -9.638e-02, -3.617e-02, 5.087e-02, 4.604e-02, -7.884e-02, 3.332e-02, 6.054e-02, -1.208e-01, -3.011e-01, -1.355e-01)); + r += mul(s2_3, M4(-4.400e-02, 2.170e-01, 1.681e-01, 1.320e-01, -3.089e-02, -8.828e-02, 5.103e-02, -1.408e-01, -2.118e-01, 3.802e-02, 5.672e-02, -5.139e-03, -7.158e-02, 1.651e-01, -3.334e-01, 5.201e-02)); + r += mul(s2_4, M4(-7.727e-02, -9.328e-02, -1.671e-01, -6.937e-02, -1.072e-01, 8.187e-02, -6.199e-02, 8.513e-02, 3.583e-02, -4.073e-02, 2.146e-01, 7.136e-02, 2.726e-01, 1.700e-01, -1.868e-01, -1.756e-02)); + r += mul(s2_5, M4(-4.307e-02, -2.301e-02, 1.690e-01, -2.337e-01, -9.058e-02, -1.756e-02, 8.350e-03, -4.909e-02, -9.059e-02, -6.068e-02, 1.240e-02, -1.104e-01, -1.323e-01, 4.555e-02, 6.956e-02, -5.998e-02)); + r += mul(s2_6, M4(-1.516e-01, 1.953e-01, -7.080e-02, 9.881e-03, -9.600e-02, 8.595e-02, 1.051e-01, 3.365e-02, -9.591e-03, 8.353e-02, -1.220e-01, 9.008e-04, -1.879e-01, 3.896e-02, -6.064e-02, -1.157e-01)); + r += mul(s2_7, M4(-9.644e-02, -1.368e-01, 2.848e-02, 7.543e-02, -8.532e-02, -1.060e-01, -1.384e-02, -1.303e-01, 8.781e-03, -7.783e-02, -5.889e-02, 9.188e-02, -5.361e-02, -6.329e-02, -7.719e-02, 1.732e-01)); + r += mul(s2_8, M4(-4.416e-02, -1.316e-01, -1.092e-01, -6.056e-02, 2.408e-02, -7.075e-02, -1.626e-01, -4.830e-02, 4.568e-02, -8.975e-03, -3.471e-02, 4.751e-03, -9.605e-03, 1.540e-01, -2.195e-01, -1.289e-02)); + r += mul(s3_0, M4(6.641e-02, -6.722e-02, 4.204e-02, 2.671e-02, 1.593e-01, -8.964e-02, -1.204e-01, 1.247e-01, -2.959e-01, 2.200e-02, 2.822e-02, -1.165e-01, -1.091e-03, 5.943e-03, -1.847e-03, 2.274e-02)); + r += mul(s3_1, M4(-7.450e-02, -2.852e-02, 2.931e-02, -3.538e-02, -4.187e-02, 8.734e-03, 2.365e-01, -5.349e-02, 8.154e-03, -9.164e-02, -8.136e-02, -6.776e-02, -1.918e-01, -4.653e-02, 6.557e-02, 5.742e-02)); + r += mul(s3_2, M4(-4.312e-02, -4.438e-03, -1.442e-01, -2.492e-02, 2.585e-01, 3.696e-02, 1.406e-01, 1.574e-01, 8.978e-02, 9.296e-02, -6.429e-02, 3.938e-02, 1.450e-01, 3.289e-02, -8.818e-02, -4.964e-02)); + r += mul(s3_3, M4(5.244e-02, -1.366e-03, 3.703e-02, 2.949e-02, -9.850e-02, 1.177e-01, 4.466e-02, 1.044e-01, -8.709e-02, 9.429e-02, 1.804e-01, -1.564e-01, 1.509e-01, -7.775e-04, 2.783e-03, 1.885e-02)); + r += mul(s3_4, M4(2.353e-02, 8.922e-03, 2.605e-02, -1.310e-01, -5.740e-03, 9.074e-02, -1.173e-01, -5.668e-02, 1.622e-01, -4.949e-02, 1.809e-01, 4.451e-01, 4.553e-02, 6.796e-02, -1.264e-01, 8.167e-02)); + r += mul(s3_5, M4(-1.271e-02, 1.309e-02, 5.765e-02, -1.710e-01, 1.858e-01, 2.290e-01, -2.852e-01, -1.578e-01, 3.224e-02, -1.279e-01, 3.270e-03, -1.556e-01, 3.685e-03, 5.137e-02, 8.328e-02, 7.098e-02)); + r += mul(s3_6, M4(-2.447e-02, -4.218e-02, -1.423e-01, -8.276e-02, 2.283e-01, 1.799e-01, -2.549e-01, 9.259e-02, 2.579e-01, 4.986e-02, -5.594e-02, 3.486e-02, -2.440e-02, 7.812e-02, 8.794e-02, 1.029e-02)); + r += mul(s3_7, M4(5.380e-02, 1.180e-01, 1.594e-01, 7.409e-02, 7.728e-02, 3.271e-02, -6.874e-02, 2.154e-01, -3.518e-02, -1.103e-01, 9.688e-02, 9.100e-02, -6.668e-02, -7.959e-02, 1.811e-02, -1.359e-01)); + r += mul(s3_8, M4(9.416e-02, 3.417e-03, -5.169e-02, 1.764e-01, 2.548e-01, 1.715e-01, 2.134e-01, 2.238e-01, 1.845e-01, 1.622e-02, 4.207e-01, -3.196e-02, -9.406e-02, -2.390e-01, 2.510e-01, -2.296e-02)); + r += mul(s4_0, M4(1.006e-02, -1.331e-02, -7.423e-02, 1.326e-01, 1.829e-01, 2.875e-02, 2.266e-01, -2.989e-01, -5.792e-02, 3.672e-03, -2.179e-02, -1.589e-01, 7.813e-02, -1.747e-02, 8.522e-02, -5.229e-02)); + r += mul(s4_1, M4(-9.481e-02, 1.766e-02, -1.016e-01, 1.965e-02, 1.501e-01, -2.166e-01, 4.671e-01, 2.102e-01, 5.749e-02, -8.126e-02, 8.996e-02, 4.967e-02, -4.917e-02, -1.199e-01, -1.097e-01, 7.642e-02)); + r += mul(s4_2, M4(1.216e-01, -8.073e-03, 9.726e-03, 2.027e-02, -5.802e-02, 8.700e-02, 1.012e-01, 4.803e-02, 8.010e-02, -1.332e-02, 1.150e-01, 5.811e-04, -1.260e-01, 5.098e-02, 1.144e-02, 1.190e-01)); + r += mul(s4_3, M4(-3.559e-02, -1.380e-02, 4.833e-02, 1.924e-02, 2.151e-01, 3.367e-03, 2.616e-02, -1.804e-02, -1.903e-01, 2.271e-01, 7.762e-02, 2.965e-02, 3.447e-02, 5.939e-02, -1.552e-03, -5.304e-02)); + r += mul(s4_4, M4(5.806e-02, 6.617e-02, 6.822e-02, -3.996e-02, 1.884e-01, -1.212e-01, 4.396e-02, 1.790e-01, 9.638e-02, 3.977e-01, 4.136e-02, -2.153e-01, 1.812e-01, -1.566e-01, 1.537e-01, -1.567e-01)); + r += mul(s4_5, M4(-6.260e-02, -5.870e-02, 2.292e-02, -4.240e-02, 1.163e-01, -3.122e-02, -1.069e-01, 1.949e-01, -8.848e-02, 7.051e-02, 1.155e-01, 3.087e-03, -1.480e-01, -3.976e-02, 1.350e-01, -7.956e-02)); + r += mul(s4_6, M4(9.145e-02, -9.454e-02, -4.262e-02, 3.224e-02, 1.158e-01, 3.783e-02, -4.701e-02, -1.675e-01, 5.831e-02, -1.611e-01, -3.235e-02, -2.857e-02, -3.740e-02, -5.521e-02, 5.499e-03, 1.700e-01)); + r += mul(s4_7, M4(1.547e-01, -2.014e-02, 2.154e-02, -1.294e-01, -1.114e-02, 2.956e-02, 6.697e-02, -6.797e-02, 7.370e-02, -6.777e-02, 5.050e-02, -8.313e-02, -5.077e-02, -1.236e-01, 1.549e-01, 3.329e-02)); + r += mul(s4_8, M4(-7.738e-02, 7.239e-02, 6.842e-02, -2.829e-02, -9.568e-03, -8.991e-02, -8.371e-03, 1.752e-01, -1.749e-02, 8.862e-03, 5.179e-02, 1.371e-01, -8.463e-03, -2.560e-01, -6.020e-02, -9.990e-03)); + r += mul(s5_0, M4(3.632e-02, 8.914e-02, -8.888e-02, -1.491e-02, -1.101e-01, -3.298e-02, 1.195e-01, -1.208e-01, -1.501e-01, 1.288e-02, 1.467e-01, -1.018e-01, 1.483e-02, 5.684e-02, 1.103e-02, -7.856e-03)); + r += mul(s5_1, M4(-9.384e-02, 1.459e-01, -2.468e-01, 3.597e-01, 7.546e-02, -2.376e-02, 1.857e-01, 3.916e-02, 8.217e-02, -7.327e-02, -3.876e-02, 1.894e-01, 9.173e-03, -8.247e-02, -6.545e-03, 7.009e-02)); + r += mul(s5_2, M4(2.878e-01, -4.084e-02, 1.117e-01, 2.117e-01, 1.199e-01, 3.482e-02, 1.172e-01, -2.750e-02, 4.719e-02, 3.888e-02, -2.976e-02, -6.914e-02, -9.877e-02, -2.585e-02, 3.017e-02, -7.733e-03)); + r += mul(s5_3, M4(-1.588e-01, -3.354e-02, -3.294e-01, 6.194e-02, 8.878e-02, -8.921e-02, 2.573e-03, -4.779e-02, 4.467e-02, 2.385e-01, 7.285e-02, -7.890e-02, -1.010e-02, -3.659e-02, -7.703e-03, -2.427e-02)); + r += mul(s5_4, M4(-1.063e-01, -2.223e-01, 8.846e-02, -5.654e-02, -2.017e-01, 1.409e-02, -1.011e-01, 9.476e-02, 3.337e-02, 2.004e-01, -1.191e-01, -1.504e-01, 1.119e-01, 3.131e-02, -1.772e-01, -1.625e-01)); + r += mul(s5_5, M4(6.892e-02, 8.256e-02, -1.301e-01, -1.556e-01, 4.404e-02, 1.371e-01, -9.619e-03, 9.117e-02, -8.526e-02, 9.741e-02, -4.309e-02, 1.467e-02, -6.020e-02, -1.205e-01, 1.305e-03, 3.461e-02)); + r += mul(s5_6, M4(-9.202e-02, -8.236e-02, -5.605e-03, -1.625e-01, 3.579e-02, 7.673e-02, -8.021e-02, 9.903e-03, -4.991e-02, 2.040e-03, 1.293e-02, -7.739e-02, -4.150e-02, -3.881e-02, -6.908e-02, -8.282e-02)); + r += mul(s5_7, M4(-1.834e-01, 1.597e-02, 1.049e-01, -5.524e-03, -6.159e-02, -1.697e-02, 6.824e-02, -5.493e-02, 5.603e-02, -1.096e-01, 4.400e-02, 2.910e-02, 9.645e-02, -1.648e-02, 6.329e-02, 1.038e-01)); + r += mul(s5_8, M4(8.771e-02, 1.508e-01, 2.217e-01, 3.061e-02, -3.918e-02, 1.947e-02, 2.294e-02, 9.695e-02, 2.748e-03, -8.599e-02, 3.772e-02, 8.646e-02, 1.298e-01, 1.420e-02, 5.255e-02, -1.048e-01)); + r += mul(s6_0, M4(-4.407e-02, -2.682e-02, 4.526e-02, 2.739e-02, -1.935e-01, 7.011e-02, 9.171e-03, 4.940e-02, -1.467e-01, -3.275e-02, 6.104e-02, -6.878e-02, 1.220e-02, 9.451e-02, -1.911e-04, -5.313e-02)); + r += mul(s6_1, M4(-7.799e-02, 4.824e-02, -4.685e-02, 1.330e-01, 9.253e-02, 4.494e-02, -4.259e-02, -1.034e-02, 4.323e-02, 3.399e-02, -7.307e-02, -8.715e-02, 3.315e-02, 9.641e-02, -2.714e-02, 6.442e-02)); + r += mul(s6_2, M4(1.280e-01, -3.284e-02, -2.368e-02, -1.081e-01, -4.936e-02, 3.070e-02, -1.759e-02, -1.002e-01, -6.439e-02, -4.279e-02, 4.613e-02, -2.717e-01, -1.198e-01, 1.773e-02, -7.221e-03, -6.637e-02)); + r += mul(s6_3, M4(-7.689e-02, -3.825e-02, -7.242e-02, 8.280e-02, 4.194e-02, 1.121e-01, 2.622e-01, -1.725e-02, -1.986e-01, -1.177e-02, -5.650e-02, 8.646e-02, -4.196e-02, -2.977e-03, 2.090e-02, -6.451e-02)); + r += mul(s6_4, M4(1.851e-01, -1.181e-01, -2.515e-01, -9.251e-02, -6.227e-02, 6.769e-02, 2.017e-01, 1.323e-01, 5.400e-02, 6.620e-02, 1.503e-02, -7.147e-02, -1.018e-01, 4.994e-02, 8.060e-02, 8.856e-02)); + r += mul(s6_5, M4(5.242e-02, -8.571e-02, -1.166e-02, 2.723e-02, -2.491e-02, 9.272e-02, -7.715e-02, -1.098e-01, -8.076e-02, 6.484e-02, 5.065e-02, -1.996e-01, -6.703e-02, 7.041e-02, -1.129e-01, -4.052e-02)); + r += mul(s6_6, M4(1.693e-01, -5.234e-02, -2.291e-02, -1.243e-01, 6.377e-02, 7.930e-02, -4.347e-02, -3.595e-02, -1.106e-01, 6.135e-02, 4.739e-02, -1.549e-01, -3.269e-03, 6.855e-03, -1.141e-02, -5.771e-02)); + r += mul(s6_7, M4(-2.193e-02, 1.859e-01, 1.001e-01, 1.196e-01, 1.000e-01, -6.727e-02, -3.770e-02, 1.140e-01, 1.902e-01, -6.595e-03, -2.541e-01, -8.262e-02, 1.284e-01, -2.159e-01, 5.541e-03, -2.051e-02)); + r += mul(s6_8, M4(4.735e-02, 1.489e-01, 5.903e-02, 2.421e-02, -4.557e-02, -1.645e-02, 3.871e-02, 4.318e-02, 2.065e-01, 7.512e-03, -1.383e-01, -8.699e-02, 7.859e-03, -1.348e-01, 2.014e-02, -7.657e-02)); + r += mul(s7_0, M4(-3.504e-02, 4.054e-02, 1.591e-01, 1.507e-01, -6.738e-02, -6.840e-03, 1.195e-02, -1.019e-01, 2.478e-03, -3.514e-03, 2.032e-01, 9.057e-02, -1.931e-01, 1.626e-01, -1.275e-01, -2.999e-01)); + r += mul(s7_1, M4(-2.528e-01, 7.853e-02, 9.488e-02, 8.846e-02, 8.768e-02, 6.529e-02, -1.257e-02, 1.981e-02, 6.481e-02, -1.187e-02, 3.204e-02, 1.175e-02, -3.030e-01, -1.115e-01, -1.117e-01, -3.533e-01)); + r += mul(s7_2, M4(4.824e-02, 4.947e-02, 2.454e-01, -6.911e-02, 9.860e-02, 3.005e-02, 5.433e-04, -1.456e-03, 3.297e-02, 1.039e-01, 2.388e-01, 1.363e-01, 1.138e-01, 7.708e-02, -1.577e-01, -3.101e-01)); + r += mul(s7_3, M4(-5.749e-02, 4.330e-02, 2.857e-02, 1.032e-01, 1.035e-01, 1.604e-01, 1.927e-02, -1.796e-02, 3.267e-02, 3.284e-02, 5.265e-02, 1.932e-03, -3.115e-01, 5.623e-04, -7.705e-01, -2.119e-01)); + r += mul(s7_4, M4(2.663e-02, -1.189e-01, -2.258e-02, 2.241e-01, 5.599e-02, 8.080e-02, 2.917e-02, -1.648e-01, -1.288e-02, -8.442e-02, -1.462e-01, 1.041e-01, -7.283e-01, 1.270e-01, -7.735e-01, -1.935e-01)); + r += mul(s7_5, M4(-2.610e-01, -8.824e-03, 9.837e-02, -4.825e-02, 1.038e-01, 1.235e-02, -7.313e-02, -8.378e-03, -1.153e-01, 8.859e-02, 1.082e-01, 1.711e-02, -6.367e-01, -1.746e-01, -1.139e-01, -4.174e-01)); + r += mul(s7_6, M4(-4.065e-02, -1.208e-02, 2.632e-03, 6.209e-02, -4.002e-02, -3.493e-02, 4.478e-03, -3.306e-02, -6.063e-02, 1.362e-01, 4.370e-02, 2.847e-03, 2.528e-01, -1.677e-01, -8.459e-02, -3.713e-01)); + r += mul(s7_7, M4(-2.196e-01, 7.684e-02, -1.451e-01, -4.506e-02, -7.435e-02, -1.734e-01, 3.935e-02, 2.225e-02, -2.907e-02, -1.242e-01, -2.926e-02, -5.695e-02, 2.201e-01, 6.264e-02, -1.411e-01, -3.046e-01)); + r += mul(s7_8, M4(-1.804e-01, 9.045e-02, 9.856e-02, -9.440e-02, -2.864e-02, -5.568e-02, 1.081e-01, 6.273e-02, -9.816e-02, 5.960e-02, 4.801e-03, 2.349e-02, 3.701e-01, -1.769e-01, -1.709e-01, -5.965e-02)); + r += V4(2.457e-02, -1.213e-02, 5.035e-03, 4.694e-02); + return r; +} + +V4 f3(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(1.209e-02, 4.511e-02, -1.259e-01, 1.801e-02, -1.489e-01, -7.744e-02, -4.519e-02, -1.305e-01, -1.101e-01, 9.679e-02, -8.833e-02, 1.070e-03, 1.064e-01, -1.194e-01, 3.602e-01, 6.349e-02)); + r += mul(s0_1, M4(-4.945e-02, -2.867e-01, 1.859e-01, 5.646e-02, -8.603e-02, 8.764e-02, 4.271e-02, -5.464e-03, 1.297e-01, -9.843e-02, 4.122e-02, -9.408e-02, 6.374e-02, 5.450e-02, 4.749e-02, 1.137e-01)); + r += mul(s0_2, M4(2.290e-03, 8.589e-02, -1.364e-01, 2.320e-02, -5.637e-02, -5.776e-02, 4.048e-02, 4.646e-02, -2.496e-02, -4.359e-02, 4.649e-02, -4.578e-02, 1.724e-01, -4.250e-02, 9.008e-02, -2.097e-02)); + r += mul(s0_3, M4(1.328e-01, -5.113e-02, 9.661e-02, 3.584e-01, -1.447e-04, 6.085e-02, -2.173e-03, -4.150e-02, -2.510e-01, -2.243e-02, 1.615e-02, 1.553e-01, 3.936e-02, 5.902e-03, -3.577e-02, -8.622e-02)); + r += mul(s0_4, M4(1.282e-01, -3.511e-01, 3.612e-01, -3.413e-02, -1.100e-01, -1.439e-01, -9.836e-03, 1.909e-03, 1.541e-01, 1.199e-02, -3.416e-02, 7.726e-02, -1.726e-01, -2.366e-01, -1.770e-02, -1.034e-01)); + r += mul(s0_5, M4(-1.842e-01, 1.090e-01, 2.646e-02, 2.030e-01, 9.180e-02, -2.091e-01, -6.783e-02, 8.176e-02, 5.056e-02, 9.988e-02, -6.093e-03, 7.029e-02, 1.497e-01, -1.331e-01, 1.205e-01, 1.406e-01)); + r += mul(s0_6, M4(1.557e-01, -8.295e-02, -7.064e-02, 6.583e-02, 5.184e-02, -4.663e-02, -3.992e-02, -8.000e-02, -2.593e-02, -6.642e-02, 2.625e-02, 1.322e-02, 1.973e-01, 1.182e-01, 1.352e-02, -6.801e-02)); + r += mul(s0_7, M4(-1.737e-01, -2.135e-01, 6.720e-02, -3.688e-01, 1.874e-01, 6.782e-02, -1.867e-02, 6.146e-02, 1.519e-01, 2.078e-01, -9.241e-02, -1.143e-01, 1.275e-01, -2.259e-04, 1.173e-01, 3.520e-02)); + r += mul(s0_8, M4(1.675e-01, -1.018e-01, 7.274e-02, 2.925e-01, -5.030e-02, 5.771e-02, 2.714e-02, -3.318e-02, 4.824e-02, -9.005e-02, 5.480e-03, -5.039e-02, 1.241e-03, 1.391e-01, 7.588e-02, 2.549e-03)); + r += mul(s1_0, M4(-1.242e-01, -2.302e-02, 2.898e-02, -1.824e-02, -2.151e-01, 1.024e-01, 1.221e-01, -1.509e-01, -2.634e-02, 2.601e-02, -1.735e-01, -5.896e-02, -6.527e-02, -5.204e-03, -4.855e-02, -6.708e-02)); + r += mul(s1_1, M4(7.801e-03, 3.848e-02, 1.033e-02, -1.174e-02, -1.183e-02, 1.345e-01, 4.000e-01, 1.013e-02, 1.159e-01, 4.982e-02, 7.533e-03, -1.085e-03, -5.009e-03, 6.178e-03, 3.397e-02, 3.831e-02)); + r += mul(s1_2, M4(-4.237e-02, 1.380e-01, 7.769e-02, -1.055e-01, -2.220e-01, -7.308e-02, -2.130e-01, -2.470e-02, 1.043e-01, 6.163e-02, 3.809e-02, -4.389e-02, -4.513e-02, -1.382e-01, 1.205e-01, -6.402e-02)); + r += mul(s1_3, M4(1.881e-01, -1.599e-01, -5.364e-02, -8.743e-02, -1.890e-01, 1.899e-02, -9.322e-02, 1.086e-01, -4.464e-02, -1.280e-01, 3.037e-01, -9.327e-02, -1.184e-02, 5.401e-02, -3.374e-02, 4.372e-02)); + r += mul(s1_4, M4(1.199e-01, -5.957e-02, -9.253e-03, 1.498e-01, -1.688e-01, -5.394e-02, -2.666e-02, -5.413e-02, -9.928e-02, -1.324e-02, 2.534e-01, -6.590e-02, -5.032e-02, -8.629e-02, -1.970e-03, -6.077e-02)); + r += mul(s1_5, M4(-6.083e-03, 7.846e-02, -6.000e-02, 4.341e-02, -5.467e-03, 4.813e-02, -2.310e-02, 3.208e-02, -6.983e-02, -7.852e-02, -1.998e-02, 2.221e-02, 1.777e-01, -8.882e-03, -2.707e-02, 1.037e-01)); + r += mul(s1_6, M4(-3.420e-02, 1.844e-02, 3.980e-02, -1.475e-01, 7.866e-02, -6.863e-02, 1.889e-02, -3.398e-03, 3.107e-02, -1.148e-01, -5.329e-02, -1.722e-02, 2.352e-02, 1.929e-01, 7.786e-03, -9.830e-03)); + r += mul(s1_7, M4(-2.781e-02, 6.691e-02, -9.545e-02, 4.231e-02, -9.000e-02, 1.266e-01, 4.665e-02, 2.711e-02, -6.153e-02, 9.310e-02, 4.351e-02, 9.940e-02, 1.262e-01, 3.219e-02, -6.487e-02, -5.552e-02)); + r += mul(s1_8, M4(-8.366e-02, -2.192e-02, 4.450e-02, 2.514e-02, 8.095e-02, 1.241e-01, 5.547e-02, -1.171e-01, 6.950e-02, -4.450e-02, -1.699e-03, 1.040e-01, -4.120e-02, -7.339e-02, -3.509e-02, 3.632e-02)); + r += mul(s2_0, M4(-1.192e-01, -4.334e-02, -8.963e-02, 3.132e-02, -8.887e-02, -2.458e-02, -3.446e-02, 2.002e-01, -4.401e-02, -4.960e-02, -7.173e-02, 3.750e-02, -4.877e-02, 1.376e-01, -1.326e-01, -1.893e-01)); + r += mul(s2_1, M4(-3.186e-01, -1.066e-01, -1.339e-02, 1.365e-01, -8.995e-02, 3.117e-02, 1.870e-02, 1.136e-02, 1.429e-01, 1.345e-01, -2.291e-02, 9.036e-02, 5.507e-02, -3.593e-04, 8.528e-03, -4.938e-02)); + r += mul(s2_2, M4(4.532e-02, -9.502e-02, -3.770e-02, 5.776e-02, -1.369e-01, -1.988e-01, -3.887e-02, 1.325e-01, 6.813e-02, -4.984e-02, -1.904e-01, -2.815e-02, 1.425e-01, 7.566e-02, 3.262e-03, -2.347e-01)); + r += mul(s2_3, M4(-7.322e-02, -1.502e-01, 6.263e-02, -2.979e-01, -5.895e-02, 4.781e-02, 4.113e-02, -2.937e-02, 2.070e-02, 5.476e-02, 9.087e-02, -8.571e-02, 7.881e-02, 1.784e-01, 1.621e-01, -9.743e-02)); + r += mul(s2_4, M4(-1.010e-01, 2.538e-01, -2.909e-02, -5.773e-03, -9.496e-02, -4.057e-02, -1.766e-02, 4.822e-02, -2.439e-02, -2.124e-02, 2.763e-02, -1.495e-01, 1.182e-01, -5.139e-02, 2.486e-01, -1.643e-01)); + r += mul(s2_5, M4(9.509e-02, -1.751e-02, 1.060e-01, 8.923e-03, 4.730e-02, -5.171e-03, 5.679e-02, 4.725e-02, -5.932e-02, -1.748e-02, 9.510e-02, 2.206e-02, 1.533e-01, 6.775e-02, 1.194e-01, 1.154e-02)); + r += mul(s2_6, M4(2.332e-01, 3.231e-01, -1.061e-01, -4.654e-02, 6.794e-02, 1.202e-01, 9.481e-02, 1.935e-02, -9.529e-02, -1.021e-02, -6.697e-02, 7.863e-02, 2.771e-02, 2.880e-01, -2.041e-01, 2.709e-01)); + r += mul(s2_7, M4(1.713e-01, 2.813e-01, -2.426e-01, 2.852e-02, 8.356e-02, -7.763e-02, -1.161e-01, 8.172e-02, 5.172e-03, 6.301e-02, 8.229e-02, -1.098e-01, -2.023e-01, -2.939e-01, -1.067e-03, 1.228e-01)); + r += mul(s2_8, M4(1.953e-01, 2.606e-01, -1.670e-01, 1.798e-01, 5.119e-02, -6.810e-02, -1.451e-02, -1.260e-01, 2.329e-01, -1.182e-01, 2.804e-02, 1.311e-01, 1.462e-01, -1.083e-01, -4.603e-02, 1.439e-01)); + r += mul(s3_0, M4(-9.441e-02, -3.264e-02, 1.507e-01, 1.408e-02, 3.475e-02, -4.064e-02, -1.473e-01, -1.309e-01, -7.233e-02, 2.080e-01, -1.367e-02, -1.229e-01, 3.507e-02, -8.483e-02, 2.097e-03, -7.173e-02)); + r += mul(s3_1, M4(4.412e-02, -5.134e-02, -1.370e-02, -4.422e-03, 1.779e-01, 2.364e-01, -2.182e-01, -1.791e-01, -7.399e-02, -5.241e-01, 6.908e-02, 1.578e-01, 3.525e-03, 2.769e-02, 3.628e-02, -1.244e-01)); + r += mul(s3_2, M4(1.648e-01, 9.574e-02, -6.849e-02, -3.637e-02, 5.263e-02, 9.854e-02, 6.326e-02, 4.128e-02, 1.046e-01, 8.906e-02, -2.206e-01, 8.683e-03, -2.032e-02, -1.181e-02, 5.512e-02, -1.051e-01)); + r += mul(s3_3, M4(-2.212e-01, 5.570e-02, -1.141e-01, -1.006e-01, -7.169e-04, 3.264e-01, -1.139e-01, -2.577e-01, -8.693e-02, 1.239e-01, 1.803e-01, 1.125e-01, 1.068e-02, -2.922e-02, 3.197e-02, 1.931e-03)); + r += mul(s3_4, M4(-4.622e-02, 3.270e-02, 1.921e-01, -2.309e-02, -1.523e-01, 1.259e-01, -3.838e-01, 1.271e-01, -2.085e-01, -4.757e-01, -1.196e-01, -1.820e-01, 4.175e-02, -2.550e-02, -5.265e-02, -1.096e-02)); + r += mul(s3_5, M4(-8.994e-03, -1.081e-01, 1.343e-02, -5.891e-02, -2.103e-01, 1.690e-01, -1.553e-01, -1.295e-01, -6.184e-02, 3.514e-01, -7.091e-02, 2.888e-01, 4.795e-02, -6.023e-04, 6.025e-03, 2.650e-02)); + r += mul(s3_6, M4(2.547e-02, 2.874e-02, -1.511e-01, -5.070e-02, 3.203e-02, -4.604e-02, 2.209e-02, -1.229e-01, -1.056e-02, -1.707e-01, -7.084e-02, 5.550e-02, 1.163e-02, -4.525e-02, -3.029e-02, 8.571e-02)); + r += mul(s3_7, M4(-2.294e-02, -1.865e-02, 2.194e-02, 1.160e-01, -2.235e-01, -5.123e-02, 5.762e-02, 2.479e-01, -1.523e-01, -1.528e-01, 5.740e-02, -1.966e-02, -2.238e-02, 1.913e-01, -5.490e-02, -2.322e-02)); + r += mul(s3_8, M4(5.871e-02, 2.765e-02, 4.142e-02, 3.517e-02, -8.669e-02, 3.216e-01, -1.062e-01, -4.092e-01, 2.025e-01, 2.163e-01, -3.333e-02, 3.378e-01, 4.835e-02, -3.763e-02, -3.008e-02, 1.014e-01)); + r += mul(s4_0, M4(-9.938e-02, 5.662e-02, 1.075e-01, 3.380e-02, 4.261e-01, -7.606e-03, -2.433e-02, 5.942e-02, 1.104e-01, 4.452e-02, 1.949e-01, -5.846e-02, -2.881e-02, -3.737e-03, -7.296e-02, 2.033e-02)); + r += mul(s4_1, M4(-5.953e-02, -1.803e-01, 3.228e-02, -7.362e-02, 1.650e-01, -1.759e-01, 7.852e-02, 7.242e-02, -1.063e-01, 8.676e-02, 2.192e-01, 2.149e-02, 7.670e-02, 6.286e-02, -1.718e-01, 3.052e-02)); + r += mul(s4_2, M4(2.066e-02, -3.229e-02, -1.272e-02, 3.003e-03, 3.458e-01, -3.572e-01, -4.341e-02, 2.942e-02, -1.202e-01, -5.292e-02, 3.636e-02, -2.075e-02, 3.415e-02, 1.072e-01, 3.300e-03, 2.872e-01)); + r += mul(s4_3, M4(3.300e-02, 1.055e-01, -1.042e-01, 6.901e-03, 2.957e-01, 2.021e-01, -2.375e-02, 5.408e-02, -9.200e-02, 8.006e-02, -1.759e-01, -5.489e-02, -1.236e-01, 2.300e-02, 1.019e-01, 9.595e-02)); + r += mul(s4_4, M4(-1.879e-02, -3.074e-02, 1.715e-02, 1.419e-01, 3.305e-01, -2.458e-02, -1.699e-01, -1.895e-02, -2.189e-01, 2.476e-01, -8.551e-03, 1.496e-01, 4.431e-02, -1.024e-01, -3.112e-02, -4.159e-02)); + r += mul(s4_5, M4(1.866e-01, -4.232e-02, 6.446e-02, -1.000e-01, -3.971e-03, -2.469e-01, -1.169e-01, -8.591e-02, 3.592e-02, -1.996e-02, -3.942e-02, 7.812e-02, -1.576e-01, 9.317e-02, 6.869e-02, 2.633e-01)); + r += mul(s4_6, M4(4.973e-02, 5.596e-02, -2.942e-02, 3.945e-02, 1.295e-01, 5.590e-02, -6.419e-02, 9.570e-02, -3.299e-02, 1.413e-01, 1.897e-02, 1.479e-03, 1.753e-01, -4.112e-02, 4.182e-02, -2.565e-04)); + r += mul(s4_7, M4(-1.027e-02, -3.947e-02, -2.293e-02, -1.055e-02, 4.375e-03, 2.412e-01, -1.684e-01, 1.426e-01, -4.759e-02, 4.362e-02, -2.873e-02, -1.426e-01, 1.059e-01, -7.505e-02, 5.282e-02, -4.923e-02)); + r += mul(s4_8, M4(1.793e-02, 9.091e-02, -1.470e-02, -9.641e-02, 1.120e-01, -3.178e-02, -5.480e-02, -1.602e-01, -3.819e-02, 1.581e-02, 4.480e-02, 1.712e-01, -4.538e-02, 1.732e-01, 1.257e-01, 2.426e-01)); + r += mul(s5_0, M4(1.128e-01, 5.831e-02, -4.761e-02, 2.190e-01, 1.296e-02, 4.718e-02, -7.204e-03, -7.652e-02, 5.361e-02, 1.115e-01, 2.294e-01, 6.526e-02, -9.302e-02, -6.147e-02, -1.335e-01, 4.724e-02)); + r += mul(s5_1, M4(-3.076e-02, -5.031e-03, -2.038e-02, 3.392e-02, 3.513e-02, 1.646e-02, 1.014e-01, 1.512e-03, 1.196e-01, -2.991e-03, 1.386e-01, 2.146e-01, 2.277e-02, -5.620e-02, -2.236e-01, 1.751e-01)); + r += mul(s5_2, M4(1.017e-01, 2.476e-01, -2.771e-02, 6.961e-02, -3.064e-02, -6.149e-02, 7.209e-02, -3.906e-02, -1.153e-01, 6.624e-03, 6.405e-02, 4.708e-02, 1.956e-01, -8.011e-02, -1.242e-01, 1.444e-02)); + r += mul(s5_3, M4(1.568e-01, 5.347e-02, -5.782e-02, -6.519e-02, -8.024e-02, 3.140e-02, -1.768e-01, 8.107e-02, -1.213e-01, -5.629e-02, -2.261e-01, 5.272e-02, -1.467e-01, -1.843e-02, 5.187e-02, -1.378e-01)); + r += mul(s5_4, M4(-1.650e-01, -3.911e-01, 4.699e-03, 2.402e-01, -4.692e-02, 6.856e-03, 2.062e-02, -2.151e-01, -1.859e-01, -1.778e-02, 3.559e-02, 1.345e-01, -6.697e-02, -2.813e-02, 6.408e-02, 1.028e-01)); + r += mul(s5_5, M4(-1.920e-02, -9.734e-02, -6.633e-02, -1.076e-01, -1.382e-01, -3.244e-02, -1.126e-01, -2.778e-03, 5.546e-02, 5.411e-02, -1.391e-02, 1.117e-01, -8.756e-02, 9.652e-02, -3.436e-02, -1.543e-01)); + r += mul(s5_6, M4(-8.966e-02, -4.120e-02, -8.011e-02, -1.364e-01, 5.269e-02, -2.837e-02, 1.709e-02, 2.249e-02, 9.687e-03, -1.441e-01, -1.440e-02, 5.554e-02, -2.181e-01, -2.442e-02, 5.119e-02, -1.257e-01)); + r += mul(s5_7, M4(2.125e-01, 6.544e-02, -3.881e-02, 2.105e-01, -2.400e-02, 3.021e-02, -2.993e-02, 1.163e-01, -9.385e-02, -2.801e-02, 1.703e-02, 7.201e-03, -3.281e-02, 1.150e-01, -3.042e-03, 7.310e-02)); + r += mul(s5_8, M4(-1.190e-01, 5.190e-03, 1.481e-01, -7.708e-02, 9.729e-02, 1.799e-01, 2.982e-02, 2.960e-02, 1.851e-02, 7.781e-02, 2.263e-02, -2.539e-02, 7.774e-03, 1.886e-02, 1.686e-02, -1.899e-01)); + r += mul(s6_0, M4(2.732e-02, -8.044e-02, 5.805e-02, 7.451e-02, 6.343e-02, -7.971e-02, 6.930e-02, 1.125e-01, -6.981e-02, 5.407e-02, 8.634e-02, 1.879e-01, -6.081e-02, -1.187e-01, 4.764e-02, 4.740e-02)); + r += mul(s6_1, M4(-5.672e-02, 2.655e-02, 2.719e-03, 9.895e-02, -7.568e-02, 5.300e-02, -5.080e-02, 1.155e-01, -1.366e-02, -1.794e-01, -9.348e-02, -6.803e-02, 1.234e-02, -2.631e-02, 1.041e-01, 1.539e-03)); + r += mul(s6_2, M4(-8.914e-02, 9.367e-02, -8.082e-03, -5.017e-02, 6.531e-03, 9.440e-02, -9.546e-02, -2.078e-01, 6.303e-02, -7.267e-02, -6.052e-02, 3.390e-02, 1.199e-02, 1.099e-01, 5.302e-02, -3.439e-02)); + r += mul(s6_3, M4(-1.370e-03, -1.555e-01, 4.913e-02, -6.440e-02, -1.153e-01, -1.462e-01, -3.976e-02, -1.655e-01, -7.278e-02, 1.135e-01, -1.266e-02, -8.936e-02, -1.615e-02, -4.130e-03, 3.085e-02, -5.194e-02)); + r += mul(s6_4, M4(-4.025e-02, 1.696e-01, 1.808e-02, -1.851e-01, 4.826e-02, -1.989e-01, -1.621e-02, 3.878e-02, 2.924e-02, 1.500e-01, 7.301e-02, 1.156e-01, 8.438e-02, -2.838e-02, -2.140e-02, -7.899e-02)); + r += mul(s6_5, M4(-5.516e-03, -3.767e-02, -1.080e-02, 2.163e-02, -1.908e-01, -1.105e-01, -4.079e-03, -2.976e-01, -2.688e-02, 1.270e-01, 1.558e-01, 1.177e-01, -7.772e-02, -9.525e-02, -4.954e-02, -1.848e-01)); + r += mul(s6_6, M4(1.304e-01, -5.792e-02, -8.074e-03, 1.746e-02, -1.216e-01, 5.129e-02, -6.421e-02, 7.717e-02, 2.829e-02, -5.381e-03, 3.045e-03, 2.908e-02, -4.127e-02, -1.850e-02, -6.188e-02, 4.142e-02)); + r += mul(s6_7, M4(5.040e-02, -7.565e-02, -6.751e-02, -1.051e-01, 7.771e-02, -3.772e-02, -2.842e-02, 7.751e-02, -1.013e-01, 1.450e-01, -3.471e-02, 1.379e-02, 2.554e-02, 3.765e-03, -3.954e-02, 3.068e-02)); + r += mul(s6_8, M4(3.067e-03, -1.769e-01, 6.014e-02, 1.301e-01, 3.985e-02, 2.602e-01, 3.536e-03, 2.116e-01, -8.207e-02, -6.224e-03, -5.648e-02, -9.683e-02, 2.825e-02, 2.959e-02, -8.088e-02, 6.939e-02)); + r += mul(s7_0, M4(1.006e-02, 2.047e-01, -2.866e-02, -8.099e-02, 1.373e-01, 1.434e-01, 1.495e-01, -8.041e-02, 7.476e-02, 5.637e-02, 5.705e-02, -1.046e-01, -1.410e-01, 2.264e-01, 1.041e-02, -9.869e-02)); + r += mul(s7_1, M4(5.110e-02, 5.172e-02, -5.743e-02, 8.524e-02, 1.275e-01, 1.149e-02, 5.671e-02, 4.428e-02, 2.453e-01, -2.659e-01, -2.023e-02, 7.128e-02, 2.033e-02, 1.359e-01, 1.923e-01, 2.281e-02)); + r += mul(s7_2, M4(-2.172e-01, 1.265e-01, -9.141e-02, 8.283e-02, 1.425e-01, 3.770e-02, 2.065e-02, -1.220e-01, -2.166e-02, -1.593e-01, -1.264e-01, -1.340e-01, -3.660e-01, -1.286e-02, 3.190e-02, 1.368e-01)); + r += mul(s7_3, M4(6.927e-02, -1.486e-01, 2.885e-02, 9.393e-02, -5.625e-02, -1.521e-01, -7.625e-02, 1.589e-01, -2.040e-03, -1.351e-01, -8.796e-02, 5.367e-03, 5.634e-02, -3.133e-01, 9.720e-02, 2.741e-01)); + r += mul(s7_4, M4(7.587e-02, -5.238e-02, 1.154e-01, 2.532e-02, 2.177e-02, 2.078e-01, -1.090e-01, 9.705e-03, 2.140e-01, -2.165e-01, 3.438e-02, -2.241e-02, 1.044e-01, -2.104e-01, -3.646e-01, 4.702e-01)); + r += mul(s7_5, M4(-7.825e-02, 5.564e-03, -4.894e-02, 3.624e-01, 5.070e-02, 5.833e-02, -6.385e-02, 8.356e-02, 1.689e-01, 7.976e-03, -4.881e-02, -4.230e-02, -6.128e-01, -1.089e-01, -4.774e-01, -1.708e-01)); + r += mul(s7_6, M4(1.434e-02, 1.574e-01, -9.762e-03, 7.883e-03, -7.872e-02, -4.435e-02, 7.324e-02, 1.883e-02, -3.976e-02, -1.412e-02, -3.203e-02, 4.119e-02, -2.741e-01, -1.385e-01, 3.347e-02, -2.693e-01)); + r += mul(s7_7, M4(9.450e-02, 9.057e-02, -1.375e-01, 2.256e-01, -5.546e-02, 2.531e-02, -3.054e-02, -1.491e-02, -2.629e-03, 2.303e-03, 8.818e-03, -1.034e-01, 2.138e-01, 6.280e-01, 1.307e-02, -2.183e-01)); + r += mul(s7_8, M4(-1.732e-02, 2.528e-01, -1.357e-01, 9.682e-02, 1.232e-01, -4.775e-02, -3.421e-02, 1.176e-02, -7.255e-03, -8.638e-02, -6.195e-02, 1.069e-02, -2.368e-01, 3.942e-01, -1.728e-01, -2.484e-01)); + r += V4(-2.040e-02, 5.008e-03, 2.850e-02, 3.035e-02); + return r; +} + +void Pass3(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = Rmp8x8(tid.x) + blockStart; + uint2 size = GetInputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = (gxy + 0.5) * pt; + + V4 s0_0 = l0(-1.0, -1.0); + V4 s0_1 = l0(0.0, -1.0); + V4 s0_2 = l0(1.0, -1.0); + V4 s0_3 = l0(-1.0, 0.0); + V4 s0_4 = l0(0.0, 0.0); + V4 s0_5 = l0(1.0, 0.0); + V4 s0_6 = l0(-1.0, 1.0); + V4 s0_7 = l0(0.0, 1.0); + V4 s0_8 = l0(1.0, 1.0); + V4 s1_0 = -max(-s0_0, 0.0); + V4 s1_1 = -max(-s0_1, 0.0); + V4 s1_2 = -max(-s0_2, 0.0); + V4 s1_3 = -max(-s0_3, 0.0); + V4 s1_4 = -max(-s0_4, 0.0); + V4 s1_5 = -max(-s0_5, 0.0); + V4 s1_6 = -max(-s0_6, 0.0); + V4 s1_7 = -max(-s0_7, 0.0); + V4 s1_8 = -max(-s0_8, 0.0); + s0_0 = max(s0_0, 0.0); + s0_1 = max(s0_1, 0.0); + s0_2 = max(s0_2, 0.0); + s0_3 = max(s0_3, 0.0); + s0_4 = max(s0_4, 0.0); + s0_5 = max(s0_5, 0.0); + s0_6 = max(s0_6, 0.0); + s0_7 = max(s0_7, 0.0); + s0_8 = max(s0_8, 0.0); + + V4 s2_0 = l1(-1.0, -1.0); + V4 s2_1 = l1(0.0, -1.0); + V4 s2_2 = l1(1.0, -1.0); + V4 s2_3 = l1(-1.0, 0.0); + V4 s2_4 = l1(0.0, 0.0); + V4 s2_5 = l1(1.0, 0.0); + V4 s2_6 = l1(-1.0, 1.0); + V4 s2_7 = l1(0.0, 1.0); + V4 s2_8 = l1(1.0, 1.0); + V4 s3_0 = -max(-s2_0, 0.0); + V4 s3_1 = -max(-s2_1, 0.0); + V4 s3_2 = -max(-s2_2, 0.0); + V4 s3_3 = -max(-s2_3, 0.0); + V4 s3_4 = -max(-s2_4, 0.0); + V4 s3_5 = -max(-s2_5, 0.0); + V4 s3_6 = -max(-s2_6, 0.0); + V4 s3_7 = -max(-s2_7, 0.0); + V4 s3_8 = -max(-s2_8, 0.0); + s2_0 = max(s2_0, 0.0); + s2_1 = max(s2_1, 0.0); + s2_2 = max(s2_2, 0.0); + s2_3 = max(s2_3, 0.0); + s2_4 = max(s2_4, 0.0); + s2_5 = max(s2_5, 0.0); + s2_6 = max(s2_6, 0.0); + s2_7 = max(s2_7, 0.0); + s2_8 = max(s2_8, 0.0); + + V4 s4_0 = l2(-1.0, -1.0); + V4 s4_1 = l2(0.0, -1.0); + V4 s4_2 = l2(1.0, -1.0); + V4 s4_3 = l2(-1.0, 0.0); + V4 s4_4 = l2(0.0, 0.0); + V4 s4_5 = l2(1.0, 0.0); + V4 s4_6 = l2(-1.0, 1.0); + V4 s4_7 = l2(0.0, 1.0); + V4 s4_8 = l2(1.0, 1.0); + V4 s5_0 = -max(-s4_0, 0.0); + V4 s5_1 = -max(-s4_1, 0.0); + V4 s5_2 = -max(-s4_2, 0.0); + V4 s5_3 = -max(-s4_3, 0.0); + V4 s5_4 = -max(-s4_4, 0.0); + V4 s5_5 = -max(-s4_5, 0.0); + V4 s5_6 = -max(-s4_6, 0.0); + V4 s5_7 = -max(-s4_7, 0.0); + V4 s5_8 = -max(-s4_8, 0.0); + s4_0 = max(s4_0, 0.0); + s4_1 = max(s4_1, 0.0); + s4_2 = max(s4_2, 0.0); + s4_3 = max(s4_3, 0.0); + s4_4 = max(s4_4, 0.0); + s4_5 = max(s4_5, 0.0); + s4_6 = max(s4_6, 0.0); + s4_7 = max(s4_7, 0.0); + s4_8 = max(s4_8, 0.0); + + V4 s6_0 = l3(-1.0, -1.0); + V4 s6_1 = l3(0.0, -1.0); + V4 s6_2 = l3(1.0, -1.0); + V4 s6_3 = l3(-1.0, 0.0); + V4 s6_4 = l3(0.0, 0.0); + V4 s6_5 = l3(1.0, 0.0); + V4 s6_6 = l3(-1.0, 1.0); + V4 s6_7 = l3(0.0, 1.0); + V4 s6_8 = l3(1.0, 1.0); + V4 s7_0 = -max(-s6_0, 0.0); + V4 s7_1 = -max(-s6_1, 0.0); + V4 s7_2 = -max(-s6_2, 0.0); + V4 s7_3 = -max(-s6_3, 0.0); + V4 s7_4 = -max(-s6_4, 0.0); + V4 s7_5 = -max(-s6_5, 0.0); + V4 s7_6 = -max(-s6_6, 0.0); + V4 s7_7 = -max(-s6_7, 0.0); + V4 s7_8 = -max(-s6_8, 0.0); + s6_0 = max(s6_0, 0.0); + s6_1 = max(s6_1, 0.0); + s6_2 = max(s6_2, 0.0); + s6_3 = max(s6_3, 0.0); + s6_4 = max(s6_4, 0.0); + s6_5 = max(s6_5, 0.0); + s6_6 = max(s6_6, 0.0); + s6_7 = max(s6_7, 0.0); + s6_8 = max(s6_8, 0.0); + + t0[gxy] = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t1[gxy] = f1(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t2[gxy] = f2(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t3[gxy] = f3(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); +} + +//!PASS 4 +//!DESC conv3 +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 +//!IN t0, t1, t2, t3 +//!OUT t4, t5, t6, t7 + +#define l0(x, y) V4(O(t0, float2(x, y))) +#define l1(x, y) V4(O(t1, float2(x, y))) +#define l2(x, y) V4(O(t2, float2(x, y))) +#define l3(x, y) V4(O(t3, float2(x, y))) + +V4 f0(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(5.544e-02, -5.758e-03, 2.108e-02, 4.552e-02, -1.077e-01, -7.150e-02, 2.178e-01, -7.830e-02, -2.320e-02, 4.724e-02, -8.105e-02, -6.811e-02, 1.483e-01, -1.327e-02, 1.257e-01, -1.698e-01)); + r += mul(s0_1, M4(2.066e-02, 1.023e-01, -1.745e-02, -2.050e-02, 1.418e-01, 3.869e-02, -4.629e-02, 3.321e-01, -1.605e-02, 2.144e-02, -2.054e-02, -5.619e-02, 2.438e-01, 1.045e-01, -1.384e-01, 2.647e-01)); + r += mul(s0_2, M4(7.674e-03, 7.657e-02, -9.888e-03, -1.328e-01, -3.430e-01, -1.643e+00, 5.308e-01, 8.012e-01, 4.700e-02, -1.216e-01, 1.025e-01, 5.615e-02, -1.697e-03, 1.288e-01, -1.155e-01, 2.061e-01)); + r += mul(s0_3, M4(-1.864e-02, -7.868e-02, 1.318e-01, 2.944e-02, 1.153e-01, -2.453e-02, 3.245e-01, -8.511e-03, 8.246e-02, 9.155e-02, -2.596e-01, -4.688e-02, -5.379e-02, 1.681e-02, -4.082e-02, 2.190e-02)); + r += mul(s0_4, M4(6.601e-02, -7.595e-02, 2.497e-02, 6.535e-02, -5.133e-01, -1.201e-01, -4.400e-01, -4.921e-02, 1.192e-01, 6.046e-02, 2.065e-01, 4.049e-03, 1.598e-01, -2.106e-03, -1.876e-02, -1.145e-01)); + r += mul(s0_5, M4(1.073e-01, 1.299e-01, -3.370e-02, -8.442e-02, -1.831e-01, 6.161e-02, -2.270e-01, -3.732e-02, 9.468e-02, -1.475e-01, 4.612e-02, -6.901e-02, -1.292e-01, 1.520e-01, -4.510e-02, -3.038e-01)); + r += mul(s0_6, M4(-1.179e-02, 9.368e-03, -2.160e-02, 2.662e-02, -7.871e-02, -8.766e-02, -3.862e-02, -9.715e-02, -5.973e-02, 5.893e-02, -1.214e-02, -9.276e-02, -3.892e-03, 6.275e-02, -1.077e-01, 3.067e-01)); + r += mul(s0_7, M4(1.529e-02, -5.643e-02, -9.501e-02, 1.355e-01, 8.102e-02, -8.228e-02, -1.104e-01, -2.338e-01, -1.540e-02, 1.110e-02, 2.905e-02, -3.618e-02, 1.395e-01, -2.328e-01, -6.577e-02, 3.591e-02)); + r += mul(s0_8, M4(-5.025e-02, -2.154e-02, -1.012e-01, 1.160e-01, 2.285e-01, 1.782e-01, 4.228e-03, -1.791e-01, -2.313e-01, -1.870e-02, 1.116e-02, 9.506e-02, -4.598e-02, 6.144e-02, -6.470e-02, -9.153e-03)); + r += mul(s1_0, M4(3.908e-02, 6.316e-03, -1.158e-01, -1.560e-01, -5.848e-02, 8.426e-02, 6.576e-02, -5.478e-02, -8.282e-02, -1.216e-01, -9.145e-02, 5.931e-01, -5.063e-02, 9.802e-02, -6.655e-02, -1.409e-01)); + r += mul(s1_1, M4(-1.087e-01, 2.195e-01, -6.529e-03, -9.650e-02, 1.615e-01, 1.374e-03, 1.127e-02, 2.669e-02, -2.843e-02, 1.035e-01, 1.358e-01, 5.600e-01, -8.128e-02, 1.057e-01, -2.377e-03, 9.913e-02)); + r += mul(s1_2, M4(-3.318e-01, -3.460e-01, 2.275e-01, -8.662e-03, 9.161e-02, -8.165e-02, 1.890e-02, 5.559e-03, -2.743e-01, -2.447e-01, 1.763e-01, 4.261e-01, 1.459e-01, 4.110e-02, 7.020e-03, -9.591e-02)); + r += mul(s1_3, M4(-2.150e-01, 2.711e-01, 3.466e-01, -1.744e-01, -2.085e-02, 8.328e-03, 1.817e-02, -6.482e-02, -2.019e-01, 4.386e-02, -8.107e-01, 1.272e-01, -3.355e-03, 1.445e-02, -1.531e-01, 3.756e-03)); + r += mul(s1_4, M4(-3.456e-01, -1.712e-01, 1.056e-01, -4.463e-01, -9.244e-02, -2.191e-02, 1.196e-03, 8.891e-02, 4.539e-01, 3.934e-01, 7.296e-01, 7.285e-01, 8.415e-02, -3.430e-02, -5.900e-04, 5.239e-02)); + r += mul(s1_5, M4(-7.564e-02, 9.153e-03, -1.038e-01, -4.872e-01, -7.808e-02, 1.069e-03, 2.316e-02, -5.820e-03, 8.850e-02, 1.468e-01, 1.475e-02, 2.014e-01, 5.136e-02, 1.069e-01, 1.706e-02, 6.026e-03)); + r += mul(s1_6, M4(-2.049e-01, 4.374e-03, 1.735e-01, -9.108e-02, -1.021e-01, -1.778e-04, -2.652e-02, -3.118e-02, 2.540e-01, 1.640e-01, 8.107e-02, 7.021e-02, -1.428e-01, 3.771e-02, -1.237e-01, 1.380e-01)); + r += mul(s1_7, M4(1.263e-01, 2.799e-02, -1.731e-02, -1.820e-01, 6.205e-02, -4.359e-03, 4.270e-02, 6.013e-02, 2.310e-01, -7.026e-02, 2.328e-01, 2.288e-01, 8.425e-02, -6.989e-02, 1.053e-01, 6.417e-02)); + r += mul(s1_8, M4(-4.784e-02, 3.269e-02, 5.087e-02, 4.355e-01, -1.589e-02, 4.944e-02, -3.893e-02, 1.440e-01, -4.526e-01, 1.852e-02, -8.770e-02, 2.989e-01, -6.335e-03, 9.053e-03, 2.872e-02, 1.917e-02)); + r += mul(s2_0, M4(-1.034e-01, -1.212e-01, -5.062e-02, 2.220e-01, 1.032e-01, 1.242e-01, -9.939e-02, -5.839e-03, 4.070e-02, 1.123e-01, 6.500e-02, 3.366e-02, 6.602e-04, 4.235e-02, 7.555e-02, -3.979e-02)); + r += mul(s2_1, M4(-1.470e-01, 1.341e-01, -4.356e-02, 1.161e-01, 8.236e-02, 8.301e-02, -5.493e-02, -2.833e-02, 1.886e-01, 2.338e-02, 5.674e-02, 4.431e-02, 2.927e-02, 1.126e-01, -2.959e-02, 2.052e-02)); + r += mul(s2_2, M4(-2.107e-01, -2.339e-01, -5.360e-02, -2.191e-01, 9.702e-02, -2.443e-02, -3.053e-02, 1.584e-01, 1.841e-01, -3.244e-02, -6.325e-04, 8.851e-02, 7.295e-03, 4.954e-02, -2.203e-02, 2.285e-02)); + r += mul(s2_3, M4(-2.654e-02, 5.692e-02, -1.150e-01, 5.888e-02, -9.731e-02, -5.500e-02, -4.047e-02, 1.866e-01, -1.104e-02, 1.897e-02, -2.299e-01, 5.012e-02, -7.490e-02, 3.292e-02, -4.738e-02, -2.095e-02)); + r += mul(s2_4, M4(-8.243e-02, -1.117e-01, -1.419e-02, -8.975e-02, -7.969e-02, 8.002e-02, 3.929e-02, -2.430e-01, -6.524e-02, 2.296e-01, -8.671e-02, -7.930e-02, 1.248e-01, 1.087e-01, -7.137e-02, 4.833e-02)); + r += mul(s2_5, M4(-9.138e-02, -8.530e-02, 1.243e-01, -7.925e-02, -8.227e-02, 9.701e-02, -2.030e-05, 1.916e-01, 7.244e-02, 9.469e-02, 3.060e-02, -1.714e-01, -5.628e-03, -3.548e-02, 4.991e-02, 3.440e-02)); + r += mul(s2_6, M4(-3.592e-01, -1.287e-02, 6.441e-02, 1.201e-01, 1.077e-01, 6.000e-02, 4.156e-02, 7.145e-02, 1.351e-01, 6.877e-03, -4.731e-02, 1.923e-01, -5.772e-02, -7.441e-03, 2.667e-02, 7.189e-02)); + r += mul(s2_7, M4(7.838e-02, 1.265e-01, 1.347e-01, -1.894e-01, 1.915e-02, 6.450e-02, -1.783e-02, 7.198e-02, 1.192e-01, 9.598e-02, -5.289e-02, -9.756e-02, 5.461e-02, -1.719e-01, -3.899e-02, -3.137e-02)); + r += mul(s2_8, M4(-1.130e-01, 2.902e-03, 7.685e-02, -2.195e-01, -6.129e-02, 1.072e-01, -2.869e-02, 1.294e-01, 4.824e-02, -9.565e-02, 3.023e-02, -1.908e-01, -2.689e-02, -5.843e-02, -6.372e-02, -1.017e-01)); + r += mul(s3_0, M4(3.443e-02, -2.186e-02, -7.398e-02, 2.109e-02, 4.728e-02, -2.613e-02, -5.230e-02, -4.760e-02, -2.659e-02, 5.841e-02, 2.548e-02, 1.497e-01, -1.254e-02, -3.591e-02, -4.055e-02, 1.223e-01)); + r += mul(s3_1, M4(5.113e-03, 9.075e-02, -9.528e-02, 1.000e-01, -1.631e-02, -1.926e-01, -5.704e-02, 1.599e-01, 9.760e-03, -2.674e-01, 4.985e-02, 1.509e-01, 7.294e-02, -2.058e-01, 7.094e-02, 1.679e-01)); + r += mul(s3_2, M4(-3.314e-02, -5.458e-02, 4.053e-02, -6.458e-02, -3.707e-02, -7.450e-02, -5.707e-02, -1.021e-01, 3.070e-02, 4.210e-03, 4.633e-02, -5.045e-02, -1.479e-02, -3.339e-02, 8.471e-02, -8.356e-02)); + r += mul(s3_3, M4(-1.641e-02, -4.805e-02, -9.906e-02, 7.602e-02, 1.348e-01, 6.798e-03, -2.020e-02, -9.736e-02, 1.131e-01, 1.257e-01, 1.013e-01, -1.374e-01, 6.402e-02, 1.710e-01, 1.075e-01, -1.846e-01)); + r += mul(s3_4, M4(2.332e-02, 7.788e-02, -1.213e-01, -2.642e-02, -9.024e-02, 1.647e-01, 4.472e-02, -8.873e-02, -8.534e-02, -1.443e-01, -1.676e-01, 2.141e-02, -3.493e-01, 2.111e-01, 1.340e-01, 2.345e-02)); + r += mul(s3_5, M4(6.754e-02, -7.302e-02, 7.720e-02, 7.302e-02, 1.413e-02, -9.789e-02, 5.252e-02, 7.653e-02, -3.572e-02, 5.287e-02, 1.009e-01, -1.622e-02, 7.554e-02, -1.290e-01, -2.322e-03, 1.709e-01)); + r += mul(s3_6, M4(3.987e-02, 2.268e-02, -5.675e-02, -3.855e-02, 5.678e-03, 2.296e-02, -4.488e-03, 7.918e-02, -3.615e-02, 5.164e-02, 9.196e-02, -1.309e-01, -2.668e-01, -1.025e-01, 9.466e-02, 1.381e-01)); + r += mul(s3_7, M4(2.574e-02, 1.908e-01, 1.321e-01, 1.192e-01, 1.048e-02, 6.638e-02, 1.597e-01, 1.485e-01, -2.010e-01, 2.928e-02, -1.044e-01, -1.083e-01, -1.064e-01, -1.828e-01, 2.316e-02, -1.473e-01)); + r += mul(s3_8, M4(-6.137e-02, -5.335e-02, 6.966e-02, -6.205e-02, -1.061e-01, 3.473e-02, 1.788e-02, -9.480e-02, 5.560e-02, -4.706e-02, 5.202e-02, -1.420e-01, 6.509e-03, -1.294e-02, 3.418e-02, -5.897e-02)); + r += mul(s4_0, M4(1.175e-01, 1.390e-04, 6.281e-02, -7.248e-02, 1.378e-02, -9.862e-02, -5.127e-02, -6.545e-02, 8.631e-02, 3.223e-02, -7.405e-02, 5.335e-02, 3.574e-02, -4.053e-02, 1.716e-01, 1.277e-01)); + r += mul(s4_1, M4(-1.075e-02, 5.488e-02, -6.465e-02, -2.294e-01, 5.212e-02, -1.647e-01, -2.144e-02, 3.401e-02, 1.802e-01, -1.097e-01, -1.165e-01, 2.270e-01, 1.037e-01, -3.603e-01, 1.609e-03, 3.745e-01)); + r += mul(s4_2, M4(-2.245e-01, 2.581e-01, -1.418e-01, 4.069e-03, 1.000e-01, -8.272e-02, -6.738e-03, 5.556e-02, -4.491e-02, 3.893e-02, -6.781e-02, 2.742e-02, -3.531e-02, 7.826e-04, 7.051e-02, 1.496e-02)); + r += mul(s4_3, M4(1.454e-02, -2.678e-02, -7.264e-02, -3.251e-02, -2.511e-02, 3.208e-02, -1.461e-01, -1.288e-01, 1.411e-02, 1.038e-02, -1.715e-01, 5.874e-02, 3.128e-01, 2.134e-01, -4.003e-02, -2.441e-02)); + r += mul(s4_4, M4(7.052e-02, 5.386e-02, 1.227e-01, -1.277e-01, -2.847e-04, -2.280e-01, -3.854e-02, -1.228e-01, -2.950e-02, 9.786e-02, -9.868e-02, -3.455e-01, 1.065e-01, 1.068e-01, -5.596e-03, 2.004e-02)); + r += mul(s4_5, M4(-6.593e-02, -2.414e-01, 1.366e-01, -1.910e-01, 1.177e-03, 4.601e-03, -3.388e-02, 7.391e-02, 5.703e-02, -1.842e-01, -7.501e-02, 2.527e-02, -5.273e-02, -1.680e-01, -1.124e-01, 8.422e-02)); + r += mul(s4_6, M4(1.933e-03, -2.671e-02, 1.166e-01, 4.585e-02, -5.652e-02, -2.965e-02, -3.518e-02, 9.324e-02, 6.895e-02, -5.980e-02, 9.371e-03, -4.457e-02, -1.102e-01, 1.673e-02, 4.024e-02, 6.059e-02)); + r += mul(s4_7, M4(-1.293e-01, -1.190e-02, -4.142e-02, 2.233e-01, 2.569e-03, -1.057e-01, -7.533e-02, 1.966e-02, 1.172e-01, 4.392e-02, 4.434e-02, 2.997e-01, -1.758e-02, 9.199e-02, 1.395e-01, 2.846e-01)); + r += mul(s4_8, M4(-1.066e-01, -1.434e-01, 4.095e-02, -1.961e-01, -1.314e-02, -4.131e-02, 1.397e-02, 8.244e-02, 1.721e-01, -1.346e-01, -1.487e-01, -4.334e-02, 4.678e-02, 1.914e-02, 2.189e-02, -2.744e-01)); + r += mul(s5_0, M4(3.505e-02, -1.893e-02, -6.174e-02, 7.140e-02, 5.862e-02, -7.290e-02, -4.338e-02, -1.928e-01, -6.280e-02, 2.682e-02, 6.347e-02, -1.203e-01, 6.547e-04, 1.097e-01, 1.354e-01, 2.270e-02)); + r += mul(s5_1, M4(1.004e-01, -6.857e-03, -1.677e-01, -5.980e-02, -3.806e-02, 1.204e-01, 1.410e-01, -1.282e-01, 1.340e-01, -1.460e-01, 2.107e-03, -2.031e-02, 8.105e-02, -2.499e-01, -1.983e-02, 1.698e-02)); + r += mul(s5_2, M4(5.069e-02, -8.407e-02, 8.328e-02, 1.169e-01, -2.470e-02, 9.539e-02, 1.750e-02, 1.075e-01, -8.137e-02, 3.938e-02, -1.778e-02, 1.271e-01, -1.941e-02, -9.652e-03, 3.720e-02, 1.866e-01)); + r += mul(s5_3, M4(-5.189e-02, 9.037e-02, -1.478e-01, 1.589e-01, -7.698e-02, 1.711e-02, 7.525e-04, 1.649e-02, 1.388e-02, 2.732e-02, -1.145e-02, -1.458e-02, -4.554e-02, -1.471e-02, 5.291e-02, 1.993e-03)); + r += mul(s5_4, M4(7.997e-03, -1.809e-02, 2.333e-01, 7.397e-02, -1.589e-01, -4.639e-02, 2.745e-02, -1.362e-01, -1.537e-02, 5.553e-03, -8.906e-02, -5.364e-02, -2.010e-02, 9.191e-02, -4.399e-02, -8.397e-02)); + r += mul(s5_5, M4(-3.699e-02, 4.243e-02, 6.462e-02, -1.352e-01, -9.268e-02, 1.362e-01, 2.535e-02, 1.417e-01, 2.323e-02, -9.547e-02, 2.809e-02, 4.400e-02, -7.593e-02, -2.419e-01, -6.286e-02, 8.863e-02)); + r += mul(s5_6, M4(8.169e-02, 1.890e-02, 7.678e-02, -3.580e-02, -1.117e-01, 1.031e-02, 5.636e-02, 1.345e-02, 3.059e-03, 8.812e-02, -2.234e-02, -1.886e-01, -2.863e-02, 4.068e-02, -3.889e-02, -3.714e-02)); + r += mul(s5_7, M4(-9.569e-02, -2.113e-02, -6.659e-02, 5.730e-02, -8.431e-02, -3.651e-03, -1.317e-03, 5.162e-02, -1.783e-02, 1.012e-01, 9.033e-02, 1.092e-01, -2.062e-02, 7.236e-02, -2.073e-03, 4.080e-02)); + r += mul(s5_8, M4(-1.102e-01, -4.933e-02, 1.970e-02, -1.550e-01, -1.312e-02, 4.186e-02, -3.089e-02, 7.010e-02, 1.350e-01, -3.695e-02, -3.183e-02, 9.297e-02, -7.847e-02, -3.134e-02, 5.704e-02, -1.429e-01)); + r += mul(s6_0, M4(7.000e-03, -7.842e-02, 1.152e-01, 3.083e-02, 4.837e-02, 7.915e-02, -8.436e-02, -1.769e-01, 4.239e-02, -3.625e-02, -7.933e-02, -1.820e-02, 8.132e-03, -3.315e-02, -7.444e-02, -5.075e-02)); + r += mul(s6_1, M4(3.911e-02, 7.855e-02, 3.165e-02, 1.165e-01, -6.093e-02, -1.520e-01, -1.830e-02, -2.941e-03, 1.659e-02, 1.346e-01, 2.275e-02, -7.598e-03, -1.072e-01, 6.206e-02, -1.064e-01, 1.363e-01)); + r += mul(s6_2, M4(-3.572e-02, -1.017e-01, -3.197e-02, -1.633e-01, 3.489e-02, -8.531e-02, 1.401e-01, -1.635e-02, -6.238e-02, -1.510e-01, 6.321e-02, 1.244e-01, -9.047e-02, -8.580e-02, 3.259e-02, 7.443e-02)); + r += mul(s6_3, M4(1.415e-02, 3.246e-02, 6.484e-02, 2.144e-01, -1.114e-02, 6.499e-02, -2.476e-01, -9.417e-02, 7.232e-02, -9.882e-02, -4.253e-02, -8.914e-02, 1.202e-01, -4.441e-02, -1.108e-01, -1.293e-01)); + r += mul(s6_4, M4(1.240e-01, -1.149e-02, 4.045e-02, -4.748e-02, -6.501e-02, -3.682e-02, 9.060e-02, 1.020e-01, -5.793e-02, 4.212e-02, 1.733e-01, -3.874e-02, -8.168e-02, 2.860e-01, 7.321e-02, -9.710e-02)); + r += mul(s6_5, M4(-1.567e-01, -8.936e-02, 1.170e-01, -1.707e-01, 1.136e-01, 1.074e-01, 6.826e-02, 8.583e-02, -1.006e-01, 2.438e-01, 9.477e-03, 1.312e-01, 1.575e-01, -8.688e-04, 9.217e-02, 5.701e-03)); + r += mul(s6_6, M4(-6.751e-02, -1.474e-01, 7.120e-02, -1.665e-01, 2.879e-02, -3.259e-02, -4.251e-02, 1.488e-02, 9.614e-02, -5.991e-02, 1.763e-01, 1.456e-02, 3.111e-02, 5.714e-02, -1.470e-01, -8.239e-02)); + r += mul(s6_7, M4(1.637e-01, -5.533e-02, -2.331e-01, -1.128e-01, 1.022e-01, -8.590e-02, -4.325e-02, 1.635e-01, -1.229e-01, 9.051e-02, 6.749e-02, 3.805e-02, -5.861e-02, -2.092e-02, 2.744e-02, 5.822e-02)); + r += mul(s6_8, M4(2.953e-01, 1.238e-01, -9.868e-03, 3.260e-01, 1.625e-01, 5.333e-02, 5.171e-02, -6.420e-03, -2.182e-01, 3.314e-02, -1.977e-02, 1.174e-01, 9.432e-04, -5.159e-02, -3.402e-02, -2.400e-02)); + r += mul(s7_0, M4(-1.764e-03, -4.008e-02, 2.166e-02, 1.506e-01, -1.484e-01, -3.399e-02, 2.949e-02, 5.770e-02, -8.984e-02, 5.094e-02, 5.657e-03, 5.733e-02, -2.079e-02, -8.383e-03, -3.833e-02, 6.736e-02)); + r += mul(s7_1, M4(-6.793e-02, -3.721e-02, 4.122e-02, -8.749e-02, 2.187e-02, 1.206e-01, -5.195e-02, 1.270e-01, -1.035e-02, 7.504e-02, 4.991e-02, -7.404e-02, 4.917e-02, 7.537e-03, -2.237e-02, 8.293e-02)); + r += mul(s7_2, M4(-9.762e-02, 3.176e-02, 3.020e-02, -2.093e-01, -6.846e-02, 6.975e-02, -5.583e-03, 1.134e-02, -1.819e-01, 2.187e-01, 6.703e-02, 9.355e-02, 2.201e-02, -1.026e-01, -1.755e-02, -4.572e-02)); + r += mul(s7_3, M4(1.023e-01, 4.612e-02, 7.730e-02, 1.702e-01, 1.045e-01, 2.049e-02, -2.142e-01, -2.667e-02, -1.555e-01, -3.456e-02, 2.766e-02, 2.139e-01, -6.208e-02, -3.642e-02, -3.100e-02, -7.824e-02)); + r += mul(s7_4, M4(-3.174e-02, 3.798e-02, 3.780e-02, -1.580e-01, 7.051e-03, -7.929e-02, -7.760e-02, -1.234e-01, -4.611e-02, 1.214e-01, -6.567e-03, 1.542e-01, 1.697e-03, -9.982e-02, 1.262e-02, 6.704e-03)); + r += mul(s7_5, M4(-5.593e-02, 7.511e-02, 1.113e-02, 6.125e-02, 1.121e-01, 2.987e-02, 1.123e-01, 8.575e-02, -1.579e-01, 1.389e-01, 1.399e-02, 1.299e-01, 1.241e-01, 1.171e-01, 8.747e-02, -8.339e-02)); + r += mul(s7_6, M4(3.187e-02, -2.891e-02, -8.751e-02, -1.304e-01, 7.755e-02, -7.256e-02, -5.659e-02, -3.308e-02, 9.382e-02, -4.571e-02, 2.681e-02, -3.575e-03, -8.575e-03, 9.085e-02, -1.202e-01, -9.952e-02)); + r += mul(s7_7, M4(-5.262e-02, -1.290e-02, -9.283e-02, -8.499e-02, 1.011e-02, -2.862e-03, 1.140e-01, 7.442e-02, 1.927e-01, -2.441e-02, 1.301e-02, -1.838e-01, 2.864e-02, 2.634e-02, 1.810e-01, 4.947e-02)); + r += mul(s7_8, M4(2.631e-02, -3.746e-02, 3.510e-02, 7.880e-02, -9.427e-02, 8.804e-02, 3.893e-02, 8.391e-02, 2.058e-01, 7.800e-02, -5.539e-02, -8.611e-02, 1.941e-03, -2.240e-02, 4.233e-02, 1.454e-01)); + r += V4(-1.409e-02, -5.309e-03, -2.197e-02, 3.849e-02); + return r; +} + +V4 f1(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(8.910e-02, -1.346e-03, 2.454e-02, 9.515e-02, -2.567e-02, -2.216e-01, -9.989e-02, 2.110e-01, -8.455e-02, -4.117e-04, 4.897e-03, -2.244e-02, -1.606e-01, 1.286e-01, 1.370e-02, 1.414e-01)); + r += mul(s0_1, M4(1.206e-01, 4.406e-02, 7.571e-02, -7.560e-02, -3.542e-01, -2.639e-01, 4.388e-02, 3.168e-01, -5.599e-02, 1.577e-01, -1.223e-01, -8.276e-02, 1.556e-01, -2.275e-01, 1.533e-01, -9.174e-02)); + r += mul(s0_2, M4(1.023e-01, 3.794e-02, 2.122e-02, 1.274e-02, 7.343e-01, -1.151e+00, -1.053e-01, -1.710e-01, -7.460e-02, -1.285e-01, -2.051e-02, 3.872e-02, -3.458e-01, -2.282e-01, -3.145e-01, -2.288e-02)); + r += mul(s0_3, M4(-2.358e-01, -4.073e-02, -2.179e-02, 4.840e-02, 3.132e-02, 8.168e-02, 9.321e-02, -9.937e-02, -4.727e-02, 6.235e-02, -9.533e-03, 1.042e-01, 1.246e-01, -2.124e-01, -1.625e-01, 2.047e-01)); + r += mul(s0_4, M4(-6.673e-02, 3.943e-02, 1.112e-01, -4.216e-02, -3.215e-01, -1.560e-01, 5.723e-01, 6.170e-01, 2.162e-01, 9.800e-03, -1.509e-01, -1.570e-01, 1.151e-01, 2.296e-01, -1.126e-01, -1.495e-01)); + r += mul(s0_5, M4(7.771e-02, -1.602e-01, -7.557e-02, -1.400e-02, 2.698e-01, 1.202e-01, -2.564e-01, -1.989e-01, 6.265e-02, -6.266e-02, 9.504e-02, -1.056e-01, -1.345e-01, 3.163e-02, -5.555e-02, -5.943e-02)); + r += mul(s0_6, M4(5.680e-02, 9.451e-02, 4.010e-02, -3.810e-02, -1.349e-01, 1.115e-01, -9.722e-02, -3.056e-02, -5.044e-02, -9.835e-02, -4.577e-02, -1.480e-02, 3.269e-02, 2.935e-02, 7.189e-02, 2.296e-01)); + r += mul(s0_7, M4(6.537e-02, -6.818e-04, -1.670e-02, 3.719e-02, -3.406e-02, 1.657e-01, -1.210e-01, 1.763e-01, -2.455e-02, 7.424e-02, 2.091e-01, 3.205e-02, 1.519e-02, -1.908e-01, 1.565e-01, -1.786e-02)); + r += mul(s0_8, M4(-1.446e-01, -8.694e-03, -7.337e-02, 5.499e-02, 2.439e-01, -9.560e-02, 1.041e-01, -1.820e-02, 4.636e-02, -3.565e-03, 1.219e-02, 6.830e-04, -3.370e-01, -3.640e-01, -2.115e-01, 9.002e-02)); + r += mul(s1_0, M4(1.342e-01, -1.733e-01, -1.008e-01, 1.538e-01, 1.408e-01, -2.912e-02, -4.282e-02, 3.716e-04, -3.969e-01, 4.119e-01, 3.072e-01, -4.043e-01, 6.660e-03, 9.480e-02, 2.302e-02, -2.741e-02)); + r += mul(s1_1, M4(-2.493e-01, -1.930e-01, -1.874e-01, 9.163e-02, -5.913e-02, 1.647e-01, -6.130e-02, 1.338e-01, 1.508e-01, -2.693e-01, -6.343e-02, -5.786e-01, -8.325e-02, 1.340e-01, -7.264e-02, 6.374e-02)); + r += mul(s1_2, M4(2.620e-01, -2.452e-01, -8.229e-02, 1.755e-01, -1.724e-02, -1.251e-02, 1.613e-02, 1.246e-04, 3.248e-01, 1.872e-01, 4.909e-02, -2.383e-01, 1.286e-01, 1.288e-03, -4.551e-03, -7.112e-03)); + r += mul(s1_3, M4(-1.368e-01, -2.489e-01, 8.261e-02, 1.465e-01, -9.940e-02, 5.532e-02, -6.636e-03, 3.957e-02, 3.887e-02, -4.220e-02, -1.266e-01, -2.484e-01, 1.653e-02, -1.762e-01, -6.384e-02, 6.650e-02)); + r += mul(s1_4, M4(-1.322e-01, -2.508e-01, 9.695e-02, 2.759e-01, 1.711e-01, 1.154e-01, 8.387e-02, -9.068e-02, -9.442e-02, -3.201e-01, -4.418e-01, -8.104e-01, 5.357e-02, 1.851e-03, -1.177e-01, -1.326e-01)); + r += mul(s1_5, M4(-3.025e-01, -2.253e-01, 9.386e-03, -3.228e-01, -1.313e-03, -5.290e-02, 1.473e-02, -7.331e-02, 2.042e-01, -3.828e-01, -2.386e-01, -3.321e-01, -1.579e-02, -3.431e-02, 2.951e-02, -4.669e-02)); + r += mul(s1_6, M4(8.848e-02, 1.254e-01, 9.570e-02, 4.379e-02, -3.451e-02, -1.055e-01, 2.921e-02, -6.082e-02, -5.281e-02, -2.216e-01, 2.752e-01, -2.568e-02, 7.631e-02, 3.464e-02, -6.274e-02, 9.265e-02)); + r += mul(s1_7, M4(4.651e-03, -1.185e-01, 6.418e-02, 2.380e-01, -1.132e-01, -2.253e-02, 2.184e-02, 4.280e-02, 9.103e-02, -2.528e-01, 2.170e-01, -1.235e-01, 5.277e-02, -5.816e-02, 1.368e-02, 6.526e-03)); + r += mul(s1_8, M4(3.757e-02, 1.687e-01, 1.237e-01, 7.899e-02, 2.324e-02, -8.211e-03, -1.375e-01, 1.172e-02, -2.546e-01, 1.848e-01, -7.504e-02, -6.435e-02, -1.833e-02, -1.265e-02, 1.700e-02, -2.657e-02)); + r += mul(s2_0, M4(-9.294e-02, 1.013e-02, -7.953e-02, -1.553e-02, -2.615e-02, 6.623e-02, 1.323e-01, 4.525e-03, 1.813e-01, -6.395e-02, 2.938e-02, -6.379e-02, 1.081e-01, 1.796e-02, 9.546e-02, -2.721e-02)); + r += mul(s2_1, M4(-1.086e-01, -1.629e-01, -2.253e-01, 8.716e-02, 1.048e-01, -4.209e-02, 5.305e-02, 2.594e-02, -1.080e-01, -7.385e-02, 1.227e-01, 1.193e-01, 2.164e-02, -5.632e-02, -3.401e-02, 2.353e-03)); + r += mul(s2_2, M4(-1.562e-01, 1.025e-02, 3.543e-03, -1.539e-01, -2.406e-01, 6.562e-02, -1.145e-01, 1.565e-01, 1.130e-01, 5.315e-02, 6.167e-02, -1.898e-02, -1.894e-01, -1.898e-02, -2.112e-02, 4.767e-02)); + r += mul(s2_3, M4(-1.481e-01, 3.875e-01, 2.640e-02, -6.552e-02, -9.991e-02, -1.803e-01, 2.441e-02, -6.851e-02, 5.002e-02, -1.789e-01, 2.154e-02, -3.099e-01, 7.189e-02, -3.120e-02, 2.074e-03, -1.275e-01)); + r += mul(s2_4, M4(-8.695e-02, 1.189e-01, -1.396e-01, 2.270e-02, -8.596e-02, -2.440e-01, 3.163e-01, 4.942e-02, -2.263e-01, 3.490e-02, 1.214e-01, 2.689e-01, -1.303e-01, -1.430e-01, -2.505e-02, 4.238e-02)); + r += mul(s2_5, M4(-4.874e-01, 4.404e-01, -2.059e-01, -2.963e-01, 4.127e-02, -2.824e-01, 6.026e-02, -1.425e-01, 1.109e-04, -1.551e-01, -1.165e-01, -2.714e-02, 1.095e-01, 7.539e-02, -4.453e-02, 4.011e-02)); + r += mul(s2_6, M4(2.985e-01, 4.725e-02, 6.356e-02, -6.901e-02, -8.920e-02, 8.782e-02, -3.832e-02, 6.666e-02, 7.696e-02, 4.822e-02, -3.021e-02, -2.950e-01, -7.946e-02, -7.889e-03, -1.475e-01, 1.356e-01)); + r += mul(s2_7, M4(2.859e-01, -1.710e-01, -8.794e-02, -2.221e-01, 1.431e-01, 1.285e-01, 3.526e-02, -6.195e-02, 1.243e-01, 1.154e-01, -4.975e-02, 2.524e-01, 6.860e-02, 1.609e-01, 1.547e-01, -3.198e-02)); + r += mul(s2_8, M4(-8.444e-02, 9.977e-03, -5.097e-02, -8.137e-02, -2.073e-02, 1.751e-01, 1.544e-02, 1.690e-02, 8.271e-02, 1.022e-01, -2.783e-03, 6.596e-02, 6.483e-02, -4.162e-02, 1.039e-01, -6.861e-02)); + r += mul(s3_0, M4(4.422e-02, 1.581e-02, -9.880e-03, -5.861e-02, 1.328e-02, 3.390e-02, 1.026e-01, -4.730e-02, -6.963e-02, -5.586e-02, -6.261e-02, -1.890e-02, 2.215e-01, -3.017e-02, -9.074e-02, 1.421e-01)); + r += mul(s3_1, M4(-7.360e-02, -4.079e-02, -4.623e-02, -4.983e-02, -9.094e-02, -5.667e-03, -8.593e-02, -6.646e-03, -3.160e-02, 4.342e-02, 5.631e-02, 3.603e-02, 1.442e-02, 4.006e-02, 8.321e-02, -3.482e-02)); + r += mul(s3_2, M4(9.281e-03, 9.378e-03, 3.397e-03, -7.809e-02, -3.123e-03, 9.304e-02, 3.233e-02, -7.080e-02, -9.136e-02, -1.127e-02, 4.820e-02, -2.933e-02, 2.321e-01, 1.058e-01, 1.952e-02, -2.344e-02)); + r += mul(s3_3, M4(7.925e-02, 1.257e-02, 1.241e-01, -8.064e-02, 1.121e-01, -2.614e-02, -6.152e-03, 3.064e-03, 9.139e-02, -1.356e-01, -6.281e-02, -1.211e-01, -3.034e-03, -4.127e-01, 1.209e-01, -1.396e-02)); + r += mul(s3_4, M4(2.607e-02, -2.639e-02, -3.220e-02, -3.878e-02, -6.525e-02, 4.209e-02, -1.721e-02, 1.705e-01, -2.014e-01, -2.019e-01, 6.405e-02, 1.089e-01, -2.453e-02, -6.004e-02, -5.524e-02, -1.662e-01)); + r += mul(s3_5, M4(9.753e-02, 1.020e-01, 1.356e-02, -1.618e-01, 4.161e-02, 9.689e-02, -9.058e-02, -3.701e-02, -6.306e-02, 1.040e-02, -8.205e-02, 2.906e-02, -1.028e-01, -2.493e-02, -8.458e-02, -7.241e-03)); + r += mul(s3_6, M4(2.107e-01, 3.179e-02, 7.236e-02, -1.228e-02, 3.019e-02, -5.722e-02, -2.034e-02, 6.010e-02, -6.609e-02, -3.052e-02, -4.948e-02, -1.441e-01, 2.229e-02, 2.236e-02, -1.392e-01, 2.960e-02)); + r += mul(s3_7, M4(-8.226e-02, -3.166e-02, -1.714e-01, -1.936e-01, -5.084e-02, -4.090e-02, -3.542e-03, 2.023e-02, 1.543e-01, -2.059e-02, 1.047e-01, -3.326e-02, 3.940e-02, -1.899e-01, 1.399e-01, -4.406e-03)); + r += mul(s3_8, M4(1.131e-01, 6.519e-02, 4.679e-02, -2.254e-02, 2.231e-02, 8.131e-02, -6.404e-02, 2.411e-02, 5.227e-02, 2.303e-02, 8.176e-02, -4.657e-03, 1.590e-02, 3.467e-01, 1.593e-03, 2.102e-02)); + r += mul(s4_0, M4(8.652e-02, -1.284e-01, -2.884e-02, 1.138e-01, 1.322e-01, 1.236e-02, 1.831e-03, -2.478e-02, 1.264e-01, 1.572e-01, 3.455e-02, -3.646e-03, -2.191e-01, -3.167e-01, -6.969e-02, -5.147e-02)); + r += mul(s4_1, M4(-5.470e-03, 9.407e-02, -8.282e-02, -3.270e-02, -6.543e-02, -7.489e-02, 1.091e-01, -1.572e-01, -6.172e-02, 7.606e-02, 5.424e-02, 1.236e-02, -2.037e-02, -5.677e-02, -1.353e-01, 6.602e-02)); + r += mul(s4_2, M4(-7.001e-02, -4.892e-02, 3.917e-02, -1.065e-01, -1.347e-01, -5.105e-02, 7.258e-02, 7.781e-03, 3.858e-02, -2.034e-01, -1.135e-02, -4.247e-02, 2.080e-01, -7.468e-02, -1.163e-01, 4.210e-02)); + r += mul(s4_3, M4(1.452e-01, 9.147e-02, 1.409e-01, -1.277e-02, -6.944e-02, 3.940e-03, -1.402e-01, 1.620e-01, 5.567e-02, 5.582e-02, 2.918e-02, -1.192e-01, 6.997e-02, 2.027e-01, 1.534e-01, -3.064e-02)); + r += mul(s4_4, M4(2.874e-02, 3.527e-01, -5.966e-02, -1.812e-01, -5.436e-02, -1.563e-02, -1.353e-01, 2.086e-01, 1.382e-01, 1.635e-01, 2.479e-01, -5.897e-02, 2.445e-01, -1.174e-01, 6.195e-02, -9.888e-03)); + r += mul(s4_5, M4(1.757e-01, 2.398e-01, -5.628e-02, 1.164e-01, -8.532e-02, 8.031e-02, -6.165e-02, 2.103e-02, -6.666e-02, 1.506e-01, 8.690e-02, -2.243e-01, -8.303e-02, -5.884e-02, -1.021e-01, -4.417e-02)); + r += mul(s4_6, M4(-4.968e-02, -1.657e-01, -2.294e-02, -1.225e-02, 2.877e-02, -9.153e-02, 1.038e-01, 2.791e-02, 2.448e-02, 1.086e-02, -8.549e-02, 2.828e-02, 3.220e-02, -1.614e-01, 3.436e-01, -1.104e-01)); + r += mul(s4_7, M4(-6.889e-02, 1.727e-02, -1.053e-01, 1.116e-01, 7.029e-02, -2.184e-02, 5.901e-02, -2.185e-02, 2.445e-02, 2.161e-02, 1.922e-01, 9.900e-02, -8.082e-02, -9.316e-02, 5.300e-02, -6.988e-03)); + r += mul(s4_8, M4(-6.002e-02, -1.637e-01, -1.488e-01, -9.243e-02, -4.750e-02, -3.129e-02, -1.950e-02, 1.272e-02, 4.738e-02, 1.805e-01, 2.190e-02, -1.054e-02, -1.530e-01, 2.715e-02, 2.288e-02, 1.901e-02)); + r += mul(s5_0, M4(3.872e-02, 1.505e-01, -8.235e-02, 8.083e-02, -4.113e-03, 7.945e-02, -1.057e-01, -2.004e-02, -4.455e-02, 1.053e-01, -1.596e-02, 5.646e-03, -1.078e-01, 1.295e-02, -4.217e-02, 4.942e-02)); + r += mul(s5_1, M4(5.422e-02, 3.384e-02, -8.833e-02, -8.370e-03, -2.118e-01, 1.877e-01, -7.199e-02, -8.065e-02, -1.102e-02, -5.483e-02, -8.391e-02, 1.016e-01, 4.257e-02, 9.185e-02, -1.008e-02, -1.069e-02)); + r += mul(s5_2, M4(7.060e-02, -6.159e-02, -1.882e-02, 5.668e-02, -2.046e-01, -1.083e-02, 5.236e-02, -3.329e-02, -1.156e-02, 3.036e-02, 7.037e-02, -1.499e-02, 7.131e-02, -4.113e-02, -2.594e-02, 2.417e-03)); + r += mul(s5_3, M4(-6.863e-05, -1.094e-02, 2.728e-02, -5.025e-02, 4.458e-02, 1.265e-01, 4.250e-01, 1.585e-01, 1.626e-01, -1.132e-02, -4.823e-03, 4.450e-02, -2.444e-01, -1.569e-03, 9.930e-02, -1.348e-01)); + r += mul(s5_4, M4(-1.646e-01, -7.413e-02, -8.431e-02, 4.586e-02, -1.124e-02, 3.074e-02, 3.820e-01, 1.120e-01, -7.599e-02, -5.630e-02, 2.247e-02, -3.743e-02, 4.557e-02, 4.874e-02, 1.513e-01, -2.207e-02)); + r += mul(s5_5, M4(-5.701e-05, -1.207e-01, 3.735e-03, 2.883e-02, 3.513e-02, 1.253e-01, 1.534e-01, -2.376e-03, -1.092e-01, -7.901e-03, -3.538e-02, -6.236e-02, -7.819e-02, -2.731e-02, -6.718e-02, -8.002e-05)); + r += mul(s5_6, M4(1.743e-02, -6.440e-02, 1.479e-01, -1.086e-02, -6.552e-02, 2.856e-02, -5.184e-03, -5.313e-02, 3.404e-02, 4.957e-02, -6.585e-02, -1.676e-03, -7.506e-02, 5.887e-02, -1.964e-02, 2.131e-02)); + r += mul(s5_7, M4(4.939e-02, 5.003e-02, 9.394e-02, -7.249e-02, 4.573e-02, -3.546e-03, 1.632e-02, 2.770e-03, -4.211e-02, -4.193e-02, -4.854e-02, 5.925e-02, -1.671e-02, 1.784e-01, 2.091e-02, -5.425e-02)); + r += mul(s5_8, M4(-1.224e-01, -9.666e-03, -1.224e-02, -3.442e-02, -3.580e-02, -1.629e-02, -2.274e-02, 2.918e-03, 4.514e-02, -3.651e-02, 3.280e-02, -4.425e-02, -3.234e-02, -3.197e-02, -3.062e-02, -3.570e-02)); + r += mul(s6_0, M4(-1.514e-01, 1.460e-01, 6.691e-02, -1.046e-01, 5.241e-02, -1.531e-01, -4.389e-02, 4.566e-02, -1.250e-01, 5.954e-02, -2.963e-02, 1.083e-02, 1.568e-01, 8.511e-02, 4.253e-02, -3.083e-02)); + r += mul(s6_1, M4(1.804e-01, -1.404e-01, 1.849e-02, -9.253e-03, 1.736e-01, -3.482e-01, 4.334e-02, -5.884e-03, -6.969e-02, -5.277e-02, 6.883e-02, -1.137e-01, 4.973e-02, 1.512e-01, 6.824e-02, -1.195e-02)); + r += mul(s6_2, M4(-8.969e-02, 8.610e-02, 7.556e-03, -9.505e-02, 8.152e-02, 8.838e-03, 4.312e-02, 1.702e-01, -8.846e-02, 1.011e-01, 2.993e-02, -6.197e-02, -1.164e-01, -2.880e-02, 5.386e-02, 3.726e-02)); + r += mul(s6_3, M4(-3.430e-01, 1.598e-01, -1.753e-01, -3.650e-02, -9.155e-02, -4.481e-02, 3.697e-02, -6.169e-02, -4.163e-02, -3.134e-02, -1.469e-01, 1.078e-02, 2.664e-02, 5.054e-02, 8.484e-02, -9.056e-02)); + r += mul(s6_4, M4(-1.396e-01, 1.672e-01, -3.294e-02, 6.874e-02, -1.064e-01, 1.469e-01, 9.447e-02, 8.395e-03, 4.008e-02, -2.137e-02, -7.051e-02, -8.558e-02, -4.070e-02, -2.618e-02, 4.764e-02, 5.799e-02)); + r += mul(s6_5, M4(-1.929e-01, -8.364e-02, 4.608e-02, -3.928e-02, -1.528e-01, -4.131e-02, 1.455e-02, -5.769e-02, -1.404e-01, -4.487e-02, -8.932e-02, -5.865e-02, -1.973e-03, 9.755e-03, -8.237e-02, -9.573e-02)); + r += mul(s6_6, M4(-3.181e-01, -1.968e-02, -2.393e-01, 4.048e-02, -6.190e-02, 3.130e-02, 7.706e-02, -4.039e-03, -8.436e-02, 5.525e-02, 7.837e-02, 1.824e-02, 1.744e-02, -1.078e-01, -1.738e-01, 8.633e-02)); + r += mul(s6_7, M4(1.399e-01, 1.522e-01, 3.627e-02, -1.353e-01, -1.899e-01, -1.745e-01, 1.224e-02, 1.400e-03, -3.581e-02, -6.041e-02, 1.819e-01, 1.422e-01, 2.414e-02, 2.798e-02, 1.311e-01, 3.283e-02)); + r += mul(s6_8, M4(-5.285e-02, 2.779e-01, -8.815e-02, 1.794e-01, 6.063e-02, -6.624e-02, 9.881e-02, -1.517e-02, 1.415e-01, -1.082e-01, 3.647e-02, -8.643e-04, -6.027e-02, 1.962e-02, 3.728e-03, 1.870e-03)); + r += mul(s7_0, M4(1.560e-01, -6.796e-02, 1.324e-01, -6.313e-02, -5.917e-02, 2.029e-01, 2.140e-04, -1.140e-01, -1.656e-01, 8.067e-02, -5.688e-02, 2.288e-02, -3.817e-02, 1.267e-04, 9.234e-03, -6.582e-02)); + r += mul(s7_1, M4(-1.886e-01, 1.397e-02, -1.929e-01, 7.354e-02, 7.400e-02, -8.945e-02, -3.444e-02, -1.032e-02, 6.883e-03, -1.109e-01, -3.822e-02, -6.947e-02, -2.281e-02, 3.418e-02, 1.238e-01, -9.853e-02)); + r += mul(s7_2, M4(9.857e-02, -1.256e-01, 2.090e-02, -2.557e-02, -6.201e-02, 1.175e-01, -6.024e-02, 9.497e-02, 1.153e-02, -1.424e-01, -9.995e-02, 8.095e-02, -2.387e-02, -9.371e-03, 2.388e-02, -4.448e-02)); + r += mul(s7_3, M4(-8.901e-02, 3.328e-02, 4.116e-02, 4.701e-02, 1.475e-01, 1.681e-01, -6.418e-03, 1.747e-02, 8.457e-02, 8.317e-02, 7.036e-02, -1.067e-02, 2.067e-01, -1.148e-01, 4.731e-02, -8.135e-03)); + r += mul(s7_4, M4(-1.313e-02, 1.246e-02, -4.024e-02, -1.197e-02, 4.666e-02, 7.153e-02, -1.310e-01, 5.437e-02, 2.997e-02, -3.104e-02, 1.004e-01, -1.977e-01, 8.515e-02, -9.532e-02, -4.444e-02, -6.407e-02)); + r += mul(s7_5, M4(-1.106e-01, 1.017e-01, -1.921e-02, -3.096e-02, -4.821e-02, -3.793e-03, -3.594e-02, 4.888e-02, 3.435e-02, -1.044e-01, 5.074e-02, 6.108e-03, 1.200e-02, -1.113e-01, -1.319e-01, 2.259e-02)); + r += mul(s7_6, M4(-5.923e-02, 6.856e-02, -6.103e-02, -4.680e-02, -5.272e-02, 4.327e-02, 5.696e-02, 3.384e-03, -6.412e-02, -6.521e-02, -6.295e-02, -1.029e-01, -1.510e-01, 5.642e-02, -1.521e-02, 5.165e-02)); + r += mul(s7_7, M4(-6.138e-03, -1.991e-02, 7.163e-02, 4.382e-02, -1.717e-03, -7.319e-02, 4.448e-02, -1.656e-02, 3.101e-02, -1.616e-01, -2.131e-01, 1.369e-01, -4.679e-02, -5.206e-02, -1.034e-01, 3.881e-02)); + r += mul(s7_8, M4(4.015e-02, -1.615e-01, -1.872e-02, -2.719e-02, 8.566e-02, 5.263e-02, 6.620e-02, -8.191e-02, 2.352e-02, -6.728e-03, -2.114e-01, 1.403e-01, -6.310e-02, -1.614e-02, -4.952e-02, 8.593e-03)); + r += V4(1.236e-02, 1.038e-02, 6.374e-03, 9.167e-02); + return r; +} + +V4 f2(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-9.451e-02, -8.048e-02, 5.369e-02, -5.667e-02, -2.072e-01, -5.991e-02, 5.108e-02, 5.683e-02, 5.525e-02, 4.765e-02, 4.061e-02, -3.167e-02, -8.613e-02, -7.323e-03, -7.469e-02, -4.435e-01)); + r += mul(s0_1, M4(8.076e-03, -7.539e-02, -7.807e-02, -5.834e-02, -8.527e-02, -2.725e-01, -1.052e-01, 4.591e-02, 6.218e-02, 5.475e-02, 7.220e-02, 7.611e-02, 1.854e-01, -2.912e-02, 2.338e-01, -1.314e-01)); + r += mul(s0_2, M4(2.337e-02, 5.448e-02, -4.442e-02, -1.076e-02, 7.776e-02, 4.370e-01, 1.315e-01, 9.939e-01, -3.630e-02, -1.193e-01, -6.207e-02, -2.774e-02, 1.735e-01, -1.294e-01, 9.411e-02, 3.621e-01)); + r += mul(s0_3, M4(1.539e-01, -6.189e-02, 3.427e-03, -5.864e-02, 7.490e-02, -2.073e-02, 1.147e-01, 4.822e-02, 1.203e-02, 4.232e-02, -1.874e-02, -5.372e-02, -1.737e-01, 1.252e-01, -8.991e-02, 2.871e-01)); + r += mul(s0_4, M4(6.459e-02, 6.310e-02, -8.822e-02, 7.055e-02, 1.086e-01, 4.429e-01, 3.774e-01, -2.788e-01, -1.163e-01, -1.472e-01, -3.744e-02, 2.693e-02, -2.319e-02, -1.295e-01, 1.367e-01, 4.929e-01)); + r += mul(s0_5, M4(7.148e-03, -1.485e-02, 2.525e-02, -1.562e-01, 6.559e-03, -1.490e-01, -2.802e-01, -9.884e-02, -5.677e-02, 2.006e-01, 5.245e-02, 1.053e-02, -1.087e-01, -7.758e-02, -1.782e-01, 9.191e-03)); + r += mul(s0_6, M4(1.809e-05, 3.315e-02, 2.993e-02, -2.552e-02, 6.115e-02, -4.337e-02, -6.610e-02, -2.199e-02, -6.712e-02, 1.125e-01, 3.812e-02, -7.054e-02, -3.886e-02, -5.372e-03, -8.008e-02, -2.972e-01)); + r += mul(s0_7, M4(-8.793e-02, -1.775e-02, 1.255e-01, 6.161e-02, -1.181e-01, -6.883e-02, 7.986e-02, -2.173e-01, 8.186e-02, -7.056e-02, -1.130e-01, -1.919e-02, 1.098e-01, 1.044e-01, 5.733e-02, 1.101e-01)); + r += mul(s0_8, M4(6.637e-02, -6.283e-02, 1.001e-01, -6.000e-02, -5.875e-02, 5.409e-02, -1.717e-01, 4.719e-02, 2.879e-02, -8.806e-03, -1.647e-02, 5.500e-02, -4.014e-01, -5.139e-02, 7.386e-02, 1.470e-01)); + r += mul(s1_0, M4(2.307e-01, -4.144e-01, -2.797e-02, -4.707e-02, 1.286e-01, 1.800e-02, -4.013e-02, -7.657e-03, 3.454e-02, -4.379e-01, -2.028e-01, 2.585e-01, -4.224e-02, -1.576e-01, -4.730e-02, -6.219e-02)); + r += mul(s1_1, M4(-5.665e-02, 3.092e-01, -2.782e-01, 4.133e-01, -2.158e-02, -1.469e-01, 2.683e-03, 6.333e-02, 4.256e-01, -1.403e-01, 4.976e-01, -7.155e-02, -1.295e-01, -3.946e-02, -6.470e-02, 6.424e-02)); + r += mul(s1_2, M4(-1.032e-01, -1.789e-01, 1.003e-01, -1.901e-01, -1.455e-01, 2.151e-02, 3.974e-02, -3.572e-02, 1.815e-01, 1.426e-02, -4.524e-01, 6.970e-01, 1.297e-01, 3.475e-02, -1.025e-01, -4.876e-02)); + r += mul(s1_3, M4(-8.318e-04, -3.434e-01, 9.668e-02, 2.092e-01, -3.396e-02, 4.078e-02, 4.601e-03, -6.833e-02, 5.617e-02, -3.474e-01, -2.318e-01, -4.633e-02, 1.066e-02, -1.118e-01, -3.939e-02, 7.404e-02)); + r += mul(s1_4, M4(2.567e-02, 7.887e-01, 2.479e-01, 1.984e-01, -3.046e-02, 9.736e-03, 8.833e-02, 1.055e-01, -5.627e-01, -4.178e-02, -5.462e-01, 7.956e-01, -2.458e-02, 6.355e-02, 2.734e-02, 7.263e-02)); + r += mul(s1_5, M4(2.634e-02, -2.494e-01, 1.911e-01, -2.585e-01, -5.987e-02, 9.074e-03, -1.284e-01, 5.261e-02, -1.073e-01, -2.491e-03, -5.666e-02, 1.647e-01, 1.558e-01, 8.153e-02, 6.985e-02, -4.197e-02)); + r += mul(s1_6, M4(-1.840e-01, -5.581e-03, -3.012e-01, 1.223e-01, 5.605e-03, -1.080e-01, -1.131e-01, -4.307e-02, -1.180e-01, 5.656e-02, -1.219e-01, 4.325e-01, 4.198e-02, 5.790e-02, -1.440e-01, 6.205e-03)); + r += mul(s1_7, M4(-3.818e-01, 1.567e-01, -2.418e-01, -1.454e-01, -9.046e-02, 4.173e-02, 3.588e-02, 1.034e-01, 3.701e-02, 1.275e-01, -3.048e-01, 2.711e-01, 6.572e-02, -4.940e-03, -9.529e-02, 4.867e-02)); + r += mul(s1_8, M4(-8.676e-02, 1.389e-03, 3.468e-01, 4.816e-01, -1.848e-02, -6.333e-02, -3.837e-02, -1.234e-01, 2.136e-02, 6.841e-02, 6.743e-02, 1.107e-01, 8.400e-02, -1.297e-02, -1.264e-01, -8.508e-02)); + r += mul(s2_0, M4(-2.131e-02, -2.104e-01, 1.638e-01, -8.293e-02, -9.037e-02, 4.916e-02, -1.957e-01, -8.879e-02, 9.205e-02, 1.654e-01, -1.031e-01, -2.214e-01, -1.743e-01, 1.449e-01, -4.730e-02, -6.000e-02)); + r += mul(s2_1, M4(-3.365e-01, -1.978e-01, 3.707e-02, 6.115e-02, -4.289e-02, -5.301e-02, -1.001e-02, 1.202e-02, 1.495e-01, 1.076e-01, -5.975e-02, 1.433e-02, 6.840e-02, -1.202e-01, 3.306e-02, -1.025e-01)); + r += mul(s2_2, M4(3.111e-02, 1.102e-01, -4.688e-02, -1.577e-01, -2.359e-02, -1.470e-02, -4.882e-02, -3.525e-02, -2.976e-02, -1.291e-01, -4.188e-02, -4.209e-02, -8.532e-02, -8.075e-02, 5.718e-02, -6.961e-02)); + r += mul(s2_3, M4(1.919e-02, -1.528e-01, -2.901e-01, -8.766e-02, -4.717e-02, -6.101e-02, 3.063e-01, -2.145e-01, -4.494e-02, -1.846e-02, -1.263e-01, -3.688e-02, 2.173e-01, 2.255e-02, -8.102e-02, -7.545e-02)); + r += mul(s2_4, M4(7.429e-02, 1.561e-02, -2.923e-01, 2.937e-01, 2.279e-01, 6.875e-02, 4.931e-02, 1.392e-01, 1.645e-01, 2.231e-03, 9.785e-02, -3.869e-02, 1.152e-02, 4.158e-02, 4.528e-02, 7.134e-03)); + r += mul(s2_5, M4(2.593e-01, 1.893e-01, -2.803e-01, 3.636e-02, 7.413e-02, -4.588e-02, 5.632e-02, -1.740e-01, 1.797e-01, -5.844e-02, 2.958e-02, 1.210e-02, 6.115e-02, -1.162e-01, 4.693e-02, -3.177e-02)); + r += mul(s2_6, M4(-4.160e-02, 7.391e-02, -9.092e-02, -2.082e-01, 8.563e-04, 1.162e-01, -8.575e-02, -9.850e-02, -1.915e-02, 3.551e-03, 2.256e-01, 3.933e-02, -1.784e-01, -5.231e-02, 5.357e-02, 5.941e-02)); + r += mul(s2_7, M4(-1.422e-01, -1.924e-01, -5.101e-01, 2.173e-01, 1.098e-01, -8.625e-02, -1.524e-01, 1.452e-01, 9.209e-02, 4.612e-02, 8.386e-02, 1.956e-02, 1.502e-02, 1.187e-01, -5.087e-02, 5.047e-02)); + r += mul(s2_8, M4(4.191e-01, 3.144e-01, -2.598e-01, -1.059e-01, -3.728e-02, -1.192e-01, 2.195e-01, 2.741e-01, 1.262e-01, 1.995e-02, 4.819e-03, -1.496e-01, -4.040e-02, -5.422e-02, -2.942e-02, 6.987e-02)); + r += mul(s3_0, M4(2.280e-02, 1.997e-02, 2.485e-02, 7.311e-03, 4.967e-02, -2.036e-01, 1.536e-01, -1.270e-02, 3.613e-02, -1.530e-01, -7.195e-02, -8.008e-02, -1.026e-01, 1.341e-01, -1.314e-01, -9.852e-02)); + r += mul(s3_1, M4(-3.465e-02, 3.304e-02, 6.561e-02, 1.011e-03, -1.050e-01, -3.483e-02, 8.504e-03, -1.852e-01, 1.206e-01, 3.555e-03, -9.008e-02, 6.713e-02, 1.782e-01, -2.761e-04, 1.040e-01, 1.370e-02)); + r += mul(s3_2, M4(-2.094e-02, -5.554e-02, -8.848e-02, -5.421e-03, 1.241e-01, 1.073e-01, -7.738e-02, 2.719e-02, 1.018e-01, 5.091e-02, 2.561e-02, -1.949e-01, 1.462e-01, -1.130e-01, -5.079e-02, -2.196e-01)); + r += mul(s3_3, M4(-4.744e-02, -1.533e-01, -1.130e-01, 1.053e-01, -6.196e-02, -2.036e-02, -1.566e-01, 5.937e-03, 5.398e-02, 1.856e-01, 5.320e-02, 1.518e-01, 1.420e-01, -2.743e-01, 2.931e-01, -2.954e-01)); + r += mul(s3_4, M4(1.409e-01, -3.840e-02, -8.466e-02, -2.254e-03, 4.529e-02, 1.144e-02, -4.301e-02, -2.002e-02, -6.700e-02, 7.169e-03, 6.365e-03, -1.614e-01, 1.332e-01, 1.322e-01, 1.185e-02, 2.030e-01)); + r += mul(s3_5, M4(-2.429e-02, -4.346e-03, 6.631e-02, -5.519e-02, 1.193e-01, 1.089e-01, 2.066e-02, -7.436e-02, 1.470e-01, 1.749e-02, -4.831e-02, 2.142e-02, 1.873e-01, 3.743e-02, 1.066e-01, 3.061e-02)); + r += mul(s3_6, M4(-2.675e-02, 2.948e-03, -6.466e-02, 4.417e-02, -2.908e-02, 1.421e-01, 1.190e-02, -2.533e-02, -1.258e-01, -4.587e-02, -5.339e-03, -3.764e-02, 2.061e-01, -1.013e-01, 4.204e-02, 2.417e-01)); + r += mul(s3_7, M4(6.761e-02, -3.450e-03, 6.839e-02, 5.766e-02, 3.136e-02, 4.135e-02, 3.988e-02, 2.941e-02, -2.604e-02, -7.398e-02, -8.330e-02, -6.429e-02, -2.953e-01, -3.694e-02, -9.535e-02, 4.862e-02)); + r += mul(s3_8, M4(-9.741e-02, 1.621e-02, 1.165e-01, 2.534e-02, -5.319e-02, -6.189e-03, -1.302e-01, 1.306e-01, 7.124e-02, 1.972e-02, -1.041e-01, -9.609e-02, -1.352e-01, 1.664e-01, 2.183e-01, -1.409e-01)); + r += mul(s4_0, M4(1.180e-02, 7.883e-02, -4.791e-02, -1.474e-03, 1.532e-02, 1.588e-01, 1.788e-01, -3.478e-02, 1.967e-01, 2.111e-01, 1.125e-01, 7.545e-03, 3.395e-01, -1.968e-01, 3.471e-01, -6.706e-02)); + r += mul(s4_1, M4(-6.497e-03, -5.378e-02, 1.254e-01, -9.081e-02, -4.558e-02, 2.297e-01, 5.248e-02, -6.681e-02, 5.794e-02, -1.210e-01, 3.244e-01, -2.096e-01, 9.240e-02, -1.008e-01, 2.173e-01, 1.466e-01)); + r += mul(s4_2, M4(4.711e-02, 1.109e-01, 4.282e-02, 5.398e-03, -3.371e-03, -3.552e-02, -2.389e-02, 2.334e-02, -7.598e-03, -3.631e-02, 1.836e-01, -1.318e-01, -1.984e-02, -2.181e-02, 2.962e-01, 1.040e-02)); + r += mul(s4_3, M4(-4.528e-02, -1.030e-01, 2.697e-02, 8.268e-02, 3.725e-02, 1.390e-01, 1.037e-01, -2.451e-02, 1.553e-01, 4.668e-02, -1.755e-01, -1.063e-01, -3.500e-02, -2.009e-01, -1.195e-01, 3.388e-01)); + r += mul(s4_4, M4(-4.469e-02, -1.694e-01, -1.762e-01, 2.289e-01, 3.673e-02, -1.784e-02, 3.723e-02, -6.764e-02, 3.353e-01, 1.479e-02, -7.523e-02, 5.749e-02, 2.422e-01, 2.620e-01, -2.914e-02, 4.852e-02)); + r += mul(s4_5, M4(-2.729e-03, -1.220e-01, -1.255e-01, 8.206e-02, -1.935e-02, 8.960e-02, -1.099e-02, -9.541e-02, 1.033e-01, -2.499e-01, -3.623e-01, 1.030e-03, 1.350e-01, 4.517e-02, 1.837e-01, 1.359e-02)); + r += mul(s4_6, M4(-1.412e-02, 5.391e-02, 5.106e-02, 3.886e-02, -3.444e-03, 5.329e-02, 4.036e-02, 1.804e-01, -1.043e-01, 1.357e-01, 2.349e-01, -3.465e-02, 1.738e-01, 5.530e-02, -3.362e-01, -1.475e-01)); + r += mul(s4_7, M4(3.751e-02, -7.403e-02, -3.850e-02, -1.265e-03, -6.263e-02, 8.607e-02, -1.028e-02, -1.403e-01, 6.326e-02, -1.558e-01, 1.075e-01, 1.408e-01, -2.220e-01, -9.187e-02, -1.448e-01, 1.872e-01)); + r += mul(s4_8, M4(-1.246e-01, -2.591e-02, -1.611e-01, -9.790e-02, -1.941e-02, -6.551e-03, -5.051e-02, -5.462e-02, -2.144e-01, 1.762e-02, 2.371e-01, 4.996e-02, -3.406e-01, 1.177e-01, -2.264e-01, -8.656e-02)); + r += mul(s5_0, M4(1.343e-03, -3.725e-02, -1.066e-01, -1.740e-02, 6.081e-02, 1.362e-01, 3.578e-02, 2.253e-01, -9.466e-02, -9.187e-02, -1.175e-02, -8.719e-02, 2.989e-02, -7.776e-02, -6.628e-02, 8.013e-02)); + r += mul(s5_1, M4(1.604e-01, -1.780e-02, 1.005e-02, -5.130e-02, -7.391e-02, -1.475e-01, -1.789e-01, 9.968e-02, -4.946e-02, -1.164e-01, 1.152e-01, 1.142e-01, 1.409e-01, 3.844e-02, -2.048e-02, 6.226e-02)); + r += mul(s5_2, M4(1.160e-01, -5.686e-04, -4.562e-03, -1.512e-01, -2.057e-02, 7.273e-02, -5.500e-02, -1.783e-01, -1.018e-01, 1.135e-01, -1.292e-01, 1.754e-02, 2.182e-02, -5.689e-02, 8.034e-02, -4.859e-02)); + r += mul(s5_3, M4(7.867e-02, -3.518e-03, 1.173e-01, -1.195e-02, 1.984e-01, -5.090e-02, 1.352e-02, -5.604e-02, -2.063e-02, 1.019e-01, -7.606e-02, 5.175e-02, 2.911e-02, -5.707e-02, -7.261e-02, -3.138e-02)); + r += mul(s5_4, M4(-1.652e-01, -8.234e-02, -3.650e-02, 9.660e-02, 7.855e-02, -1.732e-02, 3.844e-02, 6.549e-02, 4.526e-02, -9.386e-02, -1.017e-01, 4.589e-02, -8.000e-05, 1.011e-01, 9.537e-02, -1.192e-01)); + r += mul(s5_5, M4(1.697e-02, -7.522e-03, -6.139e-02, 1.325e-01, 1.054e-02, -1.900e-02, 4.979e-02, -1.371e-02, 1.106e-01, -1.330e-03, 2.616e-03, 1.090e-01, -5.065e-02, 1.158e-02, -9.399e-02, 3.210e-02)); + r += mul(s5_6, M4(-3.785e-02, -2.064e-02, 1.184e-01, -1.578e-01, 1.431e-01, -7.638e-02, -7.632e-02, -7.275e-03, -2.357e-03, 6.810e-02, -4.248e-02, 7.840e-02, -6.778e-02, 6.966e-02, -4.366e-02, -1.338e-01)); + r += mul(s5_7, M4(4.235e-02, 5.252e-02, 5.567e-02, -5.948e-02, -3.842e-02, 1.416e-02, 6.482e-02, 5.589e-02, -4.599e-02, -2.528e-03, 4.268e-03, -5.436e-02, -5.918e-02, 1.537e-02, 1.195e-01, 2.206e-02)); + r += mul(s5_8, M4(-1.554e-01, -9.753e-03, 1.619e-01, 4.940e-02, 2.986e-02, 2.573e-02, 1.149e-02, -5.308e-02, 1.188e-02, 2.052e-02, 1.330e-02, -7.705e-02, -5.218e-02, 3.419e-02, 9.731e-02, -8.245e-03)); + r += mul(s6_0, M4(-1.272e-01, 2.994e-02, 6.812e-02, -1.304e-01, -1.582e-01, -1.328e-02, -1.314e-01, 1.909e-01, -9.384e-02, 1.006e-01, 1.616e-01, 6.443e-02, -1.253e-02, 2.781e-01, 1.011e-01, -9.925e-03)); + r += mul(s6_1, M4(1.135e-01, -9.899e-02, -1.533e-01, 8.067e-02, -2.713e-02, 1.412e-01, -2.803e-01, -6.846e-02, -2.906e-02, 3.917e-02, 3.451e-02, -1.968e-01, -1.413e-01, 2.291e-01, -1.214e-01, 6.061e-03)); + r += mul(s6_2, M4(8.897e-02, 8.721e-02, 3.431e-01, 6.751e-02, -2.026e-01, -1.703e-01, -2.079e-01, 8.543e-02, 3.969e-02, 7.591e-02, 9.177e-02, 1.330e-01, -1.698e-01, 1.654e-01, -1.421e-01, 2.989e-02)); + r += mul(s6_3, M4(-1.355e-01, -1.909e-01, 1.446e-02, -7.383e-03, -2.487e-02, 5.117e-02, -2.610e-01, -1.720e-02, -6.448e-02, -7.445e-02, -5.439e-02, 7.059e-02, 8.874e-03, 2.675e-01, 1.977e-02, 1.241e-02)); + r += mul(s6_4, M4(-2.034e-01, -3.518e-02, -5.094e-02, 1.420e-01, -1.284e-01, -4.634e-02, -1.887e-01, -2.672e-01, -1.703e-02, -1.749e-01, -6.780e-02, 6.431e-02, -9.908e-02, 1.532e-01, 2.047e-01, 9.582e-02)); + r += mul(s6_5, M4(-3.252e-02, 5.439e-02, -8.179e-02, -2.995e-02, 7.181e-02, -1.978e-01, -6.903e-02, 1.071e-01, -2.747e-02, -1.366e-01, 2.972e-02, 1.530e-02, 1.017e-01, -8.830e-03, 3.876e-04, -8.333e-02)); + r += mul(s6_6, M4(-1.410e-01, 2.223e-01, 1.674e-01, 2.109e-01, 8.660e-03, -1.001e-01, -6.640e-02, 8.090e-02, -3.113e-02, -7.455e-02, -4.265e-02, 5.721e-02, -4.509e-02, -2.046e-02, 1.302e-02, -1.582e-01)); + r += mul(s6_7, M4(2.310e-02, 4.775e-02, -7.455e-02, -2.721e-01, 8.084e-04, -7.578e-02, 5.419e-02, 1.823e-01, 1.182e-01, -4.500e-02, -6.240e-02, 1.592e-01, -1.012e-01, -4.963e-02, 2.983e-02, -3.703e-02)); + r += mul(s6_8, M4(4.231e-02, -6.410e-02, 2.523e-01, 1.876e-01, 2.866e-02, 1.888e-02, 7.973e-02, -1.213e-01, -1.863e-02, -4.818e-03, -3.015e-02, 4.286e-02, 1.226e-02, -6.055e-02, -7.081e-02, -3.247e-02)); + r += mul(s7_0, M4(2.255e-02, 1.087e-01, -1.311e-01, -1.097e-01, 4.896e-02, -1.972e-02, 1.006e-01, 1.179e-01, -4.401e-02, 5.579e-02, 4.111e-02, 1.389e-02, 1.450e-01, -1.107e-01, 8.167e-02, 2.141e-02)); + r += mul(s7_1, M4(8.651e-02, -4.113e-02, -5.502e-02, 8.078e-02, -6.702e-02, -8.295e-02, 8.445e-02, 3.853e-02, -7.218e-02, 9.200e-03, 7.979e-02, -5.762e-02, 5.357e-02, -3.144e-02, -4.562e-02, 9.623e-03)); + r += mul(s7_2, M4(6.184e-03, 7.383e-02, 3.246e-02, -4.805e-02, -6.375e-02, -9.116e-02, -2.184e-02, 1.442e-01, -1.226e-01, 1.353e-02, -1.435e-01, -1.307e-01, 5.528e-02, -6.102e-02, 8.355e-02, -1.100e-01)); + r += mul(s7_3, M4(-5.722e-02, -2.702e-03, -1.345e-01, -2.826e-02, -7.891e-02, 5.526e-02, 1.364e-01, -3.028e-03, -1.513e-01, 7.168e-02, -9.428e-03, -1.712e-01, 6.925e-02, -2.112e-02, -5.069e-02, 1.105e-01)); + r += mul(s7_4, M4(-1.807e-02, -2.998e-02, 2.074e-01, -3.249e-03, -1.228e-01, -1.524e-01, -3.277e-02, 2.149e-02, -1.580e-01, -7.356e-02, 1.138e-01, -6.868e-02, 5.897e-03, 4.738e-02, 8.964e-02, -1.103e-01)); + r += mul(s7_5, M4(6.567e-02, -2.314e-02, 5.409e-02, -5.161e-02, 2.199e-02, -2.075e-01, 3.238e-02, -2.085e-01, 1.615e-01, 7.379e-03, -8.971e-03, 1.529e-01, -4.548e-03, -2.031e-03, -9.448e-02, -1.690e-02)); + r += mul(s7_6, M4(-6.829e-02, 3.009e-02, 2.554e-02, 6.114e-02, 3.201e-02, -3.606e-02, 4.506e-02, -5.041e-02, -1.341e-01, 7.531e-02, 1.137e-01, 2.316e-02, -1.997e-02, -1.762e-01, -7.972e-02, -4.369e-03)); + r += mul(s7_7, M4(1.185e-01, -7.930e-02, 5.674e-02, -4.796e-02, 4.371e-02, 7.916e-02, 5.691e-02, 1.335e-01, 7.223e-02, 3.957e-02, 1.429e-01, -9.440e-02, 1.036e-01, -6.944e-02, -1.023e-02, 1.916e-02)); + r += mul(s7_8, M4(-1.116e-02, 4.448e-02, -1.403e-01, 1.527e-03, -1.705e-02, 1.049e-02, 9.845e-03, -1.456e-02, 4.949e-02, 5.920e-02, 1.153e-01, 1.217e-01, 1.128e-02, -3.924e-02, -5.223e-02, -2.814e-02)); + r += V4(1.050e-02, -3.156e-02, -8.312e-03, 6.905e-02); + return r; +} + +V4 f3(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-4.867e-02, -5.197e-02, 1.534e-02, -4.213e-02, -4.926e-02, 2.104e-01, -9.779e-02, -2.507e-01, 5.090e-02, 7.115e-02, -4.519e-02, 2.813e-02, 3.021e-01, 2.627e-02, 1.871e-01, -1.671e-01)); + r += mul(s0_1, M4(-1.230e-01, 1.430e-02, 8.499e-02, -2.918e-02, -5.297e-02, -1.011e-01, -2.859e-02, 1.525e-04, -7.938e-02, -1.685e-02, 2.875e-02, -7.803e-03, 2.980e-01, -1.973e-01, 1.285e-01, 1.956e-02)); + r += mul(s0_2, M4(1.857e-02, -8.956e-02, 4.124e-02, -1.190e-01, 6.922e-01, -5.653e-02, -2.747e+00, -1.397e+00, 4.512e-04, -4.355e-02, -7.532e-02, 8.435e-02, 8.140e-02, 1.354e-01, 2.064e-01, 7.384e-04)); + r += mul(s0_3, M4(4.223e-02, -2.270e-05, 8.174e-02, 4.525e-02, -2.709e-01, -3.039e-01, 3.262e-02, 6.482e-03, 2.639e-03, 3.351e-02, 2.799e-02, 2.269e-02, 1.039e-01, 7.289e-02, -1.397e-02, 1.272e-02)); + r += mul(s0_4, M4(-1.995e-02, -4.059e-02, -2.450e-02, -2.946e-02, 2.466e-01, 1.479e-01, 1.595e-01, -6.020e-02, -1.812e-02, -2.821e-02, -1.184e-01, -5.749e-02, -3.615e-01, 2.186e-01, -8.206e-02, 1.362e-01)); + r += mul(s0_5, M4(1.111e-01, 1.478e-01, 3.247e-02, -8.840e-02, -2.125e-01, 2.289e-01, -6.042e-02, -1.573e-01, 5.331e-02, 3.785e-02, -3.423e-02, -2.230e-02, -5.637e-02, 1.008e-01, 1.283e-01, 2.773e-01)); + r += mul(s0_6, M4(7.693e-03, 2.148e-02, 3.975e-02, -3.273e-03, 1.910e-01, 2.068e-02, 8.654e-02, -1.955e-01, -1.766e-02, -1.189e-01, -8.424e-02, 3.049e-02, -8.869e-02, -3.213e-01, -1.007e-01, -9.598e-02)); + r += mul(s0_7, M4(-7.415e-02, -6.800e-02, -6.287e-03, 3.431e-02, 2.036e-01, -7.898e-02, 9.472e-02, -3.371e-02, 1.412e-01, 1.044e-01, 5.694e-02, 1.724e-02, 1.776e-02, -1.814e-01, -6.565e-02, -2.985e-01)); + r += mul(s0_8, M4(1.124e-01, 1.099e-01, -1.031e-01, 7.196e-02, -1.338e-01, 1.914e-01, -1.861e-01, 4.604e-03, -9.489e-03, -1.205e-01, 6.328e-02, 1.043e-02, -8.468e-02, 2.194e-01, -1.679e-02, 4.313e-02)); + r += mul(s1_0, M4(1.964e-01, -5.630e-02, -6.981e-02, 7.879e-02, 1.014e-01, 6.166e-02, 5.840e-02, -7.727e-02, 4.637e-01, -1.051e-01, 4.454e-01, 5.713e-01, 6.147e-02, 5.523e-02, -1.295e-01, 1.058e-01)); + r += mul(s1_1, M4(2.160e-01, -1.344e-01, 1.974e-01, -3.814e-01, -5.308e-02, -6.718e-02, -5.522e-02, -1.466e-01, -4.706e-01, -2.553e-01, -1.625e-02, -3.204e-01, 4.533e-02, -3.726e-03, -2.634e-02, -4.952e-02)); + r += mul(s1_2, M4(-1.988e-02, -3.152e-01, -2.705e-01, -8.406e-03, 1.017e-01, -9.464e-02, 9.255e-02, -3.722e-02, 1.070e-01, -2.718e-01, -4.225e-01, -9.374e-02, -1.769e-02, 5.608e-03, 3.674e-02, -1.047e-01)); + r += mul(s1_3, M4(3.746e-01, 3.046e-03, -3.719e-01, 1.350e-01, -7.644e-02, 3.353e-03, 1.027e-01, -2.490e-02, 5.892e-01, -2.039e-01, -8.033e-02, -1.380e-02, 1.610e-01, -6.900e-02, -6.275e-02, -6.425e-03)); + r += mul(s1_4, M4(2.208e-01, -4.707e-02, -3.095e-01, -1.714e-01, 1.478e-01, -4.646e-02, -1.003e-01, -2.538e-02, 2.015e-01, -4.198e-01, -2.134e-01, 4.196e-01, 1.473e-02, -6.650e-02, 1.519e-01, 8.087e-03)); + r += mul(s1_5, M4(4.357e-02, 1.217e-01, -2.680e-01, 1.812e-01, 7.153e-02, -3.633e-02, 1.021e-01, 4.253e-02, -8.424e-01, 1.775e-01, 1.127e-01, 2.770e-01, 2.008e-02, 9.776e-03, 1.154e-01, -7.201e-02)); + r += mul(s1_6, M4(-2.616e-01, -2.362e-02, 9.223e-02, 1.190e-01, -6.313e-02, 5.472e-02, -7.627e-02, 1.430e-01, 2.428e-01, 1.364e-01, -4.211e-02, -7.360e-02, -2.196e-02, -4.156e-02, 1.096e-02, 9.701e-03)); + r += mul(s1_7, M4(7.828e-03, -4.790e-01, -6.233e-03, -2.202e-01, -1.206e-01, 9.250e-02, -5.049e-02, -2.543e-03, -3.836e-01, 2.872e-01, -1.163e-01, -1.762e-01, -6.531e-02, 1.423e-01, -1.852e-03, 4.767e-02)); + r += mul(s1_8, M4(2.448e-01, -7.609e-03, -7.481e-02, 2.388e-03, -7.668e-02, 5.488e-02, 2.885e-02, 1.482e-01, -2.660e-01, -1.742e-01, -6.981e-02, -2.010e-02, 5.693e-03, -9.158e-02, -1.314e-01, 5.001e-02)); + r += mul(s2_0, M4(-2.589e-01, 1.859e-01, -2.660e-01, 1.760e-01, 1.168e-01, -1.407e-01, 7.098e-02, -4.685e-03, 2.893e-02, 2.214e-01, 1.994e-01, 1.514e-02, -4.815e-02, -1.155e-01, -1.169e-01, -1.717e-02)); + r += mul(s2_1, M4(-1.254e-01, 1.755e-02, -2.098e-02, -5.563e-03, -7.331e-02, -4.930e-02, -4.675e-02, -2.075e-01, -9.922e-02, -6.976e-02, 4.046e-02, -9.828e-02, 9.790e-02, -6.473e-02, -1.184e-01, -7.581e-02)); + r += mul(s2_2, M4(2.077e-01, -1.477e-01, -4.115e-01, -1.527e-02, -1.842e-02, -2.502e-01, 1.818e-01, -1.264e-01, 3.775e-02, 1.694e-01, 8.082e-02, -2.606e-02, -4.469e-02, -2.510e-02, 4.211e-02, -3.362e-02)); + r += mul(s2_3, M4(1.471e-01, -2.066e-01, -2.028e-01, 3.669e-01, 1.146e-01, 5.714e-02, -4.225e-03, -1.538e-01, -6.134e-02, -1.076e-01, 1.210e-01, -5.962e-02, -5.265e-02, 8.768e-02, 5.668e-02, -1.023e-02)); + r += mul(s2_4, M4(-9.993e-02, -7.184e-02, -4.461e-02, -1.498e-01, 9.753e-02, 1.023e-01, 3.349e-01, 6.508e-02, 1.059e-01, 1.041e-01, 2.029e-01, -1.877e-01, 3.264e-02, -5.429e-02, -7.859e-02, 1.105e-01)); + r += mul(s2_5, M4(1.262e-02, 3.543e-01, 2.701e-02, 1.023e-01, 1.665e-01, 2.847e-02, -1.573e-01, 2.408e-01, -2.000e-01, 1.185e-02, 1.601e-01, -5.772e-02, 2.326e-01, 2.310e-01, 8.624e-02, 7.525e-04)); + r += mul(s2_6, M4(-2.438e-01, 1.119e-01, -1.388e-01, -4.616e-03, -1.179e-01, -1.265e-01, -2.000e-01, 2.295e-02, 1.358e-02, -1.272e-01, 1.886e-02, 2.249e-01, 5.756e-02, 2.086e-01, 1.538e-02, 5.748e-02)); + r += mul(s2_7, M4(-1.796e-02, -1.771e-01, 1.848e-02, 4.765e-02, -1.709e-01, 1.274e-01, -1.274e-01, 1.016e-02, 4.295e-02, 4.648e-02, 1.067e-01, 9.483e-02, -7.017e-02, -3.615e-02, -3.152e-02, 2.260e-02)); + r += mul(s2_8, M4(3.672e-01, 5.534e-02, -2.330e-01, -2.461e-01, -3.854e-02, 1.713e-01, 6.842e-03, 3.879e-01, 1.905e-01, 1.151e-01, -4.301e-02, -1.332e-01, 1.137e-02, -1.343e-01, -2.136e-02, 5.372e-03)); + r += mul(s3_0, M4(-6.807e-02, 2.391e-02, 1.462e-02, 1.118e-01, 6.041e-02, -4.362e-02, -1.058e-02, 1.364e-01, 1.872e-01, 8.151e-02, -3.826e-02, -1.238e-01, 6.197e-02, -9.422e-02, 2.467e-01, -2.102e-01)); + r += mul(s3_1, M4(6.616e-03, -1.001e-01, 7.494e-02, -9.462e-04, -5.799e-02, 1.314e-01, -4.394e-03, -3.465e-03, 4.980e-03, -4.246e-02, -4.996e-02, -1.167e-01, 1.994e-01, 8.534e-02, -4.727e-02, 1.655e-01)); + r += mul(s3_2, M4(-1.278e-01, 1.321e-01, -9.006e-03, 1.384e-01, 5.992e-02, 7.091e-02, 1.501e-01, -5.937e-02, -4.941e-03, -1.158e-01, -5.998e-02, -2.486e-02, -1.105e-01, 1.812e-03, -1.348e-01, -1.650e-02)); + r += mul(s3_3, M4(9.376e-02, -1.023e-01, 4.212e-02, -1.545e-02, -6.994e-03, -3.425e-02, 1.686e-01, -1.371e-01, -1.737e-01, -1.316e-02, -5.657e-02, 1.056e-01, 7.410e-02, -1.012e-01, 3.571e-03, 2.081e-01)); + r += mul(s3_4, M4(-2.418e-02, 1.363e-01, -1.405e-01, -1.319e-01, 1.411e-02, -2.162e-02, 2.907e-03, -8.183e-02, 1.188e-01, 1.219e-01, -4.666e-03, -8.269e-02, -2.099e-01, -1.123e-01, 8.460e-02, 2.129e-02)); + r += mul(s3_5, M4(-3.303e-02, -1.845e-03, -1.138e-01, 7.996e-02, 7.868e-02, -4.075e-02, -5.790e-02, -9.637e-02, 1.098e-02, -2.270e-01, 1.366e-01, 1.204e-01, -5.277e-03, 5.143e-02, 1.918e-02, -5.697e-02)); + r += mul(s3_6, M4(-1.092e-02, -3.216e-02, 5.721e-02, -6.585e-02, -1.009e-01, -4.632e-02, -7.862e-02, 1.653e-01, 5.131e-02, -3.722e-03, 1.728e-01, -9.095e-02, -1.789e-01, 1.442e-01, -4.662e-02, 3.658e-02)); + r += mul(s3_7, M4(1.101e-02, -1.593e-02, -1.144e-01, 7.734e-02, -1.481e-01, 4.628e-02, -8.941e-02, -7.569e-03, -2.673e-02, 1.117e-01, 7.346e-02, -4.990e-02, -2.966e-01, 9.371e-02, 2.772e-01, -2.145e-02)); + r += mul(s3_8, M4(7.676e-02, -5.079e-03, 6.983e-02, -9.453e-02, -8.591e-02, 8.574e-02, -9.288e-02, 4.522e-02, -3.042e-02, -2.422e-02, -3.078e-02, 3.838e-02, -1.997e-01, 3.532e-02, -2.855e-01, 9.401e-02)); + r += mul(s4_0, M4(-1.704e-01, -5.635e-02, -4.514e-02, 1.377e-01, -5.299e-02, -1.445e-02, -9.418e-02, -8.632e-02, 7.442e-02, 3.310e-01, 7.629e-02, 3.254e-02, 1.062e-01, -2.861e-01, 1.315e-01, -1.645e-01)); + r += mul(s4_1, M4(4.894e-02, 1.057e-01, -1.611e-01, -1.634e-01, 2.585e-02, 5.547e-02, 3.944e-02, 2.779e-02, 8.338e-02, 5.388e-02, 3.696e-02, 1.097e-03, -9.750e-02, -2.696e-01, 1.603e-02, -2.061e-02)); + r += mul(s4_2, M4(2.440e-02, 6.216e-02, -4.641e-03, 6.110e-02, 6.277e-02, -6.637e-03, 2.735e-02, 7.741e-02, 1.263e-01, 6.328e-02, 1.572e-01, -1.274e-01, -6.511e-03, 6.195e-02, 6.708e-02, -6.191e-02)); + r += mul(s4_3, M4(3.447e-01, 1.650e-01, 8.541e-02, 5.321e-02, 1.518e-01, 3.891e-02, 8.751e-02, 1.890e-01, 8.485e-02, 1.050e-01, 7.165e-02, 7.063e-02, 1.793e-01, 1.331e-01, -4.657e-01, -1.884e-01)); + r += mul(s4_4, M4(-2.046e-01, -1.057e-02, 1.325e-02, 1.328e-02, -6.494e-02, -5.777e-03, -2.663e-02, -5.531e-02, -6.887e-02, -1.272e-02, 8.530e-02, -9.672e-02, -2.877e-01, 1.913e-01, 1.664e-01, -3.438e-02)); + r += mul(s4_5, M4(2.999e-02, -1.264e-01, 4.113e-02, 9.133e-04, -1.103e-01, -2.734e-02, 8.656e-02, -4.796e-02, -1.031e-01, -5.929e-04, -2.045e-01, 1.844e-01, 1.026e-01, 1.939e-02, -2.593e-01, 1.734e-02)); + r += mul(s4_6, M4(7.705e-02, -5.389e-02, -5.880e-02, 9.477e-02, 1.908e-02, -3.981e-02, 1.341e-02, 5.069e-02, -5.309e-02, 6.803e-02, 1.399e-01, 1.974e-01, -2.990e-02, -3.216e-01, -7.345e-03, 1.540e-01)); + r += mul(s4_7, M4(1.846e-02, -8.625e-02, -8.892e-02, 3.352e-01, -9.511e-02, -4.309e-02, -6.184e-02, -1.939e-01, -5.934e-02, 9.256e-02, -6.655e-02, -1.265e-01, -3.136e-01, -9.817e-02, 2.529e-02, -2.793e-02)); + r += mul(s4_8, M4(1.994e-01, 2.776e-01, -1.158e-01, -3.117e-02, -4.502e-02, -8.706e-02, 7.736e-02, 8.342e-02, 2.195e-01, -1.207e-01, -1.143e-02, -4.740e-01, 1.024e-01, 3.412e-02, -8.559e-02, 8.561e-02)); + r += mul(s5_0, M4(-1.424e-01, -3.827e-02, 9.982e-03, 1.728e-01, -1.270e-02, 6.425e-02, 7.333e-02, 1.429e-01, -5.168e-02, -3.531e-03, -1.018e-01, -7.135e-02, 1.500e-02, -4.705e-02, 1.095e-03, 5.302e-02)); + r += mul(s5_1, M4(1.636e-01, -1.645e-01, 4.886e-02, 2.773e-02, 7.834e-02, -2.487e-02, 2.299e-02, 1.313e-01, -2.820e-02, -1.568e-01, 8.729e-02, 8.737e-02, 9.738e-04, -5.445e-04, 5.576e-02, -4.024e-02)); + r += mul(s5_2, M4(5.442e-02, 1.993e-04, -1.460e-01, -1.173e-01, -9.994e-02, 4.632e-02, 5.769e-02, 1.391e-01, -1.149e-01, 6.631e-03, 6.934e-02, 3.662e-02, -4.205e-02, 1.630e-02, -1.077e-01, 7.098e-02)); + r += mul(s5_3, M4(4.663e-02, -6.306e-02, 4.831e-02, 2.122e-02, -2.886e-02, 2.370e-01, 3.475e-02, -5.125e-02, 4.117e-02, -2.344e-02, -1.420e-02, -6.763e-03, 9.431e-02, -6.717e-02, -9.945e-02, -1.036e-01)); + r += mul(s5_4, M4(-2.250e-01, -6.616e-02, -1.702e-02, 1.078e-01, -8.410e-03, 2.029e-01, -1.195e-01, -1.684e-02, 4.381e-02, -1.808e-02, -7.171e-02, 1.174e-01, -1.759e-01, -2.192e-02, 1.143e-01, -5.823e-02)); + r += mul(s5_5, M4(-1.406e-01, -2.651e-02, 2.532e-02, 1.900e-01, 4.971e-02, -1.710e-02, -5.660e-02, 1.032e-01, 3.520e-02, 3.673e-02, 9.979e-02, -7.656e-02, -3.376e-02, 1.289e-02, -9.658e-03, -5.253e-02)); + r += mul(s5_6, M4(8.909e-02, 1.214e-01, 4.088e-02, -7.486e-02, 6.216e-02, 6.290e-02, 4.715e-02, -3.857e-03, -4.435e-02, 1.425e-01, -8.248e-02, 8.130e-02, -2.014e-01, 1.266e-01, -5.059e-02, -2.273e-02)); + r += mul(s5_7, M4(-6.331e-02, 8.323e-02, -7.675e-02, -2.001e-01, 6.727e-02, 8.620e-02, 2.074e-02, 6.153e-02, 9.192e-02, 1.586e-02, -2.733e-02, 1.233e-01, 2.027e-01, 6.006e-02, -2.490e-02, -1.344e-01)); + r += mul(s5_8, M4(-1.838e-02, -7.457e-02, -5.620e-02, 1.654e-01, -6.773e-02, 8.304e-04, -6.201e-03, 1.674e-01, 7.353e-02, 7.026e-03, -9.155e-02, -1.844e-02, -1.289e-01, 1.754e-02, -9.762e-02, 2.202e-02)); + r += mul(s6_0, M4(-4.472e-03, -1.005e-01, 2.258e-01, -9.578e-02, 1.777e-01, -3.474e-02, 3.183e-02, 6.274e-02, -5.911e-03, -1.968e-02, 1.346e-01, -2.485e-02, -2.839e-02, 6.432e-02, -1.317e-02, -1.667e-01)); + r += mul(s6_1, M4(1.821e-02, 1.915e-01, -2.842e-02, -8.619e-02, -7.271e-02, -2.150e-01, 1.525e-01, -3.161e-01, 6.814e-02, 2.463e-02, -1.319e-02, 1.482e-02, -7.062e-02, 6.184e-02, 9.224e-02, -2.110e-02)); + r += mul(s6_2, M4(2.366e-02, 2.179e-01, -2.260e-01, -4.090e-02, 3.450e-02, -2.221e-01, -1.917e-01, -1.253e-03, 2.459e-02, -3.095e-02, -2.960e-02, 6.917e-02, 1.787e-02, -6.407e-02, -1.363e-01, 1.354e-02)); + r += mul(s6_3, M4(7.358e-02, -1.112e-01, 1.565e-01, -3.123e-02, -2.158e-02, -4.314e-02, -3.589e-02, 4.137e-02, -6.222e-02, 4.665e-02, 1.050e-01, 8.966e-02, -2.252e-02, 5.703e-05, -2.254e-02, -1.032e-01)); + r += mul(s6_4, M4(1.371e-02, -1.477e-01, 3.052e-01, 6.823e-02, -5.356e-02, -1.059e-01, 1.759e-01, 1.190e-01, -9.110e-02, -2.838e-02, -1.095e-02, 9.377e-02, 3.022e-02, -2.750e-01, 1.233e-01, -8.033e-02)); + r += mul(s6_5, M4(-2.452e-02, 3.526e-02, -3.008e-01, -6.037e-02, 9.324e-02, -6.850e-02, -8.138e-02, 4.399e-02, -7.511e-02, 5.993e-02, 4.646e-02, 4.527e-02, 3.678e-02, 9.254e-02, -3.808e-02, -1.133e-01)); + r += mul(s6_6, M4(-1.469e-01, -6.462e-02, 3.747e-02, -2.681e-01, -1.403e-01, 2.458e-01, 3.866e-02, -2.417e-02, -8.566e-03, 8.890e-03, 4.941e-02, 4.937e-03, 3.387e-02, 4.419e-02, 9.334e-02, 3.426e-02)); + r += mul(s6_7, M4(-1.553e-01, 9.161e-02, -1.463e-01, -1.822e-01, -2.398e-01, 5.129e-02, 1.587e-01, -2.893e-02, -1.408e-01, 2.464e-01, -4.796e-02, -6.968e-02, 1.199e-01, 2.698e-02, -1.137e-02, -1.715e-01)); + r += mul(s6_8, M4(-1.989e-01, 7.418e-02, -2.803e-01, -7.758e-02, -6.718e-02, 1.768e-02, -2.800e-02, -6.137e-02, 1.191e-01, -1.811e-02, -1.433e-01, 1.586e-01, 1.840e-01, 4.482e-02, -3.477e-02, -4.043e-02)); + r += mul(s7_0, M4(6.616e-03, -7.259e-02, -3.522e-02, -2.314e-02, 1.343e-02, 9.060e-02, 3.314e-02, 2.074e-02, 6.596e-03, -3.655e-02, -7.397e-02, -8.277e-02, -2.683e-02, 7.246e-02, 4.985e-02, -1.649e-01)); + r += mul(s7_1, M4(2.994e-02, 3.844e-02, -2.174e-02, -6.217e-02, 1.322e-01, -5.597e-02, -8.560e-02, -3.968e-02, 3.835e-02, 9.182e-04, -7.721e-02, -4.019e-02, -1.608e-01, 6.102e-02, 4.120e-02, 4.026e-02)); + r += mul(s7_2, M4(5.433e-02, 7.448e-02, -6.959e-02, 3.255e-02, 2.247e-02, -2.882e-02, -7.430e-02, -6.994e-03, -3.539e-02, -9.467e-02, 4.148e-02, -1.225e-01, 1.195e-02, 8.160e-03, 1.256e-02, 1.419e-01)); + r += mul(s7_3, M4(-1.717e-01, 3.816e-02, 5.009e-02, -3.195e-02, -2.244e-02, 3.889e-03, 5.482e-03, -1.720e-01, 1.087e-02, -2.089e-01, 4.557e-02, -1.794e-01, -1.795e-03, 2.095e-02, 1.293e-01, -1.453e-01)); + r += mul(s7_4, M4(7.199e-02, -1.367e-01, 2.238e-01, -9.105e-02, -5.963e-02, 1.711e-01, 5.876e-02, 3.460e-02, -6.988e-02, 2.286e-02, -1.684e-01, -7.710e-02, -1.110e-01, -7.015e-03, -3.769e-02, 2.094e-01)); + r += mul(s7_5, M4(2.787e-02, -2.768e-02, -1.053e-01, 4.257e-02, -1.150e-01, -2.859e-02, 2.506e-02, -1.080e-01, 1.821e-01, 8.441e-02, -1.393e-01, -4.062e-03, 1.600e-01, 1.051e-01, -2.439e-02, -3.265e-02)); + r += mul(s7_6, M4(1.021e-01, 4.107e-02, -5.459e-02, -1.254e-02, -1.705e-02, -3.163e-02, 8.226e-02, 1.609e-01, 1.601e-01, -3.518e-01, 4.768e-03, 2.022e-01, -2.541e-01, 6.005e-02, 4.948e-02, 2.458e-01)); + r += mul(s7_7, M4(-1.719e-01, -4.408e-02, 1.150e-02, -3.852e-02, -8.845e-02, 7.843e-02, -1.203e-03, -1.014e-01, -9.808e-03, -1.778e-01, 2.647e-02, 5.050e-02, 2.294e-01, 1.987e-02, -1.390e-01, 1.359e-01)); + r += mul(s7_8, M4(5.449e-02, 1.212e-01, 1.297e-01, 8.956e-02, 1.642e-01, -1.450e-01, -8.208e-02, 1.213e-01, -2.843e-01, -2.460e-01, -6.178e-02, 1.192e-02, -4.585e-02, 1.380e-01, -3.861e-02, 9.575e-02)); + r += V4(-1.765e-02, -1.522e-02, -7.955e-02, -2.431e-02); + return r; +} + +void Pass4(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = Rmp8x8(tid.x) + blockStart; + uint2 size = GetInputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = (gxy + 0.5) * pt; + + V4 s0_0 = l0(-1.0, -1.0); + V4 s0_1 = l0(0.0, -1.0); + V4 s0_2 = l0(1.0, -1.0); + V4 s0_3 = l0(-1.0, 0.0); + V4 s0_4 = l0(0.0, 0.0); + V4 s0_5 = l0(1.0, 0.0); + V4 s0_6 = l0(-1.0, 1.0); + V4 s0_7 = l0(0.0, 1.0); + V4 s0_8 = l0(1.0, 1.0); + V4 s1_0 = -max(-s0_0, 0.0); + V4 s1_1 = -max(-s0_1, 0.0); + V4 s1_2 = -max(-s0_2, 0.0); + V4 s1_3 = -max(-s0_3, 0.0); + V4 s1_4 = -max(-s0_4, 0.0); + V4 s1_5 = -max(-s0_5, 0.0); + V4 s1_6 = -max(-s0_6, 0.0); + V4 s1_7 = -max(-s0_7, 0.0); + V4 s1_8 = -max(-s0_8, 0.0); + s0_0 = max(s0_0, 0.0); + s0_1 = max(s0_1, 0.0); + s0_2 = max(s0_2, 0.0); + s0_3 = max(s0_3, 0.0); + s0_4 = max(s0_4, 0.0); + s0_5 = max(s0_5, 0.0); + s0_6 = max(s0_6, 0.0); + s0_7 = max(s0_7, 0.0); + s0_8 = max(s0_8, 0.0); + + V4 s2_0 = l1(-1.0, -1.0); + V4 s2_1 = l1(0.0, -1.0); + V4 s2_2 = l1(1.0, -1.0); + V4 s2_3 = l1(-1.0, 0.0); + V4 s2_4 = l1(0.0, 0.0); + V4 s2_5 = l1(1.0, 0.0); + V4 s2_6 = l1(-1.0, 1.0); + V4 s2_7 = l1(0.0, 1.0); + V4 s2_8 = l1(1.0, 1.0); + V4 s3_0 = -max(-s2_0, 0.0); + V4 s3_1 = -max(-s2_1, 0.0); + V4 s3_2 = -max(-s2_2, 0.0); + V4 s3_3 = -max(-s2_3, 0.0); + V4 s3_4 = -max(-s2_4, 0.0); + V4 s3_5 = -max(-s2_5, 0.0); + V4 s3_6 = -max(-s2_6, 0.0); + V4 s3_7 = -max(-s2_7, 0.0); + V4 s3_8 = -max(-s2_8, 0.0); + s2_0 = max(s2_0, 0.0); + s2_1 = max(s2_1, 0.0); + s2_2 = max(s2_2, 0.0); + s2_3 = max(s2_3, 0.0); + s2_4 = max(s2_4, 0.0); + s2_5 = max(s2_5, 0.0); + s2_6 = max(s2_6, 0.0); + s2_7 = max(s2_7, 0.0); + s2_8 = max(s2_8, 0.0); + + V4 s4_0 = l2(-1.0, -1.0); + V4 s4_1 = l2(0.0, -1.0); + V4 s4_2 = l2(1.0, -1.0); + V4 s4_3 = l2(-1.0, 0.0); + V4 s4_4 = l2(0.0, 0.0); + V4 s4_5 = l2(1.0, 0.0); + V4 s4_6 = l2(-1.0, 1.0); + V4 s4_7 = l2(0.0, 1.0); + V4 s4_8 = l2(1.0, 1.0); + V4 s5_0 = -max(-s4_0, 0.0); + V4 s5_1 = -max(-s4_1, 0.0); + V4 s5_2 = -max(-s4_2, 0.0); + V4 s5_3 = -max(-s4_3, 0.0); + V4 s5_4 = -max(-s4_4, 0.0); + V4 s5_5 = -max(-s4_5, 0.0); + V4 s5_6 = -max(-s4_6, 0.0); + V4 s5_7 = -max(-s4_7, 0.0); + V4 s5_8 = -max(-s4_8, 0.0); + s4_0 = max(s4_0, 0.0); + s4_1 = max(s4_1, 0.0); + s4_2 = max(s4_2, 0.0); + s4_3 = max(s4_3, 0.0); + s4_4 = max(s4_4, 0.0); + s4_5 = max(s4_5, 0.0); + s4_6 = max(s4_6, 0.0); + s4_7 = max(s4_7, 0.0); + s4_8 = max(s4_8, 0.0); + + V4 s6_0 = l3(-1.0, -1.0); + V4 s6_1 = l3(0.0, -1.0); + V4 s6_2 = l3(1.0, -1.0); + V4 s6_3 = l3(-1.0, 0.0); + V4 s6_4 = l3(0.0, 0.0); + V4 s6_5 = l3(1.0, 0.0); + V4 s6_6 = l3(-1.0, 1.0); + V4 s6_7 = l3(0.0, 1.0); + V4 s6_8 = l3(1.0, 1.0); + V4 s7_0 = -max(-s6_0, 0.0); + V4 s7_1 = -max(-s6_1, 0.0); + V4 s7_2 = -max(-s6_2, 0.0); + V4 s7_3 = -max(-s6_3, 0.0); + V4 s7_4 = -max(-s6_4, 0.0); + V4 s7_5 = -max(-s6_5, 0.0); + V4 s7_6 = -max(-s6_6, 0.0); + V4 s7_7 = -max(-s6_7, 0.0); + V4 s7_8 = -max(-s6_8, 0.0); + s6_0 = max(s6_0, 0.0); + s6_1 = max(s6_1, 0.0); + s6_2 = max(s6_2, 0.0); + s6_3 = max(s6_3, 0.0); + s6_4 = max(s6_4, 0.0); + s6_5 = max(s6_5, 0.0); + s6_6 = max(s6_6, 0.0); + s6_7 = max(s6_7, 0.0); + s6_8 = max(s6_8, 0.0); + + t4[gxy] = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t5[gxy] = f1(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t6[gxy] = f2(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t7[gxy] = f3(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); +} + +//!PASS 5 +//!DESC conv4 +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 +//!IN t4, t5, t6, t7 +//!OUT t0, t1, t2, t3 + +#define l0(x, y) V4(O(t4, float2(x, y))) +#define l1(x, y) V4(O(t5, float2(x, y))) +#define l2(x, y) V4(O(t6, float2(x, y))) +#define l3(x, y) V4(O(t7, float2(x, y))) + +V4 f0(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-1.911e-01, 4.293e-02, -7.165e-02, -2.189e-01, 6.837e-02, 3.073e-02, -7.802e-02, 7.100e-02, -4.834e-02, -4.366e-02, 2.767e-02, 1.131e-01, 7.377e-02, 1.025e-01, 6.654e-02, -1.978e-01)); + r += mul(s0_1, M4(2.610e-01, -9.888e-03, -3.636e-02, -1.254e-01, 2.710e-02, -1.770e-03, 3.422e-02, 1.038e-01, 6.573e-02, -8.588e-02, -1.277e-01, 7.383e-02, 9.637e-02, -9.595e-02, -1.055e-01, 5.184e-02)); + r += mul(s0_2, M4(-4.114e-03, -1.705e-02, -1.095e-03, -4.263e-02, -1.645e-01, 3.551e-02, -6.546e-03, -1.143e-02, -1.965e-01, 8.983e-02, 2.647e-02, 2.088e-02, -8.941e-02, 1.012e-01, 6.557e-02, -8.384e-02)); + r += mul(s0_3, M4(-2.234e-02, 5.056e-02, -2.678e-02, 5.041e-02, 1.036e-01, 5.828e-02, 2.647e-02, 1.489e-02, -9.072e-02, -7.207e-03, -6.385e-02, -4.407e-02, 2.517e-01, 6.323e-02, -2.668e-02, 1.636e-01)); + r += mul(s0_4, M4(-8.313e-02, -1.719e-01, 7.980e-02, 4.337e-02, -1.653e-01, -6.344e-02, -1.659e-02, 3.679e-02, -9.873e-03, -8.276e-02, 8.539e-02, 1.783e-01, 2.292e-01, -8.759e-02, -2.398e-03, 2.628e-01)); + r += mul(s0_5, M4(9.412e-02, -7.811e-02, 2.076e-02, -1.257e-01, 1.631e-01, -2.990e-02, -3.103e-02, -9.241e-04, -1.431e-01, 6.844e-02, 3.843e-02, 9.549e-02, -1.608e-01, -6.787e-03, -2.569e-02, 1.675e-02)); + r += mul(s0_6, M4(-1.088e-01, -6.189e-02, -4.222e-02, 2.319e-02, 1.818e-02, 1.727e-02, -4.928e-02, 6.700e-02, 6.315e-02, 1.296e-02, 9.611e-02, 1.014e-02, 2.973e-03, 1.245e-03, 2.553e-01, 1.779e-02)); + r += mul(s0_7, M4(-3.605e-02, -5.594e-02, -9.233e-02, -4.208e-03, -7.568e-02, -4.813e-02, -2.752e-02, 3.998e-02, -1.366e-01, -4.549e-02, -2.460e-02, 1.400e-01, -9.195e-02, 4.020e-02, 6.491e-02, -1.215e-01)); + r += mul(s0_8, M4(4.148e-02, -3.769e-02, -9.859e-03, -2.839e-02, -9.498e-03, -6.769e-02, -4.398e-02, 5.395e-02, -1.100e-01, -3.161e-02, 1.902e-02, 1.477e-01, -1.482e-01, 3.158e-02, 3.634e-02, 2.209e-02)); + r += mul(s1_0, M4(1.445e-02, 8.049e-02, 2.826e-02, -2.931e-01, 1.958e-01, 1.026e-01, -8.516e-02, 1.093e-01, 1.909e-01, 2.248e-02, -6.748e-02, 3.476e-03, -3.636e-02, 3.906e-03, 8.562e-02, -2.096e-02)); + r += mul(s1_1, M4(9.437e-02, 1.674e-01, -5.992e-03, -2.529e-01, -1.090e-02, -1.137e-02, -3.747e-02, 3.806e-02, 7.053e-02, -1.197e-01, 1.002e-02, -9.692e-02, 3.400e-02, -1.558e-02, -1.905e-02, 9.034e-02)); + r += mul(s1_2, M4(7.877e-03, 9.344e-02, 1.036e-02, 1.783e-01, -7.734e-02, 6.793e-02, 5.569e-02, 1.347e-02, -1.236e-01, 2.216e-02, 1.008e-02, 1.481e-02, 4.541e-02, 7.055e-02, 7.153e-02, 1.067e-02)); + r += mul(s1_3, M4(1.127e-02, 1.351e-01, 6.345e-03, -2.964e-01, -9.091e-02, 2.207e-01, 9.727e-02, 8.008e-03, 3.675e-02, 4.381e-02, -7.209e-02, -2.023e-02, 1.003e-01, 1.810e-02, -1.049e-01, 9.784e-02)); + r += mul(s1_4, M4(2.354e-02, -1.543e-01, 1.898e-01, 9.106e-02, -7.247e-03, -5.448e-02, 3.855e-02, -2.363e-02, 7.327e-02, -2.247e-01, 1.712e-01, 1.105e-01, -1.091e-01, -1.434e-01, 1.633e-02, -2.095e-02)); + r += mul(s1_5, M4(2.805e-02, 9.803e-02, 8.733e-02, -3.386e-02, -7.457e-03, 3.605e-02, 7.829e-03, 7.178e-02, 1.123e-01, -9.636e-03, -1.486e-01, -4.111e-02, 5.418e-02, -8.534e-02, 2.637e-02, 2.664e-02)); + r += mul(s1_6, M4(-1.378e-02, 6.325e-02, 1.101e-02, -1.564e-02, 7.033e-02, 1.592e-01, -7.700e-02, 5.286e-02, -5.330e-02, -7.951e-02, -3.969e-02, 2.130e-02, -6.225e-02, -1.139e-02, -4.066e-02, 3.364e-02)); + r += mul(s1_7, M4(-3.912e-02, 4.691e-02, -1.572e-02, -5.204e-02, -9.345e-02, 2.114e-02, 7.954e-02, -3.320e-03, -1.472e-02, -6.786e-03, 1.106e-01, -1.127e-01, -5.276e-02, 8.257e-03, -7.303e-03, -3.415e-02)); + r += mul(s1_8, M4(8.577e-02, 2.541e-02, -2.907e-02, 4.950e-02, -6.884e-02, -8.209e-02, -1.475e-02, -1.545e-01, -7.352e-02, -2.567e-02, -5.289e-02, 5.263e-02, 3.229e-02, 2.618e-02, -1.540e-02, 9.362e-02)); + r += mul(s2_0, M4(3.062e-02, 1.857e-02, -8.636e-03, -1.682e-02, 5.537e-01, -3.514e-02, -9.186e-02, 2.693e-02, -3.343e-02, -7.040e-02, 1.051e-01, 6.563e-02, 3.258e-02, 3.417e-03, 1.605e-02, 1.267e-02)); + r += mul(s2_1, M4(-7.151e-02, 1.227e-01, -7.326e-02, 2.537e-02, -2.078e-01, 7.278e-02, 1.412e-01, -1.122e-01, 1.843e-01, -4.381e-02, 1.476e-02, 1.920e-01, 7.397e-02, 2.101e-02, -3.174e-02, 1.029e-01)); + r += mul(s2_2, M4(-6.594e-02, 1.115e-02, 6.316e-02, -5.414e-02, 4.450e-02, -2.294e-02, -2.767e-02, 6.729e-02, 3.957e-02, 7.448e-02, 1.265e-01, 2.011e-01, -1.474e-02, -2.215e-02, 1.555e-02, -8.592e-04)); + r += mul(s2_3, M4(1.156e-01, 1.432e-02, -7.871e-02, -1.026e-02, 1.357e-02, 3.515e-02, 5.604e-02, -2.915e-02, -3.069e-02, -8.177e-02, 1.823e-03, 1.532e-01, -1.250e-03, 5.676e-02, -4.616e-02, 1.024e-01)); + r += mul(s2_4, M4(9.017e-02, -3.800e-02, 8.001e-02, -9.478e-03, -2.834e-02, 7.740e-02, 3.474e-01, 3.802e-02, 2.971e-02, 1.012e-01, -4.683e-02, -8.751e-02, 1.497e-01, 3.183e-01, -2.329e-01, -7.118e-02)); + r += mul(s2_5, M4(1.648e-01, 4.245e-02, -7.537e-03, 1.075e-01, -1.819e-01, 2.302e-02, -7.246e-03, 8.852e-02, 3.767e-03, 4.556e-02, 5.827e-03, 1.754e-01, 3.513e-02, 1.574e-01, -1.155e-01, 5.588e-02)); + r += mul(s2_6, M4(5.341e-02, -1.367e-02, -7.464e-02, -6.560e-02, -1.519e-01, -1.422e-01, -5.583e-02, -3.300e-02, 7.439e-02, -1.706e-02, -5.464e-02, -4.118e-02, -9.160e-02, -1.090e-01, -1.034e-01, -9.711e-03)); + r += mul(s2_7, M4(-1.381e-01, -5.258e-02, 6.994e-02, 1.294e-02, 2.060e-02, 6.963e-02, 2.264e-02, -2.272e-02, -1.541e-01, -6.683e-03, -8.892e-02, 4.178e-02, 5.846e-02, -3.678e-02, -9.322e-02, -1.214e-01)); + r += mul(s2_8, M4(3.280e-02, 3.080e-02, -3.820e-02, 3.021e-02, -4.802e-02, 1.730e-02, 6.540e-02, 1.268e-01, -2.986e-02, -5.638e-02, -4.957e-02, 1.004e-01, -1.840e-01, 2.708e-02, -7.470e-02, 5.920e-02)); + r += mul(s3_0, M4(1.189e-01, 7.786e-02, -1.425e-02, 4.844e-02, -7.746e-02, 4.289e-02, 1.183e-01, 5.976e-02, 1.026e-01, -4.106e-02, 6.290e-02, -1.676e-01, 9.636e-02, -8.836e-03, 1.345e-01, 1.377e-01)); + r += mul(s3_1, M4(-1.363e-01, 7.409e-02, 9.795e-03, -9.447e-02, -8.569e-02, 1.214e-02, -8.428e-03, 5.571e-02, -1.615e-01, 6.046e-02, 1.770e-01, -5.997e-02, -1.165e-02, -7.313e-02, 5.458e-02, 1.325e-01)); + r += mul(s3_2, M4(-2.265e-01, -3.161e-02, -3.418e-02, -2.184e-02, -2.011e-02, -2.432e-02, 1.297e-02, 3.494e-02, 4.333e-02, 1.234e-02, 7.744e-03, 1.454e-03, 7.516e-02, -1.982e-02, 7.248e-02, 2.420e-02)); + r += mul(s3_3, M4(2.222e-02, 3.278e-02, 7.987e-02, 1.096e-02, 1.140e-02, 8.110e-03, -1.275e-02, -7.840e-02, -1.195e-01, 4.069e-02, -2.466e-04, 5.544e-02, -1.178e-01, 2.951e-02, -7.497e-02, -6.892e-02)); + r += mul(s3_4, M4(1.492e-01, -2.627e-02, -9.715e-03, -1.093e-01, 7.752e-02, 2.010e-02, 7.764e-02, -1.783e-01, -2.181e-02, 2.569e-01, 9.805e-02, -8.017e-02, -1.439e-01, 1.977e-01, -3.024e-01, -2.178e-01)); + r += mul(s3_5, M4(-2.819e-02, 4.856e-03, 3.206e-02, 4.678e-02, 1.187e-01, -6.616e-02, -1.151e-01, -3.546e-02, 6.754e-02, 1.009e-01, -7.493e-03, 2.946e-03, 1.973e-01, 1.871e-01, 8.823e-02, 1.684e-02)); + r += mul(s3_6, M4(8.810e-02, 8.072e-02, -4.034e-02, 4.030e-02, -5.572e-02, 9.288e-02, 9.060e-02, 3.320e-02, 8.505e-02, -1.192e-02, -9.003e-02, 5.440e-02, 3.771e-02, -9.408e-02, 5.702e-02, -5.567e-02)); + r += mul(s3_7, M4(1.188e-01, -3.642e-02, 7.194e-02, 4.704e-02, 9.579e-02, -1.549e-02, -5.090e-02, 1.119e-01, -4.576e-02, 6.161e-02, -1.018e-01, 4.477e-02, 3.698e-02, 3.252e-02, -1.882e-01, 1.689e-02)); + r += mul(s3_8, M4(-2.570e-01, 2.082e-03, -8.574e-02, 7.213e-03, -1.976e-02, 7.299e-02, 2.060e-02, -9.470e-03, -5.948e-02, -2.919e-02, 6.735e-02, 2.437e-04, 1.029e-01, 9.595e-02, -1.881e-02, -2.288e-02)); + r += mul(s4_0, M4(2.582e-02, -1.106e-01, -1.961e-01, -1.136e-01, 2.005e-02, 1.980e-03, 9.052e-02, -5.878e-02, 1.522e-02, 1.750e-02, -5.777e-03, 5.241e-02, 1.188e-01, -6.191e-02, -5.085e-02, 1.577e-02)); + r += mul(s4_1, M4(4.442e-02, -7.196e-03, 5.665e-02, 1.553e-02, -1.322e-01, -4.538e-02, -8.256e-03, 4.163e-02, 5.614e-02, -4.783e-02, 6.511e-03, -4.385e-02, -1.286e-01, 7.950e-02, 7.059e-02, -1.275e-01)); + r += mul(s4_2, M4(-1.467e-01, 1.017e-01, -7.759e-02, 3.511e-02, 9.203e-02, -2.830e-02, 1.622e-02, 5.200e-02, -4.604e-02, -1.184e-02, 1.596e-02, -7.837e-02, -3.537e-02, 7.057e-02, 8.211e-03, 9.773e-02)); + r += mul(s4_3, M4(-3.116e-01, 1.405e-01, -1.825e-01, -1.602e-01, 3.794e-03, 1.349e-02, 1.305e-03, -3.067e-02, -1.701e-01, -2.518e-02, 1.034e-01, 1.046e-02, -6.726e-02, 6.267e-02, -1.063e-02, -3.378e-03)); + r += mul(s4_4, M4(-1.171e-01, 4.148e-02, 5.117e-02, 7.748e-02, -6.945e-02, -1.305e-01, -2.528e-02, 7.143e-02, -3.070e-02, 7.727e-02, -4.977e-03, 7.770e-02, -5.829e-02, -2.211e-02, 1.441e-01, 2.339e-02)); + r += mul(s4_5, M4(-1.988e-01, 9.871e-02, 1.277e-01, 4.608e-02, 7.262e-02, -2.677e-03, -1.809e-02, -6.628e-03, 1.154e-01, -6.355e-02, -3.575e-02, -2.338e-02, 2.810e-01, 6.067e-02, 8.032e-02, -2.597e-02)); + r += mul(s4_6, M4(1.806e-01, 1.486e-01, 2.705e-01, 4.881e-02, -1.508e-01, -1.798e-03, 7.290e-02, 1.463e-02, -2.177e-01, -1.193e-02, -3.910e-02, 9.460e-02, -8.807e-02, -2.762e-02, -5.861e-02, -2.578e-02)); + r += mul(s4_7, M4(1.671e-01, 8.773e-02, -1.050e-01, 2.206e-01, 1.209e-01, 6.165e-03, -1.402e-01, 1.012e-02, 8.527e-02, -6.815e-02, -4.452e-02, -5.306e-02, -3.056e-02, -4.385e-02, -5.908e-02, 1.483e-02)); + r += mul(s4_8, M4(1.712e-01, -1.575e-01, -4.181e-02, -1.116e-01, -3.266e-04, -3.737e-02, -1.091e-01, 8.541e-02, -2.812e-02, 6.552e-02, 8.679e-02, 4.192e-02, -3.681e-02, 7.918e-03, -1.257e-02, -2.467e-03)); + r += mul(s5_0, M4(-8.263e-02, -6.845e-02, 9.966e-03, -1.256e-02, -9.009e-03, 9.184e-03, 5.524e-02, -5.402e-02, 2.346e-02, -6.712e-02, -1.016e-01, 5.388e-02, 4.347e-01, -2.237e-01, -1.300e-01, 4.637e-02)); + r += mul(s5_1, M4(8.672e-02, -6.151e-03, 2.086e-02, 6.444e-02, 2.230e-01, -5.404e-02, 3.705e-02, 9.646e-02, 3.340e-02, -1.704e-01, -1.833e-01, 9.220e-02, 2.407e-01, 5.851e-02, -1.318e-01, -4.974e-02)); + r += mul(s5_2, M4(-6.637e-02, 4.372e-02, 9.089e-02, -1.496e-02, -3.321e-01, 1.390e-01, 1.479e-01, -2.773e-01, 1.138e-01, 8.449e-02, 1.444e-01, -2.207e-01, -1.901e-01, 1.075e-01, -3.949e-02, -2.799e-02)); + r += mul(s5_3, M4(8.775e-02, 1.043e-01, -1.374e-02, 5.217e-02, 1.646e-01, 4.211e-02, 3.824e-02, 5.914e-02, 7.882e-03, -1.040e-01, 2.567e-02, 1.414e-01, -1.820e-01, 1.737e-01, 1.967e-01, -3.163e-02)); + r += mul(s5_4, M4(-1.284e-01, 7.496e-02, -2.371e-02, -2.662e-02, 2.125e-01, 2.143e-01, -2.473e-01, -2.820e-01, -1.093e-01, 9.356e-02, -3.271e-01, 4.151e-01, -4.591e-02, -1.298e-01, 1.714e-01, 1.069e-01)); + r += mul(s5_5, M4(-7.078e-03, 8.816e-02, -5.712e-02, 6.085e-03, -1.278e-01, -1.966e-01, 9.780e-02, -1.756e-01, 1.354e-01, -3.525e-01, -1.815e-01, -1.969e-02, -1.791e-02, -7.485e-02, 7.644e-02, 4.745e-02)); + r += mul(s5_6, M4(-8.955e-02, 2.475e-02, 9.383e-02, -7.093e-03, 3.655e-02, 5.342e-02, 7.128e-02, 2.780e-02, 3.943e-02, 3.385e-02, 2.130e-01, -1.660e-01, 1.458e-02, -8.553e-02, -1.646e-01, 7.980e-02)); + r += mul(s5_7, M4(1.467e-02, -4.959e-02, -2.671e-02, 3.923e-02, 1.022e-01, -1.061e-01, 1.377e-01, -1.619e-01, 6.276e-02, -2.224e-01, -1.624e-01, 3.056e-01, 1.421e-01, -6.040e-02, -8.337e-02, -7.135e-02)); + r += mul(s5_8, M4(1.780e-01, 9.652e-03, 1.017e-01, -8.695e-02, 8.021e-01, 1.471e-01, -9.219e-02, -2.656e-01, 5.916e-01, 2.761e-01, 2.245e-01, -1.467e-02, 2.326e-02, 1.662e-02, -4.968e-02, 2.504e-02)); + r += mul(s6_0, M4(1.436e-01, -3.030e-03, 9.921e-03, 7.837e-02, -1.959e-01, 1.429e-01, 2.338e-01, 3.925e-02, -1.750e-01, -7.659e-02, -1.538e-01, 9.592e-02, -7.076e-02, 1.303e-02, 7.885e-02, -1.405e-01)); + r += mul(s6_1, M4(1.935e-02, 8.829e-03, -2.350e-02, 8.725e-03, 4.762e-02, -2.891e-02, 9.243e-02, 1.887e-01, -6.199e-02, -2.533e-02, 1.109e-01, 2.641e-01, -2.384e-02, 1.634e-01, 6.726e-02, -1.385e-01)); + r += mul(s6_2, M4(-1.315e-01, 8.924e-02, 7.963e-02, -2.570e-03, -5.893e-02, 4.241e-02, -1.835e-02, 1.171e-01, 2.796e-01, 5.362e-02, -2.055e-02, 2.369e-01, -8.197e-02, -6.894e-02, -2.458e-02, -1.200e-01)); + r += mul(s6_3, M4(3.153e-02, 2.093e-02, 4.118e-03, -1.320e-02, -4.870e-03, -1.532e-01, 1.172e-02, 2.641e-04, -2.587e-01, 1.882e-02, 2.345e-01, -7.079e-02, -4.541e-01, 2.772e-02, -1.567e-01, 1.183e-01)); + r += mul(s6_4, M4(-7.829e-02, -4.471e-02, -1.744e-02, 2.243e-02, -7.376e-02, 1.616e-01, -1.833e-03, 1.263e-02, 2.839e-01, 6.697e-02, 1.050e-01, 1.745e-01, 3.243e-02, -3.538e-02, -6.101e-02, -4.361e-02)); + r += mul(s6_5, M4(1.262e-01, -8.569e-02, -3.884e-02, -2.852e-02, 1.949e-01, 5.632e-02, 9.793e-02, -6.019e-02, 1.199e-01, -2.750e-02, -5.027e-02, 1.635e-01, 6.961e-02, 4.372e-02, 7.290e-02, 5.485e-02)); + r += mul(s6_6, M4(-1.680e-01, -5.327e-02, -4.961e-03, 2.590e-02, 1.749e-01, 8.292e-02, 9.512e-02, 1.474e-01, 8.935e-02, 2.390e-02, 9.264e-02, 9.805e-02, -7.415e-02, -4.113e-02, -1.309e-01, 1.563e-01)); + r += mul(s6_7, M4(3.112e-02, -4.886e-02, 8.220e-02, -6.343e-02, -8.350e-02, -8.932e-02, -1.057e-01, -3.488e-02, -1.522e-01, 3.794e-02, 1.197e-01, 1.177e-01, -1.665e-01, -6.301e-02, -4.422e-02, 1.613e-01)); + r += mul(s6_8, M4(1.694e-01, -2.333e-02, -5.932e-02, -1.183e-02, -9.355e-02, -2.778e-03, 9.447e-02, 2.451e-02, 1.867e-01, 7.640e-02, 2.108e-01, -1.665e-02, 1.878e-01, 8.773e-03, -2.257e-01, 1.594e-01)); + r += mul(s7_0, M4(-8.965e-03, 2.624e-01, 1.210e-01, -1.458e-01, 8.647e-02, -1.773e-02, -2.364e-02, -1.276e-01, 5.775e-03, -9.750e-04, -1.712e-02, -6.345e-02, -6.886e-03, 1.129e-01, 1.148e-01, 2.896e-03)); + r += mul(s7_1, M4(1.351e-01, -1.312e-01, -4.994e-02, -2.724e-01, 2.359e-01, 1.263e-02, 9.888e-02, 2.917e-02, 8.381e-02, 2.099e-02, 3.319e-02, -7.182e-03, -3.381e-02, -4.513e-03, -1.517e-01, 2.118e-02)); + r += mul(s7_2, M4(-3.996e-01, -1.398e-02, -7.864e-02, 2.525e-02, -1.230e-01, 7.733e-02, -1.769e-02, 5.334e-02, 1.540e-02, -3.895e-02, 3.792e-03, -7.897e-02, 4.750e-02, -7.005e-02, 4.263e-02, -4.919e-02)); + r += mul(s7_3, M4(-2.755e-02, -4.463e-02, -6.112e-02, 6.444e-02, -1.315e-02, -8.691e-02, -8.237e-02, -7.589e-02, -6.343e-02, -4.937e-02, 3.279e-02, 3.611e-02, -1.459e-01, 4.092e-02, 8.283e-02, 1.265e-01)); + r += mul(s7_4, M4(4.206e-02, 1.399e-01, -4.043e-01, -1.555e-01, -1.589e-01, 3.718e-02, -2.416e-03, -8.547e-02, -1.886e-01, -2.620e-02, 1.115e-02, 1.535e-02, 3.972e-02, 8.115e-02, 4.437e-02, 2.503e-02)); + r += mul(s7_5, M4(6.628e-02, -2.132e-02, -1.014e-01, 1.091e-01, -2.270e-02, -1.182e-02, -1.225e-02, 2.201e-01, -1.923e-01, 7.464e-02, -4.376e-02, 4.027e-02, -3.831e-03, 1.229e-01, 1.291e-01, 3.764e-02)); + r += mul(s7_6, M4(2.760e-02, 5.997e-02, 8.050e-02, 6.740e-02, 1.042e-01, 2.560e-02, 4.031e-05, 1.214e-02, 9.502e-02, 3.927e-02, -4.782e-02, -2.899e-03, 4.771e-02, -6.955e-03, -2.022e-02, 2.951e-02)); + r += mul(s7_7, M4(7.620e-03, 8.834e-02, 7.506e-02, -8.427e-02, -1.852e-01, 1.048e-03, 6.660e-02, -1.567e-02, 1.079e-02, -2.159e-02, 8.645e-03, -3.696e-02, 6.173e-02, 5.077e-02, 9.091e-02, -1.181e-02)); + r += mul(s7_8, M4(-1.885e-01, -2.594e-02, -7.269e-02, -1.936e-03, -2.901e-02, 5.401e-02, 8.591e-02, -5.534e-02, 2.194e-02, 4.357e-02, 3.574e-02, 1.611e-02, -7.285e-03, 1.269e-03, -5.859e-02, -9.392e-02)); + r += V4(-5.407e-02, -7.067e-02, 1.950e-02, 9.545e-03); + return r; +} + +V4 f1(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(6.717e-02, -1.085e-01, 4.679e-03, 3.374e-02, -2.934e-02, -1.138e-01, -1.215e-02, -2.990e-02, 1.305e-01, 8.300e-02, 3.335e-02, 2.778e-02, 3.377e-03, -2.101e-01, -2.875e-02, 9.519e-02)); + r += mul(s0_1, M4(3.467e-02, -1.759e-02, 7.026e-02, 7.086e-02, -1.204e-01, -7.126e-02, -3.318e-02, -5.756e-02, 1.470e-01, -2.150e-01, 2.192e-01, -1.131e-01, -1.367e-01, 4.720e-02, 1.611e-01, 7.222e-02)); + r += mul(s0_2, M4(2.817e-02, 1.225e-01, -1.667e-02, -1.570e-02, 6.310e-02, 1.152e-03, -2.590e-02, -1.524e-01, 6.243e-02, -8.887e-02, 1.872e-01, 6.808e-02, -9.254e-02, -1.959e-01, -8.782e-02, -8.248e-02)); + r += mul(s0_3, M4(-4.263e-02, 1.467e-01, 6.943e-02, -1.812e-01, 5.025e-02, -5.220e-02, -1.407e-01, 7.781e-02, -1.816e-01, 6.821e-02, -9.870e-03, 4.308e-02, -1.741e-01, -4.907e-02, 1.264e-02, -7.239e-02)); + r += mul(s0_4, M4(1.230e-02, 8.330e-02, -6.574e-02, 4.610e-02, -1.526e-01, -1.785e-01, -3.353e-01, -4.067e-03, -3.103e-02, 1.791e-01, -6.876e-03, -1.204e-01, -8.336e-02, -6.957e-04, 9.618e-02, 6.912e-02)); + r += mul(s0_5, M4(-1.966e-02, -1.273e-01, 1.176e-03, -5.498e-02, -1.138e-01, -5.583e-02, -5.138e-02, -1.405e-02, 6.958e-02, 3.695e-01, 1.345e-01, -1.498e-01, 9.589e-02, -6.320e-02, -9.379e-02, -3.164e-01)); + r += mul(s0_6, M4(4.593e-02, -2.886e-02, -2.430e-02, -4.046e-02, 5.057e-03, 4.365e-02, -6.719e-02, 1.602e-01, -7.978e-02, 1.209e-01, 8.314e-02, -2.215e-02, -4.360e-02, -7.496e-02, -1.355e-01, -5.498e-02)); + r += mul(s0_7, M4(-2.778e-02, -6.251e-03, -3.910e-04, 4.534e-02, -1.031e-02, -9.855e-02, -9.771e-02, 1.508e-01, -2.924e-02, -4.297e-02, -3.887e-02, 1.542e-01, -1.705e-01, 1.007e-01, -8.629e-02, 8.864e-02)); + r += mul(s0_8, M4(3.027e-02, 1.940e-01, 2.927e-02, 9.326e-02, 4.644e-03, -7.984e-02, 4.678e-03, 1.474e-01, -1.669e-02, -4.209e-02, 1.043e-02, 9.069e-02, -1.063e-03, -1.228e-01, -3.037e-02, -9.812e-02)); + r += mul(s1_0, M4(-2.453e-01, -1.051e-01, 1.144e-02, 2.509e-01, -6.616e-02, -1.942e-01, 1.415e-01, -2.385e-01, -3.674e-02, -1.015e-01, -4.910e-03, -7.619e-02, -2.013e-02, 3.080e-02, -9.871e-02, -1.100e-01)); + r += mul(s1_1, M4(5.337e-02, -1.877e-01, 5.125e-02, -8.332e-02, 3.972e-02, 4.788e-02, 1.087e-01, 2.028e-02, -8.553e-02, -2.028e-02, -3.157e-03, -1.191e-02, 1.873e-02, -6.994e-02, -4.772e-03, 8.186e-02)); + r += mul(s1_2, M4(-6.383e-02, 1.453e-02, -2.684e-02, 1.285e-01, -3.137e-02, -8.488e-02, 8.024e-02, 5.607e-03, -2.146e-01, -1.763e-01, -2.075e-01, 1.566e-01, 7.104e-02, -3.803e-02, 4.318e-02, 3.814e-03)); + r += mul(s1_3, M4(-1.838e-03, -1.025e-01, -7.961e-02, -6.186e-02, 1.782e-02, -6.383e-02, -4.327e-02, -1.232e-01, 3.138e-02, -5.431e-02, -4.407e-02, -4.343e-02, -1.232e-01, -1.710e-02, 5.223e-02, -1.937e-01)); + r += mul(s1_4, M4(-4.092e-02, -2.729e-02, -6.141e-02, -6.268e-02, 4.153e-02, -1.508e-01, 2.181e-01, 4.653e-02, -2.279e-03, 7.404e-02, -1.050e-01, 1.125e-01, 7.147e-02, 6.433e-02, 4.226e-02, -1.862e-02)); + r += mul(s1_5, M4(-1.234e-01, -1.315e-01, -1.492e-01, 5.749e-02, 4.985e-02, 1.179e-01, -2.306e-02, 1.022e-01, -1.237e-01, -9.024e-02, -3.798e-04, 6.366e-03, -5.423e-02, 3.528e-03, 1.255e-01, 2.933e-02)); + r += mul(s1_6, M4(-1.164e-01, -1.124e-01, -5.387e-02, 6.608e-02, 1.339e-01, 1.405e-02, 9.894e-03, -2.333e-01, -2.912e-02, -1.399e-02, -4.016e-02, -3.425e-02, -1.855e-02, 7.181e-02, -4.869e-02, -3.256e-02)); + r += mul(s1_7, M4(1.152e-01, -4.542e-02, -1.117e-01, -6.471e-02, 1.022e-01, 1.087e-01, 4.418e-02, 7.917e-02, -7.525e-02, 6.215e-03, 9.068e-02, -4.588e-02, 1.149e-02, 1.724e-01, -5.913e-02, 1.584e-01)); + r += mul(s1_8, M4(1.605e-01, -5.167e-02, -4.253e-02, -3.335e-03, 1.543e-02, -6.644e-04, 9.621e-02, 1.979e-02, -6.140e-02, 9.012e-04, -1.190e-02, 5.535e-02, 8.267e-04, 1.517e-02, -3.087e-02, 2.612e-02)); + r += mul(s2_0, M4(-1.238e-01, -1.578e-01, -1.481e-02, -1.196e-01, -2.092e-01, -3.426e-02, -1.754e-02, -6.567e-02, 9.243e-02, 1.628e-01, 2.501e-02, 5.175e-02, -1.744e-01, -7.428e-02, -8.889e-02, -7.489e-02)); + r += mul(s2_1, M4(7.879e-03, 6.343e-02, -5.226e-02, 1.424e-01, -1.023e-01, -1.032e-01, 1.761e-01, 9.949e-02, 5.968e-02, -1.766e-01, -8.374e-02, 2.282e-01, 1.070e-01, -1.683e-02, -1.689e-02, 2.043e-02)); + r += mul(s2_2, M4(-5.229e-03, 1.663e-01, 9.149e-02, 4.612e-02, 1.723e-01, 2.314e-02, 4.265e-02, 6.821e-02, -5.956e-02, -7.686e-02, 1.719e-01, 2.495e-01, 2.147e-03, -3.642e-02, 1.616e-01, 7.041e-02)); + r += mul(s2_3, M4(1.973e-01, -3.390e-02, -7.258e-02, 1.437e-01, -6.018e-02, 1.360e-01, -8.374e-02, -2.892e-03, -5.402e-02, -1.989e-02, 4.853e-02, -4.518e-02, -5.872e-04, -8.122e-02, -3.853e-02, 1.739e-02)); + r += mul(s2_4, M4(1.295e-01, -4.896e-02, -1.630e-02, -1.248e-01, -1.512e-01, 6.255e-02, 1.608e-01, 1.656e-01, -7.696e-02, -5.137e-02, 1.514e-01, -2.473e-02, -2.328e-02, 1.922e-01, -4.038e-02, 3.598e-02)); + r += mul(s2_5, M4(-1.866e-02, 9.645e-02, -8.320e-02, 1.142e-01, 6.941e-02, 1.367e-01, 7.091e-03, -1.837e-01, -1.827e-02, -2.980e-02, -7.110e-02, -3.696e-02, -9.701e-02, -9.448e-02, -8.521e-02, 2.434e-02)); + r += mul(s2_6, M4(-2.143e-02, -1.493e-01, 9.606e-02, -3.440e-02, 7.487e-03, 9.767e-02, -3.191e-02, -7.964e-03, 1.168e-01, 1.179e-01, 3.998e-02, -1.623e-01, -8.569e-02, 8.994e-03, -3.421e-02, -1.244e-02)); + r += mul(s2_7, M4(-9.054e-02, -5.686e-02, -1.341e-02, 1.066e-01, 1.938e-01, -2.331e-01, 1.364e-01, 1.616e-01, -6.815e-02, -5.872e-03, -2.192e-03, -2.340e-02, -9.640e-02, 1.529e-01, 8.484e-03, 1.001e-01)); + r += mul(s2_8, M4(6.817e-02, -1.288e-01, 8.888e-02, 9.576e-02, 1.225e-01, 1.583e-02, -2.757e-02, -4.511e-02, 5.512e-02, -1.010e-01, -3.620e-02, 1.102e-02, 6.741e-03, -1.227e-02, 8.649e-02, 2.877e-02)); + r += mul(s3_0, M4(6.229e-02, 9.592e-02, 1.294e-02, -2.348e-01, -1.230e-02, 1.214e-01, -2.806e-03, 3.487e-02, -1.279e-01, -2.212e-01, -1.472e-01, 2.606e-02, -1.845e-01, -2.816e-03, -6.874e-02, -1.281e-02)); + r += mul(s3_1, M4(-9.062e-02, 1.683e-01, 1.611e-02, 5.872e-02, 5.554e-02, -7.704e-02, 6.382e-02, -2.322e-01, -3.895e-02, -3.454e-03, -2.921e-01, -5.875e-02, 3.566e-02, 1.108e-01, -1.710e-01, -2.502e-01)); + r += mul(s3_2, M4(1.173e-01, 1.708e-02, 6.776e-03, 1.691e-02, 1.499e-01, 2.921e-02, -9.225e-03, 1.394e-01, -1.358e-01, 9.238e-02, -5.082e-02, 1.636e-01, -2.493e-02, -6.122e-02, 5.968e-02, 8.655e-02)); + r += mul(s3_3, M4(-5.715e-02, -1.511e-02, -6.212e-02, -6.473e-02, 3.562e-02, -3.158e-02, -1.098e-01, 1.478e-02, 6.033e-02, -1.016e-01, -1.135e-01, -1.125e-01, -1.030e-01, 2.885e-01, 2.408e-02, -4.063e-02)); + r += mul(s3_4, M4(-4.288e-02, 1.547e-02, -1.791e-01, -2.682e-01, -3.370e-02, 1.680e-02, 2.958e-03, 5.127e-02, -2.809e-02, -4.347e-02, -1.414e-01, 3.814e-02, -1.420e-01, 2.483e-01, 2.089e-01, -1.261e-01)); + r += mul(s3_5, M4(-1.184e-01, 1.336e-02, -9.600e-02, -9.977e-02, -2.192e-01, -1.367e-01, 1.383e-01, -5.234e-02, 2.522e-02, 1.420e-03, -2.163e-01, 6.757e-02, -3.138e-01, -1.640e-01, -3.642e-02, 1.417e-01)); + r += mul(s3_6, M4(-2.282e-02, -1.051e-01, -5.613e-03, -4.427e-02, -2.312e-02, 7.340e-02, 6.455e-02, 4.537e-03, 1.161e-01, -4.970e-02, -6.218e-02, 1.148e-01, -6.845e-02, 8.079e-02, -7.447e-03, 6.897e-02)); + r += mul(s3_7, M4(2.117e-02, 4.091e-02, 4.972e-02, -3.314e-02, -4.211e-03, -9.433e-02, -8.061e-02, 7.014e-02, 6.691e-02, -2.260e-01, -1.036e-01, 4.619e-02, -5.972e-02, 1.259e-01, -3.887e-02, 6.878e-02)); + r += mul(s3_8, M4(6.344e-03, -2.309e-02, 6.478e-02, 1.424e-03, -1.296e-03, -5.976e-02, -2.716e-02, 1.685e-01, -3.233e-02, -7.415e-02, -2.596e-02, -8.568e-02, -2.194e-01, 1.018e-01, 5.171e-02, 1.192e-01)); + r += mul(s4_0, M4(1.224e-01, -1.173e-01, -7.758e-02, -1.832e-02, -1.574e-01, 1.337e-01, 2.167e-02, 7.167e-02, -1.695e-02, -5.784e-02, 6.215e-02, -5.441e-02, -2.862e-02, 4.763e-02, -1.056e-01, -3.591e-03)); + r += mul(s4_1, M4(6.239e-03, 1.669e-01, -1.077e-01, 1.890e-01, 2.274e-01, 6.625e-03, 2.943e-03, 6.447e-02, 2.389e-02, -4.926e-02, -5.119e-02, -6.227e-02, 7.541e-02, 2.031e-02, 1.013e-01, -9.943e-02)); + r += mul(s4_2, M4(4.436e-02, -2.437e-01, 1.763e-01, -5.477e-02, 7.136e-02, 4.379e-02, 6.421e-02, -2.688e-02, -6.556e-04, 1.186e-01, 2.484e-02, 9.693e-02, -7.738e-02, -6.154e-02, -1.354e-02, -9.314e-03)); + r += mul(s4_3, M4(-9.485e-02, 1.547e-01, -2.700e-02, -3.183e-01, -4.993e-02, -1.461e-01, 7.904e-02, -5.630e-02, -4.300e-02, 8.780e-02, -7.001e-02, -5.912e-02, 1.305e-01, 4.421e-02, 1.705e-02, -5.380e-02)); + r += mul(s4_4, M4(9.836e-03, -8.879e-02, -6.089e-02, -2.735e-01, -9.374e-02, -3.482e-02, 1.593e-01, 1.053e-01, -1.949e-02, -9.097e-03, -1.308e-02, 6.561e-02, -2.487e-03, -7.772e-02, 4.211e-02, 6.781e-02)); + r += mul(s4_5, M4(-1.164e-01, 1.692e-01, -1.707e-01, 2.116e-01, 4.292e-02, -1.785e-02, -3.180e-03, 1.698e-02, -3.298e-02, 9.171e-02, 1.148e-02, -2.111e-03, -2.830e-02, -4.993e-02, 6.376e-02, 6.920e-02)); + r += mul(s4_6, M4(-1.619e-01, -1.771e-01, 6.520e-02, -7.375e-02, 9.529e-02, -1.258e-01, -1.184e-01, 8.212e-02, 2.637e-02, -1.539e-01, 5.094e-02, -1.113e-01, 5.879e-02, -8.586e-02, 3.324e-02, 8.466e-02)); + r += mul(s4_7, M4(3.179e-03, -7.854e-02, -8.955e-02, 7.403e-02, -9.935e-02, -2.673e-02, -7.363e-02, -3.045e-03, -2.528e-02, -1.061e-01, -3.504e-02, 4.410e-02, -4.636e-02, 7.533e-02, -1.717e-02, 1.112e-01)); + r += mul(s4_8, M4(2.715e-02, -6.483e-03, -1.431e-01, 2.788e-01, -2.372e-02, 2.763e-02, 1.733e-02, -1.354e-01, 5.190e-02, 3.126e-02, -3.235e-02, 3.248e-02, 2.591e-02, 1.613e-02, -1.572e-03, -4.472e-02)); + r += mul(s5_0, M4(4.632e-03, 1.782e-01, -5.608e-02, 6.302e-03, -7.340e-02, -7.737e-03, -9.241e-02, 4.781e-02, -1.791e-01, 2.817e-02, 9.707e-02, -6.090e-02, -2.927e-01, 1.862e-01, -2.333e-01, 1.628e-01)); + r += mul(s5_1, M4(-6.151e-02, -2.405e-02, -4.087e-02, -1.285e-01, -7.012e-02, 2.614e-01, 4.987e-02, -4.459e-02, -2.275e-02, 7.123e-02, 9.935e-02, 3.843e-02, 1.603e-01, -1.680e-01, 3.095e-03, -1.928e-01)); + r += mul(s5_2, M4(6.417e-02, 1.484e-01, 1.279e-01, -1.789e-01, -3.257e-01, -7.609e-02, -1.704e-02, -3.876e-01, -3.879e-02, 1.197e-01, -1.642e-01, 2.962e-03, 2.338e-01, -1.852e-01, 6.983e-02, -1.616e-01)); + r += mul(s5_3, M4(-1.193e-01, 3.477e-02, -4.285e-02, 2.139e-02, 6.788e-02, 2.079e-02, -5.760e-02, 3.218e-02, -1.667e-01, -2.546e-01, -1.955e-01, 7.686e-02, 2.924e-03, 1.215e-01, 8.917e-02, 1.097e-01)); + r += mul(s5_4, M4(8.016e-02, 1.009e-01, 5.233e-02, -3.305e-02, 3.103e-02, 2.751e-01, 2.513e-01, 1.388e-01, 2.166e-01, -3.219e-01, 7.068e-02, 4.566e-02, -9.380e-02, 5.389e-02, -1.850e-01, 1.512e-01)); + r += mul(s5_5, M4(-8.857e-02, -2.837e-03, -7.693e-02, -9.155e-03, 2.678e-01, 1.357e-01, 4.491e-01, 2.434e-01, 1.613e-01, -1.161e-01, -6.304e-02, 1.556e-01, -2.363e-02, -2.454e-02, 3.906e-04, 4.633e-02)); + r += mul(s5_6, M4(2.677e-03, -3.706e-03, 9.228e-02, 9.541e-03, -4.820e-02, -7.482e-02, -1.183e-03, -1.958e-01, -1.223e-02, 7.255e-02, 1.093e-01, -1.465e-01, 1.202e-01, 1.210e-01, 4.326e-02, 1.447e-01)); + r += mul(s5_7, M4(-5.090e-02, 2.420e-02, -7.492e-02, 1.324e-01, 7.820e-02, 5.833e-02, -6.090e-02, -3.127e-01, -1.220e-01, -1.101e-03, -1.968e-01, 2.021e-01, -4.462e-02, 1.252e-02, 7.164e-02, 5.059e-02)); + r += mul(s5_8, M4(4.707e-02, -3.480e-02, 7.551e-03, -1.208e-01, -5.298e-01, -1.951e-01, -7.116e-01, 1.388e-01, -2.367e-01, 1.583e-02, 4.278e-02, -1.337e-01, 7.089e-02, -7.687e-02, -8.515e-02, 7.922e-02)); + r += mul(s6_0, M4(-9.214e-02, 7.529e-03, -6.248e-02, 2.070e-01, 7.201e-02, 8.504e-03, 5.225e-02, -4.419e-03, -9.270e-02, 4.535e-02, 9.824e-03, 9.299e-02, -1.235e-01, 1.056e-02, -1.423e-01, 3.974e-02)); + r += mul(s6_1, M4(-4.171e-02, -1.087e-01, 1.045e-02, 1.400e-01, -1.984e-01, -6.324e-02, 7.945e-02, -2.961e-02, -6.015e-02, 6.839e-02, -1.243e-01, 1.203e-02, -8.761e-02, 1.410e-01, -4.083e-03, 3.386e-02)); + r += mul(s6_2, M4(-4.386e-03, 3.460e-02, 1.422e-01, 4.385e-03, -1.620e-01, 1.497e-01, -4.923e-02, -9.036e-02, -2.182e-01, 1.379e-01, 6.954e-02, -3.739e-01, 3.684e-01, 1.336e-01, 5.649e-02, 7.316e-02)); + r += mul(s6_3, M4(1.649e-01, -5.692e-02, 4.225e-02, 1.613e-01, -2.164e-01, -8.842e-02, -2.972e-03, -3.522e-01, -1.062e-01, 7.149e-02, 3.555e-02, 2.059e-01, -3.451e-02, -7.517e-02, 6.511e-02, 4.864e-02)); + r += mul(s6_4, M4(-1.413e-01, -4.342e-02, -3.003e-02, -2.848e-02, -1.319e-02, 5.676e-02, 1.667e-03, -1.223e-01, 1.484e-02, -1.597e-01, -6.809e-02, -2.543e-01, 3.355e-01, -1.252e-01, -5.322e-02, 1.983e-02)); + r += mul(s6_5, M4(1.219e-02, -5.971e-02, 5.168e-02, -1.013e-01, -9.651e-02, 4.657e-02, -1.561e-01, 2.110e-01, -9.167e-02, 8.247e-02, -1.410e-01, 1.799e-02, -1.964e-02, -2.807e-01, 2.726e-01, -2.514e-01)); + r += mul(s6_6, M4(4.917e-02, -1.633e-02, -5.837e-02, 6.642e-02, -5.624e-02, 1.192e-01, 4.469e-02, 1.458e-02, -5.512e-02, 1.182e-01, -1.312e-02, 4.652e-02, 3.621e-01, -4.627e-02, 1.101e-01, -2.360e-02)); + r += mul(s6_7, M4(3.303e-02, 2.066e-01, -1.654e-02, -1.911e-01, -8.888e-03, 1.789e-02, -1.533e-01, 1.223e-01, -1.661e-01, -1.740e-01, 1.145e-01, -1.386e-01, -5.269e-02, -4.546e-02, 7.470e-02, -2.027e-01)); + r += mul(s6_8, M4(2.025e-02, -1.004e-02, 3.841e-02, 7.722e-02, 7.963e-02, -1.474e-01, -3.591e-02, 1.618e-01, -4.981e-02, 4.029e-02, -5.320e-02, -1.589e-01, -2.171e-01, -8.416e-03, -1.029e-01, -1.187e-01)); + r += mul(s7_0, M4(2.325e-01, -8.288e-02, 1.457e-01, -4.569e-02, 9.574e-02, -1.053e-01, 9.755e-02, 6.378e-02, 3.830e-03, -1.469e-01, -9.631e-02, 5.755e-02, -5.083e-02, -5.378e-02, -3.056e-02, -2.397e-02)); + r += mul(s7_1, M4(-2.248e-01, -8.623e-02, 2.123e-02, -1.490e-01, -8.108e-03, 6.108e-02, 1.224e-02, 1.078e-02, -5.741e-02, -7.249e-02, 6.195e-02, -8.693e-02, -9.347e-02, 1.273e-02, 5.736e-02, 5.040e-02)); + r += mul(s7_2, M4(1.596e-01, 8.328e-02, -2.612e-01, -8.180e-02, -3.636e-02, 2.406e-03, 5.303e-02, -3.305e-02, -1.257e-01, -8.973e-02, 4.427e-02, 5.241e-03, 1.629e-01, 4.851e-02, 6.754e-03, 3.417e-02)); + r += mul(s7_3, M4(2.611e-01, -2.005e-01, -8.642e-02, 5.382e-02, -8.290e-03, 2.400e-02, 1.224e-02, -5.875e-02, -1.908e-02, 6.390e-02, -6.675e-02, -8.961e-02, 5.823e-02, -1.251e-01, 2.823e-02, 7.424e-02)); + r += mul(s7_4, M4(-1.325e-01, -9.612e-03, -8.170e-02, -3.149e-02, -5.403e-02, -1.366e-01, 1.227e-01, 3.794e-02, 1.192e-02, -4.303e-02, 1.750e-01, -8.316e-02, -1.106e-02, -4.174e-02, -3.208e-02, 1.970e-01)); + r += mul(s7_5, M4(3.196e-02, 1.542e-02, 8.516e-03, -6.807e-02, -1.445e-02, 7.338e-02, 2.065e-02, 9.911e-03, -1.440e-02, 1.396e-02, -4.628e-02, -5.420e-02, 5.802e-02, 7.582e-02, 1.022e-01, -4.560e-02)); + r += mul(s7_6, M4(-5.374e-02, -1.868e-02, -2.215e-02, 1.477e-04, 7.862e-02, 1.092e-01, -1.139e-02, -1.158e-02, -7.233e-02, 2.963e-02, -4.970e-02, -8.032e-02, -3.154e-02, 2.469e-03, 1.429e-02, -3.882e-03)); + r += mul(s7_7, M4(8.257e-03, -1.201e-01, -6.238e-02, 7.351e-02, 1.150e-02, 1.626e-01, -9.431e-02, 5.197e-02, -2.246e-02, 2.016e-01, 2.822e-02, 1.362e-01, -9.953e-03, -3.172e-02, -9.940e-04, -1.536e-01)); + r += mul(s7_8, M4(1.146e-01, 1.110e-01, -5.326e-02, 2.054e-01, -1.047e-01, 6.589e-02, -2.937e-02, -1.905e-02, 3.019e-02, 7.729e-02, -1.218e-03, 6.997e-02, -1.298e-01, -1.623e-02, -5.119e-02, 6.137e-02)); + r += V4(4.130e-02, 1.983e-02, 1.131e-02, -4.202e-02); + return r; +} + +V4 f2(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(9.776e-03, 1.133e-02, -3.355e-02, -1.531e-01, -6.215e-02, 7.207e-02, -2.910e-02, -7.251e-02, 7.522e-02, -3.966e-02, 2.699e-02, 7.452e-02, -4.976e-02, 1.731e-01, -1.035e-01, 9.129e-02)); + r += mul(s0_1, M4(-1.396e-01, 1.442e-01, -1.480e-01, -9.944e-02, 5.011e-02, 7.390e-02, -8.576e-02, -9.798e-03, -6.092e-02, -3.941e-02, 1.679e-02, -7.403e-02, -5.263e-03, 6.009e-02, 7.368e-02, 1.100e-01)); + r += mul(s0_2, M4(1.877e-02, 1.486e-01, -9.979e-02, 1.587e-01, 4.095e-02, 3.952e-02, -2.612e-02, 3.233e-02, 1.062e-01, -1.490e-01, 8.490e-02, -1.303e-01, 1.267e-01, -3.028e-01, 8.821e-02, 2.048e-03)); + r += mul(s0_3, M4(1.393e-02, -3.075e-02, 1.460e-01, -4.840e-02, -8.010e-02, 3.560e-02, 3.412e-02, -4.544e-02, 3.805e-02, -3.483e-02, 1.444e-01, -2.263e-02, 6.338e-02, -1.065e-01, 1.063e-01, -3.890e-02)); + r += mul(s0_4, M4(4.691e-02, 2.480e-02, 1.178e-01, -8.325e-02, 1.123e-02, 4.891e-02, -5.960e-02, -2.912e-02, 4.684e-02, 2.167e-01, 2.077e-01, 9.285e-02, 5.381e-03, -5.640e-02, -2.302e-01, -4.384e-02)); + r += mul(s0_5, M4(1.248e-01, -5.576e-04, 2.938e-02, 7.179e-02, -6.587e-02, 1.190e-01, 4.798e-02, -4.063e-02, -2.519e-02, 1.964e-01, 8.330e-02, -4.101e-02, -1.757e-01, 1.975e-02, 8.995e-02, -2.210e-03)); + r += mul(s0_6, M4(-9.828e-02, -7.343e-02, 9.764e-02, -2.942e-02, -3.018e-02, -1.102e-01, -1.853e-01, -1.000e-01, 6.522e-02, 4.472e-02, 1.528e-01, -8.913e-02, -1.660e-01, -5.624e-02, -3.116e-01, 3.415e-02)); + r += mul(s0_7, M4(-6.710e-02, -2.627e-02, -3.502e-02, 1.176e-01, 3.238e-01, -1.860e-01, -1.790e-01, 4.971e-02, -3.690e-02, 3.052e-02, 5.722e-02, -2.977e-02, -7.715e-02, -1.292e-01, -2.234e-01, 1.173e-01)); + r += mul(s0_8, M4(7.600e-02, -2.084e-02, 2.253e-02, 6.215e-02, -8.462e-02, 1.150e-01, 3.212e-02, -7.986e-03, -8.954e-03, 1.414e-01, 1.038e-01, -8.033e-02, -2.475e-01, 2.992e-04, -1.844e-02, -7.008e-02)); + r += mul(s1_0, M4(2.073e-01, 4.388e-02, -2.668e-01, -9.685e-02, -2.238e-02, 1.252e-01, 1.399e-01, 8.699e-02, 2.333e-02, 3.715e-02, -3.618e-02, 9.009e-02, 1.044e-01, -9.673e-02, -3.876e-02, 7.851e-03)); + r += mul(s1_1, M4(-7.281e-02, -4.151e-02, -2.723e-02, -8.388e-02, 5.295e-03, 2.041e-02, -6.911e-02, 8.872e-02, -1.674e-02, -6.488e-03, -1.469e-02, -9.139e-02, 1.281e-02, -3.248e-02, 1.431e-02, 1.847e-02)); + r += mul(s1_2, M4(1.544e-02, -1.046e-01, -1.693e-01, -1.224e-01, 5.646e-02, -2.360e-02, -2.544e-02, 3.755e-02, 4.592e-02, 3.989e-02, 7.647e-02, 1.185e-02, -5.048e-02, 1.897e-01, -2.199e-02, -4.915e-02)); + r += mul(s1_3, M4(6.552e-02, 4.922e-03, -1.820e-01, -2.364e-02, -1.075e-01, 2.728e-02, -1.005e-01, 7.385e-02, -4.606e-02, 4.673e-02, 1.874e-03, 5.370e-02, -8.265e-03, 1.487e-02, -6.224e-02, -4.375e-02)); + r += mul(s1_4, M4(-5.894e-02, -1.075e-01, -6.922e-02, -6.830e-03, -9.902e-02, -1.249e-01, -6.997e-02, 1.181e-03, -3.054e-04, -8.467e-02, 5.810e-02, 6.620e-02, 1.048e-01, -3.457e-02, 6.104e-03, -1.209e-01)); + r += mul(s1_5, M4(6.688e-02, -2.488e-02, -7.699e-02, -1.275e-01, 2.364e-02, 1.505e-01, 1.489e-01, -5.790e-02, 1.957e-01, -1.594e-01, -1.788e-01, 4.084e-02, -7.009e-02, 6.747e-02, -8.610e-02, -6.766e-02)); + r += mul(s1_6, M4(2.521e-01, 4.219e-02, 4.813e-02, -4.289e-02, 1.826e-01, 9.599e-02, 6.430e-02, -4.017e-02, -1.407e-02, -3.707e-02, -9.009e-02, 2.826e-02, 1.050e-01, 7.109e-02, -4.801e-02, 2.410e-02)); + r += mul(s1_7, M4(-1.602e-01, 1.661e-01, 4.057e-02, -2.172e-02, 7.024e-02, 4.228e-02, 2.632e-01, -7.107e-02, -8.244e-02, 2.700e-02, -1.450e-01, 7.160e-02, 1.951e-01, -2.251e-01, 3.322e-02, 4.582e-03)); + r += mul(s1_8, M4(-1.262e-01, 1.854e-03, 1.178e-01, -1.497e-01, 1.528e-01, -2.994e-02, 2.364e-02, 9.387e-02, 7.943e-02, -1.429e-01, -7.044e-02, 3.041e-02, -7.487e-02, 5.990e-02, -5.066e-02, -2.487e-02)); + r += mul(s2_0, M4(-5.076e-02, 1.631e-01, -6.869e-02, 1.424e-02, 3.466e-02, -7.814e-02, 1.173e-01, -1.744e-01, 4.356e-02, 7.307e-02, 6.131e-02, 8.219e-02, -3.229e-02, 1.386e-03, 3.682e-02, -2.855e-02)); + r += mul(s2_1, M4(-1.844e-01, -2.906e-02, 1.676e-01, -6.373e-02, -9.257e-02, -3.190e-01, -2.114e-01, -4.582e-02, 2.055e-01, 8.519e-02, 1.576e-01, 2.338e-01, 4.294e-02, -3.009e-02, -9.665e-02, 1.986e-01)); + r += mul(s2_2, M4(-1.547e-01, -2.221e-01, -2.853e-02, -1.768e-03, 5.880e-02, 1.788e-02, 1.798e-01, -1.395e-01, -4.826e-02, 2.575e-01, -3.729e-02, 1.299e-01, 8.164e-02, -7.465e-03, -6.420e-02, -8.713e-02)); + r += mul(s2_3, M4(-5.749e-03, 1.248e-01, -9.157e-02, 5.040e-02, -3.994e-02, 1.028e-02, -5.703e-02, 8.672e-04, 6.620e-02, -1.704e-01, 6.747e-02, -9.601e-04, 4.844e-02, 1.800e-02, -3.440e-02, -4.046e-02)); + r += mul(s2_4, M4(1.493e-01, 2.121e-01, 1.150e-01, 1.215e-01, -3.332e-02, 7.949e-02, 2.340e-02, 1.034e-01, 1.920e-01, -1.273e-02, -2.382e-01, -6.905e-02, -1.858e-01, 1.172e-02, -6.687e-03, -9.036e-02)); + r += mul(s2_5, M4(2.826e-02, -2.022e-02, 4.561e-03, 5.506e-02, 2.404e-01, -5.027e-02, -2.026e-02, 1.156e-01, 2.665e-01, 5.267e-02, -9.174e-02, -3.432e-02, -4.251e-02, -4.464e-02, -1.960e-02, 5.370e-02)); + r += mul(s2_6, M4(1.694e-01, 6.852e-03, -5.605e-02, 1.458e-01, -1.626e-01, -1.851e-03, -1.486e-01, 3.850e-02, -1.147e-01, -3.283e-02, 1.666e-01, -4.694e-02, 5.731e-03, -2.958e-02, -3.499e-02, 7.312e-02)); + r += mul(s2_7, M4(-1.078e-01, 2.190e-01, -1.589e-01, -5.892e-02, -2.788e-01, 5.833e-02, 1.172e-01, -1.219e-02, 1.304e-02, -2.758e-02, -5.106e-02, 1.364e-01, -1.217e-01, 1.659e-01, 3.810e-02, -6.095e-03)); + r += mul(s2_8, M4(1.371e-01, 1.274e-01, 3.390e-02, -7.796e-02, -1.237e-01, -1.328e-01, 1.829e-01, -4.622e-02, 9.045e-03, 7.476e-04, 8.001e-02, 7.130e-03, -1.655e-03, 7.937e-03, 1.888e-01, -2.302e-02)); + r += mul(s3_0, M4(1.458e-02, -5.959e-02, 1.004e-01, 4.872e-02, -4.672e-02, -1.137e-03, -1.197e-02, 3.033e-03, -7.688e-02, 1.447e-01, -7.802e-02, -1.378e-01, -8.679e-02, -1.352e-01, -6.163e-03, -2.407e-02)); + r += mul(s3_1, M4(8.416e-03, -5.473e-02, -1.909e-02, -1.767e-03, -2.313e-02, 8.180e-02, -9.585e-02, 3.619e-02, 2.346e-02, 1.528e-01, -7.843e-02, 4.169e-02, -4.233e-02, 7.463e-02, 8.223e-02, 2.546e-01)); + r += mul(s3_2, M4(-1.631e-02, 5.895e-02, -1.996e-02, -2.241e-02, -6.741e-02, 5.341e-02, -8.862e-02, 1.549e-02, -7.137e-02, -1.477e-01, 1.356e-01, -1.492e-01, 7.808e-02, 7.700e-02, 5.673e-02, -2.241e-01)); + r += mul(s3_3, M4(-4.562e-02, -4.127e-02, -1.699e-02, -1.378e-01, -2.514e-02, 3.447e-02, -1.057e-01, -5.026e-02, -3.746e-02, 4.040e-02, -8.313e-02, 3.113e-02, 1.021e-01, 1.583e-02, -2.427e-02, -8.659e-02)); + r += mul(s3_4, M4(1.637e-01, -7.124e-02, -6.697e-03, 5.279e-02, 8.765e-02, 1.006e-01, 1.053e-01, 5.971e-02, -8.269e-02, -7.273e-02, 3.931e-02, -5.453e-02, -1.746e-01, 1.707e-01, -1.048e-01, -1.554e-01)); + r += mul(s3_5, M4(-5.668e-02, 1.609e-02, 3.673e-02, -1.317e-01, -5.147e-02, -8.183e-02, -8.940e-03, 2.933e-02, 5.024e-02, -9.863e-02, 1.304e-01, -1.980e-02, -2.414e-01, 1.176e-02, 5.452e-03, -4.053e-02)); + r += mul(s3_6, M4(3.254e-02, -1.210e-01, -1.227e-01, 1.183e-02, -2.902e-02, 1.240e-02, 4.859e-02, 7.308e-02, 4.321e-02, -4.560e-02, -1.068e-01, -2.553e-02, 7.134e-02, 8.717e-03, 1.321e-02, 2.268e-02)); + r += mul(s3_7, M4(-1.497e-01, 6.714e-02, -5.428e-02, -2.406e-02, 4.013e-02, 8.743e-02, 6.129e-02, -1.235e-01, -1.228e-01, 1.277e-02, -1.850e-02, 8.048e-02, -4.311e-02, 2.646e-01, 9.466e-02, -1.634e-02)); + r += mul(s3_8, M4(5.882e-02, 2.052e-02, 4.387e-02, -1.041e-01, -5.720e-02, -1.479e-01, 2.832e-02, -2.621e-02, 3.333e-02, -1.262e-02, -1.641e-01, 5.123e-02, -1.047e-01, 2.765e-01, 4.264e-03, -2.939e-02)); + r += mul(s4_0, M4(1.501e-01, 2.633e-02, 9.344e-02, 1.136e-02, 2.741e-02, 4.448e-03, -9.019e-02, 1.810e-02, -2.366e-02, 5.233e-03, 1.797e-02, -2.754e-02, 7.400e-02, -1.927e-03, -6.300e-02, 3.018e-02)); + r += mul(s4_1, M4(6.356e-02, 3.185e-02, 3.746e-02, 1.777e-02, -1.896e-02, 2.099e-02, -7.546e-02, -5.559e-02, 6.748e-03, 2.509e-02, -7.122e-02, -1.022e-01, 6.756e-02, -4.133e-02, -9.943e-02, 7.718e-02)); + r += mul(s4_2, M4(2.397e-01, -2.176e-01, 2.273e-01, -1.299e-02, -3.828e-02, -2.349e-02, -8.658e-02, 4.308e-02, -1.366e-02, -4.806e-02, 6.817e-02, 1.123e-01, -5.003e-02, -9.895e-02, -4.029e-02, -2.023e-01)); + r += mul(s4_3, M4(2.090e-01, 8.440e-02, -1.067e-01, -1.367e-01, 8.654e-03, -1.849e-02, 2.142e-02, -2.211e-02, -1.145e-01, -6.497e-02, 3.199e-02, 5.907e-02, -1.756e-02, 9.862e-02, -7.888e-03, -5.537e-02)); + r += mul(s4_4, M4(1.236e-01, -6.157e-02, 1.013e-01, -2.011e-01, -2.019e-02, -9.063e-02, -2.651e-02, -1.942e-01, 2.906e-02, -6.897e-04, -6.750e-02, -1.401e-01, 1.443e-02, 2.090e-02, 9.017e-03, 2.131e-03)); + r += mul(s4_5, M4(-9.932e-02, 4.428e-01, 5.511e-02, 1.661e-01, 2.183e-02, -1.299e-03, 1.319e-01, 1.633e-01, -3.275e-02, -7.492e-02, 1.048e-03, 5.778e-02, -1.204e-02, -8.126e-03, -9.239e-02, -3.791e-02)); + r += mul(s4_6, M4(3.221e-01, -1.157e-01, -6.856e-02, 3.304e-02, -8.065e-02, -3.694e-04, -1.317e-01, -2.974e-02, -7.071e-02, -1.253e-02, -9.960e-02, 1.396e-01, -1.033e-01, -5.537e-03, 1.319e-01, 1.306e-01)); + r += mul(s4_7, M4(5.416e-02, -1.607e-01, -3.796e-02, -2.196e-01, 7.504e-03, 1.137e-01, 8.092e-02, 4.933e-02, -1.354e-01, 2.499e-02, 7.708e-03, 3.970e-02, 7.704e-02, 1.006e-01, -7.237e-02, 8.995e-02)); + r += mul(s4_8, M4(9.289e-02, 3.223e-01, 1.134e-01, -3.694e-03, 2.888e-02, -1.124e-01, 2.244e-01, -5.135e-02, -7.507e-02, 6.290e-02, -2.024e-01, -8.959e-02, -1.329e-02, 6.541e-03, 3.294e-03, -6.241e-02)); + r += mul(s5_0, M4(-4.517e-02, 1.235e-01, 5.442e-03, 1.839e-02, -1.477e-02, 1.191e-02, 1.370e-01, -7.028e-02, 6.019e-02, 3.786e-02, -1.040e-01, -5.986e-02, -6.938e-02, 9.119e-03, 2.456e-01, -1.818e-01)); + r += mul(s5_1, M4(-1.001e-01, 1.577e-01, 1.060e-02, 3.452e-02, 7.981e-02, 1.807e-01, -1.247e-02, 1.419e-01, 2.852e-02, -2.555e-01, 8.737e-02, -2.522e-02, -1.450e-01, -7.592e-02, -7.450e-02, 1.140e-01)); + r += mul(s5_2, M4(1.068e-01, -8.475e-02, 3.917e-02, 7.297e-02, 2.496e-03, 3.705e-01, -7.435e-02, 1.772e-01, 3.024e-02, -3.389e-01, 2.800e-01, 4.755e-02, 8.825e-02, -1.821e-01, 6.686e-02, 2.805e-01)); + r += mul(s5_3, M4(-1.572e-01, 2.899e-02, 1.777e-02, -1.451e-02, 6.746e-02, 5.148e-02, -8.362e-02, 3.644e-03, -9.239e-02, -2.605e-01, -2.584e-01, -1.230e-01, -9.658e-02, 6.736e-02, -1.154e-01, -2.769e-03)); + r += mul(s5_4, M4(1.405e-01, 8.583e-02, -5.553e-02, -4.588e-02, -3.077e-01, -9.568e-02, -8.990e-02, 1.626e-01, 3.272e-01, -1.636e-01, -3.025e-01, 4.880e-02, 1.392e-01, -2.253e-02, -1.375e-01, 1.687e-02)); + r += mul(s5_5, M4(3.336e-03, -1.191e-01, 1.268e-01, 9.806e-03, 9.515e-03, -4.439e-03, -1.028e-01, -3.148e-01, 4.599e-01, -1.263e-01, 2.576e-01, -2.934e-01, 1.677e-01, 3.158e-02, 2.495e-01, 1.056e-01)); + r += mul(s5_6, M4(2.726e-03, -1.399e-01, 6.948e-02, -5.882e-02, -1.246e-01, 2.279e-02, -1.248e-02, 1.166e-01, 4.558e-01, 1.242e-01, 1.545e-01, 2.175e-02, -1.811e-01, 1.832e-01, 4.592e-02, 6.989e-04)); + r += mul(s5_7, M4(3.254e-03, 1.120e-01, 1.067e-01, -1.189e-01, 3.137e-01, -3.508e-02, -3.266e-01, 2.504e-01, -5.192e-02, -3.085e-01, 3.621e-01, -4.971e-01, -5.263e-02, -1.859e-01, 2.221e-02, 1.537e-01)); + r += mul(s5_8, M4(4.073e-02, -2.734e-02, -1.628e-02, 3.140e-02, 2.658e-01, -7.154e-01, -6.487e-01, -8.120e-03, 9.670e-02, 8.390e-02, -2.580e-02, -1.697e-01, -1.257e-01, 7.393e-03, 4.072e-02, -1.198e-01)); + r += mul(s6_0, M4(-2.325e-02, -1.803e-02, 1.682e-02, -1.560e-02, 1.823e-01, -4.043e-01, -4.110e-02, 1.549e-02, -1.683e-01, 9.149e-02, -2.927e-01, 1.546e-02, -2.405e-01, 7.029e-02, 2.755e-02, 5.652e-02)); + r += mul(s6_1, M4(9.453e-02, -1.540e-01, -5.654e-02, 3.796e-02, -2.715e-02, 1.640e-02, -2.742e-01, -2.748e-02, 1.565e-01, 2.170e-01, 5.316e-02, 2.978e-02, 2.052e-02, 5.915e-02, -1.925e-01, 4.712e-02)); + r += mul(s6_2, M4(7.061e-02, 6.826e-02, 1.215e-02, 1.393e-01, -4.831e-02, 1.440e-01, -8.814e-02, 6.905e-03, 3.821e-02, 7.138e-02, -8.313e-02, 1.865e-01, -7.926e-02, -2.579e-02, 4.882e-03, 7.233e-02)); + r += mul(s6_3, M4(8.800e-02, 8.067e-02, -9.297e-03, 4.975e-02, 6.075e-02, -5.985e-02, -6.378e-02, 2.492e-02, 2.305e-01, -8.931e-02, -1.370e-02, 2.229e-01, 1.409e-03, -1.928e-01, 6.843e-02, 9.708e-02)); + r += mul(s6_4, M4(-7.920e-02, -6.951e-03, 3.889e-02, 2.709e-02, 3.035e-03, -1.535e-01, 1.865e-01, -8.006e-02, -3.663e-01, -4.063e-03, 1.480e-01, 8.084e-02, 2.003e-01, -3.478e-01, 7.709e-02, 1.318e-01)); + r += mul(s6_5, M4(-4.351e-02, -4.782e-02, 1.095e-01, 9.693e-03, 1.025e-02, -2.202e-01, 3.284e-01, 7.600e-02, -3.967e-01, 1.752e-01, 2.691e-02, -1.441e-01, 6.026e-02, 1.437e-02, -3.212e-01, 1.947e-01)); + r += mul(s6_6, M4(-1.174e-01, -6.388e-02, -4.659e-02, 1.936e-03, -1.898e-01, -2.308e-02, 5.991e-02, -2.405e-02, 4.370e-01, 4.343e-02, 1.119e-01, -1.649e-01, -2.892e-02, 9.907e-02, -5.520e-03, 3.411e-02)); + r += mul(s6_7, M4(-8.114e-02, -5.151e-02, -7.774e-02, -1.555e-01, -1.185e-01, -1.694e-01, 1.159e-01, -8.749e-02, -6.711e-02, 1.719e-01, 1.898e-02, -6.603e-02, -1.325e-02, -2.651e-01, -1.550e-01, 1.727e-01)); + r += mul(s6_8, M4(-1.288e-02, 9.244e-02, 6.123e-02, -5.099e-02, -2.744e-01, -2.457e-02, -4.723e-02, -1.700e-02, -2.435e-01, 1.399e-01, -9.896e-02, -1.818e-01, 1.429e-01, -4.617e-02, -1.876e-01, 1.280e-01)); + r += mul(s7_0, M4(-5.099e-03, 3.039e-01, -2.557e-01, 3.141e-01, 1.227e-01, -6.618e-02, 3.876e-02, -9.571e-04, 8.463e-02, -1.155e-02, 2.623e-03, 4.686e-02, -1.301e-01, 2.507e-02, -4.847e-02, -8.853e-02)); + r += mul(s7_1, M4(-6.691e-02, 1.228e-02, 1.907e-01, -2.765e-01, -2.665e-02, 2.057e-02, -1.354e-02, 1.639e-01, 1.116e-01, -3.604e-02, 9.093e-02, -2.966e-02, 1.148e-01, 1.590e-01, 9.577e-02, 1.755e-02)); + r += mul(s7_2, M4(6.837e-02, 4.151e-02, 7.356e-02, 9.749e-02, -1.206e-01, 5.819e-02, 4.687e-02, 4.458e-02, 3.543e-02, -5.109e-02, -9.728e-02, -6.498e-03, 1.709e-02, -1.455e-01, -3.758e-02, -7.217e-02)); + r += mul(s7_3, M4(6.112e-02, 8.671e-02, -5.929e-02, 1.550e-02, -1.377e-01, 1.549e-01, 1.891e-02, 1.595e-02, -1.383e-01, 1.029e-02, -1.557e-01, 1.254e-02, -2.617e-02, 4.528e-02, -2.293e-03, -3.976e-02)); + r += mul(s7_4, M4(-3.063e-01, -1.625e-01, 5.306e-02, 2.149e-01, 1.103e-01, -6.293e-02, 4.295e-03, -1.463e-01, -4.290e-02, -1.037e-01, -9.071e-03, 2.655e-02, 1.242e-02, 1.285e-01, 1.310e-01, 4.781e-02)); + r += mul(s7_5, M4(-1.194e-01, 5.512e-02, 9.580e-02, -8.311e-02, 1.029e-01, -2.544e-01, -4.095e-02, -1.304e-01, -6.057e-02, -3.751e-03, 1.997e-02, -7.348e-02, -3.760e-02, -6.867e-02, 3.274e-02, -3.654e-02)); + r += mul(s7_6, M4(3.135e-02, -4.777e-02, 7.366e-03, 6.426e-02, -7.916e-02, 4.317e-03, -7.686e-02, 7.508e-02, 5.427e-02, 2.379e-02, -7.021e-04, -2.270e-02, -6.493e-02, 9.292e-02, 1.616e-01, 1.064e-01)); + r += mul(s7_7, M4(3.473e-02, -4.689e-02, 3.023e-02, -2.066e-02, 3.786e-02, -9.247e-02, -1.944e-02, 2.745e-02, 1.188e-01, 2.311e-02, 3.494e-02, -9.034e-02, 5.060e-02, -5.944e-02, -3.373e-03, 2.270e-02)); + r += mul(s7_8, M4(2.340e-01, -2.407e-02, 1.864e-01, -1.941e-01, -4.516e-02, 9.371e-02, -2.157e-02, -3.420e-03, 9.046e-02, -4.400e-02, -1.742e-02, -7.749e-02, 1.728e-01, 4.933e-02, -3.722e-02, 3.021e-02)); + r += V4(3.286e-02, 5.771e-03, -2.598e-02, -1.940e-03); + return r; +} + +V4 f3(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(6.007e-02, 8.815e-02, 8.787e-02, 6.673e-02, 4.531e-02, -1.136e-02, -6.746e-02, 8.082e-03, 6.723e-02, 6.495e-03, -3.572e-03, -8.810e-02, -2.639e-02, 5.251e-02, -3.715e-02, -1.949e-01)); + r += mul(s0_1, M4(-5.738e-03, 9.408e-02, 6.908e-02, 7.054e-03, 9.352e-03, -2.742e-03, -3.428e-02, -1.319e-03, 1.029e-01, 2.080e-02, -2.673e-02, 2.034e-01, 7.456e-02, 7.538e-02, -2.518e-02, -1.477e-01)); + r += mul(s0_2, M4(4.295e-02, 9.563e-02, 8.488e-02, 4.426e-02, -3.528e-02, 1.398e-01, 1.889e-02, 3.828e-02, -4.458e-02, -1.099e-01, -2.168e-01, 1.081e-01, -5.195e-02, 1.955e-02, -8.919e-02, -1.085e-01)); + r += mul(s0_3, M4(-2.999e-02, -3.070e-02, 4.703e-02, 6.359e-02, -1.680e-01, 7.294e-02, -1.817e-03, -9.498e-02, -1.203e-01, 9.638e-02, 2.234e-02, 1.904e-01, -6.926e-02, 7.531e-03, 7.118e-02, -1.135e-01)); + r += mul(s0_4, M4(-1.197e-01, 1.162e-01, -5.468e-02, -6.775e-02, -2.126e-03, 5.122e-02, 1.378e-01, 3.868e-02, -6.028e-02, -2.421e-02, -1.370e-02, 2.099e-01, 2.690e-02, 1.245e-01, -3.967e-02, 7.315e-02)); + r += mul(s0_5, M4(-1.513e-01, 1.097e-02, 8.977e-02, 2.209e-02, -6.021e-02, -3.080e-02, -1.322e-01, -7.357e-02, -2.849e-02, 6.843e-02, 6.890e-02, -2.563e-02, -8.341e-02, 1.888e-01, 3.539e-02, 1.158e-01)); + r += mul(s0_6, M4(6.849e-03, -6.993e-02, 2.321e-02, -1.048e-01, 8.459e-02, 4.537e-03, 8.299e-02, -2.428e-01, 1.755e-02, 5.857e-02, 2.179e-02, -1.344e-01, -9.762e-03, -3.408e-04, 1.007e-01, 2.005e-01)); + r += mul(s0_7, M4(-2.394e-02, -3.589e-02, -2.741e-02, -9.901e-03, 1.151e-01, -8.218e-02, 5.715e-02, 2.303e-03, -7.653e-02, -2.701e-03, -1.149e-02, -2.013e-01, -3.567e-02, -6.143e-02, -1.063e-02, -2.110e-02)); + r += mul(s0_8, M4(-1.736e-02, 5.056e-02, 3.740e-02, 9.058e-02, -9.973e-02, 3.741e-02, -6.764e-02, 3.525e-02, 1.265e-01, 3.735e-02, -1.814e-01, -1.235e-01, 4.104e-02, 1.338e-01, -1.512e-02, 1.449e-02)); + r += mul(s1_0, M4(-7.408e-02, 4.688e-02, -2.960e-01, 1.677e-01, -3.196e-02, -2.403e-02, -5.473e-02, 5.301e-02, -7.272e-02, 1.548e-03, -6.738e-02, -7.785e-02, -6.000e-02, 5.336e-02, 4.060e-02, 1.319e-01)); + r += mul(s1_1, M4(-1.255e-01, 5.550e-02, -2.639e-01, -1.696e-01, -1.958e-02, 5.529e-02, -1.100e-01, 9.454e-02, 9.261e-02, -7.395e-02, 5.238e-02, -2.436e-02, 5.194e-02, 7.147e-02, 9.864e-02, 6.991e-02)); + r += mul(s1_2, M4(-1.810e-01, -5.793e-02, -5.093e-02, 8.727e-02, -7.876e-02, -9.299e-02, -6.713e-02, -2.632e-02, 1.340e-02, -4.129e-02, -1.086e-02, 7.617e-02, -1.054e-02, 9.318e-03, -1.402e-01, -3.486e-02)); + r += mul(s1_3, M4(-3.670e-02, -5.741e-02, -4.090e-02, -9.587e-02, -7.562e-02, 1.266e-01, 1.659e-02, -6.550e-03, -2.260e-02, -1.221e-02, 3.792e-02, -1.947e-04, -1.043e-02, -1.396e-02, -1.095e-02, -2.223e-03)); + r += mul(s1_4, M4(4.028e-02, 3.228e-02, -1.232e-02, -8.317e-02, 5.324e-03, 1.219e-01, -7.543e-02, 1.053e-02, -3.967e-02, 1.101e-02, -6.909e-02, -1.647e-01, 5.278e-02, -9.361e-02, -1.093e-02, 2.990e-02)); + r += mul(s1_5, M4(3.109e-02, 6.628e-02, -3.311e-02, -1.217e-01, 1.338e-01, 1.042e-01, 2.909e-02, 3.355e-02, 8.824e-02, -1.579e-01, 7.428e-02, -1.650e-01, 8.633e-02, 2.387e-02, -4.965e-02, -7.690e-02)); + r += mul(s1_6, M4(-1.741e-02, 6.553e-02, -9.866e-02, 9.365e-02, 7.774e-02, -5.941e-02, 8.108e-02, -1.098e-01, -2.092e-02, -2.057e-02, 2.507e-02, -1.817e-01, 5.481e-02, 1.193e-02, -1.171e-02, -1.035e-01)); + r += mul(s1_7, M4(4.520e-02, 5.614e-02, -1.438e-01, 1.483e-02, -8.121e-02, 4.987e-02, -1.596e-02, 4.690e-02, -9.684e-02, 2.356e-02, -5.632e-02, -2.871e-02, 2.827e-03, 3.753e-03, 1.059e-01, -4.852e-02)); + r += mul(s1_8, M4(-1.003e-01, 1.382e-01, -7.615e-02, -1.036e-02, -8.650e-03, -9.770e-02, 6.611e-03, 1.062e-01, 4.865e-02, -1.524e-02, 6.637e-02, 4.955e-02, 5.024e-03, 1.599e-02, -2.878e-02, 1.989e-01)); + r += mul(s2_0, M4(5.293e-03, 1.021e-01, -1.295e-01, 1.045e-01, -7.228e-02, 1.200e-02, -1.228e-01, 3.596e-02, -9.114e-02, -4.430e-02, 8.587e-02, -1.528e-01, -2.979e-02, 1.066e-01, -3.788e-02, 1.052e-01)); + r += mul(s2_1, M4(2.227e-02, 4.026e-02, 6.702e-03, -1.372e-01, -8.303e-02, 2.734e-02, 7.988e-02, 1.928e-01, -1.743e-02, 9.606e-02, -2.045e-02, -5.722e-02, -8.917e-02, 1.423e-01, -8.891e-02, -2.011e-02)); + r += mul(s2_2, M4(-8.187e-02, -4.063e-02, -4.310e-02, 2.248e-02, 4.184e-02, -9.449e-02, 3.206e-02, 1.547e-01, -4.531e-02, -4.194e-03, 1.721e-02, 9.277e-02, -4.491e-02, -9.397e-03, 3.181e-02, 4.109e-02)); + r += mul(s2_3, M4(-7.735e-02, 1.386e-01, -1.647e-02, -1.481e-01, -1.363e-01, 7.268e-02, 2.435e-01, -1.078e-01, 2.014e-02, 1.318e-01, 7.131e-02, -3.314e-02, -1.665e-02, -4.534e-02, 7.938e-02, -1.114e-01)); + r += mul(s2_4, M4(-6.867e-02, 8.030e-02, 1.372e-02, 1.409e-01, 2.672e-02, -1.591e-01, -7.935e-02, 1.166e-01, -7.796e-03, -1.351e-01, -3.978e-02, -1.234e-02, -1.253e-01, -1.503e-01, 1.827e-01, 1.450e-02)); + r += mul(s2_5, M4(1.487e-02, 1.623e-01, 1.066e-01, 5.026e-02, 1.958e-01, 1.400e-01, 6.793e-02, 2.143e-01, -1.417e-01, -7.352e-02, 1.017e-01, -8.242e-02, -2.239e-02, 2.857e-02, -1.091e-01, -1.143e-01)); + r += mul(s2_6, M4(-1.680e-01, 4.522e-02, -1.074e-01, 3.068e-02, -3.510e-02, -3.975e-02, 8.872e-03, -1.323e-02, 8.092e-03, 1.302e-01, 3.036e-02, -1.005e-01, -5.281e-02, -5.411e-05, 7.608e-02, -5.882e-02)); + r += mul(s2_7, M4(-8.128e-02, 5.894e-02, 5.202e-02, -2.121e-01, -2.758e-03, 1.381e-01, 3.100e-02, 1.143e-01, 6.719e-02, 1.264e-02, 1.298e-01, -5.056e-02, -1.030e-01, -2.655e-02, -5.240e-02, 9.107e-02)); + r += mul(s2_8, M4(-1.098e-01, 7.137e-02, 1.447e-02, 1.095e-01, -1.075e-01, -7.541e-02, -2.493e-02, 5.744e-02, -2.321e-02, -4.715e-02, -1.222e-01, -1.038e-02, 4.308e-02, 1.199e-02, -2.390e-02, 8.004e-02)); + r += mul(s3_0, M4(1.514e-02, 6.142e-02, -1.679e-02, 1.421e-01, -4.314e-02, -3.753e-03, -4.478e-02, 5.450e-02, 4.830e-02, 1.841e-02, 8.349e-03, -7.602e-02, -4.918e-02, 6.954e-02, 3.566e-04, -1.164e-01)); + r += mul(s3_1, M4(3.458e-02, -2.655e-02, 2.074e-02, -6.764e-03, -4.779e-03, -1.050e-01, -1.285e-01, -3.547e-02, 6.100e-02, -1.033e-01, -1.220e-01, -2.488e-02, -1.735e-01, -3.269e-02, -2.998e-03, -7.536e-02)); + r += mul(s3_2, M4(-2.253e-02, -7.574e-02, -8.361e-03, -1.796e-01, -5.300e-03, 3.493e-02, -6.129e-03, 1.754e-02, -1.580e-01, -1.331e-01, -6.234e-02, 1.658e-01, -1.436e-01, -1.024e-01, 7.786e-02, 7.474e-02)); + r += mul(s3_3, M4(4.098e-02, 2.356e-03, -1.799e-01, 3.367e-02, -4.516e-02, -2.829e-02, 8.494e-02, 1.194e-01, 3.378e-02, 3.071e-02, 4.195e-02, 6.000e-02, -1.675e-01, 6.617e-02, 1.058e-01, -8.855e-02)); + r += mul(s3_4, M4(3.099e-02, 9.172e-02, -1.744e-01, 4.121e-02, -1.416e-01, -3.103e-02, 8.377e-04, 1.971e-02, 1.443e-01, -9.228e-02, -2.827e-02, 6.870e-03, -1.860e-01, -1.150e-01, 2.765e-01, -1.556e-02)); + r += mul(s3_5, M4(-4.603e-02, 4.315e-02, 1.547e-03, -2.338e-01, -1.147e-01, 6.940e-02, 2.080e-02, 5.854e-02, -7.289e-02, 2.040e-02, -5.947e-02, 5.971e-02, -2.226e-01, -1.241e-02, -1.104e-01, -9.166e-02)); + r += mul(s3_6, M4(2.643e-02, 6.164e-02, 8.340e-02, -1.133e-01, 1.595e-01, -3.999e-02, 2.242e-02, -1.665e-01, 2.607e-02, 3.441e-02, -1.012e-01, 1.000e-01, 1.596e-03, -2.365e-02, 7.891e-02, -5.897e-02)); + r += mul(s3_7, M4(3.983e-02, -2.678e-02, -3.517e-02, 1.224e-01, 1.005e-01, 1.754e-01, 7.284e-03, 3.945e-04, 8.451e-02, 4.457e-03, -9.681e-03, 4.125e-02, -4.995e-02, 4.584e-02, 1.199e-01, 7.346e-02)); + r += mul(s3_8, M4(5.846e-02, -2.888e-02, -1.479e-02, -8.501e-02, 6.400e-02, -1.157e-01, 2.165e-03, 1.854e-02, -3.113e-02, -2.208e-02, -7.875e-02, 5.719e-02, 1.033e-01, 1.480e-01, -1.909e-01, -5.007e-02)); + r += mul(s4_0, M4(-5.335e-03, -8.372e-02, -3.783e-02, -6.308e-02, -2.173e-01, 4.498e-03, -1.480e-01, -5.785e-02, -7.680e-02, 3.288e-02, -5.400e-02, 3.452e-03, 9.755e-03, -5.644e-02, 3.565e-02, 3.149e-02)); + r += mul(s4_1, M4(-8.715e-03, -5.051e-02, -1.442e-01, 4.613e-02, -8.669e-02, -6.579e-02, 9.057e-02, 1.023e-01, -7.638e-02, -1.862e-02, 6.867e-02, 1.036e-01, 3.587e-02, -1.297e-02, -1.062e-01, -8.614e-02)); + r += mul(s4_2, M4(-1.108e-01, -7.149e-02, 6.670e-02, 3.969e-02, 6.626e-02, 2.668e-02, -7.490e-03, 1.006e-02, -6.542e-03, -3.122e-02, -6.992e-02, 9.288e-02, -9.591e-02, -2.018e-02, -3.362e-02, 5.792e-02)); + r += mul(s4_3, M4(4.713e-02, 1.357e-02, -9.522e-03, -1.636e-01, 3.770e-02, -4.667e-02, 3.558e-02, 2.709e-02, -5.774e-02, -5.880e-02, -7.833e-02, -1.101e-01, 4.765e-02, 1.874e-02, 1.798e-02, -3.002e-02)); + r += mul(s4_4, M4(-1.328e-01, -2.495e-01, 4.802e-01, -2.588e-01, -2.041e-02, 1.240e-03, 6.136e-02, -1.834e-01, 1.875e-02, 8.841e-02, 4.815e-02, 5.687e-02, 4.647e-02, 3.939e-02, 1.162e-01, -6.678e-02)); + r += mul(s4_5, M4(-1.451e-01, -1.558e-01, -1.371e-01, 1.189e-01, 5.499e-02, 1.002e-01, 9.618e-02, -7.548e-03, 4.639e-02, 3.723e-02, 5.066e-02, -1.086e-02, -1.201e-01, -9.438e-02, -1.117e-01, 1.166e-01)); + r += mul(s4_6, M4(-2.174e-02, -3.346e-02, -7.233e-05, 2.218e-02, 5.312e-02, -5.567e-02, 2.738e-02, 1.525e-01, -7.337e-03, 8.831e-03, -1.704e-02, -3.560e-02, 2.228e-02, -7.597e-02, 8.787e-02, 5.019e-02)); + r += mul(s4_7, M4(1.841e-01, -3.949e-02, -3.770e-01, -1.809e-02, 4.194e-02, 9.110e-02, 1.813e-02, 6.084e-02, 8.008e-02, -4.040e-02, -1.450e-01, -1.446e-01, 1.486e-01, 1.302e-01, 1.444e-02, -1.374e-01)); + r += mul(s4_8, M4(-4.637e-02, 3.020e-01, 7.106e-02, 3.649e-01, 3.670e-02, 9.764e-02, -5.934e-02, -2.662e-02, -2.775e-02, 4.676e-02, 4.966e-03, -1.345e-01, -6.302e-02, 1.107e-01, -5.849e-03, -6.808e-02)); + r += mul(s5_0, M4(8.359e-02, 5.374e-02, -4.313e-02, -2.436e-02, 3.929e-02, -1.240e-02, 1.682e-03, -1.782e-01, -1.870e-01, 5.488e-02, -1.758e-01, -2.389e-02, 1.188e-01, -1.904e-01, 1.247e-01, -1.392e-02)); + r += mul(s5_1, M4(-7.821e-02, -9.252e-02, 5.281e-02, -8.872e-02, -1.075e-01, -1.824e-01, -2.427e-01, -8.470e-03, -1.865e-01, 1.573e-01, -8.853e-02, -6.354e-02, 1.242e-01, 3.494e-01, 6.722e-02, 9.009e-02)); + r += mul(s5_2, M4(1.812e-02, -2.485e-02, 4.002e-02, -5.939e-02, 3.988e-01, 2.575e-01, -3.490e-02, -3.557e-02, -2.122e-01, -7.069e-02, -1.837e-01, -1.297e-01, -6.653e-03, 7.863e-02, 1.937e-01, -3.095e-02)); + r += mul(s5_3, M4(1.034e-01, 4.052e-02, 7.462e-02, 8.144e-02, 1.522e-02, 1.363e-01, 1.426e-01, -1.123e-01, -6.815e-02, 1.544e-01, 2.515e-01, 2.701e-01, 7.650e-02, 9.157e-02, 7.519e-02, 1.269e-01)); + r += mul(s5_4, M4(-3.329e-02, -7.946e-02, 2.374e-02, -3.992e-03, 1.988e-01, -1.010e-01, -2.744e-02, -2.057e-01, 7.306e-02, 6.289e-02, 2.636e-01, 1.719e-01, 2.019e-01, 2.024e-01, 1.578e-03, -7.458e-02)); + r += mul(s5_5, M4(2.503e-02, 2.133e-02, -9.472e-02, 7.377e-02, -1.815e-01, 1.723e-01, 2.228e-01, 5.270e-03, -8.618e-02, -1.739e-01, 4.445e-01, -8.829e-02, -6.907e-02, -3.994e-01, -2.503e-02, -3.677e-02)); + r += mul(s5_6, M4(-5.551e-03, 1.916e-02, 1.607e-02, 8.480e-02, 1.256e-01, 1.284e-03, 2.887e-02, 7.081e-02, -3.412e-02, 5.326e-02, 1.446e-01, 2.570e-02, 4.649e-02, -5.663e-02, -5.735e-02, 1.437e-01)); + r += mul(s5_7, M4(-5.587e-02, -2.545e-02, -7.304e-02, -2.056e-01, -3.248e-01, 1.037e-01, -8.052e-02, 3.424e-01, -2.857e-01, 1.753e-01, 2.171e-02, 5.623e-01, 1.190e-01, 2.630e-03, -2.992e-02, -1.056e-01)); + r += mul(s5_8, M4(4.104e-03, 3.006e-02, 6.708e-02, 5.476e-02, 1.159e-01, -1.890e-01, 9.861e-02, -6.230e-01, 1.115e-01, 2.542e-01, 2.328e-01, -2.674e-01, -3.685e-02, 5.212e-02, -5.101e-02, 2.267e-02)); + r += mul(s6_0, M4(1.097e-01, -3.157e-02, -2.447e-02, -6.866e-03, -5.199e-02, -1.318e-01, -5.015e-03, 1.001e-01, -3.609e-02, -1.647e-01, -3.436e-01, -1.239e-01, 1.174e-01, 5.202e-02, 5.041e-03, 1.765e-01)); + r += mul(s6_1, M4(1.075e-01, 5.891e-02, -1.506e-01, 1.390e-02, 9.483e-03, 3.482e-02, -7.002e-02, 3.417e-02, -1.864e-01, -1.731e-01, 1.920e-01, -3.235e-01, 1.519e-02, 2.306e-01, -1.803e-02, -1.142e-01)); + r += mul(s6_2, M4(3.703e-02, 1.002e-01, -9.431e-02, 1.172e-01, 1.087e-01, 1.026e-01, -5.506e-02, -2.139e-02, 5.829e-02, -1.291e-01, -1.210e-01, 1.784e-02, 1.006e-01, -5.195e-02, 1.410e-01, 2.518e-01)); + r += mul(s6_3, M4(-6.842e-02, -3.220e-02, -2.200e-02, 1.114e-01, -9.742e-02, 7.600e-03, -1.156e-01, 5.088e-02, -1.513e-01, 8.029e-03, -1.525e-01, 2.514e-01, 7.538e-02, 5.196e-02, 1.078e-01, 1.843e-01)); + r += mul(s6_4, M4(-1.403e-01, -6.977e-02, 6.207e-02, 3.357e-02, 4.830e-03, 1.300e-01, 3.562e-02, 3.321e-01, -4.602e-01, -1.534e-02, 3.213e-01, 2.686e-01, -3.848e-02, 4.393e-02, 2.456e-01, 6.241e-02)); + r += mul(s6_5, M4(6.375e-02, 5.588e-02, 9.716e-02, 1.277e-01, -9.360e-02, 4.105e-02, 3.492e-02, -1.612e-01, -6.545e-02, -8.377e-02, -2.876e-02, -2.144e-01, 6.335e-03, 1.984e-02, 6.474e-02, -6.783e-02)); + r += mul(s6_6, M4(6.793e-02, -9.859e-02, 3.992e-02, -1.174e-01, 1.460e-01, -9.544e-03, -7.754e-02, -7.563e-02, -1.802e-02, 1.469e-01, 1.574e-01, 9.190e-02, 7.771e-02, -5.878e-02, -1.506e-01, 1.035e-01)); + r += mul(s6_7, M4(6.509e-02, -4.260e-02, 3.931e-02, -1.217e-01, -5.386e-02, -1.153e-01, -7.771e-02, -9.431e-02, 3.619e-02, -1.283e-01, -1.441e-01, -9.697e-02, -1.190e-01, -6.006e-02, -2.354e-01, -2.855e-02)); + r += mul(s6_8, M4(-2.388e-01, -1.365e-03, 6.138e-03, 6.787e-02, 9.083e-02, 1.217e-02, 4.726e-02, 7.028e-02, -7.880e-02, -1.273e-02, 2.881e-02, -1.127e-01, 6.820e-02, 8.305e-02, -4.687e-02, 5.309e-02)); + r += mul(s7_0, M4(6.293e-02, 1.524e-01, 2.426e-03, 1.345e-01, -1.927e-03, 2.500e-02, -2.269e-02, -1.720e-02, -5.706e-02, -4.078e-02, -1.441e-02, -1.935e-02, -2.046e-02, 1.077e-01, 2.896e-02, -1.657e-02)); + r += mul(s7_1, M4(-1.546e-01, 6.167e-02, -2.003e-01, 5.352e-03, -1.040e-02, 1.479e-02, -1.393e-02, 6.118e-02, 1.881e-01, -1.391e-01, 2.568e-02, 5.596e-02, 2.507e-02, -8.752e-02, -5.587e-02, 8.935e-02)); + r += mul(s7_2, M4(4.904e-02, -5.495e-03, 3.301e-02, -1.341e-01, -1.041e-01, 3.251e-02, 3.666e-02, 2.863e-02, 8.393e-02, -6.058e-02, -3.575e-02, -1.365e-01, 7.400e-02, -2.014e-01, 7.808e-02, -5.946e-02)); + r += mul(s7_3, M4(9.064e-02, 1.583e-01, -5.479e-02, -1.758e-01, -1.038e-01, 2.272e-02, 4.570e-02, 1.087e-01, 2.277e-03, 7.368e-02, -1.043e-01, -8.020e-02, -8.471e-02, -2.488e-02, 6.476e-02, -5.082e-02)); + r += mul(s7_4, M4(-3.333e-02, 1.693e-01, 5.872e-02, -1.505e-01, 2.054e-02, 4.561e-02, 7.449e-02, 6.552e-02, -4.158e-02, -9.157e-02, 3.637e-02, -1.193e-01, -1.161e-01, 5.117e-02, 7.775e-03, -6.346e-02)); + r += mul(s7_5, M4(4.869e-03, 4.115e-02, -1.571e-02, 1.777e-01, -2.857e-02, 6.103e-02, -7.811e-02, -5.197e-02, 4.437e-02, -4.254e-02, 1.840e-02, 2.180e-03, 7.496e-02, -3.691e-02, -8.768e-02, -1.503e-02)); + r += mul(s7_6, M4(1.570e-01, 1.453e-01, 8.288e-02, -1.437e-01, 5.945e-02, -3.665e-02, -4.857e-02, 4.723e-02, -6.723e-02, 2.362e-02, 5.484e-04, 1.404e-01, 4.498e-02, -4.389e-02, 3.433e-02, -8.667e-02)); + r += mul(s7_7, M4(7.684e-03, 9.443e-02, 1.095e-01, -5.099e-03, -3.467e-02, -4.402e-02, 7.357e-02, -2.241e-01, 1.074e-01, 4.893e-02, -1.257e-02, 1.393e-01, -2.778e-02, -1.809e-02, -5.013e-02, 4.069e-02)); + r += mul(s7_8, M4(-1.282e-01, -1.216e-01, -1.371e-01, -1.585e-01, 5.509e-02, 4.474e-02, -1.432e-01, -8.277e-02, -7.159e-02, 7.818e-02, 4.878e-02, -2.018e-02, 6.765e-02, 2.236e-02, -5.455e-02, 5.913e-02)); + r += V4(1.868e-01, -7.070e-04, 1.093e-03, 1.982e-02); + return r; +} + +void Pass5(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = Rmp8x8(tid.x) + blockStart; + uint2 size = GetInputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = (gxy + 0.5) * pt; + + V4 s0_0 = l0(-1.0, -1.0); + V4 s0_1 = l0(0.0, -1.0); + V4 s0_2 = l0(1.0, -1.0); + V4 s0_3 = l0(-1.0, 0.0); + V4 s0_4 = l0(0.0, 0.0); + V4 s0_5 = l0(1.0, 0.0); + V4 s0_6 = l0(-1.0, 1.0); + V4 s0_7 = l0(0.0, 1.0); + V4 s0_8 = l0(1.0, 1.0); + V4 s1_0 = -max(-s0_0, 0.0); + V4 s1_1 = -max(-s0_1, 0.0); + V4 s1_2 = -max(-s0_2, 0.0); + V4 s1_3 = -max(-s0_3, 0.0); + V4 s1_4 = -max(-s0_4, 0.0); + V4 s1_5 = -max(-s0_5, 0.0); + V4 s1_6 = -max(-s0_6, 0.0); + V4 s1_7 = -max(-s0_7, 0.0); + V4 s1_8 = -max(-s0_8, 0.0); + s0_0 = max(s0_0, 0.0); + s0_1 = max(s0_1, 0.0); + s0_2 = max(s0_2, 0.0); + s0_3 = max(s0_3, 0.0); + s0_4 = max(s0_4, 0.0); + s0_5 = max(s0_5, 0.0); + s0_6 = max(s0_6, 0.0); + s0_7 = max(s0_7, 0.0); + s0_8 = max(s0_8, 0.0); + + V4 s2_0 = l1(-1.0, -1.0); + V4 s2_1 = l1(0.0, -1.0); + V4 s2_2 = l1(1.0, -1.0); + V4 s2_3 = l1(-1.0, 0.0); + V4 s2_4 = l1(0.0, 0.0); + V4 s2_5 = l1(1.0, 0.0); + V4 s2_6 = l1(-1.0, 1.0); + V4 s2_7 = l1(0.0, 1.0); + V4 s2_8 = l1(1.0, 1.0); + V4 s3_0 = -max(-s2_0, 0.0); + V4 s3_1 = -max(-s2_1, 0.0); + V4 s3_2 = -max(-s2_2, 0.0); + V4 s3_3 = -max(-s2_3, 0.0); + V4 s3_4 = -max(-s2_4, 0.0); + V4 s3_5 = -max(-s2_5, 0.0); + V4 s3_6 = -max(-s2_6, 0.0); + V4 s3_7 = -max(-s2_7, 0.0); + V4 s3_8 = -max(-s2_8, 0.0); + s2_0 = max(s2_0, 0.0); + s2_1 = max(s2_1, 0.0); + s2_2 = max(s2_2, 0.0); + s2_3 = max(s2_3, 0.0); + s2_4 = max(s2_4, 0.0); + s2_5 = max(s2_5, 0.0); + s2_6 = max(s2_6, 0.0); + s2_7 = max(s2_7, 0.0); + s2_8 = max(s2_8, 0.0); + + V4 s4_0 = l2(-1.0, -1.0); + V4 s4_1 = l2(0.0, -1.0); + V4 s4_2 = l2(1.0, -1.0); + V4 s4_3 = l2(-1.0, 0.0); + V4 s4_4 = l2(0.0, 0.0); + V4 s4_5 = l2(1.0, 0.0); + V4 s4_6 = l2(-1.0, 1.0); + V4 s4_7 = l2(0.0, 1.0); + V4 s4_8 = l2(1.0, 1.0); + V4 s5_0 = -max(-s4_0, 0.0); + V4 s5_1 = -max(-s4_1, 0.0); + V4 s5_2 = -max(-s4_2, 0.0); + V4 s5_3 = -max(-s4_3, 0.0); + V4 s5_4 = -max(-s4_4, 0.0); + V4 s5_5 = -max(-s4_5, 0.0); + V4 s5_6 = -max(-s4_6, 0.0); + V4 s5_7 = -max(-s4_7, 0.0); + V4 s5_8 = -max(-s4_8, 0.0); + s4_0 = max(s4_0, 0.0); + s4_1 = max(s4_1, 0.0); + s4_2 = max(s4_2, 0.0); + s4_3 = max(s4_3, 0.0); + s4_4 = max(s4_4, 0.0); + s4_5 = max(s4_5, 0.0); + s4_6 = max(s4_6, 0.0); + s4_7 = max(s4_7, 0.0); + s4_8 = max(s4_8, 0.0); + + V4 s6_0 = l3(-1.0, -1.0); + V4 s6_1 = l3(0.0, -1.0); + V4 s6_2 = l3(1.0, -1.0); + V4 s6_3 = l3(-1.0, 0.0); + V4 s6_4 = l3(0.0, 0.0); + V4 s6_5 = l3(1.0, 0.0); + V4 s6_6 = l3(-1.0, 1.0); + V4 s6_7 = l3(0.0, 1.0); + V4 s6_8 = l3(1.0, 1.0); + V4 s7_0 = -max(-s6_0, 0.0); + V4 s7_1 = -max(-s6_1, 0.0); + V4 s7_2 = -max(-s6_2, 0.0); + V4 s7_3 = -max(-s6_3, 0.0); + V4 s7_4 = -max(-s6_4, 0.0); + V4 s7_5 = -max(-s6_5, 0.0); + V4 s7_6 = -max(-s6_6, 0.0); + V4 s7_7 = -max(-s6_7, 0.0); + V4 s7_8 = -max(-s6_8, 0.0); + s6_0 = max(s6_0, 0.0); + s6_1 = max(s6_1, 0.0); + s6_2 = max(s6_2, 0.0); + s6_3 = max(s6_3, 0.0); + s6_4 = max(s6_4, 0.0); + s6_5 = max(s6_5, 0.0); + s6_6 = max(s6_6, 0.0); + s6_7 = max(s6_7, 0.0); + s6_8 = max(s6_8, 0.0); + + t0[gxy] = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t1[gxy] = f1(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t2[gxy] = f2(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t3[gxy] = f3(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); +} + +//!PASS 6 +//!DESC conv5 +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 +//!IN t0, t1, t2, t3 +//!OUT t4, t5, t6, t7 + +#define l0(x, y) V4(O(t0, float2(x, y))) +#define l1(x, y) V4(O(t1, float2(x, y))) +#define l2(x, y) V4(O(t2, float2(x, y))) +#define l3(x, y) V4(O(t3, float2(x, y))) + +V4 f0(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-1.593e-01, -1.449e-01, 3.714e-01, 1.405e-01, -4.623e-02, 5.640e-02, -1.160e-03, -9.562e-02, -2.084e-01, 6.325e-02, 9.785e-02, -1.426e-01, -1.095e-01, 8.190e-02, 2.229e-02, -7.590e-02)); + r += mul(s0_1, M4(-7.741e-03, -8.691e-02, -7.332e-02, 2.748e-02, 4.440e-02, -5.428e-02, 2.901e-02, -1.183e-01, 9.970e-02, 2.708e-01, 1.508e-01, 7.405e-02, 4.042e-02, -1.176e-01, -2.240e-02, 1.138e-02)); + r += mul(s0_2, M4(-3.340e-01, 3.690e-02, -1.333e-01, 1.089e-02, 1.071e-01, 1.043e-01, -2.977e-02, 1.843e-02, -1.331e-01, 2.865e-02, 1.945e-02, -2.371e-01, 9.608e-02, -3.186e-02, -3.169e-02, 7.562e-03)); + r += mul(s0_3, M4(-1.696e-01, 5.110e-02, -1.223e-01, 3.763e-01, 6.949e-02, -1.285e-01, 5.979e-02, -4.475e-02, -3.222e-02, 2.133e-02, 3.789e-02, 7.654e-02, -8.666e-02, 1.017e-01, -6.865e-02, 1.487e-01)); + r += mul(s0_4, M4(-3.830e-02, -3.887e-02, 3.243e-01, 1.188e-01, 8.237e-02, -2.333e-01, 4.899e-02, 5.874e-02, -1.512e-01, 3.577e-01, -6.326e-02, -5.181e-01, -9.063e-02, 1.055e-01, -1.263e-02, -6.279e-02)); + r += mul(s0_5, M4(5.145e-02, -5.159e-02, 2.208e-01, -2.513e-02, 2.955e-01, 5.265e-02, -1.501e-01, -1.800e-02, -8.289e-02, -6.283e-02, 2.911e-01, -6.234e-02, 1.212e-01, -1.165e-01, 1.745e-01, -7.912e-02)); + r += mul(s0_6, M4(-7.277e-03, 5.578e-02, 6.717e-02, -5.013e-02, -2.340e-02, 6.085e-04, -5.489e-02, 8.570e-02, -1.369e-01, 6.509e-02, 1.394e-01, 1.283e-01, -7.018e-02, -7.364e-02, -1.514e-01, 5.337e-02)); + r += mul(s0_7, M4(2.544e-01, 1.554e-02, 2.218e-02, 6.236e-02, 2.742e-03, 7.685e-02, 1.068e-01, -1.142e-01, -6.585e-02, -1.644e-02, 2.755e-01, 2.080e-01, -1.312e-01, -9.234e-03, 1.023e-01, -6.273e-03)); + r += mul(s0_8, M4(-1.956e-01, -1.169e-01, 1.682e-01, -2.850e-02, 7.649e-02, 2.673e-02, -7.830e-02, -3.505e-02, -7.021e-02, -6.493e-03, -1.337e-03, 1.508e-01, 3.269e-02, -8.421e-02, -7.092e-03, 1.377e-02)); + r += mul(s1_0, M4(4.571e-02, 1.489e-02, 5.416e-02, 1.011e-01, -1.022e-01, 4.644e-02, -6.923e-03, -8.190e-03, -8.223e-03, -7.293e-02, 2.387e-02, 2.188e-02, -1.679e-01, 7.147e-02, 8.029e-02, 2.890e-02)); + r += mul(s1_1, M4(-1.266e-01, 2.499e-02, 9.610e-02, 3.170e-02, -4.388e-03, -8.444e-03, -1.798e-01, -2.290e-01, 9.415e-02, -2.611e-02, 3.209e-02, 2.049e-02, 2.385e-01, -1.341e-01, 2.982e-01, -3.020e-01)); + r += mul(s1_2, M4(3.859e-02, 1.301e-02, -5.288e-02, -5.663e-03, -4.897e-02, -7.929e-02, -3.821e-03, 3.302e-02, -4.841e-02, 8.560e-02, -1.186e-01, -1.017e-01, -1.501e-01, -2.028e-01, 6.390e-02, -1.024e-01)); + r += mul(s1_3, M4(-6.727e-02, 7.422e-03, -1.856e-01, -7.918e-02, -2.854e-02, -8.520e-02, -2.669e-02, 5.885e-02, -1.794e-02, 8.124e-02, 1.336e-02, 1.901e-01, 1.303e-01, -1.194e-02, 2.400e-01, 2.973e-01)); + r += mul(s1_4, M4(1.843e-01, 2.696e-02, -8.015e-02, 2.126e-02, -1.040e-02, -1.869e-01, 9.212e-02, 1.331e-01, -7.399e-02, 1.301e-01, 2.411e-02, -7.758e-02, -2.738e-01, -1.194e-01, -3.516e-01, -1.917e-01)); + r += mul(s1_5, M4(1.323e-02, 2.475e-03, -5.999e-02, 2.355e-02, 1.032e-01, 1.678e-01, -1.085e-02, 3.518e-02, -1.019e-03, -7.839e-02, 8.874e-02, 8.545e-02, 4.608e-01, -1.934e-01, 3.594e-01, 9.396e-02)); + r += mul(s1_6, M4(1.144e-02, -1.090e-02, -4.158e-02, -1.052e-01, -2.696e-02, -1.749e-02, -3.617e-02, -7.374e-03, 4.635e-02, -2.878e-02, -5.198e-02, -3.870e-02, -2.749e-01, -1.257e-01, -1.258e-01, -1.133e-01)); + r += mul(s1_7, M4(9.177e-02, -5.037e-02, -6.891e-02, 3.292e-02, 5.608e-02, 6.303e-02, -1.957e-03, 7.045e-02, -7.113e-02, -1.582e-02, -5.409e-02, -1.036e-01, -1.992e-01, -1.431e-01, 2.032e-01, -2.459e-01)); + r += mul(s1_8, M4(-8.794e-02, -6.965e-02, 1.735e-01, -1.279e-01, -1.199e-01, 6.993e-02, -2.056e-02, 1.078e-01, -5.771e-02, 8.518e-02, 1.168e-03, 4.438e-03, -3.108e-02, -9.562e-02, -3.943e-01, -3.110e-02)); + r += mul(s2_0, M4(1.800e-02, 9.367e-03, 3.256e-02, 4.693e-02, 8.038e-02, 5.966e-02, -2.208e-02, -3.095e-02, -6.173e-03, -1.560e-02, 8.999e-02, 3.326e-03, -6.089e-02, -2.851e-02, -1.533e-01, -1.779e-02)); + r += mul(s2_1, M4(-9.123e-02, 1.396e-01, -9.372e-02, -3.482e-03, 2.263e-01, -8.542e-02, -8.919e-02, 6.860e-02, 7.627e-04, 4.359e-03, -6.620e-02, -7.796e-02, 5.674e-02, 4.389e-02, 2.222e-01, -1.597e-01)); + r += mul(s2_2, M4(-3.900e-03, -1.853e-02, 8.436e-02, 1.238e-01, 1.459e-01, -3.454e-02, 5.319e-03, -1.830e-02, 4.723e-02, 8.957e-02, -7.618e-02, 2.639e-02, -5.243e-02, 8.689e-02, -6.727e-02, 2.487e-02)); + r += mul(s2_3, M4(3.173e-02, -1.429e-01, -1.436e-01, -1.011e-01, 1.308e-01, 2.880e-02, 5.304e-02, -1.223e-01, -8.882e-02, -2.668e-02, -1.300e-01, -1.422e-01, -7.629e-02, -5.281e-02, 1.080e-01, -2.089e-01)); + r += mul(s2_4, M4(3.714e-02, 4.249e-02, 1.392e-01, -4.845e-02, 1.593e-01, 2.331e-02, -6.485e-02, 7.681e-02, -1.677e-01, -1.248e-01, 1.185e-01, 5.576e-03, -2.337e-02, -6.052e-02, -1.761e-01, 1.118e-01)); + r += mul(s2_5, M4(9.538e-02, -2.208e-02, -5.149e-02, 1.184e-02, -7.266e-02, -7.028e-02, 1.615e-01, -7.057e-02, 5.134e-02, -9.027e-02, -1.213e-01, -8.401e-03, 4.649e-02, -3.823e-02, 1.478e-01, 7.446e-02)); + r += mul(s2_6, M4(5.187e-02, -3.907e-02, 1.271e-01, -1.752e-02, -6.796e-02, 1.812e-03, -6.672e-02, 7.822e-02, -6.372e-02, -5.372e-02, -1.701e-02, 3.405e-02, -8.316e-02, -5.269e-02, -1.587e-02, -5.865e-02)); + r += mul(s2_7, M4(3.859e-02, -2.469e-02, 4.657e-03, -7.371e-02, -5.297e-02, 1.771e-02, 5.469e-02, 6.538e-02, 5.576e-02, 7.541e-02, -1.886e-01, -3.162e-02, 1.101e-01, 1.082e-01, 1.659e-01, 6.491e-02)); + r += mul(s2_8, M4(1.356e-01, -2.891e-02, -1.754e-02, 1.395e-02, 9.832e-03, -1.633e-02, 9.524e-03, -6.391e-02, 1.459e-01, -2.841e-02, 2.557e-01, -1.733e-02, 4.526e-03, -1.524e-02, -1.301e-01, 9.234e-02)); + r += mul(s3_0, M4(1.686e-01, -7.967e-03, -5.276e-02, -6.824e-02, -1.409e-01, -6.803e-03, -2.278e-02, 2.534e-01, -1.090e-01, 1.592e-01, -1.918e-02, 1.525e-01, -9.105e-02, -1.546e-01, -1.817e-01, 1.213e-01)); + r += mul(s3_1, M4(1.456e-01, 9.600e-03, -7.036e-02, 3.050e-02, 7.232e-02, -2.325e-02, 1.812e-02, 5.203e-03, -1.446e-01, 5.967e-02, -6.930e-02, 2.963e-02, -1.145e-01, 1.560e-01, 8.045e-03, -6.323e-02)); + r += mul(s3_2, M4(-1.978e-01, 7.857e-02, 4.272e-02, 1.615e-01, -2.981e-02, 4.013e-02, -1.305e-01, -4.224e-02, -1.542e-01, 1.689e-02, 1.822e-01, 4.598e-02, -1.028e-01, 3.473e-02, -1.626e-01, -6.575e-02)); + r += mul(s3_3, M4(1.631e-02, -6.029e-02, -6.514e-02, 5.342e-02, -2.351e-01, 4.921e-02, 1.373e-02, 5.400e-03, 1.064e-01, 8.515e-02, 8.165e-02, 9.797e-02, -2.146e-01, -1.766e-01, -2.541e-01, 2.036e-01)); + r += mul(s3_4, M4(-1.687e-01, -8.273e-02, 2.427e-01, 6.374e-02, 1.014e-02, 8.861e-02, -7.684e-02, -5.828e-04, -4.240e-02, -1.492e-01, 9.594e-02, 5.766e-02, 3.729e-02, -3.388e-02, 5.206e-02, 2.805e-01)); + r += mul(s3_5, M4(-2.261e-01, -2.347e-02, -1.408e-01, -6.628e-02, -7.631e-02, 5.802e-02, 1.586e-01, -9.652e-02, 1.278e-01, -1.849e-01, -3.748e-02, 1.138e-01, 8.441e-02, -7.556e-03, 9.137e-02, 4.942e-02)); + r += mul(s3_6, M4(-1.926e-01, -7.638e-02, 1.927e-01, -9.560e-03, -2.627e-03, 6.517e-02, 8.063e-03, 2.457e-01, 1.541e-02, -9.795e-02, 2.329e-01, 4.059e-02, -2.558e-01, 4.837e-02, 3.723e-01, 9.836e-02)); + r += mul(s3_7, M4(-8.015e-02, -2.217e-01, -9.742e-02, 3.284e-02, 4.386e-02, -1.525e-01, -1.135e-01, -3.457e-02, 1.242e-02, 1.271e-01, 1.722e-02, 6.478e-02, 3.261e-01, -9.475e-02, 3.055e-01, -2.176e-01)); + r += mul(s3_8, M4(-1.313e-02, 8.794e-03, 3.080e-02, -9.745e-02, -2.133e-02, -1.201e-03, 1.012e-01, -2.072e-03, -1.021e-02, 6.600e-02, -4.266e-02, 1.259e-01, -9.550e-02, 2.597e-02, 3.693e-03, -2.470e-01)); + r += mul(s4_0, M4(-6.060e-02, -1.058e-01, -2.090e-01, 2.018e-01, 1.870e-02, 7.160e-02, 4.896e-02, 1.460e-01, 9.698e-02, -1.006e-01, -3.931e-02, 7.669e-03, 6.799e-02, -7.640e-02, -1.680e-02, 4.238e-03)); + r += mul(s4_1, M4(-6.669e-02, 3.466e-01, 4.606e-01, -2.850e-01, -9.875e-02, 3.052e-02, -5.354e-02, 2.134e-02, -1.507e-02, 2.892e-02, 4.354e-02, -1.145e-01, 4.007e-02, -7.408e-02, 5.854e-02, -9.265e-02)); + r += mul(s4_2, M4(-2.933e-02, -2.052e-01, 1.255e-01, 7.623e-02, -3.320e-02, -7.672e-02, 5.793e-02, -3.595e-02, 1.820e-01, -1.765e-02, 6.252e-02, 1.768e-02, 2.279e-02, 2.221e-02, -3.028e-02, 1.992e-02)); + r += mul(s4_3, M4(-1.204e-01, 6.957e-03, 2.086e-01, 1.671e-01, 3.611e-02, -2.151e-02, -9.956e-02, 1.377e-01, 4.875e-02, -9.599e-02, -6.171e-02, 1.036e-01, -1.594e-04, 5.487e-02, -1.711e-02, -1.317e-02)); + r += mul(s4_4, M4(-2.026e-01, -1.324e-01, -2.880e-01, -3.087e-01, -7.400e-02, 1.247e-01, 3.866e-02, 3.537e-02, 1.193e-02, -1.004e-01, 1.116e-01, -6.525e-03, 2.387e-02, 1.488e-01, -1.725e-01, -6.723e-02)); + r += mul(s4_5, M4(-2.304e-01, 1.438e-02, 4.557e-02, -1.209e-01, -9.595e-02, 3.186e-02, 5.878e-02, 8.973e-02, -4.991e-02, -2.682e-02, 7.052e-02, 4.856e-02, -2.973e-02, -1.402e-01, 1.139e-01, 7.068e-02)); + r += mul(s4_6, M4(-2.595e-01, -2.338e-01, -1.782e-02, -1.115e-01, 8.535e-03, -4.087e-03, -5.792e-02, -3.489e-02, -1.135e-02, 3.207e-02, 1.845e-01, 1.173e-01, 1.513e-02, 4.795e-02, -7.076e-02, -3.634e-02)); + r += mul(s4_7, M4(1.555e-01, -1.871e-01, 1.115e-02, -3.373e-01, 6.702e-02, 8.417e-02, -9.702e-03, -1.049e-02, 1.540e-01, -2.517e-02, -1.271e-01, 6.054e-02, -8.063e-02, -1.205e-02, -9.046e-03, -1.368e-02)); + r += mul(s4_8, M4(-1.995e-01, 4.294e-02, 1.778e-01, 7.162e-02, -9.654e-02, -6.709e-02, 4.075e-02, -2.107e-02, 9.859e-03, 7.697e-02, -3.300e-02, -8.696e-03, -1.934e-01, 2.050e-02, 2.544e-02, 4.246e-02)); + r += mul(s5_0, M4(1.797e-03, -1.507e-02, -8.254e-02, 1.316e-01, 4.059e-02, -2.017e-01, -1.458e-01, -2.957e-02, 7.678e-02, -6.134e-02, 2.763e-02, -8.168e-02, -1.657e-01, -8.973e-02, -9.496e-02, 8.552e-02)); + r += mul(s5_1, M4(-9.079e-03, -3.645e-02, 5.065e-02, -6.918e-02, -1.352e-01, 1.009e-01, 9.036e-03, -3.022e-02, -1.773e-02, -8.595e-04, 1.643e-01, 1.657e-01, 5.667e-02, 6.397e-02, -9.064e-02, -1.421e-01)); + r += mul(s5_2, M4(4.747e-02, 3.982e-02, 1.864e-03, 1.680e-02, 5.211e-04, 6.533e-02, -1.592e-01, 2.480e-02, -6.936e-02, -2.677e-02, -1.436e-01, 5.381e-03, -1.316e-01, -1.451e-02, -4.014e-02, 1.184e-01)); + r += mul(s5_3, M4(8.830e-02, 1.459e-02, 3.689e-02, 3.786e-02, 8.277e-02, 1.448e-02, -1.858e-01, 1.230e-01, -4.004e-03, 2.619e-02, -7.552e-02, 2.365e-01, -1.443e-02, 1.764e-01, -1.532e-02, 1.333e-01)); + r += mul(s5_4, M4(5.831e-03, 1.558e-02, -7.070e-02, -7.543e-03, -1.030e-01, 1.221e-02, 9.362e-03, -4.782e-02, -2.168e-01, 3.110e-02, -2.005e-01, -1.732e-01, -1.224e-01, 1.919e-01, -1.375e-01, -8.618e-02)); + r += mul(s5_5, M4(-7.694e-02, -6.734e-03, -5.183e-02, 8.451e-02, 1.593e-01, 4.950e-02, 9.033e-02, -1.817e-01, 5.260e-02, 1.583e-01, 1.939e-01, 5.432e-02, -3.731e-02, 1.443e-02, 4.282e-02, -7.614e-03)); + r += mul(s5_6, M4(5.421e-02, 3.801e-02, 7.990e-02, -5.669e-02, -3.197e-03, -5.307e-02, -1.686e-01, -2.793e-02, 7.266e-02, -3.287e-02, -1.096e-02, -7.894e-02, -6.755e-02, 9.185e-02, -7.624e-02, -1.063e-01)); + r += mul(s5_7, M4(-2.342e-03, 1.948e-02, -1.712e-01, 8.762e-02, 4.195e-02, 2.889e-02, 4.223e-02, 5.608e-02, -7.354e-02, -1.436e-02, 1.933e-02, -2.791e-02, 7.066e-02, -4.649e-02, 7.903e-02, -1.466e-01)); + r += mul(s5_8, M4(1.634e-02, 1.019e-02, 1.465e-01, -2.513e-02, 3.443e-02, 4.545e-02, -3.206e-02, -2.666e-02, -6.391e-02, 6.831e-03, -1.037e-01, 1.542e-01, 5.077e-02, 1.304e-01, 8.766e-02, -5.962e-02)); + r += mul(s6_0, M4(5.300e-02, 4.058e-02, 2.100e-02, -5.358e-02, 3.789e-02, 8.811e-02, 7.047e-02, 3.690e-02, -6.714e-02, 1.748e-02, -1.716e-02, 9.108e-02, 9.203e-02, -1.446e-02, 2.172e-02, 9.838e-03)); + r += mul(s6_1, M4(4.856e-02, 1.403e-02, 4.168e-04, 2.314e-02, 6.438e-02, -1.745e-01, -1.415e-02, 3.319e-02, -1.101e-01, 3.500e-02, 8.767e-03, -1.145e-02, 5.330e-02, -6.173e-02, 8.167e-02, -8.512e-02)); + r += mul(s6_2, M4(-1.802e-01, 3.493e-02, -4.916e-02, 5.625e-02, -1.352e-02, 6.816e-02, -6.138e-02, -4.388e-02, 4.193e-02, -1.397e-03, 5.147e-03, -1.394e-02, -1.075e-01, -8.984e-02, -7.328e-02, -3.107e-02)); + r += mul(s6_3, M4(-1.057e-01, -1.532e-01, -7.526e-02, -1.512e-02, -8.986e-03, 5.307e-02, -8.631e-02, -8.224e-02, 2.179e-03, 9.205e-02, -1.353e-02, 3.498e-03, 2.002e-02, -1.008e-01, -6.140e-02, -9.357e-02)); + r += mul(s6_4, M4(-1.763e-01, -8.677e-02, 1.356e-01, 7.325e-02, -9.521e-02, -2.784e-02, 9.741e-02, 4.460e-02, 1.058e-01, -4.458e-02, 2.446e-01, 1.419e-01, 4.335e-02, -7.998e-02, -1.716e-02, -1.886e-02)); + r += mul(s6_5, M4(1.377e-01, 2.626e-02, -8.382e-02, -8.873e-02, -7.494e-04, -1.027e-01, 3.345e-02, -5.583e-02, -1.120e-01, 1.128e-01, -1.429e-02, -1.038e-01, 6.440e-02, -1.174e-02, -9.148e-02, -9.121e-02)); + r += mul(s6_6, M4(-1.220e-02, 7.280e-04, 9.590e-02, -2.118e-02, -6.208e-02, -1.376e-02, 9.231e-03, -7.983e-02, 1.724e-01, 4.970e-02, 1.091e-02, 1.787e-02, -5.790e-02, 2.204e-02, 2.296e-02, -3.396e-02)); + r += mul(s6_7, M4(-6.873e-02, -6.783e-02, -5.188e-02, 1.125e-01, -7.886e-02, 5.728e-03, 1.074e-02, 2.625e-03, 4.340e-02, -1.089e-02, -4.658e-02, 5.693e-02, 2.289e-01, -1.841e-02, -3.196e-02, 1.033e-01)); + r += mul(s6_8, M4(1.020e-02, 2.300e-02, -1.233e-01, 1.133e-02, 5.054e-02, 5.580e-02, -3.536e-02, 8.082e-02, -7.543e-02, -6.158e-02, -7.700e-02, -4.762e-02, -1.917e-03, 8.030e-02, -5.618e-02, 1.056e-01)); + r += mul(s7_0, M4(-7.155e-02, 5.366e-02, -6.934e-02, -1.348e-01, -2.525e-01, -1.416e-01, 7.005e-02, -1.845e-01, -4.754e-02, -3.789e-02, 9.503e-03, -1.842e-01, 6.595e-02, 1.083e-01, 3.167e-02, 1.319e-01)); + r += mul(s7_1, M4(1.935e-01, -3.082e-02, -7.510e-02, -1.959e-01, 1.813e-01, -8.668e-02, -5.187e-02, 3.750e-01, 8.887e-02, 3.637e-02, 1.732e-01, -2.686e-01, -5.073e-02, 2.332e-01, 1.732e-01, -1.090e-01)); + r += mul(s7_2, M4(1.014e-01, 4.496e-02, -1.815e-01, 6.039e-02, -1.712e-02, 6.855e-02, 1.200e-01, -1.739e-02, 7.690e-02, -9.285e-02, 1.465e-01, -2.754e-01, -1.797e-02, -1.101e-01, 1.034e-01, 2.012e-01)); + r += mul(s7_3, M4(1.153e-01, -2.387e-02, -3.031e-01, 9.983e-02, 1.243e-01, -1.599e-01, 1.985e-02, -1.537e-02, -3.631e-02, -3.993e-02, -1.432e-01, 9.270e-02, -4.222e-02, -1.006e-01, -1.633e-01, 1.216e-01)); + r += mul(s7_4, M4(-2.473e-01, -1.253e-01, 5.134e-02, 5.411e-02, 4.270e-03, -2.251e-01, -2.865e-01, 2.612e-02, 1.701e-01, -2.289e-01, 2.527e-01, 2.396e-02, 9.859e-02, 1.566e-01, 5.256e-02, -7.774e-02)); + r += mul(s7_5, M4(3.443e-01, -5.217e-02, 4.137e-02, -1.492e-01, -1.627e-01, -4.718e-02, 9.112e-02, 3.721e-02, 1.699e-01, -1.953e-02, -2.286e-01, -4.415e-03, 9.506e-02, 8.536e-02, 2.329e-02, -1.689e-01)); + r += mul(s7_6, M4(1.489e-01, 9.847e-02, -2.211e-02, 7.476e-02, 2.856e-01, 1.026e-01, 4.397e-02, -1.761e-01, -3.738e-02, -3.216e-02, 5.437e-02, 9.685e-03, -1.461e-01, 1.146e-02, 7.179e-02, 8.610e-02)); + r += mul(s7_7, M4(2.367e-01, 2.734e-01, 6.172e-02, 2.847e-02, -7.795e-02, -1.774e-01, -4.325e-01, -2.145e-02, -1.804e-01, 3.168e-02, 1.158e-02, -1.556e-01, -1.721e-01, 2.168e-01, -7.359e-02, 9.723e-02)); + r += mul(s7_8, M4(1.146e-01, 2.635e-01, -1.467e-01, 7.112e-02, -1.555e-01, 2.464e-02, -5.305e-02, -1.821e-01, 7.086e-02, -2.014e-01, -1.698e-01, 1.242e-02, 1.664e-01, -2.012e-04, -2.096e-01, 1.916e-01)); + r += V4(3.398e-02, 8.938e-03, 1.353e-02, -8.796e-03); + return r; +} + +V4 f1(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(2.375e-02, 2.798e-01, -1.470e-01, -5.311e-02, -8.125e-02, -7.627e-02, 1.194e-02, -5.468e-03, 1.475e-02, -3.906e-02, 1.189e-01, -2.163e-02, 3.681e-02, -1.008e-01, -8.270e-02, -1.379e-01)); + r += mul(s0_1, M4(-2.061e-01, -3.075e-01, -5.014e-02, 8.560e-03, -6.088e-02, 2.363e-03, -3.140e-02, -5.582e-02, -1.874e-01, -2.888e-01, -2.317e-01, -2.082e-02, -2.264e-02, 1.194e-01, -1.154e-01, -1.054e-01)); + r += mul(s0_2, M4(1.052e-02, 2.800e-02, -1.830e-01, -1.295e-01, -7.716e-02, -5.475e-02, 1.633e-01, -8.246e-02, 5.170e-03, 1.827e-01, -1.566e-01, -4.217e-02, -3.526e-02, -8.951e-03, -4.627e-02, -2.115e-01)); + r += mul(s0_3, M4(-1.369e-02, -6.965e-02, -2.260e-02, 1.922e-01, 1.657e-01, -1.204e-01, 2.074e-01, -2.557e-02, -1.918e-01, 1.600e-02, -5.847e-03, 5.701e-02, 4.591e-02, 1.044e-02, 7.813e-02, 1.338e-01)); + r += mul(s0_4, M4(-2.651e-02, -5.623e-02, 1.692e-01, 2.944e-01, 3.676e-01, -2.678e-01, 7.910e-02, -5.427e-02, -3.895e-01, -1.209e-03, -1.830e-01, 2.640e-02, -4.157e-02, 1.224e-01, -1.023e-01, -1.106e-01)); + r += mul(s0_5, M4(-3.291e-02, 2.830e-01, -1.074e-01, 1.037e-01, -2.113e-02, 7.772e-02, -2.562e-02, -1.429e-01, -3.368e-02, 9.965e-02, -3.097e-01, -5.621e-02, 5.623e-02, 5.823e-02, 4.831e-02, 8.101e-02)); + r += mul(s0_6, M4(7.714e-02, 2.832e-01, 1.379e-01, 2.980e-02, -4.772e-02, 1.149e-01, -5.162e-02, 4.892e-02, 3.031e-02, -4.875e-02, -1.706e-01, 1.062e-01, 6.854e-02, -6.142e-02, -3.681e-02, -6.287e-02)); + r += mul(s0_7, M4(1.141e-02, 1.057e-03, 2.687e-01, 1.141e-01, 1.536e-01, -7.787e-02, -1.281e-01, 9.285e-02, -2.556e-03, 8.295e-02, 3.284e-02, -7.739e-02, 5.670e-02, -7.100e-02, 1.715e-01, 1.063e-01)); + r += mul(s0_8, M4(1.031e-02, 1.300e-01, -3.971e-02, -8.338e-02, 1.007e-01, 1.414e-01, 4.320e-02, 3.740e-02, -1.931e-02, 2.386e-01, -2.975e-02, 1.151e-01, -2.265e-02, 2.763e-02, 7.752e-02, 2.444e-02)); + r += mul(s1_0, M4(-3.686e-02, -9.159e-02, -8.028e-02, 1.835e-02, -8.461e-02, -1.200e-02, 6.251e-02, -8.569e-03, 2.942e-02, 1.142e-02, -1.239e-03, 6.275e-02, 4.019e-02, -7.689e-02, 5.405e-01, -1.596e-01)); + r += mul(s1_1, M4(-3.502e-02, 7.394e-02, -7.702e-02, -7.895e-02, -3.823e-02, -9.194e-02, 8.241e-02, -1.065e-01, -1.548e-01, -4.368e-02, 5.633e-02, 3.878e-02, 1.329e-01, 3.322e-01, -1.968e-01, -6.005e-02)); + r += mul(s1_2, M4(6.887e-03, -9.829e-03, 9.403e-02, 3.742e-02, -1.004e-01, 2.043e-02, 1.535e-01, 1.164e-01, -3.009e-03, -1.695e-02, 1.062e-01, -1.576e-01, -1.230e-01, -1.787e-01, 3.823e-01, -3.247e-01)); + r += mul(s1_3, M4(-6.858e-02, 4.149e-02, 6.125e-02, -2.038e-02, 2.113e-01, 5.205e-02, 2.541e-02, 1.713e-02, -1.713e-01, 2.402e-02, 3.943e-02, -7.622e-02, -7.784e-02, 1.272e-01, -6.592e-02, -2.368e-01)); + r += mul(s1_4, M4(8.601e-02, 6.665e-02, -2.816e-02, 1.915e-01, 2.949e-01, -1.469e-01, 4.550e-02, -8.922e-02, -1.569e-01, 2.114e-01, -5.545e-02, -2.952e-02, -1.437e-01, -1.079e-01, -2.190e-01, -1.519e-01)); + r += mul(s1_5, M4(-4.649e-02, 1.652e-02, 1.695e-02, -9.256e-02, -7.806e-03, -4.356e-02, 7.523e-02, 5.328e-02, -1.176e-01, -1.434e-01, -6.019e-02, 3.271e-02, 1.978e-01, 9.020e-03, 1.538e-01, -1.316e-02)); + r += mul(s1_6, M4(9.073e-04, 2.590e-02, 2.343e-02, -6.273e-02, -6.788e-02, 5.727e-02, -2.748e-02, -8.991e-03, 2.195e-02, -5.233e-02, -1.133e-01, -1.009e-03, 8.307e-02, -3.261e-01, 1.990e-01, 1.394e-01)); + r += mul(s1_7, M4(-1.678e-02, 6.919e-03, 1.559e-02, -5.822e-02, 1.391e-01, 2.534e-02, -5.715e-02, 4.260e-02, 1.618e-02, -2.235e-02, 2.680e-02, 2.541e-02, 1.304e-01, 6.041e-02, 2.798e-01, 7.458e-02)); + r += mul(s1_8, M4(-1.878e-02, -6.450e-02, -4.473e-02, 1.398e-02, 6.149e-02, -6.300e-03, -6.856e-02, -2.932e-02, 6.106e-02, -7.571e-02, -2.065e-02, 6.149e-03, 7.303e-02, -5.909e-02, 7.749e-02, -2.457e-01)); + r += mul(s2_0, M4(-5.323e-03, 8.889e-02, 2.062e-01, 1.460e-01, -2.143e-02, -6.834e-02, -1.091e-02, 5.811e-02, 6.127e-02, 9.073e-02, -9.772e-02, -8.533e-02, 1.797e-02, -3.454e-02, 2.204e-02, -1.434e-02)); + r += mul(s2_1, M4(1.952e-04, -2.399e-02, 4.873e-02, 6.787e-02, 9.244e-02, 8.997e-03, -7.317e-02, 2.043e-02, 2.031e-02, 8.249e-02, -7.486e-02, 7.437e-02, 9.161e-04, 6.212e-02, -8.652e-03, -4.886e-02)); + r += mul(s2_2, M4(8.736e-03, -2.015e-02, -3.063e-02, -1.487e-01, 1.903e-02, 1.047e-01, -1.922e-01, -2.611e-02, 3.349e-02, 8.046e-03, -4.341e-02, -8.011e-02, 5.500e-02, -1.323e-02, -8.428e-02, -8.787e-02)); + r += mul(s2_3, M4(4.261e-02, 1.504e-01, -3.430e-02, -2.808e-02, -9.004e-02, -8.427e-02, 4.767e-02, -6.548e-03, -8.702e-02, 1.069e-01, 2.933e-02, 6.920e-02, -1.814e-02, -1.345e-02, 7.182e-03, 3.332e-02)); + r += mul(s2_4, M4(-9.987e-03, -3.337e-02, 9.504e-02, 7.318e-02, 1.830e-01, -5.087e-02, 1.253e-01, 5.065e-02, 5.035e-02, -3.376e-02, 7.512e-02, -3.120e-02, 7.876e-03, -5.337e-02, 5.403e-02, -1.625e-01)); + r += mul(s2_5, M4(-5.509e-02, 1.477e-02, 1.874e-02, -9.997e-02, 3.357e-02, 6.800e-02, 6.103e-03, 6.213e-02, -2.270e-03, 7.609e-02, 1.223e-02, 6.646e-02, -8.543e-02, 2.444e-02, 2.058e-01, 1.535e-03)); + r += mul(s2_6, M4(-1.647e-02, 4.307e-02, -5.204e-02, -1.042e-01, -6.802e-02, 2.655e-02, -2.501e-02, -1.171e-01, 7.035e-02, -1.546e-02, -5.354e-02, 3.666e-02, 1.758e-02, -5.853e-02, -1.206e-01, 1.440e-01)); + r += mul(s2_7, M4(5.312e-02, -1.499e-01, -9.236e-02, 4.211e-02, 3.915e-02, -2.907e-02, -3.453e-02, 1.694e-01, -6.624e-02, 2.467e-02, 1.791e-02, -2.548e-02, 2.711e-02, 8.394e-02, 1.691e-02, 8.298e-02)); + r += mul(s2_8, M4(-5.714e-02, -4.092e-02, -9.204e-02, 4.022e-02, 4.659e-02, -2.774e-02, -7.553e-02, -3.057e-02, -7.433e-02, -3.282e-02, 1.134e-02, 7.285e-02, -1.579e-02, -6.273e-02, -3.069e-02, 5.203e-02)); + r += mul(s3_0, M4(-5.174e-02, 1.647e-01, 3.898e-02, 5.137e-02, -4.043e-02, 6.276e-02, -3.940e-02, -6.088e-02, 3.568e-02, 2.550e-02, 2.432e-01, 4.463e-02, -5.921e-02, -1.272e-01, -6.032e-02, -2.023e-01)); + r += mul(s3_1, M4(-7.720e-02, 1.650e-01, 2.768e-01, 8.936e-02, 1.765e-02, 7.190e-02, -8.169e-02, -1.016e-01, 3.540e-02, -1.089e-01, -1.615e-02, 1.515e-02, 6.506e-02, 6.977e-02, 1.474e-01, -2.054e-01)); + r += mul(s3_2, M4(-2.389e-04, -8.709e-02, -1.466e-01, -8.087e-02, 3.527e-02, 2.416e-01, 8.849e-02, -4.678e-02, 2.143e-02, -1.220e-02, 6.466e-03, -6.907e-02, 2.572e-02, 1.743e-02, -3.125e-02, 2.166e-01)); + r += mul(s3_3, M4(-7.812e-02, 1.668e-02, -9.618e-02, 1.031e-01, -7.556e-02, -2.006e-01, -1.922e-01, 5.740e-02, -1.155e-02, 9.923e-02, -1.006e-01, 2.153e-01, 9.290e-02, -7.649e-02, -1.424e-01, -1.187e-01)); + r += mul(s3_4, M4(5.798e-02, 6.748e-02, -2.225e-02, 6.382e-02, 1.155e-01, -3.644e-02, -4.444e-02, -4.808e-02, -1.056e-01, -2.862e-01, 1.351e-01, -5.455e-02, 5.645e-02, 1.314e-02, -2.308e-01, -3.675e-01)); + r += mul(s3_5, M4(-1.338e-01, -3.274e-01, -8.780e-02, -4.520e-02, 3.288e-02, 9.451e-02, 2.472e-02, 1.685e-01, -8.192e-02, 6.392e-02, 4.328e-02, -3.828e-02, -1.164e-03, -8.118e-02, -1.933e-01, 8.546e-02)); + r += mul(s3_6, M4(-8.778e-02, -1.244e-02, 1.515e-01, -1.361e-01, 5.845e-02, 5.789e-02, -2.808e-02, 1.687e-02, 1.422e-02, 5.649e-02, -2.284e-01, -1.832e-01, 9.666e-02, 3.020e-01, 7.284e-02, -9.252e-02)); + r += mul(s3_7, M4(1.047e-01, 8.983e-02, -2.817e-01, -6.086e-03, -2.664e-02, 9.771e-02, -3.212e-02, 4.423e-02, 1.027e-01, 1.199e-01, 1.894e-02, -3.824e-01, 2.164e-02, -5.713e-02, 4.713e-02, 2.997e-01)); + r += mul(s3_8, M4(-9.134e-02, -1.796e-01, 2.139e-01, 1.304e-01, 9.993e-04, -5.535e-03, 1.107e-01, -7.480e-03, -3.411e-04, 6.908e-02, -1.557e-01, -2.594e-01, -5.713e-02, -2.292e-01, 5.080e-02, -6.568e-02)); + r += mul(s4_0, M4(-8.382e-02, 3.862e-01, 1.418e-02, 1.371e-01, 3.885e-02, 7.614e-02, -2.130e-01, -1.384e-02, 3.449e-02, 1.616e-01, -6.491e-02, 1.743e-01, -1.643e-03, 6.216e-02, 4.557e-02, -5.585e-02)); + r += mul(s4_1, M4(2.163e-01, 9.199e-02, 4.379e-01, -1.450e-02, 1.899e-02, -1.992e-02, -1.880e-01, -4.115e-02, 5.857e-02, -1.024e-01, 2.446e-01, 8.298e-02, 3.299e-03, 1.530e-01, -8.514e-02, -7.577e-02)); + r += mul(s4_2, M4(-1.229e-02, 4.657e-02, 1.324e-01, 2.859e-01, -1.945e-02, 8.632e-02, 1.029e-03, -5.752e-02, -3.405e-02, -1.149e-01, -3.139e-02, 8.736e-02, 2.617e-02, 3.285e-02, 2.662e-02, -1.293e-01)); + r += mul(s4_3, M4(-8.512e-02, 5.312e-02, 2.727e-01, -1.651e-01, -5.700e-02, 5.245e-04, -9.154e-02, -3.120e-02, 7.641e-02, 7.932e-02, 1.516e-01, 7.887e-02, -5.095e-02, -9.988e-03, 2.493e-03, -4.794e-03)); + r += mul(s4_4, M4(-3.992e-02, 1.917e-01, 9.522e-02, 2.879e-02, -3.965e-02, -1.703e-02, -2.368e-02, 1.041e-01, -1.361e-01, 6.245e-02, -5.546e-02, -2.044e-01, -4.529e-02, -5.278e-02, 5.566e-02, -3.638e-02)); + r += mul(s4_5, M4(8.444e-02, 1.297e-01, 3.157e-01, -6.599e-02, 5.687e-02, 7.013e-02, 1.009e-01, 1.089e-01, 5.210e-02, 1.170e-02, -2.479e-02, -3.234e-02, -4.897e-02, 1.848e-03, 3.212e-02, -4.242e-03)); + r += mul(s4_6, M4(5.128e-02, -6.873e-02, -1.200e-01, 2.357e-02, 8.464e-03, 6.867e-02, -1.977e-02, -5.663e-02, 1.129e-03, 1.524e-01, 5.786e-02, -6.040e-02, -3.317e-02, 5.549e-02, -2.285e-02, 2.001e-02)); + r += mul(s4_7, M4(-1.778e-03, 2.180e-01, 2.588e-01, 2.249e-03, 5.801e-02, -3.429e-02, 4.188e-02, 1.153e-01, -2.219e-02, 1.133e-01, 6.736e-02, -4.814e-02, 7.633e-02, -1.251e-03, -8.278e-02, 1.314e-01)); + r += mul(s4_8, M4(-3.769e-02, -1.759e-01, -1.097e-01, 6.204e-02, -2.063e-02, 9.172e-02, 1.217e-01, -3.235e-02, 1.051e-01, 2.339e-01, -2.923e-02, 3.881e-02, 6.012e-02, 2.513e-01, 1.752e-03, 2.256e-02)); + r += mul(s5_0, M4(-3.723e-04, 6.100e-02, -8.285e-03, -6.124e-02, -7.198e-02, 4.131e-02, -5.697e-02, 5.607e-02, 3.343e-02, -1.694e-01, 1.277e-01, 2.201e-01, -4.906e-02, -3.500e-02, 1.787e-03, -2.144e-01)); + r += mul(s5_1, M4(-9.115e-02, -6.884e-02, 1.641e-02, -7.442e-02, -2.210e-02, 5.431e-02, 6.200e-02, -2.124e-01, -6.012e-03, 1.201e-01, -2.582e-02, 3.144e-02, 3.654e-02, -5.377e-02, 1.643e-01, -2.735e-01)); + r += mul(s5_2, M4(6.332e-03, 1.853e-01, 1.053e-01, 1.944e-02, -1.290e-02, -4.683e-02, -3.341e-02, 1.207e-01, -2.681e-02, -1.054e-01, 5.190e-02, 1.391e-01, 4.749e-03, 6.550e-02, -1.358e-01, 2.150e-02)); + r += mul(s5_3, M4(7.859e-03, -5.134e-02, -4.399e-02, -8.536e-02, -9.574e-02, -1.510e-01, -3.029e-02, -3.398e-02, 1.390e-02, -4.405e-02, 1.357e-01, -3.742e-02, -3.758e-02, -3.409e-02, 4.446e-02, -9.369e-02)); + r += mul(s5_4, M4(-1.086e-02, 1.335e-01, -7.505e-02, 2.578e-02, -2.335e-02, 7.722e-03, 9.271e-02, 4.046e-02, -8.313e-03, 1.330e-02, -1.720e-02, -1.942e-01, -1.159e-01, 7.048e-02, 2.139e-01, 2.432e-02)); + r += mul(s5_5, M4(-1.506e-02, -5.078e-02, 4.471e-02, -1.803e-02, -5.591e-02, -1.636e-01, 1.586e-01, 1.724e-01, 1.345e-03, -8.110e-02, 4.794e-02, -8.287e-02, -1.740e-02, -1.958e-01, -6.885e-02, 1.745e-02)); + r += mul(s5_6, M4(-5.305e-03, -1.426e-01, 1.051e-02, -8.768e-02, -1.354e-02, 2.778e-03, 1.055e-01, -1.119e-02, 2.422e-02, 1.937e-01, 1.025e-01, -1.818e-02, -3.728e-02, 1.294e-01, -2.123e-01, -2.478e-03)); + r += mul(s5_7, M4(2.103e-02, -2.761e-02, 1.809e-02, -5.856e-02, 3.352e-02, -8.026e-02, -6.127e-03, 2.577e-02, -5.896e-02, 6.966e-03, -6.744e-02, -5.771e-02, 7.337e-02, -2.228e-01, -2.579e-02, -1.155e-01)); + r += mul(s5_8, M4(-4.114e-02, 2.763e-03, -4.153e-02, -2.680e-02, -4.471e-02, -1.025e-01, -9.005e-03, -3.402e-02, 1.751e-02, 9.404e-02, -8.964e-02, 1.201e-02, -1.076e-02, -8.601e-03, -1.301e-01, -1.059e-01)); + r += mul(s6_0, M4(3.331e-03, 8.274e-02, 1.260e-01, 1.135e-01, 5.462e-02, 1.505e-02, -5.568e-02, -1.361e-02, -2.206e-02, -1.043e-01, -6.059e-02, -1.280e-02, 4.173e-02, -2.983e-02, 1.520e-01, 4.613e-03)); + r += mul(s6_1, M4(3.081e-02, 8.508e-02, 1.272e-01, 6.261e-02, -1.155e-01, 1.576e-02, -3.370e-02, -5.907e-02, 2.271e-02, -1.651e-02, -1.000e-01, -4.846e-02, -1.682e-03, -5.439e-02, -1.449e-01, 2.678e-02)); + r += mul(s6_2, M4(1.241e-02, 3.698e-02, 3.387e-02, 6.518e-02, 2.522e-02, -6.981e-02, 5.470e-02, -7.337e-02, -6.131e-02, -4.012e-02, -6.431e-02, -1.311e-01, 7.278e-03, 2.380e-02, 1.106e-02, 5.129e-02)); + r += mul(s6_3, M4(-5.088e-02, -1.362e-01, -1.841e-01, 8.520e-03, 7.464e-02, 2.412e-02, -2.240e-01, 7.396e-02, -8.567e-03, 3.698e-03, 7.064e-02, -1.045e-01, 4.836e-02, -1.381e-01, -5.552e-02, -6.792e-02)); + r += mul(s6_4, M4(-8.957e-02, -5.023e-02, -2.319e-03, -3.383e-02, -4.418e-02, -6.413e-02, -1.199e-02, 1.965e-02, 1.140e-01, 2.155e-02, -5.066e-02, -8.185e-02, -8.862e-02, 5.287e-02, -6.621e-02, -6.042e-02)); + r += mul(s6_5, M4(9.941e-03, -3.429e-02, -9.328e-03, -2.321e-02, -5.515e-02, 6.063e-02, 9.183e-02, 3.312e-02, 8.526e-02, 3.991e-03, 3.733e-02, 2.007e-02, 8.746e-03, -8.149e-03, 1.752e-01, -2.465e-03)); + r += mul(s6_6, M4(-1.963e-02, -2.332e-02, 6.692e-02, -1.371e-01, 2.745e-02, 9.046e-02, 8.091e-02, 2.885e-02, 6.670e-02, -1.123e-01, -2.297e-02, 5.476e-02, -2.732e-03, -1.063e-01, 8.884e-02, 4.369e-02)); + r += mul(s6_7, M4(-2.688e-02, 8.613e-02, -1.689e-02, 1.859e-02, -4.587e-02, -6.622e-02, 1.299e-01, -1.165e-01, -1.137e-02, 1.396e-01, 1.644e-01, 7.056e-02, 3.041e-03, 4.779e-02, -7.382e-03, 1.134e-02)); + r += mul(s6_8, M4(4.639e-02, -8.910e-02, 2.229e-02, -5.334e-02, 4.236e-02, 1.227e-01, 3.001e-02, 1.801e-01, -2.042e-03, 9.728e-03, 3.124e-02, 1.685e-02, -2.582e-03, 7.082e-04, -9.992e-02, 7.321e-02)); + r += mul(s7_0, M4(2.035e-02, -9.397e-02, 1.131e-01, 1.112e-01, 1.045e-01, 1.051e-01, 1.701e-01, 3.186e-01, -9.369e-02, -9.392e-02, -1.106e-01, 1.176e-01, 2.103e-02, 2.464e-01, -4.942e-02, -1.999e-02)); + r += mul(s7_1, M4(-2.264e-02, 3.158e-02, 8.701e-02, -2.893e-01, -1.537e-01, -1.782e-01, 8.104e-03, 1.830e-01, 9.748e-02, 6.874e-02, 5.698e-02, -2.618e-01, 1.413e-01, -1.715e-02, 1.973e-01, -4.910e-02)); + r += mul(s7_2, M4(2.451e-02, -3.421e-02, 1.512e-01, -1.254e-01, 1.938e-02, -6.550e-02, 3.108e-02, -2.869e-02, 1.086e-02, 1.887e-01, -1.990e-01, 2.933e-02, -7.444e-02, 1.322e-01, 7.581e-03, -1.204e-01)); + r += mul(s7_3, M4(9.478e-03, -2.528e-01, -1.993e-01, 1.319e-01, 1.392e-01, -1.184e-01, 1.748e-01, 4.578e-01, -6.064e-02, 1.102e-01, -1.556e-01, -1.085e-01, -4.835e-03, 8.928e-02, -7.895e-02, -1.913e-02)); + r += mul(s7_4, M4(-1.792e-01, 2.198e-01, -2.378e-01, 1.664e-01, -2.615e-01, -1.927e-01, -3.845e-01, 1.392e-01, 1.929e-01, -2.491e-01, 1.803e-01, -1.146e-01, -2.153e-02, -7.661e-02, 3.047e-02, -1.553e-01)); + r += mul(s7_5, M4(-4.536e-04, 2.779e-02, -1.637e-02, 6.501e-02, -7.290e-02, 8.468e-02, -2.876e-02, 3.537e-02, 1.322e-01, 1.287e-01, 9.628e-02, -5.629e-02, 5.159e-02, -1.237e-02, 1.812e-02, -1.645e-02)); + r += mul(s7_6, M4(-1.415e-02, -1.228e-01, -1.062e-01, -1.982e-03, 7.281e-02, 5.702e-01, 5.061e-01, 1.132e-01, 7.714e-02, 1.002e-01, 1.661e-02, 4.868e-02, 4.049e-02, 4.560e-01, -9.460e-02, 1.208e-01)); + r += mul(s7_7, M4(2.032e-02, 5.279e-02, -1.027e-01, 1.086e-01, 1.052e-02, -2.708e-01, -1.931e-01, 4.106e-02, 1.941e-01, 1.763e-01, 5.160e-01, 3.458e-02, -2.822e-02, 1.318e-02, -4.618e-02, 7.583e-02)); + r += mul(s7_8, M4(1.274e-01, 1.801e-02, -1.604e-02, 5.288e-02, 5.723e-02, -2.980e-01, 1.668e-01, -1.892e-01, -2.958e-02, 1.467e-01, 2.737e-02, -2.500e-01, 2.540e-03, -1.453e-01, -6.082e-02, 8.914e-02)); + r += V4(5.017e-02, -2.472e-02, -8.546e-03, 4.613e-03); + return r; +} + +V4 f2(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(1.769e-01, 1.890e-01, -1.346e-01, 4.498e-02, -5.215e-02, -1.350e-01, 1.967e-01, -5.861e-02, -5.850e-02, -3.990e-03, 8.226e-02, -1.164e-02, 4.593e-02, 7.120e-03, -6.743e-03, 1.034e-01)); + r += mul(s0_1, M4(1.599e-01, -4.515e-01, 7.455e-02, 1.520e-01, 1.614e-01, 4.222e-03, 1.287e-01, 1.402e-01, 1.576e-02, 4.033e-01, -4.946e-02, -3.333e-02, -8.869e-02, 9.984e-02, 5.972e-02, 6.922e-02)); + r += mul(s0_2, M4(1.290e-01, -2.785e-02, -1.034e-01, 1.953e-01, 1.258e-02, -1.653e-01, 5.398e-03, 4.797e-02, -1.307e-01, -2.807e-02, -8.324e-02, -2.679e-01, 3.305e-02, -4.835e-02, 1.052e-03, 2.273e-04)); + r += mul(s0_3, M4(5.643e-03, 1.652e-01, -3.521e-01, 2.138e-01, 4.679e-02, -7.642e-02, 5.980e-02, 1.397e-01, 1.753e-01, 1.755e-01, 1.188e-01, -2.106e-02, -1.723e-02, 1.938e-02, 4.026e-02, 1.164e-02)); + r += mul(s0_4, M4(4.681e-02, -2.655e-01, -9.812e-02, -1.739e-01, 1.446e-02, -3.818e-02, -6.509e-03, -1.201e-02, -1.034e-01, 1.189e-01, 9.574e-02, 1.625e-01, -1.010e-01, 5.830e-02, 5.339e-02, 1.189e-01)); + r += mul(s0_5, M4(9.504e-02, 2.441e-01, -1.970e-01, -1.449e-01, -6.458e-02, 2.752e-02, 1.072e-01, 3.095e-02, -3.617e-02, 2.200e-02, -1.818e-01, 2.857e-02, -3.973e-02, 1.105e-01, 3.115e-02, -8.797e-02)); + r += mul(s0_6, M4(4.346e-03, 4.373e-01, -1.908e-01, 2.041e-01, -5.081e-02, -6.123e-02, -8.348e-02, 3.666e-02, -9.411e-02, -5.219e-03, 1.670e-02, 1.344e-01, 1.077e-02, -8.030e-02, 5.326e-03, 1.046e-01)); + r += mul(s0_7, M4(-1.004e-01, 2.293e-02, -6.024e-02, 1.088e-01, -1.450e-01, 6.992e-02, -9.334e-02, -1.212e-01, 3.736e-02, -2.315e-01, 1.410e-01, 5.660e-02, 1.862e-02, 4.613e-02, -1.584e-02, 7.047e-02)); + r += mul(s0_8, M4(4.643e-02, 4.579e-02, -5.918e-02, 6.728e-02, 4.241e-02, -2.387e-01, -6.879e-02, 5.496e-02, 1.884e-01, -2.569e-02, -1.007e-01, 8.366e-02, 7.408e-02, 4.701e-02, -3.806e-02, -1.014e-02)); + r += mul(s1_0, M4(1.395e-02, -8.334e-02, 4.931e-02, -9.005e-02, 8.142e-02, 1.999e-02, 1.284e-01, 1.331e-02, 8.799e-02, 3.287e-04, 8.323e-02, -7.941e-02, 3.745e-02, 5.978e-02, 4.903e-01, -2.100e-01)); + r += mul(s1_1, M4(-1.767e-01, -3.321e-02, 1.431e-01, 2.912e-02, 8.241e-02, 3.289e-02, 7.668e-02, 2.679e-02, -6.279e-02, 1.038e-01, -4.263e-02, -3.315e-02, -1.966e-01, -1.607e-01, -1.609e-01, -1.256e-01)); + r += mul(s1_2, M4(4.673e-03, -1.148e-01, -3.676e-02, 6.074e-02, -7.172e-03, -4.427e-02, 1.597e-01, -2.477e-02, -5.421e-02, 1.013e-01, 2.950e-02, -9.229e-02, -1.843e-01, -5.846e-01, -4.701e-02, -5.318e-01)); + r += mul(s1_3, M4(-5.804e-02, -9.971e-02, 1.895e-02, -1.380e-01, 2.497e-02, -1.329e-01, 7.613e-02, 3.214e-03, 1.170e-01, -1.944e-02, -2.948e-02, 8.534e-03, -2.418e-01, 1.964e-01, 5.537e-02, 4.935e-02)); + r += mul(s1_4, M4(7.893e-02, -7.963e-02, -5.421e-02, 4.740e-02, 1.656e-04, 6.275e-02, -1.644e-03, -4.518e-02, 7.364e-05, 8.150e-02, -4.849e-02, 1.505e-01, -1.415e-01, 1.660e-01, -2.366e-01, 1.480e-01)); + r += mul(s1_5, M4(5.773e-02, 1.815e-01, 1.106e-02, -5.591e-02, 7.044e-02, 1.733e-01, 6.559e-02, 9.476e-02, -8.762e-02, -4.256e-02, 1.034e-02, -3.661e-02, -2.631e-01, -2.397e-01, 1.254e-01, -2.470e-01)); + r += mul(s1_6, M4(3.183e-02, -1.378e-02, -5.040e-02, 9.623e-02, -2.844e-02, -1.717e-03, 1.396e-02, 5.313e-02, 2.970e-02, 4.093e-03, 9.051e-02, 1.720e-02, -6.049e-02, -3.179e-01, -2.223e-02, -1.061e-01)); + r += mul(s1_7, M4(6.208e-02, -3.232e-02, -7.263e-02, 1.046e-01, -7.699e-02, -1.372e-02, -3.265e-02, -3.966e-02, 7.673e-02, -9.687e-02, 5.634e-03, 3.653e-02, -1.708e-02, 4.199e-02, -1.387e-01, 2.571e-01)); + r += mul(s1_8, M4(-3.332e-03, -1.940e-03, 4.380e-02, -1.268e-01, 1.219e-01, 1.835e-02, -6.464e-02, 1.054e-02, -5.188e-02, 1.726e-02, -7.917e-02, -2.458e-02, -4.254e-01, -2.410e-01, 1.529e-01, 6.448e-02)); + r += mul(s2_0, M4(8.106e-02, -7.452e-02, -6.152e-02, -7.733e-02, -8.086e-03, -1.625e-02, -1.457e-01, -2.278e-01, 1.031e-02, -2.093e-02, -5.553e-03, -1.876e-02, -3.961e-02, -1.525e-01, 8.504e-02, -3.757e-02)); + r += mul(s2_1, M4(-4.215e-02, -3.202e-02, -2.231e-01, -1.936e-01, -2.420e-02, 1.097e-01, 2.642e-02, -1.006e-01, 8.334e-02, 3.013e-02, -1.267e-01, 2.271e-02, 1.836e-02, 6.251e-02, 7.906e-03, 1.516e-01)); + r += mul(s2_2, M4(-5.334e-02, -3.053e-02, -9.453e-02, -1.276e-01, -7.813e-02, -2.116e-01, -1.310e-01, -6.871e-02, 1.601e-02, -8.765e-02, 4.449e-02, 8.631e-02, 1.214e-01, 7.435e-02, 4.918e-02, 5.179e-02)); + r += mul(s2_3, M4(9.149e-03, 1.258e-01, 1.028e-01, 5.660e-03, 1.250e-01, 5.431e-02, 1.488e-01, 6.198e-02, 1.659e-01, -4.945e-02, 1.060e-01, 7.387e-03, -1.841e-02, 2.213e-02, -4.996e-02, -5.252e-03)); + r += mul(s2_4, M4(1.315e-01, -3.812e-02, -4.451e-03, -8.287e-02, 5.701e-02, -1.140e-01, -2.271e-02, -1.523e-02, -1.305e-01, -5.270e-02, -4.576e-02, 1.534e-02, -1.640e-01, -9.250e-02, -4.700e-02, -3.133e-02)); + r += mul(s2_5, M4(-1.770e-02, 6.482e-02, 3.561e-02, -7.077e-02, -2.529e-03, 2.154e-01, 4.663e-02, -2.664e-02, 4.379e-02, -1.185e-01, -2.281e-03, -7.470e-02, 8.433e-02, 7.771e-02, 2.258e-02, 6.568e-02)); + r += mul(s2_6, M4(6.766e-02, 2.108e-02, 1.270e-02, 6.760e-02, -7.641e-02, 1.843e-02, -7.528e-02, 2.763e-02, -5.471e-02, -4.682e-04, 7.135e-02, 3.514e-02, 3.918e-02, -2.661e-02, -2.037e-02, 2.320e-02)); + r += mul(s2_7, M4(6.360e-02, -9.693e-02, 4.105e-02, 1.151e-01, -5.643e-02, -8.626e-02, -3.453e-02, -6.207e-02, 6.755e-03, -8.766e-02, 8.486e-02, -6.175e-02, -9.593e-02, 5.843e-02, -2.683e-02, -6.402e-02)); + r += mul(s2_8, M4(1.430e-01, -3.707e-02, 5.535e-02, 2.933e-02, -1.453e-01, -1.584e-01, 6.419e-02, 2.175e-02, 1.458e-01, -8.063e-02, -5.444e-02, 5.310e-02, 5.165e-02, -2.809e-02, -8.537e-03, -2.830e-02)); + r += mul(s3_0, M4(5.564e-02, -6.129e-02, -3.133e-02, -1.520e-02, 6.671e-02, 3.121e-02, 6.149e-02, -7.370e-02, 5.043e-02, -1.037e-01, -2.812e-03, -5.590e-02, -9.103e-02, -2.737e-01, 1.371e-01, -2.925e-02)); + r += mul(s3_1, M4(-9.142e-02, 1.799e-01, -3.346e-02, -1.074e-01, 5.501e-02, 7.856e-03, 6.031e-03, -8.088e-02, -2.287e-02, 3.100e-01, 9.814e-02, 9.471e-02, -2.496e-01, 4.528e-01, 8.430e-02, -1.320e-03)); + r += mul(s3_2, M4(-5.782e-02, 6.318e-02, -1.789e-02, -1.461e-01, -1.515e-02, -1.336e-01, -2.058e-01, -2.046e-02, -6.158e-02, -1.607e-02, 1.050e-01, 3.337e-02, -2.079e-02, 3.494e-01, 7.088e-02, -2.304e-01)); + r += mul(s3_3, M4(-1.257e-01, -1.046e-01, 1.097e-01, -1.196e-01, 6.986e-02, -8.444e-03, 5.487e-02, 1.475e-01, -1.110e-01, -6.646e-02, 3.417e-01, -2.054e-01, -1.888e-03, 1.974e-02, -2.172e-01, 1.390e-01)); + r += mul(s3_4, M4(1.125e-01, -7.499e-02, 1.321e-02, 5.380e-02, -6.331e-02, 2.885e-01, -5.830e-02, 4.324e-02, -1.243e-01, 9.861e-02, 5.391e-02, -3.004e-02, -2.324e-01, 1.354e-02, 1.800e-01, -1.214e-01)); + r += mul(s3_5, M4(-8.864e-02, -5.277e-02, 1.193e-01, -2.296e-01, -2.080e-02, 5.544e-02, -1.609e-02, -1.959e-01, 7.995e-02, 1.137e-01, 1.110e-01, -1.081e-01, -2.164e-01, -6.165e-02, -4.176e-01, 2.230e-01)); + r += mul(s3_6, M4(-6.254e-02, -1.889e-02, 7.543e-03, 7.514e-03, -2.202e-02, 1.114e-02, 7.680e-02, -6.242e-02, -1.535e-01, 8.380e-03, -5.794e-02, 1.097e-01, 2.236e-02, 3.382e-01, -1.351e-02, 5.943e-01)); + r += mul(s3_7, M4(-1.897e-02, 9.350e-02, 1.919e-01, 1.368e-01, 4.243e-02, 1.988e-02, 5.595e-02, -6.999e-03, -1.053e-01, -3.987e-02, 6.187e-02, -8.294e-02, 2.611e-01, -1.698e-01, 1.027e-01, -1.852e-01)); + r += mul(s3_8, M4(1.389e-01, 3.013e-02, 1.155e-01, -2.411e-02, 5.874e-02, -5.473e-02, 1.171e-01, -1.363e-01, 3.909e-02, -9.738e-02, -1.541e-02, -1.007e-01, -2.509e-02, -7.693e-02, -7.053e-02, 2.380e-01)); + r += mul(s4_0, M4(2.173e-01, 6.941e-02, 9.238e-02, 1.529e-01, 1.223e-01, -8.523e-02, -7.405e-02, -1.887e-02, 2.059e-02, 4.005e-02, 1.043e-01, 5.467e-02, 3.185e-02, 5.738e-02, 5.115e-02, 2.614e-02)); + r += mul(s4_1, M4(-2.511e-01, -2.269e-01, -6.805e-02, -3.722e-01, 1.636e-01, -8.646e-03, 1.841e-02, -3.401e-02, -3.941e-02, -5.779e-02, -1.787e-01, -2.084e-02, 7.398e-02, -5.920e-02, -5.115e-02, 5.309e-02)); + r += mul(s4_2, M4(1.427e-01, -6.510e-01, -3.659e-01, 2.387e-01, -5.120e-02, 3.985e-02, 1.098e-02, 6.384e-03, 1.493e-02, -6.208e-02, 1.038e-01, -1.453e-02, -8.886e-02, -1.207e-01, -9.097e-02, 4.186e-04)); + r += mul(s4_3, M4(-1.664e-01, 3.055e-01, 2.488e-01, 1.361e-01, -8.428e-02, 2.974e-02, 3.773e-02, -5.941e-02, -2.358e-02, -9.824e-02, -2.237e-02, -5.959e-02, 9.347e-02, 5.989e-02, -1.025e-01, -1.510e-01)); + r += mul(s4_4, M4(5.308e-02, 3.620e-01, 1.495e-02, 2.223e-01, 1.276e-01, 7.906e-02, -5.030e-02, -4.890e-02, -9.022e-02, 2.121e-02, 1.389e-01, -3.985e-03, -4.994e-02, -9.489e-03, 1.424e-01, 5.117e-02)); + r += mul(s4_5, M4(-2.974e-01, -1.401e-01, -9.986e-02, 9.604e-02, 2.256e-02, 2.873e-01, 7.987e-03, -7.493e-02, 2.292e-01, 1.061e-01, 1.438e-01, -6.919e-02, -6.513e-02, 2.582e-02, -1.415e-02, -1.568e-01)); + r += mul(s4_6, M4(-9.840e-02, 2.586e-01, -8.025e-02, 1.717e-01, -5.787e-02, -6.555e-02, -8.939e-02, 9.012e-02, -1.863e-02, 7.153e-02, -6.297e-02, -1.737e-01, 3.308e-02, -1.636e-02, 5.709e-02, 9.285e-02)); + r += mul(s4_7, M4(-5.649e-02, -1.537e-01, -1.290e-01, 1.347e-01, -9.012e-02, -4.008e-02, 1.942e-02, 3.189e-02, 2.808e-02, -3.812e-02, -2.656e-02, 6.829e-02, 2.456e-04, 1.119e-02, -1.088e-01, 7.207e-02)); + r += mul(s4_8, M4(2.026e-01, 9.658e-02, -6.331e-02, 1.661e-01, 4.098e-02, -1.569e-01, 3.871e-02, 1.962e-02, -1.005e-01, -5.360e-02, 5.993e-02, -6.681e-03, -6.750e-02, 3.160e-02, -6.498e-02, -4.712e-03)); + r += mul(s5_0, M4(-3.447e-02, 4.048e-02, -7.026e-02, 3.863e-02, 2.506e-01, 4.037e-02, 6.424e-02, -1.953e-04, -9.398e-02, -1.219e-01, 6.855e-02, -1.523e-02, 2.064e-02, 8.759e-02, 2.222e-01, 2.804e-02)); + r += mul(s5_1, M4(-6.874e-02, 3.698e-03, -1.326e-01, 8.570e-02, 8.906e-02, 9.961e-02, 1.252e-01, 1.808e-02, 1.472e-02, -2.685e-02, -6.776e-02, -4.234e-02, -8.621e-02, -5.135e-02, -8.713e-02, 6.227e-02)); + r += mul(s5_2, M4(4.261e-02, -8.624e-02, 6.382e-02, -4.885e-02, 5.271e-02, -4.970e-02, -9.689e-02, 1.942e-01, -4.576e-02, 2.971e-02, 1.246e-01, -2.061e-02, 5.367e-02, -1.649e-01, 7.247e-02, 3.256e-03)); + r += mul(s5_3, M4(2.156e-02, -3.901e-02, -7.494e-03, -3.963e-02, -9.054e-03, 9.909e-02, -1.919e-01, 4.831e-02, 1.045e-01, 6.352e-02, 2.492e-02, 9.664e-02, 1.664e-01, -9.012e-02, 1.774e-03, -6.163e-02)); + r += mul(s5_4, M4(-1.641e-02, 1.565e-02, -4.928e-02, 1.270e-01, -1.709e-01, 8.356e-02, 6.605e-02, 2.227e-02, -1.865e-01, -7.826e-02, 3.809e-02, -2.962e-01, -1.612e-01, -3.100e-01, 1.306e-01, 8.932e-02)); + r += mul(s5_5, M4(1.355e-02, 1.604e-01, 1.241e-01, -1.277e-01, 6.250e-02, 8.501e-02, 6.262e-02, -3.701e-02, -1.594e-01, -8.186e-02, 1.233e-01, -2.602e-03, -1.631e-01, 9.353e-02, 1.754e-01, 7.126e-02)); + r += mul(s5_6, M4(1.222e-02, 1.920e-02, 7.184e-02, 8.490e-03, 6.222e-02, 8.496e-02, -1.072e-01, 9.971e-02, 4.149e-02, -1.792e-02, -4.386e-02, -2.008e-02, 9.563e-02, 1.153e-01, -3.472e-02, 6.497e-02)); + r += mul(s5_7, M4(-9.252e-02, 6.629e-02, 1.663e-02, -6.928e-04, -1.021e-02, -5.721e-02, 7.302e-02, 4.191e-02, 1.064e-01, 2.094e-01, -2.151e-02, -5.463e-02, 1.049e-01, -1.570e-02, -1.413e-01, 1.091e-01)); + r += mul(s5_8, M4(7.991e-02, -9.547e-02, -1.492e-02, -1.840e-02, 9.470e-02, -5.424e-02, -2.479e-01, 3.591e-02, 2.842e-02, -3.262e-02, -6.494e-02, 3.304e-02, -3.533e-02, 1.561e-01, 3.110e-02, 1.859e-01)); + r += mul(s6_0, M4(5.014e-02, -2.430e-02, 2.443e-02, 2.271e-02, -2.687e-02, 1.429e-02, -1.183e-01, -3.453e-02, 3.654e-02, 4.275e-02, -1.271e-02, 5.869e-02, -7.522e-02, 3.797e-02, -1.045e-01, 2.725e-02)); + r += mul(s6_1, M4(-4.329e-02, -6.575e-02, 1.149e-01, -1.062e-01, -3.751e-02, -1.205e-01, -2.328e-02, 9.374e-02, 1.240e-01, -3.746e-03, -2.983e-02, 1.182e-01, -4.737e-02, 1.003e-01, -1.484e-02, 2.041e-02)); + r += mul(s6_2, M4(-3.182e-02, 9.013e-02, -7.199e-02, 3.300e-03, 5.126e-02, 1.061e-01, 9.584e-02, 4.920e-02, -3.661e-02, 3.929e-03, 4.104e-02, 2.964e-02, -6.641e-02, -1.847e-01, 1.518e-01, 4.210e-02)); + r += mul(s6_3, M4(3.809e-02, 1.141e-01, -2.025e-02, -3.144e-02, 7.610e-02, 6.201e-02, -1.278e-01, -2.698e-02, 2.440e-02, -3.292e-02, -1.224e-01, -1.537e-01, -8.080e-02, 4.410e-02, -6.527e-02, -8.392e-02)); + r += mul(s6_4, M4(-7.064e-02, 7.199e-02, -5.253e-02, 3.848e-02, 8.472e-03, -2.751e-02, 2.397e-01, -4.625e-02, -1.421e-01, 4.324e-02, -1.043e-01, -1.444e-02, -1.365e-02, -6.261e-02, -2.455e-02, -1.644e-02)); + r += mul(s6_5, M4(-1.123e-01, -4.866e-02, 7.136e-02, -7.598e-02, 1.370e-01, -5.719e-02, 1.156e-01, 8.149e-02, 1.303e-02, 5.168e-02, 5.268e-02, -8.777e-02, 1.678e-01, -4.289e-02, 4.631e-02, 1.116e-02)); + r += mul(s6_6, M4(7.914e-02, -6.892e-02, 3.845e-02, 9.035e-02, 1.392e-02, 6.559e-02, 9.920e-02, -6.218e-02, 7.775e-03, 4.465e-02, 2.889e-02, -2.887e-02, 2.551e-02, 7.788e-02, 1.951e-02, 8.912e-02)); + r += mul(s6_7, M4(6.857e-03, 8.237e-02, -6.959e-02, 3.558e-02, 1.657e-02, 1.091e-01, -1.466e-02, -8.162e-02, 5.031e-02, 2.547e-02, 2.146e-02, -5.752e-02, -2.984e-02, -1.845e-02, 1.276e-01, -3.895e-02)); + r += mul(s6_8, M4(-5.837e-02, -1.167e-01, 3.480e-02, 2.391e-01, 1.824e-01, -6.553e-02, 1.919e-02, -1.807e-02, -7.098e-02, -6.898e-02, 7.033e-02, -3.931e-02, 7.109e-02, -2.093e-02, -2.907e-02, -6.944e-02)); + r += mul(s7_0, M4(7.593e-02, -7.650e-02, 1.065e-01, -2.098e-02, 1.823e-03, 5.921e-02, -1.012e-02, -1.369e-02, 7.431e-02, 4.661e-02, -1.114e-01, -1.332e-01, -6.575e-02, -1.473e-01, -4.117e-02, 6.442e-02)); + r += mul(s7_1, M4(1.165e-03, 1.285e-01, 1.139e-01, 1.315e-02, 2.552e-02, 2.377e-01, -1.837e-01, -1.272e-01, -7.107e-02, -1.150e-01, 3.009e-02, -1.161e-02, -2.478e-03, -3.300e-01, 1.672e-02, -3.657e-02)); + r += mul(s7_2, M4(-3.815e-02, 1.411e-01, -1.306e-02, -1.292e-02, -5.307e-02, 3.563e-02, -1.113e-01, -2.583e-01, 3.122e-02, 2.440e-01, -2.140e-01, 1.636e-01, 2.650e-01, 9.879e-02, -6.845e-02, 4.067e-02)); + r += mul(s7_3, M4(-2.669e-01, -1.675e-01, -2.877e-01, 3.672e-02, 5.038e-01, -1.527e-01, 3.725e-01, -1.534e-01, 1.373e-01, 6.892e-03, 4.146e-02, -2.252e-01, -6.766e-03, 1.246e-01, -9.469e-02, 2.020e-02)); + r += mul(s7_4, M4(6.280e-02, 6.246e-03, -9.958e-02, 1.966e-01, 2.409e-01, -1.813e-02, 9.328e-02, -1.684e-01, -1.074e-01, -1.992e-01, -1.228e-01, 3.328e-01, 9.693e-02, 9.424e-02, 1.686e-01, -1.767e-01)); + r += mul(s7_5, M4(-6.688e-03, -3.218e-03, 9.671e-02, 1.111e-01, -1.830e-01, 1.717e-03, -3.666e-01, -7.725e-02, 1.551e-01, 4.519e-01, -1.876e-01, -2.229e-02, 6.402e-02, -1.702e-01, -6.232e-02, 6.659e-02)); + r += mul(s7_6, M4(-2.714e-02, -1.401e-01, 5.579e-02, -6.691e-02, -6.501e-01, 2.028e-02, -1.425e-01, -6.160e-02, 1.076e-01, -1.367e-02, 1.475e-01, 1.244e-01, 1.753e-01, -3.359e-02, -1.749e-01, 1.348e-02)); + r += mul(s7_7, M4(-4.595e-02, 6.315e-02, -1.296e-01, -3.428e-02, -4.203e-01, -2.758e-01, -2.281e-01, 4.241e-02, -3.090e-02, -1.202e-01, -4.892e-02, -1.343e-01, -1.120e-01, 8.944e-03, 3.657e-02, -2.739e-01)); + r += mul(s7_8, M4(-5.656e-02, -1.289e-01, -1.099e-01, 2.239e-02, -3.330e-01, 2.338e-01, 1.498e-01, -2.335e-02, 5.013e-02, 1.028e-01, 6.603e-03, 2.763e-01, 1.396e-01, -1.444e-02, -8.525e-02, 1.582e-01)); + r += V4(2.102e-02, -1.610e-02, -6.966e-03, 4.475e-03); + return r; +} + +V4 f3(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-5.645e-02, 1.760e-01, -4.482e-02, 2.093e-01, 1.129e-01, -9.060e-02, -6.022e-02, -2.884e-02, -8.049e-02, -5.757e-02, -1.983e-01, -5.161e-02, 6.733e-02, -1.468e-02, 1.825e-02, -7.886e-02)); + r += mul(s0_1, M4(7.052e-02, 8.472e-02, 1.384e-02, -3.865e-01, 2.505e-02, 1.044e-01, -1.588e-01, -8.696e-02, -1.147e-01, -4.587e-02, 2.314e-01, -7.237e-02, -1.459e-01, 2.923e-02, -2.466e-02, 5.795e-05)); + r += mul(s0_2, M4(-1.017e-01, -3.273e-01, -5.922e-02, -3.409e-02, 5.008e-03, -8.695e-02, 1.576e-02, -4.982e-02, -1.707e-01, -1.656e-01, -6.513e-02, 1.027e-01, -5.422e-02, 3.751e-02, 1.630e-03, 1.394e-02)); + r += mul(s0_3, M4(1.792e-01, 1.756e-01, -1.590e-01, -2.943e-01, -4.548e-02, 1.650e-02, -3.772e-02, 3.859e-02, -9.898e-03, -1.431e-01, 8.251e-03, -2.807e-02, 4.794e-02, 1.859e-02, 4.840e-02, 7.029e-02)); + r += mul(s0_4, M4(-2.933e-02, -5.911e-02, 3.245e-02, -7.475e-02, 5.743e-03, -5.643e-02, -1.475e-01, -7.419e-02, -1.841e-01, -4.314e-01, 1.638e-01, 1.587e-01, 3.185e-03, -4.497e-02, 1.671e-01, 5.262e-02)); + r += mul(s0_5, M4(-2.551e-02, -4.022e-02, -1.042e-01, -2.873e-01, -1.970e-01, -1.287e-02, 1.395e-01, 5.512e-02, -7.468e-03, 7.047e-02, -4.884e-03, -1.041e-01, -3.473e-02, 2.868e-02, -3.518e-02, -1.248e-01)); + r += mul(s0_6, M4(-4.804e-02, -6.818e-02, 1.479e-02, -1.791e-02, 4.143e-02, 1.913e-02, -7.768e-02, -2.089e-02, 2.541e-02, 1.560e-02, -2.345e-02, -2.922e-03, 5.163e-03, 4.283e-02, 7.362e-02, 2.913e-02)); + r += mul(s0_7, M4(-2.509e-02, -7.775e-02, -1.760e-01, -3.009e-01, -6.017e-03, -3.875e-02, 5.245e-02, -4.555e-02, 2.316e-01, -1.733e-02, -1.193e-02, -1.439e-02, 9.735e-03, 6.273e-02, -4.499e-02, 1.782e-02)); + r += mul(s0_8, M4(2.454e-03, -1.476e-01, -4.833e-02, -9.239e-02, -6.864e-02, -7.381e-03, 2.536e-02, 8.117e-02, 6.630e-02, -1.927e-01, -7.264e-02, -2.849e-02, -2.473e-02, 8.794e-02, -2.888e-02, -1.933e-02)); + r += mul(s1_0, M4(-2.151e-02, -6.765e-02, -1.943e-02, -5.016e-03, 6.872e-02, 5.624e-02, -7.056e-02, 6.857e-03, -2.249e-02, -4.201e-02, -4.781e-02, 3.855e-03, 8.819e-02, 1.557e-03, 2.673e-02, 3.076e-02)); + r += mul(s1_1, M4(3.736e-02, -2.357e-03, 5.260e-02, -2.960e-03, 7.647e-02, 9.028e-02, -1.166e-01, -1.988e-02, -1.324e-01, -6.872e-02, 1.139e-01, -1.696e-02, -2.381e-01, 4.614e-02, -1.438e-01, -7.316e-02)); + r += mul(s1_2, M4(-2.225e-02, 4.959e-02, 5.656e-02, -7.849e-02, -1.077e-01, -6.801e-02, -4.746e-02, 4.597e-02, 9.405e-02, 9.797e-02, 2.597e-02, 2.789e-02, -6.002e-02, -2.756e-02, 2.752e-01, 5.346e-01)); + r += mul(s1_3, M4(5.664e-02, -5.358e-02, -1.431e-01, 9.291e-02, 7.151e-02, -1.090e-01, 2.102e-02, 5.345e-02, -3.568e-02, 8.393e-03, 2.778e-02, 1.294e-01, -4.460e-02, -7.108e-02, 9.762e-03, 9.799e-02)); + r += mul(s1_4, M4(1.030e-02, -3.228e-02, 1.313e-01, -1.178e-01, 1.518e-02, -1.056e-01, -1.023e-01, -5.527e-02, -1.071e-01, -2.202e-03, 5.149e-02, -3.783e-02, -2.376e-01, 1.557e-01, 1.959e-01, -2.218e-01)); + r += mul(s1_5, M4(-2.501e-02, -1.042e-01, -6.742e-02, 5.240e-02, -2.588e-01, -2.092e-02, 4.741e-02, 8.323e-02, 2.351e-01, -5.172e-02, 1.022e-01, 9.954e-04, 1.106e-01, 3.128e-02, -1.142e-01, 3.759e-02)); + r += mul(s1_6, M4(-1.075e-02, -1.126e-01, -4.243e-02, 1.313e-01, 1.141e-02, 4.852e-02, -4.503e-02, 2.348e-02, -6.812e-02, -7.743e-02, 5.062e-02, -2.036e-02, 1.831e-01, 1.960e-01, 2.308e-02, -7.480e-03)); + r += mul(s1_7, M4(-6.154e-02, 9.237e-03, -6.533e-02, 7.397e-02, 2.490e-02, -7.969e-02, -1.440e-01, -1.737e-02, 6.058e-02, 2.642e-03, -4.691e-03, 6.744e-02, -8.907e-02, 7.858e-02, -5.016e-02, -4.814e-02)); + r += mul(s1_8, M4(3.128e-02, -1.888e-03, -1.742e-02, 3.375e-03, -4.486e-02, 3.767e-03, -5.692e-02, 1.178e-01, 6.251e-02, 3.410e-02, 5.704e-02, 4.748e-02, -7.627e-02, 2.175e-02, 1.323e-01, -3.631e-01)); + r += mul(s2_0, M4(3.771e-02, 1.045e-01, 6.410e-03, 9.760e-03, 3.716e-02, -3.304e-02, -8.617e-02, 2.439e-02, 1.424e-02, -1.170e-01, -2.423e-02, -9.178e-02, -4.673e-02, 3.414e-02, -2.216e-02, 1.508e-01)); + r += mul(s2_1, M4(2.048e-03, -1.847e-02, -3.567e-03, -1.800e-04, -3.242e-02, 1.191e-01, 2.908e-02, 3.510e-02, 2.226e-02, -5.740e-02, 4.474e-02, -5.995e-02, 2.677e-02, -1.098e-01, -2.528e-02, -3.653e-03)); + r += mul(s2_2, M4(-4.418e-03, -2.628e-02, 4.605e-02, -5.577e-02, 3.294e-02, 1.789e-01, 7.153e-02, -9.860e-02, -7.700e-03, -9.162e-02, -2.459e-02, -6.051e-04, 3.210e-02, -3.459e-02, -2.111e-02, -9.662e-02)); + r += mul(s2_3, M4(2.483e-02, 1.000e-01, 6.958e-02, 2.590e-01, 2.166e-02, 9.445e-02, -8.639e-03, -1.070e-02, 2.945e-02, 4.727e-02, -3.682e-03, -8.194e-03, -4.184e-02, -5.784e-02, 5.353e-02, 1.007e-01)); + r += mul(s2_4, M4(-1.562e-01, 6.380e-02, 1.257e-01, -1.055e-01, -8.258e-02, -1.609e-01, -3.429e-03, 2.550e-02, -3.265e-03, 7.062e-02, -2.790e-02, 1.797e-01, -8.019e-02, -8.687e-02, -7.915e-03, 3.030e-02)); + r += mul(s2_5, M4(-4.810e-02, -1.096e-01, -4.925e-02, 6.176e-02, 1.106e-01, 1.277e-01, -1.977e-02, -4.168e-02, -9.010e-02, -7.625e-02, -9.524e-03, 1.310e-01, 1.174e-01, 8.116e-02, 4.536e-02, -5.032e-03)); + r += mul(s2_6, M4(7.342e-03, 1.611e-02, 1.339e-01, 6.824e-02, 1.531e-02, 4.872e-02, -4.677e-02, -3.873e-02, -3.992e-02, 8.549e-02, 1.598e-02, 1.353e-01, 1.762e-02, 9.697e-02, -3.610e-04, -2.265e-03)); + r += mul(s2_7, M4(-2.853e-02, -2.286e-03, -1.737e-02, 4.676e-02, -9.264e-02, -9.177e-02, 3.828e-02, -1.984e-02, -1.343e-01, -5.662e-02, 5.047e-02, 1.247e-01, 6.769e-02, -1.240e-02, -2.290e-02, -1.459e-01)); + r += mul(s2_8, M4(-1.718e-02, 1.173e-01, 1.001e-01, 1.079e-02, 7.155e-03, -9.204e-02, 3.039e-03, 7.101e-02, 8.618e-02, -3.785e-02, 1.479e-02, -1.640e-02, -4.611e-02, 7.484e-02, -5.833e-02, 1.304e-03)); + r += mul(s3_0, M4(8.277e-03, -1.595e-01, -4.103e-02, -8.835e-02, -9.754e-03, -3.271e-02, -9.689e-02, 1.119e-01, -7.056e-02, -4.024e-02, -4.186e-02, -1.469e-01, -1.754e-01, 5.795e-02, 1.035e-01, 2.900e-01)); + r += mul(s3_1, M4(-1.051e-01, -4.836e-02, -1.145e-02, -1.092e-01, -2.848e-02, 1.265e-01, -7.104e-02, -1.082e-01, 3.574e-03, 2.179e-01, -6.690e-02, -2.639e-01, 9.831e-02, 2.523e-01, 1.111e-01, 3.380e-01)); + r += mul(s3_2, M4(9.900e-03, 2.524e-01, 4.151e-02, -5.739e-02, -7.735e-02, 1.450e-01, -3.100e-02, -1.813e-03, -6.282e-02, 8.410e-02, -6.079e-02, 9.522e-02, -6.133e-02, 1.919e-02, 3.723e-02, 1.790e-01)); + r += mul(s3_3, M4(1.168e-02, -5.182e-02, -8.629e-03, -4.605e-03, -7.267e-02, 7.730e-02, 4.429e-02, 1.348e-01, 1.449e-01, 4.781e-02, 1.475e-01, -3.369e-01, 8.468e-02, -1.454e-01, -1.867e-02, 3.212e-01)); + r += mul(s3_4, M4(-2.233e-01, -1.076e-01, -4.514e-03, -6.716e-02, 8.486e-02, 7.153e-02, -1.538e-01, -1.175e-01, -2.348e-01, 1.887e-01, 1.131e-01, 1.229e-01, -1.095e-01, 1.724e-01, -6.757e-02, 2.029e-01)); + r += mul(s3_5, M4(-9.904e-03, -2.001e-01, -5.167e-02, 4.948e-02, 2.417e-02, 2.727e-02, -3.665e-02, -1.685e-01, -1.830e-01, -5.641e-02, -1.353e-01, -3.405e-01, 1.950e-01, -1.364e-03, 6.277e-02, 1.835e-01)); + r += mul(s3_6, M4(-4.270e-02, 7.641e-02, -1.429e-02, -2.781e-03, -6.238e-02, -1.662e-01, -6.906e-02, 1.265e-01, -9.252e-02, 9.206e-02, -1.256e-01, -1.363e-01, -7.575e-02, -5.237e-02, -9.822e-02, -2.591e-01)); + r += mul(s3_7, M4(-7.352e-02, 8.076e-02, -2.072e-02, 1.302e-02, -2.489e-02, 1.206e-01, -1.319e-03, -3.979e-02, -1.784e-01, 8.184e-03, 2.105e-01, -1.754e-01, 3.353e-01, 2.512e-01, 2.847e-01, -2.669e-01)); + r += mul(s3_8, M4(8.568e-02, 7.808e-02, 4.092e-02, -6.036e-02, 6.053e-02, -2.914e-02, 1.325e-02, 1.042e-02, 1.044e-02, -2.953e-02, 2.030e-02, 1.755e-01, 1.239e-01, -2.500e-01, -7.221e-02, -2.046e-01)); + r += mul(s4_0, M4(5.722e-03, 4.126e-01, -3.613e-01, -2.603e-01, 2.610e-02, 1.147e-01, 1.529e-01, 1.412e-02, -1.607e-02, 9.082e-02, -5.023e-02, 7.084e-02, -1.773e-02, -5.129e-02, 4.868e-02, -8.452e-02)); + r += mul(s4_1, M4(-2.186e-01, 2.312e-01, -2.029e-01, -4.311e-01, -8.737e-02, 7.129e-02, -7.808e-02, -7.963e-02, 7.678e-02, -2.709e-02, 1.466e-01, 3.389e-02, 1.023e-01, 7.007e-02, -8.046e-02, 1.188e-01)); + r += mul(s4_2, M4(-3.997e-02, 3.701e-01, 2.073e-02, -4.759e-01, -5.424e-02, -9.812e-02, -1.673e-02, 1.760e-01, 2.068e-01, -1.508e-02, 9.934e-02, 1.182e-01, 7.226e-02, -2.287e-02, 5.119e-02, -4.459e-02)); + r += mul(s4_3, M4(-7.220e-02, -4.560e-02, 1.812e-01, 1.372e-01, -8.377e-02, 3.883e-02, -1.174e-01, -1.298e-01, 4.797e-02, 6.047e-02, -2.871e-02, 1.695e-01, 7.600e-02, -1.931e-02, -6.410e-02, -1.546e-01)); + r += mul(s4_4, M4(2.055e-01, -1.577e-01, 3.279e-01, -3.042e-02, 2.706e-02, -6.100e-02, -5.843e-02, 8.075e-03, 9.117e-02, 1.521e-01, -9.218e-02, -7.202e-02, -4.476e-02, -2.888e-02, 9.001e-03, 6.872e-02)); + r += mul(s4_5, M4(1.248e-01, 9.935e-02, 8.897e-03, 1.009e-02, 8.706e-02, -1.506e-01, -3.442e-02, -1.989e-01, -8.537e-02, 3.353e-02, 6.227e-02, -5.717e-02, -1.937e-02, -5.030e-02, 9.230e-02, 6.029e-02)); + r += mul(s4_6, M4(-2.969e-02, -1.519e-01, -5.197e-02, -2.457e-02, -3.014e-02, -3.094e-02, 3.255e-02, 1.176e-01, -2.714e-02, 6.242e-02, 2.370e-02, -3.218e-02, -6.600e-02, 1.331e-01, -4.780e-02, -8.487e-03)); + r += mul(s4_7, M4(-4.082e-02, 9.736e-03, -2.189e-01, -1.217e-01, -5.973e-02, 1.184e-01, 3.667e-02, 3.074e-03, -8.391e-03, -1.761e-01, 2.629e-02, -3.397e-02, 1.468e-01, -1.218e-01, -1.082e-02, 4.480e-02)); + r += mul(s4_8, M4(1.307e-01, -6.793e-02, 1.310e-01, 3.999e-02, 1.941e-02, -6.439e-02, 7.756e-02, -1.308e-01, -9.374e-02, 5.016e-02, 5.744e-02, 8.592e-02, -1.647e-02, -1.153e-02, 1.120e-02, 7.166e-02)); + r += mul(s5_0, M4(3.852e-02, -1.823e-02, -4.158e-03, -1.270e-01, 4.434e-02, 1.546e-01, -4.803e-02, -4.949e-02, -3.976e-03, 1.076e-01, 6.032e-02, -7.862e-02, -1.530e-01, 1.587e-01, -8.905e-02, -1.204e-01)); + r += mul(s5_1, M4(4.364e-02, 2.356e-02, 5.051e-02, 1.375e-01, -1.265e-01, -1.293e-01, -1.487e-01, 5.630e-02, -1.801e-01, -1.593e-02, 5.268e-02, 1.203e-02, 1.246e-01, 1.258e-01, -1.507e-02, 1.034e-01)); + r += mul(s5_2, M4(-4.812e-02, -2.163e-01, 1.380e-02, 3.241e-02, -8.598e-02, -2.474e-02, -3.968e-02, 3.293e-03, 8.254e-04, 1.689e-01, -6.810e-02, 6.548e-02, -5.382e-02, -4.789e-02, 3.962e-02, 1.161e-01)); + r += mul(s5_3, M4(-4.842e-02, 1.189e-01, -9.461e-03, -5.474e-03, -6.373e-02, -2.870e-02, -3.926e-02, 9.671e-02, 5.846e-02, -5.715e-02, 1.402e-01, -6.238e-02, 6.486e-02, 2.418e-01, -2.878e-02, -1.650e-02)); + r += mul(s5_4, M4(2.068e-01, 1.636e-02, 2.102e-02, -4.572e-02, -2.002e-01, -3.611e-02, -4.307e-02, 2.087e-01, -1.261e-01, -4.365e-02, -7.447e-02, 1.491e-02, -7.207e-02, 2.605e-01, -3.666e-02, -8.913e-03)); + r += mul(s5_5, M4(-1.282e-01, 1.015e-01, -4.817e-02, 4.154e-02, -4.017e-02, -2.169e-01, -3.384e-02, 8.651e-02, 5.858e-02, -7.025e-02, -8.502e-02, -3.576e-02, -3.016e-02, 1.050e-01, -9.661e-03, 1.072e-01)); + r += mul(s5_6, M4(-6.082e-02, 5.885e-02, 6.084e-02, 8.203e-02, -7.865e-02, 1.687e-01, -1.191e-01, 2.030e-01, -5.271e-02, -1.547e-01, -8.204e-02, -9.515e-02, -1.284e-01, -9.417e-02, -1.433e-01, 3.083e-02)); + r += mul(s5_7, M4(-2.314e-03, 4.900e-02, 9.433e-04, 2.277e-02, 2.046e-01, 6.075e-03, 1.429e-01, 2.992e-02, 8.627e-02, 3.431e-02, 4.757e-04, -4.053e-02, -3.486e-02, -1.552e-01, -6.662e-02, 7.499e-02)); + r += mul(s5_8, M4(1.484e-03, -1.217e-01, -9.341e-03, 1.989e-02, -5.407e-02, 2.549e-01, 2.559e-02, -3.438e-02, -1.755e-02, 4.560e-02, -2.738e-02, 2.149e-02, -8.420e-02, 1.302e-01, -1.704e-02, 4.946e-02)); + r += mul(s6_0, M4(7.802e-03, 2.278e-02, -1.119e-01, 2.124e-02, 1.067e-01, -3.640e-03, 2.168e-02, 1.909e-01, -1.058e-03, 1.661e-02, 6.322e-02, -3.902e-02, 2.047e-02, 2.947e-02, 5.102e-03, -6.674e-02)); + r += mul(s6_1, M4(2.630e-02, 3.320e-02, 6.457e-02, -1.115e-01, -1.025e-01, -4.112e-02, -5.155e-02, -1.293e-01, 4.904e-02, -9.469e-02, -5.323e-02, 8.098e-02, 9.945e-02, -1.583e-02, -7.869e-03, -9.910e-02)); + r += mul(s6_2, M4(-7.884e-02, 5.598e-02, 1.559e-02, -1.138e-01, 1.061e-01, -4.671e-03, -7.834e-02, -2.055e-02, -5.253e-02, 9.596e-02, -4.976e-02, 2.746e-02, -8.401e-02, -9.472e-02, 4.217e-02, 8.313e-03)); + r += mul(s6_3, M4(4.689e-03, -1.601e-01, 1.074e-02, -8.228e-02, -9.069e-02, -5.569e-02, -1.131e-01, 1.340e-03, 3.793e-03, 5.536e-02, 1.857e-02, 3.456e-02, -8.922e-02, 8.750e-02, -7.929e-02, -3.118e-02)); + r += mul(s6_4, M4(4.851e-02, 9.989e-02, 5.487e-02, 5.841e-02, -6.260e-02, -1.672e-01, -2.811e-02, -2.638e-02, 9.154e-02, -6.306e-02, 3.378e-02, -4.780e-02, 4.078e-02, -8.938e-02, -1.635e-02, 1.603e-01)); + r += mul(s6_5, M4(4.805e-02, 5.252e-02, -7.036e-04, 6.648e-02, -1.602e-03, 2.032e-02, 4.342e-02, 3.548e-02, 1.421e-02, -7.686e-04, -3.262e-02, -9.598e-02, -1.952e-02, -4.057e-02, 3.503e-02, -6.934e-03)); + r += mul(s6_6, M4(-1.160e-01, -7.098e-02, -8.229e-02, -8.787e-02, -6.369e-02, 1.392e-02, 1.723e-01, 2.007e-02, -1.959e-02, 1.816e-02, -5.830e-02, 4.776e-02, 5.662e-03, 1.789e-02, 8.129e-02, -3.355e-02)); + r += mul(s6_7, M4(9.544e-02, -1.052e-01, -2.019e-02, -1.729e-01, 9.737e-02, -4.807e-02, 6.829e-02, 7.081e-02, 3.774e-02, -2.293e-02, -9.601e-03, 7.726e-03, 3.375e-02, 8.823e-02, -9.270e-03, -1.209e-01)); + r += mul(s6_8, M4(-6.015e-02, -2.346e-02, 6.853e-02, 1.356e-02, 1.668e-02, -5.883e-02, 9.045e-02, 5.750e-02, 3.076e-03, 1.077e-01, 3.610e-02, -6.277e-02, 1.998e-02, 2.734e-02, -8.978e-04, -4.823e-02)); + r += mul(s7_0, M4(-5.415e-03, 1.558e-01, -4.855e-02, 8.577e-02, -2.017e-01, 1.171e-01, -4.947e-02, 2.320e-01, -6.848e-02, 1.222e-01, 4.514e-02, -3.591e-01, -3.449e-02, -1.256e-01, -9.128e-03, -3.761e-02)); + r += mul(s7_1, M4(1.660e-01, -4.438e-03, -4.232e-02, -1.495e-01, -1.065e-01, 6.896e-02, 1.516e-01, 4.233e-01, -2.965e-01, -2.973e-02, -5.702e-02, 8.025e-02, -2.896e-02, 1.296e-01, -1.252e-02, -3.026e-01)); + r += mul(s7_2, M4(-1.426e-01, -4.235e-02, 1.376e-01, 3.093e-01, 1.945e-02, 1.804e-01, -1.236e-01, -8.763e-02, 1.984e-03, 7.175e-03, -4.381e-02, 6.005e-02, 2.612e-02, 1.254e-02, -1.059e-01, 1.869e-01)); + r += mul(s7_3, M4(-1.239e-02, -5.878e-02, 1.832e-01, -4.102e-02, 3.603e-02, -2.616e-02, -7.645e-03, -2.384e-01, -4.864e-02, -6.193e-01, -5.429e-02, -2.627e-01, -5.015e-02, -1.542e-01, -1.451e-01, -2.159e-01)); + r += mul(s7_4, M4(2.153e-01, -6.111e-02, 6.958e-02, 9.047e-02, -1.440e-01, -4.363e-01, 1.504e-01, 1.883e-01, -3.967e-02, 1.885e-01, 3.403e-01, 3.098e-02, 1.393e-01, 2.831e-01, 8.139e-02, 3.354e-01)); + r += mul(s7_5, M4(-6.636e-02, 2.313e-01, 3.849e-02, -6.318e-02, 4.492e-02, -4.309e-02, 6.280e-02, -9.903e-02, -5.876e-02, -2.058e-02, -6.639e-02, -2.525e-02, -1.642e-02, 1.677e-01, 8.417e-02, 9.576e-02)); + r += mul(s7_6, M4(-1.045e-01, 1.402e-01, 1.075e-01, 5.835e-02, 2.309e-01, 1.113e-01, -3.922e-01, -2.443e-01, 1.291e-02, -2.973e-01, 1.194e-01, -1.155e-01, -3.812e-02, 6.339e-02, 3.666e-02, -1.579e-01)); + r += mul(s7_7, M4(6.005e-02, 9.900e-02, 1.610e-01, 3.982e-02, 2.791e-01, -2.210e-01, 1.709e-01, 1.389e-01, -4.963e-02, -1.665e-01, 1.041e-01, 2.385e-01, -7.028e-02, 6.870e-02, 3.517e-02, 4.387e-02)); + r += mul(s7_8, M4(-1.033e-01, -1.854e-02, 1.973e-01, 2.803e-01, -1.608e-01, -3.143e-01, -1.644e-01, 1.757e-01, -3.980e-02, -1.228e-01, -2.332e-02, -4.506e-02, -1.868e-01, -1.363e-01, 6.617e-02, -2.526e-01)); + r += V4(1.765e-02, -1.702e-03, 6.218e-02, 1.051e-01); + return r; +} + +void Pass6(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = Rmp8x8(tid.x) + blockStart; + uint2 size = GetInputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = (gxy + 0.5) * pt; + + V4 s0_0 = l0(-1.0, -1.0); + V4 s0_1 = l0(0.0, -1.0); + V4 s0_2 = l0(1.0, -1.0); + V4 s0_3 = l0(-1.0, 0.0); + V4 s0_4 = l0(0.0, 0.0); + V4 s0_5 = l0(1.0, 0.0); + V4 s0_6 = l0(-1.0, 1.0); + V4 s0_7 = l0(0.0, 1.0); + V4 s0_8 = l0(1.0, 1.0); + V4 s1_0 = -max(-s0_0, 0.0); + V4 s1_1 = -max(-s0_1, 0.0); + V4 s1_2 = -max(-s0_2, 0.0); + V4 s1_3 = -max(-s0_3, 0.0); + V4 s1_4 = -max(-s0_4, 0.0); + V4 s1_5 = -max(-s0_5, 0.0); + V4 s1_6 = -max(-s0_6, 0.0); + V4 s1_7 = -max(-s0_7, 0.0); + V4 s1_8 = -max(-s0_8, 0.0); + s0_0 = max(s0_0, 0.0); + s0_1 = max(s0_1, 0.0); + s0_2 = max(s0_2, 0.0); + s0_3 = max(s0_3, 0.0); + s0_4 = max(s0_4, 0.0); + s0_5 = max(s0_5, 0.0); + s0_6 = max(s0_6, 0.0); + s0_7 = max(s0_7, 0.0); + s0_8 = max(s0_8, 0.0); + + V4 s2_0 = l1(-1.0, -1.0); + V4 s2_1 = l1(0.0, -1.0); + V4 s2_2 = l1(1.0, -1.0); + V4 s2_3 = l1(-1.0, 0.0); + V4 s2_4 = l1(0.0, 0.0); + V4 s2_5 = l1(1.0, 0.0); + V4 s2_6 = l1(-1.0, 1.0); + V4 s2_7 = l1(0.0, 1.0); + V4 s2_8 = l1(1.0, 1.0); + V4 s3_0 = -max(-s2_0, 0.0); + V4 s3_1 = -max(-s2_1, 0.0); + V4 s3_2 = -max(-s2_2, 0.0); + V4 s3_3 = -max(-s2_3, 0.0); + V4 s3_4 = -max(-s2_4, 0.0); + V4 s3_5 = -max(-s2_5, 0.0); + V4 s3_6 = -max(-s2_6, 0.0); + V4 s3_7 = -max(-s2_7, 0.0); + V4 s3_8 = -max(-s2_8, 0.0); + s2_0 = max(s2_0, 0.0); + s2_1 = max(s2_1, 0.0); + s2_2 = max(s2_2, 0.0); + s2_3 = max(s2_3, 0.0); + s2_4 = max(s2_4, 0.0); + s2_5 = max(s2_5, 0.0); + s2_6 = max(s2_6, 0.0); + s2_7 = max(s2_7, 0.0); + s2_8 = max(s2_8, 0.0); + + V4 s4_0 = l2(-1.0, -1.0); + V4 s4_1 = l2(0.0, -1.0); + V4 s4_2 = l2(1.0, -1.0); + V4 s4_3 = l2(-1.0, 0.0); + V4 s4_4 = l2(0.0, 0.0); + V4 s4_5 = l2(1.0, 0.0); + V4 s4_6 = l2(-1.0, 1.0); + V4 s4_7 = l2(0.0, 1.0); + V4 s4_8 = l2(1.0, 1.0); + V4 s5_0 = -max(-s4_0, 0.0); + V4 s5_1 = -max(-s4_1, 0.0); + V4 s5_2 = -max(-s4_2, 0.0); + V4 s5_3 = -max(-s4_3, 0.0); + V4 s5_4 = -max(-s4_4, 0.0); + V4 s5_5 = -max(-s4_5, 0.0); + V4 s5_6 = -max(-s4_6, 0.0); + V4 s5_7 = -max(-s4_7, 0.0); + V4 s5_8 = -max(-s4_8, 0.0); + s4_0 = max(s4_0, 0.0); + s4_1 = max(s4_1, 0.0); + s4_2 = max(s4_2, 0.0); + s4_3 = max(s4_3, 0.0); + s4_4 = max(s4_4, 0.0); + s4_5 = max(s4_5, 0.0); + s4_6 = max(s4_6, 0.0); + s4_7 = max(s4_7, 0.0); + s4_8 = max(s4_8, 0.0); + + V4 s6_0 = l3(-1.0, -1.0); + V4 s6_1 = l3(0.0, -1.0); + V4 s6_2 = l3(1.0, -1.0); + V4 s6_3 = l3(-1.0, 0.0); + V4 s6_4 = l3(0.0, 0.0); + V4 s6_5 = l3(1.0, 0.0); + V4 s6_6 = l3(-1.0, 1.0); + V4 s6_7 = l3(0.0, 1.0); + V4 s6_8 = l3(1.0, 1.0); + V4 s7_0 = -max(-s6_0, 0.0); + V4 s7_1 = -max(-s6_1, 0.0); + V4 s7_2 = -max(-s6_2, 0.0); + V4 s7_3 = -max(-s6_3, 0.0); + V4 s7_4 = -max(-s6_4, 0.0); + V4 s7_5 = -max(-s6_5, 0.0); + V4 s7_6 = -max(-s6_6, 0.0); + V4 s7_7 = -max(-s6_7, 0.0); + V4 s7_8 = -max(-s6_8, 0.0); + s6_0 = max(s6_0, 0.0); + s6_1 = max(s6_1, 0.0); + s6_2 = max(s6_2, 0.0); + s6_3 = max(s6_3, 0.0); + s6_4 = max(s6_4, 0.0); + s6_5 = max(s6_5, 0.0); + s6_6 = max(s6_6, 0.0); + s6_7 = max(s6_7, 0.0); + s6_8 = max(s6_8, 0.0); + + t4[gxy] = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t5[gxy] = f1(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t6[gxy] = f2(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t7[gxy] = f3(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); +} + +//!PASS 7 +//!DESC conv6 +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 +//!IN t4, t5, t6, t7 +//!OUT t0, t1, t2, t3 + +#define l0(x, y) V4(O(t4, float2(x, y))) +#define l1(x, y) V4(O(t5, float2(x, y))) +#define l2(x, y) V4(O(t6, float2(x, y))) +#define l3(x, y) V4(O(t7, float2(x, y))) + +V4 f0(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(2.718e-02, -8.202e-02, -1.018e-02, -2.853e-02, 1.284e-01, 1.685e-01, 1.379e-01, -3.260e-02, 9.981e-02, -8.816e-02, -2.800e-02, -1.010e-01, 8.629e-02, 7.835e-02, -1.294e-01, 1.779e-01)); + r += mul(s0_1, M4(-6.872e-02, 1.356e-01, -9.820e-02, -9.784e-02, -1.085e-01, 3.509e-01, -5.979e-02, -8.904e-02, -2.321e-02, -1.062e-01, -5.778e-02, -4.640e-02, 9.204e-02, 1.361e-01, -1.740e-02, -1.916e-02)); + r += mul(s0_2, M4(-1.198e-02, -6.108e-02, -1.008e-01, 3.357e-02, -6.802e-02, -5.062e-02, 6.497e-02, 1.741e-01, -1.439e-02, -5.226e-02, -5.589e-02, -7.474e-02, -2.590e-02, 3.298e-01, 8.048e-02, 1.229e-01)); + r += mul(s0_3, M4(1.860e-02, 9.250e-02, 3.856e-02, -1.645e-02, -7.198e-02, -1.508e-01, -3.717e-01, 4.135e-02, 6.046e-02, -2.484e-02, -9.424e-02, -3.065e-02, 9.249e-02, 1.777e-01, -6.886e-02, 8.792e-02)); + r += mul(s0_4, M4(5.500e-02, 3.055e-03, 6.353e-02, -6.284e-02, 2.039e-01, 3.722e-01, 1.045e-01, 2.724e-01, -1.155e-02, -8.339e-02, -1.767e-01, -1.583e-02, 1.247e-02, -2.453e-01, 5.363e-02, -4.501e-02)); + r += mul(s0_5, M4(1.291e-02, -5.202e-02, 2.248e-02, -8.016e-02, -5.284e-04, 2.620e-02, -2.476e-01, -9.224e-02, 1.196e-02, 2.394e-02, 1.143e-01, -4.312e-02, 2.713e-01, -3.638e-02, 8.680e-02, -2.256e-02)); + r += mul(s0_6, M4(6.454e-03, -8.439e-02, -9.302e-02, 3.210e-02, -6.510e-02, 1.940e-01, 2.069e-01, 1.123e-01, -4.923e-02, 4.551e-02, -2.022e-02, 3.547e-02, -6.468e-02, 5.224e-02, -1.750e-01, 1.339e-03)); + r += mul(s0_7, M4(5.755e-02, 2.565e-02, 4.476e-02, -9.249e-02, -1.089e-01, -2.646e-01, 1.455e-01, -2.039e-01, -1.507e-02, -1.947e-02, -1.136e-01, 9.155e-02, 1.617e-02, -5.956e-02, 9.479e-02, -1.012e-01)); + r += mul(s0_8, M4(-3.537e-02, 2.375e-03, 6.685e-02, 6.837e-02, -7.694e-02, 5.882e-02, 6.707e-02, -4.092e-02, 4.985e-02, -1.126e-02, -3.756e-02, -5.434e-02, -7.286e-02, -4.212e-02, 2.833e-01, 1.419e-01)); + r += mul(s1_0, M4(4.212e-02, 6.631e-02, 4.420e-01, -3.196e-01, 6.577e-02, -8.087e-02, -1.349e-01, 5.879e-02, -6.299e-02, -2.390e-01, 5.608e-01, 7.497e-02, -3.163e-02, -1.203e-01, 9.255e-03, 2.999e-02)); + r += mul(s1_1, M4(1.229e-02, 4.567e-01, 2.967e-02, -7.213e-02, -7.642e-02, 8.068e-02, -8.311e-02, -4.991e-02, -7.415e-02, 7.353e-03, 2.453e-01, -9.773e-03, -1.255e-03, -5.383e-02, -1.016e-03, 3.668e-02)); + r += mul(s1_2, M4(-6.950e-02, -9.309e-02, 1.066e-01, 1.217e-01, -4.669e-03, -4.614e-02, -5.387e-03, -1.617e-02, -4.648e-02, -4.560e-02, 5.137e-01, 1.159e-01, -4.001e-02, 6.399e-02, -3.983e-02, 2.518e-02)); + r += mul(s1_3, M4(1.325e-01, 3.240e-03, 4.325e-02, -5.013e-02, -8.231e-02, 3.874e-03, -6.022e-02, -4.994e-04, 1.329e-01, 4.500e-03, 3.934e-01, 2.831e-01, 4.297e-02, -8.310e-02, -4.804e-02, -2.274e-02)); + r += mul(s1_4, M4(-2.826e-02, -4.163e-01, -4.497e-02, -1.253e-01, 2.032e-01, 1.174e-01, 7.893e-02, -6.914e-02, 1.188e-01, 2.026e-02, 5.545e-01, 1.031e-01, -1.924e-02, -1.102e-01, 7.859e-02, -1.259e-01)); + r += mul(s1_5, M4(-9.041e-03, -1.733e-02, -1.069e-01, -1.481e-01, -2.549e-02, -8.548e-02, 3.717e-02, -3.341e-02, 6.513e-02, -8.513e-02, 3.118e-01, 2.700e-01, -5.118e-02, -6.066e-02, -3.830e-02, -5.354e-02)); + r += mul(s1_6, M4(-1.181e-01, -2.687e-01, 3.724e-01, -1.612e-02, -4.786e-02, 2.826e-02, -9.258e-03, -2.180e-02, 6.983e-02, 6.348e-02, 3.651e-01, 2.823e-01, -1.002e-03, -2.888e-02, -8.482e-02, 1.129e-02)); + r += mul(s1_7, M4(1.131e-01, 3.864e-01, 1.880e-01, 2.186e-02, -6.575e-02, -2.174e-02, -6.042e-02, -1.454e-01, 1.182e-01, 8.384e-02, 8.385e-02, 8.963e-02, 6.162e-02, 3.319e-02, 5.248e-02, 6.789e-02)); + r += mul(s1_8, M4(-1.187e-01, -4.859e-02, 3.125e-01, 1.742e-01, -2.494e-02, 1.867e-02, -6.954e-03, 1.037e-01, 5.038e-02, 1.575e-01, 4.483e-01, 8.318e-02, 4.146e-02, 1.397e-02, -2.191e-02, 1.146e-01)); + r += mul(s2_0, M4(8.602e-02, 8.163e-02, -7.871e-02, 4.891e-02, 7.932e-02, -9.431e-03, 3.915e-02, -8.264e-02, 1.969e-02, -2.648e-02, -3.828e-02, 3.037e-01, 2.901e-02, -1.117e-02, 7.057e-02, -1.210e-01)); + r += mul(s2_1, M4(6.053e-02, 8.860e-02, -1.744e-02, -1.174e-01, -2.299e-02, 5.356e-02, -6.969e-02, 3.081e-02, 1.885e-01, -1.362e-01, 9.485e-02, -2.466e-02, -1.316e-02, -3.166e-02, 1.153e-01, -4.538e-02)); + r += mul(s2_2, M4(-1.955e-03, -1.712e-02, -4.516e-02, 4.962e-03, -3.919e-03, -5.276e-02, 8.403e-02, -1.010e-01, -2.613e-02, 1.075e-02, -1.780e-02, 9.267e-02, -3.857e-02, 3.668e-02, 8.124e-03, 9.187e-02)); + r += mul(s2_3, M4(-9.735e-02, -2.692e-02, -1.537e-03, 6.853e-03, 1.831e-02, -6.472e-02, -4.426e-02, -7.690e-02, -5.143e-02, 1.587e-01, -1.201e-01, 2.530e-01, -4.265e-02, 6.130e-02, -1.247e-01, 5.403e-02)); + r += mul(s2_4, M4(-2.698e-01, -1.373e-01, -1.386e-01, -1.182e-01, 1.186e-01, 4.950e-02, 3.269e-02, 1.779e-02, -5.773e-04, -9.727e-02, -1.069e-02, -7.154e-02, -1.154e-02, -1.324e-01, 2.176e-01, 1.509e-01)); + r += mul(s2_5, M4(-7.123e-02, -9.497e-02, 2.233e-02, -4.065e-02, -4.490e-02, -2.027e-03, -6.521e-02, -1.152e-01, 3.282e-02, -1.918e-01, -1.698e-01, -9.488e-02, -5.553e-03, -4.072e-02, -2.341e-02, -4.568e-02)); + r += mul(s2_6, M4(1.462e-02, 1.500e-02, 1.312e-01, -2.640e-02, 6.620e-03, 6.753e-02, -5.512e-02, -6.508e-03, 3.561e-02, 1.192e-01, -2.606e-01, 2.067e-02, 9.152e-03, -1.196e-01, -8.657e-02, 2.429e-03)); + r += mul(s2_7, M4(-1.313e-01, 4.200e-02, 4.716e-03, -1.465e-02, -4.390e-02, 3.163e-02, -1.107e-01, 1.014e-01, 6.789e-02, 4.372e-02, 2.473e-02, -1.312e-01, 5.449e-02, 1.128e-01, -1.488e-01, 3.109e-02)); + r += mul(s2_8, M4(4.463e-02, 2.577e-02, -1.173e-01, 3.381e-02, 5.763e-02, 1.161e-01, 8.468e-03, -5.726e-02, -2.768e-03, 2.967e-01, 8.417e-02, 2.286e-01, -8.721e-02, -4.468e-02, 5.642e-02, 3.393e-02)); + r += mul(s3_0, M4(2.785e-02, -1.059e-02, -6.081e-02, 6.824e-02, 1.019e-01, -4.879e-02, 2.369e-01, 5.359e-02, -1.638e-02, 7.854e-02, -4.884e-03, 2.060e-02, -4.335e-02, -1.612e-01, -1.381e-01, 1.541e-02)); + r += mul(s3_1, M4(5.914e-03, 1.536e-01, -7.971e-02, -5.216e-02, -1.790e-01, -6.957e-02, 2.063e-01, 1.364e-01, -4.783e-02, -5.646e-02, 3.047e-02, 1.945e-01, -1.324e-02, -1.024e-01, 3.042e-02, -1.551e-01)); + r += mul(s3_2, M4(-6.871e-03, -8.348e-03, -1.394e-01, -1.532e-01, -1.077e-02, 1.294e-02, 9.267e-02, 1.262e-02, -2.229e-02, 3.517e-02, -3.753e-02, 3.624e-02, -5.983e-02, 1.235e-01, -2.210e-01, 2.210e-01)); + r += mul(s3_3, M4(-9.624e-02, 6.428e-02, -1.367e-01, -1.417e-01, -6.039e-02, -1.822e-01, 9.018e-02, -3.782e-02, 1.110e-02, 8.363e-02, -6.648e-02, 6.115e-02, -6.637e-02, 1.008e-01, -6.245e-02, -1.080e-01)); + r += mul(s3_4, M4(-2.911e-01, -2.933e-02, -1.957e-01, -1.033e-01, -1.247e-01, -2.825e-02, 1.588e-01, -3.565e-02, -6.421e-02, 1.126e-01, -3.898e-02, -2.168e-01, -9.752e-02, 5.089e-02, -6.571e-02, -1.463e-01)); + r += mul(s3_5, M4(-1.158e-02, -1.587e-01, -7.006e-02, -1.320e-01, -1.008e-01, 8.504e-02, -1.884e-01, 1.124e-01, -1.977e-02, -2.067e-02, 2.861e-02, 9.328e-02, -9.525e-03, 1.805e-02, 7.065e-02, 9.978e-02)); + r += mul(s3_6, M4(6.207e-02, -4.493e-02, -3.972e-02, 2.911e-02, -6.406e-02, 1.111e-01, 2.152e-01, 7.599e-02, 6.640e-02, 3.720e-02, 1.199e-02, -3.906e-02, -3.175e-02, -9.507e-02, 1.091e-02, 1.388e-01)); + r += mul(s3_7, M4(-4.887e-02, 2.451e-01, 7.242e-02, -3.975e-02, -1.296e-02, -4.460e-03, 1.782e-01, 5.657e-02, 7.401e-02, -1.326e-01, 1.258e-01, -1.073e-01, 6.708e-02, 1.576e-02, -1.016e-01, -5.122e-02)); + r += mul(s3_8, M4(5.060e-02, 1.423e-01, 3.109e-02, 5.104e-02, -5.501e-03, 1.125e-01, 2.659e-01, 1.597e-01, -5.607e-02, -7.684e-02, 7.059e-02, 7.088e-03, -7.478e-02, -1.325e-01, -5.496e-02, -9.790e-02)); + r += mul(s4_0, M4(1.218e-02, 2.151e-02, 1.673e-01, 1.103e-02, -7.209e-02, 4.635e-02, -4.470e-02, -5.261e-02, -4.842e-02, -7.382e-02, -1.920e-02, 6.781e-02, 2.520e-02, 2.799e-03, -9.569e-03, 6.933e-02)); + r += mul(s4_1, M4(1.102e-02, -1.021e-01, -2.305e-03, -8.108e-02, 5.554e-02, 2.008e-01, 3.914e-01, 1.719e-01, 1.665e-01, 7.755e-02, 4.383e-02, -2.259e-01, 1.642e-02, 2.737e-02, -3.519e-02, -3.913e-02)); + r += mul(s4_2, M4(3.852e-02, 1.418e-01, -3.151e-02, -8.120e-02, 4.332e-02, 3.105e-02, 1.170e-02, -3.059e-01, -6.805e-02, 8.697e-02, 1.121e-01, 7.421e-02, -7.301e-02, -7.581e-02, -2.036e-02, 2.260e-02)); + r += mul(s4_3, M4(-1.036e-02, -8.341e-03, 5.250e-02, 7.334e-02, -1.674e-01, 9.886e-02, 1.259e-01, 9.253e-02, 4.640e-02, -1.901e-01, 1.677e-03, -2.622e-01, 4.458e-02, 1.031e-01, -3.293e-02, -8.904e-02)); + r += mul(s4_4, M4(1.049e-01, 2.466e-01, 7.060e-02, -1.470e-01, 2.054e-01, -1.733e-01, 2.426e-01, 2.133e-01, 5.399e-02, -1.486e-01, 3.915e-01, 1.883e-02, 5.895e-02, 6.983e-02, -3.277e-02, 1.228e-02)); + r += mul(s4_5, M4(-1.389e-02, 5.923e-02, -3.840e-02, -8.082e-02, 4.228e-02, -7.239e-02, 8.146e-02, -1.037e-01, 2.015e-03, -2.648e-01, 8.532e-04, -1.395e-01, -1.921e-02, -1.184e-01, 2.170e-01, -1.655e-01)); + r += mul(s4_6, M4(2.296e-02, -1.426e-01, -6.419e-02, 1.021e-01, -1.598e-01, 1.131e-02, -9.871e-02, -1.011e-01, -1.533e-02, 3.144e-02, 1.096e-01, -4.111e-02, -2.128e-02, 7.637e-02, 7.540e-03, 7.346e-03)); + r += mul(s4_7, M4(-5.896e-02, 3.258e-03, -2.254e-02, -2.093e-02, 7.896e-02, 2.150e-01, -3.433e-02, 2.686e-01, -1.904e-01, -1.228e-01, -7.412e-02, 7.048e-02, -4.302e-02, -4.938e-02, -5.080e-03, 1.112e-01)); + r += mul(s4_8, M4(4.020e-04, 3.734e-02, 4.885e-02, 1.918e-02, -3.440e-02, 2.046e-01, 1.329e-01, 1.036e-01, 8.043e-02, 1.284e-01, -1.279e-01, 3.412e-02, -3.367e-02, -5.869e-03, 1.358e-01, -9.986e-02)); + r += mul(s5_0, M4(1.178e-01, -7.698e-02, 3.072e-01, -1.409e-01, 3.090e-02, -2.276e-02, -1.763e-02, 7.773e-03, -2.988e-02, 1.588e-02, -2.691e-02, 1.206e-02, -9.949e-03, -7.274e-02, 4.947e-03, -1.092e-01)); + r += mul(s5_1, M4(6.552e-02, -1.524e-01, -3.714e-02, 2.934e-02, 2.685e-02, -6.010e-02, 7.930e-02, -4.521e-02, 2.721e-02, -4.498e-02, -1.168e-01, 4.876e-02, 9.393e-02, -1.674e-01, -8.292e-02, -1.659e-01)); + r += mul(s5_2, M4(1.975e-02, -1.259e-01, 5.959e-02, 1.999e-01, -1.048e-02, 4.878e-03, -1.101e-01, -2.550e-02, -1.032e-01, 1.116e-01, -1.352e-02, -2.595e-02, -8.715e-02, 2.644e-02, 4.559e-02, 9.168e-02)); + r += mul(s5_3, M4(-6.535e-03, -9.066e-02, -6.275e-02, -6.391e-02, -6.771e-02, 8.922e-03, -6.393e-02, 2.557e-02, 4.329e-02, -1.172e-02, -5.372e-02, -6.124e-02, -2.495e-02, 8.173e-02, 7.240e-02, 4.019e-04)); + r += mul(s5_4, M4(6.099e-02, -2.626e-03, 3.458e-02, -1.937e-01, -2.284e-02, 6.375e-02, 1.479e-01, 2.374e-02, 9.197e-02, -5.561e-02, 9.715e-02, 3.070e-02, -5.534e-02, -3.551e-03, -1.670e-01, 7.501e-02)); + r += mul(s5_5, M4(-1.184e-01, -5.429e-02, 6.619e-02, 2.845e-01, -6.615e-02, 9.224e-02, -5.191e-02, -4.821e-02, -6.042e-02, 1.088e-01, -1.289e-01, -1.072e-02, -2.543e-02, 9.190e-02, 1.927e-01, 1.001e-01)); + r += mul(s5_6, M4(4.843e-02, -7.430e-03, -1.792e-01, 5.214e-02, 1.266e-01, 2.282e-02, 4.797e-02, -6.325e-02, -2.908e-02, 5.965e-02, 1.469e-01, -3.692e-02, 4.308e-02, -5.790e-02, 1.247e-01, -2.660e-02)); + r += mul(s5_7, M4(-1.313e-01, 7.601e-02, 1.268e-01, 4.791e-02, 1.074e-02, 2.548e-03, 1.374e-02, -1.269e-02, 3.504e-03, -4.516e-02, -1.498e-01, -7.743e-03, -1.316e-01, -1.548e-01, 1.141e-01, 1.482e-03)); + r += mul(s5_8, M4(-1.067e-01, 1.248e-01, 1.804e-02, 1.316e-01, 6.398e-03, -4.954e-02, -9.201e-02, 6.812e-02, -6.143e-04, 1.105e-01, 8.999e-02, 4.903e-03, 2.723e-02, -6.166e-02, -2.427e-01, 8.678e-02)); + r += mul(s6_0, M4(1.701e-02, 1.660e-02, -9.245e-02, 1.947e-02, 3.430e-02, 2.100e-01, 5.866e-02, -2.613e-02, 1.074e-01, 8.556e-02, 2.093e-02, -8.908e-02, -1.178e-02, -8.203e-03, -2.976e-02, 3.667e-02)); + r += mul(s6_1, M4(-2.865e-02, 2.035e-03, -5.570e-02, -1.005e-01, -3.399e-02, -7.246e-02, -2.762e-02, -8.589e-02, 4.469e-02, 1.807e-02, 1.042e-01, -1.067e-01, -9.374e-02, 3.830e-02, -1.881e-02, -9.340e-02)); + r += mul(s6_2, M4(1.604e-02, 1.328e-01, -3.945e-02, -1.031e-02, -6.211e-02, 7.338e-02, 1.133e-01, -9.377e-02, 4.133e-02, 9.163e-02, 1.248e-02, -1.140e-01, 2.810e-02, 1.988e-03, 9.841e-02, 1.403e-02)); + r += mul(s6_3, M4(2.370e-02, 2.131e-01, 2.920e-02, 1.542e-01, 2.497e-03, -1.257e-01, -2.220e-02, -5.964e-02, 1.046e-01, 3.582e-02, -1.902e-02, 1.093e-01, 2.618e-02, -3.815e-02, 8.446e-03, 7.871e-02)); + r += mul(s6_4, M4(-1.371e-02, 2.870e-02, 7.790e-02, 1.004e-01, 8.721e-02, -2.532e-02, -6.529e-02, 4.617e-02, 1.389e-01, -3.184e-02, -9.137e-02, 1.153e-01, -1.178e-02, -2.234e-02, 1.553e-01, 6.849e-02)); + r += mul(s6_5, M4(4.234e-02, 5.281e-02, -3.948e-02, 1.317e-01, 1.076e-02, 4.162e-02, -1.819e-02, -3.984e-02, -4.877e-03, 1.394e-01, -2.293e-02, -1.243e-01, 2.700e-02, -9.312e-02, 9.248e-02, 1.556e-02)); + r += mul(s6_6, M4(9.469e-03, 6.629e-02, -5.120e-02, -6.551e-02, 3.036e-02, 1.461e-01, -1.170e-01, -3.343e-02, -1.426e-02, -1.603e-01, -1.183e-01, 1.528e-01, 1.619e-02, -3.091e-02, -1.457e-01, 6.681e-02)); + r += mul(s6_7, M4(-9.827e-02, -7.408e-02, 2.393e-01, -5.931e-02, -2.101e-02, -7.364e-02, -1.364e-01, 2.930e-02, 1.234e-01, 4.634e-03, 6.662e-03, 3.655e-02, -2.111e-02, -9.549e-02, -1.476e-01, -1.065e-01)); + r += mul(s6_8, M4(3.380e-02, -3.526e-02, 1.144e-01, 1.057e-01, -6.014e-02, 2.498e-02, 1.163e-02, 6.108e-02, 8.905e-02, -8.968e-02, -7.837e-02, 2.151e-02, -2.935e-02, 9.576e-02, -1.446e-02, 6.072e-02)); + r += mul(s7_0, M4(-5.216e-02, -2.012e-01, -7.780e-02, -8.909e-02, 1.070e-01, 1.525e-02, -4.843e-02, -7.690e-02, 9.561e-02, 2.095e-01, -1.436e-01, 4.353e-02, -1.491e-02, 1.593e-01, 1.141e-01, -9.252e-02)); + r += mul(s7_1, M4(-6.736e-02, -2.779e-01, -1.413e-01, -1.304e-02, -1.817e-01, -1.142e-01, -9.634e-02, -1.399e-01, 8.054e-02, 5.630e-03, 9.265e-03, 6.376e-03, -8.055e-02, -8.913e-03, 7.448e-02, -2.056e-02)); + r += mul(s7_2, M4(2.290e-02, -1.795e-01, -1.198e-01, 9.352e-03, 6.372e-03, -8.201e-02, 7.925e-02, -1.324e-01, 6.270e-02, 2.219e-01, -1.141e-02, -8.024e-02, -3.504e-02, -4.899e-02, 1.160e-02, 9.325e-02)); + r += mul(s7_3, M4(2.246e-02, 1.945e-02, 1.189e-02, 2.097e-02, -1.055e-01, -1.246e-01, -5.041e-02, 8.908e-02, 2.917e-02, 2.635e-01, 4.136e-02, 1.109e-01, 1.061e-01, -1.678e-01, -4.121e-02, -4.184e-02)); + r += mul(s7_4, M4(-7.905e-02, -6.206e-02, -1.191e-01, -1.134e-01, 9.001e-02, 1.080e-01, -2.708e-02, 5.197e-02, 4.085e-02, -3.313e-01, 1.441e-01, 6.758e-02, 2.182e-02, 3.359e-02, -3.803e-02, -8.723e-03)); + r += mul(s7_5, M4(-5.527e-02, -1.682e-01, -1.711e-01, -7.321e-02, 3.732e-02, 2.499e-02, 2.254e-01, 3.600e-03, -1.251e-03, 8.911e-02, -1.379e-01, -2.739e-01, -6.599e-02, 2.278e-01, -5.999e-02, 1.317e-01)); + r += mul(s7_6, M4(-1.773e-02, 4.685e-02, 4.355e-02, -1.319e-01, -4.260e-02, 8.012e-02, -1.192e-01, -4.538e-02, -1.433e-01, -8.129e-02, 2.356e-01, 6.303e-02, -5.751e-02, 1.925e-02, 3.169e-02, 5.002e-02)); + r += mul(s7_7, M4(-1.623e-02, 1.433e-01, 4.231e-02, -5.840e-02, 2.220e-02, -1.479e-01, 3.722e-02, -6.694e-02, 5.373e-02, -1.452e-01, -3.046e-01, -2.998e-01, -8.402e-02, 9.354e-02, -2.874e-02, -5.484e-02)); + r += mul(s7_8, M4(-3.694e-02, 1.443e-01, -9.271e-02, -8.724e-02, 1.410e-02, -2.405e-02, 7.101e-02, 6.669e-02, -2.002e-04, -1.301e-01, 1.144e-01, 7.191e-02, -1.026e-01, 6.668e-02, 1.914e-01, -2.186e-01)); + r += V4(5.993e-02, 1.598e-03, 2.229e-02, -1.137e-03); + return r; +} + +V4 f1(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-1.449e-03, -3.788e-02, -4.817e-02, -8.433e-02, 8.525e-02, -1.420e-01, 3.820e-02, -7.027e-02, 4.990e-02, 3.606e-02, 3.455e-02, 1.869e-02, 7.023e-02, 5.933e-03, -7.956e-02, -5.912e-02)); + r += mul(s0_1, M4(-4.060e-02, 9.119e-02, 1.689e-02, 4.286e-02, -6.902e-02, -1.270e-01, -2.063e-01, -8.242e-02, 3.139e-02, 6.294e-03, -1.535e-02, -5.555e-02, 1.062e-01, 7.910e-02, -6.309e-02, -1.927e-01)); + r += mul(s0_2, M4(-1.844e-02, 8.690e-02, 3.352e-02, -1.314e-01, -5.473e-02, 1.449e-01, -6.495e-02, -1.065e-01, -1.411e-03, 3.043e-02, 9.582e-02, 3.510e-02, 1.066e-01, -7.012e-02, 4.948e-02, 6.898e-02)); + r += mul(s0_3, M4(6.229e-02, -7.540e-02, -9.648e-03, 5.513e-02, -2.084e-02, 1.864e-01, -9.347e-02, 1.115e-01, -8.091e-02, 3.918e-03, -9.502e-02, -1.516e-02, -6.488e-03, -9.567e-02, 3.291e-02, 1.383e-01)); + r += mul(s0_4, M4(3.967e-02, -2.203e-02, -8.478e-03, -1.041e-01, -2.230e-01, 3.606e-01, -3.268e-02, -3.595e-02, 5.534e-02, 5.569e-03, 1.233e-01, 3.963e-02, 1.913e-01, -6.230e-02, -6.251e-02, -5.561e-02)); + r += mul(s0_5, M4(2.654e-02, -9.555e-02, -2.090e-02, -3.020e-02, -1.122e-01, 5.650e-02, 4.807e-03, -1.044e-01, 2.242e-02, 6.972e-02, -4.355e-02, 4.324e-02, 1.548e-01, -1.739e-01, 1.006e-01, 1.897e-01)); + r += mul(s0_6, M4(-8.032e-02, -4.289e-02, -6.317e-02, -2.093e-03, -2.295e-01, 1.410e-01, -1.817e-01, 4.578e-02, 5.401e-04, 8.403e-02, 1.777e-02, 4.613e-02, -4.502e-02, -2.727e-01, 4.863e-02, 1.278e-01)); + r += mul(s0_7, M4(4.624e-02, -2.305e-02, -5.084e-02, 3.623e-02, -6.729e-02, -8.742e-02, 1.357e-02, 4.308e-02, -2.050e-02, 6.628e-02, 6.019e-02, 8.383e-02, -1.248e-01, -3.781e-01, 2.430e-01, 1.500e-01)); + r += mul(s0_8, M4(-1.514e-01, 6.219e-02, -5.926e-02, 5.399e-02, -1.571e-02, -4.434e-02, -3.300e-02, 6.370e-02, -2.834e-02, -1.266e-02, 2.889e-02, 4.484e-02, 1.327e-01, -3.212e-01, 9.202e-02, -2.347e-02)); + r += mul(s1_0, M4(-1.321e-01, -1.242e-01, -2.568e-01, -3.193e-01, -3.062e-03, -9.563e-02, 5.720e-02, 1.353e-01, -5.070e-02, -1.281e-01, -1.126e-01, 3.806e-02, -3.963e-03, -1.976e-02, 5.618e-03, -2.852e-02)); + r += mul(s1_1, M4(1.399e-01, -4.819e-01, 6.187e-02, -7.253e-02, -2.269e-02, -5.228e-02, -2.679e-02, -1.321e-01, -1.060e-01, 6.649e-02, -7.585e-02, 1.077e-01, -1.755e-02, 6.109e-02, 1.470e-02, -3.969e-02)); + r += mul(s1_2, M4(-2.312e-01, 1.536e-01, -1.916e-02, -5.501e-01, 2.476e-03, 6.083e-02, -3.332e-02, -9.714e-03, -1.185e-01, -3.233e-02, -1.179e-01, 5.697e-02, 4.700e-02, 4.405e-02, 7.180e-02, -9.035e-02)); + r += mul(s1_3, M4(8.690e-02, 1.792e-01, 3.614e-01, 2.789e-01, 6.603e-02, -1.305e-01, -8.178e-02, -2.337e-02, 1.146e-01, 5.369e-03, -3.311e-01, -4.870e-02, 1.021e-02, -3.203e-02, 3.860e-02, 1.048e-01)); + r += mul(s1_4, M4(-2.147e-03, 1.028e-01, 1.122e-01, 6.106e-02, -9.106e-02, -8.087e-02, -3.363e-02, -2.920e-02, 1.440e-01, -7.080e-03, -1.764e-01, -6.676e-03, 3.276e-02, -4.324e-02, -1.823e-01, 3.185e-02)); + r += mul(s1_5, M4(-2.293e-01, 3.774e-01, 8.887e-02, 1.508e-01, -6.186e-02, 1.094e-03, 2.554e-02, -4.087e-02, 6.849e-02, -3.018e-02, -2.673e-01, 8.643e-02, -1.038e-01, 7.105e-02, -5.722e-02, -2.102e-02)); + r += mul(s1_6, M4(-1.462e-01, -1.410e-01, 3.153e-02, 6.715e-02, 4.593e-02, -1.019e-01, 3.027e-02, 7.161e-02, 8.211e-02, -8.201e-02, -3.403e-01, 2.494e-02, 8.837e-03, 1.183e-01, 7.194e-03, 2.351e-02)); + r += mul(s1_7, M4(-1.986e-01, -1.980e-01, -3.486e-01, -3.035e-02, -3.950e-02, -1.109e-02, 7.599e-02, -7.312e-02, 1.314e-01, -2.475e-01, -1.176e-01, 1.737e-02, -6.319e-02, -1.021e-01, 8.240e-02, 9.805e-02)); + r += mul(s1_8, M4(-1.356e-01, -2.959e-01, 4.435e-02, 1.862e-01, 1.078e-01, -4.282e-02, 6.068e-02, 7.163e-02, 1.571e-01, -9.376e-02, -1.499e-01, -1.781e-01, 7.484e-02, 9.013e-04, 1.280e-02, 8.788e-02)); + r += mul(s2_0, M4(4.763e-02, 1.396e-02, -9.853e-03, 4.906e-03, 6.963e-02, -1.599e-02, 4.233e-02, 1.564e-03, 3.934e-02, 1.577e-01, -1.629e-01, 3.703e-02, 1.013e-01, -3.866e-02, 4.691e-02, 6.083e-02)); + r += mul(s2_1, M4(7.211e-03, -7.470e-02, -1.213e-01, 1.652e-01, -4.090e-02, 9.714e-02, 1.208e-01, -4.375e-02, 8.932e-02, 7.984e-02, 9.466e-02, 9.899e-02, -6.070e-02, -1.282e-01, -8.630e-02, 9.200e-02)); + r += mul(s2_2, M4(-1.533e-02, 5.005e-02, 6.821e-02, 1.985e-02, 2.655e-03, -4.315e-02, -5.581e-02, -8.586e-03, 7.206e-02, -1.813e-01, -1.084e-01, -3.554e-02, -6.248e-03, -1.485e-01, 1.336e-03, -5.949e-02)); + r += mul(s2_3, M4(1.412e-01, -5.786e-03, 5.339e-02, -3.114e-02, 4.882e-02, 2.980e-02, -5.618e-02, 4.602e-02, -1.591e-02, -2.496e-02, 2.719e-03, 2.095e-01, -9.699e-02, 1.175e-01, -1.799e-01, 6.091e-03)); + r += mul(s2_4, M4(1.876e-01, 2.454e-03, -3.717e-01, -4.158e-02, -3.681e-02, -2.193e-03, 6.434e-02, 4.568e-02, 1.723e-01, 1.819e-01, -1.759e-01, 3.188e-02, 7.610e-02, 1.203e-02, 7.259e-02, -8.133e-02)); + r += mul(s2_5, M4(3.860e-02, 5.260e-02, -9.462e-02, 1.284e-01, -8.714e-04, 4.515e-02, 6.459e-02, 8.037e-02, -1.382e-01, 1.994e-01, 5.684e-02, 2.759e-02, 2.841e-02, -2.879e-02, 4.136e-02, -4.358e-02)); + r += mul(s2_6, M4(-2.640e-02, 3.660e-02, 4.060e-03, 1.007e-01, -1.999e-02, 9.608e-02, -1.717e-02, -5.437e-02, 9.631e-02, 9.981e-02, -5.108e-02, -1.873e-01, 1.695e-02, 1.345e-02, -6.706e-03, -3.257e-02)); + r += mul(s2_7, M4(-4.966e-03, 6.084e-03, 3.677e-03, 6.284e-02, -7.393e-02, 1.200e-02, -4.300e-02, 1.821e-01, 4.616e-03, 8.187e-02, -1.945e-02, -8.441e-02, -8.252e-02, -1.106e-01, -8.671e-02, 1.818e-02)); + r += mul(s2_8, M4(-1.126e-01, 1.018e-01, -6.764e-03, -4.124e-03, -7.969e-03, -3.700e-02, -5.286e-02, -4.189e-02, -4.189e-04, -1.389e-01, -7.266e-02, -1.118e-02, -5.688e-02, -1.906e-02, -1.242e-02, -9.303e-02)); + r += mul(s3_0, M4(4.366e-02, 1.495e-02, -2.451e-02, -7.179e-02, -1.431e-02, 9.672e-02, 2.586e-03, -4.483e-02, -2.061e-02, 8.246e-02, -1.682e-02, -1.404e-02, -2.087e-02, -2.342e-01, 1.283e-01, 2.121e-01)); + r += mul(s3_1, M4(1.261e-01, -6.772e-03, 8.997e-02, 1.745e-01, -4.420e-02, -4.272e-01, 8.984e-02, -2.352e-03, -4.986e-02, 4.329e-02, 8.367e-02, 1.726e-03, 3.509e-03, -4.385e-02, -4.679e-02, -1.314e-01)); + r += mul(s3_2, M4(-7.726e-02, 9.546e-02, 1.853e-01, 1.082e-01, 5.563e-02, -8.235e-02, 5.996e-03, -1.406e-01, -1.509e-01, 6.791e-02, -8.118e-03, 1.205e-02, 1.217e-01, -5.449e-02, 8.749e-02, 6.664e-02)); + r += mul(s3_3, M4(2.327e-01, 1.858e-01, 8.372e-02, -7.687e-03, 7.035e-02, 1.204e-01, 4.574e-02, 6.539e-02, -7.779e-03, 4.843e-02, -3.028e-02, 3.303e-03, -2.231e-01, 1.219e-02, -1.511e-01, 5.250e-03)); + r += mul(s3_4, M4(3.289e-01, 9.314e-02, -3.150e-01, 2.754e-02, -2.214e-01, -2.299e-01, 1.017e-01, -2.399e-03, 6.282e-02, -1.404e-01, -1.809e-02, -4.570e-02, -9.357e-02, -3.785e-03, -5.860e-02, -1.008e-01)); + r += mul(s3_5, M4(1.649e-01, 1.409e-02, -4.145e-02, 9.666e-02, 1.632e-02, 2.878e-02, -6.932e-02, -7.232e-02, -1.695e-02, 2.192e-02, 3.412e-02, -1.426e-02, -7.193e-02, 2.589e-02, -3.586e-03, 7.870e-02)); + r += mul(s3_6, M4(4.423e-03, -2.012e-01, -3.371e-02, 1.100e-01, 2.680e-02, -9.639e-02, 4.793e-03, -5.579e-02, 8.033e-02, -3.963e-02, 4.941e-02, -3.197e-02, 3.032e-02, -2.103e-01, 4.275e-02, 1.724e-02)); + r += mul(s3_7, M4(2.560e-01, 1.953e-02, 2.999e-02, -5.016e-02, 2.512e-02, -2.743e-02, -3.543e-02, 1.478e-01, 6.823e-02, 4.485e-02, 1.025e-01, 8.565e-04, -2.563e-02, 1.238e-01, -5.389e-02, -8.330e-02)); + r += mul(s3_8, M4(-4.668e-02, 5.297e-03, -6.290e-04, -1.017e-01, -3.426e-02, -3.534e-02, -3.185e-01, 9.515e-02, 2.685e-02, -6.823e-02, 2.208e-02, 3.880e-02, -1.261e-02, 2.131e-02, 7.511e-02, 5.117e-02)); + r += mul(s4_0, M4(-5.593e-02, 1.841e-01, -1.357e-01, -3.179e-02, 9.801e-02, 2.526e-01, 8.905e-02, 4.473e-02, -2.999e-02, 1.005e-02, 4.075e-02, -9.351e-02, 1.532e-01, -4.976e-02, 8.538e-02, 4.393e-02)); + r += mul(s4_1, M4(-2.394e-02, 6.815e-03, -4.025e-03, 4.245e-02, 6.386e-02, -2.665e-01, -2.094e-02, -1.530e-01, 4.269e-02, 9.683e-02, -5.149e-02, -1.819e-01, 1.264e-01, 8.284e-02, 5.323e-02, -2.883e-02)); + r += mul(s4_2, M4(-3.400e-02, -4.448e-02, 4.493e-02, -4.677e-03, 1.381e-02, 1.036e-02, -2.390e-03, -5.164e-02, -4.366e-02, 9.971e-02, -1.188e-01, -5.287e-02, -1.093e-01, 4.205e-02, 5.267e-02, -1.054e-01)); + r += mul(s4_3, M4(-9.811e-02, 3.292e-02, -9.772e-02, -4.517e-02, 2.219e-01, -1.472e-01, 2.143e-01, -4.187e-02, -1.091e-01, -2.002e-01, -6.219e-02, -6.699e-02, 2.276e-02, 1.721e-03, -1.623e-02, 7.721e-02)); + r += mul(s4_4, M4(-5.358e-03, 4.215e-02, -1.726e-01, -1.417e-03, 2.992e-01, 1.606e-01, -1.260e-01, -3.107e-01, -6.310e-02, -1.652e-01, 1.243e-01, -1.744e-01, 5.203e-02, -9.819e-02, -1.667e-01, -4.351e-03)); + r += mul(s4_5, M4(-7.169e-03, -1.085e-01, 8.616e-02, -1.154e-01, 7.473e-02, 1.240e-01, 1.243e-01, 7.347e-02, -1.291e-01, 1.030e-01, -3.936e-02, -5.861e-03, 3.724e-02, 1.333e-01, 5.432e-02, -1.142e-02)); + r += mul(s4_6, M4(-5.442e-02, 1.410e-01, -1.242e-02, -4.804e-02, -3.588e-01, 1.485e-01, 9.070e-02, 4.851e-02, 1.056e-01, -9.155e-02, 1.454e-01, 1.721e-01, -4.976e-02, -8.033e-02, 4.698e-02, -1.097e-01)); + r += mul(s4_7, M4(3.759e-02, -1.753e-02, 8.650e-02, 8.278e-02, 1.691e-01, 2.585e-02, -1.371e-01, -1.095e-02, 1.284e-01, -4.929e-02, 5.555e-02, 6.373e-02, -2.994e-02, -1.625e-01, -6.110e-02, 3.357e-02)); + r += mul(s4_8, M4(-3.512e-02, -3.154e-02, -5.124e-02, -1.319e-02, -1.003e-01, 4.170e-02, -6.858e-03, -8.647e-02, -2.632e-02, 8.094e-02, -4.234e-02, -1.669e-01, -9.504e-02, 6.567e-03, 7.794e-03, 2.035e-02)); + r += mul(s5_0, M4(-3.748e-02, -1.013e-01, -6.086e-02, 5.491e-02, 5.568e-02, -1.378e-02, -1.937e-02, 2.341e-02, -5.457e-02, -6.810e-02, 1.025e-01, 1.463e-02, -1.227e-02, 6.973e-02, 1.869e-03, 5.927e-02)); + r += mul(s5_1, M4(7.857e-02, -1.122e-01, -1.831e-01, -6.384e-03, -3.573e-02, -5.984e-03, -5.606e-02, 3.123e-02, -6.017e-02, -5.027e-02, 1.882e-03, 2.747e-02, 4.596e-02, -2.555e-02, -1.390e-02, 1.651e-02)); + r += mul(s5_2, M4(9.069e-02, -4.829e-03, 7.600e-04, 8.162e-02, -1.057e-01, 3.041e-02, 6.462e-02, -1.854e-02, 6.003e-02, -7.012e-02, 1.015e-01, 2.188e-02, 3.183e-02, 2.465e-01, 1.209e-01, 1.290e-01)); + r += mul(s5_3, M4(-8.769e-02, 1.002e-01, 4.918e-02, -1.161e-01, 5.834e-02, -9.595e-03, 1.756e-02, -3.156e-02, -4.703e-02, 4.591e-03, -2.730e-02, -7.831e-02, -6.395e-02, 1.042e-01, -3.743e-02, 1.027e-01)); + r += mul(s5_4, M4(-6.949e-02, 1.673e-01, -2.080e-02, 1.337e-01, 7.394e-03, -3.346e-02, 3.889e-02, -7.691e-03, -9.445e-03, 1.433e-01, -9.238e-02, 8.740e-02, -2.214e-01, -1.635e-02, -1.793e-01, 1.913e-02)); + r += mul(s5_5, M4(7.810e-02, -1.914e-02, 8.791e-02, -1.753e-01, -8.120e-02, -5.981e-02, 1.780e-03, -4.513e-03, 1.851e-02, 1.581e-01, -5.446e-02, 2.837e-02, 6.029e-02, 3.778e-02, 3.337e-03, -2.154e-02)); + r += mul(s5_6, M4(-8.270e-02, 1.873e-01, 1.084e-03, 1.234e-01, 3.482e-02, -6.640e-02, -4.890e-02, 2.690e-02, 8.170e-02, -5.379e-02, 7.963e-02, 7.949e-02, 1.166e-01, 4.965e-02, 7.708e-02, -1.939e-02)); + r += mul(s5_7, M4(1.636e-01, 8.186e-02, 2.299e-01, 2.185e-01, 5.592e-02, -6.926e-02, -5.674e-03, 1.554e-02, -1.033e-02, -9.731e-02, -1.354e-02, -4.377e-02, -1.938e-02, -5.919e-02, 2.697e-02, 8.038e-02)); + r += mul(s5_8, M4(1.209e-01, -4.855e-02, 1.896e-02, 1.332e-01, 1.123e-02, -1.378e-02, 2.569e-02, 6.872e-02, 1.880e-01, -1.099e-02, -8.497e-02, -9.332e-02, 6.168e-02, 7.522e-02, 8.633e-02, 4.627e-02)); + r += mul(s6_0, M4(7.403e-03, 8.145e-03, -6.153e-02, 9.502e-02, 2.571e-02, -8.655e-02, -1.008e-02, -7.699e-02, -4.673e-02, 2.114e-02, -1.793e-02, -5.573e-02, 2.973e-02, 2.998e-02, -8.564e-02, -9.803e-02)); + r += mul(s6_1, M4(-1.991e-02, 5.373e-03, -1.266e-02, -8.695e-02, 1.257e-02, 1.773e-03, 1.552e-02, 1.419e-01, -2.419e-02, 6.933e-02, 3.161e-02, 8.895e-02, -1.247e-01, -1.227e-01, 1.894e-02, -1.078e-01)); + r += mul(s6_2, M4(-2.697e-02, 1.469e-01, 3.410e-03, -2.511e-02, -1.563e-01, 1.888e-02, 2.321e-02, 2.802e-02, -9.077e-02, 5.797e-02, -7.054e-02, 4.460e-02, -3.892e-03, -6.443e-02, -5.339e-02, 5.030e-02)); + r += mul(s6_3, M4(-6.725e-02, -3.061e-01, -1.303e-02, -2.865e-02, 5.562e-02, -2.992e-02, 9.534e-03, 7.976e-02, 2.254e-03, 4.044e-03, -1.261e-01, -5.085e-02, 3.802e-03, 7.943e-02, -2.536e-02, -4.610e-02)); + r += mul(s6_4, M4(1.153e-01, -1.238e-01, -2.200e-02, 1.969e-01, -1.159e-01, 1.269e-01, -3.461e-03, 1.008e-01, -9.917e-02, -2.784e-02, 6.399e-02, 3.246e-02, 1.811e-01, 1.800e-02, 1.404e-01, -2.439e-02)); + r += mul(s6_5, M4(4.798e-02, 2.964e-04, 7.136e-02, 2.714e-02, 8.785e-03, -8.585e-02, -2.140e-02, -1.955e-02, 6.315e-03, -9.827e-02, -2.721e-02, 9.465e-02, 1.597e-02, -2.619e-02, 3.501e-02, 1.766e-01)); + r += mul(s6_6, M4(-1.248e-01, -1.063e-01, 5.070e-02, 1.713e-01, 1.704e-02, -1.348e-01, 8.956e-03, -2.971e-02, 5.520e-02, 2.207e-02, 1.438e-02, 4.820e-02, 3.794e-02, 2.495e-01, -2.920e-03, -1.143e-01)); + r += mul(s6_7, M4(2.949e-02, 9.060e-02, 1.596e-01, 1.733e-01, 7.490e-03, -3.273e-03, 7.705e-02, -3.255e-03, -7.283e-02, 8.520e-02, -1.070e-01, 3.652e-02, -4.259e-02, -1.457e-02, 5.281e-02, -1.463e-03)); + r += mul(s6_8, M4(4.699e-02, 1.872e-03, 3.358e-02, -6.305e-02, 3.424e-02, -4.051e-02, 3.316e-02, -5.758e-02, -3.096e-02, -4.929e-02, 3.446e-02, -4.537e-02, -6.640e-02, -3.523e-02, -3.002e-02, 5.090e-02)); + r += mul(s7_0, M4(-1.065e-01, -1.382e-01, -1.350e-02, -1.311e-01, -2.758e-02, -1.097e-01, -7.546e-02, 6.526e-02, 2.005e-02, 1.840e-01, 8.076e-02, 7.751e-02, -2.236e-02, -1.061e-02, -2.241e-03, -5.586e-02)); + r += mul(s7_1, M4(4.041e-02, -9.250e-02, 9.476e-02, -2.626e-02, -5.993e-02, 1.773e-01, 1.289e-01, -1.513e-01, 1.215e-01, -4.172e-02, 6.705e-02, 6.648e-02, -1.480e-02, 1.078e-01, -8.067e-02, -9.147e-02)); + r += mul(s7_2, M4(2.040e-02, -1.313e-01, 5.566e-02, -5.936e-02, -1.045e-01, -3.466e-02, 9.358e-02, 2.059e-01, 3.470e-02, 7.119e-02, 1.052e-01, -1.533e-02, -7.687e-02, -3.042e-02, -1.086e-01, -1.487e-03)); + r += mul(s7_3, M4(-6.280e-02, 2.873e-01, -6.877e-02, -4.537e-02, -7.636e-02, -8.482e-03, -6.059e-03, 3.606e-02, -1.828e-01, -8.439e-02, -1.074e-01, 6.662e-02, -6.266e-02, -1.555e-01, 5.204e-02, 8.863e-02)); + r += mul(s7_4, M4(-1.813e-02, 5.239e-02, -1.131e-01, -3.252e-01, -6.431e-03, 2.313e-01, -1.137e-01, 1.332e-02, -2.509e-01, -1.914e-01, -7.171e-02, 2.377e-02, -2.707e-02, 1.690e-01, 4.611e-02, -1.564e-01)); + r += mul(s7_5, M4(1.837e-02, -1.174e-01, 4.699e-02, -1.890e-01, -1.476e-02, -1.837e-01, 1.861e-02, -5.965e-02, -1.214e-01, 3.479e-01, 6.584e-02, -2.092e-02, -3.067e-02, 5.263e-02, 1.100e-01, -2.483e-02)); + r += mul(s7_6, M4(-1.633e-01, 7.453e-02, -1.681e-01, -1.765e-01, -7.604e-02, 1.990e-01, 8.703e-02, 1.021e-01, -3.659e-02, -1.725e-01, 8.921e-02, 1.931e-01, -6.031e-02, 1.625e-01, -1.275e-01, -2.902e-01)); + r += mul(s7_7, M4(1.879e-01, 1.781e-01, -5.226e-02, -7.865e-02, -6.034e-02, -7.494e-02, -1.315e-02, -1.429e-02, -1.961e-01, -9.814e-02, 6.942e-02, 9.747e-02, -1.413e-01, 7.411e-03, 1.198e-01, -2.484e-03)); + r += mul(s7_8, M4(-2.555e-02, -4.452e-02, -8.810e-02, -5.188e-02, 8.389e-02, 7.605e-02, 2.617e-02, 5.358e-02, -3.156e-02, 7.391e-02, 4.719e-03, -1.311e-01, -1.674e-01, -8.511e-02, 2.953e-03, 1.282e-02)); + r += V4(-7.951e-02, -3.356e-02, 3.358e-02, -6.548e-02); + return r; +} + +V4 f2(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(7.160e-02, 3.959e-02, -2.049e-02, -2.823e-02, 2.106e-01, 1.167e-01, 6.484e-03, 1.342e-01, 3.913e-02, 6.992e-02, -7.948e-02, -4.343e-02, -4.116e-02, -1.167e-02, -5.642e-02, 4.596e-02)); + r += mul(s0_1, M4(-7.604e-02, -4.577e-02, 1.024e-02, -1.992e-02, -1.748e-02, 1.316e-01, -3.491e-02, -1.980e-01, -3.151e-02, -2.771e-02, -5.439e-02, 7.762e-03, -8.407e-02, -5.413e-02, -3.735e-02, 1.801e-01)); + r += mul(s0_2, M4(-6.569e-03, 6.431e-03, 8.401e-02, 7.388e-02, 7.487e-02, 8.721e-02, -1.593e-01, 1.559e-01, -5.005e-02, -2.007e-02, -7.181e-02, -2.917e-02, -7.560e-02, 9.458e-03, -2.257e-01, 7.142e-02)); + r += mul(s0_3, M4(2.403e-02, 1.892e-01, -6.111e-02, -1.264e-01, -1.122e-01, 1.511e-01, -1.540e-01, -5.612e-02, 4.382e-02, 1.491e-01, 7.364e-02, -3.691e-02, -8.071e-02, 1.279e-02, 2.362e-01, 2.400e-02)); + r += mul(s0_4, M4(1.469e-02, -6.055e-02, 2.503e-02, 5.858e-02, -4.516e-02, 1.825e-02, 1.345e-01, 8.446e-03, 8.555e-02, -2.525e-02, -4.071e-02, -5.975e-02, -1.230e-01, 2.685e-01, -2.223e-01, 1.558e-04)); + r += mul(s0_5, M4(-3.817e-02, 1.296e-02, 6.674e-02, 5.253e-02, -1.203e-01, 1.307e-01, -1.799e-02, -1.414e-01, -2.474e-02, 4.198e-02, -5.009e-02, -3.853e-02, 3.552e-02, -1.767e-01, 3.049e-01, 7.852e-02)); + r += mul(s0_6, M4(-1.278e-02, 5.320e-02, -7.747e-02, -9.217e-02, 2.075e-01, -2.841e-02, -2.475e-01, -1.104e-01, 2.502e-02, 1.639e-02, 2.095e-02, -7.334e-02, -1.649e-01, -1.055e-01, -7.679e-03, 1.140e-01)); + r += mul(s0_7, M4(2.875e-02, -1.929e-01, -3.281e-02, -4.322e-02, 8.614e-02, 4.138e-02, -1.009e-01, 1.346e-02, 1.151e-02, -1.695e-01, -1.484e-02, 2.440e-03, -4.026e-01, 1.997e-01, 1.299e-01, 8.595e-03)); + r += mul(s0_8, M4(-5.243e-02, -7.821e-02, 1.424e-02, 1.868e-02, 1.832e-02, 3.947e-02, -4.653e-02, 1.648e-01, 1.558e-02, -1.228e-01, -8.312e-04, 7.195e-02, -7.671e-02, 1.973e-01, -7.385e-03, 9.162e-02)); + r += mul(s1_0, M4(1.297e-01, 2.295e-01, 3.568e-01, -8.589e-02, 2.555e-02, -1.081e-01, -1.752e-02, 7.812e-02, 1.454e-01, -7.115e-02, 1.180e-01, 3.964e-02, -6.218e-02, -7.728e-02, -6.482e-02, 2.299e-02)); + r += mul(s1_1, M4(-2.977e-02, 7.989e-02, -8.135e-02, 9.227e-02, -5.965e-02, -5.951e-02, -5.747e-02, -1.525e-01, 6.371e-02, 2.378e-01, 1.418e-02, -3.680e-01, -5.501e-02, 1.312e-01, 3.657e-02, -1.418e-01)); + r += mul(s1_2, M4(-3.865e-02, -4.865e-02, -1.064e-01, 3.632e-02, 8.938e-03, 1.680e-02, -3.495e-02, 5.834e-02, -4.729e-02, 2.859e-01, 1.917e-01, -2.803e-01, -4.299e-02, 1.389e-02, -6.079e-02, 7.421e-02)); + r += mul(s1_3, M4(-7.702e-02, 5.567e-02, -4.026e-01, -2.588e-01, -1.012e-01, -1.251e-01, -3.978e-02, 4.585e-02, 1.430e-01, 2.736e-01, 1.218e-01, -2.842e-01, 6.805e-02, -5.404e-03, 1.303e-02, 1.760e-03)); + r += mul(s1_4, M4(7.792e-02, -2.391e-01, 1.851e-01, -4.511e-02, 4.014e-03, -9.545e-02, -3.032e-02, 7.058e-02, 2.689e-02, 1.940e-01, 1.164e-01, -6.738e-02, -5.119e-02, 8.169e-02, 3.390e-03, -6.561e-03)); + r += mul(s1_5, M4(-1.986e-01, -3.959e-01, -9.847e-02, 1.115e-01, -4.450e-03, 7.398e-02, -1.009e-01, 5.284e-04, 5.953e-03, 1.209e-01, -5.698e-02, -7.200e-02, -2.860e-02, -2.696e-02, 4.271e-02, -2.730e-02)); + r += mul(s1_6, M4(3.630e-02, 2.963e-01, -7.472e-02, 3.535e-01, 1.700e-01, 6.717e-02, 1.545e-03, -3.432e-02, -2.697e-02, -1.726e-02, 1.410e-01, -1.381e-01, -1.918e-03, -7.448e-02, -2.806e-02, 8.082e-02)); + r += mul(s1_7, M4(6.192e-02, -2.643e-02, 3.315e-01, 3.428e-02, 6.790e-02, 8.312e-02, 1.480e-01, -2.098e-02, -7.603e-02, 2.345e-01, 1.325e-01, -7.989e-02, 8.093e-02, -3.724e-02, -4.953e-03, -6.597e-03)); + r += mul(s1_8, M4(-1.254e-01, 1.435e-01, -1.409e-01, 1.166e-01, -1.503e-02, 7.107e-03, -3.024e-02, -4.282e-02, 2.150e-01, 1.797e-01, 1.386e-01, -8.273e-02, 5.003e-02, -2.082e-01, 6.736e-02, -1.456e-02)); + r += mul(s2_0, M4(5.291e-02, 4.493e-02, 1.754e-02, -1.373e-02, 6.290e-02, -4.889e-02, 1.684e-02, 2.581e-02, 1.057e-01, 6.659e-02, -1.783e-01, 2.118e-01, -3.852e-04, -9.217e-02, 6.860e-02, 1.082e-02)); + r += mul(s2_1, M4(-8.459e-02, 5.697e-02, 1.011e-02, 4.819e-02, -2.456e-02, -7.738e-02, -1.274e-01, -2.464e-02, 5.461e-02, 1.497e-01, 1.442e-01, 1.067e-01, 3.481e-02, -3.209e-02, -5.797e-02, 2.584e-03)); + r += mul(s2_2, M4(-7.790e-02, 5.481e-02, 1.761e-02, -1.736e-02, 3.235e-02, -3.660e-02, 1.891e-01, 4.832e-02, -7.073e-02, -1.419e-01, 3.421e-02, 7.474e-02, 6.528e-02, -1.652e-01, 1.266e-01, 5.471e-02)); + r += mul(s2_3, M4(1.544e-01, 3.630e-02, -7.690e-02, 1.275e-01, 2.818e-03, 3.921e-02, 7.246e-04, -3.142e-02, -1.288e-01, 1.560e-02, -9.013e-02, -1.366e-01, 1.448e-02, -1.190e-01, -1.364e-01, 6.835e-02)); + r += mul(s2_4, M4(-5.506e-02, -1.212e-01, -4.502e-02, 2.112e-02, 2.754e-02, 1.100e-01, 7.503e-02, 5.057e-02, 4.632e-02, -4.281e-02, 8.304e-02, -1.328e-02, 5.502e-02, -1.287e-01, 8.940e-02, 4.167e-02)); + r += mul(s2_5, M4(-6.920e-03, -5.461e-03, 8.102e-02, -1.422e-01, -6.519e-02, 5.124e-02, 7.573e-02, -5.185e-03, 7.927e-02, -6.519e-02, 1.565e-02, -7.461e-02, -1.193e-01, 1.284e-01, 1.002e-01, -2.378e-02)); + r += mul(s2_6, M4(1.436e-01, -6.016e-02, -8.235e-02, 3.355e-02, 7.730e-02, 1.633e-01, -9.259e-02, -4.074e-02, 9.246e-02, -1.497e-01, 6.639e-02, 3.161e-03, -3.123e-02, 8.584e-02, 1.533e-01, -4.745e-02)); + r += mul(s2_7, M4(-1.694e-01, 7.646e-02, 1.865e-01, 3.646e-02, 1.345e-02, -7.526e-02, -1.048e-01, -6.824e-02, 3.487e-01, -2.505e-01, 2.535e-01, -6.138e-02, 9.207e-02, -1.351e-01, 5.327e-02, -1.056e-02)); + r += mul(s2_8, M4(-5.303e-03, -2.066e-02, -1.876e-02, 7.126e-02, 2.470e-02, -8.398e-02, 1.877e-01, 3.652e-03, -1.164e-01, 1.180e-01, 3.439e-01, -2.599e-01, -5.798e-02, -6.116e-02, -7.023e-02, 1.361e-01)); + r += mul(s3_0, M4(4.821e-02, -1.252e-02, 1.707e-01, 9.750e-02, -2.193e-02, -1.987e-01, 3.003e-01, -7.428e-02, 3.308e-03, 9.133e-02, -2.076e-02, 3.022e-02, -1.687e-01, -1.213e-02, -9.804e-03, -2.377e-02)); + r += mul(s3_1, M4(3.894e-02, 4.871e-03, -9.353e-02, 1.207e-01, -1.865e-02, -2.623e-01, 5.401e-02, -1.799e-01, -6.579e-04, -1.822e-01, 6.615e-02, -1.295e-02, -1.341e-02, 1.533e-01, -1.098e-01, -5.478e-02)); + r += mul(s3_2, M4(-1.066e-01, -1.817e-01, -1.226e-01, -7.961e-02, 4.815e-02, 1.080e-02, -2.573e-01, -1.078e-01, -5.921e-02, 4.376e-02, -1.201e-01, -8.660e-02, 3.234e-03, -1.401e-01, 2.607e-02, -2.978e-02)); + r += mul(s3_3, M4(8.189e-02, -2.529e-02, -4.234e-02, -8.320e-02, -1.539e-01, -2.681e-01, 1.780e-02, 1.052e-01, -1.338e-01, 5.823e-02, 8.980e-04, 3.932e-02, 2.042e-02, -9.173e-02, -1.073e-01, -8.834e-02)); + r += mul(s3_4, M4(-1.762e-01, -1.966e-01, 3.809e-02, 3.330e-03, -7.671e-03, -8.328e-02, 7.621e-02, -1.166e-01, 3.125e-02, -8.722e-03, 3.297e-02, 5.293e-02, 4.815e-02, -3.511e-02, -1.132e-02, 7.434e-02)); + r += mul(s3_5, M4(-2.362e-03, -1.247e-01, 1.143e-02, -2.894e-01, -2.176e-02, -2.243e-01, -3.407e-01, 2.051e-02, 7.622e-02, -5.383e-02, 3.306e-02, 9.119e-02, 2.668e-03, 1.585e-01, 4.227e-02, -2.221e-01)); + r += mul(s3_6, M4(8.474e-02, -4.372e-02, -3.331e-02, -9.092e-02, 3.010e-02, 1.381e-01, 6.560e-02, 8.138e-02, -9.129e-02, -1.421e-01, 4.482e-02, 1.409e-02, -1.773e-01, 1.386e-01, -3.668e-02, -9.246e-02)); + r += mul(s3_7, M4(7.007e-03, 9.400e-02, -4.633e-02, -3.270e-02, -6.299e-02, 1.121e-01, 2.946e-02, -1.837e-01, -4.667e-02, 6.520e-02, 6.433e-02, -1.248e-01, -4.962e-02, -4.701e-02, 7.428e-02, -1.523e-02)); + r += mul(s3_8, M4(5.168e-02, 5.371e-02, 1.820e-02, -1.103e-02, 5.489e-02, -1.232e-01, -1.559e-01, -8.951e-02, -5.942e-02, 9.437e-02, -4.487e-02, -1.499e-02, -3.793e-02, 1.250e-01, -9.444e-03, 1.480e-01)); + r += mul(s4_0, M4(6.804e-02, 8.773e-02, -5.802e-02, 1.059e-02, -3.449e-01, 5.425e-02, 4.849e-01, -3.830e-01, -2.164e-02, -4.346e-02, 4.221e-02, 8.661e-02, 7.835e-02, -1.134e-01, -5.008e-02, 1.706e-02)); + r += mul(s4_1, M4(-2.090e-02, -7.901e-03, 1.995e-02, 4.231e-02, 1.159e-01, -7.329e-02, -3.859e-01, 2.212e-01, 9.159e-02, 1.050e-01, 1.248e-01, 3.892e-03, -8.009e-02, -7.096e-02, -4.613e-05, -1.465e-01)); + r += mul(s4_2, M4(-4.982e-02, 1.360e-02, 9.749e-02, -2.727e-02, -8.277e-02, -1.126e-01, 3.561e-01, -2.532e-01, -6.652e-02, 1.013e-02, 4.226e-03, 1.232e-01, -9.655e-04, -6.240e-02, 4.407e-02, -4.948e-02)); + r += mul(s4_3, M4(-1.101e-01, -8.031e-02, 2.043e-02, 3.359e-02, 4.259e-02, 3.845e-01, -1.398e-01, 8.792e-02, -1.081e-01, 1.561e-01, 1.212e-01, -1.222e-01, -9.512e-02, 3.958e-02, -4.668e-02, 2.330e-02)); + r += mul(s4_4, M4(3.035e-02, 3.979e-02, -1.812e-01, 3.794e-02, -2.506e-01, -1.023e-01, 8.688e-02, -1.077e-01, -1.579e-02, -1.744e-02, 2.586e-01, -9.867e-02, 1.761e-01, 7.282e-02, -4.643e-02, 3.582e-02)); + r += mul(s4_5, M4(-3.809e-02, 1.975e-02, 9.684e-02, -1.193e-01, 1.942e-02, -2.486e-02, -1.234e-01, 1.601e-01, -3.902e-02, -1.317e-01, 1.647e-02, -4.586e-02, -9.337e-02, 4.688e-02, 8.111e-03, 2.885e-02)); + r += mul(s4_6, M4(-3.425e-02, -7.043e-02, -1.114e-03, 1.759e-02, 7.011e-02, -9.291e-02, -8.938e-02, 6.154e-02, -2.224e-01, 1.780e-02, -1.546e-01, -9.397e-02, -5.968e-02, 2.124e-01, -8.652e-03, 2.938e-02)); + r += mul(s4_7, M4(5.105e-02, 3.220e-02, -2.474e-02, -1.252e-01, 3.565e-01, -1.327e-01, -2.616e-01, -1.379e-01, -3.732e-02, 4.103e-01, -1.346e-02, 1.390e-01, 4.298e-02, 7.243e-02, -8.570e-02, -4.937e-02)); + r += mul(s4_8, M4(-6.515e-02, -4.400e-02, 6.307e-02, -1.577e-02, -7.272e-02, -2.053e-03, 3.536e-01, 1.460e-01, -1.441e-01, 3.251e-02, 9.263e-02, 1.137e-01, -1.025e-02, 1.260e-01, 5.062e-02, 1.262e-01)); + r += mul(s5_0, M4(-1.054e-01, -1.766e-02, -6.873e-02, 2.811e-02, 2.432e-02, -1.167e-02, 8.383e-02, 9.496e-03, 1.142e-02, 2.015e-03, -1.043e-01, -1.470e-02, 2.569e-02, 3.491e-02, -1.137e-01, 1.066e-01)); + r += mul(s5_1, M4(-8.272e-02, -6.838e-02, -6.908e-02, 5.116e-02, 1.982e-02, 6.091e-02, -1.664e-02, 2.784e-02, -8.694e-02, -8.021e-02, 4.080e-03, -7.106e-02, -1.658e-01, -1.153e-01, -6.929e-03, 9.907e-02)); + r += mul(s5_2, M4(3.934e-02, -1.248e-02, 5.516e-02, 2.029e-01, -8.927e-02, -2.967e-02, 2.056e-03, -2.477e-02, -2.253e-02, 6.042e-02, -6.240e-02, -1.136e-01, -3.062e-02, -1.227e-01, -1.619e-01, 5.870e-02)); + r += mul(s5_3, M4(-2.155e-01, -7.198e-02, -2.248e-02, -1.516e-01, -7.367e-02, 9.895e-02, -2.285e-02, -9.157e-03, 1.455e-01, -1.178e-02, -9.028e-04, 9.636e-02, 5.316e-02, -2.890e-02, -8.603e-02, -8.960e-02)); + r += mul(s5_4, M4(-2.287e-01, -3.977e-03, -1.611e-01, 9.548e-03, -2.645e-02, 8.231e-02, 2.449e-02, -2.528e-02, -8.187e-02, -3.543e-02, 1.589e-01, -2.174e-02, 1.426e-01, 1.432e-01, 4.631e-02, -1.521e-01)); + r += mul(s5_5, M4(1.351e-01, 1.218e-02, 1.307e-01, -2.186e-01, -1.043e-02, 9.595e-03, 6.245e-02, -3.976e-02, 7.011e-02, -1.027e-01, -2.723e-02, 4.857e-02, 2.734e-03, 1.324e-02, -6.431e-02, -4.493e-02)); + r += mul(s5_6, M4(-1.890e-01, -2.725e-01, 2.737e-02, 5.769e-02, 1.379e-02, -3.245e-02, -1.497e-02, -2.878e-02, -1.284e-01, -4.622e-02, -2.642e-02, -1.175e-01, -1.880e-01, 1.827e-01, -1.657e-01, 7.942e-02)); + r += mul(s5_7, M4(-9.118e-02, 2.842e-01, -2.173e-01, 7.063e-02, 7.538e-02, 5.894e-02, -1.075e-01, 4.333e-02, -7.566e-02, -1.142e-01, 4.044e-02, 5.305e-02, 1.803e-01, 2.164e-01, -2.646e-03, -2.533e-01)); + r += mul(s5_8, M4(-7.487e-02, 7.629e-02, 1.009e-01, 4.286e-02, -1.482e-02, 3.950e-02, 1.299e-01, 6.164e-02, -5.029e-02, 1.053e-01, -9.843e-02, -1.814e-01, 9.668e-03, 1.559e-01, -9.271e-02, 1.445e-01)); + r += mul(s6_0, M4(1.327e-01, 7.610e-03, 1.497e-02, -3.495e-02, 4.965e-02, -9.208e-02, -2.610e-02, -3.640e-02, -4.734e-02, -1.242e-02, 2.328e-02, 4.842e-02, 9.447e-03, 3.225e-02, -1.092e-02, -5.538e-02)); + r += mul(s6_1, M4(-5.815e-02, 7.916e-02, 8.095e-02, -3.877e-02, 1.158e-02, 1.736e-02, -2.863e-02, 7.492e-03, 3.507e-02, -2.058e-02, 7.275e-02, -3.094e-02, -1.646e-01, 5.667e-02, 1.120e-01, -9.152e-02)); + r += mul(s6_2, M4(2.724e-02, 4.259e-02, -1.252e-01, 1.258e-01, -4.152e-02, 1.946e-01, 9.554e-02, -4.344e-02, -1.059e-01, -8.092e-03, -1.775e-01, 8.023e-02, 6.634e-04, 6.857e-02, 6.193e-02, 8.829e-02)); + r += mul(s6_3, M4(-1.191e-01, 5.508e-03, -1.777e-02, -8.923e-03, 1.028e-01, -6.273e-02, -1.418e-02, -1.355e-02, 1.433e-02, -5.940e-02, 2.669e-02, -7.870e-02, -3.210e-02, 1.420e-01, 3.797e-02, -2.151e-03)); + r += mul(s6_4, M4(-2.208e-03, -1.520e-02, 1.149e-02, -1.017e-01, -1.460e-02, 6.870e-02, 1.064e-01, -1.518e-02, 6.100e-02, 2.155e-02, -2.400e-02, -1.117e-01, 2.676e-02, 5.622e-02, 1.851e-02, -1.208e-01)); + r += mul(s6_5, M4(-7.373e-02, 7.088e-02, 1.293e-01, -8.229e-02, -3.831e-02, -4.459e-02, 1.489e-01, 1.245e-01, 1.331e-01, -3.549e-03, 7.487e-02, -1.423e-01, -3.767e-02, -8.141e-03, 6.819e-02, 2.041e-02)); + r += mul(s6_6, M4(8.549e-02, -1.567e-02, -3.462e-02, 9.251e-02, 5.768e-02, 1.247e-02, -2.593e-02, -1.606e-01, 1.465e-02, 6.304e-02, 1.089e-03, 7.985e-02, 4.038e-02, 2.702e-02, -1.045e-01, 1.279e-01)); + r += mul(s6_7, M4(1.256e-01, -3.685e-02, 1.034e-01, 8.036e-02, -4.022e-02, 5.942e-02, 7.540e-02, 4.034e-02, 9.507e-02, -7.610e-02, -2.457e-02, -1.315e-02, 6.766e-02, 3.344e-02, -1.278e-02, -5.312e-02)); + r += mul(s6_8, M4(-2.078e-02, -2.733e-02, -4.110e-02, -4.928e-02, 2.954e-02, -4.459e-02, -5.428e-02, 1.163e-01, -2.850e-02, 7.975e-02, -7.055e-03, 1.909e-01, 1.503e-02, -8.133e-02, 9.719e-02, -4.011e-02)); + r += mul(s7_0, M4(5.745e-02, 8.149e-03, 5.020e-03, 8.201e-02, -3.625e-02, 1.546e-01, -2.182e-01, -1.970e-02, -7.573e-02, 1.147e-01, -9.093e-02, -1.201e-01, -4.465e-02, 1.782e-01, -3.328e-02, 6.867e-02)); + r += mul(s7_1, M4(1.278e-01, -1.294e-01, 1.435e-01, 8.846e-02, 1.641e-02, 7.880e-02, -4.295e-04, 7.376e-03, -5.733e-02, -1.213e-01, 1.887e-01, 2.530e-01, 5.237e-02, 9.056e-02, -1.693e-01, 1.058e-02)); + r += mul(s7_2, M4(1.051e-01, -1.403e-01, -2.152e-02, 1.688e-01, -8.572e-02, 2.348e-01, 6.435e-02, -4.347e-02, -1.404e-01, 1.339e-02, -5.361e-01, 5.124e-02, -9.061e-02, -9.480e-02, 1.026e-01, -2.842e-02)); + r += mul(s7_3, M4(5.644e-02, 4.302e-02, 1.369e-01, 1.658e-02, 7.890e-02, -1.081e-01, 2.689e-02, 2.602e-01, -1.591e-01, 2.769e-02, -3.205e-01, -4.162e-02, -5.145e-02, -3.690e-02, 1.473e-01, 4.620e-02)); + r += mul(s7_4, M4(2.471e-02, 6.913e-02, -1.824e-01, 5.231e-02, 2.212e-01, -7.666e-04, -6.935e-02, -1.392e-01, 2.019e-01, 1.681e-01, 5.797e-02, 1.882e-02, 2.256e-01, -2.192e-01, -2.268e-01, 2.986e-02)); + r += mul(s7_5, M4(-2.425e-02, 1.309e-02, -5.389e-03, 4.018e-02, -5.452e-02, 7.173e-02, 1.344e-01, -1.893e-02, 1.381e-01, -2.273e-01, -2.084e-01, -1.921e-01, 2.261e-02, -2.222e-01, -8.991e-02, -4.589e-02)); + r += mul(s7_6, M4(-2.215e-02, 5.801e-02, -1.661e-01, 6.336e-02, 3.630e-02, -1.046e-01, -5.412e-02, -4.792e-02, -8.750e-02, 9.563e-02, -2.661e-01, 8.485e-02, 1.802e-01, -6.451e-02, -1.092e-01, 1.444e-01)); + r += mul(s7_7, M4(-1.363e-02, 6.278e-02, -2.490e-01, 2.426e-02, -1.696e-02, 1.782e-02, 2.960e-02, 2.952e-02, 2.385e-02, 3.648e-02, 2.804e-02, -1.231e-01, 9.748e-02, -9.324e-02, 1.107e-02, 1.279e-01)); + r += mul(s7_8, M4(5.383e-02, -6.809e-02, -5.792e-02, -2.678e-02, 6.552e-03, 5.476e-02, -4.569e-01, -1.632e-02, -3.676e-02, 1.094e-01, -1.814e-01, 3.622e-02, -1.013e-01, -2.603e-02, 1.067e-01, -1.683e-01)); + r += V4(6.961e-03, -1.709e-02, -1.395e-02, 4.358e-02); + return r; +} + +V4 f3(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-3.310e-02, -1.047e-02, 4.446e-03, -1.065e-01, 7.155e-02, 2.532e-01, 6.451e-02, 8.162e-02, 5.626e-03, -1.614e-01, 5.181e-02, -4.982e-02, -1.051e-01, -7.541e-02, 9.694e-02, 2.524e-02)); + r += mul(s0_1, M4(-7.002e-02, -4.159e-02, -9.201e-02, -1.644e-01, -7.874e-02, 9.247e-02, -1.248e-01, -1.276e-01, -6.662e-02, 4.484e-02, -1.165e-01, -2.996e-02, 8.438e-02, 7.111e-02, 1.909e-01, -8.361e-02)); + r += mul(s0_2, M4(-2.634e-02, 9.918e-02, -2.247e-02, 2.263e-02, 5.951e-02, -1.362e-03, -8.698e-02, 8.262e-02, 5.791e-03, -8.029e-03, -1.377e-01, -4.139e-02, 2.222e-01, 8.128e-02, -3.793e-01, 4.095e-01)); + r += mul(s0_3, M4(2.156e-02, 3.676e-02, 8.860e-02, 1.185e-01, 1.836e-01, -3.042e-01, -1.642e-02, 3.151e-01, -4.662e-02, -7.437e-02, -8.175e-02, -3.873e-02, 6.315e-02, -1.889e-01, -1.107e-01, -1.695e-01)); + r += mul(s0_4, M4(8.632e-02, -9.448e-02, 1.125e-01, 1.151e-02, 3.563e-02, 1.770e-01, -4.597e-02, -4.560e-02, 1.678e-02, -1.753e-01, 2.854e-02, -1.035e-02, -8.369e-03, 1.948e-01, 1.128e-01, -1.325e-01)); + r += mul(s0_5, M4(7.694e-04, -3.053e-02, 5.700e-02, -8.030e-02, -7.811e-03, -7.819e-02, -7.453e-02, 1.973e-01, 4.691e-02, 1.434e-01, -3.162e-02, -7.189e-02, -6.287e-02, -5.170e-01, -8.335e-02, 9.343e-02)); + r += mul(s0_6, M4(3.037e-03, -3.342e-02, -5.670e-02, -2.919e-02, 2.281e-01, 4.177e-03, 4.988e-02, 4.675e-02, 3.656e-02, 1.294e-01, 4.818e-02, 4.157e-02, -3.660e-02, -5.739e-02, -2.379e-01, -8.158e-02)); + r += mul(s0_7, M4(-1.601e-02, 6.322e-02, -7.389e-02, 2.617e-02, -1.247e-01, -3.870e-03, 9.629e-02, 2.878e-02, -7.404e-02, 7.158e-02, -1.819e-02, 8.241e-02, -2.284e-02, -1.365e-01, -1.954e-02, -1.304e-01)); + r += mul(s0_8, M4(-4.040e-02, -2.005e-02, -3.412e-02, 1.068e-01, -2.835e-02, -9.637e-02, -6.092e-02, -1.578e-01, -1.812e-02, -4.020e-02, -3.961e-02, -8.512e-02, 6.531e-02, 1.034e-02, 7.084e-02, 1.837e-02)); + r += mul(s1_0, M4(-7.400e-02, -2.048e-01, 4.059e-01, -2.345e-01, -6.631e-02, 2.262e-02, 1.462e-01, 1.211e-01, 2.671e-01, 2.154e-01, 5.736e-02, -7.656e-02, -3.599e-02, -1.662e-02, -3.786e-02, 1.181e-02)); + r += mul(s1_1, M4(-1.018e-01, -2.402e-01, 9.216e-02, -2.519e-02, 5.146e-02, -1.889e-02, -6.131e-02, -1.159e-01, 2.021e-01, 2.082e-01, -2.572e-01, 7.096e-03, 9.477e-02, -9.545e-02, -5.969e-02, -8.974e-02)); + r += mul(s1_2, M4(5.776e-02, -3.268e-02, 2.991e-01, 3.318e-01, 7.870e-02, 5.555e-02, 2.808e-02, -1.384e-02, 1.006e-02, 9.396e-02, -1.541e-01, 1.746e-01, 1.021e-01, 8.361e-02, -8.241e-02, -3.679e-02)); + r += mul(s1_3, M4(4.243e-01, 2.424e-01, 2.313e-01, -1.975e-01, -4.512e-02, -1.958e-01, 8.668e-02, 1.917e-01, 1.927e-02, 1.191e-02, -1.364e-02, -1.923e-01, 2.884e-02, 1.516e-02, -5.113e-02, -9.241e-02)); + r += mul(s1_4, M4(5.372e-01, 1.449e-01, 2.751e-02, 2.169e-01, -6.685e-02, 2.181e-01, -6.593e-02, -9.706e-02, 1.719e-01, 2.444e-02, 1.299e-01, -4.927e-02, 4.953e-02, -1.792e-02, 8.077e-02, 1.125e-01)); + r += mul(s1_5, M4(1.730e-03, -4.827e-01, 2.841e-01, -1.782e-01, -4.474e-02, 5.705e-02, -6.480e-02, 1.102e-02, 2.095e-01, -2.511e-02, 4.695e-02, -4.598e-02, -1.538e-01, 7.887e-02, 3.751e-02, -1.082e-01)); + r += mul(s1_6, M4(-1.657e-01, -1.450e-01, -2.219e-02, 1.530e-01, 1.049e-01, 3.284e-02, -1.333e-01, 1.505e-02, 9.291e-02, 1.182e-01, 6.159e-02, 3.700e-02, -3.568e-04, -2.911e-02, 1.279e-02, -5.009e-02)); + r += mul(s1_7, M4(-2.588e-01, -4.585e-01, -1.425e-02, -5.658e-03, -3.324e-02, -2.476e-01, 8.082e-02, 5.820e-02, 1.353e-01, 1.031e-01, -7.908e-02, 1.681e-01, 3.531e-02, 4.241e-02, -8.830e-02, -1.067e-02)); + r += mul(s1_8, M4(1.759e-01, 1.195e-01, -5.958e-02, -1.166e-01, 1.525e-02, 2.479e-02, 4.186e-02, -3.045e-02, 3.070e-01, 3.415e-01, -1.288e-01, 4.186e-02, -6.287e-02, -5.575e-02, 1.085e-02, -2.990e-02)); + r += mul(s2_0, M4(-3.779e-02, 8.502e-02, 3.670e-02, -5.649e-02, 2.161e-02, 4.964e-02, 7.737e-02, 3.889e-02, 2.972e-02, -2.336e-02, 2.660e-02, 4.314e-02, 2.544e-02, -1.368e-01, -8.023e-02, 2.406e-02)); + r += mul(s2_1, M4(2.148e-03, 2.318e-01, -1.050e-01, 2.773e-02, 7.478e-02, -8.558e-02, -4.437e-02, -2.647e-02, -3.378e-02, 7.765e-03, 1.097e-01, -6.929e-02, 6.677e-02, -6.817e-02, -1.492e-02, 1.052e-01)); + r += mul(s2_2, M4(-1.446e-01, 5.619e-02, 7.113e-02, -1.084e-03, 4.138e-02, 8.402e-02, -1.147e-02, 2.059e-02, 3.658e-02, 1.095e-01, 1.113e-02, 2.767e-02, -1.791e-01, -2.241e-02, 8.983e-02, -2.046e-02)); + r += mul(s2_3, M4(-3.334e-02, -8.473e-02, -1.845e-01, -2.242e-02, -4.167e-03, 1.196e-01, -1.121e-01, -1.514e-02, 4.081e-02, 2.293e-01, -2.307e-01, 4.014e-01, 1.353e-01, 1.334e-01, -1.107e-01, 6.926e-02)); + r += mul(s2_4, M4(9.510e-02, -1.627e-02, 1.553e-01, -8.809e-02, -1.072e-01, 9.681e-02, -3.757e-02, -1.325e-01, -5.078e-02, 2.735e-01, 1.794e-01, 3.084e-01, 7.204e-02, -8.301e-02, -6.917e-02, -1.438e-02)); + r += mul(s2_5, M4(-4.562e-02, 1.039e-01, 1.454e-01, -2.231e-01, 1.059e-02, 5.584e-02, -1.292e-01, -1.031e-02, -1.368e-01, -1.102e-01, 1.740e-01, 7.728e-02, -1.854e-01, 4.047e-02, -2.346e-02, -1.281e-01)); + r += mul(s2_6, M4(9.606e-02, -4.460e-02, 1.095e-01, -2.996e-02, -2.107e-02, -2.014e-02, 2.350e-01, -7.004e-02, -8.360e-02, 8.714e-02, -1.265e-01, -2.492e-02, -4.162e-02, -1.169e-02, 4.289e-02, -1.474e-01)); + r += mul(s2_7, M4(1.057e-01, -2.529e-01, 4.756e-02, -1.517e-03, -3.801e-02, -8.089e-02, 2.027e-02, 1.219e-01, -1.119e-01, 6.527e-02, 3.577e-02, -1.732e-01, 1.022e-01, -4.923e-02, -1.197e-02, 8.317e-03)); + r += mul(s2_8, M4(1.844e-02, 4.025e-02, -1.694e-01, 1.480e-01, 3.920e-02, -8.898e-02, 3.544e-02, 1.283e-01, 1.745e-01, -1.828e-01, -8.220e-02, -3.703e-02, -9.434e-02, 8.537e-02, -2.254e-03, -2.373e-01)); + r += mul(s3_0, M4(-4.414e-02, 1.265e-01, 1.132e-01, 8.795e-02, 1.179e-03, -9.083e-02, 4.055e-02, 1.348e-01, -2.953e-02, 3.096e-02, -1.500e-02, -2.655e-02, 1.048e-01, -1.834e-01, 2.040e-02, 1.876e-02)); + r += mul(s3_1, M4(-5.469e-02, 3.613e-01, 1.175e-01, 1.847e-02, 2.442e-01, -7.088e-02, -2.256e-01, 4.352e-02, -6.138e-02, -1.043e-01, 1.027e-02, 6.533e-02, 2.383e-01, 1.044e-04, 1.277e-02, -9.124e-02)); + r += mul(s3_2, M4(-1.481e-01, -2.980e-01, 3.422e-02, -7.770e-02, 1.320e-01, 3.090e-01, -6.432e-02, -1.516e-01, 8.392e-02, -1.138e-01, 8.590e-02, -1.004e-01, 1.834e-02, 4.498e-02, -7.585e-02, 8.780e-02)); + r += mul(s3_3, M4(1.041e-01, 3.988e-03, -2.560e-01, 1.170e-01, -7.932e-02, 7.428e-03, -1.451e-01, 1.531e-01, -4.874e-02, -7.994e-04, -4.455e-02, 3.958e-03, 3.660e-03, 1.042e-01, -9.601e-02, -1.359e-02)); + r += mul(s3_4, M4(-1.098e-02, -2.595e-01, 6.339e-02, 4.795e-02, -4.507e-02, 2.261e-01, -2.230e-01, 5.826e-02, 8.636e-04, 1.241e-01, 1.149e-01, -6.624e-02, -5.745e-02, 7.117e-02, 2.267e-02, -2.648e-01)); + r += mul(s3_5, M4(9.860e-02, 2.700e-01, 1.025e-01, -3.150e-01, -1.326e-01, 1.185e-01, -4.155e-02, -1.511e-02, -4.764e-02, -6.836e-02, -2.254e-02, 7.437e-02, 2.222e-02, -7.851e-02, 1.590e-02, 1.601e-01)); + r += mul(s3_6, M4(1.393e-01, 8.621e-03, -2.183e-02, -2.017e-02, 1.148e-01, -1.643e-02, 1.285e-01, -2.263e-02, -1.718e-02, 7.851e-02, 1.532e-02, 3.675e-02, 4.451e-02, 2.104e-01, -1.268e-01, 5.241e-02)); + r += mul(s3_7, M4(-2.816e-02, -1.125e-01, 1.205e-01, -3.454e-03, 4.550e-02, -5.359e-03, 6.028e-02, 1.263e-01, 5.069e-02, -3.246e-02, 8.699e-02, -1.295e-01, 2.440e-02, 7.617e-02, -2.258e-02, 1.113e-01)); + r += mul(s3_8, M4(-1.014e-01, 2.407e-02, -9.447e-02, 5.400e-02, 2.735e-02, -1.241e-01, -6.878e-02, 4.014e-01, 6.577e-02, -3.158e-02, 7.358e-02, 1.269e-02, 5.336e-02, -4.621e-02, 4.812e-02, -4.715e-02)); + r += mul(s4_0, M4(-1.007e-02, -7.450e-02, -5.531e-02, -4.589e-02, -1.065e-01, 1.119e-01, 9.279e-02, 2.339e-01, -4.817e-02, 1.139e-01, -3.075e-02, 5.132e-02, -1.425e-01, -6.251e-02, -3.181e-02, -6.615e-02)); + r += mul(s4_1, M4(-1.282e-01, -6.415e-02, 3.188e-02, -6.217e-02, -5.337e-02, -1.369e-01, -3.857e-01, -2.054e-03, -1.344e-01, -9.127e-02, 1.287e-01, -1.084e-01, -8.630e-02, 9.341e-02, -3.698e-02, 5.253e-02)); + r += mul(s4_2, M4(-2.931e-02, -5.825e-02, -1.005e-01, 1.509e-03, -1.696e-01, 2.150e-01, -3.179e-02, -4.437e-02, 1.685e-02, 2.196e-01, -1.043e-01, 1.195e-01, -6.515e-02, -1.503e-01, 5.465e-02, -8.743e-03)); + r += mul(s4_3, M4(2.526e-02, -7.600e-02, 1.376e-01, -1.703e-03, -3.037e-01, 4.758e-01, 1.650e-01, 1.253e-01, -5.532e-02, -1.535e-01, 1.407e-01, -2.290e-01, -3.009e-02, -8.620e-02, 1.428e-02, -1.516e-02)); + r += mul(s4_4, M4(9.797e-02, 8.982e-02, -1.111e-01, -1.288e-01, 9.594e-02, 2.375e-01, -7.565e-02, -1.898e-01, -7.647e-02, -4.225e-02, 2.417e-02, -9.900e-02, -3.667e-03, 2.601e-02, -1.526e-02, 6.440e-02)); + r += mul(s4_5, M4(4.779e-02, 1.333e-01, 5.828e-02, -2.145e-01, -3.738e-02, 2.204e-04, 8.182e-02, 3.155e-02, -7.055e-02, -7.680e-02, -6.878e-02, 1.135e-01, 6.465e-02, -2.374e-02, -3.712e-02, -3.930e-02)); + r += mul(s4_6, M4(-2.554e-02, 8.685e-03, 1.068e-01, -9.349e-02, -6.696e-02, 3.094e-02, 5.133e-01, 6.619e-02, 1.682e-01, -8.019e-02, -4.694e-02, 4.223e-02, 2.999e-02, 1.180e-01, 1.023e-01, 3.307e-02)); + r += mul(s4_7, M4(-6.283e-02, -2.698e-02, 1.240e-01, -1.550e-02, -3.459e-02, 1.235e-01, -2.164e-01, -8.066e-02, 2.666e-01, 1.082e-01, -2.279e-01, 1.298e-01, -7.096e-02, 1.398e-02, -1.126e-01, 1.729e-02)); + r += mul(s4_8, M4(-3.592e-02, -2.696e-02, -1.240e-01, 1.922e-01, 5.469e-02, 1.087e-02, 6.027e-02, 1.188e-01, 5.205e-02, -3.912e-02, 5.425e-02, 1.714e-02, 1.377e-01, -4.612e-03, 1.018e-01, 2.339e-02)); + r += mul(s5_0, M4(3.069e-01, 1.913e-02, -1.458e-01, 1.175e-02, -9.135e-03, 2.076e-02, 2.156e-02, 1.665e-01, 4.221e-02, -7.960e-03, 2.793e-02, 6.755e-03, -1.430e-02, -7.548e-02, 4.690e-02, 6.693e-02)); + r += mul(s5_1, M4(-1.602e-01, -1.685e-01, 1.020e-01, 7.694e-02, 1.949e-02, -1.012e-01, -1.111e-01, -1.018e-01, -3.667e-02, 4.584e-02, 6.979e-02, -8.594e-02, -1.077e-01, -7.754e-02, -1.661e-02, 5.381e-02)); + r += mul(s5_2, M4(-2.663e-02, 6.025e-02, 5.513e-02, 1.875e-01, -1.171e-02, -5.782e-02, 5.743e-02, 9.628e-03, -1.430e-01, -1.016e-02, 1.429e-02, -6.060e-03, -1.659e-07, -1.252e-01, 3.171e-02, -1.015e-01)); + r += mul(s5_3, M4(1.024e-01, 2.345e-02, -1.129e-03, 2.063e-01, -3.990e-02, 7.542e-02, -5.214e-02, 1.172e-02, -9.788e-02, 7.562e-02, 1.072e-01, -6.372e-02, 7.381e-02, -4.092e-02, 6.908e-02, -2.314e-01)); + r += mul(s5_4, M4(4.877e-02, 6.891e-02, 8.940e-02, -4.991e-02, 7.390e-02, 1.307e-01, -1.390e-02, -3.120e-02, -5.540e-02, 1.779e-01, 1.120e-02, -8.706e-02, 1.261e-01, -1.925e-01, -1.373e-02, -6.053e-02)); + r += mul(s5_5, M4(-2.393e-02, 7.691e-02, 2.439e-01, 7.700e-02, 1.795e-02, -7.796e-02, -6.049e-02, -2.466e-03, 1.844e-02, -2.038e-01, -2.290e-01, -1.484e-01, 3.392e-02, 9.811e-02, -1.844e-01, -4.141e-02)); + r += mul(s5_6, M4(-4.138e-02, -1.700e-01, 3.278e-01, 3.828e-02, -6.868e-02, -1.343e-01, 3.616e-02, 1.254e-01, 3.440e-03, -7.632e-02, -1.761e-02, 1.819e-01, 1.342e-02, 1.132e-01, -1.276e-01, 3.600e-02)); + r += mul(s5_7, M4(-1.716e-01, -5.100e-02, 1.250e-01, 8.485e-02, 3.682e-02, 1.543e-02, 1.113e-01, -9.796e-02, 1.395e-01, 4.326e-02, -4.639e-02, 1.166e-01, 3.806e-02, 1.657e-01, 2.174e-01, 4.814e-02)); + r += mul(s5_8, M4(-2.120e-01, -2.207e-02, -1.430e-01, 8.618e-02, -5.200e-02, -6.653e-02, 4.128e-02, 1.239e-01, -1.761e-01, 1.531e-01, -2.303e-01, -5.517e-03, -1.222e-02, -5.068e-02, 7.704e-02, -1.185e-01)); + r += mul(s6_0, M4(-3.371e-02, -6.558e-02, 1.376e-03, -1.345e-01, 1.465e-02, 1.052e-01, -2.816e-02, 9.085e-02, 5.106e-02, 6.937e-02, 7.058e-02, 8.025e-02, 3.013e-02, -2.639e-02, 1.649e-02, 1.785e-02)); + r += mul(s6_1, M4(-6.707e-02, 1.761e-01, -1.615e-02, -4.314e-02, -1.076e-01, 1.287e-01, -1.184e-02, 7.810e-03, 1.243e-01, -2.929e-02, 7.740e-02, -1.041e-01, -5.104e-02, -4.334e-02, 1.242e-01, 1.227e-01)); + r += mul(s6_2, M4(4.123e-02, 3.019e-02, -2.243e-02, -4.618e-02, -9.245e-02, -1.620e-01, 5.712e-02, -7.876e-02, -1.682e-02, 2.681e-02, -5.675e-03, -1.721e-01, -2.870e-02, -3.578e-02, 7.775e-03, -1.233e-01)); + r += mul(s6_3, M4(-1.652e-01, -7.928e-04, -4.806e-02, 4.656e-02, 2.087e-02, 6.688e-02, -6.866e-02, 4.033e-02, 4.829e-02, -2.848e-02, -5.616e-02, 1.375e-02, -5.552e-02, -1.680e-02, -5.849e-02, -1.262e-01)); + r += mul(s6_4, M4(1.233e-01, -9.312e-02, -3.187e-02, 6.720e-02, 6.422e-02, 3.899e-02, 3.527e-02, 1.679e-02, -9.803e-02, -2.406e-02, -6.811e-02, 3.042e-02, 1.062e-01, 1.312e-01, -5.425e-02, 9.650e-02)); + r += mul(s6_5, M4(-1.846e-02, -1.606e-02, 7.972e-02, -2.837e-02, 2.431e-02, -1.271e-01, -3.847e-02, -7.955e-02, -2.000e-02, 1.166e-02, -3.156e-02, 5.790e-02, 3.407e-02, -4.190e-02, -1.782e-02, -2.151e-02)); + r += mul(s6_6, M4(-2.544e-02, -5.915e-02, 1.843e-01, 9.362e-02, 4.990e-03, -1.615e-02, 7.778e-02, -3.237e-02, -1.791e-01, 6.874e-02, 5.214e-03, -4.972e-02, 3.849e-02, 3.411e-02, 9.507e-02, 6.376e-02)); + r += mul(s6_7, M4(1.284e-01, -5.599e-02, 1.323e-01, 5.644e-02, -4.202e-02, 5.244e-02, -8.550e-02, -2.918e-02, -3.015e-02, 3.385e-02, 3.261e-02, -8.972e-02, -3.890e-02, 6.428e-02, -3.145e-02, -2.355e-02)); + r += mul(s6_8, M4(8.571e-02, 2.069e-02, 5.270e-02, 4.432e-02, -3.353e-02, 1.355e-01, 1.678e-02, 8.254e-02, -3.588e-04, 9.659e-03, 5.636e-02, 1.541e-02, -1.879e-02, -4.235e-02, -6.655e-02, -2.892e-02)); + r += mul(s7_0, M4(5.057e-02, -1.094e-01, -2.501e-02, 2.854e-02, 2.897e-02, -2.094e-01, -1.915e-02, 4.697e-02, -4.821e-02, 5.449e-02, -1.429e-01, -1.043e-01, 4.462e-02, 5.616e-02, -5.757e-02, 5.563e-02)); + r += mul(s7_1, M4(-5.853e-02, 1.182e-01, 1.179e-02, 3.173e-02, -4.999e-02, 6.827e-02, -1.233e-01, 4.053e-02, 2.026e-01, 7.719e-02, -2.028e-01, -2.474e-02, -2.304e-02, -3.564e-02, -1.264e-02, -9.711e-02)); + r += mul(s7_2, M4(4.403e-02, 1.681e-02, 9.049e-03, -8.114e-04, -1.040e-01, 3.131e-03, -5.200e-02, -7.127e-02, -6.435e-02, -8.722e-02, -7.123e-02, 2.914e-02, -6.080e-03, 1.132e-01, 9.580e-02, 6.098e-02)); + r += mul(s7_3, M4(5.650e-02, -1.091e-01, 2.306e-01, 7.148e-02, 9.243e-02, 2.465e-02, -1.498e-01, 7.515e-02, 5.593e-02, 1.612e-02, -1.273e-01, -2.858e-02, 1.162e-01, -2.942e-01, 7.213e-02, -2.089e-01)); + r += mul(s7_4, M4(7.218e-02, -3.291e-02, -1.870e-02, -2.636e-01, 3.129e-01, 6.619e-02, 1.584e-01, 1.509e-01, -2.000e-01, -6.524e-02, -5.895e-01, 3.878e-02, 6.326e-02, 2.978e-02, 3.527e-03, 1.264e-02)); + r += mul(s7_5, M4(-6.218e-02, 2.090e-02, 1.216e-01, -6.139e-02, 1.023e-01, -1.329e-01, 4.503e-02, 2.290e-02, 1.011e-01, -1.292e-01, 1.513e-02, -1.150e-01, 2.092e-03, 2.387e-01, 2.038e-01, 5.367e-02)); + r += mul(s7_6, M4(-5.686e-02, -2.890e-02, -3.717e-02, 7.714e-02, 4.568e-02, -6.003e-02, 1.097e-01, -1.933e-02, -2.708e-01, -6.252e-03, -7.931e-02, -1.325e-01, 3.035e-02, 1.009e-01, 1.392e-01, 3.232e-01)); + r += mul(s7_7, M4(-2.405e-01, -6.710e-02, -2.377e-02, 3.145e-02, 9.669e-02, -1.496e-01, 3.671e-02, -7.840e-03, -1.736e-01, 1.203e-01, -1.745e-01, -1.564e-01, 1.998e-01, 1.556e-01, -1.469e-01, -1.946e-01)); + r += mul(s7_8, M4(7.734e-02, -1.404e-01, -8.468e-02, 1.537e-01, 3.650e-02, 1.036e-01, -7.442e-02, 4.586e-02, 8.895e-02, 2.057e-01, -9.627e-02, 2.055e-01, -7.919e-02, -3.901e-02, 9.436e-02, -9.957e-02)); + r += V4(7.049e-03, -5.164e-03, 7.833e-03, 3.095e-02); + return r; +} + +void Pass7(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = Rmp8x8(tid.x) + blockStart; + uint2 size = GetInputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = (gxy + 0.5) * pt; + + V4 s0_0 = l0(-1.0, -1.0); + V4 s0_1 = l0(0.0, -1.0); + V4 s0_2 = l0(1.0, -1.0); + V4 s0_3 = l0(-1.0, 0.0); + V4 s0_4 = l0(0.0, 0.0); + V4 s0_5 = l0(1.0, 0.0); + V4 s0_6 = l0(-1.0, 1.0); + V4 s0_7 = l0(0.0, 1.0); + V4 s0_8 = l0(1.0, 1.0); + V4 s1_0 = -max(-s0_0, 0.0); + V4 s1_1 = -max(-s0_1, 0.0); + V4 s1_2 = -max(-s0_2, 0.0); + V4 s1_3 = -max(-s0_3, 0.0); + V4 s1_4 = -max(-s0_4, 0.0); + V4 s1_5 = -max(-s0_5, 0.0); + V4 s1_6 = -max(-s0_6, 0.0); + V4 s1_7 = -max(-s0_7, 0.0); + V4 s1_8 = -max(-s0_8, 0.0); + s0_0 = max(s0_0, 0.0); + s0_1 = max(s0_1, 0.0); + s0_2 = max(s0_2, 0.0); + s0_3 = max(s0_3, 0.0); + s0_4 = max(s0_4, 0.0); + s0_5 = max(s0_5, 0.0); + s0_6 = max(s0_6, 0.0); + s0_7 = max(s0_7, 0.0); + s0_8 = max(s0_8, 0.0); + + V4 s2_0 = l1(-1.0, -1.0); + V4 s2_1 = l1(0.0, -1.0); + V4 s2_2 = l1(1.0, -1.0); + V4 s2_3 = l1(-1.0, 0.0); + V4 s2_4 = l1(0.0, 0.0); + V4 s2_5 = l1(1.0, 0.0); + V4 s2_6 = l1(-1.0, 1.0); + V4 s2_7 = l1(0.0, 1.0); + V4 s2_8 = l1(1.0, 1.0); + V4 s3_0 = -max(-s2_0, 0.0); + V4 s3_1 = -max(-s2_1, 0.0); + V4 s3_2 = -max(-s2_2, 0.0); + V4 s3_3 = -max(-s2_3, 0.0); + V4 s3_4 = -max(-s2_4, 0.0); + V4 s3_5 = -max(-s2_5, 0.0); + V4 s3_6 = -max(-s2_6, 0.0); + V4 s3_7 = -max(-s2_7, 0.0); + V4 s3_8 = -max(-s2_8, 0.0); + s2_0 = max(s2_0, 0.0); + s2_1 = max(s2_1, 0.0); + s2_2 = max(s2_2, 0.0); + s2_3 = max(s2_3, 0.0); + s2_4 = max(s2_4, 0.0); + s2_5 = max(s2_5, 0.0); + s2_6 = max(s2_6, 0.0); + s2_7 = max(s2_7, 0.0); + s2_8 = max(s2_8, 0.0); + + V4 s4_0 = l2(-1.0, -1.0); + V4 s4_1 = l2(0.0, -1.0); + V4 s4_2 = l2(1.0, -1.0); + V4 s4_3 = l2(-1.0, 0.0); + V4 s4_4 = l2(0.0, 0.0); + V4 s4_5 = l2(1.0, 0.0); + V4 s4_6 = l2(-1.0, 1.0); + V4 s4_7 = l2(0.0, 1.0); + V4 s4_8 = l2(1.0, 1.0); + V4 s5_0 = -max(-s4_0, 0.0); + V4 s5_1 = -max(-s4_1, 0.0); + V4 s5_2 = -max(-s4_2, 0.0); + V4 s5_3 = -max(-s4_3, 0.0); + V4 s5_4 = -max(-s4_4, 0.0); + V4 s5_5 = -max(-s4_5, 0.0); + V4 s5_6 = -max(-s4_6, 0.0); + V4 s5_7 = -max(-s4_7, 0.0); + V4 s5_8 = -max(-s4_8, 0.0); + s4_0 = max(s4_0, 0.0); + s4_1 = max(s4_1, 0.0); + s4_2 = max(s4_2, 0.0); + s4_3 = max(s4_3, 0.0); + s4_4 = max(s4_4, 0.0); + s4_5 = max(s4_5, 0.0); + s4_6 = max(s4_6, 0.0); + s4_7 = max(s4_7, 0.0); + s4_8 = max(s4_8, 0.0); + + V4 s6_0 = l3(-1.0, -1.0); + V4 s6_1 = l3(0.0, -1.0); + V4 s6_2 = l3(1.0, -1.0); + V4 s6_3 = l3(-1.0, 0.0); + V4 s6_4 = l3(0.0, 0.0); + V4 s6_5 = l3(1.0, 0.0); + V4 s6_6 = l3(-1.0, 1.0); + V4 s6_7 = l3(0.0, 1.0); + V4 s6_8 = l3(1.0, 1.0); + V4 s7_0 = -max(-s6_0, 0.0); + V4 s7_1 = -max(-s6_1, 0.0); + V4 s7_2 = -max(-s6_2, 0.0); + V4 s7_3 = -max(-s6_3, 0.0); + V4 s7_4 = -max(-s6_4, 0.0); + V4 s7_5 = -max(-s6_5, 0.0); + V4 s7_6 = -max(-s6_6, 0.0); + V4 s7_7 = -max(-s6_7, 0.0); + V4 s7_8 = -max(-s6_8, 0.0); + s6_0 = max(s6_0, 0.0); + s6_1 = max(s6_1, 0.0); + s6_2 = max(s6_2, 0.0); + s6_3 = max(s6_3, 0.0); + s6_4 = max(s6_4, 0.0); + s6_5 = max(s6_5, 0.0); + s6_6 = max(s6_6, 0.0); + s6_7 = max(s6_7, 0.0); + s6_8 = max(s6_8, 0.0); + + t0[gxy] = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t1[gxy] = f1(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t2[gxy] = f2(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t3[gxy] = f3(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); +} + +//!PASS 8 +//!DESC conv7 +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 +//!IN t0, t1, t2, t3 +//!OUT t4, t5, t6, t7 + +#define l0(x, y) V4(O(t0, float2(x, y))) +#define l1(x, y) V4(O(t1, float2(x, y))) +#define l2(x, y) V4(O(t2, float2(x, y))) +#define l3(x, y) V4(O(t3, float2(x, y))) + +V4 f0(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(7.326e-02, -1.680e-02, -8.532e-03, -8.328e-02, -2.611e-02, 2.756e-02, -2.479e-02, 6.118e-02, 6.048e-02, 6.589e-02, -6.333e-03, 1.630e-02, -8.749e-02, -1.124e-01, 2.867e-02, 6.888e-02)); + r += mul(s0_1, M4(5.320e-02, -7.348e-02, -7.345e-02, -1.411e-01, 1.352e-01, -3.202e-02, 4.852e-02, -9.364e-02, -1.231e-01, -1.377e-01, -7.887e-02, 2.989e-02, -1.630e-01, -1.394e-01, -1.876e-01, 8.178e-02)); + r += mul(s0_2, M4(-1.359e-01, -1.165e-01, -2.628e-01, -5.544e-02, -2.101e-02, 2.755e-03, -1.010e-01, 7.707e-02, 4.659e-02, -4.174e-02, 3.209e-02, 3.284e-02, -9.646e-02, -4.638e-02, -2.890e-02, -6.471e-03)); + r += mul(s0_3, M4(4.069e-02, 1.116e-01, -7.851e-02, 2.314e-02, -1.063e-01, -1.398e-02, -8.177e-02, 7.154e-02, 6.327e-02, 1.028e-01, -1.067e-01, 2.547e-02, 3.345e-02, -1.358e-01, -7.660e-02, 2.743e-01)); + r += mul(s0_4, M4(-1.749e-01, 1.672e-01, 1.233e-01, 2.579e-02, 1.416e-01, 1.264e-02, 3.625e-02, 1.070e-02, 4.777e-02, 5.466e-02, -7.225e-02, 2.460e-02, -3.268e-02, -8.000e-02, 1.727e-03, 5.799e-02)); + r += mul(s0_5, M4(-7.982e-02, 3.175e-02, -9.588e-02, 1.356e-01, 9.916e-02, -1.107e-02, -2.543e-02, 1.025e-01, 2.149e-02, -8.852e-02, -9.233e-02, -6.055e-02, -1.254e-01, -3.054e-02, -4.695e-02, 2.900e-02)); + r += mul(s0_6, M4(6.681e-02, 2.395e-01, -3.717e-03, 7.605e-03, -8.234e-02, -4.648e-02, 1.036e-01, -1.684e-02, -2.558e-02, 1.999e-02, 5.742e-02, 1.543e-02, 4.634e-02, -2.336e-01, -7.873e-03, -1.503e-02)); + r += mul(s0_7, M4(9.118e-03, 1.362e-01, 1.276e-02, 2.263e-02, -8.010e-02, 5.689e-02, 3.855e-02, -8.891e-02, -1.977e-02, 5.464e-02, -1.107e-01, -1.507e-01, 7.280e-02, 3.315e-01, 1.247e-01, -1.315e-01)); + r += mul(s0_8, M4(4.262e-02, 3.590e-02, -5.887e-02, 1.078e-01, 4.775e-02, 4.336e-02, 2.300e-02, 8.044e-02, 1.452e-02, 1.896e-02, 7.814e-02, -1.559e-01, -2.269e-01, -9.475e-02, -3.582e-02, 6.094e-02)); + r += mul(s1_0, M4(-7.673e-02, 3.620e-02, -1.194e-02, -1.948e-01, 5.772e-03, -8.285e-02, -6.731e-02, -1.318e-01, -3.922e-02, 3.819e-02, -1.171e-01, 3.155e-02, 9.811e-02, -3.604e-02, -4.110e-02, -8.592e-03)); + r += mul(s1_1, M4(-9.692e-02, -1.232e-01, -2.234e-01, -3.303e-01, -1.204e-01, -1.037e-01, -6.013e-02, -6.288e-02, -2.922e-02, -4.687e-02, 3.154e-03, 4.076e-02, -5.423e-02, -3.524e-02, -1.036e-01, 2.995e-02)); + r += mul(s1_2, M4(-7.888e-02, -8.202e-02, -4.395e-01, 9.045e-02, 2.978e-03, -8.826e-02, -1.084e-01, -2.192e-01, 5.059e-02, 2.395e-02, 5.964e-03, 1.145e-01, -1.370e-02, 4.883e-02, -6.958e-02, -6.560e-02)); + r += mul(s1_3, M4(1.279e-01, -1.432e-01, -5.269e-02, 3.730e-02, -1.142e-01, 1.388e-01, -3.105e-02, 4.774e-02, 7.469e-02, 4.862e-02, 2.075e-02, -5.505e-02, -4.774e-02, 1.962e-01, -9.652e-03, -2.483e-02)); + r += mul(s1_4, M4(-2.781e-02, 6.737e-02, 2.201e-01, 7.259e-02, -2.564e-01, 3.118e-02, -3.571e-02, -2.165e-02, -5.012e-02, 2.662e-02, 3.784e-02, 6.786e-03, 4.114e-02, 3.618e-02, 4.794e-02, -1.455e-02)); + r += mul(s1_5, M4(-1.191e-01, -1.130e-01, -1.292e-02, -9.387e-02, -3.200e-01, 6.517e-02, 4.728e-02, -8.181e-02, 9.274e-02, 4.584e-02, 8.052e-02, 7.160e-02, -3.136e-02, -3.421e-03, 1.210e-02, 4.128e-02)); + r += mul(s1_6, M4(9.538e-02, 1.158e-01, 5.522e-02, -5.608e-02, -1.713e-02, -1.104e-01, 3.938e-02, 1.422e-01, -1.006e-01, -8.636e-02, 1.612e-02, 7.535e-02, 7.791e-02, -3.914e-02, 6.032e-03, -7.430e-02)); + r += mul(s1_7, M4(1.279e-01, 1.155e-01, -5.522e-02, 1.038e-02, -6.844e-02, -1.568e-02, 3.897e-02, 6.627e-02, -2.525e-02, 5.406e-02, 1.185e-02, -1.289e-01, 5.105e-02, 1.325e-02, -2.018e-02, 1.429e-01)); + r += mul(s1_8, M4(-5.325e-03, 2.080e-02, -1.756e-02, -1.535e-02, -5.934e-02, 1.038e-01, 1.131e-03, 1.061e-01, 1.334e-02, -4.694e-02, 1.311e-02, 3.889e-02, 3.943e-02, -4.937e-03, -8.483e-02, 2.961e-02)); + r += mul(s2_0, M4(2.529e-02, 1.284e-01, -6.831e-02, 8.552e-02, 1.688e-02, -2.406e-02, -3.573e-02, -8.468e-02, -3.537e-02, -2.755e-02, -1.551e-01, -8.238e-02, 1.797e-03, 7.391e-04, 9.301e-02, 7.129e-02)); + r += mul(s2_1, M4(5.069e-02, 1.511e-02, -8.571e-02, 1.932e-01, 6.459e-02, -6.110e-02, 6.249e-02, -4.744e-02, 8.680e-02, -2.431e-02, -1.476e-01, -8.965e-03, -4.096e-02, -2.333e-02, 5.975e-02, -4.329e-02)); + r += mul(s2_2, M4(9.870e-02, -5.693e-02, 2.317e-01, -1.962e-01, 2.122e-03, 8.375e-02, -9.086e-03, 4.394e-03, -9.753e-02, -1.918e-02, 1.314e-02, -6.324e-02, -1.367e-01, 6.549e-03, 1.832e-02, -1.994e-03)); + r += mul(s2_3, M4(6.551e-02, -2.222e-01, -9.212e-02, -3.601e-02, 2.795e-02, -9.005e-04, 1.452e-02, 1.030e-05, 6.994e-03, 2.014e-02, -5.785e-03, 5.890e-02, 5.451e-02, 8.729e-03, 2.239e-02, -6.286e-02)); + r += mul(s2_4, M4(1.156e-01, -4.127e-01, -7.728e-02, -5.974e-03, -7.359e-03, 8.215e-02, 3.321e-03, 8.025e-02, -4.020e-02, 3.870e-02, 1.025e-01, 1.783e-01, -6.440e-03, -6.624e-02, 1.581e-03, -1.802e-02)); + r += mul(s2_5, M4(2.858e-01, 9.141e-02, 5.689e-02, -4.694e-02, -1.589e-02, -1.341e-01, 1.310e-01, 1.950e-03, -5.580e-02, -7.293e-02, -8.763e-02, 1.233e-01, -2.732e-02, -1.022e-01, 5.317e-02, 7.542e-02)); + r += mul(s2_6, M4(-5.645e-02, -1.140e-01, -6.738e-03, -4.646e-02, 5.276e-02, 3.075e-02, -1.642e-02, 3.556e-02, -6.125e-03, 3.828e-03, 1.131e-02, -1.482e-01, 6.052e-02, -4.016e-02, -2.530e-02, -1.002e-01)); + r += mul(s2_7, M4(8.396e-04, 4.828e-03, -4.947e-02, -4.133e-03, -2.696e-03, 2.795e-02, 2.310e-02, -6.906e-02, -4.635e-02, 2.880e-01, -5.403e-02, 1.196e-01, 4.968e-02, 6.836e-04, -6.956e-02, 1.108e-01)); + r += mul(s2_8, M4(1.626e-01, -5.639e-02, 2.667e-02, -4.575e-02, -1.474e-02, -8.975e-02, 1.452e-02, -1.030e-02, -5.135e-02, 1.374e-01, -5.451e-02, -3.441e-02, 1.314e-01, 4.312e-02, 4.449e-03, 4.756e-02)); + r += mul(s3_0, M4(-1.225e-02, -8.804e-02, -8.613e-03, 1.151e-01, -2.185e-02, 5.594e-02, -3.407e-02, -1.318e-02, -3.389e-02, -1.279e-01, -2.860e-02, -1.436e-02, -1.869e-01, 4.171e-02, -6.930e-02, 4.920e-02)); + r += mul(s3_1, M4(-6.642e-02, -9.350e-02, 4.312e-02, 1.403e-01, 4.267e-02, -6.881e-02, 8.049e-02, 1.490e-01, 2.641e-03, -1.042e-01, -5.050e-02, -2.284e-02, -3.493e-02, 1.340e-01, 1.530e-01, 4.731e-02)); + r += mul(s3_2, M4(1.421e-01, 3.422e-02, 1.132e-01, -1.175e-02, -6.359e-03, 5.818e-03, -1.565e-02, 2.434e-02, 3.349e-02, -7.312e-02, -2.611e-03, 8.518e-02, -2.472e-02, -1.053e-01, 5.248e-02, 1.049e-01)); + r += mul(s3_3, M4(-1.025e-03, -6.495e-02, 3.081e-02, -1.668e-02, 3.482e-02, 1.118e-01, -1.849e-02, -6.570e-02, 1.400e-02, 8.527e-02, -5.726e-02, 3.651e-02, 9.570e-02, -3.766e-01, 1.071e-01, 4.728e-02)); + r += mul(s3_4, M4(-2.700e-02, -5.728e-02, -6.008e-02, -6.256e-02, 7.111e-02, 2.445e-01, 1.668e-01, 1.348e-01, 7.866e-02, 1.338e-01, 4.739e-02, 8.424e-02, -9.877e-02, 1.519e-01, 6.522e-02, 4.844e-02)); + r += mul(s3_5, M4(-3.520e-03, 3.914e-02, 7.109e-02, -5.600e-03, 1.450e-01, 1.508e-01, 7.065e-02, -4.504e-02, 1.067e-02, -2.594e-02, 3.621e-02, 6.891e-02, -3.996e-02, 1.098e-01, 1.622e-01, 8.866e-02)); + r += mul(s3_6, M4(-2.979e-02, 1.837e-02, 2.692e-02, 1.753e-02, -9.040e-02, -1.203e-02, 4.506e-02, 2.294e-02, -1.252e-02, 3.441e-03, 4.172e-02, -8.800e-02, 2.268e-01, -1.349e-01, -4.966e-02, 1.769e-02)); + r += mul(s3_7, M4(-6.246e-02, 8.865e-02, 2.051e-02, 4.051e-03, -4.327e-02, -2.075e-03, -5.887e-02, 1.245e-01, 1.396e-02, 1.486e-01, -5.456e-02, 9.013e-03, -1.614e-01, 1.545e-01, -2.425e-02, 1.473e-01)); + r += mul(s3_8, M4(2.256e-02, 2.442e-02, -5.480e-03, -3.222e-02, 2.511e-02, -9.302e-02, -8.771e-02, 1.445e-01, 1.329e-02, 4.852e-02, 1.820e-02, -7.992e-02, 6.865e-02, -1.213e-01, -5.716e-02, 7.035e-03)); + r += mul(s4_0, M4(-4.963e-02, -1.699e-02, 6.164e-03, -7.748e-03, -3.923e-03, -4.458e-02, -7.514e-02, 8.713e-03, 1.502e-01, -6.000e-02, -1.562e-02, -3.699e-02, -3.769e-02, -3.684e-02, 3.194e-02, -1.316e-02)); + r += mul(s4_1, M4(-5.813e-03, -1.652e-02, -1.160e-01, 2.473e-02, -1.542e-02, 1.090e-01, 9.416e-02, -7.546e-02, -8.721e-02, -1.016e-01, 2.455e-02, 1.760e-01, -1.113e-02, -2.072e-02, -4.201e-02, 1.097e-01)); + r += mul(s4_2, M4(-8.947e-02, -2.912e-02, -1.152e-01, 5.044e-03, -5.288e-02, 9.921e-03, -2.049e-03, -8.057e-02, 3.600e-02, 1.285e-02, -3.229e-02, -4.312e-02, -3.473e-02, -4.958e-02, 6.987e-02, -1.037e-03)); + r += mul(s4_3, M4(-7.642e-02, -7.968e-02, -9.396e-02, -6.916e-02, -4.851e-02, -2.054e-02, 1.220e-02, 2.135e-02, 5.939e-02, -5.235e-02, -2.498e-02, -3.225e-02, -5.900e-02, -1.074e-01, -2.890e-02, 7.450e-02)); + r += mul(s4_4, M4(-2.375e-01, -8.494e-03, -5.648e-02, -3.120e-04, -1.023e-02, -1.651e-02, -5.311e-02, -2.120e-02, -7.515e-02, 1.600e-01, 3.359e-02, -3.815e-02, 5.274e-02, 5.381e-03, -4.513e-03, 6.992e-03)); + r += mul(s4_5, M4(2.012e-02, 2.432e-02, -1.255e-01, 9.230e-02, 3.945e-03, -8.647e-03, 5.221e-02, 5.038e-02, 2.594e-02, -5.321e-02, 1.549e-01, -5.618e-02, 6.376e-02, -1.068e-02, 3.395e-02, 7.709e-02)); + r += mul(s4_6, M4(-9.253e-02, 3.873e-02, -6.516e-02, -3.406e-02, 7.811e-02, 3.248e-02, -3.646e-02, -9.657e-02, 4.082e-02, -2.504e-02, -3.095e-02, -5.005e-02, 2.961e-02, -1.038e-02, 4.306e-02, -9.953e-02)); + r += mul(s4_7, M4(5.463e-02, 1.190e-02, 1.297e-02, 5.601e-02, -3.863e-02, 1.963e-04, -6.829e-03, 6.013e-03, -3.543e-03, -3.119e-02, -6.587e-02, 7.723e-02, -1.266e-02, 6.149e-02, -1.960e-02, -2.855e-02)); + r += mul(s4_8, M4(1.575e-01, 2.761e-02, -5.675e-02, -1.007e-01, -8.759e-02, -1.615e-02, -8.099e-02, -3.102e-02, 6.366e-02, 6.322e-02, -9.137e-02, 4.410e-02, -5.092e-02, 9.966e-02, -5.606e-02, -3.986e-02)); + r += mul(s5_0, M4(-4.827e-02, -2.112e-02, 1.171e-01, 2.011e-02, -6.445e-02, -6.014e-02, 1.968e-02, 5.059e-02, 2.412e-01, 3.018e-01, -1.182e-01, 3.469e-01, 4.179e-03, -1.971e-02, 8.742e-02, -2.170e-01)); + r += mul(s5_1, M4(2.099e-01, 3.944e-02, -5.078e-02, 8.941e-02, 2.386e-02, 1.028e-01, 8.036e-02, 3.725e-02, 5.418e-01, -3.762e-02, 1.630e-01, 5.946e-03, -1.113e-02, 1.548e-02, -6.941e-02, 2.013e-01)); + r += mul(s5_2, M4(-1.795e-02, -1.886e-02, -1.009e-01, -4.983e-02, 2.362e-02, 3.002e-05, -1.109e-01, 7.296e-02, 4.747e-02, 1.245e-01, -1.547e-01, -4.602e-02, -1.247e-01, -7.803e-02, 6.664e-02, 4.027e-02)); + r += mul(s5_3, M4(1.690e-01, -5.633e-02, 9.141e-03, 9.393e-02, 1.621e-01, -1.821e-01, 2.860e-02, 4.112e-02, -3.096e-01, -5.739e-02, -4.703e-02, -6.314e-02, -2.309e-01, 3.593e-01, -2.317e-01, -2.547e-01)); + r += mul(s5_4, M4(-1.832e-01, 4.333e-02, -7.308e-02, -1.365e-01, 2.838e-03, 6.438e-03, -1.606e-01, 2.236e-01, 8.184e-02, 1.572e-01, -1.139e-01, -1.861e-01, -1.266e-01, 2.496e-01, 4.770e-02, 2.003e-01)); + r += mul(s5_5, M4(8.375e-02, -2.241e-01, 7.085e-03, -2.314e-02, -7.755e-03, -4.227e-02, -5.664e-02, 1.815e-01, -2.513e-01, -4.317e-03, -5.752e-02, 4.155e-02, 2.129e-01, 1.094e-01, -8.033e-02, -4.873e-02)); + r += mul(s5_6, M4(-3.701e-03, 4.241e-02, -2.325e-02, 1.078e-01, 1.505e-01, 7.398e-02, -6.607e-02, -9.741e-02, -1.005e-01, 8.321e-03, -8.565e-02, 3.101e-02, -1.696e-01, 4.588e-02, -1.441e-02, -1.626e-01)); + r += mul(s5_7, M4(-7.378e-02, 8.560e-02, 6.674e-02, 5.409e-03, -6.194e-02, -5.892e-02, -4.005e-02, 1.344e-01, 2.073e-01, 5.668e-02, -1.387e-02, -3.150e-01, 8.191e-02, -6.871e-02, 5.037e-02, -1.086e-01)); + r += mul(s5_8, M4(-2.458e-03, -1.181e-01, -5.747e-02, 2.519e-02, 1.344e-02, 1.043e-01, -4.944e-02, 1.466e-01, -2.087e-01, -1.148e-01, -8.578e-02, 1.443e-01, -1.480e-01, 1.237e-01, -1.129e-01, -3.773e-02)); + r += mul(s6_0, M4(4.005e-02, -2.725e-02, -1.015e-02, -7.039e-02, 1.608e-01, -4.107e-02, -9.941e-03, 3.837e-02, 1.689e-01, -3.619e-03, -1.047e-01, -6.650e-02, -1.400e-02, -1.305e-01, 1.761e-02, -3.565e-02)); + r += mul(s6_1, M4(1.733e-01, 8.246e-02, 4.388e-02, -4.900e-02, -5.356e-02, 7.296e-03, -1.740e-02, -1.121e-01, 3.921e-03, -1.254e-01, 9.160e-02, -2.737e-03, 9.598e-02, -5.571e-02, 3.035e-02, -1.184e-01)); + r += mul(s6_2, M4(-1.958e-01, -1.807e-01, 4.089e-03, 6.421e-02, -3.751e-02, -4.583e-02, 5.623e-02, 1.439e-01, 2.941e-02, -4.083e-02, -7.173e-02, 1.034e-01, -1.830e-01, -3.674e-02, -2.433e-01, -1.585e-01)); + r += mul(s6_3, M4(5.681e-02, 9.114e-02, -5.818e-02, -1.150e-01, -2.396e-02, -5.568e-02, 2.690e-02, 4.784e-02, 2.844e-02, 7.175e-03, 2.195e-02, -1.767e-02, 1.565e-01, -2.681e-03, 3.860e-02, 1.748e-01)); + r += mul(s6_4, M4(-5.019e-02, -8.297e-02, -4.837e-02, -3.295e-02, 1.713e-01, -1.906e-02, -8.949e-02, 2.852e-02, -6.062e-02, -7.712e-02, 3.262e-02, 9.320e-02, -2.939e-02, -1.105e-01, -9.520e-02, 1.855e-01)); + r += mul(s6_5, M4(-1.230e-03, 4.906e-02, -3.178e-02, -9.381e-02, -1.184e-01, -1.199e-02, 9.639e-02, 2.335e-03, 1.050e-01, 8.792e-02, 3.049e-02, 1.773e-01, -4.611e-03, -1.566e-01, 1.912e-01, 1.975e-01)); + r += mul(s6_6, M4(-3.560e-02, 3.421e-02, 4.112e-02, 3.693e-03, 4.651e-02, -4.041e-02, 1.695e-02, -1.561e-02, 1.389e-02, -1.670e-02, 2.384e-02, -1.596e-01, 3.418e-01, -2.786e-01, -5.399e-02, -1.179e-01)); + r += mul(s6_7, M4(-3.193e-02, 6.029e-02, 7.003e-02, 1.943e-01, 4.110e-02, 2.286e-03, -7.037e-02, 4.680e-02, -2.689e-02, -7.342e-03, 3.395e-02, -5.840e-02, 1.831e-01, -2.382e-01, -2.290e-01, 2.881e-01)); + r += mul(s6_8, M4(6.764e-02, 6.010e-02, 3.488e-02, -6.655e-02, -1.382e-01, 7.262e-02, 1.931e-03, 5.726e-02, 2.771e-02, 1.279e-02, -5.664e-02, 2.941e-02, 3.236e-02, -6.130e-02, 7.286e-02, 1.960e-02)); + r += mul(s7_0, M4(1.140e-01, -9.028e-02, -7.418e-02, -3.781e-02, 8.795e-02, -1.327e-01, 2.363e-02, -3.158e-02, -1.305e-01, -2.282e-02, -7.596e-02, -1.521e-01, 5.714e-03, -2.941e-02, -1.806e-02, -4.892e-02)); + r += mul(s7_1, M4(6.662e-02, -1.102e-01, 1.024e-02, -1.127e-01, 2.631e-02, 1.655e-02, 9.290e-02, -2.096e-02, 4.017e-02, -1.329e-02, -1.061e-01, 1.428e-01, -2.756e-02, 5.955e-02, 5.337e-02, -2.459e-03)); + r += mul(s7_2, M4(-7.093e-02, -7.899e-02, -6.242e-02, 3.688e-02, 9.974e-02, 5.688e-02, 4.065e-02, 3.704e-03, -3.071e-02, -1.038e-02, -1.084e-02, -1.189e-01, 3.222e-02, 1.077e-02, -5.902e-02, -4.529e-02)); + r += mul(s7_3, M4(9.765e-03, -3.826e-02, -5.524e-03, -1.026e-02, 5.695e-02, 8.373e-02, 1.365e-01, -8.447e-02, -1.099e-01, -7.848e-02, 1.076e-01, -1.478e-01, 6.166e-02, 2.279e-02, 3.756e-03, 6.037e-02)); + r += mul(s7_4, M4(3.144e-02, -7.181e-02, -1.136e-01, 7.372e-02, -1.149e-02, 1.041e-01, 2.243e-01, 9.610e-02, 9.288e-02, 2.646e-02, 6.833e-02, -1.361e-01, 8.454e-02, -7.442e-02, -8.176e-02, 6.451e-02)); + r += mul(s7_5, M4(2.190e-02, 3.460e-02, 5.477e-02, 5.199e-03, 1.706e-01, -6.069e-02, 7.966e-02, 1.299e-01, 2.831e-02, 1.627e-01, -2.140e-02, -1.353e-01, -1.005e-01, 2.623e-02, -2.245e-02, -5.307e-02)); + r += mul(s7_6, M4(4.158e-02, 1.699e-03, -1.020e-02, -1.288e-02, 3.594e-02, 9.277e-02, 5.293e-03, -5.628e-02, 1.309e-02, -2.879e-03, -1.329e-02, -2.155e-01, 7.836e-03, 1.077e-02, -1.834e-04, -1.107e-01)); + r += mul(s7_7, M4(-1.636e-01, -1.068e-01, 6.692e-02, -2.375e-02, 5.312e-02, 1.139e-01, 5.986e-02, -1.624e-02, -3.511e-02, 1.058e-01, -1.126e-03, 4.797e-02, 9.381e-02, 8.404e-04, -1.213e-02, -3.095e-02)); + r += mul(s7_8, M4(-4.623e-02, -2.666e-02, -1.416e-03, 5.373e-02, 2.451e-02, -6.059e-02, -1.433e-02, -7.040e-02, -8.232e-02, 1.101e-01, 1.666e-03, -9.323e-02, -8.185e-02, -3.667e-02, 2.303e-02, 8.545e-02)); + r += V4(-7.571e-03, 5.112e-02, 3.188e-02, -3.901e-02); + return r; +} + +V4 f1(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-4.983e-02, 8.130e-02, -1.138e-02, 4.118e-02, 5.649e-03, -9.228e-03, -1.186e-02, -1.179e-02, 2.165e-01, -1.457e-02, 1.679e-01, -5.205e-02, 4.256e-02, -3.807e-02, -1.365e-01, 2.195e-01)); + r += mul(s0_1, M4(-1.686e-02, 9.503e-02, 1.076e-01, 1.273e-01, -8.605e-02, 9.071e-02, -7.611e-03, -8.845e-02, -1.404e-02, 2.858e-02, -5.158e-04, -1.584e-01, -2.366e-02, 5.117e-02, 1.026e-01, -8.642e-02)); + r += mul(s0_2, M4(-4.043e-02, 6.732e-02, 2.941e-02, -6.264e-02, 7.007e-02, -1.641e-02, -1.074e-01, 4.130e-02, 1.209e-01, -5.749e-02, 6.632e-02, -4.021e-02, 6.562e-03, 1.650e-02, 2.568e-02, -6.852e-02)); + r += mul(s0_3, M4(1.294e-02, 4.328e-02, -4.724e-02, -5.972e-02, -1.507e-02, 2.535e-02, 2.248e-01, -6.332e-03, 1.194e-01, -2.328e-02, 5.724e-03, 2.047e-02, 6.483e-02, 1.967e-01, 2.347e-01, -1.109e-01)); + r += mul(s0_4, M4(8.289e-02, 2.530e-01, -1.704e-01, 1.225e-01, -8.388e-02, 8.772e-03, -8.346e-02, 5.466e-03, 4.914e-02, 1.743e-01, 6.609e-02, 2.067e-02, -1.537e-01, 2.375e-01, -2.492e-02, 7.719e-02)); + r += mul(s0_5, M4(7.153e-02, 6.322e-02, -5.479e-02, 7.153e-02, 2.188e-02, -9.131e-03, -3.086e-02, 2.073e-02, 2.361e-02, 9.672e-04, -1.130e-01, 7.425e-02, 2.527e-02, 8.043e-02, -9.048e-02, 8.426e-02)); + r += mul(s0_6, M4(1.098e-01, 2.966e-03, 1.052e-01, 5.585e-02, -6.872e-02, -1.584e-02, -5.762e-02, -1.458e-02, 2.922e-02, 2.922e-02, 9.750e-02, -1.465e-01, -4.324e-02, 2.296e-02, 3.301e-01, 1.642e-01)); + r += mul(s0_7, M4(2.132e-02, -1.219e-01, -1.895e-02, -1.970e-01, 8.192e-03, -4.112e-02, 8.180e-02, 1.796e-01, 7.669e-03, 9.340e-03, -3.267e-02, -1.316e-01, -1.190e-01, -3.573e-03, -3.089e-02, 5.706e-02)); + r += mul(s0_8, M4(-5.650e-02, 4.687e-03, 6.372e-02, 2.141e-02, 1.214e-02, -2.395e-02, 1.049e-02, 8.106e-03, 1.389e-01, -8.622e-02, -8.147e-03, 2.103e-02, -5.347e-03, -1.049e-01, 7.973e-02, 6.136e-02)); + r += mul(s1_0, M4(-7.653e-02, 3.994e-03, -5.756e-02, 2.404e-01, 1.302e-01, 5.167e-02, 2.087e-02, -5.515e-03, 7.363e-02, 2.574e-02, 1.132e-02, -9.038e-02, 3.098e-02, 3.781e-02, -1.340e-02, -2.394e-02)); + r += mul(s1_1, M4(-9.000e-03, 1.987e-01, 8.059e-02, 1.542e-01, -2.150e-01, -1.165e-02, -7.362e-02, 7.066e-02, 3.051e-02, 8.714e-02, -1.183e-01, 4.917e-02, -1.030e-01, 2.695e-03, -2.187e-02, -1.496e-01)); + r += mul(s1_2, M4(-9.477e-02, 2.519e-02, -8.799e-03, 1.311e-01, 6.297e-02, 3.574e-02, -5.792e-02, -1.065e-01, -1.605e-02, -3.194e-02, -3.883e-02, 3.980e-02, 2.591e-02, -5.805e-03, 1.617e-01, -1.757e-02)); + r += mul(s1_3, M4(-7.379e-02, 2.148e-02, -2.515e-01, 4.130e-02, 1.027e-01, -5.710e-02, -2.321e-02, -9.060e-02, -3.771e-03, -3.679e-02, 7.993e-02, 2.636e-02, 4.529e-02, -1.192e-01, -9.298e-02, 9.453e-02)); + r += mul(s1_4, M4(-1.416e-01, 3.067e-01, -1.597e-02, 6.555e-02, 7.348e-02, 6.710e-02, 1.118e-02, -3.230e-01, -1.052e-01, -5.553e-03, -4.233e-02, 1.119e-01, -1.417e-01, -4.051e-04, 7.640e-02, 1.348e-01)); + r += mul(s1_5, M4(1.876e-01, 7.973e-02, 6.309e-02, 1.341e-01, 1.048e-01, -1.145e-01, -4.912e-02, 1.186e-01, -4.735e-04, -8.400e-02, 5.898e-02, 1.145e-01, -3.536e-02, 3.478e-02, 3.221e-02, 2.792e-03)); + r += mul(s1_6, M4(7.400e-02, -1.982e-02, 1.309e-02, 7.803e-02, -1.180e-01, 5.490e-02, 3.897e-02, -1.823e-03, 1.359e-02, 7.597e-02, -4.269e-03, 5.470e-02, 1.117e-01, -6.178e-02, -1.678e-01, 1.173e-01)); + r += mul(s1_7, M4(5.562e-03, -1.539e-01, 1.129e-01, -1.149e-01, -1.811e-01, -1.305e-01, 7.671e-02, -8.567e-03, -5.196e-02, -8.907e-03, -1.275e-01, 1.491e-03, 8.662e-02, 1.298e-02, -2.805e-02, 3.214e-02)); + r += mul(s1_8, M4(6.226e-02, -9.723e-02, 1.803e-01, 8.396e-02, 4.782e-02, -3.540e-02, 2.286e-02, -2.551e-01, -3.612e-02, 1.695e-02, -3.034e-02, 3.821e-02, -2.678e-02, 1.757e-02, 4.701e-02, -2.584e-02)); + r += mul(s2_0, M4(4.271e-02, 1.435e-02, 2.132e-01, 1.766e-01, -1.605e-02, -4.804e-03, 1.161e-01, -5.321e-02, 6.169e-02, -3.735e-02, 1.685e-01, -1.118e-01, -1.765e-02, -1.293e-01, -7.445e-02, -1.613e-02)); + r += mul(s2_1, M4(1.435e-01, -1.773e-01, 1.688e-01, 1.635e-01, 1.118e-01, 2.187e-02, 2.361e-02, 2.987e-02, 3.904e-02, -5.927e-03, -1.409e-01, 2.267e-02, 8.298e-02, 5.953e-02, 7.070e-02, 5.210e-02)); + r += mul(s2_2, M4(7.118e-02, -2.985e-02, 3.018e-01, 2.618e-01, 2.843e-02, 2.776e-02, 1.730e-02, -2.799e-02, 3.650e-02, -4.304e-02, 2.567e-02, -6.747e-02, -1.003e-01, -5.359e-02, -1.348e-01, -1.880e-02)); + r += mul(s2_3, M4(-7.627e-02, -1.043e-01, 3.388e-02, 6.354e-02, 9.222e-02, 5.182e-02, 1.433e-01, -6.476e-02, -4.451e-02, 4.682e-02, 1.235e-01, 1.353e-01, -1.592e-01, 1.212e-02, 6.325e-03, 8.417e-02)); + r += mul(s2_4, M4(-1.529e-02, -2.805e-01, -7.125e-02, -1.981e-01, -7.305e-02, -1.251e-01, -1.964e-01, -6.126e-02, 2.572e-02, 1.607e-01, -6.845e-03, 1.296e-01, -5.740e-02, 9.053e-02, -4.555e-02, -8.953e-02)); + r += mul(s2_5, M4(-2.202e-01, -4.550e-03, 9.138e-03, 3.973e-02, 3.042e-02, 1.072e-02, -1.120e-01, -5.238e-02, -7.899e-02, -1.440e-01, 7.793e-03, 8.766e-03, -9.321e-02, 5.336e-02, 4.382e-02, -4.917e-02)); + r += mul(s2_6, M4(-5.794e-02, 5.949e-02, 5.868e-02, -1.305e-01, 9.007e-02, 2.468e-04, -1.032e-01, -8.668e-02, 1.054e-02, -9.556e-02, -2.210e-01, -6.770e-02, -2.962e-02, -5.007e-03, 8.031e-02, 4.016e-03)); + r += mul(s2_7, M4(-2.297e-01, -2.320e-02, -2.605e-01, 1.769e-01, 9.884e-03, -4.773e-02, -5.952e-02, 1.874e-01, -1.411e-02, -1.034e-01, 4.831e-02, -1.217e-02, 7.414e-03, -7.133e-02, 5.140e-02, 3.610e-02)); + r += mul(s2_8, M4(6.926e-02, -1.764e-02, 2.437e-02, -3.945e-02, -4.159e-02, -7.148e-04, -1.669e-01, 4.848e-02, 1.362e-02, -8.426e-02, 3.363e-02, -1.062e-01, 3.699e-02, -5.910e-02, -3.259e-02, -6.000e-02)); + r += mul(s3_0, M4(3.266e-02, -1.635e-02, -9.268e-03, -1.444e-02, -6.789e-02, -8.125e-02, -1.372e-01, -1.201e-01, -8.273e-02, -1.520e-02, -1.226e-01, 1.313e-01, 1.256e-01, 3.671e-02, -4.320e-02, 1.295e-01)); + r += mul(s3_1, M4(1.616e-01, -1.483e-01, 1.007e-02, -4.777e-02, 2.154e-03, -3.533e-02, 6.062e-02, 1.115e-01, -5.480e-02, 1.195e-01, 4.853e-02, 1.008e-02, 9.364e-02, -8.944e-02, 9.676e-02, 1.877e-01)); + r += mul(s3_2, M4(-5.110e-03, -7.102e-03, 4.880e-02, -5.596e-02, 3.291e-02, 2.714e-02, -2.460e-01, 9.288e-02, -1.284e-01, -6.344e-02, 5.529e-02, -7.398e-02, 6.091e-02, 5.879e-04, -8.177e-02, 2.660e-01)); + r += mul(s3_3, M4(1.075e-01, -2.717e-02, 8.766e-02, 3.620e-02, -7.465e-02, 9.704e-03, 8.892e-02, -4.939e-02, 7.569e-02, 7.576e-02, 2.762e-02, -6.882e-02, -2.166e-01, 1.711e-01, 2.567e-01, 1.157e-01)); + r += mul(s3_4, M4(5.295e-02, -1.808e-01, 6.740e-03, -3.125e-02, -1.375e-01, -7.829e-02, 1.252e-01, -5.333e-02, -1.218e-02, 1.515e-01, -5.023e-02, -3.915e-02, -1.488e-01, 1.708e-01, 1.073e-01, -1.787e-01)); + r += mul(s3_5, M4(-4.310e-02, 5.330e-04, 5.296e-02, 6.118e-02, 2.424e-03, -3.204e-02, -4.205e-02, 1.344e-01, -5.280e-02, -2.408e-02, 7.708e-03, -7.485e-02, 3.816e-02, 1.564e-01, -1.596e-01, -1.008e-01)); + r += mul(s3_6, M4(2.846e-02, 4.028e-04, 5.228e-02, 2.090e-02, -4.003e-02, 4.156e-02, -1.400e-02, -5.232e-02, 6.428e-02, -7.429e-02, -1.345e-01, -2.075e-02, 1.101e-01, 3.909e-02, 2.293e-02, -2.696e-02)); + r += mul(s3_7, M4(-1.517e-01, -4.912e-02, 7.853e-03, 8.566e-02, -2.849e-02, 7.938e-02, 1.102e-01, -6.195e-02, -1.233e-02, 3.340e-03, 7.615e-03, 1.410e-01, -1.641e-01, -5.606e-02, -4.188e-02, -1.104e-01)); + r += mul(s3_8, M4(9.102e-02, 1.308e-02, -7.194e-02, -4.243e-02, -1.015e-01, 6.016e-02, -1.065e-01, -2.126e-03, 4.485e-02, -1.344e-01, 1.097e-01, 1.222e-01, -1.174e-01, 5.216e-02, 3.645e-02, -8.502e-02)); + r += mul(s4_0, M4(3.162e-02, 2.047e-02, -8.768e-02, 7.178e-02, -4.136e-02, 1.451e-02, -2.009e-02, 8.590e-02, -3.504e-02, 7.200e-02, -6.707e-03, 4.850e-02, -1.159e-01, -6.577e-02, 2.659e-03, 3.697e-02)); + r += mul(s4_1, M4(-4.373e-02, -1.432e-02, -1.025e-01, 1.218e-01, 1.213e-01, -6.253e-02, 1.098e-01, -4.396e-02, -1.435e-01, -8.083e-02, -4.730e-02, 1.345e-02, 4.332e-03, -8.223e-02, 1.521e-01, 7.768e-03)); + r += mul(s4_2, M4(5.797e-02, -5.495e-02, -4.579e-02, 5.029e-02, -3.201e-02, 4.360e-02, -6.783e-02, 6.364e-02, -3.153e-02, 1.680e-02, -3.927e-02, 2.867e-03, -3.550e-02, -1.989e-02, -3.437e-02, 8.254e-03)); + r += mul(s4_3, M4(-5.274e-02, -6.960e-03, 4.422e-02, 6.757e-02, 1.767e-03, -1.234e-03, 1.035e-02, -1.149e-01, -1.261e-01, -9.945e-02, 6.946e-02, 1.117e-01, -3.838e-02, 4.983e-02, 1.507e-01, -9.068e-02)); + r += mul(s4_4, M4(2.547e-01, 2.034e-02, 9.511e-02, -1.113e-01, -3.309e-03, 2.511e-02, 8.591e-02, -9.586e-02, -1.905e-02, -3.965e-02, -6.569e-02, 1.327e-01, -3.292e-02, 6.606e-02, 1.077e-01, -7.837e-02)); + r += mul(s4_5, M4(3.427e-02, -6.044e-02, 9.947e-02, -2.948e-02, 1.903e-01, -8.142e-02, 7.408e-02, 8.765e-02, 1.294e-01, 2.937e-02, 1.490e-02, 1.741e-02, 8.611e-02, -2.960e-02, 1.621e-02, 7.118e-02)); + r += mul(s4_6, M4(7.072e-03, -3.489e-02, 1.474e-01, -6.758e-02, 8.396e-02, -1.278e-02, 1.239e-01, 1.219e-02, -4.617e-04, 2.750e-02, 3.367e-02, -1.125e-01, 4.128e-02, 3.849e-03, 1.559e-04, -9.764e-03)); + r += mul(s4_7, M4(6.998e-02, 5.240e-02, -6.551e-02, -1.124e-01, 4.662e-02, -5.076e-02, -4.813e-02, 3.977e-02, 2.835e-02, 9.788e-02, -1.083e-01, -9.348e-02, -7.555e-04, -9.514e-02, -1.318e-01, -6.260e-02)); + r += mul(s4_8, M4(-9.893e-02, 1.792e-02, 3.363e-02, -3.017e-02, -1.834e-02, 5.261e-02, -2.149e-02, 4.543e-02, 7.473e-02, 5.478e-02, -6.775e-04, -9.799e-02, -8.036e-03, -4.525e-02, -1.196e-01, -5.956e-02)); + r += mul(s5_0, M4(-7.606e-02, 1.697e-02, 3.356e-02, 8.496e-02, -4.369e-02, -4.666e-02, -4.516e-02, 1.232e-01, -1.148e-01, -4.079e-01, 6.891e-02, -1.204e-01, 6.006e-02, -7.587e-02, -3.940e-03, -8.972e-02)); + r += mul(s5_1, M4(-6.836e-02, 9.268e-02, 2.397e-02, 1.580e-01, 8.314e-02, -1.127e-01, -9.302e-02, -1.983e-02, -2.236e-01, -1.783e-01, 4.923e-02, -1.979e-01, -3.718e-02, -8.209e-02, -2.694e-01, -2.831e-01)); + r += mul(s5_2, M4(-1.496e-02, -1.074e-01, -1.865e-01, 3.621e-02, -7.354e-02, -3.669e-02, 1.025e-02, 1.348e-01, 7.306e-02, 3.492e-03, 1.151e-02, -2.423e-02, -1.517e-01, 1.229e-01, -9.210e-03, -3.804e-01)); + r += mul(s5_3, M4(-8.295e-02, -1.333e-02, -8.697e-03, 1.018e-01, -7.267e-02, 5.075e-03, -3.312e-02, -5.572e-02, 2.651e-02, 2.441e-01, 1.070e-01, -3.334e-01, -1.323e-01, -1.150e-01, -4.954e-02, 3.022e-02)); + r += mul(s5_4, M4(3.561e-01, -6.514e-03, -1.319e-01, -4.857e-02, -8.872e-02, -1.063e-01, 1.702e-01, 2.295e-02, -1.136e-01, -6.823e-03, -8.805e-02, 3.722e-01, -1.308e-01, -4.237e-02, -8.764e-02, -2.649e-01)); + r += mul(s5_5, M4(-1.473e-01, -3.242e-02, 3.013e-01, -2.271e-01, 1.636e-01, -1.054e-01, 1.489e-01, 1.410e-01, 1.229e-01, -1.184e-01, 1.967e-01, 1.486e-01, -1.744e-01, -3.491e-02, 2.146e-01, -1.210e-01)); + r += mul(s5_6, M4(-9.205e-02, -6.729e-02, 6.481e-02, 3.591e-02, 1.497e-01, -2.646e-02, -5.646e-02, 7.942e-02, -2.862e-01, -7.300e-02, 4.249e-01, -2.225e-01, 1.466e-02, -4.618e-02, 1.342e-01, -6.644e-02)); + r += mul(s5_7, M4(-2.634e-02, -8.729e-02, -1.921e-01, 5.986e-02, -1.045e-01, -1.319e-01, -3.851e-02, -1.897e-02, 4.674e-02, -2.551e-01, -3.060e-01, -3.126e-02, 1.321e-01, 1.323e-03, 1.625e-01, -1.780e-01)); + r += mul(s5_8, M4(3.455e-02, -9.137e-02, -3.155e-02, 1.371e-01, 1.961e-02, -4.806e-02, 2.904e-02, 1.206e-01, -1.439e-01, 4.326e-02, 2.013e-01, -1.088e-01, 1.038e-01, 5.389e-02, -1.012e-01, -1.293e-01)); + r += mul(s6_0, M4(2.883e-02, 6.336e-02, -1.109e-01, 4.430e-02, -2.181e-03, -1.027e-02, 3.495e-02, 3.424e-02, 6.241e-02, 9.888e-02, 1.465e-01, 8.500e-03, -1.464e-02, 1.196e-01, 3.633e-02, 2.138e-02)); + r += mul(s6_1, M4(-7.511e-02, -1.257e-01, -9.774e-03, -2.211e-02, 2.084e-02, -7.529e-02, 3.955e-02, -1.850e-02, -7.271e-02, -9.222e-02, -5.359e-02, 9.605e-02, 1.401e-01, -2.953e-02, -7.327e-02, 2.252e-01)); + r += mul(s6_2, M4(-1.618e-01, 3.175e-02, -2.588e-02, -4.267e-02, 6.425e-02, -4.883e-02, -7.712e-03, 2.210e-02, 4.166e-02, -2.958e-02, -5.538e-02, 8.871e-02, -1.667e-02, 7.975e-02, -1.422e-01, -1.361e-01)); + r += mul(s6_3, M4(3.054e-02, 2.819e-02, -5.269e-02, 7.123e-02, -6.542e-03, -5.129e-02, 6.952e-02, -6.234e-02, 3.632e-02, 4.244e-02, 1.470e-02, -5.504e-02, -1.515e-01, -5.525e-02, 9.169e-02, 1.957e-01)); + r += mul(s6_4, M4(1.392e-01, 3.304e-02, 6.401e-03, -1.179e-01, 1.116e-01, 1.009e-01, -7.350e-02, -7.339e-02, -9.488e-02, -9.942e-02, 4.254e-02, -1.008e-03, 5.917e-01, -1.942e-01, 3.094e-02, 2.252e-01)); + r += mul(s6_5, M4(-1.635e-01, 8.334e-02, -1.226e-01, -1.008e-01, 7.124e-02, -3.881e-02, 4.288e-02, 1.904e-02, 7.209e-02, -1.087e-03, -2.940e-02, -5.550e-02, 2.476e-02, -1.826e-01, -2.270e-02, -6.354e-02)); + r += mul(s6_6, M4(-1.222e-02, 7.961e-02, 1.913e-01, 1.164e-01, -1.009e-01, -8.551e-03, -4.957e-02, 1.115e-01, -3.098e-02, 2.290e-02, 2.158e-02, 2.287e-02, -5.155e-02, -5.953e-02, -5.373e-01, 1.594e-01)); + r += mul(s6_7, M4(-8.832e-02, 1.443e-01, -7.009e-02, -1.701e-02, 1.220e-01, -2.167e-02, 7.703e-02, 7.268e-03, -2.231e-02, -8.895e-03, -4.785e-02, -1.486e-02, 4.795e-01, 1.363e-01, -2.954e-01, -6.300e-02)); + r += mul(s6_8, M4(-2.199e-03, 1.266e-01, -1.642e-02, -3.579e-01, -3.643e-02, -9.964e-02, -1.666e-02, 3.015e-02, 6.638e-03, 2.863e-02, -7.006e-03, 7.253e-03, 2.145e-01, 1.449e-01, -9.513e-02, -1.265e-02)); + r += mul(s7_0, M4(-3.209e-02, 4.605e-02, 1.079e-01, 1.989e-02, -5.784e-02, 5.088e-02, -1.273e-01, 1.108e-01, 3.986e-02, -6.515e-03, 1.124e-01, 6.504e-02, -7.102e-02, 8.049e-02, -3.219e-02, 2.202e-02)); + r += mul(s7_1, M4(3.292e-03, -1.202e-01, 3.605e-02, 7.924e-02, -1.870e-01, 6.843e-02, -1.121e-01, 1.240e-01, -1.255e-01, -5.002e-02, 5.503e-02, -3.135e-02, -3.943e-02, -2.022e-02, -2.647e-02, -6.932e-02)); + r += mul(s7_2, M4(-1.361e-01, 2.581e-02, -3.699e-02, -5.262e-02, -4.777e-02, -1.642e-02, 2.150e-02, -1.078e-02, -8.589e-03, -1.309e-02, -2.344e-01, -1.915e-01, -4.557e-03, 4.928e-02, -3.167e-02, -7.839e-02)); + r += mul(s7_3, M4(-9.894e-02, 5.377e-03, -6.016e-02, -6.025e-03, 9.087e-02, -1.221e-01, -3.059e-02, -4.253e-02, 4.615e-02, 6.281e-02, 5.827e-02, -9.779e-02, 9.307e-03, -4.204e-02, -1.247e-02, 1.284e-03)); + r += mul(s7_4, M4(8.887e-03, -1.019e-01, 4.785e-02, 2.651e-02, -8.583e-02, 7.502e-03, 3.123e-02, 2.588e-01, -1.680e-02, -2.212e-01, 1.478e-01, -1.283e-01, 1.045e-01, 5.040e-02, 8.075e-02, -9.190e-02)); + r += mul(s7_5, M4(-8.777e-02, 1.522e-02, 1.612e-01, 1.873e-02, -6.293e-03, 4.181e-02, 6.272e-02, 8.647e-02, 1.739e-01, 4.823e-02, 5.520e-02, -1.238e-01, 3.481e-02, 2.858e-03, -4.327e-02, -2.633e-02)); + r += mul(s7_6, M4(-1.609e-03, -9.164e-02, -8.422e-04, -1.272e-02, 6.570e-02, 7.809e-02, -7.719e-02, -4.676e-02, 1.452e-02, 1.919e-02, -3.864e-02, -3.212e-02, 1.593e-02, -8.736e-02, 2.733e-03, 1.538e-01)); + r += mul(s7_7, M4(-9.294e-02, -1.275e-01, -1.928e-02, 1.771e-01, 1.928e-01, -1.129e-01, 3.681e-02, 9.247e-02, 1.539e-01, -1.166e-02, 6.051e-03, -2.803e-03, 1.723e-02, -4.953e-02, -1.479e-01, 8.169e-02)); + r += mul(s7_8, M4(2.105e-03, -1.920e-02, 1.970e-01, -1.863e-02, 7.787e-02, 7.357e-02, 1.981e-02, -4.003e-02, 5.348e-02, -7.818e-02, 1.926e-01, 6.939e-02, -5.906e-02, -4.222e-02, 1.214e-01, -6.501e-02)); + r += V4(9.425e-03, -6.502e-03, -1.215e-02, -4.379e-03); + return r; +} + +V4 f2(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(1.030e-01, 5.180e-02, -6.760e-02, 6.079e-02, -2.889e-02, -1.103e-01, 2.358e-03, -1.889e-02, -7.512e-02, 2.994e-02, -3.116e-02, -1.178e-01, 1.637e-02, 5.190e-02, -4.271e-02, -3.379e-02)); + r += mul(s0_1, M4(1.105e-01, -1.012e-01, -6.958e-02, -1.877e-01, 2.586e-02, 1.008e-02, 1.192e-01, 3.894e-02, 3.049e-02, -1.959e-02, -7.397e-02, 5.311e-02, 1.822e-02, 1.226e-01, 5.007e-02, 1.588e-01)); + r += mul(s0_2, M4(-1.353e-01, 6.049e-02, 7.127e-02, 3.606e-02, -2.965e-02, 3.285e-02, -2.194e-02, -5.989e-02, 4.794e-02, -1.144e-01, -6.334e-02, -1.359e-01, 6.982e-02, -4.216e-02, -8.722e-02, 1.876e-01)); + r += mul(s0_3, M4(1.121e-01, 6.245e-02, -4.799e-02, -7.511e-02, -1.780e-01, -2.139e-02, -7.060e-02, -1.224e-01, 1.616e-01, -1.183e-01, 1.730e-02, 1.742e-01, 1.555e-01, -8.945e-03, 1.938e-01, -1.454e-01)); + r += mul(s0_4, M4(-1.167e-01, -4.252e-03, -1.382e-01, -2.507e-02, 1.098e-01, -4.058e-02, -3.589e-02, -3.798e-02, -3.234e-02, -1.313e-01, 7.806e-02, -8.148e-02, 6.749e-03, 6.031e-02, 1.802e-01, -7.930e-02)); + r += mul(s0_5, M4(1.668e-02, 1.406e-01, 4.683e-02, 8.918e-03, 4.626e-02, 1.492e-01, -6.812e-02, 5.677e-03, -1.095e-01, -7.690e-02, 2.882e-02, 1.502e-01, -5.098e-02, 1.111e-01, 1.075e-02, -8.344e-02)); + r += mul(s0_6, M4(-1.359e-02, -1.378e-02, 1.096e-01, -1.421e-02, -5.066e-02, -4.940e-02, 4.683e-02, 5.285e-02, 2.956e-02, 7.916e-02, -4.273e-02, -2.343e-01, -2.529e-01, 1.738e-01, 2.344e-02, -2.723e-02)); + r += mul(s0_7, M4(1.619e-02, -5.444e-02, 1.244e-01, 2.961e-02, 1.911e-02, 3.931e-02, 1.964e-02, 2.953e-02, 3.841e-02, 3.794e-02, 9.847e-02, -1.168e-02, 1.175e-01, 2.568e-01, 1.892e-01, 1.959e-01)); + r += mul(s0_8, M4(8.046e-03, -8.461e-02, 8.705e-02, 7.092e-02, -4.998e-02, -8.167e-02, 8.622e-02, 7.721e-02, -3.905e-02, -1.948e-01, 1.263e-01, -7.006e-02, -9.074e-02, -5.137e-02, -1.423e-01, -1.055e-01)); + r += mul(s1_0, M4(2.037e-01, -4.134e-02, 1.431e-03, -8.682e-02, 8.096e-02, -4.626e-02, -4.857e-02, 4.149e-02, -9.669e-02, 5.387e-02, 1.704e-01, 6.811e-02, 1.236e-01, -6.518e-02, -3.237e-02, 8.485e-04)); + r += mul(s1_1, M4(2.443e-01, -3.109e-02, -5.216e-02, -1.151e-02, -1.877e-02, 4.912e-02, -1.501e-02, -8.259e-02, 9.409e-02, 3.537e-02, -5.657e-02, -1.651e-02, 3.525e-02, 2.796e-03, -8.593e-02, -3.281e-02)); + r += mul(s1_2, M4(-2.203e-01, 6.307e-02, 2.666e-01, 6.146e-02, -1.000e-01, 1.418e-01, 1.547e-02, 2.503e-01, 1.396e-01, -1.719e-02, 9.498e-02, 8.809e-02, 4.643e-02, -2.165e-03, -2.136e-02, 7.491e-02)); + r += mul(s1_3, M4(1.313e-01, -2.397e-01, -1.541e-01, -9.527e-02, -1.657e-01, 4.067e-03, 3.172e-02, 6.652e-03, -3.691e-02, -4.660e-02, -1.886e-02, 1.112e-02, 8.538e-03, 7.209e-02, -5.522e-02, 1.420e-02)); + r += mul(s1_4, M4(-8.042e-02, -6.499e-02, 7.468e-02, 2.530e-01, -2.417e-01, -9.201e-02, 5.306e-02, -2.171e-01, 9.399e-02, 2.275e-02, -1.106e-01, -4.740e-02, -8.718e-02, -9.990e-02, 4.451e-02, 9.443e-02)); + r += mul(s1_5, M4(-5.618e-02, 3.624e-02, 2.160e-01, 2.765e-02, 9.392e-02, -4.092e-02, 1.667e-02, 1.583e-01, -1.460e-01, 2.101e-01, -6.971e-02, 8.168e-02, 3.349e-02, 6.209e-02, 7.637e-02, -1.209e-03)); + r += mul(s1_6, M4(-7.459e-02, 9.316e-02, 1.352e-02, -5.870e-02, 8.489e-03, 1.144e-01, 3.504e-02, -1.692e-01, 9.801e-02, -4.062e-02, -7.359e-02, 7.979e-02, -5.365e-02, -1.372e-01, 9.992e-03, -1.625e-01)); + r += mul(s1_7, M4(-2.180e-02, 1.464e-01, 3.081e-01, 9.825e-02, -6.650e-03, 3.962e-02, 8.037e-03, -2.993e-01, -1.635e-02, 9.104e-02, -2.753e-02, -2.897e-02, -8.581e-02, -2.014e-02, 3.952e-03, 5.674e-02)); + r += mul(s1_8, M4(-1.155e-01, -1.423e-02, 1.558e-01, -9.508e-02, -4.453e-03, 9.155e-02, 8.825e-02, -2.214e-01, 4.655e-02, 1.176e-03, 9.797e-03, 1.354e-01, -8.679e-02, 1.240e-02, 2.236e-02, -1.652e-01)); + r += mul(s2_0, M4(-1.724e-01, -9.182e-03, -2.293e-01, 2.517e-01, -8.243e-03, 4.365e-02, -2.093e-02, -1.078e-02, 2.551e-02, -3.522e-02, -6.930e-02, 2.232e-01, -1.114e-01, 1.489e-02, 1.974e-02, -7.529e-02)); + r += mul(s2_1, M4(-7.519e-02, -3.149e-02, -8.839e-02, 1.913e-02, 5.915e-02, 6.902e-02, -2.554e-02, -1.764e-01, 7.881e-02, 8.444e-03, -9.908e-02, 1.643e-02, -1.592e-02, 9.464e-02, 9.421e-03, -1.186e-01)); + r += mul(s2_2, M4(-8.639e-02, -1.400e-01, -1.564e-01, -2.477e-02, 1.336e-01, 1.401e-01, 2.463e-02, -1.280e-01, 1.352e-01, -7.146e-02, -1.183e-01, 1.704e-01, -3.626e-02, -3.917e-02, -6.329e-02, -7.060e-02)); + r += mul(s2_3, M4(-2.485e-02, 1.315e-01, 2.486e-02, 1.226e-02, 1.236e-01, -5.331e-02, 4.234e-02, 1.228e-01, -1.372e-01, -5.923e-02, -2.059e-01, -1.074e-01, -1.556e-02, 1.669e-02, 3.191e-02, 1.972e-02)); + r += mul(s2_4, M4(1.913e-01, -8.388e-02, 2.797e-02, 1.087e-01, 1.333e-01, -2.377e-01, -1.375e-01, -1.833e-01, -8.198e-02, -1.642e-01, -2.019e-01, -1.915e-01, 5.206e-02, -3.148e-02, -7.719e-02, 1.506e-01)); + r += mul(s2_5, M4(-2.432e-01, 7.371e-02, 8.178e-02, -1.324e-01, -6.953e-02, 7.647e-02, 1.093e-02, -3.195e-02, -1.536e-01, -9.011e-02, 1.355e-01, -2.528e-02, 5.627e-02, -1.369e-02, -1.940e-02, -1.594e-02)); + r += mul(s2_6, M4(-6.367e-02, 4.086e-02, 1.115e-01, 1.332e-01, -6.442e-02, 9.489e-03, 5.163e-02, 4.962e-02, -4.676e-02, 6.107e-02, 9.852e-04, -8.369e-02, -2.810e-02, 7.742e-02, 1.460e-02, -5.245e-02)); + r += mul(s2_7, M4(2.499e-02, 9.525e-02, -1.504e-01, -4.846e-02, -1.431e-01, 6.899e-02, -2.462e-02, 1.607e-01, -4.203e-02, -6.801e-02, 8.834e-02, -1.126e-01, 9.556e-02, 6.370e-02, 5.367e-02, 9.592e-03)); + r += mul(s2_8, M4(-3.189e-02, -8.031e-03, -2.310e-02, -6.561e-02, -6.205e-02, -3.060e-02, 1.363e-01, -2.286e-03, 5.340e-03, 5.857e-02, 1.316e-01, 1.853e-01, -7.457e-02, -7.660e-02, 3.847e-02, -4.925e-02)); + r += mul(s3_0, M4(-1.402e-01, 3.435e-02, -1.059e-01, 6.012e-02, -1.999e-01, -8.057e-02, 2.603e-02, 1.750e-01, 9.291e-02, 1.118e-02, -1.018e-01, 1.539e-01, -9.788e-02, -1.960e-02, 1.499e-02, 2.258e-01)); + r += mul(s3_1, M4(-7.307e-03, 1.649e-01, 2.268e-02, -3.546e-02, 2.505e-02, -7.354e-02, -3.064e-02, 1.181e-01, 6.936e-02, 1.284e-01, 5.474e-02, 1.417e-01, -1.496e-01, 6.069e-02, 1.271e-01, 1.387e-01)); + r += mul(s3_2, M4(3.283e-02, -1.561e-01, -5.818e-02, -1.495e-02, 1.001e-01, -1.087e-01, 8.460e-04, 1.990e-01, -1.162e-01, -2.836e-02, 5.896e-03, 9.634e-02, 9.890e-02, 2.249e-01, -5.960e-02, 6.524e-02)); + r += mul(s3_3, M4(6.081e-02, 1.426e-02, 1.743e-01, -1.444e-01, -3.796e-02, -6.453e-02, -1.042e-01, 1.164e-03, -7.472e-02, 5.873e-02, -8.279e-02, -6.472e-02, -2.282e-01, 3.751e-02, -9.872e-02, 2.167e-01)); + r += mul(s3_4, M4(1.067e-01, 3.005e-02, 9.707e-02, 2.358e-02, 1.526e-01, 7.697e-02, -1.288e-01, -2.510e-01, 6.505e-02, -1.854e-03, -2.127e-02, -6.822e-03, -1.081e-02, -1.770e-01, -2.613e-02, -1.239e-01)); + r += mul(s3_5, M4(-7.202e-02, -8.924e-02, 7.588e-02, -5.286e-03, 6.626e-02, 3.781e-02, 7.665e-02, 2.771e-02, 1.221e-02, 1.257e-01, -7.619e-02, 2.011e-02, 2.040e-01, 1.483e-01, -2.693e-02, 5.554e-02)); + r += mul(s3_6, M4(1.010e-02, 1.521e-02, 2.979e-02, -2.894e-02, -3.475e-02, 5.665e-02, 8.026e-03, 5.070e-02, -9.067e-02, 7.642e-02, 2.394e-02, 3.811e-02, 3.641e-02, 2.143e-02, 2.236e-01, 2.299e-02)); + r += mul(s3_7, M4(3.547e-02, 1.399e-02, 6.926e-04, 4.710e-02, -1.626e-01, 1.325e-02, -2.253e-02, 2.237e-01, -8.841e-02, 8.182e-02, 3.332e-03, 1.174e-01, 2.193e-01, -6.652e-02, -2.395e-01, -1.140e-01)); + r += mul(s3_8, M4(-4.354e-02, -9.374e-03, 3.428e-02, 7.002e-03, 3.499e-02, 5.109e-02, 1.783e-02, -2.013e-02, 7.523e-02, -2.629e-02, 6.597e-02, 5.925e-02, -1.579e-01, -2.344e-02, 2.092e-03, -1.340e-01)); + r += mul(s4_0, M4(-1.014e-02, 4.065e-03, 6.117e-02, 8.470e-02, -1.956e-01, -5.316e-02, -8.530e-02, 4.568e-02, 5.893e-02, -1.609e-02, -1.872e-02, 1.529e-01, 6.092e-02, -3.838e-02, -8.225e-02, -1.279e-03)); + r += mul(s4_1, M4(-2.075e-01, -2.361e-02, 3.200e-02, 1.327e-02, -7.797e-02, 7.097e-03, 5.049e-02, -8.874e-02, 1.309e-02, -6.570e-02, 8.799e-02, -7.405e-02, -4.478e-02, -1.109e-02, 7.107e-02, 7.869e-02)); + r += mul(s4_2, M4(-1.392e-02, 1.512e-01, 4.739e-02, 2.017e-02, 2.974e-02, -1.291e-01, 9.301e-02, 6.238e-02, 2.105e-02, 1.060e-02, 3.152e-02, 2.685e-02, -5.795e-02, -2.800e-02, -4.912e-03, -8.161e-02)); + r += mul(s4_3, M4(-5.809e-02, -5.480e-02, 5.728e-02, -4.076e-02, -1.091e-01, -1.717e-01, 7.309e-03, 6.975e-02, -2.645e-02, 9.944e-02, -5.127e-02, -9.457e-02, -1.426e-02, -8.327e-02, -7.884e-02, -1.611e-02)); + r += mul(s4_4, M4(9.950e-02, -7.039e-02, 4.891e-02, -3.545e-02, -5.392e-02, 8.991e-02, -5.298e-02, -3.121e-03, 2.157e-02, -8.715e-02, 5.429e-03, -5.276e-02, 1.285e-02, 1.285e-02, -1.142e-01, -5.807e-02)); + r += mul(s4_5, M4(4.575e-02, 7.011e-02, -3.673e-02, -1.608e-01, -3.663e-03, -5.043e-03, -6.263e-03, -2.703e-02, 7.943e-02, -5.537e-03, 5.793e-02, -4.219e-02, -6.355e-02, 6.953e-02, 8.290e-02, 7.658e-02)); + r += mul(s4_6, M4(7.795e-02, -7.372e-02, 6.093e-03, 1.056e-02, -2.125e-02, 8.681e-02, 3.893e-02, -7.483e-02, 5.271e-02, 2.211e-02, 9.069e-02, 1.073e-01, -8.662e-03, -5.212e-03, 2.982e-02, -5.739e-03)); + r += mul(s4_7, M4(-1.717e-02, 2.283e-02, -3.941e-02, 4.109e-03, 8.527e-02, 1.001e-01, 1.846e-02, -1.255e-01, 2.752e-02, 3.294e-02, 2.106e-02, -5.608e-02, 8.715e-03, -1.594e-02, 5.878e-02, -1.700e-02)); + r += mul(s4_8, M4(-1.026e-02, 1.383e-02, 7.065e-02, -1.091e-01, 3.015e-02, 4.376e-02, -4.114e-03, -1.954e-01, 2.104e-02, 1.412e-02, 4.828e-02, -6.711e-02, -3.568e-02, -8.016e-02, 3.111e-02, -4.615e-02)); + r += mul(s5_0, M4(4.547e-02, 7.190e-02, -3.506e-02, -4.392e-02, -6.403e-02, -1.067e-01, 4.684e-02, -1.001e-01, 1.809e-01, -1.215e-01, -6.191e-01, 1.910e-01, 1.988e-02, -7.828e-02, 3.948e-02, -9.714e-02)); + r += mul(s5_1, M4(-9.265e-02, -2.044e-01, 2.601e-03, 1.321e-01, 4.113e-02, 5.837e-02, -4.895e-02, -3.625e-01, -3.132e-02, 3.531e-01, -2.826e-01, -3.891e-01, -5.710e-02, 2.568e-01, 9.742e-02, -5.672e-03)); + r += mul(s5_2, M4(-1.338e-02, -1.515e-01, -1.535e-02, 2.606e-01, -1.096e-01, -4.259e-02, 8.187e-02, 1.577e-01, 2.463e-02, -5.034e-02, -1.115e-02, -4.038e-02, -1.086e-01, -1.483e-02, 1.037e-01, -1.948e-01)); + r += mul(s5_3, M4(-1.922e-02, -6.215e-02, 1.517e-02, 1.218e-01, -3.071e-02, 1.773e-02, -3.607e-02, 1.047e-01, -2.256e-02, -9.207e-02, -3.169e-02, -1.181e-01, 2.580e-01, -3.072e-01, -1.991e-01, 3.262e-01)); + r += mul(s5_4, M4(1.372e-01, -1.362e-01, 1.134e-02, 2.881e-01, 8.171e-02, 1.333e-01, -1.464e-01, 2.722e-02, 1.081e-01, 3.382e-02, -3.378e-01, -3.254e-01, -2.377e-02, -4.981e-02, -2.661e-01, -2.726e-01)); + r += mul(s5_5, M4(8.029e-02, -2.610e-03, -5.205e-02, -1.134e-01, -2.463e-03, -2.045e-02, -4.503e-02, -4.423e-02, -1.089e-02, 1.997e-02, -1.041e-01, -1.421e-01, 5.208e-03, -1.065e-01, -1.208e-01, 1.845e-02)); + r += mul(s5_6, M4(6.110e-02, 5.042e-02, -7.398e-02, -1.530e-01, -6.443e-02, 9.451e-02, 1.408e-02, 8.396e-02, -5.996e-03, -6.634e-02, -2.270e-01, 8.724e-02, 1.584e-01, 1.196e-02, -1.147e-01, -2.780e-02)); + r += mul(s5_7, M4(-3.316e-02, 9.211e-02, -4.164e-02, -5.648e-02, 9.994e-02, -7.862e-02, -8.656e-02, -2.388e-01, 3.321e-02, 7.988e-02, -7.226e-02, -1.103e-01, -1.496e-01, 3.867e-01, 2.678e-01, -1.186e-01)); + r += mul(s5_8, M4(-7.234e-02, -7.924e-02, 1.794e-01, 2.319e-02, 7.658e-02, 4.797e-02, 1.451e-01, 2.210e-02, 5.900e-02, 1.386e-01, -1.373e-01, 7.030e-02, 5.726e-02, 1.062e-01, 5.655e-02, 7.951e-02)); + r += mul(s6_0, M4(-1.131e-01, -3.577e-02, 1.421e-01, -3.580e-02, 6.043e-02, 6.665e-02, -1.767e-02, -1.889e-02, -9.003e-02, 3.426e-02, -2.185e-02, 6.045e-02, -4.273e-03, 1.100e-01, 2.061e-01, 7.638e-02)); + r += mul(s6_1, M4(-1.003e-01, -4.393e-02, -1.226e-01, -1.006e-01, -1.930e-02, 4.019e-02, 4.542e-02, 1.739e-01, 2.843e-02, -9.876e-03, 3.212e-02, 7.995e-02, 6.001e-02, -2.006e-01, 8.412e-02, -1.438e-01)); + r += mul(s6_2, M4(1.870e-01, 6.808e-03, 3.708e-02, 1.286e-01, 5.755e-02, -3.608e-02, -4.639e-02, 3.624e-02, 2.504e-03, 1.275e-01, -1.453e-02, 4.201e-02, -1.102e-01, 2.665e-02, 2.633e-01, -2.948e-01)); + r += mul(s6_3, M4(-8.279e-02, 1.014e-01, 2.264e-01, 2.429e-01, 1.484e-02, 4.490e-02, 4.040e-02, -8.325e-02, 4.054e-02, -3.042e-03, 6.527e-02, -4.170e-02, -1.438e-01, 6.808e-02, -9.250e-02, -2.674e-01)); + r += mul(s6_4, M4(2.200e-01, -3.817e-02, 8.343e-02, 7.486e-02, -3.402e-01, -1.026e-01, -1.268e-02, -8.661e-03, 7.670e-02, -1.422e-01, 3.638e-02, 2.780e-03, 2.017e-01, 2.283e-01, -1.223e-01, -1.577e-01)); + r += mul(s6_5, M4(-3.965e-02, 1.235e-01, 2.024e-01, 2.421e-01, 7.390e-02, -9.736e-02, 5.491e-02, -1.747e-02, -8.821e-02, 3.791e-02, -3.107e-02, -1.047e-01, 2.079e-01, -4.630e-01, 7.189e-02, 1.396e-01)); + r += mul(s6_6, M4(5.692e-02, 8.449e-02, 8.547e-02, -2.314e-02, -9.132e-02, 4.575e-02, -2.234e-02, -9.140e-02, 1.246e-02, 5.259e-02, -5.461e-02, -2.873e-02, 5.578e-03, 6.954e-02, -5.065e-02, -5.574e-02)); + r += mul(s6_7, M4(1.269e-01, 4.871e-02, 9.764e-02, 5.221e-02, 3.510e-02, 3.839e-02, 4.264e-02, 1.651e-01, -2.245e-02, 3.480e-02, -2.074e-02, -1.590e-01, -1.197e-01, -1.028e-01, 3.397e-01, -1.966e-01)); + r += mul(s6_8, M4(-1.619e-02, -2.535e-02, 5.190e-02, 1.855e-02, -5.307e-02, -1.313e-01, 8.308e-02, -5.597e-02, 1.891e-02, 7.614e-02, -5.868e-02, -4.543e-02, -1.567e-01, 1.922e-01, 1.221e-01, -4.377e-02)); + r += mul(s7_0, M4(1.028e-01, 7.548e-03, -1.111e-01, -4.530e-02, 7.687e-02, -2.370e-03, 9.737e-02, 6.218e-02, -8.472e-02, -4.753e-03, -1.759e-02, 7.301e-02, -6.980e-02, -5.817e-02, 2.753e-02, 3.833e-03)); + r += mul(s7_1, M4(9.802e-02, -1.691e-03, -1.026e-01, -1.141e-01, 4.108e-02, 1.704e-02, 5.610e-02, -7.644e-02, 1.787e-02, -2.503e-01, 3.689e-02, 5.876e-02, -5.987e-02, -7.223e-02, 1.370e-02, 5.564e-03)); + r += mul(s7_2, M4(1.022e-01, -1.052e-02, 1.894e-02, -5.264e-03, 4.457e-02, 1.206e-01, 4.648e-02, 8.187e-02, 5.019e-02, -7.684e-02, -4.761e-02, 3.577e-02, 6.005e-03, 3.018e-02, -6.777e-03, -2.671e-02)); + r += mul(s7_3, M4(7.466e-02, -5.545e-02, 5.147e-02, -9.105e-02, 1.714e-01, 3.147e-02, -7.164e-02, 1.448e-01, -1.964e-01, 4.534e-02, -1.009e-01, -1.424e-01, -1.958e-01, -1.056e-01, -7.003e-02, -1.141e-02)); + r += mul(s7_4, M4(6.642e-02, -4.793e-02, 9.713e-02, -1.437e-01, -2.930e-03, 1.499e-02, -1.431e-01, -8.737e-02, 4.347e-03, -2.981e-01, 1.137e-01, 1.970e-01, -2.402e-02, 5.391e-03, -4.417e-02, 1.113e-01)); + r += mul(s7_5, M4(9.509e-02, -7.006e-02, 4.524e-02, 9.689e-02, 1.099e-01, 6.772e-02, -4.856e-02, 2.939e-01, -1.818e-02, -5.436e-02, -1.028e-01, 1.111e-01, 7.046e-02, -7.240e-02, 1.357e-03, -4.907e-02)); + r += mul(s7_6, M4(-1.812e-02, -1.753e-02, -5.269e-02, -8.065e-02, 3.366e-02, -1.626e-02, -5.052e-02, -1.878e-02, -3.922e-02, 1.056e-01, -6.507e-02, -5.286e-02, 8.207e-02, 5.148e-02, 7.783e-02, 1.681e-02)); + r += mul(s7_7, M4(3.352e-02, -6.558e-02, -3.283e-02, 1.152e-02, -1.507e-02, 5.144e-02, 3.858e-02, -1.565e-01, 1.527e-01, -9.508e-02, 1.196e-02, -1.377e-01, 1.485e-02, 2.016e-01, -3.342e-02, -4.941e-02)); + r += mul(s7_8, M4(2.321e-02, 6.616e-02, -4.715e-02, -1.106e-01, 7.326e-02, 1.498e-01, 7.544e-02, 1.409e-01, 3.549e-02, 8.089e-02, -5.649e-02, -1.224e-01, 1.137e-01, -1.970e-02, -8.010e-02, 1.944e-01)); + r += V4(-6.752e-03, -7.566e-03, 6.314e-03, 1.825e-02); + return r; +} + +V4 f3(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-2.717e-02, 9.769e-03, 9.986e-02, -9.887e-02, 3.267e-02, 1.003e-02, 1.651e-03, -1.743e-01, 8.331e-02, 3.077e-01, -2.175e-02, 1.084e-02, -1.637e-01, 1.951e-01, 6.243e-02, -1.436e-01)); + r += mul(s0_1, M4(6.098e-02, -4.669e-02, -5.103e-02, 5.120e-02, -6.543e-02, 9.551e-02, -1.651e-01, 8.219e-03, -8.131e-02, 1.417e-01, 5.506e-02, -6.124e-03, -2.257e-02, 2.200e-01, 3.792e-02, -1.043e-01)); + r += mul(s0_2, M4(-1.397e-02, 7.591e-02, -1.604e-01, -1.153e-01, -1.530e-01, 1.447e-01, 1.756e-02, 1.792e-02, 1.607e-01, -1.341e-01, 1.823e-01, 5.549e-02, 1.516e-01, 1.876e-01, 2.927e-02, -1.047e-01)); + r += mul(s0_3, M4(-3.772e-02, 1.171e-01, 4.045e-03, 2.626e-02, -4.379e-02, 1.676e-02, 1.781e-01, -2.848e-02, 1.034e-01, 9.025e-02, 1.324e-01, -9.010e-02, -1.003e-01, 1.520e-01, -2.431e-01, -8.147e-02)); + r += mul(s0_4, M4(2.643e-02, -7.991e-02, 3.294e-02, -1.099e-01, 9.339e-02, 3.811e-02, -6.230e-02, 1.012e-01, 6.919e-02, 1.717e-01, 3.213e-02, -1.369e-01, -1.733e-01, -2.811e-01, -1.270e-01, -1.960e-01)); + r += mul(s0_5, M4(-1.091e-01, -6.180e-02, -2.301e-02, 8.213e-04, 9.512e-02, -3.803e-02, -1.084e-02, 1.420e-01, -1.947e-02, 2.276e-01, -6.797e-02, -9.134e-02, -2.017e-02, -1.052e-01, -4.217e-02, 2.666e-01)); + r += mul(s0_6, M4(-5.222e-02, 4.017e-02, 7.455e-02, 2.275e-02, -2.500e-02, 8.089e-02, -4.076e-02, -4.002e-02, -8.283e-02, 2.970e-01, 1.390e-01, -7.048e-02, 2.858e-02, -1.936e-01, 1.580e-01, -8.027e-03)); + r += mul(s0_7, M4(5.542e-02, 2.002e-02, -2.675e-02, 1.503e-02, -1.431e-01, -2.823e-02, 8.154e-03, -1.270e-01, 1.633e-03, -1.870e-01, -2.306e-01, -7.430e-02, 5.849e-02, 1.180e-02, 2.341e-02, 2.886e-01)); + r += mul(s0_8, M4(-8.929e-02, 1.351e-01, 7.252e-02, 2.595e-02, -7.732e-02, -8.429e-02, -1.554e-01, -1.018e-01, 9.823e-03, 2.202e-01, 1.353e-02, 7.901e-04, 3.251e-02, -1.569e-01, 1.351e-01, 2.692e-01)); + r += mul(s1_0, M4(-8.562e-02, 8.848e-02, 2.261e-01, -1.160e-01, 2.243e-02, -6.960e-02, -2.434e-02, 1.238e-01, -5.562e-02, 2.180e-02, -8.743e-02, 2.182e-02, 8.208e-02, 9.049e-02, -6.469e-02, 7.688e-03)); + r += mul(s1_1, M4(1.996e-01, 3.454e-02, 2.105e-01, 2.091e-01, -6.999e-02, -9.015e-02, 4.232e-02, 5.711e-02, -1.312e-01, -3.303e-02, -1.230e-01, 2.519e-02, 1.419e-02, -6.896e-02, 2.025e-02, 6.401e-02)); + r += mul(s1_2, M4(-9.447e-02, 8.105e-02, -1.036e-01, -1.588e-01, 1.464e-01, -9.827e-02, 8.542e-02, -2.070e-02, -6.366e-03, 1.370e-01, -7.298e-02, -1.725e-02, 1.101e-01, 2.035e-02, -9.348e-02, -7.200e-02)); + r += mul(s1_3, M4(1.109e-02, 1.264e-01, -1.209e-01, -1.554e-01, -1.159e-01, -1.892e-01, 5.685e-02, 8.991e-02, 1.312e-01, 5.569e-02, 1.933e-01, 7.793e-02, 1.109e-01, 5.463e-02, -1.602e-03, -1.379e-01)); + r += mul(s1_4, M4(5.509e-02, -1.017e-01, 8.452e-02, -1.655e-01, -9.169e-03, -1.362e-01, -1.786e-01, -5.513e-02, -6.821e-04, -8.778e-02, 5.897e-02, -5.619e-02, -5.489e-02, -4.180e-02, 4.755e-03, -3.080e-03)); + r += mul(s1_5, M4(-1.489e-01, -5.831e-02, -1.427e-01, -1.644e-01, 1.730e-02, 1.156e-03, 2.227e-02, 1.556e-01, -4.279e-02, -3.060e-02, -1.932e-02, -4.620e-02, -1.522e-02, -2.339e-02, 9.479e-02, 2.281e-02)); + r += mul(s1_6, M4(-8.987e-02, 1.801e-01, 1.497e-01, -2.205e-02, 1.658e-01, 2.336e-01, -1.755e-01, 1.293e-01, -2.428e-02, 1.084e-01, 3.095e-02, 1.159e-01, -1.136e-01, 1.618e-01, -1.261e-01, -7.645e-02)); + r += mul(s1_7, M4(-2.607e-02, -1.290e-01, -1.531e-02, -9.560e-02, -9.710e-02, -7.514e-02, -8.585e-02, -1.072e-01, 1.509e-01, -2.000e-01, -8.177e-02, 6.025e-02, -2.661e-03, -9.347e-03, -5.421e-02, 1.047e-01)); + r += mul(s1_8, M4(-1.385e-01, 1.662e-01, 5.869e-02, -2.730e-02, -6.720e-02, -2.388e-01, -6.281e-02, -3.390e-01, 7.931e-03, 9.052e-02, -1.473e-02, -4.222e-02, -3.454e-02, 2.653e-02, -6.030e-02, 4.434e-02)); + r += mul(s2_0, M4(-1.198e-01, 5.241e-02, 6.661e-02, 1.784e-01, -5.096e-02, -1.366e-01, 2.038e-02, 2.957e-02, -1.052e-02, -2.031e-01, -4.690e-02, -2.149e-01, 2.957e-02, -2.198e-02, -5.177e-02, -3.467e-02)); + r += mul(s2_1, M4(4.485e-02, 6.809e-02, 1.478e-01, -2.134e-01, 1.127e-01, 3.646e-02, -8.540e-02, -7.599e-02, -1.459e-01, -1.487e-01, -1.248e-01, 2.611e-01, -6.606e-02, 2.024e-01, 1.783e-02, -1.899e-02)); + r += mul(s2_2, M4(1.640e-02, -3.178e-02, -1.399e-01, -3.473e-02, 1.110e-02, 1.010e-01, -1.280e-01, -2.861e-02, -4.956e-02, -1.929e-01, -5.167e-02, 3.184e-02, -1.111e-01, 2.306e-02, 1.435e-01, -9.536e-02)); + r += mul(s2_3, M4(-5.429e-02, 1.061e-02, -4.774e-01, 2.036e-02, -1.635e-02, 6.595e-02, -3.063e-02, 7.685e-02, -1.179e-01, -1.091e-01, 3.535e-02, 1.078e-01, -6.447e-02, -1.197e-01, 1.170e-01, 2.519e-02)); + r += mul(s2_4, M4(-2.047e-02, 2.278e-02, -7.021e-02, 1.275e-01, -1.218e-01, -1.286e-01, -1.497e-01, -7.172e-02, 4.386e-02, -6.259e-02, -7.381e-02, -2.430e-01, 7.806e-02, -7.124e-02, 1.390e-02, 2.018e-01)); + r += mul(s2_5, M4(-1.143e-01, 1.832e-02, -1.345e-01, 1.271e-01, -3.451e-02, -3.570e-03, 7.250e-02, 9.202e-02, 9.418e-02, -1.007e-01, 1.772e-01, 1.791e-01, -2.399e-02, 7.251e-02, -6.399e-02, -4.066e-02)); + r += mul(s2_6, M4(1.195e-02, 3.455e-02, -9.223e-02, 7.473e-02, -4.358e-02, -5.941e-02, 4.774e-02, 2.804e-02, 1.101e-01, -1.979e-01, -2.947e-02, -7.232e-02, -1.633e-02, -9.952e-03, 9.117e-02, -1.100e-01)); + r += mul(s2_7, M4(1.648e-01, -1.768e-01, -3.981e-02, -5.506e-02, -3.355e-03, -1.699e-02, 6.906e-02, -3.916e-02, 4.472e-02, -1.261e-01, 9.100e-02, -1.264e-01, -2.708e-02, -1.563e-01, -3.189e-02, 1.403e-01)); + r += mul(s2_8, M4(-1.306e-01, 1.916e-02, -2.621e-01, -2.006e-03, 3.518e-02, 1.125e-01, -1.299e-02, -9.027e-02, 2.894e-02, -2.493e-01, -2.424e-02, -8.538e-03, -3.670e-02, -4.606e-02, -1.190e-01, 1.236e-02)); + r += mul(s3_0, M4(2.467e-02, 1.228e-01, 1.307e-03, 2.644e-02, -1.061e-01, -2.063e-01, -1.047e-01, -4.946e-02, -6.557e-02, 3.756e-02, 1.079e-02, 4.868e-02, 7.785e-02, -2.759e-03, -1.427e-01, 1.646e-01)); + r += mul(s3_1, M4(4.235e-02, 1.720e-01, 1.786e-02, -9.564e-02, -8.153e-02, -1.325e-02, -2.990e-01, -2.348e-02, -5.725e-02, 7.600e-02, 8.733e-02, 9.938e-02, -7.687e-02, 2.715e-01, -2.000e-02, -1.306e-01)); + r += mul(s3_2, M4(-2.426e-02, -6.496e-02, 1.602e-02, -5.793e-02, -1.478e-01, -1.127e-01, 4.043e-02, -7.110e-02, 5.491e-02, -6.065e-02, 2.713e-02, -3.371e-03, -4.914e-02, 2.346e-02, -4.165e-02, -2.006e-01)); + r += mul(s3_3, M4(-1.237e-01, 1.560e-02, -1.648e-02, 2.805e-02, 1.293e-01, -2.959e-02, 1.850e-01, 1.106e-01, -9.726e-02, 6.985e-02, 4.132e-02, 2.229e-01, -9.818e-02, -2.129e-02, -5.933e-02, 3.006e-01)); + r += mul(s3_4, M4(-1.240e-01, -1.789e-02, 1.252e-02, 1.278e-01, 4.614e-02, 5.781e-02, 1.586e-01, -5.546e-02, 1.474e-01, -1.586e-01, -3.989e-02, -3.110e-02, -2.245e-01, 1.206e-01, 3.395e-01, 3.636e-02)); + r += mul(s3_5, M4(1.174e-01, 1.871e-01, 5.915e-02, 9.390e-03, 2.787e-02, 1.518e-01, 2.257e-01, 9.543e-02, -1.490e-01, -9.546e-02, -8.699e-02, 6.155e-03, 1.305e-01, 1.351e-02, -1.750e-01, 7.539e-02)); + r += mul(s3_6, M4(-1.004e-01, 1.196e-01, 3.374e-02, -2.762e-02, 3.960e-02, -7.232e-02, 8.549e-02, -1.199e-01, 4.529e-02, -1.194e-01, -1.098e-01, 3.108e-02, -6.552e-02, -4.890e-02, -7.023e-02, -1.666e-01)); + r += mul(s3_7, M4(2.712e-02, -6.507e-02, 4.040e-02, -1.978e-02, -2.940e-02, -1.641e-01, 1.689e-01, 1.310e-02, 1.428e-01, 7.349e-02, 5.750e-02, -4.696e-02, -1.200e-01, -1.444e-01, 1.115e-01, -1.165e-01)); + r += mul(s3_8, M4(-9.200e-02, -5.976e-03, -7.335e-02, -2.183e-02, 1.265e-01, 6.324e-03, 1.261e-02, -4.413e-02, 8.816e-02, -1.475e-01, 2.062e-02, 5.278e-02, 1.811e-01, -7.741e-02, -2.011e-01, -4.065e-02)); + r += mul(s4_0, M4(-1.153e-02, -9.074e-03, -5.989e-02, -2.584e-03, -5.218e-02, 7.476e-02, -8.211e-03, 4.237e-02, -6.923e-02, -1.856e-02, 1.326e-02, -5.366e-02, -2.938e-03, -6.377e-02, -1.163e-01, -1.680e-01)); + r += mul(s4_1, M4(-9.843e-02, 6.010e-02, -2.105e-03, 6.071e-03, 5.479e-02, -3.386e-03, -1.102e-02, -4.528e-02, -1.727e-02, 4.790e-02, 2.434e-02, -7.955e-02, -3.570e-02, -4.003e-02, 1.576e-02, 9.249e-03)); + r += mul(s4_2, M4(-8.375e-02, 5.498e-02, 1.497e-01, -4.453e-02, -5.135e-02, 1.353e-01, -6.536e-02, -1.258e-01, -9.036e-02, -5.740e-02, 1.372e-01, 8.847e-02, 5.655e-02, -7.369e-02, -4.204e-02, 7.450e-02)); + r += mul(s4_3, M4(2.723e-03, -4.919e-02, -1.869e-02, 6.287e-03, 6.744e-02, 3.939e-02, 4.791e-02, -2.436e-02, 9.017e-05, 5.233e-02, 1.542e-02, -3.984e-02, -6.053e-02, 1.544e-02, 1.268e-01, -1.184e-01)); + r += mul(s4_4, M4(-2.181e-01, -7.282e-02, -1.797e-02, -4.704e-03, 2.914e-02, -4.503e-02, -1.223e-01, -3.956e-02, -1.158e-01, -1.896e-02, -2.473e-02, 4.600e-02, 2.196e-02, 1.015e-01, -5.597e-02, 4.143e-02)); + r += mul(s4_5, M4(-5.904e-02, 2.190e-02, 7.496e-02, 1.693e-01, -4.697e-02, -2.332e-02, 1.691e-01, 2.206e-02, 4.138e-02, -5.012e-02, 1.875e-02, 1.281e-01, 3.007e-02, 3.105e-02, 3.457e-02, -6.314e-02)); + r += mul(s4_6, M4(-4.867e-02, 6.212e-03, 3.773e-02, 2.992e-02, 8.184e-02, -1.817e-02, 1.572e-01, -2.633e-02, 5.866e-02, 3.204e-02, 7.714e-03, -2.036e-01, -4.740e-02, -1.816e-02, 1.361e-01, -1.599e-02)); + r += mul(s4_7, M4(1.790e-01, 4.099e-02, 4.671e-02, -1.282e-01, 1.517e-01, 9.965e-02, 9.696e-03, -3.455e-02, 1.063e-01, 9.338e-02, 1.373e-01, -2.089e-02, 1.111e-02, 5.577e-02, 2.652e-02, 5.652e-02)); + r += mul(s4_8, M4(1.772e-02, 6.870e-02, -4.726e-02, 6.538e-02, 4.101e-02, 4.077e-02, 8.750e-02, 4.385e-02, 1.588e-02, 1.211e-02, -3.037e-02, 3.300e-02, -1.147e-01, -9.400e-02, -1.073e-01, -4.589e-02)); + r += mul(s5_0, M4(-7.043e-02, 1.106e-01, 5.424e-02, -2.076e-01, -2.114e-02, -6.736e-03, -1.078e-01, 2.016e-01, 1.544e-01, 1.365e-01, 2.181e-01, -1.275e-02, 7.327e-03, 3.924e-02, -1.393e-01, -2.110e-01)); + r += mul(s5_1, M4(-1.034e-01, 1.045e-02, 1.199e-01, -9.829e-02, 9.394e-02, -1.407e-01, -1.636e-01, -2.472e-03, 1.985e-01, 5.539e-02, 2.328e-01, -2.959e-01, -7.821e-02, 2.372e-01, 3.268e-01, -1.386e-01)); + r += mul(s5_2, M4(7.605e-02, 1.772e-01, 8.793e-02, 4.894e-02, -2.980e-02, -1.566e-02, -1.525e-01, -1.220e-02, 3.103e-02, 1.313e-01, 2.984e-01, 2.059e-01, -4.579e-02, 1.324e-01, -4.685e-02, 1.377e-01)); + r += mul(s5_3, M4(8.444e-02, -7.072e-02, -8.838e-02, -1.174e-01, 1.293e-01, -5.982e-02, 4.509e-02, 5.332e-03, -5.717e-03, -7.399e-02, -3.717e-02, -6.773e-02, 9.809e-03, -1.349e-01, -4.095e-02, -4.058e-02)); + r += mul(s5_4, M4(-1.147e-01, -1.989e-02, 2.123e-01, -1.439e-01, -5.222e-03, -2.707e-01, -1.859e-01, -8.678e-02, 3.698e-01, -1.723e-01, -4.526e-01, -2.236e-01, -5.285e-02, 2.418e-01, 1.577e-01, -1.008e-01)); + r += mul(s5_5, M4(-1.191e-02, -3.442e-02, 1.354e-01, -5.484e-02, -9.487e-02, -2.576e-01, 6.984e-02, 1.090e-01, 1.431e-01, 2.262e-01, 2.292e-01, 2.876e-01, -1.843e-01, -2.636e-01, 9.564e-03, -3.201e-01)); + r += mul(s5_6, M4(-3.639e-02, 3.560e-02, 5.691e-02, 1.310e-01, 7.157e-02, -2.525e-02, 6.015e-02, 2.008e-01, 2.294e-01, -6.681e-02, 1.624e-01, -2.359e-01, 2.105e-01, 1.970e-01, 8.391e-03, 2.562e-01)); + r += mul(s5_7, M4(1.713e-01, 1.372e-01, 2.792e-02, -3.161e-02, 1.123e-01, -3.285e-02, -8.937e-02, 2.190e-02, 1.601e-01, -4.079e-02, -1.160e-01, 3.078e-02, 3.789e-02, -1.248e-02, -4.555e-01, -5.014e-02)); + r += mul(s5_8, M4(3.548e-02, -1.643e-02, -2.761e-02, 1.177e-01, 7.889e-02, 4.827e-03, 1.050e-02, 1.173e-01, 7.210e-02, -2.071e-01, -1.656e-01, -5.126e-02, -1.370e-01, -2.145e-02, -4.849e-01, 2.399e-01)); + r += mul(s6_0, M4(-5.271e-02, -4.056e-02, -1.902e-02, 9.367e-02, 1.910e-01, 8.001e-02, -1.315e-01, -5.283e-02, 5.967e-02, -1.328e-02, -1.207e-01, 5.678e-02, 1.117e-01, 8.106e-02, -1.247e-01, -5.059e-02)); + r += mul(s6_1, M4(-1.485e-01, -5.026e-03, -2.219e-02, -3.135e-02, 1.374e-01, 1.129e-01, -1.310e-01, -8.498e-02, -1.109e-02, -2.860e-02, -5.555e-02, 1.483e-02, -1.202e-01, 7.081e-02, -1.195e-02, 2.183e-01)); + r += mul(s6_2, M4(-3.599e-02, 1.129e-01, -2.252e-02, -3.895e-02, -1.965e-02, -8.345e-02, -2.432e-02, -3.539e-02, -4.661e-02, -4.581e-02, 6.963e-02, -6.548e-03, -1.589e-01, 4.702e-02, -9.506e-02, 8.096e-02)); + r += mul(s6_3, M4(9.022e-03, 7.867e-02, 4.089e-02, -1.734e-01, -2.731e-04, -1.261e-02, -1.128e-01, -4.965e-02, -6.452e-03, 2.955e-02, 1.457e-01, 5.475e-02, -1.956e-01, -2.854e-04, 1.397e-01, 4.013e-01)); + r += mul(s6_4, M4(-7.334e-02, -3.460e-02, 1.664e-01, -5.664e-03, 3.891e-01, 9.504e-02, 7.005e-02, -5.228e-02, -9.434e-02, -1.497e-01, 1.776e-01, -2.187e-02, -2.030e-01, 4.712e-01, 4.174e-01, 1.477e-01)); + r += mul(s6_5, M4(4.229e-02, 6.727e-02, -1.072e-01, 1.023e-02, 2.305e-01, -2.663e-02, -5.938e-02, 2.253e-02, 1.888e-01, -1.715e-01, -3.109e-02, -2.876e-02, 9.730e-02, 1.614e-01, 4.309e-02, -1.132e-02)); + r += mul(s6_6, M4(-4.604e-02, 1.801e-01, 1.316e-01, 2.310e-01, -7.241e-02, 1.791e-02, 2.261e-01, -1.032e-03, -8.607e-02, 1.205e-02, 1.081e-01, -1.049e-01, -3.676e-01, 1.789e-01, -2.022e-01, 4.011e-01)); + r += mul(s6_7, M4(-3.995e-02, 1.906e-01, 1.376e-01, 9.652e-02, -4.697e-02, 1.448e-02, -1.473e-02, -2.965e-02, -4.528e-02, -9.930e-02, 2.797e-03, 3.674e-02, -4.603e-01, -3.507e-01, 2.416e-01, -3.515e-01)); + r += mul(s6_8, M4(-7.833e-02, 9.354e-02, -3.600e-02, 5.854e-02, 1.679e-01, -5.118e-02, 3.355e-02, 3.831e-02, -1.616e-03, -8.032e-02, 1.246e-01, -1.168e-01, -2.178e-01, -3.155e-01, 8.497e-02, 9.947e-02)); + r += mul(s7_0, M4(1.317e-02, 6.127e-02, -1.356e-01, -1.334e-01, -1.430e-01, -9.201e-02, -6.164e-02, 9.808e-02, 1.071e-01, -1.024e-01, -2.085e-01, 3.279e-02, -1.141e-01, -9.217e-02, 3.365e-02, -2.446e-02)); + r += mul(s7_1, M4(1.214e-01, -1.052e-01, 3.639e-02, -7.164e-02, -1.102e-01, 8.978e-02, -5.414e-02, 2.847e-02, -6.224e-02, 2.982e-02, -4.916e-02, -6.726e-02, 1.001e-01, 2.355e-03, -3.565e-02, 5.170e-02)); + r += mul(s7_2, M4(-7.410e-02, -4.689e-02, -1.308e-02, -7.921e-03, 6.083e-02, -4.359e-02, 1.145e-01, 4.113e-02, -4.052e-02, 3.164e-02, 1.010e-01, 2.453e-02, 5.970e-02, 3.461e-02, 4.648e-02, -2.663e-04)); + r += mul(s7_3, M4(-1.003e-01, 2.135e-02, -1.455e-01, 5.218e-02, -2.309e-01, 6.783e-02, 1.318e-02, -1.827e-01, 1.621e-01, 5.029e-02, -7.106e-02, 1.621e-01, 1.541e-02, 1.652e-02, 2.895e-02, 1.683e-01)); + r += mul(s7_4, M4(-1.522e-01, -3.963e-04, 3.581e-03, -2.834e-02, -3.330e-01, 1.078e-01, 1.278e-01, -2.416e-02, 2.028e-01, 2.793e-01, 3.217e-01, 1.514e-01, -1.400e-01, -1.050e-02, -6.733e-02, 5.471e-02)); + r += mul(s7_5, M4(1.353e-01, 4.765e-02, -1.027e-01, 1.058e-01, -6.736e-02, 5.301e-02, -5.598e-02, 6.322e-02, 1.928e-03, 1.496e-01, 3.799e-02, -3.298e-02, 5.269e-02, 1.571e-01, -9.930e-02, -1.330e-01)); + r += mul(s7_6, M4(-8.066e-03, -5.750e-02, 2.862e-02, -3.012e-02, -1.507e-01, 1.030e-01, 6.889e-02, -3.722e-02, 4.417e-02, 2.836e-02, -1.419e-01, 1.423e-01, 4.511e-02, -3.572e-02, -3.069e-02, -8.108e-03)); + r += mul(s7_7, M4(4.494e-02, 5.384e-02, -3.370e-02, -2.500e-02, -2.476e-01, -4.991e-03, -2.138e-03, -2.498e-02, -1.399e-01, 1.500e-02, -6.577e-02, 7.640e-02, 1.067e-01, -7.990e-02, 2.787e-02, 2.408e-03)); + r += mul(s7_8, M4(-3.526e-02, -2.719e-02, 5.664e-02, -7.852e-02, -4.183e-02, 1.072e-01, -8.091e-02, 5.822e-02, 1.535e-01, -3.325e-02, 1.665e-01, 4.851e-03, 3.232e-03, 1.497e-01, 2.886e-02, -5.168e-02)); + r += V4(-1.078e-02, 4.187e-02, -7.080e-03, 1.714e-02); + return r; +} + +void Pass8(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = Rmp8x8(tid.x) + blockStart; + uint2 size = GetInputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = (gxy + 0.5) * pt; + + V4 s0_0 = l0(-1.0, -1.0); + V4 s0_1 = l0(0.0, -1.0); + V4 s0_2 = l0(1.0, -1.0); + V4 s0_3 = l0(-1.0, 0.0); + V4 s0_4 = l0(0.0, 0.0); + V4 s0_5 = l0(1.0, 0.0); + V4 s0_6 = l0(-1.0, 1.0); + V4 s0_7 = l0(0.0, 1.0); + V4 s0_8 = l0(1.0, 1.0); + V4 s1_0 = -max(-s0_0, 0.0); + V4 s1_1 = -max(-s0_1, 0.0); + V4 s1_2 = -max(-s0_2, 0.0); + V4 s1_3 = -max(-s0_3, 0.0); + V4 s1_4 = -max(-s0_4, 0.0); + V4 s1_5 = -max(-s0_5, 0.0); + V4 s1_6 = -max(-s0_6, 0.0); + V4 s1_7 = -max(-s0_7, 0.0); + V4 s1_8 = -max(-s0_8, 0.0); + s0_0 = max(s0_0, 0.0); + s0_1 = max(s0_1, 0.0); + s0_2 = max(s0_2, 0.0); + s0_3 = max(s0_3, 0.0); + s0_4 = max(s0_4, 0.0); + s0_5 = max(s0_5, 0.0); + s0_6 = max(s0_6, 0.0); + s0_7 = max(s0_7, 0.0); + s0_8 = max(s0_8, 0.0); + + V4 s2_0 = l1(-1.0, -1.0); + V4 s2_1 = l1(0.0, -1.0); + V4 s2_2 = l1(1.0, -1.0); + V4 s2_3 = l1(-1.0, 0.0); + V4 s2_4 = l1(0.0, 0.0); + V4 s2_5 = l1(1.0, 0.0); + V4 s2_6 = l1(-1.0, 1.0); + V4 s2_7 = l1(0.0, 1.0); + V4 s2_8 = l1(1.0, 1.0); + V4 s3_0 = -max(-s2_0, 0.0); + V4 s3_1 = -max(-s2_1, 0.0); + V4 s3_2 = -max(-s2_2, 0.0); + V4 s3_3 = -max(-s2_3, 0.0); + V4 s3_4 = -max(-s2_4, 0.0); + V4 s3_5 = -max(-s2_5, 0.0); + V4 s3_6 = -max(-s2_6, 0.0); + V4 s3_7 = -max(-s2_7, 0.0); + V4 s3_8 = -max(-s2_8, 0.0); + s2_0 = max(s2_0, 0.0); + s2_1 = max(s2_1, 0.0); + s2_2 = max(s2_2, 0.0); + s2_3 = max(s2_3, 0.0); + s2_4 = max(s2_4, 0.0); + s2_5 = max(s2_5, 0.0); + s2_6 = max(s2_6, 0.0); + s2_7 = max(s2_7, 0.0); + s2_8 = max(s2_8, 0.0); + + V4 s4_0 = l2(-1.0, -1.0); + V4 s4_1 = l2(0.0, -1.0); + V4 s4_2 = l2(1.0, -1.0); + V4 s4_3 = l2(-1.0, 0.0); + V4 s4_4 = l2(0.0, 0.0); + V4 s4_5 = l2(1.0, 0.0); + V4 s4_6 = l2(-1.0, 1.0); + V4 s4_7 = l2(0.0, 1.0); + V4 s4_8 = l2(1.0, 1.0); + V4 s5_0 = -max(-s4_0, 0.0); + V4 s5_1 = -max(-s4_1, 0.0); + V4 s5_2 = -max(-s4_2, 0.0); + V4 s5_3 = -max(-s4_3, 0.0); + V4 s5_4 = -max(-s4_4, 0.0); + V4 s5_5 = -max(-s4_5, 0.0); + V4 s5_6 = -max(-s4_6, 0.0); + V4 s5_7 = -max(-s4_7, 0.0); + V4 s5_8 = -max(-s4_8, 0.0); + s4_0 = max(s4_0, 0.0); + s4_1 = max(s4_1, 0.0); + s4_2 = max(s4_2, 0.0); + s4_3 = max(s4_3, 0.0); + s4_4 = max(s4_4, 0.0); + s4_5 = max(s4_5, 0.0); + s4_6 = max(s4_6, 0.0); + s4_7 = max(s4_7, 0.0); + s4_8 = max(s4_8, 0.0); + + V4 s6_0 = l3(-1.0, -1.0); + V4 s6_1 = l3(0.0, -1.0); + V4 s6_2 = l3(1.0, -1.0); + V4 s6_3 = l3(-1.0, 0.0); + V4 s6_4 = l3(0.0, 0.0); + V4 s6_5 = l3(1.0, 0.0); + V4 s6_6 = l3(-1.0, 1.0); + V4 s6_7 = l3(0.0, 1.0); + V4 s6_8 = l3(1.0, 1.0); + V4 s7_0 = -max(-s6_0, 0.0); + V4 s7_1 = -max(-s6_1, 0.0); + V4 s7_2 = -max(-s6_2, 0.0); + V4 s7_3 = -max(-s6_3, 0.0); + V4 s7_4 = -max(-s6_4, 0.0); + V4 s7_5 = -max(-s6_5, 0.0); + V4 s7_6 = -max(-s6_6, 0.0); + V4 s7_7 = -max(-s6_7, 0.0); + V4 s7_8 = -max(-s6_8, 0.0); + s6_0 = max(s6_0, 0.0); + s6_1 = max(s6_1, 0.0); + s6_2 = max(s6_2, 0.0); + s6_3 = max(s6_3, 0.0); + s6_4 = max(s6_4, 0.0); + s6_5 = max(s6_5, 0.0); + s6_6 = max(s6_6, 0.0); + s6_7 = max(s6_7, 0.0); + s6_8 = max(s6_8, 0.0); + + t4[gxy] = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t5[gxy] = f1(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t6[gxy] = f2(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t7[gxy] = f3(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); +} + +//!PASS 9 +//!DESC conv8 +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 +//!IN t4, t5, t6, t7 +//!OUT t0, t1, t2, t3 + +#define l0(x, y) V4(O(t4, float2(x, y))) +#define l1(x, y) V4(O(t5, float2(x, y))) +#define l2(x, y) V4(O(t6, float2(x, y))) +#define l3(x, y) V4(O(t7, float2(x, y))) + +V4 f0(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-1.179e-01, -1.154e-01, 2.741e-02, 6.196e-02, -1.986e-01, -4.433e-02, 1.182e-01, -2.432e-02, 3.710e-02, 4.281e-02, -1.404e-02, -5.320e-02, -4.772e-02, 6.207e-02, -1.707e-01, -4.863e-02)); + r += mul(s0_1, M4(3.627e-02, -2.468e-01, 8.430e-03, 5.969e-02, -1.338e-02, -4.213e-02, -1.246e-02, 1.387e-01, 4.174e-02, 1.655e-01, 6.350e-02, -8.760e-02, 1.408e-01, -1.162e-01, 7.822e-02, -1.009e-02)); + r += mul(s0_2, M4(6.093e-03, 8.566e-05, -3.650e-02, -1.255e-01, 2.387e-03, 1.066e-01, 2.412e-02, 1.019e-02, -1.140e-01, -1.713e-01, -5.116e-02, -7.987e-03, -9.589e-02, -2.405e-02, 1.606e-01, 9.482e-02)); + r += mul(s0_3, M4(7.013e-02, -1.590e-02, 8.185e-02, 1.062e-01, -1.050e-02, -6.553e-03, -4.859e-03, 1.272e-01, 1.492e-01, 5.653e-02, -1.592e-01, 8.731e-02, -2.231e-02, 8.736e-02, -3.930e-01, 1.555e-04)); + r += mul(s0_4, M4(1.191e-02, 1.250e-01, 1.416e-01, 4.392e-02, 1.373e-01, 4.931e-03, 2.598e-03, -6.627e-02, -7.282e-02, -3.920e-02, 4.955e-02, 4.273e-02, 6.893e-02, -1.407e-01, 1.878e-02, 5.470e-02)); + r += mul(s0_5, M4(1.175e-01, -5.407e-02, -6.647e-02, -5.952e-02, 8.890e-02, -6.018e-02, 1.071e-01, 5.453e-02, -1.330e-01, -1.647e-01, -3.316e-02, -9.201e-02, -2.849e-02, -6.046e-02, -4.337e-02, 1.021e-01)); + r += mul(s0_6, M4(-1.529e-01, -2.821e-02, 1.086e-01, 3.927e-02, -1.485e-01, -2.149e-02, 6.814e-02, -4.126e-03, 1.656e-01, 9.400e-02, 8.804e-02, 7.325e-02, 3.157e-02, 8.224e-03, -1.134e-01, 5.558e-02)); + r += mul(s0_7, M4(-2.497e-02, -8.253e-02, -1.913e-01, -5.884e-02, -9.665e-02, -6.127e-02, 2.678e-02, 1.353e-01, -3.921e-02, 1.782e-01, 1.702e-01, 1.518e-01, 9.343e-02, -3.666e-02, -5.675e-03, 7.092e-02)); + r += mul(s0_8, M4(-4.033e-02, -2.407e-02, 2.819e-01, 9.621e-03, -2.139e-02, 6.438e-02, -2.593e-02, 1.095e-02, -1.087e-01, -1.379e-01, 2.617e-01, 7.200e-02, 3.833e-02, -1.586e-01, -1.300e-01, 8.798e-02)); + r += mul(s1_0, M4(1.711e-02, -9.933e-03, -7.461e-02, -2.927e-03, 8.384e-02, -7.661e-03, 2.646e-01, 9.328e-03, -6.376e-02, -5.568e-03, -4.761e-03, -4.269e-02, -2.487e-02, -2.441e-02, -1.288e-01, -2.240e-02)); + r += mul(s1_1, M4(2.904e-02, -3.527e-02, 3.301e-02, -1.035e-01, 7.388e-02, 1.715e-01, -4.880e-02, 1.106e-01, 9.189e-03, 2.177e-01, 1.389e-02, -7.839e-02, -4.192e-02, 2.435e-01, -1.254e-01, 8.114e-02)); + r += mul(s1_2, M4(1.409e-02, 7.445e-02, -5.300e-02, -1.246e-01, 1.162e-01, 2.528e-02, 6.691e-02, 1.195e-01, -1.119e-01, -2.102e-01, -1.194e-02, 7.495e-02, -2.134e-02, 8.568e-03, -1.460e-02, 7.260e-02)); + r += mul(s1_3, M4(2.169e-03, -5.947e-02, -2.129e-02, 7.883e-02, -8.182e-02, -1.660e-02, 1.747e-01, 7.014e-02, 1.355e-01, 1.056e-01, -3.046e-02, 6.735e-02, -6.171e-02, 1.020e-01, -8.185e-02, 5.354e-03)); + r += mul(s1_4, M4(1.269e-02, 8.096e-04, -1.583e-01, 8.178e-02, -3.959e-01, 1.193e-01, 8.464e-02, -1.127e-01, 1.944e-01, 7.556e-02, 1.168e-01, -1.384e-02, -3.573e-02, -1.009e-01, 1.742e-02, -2.912e-02)); + r += mul(s1_5, M4(7.504e-03, -4.270e-02, -3.003e-03, -7.649e-02, -8.989e-02, -2.783e-01, -1.515e-01, 2.359e-01, -9.594e-03, -1.769e-01, 5.729e-02, -5.659e-02, 1.098e-01, -1.249e-01, 6.557e-03, -2.786e-03)); + r += mul(s1_6, M4(7.453e-02, -5.096e-02, -1.363e-02, 6.269e-03, -5.956e-03, -4.357e-02, -1.768e-01, -1.273e-01, 1.452e-02, -7.577e-03, 3.611e-02, -1.243e-01, 1.268e-02, -8.653e-02, 1.094e-02, 1.110e-01)); + r += mul(s1_7, M4(-2.039e-02, 8.292e-02, -1.957e-01, 4.652e-02, -1.223e-01, 9.855e-02, 9.949e-03, 7.547e-02, -6.217e-02, 1.737e-01, 1.743e-02, 3.541e-02, 1.905e-03, -1.051e-01, 1.078e-01, -6.229e-02)); + r += mul(s1_8, M4(-8.799e-02, -1.323e-01, 1.781e-01, 1.228e-01, -5.019e-02, 4.793e-02, -6.260e-02, 4.792e-03, -8.148e-02, -1.676e-01, -6.797e-03, 1.878e-01, 1.042e-02, -1.123e-01, 1.075e-01, -6.213e-03)); + r += mul(s2_0, M4(1.137e-02, -3.013e-02, -5.909e-02, -3.283e-02, 6.601e-02, -3.383e-02, -1.308e-02, 3.534e-02, 1.833e-02, -4.259e-02, 2.534e-02, -1.148e-01, 8.100e-02, 3.943e-02, -1.851e-01, -2.159e-02)); + r += mul(s2_1, M4(-6.727e-02, 4.950e-02, -1.069e-01, -1.365e-01, 2.731e-01, -7.385e-03, 4.301e-02, -4.144e-02, 1.794e-03, 1.076e-01, 1.060e-01, -1.038e-01, -6.883e-04, 1.702e-01, -1.243e-01, 8.879e-02)); + r += mul(s2_2, M4(6.783e-03, 9.341e-03, -3.123e-02, -4.762e-02, -3.262e-02, 1.387e-01, -3.649e-02, -4.453e-02, -5.958e-02, -8.626e-03, 6.617e-03, -4.030e-02, 1.290e-01, 1.421e-02, 1.811e-01, 1.369e-01)); + r += mul(s2_3, M4(-1.794e-01, -2.994e-02, -1.668e-02, -1.213e-01, -1.363e-01, -3.924e-02, -7.976e-02, 8.185e-02, -1.239e-01, -6.484e-02, 2.573e-02, -6.085e-02, -8.119e-02, -8.224e-02, 7.713e-02, -4.880e-02)); + r += mul(s2_4, M4(-8.398e-02, -3.546e-02, -3.728e-02, 1.082e-01, 1.656e-01, -1.626e-01, -3.856e-02, -1.520e-01, 5.293e-02, -1.090e-01, -1.047e-01, 5.184e-02, 2.178e-01, -6.848e-02, 3.055e-04, -3.072e-02)); + r += mul(s2_5, M4(8.491e-02, 8.328e-02, 2.124e-01, -6.988e-02, 8.466e-03, -1.768e-01, -1.258e-01, 8.647e-03, -7.203e-02, -8.992e-02, 5.066e-03, 5.165e-02, 1.724e-01, 1.102e-01, -1.397e-01, 1.527e-01)); + r += mul(s2_6, M4(-2.680e-02, 3.200e-02, 6.107e-02, 1.293e-01, -4.097e-02, -1.291e-02, -2.858e-02, -5.949e-02, 8.323e-02, -1.926e-02, -4.581e-02, -1.917e-01, -3.910e-02, -1.339e-01, -1.078e-01, 4.290e-02)); + r += mul(s2_7, M4(-9.518e-02, 4.218e-02, 7.849e-02, 1.521e-01, -9.498e-02, -8.458e-03, 6.540e-03, 5.923e-04, -4.768e-02, 7.709e-02, 2.112e-01, -9.940e-02, -8.771e-02, -1.498e-01, -1.108e-02, -1.136e-01)); + r += mul(s2_8, M4(1.078e-01, -4.815e-02, -2.572e-02, 9.091e-03, -4.395e-02, -5.938e-03, 5.717e-02, -9.596e-02, 2.518e-03, -2.338e-02, 9.928e-02, -3.081e-02, -2.289e-01, 6.257e-02, 7.739e-02, -8.178e-02)); + r += mul(s3_0, M4(1.702e-02, 4.195e-02, 3.265e-02, 3.802e-02, 1.608e-01, -1.130e-01, 7.652e-02, 7.043e-02, 5.133e-02, 7.681e-02, -2.191e-02, 8.329e-02, 4.514e-02, -1.296e-03, 7.691e-02, -1.759e-02)); + r += mul(s3_1, M4(2.979e-01, -6.374e-03, 3.151e-02, -1.477e-01, 1.650e-02, 1.401e-01, 1.159e-01, 1.215e-02, -3.441e-02, 1.056e-01, 2.866e-02, 1.198e-01, -2.216e-02, 1.299e-01, -1.351e-02, -3.889e-02)); + r += mul(s3_2, M4(5.457e-02, 1.967e-01, 1.839e-01, 4.967e-02, -2.029e-02, 6.465e-02, -1.635e-02, 9.906e-02, -2.052e-03, 2.073e-02, 1.095e-02, 6.171e-02, 1.244e-01, 8.828e-02, 1.131e-01, 1.311e-02)); + r += mul(s3_3, M4(-8.743e-02, -4.343e-03, 7.079e-02, 1.165e-01, 3.384e-02, -1.121e-01, -2.762e-02, 1.460e-01, 4.518e-02, -5.515e-02, -4.282e-02, -3.432e-02, 6.203e-02, -1.352e-02, 8.449e-02, -2.627e-02)); + r += mul(s3_4, M4(2.033e-02, -8.235e-02, -3.525e-02, 5.705e-02, 1.744e-01, -4.119e-02, 3.571e-02, -4.678e-01, 5.413e-02, 5.668e-02, -1.704e-01, 7.155e-02, 4.698e-02, -1.107e-01, 7.151e-02, -7.922e-02)); + r += mul(s3_5, M4(2.104e-01, 5.732e-02, 1.803e-01, 1.305e-01, -1.986e-02, -1.181e-01, -2.979e-01, 7.342e-02, 7.892e-02, 5.552e-02, 1.002e-01, 3.011e-02, 8.980e-02, 6.477e-02, -1.311e-01, 1.142e-01)); + r += mul(s3_6, M4(1.590e-02, -1.074e-01, -9.888e-03, -9.625e-04, 2.324e-02, -3.032e-02, -1.638e-02, -8.205e-02, -3.143e-02, 5.804e-02, -6.501e-02, 5.997e-03, -2.892e-02, -1.674e-02, 1.130e-01, -3.797e-02)); + r += mul(s3_7, M4(4.608e-02, -4.051e-02, -1.537e-01, 1.102e-01, 7.405e-02, -5.225e-02, -2.455e-02, 1.665e-01, -9.942e-02, -1.276e-02, -1.324e-02, -4.027e-02, -1.495e-01, -4.079e-02, -1.258e-02, 2.045e-02)); + r += mul(s3_8, M4(-2.022e-03, -2.816e-02, -9.246e-02, 9.098e-02, -1.344e-01, -6.834e-02, -5.595e-02, -1.213e-01, -7.136e-02, -3.156e-02, -7.149e-02, -3.323e-02, -9.120e-02, 5.753e-03, 2.105e-02, -3.760e-02)); + r += mul(s4_0, M4(2.183e-03, -1.813e-02, 5.619e-02, -1.930e-02, -3.846e-02, 1.212e-02, 1.508e-02, -4.844e-02, -3.569e-02, -3.011e-02, -1.244e-01, -6.167e-03, -1.967e-01, -5.375e-01, -2.783e-01, 1.626e-01)); + r += mul(s4_1, M4(-2.039e-01, 3.192e-02, 7.417e-02, -3.648e-02, 3.189e-03, 1.163e-01, -6.010e-02, 3.590e-02, -4.391e-02, 2.428e-02, -4.231e-02, -4.152e-02, 1.568e-01, -5.492e-01, -7.005e-03, 5.425e-02)); + r += mul(s4_2, M4(-1.202e-01, 4.948e-02, 1.097e-01, -7.178e-02, 1.647e-01, 5.601e-02, 6.415e-02, 3.912e-02, 6.567e-02, 1.682e-02, -3.581e-02, 5.655e-02, -1.028e-01, 3.299e-01, -1.259e-01, -6.016e-02)); + r += mul(s4_3, M4(-1.557e-01, 2.920e-02, -1.330e-01, -1.201e-01, -1.904e-01, 3.443e-02, 3.807e-02, 1.420e-03, -3.260e-02, 5.182e-02, 3.727e-02, 2.890e-02, 3.998e-01, 5.939e-02, -2.319e-01, -5.014e-01)); + r += mul(s4_4, M4(-6.019e-02, -4.538e-02, -7.342e-02, -2.403e-02, -8.856e-02, -2.028e-01, 1.239e-01, 3.872e-02, -1.875e-01, -6.518e-02, 3.180e-02, 1.602e-01, 2.449e-01, 1.173e-01, -1.286e-01, -1.252e-01)); + r += mul(s4_5, M4(-1.410e-01, 1.971e-02, 1.741e-01, -1.175e-02, -1.192e-01, 1.440e-01, 1.631e-01, -3.816e-02, 1.021e-01, 1.529e-02, -8.363e-02, 8.811e-02, 3.363e-01, 2.851e-01, 3.174e-01, 1.586e-01)); + r += mul(s4_6, M4(-8.199e-02, 1.145e-01, -8.508e-02, 1.497e-01, -1.427e-01, -1.310e-01, -2.610e-02, -9.997e-02, -3.202e-02, 1.776e-02, -2.032e-02, -2.544e-02, -2.676e-01, -7.637e-01, -1.128e-01, -4.935e-01)); + r += mul(s4_7, M4(4.811e-03, 1.367e-03, 4.257e-02, 2.274e-02, -9.530e-02, -2.415e-02, -1.019e-01, 1.026e-02, 4.476e-02, -6.365e-02, 4.689e-02, -1.648e-01, -3.233e-01, -3.906e-02, -1.925e-01, -1.158e-01)); + r += mul(s4_8, M4(3.481e-02, -1.392e-01, 2.833e-02, -2.713e-02, -3.550e-02, -7.110e-03, -1.792e-01, 1.430e-01, -3.660e-02, -2.613e-02, 1.949e-02, -1.605e-02, 6.411e-02, -2.967e-02, -1.464e-01, -3.527e-01)); + r += mul(s5_0, M4(9.120e-03, -2.916e-02, -3.723e-02, 5.875e-02, -3.905e-03, 1.901e-02, 4.643e-02, 3.110e-02, -1.356e-01, -6.962e-03, 5.408e-02, 1.339e-01, -1.158e-02, 3.588e-02, -6.353e-02, -6.984e-03)); + r += mul(s5_1, M4(-8.116e-02, -4.357e-02, -4.506e-02, 5.045e-02, -5.930e-02, 2.987e-02, -1.818e-01, 1.494e-02, -4.484e-03, 1.597e-01, -1.902e-01, 9.383e-03, -1.226e-01, 1.295e-02, 2.515e-02, 1.143e-02)); + r += mul(s5_2, M4(6.183e-02, 9.416e-02, -8.370e-03, 2.306e-02, 1.287e-02, 2.179e-02, 1.322e-02, 2.942e-03, 1.033e-01, 2.096e-01, -1.261e-02, 1.235e-01, -1.473e-02, 3.457e-02, -9.516e-02, 3.791e-02)); + r += mul(s5_3, M4(5.326e-02, -5.508e-02, -3.068e-02, 2.956e-02, 1.403e-01, -6.957e-03, 2.410e-02, -4.953e-02, -6.187e-02, 2.430e-01, -5.465e-02, -1.818e-01, 1.388e-02, -2.809e-02, -5.922e-02, 7.644e-04)); + r += mul(s5_4, M4(-1.857e-02, -8.718e-02, 1.568e-01, 1.803e-01, 6.858e-02, -2.801e-02, -7.750e-02, 3.642e-02, 4.941e-02, -3.754e-02, -2.961e-01, -2.356e-02, -9.099e-02, -4.424e-02, 6.180e-02, 3.793e-02)); + r += mul(s5_5, M4(1.441e-02, 6.786e-03, 1.331e-01, -2.061e-02, 1.087e-01, 2.706e-02, -1.322e-01, -4.488e-02, -1.955e-01, 6.401e-02, -4.254e-02, 7.051e-02, 5.702e-02, -1.098e-01, 2.223e-02, -2.229e-02)); + r += mul(s5_6, M4(-2.432e-02, -6.500e-02, -2.856e-02, -3.645e-02, -1.735e-01, 1.872e-02, 8.135e-02, 9.167e-02, 4.470e-02, -2.786e-02, -1.099e-02, -1.680e-01, 2.792e-02, 2.272e-04, 5.839e-02, 9.217e-02)); + r += mul(s5_7, M4(1.112e-01, -4.509e-02, 1.634e-01, -2.861e-01, 3.643e-02, 1.554e-02, -6.258e-02, -1.283e-02, 2.612e-02, 1.743e-01, 7.423e-02, -1.495e-01, -1.106e-01, 4.478e-02, 5.762e-02, 4.473e-02)); + r += mul(s5_8, M4(7.160e-02, -4.476e-02, 1.460e-01, -1.224e-01, -4.553e-02, 1.511e-01, 6.369e-02, 2.777e-02, 1.314e-01, -2.126e-01, -1.414e-01, 1.500e-02, 2.510e-02, 9.726e-03, -6.648e-02, -3.623e-02)); + r += mul(s6_0, M4(3.627e-02, 6.073e-02, -3.193e-02, 6.293e-02, -7.165e-02, -1.066e-02, -4.735e-02, -2.393e-02, 1.094e-02, 9.433e-03, -4.092e-02, -4.544e-02, -3.613e-04, 1.851e-02, 9.064e-02, 8.582e-02)); + r += mul(s6_1, M4(8.239e-02, 5.018e-02, -9.757e-03, -1.659e-02, 8.712e-02, 8.036e-02, 9.214e-02, 9.874e-02, 1.340e-01, 6.547e-02, -6.969e-02, -4.847e-02, -2.288e-02, 1.972e-02, -2.393e-01, -5.440e-02)); + r += mul(s6_2, M4(7.312e-02, 3.785e-02, 3.346e-02, 4.212e-02, -5.342e-02, 2.322e-02, -1.462e-03, 1.626e-02, 3.446e-02, 1.382e-01, -7.093e-02, -2.692e-02, -2.091e-01, 8.998e-02, 7.997e-02, -3.156e-02)); + r += mul(s6_3, M4(2.614e-04, 3.019e-02, 8.045e-02, -1.697e-02, 1.278e-01, -3.694e-02, 2.327e-02, -9.615e-03, 1.075e-01, -6.754e-03, 1.283e-01, 9.763e-02, -1.815e-01, -9.186e-02, 4.242e-02, -7.595e-02)); + r += mul(s6_4, M4(1.812e-01, 4.732e-02, 1.652e-02, -1.520e-02, -1.962e-01, 5.995e-02, 5.367e-02, -4.655e-02, -1.860e-01, -6.588e-02, -9.304e-02, -6.501e-02, 5.029e-01, 5.293e-02, -3.266e-02, 1.421e-01)); + r += mul(s6_5, M4(-1.821e-02, -2.075e-01, 3.785e-02, 8.904e-02, 1.940e-02, -9.087e-02, -9.922e-02, -1.461e-02, -9.858e-03, 9.537e-02, 3.711e-02, -6.326e-03, 6.543e-02, -2.522e-02, -4.784e-01, -1.630e-01)); + r += mul(s6_6, M4(-1.560e-01, -3.541e-02, -5.997e-02, 7.702e-02, 2.226e-02, -2.751e-02, -6.800e-02, -1.644e-01, 3.878e-02, -1.347e-01, -4.226e-02, -3.344e-03, 2.842e-01, -3.345e-02, -1.678e-01, 1.387e-02)); + r += mul(s6_7, M4(-7.609e-02, -1.081e-01, -8.324e-03, 9.140e-02, -3.538e-02, 1.694e-02, 5.020e-02, -1.722e-02, 4.702e-03, -8.951e-02, -5.850e-02, 8.111e-04, 3.122e-01, -1.631e-01, -1.316e-01, -4.874e-01)); + r += mul(s6_8, M4(-4.049e-02, -7.387e-02, -7.741e-02, 8.224e-02, 1.106e-01, -5.439e-02, 1.329e-02, -4.252e-02, -1.675e-01, 8.479e-02, 2.600e-02, -4.876e-02, 1.208e-01, 3.030e-01, 3.656e-01, -2.404e-01)); + r += mul(s7_0, M4(-5.614e-04, -2.112e-02, 5.199e-03, -1.329e-03, 3.697e-02, -9.503e-02, -1.489e-01, -1.401e-02, -2.104e-01, 8.389e-02, -1.425e-01, 1.198e-01, -4.003e-02, -2.232e-03, -9.903e-03, 3.664e-02)); + r += mul(s7_1, M4(1.116e-01, -4.805e-02, -9.508e-02, -8.863e-02, -8.594e-02, -4.690e-02, 9.794e-02, -3.391e-02, -1.790e-01, 1.526e-01, -7.496e-02, 2.324e-01, -7.781e-02, -7.806e-02, -6.675e-03, -1.827e-02)); + r += mul(s7_2, M4(5.768e-02, 4.320e-02, -6.567e-02, -4.387e-02, -6.329e-02, -1.164e-01, -2.220e-02, -3.429e-02, -5.967e-01, 7.330e-02, -3.555e-01, 8.054e-02, 1.392e-01, -1.012e-02, 3.216e-02, 1.496e-02)); + r += mul(s7_3, M4(-1.115e-01, 1.508e-02, -1.303e-01, 1.906e-02, -1.976e-03, 1.900e-01, -1.030e-02, -5.090e-03, -1.083e-01, -7.993e-03, -6.934e-03, -4.917e-02, -3.553e-02, 1.348e-02, -5.114e-02, 2.150e-02)); + r += mul(s7_4, M4(-3.374e-02, 3.009e-02, 5.857e-02, -9.649e-02, 7.674e-02, 1.091e-01, 2.042e-02, -4.355e-02, -1.533e-01, 1.921e-01, 3.850e-01, -4.044e-02, 5.562e-02, -5.540e-02, 7.332e-02, 3.248e-02)); + r += mul(s7_5, M4(1.772e-02, -7.301e-02, 3.140e-02, 6.169e-02, 1.574e-01, -1.557e-02, -6.124e-02, 3.520e-02, 2.846e-01, 7.785e-02, 2.583e-01, -1.309e-01, 1.899e-01, -1.479e-02, -1.239e-01, -7.160e-03)); + r += mul(s7_6, M4(-3.006e-02, -2.029e-02, 5.972e-02, 3.386e-03, -7.393e-02, 5.966e-02, -4.498e-02, -6.022e-02, 8.330e-02, 2.939e-02, 3.378e-03, 1.490e-01, -9.315e-02, 4.097e-02, 5.681e-03, 6.256e-02)); + r += mul(s7_7, M4(3.114e-02, 5.778e-02, -4.831e-02, 1.290e-01, 7.470e-02, -9.074e-02, -3.859e-02, 9.126e-02, 2.751e-02, 7.029e-02, 3.303e-02, 5.825e-02, -5.205e-02, 2.948e-02, 5.493e-03, -5.036e-02)); + r += mul(s7_8, M4(1.617e-01, -9.764e-02, 3.887e-02, 6.610e-02, -3.920e-02, -2.124e-01, -7.008e-02, 1.160e-01, -2.669e-01, 3.881e-02, 8.382e-02, 9.165e-02, -1.217e-01, 9.085e-02, 5.695e-03, -8.119e-02)); + r += V4(1.403e-02, -6.125e-03, -2.342e-02, -1.136e-02); + return r; +} + +V4 f1(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-7.724e-02, 1.840e-01, 5.966e-02, 5.070e-02, 2.850e-02, 2.703e-02, 2.311e-04, 4.008e-02, -1.213e-02, -4.575e-02, -1.344e-01, 1.487e-02, 1.969e-01, -6.987e-02, -1.742e-02, -1.697e-01)); + r += mul(s0_1, M4(-1.275e-02, -4.802e-02, -8.417e-02, 4.384e-02, 2.220e-02, -9.401e-02, -1.768e-01, -2.247e-02, -1.508e-01, 9.067e-02, 1.209e-01, -6.212e-02, 1.372e-02, 2.142e-02, -1.100e-02, -4.698e-04)); + r += mul(s0_2, M4(7.217e-02, -4.635e-02, -4.113e-02, -1.422e-01, 6.937e-02, -1.280e-01, -5.054e-05, 1.096e-02, -1.155e-01, 9.489e-03, 6.707e-02, -1.829e-02, 3.346e-01, -7.680e-02, -3.614e-02, -2.940e-02)); + r += mul(s0_3, M4(-1.549e-02, 4.748e-02, -2.051e-02, 5.490e-02, 3.730e-03, 2.569e-02, 5.174e-02, 4.933e-02, -5.114e-03, 1.192e-01, -1.115e-01, -4.806e-03, -1.512e-01, -2.198e-01, -1.167e-01, -1.390e-01)); + r += mul(s0_4, M4(-1.188e-01, 3.509e-02, 3.543e-02, 1.111e-01, -7.166e-02, -1.343e-01, 1.096e-02, 1.033e-01, -2.424e-01, -7.907e-03, -5.037e-02, 1.417e-01, 1.377e-01, -2.075e-01, -9.802e-02, 3.139e-02)); + r += mul(s0_5, M4(-3.900e-02, -4.654e-03, 2.197e-02, 1.976e-01, -4.585e-02, -3.598e-02, 1.276e-02, -3.306e-02, -3.152e-02, 4.281e-02, 1.201e-01, 3.895e-02, 1.745e-01, -1.216e-01, 1.352e-01, -5.017e-02)); + r += mul(s0_6, M4(1.756e-02, 1.117e-01, 9.898e-02, 1.508e-01, -6.694e-03, -1.332e-04, 1.074e-01, 5.135e-02, 3.021e-02, -1.141e-02, -2.068e-01, -3.470e-02, -1.515e-01, 3.214e-02, 6.859e-02, 1.052e-01)); + r += mul(s0_7, M4(2.112e-01, 1.255e-01, -1.653e-01, -1.735e-01, -1.008e-01, 4.133e-02, 2.729e-02, -9.144e-02, 2.082e-01, 6.797e-02, 2.031e-01, -5.398e-02, -1.601e-02, 3.365e-01, -7.537e-02, -7.077e-02)); + r += mul(s0_8, M4(1.310e-01, -1.838e-01, -1.824e-01, 2.686e-02, -5.196e-03, 2.406e-02, -7.136e-02, -1.845e-03, 2.307e-01, 4.479e-02, 2.829e-01, 1.392e-01, 2.334e-01, 8.407e-02, 4.630e-02, -8.520e-02)); + r += mul(s1_0, M4(2.114e-03, 2.668e-02, -1.427e-02, -2.694e-02, -3.965e-04, 2.847e-02, 8.394e-02, -2.785e-01, 4.981e-02, -2.619e-02, -9.234e-02, 1.929e-01, 1.035e-01, 1.592e-02, -2.168e-02, -3.591e-02)); + r += mul(s1_1, M4(5.445e-02, -2.741e-03, -1.524e-02, 2.872e-02, 1.501e-02, 1.259e-01, 2.840e-02, -1.047e-01, -1.001e-01, 3.405e-02, 4.572e-02, -8.381e-02, 7.945e-02, -2.578e-02, -7.845e-02, 2.507e-02)); + r += mul(s1_2, M4(-4.223e-02, 2.079e-02, 7.160e-03, -3.529e-02, -2.844e-02, 5.381e-04, -1.173e-01, -5.351e-02, -3.105e-02, 2.772e-02, -1.366e-02, 9.494e-02, 2.181e-01, -7.016e-02, 1.038e-01, 7.938e-02)); + r += mul(s1_3, M4(3.777e-02, 5.161e-03, 7.237e-02, 6.253e-02, 1.684e-01, -1.439e-02, 1.439e-01, 8.895e-02, -8.568e-02, 2.804e-02, -1.905e-02, -3.772e-02, -1.072e-01, -1.312e-02, 5.895e-02, -1.760e-02)); + r += mul(s1_4, M4(1.762e-01, 2.947e-02, 1.324e-01, 3.135e-02, -3.291e-03, 5.106e-02, 2.093e-01, -1.266e-01, -1.403e-01, -9.251e-02, -1.132e-01, 1.206e-01, -1.451e-02, 4.177e-02, -4.161e-02, -3.751e-02)); + r += mul(s1_5, M4(3.326e-02, 6.515e-02, -1.019e-01, 1.452e-01, 1.364e-01, 3.613e-02, -4.264e-02, -1.150e-01, 3.261e-02, 2.848e-02, 1.705e-01, -5.300e-02, -4.921e-03, -8.104e-02, -9.616e-02, 5.653e-02)); + r += mul(s1_6, M4(-8.075e-02, 3.694e-02, -3.470e-02, 3.817e-02, -7.741e-02, -6.873e-02, 6.621e-02, 1.264e-01, 1.353e-01, 3.871e-02, -7.518e-02, -1.563e-03, -4.559e-02, 9.546e-02, 2.271e-02, -2.953e-02)); + r += mul(s1_7, M4(-1.537e-01, -4.538e-02, 3.473e-02, 6.479e-02, -1.853e-01, 9.301e-02, 1.812e-01, 7.560e-02, 4.490e-02, 1.386e-01, 6.909e-02, -2.373e-03, -8.195e-02, 1.602e-01, -5.891e-02, -8.507e-02)); + r += mul(s1_8, M4(-1.283e-01, -8.259e-02, 1.211e-01, 1.746e-02, -9.038e-02, 1.928e-01, 3.724e-02, 4.097e-02, 1.269e-01, -4.324e-02, 2.607e-01, 8.578e-02, 1.097e-01, -3.740e-02, 1.986e-02, 2.089e-02)); + r += mul(s2_0, M4(-4.258e-02, 8.224e-02, 1.048e-02, 7.118e-02, -9.890e-02, 5.473e-02, -3.945e-02, 3.890e-02, -5.820e-02, 1.354e-01, 9.434e-02, -2.227e-02, 1.141e-01, 3.242e-03, 1.918e-01, -1.271e-01)); + r += mul(s2_1, M4(3.310e-02, -2.224e-02, 2.981e-02, -1.571e-01, 6.848e-02, -3.456e-02, 9.113e-02, 4.380e-02, -6.264e-02, 2.110e-01, -6.695e-02, 4.847e-02, 6.284e-02, 1.602e-01, -8.717e-02, 1.223e-01)); + r += mul(s2_2, M4(7.283e-02, 7.600e-02, -6.312e-03, 1.792e-02, -4.016e-02, 6.400e-03, -3.479e-02, -8.229e-02, 6.997e-02, 1.148e-01, 1.087e-01, 1.213e-01, 1.358e-01, -1.168e-01, -4.992e-02, 1.194e-01)); + r += mul(s2_3, M4(-8.611e-02, -6.279e-02, 3.449e-03, -9.984e-02, -3.702e-02, -1.691e-02, 1.295e-01, -5.580e-03, -5.515e-02, 1.853e-01, -1.760e-02, -6.246e-02, -2.026e-01, -1.262e-03, 8.512e-02, 5.164e-02)); + r += mul(s2_4, M4(-8.568e-02, -7.055e-02, 8.443e-02, -1.094e-01, 3.930e-02, -1.755e-01, 2.495e-01, -1.392e-01, 4.257e-03, 2.378e-01, -1.398e-01, -3.154e-03, -2.801e-01, -1.587e-01, 9.718e-02, -7.764e-02)); + r += mul(s2_5, M4(-6.386e-02, -2.549e-02, -7.504e-02, 7.184e-02, 4.190e-02, 2.954e-02, -1.622e-01, 9.567e-02, 5.567e-02, 8.607e-02, -4.043e-02, 1.531e-02, -1.740e-01, -5.285e-02, -8.496e-02, 1.134e-02)); + r += mul(s2_6, M4(-1.170e-02, 1.031e-01, 3.717e-02, -7.724e-02, 9.260e-02, 2.144e-02, 1.584e-01, 7.160e-02, 6.875e-02, -6.063e-03, -2.960e-03, -8.502e-02, 8.992e-02, 2.183e-03, 4.504e-02, -5.336e-03)); + r += mul(s2_7, M4(2.265e-01, 2.020e-02, 1.221e-02, -6.520e-02, 1.199e-01, -3.575e-02, 8.107e-02, -2.064e-02, -4.061e-02, 2.520e-02, 1.486e-01, -1.737e-02, -6.462e-02, -1.468e-02, 3.628e-02, 3.528e-02)); + r += mul(s2_8, M4(1.223e-01, 6.030e-02, 5.806e-02, 1.269e-03, 6.043e-02, -3.870e-02, -7.984e-02, -1.056e-02, -2.352e-02, -5.047e-02, -4.811e-02, 1.098e-01, 1.659e-01, -8.937e-02, -3.395e-02, -2.555e-02)); + r += mul(s3_0, M4(-1.003e-01, 9.404e-02, -1.036e-01, 1.189e-01, -6.630e-02, 4.198e-02, -1.206e-01, -8.588e-02, 6.487e-02, -4.289e-02, -5.520e-02, 4.863e-02, 7.616e-02, -4.563e-02, 6.938e-02, -8.349e-02)); + r += mul(s3_1, M4(3.090e-02, -5.794e-02, 1.720e-02, -1.693e-01, 1.778e-02, -6.134e-02, -6.254e-02, 8.614e-03, 1.217e-01, -7.393e-02, -9.394e-02, -8.675e-02, 3.951e-02, 6.524e-02, -5.517e-02, -2.358e-03)); + r += mul(s3_2, M4(1.489e-01, -3.451e-02, -2.032e-01, -8.297e-02, 1.246e-01, -1.291e-01, -7.800e-02, -1.371e-01, -2.997e-03, -2.446e-02, 1.304e-02, 6.479e-02, -1.774e-02, -2.228e-03, 1.622e-02, 3.105e-02)); + r += mul(s3_3, M4(1.988e-02, -1.177e-01, 5.934e-02, 1.274e-01, -1.171e-01, -2.678e-03, 1.435e-01, -3.637e-02, -1.024e-01, 7.228e-02, 5.230e-02, -2.965e-02, -2.015e-02, 6.415e-02, 3.267e-02, -7.663e-02)); + r += mul(s3_4, M4(-1.052e-01, 4.454e-02, 8.595e-02, 2.379e-01, -1.163e-01, -1.496e-01, 1.817e-01, -2.559e-01, 5.475e-03, 3.444e-02, -1.957e-01, -9.725e-02, 7.565e-02, -1.111e-01, 3.272e-02, -7.525e-02)); + r += mul(s3_5, M4(-7.455e-03, -8.427e-02, -4.218e-02, 4.790e-02, 9.401e-02, -1.121e-01, -1.447e-01, 3.156e-02, 7.532e-02, -1.715e-02, 1.460e-02, 1.046e-01, -1.586e-01, -5.409e-02, -5.411e-02, -3.003e-02)); + r += mul(s3_6, M4(-1.436e-01, 1.030e-01, 5.531e-02, 1.360e-01, 9.290e-02, 1.553e-01, 1.950e-01, -3.723e-02, 3.381e-02, -6.820e-02, -1.381e-02, -1.080e-01, -5.238e-02, -1.522e-02, 4.833e-03, -1.492e-02)); + r += mul(s3_7, M4(5.130e-02, -5.561e-02, -2.519e-02, 1.129e-01, -3.739e-03, 6.413e-02, -2.109e-02, -1.821e-01, -1.472e-02, -9.493e-02, 2.997e-02, -3.930e-02, 2.223e-02, -9.339e-02, 5.872e-02, 9.591e-02)); + r += mul(s3_8, M4(5.037e-02, 3.653e-03, 2.274e-02, 1.995e-02, -5.041e-03, 2.161e-02, 9.535e-03, 1.757e-02, 4.400e-02, -8.377e-03, 1.082e-02, 3.105e-02, -8.612e-02, 4.627e-02, -8.301e-03, -2.559e-02)); + r += mul(s4_0, M4(5.987e-02, -1.482e-02, 3.351e-02, -6.310e-02, -4.229e-03, -6.841e-02, -6.166e-03, 1.118e-02, 4.439e-02, 4.798e-02, 1.299e-03, 5.123e-02, -3.027e-01, 1.494e-01, 4.118e-01, 3.597e-01)); + r += mul(s4_1, M4(6.472e-02, -3.500e-02, -3.729e-02, -1.382e-01, -1.232e-01, 2.478e-02, 1.782e-02, 7.169e-02, 1.073e-01, -9.537e-03, 6.582e-03, -3.679e-02, -3.886e-01, -1.123e-01, -3.075e-01, 1.037e-01)); + r += mul(s4_2, M4(-6.304e-02, 8.001e-03, 1.695e-01, 4.003e-02, -1.218e-02, 5.538e-02, 8.938e-02, 7.200e-02, 1.047e-01, 4.492e-02, -1.121e-01, 6.089e-02, -9.417e-03, -1.168e-01, -1.622e-02, 1.297e-02)); + r += mul(s4_3, M4(7.746e-03, -5.015e-04, 9.506e-02, 4.396e-02, 1.487e-02, -1.701e-01, -3.412e-02, -9.371e-02, 1.160e-01, 1.152e-01, 3.521e-03, 1.941e-02, 1.238e-01, 9.036e-02, -3.244e-01, 1.192e-02)); + r += mul(s4_4, M4(1.213e-01, 5.326e-02, -2.432e-01, 1.279e-01, 1.329e-01, -9.406e-02, 3.120e-02, 3.744e-03, -1.487e-01, 1.595e-02, 8.325e-02, 1.348e-02, -2.696e-01, 7.585e-02, -1.615e-01, 1.387e-01)); + r += mul(s4_5, M4(-6.099e-02, -4.308e-03, 2.213e-01, -8.152e-02, -9.230e-02, -3.547e-02, -7.342e-04, -1.075e-01, -9.105e-02, -2.387e-02, -7.690e-02, 1.122e-01, 4.953e-03, -5.518e-02, -5.026e-02, 1.549e-01)); + r += mul(s4_6, M4(1.285e-01, 1.177e-02, 1.186e-01, -6.946e-02, 8.408e-02, 2.238e-02, 6.817e-02, 1.605e-01, 3.962e-02, -3.125e-02, -4.336e-02, -4.538e-03, -3.323e-01, 2.379e-02, 7.357e-02, 1.818e-01)); + r += mul(s4_7, M4(3.967e-02, 1.028e-01, -2.228e-03, -1.031e-02, 1.905e-01, 6.901e-02, 2.475e-02, -1.720e-01, -6.732e-03, 8.988e-02, 2.008e-02, -5.934e-03, -1.280e-01, -2.170e-01, -3.173e-01, -9.140e-02)); + r += mul(s4_8, M4(3.521e-01, 5.174e-03, 4.608e-02, 1.210e-01, 1.417e-01, -8.578e-02, 8.202e-02, 5.828e-02, -1.003e-01, -5.269e-03, -1.538e-02, -8.339e-02, 7.307e-02, 3.105e-02, -2.396e-01, -3.173e-01)); + r += mul(s5_0, M4(-3.747e-02, 7.280e-03, -9.053e-02, 1.938e-01, 1.071e-01, -7.245e-02, -5.811e-02, -3.072e-02, 1.554e-01, -8.037e-02, 9.611e-02, 4.908e-02, 8.992e-02, -2.597e-02, -1.329e-02, -9.601e-02)); + r += mul(s5_1, M4(5.216e-02, 4.516e-04, -1.011e-01, -7.019e-02, -1.147e-02, 4.769e-02, -3.852e-02, -9.921e-02, 2.953e-01, -1.791e-01, 2.752e-02, -1.665e-02, -7.379e-02, 2.763e-02, 1.716e-02, -4.656e-02)); + r += mul(s5_2, M4(-1.576e-02, -1.048e-01, 5.974e-02, 4.993e-02, -6.986e-03, 1.785e-02, 1.141e-02, 3.672e-02, 7.632e-02, -7.359e-02, -2.939e-01, -1.764e-01, -3.114e-03, -8.975e-02, -1.164e-02, 4.968e-02)); + r += mul(s5_3, M4(-2.444e-02, -1.835e-02, -2.875e-02, 1.924e-01, -3.134e-02, -3.077e-02, 7.153e-02, 1.045e-01, 2.602e-01, -8.030e-02, -2.347e-01, -2.926e-02, -8.184e-02, 4.675e-02, -1.647e-02, -5.338e-02)); + r += mul(s5_4, M4(1.272e-01, 6.238e-02, -1.660e-01, 1.850e-01, 3.613e-02, 4.229e-02, -9.294e-02, 4.839e-02, -1.690e-01, -7.589e-02, -6.957e-02, 1.222e-02, 4.209e-02, 7.453e-02, 7.989e-02, 4.162e-02)); + r += mul(s5_5, M4(-4.380e-02, -1.028e-01, 3.865e-03, 1.097e-01, -3.281e-02, 8.102e-02, 1.514e-02, 8.578e-02, -2.046e-01, 1.479e-01, 2.743e-01, 1.518e-01, 1.183e-03, 6.509e-02, -2.623e-02, -3.482e-02)); + r += mul(s5_6, M4(6.535e-03, 6.839e-02, 2.374e-02, 5.277e-02, -1.126e-02, -2.428e-02, 6.067e-02, 2.483e-02, -8.028e-02, 7.573e-03, 8.035e-02, 1.940e-01, -2.065e-03, -3.858e-02, -1.287e-02, -4.179e-03)); + r += mul(s5_7, M4(-4.731e-02, 5.665e-02, -1.218e-01, -9.370e-02, -5.400e-02, 1.743e-02, -2.003e-01, -9.808e-02, 4.797e-02, 8.253e-02, 7.379e-02, 1.515e-01, -4.230e-02, -1.396e-01, 3.179e-02, -1.131e-03)); + r += mul(s5_8, M4(2.792e-02, -3.493e-02, 8.325e-02, 9.952e-03, -3.813e-02, 3.785e-04, -8.763e-04, 7.903e-02, 1.624e-01, 1.832e-01, 1.483e-01, 3.208e-02, -6.978e-02, 5.305e-02, -3.591e-02, -9.302e-02)); + r += mul(s6_0, M4(5.284e-02, -2.286e-02, 7.535e-02, 4.906e-02, 1.200e-02, -1.248e-01, -1.162e-02, -1.586e-02, -3.189e-02, 6.001e-03, 1.181e-03, -3.973e-03, 8.256e-02, 8.548e-02, 1.576e-01, -1.515e-01)); + r += mul(s6_1, M4(1.284e-01, -1.911e-02, 8.744e-02, 9.790e-02, 2.740e-02, 1.531e-02, -2.574e-02, -3.117e-02, -2.859e-02, 2.684e-02, 2.666e-02, 6.812e-03, -4.250e-02, -1.488e-01, -1.181e-01, -1.295e-01)); + r += mul(s6_2, M4(3.720e-02, 3.221e-02, 3.435e-02, 6.706e-02, -5.516e-03, 4.287e-02, 1.236e-02, 1.223e-02, 7.437e-03, 2.018e-02, 4.017e-02, 8.277e-02, 1.690e-01, -1.792e-02, -7.429e-03, -2.912e-01)); + r += mul(s6_3, M4(-5.532e-02, 6.336e-02, 6.260e-02, 9.205e-03, 1.285e-02, 6.509e-02, 3.856e-02, -2.021e-02, 6.904e-02, -6.493e-03, 1.655e-02, -4.652e-02, 4.887e-03, 6.818e-02, -2.779e-02, -9.416e-02)); + r += mul(s6_4, M4(-1.059e-01, -1.827e-02, -9.839e-02, 1.612e-01, -4.882e-02, 6.131e-02, 1.091e-01, -9.698e-02, 2.015e-02, -2.242e-02, 4.939e-02, -3.704e-02, 2.272e-01, 7.772e-02, 7.472e-02, -1.928e-01)); + r += mul(s6_5, M4(1.585e-01, -3.437e-02, -9.124e-02, -7.755e-02, 2.315e-02, 4.228e-02, 2.005e-02, 3.590e-02, -2.346e-02, 5.805e-02, 1.054e-02, 9.887e-02, -1.602e-01, 1.184e-01, 1.029e-01, -7.007e-02)); + r += mul(s6_6, M4(2.031e-02, 3.183e-02, -2.129e-02, -9.839e-03, -2.987e-02, -2.387e-02, -6.374e-02, 4.744e-02, -3.038e-02, 1.535e-01, -6.029e-02, -2.271e-02, 1.354e-01, 1.756e-01, 1.662e-01, 1.384e-01)); + r += mul(s6_7, M4(-1.276e-01, 2.346e-02, -1.002e-01, 3.707e-02, 1.235e-01, 3.925e-02, -1.002e-02, 3.066e-02, -1.582e-02, 7.662e-02, -7.702e-02, -1.235e-02, -1.770e-01, -6.730e-02, 1.516e-01, 1.566e-01)); + r += mul(s6_8, M4(3.088e-02, -2.108e-02, 8.897e-02, 7.054e-02, 1.846e-01, -2.521e-02, -9.622e-03, 7.985e-02, 7.300e-02, -1.049e-01, 6.219e-02, 1.374e-02, -1.286e-01, 4.387e-01, -7.610e-02, -6.778e-01)); + r += mul(s7_0, M4(-7.163e-02, -8.077e-03, -1.022e-01, 1.473e-02, -5.050e-02, 5.343e-02, 9.415e-02, 1.001e-01, 1.051e-01, -1.029e-01, -1.508e-01, -3.213e-01, -6.002e-02, -1.543e-02, -6.470e-02, 4.712e-02)); + r += mul(s7_1, M4(1.532e-02, 3.967e-02, -1.977e-01, 2.849e-02, 4.239e-02, 6.796e-02, 5.239e-02, 1.189e-01, 3.101e-01, -4.135e-02, 1.138e-01, 4.669e-02, 1.385e-02, 9.605e-03, 7.201e-02, 7.464e-03)); + r += mul(s7_2, M4(3.819e-02, 4.565e-02, 3.408e-02, 2.257e-02, 1.308e-01, 2.826e-02, 6.109e-02, -4.583e-02, 5.506e-02, -3.221e-01, 2.697e-03, 4.039e-01, 1.259e-01, 3.230e-02, 1.611e-02, -4.330e-02)); + r += mul(s7_3, M4(7.958e-02, -1.910e-02, 8.226e-02, 8.214e-02, -8.223e-02, 6.258e-02, -6.834e-02, -7.819e-02, 1.021e-02, 2.266e-02, 7.075e-02, -1.537e-01, 2.165e-02, 5.662e-02, -8.941e-02, 4.015e-02)); + r += mul(s7_4, M4(-2.136e-02, -6.519e-02, 1.436e-01, 1.326e-02, -2.437e-01, 6.408e-02, 1.316e-02, -8.968e-02, 1.674e-01, -6.148e-02, -7.849e-02, 8.925e-02, -2.668e-02, 1.509e-01, -4.980e-02, 5.554e-02)); + r += mul(s7_5, M4(-1.331e-01, 7.111e-03, 3.069e-03, 3.506e-02, -1.004e-01, -1.103e-01, -9.701e-02, 8.936e-02, -1.729e-01, -1.700e-01, -4.142e-02, 1.028e-01, -6.603e-02, 9.418e-02, 1.503e-02, -1.254e-02)); + r += mul(s7_6, M4(-5.121e-02, 2.249e-02, 1.791e-02, -2.844e-02, -4.702e-02, 3.654e-02, -8.635e-03, 1.394e-01, -9.286e-02, -8.097e-02, -1.817e-02, -1.863e-01, 9.467e-02, 4.542e-03, 2.574e-03, -5.944e-02)); + r += mul(s7_7, M4(1.354e-01, -3.398e-02, 8.637e-02, -4.478e-02, -1.265e-01, 9.978e-02, 3.152e-02, -6.899e-02, 1.511e-02, -1.379e-02, -1.369e-01, 4.768e-02, 2.655e-02, -1.006e-01, -8.618e-03, 8.087e-03)); + r += mul(s7_8, M4(-3.514e-02, 2.768e-02, 6.856e-02, -2.232e-02, 1.918e-01, -1.164e-01, 2.628e-02, 1.171e-01, 2.024e-01, -1.593e-01, 4.787e-02, 1.028e-01, -4.236e-02, -6.423e-02, 2.739e-03, 1.502e-02)); + r += V4(1.516e-02, 8.959e-02, -1.787e-02, -1.065e-03); + return r; +} + +V4 f2(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-1.187e-02, 6.264e-02, -2.532e-02, 7.597e-02, 1.335e-02, -7.549e-02, 2.973e-02, -5.040e-02, -6.046e-02, -3.364e-02, 2.287e-02, -3.193e-02, 4.584e-02, 3.559e-02, 9.996e-02, -1.737e-01)); + r += mul(s0_1, M4(1.244e-02, 1.086e-01, 5.084e-02, -9.225e-02, 3.146e-02, 5.506e-02, -2.089e-02, 4.840e-02, 2.297e-02, -3.274e-05, -5.653e-02, 3.252e-01, -6.403e-02, 1.261e-02, 1.052e-01, 6.297e-02)); + r += mul(s0_2, M4(1.698e-02, 8.388e-02, -3.422e-02, -1.496e-02, 1.081e-01, -6.162e-02, -5.071e-02, -1.067e-01, -8.022e-02, -3.184e-02, -2.127e-02, 9.637e-03, 3.873e-02, -1.251e-01, 1.333e-01, -7.872e-02)); + r += mul(s0_3, M4(-7.789e-02, -6.662e-02, 1.294e-01, -9.989e-02, -7.352e-02, -4.578e-02, -7.462e-02, 2.127e-03, -8.138e-02, 6.226e-02, -2.799e-02, -3.625e-02, 2.212e-01, -1.652e-01, 1.428e-01, 2.478e-01)); + r += mul(s0_4, M4(5.669e-03, -1.183e-01, 4.026e-02, -2.221e-01, 1.133e-02, 4.156e-02, 1.597e-01, 7.346e-02, -2.419e-03, -2.949e-02, 3.021e-01, 2.356e-01, -6.494e-03, -1.026e-01, -8.227e-02, 1.740e-02)); + r += mul(s0_5, M4(-2.167e-01, 1.039e-01, -5.977e-02, -9.074e-03, -1.117e-01, 4.771e-02, 1.119e-01, 1.650e-01, -1.064e-01, -3.939e-02, 2.190e-02, 1.414e-01, 2.592e-02, 7.613e-02, -2.695e-02, -5.662e-02)); + r += mul(s0_6, M4(6.803e-02, -1.202e-01, -3.315e-03, 1.625e-01, -1.301e-01, -1.277e-02, -1.577e-01, 5.537e-02, 1.052e-01, 2.325e-01, 2.426e-02, -1.439e-01, 7.457e-02, -8.714e-02, 2.378e-01, 1.292e-02)); + r += mul(s0_7, M4(-1.714e-01, -3.724e-02, 1.219e-01, 1.407e-01, -1.354e-01, 1.838e-02, 2.183e-02, 7.493e-02, 7.883e-02, -5.048e-02, 4.846e-02, -1.183e-01, -2.238e-01, 9.183e-02, -1.035e-01, 4.537e-02)); + r += mul(s0_8, M4(-9.619e-02, 7.385e-02, -3.486e-02, 1.845e-02, -7.486e-02, 6.599e-02, -5.713e-02, 6.247e-02, -4.777e-02, -1.458e-02, 1.130e-02, -1.824e-02, 8.031e-02, -1.837e-02, -1.499e-01, 7.544e-02)); + r += mul(s1_0, M4(3.624e-02, 1.283e-01, -5.294e-02, -5.316e-04, -1.742e-01, 2.873e-02, -1.543e-01, -7.869e-02, -1.277e-01, 1.693e-02, 1.002e-02, 4.104e-02, -1.437e-02, -4.580e-02, -1.460e-01, 3.390e-02)); + r += mul(s1_1, M4(6.177e-02, 4.738e-02, -1.577e-02, 3.133e-03, -2.669e-02, 2.046e-01, -6.449e-02, -4.281e-02, -2.132e-02, 3.419e-02, -2.680e-02, 1.263e-01, -1.479e-03, 2.514e-02, 2.780e-02, 1.013e-01)); + r += mul(s1_2, M4(1.366e-02, 1.883e-02, 4.764e-02, 1.359e-01, -1.593e-02, -4.673e-02, -8.732e-02, -9.512e-02, -1.047e-01, -4.604e-02, -1.665e-02, 1.337e-01, -1.242e-02, 9.301e-02, -2.295e-02, 3.417e-02)); + r += mul(s1_3, M4(-1.517e-02, -3.551e-02, 4.704e-02, 7.443e-03, -1.477e-01, 3.772e-02, 1.282e-01, 1.508e-01, -7.728e-02, 1.692e-02, 4.276e-02, 7.591e-02, 1.067e-02, -4.369e-02, -5.641e-02, 9.330e-02)); + r += mul(s1_4, M4(4.017e-03, -2.550e-02, 5.103e-02, -2.922e-02, 6.819e-02, -1.601e-01, 3.182e-01, 1.085e-01, -8.375e-02, -1.219e-01, 1.285e-01, 9.498e-02, -5.342e-02, -8.636e-02, -7.220e-02, 2.510e-03)); + r += mul(s1_5, M4(-7.125e-02, 4.059e-02, -9.271e-02, 1.242e-02, -6.271e-02, 4.583e-02, 2.297e-01, 1.034e-01, -9.418e-02, -1.697e-01, -3.932e-02, -4.783e-02, -7.415e-02, 2.491e-02, -7.569e-03, 2.422e-02)); + r += mul(s1_6, M4(3.736e-02, -8.572e-02, 3.994e-02, 4.105e-02, -3.034e-02, 1.062e-01, -4.819e-02, 8.814e-02, 8.113e-02, 2.036e-01, 4.791e-02, -1.842e-01, 6.856e-02, -3.210e-02, 7.227e-03, -8.558e-02)); + r += mul(s1_7, M4(-1.797e-01, -2.560e-01, 1.961e-02, -5.501e-02, -1.478e-01, -1.228e-01, 2.369e-02, 1.566e-02, 6.271e-02, -3.219e-02, 3.045e-02, -7.925e-02, -2.949e-03, 1.436e-01, 1.822e-03, -3.287e-02)); + r += mul(s1_8, M4(-7.270e-02, -6.270e-02, -7.584e-02, -6.560e-02, -5.748e-02, 4.359e-02, 5.897e-02, -5.726e-02, 1.690e-02, -7.352e-02, -1.782e-02, -8.810e-02, -3.535e-02, -2.069e-02, -4.821e-02, 2.636e-02)); + r += mul(s2_0, M4(-2.083e-02, -2.477e-02, 7.071e-02, -4.785e-02, -3.290e-02, -9.460e-02, 7.853e-03, -1.785e-01, -1.315e-01, -1.173e-01, 9.080e-03, -3.729e-02, 6.511e-02, 4.687e-02, 7.942e-02, 9.895e-02)); + r += mul(s2_1, M4(-5.864e-02, -7.510e-02, -4.419e-02, -5.842e-02, 2.984e-01, 4.923e-02, 4.713e-02, -7.945e-02, -1.234e-01, -3.238e-02, -1.697e-02, 6.394e-02, -1.147e-01, 1.948e-01, 7.497e-02, 1.001e-01)); + r += mul(s2_2, M4(3.748e-02, -1.411e-01, 2.326e-02, 7.799e-02, 2.809e-03, 6.622e-03, 2.647e-02, -1.618e-01, 6.017e-02, -7.081e-02, -1.233e-02, 1.621e-01, 1.593e-02, 1.733e-01, 2.370e-01, -8.014e-02)); + r += mul(s2_3, M4(-6.741e-02, -3.408e-02, -1.608e-01, 3.781e-02, -1.464e-01, -1.036e-01, -1.046e-01, 1.298e-01, -5.866e-03, 5.742e-02, 2.522e-02, 2.219e-02, -1.086e-01, -2.096e-02, -2.311e-02, -4.706e-02)); + r += mul(s2_4, M4(4.554e-02, -2.465e-02, -7.264e-02, 6.134e-02, 1.440e-02, 3.166e-02, 2.649e-01, 1.871e-01, -3.898e-02, 4.163e-02, -5.572e-02, -1.161e-01, -2.489e-01, 6.822e-02, 4.626e-03, 1.167e-01)); + r += mul(s2_5, M4(-9.042e-03, -7.050e-02, 4.928e-03, 7.088e-02, 6.400e-02, 2.114e-01, -3.590e-03, -5.971e-02, 6.975e-02, 4.664e-02, 8.553e-02, -5.178e-02, 7.938e-02, -1.139e-01, -1.323e-01, -3.062e-02)); + r += mul(s2_6, M4(-6.992e-02, 9.754e-03, 2.215e-01, -3.585e-03, -1.091e-01, -1.363e-01, 7.880e-02, -2.762e-02, -9.997e-02, 2.966e-03, 3.448e-02, -1.366e-01, -1.227e-01, 1.809e-02, 1.784e-01, 1.268e-02)); + r += mul(s2_7, M4(-5.271e-02, -4.306e-02, 5.939e-04, 4.301e-02, -9.889e-02, 8.578e-04, -3.276e-02, -4.598e-02, -6.198e-02, -1.495e-01, 6.664e-02, -9.525e-02, 8.331e-03, 2.550e-03, -3.578e-02, 1.648e-02)); + r += mul(s2_8, M4(-2.549e-02, 3.285e-02, -3.637e-02, 4.108e-02, -6.827e-03, 4.565e-02, 2.817e-02, -3.361e-03, -2.407e-02, 1.267e-01, 5.727e-03, 1.873e-02, -7.541e-03, 6.248e-02, 8.835e-02, -7.862e-02)); + r += mul(s3_0, M4(5.343e-02, 2.287e-02, -5.620e-02, -2.606e-02, -2.511e-01, -7.720e-02, 9.825e-02, -2.432e-01, -5.303e-02, 2.462e-02, -1.625e-01, 3.261e-02, -3.086e-02, -6.193e-02, -1.012e-02, 1.096e-01)); + r += mul(s3_1, M4(-7.270e-02, 1.129e-01, 5.661e-02, 3.421e-02, 2.881e-01, -1.025e-01, 1.285e-02, -9.748e-02, -1.924e-02, 1.131e-01, 1.275e-01, 7.935e-02, 1.309e-01, -2.821e-02, 7.106e-02, 4.430e-02)); + r += mul(s3_2, M4(1.970e-02, -1.399e-01, 1.240e-01, 1.530e-01, -7.961e-02, -2.087e-02, -8.064e-02, -2.028e-01, -2.397e-02, 3.444e-02, -3.574e-02, 2.877e-02, 3.491e-02, 1.069e-01, 4.066e-02, -1.734e-02)); + r += mul(s3_3, M4(-7.098e-02, -3.545e-02, -2.872e-01, 4.210e-02, -2.199e-01, -1.064e-01, 1.770e-02, 1.409e-01, 1.472e-01, 6.215e-02, 3.474e-02, 8.492e-03, -1.342e-01, -5.386e-02, -7.196e-02, -1.235e-01)); + r += mul(s3_4, M4(2.290e-01, 2.270e-01, -3.990e-02, 1.824e-01, 1.359e-01, -6.382e-03, 2.662e-01, 1.919e-01, 1.891e-01, -7.892e-02, 1.116e-03, -2.814e-02, -2.490e-03, -8.516e-02, 6.357e-04, -1.859e-02)); + r += mul(s3_5, M4(7.154e-03, -7.141e-02, -5.607e-02, 8.124e-02, 1.304e-01, 6.471e-02, 5.742e-02, -7.536e-02, 8.766e-02, 8.102e-02, 4.359e-02, -7.945e-02, 8.818e-02, 5.471e-02, -9.640e-02, -2.967e-02)); + r += mul(s3_6, M4(3.370e-02, 1.582e-02, 2.462e-01, 8.418e-03, -1.115e-01, -1.536e-01, 2.464e-01, 4.604e-02, -1.071e-01, 1.075e-01, 4.826e-02, -6.138e-02, -1.089e-01, 1.311e-01, -1.740e-02, 1.328e-01)); + r += mul(s3_7, M4(4.537e-03, 8.950e-02, -2.725e-02, 6.522e-02, -1.668e-01, -9.552e-03, -4.403e-02, 2.931e-02, -2.110e-02, -4.998e-02, 7.868e-02, -6.865e-02, -2.296e-04, -1.233e-01, 1.752e-02, 9.049e-02)); + r += mul(s3_8, M4(7.438e-02, 1.333e-01, -5.143e-02, 7.645e-02, -1.764e-03, -1.389e-03, 9.569e-02, 8.844e-02, 6.421e-02, 8.276e-02, -3.275e-03, 5.360e-02, -2.844e-02, 2.104e-02, 1.068e-02, 4.859e-02)); + r += mul(s4_0, M4(-4.425e-02, -5.100e-03, -7.722e-03, -7.258e-02, -9.065e-02, -8.428e-02, -1.687e-01, -2.043e-01, -1.566e-02, 3.501e-02, -1.156e-01, 3.190e-02, -5.824e-01, 2.117e-01, -5.630e-01, 3.386e-01)); + r += mul(s4_1, M4(-2.990e-02, 2.483e-02, -3.320e-02, -3.348e-02, 3.499e-02, 8.377e-02, 1.786e-02, -1.637e-01, -5.283e-02, 4.014e-02, 6.757e-03, 1.080e-01, -1.626e-01, 2.261e-01, -7.782e-02, 8.233e-02)); + r += mul(s4_2, M4(-7.580e-02, 1.262e-01, 4.438e-03, 2.820e-02, -6.883e-02, 2.340e-01, -1.141e-01, -4.504e-02, -1.191e-01, -1.533e-02, 5.940e-02, 7.691e-02, 1.531e-01, 1.699e-02, -4.712e-02, 5.288e-02)); + r += mul(s4_3, M4(2.044e-02, 5.780e-02, 3.308e-02, 2.426e-01, 3.624e-02, -8.043e-02, -1.236e-01, -6.800e-04, 2.831e-02, -4.539e-02, 2.218e-01, -1.209e-01, -3.183e-01, -5.320e-02, -1.178e-01, -4.580e-01)); + r += mul(s4_4, M4(-6.078e-02, -1.130e-02, 7.346e-02, -2.086e-01, 4.780e-03, 2.893e-01, -3.576e-02, 7.024e-02, -2.882e-02, 3.997e-02, -7.593e-02, -1.394e-01, 1.736e-01, 3.615e-01, -4.872e-02, -2.340e-01)); + r += mul(s4_5, M4(-1.184e-01, 1.305e-02, 1.259e-01, -2.960e-02, -8.708e-02, 2.380e-01, 9.214e-02, -4.176e-02, 2.124e-02, 2.160e-02, -1.528e-01, -8.060e-02, -1.276e-01, 3.907e-02, -1.044e-01, -2.006e-01)); + r += mul(s4_6, M4(-8.076e-02, 7.261e-02, 1.449e-02, -3.624e-02, -1.490e-01, -2.071e-01, -4.868e-02, -9.661e-02, -1.495e-04, -7.154e-02, -5.241e-02, -1.307e-02, -4.913e-02, -1.356e-01, -2.297e-01, 2.350e-01)); + r += mul(s4_7, M4(-7.200e-02, 2.000e-01, 7.164e-02, -4.626e-02, -2.369e-02, 1.921e-01, 1.534e-02, -8.373e-02, -4.089e-02, 1.648e-02, 7.972e-02, -4.851e-02, 1.396e-02, -7.280e-02, -2.005e-02, 2.399e-01)); + r += mul(s4_8, M4(7.851e-02, 1.162e-01, -1.663e-01, -8.951e-02, 9.440e-02, 3.697e-02, -3.425e-02, -3.302e-02, 4.576e-02, -1.236e-02, 3.493e-02, -6.735e-02, -1.672e-02, 3.621e-03, 4.750e-02, 1.247e-01)); + r += mul(s5_0, M4(2.875e-02, -1.459e-02, -7.892e-02, -3.161e-02, -6.149e-03, -3.703e-02, 5.330e-02, -9.264e-03, -1.884e-01, 1.468e-01, -1.175e-01, -3.640e-02, 1.763e-02, -8.086e-03, -9.649e-02, -2.832e-03)); + r += mul(s5_1, M4(5.752e-02, -8.568e-02, 2.230e-02, -2.336e-02, -2.539e-02, -1.665e-01, 9.407e-02, 2.244e-02, -1.082e-01, 4.609e-01, -1.135e-01, -2.743e-01, 2.130e-02, -9.405e-03, -2.384e-02, 1.934e-02)); + r += mul(s5_2, M4(9.920e-02, -4.490e-02, -7.451e-03, 4.300e-02, -5.757e-02, 4.409e-02, 4.955e-02, 2.940e-02, 5.362e-02, 1.196e-01, 7.804e-02, -3.020e-01, 4.768e-02, -3.637e-02, -3.597e-02, 7.883e-02)); + r += mul(s5_3, M4(1.687e-02, 6.373e-02, -1.770e-01, 6.395e-02, 5.443e-02, -7.987e-03, -7.952e-02, 1.693e-02, 4.316e-02, 4.812e-02, 1.539e-01, 1.209e-01, 6.093e-02, 7.547e-02, -8.094e-02, -7.412e-02)); + r += mul(s5_4, M4(2.046e-01, -4.792e-02, -3.553e-02, -5.000e-02, 1.285e-02, 1.536e-01, 2.418e-02, 3.139e-02, -1.963e-02, 1.322e-01, -2.059e-01, 1.032e-01, 3.493e-02, -1.613e-01, 8.348e-03, -9.059e-02)); + r += mul(s5_5, M4(4.828e-03, -5.654e-02, 2.644e-02, -1.046e-01, -1.364e-01, -1.183e-02, 4.386e-02, -1.404e-02, 4.281e-02, 2.549e-02, -1.399e-01, 3.556e-02, -1.223e-02, 4.599e-02, 7.197e-02, 9.005e-03)); + r += mul(s5_6, M4(-3.068e-02, 1.637e-02, -3.605e-02, -2.284e-02, -8.174e-02, -8.312e-03, -1.846e-02, 6.306e-02, 1.487e-01, 2.973e-02, 4.767e-02, -1.547e-01, -3.608e-02, 5.432e-02, -1.291e-01, -6.812e-02)); + r += mul(s5_7, M4(8.072e-02, -8.949e-02, 1.318e-01, 3.961e-03, 5.239e-02, 7.092e-02, 5.027e-02, 8.323e-02, -8.531e-02, -9.251e-02, -1.205e-01, 1.944e-02, 3.560e-02, 1.352e-02, -7.741e-03, 9.714e-02)); + r += mul(s5_8, M4(-5.957e-03, -4.712e-02, -8.004e-02, 1.380e-03, 1.257e-02, -1.039e-01, 8.539e-02, 2.713e-02, 1.772e-01, -2.501e-01, -4.281e-02, -5.421e-02, -4.765e-02, -1.701e-02, -4.210e-03, -5.724e-02)); + r += mul(s6_0, M4(3.248e-01, -8.173e-02, -1.495e-02, 2.037e-01, 1.379e-04, -5.002e-02, 3.511e-02, 3.888e-02, -7.696e-02, 3.776e-02, -7.068e-02, 3.647e-02, -1.763e-01, -5.525e-02, -1.653e-03, -3.789e-02)); + r += mul(s6_1, M4(1.581e-01, 1.166e-01, -1.430e-01, 3.662e-01, 8.923e-03, -6.097e-02, -1.081e-01, 4.020e-03, 5.912e-02, -1.077e-01, 2.633e-02, 3.322e-02, -9.291e-03, -1.720e-01, -7.245e-02, 4.105e-02)); + r += mul(s6_2, M4(-2.491e-02, 7.043e-02, -2.281e-02, 9.317e-02, 5.158e-04, 2.068e-02, 3.190e-02, -2.739e-02, -2.196e-02, 6.502e-02, -3.907e-02, -7.474e-02, 2.471e-02, -1.875e-01, 2.229e-01, -3.467e-01)); + r += mul(s6_3, M4(1.787e-01, -1.382e-01, 1.516e-01, -7.465e-02, 1.683e-01, -1.877e-02, 1.229e-01, 5.404e-04, -4.836e-02, -6.131e-02, 1.219e-01, -6.233e-02, 8.620e-02, -5.384e-02, -1.505e-01, 1.688e-01)); + r += mul(s6_4, M4(-3.181e-02, 1.413e-01, 1.572e-01, -1.831e-01, -1.209e-01, -7.400e-02, -9.066e-02, -3.121e-02, 5.917e-02, -2.963e-02, -2.592e-02, 3.676e-02, 8.648e-02, 1.320e-01, -2.344e-01, -2.189e-01)); + r += mul(s6_5, M4(-5.787e-02, -3.066e-02, 1.830e-01, 4.347e-02, -8.943e-02, 7.870e-03, -2.022e-03, 2.099e-01, -1.212e-02, 6.373e-03, -1.052e-01, 6.339e-02, 3.479e-01, 1.135e-01, -3.867e-02, 1.417e-01)); + r += mul(s6_6, M4(-6.096e-02, -8.908e-02, 9.118e-02, 2.249e-02, 1.004e-01, 9.778e-02, 1.445e-01, 4.343e-02, 8.523e-02, -1.219e-02, 9.168e-02, 3.133e-02, -8.427e-02, -8.851e-02, -7.757e-02, -1.208e-01)); + r += mul(s6_7, M4(3.253e-02, -5.491e-05, 8.328e-03, 5.271e-02, 1.037e-02, -4.053e-02, 1.853e-02, 2.653e-06, 7.625e-02, -8.625e-02, 4.421e-02, 2.075e-03, 2.808e-02, -3.310e-02, -3.273e-01, -1.623e-01)); + r += mul(s6_8, M4(1.744e-01, 8.677e-02, -1.544e-01, 6.717e-02, -3.480e-02, 3.707e-02, 2.683e-02, -6.244e-03, -6.392e-02, 7.593e-02, 2.281e-02, -5.920e-02, -2.599e-01, -2.319e-01, 1.206e-01, -1.286e-02)); + r += mul(s7_0, M4(-7.140e-02, -8.283e-03, -3.386e-03, 6.842e-03, 5.496e-02, 1.178e-01, -8.400e-02, 6.142e-02, -9.335e-02, 2.164e-02, -5.461e-02, -1.402e-02, 7.100e-03, 2.545e-02, -7.884e-02, -3.492e-03)); + r += mul(s7_1, M4(1.466e-01, -1.069e-01, -7.955e-02, 6.205e-02, -5.911e-03, -2.119e-02, -1.017e-01, 5.296e-02, 1.210e-01, 1.498e-01, 1.012e-01, 4.255e-01, 9.488e-02, 5.354e-02, 2.343e-02, 8.102e-02)); + r += mul(s7_2, M4(4.775e-02, 9.955e-02, -5.355e-02, -2.145e-02, -7.153e-02, -6.200e-02, 9.512e-02, 6.380e-02, -6.797e-02, 8.805e-02, -5.872e-03, 1.400e-01, -2.788e-02, -1.014e-01, 1.960e-02, 1.287e-01)); + r += mul(s7_3, M4(-9.796e-02, 2.194e-02, 2.270e-02, -7.145e-02, 1.491e-01, 3.151e-02, 6.959e-02, -5.975e-03, 5.773e-02, -2.723e-02, 5.596e-02, -1.518e-01, -5.953e-03, 1.305e-01, -1.814e-02, -1.050e-02)); + r += mul(s7_4, M4(-1.528e-01, -1.884e-01, 9.503e-02, -1.620e-02, -4.942e-02, 1.145e-01, -3.125e-02, -4.450e-02, 8.714e-02, 8.496e-02, 1.369e-02, -1.238e-01, 8.809e-02, 1.352e-01, 6.701e-02, 9.438e-02)); + r += mul(s7_5, M4(-1.206e-02, 5.146e-02, 1.828e-02, 9.465e-02, -8.744e-02, 5.812e-02, 7.547e-02, -1.000e-01, -1.203e-01, 2.384e-01, 2.556e-01, -1.591e-01, -2.986e-02, 5.438e-02, -2.465e-03, -9.818e-02)); + r += mul(s7_6, M4(4.579e-02, 2.161e-02, -6.215e-02, -1.440e-01, -6.273e-02, 6.860e-02, 9.184e-02, -6.930e-02, -1.286e-01, -6.701e-02, -1.015e-01, 2.166e-02, -1.538e-03, -2.507e-02, -1.409e-03, -1.052e-02)); + r += mul(s7_7, M4(-7.298e-02, 4.161e-02, 7.292e-02, -3.918e-02, -2.996e-02, 9.260e-02, -5.889e-02, -3.589e-02, 1.480e-01, -9.639e-02, 7.466e-02, -1.959e-02, -3.891e-02, 1.057e-01, 2.922e-02, -1.112e-02)); + r += mul(s7_8, M4(1.070e-02, 9.460e-02, -7.803e-02, 4.756e-02, 8.328e-02, 9.591e-03, -4.323e-02, 2.402e-02, -6.350e-02, 1.936e-01, -1.345e-01, -2.261e-03, -4.487e-02, -1.049e-01, 1.739e-02, -3.981e-02)); + r += V4(8.304e-03, -2.532e-04, -1.555e-02, -1.432e-02); + return r; +} + +V4 f3(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(1.078e-01, 2.929e-02, -4.399e-02, 2.702e-02, 6.722e-02, -1.047e-02, -1.084e-01, 2.719e-02, -4.003e-03, 1.428e-01, -1.008e-02, 5.808e-02, 1.081e-01, 3.698e-02, -4.159e-03, -1.861e-01)); + r += mul(s0_1, M4(8.120e-02, 2.297e-02, 4.784e-02, -8.514e-02, -5.841e-02, 1.494e-02, 3.262e-02, 1.257e-01, -1.968e-01, -7.450e-02, -2.756e-02, 6.421e-02, -5.311e-02, 1.711e-02, -1.783e-01, 3.959e-02)); + r += mul(s0_2, M4(-1.281e-02, 1.102e-01, 3.957e-02, 6.161e-02, -8.052e-02, 6.213e-02, -8.612e-02, -6.793e-02, 6.211e-03, -2.778e-02, -1.110e-03, -5.723e-02, 2.321e-02, 2.555e-02, -3.891e-02, -1.486e-01)); + r += mul(s0_3, M4(-1.464e-01, 7.861e-02, -1.260e-01, 5.190e-02, 8.147e-03, -6.885e-03, -8.846e-03, -3.854e-02, -1.392e-01, 2.317e-01, -3.088e-02, 1.164e-01, -1.851e-01, -1.803e-01, -1.080e-01, -1.995e-01)); + r += mul(s0_4, M4(1.864e-02, 1.735e-01, -5.772e-02, -7.150e-02, -7.699e-02, 1.665e-01, 3.301e-02, 1.179e-01, 1.048e-03, -9.361e-02, -6.161e-02, 1.365e-01, -7.781e-02, -1.322e-01, 5.536e-02, -1.287e-01)); + r += mul(s0_5, M4(-4.569e-02, -1.306e-01, 2.393e-02, 2.645e-02, 7.168e-04, -7.162e-02, -1.541e-01, -1.313e-01, 1.223e-01, -3.704e-02, -7.348e-02, 1.347e-03, 2.109e-01, 2.540e-02, 1.008e-01, 2.662e-02)); + r += mul(s0_6, M4(-1.176e-01, 1.405e-02, -1.864e-01, -9.889e-02, -8.677e-03, 1.556e-02, 4.215e-02, 4.996e-03, -7.073e-02, -1.384e-01, 4.933e-02, -1.048e-01, -2.920e-01, 1.230e-04, -1.791e-02, -1.323e-01)); + r += mul(s0_7, M4(-2.167e-02, -7.215e-03, -7.007e-02, -4.031e-02, 4.548e-03, 1.588e-02, -1.684e-02, 5.793e-02, 1.591e-01, -1.459e-01, -3.494e-02, -1.860e-01, -4.195e-02, 6.560e-03, -3.848e-02, -2.633e-01)); + r += mul(s0_8, M4(-1.739e-01, -1.198e-02, 1.739e-02, -2.050e-02, -5.031e-02, -1.678e-02, 7.162e-02, -1.646e-01, 3.139e-01, 1.098e-02, 7.505e-02, -1.072e-01, -8.199e-02, 6.768e-02, -1.450e-01, -2.652e-02)); + r += mul(s1_0, M4(7.592e-02, -5.963e-03, 6.044e-02, 1.364e-02, 1.071e-01, -9.543e-02, -7.565e-02, -1.106e-01, 2.125e-02, 5.735e-02, 6.093e-02, 1.055e-01, 1.116e-01, -7.962e-03, -3.009e-03, -6.391e-02)); + r += mul(s1_1, M4(-7.453e-04, 7.908e-02, 4.528e-02, -6.497e-02, -2.141e-01, 2.905e-02, 8.608e-02, 1.562e-02, -1.183e-01, -3.749e-03, -2.178e-02, 4.636e-02, 6.602e-02, 4.420e-02, -2.969e-02, 9.028e-02)); + r += mul(s1_2, M4(3.744e-02, -1.737e-02, 1.961e-02, 7.493e-02, 4.715e-02, 3.037e-02, 5.145e-03, 6.723e-02, -4.315e-02, -4.398e-02, 9.488e-02, -6.029e-02, 9.366e-02, 1.707e-03, -6.647e-02, -7.819e-02)); + r += mul(s1_3, M4(-4.314e-02, -4.926e-02, -4.821e-02, -8.898e-02, -1.631e-01, -7.705e-02, 4.109e-02, 8.442e-02, -1.584e-02, 4.423e-02, -6.416e-02, 2.429e-02, 7.325e-03, 1.435e-02, 1.782e-02, 2.860e-02)); + r += mul(s1_4, M4(5.343e-02, -4.696e-02, -3.947e-03, -1.846e-01, -3.936e-01, 2.581e-01, 3.814e-01, 2.552e-01, -1.361e-01, 6.894e-02, -6.958e-02, 7.073e-02, -1.028e-01, 1.209e-01, 1.421e-01, 3.052e-02)); + r += mul(s1_5, M4(-8.137e-02, -4.554e-02, -2.349e-02, 7.019e-02, 2.163e-01, -5.918e-02, 9.712e-02, 2.483e-01, 2.473e-02, 1.502e-02, -6.365e-02, -1.746e-01, -4.358e-02, 4.468e-02, -1.093e-01, 2.473e-02)); + r += mul(s1_6, M4(6.200e-02, -1.142e-01, 7.615e-02, -8.188e-03, 8.007e-02, -9.960e-02, 1.362e-01, -1.422e-02, -1.122e-01, -2.014e-02, -1.420e-01, -6.422e-02, 5.698e-02, 2.293e-02, 1.661e-02, 4.720e-02)); + r += mul(s1_7, M4(-4.076e-02, -4.555e-02, 3.997e-02, -4.453e-02, -9.484e-02, -2.221e-04, 8.423e-02, 7.494e-02, 2.933e-02, -1.380e-01, -4.507e-02, -5.689e-02, -6.361e-02, 4.682e-02, 7.517e-02, 2.378e-02)); + r += mul(s1_8, M4(5.169e-02, 3.204e-02, -7.214e-02, 2.993e-02, 4.542e-02, 2.339e-02, 1.878e-01, -7.268e-02, 1.460e-01, 1.770e-02, 4.084e-02, 6.963e-02, 2.724e-02, 1.184e-03, 8.351e-02, 1.108e-02)); + r += mul(s2_0, M4(-1.266e-02, -4.814e-02, 1.091e-01, 4.787e-02, 2.054e-03, -1.421e-01, -2.946e-02, -1.552e-02, 2.241e-02, 1.130e-01, -1.465e-02, 3.170e-03, -2.013e-01, 1.541e-01, -4.007e-02, -5.746e-02)); + r += mul(s2_1, M4(6.318e-02, 1.825e-01, 5.007e-02, 6.417e-02, -8.822e-02, -1.965e-01, -8.122e-02, 8.083e-02, 1.451e-01, 9.234e-02, 1.458e-02, 3.394e-03, 1.371e-01, -1.556e-01, 3.232e-03, -3.001e-01)); + r += mul(s2_2, M4(-1.333e-01, 4.256e-02, 8.831e-03, 6.197e-02, 7.894e-03, -7.217e-02, 7.846e-02, -1.896e-02, -5.892e-02, 1.073e-01, 1.912e-03, -3.306e-02, 1.492e-01, 6.274e-02, -1.672e-01, -1.554e-01)); + r += mul(s2_3, M4(-1.282e-02, 9.536e-02, 1.442e-03, 5.785e-02, -8.516e-02, 8.072e-03, -7.036e-02, -1.333e-01, -1.173e-01, 2.519e-02, 2.043e-01, 3.421e-03, -9.203e-02, 1.001e-01, -5.736e-02, 2.982e-01)); + r += mul(s2_4, M4(1.993e-03, 1.229e-01, 5.297e-02, -1.077e-01, 1.427e-01, 8.361e-02, 2.030e-01, 5.532e-02, 1.776e-02, -5.811e-02, 6.569e-03, -1.229e-01, -8.695e-03, -6.819e-03, 1.661e-01, 2.228e-01)); + r += mul(s2_5, M4(-4.533e-02, -1.245e-02, 3.212e-02, -5.504e-02, 8.230e-02, 5.109e-02, 1.173e-02, -9.066e-02, -1.094e-01, 7.413e-03, 8.526e-02, 3.235e-02, -4.342e-03, 3.551e-02, 1.901e-01, -5.356e-02)); + r += mul(s2_6, M4(8.229e-02, 9.509e-04, -2.815e-02, -4.377e-02, 3.677e-02, -3.288e-02, 3.554e-02, -2.960e-02, 1.177e-01, -3.922e-02, 1.236e-01, 4.912e-02, -7.920e-02, 4.889e-03, 6.535e-02, 5.023e-03)); + r += mul(s2_7, M4(9.450e-02, -4.877e-02, 2.180e-02, 5.390e-02, -7.268e-02, 5.576e-02, 7.790e-02, 7.471e-02, 1.869e-01, 4.203e-02, 3.673e-02, -2.178e-02, 3.943e-03, -7.662e-03, -2.875e-02, -7.668e-02)); + r += mul(s2_8, M4(-8.520e-02, -7.359e-02, -1.834e-02, -3.821e-02, -9.685e-02, 3.117e-02, 8.558e-02, 6.373e-02, 2.420e-02, -5.133e-02, 1.106e-01, -2.596e-02, 2.014e-02, 5.579e-02, 1.153e-02, 1.782e-01)); + r += mul(s3_0, M4(1.409e-01, -2.383e-02, 8.639e-02, -3.019e-02, 1.619e-02, -1.529e-01, -1.008e-01, -1.410e-02, -3.718e-03, 3.788e-03, -4.983e-02, -1.016e-02, 1.156e-02, 4.953e-05, 3.956e-02, -2.179e-02)); + r += mul(s3_1, M4(-7.084e-02, 4.899e-02, 6.816e-03, -2.448e-01, -7.345e-02, -3.557e-01, 7.551e-02, -8.657e-03, 6.795e-02, 5.192e-02, -3.077e-02, 1.232e-01, 2.197e-02, -5.256e-02, 4.122e-03, 1.707e-02)); + r += mul(s3_2, M4(-2.774e-01, 5.557e-02, 1.514e-01, 2.173e-02, 1.189e-01, 1.642e-02, 8.372e-02, -2.661e-01, 3.143e-02, 3.410e-02, 4.487e-02, -1.723e-02, 9.291e-02, -2.441e-02, -1.115e-01, -2.501e-02)); + r += mul(s3_3, M4(-1.631e-01, 8.468e-02, 1.434e-01, 1.023e-01, -3.229e-02, -3.164e-02, -2.104e-01, -3.320e-02, -1.149e-01, -3.901e-02, -6.834e-02, -1.947e-02, 1.840e-02, 1.051e-01, -4.235e-02, 2.019e-02)); + r += mul(s3_4, M4(-1.755e-01, 2.059e-01, 9.597e-02, -2.928e-02, 8.855e-02, 1.821e-02, 8.755e-02, 1.028e-01, -8.825e-02, -1.528e-01, -1.426e-01, 4.698e-02, -4.039e-02, 5.968e-02, 1.375e-01, 1.348e-02)); + r += mul(s3_5, M4(-2.542e-01, 4.282e-02, -1.192e-03, 4.731e-02, 2.510e-02, 1.486e-01, -1.245e-02, -5.749e-02, -9.773e-02, 6.700e-02, -1.882e-01, -4.323e-02, 1.196e-01, -4.808e-02, -1.725e-02, -4.272e-02)); + r += mul(s3_6, M4(4.213e-03, -7.704e-03, 3.259e-02, -2.062e-01, 1.587e-01, 1.062e-01, -1.548e-02, -3.156e-01, -1.016e-02, -3.972e-02, -4.383e-02, -2.585e-02, -5.732e-02, 1.351e-02, -2.787e-02, -9.469e-02)); + r += mul(s3_7, M4(-6.842e-02, -5.412e-02, -1.469e-02, -8.877e-02, -4.274e-02, 7.221e-02, 2.691e-02, 7.001e-02, 1.141e-01, 1.915e-03, -4.521e-02, 4.300e-04, 4.757e-02, 8.053e-02, 8.162e-02, 3.804e-02)); + r += mul(s3_8, M4(4.241e-02, -6.491e-03, -3.866e-02, 4.730e-02, 6.733e-02, 6.034e-02, 2.661e-02, 1.440e-01, -2.978e-03, 2.585e-02, -2.838e-02, 1.062e-02, -1.446e-02, 7.391e-02, 2.640e-02, -3.836e-02)); + r += mul(s4_0, M4(5.677e-02, -2.280e-01, -2.451e-02, -2.647e-02, -1.017e-03, 3.461e-02, -3.574e-02, -3.984e-02, 6.191e-02, 4.968e-02, 4.937e-02, 2.930e-02, -1.373e-01, -1.053e-01, -1.538e-01, 9.222e-02)); + r += mul(s4_1, M4(3.276e-02, 6.180e-02, 1.373e-01, 1.933e-01, 5.629e-02, 5.820e-02, 6.219e-02, -7.410e-02, -6.342e-02, 1.499e-01, -1.541e-02, -3.026e-02, 4.615e-01, 1.580e-01, 7.077e-02, -1.236e-01)); + r += mul(s4_2, M4(9.957e-02, 1.757e-03, -2.521e-02, -1.223e-01, 2.074e-01, 1.008e-02, -5.914e-02, 2.410e-02, 2.634e-02, 1.131e-01, 8.216e-02, 3.450e-02, 7.552e-02, 1.194e-01, -1.231e-01, 1.073e-01)); + r += mul(s4_3, M4(-1.172e-02, -4.300e-02, -3.565e-03, -1.941e-02, 3.217e-02, 7.148e-02, -8.495e-02, 5.670e-02, -2.033e-02, -1.364e-01, 3.429e-02, -2.695e-02, 5.680e-01, -8.805e-02, -1.195e-01, 5.252e-01)); + r += mul(s4_4, M4(-2.671e-02, -3.016e-01, -3.329e-02, 6.906e-02, 9.063e-02, 8.925e-02, -1.415e-01, -1.619e-01, -9.870e-02, -2.667e-01, -2.157e-02, 5.647e-02, -2.261e-01, 2.456e-01, -6.064e-02, 6.518e-02)); + r += mul(s4_5, M4(2.888e-02, -5.659e-02, 1.779e-01, 4.198e-02, 6.701e-02, 5.891e-02, -1.460e-01, 2.943e-01, 6.448e-02, -6.878e-02, -4.030e-02, -1.031e-01, 1.665e-01, 5.578e-02, 1.881e-02, 1.418e-01)); + r += mul(s4_6, M4(-1.263e-01, -2.191e-01, 1.366e-01, 1.068e-01, -5.129e-02, -6.460e-02, 5.811e-02, -6.006e-02, -2.854e-02, 2.742e-02, 8.994e-03, -1.187e-02, -7.366e-01, -2.287e-01, -6.164e-01, 1.882e-02)); + r += mul(s4_7, M4(2.390e-01, -8.987e-02, 8.313e-02, 2.841e-01, -1.874e-01, 1.459e-01, -2.012e-01, -4.406e-02, -1.596e-01, 4.841e-02, -1.880e-02, -6.834e-02, 2.578e-02, 1.440e-01, 2.849e-01, -1.272e-01)); + r += mul(s4_8, M4(3.170e-02, 3.228e-02, 6.340e-02, 2.932e-02, -6.048e-02, 3.031e-02, -7.810e-02, -4.953e-02, -1.134e-01, 2.523e-02, 1.023e-01, 6.335e-02, -1.582e-01, 2.533e-03, -1.131e-01, -6.075e-03)); + r += mul(s5_0, M4(4.625e-02, -3.412e-04, -1.077e-02, 9.450e-03, -1.525e-04, 2.312e-02, 2.327e-02, 1.667e-02, 3.442e-03, 1.683e-01, -3.592e-02, 8.428e-03, -1.301e-02, -1.088e-02, 1.010e-01, 9.448e-02)); + r += mul(s5_1, M4(3.945e-02, 2.023e-01, 1.848e-02, 4.163e-02, 5.773e-02, -2.633e-02, 7.292e-02, 1.495e-02, 5.110e-02, -9.728e-03, 3.200e-02, 3.356e-02, -4.969e-02, 1.035e-01, 3.067e-02, -5.841e-03)); + r += mul(s5_2, M4(-1.150e-01, 5.962e-02, 2.455e-03, -6.986e-02, 7.313e-02, -9.049e-02, 8.998e-02, -3.317e-02, -6.195e-02, 1.728e-01, -1.896e-02, 2.274e-02, 1.186e-02, 1.671e-02, -4.866e-02, -1.200e-03)); + r += mul(s5_3, M4(8.141e-03, 6.878e-02, -2.976e-02, 2.621e-02, 1.784e-01, 1.248e-02, -6.853e-03, -1.927e-03, 2.433e-01, 7.125e-02, -5.810e-02, -2.757e-01, -9.888e-02, -7.193e-02, 7.867e-03, 2.181e-02)); + r += mul(s5_4, M4(-2.204e-02, -1.130e-01, -7.535e-02, -2.516e-02, 1.713e-01, 5.264e-03, 4.772e-02, -5.924e-02, -2.486e-01, 1.055e-01, 1.328e-01, -2.502e-02, 5.369e-02, 6.078e-03, 1.386e-01, -6.224e-02)); + r += mul(s5_5, M4(-3.905e-02, 5.261e-02, -2.165e-03, -1.201e-01, 1.096e-05, -9.632e-02, 9.782e-02, -8.054e-02, -1.451e-01, 5.762e-02, 1.816e-01, 3.270e-01, 1.616e-01, -2.044e-02, -4.551e-02, 4.272e-02)); + r += mul(s5_6, M4(-8.485e-02, -1.450e-01, -3.045e-02, 1.074e-01, 2.179e-03, -3.846e-02, -1.863e-02, 1.871e-02, 5.108e-02, 6.767e-02, 1.797e-01, 1.684e-02, -6.264e-02, -1.048e-01, 7.191e-02, -6.097e-02)); + r += mul(s5_7, M4(-2.142e-02, 4.408e-02, 2.998e-02, -1.032e-01, -1.759e-01, -7.314e-02, -1.102e-01, -1.872e-02, 2.373e-01, -1.447e-01, 2.624e-03, -4.420e-02, 1.146e-01, 2.988e-02, 4.577e-02, -3.427e-02)); + r += mul(s5_8, M4(-6.060e-02, 1.362e-02, 2.039e-02, 1.276e-02, 1.533e-01, 7.360e-03, 4.864e-02, -1.255e-01, 1.827e-01, 1.825e-01, -6.931e-03, -4.778e-02, -6.961e-03, -9.526e-02, 7.587e-02, 3.179e-02)); + r += mul(s6_0, M4(-1.902e-01, -5.660e-02, -4.673e-02, -3.461e-02, -8.106e-02, -1.420e-03, -5.476e-02, -3.773e-02, 5.253e-02, 1.304e-01, 3.423e-02, 5.212e-02, -1.079e-01, 3.761e-02, -1.416e-02, 1.585e-01)); + r += mul(s6_1, M4(-6.599e-02, 2.471e-02, -1.303e-01, 4.336e-02, -1.889e-02, 1.351e-02, -1.452e-02, 1.405e-02, -9.896e-02, -5.456e-02, 9.939e-02, -5.145e-02, -3.063e-01, 2.081e-01, -3.441e-01, -1.881e-01)); + r += mul(s6_2, M4(4.816e-02, 3.052e-02, -1.526e-03, 4.331e-02, 3.285e-02, -4.175e-03, 2.715e-02, 9.212e-03, 8.280e-02, -4.270e-02, 7.012e-02, -1.039e-01, 5.353e-02, 1.396e-01, 1.261e-01, 1.622e-02)); + r += mul(s6_3, M4(2.246e-02, -2.545e-02, 9.849e-03, -2.770e-02, -1.433e-01, 5.388e-02, 3.819e-03, 7.418e-02, -9.538e-02, -3.039e-02, 2.717e-02, 3.077e-02, -9.002e-02, -4.116e-02, 1.307e-01, 2.951e-02)); + r += mul(s6_4, M4(-4.712e-02, -1.267e-01, 1.696e-01, 2.844e-01, 1.727e-01, 8.386e-02, -4.416e-02, -6.215e-02, -7.953e-02, 3.334e-02, -1.312e-01, -3.992e-03, -4.352e-01, -3.749e-02, -1.048e-01, -1.854e-01)); + r += mul(s6_5, M4(1.837e-01, 1.530e-01, 2.316e-03, 1.271e-03, -4.068e-02, 6.315e-02, 1.070e-01, -2.652e-02, 2.268e-03, 5.209e-02, -4.338e-02, -8.105e-02, -3.716e-01, 3.706e-01, -4.535e-01, 4.897e-02)); + r += mul(s6_6, M4(-1.581e-01, 2.024e-02, 1.671e-02, 6.905e-02, 9.779e-02, 3.306e-03, -3.781e-02, 5.754e-02, 1.739e-02, 9.850e-02, -3.945e-02, -4.551e-02, 6.723e-02, -1.263e-01, 1.761e-01, -6.037e-03)); + r += mul(s6_7, M4(7.310e-04, 4.816e-02, -1.714e-01, -7.055e-02, -3.067e-03, -6.569e-02, 1.492e-01, 8.049e-02, -6.071e-02, 3.919e-02, 8.535e-02, 1.471e-01, 1.040e-01, -6.098e-02, -1.973e-01, -6.420e-02)); + r += mul(s6_8, M4(3.342e-02, 1.310e-01, -4.144e-02, 1.077e-01, 1.826e-01, -3.139e-02, -5.015e-02, -2.887e-02, 5.592e-03, -1.517e-02, -7.853e-02, 1.861e-02, 2.662e-03, 3.045e-01, -2.314e-01, 6.279e-01)); + r += mul(s7_0, M4(5.693e-02, 8.945e-02, 2.642e-02, 1.688e-01, -1.557e-01, -5.788e-02, -5.250e-02, -8.901e-02, 2.862e-01, -7.066e-02, 1.859e-02, 2.941e-01, 5.849e-02, -6.006e-02, -1.287e-02, 3.286e-02)); + r += mul(s7_1, M4(-4.778e-02, -5.997e-02, -9.390e-02, -6.606e-02, 6.563e-02, 3.327e-02, 9.178e-02, -2.724e-02, -3.661e-01, -2.215e-02, -1.827e-01, 1.863e-01, -4.644e-02, -1.734e-02, -6.994e-02, 3.454e-02)); + r += mul(s7_2, M4(-4.597e-02, -9.081e-02, 5.254e-03, -8.460e-03, -5.847e-02, -2.472e-02, 6.248e-02, -6.373e-02, 2.489e-01, -5.080e-02, 1.111e-01, -3.054e-01, -1.587e-01, 1.984e-02, 7.628e-02, -2.618e-02)); + r += mul(s7_3, M4(-8.152e-02, -9.300e-02, 2.128e-01, 1.161e-01, 2.329e-01, -1.434e-02, 1.939e-01, -1.737e-01, 1.001e-01, 4.390e-02, -1.567e-02, 7.235e-02, 9.783e-02, -1.181e-02, -1.044e-01, -3.693e-03)); + r += mul(s7_4, M4(6.171e-02, 9.395e-02, -1.146e-02, -1.124e-01, 5.917e-02, 1.169e-02, -1.257e-01, 1.246e-01, 2.802e-02, -4.437e-02, 1.409e-01, -2.917e-02, -7.506e-02, -6.381e-03, 9.039e-02, -1.398e-01)); + r += mul(s7_5, M4(-1.411e-01, -6.319e-02, 3.546e-02, -2.351e-02, 3.979e-02, -3.030e-02, 6.296e-03, -4.836e-02, -4.265e-03, -2.079e-01, 1.140e-01, 1.732e-02, -1.823e-01, 2.664e-02, 9.901e-02, -4.536e-02)); + r += mul(s7_6, M4(-7.358e-02, -4.715e-03, 3.243e-03, 1.332e-01, 1.156e-01, 2.452e-02, 2.582e-01, -8.717e-02, 5.893e-02, -6.813e-02, -1.045e-01, -6.077e-02, 6.702e-02, -4.179e-02, 4.494e-04, 3.716e-03)); + r += mul(s7_7, M4(9.210e-02, -8.261e-03, 2.497e-02, -1.238e-01, -1.281e-01, 2.690e-02, -8.240e-02, -1.425e-01, -3.485e-02, -6.733e-03, -3.941e-02, -9.975e-02, 6.695e-05, 2.079e-02, 1.967e-02, -3.847e-03)); + r += mul(s7_8, M4(1.172e-02, -5.997e-02, -9.893e-02, 1.800e-02, 1.765e-01, 6.485e-02, -1.316e-03, -1.296e-01, -5.434e-02, -5.654e-02, -7.644e-02, 9.541e-02, 9.991e-02, -7.341e-02, -2.527e-02, -1.281e-02)); + r += V4(1.567e-02, -5.316e-03, 4.092e-02, 2.983e-02); + return r; +} + +void Pass9(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = Rmp8x8(tid.x) + blockStart; + uint2 size = GetInputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = (gxy + 0.5) * pt; + + V4 s0_0 = l0(-1.0, -1.0); + V4 s0_1 = l0(0.0, -1.0); + V4 s0_2 = l0(1.0, -1.0); + V4 s0_3 = l0(-1.0, 0.0); + V4 s0_4 = l0(0.0, 0.0); + V4 s0_5 = l0(1.0, 0.0); + V4 s0_6 = l0(-1.0, 1.0); + V4 s0_7 = l0(0.0, 1.0); + V4 s0_8 = l0(1.0, 1.0); + V4 s1_0 = -max(-s0_0, 0.0); + V4 s1_1 = -max(-s0_1, 0.0); + V4 s1_2 = -max(-s0_2, 0.0); + V4 s1_3 = -max(-s0_3, 0.0); + V4 s1_4 = -max(-s0_4, 0.0); + V4 s1_5 = -max(-s0_5, 0.0); + V4 s1_6 = -max(-s0_6, 0.0); + V4 s1_7 = -max(-s0_7, 0.0); + V4 s1_8 = -max(-s0_8, 0.0); + s0_0 = max(s0_0, 0.0); + s0_1 = max(s0_1, 0.0); + s0_2 = max(s0_2, 0.0); + s0_3 = max(s0_3, 0.0); + s0_4 = max(s0_4, 0.0); + s0_5 = max(s0_5, 0.0); + s0_6 = max(s0_6, 0.0); + s0_7 = max(s0_7, 0.0); + s0_8 = max(s0_8, 0.0); + + V4 s2_0 = l1(-1.0, -1.0); + V4 s2_1 = l1(0.0, -1.0); + V4 s2_2 = l1(1.0, -1.0); + V4 s2_3 = l1(-1.0, 0.0); + V4 s2_4 = l1(0.0, 0.0); + V4 s2_5 = l1(1.0, 0.0); + V4 s2_6 = l1(-1.0, 1.0); + V4 s2_7 = l1(0.0, 1.0); + V4 s2_8 = l1(1.0, 1.0); + V4 s3_0 = -max(-s2_0, 0.0); + V4 s3_1 = -max(-s2_1, 0.0); + V4 s3_2 = -max(-s2_2, 0.0); + V4 s3_3 = -max(-s2_3, 0.0); + V4 s3_4 = -max(-s2_4, 0.0); + V4 s3_5 = -max(-s2_5, 0.0); + V4 s3_6 = -max(-s2_6, 0.0); + V4 s3_7 = -max(-s2_7, 0.0); + V4 s3_8 = -max(-s2_8, 0.0); + s2_0 = max(s2_0, 0.0); + s2_1 = max(s2_1, 0.0); + s2_2 = max(s2_2, 0.0); + s2_3 = max(s2_3, 0.0); + s2_4 = max(s2_4, 0.0); + s2_5 = max(s2_5, 0.0); + s2_6 = max(s2_6, 0.0); + s2_7 = max(s2_7, 0.0); + s2_8 = max(s2_8, 0.0); + + V4 s4_0 = l2(-1.0, -1.0); + V4 s4_1 = l2(0.0, -1.0); + V4 s4_2 = l2(1.0, -1.0); + V4 s4_3 = l2(-1.0, 0.0); + V4 s4_4 = l2(0.0, 0.0); + V4 s4_5 = l2(1.0, 0.0); + V4 s4_6 = l2(-1.0, 1.0); + V4 s4_7 = l2(0.0, 1.0); + V4 s4_8 = l2(1.0, 1.0); + V4 s5_0 = -max(-s4_0, 0.0); + V4 s5_1 = -max(-s4_1, 0.0); + V4 s5_2 = -max(-s4_2, 0.0); + V4 s5_3 = -max(-s4_3, 0.0); + V4 s5_4 = -max(-s4_4, 0.0); + V4 s5_5 = -max(-s4_5, 0.0); + V4 s5_6 = -max(-s4_6, 0.0); + V4 s5_7 = -max(-s4_7, 0.0); + V4 s5_8 = -max(-s4_8, 0.0); + s4_0 = max(s4_0, 0.0); + s4_1 = max(s4_1, 0.0); + s4_2 = max(s4_2, 0.0); + s4_3 = max(s4_3, 0.0); + s4_4 = max(s4_4, 0.0); + s4_5 = max(s4_5, 0.0); + s4_6 = max(s4_6, 0.0); + s4_7 = max(s4_7, 0.0); + s4_8 = max(s4_8, 0.0); + + V4 s6_0 = l3(-1.0, -1.0); + V4 s6_1 = l3(0.0, -1.0); + V4 s6_2 = l3(1.0, -1.0); + V4 s6_3 = l3(-1.0, 0.0); + V4 s6_4 = l3(0.0, 0.0); + V4 s6_5 = l3(1.0, 0.0); + V4 s6_6 = l3(-1.0, 1.0); + V4 s6_7 = l3(0.0, 1.0); + V4 s6_8 = l3(1.0, 1.0); + V4 s7_0 = -max(-s6_0, 0.0); + V4 s7_1 = -max(-s6_1, 0.0); + V4 s7_2 = -max(-s6_2, 0.0); + V4 s7_3 = -max(-s6_3, 0.0); + V4 s7_4 = -max(-s6_4, 0.0); + V4 s7_5 = -max(-s6_5, 0.0); + V4 s7_6 = -max(-s6_6, 0.0); + V4 s7_7 = -max(-s6_7, 0.0); + V4 s7_8 = -max(-s6_8, 0.0); + s6_0 = max(s6_0, 0.0); + s6_1 = max(s6_1, 0.0); + s6_2 = max(s6_2, 0.0); + s6_3 = max(s6_3, 0.0); + s6_4 = max(s6_4, 0.0); + s6_5 = max(s6_5, 0.0); + s6_6 = max(s6_6, 0.0); + s6_7 = max(s6_7, 0.0); + s6_8 = max(s6_8, 0.0); + + t0[gxy] = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t1[gxy] = f1(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t2[gxy] = f2(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t3[gxy] = f3(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); +} + +//!PASS 10 +//!DESC conv9 +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 +//!IN t0, t1, t2, t3 +//!OUT t4, t5, t6, t7 + +#define l0(x, y) V4(O(t0, float2(x, y))) +#define l1(x, y) V4(O(t1, float2(x, y))) +#define l2(x, y) V4(O(t2, float2(x, y))) +#define l3(x, y) V4(O(t3, float2(x, y))) + +V4 f0(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(9.979e-02, -3.801e-03, -4.195e-02, 4.491e-02, -3.034e-02, 9.629e-02, 2.217e-02, 2.348e-02, -2.610e-01, -6.449e-02, -2.193e-02, 2.201e-02, 3.639e-03, 2.767e-02, 4.953e-02, -2.463e-02)); + r += mul(s0_1, M4(4.585e-02, 9.533e-03, -2.058e-01, -1.379e-01, 6.451e-02, 1.004e-01, 1.222e-01, -1.450e-01, -1.402e-01, 2.992e-04, -1.222e-01, 1.367e-01, 8.661e-02, -2.011e-02, 9.221e-02, 1.822e-02)); + r += mul(s0_2, M4(8.522e-02, -9.951e-02, -1.250e-01, 5.328e-03, -6.122e-02, 6.165e-04, -3.026e-02, -7.362e-03, 8.463e-02, -5.863e-02, -5.406e-02, -8.633e-02, 2.756e-01, 1.402e-02, 1.001e-02, 2.433e-02)); + r += mul(s0_3, M4(-5.119e-02, -1.328e-01, 1.077e-01, 2.340e-01, 2.387e-01, 6.255e-03, -1.186e-01, -3.932e-02, 5.365e-02, 8.073e-02, -2.408e-02, -7.386e-02, -2.187e-01, -1.164e-01, -1.490e-02, -1.534e-01)); + r += mul(s0_4, M4(-2.374e-01, -1.060e-01, 3.018e-01, -1.544e-02, -7.730e-02, -9.786e-02, -1.404e-01, 4.522e-02, -6.048e-02, -3.616e-02, -2.369e-01, 2.317e-01, 2.292e-01, -6.602e-02, 1.553e-01, 3.055e-02)); + r += mul(s0_5, M4(-2.279e-01, 1.182e-01, 2.212e-01, 1.745e-01, 1.819e-03, -3.652e-02, -5.531e-02, 1.062e-01, 1.659e-01, -1.603e-01, -6.869e-02, -4.112e-02, -1.094e-01, 3.642e-02, 6.102e-02, 1.830e-01)); + r += mul(s0_6, M4(1.745e-01, -2.214e-02, 2.725e-02, 4.460e-02, -4.860e-02, -2.004e-03, -9.034e-02, 3.286e-02, -4.466e-03, -1.189e-01, 3.782e-02, 8.976e-02, -1.897e-01, 4.847e-02, -2.158e-02, 3.881e-02)); + r += mul(s0_7, M4(-1.962e-01, 4.814e-03, -7.059e-02, -5.031e-03, 4.430e-02, -4.664e-02, 2.091e-01, -9.975e-03, -4.257e-02, -4.231e-02, -1.577e-01, -7.857e-02, -7.814e-02, 1.149e-02, -1.294e-01, -3.907e-02)); + r += mul(s0_8, M4(-1.119e-01, 1.538e-01, 7.105e-02, 1.003e-01, 2.690e-02, -7.133e-02, 1.107e-01, -1.360e-01, 1.566e-01, -1.870e-01, 6.938e-02, 1.078e-01, -6.613e-02, 9.232e-02, -1.335e-01, 6.051e-02)); + r += mul(s1_0, M4(2.202e-02, -1.482e-02, -6.781e-03, 2.597e-02, -1.069e-01, 2.502e-02, 5.111e-02, -1.779e-01, -5.809e-02, -4.731e-03, -2.448e-02, -6.778e-02, 5.783e-02, 2.162e-02, -3.471e-02, 1.200e-01)); + r += mul(s1_1, M4(-9.422e-02, 1.303e-02, -8.666e-02, 1.045e-01, 6.160e-02, -2.952e-02, 1.353e-01, 1.667e-03, -1.587e-01, -3.928e-02, 3.997e-03, 4.294e-02, 5.702e-02, -3.176e-02, -3.976e-02, -2.130e-01)); + r += mul(s1_2, M4(-1.411e-03, 1.515e-02, 3.510e-02, -9.847e-02, 2.856e-02, -3.282e-02, -2.930e-02, -1.862e-02, 3.741e-02, -5.659e-02, -5.330e-02, 7.632e-03, -2.209e-02, -4.204e-02, 9.977e-02, 9.778e-03)); + r += mul(s1_3, M4(6.449e-03, -5.335e-02, 7.347e-02, -7.254e-02, -1.440e-01, -8.859e-02, 3.089e-02, -7.035e-02, 9.591e-02, 5.848e-02, -9.547e-03, -8.389e-02, -5.530e-02, 2.520e-02, 5.559e-02, 3.615e-02)); + r += mul(s1_4, M4(-1.427e-02, -2.663e-02, 5.490e-02, 1.628e-01, -2.134e-01, 1.559e-01, -2.144e-01, 1.769e-01, 5.934e-02, -3.494e-02, -2.390e-01, -3.932e-03, 1.214e-01, 1.626e-01, -1.064e-01, -1.502e-01)); + r += mul(s1_5, M4(4.727e-02, 4.170e-02, 4.571e-03, -1.416e-01, -9.562e-03, -2.348e-02, -7.062e-02, 1.835e-02, 5.295e-02, -4.510e-02, 8.317e-02, -1.414e-01, -9.661e-02, 9.667e-02, -1.732e-02, 1.292e-01)); + r += mul(s1_6, M4(-6.666e-02, 6.299e-02, -1.308e-02, -2.736e-02, 3.681e-02, -6.069e-02, -6.168e-02, -2.373e-02, -2.423e-02, 1.507e-01, 3.937e-02, -7.852e-02, 4.251e-02, -4.458e-02, -2.519e-02, 8.810e-04)); + r += mul(s1_7, M4(-4.931e-02, 3.555e-02, -5.431e-02, -1.428e-03, -5.725e-02, 1.013e-01, 1.402e-01, -6.326e-02, -1.939e-01, 1.234e-03, -7.806e-03, 3.255e-02, -4.776e-02, 1.070e-01, -5.987e-02, -3.669e-02)); + r += mul(s1_8, M4(3.066e-02, -4.837e-04, 1.517e-01, -1.362e-02, -4.811e-03, 7.739e-02, -1.789e-02, 1.743e-03, -1.418e-02, -4.379e-02, 2.601e-02, 7.546e-02, 1.224e-01, 5.496e-02, 7.564e-02, -1.265e-02)); + r += mul(s2_0, M4(-3.308e-02, -5.130e-02, -3.989e-03, -8.190e-02, -1.572e-01, -6.557e-03, -9.931e-02, 3.838e-03, 3.900e-02, -7.331e-02, 1.019e-01, 8.555e-02, -3.265e-02, 5.456e-02, 1.418e-01, 5.037e-02)); + r += mul(s2_1, M4(1.313e-01, 5.413e-03, 4.894e-02, -1.650e-01, 1.398e-01, -7.963e-03, -1.529e-01, -7.716e-02, 1.198e-01, 4.492e-02, -1.669e-02, -1.248e-03, -4.636e-02, 5.117e-03, 1.352e-01, -1.850e-01)); + r += mul(s2_2, M4(1.493e-02, 9.842e-03, 1.435e-02, 9.388e-02, -5.429e-02, 1.358e-02, -2.276e-02, 4.283e-02, 9.156e-02, -2.228e-02, 5.059e-02, -1.006e-01, 1.375e-01, -5.795e-02, 7.925e-02, 1.013e-01)); + r += mul(s2_3, M4(-5.631e-02, -8.639e-02, -4.036e-02, 7.269e-02, -3.657e-02, -7.294e-02, -1.657e-02, 1.943e-02, -4.664e-02, -9.360e-02, 1.649e-02, 1.378e-01, -8.848e-02, 1.032e-01, 4.494e-02, -4.874e-02)); + r += mul(s2_4, M4(-4.301e-02, -5.024e-02, -1.032e-01, -4.365e-02, 6.432e-02, 8.289e-02, -5.587e-02, -3.820e-02, -9.340e-02, -3.329e-02, -8.456e-02, 9.410e-03, -5.204e-02, 5.367e-02, -3.764e-02, 3.938e-02)); + r += mul(s2_5, M4(-6.791e-02, -1.080e-02, 2.013e-02, 5.786e-02, -6.448e-02, 3.220e-03, -4.325e-02, -1.603e-02, -6.848e-02, -1.132e-01, -1.624e-01, -4.266e-02, -1.756e-01, 4.226e-02, -1.251e-01, 6.439e-02)); + r += mul(s2_6, M4(7.324e-02, -2.496e-03, -8.930e-02, 2.952e-02, -5.135e-02, 4.454e-02, 6.500e-03, -6.366e-02, 6.126e-02, -3.274e-02, 3.179e-03, 1.504e-01, -1.652e-02, 3.339e-02, -7.815e-02, 7.146e-03)); + r += mul(s2_7, M4(6.184e-02, -5.592e-03, 9.693e-02, -6.885e-02, 1.027e-01, -1.237e-01, 6.530e-02, 8.315e-02, -7.620e-02, 6.753e-02, 1.437e-01, -6.247e-02, 1.395e-01, -9.828e-02, 8.287e-02, 7.834e-02)); + r += mul(s2_8, M4(1.685e-01, -1.294e-01, 3.398e-02, 1.019e-01, -2.826e-02, -1.546e-02, 9.223e-02, 1.609e-02, -1.707e-02, 6.645e-02, 1.119e-02, -6.590e-02, 3.923e-03, 7.958e-02, 1.053e-01, -3.085e-02)); + r += mul(s3_0, M4(2.589e-01, -2.329e-01, 1.983e-01, -7.556e-02, -1.354e-01, -2.610e-03, 1.614e-01, 1.125e-01, 1.494e-01, -2.117e-01, 4.815e-02, -3.878e-02, -2.583e-02, -8.455e-03, 6.600e-02, -3.506e-02)); + r += mul(s3_1, M4(1.764e-01, 3.371e-01, -3.997e-01, -1.511e-02, 1.700e-01, 1.261e-01, -1.216e-01, -1.091e-03, 1.045e-01, -2.192e-02, 7.441e-02, 2.696e-01, 1.014e-01, 1.057e-01, 1.715e-02, -5.898e-02)); + r += mul(s3_2, M4(1.639e-02, 2.217e-01, 1.512e-01, -1.281e-01, 1.477e-02, -3.184e-02, 2.148e-01, -8.227e-02, -1.780e-02, 7.008e-02, -1.461e-02, 9.458e-02, -6.548e-03, -1.904e-02, -6.767e-02, 7.074e-02)); + r += mul(s3_3, M4(-2.304e-01, 1.383e-01, -3.498e-02, 1.237e-01, -6.704e-02, -1.442e-02, 1.118e-01, 2.074e-01, -2.043e-02, -8.898e-02, 4.736e-02, 1.558e-01, 8.804e-02, -1.124e-01, 7.384e-03, -7.617e-02)); + r += mul(s3_4, M4(1.751e-01, 6.813e-02, 6.776e-02, -3.537e-01, -1.869e-01, 1.035e-02, 2.149e-01, 3.344e-01, -6.701e-02, 4.224e-02, 1.873e-01, -1.856e-01, -1.505e-02, 3.836e-02, -7.957e-02, 1.313e-01)); + r += mul(s3_5, M4(-3.251e-01, 3.145e-01, 9.404e-03, 2.142e-02, 1.153e-01, -1.625e-01, 1.867e-01, -8.547e-02, -5.732e-02, 1.582e-02, -7.585e-02, 7.211e-02, -9.616e-02, 1.182e-01, 1.738e-02, 1.165e-01)); + r += mul(s3_6, M4(-6.954e-02, 1.575e-01, -7.638e-02, -3.630e-02, 3.772e-02, 1.272e-01, -6.273e-02, -2.021e-03, 1.647e-01, -3.607e-03, 6.996e-02, -5.104e-02, 9.639e-03, 1.550e-02, -2.351e-02, -5.522e-02)); + r += mul(s3_7, M4(-5.362e-02, 1.053e-01, 1.142e-01, -7.457e-02, -9.222e-02, -1.492e-01, 2.242e-01, -2.638e-01, 3.647e-02, 1.253e-01, 1.070e-01, 1.552e-01, 1.142e-01, 3.438e-02, -9.715e-02, 4.454e-02)); + r += mul(s3_8, M4(1.371e-01, 4.977e-02, -4.478e-02, 3.495e-02, 2.572e-02, 7.444e-02, 1.017e-01, 5.641e-03, -7.497e-02, 5.295e-02, 8.355e-02, -1.566e-02, -2.130e-02, 3.331e-02, 3.913e-02, 1.173e-01)); + r += mul(s4_0, M4(1.499e-01, 7.687e-02, 1.185e-01, -3.580e-02, 1.065e-01, 3.268e-02, -8.007e-02, -9.122e-02, 4.249e-02, 7.703e-02, 5.687e-02, -3.351e-02, 4.208e-02, -1.613e-02, -5.066e-03, -4.203e-03)); + r += mul(s4_1, M4(-2.001e-02, -1.402e-02, 7.899e-02, -1.016e-01, 1.216e-01, -7.467e-02, -5.335e-02, 1.986e-01, -4.708e-02, 7.680e-02, 1.611e-02, -3.940e-02, 2.690e-02, 5.244e-02, -1.775e-02, -1.833e-01)); + r += mul(s4_2, M4(1.290e-01, 3.754e-02, 4.333e-02, 1.285e-01, -1.692e-01, -7.149e-02, 4.532e-02, 6.357e-02, 3.700e-02, -6.319e-02, -4.157e-02, 7.303e-02, 2.179e-02, 5.627e-02, 4.567e-02, 4.252e-03)); + r += mul(s4_3, M4(5.356e-02, 1.857e-02, 5.866e-03, -2.949e-02, -2.405e-02, -1.322e-01, 7.108e-02, 3.229e-03, 1.843e-01, -2.091e-01, -5.514e-02, -2.758e-02, -2.227e-02, 8.073e-02, -8.134e-04, 4.160e-02)); + r += mul(s4_4, M4(7.446e-02, -1.003e-01, -1.824e-02, -6.362e-02, 1.851e-01, -1.159e-01, 7.880e-02, 2.134e-01, -5.594e-02, -2.991e-02, -3.338e-03, -1.311e-01, -4.503e-02, -6.705e-02, 1.878e-02, -1.863e-01)); + r += mul(s4_5, M4(-1.527e-01, -1.209e-01, -2.515e-01, -1.239e-01, -1.336e-01, -5.718e-02, -1.228e-02, 2.261e-02, 6.291e-03, -1.348e-02, 2.181e-02, -6.074e-02, 1.343e-02, -4.235e-03, -1.892e-01, 3.363e-03)); + r += mul(s4_6, M4(2.154e-01, 1.255e-01, -1.835e-02, 9.993e-02, 1.802e-02, 5.546e-02, -1.146e-02, 3.926e-02, 1.277e-02, -3.354e-02, -1.901e-02, 1.212e-02, 2.635e-01, 2.701e-01, -2.231e-02, -2.811e-03)); + r += mul(s4_7, M4(-4.653e-02, 1.927e-01, -2.140e-01, -1.068e-01, 2.129e-02, 4.108e-02, 1.239e-01, -4.284e-02, -3.310e-02, 2.095e-02, 8.717e-02, 1.073e-02, 2.524e-01, 7.073e-02, -6.252e-02, 2.159e-02)); + r += mul(s4_8, M4(1.614e-01, 1.794e-01, 5.384e-02, -2.796e-02, -1.241e-01, 9.263e-03, -5.525e-02, -2.885e-02, 1.242e-01, 1.682e-01, 1.313e-02, -8.044e-02, 1.017e-01, 2.218e-01, 4.896e-03, 2.134e-02)); + r += mul(s5_0, M4(6.614e-02, 2.863e-02, 5.042e-02, -2.688e-02, -4.034e-02, 3.785e-02, -1.552e-01, 4.106e-02, -4.669e-03, 1.572e-01, 2.931e-02, -8.959e-02, 4.404e-02, 5.187e-02, 6.352e-02, -8.528e-03)); + r += mul(s5_1, M4(-4.113e-02, -3.485e-02, 9.744e-04, -1.129e-01, -4.184e-02, -5.097e-02, -4.278e-02, -1.950e-01, 4.177e-01, -4.765e-02, -7.144e-02, -5.964e-02, -1.823e-02, 1.985e-02, -2.863e-02, 1.105e-01)); + r += mul(s5_2, M4(-9.188e-02, -7.315e-02, -1.126e-01, -1.101e-01, -1.861e-01, -1.838e-02, 1.793e-02, 2.983e-02, -2.057e-01, 2.288e-01, -5.805e-02, 3.840e-01, -6.533e-02, -6.492e-03, -1.555e-02, 1.087e-02)); + r += mul(s5_3, M4(-5.148e-02, -5.261e-02, 1.157e-01, -5.552e-02, 9.241e-03, -5.474e-02, -7.290e-02, 9.177e-02, 1.089e-01, -6.549e-02, 5.312e-02, 1.273e-02, -4.502e-02, 7.933e-02, 1.235e-01, -5.523e-02)); + r += mul(s5_4, M4(1.154e-01, -7.080e-02, 2.820e-03, 5.855e-02, 3.476e-02, 5.606e-02, 1.551e-02, 2.757e-02, -4.717e-01, -3.164e-02, 1.945e-01, 2.011e-01, 4.240e-02, -4.828e-02, 1.131e-01, 2.007e-01)); + r += mul(s5_5, M4(-1.324e-02, 9.034e-02, -6.562e-02, -1.415e-01, 2.035e-01, 2.227e-02, 8.958e-02, -8.127e-02, -2.278e-02, 5.897e-01, -2.082e-02, 2.763e-01, 3.196e-03, -1.589e-02, 1.041e-01, -6.755e-03)); + r += mul(s5_6, M4(-1.162e-02, 3.651e-02, -1.074e-01, -1.459e-02, -4.629e-02, 2.949e-02, 4.951e-02, -8.052e-02, -3.776e-02, -4.897e-02, 1.135e-02, 1.967e-01, 1.796e-01, 3.094e-02, -2.135e-03, -9.460e-02)); + r += mul(s5_7, M4(3.535e-02, -2.418e-01, -1.202e-02, 1.840e-02, -6.386e-02, 5.459e-02, 1.255e-01, -7.740e-02, -1.249e-01, 2.402e-02, -4.647e-02, -5.060e-02, -8.733e-03, 9.626e-02, -1.413e-01, 8.242e-02)); + r += mul(s5_8, M4(4.101e-02, -1.777e-02, 4.835e-02, 1.135e-01, 4.554e-02, 1.219e-01, 4.158e-02, -5.097e-02, 1.331e-02, -1.184e-02, 3.028e-02, -1.485e-03, -3.645e-02, -4.552e-02, -6.050e-02, -4.123e-02)); + r += mul(s6_0, M4(5.351e-02, -1.293e-01, 5.374e-02, -5.108e-02, -1.440e-01, 1.143e-02, -1.114e-02, -1.379e-03, 2.562e-02, 2.804e-02, 3.620e-02, -3.392e-02, 5.778e-02, 6.113e-02, -6.055e-03, -4.381e-02)); + r += mul(s6_1, M4(-1.255e-01, 6.818e-02, 1.551e-01, -1.289e-01, -9.152e-02, -8.377e-02, -9.023e-02, -8.303e-02, 1.082e-01, 1.633e-02, -1.086e-01, -2.873e-02, 1.282e-01, 3.097e-02, 9.900e-03, -1.153e-01)); + r += mul(s6_2, M4(-1.054e-02, -3.995e-02, -2.186e-02, 4.059e-02, -1.168e-01, -1.012e-01, -6.086e-02, -2.419e-02, -6.052e-02, -7.367e-02, -4.577e-02, 3.211e-02, 4.124e-02, 1.235e-02, -3.945e-02, -6.397e-02)); + r += mul(s6_3, M4(1.669e-02, -2.115e-01, 2.236e-02, 1.717e-01, 1.757e-03, 3.770e-02, -3.654e-03, 6.192e-02, -4.239e-02, 4.960e-02, 6.035e-04, 2.639e-02, 1.147e-02, -6.225e-02, 7.189e-02, 5.251e-02)); + r += mul(s6_4, M4(9.938e-02, 3.995e-02, -1.010e-01, -5.093e-02, 4.820e-02, 3.492e-02, 1.436e-01, -1.534e-01, -1.845e-01, -2.132e-02, -1.343e-01, -9.454e-02, 7.165e-02, -1.747e-03, 3.244e-02, -6.289e-02)); + r += mul(s6_5, M4(4.139e-02, 8.645e-02, 9.399e-02, 3.691e-04, -4.433e-02, 7.535e-02, 9.574e-02, -5.203e-02, -2.959e-02, -8.498e-02, 6.047e-02, -4.950e-02, 2.226e-02, -3.868e-02, 8.249e-02, -3.529e-04)); + r += mul(s6_6, M4(8.061e-02, -5.656e-02, -5.368e-02, -5.495e-02, 1.414e-02, 2.116e-02, 1.308e-01, 8.124e-02, 3.390e-02, 1.219e-01, 4.394e-02, 4.619e-02, 3.129e-02, 2.178e-02, -1.655e-01, -6.343e-02)); + r += mul(s6_7, M4(1.022e-01, -6.860e-02, 2.375e-02, -2.220e-03, 4.988e-02, 3.299e-01, -1.765e-01, -2.914e-01, -2.302e-02, 8.937e-02, -1.611e-01, -3.162e-02, 1.135e-02, 1.151e-01, -8.842e-03, 2.983e-02)); + r += mul(s6_8, M4(-7.457e-02, -1.736e-01, 7.785e-02, 3.747e-02, -8.805e-02, 1.588e-01, -2.302e-01, -3.967e-02, 2.187e-02, 6.145e-03, 1.436e-02, 6.803e-03, -7.099e-02, -7.314e-02, 1.006e-02, 6.246e-02)); + r += mul(s7_0, M4(-7.723e-02, -5.801e-02, -6.587e-02, 8.060e-02, 3.730e-03, 1.916e-02, -1.449e-02, -5.394e-07, -2.390e-02, 9.347e-02, -4.700e-02, -9.968e-03, -1.154e-02, -4.739e-02, 8.297e-02, 6.254e-02)); + r += mul(s7_1, M4(-5.722e-02, 4.579e-02, 1.460e-01, -5.556e-02, 1.696e-01, -2.296e-02, 4.788e-03, -1.250e-01, -6.934e-02, -4.866e-02, 4.083e-02, -1.056e-01, 4.424e-02, -6.733e-02, -1.075e-01, 2.183e-01)); + r += mul(s7_2, M4(-5.592e-02, -1.700e-02, -2.670e-02, -1.004e-01, 1.008e-01, -1.744e-03, 1.410e-01, -5.661e-02, -3.807e-04, 1.436e-02, 9.305e-03, 3.034e-02, -1.248e-01, -1.910e-02, -1.741e-02, 2.880e-02)); + r += mul(s7_3, M4(6.801e-02, -7.140e-02, -1.237e-01, 1.951e-01, 6.394e-02, -5.840e-02, -1.713e-02, -5.907e-02, 5.134e-02, -3.309e-02, -1.370e-01, 7.279e-02, 6.317e-02, -2.810e-01, 1.142e-02, -2.649e-02)); + r += mul(s7_4, M4(5.304e-02, -8.568e-02, -1.015e-01, -3.312e-02, 2.344e-01, -9.537e-02, -3.585e-02, -5.287e-02, -8.116e-02, 6.407e-02, 8.409e-02, -8.888e-02, 2.251e-01, 7.453e-02, 4.974e-02, 6.232e-01)); + r += mul(s7_5, M4(1.903e-01, -4.089e-02, 6.271e-02, -1.552e-02, 6.145e-02, -1.402e-01, -2.340e-01, -8.503e-02, 7.063e-02, -5.336e-02, 1.063e-01, -5.122e-02, 1.896e-02, 7.259e-02, -3.176e-02, 8.089e-02)); + r += mul(s7_6, M4(2.801e-02, 5.953e-02, 1.169e-02, 3.472e-02, -1.428e-01, -5.415e-02, 1.115e-02, 1.077e-02, 4.924e-02, 5.381e-02, 1.765e-02, 3.125e-02, 1.124e-03, 1.649e-02, 3.846e-02, -1.732e-01)); + r += mul(s7_7, M4(-5.102e-02, 4.520e-02, -1.745e-02, -2.658e-03, -9.990e-02, -9.452e-02, 4.177e-02, -5.105e-02, 9.738e-02, 4.162e-02, -1.828e-01, 6.219e-02, 2.346e-01, 6.254e-02, -3.511e-02, 2.310e-01)); + r += mul(s7_8, M4(-1.098e-02, -3.532e-02, -3.789e-02, 6.616e-02, -7.425e-03, -8.286e-03, 8.732e-02, 8.728e-02, 1.692e-01, -1.588e-01, -6.698e-03, -3.937e-02, -1.749e-02, 1.068e-01, 2.430e-01, -1.154e-01)); + r += V4(1.466e-04, -5.235e-03, 7.258e-03, 7.678e-03); + return r; +} + +V4 f1(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-1.290e-03, 9.370e-02, -4.320e-02, -9.472e-02, -6.005e-02, -4.003e-03, -9.464e-02, 8.462e-03, -1.773e-01, -2.048e-01, 1.052e-01, 1.815e-02, -8.543e-02, -2.965e-02, 7.096e-02, -1.312e-01)); + r += mul(s0_1, M4(1.154e-01, 7.756e-02, -2.212e-01, -4.084e-02, 1.015e-01, -9.616e-02, -9.514e-03, -1.778e-01, -2.940e-02, -1.525e-01, 1.598e-01, -1.158e-01, 1.203e-01, 2.498e-01, -2.661e-02, -1.841e-01)); + r += mul(s0_2, M4(2.721e-02, -5.147e-02, -3.403e-02, 1.207e-01, -5.816e-02, -2.122e-02, -3.382e-02, -3.588e-03, 1.734e-01, -1.531e-01, 1.519e-01, -9.517e-02, -1.556e-01, 7.585e-02, -2.048e-02, -9.128e-02)); + r += mul(s0_3, M4(-8.110e-02, 6.664e-02, 1.968e-02, -4.765e-02, 5.276e-02, -3.808e-02, 5.276e-02, 2.250e-01, -7.665e-02, -3.359e-02, -6.667e-03, -5.989e-02, 5.629e-02, -8.219e-02, 7.873e-02, -8.845e-02)); + r += mul(s0_4, M4(8.630e-02, -4.454e-02, 9.694e-02, 1.655e-02, 1.300e-03, 6.742e-02, 3.216e-02, -1.980e-02, 1.934e-02, 1.376e-01, -2.557e-01, -1.010e-01, 1.660e-01, -2.325e-02, -1.511e-01, 1.703e-01)); + r += mul(s0_5, M4(1.343e-01, -3.295e-02, 2.776e-02, -1.077e-01, 8.195e-02, -6.924e-02, -1.979e-02, -5.042e-02, -7.246e-02, 3.115e-02, 1.983e-01, 1.198e-01, 3.833e-02, -1.212e-02, -1.410e-01, -7.631e-02)); + r += mul(s0_6, M4(-9.589e-03, 3.830e-02, -4.812e-02, 6.645e-02, -8.617e-02, -5.045e-02, -1.132e-01, 1.357e-01, -9.929e-03, 3.030e-02, -1.809e-01, 1.052e-01, -1.058e-01, 3.901e-02, -6.436e-02, -4.964e-03)); + r += mul(s0_7, M4(-6.027e-02, -6.959e-02, 7.443e-03, 9.922e-02, 2.149e-02, 1.138e-01, -2.679e-02, 8.649e-02, 1.302e-01, -2.223e-01, 1.074e-02, 1.125e-01, -2.178e-02, 7.748e-02, 1.179e-02, 1.523e-02)); + r += mul(s0_8, M4(-3.916e-05, -5.470e-02, -2.190e-01, -3.828e-02, 2.979e-02, 6.529e-02, -1.606e-01, 3.706e-02, 2.055e-01, -1.164e-01, 9.257e-02, 5.272e-02, 3.183e-02, 4.857e-02, -9.588e-02, -6.533e-03)); + r += mul(s1_0, M4(7.540e-02, 9.764e-02, -1.319e-02, -2.100e-03, -8.562e-03, -7.786e-02, 6.762e-02, 8.959e-02, 1.179e-03, 8.631e-03, -2.432e-02, 1.476e-03, 2.655e-02, 1.271e-01, -5.520e-02, -3.024e-02)); + r += mul(s1_1, M4(4.190e-02, 5.008e-02, 2.203e-02, 6.023e-02, -7.306e-02, -1.108e-01, -8.751e-03, -1.636e-01, 8.796e-03, -7.475e-03, -8.521e-02, 3.632e-02, -2.483e-02, -1.363e-01, 8.583e-02, -1.698e-01)); + r += mul(s1_2, M4(5.378e-02, 1.391e-01, -2.328e-02, 1.559e-01, -3.753e-02, 1.481e-02, 4.905e-02, 1.148e-02, 1.044e-01, -1.197e-01, -3.189e-02, -1.087e-01, -9.864e-02, 2.428e-02, 6.278e-02, -1.561e-01)); + r += mul(s1_3, M4(1.942e-02, -1.416e-02, -1.320e-03, 1.718e-03, -9.708e-02, 3.691e-02, 8.199e-04, 1.795e-01, 6.060e-03, 4.807e-02, -9.477e-02, -1.175e-02, 1.004e-01, 2.195e-03, -4.551e-02, -1.336e-02)); + r += mul(s1_4, M4(2.728e-02, -6.010e-02, -6.956e-02, -1.666e-02, -1.604e-02, 4.916e-02, -1.192e-02, 1.337e-02, -6.281e-03, 5.109e-02, -1.169e-01, -9.832e-02, -1.918e-01, 1.490e-01, 1.082e-01, 2.273e-02)); + r += mul(s1_5, M4(-2.612e-02, 4.914e-02, 9.274e-02, -5.310e-02, 2.109e-02, -8.898e-02, 4.483e-02, -9.475e-02, 5.839e-02, 7.126e-03, 4.129e-03, 3.534e-02, -3.360e-02, -3.514e-02, -7.179e-02, -1.169e-01)); + r += mul(s1_6, M4(-5.941e-02, 2.700e-02, -2.747e-02, 3.563e-02, -5.072e-02, -4.170e-02, 1.761e-01, 3.688e-02, -1.132e-01, -4.068e-03, -9.349e-02, 6.556e-03, -5.830e-02, 7.343e-03, -1.387e-01, 3.240e-02)); + r += mul(s1_7, M4(-8.859e-03, -1.137e-02, 1.834e-02, -3.014e-02, -1.304e-02, 8.656e-02, 1.825e-02, -4.192e-02, 1.328e-01, -8.751e-03, -3.517e-02, -5.615e-02, 6.907e-02, 2.833e-02, -7.642e-02, 7.053e-02)); + r += mul(s1_8, M4(6.392e-02, 5.642e-02, 2.008e-02, 4.261e-02, -5.019e-02, 5.220e-02, 3.438e-02, 2.187e-02, 2.450e-02, -8.571e-03, 9.732e-02, 7.153e-02, 1.682e-03, -6.041e-02, -1.310e-02, -1.153e-02)); + r += mul(s2_0, M4(1.411e-02, -2.235e-02, 1.050e-02, 9.889e-03, -5.474e-02, -9.156e-02, 2.731e-02, -2.199e-02, -5.243e-02, -4.685e-02, 7.612e-02, 5.636e-02, -5.409e-02, 7.412e-03, 1.141e-01, 4.936e-02)); + r += mul(s2_1, M4(3.292e-02, 9.274e-02, 2.352e-02, 3.996e-02, -1.340e-01, -1.743e-01, -6.656e-02, -1.599e-01, 1.060e-01, -7.129e-02, 3.157e-02, -6.869e-02, -9.807e-02, -1.541e-02, 1.504e-01, 7.686e-02)); + r += mul(s2_2, M4(-1.548e-02, 1.043e-02, 1.075e-02, -7.252e-02, -3.533e-02, 1.450e-01, 2.824e-02, -6.352e-02, 9.156e-03, -2.765e-02, -3.235e-02, -9.487e-02, -1.019e-01, -1.105e-02, 7.342e-02, -1.165e-01)); + r += mul(s2_3, M4(-2.381e-02, -1.041e-01, -2.931e-02, -5.409e-02, -5.221e-02, -8.654e-02, 8.565e-02, 5.808e-02, 1.080e-01, 4.777e-02, 5.038e-02, -6.842e-02, -2.049e-02, 7.978e-04, 1.524e-02, 5.051e-02)); + r += mul(s2_4, M4(-1.083e-01, -1.008e-03, 1.155e-01, 1.658e-02, 2.956e-02, 1.441e-01, 5.986e-02, 1.595e-01, 3.039e-01, 9.038e-02, 6.069e-02, -1.482e-01, -1.366e-01, 7.371e-02, 1.787e-01, -1.498e-01)); + r += mul(s2_5, M4(1.529e-01, -7.698e-02, -4.434e-02, -8.404e-02, 8.368e-02, 1.152e-01, -1.935e-01, -2.468e-03, 2.219e-02, 9.952e-02, -3.702e-02, 3.885e-02, 3.898e-02, 1.067e-01, -8.168e-02, -4.104e-02)); + r += mul(s2_6, M4(8.873e-03, -6.697e-02, -7.962e-02, 8.146e-02, -1.902e-04, -2.720e-02, 9.140e-02, -4.676e-02, 3.858e-02, -7.333e-02, 3.452e-02, 3.836e-02, 5.023e-03, 7.728e-02, 5.099e-02, -3.697e-02)); + r += mul(s2_7, M4(-4.881e-02, 1.881e-02, 8.563e-02, 3.162e-02, 1.113e-01, -5.356e-02, -9.279e-02, 3.903e-02, -2.803e-01, -1.296e-01, 9.978e-02, -3.956e-02, 2.544e-01, 1.759e-02, -4.664e-02, 4.580e-02)); + r += mul(s2_8, M4(3.493e-02, -7.852e-03, -6.132e-02, 1.860e-02, 6.619e-02, 5.271e-02, -2.771e-05, 5.595e-03, -4.999e-02, 4.761e-02, 2.335e-03, 3.123e-02, 9.426e-02, -9.228e-02, -3.116e-01, 5.790e-03)); + r += mul(s3_0, M4(4.187e-01, 1.570e-01, 3.416e-01, -1.476e-01, 2.762e-02, -6.821e-02, 1.792e-01, -7.145e-02, -1.132e-01, -1.147e-01, 4.687e-03, -8.415e-02, -6.371e-02, -9.179e-02, 8.568e-02, 5.282e-02)); + r += mul(s3_1, M4(2.006e-01, -1.368e-01, -1.491e-01, 1.522e-01, 1.591e-01, -2.736e-01, -7.281e-03, -1.058e-01, 1.874e-01, 6.724e-02, -2.351e-02, 1.403e-01, -3.835e-02, -1.348e-01, 4.668e-03, 2.206e-02)); + r += mul(s3_2, M4(-2.926e-02, 3.517e-01, 1.707e-01, -1.408e-03, -3.285e-02, -3.590e-02, 1.927e-01, -2.824e-02, 3.858e-03, 6.156e-02, -5.746e-02, -4.645e-02, -4.775e-02, 1.494e-02, 1.537e-01, -8.107e-02)); + r += mul(s3_3, M4(-5.339e-02, -2.462e-02, 1.801e-01, 6.735e-02, 1.110e-01, -7.172e-02, 1.427e-02, -2.208e-02, 4.538e-02, 1.186e-02, -6.721e-02, 2.340e-01, 7.496e-02, -1.336e-02, -1.109e-01, -1.291e-02)); + r += mul(s3_4, M4(-4.793e-01, -1.920e-02, 2.296e-01, 2.338e-01, 3.594e-02, 3.332e-01, -1.317e-02, 1.741e-01, 1.125e-01, -8.630e-02, 2.258e-01, -6.323e-02, -2.961e-02, -5.608e-02, 5.575e-02, -3.323e-02)); + r += mul(s3_5, M4(-1.526e-01, -7.034e-02, 6.900e-02, -1.000e-01, 2.197e-01, -8.525e-02, -1.881e-01, 7.698e-03, 1.491e-02, -2.469e-02, -7.523e-02, -8.245e-02, -3.840e-02, 1.184e-01, -1.436e-01, -9.901e-02)); + r += mul(s3_6, M4(-5.958e-02, 8.086e-03, 9.842e-02, -1.083e-01, 9.213e-02, -5.961e-02, 7.362e-02, -8.798e-02, 1.607e-01, -1.811e-02, -8.682e-02, 1.032e-02, 3.486e-02, 3.203e-02, 5.213e-02, -3.576e-02)); + r += mul(s3_7, M4(7.391e-03, 1.972e-01, -3.796e-03, 6.523e-02, -1.108e-01, -4.348e-02, -8.562e-02, -1.051e-01, -9.360e-02, -1.299e-02, 2.863e-02, -1.352e-01, 2.290e-01, 8.414e-02, -1.579e-01, 4.872e-03)); + r += mul(s3_8, M4(-2.161e-02, 8.326e-02, 3.877e-02, 1.170e-01, 1.057e-01, 9.497e-02, 5.896e-02, 8.480e-02, -3.514e-03, 4.368e-02, -6.036e-02, 8.517e-02, 1.221e-01, -3.263e-02, -1.092e-01, -4.857e-02)); + r += mul(s4_0, M4(-6.439e-03, 2.590e-02, -1.078e-02, 4.911e-03, -1.234e-01, -3.479e-02, -2.544e-02, -9.376e-04, -1.409e-02, -1.044e-01, 2.975e-02, -5.554e-03, 8.809e-02, -1.176e-01, -8.657e-03, -9.243e-02)); + r += mul(s4_1, M4(8.806e-02, 1.608e-01, 3.592e-02, 6.373e-02, 1.539e-02, 2.080e-02, 1.398e-01, -4.859e-02, 4.323e-02, -3.154e-02, 5.207e-02, 5.971e-02, 8.081e-02, -6.827e-02, -7.255e-02, -9.584e-02)); + r += mul(s4_2, M4(1.009e-01, -3.291e-02, -3.984e-02, 1.348e-01, 9.537e-02, -9.646e-02, -1.498e-01, 3.553e-02, 9.186e-02, -1.523e-02, 8.877e-02, 7.689e-02, -2.311e-02, 3.178e-02, 7.619e-02, -2.005e-02)); + r += mul(s4_3, M4(8.980e-03, -1.306e-01, 5.834e-03, 4.182e-02, 1.066e-01, 3.029e-02, 3.420e-02, -9.790e-03, -2.331e-02, 2.927e-02, -1.827e-02, 3.896e-03, 5.993e-02, 1.324e-01, 7.162e-03, 7.392e-02)); + r += mul(s4_4, M4(5.454e-03, 7.056e-02, 5.852e-02, 1.588e-01, 1.488e-01, 4.709e-02, -3.013e-02, 6.137e-04, 1.686e-02, 2.025e-02, -4.921e-02, -6.366e-02, 1.511e-01, 5.800e-02, 9.437e-03, 2.178e-01)); + r += mul(s4_5, M4(-8.298e-02, -3.234e-02, -1.870e-01, -7.194e-04, -9.680e-02, -6.716e-02, -6.514e-02, 4.009e-03, -6.493e-02, 9.135e-03, 6.310e-02, -2.987e-02, 5.917e-02, -3.049e-02, -6.810e-02, 1.133e-01)); + r += mul(s4_6, M4(2.475e-01, -1.028e-01, -1.012e-01, 5.798e-02, 4.370e-02, -8.948e-02, 2.015e-02, -3.095e-02, 1.079e-02, 4.546e-03, -1.499e-01, -2.327e-02, 2.749e-01, 4.021e-02, 3.484e-02, 8.184e-03)); + r += mul(s4_7, M4(-8.256e-02, 8.792e-02, 1.201e-01, -9.130e-02, 1.690e-02, 7.735e-02, -2.095e-01, -9.881e-02, 1.303e-01, 3.493e-02, 1.233e-01, 7.466e-02, -2.529e-01, 1.450e-01, -2.835e-01, -6.814e-03)); + r += mul(s4_8, M4(1.216e-01, -3.621e-02, -2.386e-01, 9.544e-02, -4.847e-02, -5.423e-02, 2.443e-02, 1.336e-02, -4.633e-02, -3.880e-02, -7.520e-02, -2.050e-03, -2.050e-02, -2.381e-02, -1.815e-02, 9.741e-03)); + r += mul(s5_0, M4(-3.185e-02, 1.057e-02, -2.817e-02, -3.388e-02, -5.074e-02, 1.164e-01, 1.036e-01, -3.044e-02, -4.854e-02, -4.310e-03, 1.276e-01, 3.407e-03, 4.557e-02, -4.412e-02, -8.336e-03, -4.077e-02)); + r += mul(s5_1, M4(1.156e-01, 1.292e-01, 2.385e-02, 7.971e-02, 5.013e-02, -3.915e-02, 6.567e-02, 3.506e-02, 2.449e-02, 1.782e-01, -2.747e-01, 1.516e-01, -8.615e-05, -3.332e-02, -1.616e-02, -2.850e-02)); + r += mul(s5_2, M4(1.542e-01, -6.468e-03, 1.698e-02, 4.033e-02, -5.540e-02, 1.855e-02, -8.269e-02, -8.155e-02, -1.974e-01, -6.811e-02, 6.998e-02, -2.765e-02, 1.672e-02, 5.377e-02, -6.681e-03, 7.280e-02)); + r += mul(s5_3, M4(-2.420e-02, -1.241e-01, 1.166e-03, -2.627e-02, 3.275e-02, -1.170e-01, -3.455e-03, 6.929e-02, -1.627e-01, 1.008e-01, -5.692e-02, -1.333e-01, -1.243e-01, 3.192e-02, -9.795e-02, -1.679e-01)); + r += mul(s5_4, M4(-6.568e-02, 2.003e-01, 1.194e-01, 7.742e-02, -2.088e-01, 7.239e-02, 1.333e-01, 1.790e-01, 1.797e-01, 7.090e-02, -1.162e-01, -1.318e-01, 1.639e-02, -1.386e-01, -2.500e-02, -1.245e-01)); + r += mul(s5_5, M4(-9.647e-02, 8.403e-02, -2.060e-03, 2.117e-01, 5.347e-02, -1.115e-01, -7.547e-02, 8.582e-02, -1.059e-01, 2.511e-02, -1.307e-01, 9.496e-02, -7.920e-02, 3.782e-02, 3.762e-02, 2.821e-02)); + r += mul(s5_6, M4(-3.827e-02, -1.998e-02, -1.564e-02, -5.277e-02, -1.666e-01, 6.916e-02, 8.288e-02, -8.635e-02, 4.294e-02, -8.745e-02, 1.111e-01, -2.236e-02, -1.172e-01, 1.120e-01, -4.274e-05, -1.752e-01)); + r += mul(s5_7, M4(1.626e-01, -5.202e-02, 3.022e-02, 9.743e-02, -6.804e-02, 2.098e-02, 2.797e-03, 4.546e-02, -1.249e-01, 2.074e-01, -1.100e-01, -9.678e-02, -1.159e-01, -4.199e-02, 3.311e-01, -1.160e-01)); + r += mul(s5_8, M4(-7.867e-02, 6.140e-02, 1.652e-02, 1.256e-02, -1.360e-01, 6.991e-02, 1.342e-01, 2.675e-02, 1.578e-01, -1.088e-01, -7.167e-02, 6.907e-02, -6.101e-02, -4.746e-02, -1.126e-01, -1.637e-02)); + r += mul(s6_0, M4(-2.515e-02, -1.885e-02, -5.777e-02, -2.252e-01, -3.739e-02, -2.786e-02, 5.066e-02, 1.577e-02, 1.946e-02, 1.096e-01, -7.705e-02, 5.620e-02, -5.276e-02, 3.204e-02, -1.163e-01, 4.990e-02)); + r += mul(s6_1, M4(3.752e-02, 6.195e-02, -1.753e-01, -1.356e-02, 5.523e-02, 1.733e-01, 4.054e-02, 4.283e-02, 8.276e-02, -8.704e-02, -2.671e-02, 9.156e-02, 6.897e-02, 1.421e-01, 1.076e-02, 7.837e-02)); + r += mul(s6_2, M4(-3.095e-02, -3.410e-02, 1.191e-01, -7.677e-03, 5.647e-02, 4.696e-02, -1.132e-02, -2.785e-02, 6.987e-02, -4.717e-02, 4.592e-03, 6.663e-02, -5.682e-02, -4.635e-02, 1.832e-03, 5.830e-03)); + r += mul(s6_3, M4(-8.835e-02, -1.053e-01, 1.292e-01, -7.368e-02, 1.444e-01, 2.780e-02, -7.350e-02, 3.015e-02, 1.847e-02, 1.329e-01, -1.123e-01, -1.848e-02, 8.562e-02, 9.074e-02, 8.054e-02, 2.418e-02)); + r += mul(s6_4, M4(7.310e-03, -1.969e-02, 1.007e-01, 1.113e-01, -9.991e-03, -1.812e-01, 1.073e-01, -2.093e-01, -4.888e-02, -1.555e-01, -3.170e-02, -1.123e-01, -3.621e-02, 1.387e-02, -3.134e-02, -1.403e-01)); + r += mul(s6_5, M4(-5.748e-02, -8.762e-02, 5.587e-02, -9.407e-02, -1.383e-01, 7.550e-03, 6.783e-03, -1.238e-01, -1.612e-02, 2.597e-02, 1.169e-02, 6.839e-02, 1.773e-02, -4.397e-02, -2.984e-02, 2.920e-02)); + r += mul(s6_6, M4(6.376e-02, 2.743e-02, -4.821e-03, -6.324e-02, -4.138e-02, 2.202e-02, 4.987e-02, 8.916e-02, 5.525e-02, 2.917e-02, -3.244e-02, -7.117e-02, -3.278e-02, 3.070e-02, -5.857e-02, 2.783e-02)); + r += mul(s6_7, M4(1.624e-02, 4.970e-02, -4.111e-02, -4.877e-02, -2.928e-01, 5.539e-02, 1.247e-01, -4.042e-02, -1.235e-01, -1.679e-04, -2.364e-02, -6.966e-02, 6.416e-02, -2.049e-02, -7.345e-02, -1.792e-02)); + r += mul(s6_8, M4(1.609e-01, -4.346e-02, 9.700e-02, 9.440e-03, -3.306e-02, -2.842e-02, -8.993e-03, -6.132e-02, -6.560e-02, -5.271e-02, 1.367e-01, 1.921e-02, 7.265e-02, -4.142e-02, 2.049e-02, 1.043e-02)); + r += mul(s7_0, M4(1.894e-02, 6.258e-02, 8.076e-02, -2.416e-02, 5.400e-04, -9.984e-04, 7.170e-03, -3.911e-02, 6.118e-02, 6.144e-02, 8.159e-02, 4.385e-02, -9.262e-02, 9.228e-02, -1.446e-01, 2.100e-02)); + r += mul(s7_1, M4(6.674e-02, 5.568e-03, -7.251e-02, -4.187e-02, 1.851e-02, 5.571e-02, 2.995e-02, 5.407e-02, 2.183e-01, -4.680e-02, 1.004e-01, 1.623e-01, -8.901e-02, -1.236e-01, -1.153e-01, -3.801e-02)); + r += mul(s7_2, M4(-7.886e-03, -3.350e-02, 4.360e-02, 7.645e-02, 1.056e-01, -3.103e-02, 6.506e-02, 8.190e-02, 3.249e-02, -7.791e-02, 6.712e-02, -1.043e-01, -1.930e-02, 5.442e-02, -1.336e-01, 1.288e-02)); + r += mul(s7_3, M4(7.036e-02, 6.907e-02, -7.875e-02, 8.528e-02, -2.936e-02, -1.772e-01, -2.183e-01, -5.999e-02, -3.511e-03, 2.193e-03, 1.227e-01, 1.089e-02, 9.310e-02, 1.357e-01, -2.419e-02, -5.080e-02)); + r += mul(s7_4, M4(4.810e-02, 8.335e-02, -3.029e-02, 8.989e-03, 1.662e-01, -2.807e-01, -1.801e-01, 2.570e-02, -1.548e-01, -1.555e-01, 3.219e-01, -1.050e-01, -1.471e-01, -1.995e-01, -1.833e-01, -3.143e-01)); + r += mul(s7_5, M4(-8.325e-02, 2.041e-02, 9.360e-02, 9.553e-02, -1.848e-02, -1.377e-01, 1.536e-01, -2.651e-02, 8.098e-02, -2.200e-02, -9.656e-02, -8.114e-02, -3.943e-02, 8.533e-02, 2.998e-02, 8.909e-02)); + r += mul(s7_6, M4(5.689e-02, -6.169e-02, 1.352e-02, 5.280e-02, -2.217e-02, -1.066e-01, -7.912e-02, 8.141e-02, 2.398e-02, -9.405e-02, 1.244e-01, -5.454e-02, -8.083e-04, 8.872e-02, -1.283e-01, -3.437e-02)); + r += mul(s7_7, M4(-1.204e-02, -1.334e-02, -7.140e-02, -8.917e-03, -1.646e-02, -1.025e-01, -8.074e-02, 1.460e-01, -1.283e-01, -3.602e-02, 9.681e-02, 1.732e-02, 8.187e-02, -3.115e-01, -1.832e-01, -2.510e-02)); + r += mul(s7_8, M4(-6.913e-02, 4.574e-02, 4.980e-02, 6.209e-04, 8.980e-02, -1.209e-01, 1.175e-01, -4.394e-02, 5.081e-03, -6.635e-02, -3.629e-03, -4.362e-02, -3.733e-02, -8.044e-02, 2.265e-01, 1.154e-02)); + r += V4(-7.481e-03, 3.894e-03, -5.502e-03, -4.914e-03); + return r; +} + +V4 f2(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(3.724e-02, 3.479e-03, 1.567e-03, -1.214e-01, 4.689e-03, 1.444e-02, 8.451e-02, 1.177e-03, 3.629e-02, -1.559e-01, 1.897e-01, 5.087e-02, -1.851e-01, -9.648e-03, -1.368e-01, -2.592e-01)); + r += mul(s0_1, M4(1.487e-01, 1.007e-01, 1.845e-01, 1.220e-01, -2.131e-01, 1.747e-02, -1.074e-02, 1.567e-02, 1.012e-01, -1.598e-01, -8.153e-03, 1.760e-02, 5.070e-02, -1.675e-01, 1.655e-01, 3.491e-02)); + r += mul(s0_2, M4(3.821e-01, 1.155e-01, -1.487e-02, 1.180e-01, -4.396e-02, 6.640e-03, 5.773e-02, 4.614e-02, 5.837e-02, -4.640e-02, -1.066e-01, -7.149e-02, -3.485e-02, -2.152e-01, 9.750e-02, 1.785e-02)); + r += mul(s0_3, M4(-1.623e-02, -1.133e-01, -2.455e-02, -1.347e-01, 1.359e-02, 2.334e-01, 3.878e-01, -2.031e-01, -1.815e-01, 1.718e-02, -9.717e-03, 7.400e-02, 6.369e-02, -1.304e-01, 3.659e-02, -1.692e-01)); + r += mul(s0_4, M4(7.610e-02, 1.194e-02, 2.673e-02, 3.135e-01, 2.760e-02, 1.648e-01, 1.564e-01, 4.504e-02, -2.295e-01, 5.353e-02, 3.624e-03, -3.883e-02, 4.702e-02, -1.814e-01, 6.465e-03, 2.531e-02)); + r += mul(s0_5, M4(4.372e-02, 3.090e-02, -1.860e-01, 9.564e-03, 9.612e-03, -3.647e-02, -1.468e-02, 8.505e-03, -5.727e-02, 8.499e-02, -1.629e-01, 5.623e-02, 1.557e-01, -2.105e-01, -6.874e-02, 2.368e-03)); + r += mul(s0_6, M4(3.906e-02, -6.603e-02, -1.071e-02, -2.715e-02, 2.176e-02, -1.145e-01, -8.425e-02, -2.132e-02, 8.685e-02, -1.174e-01, -8.648e-02, -2.373e-02, 3.716e-02, -7.980e-02, -8.063e-02, 1.802e-02)); + r += mul(s0_7, M4(-6.397e-02, -3.391e-02, 7.026e-02, 1.341e-01, 8.867e-02, -1.932e-01, -5.525e-02, 5.118e-02, 1.150e-01, -2.245e-02, -9.164e-02, 8.815e-02, -2.175e-02, 5.732e-02, 3.391e-02, -7.967e-02)); + r += mul(s0_8, M4(6.969e-02, 2.481e-02, -5.758e-02, -1.122e-01, 6.473e-02, -1.135e-01, 1.552e-02, 4.858e-02, 2.165e-02, -2.840e-02, -5.521e-02, 4.638e-02, -6.026e-02, 8.548e-02, -6.542e-02, 2.422e-02)); + r += mul(s1_0, M4(-1.324e-01, -9.657e-02, 5.681e-02, -5.161e-02, -2.698e-02, -2.448e-02, -2.619e-01, -6.980e-02, 5.807e-02, 5.673e-02, 5.349e-02, -2.276e-02, 2.047e-02, 7.038e-02, 6.933e-02, -2.684e-02)); + r += mul(s1_1, M4(-5.279e-02, -4.786e-02, 2.147e-02, 1.050e-02, -2.486e-02, 2.043e-01, -3.822e-03, -5.897e-02, 1.032e-01, -7.920e-02, -1.604e-01, 4.115e-02, -2.427e-01, 2.145e-02, -1.255e-01, -1.657e-01)); + r += mul(s1_2, M4(-1.010e-01, -1.010e-01, -7.991e-02, 6.059e-02, 1.697e-02, -4.796e-02, 1.962e-02, 4.203e-02, -8.784e-02, -1.023e-01, 1.271e-02, -3.299e-02, 1.298e-01, 1.214e-01, 6.105e-02, -2.229e-02)); + r += mul(s1_3, M4(-4.770e-02, 5.913e-02, 5.020e-02, -7.131e-03, -2.060e-01, 1.241e-01, 2.388e-02, -2.635e-02, 1.238e-01, 7.247e-02, -8.043e-02, -3.076e-02, 1.658e-01, -4.568e-02, -7.240e-02, 1.014e-01)); + r += mul(s1_4, M4(8.966e-02, 1.616e-01, 5.095e-02, -2.455e-03, 5.593e-02, 1.857e-01, 1.454e-01, -7.192e-03, 6.316e-02, 5.048e-02, 1.297e-02, -1.763e-01, -1.952e-01, -1.460e-01, 4.980e-02, -8.409e-02)); + r += mul(s1_5, M4(-9.377e-02, 1.184e-01, 5.613e-02, -7.132e-02, -1.259e-03, 5.138e-02, 4.730e-02, -2.482e-02, -3.313e-02, 8.537e-02, 2.716e-02, 1.247e-02, 1.137e-01, -7.160e-02, 7.234e-02, 6.762e-02)); + r += mul(s1_6, M4(-6.539e-02, -7.457e-02, -6.890e-02, 4.739e-02, -1.187e-01, -7.289e-02, -8.715e-02, 1.226e-01, 4.527e-02, 1.590e-01, 3.229e-02, -1.924e-02, 5.422e-02, 7.550e-02, -2.298e-02, 1.753e-02)); + r += mul(s1_7, M4(6.078e-03, 4.910e-02, -2.113e-02, 2.665e-02, 1.067e-01, -1.883e-01, 1.012e-02, 4.174e-02, -1.408e-01, -4.429e-02, 2.566e-02, 1.960e-02, -1.501e-01, 1.980e-02, -1.924e-02, 8.359e-02)); + r += mul(s1_8, M4(-8.162e-02, -2.046e-01, -4.726e-03, 6.651e-02, 5.891e-02, 4.803e-02, 4.659e-03, 4.186e-02, 5.667e-02, -2.298e-02, 1.575e-02, -3.687e-02, 4.226e-02, -8.163e-03, 2.719e-02, -2.139e-02)); + r += mul(s2_0, M4(-1.300e-01, -2.071e-02, -2.876e-02, 3.092e-02, -4.768e-02, -8.427e-02, -1.292e-02, 2.653e-02, 3.043e-02, -2.351e-02, 1.032e-01, -1.242e-01, -5.527e-02, 5.803e-02, -2.570e-01, -5.117e-02)); + r += mul(s2_1, M4(-4.517e-02, -1.088e-02, 1.822e-01, -1.161e-01, -9.387e-02, 1.175e-01, -3.744e-02, -5.978e-02, 1.616e-01, 2.280e-02, 2.708e-01, 1.192e-02, 4.039e-02, -1.120e-01, 1.062e-02, 8.678e-02)); + r += mul(s2_2, M4(8.099e-02, -3.482e-02, -1.468e-02, -2.101e-02, 1.372e-03, -7.233e-03, 1.620e-02, -7.852e-02, 6.260e-04, 8.281e-04, 8.617e-02, -3.288e-02, -9.138e-03, 3.785e-02, 5.528e-02, -3.426e-02)); + r += mul(s2_3, M4(-9.734e-02, 1.518e-01, 4.747e-02, 5.377e-02, -7.703e-02, -7.372e-02, 5.939e-02, 1.732e-02, -6.665e-02, -7.835e-04, 1.318e-01, -1.620e-01, -1.705e-01, 1.204e-01, -2.448e-01, -8.184e-02)); + r += mul(s2_4, M4(1.516e-01, 1.280e-01, -1.038e-01, 4.404e-02, 1.640e-02, -4.291e-02, 4.069e-03, -5.652e-02, -1.271e-01, 9.381e-04, -1.282e-02, 1.567e-03, 1.468e-01, 2.367e-01, -3.452e-02, 8.083e-02)); + r += mul(s2_5, M4(3.144e-02, -5.804e-03, -4.107e-02, 1.045e-02, 4.592e-02, -5.854e-02, -1.150e-01, 1.797e-02, 3.444e-02, 1.098e-02, -1.012e-01, 2.547e-02, 1.607e-01, -1.564e-02, 1.843e-01, -1.313e-01)); + r += mul(s2_6, M4(-1.530e-02, 1.923e-02, -2.923e-02, -4.513e-02, -4.605e-03, -4.504e-02, -2.672e-02, 4.149e-02, 8.869e-02, -9.748e-04, -2.265e-02, -3.775e-02, -2.417e-01, -1.869e-01, -4.442e-02, 2.009e-02)); + r += mul(s2_7, M4(-6.688e-02, -2.039e-01, -1.457e-01, 1.024e-01, -5.316e-02, -1.241e-01, -4.952e-02, 1.172e-01, 6.062e-02, 1.271e-02, -3.552e-02, 6.410e-02, -4.152e-02, -7.543e-02, -5.036e-02, -6.374e-02)); + r += mul(s2_8, M4(5.725e-02, -3.547e-02, 3.825e-03, 5.203e-02, 9.482e-02, 4.143e-02, 3.479e-02, 1.198e-02, -7.491e-02, -3.943e-02, 6.759e-02, 2.261e-02, 8.649e-02, 4.145e-02, -1.313e-01, -9.109e-03)); + r += mul(s3_0, M4(1.255e-01, 1.725e-01, -3.055e-01, -2.458e-01, -8.173e-02, -1.575e-01, -1.474e-01, -7.916e-02, 5.298e-02, 1.096e-01, -8.465e-02, -1.728e-01, -2.717e-02, 4.167e-02, 5.676e-02, -8.003e-02)); + r += mul(s3_1, M4(7.220e-01, 4.352e-02, -3.478e-02, -8.018e-02, -1.801e-01, -1.849e-02, 2.605e-01, -5.339e-02, 2.113e-01, 1.412e-01, -2.476e-01, 8.284e-02, 4.750e-02, 8.815e-02, 6.282e-02, 1.604e-01)); + r += mul(s3_2, M4(-4.143e-03, 7.700e-02, -3.138e-01, -2.956e-03, 3.122e-02, 1.719e-01, 6.956e-02, -2.989e-02, 1.377e-01, -4.360e-02, -1.460e-01, 4.187e-02, 6.419e-02, -8.990e-03, 5.880e-02, -5.041e-02)); + r += mul(s3_3, M4(-1.803e-01, 1.234e-01, 1.836e-02, 1.601e-01, -2.087e-01, -8.290e-02, -2.584e-01, 1.591e-03, 1.041e-01, -7.367e-02, 2.035e-01, 1.431e-01, 3.019e-02, 8.365e-03, -4.384e-03, -6.875e-02)); + r += mul(s3_4, M4(-1.539e-01, -7.009e-02, 2.010e-02, 2.897e-02, -1.929e-01, 1.293e-01, 9.247e-02, -3.863e-01, 1.431e-02, -1.628e-01, 5.519e-02, 6.598e-02, 1.763e-01, 1.272e-01, -4.278e-02, -3.687e-02)); + r += mul(s3_5, M4(-1.652e-01, 2.029e-01, 6.375e-02, -5.107e-02, -8.411e-02, -1.921e-01, 8.067e-02, 1.234e-01, 2.371e-02, -1.176e-01, -3.104e-02, -1.161e-01, 1.792e-01, 4.127e-02, 6.943e-02, -2.933e-02)); + r += mul(s3_6, M4(1.357e-01, -1.176e-01, 1.548e-01, -1.383e-01, -1.343e-02, -2.689e-02, 4.835e-02, -3.363e-02, 1.045e-01, 1.024e-01, 5.824e-04, -9.024e-02, -1.081e-01, 2.408e-02, 9.971e-02, -4.258e-02)); + r += mul(s3_7, M4(-7.603e-03, -1.731e-01, -2.018e-01, 1.153e-01, 2.150e-02, -1.564e-01, -5.606e-02, 3.453e-02, -5.661e-02, -8.458e-04, 3.539e-02, 2.572e-02, -5.008e-02, 1.264e-03, -1.862e-02, -7.547e-02)); + r += mul(s3_8, M4(1.869e-01, 1.199e-03, 2.327e-01, 3.469e-02, -2.002e-01, -5.345e-02, -4.882e-02, 1.097e-01, -6.799e-03, -8.035e-02, 6.958e-02, 3.092e-02, 1.516e-01, -2.645e-02, 1.494e-02, -7.511e-02)); + r += mul(s4_0, M4(-4.345e-02, 1.484e-01, -3.307e-02, -1.443e-01, 3.420e-02, 1.968e-01, 1.511e-01, 1.753e-01, -5.399e-02, 4.521e-02, -8.903e-02, 2.441e-03, -6.223e-02, -1.027e-02, -1.484e-01, -9.376e-02)); + r += mul(s4_1, M4(9.929e-02, -8.539e-02, -3.433e-02, 1.081e-01, 1.316e-02, -7.666e-02, -9.274e-03, 7.100e-02, 2.924e-02, 1.153e-01, -1.325e-01, 1.813e-01, 1.966e-02, 1.587e-01, -1.035e-01, -1.638e-01)); + r += mul(s4_2, M4(2.708e-01, -1.017e-02, -2.049e-02, 7.113e-02, 1.763e-02, -1.943e-02, -1.875e-02, -8.156e-03, -8.886e-02, -5.002e-02, -8.962e-02, 2.196e-02, -1.531e-02, 9.384e-03, 1.349e-01, 2.866e-02)); + r += mul(s4_3, M4(1.972e-01, 3.371e-01, 3.877e-02, -1.122e-01, 1.490e-01, -1.346e-01, 1.772e-02, -1.519e-01, 1.265e-01, 5.859e-02, 1.013e-01, -1.786e-01, 8.366e-02, -2.262e-02, 3.623e-01, -5.263e-02)); + r += mul(s4_4, M4(-1.303e-01, -1.114e-01, -4.405e-02, -1.153e-02, -4.026e-02, -3.629e-02, -2.858e-02, -1.237e-01, 8.082e-02, -1.807e-01, 1.310e-01, 5.274e-03, -1.675e-01, 2.320e-03, -3.316e-02, 3.970e-01)); + r += mul(s4_5, M4(3.387e-01, 2.381e-01, -2.503e-01, -2.648e-01, -2.016e-02, 4.843e-02, 1.089e-01, 1.411e-02, 4.083e-02, 1.763e-01, 8.014e-03, -6.033e-02, -9.262e-02, 1.614e-03, -1.027e-01, -5.194e-03)); + r += mul(s4_6, M4(1.025e-01, -7.352e-02, -1.283e-01, -6.252e-02, 5.032e-02, 1.491e-01, -2.388e-02, -1.248e-02, -6.140e-03, 7.336e-02, -5.229e-03, 8.707e-03, -6.721e-02, 1.560e-01, -9.837e-02, -1.118e-01)); + r += mul(s4_7, M4(1.544e-01, -7.410e-02, 7.230e-02, -1.136e-01, 4.004e-02, 2.621e-02, -7.795e-02, -1.646e-01, -4.100e-02, -3.569e-02, -2.735e-02, 5.582e-03, -1.329e-01, 3.085e-01, -9.390e-02, -4.508e-02)); + r += mul(s4_8, M4(5.530e-02, -2.003e-01, -9.624e-03, 5.853e-03, -5.959e-02, -5.444e-02, -5.310e-02, -7.021e-03, -3.355e-03, 9.593e-03, -1.768e-02, 1.376e-01, -2.936e-02, 1.131e-01, 1.300e-02, -5.178e-02)); + r += mul(s5_0, M4(2.089e-02, 7.627e-02, -5.233e-02, 1.727e-03, -2.312e-02, -2.415e-02, 8.087e-02, 1.105e-01, 5.380e-02, 6.047e-02, 9.878e-02, 1.792e-01, 7.137e-02, -4.554e-02, 5.170e-02, -4.089e-02)); + r += mul(s5_1, M4(8.278e-02, -2.174e-02, -1.357e-01, 1.360e-01, -9.989e-02, -1.275e-02, -2.446e-02, -1.053e-01, 3.093e-01, 1.811e-01, 1.872e-01, 1.046e-01, 1.129e-01, 9.270e-02, -2.918e-02, -5.317e-02)); + r += mul(s5_2, M4(-5.674e-02, -5.405e-02, 5.388e-02, -1.392e-01, 1.325e-02, 9.537e-02, 1.691e-02, -4.745e-02, -4.153e-01, -1.919e-01, 7.634e-01, 1.745e-01, -1.831e-02, -6.676e-02, -2.360e-02, 8.935e-02)); + r += mul(s5_3, M4(-4.224e-02, 1.140e-01, -1.521e-01, 3.822e-02, 1.009e-01, -3.675e-02, 2.922e-02, -4.790e-02, -6.382e-02, -5.778e-02, 1.177e-01, -1.353e-01, 1.389e-02, -6.895e-02, 1.290e-02, -1.372e-01)); + r += mul(s5_4, M4(1.019e-01, 1.057e-01, 2.167e-01, 5.358e-02, -6.091e-02, -1.346e-01, 8.352e-02, 1.510e-01, 3.459e-01, -3.201e-01, 2.022e-02, 1.186e-01, -7.381e-02, 3.842e-02, -6.365e-03, 4.917e-02)); + r += mul(s5_5, M4(-2.177e-01, 7.857e-02, -9.041e-03, -4.998e-02, -1.335e-01, -3.964e-02, -1.952e-02, -3.630e-02, -5.583e-02, 3.286e-01, 3.291e-01, 5.013e-02, -8.821e-02, 5.026e-02, -3.832e-02, 8.286e-02)); + r += mul(s5_6, M4(-9.074e-03, -6.962e-02, 3.649e-02, -7.817e-02, -4.316e-02, -1.803e-02, 7.155e-02, 8.809e-02, 8.425e-02, 2.773e-03, 1.149e-01, -4.313e-02, 1.502e-01, 1.178e-01, 2.887e-02, -9.576e-02)); + r += mul(s5_7, M4(1.853e-02, 5.554e-02, -1.362e-02, 1.089e-01, 1.525e-02, -3.206e-02, 5.188e-02, -1.121e-01, -3.825e-02, 1.523e-01, -2.211e-01, 1.098e-01, -7.643e-02, -1.417e-01, 2.906e-02, -7.706e-02)); + r += mul(s5_8, M4(-1.191e-01, 1.898e-02, 1.788e-02, 3.737e-02, 3.536e-03, 6.179e-02, -5.817e-02, -6.689e-02, -1.716e-01, 4.923e-02, 2.359e-01, -1.999e-02, -2.406e-02, 1.206e-01, 7.974e-02, 3.987e-02)); + r += mul(s6_0, M4(1.564e-01, -4.075e-03, -5.306e-02, -1.509e-01, -2.168e-02, 5.235e-02, 5.114e-02, 2.245e-02, 4.140e-02, 3.912e-03, 4.988e-02, 1.402e-02, -4.568e-03, -4.931e-02, 1.121e-01, 8.629e-03)); + r += mul(s6_1, M4(1.568e-01, 1.313e-01, 2.104e-01, -1.382e-02, -3.340e-03, -1.998e-01, -4.474e-03, 2.388e-01, 2.306e-02, 7.058e-03, 8.281e-02, 1.972e-01, 5.567e-03, -1.003e-01, 2.785e-02, 1.325e-01)); + r += mul(s6_2, M4(1.315e-01, 3.444e-03, -1.424e-01, 1.338e-01, 4.565e-02, -1.154e-02, -1.043e-01, -9.730e-02, 4.468e-03, -1.064e-01, -2.686e-03, -2.296e-02, -1.643e-02, 4.290e-02, -2.169e-02, -6.759e-04)); + r += mul(s6_3, M4(2.111e-01, 7.370e-02, 1.378e-01, 1.076e-01, 3.595e-02, 1.512e-02, 6.182e-02, -8.250e-03, 2.864e-02, -2.418e-02, -5.792e-02, -8.632e-02, 1.329e-02, 1.308e-01, 1.324e-02, -1.909e-01)); + r += mul(s6_4, M4(2.761e-02, -9.232e-02, -7.072e-02, 1.274e-01, -1.256e-01, -2.173e-02, -2.066e-01, -1.762e-01, -9.244e-02, 6.477e-02, 8.639e-02, -7.299e-02, -2.310e-02, 2.001e-01, -3.782e-02, -1.407e-02)); + r += mul(s6_5, M4(4.425e-02, 8.803e-02, -2.316e-02, -5.090e-02, 7.087e-02, 1.304e-01, -1.393e-01, 4.976e-02, -1.760e-01, 1.144e-01, 3.124e-02, -1.090e-01, 1.166e-01, -5.929e-02, -1.331e-02, -1.527e-02)); + r += mul(s6_6, M4(-8.310e-02, -6.365e-02, 5.384e-02, 5.216e-02, -7.219e-02, 1.717e-01, 1.047e-01, 6.846e-03, 2.238e-02, 5.175e-02, -1.590e-01, 4.551e-02, 1.098e-02, 4.537e-02, -1.444e-02, -3.147e-03)); + r += mul(s6_7, M4(5.190e-02, -1.786e-02, -3.339e-02, 9.677e-02, 8.330e-02, -2.030e-01, -7.853e-02, -3.209e-02, -1.065e-01, 1.165e-01, -7.677e-02, 9.941e-03, 3.012e-02, -9.097e-02, -3.735e-02, -2.587e-03)); + r += mul(s6_8, M4(4.789e-02, -1.061e-02, -7.132e-02, -5.019e-03, 9.382e-02, 1.028e-01, 1.170e-02, -7.021e-02, 3.152e-02, -7.632e-03, -8.255e-03, 5.736e-03, -4.599e-02, -1.164e-02, 2.437e-02, -5.784e-03)); + r += mul(s7_0, M4(-6.864e-02, -1.860e-01, 1.525e-02, -1.176e-01, -4.191e-02, 7.252e-02, -9.173e-02, -9.618e-02, -1.308e-01, -6.063e-02, 7.648e-02, 1.441e-01, 1.102e-01, -5.888e-02, -1.897e-01, 1.819e-01)); + r += mul(s7_1, M4(3.338e-02, 1.776e-02, 1.064e-03, -7.578e-02, 7.495e-02, -6.697e-04, -1.239e-01, 2.847e-02, -2.279e-01, -7.285e-02, 2.095e-01, 2.356e-01, 1.557e-02, -5.456e-02, 1.157e-01, 1.708e-02)); + r += mul(s7_2, M4(-8.398e-02, -1.220e-02, -9.205e-02, -5.427e-02, -4.993e-02, -3.610e-02, 4.436e-02, -7.408e-02, -4.743e-02, 1.245e-01, -2.716e-02, 9.896e-02, 2.923e-02, 1.461e-01, 2.598e-02, 3.604e-02)); + r += mul(s7_3, M4(1.723e-01, -3.550e-02, 5.951e-03, 1.184e-01, -1.509e-02, -4.806e-02, -1.090e-01, -6.005e-02, 1.048e-01, 6.892e-02, -2.529e-02, -8.196e-02, -5.180e-02, 1.710e-01, 4.785e-02, 1.247e-01)); + r += mul(s7_4, M4(-8.579e-03, -2.017e-01, -5.922e-04, -3.642e-02, 1.614e-01, -1.148e-02, -1.775e-01, 3.465e-02, -4.133e-02, -3.195e-01, -1.085e-01, 1.358e-01, -2.694e-01, 5.217e-01, 1.432e-01, 7.962e-02)); + r += mul(s7_5, M4(7.401e-02, 1.154e-01, -9.251e-02, 6.368e-02, -5.794e-02, -6.226e-02, 1.083e-01, -1.099e-01, 1.265e-01, -1.227e-01, -5.823e-02, -6.630e-02, 1.804e-01, -2.071e-01, -1.919e-01, 1.828e-01)); + r += mul(s7_6, M4(-1.028e-01, 2.171e-02, -2.036e-02, 2.199e-02, 1.960e-02, -1.265e-01, 8.657e-02, -4.917e-02, -1.625e-01, 2.369e-02, 2.032e-03, 9.057e-02, 1.559e-01, -3.505e-03, -1.472e-01, -4.203e-02)); + r += mul(s7_7, M4(5.730e-02, 1.471e-02, 3.550e-02, -4.377e-02, 1.763e-01, -1.098e-01, -1.233e-01, -5.830e-02, 5.248e-02, -5.650e-02, -6.141e-02, 4.860e-02, 6.842e-02, 2.463e-02, 1.543e-01, 4.593e-02)); + r += mul(s7_8, M4(-1.436e-01, 5.420e-02, 5.503e-02, 1.841e-02, 2.891e-02, 1.041e-02, -2.625e-02, -9.218e-03, 2.278e-01, 1.894e-02, 7.521e-02, -7.641e-02, -1.396e-01, -1.410e-01, -4.627e-02, 1.331e-02)); + r += V4(1.177e-02, 5.260e-02, 3.830e-03, 2.828e-03); + return r; +} + +V4 f3(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-5.420e-02, -7.304e-02, 5.277e-02, -8.869e-02, 1.686e-01, -1.185e-01, -7.823e-02, -1.419e-02, -7.016e-02, 4.279e-02, 1.397e-01, -6.678e-02, -7.461e-02, 4.892e-02, 1.971e-02, -1.535e-01)); + r += mul(s0_1, M4(9.894e-02, 9.302e-02, 2.232e-01, 1.508e-01, 9.585e-02, -9.040e-02, 6.740e-02, 1.110e-01, 4.021e-02, -1.659e-01, 6.178e-03, 1.271e-01, -1.103e-01, -3.351e-02, 1.574e-02, -2.217e-01)); + r += mul(s0_2, M4(3.914e-02, -9.947e-02, 1.792e-01, 2.109e-01, 3.220e-02, 5.070e-02, 3.215e-03, 7.735e-02, 1.384e-01, 6.271e-02, 1.338e-01, 1.247e-01, 7.330e-03, -5.024e-02, 1.091e-01, -3.214e-03)); + r += mul(s0_3, M4(-6.904e-02, 6.638e-02, 1.790e-02, 1.519e-01, 3.409e-02, -1.532e-01, 2.553e-02, -2.543e-02, -1.985e-01, 1.071e-01, -2.576e-01, 3.422e-02, -5.628e-02, 5.652e-02, -1.303e-02, -7.028e-03)); + r += mul(s0_4, M4(1.500e-01, 2.434e-01, -1.500e-02, 3.231e-01, -1.509e-01, -7.602e-03, -4.109e-02, -9.278e-02, -1.289e-01, -6.994e-02, -1.377e-01, 6.863e-03, 6.510e-02, 3.974e-01, 2.942e-01, -5.929e-02)); + r += mul(s0_5, M4(6.724e-02, 8.496e-02, 3.149e-01, 2.017e-01, -1.027e-01, -1.890e-02, 3.621e-02, -1.653e-02, 1.159e-02, -1.567e-02, -9.433e-02, -3.668e-02, -1.123e-01, -1.213e-01, -9.673e-03, 1.116e-01)); + r += mul(s0_6, M4(-8.626e-03, -1.019e-01, 3.571e-02, -1.988e-02, 2.925e-01, -8.985e-02, -1.971e-01, -3.109e-02, -6.574e-02, 7.465e-02, -8.963e-02, 1.973e-02, -4.528e-02, -7.994e-02, -5.249e-02, -1.425e-01)); + r += mul(s0_7, M4(-3.254e-02, -1.168e-01, -8.821e-02, -7.827e-02, -1.321e-01, -5.463e-02, -5.164e-02, -1.108e-01, 5.041e-02, 4.703e-02, -3.961e-02, -1.529e-01, 6.714e-02, -1.969e-02, -7.377e-02, -9.472e-02)); + r += mul(s0_8, M4(3.334e-03, 1.417e-02, 8.190e-02, -1.376e-04, -2.449e-02, 4.059e-02, 8.879e-03, -4.109e-02, 8.034e-02, 6.292e-02, -1.015e-01, 4.121e-02, -1.284e-01, -1.013e-01, -6.948e-02, 7.312e-02)); + r += mul(s1_0, M4(-2.675e-02, 1.906e-02, 2.541e-02, -2.440e-02, 5.500e-02, -4.655e-02, 6.749e-03, -3.896e-02, 5.153e-03, 3.243e-02, -8.898e-02, 3.766e-02, 9.183e-02, -3.276e-02, -4.676e-02, 1.069e-01)); + r += mul(s1_1, M4(-2.266e-02, 1.928e-01, 9.742e-02, 1.642e-02, 8.187e-02, -9.148e-02, 6.413e-02, 1.039e-01, 1.705e-02, -9.384e-02, 5.862e-02, -4.673e-02, -9.744e-02, -6.756e-02, -3.035e-02, -1.984e-04)); + r += mul(s1_2, M4(-1.107e-01, -7.741e-02, 3.105e-02, 4.790e-02, 6.117e-02, 6.582e-02, 1.098e-02, 4.631e-02, 6.814e-02, 4.898e-02, 1.393e-01, 5.313e-02, 1.945e-01, -8.519e-02, -2.937e-02, 1.174e-01)); + r += mul(s1_3, M4(-6.930e-02, -3.082e-02, -1.272e-02, -3.149e-02, 1.487e-01, 6.645e-02, 5.823e-02, -9.166e-02, -2.352e-02, 7.973e-02, -1.351e-01, -2.607e-02, 1.642e-02, 2.832e-02, 3.065e-02, -1.574e-01)); + r += mul(s1_4, M4(-1.663e-02, 8.963e-02, -1.319e-01, -7.464e-02, -1.524e-01, 3.038e-02, -4.666e-02, 4.148e-02, -1.216e-01, -1.376e-01, 3.993e-02, 8.549e-02, -1.050e-01, 5.940e-02, 1.719e-03, 7.842e-02)); + r += mul(s1_5, M4(4.745e-02, -9.467e-02, 4.188e-02, -1.220e-01, 2.856e-02, -2.749e-02, -2.924e-02, 1.370e-02, -1.048e-04, 1.409e-02, 1.199e-01, 4.892e-02, 9.664e-03, 9.891e-02, -3.513e-02, 4.525e-02)); + r += mul(s1_6, M4(3.134e-02, 6.452e-03, 2.488e-02, -9.823e-02, 1.444e-01, -8.021e-02, 5.082e-03, -1.454e-02, 6.573e-03, -5.563e-02, 3.470e-02, 2.968e-02, -1.047e-01, 3.429e-02, -4.992e-02, -2.500e-02)); + r += mul(s1_7, M4(-8.099e-02, -1.564e-03, -1.092e-01, -8.339e-02, -1.682e-01, 1.413e-02, 3.937e-02, -1.882e-02, -3.873e-02, 7.467e-02, 4.002e-02, 3.199e-02, -2.999e-03, 6.933e-02, -5.280e-03, 4.954e-02)); + r += mul(s1_8, M4(1.375e-02, 3.525e-02, 2.171e-02, 5.732e-03, -7.219e-02, 8.751e-03, -2.031e-02, 1.222e-01, 2.149e-02, 1.194e-02, -2.729e-02, -2.466e-02, 8.901e-03, 8.588e-02, -1.194e-01, 4.372e-02)); + r += mul(s2_0, M4(3.096e-02, -1.865e-02, 8.717e-03, -4.015e-02, 1.252e-02, 7.766e-04, -4.010e-02, 2.630e-02, 2.955e-02, 3.460e-02, 4.094e-02, -3.779e-02, 9.973e-02, -8.498e-02, 8.707e-02, 6.292e-02)); + r += mul(s2_1, M4(-5.360e-02, -1.160e-01, 5.175e-02, -1.341e-02, 4.235e-02, -2.533e-02, -6.446e-02, -6.719e-02, -2.407e-02, -7.542e-02, -4.934e-02, -2.011e-02, 2.883e-02, 5.149e-02, 7.340e-02, -1.130e-01)); + r += mul(s2_2, M4(5.325e-02, 2.018e-02, -2.125e-02, -2.671e-02, -1.863e-02, -5.310e-02, -5.639e-02, 2.808e-02, 9.939e-02, -1.404e-02, -6.949e-02, 5.210e-02, -2.614e-02, -6.005e-02, -1.941e-01, 3.242e-02)); + r += mul(s2_3, M4(-2.594e-02, -8.161e-02, -6.955e-02, 3.421e-02, 4.341e-02, -8.308e-02, 1.558e-01, -6.705e-02, 3.444e-02, 1.463e-01, -3.094e-02, 1.097e-01, -1.576e-01, 1.454e-01, -4.296e-02, 4.286e-02)); + r += mul(s2_4, M4(1.169e-01, 1.054e-01, -5.935e-02, 1.220e-01, 1.240e-01, -8.460e-02, 4.287e-02, -3.474e-02, -1.073e-01, 6.625e-02, -1.882e-01, 7.456e-02, 1.547e-01, 3.164e-01, -5.810e-02, -6.758e-03)); + r += mul(s2_5, M4(-4.905e-02, 1.096e-01, 3.387e-02, 1.092e-01, -2.121e-01, 8.539e-03, -9.386e-02, -3.087e-02, -6.711e-02, 1.921e-02, -2.491e-02, 1.355e-01, -2.342e-01, 2.275e-02, -1.088e-01, 3.979e-02)); + r += mul(s2_6, M4(2.875e-02, -3.923e-02, 5.558e-02, 6.616e-02, 2.325e-02, 3.941e-02, 8.712e-02, 4.491e-02, 9.766e-02, 7.752e-03, -4.710e-02, -2.966e-02, -5.660e-03, -5.816e-03, 1.293e-01, 7.674e-02)); + r += mul(s2_7, M4(3.993e-02, 4.968e-02, 3.402e-02, -5.904e-02, -3.339e-02, 4.979e-02, 1.015e-01, 3.036e-02, -6.656e-02, -2.128e-02, -3.100e-02, -1.940e-01, -4.330e-04, 3.630e-02, 2.386e-01, 2.487e-03)); + r += mul(s2_8, M4(-2.667e-03, 4.797e-02, -3.047e-02, 2.558e-02, -4.603e-02, 9.783e-02, 5.871e-03, -1.708e-02, -1.082e-01, 1.274e-01, 2.123e-02, -9.464e-02, 2.113e-02, -2.157e-02, 5.258e-02, 7.613e-02)); + r += mul(s3_0, M4(2.095e-01, -2.461e-01, 2.168e-02, -4.770e-01, -2.994e-02, -7.197e-02, -1.038e-02, 2.126e-01, -5.237e-02, -1.790e-01, 7.885e-02, -2.092e-01, 4.132e-02, -4.664e-03, 2.313e-02, -1.060e-01)); + r += mul(s3_1, M4(1.656e-01, 4.463e-01, 3.476e-01, -6.969e-02, 9.353e-02, -8.283e-02, -4.747e-02, 5.884e-02, -1.672e-01, -2.816e-02, -1.464e-01, 2.782e-02, 8.619e-02, 5.981e-02, -1.124e-02, -2.580e-02)); + r += mul(s3_2, M4(-5.303e-02, -3.766e-02, 7.818e-02, -6.730e-02, 4.065e-02, -8.358e-02, -2.606e-02, -5.207e-02, 3.543e-02, -1.616e-02, -5.832e-02, -4.686e-02, 1.371e-03, 6.335e-04, -1.149e-01, -8.662e-03)); + r += mul(s3_3, M4(-2.392e-02, 4.994e-02, -2.354e-01, -4.360e-01, 2.895e-02, -7.065e-02, 1.539e-01, 1.482e-01, 1.209e-01, 7.392e-02, -3.122e-02, 1.076e-01, -3.736e-02, 2.119e-02, -1.690e-02, 7.682e-02)); + r += mul(s3_4, M4(-5.199e-02, 4.982e-01, -4.490e-02, -3.677e-01, 2.666e-01, 2.291e-01, 2.176e-01, 4.174e-01, -7.979e-02, -1.923e-01, -1.458e-01, 2.467e-01, 1.223e-01, 1.135e-01, -3.184e-02, 7.319e-02)); + r += mul(s3_5, M4(-2.068e-01, 1.166e-01, 1.265e-01, 1.820e-01, -4.397e-02, 1.649e-01, 7.162e-02, -1.500e-01, -9.937e-02, -3.798e-02, -7.080e-02, 4.055e-02, -2.191e-02, -3.392e-02, -9.337e-02, -2.936e-02)); + r += mul(s3_6, M4(8.804e-02, -3.708e-02, 8.988e-02, 5.097e-02, 6.321e-02, -9.117e-02, 5.456e-02, 1.528e-01, 1.286e-01, 1.083e-01, 8.429e-02, 9.675e-02, 7.243e-02, 1.105e-02, -6.020e-02, -1.369e-02)); + r += mul(s3_7, M4(1.798e-02, 7.436e-02, -4.497e-02, 9.345e-02, 1.947e-01, 4.985e-03, 1.264e-01, 3.177e-01, -1.771e-01, -7.012e-02, -6.451e-02, 4.775e-02, -8.161e-03, 7.974e-02, 1.857e-02, 1.192e-02)); + r += mul(s3_8, M4(-1.301e-02, -2.212e-01, -5.738e-02, 1.239e-01, -1.303e-01, -1.040e-02, -1.057e-01, 6.472e-02, -1.315e-01, 5.404e-02, 1.043e-01, -2.273e-02, 4.702e-02, 2.117e-02, -2.228e-02, 7.511e-02)); + r += mul(s4_0, M4(2.086e-02, -1.315e-01, -8.666e-02, -4.610e-02, 8.425e-02, 4.468e-02, -2.225e-03, -7.460e-02, 2.345e-02, 2.699e-02, 1.948e-02, -9.559e-03, 3.792e-02, -1.551e-02, -3.949e-02, -8.766e-02)); + r += mul(s4_1, M4(3.962e-02, -2.166e-01, -5.640e-03, 2.654e-02, -7.836e-03, -9.792e-02, 1.355e-02, 1.633e-02, 9.491e-02, -8.847e-02, 5.093e-02, 7.195e-02, -4.667e-02, -2.085e-01, 9.252e-02, 1.966e-02)); + r += mul(s4_2, M4(4.441e-02, 1.353e-01, 3.278e-02, 9.538e-02, 6.115e-02, 5.018e-02, 1.687e-01, 4.744e-02, -2.649e-02, -6.554e-02, -1.157e-01, -2.995e-02, 7.393e-02, 1.172e-02, -1.931e-02, -2.015e-02)); + r += mul(s4_3, M4(6.047e-02, 1.781e-01, 2.752e-02, 1.275e-01, 2.304e-02, -3.967e-03, -1.261e-01, 1.192e-01, -6.222e-02, -5.305e-02, 2.415e-02, 6.835e-02, -4.043e-02, 1.336e-01, -2.237e-01, 2.707e-01)); + r += mul(s4_4, M4(8.054e-02, -6.908e-02, 9.448e-02, 2.953e-02, 7.394e-02, -5.142e-02, 4.425e-02, 1.082e-01, 1.580e-01, -6.362e-02, 1.552e-02, 2.589e-02, -2.180e-01, 1.362e-01, -1.225e-01, -1.116e-01)); + r += mul(s4_5, M4(3.335e-02, -3.172e-01, 2.059e-01, -9.299e-02, 1.196e-01, -6.233e-02, 1.577e-01, -9.054e-03, -1.706e-01, 6.904e-02, -1.745e-02, -5.810e-02, -1.765e-02, -6.382e-02, 4.746e-02, -1.047e-01)); + r += mul(s4_6, M4(2.181e-01, 2.339e-02, -1.321e-02, 2.600e-02, -6.821e-02, -4.525e-02, 1.166e-01, -1.033e-01, 1.230e-03, -5.596e-02, 4.015e-02, 6.311e-02, 2.021e-01, -1.335e-01, 1.062e-02, -1.941e-01)); + r += mul(s4_7, M4(-1.137e-01, -3.561e-02, 3.031e-03, 3.526e-02, -4.821e-02, 3.615e-02, -3.799e-02, -1.222e-01, -5.634e-02, 9.488e-02, 3.017e-02, 5.925e-03, 1.082e-01, -1.733e-01, -8.112e-02, -2.205e-01)); + r += mul(s4_8, M4(-2.704e-02, 5.156e-02, -3.898e-02, -5.168e-02, 6.469e-02, 9.312e-02, 2.891e-01, 5.176e-02, -7.136e-02, 3.696e-02, 6.148e-02, -1.558e-01, 1.179e-01, -1.230e-01, -2.152e-03, -3.342e-03)); + r += mul(s5_0, M4(3.099e-02, -5.721e-02, -5.837e-02, 3.273e-02, 4.061e-02, 6.728e-02, -6.397e-02, -1.035e-02, -8.410e-03, 1.368e-01, 6.434e-02, -2.079e-01, -7.008e-02, 5.762e-02, 6.261e-02, -2.827e-02)); + r += mul(s5_1, M4(-9.156e-02, 4.647e-02, 3.607e-02, -4.526e-02, 1.105e-02, 1.226e-02, -1.190e-01, -2.288e-02, -3.213e-01, 1.775e-01, -5.493e-02, -4.106e-02, -8.115e-03, -3.186e-02, -5.598e-03, 8.977e-02)); + r += mul(s5_2, M4(-2.462e-02, 5.685e-02, 1.396e-01, 1.148e-01, 9.165e-02, -2.105e-02, -1.515e-02, -2.034e-02, 2.218e-01, 5.889e-01, -2.518e-01, -2.986e-01, 1.975e-02, 1.469e-02, 4.941e-02, 8.084e-02)); + r += mul(s5_3, M4(-1.178e-02, -2.493e-02, 7.091e-02, -1.486e-01, -5.103e-02, 1.093e-01, -5.768e-02, 1.968e-01, -1.203e-01, 1.732e-01, -9.788e-02, 8.279e-02, -1.132e-01, 1.107e-01, 5.348e-02, 1.640e-01)); + r += mul(s5_4, M4(1.597e-01, 1.346e-01, 8.000e-02, -6.103e-02, 5.216e-02, 1.608e-02, 1.724e-02, -1.406e-01, 1.497e-02, 1.972e-02, -4.815e-01, 3.832e-02, 2.854e-03, 5.729e-02, 3.926e-02, 1.587e-01)); + r += mul(s5_5, M4(-1.130e-01, 5.619e-02, 4.022e-02, 7.986e-02, 3.390e-02, -5.944e-02, -7.646e-02, -8.342e-02, -2.934e-01, 5.609e-02, -9.369e-02, -2.271e-01, 1.012e-01, 2.281e-02, 3.580e-02, 3.448e-02)); + r += mul(s5_6, M4(-8.420e-02, 1.951e-02, -6.040e-02, 3.208e-02, -2.316e-02, 4.509e-02, -4.663e-03, 4.133e-02, 9.793e-02, -1.538e-01, -1.707e-01, 3.171e-02, -1.908e-02, -1.000e-01, -1.606e-02, 6.926e-02)); + r += mul(s5_7, M4(1.478e-02, 1.569e-01, 3.403e-02, -1.223e-01, -2.366e-05, 1.023e-01, -7.845e-02, -4.515e-02, -1.406e-01, 5.345e-02, 1.959e-02, 6.173e-02, -1.724e-01, -2.036e-01, 9.326e-02, 6.862e-03)); + r += mul(s5_8, M4(1.094e-02, 1.636e-01, 7.616e-02, 2.121e-02, 3.014e-02, -3.134e-02, -1.714e-01, 2.918e-02, 1.450e-02, 1.552e-01, 1.083e-02, -1.165e-01, 1.077e-01, 3.238e-02, 1.702e-02, 4.353e-04)); + r += mul(s6_0, M4(5.214e-02, -2.078e-02, 3.474e-01, -3.284e-02, 5.659e-02, 1.059e-02, 3.253e-02, 2.559e-02, -8.278e-02, 3.339e-02, -4.612e-02, 2.310e-02, -7.745e-03, 8.922e-03, -6.390e-03, 3.328e-02)); + r += mul(s6_1, M4(2.072e-01, 1.430e-01, 1.083e-01, 3.261e-01, -1.827e-02, 4.296e-02, -4.245e-02, -1.057e-01, -6.319e-04, 1.182e-01, 7.292e-02, 1.245e-02, 4.914e-02, 1.210e-01, -1.695e-02, -1.774e-02)); + r += mul(s6_2, M4(7.776e-02, 1.307e-01, 2.705e-01, 2.352e-01, -2.479e-02, -4.149e-03, -4.609e-02, 5.144e-02, 1.693e-02, 5.089e-03, 3.080e-02, -1.144e-01, -7.009e-02, 7.680e-02, 5.151e-02, -1.967e-02)); + r += mul(s6_3, M4(-7.626e-02, -9.855e-02, 1.796e-01, -1.230e-01, 1.587e-01, 2.963e-02, -2.519e-02, 7.055e-02, 3.005e-02, 1.080e-01, -5.835e-02, 6.189e-03, 5.797e-02, -1.002e-01, -3.244e-02, 1.482e-02)); + r += mul(s6_4, M4(1.329e-02, -1.075e-01, -4.617e-02, -3.313e-01, -7.339e-02, -1.085e-01, 3.176e-02, -1.469e-01, 4.723e-02, 4.985e-02, -1.166e-01, -5.758e-02, 5.751e-02, -1.193e-01, -1.725e-01, -7.011e-02)); + r += mul(s6_5, M4(8.138e-02, -7.430e-02, 6.983e-02, -2.314e-01, -7.402e-03, -2.964e-04, 4.611e-02, 4.329e-03, 8.225e-02, 5.095e-02, -2.180e-02, 6.560e-02, 5.276e-03, -6.051e-02, 1.080e-02, -1.288e-01)); + r += mul(s6_6, M4(8.902e-02, 1.368e-02, 1.088e-01, 1.724e-01, -3.034e-02, 2.497e-02, 2.480e-02, 1.805e-01, 5.329e-02, -1.677e-02, -4.939e-02, -8.117e-02, -5.250e-02, 6.730e-03, -1.006e-02, -1.544e-01)); + r += mul(s6_7, M4(-7.771e-02, 5.097e-02, 1.006e-01, 3.524e-01, 9.951e-04, -6.529e-02, -1.195e-01, -3.114e-02, 4.553e-02, -1.189e-01, -4.951e-02, 1.090e-01, 1.217e-03, 2.041e-02, -6.306e-02, -1.119e-01)); + r += mul(s6_8, M4(1.128e-03, 5.455e-02, 1.584e-01, 6.287e-03, 1.108e-02, 1.749e-02, 5.138e-02, 1.153e-01, 6.400e-02, -9.560e-02, 7.986e-02, -2.861e-02, 5.823e-02, -6.431e-03, -2.695e-02, -4.033e-02)); + r += mul(s7_0, M4(8.310e-02, -5.055e-02, -7.900e-02, -6.566e-02, 8.914e-02, -9.624e-02, -9.637e-02, -3.749e-02, -7.631e-02, -1.133e-01, -1.827e-02, -1.260e-01, -6.900e-02, -1.341e-02, 5.361e-02, -1.120e-01)); + r += mul(s7_1, M4(-1.704e-02, 1.459e-02, 2.970e-02, -4.414e-02, -6.875e-03, -2.423e-01, -1.020e-01, 3.640e-02, -1.879e-01, 1.759e-02, 9.057e-02, 5.173e-02, -4.979e-02, 1.295e-01, 1.190e-01, -7.415e-02)); + r += mul(s7_2, M4(-1.018e-01, -3.924e-03, 5.875e-02, 9.527e-02, -5.239e-02, -6.705e-02, 1.451e-03, 1.266e-01, -2.502e-02, 1.718e-02, 1.324e-01, 1.751e-01, 4.871e-02, -9.750e-02, 2.023e-01, 5.529e-02)); + r += mul(s7_3, M4(-6.367e-02, -3.484e-02, -1.307e-01, 6.098e-02, -8.726e-02, -1.461e-03, 7.463e-02, -5.403e-02, -1.290e-02, -3.601e-02, 7.717e-02, -1.176e-01, -2.167e-01, -1.133e-01, 1.845e-01, 5.091e-02)); + r += mul(s7_4, M4(6.423e-03, 9.665e-02, -1.285e-02, -1.315e-01, -8.173e-02, -1.755e-01, -3.384e-02, -1.216e-01, -4.928e-02, 9.972e-02, -1.378e-01, -7.535e-02, -1.835e-01, 3.639e-01, -1.728e-01, 1.934e-02)); + r += mul(s7_5, M4(2.944e-02, 2.167e-02, -1.027e-01, 2.432e-02, -1.126e-01, -2.286e-01, 1.568e-01, -1.957e-03, 5.846e-02, 1.433e-01, 6.377e-02, -1.225e-02, 1.019e-01, -1.250e-01, 2.458e-01, 1.341e-01)); + r += mul(s7_6, M4(1.512e-02, -2.239e-02, -6.181e-02, -1.150e-01, -5.383e-02, 6.533e-02, 2.561e-02, -8.978e-02, -7.917e-02, -7.980e-03, 9.308e-02, -1.176e-02, -1.974e-01, 6.040e-02, 1.649e-01, -1.820e-01)); + r += mul(s7_7, M4(7.647e-03, -6.300e-03, -9.134e-02, 2.675e-02, 1.495e-01, 8.440e-04, -3.061e-02, -1.085e-01, 7.143e-03, -1.213e-01, -1.140e-01, -2.759e-02, 1.342e-01, 1.622e-01, 1.045e-01, -2.112e-01)); + r += mul(s7_8, M4(6.856e-02, -3.692e-02, -3.924e-02, 8.596e-03, -1.565e-01, -6.137e-03, 1.368e-01, 1.838e-01, 9.995e-03, -7.011e-02, 1.033e-01, -9.436e-02, -2.162e-02, -1.315e-01, 2.524e-01, 1.174e-02)); + r += V4(-3.934e-03, -2.827e-03, 2.210e-02, 1.100e-02); + return r; +} + +void Pass10(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = Rmp8x8(tid.x) + blockStart; + uint2 size = GetInputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = (gxy + 0.5) * pt; + + V4 s0_0 = l0(-1.0, -1.0); + V4 s0_1 = l0(0.0, -1.0); + V4 s0_2 = l0(1.0, -1.0); + V4 s0_3 = l0(-1.0, 0.0); + V4 s0_4 = l0(0.0, 0.0); + V4 s0_5 = l0(1.0, 0.0); + V4 s0_6 = l0(-1.0, 1.0); + V4 s0_7 = l0(0.0, 1.0); + V4 s0_8 = l0(1.0, 1.0); + V4 s1_0 = -max(-s0_0, 0.0); + V4 s1_1 = -max(-s0_1, 0.0); + V4 s1_2 = -max(-s0_2, 0.0); + V4 s1_3 = -max(-s0_3, 0.0); + V4 s1_4 = -max(-s0_4, 0.0); + V4 s1_5 = -max(-s0_5, 0.0); + V4 s1_6 = -max(-s0_6, 0.0); + V4 s1_7 = -max(-s0_7, 0.0); + V4 s1_8 = -max(-s0_8, 0.0); + s0_0 = max(s0_0, 0.0); + s0_1 = max(s0_1, 0.0); + s0_2 = max(s0_2, 0.0); + s0_3 = max(s0_3, 0.0); + s0_4 = max(s0_4, 0.0); + s0_5 = max(s0_5, 0.0); + s0_6 = max(s0_6, 0.0); + s0_7 = max(s0_7, 0.0); + s0_8 = max(s0_8, 0.0); + + V4 s2_0 = l1(-1.0, -1.0); + V4 s2_1 = l1(0.0, -1.0); + V4 s2_2 = l1(1.0, -1.0); + V4 s2_3 = l1(-1.0, 0.0); + V4 s2_4 = l1(0.0, 0.0); + V4 s2_5 = l1(1.0, 0.0); + V4 s2_6 = l1(-1.0, 1.0); + V4 s2_7 = l1(0.0, 1.0); + V4 s2_8 = l1(1.0, 1.0); + V4 s3_0 = -max(-s2_0, 0.0); + V4 s3_1 = -max(-s2_1, 0.0); + V4 s3_2 = -max(-s2_2, 0.0); + V4 s3_3 = -max(-s2_3, 0.0); + V4 s3_4 = -max(-s2_4, 0.0); + V4 s3_5 = -max(-s2_5, 0.0); + V4 s3_6 = -max(-s2_6, 0.0); + V4 s3_7 = -max(-s2_7, 0.0); + V4 s3_8 = -max(-s2_8, 0.0); + s2_0 = max(s2_0, 0.0); + s2_1 = max(s2_1, 0.0); + s2_2 = max(s2_2, 0.0); + s2_3 = max(s2_3, 0.0); + s2_4 = max(s2_4, 0.0); + s2_5 = max(s2_5, 0.0); + s2_6 = max(s2_6, 0.0); + s2_7 = max(s2_7, 0.0); + s2_8 = max(s2_8, 0.0); + + V4 s4_0 = l2(-1.0, -1.0); + V4 s4_1 = l2(0.0, -1.0); + V4 s4_2 = l2(1.0, -1.0); + V4 s4_3 = l2(-1.0, 0.0); + V4 s4_4 = l2(0.0, 0.0); + V4 s4_5 = l2(1.0, 0.0); + V4 s4_6 = l2(-1.0, 1.0); + V4 s4_7 = l2(0.0, 1.0); + V4 s4_8 = l2(1.0, 1.0); + V4 s5_0 = -max(-s4_0, 0.0); + V4 s5_1 = -max(-s4_1, 0.0); + V4 s5_2 = -max(-s4_2, 0.0); + V4 s5_3 = -max(-s4_3, 0.0); + V4 s5_4 = -max(-s4_4, 0.0); + V4 s5_5 = -max(-s4_5, 0.0); + V4 s5_6 = -max(-s4_6, 0.0); + V4 s5_7 = -max(-s4_7, 0.0); + V4 s5_8 = -max(-s4_8, 0.0); + s4_0 = max(s4_0, 0.0); + s4_1 = max(s4_1, 0.0); + s4_2 = max(s4_2, 0.0); + s4_3 = max(s4_3, 0.0); + s4_4 = max(s4_4, 0.0); + s4_5 = max(s4_5, 0.0); + s4_6 = max(s4_6, 0.0); + s4_7 = max(s4_7, 0.0); + s4_8 = max(s4_8, 0.0); + + V4 s6_0 = l3(-1.0, -1.0); + V4 s6_1 = l3(0.0, -1.0); + V4 s6_2 = l3(1.0, -1.0); + V4 s6_3 = l3(-1.0, 0.0); + V4 s6_4 = l3(0.0, 0.0); + V4 s6_5 = l3(1.0, 0.0); + V4 s6_6 = l3(-1.0, 1.0); + V4 s6_7 = l3(0.0, 1.0); + V4 s6_8 = l3(1.0, 1.0); + V4 s7_0 = -max(-s6_0, 0.0); + V4 s7_1 = -max(-s6_1, 0.0); + V4 s7_2 = -max(-s6_2, 0.0); + V4 s7_3 = -max(-s6_3, 0.0); + V4 s7_4 = -max(-s6_4, 0.0); + V4 s7_5 = -max(-s6_5, 0.0); + V4 s7_6 = -max(-s6_6, 0.0); + V4 s7_7 = -max(-s6_7, 0.0); + V4 s7_8 = -max(-s6_8, 0.0); + s6_0 = max(s6_0, 0.0); + s6_1 = max(s6_1, 0.0); + s6_2 = max(s6_2, 0.0); + s6_3 = max(s6_3, 0.0); + s6_4 = max(s6_4, 0.0); + s6_5 = max(s6_5, 0.0); + s6_6 = max(s6_6, 0.0); + s6_7 = max(s6_7, 0.0); + s6_8 = max(s6_8, 0.0); + + t4[gxy] = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t5[gxy] = f1(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t6[gxy] = f2(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t7[gxy] = f3(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); +} + +//!PASS 11 +//!DESC conv10 +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 +//!IN t4, t5, t6, t7 +//!OUT t0, t1, t2, t3 + +#define l0(x, y) V4(O(t4, float2(x, y))) +#define l1(x, y) V4(O(t5, float2(x, y))) +#define l2(x, y) V4(O(t6, float2(x, y))) +#define l3(x, y) V4(O(t7, float2(x, y))) + +V4 f0(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-4.830e-02, -8.822e-02, -6.993e-02, 1.594e-02, 3.621e-02, 9.357e-02, -1.050e-01, 9.606e-02, -2.030e-01, -1.800e-01, -7.986e-02, 5.909e-02, -7.205e-02, 2.962e-03, 7.652e-03, 4.839e-02)); + r += mul(s0_1, M4(2.639e-02, -8.383e-02, 3.581e-02, -5.131e-02, -1.163e-01, -8.054e-02, 1.334e-01, -5.472e-02, -5.489e-02, -2.548e-01, -2.275e-02, 9.308e-02, 2.770e-02, -1.546e-01, 3.333e-02, 4.518e-02)); + r += mul(s0_2, M4(2.327e-02, -1.763e-02, -3.695e-02, -6.094e-02, 1.823e-02, -2.793e-02, -3.985e-03, 1.542e-02, 1.257e-01, -2.132e-01, 5.117e-02, 1.349e-01, -3.077e-01, -3.700e-03, -1.768e-01, 6.746e-02)); + r += mul(s0_3, M4(-6.500e-03, 1.339e-01, 1.237e-02, 8.131e-02, 8.515e-03, 1.218e-01, 5.627e-02, -1.326e-01, -3.635e-02, -5.367e-02, 1.512e-03, 1.246e-01, -1.685e-01, -4.678e-02, 4.310e-02, 8.479e-02)); + r += mul(s0_4, M4(4.810e-02, -2.654e-02, 9.668e-02, 3.588e-02, 2.012e-02, -1.805e-02, -4.505e-02, 1.030e-01, -2.129e-01, -1.533e-01, -2.805e-02, -5.564e-02, -1.120e-01, -9.410e-03, -9.620e-02, 1.147e-01)); + r += mul(s0_5, M4(9.775e-02, 7.503e-02, 9.817e-02, -1.275e-02, 9.842e-02, 5.709e-02, 2.653e-02, 2.764e-01, 2.105e-01, -2.408e-01, -1.928e-02, 1.570e-01, -1.637e-01, -1.838e-01, 2.108e-02, 1.434e-01)); + r += mul(s0_6, M4(1.222e-01, 9.284e-02, -2.491e-02, -4.565e-02, -5.174e-02, -2.526e-02, 4.163e-02, -4.810e-02, 1.309e-01, 7.007e-02, -1.747e-02, 6.446e-02, -1.266e-01, 6.643e-02, -9.471e-02, -4.707e-02)); + r += mul(s0_7, M4(4.659e-03, -2.968e-02, 2.761e-02, 2.542e-02, -1.407e-02, -7.931e-03, -6.463e-02, -2.256e-02, -4.864e-02, -8.343e-02, 1.271e-01, 7.443e-03, 2.849e-02, 3.836e-02, -1.504e-01, -1.918e-02)); + r += mul(s0_8, M4(-5.559e-02, 3.812e-02, -6.654e-02, 2.816e-02, 9.087e-02, 3.775e-02, -5.950e-02, -9.644e-02, 1.381e-01, 3.020e-02, 8.428e-02, 6.284e-02, 1.957e-02, 1.963e-01, -1.774e-02, -8.771e-02)); + r += mul(s1_0, M4(3.828e-02, -2.100e-02, -6.482e-02, -3.354e-03, -1.010e-01, -2.989e-02, 5.974e-03, 6.596e-02, -1.756e-02, -2.670e-02, 1.149e-02, 7.257e-02, 8.638e-02, 3.747e-02, 1.499e-01, -5.391e-02)); + r += mul(s1_1, M4(-9.688e-02, 3.194e-02, 2.861e-02, -3.458e-02, 1.374e-01, 1.100e-01, 1.814e-01, -2.460e-03, 6.353e-02, 1.382e-01, -3.290e-02, 6.976e-02, 4.006e-02, -4.895e-03, 9.192e-02, 2.136e-02)); + r += mul(s1_2, M4(-1.040e-01, -2.338e-02, -6.577e-02, 6.761e-02, -7.097e-02, -8.443e-02, 1.492e-01, 3.257e-02, -3.813e-02, 8.250e-03, 4.018e-03, -3.037e-03, -5.739e-02, 7.913e-02, 9.387e-02, -6.153e-03)); + r += mul(s1_3, M4(-9.678e-02, -4.993e-02, 1.814e-02, 1.246e-01, 4.507e-02, -5.729e-02, -6.812e-02, 2.663e-02, 5.196e-02, 1.187e-01, -3.827e-02, -1.047e-01, -4.993e-02, -4.158e-02, 1.339e-01, -7.618e-03)); + r += mul(s1_4, M4(7.790e-02, 1.260e-01, 1.135e-01, 2.632e-01, -1.092e-01, -1.550e-02, 1.861e-01, -7.397e-02, -8.339e-02, -1.461e-02, 1.268e-01, 8.259e-02, -1.115e-01, 4.943e-03, 3.752e-02, 2.763e-01)); + r += mul(s1_5, M4(-1.888e-01, 1.706e-01, 7.704e-02, 1.294e-01, 8.372e-02, -4.005e-03, -9.525e-02, -4.460e-02, 5.904e-02, 1.120e-01, -1.089e-01, 1.037e-01, 6.043e-02, -1.171e-01, -1.444e-02, 1.108e-02)); + r += mul(s1_6, M4(5.883e-02, -3.481e-02, 4.111e-02, -1.202e-01, -2.393e-02, -2.932e-02, 3.660e-03, 3.720e-02, 1.081e-01, 7.342e-02, -6.897e-02, 2.116e-02, 1.964e-01, -2.016e-02, 1.181e-02, -1.616e-01)); + r += mul(s1_7, M4(-1.357e-01, -1.062e-02, -1.336e-01, -6.073e-02, -9.438e-02, -8.379e-02, 8.636e-02, 1.988e-01, -2.967e-02, 2.383e-02, 9.142e-02, -1.144e-01, 5.726e-02, 3.158e-02, -6.711e-02, -7.534e-02)); + r += mul(s1_8, M4(-2.777e-01, -3.806e-02, 1.198e-02, -1.016e-02, -5.348e-02, -1.018e-01, 7.266e-02, 7.254e-03, 4.831e-02, 3.528e-02, -6.299e-02, -1.290e-01, -6.714e-02, 3.922e-02, 5.039e-03, 7.812e-02)); + r += mul(s2_0, M4(7.907e-02, -1.144e-02, 6.876e-03, 3.150e-02, 8.083e-02, -4.558e-02, 2.990e-02, -9.142e-02, -4.976e-02, 4.591e-02, -3.455e-02, -4.650e-02, 1.029e-02, 7.486e-02, 1.384e-01, 8.629e-02)); + r += mul(s2_1, M4(-3.017e-02, -6.396e-02, -2.038e-01, 8.795e-02, -5.005e-02, -7.113e-02, 6.117e-02, 6.995e-02, 6.845e-02, 2.185e-01, 1.031e-01, -7.041e-02, -1.091e-01, -2.143e-02, -6.323e-02, 5.283e-02)); + r += mul(s2_2, M4(-1.305e-01, -5.319e-02, -1.015e-02, 8.036e-02, -3.181e-02, -7.211e-02, -1.132e-01, -6.489e-02, -9.395e-02, -1.447e-02, -2.309e-02, 1.443e-02, -6.069e-03, 8.539e-02, -8.914e-03, 1.129e-02)); + r += mul(s2_3, M4(4.047e-02, 1.181e-01, -7.255e-02, -5.920e-02, -1.926e-03, 1.544e-01, -2.920e-02, 2.937e-02, -9.288e-02, 6.596e-02, -1.287e-02, 1.706e-01, -1.099e-02, -4.462e-02, 1.277e-01, 6.293e-02)); + r += mul(s2_4, M4(-1.109e-01, 1.195e-01, -2.507e-01, -5.579e-02, -3.435e-02, -1.160e-01, -2.351e-01, -5.408e-02, -2.173e-01, 5.764e-02, 4.518e-02, -1.061e-01, -9.047e-02, -3.664e-01, -1.069e-02, 1.379e-01)); + r += mul(s2_5, M4(-6.895e-02, 6.064e-02, 1.544e-01, 4.203e-02, -3.691e-02, 6.640e-03, -4.824e-02, -1.499e-01, 3.623e-02, -1.206e-01, -1.845e-02, 9.345e-02, 4.797e-02, -1.096e-01, 2.049e-02, 7.366e-02)); + r += mul(s2_6, M4(7.105e-02, 2.269e-02, -1.065e-01, -4.301e-02, 6.915e-02, 2.761e-02, -1.506e-01, 1.086e-03, -3.163e-02, -3.753e-02, 6.290e-02, -1.198e-02, -6.298e-02, -6.580e-02, 6.394e-02, 2.602e-01)); + r += mul(s2_7, M4(-1.115e-01, -4.285e-02, -9.923e-03, -1.589e-02, -2.703e-01, 2.065e-02, 5.478e-02, -1.091e-01, 4.712e-02, 8.844e-02, -1.995e-01, -2.274e-01, -1.262e-01, -1.413e-01, 1.099e-01, -1.430e-01)); + r += mul(s2_8, M4(1.737e-02, -3.458e-03, 1.451e-02, -2.577e-02, 7.890e-02, -1.703e-02, -7.593e-02, 7.170e-02, -7.863e-02, -8.196e-03, 6.095e-02, 1.259e-01, -3.556e-02, -3.050e-02, 2.776e-03, 7.601e-02)); + r += mul(s3_0, M4(-1.945e-01, -1.678e-01, -4.334e-02, 1.725e-02, 1.183e-01, -2.776e-02, -1.773e-02, -3.394e-02, -1.384e-02, 3.826e-02, -6.860e-02, 2.523e-02, -4.153e-02, 7.668e-02, -1.258e-02, 1.143e-02)); + r += mul(s3_1, M4(1.460e-01, -1.318e-01, 2.057e-01, -1.582e-01, -1.335e-01, 7.058e-02, 1.566e-02, -5.043e-02, 3.790e-02, 5.916e-02, 6.523e-03, -1.478e-01, 4.719e-02, 3.452e-02, 4.558e-02, -2.316e-02)); + r += mul(s3_2, M4(-1.304e-01, -1.636e-01, 8.311e-02, -6.273e-02, 1.521e-01, 2.406e-04, -5.286e-02, -1.113e-02, 4.382e-02, 1.461e-03, -1.054e-01, 2.726e-02, -2.819e-02, 8.521e-02, 4.887e-03, -8.432e-02)); + r += mul(s3_3, M4(-5.002e-02, -4.256e-02, 1.073e-01, 3.849e-02, 3.163e-02, -1.599e-01, -6.356e-02, -9.985e-03, -2.242e-02, -4.897e-02, -1.111e-01, 4.739e-02, 7.998e-02, -3.330e-04, 7.776e-02, 3.637e-02)); + r += mul(s3_4, M4(-1.776e-02, -9.190e-03, 3.079e-01, 6.996e-02, 7.989e-03, -1.833e-01, -1.111e-01, 5.754e-02, -2.713e-02, -3.977e-02, 3.147e-02, -4.155e-02, 3.760e-01, -2.202e-01, -6.909e-02, 9.248e-02)); + r += mul(s3_5, M4(-2.031e-01, 7.541e-02, -1.677e-02, -1.225e-01, 5.202e-02, 1.734e-02, 2.679e-02, -8.093e-04, -2.525e-03, -5.872e-02, 1.113e-02, 9.559e-02, 4.538e-02, -4.660e-02, -1.257e-01, -2.602e-02)); + r += mul(s3_6, M4(-3.247e-02, -5.548e-02, 2.158e-01, 6.249e-02, 1.102e-01, -3.439e-02, 6.277e-02, 6.411e-03, 3.234e-02, 4.465e-02, -7.207e-03, 6.141e-02, 5.406e-02, 1.072e-01, -1.963e-02, -3.139e-02)); + r += mul(s3_7, M4(-2.096e-01, -1.077e-01, 7.613e-02, 1.057e-01, -1.232e-01, 7.859e-02, -7.996e-02, 3.703e-02, -2.961e-03, 8.288e-02, -5.762e-02, -9.681e-02, -1.464e-02, 6.819e-02, 4.520e-02, 1.719e-01)); + r += mul(s3_8, M4(-8.420e-02, -1.095e-01, 1.215e-02, 3.436e-02, 6.192e-02, 3.912e-02, 7.981e-02, 3.137e-01, 2.237e-02, 2.784e-02, -4.654e-02, 8.559e-03, -8.479e-02, 1.238e-02, 1.205e-02, -3.051e-03)); + r += mul(s4_0, M4(1.511e-02, -9.252e-03, 5.790e-03, 3.753e-02, 7.565e-02, -9.476e-02, 1.589e-02, -6.392e-02, 3.726e-02, 6.833e-02, -4.575e-03, -1.903e-02, 9.657e-03, 8.578e-03, 2.505e-02, -7.624e-03)); + r += mul(s4_1, M4(3.406e-02, 5.978e-02, -4.693e-02, 7.297e-03, -7.254e-02, 9.246e-02, 9.101e-02, -9.069e-03, 9.585e-02, -5.271e-02, -5.087e-02, -6.168e-02, -9.070e-03, -8.431e-02, 2.675e-02, 9.518e-02)); + r += mul(s4_2, M4(2.053e-02, 4.954e-02, 4.810e-02, -7.866e-02, -4.082e-02, -4.793e-02, 6.687e-03, -1.911e-02, 2.363e-02, 1.289e-02, 2.680e-02, -6.178e-02, -1.386e-02, 4.961e-03, -4.103e-02, -2.998e-02)); + r += mul(s4_3, M4(1.265e-01, 6.002e-02, -5.993e-02, 2.239e-02, 4.585e-02, -7.239e-02, 8.562e-03, -5.115e-02, -3.372e-02, 1.246e-01, 3.284e-02, -7.553e-03, -8.669e-03, 2.122e-02, 6.986e-03, -5.931e-02)); + r += mul(s4_4, M4(3.469e-02, -1.594e-03, 2.107e-03, -2.065e-01, 3.869e-02, -4.408e-02, -3.861e-02, 1.545e-02, -1.170e-02, 9.890e-02, -6.240e-02, -6.230e-02, -2.656e-02, -9.663e-02, 9.523e-02, 4.473e-02)); + r += mul(s4_5, M4(1.138e-02, 6.733e-03, -1.154e-01, -4.058e-02, 4.270e-02, -2.085e-03, 2.183e-03, 1.249e-01, 1.701e-01, -5.283e-02, -4.708e-02, -5.570e-02, -5.821e-02, -1.068e-01, 1.369e-01, 1.492e-01)); + r += mul(s4_6, M4(-2.277e-02, -1.163e-01, -1.232e-02, 4.009e-03, -3.210e-03, -1.049e-01, 2.828e-02, 2.007e-02, 1.880e-01, 1.803e-01, 1.202e-01, -4.261e-03, -8.411e-03, -6.796e-02, 4.724e-02, -1.382e-01)); + r += mul(s4_7, M4(-1.065e-01, -2.180e-03, -7.782e-02, -1.642e-02, -3.885e-02, -1.393e-02, -3.343e-02, -5.628e-02, 1.699e-01, -6.423e-02, 9.618e-02, -9.226e-02, -1.071e-01, 2.686e-02, -9.786e-03, -1.699e-01)); + r += mul(s4_8, M4(3.426e-03, -4.191e-02, 2.161e-02, 1.556e-01, -1.128e-02, 1.101e-01, -4.549e-02, -1.002e-02, 8.034e-02, 2.625e-02, -2.265e-02, -5.273e-02, 3.267e-02, 2.136e-02, 1.819e-03, -8.445e-03)); + r += mul(s5_0, M4(-1.543e-01, -7.893e-02, -1.042e-01, -4.412e-02, -3.244e-02, 3.192e-03, 1.214e-01, -1.500e-02, -3.626e-02, 1.581e-02, 7.494e-03, 5.572e-02, -4.054e-03, 1.962e-02, -1.363e-01, 7.033e-02)); + r += mul(s5_1, M4(-2.474e-02, 3.145e-02, 5.622e-02, -6.296e-02, 5.492e-02, -4.185e-02, 7.467e-02, 5.331e-02, -2.310e-02, 2.976e-02, 5.042e-02, -5.251e-03, 1.195e-01, -6.692e-02, 6.893e-02, -7.826e-02)); + r += mul(s5_2, M4(2.109e-02, -5.746e-03, 5.626e-02, -1.174e-01, -1.033e-01, -2.948e-02, -1.530e-01, 9.934e-02, -6.408e-03, -1.846e-02, -4.852e-02, 4.990e-02, 1.627e-01, 4.525e-02, -6.003e-03, 1.175e-01)); + r += mul(s5_3, M4(-6.157e-02, -6.800e-02, 2.204e-02, 2.086e-02, -1.796e-01, 5.360e-02, -7.831e-02, 8.739e-02, -5.539e-02, 7.619e-02, 4.859e-02, -3.974e-02, 4.414e-02, 3.187e-02, -4.088e-02, -5.784e-02)); + r += mul(s5_4, M4(1.870e-01, 1.430e-01, 6.715e-02, -3.192e-01, -8.249e-03, -4.895e-02, -1.775e-01, -1.211e-02, 5.246e-02, -1.028e-01, -1.829e-01, -2.604e-02, 8.037e-02, -5.044e-02, -8.484e-03, -5.692e-02)); + r += mul(s5_5, M4(7.599e-02, 7.251e-02, -1.234e-01, 3.917e-02, -6.220e-02, -3.332e-02, -1.971e-01, -4.996e-03, -7.553e-02, 3.844e-02, -1.313e-01, -5.345e-02, -6.988e-02, -9.938e-02, 1.562e-01, -7.072e-02)); + r += mul(s5_6, M4(8.148e-02, 8.224e-02, 1.979e-01, 1.761e-01, -2.081e-01, -7.891e-03, 2.253e-02, -5.107e-02, -1.033e-01, -1.002e-01, 1.686e-02, 1.496e-02, 4.147e-02, -3.550e-02, 1.365e-03, -8.448e-02)); + r += mul(s5_7, M4(2.520e-02, -1.215e-02, -7.120e-02, 1.434e-01, 5.238e-02, -4.046e-02, 2.844e-02, 8.513e-02, -5.495e-02, -1.260e-01, -7.741e-02, -5.583e-02, -4.865e-02, 5.129e-02, -6.376e-02, -6.701e-02)); + r += mul(s5_8, M4(-4.859e-02, 2.361e-02, 1.190e-01, 1.642e-01, -9.418e-02, -1.948e-02, -1.088e-01, -5.529e-02, 6.670e-02, -7.794e-02, 7.296e-02, -2.764e-03, 1.796e-01, 1.090e-02, -2.495e-02, 4.582e-02)); + r += mul(s6_0, M4(-5.357e-02, -1.255e-02, 2.167e-02, 2.385e-02, -1.343e-01, -9.890e-02, 1.080e-01, -3.771e-02, 1.413e-02, 1.873e-02, 6.132e-02, -3.476e-02, -1.697e-02, 1.685e-01, -3.233e-02, 1.537e-01)); + r += mul(s6_1, M4(-7.470e-02, -1.743e-02, -1.708e-02, 1.016e-01, -2.885e-02, 2.759e-01, 8.246e-02, 8.111e-02, 2.180e-02, 1.975e-01, 4.139e-02, -5.838e-02, 2.880e-01, 3.660e-02, 1.437e-01, -2.724e-02)); + r += mul(s6_2, M4(2.805e-02, 4.007e-02, 3.674e-02, 9.905e-02, 1.284e-02, -1.238e-01, -5.328e-02, -1.677e-01, 2.169e-02, -6.419e-03, 2.584e-02, -5.450e-02, -9.392e-02, 1.529e-01, -1.063e-02, -4.322e-02)); + r += mul(s6_3, M4(-5.460e-02, -4.692e-02, -6.811e-02, -9.443e-02, -1.052e-01, 5.419e-02, 6.251e-02, -1.415e-01, 9.546e-02, -6.588e-02, -5.084e-02, 9.510e-02, 1.441e-01, 1.078e-01, 8.965e-02, -3.965e-02)); + r += mul(s6_4, M4(1.503e-01, -1.248e-01, 1.122e-01, -3.047e-02, -3.949e-02, -1.048e-01, -5.012e-02, -4.756e-02, 8.160e-02, -1.789e-01, 3.578e-02, 1.013e-01, 3.092e-02, 3.357e-02, -1.165e-02, 2.127e-01)); + r += mul(s6_5, M4(1.087e-01, -3.543e-02, -4.847e-03, 1.176e-03, -1.534e-03, -6.062e-02, 3.015e-02, -2.010e-02, -6.407e-02, -3.185e-02, 9.524e-02, 1.449e-01, -1.586e-01, 9.769e-02, -4.502e-02, -2.382e-02)); + r += mul(s6_6, M4(-7.326e-02, -1.414e-02, 8.860e-02, -1.082e-01, -1.479e-01, -5.904e-02, -3.166e-03, -3.973e-02, -1.012e-02, -2.806e-02, 5.465e-02, 9.396e-02, -6.241e-02, 6.763e-02, 4.198e-02, -9.115e-03)); + r += mul(s6_7, M4(9.795e-02, 1.486e-01, -4.049e-02, -2.027e-01, 3.147e-02, 2.180e-02, -5.846e-02, 6.627e-02, -9.838e-02, 1.340e-03, 5.795e-02, -3.384e-02, 5.155e-03, 1.505e-01, 1.303e-01, 9.453e-02)); + r += mul(s6_8, M4(7.614e-02, -5.840e-02, 7.337e-02, 9.552e-03, 6.193e-02, -6.492e-02, -3.637e-02, -1.006e-02, -9.000e-02, 5.542e-02, -1.137e-01, -1.461e-01, 9.594e-02, -4.110e-02, 2.555e-01, 1.538e-01)); + r += mul(s7_0, M4(-4.090e-02, -1.584e-01, 6.009e-03, 4.241e-02, -7.851e-02, -1.891e-02, -1.294e-01, 7.073e-02, -6.965e-02, -1.393e-01, -3.263e-02, 4.283e-02, -2.880e-02, -8.045e-02, -3.110e-02, -3.723e-02)); + r += mul(s7_1, M4(7.501e-02, 1.715e-01, -1.412e-01, -5.020e-02, -7.131e-02, 1.504e-02, -1.315e-01, 7.303e-02, 5.994e-02, 6.750e-04, -1.436e-01, -7.401e-02, 8.432e-02, -3.126e-02, 4.516e-02, 2.611e-02)); + r += mul(s7_2, M4(-9.791e-02, -3.010e-02, 3.730e-02, 2.211e-01, 9.011e-02, -2.170e-02, -1.503e-01, -1.351e-03, -3.374e-02, -1.586e-01, 4.537e-02, -4.016e-02, 3.440e-02, 8.301e-02, -2.345e-02, -1.047e-01)); + r += mul(s7_3, M4(4.726e-03, -1.440e-01, -1.918e-02, -6.087e-02, -2.039e-02, 1.680e-01, 7.678e-02, 3.246e-02, -9.188e-02, -1.428e-01, -7.054e-02, -4.589e-02, 1.097e-01, 4.248e-02, 9.779e-02, -5.377e-02)); + r += mul(s7_4, M4(1.140e-01, 7.803e-02, -1.629e-01, 3.934e-02, 1.460e-01, -8.277e-02, -2.556e-01, 2.779e-02, 1.764e-01, -5.843e-02, -1.032e-01, 6.965e-02, -1.226e-01, -1.023e-01, -3.626e-02, 1.119e-01)); + r += mul(s7_5, M4(2.249e-01, -2.232e-01, -4.929e-02, 6.349e-02, -4.084e-02, 1.465e-02, -1.406e-01, 1.851e-02, 2.453e-02, -7.126e-02, 1.207e-02, 9.391e-02, -4.615e-02, 1.280e-01, -4.366e-02, -4.766e-02)); + r += mul(s7_6, M4(-9.260e-02, 4.395e-02, -1.591e-02, 1.160e-01, -4.981e-02, -3.446e-03, 1.558e-02, -7.517e-03, 9.090e-03, -1.203e-01, -1.635e-02, 3.306e-03, -8.822e-02, -1.986e-03, 4.776e-03, 7.837e-02)); + r += mul(s7_7, M4(-1.941e-01, -1.647e-01, -1.748e-01, -2.672e-01, 1.248e-01, 6.852e-02, -1.307e-01, 2.776e-02, -2.553e-02, 8.394e-02, 7.780e-02, -4.222e-02, -1.564e-01, 5.224e-02, -8.394e-02, -9.676e-03)); + r += mul(s7_8, M4(-3.461e-02, -9.314e-03, -7.496e-02, 1.333e-01, 6.383e-02, -6.956e-03, 5.022e-02, 1.759e-01, 6.323e-02, 7.062e-02, -2.913e-03, -5.013e-02, -1.868e-02, -1.214e-01, 4.730e-02, 8.127e-02)); + r += V4(-9.248e-03, 2.579e-02, -3.134e-03, 9.669e-03); + return r; +} + +V4 f1(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(2.663e-02, 3.573e-02, 3.160e-02, 3.179e-02, -1.139e-02, -2.377e-01, 2.398e-02, -6.937e-02, 8.542e-02, 1.260e-02, 5.305e-02, -1.027e-01, -2.232e-02, -3.775e-02, -1.290e-01, 1.404e-02)); + r += mul(s0_1, M4(4.846e-02, 9.449e-02, 1.311e-01, 3.851e-02, -1.737e-02, -2.450e-01, 6.982e-02, -7.079e-02, -1.920e-02, -1.712e-01, 1.282e-01, -2.338e-02, -4.105e-02, -1.808e-01, 2.626e-01, 1.768e-01)); + r += mul(s0_2, M4(-1.921e-02, -1.367e-02, 1.222e-01, 4.826e-02, 5.288e-02, -3.231e-02, -1.508e-01, -6.038e-02, -1.523e-02, 4.821e-02, 3.348e-03, 4.788e-02, 5.726e-02, -5.976e-02, 1.916e-01, 1.611e-01)); + r += mul(s0_3, M4(8.216e-03, 1.343e-01, 9.327e-02, 5.472e-02, 7.263e-02, -4.809e-02, -7.638e-02, -7.174e-02, -5.490e-02, 2.225e-01, -1.328e-01, -3.526e-02, 1.267e-02, 2.465e-02, -5.855e-02, -2.627e-02)); + r += mul(s0_4, M4(-1.407e-01, -8.979e-02, 1.193e-01, -1.609e-01, -5.270e-02, 5.800e-02, -1.368e-01, 2.581e-03, 1.552e-01, -1.095e-01, -7.026e-02, 9.304e-02, -3.085e-02, -4.825e-03, -3.428e-01, 2.084e-01)); + r += mul(s0_5, M4(-1.373e-01, 4.969e-02, -1.441e-01, 9.402e-02, 1.693e-01, -1.024e-01, -1.389e-01, -8.313e-02, 1.894e-01, -1.958e-01, 1.754e-01, 7.405e-02, 1.316e-01, -2.585e-01, -4.974e-02, 2.022e-01)); + r += mul(s0_6, M4(-2.163e-02, 5.919e-02, -1.898e-02, -3.715e-02, -1.390e-02, -2.874e-02, -4.194e-02, -5.698e-02, 1.136e-01, 8.847e-02, -2.969e-01, -2.920e-02, 9.156e-02, 1.106e-01, -1.933e-02, 6.158e-02)); + r += mul(s0_7, M4(-3.552e-02, 1.153e-01, -1.916e-02, -6.388e-02, -3.472e-02, -6.423e-02, 3.745e-02, 9.731e-02, 2.254e-02, 8.993e-02, -2.307e-01, -9.372e-03, 1.145e-01, 4.845e-02, -6.438e-02, 1.110e-01)); + r += mul(s0_8, M4(6.302e-02, 2.867e-02, 1.221e-01, 4.384e-02, 5.529e-02, -6.174e-02, -2.728e-02, -1.700e-02, -8.450e-03, 1.797e-01, -1.562e-01, -4.187e-02, 8.052e-02, -2.005e-01, 1.629e-01, -3.207e-02)); + r += mul(s1_0, M4(-9.700e-02, -1.379e-02, -5.259e-02, 4.906e-02, 7.132e-02, -9.649e-02, -6.448e-03, -3.662e-02, 7.594e-04, 1.604e-02, 5.802e-03, 2.184e-04, -1.599e-02, 1.653e-02, 3.313e-02, -4.064e-02)); + r += mul(s1_1, M4(1.299e-01, 1.212e-02, -1.715e-01, -1.813e-02, 1.272e-01, 2.094e-02, -1.047e-01, 1.227e-01, 7.166e-02, -2.531e-02, -2.501e-02, -6.219e-02, -3.725e-02, -1.393e-02, 2.518e-03, 5.498e-03)); + r += mul(s1_2, M4(1.017e-01, -1.189e-01, 1.943e-02, -1.318e-03, -7.588e-02, 1.398e-01, 9.943e-02, -2.078e-02, -1.502e-02, -2.359e-02, -3.587e-02, 4.861e-02, 3.589e-02, 9.188e-02, 3.024e-02, -5.091e-02)); + r += mul(s1_3, M4(4.126e-02, -2.310e-01, 1.046e-01, 2.332e-01, -7.066e-02, -6.313e-03, -4.567e-03, 1.480e-02, 3.615e-02, -4.300e-02, 2.026e-02, 7.725e-02, -9.011e-02, -2.195e-02, 6.867e-02, 4.186e-03)); + r += mul(s1_4, M4(-7.472e-02, -4.031e-02, -1.416e-01, -1.453e-01, 3.689e-02, 5.077e-02, 2.386e-01, 8.009e-02, -1.776e-02, -1.754e-02, 1.543e-02, 1.298e-01, -1.286e-02, 1.735e-02, -4.372e-02, 5.004e-02)); + r += mul(s1_5, M4(7.579e-02, 4.976e-04, -1.751e-01, 3.413e-02, -4.651e-02, 1.532e-01, 2.524e-03, 3.198e-02, 1.865e-02, 7.633e-02, -8.661e-03, -8.857e-02, 7.275e-02, 6.012e-03, -4.343e-02, 2.194e-01)); + r += mul(s1_6, M4(3.561e-02, -1.975e-01, -1.553e-01, 7.688e-02, 7.823e-02, 3.841e-02, -7.595e-02, -9.052e-03, 2.869e-02, -2.724e-02, -5.237e-02, 3.539e-02, 7.125e-02, 6.169e-02, -5.338e-02, -1.247e-01)); + r += mul(s1_7, M4(8.636e-02, -1.742e-01, -1.153e-01, -5.277e-02, 6.017e-02, 8.485e-02, 2.407e-02, 6.711e-02, 2.165e-02, -6.010e-02, 1.138e-01, 4.745e-02, 3.359e-02, -9.350e-02, -4.098e-03, 1.539e-02)); + r += mul(s1_8, M4(1.893e-02, -1.004e-01, -1.206e-01, 6.257e-02, -9.174e-02, 4.435e-02, 8.294e-02, -1.323e-02, 3.174e-03, 1.658e-02, 9.627e-02, 4.803e-02, 5.214e-02, 4.139e-02, 1.213e-01, -6.390e-02)); + r += mul(s2_0, M4(-1.003e-01, -2.060e-02, 7.643e-02, 8.917e-03, -1.845e-03, 1.274e-01, -6.574e-03, 3.525e-02, 4.085e-02, -6.564e-02, 6.702e-02, -2.237e-02, -5.356e-02, -5.959e-02, -1.211e-01, -6.724e-03)); + r += mul(s2_1, M4(8.614e-02, -1.609e-01, 7.359e-02, 6.662e-02, -5.600e-03, 3.820e-02, -1.706e-01, -9.107e-02, 4.658e-03, -1.218e-01, -6.839e-02, -1.595e-01, -1.676e-01, -3.686e-02, 1.929e-01, 1.209e-02)); + r += mul(s2_2, M4(1.763e-01, 6.953e-02, 4.514e-02, -5.794e-02, 1.325e-02, -6.248e-02, 1.411e-01, 1.559e-02, 4.946e-02, -2.265e-01, 1.125e-01, 5.394e-02, -1.750e-02, 4.500e-02, -1.248e-01, -1.765e-02)); + r += mul(s2_3, M4(-1.029e-01, -1.013e-01, -1.063e-01, -9.505e-02, 1.116e-01, -1.684e-02, -6.668e-02, -1.788e-02, -4.550e-02, -6.653e-02, -2.074e-02, -7.063e-02, -9.743e-02, 4.777e-02, -3.770e-02, -4.267e-02)); + r += mul(s2_4, M4(2.858e-01, 7.134e-02, -8.271e-02, 1.058e-01, -1.034e-01, 1.048e-02, -1.470e-01, -8.929e-02, -2.202e-01, -4.561e-01, -7.260e-02, -1.335e-01, 8.094e-03, -1.764e-01, 6.452e-02, -8.200e-02)); + r += mul(s2_5, M4(-7.771e-02, 6.318e-02, 2.476e-02, -1.248e-01, 8.019e-02, -1.921e-01, -8.554e-02, 1.549e-01, 2.037e-01, -2.268e-01, -8.223e-02, -1.499e-02, 8.035e-02, -5.437e-02, 9.512e-02, 3.877e-02)); + r += mul(s2_6, M4(5.986e-02, 1.200e-02, -6.885e-02, -3.239e-03, 7.123e-02, -4.501e-02, -8.298e-02, 6.258e-03, 3.682e-02, 2.750e-02, 5.589e-02, -4.066e-02, -7.148e-02, 1.147e-02, 1.011e-01, 4.193e-02)); + r += mul(s2_7, M4(-5.912e-02, -4.001e-02, -1.402e-01, -1.004e-01, 6.142e-02, 1.464e-02, -3.567e-01, -2.251e-01, 3.545e-02, -5.070e-02, -1.870e-01, -1.834e-01, -3.509e-02, -5.190e-02, 1.373e-01, 1.254e-01)); + r += mul(s2_8, M4(-4.374e-02, -1.312e-02, -3.855e-02, -4.781e-02, 4.914e-02, -1.227e-01, -1.656e-01, -1.675e-02, -5.363e-02, -4.299e-03, -1.644e-01, -1.710e-02, -6.290e-02, 2.749e-03, 4.811e-04, 7.494e-02)); + r += mul(s3_0, M4(7.418e-02, 2.413e-02, 2.179e-01, 1.002e-01, -6.673e-03, 1.446e-01, -4.374e-02, 1.830e-02, 7.794e-02, 4.814e-02, 5.367e-02, -2.835e-02, 4.846e-02, 1.012e-01, -5.740e-02, -2.012e-02)); + r += mul(s3_1, M4(-1.076e-01, 2.386e-01, 4.229e-02, 1.792e-01, 2.957e-02, -7.132e-03, 3.811e-02, 3.139e-02, 2.056e-01, -6.285e-02, 7.038e-02, 8.697e-02, 7.951e-03, -1.323e-01, 4.550e-02, -9.253e-02)); + r += mul(s3_2, M4(-1.992e-02, 4.952e-02, 2.321e-02, -6.068e-02, 5.577e-03, -3.496e-02, 1.100e-02, 4.701e-02, -6.097e-02, 3.211e-02, 7.370e-02, 5.026e-02, -1.176e-03, 9.178e-03, 2.910e-02, 6.707e-02)); + r += mul(s3_3, M4(-1.284e-01, 1.173e-02, 2.513e-01, 4.469e-02, 1.003e-02, -1.182e-01, -4.960e-02, 2.868e-02, 1.974e-03, -4.529e-02, 1.680e-02, 1.219e-02, 6.489e-02, 3.270e-02, 2.856e-03, -2.437e-02)); + r += mul(s3_4, M4(-2.342e-01, 4.384e-01, 2.001e-01, -4.318e-02, -2.596e-03, -5.227e-02, 2.451e-01, -6.867e-02, -1.310e-01, 6.207e-02, -3.253e-02, -9.466e-02, 1.424e-02, -5.704e-02, 1.606e-01, -3.421e-01)); + r += mul(s3_5, M4(-1.507e-01, 2.010e-01, 8.911e-02, -8.064e-02, 1.800e-01, 1.194e-01, -1.134e-02, 1.642e-01, -2.123e-01, -1.612e-02, -3.988e-02, -7.009e-02, 9.302e-02, -3.479e-02, -2.334e-02, -8.769e-03)); + r += mul(s3_6, M4(-1.859e-02, -1.743e-02, 2.540e-01, 3.481e-02, -5.009e-02, -4.857e-02, -7.388e-02, 6.612e-02, -1.630e-02, 1.151e-01, -8.329e-02, 2.283e-02, 1.228e-01, 8.869e-02, 8.183e-02, 2.168e-02)); + r += mul(s3_7, M4(-1.030e-01, -3.114e-03, 1.257e-01, 5.785e-02, 7.695e-02, 7.875e-03, -1.929e-01, -6.950e-05, -4.482e-02, -4.113e-03, -1.171e-01, 8.258e-02, -8.507e-03, -1.046e-01, 6.857e-02, -3.029e-02)); + r += mul(s3_8, M4(2.446e-02, 5.971e-02, 5.623e-02, 1.255e-01, -8.937e-03, 3.395e-02, 1.949e-02, -3.246e-02, -2.415e-02, -1.666e-02, -6.608e-02, -4.302e-02, 1.015e-01, -9.010e-02, -5.383e-02, -8.861e-02)); + r += mul(s4_0, M4(2.870e-02, 5.795e-02, -4.586e-02, -8.181e-03, 2.942e-02, 5.082e-02, -5.689e-03, 9.240e-03, 4.014e-02, 3.368e-02, -3.481e-02, -1.248e-01, -5.246e-02, 9.443e-02, -2.095e-02, 1.967e-02)); + r += mul(s4_1, M4(-2.031e-02, -2.830e-02, 1.334e-02, -8.101e-03, -1.085e-01, 2.567e-02, 7.094e-02, 5.787e-02, 4.140e-02, 1.147e-02, 9.587e-02, -1.425e-01, 2.933e-02, 3.509e-02, 1.724e-01, -2.731e-02)); + r += mul(s4_2, M4(-1.860e-03, -4.974e-02, 3.231e-02, 7.355e-03, -2.778e-02, 1.611e-01, 2.444e-02, 8.233e-02, 7.862e-02, 2.351e-02, -1.022e-02, -7.801e-02, -3.894e-02, 1.514e-02, 8.644e-02, 4.537e-02)); + r += mul(s4_3, M4(3.963e-02, -1.404e-03, 4.396e-02, 8.070e-02, -6.941e-02, 6.948e-02, 4.566e-02, -2.384e-02, 1.194e-01, 2.032e-01, 8.894e-02, -1.514e-01, 4.098e-02, -3.902e-02, 1.593e-02, 1.235e-01)); + r += mul(s4_4, M4(5.303e-02, 6.492e-02, -3.854e-02, 4.180e-02, -2.960e-03, -5.687e-02, -1.223e-01, 2.594e-02, -1.240e-01, -8.107e-02, 1.643e-01, -7.760e-02, 1.478e-02, -1.137e-02, 5.575e-02, 1.585e-01)); + r += mul(s4_5, M4(4.148e-02, 3.501e-02, -1.017e-02, -5.189e-03, -5.128e-02, -1.322e-01, 6.951e-02, 9.929e-03, -3.974e-02, -5.354e-02, -7.879e-02, -1.421e-01, -1.860e-01, -6.520e-02, 2.233e-01, -3.510e-02)); + r += mul(s4_6, M4(1.584e-02, -1.890e-01, 6.972e-02, 7.349e-02, 3.867e-02, 1.448e-02, -9.357e-02, 4.793e-02, 2.141e-01, 3.160e-01, 6.640e-02, -1.808e-01, -3.964e-02, -3.513e-02, -1.367e-01, 1.663e-02)); + r += mul(s4_7, M4(4.660e-02, -1.508e-01, -8.482e-02, 7.494e-02, 3.497e-02, -1.054e-01, -5.170e-02, 7.540e-02, 5.040e-02, 8.157e-02, -1.403e-01, -2.148e-03, 6.321e-03, -3.587e-02, -1.364e-01, 1.370e-01)); + r += mul(s4_8, M4(-6.566e-02, -2.770e-02, -1.794e-02, 2.547e-02, 7.739e-02, -1.032e-01, -1.455e-01, -7.336e-02, 6.629e-02, 2.620e-02, -8.784e-02, -3.572e-02, 2.198e-02, -1.402e-01, 1.540e-02, -3.120e-02)); + r += mul(s5_0, M4(7.106e-02, 2.706e-02, 2.206e-02, 2.482e-02, 5.481e-02, 1.434e-01, 9.398e-02, -9.003e-03, -5.256e-03, -1.218e-01, 2.484e-03, -4.917e-02, -4.145e-02, 4.515e-02, -3.105e-02, 2.698e-02)); + r += mul(s5_1, M4(1.633e-01, 2.688e-01, 4.356e-02, -4.851e-02, -1.091e-01, 2.399e-01, -8.502e-02, 4.810e-03, -1.683e-02, -4.995e-02, -1.154e-02, -2.006e-03, 1.245e-01, -3.599e-03, 1.517e-01, -6.009e-02)); + r += mul(s5_2, M4(5.579e-02, -6.718e-02, 5.835e-02, -5.433e-02, -6.252e-02, 1.592e-01, -2.415e-01, -3.498e-03, -4.435e-02, -8.581e-02, -1.006e-01, 4.444e-02, -6.519e-02, 1.304e-01, -1.404e-01, 3.976e-02)); + r += mul(s5_3, M4(1.713e-01, 2.055e-01, 2.371e-02, 9.614e-02, -1.554e-01, -5.299e-02, 1.901e-01, -1.948e-01, 3.469e-03, -8.674e-02, -1.929e-01, 6.825e-02, 3.659e-02, -1.318e-01, 4.520e-02, -4.470e-02)); + r += mul(s5_4, M4(-3.117e-02, 3.879e-01, -4.774e-02, -9.195e-02, -1.407e-01, -1.282e-01, -4.174e-02, 2.968e-02, 3.210e-02, 9.048e-03, 2.540e-02, 1.136e-01, 1.598e-01, -1.205e-01, 5.497e-02, -1.612e-01)); + r += mul(s5_5, M4(-1.579e-02, 2.492e-01, -1.458e-01, -7.247e-02, -2.458e-01, -1.097e-01, 1.808e-01, -2.019e-03, 5.261e-02, -1.370e-01, -1.082e-01, 7.321e-02, 7.172e-02, 4.009e-02, 4.015e-02, -2.922e-01)); + r += mul(s5_6, M4(7.843e-02, 2.011e-01, -2.855e-02, -1.125e-01, 1.346e-01, 1.834e-01, 2.303e-02, 2.286e-02, 5.182e-02, -6.831e-03, 2.276e-01, -1.567e-02, 3.638e-02, -3.162e-02, -1.084e-01, -3.247e-02)); + r += mul(s5_7, M4(3.780e-03, 1.666e-01, 1.484e-01, -1.534e-01, -5.629e-02, 7.632e-02, 1.376e-01, -3.399e-02, 2.648e-02, -3.358e-02, 1.152e-01, 7.617e-02, 4.750e-03, -9.384e-02, 4.874e-03, 9.212e-02)); + r += mul(s5_8, M4(-2.864e-01, 2.671e-01, -8.083e-02, -9.173e-02, -3.624e-02, -1.240e-01, -4.755e-02, -1.147e-01, 8.944e-03, 4.023e-02, -6.581e-02, 3.924e-02, 1.563e-01, -2.466e-01, 2.736e-01, -2.829e-02)); + r += mul(s6_0, M4(3.454e-02, 4.907e-03, 1.759e-01, -2.260e-02, -6.025e-02, -9.115e-02, 1.239e-01, 9.932e-02, 4.134e-02, 3.477e-02, 7.780e-03, 1.504e-02, -6.135e-02, 1.305e-01, 2.783e-01, -8.530e-02)); + r += mul(s6_1, M4(-7.489e-02, 1.256e-01, 6.719e-02, -1.312e-02, 5.527e-02, 1.743e-01, -2.603e-02, -1.856e-02, -4.894e-02, -5.220e-03, -9.751e-02, -6.255e-02, 1.721e-02, 1.428e-01, 8.609e-02, -1.931e-01)); + r += mul(s6_2, M4(-3.560e-03, 3.581e-03, 4.381e-03, -5.233e-02, -7.191e-02, 2.366e-01, 7.837e-02, -7.278e-02, -1.503e-02, 1.267e-02, 7.984e-02, 8.166e-02, 3.384e-03, -3.630e-02, 2.452e-01, -4.846e-02)); + r += mul(s6_3, M4(1.409e-01, -5.460e-02, -7.154e-02, 9.662e-03, 2.511e-02, -5.559e-02, -2.400e-01, 4.025e-02, -7.148e-02, -2.844e-02, 4.508e-02, -1.666e-02, 1.084e-02, 1.696e-01, -1.175e-01, -1.194e-01)); + r += mul(s6_4, M4(-1.884e-01, 3.910e-02, -1.289e-01, -1.088e-01, 3.357e-02, 6.130e-02, 8.805e-03, -1.275e-01, -1.181e-01, -3.456e-02, 5.731e-02, -2.597e-01, -1.981e-01, 3.257e-02, -9.962e-02, -1.001e-01)); + r += mul(s6_5, M4(9.773e-02, 1.062e-02, 1.079e-01, 7.377e-02, -1.285e-02, 1.068e-01, 3.774e-02, -2.815e-02, -8.242e-02, 7.684e-02, -9.929e-02, -6.032e-02, -1.261e-02, -1.095e-01, 2.211e-01, -1.299e-02)); + r += mul(s6_6, M4(1.216e-02, 5.718e-02, -3.228e-02, 9.389e-03, -5.748e-02, 1.410e-01, -7.183e-02, -6.529e-02, -2.041e-02, 4.350e-02, 8.421e-02, -1.284e-02, -4.060e-02, 4.178e-02, 5.984e-02, -5.652e-02)); + r += mul(s6_7, M4(1.156e-01, 5.795e-02, 9.929e-03, -2.015e-02, -1.636e-01, -6.938e-02, -1.737e-01, 4.317e-02, 1.722e-02, -1.930e-02, 1.952e-01, -2.675e-02, -2.033e-01, 2.390e-02, -1.255e-01, 2.645e-03)); + r += mul(s6_8, M4(1.267e-02, -1.096e-02, 7.513e-02, -1.194e-02, -1.441e-03, 1.111e-02, -1.026e-01, -4.972e-02, -4.979e-02, -6.357e-02, -1.229e-02, -1.549e-02, 4.419e-02, 2.950e-01, 5.272e-02, -2.957e-02)); + r += mul(s7_0, M4(-4.764e-02, -6.165e-02, 1.538e-01, 9.830e-03, 4.903e-02, -1.458e-01, 1.383e-01, 5.074e-02, -1.344e-02, -6.074e-03, -5.067e-02, -4.629e-02, -4.420e-03, -1.331e-02, -3.949e-02, -6.188e-04)); + r += mul(s7_1, M4(-1.795e-02, 6.593e-02, -3.127e-01, -1.740e-01, 3.898e-02, -3.126e-02, -1.538e-01, 2.400e-02, -2.798e-02, -3.590e-02, 7.410e-02, 2.130e-02, -4.461e-03, 5.434e-02, 2.883e-02, 2.667e-02)); + r += mul(s7_2, M4(1.237e-02, 5.499e-02, -1.273e-01, -1.156e-01, 1.424e-01, -1.258e-03, 1.371e-02, 2.027e-02, 1.008e-01, 6.674e-02, 4.499e-02, 2.501e-02, -8.317e-02, 7.529e-02, -6.850e-02, -3.784e-02)); + r += mul(s7_3, M4(-3.737e-02, -5.870e-03, 3.237e-02, -1.124e-01, -9.034e-02, -1.274e-01, 3.342e-02, 7.105e-02, -1.314e-01, 2.508e-02, -3.401e-02, -9.204e-02, 5.544e-02, 1.018e-01, -6.085e-02, -6.019e-03)); + r += mul(s7_4, M4(-2.714e-01, -2.963e-01, -1.685e-01, -2.489e-01, 4.202e-02, 3.484e-02, -3.542e-02, -7.937e-02, -8.434e-02, 2.660e-02, -9.034e-02, 6.340e-03, -4.910e-02, -1.012e-01, -3.295e-02, 3.424e-02)); + r += mul(s7_5, M4(-9.240e-02, 1.731e-01, -1.717e-01, -1.064e-01, 1.709e-01, -5.175e-02, 1.502e-01, 1.928e-02, -4.976e-03, 7.204e-02, 6.187e-02, -3.323e-02, 6.619e-02, -3.219e-02, -4.676e-03, -3.696e-03)); + r += mul(s7_6, M4(-5.651e-03, -8.852e-02, 6.467e-02, -7.485e-02, 2.775e-02, 5.363e-02, 3.246e-02, -7.201e-02, -1.304e-02, 1.058e-01, -1.672e-01, -6.017e-02, -8.539e-02, -1.457e-01, -1.979e-02, 5.357e-02)); + r += mul(s7_7, M4(-2.462e-02, -2.363e-01, -1.963e-02, -1.183e-01, 1.425e-02, 8.463e-02, -7.534e-02, 5.798e-02, -9.598e-02, 2.081e-02, 2.889e-02, -1.178e-02, 7.588e-02, -9.646e-02, 3.119e-02, -1.140e-02)); + r += mul(s7_8, M4(2.760e-02, -7.598e-02, 1.765e-01, -5.347e-02, 3.620e-02, -7.794e-02, 4.037e-02, -1.442e-02, 1.240e-02, 6.169e-02, -1.550e-02, -8.514e-03, -1.049e-02, 1.607e-01, 1.066e-01, 3.096e-02)); + r += V4(7.479e-03, -6.194e-03, 1.320e-03, -7.964e-03); + return r; +} + +V4 f2(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(8.430e-02, -3.763e-02, 2.044e-02, 2.159e-02, 8.186e-02, 2.197e-02, -7.806e-02, -3.065e-02, -7.532e-03, 1.757e-01, -2.800e-01, -1.676e-02, 1.776e-02, 7.224e-02, -1.259e-01, 2.911e-02)); + r += mul(s0_1, M4(3.012e-02, 3.678e-05, -1.356e-02, -2.604e-02, -1.241e-01, -1.935e-01, 5.610e-03, 1.341e-01, -8.708e-02, 1.234e-01, 4.167e-02, 1.259e-01, -6.455e-02, -6.625e-03, 5.397e-02, 4.600e-02)); + r += mul(s0_2, M4(-2.491e-02, 5.725e-02, -1.763e-02, 3.437e-02, -5.220e-02, 8.810e-02, -1.411e-01, 7.865e-02, 7.891e-02, -4.207e-03, 4.996e-02, -9.937e-02, 2.713e-02, -4.735e-02, -1.598e-01, 7.724e-02)); + r += mul(s0_3, M4(-4.406e-02, 6.415e-02, -4.933e-02, 5.740e-02, 3.741e-02, 9.063e-02, -1.393e-02, -7.392e-02, 6.447e-02, 5.608e-02, -2.735e-02, -1.100e-01, -5.250e-03, 9.540e-02, -3.442e-02, 5.128e-02)); + r += mul(s0_4, M4(1.509e-01, 1.112e-01, 1.287e-02, 3.433e-02, -5.654e-02, 4.547e-02, 6.433e-03, -9.677e-02, -1.243e-01, 2.642e-01, -1.367e-01, -1.725e-01, -6.274e-02, -2.195e-03, 1.876e-01, 7.703e-02)); + r += mul(s0_5, M4(-5.247e-02, -3.219e-03, -3.712e-02, -7.956e-02, -6.361e-02, 4.913e-02, -4.173e-02, -7.252e-02, -8.908e-02, -7.582e-02, -5.119e-02, -1.812e-01, 1.378e-01, 1.358e-01, 3.654e-02, 1.169e-01)); + r += mul(s0_6, M4(-2.404e-02, 2.365e-02, 7.012e-02, -7.389e-03, -2.636e-02, 5.250e-02, -1.963e-02, 7.453e-02, -3.787e-02, -1.015e-01, 1.352e-02, -1.706e-01, 1.528e-02, -8.125e-02, 5.031e-02, -5.389e-02)); + r += mul(s0_7, M4(-5.166e-02, -7.660e-03, 2.108e-02, 6.046e-03, -5.190e-02, -4.010e-03, -6.305e-02, 4.929e-03, -6.187e-03, 2.259e-01, 7.503e-02, 7.217e-02, -9.784e-02, -8.002e-02, 4.003e-02, 7.586e-02)); + r += mul(s0_8, M4(-3.035e-03, -1.403e-02, 1.668e-02, -3.657e-02, 9.571e-04, -1.242e-01, -4.894e-02, -1.703e-02, -8.390e-02, -4.609e-02, -4.676e-02, -5.820e-02, 7.860e-02, 8.434e-03, 4.485e-02, 9.159e-02)); + r += mul(s1_0, M4(-3.446e-02, -1.680e-01, 3.259e-02, 7.439e-03, -1.256e-02, 7.677e-02, -1.888e-01, -1.630e-01, 7.922e-02, 9.013e-03, -5.748e-02, 1.094e-01, -2.331e-02, 5.989e-02, -4.874e-02, -2.901e-02)); + r += mul(s1_1, M4(1.509e-01, 3.699e-02, 1.630e-02, -1.730e-01, -2.339e-02, 3.929e-02, -2.129e-01, -3.177e-01, -6.895e-03, 1.291e-02, -9.745e-02, 1.131e-01, 4.728e-04, 2.713e-03, -7.145e-02, -8.768e-04)); + r += mul(s1_2, M4(-9.738e-02, 1.201e-01, 9.683e-02, -8.188e-03, -8.669e-03, -2.850e-02, 4.446e-03, 1.838e-02, 6.435e-02, -1.051e-01, 5.622e-02, 1.079e-01, -8.372e-02, 5.742e-02, -9.410e-02, -1.178e-01)); + r += mul(s1_3, M4(-1.274e-01, -3.866e-02, -5.815e-02, 7.166e-02, -3.350e-02, -1.201e-02, -1.950e-02, 1.569e-01, -4.578e-02, -4.500e-02, 1.124e-02, -1.199e-02, 3.623e-02, 1.357e-01, 3.165e-02, 7.996e-02)); + r += mul(s1_4, M4(1.977e-01, -8.830e-02, 1.915e-02, 9.525e-02, 1.441e-02, 9.018e-02, 5.043e-02, 3.517e-02, -4.349e-02, -7.091e-02, 1.408e-01, -3.890e-02, -5.690e-02, -3.911e-04, -6.398e-02, -9.388e-02)); + r += mul(s1_5, M4(8.464e-02, -4.588e-02, 7.772e-02, -7.091e-02, -7.751e-02, -7.299e-02, -1.756e-02, -8.245e-02, 8.981e-02, -1.468e-01, 4.185e-02, 1.570e-03, -5.250e-02, 1.306e-01, -2.109e-03, -1.039e-02)); + r += mul(s1_6, M4(-9.170e-02, -2.145e-01, 7.325e-02, -3.369e-02, 5.012e-02, -2.545e-02, 2.888e-03, -3.379e-02, 3.622e-02, -5.937e-03, 5.761e-02, -1.032e-03, -2.598e-02, -1.295e-02, -2.028e-02, -2.185e-02)); + r += mul(s1_7, M4(-7.833e-02, -1.620e-01, -1.643e-01, 2.656e-02, -5.703e-02, 1.094e-03, 6.141e-04, -5.740e-02, 1.012e-02, 2.077e-01, 8.564e-02, 1.496e-02, -1.041e-01, 4.901e-02, -9.006e-02, 5.301e-02)); + r += mul(s1_8, M4(2.529e-02, -6.643e-02, 4.730e-02, 4.944e-02, 4.444e-02, -1.255e-01, 2.971e-02, 1.443e-02, -5.764e-02, -1.901e-02, -5.798e-02, 1.340e-02, -3.938e-02, 5.376e-02, 1.825e-02, 7.330e-02)); + r += mul(s2_0, M4(1.808e-02, 9.112e-02, 9.888e-02, -5.158e-02, 8.239e-02, 5.468e-02, 1.934e-02, -1.203e-01, -8.099e-02, 1.578e-01, 2.154e-01, -5.725e-02, -4.725e-02, -1.062e-01, -1.264e-01, 4.121e-02)); + r += mul(s2_1, M4(-5.263e-02, 6.941e-02, 6.418e-02, 2.440e-01, 2.653e-02, 4.805e-02, 1.915e-02, -1.560e-01, -1.711e-01, 1.073e-01, -1.012e-01, -4.586e-02, -6.455e-03, -4.339e-03, 1.678e-01, -4.486e-03)); + r += mul(s2_2, M4(-4.876e-02, -1.993e-02, -6.981e-02, 3.753e-02, -3.258e-02, 3.133e-02, 3.133e-02, -5.825e-02, 4.361e-02, 8.687e-02, -1.392e-02, -1.155e-01, 7.298e-02, 8.208e-03, -1.453e-01, 1.300e-02)); + r += mul(s2_3, M4(-4.487e-02, 1.990e-02, -1.695e-01, 1.582e-02, -2.516e-02, -6.183e-02, -1.899e-01, 9.599e-02, 1.729e-02, 4.271e-02, 1.829e-01, -4.410e-03, -3.464e-02, -1.282e-01, -3.271e-03, -3.695e-02)); + r += mul(s2_4, M4(-2.379e-01, -1.111e-01, -7.252e-02, 2.307e-02, 1.419e-01, 1.810e-01, -1.036e-01, 2.302e-02, 5.548e-03, -2.212e-01, 8.717e-02, 1.478e-01, 1.195e-01, 1.247e-01, 3.053e-02, 1.035e-01)); + r += mul(s2_5, M4(-5.517e-02, -4.884e-03, 4.262e-02, -2.404e-02, -1.153e-01, 5.702e-02, -3.170e-02, 1.302e-02, -5.458e-02, 1.273e-01, 3.232e-02, 7.172e-03, -2.841e-02, 4.835e-02, -4.832e-02, 2.811e-02)); + r += mul(s2_6, M4(5.292e-03, -9.579e-02, -1.466e-02, -4.698e-02, 3.646e-02, -1.541e-01, -4.505e-02, 7.720e-02, -1.202e-02, -6.506e-02, -3.220e-02, -2.880e-02, 1.926e-02, 6.278e-02, 5.749e-03, -1.510e-02)); + r += mul(s2_7, M4(4.021e-02, -9.431e-02, 4.499e-02, 1.060e-01, 3.923e-02, 1.659e-01, -4.001e-02, 1.043e-01, -7.788e-02, -1.557e-01, 2.371e-02, -2.362e-02, 4.443e-02, -9.105e-03, 4.307e-02, -1.228e-02)); + r += mul(s2_8, M4(-1.876e-02, -9.252e-02, -6.358e-03, -1.258e-03, 1.082e-01, -7.880e-02, 5.527e-02, -1.771e-02, 6.621e-02, -1.951e-01, -3.723e-02, 7.825e-02, 3.900e-02, 5.570e-02, 2.862e-02, 1.219e-02)); + r += mul(s3_0, M4(-5.432e-03, 8.206e-02, 1.544e-01, 4.700e-02, 9.866e-02, 5.702e-02, -6.146e-02, -6.524e-02, -6.292e-02, 4.738e-02, -5.601e-02, 5.550e-02, 1.044e-02, 5.213e-02, -1.029e-01, 1.060e-01)); + r += mul(s3_1, M4(-6.110e-02, -8.903e-02, 1.822e-01, 8.739e-02, -1.033e-01, -6.282e-02, 1.867e-03, 1.235e-02, -4.629e-02, -3.759e-02, -8.009e-02, 5.644e-02, 1.260e-01, -7.835e-02, 1.230e-01, 1.167e-01)); + r += mul(s3_2, M4(-7.750e-02, -4.775e-03, -2.441e-02, 1.267e-03, -3.243e-03, -2.793e-02, 1.633e-03, -9.708e-02, 6.038e-02, 6.274e-02, -1.096e-01, -3.582e-03, 6.546e-02, -7.050e-03, -4.282e-02, 6.356e-02)); + r += mul(s3_3, M4(-5.984e-02, 2.632e-01, 2.347e-02, -1.079e-01, -1.953e-02, 1.136e-02, 1.678e-01, -1.807e-02, -9.635e-02, 1.001e-01, 3.262e-02, -1.118e-02, 1.446e-02, 4.709e-02, 2.822e-01, -2.795e-03)); + r += mul(s3_4, M4(-6.552e-03, 1.214e-01, 2.273e-02, -6.601e-03, 9.477e-02, 7.205e-02, 7.632e-02, 3.441e-01, 8.145e-03, -3.942e-02, 2.930e-02, 1.833e-02, 1.496e-01, 3.105e-02, 2.039e-01, 3.777e-01)); + r += mul(s3_5, M4(-3.077e-02, -8.840e-03, 3.186e-02, -2.523e-02, -1.409e-01, 1.073e-02, -7.960e-02, -2.800e-02, 6.708e-02, 3.546e-02, -1.679e-02, -2.793e-02, -4.138e-02, 9.311e-02, -3.216e-03, 3.354e-02)); + r += mul(s3_6, M4(-3.083e-02, 2.603e-01, 4.596e-02, -1.330e-03, -8.299e-02, -2.662e-02, -3.704e-02, -7.918e-02, -1.663e-02, 3.238e-02, 4.395e-03, -2.074e-02, 2.951e-02, 2.525e-02, -8.565e-04, -7.202e-02)); + r += mul(s3_7, M4(6.224e-02, -1.555e-01, -1.481e-01, -2.135e-02, -1.010e-01, -1.670e-02, 6.495e-02, -6.264e-02, 2.055e-02, -1.442e-01, 4.283e-02, -1.181e-02, 4.616e-02, -1.277e-01, -1.033e-01, -1.062e-01)); + r += mul(s3_8, M4(-5.627e-02, -4.951e-02, -7.015e-02, -4.087e-02, -1.958e-02, 3.923e-02, -6.462e-02, -2.031e-02, -4.688e-02, -6.262e-02, 1.886e-02, -2.789e-02, 1.281e-02, 6.714e-02, -1.233e-02, 4.252e-02)); + r += mul(s4_0, M4(-5.900e-02, -1.120e-02, 2.173e-02, 7.670e-02, -2.079e-02, -3.550e-02, -3.565e-02, -8.277e-02, -8.467e-02, -6.557e-02, 1.665e-02, 4.077e-03, 6.528e-03, 3.253e-02, -1.869e-02, -4.227e-02)); + r += mul(s4_1, M4(-3.366e-02, -8.582e-02, -1.080e-01, 1.154e-01, -5.242e-02, -1.353e-01, -2.081e-02, 1.130e-01, -5.835e-02, -4.013e-02, 2.943e-02, 2.138e-02, -1.349e-02, 8.821e-03, -4.397e-02, -2.010e-02)); + r += mul(s4_2, M4(6.710e-02, 1.435e-02, -6.456e-03, 8.669e-02, -3.837e-02, 8.042e-02, -1.042e-01, 2.781e-02, -5.994e-02, -7.096e-02, 1.048e-02, 1.026e-01, -5.373e-03, 2.659e-02, -9.218e-02, -1.542e-02)); + r += mul(s4_3, M4(-1.931e-02, 1.020e-01, 3.003e-01, 6.374e-02, -9.365e-03, 9.304e-03, 5.861e-02, -8.938e-03, -4.927e-02, -3.379e-02, -1.179e-01, 1.485e-01, 1.077e-02, -8.328e-02, 8.623e-02, 5.525e-02)); + r += mul(s4_4, M4(-7.206e-02, 1.434e-01, 1.026e-01, 1.033e-01, -8.858e-02, -5.545e-02, 6.758e-02, 2.602e-03, -1.438e-01, -3.117e-02, 8.943e-02, 1.704e-01, -9.621e-02, 8.983e-02, 2.294e-01, -7.152e-02)); + r += mul(s4_5, M4(-4.845e-02, -7.738e-02, 5.348e-02, -6.079e-04, -1.698e-02, 8.341e-02, -3.714e-03, -6.279e-02, 4.644e-02, -2.537e-02, 1.567e-01, -1.895e-01, 2.102e-01, -2.693e-02, 2.032e-02, -1.407e-02)); + r += mul(s4_6, M4(-4.629e-03, 1.149e-02, -1.967e-02, -1.199e-02, -2.276e-02, -6.675e-02, -9.782e-02, -6.834e-02, 1.175e-02, -1.861e-01, 5.953e-02, -9.044e-02, 4.873e-02, 7.172e-02, -3.632e-02, 3.668e-02)); + r += mul(s4_7, M4(-1.014e-01, -2.352e-02, -4.855e-02, -3.958e-02, -9.258e-02, -8.375e-04, -2.510e-02, -6.243e-02, -4.628e-02, -5.860e-02, -1.068e-01, -9.276e-02, -8.298e-02, -8.761e-02, 5.141e-03, -5.266e-02)); + r += mul(s4_8, M4(-9.811e-03, 5.491e-02, -1.249e-02, -2.922e-02, -1.158e-04, -2.626e-02, -5.066e-02, -9.524e-02, -1.889e-02, 1.679e-02, -5.950e-02, 2.263e-03, 5.595e-02, 1.231e-01, -4.877e-02, -2.439e-02)); + r += mul(s5_0, M4(7.424e-02, -2.488e-02, -9.549e-02, -4.383e-02, -8.372e-02, -8.668e-02, 1.996e-01, -2.088e-02, -2.865e-02, -4.754e-03, 1.455e-02, 1.933e-02, 4.837e-02, -8.041e-03, -9.727e-03, 1.869e-02)); + r += mul(s5_1, M4(9.111e-02, -1.293e-01, -4.139e-02, 1.554e-02, 2.723e-03, -1.077e-01, 2.327e-01, -1.201e-01, 8.658e-02, 1.344e-02, -3.333e-03, -4.063e-02, -1.110e-01, -1.188e-01, -4.989e-02, 2.422e-01)); + r += mul(s5_2, M4(-6.935e-05, 6.199e-02, -9.141e-03, 5.849e-02, -5.873e-02, 4.224e-02, 4.203e-02, 5.583e-03, -2.714e-02, 2.112e-02, 2.515e-02, 3.705e-02, -7.747e-02, -5.863e-02, -6.713e-02, -6.701e-02)); + r += mul(s5_3, M4(5.835e-03, -1.858e-01, 1.874e-01, 2.459e-02, -3.903e-02, 1.430e-01, -1.457e-01, 5.243e-03, 5.728e-02, -7.350e-02, -1.569e-02, -6.887e-02, -1.258e-03, 8.374e-02, 5.132e-02, 1.807e-03)); + r += mul(s5_4, M4(3.215e-02, -3.627e-01, 3.379e-01, 1.343e-01, -1.749e-01, -2.623e-01, 5.681e-03, 1.008e-01, 7.570e-02, -6.389e-02, 7.694e-02, 5.292e-03, -1.308e-02, -5.631e-02, 7.423e-02, -7.345e-02)); + r += mul(s5_5, M4(1.426e-01, -5.201e-02, 1.086e-01, 3.665e-03, 1.046e-01, -2.734e-02, 3.172e-03, -8.829e-02, 1.569e-01, -1.352e-02, 6.193e-02, -2.948e-02, 1.041e-01, -1.714e-01, -7.391e-02, 1.037e-01)); + r += mul(s5_6, M4(5.654e-02, -1.197e-01, -2.979e-02, -1.301e-01, -1.731e-02, -1.315e-01, -3.223e-02, 2.595e-02, 1.343e-01, -4.696e-02, -1.933e-01, 9.608e-02, -7.795e-03, 5.023e-02, -9.176e-02, 6.673e-02)); + r += mul(s5_7, M4(-6.545e-02, -1.544e-01, 3.045e-01, -2.001e-01, -9.368e-02, -1.918e-02, 8.318e-02, 2.702e-02, -5.971e-02, -3.530e-02, -1.033e-01, -8.986e-02, -6.790e-02, -3.885e-02, -2.127e-01, 2.390e-02)); + r += mul(s5_8, M4(2.971e-02, 1.405e-01, 1.113e-01, -2.698e-02, -8.093e-02, -1.345e-01, -5.902e-02, -1.384e-01, 6.276e-02, 1.945e-01, -5.075e-02, -8.079e-02, 7.333e-02, 2.016e-01, -6.289e-02, -2.979e-02)); + r += mul(s6_0, M4(1.445e-03, -4.488e-02, -2.415e-02, 1.054e-01, 6.162e-03, -1.355e-01, 9.439e-02, 9.080e-03, -4.235e-02, -2.195e-02, -1.061e-01, 4.653e-02, -7.711e-02, 4.756e-02, 9.480e-02, 1.635e-01)); + r += mul(s6_1, M4(1.183e-01, -3.675e-02, -9.809e-03, -5.022e-02, -1.591e-01, -1.402e-01, -3.720e-02, 9.323e-02, 4.738e-02, -1.776e-02, 3.707e-02, -8.379e-02, -8.759e-02, -1.718e-01, -8.317e-04, 1.322e-01)); + r += mul(s6_2, M4(-2.019e-02, -6.700e-02, -7.803e-02, -3.497e-02, -8.818e-02, -7.762e-02, 7.796e-02, 1.219e-01, 2.817e-02, 9.422e-02, 5.756e-02, 2.422e-03, -1.135e-01, 3.744e-02, 1.005e-01, 9.330e-02)); + r += mul(s6_3, M4(-3.284e-02, -1.332e-01, -5.783e-02, 6.113e-03, 5.051e-02, -1.081e-01, 1.299e-02, -1.549e-01, 4.547e-02, -1.470e-02, 9.428e-02, 3.999e-02, -1.083e-01, -1.736e-02, 2.101e-02, -1.027e-01)); + r += mul(s6_4, M4(1.999e-01, -2.282e-01, -5.370e-02, 1.913e-01, 6.297e-02, 3.588e-01, 5.296e-02, -4.865e-03, 2.450e-01, -1.021e-02, 9.037e-02, 1.332e-01, -1.555e-01, 4.639e-02, -1.286e-01, 1.229e-01)); + r += mul(s6_5, M4(-1.487e-01, 3.054e-02, -5.555e-03, 1.334e-01, -1.896e-01, -3.180e-03, 6.536e-02, 2.874e-02, -9.890e-02, -5.342e-02, 4.329e-02, 2.736e-02, 4.534e-02, 2.542e-01, -4.647e-02, -2.836e-02)); + r += mul(s6_6, M4(5.066e-02, 1.479e-01, 5.918e-02, 6.793e-02, 3.198e-02, -5.455e-02, -8.127e-02, 1.549e-01, -8.015e-02, -1.433e-01, -3.517e-02, -2.834e-03, 9.370e-03, 6.598e-02, -1.077e-01, 1.052e-02)); + r += mul(s6_7, M4(-5.899e-02, 2.721e-02, 2.773e-02, 2.215e-02, -6.861e-02, -3.365e-02, 4.181e-03, -2.475e-02, 5.120e-03, 5.010e-02, 3.918e-02, -2.160e-02, -2.827e-01, -5.059e-04, -2.682e-02, 1.556e-01)); + r += mul(s6_8, M4(1.836e-02, -1.041e-01, -2.065e-03, -3.724e-02, -3.146e-02, -2.356e-01, -1.360e-03, 2.028e-02, 2.248e-03, -2.449e-02, 2.114e-02, -7.193e-02, 8.894e-02, -5.642e-02, 7.970e-02, 3.218e-02)); + r += mul(s7_0, M4(-1.689e-02, -8.536e-02, 6.276e-02, -8.715e-05, 1.777e-02, 3.522e-02, 6.070e-02, 6.502e-02, -2.579e-02, 2.513e-02, -2.430e-02, -3.051e-02, 1.130e-02, -6.306e-02, 5.845e-02, 9.750e-02)); + r += mul(s7_1, M4(-2.998e-01, 1.075e-01, 7.024e-02, -5.273e-02, -7.570e-02, 2.087e-02, -3.490e-02, 7.225e-02, 8.222e-02, 6.358e-02, -4.160e-02, -7.680e-02, 2.715e-02, -6.176e-02, -4.450e-02, -1.597e-01)); + r += mul(s7_2, M4(-1.689e-01, 3.540e-02, -5.165e-02, -4.040e-03, 8.521e-02, 6.889e-02, 4.339e-02, 6.233e-02, -6.550e-02, 3.086e-02, 1.696e-03, 1.017e-02, 5.270e-02, -3.555e-02, 3.351e-02, 2.184e-02)); + r += mul(s7_3, M4(-2.087e-02, -9.450e-03, -5.071e-02, -4.235e-02, -2.721e-02, -2.547e-02, 4.675e-02, -9.540e-02, 4.705e-02, 1.342e-01, -2.493e-01, -4.504e-03, -7.887e-02, 4.524e-02, 3.062e-02, -1.208e-01)); + r += mul(s7_4, M4(1.069e-01, -1.192e-01, 4.192e-02, -2.510e-02, 3.077e-02, 4.369e-02, 8.598e-02, 5.367e-02, 2.032e-01, 4.614e-02, -1.152e-01, 1.086e-01, -2.778e-02, 1.948e-01, 2.998e-03, 1.059e-01)); + r += mul(s7_5, M4(-3.729e-01, 4.792e-02, 3.370e-02, -4.074e-02, -7.209e-02, 2.201e-03, -3.790e-02, 8.322e-02, 3.937e-02, 1.004e-01, -3.502e-02, 2.757e-02, -1.634e-02, -3.628e-02, -2.714e-02, -2.970e-03)); + r += mul(s7_6, M4(-2.734e-02, 5.581e-02, 7.820e-04, 4.765e-02, 5.535e-02, -5.839e-02, -1.618e-02, 1.199e-01, -2.490e-02, -6.918e-02, -2.497e-02, 4.537e-04, 4.291e-02, 1.673e-01, 5.112e-02, 1.837e-02)); + r += mul(s7_7, M4(-3.817e-02, -2.869e-01, 1.028e-01, 5.419e-02, -6.207e-02, -1.313e-01, -5.905e-02, -8.926e-02, 2.281e-03, 1.567e-01, 5.908e-02, 5.334e-02, -2.630e-02, -6.773e-02, -5.950e-03, 1.270e-02)); + r += mul(s7_8, M4(-8.944e-02, -2.145e-01, 3.549e-02, -4.949e-02, 4.003e-02, 4.562e-02, 2.117e-02, 2.740e-02, 5.503e-02, -1.659e-02, -3.981e-02, -9.706e-02, 1.123e-02, -1.722e-02, 1.784e-02, 5.567e-02)); + r += V4(5.351e-03, -4.746e-03, 1.930e-02, 9.374e-03); + return r; +} + +V4 f3(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(4.969e-02, -6.798e-02, -1.631e-02, 1.910e-02, 4.617e-02, 7.579e-02, -8.022e-02, 4.732e-02, 1.322e-01, 2.937e-02, -6.443e-02, 2.656e-02, -4.332e-02, 2.143e-02, -3.290e-02, 8.648e-02)); + r += mul(s0_1, M4(4.241e-02, -2.179e-02, -2.367e-02, -1.959e-02, -9.025e-02, 1.486e-02, -8.249e-02, -2.254e-02, 1.462e-01, 7.592e-02, -1.422e-01, 1.703e-01, -3.402e-03, 1.878e-02, 3.641e-02, -1.572e-01)); + r += mul(s0_2, M4(-5.421e-02, -4.759e-03, 2.244e-02, -8.270e-03, -1.239e-01, 7.347e-03, -8.013e-02, -1.097e-01, 4.680e-02, -1.434e-02, 9.645e-02, 3.507e-02, -1.215e-01, 4.258e-02, 1.093e-01, -5.892e-02)); + r += mul(s0_3, M4(4.112e-03, -4.066e-02, -4.552e-03, 4.021e-02, -3.030e-02, 8.381e-02, -5.320e-02, 1.506e-01, 1.518e-02, -4.773e-02, -8.290e-02, 7.934e-02, 8.910e-02, -3.802e-02, 1.241e-01, -1.218e-01)); + r += mul(s0_4, M4(-8.291e-02, 2.520e-02, 6.809e-02, -1.336e-01, 2.307e-01, 9.379e-02, -9.976e-02, 1.416e-01, 2.085e-01, 4.064e-02, 7.195e-02, 5.775e-02, 2.698e-02, 7.983e-02, 2.770e-01, 5.432e-02)); + r += mul(s0_5, M4(5.054e-02, 6.358e-03, -7.003e-02, -4.608e-02, -6.481e-02, -8.573e-03, 4.816e-02, 2.117e-02, 9.525e-02, 1.064e-01, 3.040e-02, -9.385e-02, -9.724e-02, -3.018e-02, 3.774e-03, 2.656e-02)); + r += mul(s0_6, M4(-9.158e-03, 6.796e-02, -3.302e-02, -1.438e-02, 3.986e-02, 3.158e-02, -2.615e-02, -2.499e-02, 1.700e-02, -4.627e-02, -3.077e-02, 1.543e-01, -1.178e-02, 6.861e-02, 1.617e-01, -1.282e-02)); + r += mul(s0_7, M4(-5.207e-02, 3.744e-02, -2.341e-02, 6.656e-02, 5.310e-02, -3.374e-03, -2.944e-02, -1.715e-02, 1.132e-01, -1.197e-01, -4.874e-02, -2.272e-02, -2.206e-01, 1.917e-01, 2.666e-01, -3.541e-01)); + r += mul(s0_8, M4(9.013e-03, 5.871e-03, -1.161e-02, -4.242e-02, -9.910e-02, 2.651e-02, 1.013e-02, -5.149e-02, -7.412e-03, 8.343e-02, -1.898e-02, -5.075e-02, -1.845e-01, 3.698e-02, 9.461e-02, -2.120e-01)); + r += mul(s1_0, M4(2.429e-02, -7.648e-02, 3.298e-02, -3.032e-03, 7.314e-02, -6.164e-02, 3.428e-02, -1.245e-02, -4.498e-02, 1.093e-02, -2.699e-02, 7.298e-02, -5.168e-02, 1.331e-02, -7.590e-02, 7.366e-02)); + r += mul(s1_1, M4(1.099e-01, -4.955e-02, -1.224e-01, 7.346e-03, 4.914e-03, -4.370e-02, 1.103e-01, -7.748e-02, 7.237e-04, 4.676e-02, -9.357e-02, 4.997e-03, -4.390e-02, 3.752e-02, -2.866e-02, 3.281e-02)); + r += mul(s1_2, M4(-1.262e-02, 1.775e-02, -3.496e-02, 6.971e-02, 7.479e-02, 1.286e-02, 4.882e-02, 4.406e-02, 1.038e-01, 2.825e-02, -3.748e-02, -6.979e-02, 4.078e-02, 4.772e-03, -1.167e-02, -4.336e-02)); + r += mul(s1_3, M4(2.242e-02, -1.776e-01, 1.049e-02, 1.485e-02, -8.566e-02, 3.446e-02, -1.039e-02, -6.812e-02, 1.424e-03, -6.183e-03, 5.377e-02, -9.231e-03, -8.639e-02, -6.571e-02, 1.050e-02, 9.043e-02)); + r += mul(s1_4, M4(3.096e-02, -1.431e-01, -2.843e-02, -7.583e-02, 5.026e-03, 2.955e-02, -2.720e-02, -1.345e-01, -2.240e-02, -5.411e-02, 6.056e-03, -7.368e-02, 8.799e-02, -4.958e-02, -3.041e-02, 5.679e-02)); + r += mul(s1_5, M4(1.070e-01, -4.377e-02, -2.826e-02, 8.609e-02, 4.070e-02, -7.259e-02, -3.162e-05, -7.352e-02, 4.335e-02, 1.387e-02, -4.858e-02, -2.004e-02, 1.130e-01, -7.727e-02, -7.790e-02, 1.178e-01)); + r += mul(s1_6, M4(1.159e-01, 9.055e-02, 1.792e-01, 2.068e-01, 2.690e-02, -1.557e-02, 2.118e-02, 1.547e-01, -2.155e-02, 2.029e-02, -4.170e-02, -1.762e-02, -3.505e-02, -3.280e-03, -8.604e-02, 3.944e-02)); + r += mul(s1_7, M4(1.398e-01, -2.824e-02, -4.291e-03, 1.327e-01, 5.433e-02, -3.675e-02, 1.093e-01, 9.705e-02, 1.108e-02, -4.899e-02, 7.807e-03, -4.815e-02, 1.042e-01, 3.069e-02, -6.328e-02, -1.331e-02)); + r += mul(s1_8, M4(4.031e-02, -9.825e-02, -1.363e-02, -4.161e-02, -2.145e-02, -2.666e-02, 2.548e-02, -3.093e-02, -4.397e-02, -3.312e-02, -3.893e-02, -1.042e-01, 6.282e-03, 7.359e-02, -3.994e-02, -4.463e-02)); + r += mul(s2_0, M4(3.742e-02, 2.102e-03, -8.991e-02, 1.841e-03, 1.011e-01, 1.243e-02, 2.460e-02, 7.946e-02, 8.754e-02, 8.191e-02, -7.770e-02, -1.909e-01, -6.812e-02, -6.579e-02, 3.355e-02, 1.095e-02)); + r += mul(s2_1, M4(1.468e-01, -5.954e-03, -1.652e-01, 1.304e-01, 1.597e-01, 3.018e-02, 9.813e-03, 5.645e-02, 8.428e-02, 5.243e-03, -5.279e-02, 4.396e-02, -1.099e-01, -9.407e-03, -5.214e-02, -5.491e-02)); + r += mul(s2_2, M4(-4.267e-02, 3.507e-02, -1.628e-02, 1.785e-02, 6.790e-02, 4.417e-02, -9.246e-02, -4.941e-02, -1.218e-02, 3.533e-02, 1.662e-02, -7.595e-02, -1.858e-02, -6.408e-02, 8.688e-05, 8.104e-02)); + r += mul(s2_3, M4(-9.009e-02, 2.668e-02, -1.378e-01, 1.689e-01, 6.035e-03, 8.152e-03, 4.049e-02, 1.511e-01, 6.930e-02, 9.426e-02, -1.172e-01, -5.910e-02, 6.370e-02, -1.956e-01, -3.729e-02, 9.268e-02)); + r += mul(s2_4, M4(2.163e-01, -5.092e-02, -7.840e-02, 1.343e-01, 2.474e-02, 6.257e-02, 1.575e-02, -3.697e-02, -1.090e-01, -1.585e-01, -1.491e-01, -7.206e-02, 1.910e-01, -9.062e-02, 2.939e-01, -1.115e-01)); + r += mul(s2_5, M4(-7.395e-02, -1.166e-02, -3.892e-02, -4.676e-02, 9.469e-02, -1.064e-01, -1.998e-02, 6.847e-02, 1.670e-01, 2.912e-02, -8.629e-02, 1.202e-01, 5.849e-02, -1.098e-03, 5.147e-03, -6.240e-02)); + r += mul(s2_6, M4(-1.813e-02, -5.520e-02, -8.923e-03, 5.608e-02, -5.733e-02, -5.186e-02, -6.152e-02, -4.688e-03, 7.954e-03, -8.228e-02, -6.753e-02, -1.760e-02, 1.659e-01, -2.446e-01, -2.974e-02, -4.604e-02)); + r += mul(s2_7, M4(1.153e-01, -1.993e-02, -9.199e-02, -8.763e-02, 1.034e-01, -2.709e-01, -1.090e-01, -2.574e-02, 1.716e-01, -1.640e-01, -9.578e-02, -2.558e-02, -7.287e-02, -3.913e-01, 5.900e-03, -1.930e-01)); + r += mul(s2_8, M4(-5.687e-02, -6.216e-03, -4.808e-02, 1.562e-02, -5.671e-03, -5.044e-02, -6.741e-02, 7.378e-02, -5.833e-02, 2.604e-02, 2.209e-03, 9.277e-02, 1.407e-01, -6.460e-02, 1.792e-02, -2.688e-02)); + r += mul(s3_0, M4(1.301e-01, -6.673e-02, -4.673e-03, -1.528e-02, -7.053e-02, 1.336e-02, -5.414e-02, 5.152e-02, -5.916e-02, 9.150e-03, 1.437e-03, 4.084e-02, -5.096e-02, 4.691e-03, 1.502e-01, 5.893e-03)); + r += mul(s3_1, M4(-3.160e-02, 1.469e-01, -1.019e-01, -7.662e-02, 2.197e-01, 1.817e-02, 8.725e-02, -1.522e-01, -1.764e-02, -1.970e-02, 8.117e-03, 3.590e-02, -8.543e-02, 6.164e-03, -6.264e-02, -4.869e-02)); + r += mul(s3_2, M4(3.845e-02, 7.640e-03, -3.881e-02, 5.850e-03, 5.538e-03, -3.748e-02, 1.341e-02, -9.292e-03, 7.562e-02, -4.774e-02, -1.123e-02, 2.085e-02, 7.349e-02, -7.243e-03, 4.272e-02, 7.880e-02)); + r += mul(s3_3, M4(-1.380e-01, 4.229e-02, 2.785e-01, 3.801e-01, 5.090e-02, -1.460e-02, 6.248e-02, 1.078e-01, -2.172e-02, 1.705e-02, -3.401e-02, 2.091e-02, 1.108e-01, 6.484e-02, 6.153e-02, -1.278e-01)); + r += mul(s3_4, M4(1.742e-01, -4.719e-02, -3.431e-01, -1.191e-01, -2.863e-02, -1.824e-02, 1.543e-01, 2.224e-01, -1.706e-01, 9.533e-02, 1.460e-01, -2.465e-02, -2.429e-01, 1.371e-01, 1.065e-01, 2.320e-02)); + r += mul(s3_5, M4(-1.137e-01, 7.592e-03, 5.685e-02, -1.670e-02, -2.377e-02, -1.052e-01, 9.345e-02, 1.203e-01, -8.840e-03, 3.811e-03, 1.680e-02, -1.933e-02, -1.316e-02, 4.747e-02, -1.437e-02, 4.299e-02)); + r += mul(s3_6, M4(-6.346e-03, -2.647e-02, 1.117e-01, 6.339e-02, -7.772e-02, -1.288e-02, 1.283e-03, 2.006e-01, 2.522e-02, 4.820e-02, 3.984e-02, 8.423e-02, -4.313e-02, -4.313e-02, 5.460e-02, 1.835e-01)); + r += mul(s3_7, M4(2.887e-01, -2.041e-01, 4.232e-02, 3.653e-02, 2.437e-02, -2.630e-02, 1.212e-01, 9.045e-02, 5.126e-02, -2.397e-02, 2.083e-02, -2.262e-02, 1.174e-01, 2.861e-02, -1.233e-02, 7.360e-02)); + r += mul(s3_8, M4(-9.027e-02, -2.971e-02, 5.210e-02, 1.163e-01, -3.642e-02, 3.941e-02, 4.917e-02, 3.244e-02, -4.757e-02, -8.186e-02, 9.365e-03, -6.672e-03, -2.995e-02, -9.676e-02, -1.742e-02, -3.560e-02)); + r += mul(s4_0, M4(-2.413e-02, 5.733e-02, -3.662e-02, -1.290e-01, -2.503e-02, 5.071e-02, 2.409e-02, -1.394e-02, 5.004e-02, -6.543e-03, 1.458e-02, 2.920e-02, -2.374e-02, -2.253e-02, 4.324e-02, 2.165e-02)); + r += mul(s4_1, M4(-6.530e-02, 1.960e-02, 2.366e-02, 3.427e-02, 4.881e-02, 1.563e-02, -3.348e-02, 1.288e-03, -1.898e-02, 7.115e-02, -1.124e-01, 1.629e-01, 1.449e-01, 3.789e-02, 4.047e-02, 7.443e-02)); + r += mul(s4_2, M4(4.340e-02, -3.738e-03, -1.450e-02, -3.659e-02, -8.028e-03, -4.039e-02, 3.604e-03, 8.585e-02, -2.229e-02, -3.620e-02, 5.393e-02, 6.269e-02, -1.034e-02, 2.669e-02, -7.571e-03, 3.290e-02)); + r += mul(s4_3, M4(-6.251e-02, 6.566e-02, -1.510e-01, -1.397e-01, 5.000e-02, 3.678e-02, 1.271e-01, -6.640e-02, -1.842e-01, 1.340e-01, 2.975e-02, -4.881e-02, 1.065e-01, -8.574e-02, -5.624e-02, 3.385e-02)); + r += mul(s4_4, M4(7.366e-02, 2.984e-02, -1.919e-01, -7.495e-02, -1.070e-01, -9.427e-02, 7.523e-02, 2.054e-02, -3.354e-02, 1.520e-01, 1.800e-01, 8.748e-02, 1.248e-01, -2.123e-01, 2.753e-02, 7.032e-02)); + r += mul(s4_5, M4(8.098e-03, -1.405e-02, 9.718e-02, 1.855e-02, 1.367e-01, -2.222e-02, -2.826e-02, 9.571e-03, -5.042e-02, 3.500e-02, 6.680e-02, -1.410e-02, -5.061e-02, -6.171e-03, 1.901e-01, 9.228e-02)); + r += mul(s4_6, M4(2.685e-02, 6.709e-02, -3.187e-02, 1.025e-01, -8.084e-03, -2.715e-02, -3.167e-02, 1.119e-01, -4.820e-02, 1.070e-01, -3.387e-03, 9.772e-02, -5.765e-03, 7.395e-02, -6.708e-02, 1.610e-01)); + r += mul(s4_7, M4(-1.945e-02, -4.996e-02, 1.571e-02, 2.683e-02, -8.484e-02, 2.589e-02, 2.119e-02, 1.573e-01, -1.111e-01, 2.642e-02, -9.621e-03, 3.552e-03, 4.055e-02, 6.634e-02, -1.663e-02, -4.428e-04)); + r += mul(s4_8, M4(-6.808e-02, 4.646e-02, 3.264e-02, 5.362e-03, 1.139e-02, -7.739e-03, -4.597e-02, 5.726e-03, -4.609e-02, 2.209e-02, 3.058e-03, -1.594e-02, -9.159e-02, 2.359e-02, 6.326e-02, 1.340e-03)); + r += mul(s5_0, M4(2.998e-01, 6.184e-02, -3.594e-02, 1.837e-02, 4.618e-02, 6.769e-02, 7.110e-02, 5.140e-02, -3.745e-02, 3.319e-02, 1.519e-02, -7.435e-03, -1.101e-01, -1.383e-02, -3.191e-02, -2.942e-03)); + r += mul(s5_1, M4(1.386e-02, -3.171e-02, 2.864e-02, 5.892e-02, -1.940e-01, -1.093e-02, -7.669e-02, 5.503e-02, -6.708e-03, -4.250e-03, -1.225e-02, 2.570e-02, -2.052e-02, -4.288e-02, -1.539e-01, -1.591e-01)); + r += mul(s5_2, M4(1.389e-01, 1.930e-02, -8.161e-03, 3.241e-02, -3.284e-02, 2.070e-02, -8.118e-02, 2.614e-02, -4.448e-03, -1.930e-02, 1.276e-02, -2.240e-02, -1.700e-01, 1.309e-03, -9.330e-03, -1.701e-01)); + r += mul(s5_3, M4(2.932e-02, 1.999e-02, 1.099e-01, -2.874e-02, 1.307e-01, 1.732e-01, 1.651e-01, -2.842e-01, -8.364e-02, -6.895e-02, -3.170e-03, 7.641e-02, 1.224e-01, 5.736e-02, -1.010e-01, -1.254e-02)); + r += mul(s5_4, M4(5.407e-02, -1.252e-01, -2.510e-01, -2.635e-01, -2.482e-01, 1.820e-02, 4.384e-02, -2.852e-01, 1.575e-01, 1.870e-02, 4.663e-03, 5.438e-02, -1.672e-01, -1.272e-01, -1.955e-01, 2.434e-01)); + r += mul(s5_5, M4(-2.337e-02, -3.724e-02, -4.250e-02, 6.240e-02, 8.226e-02, -9.472e-03, -7.522e-02, -2.530e-01, -5.063e-02, 4.506e-03, -2.741e-02, -1.436e-01, -1.672e-01, 1.117e-01, -1.196e-01, 4.086e-02)); + r += mul(s5_6, M4(4.256e-02, -1.184e-01, 4.905e-02, 1.424e-01, 5.343e-02, -6.726e-02, 4.591e-03, -1.502e-03, -1.130e-01, -4.209e-02, -1.286e-02, 1.288e-01, -5.045e-02, 3.221e-02, -9.325e-02, 1.091e-01)); + r += mul(s5_7, M4(1.177e-01, -1.748e-02, 4.951e-02, -2.133e-02, 8.531e-02, -3.125e-02, -9.790e-02, -6.702e-02, -2.695e-03, -6.694e-02, -8.823e-05, -2.169e-02, -1.462e-01, -1.821e-02, -1.749e-01, -3.450e-02)); + r += mul(s5_8, M4(6.438e-02, 2.157e-02, 1.113e-02, -6.066e-02, 3.259e-02, 3.472e-02, -1.023e-01, -1.054e-01, -2.501e-02, -6.527e-02, 2.978e-02, -1.117e-01, -4.648e-02, 6.757e-02, 1.049e-02, -6.068e-02)); + r += mul(s6_0, M4(7.482e-02, -4.795e-02, 1.097e-01, -1.281e-02, -9.006e-02, 4.621e-02, 1.410e-02, -1.494e-01, -1.193e-02, 6.909e-02, 6.081e-02, 1.735e-03, 8.806e-02, 4.528e-04, -9.205e-03, -4.175e-02)); + r += mul(s6_1, M4(-1.338e-01, 3.338e-02, 5.148e-02, 1.026e-02, -5.311e-02, -3.567e-02, -1.388e-02, -7.732e-02, 5.164e-02, -5.179e-03, 5.707e-03, -6.708e-02, -1.417e-01, 3.568e-02, -4.803e-02, 1.829e-02)); + r += mul(s6_2, M4(4.183e-02, 2.789e-02, -4.511e-02, 7.451e-02, -2.456e-01, 6.764e-02, -1.296e-01, 1.734e-02, 2.853e-03, -2.430e-03, -2.769e-02, -4.073e-02, 1.062e-02, 9.062e-02, 1.312e-01, 6.774e-03)); + r += mul(s6_3, M4(9.957e-02, -8.275e-02, -7.864e-03, -1.183e-01, 3.777e-02, -1.597e-01, 1.157e-02, 2.856e-02, -1.445e-01, -7.529e-02, 1.460e-01, 7.438e-02, 2.038e-01, 1.289e-01, -8.220e-02, 2.154e-01)); + r += mul(s6_4, M4(-1.303e-01, 1.338e-01, 1.708e-01, -1.345e-01, 4.503e-02, -1.507e-01, -1.312e-01, 7.709e-02, -5.646e-02, 9.898e-02, 6.089e-02, -2.127e-01, -1.776e-01, 1.346e-01, -1.501e-01, 4.479e-01)); + r += mul(s6_5, M4(-2.287e-02, 1.816e-02, 6.476e-03, -6.000e-03, 2.583e-02, 1.181e-01, 2.830e-02, 4.493e-02, 6.293e-02, -1.721e-02, -3.978e-02, 1.178e-02, 5.155e-02, 7.724e-02, 7.545e-02, 2.235e-01)); + r += mul(s6_6, M4(1.089e-02, 9.929e-03, 3.291e-02, -4.004e-02, -3.411e-02, -1.482e-01, 8.173e-02, -1.300e-01, -9.727e-02, 1.038e-01, 2.665e-02, 7.097e-02, 1.546e-01, -6.419e-03, -6.211e-02, 1.378e-02)); + r += mul(s6_7, M4(-3.750e-02, -6.492e-02, 1.402e-01, -8.250e-02, 1.420e-01, -7.486e-02, -1.294e-01, 7.090e-03, -6.692e-02, -5.347e-02, 5.752e-02, 9.145e-02, -1.170e-01, 2.695e-02, 3.856e-02, -1.005e-01)); + r += mul(s6_8, M4(-7.991e-02, -2.176e-02, 1.824e-02, -2.861e-02, 6.101e-02, 2.592e-02, 3.747e-02, 6.699e-02, 2.198e-02, 5.217e-02, 1.520e-02, 2.060e-02, -3.168e-02, 5.624e-02, -2.631e-02, 1.539e-01)); + r += mul(s7_0, M4(-2.234e-03, -8.024e-02, -4.880e-02, -3.628e-02, 6.282e-02, -2.876e-02, -2.045e-02, -9.916e-02, -1.951e-02, 2.522e-02, 5.536e-02, -1.400e-02, 4.454e-02, -5.995e-02, -1.083e-02, 3.267e-02)); + r += mul(s7_1, M4(1.363e-01, -1.627e-02, -7.451e-02, -2.096e-01, 5.555e-02, -8.325e-02, 4.384e-02, 3.756e-02, -4.115e-02, -4.452e-02, 5.062e-02, 1.560e-01, -6.836e-02, -9.891e-03, 7.183e-02, -8.960e-02)); + r += mul(s7_2, M4(6.864e-02, 4.224e-02, 6.149e-02, -2.407e-01, -1.763e-01, -3.429e-03, -8.891e-02, 5.303e-02, -1.704e-01, 1.372e-02, 5.493e-02, -2.983e-02, -9.787e-02, -1.998e-02, 1.076e-02, 8.817e-02)); + r += mul(s7_3, M4(6.177e-02, 9.915e-02, -2.032e-01, 1.047e-01, -3.088e-02, 1.345e-02, 4.722e-02, 2.977e-02, 7.561e-03, 1.231e-01, 5.659e-03, 1.742e-01, 1.224e-01, 5.175e-03, -4.049e-02, 9.241e-02)); + r += mul(s7_4, M4(2.840e-01, 1.155e-01, 1.048e-01, 1.054e-01, -4.146e-02, -1.333e-01, 8.523e-02, 2.791e-01, 1.161e-01, 8.725e-02, 4.376e-01, 4.971e-02, -8.106e-02, -6.255e-02, -1.393e-01, 1.394e-02)); + r += mul(s7_5, M4(-1.513e-03, -8.884e-03, -6.384e-02, 4.657e-02, -1.265e-02, 5.092e-02, 1.608e-02, 3.075e-02, -1.785e-01, -6.070e-02, 6.474e-02, 1.909e-02, 7.206e-02, 9.939e-03, 4.189e-02, -4.761e-02)); + r += mul(s7_6, M4(1.031e-01, 1.450e-02, 1.205e-01, -2.352e-02, -1.105e-02, -1.111e-01, 9.057e-02, -7.851e-02, -3.125e-02, 4.754e-02, -7.714e-02, -1.526e-02, 1.171e-01, 7.729e-03, 6.555e-03, -4.499e-02)); + r += mul(s7_7, M4(3.134e-01, 1.278e-01, 3.646e-02, -1.853e-01, -8.604e-02, 1.031e-02, -6.833e-02, -9.669e-02, -1.471e-01, -1.839e-03, 1.054e-01, -9.685e-03, 4.999e-03, -4.691e-02, 8.529e-02, -4.799e-02)); + r += mul(s7_8, M4(1.734e-01, -9.505e-05, 6.501e-02, -2.566e-02, 9.206e-02, 4.209e-02, 3.785e-02, 2.968e-02, -6.790e-02, 5.441e-02, 5.599e-02, 6.679e-03, 7.613e-03, 7.214e-03, -4.941e-02, 6.328e-02)); + r += V4(1.524e-02, 2.854e-03, -1.639e-02, -2.178e-02); + return r; +} + +void Pass11(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = Rmp8x8(tid.x) + blockStart; + uint2 size = GetInputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = (gxy + 0.5) * pt; + + V4 s0_0 = l0(-1.0, -1.0); + V4 s0_1 = l0(0.0, -1.0); + V4 s0_2 = l0(1.0, -1.0); + V4 s0_3 = l0(-1.0, 0.0); + V4 s0_4 = l0(0.0, 0.0); + V4 s0_5 = l0(1.0, 0.0); + V4 s0_6 = l0(-1.0, 1.0); + V4 s0_7 = l0(0.0, 1.0); + V4 s0_8 = l0(1.0, 1.0); + V4 s1_0 = -max(-s0_0, 0.0); + V4 s1_1 = -max(-s0_1, 0.0); + V4 s1_2 = -max(-s0_2, 0.0); + V4 s1_3 = -max(-s0_3, 0.0); + V4 s1_4 = -max(-s0_4, 0.0); + V4 s1_5 = -max(-s0_5, 0.0); + V4 s1_6 = -max(-s0_6, 0.0); + V4 s1_7 = -max(-s0_7, 0.0); + V4 s1_8 = -max(-s0_8, 0.0); + s0_0 = max(s0_0, 0.0); + s0_1 = max(s0_1, 0.0); + s0_2 = max(s0_2, 0.0); + s0_3 = max(s0_3, 0.0); + s0_4 = max(s0_4, 0.0); + s0_5 = max(s0_5, 0.0); + s0_6 = max(s0_6, 0.0); + s0_7 = max(s0_7, 0.0); + s0_8 = max(s0_8, 0.0); + + V4 s2_0 = l1(-1.0, -1.0); + V4 s2_1 = l1(0.0, -1.0); + V4 s2_2 = l1(1.0, -1.0); + V4 s2_3 = l1(-1.0, 0.0); + V4 s2_4 = l1(0.0, 0.0); + V4 s2_5 = l1(1.0, 0.0); + V4 s2_6 = l1(-1.0, 1.0); + V4 s2_7 = l1(0.0, 1.0); + V4 s2_8 = l1(1.0, 1.0); + V4 s3_0 = -max(-s2_0, 0.0); + V4 s3_1 = -max(-s2_1, 0.0); + V4 s3_2 = -max(-s2_2, 0.0); + V4 s3_3 = -max(-s2_3, 0.0); + V4 s3_4 = -max(-s2_4, 0.0); + V4 s3_5 = -max(-s2_5, 0.0); + V4 s3_6 = -max(-s2_6, 0.0); + V4 s3_7 = -max(-s2_7, 0.0); + V4 s3_8 = -max(-s2_8, 0.0); + s2_0 = max(s2_0, 0.0); + s2_1 = max(s2_1, 0.0); + s2_2 = max(s2_2, 0.0); + s2_3 = max(s2_3, 0.0); + s2_4 = max(s2_4, 0.0); + s2_5 = max(s2_5, 0.0); + s2_6 = max(s2_6, 0.0); + s2_7 = max(s2_7, 0.0); + s2_8 = max(s2_8, 0.0); + + V4 s4_0 = l2(-1.0, -1.0); + V4 s4_1 = l2(0.0, -1.0); + V4 s4_2 = l2(1.0, -1.0); + V4 s4_3 = l2(-1.0, 0.0); + V4 s4_4 = l2(0.0, 0.0); + V4 s4_5 = l2(1.0, 0.0); + V4 s4_6 = l2(-1.0, 1.0); + V4 s4_7 = l2(0.0, 1.0); + V4 s4_8 = l2(1.0, 1.0); + V4 s5_0 = -max(-s4_0, 0.0); + V4 s5_1 = -max(-s4_1, 0.0); + V4 s5_2 = -max(-s4_2, 0.0); + V4 s5_3 = -max(-s4_3, 0.0); + V4 s5_4 = -max(-s4_4, 0.0); + V4 s5_5 = -max(-s4_5, 0.0); + V4 s5_6 = -max(-s4_6, 0.0); + V4 s5_7 = -max(-s4_7, 0.0); + V4 s5_8 = -max(-s4_8, 0.0); + s4_0 = max(s4_0, 0.0); + s4_1 = max(s4_1, 0.0); + s4_2 = max(s4_2, 0.0); + s4_3 = max(s4_3, 0.0); + s4_4 = max(s4_4, 0.0); + s4_5 = max(s4_5, 0.0); + s4_6 = max(s4_6, 0.0); + s4_7 = max(s4_7, 0.0); + s4_8 = max(s4_8, 0.0); + + V4 s6_0 = l3(-1.0, -1.0); + V4 s6_1 = l3(0.0, -1.0); + V4 s6_2 = l3(1.0, -1.0); + V4 s6_3 = l3(-1.0, 0.0); + V4 s6_4 = l3(0.0, 0.0); + V4 s6_5 = l3(1.0, 0.0); + V4 s6_6 = l3(-1.0, 1.0); + V4 s6_7 = l3(0.0, 1.0); + V4 s6_8 = l3(1.0, 1.0); + V4 s7_0 = -max(-s6_0, 0.0); + V4 s7_1 = -max(-s6_1, 0.0); + V4 s7_2 = -max(-s6_2, 0.0); + V4 s7_3 = -max(-s6_3, 0.0); + V4 s7_4 = -max(-s6_4, 0.0); + V4 s7_5 = -max(-s6_5, 0.0); + V4 s7_6 = -max(-s6_6, 0.0); + V4 s7_7 = -max(-s6_7, 0.0); + V4 s7_8 = -max(-s6_8, 0.0); + s6_0 = max(s6_0, 0.0); + s6_1 = max(s6_1, 0.0); + s6_2 = max(s6_2, 0.0); + s6_3 = max(s6_3, 0.0); + s6_4 = max(s6_4, 0.0); + s6_5 = max(s6_5, 0.0); + s6_6 = max(s6_6, 0.0); + s6_7 = max(s6_7, 0.0); + s6_8 = max(s6_8, 0.0); + + t0[gxy] = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t1[gxy] = f1(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t2[gxy] = f2(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t3[gxy] = f3(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); +} + +//!PASS 12 +//!DESC conv11 +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 +//!IN t0, t1, t2, t3 +//!OUT t4, t5, t6, t7 + +#define l0(x, y) V4(O(t0, float2(x, y))) +#define l1(x, y) V4(O(t1, float2(x, y))) +#define l2(x, y) V4(O(t2, float2(x, y))) +#define l3(x, y) V4(O(t3, float2(x, y))) + +V4 f0(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-1.915e-01, -1.169e-01, 1.190e-01, 5.826e-02, -6.870e-03, 1.762e-02, 5.676e-02, -3.206e-03, 5.004e-02, -1.895e-02, 2.043e-02, -8.222e-02, 1.991e-01, 4.123e-02, -4.290e-02, -2.150e-02)); + r += mul(s0_1, M4(-1.158e-01, -1.896e-01, -1.275e-01, -1.708e-01, -2.118e-02, 3.400e-02, -1.248e-01, -3.245e-02, -2.000e-02, 1.093e-01, 7.554e-03, 4.626e-02, 7.514e-02, 1.358e-02, 3.031e-02, 6.514e-02)); + r += mul(s0_2, M4(-7.302e-02, 1.582e-02, 2.889e-02, -1.082e-01, 1.996e-02, -4.931e-02, 1.216e-02, -5.767e-02, -8.223e-02, -7.295e-02, 7.653e-03, 2.531e-02, 8.554e-02, 2.361e-02, 2.901e-02, 3.306e-02)); + r += mul(s0_3, M4(-8.676e-02, -2.726e-01, 2.079e-01, 1.976e-01, 6.214e-02, -3.046e-02, -4.187e-02, -9.174e-02, 6.240e-02, -1.140e-01, -3.985e-02, 5.791e-02, -2.981e-01, -1.307e-03, 8.713e-02, -1.130e-01)); + r += mul(s0_4, M4(-2.886e-01, 2.820e-02, -1.374e-01, 2.046e-01, 6.850e-02, -7.892e-02, 2.798e-01, -4.937e-02, 1.450e-01, -3.480e-03, -2.459e-01, -1.068e-01, -4.921e-02, 1.577e-01, 1.469e-01, -1.741e-01)); + r += mul(s0_5, M4(-1.059e-01, 1.108e-01, -9.792e-02, -2.284e-02, -2.672e-02, -1.763e-02, -5.990e-02, -8.621e-02, -1.893e-02, -1.552e-02, -4.040e-02, 3.691e-02, -1.275e-01, -3.942e-02, 6.189e-02, -1.852e-01)); + r += mul(s0_6, M4(-1.295e-01, -1.477e-02, -8.103e-02, -1.089e-02, 1.002e-02, 4.025e-02, -2.811e-02, 7.984e-02, 5.059e-02, 8.992e-02, 2.116e-02, 2.413e-02, 5.388e-02, -7.130e-02, -9.228e-02, -1.752e-03)); + r += mul(s0_7, M4(4.537e-02, 1.065e-02, -1.856e-01, 1.258e-03, -4.945e-02, -1.652e-01, 1.330e-01, 1.227e-01, 9.099e-02, -2.081e-02, 4.318e-02, 1.210e-03, -8.341e-02, 2.881e-02, -1.661e-02, -6.715e-02)); + r += mul(s0_8, M4(9.870e-03, 5.725e-02, 3.166e-02, 2.656e-02, -4.916e-02, -1.751e-02, 3.296e-02, 3.218e-02, -1.498e-02, 1.853e-02, 7.123e-03, 7.339e-02, -7.305e-02, -1.655e-01, 2.114e-02, -5.433e-03)); + r += mul(s1_0, M4(6.634e-02, -2.533e-02, 8.221e-02, -3.207e-02, -8.808e-02, 3.723e-02, 6.756e-02, 1.038e-01, -4.526e-02, 2.944e-02, 3.895e-02, -1.382e-01, 1.313e-01, 1.640e-02, -1.587e-02, 6.436e-02)); + r += mul(s1_1, M4(6.915e-02, 1.180e-01, -2.793e-03, -7.074e-02, -6.017e-02, -1.370e-01, -7.107e-02, -9.355e-02, 1.330e-02, -2.301e-02, 5.857e-02, -2.194e-02, 1.753e-02, -7.409e-02, -4.217e-02, 9.795e-02)); + r += mul(s1_2, M4(6.861e-02, 2.690e-02, 2.689e-02, 1.245e-02, 5.594e-02, 3.109e-02, 3.444e-02, -7.013e-02, -2.348e-02, 1.369e-01, 6.688e-02, -4.010e-02, 2.610e-02, 5.055e-02, -7.790e-02, 5.747e-02)); + r += mul(s1_3, M4(1.062e-01, -5.265e-02, -3.452e-02, 7.210e-03, 1.180e-01, 4.908e-02, -8.465e-02, 3.929e-03, 4.042e-02, 2.169e-01, -1.626e-01, -2.743e-03, -1.461e-02, 1.247e-02, -3.060e-02, 1.619e-01)); + r += mul(s1_4, M4(-8.396e-02, 7.641e-02, 2.572e-02, 3.759e-02, 1.577e-01, -3.217e-01, 1.614e-01, -1.043e-02, 3.079e-02, -2.685e-01, -4.387e-02, -1.696e-01, 1.448e-01, 1.136e-01, -3.021e-02, 1.499e-01)); + r += mul(s1_5, M4(-8.857e-03, 5.715e-03, -6.301e-02, -4.624e-02, -4.868e-02, 2.177e-02, -2.426e-03, -1.321e-01, 5.648e-02, -6.338e-03, 4.336e-02, 2.730e-03, 4.977e-02, 4.718e-04, -1.090e-02, -3.998e-02)); + r += mul(s1_6, M4(-7.858e-03, 6.636e-02, 3.191e-02, -3.694e-02, 3.115e-02, -6.413e-02, 2.714e-02, 4.921e-02, 1.193e-01, 8.688e-02, 1.835e-01, 8.366e-02, -3.097e-02, -6.977e-02, -1.575e-02, 2.729e-02)); + r += mul(s1_7, M4(-4.780e-02, 2.397e-02, -1.122e-01, -5.331e-02, 4.054e-02, 1.939e-02, -1.676e-01, 4.318e-02, -5.867e-02, 1.400e-01, 2.432e-01, -2.698e-02, -3.587e-02, 1.348e-01, 7.058e-02, -6.223e-03)); + r += mul(s1_8, M4(-2.230e-02, 5.874e-02, -2.458e-03, -7.733e-03, -1.283e-02, -1.249e-01, -4.782e-02, 2.549e-02, 8.556e-02, -1.097e-01, 8.481e-02, -2.428e-03, -4.674e-03, -3.139e-02, -6.233e-02, 2.305e-02)); + r += mul(s2_0, M4(-9.413e-02, -4.736e-02, 4.676e-02, -1.255e-01, -1.187e-01, 9.706e-02, -1.397e-01, -9.898e-02, -1.176e-01, -3.923e-02, 8.698e-02, 1.274e-01, 2.611e-03, 1.828e-02, 2.152e-02, -4.350e-02)); + r += mul(s2_1, M4(6.654e-02, 2.420e-03, 5.422e-02, -7.395e-02, -2.491e-01, -1.371e-01, 3.299e-02, 5.930e-02, -1.434e-01, -1.292e-01, -5.649e-02, 4.648e-02, 8.573e-02, -2.748e-02, 1.604e-01, 1.473e-02)); + r += mul(s2_2, M4(1.804e-02, 4.354e-02, 8.807e-02, 1.544e-02, -1.448e-01, 4.923e-02, -3.842e-02, 1.971e-02, -4.645e-02, 8.470e-03, -1.666e-02, 6.277e-02, 8.557e-02, -1.134e-02, 6.399e-02, -5.746e-02)); + r += mul(s2_3, M4(-7.887e-02, 4.637e-02, -2.723e-02, 5.297e-03, -2.688e-01, 1.936e-02, -6.007e-02, 5.021e-02, 8.858e-02, 1.747e-01, 3.388e-02, 6.603e-02, 1.610e-02, -1.990e-01, 1.176e-01, 2.307e-01)); + r += mul(s2_4, M4(1.228e-01, -1.251e-01, -1.899e-01, -1.793e-01, -2.170e-01, 1.480e-01, 1.720e-01, 8.567e-03, 6.609e-02, -2.860e-01, -1.202e-01, 1.993e-01, 1.246e-01, -6.924e-02, -1.348e-01, -2.488e-01)); + r += mul(s2_5, M4(2.079e-02, 1.208e-01, 9.448e-02, -7.905e-02, -1.375e-01, 6.923e-02, -4.167e-02, 8.062e-03, 1.164e-01, 6.644e-02, -1.122e-01, 1.183e-01, 3.517e-02, 3.437e-02, -7.007e-04, 3.188e-02)); + r += mul(s2_6, M4(2.444e-01, 2.773e-01, -1.278e-01, -3.716e-02, -1.564e-01, -3.690e-02, 5.900e-03, -5.933e-03, -6.071e-02, 3.003e-02, -4.444e-02, -1.545e-02, -4.730e-02, -6.126e-02, 1.284e-01, 4.191e-02)); + r += mul(s2_7, M4(-9.036e-02, -6.615e-02, 1.670e-01, 1.248e-02, -1.547e-02, 1.639e-05, 4.639e-02, 9.701e-02, 5.673e-02, -5.440e-02, -1.628e-02, 6.036e-02, 1.977e-01, 1.232e-02, -8.781e-02, 6.303e-02)); + r += mul(s2_8, M4(-1.259e-03, -1.527e-01, -5.524e-02, 2.599e-02, -1.163e-01, 1.410e-01, -8.661e-02, -2.286e-02, 2.106e-02, 4.968e-02, -1.060e-01, 5.203e-02, -3.248e-02, 1.855e-02, 7.102e-02, -5.136e-02)); + r += mul(s3_0, M4(-2.382e-01, -4.257e-02, 1.572e-02, -6.708e-02, -8.716e-03, 3.438e-02, -3.772e-02, 3.491e-02, -1.030e-02, 6.835e-03, 6.272e-02, 1.167e-02, -1.005e-01, -1.801e-02, 1.201e-02, -7.896e-02)); + r += mul(s3_1, M4(-1.519e-01, -2.255e-02, -2.546e-02, -2.894e-02, -1.238e-01, -4.474e-02, 9.939e-02, 1.083e-01, -9.085e-03, 7.234e-02, -4.092e-02, -5.775e-02, -3.120e-02, -1.194e-01, -6.205e-02, 1.012e-01)); + r += mul(s3_2, M4(-7.892e-02, -3.893e-02, -1.227e-02, -3.555e-02, -1.229e-01, -1.627e-02, -2.630e-02, 3.135e-02, -7.737e-02, -7.661e-02, -4.174e-02, -1.994e-02, -1.121e-02, -1.866e-01, -3.032e-02, 2.742e-02)); + r += mul(s3_3, M4(-5.926e-03, 1.696e-01, -7.380e-04, 1.619e-01, -1.403e-01, 3.431e-04, 3.609e-02, -2.054e-02, 5.822e-02, 2.354e-02, 4.879e-02, -3.406e-02, -1.296e-01, 9.718e-02, -2.703e-02, -3.047e-02)); + r += mul(s3_4, M4(1.956e-02, -1.727e-01, 1.998e-01, 1.020e-01, -1.521e-01, -1.670e-02, 1.427e-01, 3.305e-02, -5.912e-03, -1.124e-01, 5.324e-02, 3.821e-02, 2.170e-01, -2.779e-01, 4.821e-01, -1.473e-01)); + r += mul(s3_5, M4(3.682e-02, 1.105e-01, 8.481e-03, 2.969e-02, 2.546e-02, 5.529e-02, -2.567e-02, -6.981e-03, 1.006e-02, -4.124e-02, -4.984e-02, -1.972e-02, -1.615e-02, -1.370e-01, -3.224e-02, -2.655e-02)); + r += mul(s3_6, M4(-9.353e-04, 4.101e-02, 6.678e-03, 4.895e-02, -2.400e-02, -2.993e-02, -1.824e-02, 8.775e-04, -6.785e-02, -2.088e-02, 4.766e-02, -2.042e-02, 1.184e-02, 5.569e-02, -1.253e-01, -7.349e-02)); + r += mul(s3_7, M4(-4.982e-03, -8.675e-02, 9.220e-03, 3.292e-02, -6.760e-02, 2.873e-03, 3.582e-02, 4.781e-02, 1.800e-01, 8.379e-02, -9.129e-02, 5.949e-02, -3.530e-02, -2.078e-01, 1.357e-01, 6.611e-02)); + r += mul(s3_8, M4(-5.324e-02, -1.870e-02, 1.161e-02, 2.989e-05, 6.348e-03, 6.436e-02, -4.735e-02, -2.747e-03, -1.014e-02, 4.067e-02, -4.654e-02, -2.985e-02, -6.898e-02, 5.993e-02, 5.866e-02, -5.755e-02)); + r += mul(s4_0, M4(-1.806e-01, -6.770e-02, 8.034e-02, -1.095e-01, 4.820e-02, -7.115e-02, 4.395e-02, -2.725e-02, -4.917e-03, 5.965e-03, -2.441e-02, 3.640e-02, 1.741e-02, 1.028e-01, 7.352e-03, 9.533e-04)); + r += mul(s4_1, M4(1.244e-02, 1.539e-02, -7.837e-02, -9.851e-02, -1.872e-01, 2.685e-02, -1.372e-02, -1.288e-01, -7.416e-02, -1.059e-03, 1.548e-01, -8.075e-02, -3.300e-02, -1.452e-01, -1.467e-02, 4.678e-02)); + r += mul(s4_2, M4(-6.319e-02, 2.047e-02, -3.524e-02, -8.293e-02, 1.226e-01, -2.587e-01, 2.677e-01, -5.000e-02, 4.268e-03, 6.761e-02, 4.449e-02, -5.548e-02, -6.619e-03, 6.231e-02, -5.589e-03, 5.727e-02)); + r += mul(s4_3, M4(2.026e-02, 1.317e-01, -1.516e-02, -2.647e-01, -4.952e-02, 5.845e-02, -5.285e-02, -4.733e-03, -5.163e-02, 2.782e-02, 3.565e-02, 3.868e-02, 2.486e-02, 8.674e-02, -5.657e-02, 1.044e-02)); + r += mul(s4_4, M4(3.854e-02, -1.673e-01, 3.037e-01, 1.016e-01, -1.080e-02, 6.207e-02, 8.249e-02, 1.300e-01, -8.758e-02, 3.024e-02, 1.130e-01, 8.472e-02, -3.803e-02, -7.029e-02, 1.651e-02, 3.407e-01)); + r += mul(s4_5, M4(9.317e-02, 6.574e-02, 1.338e-01, 9.046e-03, 3.361e-02, -1.313e-01, 1.517e-01, 4.762e-02, 7.507e-03, -8.164e-02, -1.650e-01, -2.319e-02, -1.172e-01, -8.297e-02, 9.258e-02, -4.425e-02)); + r += mul(s4_6, M4(4.385e-02, 8.606e-03, -1.949e-02, 3.010e-03, 5.382e-02, -4.354e-02, 1.261e-02, -5.949e-02, -1.466e-02, -1.887e-02, 4.227e-04, 9.980e-03, 2.933e-02, 8.980e-03, 9.546e-02, 3.022e-02)); + r += mul(s4_7, M4(5.263e-02, -1.155e-01, 8.001e-02, 1.899e-01, 1.548e-02, -4.710e-02, 1.056e-01, -4.798e-02, -1.586e-01, -1.727e-02, -1.260e-01, -3.351e-02, -1.084e-02, -1.788e-02, -2.251e-01, -1.177e-01)); + r += mul(s4_8, M4(3.676e-02, 8.270e-02, 1.031e-01, 5.032e-02, -1.351e-01, -1.402e-01, 1.820e-02, -5.783e-02, -2.887e-02, 3.201e-02, -6.555e-03, -6.838e-02, 5.485e-02, -5.880e-02, 1.818e-02, 5.227e-02)); + r += mul(s5_0, M4(-2.373e-02, -5.297e-02, 6.409e-02, -8.760e-03, 1.765e-02, 3.389e-02, -1.094e-02, -8.668e-02, 2.111e-02, -4.394e-02, 6.426e-03, 7.256e-03, 8.129e-03, 2.218e-02, -9.743e-04, -5.823e-02)); + r += mul(s5_1, M4(-4.578e-04, -1.229e-01, 5.579e-02, -1.009e-01, -1.058e-01, 3.231e-02, -1.274e-02, -7.973e-02, -6.806e-02, -2.071e-02, -2.131e-02, -8.127e-02, 3.821e-03, 1.196e-02, -5.473e-02, 1.707e-01)); + r += mul(s5_2, M4(-2.637e-02, 2.379e-03, -5.428e-02, -3.823e-02, -7.033e-03, 1.333e-01, -1.759e-03, -2.521e-02, 4.663e-02, -6.904e-02, 3.872e-02, -1.550e-03, 2.389e-03, -1.724e-02, 1.931e-02, 1.147e-03)); + r += mul(s5_3, M4(1.278e-01, -2.017e-01, 1.042e-01, -7.642e-02, -4.654e-02, -3.928e-02, -1.189e-01, 7.038e-02, 2.995e-01, 6.048e-02, 1.942e-02, 1.076e-01, -6.889e-03, -7.257e-02, -4.722e-02, 3.982e-02)); + r += mul(s5_4, M4(-4.283e-02, 2.050e-01, -3.413e-01, -1.939e-02, -6.313e-02, -4.603e-02, -3.493e-02, 4.534e-02, -8.708e-02, -1.357e-01, 1.964e-01, 2.077e-01, -5.591e-02, -1.052e-01, -1.626e-01, 9.349e-02)); + r += mul(s5_5, M4(3.414e-02, 6.631e-02, 5.159e-02, -9.068e-03, -4.447e-02, -8.555e-03, 1.280e-01, 5.758e-02, 1.168e-01, 5.714e-02, -1.075e-01, 4.452e-02, -4.317e-03, -7.799e-02, 1.165e-01, -3.921e-02)); + r += mul(s5_6, M4(5.624e-02, -1.040e-02, 3.795e-02, 2.532e-02, -2.144e-02, -2.567e-02, -2.597e-03, 1.717e-02, 1.543e-01, -3.063e-02, -5.567e-02, 1.063e-01, -2.135e-02, -4.029e-02, -4.940e-03, 1.869e-01)); + r += mul(s5_7, M4(-8.275e-02, 6.599e-02, 7.262e-02, 4.369e-02, -5.231e-02, -6.227e-02, 6.567e-02, 1.104e-02, 7.435e-02, -5.245e-02, -4.217e-02, 1.187e-01, -1.648e-01, -4.021e-01, 6.267e-03, 7.223e-02)); + r += mul(s5_8, M4(2.294e-02, -5.419e-02, -5.410e-02, 2.546e-02, 1.979e-02, 2.789e-03, -3.908e-02, 7.568e-03, 8.402e-02, -3.150e-01, 1.032e-01, 1.685e-02, -4.976e-02, 7.686e-02, 1.353e-01, 2.894e-02)); + r += mul(s6_0, M4(-1.030e-01, -2.008e-02, 4.383e-02, 2.176e-02, -7.612e-03, -1.877e-02, 1.396e-02, -1.144e-01, 2.938e-02, -2.272e-02, -5.583e-02, 5.873e-02, -1.096e-01, -2.677e-02, -3.503e-02, 8.138e-02)); + r += mul(s6_1, M4(-2.919e-02, -1.364e-01, 8.917e-02, 8.972e-02, -2.768e-02, -1.571e-01, -4.487e-02, -3.469e-01, -1.119e-01, -1.312e-01, -1.155e-01, -8.366e-02, -8.082e-02, -1.538e-02, 1.875e-02, 3.163e-02)); + r += mul(s6_2, M4(-5.143e-02, -5.594e-02, -2.071e-02, 5.367e-02, -2.671e-02, 3.961e-02, 7.607e-02, -8.289e-02, -3.423e-02, -1.023e-01, 2.431e-02, -4.870e-02, 2.373e-02, 2.842e-01, 2.028e-02, 7.859e-02)); + r += mul(s6_3, M4(-8.823e-02, 1.350e-01, 4.078e-02, -1.142e-01, 4.595e-02, -5.684e-02, -6.918e-02, 6.567e-02, 8.170e-02, 9.910e-02, -6.656e-02, -1.071e-01, -1.549e-01, 1.994e-02, 8.155e-03, 2.132e-02)); + r += mul(s6_4, M4(-1.350e-01, -1.147e-02, 9.153e-02, -3.440e-02, -1.150e-01, -1.059e-01, -7.237e-03, 1.449e-01, -2.214e-01, 6.290e-02, 2.961e-02, 3.729e-01, -1.385e-01, 1.320e-01, 1.545e-01, -6.541e-03)); + r += mul(s6_5, M4(1.651e-02, 1.181e-02, 3.175e-02, -7.075e-02, -1.815e-02, -1.944e-02, 2.353e-01, 1.433e-01, -1.284e-01, 6.948e-02, -1.235e-01, 1.018e-03, -1.500e-01, 1.535e-01, 2.512e-02, -4.040e-02)); + r += mul(s6_6, M4(3.686e-02, -2.102e-02, 2.925e-02, 5.221e-02, 7.893e-03, 1.431e-02, 1.292e-02, 4.678e-02, 7.289e-02, 2.643e-02, 4.998e-02, -1.128e-03, -4.384e-02, 1.055e-01, -7.729e-02, 1.467e-02)); + r += mul(s6_7, M4(-9.708e-02, -8.313e-02, 2.002e-02, 4.917e-02, 1.286e-01, -2.388e-02, -2.990e-02, 3.049e-02, -6.360e-02, -6.350e-02, 1.272e-01, 8.846e-02, 1.051e-01, 8.866e-02, 3.673e-03, 4.448e-02)); + r += mul(s6_8, M4(1.552e-02, -3.738e-02, -1.043e-02, 3.421e-02, 4.796e-02, 3.540e-02, 6.775e-03, -9.088e-03, -2.275e-02, 1.607e-03, -5.515e-02, -5.932e-02, -1.043e-01, 5.368e-02, 5.681e-02, -1.967e-02)); + r += mul(s7_0, M4(5.096e-02, -6.540e-02, 4.110e-02, 2.243e-02, -3.277e-02, 5.422e-02, -5.506e-03, -1.308e-01, -4.290e-02, -6.675e-02, -2.549e-02, 6.027e-02, -1.264e-02, -3.517e-02, -5.575e-03, -1.108e-02)); + r += mul(s7_1, M4(1.553e-02, 4.039e-01, 5.457e-02, 4.138e-02, 1.530e-01, -8.048e-02, 1.047e-01, -9.912e-02, 5.112e-02, 2.142e-02, -2.724e-02, 2.524e-02, -3.261e-02, -2.307e-02, -2.086e-02, -6.956e-02)); + r += mul(s7_2, M4(1.607e-01, 2.136e-01, 6.385e-02, 5.017e-02, -9.533e-03, -4.155e-02, 6.803e-03, -6.959e-02, 1.470e-02, -5.130e-02, 6.967e-02, 5.498e-03, 1.553e-02, 3.507e-02, -7.169e-03, -2.210e-02)); + r += mul(s7_3, M4(-2.897e-02, 3.350e-02, 7.739e-02, -8.739e-02, 2.262e-02, -6.763e-03, 1.308e-01, -1.563e-02, -3.232e-02, -2.581e-02, 4.054e-02, -2.837e-02, -4.473e-02, 4.890e-02, 1.346e-02, 2.120e-02)); + r += mul(s7_4, M4(-1.030e-02, -2.604e-02, -9.145e-02, -1.142e-01, 1.186e-01, 7.002e-02, 5.314e-02, -4.469e-03, -1.397e-01, 1.169e-01, -2.299e-01, 1.156e-01, 3.586e-02, -1.993e-01, 1.733e-01, 5.192e-02)); + r += mul(s7_5, M4(-9.763e-03, 1.068e-01, 1.519e-01, -1.555e-01, -6.049e-02, -8.637e-02, -1.997e-02, -3.331e-02, -7.498e-02, -9.361e-02, 7.936e-02, -6.039e-02, -2.886e-02, 1.489e-02, -4.254e-04, 1.233e-01)); + r += mul(s7_6, M4(1.101e-01, 1.534e-01, 9.363e-02, 2.898e-02, -5.850e-03, 7.591e-02, -3.393e-02, 1.964e-02, -7.931e-02, -4.888e-02, 1.382e-04, 5.309e-02, -4.719e-03, -1.116e-02, 4.092e-02, 4.215e-02)); + r += mul(s7_7, M4(-3.126e-02, -1.987e-01, 1.548e-01, 3.259e-02, 3.201e-02, -8.217e-02, -1.775e-02, 5.012e-02, 1.145e-02, 3.562e-02, 5.696e-02, -5.324e-02, -6.771e-02, -3.671e-02, -2.649e-02, -1.009e-02)); + r += mul(s7_8, M4(1.190e-01, 4.165e-02, -6.934e-03, 2.994e-02, -1.333e-01, -5.397e-02, 4.062e-02, 3.631e-02, -7.378e-02, -8.021e-03, -2.037e-03, -8.693e-02, 3.944e-02, -1.413e-02, 3.083e-02, 4.403e-02)); + r += V4(2.128e-02, 1.360e-02, 2.588e-03, 3.974e-04); + return r; +} + +V4 f1(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(9.861e-02, 1.810e-02, 6.419e-02, 2.502e-01, -1.083e-02, 2.346e-02, 7.291e-03, -1.595e-01, 7.255e-02, -5.626e-02, 6.578e-02, 6.141e-02, -1.428e-02, 8.072e-02, 3.138e-02, 1.041e-01)); + r += mul(s0_1, M4(-2.476e-02, -6.875e-02, -4.513e-02, 2.287e-02, 4.178e-02, 3.709e-04, 1.062e-01, 6.409e-02, -4.064e-02, -1.098e-01, 1.416e-02, -4.138e-02, -1.564e-01, 3.113e-02, 4.591e-02, 1.386e-01)); + r += mul(s0_2, M4(-7.755e-02, -6.462e-02, 1.357e-01, 8.907e-03, 8.772e-03, 9.210e-02, 3.133e-04, -7.970e-02, -1.008e-01, -2.192e-02, 2.674e-02, 1.210e-01, 6.194e-02, 1.382e-01, -4.793e-02, 1.693e-02)); + r += mul(s0_3, M4(2.218e-01, -7.579e-02, 1.663e-01, 2.604e-01, -5.619e-02, 1.028e-02, -1.192e-01, -1.204e-01, 3.293e-02, 1.888e-02, 1.239e-01, 1.883e-01, 2.025e-01, 1.058e-03, 3.568e-02, -7.469e-03)); + r += mul(s0_4, M4(-2.682e-01, -1.258e-01, 1.661e-01, -3.561e-01, -8.037e-02, -1.882e-01, 3.518e-02, 3.871e-02, 1.082e-01, 8.126e-02, -2.693e-01, -7.492e-02, -5.087e-02, 1.586e-01, -8.180e-02, -1.202e-02)); + r += mul(s0_5, M4(-1.311e-02, -1.008e-01, 8.735e-02, -4.129e-02, -8.179e-02, 1.128e-02, -4.526e-02, -1.084e-02, 3.870e-02, 1.408e-02, -1.383e-01, 1.011e-02, -5.819e-02, 4.581e-02, 6.933e-03, -8.229e-02)); + r += mul(s0_6, M4(1.606e-01, -8.163e-03, 3.041e-04, 1.293e-01, -1.172e-01, 7.398e-02, -2.390e-02, -4.539e-02, 3.576e-02, 5.539e-04, -7.322e-03, 3.657e-02, 6.095e-02, -4.478e-02, -8.989e-02, 9.781e-02)); + r += mul(s0_7, M4(-1.609e-01, -3.231e-02, -6.615e-02, 1.611e-02, 2.508e-01, -1.504e-01, 6.883e-02, -1.121e-02, 3.308e-03, 6.361e-03, 2.820e-03, 1.006e-01, -1.228e-01, 3.641e-02, -7.172e-02, -5.411e-02)); + r += mul(s0_8, M4(-3.758e-02, -8.353e-03, -1.148e-02, 8.195e-02, 1.702e-02, -4.740e-02, -1.646e-02, 6.989e-02, -4.097e-02, -3.479e-03, -1.575e-02, 1.765e-01, 2.417e-02, 6.013e-02, 6.908e-02, -5.958e-02)); + r += mul(s1_0, M4(-4.773e-02, -1.151e-02, 9.746e-03, 5.325e-02, -1.013e-01, 2.347e-02, 2.053e-02, -1.300e-03, 8.285e-03, 4.885e-03, -5.720e-02, -1.238e-01, 5.272e-03, -6.600e-02, 2.554e-02, 2.350e-02)); + r += mul(s1_1, M4(-6.101e-02, -3.187e-02, -1.678e-02, -4.436e-02, 1.294e-01, 7.714e-02, 2.367e-02, 9.440e-02, 1.046e-01, 2.280e-02, 2.139e-02, 4.107e-02, -3.158e-02, -1.144e-01, -6.250e-03, -7.049e-02)); + r += mul(s1_2, M4(2.380e-02, 2.683e-03, -5.063e-02, -1.144e-02, -2.753e-02, -3.963e-02, 4.263e-02, -1.172e-01, -1.153e-01, -4.556e-02, 7.579e-02, 7.674e-02, 4.053e-02, 4.403e-02, -7.944e-02, -8.035e-02)); + r += mul(s1_3, M4(1.527e-01, 3.639e-02, -2.715e-02, 1.643e-01, 5.152e-02, -9.064e-02, -1.411e-01, -2.476e-01, -9.955e-02, 1.098e-01, 1.724e-02, -1.867e-02, 7.503e-03, -6.265e-02, 6.342e-02, 1.467e-02)); + r += mul(s1_4, M4(4.156e-02, 1.587e-01, -9.157e-02, -1.867e-01, 2.170e-01, -2.680e-01, 3.912e-02, 2.190e-01, 2.286e-01, 2.782e-01, -6.481e-03, 2.057e-02, -4.271e-02, -2.637e-02, -3.364e-02, 9.123e-02)); + r += mul(s1_5, M4(8.277e-02, 1.521e-03, -2.840e-02, 3.656e-02, -1.687e-02, 4.315e-02, 4.808e-02, 5.464e-02, -7.452e-02, 4.107e-02, 6.658e-02, -9.818e-02, -4.003e-02, -2.246e-02, -5.058e-02, -8.255e-03)); + r += mul(s1_6, M4(-1.963e-02, -2.891e-02, 7.599e-02, 1.735e-02, -2.876e-02, -4.554e-02, -1.035e-01, 8.704e-02, -2.394e-02, 8.710e-02, -1.132e-01, 7.940e-02, -2.644e-02, 6.812e-03, -1.838e-02, 1.636e-01)); + r += mul(s1_7, M4(-3.273e-02, 3.213e-02, 5.066e-04, -6.173e-03, -2.231e-01, -1.584e-02, 7.763e-02, 1.087e-02, 1.274e-01, -1.020e-01, 8.857e-02, 1.486e-01, -1.360e-01, -6.677e-03, 1.223e-01, 3.943e-03)); + r += mul(s1_8, M4(-2.621e-02, 2.312e-02, 2.959e-02, -3.508e-02, -8.455e-02, -1.248e-01, 4.520e-02, -4.507e-02, 5.240e-02, 1.878e-01, -3.403e-02, -9.723e-02, 1.172e-02, 9.380e-03, -1.591e-02, 1.790e-02)); + r += mul(s2_0, M4(-4.653e-02, -5.118e-02, 3.158e-02, 1.532e-01, 4.989e-02, -4.555e-03, 1.874e-01, -3.272e-01, -1.386e-01, 5.731e-02, 7.671e-02, 2.568e-01, -3.503e-02, -4.580e-02, -1.435e-02, 9.380e-02)); + r += mul(s2_1, M4(1.101e-01, -2.787e-01, 7.885e-02, -1.669e-01, -1.885e-02, 6.133e-02, 4.324e-02, 8.274e-02, 2.189e-01, -5.179e-02, 1.711e-01, 8.551e-02, 9.272e-03, 2.682e-02, -2.505e-01, -3.644e-02)); + r += mul(s2_2, M4(-7.932e-02, -4.863e-02, -8.513e-03, 5.279e-02, -6.115e-02, 6.127e-02, 5.479e-02, 8.834e-02, -1.818e-01, 8.003e-02, -2.282e-02, 7.345e-02, -1.437e-01, -1.694e-01, 6.211e-02, 8.869e-02)); + r += mul(s2_3, M4(2.295e-01, 1.147e-01, -4.242e-02, -6.906e-02, -1.372e-01, -1.550e-01, 1.597e-01, 3.426e-02, -3.796e-02, 6.194e-02, 1.454e-01, 5.858e-02, 1.212e-01, -1.196e-01, 2.121e-01, 1.099e-01)); + r += mul(s2_4, M4(9.416e-02, 1.947e-01, -1.973e-02, -1.809e-01, -2.024e-01, -7.946e-02, 1.482e-01, 2.162e-01, -7.181e-02, -8.151e-02, 1.364e-01, 8.638e-02, 4.401e-02, 1.989e-01, -9.265e-02, -1.192e-01)); + r += mul(s2_5, M4(-9.022e-02, -7.998e-02, 1.039e-01, -3.487e-02, -1.025e-01, -9.302e-02, 1.054e-01, -1.959e-01, 1.635e-02, -1.455e-01, 8.270e-02, 1.031e-01, -2.780e-02, -3.080e-03, 7.018e-04, -1.151e-01)); + r += mul(s2_6, M4(-2.700e-02, 8.750e-02, -7.652e-02, -1.898e-02, 1.625e-02, -1.408e-03, 6.793e-02, 2.412e-02, -8.187e-02, 4.516e-02, -8.717e-03, 1.623e-01, 1.085e-01, -6.325e-02, 1.013e-01, 2.221e-02)); + r += mul(s2_7, M4(-7.386e-02, -1.695e-01, 4.037e-02, 5.409e-02, -7.252e-02, -1.691e-02, 2.455e-02, 8.284e-02, -1.143e-01, 1.054e-01, 1.559e-01, 1.949e-01, 4.537e-02, -3.583e-02, 9.264e-02, 6.329e-02)); + r += mul(s2_8, M4(-4.150e-02, 4.022e-02, 7.980e-02, -1.115e-01, -5.658e-02, -2.031e-03, -6.667e-02, 1.512e-01, -8.647e-02, -3.108e-02, -5.697e-02, 8.242e-02, -7.639e-02, -3.099e-02, -1.168e-02, 3.149e-02)); + r += mul(s3_0, M4(6.074e-02, -9.433e-02, -1.455e-02, 2.344e-02, 6.801e-02, 3.095e-02, -9.606e-02, 1.790e-02, -3.857e-03, -1.618e-02, -2.126e-02, 4.367e-02, 7.509e-02, 5.339e-02, -1.697e-01, 5.161e-02)); + r += mul(s3_1, M4(-1.572e-01, 3.433e-02, 1.056e-02, 1.624e-01, -1.115e-01, -6.066e-02, 1.438e-01, -5.687e-02, -5.053e-02, -6.958e-02, 1.284e-02, -1.181e-02, -6.860e-02, -5.012e-02, 6.389e-02, 2.225e-01)); + r += mul(s3_2, M4(9.430e-02, -7.752e-02, 2.481e-02, -8.512e-03, 2.760e-02, 7.608e-03, 8.042e-02, 9.668e-02, 1.143e-02, -2.981e-02, -1.074e-02, -2.974e-02, 8.299e-02, 2.113e-02, -1.003e-01, 2.120e-02)); + r += mul(s3_3, M4(-2.065e-01, 8.363e-02, -1.663e-01, 4.624e-02, -7.967e-02, 4.552e-02, -3.836e-02, -1.080e-02, 1.517e-02, 1.873e-02, -3.017e-02, -1.055e-01, -5.513e-02, 8.575e-02, -3.376e-01, 9.619e-02)); + r += mul(s3_4, M4(-4.406e-02, -7.260e-02, 9.714e-02, -5.473e-02, -1.266e-01, 5.401e-02, 1.478e-01, 2.376e-02, 8.741e-02, -6.798e-03, -8.303e-02, 9.785e-03, -3.452e-02, -2.306e-01, 1.248e-01, 9.723e-02)); + r += mul(s3_5, M4(1.082e-01, 3.750e-02, -7.444e-02, -5.845e-02, 5.428e-02, -2.493e-02, 1.083e-02, -2.629e-02, 1.151e-01, 3.029e-02, -1.490e-02, -3.747e-02, 4.242e-02, 2.020e-01, -1.222e-01, 1.628e-01)); + r += mul(s3_6, M4(-7.236e-02, -3.901e-02, 5.888e-02, 6.976e-02, -8.068e-02, -3.520e-02, -8.337e-03, 2.699e-03, 2.558e-02, -6.610e-02, -8.027e-03, -4.848e-02, -7.649e-02, 8.153e-02, -1.475e-01, -3.082e-03)); + r += mul(s3_7, M4(6.555e-02, 5.288e-02, -4.870e-02, -8.899e-03, 4.118e-02, -1.026e-01, -2.763e-03, 8.326e-02, 1.053e-02, -2.956e-03, -9.619e-02, -5.726e-03, 5.812e-02, -1.540e-01, 4.855e-02, 4.349e-02)); + r += mul(s3_8, M4(5.661e-02, 7.438e-03, -3.194e-02, 2.968e-02, -4.814e-02, -1.049e-02, 5.669e-02, 5.227e-02, 1.759e-02, 7.979e-04, -7.995e-02, -1.906e-02, 1.411e-02, 2.705e-02, -6.117e-03, 1.179e-01)); + r += mul(s4_0, M4(4.138e-02, 8.165e-03, -5.496e-02, 2.646e-01, 4.543e-02, 7.343e-02, -1.644e-01, 2.693e-03, -6.105e-03, -7.733e-02, 2.326e-02, -4.724e-03, -3.503e-02, 9.536e-03, 6.063e-03, -5.583e-02)); + r += mul(s4_1, M4(-5.709e-02, 3.212e-02, -1.460e-01, -3.559e-02, 2.203e-01, 4.014e-02, -9.035e-02, 6.420e-02, -5.015e-02, -2.371e-02, 1.237e-02, -2.477e-03, 9.596e-02, 2.574e-02, -7.583e-03, -1.077e-02)); + r += mul(s4_2, M4(1.413e-02, -2.921e-02, 1.968e-02, -7.302e-02, -1.112e-02, 8.178e-02, -7.203e-02, -8.773e-02, 3.204e-02, 1.049e-02, 3.123e-02, -1.198e-01, -7.578e-02, -2.187e-03, 5.386e-02, -5.244e-02)); + r += mul(s4_3, M4(-1.315e-01, 6.912e-02, -2.608e-01, 3.384e-03, 6.421e-02, -9.794e-03, -1.910e-01, 9.869e-02, -8.240e-02, 1.818e-02, 4.489e-02, 9.533e-02, -1.396e-02, 2.221e-02, -2.765e-02, -2.743e-02)); + r += mul(s4_4, M4(8.430e-02, 3.913e-02, -1.024e-01, 4.850e-02, 4.148e-02, -6.597e-02, 6.364e-02, 2.062e-01, -6.475e-02, 3.762e-02, -2.984e-04, -2.388e-02, -3.737e-02, 3.449e-01, -1.450e-01, 1.814e-01)); + r += mul(s4_5, M4(3.153e-02, 1.752e-01, -1.235e-01, 9.559e-02, 3.415e-01, 2.977e-02, 4.321e-02, 1.343e-01, 1.560e-01, 7.211e-02, 1.160e-01, 1.502e-02, 2.140e-02, -5.785e-02, -3.213e-02, 1.006e-01)); + r += mul(s4_6, M4(-5.924e-02, 8.264e-02, -2.766e-02, -2.691e-03, -1.265e-01, 3.158e-02, -7.472e-02, -4.071e-02, 6.202e-02, -7.105e-02, 2.099e-02, -2.883e-02, 1.067e-01, -1.619e-02, 2.582e-02, -1.193e-01)); + r += mul(s4_7, M4(2.155e-01, 6.200e-02, -2.614e-02, 1.846e-01, 3.051e-01, 3.577e-02, 1.145e-02, 2.007e-02, -1.371e-01, 1.737e-02, -2.292e-02, 1.920e-01, -2.273e-01, 4.998e-02, 8.282e-03, 1.758e-01)); + r += mul(s4_8, M4(9.429e-02, 4.540e-02, -4.373e-02, -1.160e-02, -4.470e-02, 1.167e-01, 1.250e-01, 1.890e-01, -1.202e-01, 2.071e-02, 9.206e-02, 7.676e-03, 3.892e-02, 5.756e-02, -1.227e-03, -2.003e-01)); + r += mul(s5_0, M4(-3.945e-02, -8.039e-02, 1.199e-02, 1.966e-01, -9.777e-03, 7.548e-02, -9.030e-02, -2.660e-02, -4.957e-02, -6.565e-02, -1.622e-02, -1.379e-01, 1.367e-02, 5.800e-02, 1.834e-02, 7.695e-02)); + r += mul(s5_1, M4(7.861e-02, 3.483e-02, -1.459e-01, -1.462e-01, 7.203e-02, -3.863e-02, -9.672e-02, -1.374e-01, 7.629e-02, 1.104e-01, 1.283e-01, 2.068e-02, 5.023e-02, -1.772e-02, 6.289e-02, 2.893e-02)); + r += mul(s5_2, M4(-5.870e-02, -2.446e-02, 3.727e-02, 8.240e-02, -3.007e-02, 2.914e-02, 7.667e-02, -7.461e-02, 2.255e-02, 1.335e-01, -1.895e-01, -2.057e-03, 3.962e-02, -4.255e-02, 6.384e-02, 6.045e-03)); + r += mul(s5_3, M4(1.911e-01, -6.249e-02, 2.068e-01, 5.497e-02, -1.472e-02, 9.144e-03, -2.697e-02, -5.151e-02, -1.496e-01, 1.497e-02, 4.692e-02, -9.169e-02, -6.766e-02, -5.018e-02, -5.010e-03, 2.945e-02)); + r += mul(s5_4, M4(1.793e-01, 2.389e-01, -2.089e-01, 2.215e-03, -8.109e-02, -4.797e-02, 7.083e-02, -1.459e-01, 8.028e-02, -2.240e-01, -3.341e-04, -1.007e-01, 1.094e-01, 1.557e-01, -1.603e-03, -1.452e-01)); + r += mul(s5_5, M4(-7.773e-02, -6.554e-02, 7.054e-02, 4.107e-02, -7.730e-04, -1.231e-01, 1.519e-02, 1.209e-01, 1.117e-01, 1.011e-01, 6.114e-02, -1.169e-01, -1.693e-01, -1.078e-01, -9.017e-02, 2.378e-01)); + r += mul(s5_6, M4(5.646e-02, -7.175e-04, 7.008e-02, -5.989e-02, -3.315e-02, 7.058e-03, -4.455e-02, 1.279e-02, 5.475e-02, 8.603e-03, 1.289e-01, -5.157e-03, 5.779e-03, -4.932e-02, -8.713e-02, 1.219e-02)); + r += mul(s5_7, M4(2.670e-02, -7.649e-02, 6.818e-02, 6.627e-02, 9.118e-02, 3.245e-02, 5.684e-02, 3.755e-02, -6.150e-02, -2.769e-02, -2.560e-02, -3.468e-02, 2.159e-01, -1.506e-01, 2.127e-02, 1.382e-01)); + r += mul(s5_8, M4(-1.019e-01, -6.627e-02, 1.043e-01, -2.586e-02, 2.302e-02, -4.713e-03, 3.749e-02, 1.670e-02, 1.364e-01, -4.719e-02, 1.037e-01, -2.311e-01, -1.186e-01, -2.605e-02, 9.677e-03, 3.698e-02)); + r += mul(s6_0, M4(-6.494e-03, 4.738e-02, -1.494e-02, 1.177e-03, 9.666e-02, -1.351e-01, 2.174e-02, -5.155e-02, -2.843e-02, -3.406e-04, -4.074e-02, -5.564e-02, -1.004e-01, -1.048e-02, 3.339e-02, -2.417e-02)); + r += mul(s6_1, M4(3.098e-02, -3.020e-02, 8.200e-02, 6.540e-02, 7.265e-02, -8.772e-02, 5.711e-02, -1.953e-01, 4.587e-03, 1.254e-01, 2.714e-01, 1.993e-01, -2.715e-02, -8.154e-02, -1.626e-01, 5.557e-02)); + r += mul(s6_2, M4(3.862e-02, 3.743e-03, 6.377e-02, -8.208e-02, -1.175e-01, -1.081e-01, 7.790e-02, 1.595e-02, 8.240e-02, 1.424e-02, 4.165e-02, -2.203e-02, -1.018e-01, -2.509e-01, -1.907e-02, 6.418e-03)); + r += mul(s6_3, M4(4.920e-02, 2.192e-02, -2.880e-02, -3.719e-02, 9.495e-02, -4.514e-02, 1.471e-01, 5.986e-02, -2.121e-02, 9.101e-02, -1.167e-01, -1.254e-01, -1.637e-01, -4.881e-02, 8.190e-02, 1.841e-01)); + r += mul(s6_4, M4(-3.650e-02, -5.998e-02, 3.780e-02, -1.643e-02, -6.872e-02, -1.650e-01, -2.220e-01, -3.357e-01, 4.948e-02, 4.375e-02, 2.535e-01, 1.119e-01, -3.487e-01, -2.786e-02, -8.273e-02, 1.548e-01)); + r += mul(s6_5, M4(4.252e-02, 7.157e-02, -5.603e-02, 8.876e-04, 6.368e-02, -3.234e-01, 1.929e-02, -3.111e-02, -2.031e-02, -1.139e-01, -5.647e-02, 8.034e-02, 1.249e-01, 2.387e-01, -9.530e-02, 1.842e-02)); + r += mul(s6_6, M4(3.609e-02, 1.545e-02, -4.462e-02, -2.606e-02, 7.387e-04, -1.032e-02, 1.415e-02, 9.009e-02, 9.100e-03, 4.897e-02, 5.259e-02, 1.973e-02, -2.394e-01, -2.421e-02, 1.286e-01, 3.185e-02)); + r += mul(s6_7, M4(-5.623e-02, -4.501e-02, -4.529e-02, -8.827e-02, -2.332e-02, 1.097e-02, -2.695e-02, 1.039e-03, 1.157e-01, -1.888e-01, 3.724e-02, -1.472e-01, -1.313e-01, -1.401e-01, -2.073e-01, 1.443e-01)); + r += mul(s6_8, M4(8.602e-02, -1.457e-02, -1.366e-02, -1.223e-01, 3.215e-02, 6.168e-02, -4.301e-02, -6.100e-02, -1.310e-01, 2.626e-02, 5.578e-02, 7.027e-02, 1.218e-01, -9.431e-02, 1.189e-01, 2.276e-01)); + r += mul(s7_0, M4(-2.098e-01, 3.773e-02, 9.078e-02, 4.973e-02, 1.670e-02, 3.135e-02, 8.829e-02, 1.958e-02, -2.725e-02, -6.102e-02, 8.044e-02, 8.231e-03, 5.179e-02, -3.102e-02, -6.230e-03, -5.581e-02)); + r += mul(s7_1, M4(3.210e-02, 2.371e-01, 5.989e-02, 1.034e-01, 2.786e-02, 3.655e-02, -4.385e-02, 1.105e-01, 8.371e-02, 1.169e-01, -1.223e-01, 2.819e-02, 6.550e-02, -6.923e-03, 5.620e-02, -3.798e-02)); + r += mul(s7_2, M4(-1.539e-01, 6.029e-02, -2.643e-02, -1.947e-02, 8.463e-02, 5.455e-02, 6.077e-03, 7.383e-02, -3.496e-02, -8.242e-02, 1.702e-02, -2.585e-03, -7.294e-02, 3.695e-03, -1.836e-03, 9.230e-02)); + r += mul(s7_3, M4(-3.393e-02, -7.903e-02, -4.367e-02, -7.064e-02, 6.230e-02, -7.311e-04, 8.585e-02, -5.261e-02, -1.791e-02, -1.270e-02, 1.843e-02, -6.434e-02, 4.059e-02, -5.534e-02, 4.663e-02, -2.061e-02)); + r += mul(s7_4, M4(-6.396e-02, 1.872e-01, 6.300e-03, -1.229e-01, 4.722e-02, 1.159e-01, -1.265e-01, -2.818e-02, 1.133e-01, 2.885e-01, -1.727e-01, 1.164e-02, 1.355e-02, 4.212e-02, -1.263e-03, 9.589e-03)); + r += mul(s7_5, M4(-1.061e-01, -7.650e-02, 2.641e-02, -6.247e-02, -1.294e-01, -4.841e-02, 3.652e-03, 2.337e-02, 1.409e-02, 6.725e-02, -1.023e-01, -7.833e-02, -4.138e-02, 4.985e-02, 5.410e-02, 7.188e-02)); + r += mul(s7_6, M4(-1.224e-01, 1.697e-01, -4.275e-02, -1.083e-01, -3.797e-02, -1.151e-02, -3.402e-02, 3.831e-03, 5.427e-02, -6.544e-03, 2.490e-03, 1.447e-02, 1.551e-02, -2.141e-02, 7.572e-03, -2.319e-02)); + r += mul(s7_7, M4(8.813e-02, 4.677e-02, 7.258e-02, -2.233e-02, 1.056e-01, 4.548e-02, -5.082e-02, 5.598e-02, 4.627e-02, 1.466e-02, -6.589e-02, -8.524e-02, -1.070e-02, -4.714e-02, 1.276e-02, 3.445e-02)); + r += mul(s7_8, M4(-1.312e-01, 1.265e-01, -2.302e-02, -1.697e-01, -2.171e-02, -3.595e-02, 5.103e-02, 2.643e-02, 1.650e-02, 2.831e-02, -2.564e-02, -9.242e-03, 1.215e-02, -2.933e-02, 1.630e-02, 2.074e-02)); + r += V4(-3.171e-03, 4.015e-03, -8.390e-03, -4.936e-03); + return r; +} + +V4 f2(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-3.399e-03, -1.333e-01, 1.635e-01, 8.962e-02, 8.099e-02, 1.812e-02, 2.720e-02, -5.767e-02, -6.046e-03, 1.213e-02, 5.859e-02, 1.206e-02, -1.000e-01, 2.974e-02, -3.893e-01, -1.116e-01)); + r += mul(s0_1, M4(9.527e-02, 1.840e-02, 9.118e-03, -3.785e-03, 4.409e-03, 1.973e-02, 7.759e-03, 1.143e-01, 5.272e-02, 2.280e-02, 6.629e-02, -2.726e-02, -3.087e-02, -4.963e-02, -9.112e-02, 1.470e-01)); + r += mul(s0_2, M4(2.341e-01, -4.306e-02, -3.563e-02, -1.134e-01, 2.904e-02, -1.568e-02, 1.065e-01, 1.184e-01, 2.079e-02, -6.771e-02, 2.918e-02, -1.229e-01, -9.481e-02, 8.101e-02, 4.501e-02, 2.165e-01)); + r += mul(s0_3, M4(1.688e-01, 3.890e-03, 3.508e-01, -6.471e-02, -1.389e-01, -4.583e-03, -1.045e-01, 2.210e-02, 4.821e-02, -1.066e-01, -1.285e-01, 5.111e-02, -2.314e-02, 1.692e-02, -1.240e-01, -2.002e-02)); + r += mul(s0_4, M4(2.392e-02, 4.782e-02, -8.814e-02, -8.142e-02, 1.643e-02, 1.365e-02, -1.485e-01, -1.603e-01, 1.012e-01, 2.038e-01, -8.363e-02, 4.859e-02, 2.361e-02, 1.489e-01, -1.280e-01, 1.544e-01)); + r += mul(s0_5, M4(1.575e-01, -7.385e-02, 6.317e-02, -8.692e-02, 3.277e-02, 6.683e-02, 1.028e-02, -3.689e-02, 6.222e-02, -2.004e-03, 1.195e-01, 1.176e-01, -3.901e-02, 3.434e-02, -4.818e-02, 4.428e-02)); + r += mul(s0_6, M4(1.604e-01, 1.364e-01, -1.335e-01, -1.778e-02, -3.223e-02, -3.696e-02, 1.523e-01, -5.976e-02, 7.820e-02, 3.907e-02, -5.458e-02, 1.035e-01, 2.372e-01, 4.221e-02, 3.357e-02, 1.704e-01)); + r += mul(s0_7, M4(5.804e-02, 4.363e-02, 2.326e-01, -7.886e-02, -2.683e-02, 1.301e-01, 1.184e-01, -4.168e-02, 7.721e-02, 1.494e-01, 1.304e-01, -3.124e-03, -4.602e-02, 3.320e-02, -6.940e-02, -3.177e-02)); + r += mul(s0_8, M4(5.804e-02, 4.494e-02, 1.089e-02, -1.320e-01, 5.313e-02, -4.836e-02, -2.717e-02, -3.837e-02, -5.629e-02, 3.611e-02, -3.032e-02, -1.782e-02, -2.371e-01, 1.627e-02, -9.274e-02, 6.939e-02)); + r += mul(s1_0, M4(9.092e-02, -6.971e-02, -1.102e-01, 1.625e-02, 5.649e-03, 5.476e-02, 1.016e-01, 6.568e-02, -7.223e-02, 2.350e-02, 6.645e-02, -3.048e-02, -4.688e-02, -5.166e-02, 5.258e-02, -1.552e-01)); + r += mul(s1_1, M4(-4.626e-02, 1.886e-02, -1.651e-02, 1.383e-01, -1.149e-02, 1.385e-02, 1.109e-01, -1.262e-01, 4.312e-02, 4.767e-02, -4.446e-02, 1.129e-01, 6.379e-02, 4.591e-03, -1.581e-02, -2.110e-02)); + r += mul(s1_2, M4(1.796e-03, -4.724e-02, -2.260e-02, 8.648e-02, 6.675e-02, 8.029e-03, 9.495e-02, 1.093e-02, -1.169e-02, -4.569e-02, 2.030e-02, 1.498e-02, -1.522e-02, -2.637e-02, 9.407e-02, -3.015e-02)); + r += mul(s1_3, M4(8.454e-02, -1.288e-03, 1.089e-01, 4.196e-02, -5.778e-03, 2.723e-01, 9.079e-02, 1.495e-02, -1.471e-01, -3.339e-02, -3.628e-02, -2.691e-02, 1.211e-01, 1.982e-02, 4.722e-02, -8.535e-02)); + r += mul(s1_4, M4(4.551e-02, 6.671e-02, 6.336e-02, 4.779e-02, 8.950e-03, 1.359e-01, 1.117e-01, -2.095e-01, 1.470e-01, -1.039e-01, -3.483e-01, -1.662e-01, 1.200e-01, 7.917e-02, 4.670e-02, -6.803e-02)); + r += mul(s1_5, M4(1.159e-01, -5.814e-02, 9.309e-02, -3.716e-02, 5.534e-02, 4.731e-02, 8.854e-03, -2.103e-02, -4.678e-02, -8.613e-02, -2.210e-01, 1.242e-01, 6.801e-02, 6.014e-02, 1.043e-01, -6.511e-02)); + r += mul(s1_6, M4(4.771e-02, -2.302e-02, -4.998e-02, 1.032e-02, 3.177e-02, 2.740e-02, 4.264e-02, 6.545e-02, 1.176e-02, 1.915e-02, 7.586e-02, 2.345e-01, 9.349e-02, 5.581e-02, 4.117e-02, -3.574e-02)); + r += mul(s1_7, M4(-1.662e-01, -7.375e-02, 4.694e-02, -5.693e-02, 5.791e-02, 2.733e-02, 3.989e-02, -6.208e-02, -2.600e-02, 1.030e-01, -5.928e-02, 1.294e-01, -3.075e-02, -1.290e-02, 3.637e-02, 4.538e-02)); + r += mul(s1_8, M4(-3.063e-02, 4.667e-02, -1.916e-02, -3.819e-02, -6.651e-03, -1.333e-01, 1.463e-01, -6.487e-04, -9.355e-02, -1.384e-01, -1.062e-01, 1.348e-01, -3.547e-02, 8.893e-02, 2.088e-03, -8.661e-04)); + r += mul(s2_0, M4(-1.895e-01, -1.416e-02, 7.805e-02, -8.565e-02, -1.401e-01, 3.184e-02, -4.643e-02, -2.616e-02, -9.603e-02, -8.861e-03, 1.255e-02, -5.402e-02, -1.656e-01, -8.053e-02, 6.487e-02, 6.307e-02)); + r += mul(s2_1, M4(-8.296e-02, 1.041e-01, 1.727e-01, -1.569e-01, 1.221e-01, -7.730e-03, -2.385e-01, -8.320e-02, -9.366e-02, 4.158e-02, -4.438e-01, 1.181e-01, -1.054e-01, 2.307e-02, 1.032e-01, -1.626e-02)); + r += mul(s2_2, M4(-9.554e-02, -4.403e-02, 1.346e-01, -1.762e-02, -1.433e-03, -3.288e-02, -7.941e-02, -2.863e-02, 2.315e-02, -6.922e-02, -6.280e-02, -1.059e-01, 5.831e-02, -6.399e-02, 1.018e-02, -6.664e-02)); + r += mul(s2_3, M4(-1.866e-01, -1.658e-01, 2.559e-01, 6.668e-02, 8.053e-02, 2.897e-03, -2.089e-01, 1.255e-02, -2.093e-01, 5.987e-02, -2.858e-02, -2.345e-01, 2.634e-01, -5.074e-02, 3.121e-02, -1.120e-01)); + r += mul(s2_4, M4(2.180e-01, -2.126e-01, 2.746e-01, 1.975e-02, 3.325e-03, 2.304e-01, -3.438e-02, -1.664e-01, 4.373e-02, -4.749e-02, -2.693e-01, -1.300e-01, -1.810e-01, 6.749e-02, -1.728e-01, 2.882e-02)); + r += mul(s2_5, M4(2.956e-02, -1.380e-02, -3.309e-02, -1.515e-02, -7.372e-02, -1.184e-02, 9.779e-02, -1.747e-01, 1.042e-01, 5.176e-02, -6.874e-03, -1.106e-01, -9.242e-03, -7.972e-02, -1.311e-01, -5.237e-03)); + r += mul(s2_6, M4(5.180e-02, 6.270e-02, 1.315e-01, 9.924e-02, -3.893e-02, -7.067e-02, -3.561e-02, 9.771e-02, -2.707e-01, -6.668e-02, -2.077e-02, -1.102e-01, -4.309e-02, -1.039e-01, -1.013e-01, 3.611e-02)); + r += mul(s2_7, M4(6.780e-02, -1.590e-01, 2.963e-01, 4.530e-02, 8.558e-02, -6.683e-02, -2.691e-01, 4.346e-03, 9.810e-02, 3.145e-02, -1.352e-02, 8.583e-02, -1.840e-02, 1.639e-02, 2.761e-02, -1.049e-01)); + r += mul(s2_8, M4(-1.724e-01, -1.849e-01, -1.644e-01, -4.091e-02, 4.987e-02, 9.072e-02, 1.068e-02, -1.310e-01, 2.451e-01, 1.010e-03, 5.341e-02, -7.349e-02, 2.736e-03, 1.471e-01, 7.518e-02, -1.221e-02)); + r += mul(s3_0, M4(8.039e-02, -4.309e-02, -3.394e-02, -1.010e-01, -1.060e-01, -3.326e-03, 7.692e-02, -1.208e-01, 2.169e-03, -1.648e-02, 1.444e-02, 4.783e-02, 2.027e-02, -5.927e-03, -1.183e-02, -4.858e-02)); + r += mul(s3_1, M4(-1.124e-01, -1.963e-02, -1.640e-02, -5.947e-02, 1.237e-03, -8.583e-02, 2.876e-03, -9.743e-02, -6.886e-02, -7.141e-03, -3.896e-03, 1.536e-02, 4.794e-02, -1.096e-01, 2.549e-02, 1.263e-01)); + r += mul(s3_2, M4(1.250e-01, -4.949e-03, 3.525e-02, -1.308e-02, -3.695e-03, -5.323e-02, 1.222e-03, -3.075e-02, -1.388e-03, -9.577e-03, 4.296e-04, 6.666e-02, -5.979e-02, 3.506e-02, -1.869e-02, 5.446e-02)); + r += mul(s3_3, M4(-1.171e-01, 2.664e-02, 1.063e-01, -6.276e-03, -8.396e-03, 1.078e-01, -4.294e-02, 9.336e-02, -1.071e-02, 1.569e-02, 4.817e-02, 8.765e-02, -2.305e-01, 3.090e-02, 1.692e-01, 1.753e-01)); + r += mul(s3_4, M4(5.076e-03, -1.902e-01, -1.299e-01, 1.303e-01, -3.924e-02, 1.519e-01, -8.081e-02, -7.900e-02, 7.273e-02, -1.331e-01, -6.378e-02, -3.999e-02, -1.071e-01, -4.063e-03, 1.049e-01, 7.222e-03)); + r += mul(s3_5, M4(-1.152e-01, -2.036e-03, 7.410e-02, -6.259e-02, -6.560e-02, 6.826e-02, 6.316e-03, -7.414e-03, 4.555e-02, -3.406e-02, 1.181e-02, 4.307e-02, -3.666e-02, 5.070e-02, -5.521e-03, 4.305e-02)); + r += mul(s3_6, M4(2.281e-01, 3.983e-02, -6.538e-02, 1.858e-02, -4.044e-02, 4.944e-02, 1.055e-01, -1.410e-01, -4.775e-03, -3.619e-02, -4.327e-02, -1.120e-01, -5.352e-02, 8.676e-02, 1.774e-02, -4.081e-02)); + r += mul(s3_7, M4(-3.218e-03, -6.811e-02, -6.519e-02, 1.342e-01, -7.100e-03, -7.039e-02, 2.666e-02, -7.692e-02, 2.331e-02, 3.179e-02, 1.173e-01, 6.603e-02, -1.208e-01, -7.213e-02, 5.929e-02, 8.421e-02)); + r += mul(s3_8, M4(-3.993e-02, -9.329e-03, 2.565e-02, 8.653e-02, 3.002e-02, -6.917e-02, -5.029e-02, 1.622e-02, 1.050e-02, 8.425e-03, 1.787e-02, -1.812e-02, -4.378e-02, 4.965e-02, -3.166e-02, 1.749e-02)); + r += mul(s4_0, M4(9.219e-02, -1.606e-02, 9.817e-02, -3.357e-01, 1.134e-01, -4.664e-03, -1.514e-01, 9.937e-02, -5.159e-02, 8.918e-04, 1.750e-02, -4.721e-02, -4.224e-02, 3.066e-02, 1.144e-02, -3.345e-02)); + r += mul(s4_1, M4(-8.637e-02, -5.564e-02, 5.138e-02, -1.391e-01, -1.507e-01, 4.180e-03, 1.485e-02, -2.553e-02, -1.910e-02, 5.254e-02, 5.222e-02, 6.109e-02, 1.121e-01, -1.485e-02, -1.411e-02, -3.113e-02)); + r += mul(s4_2, M4(1.301e-01, -7.978e-03, -1.393e-02, -7.214e-02, 1.865e-01, -6.353e-04, -1.992e-02, 1.103e-02, 4.821e-02, 1.285e-02, -1.085e-01, -1.609e-02, -4.429e-02, -1.546e-02, 8.609e-02, -2.711e-02)); + r += mul(s4_3, M4(-2.509e-01, -1.322e-01, 1.045e-01, -9.006e-02, 1.093e-01, 1.637e-01, -8.574e-02, -8.930e-03, 5.782e-02, -5.858e-02, -1.084e-01, -2.936e-02, 1.714e-03, 5.823e-02, -1.273e-01, -4.853e-02)); + r += mul(s4_4, M4(1.060e-02, -2.217e-01, 2.880e-01, -3.584e-02, -2.595e-01, -1.631e-01, 1.352e-01, 2.201e-01, -1.267e-01, -9.749e-02, -2.792e-02, 1.037e-01, -3.967e-02, 9.149e-02, 4.318e-02, 1.166e-01)); + r += mul(s4_5, M4(6.478e-02, -4.484e-02, 3.809e-02, -3.552e-02, 8.834e-02, -3.385e-02, -6.293e-02, 2.586e-01, -1.035e-02, 2.827e-02, -2.354e-02, 5.704e-02, 2.633e-02, 1.038e-01, -5.300e-02, -8.980e-03)); + r += mul(s4_6, M4(9.930e-02, 1.884e-02, 4.265e-02, 1.050e-01, 6.271e-02, -2.960e-02, -6.198e-02, -3.177e-02, -1.982e-02, 3.138e-02, 2.802e-02, -7.681e-02, -1.440e-02, -3.626e-02, 2.283e-02, -9.296e-02)); + r += mul(s4_7, M4(1.740e-01, -5.531e-02, -1.019e-01, 2.412e-01, 6.407e-02, -9.663e-02, -2.068e-01, 2.792e-01, -3.690e-02, 6.203e-02, -7.736e-02, -7.056e-02, 2.487e-02, -1.859e-02, 4.167e-02, 1.364e-01)); + r += mul(s4_8, M4(5.267e-03, -2.518e-02, -5.685e-02, 9.379e-02, 1.073e-01, 6.220e-02, -4.334e-02, 1.590e-01, -2.332e-02, -6.173e-02, 1.565e-02, -2.200e-02, -9.786e-02, -9.415e-02, -5.747e-02, 5.885e-02)); + r += mul(s5_0, M4(-1.377e-03, -1.527e-02, 1.928e-02, 8.000e-02, -8.736e-02, -5.620e-03, -4.459e-02, 4.203e-02, 1.057e-01, 4.444e-02, 2.365e-02, -9.226e-02, 7.327e-02, 3.791e-03, 6.473e-02, 2.468e-02)); + r += mul(s5_1, M4(1.614e-01, 4.639e-02, -1.534e-01, 3.564e-02, 4.357e-02, 6.173e-02, 2.216e-02, -8.123e-02, -1.202e-01, 2.329e-02, 7.193e-02, 1.261e-01, 9.497e-02, -4.084e-02, 1.955e-01, 9.262e-02)); + r += mul(s5_2, M4(2.801e-02, -4.912e-02, 7.114e-02, 1.439e-03, -9.265e-03, -6.691e-02, -5.837e-03, -9.360e-02, -8.374e-02, 1.933e-02, 9.814e-02, 2.211e-01, 1.116e-01, -4.033e-02, 1.073e-01, -5.177e-02)); + r += mul(s5_3, M4(8.504e-02, -1.576e-01, -8.348e-02, -1.539e-01, 1.322e-02, 3.964e-02, -2.371e-02, -5.369e-02, 1.859e-01, -3.900e-02, -9.974e-02, 7.470e-02, 1.265e-01, 9.210e-02, -3.323e-02, 6.984e-02)); + r += mul(s5_4, M4(7.407e-03, 3.467e-02, -5.767e-02, -1.088e-01, -1.367e-01, -7.396e-02, 8.759e-02, 9.492e-02, -3.186e-04, -1.533e-01, -1.613e-01, -1.761e-03, 3.867e-01, 2.290e-01, -1.586e-01, -2.010e-01)); + r += mul(s5_5, M4(1.360e-02, -1.785e-02, -3.573e-02, -4.038e-02, 7.436e-02, 5.923e-02, -1.377e-02, -1.017e-01, -6.853e-02, -1.940e-02, -1.804e-01, -1.106e-01, 1.544e-01, -7.375e-02, 8.420e-02, -1.161e-01)); + r += mul(s5_6, M4(-7.538e-02, -7.231e-02, 5.213e-02, 4.965e-02, -5.179e-04, 1.038e-02, 2.649e-02, 3.156e-05, -4.038e-03, -1.578e-01, 2.497e-02, -8.121e-02, 4.998e-02, -1.159e-01, 1.821e-01, 7.560e-02)); + r += mul(s5_7, M4(1.023e-01, -1.525e-01, 4.211e-02, -2.338e-01, 2.877e-02, -1.010e-01, -1.719e-02, 9.882e-02, -3.067e-02, -7.396e-02, -1.246e-01, -7.543e-02, -1.324e-01, -1.461e-01, 1.423e-02, 2.280e-02)); + r += mul(s5_8, M4(-4.715e-03, -5.282e-02, 3.491e-02, -9.070e-02, 1.037e-01, 1.120e-02, 7.443e-04, 9.966e-02, -8.891e-03, 5.557e-02, -1.180e-02, -3.528e-02, -3.237e-02, -1.740e-01, 4.937e-02, -2.464e-02)); + r += mul(s6_0, M4(-8.665e-02, 9.442e-03, -3.271e-02, -1.549e-02, 8.047e-02, 1.667e-02, 6.394e-02, 8.030e-02, -1.415e-01, 7.993e-02, 7.679e-02, 5.065e-03, -7.120e-02, -2.077e-03, 1.013e-01, 5.265e-02)); + r += mul(s6_1, M4(1.001e-01, -4.013e-02, -1.035e-01, -5.445e-02, 1.306e-01, 1.969e-02, 4.396e-02, -2.667e-01, -5.041e-02, 4.116e-02, -8.319e-02, -2.392e-01, 1.150e-01, -1.910e-02, 7.817e-02, 9.090e-02)); + r += mul(s6_2, M4(3.404e-02, 8.336e-03, -1.125e-01, -1.510e-01, 1.460e-01, -3.987e-02, -8.898e-02, -2.425e-01, 1.092e-02, 5.936e-02, -3.514e-02, 6.529e-03, 3.837e-02, -2.472e-02, -9.547e-02, -9.396e-02)); + r += mul(s6_3, M4(-1.513e-01, 2.992e-02, 1.391e-01, 5.229e-02, 1.068e-01, -9.627e-02, 3.284e-02, 2.356e-02, -7.095e-03, 1.784e-01, 3.594e-02, 1.013e-01, 1.698e-01, -8.420e-02, 2.065e-01, 9.354e-02)); + r += mul(s6_4, M4(-1.394e-01, 2.430e-02, 8.983e-02, -8.055e-02, 1.957e-01, 1.421e-01, 4.197e-02, -1.625e-01, -1.161e-01, 4.852e-03, 2.710e-01, -3.648e-01, -1.721e-01, 5.707e-02, 3.576e-01, 3.643e-01)); + r += mul(s6_5, M4(-6.297e-02, 1.236e-01, 3.529e-02, 6.796e-02, -4.249e-02, -2.873e-02, 7.233e-03, -1.039e-02, -7.700e-02, -8.922e-03, -1.446e-02, -2.781e-01, 2.135e-01, 7.543e-02, 8.269e-02, 1.142e-01)); + r += mul(s6_6, M4(-5.073e-02, -3.300e-03, 4.523e-02, -2.752e-03, 1.079e-02, 1.085e-02, 8.277e-02, 1.070e-02, 9.057e-02, -1.403e-02, -4.971e-03, 1.269e-02, 1.669e-01, 1.033e-01, 1.315e-01, -1.391e-01)); + r += mul(s6_7, M4(-1.036e-02, -9.453e-02, 1.037e-02, -1.003e-03, 1.193e-01, 5.614e-02, 9.476e-02, -3.669e-02, -1.811e-01, 1.325e-01, -1.106e-02, -1.057e-01, 1.558e-01, 1.597e-01, 1.786e-01, 2.404e-02)); + r += mul(s6_8, M4(1.505e-03, -1.317e-01, -8.725e-02, -3.807e-02, 4.751e-02, -8.481e-02, 1.363e-02, 1.515e-01, -1.059e-02, 1.262e-01, -4.187e-02, 4.321e-04, 5.830e-02, 9.412e-02, 1.167e-01, -1.262e-01)); + r += mul(s7_0, M4(2.247e-01, -2.586e-02, -1.196e-01, 1.432e-01, -2.930e-02, -2.740e-02, -1.187e-01, 7.369e-02, -9.139e-03, -9.799e-03, -3.261e-02, 1.047e-01, -4.716e-02, 1.361e-02, 3.058e-02, 1.517e-02)); + r += mul(s7_1, M4(-2.263e-01, -6.201e-02, -5.533e-02, 1.001e-01, -1.249e-01, 7.313e-02, -7.635e-02, 6.038e-02, -7.559e-02, 1.219e-01, -4.758e-02, 1.272e-02, 9.694e-04, 8.565e-02, 3.794e-03, -2.245e-02)); + r += mul(s7_2, M4(-6.290e-02, -2.224e-03, -1.022e-02, 7.237e-02, 3.171e-02, -4.334e-03, -1.161e-01, 1.032e-02, -3.537e-02, -1.875e-02, -1.202e-01, -6.996e-02, -2.806e-05, -2.278e-02, -5.171e-03, 5.068e-02)); + r += mul(s7_3, M4(1.592e-01, -1.322e-01, -1.150e-01, 7.270e-02, -5.486e-02, -6.318e-02, -4.070e-02, -3.950e-02, 2.477e-02, 9.655e-02, 2.007e-02, -1.155e-01, -1.543e-02, -3.040e-02, -3.466e-02, 8.299e-03)); + r += mul(s7_4, M4(-6.151e-02, 1.051e-01, 8.776e-02, -1.650e-01, 5.560e-02, 2.300e-01, 2.273e-01, 1.336e-01, -3.419e-02, 1.624e-01, 1.338e-01, -4.111e-02, -1.190e-01, 2.853e-04, -1.343e-01, 1.454e-01)); + r += mul(s7_5, M4(9.564e-03, 6.705e-02, 7.108e-02, -1.017e-01, -5.055e-02, 3.334e-02, -5.725e-02, -8.431e-02, -1.571e-01, 5.455e-02, -1.318e-03, -6.714e-02, 7.995e-02, -1.517e-01, -1.170e-01, 2.803e-02)); + r += mul(s7_6, M4(9.725e-02, -2.363e-01, -1.968e-01, 2.334e-01, 7.791e-03, 4.165e-02, -2.619e-02, 1.913e-02, -3.451e-02, -4.748e-02, 2.229e-02, 5.546e-02, -4.080e-02, -2.234e-02, 5.510e-03, -2.945e-02)); + r += mul(s7_7, M4(2.238e-02, -1.256e-01, -9.673e-02, 5.074e-02, -3.286e-02, -4.920e-02, -3.279e-02, -1.358e-02, -1.090e-01, -3.961e-03, -3.684e-03, -7.970e-02, 7.199e-03, -3.798e-02, -9.125e-02, 3.217e-02)); + r += mul(s7_8, M4(-1.132e-01, -5.104e-02, -3.001e-02, 5.771e-02, -2.920e-02, -7.713e-02, -1.449e-01, -6.916e-03, 5.838e-04, 1.030e-02, 4.348e-02, 1.441e-02, 5.680e-03, -3.232e-02, 3.748e-02, -9.775e-02)); + r += V4(-9.878e-04, -3.319e-03, -7.274e-03, -4.102e-03); + return r; +} + +V4 f3(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-2.585e-02, -5.447e-02, -6.410e-02, 9.135e-04, 3.840e-03, 7.830e-02, 2.980e-02, -4.394e-03, -1.362e-01, 2.882e-02, -8.374e-02, -5.660e-02, 8.662e-02, 3.281e-02, 2.442e-02, 2.502e-01)); + r += mul(s0_1, M4(-4.057e-01, 1.377e-01, 1.821e-01, 8.596e-02, -3.172e-02, -2.692e-02, -1.087e-02, -5.274e-02, -1.119e-01, -4.529e-02, 9.902e-02, 1.566e-01, 7.653e-02, -8.398e-02, -1.224e-01, -1.669e-01)); + r += mul(s0_2, M4(-1.571e-01, -1.348e-02, 9.840e-02, 1.100e-01, 1.837e-02, 2.951e-02, -4.254e-02, -4.719e-03, 1.283e-01, 8.471e-02, -1.224e-01, 4.960e-02, -9.345e-02, 3.713e-02, 3.409e-02, -5.489e-02)); + r += mul(s0_3, M4(-1.642e-02, 1.607e-01, 6.271e-02, -1.352e-02, -5.466e-02, -1.352e-01, -6.569e-02, 2.534e-02, 9.311e-03, -4.879e-02, 1.099e-01, -3.576e-02, 1.043e-01, 1.869e-01, -4.980e-02, 2.746e-01)); + r += mul(s0_4, M4(-2.632e-01, 1.476e-01, -5.304e-02, -2.674e-01, -2.612e-02, 3.601e-02, 2.724e-01, 1.413e-01, 3.967e-02, 1.108e-01, 1.607e-01, -7.162e-03, 3.205e-01, 1.498e-01, -1.481e-01, -3.898e-02)); + r += mul(s0_5, M4(-6.274e-02, 1.343e-02, -1.190e-03, 6.878e-02, 6.454e-02, -7.951e-02, 2.946e-02, 3.911e-02, 1.520e-02, -8.300e-02, 2.361e-02, -1.104e-01, 2.094e-01, 6.251e-03, -4.144e-02, 3.402e-02)); + r += mul(s0_6, M4(1.792e-01, -3.768e-02, 4.980e-02, 8.778e-02, -8.272e-03, 1.126e-01, 3.220e-02, -5.665e-02, 4.564e-02, 9.751e-02, -2.899e-02, 5.977e-02, 4.468e-02, -1.758e-02, -6.659e-02, 2.254e-01)); + r += mul(s0_7, M4(-1.326e-01, 4.870e-02, -8.994e-02, 1.498e-01, -6.912e-02, 1.986e-01, -6.959e-02, 5.150e-02, 5.573e-02, -5.805e-02, -6.558e-02, -2.183e-02, -2.339e-02, -3.981e-02, -1.137e-02, -3.469e-02)); + r += mul(s0_8, M4(-3.780e-02, -4.288e-02, 1.231e-02, 3.720e-03, -6.412e-02, 9.954e-02, 5.369e-02, 8.991e-02, -4.869e-02, -9.182e-02, 2.655e-02, 7.953e-02, -1.577e-03, -1.117e-01, -2.791e-02, 2.585e-03)); + r += mul(s1_0, M4(-4.467e-02, 1.163e-01, 1.010e-01, -3.280e-02, -3.160e-02, -1.412e-02, -1.160e-01, -1.212e-04, -9.141e-03, 1.402e-01, 4.036e-04, -2.182e-02, 1.524e-01, 8.302e-02, -9.509e-03, 6.960e-02)); + r += mul(s1_1, M4(-1.356e-02, 7.281e-02, 3.867e-02, -9.842e-03, -1.949e-01, 8.373e-02, 1.343e-01, 2.841e-02, 6.260e-02, -8.060e-02, 1.853e-01, 1.154e-01, -7.933e-02, 1.144e-02, 1.572e-02, -3.281e-02)); + r += mul(s1_2, M4(2.395e-03, 9.085e-02, 6.040e-02, 2.920e-02, 9.697e-02, -3.530e-02, -3.643e-02, 3.957e-02, 2.047e-01, 1.251e-02, -7.154e-02, 4.984e-02, -1.746e-02, 8.740e-02, 6.606e-02, -7.007e-02)); + r += mul(s1_3, M4(9.398e-02, 7.480e-04, -8.108e-02, -3.124e-02, -7.854e-02, 5.976e-02, 1.977e-02, -5.280e-03, 9.734e-02, -2.138e-01, -4.311e-02, -1.293e-01, -2.922e-02, 4.149e-02, -5.614e-02, 4.738e-02)); + r += mul(s1_4, M4(-5.260e-02, -1.144e-01, -2.939e-02, -2.192e-01, -2.769e-01, 8.326e-02, 1.198e-01, 1.079e-01, 3.293e-02, 7.920e-02, -6.125e-02, 5.985e-02, -5.756e-02, 2.575e-02, -2.339e-02, -2.205e-02)); + r += mul(s1_5, M4(-2.392e-02, -4.508e-02, -1.011e-01, 1.019e-01, 1.123e-01, -3.425e-02, 8.296e-02, 4.336e-02, -2.547e-02, -1.141e-01, 1.746e-01, -1.671e-01, -5.462e-02, 1.379e-01, -2.071e-02, 2.653e-02)); + r += mul(s1_6, M4(-4.377e-02, -3.417e-02, 1.735e-02, 6.546e-02, -2.559e-02, 6.914e-02, 8.200e-02, -1.373e-01, 1.990e-02, -6.559e-02, 1.056e-02, 2.410e-01, 1.999e-02, 2.395e-02, -9.721e-03, -7.985e-03)); + r += mul(s1_7, M4(-3.746e-03, -3.663e-02, -1.538e-02, 4.688e-02, -3.282e-02, -1.423e-01, 3.211e-02, -2.777e-01, 1.854e-01, -1.091e-01, 7.542e-03, 5.689e-02, -2.584e-02, 5.099e-02, 9.334e-03, -8.013e-02)); + r += mul(s1_8, M4(3.173e-02, -5.641e-02, 5.414e-03, -6.165e-02, -2.142e-01, 3.303e-02, 3.107e-02, -1.457e-01, 6.330e-02, 6.731e-02, -2.131e-02, 4.852e-02, 5.405e-02, -3.274e-02, 6.393e-02, -6.104e-02)); + r += mul(s2_0, M4(-2.087e-01, 4.199e-02, 1.233e-01, -7.187e-02, 1.128e-02, 3.308e-02, 1.059e-01, 2.926e-01, -8.745e-02, -9.784e-02, 3.644e-02, -9.938e-02, -7.204e-02, 2.681e-02, -6.540e-02, -2.048e-01)); + r += mul(s2_1, M4(7.861e-03, 1.970e-01, -4.907e-02, 5.596e-02, 1.791e-01, -1.221e-01, -1.436e-02, -6.716e-02, 1.264e-01, -1.511e-01, -1.275e-01, 1.137e-01, -4.364e-02, -2.254e-03, -5.332e-02, 2.385e-02)); + r += mul(s2_2, M4(6.989e-02, 9.156e-02, -3.446e-02, -5.190e-02, 9.404e-02, -3.471e-02, -5.609e-02, 1.443e-01, -7.219e-02, -1.295e-01, -1.534e-01, -4.947e-02, -6.313e-02, -7.399e-04, -1.878e-01, 4.217e-02)); + r += mul(s2_3, M4(1.321e-01, -6.419e-02, 7.203e-02, -1.379e-01, -2.549e-02, -1.886e-01, -8.105e-02, -2.253e-02, 2.186e-01, -1.831e-02, -7.786e-02, 1.768e-01, 2.367e-02, 1.452e-01, -1.983e-02, 1.518e-01)); + r += mul(s2_4, M4(2.156e-01, 6.378e-02, -1.064e-01, -1.022e-01, 1.701e-01, -1.038e-01, -1.264e-02, -1.800e-02, -2.390e-01, -2.270e-01, -2.519e-01, -6.581e-02, 1.633e-01, 1.256e-01, 6.411e-02, 6.647e-02)); + r += mul(s2_5, M4(6.107e-02, -9.067e-02, -1.240e-02, -2.628e-02, 1.194e-01, 1.773e-02, 2.114e-03, -4.391e-02, -2.084e-01, -1.128e-01, -4.914e-02, 1.101e-01, 1.726e-02, -1.220e-01, 7.833e-02, 3.529e-02)); + r += mul(s2_6, M4(-2.155e-02, 9.136e-02, -1.980e-02, -1.268e-01, 9.448e-02, 3.122e-02, 1.124e-02, 8.269e-02, -8.386e-02, -1.907e-01, 1.474e-01, -8.034e-02, -5.186e-02, -2.152e-01, -3.611e-02, 6.186e-02)); + r += mul(s2_7, M4(-1.224e-01, -1.328e-01, -4.884e-02, 5.879e-02, -5.024e-02, -8.542e-02, -1.082e-01, 1.971e-01, 1.982e-01, -3.316e-02, 1.471e-01, -2.310e-01, 9.502e-02, -1.520e-01, -1.229e-02, -4.399e-02)); + r += mul(s2_8, M4(-2.699e-02, 6.634e-02, -2.067e-02, -1.152e-01, 7.637e-02, -1.409e-01, 4.916e-02, 8.563e-02, 4.391e-02, 3.214e-02, 3.985e-02, -9.064e-03, 5.131e-03, -9.717e-02, 1.151e-02, -1.024e-01)); + r += mul(s3_0, M4(1.422e-01, 4.905e-02, 6.478e-02, 5.610e-02, 9.060e-02, -1.690e-02, -1.570e-02, 4.495e-02, -1.400e-02, 1.725e-03, 4.518e-02, 2.323e-02, 4.923e-02, -6.763e-03, 1.048e-01, 1.285e-01)); + r += mul(s3_1, M4(1.272e-01, -6.393e-02, -9.546e-02, 3.530e-02, 7.041e-02, 1.867e-02, -9.025e-02, -6.270e-02, 4.864e-02, 2.072e-02, 4.579e-02, 4.292e-02, 7.846e-02, -2.893e-02, 1.548e-02, -1.232e-01)); + r += mul(s3_2, M4(-4.305e-02, -2.403e-03, 9.340e-03, 4.241e-02, -5.840e-03, -2.270e-02, -2.000e-02, 8.703e-02, 6.364e-03, -1.474e-02, -3.378e-03, -3.872e-03, 2.892e-03, 4.422e-02, 1.212e-01, -8.838e-02)); + r += mul(s3_3, M4(-4.035e-02, -2.075e-01, -1.039e-01, 1.811e-01, -8.418e-02, -6.565e-02, -2.244e-02, 8.378e-02, 1.240e-02, -2.228e-02, -4.853e-02, 1.112e-01, -1.243e-01, 6.860e-02, -5.448e-03, 1.038e-01)); + r += mul(s3_4, M4(-1.920e-02, 8.644e-02, 3.819e-02, -1.893e-01, 1.294e-01, -4.752e-02, 8.818e-02, -5.266e-02, -1.246e-01, 6.341e-02, -4.990e-02, -1.671e-02, -5.725e-02, -9.683e-02, 9.638e-02, 5.240e-02)); + r += mul(s3_5, M4(2.002e-02, 1.140e-01, 8.538e-02, 1.559e-03, 1.636e-02, 1.223e-02, -1.186e-02, 2.168e-03, -1.009e-01, 9.316e-03, -9.731e-02, 8.741e-03, 2.632e-02, -1.135e-01, -1.423e-01, 8.233e-02)); + r += mul(s3_6, M4(1.938e-03, 5.731e-02, 5.645e-02, 1.169e-01, -6.159e-02, 4.560e-04, -1.568e-02, -1.016e-02, 2.723e-03, -6.959e-02, 5.848e-03, -1.724e-01, 3.066e-02, -4.452e-02, -4.712e-02, 1.104e-01)); + r += mul(s3_7, M4(1.694e-01, 8.618e-02, 1.097e-01, 9.419e-02, -4.966e-02, 4.364e-02, -3.877e-02, -6.220e-03, -1.216e-02, 9.959e-02, -3.456e-02, 2.029e-02, -1.582e-01, 6.902e-02, -6.370e-02, -3.300e-02)); + r += mul(s3_8, M4(2.493e-02, 9.216e-03, -2.540e-02, -4.810e-03, -2.827e-02, -9.963e-03, 2.732e-02, 2.375e-02, 4.082e-02, -2.226e-02, 6.804e-02, -4.862e-03, -1.570e-02, -1.027e-01, -3.080e-02, -9.270e-02)); + r += mul(s4_0, M4(4.554e-02, 1.888e-02, -2.795e-03, 4.838e-02, 4.199e-02, -2.067e-01, 4.532e-05, 5.182e-03, -1.319e-02, 6.469e-02, 3.205e-03, -1.996e-02, -3.419e-02, 5.210e-02, -1.860e-02, 1.883e-02)); + r += mul(s4_1, M4(7.305e-02, 9.797e-02, 1.991e-01, 3.324e-02, -8.276e-02, -1.215e-01, 5.238e-02, 1.681e-01, -2.036e-01, -6.233e-02, -1.087e-02, 2.798e-02, -7.057e-02, 2.005e-02, 9.847e-02, 4.418e-03)); + r += mul(s4_2, M4(-1.732e-02, -6.019e-02, 1.367e-01, 5.675e-02, 1.323e-01, -7.145e-02, 1.792e-01, -9.877e-02, 6.898e-02, 7.271e-02, 7.827e-02, 3.562e-02, 9.910e-02, -1.445e-02, -1.436e-02, -1.742e-02)); + r += mul(s4_3, M4(-1.205e-02, 8.219e-02, -7.588e-03, 1.023e-01, -8.441e-02, 3.061e-02, -8.574e-02, 3.020e-01, 7.354e-04, 5.538e-02, 4.402e-02, -1.078e-01, 2.473e-02, -5.658e-03, -1.434e-01, 3.323e-03)); + r += mul(s4_4, M4(-1.732e-01, 9.407e-02, -6.044e-02, -7.058e-02, 8.125e-02, -1.388e-02, 2.053e-02, 2.503e-01, -1.979e-02, -2.590e-01, -1.424e-01, -2.107e-01, 6.958e-02, -1.036e-01, -3.720e-01, 7.251e-02)); + r += mul(s4_5, M4(1.764e-02, 7.230e-02, 4.248e-02, 1.236e-01, -1.160e-01, -2.729e-01, -4.344e-02, 1.358e-01, 1.727e-02, 5.078e-02, -1.369e-01, 3.504e-02, 2.322e-02, 7.917e-02, 8.632e-02, 8.075e-03)); + r += mul(s4_6, M4(-2.007e-02, 4.633e-02, 3.940e-03, 3.681e-02, -1.385e-01, -1.386e-01, -3.241e-03, -5.116e-02, 5.133e-02, 5.488e-02, 1.790e-02, -7.664e-02, 1.172e-01, 4.431e-02, -4.884e-03, 4.572e-02)); + r += mul(s4_7, M4(2.038e-02, 9.023e-02, 5.058e-02, 8.869e-02, 4.808e-02, -2.131e-02, -4.527e-02, 2.153e-01, -9.389e-03, -6.293e-02, 2.132e-03, -1.629e-02, 5.003e-03, -1.940e-01, -5.580e-04, 3.800e-02)); + r += mul(s4_8, M4(-6.235e-03, -5.695e-03, 1.797e-03, -4.040e-02, -7.224e-02, -3.357e-01, -1.071e-01, 1.427e-01, -2.058e-02, -8.302e-02, 6.861e-02, -9.088e-02, 4.247e-02, -5.801e-03, 4.301e-02, -1.230e-02)); + r += mul(s5_0, M4(-1.851e-01, -8.309e-03, -1.097e-02, 4.908e-02, -1.638e-03, -1.982e-02, 1.282e-02, 7.954e-02, -2.730e-02, 1.104e-02, -6.913e-03, -1.020e-01, -1.184e-02, 7.049e-02, -9.210e-03, -2.910e-02)); + r += mul(s5_1, M4(-5.981e-02, 3.323e-02, 1.790e-01, 7.107e-02, -2.524e-02, 5.868e-02, 7.461e-02, 5.397e-03, 1.105e-02, -1.109e-02, -1.877e-01, 1.042e-01, 8.501e-02, -1.011e-01, -7.199e-02, -1.190e-01)); + r += mul(s5_2, M4(2.461e-02, 3.315e-02, -7.544e-02, 3.864e-02, 1.306e-01, -3.625e-02, 9.585e-03, 1.112e-01, 1.350e-01, 7.111e-03, 1.438e-02, -1.083e-01, -6.924e-02, -3.498e-02, -7.076e-02, 1.377e-02)); + r += mul(s5_3, M4(1.941e-01, 3.021e-02, 2.885e-02, -6.498e-02, -2.116e-02, 3.201e-02, 3.660e-03, 6.502e-02, -2.667e-02, 9.949e-03, 2.169e-02, -8.276e-02, -1.458e-01, -2.832e-02, -1.025e-01, 1.791e-01)); + r += mul(s5_4, M4(8.388e-02, -3.981e-02, -1.060e-01, 1.874e-02, -7.816e-02, 2.979e-03, 5.130e-03, -1.849e-02, 2.030e-01, -5.015e-02, -6.907e-02, 2.951e-02, -3.908e-01, 8.986e-02, -6.753e-02, -1.275e-01)); + r += mul(s5_5, M4(-5.842e-02, -1.493e-01, 5.994e-02, 2.976e-02, -7.239e-02, -1.667e-02, -4.189e-02, 3.085e-03, 2.728e-01, 2.139e-01, 1.643e-01, 5.303e-02, -1.843e-01, -9.559e-02, -1.233e-01, 8.742e-03)); + r += mul(s5_6, M4(-1.255e-01, 7.025e-02, -7.532e-02, -9.300e-02, 7.462e-02, -7.091e-02, 4.919e-02, -3.458e-02, 1.290e-01, -5.353e-02, -5.911e-02, 1.364e-01, 3.136e-02, -1.116e-01, 4.377e-02, -5.287e-03)); + r += mul(s5_7, M4(-2.363e-02, -3.794e-02, -1.007e-01, -8.856e-03, -7.124e-02, 5.981e-02, 2.890e-02, 3.538e-02, 6.294e-02, 1.174e-02, -5.866e-02, -2.908e-02, 2.588e-02, -2.905e-02, 4.247e-02, -1.011e-01)); + r += mul(s5_8, M4(-5.449e-02, 6.772e-02, -7.855e-02, -1.544e-01, 2.643e-02, 3.867e-02, -4.634e-02, 7.590e-02, -1.813e-01, 1.047e-01, -1.400e-01, 3.614e-02, -8.915e-02, 7.867e-02, 4.121e-02, -1.364e-01)); + r += mul(s6_0, M4(-1.979e-02, 4.119e-02, -4.703e-02, 7.739e-03, -9.471e-02, -5.100e-02, 1.301e-01, -1.197e-01, -2.493e-03, -2.455e-02, -1.174e-01, 4.942e-02, -1.109e-01, 6.456e-02, -7.671e-03, 1.920e-01)); + r += mul(s6_1, M4(-6.147e-02, 9.588e-02, -2.003e-02, -5.682e-02, -1.995e-01, -4.454e-02, 3.487e-01, -1.024e-01, -9.889e-02, 1.686e-02, 9.011e-02, -1.528e-02, -3.332e-01, 3.212e-01, 2.864e-01, 1.939e-01)); + r += mul(s6_2, M4(-8.544e-02, 1.802e-03, 6.422e-02, 4.824e-02, 5.645e-02, 1.208e-01, 9.078e-02, 2.502e-02, 2.094e-01, 2.460e-03, -1.114e-02, 4.912e-02, 4.944e-03, 9.641e-03, 1.579e-01, 1.204e-01)); + r += mul(s6_3, M4(1.219e-01, 8.069e-02, -4.334e-02, -1.310e-01, 1.147e-01, 1.878e-02, -5.557e-02, -1.546e-01, -1.256e-01, -7.466e-02, 1.412e-01, 1.766e-01, -3.323e-01, 7.367e-02, -4.014e-03, 7.780e-02)); + r += mul(s6_4, M4(4.867e-02, -1.692e-01, -3.644e-02, -1.731e-03, 4.042e-04, -7.033e-02, -1.145e-01, -1.296e-01, -1.945e-01, -7.274e-02, 1.330e-02, 1.813e-02, -1.548e-01, 5.739e-02, 1.718e-01, -1.194e-01)); + r += mul(s6_5, M4(1.175e-01, 1.082e-01, 6.635e-02, 1.117e-02, -6.449e-02, -1.730e-02, -1.054e-02, -3.358e-02, -4.538e-02, -1.515e-01, -3.798e-03, -1.860e-01, -1.559e-02, 1.447e-01, 1.498e-01, 3.090e-02)); + r += mul(s6_6, M4(-1.683e-03, 8.568e-03, 2.051e-02, -9.578e-02, -1.408e-02, 6.554e-02, -1.017e-02, -6.423e-02, 3.568e-02, 3.394e-02, -5.355e-03, 5.121e-02, -5.380e-02, 2.567e-01, -8.592e-03, 8.988e-02)); + r += mul(s6_7, M4(-8.702e-03, 1.090e-01, 3.289e-02, -6.309e-02, -1.532e-02, 5.859e-02, 1.011e-02, -1.282e-01, -2.085e-01, 1.303e-01, -7.007e-02, -5.548e-02, -1.617e-01, 1.559e-01, -1.230e-01, 1.372e-01)); + r += mul(s6_8, M4(-2.215e-02, 1.931e-02, -2.308e-02, 3.090e-02, -4.948e-03, 1.351e-01, -4.800e-02, -2.988e-02, -7.687e-02, 9.420e-03, -6.256e-04, -6.357e-02, -1.195e-01, -4.792e-02, -9.139e-02, 2.254e-01)); + r += mul(s7_0, M4(2.203e-03, -2.638e-02, 1.745e-02, 5.854e-02, 3.843e-02, 4.916e-02, 2.544e-02, -7.969e-03, -4.501e-02, 1.514e-02, 1.200e-02, -1.089e-01, 2.486e-02, 1.640e-02, 6.529e-03, -7.843e-02)); + r += mul(s7_1, M4(9.363e-02, -9.666e-02, -8.461e-02, -6.027e-02, 7.771e-02, 1.002e-01, -2.305e-01, 2.306e-02, -8.742e-02, 5.979e-02, 1.120e-01, 3.518e-02, -3.995e-02, -5.365e-03, -3.196e-02, 6.700e-02)); + r += mul(s7_2, M4(-7.439e-02, 8.947e-02, 5.290e-02, -1.557e-01, 1.587e-01, 1.261e-01, 9.843e-02, 2.207e-02, 1.622e-02, 1.095e-02, -6.562e-02, 5.018e-02, 1.767e-01, -1.163e-02, -1.534e-02, 3.771e-02)); + r += mul(s7_3, M4(-3.153e-03, -1.115e-01, -1.022e-01, -5.445e-02, 4.177e-02, 1.509e-01, -6.713e-02, 6.606e-02, 3.146e-02, 8.999e-02, 1.069e-01, 2.115e-01, -2.670e-02, -6.698e-03, -1.397e-01, -3.558e-02)); + r += mul(s7_4, M4(5.507e-02, 8.218e-02, 8.870e-02, 1.737e-01, 1.133e-01, 1.509e-01, 4.197e-03, 1.395e-01, 2.306e-03, 1.406e-01, 6.409e-02, -1.196e-01, -1.049e-02, -1.731e-01, -1.654e-01, 8.603e-02)); + r += mul(s7_5, M4(1.062e-01, 6.239e-02, -4.532e-02, -5.487e-02, 1.542e-01, -1.638e-01, 1.408e-02, 1.168e-01, 1.202e-01, -2.339e-02, 1.279e-01, -7.620e-02, -1.743e-02, -6.179e-02, 3.338e-02, -5.470e-02)); + r += mul(s7_6, M4(-1.300e-02, -2.047e-01, 8.754e-02, -4.462e-02, -3.802e-02, 4.599e-02, -1.657e-02, 4.666e-02, 3.600e-02, 3.374e-02, -2.250e-02, 1.236e-01, 2.197e-02, -4.661e-02, -1.053e-02, -3.981e-03)); + r += mul(s7_7, M4(-1.520e-01, 5.762e-03, 4.383e-02, -7.849e-02, 2.270e-02, -7.221e-02, 6.181e-02, 3.006e-02, -6.144e-03, 9.368e-03, -2.907e-02, -9.180e-02, 9.218e-02, -3.234e-02, 2.264e-02, 2.187e-02)); + r += mul(s7_8, M4(-2.746e-03, 6.316e-04, 6.491e-02, -9.523e-02, 1.773e-02, -7.556e-03, -3.814e-02, 2.902e-02, 1.077e-01, -2.771e-02, -8.368e-03, 1.335e-01, -6.737e-02, 3.118e-02, 5.495e-03, 4.450e-02)); + r += V4(-7.540e-03, -2.048e-02, -4.214e-03, -1.008e-02); + return r; +} + +void Pass12(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = Rmp8x8(tid.x) + blockStart; + uint2 size = GetInputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = (gxy + 0.5) * pt; + + V4 s0_0 = l0(-1.0, -1.0); + V4 s0_1 = l0(0.0, -1.0); + V4 s0_2 = l0(1.0, -1.0); + V4 s0_3 = l0(-1.0, 0.0); + V4 s0_4 = l0(0.0, 0.0); + V4 s0_5 = l0(1.0, 0.0); + V4 s0_6 = l0(-1.0, 1.0); + V4 s0_7 = l0(0.0, 1.0); + V4 s0_8 = l0(1.0, 1.0); + V4 s1_0 = -max(-s0_0, 0.0); + V4 s1_1 = -max(-s0_1, 0.0); + V4 s1_2 = -max(-s0_2, 0.0); + V4 s1_3 = -max(-s0_3, 0.0); + V4 s1_4 = -max(-s0_4, 0.0); + V4 s1_5 = -max(-s0_5, 0.0); + V4 s1_6 = -max(-s0_6, 0.0); + V4 s1_7 = -max(-s0_7, 0.0); + V4 s1_8 = -max(-s0_8, 0.0); + s0_0 = max(s0_0, 0.0); + s0_1 = max(s0_1, 0.0); + s0_2 = max(s0_2, 0.0); + s0_3 = max(s0_3, 0.0); + s0_4 = max(s0_4, 0.0); + s0_5 = max(s0_5, 0.0); + s0_6 = max(s0_6, 0.0); + s0_7 = max(s0_7, 0.0); + s0_8 = max(s0_8, 0.0); + + V4 s2_0 = l1(-1.0, -1.0); + V4 s2_1 = l1(0.0, -1.0); + V4 s2_2 = l1(1.0, -1.0); + V4 s2_3 = l1(-1.0, 0.0); + V4 s2_4 = l1(0.0, 0.0); + V4 s2_5 = l1(1.0, 0.0); + V4 s2_6 = l1(-1.0, 1.0); + V4 s2_7 = l1(0.0, 1.0); + V4 s2_8 = l1(1.0, 1.0); + V4 s3_0 = -max(-s2_0, 0.0); + V4 s3_1 = -max(-s2_1, 0.0); + V4 s3_2 = -max(-s2_2, 0.0); + V4 s3_3 = -max(-s2_3, 0.0); + V4 s3_4 = -max(-s2_4, 0.0); + V4 s3_5 = -max(-s2_5, 0.0); + V4 s3_6 = -max(-s2_6, 0.0); + V4 s3_7 = -max(-s2_7, 0.0); + V4 s3_8 = -max(-s2_8, 0.0); + s2_0 = max(s2_0, 0.0); + s2_1 = max(s2_1, 0.0); + s2_2 = max(s2_2, 0.0); + s2_3 = max(s2_3, 0.0); + s2_4 = max(s2_4, 0.0); + s2_5 = max(s2_5, 0.0); + s2_6 = max(s2_6, 0.0); + s2_7 = max(s2_7, 0.0); + s2_8 = max(s2_8, 0.0); + + V4 s4_0 = l2(-1.0, -1.0); + V4 s4_1 = l2(0.0, -1.0); + V4 s4_2 = l2(1.0, -1.0); + V4 s4_3 = l2(-1.0, 0.0); + V4 s4_4 = l2(0.0, 0.0); + V4 s4_5 = l2(1.0, 0.0); + V4 s4_6 = l2(-1.0, 1.0); + V4 s4_7 = l2(0.0, 1.0); + V4 s4_8 = l2(1.0, 1.0); + V4 s5_0 = -max(-s4_0, 0.0); + V4 s5_1 = -max(-s4_1, 0.0); + V4 s5_2 = -max(-s4_2, 0.0); + V4 s5_3 = -max(-s4_3, 0.0); + V4 s5_4 = -max(-s4_4, 0.0); + V4 s5_5 = -max(-s4_5, 0.0); + V4 s5_6 = -max(-s4_6, 0.0); + V4 s5_7 = -max(-s4_7, 0.0); + V4 s5_8 = -max(-s4_8, 0.0); + s4_0 = max(s4_0, 0.0); + s4_1 = max(s4_1, 0.0); + s4_2 = max(s4_2, 0.0); + s4_3 = max(s4_3, 0.0); + s4_4 = max(s4_4, 0.0); + s4_5 = max(s4_5, 0.0); + s4_6 = max(s4_6, 0.0); + s4_7 = max(s4_7, 0.0); + s4_8 = max(s4_8, 0.0); + + V4 s6_0 = l3(-1.0, -1.0); + V4 s6_1 = l3(0.0, -1.0); + V4 s6_2 = l3(1.0, -1.0); + V4 s6_3 = l3(-1.0, 0.0); + V4 s6_4 = l3(0.0, 0.0); + V4 s6_5 = l3(1.0, 0.0); + V4 s6_6 = l3(-1.0, 1.0); + V4 s6_7 = l3(0.0, 1.0); + V4 s6_8 = l3(1.0, 1.0); + V4 s7_0 = -max(-s6_0, 0.0); + V4 s7_1 = -max(-s6_1, 0.0); + V4 s7_2 = -max(-s6_2, 0.0); + V4 s7_3 = -max(-s6_3, 0.0); + V4 s7_4 = -max(-s6_4, 0.0); + V4 s7_5 = -max(-s6_5, 0.0); + V4 s7_6 = -max(-s6_6, 0.0); + V4 s7_7 = -max(-s6_7, 0.0); + V4 s7_8 = -max(-s6_8, 0.0); + s6_0 = max(s6_0, 0.0); + s6_1 = max(s6_1, 0.0); + s6_2 = max(s6_2, 0.0); + s6_3 = max(s6_3, 0.0); + s6_4 = max(s6_4, 0.0); + s6_5 = max(s6_5, 0.0); + s6_6 = max(s6_6, 0.0); + s6_7 = max(s6_7, 0.0); + s6_8 = max(s6_8, 0.0); + + t4[gxy] = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t5[gxy] = f1(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t6[gxy] = f2(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t7[gxy] = f3(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); +} + +//!PASS 13 +//!DESC conv12 +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 +//!IN t4, t5, t6, t7 +//!OUT t0, t1, t2, t3 + +#define l0(x, y) V4(O(t4, float2(x, y))) +#define l1(x, y) V4(O(t5, float2(x, y))) +#define l2(x, y) V4(O(t6, float2(x, y))) +#define l3(x, y) V4(O(t7, float2(x, y))) + +V4 f0(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(8.397e-03, -2.507e-02, 3.115e-02, 2.415e-02, 3.982e-02, -3.972e-02, -6.782e-02, -8.096e-02, -1.642e-01, 6.040e-02, -3.850e-02, -1.102e-01, 3.201e-02, -8.033e-02, 4.230e-02, 2.037e-02)); + r += mul(s0_1, M4(-1.313e-02, 2.910e-02, -6.413e-02, -7.355e-02, -2.697e-02, 2.228e-02, 1.411e-01, -1.088e-02, -1.628e-01, -1.257e-01, 1.380e-01, -9.211e-02, -1.886e-01, -8.809e-04, -7.095e-02, -6.747e-02)); + r += mul(s0_2, M4(1.101e-01, 1.681e-02, -5.337e-02, 4.518e-02, -2.836e-02, 2.875e-02, 7.521e-02, -4.616e-02, -2.643e-02, 5.796e-02, 1.729e-01, -1.620e-02, 6.658e-03, 9.503e-03, 3.965e-02, -3.183e-02)); + r += mul(s0_3, M4(-8.337e-02, -1.290e-02, 2.836e-02, -2.081e-02, 1.285e-02, 6.316e-02, 1.410e-01, -1.300e-02, 8.592e-03, -6.168e-02, 1.673e-01, -7.256e-03, 9.658e-02, -1.437e-02, -4.260e-02, 9.467e-02)); + r += mul(s0_4, M4(-7.681e-02, -4.291e-02, -1.979e-02, -1.736e-01, 1.542e-01, -5.348e-02, -4.007e-02, 1.381e-01, -8.457e-02, -2.382e-01, 2.236e-01, -1.390e-01, -2.633e-01, -2.178e-01, -8.184e-02, 3.088e-01)); + r += mul(s0_5, M4(-3.499e-02, 2.610e-02, 1.548e-03, 4.187e-02, -2.211e-02, 8.575e-02, 6.978e-02, -2.701e-02, 2.594e-02, -5.905e-02, 1.040e-01, -3.981e-02, 1.144e-01, 1.922e-01, 2.564e-02, -1.208e-01)); + r += mul(s0_6, M4(-8.450e-02, -1.947e-02, -2.304e-01, -6.763e-03, -8.898e-02, 9.945e-02, 2.341e-02, -4.767e-02, -3.517e-02, -1.880e-01, 9.954e-02, -6.023e-02, 3.020e-02, 1.812e-02, -2.772e-02, 1.657e-03)); + r += mul(s0_7, M4(-6.004e-02, 1.237e-01, 1.032e-01, -2.493e-02, 2.888e-02, 1.012e-02, 2.147e-02, -4.955e-02, 5.550e-02, -8.621e-02, -1.082e-02, -2.324e-02, 2.239e-02, 1.733e-01, 2.695e-01, -1.750e-01)); + r += mul(s0_8, M4(-7.833e-02, -9.751e-02, -1.117e-02, -7.731e-03, -2.557e-02, 3.695e-02, 1.527e-02, 1.387e-02, -6.895e-02, -5.964e-02, -4.942e-02, -1.406e-03, 4.612e-02, -3.747e-03, 4.250e-02, -5.014e-02)); + r += mul(s1_0, M4(7.934e-02, -1.423e-02, 5.552e-02, 5.383e-02, -9.127e-02, -2.168e-01, 2.002e-01, 3.897e-02, 2.180e-01, 1.213e-01, 4.437e-02, 1.211e-01, 7.367e-02, -2.357e-02, 4.699e-02, 4.793e-02)); + r += mul(s1_1, M4(-1.863e-01, -1.093e-01, -3.252e-02, -1.021e-01, -1.603e-01, 1.726e-01, -4.782e-02, -6.979e-02, -3.930e-02, -8.150e-02, -1.062e-01, -7.686e-02, -1.973e-02, 1.232e-01, -2.288e-03, 1.158e-03)); + r += mul(s1_2, M4(-6.841e-02, -1.142e-02, -5.207e-02, 8.529e-02, -1.082e-01, 2.558e-02, 7.596e-02, 8.927e-02, 5.918e-02, 2.307e-03, 1.047e-02, -1.678e-02, 2.242e-02, -3.374e-02, -2.585e-02, -1.486e-02)); + r += mul(s1_3, M4(-2.578e-02, 2.106e-02, 2.695e-02, 1.425e-02, 1.449e-01, 1.877e-02, -5.360e-03, -9.501e-03, 5.998e-02, -1.275e-03, 1.868e-03, 1.023e-01, -4.661e-02, -1.993e-02, -4.572e-02, 3.942e-02)); + r += mul(s1_4, M4(-1.070e-01, 1.508e-01, 1.678e-01, -2.106e-01, -1.590e-01, -2.091e-01, 3.379e-01, -1.663e-01, -6.316e-02, 1.046e-02, -1.199e-02, 1.777e-02, -2.246e-01, -1.937e-01, -2.215e-02, 1.867e-01)); + r += mul(s1_5, M4(-2.094e-01, 9.463e-02, -6.119e-02, 1.755e-01, 2.438e-02, -1.608e-01, -6.362e-02, 9.098e-03, 1.941e-01, 6.520e-02, 1.421e-04, 6.321e-02, 7.592e-02, 2.601e-02, 7.691e-02, 1.529e-02)); + r += mul(s1_6, M4(-8.407e-03, 3.070e-02, -1.444e-01, 5.257e-02, -9.693e-02, -1.035e-01, 8.972e-02, -1.195e-01, -3.903e-02, 4.734e-02, 6.398e-02, 5.925e-02, 2.000e-02, 2.156e-02, -1.389e-01, 4.243e-02)); + r += mul(s1_7, M4(5.691e-02, 8.460e-02, 8.371e-02, -1.346e-01, -1.417e-01, -1.081e-01, 9.715e-02, -5.800e-02, 7.237e-04, 9.527e-03, -5.995e-02, 9.008e-03, 1.199e-01, -4.870e-02, 1.424e-01, -5.562e-03)); + r += mul(s1_8, M4(-4.500e-02, -8.459e-02, 6.573e-02, -6.560e-03, -4.299e-02, -9.009e-02, 1.337e-01, 3.893e-03, 4.751e-03, 1.002e-02, -2.441e-02, 1.833e-02, 2.459e-02, -1.182e-01, 5.638e-02, -4.341e-02)); + r += mul(s2_0, M4(1.669e-01, 1.216e-01, -2.061e-01, 1.809e-02, -9.047e-02, 1.353e-01, -1.150e-01, -8.150e-02, 4.362e-03, 4.912e-02, -2.679e-02, 7.399e-03, -5.346e-02, 6.318e-02, -4.539e-02, -3.901e-02)); + r += mul(s2_1, M4(4.280e-02, 2.413e-02, -1.279e-01, -3.465e-03, -8.710e-02, 2.938e-02, -2.686e-01, -1.687e-01, -4.013e-02, -9.156e-03, -3.806e-02, 5.557e-02, -2.322e-01, 1.293e-01, -5.066e-02, 1.309e-02)); + r += mul(s2_2, M4(1.148e-01, -4.865e-02, -1.102e-01, -5.574e-02, 4.287e-02, -9.630e-02, -4.427e-02, 4.931e-02, 8.348e-02, 1.964e-02, 9.953e-03, 7.870e-03, -3.408e-02, -2.018e-01, -9.873e-03, 1.215e-02)); + r += mul(s2_3, M4(1.765e-01, 5.511e-02, -3.297e-02, 1.033e-02, -7.185e-02, 7.548e-02, 8.293e-02, 2.149e-01, 1.026e-01, -1.676e-01, 3.156e-02, 1.246e-01, -2.424e-01, -2.664e-01, 6.883e-02, -7.061e-02)); + r += mul(s2_4, M4(-8.945e-02, -2.058e-03, 4.893e-03, 1.060e-02, -1.917e-01, 2.733e-02, 1.772e-01, -6.912e-02, 1.940e-02, -1.210e-01, -2.042e-01, -7.255e-02, -2.123e-01, 2.424e-01, 1.922e-01, 7.533e-02)); + r += mul(s2_5, M4(1.628e-01, -3.888e-02, -6.902e-02, -6.696e-02, 1.214e-01, -1.368e-01, 6.016e-03, 1.067e-01, 4.747e-02, -1.004e-01, -1.289e-01, 6.043e-02, -2.105e-02, 1.687e-01, 4.420e-02, -8.027e-03)); + r += mul(s2_6, M4(-1.510e-01, -5.490e-02, -1.297e-01, 3.940e-02, -8.791e-03, -1.223e-01, -1.458e-01, 8.238e-02, -1.630e-02, 4.674e-02, 1.099e-01, -6.963e-02, 2.266e-03, 1.970e-02, -4.032e-02, 4.027e-02)); + r += mul(s2_7, M4(3.974e-02, 1.602e-01, 1.467e-02, 4.403e-02, -6.402e-02, -8.992e-02, -1.441e-01, 1.088e-01, 3.071e-03, 1.187e-01, 1.116e-01, 6.374e-02, 1.102e-01, -1.638e-02, -5.427e-02, 6.011e-02)); + r += mul(s2_8, M4(-5.415e-03, 1.614e-02, -4.642e-02, 7.718e-03, -9.478e-02, -3.681e-02, -3.789e-02, 2.388e-02, -9.976e-02, 1.317e-02, 4.867e-03, 5.080e-02, 1.671e-02, -4.394e-02, 1.850e-01, -1.010e-01)); + r += mul(s3_0, M4(4.740e-02, -6.012e-02, -3.478e-02, -1.880e-03, -5.525e-02, -1.306e-01, 3.589e-02, 6.313e-02, 1.849e-01, 1.954e-03, 1.245e-01, 1.461e-02, 7.237e-02, 1.013e-01, -3.245e-02, -3.877e-02)); + r += mul(s3_1, M4(6.860e-02, 7.825e-02, -2.664e-02, -2.195e-02, -3.145e-02, 1.214e-01, 1.442e-01, -2.997e-02, -7.452e-02, 2.469e-01, 5.195e-02, 6.900e-02, 9.190e-03, 3.711e-02, -6.706e-02, 2.437e-02)); + r += mul(s3_2, M4(-1.527e-02, 4.180e-02, -8.521e-02, -3.332e-02, 1.535e-02, -1.797e-02, 4.460e-02, 3.166e-02, 1.183e-02, -6.006e-02, -6.930e-02, -1.633e-02, -1.657e-02, 1.111e-02, -1.051e-02, -2.269e-02)); + r += mul(s3_3, M4(-6.838e-02, 2.394e-02, 1.204e-02, 2.979e-02, 1.136e-03, 5.229e-05, 1.704e-01, 5.685e-02, 8.749e-02, -7.986e-02, -1.910e-01, 3.314e-02, -2.369e-02, 1.071e-02, 4.937e-03, -8.059e-02)); + r += mul(s3_4, M4(-9.546e-02, -9.481e-02, -3.515e-02, 1.106e-01, 1.133e-01, -1.358e-01, -7.766e-02, 2.247e-01, 8.541e-02, -1.843e-01, 2.519e-01, -4.787e-02, -8.646e-02, -5.881e-02, 7.200e-02, 5.031e-02)); + r += mul(s3_5, M4(4.109e-02, 1.957e-02, -4.424e-02, 2.449e-03, 7.263e-02, 7.316e-02, -3.963e-02, 3.027e-02, -2.475e-01, -2.881e-02, 9.413e-02, -9.791e-03, -1.517e-02, 1.484e-01, -2.884e-02, -3.080e-02)); + r += mul(s3_6, M4(-9.201e-02, 8.311e-02, 2.895e-02, 4.046e-03, -3.389e-02, 6.215e-03, 2.693e-01, -5.677e-02, -1.315e-02, 2.071e-01, 1.434e-01, -4.370e-02, 1.987e-02, -1.004e-02, 9.911e-02, 2.902e-02)); + r += mul(s3_7, M4(-1.415e-01, 4.222e-02, -2.972e-02, 1.147e-01, -5.209e-02, -2.712e-02, 6.404e-02, 3.877e-03, 4.556e-02, -3.120e-01, -2.042e-01, 6.441e-02, -7.920e-02, 7.186e-02, 1.415e-02, 3.390e-02)); + r += mul(s3_8, M4(-9.644e-02, 2.409e-02, 1.069e-01, 2.458e-02, -1.209e-01, 4.212e-02, -3.278e-03, 6.059e-04, -1.440e-01, 1.543e-01, -1.242e-03, 6.723e-02, -2.569e-02, -6.542e-02, 2.427e-02, 2.092e-02)); + r += mul(s4_0, M4(3.991e-03, -4.901e-02, -3.711e-02, -1.704e-02, 6.526e-02, 3.046e-02, -4.469e-02, -7.765e-02, 6.067e-02, -1.421e-01, 6.070e-02, 8.194e-02, -2.711e-02, 3.438e-03, 1.344e-02, -2.153e-02)); + r += mul(s4_1, M4(1.991e-02, -4.666e-02, 6.617e-02, 3.197e-03, -9.838e-02, 4.802e-02, -1.296e-01, -7.719e-02, -2.034e-02, 9.824e-02, 1.153e-02, -8.796e-02, -5.803e-02, 2.489e-01, -1.353e-01, -4.269e-02)); + r += mul(s4_2, M4(-3.196e-02, 4.000e-02, 5.576e-02, -1.748e-02, 4.365e-02, -1.031e-01, -2.163e-04, -4.052e-02, -2.934e-02, 3.231e-02, -6.368e-02, -4.976e-02, -1.307e-02, -3.818e-02, -1.569e-01, -3.249e-02)); + r += mul(s4_3, M4(1.348e-02, 1.970e-02, 1.851e-01, 4.361e-02, 1.209e-01, 6.510e-03, -1.089e-01, 4.626e-02, -9.024e-02, -5.603e-02, -9.403e-02, 1.504e-02, -4.843e-02, 2.236e-02, 1.679e-03, -3.139e-02)); + r += mul(s4_4, M4(1.056e-01, -1.621e-01, -2.201e-01, 1.882e-01, 1.910e-01, -1.139e-01, 2.343e-03, 3.804e-02, 4.681e-02, -2.508e-01, -8.845e-02, -1.726e-01, -1.087e-01, 8.428e-02, 3.052e-01, 1.148e-01)); + r += mul(s4_5, M4(7.644e-02, -3.893e-03, -8.044e-02, -1.695e-03, 6.434e-02, -6.097e-02, 3.127e-02, 3.009e-02, 6.361e-02, 1.526e-02, 6.214e-02, 1.346e-02, -2.310e-01, 2.733e-03, 1.991e-01, -1.005e-01)); + r += mul(s4_6, M4(3.758e-03, 1.069e-01, 6.274e-02, 3.918e-02, -3.376e-02, -4.262e-02, 1.166e-02, -5.441e-02, 1.276e-02, 5.302e-02, 4.024e-02, 4.031e-02, 2.924e-02, -1.500e-02, 1.072e-01, 9.864e-03)); + r += mul(s4_7, M4(4.560e-02, 3.091e-03, 8.830e-02, 2.415e-02, 7.097e-02, 4.856e-02, 1.249e-02, 3.016e-02, -4.067e-02, 5.510e-02, -5.353e-02, 4.705e-02, 6.581e-02, -1.605e-01, -2.567e-02, 1.360e-01)); + r += mul(s4_8, M4(-1.925e-02, 8.326e-02, 1.014e-01, 2.056e-02, -8.488e-03, -2.376e-02, -9.331e-02, -2.036e-02, -6.477e-02, -9.741e-02, 3.254e-02, 2.406e-02, 1.069e-01, -2.900e-02, -2.892e-02, 8.558e-03)); + r += mul(s5_0, M4(2.073e-02, 2.304e-02, 1.707e-02, -2.880e-02, 1.728e-01, 4.448e-02, 1.766e-02, 5.097e-02, 4.626e-02, 2.093e-03, 3.893e-02, 1.900e-02, 4.488e-03, -6.663e-02, -5.151e-02, 2.597e-02)); + r += mul(s5_1, M4(6.632e-03, 6.420e-02, -5.954e-02, -1.401e-02, -1.762e-01, 1.516e-02, -1.572e-01, 2.048e-03, -7.453e-02, 1.642e-01, -5.123e-02, -4.086e-03, 1.272e-01, 9.005e-02, -3.063e-02, 7.717e-02)); + r += mul(s5_2, M4(8.182e-02, -5.984e-02, 2.433e-02, -4.260e-02, 1.285e-01, 6.395e-02, -1.258e-01, -1.890e-02, -3.552e-02, -1.902e-01, 4.936e-02, -1.089e-02, 1.330e-02, -1.291e-02, 7.128e-02, 2.062e-02)); + r += mul(s5_3, M4(-1.814e-01, 7.015e-02, 1.626e-01, 1.078e-01, 3.475e-02, 1.650e-01, -2.960e-02, -2.535e-02, -1.735e-01, -1.667e-02, 1.841e-01, 2.134e-02, 2.445e-02, -1.719e-02, -2.750e-02, 3.184e-02)); + r += mul(s5_4, M4(-1.157e-01, 8.743e-02, -1.785e-01, 1.966e-01, 1.679e-01, -1.695e-01, 1.127e-01, -9.157e-03, 1.483e-01, -1.440e-01, 1.475e-01, -1.654e-01, 1.709e-01, -4.515e-02, 9.961e-02, -3.409e-02)); + r += mul(s5_5, M4(-5.665e-02, -6.123e-02, 2.767e-02, -2.876e-02, 3.362e-02, 2.646e-02, 2.164e-01, -1.702e-02, 2.073e-02, 3.452e-03, 1.165e-01, 1.009e-02, -7.879e-02, 7.307e-02, 7.719e-02, -1.188e-01)); + r += mul(s5_6, M4(1.073e-01, -5.339e-02, -1.523e-01, -4.295e-02, -5.219e-02, -5.274e-04, 9.527e-02, -3.133e-02, -8.614e-03, -1.059e-01, 9.820e-02, 1.012e-02, 2.436e-02, 9.228e-02, 8.783e-02, -5.642e-02)); + r += mul(s5_7, M4(2.379e-01, -1.225e-01, 9.882e-03, 9.354e-02, -1.101e-01, 1.232e-01, 3.131e-02, -2.203e-02, 3.696e-02, -3.172e-02, 1.365e-01, 7.894e-02, 4.409e-02, -1.210e-01, -9.969e-02, -1.792e-02)); + r += mul(s5_8, M4(1.454e-01, 2.593e-02, 1.723e-01, -5.088e-02, -1.571e-02, 5.285e-02, -1.257e-01, -3.311e-02, -5.324e-02, 6.856e-02, 7.979e-02, -1.566e-02, 7.197e-02, 3.892e-02, -2.399e-02, -5.203e-02)); + r += mul(s6_0, M4(-7.839e-02, 1.398e-03, -7.348e-02, -6.479e-02, -5.027e-02, 1.044e-01, -1.014e-02, 3.825e-02, 1.008e-01, 7.028e-02, 2.653e-02, 2.244e-02, -4.615e-02, -4.465e-02, 1.302e-01, -5.276e-03)); + r += mul(s6_1, M4(1.690e-01, 2.425e-01, -1.174e-01, 9.586e-03, -7.434e-02, -7.413e-02, -1.179e-01, -6.104e-02, -5.331e-02, -1.369e-02, 5.085e-03, 2.225e-02, -1.559e-01, -5.708e-02, -1.527e-02, -5.978e-02)); + r += mul(s6_2, M4(6.324e-02, -6.753e-02, -1.233e-01, 8.027e-03, -3.293e-02, -1.514e-01, 1.218e-02, -2.946e-02, 1.302e-01, -1.332e-02, -1.594e-02, -8.539e-02, -2.705e-01, -4.581e-02, 1.323e-01, 2.371e-01)); + r += mul(s6_3, M4(-1.933e-01, 6.691e-02, -2.664e-01, 1.988e-03, -8.715e-02, -5.864e-02, -1.366e-02, -5.674e-02, -2.230e-02, 4.250e-02, 4.865e-02, 4.707e-02, 3.169e-02, -5.539e-02, -1.776e-02, -9.227e-02)); + r += mul(s6_4, M4(-1.037e-01, 1.628e-01, -1.394e-01, -7.656e-02, 7.386e-03, 1.390e-02, 1.271e-02, 2.873e-02, -2.167e-02, 1.093e-01, 2.433e-01, -2.497e-01, 7.878e-02, -2.173e-01, -3.023e-01, -3.329e-01)); + r += mul(s6_5, M4(-6.338e-02, 3.530e-03, 3.445e-03, 4.110e-02, -2.004e-02, 6.223e-03, 1.371e-01, -2.474e-02, 1.499e-01, 1.088e-01, 4.740e-02, -1.042e-01, 2.863e-01, -1.401e-01, 1.633e-02, -8.017e-02)); + r += mul(s6_6, M4(-3.823e-02, 1.272e-01, -1.866e-03, 7.398e-02, 3.718e-02, -4.374e-02, 6.790e-02, -6.153e-03, -6.573e-02, -1.742e-01, -1.284e-03, -3.181e-02, -8.365e-02, -4.302e-02, -9.620e-03, -4.319e-02)); + r += mul(s6_7, M4(2.086e-01, -2.530e-01, -3.056e-01, -1.304e-01, -2.967e-02, 7.706e-02, 1.326e-01, -3.692e-02, 1.018e-01, -2.921e-02, 6.086e-02, 1.081e-01, -2.208e-02, 1.080e-01, 2.565e-01, -1.048e-02)); + r += mul(s6_8, M4(1.168e-01, -1.340e-02, -1.155e-01, 1.552e-03, -9.284e-03, -7.575e-03, -9.098e-02, 7.785e-03, 1.121e-01, -2.761e-02, 5.135e-02, -1.342e-01, -4.632e-02, 3.247e-02, 6.640e-02, -1.430e-01)); + r += mul(s7_0, M4(-5.174e-02, -3.802e-02, 2.501e-02, 3.943e-02, -8.928e-02, -4.067e-03, 1.307e-01, -5.172e-02, -7.696e-03, -5.941e-02, 1.575e-01, 6.193e-02, 3.222e-02, 1.874e-02, 4.168e-02, 5.419e-02)); + r += mul(s7_1, M4(5.314e-02, -2.911e-02, 6.485e-02, -5.315e-02, -1.255e-01, -1.392e-03, 1.852e-02, -6.462e-02, -1.095e-01, 5.401e-02, -4.038e-02, 1.017e-01, 2.572e-02, -8.017e-02, -3.257e-02, 3.747e-02)); + r += mul(s7_2, M4(-1.978e-02, -1.773e-03, -1.841e-02, 9.889e-03, 3.958e-02, -4.974e-03, 6.257e-02, 9.362e-02, -2.719e-02, -1.428e-02, 1.190e-02, -5.830e-02, -7.803e-02, -1.117e-01, 1.294e-01, 2.755e-02)); + r += mul(s7_3, M4(-1.558e-01, 1.600e-01, -1.352e-01, 3.225e-02, 6.283e-02, 3.267e-02, -1.065e-01, -4.893e-02, -7.680e-02, -1.147e-02, 2.283e-02, 9.253e-02, -1.045e-02, 7.882e-03, -3.457e-02, -6.666e-03)); + r += mul(s7_4, M4(3.745e-02, -1.399e-03, -2.196e-01, -5.805e-02, -5.250e-02, -2.187e-03, -6.491e-02, 1.274e-01, 5.554e-02, 4.309e-02, -8.571e-02, -1.076e-01, -1.224e-02, 2.910e-03, -1.020e-01, -1.131e-01)); + r += mul(s7_5, M4(6.560e-02, -1.500e-01, -7.759e-02, 2.132e-02, -1.682e-02, -4.589e-02, 1.357e-01, -5.383e-02, -4.839e-02, -7.040e-02, -1.398e-01, 3.404e-02, 3.647e-02, 9.801e-02, -1.931e-02, 2.339e-02)); + r += mul(s7_6, M4(-3.344e-02, -1.224e-01, 6.334e-02, -4.529e-02, 5.797e-03, 8.809e-02, 5.366e-02, -7.795e-03, -3.646e-02, -5.899e-03, -1.115e-01, -3.916e-02, -1.248e-02, 9.711e-03, -3.724e-02, 1.345e-02)); + r += mul(s7_7, M4(6.573e-02, -9.046e-02, 1.977e-01, -5.902e-02, 1.941e-02, -9.373e-02, -7.441e-02, -2.884e-02, -8.218e-02, -8.859e-02, -1.948e-01, 9.318e-02, -8.750e-03, 6.997e-02, 1.364e-01, -1.964e-02)); + r += mul(s7_8, M4(2.416e-02, -2.571e-02, 1.039e-01, -3.071e-02, 3.977e-02, -7.836e-02, -6.999e-02, 1.225e-02, -3.535e-02, 4.576e-02, -3.866e-02, 8.169e-02, 2.912e-03, 9.796e-02, -9.763e-02, -3.325e-02)); + r += V4(3.286e-03, -1.519e-02, -1.301e-02, 8.360e-03); + return r; +} + +V4 f1(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-5.735e-02, 1.257e-01, 3.693e-02, 4.120e-02, -4.737e-03, -2.852e-02, -1.082e-01, 4.594e-02, 2.843e-01, -4.893e-02, 9.070e-02, -1.192e-01, -6.449e-02, -3.347e-02, 1.391e-03, 5.724e-03)); + r += mul(s0_1, M4(1.055e-01, 7.005e-02, -2.144e-01, -6.068e-02, -2.865e-02, -2.763e-02, 7.198e-02, 8.962e-02, 3.127e-02, -4.890e-02, -5.165e-02, 7.375e-03, 3.223e-02, -3.471e-03, 1.291e-02, 3.367e-02)); + r += mul(s0_2, M4(-5.957e-02, 5.653e-02, -3.870e-03, 3.876e-02, 6.014e-02, -1.175e-01, -4.020e-02, 7.707e-03, 6.639e-02, 5.481e-02, -7.995e-03, -2.986e-02, 6.320e-02, 8.378e-02, 2.165e-02, 8.805e-04)); + r += mul(s0_3, M4(8.128e-02, 7.841e-03, 4.775e-02, -9.427e-03, -2.025e-01, 3.781e-02, -1.438e-02, 1.348e-01, 7.946e-02, -7.094e-02, 2.525e-01, 8.006e-02, -4.424e-02, 1.466e-01, -5.797e-02, 2.469e-02)); + r += mul(s0_4, M4(1.546e-02, 3.020e-01, -7.200e-03, 1.162e-01, -1.535e-01, -1.677e-01, -1.889e-02, -7.218e-02, 1.884e-02, 1.402e-01, 1.545e-01, -1.332e-01, -3.194e-01, -2.470e-01, -2.017e-01, -1.419e-01)); + r += mul(s0_5, M4(-5.847e-02, -3.240e-02, 1.593e-01, 5.361e-02, 4.448e-02, -2.931e-02, -1.197e-01, 3.625e-02, 4.968e-02, 6.573e-02, 3.133e-02, 2.704e-02, -4.164e-02, 3.470e-02, 1.581e-03, 5.542e-02)); + r += mul(s0_6, M4(-5.268e-02, -5.200e-02, -1.156e-01, -2.042e-03, -3.021e-02, 5.858e-02, -8.935e-02, -7.148e-02, 1.408e-01, 1.224e-02, -3.358e-04, 7.851e-02, -4.945e-02, -7.446e-02, -1.190e-01, -2.825e-02)); + r += mul(s0_7, M4(1.893e-02, -1.762e-02, 4.501e-02, -9.682e-02, -1.633e-02, -4.567e-02, -4.076e-02, 3.502e-02, 1.411e-01, 1.478e-02, 2.074e-01, -1.008e-01, -6.023e-02, -2.280e-01, 1.658e-01, 9.096e-03)); + r += mul(s0_8, M4(2.054e-02, -3.343e-02, 5.537e-02, 3.073e-02, -4.820e-03, -4.301e-02, -5.973e-02, 5.608e-02, 2.994e-03, 3.080e-02, 4.691e-02, -7.288e-02, 5.702e-03, -1.103e-01, -1.659e-02, 1.058e-02)); + r += mul(s1_0, M4(1.202e-01, 9.633e-02, 1.875e-02, 6.053e-02, -7.085e-02, 2.520e-02, -3.057e-02, -2.569e-01, 2.196e-02, -1.229e-03, -4.392e-02, 5.924e-02, -7.505e-02, 8.129e-02, 2.044e-02, -2.790e-02)); + r += mul(s1_1, M4(2.244e-01, 9.546e-02, -1.172e-01, -1.139e-01, 3.678e-02, 7.077e-03, -4.363e-02, -4.238e-02, 7.629e-02, 1.122e-02, 1.186e-02, 4.842e-02, 1.057e-02, 9.070e-02, -7.385e-02, 9.828e-02)); + r += mul(s1_2, M4(1.885e-02, 5.890e-02, -9.566e-02, 7.835e-02, 6.631e-02, 1.552e-02, 1.447e-01, 3.533e-02, 9.990e-03, -1.430e-02, -1.986e-02, 2.274e-02, 4.836e-04, 8.606e-02, 9.545e-02, -3.450e-02)); + r += mul(s1_3, M4(4.787e-02, 5.541e-02, -3.048e-03, -3.691e-02, 7.478e-03, 1.421e-01, -8.807e-02, 1.014e-01, 1.648e-01, -5.264e-02, -9.696e-02, 2.583e-02, 7.668e-02, 2.025e-02, 3.494e-03, -1.676e-02)); + r += mul(s1_4, M4(1.184e-01, 4.471e-01, 5.125e-02, 2.426e-01, 8.767e-02, -6.652e-02, -2.313e-01, -2.243e-01, 3.143e-02, -1.016e-01, -1.747e-01, 1.479e-01, -9.054e-02, -3.289e-01, 2.006e-01, -9.388e-02)); + r += mul(s1_5, M4(-7.381e-02, 8.401e-02, 1.774e-01, -1.027e-01, -1.572e-01, -4.468e-02, 1.375e-01, 1.592e-01, -6.240e-02, -1.650e-02, 6.481e-02, 7.350e-02, -7.457e-02, -4.640e-02, -4.966e-02, 8.236e-02)); + r += mul(s1_6, M4(-5.735e-02, -3.059e-03, -8.445e-02, 4.472e-02, 1.572e-01, 4.602e-02, -1.526e-01, -1.439e-01, 9.462e-03, -5.136e-02, -4.954e-02, 9.235e-02, 4.871e-02, -5.367e-02, -1.627e-01, -2.489e-02)); + r += mul(s1_7, M4(-3.190e-02, 8.901e-03, -1.846e-02, -7.125e-02, 9.040e-02, -6.736e-03, -1.474e-01, 5.559e-02, 3.965e-02, -5.109e-02, 4.272e-02, 1.816e-02, -3.802e-02, -9.892e-02, 8.593e-02, 6.199e-02)); + r += mul(s1_8, M4(-1.994e-02, -1.086e-01, 1.812e-02, 6.639e-02, 1.711e-02, -3.822e-02, 1.984e-01, 6.729e-02, 1.585e-02, -6.321e-02, 1.131e-01, 1.278e-02, 6.772e-02, -4.626e-02, 5.356e-02, -3.447e-02)); + r += mul(s2_0, M4(-8.687e-02, -1.183e-01, -2.584e-02, -9.472e-02, 3.558e-02, 6.771e-02, -1.168e-01, -3.359e-03, -2.214e-02, -5.336e-02, -6.827e-02, -2.053e-02, 2.150e-01, -1.302e-01, 7.260e-03, -2.987e-02)); + r += mul(s2_1, M4(7.261e-03, 1.602e-02, 1.279e-01, -6.558e-02, 3.888e-02, 1.409e-01, 2.357e-02, -1.282e-01, -5.214e-02, 9.965e-02, 1.664e-01, -4.437e-02, 1.500e-01, 1.286e-02, 2.166e-03, -8.977e-02)); + r += mul(s2_2, M4(-7.545e-02, -1.094e-02, -2.077e-01, -6.931e-02, -3.558e-02, -8.829e-03, 8.852e-02, -6.157e-02, 4.585e-02, -1.417e-02, -7.058e-03, -9.259e-02, -2.151e-02, -8.374e-02, 5.304e-02, 7.869e-03)); + r += mul(s2_3, M4(-7.447e-02, -2.303e-03, -9.744e-02, -1.738e-01, 1.803e-01, 1.162e-01, 1.207e-01, -2.709e-01, -8.762e-03, 3.008e-02, -1.453e-01, -2.326e-02, -1.915e-01, -2.543e-02, 1.697e-02, 4.576e-02)); + r += mul(s2_4, M4(-9.671e-04, -2.203e-02, 1.922e-01, 2.322e-01, 4.921e-04, -1.192e-01, 1.833e-01, -2.379e-01, -6.566e-03, 7.472e-02, 1.633e-01, 3.039e-02, -7.424e-02, -6.433e-02, 5.091e-01, -1.973e-01)); + r += mul(s2_5, M4(6.253e-02, 2.878e-02, -6.217e-02, -7.024e-02, -1.695e-02, 5.659e-02, 1.182e-01, -1.998e-02, -4.351e-02, 3.363e-02, 1.152e-01, -2.473e-02, 1.603e-01, -1.438e-01, -2.102e-01, 6.272e-02)); + r += mul(s2_6, M4(-2.256e-01, 4.487e-02, -3.573e-01, 1.982e-02, 5.248e-03, 4.702e-02, -2.416e-03, 4.224e-02, 1.336e-02, -2.063e-02, 6.145e-02, -4.382e-02, -3.535e-02, -8.743e-03, 2.422e-01, 1.258e-02)); + r += mul(s2_7, M4(-5.776e-03, 2.321e-02, 1.058e-02, 2.529e-02, 4.207e-02, 8.916e-02, 1.648e-01, -1.728e-01, 7.123e-02, 8.087e-02, -6.373e-02, 2.193e-02, 6.426e-03, 4.454e-02, 1.290e-01, -1.136e-02)); + r += mul(s2_8, M4(2.321e-02, 4.309e-02, -1.516e-01, -1.444e-02, 4.668e-02, 3.631e-02, 1.015e-01, 3.489e-02, 4.619e-02, 2.500e-02, 3.346e-02, 1.279e-01, 4.694e-02, 1.132e-02, 2.681e-02, -5.030e-02)); + r += mul(s3_0, M4(-5.515e-02, -2.673e-02, -6.880e-02, 5.894e-03, -1.158e-01, 4.061e-02, -6.222e-02, 3.967e-02, -1.514e-01, -7.631e-02, -6.716e-03, 7.126e-02, 1.299e-02, -4.424e-03, 1.829e-02, 4.004e-02)); + r += mul(s3_1, M4(2.444e-03, -8.791e-02, 5.420e-02, 9.974e-02, 4.461e-02, 3.342e-03, 9.464e-02, 3.879e-02, -1.713e-01, -5.235e-02, 2.785e-02, 1.584e-01, -3.401e-02, 3.073e-02, -1.091e-01, -1.046e-02)); + r += mul(s3_2, M4(7.487e-03, -4.916e-02, -3.904e-02, 5.671e-02, 3.968e-02, -9.121e-03, 3.282e-03, -8.274e-02, -5.194e-02, -4.783e-02, 6.700e-02, -1.059e-01, 1.419e-02, -4.054e-02, -3.414e-02, 6.595e-02)); + r += mul(s3_3, M4(9.336e-02, 7.634e-02, -6.694e-02, 6.250e-02, -1.083e-02, -2.088e-02, 1.763e-01, 1.998e-01, 1.261e-02, 6.359e-02, -5.634e-02, 1.232e-01, 4.095e-02, -8.641e-02, -1.667e-02, -1.219e-01)); + r += mul(s3_4, M4(-1.574e-02, -4.739e-02, 1.616e-01, 6.044e-02, -3.058e-01, -7.430e-02, 2.627e-01, -1.224e-01, -1.501e-01, -2.186e-01, 5.963e-02, -8.538e-03, -7.729e-02, 7.135e-02, 1.614e-01, -4.085e-02)); + r += mul(s3_5, M4(7.641e-02, -1.052e-02, 4.771e-02, 8.236e-02, 4.211e-02, 7.796e-02, -5.710e-02, -3.686e-02, 1.179e-01, 1.063e-02, -1.615e-01, 2.818e-02, 6.312e-02, -5.913e-02, -2.742e-03, 6.620e-02)); + r += mul(s3_6, M4(6.190e-03, 7.873e-02, -1.249e-03, -7.502e-02, 8.608e-02, -1.502e-04, 7.447e-02, 1.288e-01, 2.167e-02, -1.348e-02, 3.409e-02, 3.650e-02, -3.395e-02, -2.510e-02, -3.911e-03, -3.501e-02)); + r += mul(s3_7, M4(3.712e-02, 1.711e-02, -3.699e-02, 2.076e-03, 5.682e-02, -3.576e-02, 1.728e-01, -2.616e-02, -8.619e-02, -3.032e-02, -8.233e-02, 8.712e-02, 5.074e-02, 3.775e-02, 2.481e-02, 1.785e-03)); + r += mul(s3_8, M4(-2.020e-02, 4.481e-02, -9.187e-02, 1.451e-01, 4.523e-02, 3.138e-02, -8.141e-02, 4.834e-02, 9.495e-02, 1.097e-02, -1.188e-01, 6.575e-02, -8.121e-02, -3.479e-02, 4.346e-02, 1.156e-01)); + r += mul(s4_0, M4(3.827e-02, 2.264e-02, 7.146e-03, 9.552e-03, -3.035e-02, -6.616e-02, 2.747e-02, 3.169e-02, -2.774e-02, 5.990e-02, 2.920e-02, 4.000e-02, -2.525e-02, 7.427e-02, 8.153e-02, -6.004e-02)); + r += mul(s4_1, M4(5.245e-02, -3.401e-02, 1.269e-02, 4.907e-02, -1.172e-02, 1.009e-01, -2.521e-02, -5.679e-02, 1.087e-01, -1.719e-03, -8.819e-02, 8.292e-03, 1.534e-01, 5.315e-02, 9.320e-03, -2.679e-02)); + r += mul(s4_2, M4(5.869e-02, 2.417e-02, 4.672e-03, 4.663e-02, -5.904e-02, 2.896e-03, -3.050e-02, -5.937e-02, 3.153e-02, -1.233e-02, 1.412e-02, 2.997e-02, 1.389e-01, 1.124e-01, -9.287e-02, -6.713e-02)); + r += mul(s4_3, M4(7.970e-03, 3.703e-02, -5.000e-02, 1.005e-01, -1.264e-02, 2.367e-02, 1.433e-02, -9.336e-02, -5.631e-02, 8.289e-03, -8.105e-02, 8.863e-02, -4.582e-02, -2.060e-02, 6.368e-02, 1.711e-01)); + r += mul(s4_4, M4(-2.150e-01, -3.557e-02, 5.991e-02, 7.201e-02, 1.718e-02, 4.575e-02, -1.644e-01, -1.481e-01, -8.840e-02, -4.702e-02, -1.691e-02, -1.494e-01, -4.138e-02, 1.532e-01, -8.112e-02, 1.186e-01)); + r += mul(s4_5, M4(1.845e-02, 1.165e-01, 3.826e-02, -2.388e-02, 1.116e-02, -4.152e-03, 9.363e-02, -1.166e-01, -1.029e-01, -1.316e-02, -2.975e-02, 1.340e-01, 4.297e-02, 1.181e-01, -1.261e-01, 1.395e-01)); + r += mul(s4_6, M4(6.679e-02, 5.499e-02, 2.737e-02, -3.309e-02, 1.534e-02, -3.395e-02, -6.059e-02, -3.089e-03, -1.570e-01, 5.654e-02, 1.502e-01, 9.533e-02, 1.103e-02, 1.742e-01, 3.309e-02, -1.453e-01)); + r += mul(s4_7, M4(5.906e-02, -5.997e-02, 1.131e-01, 4.987e-02, -2.817e-02, 2.907e-02, 1.089e-01, -1.133e-01, 7.584e-02, 2.061e-03, -1.358e-01, 5.933e-02, -5.213e-02, 2.508e-01, -2.433e-01, 6.354e-03)); + r += mul(s4_8, M4(-3.449e-02, 4.329e-02, -1.792e-02, 6.017e-02, -2.674e-02, 5.704e-02, -5.931e-02, 2.076e-02, -1.127e-02, -1.353e-02, 1.180e-01, 3.554e-02, -2.870e-02, 2.164e-01, -2.961e-02, 3.005e-02)); + r += mul(s5_0, M4(6.372e-02, 1.479e-01, -1.483e-02, -1.061e-02, 1.339e-01, -2.423e-02, 1.041e-02, 5.357e-02, -6.657e-02, 7.154e-03, 4.060e-02, 2.593e-02, -1.669e-02, 6.874e-03, -7.642e-02, -5.352e-03)); + r += mul(s5_1, M4(4.709e-02, 8.202e-02, -1.159e-01, 6.583e-02, -4.216e-02, 2.613e-01, 2.803e-02, 2.027e-02, 4.155e-02, 4.476e-02, -1.150e-01, -6.574e-02, -1.126e-01, -2.907e-02, 1.587e-01, 1.212e-02)); + r += mul(s5_2, M4(5.277e-02, 3.775e-02, 6.608e-03, 1.704e-02, 1.979e-02, 9.919e-02, -6.536e-02, 7.964e-03, -1.121e-01, 3.265e-02, 9.050e-02, 2.277e-02, 3.423e-02, 1.819e-02, 5.676e-02, -6.024e-02)); + r += mul(s5_3, M4(4.058e-02, -8.537e-02, 3.050e-02, 5.222e-02, 1.932e-02, -4.383e-02, 1.210e-02, 8.182e-02, 7.846e-02, -1.675e-02, -1.672e-02, 8.299e-02, -1.128e-01, -2.596e-02, -5.494e-02, 6.638e-02)); + r += mul(s5_4, M4(-5.082e-02, -2.212e-01, 2.288e-01, -1.747e-01, 1.390e-01, 6.747e-02, -9.713e-02, 1.997e-01, -1.472e-01, -1.280e-01, 3.035e-01, 2.744e-02, -1.600e-02, -2.677e-03, -9.433e-02, 8.948e-03)); + r += mul(s5_5, M4(1.866e-02, -1.780e-02, 3.817e-02, 4.707e-02, 3.935e-02, -4.192e-02, -8.523e-02, 1.779e-02, -8.066e-03, -5.122e-03, -9.794e-02, -4.393e-02, 1.824e-02, -3.186e-02, -8.565e-02, 6.290e-02)); + r += mul(s5_6, M4(-7.068e-02, 1.291e-02, 5.946e-02, -7.038e-02, -2.054e-02, -1.145e-02, 8.059e-02, 8.572e-02, -1.750e-02, 5.672e-02, 5.180e-02, -1.358e-03, 2.490e-02, 2.271e-02, 1.013e-01, -6.520e-02)); + r += mul(s5_7, M4(5.704e-02, 2.386e-02, 4.944e-02, -1.178e-01, 6.066e-02, -2.115e-02, 1.655e-01, 3.649e-03, 3.235e-04, 8.419e-02, 4.089e-02, -4.977e-02, -2.662e-02, 5.714e-02, 9.378e-03, 3.368e-02)); + r += mul(s5_8, M4(6.667e-02, -9.522e-03, 8.112e-02, -2.254e-02, -2.724e-02, -2.765e-02, -4.131e-02, 7.624e-03, 1.797e-02, 1.440e-01, -1.185e-01, 6.992e-02, 4.543e-02, 3.386e-02, -7.079e-03, -6.702e-02)); + r += mul(s6_0, M4(-1.054e-01, 2.923e-02, -5.852e-02, 1.290e-02, 4.864e-02, -8.424e-02, -5.442e-02, 6.261e-02, 5.102e-03, -1.792e-02, 4.114e-02, 1.532e-02, 8.135e-02, 2.076e-02, -3.238e-02, 5.559e-02)); + r += mul(s6_1, M4(1.189e-01, 2.617e-02, -7.202e-02, 1.978e-02, -1.336e-01, -5.021e-02, -2.016e-01, -5.546e-02, 4.317e-02, 7.192e-02, 3.775e-02, -6.866e-02, 1.697e-01, -5.667e-02, -4.493e-02, -9.397e-04)); + r += mul(s6_2, M4(-4.501e-02, 3.993e-03, -1.623e-02, 1.275e-02, 1.896e-02, -5.788e-02, -1.222e-02, -1.621e-02, -1.356e-02, -1.976e-02, -4.456e-02, 7.327e-02, -1.872e-02, -6.481e-02, 1.280e-02, -1.286e-01)); + r += mul(s6_3, M4(8.819e-02, -1.474e-02, -2.213e-01, -8.129e-02, -1.848e-02, 1.854e-02, -1.397e-01, 1.339e-01, -8.792e-02, -7.492e-02, -7.482e-03, -8.757e-02, -4.168e-02, -3.177e-03, -1.849e-01, 1.436e-02)); + r += mul(s6_4, M4(3.007e-02, -1.321e-01, 1.018e-01, -1.113e-01, -3.374e-01, 4.874e-02, 6.056e-02, 1.621e-01, 4.237e-03, -5.609e-02, 1.296e-01, 1.055e-01, -5.726e-02, 1.107e-01, 1.367e-01, 1.294e-01)); + r += mul(s6_5, M4(-1.999e-02, -9.000e-02, -6.576e-02, 1.829e-01, 2.109e-02, 5.075e-02, -2.304e-01, -3.625e-02, -4.882e-02, -1.409e-01, -1.035e-01, -6.867e-02, -2.310e-01, -5.908e-02, -2.994e-02, -2.707e-01)); + r += mul(s6_6, M4(-5.752e-02, -9.524e-02, -3.031e-02, -8.189e-03, -5.906e-02, -7.163e-02, 2.148e-02, 4.192e-04, -5.478e-02, -6.803e-02, -1.579e-01, 1.057e-01, 2.721e-02, -3.405e-02, -1.079e-01, -3.397e-02)); + r += mul(s6_7, M4(-9.961e-02, -3.182e-02, 4.586e-02, 2.162e-01, -4.933e-02, -1.123e-01, -1.063e-02, 4.250e-02, -1.083e-02, -6.599e-03, -1.339e-01, 1.093e-01, 1.649e-02, -2.208e-02, 1.595e-01, 2.718e-02)); + r += mul(s6_8, M4(-9.260e-02, -1.435e-01, 1.030e-01, 7.697e-02, -3.604e-02, 7.147e-02, -1.276e-01, 4.137e-02, 2.784e-02, -5.604e-02, -1.362e-02, 1.004e-03, -1.676e-02, -1.384e-01, -5.295e-02, -2.122e-01)); + r += mul(s7_0, M4(5.497e-02, -9.898e-03, -2.150e-02, 5.152e-03, 4.710e-02, -6.431e-02, 1.308e-02, -4.425e-02, 7.768e-03, 1.612e-02, -2.056e-02, 6.943e-02, 7.137e-02, -6.442e-02, 1.614e-02, 2.894e-03)); + r += mul(s7_1, M4(1.227e-01, 2.263e-02, 3.122e-02, -1.013e-01, -2.262e-02, -2.887e-02, -5.720e-02, -2.523e-02, -2.395e-02, 6.261e-02, 3.878e-03, 5.648e-02, 7.266e-02, -7.858e-02, 1.894e-02, -2.674e-02)); + r += mul(s7_2, M4(4.163e-02, 3.618e-02, -9.989e-02, 7.308e-02, -5.009e-03, -6.773e-03, 9.681e-02, -7.296e-03, 1.109e-01, 1.139e-02, 8.472e-02, -5.203e-02, 7.700e-02, -6.769e-02, 1.018e-01, -7.520e-02)); + r += mul(s7_3, M4(2.117e-02, -9.146e-02, -2.653e-02, 1.424e-02, -1.321e-01, 1.180e-01, -1.278e-01, 2.311e-02, -2.951e-02, 6.426e-02, 1.884e-01, -5.583e-02, 1.722e-02, -8.840e-03, -7.276e-02, 2.877e-02)); + r += mul(s7_4, M4(-1.094e-02, 7.987e-02, -6.903e-02, -4.263e-02, 1.432e-01, 6.285e-02, -8.872e-02, 3.220e-02, 8.790e-02, 4.975e-02, -1.061e-01, 1.059e-01, -2.514e-02, 3.016e-02, 4.896e-02, 1.158e-01)); + r += mul(s7_5, M4(-7.765e-02, 5.886e-02, 8.983e-02, 1.892e-02, 7.227e-02, -3.175e-02, 1.829e-02, 9.907e-02, -2.059e-02, 2.523e-02, 2.763e-02, -7.163e-02, -2.238e-02, -1.832e-02, -4.848e-02, -5.891e-02)); + r += mul(s7_6, M4(-9.411e-02, -1.666e-02, -1.545e-03, 2.425e-03, -3.430e-02, -7.519e-02, 5.942e-03, 2.857e-02, 1.001e-01, 5.960e-02, 1.215e-01, 1.813e-02, -4.309e-02, 4.279e-03, -8.778e-03, 5.906e-02)); + r += mul(s7_7, M4(-1.747e-02, 6.884e-03, 1.019e-01, 5.877e-02, -3.948e-02, -6.012e-02, -1.121e-01, 1.085e-01, 4.042e-02, 1.534e-02, 1.680e-02, -3.873e-02, -3.553e-02, -1.062e-02, 6.044e-02, -6.507e-02)); + r += mul(s7_8, M4(-7.981e-04, 5.306e-02, -2.019e-02, -4.539e-02, -8.438e-02, -2.326e-02, 2.243e-01, -2.713e-02, -2.316e-02, -4.965e-02, 1.727e-01, -6.824e-02, 3.320e-02, 2.942e-02, -4.822e-02, -8.593e-02)); + r += V4(-6.209e-03, -2.322e-02, -6.479e-03, 3.211e-03); + return r; +} + +V4 f2(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-3.049e-02, 6.111e-02, -1.028e-01, -5.236e-02, 7.108e-02, -3.843e-02, 8.589e-02, 6.198e-02, 2.803e-01, -7.897e-02, 3.982e-02, 1.940e-01, -7.968e-02, 1.248e-02, -6.840e-02, -8.779e-02)); + r += mul(s0_1, M4(-4.217e-02, 7.107e-03, -1.340e-02, -1.964e-03, 7.188e-02, 2.237e-02, 1.352e-01, 4.602e-02, 1.348e-01, -8.037e-02, 1.357e-02, 3.992e-02, 4.499e-02, -5.245e-02, -8.448e-02, -7.756e-02)); + r += mul(s0_2, M4(-6.389e-02, 1.225e-02, -7.624e-02, -2.441e-02, -3.044e-02, 1.794e-03, -8.328e-03, 6.038e-03, -1.468e-02, -3.933e-02, -1.075e-01, 1.055e-01, -2.344e-02, 1.867e-02, 7.679e-02, 4.558e-02)); + r += mul(s0_3, M4(6.966e-03, 1.902e-01, 4.513e-02, 3.581e-02, -5.264e-02, 7.647e-02, 4.587e-02, -1.090e-02, 7.197e-02, -2.279e-01, -1.849e-01, -1.908e-01, -1.105e-01, 1.526e-01, -3.105e-02, -5.915e-02)); + r += mul(s0_4, M4(8.242e-02, -2.377e-02, -2.679e-03, -9.327e-02, 1.464e-01, -4.084e-02, -6.155e-02, -7.298e-02, -4.436e-02, -1.357e-01, 2.946e-03, -9.301e-02, -3.393e-02, -2.176e-02, 6.742e-02, 1.500e-01)); + r += mul(s0_5, M4(8.052e-03, 9.869e-02, 7.559e-02, 3.931e-02, -7.694e-02, 1.427e-02, 1.037e-01, 5.893e-03, -8.789e-02, -4.602e-02, -2.800e-02, 5.525e-02, -2.218e-01, -2.230e-02, 5.218e-02, -3.408e-02)); + r += mul(s0_6, M4(3.175e-03, 1.260e-02, 6.000e-03, -5.241e-02, -2.239e-03, -1.598e-02, 7.361e-02, 2.156e-02, -3.416e-02, -9.550e-02, -2.809e-02, -1.343e-01, 1.769e-02, -1.639e-02, -9.413e-02, -9.222e-02)); + r += mul(s0_7, M4(-1.767e-02, -8.772e-02, -2.203e-02, 2.698e-02, -3.413e-02, 4.100e-02, -1.129e-02, 8.770e-02, 1.864e-03, 5.817e-02, -3.644e-02, 7.676e-02, -1.540e-01, 1.908e-01, -6.473e-03, 7.013e-02)); + r += mul(s0_8, M4(-1.066e-02, -8.715e-02, 1.794e-02, -1.718e-02, 3.849e-02, 7.916e-02, -4.488e-02, 3.583e-02, 1.228e-01, -1.129e-01, 7.438e-02, -3.504e-02, -3.830e-02, 1.527e-01, -1.025e-01, -3.254e-02)); + r += mul(s1_0, M4(-4.279e-02, 2.805e-02, -6.478e-03, -6.321e-02, -1.135e-01, -1.576e-01, -2.845e-01, 1.893e-02, -1.380e-01, 5.029e-02, -1.375e-02, 7.180e-02, 6.596e-02, 6.460e-03, 4.896e-02, -1.015e-01)); + r += mul(s1_1, M4(6.118e-02, 5.593e-02, 2.367e-02, -2.426e-02, 1.968e-01, -1.561e-01, 2.239e-02, -2.262e-02, -1.069e-01, 1.221e-01, 2.280e-01, -4.787e-02, 8.200e-03, -1.714e-02, -1.427e-01, -3.809e-02)); + r += mul(s1_2, M4(9.895e-02, 1.919e-02, -4.780e-02, -8.210e-03, 3.898e-02, 1.383e-02, -8.105e-02, 5.345e-03, 2.320e-03, 5.456e-03, -2.477e-02, 5.313e-02, 7.198e-02, 2.065e-02, 2.893e-02, -2.668e-02)); + r += mul(s1_3, M4(-1.142e-02, 1.964e-01, 2.138e-01, -3.753e-02, -1.707e-01, -3.177e-03, -2.294e-01, 4.555e-02, 3.510e-02, -5.653e-02, -9.684e-02, 6.350e-02, 4.124e-02, 1.055e-01, 4.750e-02, -2.276e-01)); + r += mul(s1_4, M4(6.411e-02, -1.365e-01, -1.404e-01, 4.621e-02, 1.895e-01, -4.308e-01, 3.777e-03, -3.179e-02, -1.489e-01, -2.070e-03, 1.834e-02, -1.492e-02, 9.748e-02, -3.045e-02, 1.195e-01, 2.917e-01)); + r += mul(s1_5, M4(6.094e-02, 8.341e-02, 6.781e-03, 6.353e-02, 9.032e-02, 1.040e-01, -4.046e-02, -1.785e-01, -3.653e-02, 5.541e-02, -8.072e-02, -2.779e-02, -6.816e-02, -8.345e-02, 7.266e-02, -4.618e-03)); + r += mul(s1_6, M4(5.829e-02, 1.015e-01, 1.323e-01, -7.664e-02, 7.754e-04, -2.737e-02, 1.702e-02, 4.195e-02, -4.931e-04, 7.661e-02, 9.495e-03, 1.009e-01, 3.830e-02, -6.200e-02, -2.071e-02, -9.456e-02)); + r += mul(s1_7, M4(-1.042e-01, -3.669e-02, -5.626e-02, 9.150e-02, -3.230e-02, 1.431e-03, -1.231e-01, 2.449e-05, -7.608e-03, 4.813e-02, 5.640e-02, 6.504e-02, 8.351e-02, 1.287e-01, 1.897e-02, 1.281e-01)); + r += mul(s1_8, M4(6.730e-02, -3.591e-03, -8.770e-02, -2.447e-02, 5.591e-02, 1.574e-02, 1.151e-02, 5.971e-02, 9.974e-02, 8.794e-02, -9.162e-03, 8.676e-02, -5.142e-02, -3.354e-02, -6.216e-03, -9.497e-03)); + r += mul(s2_0, M4(1.247e-01, -1.061e-01, 7.567e-02, -9.196e-02, -4.168e-02, 5.182e-02, -2.263e-02, 2.585e-02, 7.074e-02, -4.756e-02, -8.012e-02, 5.472e-02, 2.105e-01, -1.859e-01, 2.797e-02, -2.537e-02)); + r += mul(s2_1, M4(-1.643e-02, 8.011e-02, -6.775e-02, 8.476e-02, -9.097e-02, 1.363e-01, -3.407e-03, 3.541e-02, 5.825e-02, -2.914e-02, -5.662e-02, 4.324e-02, 4.588e-02, 7.110e-02, 5.353e-02, 1.324e-01)); + r += mul(s2_2, M4(-5.658e-02, -1.516e-02, 1.473e-01, 9.355e-02, -1.680e-02, -5.163e-03, -3.425e-02, -1.223e-02, 2.527e-02, 8.016e-05, 5.707e-03, 4.130e-02, -9.216e-04, 8.233e-02, -7.631e-02, -8.187e-02)); + r += mul(s2_3, M4(2.722e-01, -1.805e-02, 2.268e-01, -1.378e-01, 3.957e-01, 4.214e-03, 3.564e-02, -3.481e-01, 1.546e-02, -6.001e-02, -8.961e-02, -1.552e-01, -1.299e-01, -1.272e-01, -2.106e-01, -2.713e-02)); + r += mul(s2_4, M4(-1.397e-01, -1.281e-01, 2.438e-02, -2.740e-01, -2.735e-02, -2.233e-01, 3.683e-02, 1.080e-01, -1.178e-01, 3.885e-02, 6.368e-02, -6.460e-02, 1.818e-01, 2.601e-02, -8.447e-02, -6.402e-02)); + r += mul(s2_5, M4(-2.968e-02, 7.313e-03, 1.234e-01, 6.614e-02, 2.951e-02, -4.474e-02, 3.406e-02, 9.092e-02, -1.723e-03, 9.511e-02, -1.077e-01, -1.058e-01, -5.453e-02, -5.614e-02, 1.976e-01, 1.356e-01)); + r += mul(s2_6, M4(2.218e-03, -8.320e-03, 1.214e-02, -2.105e-01, 7.525e-02, 8.546e-02, -1.028e-01, -1.400e-01, 1.727e-02, -4.834e-02, -2.688e-02, 8.080e-02, -2.590e-01, 9.844e-03, -1.536e-01, 8.033e-02)); + r += mul(s2_7, M4(2.509e-02, -9.194e-02, 2.487e-02, -2.968e-01, -1.407e-01, -5.506e-02, -1.618e-01, -2.409e-01, -5.373e-02, -5.760e-02, 1.002e-02, 6.405e-02, -1.862e-01, -3.112e-01, -1.192e-01, -9.978e-02)); + r += mul(s2_8, M4(-1.461e-02, -1.308e-02, 4.011e-02, -1.234e-02, -8.379e-02, -5.492e-02, 2.864e-02, 2.979e-03, 7.257e-02, 7.612e-03, 9.477e-02, 7.681e-02, -1.820e-01, 6.211e-02, 8.262e-03, 1.077e-01)); + r += mul(s3_0, M4(-6.968e-02, -5.070e-02, -2.716e-03, -3.253e-02, 8.401e-02, 3.863e-02, 1.304e-01, -6.395e-02, -2.248e-01, -1.729e-02, -1.963e-01, 1.173e-01, -4.031e-02, 1.214e-03, 4.012e-02, 6.283e-02)); + r += mul(s3_1, M4(-7.261e-02, -6.832e-02, -9.888e-02, -2.210e-02, 8.176e-02, 3.296e-02, -5.889e-02, -1.627e-02, -1.181e-01, -4.543e-02, -2.259e-01, -1.334e-01, 9.064e-02, -1.367e-02, 2.490e-02, -2.786e-02)); + r += mul(s3_2, M4(-7.879e-02, -1.776e-02, 8.378e-02, -2.233e-02, -3.494e-02, -1.043e-01, -2.752e-02, 3.997e-02, 3.593e-02, -1.131e-02, -2.270e-03, -1.207e-01, -4.468e-02, 5.429e-02, 4.384e-02, 2.097e-02)); + r += mul(s3_3, M4(-4.782e-02, 6.620e-02, 4.331e-02, -4.935e-02, -1.376e-01, 1.304e-01, 1.418e-01, -1.366e-01, -1.422e-01, 9.409e-02, -1.143e-02, 4.999e-02, 3.565e-02, -9.909e-02, -1.052e-01, 2.936e-02)); + r += mul(s3_4, M4(-3.187e-02, 5.804e-02, 8.012e-02, -1.070e-01, -9.085e-02, 8.674e-02, -1.134e-01, -1.266e-01, -1.155e-01, 5.538e-02, -1.342e-01, 1.065e-01, 9.555e-02, 8.111e-02, -1.443e-03, -3.278e-02)); + r += mul(s3_5, M4(-4.139e-02, 1.685e-01, 1.200e-02, -3.564e-02, -1.144e-02, -1.103e-01, -1.092e-01, 1.229e-03, 1.426e-02, 3.171e-02, 6.061e-02, -1.785e-02, -2.598e-03, 1.907e-02, 1.974e-02, -4.434e-02)); + r += mul(s3_6, M4(-1.181e-01, -1.052e-02, 6.572e-02, 7.846e-02, -6.855e-02, 8.623e-03, 6.590e-02, -7.199e-02, 5.471e-02, -2.935e-02, 7.180e-02, 3.095e-01, -6.600e-02, -1.445e-01, -8.351e-02, 2.923e-02)); + r += mul(s3_7, M4(8.374e-03, 5.133e-02, 5.361e-02, 5.602e-03, -2.386e-02, 1.944e-01, 4.868e-02, 9.251e-02, 8.391e-02, -3.245e-02, -2.114e-01, 1.310e-01, -5.889e-02, -7.836e-02, 3.905e-02, 5.868e-02)); + r += mul(s3_8, M4(1.170e-02, -2.110e-02, 1.028e-01, 3.098e-02, 8.379e-02, -7.586e-02, 2.728e-02, 2.511e-02, 2.429e-02, 1.361e-02, 1.711e-02, -6.559e-02, -1.880e-02, 3.721e-02, -6.136e-02, 1.502e-02)); + r += mul(s4_0, M4(-2.903e-02, 2.782e-02, 3.637e-02, 4.470e-02, -6.718e-02, -6.209e-03, -1.784e-01, 4.864e-02, -1.289e-01, 9.147e-02, -6.943e-02, -1.060e-04, 1.179e-02, -6.628e-02, 7.751e-02, 8.653e-02)); + r += mul(s4_1, M4(-4.804e-02, 1.197e-01, 1.061e-04, -1.308e-01, 8.009e-02, -1.467e-02, -7.909e-02, -7.073e-02, 1.717e-02, 3.563e-03, 6.698e-02, -6.229e-03, 2.390e-01, -7.585e-02, 1.767e-01, -8.543e-03)); + r += mul(s4_2, M4(8.455e-04, -6.319e-02, -1.001e-01, 5.009e-03, 8.602e-02, 2.202e-02, 1.195e-02, -1.289e-02, -1.784e-02, 1.404e-02, -5.001e-02, -2.940e-02, 4.222e-02, 9.494e-02, 1.836e-02, 1.291e-01)); + r += mul(s4_3, M4(-5.270e-02, 3.443e-02, 1.567e-02, 2.300e-02, -1.383e-01, 9.547e-03, -1.708e-01, 5.681e-02, -6.158e-02, 6.746e-02, -3.332e-02, 5.301e-02, -3.292e-02, -3.047e-02, 1.798e-01, 1.061e-01)); + r += mul(s4_4, M4(-2.134e-01, 1.616e-01, -1.514e-01, -5.183e-02, 9.008e-02, -2.940e-01, -1.443e-01, 4.565e-02, 1.334e-01, 4.397e-02, 1.387e-01, -4.403e-02, 1.702e-01, -3.888e-02, 2.274e-01, -3.092e-02)); + r += mul(s4_5, M4(-4.684e-02, 1.135e-01, -1.655e-02, -5.954e-02, -1.843e-03, -7.895e-02, -4.797e-02, 5.951e-02, -8.364e-02, 1.026e-02, 6.500e-02, 1.285e-02, -6.667e-02, 8.180e-02, 1.613e-01, 6.563e-02)); + r += mul(s4_6, M4(-2.634e-04, 9.299e-02, 7.852e-02, 8.226e-02, -1.197e-02, 3.085e-02, -1.568e-01, -1.472e-02, -3.594e-02, 7.249e-02, -3.770e-02, 3.388e-02, 8.718e-02, -1.001e-01, 7.622e-03, 1.176e-01)); + r += mul(s4_7, M4(2.207e-02, 2.432e-01, 3.523e-02, 1.816e-01, -9.710e-02, 4.736e-03, -1.222e-01, 3.955e-02, -4.860e-02, -7.728e-02, 5.649e-02, 2.784e-02, 1.035e-01, -1.065e-01, 9.028e-02, -1.230e-01)); + r += mul(s4_8, M4(2.260e-02, -7.260e-02, 3.843e-03, 8.803e-02, -5.237e-02, -1.789e-02, 3.016e-02, -4.373e-03, 1.306e-01, 2.003e-02, -9.999e-02, 2.054e-03, -1.402e-01, 7.245e-02, 1.464e-01, -8.916e-03)); + r += mul(s5_0, M4(-1.601e-02, 1.393e-02, 1.181e-02, 3.394e-03, -1.229e-01, 6.802e-02, -1.842e-01, -6.766e-02, 7.230e-02, 1.347e-02, 5.686e-02, -4.203e-02, -3.612e-02, -1.982e-02, -1.188e-01, -2.902e-02)); + r += mul(s5_1, M4(-4.992e-02, 1.008e-01, -1.494e-02, -1.397e-01, -1.269e-01, 8.456e-02, -1.805e-01, -2.866e-01, 8.366e-02, -1.583e-02, -4.218e-02, 5.203e-02, -6.240e-03, 2.175e-03, 9.360e-03, -3.346e-02)); + r += mul(s5_2, M4(5.649e-02, 1.308e-02, -1.441e-01, 9.456e-03, -4.964e-03, 3.503e-02, -4.653e-02, -4.979e-02, 3.381e-02, 2.546e-02, -7.040e-03, -6.521e-02, 1.067e-02, 1.476e-03, 1.089e-02, -1.066e-02)); + r += mul(s5_3, M4(2.385e-01, 8.693e-02, 5.615e-02, 7.840e-02, -8.442e-02, 2.659e-01, -2.063e-01, 3.308e-02, 1.993e-01, -1.056e-01, 1.347e-01, 5.594e-02, -1.517e-02, -7.605e-03, -2.544e-02, -2.971e-02)); + r += mul(s5_4, M4(1.917e-01, 1.077e-01, 2.896e-02, 9.657e-02, 1.121e-01, -2.141e-01, 1.619e-02, -1.274e-01, -1.621e-01, -1.772e-02, -1.214e-01, 7.936e-03, 8.032e-02, 4.870e-02, 5.302e-02, 1.499e-01)); + r += mul(s5_5, M4(-9.687e-02, 6.926e-02, 4.666e-02, 2.300e-02, 1.611e-01, 1.829e-02, -1.539e-01, 6.384e-02, -8.200e-02, -4.745e-02, 9.795e-02, 1.086e-01, -2.475e-02, -3.007e-02, 3.883e-02, 4.477e-02)); + r += mul(s5_6, M4(4.059e-02, -1.257e-01, -3.480e-02, -6.760e-02, 5.015e-03, 2.947e-01, 4.345e-02, 9.616e-02, 3.028e-02, -1.256e-01, -7.291e-02, -2.048e-01, -5.949e-02, -5.499e-02, -6.628e-02, 1.118e-01)); + r += mul(s5_7, M4(3.351e-02, -8.789e-02, -1.121e-01, -2.031e-01, -7.557e-02, -6.257e-02, 1.119e-01, -8.362e-02, -1.950e-01, 4.202e-02, 1.407e-01, -1.596e-01, 4.333e-03, -1.290e-01, 5.861e-02, -1.871e-02)); + r += mul(s5_8, M4(-1.307e-01, -7.025e-02, 1.999e-04, 2.356e-02, 6.944e-02, -6.780e-02, -5.046e-02, -1.036e-01, -1.561e-01, -5.692e-02, -3.962e-03, 1.088e-02, -7.979e-02, 3.374e-02, -2.321e-02, -3.199e-02)); + r += mul(s6_0, M4(-1.385e-01, 4.381e-02, -2.158e-01, 4.605e-02, 1.471e-02, 7.279e-03, 6.032e-02, 5.920e-02, 1.219e-01, -6.779e-03, 7.797e-02, -7.467e-02, -2.764e-02, 4.501e-02, 1.588e-01, 4.100e-02)); + r += mul(s6_1, M4(-2.624e-01, 8.061e-02, 2.686e-02, -4.546e-02, 2.055e-01, 1.347e-02, 2.128e-01, -7.747e-02, 2.447e-01, -3.511e-02, 1.096e-01, -5.124e-02, 1.995e-01, 2.708e-03, -1.469e-01, 1.762e-01)); + r += mul(s6_2, M4(1.169e-01, 1.378e-02, -1.995e-02, -1.262e-01, 8.891e-02, 4.851e-02, 5.745e-03, 7.311e-03, 5.321e-02, 3.894e-02, 9.423e-02, 3.472e-02, 9.081e-02, -1.221e-01, -1.803e-02, -3.834e-02)); + r += mul(s6_3, M4(2.919e-01, -4.288e-02, 4.526e-02, 1.353e-01, 7.313e-02, -1.146e-01, 1.485e-01, -1.512e-01, 4.126e-02, -1.755e-02, 4.917e-02, -3.759e-02, -2.168e-01, -3.541e-03, 1.531e-01, -1.089e-01)); + r += mul(s6_4, M4(1.324e-01, 1.892e-02, 6.047e-02, 5.046e-02, -1.281e-01, 1.125e-02, -1.346e-01, -1.634e-01, 1.617e-01, -3.114e-02, 1.048e-01, 5.844e-02, 6.869e-02, -4.318e-02, 7.772e-02, -2.413e-02)); + r += mul(s6_5, M4(6.001e-02, -9.286e-03, -1.376e-02, -3.059e-02, -1.660e-02, -1.350e-01, 4.725e-02, 2.385e-02, -2.122e-02, 8.138e-02, 8.902e-02, 7.671e-02, -2.388e-02, -3.311e-01, 5.147e-02, 6.933e-02)); + r += mul(s6_6, M4(-7.691e-02, -3.586e-02, -2.052e-01, 6.760e-02, -2.289e-02, -3.130e-02, -1.099e-02, -1.740e-01, -1.143e-02, -6.989e-02, -1.834e-01, -2.093e-01, 3.919e-02, -4.511e-02, 2.687e-02, -1.602e-03)); + r += mul(s6_7, M4(9.664e-02, -1.343e-01, -6.979e-02, -4.653e-02, -1.119e-01, 1.621e-01, 4.385e-02, -6.588e-02, 1.298e-01, -1.788e-01, -1.862e-02, -3.076e-01, 9.194e-02, -3.679e-02, -1.679e-01, 4.619e-02)); + r += mul(s6_8, M4(-8.280e-02, 5.923e-02, -1.304e-01, -5.302e-02, 1.437e-02, -1.157e-01, -1.198e-01, 7.447e-03, -1.042e-01, 6.184e-02, 5.286e-02, 5.646e-02, -4.282e-02, -2.231e-01, 3.049e-02, -2.179e-02)); + r += mul(s7_0, M4(3.199e-02, 9.747e-03, -3.185e-02, 2.609e-02, 3.812e-02, -1.070e-01, 7.742e-02, 6.550e-02, -1.438e-01, 8.593e-02, -7.431e-02, -5.507e-02, -3.623e-02, 2.192e-02, -7.684e-02, 8.442e-03)); + r += mul(s7_1, M4(-2.091e-02, 4.231e-02, 9.332e-03, -8.065e-03, 6.009e-02, -5.314e-02, 7.690e-02, 6.717e-02, -9.374e-02, -4.819e-02, -2.180e-02, -8.335e-02, 2.130e-02, 9.632e-03, -6.324e-02, 2.606e-02)); + r += mul(s7_2, M4(1.019e-02, -3.432e-02, 3.118e-02, -2.029e-02, 8.550e-02, 1.040e-02, -2.055e-02, -1.994e-02, -5.136e-02, 1.527e-02, -1.303e-02, -4.715e-03, -2.850e-03, 7.002e-02, -2.064e-02, 3.552e-03)); + r += mul(s7_3, M4(3.422e-02, -1.958e-01, -9.659e-02, 9.334e-02, -1.249e-01, 3.489e-02, -8.189e-03, -9.950e-02, -2.292e-01, 1.062e-01, -9.947e-02, 7.557e-02, -6.335e-02, -2.233e-02, 4.335e-02, -3.771e-02)); + r += mul(s7_4, M4(-1.342e-01, 1.333e-01, -1.353e-02, -9.543e-02, 1.696e-01, -6.520e-02, 2.230e-02, -7.316e-02, -2.897e-01, 8.430e-03, -1.392e-01, 3.032e-02, -2.450e-02, 6.235e-02, -4.062e-02, -1.210e-01)); + r += mul(s7_5, M4(-3.361e-02, 4.276e-02, 4.163e-02, -1.434e-01, -2.628e-03, -5.990e-02, -9.169e-02, 3.404e-02, 2.080e-02, 4.274e-02, 5.379e-02, -1.103e-01, -1.540e-01, -2.073e-01, -2.857e-02, 4.924e-02)); + r += mul(s7_6, M4(-1.460e-03, -1.044e-01, -1.040e-01, -9.133e-02, 9.227e-02, 3.829e-02, 6.551e-02, 1.675e-02, 2.176e-02, 2.104e-02, 4.837e-02, 1.493e-01, -5.540e-03, 3.481e-02, 2.152e-02, 6.388e-02)); + r += mul(s7_7, M4(-7.845e-02, 4.662e-03, 3.218e-02, -4.691e-02, 3.992e-02, -5.042e-02, -4.760e-02, -1.711e-02, 1.496e-01, -2.058e-01, -4.183e-02, 1.387e-01, 7.547e-02, 4.298e-02, -3.687e-02, -4.766e-02)); + r += mul(s7_8, M4(-1.745e-02, -9.501e-02, -7.995e-02, 7.595e-02, -3.949e-02, 8.468e-02, -2.336e-02, -6.546e-02, 6.669e-02, -1.837e-02, 9.980e-02, -4.351e-02, -1.122e-01, -6.903e-02, 2.983e-02, 2.586e-02)); + r += V4(-1.131e-02, -6.210e-03, -1.359e-03, 7.029e-03); + return r; +} + +V4 f3(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(8.366e-02, -4.625e-02, -1.679e-05, -7.055e-02, -5.745e-02, 4.328e-02, -4.737e-02, 3.704e-02, 1.266e-01, -7.905e-02, 4.610e-02, 4.622e-02, -1.638e-03, -3.242e-03, -5.213e-02, 1.498e-02)); + r += mul(s0_1, M4(-4.821e-02, 7.161e-02, 1.783e-02, 2.136e-02, -1.947e-02, 1.331e-02, -8.429e-02, -6.556e-02, -3.016e-02, -3.791e-02, 6.900e-02, 1.032e-01, 6.970e-02, 4.629e-02, -2.488e-04, 4.221e-02)); + r += mul(s0_2, M4(-6.345e-02, -3.040e-02, -1.762e-02, -3.030e-02, 9.966e-03, 3.699e-02, -2.345e-02, 1.284e-01, 7.479e-02, 2.658e-02, 9.825e-02, 2.448e-03, -1.423e-02, 4.787e-03, -5.916e-03, -8.537e-03)); + r += mul(s0_3, M4(-6.308e-02, 6.292e-02, 8.276e-02, 8.984e-03, 1.197e-01, -2.621e-02, -1.714e-01, 1.645e-02, 7.338e-03, 1.754e-01, 3.165e-02, -4.041e-02, 1.649e-01, -1.146e-01, -2.231e-03, 1.743e-02)); + r += mul(s0_4, M4(1.518e-01, 4.422e-02, -2.570e-02, 4.261e-02, -4.614e-02, -1.646e-02, 3.071e-02, 1.416e-02, -1.199e-01, 7.698e-02, 7.249e-02, -2.018e-01, -6.424e-02, -6.171e-02, 3.563e-02, 9.237e-02)); + r += mul(s0_5, M4(6.048e-02, -2.544e-02, -3.806e-02, 6.680e-02, 5.752e-02, -3.774e-02, -1.997e-02, 3.231e-02, -1.899e-02, 1.783e-03, 6.195e-02, -8.508e-02, 1.436e-02, -7.429e-02, -1.926e-03, 4.569e-02)); + r += mul(s0_6, M4(-6.497e-02, -4.285e-02, -1.938e-02, 6.492e-02, -6.409e-02, 7.374e-03, 3.397e-03, -1.020e-02, -8.272e-02, 9.002e-02, 7.601e-02, 7.153e-02, -2.317e-01, -9.008e-02, -1.715e-01, 3.595e-02)); + r += mul(s0_7, M4(-2.158e-02, 8.395e-02, 1.559e-02, 2.708e-02, 4.025e-02, 1.614e-02, 3.012e-02, -6.034e-02, 1.020e-01, -5.890e-02, -9.097e-03, 5.405e-02, 6.755e-02, 8.994e-02, 9.884e-02, -3.034e-01)); + r += mul(s0_8, M4(-2.835e-02, 2.795e-02, 3.700e-02, -1.932e-02, 6.881e-02, 1.218e-01, -4.342e-02, -3.492e-02, 7.657e-03, -1.581e-01, 1.688e-02, -2.516e-02, 1.564e-02, 2.219e-01, -3.715e-04, -7.197e-02)); + r += mul(s1_0, M4(1.660e-02, -8.455e-02, -7.154e-02, -1.514e-02, -1.952e-02, -1.193e-01, -2.445e-02, -7.453e-02, 3.252e-02, -2.370e-01, -9.123e-02, 3.936e-02, -6.490e-02, 4.494e-02, -3.137e-02, -4.313e-02)); + r += mul(s1_1, M4(-7.434e-02, -2.393e-02, 8.495e-02, 1.451e-01, 5.770e-02, -2.610e-01, -3.929e-02, -8.307e-02, 1.142e-02, 6.720e-03, 2.579e-02, -6.570e-03, 3.456e-02, 1.460e-01, -1.962e-03, 1.058e-01)); + r += mul(s1_2, M4(-2.486e-02, 9.410e-02, -2.703e-02, -6.042e-02, -9.268e-02, -9.214e-02, 1.771e-02, -8.276e-02, 3.998e-02, -3.503e-02, 6.499e-03, 7.234e-02, 1.121e-02, -1.753e-02, 1.311e-02, 2.380e-02)); + r += mul(s1_3, M4(-1.391e-01, -8.952e-02, 1.701e-01, 8.006e-02, 1.100e-01, -2.031e-01, -2.448e-01, -8.485e-02, -1.531e-01, -6.221e-02, 1.598e-01, 1.236e-02, 3.185e-01, 2.210e-02, -6.903e-03, 1.081e-02)); + r += mul(s1_4, M4(1.768e-01, -1.338e-01, 4.228e-02, -1.443e-01, 1.189e-01, -1.057e-01, 3.814e-02, 3.880e-02, -7.824e-02, 8.927e-02, -4.384e-02, 1.260e-01, -1.051e-01, 1.095e-01, 2.348e-01, -7.785e-02)); + r += mul(s1_5, M4(3.181e-02, -2.058e-02, -2.484e-02, 2.095e-01, -1.002e-01, 6.903e-02, 9.806e-02, -8.338e-02, -4.461e-02, 1.080e-01, -4.480e-02, -1.608e-01, -2.168e-02, 1.402e-01, 9.112e-02, 3.137e-02)); + r += mul(s1_6, M4(-7.153e-02, -9.714e-03, -3.590e-02, -1.857e-02, -7.464e-02, -2.786e-01, -2.914e-02, 2.612e-02, 8.381e-02, 4.730e-02, -1.727e-02, 1.002e-01, -6.640e-03, -6.506e-02, 4.961e-02, 1.271e-01)); + r += mul(s1_7, M4(1.086e-01, -1.354e-02, -4.072e-02, -1.361e-02, -1.088e-02, -7.620e-02, 2.137e-02, -5.935e-02, 1.402e-01, -4.279e-02, -5.225e-02, -8.616e-04, -2.528e-02, -5.778e-02, 7.600e-02, 1.156e-01)); + r += mul(s1_8, M4(-2.794e-02, -4.535e-02, 7.499e-02, 7.316e-02, 4.056e-02, -9.792e-03, -3.258e-02, 3.545e-02, 4.778e-02, 2.453e-02, 1.394e-02, -3.347e-02, 1.539e-02, -1.344e-02, -1.629e-02, 8.918e-02)); + r += mul(s2_0, M4(-4.724e-02, 3.187e-02, -1.119e-01, -1.039e-01, 1.237e-01, -1.120e-01, -1.534e-01, -3.663e-02, 6.038e-02, 1.295e-02, -5.587e-02, 2.924e-02, -1.583e-01, 4.710e-02, 1.087e-01, 1.085e-01)); + r += mul(s2_1, M4(-1.190e-01, 1.962e-01, -4.033e-02, 4.048e-02, 4.540e-02, -1.960e-01, -3.113e-02, -1.396e-03, -1.057e-01, -1.123e-01, 4.961e-02, 1.273e-01, -6.559e-02, -1.155e-02, -1.244e-01, 9.591e-02)); + r += mul(s2_2, M4(8.596e-02, -1.154e-01, 1.762e-02, 7.911e-02, -4.364e-02, -4.480e-02, -5.516e-02, -9.699e-03, -2.152e-02, 5.203e-02, 1.410e-02, -7.408e-02, -9.102e-02, -1.625e-01, -3.805e-02, -9.314e-02)); + r += mul(s2_3, M4(2.788e-03, 1.312e-01, -8.558e-02, 2.490e-01, 4.095e-02, 1.776e-01, 1.262e-01, -1.899e-02, -9.067e-02, 8.022e-02, 9.244e-02, 1.264e-01, -1.084e-01, 3.207e-01, 1.156e-01, 2.557e-01)); + r += mul(s2_4, M4(-1.319e-01, 1.857e-01, -5.472e-02, -5.962e-02, -1.585e-02, -6.869e-02, 1.136e-01, -1.332e-01, 1.490e-01, -1.100e-02, -1.314e-01, -1.097e-02, 2.497e-02, 1.317e-03, -2.269e-02, 4.258e-02)); + r += mul(s2_5, M4(8.058e-02, 2.096e-02, -5.652e-02, 8.678e-02, 8.261e-03, 7.981e-02, -2.228e-02, -8.695e-02, -9.517e-02, 1.984e-03, -1.027e-01, 1.134e-01, 8.701e-02, -8.857e-02, -1.051e-01, 2.998e-01)); + r += mul(s2_6, M4(-1.376e-01, 2.994e-01, 2.178e-01, 1.225e-01, 2.191e-02, -1.421e-01, -6.894e-02, 5.654e-02, -4.585e-02, 7.526e-02, 2.837e-02, -9.054e-02, 2.730e-01, 6.572e-02, -1.035e-02, -5.567e-02)); + r += mul(s2_7, M4(-5.962e-02, 9.766e-02, 1.996e-02, -9.993e-02, 1.208e-02, -2.710e-01, 1.139e-01, -7.663e-02, -5.946e-03, 1.802e-04, 4.340e-02, -1.143e-02, 9.620e-02, 1.497e-01, 1.258e-01, 2.478e-01)); + r += mul(s2_8, M4(1.097e-03, 8.520e-02, -3.726e-02, -6.033e-02, 2.829e-02, -9.984e-02, 1.767e-02, -3.130e-02, 4.302e-02, 1.348e-01, 1.141e-02, 3.356e-02, 6.218e-02, -1.368e-01, -7.196e-02, -3.032e-03)); + r += mul(s3_0, M4(-5.851e-02, -2.836e-02, -7.747e-02, -7.154e-02, 5.586e-03, 1.857e-02, -3.549e-02, 2.444e-02, -1.147e-01, -1.289e-01, -1.063e-01, -9.112e-02, -1.265e-01, 4.177e-03, -5.100e-02, -8.817e-02)); + r += mul(s3_1, M4(-3.374e-02, -5.017e-02, -6.799e-02, -8.030e-02, -6.027e-02, 2.000e-02, -9.070e-02, 1.255e-02, -2.058e-02, 5.366e-02, -1.589e-01, -5.098e-02, -8.296e-03, 2.337e-02, 8.431e-03, -6.655e-02)); + r += mul(s3_2, M4(9.613e-03, 3.160e-04, 1.466e-02, -4.255e-02, -3.482e-02, 5.285e-02, -2.864e-02, 3.214e-02, -1.187e-01, 7.668e-02, -1.474e-02, -6.664e-02, -2.491e-02, 3.979e-02, -4.651e-02, -3.809e-03)); + r += mul(s3_3, M4(1.401e-01, -2.754e-02, -1.067e-01, -4.772e-02, 2.739e-01, 3.329e-02, -1.982e-01, -1.526e-01, 7.079e-02, 8.003e-02, -5.168e-02, -1.645e-01, -5.493e-02, 4.557e-02, 5.902e-02, 1.539e-02)); + r += mul(s3_4, M4(6.088e-03, -4.484e-02, -2.159e-01, -7.034e-02, -9.688e-02, 6.970e-02, -9.132e-02, -1.124e-02, 3.162e-02, -9.333e-02, -1.193e-01, -1.147e-01, 5.849e-02, 2.679e-02, -1.136e-01, 1.677e-01)); + r += mul(s3_5, M4(2.219e-02, 1.462e-01, -1.562e-03, 8.097e-02, 3.727e-02, 2.447e-02, 2.518e-02, -8.378e-03, 3.070e-02, 1.205e-01, -1.129e-01, -2.044e-02, 8.378e-02, 1.016e-02, 4.320e-03, -1.588e-02)); + r += mul(s3_6, M4(-3.378e-02, -2.538e-02, -6.935e-02, -1.635e-02, -1.603e-01, -4.665e-02, -1.968e-02, -9.107e-02, 1.206e-01, -1.389e-01, -1.143e-01, -1.128e-01, 1.049e-01, 1.733e-02, 8.835e-03, 1.055e-02)); + r += mul(s3_7, M4(5.519e-02, 4.811e-02, -1.458e-02, -4.860e-02, 2.804e-02, 5.491e-02, 6.081e-02, -8.758e-02, 7.463e-02, 3.244e-02, -1.801e-01, 3.040e-02, 6.663e-02, 2.937e-02, -6.186e-02, -4.246e-02)); + r += mul(s3_8, M4(3.751e-02, 7.449e-02, -1.401e-03, -6.031e-04, -7.415e-04, 2.114e-02, 9.190e-03, -1.090e-02, 5.044e-02, 9.171e-02, -5.598e-02, -4.324e-02, -5.242e-02, 2.832e-02, -2.034e-02, 3.673e-02)); + r += mul(s4_0, M4(2.718e-02, 3.039e-03, 5.032e-03, 6.351e-03, -1.961e-01, 1.204e-01, -4.799e-03, -9.374e-02, -1.310e-01, 1.085e-02, -4.200e-02, -1.989e-03, -6.987e-02, -3.062e-02, -2.286e-02, -1.975e-03)); + r += mul(s4_1, M4(5.857e-03, 3.052e-02, -3.996e-04, -1.045e-01, 9.168e-02, -4.770e-02, 7.762e-02, 1.046e-01, -5.771e-03, -1.048e-01, -4.878e-02, -2.485e-02, -3.981e-02, -9.546e-02, 1.040e-01, 5.840e-02)); + r += mul(s4_2, M4(-6.438e-02, 6.032e-02, -4.095e-03, 1.282e-02, -6.417e-03, 1.891e-02, -1.130e-02, 1.321e-02, 2.031e-02, 7.678e-04, -3.628e-02, 1.251e-02, -4.912e-02, -1.129e-01, 4.968e-02, 5.214e-02)); + r += mul(s4_3, M4(1.093e-01, -4.284e-02, -7.542e-02, 5.665e-02, -6.118e-03, 5.012e-03, -9.555e-02, -8.125e-02, 1.796e-01, 4.334e-02, 2.716e-02, 1.090e-01, 2.663e-02, 6.959e-02, -1.524e-02, -4.485e-02)); + r += mul(s4_4, M4(5.264e-02, 7.289e-02, -1.294e-01, -3.265e-02, 2.380e-02, 1.014e-01, 1.142e-02, 3.700e-02, -1.953e-02, 6.918e-02, -6.314e-02, -2.820e-01, -7.555e-02, 1.186e-01, 4.388e-01, -2.191e-01)); + r += mul(s4_5, M4(-4.334e-02, 1.732e-02, -2.172e-02, 4.795e-02, 2.192e-02, -3.595e-02, -3.459e-02, 7.788e-02, -5.273e-02, 1.390e-02, 1.792e-02, -4.107e-02, 8.022e-03, 8.154e-03, 1.100e-02, -1.620e-01)); + r += mul(s4_6, M4(-7.379e-02, -1.514e-01, -9.284e-02, -5.538e-02, -1.410e-02, 4.090e-02, -2.018e-02, 5.257e-03, -1.715e-02, 7.838e-02, 9.580e-02, -6.710e-02, 3.742e-02, -9.365e-02, 4.797e-02, -7.506e-02)); + r += mul(s4_7, M4(1.055e-01, -1.039e-01, 1.668e-02, 1.225e-02, -5.033e-05, 5.628e-02, -3.101e-02, -4.565e-02, 7.412e-02, 2.531e-03, 4.795e-02, 9.870e-02, -6.641e-02, -1.500e-01, -6.496e-02, -1.033e-01)); + r += mul(s4_8, M4(4.693e-02, 7.863e-02, -2.748e-02, -1.198e-02, -4.499e-02, -2.656e-02, 2.222e-03, 4.269e-03, 2.812e-03, 4.611e-03, 3.320e-02, 1.287e-02, -3.171e-02, -1.270e-01, -6.555e-02, -1.371e-02)); + r += mul(s5_0, M4(-1.372e-01, -5.882e-02, 2.866e-02, 7.556e-03, -6.512e-02, -6.292e-02, 1.342e-02, -6.174e-02, -5.772e-02, 9.548e-02, 2.712e-02, 6.947e-02, -1.070e-01, -4.828e-02, 2.676e-02, 3.725e-02)); + r += mul(s5_1, M4(2.337e-02, 5.177e-02, -4.465e-02, -8.847e-02, 1.230e-01, -5.090e-02, 3.594e-02, -5.058e-03, 1.487e-01, 4.051e-02, 2.267e-02, 8.719e-02, 5.190e-02, 1.139e-02, 4.265e-03, 4.696e-03)); + r += mul(s5_2, M4(-1.224e-02, 1.160e-02, 2.127e-02, 1.178e-02, -2.908e-02, -1.686e-02, 8.032e-02, 6.009e-03, -6.588e-02, 4.991e-02, 1.852e-02, 5.245e-02, -6.764e-02, 4.756e-02, 4.309e-02, 9.353e-02)); + r += mul(s5_3, M4(-5.198e-02, -9.044e-02, 8.528e-03, 7.007e-02, 1.540e-02, -2.175e-01, -1.793e-01, -6.205e-02, 6.765e-02, 1.716e-01, 8.623e-02, 2.179e-02, 5.780e-02, 3.796e-02, 9.230e-03, 7.359e-03)); + r += mul(s5_4, M4(6.367e-02, -1.669e-01, -6.597e-02, -1.224e-01, 6.007e-03, 7.739e-02, 1.129e-01, -7.896e-02, -1.081e-01, -1.099e-01, -5.489e-02, -2.851e-01, -5.496e-02, -5.978e-02, 1.354e-01, 2.308e-02)); + r += mul(s5_5, M4(5.751e-02, 1.276e-02, -5.097e-03, 5.008e-02, -1.904e-02, 1.818e-02, 6.886e-03, -1.936e-02, 6.154e-02, 3.243e-02, 2.901e-02, 1.013e-01, 4.000e-02, -1.378e-02, -2.156e-02, -4.824e-02)); + r += mul(s5_6, M4(5.950e-02, 3.787e-02, -1.758e-02, 1.207e-01, -4.966e-02, -7.477e-02, 4.130e-02, 9.592e-02, -1.577e-01, 1.225e-01, 1.179e-01, -5.457e-02, 8.628e-02, -4.253e-02, -4.329e-03, -6.608e-02)); + r += mul(s5_7, M4(7.467e-04, -6.582e-02, 2.856e-03, -2.982e-02, -1.069e-02, 2.294e-02, 1.185e-01, 3.513e-02, 1.033e-03, 3.475e-02, 2.014e-01, 4.276e-03, 3.863e-02, 7.000e-02, 1.326e-02, -1.444e-01)); + r += mul(s5_8, M4(1.070e-01, -7.495e-02, 1.787e-02, 1.062e-01, -1.778e-02, -4.706e-02, 3.628e-02, -5.452e-02, 3.944e-02, 3.673e-02, -6.037e-03, 5.675e-02, -1.452e-02, -4.372e-02, -1.022e-01, -6.924e-02)); + r += mul(s6_0, M4(-1.685e-01, -8.154e-02, -2.199e-03, -1.461e-01, 1.714e-01, -1.107e-01, -1.158e-02, 4.329e-03, -3.056e-03, 1.577e-02, -3.549e-02, 2.360e-03, 1.517e-02, 5.450e-02, 1.118e-02, -9.407e-03)); + r += mul(s6_1, M4(4.158e-02, 4.085e-02, -5.557e-02, -2.010e-01, 1.686e-01, -1.587e-01, 3.987e-02, 8.735e-02, 1.252e-01, 5.412e-03, -2.338e-02, 1.424e-01, -1.241e-01, 5.346e-02, 2.690e-02, -1.535e-01)); + r += mul(s6_2, M4(-3.336e-02, -1.172e-01, -2.737e-02, -1.304e-02, -6.357e-02, 2.670e-02, 4.281e-02, 1.914e-01, -1.642e-02, 2.325e-02, -1.774e-02, 1.394e-01, 1.639e-01, 2.105e-01, 9.449e-03, 1.014e-01)); + r += mul(s6_3, M4(-4.128e-02, -1.083e-01, -6.643e-02, -1.920e-01, 3.908e-02, 8.263e-02, 9.076e-02, 1.411e-01, -2.949e-02, 2.412e-02, 7.386e-02, 1.508e-01, -7.181e-02, 5.448e-02, 3.707e-03, 1.569e-01)); + r += mul(s6_4, M4(1.143e-01, -4.578e-02, 2.429e-02, -2.966e-01, 2.278e-02, 1.007e-01, 1.086e-01, 2.163e-01, 2.578e-01, -1.218e-01, -1.775e-02, -1.480e-01, 1.567e-01, 1.704e-01, -8.204e-02, -1.113e-01)); + r += mul(s6_5, M4(-1.680e-02, -5.282e-02, -9.898e-02, 3.483e-02, 5.711e-03, -2.308e-02, 3.101e-02, 2.295e-02, 2.181e-02, 1.015e-02, -1.960e-03, 2.662e-02, 9.698e-02, -1.443e-01, 6.841e-02, 1.892e-01)); + r += mul(s6_6, M4(2.444e-01, -1.486e-01, -8.018e-02, -7.961e-02, -1.087e-01, 1.903e-01, 2.236e-02, -1.990e-02, -4.210e-02, 4.249e-02, 8.970e-02, 6.274e-02, -9.654e-02, -1.470e-02, -2.475e-02, 4.849e-02)); + r += mul(s6_7, M4(-1.441e-01, -1.414e-01, -1.905e-01, 6.714e-02, 1.101e-01, 5.432e-03, -5.732e-02, -1.257e-01, 3.094e-02, -2.274e-01, 2.291e-02, -1.458e-01, 6.596e-02, 3.644e-01, 1.167e-01, -1.894e-01)); + r += mul(s6_8, M4(6.490e-02, -3.084e-02, -4.923e-02, -1.693e-01, -7.865e-02, -6.116e-02, -5.965e-02, 1.404e-02, 1.179e-01, -1.438e-01, -5.197e-02, 6.703e-02, 9.144e-02, 2.744e-01, -2.768e-03, 1.547e-01)); + r += mul(s7_0, M4(1.584e-02, -4.498e-02, 6.091e-02, -2.324e-02, -1.449e-02, -7.649e-02, 4.255e-02, -2.818e-02, -6.180e-02, 5.349e-02, -8.180e-02, -8.197e-03, 1.151e-01, -8.638e-02, -4.954e-03, -4.913e-05)); + r += mul(s7_1, M4(-1.801e-02, -2.371e-03, 3.753e-02, -5.704e-04, -7.683e-02, -3.341e-03, 3.097e-02, -1.380e-02, 9.815e-02, -3.270e-02, -7.837e-02, 1.160e-01, 7.501e-02, -8.401e-02, -3.338e-02, 1.049e-01)); + r += mul(s7_2, M4(-1.410e-02, -4.114e-02, 3.555e-02, -3.825e-02, -5.964e-02, 2.439e-02, 3.916e-02, -6.536e-02, -3.578e-02, 5.148e-02, -1.028e-02, 6.167e-03, 5.471e-02, -6.947e-03, -4.041e-02, 1.174e-01)); + r += mul(s7_3, M4(3.846e-02, 6.365e-03, 2.241e-02, -8.690e-02, -2.050e-02, 3.654e-02, -1.591e-03, -9.917e-03, -1.252e-01, -5.371e-03, 3.311e-02, 8.132e-03, -6.208e-02, 1.904e-02, 7.562e-02, -2.637e-03)); + r += mul(s7_4, M4(1.122e-01, -1.445e-02, 1.229e-02, -7.151e-02, 1.639e-01, 1.428e-01, -1.328e-01, 8.506e-02, -2.447e-03, 6.351e-02, -1.303e-01, -3.838e-02, -4.276e-02, 9.501e-02, 5.358e-02, 8.172e-03)); + r += mul(s7_5, M4(9.728e-03, 7.052e-02, -1.768e-02, 1.619e-01, -2.085e-02, -6.813e-02, 3.413e-02, -6.557e-02, -8.677e-02, 1.237e-01, -2.285e-02, -1.136e-01, 8.036e-02, -1.186e-01, -2.369e-02, -1.370e-01)); + r += mul(s7_6, M4(-8.722e-02, 1.628e-01, 1.063e-01, 4.557e-02, -2.343e-02, 1.109e-02, -1.094e-01, -6.930e-02, 1.664e-01, -4.381e-03, -1.127e-01, -1.101e-02, -6.311e-03, -2.693e-02, -3.793e-02, 3.911e-04)); + r += mul(s7_7, M4(-2.129e-02, -4.236e-02, -3.102e-02, 8.458e-03, -1.264e-02, 4.343e-03, -6.226e-02, 7.021e-02, -8.578e-03, -6.781e-02, -1.426e-02, 2.388e-01, -7.339e-02, 1.265e-01, 8.468e-02, -2.205e-02)); + r += mul(s7_8, M4(6.138e-03, -4.065e-03, 7.499e-02, 8.011e-02, -1.658e-02, -1.102e-02, 1.531e-02, -1.925e-02, 6.433e-02, 1.416e-01, 1.623e-02, 1.529e-01, 5.257e-03, 3.776e-02, -2.884e-02, -2.830e-02)); + r += V4(-1.151e-03, 4.418e-03, 4.805e-04, -9.419e-03); + return r; +} + +void Pass13(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = Rmp8x8(tid.x) + blockStart; + uint2 size = GetInputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = (gxy + 0.5) * pt; + + V4 s0_0 = l0(-1.0, -1.0); + V4 s0_1 = l0(0.0, -1.0); + V4 s0_2 = l0(1.0, -1.0); + V4 s0_3 = l0(-1.0, 0.0); + V4 s0_4 = l0(0.0, 0.0); + V4 s0_5 = l0(1.0, 0.0); + V4 s0_6 = l0(-1.0, 1.0); + V4 s0_7 = l0(0.0, 1.0); + V4 s0_8 = l0(1.0, 1.0); + V4 s1_0 = -max(-s0_0, 0.0); + V4 s1_1 = -max(-s0_1, 0.0); + V4 s1_2 = -max(-s0_2, 0.0); + V4 s1_3 = -max(-s0_3, 0.0); + V4 s1_4 = -max(-s0_4, 0.0); + V4 s1_5 = -max(-s0_5, 0.0); + V4 s1_6 = -max(-s0_6, 0.0); + V4 s1_7 = -max(-s0_7, 0.0); + V4 s1_8 = -max(-s0_8, 0.0); + s0_0 = max(s0_0, 0.0); + s0_1 = max(s0_1, 0.0); + s0_2 = max(s0_2, 0.0); + s0_3 = max(s0_3, 0.0); + s0_4 = max(s0_4, 0.0); + s0_5 = max(s0_5, 0.0); + s0_6 = max(s0_6, 0.0); + s0_7 = max(s0_7, 0.0); + s0_8 = max(s0_8, 0.0); + + V4 s2_0 = l1(-1.0, -1.0); + V4 s2_1 = l1(0.0, -1.0); + V4 s2_2 = l1(1.0, -1.0); + V4 s2_3 = l1(-1.0, 0.0); + V4 s2_4 = l1(0.0, 0.0); + V4 s2_5 = l1(1.0, 0.0); + V4 s2_6 = l1(-1.0, 1.0); + V4 s2_7 = l1(0.0, 1.0); + V4 s2_8 = l1(1.0, 1.0); + V4 s3_0 = -max(-s2_0, 0.0); + V4 s3_1 = -max(-s2_1, 0.0); + V4 s3_2 = -max(-s2_2, 0.0); + V4 s3_3 = -max(-s2_3, 0.0); + V4 s3_4 = -max(-s2_4, 0.0); + V4 s3_5 = -max(-s2_5, 0.0); + V4 s3_6 = -max(-s2_6, 0.0); + V4 s3_7 = -max(-s2_7, 0.0); + V4 s3_8 = -max(-s2_8, 0.0); + s2_0 = max(s2_0, 0.0); + s2_1 = max(s2_1, 0.0); + s2_2 = max(s2_2, 0.0); + s2_3 = max(s2_3, 0.0); + s2_4 = max(s2_4, 0.0); + s2_5 = max(s2_5, 0.0); + s2_6 = max(s2_6, 0.0); + s2_7 = max(s2_7, 0.0); + s2_8 = max(s2_8, 0.0); + + V4 s4_0 = l2(-1.0, -1.0); + V4 s4_1 = l2(0.0, -1.0); + V4 s4_2 = l2(1.0, -1.0); + V4 s4_3 = l2(-1.0, 0.0); + V4 s4_4 = l2(0.0, 0.0); + V4 s4_5 = l2(1.0, 0.0); + V4 s4_6 = l2(-1.0, 1.0); + V4 s4_7 = l2(0.0, 1.0); + V4 s4_8 = l2(1.0, 1.0); + V4 s5_0 = -max(-s4_0, 0.0); + V4 s5_1 = -max(-s4_1, 0.0); + V4 s5_2 = -max(-s4_2, 0.0); + V4 s5_3 = -max(-s4_3, 0.0); + V4 s5_4 = -max(-s4_4, 0.0); + V4 s5_5 = -max(-s4_5, 0.0); + V4 s5_6 = -max(-s4_6, 0.0); + V4 s5_7 = -max(-s4_7, 0.0); + V4 s5_8 = -max(-s4_8, 0.0); + s4_0 = max(s4_0, 0.0); + s4_1 = max(s4_1, 0.0); + s4_2 = max(s4_2, 0.0); + s4_3 = max(s4_3, 0.0); + s4_4 = max(s4_4, 0.0); + s4_5 = max(s4_5, 0.0); + s4_6 = max(s4_6, 0.0); + s4_7 = max(s4_7, 0.0); + s4_8 = max(s4_8, 0.0); + + V4 s6_0 = l3(-1.0, -1.0); + V4 s6_1 = l3(0.0, -1.0); + V4 s6_2 = l3(1.0, -1.0); + V4 s6_3 = l3(-1.0, 0.0); + V4 s6_4 = l3(0.0, 0.0); + V4 s6_5 = l3(1.0, 0.0); + V4 s6_6 = l3(-1.0, 1.0); + V4 s6_7 = l3(0.0, 1.0); + V4 s6_8 = l3(1.0, 1.0); + V4 s7_0 = -max(-s6_0, 0.0); + V4 s7_1 = -max(-s6_1, 0.0); + V4 s7_2 = -max(-s6_2, 0.0); + V4 s7_3 = -max(-s6_3, 0.0); + V4 s7_4 = -max(-s6_4, 0.0); + V4 s7_5 = -max(-s6_5, 0.0); + V4 s7_6 = -max(-s6_6, 0.0); + V4 s7_7 = -max(-s6_7, 0.0); + V4 s7_8 = -max(-s6_8, 0.0); + s6_0 = max(s6_0, 0.0); + s6_1 = max(s6_1, 0.0); + s6_2 = max(s6_2, 0.0); + s6_3 = max(s6_3, 0.0); + s6_4 = max(s6_4, 0.0); + s6_5 = max(s6_5, 0.0); + s6_6 = max(s6_6, 0.0); + s6_7 = max(s6_7, 0.0); + s6_8 = max(s6_8, 0.0); + + t0[gxy] = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t1[gxy] = f1(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t2[gxy] = f2(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t3[gxy] = f3(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); +} + +//!PASS 14 +//!DESC conv13 +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 +//!IN t0, t1, t2, t3 +//!OUT t4, t5, t6, t7 + +#define l0(x, y) V4(O(t0, float2(x, y))) +#define l1(x, y) V4(O(t1, float2(x, y))) +#define l2(x, y) V4(O(t2, float2(x, y))) +#define l3(x, y) V4(O(t3, float2(x, y))) + +V4 f0(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(4.141e-02, -6.620e-02, -1.132e-02, 5.022e-02, -5.448e-02, -8.153e-02, 4.273e-02, -3.380e-02, -1.015e-01, 1.128e-01, 2.486e-02, -1.044e-01, -5.736e-02, -3.646e-02, -1.570e-01, 1.355e-01)); + r += mul(s0_1, M4(1.785e-02, 1.196e-02, -1.048e-01, 3.621e-02, -2.967e-02, 1.030e-01, 1.395e-01, 3.486e-03, -1.067e-01, 2.549e-01, 1.270e-01, -6.500e-02, -4.027e-02, 2.598e-02, -4.203e-02, 4.186e-02)); + r += mul(s0_2, M4(4.931e-02, -1.715e-02, -4.240e-02, 1.342e-02, 8.863e-03, 2.048e-02, 5.713e-02, -2.556e-02, -1.334e-01, 1.752e-01, -3.173e-03, -1.130e-01, 4.557e-02, 1.311e-01, -2.369e-02, -1.715e-02)); + r += mul(s0_3, M4(4.337e-02, 1.125e-01, 2.961e-02, -8.226e-02, 5.584e-02, 3.195e-02, -4.691e-02, -2.575e-02, 1.433e-01, -1.298e-01, -2.059e-01, 6.369e-02, 1.473e-02, 8.115e-02, 1.104e-02, 1.601e-01)); + r += mul(s0_4, M4(-4.852e-03, -4.469e-02, 4.528e-02, -1.032e-02, 8.592e-02, -2.401e-02, -1.961e-01, -6.586e-02, 3.530e-01, 4.468e-01, -2.665e-01, 2.346e-01, 2.854e-01, -8.168e-02, -1.710e-01, 1.831e-01)); + r += mul(s0_5, M4(2.041e-02, -8.185e-02, 6.674e-02, 1.875e-02, 5.817e-02, 1.368e-01, -1.589e-02, -1.966e-02, 1.995e-01, 9.087e-02, 2.804e-03, 1.407e-01, 1.640e-01, -9.252e-02, -4.291e-02, 3.763e-02)); + r += mul(s0_6, M4(1.015e-01, 2.379e-02, -1.526e-01, -4.942e-02, 1.086e-01, -2.635e-03, 5.455e-02, -6.096e-02, -9.946e-02, 2.923e-01, -8.444e-02, 5.240e-02, 1.745e-02, -3.779e-02, 2.604e-02, -4.151e-03)); + r += mul(s0_7, M4(1.162e-02, -6.650e-03, -2.116e-01, 1.831e-02, 9.878e-02, 6.680e-02, 5.200e-02, 7.785e-02, 1.277e-01, -2.542e-01, 6.069e-02, 2.395e-01, -1.033e-01, -2.852e-02, -1.343e-01, -1.052e-01)); + r += mul(s0_8, M4(9.261e-02, 2.752e-02, -9.165e-02, 2.324e-02, 5.415e-02, -1.891e-02, -3.516e-02, 3.924e-03, 1.036e-01, 1.315e-01, -9.339e-02, 3.699e-02, 3.385e-02, -5.174e-02, -6.744e-02, 6.598e-02)); + r += mul(s1_0, M4(1.558e-02, -6.553e-02, -1.348e-02, 4.312e-03, -3.356e-03, -8.843e-02, 1.666e-02, 1.349e-02, -2.128e-02, -3.381e-02, 3.920e-02, -1.670e-02, -2.264e-02, 1.329e-02, -3.409e-02, -6.181e-02)); + r += mul(s1_1, M4(5.805e-03, 4.477e-02, 1.858e-02, -1.022e-02, 2.212e-02, -4.813e-02, -9.164e-02, -2.738e-02, 8.371e-02, 1.352e-03, -2.860e-02, 3.639e-02, -1.791e-02, -2.523e-02, 7.703e-02, 2.617e-02)); + r += mul(s1_2, M4(3.957e-02, -2.351e-03, 4.658e-02, -1.662e-02, 4.351e-02, -4.744e-02, -8.098e-02, 4.911e-02, -1.091e-03, 2.249e-03, -5.664e-03, 5.230e-02, 1.899e-02, 1.876e-02, 9.931e-03, -1.547e-02)); + r += mul(s1_3, M4(1.265e-01, 1.980e-02, -8.764e-02, 6.612e-02, -7.751e-02, -1.122e-02, 6.755e-02, -4.610e-03, -1.964e-02, 5.122e-03, -7.697e-02, 3.198e-02, 3.231e-02, 9.638e-02, 4.545e-03, -4.199e-02)); + r += mul(s1_4, M4(-5.894e-02, -1.329e-01, -1.192e-01, 1.160e-03, -1.037e-01, -1.072e-01, -4.378e-02, -7.303e-02, 7.073e-02, 5.396e-02, -1.280e-02, -5.782e-02, 1.773e-01, -1.077e-01, -6.754e-02, 1.033e-01)); + r += mul(s1_5, M4(2.713e-03, -7.180e-02, -7.877e-02, 2.297e-02, -7.703e-03, 7.134e-02, 3.480e-02, 3.646e-02, -2.446e-02, -2.648e-02, -8.801e-02, -2.624e-02, 3.275e-02, -7.984e-02, 1.388e-02, -1.384e-02)); + r += mul(s1_6, M4(5.089e-02, -3.647e-03, -1.665e-02, 3.789e-02, 1.489e-01, -1.081e-01, 1.731e-02, 7.075e-02, 5.898e-02, 7.116e-02, -1.541e-02, 5.454e-02, -6.869e-02, -1.348e-01, 6.366e-02, -9.688e-02)); + r += mul(s1_7, M4(8.425e-02, -4.745e-02, -4.129e-02, 3.008e-01, 5.933e-02, -2.940e-02, 9.550e-02, 7.856e-02, 1.088e-01, 4.056e-02, -1.131e-02, 6.527e-02, -2.267e-01, 9.660e-02, 8.604e-03, -8.723e-02)); + r += mul(s1_8, M4(8.051e-02, 2.875e-02, -3.348e-02, 3.590e-02, 8.823e-02, -3.079e-02, -6.701e-02, 5.085e-02, 7.678e-02, 3.990e-02, -1.671e-02, -2.194e-02, -8.302e-03, 6.172e-02, -3.764e-02, -8.722e-02)); + r += mul(s2_0, M4(-1.144e-01, -9.280e-02, 2.135e-01, -1.004e-01, 8.034e-02, 2.011e-02, -1.735e-02, 4.454e-02, 1.625e-01, -1.156e-01, 5.881e-02, -1.255e-01, -7.047e-02, 7.272e-02, 4.270e-02, -1.440e-02)); + r += mul(s2_1, M4(1.486e-01, -7.381e-02, -1.984e-02, 3.769e-02, 3.620e-02, -7.317e-02, -1.095e-01, 2.855e-02, 1.671e-02, -5.344e-02, -7.885e-02, 7.999e-03, -1.142e-01, 4.843e-02, 3.625e-02, 7.313e-03)); + r += mul(s2_2, M4(7.284e-02, 4.662e-02, 1.131e-01, -7.068e-03, -4.402e-02, -4.379e-02, -6.864e-02, 3.116e-03, 1.202e-01, 1.590e-02, -5.161e-02, -2.509e-02, -1.140e-01, 6.822e-02, -3.929e-02, -4.498e-02)); + r += mul(s2_3, M4(-5.160e-02, 9.767e-02, 9.134e-02, -5.806e-02, -4.408e-02, 3.057e-03, 7.317e-02, -1.084e-01, -1.695e-01, -2.958e-01, 2.613e-01, -3.620e-01, 1.144e-01, 4.105e-02, -1.840e-01, 5.694e-02)); + r += mul(s2_4, M4(-2.702e-01, -2.149e-01, -1.500e-02, -2.169e-01, -1.774e-01, 7.561e-02, -1.166e-01, -1.276e-01, -1.435e-03, -5.159e-02, -2.791e-01, -2.208e-02, -1.261e-01, 6.767e-02, -7.217e-03, 6.273e-02)); + r += mul(s2_5, M4(9.956e-03, 2.633e-03, 2.125e-01, -1.653e-01, 3.382e-02, -7.555e-02, -5.575e-02, -2.742e-02, 4.812e-02, 3.444e-02, -1.328e-01, -1.345e-01, -5.003e-02, -2.473e-02, 5.229e-03, -5.086e-02)); + r += mul(s2_6, M4(-4.304e-02, 7.811e-02, 3.581e-02, 1.016e-01, 4.841e-02, 9.474e-03, -1.344e-01, -2.150e-02, 2.074e-02, 1.518e-01, -2.535e-03, -7.863e-02, -1.250e-01, -3.870e-02, 2.042e-02, 2.218e-02)); + r += mul(s2_7, M4(-1.801e-01, -1.262e-02, 9.160e-02, -2.435e-02, 1.284e-01, -1.978e-02, -6.965e-02, 2.254e-01, 1.300e-02, -5.303e-02, 1.294e-01, 3.205e-01, 2.125e-01, 1.100e-01, -1.555e-01, 2.775e-01)); + r += mul(s2_8, M4(-1.720e-01, 6.926e-02, -6.922e-02, -2.284e-01, 7.362e-02, 6.335e-02, -5.382e-02, 4.740e-02, -3.982e-02, 2.725e-02, 3.252e-02, -7.091e-02, -1.415e-02, 4.437e-02, 9.472e-02, 2.852e-02)); + r += mul(s3_0, M4(-3.278e-02, 2.729e-03, 6.004e-02, -1.436e-02, 1.062e-01, 1.824e-02, 7.212e-03, 3.931e-02, -2.166e-02, 1.406e-03, -1.046e-01, 1.478e-02, -6.831e-02, 4.965e-03, -5.771e-02, -1.770e-02)); + r += mul(s3_1, M4(-4.265e-02, 4.044e-02, 7.482e-02, 3.673e-02, -4.646e-02, 4.971e-02, -1.064e-01, -7.038e-02, 6.565e-03, -4.373e-03, -7.081e-02, -5.474e-02, 6.192e-04, 5.023e-02, 4.560e-02, 2.352e-02)); + r += mul(s3_2, M4(-3.566e-06, 3.208e-02, 1.266e-02, 2.033e-02, -3.041e-02, 2.652e-02, -3.761e-02, 2.411e-02, -6.918e-03, -3.238e-02, -4.250e-02, 1.925e-02, -7.340e-03, 1.245e-02, 3.399e-02, -2.518e-02)); + r += mul(s3_3, M4(8.491e-02, 2.422e-02, -4.230e-02, -4.731e-02, -7.405e-02, 1.836e-02, 1.932e-02, -1.100e-01, 8.063e-03, 1.991e-02, 9.470e-03, -1.448e-02, 4.615e-02, 1.156e-01, 2.012e-02, 4.059e-02)); + r += mul(s3_4, M4(1.380e-01, 2.457e-02, -1.354e-01, 6.016e-02, -6.588e-02, 1.419e-01, 1.135e-02, 7.055e-03, -5.355e-02, -2.477e-02, 4.363e-02, -1.144e-01, -1.527e-01, -2.229e-03, 1.809e-01, 4.934e-02)); + r += mul(s3_5, M4(6.089e-02, -6.852e-02, -8.328e-02, 1.592e-02, 1.130e-01, -3.196e-02, 7.612e-02, 2.826e-02, -6.319e-02, -1.673e-02, 4.322e-02, -8.615e-03, -1.638e-03, 2.452e-02, -3.442e-03, -2.506e-02)); + r += mul(s3_6, M4(-2.053e-02, 2.803e-02, 5.890e-03, 7.126e-02, -2.036e-02, -7.027e-02, -3.477e-02, 3.904e-02, -4.978e-02, -1.326e-02, -1.908e-03, -3.546e-02, -4.788e-02, 1.063e-01, 3.857e-02, -5.291e-02)); + r += mul(s3_7, M4(-9.241e-02, -5.720e-02, -6.293e-02, 1.304e-01, -3.444e-02, 5.718e-02, -7.650e-02, 7.219e-02, 1.636e-02, -1.342e-02, 2.611e-03, 1.026e-02, 7.974e-02, 1.007e-01, 1.014e-01, 2.116e-01)); + r += mul(s3_8, M4(-2.475e-02, 1.300e-02, 5.130e-02, 1.268e-01, 1.954e-02, 3.569e-02, -8.627e-02, -7.619e-02, 3.559e-02, 4.537e-02, 2.744e-02, 3.091e-02, 3.093e-02, -2.184e-03, 1.678e-02, -2.247e-02)); + r += mul(s4_0, M4(-6.316e-02, -8.194e-03, -1.663e-02, -1.174e-02, 9.211e-04, -1.028e-01, 3.682e-03, -1.636e-02, 8.008e-03, 3.940e-02, -3.416e-03, 4.771e-03, 5.515e-02, -3.139e-02, -9.479e-02, 3.571e-02)); + r += mul(s4_1, M4(2.325e-02, 8.383e-02, -2.387e-02, 4.355e-02, 1.666e-02, 3.317e-03, 1.584e-02, 3.469e-02, -2.404e-04, -6.334e-02, 1.957e-02, 5.153e-02, 2.300e-02, -4.056e-02, -8.582e-02, 7.260e-02)); + r += mul(s4_2, M4(-4.150e-02, 1.327e-02, 6.573e-03, 4.525e-03, 1.983e-02, -5.126e-02, -2.040e-02, -9.515e-03, -3.293e-03, 1.014e-02, -2.866e-02, 2.285e-02, -2.265e-02, -2.875e-02, -4.797e-02, -8.084e-02)); + r += mul(s4_3, M4(7.625e-02, -2.013e-02, -5.754e-02, 1.408e-02, -3.044e-02, -2.811e-02, -5.332e-02, -9.756e-03, -4.689e-02, 2.628e-02, -5.628e-02, 4.199e-02, 3.371e-02, -6.367e-02, 6.160e-03, 6.184e-02)); + r += mul(s4_4, M4(-1.169e-01, 2.696e-02, 7.835e-02, 1.769e-03, -1.204e-01, 2.394e-02, -5.374e-02, -2.369e-01, 2.384e-03, 1.122e-01, -1.815e-02, 9.182e-02, 6.527e-03, -6.919e-02, -1.969e-02, -7.163e-02)); + r += mul(s4_5, M4(-1.474e-02, -1.279e-02, -1.197e-02, -1.539e-02, -3.199e-02, 2.429e-02, 4.874e-02, 8.309e-05, 6.069e-02, -9.755e-02, -1.120e-01, 4.888e-02, -1.639e-02, 9.998e-02, 4.820e-02, -8.561e-02)); + r += mul(s4_6, M4(-6.376e-02, 2.606e-02, -1.121e-01, -3.997e-04, -1.059e-01, -8.696e-02, 2.277e-02, -1.555e-02, 2.321e-03, -1.682e-02, -8.266e-03, -4.173e-02, -5.731e-02, 9.822e-02, 5.153e-02, -2.178e-02)); + r += mul(s4_7, M4(2.946e-02, -1.019e-02, 5.550e-03, 9.156e-02, -1.290e-01, -9.453e-03, 7.614e-02, -9.659e-02, -9.576e-02, -2.089e-01, -1.220e-01, -2.603e-01, -1.564e-01, 1.091e-01, 1.010e-01, -2.357e-01)); + r += mul(s4_8, M4(-1.070e-02, -5.792e-02, -3.742e-02, 8.461e-03, 3.716e-02, -3.181e-02, 6.353e-03, 7.121e-02, -8.827e-02, -4.466e-02, -9.925e-04, -2.016e-02, -2.325e-02, 2.569e-02, -1.307e-02, -1.550e-01)); + r += mul(s5_0, M4(-7.021e-02, -5.956e-02, 1.236e-01, -1.058e-01, 1.359e-02, -9.547e-02, -1.473e-01, -1.460e-02, 3.398e-03, 2.339e-03, -4.774e-02, 4.883e-02, -5.353e-02, -4.559e-02, 1.437e-03, 3.843e-02)); + r += mul(s5_1, M4(-1.480e-01, 1.544e-01, 7.907e-02, -2.377e-01, -3.106e-02, 2.459e-01, 9.445e-02, -3.707e-03, -2.426e-02, 7.361e-03, -7.039e-02, -1.299e-02, -1.066e-02, -2.557e-02, -1.988e-01, 2.998e-02)); + r += mul(s5_2, M4(-9.891e-03, 3.242e-02, -5.727e-02, -4.602e-02, -2.228e-02, 1.389e-01, -1.326e-02, -8.314e-02, -1.987e-02, -3.938e-02, 2.049e-02, 4.203e-02, -2.140e-02, -2.455e-02, -9.610e-02, -6.004e-02)); + r += mul(s5_3, M4(9.126e-02, -7.572e-02, 5.318e-02, -9.806e-02, -8.060e-02, 1.901e-01, 2.908e-02, -8.675e-02, -2.088e-02, -1.928e-02, 1.792e-02, 8.698e-02, 1.420e-01, 4.968e-02, -5.260e-02, 1.072e-02)); + r += mul(s5_4, M4(-1.412e-01, 8.703e-02, 2.206e-01, -2.432e-02, -1.159e-01, 2.180e-01, -3.190e-01, -2.901e-01, 1.263e-02, -7.523e-02, 1.116e-01, 8.989e-02, 1.445e-01, 1.655e-01, 8.037e-02, 7.833e-02)); + r += mul(s5_5, M4(6.820e-02, -6.786e-02, 1.965e-02, 1.404e-03, 3.270e-02, 1.208e-01, 6.165e-02, -2.121e-01, 5.809e-02, -6.507e-02, -8.565e-02, -7.551e-02, 5.602e-02, 2.850e-02, 7.971e-02, -8.865e-03)); + r += mul(s5_6, M4(1.069e-01, -5.015e-02, -1.065e-01, 8.655e-02, -9.331e-03, 3.379e-02, 7.811e-03, 7.530e-03, 5.707e-02, 8.318e-02, 2.182e-02, -6.878e-03, -5.290e-02, -2.063e-02, -1.833e-02, -5.179e-02)); + r += mul(s5_7, M4(-4.091e-03, -4.725e-03, 5.285e-02, 5.689e-02, 2.501e-02, 1.192e-01, -1.275e-01, 5.202e-02, -2.421e-02, 8.988e-02, -3.053e-02, -1.231e-01, -1.260e-01, 4.334e-02, 2.688e-02, -8.457e-02)); + r += mul(s5_8, M4(6.478e-02, -1.301e-01, -4.297e-02, 8.666e-02, -3.498e-02, 3.045e-02, -4.299e-02, 2.292e-02, -2.781e-02, -1.764e-02, -2.209e-02, -2.507e-02, 1.476e-02, 3.149e-03, -4.379e-02, -3.836e-02)); + r += mul(s6_0, M4(3.491e-02, 3.212e-03, 6.530e-02, 8.442e-03, -3.985e-02, -4.695e-02, -4.522e-02, -6.292e-03, 1.154e-02, 3.974e-02, -1.493e-02, -1.318e-02, -3.157e-02, -4.850e-02, 3.412e-03, -2.990e-02)); + r += mul(s6_1, M4(-7.500e-02, -5.865e-02, 4.797e-02, 8.277e-02, 6.952e-02, 1.155e-01, -5.639e-02, -2.254e-03, -9.671e-02, 6.667e-02, -6.871e-02, -1.310e-02, -3.762e-02, 2.719e-02, -6.958e-02, -7.557e-02)); + r += mul(s6_2, M4(1.623e-02, 4.220e-02, -7.569e-03, 1.946e-02, -3.877e-02, -1.262e-01, 9.872e-03, -3.236e-03, 1.945e-02, 5.039e-02, -1.551e-01, 6.697e-02, 1.010e-02, -1.044e-02, -1.352e-02, -4.554e-03)); + r += mul(s6_3, M4(7.151e-02, 5.049e-02, 4.138e-02, 5.704e-02, 1.810e-01, -3.868e-02, 3.789e-02, 1.133e-03, -7.775e-02, -3.426e-02, -6.087e-02, -7.503e-02, -9.109e-02, 2.326e-02, -5.660e-02, 2.871e-02)); + r += mul(s6_4, M4(-6.362e-02, 2.525e-01, 9.566e-02, 3.626e-02, 1.463e-01, -2.089e-01, -1.323e-01, 1.257e-01, -7.023e-02, 7.012e-02, -1.454e-01, -2.342e-02, -8.142e-02, 6.109e-02, -7.436e-02, -8.377e-02)); + r += mul(s6_5, M4(-1.045e-01, -8.608e-02, 3.267e-02, 6.552e-02, 6.730e-03, 6.657e-02, -2.295e-02, -3.188e-02, -5.740e-02, -5.613e-04, -1.379e-01, -1.088e-01, 3.836e-03, 3.775e-02, -1.526e-02, 4.745e-02)); + r += mul(s6_6, M4(2.710e-02, 1.692e-01, 1.235e-01, 3.099e-02, 1.371e-02, -6.910e-02, -2.846e-02, 2.167e-02, -1.561e-02, -8.469e-02, 1.648e-02, 1.011e-03, -1.081e-03, -3.891e-02, -1.399e-01, 2.680e-02)); + r += mul(s6_7, M4(1.295e-01, 6.213e-02, 2.126e-01, 4.305e-03, -1.509e-01, -3.575e-02, 4.243e-02, 1.890e-01, -1.112e-01, -1.203e-01, -7.555e-02, -8.316e-02, -7.615e-02, 3.685e-02, 5.208e-02, 5.158e-02)); + r += mul(s6_8, M4(1.497e-02, -3.588e-02, 1.041e-01, -3.959e-02, 6.392e-02, 2.749e-02, 3.729e-02, 3.639e-02, 3.821e-03, -4.464e-02, -5.107e-02, 4.252e-02, 2.359e-02, 1.211e-03, 6.559e-02, 8.423e-02)); + r += mul(s7_0, M4(4.269e-02, 1.448e-02, -7.251e-02, 4.434e-02, 8.679e-03, -1.043e-01, 3.841e-02, 2.695e-02, 6.740e-02, -2.644e-03, -3.486e-02, 7.661e-03, -6.166e-02, 3.065e-02, 8.044e-02, -7.941e-02)); + r += mul(s7_1, M4(-8.077e-02, -2.410e-02, -2.501e-02, 8.880e-03, 2.563e-02, 5.505e-02, -4.794e-02, -1.256e-02, 1.219e-02, -1.130e-02, 4.149e-02, -4.619e-03, 3.638e-02, -7.627e-02, -6.329e-02, -6.666e-02)); + r += mul(s7_2, M4(-6.696e-02, 2.772e-02, -2.924e-02, -8.234e-04, -3.507e-02, -3.574e-02, -8.502e-03, -5.329e-02, -6.518e-02, 2.003e-02, 6.235e-02, 2.691e-03, 5.237e-02, 1.363e-02, -4.233e-03, 1.431e-02)); + r += mul(s7_3, M4(-1.845e-02, 7.724e-03, -7.974e-02, 4.336e-02, -3.622e-02, 1.163e-01, 1.091e-01, 2.923e-02, -4.799e-02, -8.489e-02, 3.857e-02, -2.627e-02, 1.565e-02, -6.398e-02, -1.880e-01, 9.351e-02)); + r += mul(s7_4, M4(-7.986e-02, 1.074e-01, -2.022e-01, -2.343e-02, -1.010e-01, -2.735e-02, -2.889e-02, 8.426e-02, -5.666e-02, -2.074e-01, 8.822e-02, -2.570e-01, -5.235e-02, 5.873e-02, 7.100e-03, -4.525e-02)); + r += mul(s7_5, M4(1.071e-01, -1.071e-01, -1.074e-01, -3.666e-03, 5.386e-02, 7.296e-02, 2.242e-02, 1.896e-03, -7.017e-02, 2.575e-02, -9.618e-03, -3.774e-02, 2.857e-02, 5.077e-02, 6.278e-02, 1.436e-01)); + r += mul(s7_6, M4(1.732e-02, -5.917e-02, -6.042e-02, 4.714e-02, 3.632e-02, -1.275e-02, -4.554e-02, 3.627e-02, -4.395e-02, -1.144e-02, 6.404e-02, 3.403e-02, -1.123e-02, 6.191e-02, 5.405e-02, -1.169e-03)); + r += mul(s7_7, M4(1.677e-01, -9.623e-02, -1.186e-02, 9.234e-02, -5.493e-02, 2.045e-02, -1.244e-01, 1.381e-01, -1.582e-02, 5.308e-03, 1.022e-02, -2.167e-01, -5.924e-02, -2.163e-02, 2.311e-02, 2.575e-02)); + r += mul(s7_8, M4(1.005e-01, 1.794e-02, -1.286e-01, -3.952e-02, 5.529e-03, 5.189e-02, 3.473e-02, 1.438e-02, -9.109e-02, -2.932e-02, 1.696e-02, -4.435e-02, -7.043e-02, 4.999e-02, -3.583e-03, 7.583e-03)); + r += V4(5.137e-03, -9.318e-03, -1.525e-02, 7.307e-03); + return r; +} + +V4 f1(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-2.355e-02, 3.296e-02, -3.112e-02, -2.420e-02, 1.337e-01, -1.307e-02, -2.977e-02, 9.591e-02, -2.963e-02, 8.426e-02, 1.922e-02, 6.205e-02, -1.764e-01, -8.246e-02, -9.129e-02, 1.603e-01)); + r += mul(s0_1, M4(-4.793e-02, -8.006e-02, -5.812e-02, 6.274e-02, 2.285e-01, -9.298e-02, -1.421e-02, 6.073e-02, 9.368e-02, -9.190e-02, 1.002e-01, -1.052e-01, -7.702e-02, 2.329e-01, 2.498e-02, -1.130e-01)); + r += mul(s0_2, M4(2.014e-02, -3.787e-03, 6.612e-03, 3.495e-02, 1.220e-01, -1.040e-01, -4.782e-02, -1.094e-01, -4.148e-02, -4.323e-02, -7.381e-02, -1.293e-01, 1.620e-02, -4.429e-02, 8.386e-03, -9.178e-02)); + r += mul(s0_3, M4(-6.812e-02, -9.483e-02, 2.104e-01, -9.087e-02, 5.849e-02, -1.023e-01, -8.344e-02, 3.854e-02, -3.597e-01, -2.107e-02, -2.478e-01, 2.084e-01, -8.659e-02, 3.793e-02, -7.405e-02, 1.419e-01)); + r += mul(s0_4, M4(-1.178e-01, 1.949e-01, 1.408e-01, -1.079e-01, 8.445e-02, -4.453e-02, -2.549e-01, 1.182e-01, -4.696e-01, 1.053e-01, -2.247e-01, 2.390e-01, -1.133e-01, -1.850e-01, 1.923e-01, 1.488e-01)); + r += mul(s0_5, M4(-3.204e-02, -4.997e-02, 1.294e-01, -1.489e-01, 1.672e-01, -9.787e-03, -8.510e-02, -2.471e-03, -1.163e-02, 2.536e-01, 1.850e-01, 2.570e-01, -5.157e-02, -9.404e-02, 5.323e-02, -2.672e-02)); + r += mul(s0_6, M4(1.199e-01, 5.749e-02, -1.579e-01, -2.987e-03, 4.631e-02, -7.230e-04, 4.758e-03, 3.372e-02, 2.937e-03, 5.282e-03, 1.157e-01, 4.203e-03, -3.622e-01, 9.459e-02, -8.716e-02, 7.281e-02)); + r += mul(s0_7, M4(-4.052e-02, 8.018e-02, -9.348e-02, 1.070e-01, 1.703e-01, -1.062e-01, 1.111e-01, -8.738e-02, 6.301e-02, -1.002e-01, 2.808e-02, 1.008e-02, -9.902e-02, -6.596e-02, -1.198e-01, 5.289e-02)); + r += mul(s0_8, M4(-1.094e-02, -6.197e-02, 3.224e-02, 1.337e-01, 1.200e-01, -1.145e-01, 7.973e-03, 4.485e-02, -9.850e-02, -2.906e-02, -6.900e-02, 2.700e-02, -4.982e-02, -1.381e-02, -4.235e-02, 7.607e-02)); + r += mul(s1_0, M4(4.432e-02, 3.255e-03, -1.106e-02, 3.922e-03, -8.093e-02, 4.205e-02, -4.581e-03, -5.722e-02, -8.181e-04, 6.928e-03, 4.826e-03, -2.181e-02, -1.968e-02, 2.710e-02, 4.843e-02, 2.190e-02)); + r += mul(s1_1, M4(-1.437e-02, -2.659e-02, 1.607e-02, 3.518e-02, -4.626e-02, -6.232e-02, -4.290e-03, 9.698e-03, 4.383e-02, -1.006e-01, 3.067e-02, -9.389e-03, 5.026e-03, 2.198e-01, 9.707e-03, 4.045e-02)); + r += mul(s1_2, M4(-2.218e-02, -7.174e-02, 1.961e-04, 4.329e-02, -3.113e-02, -6.908e-03, -2.772e-02, 2.195e-02, -2.089e-02, 7.784e-02, 2.704e-02, 1.087e-02, 4.724e-02, 2.037e-02, -4.994e-02, -5.616e-02)); + r += mul(s1_3, M4(-1.365e-01, -1.411e-01, 1.842e-02, -4.131e-02, -8.218e-02, -6.265e-02, -6.018e-02, -3.876e-02, -4.951e-02, 1.718e-02, 6.618e-02, 8.092e-03, 2.514e-01, 1.053e-01, 3.172e-02, -2.182e-02)); + r += mul(s1_4, M4(-6.162e-03, 7.960e-02, -9.711e-03, 4.101e-02, -1.553e-01, 2.222e-02, -1.430e-01, -8.064e-02, -3.765e-02, -7.107e-02, -1.621e-02, 6.533e-02, 4.012e-02, 1.249e-01, 3.522e-01, 2.842e-01)); + r += mul(s1_5, M4(9.114e-02, -4.403e-02, 4.894e-02, -2.185e-02, -7.740e-02, 7.062e-02, -6.714e-02, -6.360e-02, -2.117e-02, 1.966e-02, 5.892e-02, 2.980e-02, -2.791e-02, -7.889e-03, 1.397e-01, -4.555e-02)); + r += mul(s1_6, M4(2.624e-02, -2.347e-02, 7.362e-02, -1.315e-01, -4.644e-02, 3.628e-03, -3.379e-02, -2.500e-02, -2.819e-04, -1.098e-02, -5.829e-02, 2.258e-02, 1.219e-01, -2.299e-05, 4.017e-02, 6.028e-02)); + r += mul(s1_7, M4(-6.700e-02, 1.226e-01, -1.034e-01, 2.465e-02, 5.769e-02, -3.604e-02, 6.603e-02, -9.597e-02, -1.400e-02, -2.878e-02, 1.592e-02, -7.906e-02, 1.371e-01, -3.026e-02, -7.622e-03, 1.931e-01)); + r += mul(s1_8, M4(9.961e-03, -6.016e-02, -7.028e-03, 3.942e-02, -3.351e-02, -4.909e-02, -4.676e-02, 1.124e-03, -1.712e-02, 3.273e-02, 3.916e-02, -2.822e-03, -2.449e-03, -6.221e-02, 8.854e-03, 5.159e-02)); + r += mul(s2_0, M4(-1.475e-01, 1.531e-01, 7.687e-02, 3.918e-02, -8.268e-02, 8.104e-02, -2.995e-02, 1.998e-03, 1.443e-03, -1.290e-01, 9.060e-02, -1.169e-01, -1.097e-01, -2.346e-02, 8.907e-02, -2.857e-02)); + r += mul(s2_1, M4(1.968e-01, 1.523e-01, -1.131e-01, -2.772e-02, -5.298e-02, 4.750e-02, 6.926e-03, 2.808e-02, 6.309e-02, 1.446e-01, -4.539e-02, 6.421e-02, -2.716e-01, 4.423e-02, 1.206e-01, 8.484e-02)); + r += mul(s2_2, M4(5.007e-02, 1.354e-02, 8.236e-03, -8.577e-02, -1.924e-02, 1.052e-01, 1.844e-02, -3.665e-03, 6.377e-02, -1.254e-01, -1.168e-01, -9.514e-02, 3.941e-02, -8.821e-02, 5.721e-02, 2.076e-02)); + r += mul(s2_3, M4(-1.420e-01, 2.196e-01, 1.402e-02, 1.813e-01, -5.681e-02, 2.581e-02, 3.326e-02, -1.044e-01, -1.836e-01, -1.137e-01, 1.483e-01, -1.946e-01, 2.172e-02, -6.671e-02, -1.008e-01, 9.928e-02)); + r += mul(s2_4, M4(8.464e-02, 1.939e-01, -5.625e-02, -1.635e-01, 3.426e-02, -1.247e-02, -1.889e-01, 2.819e-02, 2.517e-01, 4.228e-01, 1.090e-02, -1.809e-02, 3.795e-02, 6.264e-02, 4.873e-02, 1.749e-01)); + r += mul(s2_5, M4(-9.532e-02, 4.131e-01, 6.408e-02, 1.424e-01, -1.770e-02, 2.033e-02, 3.604e-02, -2.169e-02, 2.669e-02, -6.641e-02, -4.143e-02, -4.834e-02, -6.407e-02, -1.596e-03, -7.999e-03, -6.714e-02)); + r += mul(s2_6, M4(1.511e-02, 1.173e-01, 8.768e-02, 3.224e-02, 1.244e-02, 4.711e-02, 3.580e-02, 2.181e-02, 4.199e-02, -4.670e-02, 4.122e-02, 6.350e-02, 1.441e-01, -1.958e-01, 5.897e-02, -8.286e-03)); + r += mul(s2_7, M4(5.551e-02, 1.052e-01, -1.443e-01, -5.598e-02, 8.887e-02, -9.084e-02, 2.679e-02, -6.200e-02, 4.895e-02, -2.826e-02, -2.257e-02, -2.243e-02, -9.582e-03, 4.050e-02, -2.564e-01, 3.372e-01)); + r += mul(s2_8, M4(6.303e-02, 1.638e-01, 2.913e-02, 2.016e-02, -4.983e-02, -2.189e-02, 2.401e-02, -1.876e-02, 2.361e-02, 3.606e-02, 9.776e-03, -4.713e-02, -9.113e-03, -1.176e-02, 1.776e-03, 4.181e-02)); + r += mul(s3_0, M4(-3.698e-02, -7.844e-02, 3.304e-02, 1.946e-02, 2.104e-02, 1.238e-01, -3.353e-02, -5.077e-03, 6.806e-03, -1.067e-01, 1.479e-02, 2.172e-02, -5.576e-02, 5.420e-03, 6.912e-02, -8.622e-02)); + r += mul(s3_1, M4(1.883e-02, 7.470e-02, -1.346e-02, 3.899e-03, -1.025e-01, -1.516e-01, -1.512e-01, 7.255e-04, 2.723e-03, -5.665e-02, 3.034e-02, 3.748e-02, -9.337e-02, 9.985e-02, -8.224e-02, 8.647e-02)); + r += mul(s3_2, M4(5.797e-02, -6.478e-02, -1.018e-01, -1.559e-02, -6.313e-02, 5.765e-02, -7.845e-03, -5.224e-02, 1.853e-02, -5.100e-03, -6.391e-02, -9.475e-03, 4.800e-02, 5.181e-02, -8.398e-02, -4.074e-02)); + r += mul(s3_3, M4(9.260e-02, 1.461e-01, -3.438e-02, 1.098e-02, -9.020e-02, 3.844e-02, 1.045e-01, -1.025e-02, -1.485e-01, 5.880e-02, -6.117e-02, -2.831e-02, 2.787e-02, 3.503e-02, -6.832e-03, 5.772e-02)); + r += mul(s3_4, M4(-8.313e-02, 2.058e-01, -3.602e-02, 1.008e-01, 1.512e-02, 9.869e-02, -1.041e-01, -9.628e-02, -4.995e-04, 8.158e-02, 7.221e-02, -6.046e-02, 7.551e-02, 2.327e-01, 1.294e-02, -7.074e-02)); + r += mul(s3_5, M4(-3.551e-02, -1.121e-02, -1.310e-01, -7.403e-03, -9.578e-02, 8.996e-02, -3.934e-02, 5.779e-02, -3.206e-02, 6.389e-03, 1.956e-02, -1.075e-01, 5.801e-02, -4.545e-02, -4.307e-02, -2.752e-02)); + r += mul(s3_6, M4(1.101e-01, 1.159e-02, 3.846e-02, -4.415e-02, -1.184e-01, 3.789e-02, -1.983e-02, 5.537e-02, 6.800e-02, -2.283e-02, 2.770e-02, 7.486e-03, 9.361e-02, -1.646e-02, 1.286e-02, -3.693e-02)); + r += mul(s3_7, M4(-4.379e-03, 5.815e-02, -4.533e-02, 2.994e-02, 1.210e-01, -3.824e-02, -4.413e-02, 1.902e-02, -2.501e-02, 6.130e-03, 6.869e-03, 4.077e-02, -6.249e-02, 5.397e-02, -2.537e-02, 5.363e-02)); + r += mul(s3_8, M4(3.918e-02, -5.312e-02, 1.762e-02, -9.313e-02, -1.263e-01, 2.528e-02, 4.375e-03, 1.167e-01, -3.206e-02, 2.798e-02, -1.405e-03, 6.325e-02, 1.910e-02, -4.898e-02, -6.247e-02, -6.990e-02)); + r += mul(s4_0, M4(-6.139e-02, 5.437e-02, 2.453e-02, -4.600e-02, 9.849e-02, 5.693e-02, 1.948e-02, -5.378e-02, 3.049e-02, 1.166e-02, -3.754e-02, 4.416e-02, 1.464e-01, -3.982e-02, -6.770e-02, -1.988e-02)); + r += mul(s4_1, M4(-6.238e-02, 9.132e-02, 2.410e-02, 5.254e-02, 1.018e-01, -1.521e-01, -4.153e-02, 7.522e-02, -3.337e-02, -1.002e-01, -1.748e-02, 2.526e-02, -6.027e-02, 8.025e-02, -6.918e-02, 8.623e-02)); + r += mul(s4_2, M4(-1.953e-02, 9.979e-03, 9.253e-03, -2.069e-02, 1.839e-02, -6.225e-02, -5.314e-02, 5.695e-02, 4.989e-02, -1.253e-01, 3.972e-02, 9.918e-05, -3.562e-02, 3.550e-03, -8.320e-02, -2.578e-02)); + r += mul(s4_3, M4(-7.979e-02, 5.597e-02, -4.311e-02, 7.581e-02, -4.559e-03, 1.095e-01, 1.003e-02, -1.280e-01, 5.793e-02, 1.157e-02, 6.575e-03, 3.772e-02, 2.158e-01, -6.676e-02, -3.684e-02, -2.057e-02)); + r += mul(s4_4, M4(-8.690e-02, -7.181e-02, 2.561e-02, 9.186e-02, -1.037e-01, 1.092e-01, -8.658e-02, 2.412e-01, -1.142e-01, -1.252e-02, -7.673e-02, 9.523e-02, 1.178e-01, -6.940e-02, -9.813e-03, 9.323e-02)); + r += mul(s4_5, M4(3.644e-02, 4.980e-02, -6.765e-02, -7.746e-02, -1.077e-02, 1.492e-01, 4.657e-02, 2.160e-02, 1.068e-01, 2.339e-02, -1.746e-02, 4.236e-02, 4.431e-02, 2.937e-02, -1.591e-01, -2.176e-02)); + r += mul(s4_6, M4(-7.619e-02, -7.187e-02, -5.336e-02, 9.697e-03, -4.500e-02, -1.539e-02, 1.061e-02, 5.191e-03, -3.706e-03, 4.739e-02, -6.342e-02, 2.837e-02, 1.057e-01, -7.125e-02, -1.231e-02, -5.644e-02)); + r += mul(s4_7, M4(-6.363e-02, -1.806e-02, -1.648e-02, 1.506e-01, 5.504e-02, -1.806e-02, 6.314e-02, -5.645e-02, -6.528e-02, 1.484e-01, -1.558e-01, 1.457e-01, -3.353e-02, 8.053e-02, 7.623e-03, 1.454e-01)); + r += mul(s4_8, M4(-1.243e-02, -8.742e-02, -4.783e-02, 1.893e-02, -2.716e-02, -4.186e-02, -7.215e-03, 9.908e-03, -1.342e-02, -7.125e-02, 3.621e-02, 3.714e-02, 3.796e-03, -3.665e-02, -3.065e-03, -1.327e-02)); + r += mul(s5_0, M4(-9.733e-02, 8.479e-02, 1.697e-01, -1.471e-01, 8.367e-02, -9.701e-02, -3.827e-02, -2.734e-02, -5.654e-02, -6.484e-02, -8.206e-02, 5.448e-02, 2.060e-02, -3.717e-02, -6.715e-02, 1.540e-02)); + r += mul(s5_1, M4(-2.993e-01, -5.256e-03, 2.617e-01, -1.863e-01, -8.625e-02, -1.183e-02, 4.416e-02, 1.162e-01, -5.994e-02, -1.620e-01, -6.483e-02, 6.804e-02, -1.188e-01, -1.673e-01, -6.238e-02, 7.633e-02)); + r += mul(s5_2, M4(-1.263e-01, -6.865e-02, 7.806e-02, -8.792e-02, 1.829e-02, -1.938e-01, -5.768e-03, -4.756e-02, -3.244e-03, -3.858e-02, -1.668e-02, -9.638e-03, 3.290e-02, 3.288e-02, -7.609e-02, 2.349e-02)); + r += mul(s5_3, M4(-4.874e-02, 5.302e-02, -9.153e-02, 1.294e-01, 2.020e-02, 2.900e-02, -3.263e-05, -5.333e-02, 2.962e-02, -1.130e-01, 7.812e-02, 2.745e-02, 7.177e-02, -3.814e-03, -3.659e-02, -3.620e-02)); + r += mul(s5_4, M4(-3.291e-01, -1.647e-01, -1.479e-01, -1.474e-01, 1.411e-02, -2.628e-02, -2.961e-01, 4.556e-01, -1.681e-01, -2.356e-01, -1.208e-02, 2.806e-04, -8.358e-02, -1.067e-01, 5.848e-02, -1.800e-01)); + r += mul(s5_5, M4(1.800e-02, 4.092e-02, -1.346e-01, -1.005e-02, -6.972e-02, 3.784e-02, 1.267e-01, 5.999e-03, 3.652e-02, 1.367e-02, -1.292e-01, 3.011e-02, 2.985e-02, 2.337e-02, -3.303e-02, -1.028e-01)); + r += mul(s5_6, M4(-1.082e-01, 1.075e-02, -6.635e-02, -6.803e-02, -9.433e-02, 1.506e-02, -1.537e-02, 7.209e-02, 5.416e-03, 6.978e-04, -5.429e-02, -3.363e-02, 2.783e-02, -3.711e-03, -7.219e-02, 1.395e-02)); + r += mul(s5_7, M4(-5.227e-02, -2.485e-02, 8.963e-02, -3.228e-02, -7.512e-03, 2.353e-02, -2.470e-02, -6.803e-03, 2.963e-02, 4.069e-02, -4.585e-02, 2.629e-02, 7.656e-03, -6.855e-03, -1.474e-02, 5.023e-02)); + r += mul(s5_8, M4(-2.069e-02, -5.281e-02, -5.002e-02, 1.623e-03, 4.042e-02, -6.268e-02, 6.316e-02, 8.014e-03, -1.306e-02, 5.471e-02, -7.529e-02, -3.545e-02, -1.707e-04, 1.186e-02, -3.595e-02, 1.790e-02)); + r += mul(s6_0, M4(3.302e-02, 4.418e-03, -8.796e-02, 6.241e-02, -5.939e-02, -7.157e-02, 3.014e-02, -5.200e-02, -4.419e-02, 4.946e-02, 1.235e-02, -5.338e-02, 1.106e-02, -4.460e-02, 2.467e-02, 1.632e-02)); + r += mul(s6_1, M4(-1.165e-02, 1.717e-02, -4.187e-02, -5.148e-02, 6.087e-02, 1.062e-02, 7.774e-02, 1.445e-01, -2.212e-01, -2.557e-01, 6.949e-02, -4.760e-02, 1.232e-02, 7.268e-02, 2.847e-02, -3.986e-02)); + r += mul(s6_2, M4(1.145e-01, -3.325e-02, -1.196e-01, 1.100e-01, 2.360e-02, 2.100e-02, 7.523e-02, -4.792e-02, 6.078e-03, -9.426e-02, -1.088e-01, 3.007e-02, 1.658e-02, 3.352e-02, -6.354e-02, 1.246e-02)); + r += mul(s6_3, M4(1.542e-02, -6.429e-02, -4.317e-02, 4.337e-02, -8.402e-02, 7.670e-03, -8.973e-02, 1.792e-03, -1.674e-01, 4.020e-02, 4.307e-02, 3.281e-02, 1.149e-01, 1.195e-02, -4.625e-02, 7.528e-02)); + r += mul(s6_4, M4(1.931e-02, -2.168e-02, 1.550e-03, -2.958e-02, 7.771e-02, 8.194e-02, -3.328e-04, 2.268e-02, -2.748e-01, -1.987e-01, 4.499e-02, -1.982e-01, 1.425e-02, 1.992e-02, -1.424e-02, 1.139e-02)); + r += mul(s6_5, M4(1.625e-01, -1.027e-01, 1.266e-01, -1.504e-01, 2.596e-02, 2.140e-02, 9.871e-03, 1.368e-01, 2.167e-02, 6.120e-02, 3.605e-02, -1.278e-01, -3.467e-02, 4.308e-02, 8.625e-02, -2.846e-02)); + r += mul(s6_6, M4(3.814e-02, 7.893e-03, 2.085e-02, -2.793e-02, 3.963e-02, -2.560e-02, 3.084e-02, -6.913e-03, -1.248e-01, 9.007e-02, -1.532e-03, 5.562e-02, 3.947e-02, 1.783e-02, -1.404e-01, 3.774e-03)); + r += mul(s6_7, M4(1.173e-01, 2.692e-03, 9.529e-02, -6.932e-02, 3.259e-02, -1.284e-01, 4.636e-02, 8.723e-03, -8.999e-03, -3.237e-02, 3.534e-02, -3.240e-02, 5.066e-02, 3.524e-02, -5.775e-02, -8.170e-02)); + r += mul(s6_8, M4(1.331e-01, 2.378e-02, -1.813e-02, -3.624e-02, 1.946e-02, 2.003e-02, -1.204e-01, 2.374e-02, -5.333e-02, 1.888e-02, 4.138e-02, 2.068e-02, -5.053e-02, 3.120e-02, 1.305e-04, 2.335e-02)); + r += mul(s7_0, M4(-8.931e-03, 8.554e-03, -3.430e-02, 3.480e-02, 7.631e-03, 2.015e-02, -4.250e-02, 2.783e-03, -5.531e-02, 3.953e-02, -2.883e-02, 1.964e-02, 1.614e-02, -2.080e-02, 9.910e-02, -7.998e-02)); + r += mul(s7_1, M4(-1.219e-01, 3.186e-02, 6.263e-02, -6.382e-02, -7.854e-03, -1.781e-01, -2.866e-02, -2.123e-03, -1.213e-01, -1.335e-01, 6.055e-03, -5.242e-02, 7.391e-02, -2.211e-02, 2.785e-02, 9.733e-03)); + r += mul(s7_2, M4(-5.083e-02, 7.194e-02, 1.615e-03, 5.407e-02, 3.814e-02, -6.499e-02, 1.024e-01, -3.536e-02, 2.454e-02, -5.554e-02, 2.108e-02, -6.028e-02, -2.086e-02, 9.931e-02, -1.481e-02, 1.780e-03)); + r += mul(s7_3, M4(4.580e-02, -2.151e-02, -2.859e-02, -6.446e-02, -1.209e-01, -6.494e-02, 1.413e-01, -5.427e-03, 1.644e-01, 1.515e-02, 1.075e-02, -2.694e-02, 3.681e-02, -8.655e-05, -1.217e-01, 2.980e-02)); + r += mul(s7_4, M4(5.985e-03, 5.021e-02, -4.879e-02, 5.464e-03, -1.363e-01, -8.347e-03, 1.775e-01, -7.439e-02, 3.814e-02, -1.607e-01, -3.868e-02, 4.007e-02, 1.037e-01, -4.700e-02, -4.177e-02, -1.731e-02)); + r += mul(s7_5, M4(5.141e-02, -8.676e-02, 6.358e-02, 4.758e-02, 6.764e-02, -3.836e-02, -3.477e-02, 6.865e-02, -1.267e-01, -1.556e-01, -1.500e-02, -1.478e-02, -1.100e-02, 8.284e-02, 9.609e-02, -4.106e-02)); + r += mul(s7_6, M4(-4.043e-02, 3.920e-02, -2.731e-02, 1.030e-02, 2.214e-02, -3.011e-02, 7.946e-03, -5.982e-02, -5.416e-02, 1.414e-02, 7.464e-02, 1.179e-02, 2.691e-02, -2.210e-02, 6.503e-02, -9.833e-02)); + r += mul(s7_7, M4(-7.673e-02, 9.742e-03, 2.093e-02, -4.170e-02, 2.232e-02, -2.862e-02, -6.734e-02, 4.183e-02, 1.447e-02, 4.077e-02, 3.989e-03, 6.437e-02, 1.317e-02, 4.673e-03, -4.076e-02, -1.647e-01)); + r += mul(s7_8, M4(-5.286e-02, 4.923e-02, -9.718e-02, -2.947e-02, -3.456e-02, 1.459e-02, 3.428e-02, 2.702e-02, -1.755e-02, -2.393e-02, -1.549e-02, 4.208e-02, -5.462e-02, 4.807e-02, -1.638e-03, -1.464e-02)); + r += V4(-7.666e-03, 7.394e-03, -3.562e-03, -1.228e-02); + return r; +} + +V4 f2(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-3.406e-03, -2.751e-02, 2.389e-02, -2.671e-02, 9.890e-02, 6.479e-02, 4.287e-01, 2.984e-02, 7.607e-02, -3.654e-02, -1.230e-01, 1.394e-02, 1.981e-02, 1.227e-01, -6.546e-02, 4.504e-02)); + r += mul(s0_1, M4(-6.942e-03, 8.442e-03, -3.946e-03, -8.129e-02, 8.599e-02, 8.176e-02, -7.871e-02, 5.741e-02, 2.062e-01, 1.058e-02, -5.040e-02, 4.902e-03, 1.612e-01, 1.634e-02, -4.898e-02, -9.324e-02)); + r += mul(s0_2, M4(-2.069e-02, -2.451e-02, 2.637e-02, -5.626e-03, 6.668e-02, 4.335e-02, 1.039e-01, 8.448e-02, 1.873e-01, 3.773e-03, -2.043e-01, -8.218e-03, -8.518e-03, 5.852e-02, 2.851e-02, 2.286e-02)); + r += mul(s0_3, M4(1.137e-01, -1.327e-01, -1.789e-02, -1.100e-01, 9.085e-04, -4.401e-02, 1.561e-01, 6.896e-02, -2.459e-02, 1.479e-01, 1.197e-01, 1.124e-01, -1.879e-01, 3.314e-01, 1.166e-01, 1.139e-01)); + r += mul(s0_4, M4(1.211e-01, -3.114e-02, 2.034e-02, -8.814e-02, 9.038e-02, 6.309e-02, 2.457e-02, 1.404e-01, 3.895e-02, 2.724e-01, 5.470e-02, -1.407e-01, -8.583e-02, -4.419e-02, -2.949e-01, -1.601e-01)); + r += mul(s0_5, M4(-6.675e-03, 5.540e-02, 1.858e-02, -2.243e-02, 2.324e-02, 1.130e-02, 1.134e-02, 1.121e-01, -2.965e-02, -2.725e-02, -2.064e-01, -1.259e-01, -6.429e-02, -4.605e-02, -4.295e-02, 5.142e-02)); + r += mul(s0_6, M4(-4.172e-02, -1.160e-01, -1.172e-01, -7.617e-03, 9.909e-02, 2.588e-02, 1.209e-01, -6.817e-02, 1.413e-01, -8.298e-02, -2.084e-03, -1.172e-01, -4.519e-02, 3.606e-02, 4.065e-02, 2.651e-01)); + r += mul(s0_7, M4(1.167e-01, -6.684e-02, -1.963e-02, 6.528e-02, 1.105e-01, 7.529e-02, 3.613e-02, -1.494e-01, 1.167e-01, -7.575e-02, 1.563e-01, -7.482e-02, 3.625e-02, -9.058e-02, -4.330e-02, 1.325e-01)); + r += mul(s0_8, M4(1.954e-02, 1.990e-03, 2.500e-02, -9.505e-02, 1.029e-01, -6.343e-03, 1.386e-01, -6.028e-02, 7.436e-03, 5.685e-02, 1.285e-01, 9.548e-03, 1.340e-02, -2.372e-02, -3.000e-02, -3.586e-02)); + r += mul(s1_0, M4(1.495e-01, -7.398e-02, 5.967e-02, -3.157e-02, -2.459e-02, 5.986e-02, 1.171e-02, 1.771e-02, 2.790e-02, 2.876e-02, 1.154e-02, 7.359e-03, -3.539e-03, 7.870e-02, -1.706e-02, 2.702e-03)); + r += mul(s1_1, M4(4.107e-02, 3.702e-02, 1.844e-02, -1.665e-02, -9.427e-02, 1.276e-02, -1.905e-01, -3.633e-02, -4.983e-02, -1.865e-02, -4.267e-02, 5.087e-02, 8.844e-02, -1.910e-02, 2.550e-02, -3.833e-02)); + r += mul(s1_2, M4(-1.749e-02, 1.086e-02, 6.475e-02, 5.569e-03, -3.156e-02, -1.079e-02, -1.211e-02, -4.422e-02, 3.946e-02, -5.961e-02, -3.821e-02, -6.025e-02, 1.419e-02, 1.226e-02, 8.469e-02, 1.532e-03)); + r += mul(s1_3, M4(-1.309e-02, -6.999e-02, 2.224e-02, 1.539e-02, -8.830e-02, 9.210e-04, -1.607e-01, 1.475e-02, 1.783e-02, -1.197e-02, -2.315e-02, 3.797e-03, -5.802e-02, 6.780e-02, -8.185e-02, -1.038e-02)); + r += mul(s1_4, M4(1.126e-01, 5.824e-02, -1.136e-01, -1.214e-01, 7.254e-02, 1.392e-01, 4.652e-02, 4.163e-03, -5.078e-03, 1.296e-01, -1.353e-02, 1.771e-02, -7.262e-02, -1.636e-01, 1.676e-01, -1.440e-01)); + r += mul(s1_5, M4(-2.273e-02, -7.281e-02, -9.637e-02, 5.021e-02, -3.087e-03, 6.811e-02, -8.194e-02, -1.708e-02, -5.312e-02, 5.169e-03, -4.103e-02, -8.083e-02, 4.278e-03, -1.891e-02, 4.832e-02, 9.931e-02)); + r += mul(s1_6, M4(3.184e-02, 1.020e-01, 4.867e-02, 1.185e-01, -3.356e-02, 3.062e-02, -2.851e-03, 1.745e-03, -6.452e-02, 5.120e-02, 1.792e-02, 1.147e-02, 6.849e-02, -9.902e-02, -4.764e-02, 5.710e-02)); + r += mul(s1_7, M4(2.578e-02, 1.367e-01, -1.210e-02, -1.233e-01, -1.480e-02, -2.218e-02, -7.835e-02, -8.176e-02, -5.371e-03, 7.040e-02, 2.773e-02, 3.655e-02, -5.689e-02, 2.871e-02, 1.214e-01, 9.351e-02)); + r += mul(s1_8, M4(-6.080e-02, 1.763e-02, -3.189e-02, -1.273e-01, 3.649e-02, -4.435e-02, 3.761e-02, -7.953e-03, 2.349e-02, -3.095e-02, 1.142e-02, 4.297e-03, -2.715e-02, 4.936e-02, 1.082e-02, 9.799e-02)); + r += mul(s2_0, M4(-2.776e-02, 1.293e-01, -1.783e-01, 1.529e-01, -2.290e-02, -8.428e-02, 4.169e-02, 1.767e-02, 1.679e-02, 2.074e-02, 1.537e-01, -8.099e-02, 4.739e-02, -3.675e-02, 1.037e-03, -6.920e-02)); + r += mul(s2_1, M4(-2.531e-02, -2.582e-02, 1.969e-02, -1.393e-02, -5.260e-02, 1.181e-01, -6.617e-02, 5.117e-02, -3.257e-03, 5.455e-02, 6.795e-02, 3.913e-02, 5.635e-02, -9.876e-03, 1.546e-01, -3.741e-02)); + r += mul(s2_2, M4(4.920e-02, 6.231e-02, 9.032e-02, 1.876e-01, -8.728e-03, -3.089e-02, -1.952e-02, -2.917e-02, -9.372e-02, 8.909e-03, -4.601e-02, 1.724e-01, -4.023e-02, 7.348e-02, -9.672e-03, -5.886e-02)); + r += mul(s2_3, M4(-7.343e-03, 1.215e-01, 7.028e-02, 6.470e-02, 3.450e-02, -1.520e-01, -1.476e-02, -2.044e-02, 2.039e-01, -8.401e-02, -3.152e-02, 5.093e-03, 8.280e-02, -1.049e-01, 2.218e-01, -3.287e-03)); + r += mul(s2_4, M4(1.706e-01, -2.375e-01, 2.617e-02, 1.590e-01, 2.274e-01, 2.259e-01, 1.094e-01, 1.597e-01, -4.165e-01, 3.057e-01, -2.471e-01, -1.313e-01, 8.047e-02, 1.695e-01, -6.232e-02, 7.251e-02)); + r += mul(s2_5, M4(1.763e-01, -6.319e-02, 2.457e-01, 1.073e-01, -4.014e-02, -1.392e-02, -6.100e-02, -9.742e-02, 2.239e-01, 1.344e-01, 1.617e-01, 1.206e-01, 1.906e-01, -2.518e-02, 9.673e-02, 9.477e-02)); + r += mul(s2_6, M4(-1.280e-01, 1.866e-02, 1.189e-02, 1.655e-01, 2.222e-02, -5.139e-02, 5.157e-03, -7.063e-03, 6.341e-03, -6.532e-02, -8.119e-03, 2.360e-01, 2.154e-01, 2.693e-02, -8.017e-02, -1.507e-01)); + r += mul(s2_7, M4(-1.199e-01, 2.403e-02, -1.075e-01, 1.460e-01, 6.546e-03, 5.782e-02, 3.762e-02, 1.417e-02, -1.522e-01, 1.086e-01, 8.618e-03, -1.528e-03, 8.101e-02, -1.232e-01, -1.925e-02, -3.502e-01)); + r += mul(s2_8, M4(3.414e-02, -9.485e-02, -1.213e-01, 1.146e-01, 5.566e-02, 2.470e-02, 2.864e-02, 7.492e-03, 1.215e-03, 6.868e-03, 1.428e-01, 5.823e-02, 3.237e-02, 5.224e-02, -1.235e-02, 5.870e-03)); + r += mul(s3_0, M4(7.992e-03, 2.747e-02, 6.278e-04, 2.961e-02, -8.173e-02, -4.045e-02, -5.339e-02, -2.496e-02, 2.246e-03, -3.510e-02, -7.723e-02, -3.039e-02, 8.896e-02, -6.327e-02, 5.694e-02, -4.376e-02)); + r += mul(s3_1, M4(6.935e-02, 6.694e-02, 1.354e-01, 5.321e-03, 1.836e-03, 1.534e-01, -9.230e-02, 6.509e-02, -7.726e-02, 2.394e-02, 9.035e-02, 2.274e-02, -1.634e-02, -9.872e-02, 1.383e-01, -4.576e-03)); + r += mul(s3_2, M4(-1.918e-02, 5.700e-02, -1.148e-02, -5.842e-03, 3.914e-02, -7.829e-02, -7.173e-02, -3.783e-02, -6.737e-03, 3.288e-02, 1.354e-02, 1.546e-02, -6.535e-02, 1.595e-02, 7.187e-02, 4.985e-02)); + r += mul(s3_3, M4(4.359e-02, -9.839e-02, 2.936e-02, -6.255e-02, 3.457e-02, -8.771e-02, -6.488e-02, -5.237e-02, 5.229e-02, 1.695e-01, 3.978e-02, 4.679e-02, 5.440e-02, -5.050e-02, -8.147e-02, 2.267e-03)); + r += mul(s3_4, M4(1.393e-01, -7.356e-02, 1.537e-01, -4.392e-03, 6.915e-02, 3.751e-01, 9.750e-03, 1.061e-01, -2.043e-01, 1.080e-01, -5.034e-02, 7.642e-02, 1.655e-01, 8.132e-02, 1.714e-01, -4.305e-03)); + r += mul(s3_5, M4(-4.915e-02, 4.699e-03, 1.028e-01, -1.004e-01, -1.316e-02, -4.125e-02, 2.526e-02, -8.864e-02, 3.462e-02, 2.840e-02, -2.860e-02, 3.815e-02, 4.406e-02, -4.006e-02, 1.662e-02, 1.365e-01)); + r += mul(s3_6, M4(-9.936e-02, -4.912e-02, -2.813e-02, -3.454e-02, -2.135e-02, 4.073e-02, 2.829e-02, 7.408e-03, 8.254e-04, -1.549e-02, -3.958e-02, 6.670e-02, 1.801e-02, -6.790e-02, -1.916e-02, -2.464e-02)); + r += mul(s3_7, M4(5.843e-02, -6.666e-02, 3.866e-02, -6.407e-03, -1.351e-02, -1.384e-02, -7.414e-02, -2.238e-02, 2.566e-02, -6.237e-02, -2.566e-02, -7.310e-02, 5.082e-02, -6.057e-02, -6.063e-03, -7.529e-02)); + r += mul(s3_8, M4(4.991e-02, 8.658e-02, 1.033e-01, -1.294e-02, 1.401e-01, -1.581e-02, 8.427e-03, 8.901e-02, -7.779e-03, -3.619e-02, -2.896e-02, -3.628e-02, 4.216e-02, -1.539e-02, 6.614e-02, 1.200e-02)); + r += mul(s4_0, M4(3.201e-02, -2.314e-02, -9.402e-02, -5.038e-02, -1.166e-01, 5.423e-02, 6.861e-02, 1.893e-02, -1.840e-02, 9.847e-03, 6.309e-02, 1.178e-02, 2.019e-02, -5.657e-02, 1.314e-01, 1.558e-02)); + r += mul(s4_1, M4(-2.175e-03, 1.075e-02, 9.153e-02, -1.479e-02, -2.999e-02, -9.316e-02, -1.268e-01, 1.921e-02, -3.825e-02, 9.109e-02, 4.885e-03, -1.273e-02, 1.376e-01, -1.753e-01, -1.395e-02, 1.021e-02)); + r += mul(s4_2, M4(1.570e-02, 5.170e-02, -5.630e-02, -1.281e-02, 1.520e-02, -5.054e-03, 7.073e-03, -5.578e-02, -4.189e-02, 8.996e-02, -3.176e-02, 1.501e-02, 2.722e-02, -1.370e-02, 1.001e-01, 2.858e-02)); + r += mul(s4_3, M4(-5.160e-02, -7.019e-03, 6.312e-02, 6.056e-02, 3.499e-02, -1.070e-01, 5.695e-02, -3.497e-03, 7.793e-02, 8.020e-02, 3.886e-02, -5.442e-02, 3.345e-03, -5.526e-02, 1.428e-01, 3.020e-03)); + r += mul(s4_4, M4(2.241e-02, 1.776e-01, 2.629e-02, 1.097e-01, -1.603e-01, 2.221e-02, -1.667e-02, 1.837e-01, -6.043e-02, 2.459e-02, -1.244e-01, -5.165e-02, 1.008e-01, -3.515e-01, 9.694e-02, -1.964e-02)); + r += mul(s4_5, M4(-2.891e-02, 3.557e-03, -6.549e-02, 4.918e-02, -1.580e-01, 8.213e-03, -1.304e-02, -6.337e-02, -1.537e-01, -2.118e-02, -1.707e-01, -3.469e-02, 1.904e-01, -9.866e-02, 1.235e-01, 1.615e-01)); + r += mul(s4_6, M4(7.846e-03, -2.377e-02, 5.844e-02, 2.195e-02, 1.136e-02, -4.959e-02, 7.519e-03, -6.324e-02, 2.230e-02, -2.616e-02, 5.732e-02, 6.415e-02, 2.430e-02, -3.475e-02, -1.582e-02, -4.139e-02)); + r += mul(s4_7, M4(-1.231e-01, 2.511e-02, -7.017e-02, -1.087e-02, 7.429e-02, -2.531e-02, -3.772e-03, 3.162e-02, 4.332e-02, -1.309e-01, 3.291e-02, 1.481e-02, -4.270e-02, -8.337e-02, -3.627e-02, 1.626e-01)); + r += mul(s4_8, M4(5.311e-02, -5.032e-02, 6.109e-02, 1.034e-02, -3.633e-02, 3.182e-02, 1.081e-02, -7.439e-03, 5.875e-02, 6.472e-02, 3.018e-02, 7.406e-03, 2.786e-02, 2.914e-03, 4.435e-02, 1.405e-01)); + r += mul(s5_0, M4(-6.742e-02, -9.053e-02, -4.419e-01, -1.174e-01, 2.639e-02, -5.764e-02, 7.424e-02, 5.791e-02, -2.769e-02, 6.398e-02, -1.846e-02, -2.339e-02, -2.575e-02, 3.780e-02, 1.045e-02, -1.989e-02)); + r += mul(s5_1, M4(-2.244e-02, 1.453e-01, 9.197e-04, -1.394e-03, 1.953e-01, -9.646e-02, 3.490e-02, 6.717e-02, 1.967e-02, 4.580e-02, -1.188e-01, -2.916e-02, 4.751e-02, -7.756e-02, -2.299e-01, 1.251e-03)); + r += mul(s5_2, M4(-6.215e-02, 5.819e-02, -1.518e-01, -1.638e-01, 1.215e-02, 3.033e-02, 9.672e-03, -2.266e-03, 1.194e-02, 6.312e-02, 2.088e-03, -5.166e-02, -1.069e-01, -7.006e-02, 2.260e-02, 4.479e-03)); + r += mul(s5_3, M4(-2.098e-01, -1.045e-01, -1.693e-01, 1.107e-02, 2.776e-02, -7.437e-02, -4.281e-02, -4.362e-02, 8.969e-03, 1.298e-01, -2.149e-02, 2.569e-02, -8.281e-02, -8.143e-03, 4.913e-02, -4.221e-03)); + r += mul(s5_4, M4(1.898e-02, 1.908e-01, 8.051e-02, 7.461e-02, 9.440e-02, -3.972e-02, 2.920e-02, -2.677e-02, -1.486e-01, 5.343e-02, 4.775e-02, 1.144e-02, 1.852e-02, -2.526e-01, 4.969e-02, -4.623e-02)); + r += mul(s5_5, M4(-8.362e-02, -3.926e-02, -2.237e-01, -6.170e-02, 6.227e-02, 6.022e-02, 1.709e-01, 1.088e-01, -1.182e-01, -7.202e-02, -7.402e-02, 4.212e-02, 1.368e-01, -3.192e-02, -6.101e-02, 1.636e-01)); + r += mul(s5_6, M4(-4.502e-02, -5.282e-02, 7.133e-04, -9.106e-02, -6.107e-02, 9.297e-03, 2.709e-03, -2.718e-02, 5.338e-02, 3.576e-02, -5.048e-04, -5.170e-03, 8.932e-03, -6.275e-02, -1.041e-03, -1.522e-02)); + r += mul(s5_7, M4(-1.108e-01, -6.070e-02, -3.770e-02, 4.358e-03, 2.461e-02, -3.630e-02, -5.192e-02, -1.041e-01, 7.605e-03, 3.053e-02, 4.332e-02, 5.214e-02, 1.711e-02, -1.180e-02, 2.084e-03, 6.377e-02)); + r += mul(s5_8, M4(9.699e-02, -2.121e-02, 4.909e-02, -1.573e-01, 4.100e-02, 1.046e-02, 7.242e-02, 8.504e-02, 2.716e-02, -3.748e-02, 2.484e-02, -1.300e-01, 9.252e-03, -5.036e-03, 2.020e-02, 3.686e-02)); + r += mul(s6_0, M4(-5.980e-02, 2.806e-02, 6.706e-02, 5.784e-02, 1.031e-01, -5.117e-02, 8.907e-03, -9.963e-03, -5.161e-03, -2.655e-02, -8.112e-02, -7.795e-03, 3.048e-02, 2.583e-02, 4.491e-02, 3.224e-02)); + r += mul(s6_1, M4(3.521e-02, 1.141e-01, 7.327e-02, 1.688e-02, 1.047e-01, 2.850e-02, -1.072e-01, -1.467e-01, -1.225e-02, 1.753e-02, -1.501e-03, -3.968e-02, -2.848e-02, -1.620e-02, -4.136e-02, 6.977e-03)); + r += mul(s6_2, M4(-1.329e-01, 1.051e-02, 9.320e-02, -3.299e-02, 5.434e-02, 2.181e-02, 5.300e-02, -8.050e-04, -1.119e-01, 2.738e-02, 4.885e-03, -6.312e-02, -1.215e-02, -5.119e-03, -7.759e-03, -2.041e-02)); + r += mul(s6_3, M4(-1.590e-02, 3.348e-03, 4.274e-02, 2.294e-02, -1.278e-01, 2.225e-02, 2.812e-02, -8.807e-03, 5.856e-02, 4.580e-02, 3.058e-02, 3.450e-03, 5.969e-02, -6.998e-03, 1.788e-02, 1.617e-02)); + r += mul(s6_4, M4(-2.731e-02, 2.275e-01, -9.676e-02, 1.035e-01, -3.410e-02, -4.834e-02, 1.038e-01, -1.541e-01, -7.447e-02, 7.343e-02, -7.526e-02, -2.714e-02, 3.142e-01, -4.096e-02, 2.155e-02, 8.973e-02)); + r += mul(s6_5, M4(-2.646e-02, -1.506e-02, -1.467e-01, -1.181e-01, 1.866e-02, -4.026e-02, 6.877e-03, 5.960e-02, -1.941e-02, 5.781e-02, -1.558e-01, -9.129e-02, 1.407e-02, 5.350e-02, 2.022e-02, -1.799e-02)); + r += mul(s6_6, M4(1.897e-02, 8.663e-02, 7.349e-02, 7.148e-03, -1.309e-02, 3.192e-02, 5.372e-02, 3.611e-02, -7.302e-03, 2.931e-02, 2.886e-02, 4.663e-02, -1.019e-01, -5.014e-02, -3.633e-02, 4.043e-02)); + r += mul(s6_7, M4(-7.477e-02, -2.522e-03, -3.245e-02, -1.565e-02, 8.996e-02, 8.576e-02, 9.061e-02, -4.715e-02, 2.940e-02, -6.892e-03, -5.590e-02, 3.380e-02, -5.756e-02, 9.486e-02, 9.597e-02, -8.792e-02)); + r += mul(s6_8, M4(-2.186e-02, -8.656e-02, -1.093e-01, -3.317e-02, 4.744e-02, -7.635e-03, 1.268e-01, -2.545e-02, -1.122e-01, 2.642e-02, -1.119e-01, -1.527e-02, 6.516e-03, -8.017e-04, 2.662e-03, -8.226e-02)); + r += mul(s7_0, M4(-2.019e-02, -3.796e-02, -5.359e-02, 8.589e-03, 1.746e-02, 7.377e-02, 9.361e-02, 3.278e-02, -8.813e-02, 2.210e-02, -1.049e-02, 1.715e-02, 1.041e-01, -4.550e-05, 4.012e-03, 2.279e-02)); + r += mul(s7_1, M4(1.146e-01, 5.459e-02, -6.725e-02, -9.273e-03, -2.321e-02, 1.333e-01, -1.210e-01, 1.025e-03, 3.982e-02, -1.381e-01, -1.400e-02, -2.607e-02, -6.757e-02, -4.364e-02, -5.068e-03, 4.358e-02)); + r += mul(s7_2, M4(7.601e-02, -3.050e-02, -1.273e-02, -3.718e-02, 4.217e-02, 7.081e-03, 4.354e-02, -1.709e-02, -5.820e-02, 1.073e-01, 8.721e-03, 7.082e-04, 1.634e-02, 3.915e-02, -3.449e-02, -9.085e-03)); + r += mul(s7_3, M4(-1.358e-02, -1.004e-02, -8.832e-02, -1.193e-01, -2.779e-02, 1.960e-01, 2.438e-02, 2.159e-03, 6.318e-02, -4.563e-02, 6.732e-02, -8.724e-02, -4.285e-02, 8.821e-02, 2.702e-02, 4.149e-02)); + r += mul(s7_4, M4(3.593e-02, 2.196e-02, 2.173e-02, -4.889e-02, 7.567e-03, -3.813e-02, 5.501e-02, -5.377e-02, 2.046e-01, -1.932e-01, -2.858e-01, 4.373e-02, 1.428e-01, 1.579e-01, 1.093e-01, 2.253e-02)); + r += mul(s7_5, M4(-1.377e-01, -1.132e-02, -5.150e-02, -6.566e-02, -6.390e-03, -3.158e-02, 4.235e-02, -6.105e-02, 1.130e-01, -4.081e-02, 5.491e-02, 1.827e-01, -2.194e-02, 1.053e-01, -6.559e-02, -4.982e-02)); + r += mul(s7_6, M4(-6.669e-02, 3.382e-03, -2.385e-02, -2.175e-02, -2.203e-02, 5.512e-02, 2.337e-02, 1.053e-02, 2.608e-03, -3.030e-02, 3.556e-03, 2.730e-02, 8.774e-02, 1.053e-02, -1.591e-02, -8.692e-02)); + r += mul(s7_7, M4(-1.432e-01, 4.026e-02, 1.347e-01, -2.317e-02, 8.572e-02, 1.513e-02, -5.679e-02, -9.989e-02, -5.869e-02, -1.023e-01, -4.056e-02, 1.494e-01, -2.377e-02, -1.866e-02, -6.367e-02, -2.192e-01)); + r += mul(s7_8, M4(4.881e-02, 1.017e-02, -3.493e-02, -9.660e-02, 3.625e-02, 2.386e-02, 9.414e-02, 3.077e-02, -7.044e-02, -2.566e-02, -2.265e-02, 2.627e-02, 6.538e-02, 4.887e-02, -4.800e-02, -3.489e-02)); + r += V4(4.173e-03, 1.409e-02, -1.527e-02, -1.778e-03); + return r; +} + +V4 f3(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-1.167e-02, 7.113e-02, 3.822e-03, -1.144e-02, -2.224e-01, 1.053e-02, 3.899e-02, 1.143e-02, 6.980e-03, 1.377e-02, -2.633e-02, -1.480e-02, -2.798e-02, 8.914e-02, -5.357e-03, -9.741e-02)); + r += mul(s0_1, M4(7.215e-02, -2.533e-02, 8.928e-02, -3.974e-02, -1.013e-01, 9.533e-02, -4.489e-02, 2.747e-02, 3.177e-01, -2.748e-01, 7.242e-02, -2.502e-02, 2.636e-01, 5.869e-02, -1.809e-01, -9.835e-02)); + r += mul(s0_2, M4(-8.355e-05, -4.128e-02, -4.788e-02, -1.433e-02, -8.908e-02, -3.683e-02, 4.406e-02, 9.769e-02, -3.560e-02, -1.459e-02, 1.996e-01, -4.799e-02, -4.419e-03, -4.064e-02, 1.307e-02, -4.230e-02)); + r += mul(s0_3, M4(5.972e-02, -8.597e-02, -3.847e-02, 1.258e-02, -1.871e-01, 1.066e-01, 1.463e-01, -2.473e-02, -1.240e-01, -5.041e-02, 1.561e-02, 7.376e-02, -2.178e-02, 4.002e-02, 1.836e-01, -1.051e-01)); + r += mul(s0_4, M4(6.370e-02, -2.171e-02, 8.220e-02, -9.885e-02, -2.903e-01, -8.983e-02, -7.046e-02, -1.940e-01, 5.303e-02, 1.998e-01, -4.619e-01, -4.693e-02, -1.250e-01, -2.295e-01, -1.236e-01, -2.091e-01)); + r += mul(s0_5, M4(5.260e-02, -6.406e-02, -3.290e-02, -4.443e-03, -6.417e-02, 1.516e-02, -2.519e-02, -3.230e-02, 3.332e-02, -5.458e-01, -1.850e-01, 8.340e-02, -2.379e-02, 7.705e-02, -2.979e-02, 2.320e-02)); + r += mul(s0_6, M4(3.036e-03, 4.029e-02, -7.705e-02, 1.360e-01, -1.734e-01, 4.693e-02, 1.519e-01, 1.149e-01, -8.603e-02, 2.361e-02, 4.493e-02, -1.080e-01, -3.285e-02, -2.896e-02, 4.286e-02, -5.755e-02)); + r += mul(s0_7, M4(4.018e-02, -8.063e-02, 3.551e-02, -1.668e-01, -2.488e-01, 7.881e-02, 5.395e-02, -5.390e-02, -1.344e-01, -1.297e-01, 1.513e-01, -1.432e-01, 5.492e-02, 2.255e-01, -6.271e-02, -1.744e-01)); + r += mul(s0_8, M4(-5.268e-03, 1.191e-01, 3.927e-02, 1.076e-02, -2.728e-01, 8.725e-02, 1.057e-01, -1.054e-01, 1.970e-01, 1.924e-01, 6.983e-02, 1.276e-01, -1.113e-01, -1.624e-01, -4.850e-02, -7.036e-02)); + r += mul(s1_0, M4(-1.426e-01, 2.334e-02, -1.094e-02, -7.407e-02, -6.792e-02, 2.777e-02, 3.094e-02, -1.318e-02, -5.514e-03, -4.333e-02, 7.728e-04, -5.478e-03, -1.044e-01, -6.804e-02, 5.295e-02, 9.620e-03)); + r += mul(s1_1, M4(5.492e-02, -4.866e-02, 5.931e-02, 6.582e-02, -5.343e-02, 1.568e-01, -5.726e-02, 3.203e-02, -5.349e-02, 1.842e-03, -9.329e-03, 2.341e-03, 4.785e-02, 6.863e-02, -8.660e-02, -6.837e-02)); + r += mul(s1_2, M4(-2.827e-02, 5.348e-02, 3.606e-02, 1.615e-02, -3.296e-02, -1.077e-02, -1.476e-02, -1.344e-02, 1.092e-02, -7.954e-02, 2.188e-02, -7.613e-02, -9.541e-02, -9.093e-02, 7.970e-02, 5.269e-03)); + r += mul(s1_3, M4(-1.361e-03, -8.518e-02, -9.498e-02, 7.772e-02, 2.565e-02, 8.882e-02, 6.306e-02, -4.711e-02, -1.616e-02, 6.767e-02, 5.313e-02, -9.962e-02, 3.099e-02, -4.796e-02, 6.080e-02, 2.616e-02)); + r += mul(s1_4, M4(-5.855e-02, 2.104e-02, -9.982e-02, 9.721e-02, 1.517e-01, -9.210e-02, -8.640e-02, -8.518e-02, 6.706e-02, 2.991e-02, -1.464e-02, -6.294e-02, -2.638e-02, 1.248e-02, -3.616e-02, 1.223e-01)); + r += mul(s1_5, M4(7.110e-02, -7.086e-02, 6.703e-03, 3.567e-02, 5.312e-02, -6.496e-03, 8.943e-03, -5.466e-02, 1.895e-02, -3.669e-02, 2.584e-02, -2.765e-03, 3.016e-03, 7.781e-02, 2.094e-02, 8.166e-02)); + r += mul(s1_6, M4(-1.128e-01, 4.150e-02, 7.408e-02, 9.683e-02, 6.146e-02, -4.690e-02, 4.417e-02, 2.410e-02, 1.917e-02, -2.390e-03, -2.845e-02, -6.984e-03, -1.097e-01, -6.451e-02, -4.617e-02, -2.599e-02)); + r += mul(s1_7, M4(-5.970e-03, -2.779e-01, 4.142e-02, -1.805e-02, 4.826e-02, -7.818e-03, -1.021e-01, 1.013e-02, -2.918e-02, 1.025e-01, 1.875e-02, 1.042e-02, -1.240e-02, 1.919e-01, -5.672e-03, -4.655e-02)); + r += mul(s1_8, M4(4.831e-02, 1.212e-01, -1.350e-01, -6.402e-02, 9.789e-02, -4.909e-03, -2.798e-02, -6.644e-02, -9.080e-03, -1.093e-01, -5.033e-02, -1.946e-02, -1.293e-01, -2.352e-02, 4.836e-02, -1.554e-02)); + r += mul(s2_0, M4(-7.880e-02, 4.960e-02, 1.506e-01, 6.567e-03, 1.914e-02, -5.041e-02, 3.384e-02, -5.016e-02, -7.930e-02, -1.876e-01, -4.583e-02, 1.982e-01, 1.903e-01, 8.947e-02, 4.232e-02, -2.569e-02)); + r += mul(s2_1, M4(2.007e-01, -1.006e-01, 6.364e-02, -1.107e-01, 1.316e-01, -4.705e-02, 3.292e-02, -5.835e-02, 4.873e-01, 2.395e-01, -1.672e-01, 3.838e-02, 7.992e-04, 5.969e-03, 2.629e-01, 2.465e-02)); + r += mul(s2_2, M4(-2.404e-02, -4.473e-02, 1.559e-01, 6.163e-02, -4.415e-02, -6.521e-02, -4.490e-02, -6.924e-02, -2.854e-03, -1.285e-01, 2.472e-01, 6.413e-02, -1.113e-01, -4.878e-02, 1.202e-01, 4.318e-02)); + r += mul(s2_3, M4(1.076e-01, -5.476e-02, 2.212e-01, -8.185e-02, 9.430e-03, -9.689e-02, 1.046e-01, 1.132e-02, -5.601e-02, 1.755e-02, 4.833e-02, 1.235e-01, -1.952e-02, 1.777e-01, -3.257e-02, 1.061e-01)); + r += mul(s2_4, M4(2.772e-01, -1.444e-01, -3.958e-02, -9.223e-02, 1.794e-01, 5.433e-02, 2.304e-01, -2.276e-01, -2.422e-01, -7.740e-02, -1.114e-01, 1.253e-01, 7.317e-02, -4.988e-03, 2.970e-01, -2.830e-02)); + r += mul(s2_5, M4(-7.800e-02, 4.609e-02, 1.082e-01, 1.851e-01, -1.878e-03, -1.458e-02, -2.368e-02, -2.698e-02, 1.978e-01, 3.366e-01, 4.870e-02, 3.587e-02, 1.547e-01, 3.822e-02, 1.268e-01, 3.168e-02)); + r += mul(s2_6, M4(1.717e-03, -1.812e-01, -1.010e-01, -2.942e-02, 1.088e-02, -2.949e-02, -2.280e-02, 1.454e-02, 1.256e-01, 7.694e-02, -2.056e-01, -1.434e-02, -8.130e-02, 1.671e-01, -1.100e-02, -2.191e-02)); + r += mul(s2_7, M4(-1.673e-01, 4.049e-03, 2.133e-02, 2.319e-01, -3.630e-02, 9.826e-02, 2.562e-02, 1.294e-01, -4.803e-02, -2.150e-01, 1.226e-01, 1.012e-01, 1.222e-01, -1.323e-01, 9.364e-05, -7.661e-03)); + r += mul(s2_8, M4(-1.020e-01, -7.446e-02, -8.427e-03, 1.322e-01, 6.739e-02, 1.669e-02, 6.415e-02, -6.686e-02, 6.874e-02, 1.706e-01, -5.453e-02, 6.454e-02, -1.321e-02, 5.199e-02, 8.951e-02, 6.274e-02)); + r += mul(s3_0, M4(-9.301e-02, -9.281e-03, 3.177e-02, -4.602e-02, -2.858e-02, 1.100e-01, 5.152e-03, 8.481e-03, 4.755e-02, -4.921e-02, 3.039e-03, 2.944e-02, -2.085e-02, -1.190e-02, 1.241e-02, 1.770e-02)); + r += mul(s3_1, M4(1.206e-01, 3.190e-02, 2.019e-02, -5.287e-02, 2.960e-03, -3.259e-02, -3.770e-03, -1.537e-02, 1.747e-02, -1.034e-02, 1.876e-02, 4.201e-02, -1.092e-01, 2.903e-02, -2.532e-02, 7.270e-02)); + r += mul(s3_2, M4(-5.119e-03, 7.362e-03, -3.890e-02, 4.856e-02, -4.213e-02, -1.402e-01, -2.826e-02, -8.865e-02, -2.333e-02, -2.161e-02, -5.952e-02, 2.058e-02, -5.357e-02, -3.009e-02, 1.872e-02, 2.597e-02)); + r += mul(s3_3, M4(6.472e-02, -4.584e-02, -7.107e-03, 4.855e-02, -4.056e-02, 8.131e-02, 1.364e-01, -2.552e-02, -7.878e-02, -2.991e-02, 2.130e-02, 1.087e-01, 1.964e-02, 8.321e-02, -1.909e-02, 7.523e-02)); + r += mul(s3_4, M4(5.038e-02, 2.256e-02, -7.623e-03, -1.872e-02, 1.800e-01, 7.008e-02, 7.587e-02, -2.872e-01, 4.155e-03, 8.453e-04, -1.561e-02, 5.092e-02, -6.359e-02, -9.084e-02, 1.047e-01, -5.319e-02)); + r += mul(s3_5, M4(-9.609e-02, 1.714e-02, -2.219e-01, 2.245e-02, 1.040e-02, -1.293e-01, 1.025e-01, -7.594e-02, -3.987e-02, 2.213e-02, 6.019e-02, -1.122e-01, -7.775e-02, -5.578e-02, -3.080e-02, -4.930e-02)); + r += mul(s3_6, M4(-6.516e-02, 1.657e-02, -2.558e-02, -6.124e-02, -3.133e-02, -2.645e-02, -8.707e-03, 2.046e-02, -9.048e-03, -1.351e-02, -2.644e-02, -5.333e-02, -5.207e-02, 5.509e-02, -5.945e-02, -7.672e-02)); + r += mul(s3_7, M4(4.162e-03, -6.708e-02, 5.431e-02, 1.623e-02, -7.745e-02, 1.429e-01, -2.173e-02, 1.892e-01, -3.614e-02, -4.247e-02, 3.057e-03, 7.932e-02, -2.931e-03, -6.782e-02, 1.497e-02, -5.519e-04)); + r += mul(s3_8, M4(-1.726e-02, 9.547e-02, 5.438e-02, 6.943e-02, 1.914e-02, -2.154e-02, 1.912e-01, -1.096e-02, 2.614e-02, 1.948e-02, -1.711e-02, -1.831e-02, -3.373e-02, 3.467e-02, -1.693e-02, 1.689e-03)); + r += mul(s4_0, M4(-6.692e-02, -3.165e-02, 2.808e-02, -5.682e-02, -6.105e-02, -1.175e-02, 7.030e-02, 1.832e-02, 6.584e-02, 2.498e-02, -5.845e-02, 5.704e-02, 4.486e-02, 1.214e-03, -3.955e-02, -8.385e-02)); + r += mul(s4_1, M4(6.582e-02, -5.290e-02, 1.448e-02, -5.476e-02, -2.031e-01, -5.528e-02, -2.782e-02, -5.046e-02, -2.098e-02, 2.527e-02, 4.160e-02, 4.069e-02, -1.045e-01, -8.357e-02, -2.469e-02, -2.611e-02)); + r += mul(s4_2, M4(3.378e-03, 7.391e-02, 3.614e-02, -6.354e-02, -1.993e-02, -5.497e-02, -4.947e-02, 4.341e-02, 1.048e-01, 1.082e-01, -1.009e-01, 2.709e-02, -6.418e-02, -1.455e-01, 5.250e-02, -4.911e-03)); + r += mul(s4_3, M4(6.624e-02, 2.199e-02, -9.857e-03, -3.339e-02, 9.994e-02, -2.933e-02, 1.909e-02, -9.170e-02, -1.106e-02, -2.439e-02, 2.660e-02, -3.228e-02, -3.388e-02, -3.303e-02, -7.651e-02, -9.346e-02)); + r += mul(s4_4, M4(-8.180e-02, 7.600e-02, 1.538e-02, -1.216e-01, 1.981e-01, 1.502e-02, 4.975e-02, 2.431e-02, -7.522e-02, 3.625e-03, 1.104e-02, -5.448e-03, -1.209e-01, 5.751e-02, -3.896e-03, 1.092e-01)); + r += mul(s4_5, M4(4.550e-02, -1.330e-01, -3.371e-02, -4.553e-02, -3.309e-02, -4.712e-02, -1.272e-01, 7.661e-02, -1.339e-01, -6.610e-02, -1.053e-01, -1.248e-03, 2.452e-03, -4.445e-02, 1.917e-01, -6.756e-02)); + r += mul(s4_6, M4(2.202e-02, 6.361e-02, 6.040e-02, -9.084e-02, -2.731e-02, 2.606e-02, -3.115e-03, -5.223e-02, -6.156e-02, -1.456e-01, -6.265e-04, 2.337e-03, -6.716e-02, 1.083e-02, -1.455e-02, -2.764e-02)); + r += mul(s4_7, M4(-2.959e-02, 5.556e-02, 1.304e-02, 1.678e-02, -5.710e-02, 6.434e-02, -4.860e-02, 9.945e-02, -1.809e-02, -2.464e-01, 1.077e-01, -2.306e-02, -3.565e-02, -1.890e-02, -1.252e-02, -3.337e-02)); + r += mul(s4_8, M4(-9.485e-03, 1.104e-01, 1.211e-02, -2.105e-02, -1.236e-02, -5.495e-02, 7.685e-02, -4.815e-02, -6.525e-02, 1.109e-01, 1.661e-01, 3.075e-02, -8.373e-02, 9.925e-03, 1.961e-02, -5.981e-02)); + r += mul(s5_0, M4(9.801e-04, 9.458e-02, 1.762e-01, -1.281e-01, -1.489e-01, -4.986e-02, 5.098e-02, -1.408e-01, -9.999e-03, 3.848e-02, -5.507e-02, -1.034e-02, 4.173e-02, -6.904e-03, -1.325e-03, -6.998e-03)); + r += mul(s5_1, M4(1.370e-01, -3.919e-02, 2.025e-01, 1.048e-01, 9.064e-03, -8.848e-02, 1.585e-01, -8.881e-02, -7.091e-02, 2.845e-02, -1.275e-02, -1.239e-02, -3.869e-03, -1.170e-03, -5.842e-02, 3.705e-02)); + r += mul(s5_2, M4(1.817e-01, 1.459e-01, 5.089e-02, -1.269e-01, -5.881e-02, -7.738e-03, 1.224e-01, 3.632e-02, 7.139e-02, 6.373e-02, -3.948e-02, -4.856e-03, -3.270e-02, -2.634e-02, 2.104e-02, -2.706e-02)); + r += mul(s5_3, M4(1.502e-01, 1.379e-01, 1.538e-02, -7.861e-03, 1.042e-01, -2.230e-02, 4.135e-02, -2.683e-02, -2.117e-02, -7.226e-02, -3.989e-03, 8.275e-02, 8.715e-02, -6.580e-03, 1.703e-02, -9.040e-03)); + r += mul(s5_4, M4(2.142e-01, 1.061e-01, -3.152e-01, -2.537e-02, 1.539e-01, -8.227e-02, 8.715e-02, -2.106e-01, 1.039e-01, 4.502e-02, -1.235e-01, -1.842e-02, 4.672e-02, 1.679e-01, -2.057e-02, 1.910e-01)); + r += mul(s5_5, M4(1.570e-01, -6.616e-02, -3.374e-01, 4.379e-02, 9.364e-02, 1.886e-01, 9.683e-02, 1.772e-01, -8.627e-02, -7.643e-02, -1.468e-01, -3.264e-02, 6.554e-02, -2.150e-02, 1.439e-01, -2.549e-02)); + r += mul(s5_6, M4(2.129e-01, 7.809e-02, -3.730e-02, -9.549e-02, 3.745e-02, 6.747e-02, -3.004e-03, 9.262e-03, -1.267e-03, -3.688e-02, -2.417e-02, 1.145e-02, 1.774e-02, -8.307e-03, -2.078e-02, 1.897e-02)); + r += mul(s5_7, M4(1.043e-01, -3.778e-02, -1.563e-01, -3.084e-02, -2.736e-03, 8.034e-03, 5.689e-02, -4.467e-02, -4.726e-02, -3.165e-02, 4.804e-02, 1.631e-02, -2.546e-02, 7.656e-02, -2.755e-02, 2.819e-02)); + r += mul(s5_8, M4(6.321e-02, 7.741e-02, -1.271e-03, -3.950e-03, -2.887e-02, 5.842e-02, 8.823e-02, -3.011e-02, -1.819e-02, -2.790e-02, 1.703e-02, -9.489e-02, 6.141e-03, -1.879e-02, -1.695e-03, -4.482e-02)); + r += mul(s6_0, M4(-1.058e-01, 1.028e-02, 2.038e-02, 8.475e-02, 2.969e-02, -2.337e-02, -2.119e-02, -1.120e-01, 9.966e-02, 7.796e-02, 8.142e-02, -2.125e-02, -4.534e-02, 2.910e-02, 6.519e-02, 2.339e-03)); + r += mul(s6_1, M4(-4.818e-02, -2.566e-02, 1.065e-02, -7.687e-02, 6.712e-02, -6.220e-03, 1.980e-02, -9.644e-03, 1.204e-01, -8.267e-03, 1.451e-01, 2.302e-02, 4.919e-02, -4.909e-02, 3.303e-02, 7.169e-02)); + r += mul(s6_2, M4(-5.701e-02, 1.688e-01, -3.089e-02, 1.287e-03, 1.021e-01, 8.347e-02, 3.803e-02, -5.952e-03, 2.335e-01, 7.194e-02, -1.382e-02, 8.579e-02, -2.265e-02, 3.642e-02, -3.861e-03, -4.818e-02)); + r += mul(s6_3, M4(-1.187e-01, -4.119e-02, -2.789e-02, 4.240e-02, 7.966e-03, 3.998e-02, -9.259e-02, 1.155e-01, 3.001e-02, -4.175e-02, 5.960e-02, 5.011e-02, 5.314e-02, 8.689e-03, 1.480e-01, -2.816e-01)); + r += mul(s6_4, M4(-2.291e-01, 3.066e-02, -3.810e-02, -7.246e-02, 5.209e-02, 1.857e-01, -5.975e-02, 9.752e-02, -9.198e-02, 8.753e-03, 2.891e-04, 4.438e-02, 1.461e-01, -6.657e-03, 1.107e-01, -2.582e-02)); + r += mul(s6_5, M4(-1.170e-01, -9.598e-02, -1.396e-01, 3.307e-02, -1.292e-01, 6.836e-02, 1.472e-02, 4.140e-02, -1.075e-01, 6.799e-02, -7.403e-02, 7.355e-02, 2.433e-02, 4.886e-02, -2.368e-02, 3.433e-03)); + r += mul(s6_6, M4(-1.018e-01, 2.365e-03, 7.537e-02, 5.097e-02, -7.627e-03, 1.422e-02, 2.085e-02, 1.109e-01, 2.279e-02, -3.080e-02, 4.851e-02, -7.352e-02, 1.192e-01, 3.540e-02, -6.290e-02, -4.978e-02)); + r += mul(s6_7, M4(-1.705e-01, -6.102e-02, 7.558e-02, 8.990e-02, -1.164e-01, 1.767e-01, 9.091e-02, -7.596e-02, 2.049e-02, -7.114e-02, 2.842e-02, 1.798e-01, 5.774e-02, 1.200e-01, -8.578e-02, 2.649e-01)); + r += mul(s6_8, M4(-8.003e-02, -1.615e-02, 6.288e-03, 5.704e-02, -4.235e-03, 6.261e-03, 3.897e-02, 3.701e-02, 8.972e-02, -2.166e-02, 3.724e-02, -5.434e-02, 5.026e-02, -4.115e-02, -6.291e-02, 3.271e-03)); + r += mul(s7_0, M4(9.269e-02, 6.940e-02, 2.366e-02, -4.562e-02, -3.172e-02, 9.314e-03, -6.270e-02, 2.465e-02, -5.319e-03, 4.779e-02, 5.714e-02, 8.881e-02, 4.492e-02, -4.217e-02, -3.386e-02, 6.345e-02)); + r += mul(s7_1, M4(4.166e-02, -1.216e-01, 5.635e-02, -1.037e-01, 6.698e-02, 1.740e-01, -5.253e-03, 4.376e-02, -1.643e-01, -1.017e-01, -1.700e-02, 7.608e-02, -9.902e-02, -3.625e-02, -2.993e-02, 5.567e-02)); + r += mul(s7_2, M4(1.017e-01, 3.580e-02, -5.391e-02, -5.787e-02, 7.344e-02, 4.733e-03, 8.307e-02, 2.210e-02, -4.513e-02, 6.641e-02, 2.762e-02, 6.352e-02, -1.433e-02, -2.190e-02, -8.479e-02, 1.480e-02)); + r += mul(s7_3, M4(7.769e-02, -5.091e-03, -1.465e-02, -5.753e-03, -6.735e-02, 1.561e-01, 2.281e-02, 6.207e-02, -1.018e-02, -7.199e-02, 4.084e-03, 8.673e-02, -2.895e-02, -8.051e-02, 6.780e-03, -2.519e-02)); + r += mul(s7_4, M4(1.574e-01, 9.303e-02, 1.053e-03, -5.916e-02, 4.135e-02, 2.861e-01, 5.332e-02, 5.538e-02, -5.394e-02, -2.012e-02, -1.075e-01, 7.292e-02, 1.936e-01, 1.745e-01, 3.240e-02, -5.927e-02)); + r += mul(s7_5, M4(-8.653e-02, -6.805e-02, -1.058e-01, -1.375e-02, -6.762e-02, 5.523e-02, -4.983e-02, 5.782e-02, 4.544e-02, 1.240e-01, 5.341e-02, -9.391e-04, 1.718e-02, -2.817e-02, 9.757e-02, 3.799e-02)); + r += mul(s7_6, M4(1.094e-01, 2.844e-02, -4.059e-02, 3.584e-02, -3.615e-03, 2.496e-02, -3.317e-03, 5.475e-02, 5.129e-03, 3.327e-02, 7.196e-02, -1.179e-01, -3.309e-02, -4.331e-02, 2.087e-02, -2.335e-02)); + r += mul(s7_7, M4(1.671e-01, -1.219e-02, -1.035e-03, 2.249e-02, -6.740e-02, 1.508e-01, 5.615e-02, 9.415e-03, 9.352e-02, 2.030e-02, -4.382e-02, 1.021e-01, 4.900e-02, 2.809e-03, -9.955e-02, 5.268e-02)); + r += mul(s7_8, M4(2.353e-01, 1.480e-01, -2.603e-02, 9.030e-02, -1.118e-02, 1.376e-02, 1.244e-01, 6.137e-02, -1.080e-02, 1.309e-03, 3.426e-03, -9.580e-02, 1.014e-01, 8.073e-02, -4.193e-03, 1.369e-01)); + r += V4(1.206e-02, -1.488e-03, 7.432e-03, -5.892e-03); + return r; +} + +void Pass14(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = Rmp8x8(tid.x) + blockStart; + uint2 size = GetInputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = (gxy + 0.5) * pt; + + V4 s0_0 = l0(-1.0, -1.0); + V4 s0_1 = l0(0.0, -1.0); + V4 s0_2 = l0(1.0, -1.0); + V4 s0_3 = l0(-1.0, 0.0); + V4 s0_4 = l0(0.0, 0.0); + V4 s0_5 = l0(1.0, 0.0); + V4 s0_6 = l0(-1.0, 1.0); + V4 s0_7 = l0(0.0, 1.0); + V4 s0_8 = l0(1.0, 1.0); + V4 s1_0 = -max(-s0_0, 0.0); + V4 s1_1 = -max(-s0_1, 0.0); + V4 s1_2 = -max(-s0_2, 0.0); + V4 s1_3 = -max(-s0_3, 0.0); + V4 s1_4 = -max(-s0_4, 0.0); + V4 s1_5 = -max(-s0_5, 0.0); + V4 s1_6 = -max(-s0_6, 0.0); + V4 s1_7 = -max(-s0_7, 0.0); + V4 s1_8 = -max(-s0_8, 0.0); + s0_0 = max(s0_0, 0.0); + s0_1 = max(s0_1, 0.0); + s0_2 = max(s0_2, 0.0); + s0_3 = max(s0_3, 0.0); + s0_4 = max(s0_4, 0.0); + s0_5 = max(s0_5, 0.0); + s0_6 = max(s0_6, 0.0); + s0_7 = max(s0_7, 0.0); + s0_8 = max(s0_8, 0.0); + + V4 s2_0 = l1(-1.0, -1.0); + V4 s2_1 = l1(0.0, -1.0); + V4 s2_2 = l1(1.0, -1.0); + V4 s2_3 = l1(-1.0, 0.0); + V4 s2_4 = l1(0.0, 0.0); + V4 s2_5 = l1(1.0, 0.0); + V4 s2_6 = l1(-1.0, 1.0); + V4 s2_7 = l1(0.0, 1.0); + V4 s2_8 = l1(1.0, 1.0); + V4 s3_0 = -max(-s2_0, 0.0); + V4 s3_1 = -max(-s2_1, 0.0); + V4 s3_2 = -max(-s2_2, 0.0); + V4 s3_3 = -max(-s2_3, 0.0); + V4 s3_4 = -max(-s2_4, 0.0); + V4 s3_5 = -max(-s2_5, 0.0); + V4 s3_6 = -max(-s2_6, 0.0); + V4 s3_7 = -max(-s2_7, 0.0); + V4 s3_8 = -max(-s2_8, 0.0); + s2_0 = max(s2_0, 0.0); + s2_1 = max(s2_1, 0.0); + s2_2 = max(s2_2, 0.0); + s2_3 = max(s2_3, 0.0); + s2_4 = max(s2_4, 0.0); + s2_5 = max(s2_5, 0.0); + s2_6 = max(s2_6, 0.0); + s2_7 = max(s2_7, 0.0); + s2_8 = max(s2_8, 0.0); + + V4 s4_0 = l2(-1.0, -1.0); + V4 s4_1 = l2(0.0, -1.0); + V4 s4_2 = l2(1.0, -1.0); + V4 s4_3 = l2(-1.0, 0.0); + V4 s4_4 = l2(0.0, 0.0); + V4 s4_5 = l2(1.0, 0.0); + V4 s4_6 = l2(-1.0, 1.0); + V4 s4_7 = l2(0.0, 1.0); + V4 s4_8 = l2(1.0, 1.0); + V4 s5_0 = -max(-s4_0, 0.0); + V4 s5_1 = -max(-s4_1, 0.0); + V4 s5_2 = -max(-s4_2, 0.0); + V4 s5_3 = -max(-s4_3, 0.0); + V4 s5_4 = -max(-s4_4, 0.0); + V4 s5_5 = -max(-s4_5, 0.0); + V4 s5_6 = -max(-s4_6, 0.0); + V4 s5_7 = -max(-s4_7, 0.0); + V4 s5_8 = -max(-s4_8, 0.0); + s4_0 = max(s4_0, 0.0); + s4_1 = max(s4_1, 0.0); + s4_2 = max(s4_2, 0.0); + s4_3 = max(s4_3, 0.0); + s4_4 = max(s4_4, 0.0); + s4_5 = max(s4_5, 0.0); + s4_6 = max(s4_6, 0.0); + s4_7 = max(s4_7, 0.0); + s4_8 = max(s4_8, 0.0); + + V4 s6_0 = l3(-1.0, -1.0); + V4 s6_1 = l3(0.0, -1.0); + V4 s6_2 = l3(1.0, -1.0); + V4 s6_3 = l3(-1.0, 0.0); + V4 s6_4 = l3(0.0, 0.0); + V4 s6_5 = l3(1.0, 0.0); + V4 s6_6 = l3(-1.0, 1.0); + V4 s6_7 = l3(0.0, 1.0); + V4 s6_8 = l3(1.0, 1.0); + V4 s7_0 = -max(-s6_0, 0.0); + V4 s7_1 = -max(-s6_1, 0.0); + V4 s7_2 = -max(-s6_2, 0.0); + V4 s7_3 = -max(-s6_3, 0.0); + V4 s7_4 = -max(-s6_4, 0.0); + V4 s7_5 = -max(-s6_5, 0.0); + V4 s7_6 = -max(-s6_6, 0.0); + V4 s7_7 = -max(-s6_7, 0.0); + V4 s7_8 = -max(-s6_8, 0.0); + s6_0 = max(s6_0, 0.0); + s6_1 = max(s6_1, 0.0); + s6_2 = max(s6_2, 0.0); + s6_3 = max(s6_3, 0.0); + s6_4 = max(s6_4, 0.0); + s6_5 = max(s6_5, 0.0); + s6_6 = max(s6_6, 0.0); + s6_7 = max(s6_7, 0.0); + s6_8 = max(s6_8, 0.0); + + t4[gxy] = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t5[gxy] = f1(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t6[gxy] = f2(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t7[gxy] = f3(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); +} + +//!PASS 15 +//!DESC conv14 +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 +//!IN t4, t5, t6, t7 +//!OUT t0, t1, t2, t3 + +#define l0(x, y) V4(O(t4, float2(x, y))) +#define l1(x, y) V4(O(t5, float2(x, y))) +#define l2(x, y) V4(O(t6, float2(x, y))) +#define l3(x, y) V4(O(t7, float2(x, y))) + +V4 f0(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-4.185e-02, 4.091e-03, 2.901e-02, -2.038e-02, -4.890e-02, 1.164e-01, 1.339e-02, 1.634e-03, 2.732e-02, 6.849e-02, 9.277e-02, -7.625e-02, -5.444e-02, 2.505e-02, 9.467e-02, 6.034e-02)); + r += mul(s0_1, M4(1.256e-02, 8.107e-02, 1.145e-01, -1.047e-01, 1.597e-01, 3.900e-02, 3.008e-02, -6.023e-02, 4.341e-02, -2.507e-02, -4.064e-02, 3.460e-01, 1.876e-02, -9.687e-02, -1.347e-02, -1.907e-01)); + r += mul(s0_2, M4(9.207e-02, -8.786e-03, -1.540e-02, 7.945e-03, -4.322e-03, -1.837e-01, -1.012e-01, 1.046e-01, -7.684e-02, 2.438e-02, 3.435e-02, -1.049e-01, 1.712e-02, 6.380e-03, -1.597e-02, 4.260e-02)); + r += mul(s0_3, M4(5.051e-02, 6.101e-02, 1.899e-02, -6.753e-02, 8.176e-02, -1.564e-01, -1.642e-02, -9.951e-02, 7.278e-03, 1.024e-01, 7.590e-02, -1.069e-01, -9.321e-02, -1.165e-01, -1.024e-01, 3.383e-02)); + r += mul(s0_4, M4(-2.707e-02, -9.375e-02, -2.150e-02, 2.158e-01, 7.356e-02, -1.083e-01, 2.409e-01, 7.838e-02, -2.262e-02, 1.347e-02, 1.614e-01, 9.256e-02, 5.947e-02, -9.669e-02, 5.556e-02, -7.074e-02)); + r += mul(s0_5, M4(1.220e-01, -5.686e-02, 2.460e-02, 6.564e-02, -1.398e-02, -1.607e-01, -1.804e-01, -2.429e-01, 2.244e-02, -2.300e-01, -1.902e-03, -1.811e-01, 4.572e-02, 1.910e-02, -1.423e-01, 7.379e-02)); + r += mul(s0_6, M4(-3.069e-03, 5.911e-02, 1.009e-02, -3.404e-02, -6.806e-03, 4.456e-02, 6.687e-03, -6.194e-02, -8.226e-02, 2.784e-03, -8.519e-02, -4.928e-02, -4.491e-02, 1.170e-02, -7.097e-02, -2.554e-02)); + r += mul(s0_7, M4(-9.643e-02, -3.923e-02, -8.407e-02, 4.769e-02, 4.032e-02, 2.404e-03, 2.330e-02, 6.803e-02, 2.597e-02, -1.978e-01, 4.945e-02, -1.115e-01, 9.908e-02, -6.704e-02, 2.845e-02, -1.589e-01)); + r += mul(s0_8, M4(3.223e-02, 3.978e-04, -2.161e-02, -5.624e-02, 7.873e-02, 1.726e-01, 1.821e-02, 5.381e-02, 1.479e-01, 6.089e-02, 3.424e-02, 1.370e-01, 1.544e-02, 1.084e-02, -5.044e-02, 8.863e-03)); + r += mul(s1_0, M4(-6.762e-02, 1.486e-01, -3.739e-04, 2.086e-02, -6.172e-03, 3.222e-03, -5.487e-02, 4.932e-02, -2.639e-02, 2.902e-02, -6.927e-03, -4.605e-02, -5.824e-02, 8.899e-02, 8.049e-02, 1.084e-02)); + r += mul(s1_1, M4(5.069e-02, 6.858e-02, 1.163e-01, -1.431e-03, -3.230e-03, -1.418e-01, -5.930e-02, -1.903e-02, 4.409e-02, -4.904e-02, 1.191e-01, 1.010e-01, 9.705e-03, 4.082e-02, 2.487e-01, -1.595e-01)); + r += mul(s1_2, M4(3.732e-02, -2.114e-02, -1.093e-01, 6.778e-02, -8.360e-02, 5.667e-02, -6.203e-02, 3.940e-02, -1.157e-02, -7.115e-02, -1.429e-02, -2.059e-02, 1.053e-01, -1.412e-02, 8.933e-02, 3.629e-02)); + r += mul(s1_3, M4(-5.475e-04, 4.279e-02, -2.862e-02, 3.817e-02, -5.141e-02, -8.078e-04, 1.451e-01, -5.715e-02, -1.689e-03, -3.475e-02, -3.324e-02, 5.880e-02, -3.765e-02, -2.832e-02, 4.040e-02, -6.736e-02)); + r += mul(s1_4, M4(6.867e-02, -4.313e-03, -7.039e-02, -8.560e-02, 2.589e-02, -6.891e-02, 1.898e-02, -2.068e-02, 2.681e-02, -1.478e-01, -7.782e-02, 6.469e-02, -5.886e-02, -5.819e-02, -4.400e-02, 4.008e-02)); + r += mul(s1_5, M4(8.103e-02, 2.388e-02, -8.507e-02, -1.557e-02, -7.126e-02, 4.465e-02, -1.902e-02, -2.335e-02, 4.500e-02, 7.150e-03, 1.615e-01, 1.738e-04, -7.395e-03, -5.280e-02, -4.631e-02, 5.364e-02)); + r += mul(s1_6, M4(2.050e-02, 1.850e-02, 1.206e-02, -6.519e-02, -2.588e-02, 3.833e-02, 5.943e-02, 7.126e-03, -2.178e-02, 1.797e-02, -3.683e-02, -4.195e-02, -6.068e-03, 2.638e-03, -8.274e-02, -3.730e-03)); + r += mul(s1_7, M4(-7.091e-03, -1.474e-02, -3.124e-02, 8.422e-02, 3.969e-03, -3.473e-02, -7.462e-02, 8.463e-02, -2.426e-02, -2.767e-02, 3.222e-03, -1.197e-01, 3.608e-02, -7.492e-03, 2.443e-02, 3.272e-02)); + r += mul(s1_8, M4(-3.515e-02, 7.756e-02, 2.323e-02, -2.068e-03, -3.174e-02, 2.793e-02, -9.549e-03, -3.011e-02, 4.602e-02, 1.534e-02, -2.368e-02, 4.073e-02, 7.721e-04, -5.720e-02, -4.916e-02, -3.721e-02)); + r += mul(s2_0, M4(-1.820e-02, 2.031e-03, 3.517e-02, -8.364e-05, 2.237e-02, -3.581e-02, -1.704e-02, 4.340e-02, -3.280e-02, -4.180e-02, 1.313e-03, 5.753e-02, 6.811e-02, -2.174e-02, -1.557e-02, 4.522e-02)); + r += mul(s2_1, M4(7.392e-02, -6.128e-03, -1.237e-02, 1.148e-02, -6.618e-03, -7.516e-02, -1.376e-01, 1.592e-02, -7.999e-02, -8.762e-02, 1.362e-01, -9.180e-02, -4.042e-02, -1.606e-02, -1.146e-01, 5.234e-02)); + r += mul(s2_2, M4(-8.599e-02, 4.130e-02, -5.231e-02, -1.015e-01, -1.451e-02, 1.074e-02, 7.664e-03, -1.946e-03, -2.727e-02, 2.546e-02, -2.923e-02, 1.054e-03, -1.998e-02, 2.887e-02, -2.058e-02, 6.172e-03)); + r += mul(s2_3, M4(-2.521e-02, 2.920e-02, -2.884e-02, 5.085e-02, 6.387e-03, 1.388e-01, -2.703e-02, 3.090e-02, -3.353e-02, 1.183e-01, 1.101e-01, -2.499e-03, -6.081e-03, 1.831e-02, 7.712e-02, 2.431e-02)); + r += mul(s2_4, M4(-2.356e-04, 3.388e-01, 1.425e-01, -9.105e-02, 1.227e-01, 2.337e-01, 3.663e-01, -8.101e-02, -1.345e-01, -1.060e-01, 7.330e-02, 7.492e-02, 6.390e-02, -6.327e-02, -1.059e-01, 2.532e-02)); + r += mul(s2_5, M4(-2.131e-02, 9.620e-02, 2.738e-02, 1.781e-01, 1.186e-02, -3.139e-02, 1.622e-01, 1.332e-02, 1.446e-02, 6.668e-02, -8.837e-03, -2.280e-02, -1.797e-02, -5.522e-02, -6.821e-02, 5.381e-03)); + r += mul(s2_6, M4(4.255e-03, 2.915e-02, -1.946e-02, -3.726e-02, 6.154e-02, 9.142e-02, -8.030e-02, -7.413e-02, 8.383e-03, -4.201e-02, 3.769e-02, -3.028e-02, 2.283e-02, 3.682e-02, -2.719e-02, -9.290e-02)); + r += mul(s2_7, M4(-5.389e-02, -6.357e-02, -3.235e-02, 2.059e-02, -4.903e-02, -4.402e-02, 9.317e-02, -9.028e-02, 3.474e-02, -5.685e-02, -4.770e-02, 6.897e-02, -1.592e-03, -5.508e-02, -1.093e-01, -4.087e-02)); + r += mul(s2_8, M4(-1.201e-02, 2.813e-02, 7.967e-03, -1.412e-02, -4.968e-03, -7.406e-02, -4.071e-02, 5.814e-02, -3.361e-02, 4.794e-02, 2.608e-02, -1.053e-01, 9.912e-03, -1.430e-02, -5.146e-03, -3.337e-02)); + r += mul(s3_0, M4(5.399e-03, -1.408e-02, -8.520e-03, 1.828e-02, -3.009e-02, 2.867e-02, 4.295e-02, -4.977e-03, 1.006e-02, 7.139e-02, -7.008e-02, 5.330e-02, 1.151e-02, 3.999e-02, 1.587e-01, -1.187e-02)); + r += mul(s3_1, M4(3.153e-02, -1.296e-03, -2.652e-02, -2.695e-02, -2.573e-02, 6.398e-02, 7.744e-02, -1.045e-01, -3.284e-02, -2.658e-02, -4.192e-02, 2.935e-02, 1.737e-01, 8.090e-02, 6.350e-02, -3.588e-03)); + r += mul(s3_2, M4(-1.284e-01, 5.570e-03, -8.051e-02, -3.249e-02, 5.010e-02, 2.614e-02, -1.879e-02, 4.068e-02, 8.508e-03, 7.683e-03, -7.388e-02, -2.009e-02, 1.327e-01, 1.299e-02, 1.105e-01, -5.868e-02)); + r += mul(s3_3, M4(-4.834e-02, 2.597e-03, 2.513e-02, 3.551e-02, 3.814e-03, -2.818e-02, -3.464e-02, 9.673e-02, -4.243e-02, 9.680e-02, 1.421e-01, -6.778e-02, -3.836e-02, -1.824e-01, -1.275e-01, 6.860e-02)); + r += mul(s3_4, M4(-3.610e-02, 1.469e-01, 9.565e-02, -7.052e-02, 2.388e-01, 3.281e-01, 1.572e-01, 1.141e-01, -5.664e-02, -9.020e-02, -4.204e-02, -2.142e-01, 9.626e-02, -2.115e-01, 1.149e-01, 3.155e-02)); + r += mul(s3_5, M4(-1.574e-01, 3.679e-02, -9.191e-02, 1.334e-02, 9.225e-02, 7.839e-02, 1.189e-01, 7.757e-02, -6.101e-03, -1.166e-02, -2.972e-02, 1.585e-02, 8.454e-02, 1.571e-03, -1.009e-01, 8.238e-02)); + r += mul(s3_6, M4(6.617e-03, 4.276e-03, -1.004e-02, 4.877e-03, -6.908e-02, 3.038e-01, 3.642e-03, 4.298e-02, -1.434e-02, -9.701e-03, 1.031e-01, -3.326e-02, -5.609e-02, 7.265e-02, -9.199e-02, -6.786e-02)); + r += mul(s3_7, M4(-3.657e-02, -3.907e-02, -2.614e-02, 5.053e-02, -4.674e-02, 3.897e-02, 6.179e-02, 6.518e-02, -2.290e-02, 1.168e-01, 2.693e-02, 1.716e-01, -1.123e-03, -1.441e-01, -7.503e-02, -2.011e-01)); + r += mul(s3_8, M4(3.712e-03, 9.737e-02, 4.266e-02, -1.522e-02, 1.506e-02, 5.124e-02, -1.050e-02, -2.398e-03, -6.193e-02, 6.949e-03, 9.181e-02, -1.413e-01, 3.692e-02, 3.907e-02, -1.620e-02, 4.723e-02)); + r += mul(s4_0, M4(-3.832e-02, 1.268e-02, 3.637e-02, -6.497e-03, 1.273e-02, -4.926e-03, 1.769e-02, 2.792e-02, 3.209e-02, 1.789e-02, -1.957e-02, 5.305e-03, -7.697e-02, 5.508e-02, 6.284e-02, 8.246e-02)); + r += mul(s4_1, M4(1.266e-01, 5.521e-03, 7.739e-02, -3.385e-02, -7.007e-02, -1.094e-01, -8.701e-02, -1.716e-02, 3.682e-02, 2.189e-02, -3.292e-03, 4.518e-02, 5.096e-02, 3.030e-02, -2.765e-02, 1.187e-02)); + r += mul(s4_2, M4(8.139e-02, -2.641e-03, 4.335e-02, 5.606e-02, -2.860e-02, -2.659e-02, -3.553e-02, -4.523e-02, 6.986e-03, 3.482e-02, 1.516e-02, 3.141e-04, -2.765e-02, 9.525e-02, -2.133e-03, 6.335e-02)); + r += mul(s4_3, M4(-1.219e-02, -4.573e-02, -7.869e-02, -4.889e-02, 5.090e-02, 6.583e-02, -1.673e-02, -6.859e-02, 2.518e-02, 9.782e-02, 1.145e-01, 3.710e-03, 3.850e-02, 3.397e-02, -8.315e-03, 1.324e-01)); + r += mul(s4_4, M4(2.313e-01, 7.508e-02, 1.163e-01, 1.122e-01, 2.720e-01, -7.170e-02, 4.317e-03, -1.224e-01, -5.580e-02, 6.872e-02, 6.504e-02, 2.753e-03, 1.016e-01, 1.616e-01, 1.761e-02, 1.978e-01)); + r += mul(s4_5, M4(6.699e-02, -1.902e-03, 6.323e-02, 2.092e-02, -1.227e-01, 5.553e-02, -1.090e-01, -9.668e-02, 5.901e-02, -4.978e-02, 1.158e-01, 3.121e-02, 3.099e-02, -4.958e-02, 1.446e-03, -1.305e-02)); + r += mul(s4_6, M4(1.685e-02, 4.815e-02, -7.986e-02, -5.999e-02, -1.223e-02, -7.677e-02, 1.721e-02, -1.356e-03, -1.691e-03, 6.180e-02, 1.034e-02, 6.818e-02, 4.716e-02, 5.924e-02, -5.670e-02, -2.003e-02)); + r += mul(s4_7, M4(-1.652e-02, -4.076e-02, 1.390e-02, -3.530e-02, -6.357e-02, 1.010e-01, -1.276e-02, -1.293e-01, 2.760e-02, -2.235e-02, 7.857e-02, -1.645e-01, 6.736e-03, -4.910e-02, -1.251e-01, 4.516e-02)); + r += mul(s4_8, M4(1.493e-02, 1.621e-02, 1.737e-02, -6.024e-02, -6.386e-02, 6.611e-02, 1.032e-02, -2.474e-02, 1.154e-01, -1.667e-02, -1.522e-02, 1.019e-01, 2.936e-02, -1.006e-02, 8.141e-03, -7.483e-02)); + r += mul(s5_0, M4(3.462e-02, 4.645e-02, -3.133e-02, -5.007e-02, 1.532e-02, 3.076e-02, 4.806e-02, 4.797e-02, 3.307e-02, -3.395e-02, -2.991e-02, 1.428e-02, 6.843e-03, 9.166e-02, 4.885e-02, -1.195e-01)); + r += mul(s5_1, M4(1.708e-01, -5.167e-02, -2.132e-01, 1.494e-01, -6.992e-02, -3.423e-02, 5.964e-03, -4.237e-02, 8.228e-04, -9.467e-03, -9.449e-02, 2.903e-02, 1.024e-01, -4.823e-02, 2.013e-01, 9.347e-02)); + r += mul(s5_2, M4(-5.565e-02, 3.143e-02, -7.558e-02, 1.739e-02, 3.807e-03, 4.152e-02, -4.658e-03, -3.292e-02, 2.328e-02, -2.435e-02, -3.833e-02, -2.558e-02, -9.393e-02, 2.188e-03, -1.499e-01, 9.052e-02)); + r += mul(s5_3, M4(9.999e-02, 3.884e-02, 1.246e-02, -2.378e-01, 3.749e-02, -8.477e-02, -1.596e-01, 5.331e-02, 7.443e-02, -2.068e-03, 7.423e-02, 2.302e-02, -1.746e-02, -8.780e-02, 2.456e-02, 2.892e-02)); + r += mul(s5_4, M4(1.431e-01, 2.626e-01, 1.768e-03, 2.086e-01, 1.998e-01, 1.039e-01, 1.180e-02, -3.161e-01, -5.660e-02, -7.840e-02, 3.081e-02, -4.673e-02, 1.560e-01, 1.627e-02, -6.563e-02, -2.814e-02)); + r += mul(s5_5, M4(1.096e-01, -3.109e-02, -2.397e-02, -1.734e-01, -6.526e-02, 3.306e-03, 8.834e-02, -1.194e-01, -1.396e-03, -5.618e-02, 7.349e-02, -4.823e-03, -2.177e-02, -5.782e-02, -1.893e-01, 2.426e-02)); + r += mul(s5_6, M4(-2.352e-03, -3.160e-02, -1.185e-02, -7.712e-02, -3.358e-02, 4.870e-02, 4.227e-02, -2.398e-02, 1.136e-01, -1.042e-01, 2.561e-02, -9.641e-02, -2.812e-02, 2.797e-02, -1.537e-02, 5.092e-02)); + r += mul(s5_7, M4(3.419e-02, -2.995e-02, -5.608e-03, 6.518e-02, 1.412e-03, 5.324e-02, -2.010e-02, -6.216e-02, -2.328e-02, -7.162e-02, 3.648e-03, -2.010e-03, 6.645e-02, -2.244e-02, -4.760e-02, -5.183e-02)); + r += mul(s5_8, M4(5.211e-02, -2.610e-02, -1.471e-02, -9.500e-02, -5.246e-02, -6.899e-02, 1.645e-02, 1.771e-02, 1.832e-02, -1.096e-01, -1.150e-02, 2.276e-02, 1.380e-02, 2.443e-02, 3.817e-03, -1.092e-02)); + r += mul(s6_0, M4(-3.862e-03, -4.457e-02, 3.379e-02, -4.069e-02, -1.630e-02, -1.174e-01, -8.180e-02, 1.008e-01, -1.150e-02, -2.984e-02, 4.478e-02, -7.575e-02, -2.913e-03, -2.517e-02, 1.156e-02, -2.614e-02)); + r += mul(s6_1, M4(-1.031e-02, 8.463e-02, -5.762e-02, 6.699e-02, 5.885e-02, -7.425e-02, 3.812e-01, -1.546e-01, 1.595e-01, 3.535e-02, 6.493e-02, 6.501e-02, 2.222e-01, -2.002e-02, 2.322e-01, -1.815e-01)); + r += mul(s6_2, M4(-6.760e-02, -2.382e-02, -5.488e-03, -4.010e-02, -2.833e-02, 2.207e-02, 4.522e-02, -8.453e-04, 5.499e-02, -7.280e-04, 9.686e-02, -3.247e-02, -3.098e-02, 5.225e-03, 2.746e-03, 4.568e-03)); + r += mul(s6_3, M4(-2.646e-02, -5.002e-02, -5.677e-02, 2.103e-02, -5.503e-02, 1.762e-01, 2.568e-01, -3.145e-02, -1.158e-01, -2.686e-02, -2.261e-03, 1.432e-01, -5.379e-02, 1.851e-01, -1.858e-01, 1.018e-01)); + r += mul(s6_4, M4(5.892e-02, 1.199e-01, 4.789e-03, -1.124e-02, 5.058e-03, -4.334e-02, -1.585e-01, -2.955e-02, 3.912e-02, 1.930e-02, 3.203e-01, -1.101e-01, 3.556e-02, -1.962e-01, -7.748e-03, 5.015e-02)); + r += mul(s6_5, M4(1.142e-02, -9.138e-02, 1.035e-02, 3.228e-02, 7.962e-03, -5.724e-02, 1.176e-01, -8.011e-02, 7.068e-02, 4.782e-02, 5.572e-02, 7.706e-03, -7.708e-02, -1.446e-02, -1.120e-01, 9.828e-02)); + r += mul(s6_6, M4(-9.079e-02, 1.029e-02, -1.688e-02, -7.920e-03, 2.706e-02, -5.572e-02, -2.741e-02, 2.909e-02, -5.032e-02, 1.062e-01, -3.936e-03, -3.121e-03, 6.855e-02, 8.418e-03, -4.407e-02, 2.442e-02)); + r += mul(s6_7, M4(-5.259e-02, -3.667e-02, 1.936e-02, -1.913e-02, -1.692e-01, -3.561e-02, 6.175e-03, -1.379e-01, 8.600e-03, -1.716e-02, -2.808e-02, -7.197e-02, 1.118e-01, 7.306e-02, 4.102e-04, -1.042e-02)); + r += mul(s6_8, M4(-2.531e-02, -5.164e-02, 5.493e-02, 4.854e-03, 4.111e-02, -7.896e-03, -3.981e-02, -1.526e-02, -2.048e-02, 7.083e-02, 4.344e-03, 3.989e-02, -1.630e-02, -1.826e-02, -8.093e-02, -6.308e-04)); + r += mul(s7_0, M4(3.179e-02, -3.518e-02, 8.211e-03, -3.691e-02, -4.746e-02, -5.822e-02, 5.080e-03, 4.791e-02, -8.146e-02, -4.501e-02, -8.433e-02, 5.157e-02, -5.932e-03, -7.118e-02, 8.522e-02, -2.141e-02)); + r += mul(s7_1, M4(-1.645e-02, 6.074e-02, -4.580e-02, 1.038e-01, 1.166e-03, 7.635e-02, 8.076e-02, 7.206e-02, -3.724e-02, -2.647e-02, -1.186e-01, -2.410e-01, 3.958e-02, 3.122e-02, 6.193e-02, -2.849e-02)); + r += mul(s7_2, M4(-4.077e-02, -6.603e-02, 1.554e-02, -9.247e-02, 4.797e-02, 1.116e-02, 5.387e-02, 6.568e-02, 9.707e-02, -1.168e-01, -2.311e-02, -6.518e-02, 5.924e-02, 2.867e-02, 1.313e-02, 3.773e-02)); + r += mul(s7_3, M4(-3.563e-03, 7.289e-03, 2.709e-02, -4.880e-02, 3.392e-02, 4.283e-02, -5.466e-02, 1.689e-01, -2.436e-01, 1.429e-01, 2.042e-02, -8.785e-03, 3.645e-02, -5.496e-02, -9.380e-02, 2.743e-02)); + r += mul(s7_4, M4(-1.373e-02, 2.219e-01, 1.243e-01, -7.018e-03, 5.706e-02, 9.000e-02, 6.202e-02, 5.073e-02, 6.981e-02, 1.098e-01, 6.312e-02, -2.690e-01, -6.929e-02, -1.420e-01, -4.161e-02, 4.677e-02)); + r += mul(s7_5, M4(8.620e-03, -1.344e-01, 1.955e-02, 3.364e-02, 2.047e-02, -2.089e-02, 2.387e-02, 3.861e-02, 8.585e-02, 1.298e-01, 9.145e-02, 1.203e-01, 2.402e-02, 2.671e-02, -5.028e-02, 2.961e-02)); + r += mul(s7_6, M4(-9.698e-02, -1.387e-01, -4.587e-02, -9.452e-02, -1.401e-02, 6.006e-02, -2.798e-02, -2.705e-02, 1.314e-02, -8.691e-02, 1.942e-01, -6.650e-02, 1.515e-02, -5.807e-02, -1.731e-02, 1.272e-02)); + r += mul(s7_7, M4(5.433e-02, -1.554e-01, 3.201e-02, -4.814e-02, -1.103e-02, -2.647e-02, -2.818e-02, -1.187e-01, -4.173e-02, -4.040e-02, 1.017e-01, 1.150e-01, 4.694e-02, 5.182e-02, 2.534e-02, 6.666e-02)); + r += mul(s7_8, M4(-1.063e-01, -1.207e-01, -1.622e-02, -1.400e-01, 1.736e-02, -2.373e-02, -4.898e-02, -7.461e-03, -1.487e-01, 1.490e-01, 6.622e-02, 6.458e-02, -3.789e-02, -8.266e-03, -4.094e-03, -2.403e-02)); + r += V4(-1.023e-03, -5.476e-03, -1.095e-03, 8.393e-03); + return r; +} + +V4 f1(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-2.573e-02, 7.161e-03, -1.394e-01, 1.384e-01, -3.247e-03, 1.157e-02, 3.153e-02, 8.984e-02, -3.248e-02, -2.035e-02, -1.046e-01, 3.980e-03, -3.628e-02, -1.367e-01, 1.576e-02, -3.332e-04)); + r += mul(s0_1, M4(4.613e-02, -1.812e-01, -1.357e-01, -1.675e-01, -6.227e-02, -1.151e-01, 1.651e-01, -2.293e-01, -9.434e-03, -1.326e-02, -4.655e-02, 1.017e-01, 1.309e-01, -1.708e-01, -1.040e-01, 9.153e-02)); + r += mul(s0_2, M4(3.717e-03, -7.694e-02, 4.162e-02, 5.294e-03, -7.090e-04, 1.402e-01, 4.746e-01, 3.394e-01, -8.056e-03, 1.615e-01, -1.601e-01, -1.504e-01, -3.151e-02, -1.598e-01, 8.280e-02, -7.239e-02)); + r += mul(s0_3, M4(1.435e-01, -6.425e-02, 8.871e-02, -3.297e-03, -6.458e-03, -7.106e-02, 6.263e-02, 6.034e-02, -2.182e-02, -4.167e-02, 1.302e-01, -1.225e-01, -4.979e-02, -1.993e-02, -9.899e-02, 3.386e-02)); + r += mul(s0_4, M4(1.124e-01, 9.458e-02, 9.471e-02, -3.604e-02, 4.534e-02, -1.150e-01, 3.417e-01, -2.311e-01, -3.389e-01, -6.695e-02, -2.336e-01, 1.636e-01, -8.270e-02, -1.108e-01, 3.848e-02, 1.033e-01)); + r += mul(s0_5, M4(-4.395e-02, -3.300e-02, -1.609e-02, 8.713e-02, 1.459e-01, 5.272e-02, -1.280e-02, 1.466e-01, 1.860e-01, 9.840e-02, -5.078e-02, 2.870e-01, -6.188e-03, 1.225e-02, -9.529e-04, -3.990e-02)); + r += mul(s0_6, M4(-9.568e-02, -3.502e-02, 1.392e-02, -7.841e-02, -5.583e-02, -7.886e-02, 1.558e-01, 6.859e-03, -7.477e-02, 5.847e-02, -6.967e-02, -1.716e-02, 6.263e-02, 4.919e-02, -4.312e-02, 1.140e-01)); + r += mul(s0_7, M4(-4.097e-02, 7.478e-03, -4.635e-02, 1.104e-01, -4.515e-02, 2.753e-02, 8.515e-02, -7.188e-02, 2.395e-01, -2.184e-01, 8.484e-02, -3.227e-02, 1.199e-01, 9.138e-03, -3.123e-02, -1.577e-01)); + r += mul(s0_8, M4(-8.219e-03, -1.490e-02, -8.796e-03, -2.059e-02, -5.515e-02, -6.055e-02, 7.589e-02, -2.023e-01, -4.113e-02, 1.042e-01, -1.265e-02, -1.381e-01, 1.343e-02, 4.605e-02, -3.767e-03, 1.201e-03)); + r += mul(s1_0, M4(2.016e-04, -1.245e-02, 6.322e-02, -1.525e-02, 2.221e-02, 1.095e-02, 1.194e-02, 9.600e-02, -3.933e-02, 1.940e-02, 3.535e-02, 2.109e-02, -7.410e-03, -9.155e-02, -3.142e-02, -1.542e-02)); + r += mul(s1_1, M4(-6.849e-02, -1.181e-02, -6.625e-02, -5.465e-02, 9.366e-03, -6.903e-02, 9.370e-03, 2.291e-02, 7.970e-02, -9.807e-02, -5.992e-02, -2.611e-02, 8.352e-02, -3.817e-02, -2.603e-01, -9.509e-02)); + r += mul(s1_2, M4(-3.822e-02, 1.860e-03, 1.496e-02, 3.446e-02, -4.222e-02, -5.801e-02, -1.759e-02, -3.728e-02, -3.129e-02, -6.919e-02, 3.399e-02, 8.443e-02, -1.116e-02, -1.891e-01, 4.978e-02, -1.214e-01)); + r += mul(s1_3, M4(6.401e-02, -1.500e-02, 4.268e-02, 6.755e-02, -5.093e-02, 4.304e-03, 3.347e-02, 6.392e-02, -7.130e-03, -7.521e-02, -5.611e-02, 2.549e-02, 5.164e-02, -6.756e-02, -5.487e-02, -8.458e-02)); + r += mul(s1_4, M4(-1.466e-01, 1.242e-01, -1.156e-01, 5.293e-02, 8.086e-02, 9.438e-02, 8.676e-02, -5.026e-02, -6.387e-02, -3.977e-02, -2.101e-01, 4.470e-02, -1.718e-01, 8.650e-02, -6.104e-02, 2.093e-01)); + r += mul(s1_5, M4(7.186e-03, 1.095e-01, -3.019e-02, -7.367e-02, 4.784e-02, -2.984e-02, 1.548e-01, 4.014e-02, -2.274e-02, -6.932e-02, 8.882e-03, -8.839e-02, 1.595e-02, -8.845e-02, -3.382e-02, 2.831e-02)); + r += mul(s1_6, M4(7.803e-02, -3.916e-02, 4.040e-02, -8.003e-03, -2.292e-02, 3.720e-04, 2.760e-04, -9.340e-02, -8.947e-03, 3.776e-02, 1.220e-02, -1.332e-02, 3.498e-02, 8.433e-03, -4.860e-03, 2.310e-02)); + r += mul(s1_7, M4(9.365e-02, 5.603e-02, 5.709e-02, -2.146e-02, 3.112e-02, 5.482e-02, -1.228e-01, -1.350e-02, -1.083e-01, -6.226e-02, -3.162e-02, 1.401e-01, -9.468e-02, 2.175e-02, -2.463e-02, 1.193e-01)); + r += mul(s1_8, M4(-4.383e-02, -1.938e-03, 4.882e-02, 1.799e-02, -2.591e-02, -4.417e-03, -1.007e-02, -9.185e-03, 8.383e-02, 6.579e-02, -8.530e-03, -5.193e-02, 2.283e-02, -1.385e-02, -2.455e-02, 3.144e-02)); + r += mul(s2_0, M4(1.308e-02, -4.129e-02, 6.100e-02, -2.254e-02, 3.781e-03, -3.459e-03, -2.241e-02, 1.786e-02, 1.050e-01, -9.929e-03, 4.915e-02, 2.106e-02, 1.135e-02, 1.480e-02, 7.930e-02, -2.687e-02)); + r += mul(s2_1, M4(2.061e-02, 1.022e-01, 4.907e-03, -2.897e-04, -4.002e-02, 1.392e-02, 4.454e-02, 1.162e-01, -5.265e-02, -3.792e-02, -1.516e-01, -5.061e-02, -3.113e-03, 5.001e-02, 4.598e-02, 4.826e-02)); + r += mul(s2_2, M4(-3.237e-02, -2.990e-02, -2.588e-02, -4.802e-02, -3.918e-02, 8.142e-03, -2.035e-02, 4.014e-02, 1.608e-02, -1.177e-01, 7.554e-02, 7.580e-03, -4.732e-03, 7.434e-02, -1.306e-02, -3.381e-02)); + r += mul(s2_3, M4(-1.094e-02, -2.189e-02, 3.220e-02, -1.951e-02, -3.567e-02, 5.732e-02, -1.381e-02, 4.216e-02, 1.725e-01, 2.610e-02, 9.859e-02, -1.376e-02, -1.063e-02, -6.666e-02, 1.189e-01, -3.116e-02)); + r += mul(s2_4, M4(2.312e-02, -3.798e-02, 2.498e-01, -2.597e-02, -1.083e-01, -4.158e-02, -5.762e-02, -1.442e-01, -1.496e-01, 2.726e-01, 4.038e-02, 2.902e-01, 1.832e-01, 3.059e-01, 1.669e-01, 8.272e-02)); + r += mul(s2_5, M4(5.626e-02, 2.406e-02, -4.238e-03, -1.034e-01, 2.738e-02, -6.185e-02, -1.111e-02, 6.729e-02, 3.129e-02, 1.094e-01, 4.609e-02, -9.522e-02, -2.542e-03, 3.714e-02, 7.407e-02, 2.085e-02)); + r += mul(s2_6, M4(3.705e-02, 2.203e-02, -4.068e-03, -4.938e-03, 3.399e-02, 5.753e-02, -4.125e-02, 6.187e-03, 1.006e-03, -2.532e-02, -7.392e-02, -4.208e-02, 4.891e-04, 4.096e-02, -8.405e-03, -8.183e-02)); + r += mul(s2_7, M4(-5.748e-02, 1.425e-02, -4.628e-02, -3.472e-02, -8.695e-02, 3.295e-02, -1.161e-04, 7.621e-02, 2.446e-01, -2.509e-02, 4.684e-02, 3.021e-02, 1.064e-01, 3.324e-02, -5.020e-02, 3.505e-02)); + r += mul(s2_8, M4(1.471e-01, -8.890e-03, -2.134e-02, -5.017e-02, 1.289e-01, 1.870e-02, -1.334e-03, 6.631e-03, -5.090e-02, -2.298e-02, 8.366e-03, 4.866e-02, 2.154e-02, 2.739e-03, -2.546e-02, 1.433e-02)); + r += mul(s3_0, M4(5.419e-05, -3.101e-02, 1.352e-02, 5.712e-03, 1.911e-02, -5.360e-02, -3.807e-02, 2.918e-02, 6.095e-02, 6.460e-02, 4.945e-02, -3.199e-02, -2.867e-02, -3.446e-02, 3.003e-02, 9.988e-03)); + r += mul(s3_1, M4(3.341e-02, 4.134e-02, 7.844e-02, 5.281e-03, 3.089e-02, 8.452e-04, -8.457e-03, -3.729e-02, -7.936e-02, -7.109e-02, -9.334e-03, -1.782e-03, 6.665e-02, 8.836e-02, -6.156e-02, -2.519e-03)); + r += mul(s3_2, M4(3.780e-02, -7.643e-02, 7.086e-02, -1.028e-01, -6.268e-02, -2.949e-02, 3.898e-02, 3.796e-02, 1.433e-02, 5.399e-02, -1.050e-02, -1.622e-02, 6.334e-02, -1.028e-01, -1.726e-02, -4.961e-02)); + r += mul(s3_3, M4(3.620e-03, 2.926e-02, 3.623e-02, -3.697e-02, -1.348e-01, -1.576e-02, 5.374e-03, 1.145e-01, 9.554e-02, -4.427e-03, 1.754e-01, -1.602e-01, -4.351e-02, -9.182e-03, 2.175e-03, 1.934e-01)); + r += mul(s3_4, M4(1.113e-02, 3.872e-02, 8.718e-02, 2.359e-01, -2.204e-02, 1.151e-01, 8.256e-02, -1.061e-02, -1.436e-01, 2.401e-01, -1.791e-01, 6.773e-02, 1.237e-01, 6.238e-03, 8.617e-02, 1.325e-01)); + r += mul(s3_5, M4(6.094e-02, -4.889e-02, -4.181e-02, -5.091e-02, -1.361e-01, 5.353e-02, -1.405e-02, -2.197e-02, -1.387e-02, 1.213e-01, -4.815e-02, 5.208e-02, -8.138e-03, 8.380e-02, 9.473e-02, -2.112e-02)); + r += mul(s3_6, M4(3.975e-02, 2.303e-02, -2.360e-02, -4.115e-02, -1.806e-01, 6.812e-02, -5.047e-03, 3.640e-02, 4.126e-02, -1.231e-02, -1.294e-02, -1.101e-01, -5.582e-02, 4.136e-02, 5.346e-02, 1.579e-01)); + r += mul(s3_7, M4(5.396e-03, -1.426e-02, -4.466e-03, 1.801e-02, 1.972e-01, 4.674e-02, -3.575e-03, -2.665e-02, 6.105e-02, 2.017e-02, 6.524e-02, -8.115e-03, 2.212e-01, 2.100e-03, -4.350e-02, 1.854e-02)); + r += mul(s3_8, M4(-6.050e-02, -1.345e-02, -6.604e-03, -5.172e-02, -8.451e-02, 3.536e-03, 7.087e-02, 5.787e-02, -6.050e-02, -4.158e-02, -1.844e-03, 2.855e-02, -4.274e-03, 1.703e-02, -8.310e-03, -2.246e-02)); + r += mul(s4_0, M4(-4.596e-02, -1.015e-01, 2.650e-02, 7.098e-02, 3.649e-02, 4.925e-02, 5.334e-02, -8.714e-02, 8.703e-02, 4.129e-02, -2.322e-02, -1.195e-01, -7.584e-02, -5.361e-02, 1.496e-02, 1.593e-02)); + r += mul(s4_1, M4(4.722e-03, -4.852e-02, 2.723e-02, -2.235e-02, -2.773e-02, 1.028e-01, -1.812e-02, 1.027e-01, -2.067e-02, 1.548e-02, 8.800e-04, -8.573e-02, -9.428e-02, 2.252e-01, -4.724e-02, 9.352e-03)); + r += mul(s4_2, M4(7.280e-02, -2.637e-03, 4.746e-02, -1.859e-02, -4.016e-02, 9.909e-02, 9.699e-03, 5.240e-02, 1.797e-02, 1.215e-02, 1.597e-02, -4.656e-02, -3.596e-02, 7.321e-02, 4.878e-02, -7.422e-02)); + r += mul(s4_3, M4(-7.108e-02, 4.416e-02, -1.583e-01, 2.224e-02, 1.006e-02, 3.720e-02, -4.746e-02, -2.819e-02, 6.086e-02, -5.138e-02, 9.156e-02, -1.485e-01, -9.078e-02, -1.576e-02, -1.673e-01, -9.070e-02)); + r += mul(s4_4, M4(-9.867e-02, -5.303e-03, -1.966e-01, -1.493e-02, -5.443e-02, -1.451e-01, -9.871e-02, 3.058e-01, -1.140e-01, 9.568e-02, 7.999e-02, -2.637e-02, 2.875e-02, 1.180e-01, -7.128e-02, -4.867e-02)); + r += mul(s4_5, M4(3.243e-02, -1.208e-01, -3.402e-02, -2.245e-03, -4.308e-02, 1.428e-01, -5.843e-02, 9.481e-02, 9.735e-02, -1.653e-02, 9.207e-02, 1.336e-02, -6.181e-03, -8.522e-02, 2.598e-02, -3.312e-02)); + r += mul(s4_6, M4(1.656e-01, 3.756e-03, 7.547e-02, 7.159e-03, -4.749e-02, -4.120e-02, 4.557e-03, -2.466e-02, -4.164e-02, 1.486e-02, -4.251e-02, -4.409e-02, 1.866e-02, 9.305e-03, 1.946e-02, -3.284e-02)); + r += mul(s4_7, M4(-2.038e-01, 3.747e-02, -3.268e-02, 1.458e-01, -9.368e-02, 4.332e-02, -9.126e-03, 5.230e-02, 2.123e-02, -2.027e-02, -1.157e-02, 5.292e-03, -1.271e-01, 6.416e-02, -3.124e-02, 9.119e-02)); + r += mul(s4_8, M4(-1.941e-03, 1.871e-02, -3.535e-02, -5.836e-03, -1.567e-01, -6.096e-02, 8.461e-02, -3.906e-02, -2.157e-03, 4.560e-04, -3.187e-02, -6.424e-02, 9.766e-02, -3.718e-02, -8.667e-03, -5.434e-02)); + r += mul(s5_0, M4(-1.437e-02, -4.311e-02, 1.089e-01, -4.203e-02, 1.390e-02, -5.211e-02, 1.092e-01, -7.442e-02, 4.226e-02, 3.647e-02, -8.262e-03, 4.980e-03, 1.170e-01, -5.219e-03, -5.846e-02, 4.702e-03)); + r += mul(s5_1, M4(-6.668e-02, 1.068e-01, 7.230e-02, 4.628e-02, -2.293e-02, -9.088e-03, 4.155e-02, 4.672e-02, 3.436e-02, 2.117e-02, -6.884e-03, -4.562e-02, -2.062e-01, -2.815e-02, -4.868e-02, -8.531e-02)); + r += mul(s5_2, M4(-2.891e-02, 1.159e-01, -3.923e-02, -6.473e-02, -6.329e-02, 1.374e-01, -6.642e-02, 2.313e-02, 6.638e-02, -4.668e-02, -3.050e-02, -3.969e-02, 5.642e-02, 2.006e-02, 5.561e-02, -1.101e-02)); + r += mul(s5_3, M4(7.491e-02, -3.847e-02, 1.783e-01, -2.926e-01, -8.981e-02, 1.206e-02, -6.551e-02, 1.380e-01, -1.125e-02, 7.559e-02, -1.997e-02, 1.007e-01, -1.883e-02, -1.027e-02, -2.135e-01, -3.129e-01)); + r += mul(s5_4, M4(1.314e-01, 8.873e-02, 7.119e-02, 2.532e-02, 9.858e-02, -1.783e-01, 1.628e-01, -2.206e-02, 2.891e-02, 9.753e-02, 1.155e-01, -7.199e-03, 2.056e-03, -6.549e-02, -1.366e-01, 2.333e-03)); + r += mul(s5_5, M4(-1.068e-02, 1.411e-01, -4.501e-02, 2.911e-02, 9.187e-02, 1.723e-02, -5.198e-02, 1.612e-01, 9.846e-02, -3.100e-02, -2.407e-02, 6.244e-02, 3.320e-02, 9.104e-03, 9.100e-03, -6.003e-02)); + r += mul(s5_6, M4(1.696e-02, -3.728e-02, -8.617e-03, 8.058e-03, -3.662e-02, 2.435e-02, 1.711e-02, 3.828e-02, 7.287e-03, -3.812e-02, -1.860e-02, 3.019e-02, -1.127e-02, 6.945e-03, -1.815e-02, 1.496e-02)); + r += mul(s5_7, M4(9.003e-02, -5.317e-02, 2.473e-02, 1.538e-03, 3.161e-02, 4.279e-02, 6.593e-03, -1.882e-01, -1.911e-02, -2.540e-02, 2.651e-02, 4.482e-02, -4.051e-02, 3.864e-02, -1.276e-02, -6.016e-02)); + r += mul(s5_8, M4(3.874e-02, -2.374e-02, -1.513e-04, -1.703e-03, 9.969e-02, -5.193e-02, 3.489e-02, 8.153e-03, 2.798e-02, 2.703e-02, -2.741e-02, 5.867e-02, -3.113e-02, 3.298e-02, 2.207e-02, 5.378e-02)); + r += mul(s6_0, M4(-4.333e-02, -2.164e-02, -1.891e-02, -2.478e-02, -8.467e-02, -2.836e-02, 2.656e-02, 2.228e-01, 2.438e-02, -5.832e-02, -5.970e-03, -2.624e-02, -7.549e-02, -8.601e-02, 3.399e-02, 2.754e-02)); + r += mul(s6_1, M4(3.181e-02, 9.488e-02, 8.526e-02, 2.832e-02, 9.164e-02, 9.265e-02, 2.801e-02, 6.820e-03, 2.016e-02, 4.320e-02, 1.761e-02, 8.020e-02, -2.823e-03, 1.213e-01, -5.059e-03, 1.175e-02)); + r += mul(s6_2, M4(-3.608e-02, 9.750e-03, -5.425e-02, -1.999e-02, 2.937e-02, 1.068e-01, 1.056e-01, 6.960e-02, -5.103e-03, -1.125e-02, -3.947e-02, -1.366e-02, -2.286e-02, 2.616e-02, 3.017e-02, 2.436e-02)); + r += mul(s6_3, M4(-2.321e-02, -5.012e-03, -5.651e-02, 6.494e-02, 6.039e-02, -1.996e-02, 1.684e-01, -1.389e-01, 8.584e-03, -5.589e-02, -8.010e-02, -1.454e-02, -1.799e-01, 6.040e-02, -2.547e-04, 1.265e-02)); + r += mul(s6_4, M4(2.273e-02, 5.835e-02, 4.878e-02, -1.032e-01, -1.307e-01, 3.118e-01, 1.039e-01, 5.808e-02, 7.333e-02, -6.361e-02, 8.217e-02, -2.615e-02, -2.997e-02, 2.579e-01, -2.016e-01, -7.790e-03)); + r += mul(s6_5, M4(3.064e-02, -1.017e-01, -3.927e-02, -3.303e-04, -1.426e-02, -1.747e-01, -5.337e-02, 3.372e-02, -3.211e-02, 7.596e-02, -2.422e-02, -3.888e-02, 3.963e-03, 1.547e-01, 1.863e-02, 1.161e-02)); + r += mul(s6_6, M4(-6.109e-02, 5.664e-03, 4.154e-02, 3.335e-02, 1.658e-01, -8.779e-02, 4.245e-02, -9.629e-03, 1.819e-03, -1.133e-02, 5.707e-02, 2.083e-02, -7.984e-03, 3.163e-02, 3.429e-02, 7.658e-02)); + r += mul(s6_7, M4(5.135e-02, -1.260e-02, 6.356e-03, -7.248e-03, -1.947e-01, -3.594e-02, 1.387e-02, 1.234e-01, 4.695e-02, -1.174e-02, 6.543e-02, -8.830e-02, -6.473e-02, 9.215e-02, -8.994e-03, -5.335e-02)); + r += mul(s6_8, M4(2.110e-02, 9.331e-02, -2.727e-03, 8.553e-03, 1.118e-01, 1.612e-02, 3.993e-02, -6.754e-02, -7.692e-02, 3.361e-02, 2.152e-02, 2.288e-02, -1.812e-01, 1.344e-02, -2.324e-02, 1.259e-01)); + r += mul(s7_0, M4(-3.143e-02, 1.270e-02, 2.812e-03, -3.664e-02, -3.640e-02, -5.367e-02, -6.271e-02, 7.864e-02, 3.176e-02, -9.713e-02, -1.309e-01, 1.282e-01, -9.484e-03, -7.186e-02, -5.679e-02, 6.335e-03)); + r += mul(s7_1, M4(2.077e-02, 4.741e-02, 6.566e-02, 2.128e-02, 1.068e-02, -4.366e-02, 3.465e-03, -7.231e-02, -5.704e-04, 6.338e-02, -6.195e-03, 9.465e-02, -5.166e-02, 4.834e-03, -1.855e-02, 1.058e-01)); + r += mul(s7_2, M4(2.486e-03, -2.980e-02, -3.408e-02, -1.577e-02, -1.064e-02, -1.997e-02, 2.767e-02, 4.654e-03, 9.022e-03, -1.070e-01, 1.364e-02, 5.342e-02, 1.118e-02, -5.942e-02, 6.186e-02, 3.055e-02)); + r += mul(s7_3, M4(1.410e-02, -4.275e-02, 7.937e-02, 2.648e-02, -8.021e-03, -1.177e-02, 3.691e-02, 1.041e-01, 4.750e-02, -1.635e-02, -1.884e-02, -2.387e-01, -1.456e-02, 1.608e-02, -9.824e-03, -8.208e-02)); + r += mul(s7_4, M4(8.184e-02, 1.641e-01, 5.635e-02, -1.439e-01, -1.819e-01, 1.210e-01, -6.449e-02, -5.453e-02, 1.468e-01, 2.512e-01, -6.038e-02, 8.986e-02, -2.204e-01, 1.205e-01, -3.414e-02, -7.794e-03)); + r += mul(s7_5, M4(1.883e-02, -7.130e-04, 9.819e-02, 9.457e-02, -1.506e-02, 2.341e-03, -2.388e-02, -4.613e-02, 1.039e-01, 6.381e-02, -1.535e-01, -1.390e-01, 1.277e-02, 1.570e-01, 2.231e-02, -1.025e-02)); + r += mul(s7_6, M4(-1.148e-01, 3.073e-02, -1.026e-01, 2.518e-01, -5.945e-03, 2.623e-02, -1.987e-05, 1.573e-02, 2.702e-03, -7.482e-02, -1.182e-02, 1.288e-02, 2.059e-02, -1.404e-02, 2.169e-03, 1.898e-02)); + r += mul(s7_7, M4(7.418e-02, -1.265e-01, -1.586e-02, 1.307e-01, 2.444e-03, 2.544e-02, 2.896e-02, 5.353e-03, 3.958e-02, -6.330e-03, -4.618e-03, 1.731e-02, -4.983e-04, 4.898e-02, 3.626e-02, -1.872e-02)); + r += mul(s7_8, M4(-3.294e-02, 2.496e-02, -4.163e-03, 1.318e-01, 1.180e-01, -1.751e-02, 1.257e-02, -1.621e-02, -1.501e-01, -2.276e-02, 3.091e-02, 1.136e-02, -1.445e-01, 2.529e-02, 1.941e-02, 6.400e-02)); + r += V4(8.587e-03, 7.166e-03, 8.947e-03, 4.751e-03); + return r; +} + +V4 f2(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(8.282e-02, -7.501e-03, -1.857e-02, 2.125e-02, -9.094e-02, -1.234e-02, 3.117e-02, -4.372e-02, 5.749e-02, 1.487e-02, 2.390e-02, -4.648e-02, 2.412e-02, 9.416e-02, -4.091e-02, -7.010e-03)); + r += mul(s0_1, M4(7.699e-03, -1.461e-03, -1.739e-01, -1.072e-01, 7.644e-02, 1.704e-01, 4.967e-02, -1.591e-01, -1.191e-01, 6.662e-02, 5.521e-03, 4.485e-02, 2.038e-01, 1.115e-01, 2.296e-02, -3.010e-02)); + r += mul(s0_2, M4(1.087e-01, -9.153e-02, 8.022e-02, 1.570e-03, -6.340e-02, -3.081e-01, -1.052e-01, 1.030e-01, 9.012e-03, 3.300e-02, -5.430e-02, -5.508e-02, -9.428e-02, 2.964e-02, -2.834e-02, -6.783e-02)); + r += mul(s0_3, M4(6.784e-03, -1.459e-02, 1.777e-02, 6.636e-02, -5.034e-03, -4.580e-02, 3.943e-02, -6.539e-02, 6.990e-02, -9.399e-02, 3.101e-02, 1.040e-03, 1.083e-01, -3.711e-02, -1.661e-02, 3.074e-02)); + r += mul(s0_4, M4(-3.250e-02, -1.161e-01, 1.656e-01, -1.243e-01, 1.532e-02, -1.397e-02, 3.399e-02, -7.091e-02, 1.263e-01, 1.034e-01, 3.741e-02, -4.138e-02, 2.900e-01, -9.898e-02, -9.064e-02, 1.358e-01)); + r += mul(s0_5, M4(1.519e-01, -1.029e-01, -4.519e-02, 1.114e-02, 6.039e-02, 1.862e-01, -4.409e-02, -4.450e-02, 1.858e-01, 5.967e-02, 6.574e-02, 6.440e-02, 5.312e-02, 5.240e-02, -7.643e-02, -4.162e-02)); + r += mul(s0_6, M4(-4.410e-02, -6.757e-05, 1.782e-02, 3.755e-02, -1.586e-01, -1.383e-02, -1.596e-02, -5.003e-02, -1.231e-01, -2.110e-02, 9.221e-02, 9.457e-02, -4.785e-02, 4.241e-02, -5.256e-02, 3.678e-02)); + r += mul(s0_7, M4(2.781e-02, -7.796e-02, 4.718e-02, 1.196e-01, -2.547e-01, -2.209e-02, -3.105e-02, -1.510e-01, 6.214e-02, 3.699e-02, -1.110e-02, -2.115e-02, -2.354e-03, 8.718e-02, 1.031e-01, 8.796e-02)); + r += mul(s0_8, M4(2.464e-02, 2.310e-02, -7.324e-02, -6.761e-02, 2.163e-01, 4.396e-02, 7.289e-03, -1.429e-01, -1.751e-01, -6.605e-02, 2.203e-02, -1.974e-01, -7.655e-02, 4.021e-03, -3.618e-03, 7.687e-02)); + r += mul(s1_0, M4(-8.670e-02, -4.925e-02, -5.791e-03, -1.917e-02, -4.395e-02, 3.902e-03, -7.226e-04, -2.517e-02, -1.135e-01, 1.866e-02, 7.547e-03, 4.762e-03, -3.201e-02, 7.010e-02, 7.117e-02, 2.464e-03)); + r += mul(s1_1, M4(-7.021e-02, -2.683e-02, 5.226e-02, -5.977e-02, -6.292e-02, -3.425e-03, 3.800e-02, 7.317e-03, -9.742e-02, -2.554e-02, -7.991e-02, -1.119e-01, 5.196e-02, 9.553e-02, -6.086e-02, -4.175e-02)); + r += mul(s1_2, M4(-4.576e-02, -3.827e-02, -5.359e-02, 7.820e-02, -8.255e-02, -5.313e-02, -6.502e-02, 3.165e-03, 9.783e-03, -2.458e-02, 1.439e-01, -4.686e-02, -1.003e-01, -8.425e-03, -5.771e-03, -4.758e-02)); + r += mul(s1_3, M4(5.966e-02, 9.595e-03, -3.856e-02, 5.273e-02, -1.175e-03, 4.427e-02, 3.991e-02, 2.095e-03, -8.498e-02, -2.060e-02, -1.845e-02, -1.425e-01, -7.576e-02, -5.931e-02, 3.845e-02, 7.610e-03)); + r += mul(s1_4, M4(3.796e-02, 1.447e-01, 9.259e-02, 1.260e-01, 1.608e-03, 7.995e-03, -6.667e-02, 2.510e-02, -9.106e-02, 2.393e-02, 7.300e-03, 9.369e-03, 4.809e-02, -2.241e-01, -1.092e-01, 1.567e-01)); + r += mul(s1_5, M4(-2.641e-03, 3.406e-02, -5.671e-02, -2.547e-02, -2.399e-03, -3.979e-02, 2.325e-02, 3.546e-02, -3.434e-02, -4.097e-02, -4.166e-02, -1.135e-01, -7.384e-03, -3.778e-02, 6.189e-02, 6.051e-02)); + r += mul(s1_6, M4(3.849e-02, -1.066e-05, -9.556e-03, -6.462e-02, 1.338e-02, -2.918e-02, -4.090e-04, -9.598e-02, -1.725e-02, -3.150e-02, -3.695e-02, -5.857e-02, -1.094e-02, 4.266e-02, -2.025e-02, 6.002e-02)); + r += mul(s1_7, M4(1.280e-01, 1.042e-02, -5.609e-03, -9.296e-03, 3.400e-02, -1.899e-02, -2.874e-02, -3.249e-02, 1.947e-03, 1.613e-02, -1.296e-02, -1.637e-02, -4.200e-02, -6.840e-02, 6.963e-02, 5.189e-03)); + r += mul(s1_8, M4(4.628e-02, -2.528e-02, -4.852e-02, -7.951e-02, -3.145e-02, 3.404e-02, 3.338e-02, -2.195e-02, 7.240e-03, -4.205e-02, 8.960e-02, -6.156e-02, -5.262e-02, 1.937e-02, -4.494e-03, 7.634e-02)); + r += mul(s2_0, M4(1.292e-03, -7.605e-03, 4.105e-02, -1.246e-01, 1.068e-01, 2.252e-02, -2.295e-02, 3.658e-02, -3.432e-02, -1.054e-01, -6.732e-02, 3.738e-02, -2.803e-02, 1.604e-02, -3.872e-02, -7.219e-02)); + r += mul(s2_1, M4(4.383e-02, 2.352e-02, 6.190e-03, 1.750e-02, 1.012e-03, -3.472e-03, 1.045e-01, 7.403e-02, -4.373e-02, -1.335e-01, -8.607e-02, 2.795e-03, 6.669e-02, -7.791e-02, -3.136e-02, 1.017e-01)); + r += mul(s2_2, M4(-7.371e-02, -8.063e-03, 1.434e-02, -7.305e-02, -6.319e-03, 2.461e-03, 1.882e-04, 6.418e-02, -2.161e-02, -1.958e-02, 6.567e-02, 5.888e-02, 2.914e-02, 2.875e-02, 9.276e-03, -3.553e-02)); + r += mul(s2_3, M4(-5.579e-02, -7.940e-02, -3.232e-04, -8.424e-02, -3.059e-02, -1.152e-01, 1.849e-03, 7.836e-02, -1.220e-02, -2.966e-02, 8.221e-03, 2.005e-02, -3.060e-04, -2.329e-02, -1.330e-02, 1.660e-02)); + r += mul(s2_4, M4(-2.695e-01, 3.710e-02, 8.364e-02, 5.437e-02, -4.420e-02, 2.428e-02, -1.992e-01, 1.470e-02, -1.727e-01, -2.678e-01, 2.076e-02, 1.628e-01, 9.073e-02, -3.265e-02, -1.376e-01, 1.633e-01)); + r += mul(s2_5, M4(-2.046e-01, -1.528e-01, -1.308e-01, -2.173e-01, -1.029e-02, -3.100e-03, 2.210e-02, 8.151e-02, 1.365e-02, -8.022e-02, 2.672e-03, 1.166e-02, 2.332e-03, -4.854e-02, -7.820e-03, 1.159e-01)); + r += mul(s2_6, M4(-5.626e-02, -3.503e-02, -1.289e-03, -8.236e-02, -3.173e-02, -2.268e-02, 1.947e-02, -2.506e-02, 1.289e-01, 1.053e-02, -3.061e-02, 2.538e-02, -9.946e-02, -6.173e-02, 2.473e-02, -2.692e-02)); + r += mul(s2_7, M4(-2.065e-01, -5.762e-03, 5.203e-02, -2.143e-02, -7.554e-03, -4.648e-02, 1.165e-01, 2.026e-01, -8.369e-02, -1.324e-01, 5.834e-02, -5.356e-02, -6.907e-02, -7.742e-02, 2.550e-02, 6.365e-03)); + r += mul(s2_8, M4(-2.044e-01, -5.655e-02, 7.710e-02, -1.028e-01, -3.904e-02, -3.208e-03, -5.546e-02, 4.769e-02, -1.686e-02, -2.435e-02, 2.537e-03, 5.641e-02, -2.325e-02, -3.456e-02, 6.530e-02, 9.904e-02)); + r += mul(s3_0, M4(1.496e-02, -2.228e-02, 1.076e-02, -3.184e-02, -2.095e-02, 2.914e-02, 1.139e-03, -4.919e-02, -6.869e-02, -5.692e-02, -4.088e-02, 2.431e-02, -8.697e-02, -4.383e-02, -6.886e-02, -1.106e-01)); + r += mul(s3_1, M4(1.025e-01, 4.740e-03, 2.346e-02, -1.739e-02, 1.687e-02, 4.287e-02, -2.448e-02, -2.855e-02, -1.337e-02, -3.874e-02, -1.126e-02, 2.951e-03, 1.042e-01, -5.224e-02, -5.520e-02, -6.284e-02)); + r += mul(s3_2, M4(2.283e-02, 2.206e-02, 3.470e-02, -8.382e-02, 1.281e-02, -2.636e-02, -2.876e-02, 2.666e-02, 6.015e-02, -2.311e-03, -3.086e-02, 4.340e-02, 6.960e-02, -3.253e-03, 1.285e-01, -6.811e-02)); + r += mul(s3_3, M4(4.885e-02, -3.848e-02, -3.027e-02, -8.035e-02, 1.811e-02, -2.526e-02, 3.228e-02, 9.239e-02, 2.841e-02, 5.519e-02, 6.826e-02, -3.739e-02, -1.170e-02, -2.528e-02, 5.262e-02, 1.422e-01)); + r += mul(s3_4, M4(-7.634e-02, -2.835e-02, 1.058e-01, 9.126e-03, 7.710e-02, 1.233e-01, 2.328e-01, 1.879e-01, 1.550e-01, -6.004e-03, -1.373e-01, 4.386e-02, 1.198e-01, -1.807e-02, 1.245e-03, -8.021e-02)); + r += mul(s3_5, M4(5.724e-02, -1.178e-01, 1.767e-01, -7.646e-02, -2.158e-02, -1.647e-02, -8.337e-02, -7.362e-02, 2.942e-03, 6.778e-02, 4.844e-02, 3.504e-02, -5.358e-03, 2.728e-02, -6.942e-02, 7.962e-03)); + r += mul(s3_6, M4(4.452e-02, -1.646e-02, -1.147e-02, -5.155e-02, 7.076e-02, -1.398e-02, 9.774e-02, 4.261e-02, 1.003e-01, -1.432e-02, 3.115e-02, 4.306e-02, -1.018e-01, -1.393e-01, 7.043e-02, 1.725e-02)); + r += mul(s3_7, M4(2.213e-02, -7.985e-02, 1.339e-01, -7.921e-02, 1.285e-01, -1.511e-01, 1.649e-01, 4.592e-02, 3.238e-02, -1.482e-01, -1.781e-03, -8.541e-02, -3.168e-02, -3.916e-02, 4.108e-02, 1.662e-01)); + r += mul(s3_8, M4(-2.440e-02, -6.708e-02, 7.709e-02, -4.256e-02, -8.491e-02, -6.524e-02, -1.045e-01, -5.467e-02, -5.471e-02, 2.201e-02, -7.658e-03, 8.222e-02, -5.803e-02, -4.567e-02, 1.506e-02, -3.535e-02)); + r += mul(s4_0, M4(-5.863e-03, -3.528e-02, -7.038e-03, -8.064e-02, 6.389e-02, -3.502e-02, 1.629e-02, -5.566e-02, -8.219e-02, 9.411e-02, -4.741e-02, -2.534e-01, -1.678e-02, -1.364e-02, 6.047e-02, -4.086e-02)); + r += mul(s4_1, M4(8.560e-02, 1.703e-02, -1.876e-02, 3.156e-02, 1.031e-01, -6.625e-03, 7.125e-02, 6.314e-02, -9.482e-02, -3.137e-02, -1.422e-01, -2.679e-01, 3.143e-02, -3.354e-02, 1.283e-01, -1.122e-01)); + r += mul(s4_2, M4(-6.814e-02, -4.490e-03, 1.070e-01, 2.167e-03, 1.036e-02, 2.412e-03, -2.831e-02, -1.058e-01, 4.681e-02, 2.511e-02, 2.371e-02, -2.076e-01, -1.166e-01, 3.197e-02, -6.517e-02, -9.961e-02)); + r += mul(s4_3, M4(5.385e-02, -7.896e-02, 8.853e-02, 6.126e-02, 2.545e-02, 2.880e-02, -5.458e-02, 1.890e-02, -8.357e-02, 5.410e-02, -3.906e-02, -1.762e-01, 1.609e-01, -2.666e-02, -3.527e-02, 3.515e-03)); + r += mul(s4_4, M4(1.972e-02, 6.908e-02, -9.858e-03, 1.035e-01, 2.817e-01, 2.094e-01, -3.090e-01, -1.431e-01, -1.254e-01, -1.514e-01, -1.544e-01, -7.765e-03, -7.615e-02, 2.419e-02, -5.651e-02, -2.255e-02)); + r += mul(s4_5, M4(-1.699e-01, -4.790e-02, -4.011e-02, -4.175e-02, 1.003e-01, 9.210e-02, 1.107e-01, 1.973e-02, -2.131e-02, -2.740e-02, 4.149e-02, -1.450e-01, -7.245e-02, -9.400e-02, 1.103e-01, 7.094e-02)); + r += mul(s4_6, M4(-1.019e-01, -1.939e-02, 5.795e-02, -7.520e-02, -4.166e-02, 3.584e-03, 2.277e-02, 2.896e-02, 8.013e-02, 1.190e-02, -1.715e-02, -5.244e-02, -1.147e-02, 3.578e-02, -4.712e-02, -2.901e-02)); + r += mul(s4_7, M4(1.753e-01, 6.022e-02, 9.818e-02, 1.606e-01, -2.239e-02, 9.389e-03, -2.591e-02, -3.310e-02, 1.002e-01, 2.405e-02, 3.143e-02, 1.206e-02, -3.505e-02, 2.515e-02, -1.970e-02, 4.895e-02)); + r += mul(s4_8, M4(-8.281e-02, 8.249e-02, -1.288e-02, -2.050e-02, -7.102e-02, 2.256e-02, -1.944e-03, 8.534e-03, -3.477e-02, -7.072e-04, 3.717e-02, -8.730e-02, -6.472e-02, -9.351e-03, 3.269e-02, -3.213e-02)); + r += mul(s5_0, M4(9.542e-02, -4.061e-02, -2.904e-02, -1.822e-01, -5.632e-02, -2.788e-02, -8.150e-03, -1.046e-01, 7.828e-03, -2.316e-02, 1.447e-03, -9.084e-02, 2.058e-02, -7.100e-03, 4.199e-02, -5.257e-02)); + r += mul(s5_1, M4(1.531e-01, -1.350e-01, -3.146e-02, 4.359e-02, -1.677e-02, -2.604e-02, 1.119e-01, 3.979e-02, -5.084e-02, 1.952e-02, 2.422e-02, -9.534e-02, -5.122e-02, 1.170e-02, -2.168e-01, 5.671e-02)); + r += mul(s5_2, M4(8.436e-02, -7.757e-03, 7.705e-03, -1.189e-01, 8.195e-03, -4.497e-02, -2.285e-02, -6.500e-02, 5.457e-02, -1.213e-02, -5.160e-02, -3.054e-02, -1.466e-01, -1.326e-02, 1.110e-01, 5.654e-02)); + r += mul(s5_3, M4(-2.890e-02, -6.597e-02, 1.778e-02, -1.974e-01, 7.849e-02, -2.527e-02, -3.367e-02, 4.053e-02, 4.037e-02, -5.426e-02, -2.900e-04, 1.747e-03, 2.388e-01, 1.038e-01, 1.033e-02, 4.588e-02)); + r += mul(s5_4, M4(-4.453e-03, -8.251e-02, -3.662e-01, -5.380e-02, 5.726e-02, 1.958e-01, 2.646e-02, -1.724e-01, -7.544e-02, -4.307e-02, -2.181e-02, 6.844e-03, 1.017e-01, 9.632e-02, -4.427e-02, -7.737e-02)); + r += mul(s5_5, M4(1.049e-01, 6.475e-03, -9.022e-03, 4.203e-02, 3.576e-02, 2.242e-02, 1.977e-01, 9.945e-02, 1.133e-02, -8.528e-02, 9.182e-02, 8.884e-02, 3.620e-03, -4.205e-02, 4.046e-02, 4.582e-02)); + r += mul(s5_6, M4(-7.955e-02, 7.959e-03, -3.231e-02, -1.656e-01, -9.445e-02, 1.195e-02, 7.625e-03, 1.623e-02, 2.095e-01, -1.135e-02, -2.451e-02, 5.500e-02, 2.445e-01, 4.941e-02, -3.756e-02, 7.325e-02)); + r += mul(s5_7, M4(6.233e-02, -4.545e-02, 8.869e-02, -1.112e-01, 5.572e-02, 4.290e-02, -6.435e-02, -5.352e-02, 1.452e-01, -3.088e-02, 5.818e-02, 6.814e-02, -4.096e-02, 3.249e-02, 1.081e-01, 6.255e-02)); + r += mul(s5_8, M4(8.141e-02, -7.149e-02, -7.663e-05, -1.042e-01, -8.317e-02, -1.451e-04, 4.788e-02, 2.973e-02, 1.225e-02, 2.898e-02, -3.275e-03, 9.347e-02, 5.865e-03, -1.833e-02, -1.982e-02, 3.362e-02)); + r += mul(s6_0, M4(-9.579e-03, -2.138e-02, -1.251e-02, 4.840e-02, 3.551e-02, -4.484e-02, 2.255e-02, 2.169e-01, 3.611e-02, 1.155e-01, 4.562e-02, -5.924e-02, 4.021e-02, -3.011e-02, 3.772e-02, -4.811e-02)); + r += mul(s6_1, M4(6.861e-02, -4.056e-02, -2.885e-02, -2.634e-02, 1.707e-01, -1.619e-02, -5.798e-02, 3.128e-02, -1.866e-02, 2.244e-02, -9.318e-02, -9.833e-02, 1.297e-01, -7.007e-02, -9.872e-02, -1.108e-01)); + r += mul(s6_2, M4(-2.595e-02, -4.442e-02, 2.363e-03, 3.570e-02, 3.570e-02, -7.211e-03, -3.487e-02, 9.863e-02, 9.703e-02, -1.322e-02, 9.269e-03, -3.481e-02, 3.874e-02, 1.048e-01, 1.030e-01, 5.039e-02)); + r += mul(s6_3, M4(4.133e-02, 2.960e-02, 1.587e-03, 9.920e-02, -9.105e-02, -5.457e-02, 1.076e-01, 4.433e-03, -8.342e-02, 3.623e-02, 2.680e-02, 7.488e-03, -9.311e-02, -9.511e-02, 1.247e-01, 7.153e-02)); + r += mul(s6_4, M4(1.213e-01, 3.029e-02, 1.789e-02, -2.763e-01, 1.399e-01, -2.771e-01, -4.651e-02, 6.321e-02, -1.600e-01, -3.096e-02, 3.674e-03, -1.188e-01, -9.643e-02, -3.469e-01, 9.532e-02, -9.500e-02)); + r += mul(s6_5, M4(-8.947e-02, 2.622e-02, 5.543e-02, 5.093e-02, 1.466e-01, -5.734e-02, -3.783e-03, 6.553e-02, 5.229e-02, 7.388e-03, -4.044e-02, -6.720e-02, -9.627e-02, -3.651e-02, -2.029e-02, -6.617e-02)); + r += mul(s6_6, M4(-9.539e-02, -1.852e-02, 8.695e-02, 1.081e-01, -5.356e-02, -9.769e-02, 1.502e-01, 8.052e-02, -2.488e-02, -2.784e-02, -7.563e-02, -1.241e-01, -2.712e-02, 2.305e-03, -2.850e-02, -5.494e-02)); + r += mul(s6_7, M4(-1.394e-01, -2.116e-02, -2.509e-02, -8.494e-03, -1.988e-01, -2.985e-02, 1.067e-01, 1.072e-01, -9.671e-02, -3.063e-02, -3.109e-02, -9.306e-02, 1.372e-01, 3.550e-02, -2.605e-02, -1.606e-02)); + r += mul(s6_8, M4(-8.505e-02, 2.873e-02, -4.789e-02, 1.880e-01, 8.025e-02, -5.238e-02, -9.657e-02, -9.533e-02, 3.661e-02, -4.519e-02, -6.684e-02, -6.811e-02, -5.086e-02, -2.249e-04, 1.957e-02, 8.516e-02)); + r += mul(s7_0, M4(1.007e-01, -2.372e-02, -5.813e-03, 1.802e-01, -6.819e-02, -5.721e-03, -2.483e-02, 4.769e-02, -1.184e-01, 1.802e-01, 6.399e-02, 1.555e-01, 2.522e-02, 7.729e-02, 6.577e-02, -1.325e-01)); + r += mul(s7_1, M4(-1.067e-01, -5.018e-02, -3.361e-02, 6.501e-03, -1.769e-01, -1.063e-02, -5.944e-02, 2.517e-02, -1.636e-02, 9.147e-02, 1.468e-01, -1.176e-02, 9.015e-02, 8.733e-02, -9.278e-03, -8.138e-02)); + r += mul(s7_2, M4(-5.646e-03, 6.273e-03, 5.086e-02, 1.846e-01, -7.993e-02, 4.087e-03, -2.429e-02, -5.967e-02, 3.460e-02, -1.314e-02, -7.778e-02, 1.111e-01, 1.842e-02, 1.330e-02, 1.344e-01, -1.669e-02)); + r += mul(s7_3, M4(6.190e-02, -7.613e-02, 4.570e-02, 3.076e-01, -4.863e-02, -7.173e-02, -5.912e-02, -3.602e-03, -7.035e-02, 1.620e-01, 8.289e-02, 7.636e-02, 8.863e-02, -5.070e-02, -5.642e-02, 3.230e-02)); + r += mul(s7_4, M4(-2.413e-02, 3.622e-02, -1.440e-01, -3.482e-01, -6.614e-02, -6.762e-02, 8.552e-02, 5.454e-02, -6.978e-02, 3.645e-01, -3.436e-03, -4.343e-02, 1.408e-01, -1.524e-01, 1.545e-01, 3.227e-02)); + r += mul(s7_5, M4(-3.345e-02, -1.264e-01, 2.253e-02, 2.380e-01, -7.325e-03, 6.590e-03, -9.107e-02, -5.741e-02, -2.025e-01, 1.058e-01, -1.391e-01, -1.825e-02, -1.094e-02, 4.747e-03, -3.962e-02, -4.997e-02)); + r += mul(s7_6, M4(7.408e-02, 2.698e-02, 4.046e-03, 2.575e-01, -6.166e-02, -3.985e-02, 1.817e-03, -7.654e-03, -7.017e-03, 5.605e-03, -1.276e-01, -8.364e-03, 5.742e-02, 2.732e-02, -6.909e-02, -3.055e-02)); + r += mul(s7_7, M4(-2.354e-02, -2.041e-02, 8.600e-02, 2.454e-02, -2.166e-02, -3.224e-02, 8.548e-02, 2.795e-02, -1.052e-01, -5.736e-02, -5.278e-02, -4.459e-02, 2.451e-01, 6.210e-03, -4.089e-02, -6.621e-02)); + r += mul(s7_8, M4(-1.025e-01, -7.455e-03, 4.737e-02, 2.978e-01, 4.053e-03, -4.398e-02, -2.958e-02, -5.774e-02, -1.732e-01, 7.104e-02, -5.482e-02, 5.566e-03, -5.713e-02, 1.674e-02, 1.219e-02, 4.699e-02)); + r += V4(-1.027e-02, 3.734e-03, -3.699e-03, -3.228e-03); + return r; +} + +V4 f3(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(1.167e-02, -6.177e-02, 2.921e-02, -1.596e-01, 8.422e-02, 8.787e-04, 4.332e-02, -5.135e-02, -4.080e-02, -6.429e-03, -6.095e-02, -6.061e-02, -4.810e-02, 1.095e-02, 4.549e-02, 1.362e-02)); + r += mul(s0_1, M4(-1.199e-02, 1.175e-01, -5.049e-02, -2.183e-01, -2.373e-01, -1.157e-02, -2.956e-01, 1.045e-03, 1.205e-01, 4.900e-03, 8.430e-02, -1.391e-01, -1.061e-01, 5.416e-02, 1.508e-01, 9.890e-02)); + r += mul(s0_2, M4(-4.923e-02, 1.051e-01, 5.703e-02, -9.213e-02, 9.652e-02, -2.554e-01, 2.086e-01, -2.495e-01, -5.233e-02, -7.044e-02, -1.819e-02, -3.957e-02, 3.699e-02, 1.103e-02, 1.985e-03, 7.984e-02)); + r += mul(s0_3, M4(-1.503e-01, 9.970e-02, -2.322e-01, 1.074e-01, -1.112e-01, 4.230e-02, -1.247e-02, -7.363e-02, 3.949e-02, -3.524e-02, -9.946e-02, -3.385e-03, -6.269e-02, -9.424e-03, 1.054e-01, -1.609e-02)); + r += mul(s0_4, M4(-3.221e-02, 1.505e-01, -2.525e-02, 4.613e-02, -9.402e-02, -2.385e-02, 1.357e-01, -1.818e-01, -2.465e-01, 5.490e-02, -1.201e-01, -8.243e-02, -5.049e-02, 1.286e-01, 8.802e-02, -2.022e-01)); + r += mul(s0_5, M4(-7.998e-03, 1.040e-01, -2.233e-02, -3.037e-02, -2.865e-01, -2.228e-01, -1.800e-01, -5.392e-01, -2.904e-02, 6.367e-02, 1.076e-01, -5.523e-02, -4.917e-02, -2.926e-02, -2.309e-03, 5.027e-02)); + r += mul(s0_6, M4(9.511e-03, -3.289e-02, -3.204e-02, -1.909e-02, -9.725e-02, -1.774e-02, 3.847e-02, -1.456e-01, 9.323e-02, -1.696e-02, 5.904e-03, -6.039e-02, 1.211e-01, 3.649e-02, -8.103e-05, 2.501e-02)); + r += mul(s0_7, M4(3.629e-02, 4.800e-02, -4.105e-02, -1.008e-01, -1.499e-01, 5.788e-03, 4.249e-02, -8.500e-02, -6.269e-03, -5.566e-02, 6.120e-02, 4.844e-03, -1.538e-01, -3.678e-02, -2.316e-02, 1.633e-03)); + r += mul(s0_8, M4(2.647e-02, 3.629e-03, 1.782e-02, 7.636e-03, 3.270e-02, 1.552e-01, -2.059e-02, 3.761e-02, -1.712e-01, -1.871e-02, -1.158e-01, 1.193e-01, -1.106e-01, -2.810e-02, -5.419e-02, -4.526e-02)); + r += mul(s1_0, M4(-9.439e-02, -4.112e-02, -4.822e-02, -6.153e-02, -3.297e-02, 1.769e-02, 2.944e-02, -1.538e-02, -2.350e-02, -2.133e-02, -6.982e-02, -1.509e-02, 8.406e-02, 1.363e-02, 2.682e-02, 7.146e-02)); + r += mul(s1_1, M4(1.214e-02, 1.628e-02, 7.939e-03, 1.440e-01, -4.604e-02, -3.504e-02, -1.081e-03, -1.222e-02, -1.043e-01, 8.807e-03, -6.214e-02, -7.001e-02, -5.142e-02, -3.879e-02, 2.149e-02, -3.831e-02)); + r += mul(s1_2, M4(-3.897e-02, -8.496e-04, 1.726e-02, 6.070e-02, 2.546e-02, -1.543e-02, 1.621e-02, -6.286e-02, -7.894e-04, 8.739e-02, 2.938e-02, 8.286e-03, 9.474e-02, -3.996e-02, -2.151e-02, 8.518e-02)); + r += mul(s1_3, M4(-5.590e-02, -4.005e-02, -2.155e-02, 2.283e-02, 1.415e-02, -4.826e-02, 7.409e-02, -9.884e-03, -2.964e-02, 1.376e-02, 8.224e-03, 2.386e-02, -6.692e-02, -5.007e-02, 1.784e-02, -3.207e-02)); + r += mul(s1_4, M4(-2.278e-02, -6.852e-02, 1.079e-02, -1.495e-01, -1.100e-01, 4.839e-02, -1.024e-01, -7.718e-02, -2.104e-01, 2.885e-02, -8.595e-02, 5.267e-02, -9.748e-03, -1.048e-01, 1.062e-01, -1.449e-01)); + r += mul(s1_5, M4(-9.920e-02, 7.857e-03, -8.209e-02, 1.180e-02, 5.777e-02, -2.598e-02, -1.377e-02, 2.015e-02, 1.165e-01, 1.282e-02, 3.508e-02, -5.131e-02, 2.825e-02, 1.456e-02, 2.656e-02, 1.442e-02)); + r += mul(s1_6, M4(-4.397e-03, -2.337e-02, -4.174e-02, 1.481e-02, -1.727e-02, -3.315e-02, 1.128e-02, 1.027e-02, 7.468e-02, 1.628e-02, 2.491e-02, -5.500e-02, 5.107e-02, 3.508e-02, -3.237e-03, 9.850e-03)); + r += mul(s1_7, M4(6.569e-02, 5.595e-02, -1.277e-02, 9.735e-02, 1.102e-02, 4.480e-02, 7.978e-03, -4.399e-03, 4.086e-02, 4.144e-03, 1.167e-02, -1.048e-01, -9.323e-02, -6.502e-03, 3.126e-02, -5.535e-02)); + r += mul(s1_8, M4(3.960e-02, 2.156e-02, 1.231e-02, 1.308e-02, 1.848e-02, -2.566e-02, 4.084e-02, 9.212e-04, -8.791e-02, -1.301e-02, -6.939e-02, 8.119e-02, -6.844e-02, 1.982e-02, -3.903e-02, -3.668e-02)); + r += mul(s2_0, M4(2.252e-02, -2.096e-02, 2.735e-02, 1.510e-02, -1.478e-02, 1.116e-02, 1.077e-02, -4.348e-02, -1.584e-03, -3.120e-02, 7.883e-03, -1.087e-02, -3.217e-02, -2.267e-02, -8.129e-02, 2.307e-03)); + r += mul(s2_1, M4(8.523e-02, 1.456e-03, -3.770e-02, -1.888e-02, 1.382e-02, 5.320e-02, 4.826e-02, 3.317e-02, -7.548e-02, 4.860e-02, 1.353e-02, 1.160e-01, 8.436e-03, -1.882e-02, 1.261e-02, -7.137e-02)); + r += mul(s2_2, M4(-6.370e-02, 5.359e-03, -4.268e-02, -3.003e-02, 2.313e-02, 1.621e-02, 3.060e-03, -1.317e-02, 3.247e-03, 7.697e-02, -1.396e-02, -8.399e-04, -4.960e-04, 3.719e-02, -3.845e-02, 2.111e-02)); + r += mul(s2_3, M4(2.892e-03, -2.543e-02, 1.176e-02, 9.304e-03, 1.059e-01, -2.285e-02, 2.986e-02, 5.772e-02, -1.142e-01, -4.586e-02, -1.881e-01, 4.963e-03, -3.414e-03, -2.125e-02, -1.125e-01, -5.594e-02)); + r += mul(s2_4, M4(-5.479e-02, -5.892e-02, -3.187e-01, -1.107e-01, 1.198e-02, 4.036e-02, -6.781e-02, 3.168e-02, -1.152e-01, -5.754e-02, 2.135e-01, -2.608e-01, -8.551e-02, 9.319e-02, -1.178e-01, -8.393e-02)); + r += mul(s2_5, M4(3.025e-02, -1.882e-01, -7.997e-03, 1.191e-01, -5.916e-02, -5.380e-02, 4.412e-02, -8.905e-03, -1.309e-02, 1.924e-02, 9.663e-03, -8.942e-03, 3.374e-02, 7.815e-02, 3.357e-02, -5.947e-03)); + r += mul(s2_6, M4(-7.223e-03, 3.911e-02, -1.094e-02, 1.982e-03, 2.219e-02, -3.432e-02, -8.690e-02, 4.018e-02, -6.419e-02, 1.056e-02, -1.133e-01, 9.543e-02, -7.015e-02, 6.164e-02, -1.136e-01, 5.972e-03)); + r += mul(s2_7, M4(-1.036e-01, -5.610e-02, -4.592e-02, -3.629e-02, -1.625e-01, -2.212e-01, -1.272e-01, -5.642e-02, -4.976e-02, 3.654e-02, -3.748e-02, 9.545e-02, 1.100e-02, -4.112e-02, -6.416e-02, -4.099e-02)); + r += mul(s2_8, M4(1.330e-02, 1.735e-02, 6.827e-02, 3.413e-02, -1.748e-02, -1.577e-03, 1.129e-02, -2.462e-02, -3.445e-02, 7.756e-03, 2.076e-02, -4.676e-02, -4.606e-02, -2.034e-02, 1.257e-02, -3.683e-02)); + r += mul(s3_0, M4(-5.320e-02, 2.190e-02, 3.680e-02, -3.580e-02, 2.546e-02, -2.600e-03, 3.017e-02, 6.285e-03, -7.979e-02, 6.201e-02, -6.068e-02, -4.211e-02, 1.232e-01, -2.810e-02, -9.417e-02, 1.045e-01)); + r += mul(s3_1, M4(6.909e-02, -1.825e-03, -1.253e-02, -3.946e-02, -2.231e-02, 4.658e-02, 4.727e-03, -1.104e-02, 1.596e-02, -6.214e-02, 2.228e-02, -6.638e-02, 5.695e-02, 7.845e-02, -5.545e-02, 2.237e-03)); + r += mul(s3_2, M4(4.939e-02, -9.207e-02, -3.875e-02, -7.544e-02, 1.800e-03, 1.560e-02, -4.386e-03, -7.557e-03, 1.261e-02, 1.125e-02, 1.801e-02, 1.466e-02, 9.646e-03, 3.503e-02, -3.819e-02, 4.301e-02)); + r += mul(s3_3, M4(3.208e-02, -7.788e-02, 5.246e-02, 2.746e-03, -2.968e-02, -7.753e-03, 8.223e-02, -2.185e-02, -1.468e-02, -5.539e-02, -1.753e-01, -4.015e-02, 1.448e-01, -7.826e-03, -1.139e-02, -1.166e-01)); + r += mul(s3_4, M4(-3.785e-02, 1.809e-02, -1.625e-01, -5.018e-02, -2.031e-01, 3.498e-01, 9.538e-03, 1.843e-01, 1.125e-01, -9.325e-02, 1.736e-01, -1.565e-01, -1.106e-01, 3.306e-01, 9.144e-02, -8.085e-02)); + r += mul(s3_5, M4(2.068e-01, 6.464e-03, 5.312e-03, 8.993e-02, 1.227e-02, -1.338e-01, -4.559e-02, -3.015e-02, -2.496e-02, 4.393e-03, -1.793e-02, -9.457e-02, 5.664e-02, 1.082e-01, 3.646e-02, -1.086e-02)); + r += mul(s3_6, M4(2.355e-02, 1.312e-02, -4.126e-02, 2.181e-02, 1.985e-01, -1.919e-02, -1.470e-01, 9.793e-02, -1.152e-01, -3.593e-02, -1.032e-01, 4.051e-02, 1.958e-01, 7.270e-02, -4.232e-02, -5.498e-02)); + r += mul(s3_7, M4(-1.543e-02, -5.805e-02, 6.226e-02, 3.702e-03, -2.578e-01, -2.114e-01, -1.530e-02, 5.345e-02, 4.764e-02, 4.586e-02, 8.577e-02, 1.178e-01, -9.984e-02, -4.481e-02, -5.640e-02, -9.018e-02)); + r += mul(s3_8, M4(-1.854e-02, 8.643e-04, 1.124e-02, 2.094e-02, -1.009e-01, 3.480e-02, -1.669e-02, 3.460e-02, 3.137e-02, 8.575e-03, 4.781e-02, -2.018e-02, -1.207e-01, 1.016e-02, -4.369e-02, -1.682e-02)); + r += mul(s4_0, M4(-1.140e-02, 2.420e-02, 6.241e-03, 5.785e-03, 4.436e-02, -4.286e-02, -5.416e-02, 1.132e-02, 2.869e-02, 1.495e-02, -8.035e-02, 7.211e-02, -3.877e-02, -7.195e-02, 7.446e-02, -8.160e-04)); + r += mul(s4_1, M4(1.645e-03, 9.030e-02, -3.709e-02, 1.805e-02, -1.960e-02, -4.919e-02, 4.553e-02, -6.286e-03, 1.827e-02, -5.295e-02, 1.301e-02, 5.579e-02, 3.799e-02, -1.237e-03, 9.361e-02, 2.773e-02)); + r += mul(s4_2, M4(4.443e-02, -3.289e-02, -1.185e-02, -3.490e-04, 1.836e-02, -1.090e-01, 8.454e-04, 1.068e-02, 2.049e-02, 8.117e-03, 1.842e-02, 6.967e-02, 2.379e-02, 1.528e-02, 4.916e-03, 4.540e-02)); + r += mul(s4_3, M4(4.370e-02, -2.791e-02, 1.829e-01, -2.775e-02, -8.279e-02, 3.741e-02, -9.919e-03, 1.260e-01, -2.457e-02, -1.378e-02, -6.458e-02, 1.096e-01, 2.652e-02, 2.717e-02, 1.420e-01, 1.045e-01)); + r += mul(s4_4, M4(-8.799e-02, 1.364e-01, -1.368e-01, 4.078e-02, 1.992e-01, 4.889e-03, 8.435e-02, 4.096e-01, -3.620e-02, -1.450e-02, 3.992e-02, 2.025e-02, -9.919e-02, -2.361e-02, -1.246e-01, 1.875e-02)); + r += mul(s4_5, M4(2.370e-02, -1.002e-01, 7.320e-04, 8.148e-02, 1.327e-01, 2.469e-02, -5.037e-02, -1.869e-01, -2.726e-03, -9.535e-03, 2.615e-02, 1.987e-04, -4.594e-03, -1.220e-02, -4.273e-04, 1.355e-01)); + r += mul(s4_6, M4(1.071e-01, 2.113e-02, -4.413e-03, -4.318e-02, -4.169e-02, -1.027e-02, 2.563e-02, -1.989e-02, -2.810e-02, 2.508e-02, 1.188e-02, 3.574e-02, 7.083e-03, 4.946e-02, -4.187e-02, -9.132e-03)); + r += mul(s4_7, M4(4.131e-02, -9.007e-02, 2.709e-02, -1.204e-01, 2.620e-02, 1.383e-02, 1.197e-01, 6.891e-02, -6.550e-02, -5.608e-02, -5.058e-02, 6.390e-02, 1.111e-02, 4.349e-02, -9.714e-03, -8.326e-02)); + r += mul(s4_8, M4(-1.916e-02, -2.350e-02, -1.555e-02, -6.213e-02, 5.593e-02, 4.247e-03, -4.789e-02, 5.948e-02, -4.069e-02, 1.600e-02, 4.016e-02, 6.093e-02, -3.119e-02, 3.793e-03, 5.541e-03, -3.793e-02)); + r += mul(s5_0, M4(7.864e-02, -1.339e-02, -4.832e-02, -1.218e-01, -2.013e-02, -6.006e-02, -5.262e-02, 2.831e-02, 3.518e-02, 3.341e-02, -1.228e-02, -1.277e-02, 1.757e-04, 2.715e-03, 3.603e-02, 3.215e-02)); + r += mul(s5_1, M4(1.407e-01, 7.350e-02, 4.234e-02, -9.416e-02, 7.673e-02, -1.417e-01, 1.398e-02, -1.021e-01, 3.521e-02, 1.478e-03, -4.151e-02, -8.832e-04, 8.912e-02, -8.051e-02, 4.631e-02, 2.308e-03)); + r += mul(s5_2, M4(1.387e-03, 2.925e-02, -2.291e-02, 2.741e-02, -2.734e-02, 6.738e-02, 4.130e-05, -2.597e-02, 2.685e-02, 1.294e-02, 1.009e-02, -1.427e-02, -3.893e-02, 6.289e-02, 3.797e-02, 9.311e-03)); + r += mul(s5_3, M4(-1.679e-02, -1.508e-01, -1.222e-01, -5.291e-02, 1.247e-02, 1.753e-02, 1.583e-01, -1.962e-02, 9.588e-02, 2.281e-02, -2.183e-03, -2.845e-02, -1.690e-01, 1.808e-02, 1.314e-02, 1.856e-01)); + r += mul(s5_4, M4(2.043e-01, -5.004e-01, -1.569e-01, -2.278e-01, 6.594e-02, 2.738e-01, -2.904e-01, 1.078e-01, -3.630e-02, 1.078e-02, -8.383e-02, -1.540e-01, -2.902e-01, 1.926e-01, -3.632e-02, 1.952e-02)); + r += mul(s5_5, M4(-8.471e-03, -5.701e-02, 3.210e-02, -9.791e-02, -1.505e-01, 2.561e-02, 2.135e-02, -6.411e-02, -5.528e-02, 2.373e-02, 1.523e-02, -6.321e-02, -6.808e-02, 8.429e-02, -5.276e-02, -8.066e-03)); + r += mul(s5_6, M4(-5.639e-02, 4.162e-04, -1.973e-02, 3.684e-03, 5.583e-02, -6.831e-03, -5.978e-03, -4.626e-02, 2.059e-02, -4.358e-02, 1.707e-02, 2.277e-02, 8.244e-02, 5.466e-02, 4.525e-02, 3.121e-02)); + r += mul(s5_7, M4(9.632e-02, 5.535e-02, 5.899e-02, 1.290e-01, -3.629e-03, -8.752e-02, -3.750e-02, 5.661e-02, 2.227e-02, -8.346e-02, -2.730e-02, 3.271e-03, -9.233e-02, 6.866e-02, 6.858e-03, 5.474e-02)); + r += mul(s5_8, M4(4.825e-02, -4.488e-02, -3.505e-04, 6.830e-02, 9.736e-02, -3.523e-02, 8.631e-02, 2.603e-02, -5.879e-02, -3.617e-03, 1.704e-02, -3.680e-02, -6.214e-02, -1.883e-02, -4.150e-02, -5.404e-02)); + r += mul(s6_0, M4(-3.835e-02, -1.861e-02, 4.914e-03, -3.501e-03, -1.264e-02, -1.105e-02, 9.188e-02, -2.862e-02, -7.635e-02, -5.039e-02, 6.528e-03, 1.326e-02, 1.238e-01, -3.823e-02, 1.175e-01, -8.928e-03)); + r += mul(s6_1, M4(-1.286e-03, 2.701e-02, 3.120e-03, -8.478e-02, 4.093e-02, 1.146e-01, -5.110e-02, 2.109e-01, 1.133e-01, 4.819e-02, 1.865e-02, -3.246e-02, 1.944e-02, -9.811e-02, -2.425e-02, -1.544e-02)); + r += mul(s6_2, M4(-2.894e-02, -3.921e-02, -1.110e-02, -3.812e-02, 1.139e-01, -1.187e-01, 1.240e-02, -1.277e-01, 2.531e-02, -1.509e-03, 1.453e-02, 1.674e-03, 1.359e-03, -2.390e-02, 1.247e-02, -1.884e-01)); + r += mul(s6_3, M4(-7.157e-02, 2.103e-02, 2.297e-02, -8.590e-02, 1.141e-01, -9.066e-02, -7.427e-02, 1.697e-01, -6.793e-03, -1.810e-02, 1.913e-01, -2.418e-02, 1.057e-01, -9.030e-03, -7.905e-02, -1.755e-01)); + r += mul(s6_4, M4(-1.410e-01, 1.156e-02, -1.829e-01, 7.699e-02, 2.267e-01, -3.173e-01, 1.605e-01, -1.500e-01, -8.938e-02, -2.148e-01, -1.502e-02, 1.283e-01, -1.651e-01, -2.558e-01, 1.715e-01, -6.584e-02)); + r += mul(s6_5, M4(5.515e-02, -4.482e-02, 2.362e-02, 6.511e-02, 7.282e-02, 5.922e-02, 3.418e-02, 1.781e-02, -4.039e-02, -1.749e-02, 2.931e-03, 3.596e-02, 3.957e-02, 4.877e-03, 3.109e-02, 1.089e-01)); + r += mul(s6_6, M4(-1.752e-02, -8.149e-03, 1.448e-02, -4.546e-02, -2.351e-02, -3.851e-02, 7.208e-02, -1.704e-02, 8.197e-02, 7.848e-04, 6.083e-02, 4.167e-02, 7.052e-03, 4.192e-02, 1.003e-01, 2.385e-02)); + r += mul(s6_7, M4(-1.248e-01, -8.858e-02, -3.475e-02, 5.719e-02, 4.832e-02, -1.755e-01, -1.149e-01, -1.976e-01, -6.725e-02, -5.124e-02, 8.730e-04, 4.918e-03, -9.000e-02, 8.387e-02, -7.966e-03, 5.869e-02)); + r += mul(s6_8, M4(-3.407e-02, -4.766e-02, 2.795e-02, 5.029e-02, 1.758e-02, -9.677e-03, 2.503e-02, 4.713e-03, 4.451e-02, 1.719e-02, 3.436e-02, -2.860e-03, 5.170e-02, -6.352e-02, 4.891e-02, -5.977e-03)); + r += mul(s7_0, M4(-4.166e-03, -1.710e-02, 2.343e-02, 2.181e-02, -2.621e-03, -5.788e-02, 6.793e-02, 1.316e-02, -1.646e-01, 5.274e-02, 1.871e-01, 1.384e-01, 1.043e-01, -6.170e-02, 8.821e-02, 6.585e-02)); + r += mul(s7_1, M4(-4.526e-02, -1.652e-03, -2.061e-02, 1.634e-02, -8.333e-02, 6.583e-02, -3.144e-02, 6.665e-02, -4.615e-03, 1.102e-01, -2.718e-02, 1.222e-01, -5.337e-03, 4.908e-02, 3.141e-02, 3.663e-02)); + r += mul(s7_2, M4(-1.944e-03, -3.047e-02, -2.642e-02, -1.176e-02, 1.964e-02, -1.322e-03, -1.799e-02, 6.898e-03, 8.192e-02, -3.458e-02, -5.437e-02, -1.717e-02, 2.824e-02, 9.535e-03, -2.832e-02, -6.371e-02)); + r += mul(s7_3, M4(-5.550e-02, -4.231e-02, -3.512e-02, -9.145e-02, 1.784e-02, 1.736e-02, 1.449e-03, -8.046e-03, 5.450e-03, 6.594e-02, 2.530e-01, -1.471e-02, -6.283e-02, 7.689e-02, 4.334e-02, -6.218e-02)); + r += mul(s7_4, M4(-5.743e-02, -2.237e-01, -1.098e-01, -7.820e-02, 4.270e-02, -1.128e-01, -4.468e-02, 7.768e-02, -1.054e-01, -1.931e-01, 5.287e-03, -5.812e-02, 8.197e-02, -8.961e-02, 2.512e-01, -3.005e-02)); + r += mul(s7_5, M4(4.308e-02, -9.069e-03, 5.157e-02, 1.160e-02, 5.872e-02, -9.286e-02, 1.838e-02, 2.887e-02, -9.272e-02, -1.431e-01, -5.731e-02, 2.200e-02, -1.166e-02, 6.180e-02, -1.418e-02, 6.206e-02)); + r += mul(s7_6, M4(-4.014e-02, -3.412e-02, 6.475e-02, -9.437e-02, 4.607e-02, -2.936e-02, -2.778e-03, 3.266e-03, -1.539e-01, 9.698e-03, 4.587e-02, 4.971e-02, 3.766e-02, 2.926e-02, 5.401e-02, -1.517e-02)); + r += mul(s7_7, M4(-2.628e-02, 7.130e-02, 6.909e-02, 1.381e-01, -6.860e-02, -9.530e-02, -9.711e-02, -7.830e-02, -3.834e-02, 2.078e-02, 3.598e-02, 8.188e-02, 3.320e-02, 7.825e-02, 1.107e-01, 5.268e-02)); + r += mul(s7_8, M4(-5.938e-02, -5.766e-02, 7.675e-03, -5.305e-02, -2.769e-02, 3.557e-02, -2.854e-02, 2.338e-02, 3.690e-02, 7.973e-02, -3.343e-03, 5.789e-02, -1.221e-02, -4.225e-02, -1.986e-02, -4.257e-02)); + r += V4(-7.498e-03, -1.644e-03, -9.558e-03, 1.158e-03); + return r; +} + +void Pass15(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = Rmp8x8(tid.x) + blockStart; + uint2 size = GetInputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = (gxy + 0.5) * pt; + + V4 s0_0 = l0(-1.0, -1.0); + V4 s0_1 = l0(0.0, -1.0); + V4 s0_2 = l0(1.0, -1.0); + V4 s0_3 = l0(-1.0, 0.0); + V4 s0_4 = l0(0.0, 0.0); + V4 s0_5 = l0(1.0, 0.0); + V4 s0_6 = l0(-1.0, 1.0); + V4 s0_7 = l0(0.0, 1.0); + V4 s0_8 = l0(1.0, 1.0); + V4 s1_0 = -max(-s0_0, 0.0); + V4 s1_1 = -max(-s0_1, 0.0); + V4 s1_2 = -max(-s0_2, 0.0); + V4 s1_3 = -max(-s0_3, 0.0); + V4 s1_4 = -max(-s0_4, 0.0); + V4 s1_5 = -max(-s0_5, 0.0); + V4 s1_6 = -max(-s0_6, 0.0); + V4 s1_7 = -max(-s0_7, 0.0); + V4 s1_8 = -max(-s0_8, 0.0); + s0_0 = max(s0_0, 0.0); + s0_1 = max(s0_1, 0.0); + s0_2 = max(s0_2, 0.0); + s0_3 = max(s0_3, 0.0); + s0_4 = max(s0_4, 0.0); + s0_5 = max(s0_5, 0.0); + s0_6 = max(s0_6, 0.0); + s0_7 = max(s0_7, 0.0); + s0_8 = max(s0_8, 0.0); + + V4 s2_0 = l1(-1.0, -1.0); + V4 s2_1 = l1(0.0, -1.0); + V4 s2_2 = l1(1.0, -1.0); + V4 s2_3 = l1(-1.0, 0.0); + V4 s2_4 = l1(0.0, 0.0); + V4 s2_5 = l1(1.0, 0.0); + V4 s2_6 = l1(-1.0, 1.0); + V4 s2_7 = l1(0.0, 1.0); + V4 s2_8 = l1(1.0, 1.0); + V4 s3_0 = -max(-s2_0, 0.0); + V4 s3_1 = -max(-s2_1, 0.0); + V4 s3_2 = -max(-s2_2, 0.0); + V4 s3_3 = -max(-s2_3, 0.0); + V4 s3_4 = -max(-s2_4, 0.0); + V4 s3_5 = -max(-s2_5, 0.0); + V4 s3_6 = -max(-s2_6, 0.0); + V4 s3_7 = -max(-s2_7, 0.0); + V4 s3_8 = -max(-s2_8, 0.0); + s2_0 = max(s2_0, 0.0); + s2_1 = max(s2_1, 0.0); + s2_2 = max(s2_2, 0.0); + s2_3 = max(s2_3, 0.0); + s2_4 = max(s2_4, 0.0); + s2_5 = max(s2_5, 0.0); + s2_6 = max(s2_6, 0.0); + s2_7 = max(s2_7, 0.0); + s2_8 = max(s2_8, 0.0); + + V4 s4_0 = l2(-1.0, -1.0); + V4 s4_1 = l2(0.0, -1.0); + V4 s4_2 = l2(1.0, -1.0); + V4 s4_3 = l2(-1.0, 0.0); + V4 s4_4 = l2(0.0, 0.0); + V4 s4_5 = l2(1.0, 0.0); + V4 s4_6 = l2(-1.0, 1.0); + V4 s4_7 = l2(0.0, 1.0); + V4 s4_8 = l2(1.0, 1.0); + V4 s5_0 = -max(-s4_0, 0.0); + V4 s5_1 = -max(-s4_1, 0.0); + V4 s5_2 = -max(-s4_2, 0.0); + V4 s5_3 = -max(-s4_3, 0.0); + V4 s5_4 = -max(-s4_4, 0.0); + V4 s5_5 = -max(-s4_5, 0.0); + V4 s5_6 = -max(-s4_6, 0.0); + V4 s5_7 = -max(-s4_7, 0.0); + V4 s5_8 = -max(-s4_8, 0.0); + s4_0 = max(s4_0, 0.0); + s4_1 = max(s4_1, 0.0); + s4_2 = max(s4_2, 0.0); + s4_3 = max(s4_3, 0.0); + s4_4 = max(s4_4, 0.0); + s4_5 = max(s4_5, 0.0); + s4_6 = max(s4_6, 0.0); + s4_7 = max(s4_7, 0.0); + s4_8 = max(s4_8, 0.0); + + V4 s6_0 = l3(-1.0, -1.0); + V4 s6_1 = l3(0.0, -1.0); + V4 s6_2 = l3(1.0, -1.0); + V4 s6_3 = l3(-1.0, 0.0); + V4 s6_4 = l3(0.0, 0.0); + V4 s6_5 = l3(1.0, 0.0); + V4 s6_6 = l3(-1.0, 1.0); + V4 s6_7 = l3(0.0, 1.0); + V4 s6_8 = l3(1.0, 1.0); + V4 s7_0 = -max(-s6_0, 0.0); + V4 s7_1 = -max(-s6_1, 0.0); + V4 s7_2 = -max(-s6_2, 0.0); + V4 s7_3 = -max(-s6_3, 0.0); + V4 s7_4 = -max(-s6_4, 0.0); + V4 s7_5 = -max(-s6_5, 0.0); + V4 s7_6 = -max(-s6_6, 0.0); + V4 s7_7 = -max(-s6_7, 0.0); + V4 s7_8 = -max(-s6_8, 0.0); + s6_0 = max(s6_0, 0.0); + s6_1 = max(s6_1, 0.0); + s6_2 = max(s6_2, 0.0); + s6_3 = max(s6_3, 0.0); + s6_4 = max(s6_4, 0.0); + s6_5 = max(s6_5, 0.0); + s6_6 = max(s6_6, 0.0); + s6_7 = max(s6_7, 0.0); + s6_8 = max(s6_8, 0.0); + + t0[gxy] = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t1[gxy] = f1(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t2[gxy] = f2(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t3[gxy] = f3(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); +} + +//!PASS 16 +//!DESC conv15 +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 +//!IN t0, t1, t2, t3 +//!OUT t4, t5, t6, t7 + +#define l0(x, y) V4(O(t0, float2(x, y))) +#define l1(x, y) V4(O(t1, float2(x, y))) +#define l2(x, y) V4(O(t2, float2(x, y))) +#define l3(x, y) V4(O(t3, float2(x, y))) + +V4 f0(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-5.160e-02, -3.732e-03, -6.784e-03, -4.348e-02, 2.435e-03, -1.543e-02, -2.768e-04, 8.964e-03, -3.942e-02, -8.685e-03, 1.014e-03, -3.346e-02, -4.470e-02, 1.599e-02, 8.741e-03, -4.553e-03)); + r += mul(s0_1, M4(2.393e-02, 1.892e-03, -1.528e-02, -3.904e-02, 1.591e-02, -8.766e-02, 2.341e-02, -1.420e-02, -2.348e-02, -3.359e-03, -3.797e-02, -5.681e-02, -4.980e-02, 4.332e-02, -7.959e-02, -2.571e-02)); + r += mul(s0_2, M4(-4.175e-02, -3.435e-03, 3.606e-02, -1.366e-01, 6.186e-03, 3.417e-03, 1.596e-02, -2.151e-02, 3.124e-02, -3.555e-02, -5.958e-02, -3.985e-02, 4.484e-02, -1.423e-02, -8.866e-02, -2.162e-02)); + r += mul(s0_3, M4(-2.821e-02, 1.630e-03, 5.268e-02, -7.234e-03, -4.657e-02, -9.417e-03, -2.170e-03, 7.203e-02, 1.426e-01, -6.417e-02, -4.125e-02, 5.846e-02, 1.178e-03, -7.917e-02, -1.304e-02, -1.637e-02)); + r += mul(s0_4, M4(1.462e-02, -3.415e-02, -4.206e-02, -5.123e-02, 3.062e-02, 1.558e-01, 6.164e-03, 3.124e-03, -4.108e-02, 1.781e-01, 1.494e-02, -5.756e-03, -1.418e-01, -6.695e-04, 3.986e-02, -1.386e-01)); + r += mul(s0_5, M4(3.383e-02, 4.660e-02, -1.419e-01, 5.439e-02, -4.897e-02, 1.464e-01, 4.731e-02, 4.934e-02, 8.982e-02, -1.290e-02, 1.695e-02, 9.934e-02, 7.482e-02, -9.254e-03, -1.693e-02, 6.521e-03)); + r += mul(s0_6, M4(9.238e-02, -2.743e-02, -8.319e-03, 4.795e-03, 1.365e-02, 4.003e-02, -3.559e-02, 7.802e-03, 6.003e-02, 2.358e-02, -3.161e-02, 2.074e-02, 7.416e-03, -4.118e-02, -1.775e-02, 2.159e-02)); + r += mul(s0_7, M4(4.396e-03, 1.038e-01, 6.255e-02, -9.141e-02, 3.115e-02, 1.052e-01, -4.497e-02, -6.776e-04, -1.772e-02, 9.394e-02, 4.760e-02, -1.007e-01, 1.137e-02, -5.003e-02, -1.147e-02, -1.026e-02)); + r += mul(s0_8, M4(-1.623e-02, -1.713e-02, 9.693e-02, 7.983e-03, -5.052e-03, -4.564e-02, 4.794e-02, 1.581e-02, -5.652e-03, 5.487e-02, 3.743e-03, -4.529e-02, -9.499e-02, 6.744e-03, -2.605e-03, 8.676e-03)); + r += mul(s1_0, M4(-2.647e-03, 6.805e-02, -2.540e-02, -1.147e-02, 3.226e-02, -1.310e-02, 2.787e-03, -4.002e-02, 5.170e-02, -3.792e-03, 3.074e-02, 2.460e-02, -7.882e-03, -6.123e-03, -8.279e-03, -8.565e-03)); + r += mul(s1_1, M4(1.982e-02, 3.020e-02, 3.416e-02, 1.569e-02, 1.891e-02, -2.180e-02, 6.800e-02, 3.906e-02, -1.298e-02, 9.551e-02, -1.343e-03, -4.806e-02, 1.454e-01, 1.524e-02, -2.852e-02, 2.072e-02)); + r += mul(s1_2, M4(-7.550e-03, 3.784e-02, 8.472e-02, 2.397e-02, 5.939e-04, -2.458e-02, -3.482e-02, -7.235e-02, 6.335e-02, -1.183e-02, -2.582e-02, 1.155e-01, 2.785e-02, 4.992e-03, 7.951e-03, -1.885e-02)); + r += mul(s1_3, M4(-7.998e-02, 1.170e-01, -8.495e-02, 3.313e-02, 8.535e-03, 3.094e-02, -6.041e-02, -3.323e-02, -8.466e-02, -1.169e-01, -1.145e-01, 1.189e-01, -5.433e-02, -7.204e-02, 2.027e-02, -3.973e-03)); + r += mul(s1_4, M4(2.866e-02, -3.144e-01, 1.411e-01, -2.229e-01, -6.961e-02, 8.606e-02, -2.027e-01, 6.622e-02, -2.599e-01, 2.075e-01, -3.785e-02, -3.399e-03, -3.173e-01, 6.855e-02, -1.812e-01, -1.432e-02)); + r += mul(s1_5, M4(1.590e-02, -3.465e-02, -1.312e-01, 7.710e-02, 3.443e-02, 2.024e-01, -4.113e-02, -2.574e-02, 6.197e-02, 7.433e-03, -5.301e-02, 2.927e-01, -1.177e-02, 2.959e-02, 1.459e-01, 2.358e-01)); + r += mul(s1_6, M4(-1.945e-03, -3.489e-02, 4.217e-02, 6.407e-03, 2.843e-02, 2.252e-02, -4.049e-02, -6.170e-02, -3.052e-02, 2.717e-02, 9.793e-03, 1.795e-01, 7.723e-02, 1.182e-02, 3.257e-02, -2.977e-02)); + r += mul(s1_7, M4(6.135e-02, 1.503e-01, 6.103e-02, 1.783e-02, 6.338e-02, 1.215e-01, -1.684e-02, -1.483e-01, -3.541e-02, -8.271e-02, 1.444e-01, 1.174e-01, 1.608e-01, -5.001e-02, 8.841e-02, -3.740e-02)); + r += mul(s1_8, M4(-5.199e-03, 3.357e-03, 1.415e-02, 3.064e-02, 4.466e-02, -2.478e-02, 2.871e-02, 1.724e-02, -3.197e-02, 1.664e-01, 4.358e-02, 1.283e-01, -2.226e-02, -6.676e-02, -9.041e-02, -4.091e-02)); + r += mul(s2_0, M4(4.154e-02, 6.276e-02, 2.301e-02, -4.867e-02, 9.251e-02, 3.564e-02, 3.035e-02, 2.159e-02, 1.382e-02, -5.546e-02, 4.188e-03, 4.685e-02, 1.802e-02, 4.610e-03, 6.181e-02, -2.626e-04)); + r += mul(s2_1, M4(-1.424e-01, -1.806e-02, -2.163e-02, -8.487e-02, 3.186e-02, 8.935e-02, 8.248e-02, -1.191e-02, 2.657e-03, 8.261e-03, -4.995e-02, -1.115e-02, 1.825e-03, -2.795e-02, 4.463e-02, 7.749e-02)); + r += mul(s2_2, M4(-6.608e-02, -7.340e-03, -3.298e-03, -2.887e-02, 8.648e-03, 5.588e-03, 4.404e-03, 2.505e-04, 1.036e-02, -2.976e-02, -3.113e-02, 6.618e-03, 3.879e-02, 5.171e-02, 6.177e-02, 1.429e-01)); + r += mul(s2_3, M4(-7.782e-03, -8.404e-02, -8.264e-03, 3.970e-02, -2.498e-01, -1.223e-01, -6.400e-02, 7.646e-02, 1.400e-03, -1.271e-02, -1.757e-02, 3.824e-02, 7.211e-02, -3.480e-02, -8.232e-02, -1.930e-02)); + r += mul(s2_4, M4(1.859e-02, 4.738e-02, -2.169e-02, 2.830e-02, -1.659e-01, -9.680e-03, 2.575e-02, 5.458e-02, -4.625e-02, -3.809e-02, 4.293e-02, -3.743e-02, -6.246e-02, 1.364e-01, 3.725e-02, -3.218e-02)); + r += mul(s2_5, M4(-4.900e-03, 5.655e-02, 6.519e-02, 1.092e-01, 1.312e-02, -9.273e-02, -9.127e-02, 5.506e-02, 2.990e-02, -1.273e-03, 1.594e-04, -7.715e-03, -1.155e-01, -4.271e-03, 2.533e-03, 8.421e-02)); + r += mul(s2_6, M4(1.121e-02, 1.366e-02, -3.063e-02, 4.596e-03, -1.070e-01, -4.462e-02, -6.899e-02, 3.754e-02, -8.587e-02, -7.628e-03, 1.734e-02, 4.919e-02, -2.737e-02, 3.897e-02, 1.264e-02, -1.606e-02)); + r += mul(s2_7, M4(2.536e-02, -3.417e-03, -1.311e-02, 3.645e-03, -1.238e-01, -7.702e-03, 1.116e-01, 1.310e-01, -2.044e-02, -4.430e-02, 1.056e-01, 5.321e-02, -2.567e-02, 1.916e-02, -8.229e-03, -4.110e-04)); + r += mul(s2_8, M4(-1.896e-03, 1.095e-02, -2.075e-02, 4.741e-02, 4.284e-02, 4.529e-02, 1.737e-02, 1.677e-01, 4.837e-02, -1.854e-02, -7.629e-02, -7.305e-02, 4.157e-02, -2.880e-02, -3.751e-02, 6.790e-02)); + r += mul(s3_0, M4(-2.048e-02, -5.507e-02, 3.214e-02, 2.952e-03, -5.350e-02, -2.185e-02, 5.288e-03, 1.490e-02, 1.499e-01, -5.311e-02, 1.924e-02, 1.557e-03, 1.908e-02, -1.304e-02, -1.599e-02, 1.458e-03)); + r += mul(s3_1, M4(1.545e-01, 1.503e-01, 1.255e-01, -2.177e-01, -4.032e-02, -3.143e-02, -3.432e-03, -1.945e-02, 2.517e-02, 4.947e-02, 3.295e-02, 6.607e-02, 1.789e-02, -1.440e-02, 5.069e-02, 3.252e-02)); + r += mul(s3_2, M4(-3.715e-02, 6.841e-02, -7.904e-02, -1.241e-02, -7.292e-03, -7.211e-03, -2.436e-02, -3.499e-02, 1.088e-02, -6.181e-03, 1.773e-02, 4.539e-02, 4.674e-02, 3.335e-02, 3.972e-02, 1.125e-01)); + r += mul(s3_3, M4(1.806e-01, -8.409e-02, 1.720e-02, -2.359e-02, 3.185e-03, 6.891e-02, -6.363e-02, 9.348e-02, -1.460e-01, -9.123e-03, 7.783e-04, 4.054e-02, 5.063e-02, 3.042e-03, -2.027e-02, 4.392e-03)); + r += mul(s3_4, M4(3.199e-02, 1.959e-01, 3.936e-02, -4.458e-02, -6.123e-02, 4.388e-02, -2.194e-01, 1.704e-01, -4.122e-01, -3.330e-01, 2.208e-02, -1.334e-02, -8.992e-02, 1.455e-01, 2.601e-03, -4.506e-02)); + r += mul(s3_5, M4(-3.373e-02, -2.912e-02, 9.928e-02, -1.240e-01, -2.624e-02, -5.850e-02, -1.761e-02, 1.840e-01, 3.596e-03, -1.025e-01, -7.362e-02, 2.339e-01, -9.203e-02, -4.071e-02, -6.140e-02, 3.832e-02)); + r += mul(s3_6, M4(9.961e-03, -6.187e-02, -1.933e-02, 8.530e-03, -2.826e-02, 2.153e-02, 9.054e-02, 3.754e-03, -7.562e-02, 4.114e-02, 3.296e-02, -1.196e-02, 8.955e-03, 3.717e-02, -2.063e-02, -5.733e-03)); + r += mul(s3_7, M4(-7.716e-02, 4.829e-02, -1.901e-02, -4.509e-02, -1.704e-01, 1.060e-01, 4.398e-01, -6.755e-02, 1.498e-01, -1.051e-01, 4.117e-02, 3.259e-02, -1.031e-04, 4.512e-02, -2.488e-02, 1.855e-02)); + r += mul(s3_8, M4(-2.843e-03, 2.916e-02, 6.268e-02, 6.978e-02, 2.159e-02, 4.315e-03, 5.635e-02, -2.766e-02, 1.239e-01, -4.260e-02, -6.276e-02, -3.447e-01, 1.432e-02, -2.211e-03, -3.597e-02, 8.178e-02)); + r += mul(s4_0, M4(3.200e-02, 1.179e-02, 1.528e-01, -1.062e-01, -3.512e-02, -3.233e-02, -5.515e-03, 8.355e-02, -2.727e-02, 1.016e-01, 4.321e-02, -7.570e-02, 1.983e-02, -3.089e-02, -3.552e-02, -1.610e-02)); + r += mul(s4_1, M4(8.069e-02, 9.256e-02, 1.331e-01, -2.860e-01, 5.044e-02, -7.307e-02, -4.262e-02, 7.402e-02, -2.703e-02, 4.398e-02, 2.634e-02, -9.939e-02, 4.440e-02, 2.116e-02, 3.077e-02, -7.031e-02)); + r += mul(s4_2, M4(1.557e-01, -8.318e-03, 4.308e-02, -1.724e-01, -1.435e-02, -2.526e-02, -2.729e-02, -5.076e-02, 1.765e-02, -2.867e-02, -6.233e-02, -5.362e-02, 1.678e-02, 1.497e-02, 1.017e-03, -5.645e-02)); + r += mul(s4_3, M4(-4.239e-02, -2.053e-01, -2.306e-01, 6.489e-02, 5.423e-02, -1.091e-02, -1.483e-02, 3.417e-02, -1.686e-02, 2.041e-02, -1.409e-01, 3.213e-02, -4.532e-02, 1.505e-02, 1.634e-02, 3.612e-02)); + r += mul(s4_4, M4(2.897e-01, -2.806e-01, -2.645e-01, 8.348e-02, 8.619e-02, 1.776e-01, 1.974e-01, 2.876e-02, -3.004e-02, 3.145e-01, 4.906e-02, 1.955e-01, -1.321e-01, -2.143e-02, -6.912e-02, 6.615e-02)); + r += mul(s4_5, M4(-7.748e-03, -2.532e-01, -3.545e-01, 3.033e-02, -1.635e-02, 1.869e-02, 7.738e-02, -2.264e-02, 9.954e-02, -5.047e-02, 3.741e-03, -1.794e-01, 1.474e-02, 1.596e-03, -1.864e-02, -6.731e-02)); + r += mul(s4_6, M4(-1.653e-03, -9.351e-03, 3.484e-02, -4.003e-02, -9.898e-02, -2.235e-02, -1.330e-02, 7.185e-02, -7.997e-03, 1.449e-02, 2.336e-02, 7.019e-02, 4.894e-03, -2.798e-02, -5.484e-02, 2.123e-02)); + r += mul(s4_7, M4(-9.205e-02, 5.108e-02, 1.527e-02, 1.392e-03, 4.100e-03, -5.082e-02, -3.365e-02, 2.265e-02, 2.186e-02, 1.873e-01, -7.729e-02, 6.681e-02, 2.867e-03, -2.340e-02, 8.103e-02, -5.483e-02)); + r += mul(s4_8, M4(-1.313e-02, 4.408e-03, -8.138e-03, 5.902e-02, -3.839e-02, -2.684e-02, -4.869e-02, 4.440e-02, -2.105e-02, -7.091e-02, 1.829e-02, -3.390e-02, 3.873e-02, 4.157e-02, 1.981e-02, 1.946e-02)); + r += mul(s5_0, M4(2.334e-02, 3.993e-02, 5.202e-03, -9.693e-03, -3.201e-02, -1.384e-02, -7.217e-02, 2.663e-02, -3.987e-02, 6.253e-03, 1.969e-02, -2.946e-02, -1.711e-02, 3.179e-02, 1.067e-02, 7.245e-04)); + r += mul(s5_1, M4(-8.893e-03, 1.023e-02, 2.342e-03, -3.203e-02, -5.524e-03, -8.312e-02, -1.058e-01, 4.977e-02, 2.486e-02, 3.833e-02, 6.300e-02, -7.201e-02, -1.001e-01, -5.215e-02, -2.100e-02, -6.421e-02)); + r += mul(s5_2, M4(5.109e-02, -4.186e-02, 2.191e-02, 2.581e-02, -1.433e-02, -7.580e-03, -3.783e-02, -8.056e-03, -3.377e-02, 8.525e-04, -1.128e-03, -6.093e-02, 2.147e-02, -6.303e-03, -6.241e-02, 6.017e-03)); + r += mul(s5_3, M4(-4.761e-02, -1.372e-02, -3.552e-02, 3.599e-04, 1.214e-01, -6.299e-03, 1.480e-02, -8.976e-03, 3.266e-02, 1.771e-02, 3.796e-02, -1.831e-02, -1.391e-02, -9.186e-02, -6.225e-03, 5.898e-02)); + r += mul(s5_4, M4(8.423e-02, 3.137e-02, 4.434e-02, 1.085e-01, 3.023e-01, -8.527e-02, 7.218e-02, -5.191e-02, -1.233e-02, 1.033e-01, 9.048e-03, -4.183e-02, -9.748e-03, -2.114e-02, -2.998e-02, -9.669e-02)); + r += mul(s5_5, M4(3.973e-02, -7.449e-03, -2.213e-02, -3.953e-02, -9.978e-02, 4.218e-02, 5.922e-02, -3.750e-02, 8.369e-02, -8.765e-03, -8.399e-03, -1.647e-01, 1.567e-02, 6.577e-02, 2.294e-02, 1.047e-02)); + r += mul(s5_6, M4(-2.095e-02, 4.695e-03, 4.147e-04, -1.174e-02, -5.668e-02, -3.437e-02, 2.057e-02, 3.149e-02, 4.650e-02, 3.221e-04, 1.821e-02, 5.422e-07, 2.965e-02, 1.407e-04, -1.562e-02, 2.078e-02)); + r += mul(s5_7, M4(-3.733e-02, -3.165e-04, -1.253e-02, -2.114e-03, -4.983e-03, 2.351e-02, -4.800e-03, -1.981e-02, -5.786e-02, 3.940e-02, 6.295e-03, -3.255e-02, 1.012e-01, 6.146e-02, 7.819e-02, -1.884e-02)); + r += mul(s5_8, M4(2.228e-02, -6.352e-03, 3.042e-03, 5.002e-03, -5.742e-02, -9.249e-02, -1.621e-02, -9.820e-03, -1.002e-02, 5.962e-03, 4.975e-02, 6.422e-02, -7.860e-03, -1.443e-02, -2.501e-02, -9.089e-02)); + r += mul(s6_0, M4(2.593e-02, -2.106e-02, -9.315e-02, -1.588e-02, -4.834e-04, 4.033e-02, 8.170e-02, -2.834e-02, 7.213e-02, -1.698e-02, 1.755e-02, 7.160e-03, 1.784e-03, 7.740e-03, -2.678e-02, -7.900e-03)); + r += mul(s6_1, M4(-8.337e-02, -1.989e-02, 3.130e-02, 5.416e-02, 1.566e-02, 1.793e-02, 2.356e-02, -4.471e-02, 1.057e-01, 1.272e-01, -6.899e-03, -3.338e-02, -8.641e-02, 5.219e-02, 3.352e-02, 3.797e-02)); + r += mul(s6_2, M4(-2.020e-02, 1.724e-02, -4.451e-02, -1.208e-01, 2.702e-02, 2.763e-02, 2.839e-02, -7.844e-02, -1.323e-01, -5.892e-02, 8.941e-02, -4.337e-02, 3.685e-02, 1.741e-02, 2.508e-02, 2.584e-02)); + r += mul(s6_3, M4(-7.072e-02, 1.945e-01, 2.835e-02, -3.890e-02, -3.469e-02, -1.846e-01, -3.491e-02, 8.323e-02, -2.530e-02, 3.240e-02, -5.642e-02, 3.022e-02, -4.714e-02, 1.422e-01, 2.458e-02, -3.335e-02)); + r += mul(s6_4, M4(-2.238e-01, -2.635e-01, -7.144e-02, 3.293e-01, -1.628e-02, -2.398e-01, 5.062e-02, -2.532e-02, -1.285e-01, -3.389e-01, 3.699e-02, -5.371e-03, -2.601e-01, 5.951e-03, 8.429e-02, -3.201e-02)); + r += mul(s6_5, M4(-5.851e-02, 9.951e-02, 1.034e-01, -1.406e-02, -4.372e-02, -1.853e-03, -1.871e-02, 8.760e-02, -7.957e-02, 7.662e-02, 2.337e-02, 3.486e-02, -5.366e-02, -4.282e-02, 5.851e-02, 6.527e-02)); + r += mul(s6_6, M4(-6.305e-02, 3.629e-03, -3.122e-03, 7.434e-02, 3.563e-02, 2.526e-02, -4.778e-02, -1.559e-02, 1.241e-02, 1.023e-02, 1.879e-02, -1.039e-02, 2.028e-02, 4.485e-02, 1.075e-01, 1.070e-03)); + r += mul(s6_7, M4(-3.823e-03, 2.645e-03, -1.776e-02, 2.066e-02, -2.833e-02, 3.550e-02, 1.445e-02, -4.985e-02, 1.181e-01, 3.897e-02, 2.937e-02, -9.098e-02, 7.650e-02, 3.899e-02, -4.831e-03, -3.704e-02)); + r += mul(s6_8, M4(-2.920e-02, -5.251e-02, 2.254e-02, -6.883e-02, 5.724e-03, 2.651e-02, -6.057e-03, 9.096e-03, 3.633e-02, -4.201e-02, -3.488e-02, -8.097e-02, 7.612e-02, 2.966e-02, 2.154e-02, -3.136e-02)); + r += mul(s7_0, M4(-3.748e-02, -3.980e-03, -3.379e-02, 4.711e-03, -6.762e-02, -5.473e-02, 8.404e-03, 2.376e-02, 1.582e-02, -3.229e-02, 1.971e-02, -1.053e-02, 1.884e-02, -3.556e-02, -1.367e-02, -1.498e-02)); + r += mul(s7_1, M4(5.522e-02, -4.141e-02, -6.959e-02, -1.048e-02, -2.853e-02, -4.921e-02, -8.172e-02, -5.187e-02, -2.900e-02, 2.090e-02, 2.240e-02, 7.973e-03, 7.124e-02, 4.352e-02, 1.140e-01, 5.031e-02)); + r += mul(s7_2, M4(6.579e-02, 2.978e-02, -5.727e-02, 3.299e-02, 3.543e-03, -2.614e-02, -7.571e-02, 5.378e-02, 2.043e-02, 3.240e-02, -8.687e-03, -1.598e-01, -7.516e-02, 5.146e-02, -1.406e-02, -8.078e-02)); + r += mul(s7_3, M4(-2.594e-02, 5.558e-02, -1.456e-02, -6.015e-02, 1.152e-02, -5.249e-03, -2.351e-02, 3.421e-02, -1.144e-02, 1.757e-02, -4.052e-02, 2.019e-02, -1.739e-01, 3.596e-02, -2.141e-02, 4.382e-02)); + r += mul(s7_4, M4(-1.003e-01, -5.029e-02, -6.679e-02, -4.947e-02, -3.767e-02, -1.240e-01, 5.460e-02, 1.720e-01, 7.184e-02, -2.759e-01, -8.478e-02, 9.016e-02, 1.112e-01, -7.125e-02, 2.813e-01, -5.169e-02)); + r += mul(s7_5, M4(-1.241e-01, -5.689e-03, 5.222e-02, -8.964e-02, -4.678e-03, 8.057e-02, -6.200e-03, 1.470e-01, -1.116e-01, -5.630e-02, -2.219e-02, -8.636e-02, 2.893e-03, -5.927e-03, 1.032e-01, -6.155e-02)); + r += mul(s7_6, M4(2.134e-02, -1.446e-02, -3.882e-03, 1.371e-02, 1.431e-01, 4.379e-02, -4.228e-02, -2.528e-02, -2.155e-04, 4.310e-02, 1.660e-02, 3.111e-02, 3.602e-02, 5.593e-02, 1.453e-01, -4.403e-02)); + r += mul(s7_7, M4(2.626e-02, 6.772e-03, 4.549e-02, -3.049e-02, 6.318e-02, 5.360e-02, -4.657e-02, -6.026e-02, 3.501e-02, 4.578e-02, 7.335e-02, -2.653e-03, -8.575e-02, -1.048e-01, -1.078e-01, 4.408e-02)); + r += mul(s7_8, M4(1.421e-02, 3.581e-02, -1.463e-02, -3.530e-02, -1.142e-02, 2.423e-02, 5.455e-02, -5.861e-03, -1.333e-02, 1.092e-02, -9.548e-03, -2.754e-02, 4.699e-02, 2.851e-02, 2.327e-02, 6.692e-02)); + r += V4(8.948e-04, 1.990e-03, 9.713e-04, 1.205e-03); + return r; +} + +V4 f1(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(3.389e-03, 7.520e-03, 1.259e-02, -6.127e-03, -2.655e-02, 8.277e-02, 2.915e-02, 6.486e-03, 1.382e-02, 2.716e-02, 3.918e-02, -6.574e-04, 2.565e-03, -2.330e-02, 3.136e-02, 9.207e-03)); + r += mul(s0_1, M4(-4.758e-02, 2.047e-02, -1.812e-01, 8.253e-02, -6.141e-02, 5.434e-02, 1.445e-02, 2.395e-02, 8.711e-02, -8.225e-02, 9.429e-03, -8.062e-03, 3.237e-02, -6.446e-02, 3.525e-02, -4.911e-02)); + r += mul(s0_2, M4(-2.555e-02, -3.058e-02, 8.718e-02, 5.322e-03, 9.204e-02, -1.655e-02, 5.964e-02, 1.076e-04, -3.852e-04, 4.576e-02, -3.975e-02, 1.268e-02, -2.084e-02, 6.389e-02, -6.946e-02, -6.118e-03)); + r += mul(s0_3, M4(-2.187e-02, -1.655e-01, -6.551e-03, 2.522e-02, 2.641e-03, -2.192e-02, 1.919e-02, -3.912e-02, 4.619e-03, 5.472e-02, 9.158e-03, 2.166e-02, -5.676e-02, -9.017e-03, -5.924e-02, 2.695e-02)); + r += mul(s0_4, M4(4.154e-02, 2.009e-02, 9.076e-02, 4.883e-02, -4.819e-02, 6.009e-02, -6.625e-02, -1.990e-02, 4.523e-02, -8.145e-02, -6.002e-02, -4.633e-02, -5.778e-02, -1.835e-01, -5.321e-03, 2.915e-01)); + r += mul(s0_5, M4(-4.155e-03, 2.182e-02, -1.415e-01, -4.433e-02, -1.183e-01, -3.640e-02, -1.119e-03, -1.014e-01, -1.588e-02, 2.212e-02, 2.553e-02, 6.293e-03, 1.599e-04, -3.732e-03, 2.497e-02, 8.028e-02)); + r += mul(s0_6, M4(-6.323e-02, -1.055e-01, -1.316e-02, 2.636e-02, 9.896e-03, 1.086e-02, -8.842e-03, -3.453e-02, -8.107e-02, -1.236e-01, 4.905e-02, 3.644e-02, -2.301e-02, 2.756e-02, 2.838e-02, 1.820e-02)); + r += mul(s0_7, M4(1.173e-04, 1.045e-01, -4.923e-02, 1.502e-01, 1.812e-02, -3.892e-02, -6.967e-02, -9.212e-02, -4.975e-02, 9.300e-02, -3.681e-02, -3.613e-02, 2.705e-03, -4.590e-02, 5.355e-02, 4.852e-02)); + r += mul(s0_8, M4(-1.247e-02, 1.215e-02, 8.609e-02, 2.064e-02, 2.757e-02, 2.189e-02, 3.840e-03, 8.995e-02, -4.468e-02, 5.286e-02, 1.303e-02, -1.663e-02, -1.885e-02, -1.112e-01, 3.460e-02, -6.100e-02)); + r += mul(s1_0, M4(-6.209e-03, -3.165e-02, 7.816e-03, -3.634e-03, 8.947e-03, 6.921e-02, -3.440e-02, 1.416e-02, 6.665e-02, -7.318e-02, 1.376e-01, -2.433e-02, -6.348e-02, 1.719e-02, -9.155e-02, 4.758e-02)); + r += mul(s1_1, M4(-2.517e-02, -3.704e-02, -1.910e-01, 5.597e-02, 1.456e-02, 4.829e-02, -4.931e-02, -4.123e-02, 1.742e-01, 5.163e-02, 2.168e-02, 2.448e-02, 9.981e-02, -3.471e-02, 1.550e-01, 2.594e-02)); + r += mul(s1_2, M4(-2.252e-02, 6.209e-03, 8.043e-02, -6.079e-03, -3.058e-02, 2.503e-02, -5.771e-03, -5.417e-02, 2.677e-02, -2.000e-02, -8.863e-03, -2.313e-02, 3.216e-02, 6.615e-02, 7.237e-02, -1.405e-02)); + r += mul(s1_3, M4(-4.097e-02, -8.106e-02, -8.285e-02, -3.040e-02, -1.665e-02, -3.258e-02, 1.702e-02, -1.129e-01, -2.340e-02, -5.312e-02, -9.272e-02, 6.036e-02, -5.192e-02, 8.648e-02, 3.332e-02, 4.482e-02)); + r += mul(s1_4, M4(-2.622e-01, 1.383e-01, 1.763e-01, 3.596e-02, -1.208e-01, -2.145e-02, -4.241e-02, 1.184e-03, 7.848e-03, 5.837e-02, 2.803e-02, 1.070e-01, -2.225e-01, -1.420e-01, 1.186e-01, 3.776e-01)); + r += mul(s1_5, M4(1.724e-02, 2.162e-02, -9.960e-02, 2.283e-02, 9.574e-03, -1.244e-03, 8.956e-02, -6.425e-02, -1.665e-03, -6.402e-02, 1.868e-01, 1.540e-02, -5.122e-02, 5.534e-03, -5.407e-02, 3.521e-02)); + r += mul(s1_6, M4(-2.751e-02, -4.400e-02, -5.879e-02, 9.095e-02, -1.055e-02, -8.811e-02, -1.175e-02, -3.915e-02, -7.902e-02, 3.564e-02, 7.063e-02, 1.030e-01, -5.694e-02, 4.038e-02, 2.582e-02, 1.242e-02)); + r += mul(s1_7, M4(-4.710e-02, 5.456e-02, 1.631e-02, -4.291e-02, -4.871e-02, 1.195e-01, -6.078e-02, -1.251e-02, -6.566e-03, -5.065e-03, -6.147e-02, 1.044e-01, -2.083e-02, -1.261e-01, -1.621e-02, 1.057e-01)); + r += mul(s1_8, M4(-4.416e-02, -8.665e-03, 7.289e-02, 3.140e-02, -3.017e-02, -9.005e-02, -1.364e-02, 7.446e-02, -9.741e-02, -7.978e-02, 7.782e-02, -7.551e-02, 9.433e-03, 9.623e-03, -2.048e-02, -2.947e-02)); + r += mul(s2_0, M4(-2.772e-02, -2.164e-02, 7.659e-03, 3.794e-02, 3.537e-02, -2.254e-03, 4.604e-02, -2.204e-02, 1.463e-02, -9.815e-03, 4.111e-02, -2.033e-02, -2.097e-02, 5.408e-02, 6.952e-03, 7.498e-03)); + r += mul(s2_1, M4(-8.917e-02, 2.835e-02, -6.648e-02, 8.636e-02, 8.864e-02, -1.684e-02, 1.480e-02, -4.429e-02, 7.328e-02, -1.959e-02, -3.038e-02, -5.018e-02, -1.222e-01, -5.620e-02, -9.890e-02, -5.691e-03)); + r += mul(s2_2, M4(6.699e-03, -5.826e-02, 1.179e-01, 2.583e-02, 3.530e-02, 1.282e-02, -2.807e-02, 4.409e-02, -1.438e-02, -3.262e-02, -1.637e-02, 5.157e-02, 3.423e-02, -7.116e-02, -7.770e-03, -1.286e-01)); + r += mul(s2_3, M4(2.608e-03, 1.971e-03, 4.447e-02, 2.838e-02, 6.664e-02, 5.280e-02, -2.170e-02, 2.916e-02, 3.502e-02, 1.525e-02, 7.754e-03, -3.301e-02, -2.718e-02, 1.582e-02, -1.755e-02, -2.574e-02)); + r += mul(s2_4, M4(8.622e-02, -2.638e-02, 3.665e-02, 8.406e-02, 1.411e-01, 9.089e-02, 2.236e-02, 1.003e-01, -9.570e-02, -2.679e-02, -1.657e-02, 1.166e-02, -5.251e-02, 5.898e-02, -1.092e-01, -7.743e-02)); + r += mul(s2_5, M4(6.079e-03, -5.918e-02, -3.265e-02, -1.002e-01, 2.006e-02, 1.386e-02, 1.995e-03, 1.169e-01, -8.563e-02, 1.317e-02, 7.274e-03, -7.258e-02, 3.792e-02, -4.827e-02, -9.086e-02, -8.636e-03)); + r += mul(s2_6, M4(-3.646e-04, -2.339e-03, 2.319e-04, -1.914e-02, -3.163e-02, 9.229e-02, 5.341e-02, 6.546e-03, 2.506e-02, -1.426e-02, 9.487e-03, 1.894e-02, -4.312e-03, -1.777e-02, -3.552e-02, 1.463e-02)); + r += mul(s2_7, M4(2.148e-02, -9.688e-02, -9.999e-05, -2.830e-02, 4.155e-02, -6.702e-02, -6.066e-02, 1.354e-01, -3.162e-02, 3.835e-02, 1.017e-02, -3.827e-02, 2.321e-02, -1.329e-01, -7.002e-02, -3.650e-02)); + r += mul(s2_8, M4(7.319e-03, 5.381e-02, 2.118e-02, -9.138e-03, -2.484e-02, 5.284e-02, -1.983e-02, 1.940e-02, 3.993e-02, 8.693e-02, 1.614e-03, -2.157e-02, 2.590e-02, 3.161e-02, -1.333e-02, 1.129e-02)); + r += mul(s3_0, M4(-3.835e-02, -1.086e-01, -6.134e-02, 5.504e-02, 3.912e-02, 2.655e-02, 1.710e-02, 1.143e-02, 4.701e-02, 6.549e-02, 6.884e-02, -1.620e-02, -5.762e-02, 9.618e-02, 1.094e-02, 1.850e-02)); + r += mul(s3_1, M4(-3.649e-02, -6.180e-02, -6.058e-02, 3.240e-02, 7.819e-02, -3.521e-02, -4.401e-03, 3.315e-04, 2.334e-01, 2.764e-02, -2.176e-02, -5.948e-02, -5.164e-02, 4.412e-02, -4.379e-02, 2.517e-02)); + r += mul(s3_2, M4(7.464e-02, 6.763e-02, 4.442e-02, -1.586e-02, 4.191e-02, -1.634e-03, 2.254e-02, 1.911e-02, -6.519e-03, -1.946e-02, -1.119e-01, 2.122e-02, 1.112e-02, 4.285e-02, 3.919e-03, -8.520e-02)); + r += mul(s3_3, M4(4.564e-02, 3.957e-02, 4.070e-02, 4.562e-02, 9.257e-02, 1.840e-01, 1.044e-01, -7.292e-02, 1.704e-02, 1.096e-02, -1.576e-02, 1.956e-02, -7.280e-03, 2.829e-02, 4.816e-02, -5.652e-02)); + r += mul(s3_4, M4(-6.038e-02, -4.830e-02, -3.901e-02, -5.662e-02, 1.457e-01, -8.420e-02, -1.141e-01, 1.137e-02, -2.900e-01, -4.448e-02, 5.993e-02, 5.101e-02, -4.159e-02, 2.104e-02, -5.328e-02, -8.542e-02)); + r += mul(s3_5, M4(6.747e-02, -1.077e-01, -5.995e-02, 1.671e-02, -9.475e-03, 5.400e-02, 2.693e-02, 3.299e-02, 1.088e-01, -6.452e-02, -1.231e-01, -3.380e-02, 4.675e-02, 1.599e-01, -3.624e-02, -8.522e-02)); + r += mul(s3_6, M4(7.962e-03, -8.543e-03, -3.318e-02, -5.200e-03, 7.211e-03, -1.726e-01, 1.866e-02, 8.409e-02, -8.670e-03, -9.018e-03, 5.544e-03, 6.002e-03, -2.450e-02, -1.675e-02, -2.034e-03, -2.768e-02)); + r += mul(s3_7, M4(1.023e-02, -1.049e-02, -1.083e-02, -6.048e-03, -1.614e-02, 1.820e-01, -3.182e-02, 1.057e-01, -8.497e-02, -7.472e-02, -4.692e-02, -1.809e-01, 2.098e-03, -5.967e-02, -1.593e-02, -8.026e-02)); + r += mul(s3_8, M4(-6.207e-04, -7.989e-02, 2.571e-02, -8.136e-03, -7.600e-02, -8.224e-03, 2.579e-03, -9.677e-03, 1.446e-02, 5.286e-02, 5.722e-02, -2.114e-01, 2.445e-02, 1.152e-01, 2.590e-02, -3.222e-02)); + r += mul(s4_0, M4(1.107e-01, -1.932e-01, 1.181e-01, 1.244e-01, 1.052e-02, -2.045e-03, -5.702e-02, -5.084e-02, 1.022e-02, 1.248e-01, 3.951e-02, 2.430e-02, -1.406e-02, -7.153e-02, -1.988e-02, -3.406e-02)); + r += mul(s4_1, M4(2.168e-01, 3.301e-01, -3.037e-01, -1.521e-01, -1.148e-03, -1.835e-02, 1.568e-01, -4.724e-02, 9.126e-03, -4.870e-02, 4.026e-01, 3.410e-02, 2.907e-02, -5.150e-02, 1.901e-02, 1.412e-02)); + r += mul(s4_2, M4(-2.752e-02, 1.816e-01, 4.655e-02, -7.580e-03, -1.531e-02, -2.478e-02, 4.788e-02, 9.896e-03, 4.648e-02, -1.044e-03, -2.435e-01, 3.216e-02, -7.542e-03, 3.881e-02, -4.490e-02, -1.692e-02)); + r += mul(s4_3, M4(4.083e-03, -8.252e-02, 7.615e-02, -6.034e-03, -4.900e-02, -7.941e-04, -2.180e-02, 4.432e-02, -1.169e-01, -3.038e-01, -1.582e-01, 3.322e-02, 2.337e-02, 9.954e-02, 5.759e-02, -3.145e-02)); + r += mul(s4_4, M4(1.809e-01, 1.998e-01, -2.385e-01, -1.622e-01, -2.636e-01, -5.135e-02, -1.089e-01, -7.099e-02, -4.772e-02, -1.316e-02, 6.929e-02, 2.244e-01, -6.401e-02, -1.020e-01, -3.989e-02, -4.384e-02)); + r += mul(s4_5, M4(1.310e-01, -3.503e-02, -3.116e-02, 4.078e-02, -7.105e-02, 7.444e-02, 1.083e-01, -2.499e-02, -1.096e-01, 1.192e-01, 2.203e-01, 6.741e-02, 7.082e-02, -3.199e-02, -2.389e-02, -7.691e-03)); + r += mul(s4_6, M4(2.407e-02, -8.619e-02, 1.150e-02, 6.375e-02, -2.031e-02, -4.217e-03, -5.799e-02, -3.167e-02, -1.169e-02, 1.101e-01, 6.112e-02, 9.285e-02, -1.937e-02, -6.077e-02, -2.599e-02, -3.607e-02)); + r += mul(s4_7, M4(6.888e-02, 8.476e-02, -3.626e-02, -9.159e-02, 8.328e-02, 7.028e-02, 1.003e-01, -1.180e-01, 4.958e-02, 2.138e-01, -3.550e-02, -9.948e-02, 4.862e-02, 3.980e-02, 4.726e-02, 1.236e-01)); + r += mul(s4_8, M4(-6.420e-02, 1.342e-02, -1.840e-02, 4.381e-03, 5.058e-02, -4.503e-02, -1.165e-02, -5.512e-03, 1.917e-02, -8.328e-02, -4.917e-02, 8.961e-02, -1.187e-03, -6.838e-02, 8.467e-03, 1.941e-02)); + r += mul(s5_0, M4(-1.283e-02, -3.051e-02, -2.338e-02, 2.785e-02, -8.060e-02, -3.968e-02, -8.266e-03, -3.505e-02, -1.696e-02, 1.227e-03, -6.607e-02, 5.849e-02, 1.190e-02, -5.225e-02, 7.617e-02, -3.870e-02)); + r += mul(s5_1, M4(-1.012e-02, 2.933e-02, 6.008e-02, -5.941e-02, -1.743e-01, 1.073e-01, 8.960e-02, 3.006e-02, -7.397e-03, -8.892e-03, 1.642e-01, 8.724e-03, -8.483e-03, 3.919e-02, -3.170e-02, 3.047e-02)); + r += mul(s5_2, M4(-1.243e-02, 4.956e-02, -6.467e-02, -3.278e-03, -4.259e-02, -6.732e-02, 1.487e-01, 6.521e-02, 1.985e-03, 4.255e-02, -7.472e-02, 1.858e-02, 7.445e-02, -5.746e-03, 6.434e-02, 3.068e-02)); + r += mul(s5_3, M4(-3.875e-02, 3.297e-02, 4.139e-02, 3.460e-03, -8.803e-02, -4.263e-02, -3.565e-02, 1.007e-01, 3.837e-03, -2.905e-02, 7.172e-02, 1.306e-02, 2.493e-02, -5.609e-02, -8.131e-03, 6.291e-02)); + r += mul(s5_4, M4(1.073e-02, -3.688e-02, -2.959e-02, 9.288e-02, -2.241e-01, 3.321e-01, 1.306e-02, -1.070e-01, -1.482e-02, 2.946e-01, -8.599e-02, -4.609e-02, 2.239e-02, -2.737e-02, 2.610e-02, -4.906e-02)); + r += mul(s5_5, M4(2.187e-02, 1.376e-02, -3.030e-03, 7.956e-03, -5.125e-02, 1.164e-01, 1.200e-02, -9.520e-03, -5.519e-02, 4.714e-02, 2.154e-01, 1.160e-01, -1.639e-02, 1.855e-02, -1.008e-01, -9.249e-03)); + r += mul(s5_6, M4(-3.453e-03, 3.348e-02, 1.712e-03, -5.011e-04, -2.201e-02, 2.151e-02, 1.979e-03, -3.395e-03, -1.213e-02, 2.729e-02, -1.139e-02, 2.189e-02, -5.663e-03, -2.467e-02, 2.476e-02, -7.377e-03)); + r += mul(s5_7, M4(9.396e-03, -7.747e-02, -2.811e-03, -2.149e-02, -1.751e-02, -3.344e-02, 3.985e-02, -1.433e-01, 2.146e-02, 1.891e-01, 3.188e-02, -1.117e-03, -4.576e-02, 1.339e-02, 3.734e-02, 1.048e-01)); + r += mul(s5_8, M4(1.191e-02, -1.195e-03, -2.296e-02, -1.627e-02, 2.020e-02, -2.480e-02, 3.299e-03, -8.490e-03, 3.822e-03, -5.529e-02, -1.678e-02, 6.861e-02, -2.428e-02, -8.002e-03, 5.558e-02, 1.979e-02)); + r += mul(s6_0, M4(-5.811e-02, 4.039e-02, -6.513e-02, -6.604e-03, 1.075e-01, 2.321e-02, 5.469e-02, 8.040e-03, 2.506e-02, 1.163e-02, 3.306e-02, -1.456e-03, -1.529e-02, -5.932e-02, -5.833e-02, 2.738e-03)); + r += mul(s6_1, M4(-4.884e-02, -1.715e-01, -1.916e-01, 2.897e-02, 1.843e-01, -4.692e-02, -1.853e-02, -2.230e-02, 1.414e-01, 7.402e-02, -1.075e-01, -3.494e-02, -4.290e-02, 1.058e-01, -1.465e-01, -2.229e-02)); + r += mul(s6_2, M4(-1.153e-01, -7.394e-02, -6.556e-02, -6.556e-02, -8.043e-03, 1.193e-02, 5.607e-02, 1.844e-03, -1.837e-01, 9.215e-02, 9.504e-02, 9.817e-03, 2.725e-02, 1.198e-02, 5.897e-02, 3.098e-02)); + r += mul(s6_3, M4(1.761e-02, 4.537e-02, 1.067e-01, -8.746e-03, 1.787e-02, -9.920e-02, -3.239e-02, 5.108e-02, 4.780e-03, -9.644e-02, -1.311e-02, -3.046e-02, -2.323e-02, -3.263e-02, 5.415e-02, -4.851e-02)); + r += mul(s6_4, M4(-8.053e-02, 1.545e-02, 1.066e-01, -4.617e-02, -4.559e-02, 1.879e-01, 9.376e-02, -7.496e-02, 6.741e-02, 1.779e-01, 6.361e-02, -7.797e-02, -1.107e-01, 2.214e-01, -2.272e-02, 1.426e-01)); + r += mul(s6_5, M4(-6.805e-02, -3.927e-02, -6.014e-03, -7.738e-02, 9.368e-02, -1.609e-01, -1.065e-01, 1.225e-02, -6.853e-02, 1.932e-01, -1.668e-02, -9.059e-02, 6.658e-02, 3.841e-02, -5.200e-03, 5.170e-02)); + r += mul(s6_6, M4(-4.656e-02, 4.504e-02, -5.287e-02, -1.644e-02, -3.346e-02, 3.679e-02, 1.028e-02, -1.186e-02, 1.765e-02, -3.214e-02, -6.109e-03, 1.846e-02, 3.606e-02, -2.207e-02, -2.926e-02, 1.434e-02)); + r += mul(s6_7, M4(-8.875e-02, -1.138e-01, 3.614e-02, 5.972e-02, -4.303e-02, -6.824e-02, -6.290e-02, 3.037e-02, 8.320e-02, 5.187e-02, 2.754e-04, -2.584e-02, -1.107e-02, 9.315e-02, -6.093e-03, -6.393e-02)); + r += mul(s6_8, M4(1.157e-02, -4.621e-02, -6.926e-02, 8.876e-02, -9.391e-03, 3.727e-02, -4.458e-02, 2.121e-02, 2.106e-02, -3.948e-02, 8.082e-02, 2.461e-02, 6.079e-02, -4.652e-02, -2.836e-02, 2.681e-02)); + r += mul(s7_0, M4(5.114e-03, -2.569e-02, 3.260e-02, -2.151e-02, 7.769e-02, -4.802e-02, 5.664e-02, -1.079e-02, 1.984e-02, 1.183e-01, -1.139e-02, -1.175e-02, 3.094e-02, -1.100e-01, -4.499e-02, 1.390e-02)); + r += mul(s7_1, M4(-3.389e-02, 4.241e-02, 5.527e-03, -2.112e-02, 1.048e-01, 9.467e-02, 5.713e-02, 2.728e-02, 5.989e-03, -9.983e-02, 7.461e-03, 1.058e-02, -5.544e-02, -8.213e-02, -1.014e-01, -3.043e-02)); + r += mul(s7_2, M4(7.503e-02, -1.825e-02, 5.429e-02, -3.717e-02, 9.214e-02, -5.261e-02, 1.210e-02, -3.390e-03, -3.252e-02, -1.036e-02, 2.489e-02, 6.203e-02, -1.003e-01, -4.716e-02, 1.022e-01, -1.309e-02)); + r += mul(s7_3, M4(-7.687e-03, -3.867e-02, -1.057e-02, 6.437e-03, -2.496e-03, -3.949e-02, -1.606e-02, 8.343e-02, -5.804e-03, 4.233e-02, -4.025e-03, -6.402e-02, -1.085e-02, -5.191e-02, -2.972e-02, -5.956e-02)); + r += mul(s7_4, M4(3.281e-02, 1.172e-01, -3.093e-02, -1.255e-01, -4.895e-02, 2.468e-01, 5.429e-02, -1.111e-02, -1.089e-01, -1.431e-01, -1.288e-02, 4.952e-02, -7.425e-02, 2.862e-01, -1.732e-01, 1.773e-01)); + r += mul(s7_5, M4(-1.177e-02, -1.894e-02, 1.171e-01, 4.028e-02, -1.568e-02, -9.985e-02, 1.032e-02, 2.611e-02, 8.357e-02, -1.436e-01, -2.002e-02, 1.269e-01, -4.641e-02, 1.211e-01, 1.137e-01, -1.541e-02)); + r += mul(s7_6, M4(-4.138e-02, -2.104e-02, 3.944e-03, 2.774e-02, -4.084e-02, -2.422e-03, 6.718e-03, -5.330e-02, -4.369e-03, -1.373e-02, -5.662e-02, -2.131e-02, -3.799e-03, -1.844e-01, 9.049e-03, 1.410e-02)); + r += mul(s7_7, M4(-3.916e-02, 1.121e-02, 1.577e-02, 1.032e-01, -7.639e-02, -1.868e-02, -3.693e-03, 2.118e-02, 3.999e-02, 7.610e-02, -1.003e-02, 1.874e-02, 1.143e-02, 9.148e-02, 5.547e-02, -9.316e-02)); + r += mul(s7_8, M4(-8.276e-02, 4.820e-02, 1.563e-02, -8.235e-04, 1.295e-02, 5.992e-02, -1.244e-05, 4.372e-02, 2.411e-02, -1.194e-01, 5.303e-02, -8.634e-03, 1.812e-02, 4.170e-02, -3.776e-03, 3.476e-03)); + r += V4(6.314e-03, -4.083e-03, -5.575e-03, 2.198e-03); + return r; +} + +V4 f2(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-2.317e-02, 2.140e-02, 5.416e-02, -3.220e-02, -5.220e-02, -5.906e-03, -1.792e-02, 3.296e-02, -4.396e-03, -9.631e-03, 6.281e-02, -4.701e-02, -6.206e-02, -7.251e-02, 4.026e-02, -1.600e-02)); + r += mul(s0_1, M4(2.089e-02, 6.746e-02, -5.823e-03, 5.393e-02, 5.533e-02, 1.709e-02, -3.691e-02, 8.463e-02, 4.272e-02, -3.489e-02, -4.922e-02, 7.840e-03, 5.114e-03, -1.452e-02, 3.875e-02, 1.932e-02)); + r += mul(s0_2, M4(5.195e-03, 1.274e-03, -5.657e-02, 1.168e-02, -3.941e-02, -1.394e-02, -7.360e-02, 3.376e-02, 2.325e-02, -7.857e-03, 2.286e-02, 8.450e-03, -4.495e-03, 2.191e-02, -1.329e-02, 1.460e-02)); + r += mul(s0_3, M4(1.573e-04, -4.436e-02, -2.109e-02, -1.335e-01, -1.842e-02, -4.377e-02, -6.477e-02, 2.106e-02, 4.104e-02, -5.521e-02, -9.645e-02, 5.413e-02, 3.379e-02, -1.389e-02, 2.989e-02, -2.019e-02)); + r += mul(s0_4, M4(1.023e-01, -1.913e-01, -2.146e-01, 6.818e-02, -1.643e-01, -1.071e-02, -1.921e-01, 1.987e-01, 1.573e-01, 8.096e-02, -2.236e-01, 9.724e-03, 1.502e-01, 9.444e-02, -7.957e-03, -2.216e-02)); + r += mul(s0_5, M4(1.138e-01, -4.090e-02, -2.311e-02, -7.045e-03, 8.998e-02, 9.199e-02, -1.691e-02, -9.715e-02, -9.920e-02, -4.076e-02, 2.764e-02, -2.509e-03, -9.408e-02, -3.508e-02, 3.689e-02, 3.136e-03)); + r += mul(s0_6, M4(-8.569e-02, -5.073e-02, 1.737e-02, -1.988e-02, 3.497e-02, -3.528e-02, 4.473e-02, 1.117e-02, -3.247e-02, 3.441e-02, 4.658e-02, 3.563e-03, -6.532e-02, 3.094e-02, -2.603e-02, -1.594e-02)); + r += mul(s0_7, M4(-3.660e-02, 2.247e-02, 9.556e-03, -3.751e-02, 3.481e-02, -7.663e-02, 5.949e-02, 3.491e-02, -6.302e-02, -1.131e-02, 4.001e-02, 4.220e-02, -7.085e-02, 8.020e-02, -1.445e-02, 2.678e-03)); + r += mul(s0_8, M4(-2.271e-02, 7.600e-03, -2.439e-02, 3.518e-02, 1.157e-01, 1.564e-02, -5.385e-02, 4.756e-02, -1.477e-02, 3.291e-02, 6.282e-02, -3.349e-02, -8.181e-02, 2.934e-03, 2.245e-02, 3.534e-03)); + r += mul(s1_0, M4(-4.513e-03, 5.126e-03, 2.772e-02, 3.921e-03, 5.944e-02, 3.714e-02, -2.007e-02, 1.012e-02, -5.767e-02, -1.997e-02, 3.428e-02, -5.718e-02, 1.012e-01, -7.172e-03, -3.383e-02, 1.009e-02)); + r += mul(s1_1, M4(6.715e-02, -5.956e-03, 4.303e-03, -3.528e-02, -1.212e-01, -1.498e-01, 3.718e-02, 3.506e-03, -1.220e-02, 1.185e-02, 4.649e-02, -4.015e-02, 8.337e-02, -8.463e-02, -4.352e-02, 8.703e-02)); + r += mul(s1_2, M4(-5.595e-02, -1.257e-02, -8.995e-03, 3.012e-03, 2.058e-02, 7.551e-02, -8.898e-02, 3.804e-02, -4.212e-04, 1.656e-02, -2.705e-02, -2.645e-03, 1.868e-03, -3.374e-02, -7.498e-03, -6.545e-03)); + r += mul(s1_3, M4(-7.578e-02, 5.953e-02, -4.641e-02, -1.321e-01, -1.298e-01, 8.306e-03, -3.359e-02, -7.056e-02, 1.799e-01, -1.448e-01, -1.019e-01, 9.464e-02, -3.545e-02, -9.008e-03, -5.548e-02, 2.500e-01)); + r += mul(s1_4, M4(-2.196e-01, 7.144e-02, -4.200e-02, -1.117e-01, -9.059e-03, -3.158e-01, -2.360e-01, 3.103e-01, 1.813e-02, 5.464e-01, -1.661e-01, -8.085e-02, 5.253e-01, 8.802e-03, -1.143e-01, -2.565e-02)); + r += mul(s1_5, M4(1.983e-02, -2.760e-02, 2.705e-03, 2.669e-03, 2.214e-01, 4.875e-02, 4.467e-02, -5.118e-02, -1.282e-01, -6.104e-02, -4.064e-02, 6.221e-03, -4.961e-02, 6.540e-02, 2.248e-02, -6.910e-02)); + r += mul(s1_6, M4(2.671e-02, 5.138e-02, -1.806e-02, 5.722e-02, 1.702e-02, -1.124e-02, 3.056e-02, 2.635e-02, 1.622e-02, 1.989e-02, -9.058e-02, -1.958e-01, 7.815e-02, -8.188e-02, 5.310e-03, 4.956e-02)); + r += mul(s1_7, M4(-4.606e-02, 2.003e-02, 9.441e-02, -1.335e-01, 5.994e-02, -4.677e-02, 2.642e-02, -1.509e-01, 1.292e-01, 1.304e-01, -2.094e-01, -1.505e-02, 3.770e-04, -1.385e-01, 4.338e-02, 8.370e-03)); + r += mul(s1_8, M4(3.139e-02, -1.360e-02, -2.001e-02, 1.669e-02, 6.420e-02, 3.712e-03, -3.536e-02, -1.866e-02, -8.856e-02, 7.694e-02, 3.597e-02, -3.272e-02, 5.091e-02, -7.110e-03, -2.042e-02, -1.545e-03)); + r += mul(s2_0, M4(-4.959e-02, -1.329e-02, 7.463e-02, -5.105e-02, -6.674e-02, -1.251e-02, -7.988e-02, -2.182e-02, -3.110e-02, 5.533e-03, -8.445e-03, 3.012e-02, -2.530e-03, -2.695e-02, -1.047e-02, 1.376e-03)); + r += mul(s2_1, M4(-2.554e-02, 3.709e-02, 2.154e-02, 2.171e-02, 1.773e-02, 3.657e-02, 4.825e-03, -2.766e-02, 7.339e-02, 4.920e-03, 1.234e-02, -2.246e-02, 2.705e-02, -3.987e-02, -6.584e-02, 5.236e-02)); + r += mul(s2_2, M4(-9.939e-02, -4.689e-03, 6.423e-03, -3.887e-02, 1.546e-02, -1.286e-03, -4.168e-03, -5.610e-03, 4.064e-02, -1.559e-02, 6.352e-02, 4.886e-03, 3.035e-02, 4.711e-02, -6.727e-02, -1.255e-02)); + r += mul(s2_3, M4(-6.140e-02, 2.251e-02, -7.983e-02, 4.682e-02, 7.263e-02, -9.888e-02, 1.013e-01, 2.559e-02, 4.873e-02, -3.090e-02, 1.298e-02, 3.469e-02, 1.480e-02, -1.960e-02, -2.372e-02, 7.838e-02)); + r += mul(s2_4, M4(1.145e-01, 3.273e-02, -9.605e-02, 9.318e-02, 7.247e-02, 2.200e-01, 6.268e-02, -5.290e-02, -6.122e-02, 1.093e-01, 8.228e-02, 1.287e-02, -1.459e-01, 8.318e-02, -4.853e-02, 5.085e-02)); + r += mul(s2_5, M4(-4.779e-02, 8.225e-02, 2.385e-02, -4.571e-02, -9.574e-02, -4.217e-02, -4.030e-02, 2.191e-02, -5.811e-02, 1.499e-01, 6.884e-03, -2.423e-02, 5.154e-02, 6.224e-02, -4.652e-03, -6.035e-02)); + r += mul(s2_6, M4(3.869e-03, -2.026e-02, 6.053e-03, -5.713e-02, -1.018e-01, 9.545e-02, -4.759e-02, -9.942e-02, -1.872e-02, 4.380e-02, -3.654e-02, 8.080e-02, -4.077e-02, -2.924e-03, 7.406e-03, 3.256e-02)); + r += mul(s2_7, M4(-8.854e-02, -4.094e-02, -2.080e-03, -1.691e-02, 9.260e-02, -6.120e-02, -1.187e-01, -1.536e-02, 8.251e-02, -8.033e-02, -8.385e-04, 2.646e-02, 1.253e-01, -1.084e-01, 2.630e-03, 4.265e-02)); + r += mul(s2_8, M4(-6.622e-03, 5.509e-02, -8.380e-03, -1.103e-02, -3.211e-02, -3.222e-02, 5.015e-02, -1.870e-02, -1.441e-02, 6.121e-02, -3.573e-02, 1.764e-02, -1.146e-02, 4.329e-02, -2.472e-02, -5.634e-02)); + r += mul(s3_0, M4(4.565e-02, -9.615e-02, 1.248e-01, 2.272e-02, 1.459e-02, -3.926e-04, 6.452e-02, -2.011e-02, -1.717e-02, 2.410e-02, -6.860e-02, 1.250e-02, -2.947e-02, 4.729e-02, -1.287e-02, -9.612e-03)); + r += mul(s3_1, M4(-9.178e-02, 1.314e-01, 1.739e-02, -1.607e-01, -1.972e-02, 1.872e-02, -1.539e-02, -6.145e-03, -1.497e-01, -6.470e-02, -8.867e-02, -6.312e-02, -7.243e-02, -1.322e-01, -8.911e-02, 7.905e-02)); + r += mul(s3_2, M4(2.068e-02, 5.043e-02, 2.388e-02, 3.200e-02, -1.141e-02, 9.786e-03, 4.909e-03, 1.095e-02, 7.105e-02, 8.328e-03, 7.145e-03, 3.723e-02, -7.693e-02, 4.742e-03, -1.476e-02, -4.959e-02)); + r += mul(s3_3, M4(-8.096e-02, 8.019e-02, -6.519e-02, -1.301e-02, -2.094e-01, 7.597e-03, -2.663e-02, -1.061e-01, 7.876e-02, -5.979e-02, -1.494e-02, -3.206e-03, -1.928e-02, -5.113e-03, -2.049e-03, 2.542e-02)); + r += mul(s3_4, M4(-1.123e-01, 4.295e-01, -7.619e-02, -1.627e-01, 2.100e-01, -1.334e-01, 3.049e-02, -5.113e-02, 1.782e-01, 9.771e-02, -7.037e-02, 1.228e-02, -2.200e-01, -4.146e-03, -1.990e-02, 2.668e-02)); + r += mul(s3_5, M4(-2.272e-02, -4.168e-02, 5.787e-03, 8.180e-02, -1.149e-01, 8.850e-03, 2.428e-02, -1.037e-04, 1.139e-03, -3.601e-02, -1.110e-01, 5.826e-02, -1.135e-01, -1.448e-02, -4.284e-02, -8.897e-02)); + r += mul(s3_6, M4(2.568e-02, -3.332e-02, -1.429e-02, -7.309e-03, 8.377e-02, -8.014e-02, 3.598e-02, 1.488e-02, -5.766e-02, 6.066e-02, 2.302e-02, -7.826e-02, -9.080e-02, -6.473e-03, 2.925e-02, -1.859e-02)); + r += mul(s3_7, M4(1.522e-02, 9.791e-02, -5.046e-02, -4.644e-02, -1.261e-01, 6.878e-02, 5.854e-03, -7.513e-02, -1.506e-01, -1.318e-01, 1.578e-01, 2.697e-02, -4.071e-03, -2.210e-02, 3.974e-02, 3.940e-02)); + r += mul(s3_8, M4(-1.474e-02, -1.738e-02, -8.259e-03, -5.853e-03, -2.127e-02, -3.961e-02, 3.582e-02, 3.172e-03, -1.144e-01, -2.996e-02, 3.036e-03, -3.267e-03, -2.002e-02, -2.635e-02, -1.136e-02, -2.688e-02)); + r += mul(s4_0, M4(4.594e-02, -2.099e-02, 7.548e-02, -2.075e-01, 5.565e-02, -1.654e-02, 2.922e-02, 1.133e-02, -9.739e-02, -6.425e-05, -7.070e-02, 7.836e-03, 6.286e-02, -2.553e-02, 5.762e-02, -2.851e-02)); + r += mul(s4_1, M4(-1.678e-01, 1.242e-01, 1.588e-01, -1.239e-01, 2.922e-02, 7.846e-02, 1.019e-02, 9.464e-02, -1.160e-03, -5.613e-02, -1.619e-01, 6.253e-02, -3.288e-02, 3.520e-02, -5.805e-02, 2.132e-02)); + r += mul(s4_2, M4(-1.046e-01, -6.424e-02, 9.591e-02, 4.972e-02, 6.181e-02, 2.169e-02, -1.502e-02, -1.632e-03, 8.814e-03, -1.752e-02, -2.157e-02, -2.900e-03, 1.169e-02, 5.567e-02, 3.245e-03, 1.681e-02)); + r += mul(s4_3, M4(-4.928e-02, 8.546e-02, -1.618e-01, -2.128e-01, -1.497e-02, 4.482e-02, 4.796e-02, 2.129e-02, 9.864e-02, -1.528e-01, -3.969e-02, 7.450e-02, -1.001e-01, 1.126e-01, -4.606e-02, -2.537e-02)); + r += mul(s4_4, M4(-2.053e-01, -5.939e-02, -1.161e-01, 1.419e-01, -2.759e-03, 6.388e-02, -1.553e-02, -1.023e-02, 1.505e-01, 8.522e-02, 3.198e-02, 5.720e-02, 2.473e-01, -3.964e-02, 5.463e-02, -4.795e-02)); + r += mul(s4_5, M4(-5.172e-02, -1.282e-01, -2.116e-01, 1.091e-01, -2.214e-02, 3.969e-02, 4.337e-02, -1.764e-02, 3.215e-02, 3.299e-02, 2.793e-02, 7.400e-03, 6.523e-02, -5.966e-02, -9.938e-03, 4.816e-02)); + r += mul(s4_6, M4(-8.111e-02, -3.650e-02, 2.723e-02, -1.057e-01, 3.222e-02, 4.503e-02, -1.267e-02, 4.413e-02, -1.724e-01, 1.213e-01, 2.988e-02, -1.441e-02, 5.656e-02, -5.868e-02, 2.248e-02, -4.360e-03)); + r += mul(s4_7, M4(-4.270e-02, 1.211e-01, 5.248e-03, 3.833e-02, -5.154e-02, -7.461e-02, -2.644e-02, 1.660e-02, -6.261e-02, 1.525e-02, 1.216e-01, -1.214e-01, 3.315e-02, 1.384e-01, -4.694e-02, -3.589e-02)); + r += mul(s4_8, M4(-1.661e-02, -7.148e-02, 1.711e-02, 1.639e-03, -1.166e-02, -2.743e-02, 7.393e-03, -1.306e-02, -6.771e-02, -5.656e-02, -1.044e-02, 3.744e-03, -3.449e-03, -2.178e-03, 1.882e-02, 2.167e-02)); + r += mul(s5_0, M4(-9.376e-04, -2.194e-02, -6.724e-02, -2.053e-02, -2.572e-02, 1.345e-02, 6.833e-03, 6.722e-02, 5.867e-02, 1.715e-02, -5.763e-02, 1.907e-02, -7.177e-02, -9.071e-03, 8.056e-02, -4.422e-02)); + r += mul(s5_1, M4(-3.062e-03, -6.996e-02, -1.865e-02, -5.978e-03, 4.911e-02, 9.800e-02, 1.017e-01, 8.813e-02, -5.140e-02, 1.862e-03, 3.940e-03, -2.055e-02, -1.394e-02, 7.200e-02, 3.466e-02, -4.142e-02)); + r += mul(s5_2, M4(-5.375e-02, 5.841e-02, -2.139e-02, 1.491e-03, 2.405e-02, -6.375e-02, 2.696e-02, -6.658e-04, -1.718e-02, 1.131e-02, -2.777e-02, 1.809e-02, -3.598e-02, -8.768e-02, 4.309e-02, 2.209e-02)); + r += mul(s5_3, M4(-9.237e-03, -1.952e-02, -4.659e-02, 3.577e-02, 7.323e-02, 3.267e-02, 3.138e-02, -6.273e-02, 5.708e-02, -4.532e-02, -7.609e-03, 7.341e-02, -1.255e-02, -4.444e-02, -2.852e-02, 2.135e-02)); + r += mul(s5_4, M4(6.220e-02, -5.132e-02, 5.121e-02, 3.518e-02, -2.193e-01, -1.582e-01, -8.165e-02, -1.271e-02, 6.141e-02, 7.492e-02, 5.174e-02, -6.458e-02, 1.016e-01, -2.288e-02, -2.656e-02, 7.862e-02)); + r += mul(s5_5, M4(6.700e-02, 4.641e-03, -1.019e-02, 2.040e-03, -1.044e-01, 8.057e-02, 6.980e-02, -8.519e-02, 7.276e-02, -7.165e-04, -2.067e-02, 7.258e-02, 9.370e-03, 6.664e-02, -3.490e-04, -4.492e-02)); + r += mul(s5_6, M4(2.889e-02, -2.632e-02, 3.510e-03, 3.752e-03, -3.652e-02, 6.490e-02, 1.142e-03, 7.348e-02, -4.659e-02, -9.205e-02, 7.735e-03, -7.285e-03, -1.560e-02, -2.538e-02, 2.098e-02, -4.471e-03)); + r += mul(s5_7, M4(2.529e-02, 3.207e-02, 1.551e-02, 2.410e-02, -1.143e-01, -1.243e-01, 4.026e-02, -2.224e-02, 2.706e-02, -1.125e-01, -7.444e-04, 1.665e-03, -1.117e-02, 3.164e-02, 5.121e-02, -6.398e-03)); + r += mul(s5_8, M4(-1.810e-02, 3.387e-02, -1.359e-02, -2.422e-02, -4.049e-02, 8.675e-03, -1.482e-03, 1.121e-02, -5.411e-02, -3.881e-02, 1.730e-02, -2.959e-02, 7.139e-02, 1.425e-02, -9.283e-04, 2.819e-02)); + r += mul(s6_0, M4(1.039e-01, -1.434e-02, 1.175e-02, 7.725e-03, -4.108e-02, 1.405e-02, 2.887e-02, -6.200e-02, -3.134e-02, -3.633e-02, 2.553e-02, -2.109e-02, -1.613e-02, 3.979e-02, -8.357e-02, -1.594e-03)); + r += mul(s6_1, M4(-1.276e-01, -1.901e-01, 3.361e-02, -5.895e-02, -8.170e-02, -5.827e-02, 1.289e-01, -5.021e-02, -1.530e-01, -1.626e-01, -5.100e-02, -1.558e-01, 4.318e-02, -5.978e-02, 2.184e-02, -6.124e-02)); + r += mul(s6_2, M4(1.289e-02, 1.777e-01, -5.825e-02, -9.785e-02, 4.007e-02, 3.836e-02, 3.456e-02, 7.433e-03, 2.243e-02, 3.302e-02, 4.167e-02, 9.464e-02, 4.477e-02, 2.537e-02, -7.013e-03, 3.242e-02)); + r += mul(s6_3, M4(-1.525e-01, 1.014e-01, -1.807e-03, -1.846e-01, 1.672e-01, -8.167e-02, -1.717e-01, 1.343e-01, 6.778e-03, -5.364e-02, -2.812e-02, -1.182e-01, 3.515e-02, 3.398e-02, -1.040e-02, -1.062e-01)); + r += mul(s6_4, M4(1.956e-01, -2.669e-01, -1.460e-01, 4.621e-01, -9.447e-02, 2.349e-01, -1.470e-01, -4.941e-02, 7.513e-02, 4.184e-02, -1.044e-01, -2.203e-01, 7.399e-02, -1.302e-01, -3.328e-02, -3.597e-03)); + r += mul(s6_5, M4(1.476e-01, 4.634e-02, 1.029e-01, -6.998e-02, -3.599e-03, -8.547e-03, -4.742e-02, -8.798e-03, -1.155e-01, -1.334e-02, 1.572e-02, -1.198e-01, -3.377e-02, -1.021e-03, -5.352e-02, 2.362e-02)); + r += mul(s6_6, M4(-2.038e-02, -1.433e-02, -5.558e-02, -3.899e-02, 5.073e-02, -4.008e-02, -2.158e-03, -4.432e-02, 4.568e-03, 6.172e-02, 1.382e-02, -1.944e-02, 4.529e-02, 1.661e-02, 1.656e-03, 2.364e-02)); + r += mul(s6_7, M4(-5.675e-02, -1.128e-01, 5.922e-03, -2.657e-02, 4.674e-02, 5.763e-02, -5.162e-03, -2.677e-02, -1.060e-01, -1.866e-02, 6.187e-02, -1.249e-01, 2.508e-02, -6.913e-02, 5.112e-02, 2.815e-02)); + r += mul(s6_8, M4(7.287e-03, 1.523e-02, -2.667e-02, -1.769e-02, 1.994e-02, -3.947e-02, 3.164e-02, -1.631e-02, 6.569e-02, 2.412e-02, -4.184e-02, 4.302e-02, 1.836e-02, -6.858e-02, 3.069e-02, -2.480e-02)); + r += mul(s7_0, M4(-6.234e-02, -3.536e-02, 2.735e-02, 1.608e-02, -1.563e-02, -7.788e-02, 9.835e-02, -1.025e-04, -4.066e-02, 7.144e-02, 4.273e-02, 1.307e-02, 2.383e-02, 7.450e-02, -9.114e-02, 2.195e-02)); + r += mul(s7_1, M4(1.126e-02, 9.804e-02, 9.452e-02, 1.843e-02, 2.402e-02, 1.024e-01, 1.977e-01, -1.763e-02, -6.715e-02, -3.739e-02, 1.339e-01, -1.311e-01, -9.503e-02, 1.242e-02, 4.849e-02, -3.676e-02)); + r += mul(s7_2, M4(5.123e-02, -1.605e-02, 1.521e-03, 4.712e-02, 2.437e-02, -4.237e-02, -2.470e-02, 7.330e-03, 9.882e-02, -1.058e-02, -1.584e-02, 5.144e-02, 2.768e-02, 9.235e-02, -1.769e-02, -3.762e-02)); + r += mul(s7_3, M4(-1.533e-02, -7.504e-03, -4.468e-02, -8.556e-02, 3.764e-02, -1.577e-01, -5.104e-02, 3.940e-02, -3.595e-02, -2.249e-02, -4.397e-02, -1.208e-01, 4.481e-02, 1.282e-01, 5.298e-03, -1.793e-01)); + r += mul(s7_4, M4(-1.851e-02, 7.804e-02, -3.354e-02, 9.737e-02, -6.438e-02, 2.125e-01, -1.693e-01, 2.251e-02, 6.170e-02, -2.258e-02, -7.436e-02, -2.415e-01, -2.285e-01, -2.941e-01, 9.524e-02, 1.657e-02)); + r += mul(s7_5, M4(-1.524e-01, -4.079e-02, -2.911e-02, -7.842e-03, -1.804e-03, -3.636e-02, 3.002e-02, -4.805e-02, 9.590e-02, -1.424e-01, -2.798e-02, 1.406e-01, -3.761e-02, 1.214e-01, -8.535e-03, -1.786e-02)); + r += mul(s7_6, M4(2.536e-03, -1.993e-02, -1.801e-02, 4.518e-02, -2.252e-02, -6.023e-02, 2.992e-02, -1.164e-02, 2.239e-02, 3.118e-02, 3.715e-03, -1.298e-02, -4.918e-02, 6.960e-02, 5.030e-02, -3.900e-02)); + r += mul(s7_7, M4(2.215e-02, 6.815e-03, -1.234e-02, 6.264e-02, 5.752e-02, -5.832e-03, 7.431e-03, -4.491e-02, -8.863e-02, 8.035e-02, 4.167e-03, -1.112e-01, 1.098e-01, -4.264e-03, -1.362e-01, 1.234e-01)); + r += mul(s7_8, M4(7.512e-03, -3.196e-03, 3.111e-02, -2.059e-02, -2.756e-02, 3.436e-02, 3.508e-02, -3.981e-03, 3.004e-02, -5.253e-02, -4.691e-02, 4.399e-02, -3.001e-02, 4.106e-02, 2.402e-03, -6.141e-02)); + r += V4(1.032e-02, 5.736e-03, -4.566e-03, 3.095e-03); + return r; +} + +V4 f3(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(1.957e-02, -1.929e-02, -7.233e-02, 6.399e-02, 3.891e-02, -2.368e-02, -5.297e-02, 3.034e-02, 2.073e-02, -5.042e-02, 3.753e-02, -4.414e-03, 2.939e-02, -4.863e-02, -8.268e-03, 4.045e-02)); + r += mul(s0_1, M4(1.500e-02, 7.816e-03, -3.719e-02, -1.413e-01, -2.540e-02, -5.338e-02, 3.943e-02, 6.922e-02, -5.509e-03, -6.114e-02, 3.186e-02, -3.823e-03, 8.412e-02, -9.854e-02, 3.890e-02, 8.705e-04)); + r += mul(s0_2, M4(-3.633e-02, -1.220e-02, -1.844e-02, -7.541e-02, -1.891e-02, 3.772e-02, -4.209e-02, 6.710e-02, 4.396e-02, 1.547e-02, 4.528e-02, -2.666e-02, 5.815e-02, -3.918e-02, 1.937e-02, -4.644e-02)); + r += mul(s0_3, M4(1.167e-01, -3.639e-02, -4.217e-03, -9.302e-02, 6.612e-03, 5.179e-04, 5.621e-02, 2.659e-02, 2.275e-02, 9.503e-02, -2.446e-02, 4.318e-02, 3.466e-02, 4.579e-02, -1.291e-02, -2.690e-02)); + r += mul(s0_4, M4(-3.764e-03, 1.447e-01, 4.298e-02, 2.666e-01, -7.257e-02, 2.289e-01, -7.192e-02, 1.720e-01, 2.101e-02, 9.109e-02, -2.118e-02, 1.117e-01, -2.413e-02, -3.388e-02, -1.185e-01, 4.957e-02)); + r += mul(s0_5, M4(1.710e-01, -1.024e-02, 6.099e-02, -5.108e-03, -4.723e-02, -8.317e-02, 2.810e-02, -6.812e-02, 1.933e-02, -4.623e-02, -5.507e-02, -5.481e-02, 2.608e-02, 1.180e-01, -4.448e-02, 7.944e-02)); + r += mul(s0_6, M4(8.110e-04, 2.934e-02, 9.242e-02, -5.007e-02, -2.002e-02, 1.258e-02, 4.889e-02, -4.423e-03, -2.356e-02, -4.107e-02, 4.342e-02, -6.808e-02, 5.131e-02, 3.878e-02, 4.502e-02, -3.955e-03)); + r += mul(s0_7, M4(-1.708e-02, 6.205e-02, -6.230e-02, -8.522e-02, -9.137e-02, 9.945e-02, 1.625e-01, -9.107e-03, 9.373e-02, 2.157e-01, 1.192e-02, -1.947e-02, 5.642e-02, -1.830e-02, -4.282e-02, -3.323e-02)); + r += mul(s0_8, M4(-4.627e-02, -3.488e-02, -2.095e-02, 4.034e-02, -7.047e-02, 4.260e-02, -1.066e-02, 5.798e-02, -1.646e-02, 1.113e-01, 2.390e-02, -3.724e-02, 3.576e-02, -5.889e-02, 4.255e-03, -1.906e-02)); + r += mul(s1_0, M4(-5.832e-03, 3.125e-02, -1.642e-02, -3.459e-03, -1.119e-02, -2.803e-02, 1.157e-03, -3.958e-02, 4.631e-02, 1.482e-02, 7.727e-02, -3.134e-02, -4.881e-02, -2.130e-02, 6.989e-03, -7.346e-02)); + r += mul(s1_1, M4(-7.396e-02, 9.412e-02, 7.725e-03, 2.162e-02, 5.224e-02, -1.088e-02, -2.065e-02, -9.780e-02, -1.101e-02, 3.594e-02, 2.216e-02, -1.258e-01, -3.889e-02, 3.863e-02, -4.760e-02, 6.302e-02)); + r += mul(s1_2, M4(-5.090e-02, -2.363e-02, -3.503e-02, -1.487e-02, 5.198e-02, 4.417e-02, 3.775e-02, -5.158e-02, 3.694e-02, -1.838e-02, 4.035e-02, -2.728e-02, 2.090e-02, -3.677e-02, 1.538e-02, 5.569e-03)); + r += mul(s1_3, M4(1.207e-01, -3.502e-02, 2.359e-02, 4.536e-02, -1.038e-02, -3.105e-02, 9.460e-02, 3.270e-02, -1.572e-02, 7.465e-02, -4.742e-02, 5.380e-02, -1.301e-01, -8.177e-02, 2.412e-02, -4.786e-02)); + r += mul(s1_4, M4(8.592e-03, -1.604e-01, 1.551e-01, 1.448e-01, -2.117e-01, 1.461e-01, -8.745e-03, 2.140e-01, -7.602e-02, 9.228e-02, -5.262e-03, 1.787e-01, -2.019e-01, -1.864e-01, 9.426e-03, 1.811e-01)); + r += mul(s1_5, M4(6.368e-02, 3.336e-02, 3.970e-02, -1.583e-02, -2.103e-02, 6.325e-02, -3.413e-02, -7.886e-02, -7.021e-02, -1.133e-01, -1.177e-02, -2.928e-02, 2.705e-02, -1.405e-01, -5.630e-02, -3.552e-03)); + r += mul(s1_6, M4(-4.145e-02, -2.657e-02, -5.136e-02, 3.983e-02, -3.112e-02, 3.816e-02, 3.503e-02, -1.835e-02, -4.899e-02, -7.746e-02, -2.181e-02, 3.558e-02, -1.264e-02, 4.415e-02, 1.453e-02, -6.731e-03)); + r += mul(s1_7, M4(5.223e-03, -7.955e-04, 9.171e-02, -1.591e-01, -1.133e-01, 1.686e-01, -3.125e-02, -5.211e-02, 1.185e-01, -1.874e-01, -3.469e-01, 6.632e-02, 2.601e-02, 1.087e-01, 1.299e-01, -4.201e-02)); + r += mul(s1_8, M4(-2.578e-02, -7.088e-02, 4.434e-02, -5.593e-02, -1.833e-01, -7.441e-02, -1.421e-02, 3.444e-02, 1.911e-02, 1.664e-03, 7.838e-03, -1.117e-01, 5.608e-02, 5.974e-02, -3.714e-03, 2.898e-04)); + r += mul(s2_0, M4(2.406e-02, -5.912e-02, 1.298e-02, -1.281e-02, 1.433e-02, 9.674e-02, -3.115e-03, -7.976e-02, -5.297e-03, -1.302e-02, 4.163e-02, 7.091e-03, -8.644e-03, -4.116e-02, -2.294e-02, -2.830e-02)); + r += mul(s2_1, M4(-1.385e-03, -5.038e-02, 3.441e-02, -1.230e-01, -4.663e-02, 4.946e-02, 2.977e-02, 3.772e-02, -2.058e-02, 1.794e-02, 3.946e-02, -3.506e-02, -7.325e-02, 1.447e-02, -9.563e-02, -7.138e-03)); + r += mul(s2_2, M4(4.960e-02, 3.821e-02, -1.735e-02, 4.977e-02, 2.546e-02, -4.679e-02, -1.158e-02, 5.616e-03, -2.759e-03, 7.985e-02, 6.386e-03, 6.271e-02, -1.272e-02, 2.503e-03, 8.398e-03, 1.271e-01)); + r += mul(s2_3, M4(-1.038e-02, 2.823e-02, 4.136e-02, 7.295e-02, 1.117e-02, -6.778e-03, -2.525e-03, 1.712e-02, 2.669e-02, 7.388e-02, -4.112e-04, 4.131e-02, 5.201e-02, 4.515e-04, 1.094e-01, 2.320e-03)); + r += mul(s2_4, M4(-1.284e-01, 1.210e-01, -9.807e-02, 1.665e-01, 6.781e-02, 1.028e-01, 5.251e-02, -6.496e-02, -2.019e-03, -8.688e-02, -1.587e-01, -6.006e-02, -5.870e-02, -2.039e-02, 9.403e-02, 5.624e-02)); + r += mul(s2_5, M4(-6.943e-02, -3.505e-02, -1.387e-02, -3.432e-02, 1.336e-02, 1.029e-04, -2.559e-02, -5.021e-02, -1.027e-03, -9.446e-02, 7.434e-02, -6.495e-02, 5.121e-02, -1.844e-01, -1.339e-02, -2.068e-02)); + r += mul(s2_6, M4(-3.294e-02, 6.696e-03, 1.385e-02, -1.026e-02, 4.626e-02, -1.981e-02, -1.253e-01, 5.887e-02, 1.193e-02, 6.605e-02, -4.059e-02, 5.007e-02, 7.069e-03, -3.892e-02, 1.316e-02, -1.329e-03)); + r += mul(s2_7, M4(-5.214e-03, -2.388e-02, 8.716e-02, 7.790e-03, 9.102e-02, -1.228e-01, -2.001e-01, 1.346e-02, -9.074e-03, -2.822e-02, -7.053e-02, -2.615e-02, -1.325e-02, 1.692e-02, 1.367e-01, -6.891e-03)); + r += mul(s2_8, M4(9.435e-03, 8.678e-03, 1.546e-02, 1.673e-02, -4.425e-02, 3.501e-02, -2.438e-03, -2.117e-02, 9.269e-02, -1.192e-02, -9.051e-03, 1.089e-03, 2.173e-02, 6.414e-02, 8.247e-03, 1.388e-02)); + r += mul(s3_0, M4(1.310e-01, -1.323e-01, -3.285e-02, -6.364e-02, 1.523e-02, -5.964e-02, 2.667e-02, -2.718e-02, -5.582e-02, 4.316e-02, 2.139e-02, -3.882e-03, 2.538e-02, -2.755e-02, 8.806e-04, -2.173e-02)); + r += mul(s3_1, M4(8.679e-02, 5.650e-02, 1.789e-01, -1.361e-02, -6.412e-02, 2.237e-03, 3.455e-02, -1.238e-01, -1.592e-01, 6.738e-02, -9.433e-02, 5.789e-02, -3.984e-02, -4.034e-02, -1.080e-01, 1.221e-02)); + r += mul(s3_2, M4(-8.604e-02, 2.297e-02, -3.277e-02, -1.643e-02, 1.366e-02, 1.272e-02, -4.874e-03, -9.394e-03, -9.996e-03, -3.402e-02, 1.908e-02, 4.162e-02, -2.027e-03, 3.923e-02, 1.338e-02, -2.775e-02)); + r += mul(s3_3, M4(8.514e-02, 4.941e-02, 1.136e-01, 2.181e-02, 7.492e-02, 8.835e-02, 1.281e-01, 5.094e-02, -3.794e-02, 7.078e-02, -1.033e-01, 2.082e-02, 6.665e-02, -4.889e-02, 3.621e-02, -3.375e-03)); + r += mul(s3_4, M4(-1.772e-01, 1.164e-01, -2.896e-01, 7.526e-02, 6.486e-02, 3.452e-01, -9.239e-02, 1.387e-02, -1.371e-01, -4.009e-02, -1.604e-01, 8.436e-02, 3.300e-03, 5.823e-02, 3.795e-02, 6.376e-02)); + r += mul(s3_5, M4(-1.047e-01, -2.641e-02, -3.330e-02, 3.592e-02, -3.797e-03, -7.614e-02, -6.192e-02, -2.366e-02, 1.103e-01, 4.321e-02, 2.096e-02, 4.921e-02, 8.541e-02, 1.023e-02, 1.980e-02, -2.827e-02)); + r += mul(s3_6, M4(-5.483e-02, 6.945e-03, 6.125e-02, -1.114e-02, -3.109e-02, -7.767e-02, -1.777e-01, -1.954e-02, -4.336e-03, 3.103e-02, -9.225e-02, 2.032e-02, 6.714e-03, -9.436e-03, 4.314e-02, -1.701e-02)); + r += mul(s3_7, M4(-8.160e-02, -6.575e-02, 1.249e-01, 1.150e-02, 3.725e-02, 5.154e-02, -2.207e-01, 1.980e-02, 8.971e-02, -2.289e-02, 6.716e-02, -1.377e-01, 7.987e-03, 6.571e-02, 6.751e-02, -2.847e-02)); + r += mul(s3_8, M4(-2.108e-02, -6.825e-02, -5.537e-03, -1.622e-03, -7.742e-02, 7.133e-02, -9.959e-03, 1.210e-02, 9.613e-02, 2.147e-01, 4.867e-02, -6.740e-03, 5.943e-02, 1.073e-01, 1.379e-02, 2.028e-02)); + r += mul(s4_0, M4(8.846e-03, -1.414e-01, -6.767e-02, -1.371e-01, -3.770e-02, 5.099e-03, 9.724e-03, 6.872e-02, -3.600e-02, -2.685e-02, -1.448e-03, -1.022e-01, 3.550e-02, 4.504e-02, 3.020e-02, -2.420e-02)); + r += mul(s4_1, M4(1.128e-01, -1.848e-01, 2.358e-01, -2.083e-01, -2.705e-02, 9.311e-02, 2.559e-02, -8.758e-02, -2.868e-02, -8.436e-02, 4.441e-02, 1.806e-01, 4.224e-02, 1.685e-02, -9.670e-02, 2.653e-02)); + r += mul(s4_2, M4(-8.658e-02, -1.178e-01, -2.972e-02, -2.572e-01, 1.680e-02, -4.280e-02, 1.425e-02, 6.848e-03, 4.073e-02, 3.491e-02, 1.308e-02, -3.689e-02, 4.009e-02, -6.097e-02, 1.412e-02, -3.500e-02)); + r += mul(s4_3, M4(1.121e-01, -8.794e-02, 1.456e-01, 1.664e-01, -8.760e-02, 1.016e-01, -2.300e-02, -2.855e-02, -1.597e-02, 8.344e-02, -5.320e-02, 1.479e-01, -2.902e-03, -3.130e-02, -1.323e-02, -1.673e-02)); + r += mul(s4_4, M4(3.860e-02, -2.934e-02, 1.809e-01, 1.200e-01, -9.147e-02, 1.260e-01, -1.558e-01, -5.510e-02, 1.671e-01, -1.776e-01, -4.580e-03, -2.861e-01, -3.544e-02, 5.584e-02, 8.725e-02, 1.743e-02)); + r += mul(s4_5, M4(-3.700e-02, -1.345e-01, 4.381e-02, 1.123e-01, -3.882e-02, -1.464e-02, 1.230e-02, -2.082e-02, -2.821e-02, 4.478e-02, -2.708e-02, -4.165e-02, -1.810e-02, 1.548e-01, -8.655e-03, 2.190e-02)); + r += mul(s4_6, M4(3.707e-02, -3.001e-03, -5.624e-02, -2.532e-03, 3.347e-02, 1.560e-02, -5.180e-04, 7.213e-03, 1.037e-01, -1.121e-01, 1.677e-02, 3.223e-02, 2.705e-02, 8.575e-02, 3.078e-02, -2.267e-04)); + r += mul(s4_7, M4(2.250e-02, 1.487e-02, -1.650e-01, -1.409e-02, 7.617e-02, -7.459e-03, 1.392e-01, 6.905e-02, 9.223e-02, 2.307e-01, 1.427e-01, -5.743e-02, 8.216e-03, -1.208e-01, -8.752e-02, 3.296e-03)); + r += mul(s4_8, M4(1.453e-02, 7.337e-03, -1.524e-02, -1.241e-02, 7.055e-02, -1.957e-02, -2.605e-03, -3.496e-03, -4.691e-02, -1.215e-01, -2.121e-02, 1.250e-02, -1.895e-02, -7.662e-02, -9.187e-03, -4.188e-02)); + r += mul(s5_0, M4(2.253e-03, 2.895e-02, -3.356e-03, -3.946e-02, 6.570e-02, -1.506e-02, -7.567e-02, -3.304e-02, -8.512e-03, 1.700e-02, -3.170e-02, -9.021e-02, 2.892e-01, -4.648e-02, 2.220e-02, 1.739e-02)); + r += mul(s5_1, M4(1.111e-01, -4.749e-02, -1.770e-02, 2.719e-02, 4.371e-03, 6.664e-02, -4.068e-03, -2.892e-01, -1.957e-02, 2.262e-02, -5.655e-03, -5.166e-02, 2.833e-01, -7.883e-02, 8.146e-02, -5.218e-02)); + r += mul(s5_2, M4(2.774e-02, -5.780e-02, 7.517e-03, -7.034e-03, 4.927e-02, 3.076e-02, -3.758e-02, -9.627e-03, -1.044e-02, -1.818e-02, -2.164e-02, -2.569e-03, 2.926e-01, 4.791e-02, 1.676e-02, -4.867e-02)); + r += mul(s5_3, M4(1.016e-02, 2.146e-02, -1.199e-02, 2.797e-02, -7.898e-02, 9.582e-02, 3.174e-02, -3.970e-02, 9.055e-02, -4.866e-02, -4.249e-02, 2.899e-02, 2.318e-01, 3.959e-02, -6.066e-02, 1.228e-02)); + r += mul(s5_4, M4(-1.095e-01, 3.017e-02, -2.044e-02, -1.573e-03, -1.158e-01, -4.219e-02, -1.247e-01, 1.312e-01, 4.427e-02, -1.392e-01, 3.504e-02, -1.490e-01, 1.577e-01, 4.934e-02, -9.058e-02, 1.150e-01)); + r += mul(s5_5, M4(-4.875e-02, 9.593e-03, 3.234e-02, 5.133e-02, -2.486e-02, -8.642e-02, 3.262e-02, 1.322e-02, -6.464e-02, -3.717e-02, -3.904e-02, -2.541e-03, 2.439e-01, -2.009e-02, -2.255e-02, 2.965e-03)); + r += mul(s5_6, M4(7.269e-03, -5.754e-03, 1.268e-02, 1.436e-03, 6.907e-02, -7.310e-02, 1.493e-03, -2.275e-02, 2.023e-02, 3.361e-03, 2.436e-02, -2.308e-02, 2.661e-01, 1.148e-02, 7.581e-02, -3.858e-02)); + r += mul(s5_7, M4(-3.640e-02, -2.640e-02, 1.529e-02, 5.979e-03, 1.858e-01, 2.683e-02, 1.042e-01, -3.059e-02, 5.402e-02, -1.913e-02, -4.763e-02, 1.896e-02, 2.559e-01, -3.100e-02, 2.592e-04, -8.341e-02)); + r += mul(s5_8, M4(-2.953e-02, 3.158e-02, 2.555e-03, 1.784e-02, 1.153e-01, 5.659e-02, -2.682e-02, 1.226e-02, -3.080e-02, -2.664e-02, 7.513e-02, 2.257e-03, 2.487e-01, 1.699e-02, -6.703e-03, -3.605e-02)); + r += mul(s6_0, M4(-4.189e-02, -9.154e-02, 4.788e-02, -1.111e-01, 1.971e-02, -4.760e-02, 2.981e-02, -7.093e-02, -2.129e-02, -6.233e-02, -6.308e-04, -4.454e-03, -4.643e-02, -7.902e-03, -2.739e-02, 2.428e-03)); + r += mul(s6_1, M4(3.598e-02, -7.888e-03, -5.828e-02, 1.286e-01, -1.478e-02, -5.556e-02, -1.790e-02, -1.876e-01, -5.060e-02, 1.849e-01, -3.716e-02, -2.660e-02, -1.689e-02, -5.784e-03, 4.138e-04, -7.225e-02)); + r += mul(s6_2, M4(2.588e-02, -5.272e-02, 1.092e-01, 4.166e-02, -7.974e-03, -2.317e-03, 6.136e-03, 3.086e-03, 5.685e-02, -5.237e-02, -5.456e-03, 5.515e-02, -1.173e-02, -2.115e-02, 1.212e-02, 7.162e-02)); + r += mul(s6_3, M4(-1.605e-01, -1.559e-01, -6.509e-02, 1.481e-02, -1.061e-01, 1.587e-02, -2.719e-02, 9.496e-02, -1.964e-02, 1.008e-01, 3.483e-02, 6.958e-02, 6.500e-04, 5.742e-02, -2.891e-02, -8.490e-03)); + r += mul(s6_4, M4(-1.561e-02, 1.292e-01, 1.002e-01, 3.026e-02, -2.482e-02, -3.814e-01, 1.739e-01, -4.705e-02, 5.162e-02, -4.266e-02, 1.289e-02, 8.523e-02, -7.511e-03, -2.839e-02, -6.110e-02, -1.192e-01)); + r += mul(s6_5, M4(1.514e-01, 7.149e-02, -2.050e-02, -9.953e-02, 3.742e-02, -3.536e-02, -5.580e-02, -4.786e-02, -1.358e-01, 3.836e-02, 6.996e-02, 7.751e-02, -2.538e-02, -1.700e-03, 1.704e-02, 1.054e-02)); + r += mul(s6_6, M4(6.145e-02, 3.964e-02, -4.079e-02, -2.012e-04, 2.773e-02, 2.789e-02, -2.299e-02, 1.544e-02, -2.108e-02, 7.204e-03, -3.435e-02, -2.166e-02, -4.417e-02, -2.244e-02, -5.070e-02, 1.706e-02)); + r += mul(s6_7, M4(4.528e-02, -8.002e-02, 3.016e-02, -3.395e-02, 5.715e-02, -1.227e-01, 5.972e-04, -5.689e-03, 2.970e-03, 7.643e-02, -1.862e-02, -5.993e-02, 3.902e-02, -1.052e-01, 4.273e-02, -3.014e-02)); + r += mul(s6_8, M4(-3.764e-03, -5.511e-02, -9.549e-02, 8.376e-03, 2.026e-02, 2.640e-02, -1.948e-02, -4.695e-02, -6.268e-02, 3.103e-02, -2.264e-02, 1.770e-02, -3.231e-02, 6.016e-02, -2.159e-02, 1.004e-02)); + r += mul(s7_0, M4(-1.944e-02, -5.163e-02, 9.877e-03, 2.705e-02, 2.228e-02, -1.798e-02, 4.495e-02, -1.212e-02, -1.485e-02, -3.709e-02, 9.257e-03, -3.256e-02, -1.232e-01, -3.018e-03, -1.451e-02, 1.920e-02)); + r += mul(s7_1, M4(-3.847e-02, 1.337e-02, 5.937e-02, -1.280e-02, 1.287e-02, 2.614e-03, 1.622e-01, -1.062e-01, -6.421e-02, -5.570e-02, 9.379e-02, 1.947e-02, -3.728e-02, -5.490e-02, -6.420e-02, 4.407e-02)); + r += mul(s7_2, M4(1.588e-02, 7.788e-02, -2.490e-02, 1.825e-02, 1.764e-02, 5.213e-02, 2.868e-02, -1.027e-02, 2.788e-03, -2.785e-02, -6.366e-02, 1.291e-01, 2.413e-02, -6.380e-02, 7.746e-02, 1.257e-02)); + r += mul(s7_3, M4(-6.544e-02, 5.579e-02, -4.697e-02, 3.908e-02, -7.368e-02, 8.769e-02, -1.372e-01, 7.078e-02, -2.486e-02, 5.890e-02, 4.846e-02, 8.198e-02, 9.691e-02, -5.949e-02, 8.025e-02, 4.313e-02)); + r += mul(s7_4, M4(2.249e-02, -4.109e-02, -4.662e-02, -9.531e-03, -4.681e-03, -3.572e-01, -7.553e-02, -1.689e-01, -2.535e-02, 2.499e-01, 5.825e-02, 7.886e-02, -1.222e-01, -2.583e-01, -1.378e-01, -2.536e-01)); + r += mul(s7_5, M4(-2.349e-02, -1.093e-01, -1.163e-02, -4.259e-02, 8.261e-03, 1.136e-02, -2.641e-02, -5.521e-02, -3.955e-02, 3.419e-02, -4.726e-03, 6.041e-02, -6.211e-03, -2.036e-01, -3.757e-02, 4.397e-02)); + r += mul(s7_6, M4(-1.146e-02, -4.954e-03, 1.249e-02, -1.916e-02, 3.667e-02, 2.107e-02, 6.853e-02, -1.684e-02, -1.248e-02, -1.862e-02, -8.517e-03, -3.226e-02, -4.290e-03, 5.140e-02, -7.347e-02, -3.504e-02)); + r += mul(s7_7, M4(5.449e-02, 1.826e-02, -7.368e-02, 1.170e-02, -3.612e-02, 5.722e-02, 5.965e-02, -2.463e-02, -2.703e-02, -3.847e-02, 2.002e-02, -4.870e-02, 1.220e-01, -6.682e-02, 3.629e-02, 7.157e-02)); + r += mul(s7_8, M4(-2.929e-02, 6.953e-02, -1.551e-02, -2.604e-02, -2.354e-02, 4.386e-02, -2.369e-02, -4.634e-02, -2.935e-02, -1.085e-01, 3.650e-02, 8.587e-03, -5.270e-03, -4.489e-02, 1.397e-02, 3.679e-03)); + r += V4(-1.234e-02, 1.399e-03, -3.210e-03, 1.071e-02); + return r; +} + +void Pass16(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = Rmp8x8(tid.x) + blockStart; + uint2 size = GetInputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = (gxy + 0.5) * pt; + + V4 s0_0 = l0(-1.0, -1.0); + V4 s0_1 = l0(0.0, -1.0); + V4 s0_2 = l0(1.0, -1.0); + V4 s0_3 = l0(-1.0, 0.0); + V4 s0_4 = l0(0.0, 0.0); + V4 s0_5 = l0(1.0, 0.0); + V4 s0_6 = l0(-1.0, 1.0); + V4 s0_7 = l0(0.0, 1.0); + V4 s0_8 = l0(1.0, 1.0); + V4 s1_0 = -max(-s0_0, 0.0); + V4 s1_1 = -max(-s0_1, 0.0); + V4 s1_2 = -max(-s0_2, 0.0); + V4 s1_3 = -max(-s0_3, 0.0); + V4 s1_4 = -max(-s0_4, 0.0); + V4 s1_5 = -max(-s0_5, 0.0); + V4 s1_6 = -max(-s0_6, 0.0); + V4 s1_7 = -max(-s0_7, 0.0); + V4 s1_8 = -max(-s0_8, 0.0); + s0_0 = max(s0_0, 0.0); + s0_1 = max(s0_1, 0.0); + s0_2 = max(s0_2, 0.0); + s0_3 = max(s0_3, 0.0); + s0_4 = max(s0_4, 0.0); + s0_5 = max(s0_5, 0.0); + s0_6 = max(s0_6, 0.0); + s0_7 = max(s0_7, 0.0); + s0_8 = max(s0_8, 0.0); + + V4 s2_0 = l1(-1.0, -1.0); + V4 s2_1 = l1(0.0, -1.0); + V4 s2_2 = l1(1.0, -1.0); + V4 s2_3 = l1(-1.0, 0.0); + V4 s2_4 = l1(0.0, 0.0); + V4 s2_5 = l1(1.0, 0.0); + V4 s2_6 = l1(-1.0, 1.0); + V4 s2_7 = l1(0.0, 1.0); + V4 s2_8 = l1(1.0, 1.0); + V4 s3_0 = -max(-s2_0, 0.0); + V4 s3_1 = -max(-s2_1, 0.0); + V4 s3_2 = -max(-s2_2, 0.0); + V4 s3_3 = -max(-s2_3, 0.0); + V4 s3_4 = -max(-s2_4, 0.0); + V4 s3_5 = -max(-s2_5, 0.0); + V4 s3_6 = -max(-s2_6, 0.0); + V4 s3_7 = -max(-s2_7, 0.0); + V4 s3_8 = -max(-s2_8, 0.0); + s2_0 = max(s2_0, 0.0); + s2_1 = max(s2_1, 0.0); + s2_2 = max(s2_2, 0.0); + s2_3 = max(s2_3, 0.0); + s2_4 = max(s2_4, 0.0); + s2_5 = max(s2_5, 0.0); + s2_6 = max(s2_6, 0.0); + s2_7 = max(s2_7, 0.0); + s2_8 = max(s2_8, 0.0); + + V4 s4_0 = l2(-1.0, -1.0); + V4 s4_1 = l2(0.0, -1.0); + V4 s4_2 = l2(1.0, -1.0); + V4 s4_3 = l2(-1.0, 0.0); + V4 s4_4 = l2(0.0, 0.0); + V4 s4_5 = l2(1.0, 0.0); + V4 s4_6 = l2(-1.0, 1.0); + V4 s4_7 = l2(0.0, 1.0); + V4 s4_8 = l2(1.0, 1.0); + V4 s5_0 = -max(-s4_0, 0.0); + V4 s5_1 = -max(-s4_1, 0.0); + V4 s5_2 = -max(-s4_2, 0.0); + V4 s5_3 = -max(-s4_3, 0.0); + V4 s5_4 = -max(-s4_4, 0.0); + V4 s5_5 = -max(-s4_5, 0.0); + V4 s5_6 = -max(-s4_6, 0.0); + V4 s5_7 = -max(-s4_7, 0.0); + V4 s5_8 = -max(-s4_8, 0.0); + s4_0 = max(s4_0, 0.0); + s4_1 = max(s4_1, 0.0); + s4_2 = max(s4_2, 0.0); + s4_3 = max(s4_3, 0.0); + s4_4 = max(s4_4, 0.0); + s4_5 = max(s4_5, 0.0); + s4_6 = max(s4_6, 0.0); + s4_7 = max(s4_7, 0.0); + s4_8 = max(s4_8, 0.0); + + V4 s6_0 = l3(-1.0, -1.0); + V4 s6_1 = l3(0.0, -1.0); + V4 s6_2 = l3(1.0, -1.0); + V4 s6_3 = l3(-1.0, 0.0); + V4 s6_4 = l3(0.0, 0.0); + V4 s6_5 = l3(1.0, 0.0); + V4 s6_6 = l3(-1.0, 1.0); + V4 s6_7 = l3(0.0, 1.0); + V4 s6_8 = l3(1.0, 1.0); + V4 s7_0 = -max(-s6_0, 0.0); + V4 s7_1 = -max(-s6_1, 0.0); + V4 s7_2 = -max(-s6_2, 0.0); + V4 s7_3 = -max(-s6_3, 0.0); + V4 s7_4 = -max(-s6_4, 0.0); + V4 s7_5 = -max(-s6_5, 0.0); + V4 s7_6 = -max(-s6_6, 0.0); + V4 s7_7 = -max(-s6_7, 0.0); + V4 s7_8 = -max(-s6_8, 0.0); + s6_0 = max(s6_0, 0.0); + s6_1 = max(s6_1, 0.0); + s6_2 = max(s6_2, 0.0); + s6_3 = max(s6_3, 0.0); + s6_4 = max(s6_4, 0.0); + s6_5 = max(s6_5, 0.0); + s6_6 = max(s6_6, 0.0); + s6_7 = max(s6_7, 0.0); + s6_8 = max(s6_8, 0.0); + + t4[gxy] = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t5[gxy] = f1(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t6[gxy] = f2(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t7[gxy] = f3(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); +} + +//!PASS 17 +//!DESC conv16 +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 +//!IN t4, t5, t6, t7 +//!OUT t0, t1, t2, t3 + +#define l0(x, y) V4(O(t4, float2(x, y))) +#define l1(x, y) V4(O(t5, float2(x, y))) +#define l2(x, y) V4(O(t6, float2(x, y))) +#define l3(x, y) V4(O(t7, float2(x, y))) + +V4 f0(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-5.156e-02, 6.165e-02, 2.515e-02, -4.821e-02, 4.392e-02, -1.782e-02, -2.298e-02, 5.459e-04, -6.055e-03, 7.091e-02, -1.707e-02, 3.750e-02, -2.571e-02, 4.308e-02, 8.761e-02, -7.659e-02)); + r += mul(s0_1, M4(3.125e-02, -2.226e-02, -3.384e-02, -6.259e-02, -2.213e-02, 2.235e-02, 7.938e-02, -4.267e-02, 3.313e-02, -9.646e-02, 2.131e-02, 1.986e-02, 7.270e-02, -5.378e-02, 1.201e-03, -9.428e-03)); + r += mul(s0_2, M4(-6.791e-02, 3.883e-02, -9.256e-02, 1.588e-02, 4.954e-02, -6.834e-03, -2.625e-02, 2.904e-02, -4.382e-02, 4.837e-03, 1.303e-02, -3.053e-02, 2.798e-03, 8.662e-04, 2.414e-02, -2.178e-02)); + r += mul(s0_3, M4(-4.441e-03, 3.012e-02, -1.029e-01, 3.504e-02, -6.492e-03, 4.360e-02, -2.207e-03, 3.454e-02, -3.369e-02, -8.222e-02, -5.546e-02, -2.461e-02, -1.658e-02, 2.443e-02, 8.769e-02, -9.597e-03)); + r += mul(s0_4, M4(-1.814e-01, -2.435e-01, 2.376e-01, -3.096e-01, -5.681e-02, -5.972e-03, 1.443e-01, -1.880e-01, 1.846e-02, -9.695e-02, 7.147e-02, 4.801e-02, 1.037e-01, 2.661e-02, 3.455e-02, 3.356e-02)); + r += mul(s0_5, M4(3.519e-02, 2.718e-02, 9.848e-02, 8.631e-02, 4.184e-02, -5.676e-02, -6.712e-02, 1.062e-01, -3.166e-03, 6.845e-02, 3.497e-02, -7.318e-03, 4.985e-02, 1.843e-02, 1.803e-02, 7.571e-03)); + r += mul(s0_6, M4(-3.625e-02, -5.030e-02, -3.556e-02, -9.736e-02, 1.095e-03, -1.929e-02, -5.579e-02, -1.876e-02, 1.891e-02, -3.657e-02, 3.884e-02, 4.106e-03, -1.988e-02, -2.700e-02, 1.826e-02, 8.161e-03)); + r += mul(s0_7, M4(-2.913e-02, -4.620e-03, 5.326e-02, 7.157e-02, 4.533e-02, 9.379e-02, 1.550e-01, 6.340e-02, 9.767e-03, -1.862e-02, -5.731e-02, -4.649e-03, 1.028e-03, -6.575e-02, -7.045e-02, -7.278e-03)); + r += mul(s0_8, M4(-3.700e-02, -6.231e-02, -8.645e-02, 2.889e-02, -4.881e-02, -1.095e-03, -4.147e-02, 2.005e-02, 9.187e-03, 1.735e-02, 6.280e-02, -7.805e-02, 1.408e-02, -1.202e-02, -2.381e-03, 8.901e-03)); + r += mul(s1_0, M4(-3.447e-02, 5.741e-02, 3.830e-03, -5.936e-03, 9.599e-03, -6.178e-02, 4.019e-03, -4.353e-02, 5.675e-02, -4.451e-02, 5.019e-03, 5.025e-02, 8.918e-02, -5.737e-02, 4.635e-02, -6.282e-02)); + r += mul(s1_1, M4(-1.228e-02, -6.435e-02, 7.405e-02, -1.218e-01, 5.559e-02, -1.284e-02, -4.044e-04, 9.694e-03, 9.755e-02, 4.876e-02, -3.523e-02, 2.152e-01, 8.096e-02, -2.807e-02, -4.256e-02, 9.904e-02)); + r += mul(s1_2, M4(-1.230e-02, 4.846e-02, 3.442e-03, 1.878e-02, 1.026e-02, 2.434e-03, -4.669e-02, -6.950e-02, -5.199e-02, -1.260e-02, 2.584e-03, -5.970e-02, -4.281e-02, 2.061e-02, 1.963e-02, -2.112e-02)); + r += mul(s1_3, M4(-1.030e-02, 2.621e-02, 6.983e-02, -2.046e-02, 1.633e-02, -6.756e-02, -1.049e-01, 3.083e-02, 7.832e-03, -1.279e-01, -4.689e-02, 8.196e-02, 2.190e-01, -1.967e-01, 2.125e-01, -3.281e-02)); + r += mul(s1_4, M4(4.708e-02, -4.659e-02, -6.770e-03, 4.344e-02, 1.488e-01, -6.091e-01, 1.748e-01, -3.358e-01, 2.832e-01, 1.045e-02, 8.715e-02, 9.823e-03, 5.027e-03, 9.443e-02, -1.500e-02, 4.938e-02)); + r += mul(s1_5, M4(8.091e-02, 2.685e-02, 4.437e-02, -5.866e-03, -5.661e-02, -6.368e-05, -2.218e-02, 1.242e-01, -8.986e-02, 4.820e-02, 3.979e-02, -4.334e-02, 8.221e-03, 6.210e-03, 3.771e-02, 9.308e-03)); + r += mul(s1_6, M4(-2.767e-02, -4.336e-02, -2.202e-02, -3.286e-02, -6.555e-03, -5.700e-02, -7.689e-02, -1.102e-02, -1.407e-03, -6.665e-02, -3.185e-02, 2.750e-02, -3.314e-02, -5.566e-02, 9.604e-03, 8.935e-02)); + r += mul(s1_7, M4(8.737e-04, 4.815e-02, 1.344e-02, 1.764e-02, 4.722e-02, -1.648e-02, 1.023e-01, -2.641e-02, 3.347e-02, 9.013e-03, -3.238e-02, -2.522e-03, 9.035e-02, 4.695e-02, -1.043e-01, 3.727e-02)); + r += mul(s1_8, M4(1.181e-02, -4.895e-02, -1.434e-02, 3.660e-02, 1.319e-02, 1.363e-02, -3.919e-02, 2.970e-02, -1.936e-03, 1.717e-02, 4.928e-02, -4.602e-02, 4.838e-02, 3.795e-02, 3.504e-02, 1.532e-02)); + r += mul(s2_0, M4(-6.113e-03, 3.948e-03, -1.352e-02, 6.239e-03, -3.047e-02, 1.207e-01, -3.000e-02, -3.911e-02, 1.401e-02, 1.932e-02, -5.285e-02, 3.610e-02, 3.287e-02, -3.219e-02, 9.459e-02, -4.369e-03)); + r += mul(s2_1, M4(3.883e-03, 1.594e-02, 1.902e-02, -1.362e-03, -1.255e-01, 1.213e-01, 1.349e-02, -4.341e-02, -1.824e-03, -2.703e-02, 2.730e-02, -2.791e-02, 6.127e-02, -1.142e-01, -7.652e-02, -9.776e-03)); + r += mul(s2_2, M4(-3.686e-02, 5.035e-04, -1.472e-02, 6.111e-03, -1.857e-02, 1.292e-02, 6.319e-03, -1.197e-02, 5.313e-02, 7.473e-03, 3.750e-02, -2.960e-04, -1.047e-01, 5.681e-02, -3.128e-02, -3.333e-02)); + r += mul(s2_3, M4(3.041e-03, 1.363e-01, 4.553e-02, -1.397e-02, 7.855e-02, -3.787e-01, -1.873e-02, 1.744e-02, 3.652e-02, 1.626e-01, 3.480e-01, 1.356e-02, -3.601e-02, 6.745e-02, -7.356e-02, 4.401e-02)); + r += mul(s2_4, M4(-2.452e-01, -2.038e-02, 1.651e-02, -4.464e-02, 1.841e-01, -2.265e-01, 1.834e-01, -2.317e-01, 1.901e-01, -1.588e-01, 8.960e-02, 4.321e-02, 3.730e-03, -1.431e-01, 1.646e-01, -1.784e-01)); + r += mul(s2_5, M4(-2.948e-02, 6.034e-02, 2.741e-02, -1.858e-03, -8.280e-02, -3.976e-02, -1.900e-02, -8.848e-04, 9.574e-03, 9.837e-02, -1.075e-02, -4.271e-02, 8.699e-02, 4.763e-02, 3.408e-02, 1.132e-02)); + r += mul(s2_6, M4(-5.689e-03, 1.968e-02, -9.377e-03, -7.532e-03, -4.090e-02, 4.229e-02, 6.487e-03, -4.127e-03, -3.308e-02, 5.425e-01, -6.888e-02, -5.967e-02, -4.626e-04, -2.241e-02, -1.314e-02, -9.065e-03)); + r += mul(s2_7, M4(8.726e-02, -1.536e-02, 5.006e-02, -3.736e-02, -8.779e-02, -7.939e-02, 7.228e-02, 6.325e-02, -2.287e-02, 7.908e-02, 7.380e-02, 1.010e-01, -5.090e-02, -3.593e-02, 2.127e-02, 3.041e-02)); + r += mul(s2_8, M4(-2.976e-02, -5.428e-03, 1.955e-02, -3.945e-02, 6.621e-02, 7.847e-02, 3.751e-02, -2.453e-02, 5.446e-02, -2.147e-03, 9.343e-02, 1.831e-02, -2.326e-02, 9.726e-03, 9.310e-03, 4.441e-02)); + r += mul(s3_0, M4(8.006e-03, 1.303e-02, -1.699e-02, 3.502e-02, 3.206e-02, -1.142e-02, 6.145e-02, 4.134e-03, 5.406e-03, -6.115e-02, -1.278e-02, -7.290e-03, 6.903e-02, -1.011e-02, -2.205e-02, 1.344e-01)); + r += mul(s3_1, M4(-1.503e-04, 1.265e-02, 9.939e-03, -7.723e-04, 6.080e-03, -7.056e-02, -4.305e-02, -3.895e-02, 4.111e-02, -2.079e-02, 3.906e-02, 2.248e-02, 6.166e-02, 3.592e-02, -1.023e-01, 1.410e-02)); + r += mul(s3_2, M4(4.089e-02, -6.372e-02, -1.870e-02, 2.216e-02, -1.168e-02, 3.430e-02, -3.698e-03, 1.849e-02, 9.200e-03, 2.253e-02, 1.825e-02, 1.871e-02, 4.994e-02, -3.840e-03, -5.043e-02, 7.897e-03)); + r += mul(s3_3, M4(1.894e-02, -2.918e-02, -3.547e-03, 9.431e-03, 3.416e-02, -1.264e-01, -1.016e-01, 6.763e-02, 6.354e-02, -4.594e-02, -5.100e-02, 6.429e-02, -1.147e-02, 8.992e-02, 2.033e-02, 2.801e-02)); + r += mul(s3_4, M4(-1.359e-01, -1.328e-01, -2.280e-01, 1.655e-01, 1.170e-01, -3.456e-02, -1.741e-02, 2.617e-02, -4.748e-02, -6.031e-02, -3.827e-02, 6.860e-02, 5.744e-02, -2.272e-01, 9.794e-02, -7.356e-02)); + r += mul(s3_5, M4(-1.267e-01, 5.624e-02, -5.376e-02, 7.105e-02, 8.256e-03, -1.507e-02, -1.542e-02, 1.324e-02, -4.601e-02, 5.123e-02, -1.844e-02, 2.398e-02, 7.308e-02, 1.566e-02, -3.331e-02, 7.307e-02)); + r += mul(s3_6, M4(2.185e-02, 1.127e-01, -3.688e-02, 4.312e-02, 5.437e-03, -2.636e-02, -6.787e-02, 2.842e-02, 6.742e-02, 9.200e-03, 3.874e-02, 8.117e-02, 1.908e-03, 2.687e-02, -3.284e-02, 4.026e-02)); + r += mul(s3_7, M4(-1.473e-02, -2.724e-02, -4.317e-02, -1.223e-01, 8.346e-03, -1.594e-02, 1.405e-03, -1.531e-02, 1.548e-01, -5.796e-03, 5.517e-02, -8.836e-02, -1.659e-02, 2.499e-02, -2.863e-02, 5.616e-02)); + r += mul(s3_8, M4(4.551e-02, -2.843e-02, 6.142e-03, -6.877e-02, -6.137e-04, -4.215e-03, 1.564e-02, -4.295e-03, 4.038e-02, -3.400e-02, 6.898e-02, -3.296e-02, 3.822e-02, -1.935e-02, -6.912e-03, 2.093e-02)); + r += mul(s4_0, M4(-2.593e-02, 2.093e-02, -1.977e-02, -8.374e-02, -3.038e-02, 7.975e-02, 2.651e-02, 3.106e-03, -1.552e-02, -2.949e-02, -3.688e-02, -3.919e-02, 2.234e-02, 2.978e-03, -6.088e-03, 1.161e-02)); + r += mul(s4_1, M4(-9.005e-03, -2.757e-02, 7.088e-02, -9.204e-02, 5.620e-02, -2.922e-02, -6.345e-02, 6.129e-02, 4.920e-02, -2.946e-02, 8.479e-02, -8.622e-03, -3.982e-03, 9.320e-02, 6.492e-02, 6.297e-02)); + r += mul(s4_2, M4(-2.727e-02, 4.210e-02, 2.567e-02, -3.893e-03, -1.296e-02, 1.579e-02, 2.187e-02, -1.296e-02, 4.373e-03, 2.246e-02, -1.385e-02, 3.281e-02, -2.399e-02, -1.604e-02, -2.746e-02, -5.847e-02)); + r += mul(s4_3, M4(1.420e-02, -9.644e-02, 8.939e-02, -6.151e-02, 3.273e-02, 7.034e-02, 1.963e-02, 4.333e-02, 7.394e-02, -1.392e-01, -8.823e-02, -1.900e-02, 2.113e-02, -5.623e-03, -3.419e-02, 2.875e-02)); + r += mul(s4_4, M4(1.148e-02, -1.850e-02, 3.121e-02, 7.214e-02, 1.078e-02, 9.795e-02, 1.532e-01, -6.949e-03, -2.142e-01, -9.572e-02, 1.877e-01, -1.601e-01, -2.678e-02, 8.389e-02, -8.181e-02, -1.043e-01)); + r += mul(s4_5, M4(-5.404e-02, 2.965e-02, 1.950e-02, -5.925e-02, 5.095e-02, 3.441e-02, 1.074e-01, -5.415e-02, 1.158e-01, 2.059e-02, 1.930e-02, 3.106e-02, 4.156e-02, -1.818e-02, 2.495e-02, -4.216e-02)); + r += mul(s4_6, M4(-5.912e-03, -2.800e-02, 2.312e-02, -3.870e-03, 8.954e-03, -1.878e-02, 4.475e-03, -3.050e-05, 4.467e-02, 4.924e-02, 2.961e-02, 3.709e-02, 3.406e-02, 3.756e-02, 4.557e-03, 1.972e-02)); + r += mul(s4_7, M4(-4.816e-03, 6.425e-02, -6.616e-02, -2.269e-02, -1.666e-02, -1.313e-02, -3.477e-02, -4.396e-03, -9.325e-02, -1.418e-02, -6.576e-02, -1.131e-01, -1.779e-03, 1.724e-02, 1.067e-01, -1.243e-02)); + r += mul(s4_8, M4(-1.228e-02, -7.142e-03, 1.009e-01, -4.010e-02, 2.561e-02, -2.763e-02, -1.154e-02, 4.042e-02, 8.868e-02, -7.952e-02, 3.336e-02, 2.707e-02, -2.938e-02, 2.756e-02, 3.208e-02, 4.626e-02)); + r += mul(s5_0, M4(-9.159e-02, 6.431e-02, -1.213e-02, -7.887e-02, -3.602e-02, 1.221e-01, -9.357e-02, 3.184e-02, 1.606e-02, -3.790e-02, -5.347e-02, 9.859e-03, -2.165e-02, 6.015e-02, 4.728e-03, 1.987e-02)); + r += mul(s5_1, M4(-7.130e-02, -7.513e-02, 1.332e-01, -2.038e-01, -2.621e-01, 1.490e-01, 9.949e-02, -1.379e-01, -3.441e-02, 7.215e-02, 8.020e-02, -2.985e-02, -1.117e-02, 2.100e-02, 2.912e-02, 9.687e-03)); + r += mul(s5_2, M4(-5.556e-02, -2.980e-02, 5.666e-02, -9.088e-02, 5.883e-02, -5.671e-02, 1.815e-02, 1.004e-02, 1.114e-04, 2.225e-03, 1.452e-02, -2.179e-02, 2.119e-02, -3.922e-02, 1.355e-01, -8.419e-02)); + r += mul(s5_3, M4(-8.849e-03, -2.438e-01, -3.316e-02, -1.082e-01, 1.853e-02, 1.050e-01, 2.802e-02, 6.987e-02, 1.900e-02, -9.460e-02, -4.280e-02, -7.711e-02, 1.582e-02, -1.505e-02, -4.113e-02, 7.351e-05)); + r += mul(s5_4, M4(-8.418e-02, 1.956e-01, -1.095e-01, 1.026e-01, 1.909e-01, -1.499e-01, 4.226e-01, -1.755e-01, 2.404e-02, -4.169e-02, 3.206e-02, 6.999e-02, -1.089e-02, 2.476e-01, -7.327e-02, 2.165e-01)); + r += mul(s5_5, M4(5.984e-02, -6.277e-02, 3.448e-02, -4.323e-02, -1.380e-02, -1.972e-02, 6.379e-02, 8.212e-03, 9.482e-02, -1.313e-02, 8.471e-02, -1.677e-02, 5.325e-01, -1.756e-01, 3.271e-01, -1.751e-01)); + r += mul(s5_6, M4(-6.568e-02, -1.029e-01, 5.247e-02, -1.028e-01, -1.212e-02, 2.766e-02, 1.504e-02, -1.584e-02, 1.014e-02, -3.362e-02, 4.607e-02, -1.774e-02, 1.367e-02, 5.357e-02, 1.847e-02, 7.664e-03)); + r += mul(s5_7, M4(2.299e-02, 9.632e-02, -1.358e-02, -1.970e-02, -5.210e-02, 1.483e-01, 1.090e-01, 6.136e-04, 3.251e-02, -1.370e-01, -8.047e-02, 9.135e-03, -2.789e-02, -5.084e-02, -8.085e-03, -1.059e-01)); + r += mul(s5_8, M4(-3.400e-02, -7.040e-03, 3.179e-02, -7.687e-02, 2.856e-02, -4.108e-02, -1.130e-01, 1.423e-02, -4.021e-02, 5.519e-03, 3.914e-03, 4.571e-02, 6.344e-02, -3.582e-02, 1.021e-01, 1.509e-02)); + r += mul(s6_0, M4(1.058e-01, -7.012e-02, -5.282e-03, 1.225e-01, -2.563e-02, 3.260e-02, 2.460e-02, 1.274e-02, 4.838e-02, -1.180e-01, -3.756e-02, 1.926e-02, 2.041e-02, -1.110e-02, -1.384e-03, 6.233e-03)); + r += mul(s6_1, M4(-3.115e-02, 7.858e-03, -7.703e-02, -6.222e-02, 3.918e-02, -5.431e-02, 3.723e-03, 3.550e-02, 1.788e-01, 7.275e-02, -2.121e-02, 8.663e-02, 1.253e-02, -5.224e-02, -1.388e-02, -1.968e-02)); + r += mul(s6_2, M4(7.874e-02, -6.188e-02, -9.159e-02, 1.215e-01, -2.795e-02, 2.348e-02, 1.755e-02, -5.391e-03, -1.187e-01, 3.654e-02, -3.447e-02, -3.986e-02, -9.454e-04, 3.849e-02, 3.628e-02, 4.309e-02)); + r += mul(s6_3, M4(-1.932e-02, 1.476e-01, -7.003e-02, 3.489e-02, 1.989e-02, -6.807e-02, -6.319e-02, -1.538e-02, -2.931e-02, 6.941e-02, 8.206e-03, 8.153e-02, 1.229e-02, -4.671e-02, -3.886e-02, 1.106e-03)); + r += mul(s6_4, M4(9.417e-02, -2.394e-01, 1.957e-01, 5.788e-02, -2.446e-02, 8.874e-03, 5.894e-02, 4.274e-02, 1.005e-01, -1.371e-01, -1.676e-01, -3.986e-02, -1.481e-01, 1.306e-02, 2.543e-02, -1.523e-01)); + r += mul(s6_5, M4(6.421e-02, 3.377e-02, -7.346e-02, -5.284e-03, 2.185e-02, 6.796e-03, 4.730e-02, -3.318e-02, 5.095e-03, 1.153e-01, 7.242e-02, 1.921e-02, 1.145e-01, -5.113e-02, 1.402e-04, 8.227e-02)); + r += mul(s6_6, M4(2.136e-02, -5.919e-02, -6.817e-02, 5.806e-02, 2.670e-02, -4.493e-03, -4.624e-03, 2.248e-02, 1.443e-02, -2.058e-02, -5.921e-03, 2.605e-02, 8.326e-03, -9.662e-02, -5.167e-02, -2.557e-02)); + r += mul(s6_7, M4(4.999e-02, -1.434e-01, -1.646e-01, 4.182e-02, -6.911e-02, -4.970e-02, -6.567e-02, -4.646e-03, 2.940e-02, 8.285e-02, 3.201e-02, 1.668e-02, -3.641e-02, 3.822e-02, 6.107e-03, 8.802e-02)); + r += mul(s6_8, M4(7.182e-02, 3.517e-02, -4.517e-02, 4.548e-02, 5.198e-02, -4.318e-03, 2.819e-02, -8.629e-03, 3.274e-04, -5.217e-03, 2.982e-02, -2.487e-02, -9.713e-03, -2.504e-02, -1.976e-02, 1.010e-02)); + r += mul(s7_0, M4(-1.477e-03, 1.436e-02, -5.882e-03, 2.125e-02, -6.409e-02, -2.897e-03, -9.065e-03, -2.558e-02, 1.167e-02, -5.244e-02, -7.526e-02, 2.297e-02, 1.680e-02, -1.422e-02, 8.842e-03, 2.474e-02)); + r += mul(s7_1, M4(2.233e-03, 2.633e-02, -2.334e-02, -3.533e-02, 8.916e-02, -1.052e-01, -4.954e-02, 7.028e-02, 4.928e-02, 1.115e-01, 8.849e-02, 7.943e-02, -3.440e-02, 4.251e-02, -2.732e-02, -2.890e-02)); + r += mul(s7_2, M4(8.775e-03, -2.610e-02, 2.123e-02, -3.954e-03, -7.393e-02, 6.974e-02, 2.462e-02, -6.027e-02, 1.582e-02, -1.214e-02, -2.985e-02, -4.174e-03, -1.580e-02, 8.317e-03, 9.589e-03, 2.570e-02)); + r += mul(s7_3, M4(5.606e-03, -1.468e-02, 1.723e-02, -4.016e-02, 1.854e-01, -3.051e-01, -3.555e-02, -7.989e-02, -8.124e-03, -1.631e-02, -3.592e-02, 2.174e-02, -2.360e-02, -8.126e-02, -5.451e-02, -6.362e-02)); + r += mul(s7_4, M4(-5.537e-02, 1.314e-02, 8.755e-02, -9.445e-03, -3.013e-01, -1.111e-01, -8.096e-02, 2.060e-01, -9.947e-02, 1.158e-02, 3.951e-02, -2.653e-02, -4.153e-01, 2.589e-01, -6.686e-01, -5.985e-02)); + r += mul(s7_5, M4(1.822e-02, 2.026e-02, -3.674e-02, 1.442e-02, 1.939e-01, -1.377e-03, 1.205e-01, -6.445e-02, 7.434e-02, 3.865e-03, 2.157e-02, -5.609e-02, -6.769e-02, -3.530e-02, 5.183e-02, 2.761e-02)); + r += mul(s7_6, M4(3.779e-02, 7.490e-03, -6.374e-03, 2.683e-02, 2.187e-02, 6.518e-02, 3.773e-02, 2.820e-02, -1.138e-02, -9.686e-03, 7.643e-03, -9.547e-03, -1.200e-02, 7.512e-02, -1.624e-03, 2.857e-02)); + r += mul(s7_7, M4(-7.202e-02, 4.839e-03, -6.140e-02, -1.012e-03, -1.585e-02, -2.412e-02, -1.058e-01, -2.273e-02, 2.286e-02, -6.744e-02, -5.347e-02, -2.545e-02, 8.405e-02, -5.129e-02, -5.990e-02, -2.139e-02)); + r += mul(s7_8, M4(2.350e-02, 1.945e-03, 1.996e-02, 3.091e-03, -6.660e-03, -6.128e-03, 3.594e-02, -5.780e-02, -2.585e-02, 1.893e-02, 6.346e-02, -4.523e-02, -7.251e-02, -1.237e-02, 1.889e-02, 3.806e-02)); + r += V4(-1.997e-03, -1.078e-03, -3.096e-04, -3.145e-03); + return r; +} + +V4 f1(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(1.202e-02, -5.206e-02, -1.313e-02, -1.772e-02, 2.042e-02, -1.495e-02, 2.553e-02, -4.534e-02, 4.631e-02, 3.608e-02, -2.366e-02, -1.733e-02, 1.333e-02, -7.776e-02, -5.467e-02, -2.504e-02)); + r += mul(s0_1, M4(2.778e-03, -4.640e-02, -4.725e-02, 4.790e-02, 1.138e-02, 4.644e-02, -3.479e-02, -1.653e-01, 2.812e-02, -2.482e-02, 2.254e-02, -6.457e-02, 8.879e-03, 5.711e-02, 3.155e-02, -1.638e-01)); + r += mul(s0_2, M4(4.528e-02, -2.807e-02, -5.630e-02, -3.859e-02, -5.916e-02, 2.698e-02, 7.203e-02, -6.372e-02, -1.076e-02, -2.437e-02, 3.047e-02, -4.819e-02, 1.503e-04, -2.093e-02, -1.619e-03, -7.104e-02)); + r += mul(s0_3, M4(-1.326e-01, -1.443e-01, 2.782e-02, 2.616e-02, 5.204e-02, 2.389e-02, -8.061e-03, 3.848e-02, 1.095e-01, -4.839e-03, -3.616e-02, 1.281e-02, 4.160e-02, 6.821e-02, -6.438e-02, -8.374e-02)); + r += mul(s0_4, M4(-3.540e-01, -1.772e-02, -7.275e-02, 1.626e-02, 7.496e-02, 4.160e-02, -3.751e-03, -1.767e-02, 2.694e-02, -3.734e-02, -1.266e-01, 1.995e-02, -4.675e-02, -4.186e-02, 1.885e-01, 3.583e-02)); + r += mul(s0_5, M4(-5.912e-02, 2.717e-02, -1.152e-01, -2.959e-02, 6.588e-02, 5.299e-02, 1.552e-01, 2.535e-03, 5.990e-02, -2.895e-02, -2.847e-03, 6.045e-02, 2.351e-02, 2.236e-02, -6.715e-02, 9.303e-03)); + r += mul(s0_6, M4(4.031e-02, -2.244e-03, -1.873e-02, -2.074e-02, -1.312e-02, -1.007e-02, 2.915e-02, -1.229e-02, -3.107e-02, 2.602e-03, -3.643e-02, 3.225e-03, 4.314e-02, 4.228e-02, -6.631e-02, 3.520e-02)); + r += mul(s0_7, M4(-1.581e-01, -1.810e-01, 7.088e-02, 1.042e-02, 1.581e-01, 2.587e-02, -3.175e-03, 6.183e-02, 2.268e-02, -3.908e-02, -3.724e-02, 8.091e-03, 4.869e-02, 5.575e-03, 9.839e-02, 1.347e-03)); + r += mul(s0_8, M4(2.168e-02, 5.077e-02, 6.702e-03, -6.015e-03, 3.845e-02, -3.942e-02, 2.236e-02, 5.486e-03, -6.448e-03, -2.784e-02, 2.199e-02, -2.274e-02, 1.640e-02, 2.604e-02, 7.827e-04, -3.243e-03)); + r += mul(s1_0, M4(-1.666e-02, -4.525e-02, -4.417e-03, 6.513e-03, -5.906e-03, -4.944e-02, 3.514e-04, -1.025e-01, 2.019e-02, -3.469e-02, -1.699e-02, 3.441e-02, 4.242e-02, -3.344e-02, -7.866e-02, 1.878e-01)); + r += mul(s1_1, M4(2.426e-02, 2.344e-03, -4.044e-02, 2.125e-02, 8.551e-02, -3.998e-02, -5.706e-02, -2.259e-01, 2.623e-02, 6.970e-02, 2.346e-02, 1.463e-02, 3.045e-02, 2.641e-03, 7.730e-02, -4.346e-02)); + r += mul(s1_2, M4(1.810e-02, 8.911e-03, -2.008e-02, -6.464e-02, -2.773e-02, -2.173e-02, 4.828e-02, -7.345e-02, 1.638e-02, -8.087e-02, 8.820e-03, 2.566e-02, -1.187e-02, -4.421e-03, -5.535e-03, -3.896e-02)); + r += mul(s1_3, M4(3.406e-02, -1.770e-03, -1.062e-02, -3.381e-02, -1.629e-02, 2.031e-02, 1.762e-02, 4.063e-02, -3.554e-02, 1.917e-01, -9.696e-03, -8.665e-04, 7.837e-02, 2.752e-01, -2.005e-01, -8.668e-02)); + r += mul(s1_4, M4(-4.266e-02, 6.996e-02, 6.613e-02, -1.204e-02, 3.922e-03, 9.455e-02, -2.608e-01, 5.084e-02, -8.956e-02, 3.111e-02, -1.812e-02, -6.210e-02, -8.112e-02, 6.008e-02, 1.211e-01, -2.499e-02)); + r += mul(s1_5, M4(-3.288e-02, 1.581e-02, -4.622e-02, -4.464e-03, 6.258e-02, 7.641e-02, 1.685e-01, -2.340e-02, 2.054e-02, -1.410e-02, -4.083e-02, 5.616e-03, 5.094e-02, 2.548e-02, -6.280e-02, -8.699e-03)); + r += mul(s1_6, M4(4.355e-02, -4.089e-02, -7.083e-03, 2.218e-02, 8.966e-03, -3.881e-03, 4.896e-02, 2.680e-03, 2.440e-02, 3.871e-02, -1.186e-02, -1.416e-02, 3.558e-02, 1.948e-01, -6.474e-02, 7.606e-03)); + r += mul(s1_7, M4(3.047e-02, 2.547e-02, -6.296e-03, -1.136e-02, -5.031e-02, -5.999e-02, 4.286e-02, 4.152e-02, 1.145e-02, 2.706e-02, -1.632e-02, -3.617e-03, 4.819e-02, -2.707e-02, 1.276e-01, 3.283e-02)); + r += mul(s1_8, M4(6.520e-02, 4.851e-02, -8.113e-03, 1.440e-02, 4.084e-02, 4.061e-02, 2.539e-02, -1.643e-02, -7.473e-03, -1.430e-02, -5.003e-04, -3.345e-02, 5.729e-02, 1.718e-02, 1.987e-03, 3.236e-03)); + r += mul(s2_0, M4(-6.699e-03, -2.586e-02, 5.295e-03, 3.528e-02, -6.310e-03, -7.413e-02, 1.474e-02, 3.928e-02, 1.458e-02, 1.269e-02, 1.055e-02, -1.259e-01, 5.331e-02, -6.769e-02, -3.363e-02, -4.863e-02)); + r += mul(s2_1, M4(-3.673e-02, 1.092e-02, -1.691e-02, -4.693e-02, 4.304e-05, -2.996e-03, -7.283e-03, 5.531e-02, 7.316e-04, -6.074e-04, -6.141e-02, -5.570e-02, 7.371e-02, -2.323e-02, -4.505e-02, 3.014e-02)); + r += mul(s2_2, M4(-1.643e-03, -9.824e-03, 1.511e-02, -2.464e-02, 1.116e-02, 2.840e-02, -4.088e-02, -6.275e-02, 1.293e-02, 1.246e-02, 1.986e-02, -5.365e-02, -4.314e-02, -2.603e-02, -7.790e-02, 2.061e-03)); + r += mul(s2_3, M4(5.190e-02, -1.787e-01, 2.032e-02, 1.634e-02, 6.689e-03, 1.083e-01, -1.797e-02, 2.083e-02, -1.605e-02, 1.100e-04, -6.777e-02, 1.240e-01, -2.460e-02, 1.572e-01, 9.084e-02, -4.332e-02)); + r += mul(s2_4, M4(2.016e-01, 9.259e-02, 8.855e-02, 9.362e-02, 4.120e-02, 5.435e-02, -3.455e-02, -1.942e-01, 2.359e-02, 1.944e-02, -8.789e-02, 6.333e-02, -9.278e-02, -1.680e-02, -2.102e-01, 1.023e-02)); + r += mul(s2_5, M4(-1.789e-02, -5.531e-02, -1.321e-01, 2.582e-02, 4.118e-02, -1.022e-01, -5.847e-02, 5.383e-02, 4.017e-02, 5.977e-03, -9.539e-02, -4.341e-02, 3.636e-02, 2.195e-02, 9.371e-03, -3.872e-02)); + r += mul(s2_6, M4(-4.446e-02, 9.027e-03, -3.196e-02, 3.966e-03, 2.963e-03, -1.151e-01, 1.687e-03, 2.612e-02, 2.786e-01, -5.185e-02, -1.802e-01, -1.431e-01, -5.649e-02, -8.974e-02, 3.276e-02, 1.676e-03)); + r += mul(s2_7, M4(-7.750e-02, -3.620e-02, 1.018e-02, -1.904e-02, 5.416e-02, 3.335e-02, -1.312e-01, 6.845e-02, -5.062e-02, -2.519e-02, -2.546e-01, -3.405e-02, 9.969e-03, 2.791e-02, -2.363e-02, 4.162e-03)); + r += mul(s2_8, M4(2.480e-02, 6.180e-03, -5.884e-02, -6.062e-03, 1.768e-02, 1.448e-02, -3.561e-02, 1.611e-02, 8.485e-02, 7.662e-02, -4.287e-02, 5.595e-02, 4.231e-02, 4.136e-02, -1.284e-01, 2.549e-02)); + r += mul(s3_0, M4(-3.932e-03, 7.414e-03, 1.909e-02, 4.169e-03, 1.647e-02, -1.229e-02, -2.545e-02, 6.120e-03, -3.781e-02, 4.003e-02, -3.228e-03, 2.159e-02, -5.261e-02, 2.311e-02, -2.729e-02, 3.838e-02)); + r += mul(s3_1, M4(-7.097e-02, 3.959e-02, 1.671e-02, 1.431e-02, 6.091e-02, 4.520e-04, 3.667e-03, 3.791e-02, 2.410e-02, 3.634e-02, 2.145e-02, -9.994e-02, -1.372e-01, 4.290e-02, 1.226e-01, 1.016e-01)); + r += mul(s3_2, M4(2.725e-02, 1.776e-03, 3.241e-02, 3.211e-02, 3.056e-03, 8.507e-03, -1.008e-02, -4.513e-02, 2.783e-02, 2.291e-03, -5.210e-02, -2.966e-02, -5.094e-02, 4.124e-03, 6.788e-02, 6.846e-02)); + r += mul(s3_3, M4(5.710e-02, -8.337e-02, 3.944e-02, -1.798e-02, 5.437e-02, 1.179e-01, 1.762e-02, -4.683e-02, 2.977e-02, 4.506e-02, 2.724e-02, 6.091e-02, 1.104e-02, 2.352e-01, -2.861e-02, -1.725e-02)); + r += mul(s3_4, M4(2.343e-01, 6.819e-02, 4.281e-01, 1.513e-01, -7.984e-02, -4.274e-02, 7.711e-02, -9.257e-04, 5.407e-03, -8.743e-02, 5.039e-03, 8.324e-02, -2.269e-02, 1.410e-01, -1.995e-01, 2.319e-02)); + r += mul(s3_5, M4(8.306e-03, -5.039e-02, -5.041e-02, -1.082e-02, 1.194e-03, -9.653e-03, 8.765e-02, -1.638e-03, 4.377e-03, -2.279e-03, -1.560e-01, -2.593e-02, -5.295e-02, 5.573e-02, 1.626e-01, -1.273e-02)); + r += mul(s3_6, M4(-1.995e-01, 4.895e-02, 2.898e-02, -3.804e-02, -3.671e-02, 3.441e-02, 5.273e-02, -3.421e-03, -7.544e-02, 1.140e-01, 8.635e-03, 4.871e-02, -4.460e-02, 4.741e-03, 8.239e-02, -1.949e-03)); + r += mul(s3_7, M4(-2.320e-01, -4.818e-02, -1.578e-02, 1.857e-02, 3.682e-02, 4.703e-02, 3.702e-02, 2.967e-02, -4.824e-02, 6.226e-02, -6.276e-02, 1.757e-02, -3.064e-02, -1.469e-02, 7.422e-03, 2.195e-02)); + r += mul(s3_8, M4(-2.482e-02, -9.439e-03, 4.244e-03, 1.053e-02, 7.969e-03, 1.956e-02, -2.825e-02, 9.694e-03, 1.038e-02, 3.184e-02, -6.863e-02, 1.815e-03, -6.007e-03, 5.574e-02, -3.238e-02, 1.116e-02)); + r += mul(s4_0, M4(1.183e-02, -3.921e-02, -1.393e-02, 1.735e-02, -1.585e-03, 1.983e-02, -2.314e-02, -6.488e-03, 4.871e-02, -5.115e-02, 1.302e-02, 5.821e-02, -1.611e-02, -2.594e-02, 2.390e-02, -3.653e-03)); + r += mul(s4_1, M4(3.723e-02, 4.528e-04, -8.784e-02, -7.429e-02, 1.899e-02, -2.095e-03, 7.305e-02, -8.574e-02, 4.873e-02, -2.074e-02, -4.965e-02, -2.479e-02, -1.387e-02, 1.443e-02, -3.904e-02, -2.719e-03)); + r += mul(s4_2, M4(2.351e-02, -1.994e-02, -7.496e-02, -7.192e-02, 2.219e-02, -4.016e-02, 1.939e-02, 4.346e-03, 4.140e-02, 9.277e-04, -2.265e-02, -3.892e-02, -8.554e-03, -2.833e-02, 4.008e-02, 4.629e-02)); + r += mul(s4_3, M4(1.208e-01, -3.823e-02, -3.269e-02, -1.286e-03, 4.417e-03, -4.882e-02, 4.111e-02, 4.979e-03, -6.309e-02, -2.078e-02, 3.575e-03, -2.735e-02, -2.922e-02, -1.231e-02, 2.696e-02, -9.421e-03)); + r += mul(s4_4, M4(2.303e-02, -2.025e-02, -2.137e-03, -4.277e-02, 9.204e-02, -9.333e-02, 1.704e-02, 6.432e-02, -1.993e-01, 7.357e-02, -1.341e-01, 1.839e-01, -5.953e-02, -7.500e-02, -7.122e-02, 2.273e-02)); + r += mul(s4_5, M4(5.218e-02, -3.047e-02, -2.291e-01, -1.955e-03, -1.840e-02, 1.907e-02, -1.891e-01, 1.745e-02, 6.113e-03, -1.898e-02, -2.142e-03, -1.337e-02, 9.104e-03, -4.063e-02, 2.113e-01, -2.814e-04)); + r += mul(s4_6, M4(-1.083e-02, -1.247e-03, 8.832e-03, 2.131e-03, 1.051e-02, 5.914e-02, -3.088e-04, -1.683e-02, -8.502e-02, 2.476e-02, 2.931e-02, 1.084e-02, 9.516e-03, 1.040e-02, 1.929e-02, -8.289e-03)); + r += mul(s4_7, M4(5.415e-03, -2.825e-02, -3.766e-03, -2.316e-02, -4.971e-02, 5.587e-02, -4.335e-03, -2.868e-02, -3.055e-01, -4.066e-01, -4.920e-02, 2.395e-02, 1.180e-02, -8.303e-02, -9.242e-02, 3.838e-03)); + r += mul(s4_8, M4(2.608e-02, -3.677e-03, -6.193e-02, -2.307e-02, -1.527e-03, 1.554e-02, 2.510e-02, 1.332e-02, -4.938e-02, 9.703e-02, 6.559e-02, 7.017e-03, -1.648e-02, 1.028e-02, 3.660e-02, 1.336e-02)); + r += mul(s5_0, M4(2.651e-02, 2.183e-02, 2.040e-02, -2.505e-02, -2.446e-03, -1.051e-01, 3.534e-02, -9.687e-03, 3.315e-03, -2.465e-02, 3.093e-03, 4.203e-03, 2.357e-03, -1.258e-03, -5.855e-03, 4.044e-02)); + r += mul(s5_1, M4(3.443e-02, 2.962e-03, -4.624e-02, -1.007e-01, -8.151e-02, 6.946e-02, -9.300e-02, 5.324e-02, -2.258e-02, -2.535e-02, -4.632e-02, -6.499e-03, 5.106e-02, -4.213e-02, 2.573e-02, 1.418e-02)); + r += mul(s5_2, M4(8.939e-03, -1.427e-02, -1.178e-01, 2.562e-02, 4.116e-02, 2.258e-02, -3.821e-02, 1.074e-02, 3.980e-03, -1.391e-02, 1.545e-02, 2.426e-02, 2.410e-02, -4.835e-02, 3.651e-02, 8.455e-02)); + r += mul(s5_3, M4(7.596e-02, -2.409e-01, -1.144e-03, 6.046e-02, -2.197e-02, -2.105e-02, 4.999e-02, -1.540e-02, 5.708e-02, -4.963e-02, 1.332e-02, -1.245e-01, -1.575e-03, -4.965e-02, 1.620e-02, 2.225e-02)); + r += mul(s5_4, M4(1.679e-01, 1.666e-01, 1.548e-01, -1.212e-01, 1.830e-01, -1.489e-01, -4.146e-01, 7.725e-05, 2.168e-01, 6.509e-02, -6.296e-02, 7.612e-02, -1.388e-01, 2.861e-01, -3.157e-02, -3.745e-02)); + r += mul(s5_5, M4(7.487e-02, -2.872e-02, -5.950e-02, 5.356e-04, -7.855e-02, -7.150e-02, -2.891e-01, -4.871e-02, -9.485e-03, 1.422e-03, -6.204e-02, -8.279e-04, -3.348e-02, 1.801e-01, 3.021e-01, 1.198e-01)); + r += mul(s5_6, M4(-1.100e-01, -7.397e-02, -5.533e-02, 1.415e-02, 3.442e-02, -4.303e-02, 1.338e-03, 1.903e-03, 6.188e-03, 3.195e-02, 2.301e-02, 6.367e-03, -1.015e-02, -7.740e-03, 6.780e-03, -1.874e-02)); + r += mul(s5_7, M4(4.114e-02, 1.979e-02, -4.935e-02, 1.276e-04, -3.920e-02, -7.128e-02, -5.296e-02, 2.289e-02, -2.920e-02, 5.082e-02, -1.198e-02, -7.483e-02, 3.892e-02, -1.013e-01, -2.029e-02, 2.929e-02)); + r += mul(s5_8, M4(-6.149e-03, -1.169e-01, 1.167e-02, -1.381e-03, 5.609e-03, 3.120e-02, 4.072e-03, 1.250e-02, 1.698e-02, 3.357e-02, 1.476e-02, -3.236e-02, -1.193e-01, -9.789e-03, 1.314e-01, -2.507e-02)); + r += mul(s6_0, M4(-5.521e-02, 1.141e-01, 1.397e-02, 5.606e-02, -1.255e-02, 7.418e-03, -1.474e-02, 5.248e-02, -1.691e-03, 1.189e-01, -1.471e-02, 1.164e-02, -2.696e-02, -2.463e-02, 1.766e-02, 1.483e-02)); + r += mul(s6_1, M4(-7.491e-02, 6.301e-02, 1.107e-01, -8.152e-02, 2.512e-02, -3.004e-02, 4.235e-02, -7.317e-02, 9.981e-02, -1.609e-02, -6.883e-02, 2.647e-01, 1.224e-02, 3.268e-02, -6.409e-03, -5.662e-02)); + r += mul(s6_2, M4(-6.863e-02, 2.457e-03, 1.028e-01, 6.772e-02, -4.231e-03, -1.520e-02, -6.802e-02, 5.775e-03, 1.304e-02, -6.472e-02, 1.805e-02, 3.022e-02, 2.355e-02, 1.757e-02, -2.309e-02, -1.274e-01)); + r += mul(s6_3, M4(-1.865e-03, 1.707e-02, 5.189e-02, 1.018e-01, 6.379e-02, 4.276e-03, 2.532e-02, -5.459e-03, -1.039e-01, 1.345e-01, -2.931e-02, -2.603e-02, 1.687e-02, 9.416e-02, 3.137e-02, -6.282e-02)); + r += mul(s6_4, M4(2.264e-01, 2.890e-01, 1.939e-01, 6.100e-02, -7.269e-02, -4.193e-02, -6.819e-02, -2.447e-02, -1.979e-01, 3.552e-01, -1.022e-02, -8.885e-02, -5.533e-02, 2.902e-02, -1.629e-01, -7.129e-02)); + r += mul(s6_5, M4(-9.438e-02, -6.314e-02, -1.384e-01, 5.079e-02, 2.769e-02, 2.104e-02, -7.026e-02, 9.677e-03, -5.322e-02, -2.693e-02, -1.211e-03, -2.267e-02, 2.969e-02, 2.716e-02, -2.244e-02, 9.032e-03)); + r += mul(s6_6, M4(-1.249e-01, 1.369e-01, 1.281e-03, -3.176e-02, 1.988e-02, 1.462e-02, 1.571e-02, 4.847e-03, -1.322e-02, -1.532e-02, 3.146e-02, -6.801e-03, 9.289e-02, -6.906e-02, 2.312e-02, 2.619e-02)); + r += mul(s6_7, M4(-2.206e-01, -9.270e-03, 1.605e-01, 5.277e-02, 2.533e-02, -7.370e-03, -1.740e-02, 9.123e-04, 4.191e-02, 3.426e-02, -6.864e-02, -1.019e-03, 1.386e-01, 1.430e-01, 1.063e-02, -2.014e-02)); + r += mul(s6_8, M4(-3.436e-02, 1.079e-01, 6.215e-02, -1.613e-02, -3.978e-02, 2.359e-03, -5.127e-03, 8.879e-03, 3.608e-02, 2.312e-02, -3.583e-02, -9.984e-03, 7.083e-02, 1.000e-02, -6.521e-02, -3.528e-02)); + r += mul(s7_0, M4(5.631e-03, -1.099e-02, 2.470e-02, -1.599e-02, 4.649e-02, 1.875e-02, -9.796e-03, -1.112e-01, 1.249e-02, 2.323e-02, 8.349e-03, -1.331e-02, -2.411e-02, -7.650e-03, 3.156e-02, 8.621e-03)); + r += mul(s7_1, M4(-7.994e-03, -1.512e-03, 1.167e-04, 2.619e-02, 8.130e-02, -4.266e-03, 4.462e-02, -3.094e-01, -1.353e-01, 1.170e-01, -3.701e-02, -1.291e-01, 1.761e-03, 6.650e-05, -5.571e-03, 9.789e-02)); + r += mul(s7_2, M4(8.690e-03, 5.748e-04, 4.321e-03, -1.498e-02, -2.104e-03, -3.877e-02, -6.958e-02, -7.560e-02, 1.514e-02, -3.306e-03, 4.355e-02, -5.623e-02, 1.281e-03, 2.728e-02, -1.032e-02, -5.736e-02)); + r += mul(s7_3, M4(1.114e-02, 2.890e-02, 2.115e-02, -3.360e-02, 2.141e-02, 2.168e-02, -1.822e-02, -3.781e-02, -1.509e-02, -3.306e-02, -2.132e-02, 9.044e-02, -2.197e-02, 2.614e-03, -9.609e-03, 7.045e-02)); + r += mul(s7_4, M4(-1.577e-02, -6.364e-02, -1.450e-01, -2.065e-04, -2.633e-01, -1.561e-01, -6.868e-02, -1.999e-02, -1.703e-02, 2.350e-02, -1.037e-01, 6.314e-02, 1.968e-01, -2.012e-01, -1.368e-01, 4.188e-01)); + r += mul(s7_5, M4(-1.454e-02, 4.459e-02, 5.748e-02, -2.923e-02, -1.995e-02, 6.323e-02, 4.365e-03, 1.299e-01, 3.510e-02, -1.645e-01, -4.284e-02, 7.069e-02, -3.466e-03, 1.841e-02, -5.013e-03, -5.554e-02)); + r += mul(s7_6, M4(5.101e-03, -2.166e-02, 2.334e-02, 2.765e-02, 2.607e-02, 1.243e-01, -2.958e-02, -2.111e-03, -5.475e-04, 1.362e-03, -2.305e-02, -3.104e-02, 8.770e-03, -2.155e-04, 1.348e-03, 1.383e-03)); + r += mul(s7_7, M4(6.813e-02, 3.550e-03, -2.008e-02, -6.561e-03, -5.394e-02, -1.180e-01, 6.716e-02, -2.584e-03, -8.732e-02, 1.699e-02, -2.186e-02, -1.698e-02, 1.753e-01, -3.906e-02, 3.391e-01, 2.130e-02)); + r += mul(s7_8, M4(-2.760e-03, -2.192e-02, 2.986e-02, 2.327e-02, 2.508e-02, 3.758e-02, -2.277e-02, -8.764e-03, 5.948e-02, 3.695e-02, -3.128e-02, -1.495e-02, 7.690e-02, 4.470e-02, 4.537e-02, 6.489e-03)); + r += V4(6.699e-04, -8.118e-04, -2.993e-03, -1.333e-03); + return r; +} + +V4 f2(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-8.061e-02, -3.221e-02, 3.068e-03, 3.472e-02, 4.412e-02, -1.193e-02, -8.794e-02, -3.656e-02, -1.386e-02, -2.252e-02, -4.376e-04, -5.507e-03, 5.252e-02, 1.102e-02, -1.491e-02, 7.509e-03)); + r += mul(s0_1, M4(2.060e-02, 1.551e-01, -1.293e-01, -2.524e-02, -4.112e-02, 2.800e-03, 5.090e-02, 2.449e-03, 1.466e-01, 2.774e-02, 4.342e-02, 1.754e-02, 2.758e-02, 4.681e-02, 1.196e-03, -2.348e-02)); + r += mul(s0_2, M4(-6.134e-02, -3.286e-02, -1.099e-02, 6.717e-02, -3.991e-02, -4.184e-02, 7.389e-02, 2.607e-02, 3.566e-02, 7.387e-04, -2.247e-02, 8.843e-03, 5.188e-02, 1.185e-02, -1.157e-02, 4.026e-02)); + r += mul(s0_3, M4(-6.452e-02, -8.306e-03, 4.224e-02, -1.468e-02, -1.446e-02, -2.163e-02, 4.541e-02, 7.892e-03, -5.107e-02, -4.796e-02, -3.330e-02, 4.337e-02, -7.062e-03, -7.219e-03, 3.193e-03, -2.538e-02)); + r += mul(s0_4, M4(7.595e-02, 1.609e-01, -2.564e-01, 8.810e-02, 1.163e-02, -8.844e-02, -2.578e-01, -5.648e-02, -2.456e-01, 2.254e-01, 1.372e-01, 8.619e-02, 1.230e-01, -2.682e-02, -1.530e-01, 5.659e-02)); + r += mul(s0_5, M4(-7.065e-02, -9.855e-03, 4.001e-02, 1.496e-02, 4.451e-02, 4.064e-04, 1.064e-01, -4.124e-02, -1.496e-02, -8.857e-02, -8.328e-02, 6.789e-02, -6.524e-04, 2.245e-03, -6.397e-03, 1.306e-02)); + r += mul(s0_6, M4(3.339e-03, 4.529e-02, -1.501e-02, 8.457e-02, -1.466e-02, 1.757e-02, 1.484e-02, -1.484e-02, 5.979e-02, 3.596e-02, -3.776e-02, -6.466e-02, -1.717e-02, -1.267e-02, 1.249e-02, 4.325e-02)); + r += mul(s0_7, M4(-9.548e-02, -2.117e-02, 1.458e-02, -1.303e-02, 6.065e-02, -4.683e-02, 4.435e-03, 1.593e-03, 7.541e-02, 3.867e-02, 8.515e-02, 6.758e-02, -2.376e-02, -1.054e-02, 4.306e-02, -7.642e-02)); + r += mul(s0_8, M4(-6.891e-02, 6.517e-02, 8.366e-02, -5.295e-02, 7.209e-03, 3.726e-02, -2.157e-02, 1.049e-01, 1.034e-02, 5.683e-02, -7.058e-02, 2.181e-02, 7.478e-03, -1.278e-02, -1.492e-02, -3.135e-02)); + r += mul(s1_0, M4(3.248e-03, 2.825e-02, 3.530e-02, 3.137e-03, 4.960e-02, -1.504e-02, -6.241e-02, 1.014e-02, 4.153e-02, -3.616e-02, 7.992e-02, 1.632e-03, -4.343e-02, -9.899e-02, -4.591e-02, 4.862e-03)); + r += mul(s1_1, M4(-8.626e-02, -6.787e-02, -4.015e-02, 1.020e-02, 8.740e-02, 7.088e-02, -2.460e-02, 1.434e-02, 1.836e-01, 3.922e-02, -2.350e-02, -5.132e-04, 3.726e-02, -8.695e-02, -5.849e-02, -1.450e-02)); + r += mul(s1_2, M4(-2.141e-02, -9.575e-02, -6.408e-02, 2.680e-03, -5.232e-02, -4.155e-02, 2.629e-02, 2.581e-02, 7.916e-02, -8.219e-02, -2.804e-02, 4.334e-03, 1.388e-02, 2.954e-02, 1.015e-02, 1.882e-02)); + r += mul(s1_3, M4(-4.166e-02, -4.172e-03, 5.090e-02, 3.572e-02, 5.285e-02, 8.259e-03, 2.529e-03, -2.082e-02, 6.636e-02, -2.586e-02, 4.243e-02, -1.078e-01, -3.849e-03, -1.010e-01, 1.536e-01, 6.421e-02)); + r += mul(s1_4, M4(-6.087e-02, 4.722e-02, 6.591e-02, 1.120e-02, 1.958e-01, -2.862e-02, -1.202e-01, -3.503e-03, 2.528e-02, -2.884e-03, 2.872e-01, 2.683e-01, 2.044e-02, -2.790e-01, -1.796e-01, 8.382e-02)); + r += mul(s1_5, M4(4.732e-02, -5.871e-02, -1.169e-01, -2.031e-02, 2.710e-03, -1.333e-01, 1.421e-01, 7.926e-02, 1.661e-02, -4.483e-02, -8.014e-02, -3.388e-04, 1.691e-02, -4.505e-02, 6.571e-02, -1.348e-02)); + r += mul(s1_6, M4(3.471e-02, 3.378e-02, -8.717e-02, 7.544e-02, -6.288e-02, 2.081e-02, 2.298e-02, -2.993e-03, 4.522e-03, -7.794e-03, -4.982e-03, -3.590e-02, -7.603e-02, -2.180e-02, 1.330e-01, -4.647e-02)); + r += mul(s1_7, M4(2.862e-02, -6.317e-02, -5.481e-02, -1.627e-01, 5.290e-02, 5.915e-04, 6.899e-02, 2.046e-01, 9.586e-02, -2.566e-02, -3.599e-02, 1.280e-01, -4.238e-02, -6.985e-02, 6.564e-02, -2.758e-02)); + r += mul(s1_8, M4(-1.938e-03, 1.242e-02, 3.918e-02, -3.277e-02, 1.170e-02, -1.706e-06, 8.554e-02, -1.090e-01, 2.830e-02, 3.105e-03, -3.886e-02, -6.436e-02, -1.203e-02, -2.878e-02, -5.267e-02, 1.945e-02)); + r += mul(s2_0, M4(5.528e-02, 9.739e-03, 2.004e-03, 3.160e-03, 4.355e-02, 1.221e-03, -8.703e-02, 2.689e-02, -1.351e-02, -1.205e-02, -3.093e-02, -1.370e-02, 7.025e-02, 9.179e-03, -9.626e-04, 6.785e-03)); + r += mul(s2_1, M4(-2.777e-02, -8.242e-03, -1.114e-02, -1.084e-03, -3.786e-02, -1.153e-01, 6.387e-02, 2.035e-02, 6.563e-02, -1.642e-02, -6.511e-02, -2.599e-02, 1.560e-02, 1.179e-01, -9.626e-02, -4.517e-02)); + r += mul(s2_2, M4(-9.169e-03, -2.774e-02, -4.434e-02, -3.142e-02, -2.064e-02, 4.408e-02, -2.709e-02, -4.789e-02, 1.567e-02, 7.772e-03, -2.729e-02, 8.944e-03, -4.433e-02, -6.372e-02, 8.256e-02, 4.168e-02)); + r += mul(s2_3, M4(3.159e-02, 7.792e-02, 4.675e-02, -2.718e-02, 6.998e-02, 7.288e-02, 1.208e-01, -1.726e-02, -1.381e-01, -3.946e-01, 9.947e-02, 4.269e-03, -4.221e-02, -7.491e-04, -1.230e-01, -4.242e-02)); + r += mul(s2_4, M4(2.414e-01, -6.188e-02, 6.128e-02, 1.082e-01, -3.194e-02, 2.273e-01, 6.298e-01, 1.135e-02, 1.151e-01, 2.199e-01, -1.289e-01, -6.079e-02, 4.429e-02, -9.703e-02, -4.727e-03, 3.353e-01)); + r += mul(s2_5, M4(1.498e-02, -4.472e-02, -6.941e-02, 1.081e-02, -9.958e-03, -8.749e-02, 8.206e-02, 9.772e-02, 1.517e-02, -1.153e-02, -1.528e-01, 4.725e-02, -1.250e-02, -4.491e-02, 2.843e-02, -1.356e-01)); + r += mul(s2_6, M4(4.861e-02, -2.473e-02, -2.656e-02, -2.268e-02, -5.055e-04, 4.137e-02, 6.287e-02, 1.033e-01, -2.895e-02, -2.813e-01, -9.524e-02, -9.396e-02, -6.787e-03, 2.429e-02, -6.387e-03, 2.739e-02)); + r += mul(s2_7, M4(7.428e-02, 2.142e-02, -4.112e-02, 1.135e-01, -5.415e-02, 2.890e-02, 3.036e-01, -1.455e-02, 1.582e-01, -3.256e-01, -3.263e-01, -3.641e-02, -2.871e-02, 6.356e-02, -9.071e-02, -1.593e-01)); + r += mul(s2_8, M4(8.001e-02, 2.992e-02, -2.762e-02, 3.298e-02, 3.404e-02, 2.531e-02, -1.675e-01, -3.540e-02, 8.403e-02, 1.865e-02, -6.212e-02, -3.236e-02, 2.719e-02, -2.761e-02, 1.600e-02, 6.571e-02)); + r += mul(s3_0, M4(3.398e-02, -4.895e-04, 1.614e-02, -2.467e-02, 5.071e-02, 6.983e-03, 2.970e-02, 9.543e-03, -9.451e-02, -3.030e-02, 1.116e-02, 9.318e-03, -4.048e-02, -5.480e-02, 1.110e-01, -7.784e-02)); + r += mul(s3_1, M4(-2.600e-02, 8.064e-03, 9.369e-02, 2.616e-02, 5.362e-02, 5.782e-02, -1.067e-01, 5.362e-03, 1.306e-02, -7.885e-03, -6.518e-02, 9.381e-03, 8.515e-02, -7.475e-02, -1.343e-01, -6.213e-02)); + r += mul(s3_2, M4(5.751e-03, 2.538e-02, 1.962e-02, -2.790e-02, -2.377e-02, -4.240e-02, 1.209e-02, 1.314e-02, 2.025e-02, 7.784e-03, -1.837e-02, 5.976e-03, -5.516e-02, -9.428e-02, 1.268e-01, 2.969e-02)); + r += mul(s3_3, M4(-8.950e-02, -8.800e-03, 1.640e-01, 2.897e-03, -3.997e-02, -3.237e-02, 5.528e-02, -6.530e-04, -1.817e-02, -3.339e-02, 9.188e-03, -2.534e-02, -1.597e-01, -8.423e-02, 2.096e-01, -2.920e-02)); + r += mul(s3_4, M4(-1.813e-01, -3.936e-01, 2.434e-01, 6.759e-02, -2.571e-04, -1.128e-01, 7.820e-02, 4.335e-02, 8.014e-02, -5.647e-02, -1.626e-01, -6.703e-02, -1.845e-01, 2.022e-03, -4.692e-01, 3.637e-01)); + r += mul(s3_5, M4(-6.688e-02, -1.025e-01, -5.000e-03, 3.304e-02, 1.616e-02, -1.465e-02, 3.482e-02, -3.793e-02, 3.067e-03, 2.227e-02, -1.094e-01, -4.482e-02, -8.340e-02, -1.492e-01, 1.591e-01, -1.313e-01)); + r += mul(s3_6, M4(3.724e-02, -5.114e-02, -5.431e-02, -1.917e-01, -9.272e-03, 1.720e-02, -1.993e-03, -2.050e-02, -5.101e-02, -2.640e-02, 1.151e-01, -9.473e-02, -2.140e-02, -1.962e-02, 8.209e-02, 9.717e-03)); + r += mul(s3_7, M4(1.382e-01, 1.193e-01, 1.643e-01, -2.855e-03, -2.987e-02, 2.089e-02, 3.535e-02, -6.606e-02, 1.455e-01, -6.018e-02, -8.022e-02, -6.451e-02, -4.068e-02, 1.163e-02, 2.179e-02, -1.519e-01)); + r += mul(s3_8, M4(1.612e-02, 1.713e-02, -2.903e-02, -4.417e-02, -2.605e-03, 1.627e-02, 7.745e-03, -3.383e-02, 3.019e-02, 4.177e-02, -6.136e-02, 1.523e-02, -1.122e-02, -1.083e-02, 7.795e-03, -1.774e-02)); + r += mul(s4_0, M4(8.440e-02, 3.624e-02, -1.217e-01, 2.625e-02, -3.526e-02, 7.012e-04, 1.416e-02, -2.009e-02, -5.261e-03, -3.329e-02, -6.662e-02, 4.990e-03, 6.008e-03, 2.910e-02, 2.946e-03, -5.679e-03)); + r += mul(s4_1, M4(5.815e-02, 3.498e-02, -1.135e-01, 3.051e-02, 2.724e-02, 1.011e-02, -2.088e-02, -5.432e-02, 7.455e-02, 6.235e-02, 1.335e-02, 1.592e-02, 2.837e-02, 5.222e-02, 1.051e-01, -1.813e-02)); + r += mul(s4_2, M4(-1.242e-02, -2.914e-02, -5.577e-02, 1.029e-02, 8.890e-02, 3.141e-02, -1.405e-01, -1.767e-02, 4.576e-02, -1.134e-03, -1.963e-02, 2.131e-02, 1.237e-03, -2.035e-03, 2.491e-02, 1.586e-02)); + r += mul(s4_3, M4(2.664e-02, 2.865e-02, 3.135e-02, 7.597e-02, 3.308e-03, -2.546e-02, 1.542e-02, -1.449e-02, -5.470e-02, 4.758e-02, -4.097e-02, -2.444e-02, -2.671e-02, -5.544e-03, -1.826e-02, -2.656e-02)); + r += mul(s4_4, M4(7.071e-02, 4.333e-02, -1.212e-01, 2.524e-02, 8.774e-02, 3.782e-02, -3.828e-02, 1.047e-02, 3.099e-01, -2.004e-02, -1.837e-02, 7.248e-02, 4.387e-02, -2.911e-02, -1.842e-01, 5.597e-02)); + r += mul(s4_5, M4(8.675e-02, 5.429e-02, -5.555e-02, 3.116e-02, -6.069e-02, 4.293e-02, -6.205e-02, 1.071e-02, 4.696e-03, 1.079e-02, -3.297e-02, 8.385e-02, 3.056e-02, 3.710e-02, -6.256e-02, -3.502e-02)); + r += mul(s4_6, M4(4.186e-02, 2.620e-02, -3.803e-02, -6.781e-03, 2.082e-02, -7.440e-03, -5.115e-02, -4.232e-02, -8.180e-02, -5.506e-02, 1.055e-02, 2.653e-02, -3.003e-02, -2.209e-02, -2.385e-02, -1.866e-02)); + r += mul(s4_7, M4(3.895e-02, -4.673e-02, -1.101e-01, 5.077e-02, 1.139e-02, 1.015e-02, -1.229e-01, -6.620e-04, -2.862e-02, -3.238e-02, -2.642e-01, 2.743e-01, -5.964e-02, 9.554e-03, 1.107e-01, -7.634e-03)); + r += mul(s4_8, M4(9.934e-03, 2.443e-02, -5.030e-02, 4.130e-03, -4.526e-02, -3.115e-02, 2.712e-02, -8.973e-03, -7.820e-02, 1.154e-01, 1.035e-01, -1.474e-01, -6.242e-02, 4.415e-02, 2.875e-02, 8.636e-02)); + r += mul(s5_0, M4(-4.351e-03, 4.779e-02, -6.555e-02, 4.382e-02, 2.463e-02, 2.040e-02, -5.210e-02, 1.533e-02, 1.934e-02, 7.709e-03, -8.085e-03, 1.167e-03, -4.305e-03, 1.138e-02, 5.643e-02, 5.774e-03)); + r += mul(s5_1, M4(-5.602e-02, 1.029e-01, 1.462e-02, 1.601e-02, -1.568e-01, -4.966e-02, -7.733e-02, -4.236e-02, 9.258e-03, 7.679e-03, 7.429e-02, 2.600e-02, 4.029e-03, 2.422e-02, 5.462e-02, -2.416e-02)); + r += mul(s5_2, M4(3.105e-02, 6.461e-02, 7.153e-02, 5.897e-02, -4.944e-02, 3.584e-02, 1.480e-02, -1.872e-02, 1.280e-02, -5.895e-02, -2.277e-02, -1.193e-02, -5.982e-02, -1.221e-01, -1.579e-02, -5.938e-02)); + r += mul(s5_3, M4(1.689e-01, 2.597e-02, -1.514e-01, 9.314e-02, -1.821e-02, 6.212e-02, 2.740e-02, -3.503e-02, 1.068e-01, 6.841e-02, -1.032e-01, 4.724e-02, -3.427e-02, 1.266e-02, -1.638e-02, -3.180e-02)); + r += mul(s5_4, M4(-1.264e-01, -7.195e-02, -1.812e-01, -7.201e-02, 1.049e-02, 1.705e-01, 6.078e-01, -6.711e-02, 1.288e-01, -8.016e-02, -6.572e-02, -2.269e-02, -5.248e-02, -9.859e-02, -5.316e-02, -4.961e-03)); + r += mul(s5_5, M4(-1.837e-02, 7.451e-02, 1.610e-01, 1.456e-01, 2.369e-02, -3.822e-02, 7.146e-02, -2.847e-02, 7.272e-02, 6.773e-02, -2.711e-02, 7.843e-03, 3.587e-02, 1.023e-01, 1.026e-01, -1.263e-01)); + r += mul(s5_6, M4(6.148e-02, 1.107e-01, 3.425e-02, 1.865e-02, 2.918e-02, 1.356e-02, -4.471e-02, 3.983e-02, 5.005e-02, -1.763e-03, -9.191e-02, 7.853e-04, 2.529e-02, -1.449e-03, -2.292e-02, -5.890e-02)); + r += mul(s5_7, M4(1.625e-01, -9.214e-02, -1.719e-01, 1.213e-01, 1.133e-01, -2.186e-02, -5.343e-02, 2.231e-02, -9.590e-02, -8.760e-03, -1.772e-02, 2.935e-02, 6.195e-02, 4.969e-02, -2.584e-03, 6.213e-02)); + r += mul(s5_8, M4(1.340e-02, 4.829e-02, -9.137e-02, 2.154e-01, -4.813e-02, 6.001e-02, -3.136e-02, -1.011e-01, 1.685e-02, -4.554e-02, 9.511e-02, -1.590e-02, -1.125e-01, 4.501e-02, -3.054e-02, 2.447e-01)); + r += mul(s6_0, M4(-1.053e-01, -8.765e-02, 1.532e-01, -4.659e-02, -2.224e-02, -3.997e-02, 3.599e-02, 1.014e-02, -1.010e-01, 5.718e-02, -1.816e-02, -4.517e-02, 1.942e-02, -2.291e-03, 2.359e-02, 7.930e-03)); + r += mul(s6_1, M4(-2.403e-01, -9.120e-02, 4.618e-02, 3.295e-02, 8.804e-02, 9.860e-02, -3.428e-02, -2.947e-02, -2.438e-01, -4.033e-01, -1.964e-01, -2.377e-02, -9.690e-03, 7.185e-02, -4.311e-02, 2.419e-03)); + r += mul(s6_2, M4(-7.526e-02, -5.431e-02, 1.785e-02, -5.604e-02, -8.780e-03, 2.806e-02, -3.138e-02, -2.028e-02, 4.689e-02, -1.410e-01, 6.928e-03, 4.146e-02, 4.977e-02, -6.971e-02, -3.579e-02, 5.402e-03)); + r += mul(s6_3, M4(-8.901e-02, -5.394e-02, 8.191e-02, -5.543e-03, 2.675e-02, -2.194e-03, -2.872e-02, -1.765e-02, 1.043e-02, -8.325e-02, 8.178e-02, 2.385e-02, -1.619e-02, 9.743e-03, -2.077e-04, -2.131e-02)); + r += mul(s6_4, M4(1.222e-01, -2.013e-01, 2.624e-01, -1.382e-01, 5.505e-02, 2.544e-02, -3.265e-02, 6.327e-02, -2.611e-02, 1.162e-01, 1.180e-01, 1.988e-01, -6.963e-02, 3.909e-02, 6.545e-03, 1.319e-01)); + r += mul(s6_5, M4(-9.865e-02, -9.627e-02, 9.023e-02, 7.924e-02, -3.129e-02, -4.344e-02, -3.674e-02, -1.218e-02, -1.191e-02, -2.820e-01, 3.967e-02, -3.797e-02, 5.883e-02, 6.910e-02, -6.787e-02, -3.560e-02)); + r += mul(s6_6, M4(-1.153e-01, -1.903e-02, 1.505e-01, -6.835e-02, -1.764e-02, 9.724e-03, 3.525e-02, -3.964e-02, -1.022e-04, 6.910e-03, 2.362e-02, -3.179e-02, 7.999e-02, 3.299e-02, -5.418e-02, 8.698e-02)); + r += mul(s6_7, M4(-5.041e-02, 4.131e-05, 2.529e-02, 1.773e-01, -1.839e-02, 1.195e-02, 7.255e-02, 5.290e-02, 9.252e-02, -8.837e-03, -2.834e-02, 6.677e-03, 9.508e-02, -7.959e-02, -8.882e-02, -1.404e-01)); + r += mul(s6_8, M4(-4.957e-02, -9.978e-02, 4.352e-02, -1.570e-01, 5.283e-03, -2.421e-02, -4.951e-02, -2.035e-02, 5.054e-02, 1.961e-02, -4.213e-02, -9.692e-02, 2.936e-02, -4.935e-02, 1.523e-02, 4.361e-02)); + r += mul(s7_0, M4(4.602e-02, -1.675e-02, -1.591e-02, -1.113e-02, -7.082e-02, -3.239e-02, -3.778e-02, 4.838e-03, 7.734e-03, 5.217e-03, -3.286e-02, -1.355e-02, 4.276e-02, 3.737e-03, 1.126e-02, -1.884e-02)); + r += mul(s7_1, M4(3.971e-02, 4.977e-02, -7.690e-02, -1.284e-02, 1.546e-01, 1.142e-01, -5.093e-02, -9.530e-03, 2.584e-02, 2.739e-02, 1.305e-01, 8.483e-03, -4.204e-02, 2.041e-02, 2.619e-02, 2.992e-02)); + r += mul(s7_2, M4(-3.270e-02, -3.031e-02, 3.564e-02, -8.750e-04, -2.558e-02, -4.335e-02, -1.101e-01, 2.464e-02, 8.774e-02, 2.588e-02, -2.431e-02, 1.396e-02, 2.774e-02, 7.791e-03, -1.916e-02, -2.248e-02)); + r += mul(s7_3, M4(-3.812e-02, 3.894e-02, -5.644e-02, -5.112e-02, 9.874e-02, 7.690e-02, -1.340e-01, -8.417e-03, 1.940e-02, -1.649e-02, 7.603e-03, 2.279e-02, -3.198e-02, 1.643e-02, 2.743e-02, 4.726e-02)); + r += mul(s7_4, M4(-1.155e-02, 4.982e-03, 1.675e-01, 1.221e-01, 2.341e-01, -1.924e-01, 5.387e-02, -3.978e-02, 4.156e-02, -2.215e-02, -5.457e-02, 2.207e-01, -7.213e-02, 3.254e-01, 4.576e-02, 7.598e-02)); + r += mul(s7_5, M4(3.181e-02, 6.784e-02, -9.888e-02, -5.729e-02, 1.654e-02, 1.320e-01, -1.027e-01, 6.525e-03, -5.506e-02, -7.947e-02, 6.971e-04, 1.817e-02, 1.188e-02, -2.524e-04, 3.319e-02, -4.904e-02)); + r += mul(s7_6, M4(1.565e-02, -2.185e-02, -1.770e-02, 1.763e-02, 3.587e-02, -5.422e-02, -4.322e-02, -4.995e-02, -6.359e-03, 9.156e-03, 6.813e-02, 1.967e-02, -4.337e-02, -5.229e-02, 9.372e-02, 5.021e-02)); + r += mul(s7_7, M4(-3.703e-03, -1.231e-03, 6.089e-02, -3.712e-02, -7.186e-02, 2.285e-02, 2.142e-02, -2.935e-02, 3.421e-02, 4.537e-02, -1.223e-01, -2.549e-02, -6.228e-04, 7.104e-02, -1.317e-02, 8.456e-02)); + r += mul(s7_8, M4(-1.091e-02, -2.291e-02, -3.018e-02, 6.189e-02, -2.207e-02, 1.936e-02, 4.075e-02, -2.174e-02, -8.365e-03, 1.849e-02, -3.259e-03, 1.701e-02, 1.962e-02, -2.471e-02, 4.502e-02, -5.257e-02)); + r += V4(2.322e-03, -2.560e-03, 2.890e-03, 2.624e-03); + return r; +} + +V4 f3(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-6.769e-02, 3.430e-02, 2.986e-02, 7.093e-03, -3.817e-02, -3.516e-02, 2.524e-03, 1.512e-02, -5.755e-02, -1.135e-02, 2.727e-02, -1.513e-02, -4.468e-02, 7.272e-02, -3.816e-03, 6.695e-02)); + r += mul(s0_1, M4(1.413e-01, -7.748e-02, -2.507e-02, 3.006e-02, -4.637e-02, 1.332e-02, 8.965e-03, 2.699e-02, 1.203e-01, 9.388e-02, 1.500e-01, 1.828e-02, 6.282e-02, -3.408e-02, 4.916e-02, -2.253e-03)); + r += mul(s0_2, M4(-8.667e-02, 7.218e-02, 2.209e-02, -2.577e-02, 3.357e-02, 3.247e-02, -4.440e-02, -2.082e-02, -4.160e-02, 2.560e-02, 3.797e-02, 6.389e-03, -2.219e-02, 4.342e-02, 3.651e-02, 9.668e-03)); + r += mul(s0_3, M4(-1.324e-02, 4.538e-02, -3.497e-02, -4.271e-02, 1.946e-02, -1.026e-02, -2.813e-02, 1.558e-02, -4.352e-02, -8.227e-02, 4.169e-02, 4.614e-03, -3.101e-02, -1.294e-02, 7.845e-02, 8.703e-02)); + r += mul(s0_4, M4(-1.333e-01, 1.681e-02, -3.979e-01, 1.636e-01, -2.077e-02, 9.604e-02, -1.053e-02, 1.743e-01, -7.553e-03, 3.166e-01, 4.240e-01, -7.433e-02, -1.270e-03, 3.921e-02, -9.935e-02, 5.428e-02)); + r += mul(s0_5, M4(8.747e-03, 1.770e-01, -3.575e-01, -1.804e-02, 2.260e-02, -3.461e-02, 3.119e-03, -4.722e-02, -5.255e-02, 2.294e-03, 3.706e-02, 3.062e-02, 1.580e-03, -2.325e-02, -6.594e-02, -8.279e-04)); + r += mul(s0_6, M4(4.588e-02, 1.887e-02, 8.961e-02, 1.174e-02, 3.929e-02, -2.709e-02, 1.732e-02, -3.915e-02, -2.924e-02, -4.258e-03, -1.060e-02, 4.145e-02, 4.382e-02, 2.807e-02, -2.511e-02, -4.608e-02)); + r += mul(s0_7, M4(-3.458e-02, 8.814e-02, -9.911e-02, -9.226e-02, -1.297e-02, -5.636e-02, -3.204e-04, 1.668e-01, 2.376e-03, -1.050e-02, -4.832e-02, -9.028e-02, 1.056e-02, -5.040e-03, 6.895e-02, 1.722e-02)); + r += mul(s0_8, M4(1.385e-02, -1.727e-02, 3.000e-02, -2.268e-02, -7.698e-03, 4.236e-02, 1.831e-02, -2.752e-02, -1.781e-02, 1.875e-02, 6.718e-02, 4.487e-02, 8.638e-03, -4.369e-03, 2.690e-02, 1.162e-02)); + r += mul(s1_0, M4(9.663e-04, 6.421e-02, 2.348e-03, 3.662e-02, -6.243e-02, -4.922e-03, -1.718e-02, 1.109e-02, 3.626e-02, 6.479e-02, 1.096e-02, 5.092e-02, 2.318e-01, -8.631e-03, -1.290e-01, 1.068e-01)); + r += mul(s1_1, M4(1.098e-01, 3.674e-02, -3.759e-02, 9.372e-03, -1.836e-02, -8.044e-02, -1.933e-02, -1.283e-03, 2.495e-01, -7.519e-03, 1.665e-01, -6.518e-02, 6.714e-02, -7.408e-02, 8.451e-02, -4.340e-03)); + r += mul(s1_2, M4(-1.593e-02, -8.483e-02, 6.648e-02, -4.250e-03, 3.890e-02, 5.946e-02, -2.123e-02, 5.192e-04, -3.893e-02, 2.275e-03, 3.886e-02, 2.058e-02, 7.988e-03, 3.680e-02, -7.176e-03, 3.505e-03)); + r += mul(s1_3, M4(3.470e-02, -1.060e-02, 9.678e-02, 5.614e-02, 6.471e-02, 1.664e-02, -6.896e-02, -1.872e-01, 4.002e-03, -5.795e-02, -2.086e-02, -1.295e-01, 3.125e-01, 3.731e-02, 2.252e-01, 1.431e-03)); + r += mul(s1_4, M4(-3.841e-02, -7.289e-02, -1.620e-01, -3.709e-03, 2.840e-02, -9.839e-02, -2.641e-01, 9.547e-02, 4.226e-02, -1.201e-01, -1.102e-01, -1.398e-01, 1.233e-01, 9.042e-02, 1.528e-01, -1.018e-01)); + r += mul(s1_5, M4(2.895e-02, 3.205e-02, -9.373e-02, 2.594e-02, -1.824e-02, 9.412e-02, -1.096e-01, -4.941e-02, -4.628e-02, 3.342e-02, 3.307e-02, 2.623e-02, -3.789e-02, -8.026e-02, 7.834e-02, 1.145e-02)); + r += mul(s1_6, M4(1.077e-02, 6.507e-02, 9.357e-02, 5.691e-03, 2.728e-02, 1.283e-02, 2.645e-02, -2.391e-02, -1.328e-02, 1.523e-02, 1.871e-02, -4.346e-04, 2.688e-02, -1.068e-02, 3.216e-02, -8.827e-02)); + r += mul(s1_7, M4(4.487e-02, -4.437e-02, -2.437e-02, 5.312e-03, 1.198e-02, 3.746e-02, 2.767e-02, -6.274e-02, 4.431e-02, -3.679e-02, -1.600e-02, -3.319e-02, -7.497e-03, -9.400e-02, -5.401e-02, -5.201e-03)); + r += mul(s1_8, M4(4.668e-03, -3.940e-02, 4.642e-02, -1.533e-03, 7.793e-04, -9.078e-02, -2.667e-02, -1.779e-02, -8.360e-03, 3.010e-03, 3.381e-02, 3.870e-02, -6.294e-03, 1.986e-02, -1.353e-03, 1.982e-02)); + r += mul(s2_0, M4(-1.493e-02, 3.922e-02, -1.123e-02, 3.228e-02, 3.481e-02, -8.864e-02, -3.402e-02, -2.980e-02, -1.228e-03, -1.155e-02, -5.129e-03, -6.118e-04, -6.707e-03, 1.068e-01, 1.294e-01, 9.454e-02)); + r += mul(s2_1, M4(6.473e-02, 1.190e-02, 9.143e-03, -1.535e-02, -2.666e-01, 2.390e-02, -4.825e-02, -1.338e-02, 2.362e-02, -4.216e-02, 2.073e-03, 1.623e-02, 3.649e-02, -5.048e-02, 1.218e-01, -1.258e-01)); + r += mul(s2_2, M4(-1.461e-02, -2.262e-02, 1.377e-02, 8.270e-03, -1.703e-02, -3.705e-02, 3.457e-03, 7.981e-03, 9.442e-03, -3.095e-02, 1.217e-02, 1.122e-02, -6.379e-02, 5.288e-02, -4.319e-02, -1.166e-02)); + r += mul(s2_3, M4(6.899e-02, 8.014e-02, 1.904e-02, 1.901e-01, -6.712e-02, 9.053e-02, 6.660e-02, -1.686e-01, 1.100e-01, 2.037e-02, 1.298e-02, 1.362e-01, -3.602e-02, -1.374e-01, -4.468e-02, -4.311e-02)); + r += mul(s2_4, M4(-1.657e-01, -4.958e-02, 6.990e-02, -1.729e-01, 1.499e-01, 3.929e-02, 3.195e-01, -1.191e-01, 7.422e-02, -5.251e-04, 1.518e-01, -5.510e-03, 5.051e-02, 1.482e-01, -6.150e-02, -4.369e-02)); + r += mul(s2_5, M4(-4.362e-03, -2.337e-02, -5.092e-02, 9.135e-03, -3.870e-02, 2.134e-02, 1.440e-02, 3.260e-03, -4.886e-02, -7.149e-02, -5.947e-03, 1.620e-02, 1.830e-02, -6.629e-02, 2.087e-02, 1.329e-02)); + r += mul(s2_6, M4(2.216e-02, -4.352e-02, -2.959e-02, 4.755e-02, 2.413e-02, -2.525e-03, -4.118e-02, -7.323e-02, 8.579e-03, -3.825e-02, -6.078e-02, -9.820e-02, 7.013e-03, 1.992e-02, -6.306e-02, -2.990e-02)); + r += mul(s2_7, M4(-1.876e-03, 1.483e-02, 8.292e-02, -7.048e-02, -5.165e-02, 1.388e-02, -2.538e-02, -4.672e-02, -1.392e-02, 6.786e-02, 1.279e-01, 5.121e-02, 6.889e-03, 3.214e-02, 3.471e-02, 5.284e-02)); + r += mul(s2_8, M4(3.736e-03, -1.720e-02, 3.858e-02, 1.053e-02, 9.189e-03, -5.003e-03, -3.432e-02, 3.109e-02, 2.986e-02, -5.438e-04, -3.111e-02, 3.517e-02, 1.780e-02, -4.259e-04, -1.356e-03, -2.237e-02)); + r += mul(s3_0, M4(-1.569e-02, -1.265e-02, -1.442e-02, 1.176e-02, 6.370e-02, 1.240e-02, 2.896e-03, 7.663e-02, 3.791e-02, -3.755e-02, -5.019e-02, -1.640e-02, -3.169e-02, 1.265e-01, -3.333e-02, 8.391e-02)); + r += mul(s3_1, M4(2.693e-02, 9.806e-02, 8.333e-03, -4.201e-02, -2.995e-02, -2.224e-02, 3.885e-02, -3.163e-02, -7.559e-03, -7.851e-02, 5.818e-03, -2.593e-02, 2.332e-01, -2.682e-01, -3.702e-01, -7.207e-02)); + r += mul(s3_2, M4(1.338e-02, -9.557e-03, 4.011e-02, 1.176e-02, -2.853e-02, 2.508e-02, 3.737e-02, 2.593e-03, -8.633e-03, -2.363e-02, 1.359e-02, 3.321e-03, -1.082e-02, 2.184e-02, -1.364e-01, -1.985e-02)); + r += mul(s3_3, M4(7.322e-02, 6.110e-02, -6.938e-02, 1.362e-01, -2.306e-02, -1.182e-02, 4.187e-02, -9.458e-02, 4.396e-02, -3.955e-02, 2.733e-02, -4.115e-02, 4.264e-02, -1.599e-01, -2.753e-02, 6.181e-02)); + r += mul(s3_4, M4(-1.348e-01, -4.207e-02, 2.851e-02, -1.848e-01, 5.648e-02, 7.481e-04, -7.185e-02, 8.991e-02, -2.557e-02, -1.986e-02, -5.941e-03, 1.308e-02, 4.504e-02, 4.393e-01, 3.722e-01, 7.878e-03)); + r += mul(s3_5, M4(-3.470e-02, -1.129e-02, 3.449e-02, -2.631e-02, 3.715e-03, 3.386e-03, -5.315e-02, -6.027e-03, 1.135e-02, -7.620e-02, 2.472e-03, -1.909e-02, 6.653e-02, -9.478e-02, -1.071e-01, -2.663e-03)); + r += mul(s3_6, M4(2.318e-04, -4.771e-02, -2.045e-02, -1.086e-02, 4.472e-03, -4.367e-02, -1.824e-02, -6.762e-02, 6.207e-02, -5.995e-02, -6.440e-02, -1.439e-01, 2.135e-02, -4.208e-02, -9.296e-02, -8.298e-02)); + r += mul(s3_7, M4(2.881e-02, -1.097e-01, 1.400e-02, -1.062e-01, 1.823e-02, -7.184e-04, 6.146e-02, 3.571e-02, 1.869e-02, -1.228e-01, 3.933e-02, 1.774e-02, -7.991e-03, -6.415e-02, -7.725e-02, -5.734e-02)); + r += mul(s3_8, M4(-1.673e-02, 6.017e-03, -1.099e-02, 9.427e-03, 7.090e-03, -1.586e-02, -8.811e-03, 7.162e-03, -1.503e-03, 1.245e-02, 8.584e-02, 2.865e-02, 1.389e-02, -3.085e-02, -6.177e-03, -2.121e-02)); + r += mul(s4_0, M4(3.493e-03, -2.886e-03, 4.468e-03, -9.162e-03, -3.429e-02, 1.533e-02, -1.977e-02, 1.296e-02, -7.195e-02, -2.864e-02, 1.670e-02, 2.819e-03, 3.964e-02, 6.730e-03, 4.604e-03, -4.440e-03)); + r += mul(s4_1, M4(7.038e-02, -5.105e-02, 3.612e-02, 1.737e-03, 8.003e-03, -3.328e-03, 6.301e-02, 8.136e-02, 5.501e-02, 2.321e-02, 3.147e-02, 4.815e-02, 6.608e-02, -2.219e-02, -2.320e-02, 5.550e-03)); + r += mul(s4_2, M4(-5.361e-02, 6.124e-03, 6.197e-02, 1.861e-02, 5.837e-03, -2.258e-02, 2.421e-02, 2.352e-02, 9.489e-03, -2.379e-02, 2.291e-02, -9.015e-03, 1.667e-03, 5.427e-02, -5.367e-03, -1.688e-03)); + r += mul(s4_3, M4(-2.280e-03, 2.210e-02, 6.070e-02, 6.741e-02, 3.232e-02, -3.528e-02, -3.783e-02, 7.012e-02, 9.307e-02, 2.999e-02, -3.325e-02, 2.233e-02, -7.461e-03, 3.415e-02, 2.672e-02, -7.837e-02)); + r += mul(s4_4, M4(-8.615e-02, 1.665e-01, 2.015e-01, -1.366e-02, -2.904e-03, -9.961e-02, -1.997e-02, -2.561e-02, -8.201e-02, -2.483e-02, -2.690e-01, 4.378e-02, -6.957e-02, -7.747e-02, -5.177e-02, 1.053e-01)); + r += mul(s4_5, M4(-3.442e-02, 2.996e-02, 1.743e-02, 1.939e-02, 2.183e-02, 1.201e-02, -3.384e-03, 4.529e-02, 3.883e-02, 1.622e-02, -1.191e-01, 2.433e-02, -3.534e-03, 1.045e-01, 4.727e-02, 3.186e-02)); + r += mul(s4_6, M4(-3.222e-02, 7.750e-03, 1.940e-02, -9.354e-03, -2.196e-02, -1.724e-02, 3.045e-02, 5.532e-03, 6.117e-02, -7.738e-02, -9.238e-02, -6.940e-03, 2.963e-02, -3.707e-02, -2.099e-02, -5.924e-02)); + r += mul(s4_7, M4(2.275e-02, -3.647e-02, 7.601e-04, 4.326e-02, 4.676e-02, -2.737e-02, 1.456e-03, 4.308e-02, 2.049e-02, 1.226e-01, -7.456e-02, 1.435e-01, -3.338e-02, 3.721e-02, 2.961e-02, 1.217e-01)); + r += mul(s4_8, M4(-2.384e-02, 6.714e-02, 7.770e-02, 4.065e-02, 7.466e-03, 1.779e-02, -2.825e-02, -2.042e-02, -6.037e-03, -1.580e-02, -1.190e-01, -3.517e-02, 1.130e-02, 2.295e-02, -7.750e-02, -3.106e-02)); + r += mul(s5_0, M4(-4.721e-02, -5.382e-02, 4.564e-02, -6.371e-02, -5.454e-02, -5.059e-02, 9.380e-03, -2.820e-03, 2.496e-02, 1.014e-02, -2.499e-02, -1.110e-02, -1.481e-02, 1.522e-02, -1.918e-02, 1.641e-02)); + r += mul(s5_1, M4(-4.790e-01, 1.294e-01, 2.610e-01, -5.945e-02, -8.980e-02, 1.320e-02, -2.247e-02, -4.364e-02, 6.614e-02, 6.913e-02, -1.607e-02, 2.799e-02, -3.813e-02, 7.105e-02, 7.943e-02, 6.225e-02)); + r += mul(s5_2, M4(-6.457e-02, 1.694e-01, -3.872e-02, 4.488e-02, -4.822e-02, -8.567e-02, 7.933e-02, 1.024e-02, 1.063e-03, -4.451e-02, -1.357e-02, 7.988e-03, 1.240e-02, 5.276e-02, 3.980e-02, 6.461e-02)); + r += mul(s5_3, M4(-1.620e-01, 1.235e-01, 3.256e-02, 5.695e-02, 4.469e-02, -8.958e-02, 2.359e-03, -6.046e-02, 2.983e-02, -3.023e-03, 6.335e-02, 1.317e-02, 3.527e-02, -1.933e-02, -3.699e-02, 6.653e-02)); + r += mul(s5_4, M4(1.232e-01, 4.089e-01, 1.239e-01, 1.234e-01, 1.253e-02, 3.016e-02, 5.864e-02, -1.790e-01, -8.816e-02, 3.547e-02, 1.620e-01, 6.102e-03, -5.373e-02, -1.860e-01, -1.284e-01, 6.518e-02)); + r += mul(s5_5, M4(-4.312e-02, 2.143e-03, 1.073e-01, 5.873e-03, 2.948e-02, 3.319e-02, -7.224e-02, 1.756e-02, 6.773e-02, 2.521e-02, 1.380e-02, 4.037e-02, 3.288e-02, -1.908e-01, -1.050e-01, 3.035e-02)); + r += mul(s5_6, M4(-5.461e-02, 9.170e-02, 6.992e-02, 9.781e-02, -9.620e-03, 2.436e-02, 4.409e-02, -9.482e-02, 1.359e-03, -2.669e-02, -1.697e-02, -3.783e-02, -2.329e-02, -1.386e-02, -1.895e-02, 1.972e-02)); + r += mul(s5_7, M4(-4.409e-02, -2.055e-02, -1.209e-01, 5.981e-02, -4.746e-02, -9.839e-02, -8.667e-02, -3.684e-04, 3.992e-02, 4.212e-02, -2.215e-02, -2.174e-02, 1.628e-02, 2.727e-02, 1.283e-02, 1.170e-01)); + r += mul(s5_8, M4(-3.285e-02, 1.315e-01, 5.991e-02, 3.093e-02, 1.831e-02, -2.701e-02, -9.941e-03, -1.247e-02, -1.884e-02, -3.038e-02, 1.778e-02, -1.534e-02, 8.890e-03, 5.855e-02, -5.228e-03, 7.156e-03)); + r += mul(s6_0, M4(9.490e-02, -1.496e-02, -8.049e-02, -4.893e-02, -4.609e-02, 3.691e-02, 1.122e-02, 1.672e-02, 1.273e-01, 2.604e-02, -3.030e-02, 3.724e-02, -9.443e-03, 9.186e-03, -1.887e-02, 1.724e-02)); + r += mul(s6_1, M4(3.599e-02, 1.217e-02, -5.710e-02, -3.505e-02, 2.689e-02, -1.739e-03, 8.030e-02, 1.825e-02, 1.923e-01, -1.211e-01, -1.559e-02, -1.202e-02, 4.499e-02, -2.829e-02, -1.283e-02, -2.598e-02)); + r += mul(s6_2, M4(8.338e-02, -6.812e-02, -4.737e-02, -2.143e-02, -1.269e-02, -2.670e-03, -2.229e-02, 6.926e-04, 9.799e-03, -2.381e-02, -1.008e-02, 2.220e-02, -1.786e-02, -5.033e-02, 2.973e-02, -6.898e-03)); + r += mul(s6_3, M4(1.293e-01, -1.263e-01, -1.300e-01, 3.399e-02, -3.571e-02, -3.489e-03, 4.969e-02, -6.396e-04, -1.049e-01, -6.914e-02, -6.059e-02, -3.406e-02, -4.433e-02, -3.107e-02, 1.599e-02, -9.359e-02)); + r += mul(s6_4, M4(-1.572e-02, -4.111e-02, 1.207e-01, -2.561e-01, 8.708e-02, 5.039e-02, 5.332e-02, -7.156e-02, 1.751e-01, -9.601e-02, 8.257e-03, -2.388e-01, -1.028e-02, 5.476e-03, -1.537e-01, 4.572e-02)); + r += mul(s6_5, M4(5.549e-02, -1.367e-02, -6.034e-02, 2.235e-02, -2.252e-02, -5.300e-02, 4.816e-02, 2.981e-02, -1.995e-02, -1.877e-02, -1.219e-01, 1.896e-02, 7.559e-02, -1.734e-02, 1.740e-02, -9.721e-03)); + r += mul(s6_6, M4(5.600e-03, -4.349e-02, -3.722e-03, -1.021e-02, -4.450e-03, -1.587e-02, -3.889e-02, -3.046e-02, -2.679e-02, 1.161e-02, -1.043e-02, -2.748e-02, -1.829e-02, 5.464e-02, 6.469e-02, 9.752e-03)); + r += mul(s6_7, M4(8.553e-02, 1.512e-02, -1.313e-01, -1.637e-01, 8.015e-03, 2.808e-02, 7.920e-02, -1.984e-02, 1.717e-02, -6.763e-02, -8.202e-02, -3.641e-02, 5.455e-02, -8.316e-02, -1.613e-01, -8.608e-03)); + r += mul(s6_8, M4(2.581e-02, -9.600e-02, -3.212e-02, 4.638e-03, 1.617e-02, 3.466e-03, -2.201e-02, 1.713e-02, 2.723e-03, -6.574e-03, 3.141e-02, 2.810e-02, -5.310e-02, 1.756e-02, 1.155e-01, -9.499e-03)); + r += mul(s7_0, M4(-5.505e-02, -2.272e-02, -2.377e-03, 1.201e-02, -1.914e-01, 1.033e-02, 9.063e-02, -2.243e-02, -7.919e-02, 4.620e-02, 6.766e-02, -7.420e-02, 1.656e-03, -3.636e-02, -3.654e-02, -1.298e-03)); + r += mul(s7_1, M4(2.952e-02, -2.152e-02, -1.487e-02, -2.337e-02, 2.447e-02, -4.213e-02, 1.234e-01, 5.147e-03, 2.335e-01, -1.621e-01, -1.609e-01, -5.706e-02, -7.251e-02, 3.109e-02, 1.041e-02, -2.281e-02)); + r += mul(s7_2, M4(-1.849e-02, 2.297e-02, 2.471e-02, 4.394e-03, -7.618e-02, 2.530e-02, 1.500e-02, 5.996e-03, -5.243e-02, -6.869e-03, 2.549e-02, 6.482e-03, -2.084e-03, -2.925e-02, 1.508e-03, -1.377e-02)); + r += mul(s7_3, M4(2.360e-02, -2.729e-02, -3.317e-03, -1.427e-02, 2.136e-01, 8.746e-02, 6.818e-02, -6.063e-02, -4.529e-02, 2.893e-02, -8.883e-03, -2.803e-02, 5.528e-02, 3.423e-02, -1.193e-02, -1.598e-01)); + r += mul(s7_4, M4(-4.718e-02, 1.455e-01, 6.738e-02, 7.756e-02, -1.693e-01, -1.121e-01, -4.263e-01, 6.029e-02, 2.845e-02, -1.797e-02, -7.025e-02, -1.174e-01, -2.348e-01, -1.115e-02, -1.892e-02, -1.518e-02)); + r += mul(s7_5, M4(2.243e-02, -7.424e-02, -3.931e-02, -2.403e-02, 6.038e-02, 1.797e-02, -1.744e-01, 1.963e-02, -4.382e-02, 9.405e-02, 1.894e-02, 5.672e-02, 1.975e-02, 7.642e-02, 2.796e-02, -8.300e-03)); + r += mul(s7_6, M4(-9.019e-03, 9.798e-03, -4.330e-03, -1.891e-02, 1.371e-02, -6.128e-02, -3.102e-02, -1.832e-03, -5.050e-02, -1.091e-02, 1.292e-02, 1.969e-02, -1.757e-02, -6.372e-02, -3.461e-02, 2.646e-02)); + r += mul(s7_7, M4(4.840e-03, -1.643e-02, -1.586e-02, 1.015e-02, 1.271e-02, 1.577e-02, 6.421e-02, -5.505e-02, 2.839e-02, 3.304e-02, 1.282e-02, -3.135e-02, 9.328e-03, -3.226e-02, -1.949e-01, 6.956e-02)); + r += mul(s7_8, M4(-6.982e-03, 1.910e-02, 1.303e-02, 1.504e-03, 1.284e-02, -1.884e-02, 9.418e-02, 4.628e-02, -1.214e-02, 2.500e-02, 6.745e-02, 4.770e-02, -1.645e-02, 2.692e-02, 3.056e-02, -7.823e-03)); + r += V4(-2.282e-03, 2.426e-03, 3.717e-03, 9.910e-04); + return r; +} + +void Pass17(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = Rmp8x8(tid.x) + blockStart; + uint2 size = GetInputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = (gxy + 0.5) * pt; + + V4 s0_0 = l0(-1.0, -1.0); + V4 s0_1 = l0(0.0, -1.0); + V4 s0_2 = l0(1.0, -1.0); + V4 s0_3 = l0(-1.0, 0.0); + V4 s0_4 = l0(0.0, 0.0); + V4 s0_5 = l0(1.0, 0.0); + V4 s0_6 = l0(-1.0, 1.0); + V4 s0_7 = l0(0.0, 1.0); + V4 s0_8 = l0(1.0, 1.0); + V4 s1_0 = -max(-s0_0, 0.0); + V4 s1_1 = -max(-s0_1, 0.0); + V4 s1_2 = -max(-s0_2, 0.0); + V4 s1_3 = -max(-s0_3, 0.0); + V4 s1_4 = -max(-s0_4, 0.0); + V4 s1_5 = -max(-s0_5, 0.0); + V4 s1_6 = -max(-s0_6, 0.0); + V4 s1_7 = -max(-s0_7, 0.0); + V4 s1_8 = -max(-s0_8, 0.0); + s0_0 = max(s0_0, 0.0); + s0_1 = max(s0_1, 0.0); + s0_2 = max(s0_2, 0.0); + s0_3 = max(s0_3, 0.0); + s0_4 = max(s0_4, 0.0); + s0_5 = max(s0_5, 0.0); + s0_6 = max(s0_6, 0.0); + s0_7 = max(s0_7, 0.0); + s0_8 = max(s0_8, 0.0); + + V4 s2_0 = l1(-1.0, -1.0); + V4 s2_1 = l1(0.0, -1.0); + V4 s2_2 = l1(1.0, -1.0); + V4 s2_3 = l1(-1.0, 0.0); + V4 s2_4 = l1(0.0, 0.0); + V4 s2_5 = l1(1.0, 0.0); + V4 s2_6 = l1(-1.0, 1.0); + V4 s2_7 = l1(0.0, 1.0); + V4 s2_8 = l1(1.0, 1.0); + V4 s3_0 = -max(-s2_0, 0.0); + V4 s3_1 = -max(-s2_1, 0.0); + V4 s3_2 = -max(-s2_2, 0.0); + V4 s3_3 = -max(-s2_3, 0.0); + V4 s3_4 = -max(-s2_4, 0.0); + V4 s3_5 = -max(-s2_5, 0.0); + V4 s3_6 = -max(-s2_6, 0.0); + V4 s3_7 = -max(-s2_7, 0.0); + V4 s3_8 = -max(-s2_8, 0.0); + s2_0 = max(s2_0, 0.0); + s2_1 = max(s2_1, 0.0); + s2_2 = max(s2_2, 0.0); + s2_3 = max(s2_3, 0.0); + s2_4 = max(s2_4, 0.0); + s2_5 = max(s2_5, 0.0); + s2_6 = max(s2_6, 0.0); + s2_7 = max(s2_7, 0.0); + s2_8 = max(s2_8, 0.0); + + V4 s4_0 = l2(-1.0, -1.0); + V4 s4_1 = l2(0.0, -1.0); + V4 s4_2 = l2(1.0, -1.0); + V4 s4_3 = l2(-1.0, 0.0); + V4 s4_4 = l2(0.0, 0.0); + V4 s4_5 = l2(1.0, 0.0); + V4 s4_6 = l2(-1.0, 1.0); + V4 s4_7 = l2(0.0, 1.0); + V4 s4_8 = l2(1.0, 1.0); + V4 s5_0 = -max(-s4_0, 0.0); + V4 s5_1 = -max(-s4_1, 0.0); + V4 s5_2 = -max(-s4_2, 0.0); + V4 s5_3 = -max(-s4_3, 0.0); + V4 s5_4 = -max(-s4_4, 0.0); + V4 s5_5 = -max(-s4_5, 0.0); + V4 s5_6 = -max(-s4_6, 0.0); + V4 s5_7 = -max(-s4_7, 0.0); + V4 s5_8 = -max(-s4_8, 0.0); + s4_0 = max(s4_0, 0.0); + s4_1 = max(s4_1, 0.0); + s4_2 = max(s4_2, 0.0); + s4_3 = max(s4_3, 0.0); + s4_4 = max(s4_4, 0.0); + s4_5 = max(s4_5, 0.0); + s4_6 = max(s4_6, 0.0); + s4_7 = max(s4_7, 0.0); + s4_8 = max(s4_8, 0.0); + + V4 s6_0 = l3(-1.0, -1.0); + V4 s6_1 = l3(0.0, -1.0); + V4 s6_2 = l3(1.0, -1.0); + V4 s6_3 = l3(-1.0, 0.0); + V4 s6_4 = l3(0.0, 0.0); + V4 s6_5 = l3(1.0, 0.0); + V4 s6_6 = l3(-1.0, 1.0); + V4 s6_7 = l3(0.0, 1.0); + V4 s6_8 = l3(1.0, 1.0); + V4 s7_0 = -max(-s6_0, 0.0); + V4 s7_1 = -max(-s6_1, 0.0); + V4 s7_2 = -max(-s6_2, 0.0); + V4 s7_3 = -max(-s6_3, 0.0); + V4 s7_4 = -max(-s6_4, 0.0); + V4 s7_5 = -max(-s6_5, 0.0); + V4 s7_6 = -max(-s6_6, 0.0); + V4 s7_7 = -max(-s6_7, 0.0); + V4 s7_8 = -max(-s6_8, 0.0); + s6_0 = max(s6_0, 0.0); + s6_1 = max(s6_1, 0.0); + s6_2 = max(s6_2, 0.0); + s6_3 = max(s6_3, 0.0); + s6_4 = max(s6_4, 0.0); + s6_5 = max(s6_5, 0.0); + s6_6 = max(s6_6, 0.0); + s6_7 = max(s6_7, 0.0); + s6_8 = max(s6_8, 0.0); + + t0[gxy] = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t1[gxy] = f1(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t2[gxy] = f2(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t3[gxy] = f3(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); +} + +//!PASS 18 +//!DESC out-shuffle +//!BLOCK_SIZE 16 +//!NUM_THREADS 64 +//!IN INPUT, t0, t1, t2, t3 +//!OUT OUTPUT + +#define l0(x, y) V4(O(t0, float2(x, y))) +#define l1(x, y) V4(O(t1, float2(x, y))) +#define l2(x, y) V4(O(t2, float2(x, y))) +#define l3(x, y) V4(O(t3, float2(x, y))) + +V4 f0(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(6.390e-02, 2.774e-02, -1.825e-02, -3.381e-02, 5.142e-03, 1.910e-02, -1.152e-02, -1.715e-02, 4.162e-02, -2.385e-02, -1.464e-02, 2.865e-02, 7.757e-02, -3.907e-02, -1.001e-02, 3.856e-02)); + r += mul(s0_1, M4(1.028e-02, 1.211e-02, 1.998e-02, 2.118e-02, 4.222e-02, -2.634e-02, -2.654e-02, 1.277e-02, 2.783e-03, -3.517e-03, 9.475e-03, -5.885e-02, 6.169e-02, 2.678e-02, 7.086e-03, -6.372e-02)); + r += mul(s0_2, M4(-6.586e-03, 3.657e-02, 2.724e-03, 4.726e-04, 5.419e-03, 3.249e-02, 5.477e-03, -3.069e-02, -1.690e-02, 5.874e-03, 1.759e-03, -2.633e-03, -1.629e-02, 5.009e-02, 5.186e-04, 1.089e-02)); + r += mul(s0_3, M4(-1.309e-01, 6.016e-02, -2.002e-01, 7.875e-02, -3.259e-02, 8.804e-03, -7.355e-04, 3.578e-02, -3.214e-02, 3.275e-03, 2.240e-02, -3.278e-02, 9.548e-02, 3.186e-02, 7.834e-02, -1.996e-02)); + r += mul(s0_4, M4(1.598e-01, -5.578e-01, 5.417e-02, -2.931e-02, -1.627e-01, -5.194e-02, 1.829e-01, -1.190e-02, 2.025e-01, -4.635e-03, -3.636e-02, 4.761e-02, -3.775e-01, 3.522e-01, 7.375e-02, 1.011e-01)); + r += mul(s0_5, M4(-4.034e-03, 3.094e-02, -1.570e-02, 5.374e-03, 3.153e-03, 3.226e-02, 1.686e-02, 1.480e-01, -8.735e-03, 8.374e-02, 2.216e-02, 7.613e-02, 1.636e-02, -8.414e-02, 2.502e-02, -5.713e-02)); + r += mul(s0_6, M4(5.457e-02, -9.016e-03, 1.209e-01, -1.264e-02, 1.254e-02, 1.198e-02, 3.556e-02, -9.702e-03, -3.455e-02, -8.410e-03, -7.007e-02, -4.583e-03, 3.383e-05, -3.308e-02, -2.099e-02, 2.184e-02)); + r += mul(s0_7, M4(-5.539e-02, 9.357e-02, -1.596e-01, 4.695e-03, 7.270e-02, -9.424e-03, -1.462e-01, 5.083e-03, -9.984e-02, -2.601e-02, 4.360e-02, -8.520e-02, 3.265e-02, -7.759e-02, -1.672e-01, -2.050e-01)); + r += mul(s0_8, M4(-2.128e-02, 3.748e-02, 1.617e-03, 4.106e-02, 8.666e-03, -6.636e-03, -4.336e-03, -8.958e-02, 5.448e-03, -8.355e-03, -5.292e-04, 2.481e-02, -5.910e-02, 3.845e-03, 2.578e-02, 8.474e-03)); + r += mul(s1_0, M4(4.021e-02, 2.152e-02, -1.957e-02, -1.908e-02, 9.527e-03, 1.594e-02, 3.373e-04, -1.741e-02, 5.456e-02, -1.393e-02, -1.739e-02, 3.796e-02, 8.570e-02, -4.315e-02, -1.061e-02, 3.398e-02)); + r += mul(s1_1, M4(9.609e-03, -1.568e-02, 3.150e-02, 2.950e-02, 7.791e-03, -2.504e-02, -1.304e-02, -6.383e-04, 1.061e-01, -1.333e-01, 3.358e-02, -6.262e-02, 1.793e-02, 7.228e-02, 1.766e-02, -5.212e-02)); + r += mul(s1_2, M4(-8.435e-05, 2.842e-02, -4.049e-04, 3.577e-03, -4.550e-03, 9.252e-02, 8.368e-03, -4.986e-02, -2.765e-02, 2.857e-02, -1.321e-02, 7.323e-03, -1.438e-02, 1.786e-02, -1.333e-03, 7.861e-03)); + r += mul(s1_3, M4(-1.434e-01, 1.037e-02, -6.555e-02, 6.823e-02, -4.099e-02, 3.701e-03, -6.747e-03, 3.308e-02, -1.705e-02, 1.096e-02, 3.467e-02, -1.692e-02, 7.100e-02, 4.063e-02, 1.319e-01, -2.094e-02)); + r += mul(s1_4, M4(-1.017e-01, -1.706e-01, 2.838e-02, -1.911e-01, -1.702e-01, 1.835e-02, 4.517e-02, 4.334e-02, 4.174e-01, -1.962e-01, 3.960e-01, -3.778e-01, -4.905e-02, 2.323e-02, -7.309e-02, 1.372e-01)); + r += mul(s1_5, M4(2.471e-03, 2.260e-02, -1.895e-02, 1.619e-02, 9.813e-02, -6.199e-02, 2.035e-02, 2.360e-01, -2.213e-02, 4.914e-02, 4.391e-04, 9.992e-02, -7.150e-03, -8.029e-02, 4.005e-02, -2.034e-02)); + r += mul(s1_6, M4(5.574e-02, -1.455e-03, 3.519e-02, -1.652e-02, 8.706e-03, 8.148e-03, 3.186e-02, -1.569e-02, -3.709e-02, -6.221e-03, -7.016e-02, 5.356e-04, -1.886e-03, -1.107e-02, -7.914e-02, 2.951e-02)); + r += mul(s1_7, M4(2.909e-02, 9.775e-03, -5.673e-02, -5.728e-03, 6.949e-02, -8.710e-03, -1.373e-01, 2.303e-02, -8.227e-02, -3.188e-02, 5.025e-02, -1.153e-01, -1.050e-02, -7.427e-03, -7.233e-02, -1.673e-01)); + r += mul(s1_8, M4(-7.709e-03, 3.031e-02, 4.567e-03, 1.352e-02, 5.188e-02, -2.272e-02, 8.991e-02, -1.821e-01, 8.971e-03, -5.960e-04, -1.277e-03, 7.427e-03, -6.498e-02, 1.294e-02, 1.555e-02, -1.687e-02)); + r += mul(s2_0, M4(1.187e-02, -2.125e-02, -1.424e-02, 9.688e-03, 2.789e-02, 3.693e-03, 3.572e-03, -3.632e-02, -7.399e-02, 1.812e-02, -1.472e-03, -8.793e-03, 1.395e-02, -2.879e-03, 7.715e-03, 3.446e-03)); + r += mul(s2_1, M4(4.279e-02, -8.375e-02, -6.323e-02, -2.238e-02, -2.822e-01, 7.203e-02, 5.882e-02, 1.752e-02, -5.393e-02, 1.155e-01, -4.163e-02, -5.853e-02, -3.211e-02, 1.291e-02, -4.688e-03, -9.039e-03)); + r += mul(s2_2, M4(-7.677e-02, -2.722e-02, 1.059e-02, -4.523e-02, 3.556e-02, -5.189e-03, -9.061e-03, 1.751e-02, -2.031e-03, -9.133e-03, 3.850e-03, -1.774e-02, 4.552e-03, -9.488e-03, 3.512e-03, 4.578e-03)); + r += mul(s2_3, M4(2.615e-02, -3.477e-03, -1.008e-02, -1.526e-02, -3.863e-02, -2.732e-03, 3.901e-03, 1.203e-02, -2.661e-01, -2.898e-02, -3.043e-01, 1.183e-02, -1.000e-02, 1.435e-02, -3.403e-02, -8.087e-03)); + r += mul(s2_4, M4(-9.355e-02, 8.081e-02, 1.895e-02, -3.090e-03, 3.487e-01, 5.679e-02, -7.838e-02, 2.550e-01, 1.324e-02, 3.883e-01, -3.071e-02, 5.176e-01, 1.501e-01, -3.565e-02, -1.969e-02, -8.083e-03)); + r += mul(s2_5, M4(4.897e-02, 4.358e-02, -2.250e-02, 3.900e-04, -6.904e-02, -1.540e-01, 2.712e-02, -3.057e-01, 2.473e-02, 1.154e-02, 2.076e-02, 4.656e-02, -5.647e-02, -3.986e-03, 9.239e-03, -2.458e-03)); + r += mul(s2_6, M4(4.262e-03, -1.035e-04, 6.255e-03, 3.230e-03, -2.473e-03, 1.006e-02, 3.284e-02, -2.630e-02, -3.128e-02, -1.357e-03, -8.228e-02, -8.119e-03, -1.882e-01, 8.072e-03, 2.790e-01, -6.116e-02)); + r += mul(s2_7, M4(9.436e-03, 1.770e-03, 9.203e-02, 1.249e-02, 2.308e-02, -2.907e-02, -2.786e-02, 4.915e-02, -1.968e-02, -3.430e-02, -1.912e-02, -3.145e-03, -3.159e-01, -4.435e-01, 2.317e-01, 6.173e-01)); + r += mul(s2_8, M4(3.184e-02, -2.678e-03, -6.755e-03, 7.788e-02, -2.232e-02, -5.733e-03, -2.362e-02, 1.816e-02, 1.913e-03, -1.934e-03, -2.528e-03, -1.285e-02, -1.946e-02, -5.783e-02, -2.675e-02, -7.862e-02)); + r += mul(s3_0, M4(1.347e-02, -6.464e-04, -1.733e-02, 2.701e-04, 1.661e-02, 2.890e-03, 7.689e-03, -1.548e-02, 3.021e-02, -6.908e-03, 5.846e-03, -1.131e-02, 1.495e-02, 2.671e-03, 7.160e-03, 4.655e-03)); + r += mul(s3_1, M4(-2.134e-01, -2.300e-01, 2.629e-02, 2.755e-02, -8.032e-02, 1.235e-02, 1.920e-02, 5.557e-02, -4.051e-02, -1.978e-02, -4.303e-02, -5.506e-02, -2.838e-02, 1.676e-02, -4.412e-03, -1.334e-02)); + r += mul(s3_2, M4(-5.847e-02, -1.401e-01, -5.565e-03, -1.700e-02, 2.641e-02, -8.521e-02, -1.057e-02, 3.629e-03, -3.943e-03, -3.006e-03, 4.014e-03, -1.514e-02, 1.348e-02, -3.349e-03, 2.767e-03, 4.664e-03)); + r += mul(s3_3, M4(2.605e-02, 5.798e-03, -9.194e-03, -1.654e-02, -2.398e-02, 2.579e-03, 3.456e-02, 1.623e-02, -4.851e-02, -7.558e-02, -3.631e-02, -3.477e-02, 1.831e-02, -3.549e-05, -1.464e-02, 2.457e-03)); + r += mul(s3_4, M4(-3.391e-01, -6.608e-02, 4.936e-01, 2.333e-01, 1.045e-01, 1.597e-01, 3.183e-02, 1.025e-01, 1.371e-01, 1.382e-01, 7.103e-02, 1.793e-01, 1.265e-01, -1.196e-02, 1.296e-02, 2.169e-02)); + r += mul(s3_5, M4(5.367e-02, -2.184e-02, -2.914e-02, 2.076e-01, -4.832e-02, -8.489e-02, -3.349e-02, -8.611e-02, 6.975e-03, 2.881e-02, 9.430e-03, 5.570e-02, -5.738e-02, -1.056e-02, 8.026e-03, 1.479e-02)); + r += mul(s3_6, M4(2.914e-03, -7.976e-03, -8.091e-03, 7.943e-03, -7.490e-03, 1.170e-02, 2.435e-02, -2.150e-02, -3.865e-02, 9.554e-03, -3.592e-02, -1.665e-02, 1.543e-02, -3.448e-03, 8.179e-02, -2.743e-02)); + r += mul(s3_7, M4(2.977e-02, 2.276e-02, 6.616e-02, -1.629e-02, 4.146e-02, -3.141e-02, -4.259e-02, 6.178e-02, -2.579e-02, -3.562e-02, 4.975e-03, -4.307e-02, -7.259e-03, 5.942e-02, -7.202e-02, 1.352e-01)); + r += mul(s3_8, M4(3.820e-02, 1.063e-02, -8.922e-03, 7.153e-02, -8.104e-03, -1.760e-02, 6.000e-03, -6.468e-02, 9.946e-05, 3.195e-04, -8.201e-03, -3.610e-03, -3.006e-02, -3.924e-02, -1.292e-02, -1.219e-01)); + r += mul(s4_0, M4(-2.191e-02, 1.599e-02, 8.420e-03, -1.086e-02, 2.063e-02, -2.956e-02, -7.893e-03, 2.008e-02, -5.920e-02, 3.584e-02, -4.143e-03, -6.872e-03, 1.034e-01, -3.611e-02, -3.573e-02, -1.497e-02)); + r += mul(s4_1, M4(1.523e-02, 2.486e-03, -4.195e-03, 2.462e-02, -3.835e-02, -2.553e-02, -1.036e-03, -2.996e-02, 1.417e-01, -1.515e-01, -4.471e-02, -3.221e-03, -6.459e-02, 1.255e-01, 2.417e-02, -6.074e-02)); + r += mul(s4_2, M4(1.616e-02, 1.592e-03, -3.734e-04, 2.990e-03, -1.443e-02, 5.308e-03, -5.084e-03, -1.204e-02, -6.789e-03, 2.961e-02, -2.044e-04, -7.314e-03, 2.294e-03, -4.090e-02, -5.013e-03, 9.427e-03)); + r += mul(s4_3, M4(3.806e-02, 5.284e-03, 2.402e-02, -8.429e-03, -1.201e-01, 6.213e-02, -4.133e-02, -1.134e-02, -1.802e-02, -3.513e-03, -7.280e-02, 2.804e-02, -4.772e-02, 9.656e-03, 3.899e-02, 2.222e-02)); + r += mul(s4_4, M4(7.007e-02, 6.686e-02, 8.883e-02, 1.203e-01, -2.129e-02, -1.151e-01, -6.914e-02, -4.476e-02, 2.397e-01, -2.011e-01, 4.795e-01, -2.961e-01, 2.885e-02, 1.705e-02, -1.239e-02, 9.686e-02)); + r += mul(s4_5, M4(3.543e-03, 3.091e-02, 6.047e-03, 8.998e-03, 2.942e-02, -1.122e-02, 2.545e-02, 3.955e-02, 6.927e-03, 1.410e-02, -3.543e-03, 8.472e-02, -5.371e-03, -3.867e-02, 3.605e-03, -6.078e-02)); + r += mul(s4_6, M4(-1.860e-02, 7.303e-03, 1.120e-02, 2.374e-02, 3.594e-02, 2.375e-04, 1.775e-02, 1.066e-03, -1.177e-02, 1.460e-02, -4.779e-03, 1.629e-02, 1.071e-02, -4.558e-03, -5.317e-03, 2.159e-03)); + r += mul(s4_7, M4(7.506e-03, -5.090e-02, -8.668e-02, -8.096e-02, 8.813e-02, -7.846e-03, -3.904e-02, 3.086e-03, -1.394e-02, -2.948e-02, -5.211e-02, -6.857e-02, 2.448e-02, -5.364e-03, 2.122e-02, 4.570e-03)); + r += mul(s4_8, M4(-4.065e-02, 6.996e-03, -2.539e-03, -2.608e-02, -2.044e-02, 1.642e-02, -3.448e-03, -3.108e-02, -1.187e-02, 1.531e-02, -1.770e-03, -2.646e-02, 1.698e-03, 3.386e-03, -4.599e-04, 1.508e-02)); + r += mul(s5_0, M4(-3.917e-02, 1.278e-02, 9.730e-03, -1.230e-02, 1.849e-02, -1.271e-02, -6.797e-03, 1.483e-02, -7.229e-02, 2.299e-02, 1.742e-03, -1.202e-02, -6.162e-02, -5.012e-02, -8.717e-02, 4.267e-02)); + r += mul(s5_1, M4(6.843e-03, -1.568e-02, 1.219e-02, 3.503e-02, -4.625e-02, -1.223e-02, 7.350e-03, -3.099e-02, 3.045e-02, -1.862e-02, -4.702e-02, 5.099e-03, -2.587e-01, 5.690e-01, 1.235e-01, -2.007e-01)); + r += mul(s5_2, M4(1.341e-03, -1.622e-02, 1.479e-03, 1.092e-02, -1.340e-02, -1.026e-04, -3.321e-03, -1.172e-02, 1.401e-03, 2.405e-02, 1.919e-03, -8.970e-03, 8.486e-03, -7.278e-02, -1.391e-03, 1.960e-02)); + r += mul(s5_3, M4(4.673e-02, -1.780e-03, 3.273e-03, -9.909e-03, -5.724e-02, 8.129e-02, -8.664e-02, 5.244e-03, -1.026e-02, -1.886e-02, -9.682e-02, 1.553e-02, -6.835e-02, -1.168e-02, 2.514e-01, -7.690e-02)); + r += mul(s5_4, M4(4.072e-01, 2.885e-01, -5.578e-02, -3.700e-03, 8.928e-02, -3.925e-01, -3.394e-02, 3.251e-02, 7.202e-02, -3.607e-02, 2.310e-01, -3.091e-02, 5.465e-02, -9.662e-03, -6.141e-02, 6.591e-02)); + r += mul(s5_5, M4(-2.544e-02, 1.331e-01, 8.448e-03, -3.918e-02, 2.213e-02, 2.838e-02, 1.538e-02, 2.403e-02, 1.911e-02, 2.710e-02, 7.796e-03, 8.987e-02, -9.308e-03, -4.751e-02, 6.841e-03, -3.261e-02)); + r += mul(s5_6, M4(-2.069e-02, -3.251e-03, -5.082e-03, 2.418e-02, 3.796e-02, -8.759e-03, 7.109e-02, -5.937e-03, -3.786e-03, 9.591e-03, 5.923e-03, 2.273e-03, 1.387e-02, -2.745e-04, 2.036e-04, -2.293e-04)); + r += mul(s5_7, M4(6.661e-02, -1.094e-02, -2.950e-01, -2.125e-01, 1.325e-01, 5.139e-02, -2.472e-01, 1.490e-01, -1.114e-02, -2.533e-02, -7.544e-02, -4.432e-02, 2.411e-02, -3.858e-03, 1.384e-02, 1.214e-02)); + r += mul(s5_8, M4(-3.374e-02, 2.999e-02, 2.523e-03, -1.093e-01, -3.038e-02, -1.977e-02, 1.127e-02, -1.055e-02, -1.511e-02, 9.979e-03, 6.345e-04, -2.642e-02, 4.375e-04, 3.018e-05, -5.478e-03, 4.899e-03)); + r += mul(s6_0, M4(-2.830e-02, 9.871e-03, 6.143e-05, -6.840e-03, 5.058e-02, -6.543e-03, -3.699e-04, 1.024e-02, -2.405e-02, 3.026e-02, 1.567e-02, -2.056e-02, -1.371e-02, 4.031e-03, 1.189e-02, -1.115e-02)); + r += mul(s6_1, M4(1.517e-02, -1.438e-02, -2.525e-02, -2.799e-04, 5.445e-02, -4.351e-02, 2.541e-02, 2.961e-02, 6.570e-03, 8.960e-02, -1.932e-02, -3.564e-03, -9.741e-02, 5.371e-02, -2.418e-03, 1.425e-02)); + r += mul(s6_2, M4(1.501e-03, -2.929e-02, 8.791e-03, -1.576e-03, 3.412e-03, 3.486e-03, 5.511e-03, 1.206e-02, 2.178e-02, -9.940e-03, -8.442e-04, -6.434e-04, 3.137e-02, -1.667e-02, -3.983e-02, 1.849e-02)); + r += mul(s6_3, M4(3.644e-02, -9.234e-03, 5.457e-02, -1.295e-02, 2.628e-02, -1.708e-02, 4.262e-02, 2.356e-02, -3.927e-02, 4.293e-03, 1.147e-02, 6.816e-03, 8.990e-03, -9.797e-03, -2.532e-02, 2.662e-02)); + r += mul(s6_4, M4(-1.298e-01, -1.232e-02, 2.945e-02, 1.442e-01, -2.046e-01, 1.258e-01, 9.591e-03, 4.317e-02, 6.559e-02, -1.613e-01, 1.265e-01, 1.035e-01, 2.189e-02, 7.561e-03, -3.462e-02, -1.081e-02)); + r += mul(s6_5, M4(1.315e-02, 3.954e-02, -2.993e-02, -3.069e-02, 7.408e-03, 4.444e-03, -2.900e-02, 1.511e-02, -2.136e-02, 4.019e-03, -9.298e-03, 2.916e-02, 6.284e-02, -1.254e-01, 1.126e-01, -8.404e-02)); + r += mul(s6_6, M4(-3.935e-02, -1.433e-03, -5.533e-02, 1.111e-03, -2.772e-02, 2.248e-02, -3.252e-03, -3.881e-02, 2.206e-04, -1.418e-02, -4.193e-02, 8.625e-03, -1.006e-03, 2.233e-03, -1.287e-02, -4.024e-03)); + r += mul(s6_7, M4(2.404e-01, -6.556e-02, -2.942e-01, -9.692e-02, 7.087e-02, -7.028e-02, -1.317e-01, -5.265e-02, -3.230e-02, 3.590e-02, -7.622e-02, -8.369e-02, 1.372e-02, -1.592e-02, -1.048e-02, -1.536e-02)); + r += mul(s6_8, M4(6.781e-02, -7.009e-03, 2.860e-02, 2.274e-01, -9.817e-03, 1.673e-02, 1.795e-02, -4.467e-02, 2.646e-03, -1.109e-02, 2.573e-03, -3.715e-02, -5.283e-02, 4.464e-02, 1.801e-02, 1.569e-02)); + r += mul(s7_0, M4(-2.424e-02, 1.016e-02, 3.816e-04, -8.696e-03, 8.698e-03, 2.044e-03, 1.042e-03, 1.691e-02, -2.034e-02, 3.552e-02, -5.592e-03, -2.426e-02, -4.224e-03, -3.754e-04, 1.771e-02, -1.581e-02)); + r += mul(s7_1, M4(1.328e-02, -1.689e-02, -2.691e-02, -2.634e-03, 1.176e-01, -1.653e-02, 5.465e-03, -2.580e-03, 4.724e-02, 9.344e-02, -4.456e-02, -3.431e-02, -3.025e-01, 9.328e-02, -1.246e-02, 2.387e-02)); + r += mul(s7_2, M4(-8.990e-04, -2.366e-02, 6.412e-03, -5.975e-03, -8.695e-03, 3.697e-03, 2.235e-02, 1.274e-02, 1.311e-02, 8.728e-03, -2.676e-04, -1.281e-02, 1.014e-02, 1.266e-01, -2.253e-02, 1.049e-02)); + r += mul(s7_3, M4(4.771e-02, -9.977e-03, 4.476e-02, -1.020e-02, 2.030e-01, -7.533e-03, 4.306e-02, -2.822e-02, -2.046e-01, 4.606e-03, 1.528e-01, -3.807e-03, 2.697e-02, -1.144e-02, -1.123e-02, 1.569e-02)); + r += mul(s7_4, M4(-8.972e-02, -1.116e-02, 1.027e-02, 1.296e-01, -9.394e-02, -2.126e-01, -1.783e-01, 3.546e-01, -9.159e-02, -4.756e-01, 2.339e-01, 3.902e-01, -1.207e-01, 7.496e-02, -3.850e-01, 9.175e-02)); + r += mul(s7_5, M4(-5.036e-03, 7.069e-02, -2.437e-02, -1.670e-02, 4.290e-03, 4.675e-02, -2.716e-02, 1.163e-02, -2.350e-02, -4.682e-03, -5.020e-03, 1.407e-02, -2.286e-02, 1.490e-01, 2.616e-02, 3.160e-01)); + r += mul(s7_6, M4(-3.243e-02, -3.122e-03, -5.286e-02, 7.820e-03, -2.416e-02, 4.868e-02, -1.168e-01, -1.736e-02, 1.028e-02, -1.177e-02, -1.715e-02, 3.846e-03, -2.036e-03, 2.827e-03, -1.091e-02, 1.062e-03)); + r += mul(s7_7, M4(1.390e-02, -8.685e-03, -2.752e-02, -1.309e-01, 5.806e-02, -5.186e-02, -7.078e-02, -8.618e-02, -3.155e-02, 4.158e-02, -8.837e-02, -4.630e-02, 1.249e-02, -4.217e-02, -8.350e-03, -2.970e-02)); + r += mul(s7_8, M4(1.165e-01, 1.334e-02, 1.667e-02, 9.542e-02, -1.276e-02, 1.212e-02, 1.332e-02, -4.138e-02, 2.104e-03, -5.048e-03, -1.939e-04, -5.239e-02, -4.374e-02, 5.139e-02, -7.104e-03, 3.513e-02)); + r += V4(-9.892e-05, -2.795e-04, -8.146e-04, -3.370e-04); + return tanh(r); +} + +void Pass18(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = (Rmp8x8(tid.x) << 1) + blockStart; + uint2 size = GetOutputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = ((gxy >> 1) + 0.5) * pt; + + V4 s0_0 = l0(-1.0, -1.0); + V4 s0_1 = l0(0.0, -1.0); + V4 s0_2 = l0(1.0, -1.0); + V4 s0_3 = l0(-1.0, 0.0); + V4 s0_4 = l0(0.0, 0.0); + V4 s0_5 = l0(1.0, 0.0); + V4 s0_6 = l0(-1.0, 1.0); + V4 s0_7 = l0(0.0, 1.0); + V4 s0_8 = l0(1.0, 1.0); + V4 s1_0 = -max(-s0_0, 0.0); + V4 s1_1 = -max(-s0_1, 0.0); + V4 s1_2 = -max(-s0_2, 0.0); + V4 s1_3 = -max(-s0_3, 0.0); + V4 s1_4 = -max(-s0_4, 0.0); + V4 s1_5 = -max(-s0_5, 0.0); + V4 s1_6 = -max(-s0_6, 0.0); + V4 s1_7 = -max(-s0_7, 0.0); + V4 s1_8 = -max(-s0_8, 0.0); + s0_0 = max(s0_0, 0.0); + s0_1 = max(s0_1, 0.0); + s0_2 = max(s0_2, 0.0); + s0_3 = max(s0_3, 0.0); + s0_4 = max(s0_4, 0.0); + s0_5 = max(s0_5, 0.0); + s0_6 = max(s0_6, 0.0); + s0_7 = max(s0_7, 0.0); + s0_8 = max(s0_8, 0.0); + + V4 s2_0 = l1(-1.0, -1.0); + V4 s2_1 = l1(0.0, -1.0); + V4 s2_2 = l1(1.0, -1.0); + V4 s2_3 = l1(-1.0, 0.0); + V4 s2_4 = l1(0.0, 0.0); + V4 s2_5 = l1(1.0, 0.0); + V4 s2_6 = l1(-1.0, 1.0); + V4 s2_7 = l1(0.0, 1.0); + V4 s2_8 = l1(1.0, 1.0); + V4 s3_0 = -max(-s2_0, 0.0); + V4 s3_1 = -max(-s2_1, 0.0); + V4 s3_2 = -max(-s2_2, 0.0); + V4 s3_3 = -max(-s2_3, 0.0); + V4 s3_4 = -max(-s2_4, 0.0); + V4 s3_5 = -max(-s2_5, 0.0); + V4 s3_6 = -max(-s2_6, 0.0); + V4 s3_7 = -max(-s2_7, 0.0); + V4 s3_8 = -max(-s2_8, 0.0); + s2_0 = max(s2_0, 0.0); + s2_1 = max(s2_1, 0.0); + s2_2 = max(s2_2, 0.0); + s2_3 = max(s2_3, 0.0); + s2_4 = max(s2_4, 0.0); + s2_5 = max(s2_5, 0.0); + s2_6 = max(s2_6, 0.0); + s2_7 = max(s2_7, 0.0); + s2_8 = max(s2_8, 0.0); + + V4 s4_0 = l2(-1.0, -1.0); + V4 s4_1 = l2(0.0, -1.0); + V4 s4_2 = l2(1.0, -1.0); + V4 s4_3 = l2(-1.0, 0.0); + V4 s4_4 = l2(0.0, 0.0); + V4 s4_5 = l2(1.0, 0.0); + V4 s4_6 = l2(-1.0, 1.0); + V4 s4_7 = l2(0.0, 1.0); + V4 s4_8 = l2(1.0, 1.0); + V4 s5_0 = -max(-s4_0, 0.0); + V4 s5_1 = -max(-s4_1, 0.0); + V4 s5_2 = -max(-s4_2, 0.0); + V4 s5_3 = -max(-s4_3, 0.0); + V4 s5_4 = -max(-s4_4, 0.0); + V4 s5_5 = -max(-s4_5, 0.0); + V4 s5_6 = -max(-s4_6, 0.0); + V4 s5_7 = -max(-s4_7, 0.0); + V4 s5_8 = -max(-s4_8, 0.0); + s4_0 = max(s4_0, 0.0); + s4_1 = max(s4_1, 0.0); + s4_2 = max(s4_2, 0.0); + s4_3 = max(s4_3, 0.0); + s4_4 = max(s4_4, 0.0); + s4_5 = max(s4_5, 0.0); + s4_6 = max(s4_6, 0.0); + s4_7 = max(s4_7, 0.0); + s4_8 = max(s4_8, 0.0); + + V4 s6_0 = l3(-1.0, -1.0); + V4 s6_1 = l3(0.0, -1.0); + V4 s6_2 = l3(1.0, -1.0); + V4 s6_3 = l3(-1.0, 0.0); + V4 s6_4 = l3(0.0, 0.0); + V4 s6_5 = l3(1.0, 0.0); + V4 s6_6 = l3(-1.0, 1.0); + V4 s6_7 = l3(0.0, 1.0); + V4 s6_8 = l3(1.0, 1.0); + V4 s7_0 = -max(-s6_0, 0.0); + V4 s7_1 = -max(-s6_1, 0.0); + V4 s7_2 = -max(-s6_2, 0.0); + V4 s7_3 = -max(-s6_3, 0.0); + V4 s7_4 = -max(-s6_4, 0.0); + V4 s7_5 = -max(-s6_5, 0.0); + V4 s7_6 = -max(-s6_6, 0.0); + V4 s7_7 = -max(-s6_7, 0.0); + V4 s7_8 = -max(-s6_8, 0.0); + s6_0 = max(s6_0, 0.0); + s6_1 = max(s6_1, 0.0); + s6_2 = max(s6_2, 0.0); + s6_3 = max(s6_3, 0.0); + s6_4 = max(s6_4, 0.0); + s6_5 = max(s6_5, 0.0); + s6_6 = max(s6_6, 0.0); + s6_7 = max(s6_7, 0.0); + s6_8 = max(s6_8, 0.0); + + V4 r = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + + static const float3x3 rgb2yuv = {0.299, 0.587, 0.114, -0.169, -0.331, 0.5, 0.5, -0.419, -0.081}; + static const float3x3 yuv2rgb = {1, -0.00093, 1.401687, 1, -0.3437, -0.71417, 1, 1.77216, 0.00099}; + float2 opt = float2(GetOutputPt()); + + pos -= 0.5f * opt; + float3 yuv = mul(rgb2yuv, INPUT.SampleLevel(SL, pos, 0).rgb); + OUTPUT[gxy] = float4(mul(yuv2rgb, float3(saturate(yuv.r + r.x), yuv.yz)), 1); + + ++gxy.x; + pos.x += opt.x; + yuv = mul(rgb2yuv, INPUT.SampleLevel(SL, pos, 0).rgb); + OUTPUT[gxy] = float4(mul(yuv2rgb, float3(saturate(yuv.r + r.y), yuv.yz)), 1); + + ++gxy.y; + pos.y += opt.y; + yuv = mul(rgb2yuv, INPUT.SampleLevel(SL, pos, 0).rgb); + OUTPUT[gxy] = float4(mul(yuv2rgb, float3(saturate(yuv.r + r.w), yuv.yz)), 1); + + --gxy.x; + pos.x -= opt.x; + yuv = mul(rgb2yuv, INPUT.SampleLevel(SL, pos, 0).rgb); + OUTPUT[gxy] = float4(mul(yuv2rgb, float3(saturate(yuv.r + r.z), yuv.yz)), 1); +} diff --git a/src/Effects/CuNNy/CuNNy-2x4C-NVL-DN.hlsl b/src/Effects/CuNNy/CuNNy-2x4C-NVL-DN.hlsl new file mode 100644 index 000000000..d59cf8d1c --- /dev/null +++ b/src/Effects/CuNNy/CuNNy-2x4C-NVL-DN.hlsl @@ -0,0 +1,340 @@ +// CuNNy 2x4C BILINEAR RGB NVL DN - https://github.com/cunnyplapper/CuNNy + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +//!MAGPIE EFFECT +//!VERSION 4 +//!SORT_NAME CuNNy-DN-D04N02 + +//!TEXTURE +Texture2D INPUT; + +//!TEXTURE +//!WIDTH INPUT_WIDTH * 2 +//!HEIGHT INPUT_HEIGHT * 2 +Texture2D OUTPUT; + +//!SAMPLER +//!FILTER POINT +SamplerState SP; + +//!SAMPLER +//!FILTER LINEAR +SamplerState SL; + +//!COMMON +#define O(t, p) t.SampleLevel(SP, pos + p * pt, 0) +#define V4 min16float4 +#define M4 min16float4x4 + +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +//!FORMAT R8G8B8A8_SNORM +Texture2D t0; + +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +//!FORMAT R8G8B8A8_SNORM +Texture2D t1; + +//!PASS 1 +//!DESC in +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 +//!IN INPUT +//!OUT t0 + +#define l0(x, y) min16float((dot(float3(-3.725e-01, -7.046e-01, -1.734e-01), O(INPUT, float2(x, y)).rgb) + 1.169e-01)) + +V4 f0(min16float s0_0, min16float s0_1, min16float s0_2, min16float s0_3, min16float s0_4, min16float s0_5, min16float s0_6, min16float s0_7, min16float s0_8) { + V4 r = 0.0; + r += V4(-2.745e-03, -2.925e-03, 1.135e-01, 3.162e-02) * s0_0; + r += V4(4.049e-03, -3.428e-01, -7.641e-02, 2.484e-02) * s0_1; + r += V4(-8.372e-03, 3.398e-01, 1.072e-01, -5.449e-02) * s0_2; + r += V4(1.592e-02, 1.884e-02, -3.160e-02, -7.727e-02) * s0_3; + r += V4(4.429e-01, -3.936e-01, -4.134e-01, -4.287e-01) * s0_4; + r += V4(4.556e-02, 3.754e-01, -2.300e-02, 4.971e-01) * s0_5; + r += V4(-2.031e-02, -6.662e-03, 8.906e-02, 4.602e-02) * s0_6; + r += V4(-4.365e-01, 2.183e-03, 8.609e-02, 9.402e-03) * s0_7; + r += V4(-3.845e-02, 5.695e-03, 9.645e-02, -5.310e-02) * s0_8; + r += V4(1.492e-02, -1.961e-02, -7.539e-03, -3.574e-03); + return r; +} + +void Pass1(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = Rmp8x8(tid.x) + blockStart; + uint2 size = GetInputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = (gxy + 0.5) * pt; + + min16float s0_0 = l0(-1.0, -1.0); + min16float s0_1 = l0(0.0, -1.0); + min16float s0_2 = l0(1.0, -1.0); + min16float s0_3 = l0(-1.0, 0.0); + min16float s0_4 = l0(0.0, 0.0); + min16float s0_5 = l0(1.0, 0.0); + min16float s0_6 = l0(-1.0, 1.0); + min16float s0_7 = l0(0.0, 1.0); + min16float s0_8 = l0(1.0, 1.0); + + t0[gxy] = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8); +} + +//!PASS 2 +//!DESC conv1 +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 +//!IN t0 +//!OUT t1 + +#define l0(x, y) V4(O(t0, float2(x, y))) + +V4 f0(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8) { + V4 r = 0.0; + r += mul(s0_0, M4(1.218e-02, -1.208e-01, -1.955e-01, -1.217e-01, 3.123e-02, -2.317e-02, 1.961e-01, -9.984e-02, 3.038e-03, 2.863e-02, -1.042e-01, -5.529e-02, 1.266e-01, -3.877e-01, 2.315e-01, -1.334e-01)); + r += mul(s0_1, M4(-1.774e-02, 1.636e-01, 1.379e-01, 7.499e-03, -7.890e-02, -3.970e-02, -6.053e-02, -1.431e-02, 4.167e-02, 9.728e-02, 3.825e-02, -2.704e-02, -2.303e-01, -3.348e-01, 2.940e-01, 4.825e-02)); + r += mul(s0_2, M4(1.239e-02, 1.613e-02, -2.280e-01, 8.985e-02, 2.106e-03, 3.847e-02, -2.539e-02, -3.326e-02, -6.327e-02, -1.427e-01, 4.218e-02, 8.995e-02, -6.045e-02, -1.073e-01, -1.329e-01, -2.085e-02)); + r += mul(s0_3, M4(-1.601e-01, -2.448e-01, -3.950e-01, 9.169e-03, -3.694e-02, 2.018e-01, -2.524e-01, 1.719e+00, 3.009e-02, 4.927e-02, 1.564e-01, 3.509e-02, -2.630e-02, -3.986e-01, 1.326e-01, -1.037e-02)); + r += mul(s0_4, M4(-1.074e+00, -1.654e-01, 4.163e-01, 3.816e-02, 4.580e-01, 4.350e-01, -3.490e-01, -1.257e-02, 1.159e-02, -2.083e-01, -2.744e-01, -2.667e-02, 2.826e-03, 1.986e-01, -2.723e-01, 9.612e-02)); + r += mul(s0_5, M4(-3.195e-01, -1.450e-01, -1.523e-01, -2.999e-03, 1.166e-01, 1.304e-01, 1.475e-01, 7.286e-02, -4.077e-02, -3.477e-02, 1.496e-01, -1.199e-02, 7.881e-02, 8.911e-02, -1.082e-01, -6.762e-02)); + r += mul(s0_6, M4(2.020e-02, 1.556e-01, -9.837e-03, 1.537e-02, -1.047e-01, 2.095e-01, 2.025e-01, -3.522e-02, -3.407e-02, -8.949e-02, -7.721e-02, -8.910e-03, 9.305e-02, 2.231e-01, 2.178e-01, 1.502e-02)); + r += mul(s0_7, M4(-7.936e-02, 3.096e-01, 1.869e-01, -1.950e-03, -2.452e-01, -5.098e-01, 5.304e-01, -4.921e-02, -1.073e-01, 1.062e-01, 2.527e-01, 5.909e-04, 3.797e-02, 3.291e-01, -2.395e-01, 2.768e-02)); + r += mul(s0_8, M4(-5.559e-02, 1.090e-01, -1.757e-01, 1.261e-02, -1.632e-01, -2.476e-01, -5.674e-02, -4.843e-03, 1.064e-02, 1.023e-01, 2.540e-02, -1.336e-02, 1.362e-01, 1.833e-01, 3.772e-03, 5.118e-04)); + r += mul(s1_0, M4(1.383e-01, 3.469e-01, 3.568e-02, -1.958e-01, -3.170e-02, -1.076e-02, -2.012e-02, -2.104e-04, 2.046e-02, -1.268e-02, -1.618e-01, -6.370e-02, 2.615e-02, 1.494e-01, -1.523e-01, 3.702e-02)); + r += mul(s1_1, M4(-1.140e-02, 6.811e-01, 5.722e-02, 1.514e-01, -6.311e-02, -3.541e-02, -1.150e-01, 3.625e-02, 1.146e-01, -1.395e-03, 5.059e-01, -7.835e-02, -3.907e-01, 6.172e-02, -9.656e-02, -2.727e-02)); + r += mul(s1_2, M4(1.239e-01, 1.206e-01, 7.519e-01, 2.106e-02, 8.647e-03, 1.082e-02, 5.931e-02, -4.215e-02, -2.216e-02, -4.829e-02, -1.927e-01, 1.159e-01, -1.789e-01, -9.596e-02, 1.395e-01, -6.395e-02)); + r += mul(s1_3, M4(1.194e-01, -5.786e-01, -1.761e-03, -1.126e-02, -5.311e-02, -2.325e-01, 1.733e-01, 2.842e-01, -1.080e-01, -1.012e-01, 1.851e-01, 4.253e-02, 1.212e-01, 2.435e-02, -3.061e-01, -9.579e-02)); + r += mul(s1_4, M4(-4.651e-02, -1.299e+00, -5.020e-01, 5.830e-02, 5.098e-01, 7.344e-02, -1.358e-01, 1.725e-02, -2.980e-01, -6.077e-01, 6.308e-01, -4.014e-02, 3.497e-01, 3.700e-01, -6.035e-01, 8.026e-02)); + r += mul(s1_5, M4(-1.851e-02, -2.057e-01, 5.081e-01, -5.262e-02, 1.715e-01, 1.387e-01, -1.123e-01, 9.022e-02, -1.532e-01, -3.749e-02, -1.930e-01, 6.423e-02, 2.763e-02, 5.993e-02, 4.141e-01, -8.825e-02)); + r += mul(s1_6, M4(-6.324e-03, -9.461e-02, 3.044e-02, -4.139e-03, -2.925e-02, 3.975e-01, 1.161e-01, 9.726e-03, 1.353e-01, 2.762e-01, 3.297e-03, 1.076e-02, -8.503e-02, -7.010e-01, -1.967e-01, -1.360e-03)); + r += mul(s1_7, M4(1.873e-02, 1.099e-01, 1.229e-01, -1.232e-02, -5.723e-01, -4.599e-02, -1.236e-01, -2.003e-02, -4.268e-01, 5.929e-01, 2.942e-01, 3.485e-02, 4.326e-01, -9.250e-02, 3.736e-01, -2.393e-02)); + r += mul(s1_8, M4(-5.991e-02, 1.199e-03, -1.349e-02, -1.321e-03, -2.036e-01, -1.937e-01, -7.888e-02, -9.144e-03, 1.557e-01, 7.018e-02, -2.646e-01, -3.360e-06, 1.742e-01, 1.814e-01, 1.385e-01, -1.030e-02)); + r += V4(4.789e-02, 4.713e-03, -2.854e-02, 9.967e-03); + return r; +} + +void Pass2(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = Rmp8x8(tid.x) + blockStart; + uint2 size = GetInputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = (gxy + 0.5) * pt; + + V4 s0_0 = l0(-1.0, -1.0); + V4 s0_1 = l0(0.0, -1.0); + V4 s0_2 = l0(1.0, -1.0); + V4 s0_3 = l0(-1.0, 0.0); + V4 s0_4 = l0(0.0, 0.0); + V4 s0_5 = l0(1.0, 0.0); + V4 s0_6 = l0(-1.0, 1.0); + V4 s0_7 = l0(0.0, 1.0); + V4 s0_8 = l0(1.0, 1.0); + V4 s1_0 = -max(-s0_0, 0.0); + V4 s1_1 = -max(-s0_1, 0.0); + V4 s1_2 = -max(-s0_2, 0.0); + V4 s1_3 = -max(-s0_3, 0.0); + V4 s1_4 = -max(-s0_4, 0.0); + V4 s1_5 = -max(-s0_5, 0.0); + V4 s1_6 = -max(-s0_6, 0.0); + V4 s1_7 = -max(-s0_7, 0.0); + V4 s1_8 = -max(-s0_8, 0.0); + s0_0 = max(s0_0, 0.0); + s0_1 = max(s0_1, 0.0); + s0_2 = max(s0_2, 0.0); + s0_3 = max(s0_3, 0.0); + s0_4 = max(s0_4, 0.0); + s0_5 = max(s0_5, 0.0); + s0_6 = max(s0_6, 0.0); + s0_7 = max(s0_7, 0.0); + s0_8 = max(s0_8, 0.0); + + t1[gxy] = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8); +} + +//!PASS 3 +//!DESC conv2 +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 +//!IN t1 +//!OUT t0 + +#define l0(x, y) V4(O(t1, float2(x, y))) + +V4 f0(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-1.565e-01, 1.307e-02, -5.269e-02, 5.465e-02, 2.936e-01, 1.626e-01, 4.589e-02, 2.478e-02, 3.520e-01, -5.445e-02, -2.480e-01, 2.838e-02, 1.841e-04, 1.264e-02, -1.370e-02, 2.588e-02)); + r += mul(s0_1, M4(2.350e-01, 2.116e-01, 2.167e-02, -1.559e-01, 2.502e-01, 4.320e-01, -7.152e-01, 2.270e-01, -2.668e-01, -2.117e-01, 5.598e-01, 2.261e-01, 4.101e-02, -4.860e-02, 3.530e-02, 8.932e-02)); + r += mul(s0_2, M4(-4.398e-02, -4.486e-02, -5.040e-02, 9.803e-02, 7.515e-02, 1.203e-01, -5.357e-02, -2.803e-01, -1.435e-01, 7.150e-03, -3.118e-02, -2.636e-01, -2.969e-02, -2.011e-02, 2.658e-02, -2.572e-02)); + r += mul(s0_3, M4(9.140e-02, -1.875e-01, 9.757e-02, 2.976e-02, -8.325e-02, 6.109e-02, -4.304e-02, 7.057e-02, 7.324e-01, -1.528e-01, 2.930e-01, 7.503e-02, -3.901e-02, 1.109e-03, -2.693e-02, -3.330e-02)); + r += mul(s0_4, M4(-9.944e-02, 1.858e-01, -2.436e-01, 3.822e-02, 6.685e-02, -1.758e-01, 1.382e-01, -1.715e-01, 3.252e-01, 5.176e-01, -2.939e-01, 4.311e-01, -6.125e-02, 1.905e-01, 8.140e-02, 2.095e-01)); + r += mul(s0_5, M4(3.193e-02, 6.029e-02, 1.869e-03, 8.627e-04, -1.402e-02, 4.288e-02, -5.756e-02, 8.813e-02, -2.758e-02, -5.267e-02, 1.702e-03, -6.676e-01, 6.373e-02, 5.766e-02, -6.325e-02, -2.744e-01)); + r += mul(s0_6, M4(4.918e-02, 5.420e-04, 3.692e-02, 7.796e-03, -1.163e-02, -4.074e-02, 2.057e-02, -2.837e-02, 1.083e-01, 1.958e-01, -5.078e-02, 2.750e-02, 5.323e-02, 5.953e-03, 4.766e-02, -2.265e-03)); + r += mul(s0_7, M4(-3.968e-02, -1.535e-01, 6.564e-02, -2.620e-02, 3.742e-02, 8.659e-02, -4.440e-02, 6.007e-03, -9.585e-02, -9.425e-02, -1.517e-01, 3.701e-01, -1.332e-01, -1.860e-01, -5.436e-02, 3.781e-01)); + r += mul(s0_8, M4(-1.145e-02, 6.045e-02, -4.676e-02, -5.604e-02, -1.576e-02, -3.528e-02, 2.252e-02, 1.997e-02, -2.546e-02, -6.894e-02, 7.238e-02, -3.495e-01, -6.323e-02, -1.042e-01, 1.091e-01, -4.170e-01)); + r += mul(s1_0, M4(-5.215e-01, 6.255e-01, 5.587e-02, -5.362e-02, 9.895e-02, -8.743e-03, 1.058e-01, -3.585e-02, -1.594e-02, -1.034e-01, 3.848e-02, -5.432e-02, -1.796e-02, 5.838e-02, 1.304e-01, -2.122e-02)); + r += mul(s1_1, M4(-6.987e-02, 8.696e-01, -1.130e+00, 5.558e-03, -1.080e-01, 4.195e-02, -1.323e-01, 2.270e-01, 3.451e-02, -1.616e-02, 4.251e-03, 1.470e-01, 2.442e-01, -5.904e-02, -3.467e-01, -2.056e-02)); + r += mul(s1_2, M4(4.884e-02, -1.034e-01, 5.823e-02, 1.131e-01, -4.126e-02, 6.519e-02, -1.532e-02, -2.420e-01, 1.092e-02, 1.869e-02, 1.913e-03, -1.787e-02, 1.122e-01, -1.481e-01, 1.843e-01, 3.454e-01)); + r += mul(s1_3, M4(-2.906e-01, -9.847e-01, 4.092e-01, 1.655e-01, 4.092e-02, 2.913e-01, 1.306e-01, -4.682e-02, 2.568e-01, -4.528e-02, 3.207e-02, 9.888e-02, -3.928e-01, -3.546e-01, -2.367e-01, -3.239e-01)); + r += mul(s1_4, M4(4.463e-01, -1.594e-01, 8.418e-01, -3.525e-01, 5.957e-01, 1.082e+00, -9.245e-01, 2.726e-01, 1.210e-01, 2.024e-01, -8.063e-03, -2.433e-01, -1.512e+00, 9.316e-01, 2.305e-01, -5.109e-01)); + r += mul(s1_5, M4(-2.393e-02, 1.286e-02, -9.453e-02, 3.071e-01, -1.402e-01, -2.436e-01, 1.202e-01, -1.409e-01, -1.857e-02, 2.421e-02, -2.642e-02, -7.415e-02, 8.786e-01, 5.260e-04, -9.212e-02, 1.849e-01)); + r += mul(s1_6, M4(8.958e-02, 9.057e-02, 1.712e-02, -2.838e-02, -1.405e-01, -6.455e-02, -2.695e-02, -1.110e-02, 8.731e-03, 6.531e-02, -3.752e-02, 1.194e-01, 4.585e-01, 6.270e-01, -1.367e-01, -2.529e-01)); + r += mul(s1_7, M4(-4.381e-02, -1.595e-02, -4.601e-02, 7.257e-02, -8.036e-02, -1.360e-01, 1.154e-01, -7.942e-02, -4.653e-02, -7.121e-02, 2.720e-02, 8.346e-02, -1.871e+00, -8.300e-01, -6.760e-01, 7.402e-01)); + r += mul(s1_8, M4(1.359e-02, -2.489e-02, 3.529e-02, -1.121e-01, -6.190e-02, -2.628e-02, -2.090e-03, 2.359e-01, -2.412e-02, -2.463e-02, 8.317e-03, -5.330e-02, 2.105e+00, 1.550e-01, 1.457e+00, -1.129e+00)); + r += V4(7.359e-03, -1.132e-02, 1.248e-02, 7.243e-04); + return r; +} + +void Pass3(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = Rmp8x8(tid.x) + blockStart; + uint2 size = GetInputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = (gxy + 0.5) * pt; + + V4 s0_0 = l0(-1.0, -1.0); + V4 s0_1 = l0(0.0, -1.0); + V4 s0_2 = l0(1.0, -1.0); + V4 s0_3 = l0(-1.0, 0.0); + V4 s0_4 = l0(0.0, 0.0); + V4 s0_5 = l0(1.0, 0.0); + V4 s0_6 = l0(-1.0, 1.0); + V4 s0_7 = l0(0.0, 1.0); + V4 s0_8 = l0(1.0, 1.0); + V4 s1_0 = -max(-s0_0, 0.0); + V4 s1_1 = -max(-s0_1, 0.0); + V4 s1_2 = -max(-s0_2, 0.0); + V4 s1_3 = -max(-s0_3, 0.0); + V4 s1_4 = -max(-s0_4, 0.0); + V4 s1_5 = -max(-s0_5, 0.0); + V4 s1_6 = -max(-s0_6, 0.0); + V4 s1_7 = -max(-s0_7, 0.0); + V4 s1_8 = -max(-s0_8, 0.0); + s0_0 = max(s0_0, 0.0); + s0_1 = max(s0_1, 0.0); + s0_2 = max(s0_2, 0.0); + s0_3 = max(s0_3, 0.0); + s0_4 = max(s0_4, 0.0); + s0_5 = max(s0_5, 0.0); + s0_6 = max(s0_6, 0.0); + s0_7 = max(s0_7, 0.0); + s0_8 = max(s0_8, 0.0); + + t0[gxy] = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8); +} + +//!PASS 4 +//!DESC out-shuffle +//!BLOCK_SIZE 16 +//!NUM_THREADS 64 +//!IN INPUT, t0 +//!OUT OUTPUT + +#define l0(x, y) V4(O(t0, float2(x, y))) + +V4 f0(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8) { + V4 r = 0.0; + r += mul(s0_0, M4(8.642e-03, -1.295e-02, 1.998e-02, -1.289e-03, -4.147e-02, -4.021e-03, 1.491e-04, -7.275e-03, 1.574e-02, -4.122e-03, 1.126e-02, 8.962e-03, 5.174e-02, 3.405e-02, 4.993e-02, 4.529e-02)); + r += mul(s0_1, M4(-1.028e-01, -2.764e-02, -2.777e-02, -7.170e-03, -8.365e-02, 3.550e-02, 1.288e-01, 2.475e-02, 5.017e-02, 5.917e-02, 3.473e-02, 8.510e-03, 2.332e-02, 8.047e-02, 9.838e-02, 4.234e-02)); + r += mul(s0_2, M4(-2.319e-02, -4.432e-02, -1.679e-02, 8.855e-03, 3.259e-02, -1.974e-01, 5.938e-02, 1.616e-01, -5.605e-04, 3.183e-02, -3.356e-03, 3.138e-02, 9.572e-03, -3.887e-02, -2.632e-02, -1.161e-02)); + r += mul(s0_3, M4(-2.947e-02, -4.358e-02, 1.208e-03, -2.705e-02, -1.037e-02, -6.812e-02, -5.436e-02, -3.840e-02, 3.684e-02, 2.560e-02, 1.715e-02, -3.670e-02, -5.930e-02, -2.310e-02, -6.163e-02, -3.562e-02)); + r += mul(s0_4, M4(5.520e-01, 1.213e-01, 1.753e-01, 5.436e-02, 5.879e-01, 2.281e-01, -2.703e-01, 1.519e-01, 5.739e-01, 2.959e-01, 9.449e-02, 2.473e-02, -5.998e-01, -9.548e-02, -6.035e-01, -9.663e-02)); + r += mul(s0_5, M4(-9.740e-02, 2.744e-01, -1.522e-01, -7.204e-02, 1.178e-01, 6.112e-01, -4.801e-02, -5.176e-01, 1.480e-02, 8.323e-02, -6.764e-02, 4.138e-02, 1.121e-01, -8.141e-02, 1.211e-01, -8.737e-02)); + r += mul(s0_6, M4(6.315e-02, 6.323e-02, 1.146e-02, 3.378e-02, -9.598e-02, -1.089e-01, 2.780e-02, -6.091e-02, -1.194e-01, -1.038e-01, -2.147e-02, -4.236e-02, -2.300e-02, -3.184e-02, -1.560e-02, -2.206e-02)); + r += mul(s0_7, M4(-1.772e-01, -1.304e-01, 1.265e-01, -7.871e-02, 1.978e-01, 1.074e-01, 1.240e-02, 4.600e-02, 1.558e-02, -3.196e-02, 2.018e-01, 1.496e-01, 1.421e-01, 8.472e-02, 7.432e-02, 9.935e-02)); + r += mul(s0_8, M4(1.132e-02, -2.296e-03, 1.274e-01, 3.428e-01, -5.796e-02, -6.156e-02, -2.549e-01, -2.231e-01, -8.762e-02, -9.318e-02, -2.378e-01, -3.018e-01, 5.601e-03, -2.670e-02, 2.896e-02, -3.910e-02)); + r += mul(s1_0, M4(4.603e-02, -2.582e-02, -9.045e-03, 1.446e-02, -1.835e-02, -2.533e-02, 3.681e-03, -9.420e-03, -5.802e-02, 2.310e-02, 3.059e-02, 1.313e-03, 9.639e-02, 8.284e-02, 1.071e-01, -3.287e-02)); + r += mul(s1_1, M4(-2.480e-02, 2.321e-03, -3.594e-02, -1.101e-01, 2.850e-02, 2.912e-02, 2.597e-02, 2.777e-02, 5.701e-02, 9.536e-04, 2.533e-02, 1.102e-02, -3.714e-03, 7.838e-02, -1.716e-02, 1.723e-01)); + r += mul(s1_2, M4(-4.473e-03, 1.521e-02, -1.887e-02, 6.731e-03, 2.199e-03, 2.965e-02, -3.709e-03, 1.671e-02, 1.376e-02, -4.819e-02, -8.832e-04, 3.531e-02, -8.453e-03, -1.276e-02, -1.461e-02, 4.460e-03)); + r += mul(s1_3, M4(6.139e-02, -1.511e-01, 1.102e-01, -1.428e-01, -5.114e-02, -6.594e-02, -1.693e-02, -4.651e-02, 2.440e-01, 2.010e-02, -1.900e-01, -1.243e-03, -2.397e-01, 2.002e-01, -3.506e-01, 2.171e-01)); + r += mul(s1_4, M4(-6.189e-02, 5.137e-01, -8.132e-02, 4.526e-01, 3.263e-01, 2.134e-01, 1.027e-01, 2.067e-02, 2.407e-01, 2.591e-01, 4.489e-01, 2.042e-01, 1.932e-02, -4.463e-01, -1.479e-01, -6.843e-01)); + r += mul(s1_5, M4(-7.571e-03, -7.787e-02, 9.918e-03, -8.469e-02, 4.056e-02, -1.926e-02, -4.968e-02, 2.416e-02, 2.699e-02, 2.783e-01, -7.854e-02, -6.549e-02, 6.835e-03, 2.288e-02, 1.048e-02, -3.273e-02)); + r += mul(s1_6, M4(7.034e-02, 4.236e-02, 7.905e-02, -2.283e-03, -8.423e-02, -7.784e-02, -7.540e-03, -3.373e-02, -1.019e-01, -1.421e-01, 6.713e-02, -8.716e-02, -6.980e-02, -4.731e-02, -3.086e-02, -6.210e-03)); + r += mul(s1_7, M4(-1.597e-01, -2.036e-01, 5.194e-02, 8.457e-02, 1.387e-01, 7.910e-02, 2.030e-02, 5.848e-02, 2.154e-01, 1.382e-01, -8.617e-02, 7.552e-02, 3.127e-02, 5.899e-02, 1.733e-01, 1.657e-01)); + r += mul(s1_8, M4(3.595e-02, 3.243e-02, 1.450e-01, 2.046e-01, -2.939e-02, -1.306e-02, -1.587e-01, -2.607e-01, -8.980e-02, -5.350e-02, -2.627e-01, -2.861e-01, -1.585e-02, -2.032e-02, -1.662e-02, 1.560e-02)); + r += V4(-7.528e-04, -8.388e-04, -1.247e-03, -1.205e-03); + return tanh(r); +} + +void Pass4(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = (Rmp8x8(tid.x) << 1) + blockStart; + uint2 size = GetOutputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = ((gxy >> 1) + 0.5) * pt; + + V4 s0_0 = l0(-1.0, -1.0); + V4 s0_1 = l0(0.0, -1.0); + V4 s0_2 = l0(1.0, -1.0); + V4 s0_3 = l0(-1.0, 0.0); + V4 s0_4 = l0(0.0, 0.0); + V4 s0_5 = l0(1.0, 0.0); + V4 s0_6 = l0(-1.0, 1.0); + V4 s0_7 = l0(0.0, 1.0); + V4 s0_8 = l0(1.0, 1.0); + V4 s1_0 = -max(-s0_0, 0.0); + V4 s1_1 = -max(-s0_1, 0.0); + V4 s1_2 = -max(-s0_2, 0.0); + V4 s1_3 = -max(-s0_3, 0.0); + V4 s1_4 = -max(-s0_4, 0.0); + V4 s1_5 = -max(-s0_5, 0.0); + V4 s1_6 = -max(-s0_6, 0.0); + V4 s1_7 = -max(-s0_7, 0.0); + V4 s1_8 = -max(-s0_8, 0.0); + s0_0 = max(s0_0, 0.0); + s0_1 = max(s0_1, 0.0); + s0_2 = max(s0_2, 0.0); + s0_3 = max(s0_3, 0.0); + s0_4 = max(s0_4, 0.0); + s0_5 = max(s0_5, 0.0); + s0_6 = max(s0_6, 0.0); + s0_7 = max(s0_7, 0.0); + s0_8 = max(s0_8, 0.0); + + V4 r = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8); + + static const float3x3 rgb2yuv = {0.299, 0.587, 0.114, -0.169, -0.331, 0.5, 0.5, -0.419, -0.081}; + static const float3x3 yuv2rgb = {1, -0.00093, 1.401687, 1, -0.3437, -0.71417, 1, 1.77216, 0.00099}; + float2 opt = float2(GetOutputPt()); + + pos -= 0.5f * opt; + float3 yuv = mul(rgb2yuv, INPUT.SampleLevel(SL, pos, 0).rgb); + OUTPUT[gxy] = float4(mul(yuv2rgb, float3(saturate(yuv.r + r.x), yuv.yz)), 1); + + ++gxy.x; + pos.x += opt.x; + yuv = mul(rgb2yuv, INPUT.SampleLevel(SL, pos, 0).rgb); + OUTPUT[gxy] = float4(mul(yuv2rgb, float3(saturate(yuv.r + r.y), yuv.yz)), 1); + + ++gxy.y; + pos.y += opt.y; + yuv = mul(rgb2yuv, INPUT.SampleLevel(SL, pos, 0).rgb); + OUTPUT[gxy] = float4(mul(yuv2rgb, float3(saturate(yuv.r + r.w), yuv.yz)), 1); + + --gxy.x; + pos.x -= opt.x; + yuv = mul(rgb2yuv, INPUT.SampleLevel(SL, pos, 0).rgb); + OUTPUT[gxy] = float4(mul(yuv2rgb, float3(saturate(yuv.r + r.z), yuv.yz)), 1); +} diff --git a/src/Effects/CuNNy/CuNNy-2x4C-NVL.hlsl b/src/Effects/CuNNy/CuNNy-2x4C-NVL.hlsl new file mode 100644 index 000000000..5e329b451 --- /dev/null +++ b/src/Effects/CuNNy/CuNNy-2x4C-NVL.hlsl @@ -0,0 +1,340 @@ +// CuNNy 2x4C BILINEAR RGB NVL - https://github.com/cunnyplapper/CuNNy + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +//!MAGPIE EFFECT +//!VERSION 4 +//!SORT_NAME CuNNy-D04N02 + +//!TEXTURE +Texture2D INPUT; + +//!TEXTURE +//!WIDTH INPUT_WIDTH * 2 +//!HEIGHT INPUT_HEIGHT * 2 +Texture2D OUTPUT; + +//!SAMPLER +//!FILTER POINT +SamplerState SP; + +//!SAMPLER +//!FILTER LINEAR +SamplerState SL; + +//!COMMON +#define O(t, p) t.SampleLevel(SP, pos + p * pt, 0) +#define V4 min16float4 +#define M4 min16float4x4 + +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +//!FORMAT R8G8B8A8_SNORM +Texture2D t0; + +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +//!FORMAT R8G8B8A8_SNORM +Texture2D t1; + +//!PASS 1 +//!DESC in +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 +//!IN INPUT +//!OUT t0 + +#define l0(x, y) min16float((dot(float3(-6.049e-01, -1.145e+00, -2.540e-01), O(INPUT, float2(x, y)).rgb) + 1.794e+00)) + +V4 f0(min16float s0_0, min16float s0_1, min16float s0_2, min16float s0_3, min16float s0_4, min16float s0_5, min16float s0_6, min16float s0_7, min16float s0_8) { + V4 r = 0.0; + r += V4(1.411e-01, -9.763e-03, -1.361e-01, -9.610e-04) * s0_0; + r += V4(6.068e-02, 7.238e-03, -1.182e-01, -1.535e-02) * s0_1; + r += V4(-8.549e-02, -2.876e-03, -8.740e-03, 1.652e-02) * s0_2; + r += V4(-3.249e-01, 5.392e-02, -8.518e-02, -7.437e-03) * s0_3; + r += V4(2.435e-02, -6.191e-01, 7.147e-01, 5.862e-01) * s0_4; + r += V4(1.968e-01, 1.868e-02, -1.723e-01, -5.801e-01) * s0_5; + r += V4(1.528e-01, -4.489e-02, 5.871e-03, 4.528e-03) * s0_6; + r += V4(-4.619e-01, 6.152e-01, -1.313e-01, -5.326e-02) * s0_7; + r += V4(2.902e-01, -1.801e-02, -6.907e-02, 5.105e-02) * s0_8; + r += V4(4.440e-03, -1.956e-04, 1.215e-03, 1.790e-03); + return r; +} + +void Pass1(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = Rmp8x8(tid.x) + blockStart; + uint2 size = GetInputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = (gxy + 0.5) * pt; + + min16float s0_0 = l0(-1.0, -1.0); + min16float s0_1 = l0(0.0, -1.0); + min16float s0_2 = l0(1.0, -1.0); + min16float s0_3 = l0(-1.0, 0.0); + min16float s0_4 = l0(0.0, 0.0); + min16float s0_5 = l0(1.0, 0.0); + min16float s0_6 = l0(-1.0, 1.0); + min16float s0_7 = l0(0.0, 1.0); + min16float s0_8 = l0(1.0, 1.0); + + t0[gxy] = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8); +} + +//!PASS 2 +//!DESC conv1 +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 +//!IN t0 +//!OUT t1 + +#define l0(x, y) V4(O(t0, float2(x, y))) + +V4 f0(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8) { + V4 r = 0.0; + r += mul(s0_0, M4(1.120e-01, 8.150e-03, 7.146e-02, -4.942e-02, 3.623e-01, -1.678e-01, 1.189e-01, 1.372e-01, 1.225e-01, -2.568e-02, 6.959e-02, 1.788e-02, 1.962e-01, -1.870e-01, -6.548e-03, -4.334e-02)); + r += mul(s0_1, M4(1.805e-01, 4.881e-02, -2.342e-03, 2.035e-02, -2.427e-01, -2.197e-02, -2.036e-02, 3.919e-01, -3.037e-01, 7.047e-02, 3.426e-02, -8.694e-02, 2.144e-01, 1.431e-01, -7.851e-02, 2.247e-01)); + r += mul(s0_2, M4(6.328e-02, -4.140e-02, 3.362e-02, 5.204e-02, -1.052e-01, 1.698e-01, -2.727e-03, 1.110e-01, 7.156e-02, -1.108e-02, -2.717e-02, 5.680e-02, -6.118e-02, 2.435e-02, 1.743e-02, 8.179e-02)); + r += mul(s0_3, M4(1.557e-01, 1.189e-01, 8.836e-02, 2.178e-02, -3.954e-01, 2.466e-01, -2.166e-01, -7.051e-02, -2.857e-01, -1.611e-02, -8.667e-02, 1.895e-04, 2.744e-01, 1.499e-01, 8.228e-02, 2.938e-02)); + r += mul(s0_4, M4(2.441e-01, -3.694e-01, 1.751e-01, 6.833e-01, -1.087e-01, -2.065e-01, -1.557e-01, -6.945e-02, -1.403e-02, 2.171e-02, 3.748e-02, 2.646e-01, -3.718e-01, -1.188e-01, 1.569e-01, 8.554e-02)); + r += mul(s0_5, M4(-5.069e-02, 2.646e-01, -5.754e-02, -3.545e-01, 1.404e-01, 1.123e-01, 4.577e-02, -1.465e-01, -2.119e-02, -1.115e-02, 1.661e-01, -4.029e-01, -2.123e-01, 2.774e-01, -1.905e-02, -1.093e-02)); + r += mul(s0_6, M4(2.593e-02, -1.801e-02, 9.053e-02, -2.721e-02, 6.658e-03, 3.802e-02, -3.282e-02, -1.116e-01, 1.201e-01, 2.095e-02, -2.061e-02, 2.498e-03, -1.831e-01, -1.743e-01, 1.062e-01, -6.113e-01)); + r += mul(s0_7, M4(-1.172e-01, -1.130e-02, -6.727e-02, 7.753e-02, -3.958e-03, -9.790e-02, -1.635e-01, 1.049e-01, 2.862e-01, -2.733e-02, -1.566e-01, -2.900e-01, -1.050e-01, -3.441e-01, -8.690e-02, 8.659e-02)); + r += mul(s0_8, M4(2.145e-01, 4.613e-02, 1.590e-02, -4.749e-02, 3.291e-01, 1.012e-01, 8.647e-03, -2.282e-01, 2.215e-01, 1.713e-01, 1.414e-01, -3.916e-01, -2.488e-01, 1.458e-01, 2.518e-02, -9.979e-02)); + r += mul(s1_0, M4(-2.127e-02, 3.575e-02, 9.372e-02, -2.662e-02, 4.467e-02, 1.304e-02, 3.849e-02, 5.186e-02, 7.417e-02, 3.647e-02, 4.960e-02, -3.988e-02, -3.998e-02, 1.173e-01, 7.752e-03, -2.263e-02)); + r += mul(s1_1, M4(-1.283e-01, -1.460e-01, 1.963e-02, -1.108e-01, -4.171e-01, 2.397e-01, -5.886e-02, 7.788e-02, -2.820e-02, -1.719e-01, 9.334e-03, -1.255e-01, 1.392e-01, 9.532e-03, -5.163e-02, 8.641e-02)); + r += mul(s1_2, M4(-1.889e-01, 1.933e-01, 5.574e-02, 6.723e-02, -1.015e-01, -3.316e-01, -1.460e-02, -1.606e-01, 1.052e-01, 1.027e-02, -4.626e-02, 5.368e-02, -9.160e-03, -9.514e-02, 2.577e-02, 7.122e-02)); + r += mul(s1_3, M4(-1.958e-01, 1.276e-01, 7.303e-02, -1.135e-01, -2.277e-01, 2.017e-01, -5.223e-02, 1.379e-01, -1.737e-01, 4.871e-02, -8.142e-02, 1.392e-01, 8.113e-02, 4.415e-01, -1.174e-01, 1.910e-02)); + r += mul(s1_4, M4(-3.233e-01, -4.158e-01, 8.391e-02, 2.017e-01, 9.790e-02, -4.865e-02, -2.172e-01, 2.607e-01, -2.458e-01, -4.931e-01, 3.016e-01, 2.198e-01, -7.173e-02, -5.683e-01, -7.447e-02, -1.264e-01)); + r += mul(s1_5, M4(-4.189e-01, 3.271e-01, 8.844e-02, -5.295e-01, 6.365e-02, -1.513e-01, 1.246e-02, -2.005e-01, 1.764e-01, 5.796e-01, 7.286e-02, -1.428e-01, -1.130e-01, -6.883e-02, -1.303e-02, -1.091e-01)); + r += mul(s1_6, M4(-6.621e-02, 9.901e-03, 9.472e-02, -3.568e-02, 1.067e-01, -3.318e-02, 3.152e-01, -5.261e-02, 1.108e-01, 7.081e-02, -1.289e-01, 6.477e-03, 1.036e-01, -1.477e-03, 1.035e+00, -9.204e-02)); + r += mul(s1_7, M4(-2.721e-01, -5.458e-02, -1.707e-01, -1.096e-02, -1.302e-01, -9.074e-02, 1.694e-01, 6.307e-02, 4.233e-01, -5.112e-02, -3.545e-01, -2.589e-01, 8.276e-02, -3.975e-01, 7.705e-02, 4.482e-01)); + r += mul(s1_8, M4(1.175e-01, 2.212e-03, 5.751e-02, -8.666e-02, 2.532e-01, 1.303e-01, 7.291e-02, -2.126e-01, 4.815e-01, 1.649e-01, -4.748e-02, -3.330e-01, -1.252e-01, -8.987e-03, -4.285e-03, -1.106e-01)); + r += V4(3.566e-03, 2.403e-03, -1.451e-03, 4.304e-03); + return r; +} + +void Pass2(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = Rmp8x8(tid.x) + blockStart; + uint2 size = GetInputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = (gxy + 0.5) * pt; + + V4 s0_0 = l0(-1.0, -1.0); + V4 s0_1 = l0(0.0, -1.0); + V4 s0_2 = l0(1.0, -1.0); + V4 s0_3 = l0(-1.0, 0.0); + V4 s0_4 = l0(0.0, 0.0); + V4 s0_5 = l0(1.0, 0.0); + V4 s0_6 = l0(-1.0, 1.0); + V4 s0_7 = l0(0.0, 1.0); + V4 s0_8 = l0(1.0, 1.0); + V4 s1_0 = -max(-s0_0, 0.0); + V4 s1_1 = -max(-s0_1, 0.0); + V4 s1_2 = -max(-s0_2, 0.0); + V4 s1_3 = -max(-s0_3, 0.0); + V4 s1_4 = -max(-s0_4, 0.0); + V4 s1_5 = -max(-s0_5, 0.0); + V4 s1_6 = -max(-s0_6, 0.0); + V4 s1_7 = -max(-s0_7, 0.0); + V4 s1_8 = -max(-s0_8, 0.0); + s0_0 = max(s0_0, 0.0); + s0_1 = max(s0_1, 0.0); + s0_2 = max(s0_2, 0.0); + s0_3 = max(s0_3, 0.0); + s0_4 = max(s0_4, 0.0); + s0_5 = max(s0_5, 0.0); + s0_6 = max(s0_6, 0.0); + s0_7 = max(s0_7, 0.0); + s0_8 = max(s0_8, 0.0); + + t1[gxy] = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8); +} + +//!PASS 3 +//!DESC conv2 +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 +//!IN t1 +//!OUT t0 + +#define l0(x, y) V4(O(t1, float2(x, y))) + +V4 f0(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-1.173e-02, 2.762e-03, -2.225e-03, -6.814e-03, 8.328e-02, -1.275e-02, 6.091e-02, -6.470e-02, -6.067e-02, -1.086e-01, 7.501e-02, 1.227e-01, -1.551e-02, -1.728e-02, -2.694e-02, 7.490e-02)); + r += mul(s0_1, M4(5.326e-02, 1.003e-02, 3.989e-02, -1.908e-03, -4.580e-02, -4.303e-03, 4.333e-02, 8.324e-02, 8.170e-01, 8.040e-01, -3.975e-01, -1.034e+00, 1.362e-01, 3.776e-04, -1.102e-02, -5.030e-02)); + r += mul(s0_2, M4(-6.068e-02, 6.212e-02, -4.979e-02, 9.626e-03, 1.301e-02, -2.045e-02, 1.798e-02, 2.091e-02, -2.290e-01, 3.612e-01, -7.014e-02, 1.669e-01, -5.191e-03, 1.304e-02, 9.444e-05, -2.137e-02)); + r += mul(s0_3, M4(-3.235e-02, -6.238e-02, 3.894e-02, 5.893e-02, -3.530e-02, -1.063e-01, 8.668e-02, 1.232e-02, -3.851e-02, 2.952e-02, 6.132e-02, -5.755e-02, 8.317e-02, 8.340e-02, -8.227e-02, 6.481e-03)); + r += mul(s0_4, M4(2.118e-02, 2.725e-01, -1.393e-01, -2.377e-01, 4.872e-01, 2.235e-01, -1.746e-02, -3.662e-01, -3.945e-01, -1.862e-01, -9.132e-02, 8.777e-02, -5.084e-01, -3.300e-01, -3.443e-02, 4.203e-01)); + r += mul(s0_5, M4(1.165e-01, -1.743e-01, 4.169e-03, -1.518e-01, 1.174e-01, -3.314e-02, 2.295e-02, -9.160e-02, -1.854e-01, -6.999e-02, -6.985e-02, 4.875e-04, -1.147e-01, 1.722e-01, -2.588e-02, 1.185e-01)); + r += mul(s0_6, M4(-8.881e-03, 1.907e-03, 9.002e-03, 8.085e-03, -8.728e-03, -1.074e-01, 7.035e-02, 6.519e-02, 4.323e-02, -4.675e-02, 4.382e-02, 1.091e-02, 3.357e-02, 4.384e-02, -8.031e-03, -1.945e-02)); + r += mul(s0_7, M4(-7.981e-02, 1.492e-02, -9.399e-02, -3.750e-02, -1.274e-01, -3.235e-02, -3.169e-02, 6.420e-02, 4.304e-02, 9.302e-02, 1.250e-02, 3.906e-03, 1.752e-01, -1.211e-02, 9.058e-02, -6.273e-02)); + r += mul(s0_8, M4(-1.290e-02, -4.309e-02, 3.384e-02, 3.819e-02, -3.309e-02, 3.986e-02, 3.783e-03, 5.361e-02, 5.473e-02, 1.574e-02, -2.385e-02, -7.630e-02, -1.778e-02, 1.375e-02, -2.936e-02, -1.778e-02)); + r += mul(s1_0, M4(1.219e-01, 1.166e-02, -5.932e-02, 1.191e-02, -2.487e-03, -5.945e-02, 6.637e-02, 5.775e-02, -1.705e-02, 5.538e-02, -5.130e-02, -3.602e-02, 5.461e-02, -1.253e-01, 6.953e-02, 1.066e-01)); + r += mul(s1_1, M4(6.504e-01, -9.638e-01, 1.371e+00, 5.682e-02, 1.583e-02, -2.371e-02, 5.201e-02, 3.845e-02, 3.478e-02, -1.477e-01, 1.763e-01, 5.129e-02, 2.992e-01, -3.335e-01, 2.490e-02, 4.873e-01)); + r += mul(s1_2, M4(2.415e-02, 8.838e-02, -1.519e-01, 9.012e-02, -6.676e-02, 3.422e-02, -2.380e-02, 5.608e-02, -1.744e-01, -9.595e-02, -7.627e-02, -5.823e-02, -9.466e-02, 5.554e-02, -1.024e-01, -1.763e-01)); + r += mul(s1_3, M4(8.380e-02, -7.972e-02, 8.813e-02, 3.371e-02, 5.392e-03, 4.385e-02, 1.207e-02, -5.728e-02, -3.427e-03, -2.027e-03, 1.211e-03, -7.897e-03, 3.360e-02, 4.603e-02, -1.240e-02, -2.219e-02)); + r += mul(s1_4, M4(-6.699e-01, -3.512e-01, -2.153e-01, 3.218e-01, -5.100e-01, 4.324e-03, 2.713e-01, -2.073e-01, 1.547e-01, -2.123e-03, 7.928e-02, -5.698e-02, 2.450e-02, -4.866e-02, 9.436e-02, 7.900e-02)); + r += mul(s1_5, M4(1.609e-01, -7.910e-02, 1.112e-01, -2.959e-02, -3.877e-01, -2.803e-01, -1.071e-01, -6.881e-03, 1.922e-02, 2.433e-02, -3.581e-02, -5.264e-02, -3.287e-01, -1.037e-02, -6.159e-02, 8.219e-02)); + r += mul(s1_6, M4(-4.263e-02, -6.372e-02, 2.607e-02, 5.285e-02, -6.156e-02, -7.837e-02, 7.299e-03, 8.959e-02, -8.706e-03, -1.642e-02, 1.825e-02, 1.850e-02, 2.735e-02, 2.413e-02, -3.236e-02, -9.612e-03)); + r += mul(s1_7, M4(-5.849e-02, 1.530e-01, -6.767e-02, -1.392e-02, -3.430e-01, -1.851e-01, -1.013e-01, 2.465e-01, -1.715e-02, 4.970e-03, -1.850e-02, -4.214e-03, 1.889e-02, -5.787e-02, 7.154e-02, 9.237e-02)); + r += mul(s1_8, M4(-2.084e-02, -2.484e-01, 5.767e-02, -2.550e-02, -9.126e-02, 4.292e-01, 1.983e-02, 2.979e-01, -3.807e-03, -3.367e-03, 1.835e-03, 8.694e-03, -9.074e-02, 4.820e-02, -2.886e-02, 5.975e-02)); + r += V4(5.508e-03, 4.690e-03, -5.708e-04, -7.674e-03); + return r; +} + +void Pass3(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = Rmp8x8(tid.x) + blockStart; + uint2 size = GetInputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = (gxy + 0.5) * pt; + + V4 s0_0 = l0(-1.0, -1.0); + V4 s0_1 = l0(0.0, -1.0); + V4 s0_2 = l0(1.0, -1.0); + V4 s0_3 = l0(-1.0, 0.0); + V4 s0_4 = l0(0.0, 0.0); + V4 s0_5 = l0(1.0, 0.0); + V4 s0_6 = l0(-1.0, 1.0); + V4 s0_7 = l0(0.0, 1.0); + V4 s0_8 = l0(1.0, 1.0); + V4 s1_0 = -max(-s0_0, 0.0); + V4 s1_1 = -max(-s0_1, 0.0); + V4 s1_2 = -max(-s0_2, 0.0); + V4 s1_3 = -max(-s0_3, 0.0); + V4 s1_4 = -max(-s0_4, 0.0); + V4 s1_5 = -max(-s0_5, 0.0); + V4 s1_6 = -max(-s0_6, 0.0); + V4 s1_7 = -max(-s0_7, 0.0); + V4 s1_8 = -max(-s0_8, 0.0); + s0_0 = max(s0_0, 0.0); + s0_1 = max(s0_1, 0.0); + s0_2 = max(s0_2, 0.0); + s0_3 = max(s0_3, 0.0); + s0_4 = max(s0_4, 0.0); + s0_5 = max(s0_5, 0.0); + s0_6 = max(s0_6, 0.0); + s0_7 = max(s0_7, 0.0); + s0_8 = max(s0_8, 0.0); + + t0[gxy] = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8); +} + +//!PASS 4 +//!DESC out-shuffle +//!BLOCK_SIZE 16 +//!NUM_THREADS 64 +//!IN INPUT, t0 +//!OUT OUTPUT + +#define l0(x, y) V4(O(t0, float2(x, y))) + +V4 f0(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-1.841e-04, -5.677e-02, 9.249e-03, -8.726e-03, 4.041e-02, -1.295e-01, 1.154e-01, 2.765e-02, 1.833e-01, -8.427e-02, 1.078e-01, -1.432e-01, 1.068e-01, -1.222e-01, 2.535e-02, 5.316e-02)); + r += mul(s0_1, M4(-3.609e-03, 5.812e-02, -4.650e-02, -2.093e-02, -3.442e-02, 7.643e-02, 1.424e-02, 7.195e-02, 1.552e-01, -8.291e-01, 1.547e-01, 4.354e-01, -2.851e-02, 1.023e-01, -8.481e-03, -6.567e-02)); + r += mul(s0_2, M4(1.724e-02, -1.165e-02, 1.007e-02, -3.008e-02, -9.814e-04, -2.007e-02, -5.905e-03, 6.714e-03, -1.736e-01, 2.035e-01, -1.333e-01, 1.250e-01, -9.118e-03, -4.989e-02, 2.142e-02, -4.038e-03)); + r += mul(s0_3, M4(7.885e-02, -8.350e-02, -6.025e-03, -1.139e-01, -8.380e-02, -6.836e-02, -5.589e-01, -4.614e-01, -6.742e-01, 2.118e-01, -4.442e-01, 2.197e-01, -5.873e-02, 1.902e-01, -4.687e-01, -4.712e-01)); + r += mul(s0_4, M4(-4.506e-01, 2.396e-01, -1.350e-02, 4.072e-01, 3.249e-01, 9.930e-02, 1.576e-02, -2.456e-01, 1.506e+00, 6.047e-02, 8.841e-01, -1.927e+00, -4.337e-01, -5.801e-01, 3.334e-01, 8.276e-02)); + r += mul(s0_5, M4(5.049e-02, -1.870e-01, 7.413e-02, -2.569e-02, -2.152e-02, 1.139e-01, -3.874e-02, 1.634e-02, -1.325e-01, 4.002e-02, -1.874e-01, 1.204e-01, 2.267e-02, 1.380e-02, -1.055e-02, 5.504e-02)); + r += mul(s0_6, M4(-2.855e-02, 1.255e-02, 3.941e-02, 4.466e-03, 4.814e-05, -9.003e-03, 1.231e-01, 5.676e-02, 5.020e-02, -5.407e-02, -1.951e-01, 4.240e-02, 3.525e-02, -1.021e-01, 4.517e-01, 2.399e-01)); + r += mul(s0_7, M4(-5.781e-02, -4.964e-02, -3.981e-01, -1.716e-01, 3.430e-02, -1.644e-02, 2.352e-01, 1.938e-01, 1.266e-01, -1.061e-01, 7.754e-01, 5.337e-01, 2.664e-01, 3.669e-01, -1.113e+00, -1.742e-01)); + r += mul(s0_8, M4(2.948e-02, 3.723e-02, 2.739e-02, -5.215e-02, -1.542e-02, -2.173e-02, -1.944e-02, 1.856e-02, -4.535e-02, 1.163e-02, -5.014e-02, 8.660e-02, 1.421e-01, 2.314e-01, 1.171e-02, -4.975e-01)); + r += mul(s1_0, M4(-4.408e-02, -3.573e-02, 3.842e-02, 2.571e-02, 2.872e-01, -4.960e-01, 2.569e-01, -6.254e-02, 2.158e-02, -6.452e-02, 7.495e-02, 1.997e-02, 4.094e-02, -9.741e-02, 3.542e-02, -8.115e-03)); + r += mul(s1_1, M4(3.480e-02, 1.949e-04, 1.780e-02, 4.483e-02, -2.814e-01, 4.229e-01, -5.482e-02, 1.512e-02, -3.120e-02, 3.945e-02, 4.626e-02, 7.013e-02, -6.686e-03, 5.832e-02, -4.408e-02, -1.262e-02)); + r += mul(s1_2, M4(-9.847e-03, 1.973e-03, 1.457e-02, 2.290e-02, 4.741e-02, 2.270e-02, 8.902e-04, 1.152e-02, -2.473e-02, -1.948e-02, -3.475e-03, 4.431e-02, 2.044e-02, 1.571e-04, 9.470e-03, -2.825e-02)); + r += mul(s1_3, M4(5.918e-02, -1.939e-02, -4.628e-02, -7.774e-02, -3.040e-01, 8.634e-02, -5.254e-01, -6.906e-01, -1.218e-01, -6.178e-02, -3.115e-01, -2.697e-01, -2.402e-02, -2.149e-02, -3.878e-01, -3.453e-01)); + r += mul(s1_4, M4(2.920e-01, 3.711e-01, -2.753e-01, -4.654e-02, 1.379e-01, 3.908e-01, -4.798e-01, 6.668e-01, 4.870e-01, -1.634e-01, -7.790e-02, -2.683e-01, -4.834e-01, -1.822e-02, -8.492e-03, 7.620e-02)); + r += mul(s1_5, M4(-4.786e-02, 2.412e-02, 4.992e-02, -1.913e-01, 9.058e-02, -4.485e-02, 8.249e-02, -9.418e-02, 3.555e-02, 3.543e-01, -1.140e-01, -1.358e-01, 5.079e-02, -2.007e-01, 6.132e-02, -2.373e-03)); + r += mul(s1_6, M4(6.553e-03, -7.804e-03, 8.569e-02, 4.875e-02, 5.085e-02, 1.728e-02, 6.949e-02, 1.313e-01, 1.825e-02, -5.557e-02, -7.548e-03, -5.534e-02, 7.059e-02, 4.382e-02, 2.807e-01, 1.919e-01)); + r += mul(s1_7, M4(-1.071e-01, -3.709e-02, -4.757e-01, -1.943e-01, 8.182e-02, -3.334e-02, 4.170e-01, 6.716e-02, 1.563e-01, 1.382e-01, 7.441e-01, 4.082e-01, -9.101e-02, -3.943e-02, -5.142e-01, -1.910e-01)); + r += mul(s1_8, M4(4.255e-03, 4.204e-02, 5.834e-02, -6.508e-02, -3.675e-02, 1.165e-02, -2.694e-02, -2.212e-02, -3.036e-02, -4.393e-02, 1.855e-03, 1.909e-01, 3.812e-02, 3.309e-02, 3.942e-02, -7.422e-02)); + r += V4(-1.734e-03, -1.825e-03, -1.635e-03, -1.665e-03); + return tanh(r); +} + +void Pass4(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = (Rmp8x8(tid.x) << 1) + blockStart; + uint2 size = GetOutputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = ((gxy >> 1) + 0.5) * pt; + + V4 s0_0 = l0(-1.0, -1.0); + V4 s0_1 = l0(0.0, -1.0); + V4 s0_2 = l0(1.0, -1.0); + V4 s0_3 = l0(-1.0, 0.0); + V4 s0_4 = l0(0.0, 0.0); + V4 s0_5 = l0(1.0, 0.0); + V4 s0_6 = l0(-1.0, 1.0); + V4 s0_7 = l0(0.0, 1.0); + V4 s0_8 = l0(1.0, 1.0); + V4 s1_0 = -max(-s0_0, 0.0); + V4 s1_1 = -max(-s0_1, 0.0); + V4 s1_2 = -max(-s0_2, 0.0); + V4 s1_3 = -max(-s0_3, 0.0); + V4 s1_4 = -max(-s0_4, 0.0); + V4 s1_5 = -max(-s0_5, 0.0); + V4 s1_6 = -max(-s0_6, 0.0); + V4 s1_7 = -max(-s0_7, 0.0); + V4 s1_8 = -max(-s0_8, 0.0); + s0_0 = max(s0_0, 0.0); + s0_1 = max(s0_1, 0.0); + s0_2 = max(s0_2, 0.0); + s0_3 = max(s0_3, 0.0); + s0_4 = max(s0_4, 0.0); + s0_5 = max(s0_5, 0.0); + s0_6 = max(s0_6, 0.0); + s0_7 = max(s0_7, 0.0); + s0_8 = max(s0_8, 0.0); + + V4 r = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8); + + static const float3x3 rgb2yuv = {0.299, 0.587, 0.114, -0.169, -0.331, 0.5, 0.5, -0.419, -0.081}; + static const float3x3 yuv2rgb = {1, -0.00093, 1.401687, 1, -0.3437, -0.71417, 1, 1.77216, 0.00099}; + float2 opt = float2(GetOutputPt()); + + pos -= 0.5f * opt; + float3 yuv = mul(rgb2yuv, INPUT.SampleLevel(SL, pos, 0).rgb); + OUTPUT[gxy] = float4(mul(yuv2rgb, float3(saturate(yuv.r + r.x), yuv.yz)), 1); + + ++gxy.x; + pos.x += opt.x; + yuv = mul(rgb2yuv, INPUT.SampleLevel(SL, pos, 0).rgb); + OUTPUT[gxy] = float4(mul(yuv2rgb, float3(saturate(yuv.r + r.y), yuv.yz)), 1); + + ++gxy.y; + pos.y += opt.y; + yuv = mul(rgb2yuv, INPUT.SampleLevel(SL, pos, 0).rgb); + OUTPUT[gxy] = float4(mul(yuv2rgb, float3(saturate(yuv.r + r.w), yuv.yz)), 1); + + --gxy.x; + pos.x -= opt.x; + yuv = mul(rgb2yuv, INPUT.SampleLevel(SL, pos, 0).rgb); + OUTPUT[gxy] = float4(mul(yuv2rgb, float3(saturate(yuv.r + r.z), yuv.yz)), 1); +} diff --git a/src/Effects/CuNNy/CuNNy-3x4C-NVL-DN.hlsl b/src/Effects/CuNNy/CuNNy-3x4C-NVL-DN.hlsl new file mode 100644 index 000000000..6ec2927bd --- /dev/null +++ b/src/Effects/CuNNy/CuNNy-3x4C-NVL-DN.hlsl @@ -0,0 +1,413 @@ +// CuNNy 3x4C BILINEAR RGB NVL DN - https://github.com/cunnyplapper/CuNNy + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +//!MAGPIE EFFECT +//!VERSION 4 +//!SORT_NAME CuNNy-DN-D04N03 + +//!TEXTURE +Texture2D INPUT; + +//!TEXTURE +//!WIDTH INPUT_WIDTH * 2 +//!HEIGHT INPUT_HEIGHT * 2 +Texture2D OUTPUT; + +//!SAMPLER +//!FILTER POINT +SamplerState SP; + +//!SAMPLER +//!FILTER LINEAR +SamplerState SL; + +//!COMMON +#define O(t, p) t.SampleLevel(SP, pos + p * pt, 0) +#define V4 min16float4 +#define M4 min16float4x4 + +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +//!FORMAT R8G8B8A8_SNORM +Texture2D t0; + +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +//!FORMAT R8G8B8A8_SNORM +Texture2D t1; + +//!PASS 1 +//!DESC in +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 +//!IN INPUT +//!OUT t0 + +#define l0(x, y) min16float((dot(float3(-2.683e-01, -5.217e-01, -1.382e-01), O(INPUT, float2(x, y)).rgb) + 7.973e-01)) + +V4 f0(min16float s0_0, min16float s0_1, min16float s0_2, min16float s0_3, min16float s0_4, min16float s0_5, min16float s0_6, min16float s0_7, min16float s0_8) { + V4 r = 0.0; + r += V4(1.850e-01, -2.860e-02, -5.321e-01, 2.390e-03) * s0_0; + r += V4(-4.299e-01, -2.946e-02, -1.180e-01, -5.652e-02) * s0_1; + r += V4(-4.798e-01, -2.276e-02, 3.201e-02, 4.870e-02) * s0_2; + r += V4(2.783e-01, -2.262e-03, -1.864e-01, 1.793e-01) * s0_3; + r += V4(9.435e-04, 8.115e-01, 7.806e-01, -7.793e-01) * s0_4; + r += V4(2.180e-01, -2.564e-05, 2.774e-03, -7.015e-02) * s0_5; + r += V4(1.479e-03, -4.675e-02, 3.323e-02, 3.392e-01) * s0_6; + r += V4(1.203e-01, 1.509e-02, 5.239e-02, 3.194e-01) * s0_7; + r += V4(7.680e-02, -4.310e-02, -7.203e-02, 1.255e-02) * s0_8; + r += V4(3.156e-02, 7.379e-02, 1.078e-02, -5.510e-04); + return r; +} + +void Pass1(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = Rmp8x8(tid.x) + blockStart; + uint2 size = GetInputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = (gxy + 0.5) * pt; + + min16float s0_0 = l0(-1.0, -1.0); + min16float s0_1 = l0(0.0, -1.0); + min16float s0_2 = l0(1.0, -1.0); + min16float s0_3 = l0(-1.0, 0.0); + min16float s0_4 = l0(0.0, 0.0); + min16float s0_5 = l0(1.0, 0.0); + min16float s0_6 = l0(-1.0, 1.0); + min16float s0_7 = l0(0.0, 1.0); + min16float s0_8 = l0(1.0, 1.0); + + t0[gxy] = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8); +} + +//!PASS 2 +//!DESC conv1 +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 +//!IN t0 +//!OUT t1 + +#define l0(x, y) V4(O(t0, float2(x, y))) + +V4 f0(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8) { + V4 r = 0.0; + r += mul(s0_0, M4(1.949e-01, -1.247e-01, -7.307e-02, 8.783e-02, -4.773e-02, 6.012e-02, 8.043e-02, -8.489e-02, 6.760e-02, -7.809e-02, -4.745e-02, -1.304e-02, -1.402e-01, -1.248e-01, 3.334e-01, -1.498e-01)); + r += mul(s0_1, M4(7.053e-02, 9.895e-02, 1.655e-01, 2.251e-01, 3.511e-02, -1.010e-01, -2.736e-01, 1.174e-01, -2.551e-01, 1.100e-01, 1.518e-01, -4.343e-02, -9.293e-01, 5.327e-01, -2.723e-01, 4.006e-01)); + r += mul(s0_2, M4(-2.390e-02, 8.154e-03, -2.332e-02, -3.708e-02, 2.814e-02, 5.506e-02, -2.627e-01, -8.081e-02, -1.062e-01, -6.819e-02, -9.498e-02, -2.749e-01, -2.457e-01, 6.868e-01, 6.527e-03, 7.676e-01)); + r += mul(s0_3, M4(2.704e-01, 4.055e-02, -4.756e-01, 2.506e-01, -9.498e-02, 5.838e-02, 1.733e-01, 3.420e-03, -7.051e-02, -8.233e-02, -3.006e-01, 6.824e-02, -1.308e-01, 1.196e-01, 2.560e-01, 8.304e-02)); + r += mul(s0_4, M4(4.190e-01, -1.207e-01, 2.708e-01, -6.375e-01, 1.740e-01, 1.955e-03, -1.816e-01, -7.933e-02, -9.308e-01, 1.333e-01, -1.335e-01, -1.401e-01, 3.447e-01, 3.389e-01, 6.660e-01, -3.387e-01)); + r += mul(s0_5, M4(7.310e-02, 1.403e-02, 8.114e-02, 7.400e-02, -2.552e-02, -1.607e-01, -1.208e-01, -3.943e-02, -2.743e-02, -7.229e-03, -1.749e-03, 3.062e-01, 1.429e-01, 8.105e-01, 3.562e-01, 4.580e-01)); + r += mul(s0_6, M4(2.115e-01, -1.686e-01, -1.948e-01, -1.191e-01, -5.798e-02, 3.493e-02, 8.264e-02, 1.579e-01, -1.081e-01, -1.775e-01, -8.196e-02, -2.085e-01, 6.791e-02, 1.652e-02, -4.933e-03, 2.833e-02)); + r += mul(s0_7, M4(-2.160e-01, -3.858e-01, -8.407e-01, -1.091e-01, 8.415e-03, 8.626e-02, 2.340e-01, 9.177e-02, -4.697e-01, -6.623e-02, -5.176e-01, 6.762e-02, -3.437e-03, 6.570e-02, 7.630e-02, 8.988e-02)); + r += mul(s0_8, M4(6.527e-02, -6.320e-02, 1.192e-02, -1.196e-01, -1.605e-02, -9.294e-03, 1.955e-01, -2.356e-02, -3.582e-02, 1.377e-02, 9.253e-02, -2.362e-02, 3.578e-02, 1.822e-01, 3.329e-01, 1.489e-01)); + r += mul(s1_0, M4(1.154e-01, -1.822e-01, -2.122e-01, 3.031e-02, 6.550e-01, -4.855e-02, 6.554e-02, 4.432e-02, 1.671e-02, -4.477e-02, -9.428e-03, 4.413e-03, -3.185e-02, -1.529e-01, -1.222e-01, 6.523e-02)); + r += mul(s1_1, M4(-4.920e-02, -1.697e-02, 4.141e-02, 1.997e-01, 6.972e-01, -5.157e-01, 2.031e-01, 2.829e-02, -5.005e-02, 2.335e-01, 2.985e-01, 6.871e-02, -5.232e-01, 2.146e-02, -1.418e+00, 2.193e-01)); + r += mul(s1_2, M4(-6.472e-02, 2.595e-02, -2.610e-02, -2.279e-02, 4.165e-01, -7.745e-01, 1.261e-01, -3.845e-01, 3.279e-02, 2.445e-02, 1.796e-01, -2.581e-01, -3.838e-01, 6.280e-02, -4.893e-01, -1.475e-01)); + r += mul(s1_3, M4(9.330e-02, 1.742e-01, -1.685e-01, 2.376e-02, -9.586e-01, -1.236e+00, -7.271e-01, -7.674e-01, 2.500e-01, -3.709e-02, -1.303e-01, 1.490e-01, -2.746e-01, -1.376e-01, -2.321e-02, -1.967e-02)); + r += mul(s1_4, M4(3.660e-01, 4.772e-02, 5.524e-01, -2.804e-01, -2.756e+00, -1.336e+00, 2.038e-01, 2.593e+00, 2.156e-01, 3.281e-01, 3.152e-01, 8.064e-01, 3.970e-01, -1.379e-01, -7.518e-02, -2.723e-01)); + r += mul(s1_5, M4(5.214e-03, 1.695e-02, 1.024e-01, 1.333e-01, -2.250e-01, -1.298e+00, 4.673e-01, 1.317e+00, 3.036e-01, -1.273e-01, 2.900e-01, 2.249e-02, -1.870e-01, -1.124e-01, -5.879e-01, 6.314e-02)); + r += mul(s1_6, M4(-8.225e-02, -1.149e-01, 1.598e-04, -3.662e-01, -8.572e-02, -8.909e-01, 9.891e-02, 1.818e-01, 1.715e-01, -2.348e-01, 1.178e-01, -6.289e-02, 1.522e-02, 1.973e-02, 3.707e-02, 2.911e-02)); + r += mul(s1_7, M4(-6.380e-02, 8.661e-02, -2.666e-01, 9.586e-02, -1.257e+00, -2.231e+00, -1.232e+00, 5.642e-01, 5.730e-02, -3.294e-01, -1.151e-01, 2.382e-01, 4.529e-02, 4.927e-02, 9.893e-02, 8.365e-02)); + r += mul(s1_8, M4(1.906e-02, -8.920e-02, 8.931e-02, -6.752e-02, -3.680e-01, -1.282e+00, -1.388e-01, -7.545e-02, 6.262e-02, -1.695e-01, 2.278e-01, -3.066e-01, -7.412e-02, 1.145e-02, 4.667e-02, -4.205e-04)); + r += V4(1.427e-02, -1.982e-02, 4.114e-03, -2.883e-02); + return r; +} + +void Pass2(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = Rmp8x8(tid.x) + blockStart; + uint2 size = GetInputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = (gxy + 0.5) * pt; + + V4 s0_0 = l0(-1.0, -1.0); + V4 s0_1 = l0(0.0, -1.0); + V4 s0_2 = l0(1.0, -1.0); + V4 s0_3 = l0(-1.0, 0.0); + V4 s0_4 = l0(0.0, 0.0); + V4 s0_5 = l0(1.0, 0.0); + V4 s0_6 = l0(-1.0, 1.0); + V4 s0_7 = l0(0.0, 1.0); + V4 s0_8 = l0(1.0, 1.0); + V4 s1_0 = -max(-s0_0, 0.0); + V4 s1_1 = -max(-s0_1, 0.0); + V4 s1_2 = -max(-s0_2, 0.0); + V4 s1_3 = -max(-s0_3, 0.0); + V4 s1_4 = -max(-s0_4, 0.0); + V4 s1_5 = -max(-s0_5, 0.0); + V4 s1_6 = -max(-s0_6, 0.0); + V4 s1_7 = -max(-s0_7, 0.0); + V4 s1_8 = -max(-s0_8, 0.0); + s0_0 = max(s0_0, 0.0); + s0_1 = max(s0_1, 0.0); + s0_2 = max(s0_2, 0.0); + s0_3 = max(s0_3, 0.0); + s0_4 = max(s0_4, 0.0); + s0_5 = max(s0_5, 0.0); + s0_6 = max(s0_6, 0.0); + s0_7 = max(s0_7, 0.0); + s0_8 = max(s0_8, 0.0); + + t1[gxy] = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8); +} + +//!PASS 3 +//!DESC conv2 +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 +//!IN t1 +//!OUT t0 + +#define l0(x, y) V4(O(t1, float2(x, y))) + +V4 f0(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8) { + V4 r = 0.0; + r += mul(s0_0, M4(2.965e-01, -1.919e-01, 9.202e-02, 8.775e-03, -4.948e-02, 1.061e-01, -3.754e-02, -1.900e-01, -2.114e-01, 1.267e-01, 1.989e-02, 2.570e-02, 4.634e-03, -2.718e-01, 2.171e-01, 1.512e-01)); + r += mul(s0_1, M4(-5.527e-01, -4.825e-01, 4.325e-01, 4.447e-01, -6.577e-02, 5.161e-01, 3.286e-02, -3.800e-01, 2.625e-02, 3.835e-01, -7.794e-02, -5.489e-02, -2.647e-01, -4.952e-01, 1.587e-01, 1.471e-01)); + r += mul(s0_2, M4(-3.687e-01, -1.096e-01, 1.849e-01, -6.915e-02, 2.257e-01, 2.760e-01, -8.875e-02, -8.871e-02, -8.394e-02, -6.714e-02, 5.322e-03, -3.252e-01, -7.885e-02, -2.723e-01, 6.149e-02, 2.998e-01)); + r += mul(s0_3, M4(1.606e-01, -1.199e-01, 3.573e-01, 2.833e-02, 6.514e-03, -2.242e-02, -6.231e-02, 6.702e-02, -8.717e-02, -2.227e-01, -1.626e-01, 5.313e-02, -1.411e-01, -2.445e-02, 1.194e-01, -1.101e-01)); + r += mul(s0_4, M4(-1.127e+00, 1.823e-01, 1.358e-01, -1.618e-01, -4.171e-04, -7.771e-02, 2.147e-01, 6.493e-01, 4.989e-01, 3.955e-01, -1.017e-01, -2.861e-01, 3.878e-01, -6.653e-01, -4.968e-01, -5.063e-01)); + r += mul(s0_5, M4(-2.270e-01, -3.965e-01, -2.794e-02, 1.487e-01, -2.667e-01, -1.410e-02, 1.475e-01, -4.992e-01, -1.071e-01, 2.096e-01, 1.159e-01, -6.073e-02, -7.157e-02, -2.446e-01, -4.807e-02, 1.968e-01)); + r += mul(s0_6, M4(8.199e-02, 8.336e-02, -3.090e-02, -1.287e-02, -6.954e-02, -7.544e-02, 1.272e-01, 7.930e-02, -3.647e-02, -2.685e-02, -4.235e-02, 3.214e-02, -4.526e-02, 1.479e-01, -4.963e-02, -3.035e-02)); + r += mul(s0_7, M4(-2.012e-02, -1.497e-02, -2.952e-01, -6.026e-02, 2.135e-03, 2.979e-02, -2.713e-02, 7.951e-03, -8.069e-02, -2.374e-01, 1.865e-01, 1.048e-01, -9.076e-02, 6.683e-02, 9.576e-02, -2.432e-02)); + r += mul(s0_8, M4(1.455e-01, 2.613e-01, -1.616e-01, -3.564e-01, 1.229e-01, -3.778e-02, 3.316e-02, 5.927e-02, -1.831e-01, -1.388e-01, 5.986e-02, 2.083e-02, -1.368e-03, 2.394e-01, -1.623e-01, -2.768e-02)); + r += mul(s1_0, M4(7.711e-03, -6.696e-04, -3.229e-02, 1.549e-02, -1.596e-01, 2.068e-01, -6.162e-02, -9.571e-02, -1.500e-01, 1.743e-01, 2.746e-02, -5.845e-02, -7.649e-03, -4.265e-03, 4.154e-03, 3.950e-03)); + r += mul(s1_1, M4(2.764e-01, -4.505e-02, 4.280e-02, 6.044e-02, 3.396e-02, 2.750e-01, -1.910e-01, -2.153e-01, 9.633e-02, -2.194e-02, -2.131e-01, -1.181e-01, -1.343e-01, 6.123e-02, 1.904e-02, -6.568e-02)); + r += mul(s1_2, M4(-3.643e-01, -1.709e-02, 1.528e-01, -1.405e-01, 3.307e-01, -1.979e-03, -1.819e-01, 7.635e-02, 1.266e-01, 2.162e-01, -7.492e-02, -9.075e-02, 4.120e-02, 1.521e-01, -2.790e-03, -4.330e-02)); + r += mul(s1_3, M4(1.913e-02, -5.373e-02, 5.748e-02, -1.443e-02, -2.776e-01, -1.162e-01, -1.994e-01, 1.430e-01, 9.058e-02, -3.720e-02, -3.585e-02, -8.516e-02, -2.228e-02, 7.507e-02, -9.620e-02, -1.013e-01)); + r += mul(s1_4, M4(-3.592e-01, 1.415e-01, 1.018e+00, -1.555e-01, 5.378e-01, 8.818e-02, 2.190e-01, 1.997e-01, -1.128e-01, 3.331e-02, -1.410e-01, 2.844e-01, 4.756e-01, -5.850e-02, -3.757e-01, -1.716e-01)); + r += mul(s1_5, M4(2.636e-02, -3.596e-01, -3.280e-01, 2.027e-01, 3.000e-01, -2.297e-01, 4.282e-02, 1.776e-01, 5.222e-02, 1.751e-01, 4.529e-02, -8.347e-02, -3.409e-01, -2.640e-01, 1.753e-01, -5.672e-01)); + r += mul(s1_6, M4(-1.699e-02, 4.941e-02, -2.642e-02, -1.406e-04, -1.655e-01, -1.464e-02, -4.353e-02, 1.946e-01, 6.067e-02, -1.429e-01, 1.170e-01, -4.644e-02, -6.567e-02, -2.264e-02, 6.666e-02, 9.009e-02)); + r += mul(s1_7, M4(7.805e-02, 2.173e-02, -3.276e-01, 2.004e-03, -7.789e-02, -1.466e-02, -1.560e-01, -1.126e-01, -3.823e-02, -2.446e-03, 1.465e-01, -2.744e-01, -2.129e-01, -2.141e-02, 4.456e-01, 1.240e-01)); + r += mul(s1_8, M4(1.315e-02, 2.686e-01, -1.987e-01, -2.093e-01, 3.184e-02, -8.723e-02, 3.012e-01, 3.580e-01, 1.198e-02, -2.655e-01, 1.455e-01, 7.602e-02, -4.605e-02, 3.276e-01, -2.036e-01, -2.590e-01)); + r += V4(-1.292e-02, 8.156e-04, -2.055e-03, -3.100e-03); + return r; +} + +void Pass3(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = Rmp8x8(tid.x) + blockStart; + uint2 size = GetInputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = (gxy + 0.5) * pt; + + V4 s0_0 = l0(-1.0, -1.0); + V4 s0_1 = l0(0.0, -1.0); + V4 s0_2 = l0(1.0, -1.0); + V4 s0_3 = l0(-1.0, 0.0); + V4 s0_4 = l0(0.0, 0.0); + V4 s0_5 = l0(1.0, 0.0); + V4 s0_6 = l0(-1.0, 1.0); + V4 s0_7 = l0(0.0, 1.0); + V4 s0_8 = l0(1.0, 1.0); + V4 s1_0 = -max(-s0_0, 0.0); + V4 s1_1 = -max(-s0_1, 0.0); + V4 s1_2 = -max(-s0_2, 0.0); + V4 s1_3 = -max(-s0_3, 0.0); + V4 s1_4 = -max(-s0_4, 0.0); + V4 s1_5 = -max(-s0_5, 0.0); + V4 s1_6 = -max(-s0_6, 0.0); + V4 s1_7 = -max(-s0_7, 0.0); + V4 s1_8 = -max(-s0_8, 0.0); + s0_0 = max(s0_0, 0.0); + s0_1 = max(s0_1, 0.0); + s0_2 = max(s0_2, 0.0); + s0_3 = max(s0_3, 0.0); + s0_4 = max(s0_4, 0.0); + s0_5 = max(s0_5, 0.0); + s0_6 = max(s0_6, 0.0); + s0_7 = max(s0_7, 0.0); + s0_8 = max(s0_8, 0.0); + + t0[gxy] = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8); +} + +//!PASS 4 +//!DESC conv3 +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 +//!IN t0 +//!OUT t1 + +#define l0(x, y) V4(O(t0, float2(x, y))) + +V4 f0(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8) { + V4 r = 0.0; + r += mul(s0_0, M4(2.151e-02, -4.754e-02, 3.454e-02, -1.338e-03, -4.337e-02, 4.608e-02, -1.116e-01, -2.296e-02, -2.839e-02, -3.878e-01, -2.317e-02, 5.774e-02, 4.317e-03, 6.680e-02, 6.325e-02, -1.449e-01)); + r += mul(s0_1, M4(-1.173e-01, -8.942e-02, -1.017e-01, 6.496e-02, 5.558e-02, 2.788e-02, 2.184e-02, -2.837e-03, -1.057e-01, -2.075e-01, -3.255e-02, -1.297e-02, -2.643e-02, -1.695e-02, -9.425e-02, 3.942e-02)); + r += mul(s0_2, M4(-1.773e-02, -4.118e-02, -2.141e-02, 4.282e-02, 4.234e-02, -1.221e-02, -3.375e-03, 4.469e-02, -2.586e-01, -1.112e-01, -7.688e-02, 3.426e-02, 8.170e-02, -2.355e-02, -3.737e-02, 3.004e-02)); + r += mul(s0_3, M4(2.192e-01, 1.955e+00, 2.012e-01, -2.598e-02, -7.453e-02, 5.510e-02, -1.517e-01, -2.571e-01, -2.182e-02, -2.345e-02, -5.767e-02, -5.534e-02, -1.996e-02, 2.329e-01, 4.447e-04, -1.111e-01)); + r += mul(s0_4, M4(3.476e-01, -4.368e-01, -1.180e-01, 5.371e-01, 5.294e-01, 1.509e-01, 2.456e-01, -7.875e-02, 2.055e-01, 9.732e-02, 1.285e-01, 5.178e-01, 3.256e-01, -2.842e-01, 4.421e-02, 3.426e-01)); + r += mul(s0_5, M4(6.119e-01, -1.393e-01, -1.144e-02, 2.438e-01, -5.126e-02, -1.049e-01, -7.847e-02, 9.942e-02, 5.371e-01, 9.985e-02, 9.193e-02, -3.067e-02, -1.962e-01, -4.272e-02, -7.821e-03, 2.557e-02)); + r += mul(s0_6, M4(1.224e-02, -5.098e-01, 3.052e-01, 5.332e-01, 2.249e-01, 4.201e-02, 5.423e-01, 1.106e-01, -1.056e-02, -4.091e-03, -1.267e-02, -5.280e-02, 1.898e-02, 9.430e-03, 1.470e-02, 7.235e-02)); + r += mul(s0_7, M4(-4.342e-01, 2.385e-01, -3.834e-02, -7.654e-02, -9.043e-01, -3.139e-01, -1.511e-01, 3.800e-01, -8.848e-02, -3.911e-02, -7.025e-03, -1.196e-02, -3.322e-03, -1.455e-01, 2.084e-02, 1.106e-01)); + r += mul(s0_8, M4(1.382e-01, -1.894e-01, -8.814e-02, 1.373e-01, 1.362e-01, -1.298e-01, -1.007e-01, 1.166e-01, -1.553e-02, 8.530e-02, 2.744e-02, -1.083e-01, -5.606e-02, 5.965e-02, 1.406e-02, -4.496e-02)); + r += mul(s1_0, M4(-4.828e-03, -1.035e-01, -5.021e-02, 1.972e-02, -9.942e-03, -3.057e-01, -7.373e-03, 4.274e-02, -3.475e-03, 4.653e-02, 9.115e-03, -5.794e-02, 1.170e-02, 1.322e-01, 1.195e-01, -2.535e-02)); + r += mul(s1_1, M4(-5.424e-02, -1.541e-01, -9.945e-02, 8.862e-02, -1.198e-01, -3.591e-05, 4.305e-02, -1.079e-01, 1.605e-02, -3.377e-02, -5.398e-02, 1.201e-02, 3.432e-02, 1.090e-02, 8.871e-02, 3.186e-02)); + r += mul(s1_2, M4(-1.108e-01, -3.481e-02, -1.616e-02, -4.136e-03, -3.382e-02, 1.836e-02, -3.071e-02, -3.186e-02, -1.014e-01, -1.412e-01, -7.790e-02, 9.763e-02, -1.624e-02, -2.520e-02, -2.152e-02, 2.524e-02)); + r += mul(s1_3, M4(3.337e-03, -1.439e-02, 2.317e-03, 2.097e-01, 5.091e-03, 4.138e-02, -5.988e-02, -2.348e-02, -5.626e-03, 1.695e-02, 2.371e-02, -1.652e-02, 8.541e-02, -1.851e-01, 1.130e+00, -1.181e-01)); + r += mul(s1_4, M4(1.184e-01, -3.385e-02, 2.659e-02, 3.233e-01, 2.333e-01, 1.694e-01, 1.915e-01, 1.162e-01, 4.309e-02, -3.793e-02, 1.412e-01, -1.345e-02, -6.074e-01, -2.408e-01, -1.306e-01, 1.033e-01)); + r += mul(s1_5, M4(3.452e-01, 1.401e-01, 3.650e-02, -4.950e-02, 1.755e-01, -1.210e-01, -1.041e-02, 1.281e-01, 4.262e-01, 2.166e-02, 3.851e-02, 1.295e-01, -1.910e-01, -2.029e-02, -2.151e-02, -1.537e-02)); + r += mul(s1_6, M4(4.989e-03, -5.730e-02, 5.803e-02, 2.946e-02, 1.825e-02, 2.660e-02, -4.900e-03, 3.848e-03, 1.078e-02, 1.823e-02, -4.751e-03, 4.219e-02, -1.024e-01, 7.721e-02, -6.709e-01, 8.423e-02)); + r += mul(s1_7, M4(-1.567e-01, 4.125e-02, -2.721e-02, -1.831e-01, 9.470e-03, -1.205e-01, 1.793e-02, 1.160e-01, -4.874e-02, -4.902e-02, -1.479e-01, 7.102e-02, 6.699e-01, -1.383e-01, 1.314e-01, 2.999e-01)); + r += mul(s1_8, M4(-2.625e-01, -9.735e-02, -6.038e-02, 3.588e-03, 2.247e-02, 4.993e-02, 1.171e-02, -2.071e-02, 2.066e-01, 2.852e-01, -5.781e-02, -3.231e-01, 6.922e-02, 8.960e-02, 9.107e-02, -2.880e-02)); + r += V4(3.045e-03, 3.707e-03, -6.011e-03, -5.162e-03); + return r; +} + +void Pass4(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = Rmp8x8(tid.x) + blockStart; + uint2 size = GetInputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = (gxy + 0.5) * pt; + + V4 s0_0 = l0(-1.0, -1.0); + V4 s0_1 = l0(0.0, -1.0); + V4 s0_2 = l0(1.0, -1.0); + V4 s0_3 = l0(-1.0, 0.0); + V4 s0_4 = l0(0.0, 0.0); + V4 s0_5 = l0(1.0, 0.0); + V4 s0_6 = l0(-1.0, 1.0); + V4 s0_7 = l0(0.0, 1.0); + V4 s0_8 = l0(1.0, 1.0); + V4 s1_0 = -max(-s0_0, 0.0); + V4 s1_1 = -max(-s0_1, 0.0); + V4 s1_2 = -max(-s0_2, 0.0); + V4 s1_3 = -max(-s0_3, 0.0); + V4 s1_4 = -max(-s0_4, 0.0); + V4 s1_5 = -max(-s0_5, 0.0); + V4 s1_6 = -max(-s0_6, 0.0); + V4 s1_7 = -max(-s0_7, 0.0); + V4 s1_8 = -max(-s0_8, 0.0); + s0_0 = max(s0_0, 0.0); + s0_1 = max(s0_1, 0.0); + s0_2 = max(s0_2, 0.0); + s0_3 = max(s0_3, 0.0); + s0_4 = max(s0_4, 0.0); + s0_5 = max(s0_5, 0.0); + s0_6 = max(s0_6, 0.0); + s0_7 = max(s0_7, 0.0); + s0_8 = max(s0_8, 0.0); + + t1[gxy] = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8); +} + +//!PASS 5 +//!DESC out-shuffle +//!BLOCK_SIZE 16 +//!NUM_THREADS 64 +//!IN INPUT, t1 +//!OUT OUTPUT + +#define l0(x, y) V4(O(t1, float2(x, y))) + +V4 f0(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8) { + V4 r = 0.0; + r += mul(s0_0, M4(1.116e-01, 1.402e-01, 1.439e-02, 5.091e-02, -1.526e-02, -2.562e-02, -1.193e-02, -1.365e-02, -6.156e-02, -3.463e-02, 2.155e-02, -2.192e-02, -2.937e-02, -1.072e-01, -4.538e-02, -3.302e-02)); + r += mul(s0_1, M4(-1.192e-02, -1.724e-02, 9.899e-03, -5.861e-03, -1.552e-02, 2.422e-02, 4.929e-03, 7.339e-03, 4.700e-02, 1.993e-01, -6.323e-02, 5.778e-02, 1.499e-01, 3.916e-01, -4.578e-02, -2.026e-02)); + r += mul(s0_2, M4(5.431e-03, 1.916e-03, -2.064e-03, -6.545e-04, -1.731e-02, -8.081e-02, 1.391e-02, -7.036e-03, 7.739e-02, -1.588e-01, 2.970e-02, 3.357e-02, 3.869e-02, -7.824e-02, 1.813e-02, -6.252e-02)); + r += mul(s0_3, M4(5.283e-01, 8.076e-02, 3.430e-01, 2.332e-01, -3.540e-02, 1.903e-02, -1.354e-02, -1.415e-02, -1.644e-01, -1.319e-02, -9.781e-02, -3.256e-02, 2.768e-02, -3.914e-02, 1.596e-01, -1.067e-01)); + r += mul(s0_4, M4(-1.638e-02, 4.385e-01, -1.479e-01, -1.789e-02, -1.399e-01, -5.884e-02, -7.306e-02, -2.036e-03, 5.196e-01, -1.849e-01, 8.771e-01, 3.595e-01, -7.094e-01, 2.485e-02, -3.977e-02, 7.246e-01)); + r += mul(s0_5, M4(-1.647e-03, -6.027e-03, -3.787e-03, -1.975e-02, -4.810e-02, -4.557e-01, 4.921e-02, -1.313e-01, -2.044e-02, 3.533e-01, -7.591e-02, 1.249e-02, 2.648e-02, -5.215e-01, 1.204e-01, -2.254e-01)); + r += mul(s0_6, M4(-2.852e-02, -1.630e-02, 1.249e-01, -1.758e-02, 4.285e-02, 1.425e-02, -1.595e-02, 2.618e-02, 4.460e-03, 1.266e-02, -3.914e-02, 1.111e-02, 5.378e-02, 2.199e-02, 2.561e-03, 2.125e-02)); + r += mul(s0_7, M4(-6.567e-02, -4.333e-02, -4.153e-03, 1.692e-01, 5.376e-02, 5.736e-02, -1.860e-01, -9.094e-02, 3.357e-02, -3.186e-02, 1.244e-01, -9.606e-02, 6.227e-02, 6.827e-02, -2.086e-01, -6.625e-02)); + r += mul(s0_8, M4(4.553e-05, -3.116e-02, 1.023e-02, 2.322e-02, 8.623e-02, 1.125e-01, 2.802e-02, -2.768e-01, -1.003e-01, -2.143e-02, -2.413e-02, 1.460e-01, 5.421e-02, 5.798e-02, 3.478e-03, -1.421e-01)); + r += mul(s1_0, M4(2.165e-01, 1.123e-01, -3.653e-02, -6.070e-03, -1.021e-01, -6.901e-04, 6.256e-03, -3.182e-03, -4.285e-02, -6.763e-02, 2.278e-02, -1.860e-02, -2.689e-02, 2.567e-02, 2.634e-03, 3.600e-02)); + r += mul(s1_1, M4(-1.159e-01, -1.198e-01, 2.991e-02, -6.143e-02, 1.038e-01, -5.076e-02, -1.785e-02, -3.611e-02, 6.860e-02, 9.302e-02, -1.125e-02, 3.332e-02, 6.457e-02, -3.919e-02, 4.158e-03, -1.201e-02)); + r += mul(s1_2, M4(-6.554e-03, 3.359e-02, -2.003e-02, -2.227e-04, 3.354e-02, -3.700e-02, -9.588e-03, -3.740e-02, -1.336e-02, -2.556e-04, -4.733e-03, -1.636e-02, 1.127e-02, 1.421e-02, -1.019e-02, -2.731e-02)); + r += mul(s1_3, M4(3.642e-01, -3.756e-03, 6.584e-01, 1.773e-01, -1.638e-02, 1.109e-02, -7.427e-02, -1.572e-02, -1.869e-01, -3.059e-02, -8.088e-02, -5.092e-02, -5.794e-02, -4.431e-02, -7.912e-02, -9.767e-02)); + r += mul(s1_4, M4(-3.255e-02, 3.115e-01, -2.109e-01, 2.804e-01, -6.504e-01, -1.342e-02, 1.355e-01, 3.623e-01, 5.142e-01, 2.124e-01, 1.866e-01, 2.268e-01, -2.470e-02, 1.629e-01, 1.163e-01, 1.663e-01)); + r += mul(s1_5, M4(-1.093e-02, -1.640e-04, -3.502e-02, -3.746e-02, 1.836e-02, -5.959e-01, 1.323e-01, -2.388e-01, 3.482e-02, 1.823e-01, -3.895e-02, 5.164e-03, -7.314e-02, -3.897e-01, 6.275e-02, -3.974e-02)); + r += mul(s1_6, M4(7.922e-03, -3.284e-02, 1.274e-01, -2.930e-02, 6.307e-02, 2.548e-02, -4.094e-02, 2.130e-02, -1.123e-02, 1.824e-03, -9.595e-02, 1.808e-02, 7.955e-02, 3.285e-02, 4.592e-02, 7.153e-02)); + r += mul(s1_7, M4(-6.410e-02, -1.423e-02, -4.912e-02, 1.461e-01, 6.612e-02, 9.838e-02, -2.153e-01, -1.067e-01, -1.108e-02, -1.048e-01, 2.778e-01, -1.116e-01, 4.569e-02, 2.955e-02, -1.440e-01, -3.364e-02)); + r += mul(s1_8, M4(1.721e-02, 1.171e-02, 1.096e-02, -2.832e-02, 7.446e-02, 4.785e-02, 8.270e-03, -1.640e-01, -8.912e-02, -6.617e-02, 3.225e-03, 9.894e-02, 4.367e-02, 8.102e-02, -1.779e-02, -2.410e-01)); + r += V4(1.708e-05, 2.435e-04, 1.267e-03, 1.926e-03); + return tanh(r); +} + +void Pass5(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = (Rmp8x8(tid.x) << 1) + blockStart; + uint2 size = GetOutputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = ((gxy >> 1) + 0.5) * pt; + + V4 s0_0 = l0(-1.0, -1.0); + V4 s0_1 = l0(0.0, -1.0); + V4 s0_2 = l0(1.0, -1.0); + V4 s0_3 = l0(-1.0, 0.0); + V4 s0_4 = l0(0.0, 0.0); + V4 s0_5 = l0(1.0, 0.0); + V4 s0_6 = l0(-1.0, 1.0); + V4 s0_7 = l0(0.0, 1.0); + V4 s0_8 = l0(1.0, 1.0); + V4 s1_0 = -max(-s0_0, 0.0); + V4 s1_1 = -max(-s0_1, 0.0); + V4 s1_2 = -max(-s0_2, 0.0); + V4 s1_3 = -max(-s0_3, 0.0); + V4 s1_4 = -max(-s0_4, 0.0); + V4 s1_5 = -max(-s0_5, 0.0); + V4 s1_6 = -max(-s0_6, 0.0); + V4 s1_7 = -max(-s0_7, 0.0); + V4 s1_8 = -max(-s0_8, 0.0); + s0_0 = max(s0_0, 0.0); + s0_1 = max(s0_1, 0.0); + s0_2 = max(s0_2, 0.0); + s0_3 = max(s0_3, 0.0); + s0_4 = max(s0_4, 0.0); + s0_5 = max(s0_5, 0.0); + s0_6 = max(s0_6, 0.0); + s0_7 = max(s0_7, 0.0); + s0_8 = max(s0_8, 0.0); + + V4 r = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8); + + static const float3x3 rgb2yuv = {0.299, 0.587, 0.114, -0.169, -0.331, 0.5, 0.5, -0.419, -0.081}; + static const float3x3 yuv2rgb = {1, -0.00093, 1.401687, 1, -0.3437, -0.71417, 1, 1.77216, 0.00099}; + float2 opt = float2(GetOutputPt()); + + pos -= 0.5f * opt; + float3 yuv = mul(rgb2yuv, INPUT.SampleLevel(SL, pos, 0).rgb); + OUTPUT[gxy] = float4(mul(yuv2rgb, float3(saturate(yuv.r + r.x), yuv.yz)), 1); + + ++gxy.x; + pos.x += opt.x; + yuv = mul(rgb2yuv, INPUT.SampleLevel(SL, pos, 0).rgb); + OUTPUT[gxy] = float4(mul(yuv2rgb, float3(saturate(yuv.r + r.y), yuv.yz)), 1); + + ++gxy.y; + pos.y += opt.y; + yuv = mul(rgb2yuv, INPUT.SampleLevel(SL, pos, 0).rgb); + OUTPUT[gxy] = float4(mul(yuv2rgb, float3(saturate(yuv.r + r.w), yuv.yz)), 1); + + --gxy.x; + pos.x -= opt.x; + yuv = mul(rgb2yuv, INPUT.SampleLevel(SL, pos, 0).rgb); + OUTPUT[gxy] = float4(mul(yuv2rgb, float3(saturate(yuv.r + r.z), yuv.yz)), 1); +} diff --git a/src/Effects/CuNNy/CuNNy-3x4C-NVL.hlsl b/src/Effects/CuNNy/CuNNy-3x4C-NVL.hlsl new file mode 100644 index 000000000..adfc942e2 --- /dev/null +++ b/src/Effects/CuNNy/CuNNy-3x4C-NVL.hlsl @@ -0,0 +1,413 @@ +// CuNNy 3x4C BILINEAR RGB NVL - https://github.com/cunnyplapper/CuNNy + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +//!MAGPIE EFFECT +//!VERSION 4 +//!SORT_NAME CuNNy-D04N03 + +//!TEXTURE +Texture2D INPUT; + +//!TEXTURE +//!WIDTH INPUT_WIDTH * 2 +//!HEIGHT INPUT_HEIGHT * 2 +Texture2D OUTPUT; + +//!SAMPLER +//!FILTER POINT +SamplerState SP; + +//!SAMPLER +//!FILTER LINEAR +SamplerState SL; + +//!COMMON +#define O(t, p) t.SampleLevel(SP, pos + p * pt, 0) +#define V4 min16float4 +#define M4 min16float4x4 + +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +//!FORMAT R8G8B8A8_SNORM +Texture2D t0; + +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +//!FORMAT R8G8B8A8_SNORM +Texture2D t1; + +//!PASS 1 +//!DESC in +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 +//!IN INPUT +//!OUT t0 + +#define l0(x, y) min16float((dot(float3(6.094e-01, 1.148e+00, 2.568e-01), O(INPUT, float2(x, y)).rgb) + -1.542e+00)) + +V4 f0(min16float s0_0, min16float s0_1, min16float s0_2, min16float s0_3, min16float s0_4, min16float s0_5, min16float s0_6, min16float s0_7, min16float s0_8) { + V4 r = 0.0; + r += V4(-6.372e-02, 1.685e-01, -2.573e-02, -2.185e-02) * s0_0; + r += V4(-3.502e-02, -2.984e-03, 5.048e-02, -2.445e-01) * s0_1; + r += V4(9.644e-02, -7.557e-03, -1.770e-02, 3.162e-02) * s0_2; + r += V4(7.199e-02, -6.233e-01, -4.180e-01, 1.392e-01) * s0_3; + r += V4(-5.683e-01, 1.451e-01, -8.148e-02, 9.768e-02) * s0_4; + r += V4(4.702e-01, -1.319e-03, 3.745e-03, -4.204e-02) * s0_5; + r += V4(9.855e-03, 3.213e-01, 5.098e-01, 4.001e-02) * s0_6; + r += V4(8.216e-02, -1.219e-02, -3.347e-02, 5.017e-02) * s0_7; + r += V4(-6.691e-02, 5.417e-03, 1.235e-02, -9.640e-03) * s0_8; + r += V4(-4.952e-03, -2.750e-03, -9.137e-04, 6.736e-02); + return r; +} + +void Pass1(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = Rmp8x8(tid.x) + blockStart; + uint2 size = GetInputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = (gxy + 0.5) * pt; + + min16float s0_0 = l0(-1.0, -1.0); + min16float s0_1 = l0(0.0, -1.0); + min16float s0_2 = l0(1.0, -1.0); + min16float s0_3 = l0(-1.0, 0.0); + min16float s0_4 = l0(0.0, 0.0); + min16float s0_5 = l0(1.0, 0.0); + min16float s0_6 = l0(-1.0, 1.0); + min16float s0_7 = l0(0.0, 1.0); + min16float s0_8 = l0(1.0, 1.0); + + t0[gxy] = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8); +} + +//!PASS 2 +//!DESC conv1 +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 +//!IN t0 +//!OUT t1 + +#define l0(x, y) V4(O(t0, float2(x, y))) + +V4 f0(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8) { + V4 r = 0.0; + r += mul(s0_0, M4(3.169e-01, 3.467e-01, -2.365e-01, 2.253e-01, 6.307e-02, 1.727e-01, -1.053e-01, 9.324e-02, -4.901e-02, -2.112e-01, 8.983e-02, -1.851e-01, -1.987e-01, 6.645e-02, 2.188e-02, 1.988e-02)); + r += mul(s0_1, M4(4.393e-02, 2.078e-01, -1.967e-01, 4.673e-02, -7.991e-02, 2.461e-01, -6.028e-02, 9.252e-02, 3.871e-01, 6.138e-02, -3.603e-01, -1.485e-01, 2.466e-01, 5.251e-02, -6.181e-02, 8.932e-02)); + r += mul(s0_2, M4(-1.707e-02, 2.598e-02, 1.641e-02, 2.780e-02, 2.425e-02, 1.769e-01, -8.461e-02, 1.067e-01, -2.503e-01, 6.051e-01, -2.782e-01, 1.311e-01, -8.456e-03, -1.370e-02, -6.391e-02, 6.935e-02)); + r += mul(s0_3, M4(-8.251e-01, -4.981e-01, -1.726e-01, -1.815e-01, 1.411e-01, 2.889e-02, -3.115e-01, -3.255e-01, 1.812e-03, -4.529e-02, 2.350e-01, 1.999e-01, -1.993e-01, -1.868e-02, 4.249e-02, -1.117e-01)); + r += mul(s0_4, M4(-4.732e-02, -5.673e-02, 1.274e-01, 4.894e-02, 9.126e-02, 1.717e-01, -3.294e-01, -2.378e-01, -7.089e-02, -8.116e-02, 2.510e-01, 7.381e-02, 1.275e-01, 8.030e-02, -1.671e-01, -1.824e-02)); + r += mul(s0_5, M4(3.373e-02, -4.163e-02, -4.077e-02, -2.085e-02, 1.265e-01, -4.133e-01, 7.433e-02, 7.763e-02, -1.466e-01, 3.291e-01, -7.784e-02, 9.472e-02, 2.725e-01, -2.393e-01, -6.913e-02, -9.445e-02)); + r += mul(s0_6, M4(3.043e-02, -9.985e-02, 1.538e-01, -2.529e-01, 2.379e-01, 1.079e-01, -1.517e-01, -9.289e-02, -1.396e-01, -4.354e-02, 8.463e-02, 7.052e-02, 5.629e-02, 3.293e-03, 5.342e-02, -1.606e-01)); + r += mul(s0_7, M4(3.626e-02, -1.421e-01, 4.017e-02, -3.963e-02, 2.148e-03, 5.522e-02, 3.174e-01, 2.270e-02, -5.590e-02, -9.875e-02, -1.683e-01, 5.415e-02, 1.509e-01, 7.709e-02, -1.161e-01, 1.440e-01)); + r += mul(s0_8, M4(-1.132e-02, 2.337e-02, 1.264e-02, 2.638e-03, -6.582e-02, -1.965e-01, 2.803e-01, 1.333e-01, 9.171e-02, 1.567e-01, -2.419e-01, -1.602e-01, -2.271e-01, 3.614e-02, 2.179e-01, 4.826e-02)); + r += mul(s1_0, M4(1.452e-01, 1.313e-01, -6.140e-02, 2.412e-01, -3.691e-02, 7.355e-02, -4.209e-02, 1.343e-01, -2.509e-02, -1.266e-01, 9.017e-02, -1.854e-02, -4.280e-01, -1.004e-01, 2.319e-01, 4.211e-02)); + r += mul(s1_1, M4(4.894e-02, 7.564e-02, -9.350e-02, 5.422e-02, -6.111e-02, 6.969e-02, -4.398e-02, 6.622e-02, 7.113e-01, 3.461e-01, -5.254e-01, -8.808e-02, 4.481e-01, 3.171e-01, -2.198e-01, 1.048e-01)); + r += mul(s1_2, M4(-3.483e-02, 3.150e-03, 2.215e-02, 2.616e-02, 1.468e-01, -1.295e-01, -1.470e-01, 3.371e-02, -4.514e-02, 4.677e-02, -1.313e-01, -1.176e-01, 1.507e-03, 2.290e-01, -2.163e-01, 3.895e-02)); + r += mul(s1_3, M4(-2.258e-01, -1.353e-01, -4.873e-01, -1.236e+00, 1.660e-01, -1.803e-02, -2.797e-01, -4.092e-01, -1.525e-01, -8.178e-02, 2.665e-01, 3.652e-01, -1.853e-01, -3.819e-02, 1.627e-01, -3.896e-01)); + r += mul(s1_4, M4(-1.005e-01, -3.821e-02, 9.917e-02, -1.324e-01, -2.040e-01, -3.586e-01, 9.776e-02, -1.376e-01, 2.065e-01, 2.017e-01, -1.320e-01, -2.225e-02, 2.944e-01, 5.393e-02, -4.301e-01, -7.240e-02)); + r += mul(s1_5, M4(5.353e-02, -4.257e-02, -4.131e-02, -3.943e-02, -6.151e-02, 3.059e-01, -1.481e-02, 3.662e-01, 3.098e-02, -8.774e-02, 1.790e-02, -1.332e-01, 8.670e-02, -6.985e-02, -1.359e-01, 2.063e-01)); + r += mul(s1_6, M4(-9.271e-02, 2.259e-01, 2.200e-02, -2.390e-01, 3.258e-01, 1.082e-01, -1.499e-01, -3.063e-02, -2.775e-01, -9.008e-02, 1.294e-01, 3.533e-02, 1.011e-02, 4.294e-02, 4.935e-02, -1.005e-01)); + r += mul(s1_7, M4(1.321e-02, -7.160e-02, 7.229e-02, -3.050e-02, 4.303e-02, -1.518e-01, 5.137e-01, 4.029e-02, 4.896e-02, 5.334e-02, -3.545e-01, 2.370e-02, 1.645e-01, 3.433e-02, -9.552e-03, 1.032e-01)); + r += mul(s1_8, M4(8.370e-03, -2.408e-02, 2.693e-02, -8.183e-03, -2.375e-02, -2.973e-01, 1.889e-01, 1.096e-01, 1.093e-02, 2.310e-01, -1.613e-01, -1.343e-01, -1.718e-01, -2.165e-02, 1.384e-01, 9.956e-02)); + r += V4(-1.511e-02, -2.848e-03, 7.160e-03, -2.555e-03); + return r; +} + +void Pass2(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = Rmp8x8(tid.x) + blockStart; + uint2 size = GetInputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = (gxy + 0.5) * pt; + + V4 s0_0 = l0(-1.0, -1.0); + V4 s0_1 = l0(0.0, -1.0); + V4 s0_2 = l0(1.0, -1.0); + V4 s0_3 = l0(-1.0, 0.0); + V4 s0_4 = l0(0.0, 0.0); + V4 s0_5 = l0(1.0, 0.0); + V4 s0_6 = l0(-1.0, 1.0); + V4 s0_7 = l0(0.0, 1.0); + V4 s0_8 = l0(1.0, 1.0); + V4 s1_0 = -max(-s0_0, 0.0); + V4 s1_1 = -max(-s0_1, 0.0); + V4 s1_2 = -max(-s0_2, 0.0); + V4 s1_3 = -max(-s0_3, 0.0); + V4 s1_4 = -max(-s0_4, 0.0); + V4 s1_5 = -max(-s0_5, 0.0); + V4 s1_6 = -max(-s0_6, 0.0); + V4 s1_7 = -max(-s0_7, 0.0); + V4 s1_8 = -max(-s0_8, 0.0); + s0_0 = max(s0_0, 0.0); + s0_1 = max(s0_1, 0.0); + s0_2 = max(s0_2, 0.0); + s0_3 = max(s0_3, 0.0); + s0_4 = max(s0_4, 0.0); + s0_5 = max(s0_5, 0.0); + s0_6 = max(s0_6, 0.0); + s0_7 = max(s0_7, 0.0); + s0_8 = max(s0_8, 0.0); + + t1[gxy] = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8); +} + +//!PASS 3 +//!DESC conv2 +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 +//!IN t1 +//!OUT t0 + +#define l0(x, y) V4(O(t1, float2(x, y))) + +V4 f0(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8) { + V4 r = 0.0; + r += mul(s0_0, M4(6.983e-02, 8.935e-03, -1.644e-01, -4.232e-04, -1.981e-01, 9.265e-02, 1.769e-01, 1.705e-01, -2.300e-02, -7.408e-03, -4.221e-02, -1.617e-02, -6.026e-02, -9.185e-03, -7.420e-02, -4.238e-02)); + r += mul(s0_1, M4(1.832e-01, -1.117e-01, 1.784e-02, 6.345e-02, -9.651e-02, 5.753e-02, 1.480e-01, 1.284e-01, 3.957e-01, -2.684e-01, 2.853e-02, -5.823e-02, -8.184e-02, 1.062e-01, -2.604e-02, -7.579e-02)); + r += mul(s0_2, M4(-1.753e-01, 5.019e-03, -1.285e-01, 8.470e-02, -2.566e-01, 6.556e-02, -9.751e-02, 7.653e-03, -9.466e-02, 3.098e-02, -9.617e-02, -4.826e-02, 3.951e-02, -5.446e-02, 1.297e-01, 1.076e-01)); + r += mul(s0_3, M4(-7.377e-02, -2.183e-01, 9.806e-02, 1.735e-01, 2.795e-01, 3.730e-01, 1.906e-01, 1.313e-01, 2.115e-01, 2.222e-01, 1.880e-01, 2.427e-01, -1.177e-01, 2.587e-02, -1.928e-01, -1.489e-01)); + r += mul(s0_4, M4(-3.487e-01, -3.194e-01, 7.963e-01, -1.044e-01, 3.136e-01, -5.467e-02, 5.059e-01, -4.801e-02, -4.943e-01, -1.466e-01, -5.938e-02, -9.473e-01, 2.661e-01, -1.545e-01, 1.986e-01, -2.172e-02)); + r += mul(s0_5, M4(-3.450e-01, 1.931e-01, -2.303e-01, -1.880e-01, -1.323e-01, 1.839e-01, -1.130e-01, -5.181e-02, 3.049e-02, 9.834e-02, -1.342e-01, -1.072e-01, 1.925e-02, -9.652e-02, 1.169e-01, 2.084e-01)); + r += mul(s0_6, M4(1.543e-02, 2.202e-01, 4.809e-02, 1.085e-01, 3.076e-02, -4.127e-01, 4.606e-02, 9.444e-02, 7.886e-02, -1.314e-01, -1.638e-02, 4.353e-02, 9.790e-02, -6.783e-02, -1.008e-01, -1.558e-01)); + r += mul(s0_7, M4(-4.453e-02, 3.133e-01, -2.217e-01, -5.271e-02, -2.055e-01, -1.000e-01, 8.374e-02, 6.141e-02, 2.147e-02, -3.844e-01, -2.203e-01, -1.105e-01, -3.596e-02, 2.026e-01, 3.174e-01, 1.519e-01)); + r += mul(s0_8, M4(-5.107e-03, 2.380e-01, 2.147e-02, -8.032e-02, -9.743e-02, 6.943e-02, 9.403e-02, 3.742e-02, -1.822e-02, -4.950e-02, 7.963e-02, -1.338e-01, -1.491e-01, 1.655e-02, -5.817e-02, 1.164e-01)); + r += mul(s1_0, M4(8.679e-02, -7.335e-02, -5.999e-02, -4.504e-02, -3.329e-02, 4.349e-03, -4.883e-02, 3.159e-02, -7.948e-02, 3.308e-02, 6.579e-02, 1.607e-01, 1.336e-01, -1.042e-01, -2.368e-01, -1.546e-01)); + r += mul(s1_1, M4(2.764e-01, -6.665e-02, 1.661e-02, -4.103e-02, 1.095e-01, -1.159e-01, -1.142e-01, -1.412e-01, 4.033e-01, -8.697e-02, 2.387e-01, 1.762e-01, 4.948e-01, -1.533e-01, 7.816e-02, 5.700e-02)); + r += mul(s1_2, M4(1.187e-01, -6.571e-02, 4.698e-02, 4.931e-02, -5.523e-02, 3.925e-02, -7.453e-02, -8.429e-02, -2.202e-01, 6.090e-02, -1.460e-01, 2.777e-02, 4.405e-01, 6.445e-03, 3.494e-01, 3.311e-01)); + r += mul(s1_3, M4(-4.333e-02, -8.517e-02, 1.372e-01, 2.066e-01, 4.728e-01, 1.195e-01, -2.627e-01, -2.280e-01, 1.606e-01, 2.216e-01, 2.269e-01, 3.505e-01, -2.499e-01, -3.977e-01, -3.659e-02, 1.460e-02)); + r += mul(s1_4, M4(-4.640e-01, -7.221e-01, -2.524e-01, -6.513e-01, 6.699e-01, -1.727e-01, 4.444e-01, -3.115e-01, -6.748e-01, 1.063e-01, 6.487e-01, -3.195e-01, -5.136e-01, -8.272e-01, 4.014e-01, 4.914e-01)); + r += mul(s1_5, M4(-1.112e-03, -1.293e-02, 1.567e-02, -1.266e-01, 1.185e-01, 4.940e-02, -9.925e-02, -1.034e-01, -1.041e-01, 1.822e-01, -4.277e-02, 1.313e-01, -6.459e-01, -1.562e-01, -3.961e-01, -7.262e-02)); + r += mul(s1_6, M4(1.499e-02, 3.135e-01, 2.187e-01, 2.386e-01, 1.171e-01, -4.899e-01, -1.987e-01, -1.717e-01, 5.232e-02, -1.984e-01, 9.338e-04, 1.092e-01, 1.545e-01, 4.183e-01, 1.180e-01, 1.102e-01)); + r += mul(s1_7, M4(-1.411e-01, 2.619e-01, -2.549e-01, -2.113e-01, -1.109e-01, -3.038e-01, 7.579e-02, -3.585e-02, -1.373e-03, -2.713e-01, -5.527e-02, 7.052e-02, -1.648e-01, 7.324e-01, 3.974e-01, 2.306e-01)); + r += mul(s1_8, M4(-1.861e-02, 9.414e-02, -6.739e-02, -8.921e-02, -2.337e-02, -2.657e-02, -3.376e-03, -7.209e-02, -1.042e-01, -2.504e-02, 1.287e-01, -1.459e-02, -1.617e-01, 2.384e-01, -6.969e-01, -3.760e-01)); + r += V4(-3.514e-03, 2.350e-03, 2.221e-03, 1.089e-03); + return r; +} + +void Pass3(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = Rmp8x8(tid.x) + blockStart; + uint2 size = GetInputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = (gxy + 0.5) * pt; + + V4 s0_0 = l0(-1.0, -1.0); + V4 s0_1 = l0(0.0, -1.0); + V4 s0_2 = l0(1.0, -1.0); + V4 s0_3 = l0(-1.0, 0.0); + V4 s0_4 = l0(0.0, 0.0); + V4 s0_5 = l0(1.0, 0.0); + V4 s0_6 = l0(-1.0, 1.0); + V4 s0_7 = l0(0.0, 1.0); + V4 s0_8 = l0(1.0, 1.0); + V4 s1_0 = -max(-s0_0, 0.0); + V4 s1_1 = -max(-s0_1, 0.0); + V4 s1_2 = -max(-s0_2, 0.0); + V4 s1_3 = -max(-s0_3, 0.0); + V4 s1_4 = -max(-s0_4, 0.0); + V4 s1_5 = -max(-s0_5, 0.0); + V4 s1_6 = -max(-s0_6, 0.0); + V4 s1_7 = -max(-s0_7, 0.0); + V4 s1_8 = -max(-s0_8, 0.0); + s0_0 = max(s0_0, 0.0); + s0_1 = max(s0_1, 0.0); + s0_2 = max(s0_2, 0.0); + s0_3 = max(s0_3, 0.0); + s0_4 = max(s0_4, 0.0); + s0_5 = max(s0_5, 0.0); + s0_6 = max(s0_6, 0.0); + s0_7 = max(s0_7, 0.0); + s0_8 = max(s0_8, 0.0); + + t0[gxy] = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8); +} + +//!PASS 4 +//!DESC conv3 +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 +//!IN t0 +//!OUT t1 + +#define l0(x, y) V4(O(t0, float2(x, y))) + +V4 f0(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8) { + V4 r = 0.0; + r += mul(s0_0, M4(1.869e-01, 8.774e-02, -6.451e-02, 6.682e-02, 8.374e-02, 1.313e-02, -2.649e-02, 2.741e-02, -3.609e-02, -9.330e-02, -8.233e-02, 1.117e-01, -1.203e-01, 1.719e-02, 1.288e-01, -9.851e-02)); + r += mul(s0_1, M4(3.100e-01, 5.063e-02, 1.169e-01, -3.828e-02, 3.428e-01, 4.869e-02, -1.232e-02, -1.003e-02, 2.756e-01, 3.916e-01, 1.450e-01, 1.078e-01, -2.568e-01, -2.157e-01, -1.057e-01, -1.338e-01)); + r += mul(s0_2, M4(1.199e-01, -1.890e-01, 5.870e-03, -5.995e-03, 2.255e-01, -2.325e-03, 7.916e-03, -2.038e-02, 1.353e-01, -9.590e-02, -2.119e-02, -5.860e-02, -7.698e-02, -3.608e-02, -3.571e-02, 2.010e-02)); + r += mul(s0_3, M4(9.889e-02, -2.665e-02, -2.627e-01, 3.583e-01, 7.891e-02, 8.737e-02, 5.322e-02, 5.246e-04, -5.188e-02, -8.491e-02, -4.991e-02, -3.735e-02, 5.711e-02, 4.482e-02, 5.660e-02, -1.322e-01)); + r += mul(s0_4, M4(-5.488e-01, 2.898e-01, 1.046e+00, 6.036e-01, -3.180e-01, -6.309e-01, -2.627e-01, 1.734e-01, -2.067e-01, 3.775e-02, -2.881e-01, -9.242e-02, 3.369e-01, 2.554e-02, -1.645e-01, 4.973e-01)); + r += mul(s0_5, M4(6.976e-03, -1.830e-01, 2.842e-01, 2.570e-02, -2.902e-01, 5.059e-01, 1.944e-01, 1.794e-02, -1.333e-01, 2.341e-01, 4.161e-01, -5.179e-02, 8.176e-02, -2.435e-02, -1.598e-02, 6.211e-02)); + r += mul(s0_6, M4(-2.668e-02, -6.958e-02, -5.015e-02, 8.035e-02, 4.451e-02, -1.290e-03, -7.688e-02, 1.708e-01, -5.133e-02, -2.768e-02, -1.780e-02, -6.317e-02, -9.692e-03, -2.748e-03, 9.070e-03, -1.314e-01)); + r += mul(s0_7, M4(1.402e-01, 4.997e-02, -4.973e-02, 6.839e-01, 2.079e-02, -2.511e-02, 3.403e-01, -3.077e-01, -2.831e-02, 4.816e-02, -9.142e-02, -8.176e-02, -2.999e-02, -5.749e-03, -5.579e-02, -2.355e-01)); + r += mul(s0_8, M4(-1.783e-02, -2.882e-02, 9.841e-02, 4.473e-02, 4.128e-02, -3.071e-02, -2.378e-01, 1.347e-01, -2.285e-02, 1.317e-02, -1.632e-02, 1.058e-01, -3.696e-02, -6.864e-03, -8.989e-02, -7.315e-02)); + r += mul(s1_0, M4(8.857e-02, 3.169e-02, -1.896e-02, 1.258e-02, 7.086e-02, 5.699e-02, 1.550e-02, -1.836e-02, 1.209e-01, 5.334e-02, -1.557e-02, -2.374e-02, -1.411e-02, 1.543e-02, 1.769e-02, -4.332e-02)); + r += mul(s1_1, M4(1.199e-01, -8.203e-03, -1.695e-02, -3.214e-02, 5.918e-01, 3.458e-01, 7.684e-02, -5.137e-01, 2.827e-01, -2.008e-02, -1.848e-01, 2.147e-01, 7.212e-02, -3.906e-03, -2.220e-01, -1.918e-01)); + r += mul(s1_2, M4(4.464e-02, 4.035e-02, 4.265e-03, 1.350e-02, -4.623e-01, -1.882e-01, 9.929e-02, -2.295e-01, 2.010e-01, 6.059e-01, 3.648e-01, -1.670e-02, -6.763e-02, -2.588e-01, -1.741e-01, 3.358e-02)); + r += mul(s1_3, M4(1.003e-01, -2.961e-02, -1.715e-01, 1.057e-01, 3.275e-03, 1.877e-02, -4.995e-02, 1.181e-01, 3.600e-02, 2.101e-02, -1.050e-01, 8.035e-02, -8.107e-02, -1.067e-01, -5.457e-02, 5.339e-02)); + r += mul(s1_4, M4(3.875e-01, 3.638e-01, 1.178e-01, -4.404e-02, 6.128e-02, -1.193e-01, -3.161e-01, 3.510e-01, -3.482e-02, -2.842e-01, -3.917e-01, 4.525e-01, 1.969e-01, 5.299e-01, 4.720e-01, -2.266e-01)); + r += mul(s1_5, M4(-1.420e-02, 2.325e-02, -8.697e-02, -4.296e-03, 8.697e-02, 7.490e-02, 1.773e-01, 4.010e-01, 2.380e-01, -1.182e-01, 9.121e-01, 2.252e-01, 1.348e-01, -7.448e-02, -8.496e-01, -3.335e-01)); + r += mul(s1_6, M4(-7.923e-02, -2.533e-02, -4.896e-02, -5.473e-02, -5.329e-03, 1.285e-02, -1.763e-02, 7.009e-02, 9.670e-04, -1.889e-02, -1.008e-01, 1.149e-01, 7.259e-03, 4.080e-02, 1.042e-01, -2.627e-01)); + r += mul(s1_7, M4(-9.746e-02, 6.679e-02, -1.421e-01, -2.202e-01, -9.918e-03, -2.413e-02, -1.554e-02, 7.011e-03, -3.226e-02, -3.024e-02, -5.431e-02, 7.446e-02, 5.860e-02, 2.851e-02, -2.367e-01, 2.562e-02)); + r += mul(s1_8, M4(-4.627e-02, 4.226e-02, -8.654e-02, -3.312e-02, 1.600e-02, 2.983e-02, 8.834e-03, -3.871e-02, -4.137e-03, 1.767e-02, 2.492e-02, -5.391e-02, 8.133e-03, 1.430e-02, -2.428e-02, -1.132e-01)); + r += V4(-4.349e-03, -3.760e-03, 4.684e-03, 4.745e-03); + return r; +} + +void Pass4(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = Rmp8x8(tid.x) + blockStart; + uint2 size = GetInputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = (gxy + 0.5) * pt; + + V4 s0_0 = l0(-1.0, -1.0); + V4 s0_1 = l0(0.0, -1.0); + V4 s0_2 = l0(1.0, -1.0); + V4 s0_3 = l0(-1.0, 0.0); + V4 s0_4 = l0(0.0, 0.0); + V4 s0_5 = l0(1.0, 0.0); + V4 s0_6 = l0(-1.0, 1.0); + V4 s0_7 = l0(0.0, 1.0); + V4 s0_8 = l0(1.0, 1.0); + V4 s1_0 = -max(-s0_0, 0.0); + V4 s1_1 = -max(-s0_1, 0.0); + V4 s1_2 = -max(-s0_2, 0.0); + V4 s1_3 = -max(-s0_3, 0.0); + V4 s1_4 = -max(-s0_4, 0.0); + V4 s1_5 = -max(-s0_5, 0.0); + V4 s1_6 = -max(-s0_6, 0.0); + V4 s1_7 = -max(-s0_7, 0.0); + V4 s1_8 = -max(-s0_8, 0.0); + s0_0 = max(s0_0, 0.0); + s0_1 = max(s0_1, 0.0); + s0_2 = max(s0_2, 0.0); + s0_3 = max(s0_3, 0.0); + s0_4 = max(s0_4, 0.0); + s0_5 = max(s0_5, 0.0); + s0_6 = max(s0_6, 0.0); + s0_7 = max(s0_7, 0.0); + s0_8 = max(s0_8, 0.0); + + t1[gxy] = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8); +} + +//!PASS 5 +//!DESC out-shuffle +//!BLOCK_SIZE 16 +//!NUM_THREADS 64 +//!IN INPUT, t1 +//!OUT OUTPUT + +#define l0(x, y) V4(O(t1, float2(x, y))) + +V4 f0(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-4.783e-03, 7.235e-03, -7.275e-03, -2.802e-03, 4.921e-02, 7.543e-02, -3.357e-02, 1.213e-02, 2.900e-02, 2.380e-03, -9.028e-03, -2.594e-02, 1.576e-03, 3.334e-04, -2.460e-02, -1.285e-02)); + r += mul(s0_1, M4(4.582e-02, 9.378e-04, 2.217e-02, 5.083e-02, -1.054e-02, 8.518e-02, -1.884e-02, -5.149e-02, 1.983e-02, -1.106e-02, -4.317e-03, 5.384e-02, -5.193e-02, 1.089e-02, -9.384e-03, 3.137e-02)); + r += mul(s0_2, M4(-5.241e-03, 3.821e-02, -1.136e-02, -3.033e-02, 3.186e-02, -3.270e-03, 1.422e-02, 2.401e-02, -1.360e-02, 1.024e-01, -6.042e-02, -2.325e-02, -1.248e-01, -1.377e-01, 1.654e-02, -1.347e-02)); + r += mul(s0_3, M4(-3.552e-02, -3.211e-02, -2.282e-03, 1.775e-02, 1.360e-01, 2.808e-02, 1.082e-01, -1.311e-02, -1.699e-02, -2.628e-02, 3.430e-02, -3.880e-03, 2.514e-02, -3.171e-02, 4.675e-02, -2.711e-02)); + r += mul(s0_4, M4(4.756e-01, 2.686e-01, 4.514e-02, -8.813e-02, 2.636e-01, -4.893e-01, 1.301e-01, 1.304e-01, 3.778e-01, 2.765e-01, 3.369e-01, 8.811e-02, 5.080e-02, 2.783e-01, -1.131e-01, 2.487e-01)); + r += mul(s0_5, M4(-2.961e-02, 7.757e-02, -8.471e-02, -4.636e-02, -6.862e-02, 1.733e-01, -7.301e-02, -1.408e-02, 1.636e-02, 9.982e-02, 5.704e-02, 2.568e-01, -2.224e-02, -2.588e-01, -2.202e-01, -4.898e-01)); + r += mul(s0_6, M4(1.058e-01, -2.810e-02, -2.960e-02, -8.398e-02, -9.106e-02, 6.642e-02, -2.574e-02, 7.841e-02, -1.978e-02, -3.700e-02, -1.504e-02, -3.186e-02, 2.438e-03, 6.191e-03, -1.155e-02, -1.161e-02)); + r += mul(s0_7, M4(-6.316e-01, -7.748e-02, 8.006e-01, 3.936e-01, 1.300e-01, -1.999e-01, 2.351e-01, -7.485e-01, -7.151e-02, -4.285e-02, -2.277e-02, 2.849e-02, -2.207e-02, -2.585e-02, -2.498e-02, -3.308e-02)); + r += mul(s0_8, M4(-2.002e-01, -6.934e-01, -1.093e-01, 3.325e-01, -5.778e-02, 2.138e-02, -2.930e-02, 1.794e-01, -3.028e-03, 2.300e-03, 5.845e-03, -1.959e-02, 1.403e-02, 1.565e-02, 1.840e-02, -6.027e-04)); + r += mul(s1_0, M4(2.228e-02, -8.352e-03, -1.007e-02, -1.911e-02, -1.489e-02, 2.785e-03, -9.190e-03, 5.858e-03, 2.420e-02, -7.701e-03, -2.327e-02, -2.494e-02, -8.526e-03, -2.384e-02, -2.601e-02, -4.833e-02)); + r += mul(s1_1, M4(5.671e-02, 3.666e-02, 3.309e-02, 1.011e-02, -8.053e-03, 4.673e-02, -5.358e-02, -2.451e-02, 3.779e-01, 5.642e-02, -2.324e-01, -3.499e-02, -3.479e-01, 1.179e-01, -4.630e-02, 1.118e-01)); + r += mul(s1_2, M4(-1.650e-02, 6.203e-04, -1.322e-02, -1.996e-02, 2.118e-02, -9.244e-03, 2.813e-02, 9.773e-03, -2.654e-02, -8.373e-02, 6.663e-04, -6.860e-02, -3.436e-02, -7.207e-01, 2.389e-01, 1.903e-01)); + r += mul(s1_3, M4(-8.045e-02, -2.073e-02, 3.380e-02, 1.327e-02, 1.247e-01, 1.129e-02, 6.421e-02, -8.326e-03, -4.675e-02, 4.920e-02, -3.699e-02, 4.601e-02, 3.389e-02, -4.151e-02, 3.012e-02, -2.241e-02)); + r += mul(s1_4, M4(5.223e-01, 1.394e-01, 1.222e-01, -7.687e-03, -3.115e-01, 3.989e-02, -1.679e-01, 2.607e-01, 4.393e-01, -1.821e-01, 1.006e+00, -2.920e-01, 8.062e-02, 2.231e-01, -1.282e-02, 2.495e-01)); + r += mul(s1_5, M4(-1.146e-01, 6.738e-02, -1.655e-02, 1.178e-02, -3.058e-02, 1.093e-01, 9.367e-03, 1.382e-02, -7.397e-02, 2.300e-01, -4.202e-02, 1.765e-01, -4.671e-02, -1.375e-02, -3.662e-01, -5.254e-01)); + r += mul(s1_6, M4(5.090e-02, 8.633e-03, -1.128e-02, -3.186e-02, -6.263e-02, 4.143e-02, -2.214e-02, 5.270e-02, -1.370e-02, -1.692e-02, -2.644e-02, -9.847e-03, -2.147e-03, -7.941e-03, -1.323e-04, -5.173e-03)); + r += mul(s1_7, M4(-9.353e-02, 6.696e-02, 2.744e-01, 2.743e-01, 9.809e-02, -1.439e-01, -2.583e-02, -3.717e-01, -5.135e-02, -1.889e-02, -1.775e-02, 9.383e-03, -2.496e-02, -2.936e-02, -2.578e-02, -1.586e-02)); + r += mul(s1_8, M4(-1.565e-02, -1.635e-01, -1.800e-01, -2.607e-01, 1.975e-02, 1.594e-02, -4.568e-02, 1.218e-01, -6.668e-03, 7.923e-03, -4.625e-02, 1.324e-02, -6.838e-03, 2.045e-02, 1.141e-02, 2.717e-02)); + r += V4(7.204e-05, -6.226e-05, 2.867e-04, -3.251e-05); + return tanh(r); +} + +void Pass5(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = (Rmp8x8(tid.x) << 1) + blockStart; + uint2 size = GetOutputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = ((gxy >> 1) + 0.5) * pt; + + V4 s0_0 = l0(-1.0, -1.0); + V4 s0_1 = l0(0.0, -1.0); + V4 s0_2 = l0(1.0, -1.0); + V4 s0_3 = l0(-1.0, 0.0); + V4 s0_4 = l0(0.0, 0.0); + V4 s0_5 = l0(1.0, 0.0); + V4 s0_6 = l0(-1.0, 1.0); + V4 s0_7 = l0(0.0, 1.0); + V4 s0_8 = l0(1.0, 1.0); + V4 s1_0 = -max(-s0_0, 0.0); + V4 s1_1 = -max(-s0_1, 0.0); + V4 s1_2 = -max(-s0_2, 0.0); + V4 s1_3 = -max(-s0_3, 0.0); + V4 s1_4 = -max(-s0_4, 0.0); + V4 s1_5 = -max(-s0_5, 0.0); + V4 s1_6 = -max(-s0_6, 0.0); + V4 s1_7 = -max(-s0_7, 0.0); + V4 s1_8 = -max(-s0_8, 0.0); + s0_0 = max(s0_0, 0.0); + s0_1 = max(s0_1, 0.0); + s0_2 = max(s0_2, 0.0); + s0_3 = max(s0_3, 0.0); + s0_4 = max(s0_4, 0.0); + s0_5 = max(s0_5, 0.0); + s0_6 = max(s0_6, 0.0); + s0_7 = max(s0_7, 0.0); + s0_8 = max(s0_8, 0.0); + + V4 r = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8); + + static const float3x3 rgb2yuv = {0.299, 0.587, 0.114, -0.169, -0.331, 0.5, 0.5, -0.419, -0.081}; + static const float3x3 yuv2rgb = {1, -0.00093, 1.401687, 1, -0.3437, -0.71417, 1, 1.77216, 0.00099}; + float2 opt = float2(GetOutputPt()); + + pos -= 0.5f * opt; + float3 yuv = mul(rgb2yuv, INPUT.SampleLevel(SL, pos, 0).rgb); + OUTPUT[gxy] = float4(mul(yuv2rgb, float3(saturate(yuv.r + r.x), yuv.yz)), 1); + + ++gxy.x; + pos.x += opt.x; + yuv = mul(rgb2yuv, INPUT.SampleLevel(SL, pos, 0).rgb); + OUTPUT[gxy] = float4(mul(yuv2rgb, float3(saturate(yuv.r + r.y), yuv.yz)), 1); + + ++gxy.y; + pos.y += opt.y; + yuv = mul(rgb2yuv, INPUT.SampleLevel(SL, pos, 0).rgb); + OUTPUT[gxy] = float4(mul(yuv2rgb, float3(saturate(yuv.r + r.w), yuv.yz)), 1); + + --gxy.x; + pos.x -= opt.x; + yuv = mul(rgb2yuv, INPUT.SampleLevel(SL, pos, 0).rgb); + OUTPUT[gxy] = float4(mul(yuv2rgb, float3(saturate(yuv.r + r.z), yuv.yz)), 1); +} diff --git a/src/Effects/CuNNy/CuNNy-4x16C-NVL-DN.hlsl b/src/Effects/CuNNy/CuNNy-4x16C-NVL-DN.hlsl new file mode 100644 index 000000000..47aae938f --- /dev/null +++ b/src/Effects/CuNNy/CuNNy-4x16C-NVL-DN.hlsl @@ -0,0 +1,2223 @@ +// CuNNy 4x16C BILINEAR RGB NVL DN - https://github.com/cunnyplapper/CuNNy + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +//!MAGPIE EFFECT +//!VERSION 4 +//!SORT_NAME CuNNy-DN-D16N04 + +//!TEXTURE +Texture2D INPUT; + +//!TEXTURE +//!WIDTH INPUT_WIDTH * 2 +//!HEIGHT INPUT_HEIGHT * 2 +Texture2D OUTPUT; + +//!SAMPLER +//!FILTER POINT +SamplerState SP; + +//!SAMPLER +//!FILTER LINEAR +SamplerState SL; + +//!COMMON +#define O(t, p) t.SampleLevel(SP, pos + p * pt, 0) +#define V4 min16float4 +#define M4 min16float4x4 + +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +//!FORMAT R8G8B8A8_SNORM +Texture2D t0; + +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +//!FORMAT R8G8B8A8_SNORM +Texture2D t1; + +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +//!FORMAT R8G8B8A8_SNORM +Texture2D t2; + +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +//!FORMAT R8G8B8A8_SNORM +Texture2D t3; + +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +//!FORMAT R8G8B8A8_SNORM +Texture2D t4; + +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +//!FORMAT R8G8B8A8_SNORM +Texture2D t5; + +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +//!FORMAT R8G8B8A8_SNORM +Texture2D t6; + +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +//!FORMAT R8G8B8A8_SNORM +Texture2D t7; + +//!PASS 1 +//!DESC in +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 +//!IN INPUT +//!OUT t0, t1, t2, t3 + +#define l0(x, y) min16float((dot(float3(1.716e-01, 3.403e-01, 7.642e-02), O(INPUT, float2(x, y)).rgb) + -3.175e-01)) + +V4 f0(min16float s0_0, min16float s0_1, min16float s0_2, min16float s0_3, min16float s0_4, min16float s0_5, min16float s0_6, min16float s0_7, min16float s0_8) { + V4 r = 0.0; + r += V4(1.961e-02, -2.468e-02, -6.114e-02, -2.802e-01) * s0_0; + r += V4(1.970e-01, -1.878e-01, -2.297e-01, -3.432e-01) * s0_1; + r += V4(2.960e-01, -8.674e-02, -2.113e-03, 9.338e-03) * s0_2; + r += V4(-3.926e-02, -7.021e-02, -5.343e-03, 1.575e-01) * s0_3; + r += V4(-1.290e-01, 9.192e-02, 5.665e-03, 3.820e-01) * s0_4; + r += V4(3.069e-02, -3.926e-02, 8.457e-03, 6.161e-02) * s0_5; + r += V4(-1.308e-02, -7.427e-02, 8.740e-02, 3.248e-02) * s0_6; + r += V4(-2.776e-01, 1.103e-01, 2.417e-01, -9.734e-03) * s0_7; + r += V4(-9.002e-02, -2.320e-01, -4.780e-02, -1.075e-02) * s0_8; + r += V4(-1.870e-03, 2.595e-02, 1.016e-02, -2.176e-06); + return r; +} + +V4 f1(min16float s0_0, min16float s0_1, min16float s0_2, min16float s0_3, min16float s0_4, min16float s0_5, min16float s0_6, min16float s0_7, min16float s0_8) { + V4 r = 0.0; + r += V4(8.902e-03, 5.085e-03, 1.299e-01, 3.149e-02) * s0_0; + r += V4(-5.949e-02, -8.876e-02, -4.402e-02, 1.477e-01) * s0_1; + r += V4(2.232e-01, 5.137e-01, 1.173e-03, 2.469e-01) * s0_2; + r += V4(-3.289e-03, -3.042e-02, 1.745e-01, -5.937e-02) * s0_3; + r += V4(-2.485e-02, -4.547e-01, 1.545e-02, -1.043e-01) * s0_4; + r += V4(-3.966e-02, 5.600e-02, -4.284e-03, 1.237e-02) * s0_5; + r += V4(-2.038e-02, 2.123e-02, -2.101e-02, -8.507e-02) * s0_6; + r += V4(-6.178e-03, -9.692e-03, -1.255e-02, -1.780e-01) * s0_7; + r += V4(5.415e-03, -1.418e-02, 8.939e-04, -8.693e-03) * s0_8; + r += V4(2.045e-02, 1.725e-04, 6.812e-02, 7.844e-03); + return r; +} + +V4 f2(min16float s0_0, min16float s0_1, min16float s0_2, min16float s0_3, min16float s0_4, min16float s0_5, min16float s0_6, min16float s0_7, min16float s0_8) { + V4 r = 0.0; + r += V4(8.013e-02, 2.823e-02, 4.626e-02, -3.119e-02) * s0_0; + r += V4(1.225e-01, -7.935e-02, 2.124e-01, 9.123e-03) * s0_1; + r += V4(-1.392e-01, 1.348e-02, 8.561e-03, 1.242e-02) * s0_2; + r += V4(-3.970e-01, -3.109e-01, -1.089e-02, -5.265e-01) * s0_3; + r += V4(1.932e-01, -8.691e-02, -2.152e-01, 5.156e-01) * s0_4; + r += V4(1.372e-01, 7.844e-02, -2.459e-02, -1.269e-03) * s0_5; + r += V4(3.331e-01, -2.012e-02, 3.449e-03, -1.190e-02) * s0_6; + r += V4(-3.669e-01, 2.920e-01, -1.854e-02, 3.106e-02) * s0_7; + r += V4(3.676e-02, 8.013e-02, 2.494e-03, 3.553e-03) * s0_8; + r += V4(-1.500e-04, 7.524e-03, 1.305e-02, -1.741e-03); + return r; +} + +V4 f3(min16float s0_0, min16float s0_1, min16float s0_2, min16float s0_3, min16float s0_4, min16float s0_5, min16float s0_6, min16float s0_7, min16float s0_8) { + V4 r = 0.0; + r += V4(4.077e-01, -2.281e-01, 4.163e-02, 5.385e-02) * s0_0; + r += V4(-3.682e-01, 1.155e-01, 2.065e-01, -9.950e-02) * s0_1; + r += V4(-4.125e-02, -6.752e-02, -1.279e-01, 7.053e-02) * s0_2; + r += V4(1.673e-02, 2.529e-02, -7.845e-03, -9.448e-02) * s0_3; + r += V4(-3.023e-02, 3.602e-01, 3.584e-02, -1.269e-01) * s0_4; + r += V4(1.406e-02, -6.005e-02, -2.131e-01, 3.401e-01) * s0_5; + r += V4(7.944e-03, 2.771e-02, -1.800e-02, 1.497e-02) * s0_6; + r += V4(-1.022e-02, -1.165e-02, -2.743e-01, -1.461e-01) * s0_7; + r += V4(-1.086e-03, -1.616e-01, 3.584e-01, -1.958e-02) * s0_8; + r += V4(-1.022e-02, 3.503e-03, 3.744e-03, -1.218e-02); + return r; +} + +void Pass1(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = Rmp8x8(tid.x) + blockStart; + uint2 size = GetInputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = (gxy + 0.5) * pt; + + min16float s0_0 = l0(-1.0, -1.0); + min16float s0_1 = l0(0.0, -1.0); + min16float s0_2 = l0(1.0, -1.0); + min16float s0_3 = l0(-1.0, 0.0); + min16float s0_4 = l0(0.0, 0.0); + min16float s0_5 = l0(1.0, 0.0); + min16float s0_6 = l0(-1.0, 1.0); + min16float s0_7 = l0(0.0, 1.0); + min16float s0_8 = l0(1.0, 1.0); + + t0[gxy] = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8); + t1[gxy] = f1(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8); + t2[gxy] = f2(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8); + t3[gxy] = f3(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8); +} + +//!PASS 2 +//!DESC conv1 +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 +//!IN t0, t1, t2, t3 +//!OUT t4, t5, t6, t7 + +#define l0(x, y) V4(O(t0, float2(x, y))) +#define l1(x, y) V4(O(t1, float2(x, y))) +#define l2(x, y) V4(O(t2, float2(x, y))) +#define l3(x, y) V4(O(t3, float2(x, y))) + +V4 f0(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(6.447e-02, -4.512e-02, 1.159e-01, 1.963e-01, -1.216e-02, -1.953e-01, 2.400e-01, 8.721e-02, -2.607e-01, 5.455e-02, -3.575e-02, 1.853e-01, 1.885e-01, -4.355e-02, 1.744e-01, -1.562e-03)); + r += mul(s0_1, M4(4.882e-02, 1.756e-01, 2.833e-01, -1.969e-01, -1.609e-01, 1.577e-01, -7.379e-02, 1.040e-03, -9.190e-02, 1.117e-01, -8.452e-02, 6.563e-02, 2.244e-01, -7.622e-02, 2.172e-01, -1.074e-01)); + r += mul(s0_2, M4(-1.819e-02, 7.914e-02, 5.432e-02, 6.196e-02, -8.671e-02, -1.125e-01, 9.079e-02, -3.972e-02, 2.892e-02, -1.757e-02, -1.603e-01, -2.536e-01, 2.739e-01, -1.412e-01, -6.144e-02, 4.285e-02)); + r += mul(s0_3, M4(-2.391e-01, -3.949e-02, 5.552e-03, -2.747e-02, 1.515e-01, -1.024e-01, 4.835e-02, -1.596e-01, 1.805e-01, 2.124e-02, 2.138e-01, -1.019e-01, 9.341e-02, -3.100e-02, 6.799e-02, -2.739e-02)); + r += mul(s0_4, M4(-1.808e-01, -1.196e-02, 1.694e-01, -5.965e-02, 1.045e-01, 3.773e-02, -8.986e-02, -2.565e-02, 8.836e-02, 2.979e-02, 2.807e-02, 2.927e-01, -3.812e-01, -1.014e-01, 2.351e-01, 8.724e-02)); + r += mul(s0_5, M4(-7.659e-02, -5.995e-02, -2.753e-01, 8.187e-02, -1.846e-02, -5.299e-02, -1.294e-01, -1.318e-01, 1.982e-02, -3.402e-02, 8.883e-02, -9.631e-03, 1.156e-01, -1.266e-01, 9.954e-03, 1.672e-02)); + r += mul(s0_6, M4(-6.659e-02, -1.459e-02, 4.547e-02, -5.029e-02, -2.629e-02, -7.733e-02, -6.958e-02, 8.358e-02, -6.566e-02, 6.261e-02, -6.624e-02, -4.336e-03, 3.083e-02, -1.137e-01, 7.962e-02, -2.424e-01)); + r += mul(s0_7, M4(-6.925e-02, 1.048e-02, -5.944e-02, 1.440e-01, 3.892e-02, -8.438e-02, 6.759e-02, 2.478e-02, 6.631e-02, 2.860e-02, -1.101e-01, 7.350e-02, 3.929e-02, -1.212e-01, -1.219e-02, -3.078e-01)); + r += mul(s0_8, M4(3.271e-02, 8.140e-02, 8.873e-03, 4.885e-02, 4.142e-02, 3.100e-02, 2.806e-03, -1.107e-01, 5.720e-03, -9.362e-03, 7.347e-02, -8.732e-02, 1.013e-01, -3.682e-01, 1.400e-01, 1.890e-01)); + r += mul(s1_0, M4(2.605e-02, -1.667e-01, 4.084e-02, 3.665e-02, -2.413e-02, -4.308e-02, 5.995e-03, 1.111e-01, 1.305e-01, -9.948e-02, -2.282e-01, 1.164e-01, 1.546e-01, 4.532e-02, -1.307e-02, -4.186e-02)); + r += mul(s1_1, M4(7.431e-02, -1.396e-01, 5.474e-02, -1.252e-01, -6.404e-02, -5.702e-02, 1.844e-01, 9.455e-02, -9.482e-02, -2.143e-01, 9.576e-02, -1.013e-01, -2.984e-02, 2.306e-01, 5.085e-02, -1.153e-01)); + r += mul(s1_2, M4(3.424e-03, 1.031e-02, 2.310e-01, -1.411e-01, 2.611e-03, -1.044e-01, -7.948e-03, -6.975e-02, -1.936e-01, -2.695e-01, 4.106e-01, -4.694e-02, -1.517e-03, 6.812e-02, 2.300e-01, 1.107e-01)); + r += mul(s1_3, M4(1.403e-01, -2.540e-02, -6.241e-02, 2.002e-01, 7.344e-02, -5.668e-02, -1.206e-02, -1.196e-01, 1.709e-01, -2.606e-01, 2.658e-01, -2.613e-01, -1.726e-01, 1.067e-01, 3.272e-02, 2.019e-01)); + r += mul(s1_4, M4(2.398e-01, 9.349e-02, -9.843e-04, -1.778e-01, -8.231e-02, -1.592e-01, -1.194e-01, 4.598e-02, -2.137e-01, -3.436e-01, 4.551e-01, -9.698e-02, -1.529e-01, 5.136e-01, -4.330e-01, 1.053e+00)); + r += mul(s1_5, M4(-1.360e-02, -7.805e-02, -1.060e-01, 7.678e-02, 1.654e-02, -9.582e-02, -6.834e-02, -1.780e-01, 5.788e-02, -8.168e-02, -5.377e-01, -1.501e-01, 1.023e-01, 3.892e-01, -4.508e-01, 4.937e-02)); + r += mul(s1_6, M4(7.759e-02, 6.410e-02, 1.925e-02, 6.902e-03, -5.195e-02, -3.779e-02, -6.816e-02, 1.005e-01, -7.297e-02, -1.634e-01, -7.858e-02, -1.307e-01, -5.741e-02, 1.518e-01, 9.429e-02, 5.891e-03)); + r += mul(s1_7, M4(8.913e-02, 1.226e-02, -5.255e-04, -1.558e-01, -4.548e-02, 5.190e-02, 9.607e-02, -3.042e-02, -9.908e-02, 4.117e-02, -6.336e-02, -1.498e-01, -1.247e-01, -1.318e-02, 2.337e-01, 2.582e-01)); + r += mul(s1_8, M4(-9.251e-02, -3.700e-02, -8.219e-02, -2.187e-02, 1.334e-01, -2.552e-02, 5.251e-02, -1.958e-01, 3.978e-02, 6.368e-02, 2.337e-01, 8.484e-02, -2.190e-01, 6.898e-02, -3.112e-02, 1.067e-01)); + r += mul(s2_0, M4(9.501e-02, -2.914e-02, -2.567e-03, -7.305e-02, -1.666e-01, 5.910e-02, -4.919e-02, 2.893e-01, 1.400e-02, -1.953e-02, 3.783e-02, -3.476e-01, 1.396e-01, -1.791e-01, 6.593e-02, -1.394e-01)); + r += mul(s2_1, M4(8.148e-02, 1.092e-01, -3.694e-04, 2.426e-02, -3.004e-01, -2.030e-02, -3.628e-02, 6.085e-02, 1.330e-01, 6.845e-02, 1.253e-01, -6.560e-02, -2.402e-02, -1.013e-01, 1.817e-01, 1.867e-01)); + r += mul(s2_2, M4(-1.819e-02, -1.737e-01, 7.773e-02, 7.842e-02, -1.850e-01, -9.368e-02, 2.441e-02, -4.203e-02, 1.254e-01, -7.443e-03, -2.320e-02, -4.614e-02, 9.496e-02, 2.893e-02, 4.553e-02, -1.310e-01)); + r += mul(s2_3, M4(-8.195e-02, -9.179e-02, 2.743e-03, -7.567e-02, -2.320e-01, 2.469e-02, -9.990e-02, 2.617e-01, -1.016e-01, 6.323e-02, -1.192e-01, -1.622e-01, 1.867e-01, 3.104e-02, -8.681e-02, 2.721e-01)); + r += mul(s2_4, M4(6.398e-03, 8.490e-02, -4.636e-02, 1.341e-01, -1.047e-01, 2.959e-01, -5.207e-02, -3.080e-01, -3.247e-02, 6.690e-02, 3.750e-02, -5.048e-02, 1.982e-01, -2.965e-02, -1.335e-01, -1.964e-01)); + r += mul(s2_5, M4(-4.427e-02, -8.750e-02, -2.997e-03, -7.999e-02, -2.644e-01, -1.020e-01, 2.151e-01, -9.969e-02, 6.641e-03, -7.456e-03, 2.008e-02, 6.420e-02, 2.294e-01, -1.701e-02, 3.415e-02, 1.749e-01)); + r += mul(s2_6, M4(-5.600e-02, 5.810e-02, 9.523e-02, -3.474e-02, 1.662e-02, -8.134e-02, -6.425e-02, 1.900e-01, -9.887e-02, 1.930e-02, -7.057e-03, 4.022e-03, -1.439e-01, -4.360e-02, -3.308e-02, 1.963e-02)); + r += mul(s2_7, M4(-5.579e-02, 1.073e-01, -2.163e-03, -2.249e-02, -2.898e-01, 3.912e-02, 3.370e-04, 5.760e-02, -9.889e-02, 5.421e-02, 1.554e-02, 2.053e-02, 2.035e-02, 6.746e-02, 1.007e-02, -1.987e-01)); + r += mul(s2_8, M4(7.718e-02, 2.845e-02, -2.573e-02, 5.771e-02, -3.623e-01, -1.526e-01, 3.717e-02, -6.208e-02, 6.221e-02, 6.867e-03, 8.471e-02, 4.190e-02, -8.339e-02, -9.281e-02, -1.494e-01, -1.699e-02)); + r += mul(s3_0, M4(3.535e-02, 2.739e-01, -6.901e-02, -5.246e-02, 1.448e-01, -1.386e-01, -1.050e-02, 3.544e-01, -6.436e-01, -4.722e-01, 4.010e-01, 4.993e-01, 4.557e-02, 8.169e-02, 2.293e-01, -7.771e-02)); + r += mul(s3_1, M4(-6.334e-03, 2.898e-01, 1.886e-02, 3.163e-01, 2.765e-01, -8.130e-02, -1.764e-01, 8.914e-02, -4.377e-01, -2.356e-02, -1.108e-01, -3.680e-01, -3.435e-02, 1.245e-01, -1.710e-01, -1.407e-01)); + r += mul(s3_2, M4(-2.790e-02, -3.380e-01, 1.541e-02, 9.081e-04, 9.270e-02, 1.595e-02, -3.041e-02, -6.194e-02, 6.213e-01, 1.921e-01, 2.577e-01, -7.313e-01, -1.798e-01, 5.474e-02, -1.474e-01, 9.967e-02)); + r += mul(s3_3, M4(1.118e-02, 4.461e-01, 1.895e-01, 2.578e-02, 2.339e-01, -1.504e-01, 7.090e-02, 5.091e-01, 1.061e-01, 5.312e-01, 3.560e-01, 6.841e-01, -3.614e-01, 2.816e-01, -1.585e-02, 1.301e-02)); + r += mul(s3_4, M4(3.878e-01, 2.609e-01, 3.861e-01, -6.379e-03, 5.563e-01, -3.751e-01, 5.401e-01, -1.423e-01, 4.032e-01, 5.927e-01, 3.945e-01, -2.637e-01, -2.969e-01, -1.072e-01, 5.569e-01, -8.054e-02)); + r += mul(s3_5, M4(6.107e-01, -3.043e-01, -1.916e-01, -3.358e-02, 1.300e-01, -1.824e-02, -6.283e-02, 5.680e-02, -5.793e-01, 4.155e-01, -4.202e-01, 7.750e-01, -7.841e-02, 2.290e-01, -3.769e-02, 5.627e-02)); + r += mul(s3_6, M4(-5.899e-01, -1.017e-01, -4.870e-01, -4.643e-01, 3.543e-01, -1.443e-01, -1.256e-02, -1.110e-01, -8.513e-01, -6.722e-02, 1.312e-01, 1.854e-01, -2.233e-01, 3.904e-01, -1.856e-02, -2.336e-01)); + r += mul(s3_7, M4(2.534e-01, -2.846e-01, -1.823e-01, 2.098e-01, 3.611e-01, -2.704e-02, -3.301e-01, -1.224e-01, -6.436e-02, 3.539e-01, 7.943e-01, -5.205e-01, -2.392e-01, -6.709e-03, -1.596e-01, 1.236e-01)); + r += mul(s3_8, M4(-5.994e-02, -9.951e-02, 1.625e-01, 1.883e-01, 3.550e-01, -9.783e-02, 2.766e-03, 5.728e-02, -9.677e-01, -1.069e+00, -1.305e+00, 1.258e-01, -1.179e-01, 1.214e-01, 1.990e-01, -2.664e-02)); + r += mul(s4_0, M4(-3.032e-02, -6.341e-02, 1.955e-01, 1.018e-01, -4.848e-02, 6.057e-02, -3.525e-02, 4.091e-01, 2.563e-02, 1.286e-01, -9.047e-03, -4.433e-02, 4.546e-02, 1.680e-02, -1.427e-01, -1.832e-01)); + r += mul(s4_1, M4(-2.021e-01, -5.621e-02, 1.996e-01, 1.614e-01, 1.218e-01, 3.792e-02, -2.175e-02, 2.088e-01, -8.895e-03, 1.143e-01, 5.991e-02, -3.941e-03, -1.036e-01, 9.451e-02, -2.531e-01, -6.738e-01)); + r += mul(s4_2, M4(-1.508e-01, -4.459e-02, 3.929e-01, -4.255e-02, -1.566e-02, -1.802e-02, -1.293e-01, 7.579e-02, 9.496e-02, -3.538e-02, -5.857e-02, 2.837e-02, -4.240e-01, -7.953e-02, -2.042e-01, -1.126e-02)); + r += mul(s4_3, M4(5.402e-02, 1.244e-01, -1.710e-01, 1.625e-01, 2.407e-01, 6.736e-02, 1.839e-02, 1.246e-01, -9.068e-02, -1.437e-01, -1.721e-01, -3.842e-02, 2.311e-02, -3.309e-02, -2.087e-01, -2.505e-01)); + r += mul(s4_4, M4(1.210e-01, 2.186e-01, -6.710e-01, 3.244e-01, 9.447e-02, 4.243e-02, 1.338e-01, 6.541e-02, 5.722e-02, 1.866e-01, -1.403e-02, -2.865e-01, -3.433e-01, 1.530e-01, -2.228e-01, -1.079e-01)); + r += mul(s4_5, M4(1.869e-01, -2.484e-01, -6.551e-02, 1.844e-01, 8.618e-02, 2.156e-01, -1.590e-01, -4.953e-02, -6.444e-02, -2.472e-03, 6.103e-02, 8.334e-02, 1.835e-01, 2.341e-01, -4.364e-01, -5.950e-01)); + r += mul(s4_6, M4(6.230e-02, -1.515e-01, -1.308e-01, 3.179e-02, -1.954e-02, -1.493e-01, -3.406e-02, 3.548e-02, -1.568e-01, -2.195e-02, 3.112e-02, -5.072e-02, -1.208e-02, -3.167e-02, 7.318e-03, -4.706e-02)); + r += mul(s4_7, M4(2.234e-01, 2.180e-01, -2.030e-01, 9.332e-02, -1.910e-01, -8.071e-02, 2.195e-02, -1.386e-01, -1.905e-02, -3.062e-02, -9.065e-02, -1.303e-02, 5.781e-02, -5.280e-02, -8.862e-02, -3.476e-01)); + r += mul(s4_8, M4(5.860e-02, -7.210e-02, -6.373e-02, 1.618e-01, 7.297e-02, -2.267e-01, 7.240e-02, -1.140e-01, 4.987e-03, -4.222e-04, 8.160e-02, 4.866e-02, 1.083e-01, 3.635e-01, -3.079e-01, -3.762e-02)); + r += mul(s5_0, M4(5.123e-02, 2.424e-02, -1.494e-02, 3.692e-02, -3.079e-01, -4.090e-02, -2.838e-01, -4.183e-01, 1.221e-01, -2.098e-01, 1.794e-01, 1.631e-01, -5.795e-02, -2.088e-04, -4.571e-02, 1.750e-02)); + r += mul(s5_1, M4(1.982e-01, 6.487e-02, 1.458e-01, -2.131e-01, -3.524e-01, 7.864e-02, -3.447e-01, 4.320e-03, 7.981e-02, 1.825e-01, -3.480e-01, 2.505e-01, 2.295e-01, -2.307e-02, 2.583e-01, 1.639e-01)); + r += mul(s5_2, M4(-8.136e-02, -5.082e-02, 2.298e-01, -4.061e-01, -2.214e-02, 2.459e-01, 3.081e-01, -6.793e-02, 3.698e-01, -2.927e-01, 1.958e-01, -1.898e-01, 5.514e-01, 3.832e-01, 1.916e-01, 1.643e-01)); + r += mul(s5_3, M4(-2.190e-01, 6.332e-02, 5.692e-02, 1.172e-01, 2.420e-03, 1.279e-01, 1.332e-01, 1.204e-01, -3.227e-01, -1.628e-01, 4.120e-01, 7.975e-01, 1.591e-01, 1.314e-01, -3.430e-02, 1.888e-01)); + r += mul(s5_4, M4(-1.219e-03, -3.286e-01, -1.121e-01, 6.413e-02, 1.490e-01, -2.987e-02, 2.308e-01, 1.192e-01, 5.129e-01, -8.246e-01, -3.672e-01, -3.180e-01, 5.412e-02, -2.440e-01, 1.461e-01, 9.319e-01)); + r += mul(s5_5, M4(1.519e-01, 1.086e-01, -2.430e-01, -1.782e-01, 2.780e-02, -1.388e-01, 1.403e-01, -2.707e-01, -1.823e-01, -7.689e-02, -3.769e-01, 2.586e-02, 4.413e-01, -1.567e-01, -5.041e-01, 3.854e-01)); + r += mul(s5_6, M4(-1.499e-01, 9.062e-02, 4.797e-02, -4.072e-02, -1.247e-01, 7.550e-02, -7.091e-03, 8.485e-02, 2.935e-01, -2.076e-01, 2.701e-01, 1.064e-01, -2.023e-02, 2.579e-02, -7.142e-02, 2.565e-02)); + r += mul(s5_7, M4(-1.786e-01, 8.747e-04, 4.484e-01, -1.268e-01, -1.581e-01, 6.147e-05, 6.692e-02, -8.129e-02, -8.691e-01, -3.015e-01, 9.455e-05, 3.964e-01, -3.570e-02, -7.192e-02, 1.507e-01, 9.453e-03)); + r += mul(s5_8, M4(-1.882e-01, -1.928e-01, -8.102e-02, -1.670e-01, 4.506e-02, -6.630e-02, -4.875e-02, 4.468e-02, 2.512e-01, -5.685e-01, 1.966e-01, -1.942e-02, 1.186e-01, -1.460e-01, 3.551e-01, 1.879e-01)); + r += mul(s6_0, M4(8.141e-02, -3.845e-02, 7.287e-02, 9.700e-02, 9.438e-02, -7.974e-03, 4.607e-02, -5.128e-02, 2.503e-01, 8.654e-02, -7.195e-02, -9.607e-02, 2.067e-01, 2.189e-01, -2.576e-02, -3.547e-02)); + r += mul(s6_1, M4(2.699e-01, -1.357e-01, -6.720e-02, 1.940e-01, 2.150e-01, -3.424e-02, 7.872e-02, -1.613e-01, -1.033e-01, 2.954e-01, -1.858e-01, -1.118e-01, 2.068e-01, -1.190e-01, 2.042e-01, 2.835e-01)); + r += mul(s6_2, M4(2.463e-01, 7.189e-03, -3.181e-02, 7.164e-02, 2.184e-01, 5.321e-02, 4.966e-02, -4.515e-02, -1.937e-01, -1.148e-01, 1.757e-01, 1.013e-01, 2.788e-01, 3.969e-01, -2.966e-01, 9.242e-02)); + r += mul(s6_3, M4(3.772e-02, -2.783e-01, 1.094e-01, 2.456e-01, 1.855e-02, 1.505e-01, -5.080e-02, -3.030e-01, -4.574e-02, -9.735e-02, -1.553e-01, 6.876e-02, 8.814e-02, 2.232e-01, 6.247e-01, 1.967e-01)); + r += mul(s6_4, M4(-1.978e-01, -1.439e-01, 4.346e-01, 5.743e-01, -4.299e-02, 4.223e-03, -1.153e-01, 2.788e-01, -3.678e-02, -3.505e-02, 1.128e-01, -1.830e-01, 2.464e-01, -1.722e-02, 5.527e-02, -2.253e-01)); + r += mul(s6_5, M4(-2.249e-01, 3.839e-01, 4.971e-01, -5.159e-03, 3.196e-01, 8.920e-02, -2.112e-01, 1.966e-01, -6.575e-02, 7.505e-02, 5.945e-02, 5.247e-03, 3.308e-01, 8.299e-02, 5.452e-01, 3.187e-02)); + r += mul(s6_6, M4(1.012e-01, 1.740e-01, 7.561e-02, 2.773e-01, -4.444e-02, 1.531e-01, -5.408e-02, -8.835e-02, 5.727e-02, -1.559e-01, 1.616e-01, -7.356e-02, -5.860e-02, 3.471e-01, 2.632e-01, 7.234e-02)); + r += mul(s6_7, M4(5.798e-01, -6.216e-01, 4.944e-01, 3.934e-01, 3.583e-02, -1.304e-01, 2.764e-01, -3.079e-02, 9.659e-03, -2.553e-02, -2.200e-01, -1.916e-02, -9.476e-02, -1.926e-01, 2.034e-01, -1.094e-01)); + r += mul(s6_8, M4(8.659e-02, 4.910e-01, 9.655e-02, 4.138e-01, 1.551e-01, 1.225e-01, -5.679e-02, 2.525e-01, 1.482e-02, -3.780e-02, 2.543e-04, 2.486e-02, 1.498e-01, 6.908e-03, 1.059e-01, -1.474e-01)); + r += mul(s7_0, M4(4.399e-02, -4.862e-02, 1.315e-02, 2.402e-02, -2.072e-01, -6.355e-03, 1.287e-01, 6.578e-02, -4.475e-02, 8.972e-02, 4.329e-01, -3.481e-02, 5.967e-02, -1.230e-01, 8.428e-02, 2.964e-02)); + r += mul(s7_1, M4(3.685e-02, 3.037e-02, 7.514e-02, 6.420e-02, -2.080e-01, -2.264e-01, 2.694e-01, -8.082e-02, -1.052e-01, 3.057e-01, 3.371e-01, -1.912e-01, -1.573e-01, 6.183e-02, 3.040e-01, -5.470e-02)); + r += mul(s7_2, M4(-6.083e-02, -7.165e-02, 2.446e-02, 1.037e-01, -1.651e-02, -5.348e-02, 1.667e-01, 4.276e-02, 5.923e-02, 9.977e-02, -6.333e-02, 2.133e-02, -1.822e-02, 7.829e-02, 1.517e-01, -2.538e-02)); + r += mul(s7_3, M4(1.227e-01, 5.079e-02, -9.135e-02, 1.125e-01, 2.348e-01, -2.053e-01, 1.615e-01, 1.555e-01, -3.941e-02, 3.071e-02, -1.090e-01, -9.880e-02, -5.530e-02, 1.262e-01, -3.636e-02, 4.667e-01)); + r += mul(s7_4, M4(-1.731e-01, 8.569e-03, -2.809e-01, -1.117e-01, -2.717e-01, 2.132e-01, 1.324e-01, 2.141e-01, -9.432e-02, -2.099e-01, 2.085e-01, 1.134e-01, 6.100e-02, -8.023e-02, -3.192e-01, -1.051e-01)); + r += mul(s7_5, M4(-8.209e-02, 4.550e-02, -1.288e-01, -2.638e-02, 3.431e-02, -5.752e-02, 4.472e-01, -6.426e-02, -2.833e-02, 6.020e-02, -1.754e-01, 3.198e-02, -6.964e-02, -5.407e-02, -1.586e-01, -1.372e-01)); + r += mul(s7_6, M4(1.140e-01, -5.882e-02, -1.879e-01, -1.477e-01, -2.029e-01, -2.467e-01, 1.996e-01, -2.316e-01, 9.466e-02, -7.990e-02, 1.334e-01, 1.830e-01, 1.063e-01, -9.067e-02, -4.511e-02, 1.682e-01)); + r += mul(s7_7, M4(-1.825e-01, 6.514e-02, -2.042e-02, 8.116e-02, 4.532e-02, 6.420e-02, -7.849e-02, -1.527e-01, -6.620e-02, -1.242e-02, 9.573e-02, 1.212e-01, 4.090e-02, -5.942e-02, -4.354e-02, -8.863e-03)); + r += mul(s7_8, M4(-2.034e-02, -1.613e-01, 2.712e-01, -5.498e-01, -2.044e-01, -1.601e-01, 1.976e-01, 1.045e-01, 5.450e-02, 1.137e-02, 1.852e-02, -5.018e-02, 4.689e-02, -3.913e-03, 4.239e-02, -8.641e-02)); + r += V4(2.400e-02, -8.304e-02, -1.885e-02, 5.432e-02); + return r; +} + +V4 f1(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(1.418e-01, -4.907e-02, -5.833e-02, -2.070e-01, -1.209e-01, -5.461e-02, -5.275e-03, 1.633e-01, 4.137e-02, -2.121e-02, 1.462e-01, -5.782e-03, 1.371e-01, 5.658e-02, -3.937e-02, 1.050e-01)); + r += mul(s0_1, M4(-9.628e-02, -7.284e-02, -2.083e-02, 1.706e-01, -3.409e-03, -4.350e-02, 1.405e-01, -7.835e-02, -4.200e-03, -1.420e-01, 2.099e-01, -1.840e-01, -1.310e-01, 1.949e-01, -2.656e-01, -1.484e-02)); + r += mul(s0_2, M4(1.296e-01, 2.711e-02, -3.426e-01, -3.043e-02, 2.776e-03, -1.989e-02, -6.253e-02, -4.567e-02, -4.105e-02, -9.127e-02, 4.685e-02, -2.144e-02, 3.181e-02, 6.371e-03, -3.940e-02, -9.416e-02)); + r += mul(s0_3, M4(1.723e-01, -6.048e-02, -1.782e-01, -8.933e-01, 1.664e-01, -9.454e-02, -5.299e-02, 1.880e-02, -1.568e-02, 1.427e-01, -1.972e-01, 3.494e-01, -1.890e-01, -1.659e-01, 1.094e-02, -2.885e-01)); + r += mul(s0_4, M4(1.079e-01, -3.422e-01, -6.410e-02, -1.914e-01, -6.375e-03, -2.001e-01, 1.226e-01, -1.900e-01, -1.069e-01, -2.609e-01, 3.074e-01, 6.818e-02, 3.675e-01, -3.195e-01, 3.132e-01, -3.454e-01)); + r += mul(s0_5, M4(-7.183e-02, -1.126e-01, 5.538e-02, -2.937e-02, -1.519e-01, 1.925e-02, -4.814e-02, 1.253e-01, -7.361e-02, 1.049e-01, 7.996e-03, 4.405e-02, 2.253e-01, -4.899e-01, -3.483e-01, -6.220e-02)); + r += mul(s0_6, M4(9.797e-02, -2.673e-01, -2.695e-02, -1.713e-01, -3.551e-02, 1.042e-01, 2.053e-02, 4.270e-02, 9.539e-02, -4.254e-03, -8.561e-02, 3.853e-02, 1.075e-02, -1.115e-01, -3.529e-02, -5.024e-01)); + r += mul(s0_7, M4(7.233e-02, -1.376e-01, -3.618e-02, -1.990e-01, 1.102e-01, 1.261e-01, 1.678e-02, -1.131e-02, -1.971e-01, 1.376e-01, -1.146e-01, -2.335e-01, -9.289e-02, -5.176e-01, -1.518e-03, -5.518e-01)); + r += mul(s0_8, M4(2.104e-04, -5.291e-02, 6.975e-02, -1.103e-02, -7.167e-02, 1.589e-01, -1.667e-01, -1.297e-02, 1.497e-01, 9.252e-02, -3.696e-02, 6.041e-03, -1.474e-02, -3.651e-01, 1.605e-01, -3.741e-01)); + r += mul(s1_0, M4(1.663e-01, 2.512e-01, -1.903e-02, 2.369e-01, 4.960e-04, -1.401e-01, 8.121e-02, 7.009e-02, -1.363e-01, -1.888e-01, -1.621e-02, -4.053e-01, 2.978e-02, -3.047e-02, 4.469e-02, 3.221e-02)); + r += mul(s1_1, M4(5.846e-03, 3.942e-01, -2.466e-01, 3.845e-02, -1.473e-01, 1.353e-02, 5.121e-02, -8.860e-02, 6.164e-01, -2.217e-01, -1.919e-01, -3.862e-01, -7.604e-02, 1.613e-01, -3.184e-03, 2.655e-02)); + r += mul(s1_2, M4(9.709e-03, -3.816e-02, 1.620e-01, 1.450e-01, -8.520e-02, -2.075e-02, -2.589e-02, 3.698e-02, 2.418e-01, -2.286e-01, 1.079e-01, -1.842e-01, 1.802e-01, 2.779e-02, 1.030e-01, 1.619e-01)); + r += mul(s1_3, M4(4.478e-02, 2.673e-01, 1.790e-01, 8.634e-01, 1.264e-01, -1.054e-01, -5.468e-02, 9.383e-02, 5.269e-02, -1.739e-01, 1.309e-01, -4.688e-02, -9.362e-02, 1.972e-01, 3.641e-02, 1.954e-01)); + r += mul(s1_4, M4(6.388e-02, 3.896e-01, -3.653e-02, 2.251e-01, -2.954e-03, -1.042e-01, 1.853e-01, -4.550e-02, -1.051e-01, 3.389e-01, -4.250e-01, -2.007e-01, -5.688e-01, -1.508e-01, 7.064e-01, 6.004e-02)); + r += mul(s1_5, M4(-9.950e-02, 5.541e-02, -2.128e-02, -4.875e-02, -1.383e-01, 3.354e-02, -8.311e-02, 6.638e-02, 1.227e-01, -9.693e-02, -2.800e-01, -1.541e-01, -1.614e-01, 1.966e-01, -7.400e-02, 2.437e-01)); + r += mul(s1_6, M4(-2.248e-01, 1.920e-01, -1.348e-01, 1.644e-01, 7.828e-02, 6.507e-02, -1.169e-01, -2.298e-03, -5.534e-02, -3.319e-02, 8.279e-02, -3.367e-01, 1.957e-02, -9.159e-02, 3.740e-02, 1.285e-01)); + r += mul(s1_7, M4(-1.554e-01, 2.691e-01, -1.619e-03, 2.286e-01, 1.322e-01, 1.854e-01, 3.022e-02, -1.145e-01, 2.533e-01, -4.843e-02, -1.417e-01, 8.853e-02, 1.967e-01, 1.184e-01, 1.316e-01, 1.815e-01)); + r += mul(s1_8, M4(-4.295e-02, 6.376e-02, -3.526e-02, -9.822e-03, -9.027e-02, 1.269e-01, -1.316e-01, -4.076e-02, 1.872e-01, -2.292e-01, -1.654e-02, -4.104e-02, 4.792e-02, 7.334e-04, 8.095e-02, 2.344e-02)); + r += mul(s2_0, M4(-1.002e-01, 5.501e-02, -9.044e-02, -2.085e-01, 2.396e-01, 9.810e-03, 1.250e-01, -8.117e-02, -8.548e-02, 1.014e-01, 5.014e-03, 4.902e-02, -4.588e-02, -6.699e-02, 5.775e-02, 4.000e-02)); + r += mul(s2_1, M4(4.693e-02, -1.771e-02, -4.663e-02, 9.740e-03, 2.533e-01, -6.075e-03, 2.745e-01, -1.388e-01, -6.714e-03, 6.294e-02, -1.463e-01, 5.952e-02, 8.493e-03, 1.575e-02, -2.039e-02, -7.066e-02)); + r += mul(s2_2, M4(2.990e-02, -1.827e-02, 1.280e-01, -4.732e-03, -3.333e-02, 9.852e-02, 6.789e-03, 7.925e-02, 2.172e-01, 1.211e-02, 5.048e-03, -5.788e-03, -1.174e-01, -7.720e-02, 1.081e-01, 2.216e-02)); + r += mul(s2_3, M4(-3.294e-02, -4.414e-02, 2.925e-02, -2.467e-02, 7.990e-01, 2.652e-01, -6.670e-02, -2.865e-01, -7.467e-02, -7.593e-02, 2.950e-02, 2.605e-02, 1.218e-01, 8.940e-02, 4.734e-02, 1.893e-01)); + r += mul(s2_4, M4(5.450e-02, -1.838e-02, 4.478e-03, 3.214e-02, 6.661e-01, -4.739e-01, 2.007e-01, -9.035e-03, -9.837e-02, -2.274e-03, -7.101e-02, 8.342e-02, 2.435e-01, 3.271e-01, -4.180e-01, 1.528e-01)); + r += mul(s2_5, M4(1.515e-01, -5.193e-03, -2.831e-02, -7.512e-03, 3.126e-02, -4.437e-02, 3.982e-02, 3.651e-02, -1.386e-01, 8.916e-03, 3.549e-02, 2.244e-02, -7.115e-02, -5.704e-03, 4.866e-03, -8.916e-02)); + r += mul(s2_6, M4(1.310e-02, -1.523e-02, 9.267e-02, 4.946e-02, 4.964e-01, 2.664e-02, -6.537e-02, -4.119e-01, -1.304e-01, 3.533e-02, -4.697e-02, -9.565e-02, -1.232e-01, 3.422e-02, 7.040e-02, -3.372e-02)); + r += mul(s2_7, M4(-1.129e-01, 1.396e-01, 1.748e-01, -1.426e-02, 3.643e-01, -1.541e-01, -7.931e-02, -1.284e-01, 2.232e-02, -4.469e-02, -3.891e-02, -3.585e-02, 5.561e-02, 2.462e-01, 3.234e-02, 2.021e-01)); + r += mul(s2_8, M4(-1.359e-02, -4.823e-02, -3.557e-02, 2.589e-02, 1.714e-01, 3.752e-04, -8.612e-02, 3.571e-03, 1.894e-02, -5.221e-02, 4.723e-02, -8.858e-02, -9.333e-03, 3.621e-03, 1.998e-02, -5.063e-03)); + r += mul(s3_0, M4(2.641e-01, 3.315e-01, 4.508e-01, 4.795e-01, -2.357e-01, -8.855e-02, 2.665e-01, -5.523e-02, 1.919e-01, 2.029e-01, -2.329e-01, 1.520e-01, -5.090e-02, -8.241e-02, 1.356e-02, 1.958e-02)); + r += mul(s3_1, M4(-9.005e-03, -1.667e-01, 3.307e-01, -2.594e-02, -1.753e-01, -3.024e-01, 1.903e-01, -1.350e-01, -4.514e-01, -3.310e-01, -6.884e-01, 3.825e-01, 1.908e-01, -1.299e-01, 8.744e-02, -4.903e-02)); + r += mul(s3_2, M4(1.283e-01, 2.811e-01, 2.186e-01, -1.949e-01, 2.913e-02, -2.319e-02, -7.935e-02, -1.218e-01, 5.260e-01, 1.168e+00, -3.059e-01, 6.219e-02, -3.941e-02, 8.204e-02, -1.651e-01, -3.590e-02)); + r += mul(s3_3, M4(-2.824e-01, -2.941e-01, -2.375e-01, 3.744e-01, -1.475e-01, 1.733e-01, 6.679e-01, 1.257e-01, -4.539e-01, 3.346e-01, 7.491e-02, -6.180e-01, 2.857e-01, -1.645e-01, 2.666e-01, -6.673e-01)); + r += mul(s3_4, M4(-1.184e-01, -2.264e-01, -8.824e-02, 2.530e-04, -1.127e-01, 3.692e-02, -3.473e-01, 1.687e-03, -8.749e-01, -4.262e-01, 2.562e-01, 7.095e-01, -1.857e-01, -3.273e-01, 3.071e-02, -2.807e-01)); + r += mul(s3_5, M4(-1.840e-01, -1.353e-01, 7.658e-03, -9.348e-02, -1.108e-01, 2.537e-01, 2.278e-01, 7.551e-03, 9.690e-01, 6.814e-01, 6.398e-01, -2.575e-01, 1.214e-01, -3.526e-01, -1.120e-01, -1.305e-01)); + r += mul(s3_6, M4(4.187e-01, 3.849e-02, -2.515e-01, 3.674e-01, -2.762e-01, 1.309e-01, -1.209e-01, 5.010e-01, 9.787e-02, 2.315e-01, -1.820e-01, -2.462e-01, 1.978e-01, -4.533e-01, 1.127e-04, -1.071e-01)); + r += mul(s3_7, M4(2.133e-01, -9.526e-02, -6.901e-01, -7.056e-01, -2.181e-01, 2.398e-01, 1.889e-02, 3.611e-01, -1.576e+00, -7.019e-02, -6.407e-01, -2.719e-01, 1.921e-01, 3.341e-02, 1.196e-02, -5.842e-01)); + r += mul(s3_8, M4(5.534e-01, 1.108e-01, 7.098e-02, -4.399e-01, -1.019e-01, 8.808e-02, 2.568e-02, 2.692e-02, -7.789e-02, 4.973e-01, 1.098e+00, 1.720e-01, 1.772e-01, -2.268e-01, 2.061e-01, 4.719e-02)); + r += mul(s4_0, M4(1.587e-01, 1.536e-01, -1.577e-01, 2.578e-01, -1.157e-01, -1.004e-01, 2.266e-01, -7.324e-02, 3.054e-02, -6.088e-02, 1.640e-01, -1.862e-02, 1.644e-01, -7.456e-03, -1.357e-01, -6.408e-02)); + r += mul(s4_1, M4(-1.253e-02, 1.927e-01, -4.527e-01, -3.137e-02, 7.477e-02, -3.825e-01, 2.155e-01, -2.479e-01, -5.870e-02, -1.261e-01, 7.608e-02, 5.194e-02, 2.882e-01, 5.250e-01, -6.071e-01, 2.978e-02)); + r += mul(s4_2, M4(-1.729e-01, 1.483e-01, -3.575e-02, 2.951e-01, -9.167e-02, -3.164e-01, 5.163e-02, -2.111e-01, -1.754e-02, -8.125e-02, -1.560e-02, 9.648e-02, 4.462e-01, 1.731e-01, -2.170e-01, -6.087e-02)); + r += mul(s4_3, M4(-1.811e-01, -8.706e-02, 2.581e-02, -5.347e-02, 1.550e-01, 1.538e-01, -4.210e-02, -2.730e-02, 1.282e-02, -1.373e-01, 1.264e-02, 8.382e-03, -2.971e-01, -4.154e-03, -1.343e-01, 9.709e-02)); + r += mul(s4_4, M4(2.233e-01, -1.945e-01, 1.350e-01, -5.341e-02, 2.933e-01, -9.302e-02, 1.302e-02, 4.402e-02, -9.468e-02, 3.817e-01, -4.733e-01, -6.991e-02, 5.489e-01, -2.329e-01, 3.871e-01, -5.727e-01)); + r += mul(s4_5, M4(-1.585e-02, -9.024e-02, -9.388e-02, 7.590e-02, 8.037e-02, 8.891e-02, -2.049e-01, 4.058e-02, -2.567e-02, -6.523e-02, 1.244e-01, -9.568e-02, 7.226e-01, -6.335e-01, -1.637e-01, 1.593e-01)); + r += mul(s4_6, M4(-1.601e-01, 9.097e-02, -2.821e-02, 3.879e-03, -7.961e-02, 6.534e-02, 5.302e-02, 3.970e-03, 2.394e-03, 8.816e-02, 8.474e-02, -1.101e-02, -1.189e-01, -4.395e-02, 9.528e-02, -5.206e-02)); + r += mul(s4_7, M4(-1.709e-01, -1.114e-01, 5.967e-02, -1.459e-02, 5.295e-02, 7.691e-02, 1.043e-02, 2.034e-01, 1.798e-01, 1.501e-01, 2.531e-03, 5.915e-02, -2.368e-01, -9.150e-05, 1.774e-01, 1.769e-01)); + r += mul(s4_8, M4(-1.248e-01, 5.240e-02, 3.076e-02, 1.944e-02, -1.145e-01, 9.493e-02, -8.435e-02, -8.691e-02, 1.657e-02, -4.717e-03, -2.467e-02, -3.439e-02, -7.809e-02, -1.662e-01, 4.556e-01, 3.114e-01)); + r += mul(s5_0, M4(2.135e-01, -5.993e-02, 2.290e-01, 1.518e-01, 3.434e-01, -2.914e-01, 3.053e-02, -5.904e-01, 2.180e-01, 1.652e-01, -2.240e-01, -1.576e-01, -3.795e-02, 8.326e-02, 4.146e-02, -1.860e-01)); + r += mul(s5_1, M4(-1.012e-01, 4.538e-02, -4.146e-03, -2.427e-02, -6.541e-01, 1.180e-01, 5.420e-02, -1.134e-01, -2.636e-01, -2.055e-01, 2.984e-03, -5.246e-02, -3.146e-01, 3.864e-02, 1.169e-01, 2.068e-01)); + r += mul(s5_2, M4(1.581e-01, 1.069e-01, -1.180e-01, -4.234e-02, -1.146e-01, -1.985e-01, 1.692e-01, -3.268e-01, -5.819e-02, 3.629e-02, -2.507e-01, -2.992e-01, -1.950e-01, -1.803e-01, 4.073e-01, -5.513e-02)); + r += mul(s5_3, M4(1.895e-01, -9.019e-02, 3.446e-01, 2.836e-02, 2.208e-01, 6.808e-02, 5.954e-02, -9.321e-02, 1.590e-01, -3.876e-01, 1.642e-01, -6.263e-01, 9.162e-02, 6.038e-02, 4.329e-02, 1.823e-01)); + r += mul(s5_4, M4(5.040e-02, 2.126e-01, 1.964e-01, -9.975e-04, 1.943e-01, 5.599e-02, -3.350e-02, -3.520e-01, 7.714e-02, -1.129e+00, 2.793e-01, -7.623e-01, 4.531e-02, 1.862e-01, 2.894e-01, 9.525e-02)); + r += mul(s5_5, M4(5.389e-02, 5.149e-02, -2.258e-02, -8.668e-02, 1.733e-01, 1.634e-02, -1.569e-01, -1.869e-01, 2.677e-01, -5.336e-01, -2.514e-01, -3.674e-01, 1.247e-01, 3.136e-01, -4.908e-01, 1.574e-01)); + r += mul(s5_6, M4(1.038e-01, -2.041e-02, 2.091e-02, -5.148e-03, 1.047e-01, 8.839e-03, -2.202e-02, 6.192e-02, 4.809e-01, -4.174e-01, 2.981e-01, -7.936e-02, -9.874e-02, -8.878e-02, 1.795e-02, -1.034e-01)); + r += mul(s5_7, M4(-2.322e-02, -6.292e-02, -1.332e-01, -3.057e-01, -8.255e-02, 6.054e-02, 7.983e-02, -2.289e-01, -2.134e-01, -4.304e-01, -1.994e-01, -6.384e-01, 1.080e-01, -1.530e-02, -1.238e-01, -1.491e-01)); + r += mul(s5_8, M4(8.246e-02, -5.373e-02, -4.011e-02, 2.231e-02, -4.627e-02, -1.188e-01, -4.430e-02, -9.327e-02, -1.237e-01, -9.078e-02, 1.438e-01, -8.875e-02, -3.324e-02, -2.484e-01, -3.955e-02, 2.300e-02)); + r += mul(s6_0, M4(1.192e-03, 3.644e-02, -3.324e-02, 5.183e-02, -1.500e-01, 1.644e-01, -1.594e-02, 1.351e-01, 1.059e-02, -1.694e-01, -1.076e-01, -1.518e-01, -7.045e-02, -2.294e-01, -1.497e-01, 7.650e-01)); + r += mul(s6_1, M4(-5.869e-02, 1.637e-01, 1.052e-01, 5.075e-02, 2.782e-02, 4.687e-02, -2.417e-01, 5.446e-02, 2.118e-01, 5.241e-02, -2.148e-01, -4.308e-02, -7.045e-01, 3.529e-01, -4.069e-01, 3.599e-01)); + r += mul(s6_2, M4(-2.914e-01, -4.515e-03, 1.882e-01, -5.199e-02, -5.184e-03, 8.319e-02, -5.139e-02, -8.999e-02, -9.549e-02, 2.413e-03, -4.866e-02, 1.453e-01, -2.063e-01, 2.463e-01, 6.671e-02, 6.351e-02)); + r += mul(s6_3, M4(7.447e-02, -2.294e-03, 1.910e-02, -2.190e-01, -2.705e-01, -5.867e-03, -1.861e-01, 1.657e-01, 1.362e-02, -1.587e-01, 2.105e-01, -1.370e-01, -2.316e-01, 3.930e-02, 5.674e-03, 2.345e-03)); + r += mul(s6_4, M4(1.365e-02, -5.652e-01, 3.707e-01, -2.277e-01, -1.733e-01, 1.912e-01, 1.706e-01, 1.572e-01, 7.769e-02, -8.719e-02, 1.378e-01, -1.233e-02, -2.064e-01, 3.939e-01, -2.783e-01, 2.233e-01)); + r += mul(s6_5, M4(-2.941e-01, -9.158e-03, 9.300e-02, -1.640e-01, -1.032e-01, 1.259e-01, 4.342e-02, -3.282e-03, 4.791e-02, -8.513e-03, 1.481e-01, 2.104e-02, 6.097e-02, 2.498e-02, 4.170e-02, -1.108e-01)); + r += mul(s6_6, M4(3.965e-01, -6.470e-02, 2.955e-01, -5.753e-02, -4.037e-03, -2.916e-02, 8.991e-02, 1.365e-01, -1.050e-01, -2.876e-02, -4.556e-02, -1.204e-01, 2.740e-01, -7.769e-02, -6.419e-02, 7.562e-02)); + r += mul(s6_7, M4(4.449e-01, 9.539e-02, 4.915e-01, 1.838e-01, -1.030e-01, -1.530e-01, -1.382e-01, 5.573e-03, 2.141e-02, -4.057e-03, 2.855e-02, 2.697e-01, -1.344e-01, 2.599e-01, -8.800e-02, -2.466e-01)); + r += mul(s6_8, M4(2.154e-03, -2.552e-01, -5.128e-01, 1.831e-02, 1.020e-01, -1.913e-01, 2.779e-01, -2.477e-02, -2.670e-02, 9.595e-02, -3.882e-02, 6.970e-02, -2.032e-01, 4.113e-02, 8.961e-03, 9.796e-02)); + r += mul(s7_0, M4(9.631e-02, 2.773e-02, 1.361e-02, -6.150e-02, 2.253e-01, 6.211e-02, -1.811e-01, 2.811e-02, -1.038e-01, -9.217e-02, -3.777e-01, 1.273e-01, 1.210e-01, 7.055e-02, 3.595e-02, 5.174e-02)); + r += mul(s7_1, M4(4.247e-02, 1.466e-02, 3.899e-02, 5.292e-02, 3.122e-01, -3.013e-02, 3.042e-02, 2.134e-01, 2.280e-02, -3.049e-01, -1.718e-01, -6.173e-02, 1.016e-02, 2.278e-02, 3.504e-02, 1.785e-03)); + r += mul(s7_2, M4(-3.382e-02, 8.445e-02, 9.257e-02, 5.136e-02, 1.694e-01, 7.343e-02, -1.552e-01, 1.099e-01, -1.514e-01, 8.443e-02, 2.600e-01, -2.022e-01, -2.503e-02, 3.217e-03, -2.207e-02, 1.450e-01)); + r += mul(s7_3, M4(1.311e-02, -6.610e-02, -9.563e-02, 7.953e-02, 1.718e-01, -2.105e-01, 1.410e-02, 7.725e-02, 4.814e-02, -3.939e-02, -1.998e-01, 2.058e-01, 4.837e-02, 1.069e-01, 4.654e-01, -1.726e-01)); + r += mul(s7_4, M4(-4.907e-02, -4.985e-03, 1.072e-01, 7.100e-02, 8.207e-01, -1.985e-01, 2.636e-02, -2.899e-01, -1.499e-01, 4.449e-01, -2.068e-01, -9.532e-02, 1.470e-01, -1.778e-01, -1.206e-01, -8.091e-02)); + r += mul(s7_5, M4(-1.207e-01, -6.268e-02, -2.007e-01, -2.291e-02, -3.847e-02, -2.381e-01, 2.108e-01, 7.411e-02, 1.324e-01, 5.207e-02, 2.269e-01, -2.144e-01, 7.696e-02, -3.380e-02, -1.811e-01, 9.073e-03)); + r += mul(s7_6, M4(-1.933e-01, -3.160e-02, -1.301e-02, 2.390e-02, 3.879e-02, 1.396e-01, -7.546e-03, -2.120e-01, 8.246e-03, 8.081e-02, 3.536e-03, -5.456e-02, -1.409e-01, -7.363e-02, 1.343e-01, -7.728e-02)); + r += mul(s7_7, M4(6.143e-02, -4.371e-02, -1.936e-01, -1.996e-01, 3.614e-01, -8.935e-02, -1.915e-01, -1.972e-02, 1.197e-01, 1.455e-01, 2.121e-03, -1.250e-01, 5.444e-02, -1.297e-02, -1.260e-01, 6.226e-02)); + r += mul(s7_8, M4(8.694e-02, 1.276e-01, 5.649e-02, 5.117e-02, 4.046e-02, -1.476e-02, 1.368e-01, -1.461e-01, 9.102e-02, -4.083e-02, -3.203e-02, -1.654e-01, -1.900e-01, -2.258e-03, -7.842e-02, 4.455e-02)); + r += V4(-2.429e-03, 1.297e-02, 9.825e-04, 2.920e-02); + return r; +} + +V4 f2(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(6.024e-01, 1.614e-01, 2.969e-02, -9.242e-02, -9.832e-02, -1.728e-01, -2.218e-01, -1.139e-02, -1.441e-01, 7.603e-03, 6.030e-02, -1.796e-01, -3.607e-02, -6.201e-02, 1.123e-02, 9.867e-02)); + r += mul(s0_1, M4(1.035e-01, 2.519e-01, -1.066e-02, 2.335e-01, 9.790e-02, 7.715e-02, 6.862e-02, -3.410e-02, -1.344e-02, 1.615e-02, -4.114e-02, -1.530e-01, -1.585e-01, 1.480e-01, 3.173e-01, 8.129e-02)); + r += mul(s0_2, M4(1.971e-02, 2.791e-02, 8.140e-03, -1.451e-01, 4.679e-02, 3.280e-02, 7.822e-03, -9.194e-02, 6.941e-02, -2.800e-02, -1.471e-01, -9.730e-02, -1.746e-01, 1.818e-02, 1.778e-01, -3.595e-02)); + r += mul(s0_3, M4(1.948e-02, 5.508e-02, -2.931e-02, 1.913e-02, -2.793e-02, 5.774e-02, 1.264e-02, -1.930e-02, 2.701e-01, -5.001e-02, 6.975e-02, 2.101e-01, -1.242e-02, 5.086e-02, 1.624e-01, -1.180e-01)); + r += mul(s0_4, M4(-1.038e-01, 1.854e-01, 2.881e-01, 1.693e-01, -5.477e-02, -3.241e-02, -1.576e-01, -4.147e-02, -2.655e-01, -6.189e-02, -6.585e-02, 2.051e-02, -2.719e-01, -2.128e-02, -6.742e-02, -1.151e+00)); + r += mul(s0_5, M4(-8.933e-04, 1.195e-01, 5.673e-02, -8.695e-02, -6.231e-02, 1.636e-01, 5.256e-02, -8.184e-02, 1.224e-01, 1.210e-01, -9.299e-02, -3.799e-02, -2.662e-01, -3.923e-02, 3.441e-01, -4.183e-01)); + r += mul(s0_6, M4(2.794e-02, 2.201e-01, 6.458e-02, -6.654e-03, 4.686e-02, -8.718e-02, 3.347e-02, 6.941e-02, 1.722e-03, 5.302e-02, 1.548e-02, 7.879e-02, -1.090e-01, -1.296e-01, 1.196e-01, -1.215e-01)); + r += mul(s0_7, M4(3.276e-01, 4.730e-01, 2.102e-01, -2.684e-02, 6.094e-02, -1.314e-01, -5.663e-02, 1.800e-01, -1.939e-01, 2.985e-02, -1.470e-01, 4.822e-02, -5.254e-01, -1.792e-01, -1.169e-01, 1.054e-01)); + r += mul(s0_8, M4(1.490e-01, 1.925e-01, 4.673e-03, 9.016e-02, -1.824e-01, 1.178e-01, -7.139e-02, 9.492e-02, -7.642e-02, -1.532e-01, 6.804e-02, -1.857e-02, -2.361e-01, 4.108e-02, 1.072e-01, -6.357e-02)); + r += mul(s1_0, M4(-3.124e-01, -1.010e-01, 2.682e-02, 9.663e-02, 1.685e-02, 2.384e-02, -1.228e-01, -8.220e-03, 1.251e-01, -8.046e-03, 8.745e-02, -3.563e-01, -1.724e-01, 1.384e-02, -1.248e-01, 1.518e-01)); + r += mul(s1_1, M4(-2.027e-01, 9.547e-02, -4.659e-03, 2.623e-01, -6.915e-02, 5.698e-02, -1.083e-01, -4.840e-02, 2.208e-01, 1.417e-01, 1.187e-01, -1.917e-01, 2.543e-01, 1.339e-01, 8.921e-02, 3.216e-01)); + r += mul(s1_2, M4(1.834e-02, -1.707e-03, 1.831e-01, 5.512e-02, -1.295e-02, 9.339e-02, -4.129e-02, -6.925e-02, 3.520e-02, 4.108e-01, 2.608e-01, 2.010e-01, 5.027e-02, 1.602e-01, -9.465e-02, 1.882e-01)); + r += mul(s1_3, M4(5.955e-02, -2.485e-01, -7.986e-02, -3.319e-02, -1.972e-03, -2.394e-02, 1.219e-01, -5.178e-02, -5.744e-01, 3.955e-01, 1.148e-01, 3.070e-03, 2.324e-01, 9.480e-02, -2.293e-01, 1.773e-01)); + r += mul(s1_4, M4(-6.757e-02, 1.505e-01, -1.167e-01, -5.043e-02, 8.591e-05, -2.709e-01, -5.627e-02, 5.334e-03, 4.120e-01, -1.987e-01, 4.480e-01, -1.209e-01, 6.104e-01, 2.653e-02, -3.970e-01, -2.835e-01)); + r += mul(s1_5, M4(4.765e-03, 4.705e-02, 4.717e-02, 8.159e-03, -8.101e-04, 6.611e-02, 5.412e-02, -5.183e-03, -7.808e-02, -3.112e-01, 1.957e-01, 3.155e-01, 8.824e-02, -1.785e-02, -2.577e-01, 2.288e-01)); + r += mul(s1_6, M4(-8.924e-02, -3.349e-01, -1.986e-01, 8.754e-03, 5.885e-02, 9.169e-02, -1.576e-02, 5.966e-03, 1.663e-02, 1.397e-01, -1.041e-01, -2.549e-02, -1.444e-02, -8.100e-03, -1.193e-01, 7.517e-02)); + r += mul(s1_7, M4(-1.685e-01, -3.000e-01, -2.483e-01, -1.825e-02, -5.701e-02, -6.274e-02, -1.281e-01, 1.214e-01, 2.599e-01, 2.717e-01, 1.289e-01, 1.857e-02, 9.641e-02, -3.836e-01, -3.064e-02, 1.713e-01)); + r += mul(s1_8, M4(-4.192e-02, -6.364e-02, 2.977e-02, -8.860e-02, -1.118e-01, 1.485e-02, -7.474e-02, 1.263e-01, 1.917e-01, 2.233e-01, 4.108e-02, -4.125e-02, 3.258e-01, -5.616e-02, -1.479e-01, 1.414e-02)); + r += mul(s2_0, M4(-1.166e-01, 6.576e-02, -5.141e-02, 2.146e-02, 1.297e-01, -9.262e-02, -2.629e-01, -1.504e-01, 1.028e-02, 1.035e-01, 3.107e-02, 8.578e-02, -5.688e-03, 2.526e-03, 7.956e-02, 8.222e-02)); + r += mul(s2_1, M4(-2.237e-02, -2.554e-02, -3.804e-02, -9.550e-03, 5.775e-02, -1.148e-01, -5.972e-02, -1.597e-01, -8.328e-03, 8.419e-02, -7.435e-03, 1.412e-01, -2.015e-01, 1.395e-01, 8.639e-02, 2.914e-01)); + r += mul(s2_2, M4(6.010e-02, 6.698e-02, -9.117e-02, 5.730e-03, 1.754e-01, -4.930e-02, -2.671e-02, 5.044e-02, 4.720e-02, 2.003e-01, 5.494e-04, 1.080e-01, 8.684e-02, 4.576e-02, 8.002e-02, 1.365e-01)); + r += mul(s2_3, M4(5.108e-02, -2.667e-02, -1.292e-01, -3.799e-02, 1.562e-01, -1.942e-01, -1.129e-01, -4.328e-02, -4.678e-02, 1.000e-02, -2.792e-02, -6.946e-02, -3.776e-02, -2.409e-01, -7.967e-02, -2.662e-01)); + r += mul(s2_4, M4(6.281e-02, -7.670e-02, -3.073e-02, 2.312e-02, 1.029e-01, 2.886e-01, -1.085e-01, 2.622e-01, 3.088e-02, 2.355e-02, 7.788e-02, 1.948e-02, 9.080e-02, -1.428e-01, -1.498e-01, 1.635e-01)); + r += mul(s2_5, M4(2.505e-02, 1.141e-01, 5.919e-02, -3.992e-02, 1.990e-01, 8.450e-03, -1.645e-01, 2.123e-02, -3.088e-02, 3.905e-02, -5.922e-02, -5.176e-02, -1.057e-01, 7.104e-02, -9.727e-02, -3.979e-02)); + r += mul(s2_6, M4(-1.883e-01, -6.903e-02, 1.357e-02, 1.006e-01, 4.127e-02, 6.045e-01, -1.417e-01, 1.510e-01, -1.729e-01, -1.531e-01, -8.601e-02, 1.774e-02, -7.535e-03, 6.714e-04, -9.852e-02, 4.678e-02)); + r += mul(s2_7, M4(1.303e-03, -1.218e-01, -1.070e-01, -2.185e-02, 3.714e-01, 4.524e-01, 1.029e-01, 1.001e-01, -6.366e-02, -1.359e-01, -1.372e-01, 3.981e-02, -2.002e-02, -6.594e-02, 1.919e-02, -2.447e-02)); + r += mul(s2_8, M4(-4.613e-02, -5.523e-02, -4.112e-03, -9.545e-02, 2.432e-02, -9.902e-02, -9.300e-02, 2.047e-01, -4.906e-02, -1.037e-01, -6.037e-02, -6.359e-02, -9.715e-02, -5.602e-03, 2.586e-03, -1.759e-01)); + r += mul(s3_0, M4(3.237e-01, 4.918e-01, -2.668e-01, 1.157e-02, -3.132e-02, -3.390e-02, 1.897e-02, -1.129e-01, -4.634e-01, 5.922e-01, -7.222e-01, 6.022e-01, 2.221e-01, 2.233e-01, -5.005e-02, -4.525e-02)); + r += mul(s3_1, M4(1.096e-01, 6.729e-01, -1.870e-01, 2.077e-01, -1.609e-01, -7.736e-02, 7.650e-02, -2.442e-01, -2.838e-01, -1.199e-01, -3.359e-01, 1.487e-01, 1.102e-01, 4.324e-02, -7.319e-02, -4.535e-02)); + r += mul(s3_2, M4(-2.172e-01, 2.894e-01, -1.623e-01, -1.274e-01, -1.549e-01, -5.039e-02, 9.217e-02, -6.576e-02, 3.091e-01, 7.660e-01, 1.150e+00, 1.007e+00, 2.005e-01, 1.174e-01, -2.202e-01, -2.503e-01)); + r += mul(s3_3, M4(-1.587e-01, -4.409e-01, 7.186e-01, -8.712e-02, -3.360e-01, -1.635e-01, -9.153e-02, -3.941e-02, -1.524e-01, 8.945e-01, -2.371e-01, 6.067e-01, -3.247e-01, 5.680e-02, 1.870e-01, 9.043e-02)); + r += mul(s3_4, M4(-5.073e-01, 3.782e-01, 1.547e-01, 2.375e-01, -2.941e-01, -2.225e-01, -3.937e-02, 1.585e-01, 6.400e-01, 6.338e-02, 6.255e-01, -9.882e-01, -8.300e-02, 1.964e-01, 2.085e-01, -5.729e-02)); + r += mul(s3_5, M4(-1.060e-01, -3.881e-01, 1.130e-01, -2.133e-01, -2.131e-01, -5.654e-02, 9.555e-02, 9.273e-02, 3.269e-01, -2.140e-01, 2.201e+00, -4.989e-01, 2.170e-01, 3.391e-01, -1.298e-01, -1.696e-01)); + r += mul(s3_6, M4(1.210e+00, 1.642e-01, 2.442e-02, 4.690e-01, -3.490e-01, -2.805e-01, 1.715e-01, -6.646e-02, -1.273e-01, 1.969e-01, -8.193e-02, 1.531e-01, -3.637e-01, -4.352e-02, 3.050e-02, 2.056e-01)); + r += mul(s3_7, M4(3.109e-02, 3.192e-01, 3.558e-01, -7.807e-01, -2.123e-01, -3.377e-02, -6.032e-02, -5.000e-02, -7.944e-01, 4.559e-01, 7.100e-01, -2.139e-01, 1.249e-01, 3.205e-01, 3.829e-01, 8.794e-02)); + r += mul(s3_8, M4(1.721e-01, -2.141e-02, -5.124e-02, -1.941e-02, -6.881e-02, -1.218e-01, -2.140e-02, -1.477e-02, 2.367e-01, 3.393e-01, 1.307e+00, -9.865e-01, -1.969e-02, -1.983e-02, 1.031e-01, 9.551e-03)); + r += mul(s4_0, M4(5.793e-03, -2.997e-01, -2.149e-01, 7.801e-02, -5.903e-03, -6.859e-02, 9.974e-04, -2.067e-01, -8.018e-02, 5.507e-02, -5.498e-02, -1.249e-02, 4.331e-02, -7.296e-02, 1.522e-01, 6.020e-02)); + r += mul(s4_1, M4(-1.126e-03, -2.090e-01, -1.333e-01, 2.479e-01, -6.377e-02, -1.562e-01, 2.477e-02, -4.739e-01, 8.594e-02, -1.862e-02, -1.435e-01, 8.022e-02, -4.041e-01, -2.097e-01, 7.237e-01, 7.145e-01)); + r += mul(s4_2, M4(4.093e-01, -1.603e-02, -4.302e-02, 1.847e-01, -5.292e-02, -1.715e-02, -4.633e-02, -2.926e-01, 1.107e-02, 1.358e-01, -2.217e-02, 3.609e-02, 3.626e-02, -2.235e-01, 3.172e-01, -2.094e-01)); + r += mul(s4_3, M4(1.372e-01, -4.963e-02, 3.393e-03, -1.382e-01, -1.840e-01, 2.136e-02, 1.010e-01, 2.007e-01, -1.317e-01, -1.516e-01, 1.125e-01, -3.056e-02, 1.042e-01, -6.974e-02, 6.472e-02, 7.204e-02)); + r += mul(s4_4, M4(6.797e-02, 5.619e-01, -1.842e-01, -1.167e-01, 1.120e-01, -6.628e-02, -7.528e-02, 1.173e-01, -8.345e-02, 9.310e-03, 2.113e-01, 2.760e-01, -1.062e-01, -2.080e-01, -1.711e-01, -2.247e-01)); + r += mul(s4_5, M4(1.379e-01, -3.213e-02, -1.093e-01, -1.256e-02, 6.009e-02, 9.502e-02, 7.922e-02, 1.096e-01, -5.342e-02, 2.567e-01, -7.645e-02, -1.566e-01, -4.579e-01, 1.754e-01, 5.527e-01, 4.371e-01)); + r += mul(s4_6, M4(2.313e-01, -1.434e-01, -2.594e-02, 4.450e-02, -8.749e-02, -4.179e-02, 4.259e-03, 4.061e-03, -7.949e-03, -2.408e-01, -9.617e-03, -3.280e-02, 5.811e-02, 1.831e-02, -2.068e-02, -9.291e-02)); + r += mul(s4_7, M4(3.050e-01, 1.183e-01, -3.893e-02, 9.341e-02, 2.277e-01, -1.558e-02, 6.117e-02, 3.575e-02, 1.044e-01, 8.139e-02, 5.209e-03, -1.367e-01, 1.577e-01, -3.980e-01, 2.223e-01, -3.205e-02)); + r += mul(s4_8, M4(8.588e-02, 2.461e-01, 5.215e-04, -7.777e-02, -4.666e-02, 6.132e-02, 5.166e-02, 3.593e-02, 5.295e-02, -6.697e-02, -1.082e-01, 6.431e-02, -2.786e-01, -1.883e-01, -2.140e-01, 6.313e-02)); + r += mul(s5_0, M4(-1.634e-01, 1.580e-01, -1.498e-01, 1.332e-02, -2.833e-01, 1.933e-02, -1.910e-01, -1.457e-01, -2.154e-01, -1.393e-01, 2.019e-01, 4.654e-02, 5.307e-02, -2.079e-02, -1.021e-01, -6.443e-02)); + r += mul(s5_1, M4(-1.549e-01, 1.103e-01, -9.549e-02, 1.638e-01, 4.452e-01, 2.824e-02, 8.840e-02, -5.022e-02, 1.916e-02, 6.132e-02, 2.783e-01, -3.927e-01, 1.925e-01, 2.155e-01, -4.751e-03, -6.121e-03)); + r += mul(s5_2, M4(-1.336e-01, 1.558e-01, 2.160e-01, -8.837e-02, 1.081e-01, 2.939e-01, 1.024e-01, 3.714e-02, -6.304e-01, -4.093e-01, 2.276e-01, 2.333e-01, 1.152e-02, 3.609e-01, -5.508e-01, 3.806e-01)); + r += mul(s5_3, M4(-2.184e-01, 2.841e-01, 1.092e-01, -2.413e-01, -1.375e-02, 1.723e-01, 2.776e-02, 6.387e-02, 1.073e-01, 1.465e-01, 3.192e-01, -5.573e-01, 3.674e-03, 1.185e-01, 7.853e-03, -1.184e-01)); + r += mul(s5_4, M4(2.010e-02, 6.965e-02, 4.445e-01, -2.783e-01, 3.320e-01, -6.711e-02, 2.167e-03, -8.034e-02, 3.523e-01, -2.237e-01, 3.191e-01, -8.361e-01, 6.816e-01, 1.419e-02, -2.330e-01, -3.863e-01)); + r += mul(s5_5, M4(-1.692e-01, -4.727e-02, 1.890e-02, -4.228e-02, -2.228e-01, 1.929e-01, -2.376e-01, 4.520e-02, -1.926e-01, -5.829e-01, 1.372e-01, -6.165e-01, -5.897e-03, 1.233e-01, 9.314e-02, -4.698e-01)); + r += mul(s5_6, M4(-1.805e-01, -1.371e-01, 6.896e-03, 3.752e-02, -1.036e-01, 3.209e-01, -1.229e-02, -5.416e-02, -2.065e-01, 5.857e-01, 4.271e-01, -2.046e-01, 1.299e-02, 1.409e-01, -6.584e-02, -8.911e-02)); + r += mul(s5_7, M4(-2.166e-01, -4.869e-01, 3.691e-02, 9.347e-03, -7.123e-02, 7.614e-02, -8.810e-02, 2.679e-02, -3.274e-01, 1.435e-01, 5.891e-01, 2.630e-01, 8.166e-02, -2.710e-03, -1.822e-02, 2.107e-02)); + r += mul(s5_8, M4(-7.499e-02, -1.186e-01, 2.727e-02, -3.484e-03, -2.397e-01, 6.605e-02, -1.695e-01, 6.389e-02, -2.937e-02, -3.176e-01, 4.547e-01, 2.197e-01, -2.220e-01, -5.530e-02, -5.789e-02, -1.362e-01)); + r += mul(s6_0, M4(1.284e-01, -5.820e-02, -1.821e-02, -2.132e-02, -1.812e-01, 3.254e-02, -6.980e-02, 4.877e-02, -3.981e-01, -6.346e-03, 1.061e-01, 2.830e-01, -1.488e-01, 2.322e-01, -4.172e-01, 1.401e-01)); + r += mul(s6_1, M4(1.744e-01, -1.377e-02, 1.247e-01, -9.359e-02, -1.703e-01, -6.018e-02, 3.291e-02, 1.262e-01, -2.660e-01, 3.021e-02, -6.027e-02, 1.319e-01, 1.809e-01, -1.488e-01, -6.257e-01, -7.873e-02)); + r += mul(s6_2, M4(9.294e-03, -4.738e-02, 2.425e-02, -9.006e-02, -7.711e-02, -1.200e-01, 1.304e-01, 8.477e-02, 5.670e-02, 1.555e-01, -3.501e-02, -8.189e-02, -3.005e-01, -4.845e-02, 1.362e-01, -1.009e-01)); + r += mul(s6_3, M4(3.859e-02, 7.534e-02, -2.690e-01, -6.434e-02, 2.921e-02, 6.423e-02, -1.309e-01, 2.018e-01, -4.921e-01, 2.839e-01, 1.028e-01, -3.733e-02, 1.341e-01, -7.584e-02, 4.857e-02, -3.187e-01)); + r += mul(s6_4, M4(2.750e-01, 2.931e-01, -7.052e-01, -5.350e-01, 5.074e-02, -5.417e-02, 1.930e-02, -1.304e-01, 1.098e-01, 8.690e-02, 1.029e-01, 3.523e-02, 5.505e-02, 2.928e-01, -3.176e-01, -5.488e-01)); + r += mul(s6_5, M4(-1.432e-01, 4.407e-01, -4.435e-01, 6.909e-01, -4.673e-02, 6.270e-02, -5.395e-03, -4.062e-02, 3.409e-02, -2.240e-01, 2.137e-01, -2.802e-02, -7.794e-02, 1.457e-02, -3.355e-02, 3.011e-03)); + r += mul(s6_6, M4(-1.440e-01, 5.284e-01, 7.095e-02, -3.436e-01, -3.962e-03, -2.807e-02, -1.546e-01, 6.346e-02, -8.007e-03, -6.288e-02, -1.336e-01, -8.172e-02, 6.688e-02, 2.013e-02, 9.883e-02, 6.834e-03)); + r += mul(s6_7, M4(-7.737e-02, 1.352e-01, -1.823e-02, 1.410e-01, -3.071e-01, 1.073e-01, -1.601e-02, -2.010e-01, 1.849e-01, -1.390e-01, 1.748e-01, 4.664e-02, -2.876e-01, -1.700e-01, -8.310e-02, 6.118e-02)); + r += mul(s6_8, M4(-2.698e-01, 2.050e-01, -2.982e-01, -4.068e-01, -1.921e-01, -2.708e-02, 9.079e-02, -2.908e-01, 8.824e-02, -1.377e-01, -2.613e-02, 8.476e-02, 2.881e-01, 2.715e-02, 5.938e-02, 4.345e-02)); + r += mul(s7_0, M4(2.057e-02, 3.372e-02, -8.995e-02, 3.579e-02, 3.542e-01, 7.582e-02, -1.086e-03, -7.511e-02, 2.623e-02, 1.204e-01, -5.686e-02, -6.017e-04, 1.221e-01, -1.064e-02, 1.557e-01, -8.613e-03)); + r += mul(s7_1, M4(-2.953e-02, -8.286e-02, -9.441e-02, -2.524e-02, 4.550e-01, 2.552e-01, 2.057e-01, 1.977e-01, 1.033e-01, 9.862e-02, 4.592e-02, 5.174e-02, -1.450e-01, -2.149e-02, -2.172e-02, 2.110e-01)); + r += mul(s7_2, M4(-7.143e-02, -1.142e-01, 2.439e-02, -1.636e-01, 1.959e-01, 8.576e-02, 2.433e-01, -6.556e-02, 1.911e-01, 1.498e-01, -2.678e-02, -7.298e-02, 1.300e-01, -1.324e-01, 2.859e-03, 1.392e-01)); + r += mul(s7_3, M4(-4.561e-02, 4.549e-02, -1.297e-01, 9.444e-02, -9.785e-02, 2.926e-01, 3.633e-01, 3.022e-02, 3.227e-01, -2.358e-01, 3.198e-01, -1.437e-01, -2.234e-02, -8.447e-02, -7.054e-02, -1.036e-01)); + r += mul(s7_4, M4(-3.751e-02, -1.283e-01, 1.522e-01, 4.857e-02, 3.744e-01, 5.343e-01, 2.480e-01, -7.117e-02, 5.132e-01, 2.266e-01, -1.138e-01, 3.109e-02, 9.592e-02, 1.364e-02, 4.631e-02, 1.131e-02)); + r += mul(s7_5, M4(-7.775e-03, -1.390e-01, 1.219e-01, -1.763e-01, 5.525e-01, 1.910e-01, 1.082e-01, 2.706e-01, -5.759e-02, 2.822e-01, 3.152e-02, -2.117e-01, -7.155e-02, -7.768e-02, -1.189e-01, -7.904e-03)); + r += mul(s7_6, M4(1.032e-01, -1.927e-02, 1.675e-02, -1.546e-02, 1.065e-01, -1.700e-01, 1.457e-01, -1.539e-01, 1.431e-01, -2.567e-02, -4.598e-02, -2.291e-02, -1.475e-01, 2.480e-01, -9.909e-02, 8.509e-04)); + r += mul(s7_7, M4(3.658e-02, -9.913e-02, 7.420e-02, -6.561e-02, 2.804e-01, 2.319e-01, 3.820e-02, -2.351e-02, 2.700e-01, 2.374e-01, 1.995e-02, -1.508e-01, 1.266e-01, -5.414e-02, 1.113e-01, 1.421e-02)); + r += mul(s7_8, M4(2.975e-03, -8.924e-02, 7.782e-04, 3.556e-01, 1.857e-01, -1.485e-01, -1.141e-01, -2.377e-02, -3.094e-01, 2.868e-01, -1.138e-01, -1.233e-01, -1.582e-02, 5.449e-02, 8.113e-03, 2.659e-02)); + r += V4(4.227e-02, -2.005e-02, 4.461e-02, -2.311e-03); + return r; +} + +V4 f3(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(1.261e-01, 1.275e-01, 1.893e-01, -4.490e-02, 3.075e-02, -2.067e-02, 8.184e-02, 6.246e-02, -1.453e-01, -8.347e-02, 1.846e-02, -4.013e-02, 8.788e-02, 7.863e-02, 2.785e-02, -2.049e-02)); + r += mul(s0_1, M4(5.533e-02, 2.675e-01, 2.347e-01, 1.069e-02, 3.747e-02, 3.292e-02, 1.962e-01, -2.536e-02, 1.213e-01, -6.926e-02, -1.038e-02, 8.587e-02, 1.096e-01, 3.013e-02, -1.298e-01, 1.057e-01)); + r += mul(s0_2, M4(1.319e-01, -1.151e-01, -9.549e-02, -5.034e-02, 1.870e-02, -6.669e-04, 2.032e-02, 5.385e-02, -1.551e-01, -9.357e-03, 2.673e-02, -2.371e-03, 3.701e-02, 3.333e-02, -1.777e-02, 1.445e-01)); + r += mul(s0_3, M4(-1.049e-01, -4.468e-01, -2.183e-01, 1.698e-01, 1.613e-01, 1.641e-01, 2.722e-01, -9.911e-02, 3.634e-02, 1.021e-01, 5.158e-02, -9.397e-02, -1.835e-02, 4.337e-02, -3.981e-02, 1.435e-02)); + r += mul(s0_4, M4(5.649e-02, 1.327e-01, -7.398e-02, 2.571e-01, 1.044e-01, -4.123e-02, -2.703e-03, 1.883e-01, 2.395e-02, -3.654e-02, -6.511e-02, -3.507e-02, 1.353e-01, 7.352e-02, -2.371e-01, 5.515e-01)); + r += mul(s0_5, M4(-1.566e-01, -2.231e-01, -1.955e-01, 1.308e-01, 7.935e-02, 1.006e-02, 1.399e-01, -1.568e-01, -2.835e-02, 2.378e-01, 4.649e-02, 2.825e-02, 1.614e-01, -1.804e-02, -1.573e-03, 2.541e-01)); + r += mul(s0_6, M4(-7.541e-03, -2.560e-01, 2.715e-02, 5.328e-02, -3.816e-02, -8.862e-02, 2.168e-01, -1.064e-01, -7.636e-02, 8.903e-02, 7.338e-02, -1.177e-03, 1.478e-01, -1.738e-01, -1.222e-01, 1.096e-01)); + r += mul(s0_7, M4(-8.512e-02, 1.416e-01, 9.192e-03, 1.923e-01, 1.785e-01, 2.284e-02, 1.032e-01, -1.785e-03, -4.071e-02, -1.462e-01, -5.904e-02, -1.422e-01, -1.056e-01, -2.295e-01, -2.900e-01, 1.496e-01)); + r += mul(s0_8, M4(-7.149e-02, 2.004e-01, -1.053e-01, 1.203e-01, -6.376e-03, -4.344e-02, 2.072e-01, -1.266e-01, -8.375e-02, -3.221e-02, -1.236e-03, -8.896e-02, -1.123e-01, -2.438e-01, -1.008e-01, 3.596e-01)); + r += mul(s1_0, M4(-3.661e-02, 7.188e-02, -8.516e-02, 1.255e-01, -2.830e-01, 1.819e-02, 8.893e-02, 1.407e-02, 8.581e-02, -2.465e-01, -2.073e-02, 4.201e-01, -2.264e-02, 2.318e-02, 6.141e-02, -2.330e-02)); + r += mul(s1_1, M4(-3.989e-02, -2.107e-01, 7.287e-02, 1.096e-01, -2.123e-02, -8.654e-03, 2.330e-01, -5.653e-02, 9.050e-02, -2.271e-02, -3.233e-01, -3.972e-01, -1.002e-01, 8.960e-02, -6.543e-03, -4.752e-02)); + r += mul(s1_2, M4(-6.677e-03, 4.369e-02, 1.492e-02, -1.174e-01, 8.590e-02, 5.901e-02, 4.269e-02, 7.195e-02, -6.207e-02, 1.069e-01, 1.033e-01, -1.025e-01, -1.156e-01, 5.085e-02, 1.734e-01, -1.801e-01)); + r += mul(s1_3, M4(-1.858e-02, -1.199e-01, 5.713e-02, -3.361e-02, 1.338e-01, 9.905e-02, 2.074e-01, -5.975e-03, 4.418e-01, -5.371e-01, -1.131e-01, 8.611e-02, -2.646e-01, 2.978e-01, 1.242e-01, 9.650e-02)); + r += mul(s1_4, M4(-2.745e-01, 2.923e-01, 8.791e-02, -2.121e-01, 2.900e-01, 3.680e-02, 1.520e-01, 1.254e-01, 1.652e-02, 2.902e-01, 2.883e-01, 3.979e-01, -2.851e-01, -5.253e-02, 2.688e-01, -1.871e-02)); + r += mul(s1_5, M4(-6.374e-02, -2.885e-02, -7.878e-02, -3.370e-02, 3.692e-02, -6.525e-02, 1.714e-01, -9.354e-02, 1.326e-01, -6.534e-02, -6.443e-02, 1.037e-01, -2.664e-01, -9.002e-01, 6.225e-02, -4.174e-01)); + r += mul(s1_6, M4(3.009e-02, 2.041e-02, -6.071e-02, -9.755e-03, -1.186e-01, -4.602e-02, 2.015e-01, -1.719e-01, -2.484e-02, -3.894e-01, -9.188e-02, 1.068e-01, -1.791e-02, 3.681e-01, 1.223e-01, -2.349e-02)); + r += mul(s1_7, M4(7.351e-02, 3.737e-03, 1.317e-01, -1.007e-01, 1.540e-01, -1.224e-02, 1.404e-01, -2.308e-02, 3.033e-01, -2.157e-01, 7.529e-02, 4.100e-02, -2.292e-02, 4.977e-02, 2.144e-01, -5.221e-01)); + r += mul(s1_8, M4(5.573e-02, -1.405e-01, -6.806e-02, 2.158e-02, 1.295e-01, -1.267e-02, 1.694e-01, -5.347e-02, 1.971e-01, 3.000e-01, -1.284e-01, 2.282e-01, 3.039e-02, 1.595e-01, -2.105e-01, -3.446e-01)); + r += mul(s2_0, M4(2.024e-01, -3.515e-02, -2.489e-03, -2.118e-02, -1.715e-01, -1.940e-01, -6.598e-02, -8.850e-02, -7.708e-02, 5.732e-02, 2.541e-02, -4.510e-02, -2.579e-02, -1.242e-01, 9.859e-02, 1.145e-02)); + r += mul(s2_1, M4(2.687e-01, -6.414e-02, -4.625e-02, 8.588e-03, 1.435e-02, -1.698e-01, -7.112e-04, -7.204e-02, 1.790e-01, 9.271e-02, 4.105e-02, -5.917e-02, 3.966e-02, -3.604e-02, -5.485e-02, -9.420e-03)); + r += mul(s2_2, M4(7.422e-02, 7.694e-02, -7.387e-03, -1.102e-02, -2.691e-03, -1.765e-02, 7.516e-02, 4.662e-04, -1.576e-01, 1.058e-01, 2.696e-03, 5.033e-03, -1.272e-01, 3.192e-02, 1.493e-02, 6.949e-07)); + r += mul(s2_3, M4(2.105e-01, -3.479e-02, 1.751e-02, 2.534e-02, -2.367e-01, -1.494e-01, -2.756e-01, -4.013e-01, -2.370e-02, -1.276e-02, -9.586e-02, 5.129e-03, 7.380e-02, -1.411e-01, -9.599e-02, 5.479e-02)); + r += mul(s2_4, M4(3.765e-01, 7.629e-02, -9.550e-04, 1.215e-02, -6.660e-02, -2.347e-01, 4.939e-02, -4.931e-01, 2.056e-01, -1.731e-04, -4.735e-02, 2.450e-02, -2.056e-01, 8.265e-02, -5.027e-02, -7.208e-02)); + r += mul(s2_5, M4(2.828e-03, -1.418e-02, 7.302e-02, 5.425e-03, 8.625e-03, 1.805e-01, -4.860e-02, -1.532e-01, 8.334e-02, -5.988e-02, -1.329e-01, -2.702e-03, 9.095e-03, 1.942e-01, 4.222e-02, -1.058e-03)); + r += mul(s2_6, M4(8.565e-01, 5.326e-02, 1.705e-02, 5.460e-02, -1.571e-01, -2.404e-01, 9.784e-02, -3.661e-01, -1.714e-01, -4.530e-02, -7.510e-03, -2.285e-01, -4.492e-02, -1.553e-01, 4.557e-02, 2.245e-01)); + r += mul(s2_7, M4(5.439e-01, -8.800e-02, -7.793e-02, -1.366e-02, 3.674e-02, 4.674e-01, -8.680e-02, -2.205e-01, 4.452e-02, -4.380e-02, 5.358e-02, -1.180e-01, 6.422e-02, 2.963e-01, -1.742e-03, -5.871e-02)); + r += mul(s2_8, M4(7.783e-02, -2.963e-02, 9.227e-02, -7.006e-02, -1.405e-01, 6.849e-02, 8.228e-03, -6.423e-02, -6.025e-03, 6.067e-03, -8.835e-03, -4.613e-02, -1.066e-01, -2.231e-01, -2.395e-02, -8.309e-02)); + r += mul(s3_0, M4(5.781e-02, -2.000e-01, 3.001e-01, -4.266e-01, -1.135e-02, -4.194e-03, -1.160e-01, 2.562e-01, -3.129e-01, -4.833e-01, 2.166e-01, -6.893e-01, -5.524e-02, 4.001e-02, 1.344e-01, -7.897e-02)); + r += mul(s3_1, M4(-1.326e-01, 8.882e-03, -2.982e-01, 1.020e-01, -3.543e-02, 5.500e-02, 1.003e-01, 6.316e-02, -8.846e-02, -9.325e-02, 1.653e-01, 6.537e-01, 1.465e-01, 3.688e-01, 6.048e-02, -1.175e-01)); + r += mul(s3_2, M4(-2.682e-01, 1.979e-01, 1.594e-01, -1.703e-01, -6.687e-02, 4.401e-02, 1.082e-02, 8.612e-02, -1.097e+00, 2.854e-02, 3.023e-01, 1.011e-01, 2.071e-01, -5.715e-02, -1.160e-02, 1.284e-01)); + r += mul(s3_3, M4(1.385e-01, 1.462e-02, -6.357e-03, -2.761e-01, -1.417e-02, 7.504e-02, -3.562e-02, 6.311e-01, -3.158e-01, -3.881e-01, -4.738e-02, -1.761e-01, -1.311e-01, -1.783e-01, -6.620e-02, 4.290e-01)); + r += mul(s3_4, M4(-1.443e-01, -1.535e-02, -1.380e-01, -3.112e-01, -1.150e-01, 1.580e-02, 2.280e-01, 1.955e-02, -5.125e-01, 1.029e+00, -1.082e-01, -4.534e-01, 3.793e-01, -1.121e-01, 1.789e-01, 5.391e-02)); + r += mul(s3_5, M4(1.708e-01, -2.072e-01, 1.042e-01, 9.238e-02, -1.095e-01, -1.285e-02, -5.910e-03, 3.810e-02, -2.203e+00, 5.042e-01, 1.321e+00, -9.544e-02, 1.855e-01, -2.122e-01, -3.456e-02, 8.827e-02)); + r += mul(s3_6, M4(-8.513e-01, 1.258e-01, -8.035e-01, 5.733e-01, 5.071e-02, 1.761e-01, 6.746e-02, 5.481e-01, 1.247e-02, -3.302e-01, 5.462e-01, 5.615e-02, -3.885e-03, 1.080e-01, -1.204e-01, -7.939e-02)); + r += mul(s3_7, M4(-5.870e-01, -4.577e-01, -4.069e-01, 1.490e-01, 2.019e-02, -2.588e-01, 1.686e-01, -1.399e-02, -1.564e-01, 8.066e-01, 1.391e+00, 7.143e-01, -2.593e-02, -2.001e-01, -9.285e-02, -1.235e-01)); + r += mul(s3_8, M4(7.291e-02, 2.909e-01, -9.548e-02, -2.685e-01, -9.634e-04, -3.878e-04, 1.458e-01, 1.708e-01, -2.020e+00, -1.086e+00, -2.588e-01, -4.462e-01, -1.030e-01, 2.201e-01, 2.603e-02, 1.435e-02)); + r += mul(s4_0, M4(-1.146e-01, 3.621e-02, -1.112e-01, -1.958e-01, -7.980e-02, 2.275e-01, -2.337e-02, -2.127e-02, -6.880e-02, 3.179e-02, 2.920e-02, -7.738e-02, -1.011e-01, -2.483e-01, 4.229e-02, -2.371e-03)); + r += mul(s4_1, M4(1.071e-01, -1.620e-01, -1.109e-01, -2.518e-01, -2.020e-01, 1.469e-01, 1.715e-02, -2.811e-01, -6.490e-02, 8.599e-02, -7.551e-03, -8.389e-02, 2.535e-01, -5.084e-01, -2.596e-01, -2.502e-01)); + r += mul(s4_2, M4(1.108e-01, -1.844e-01, 1.731e-01, -2.074e-01, -1.584e-01, -1.588e-01, 4.427e-02, 4.406e-02, -2.766e-01, 6.326e-02, 1.104e-01, -3.570e-03, 7.484e-02, -2.749e-01, -3.075e-02, 1.215e-02)); + r += mul(s4_3, M4(-1.798e-02, 5.229e-02, -1.702e-02, 5.724e-02, -9.031e-02, 2.412e-01, -4.968e-02, 2.454e-02, -2.855e-02, -2.255e-01, -2.992e-02, 3.039e-01, -2.892e-03, -4.545e-04, -6.446e-03, -5.023e-01)); + r += mul(s4_4, M4(6.744e-02, -3.922e-01, -1.469e-01, 3.184e-02, -1.335e-02, -4.252e-01, -1.877e-01, -4.014e-02, 9.306e-02, 1.625e-03, -1.837e-02, -1.705e-01, -1.491e-01, -1.039e-01, -3.117e-01, -4.440e-01)); + r += mul(s4_5, M4(9.537e-02, -9.820e-02, -1.369e-01, -1.174e-01, 5.395e-02, -3.037e-01, -7.887e-02, -7.200e-02, -2.337e-03, 1.488e-01, 6.189e-02, 9.512e-02, -1.188e-01, 2.278e-01, -1.107e-01, -3.545e-01)); + r += mul(s4_6, M4(-8.930e-02, 4.310e-02, 6.118e-02, -1.643e-02, -8.316e-02, 5.446e-02, 3.115e-02, 1.496e-01, -1.781e-01, -7.885e-02, 4.587e-02, -1.316e-01, 2.634e-02, 2.030e-02, -1.087e-01, -4.127e-02)); + r += mul(s4_7, M4(9.015e-02, 2.788e-01, 6.667e-02, 1.200e-01, 1.077e-01, -1.438e-01, 4.557e-02, -4.757e-02, 2.845e-01, 4.945e-02, -7.365e-02, 1.125e-01, -5.808e-02, 2.942e-01, -6.692e-02, 1.674e-01)); + r += mul(s4_8, M4(1.499e-01, 6.180e-01, 8.160e-02, 9.050e-02, 1.187e-02, 2.776e-01, 2.204e-01, -5.643e-02, -1.233e-01, 2.070e-02, -3.342e-02, -2.091e-01, 4.348e-03, 5.386e-01, 1.921e-01, 2.900e-01)); + r += mul(s5_0, M4(-2.882e-02, 1.452e-01, -1.705e-02, 2.552e-01, -1.229e-01, -4.764e-01, -2.250e-01, -1.043e-01, 2.435e-02, 6.002e-02, -4.948e-02, -3.049e-01, 8.513e-02, -8.677e-02, -2.205e-02, 3.659e-02)); + r += mul(s5_1, M4(2.908e-02, 2.192e-01, 3.956e-02, 5.391e-02, 1.977e-01, 3.076e-02, -1.594e-01, 1.171e-01, 1.115e-01, -3.301e-01, -2.461e-03, -7.164e-02, -5.271e-02, 5.961e-01, -7.649e-03, 1.362e-01)); + r += mul(s5_2, M4(-7.324e-02, -1.870e-01, 1.408e-01, -1.262e-02, 3.113e-01, 1.345e-01, 1.300e-01, -1.704e-01, -4.467e-02, -2.020e-02, -1.222e-01, 2.106e-01, 6.127e-02, 1.340e-01, 1.212e-01, 6.721e-02)); + r += mul(s5_3, M4(-4.438e-02, 1.089e-01, -1.936e-02, 3.638e-01, -5.397e-03, -1.789e-01, -7.034e-02, 2.115e-01, 2.980e-01, 1.433e-01, -3.109e-01, 5.999e-02, 2.967e-02, 1.040e-01, 8.379e-02, 2.824e-01)); + r += mul(s5_4, M4(-1.738e-01, -2.783e-02, 1.302e-01, 1.638e-01, 2.230e-01, 3.076e-01, 9.329e-02, 7.890e-02, 3.738e-01, -4.847e-02, 1.343e-01, -4.918e-01, -1.716e-01, 2.760e-01, -2.303e-01, 6.735e-01)); + r += mul(s5_5, M4(2.113e-02, -6.445e-01, -1.235e-01, -5.110e-02, 1.540e-01, -7.572e-02, 1.704e-01, 1.401e-01, 7.002e-01, 7.781e-01, 4.996e-03, 5.194e-01, 1.068e-01, -6.048e-01, 6.111e-02, 2.408e-02)); + r += mul(s5_6, M4(-1.330e-01, 8.110e-02, -9.976e-02, -6.708e-02, -5.166e-02, 2.543e-01, -7.829e-03, 8.376e-02, 7.038e-02, -2.733e-01, -1.933e-01, 3.888e-01, 3.742e-02, -3.099e-02, -3.839e-02, -2.899e-02)); + r += mul(s5_7, M4(4.468e-03, 8.327e-02, -1.232e-02, -2.009e-01, -6.394e-03, -7.117e-02, 8.830e-02, -2.180e-01, -6.541e-01, -1.278e+00, -2.546e-01, -8.400e-01, 3.278e-02, -4.873e-01, 2.989e-02, -2.834e-01)); + r += mul(s5_8, M4(5.587e-02, 1.196e-01, 6.747e-02, -1.516e-01, 1.226e-01, -3.731e-02, 1.674e-01, -4.205e-03, -3.633e-02, 6.329e-01, 2.203e-01, 3.548e-01, -1.867e-02, -6.607e-02, 1.559e-01, -1.029e-01)); + r += mul(s6_0, M4(5.776e-02, -4.237e-02, -3.157e-02, -3.967e-02, 5.468e-02, 1.806e-01, 8.435e-02, -4.378e-02, -8.778e-02, -5.004e-02, 1.611e-01, -1.044e-01, -9.836e-02, 1.137e-01, 4.520e-01, 4.521e-01)); + r += mul(s6_1, M4(1.205e-01, -2.476e-01, -2.943e-02, 2.900e-01, 1.660e-01, 1.942e-01, -3.279e-02, -1.001e-01, 1.873e-01, -5.917e-01, -9.511e-02, 8.591e-02, 2.772e-01, -4.016e-01, -4.060e-02, 4.557e-01)); + r += mul(s6_2, M4(7.314e-02, 2.591e-01, -5.486e-03, 1.097e-01, 8.268e-03, 2.578e-02, 8.015e-02, -3.003e-02, -1.831e-02, 2.921e-01, 3.462e-02, 4.376e-02, 3.626e-02, -2.226e-01, -2.944e-02, 5.713e-02)); + r += mul(s6_3, M4(6.148e-02, -1.827e-01, -3.366e-02, -6.681e-02, 4.735e-02, 1.116e-01, -3.804e-02, 1.689e-02, 1.110e-01, -4.969e-01, -1.288e-01, 1.565e-02, 4.991e-02, -7.043e-02, -1.163e-02, 2.936e-01)); + r += mul(s6_4, M4(-3.330e-01, 7.520e-01, -2.222e-01, 2.143e-01, 8.841e-02, 1.125e-01, -3.049e-02, 1.071e-01, 1.219e-01, 5.266e-01, -1.147e-01, 1.817e-01, -2.865e-01, 4.773e-01, -2.476e-01, -1.749e-01)); + r += mul(s6_5, M4(-5.390e-02, 1.513e-02, 1.866e-02, -3.879e-02, -1.743e-02, -3.595e-01, 8.142e-02, 1.721e-01, -1.288e-01, 2.899e-02, 1.466e-01, -1.986e-02, 3.972e-01, 3.514e-02, 3.046e-01, 1.597e-01)); + r += mul(s6_6, M4(1.587e-01, -2.005e-02, 1.181e-01, 6.660e-01, 1.190e-01, -2.422e-02, -8.934e-02, -9.839e-02, -1.263e-01, 1.481e-01, -1.014e-01, -4.174e-02, 4.562e-02, 1.991e-01, 4.164e-02, 1.085e-01)); + r += mul(s6_7, M4(2.260e-01, 2.539e-01, -4.326e-01, 3.654e-01, 1.095e-02, 1.816e-02, -3.917e-02, -1.604e-01, 6.233e-02, 3.373e-01, -2.174e-02, 1.601e-01, 1.970e-02, -2.403e-01, 8.825e-02, -5.946e-02)); + r += mul(s6_8, M4(-1.247e-02, -7.207e-01, 3.782e-01, 9.277e-03, -1.601e-01, -1.992e-01, 4.560e-02, 9.246e-02, -5.056e-02, -6.212e-02, 9.100e-02, 2.018e-02, 1.977e-01, -1.284e-01, 3.475e-02, -4.638e-02)); + r += mul(s7_0, M4(-2.275e-04, 2.430e-02, 2.681e-02, 7.920e-02, -1.901e-03, 8.596e-02, -1.221e-02, -1.267e-01, 1.530e-01, 3.664e-01, 1.657e-01, 7.102e-02, 1.934e-01, -2.876e-02, -6.522e-02, -5.363e-03)); + r += mul(s7_1, M4(-7.802e-02, -1.425e-01, -4.622e-02, 1.281e-01, 1.430e-01, -2.953e-01, 2.089e-01, -4.956e-02, -1.123e-01, 1.033e-01, 5.525e-02, -1.141e-01, 6.440e-02, 1.535e-01, -6.271e-02, -5.787e-03)); + r += mul(s7_2, M4(2.966e-01, -2.963e-02, -2.085e-02, 1.250e-02, 1.683e-01, -5.223e-01, 5.280e-02, -1.393e-02, -1.692e-01, 4.296e-02, 8.091e-02, -2.750e-02, -1.376e-01, -1.713e-01, 1.871e-02, -1.477e-01)); + r += mul(s7_3, M4(-1.420e-01, 6.008e-02, 5.251e-02, -1.548e-01, 1.021e-01, -2.581e-01, -1.735e-02, -9.447e-02, 9.829e-02, 3.613e-01, -7.935e-02, -2.009e-01, -2.036e-01, -1.951e-02, -7.652e-03, 1.836e-01)); + r += mul(s7_4, M4(-4.783e-02, -2.506e-01, 6.729e-02, 3.130e-02, -3.645e-01, 1.714e-01, -2.112e-01, 1.140e-01, -1.834e-01, -5.257e-01, 1.401e-01, -2.666e-01, -1.429e-01, -3.021e-01, 4.720e-02, -1.594e-02)); + r += mul(s7_5, M4(9.489e-02, 4.199e-03, 5.857e-03, 2.213e-01, 2.342e-03, 2.767e-01, -1.112e-02, -5.612e-02, -2.421e-01, -1.204e-01, 1.011e-01, -2.542e-02, 7.188e-02, -8.339e-02, 1.519e-01, -2.918e-02)); + r += mul(s7_6, M4(-4.214e-02, -7.475e-03, 8.229e-04, -1.843e-01, -1.392e-01, -2.375e-01, -1.100e-01, -1.774e-01, 7.883e-02, 3.931e-02, -5.235e-02, -6.999e-02, 9.210e-02, 9.923e-02, -7.138e-02, 3.417e-02)); + r += mul(s7_7, M4(3.614e-02, -4.942e-03, -5.801e-02, -2.246e-01, -1.091e-01, 2.237e-01, 3.636e-01, -7.534e-02, -3.811e-02, -2.855e-01, 1.454e-01, -1.862e-01, 4.262e-02, 1.475e-01, 3.243e-02, 4.744e-02)); + r += mul(s7_8, M4(1.115e-01, 3.370e-01, -1.262e-01, -1.915e-01, -1.522e-01, -7.482e-02, 6.731e-02, -7.372e-03, -1.355e-01, -1.548e-01, -1.192e-02, 4.345e-03, 9.265e-02, 9.544e-02, -8.572e-02, -1.153e-01)); + r += V4(-1.247e-01, -6.734e-03, 1.475e-01, 4.504e-02); + return r; +} + +void Pass2(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = Rmp8x8(tid.x) + blockStart; + uint2 size = GetInputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = (gxy + 0.5) * pt; + + V4 s0_0 = l0(-1.0, -1.0); + V4 s0_1 = l0(0.0, -1.0); + V4 s0_2 = l0(1.0, -1.0); + V4 s0_3 = l0(-1.0, 0.0); + V4 s0_4 = l0(0.0, 0.0); + V4 s0_5 = l0(1.0, 0.0); + V4 s0_6 = l0(-1.0, 1.0); + V4 s0_7 = l0(0.0, 1.0); + V4 s0_8 = l0(1.0, 1.0); + V4 s1_0 = -max(-s0_0, 0.0); + V4 s1_1 = -max(-s0_1, 0.0); + V4 s1_2 = -max(-s0_2, 0.0); + V4 s1_3 = -max(-s0_3, 0.0); + V4 s1_4 = -max(-s0_4, 0.0); + V4 s1_5 = -max(-s0_5, 0.0); + V4 s1_6 = -max(-s0_6, 0.0); + V4 s1_7 = -max(-s0_7, 0.0); + V4 s1_8 = -max(-s0_8, 0.0); + s0_0 = max(s0_0, 0.0); + s0_1 = max(s0_1, 0.0); + s0_2 = max(s0_2, 0.0); + s0_3 = max(s0_3, 0.0); + s0_4 = max(s0_4, 0.0); + s0_5 = max(s0_5, 0.0); + s0_6 = max(s0_6, 0.0); + s0_7 = max(s0_7, 0.0); + s0_8 = max(s0_8, 0.0); + + V4 s2_0 = l1(-1.0, -1.0); + V4 s2_1 = l1(0.0, -1.0); + V4 s2_2 = l1(1.0, -1.0); + V4 s2_3 = l1(-1.0, 0.0); + V4 s2_4 = l1(0.0, 0.0); + V4 s2_5 = l1(1.0, 0.0); + V4 s2_6 = l1(-1.0, 1.0); + V4 s2_7 = l1(0.0, 1.0); + V4 s2_8 = l1(1.0, 1.0); + V4 s3_0 = -max(-s2_0, 0.0); + V4 s3_1 = -max(-s2_1, 0.0); + V4 s3_2 = -max(-s2_2, 0.0); + V4 s3_3 = -max(-s2_3, 0.0); + V4 s3_4 = -max(-s2_4, 0.0); + V4 s3_5 = -max(-s2_5, 0.0); + V4 s3_6 = -max(-s2_6, 0.0); + V4 s3_7 = -max(-s2_7, 0.0); + V4 s3_8 = -max(-s2_8, 0.0); + s2_0 = max(s2_0, 0.0); + s2_1 = max(s2_1, 0.0); + s2_2 = max(s2_2, 0.0); + s2_3 = max(s2_3, 0.0); + s2_4 = max(s2_4, 0.0); + s2_5 = max(s2_5, 0.0); + s2_6 = max(s2_6, 0.0); + s2_7 = max(s2_7, 0.0); + s2_8 = max(s2_8, 0.0); + + V4 s4_0 = l2(-1.0, -1.0); + V4 s4_1 = l2(0.0, -1.0); + V4 s4_2 = l2(1.0, -1.0); + V4 s4_3 = l2(-1.0, 0.0); + V4 s4_4 = l2(0.0, 0.0); + V4 s4_5 = l2(1.0, 0.0); + V4 s4_6 = l2(-1.0, 1.0); + V4 s4_7 = l2(0.0, 1.0); + V4 s4_8 = l2(1.0, 1.0); + V4 s5_0 = -max(-s4_0, 0.0); + V4 s5_1 = -max(-s4_1, 0.0); + V4 s5_2 = -max(-s4_2, 0.0); + V4 s5_3 = -max(-s4_3, 0.0); + V4 s5_4 = -max(-s4_4, 0.0); + V4 s5_5 = -max(-s4_5, 0.0); + V4 s5_6 = -max(-s4_6, 0.0); + V4 s5_7 = -max(-s4_7, 0.0); + V4 s5_8 = -max(-s4_8, 0.0); + s4_0 = max(s4_0, 0.0); + s4_1 = max(s4_1, 0.0); + s4_2 = max(s4_2, 0.0); + s4_3 = max(s4_3, 0.0); + s4_4 = max(s4_4, 0.0); + s4_5 = max(s4_5, 0.0); + s4_6 = max(s4_6, 0.0); + s4_7 = max(s4_7, 0.0); + s4_8 = max(s4_8, 0.0); + + V4 s6_0 = l3(-1.0, -1.0); + V4 s6_1 = l3(0.0, -1.0); + V4 s6_2 = l3(1.0, -1.0); + V4 s6_3 = l3(-1.0, 0.0); + V4 s6_4 = l3(0.0, 0.0); + V4 s6_5 = l3(1.0, 0.0); + V4 s6_6 = l3(-1.0, 1.0); + V4 s6_7 = l3(0.0, 1.0); + V4 s6_8 = l3(1.0, 1.0); + V4 s7_0 = -max(-s6_0, 0.0); + V4 s7_1 = -max(-s6_1, 0.0); + V4 s7_2 = -max(-s6_2, 0.0); + V4 s7_3 = -max(-s6_3, 0.0); + V4 s7_4 = -max(-s6_4, 0.0); + V4 s7_5 = -max(-s6_5, 0.0); + V4 s7_6 = -max(-s6_6, 0.0); + V4 s7_7 = -max(-s6_7, 0.0); + V4 s7_8 = -max(-s6_8, 0.0); + s6_0 = max(s6_0, 0.0); + s6_1 = max(s6_1, 0.0); + s6_2 = max(s6_2, 0.0); + s6_3 = max(s6_3, 0.0); + s6_4 = max(s6_4, 0.0); + s6_5 = max(s6_5, 0.0); + s6_6 = max(s6_6, 0.0); + s6_7 = max(s6_7, 0.0); + s6_8 = max(s6_8, 0.0); + + t4[gxy] = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t5[gxy] = f1(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t6[gxy] = f2(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t7[gxy] = f3(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); +} + +//!PASS 3 +//!DESC conv2 +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 +//!IN t4, t5, t6, t7 +//!OUT t0, t1, t2, t3 + +#define l0(x, y) V4(O(t4, float2(x, y))) +#define l1(x, y) V4(O(t5, float2(x, y))) +#define l2(x, y) V4(O(t6, float2(x, y))) +#define l3(x, y) V4(O(t7, float2(x, y))) + +V4 f0(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(6.327e-02, -4.161e-03, -7.095e-02, 8.572e-02, 2.713e-01, -8.915e-02, 1.283e-01, 1.211e-01, 4.276e-02, 1.801e-01, 4.923e-02, 1.689e-01, 4.860e-03, 9.050e-02, 1.170e-01, 2.876e-02)); + r += mul(s0_1, M4(3.230e-01, 1.148e-02, -8.886e-02, -7.384e-02, -2.449e-01, 1.492e-01, -2.951e-01, 1.323e-01, -1.567e-01, -1.223e-01, -6.559e-02, 1.257e-01, -3.000e-02, -7.952e-02, -4.354e-02, 5.939e-02)); + r += mul(s0_2, M4(-2.210e-01, -2.521e-02, -1.389e-01, 8.327e-03, 1.671e-01, -8.144e-02, 2.434e-01, 6.808e-02, 7.082e-02, -1.674e-03, -9.994e-02, 1.391e-02, 4.024e-02, 4.371e-01, 1.293e-02, 1.008e-02)); + r += mul(s0_3, M4(7.365e-02, 1.708e-01, -5.529e-02, 1.132e-01, -2.704e-01, 1.576e-01, 6.757e-01, 2.633e-01, -2.244e-01, -1.270e-01, -1.897e-01, -3.632e-01, 3.384e-01, 1.121e-01, -4.074e-02, -2.217e-02)); + r += mul(s0_4, M4(1.276e-01, 3.451e-01, 6.513e-01, -1.107e-01, -3.603e-01, 1.250e-01, 1.405e-01, 1.633e-01, -2.302e-01, 3.803e-01, 8.127e-02, 4.307e-02, 1.260e-01, -8.987e-02, 2.313e-01, 1.861e-02)); + r += mul(s0_5, M4(6.664e-02, 9.814e-02, -2.025e-01, -5.130e-02, 1.402e-01, 2.758e-02, -1.749e-01, 4.557e-02, -6.261e-02, 4.286e-02, 3.171e-02, 3.924e-02, 6.739e-03, 4.048e-01, 3.059e-01, -9.780e-02)); + r += mul(s0_6, M4(-2.523e-01, 5.620e-02, 1.544e-01, 7.048e-02, 6.348e-02, 1.012e-01, -1.061e-01, -4.494e-02, 2.313e-02, -1.618e-01, -2.614e-01, 2.950e-02, -5.357e-03, -1.370e-01, 4.001e-02, -1.482e-02)); + r += mul(s0_7, M4(5.214e-02, 3.052e-01, 4.194e-01, -8.665e-02, -9.621e-03, 1.808e-02, 1.415e-01, 3.203e-02, -1.528e-01, 1.688e-01, -1.156e-01, 1.174e-01, 1.449e-01, -2.612e-01, -3.573e-01, -6.727e-03)); + r += mul(s0_8, M4(1.988e-01, 1.280e-01, -1.995e-02, 4.861e-02, -2.275e-02, -2.332e-01, -3.972e-01, 7.563e-03, -1.249e-01, 5.808e-02, -2.661e-01, 2.108e-02, -1.025e-01, -2.647e-01, 9.820e-02, 1.589e-01)); + r += mul(s1_0, M4(-8.562e-02, 7.639e-02, 2.790e-02, 4.735e-02, 1.694e-01, 6.082e-02, -1.144e-01, 2.403e-01, -6.880e-02, 1.604e-02, -1.194e-01, 2.735e-02, 9.442e-02, 1.005e-01, 1.251e-01, -9.961e-02)); + r += mul(s1_1, M4(-5.455e-02, -1.737e-01, -9.332e-02, -6.026e-02, -2.545e-01, 7.186e-02, -1.942e-01, -6.522e-02, 1.620e-01, -1.688e-01, 2.674e-02, 1.777e-02, -3.592e-02, -6.977e-03, 1.704e-01, 4.673e-02)); + r += mul(s1_2, M4(7.543e-02, 1.294e-01, 1.760e-01, 6.920e-02, 1.324e-01, -3.765e-02, 6.680e-02, 1.844e-01, 3.093e-02, -2.529e-01, -4.490e-02, -7.585e-04, 2.114e-03, -8.864e-03, -5.308e-03, 9.409e-02)); + r += mul(s1_3, M4(-2.335e-01, 7.110e-02, -3.204e-02, 2.092e-01, -8.619e-02, 1.550e-01, 2.951e-01, -7.618e-02, -8.411e-02, 2.200e-01, -8.623e-02, -2.308e-02, 1.055e-01, -8.905e-02, -6.922e-02, -3.127e-02)); + r += mul(s1_4, M4(1.158e-01, 1.023e-02, 9.718e-02, -1.151e-01, 6.683e-03, -9.999e-02, -7.944e-02, -3.799e-01, -3.740e-02, 2.614e-01, 2.009e-01, 3.862e-02, -2.460e-01, 4.585e-02, -2.018e-01, 5.815e-02)); + r += mul(s1_5, M4(5.490e-02, -1.056e-01, -6.731e-02, 5.668e-02, 1.145e-01, 4.128e-02, -3.419e-02, 4.321e-02, 2.014e-01, -8.320e-03, -8.264e-02, -1.081e-02, 2.209e-01, 7.960e-02, -1.285e-02, -1.142e-01)); + r += mul(s1_6, M4(3.860e-01, 3.242e-01, -4.442e-02, 9.476e-03, -5.421e-02, 7.842e-02, 7.767e-02, 3.662e-02, -5.802e-02, -5.228e-02, -1.865e-02, -1.248e-02, -5.554e-03, -6.500e-03, -1.300e-01, 5.588e-02)); + r += mul(s1_7, M4(-1.747e-01, -1.868e-02, -2.577e-02, 1.003e-01, -5.426e-02, 6.938e-02, 2.382e-01, 5.263e-02, -7.487e-02, -6.574e-02, 9.440e-02, -1.578e-02, -2.529e-01, -6.164e-02, -1.741e-01, -3.964e-02)); + r += mul(s1_8, M4(8.963e-02, -3.654e-03, -9.010e-02, 5.938e-02, 2.432e-02, -7.417e-02, -1.305e-01, 1.299e-01, 9.012e-02, -1.098e-01, -7.742e-02, 1.153e-02, -3.196e-01, 8.448e-03, 3.800e-02, -3.158e-04)); + r += mul(s2_0, M4(1.585e-02, -4.317e-02, -7.029e-02, -1.408e-02, -1.021e-01, -1.469e-01, -6.816e-02, 1.462e-01, 2.180e-01, -1.636e-01, -1.523e-01, -1.271e-01, -3.630e-02, 5.139e-03, 5.684e-02, 1.091e-01)); + r += mul(s2_1, M4(1.188e-01, 4.941e-02, 1.238e-01, -2.339e-02, 3.207e-01, 1.724e-01, -5.752e-02, 2.132e-03, -1.144e-02, 6.469e-02, -7.387e-02, -2.626e-02, 1.331e-01, 2.901e-01, 1.256e-01, -1.309e-01)); + r += mul(s2_2, M4(7.347e-02, -6.850e-02, 5.946e-02, -3.748e-02, -9.691e-02, 4.133e-01, -1.619e-01, 2.053e-02, 1.234e-01, -7.837e-02, 3.781e-01, 5.012e-02, 1.324e-01, 1.592e-01, 4.595e-01, 8.679e-02)); + r += mul(s2_3, M4(-6.365e-02, -1.803e-02, 1.918e-03, -3.813e-02, -2.683e-01, -5.608e-01, -1.542e-02, 1.429e-02, 1.080e-01, -2.332e-01, 1.838e-01, -1.336e-01, -1.502e-01, 5.805e-02, 2.329e-01, 1.809e-02)); + r += mul(s2_4, M4(1.323e-01, -4.564e-02, 2.595e-04, 2.409e-02, 3.545e-01, 1.530e-01, -6.533e-02, -4.940e-02, 1.852e-01, -7.116e-01, -3.391e-01, 1.780e-01, 3.437e-01, 8.667e-02, 2.948e-01, -1.259e-01)); + r += mul(s2_5, M4(8.857e-02, -5.210e-02, -7.111e-02, -1.854e-01, 2.610e-01, 2.809e-01, 1.234e-01, -4.128e-02, 2.214e-01, -4.631e-01, 1.295e-01, -3.318e-01, -1.156e-01, 1.898e-01, -4.517e-01, 8.782e-02)); + r += mul(s2_6, M4(8.610e-02, 2.528e-02, -2.750e-02, -2.833e-02, -2.638e-01, -5.164e-01, -8.466e-02, 9.584e-02, 2.705e-01, 4.046e-02, 4.747e-03, 1.428e-01, -1.552e-01, -1.916e-01, -1.442e-01, -6.089e-02)); + r += mul(s2_7, M4(-2.071e-01, -3.368e-02, -1.481e-01, -1.713e-02, 1.977e-01, 2.827e-01, 3.648e-01, 1.130e-01, 6.445e-01, -3.686e-01, -3.002e-01, -1.252e-01, 1.120e-01, -4.683e-02, 2.805e-01, -7.061e-02)); + r += mul(s2_8, M4(3.741e-02, -9.474e-03, 7.240e-02, 1.201e-02, 9.436e-02, 1.156e-01, -8.933e-02, 1.423e-01, 2.941e-01, -1.259e-01, 2.881e-02, -8.421e-02, 7.420e-02, 3.754e-02, -2.140e-01, -3.572e-02)); + r += mul(s3_0, M4(-1.187e-01, 6.031e-02, -3.228e-02, -3.443e-02, 6.831e-02, 1.834e-01, 6.940e-02, 6.946e-02, -1.477e-01, -4.231e-02, -1.754e-01, -4.200e-02, -8.707e-02, 2.923e-03, -6.957e-02, 7.741e-02)); + r += mul(s3_1, M4(3.398e-02, 9.156e-02, 4.898e-02, -4.594e-03, 1.062e-01, 1.513e-01, 8.946e-02, -7.440e-02, -3.083e-02, -4.001e-02, -1.423e-01, 6.950e-02, 7.627e-02, -1.463e-01, 1.154e-02, -4.211e-02)); + r += mul(s3_2, M4(-1.576e-01, 3.827e-01, 2.089e-02, 1.329e-01, 5.788e-02, 6.723e-02, -8.173e-03, 1.822e-02, 5.617e-02, 3.804e-02, 7.445e-03, 9.113e-02, -2.647e-01, -1.568e-01, -1.883e-02, 9.578e-02)); + r += mul(s3_3, M4(3.644e-02, 2.846e-01, 1.637e-01, 2.092e-02, -2.495e-01, -8.316e-02, 6.982e-02, -5.121e-02, -1.906e-01, 5.269e-02, -3.513e-02, -8.395e-02, -1.062e-01, -3.967e-02, 4.036e-02, 4.684e-02)); + r += mul(s3_4, M4(4.960e-01, 3.997e-01, 4.401e-02, -1.968e-04, 1.716e-01, 2.557e-01, 2.948e-01, -9.129e-02, -2.818e-02, -1.504e-01, 6.695e-02, 1.177e-01, -2.574e-02, -1.026e-01, 1.391e-01, 2.191e-03)); + r += mul(s3_5, M4(2.392e-02, 5.665e-01, 2.468e-02, 1.034e-03, 8.954e-02, 1.568e-01, -2.749e-02, -1.099e-01, 7.728e-02, 2.235e-01, 1.992e-01, 9.381e-03, -5.173e-02, -2.759e-02, -2.518e-01, 1.953e-02)); + r += mul(s3_6, M4(-2.692e-01, -1.146e-01, 1.086e-01, -3.173e-02, 2.293e-03, 8.060e-02, -3.199e-01, 1.096e-01, -1.890e-01, 1.366e-01, 4.567e-02, 7.226e-02, 3.653e-02, 2.276e-02, 4.357e-02, -1.038e-02)); + r += mul(s3_7, M4(1.461e-01, 3.255e-01, 1.605e-01, -3.955e-02, 3.326e-02, -1.174e-01, 3.523e-01, 9.180e-02, -6.552e-02, 1.428e-01, 1.248e-01, -2.213e-02, -1.386e-01, -5.679e-02, -1.679e-01, -6.844e-02)); + r += mul(s3_8, M4(2.182e-01, 9.706e-02, 8.389e-02, 3.322e-02, 2.416e-02, 6.132e-02, 6.103e-02, -1.857e-03, 1.241e-01, 2.562e-01, 1.088e-01, -1.497e-02, 1.795e-02, -2.255e-02, -1.364e-01, 2.330e-02)); + r += mul(s4_0, M4(-1.897e-01, 3.918e-03, 2.127e-02, -3.432e-02, -6.214e-02, -4.871e-02, 2.735e-01, -5.989e-02, 2.061e-01, -2.198e-02, 1.275e-01, -1.477e-04, 9.195e-02, -9.152e-02, -1.392e-01, -6.532e-02)); + r += mul(s4_1, M4(3.915e-01, 4.246e-02, 2.639e-01, -7.523e-02, 1.005e-01, -1.055e-01, 3.850e-01, -2.673e-01, 3.600e-03, 7.291e-02, -3.459e-02, 8.809e-02, -1.028e-01, -5.200e-02, -2.047e-01, -1.948e-02)); + r += mul(s4_2, M4(-1.083e-01, -7.279e-03, -2.331e-01, 2.004e-02, -2.114e-01, -2.466e-02, -8.172e-02, -7.143e-02, 4.624e-02, -4.669e-02, -2.231e-02, -9.357e-02, -5.481e-02, -1.953e-02, 4.750e-02, -1.478e-02)); + r += mul(s4_3, M4(-6.179e-02, 6.193e-03, -1.727e-01, -7.010e-02, -3.048e-01, 4.445e-02, -1.026e-01, 9.666e-02, 4.053e-02, -6.707e-02, 2.172e-01, 5.937e-02, 3.824e-02, 1.248e-01, -1.294e-01, -6.955e-02)); + r += mul(s4_4, M4(-2.312e-02, -1.556e-01, 1.048e-01, -1.411e-02, 1.620e-01, 3.157e-01, 2.627e-01, 1.063e-01, -1.202e-01, 2.224e-01, 4.503e-01, 5.285e-02, 1.987e-01, 3.739e-01, 2.998e-01, -2.872e-02)); + r += mul(s4_5, M4(2.167e-01, 2.060e-02, 1.937e-01, -2.236e-02, -8.763e-02, 9.011e-03, 2.259e-02, -8.353e-03, -2.376e-03, -1.644e-01, -1.076e-01, 7.411e-02, -9.956e-02, -3.235e-02, -9.366e-02, 6.449e-02)); + r += mul(s4_6, M4(4.405e-02, 4.167e-02, 1.097e-01, 7.252e-02, -2.906e-03, 1.321e-02, -1.755e-01, -5.058e-02, -6.062e-02, 1.258e-01, 3.338e-02, 7.420e-03, 1.128e-01, 9.513e-02, 2.138e-01, 5.929e-02)); + r += mul(s4_7, M4(-7.551e-02, -2.955e-02, -5.810e-02, 6.246e-02, -3.637e-02, 5.806e-02, 9.447e-02, -1.058e-02, -4.137e-02, -3.802e-02, 1.992e-01, 6.407e-02, 7.304e-02, -8.740e-03, -9.634e-02, 3.922e-02)); + r += mul(s4_8, M4(1.127e-01, -2.911e-02, 9.664e-02, 5.907e-02, 3.276e-02, 2.230e-02, -6.320e-02, -5.340e-02, -1.120e-01, 8.211e-02, -1.139e-02, -1.026e-01, -4.230e-01, 9.882e-02, -1.533e-01, -7.614e-03)); + r += mul(s5_0, M4(3.628e-02, -1.154e-01, -9.059e-02, 8.894e-02, 1.600e-01, -1.455e-01, 2.762e-01, 8.866e-02, 8.908e-02, -1.244e-01, 6.007e-03, -6.604e-03, -1.643e-02, -1.979e-01, -3.706e-02, -4.506e-02)); + r += mul(s5_1, M4(-3.384e-02, 6.505e-02, -1.242e-01, 6.364e-02, 6.078e-02, 2.186e-01, -2.541e-02, -1.192e-01, -2.079e-01, -1.322e-02, 7.614e-02, 8.697e-02, -1.462e-01, -1.954e-01, -2.591e-02, 6.293e-03)); + r += mul(s5_2, M4(8.138e-02, -2.241e-03, 1.985e-01, 9.739e-02, -1.941e-01, -1.051e-01, -1.806e-01, -9.988e-03, 3.914e-02, 1.884e-01, 5.192e-03, 9.964e-02, -4.189e-02, 7.034e-02, -3.800e-02, -3.726e-02)); + r += mul(s5_3, M4(-1.779e-02, -6.324e-02, -2.182e-01, 1.308e-02, -9.059e-03, -1.412e-01, 7.894e-02, 9.893e-02, 1.928e-01, -2.165e-01, 1.406e-01, 6.054e-02, -1.174e-01, 2.001e-01, 4.642e-02, -6.890e-02)); + r += mul(s5_4, M4(3.239e-01, -1.116e-01, -1.082e-01, -1.656e-01, 3.001e-01, 2.518e-01, 2.099e-01, 2.291e-01, -2.275e-01, 1.730e-01, 1.631e-01, 2.516e-01, -1.181e-01, -3.579e-01, -2.563e-01, -1.597e-01)); + r += mul(s5_5, M4(3.881e-02, 4.573e-03, 9.434e-02, 7.049e-02, 2.350e-02, -1.397e-01, -3.036e-01, 5.881e-03, 1.452e-02, -3.329e-01, -3.474e-01, 1.116e-01, -1.395e-01, -3.177e-01, 1.819e-02, 8.131e-02)); + r += mul(s5_6, M4(-9.471e-02, -2.972e-03, 7.773e-02, 9.366e-02, 4.038e-02, -1.017e-01, -1.674e-01, 1.358e-02, -1.484e-01, -6.491e-02, 1.528e-01, 2.826e-02, -4.188e-02, 5.348e-03, -1.330e-01, 6.659e-02)); + r += mul(s5_7, M4(-6.946e-02, 1.261e-02, 5.539e-03, 1.232e-01, -3.141e-02, -4.053e-02, -7.442e-02, 4.680e-02, -2.723e-03, 7.596e-02, 1.265e-01, 1.786e-01, -3.848e-01, 4.192e-02, 1.359e-01, 6.009e-01)); + r += mul(s5_8, M4(8.002e-02, -8.406e-02, -1.795e-01, 5.072e-02, -3.172e-02, -9.015e-03, -9.026e-03, -2.030e-02, 1.183e-01, 1.129e-01, 7.920e-04, 6.145e-02, 6.649e-02, 1.501e-01, 1.855e-01, 1.570e-01)); + r += mul(s6_0, M4(-9.948e-02, -3.819e-01, -3.683e-01, 1.272e-01, -1.245e-01, 5.014e-02, 2.566e-03, 1.791e-02, -2.544e-02, -1.346e-02, 9.671e-02, -1.296e-01, -1.373e-01, -1.413e-01, -1.511e-01, 5.454e-02)); + r += mul(s6_1, M4(1.689e-01, 1.160e-01, -3.101e-01, 2.190e-01, 1.594e-02, 1.233e-01, 7.174e-02, 1.163e-01, -3.987e-02, -6.442e-02, 2.028e-02, 2.604e-01, 2.538e-01, -6.826e-03, -8.698e-02, 2.701e-03)); + r += mul(s6_2, M4(-3.038e-01, -3.873e-02, -3.611e-01, 2.083e-01, 8.210e-03, 2.875e-01, 2.235e-01, -9.963e-03, 2.046e-01, 8.798e-02, 6.654e-02, -8.716e-02, 1.516e-03, 1.959e-01, -1.237e-01, -6.952e-02)); + r += mul(s6_3, M4(-1.227e-01, -3.209e-01, 4.159e-01, -1.595e-01, 1.925e-01, -6.211e-02, -1.687e-01, -2.715e-02, -2.856e-02, 1.477e-01, 1.866e-01, -1.047e-01, -3.563e-01, -2.639e-02, -1.135e-01, -2.952e-02)); + r += mul(s6_4, M4(-6.050e-02, 2.194e-03, 5.951e-01, -6.900e-01, 2.066e-01, -3.367e-02, -1.890e-01, 3.375e-02, 9.062e-02, -4.336e-03, -2.486e-01, 4.065e-02, -2.189e-01, 3.577e-01, 4.976e-01, -4.142e-02)); + r += mul(s6_5, M4(-8.950e-02, -9.476e-02, -5.042e-01, 1.305e-01, -2.734e-01, -6.901e-02, -8.919e-02, 1.665e-02, -1.636e-01, -1.991e-01, -8.216e-02, -4.933e-02, 3.207e-01, 2.510e-01, 4.275e-01, 1.801e-02)); + r += mul(s6_6, M4(6.011e-02, -3.569e-02, -1.104e-01, 1.611e-01, 6.707e-02, 7.508e-02, 1.801e-01, 4.667e-02, -3.339e-02, 4.987e-02, 3.933e-02, -1.535e-01, -1.190e-01, -9.312e-02, -1.689e-01, -7.907e-02)); + r += mul(s6_7, M4(5.741e-02, -3.315e-01, -1.535e-02, 2.660e-02, 1.870e-01, 1.909e-01, -1.146e-01, 1.900e-02, -2.739e-02, 9.114e-02, 1.117e-01, 2.496e-01, 2.605e-02, -1.141e-01, 1.132e-01, 8.098e-02)); + r += mul(s6_8, M4(1.431e-01, -5.832e-02, -2.409e-01, 8.434e-02, -4.826e-02, 1.786e-03, 2.087e-02, 3.139e-02, 1.958e-02, 1.201e-02, -4.888e-02, -4.389e-03, -6.186e-02, 5.031e-02, -2.338e-01, 7.370e-03)); + r += mul(s7_0, M4(-2.819e-02, 4.830e-02, -1.123e-01, -2.288e-02, -2.261e-01, -3.548e-02, 6.272e-03, -1.159e-01, -1.028e-01, 2.509e-01, 3.823e-01, -3.339e-01, -1.939e-03, 6.241e-02, 1.383e-01, 5.818e-02)); + r += mul(s7_1, M4(3.128e-01, 1.791e-01, 1.683e-01, 3.046e-02, 2.142e-01, -1.121e-01, 1.690e-01, 4.042e-02, 2.893e-01, -2.183e-01, -1.629e-02, -3.933e-01, 2.875e-01, -6.478e-02, 4.908e-02, -3.129e-02)); + r += mul(s7_2, M4(-4.698e-02, 1.046e-01, -5.359e-02, 1.036e-01, 1.937e-01, 8.666e-02, 9.641e-02, -9.856e-02, 1.051e-01, -8.032e-02, 1.118e-01, -3.495e-01, 1.361e-01, -7.262e-02, -1.698e-02, 1.504e-02)); + r += mul(s7_3, M4(1.390e-01, -1.189e-01, 4.071e-02, -6.657e-02, 7.152e-02, 4.180e-02, -2.413e-01, -5.912e-02, -1.159e-01, 7.575e-02, 2.380e-02, -3.793e-01, -2.213e-02, -7.473e-02, 1.470e-01, -4.935e-03)); + r += mul(s7_4, M4(-1.537e-01, -4.603e-02, 1.730e-01, -8.155e-02, -1.529e-01, -2.781e-01, -2.626e-01, -3.020e-02, -9.334e-02, -3.587e-02, -3.223e-01, -3.744e-01, -1.472e-01, -2.700e-01, 1.532e-01, -4.350e-02)); + r += mul(s7_5, M4(1.005e-01, -1.657e-01, -1.212e-01, -6.836e-03, 3.816e-02, 1.726e-02, 5.315e-02, -6.332e-02, -1.666e-01, -8.853e-02, 2.522e-01, -3.005e-01, 1.110e-01, 4.975e-02, 1.238e-01, 1.633e-02)); + r += mul(s7_6, M4(2.830e-03, -3.752e-02, 1.024e-01, 1.412e-02, 2.369e-02, -8.427e-02, -1.137e-01, -5.829e-02, 7.208e-02, 2.210e-01, 1.495e-01, -2.120e-01, 1.816e-01, -9.071e-02, 8.602e-02, -7.145e-02)); + r += mul(s7_7, M4(-7.057e-02, -2.065e-02, -9.396e-02, 2.313e-02, 2.014e-02, 2.292e-02, -1.276e-01, -7.497e-02, 2.522e-01, 2.429e-01, -2.176e-01, -3.563e-01, 2.477e-01, -1.382e-01, -1.759e-01, 1.100e-01)); + r += mul(s7_8, M4(-6.531e-02, 7.056e-02, -3.217e-02, 6.280e-02, -1.141e-01, 5.571e-02, -2.464e-02, -6.609e-02, -2.009e-01, 1.591e-01, -4.558e-02, -2.204e-01, -1.367e-01, -1.187e-01, -2.091e-01, 8.745e-02)); + r += V4(2.615e-03, -3.608e-04, -7.717e-03, -8.081e-02); + return r; +} + +V4 f1(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-1.536e-01, 2.193e-02, -9.375e-02, -4.897e-02, 1.054e-01, -3.643e-02, 1.441e-01, 1.123e-01, -7.945e-02, 4.298e-02, 7.503e-02, 1.980e-01, 1.347e-01, -3.603e-01, -7.707e-02, -1.264e-01)); + r += mul(s0_1, M4(-3.196e-02, -3.222e-02, 4.719e-02, 2.527e-03, 1.524e-01, 3.143e-02, -1.850e-02, 4.592e-02, -1.449e-01, -6.270e-02, -1.521e-01, -2.693e-02, 3.581e-02, -8.189e-02, 1.889e-01, -1.276e-01)); + r += mul(s0_2, M4(-3.966e-02, 6.965e-02, -1.673e-01, -1.664e-03, 1.432e-01, -4.040e-03, 2.888e-01, 1.322e-01, -1.117e-01, 9.460e-02, 3.472e-02, -2.666e-01, 3.271e-02, 4.691e-02, 1.412e-01, 3.633e-01)); + r += mul(s0_3, M4(3.393e-01, -8.829e-02, 1.219e-01, -2.154e-02, 5.591e-02, -2.134e-02, -2.328e-01, 7.491e-02, 3.801e-02, -2.387e-01, 4.726e-02, -8.321e-02, 1.396e-02, 1.148e-01, 6.694e-02, -4.088e-02)); + r += mul(s0_4, M4(1.191e-01, 1.926e-01, 1.550e-01, 1.086e-01, -2.196e-01, 7.820e-02, -1.490e-01, -2.558e-01, -5.860e-02, -8.136e-02, -6.774e-03, -5.233e-02, -1.020e-01, 1.495e-01, -2.110e-01, -1.891e-01)); + r += mul(s0_5, M4(1.661e-03, 8.923e-03, 3.049e-02, -1.079e-01, 1.894e-02, -1.517e-01, -3.742e-02, 1.854e-02, -6.763e-02, -1.833e-01, 5.647e-02, -7.094e-02, -2.422e-03, 2.143e-01, 5.749e-01, -2.184e-01)); + r += mul(s0_6, M4(-6.715e-03, 1.537e-01, 4.878e-02, 3.618e-03, -1.182e-01, -4.082e-02, 7.658e-02, 5.044e-02, -2.996e-02, -3.596e-02, 1.077e-01, -1.437e-01, -1.350e-02, -1.825e-01, -1.276e-01, -1.177e-01)); + r += mul(s0_7, M4(-2.086e-01, -8.139e-02, 1.454e-01, 5.074e-02, 6.160e-03, 3.910e-01, 2.105e-01, 5.321e-02, -1.713e-01, 5.953e-02, 1.654e-01, -1.192e-01, 1.336e-01, 2.573e-01, -2.016e-01, 3.498e-02)); + r += mul(s0_8, M4(6.900e-02, -1.446e-01, -1.762e-01, 2.112e-01, 1.580e-01, 2.114e-01, 9.015e-03, 1.532e-01, 8.336e-03, 5.163e-02, 2.668e-02, -1.992e-01, 1.748e-01, 6.060e-01, 6.609e-04, -1.562e-01)); + r += mul(s1_0, M4(-7.974e-02, -5.734e-02, 4.343e-02, 1.315e-01, 5.257e-02, 2.619e-02, 1.474e-01, 2.785e-02, -2.122e-01, 1.286e-01, 8.247e-02, -4.775e-02, -8.110e-02, -7.834e-02, 1.119e-01, 6.464e-02)); + r += mul(s1_1, M4(-1.791e-01, -1.306e-01, -9.517e-02, -9.715e-02, 1.383e-01, -7.254e-02, 2.996e-02, -1.071e-01, 6.347e-03, 3.042e-02, -2.237e-01, 4.132e-02, 7.086e-02, -2.773e-01, 1.161e-01, 2.955e-01)); + r += mul(s1_2, M4(6.846e-02, 3.698e-02, 5.577e-02, 1.688e-01, 6.940e-02, -4.380e-02, 2.417e-01, 1.075e-01, 4.557e-02, 6.876e-03, -4.562e-02, -7.453e-02, 1.256e-01, -1.922e-01, -2.465e-01, 3.321e-01)); + r += mul(s1_3, M4(5.729e-02, -7.859e-02, 1.990e-01, 1.460e-01, 3.100e-02, 8.277e-02, 3.022e-02, 1.528e-02, 1.802e-01, 7.794e-02, 6.750e-02, 8.433e-03, -1.899e-01, 6.637e-02, 1.012e-01, -6.952e-02)); + r += mul(s1_4, M4(2.476e-01, 2.536e-01, 4.014e-01, 2.553e-01, 1.488e-02, 2.272e-01, 1.149e-01, -1.419e-01, 8.072e-02, -3.484e-02, -6.580e-02, -2.480e-04, -2.329e-01, -7.622e-02, -3.141e-01, -2.013e-01)); + r += mul(s1_5, M4(-8.155e-04, -8.081e-02, 5.585e-02, -1.909e-01, 1.755e-01, -4.790e-02, 1.461e-01, 2.156e-02, 1.235e-01, -4.207e-02, 6.835e-02, -7.678e-02, -5.357e-02, -3.332e-01, 6.888e-02, 3.389e-01)); + r += mul(s1_6, M4(9.778e-02, -1.402e-01, 2.056e-01, 2.418e-01, -1.001e-01, 4.984e-02, 1.329e-01, -8.407e-02, -1.903e-01, 7.319e-02, 1.819e-01, -1.242e-01, 6.291e-02, -9.227e-02, -6.650e-02, 2.091e-02)); + r += mul(s1_7, M4(-5.745e-02, -2.956e-02, -2.382e-01, 1.047e-01, -2.035e-02, 1.017e-01, 3.915e-02, 3.923e-03, -1.076e-01, -1.961e-01, -1.103e-01, -1.057e-01, -7.928e-02, -4.208e-01, 3.675e-02, -1.746e-01)); + r += mul(s1_8, M4(2.269e-02, -8.960e-02, 2.786e-02, 1.194e-01, -7.041e-02, -4.548e-02, 3.849e-03, 1.108e-02, 4.179e-02, -6.224e-03, -1.517e-01, -3.722e-02, -2.309e-01, -4.689e-01, -9.688e-03, -1.259e-01)); + r += mul(s2_0, M4(-2.010e-02, 5.144e-02, 6.034e-02, 7.541e-03, 1.314e-01, -7.879e-02, -1.082e-01, 3.129e-02, -4.445e-02, 1.534e-01, 2.469e-02, 1.628e-01, 1.400e-01, -3.228e-02, -1.776e-03, 5.769e-02)); + r += mul(s2_1, M4(1.808e-01, -1.405e-01, 6.782e-02, -4.191e-02, 2.192e-01, -1.407e-01, 1.498e-01, -2.685e-02, 1.277e-01, -2.999e-02, 7.470e-03, -1.035e-01, 2.323e-01, 9.520e-02, -1.943e-01, 6.655e-02)); + r += mul(s2_2, M4(4.662e-02, 1.309e-01, 2.511e-02, 1.753e-01, -1.090e-01, 1.047e-01, 3.579e-01, 8.986e-02, 1.825e-01, 9.717e-03, 4.552e-02, 6.842e-03, 8.078e-02, -8.883e-02, -3.848e-01, 3.532e-01)); + r += mul(s2_3, M4(-3.281e-02, 1.429e-01, 4.601e-02, -9.739e-02, 2.633e-01, -1.107e-01, -3.663e-01, -1.183e-01, -1.530e-01, -1.636e-01, -1.450e-01, 1.975e-01, -4.363e-02, 2.147e-02, -1.104e-02, 1.039e-01)); + r += mul(s2_4, M4(-2.343e-02, 6.642e-02, 2.882e-01, 1.283e-01, 4.546e-01, 2.547e-01, 3.903e-01, -3.050e-01, -1.711e-01, -3.089e-01, -2.291e-01, 4.552e-02, -2.052e-03, -1.387e-01, 1.635e-01, -3.818e-01)); + r += mul(s2_5, M4(7.496e-02, -1.952e-01, -2.334e-02, -4.991e-02, 7.087e-02, 1.786e-01, 3.642e-01, 1.281e-01, 5.938e-01, -1.237e-01, 3.925e-02, -3.615e-02, 4.378e-02, -1.997e-01, -8.283e-02, -2.681e-01)); + r += mul(s2_6, M4(6.869e-03, -5.420e-02, -3.790e-03, -7.131e-02, -6.633e-02, 1.967e-01, -1.449e-02, 4.217e-01, 3.091e-01, 9.026e-02, 1.471e-03, 1.838e-01, -1.607e-01, 2.643e-02, -1.177e-03, 3.705e-03)); + r += mul(s2_7, M4(5.169e-02, 7.583e-02, 7.764e-02, -8.519e-02, -4.837e-02, -6.246e-02, 4.484e-01, -2.561e-01, 4.161e-01, 3.703e-01, -1.218e-01, 4.129e-01, -2.863e-01, -2.196e-03, 3.475e-01, -1.904e-01)); + r += mul(s2_8, M4(-4.862e-02, 3.213e-01, 1.736e-02, -1.612e-02, -9.350e-02, -1.273e-01, -3.268e-02, -6.336e-02, 1.920e-01, -6.951e-02, 3.064e-03, -1.035e-01, 9.870e-02, -3.462e-01, -1.288e-01, 5.762e-02)); + r += mul(s3_0, M4(-2.217e-01, 1.547e-01, 5.870e-03, -1.022e-01, 2.492e-01, -2.678e-02, -1.080e-01, 8.747e-02, 1.652e-01, 1.323e-01, -2.610e-02, 6.079e-03, 2.915e-03, -3.514e-02, 8.385e-02, -6.264e-02)); + r += mul(s3_1, M4(-9.377e-02, -4.420e-02, 5.238e-02, -2.172e-01, 1.824e-01, -3.558e-02, -2.377e-02, 1.185e-01, 5.646e-02, 2.368e-01, -4.782e-02, -2.171e-01, 1.230e-01, 1.990e-01, 5.330e-02, -5.694e-02)); + r += mul(s3_2, M4(5.045e-02, 2.208e-02, 5.464e-02, 1.499e-01, -1.315e-02, 1.246e-01, 2.056e-01, 8.074e-02, -3.316e-02, 1.584e-01, 5.447e-02, -5.966e-02, -8.432e-02, 4.824e-02, -1.086e-01, -5.020e-02)); + r += mul(s3_3, M4(1.809e-01, 5.069e-02, 5.310e-02, -1.384e-01, -1.275e-01, -1.509e-01, -2.822e-01, -5.726e-02, -4.277e-02, -7.647e-02, -2.646e-01, 6.126e-02, -5.023e-03, -5.288e-02, -4.901e-02, 7.492e-02)); + r += mul(s3_4, M4(1.318e-01, -3.723e-01, 4.562e-01, -5.841e-01, 4.835e-02, -1.168e-01, 4.724e-02, 8.787e-02, -3.497e-01, -1.297e-01, -2.496e-01, -2.261e-01, 3.500e-02, 3.051e-01, 2.755e-01, -1.225e-02)); + r += mul(s3_5, M4(9.279e-02, 1.468e-01, 6.113e-01, -1.173e-01, -9.417e-02, 9.222e-02, -5.217e-02, 8.464e-02, 6.096e-02, 9.554e-02, 1.285e-01, -1.953e-01, 6.569e-02, -2.118e-01, -3.568e-02, -1.352e-01)); + r += mul(s3_6, M4(-1.768e-01, 8.608e-02, 1.309e-01, -1.416e-01, 8.261e-03, -1.316e-01, 7.054e-02, 4.611e-03, 3.212e-02, 2.430e-02, 9.214e-02, 6.280e-03, -2.185e-02, -3.935e-02, 5.571e-02, 4.193e-02)); + r += mul(s3_7, M4(8.105e-02, -1.591e-01, 3.039e-01, -9.778e-02, 3.951e-02, -3.152e-01, -1.966e-01, -2.455e-01, -3.366e-02, -7.204e-02, -8.174e-03, -7.198e-02, -6.558e-03, 1.123e-01, -9.551e-02, 6.672e-03)); + r += mul(s3_8, M4(1.235e-01, 3.982e-02, 3.039e-01, 1.235e-01, 2.316e-02, -8.746e-02, 2.213e-02, 1.028e-01, -1.428e-01, 2.836e-02, -3.352e-02, 4.037e-03, 6.577e-02, 1.374e-01, 1.652e-02, -1.878e-02)); + r += mul(s4_0, M4(1.246e-01, 1.239e-01, -9.360e-03, 2.423e-01, -1.773e-01, 2.159e-01, -2.099e-01, 2.785e-02, -1.292e-01, -3.997e-02, -3.523e-02, 6.947e-02, -1.759e-02, 4.929e-02, 7.086e-02, -2.629e-02)); + r += mul(s4_1, M4(5.799e-02, -3.160e-02, -4.384e-02, -6.587e-03, 2.184e-01, -2.625e-02, -2.947e-02, -8.658e-03, -9.866e-03, -1.366e-01, -4.666e-02, -1.631e-02, -2.408e-01, -2.021e-02, 2.256e-02, -1.333e-01)); + r += mul(s4_2, M4(-3.149e-02, -8.892e-03, 5.679e-02, 1.374e-02, -1.574e-01, 9.301e-02, -9.448e-02, -2.024e-01, 4.531e-02, 1.678e-01, -1.825e-01, -1.331e-02, 9.388e-03, -1.343e-01, -4.238e-02, 3.823e-02)); + r += mul(s4_3, M4(-3.200e-02, 1.715e-01, 4.701e-02, -1.146e-02, -3.603e-02, -5.154e-02, 4.062e-02, -8.847e-02, 6.117e-02, 1.044e-01, -6.379e-02, -1.141e-01, 1.272e-01, 1.586e-02, -7.757e-02, -1.664e-01)); + r += mul(s4_4, M4(-5.916e-02, -9.493e-02, -2.504e-01, -8.049e-03, 1.603e-01, -1.276e-01, -6.224e-03, -1.402e-01, 1.848e-01, -9.695e-02, 1.695e-01, 1.547e-01, 2.973e-01, 2.754e-02, 1.808e-01, 1.692e-03)); + r += mul(s4_5, M4(-3.831e-02, 7.519e-02, 1.461e-01, 1.416e-01, 1.063e-02, -1.076e-01, -1.000e-01, -4.520e-02, -9.602e-02, 1.353e-01, -3.368e-01, 3.250e-02, -1.229e-01, -5.047e-02, -1.801e-01, 1.681e-02)); + r += mul(s4_6, M4(-5.671e-02, -2.402e-01, 8.270e-03, 1.744e-02, -1.152e-01, 8.024e-02, 2.130e-01, 5.225e-02, 6.645e-02, 3.031e-02, 8.195e-02, -1.439e-01, 2.048e-01, -1.359e-01, 1.120e-01, -3.217e-02)); + r += mul(s4_7, M4(-1.605e-01, 6.211e-02, 9.125e-02, 8.926e-02, 8.750e-02, -1.852e-01, -2.375e-01, 1.248e-01, 3.083e-02, 4.785e-02, 1.139e-03, -5.040e-03, 3.171e-02, 2.389e-01, 6.904e-02, 2.381e-02)); + r += mul(s4_8, M4(-7.120e-02, -1.292e-01, -1.611e-01, -9.858e-02, -2.775e-02, 2.880e-02, 2.723e-02, -4.047e-02, -3.972e-02, -2.975e-02, -2.026e-01, 7.687e-02, -8.534e-02, 1.556e-01, 3.034e-01, -5.549e-02)); + r += mul(s5_0, M4(-9.213e-02, -5.440e-02, -4.894e-02, 3.393e-02, 1.027e-01, 2.624e-02, -4.883e-02, -6.931e-03, -1.735e-01, 2.098e-02, 5.265e-02, 6.680e-03, -8.395e-02, -4.679e-02, 6.241e-02, 4.699e-02)); + r += mul(s5_1, M4(-1.782e-01, 7.983e-03, -3.259e-02, -1.868e-01, 1.215e-01, -1.321e-01, 5.041e-02, -4.801e-02, 1.265e-01, -1.372e-01, -3.296e-02, 1.442e-01, 3.257e-02, 1.222e-01, -1.512e-02, -1.479e-01)); + r += mul(s5_2, M4(-2.983e-02, 3.076e-02, 8.010e-02, 2.028e-01, -3.401e-02, -9.389e-02, 1.362e-01, -1.877e-01, 1.574e-01, 9.401e-02, 4.403e-02, 8.403e-02, 4.736e-02, -9.071e-02, -2.370e-02, -2.582e-02)); + r += mul(s5_3, M4(2.278e-01, 1.284e-01, 4.590e-02, 1.622e-02, 1.337e-01, 7.761e-02, 1.359e-02, -2.618e-02, 4.119e-02, -2.623e-02, 2.930e-02, -2.091e-01, -1.855e-01, 6.665e-02, 8.423e-02, 8.824e-03)); + r += mul(s5_4, M4(-9.664e-02, 4.501e-02, 2.264e-02, -1.253e-01, 1.688e-01, 1.336e-01, 3.444e-01, 1.840e-01, -3.033e-02, -3.596e-01, 4.561e-02, 2.575e-02, 9.805e-02, 1.956e-01, -1.676e-01, 2.728e-01)); + r += mul(s5_5, M4(-1.832e-02, -8.205e-02, 1.263e-01, -1.139e-02, -6.246e-02, -1.061e-01, -4.148e-02, 5.692e-02, -1.353e-01, 1.976e-01, -1.707e-01, -1.122e-01, -1.321e-02, -1.263e-01, -1.884e-01, -1.639e-01)); + r += mul(s5_6, M4(-4.451e-02, -4.525e-02, -4.485e-02, 8.385e-02, -6.119e-03, 1.204e-01, 9.351e-02, 5.574e-02, 9.341e-02, 9.519e-02, -8.570e-02, 5.382e-02, -1.132e-01, -1.837e-01, 2.056e-02, 9.329e-02)); + r += mul(s5_7, M4(1.321e-01, 9.413e-02, -1.748e-02, 2.099e-01, 3.750e-02, -7.634e-02, -2.838e-02, 1.046e-01, -2.752e-01, 5.688e-02, 2.894e-01, 6.021e-02, -2.231e-01, -7.531e-01, -3.799e-01, -2.388e-01)); + r += mul(s5_8, M4(3.437e-02, 1.477e-01, 8.038e-02, -1.803e-02, -8.878e-02, -5.580e-03, 1.168e-01, -4.627e-02, -7.544e-03, -8.881e-02, -7.309e-03, 1.347e-02, 1.249e-01, -1.073e-01, 1.571e-01, 2.393e-01)); + r += mul(s6_0, M4(1.056e-01, -1.655e-01, 6.628e-02, -6.710e-02, 6.007e-02, -1.825e-01, -9.008e-02, 4.077e-02, -4.660e-02, 8.993e-02, -7.418e-02, 5.962e-02, 9.706e-02, 1.196e-01, 3.072e-02, -1.198e-01)); + r += mul(s6_1, M4(-2.106e-01, -1.708e-01, -1.243e-01, 2.257e-01, -8.822e-02, -1.948e-01, -4.944e-02, 1.032e-01, 8.067e-02, -2.809e-02, 1.437e-02, -8.750e-02, 2.549e-01, 4.931e-02, -8.305e-02, 6.867e-02)); + r += mul(s6_2, M4(-5.325e-02, -1.668e-01, 1.553e-01, -5.354e-02, 7.197e-02, -1.310e-01, 7.045e-02, 6.476e-02, 9.089e-02, 5.229e-02, 1.479e-01, 8.049e-02, 9.977e-03, 1.119e-01, 2.414e-01, 7.301e-02)); + r += mul(s6_3, M4(-4.870e-01, 1.024e-01, 1.018e-01, 5.722e-01, -1.674e-01, 4.754e-02, 1.592e-02, 9.791e-02, 1.142e-01, 1.606e-01, 1.078e-01, -7.011e-02, -3.353e-02, -6.611e-02, -1.191e-01, 2.364e-01)); + r += mul(s6_4, M4(-1.742e-01, 3.119e-01, 2.820e-01, 7.737e-01, 1.333e-01, -2.364e-01, 2.087e-02, -1.183e-01, 7.062e-02, -4.126e-02, 1.620e-01, 1.013e-01, -6.792e-02, 1.401e-01, -2.499e-02, 7.562e-02)); + r += mul(s6_5, M4(1.543e-01, 1.291e-01, 9.007e-02, -2.081e-01, -6.102e-02, -2.928e-02, -2.347e-02, -2.141e-01, -1.020e-02, 3.410e-02, -6.463e-02, -3.068e-02, -2.030e-01, -3.017e-01, 6.632e-02, 1.002e-01)); + r += mul(s6_6, M4(-2.041e-01, -1.945e-02, 4.302e-01, -1.541e-01, 1.051e-01, -2.894e-01, -5.986e-02, 1.052e-01, -5.165e-02, -3.485e-02, 1.858e-02, -1.355e-02, -5.686e-02, 1.246e-01, -4.571e-03, -4.745e-02)); + r += mul(s6_7, M4(-3.618e-02, 1.593e-01, 3.889e-01, 6.082e-02, 9.454e-03, -7.776e-02, 3.672e-02, 1.174e-01, -6.291e-02, 2.715e-02, 6.512e-03, -1.539e-02, -4.770e-02, -2.034e-02, -3.059e-02, -1.692e-01)); + r += mul(s6_8, M4(6.489e-02, -1.127e-01, -6.162e-03, 6.240e-02, 4.506e-02, -1.909e-01, -7.385e-03, 6.463e-02, -4.856e-02, -1.004e-01, -1.271e-02, -1.031e-01, 1.637e-01, 1.260e-01, 9.375e-02, 8.475e-02)); + r += mul(s7_0, M4(-1.056e-01, -6.793e-02, -2.290e-02, -5.765e-02, -3.109e-03, 8.130e-02, 9.209e-02, -5.064e-02, 6.955e-03, 1.225e-01, -1.973e-01, -2.322e-02, 1.099e-01, -4.783e-02, 4.413e-02, -1.477e-01)); + r += mul(s7_1, M4(7.251e-02, -9.158e-02, 1.464e-01, 3.379e-02, 1.043e-01, 8.307e-02, 7.843e-02, 1.139e-01, 3.996e-01, 1.389e-01, -3.900e-02, 2.640e-01, 2.734e-01, 1.025e-01, -6.518e-03, 1.987e-02)); + r += mul(s7_2, M4(-1.926e-02, -1.240e-01, -7.366e-02, -1.574e-02, 6.097e-02, 8.307e-02, 1.858e-01, 1.307e-01, 1.268e-01, 4.671e-03, -7.674e-03, -4.922e-02, -2.716e-02, 4.860e-02, 6.937e-02, -2.109e-02)); + r += mul(s7_3, M4(-3.253e-02, -4.109e-02, 1.668e-01, -3.072e-02, -1.440e-01, 1.336e-01, 6.707e-03, -4.122e-02, 1.029e-01, 1.450e-01, 7.241e-02, -5.743e-02, -8.728e-02, 3.656e-02, -2.325e-02, 3.032e-03)); + r += mul(s7_4, M4(6.291e-02, 7.310e-02, 6.814e-02, 5.994e-02, -5.259e-02, -6.363e-02, -1.033e-01, -1.411e-01, 3.942e-02, 2.257e-01, 2.250e-01, 3.676e-02, -2.449e-01, -1.138e-01, -8.450e-03, -7.929e-02)); + r += mul(s7_5, M4(-5.406e-02, -5.043e-02, -7.410e-03, 2.141e-02, 3.475e-02, -8.651e-03, -3.283e-02, -4.722e-02, -2.018e-01, 1.197e-02, -9.335e-02, -4.392e-02, -6.526e-02, -2.383e-01, -6.525e-02, 3.451e-01)); + r += mul(s7_6, M4(9.223e-03, 3.934e-02, -1.763e-01, -2.859e-02, -3.031e-02, 7.242e-02, 4.034e-02, -1.797e-01, -2.029e-01, -1.904e-01, -5.353e-02, 1.297e-02, 4.330e-02, 1.548e-01, -8.438e-03, -3.724e-02)); + r += mul(s7_7, M4(9.916e-02, 7.321e-02, 1.276e-01, 1.453e-01, -8.301e-02, 1.738e-01, 2.930e-01, -3.099e-01, 2.716e-02, -8.043e-02, 5.851e-02, -5.140e-02, 1.389e-01, 2.330e-01, -1.324e-01, 7.324e-02)); + r += mul(s7_8, M4(-1.500e-01, 3.048e-02, -3.140e-02, -4.852e-02, -3.718e-02, 2.308e-02, -7.317e-03, -9.998e-02, 4.094e-02, -2.750e-01, -1.856e-01, -2.096e-02, 7.663e-02, 2.274e-01, 1.548e-01, 6.048e-02)); + r += V4(-1.495e-02, -2.023e-02, 2.264e-02, -1.147e-02); + return r; +} + +V4 f2(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(4.953e-02, -1.043e-02, -1.914e-02, -1.432e-01, -5.304e-03, 8.359e-02, -1.140e-01, -7.852e-02, -4.640e-02, -2.001e-01, 1.919e-01, 1.548e-01, 8.743e-02, 9.778e-02, 1.424e-02, -2.270e-01)); + r += mul(s0_1, M4(2.060e-02, 1.248e-01, -4.010e-02, 1.965e-01, -2.438e-02, -4.201e-02, 7.033e-03, 4.888e-02, -6.871e-02, 6.190e-02, 7.333e-02, -3.403e-01, -5.559e-02, 1.867e-01, -1.300e-01, 2.189e-01)); + r += mul(s0_2, M4(-3.874e-02, 1.285e-01, 3.391e-02, -1.204e-01, 4.428e-02, -1.871e-01, -1.593e-02, 6.042e-03, 3.254e-02, -1.973e-02, 1.518e-01, -1.300e-01, 1.446e-02, -2.044e-01, 2.918e-02, 2.606e-01)); + r += mul(s0_3, M4(4.960e-02, -6.399e-02, -9.520e-02, -1.839e-01, 2.173e-01, -2.356e-02, -1.127e-01, 8.063e-02, -1.667e-01, 9.172e-02, -4.671e-02, 1.245e-01, 6.115e-02, -9.430e-02, -2.204e-01, -4.703e-02)); + r += mul(s0_4, M4(-1.679e-01, 1.597e-01, -2.778e-01, 1.738e-01, -1.146e-01, -1.453e-01, -1.057e-01, 1.756e-01, 1.647e-01, 1.490e-01, 9.088e-02, -4.520e-01, 9.319e-03, 1.503e-02, -3.174e-01, -1.853e-01)); + r += mul(s0_5, M4(-5.286e-02, -3.716e-03, -2.907e-02, -2.483e-01, 6.450e-02, -3.113e-02, -9.256e-03, -7.021e-02, 1.031e-01, -8.872e-02, 9.891e-02, -1.813e-01, 1.220e-01, 9.982e-03, 1.022e-01, 6.488e-01)); + r += mul(s0_6, M4(-8.355e-02, -1.048e-01, -2.398e-01, 1.720e-01, -1.541e-01, 4.061e-02, -1.442e-01, 9.865e-03, -4.325e-01, -1.424e-01, -2.084e-01, 3.330e-01, 2.950e-02, 1.551e-01, 2.286e-01, -1.593e-01)); + r += mul(s0_7, M4(1.490e-01, -3.721e-02, 6.991e-02, -2.120e-02, 1.801e-01, 8.975e-02, 1.922e-01, -8.228e-02, 8.051e-02, -2.346e-01, 1.200e-01, -1.173e-01, -2.726e-01, -1.120e-01, -1.173e-01, 2.100e-01)); + r += mul(s0_8, M4(2.178e-02, 8.923e-02, -4.526e-02, -4.848e-02, 1.993e-01, -1.361e-02, 1.385e-02, 2.657e-01, 1.233e-01, -2.770e-01, 2.021e-01, -8.325e-02, -7.663e-02, 8.893e-02, 8.350e-02, 2.419e-01)); + r += mul(s1_0, M4(1.109e-01, 6.740e-02, -1.106e-01, -1.285e-01, -5.509e-02, 2.375e-03, -1.023e-01, -3.401e-02, 2.224e-02, 2.057e-01, -4.947e-02, 6.982e-02, -2.823e-02, 1.032e-01, -1.465e-01, -1.322e-01)); + r += mul(s1_1, M4(-2.185e-01, 2.893e-01, 2.807e-02, -3.932e-02, -8.755e-02, 1.413e-01, -5.673e-02, -1.102e-02, 1.019e-01, 1.588e-01, 8.734e-03, -1.707e-01, -9.751e-02, -7.912e-02, 1.111e-01, -5.010e-02)); + r += mul(s1_2, M4(1.031e-02, -2.234e-02, -5.363e-02, 5.568e-02, -4.657e-02, -1.581e-01, 3.861e-02, 1.389e-02, 7.192e-02, 6.914e-02, 2.167e-02, 9.141e-02, 1.584e-01, -4.665e-02, 1.057e-01, -1.803e-01)); + r += mul(s1_3, M4(-2.364e-02, 8.902e-02, 3.271e-02, -9.566e-02, 1.637e-01, -9.631e-02, -1.292e-01, -7.108e-02, -5.199e-02, -1.548e-01, 6.055e-02, 1.562e-01, -2.478e-01, 1.768e-02, 2.132e-01, 7.910e-02)); + r += mul(s1_4, M4(-2.331e-02, 2.652e-02, 2.280e-01, -7.540e-02, -1.734e-02, -1.351e-01, 9.421e-02, -1.589e-01, 3.353e-02, 3.798e-02, -1.973e-01, -1.582e-01, 9.918e-02, -1.993e-01, -1.849e-01, -5.645e-02)); + r += mul(s1_5, M4(-8.244e-02, -3.014e-03, -2.259e-02, -6.663e-02, -7.560e-02, -1.792e-01, 7.072e-02, 1.509e-01, 1.072e-01, 3.003e-02, -5.873e-02, 6.435e-02, -5.586e-02, 1.371e-01, -1.778e-01, 1.172e-01)); + r += mul(s1_6, M4(1.430e-01, 3.925e-02, -4.229e-02, 7.416e-02, -1.553e-01, -6.153e-02, -5.697e-02, 3.974e-03, 1.487e-02, 1.702e-01, -1.097e-01, 1.459e-01, -1.018e-01, -9.522e-02, 1.186e-01, -9.903e-03)); + r += mul(s1_7, M4(3.177e-01, -2.166e-01, 2.651e-02, -5.773e-02, -2.696e-02, -9.562e-02, 4.629e-02, 5.782e-04, -4.577e-02, 1.483e-01, -1.887e-01, 9.765e-03, -4.184e-01, -7.145e-02, -2.911e-01, 6.700e-02)); + r += mul(s1_8, M4(1.877e-01, -7.176e-02, 7.557e-02, 3.244e-02, -4.746e-03, -2.181e-02, 2.802e-02, 2.184e-01, 9.669e-03, 2.156e-02, 2.035e-02, -1.332e-01, -2.256e-02, 2.689e-02, -2.441e-02, -2.549e-01)); + r += mul(s2_0, M4(5.106e-02, 1.100e-01, -7.814e-02, 2.028e-02, -1.567e-01, 1.860e-01, 3.232e-01, 9.718e-02, 5.487e-02, 1.834e-01, -9.297e-02, 8.886e-02, -1.441e-01, -2.210e-01, -5.134e-02, 6.252e-02)); + r += mul(s2_1, M4(-4.781e-02, -2.123e-01, 4.822e-02, 3.936e-02, 1.046e-02, 4.684e-01, 2.696e-01, -1.558e-01, 1.541e-02, -1.177e-01, -5.005e-02, -1.295e-01, 1.704e-01, -2.501e-01, 6.061e-02, 2.970e-01)); + r += mul(s2_2, M4(1.695e-02, -1.034e-01, -6.278e-02, -5.928e-02, -3.629e-02, 6.065e-02, -7.926e-03, 1.698e-01, 1.410e-01, 1.694e-01, -2.007e-01, -1.189e-01, 8.948e-02, -3.077e-01, -2.389e-01, 1.502e-01)); + r += mul(s2_3, M4(3.987e-02, -4.753e-02, 1.210e-01, 7.428e-02, 1.577e-01, 4.927e-01, -5.874e-02, 6.032e-02, 6.508e-02, 2.733e-01, 8.902e-02, -8.632e-02, 2.456e-01, -2.898e-02, -3.099e-01, -2.062e-01)); + r += mul(s2_4, M4(2.310e-01, -1.338e-01, -5.528e-02, -6.663e-02, 5.035e-03, 5.237e-01, -2.444e-01, 1.748e-03, 1.092e-02, 1.659e-01, -5.375e-01, -1.727e-01, 1.075e-01, -3.335e-02, 1.716e-01, 2.911e-02)); + r += mul(s2_5, M4(-3.422e-02, 1.164e-01, -7.015e-02, 2.228e-01, -2.588e-01, 1.001e-01, -2.292e-01, 3.307e-01, 1.157e-01, -1.517e-01, -1.974e-01, 1.010e-01, -1.465e-01, 1.708e-01, 6.236e-02, -9.108e-02)); + r += mul(s2_6, M4(-1.071e-01, 1.134e-02, -8.607e-03, -3.712e-02, 1.710e-01, 2.361e-01, -1.406e-01, 1.209e-01, 2.425e-02, -9.058e-02, -3.232e-01, 4.471e-02, -1.308e-01, -3.260e-02, 6.854e-02, -6.492e-02)); + r += mul(s2_7, M4(-4.509e-02, 7.984e-02, 1.088e-01, -1.713e-01, 8.724e-02, -2.148e-01, -2.251e-01, -5.391e-01, -1.393e-02, -2.744e-01, -3.601e-01, 1.169e-01, 1.460e-01, 1.543e-01, 1.556e-01, -1.452e-01)); + r += mul(s2_8, M4(-3.656e-02, 1.428e-01, -1.008e-01, -8.022e-02, -1.002e-01, -1.470e-01, -6.616e-02, 1.897e-02, 1.665e-01, -1.197e-02, -1.142e-01, -5.160e-02, 6.965e-02, -5.536e-02, 2.038e-01, 4.050e-03)); + r += mul(s3_0, M4(-3.699e-02, -2.169e-01, -1.551e-01, -8.639e-02, -1.323e-01, -3.194e-01, 4.831e-02, -4.322e-02, -5.369e-02, -2.300e-01, 7.718e-02, 1.629e-01, -4.036e-02, -9.572e-03, -3.976e-02, 5.321e-02)); + r += mul(s3_1, M4(-2.518e-02, -1.041e-01, 7.633e-02, 1.902e-01, 1.493e-02, -1.167e-01, 1.430e-01, -6.275e-02, -5.291e-02, -1.949e-01, -1.360e-03, 2.395e-03, 5.281e-02, 3.305e-01, -9.706e-02, 1.571e-01)); + r += mul(s3_2, M4(-1.239e-01, 1.558e-02, -8.931e-02, 1.519e-01, -6.491e-02, -8.699e-02, 1.022e-04, 1.037e-02, 7.850e-04, -6.647e-02, -3.083e-03, 9.909e-02, 3.606e-02, -6.656e-02, -4.089e-02, -6.208e-02)); + r += mul(s3_3, M4(-2.321e-02, -1.324e-01, -2.979e-01, -2.022e-01, -1.156e-01, -2.492e-01, 2.480e-02, 1.023e-01, 1.111e-01, 1.108e-02, 4.745e-02, 2.682e-01, 1.655e-01, 1.510e-01, 2.804e-02, -6.706e-02)); + r += mul(s3_4, M4(7.570e-02, 1.188e-01, 1.951e-01, -1.867e-01, 5.990e-02, 3.134e-02, -1.611e-01, -2.741e-01, 9.583e-02, -5.437e-02, -1.426e-02, -1.455e-01, -2.097e-02, 2.090e-01, -3.508e-02, 1.004e-01)); + r += mul(s3_5, M4(-1.678e-01, -1.709e-01, 1.389e-01, 5.599e-01, 5.316e-02, -5.649e-02, -5.180e-02, 1.958e-01, -1.194e-01, 4.412e-02, -1.158e-02, 9.583e-02, 2.081e-01, -1.927e-02, 1.263e-01, 6.535e-02)); + r += mul(s3_6, M4(-1.998e-01, 7.452e-04, -1.024e-01, -1.500e-01, -1.898e-01, -1.200e-01, 2.673e-01, 1.930e-01, 6.552e-02, 4.753e-02, -5.766e-02, 1.452e-02, -2.033e-02, -1.847e-02, 4.007e-02, -4.012e-02)); + r += mul(s3_7, M4(-3.738e-02, 9.887e-03, 2.957e-01, -2.111e-01, 1.195e-01, 1.952e-02, -1.179e-01, -2.235e-01, -7.834e-02, -5.193e-02, -2.680e-02, 2.864e-02, -2.601e-02, 6.703e-02, -6.174e-02, 3.249e-02)); + r += mul(s3_8, M4(-1.530e-01, -8.802e-02, 1.475e-01, 2.635e-01, -9.074e-02, 9.380e-02, 4.124e-02, -7.946e-02, -1.148e-01, 1.286e-02, 4.742e-02, 2.332e-02, -1.977e-03, -5.675e-02, 1.096e-01, 1.150e-02)); + r += mul(s4_0, M4(-2.261e-01, -2.561e-01, 1.126e-02, 2.395e-01, 1.953e-02, -4.803e-02, -2.832e-01, 2.786e-01, 4.088e-02, 1.210e-01, -1.743e-01, -8.318e-02, -2.497e-02, 9.149e-02, -1.279e-01, -1.996e-01)); + r += mul(s4_1, M4(9.359e-02, -2.179e-01, -1.029e-01, -2.677e-01, 5.302e-03, 3.054e-01, 9.251e-02, -1.286e-01, 1.787e-04, 2.154e-02, -9.384e-02, 4.740e-02, 9.689e-02, 1.660e-02, -1.787e-01, 1.200e-01)); + r += mul(s4_2, M4(-1.114e-01, -3.321e-03, -4.210e-02, 4.867e-02, -1.530e-02, 1.223e-01, -1.452e-02, 1.470e-02, 2.443e-01, 1.265e-01, -2.683e-02, 8.435e-02, -2.650e-02, 1.006e-01, -1.267e-01, -1.657e-02)); + r += mul(s4_3, M4(2.259e-01, -2.401e-02, -7.352e-02, 4.411e-02, -1.591e-01, -4.921e-02, -8.919e-02, 1.951e-01, -3.401e-02, 2.066e-01, -4.425e-02, 1.086e-02, -2.287e-01, 1.715e-01, 1.947e-02, 3.394e-01)); + r += mul(s4_4, M4(-1.943e-01, 6.106e-02, -2.059e-01, 1.530e-01, -4.310e-01, -5.169e-02, 5.227e-03, -5.809e-02, -8.751e-03, 1.375e-01, 9.137e-02, -5.076e-02, -2.291e-01, 3.071e-01, 8.408e-02, -3.188e-01)); + r += mul(s4_5, M4(1.396e-01, 1.749e-03, -1.139e-01, 4.759e-03, 1.080e-01, -1.796e-01, 1.342e-01, 1.888e-02, 2.666e-01, 3.913e-02, -2.299e-01, -1.284e-01, 5.995e-02, -1.558e-03, 8.185e-02, -7.686e-02)); + r += mul(s4_6, M4(-1.669e-01, -6.859e-02, -7.372e-02, -9.100e-02, -3.056e-02, 5.829e-02, 1.240e-01, 1.077e-01, -5.259e-02, -6.470e-02, -1.078e-01, -4.296e-03, -8.721e-02, 4.027e-02, -5.710e-02, 8.209e-02)); + r += mul(s4_7, M4(-1.577e-01, 6.222e-03, -2.773e-01, 3.279e-02, 1.536e-01, -1.257e-01, -4.675e-02, -1.285e-01, -7.705e-02, -1.055e-01, 2.227e-02, -1.549e-01, 4.493e-01, -2.209e-01, 2.735e-01, 1.233e-01)); + r += mul(s4_8, M4(-4.798e-01, 1.189e-01, -2.058e-01, -1.575e-01, 8.871e-02, 8.258e-02, -4.181e-03, -5.046e-02, 2.217e-01, 5.726e-02, -1.620e-01, 1.539e-01, -1.201e-01, -1.012e-01, 5.392e-03, 3.764e-02)); + r += mul(s5_0, M4(1.165e-01, 1.608e-01, -7.487e-02, -1.509e-01, 9.449e-02, 3.221e-01, -3.382e-02, -1.816e-03, -3.550e-02, 1.265e-01, -6.539e-02, -1.075e-01, 3.394e-02, 2.355e-01, 3.894e-02, -8.796e-02)); + r += mul(s5_1, M4(-2.447e-02, 8.070e-02, 1.423e-01, 1.402e-01, 2.515e-02, 4.841e-01, 4.955e-02, -2.066e-01, -9.107e-02, -2.201e-02, 4.951e-02, -3.315e-03, 1.130e-01, -1.267e-01, -7.044e-02, 5.966e-02)); + r += mul(s5_2, M4(-1.221e-01, -7.627e-02, -9.912e-02, 3.213e-02, -1.224e-02, 1.525e-02, 5.261e-02, 7.614e-05, 1.389e-01, -2.451e-02, 2.648e-02, 1.036e-01, 1.281e-02, -5.334e-02, -3.525e-02, 4.862e-02)); + r += mul(s5_3, M4(-4.838e-02, -1.165e-01, 4.634e-02, 5.762e-02, -1.966e-01, 4.590e-03, -1.469e-01, 1.240e-02, -8.315e-02, 1.313e-01, 7.028e-03, -3.308e-01, 8.331e-02, -8.449e-02, -2.792e-01, -1.632e-01)); + r += mul(s5_4, M4(2.086e-01, -7.599e-02, 6.890e-02, -1.638e-01, 6.631e-02, -3.018e-01, 3.685e-01, 1.289e-01, -3.224e-02, 2.471e-01, 1.554e-01, -9.048e-02, 6.640e-02, -1.579e-01, 4.120e-02, 3.324e-01)); + r += mul(s5_5, M4(-8.094e-02, 7.154e-02, -2.721e-01, 3.947e-02, 1.108e-01, -9.913e-02, 7.985e-02, 7.660e-02, 1.077e-01, -7.017e-03, -8.944e-02, 6.666e-02, 1.555e-01, -3.792e-02, 2.088e-01, 1.484e-01)); + r += mul(s5_6, M4(1.184e-01, 8.033e-02, -1.298e-02, 1.090e-01, 7.464e-03, 5.399e-02, 6.435e-02, 9.456e-02, 1.882e-02, 7.983e-02, 6.878e-02, -3.361e-02, -1.222e-01, -1.425e-02, 2.428e-02, 7.745e-03)); + r += mul(s5_7, M4(1.102e-01, -1.544e-02, 1.597e-01, -4.132e-02, 1.377e-01, -2.824e-02, -8.234e-02, -2.761e-05, 8.093e-02, -2.793e-01, 1.530e-01, 8.385e-02, -7.603e-02, -2.025e-01, 2.766e-01, -1.428e-01)); + r += mul(s5_8, M4(3.781e-03, -1.045e-01, 1.448e-01, 5.691e-02, -5.157e-02, 5.607e-02, -5.108e-02, -3.895e-02, 1.424e-01, -6.146e-02, -9.942e-02, 1.364e-01, -1.161e-02, 7.988e-02, -1.966e-02, 1.264e-01)); + r += mul(s6_0, M4(5.254e-02, 4.286e-02, 2.203e-01, 2.235e-01, 1.933e-02, -1.109e-01, 8.487e-02, -9.477e-02, -5.130e-02, -4.777e-02, -2.017e-02, 3.128e-02, -6.470e-02, 1.543e-01, 8.668e-02, 1.235e-02)); + r += mul(s6_1, M4(1.808e-01, 7.979e-02, 1.731e-01, 1.029e-01, 2.928e-02, -2.398e-01, 2.685e-01, -5.568e-03, 1.759e-01, -9.958e-02, -1.266e-01, 9.668e-02, -9.320e-02, -1.677e-01, 2.248e-01, -9.537e-02)); + r += mul(s6_2, M4(-1.645e-02, -4.210e-02, 2.464e-01, 2.570e-01, -6.245e-02, -1.263e-01, 7.909e-03, 1.125e-01, 1.147e-02, -8.072e-03, 9.007e-03, -7.610e-02, 7.843e-02, -2.010e-01, -1.495e-02, -3.870e-02)); + r += mul(s6_3, M4(-3.565e-02, 5.785e-01, -9.211e-01, 5.079e-01, 5.528e-02, 6.960e-02, 2.126e-01, -4.858e-02, 4.311e-04, -7.106e-02, -9.924e-02, 3.560e-02, -4.707e-02, -9.750e-02, 1.573e-01, 2.595e-01)); + r += mul(s6_4, M4(9.734e-02, 1.154e+00, -2.324e-01, -1.876e-01, 1.616e-01, -4.130e-02, 5.493e-02, -1.671e-01, -2.353e-01, 1.169e-03, 1.057e-01, -2.784e-02, 3.860e-01, 1.029e-01, -4.524e-01, -1.442e-01)); + r += mul(s6_5, M4(3.244e-01, -6.583e-02, -5.003e-02, -6.686e-01, -5.430e-02, -8.618e-02, 8.184e-02, -5.639e-02, 4.921e-02, -4.133e-02, 1.289e-01, -1.323e-01, -6.690e-02, 1.474e-01, -6.345e-02, 5.825e-02)); + r += mul(s6_6, M4(-1.715e-01, -3.189e-01, -2.790e-01, -2.477e-01, 1.002e-01, -5.547e-02, 2.995e-02, -1.182e-01, 6.040e-02, 8.125e-02, -1.164e-01, -4.264e-02, 2.022e-02, 1.063e-01, 3.899e-02, 1.597e-01)); + r += mul(s6_7, M4(-1.266e-01, -9.623e-02, 1.275e-01, -3.748e-02, 1.626e-01, -6.270e-02, 9.291e-02, 5.724e-03, 4.365e-02, 7.480e-02, 5.771e-02, 5.527e-02, -3.332e-01, 3.902e-02, -1.400e-01, 3.447e-06)); + r += mul(s6_8, M4(3.818e-01, 1.863e-01, -2.614e-02, -3.133e-02, 1.381e-01, -6.371e-02, 6.787e-02, 6.309e-02, -1.131e-01, -4.142e-02, -7.571e-02, 8.214e-02, -1.547e-01, -1.238e-01, 1.511e-02, 1.554e-01)); + r += mul(s7_0, M4(-5.391e-02, 1.323e-01, 4.757e-02, 4.474e-02, 5.920e-02, -4.543e-02, 3.262e-02, 2.424e-01, -2.397e-02, -1.617e-01, -1.591e-01, 2.583e-02, 5.164e-02, -8.457e-03, 2.784e-02, -4.374e-02)); + r += mul(s7_1, M4(8.171e-02, -4.498e-02, 1.671e-01, -2.266e-03, -1.252e-01, 1.708e-01, -2.352e-01, 3.477e-02, 8.995e-02, -3.851e-01, -1.649e-01, -4.319e-02, 8.272e-02, -9.280e-02, -1.689e-01, 4.940e-02)); + r += mul(s7_2, M4(-3.313e-02, 6.006e-02, -9.039e-03, 9.748e-02, -4.762e-02, -5.250e-03, -1.652e-01, 1.174e-01, 4.957e-02, -2.381e-01, 4.842e-02, -3.336e-02, 2.251e-01, -2.005e-02, -1.765e-01, -8.915e-02)); + r += mul(s7_3, M4(-1.958e-01, 1.081e-01, -8.218e-02, -5.008e-02, 2.882e-01, 2.378e-01, -6.291e-02, 1.016e-01, -2.227e-01, -1.629e-01, 7.849e-02, 6.485e-02, 5.065e-02, 9.825e-02, 4.433e-02, -6.809e-02)); + r += mul(s7_4, M4(-7.990e-02, 6.251e-02, -7.690e-02, -2.683e-02, -7.804e-02, 2.686e-02, 9.093e-02, 2.700e-02, -1.886e-02, 2.563e-01, 1.230e-01, -8.396e-02, 2.219e-01, -1.033e-01, 9.530e-03, 9.932e-02)); + r += mul(s7_5, M4(1.400e-02, -2.426e-02, 5.110e-02, 4.281e-02, -1.137e-01, -7.280e-02, 5.152e-02, -9.314e-03, 1.449e-01, 3.328e-02, 1.324e-01, -2.731e-01, -2.096e-01, 2.987e-02, 7.699e-03, 1.335e-01)); + r += mul(s7_6, M4(4.344e-02, -6.642e-02, -7.341e-02, -6.276e-02, -1.511e-01, 1.958e-01, -7.402e-02, -2.163e-02, 1.100e-01, 1.279e-01, -9.180e-02, -5.255e-02, 1.680e-01, 5.994e-02, -2.382e-02, 1.012e-02)); + r += mul(s7_7, M4(3.082e-02, -8.443e-02, 9.441e-02, 1.118e-02, -1.380e-01, 1.702e-02, 6.489e-02, 7.571e-02, -1.530e-01, 4.445e-02, 1.333e-01, -8.167e-03, 4.990e-01, 5.790e-02, 1.082e-01, 5.093e-02)); + r += mul(s7_8, M4(2.108e-01, 1.091e-01, -1.877e-02, -5.456e-02, -1.412e-01, 8.228e-02, -1.366e-01, 8.877e-02, -1.840e-01, -7.525e-02, -6.979e-02, 7.806e-02, -1.131e-01, -1.048e-01, 8.550e-02, 1.826e-01)); + r += V4(-4.391e-02, -3.059e-02, 2.082e-02, 1.403e-02); + return r; +} + +V4 f3(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-1.003e-01, -5.919e-02, 2.076e-01, 1.672e-02, 2.856e-02, -3.657e-01, -5.536e-02, 6.897e-02, -5.467e-02, -2.065e-01, -8.650e-02, 7.769e-02, 1.806e-01, -6.661e-02, 1.437e-01, -7.272e-02)); + r += mul(s0_1, M4(1.047e-01, -4.994e-03, 2.010e-02, -1.732e-01, 1.841e-02, -6.717e-02, -9.422e-02, 1.552e-01, -1.356e-01, 5.723e-03, 3.318e-01, 7.563e-02, -7.158e-02, -6.739e-02, -1.119e-01, -3.589e-02)); + r += mul(s0_2, M4(5.615e-02, -1.190e-01, 1.940e-02, 1.183e-01, 1.353e-01, -1.109e-01, -8.721e-02, -2.443e-01, -7.026e-02, 9.086e-03, 1.657e-01, 5.800e-02, 9.707e-02, 4.103e-02, 8.620e-02, -1.047e-01)); + r += mul(s0_3, M4(-1.864e-01, 5.525e-01, 5.940e-02, 1.066e-01, -6.391e-02, 2.615e-01, 1.369e-01, 1.755e-01, 5.718e-02, -3.624e-01, -2.133e-01, 2.429e-02, 1.918e-01, 2.540e-02, 1.998e-01, -1.374e-01)); + r += mul(s0_4, M4(-7.575e-02, -2.771e-01, 1.057e-01, 6.924e-02, 6.660e-02, -3.778e-02, -1.177e-01, -1.973e-01, 1.329e-01, -9.089e-02, 1.796e-01, 2.113e-01, 2.779e-01, 1.087e-01, 1.340e-01, 5.727e-02)); + r += mul(s0_5, M4(3.028e-01, -1.509e-01, 1.293e-02, 1.337e-01, -5.479e-02, -4.922e-03, 2.247e-01, 4.516e-02, -1.411e-01, -1.697e-01, 7.813e-02, 1.060e-02, -1.126e-01, 3.681e-01, 2.706e-01, -3.745e-01)); + r += mul(s0_6, M4(-1.866e-01, -1.746e-01, -6.487e-02, 6.742e-02, -1.552e-01, -5.886e-02, 1.360e-01, -1.544e-01, -1.652e-01, 1.706e-02, 2.617e-01, 1.328e-01, -3.640e-03, 9.480e-02, -1.287e-02, 3.921e-02)); + r += mul(s0_7, M4(1.243e-01, -9.323e-02, -2.042e-01, 1.297e-01, 9.513e-02, -1.313e-02, -1.341e-02, 1.389e-01, 6.648e-02, 1.188e-02, 4.082e-02, 3.604e-01, -2.582e-01, -5.481e-02, 9.386e-02, -2.171e-01)); + r += mul(s0_8, M4(-1.791e-01, 2.842e-02, 1.129e-01, -2.167e-02, 2.324e-01, 4.512e-02, 6.812e-02, -2.952e-02, -1.427e-01, -2.060e-01, 3.594e-02, 1.304e-01, -3.837e-01, 4.871e-02, 4.871e-01, -2.685e-01)); + r += mul(s1_0, M4(-7.620e-02, 8.123e-02, 3.190e-02, -1.187e-01, -9.578e-02, -1.791e-01, 2.089e-03, -1.004e-01, -3.081e-02, 7.196e-02, 2.389e-02, -5.165e-03, 5.603e-02, -8.371e-02, -7.499e-02, 2.005e-01)); + r += mul(s1_1, M4(1.862e-01, -2.538e-02, -2.103e-02, -5.109e-02, -4.727e-02, 4.574e-02, -6.642e-03, -2.504e-02, -6.596e-02, -7.968e-03, -7.350e-02, 1.135e-01, -1.027e-01, -1.208e-01, -3.533e-02, 2.085e-01)); + r += mul(s1_2, M4(-1.857e-02, -1.421e-01, -5.308e-02, 5.773e-03, -4.630e-02, -4.522e-02, 1.625e-02, -9.741e-02, 9.684e-02, -7.835e-02, 7.179e-02, 8.255e-02, -7.932e-02, 5.574e-02, 3.519e-02, 1.743e-01)); + r += mul(s1_3, M4(-8.234e-03, -3.040e-01, 1.035e-01, -3.756e-01, -1.978e-01, 1.257e-01, 4.788e-02, 1.895e-01, -1.629e-01, -8.749e-02, -2.094e-03, -3.859e-02, 1.008e-01, -1.914e-01, -1.519e-02, 9.775e-02)); + r += mul(s1_4, M4(-2.454e-01, 3.034e-01, -1.188e-02, -9.649e-03, 1.881e-01, -8.000e-02, -1.499e-01, -1.489e-01, 3.142e-01, -2.846e-01, -8.070e-02, -3.620e-02, 1.075e-01, 2.874e-01, -3.062e-01, 2.726e-01)); + r += mul(s1_5, M4(-3.710e-03, 2.431e-01, 1.270e-01, -1.509e-01, -4.571e-02, -4.919e-03, 3.846e-03, -5.178e-02, -1.865e-02, 1.187e-01, 4.861e-02, -1.342e-01, -1.103e-01, 1.058e-01, -2.100e-01, 2.385e-01)); + r += mul(s1_6, M4(-9.861e-02, 3.686e-01, 1.439e-02, -1.672e-01, -1.270e-01, -7.478e-02, 5.627e-02, -1.598e-01, 2.436e-01, 1.530e-03, -4.498e-02, -1.594e-01, 8.192e-02, 6.402e-02, -1.798e-02, -4.105e-02)); + r += mul(s1_7, M4(1.852e-01, -2.272e-01, 1.581e-03, 6.883e-02, 1.501e-01, -2.629e-01, -5.432e-02, 1.199e-01, 4.607e-02, 1.023e-01, -5.083e-02, -1.080e-01, 1.099e-02, -2.751e-01, -2.276e-02, -2.410e-02)); + r += mul(s1_8, M4(6.250e-02, -1.419e-01, -2.915e-03, 1.734e-01, 1.879e-01, -1.916e-02, -9.208e-02, 5.980e-02, 3.169e-02, 6.434e-04, 2.046e-02, -3.522e-03, 2.520e-01, -8.233e-02, -1.115e-01, 2.729e-01)); + r += mul(s2_0, M4(-4.664e-04, -4.989e-02, -1.104e-01, 1.057e-01, -1.360e-01, 2.355e-01, -4.501e-02, -1.698e-01, -2.486e-02, -9.401e-02, -1.214e-01, -1.000e-01, -4.274e-02, -1.672e-02, -2.114e-01, 2.534e-02)); + r += mul(s2_1, M4(4.812e-02, -9.418e-02, -1.018e-01, -8.638e-03, 3.706e-02, 7.197e-02, -2.987e-02, 3.142e-02, 1.394e-01, -3.675e-01, -7.134e-02, -5.112e-02, -4.693e-02, -2.533e-01, -3.831e-01, 3.512e-01)); + r += mul(s2_2, M4(9.591e-02, -1.676e-01, -9.105e-02, 2.459e-02, -1.919e-01, -1.080e-01, -4.686e-02, -2.874e-01, 1.909e-02, -2.085e-01, -2.761e-01, -2.017e-01, 3.358e-01, -4.021e-01, -3.048e-01, 3.027e-01)); + r += mul(s2_3, M4(-1.724e-01, -7.723e-02, 4.065e-02, 8.664e-02, 9.049e-02, 2.755e-01, -2.836e-01, -3.475e-01, 1.131e-01, -6.232e-03, 5.263e-02, -1.029e-01, -2.092e-01, 9.432e-04, -1.458e-01, 1.312e-01)); + r += mul(s2_4, M4(-2.089e-01, 2.550e-01, 2.688e-01, -1.896e-01, 2.094e-01, -1.791e-01, -8.042e-02, 8.799e-02, -2.168e-02, 2.295e-01, 2.426e-01, -1.890e-02, 5.267e-02, -3.035e-01, -1.247e-01, -4.930e-01)); + r += mul(s2_5, M4(2.220e-02, 1.895e-01, 5.114e-02, -1.285e-01, -3.346e-01, -2.613e-01, 1.481e-01, 1.299e-01, -6.024e-02, -3.446e-01, 5.558e-02, -3.976e-01, 5.876e-02, 2.849e-02, -1.475e-02, -1.995e-01)); + r += mul(s2_6, M4(5.093e-02, 1.313e-02, 1.755e-02, 6.282e-03, -1.416e-01, -1.481e-01, 4.453e-02, -2.304e-01, -2.065e-02, 4.309e-02, 1.393e-01, -6.992e-02, -1.607e-01, -3.332e-01, -4.975e-02, -2.214e-02)); + r += mul(s2_7, M4(2.077e-01, -1.100e-01, 3.094e-02, 3.014e-02, 2.021e-01, -8.420e-02, -7.505e-02, 4.633e-02, -1.732e-01, 1.133e-01, 3.275e-01, 1.928e-01, 1.625e-01, 3.875e-03, -1.657e-01, 1.779e-03)); + r += mul(s2_8, M4(3.694e-02, 5.474e-03, 5.581e-02, -3.022e-02, -1.588e-01, 1.027e-01, 2.136e-01, -2.300e-02, 7.629e-02, 3.632e-02, -4.073e-02, -4.021e-01, 9.291e-03, 2.195e-02, 4.774e-02, 5.479e-02)); + r += mul(s3_0, M4(-1.114e-02, -2.405e-01, -5.870e-02, 2.470e-01, -1.186e-01, 8.453e-03, 1.200e-01, 9.027e-02, -9.437e-03, 1.128e-01, -6.882e-02, -1.012e-01, 3.310e-02, 1.354e-03, -7.321e-02, -6.252e-02)); + r += mul(s3_1, M4(1.713e-01, -1.959e-01, -4.247e-03, -5.163e-02, 1.953e-01, -1.454e-01, -1.412e-01, 3.189e-01, 2.225e-02, -7.657e-02, -1.032e-01, 6.375e-02, 4.638e-02, -2.646e-02, -5.159e-02, -1.400e-01)); + r += mul(s3_2, M4(-9.414e-02, 1.055e-01, 8.043e-02, -1.504e-01, -6.142e-02, -1.294e-01, -1.302e-01, 1.671e-02, 1.782e-02, -5.430e-02, -1.272e-01, 5.470e-02, -9.129e-02, 5.558e-04, -7.446e-02, -1.080e-01)); + r += mul(s3_3, M4(-1.609e-01, 2.412e-01, 1.539e-02, 1.635e-01, 5.731e-02, 4.505e-02, -1.987e-01, 1.142e-01, 7.460e-02, 1.938e-01, -1.055e-01, -1.156e-01, 2.912e-02, -3.555e-02, 4.497e-03, 5.731e-02)); + r += mul(s3_4, M4(-2.135e-02, 1.500e-01, -4.374e-02, 2.777e-02, 1.931e-01, -1.217e-01, -4.481e-02, 2.285e-01, 1.289e-01, -1.594e-02, -9.186e-02, 2.677e-01, -1.608e-01, 6.458e-03, 1.041e-01, 2.212e-02)); + r += mul(s3_5, M4(-4.324e-01, 2.047e-01, 4.299e-02, -2.363e-01, -3.169e-02, 1.719e-03, -1.141e-03, 1.626e-01, -1.440e-01, -4.942e-02, 3.266e-02, 2.561e-02, -7.315e-03, 3.041e-01, 1.774e-01, -5.855e-02)); + r += mul(s3_6, M4(-2.103e-01, -1.573e-01, -1.381e-01, -3.838e-02, -1.851e-04, -8.056e-02, -4.797e-02, -9.107e-02, 5.331e-03, 3.598e-02, -5.975e-02, -1.012e-02, 4.188e-02, 3.601e-02, 6.932e-02, 2.420e-02)); + r += mul(s3_7, M4(1.788e-01, -1.795e-01, -2.201e-01, -1.477e-01, -9.825e-02, 1.962e-01, 8.007e-02, -9.079e-02, -2.744e-01, 7.188e-02, -1.559e-02, -5.103e-02, -7.550e-03, 2.157e-02, 1.767e-02, 6.859e-03)); + r += mul(s3_8, M4(-5.107e-02, -6.800e-02, -9.903e-02, 1.452e-01, 1.844e-02, 4.129e-03, 1.381e-02, 5.966e-02, -4.372e-02, 9.473e-02, -6.700e-02, 8.696e-02, -2.279e-01, 5.274e-02, 8.592e-02, -3.748e-02)); + r += mul(s4_0, M4(2.020e-01, -3.807e-01, -3.319e-01, 1.218e-01, -1.111e-01, 1.247e-01, -1.426e-02, 1.241e-01, 2.500e-01, -2.348e-01, 8.659e-02, 1.143e-01, 7.011e-02, 2.251e-01, 1.403e-01, 3.869e-02)); + r += mul(s4_1, M4(4.766e-01, -1.855e-01, -8.916e-02, -9.894e-02, 5.991e-01, -2.487e-02, 1.151e-01, 3.345e-01, -5.781e-02, 9.442e-02, 7.019e-03, -2.077e-02, 2.310e-03, 1.404e-01, 2.783e-01, -1.494e-01)); + r += mul(s4_2, M4(7.451e-02, -1.099e-01, 3.675e-02, 1.111e-02, 4.328e-02, 1.623e-01, 3.479e-02, 5.629e-03, -2.138e-01, 2.511e-01, -1.213e-01, 1.228e-01, -1.394e-03, 2.696e-01, -8.794e-02, -4.609e-02)); + r += mul(s4_3, M4(9.251e-03, -2.668e-01, -2.042e-01, -7.595e-02, -6.389e-02, 1.573e-02, -6.267e-02, 6.237e-04, 5.438e-02, 3.235e-01, -1.413e-01, -5.880e-02, 2.368e-01, -2.608e-02, -3.962e-01, 2.038e-01)); + r += mul(s4_4, M4(3.697e-01, -2.039e-01, 3.670e-02, 1.657e-01, -2.546e-01, -5.970e-02, 1.157e-01, -8.191e-02, 1.630e-01, -2.037e-01, -1.200e-01, 1.127e-01, 2.758e-02, 1.736e-01, 8.863e-02, -6.960e-03)); + r += mul(s4_5, M4(5.224e-02, -2.290e-01, -1.657e-01, 1.463e-01, 2.281e-01, -2.390e-01, -1.169e-01, 5.749e-02, 3.311e-01, -4.811e-02, -2.389e-01, 8.186e-03, 6.221e-02, -9.661e-02, 2.287e-01, 2.388e-01)); + r += mul(s4_6, M4(1.481e-01, -5.240e-02, -1.941e-02, 8.818e-02, 2.495e-01, -1.412e-02, -2.608e-02, -4.810e-02, -2.315e-01, -8.362e-02, 4.897e-02, -2.118e-02, -1.361e-01, 1.350e-02, -1.880e-01, 1.905e-01)); + r += mul(s4_7, M4(4.878e-01, -1.511e-01, -1.736e-03, -3.363e-02, -5.360e-01, 7.955e-02, 7.788e-02, 9.979e-02, 2.209e-01, 4.757e-02, -1.000e-01, 4.289e-02, 3.118e-01, -6.413e-02, -1.840e-01, 2.950e-01)); + r += mul(s4_8, M4(3.545e-01, 6.789e-02, 1.073e-01, -1.039e-02, 1.130e-02, 2.724e-02, -1.097e-02, -5.575e-02, 2.353e-02, -8.818e-02, -3.032e-02, -1.197e-01, 1.907e-01, -1.782e-01, -2.438e-01, 6.993e-02)); + r += mul(s5_0, M4(-1.077e-01, 1.371e-01, 1.620e-01, -6.391e-02, 1.730e-01, -2.195e-02, 1.333e-01, -5.393e-02, 2.290e-01, -1.654e-01, 6.814e-02, 6.463e-02, 1.763e-02, 7.299e-02, -9.175e-02, 4.784e-03)); + r += mul(s5_1, M4(9.838e-02, -2.407e-02, 1.090e-01, -4.032e-02, -2.245e-01, 9.300e-02, 1.714e-01, 7.662e-02, -1.342e-01, 1.574e-01, -2.104e-01, -7.998e-02, -9.281e-02, -1.426e-02, -3.546e-02, -1.383e-01)); + r += mul(s5_2, M4(9.630e-02, -7.988e-02, -4.258e-03, 4.059e-02, 1.575e-01, -2.816e-02, 9.929e-02, -6.793e-02, -1.562e-01, 5.718e-02, -1.190e-01, -2.971e-02, 2.246e-02, 1.853e-01, 2.036e-01, -1.354e-01)); + r += mul(s5_3, M4(-1.125e-01, 2.767e-02, 1.741e-02, 1.890e-01, -8.985e-02, 5.772e-02, -6.771e-03, 1.740e-01, -1.138e-01, 9.879e-02, 6.454e-02, 2.596e-01, -9.205e-02, 8.011e-02, 2.136e-02, -3.488e-01)); + r += mul(s5_4, M4(-1.583e-01, 1.084e-01, -1.522e-02, 1.867e-01, 1.444e-01, -7.261e-02, 3.910e-02, 1.073e-01, 3.037e-01, 1.705e-02, -6.208e-02, -7.626e-02, 1.010e-01, -6.482e-03, -2.114e-01, -5.472e-02)); + r += mul(s5_5, M4(6.420e-02, -4.978e-02, -1.974e-02, -1.764e-01, -1.035e-01, -1.282e-01, 1.841e-02, 1.211e-01, 1.873e-01, -1.638e-02, 1.286e-01, -4.075e-02, -1.992e-01, 3.898e-02, 7.555e-02, 5.191e-02)); + r += mul(s5_6, M4(4.248e-02, 4.291e-02, -7.928e-02, -5.759e-02, 6.021e-02, -1.298e-01, -4.777e-02, -6.316e-02, -2.009e-01, 3.201e-02, -1.013e-02, 1.052e-01, 3.579e-02, -1.210e-01, -2.331e-01, -1.311e-01)); + r += mul(s5_7, M4(-6.934e-02, 1.753e-01, 3.212e-02, 6.848e-03, 3.728e-02, -6.126e-02, -1.051e-01, 1.405e-01, -3.361e-01, -1.548e-01, -9.565e-02, 1.302e-01, 5.812e-02, -9.976e-02, -3.195e-01, -1.182e-01)); + r += mul(s5_8, M4(-1.784e-02, 1.564e-02, 8.872e-02, 2.014e-02, 1.662e-01, -1.599e-02, 3.252e-02, 5.147e-02, -1.107e-01, -2.154e-01, 3.114e-02, 1.464e-01, -1.589e-01, -5.730e-02, -2.735e-01, -1.417e-02)); + r += mul(s6_0, M4(-2.384e-01, 2.611e-01, -1.268e-01, 1.316e-01, -1.823e-01, 7.801e-02, 9.472e-02, 1.327e-01, -1.290e-02, 6.820e-02, -9.707e-02, 2.936e-02, -1.107e-01, 2.095e-01, 1.146e-01, 5.724e-02)); + r += mul(s6_1, M4(-1.344e-01, 2.408e-01, 1.536e-01, -3.545e-01, 1.624e-01, 1.110e-01, -7.389e-02, -2.104e-02, 5.315e-02, -1.555e-02, -9.936e-03, 1.219e-01, -1.640e-01, 3.448e-02, 7.913e-02, 1.352e-01)); + r += mul(s6_2, M4(1.533e-01, -9.037e-03, -1.185e-01, -2.583e-01, -2.308e-01, 2.075e-01, -5.145e-02, -1.724e-01, -1.219e-01, -2.210e-02, -5.663e-02, -1.331e-02, 2.090e-01, -1.316e-01, 4.100e-02, -2.699e-01)); + r += mul(s6_3, M4(-2.112e-01, -1.713e-02, -1.445e-01, 3.541e-01, 5.172e-02, -6.357e-02, 5.586e-02, -8.194e-02, -1.106e-01, 1.409e-03, -6.749e-02, -6.735e-02, 1.516e-01, -1.863e-03, -1.481e-01, -2.105e-01)); + r += mul(s6_4, M4(7.159e-01, -5.119e-01, -1.683e-01, 2.406e-01, 1.592e-01, 1.474e-01, 2.973e-01, 8.472e-02, -9.213e-02, -1.400e-01, 9.298e-02, -2.664e-01, -5.050e-02, 2.569e-01, 4.411e-02, 2.103e-01)); + r += mul(s6_5, M4(-4.620e-01, -8.028e-02, -2.350e-01, 4.759e-02, -4.889e-02, -1.022e-01, -4.022e-03, 9.208e-02, 2.407e-01, 5.864e-03, 2.830e-02, 6.999e-03, -3.806e-02, 3.520e-01, 1.274e-01, 2.909e-02)); + r += mul(s6_6, M4(-1.176e-01, 1.713e-02, -6.950e-02, 3.435e-01, -2.294e-01, 9.154e-02, -3.631e-02, 1.902e-01, -7.157e-02, -8.642e-02, -7.304e-03, 2.735e-02, 1.880e-01, -9.725e-02, -1.776e-01, 3.204e-02)); + r += mul(s6_7, M4(-1.755e-01, -6.715e-02, -7.087e-02, -2.950e-01, -2.957e-02, -4.643e-02, -2.744e-02, 1.343e-01, 1.597e-01, -7.456e-03, 4.374e-02, 8.110e-02, 4.893e-01, 1.294e-01, 9.328e-03, -1.487e-01)); + r += mul(s6_8, M4(-4.028e-02, -1.625e-02, 2.767e-01, 1.098e-01, -3.776e-02, -6.545e-02, 2.046e-02, 1.530e-02, 3.918e-02, -3.557e-02, -7.773e-02, -9.076e-03, -1.003e-01, -1.724e-02, -1.270e-03, -4.472e-02)); + r += mul(s7_0, M4(-1.844e-01, -4.295e-02, -5.664e-02, 1.616e-01, 6.627e-02, -9.438e-02, -2.259e-01, 1.396e-01, 2.611e-02, 1.834e-01, -2.500e-01, 9.836e-02, -5.051e-02, 3.898e-03, 1.266e-01, 6.027e-03)); + r += mul(s7_1, M4(1.215e-01, 1.592e-01, 9.098e-02, -1.148e-01, 1.719e-01, -6.846e-02, -1.485e-01, 1.138e-01, 1.436e-01, -1.201e-01, 1.874e-02, 3.492e-01, -1.054e-01, -8.116e-02, 6.488e-02, 1.260e-01)); + r += mul(s7_2, M4(-1.123e-01, 1.626e-01, -7.825e-02, -1.088e-01, 1.374e-01, -8.742e-02, -1.126e-01, -7.326e-02, -1.524e-02, -1.172e-01, -8.262e-02, 1.151e-01, -2.039e-02, -7.255e-03, 2.493e-01, -1.163e-01)); + r += mul(s7_3, M4(-1.115e-01, 3.692e-02, 2.518e-02, 2.190e-01, -8.416e-02, -1.554e-01, 5.779e-02, -3.729e-01, -4.536e-02, -2.621e-01, -1.562e-01, -1.263e-01, -4.522e-02, -3.959e-03, 8.233e-02, -3.101e-02)); + r += mul(s7_4, M4(2.293e-01, -9.952e-02, -1.936e-01, 3.692e-02, 1.759e-02, -2.504e-01, 1.199e-01, 1.134e-01, 1.294e-01, 9.082e-03, 8.671e-02, -2.547e-01, -2.408e-02, 3.526e-02, 1.867e-01, 2.024e-01)); + r += mul(s7_5, M4(1.211e-01, -3.754e-02, -1.250e-01, 9.511e-02, 1.084e-01, -9.184e-02, 3.417e-02, -5.457e-03, 2.062e-01, 1.586e-01, 2.161e-03, 8.496e-02, 2.035e-01, 1.617e-01, 1.828e-01, -3.025e-02)); + r += mul(s7_6, M4(-1.154e-01, 1.107e-01, -8.670e-02, 5.546e-02, 1.741e-01, -2.064e-02, 3.745e-02, -2.159e-02, -7.298e-02, -7.743e-02, -4.781e-02, -1.333e-02, -4.613e-02, 3.182e-02, -4.090e-02, 7.631e-02)); + r += mul(s7_7, M4(-5.393e-02, -1.284e-01, 3.319e-02, -8.761e-02, 2.782e-01, 8.453e-02, -1.033e-01, 3.022e-02, 4.400e-02, 2.091e-01, 8.963e-02, -5.267e-02, -3.514e-02, 4.259e-01, 2.436e-01, -3.799e-02)); + r += mul(s7_8, M4(1.071e-01, -1.190e-01, 1.713e-01, 7.520e-02, -1.375e-03, -7.968e-03, -5.822e-02, -1.101e-01, -6.349e-03, -1.021e-01, -3.258e-02, -1.664e-03, -3.207e-02, -3.003e-02, 8.426e-02, 6.163e-02)); + r += V4(-1.253e-02, -1.539e-02, -3.069e-03, 1.641e-03); + return r; +} + +void Pass3(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = Rmp8x8(tid.x) + blockStart; + uint2 size = GetInputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = (gxy + 0.5) * pt; + + V4 s0_0 = l0(-1.0, -1.0); + V4 s0_1 = l0(0.0, -1.0); + V4 s0_2 = l0(1.0, -1.0); + V4 s0_3 = l0(-1.0, 0.0); + V4 s0_4 = l0(0.0, 0.0); + V4 s0_5 = l0(1.0, 0.0); + V4 s0_6 = l0(-1.0, 1.0); + V4 s0_7 = l0(0.0, 1.0); + V4 s0_8 = l0(1.0, 1.0); + V4 s1_0 = -max(-s0_0, 0.0); + V4 s1_1 = -max(-s0_1, 0.0); + V4 s1_2 = -max(-s0_2, 0.0); + V4 s1_3 = -max(-s0_3, 0.0); + V4 s1_4 = -max(-s0_4, 0.0); + V4 s1_5 = -max(-s0_5, 0.0); + V4 s1_6 = -max(-s0_6, 0.0); + V4 s1_7 = -max(-s0_7, 0.0); + V4 s1_8 = -max(-s0_8, 0.0); + s0_0 = max(s0_0, 0.0); + s0_1 = max(s0_1, 0.0); + s0_2 = max(s0_2, 0.0); + s0_3 = max(s0_3, 0.0); + s0_4 = max(s0_4, 0.0); + s0_5 = max(s0_5, 0.0); + s0_6 = max(s0_6, 0.0); + s0_7 = max(s0_7, 0.0); + s0_8 = max(s0_8, 0.0); + + V4 s2_0 = l1(-1.0, -1.0); + V4 s2_1 = l1(0.0, -1.0); + V4 s2_2 = l1(1.0, -1.0); + V4 s2_3 = l1(-1.0, 0.0); + V4 s2_4 = l1(0.0, 0.0); + V4 s2_5 = l1(1.0, 0.0); + V4 s2_6 = l1(-1.0, 1.0); + V4 s2_7 = l1(0.0, 1.0); + V4 s2_8 = l1(1.0, 1.0); + V4 s3_0 = -max(-s2_0, 0.0); + V4 s3_1 = -max(-s2_1, 0.0); + V4 s3_2 = -max(-s2_2, 0.0); + V4 s3_3 = -max(-s2_3, 0.0); + V4 s3_4 = -max(-s2_4, 0.0); + V4 s3_5 = -max(-s2_5, 0.0); + V4 s3_6 = -max(-s2_6, 0.0); + V4 s3_7 = -max(-s2_7, 0.0); + V4 s3_8 = -max(-s2_8, 0.0); + s2_0 = max(s2_0, 0.0); + s2_1 = max(s2_1, 0.0); + s2_2 = max(s2_2, 0.0); + s2_3 = max(s2_3, 0.0); + s2_4 = max(s2_4, 0.0); + s2_5 = max(s2_5, 0.0); + s2_6 = max(s2_6, 0.0); + s2_7 = max(s2_7, 0.0); + s2_8 = max(s2_8, 0.0); + + V4 s4_0 = l2(-1.0, -1.0); + V4 s4_1 = l2(0.0, -1.0); + V4 s4_2 = l2(1.0, -1.0); + V4 s4_3 = l2(-1.0, 0.0); + V4 s4_4 = l2(0.0, 0.0); + V4 s4_5 = l2(1.0, 0.0); + V4 s4_6 = l2(-1.0, 1.0); + V4 s4_7 = l2(0.0, 1.0); + V4 s4_8 = l2(1.0, 1.0); + V4 s5_0 = -max(-s4_0, 0.0); + V4 s5_1 = -max(-s4_1, 0.0); + V4 s5_2 = -max(-s4_2, 0.0); + V4 s5_3 = -max(-s4_3, 0.0); + V4 s5_4 = -max(-s4_4, 0.0); + V4 s5_5 = -max(-s4_5, 0.0); + V4 s5_6 = -max(-s4_6, 0.0); + V4 s5_7 = -max(-s4_7, 0.0); + V4 s5_8 = -max(-s4_8, 0.0); + s4_0 = max(s4_0, 0.0); + s4_1 = max(s4_1, 0.0); + s4_2 = max(s4_2, 0.0); + s4_3 = max(s4_3, 0.0); + s4_4 = max(s4_4, 0.0); + s4_5 = max(s4_5, 0.0); + s4_6 = max(s4_6, 0.0); + s4_7 = max(s4_7, 0.0); + s4_8 = max(s4_8, 0.0); + + V4 s6_0 = l3(-1.0, -1.0); + V4 s6_1 = l3(0.0, -1.0); + V4 s6_2 = l3(1.0, -1.0); + V4 s6_3 = l3(-1.0, 0.0); + V4 s6_4 = l3(0.0, 0.0); + V4 s6_5 = l3(1.0, 0.0); + V4 s6_6 = l3(-1.0, 1.0); + V4 s6_7 = l3(0.0, 1.0); + V4 s6_8 = l3(1.0, 1.0); + V4 s7_0 = -max(-s6_0, 0.0); + V4 s7_1 = -max(-s6_1, 0.0); + V4 s7_2 = -max(-s6_2, 0.0); + V4 s7_3 = -max(-s6_3, 0.0); + V4 s7_4 = -max(-s6_4, 0.0); + V4 s7_5 = -max(-s6_5, 0.0); + V4 s7_6 = -max(-s6_6, 0.0); + V4 s7_7 = -max(-s6_7, 0.0); + V4 s7_8 = -max(-s6_8, 0.0); + s6_0 = max(s6_0, 0.0); + s6_1 = max(s6_1, 0.0); + s6_2 = max(s6_2, 0.0); + s6_3 = max(s6_3, 0.0); + s6_4 = max(s6_4, 0.0); + s6_5 = max(s6_5, 0.0); + s6_6 = max(s6_6, 0.0); + s6_7 = max(s6_7, 0.0); + s6_8 = max(s6_8, 0.0); + + t0[gxy] = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t1[gxy] = f1(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t2[gxy] = f2(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t3[gxy] = f3(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); +} + +//!PASS 4 +//!DESC conv3 +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 +//!IN t0, t1, t2, t3 +//!OUT t4, t5, t6, t7 + +#define l0(x, y) V4(O(t0, float2(x, y))) +#define l1(x, y) V4(O(t1, float2(x, y))) +#define l2(x, y) V4(O(t2, float2(x, y))) +#define l3(x, y) V4(O(t3, float2(x, y))) + +V4 f0(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(2.430e-02, -2.502e-03, 6.129e-02, 6.356e-02, -6.155e-02, -7.575e-02, -1.735e-01, 2.518e-02, 6.293e-02, -8.199e-03, 3.854e-02, -1.450e-02, 1.340e-01, 3.969e-02, -1.542e-01, 1.633e-01)); + r += mul(s0_1, M4(2.588e-02, 1.567e-01, 6.751e-02, 6.298e-02, -4.141e-02, 5.382e-02, -9.239e-02, -1.018e-01, -8.423e-02, -5.073e-02, 1.521e-01, -8.445e-03, -2.287e-01, -1.461e-01, 1.232e-01, -2.732e-01)); + r += mul(s0_2, M4(-3.856e-02, 6.064e-02, 9.084e-02, 3.555e-02, -1.407e-02, -1.076e-01, 1.188e-01, -5.670e-02, -8.707e-02, 5.879e-02, 5.196e-02, 2.004e-02, -2.128e-02, 7.286e-02, 1.653e-01, 7.814e-02)); + r += mul(s0_3, M4(-5.635e-02, 6.645e-02, 2.274e-01, -3.328e-03, 6.878e-03, -1.448e-02, 4.074e-02, -2.986e-03, 7.733e-02, 9.767e-02, -1.488e-01, -3.001e-02, 2.552e-01, -4.813e-01, 2.380e-01, 3.349e-01)); + r += mul(s0_4, M4(-9.538e-02, -9.769e-02, -1.525e-01, 4.189e-02, -6.814e-02, -8.984e-02, 3.600e-02, 1.161e-01, -9.361e-04, 3.397e-02, -5.772e-02, -1.352e-01, 1.652e-01, 2.967e-01, -3.507e-01, -3.361e-01)); + r += mul(s0_5, M4(-2.982e-02, -9.992e-02, -8.754e-02, -5.282e-02, -3.020e-02, -7.405e-02, 1.307e-02, 2.055e-01, 7.412e-02, 3.693e-02, 1.558e-01, -2.303e-02, -3.333e-01, 1.319e-01, 8.950e-03, -1.264e-01)); + r += mul(s0_6, M4(-4.504e-02, 1.119e-02, -1.500e-01, 3.713e-02, 1.535e-01, 8.320e-02, 6.245e-02, -4.285e-02, 5.770e-02, -1.590e-02, -7.777e-02, -4.296e-02, -2.475e-01, -2.060e-01, -3.452e-02, -5.126e-03)); + r += mul(s0_7, M4(-1.587e-01, 5.268e-02, -5.849e-02, 9.573e-03, 5.701e-02, 9.641e-02, -9.526e-02, 7.030e-02, -1.654e-02, -1.078e-01, 8.349e-02, 4.318e-03, 5.628e-03, 1.483e-01, 2.488e-01, -5.701e-01)); + r += mul(s0_8, M4(1.630e-02, -4.883e-02, -3.023e-02, 9.988e-03, -5.532e-02, 9.620e-03, -1.785e-02, 2.546e-03, -9.849e-03, -1.123e-01, -5.571e-02, -6.771e-02, -1.957e-01, -2.368e-01, 1.368e-01, 1.634e-01)); + r += mul(s1_0, M4(-1.197e-02, -7.756e-02, -1.080e-01, 4.262e-02, 3.548e-02, -9.235e-02, -3.710e-02, -5.714e-02, -1.188e-03, -2.066e-02, -5.759e-02, 2.447e-01, 2.317e-02, 2.063e-02, -4.138e-02, 9.497e-02)); + r += mul(s1_1, M4(1.251e-01, 1.449e-01, 2.212e-02, 6.304e-02, 1.226e-02, 5.597e-02, -3.858e-01, -1.712e-01, 9.556e-02, 1.928e-01, 1.014e-01, -1.521e-01, -7.535e-02, 3.528e-02, 1.629e-02, 2.299e-02)); + r += mul(s1_2, M4(3.850e-02, 8.374e-02, -7.629e-02, 1.294e-01, -5.879e-03, 2.033e-02, -1.193e-01, -9.012e-02, -3.272e-02, -6.056e-02, -1.866e-01, -4.290e-02, -1.694e-02, 5.956e-03, 9.157e-03, -3.825e-02)); + r += mul(s1_3, M4(1.604e-01, 4.090e-02, 7.334e-02, 2.415e-02, 3.192e-01, -2.538e-02, 2.221e-01, -2.832e-01, 7.005e-02, -1.376e-01, -1.501e-01, 1.552e-01, -5.752e-02, -1.340e-02, 3.240e-02, 5.229e-02)); + r += mul(s1_4, M4(-5.953e-02, -1.548e-01, 1.631e-01, 2.119e-02, 7.934e-02, 2.167e-01, 1.857e-01, -1.035e-01, 1.381e-01, 3.463e-02, -2.884e-01, 4.351e-01, 1.858e-01, -8.326e-02, -2.519e-02, -9.710e-02)); + r += mul(s1_5, M4(6.947e-02, -8.995e-02, 2.487e-01, -2.135e-01, 3.198e-03, -9.266e-02, -1.341e-01, 3.048e-02, 8.311e-02, -2.381e-01, 2.681e-02, 5.102e-02, 3.620e-02, 2.993e-02, 1.298e-02, -6.167e-02)); + r += mul(s1_6, M4(3.554e-01, 4.870e-02, -8.663e-02, 6.653e-02, 1.344e-01, -5.864e-02, 9.889e-02, -2.758e-01, 1.533e-01, 1.133e-01, -1.640e-01, -5.022e-02, -6.187e-02, -1.555e-03, -1.428e-02, -3.003e-02)); + r += mul(s1_7, M4(-1.435e-01, 3.390e-02, -3.164e-01, 2.373e-01, 2.667e-01, -5.951e-02, -5.348e-02, -4.216e-02, 1.783e-01, 4.678e-01, 1.639e-01, -9.901e-02, -1.401e-01, -5.017e-03, -8.770e-02, 2.325e-02)); + r += mul(s1_8, M4(-7.280e-02, -1.682e-01, -1.215e-02, 8.937e-02, -3.245e-02, -8.058e-02, 5.462e-02, -1.603e-01, 4.640e-02, -1.189e-01, -2.991e-03, -1.409e-01, 4.921e-02, -6.372e-02, 4.113e-02, -8.392e-03)); + r += mul(s2_0, M4(2.396e-02, 4.426e-02, 7.507e-02, -2.888e-03, 1.127e-02, -1.107e-03, -1.501e-01, -4.166e-02, 6.494e-02, 4.537e-02, 1.415e-01, 2.229e-02, 5.914e-02, -3.564e-04, 2.547e-02, -4.783e-02)); + r += mul(s2_1, M4(4.173e-02, -2.709e-02, -8.981e-03, -6.010e-02, 2.876e-02, 1.221e-02, -8.832e-03, -3.574e-02, 1.257e-01, -3.440e-02, 2.348e-01, 2.222e-01, -7.485e-04, -3.096e-02, 7.948e-02, -4.845e-02)); + r += mul(s2_2, M4(-9.122e-03, 1.967e-02, 7.223e-02, 5.584e-03, -1.126e-01, 9.523e-02, -1.517e-01, -3.730e-02, 6.605e-02, 1.327e-01, 6.751e-02, -5.396e-02, 5.221e-02, 5.649e-02, -2.484e-01, -4.794e-02)); + r += mul(s2_3, M4(-6.743e-02, -5.392e-02, -3.705e-02, 1.631e-02, 5.557e-03, -6.563e-03, 4.973e-03, 1.547e-01, -5.396e-02, -9.422e-02, -1.079e-01, 1.227e-01, 6.776e-02, 9.316e-02, -3.001e-02, 7.081e-02)); + r += mul(s2_4, M4(-5.178e-02, 2.642e-02, 1.853e-01, -6.710e-03, -1.842e-02, 6.398e-02, -1.168e-02, 1.464e-01, -8.433e-02, -1.485e-01, -1.797e-02, -6.697e-03, -3.999e-02, 1.180e-01, -8.230e-02, 7.239e-03)); + r += mul(s2_5, M4(-3.445e-02, 1.215e-01, -4.651e-02, 1.042e-01, 2.504e-02, 1.252e-01, 4.106e-02, -2.745e-02, 3.966e-02, -8.817e-02, -2.228e-02, 1.102e-01, -8.929e-02, 3.381e-03, -6.434e-02, 7.325e-03)); + r += mul(s2_6, M4(-1.106e-02, -4.253e-02, 1.019e-01, 4.586e-04, 7.738e-02, 8.312e-02, 5.753e-02, 4.607e-02, -2.998e-01, -3.446e-03, -4.848e-03, 1.264e-01, -3.766e-02, -3.247e-02, -3.531e-02, -1.165e-01)); + r += mul(s2_7, M4(-8.607e-02, -3.008e-01, -1.574e-01, -2.179e-01, -4.569e-02, 1.867e-02, 1.438e-02, -8.711e-02, -1.629e-02, -1.113e-01, 7.664e-02, 9.039e-03, 1.211e-01, -4.794e-02, 3.923e-02, 2.456e-01)); + r += mul(s2_8, M4(5.356e-02, 2.222e-02, -3.259e-02, 3.216e-02, 6.819e-03, -4.598e-02, -9.678e-02, 5.281e-02, -3.978e-02, 5.241e-02, 1.722e-01, 3.001e-02, 9.125e-02, 7.772e-02, 8.599e-02, -8.592e-02)); + r += mul(s3_0, M4(3.115e-02, 1.028e-01, -6.195e-02, 2.367e-02, -1.322e-01, -7.176e-02, 7.053e-02, 1.276e-01, 4.564e-02, 1.063e-02, 8.671e-02, 1.843e-02, 3.702e-02, -7.545e-02, 1.198e-01, -1.720e-01)); + r += mul(s3_1, M4(2.552e-02, -6.462e-02, -7.313e-02, 4.329e-02, 3.530e-02, -3.807e-02, -1.673e-02, -1.561e-01, -1.243e-01, -1.062e-01, 1.733e-01, 1.645e-01, 3.684e-02, 1.227e-01, -7.788e-02, -7.140e-02)); + r += mul(s3_2, M4(1.483e-02, -1.223e-02, -5.747e-02, -7.337e-02, 2.469e-02, -1.636e-01, -1.594e-01, 2.546e-01, -6.015e-02, 7.157e-02, 1.841e-01, -1.612e-02, 7.649e-02, -4.488e-02, -9.112e-02, -5.642e-03)); + r += mul(s3_3, M4(6.861e-02, 1.171e-02, -2.535e-01, 1.983e-01, -1.498e-01, -4.660e-02, -6.927e-02, 8.195e-02, 3.378e-02, 1.077e-01, -2.126e-01, -1.488e-01, 9.868e-02, 6.725e-02, -5.056e-02, -9.546e-02)); + r += mul(s3_4, M4(-8.023e-02, -1.265e-01, 3.597e-02, -2.229e-02, -1.194e-02, -2.538e-01, -7.756e-03, -3.325e-02, -1.065e-01, -1.217e-02, -1.758e-01, -8.267e-03, -5.941e-03, 2.422e-01, 2.235e-01, -8.565e-02)); + r += mul(s3_5, M4(1.598e-01, -1.432e-01, 1.035e-01, 1.283e-02, 4.021e-02, 8.888e-03, 2.267e-01, 2.556e-02, -1.227e-01, 1.103e-01, 1.254e-01, 5.504e-02, -8.774e-02, 7.539e-02, 2.931e-02, -1.855e-02)); + r += mul(s3_6, M4(5.906e-02, -4.077e-02, 1.489e-01, 1.314e-01, -3.541e-01, 1.956e-03, 1.613e-02, -2.846e-02, 1.842e-01, 2.073e-02, 1.122e-02, 2.773e-02, -1.092e-01, 2.624e-02, -1.591e-02, -1.047e-01)); + r += mul(s3_7, M4(3.114e-01, -4.035e-02, -1.719e-01, -1.601e-02, -5.080e-01, -3.678e-02, -2.460e-02, 9.596e-02, 1.603e-01, 2.930e-03, 7.151e-03, -1.612e-01, -9.080e-02, -1.158e-01, -3.950e-02, 7.667e-02)); + r += mul(s3_8, M4(4.895e-04, 7.552e-02, -1.776e-01, 1.818e-01, -7.535e-02, -7.622e-02, -1.121e-01, 5.100e-03, -2.094e-02, 4.762e-02, 5.506e-02, 8.806e-02, 7.822e-03, 4.282e-02, -5.181e-02, -9.044e-03)); + r += mul(s4_0, M4(2.090e-02, 5.948e-02, -1.547e-01, 3.702e-02, -8.610e-04, -3.230e-02, -1.227e-01, 3.420e-02, -4.326e-02, -6.442e-02, 2.825e-01, 5.421e-03, 2.814e-02, -8.593e-03, -8.132e-02, -3.103e-03)); + r += mul(s4_1, M4(-2.322e-01, -3.469e-01, -2.500e-01, -3.387e-02, -6.166e-02, -3.307e-02, -1.402e-01, -1.919e-02, 1.674e-01, -8.884e-02, 1.193e-01, 1.444e-01, -2.201e-02, -1.885e-01, -4.131e-01, 2.004e-01)); + r += mul(s4_2, M4(-2.260e-01, 4.543e-02, -2.431e-01, 1.101e-01, -5.023e-02, 8.514e-02, -2.432e-02, 8.143e-02, -8.401e-02, -1.176e-01, -1.595e-01, -1.600e-01, -1.187e-01, -4.430e-02, 1.121e-01, -3.468e-02)); + r += mul(s4_3, M4(-5.215e-03, -1.233e-01, 7.827e-02, -5.274e-02, 1.962e-02, -4.484e-02, 5.968e-02, 1.161e-01, -8.261e-02, 8.903e-02, 1.394e-03, -2.465e-02, 3.084e-02, 1.483e-02, -2.100e-01, -1.218e-01)); + r += mul(s4_4, M4(1.997e-01, -6.270e-02, 1.550e-01, -1.618e-02, -3.016e-02, 3.239e-01, 8.539e-02, -7.489e-02, 2.133e-02, -3.946e-01, 1.209e-01, 7.094e-01, -9.293e-03, 1.545e-02, 1.811e-01, 8.852e-02)); + r += mul(s4_5, M4(-1.151e-01, 1.454e-01, 1.800e-01, 4.234e-02, 1.568e-02, -2.295e-01, -1.812e-01, 8.562e-02, 1.648e-01, -7.203e-02, -1.982e-01, -1.259e-01, 5.267e-02, -2.894e-02, -7.699e-02, -1.009e-01)); + r += mul(s4_6, M4(-1.691e-02, -1.591e-02, 6.519e-02, -1.106e-01, 3.055e-02, -7.047e-02, -1.120e-01, 5.428e-02, 2.806e-02, -7.755e-02, -1.886e-01, 1.087e-01, 1.662e-01, 2.564e-02, 7.856e-02, 5.331e-02)); + r += mul(s4_7, M4(1.820e-01, 4.350e-02, 5.261e-02, 1.101e-01, 1.758e-01, -2.128e-01, -8.567e-02, -1.119e-01, -5.122e-02, -1.566e-01, -1.069e-01, 8.537e-02, 1.297e-01, 6.946e-02, 8.958e-02, 4.395e-02)); + r += mul(s4_8, M4(-5.285e-03, 4.673e-02, -4.109e-02, 8.651e-02, 1.925e-02, 5.814e-02, -1.975e-02, 1.046e-01, 7.454e-02, -1.315e-01, 1.961e-02, -2.057e-01, 6.031e-03, 8.229e-02, -1.340e-01, -7.076e-02)); + r += mul(s5_0, M4(8.428e-02, -6.466e-02, -1.203e-01, 9.652e-02, -9.675e-03, 9.028e-02, 9.799e-03, -4.970e-03, 7.256e-03, -1.621e-02, 1.486e-03, 2.717e-02, 1.641e-02, 1.739e-02, -5.012e-02, 8.156e-02)); + r += mul(s5_1, M4(-9.258e-02, -2.166e-01, 1.321e-01, 5.894e-02, 4.417e-02, -3.021e-02, -1.223e-01, 1.535e-02, -3.462e-02, 2.490e-02, 1.146e-01, -1.133e-01, -3.950e-02, -7.089e-02, 5.085e-03, 1.121e-01)); + r += mul(s5_2, M4(-5.568e-03, 3.933e-02, 1.782e-01, -3.796e-02, -4.307e-02, -2.704e-02, 1.217e-01, 2.829e-02, 3.353e-02, -4.298e-02, 1.166e-01, -5.746e-03, -4.542e-02, -6.204e-02, -6.279e-02, 9.747e-02)); + r += mul(s5_3, M4(6.976e-02, -8.809e-02, 6.384e-02, 6.630e-02, -5.726e-02, 5.241e-02, -2.371e-04, -4.323e-02, 5.460e-02, 2.087e-02, -7.948e-02, 3.768e-03, 3.190e-02, 1.526e-02, 6.161e-02, -1.331e-01)); + r += mul(s5_4, M4(2.771e-02, -2.025e-01, -9.295e-02, 1.869e-03, -6.839e-03, -8.896e-02, 2.431e-01, 1.043e-01, 2.362e-02, -3.601e-02, -7.062e-02, -2.395e-02, -5.630e-02, 1.035e-01, -1.120e-01, -4.269e-02)); + r += mul(s5_5, M4(-6.221e-02, 5.515e-02, -6.945e-02, -2.008e-02, -5.769e-02, -2.422e-01, -4.253e-02, -5.424e-02, 1.082e-01, -3.192e-01, 2.441e-01, -4.830e-02, 1.521e-01, -8.100e-02, 6.139e-02, 2.581e-02)); + r += mul(s5_6, M4(6.218e-02, 1.707e-02, 5.381e-02, 4.556e-02, -1.143e-01, -3.433e-02, 1.830e-02, 7.153e-03, -2.423e-03, -2.425e-02, -4.516e-02, 2.008e-02, 7.175e-02, 2.979e-02, 8.772e-02, 2.496e-02)); + r += mul(s5_7, M4(1.569e-01, 8.843e-02, 8.214e-02, -3.816e-03, 1.612e-02, -1.714e-01, 6.246e-02, -6.355e-02, -1.388e-01, 6.606e-02, -1.192e-01, 5.246e-02, 1.004e-01, 2.411e-01, 1.450e-01, -2.187e-03)); + r += mul(s5_8, M4(3.150e-02, 1.450e-01, -7.715e-02, 4.629e-02, 1.862e-02, 2.719e-02, 8.752e-02, -1.093e-01, 5.075e-02, -6.477e-02, -5.522e-02, -1.557e-02, -1.725e-02, 7.111e-02, -5.877e-02, 4.227e-02)); + r += mul(s6_0, M4(5.059e-02, 3.600e-02, -1.045e-01, 7.332e-03, 4.851e-02, -6.121e-02, -1.669e-01, -2.964e-02, -5.797e-03, 3.425e-02, -4.846e-02, 2.897e-02, -6.363e-02, -4.005e-02, -1.674e-01, -6.592e-02)); + r += mul(s6_1, M4(-7.886e-02, -3.454e-02, -4.988e-02, 7.899e-02, -1.289e-01, 5.159e-02, -1.258e-02, 1.658e-01, 5.253e-02, -1.218e-01, 9.302e-02, 1.078e-03, 2.690e-02, 6.063e-02, 3.983e-02, -6.998e-02)); + r += mul(s6_2, M4(4.389e-02, -2.511e-02, 1.766e-02, 3.051e-02, -2.096e-01, -1.513e-02, -2.819e-01, 1.285e-02, 2.957e-02, 3.381e-02, -3.444e-02, 4.307e-02, -1.404e-02, -6.485e-02, 2.216e-01, -2.653e-01)); + r += mul(s6_3, M4(1.420e-01, -3.867e-02, 1.017e-02, 3.951e-02, 3.024e-01, -6.194e-03, -5.191e-02, -9.082e-02, -3.109e-02, 6.490e-02, 8.594e-02, -1.713e-01, 9.532e-02, 5.568e-02, 2.173e-01, 8.075e-02)); + r += mul(s6_4, M4(2.442e-02, -1.022e-01, 6.919e-02, -2.534e-02, 1.513e-01, -2.728e-02, 2.169e-01, -1.866e-01, 3.269e-02, 5.941e-02, 1.968e-01, -1.196e-01, 6.886e-02, 3.435e-01, 9.940e-02, 1.840e-01)); + r += mul(s6_5, M4(-1.406e-02, -4.546e-02, 1.050e-01, -3.953e-02, 2.146e-01, -3.592e-02, 8.963e-02, -2.727e-01, 2.125e-02, -1.543e-01, 8.049e-02, 4.861e-02, -4.433e-02, 3.279e-01, -6.396e-02, 2.270e-01)); + r += mul(s6_6, M4(1.996e-02, 5.264e-02, -6.494e-03, 4.879e-02, -2.092e-02, -1.126e-01, -2.927e-01, -7.429e-02, -1.299e-01, -6.691e-02, 3.593e-02, 6.911e-02, 2.352e-02, 2.037e-02, 1.791e-03, 7.659e-02)); + r += mul(s6_7, M4(3.134e-02, 7.911e-04, -4.691e-02, 6.814e-02, -1.124e-01, -3.115e-01, -3.733e-01, 3.364e-01, -4.880e-02, 1.425e-01, -8.420e-02, -1.705e-01, 1.497e-01, 4.582e-02, 2.033e-02, -1.566e-01)); + r += mul(s6_8, M4(-2.332e-02, 1.154e-01, -3.068e-02, 1.733e-02, 7.944e-04, -1.321e-01, -1.958e-01, 9.601e-02, -1.902e-02, -1.278e-01, 2.439e-02, -9.167e-03, 2.557e-02, 2.074e-01, -6.324e-03, -2.506e-01)); + r += mul(s7_0, M4(-9.704e-02, 8.497e-02, 4.279e-01, -2.315e-01, 6.230e-02, -1.185e-02, 5.086e-02, -5.616e-02, -4.671e-02, -5.134e-02, 1.671e-01, -5.957e-02, 1.091e-02, -3.777e-02, -9.111e-03, -7.947e-02)); + r += mul(s7_1, M4(1.325e-01, 1.757e-01, 1.235e-01, 2.153e-01, -4.627e-02, -6.814e-02, 1.869e-01, 1.260e-02, 1.781e-01, 3.753e-02, -8.738e-03, -5.145e-02, -9.106e-02, -1.544e-02, 1.918e-01, 3.458e-02)); + r += mul(s7_2, M4(-1.953e-01, 2.622e-01, 2.068e-01, -1.512e-01, -2.271e-03, -2.426e-02, 4.496e-03, 2.948e-02, 9.174e-02, 5.540e-02, -3.832e-01, -3.503e-03, -1.018e-01, 4.478e-02, -2.541e-02, -2.804e-02)); + r += mul(s7_3, M4(-7.293e-02, 1.416e-01, -4.117e-01, -4.729e-02, 7.547e-02, 7.161e-02, -1.651e-01, -2.265e-02, 4.845e-02, 2.563e-02, -3.190e-02, -8.842e-02, 6.109e-02, -1.210e-02, 1.880e-01, -7.380e-02)); + r += mul(s7_4, M4(-9.428e-02, -1.562e-01, -9.766e-02, 1.031e-01, 2.406e-03, 6.987e-02, -1.348e-01, 9.654e-02, -1.417e-02, 1.787e-01, -1.476e-01, -6.345e-02, 2.099e-02, 7.796e-03, -2.826e-02, -1.217e-01)); + r += mul(s7_5, M4(-1.551e-01, 1.827e-01, -9.766e-02, -2.134e-01, 4.146e-02, 9.782e-02, -1.664e-01, 1.176e-01, -1.567e-01, -1.144e-01, 1.927e-01, -2.515e-02, 1.365e-02, 2.013e-01, -5.611e-02, 1.228e-01)); + r += mul(s7_6, M4(-9.818e-02, 1.221e-01, -1.325e-01, 1.431e-01, 6.329e-02, 2.043e-02, 3.903e-02, 3.868e-02, -1.627e-01, -1.269e-01, 8.569e-03, -3.293e-02, -2.025e-01, -7.457e-02, -5.839e-02, 1.231e-02)); + r += mul(s7_7, M4(-6.773e-02, 3.339e-01, -2.705e-02, -2.185e-01, -2.356e-03, 7.593e-02, 6.016e-02, 8.892e-02, 3.956e-01, -1.463e-01, 3.654e-01, -1.317e-01, -1.505e-01, -7.638e-02, -5.450e-03, -1.264e-01)); + r += mul(s7_8, M4(-1.649e-01, -1.729e-02, -7.593e-02, 8.465e-02, -3.762e-02, -4.065e-02, 9.005e-02, -1.389e-02, -3.085e-02, 1.258e-02, -1.305e-01, 7.684e-02, -3.777e-02, -8.700e-02, 6.696e-03, -4.232e-02)); + r += V4(1.502e-02, 2.141e-03, -2.058e-02, 1.180e-02); + return r; +} + +V4 f1(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(3.627e-02, -3.706e-02, 2.273e-03, 1.536e-02, 5.301e-03, -1.796e-02, 1.585e-02, 5.789e-02, 3.824e-02, -2.587e-02, -6.336e-02, 2.388e-02, -1.271e-01, -7.856e-02, 1.474e-01, -2.274e-01)); + r += mul(s0_1, M4(4.593e-02, -1.174e-01, 9.351e-02, -8.614e-02, 2.725e-02, -6.049e-02, 2.536e-03, 2.922e-02, -3.083e-02, -1.015e-02, -5.483e-02, 4.235e-02, 1.300e-01, -1.464e-02, 1.705e-01, 1.818e-01)); + r += mul(s0_2, M4(2.636e-02, -6.043e-02, -9.670e-02, 2.721e-02, -8.521e-02, 3.564e-02, -4.830e-03, 1.304e-02, -5.090e-02, -2.392e-02, 6.243e-03, -2.102e-02, -2.274e-01, -1.684e-01, -1.534e-01, 2.337e-01)); + r += mul(s0_3, M4(4.204e-02, -1.005e-01, 6.872e-02, 4.869e-02, -6.030e-02, 7.907e-02, -6.551e-02, 2.803e-02, -7.273e-02, 1.702e-02, -8.917e-02, 8.109e-02, 9.057e-02, 2.228e-02, -4.067e-01, -2.123e-01)); + r += mul(s0_4, M4(1.333e-01, 4.912e-02, 7.565e-02, 3.742e-03, 3.059e-02, -3.174e-02, -6.240e-02, 5.730e-02, -7.866e-02, -1.045e-02, 8.373e-02, 5.979e-02, -4.503e-01, 2.687e-01, -7.459e-02, 4.265e-01)); + r += mul(s0_5, M4(-5.302e-02, 6.140e-02, 7.408e-03, 8.252e-02, -1.031e-02, 1.042e-01, -3.733e-02, -3.354e-02, 7.338e-03, -5.500e-02, 1.031e-01, 2.960e-02, 3.828e-01, -2.754e-02, -2.871e-01, 1.416e-01)); + r += mul(s0_6, M4(7.235e-02, -9.262e-02, -4.357e-02, 8.340e-02, -3.616e-02, 1.498e-02, 7.191e-02, -7.057e-02, 2.108e-02, -4.524e-03, -2.951e-02, -4.385e-02, 1.128e-01, -3.883e-02, -2.984e-01, 1.454e-01)); + r += mul(s0_7, M4(4.685e-02, 3.870e-03, -9.658e-02, -4.813e-02, 1.318e-02, -5.383e-02, -6.818e-02, 1.219e-02, -6.892e-02, -1.896e-02, -1.107e-01, 5.092e-02, -8.280e-02, 9.133e-02, 1.534e-01, 1.031e-01)); + r += mul(s0_8, M4(-7.269e-03, 1.340e-02, 6.275e-02, 7.108e-03, 6.567e-02, 2.403e-03, -3.498e-02, -1.143e-02, -6.371e-02, 9.872e-02, -1.041e-01, -2.016e-02, -3.668e-01, 2.973e-01, -1.393e-01, 1.399e-01)); + r += mul(s1_0, M4(6.435e-02, 1.008e-02, -3.227e-02, 1.622e-01, 3.116e-02, 1.173e-01, 4.471e-02, 4.926e-02, 1.794e-01, 3.143e-02, -1.059e-01, 6.966e-02, -4.122e-02, -1.442e-02, 5.200e-02, 1.345e-02)); + r += mul(s1_1, M4(8.526e-02, -1.183e-01, 5.110e-02, -4.240e-02, 3.903e-02, 4.467e-02, -7.250e-02, -1.168e-01, 2.552e-01, -1.188e-02, -8.694e-02, 1.658e-02, 1.522e-01, 2.154e-02, -5.800e-02, -9.179e-02)); + r += mul(s1_2, M4(6.380e-02, -6.909e-02, -2.660e-02, 4.635e-02, 1.963e-02, 8.193e-03, 1.138e-02, 5.036e-02, 1.687e-02, 9.006e-02, -2.169e-02, -3.294e-02, -4.215e-02, -6.957e-02, -4.407e-02, 1.604e-02)); + r += mul(s1_3, M4(8.150e-02, -3.895e-02, 1.754e-01, 4.230e-02, -1.249e-01, 2.390e-01, 5.074e-02, -3.046e-02, 2.020e-02, 2.077e-01, 1.416e-01, -1.547e-01, 5.266e-02, -1.331e-01, 4.703e-02, 5.557e-03)); + r += mul(s1_4, M4(3.522e-01, -1.193e-01, -9.524e-02, 1.514e-01, 9.165e-02, 5.100e-02, 1.074e-01, -1.809e-01, 1.972e-01, -2.142e-02, 3.038e-01, -1.775e-01, -7.309e-02, 1.762e-01, -2.303e-02, 5.562e-02)); + r += mul(s1_5, M4(-1.424e-01, 1.279e-01, -4.616e-02, 6.096e-02, 1.339e-01, 6.948e-02, 8.022e-02, 2.968e-02, 5.865e-02, 4.638e-02, -7.140e-02, 3.687e-02, -7.514e-02, -5.826e-02, 1.623e-01, 8.376e-03)); + r += mul(s1_6, M4(1.101e-01, -3.896e-02, 1.135e-01, 1.991e-02, -3.304e-02, 1.337e-01, 2.981e-01, -4.507e-02, -1.599e-02, 8.470e-02, -1.310e-01, -7.373e-02, 3.429e-02, -6.702e-02, -1.505e-03, 9.035e-02)); + r += mul(s1_7, M4(1.812e-01, -7.926e-02, 2.959e-02, 7.337e-02, -1.275e-01, -7.013e-02, 1.419e-01, 3.057e-02, -1.709e-02, -1.890e-01, 1.521e-01, -2.855e-02, 8.112e-02, 1.838e-03, -5.860e-02, -4.827e-02)); + r += mul(s1_8, M4(-1.008e-01, 1.633e-01, -2.021e-01, -2.959e-03, 5.128e-02, 1.395e-01, -1.652e-02, 3.358e-02, 9.271e-02, -6.090e-02, -1.068e-01, 1.570e-02, 2.471e-02, 5.604e-02, -3.309e-02, -8.012e-03)); + r += mul(s2_0, M4(-7.188e-02, 2.960e-02, 6.470e-02, -4.708e-02, 5.598e-02, 5.825e-02, 4.624e-02, 3.552e-02, 5.060e-02, -1.837e-01, -3.757e-03, 9.105e-02, -5.707e-02, -1.952e-02, -1.222e-02, 6.376e-02)); + r += mul(s2_1, M4(8.038e-02, -1.987e-02, 1.788e-02, -4.915e-03, -1.764e-02, -1.092e-02, -6.952e-02, 4.656e-02, -3.170e-01, -5.994e-02, 7.551e-02, -2.007e-02, 8.198e-02, 4.931e-02, 2.651e-03, 3.904e-02)); + r += mul(s2_2, M4(5.293e-02, 3.933e-02, -7.201e-02, -4.464e-03, 5.815e-02, 1.212e-02, -6.521e-02, -2.304e-02, 1.165e-01, -7.738e-02, 1.932e-01, 5.646e-02, -9.020e-02, 1.666e-02, 1.118e-01, -8.715e-02)); + r += mul(s2_3, M4(3.826e-02, 6.648e-02, -7.553e-02, -4.523e-04, -7.340e-02, -7.885e-02, 8.911e-02, 2.264e-02, 1.029e-01, -1.053e-01, -8.941e-02, 4.054e-01, -2.498e-03, -4.982e-02, 6.183e-02, 1.528e-01)); + r += mul(s2_4, M4(-1.312e-01, -1.318e-01, 1.237e-01, -1.090e-01, 1.089e-01, 2.118e-02, -1.616e-01, -1.268e-01, 9.568e-03, -5.246e-02, -6.390e-01, -9.805e-02, 1.340e-01, -1.311e-01, -4.989e-02, -2.292e-01)); + r += mul(s2_5, M4(1.449e-01, -4.417e-02, 1.359e-01, -2.568e-02, 7.714e-02, -7.431e-02, 1.489e-01, 1.559e-02, -1.086e-01, -1.940e-02, -1.070e-01, 1.865e-03, 1.768e-01, -1.110e-01, -9.865e-02, -1.790e-01)); + r += mul(s2_6, M4(-6.517e-02, 2.601e-02, -1.632e-02, 8.751e-02, -9.319e-03, -3.826e-02, 1.682e-01, 1.859e-02, 6.412e-02, -2.240e-02, -7.695e-02, 8.414e-02, 9.562e-02, -1.344e-02, 3.524e-02, -3.504e-02)); + r += mul(s2_7, M4(1.413e-01, 2.495e-02, -2.045e-01, -2.954e-03, 8.908e-03, -6.806e-02, -2.154e-02, 2.458e-02, -9.071e-02, 6.857e-02, -1.723e-01, -2.654e-02, -5.486e-02, 1.018e-01, 3.252e-01, -8.761e-02)); + r += mul(s2_8, M4(-1.249e-02, -2.934e-03, -8.129e-05, -8.104e-02, 4.956e-02, 7.004e-02, 1.413e-02, 3.958e-03, -3.843e-02, 1.097e-02, -1.374e-02, 5.251e-02, 5.842e-03, -8.886e-02, 1.657e-01, 9.379e-03)); + r += mul(s3_0, M4(-7.571e-03, -2.115e-02, -5.197e-02, 9.415e-02, 8.949e-02, 3.121e-03, -1.294e-01, 3.839e-01, 3.977e-04, 3.072e-03, -7.390e-02, -1.015e-01, -1.002e-01, 1.109e-01, 7.192e-02, 8.343e-02)); + r += mul(s3_1, M4(1.220e-01, 8.792e-03, -6.851e-02, 2.211e-03, -8.430e-02, 1.781e-01, -2.230e-01, 5.424e-02, -1.278e-01, 4.666e-02, 1.977e-01, 9.164e-02, 7.105e-03, 2.962e-02, -7.392e-02, 1.262e-02)); + r += mul(s3_2, M4(4.917e-02, -7.202e-02, -4.426e-02, -4.060e-02, -2.578e-01, 1.368e-01, -1.178e-01, 7.409e-02, -5.321e-02, -2.093e-02, 4.148e-02, 8.132e-03, 1.633e-03, 5.683e-02, 5.647e-02, -4.462e-03)); + r += mul(s3_3, M4(5.651e-02, 6.987e-02, 1.022e-02, 2.228e-02, -3.403e-02, -1.238e-01, -8.688e-02, 2.847e-01, 8.300e-02, 1.064e-01, 5.079e-02, 2.312e-01, -2.011e-02, 4.970e-02, 8.474e-02, 1.646e-01)); + r += mul(s3_4, M4(1.658e-01, 2.664e-02, 6.081e-04, -1.901e-02, -2.153e-01, 1.785e-01, -1.159e-01, 1.344e-01, 2.095e-01, -6.540e-02, -9.419e-02, 2.543e-02, 2.168e-01, -1.920e-01, -1.066e-01, -3.762e-02)); + r += mul(s3_5, M4(-2.605e-01, 1.033e-01, 5.749e-02, -7.792e-03, -1.805e-01, 3.559e-02, -8.796e-02, -2.171e-02, -1.491e-02, -1.234e-01, -1.024e-01, -4.689e-02, 8.840e-03, -6.047e-02, -1.086e-01, -8.053e-02)); + r += mul(s3_6, M4(-7.415e-02, 6.573e-02, -1.010e-02, 1.004e-01, 8.146e-02, 1.904e-02, -2.087e-01, 1.677e-01, -8.537e-02, -9.823e-04, 8.008e-02, -2.436e-02, 1.405e-01, 1.090e-02, -1.450e-02, 1.604e-03)); + r += mul(s3_7, M4(1.052e-01, 2.178e-01, -1.695e-01, -1.675e-01, 7.965e-02, 9.504e-02, -1.882e-01, 2.795e-02, -1.650e-01, 7.266e-02, 2.497e-01, -1.030e-01, -3.892e-02, 4.202e-02, 5.738e-02, -2.670e-02)); + r += mul(s3_8, M4(2.595e-01, -1.184e-01, -5.760e-03, 1.873e-03, -3.031e-02, 8.616e-02, -1.890e-01, -3.566e-02, -6.621e-02, -6.521e-02, 9.123e-02, 1.774e-02, 1.456e-02, -4.624e-02, 1.121e-01, 7.075e-02)); + r += mul(s4_0, M4(-1.808e-01, -7.151e-02, 1.136e-01, 8.906e-02, -3.798e-02, 3.175e-02, 3.574e-03, -6.163e-02, -1.217e-02, -3.910e-02, -4.029e-02, 1.510e-02, -5.323e-02, 4.221e-02, -1.139e-02, 2.482e-02)); + r += mul(s4_1, M4(2.471e-01, 2.122e-01, -2.925e-01, 1.159e-01, 1.034e-01, 3.971e-02, -2.369e-02, -6.175e-02, 1.270e-01, -1.832e-02, -2.061e-01, 2.132e-01, -8.107e-02, 1.786e-01, 8.508e-03, -5.903e-02)); + r += mul(s4_2, M4(2.225e-01, 1.082e-01, -1.634e-01, -2.090e-02, 3.859e-02, -5.848e-02, -7.811e-02, 2.496e-02, 6.474e-02, 8.606e-02, 1.459e-01, -1.556e-01, -2.996e-02, 1.241e-02, -1.139e-01, -4.844e-02)); + r += mul(s4_3, M4(6.932e-02, 1.109e-01, -1.615e-01, -6.077e-02, -3.714e-02, 9.318e-02, 4.859e-02, 3.846e-02, 7.590e-02, 3.168e-02, -6.170e-02, 2.132e-01, -1.446e-01, 7.892e-02, -1.163e-01, 9.597e-02)); + r += mul(s4_4, M4(-4.274e-02, 3.076e-01, 6.231e-02, 1.233e-01, 3.335e-02, -2.843e-01, 2.578e-01, -3.067e-01, 1.023e-01, 1.018e-01, -1.995e-01, -1.487e-01, 3.421e-02, 1.787e-01, -9.120e-03, -6.409e-02)); + r += mul(s4_5, M4(2.020e-01, -3.115e-01, 1.270e-01, -1.962e-03, 5.069e-02, -1.333e-02, -2.809e-02, 1.169e-01, 6.924e-02, -9.659e-02, 3.233e-01, -8.298e-02, 2.950e-02, -4.171e-02, 1.832e-01, -1.195e-03)); + r += mul(s4_6, M4(-1.517e-03, 5.659e-02, -8.075e-02, 4.669e-03, 7.980e-02, -2.630e-02, -5.654e-02, -1.299e-01, 2.705e-02, -1.421e-02, -5.630e-02, 3.774e-02, -1.197e-02, -3.027e-02, -9.603e-02, -9.663e-02)); + r += mul(s4_7, M4(1.387e-02, 4.735e-02, 7.699e-02, -7.601e-02, 1.694e-02, 1.520e-01, -2.505e-01, 7.931e-03, 7.297e-02, 1.056e-01, -2.348e-01, -7.999e-02, -4.488e-02, -1.450e-02, 9.499e-02, 1.999e-02)); + r += mul(s4_8, M4(-1.672e-02, -6.865e-02, 7.445e-02, -5.010e-03, -5.751e-02, 1.366e-01, -7.348e-02, 4.473e-02, -6.648e-02, 1.935e-01, -6.542e-03, -6.221e-02, 1.000e-02, -4.030e-02, -2.002e-02, -5.702e-02)); + r += mul(s5_0, M4(-1.844e-02, -2.279e-02, 1.859e-02, -1.994e-01, -7.484e-02, -7.738e-02, -1.324e-01, 6.908e-02, 3.229e-02, 3.760e-02, 2.144e-02, 8.776e-03, -3.110e-03, 3.086e-02, -3.827e-02, -2.496e-02)); + r += mul(s5_1, M4(1.135e-01, 1.224e-01, 8.033e-02, 7.685e-02, 6.138e-02, -2.476e-02, -1.497e-02, -1.407e-02, -1.467e-02, 4.675e-02, -8.522e-02, -7.936e-02, 5.384e-02, 1.046e-01, 1.349e-02, -8.820e-02)); + r += mul(s5_2, M4(4.358e-02, -9.912e-02, -3.773e-02, -1.635e-02, -5.953e-02, 5.375e-02, -2.343e-02, 4.447e-02, -6.225e-02, -1.359e-03, 4.897e-02, -4.672e-03, 1.588e-02, 8.632e-02, -1.006e-01, -1.180e-02)); + r += mul(s5_3, M4(-5.165e-02, 6.907e-02, 3.863e-02, -7.992e-02, -2.743e-03, -4.003e-02, -4.348e-02, -1.824e-02, 6.504e-02, -2.389e-02, -5.433e-02, 1.896e-02, -1.038e-01, 7.700e-02, -4.348e-02, -1.953e-02)); + r += mul(s5_4, M4(-1.504e-01, 1.324e-01, -1.111e-01, 1.308e-01, -1.680e-02, 9.616e-03, 2.922e-02, -2.276e-01, -6.420e-02, 2.921e-02, 8.717e-02, -2.128e-01, 1.967e-01, -6.838e-02, 7.717e-03, -2.039e-01)); + r += mul(s5_5, M4(8.521e-02, -3.579e-02, -7.804e-02, 5.746e-02, -2.326e-02, 1.403e-01, -1.433e-01, 5.825e-02, -2.646e-01, 2.818e-01, -4.705e-02, 2.818e-02, 2.052e-02, -4.477e-02, 2.043e-02, 3.274e-02)); + r += mul(s5_6, M4(-8.509e-02, -1.012e-02, -2.024e-02, 3.751e-02, -1.689e-02, -1.200e-02, -6.649e-03, -9.636e-03, -9.893e-03, 2.870e-02, 1.406e-02, 6.826e-03, -1.444e-01, 2.577e-02, 3.355e-02, -4.936e-02)); + r += mul(s5_7, M4(6.914e-03, 4.111e-03, -3.507e-02, 4.883e-02, -1.203e-01, 1.782e-01, -1.221e-01, -2.258e-01, 6.142e-02, -5.628e-02, -3.241e-02, -1.518e-02, -1.409e-01, -1.079e-01, 4.747e-02, 4.770e-02)); + r += mul(s5_8, M4(3.974e-02, -1.140e-01, 9.127e-02, 2.949e-02, -4.091e-02, -3.985e-02, 2.987e-02, 9.161e-03, 1.925e-02, 3.103e-02, -8.920e-02, 1.126e-02, 5.775e-02, -5.850e-02, -1.156e-01, -5.278e-02)); + r += mul(s6_0, M4(4.430e-02, 2.128e-04, -2.363e-02, -8.580e-02, 4.758e-02, 9.645e-02, 1.086e-01, -4.137e-02, -8.103e-03, 6.940e-02, -1.248e-02, -3.844e-02, 4.752e-02, -6.782e-02, 3.714e-02, -9.741e-02)); + r += mul(s6_1, M4(6.954e-02, 7.004e-03, -5.223e-02, 9.466e-04, -2.323e-02, -2.353e-02, 5.527e-03, -8.855e-02, -3.303e-02, 2.008e-02, -3.504e-02, -6.496e-03, -3.531e-02, 7.740e-02, -3.346e-02, -2.544e-02)); + r += mul(s6_2, M4(-1.047e-01, -1.141e-02, -4.571e-02, -5.042e-02, 2.876e-01, -6.013e-02, 1.330e-01, -6.781e-03, 9.382e-03, 2.406e-02, 8.489e-02, -3.575e-02, -8.829e-02, 8.565e-02, 5.110e-04, 1.838e-02)); + r += mul(s6_3, M4(-6.323e-02, 5.539e-02, 4.282e-02, -1.517e-01, 6.639e-02, 8.618e-02, 6.218e-02, -1.342e-01, -8.240e-02, 2.534e-02, -1.269e-01, -5.660e-02, 1.406e-02, 8.384e-02, 6.082e-02, -1.931e-01)); + r += mul(s6_4, M4(-1.133e-01, 6.829e-02, -2.698e-02, 2.658e-02, -3.588e-02, 1.752e-01, 4.161e-01, 4.412e-02, -1.112e-02, -1.806e-01, 1.313e-01, 1.439e-01, 4.300e-02, -1.159e-01, -6.542e-02, -2.109e-01)); + r += mul(s6_5, M4(-1.037e-02, -6.339e-02, -4.106e-02, -7.217e-03, -1.563e-01, -5.163e-02, -1.412e-02, -4.560e-02, -3.262e-02, 2.693e-02, -7.205e-02, -1.538e-01, 2.494e-01, -7.619e-02, 9.734e-02, -1.963e-02)); + r += mul(s6_6, M4(4.477e-02, -2.460e-02, 1.561e-02, 7.902e-03, 2.819e-02, 8.137e-02, -9.074e-02, 4.879e-02, -7.361e-02, 8.618e-02, -9.277e-02, -1.204e-01, -3.147e-02, -2.592e-02, 4.403e-02, -3.817e-02)); + r += mul(s6_7, M4(-9.093e-03, -6.024e-02, -4.040e-02, 5.986e-02, 7.624e-02, 1.555e-01, -1.529e-01, 1.163e-01, 2.841e-03, -9.467e-02, -1.644e-01, 5.406e-02, -1.252e-01, 1.712e-02, 1.295e-01, -1.023e-01)); + r += mul(s6_8, M4(4.371e-02, -7.912e-02, -2.886e-02, -4.878e-03, -3.480e-02, 2.319e-01, -1.500e-01, 9.054e-02, 6.201e-02, 7.539e-02, -1.330e-01, -1.722e-02, 2.272e-01, -2.516e-01, 1.550e-01, -1.427e-02)); + r += mul(s7_0, M4(-1.865e-01, -5.930e-02, 1.480e-01, 5.092e-02, 8.114e-02, 1.780e-02, 4.968e-02, 1.214e-01, 1.395e-02, 1.867e-02, 6.042e-03, 9.279e-02, -6.797e-02, 2.587e-02, -1.102e-02, -2.887e-02)); + r += mul(s7_1, M4(-4.457e-01, -1.417e-01, -1.668e-01, -1.126e-01, -1.799e-02, -2.844e-02, -4.474e-02, 4.784e-02, 1.272e-02, 3.509e-02, 5.592e-02, 3.425e-02, -8.181e-02, 8.894e-02, 9.407e-02, -1.074e-01)); + r += mul(s7_2, M4(2.992e-02, -2.817e-01, 4.041e-02, -1.705e-01, -3.277e-02, 4.062e-02, 1.309e-02, -3.913e-02, 2.197e-02, -5.788e-02, 5.907e-02, -1.210e-01, 1.236e-01, 4.234e-02, -2.209e-02, 3.183e-02)); + r += mul(s7_3, M4(-1.444e-01, 7.209e-02, -1.524e-01, -1.727e-01, 5.041e-02, -2.331e-02, 4.138e-02, 1.204e-01, -1.734e-01, 9.672e-02, -4.040e-02, -5.078e-02, -2.563e-02, -2.302e-02, -1.457e-02, -3.718e-03)); + r += mul(s7_4, M4(-4.509e-01, 2.154e-01, 5.315e-01, 2.917e-01, 2.953e-02, -6.827e-02, -1.176e-01, 1.002e-01, 7.062e-02, -6.440e-02, 1.057e-01, 1.603e-01, -2.618e-03, -3.762e-02, -6.451e-02, -2.631e-02)); + r += mul(s7_5, M4(1.754e-01, -3.155e-01, 1.431e-02, -2.786e-01, 2.343e-02, -5.685e-02, 8.120e-02, -7.000e-02, 6.258e-02, 1.671e-02, -1.732e-01, -8.802e-02, -3.786e-02, -5.198e-02, 1.550e-01, 1.113e-02)); + r += mul(s7_6, M4(-9.336e-02, 7.900e-03, 1.448e-02, -1.041e-01, 3.344e-02, 3.577e-02, 5.547e-02, -2.618e-02, 9.245e-03, 2.217e-02, -1.096e-01, -1.983e-01, -1.686e-02, 5.541e-02, -1.284e-01, 3.291e-02)); + r += mul(s7_7, M4(-5.726e-02, -2.849e-01, 4.176e-01, 7.591e-02, 2.073e-02, -1.418e-01, 1.758e-01, 3.021e-02, -1.954e-01, -4.763e-02, 2.269e-01, 1.887e-01, 3.317e-02, 5.195e-02, -1.633e-01, -1.694e-02)); + r += mul(s7_8, M4(-2.306e-02, -1.179e-01, 4.999e-02, -8.378e-02, 2.885e-03, -1.295e-02, -2.832e-02, -6.580e-02, -8.781e-03, -1.141e-02, 5.429e-02, -2.212e-02, 4.049e-02, 8.520e-02, -1.725e-01, -6.162e-03)); + r += V4(2.776e-02, -8.120e-03, 1.695e-02, -8.298e-03); + return r; +} + +V4 f2(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-9.317e-02, 1.915e-02, 8.386e-03, -7.604e-03, 2.599e-02, 3.101e-02, 2.067e-02, -7.477e-02, -3.195e-02, 3.575e-03, -1.788e-02, 3.550e-02, -5.165e-02, 8.900e-02, -1.879e-02, 6.665e-02)); + r += mul(s0_1, M4(2.323e-02, 4.761e-02, 3.358e-03, 1.379e-02, 6.437e-02, -7.584e-02, 5.153e-02, -8.086e-02, 3.212e-02, -3.236e-02, 4.675e-03, 7.112e-03, 1.418e-01, 3.161e-01, 1.194e-02, -2.045e-01)); + r += mul(s0_2, M4(1.196e-02, 2.864e-02, 7.652e-02, -9.290e-03, -2.904e-02, 1.836e-02, 3.561e-02, 3.707e-02, 8.349e-02, 4.243e-02, -2.999e-02, 1.486e-02, -1.074e-01, 2.173e-01, 2.716e-02, -5.154e-02)); + r += mul(s0_3, M4(-7.280e-02, -1.273e-01, 9.497e-02, -2.195e-02, -1.005e-01, 9.936e-02, -4.427e-02, 5.945e-02, 4.234e-02, -6.874e-02, -3.501e-03, -3.821e-02, -5.160e-01, -1.874e-01, 2.054e-01, -6.566e-02)); + r += mul(s0_4, M4(-1.746e-01, 1.102e-01, 4.787e-02, -3.177e-02, -1.164e-01, 1.112e-01, 5.676e-02, 4.072e-03, -1.577e-02, -3.395e-02, 4.062e-02, -1.182e-01, -5.695e-01, -6.229e-01, -1.910e-01, -6.589e-01)); + r += mul(s0_5, M4(-4.777e-03, 1.793e-03, 8.129e-02, -1.238e-01, -3.224e-02, 1.482e-01, 2.397e-02, 8.479e-02, 4.881e-03, -5.675e-02, 1.567e-01, -3.732e-02, 2.494e-01, -1.549e-02, 6.266e-02, -8.537e-02)); + r += mul(s0_6, M4(3.985e-02, -3.295e-02, -5.131e-02, -1.254e-01, 4.139e-02, 1.998e-02, -1.187e-02, -1.422e-02, 4.812e-02, -2.490e-02, -7.066e-02, -6.262e-02, 6.560e-03, -1.073e-01, 1.650e-01, 1.090e-01)); + r += mul(s0_7, M4(2.583e-02, -5.291e-02, -3.541e-02, -2.015e-02, 1.829e-02, -6.868e-05, -1.853e-01, -8.112e-02, -6.439e-02, -7.911e-02, 4.696e-03, -9.687e-02, -2.225e-01, 5.081e-02, 8.367e-02, 7.498e-01)); + r += mul(s0_8, M4(2.599e-02, 2.886e-03, -8.094e-02, 4.401e-02, 1.440e-02, -2.015e-02, 1.880e-02, 1.081e-03, -9.465e-02, -9.373e-03, 1.154e-01, -3.917e-02, -1.011e-01, 4.820e-02, -1.554e-01, -3.663e-01)); + r += mul(s1_0, M4(-1.092e-01, 1.216e-01, -1.118e-01, 1.907e-01, -8.130e-02, -5.784e-02, 6.783e-02, -3.183e-02, -1.563e-01, 1.382e-01, -1.255e-01, 1.461e-01, 3.380e-02, 8.835e-03, -1.597e-02, -1.284e-02)); + r += mul(s1_1, M4(7.447e-02, -1.840e-02, -1.411e-01, 4.135e-02, -3.556e-02, -2.067e-01, -5.427e-02, -4.274e-02, -9.245e-02, -1.770e-01, -7.212e-02, 7.392e-02, 3.132e-02, 2.501e-02, 8.675e-02, -2.563e-02)); + r += mul(s1_2, M4(-4.532e-02, -7.753e-02, -4.897e-02, 1.012e-02, -3.691e-02, -1.659e-01, -3.360e-02, -1.401e-01, 1.182e-02, 3.324e-02, -1.490e-01, 4.877e-03, -2.668e-02, 2.633e-02, 2.280e-02, -5.413e-02)); + r += mul(s1_3, M4(-6.860e-03, -3.030e-02, -5.868e-02, 1.373e-01, -1.136e-01, 6.083e-02, -1.212e-01, 1.402e-01, 5.197e-02, 3.028e-01, 2.910e-04, 2.725e-01, -1.142e-01, 2.221e-02, 1.983e-02, 4.980e-03)); + r += mul(s1_4, M4(-1.558e-01, 2.200e-02, -7.589e-02, -4.114e-02, -2.075e-02, -2.329e-01, -2.486e-01, 2.982e-01, 5.568e-01, -1.902e-01, -3.293e-01, 2.973e-01, -8.979e-02, -1.734e-01, -8.188e-02, -1.248e-01)); + r += mul(s1_5, M4(-1.136e-01, 2.001e-02, -6.094e-02, -1.164e-01, -9.559e-03, -2.312e-01, -2.666e-02, 5.802e-02, 5.574e-03, -8.042e-02, 1.882e-02, -5.696e-03, 5.486e-02, -2.811e-02, 3.405e-02, 3.376e-02)); + r += mul(s1_6, M4(1.890e-02, 2.390e-01, -1.844e-01, 1.908e-01, 6.778e-02, -2.268e-01, 2.431e-02, -6.474e-02, 1.892e-01, 2.155e-01, 1.174e-02, 1.018e-01, 2.103e-02, 9.542e-03, -5.061e-02, 9.833e-02)); + r += mul(s1_7, M4(2.532e-01, 1.047e-01, -1.373e-01, 6.951e-03, 1.005e-02, -2.509e-01, -1.389e-01, 1.150e-01, 8.669e-02, -9.414e-02, -1.985e-01, -2.291e-02, 3.444e-02, 6.642e-03, 4.162e-02, -1.231e-01)); + r += mul(s1_8, M4(-7.705e-02, 1.206e-01, 2.046e-02, 2.431e-02, 5.501e-02, -1.745e-01, -6.070e-03, 3.750e-02, -2.622e-03, -1.714e-01, -4.185e-02, 8.370e-02, -2.327e-02, 1.082e-01, -3.338e-02, 7.039e-02)); + r += mul(s2_0, M4(2.506e-02, -5.960e-03, 8.603e-03, -6.330e-03, -9.869e-03, 4.860e-03, 4.122e-03, -2.970e-02, -1.211e-01, -1.324e-01, 1.043e-01, -1.156e-01, -2.330e-02, 8.029e-03, -1.386e-02, -1.006e-01)); + r += mul(s2_1, M4(-6.310e-02, 3.873e-02, -8.762e-02, 5.317e-02, -1.089e-01, -9.682e-02, -2.468e-02, -1.545e-02, -5.920e-02, 1.584e-01, -6.268e-03, -7.099e-02, -7.300e-02, 5.048e-02, 6.387e-02, -1.378e-01)); + r += mul(s2_2, M4(-2.160e-02, 1.193e-02, 5.254e-02, -6.813e-02, 2.525e-02, 2.411e-02, 3.671e-02, -4.003e-02, 7.208e-02, -3.762e-02, -1.295e-01, -2.987e-03, -9.501e-03, 2.885e-02, -2.823e-02, -3.649e-02)); + r += mul(s2_3, M4(-1.447e-02, -6.604e-03, 5.087e-02, -5.231e-02, -1.432e-01, 9.517e-03, -2.375e-02, 6.718e-02, -1.024e-01, -1.657e-01, 1.543e-02, -2.130e-02, 7.696e-02, -1.628e-01, -2.175e-02, -6.305e-02)); + r += mul(s2_4, M4(1.241e-01, 3.732e-02, 3.107e-02, 9.781e-02, -1.883e-01, 5.448e-02, -5.869e-02, 3.828e-02, 2.123e-01, 2.982e-01, 3.094e-01, -3.948e-02, 2.509e-01, 6.215e-02, 1.057e-01, 1.183e-01)); + r += mul(s2_5, M4(1.370e-01, 3.386e-03, -1.440e-02, 1.083e-01, 6.201e-02, -8.137e-02, -5.148e-02, -8.041e-02, 7.349e-03, 2.396e-02, 9.658e-02, -6.630e-02, -5.620e-02, 9.297e-02, 1.075e-01, 2.647e-01)); + r += mul(s2_6, M4(-8.195e-03, -1.201e-01, -7.786e-03, 8.643e-02, 1.019e-02, 7.961e-02, -5.549e-03, 1.267e-01, -9.394e-02, -1.329e-01, 4.056e-02, 3.870e-02, -2.269e-02, -9.855e-02, -3.089e-02, -5.161e-02)); + r += mul(s2_7, M4(-4.394e-02, 8.193e-02, 4.097e-02, -2.051e-01, 2.861e-02, 6.525e-02, -2.093e-02, 8.476e-04, -6.580e-02, -1.047e-01, -2.002e-02, -3.528e-01, -5.101e-02, 3.704e-02, -5.583e-02, 1.864e-01)); + r += mul(s2_8, M4(-6.193e-02, 4.235e-02, 1.458e-01, 1.280e-01, 1.397e-03, 6.387e-03, -3.770e-02, 3.617e-02, -4.485e-02, -1.430e-02, -3.923e-02, -2.988e-02, 9.385e-02, 1.037e-01, -1.469e-02, 8.648e-02)); + r += mul(s3_0, M4(7.370e-02, -6.681e-02, 6.857e-03, -1.464e-03, -8.139e-02, -2.321e-02, 2.256e-01, -2.762e-01, 4.326e-03, -9.937e-02, 5.479e-02, -1.248e-01, -1.140e-01, 3.124e-02, -3.539e-02, 5.063e-02)); + r += mul(s3_1, M4(-4.666e-02, -5.328e-02, 4.147e-03, 3.243e-02, -1.825e-01, -1.587e-01, 1.040e-01, -8.371e-02, 7.847e-02, 1.809e-01, 5.909e-02, -2.629e-02, 2.192e-02, -6.512e-03, 7.880e-02, -2.717e-02)); + r += mul(s3_2, M4(2.217e-02, -3.510e-02, 8.875e-02, 2.984e-02, -8.095e-02, 3.588e-02, 2.922e-02, 2.322e-02, 4.776e-02, 1.330e-01, -5.593e-02, 1.860e-01, -2.725e-02, -4.471e-02, 6.853e-02, -2.785e-02)); + r += mul(s3_3, M4(4.651e-03, 2.414e-03, -1.772e-02, -9.891e-02, -5.626e-02, 1.426e-01, -1.825e-03, -2.968e-01, 1.269e-01, -3.594e-03, -8.609e-02, 5.360e-03, 8.408e-02, -3.451e-02, 4.265e-03, -4.175e-02)); + r += mul(s3_4, M4(4.502e-01, -1.098e-01, 1.086e-01, -7.408e-02, -5.760e-02, 1.924e-01, 1.202e-01, -1.614e-01, 2.295e-01, 1.453e-01, 2.048e-01, -1.967e-01, 1.238e-01, 1.250e-01, -9.183e-02, -9.538e-02)); + r += mul(s3_5, M4(-1.430e-01, -4.830e-02, -7.549e-02, -3.340e-03, -5.755e-02, 9.543e-02, 1.986e-01, 1.168e-02, -5.303e-02, 1.102e-01, 2.070e-01, 6.416e-02, 6.153e-02, 1.059e-01, -4.811e-02, 6.984e-02)); + r += mul(s3_6, M4(-2.191e-01, 4.890e-02, -5.366e-02, 1.201e-01, -3.396e-02, 4.261e-03, 9.185e-02, 9.099e-02, 1.899e-02, -8.291e-02, -1.536e-01, -7.678e-02, -7.581e-03, -6.502e-02, 1.899e-02, 2.996e-02)); + r += mul(s3_7, M4(1.050e-01, -6.143e-02, -2.060e-01, -3.645e-01, -4.155e-02, 3.520e-03, -6.472e-02, -4.338e-01, 1.628e-02, -5.007e-02, -5.609e-03, -1.029e-01, 6.029e-02, -2.550e-03, -4.082e-03, 2.602e-01)); + r += mul(s3_8, M4(1.017e-01, 1.053e-02, 2.575e-01, 6.993e-04, -1.868e-02, 6.033e-02, 1.548e-01, -7.071e-02, -2.339e-02, -6.659e-02, 3.672e-02, 4.389e-02, 6.373e-02, 4.674e-02, -5.896e-02, -1.070e-01)); + r += mul(s4_0, M4(1.968e-01, -3.459e-03, -1.691e-01, -4.071e-02, 5.010e-02, 2.857e-02, -7.519e-03, -5.577e-03, -1.646e-01, -8.852e-02, 9.672e-03, -5.369e-03, -3.776e-03, -1.913e-02, 7.260e-03, -1.101e-01)); + r += mul(s4_1, M4(4.915e-02, 2.861e-01, 5.564e-03, 5.088e-01, 4.463e-02, 5.954e-02, -2.309e-02, 5.717e-02, -3.021e-01, -2.191e-01, 6.434e-02, 7.461e-02, -2.205e-02, -4.874e-03, -1.735e-01, 1.253e-01)); + r += mul(s4_2, M4(1.128e-01, 1.075e-01, -2.875e-02, -1.778e-02, 4.533e-02, -3.758e-02, 2.265e-02, -4.932e-02, 3.630e-02, 2.354e-01, -1.175e-03, -3.448e-02, -3.037e-02, -1.978e-02, 8.120e-02, -8.233e-02)); + r += mul(s4_3, M4(8.857e-02, 3.684e-02, 9.267e-03, -7.369e-04, -1.267e-01, 1.045e-01, 8.024e-03, 2.250e-02, -1.073e-01, -1.799e-01, -3.614e-02, -1.036e-01, 2.249e-01, -1.213e-01, -1.413e-01, 6.528e-02)); + r += mul(s4_4, M4(2.018e-02, -7.586e-03, -7.276e-02, 9.245e-02, 2.630e-01, 8.460e-02, -1.289e-01, 1.931e-01, -2.951e-01, -1.197e-01, -1.362e-02, -6.101e-02, -1.125e-01, -7.522e-03, 1.929e-01, 2.081e-01)); + r += mul(s4_5, M4(1.735e-01, -3.837e-02, -2.689e-01, -1.575e-01, -1.147e-02, -5.049e-02, -8.954e-02, -9.647e-03, 1.735e-02, -7.929e-02, -2.055e-01, -1.046e-01, 2.800e-03, -2.230e-01, 5.326e-02, -8.484e-02)); + r += mul(s4_6, M4(9.596e-02, 1.478e-01, 8.386e-02, 4.962e-02, 2.575e-02, 2.522e-02, -9.939e-02, -1.447e-02, -7.036e-02, -1.864e-01, -4.597e-02, -1.242e-01, -1.236e-01, -1.066e-01, 2.954e-02, -2.495e-01)); + r += mul(s4_7, M4(4.021e-02, 8.410e-02, -2.024e-02, 2.625e-01, 2.479e-02, 1.913e-01, -8.467e-02, 2.132e-01, -1.626e-01, -1.470e-01, -1.475e-01, -1.940e-01, 8.031e-02, -3.446e-02, 4.137e-02, 1.510e-02)); + r += mul(s4_8, M4(5.455e-02, 4.836e-02, -2.443e-03, 4.940e-02, -6.281e-02, 5.090e-02, -7.503e-02, 2.358e-01, -1.184e-01, -7.135e-02, -1.001e-01, 1.106e-01, -2.813e-02, 7.361e-02, -1.206e-01, 7.500e-03)); + r += mul(s5_0, M4(1.094e-01, 1.463e-01, -4.544e-02, 1.765e-01, 1.195e-02, -1.165e-02, -1.074e-02, -4.479e-02, -4.199e-03, -6.425e-03, -8.801e-03, 1.340e-02, -1.941e-02, 2.875e-02, -2.974e-02, 6.107e-02)); + r += mul(s5_1, M4(5.405e-02, 1.598e-01, -1.369e-01, -3.004e-02, -3.157e-02, 1.339e-02, 7.332e-02, -3.229e-02, -1.327e-02, 1.182e-02, 4.794e-02, -6.305e-02, 4.248e-02, 7.300e-02, -5.926e-02, 8.302e-02)); + r += mul(s5_2, M4(2.698e-02, -5.484e-02, 3.239e-03, -2.466e-02, 1.411e-02, 3.545e-02, 7.326e-02, -6.638e-02, 3.476e-02, 9.492e-02, -2.676e-02, 6.366e-02, -3.944e-02, 3.457e-02, -1.909e-02, 3.126e-02)); + r += mul(s5_3, M4(1.193e-01, 7.390e-02, 5.802e-02, 6.966e-02, -5.505e-02, 5.759e-02, 2.647e-02, 3.655e-02, 8.248e-02, -3.531e-04, 4.006e-02, -2.483e-02, 1.442e-01, 2.735e-02, -5.585e-03, 1.256e-01)); + r += mul(s5_4, M4(-7.416e-02, 1.455e-02, -3.851e-02, -1.117e-01, 5.953e-02, 6.274e-02, 2.311e-01, 1.762e-01, -9.020e-02, 2.775e-02, -9.684e-02, 4.637e-03, 7.744e-02, 1.524e-01, -4.357e-02, 1.402e-01)); + r += mul(s5_5, M4(1.048e-02, -6.540e-03, 1.283e-02, 1.530e-02, -7.299e-02, -8.799e-02, 1.209e-01, -1.417e-01, -1.657e-01, 7.952e-02, 9.619e-02, 2.051e-02, -9.300e-02, -8.988e-02, -4.284e-02, -2.833e-02)); + r += mul(s5_6, M4(1.059e-02, -9.975e-03, -1.002e-02, -5.971e-02, -1.522e-02, -1.066e-01, 2.274e-02, 2.326e-02, 6.018e-03, -3.394e-02, 1.579e-02, 6.317e-03, 4.164e-03, 9.888e-02, -1.304e-02, -7.333e-02)); + r += mul(s5_7, M4(-2.437e-02, 5.469e-02, 3.865e-02, 2.620e-02, -5.758e-02, -2.490e-02, -4.255e-02, -1.501e-01, 5.814e-03, -2.612e-02, -7.788e-02, -1.049e-01, -3.619e-02, -1.124e-02, -5.754e-02, -1.702e-01)); + r += mul(s5_8, M4(7.789e-02, -5.184e-03, -1.090e-01, -9.938e-02, -4.395e-02, -8.541e-02, -1.900e-02, 1.958e-01, -5.825e-02, -1.991e-02, 1.695e-01, 4.282e-02, 4.553e-02, 9.582e-03, 4.027e-02, 8.375e-02)); + r += mul(s6_0, M4(-4.620e-02, 3.979e-02, -7.421e-03, -4.636e-03, -4.301e-02, -1.731e-03, -8.134e-02, -4.580e-02, 8.641e-02, -1.178e-02, -3.114e-02, 2.985e-02, 8.926e-03, -8.501e-02, 1.403e-01, -8.929e-02)); + r += mul(s6_1, M4(8.552e-03, 1.045e-01, 2.590e-02, -5.385e-02, 1.899e-01, 3.053e-02, 3.391e-02, 8.761e-02, -8.812e-02, 1.820e-02, 2.085e-03, 7.044e-02, -8.843e-03, 3.972e-02, 2.005e-01, -9.386e-02)); + r += mul(s6_2, M4(-3.533e-02, 8.881e-02, 7.908e-02, -1.673e-02, 2.972e-01, 5.909e-02, 1.822e-01, 7.794e-03, 3.495e-02, 8.208e-03, -8.089e-03, 3.064e-02, -1.182e-01, -3.028e-02, 5.854e-03, 2.649e-02)); + r += mul(s6_3, M4(4.463e-02, 6.808e-02, -1.320e-02, 7.349e-02, 1.047e-01, 3.442e-02, 5.491e-02, 1.766e-01, 2.378e-01, 5.525e-02, -1.079e-03, 7.857e-02, -1.323e-01, -1.197e-02, -4.535e-02, 5.279e-02)); + r += mul(s6_4, M4(4.852e-03, -1.891e-01, -8.620e-02, -7.778e-02, -8.466e-02, -1.193e-01, -3.509e-01, -4.832e-02, 2.248e-02, 5.971e-02, -1.411e-01, -1.547e-01, 1.189e-01, -2.901e-02, -3.536e-01, -1.434e-01)); + r += mul(s6_5, M4(5.967e-04, -8.594e-03, 2.770e-02, 2.773e-02, -6.823e-02, 2.855e-02, 4.400e-03, 3.281e-03, -7.049e-02, 7.300e-02, 1.679e-02, -4.129e-02, 3.537e-02, -7.997e-02, 1.755e-01, 7.430e-02)); + r += mul(s6_6, M4(2.333e-02, 7.693e-02, -1.168e-02, -5.052e-02, 2.763e-01, -8.145e-02, -2.557e-02, 5.789e-02, -1.378e-01, 3.910e-02, -2.735e-02, -1.627e-01, 1.390e-02, 9.601e-02, 1.422e-02, 1.167e-01)); + r += mul(s6_7, M4(-5.161e-02, 4.514e-02, 4.401e-02, -4.723e-02, 8.271e-02, -1.165e-02, -1.094e-01, -1.951e-01, 1.299e-01, -1.491e-01, -1.073e-02, -2.226e-01, 3.247e-02, 1.319e-01, -5.319e-02, 1.879e-01)); + r += mul(s6_8, M4(1.413e-02, 8.114e-02, 8.126e-02, 4.824e-02, -5.459e-02, 1.786e-01, 2.315e-01, 3.483e-01, -6.537e-02, -1.749e-02, -9.204e-02, 8.909e-02, 1.182e-01, -3.454e-01, -2.984e-02, -3.699e-02)); + r += mul(s7_0, M4(-5.222e-02, -1.666e-02, 3.111e-03, -1.269e-01, -1.162e-01, -1.072e-01, 1.369e-02, -1.421e-01, -4.234e-02, -5.603e-02, 1.896e-02, 3.023e-02, 2.745e-02, -1.633e-02, 7.530e-03, -2.612e-03)); + r += mul(s7_1, M4(-7.186e-02, 1.331e-01, 1.729e-01, 3.696e-02, -3.435e-02, -5.384e-02, 1.712e-01, -4.012e-02, -2.510e-01, 6.177e-03, -1.304e-01, -3.065e-02, 8.131e-02, -2.031e-02, 5.018e-03, 1.444e-02)); + r += mul(s7_2, M4(1.941e-01, -4.139e-02, 4.032e-01, -2.533e-01, 3.842e-02, 7.539e-02, -3.439e-02, 2.617e-03, -1.251e-04, 3.135e-03, -1.139e-01, 4.916e-02, -2.644e-02, -1.615e-01, -1.998e-02, 3.684e-02)); + r += mul(s7_3, M4(1.724e-01, 7.871e-02, -2.757e-01, -1.913e-01, 1.702e-02, -1.198e-01, -1.135e-01, 5.146e-02, 1.594e-01, 8.131e-02, -1.323e-01, 7.771e-02, -1.266e-02, 3.053e-02, 6.846e-02, 2.713e-03)); + r += mul(s7_4, M4(-8.568e-02, 2.638e-02, 1.671e-01, -4.321e-02, -4.085e-02, -5.166e-02, -5.991e-02, -2.253e-02, 2.570e-01, 1.164e-01, -4.512e-02, 1.597e-01, -2.795e-02, 1.080e-01, -1.880e-01, 3.372e-02)); + r += mul(s7_5, M4(1.639e-01, -1.249e-01, 3.916e-02, -3.251e-01, 1.722e-01, 5.592e-02, 2.117e-02, 1.050e-01, 8.313e-02, 7.693e-02, 2.470e-01, 1.904e-01, 6.296e-02, -1.557e-01, 1.590e-01, 3.042e-02)); + r += mul(s7_6, M4(5.130e-02, 2.760e-01, -1.234e-01, -3.254e-01, -5.325e-03, 5.583e-02, -1.817e-02, 3.850e-02, 1.723e-01, 1.316e-01, 1.474e-01, 4.388e-02, -4.979e-03, -5.402e-02, 2.037e-02, -1.502e-02)); + r += mul(s7_7, M4(9.497e-02, 4.342e-02, 1.315e-01, 6.205e-02, -3.387e-02, 9.014e-02, -5.622e-02, -8.738e-03, -2.491e-01, -2.529e-01, 1.265e-01, -1.339e-01, -7.270e-02, -4.320e-02, -6.492e-02, -2.869e-01)); + r += mul(s7_8, M4(7.856e-02, 5.496e-02, -1.532e-01, -2.587e-01, 1.621e-02, 4.016e-02, 6.799e-02, -5.266e-02, 3.437e-02, -4.965e-02, -1.842e-01, -1.572e-01, -9.818e-02, -6.989e-02, 1.409e-01, -9.155e-02)); + r += V4(1.842e-03, 2.684e-02, -2.388e-02, 1.341e-02); + return r; +} + +V4 f3(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(1.169e-02, 4.090e-02, 2.344e-02, 4.020e-02, 9.370e-02, -6.211e-03, 1.759e-02, -8.241e-02, -5.080e-02, -8.047e-03, -6.565e-03, 1.017e-01, -2.722e-01, -7.091e-02, -4.424e-02, 2.552e-02)); + r += mul(s0_1, M4(2.063e-02, 7.496e-02, -2.114e-03, 8.604e-02, -1.607e-01, -1.300e-02, -6.959e-02, 1.666e-02, 1.500e-01, 2.465e-03, -1.725e-02, 5.064e-02, 1.482e-01, -1.181e-01, 9.553e-02, -1.207e-01)); + r += mul(s0_2, M4(1.909e-01, -3.339e-02, -9.496e-03, 7.458e-02, -4.476e-03, 4.041e-02, -1.012e-03, 4.225e-02, 2.620e-02, -9.565e-02, 7.120e-02, -3.336e-02, -2.538e-01, -5.166e-02, -2.399e-02, -2.251e-01)); + r += mul(s0_3, M4(-1.458e-01, -5.764e-02, 3.750e-02, 2.984e-02, -1.128e-02, -1.041e-02, -5.174e-02, 7.210e-03, -1.559e-01, -8.793e-03, -5.447e-02, 7.778e-03, 1.510e-01, -3.397e-01, 5.370e-02, -9.013e-02)); + r += mul(s0_4, M4(-1.753e-01, -4.923e-02, 6.602e-02, -1.124e-02, 7.038e-02, -9.715e-02, -1.053e-01, -8.512e-02, -1.163e-02, -1.973e-02, 1.249e-02, 1.401e-02, 8.067e-01, -1.868e+00, 1.319e+00, -1.978e-01)); + r += mul(s0_5, M4(8.049e-02, -3.326e-02, 4.174e-02, -5.696e-02, -9.918e-02, 3.153e-02, -4.987e-02, 1.879e-02, -1.179e-01, 1.669e-03, 2.144e-02, 1.086e-01, -5.053e-01, -2.559e-01, -8.946e-02, 1.051e-01)); + r += mul(s0_6, M4(-1.396e-01, -4.532e-02, -5.139e-02, 5.597e-02, 1.531e-01, 7.081e-02, 1.311e-01, -8.032e-02, 1.066e-01, -3.651e-02, -1.540e-02, -3.857e-02, -2.438e-01, -1.575e-01, -1.553e-01, 8.916e-02)); + r += mul(s0_7, M4(6.295e-02, 1.070e-01, 1.808e-02, 5.307e-02, 2.205e-02, -3.011e-02, -2.873e-03, 5.554e-02, -1.650e-02, -7.347e-02, -3.139e-02, -7.255e-02, -7.705e-02, -2.776e-01, 1.386e-01, 2.273e-01)); + r += mul(s0_8, M4(5.068e-02, -2.934e-02, -6.390e-02, -3.529e-03, 2.496e-02, -5.950e-02, 9.848e-03, -4.895e-02, 4.320e-03, 2.137e-02, 8.088e-03, -1.885e-02, 3.472e-02, 7.456e-02, -9.062e-02, -1.616e-01)); + r += mul(s1_0, M4(-6.916e-02, 1.117e-01, 1.061e-02, -2.858e-02, -1.394e-02, -2.206e-02, 8.983e-02, -9.641e-02, 3.806e-02, 2.601e-02, 3.293e-03, -3.597e-03, -1.863e-02, 1.859e-02, 1.415e-02, 6.731e-03)); + r += mul(s1_1, M4(-8.516e-02, 8.850e-02, -1.573e-02, 2.316e-01, -1.692e-01, 8.693e-02, -1.889e-02, 5.133e-03, -7.009e-02, -4.160e-02, -5.661e-02, 1.357e-01, 4.354e-02, -2.824e-02, -1.820e-02, 5.339e-02)); + r += mul(s1_2, M4(1.563e-01, 4.841e-02, 1.820e-02, 2.156e-01, 2.081e-02, 1.728e-02, 6.492e-02, -6.011e-06, 1.238e-01, -1.890e-01, 5.422e-02, -1.803e-02, 3.738e-02, -3.699e-03, -3.440e-02, -4.935e-02)); + r += mul(s1_3, M4(-3.771e-02, 1.027e-02, 6.767e-02, 2.648e-02, 4.782e-03, -1.468e-01, 8.528e-02, -1.018e-01, 1.828e-01, 9.974e-02, 1.174e-01, -1.621e-01, -4.533e-02, -1.360e-01, 1.073e-01, -2.108e-02)); + r += mul(s1_4, M4(-2.093e-01, -8.418e-03, -1.582e-01, -1.408e-01, 2.320e-01, -6.685e-05, 8.601e-02, 3.419e-02, -3.267e-03, -2.444e-01, 5.275e-02, -1.274e-01, 3.212e-02, -5.614e-02, 1.082e-01, -5.123e-02)); + r += mul(s1_5, M4(3.014e-04, 1.183e-02, -8.981e-03, -7.106e-03, -7.303e-02, -6.706e-02, 8.619e-02, 2.726e-02, 2.377e-01, -1.732e-01, 6.783e-03, -8.318e-02, -8.778e-03, -6.088e-02, 3.059e-02, 6.358e-02)); + r += mul(s1_6, M4(-1.735e-01, -1.492e-02, -4.869e-02, 1.349e-02, 4.406e-02, -5.447e-02, 1.870e-01, -2.048e-01, 2.230e-01, 6.500e-02, -4.847e-02, 1.976e-03, -1.086e-01, 1.539e-02, -4.601e-02, 6.654e-02)); + r += mul(s1_7, M4(-4.916e-02, 3.111e-01, -2.172e-01, -2.984e-02, 8.054e-02, -9.696e-02, 1.715e-01, 1.023e-01, -3.379e-01, -2.222e-01, -1.553e-01, 2.824e-01, 6.686e-02, 3.219e-02, -3.475e-02, 7.468e-03)); + r += mul(s1_8, M4(1.450e-01, 1.175e-01, -3.282e-01, -2.399e-01, -3.023e-02, -1.193e-01, 6.894e-02, -2.026e-01, 1.794e-02, -8.950e-02, 3.820e-02, 5.242e-02, -2.527e-02, -2.720e-02, -3.382e-02, -4.500e-02)); + r += mul(s2_0, M4(-3.438e-02, 5.057e-02, 3.839e-03, -2.960e-02, 3.820e-02, -3.512e-02, 2.248e-02, -7.140e-02, 1.783e-01, -2.689e-02, -5.086e-02, 1.715e-02, -2.994e-02, -2.400e-02, 5.800e-02, -4.431e-02)); + r += mul(s2_1, M4(-1.055e-01, -5.624e-02, 1.805e-02, -4.016e-02, -1.477e-01, 1.458e-02, -1.010e-01, 1.892e-02, 2.247e-01, 1.387e-01, -6.506e-03, 1.135e-01, -1.305e-01, -4.718e-02, -5.146e-02, -5.844e-02)); + r += mul(s2_2, M4(-1.991e-02, 4.664e-02, -2.422e-02, 1.581e-02, 1.908e-02, -1.695e-02, 2.632e-02, 7.893e-03, -1.246e-01, -1.096e-01, 2.398e-02, 3.730e-02, -5.910e-02, 4.511e-02, -1.959e-02, -1.711e-02)); + r += mul(s2_3, M4(6.776e-02, -2.936e-02, -3.144e-02, -1.066e-01, 1.442e-01, -2.189e-02, 1.530e-01, 5.580e-02, -1.258e-01, -1.123e-01, -5.577e-02, -5.266e-02, -1.371e-01, -6.798e-02, 7.172e-02, 7.116e-02)); + r += mul(s2_4, M4(1.143e-01, 2.555e-02, -5.947e-02, -6.223e-02, 9.015e-02, 7.343e-02, -5.756e-02, 2.320e-02, -1.310e-01, 3.643e-01, -3.327e-01, 2.611e-02, 3.383e-01, 1.516e-01, -8.123e-02, 1.385e-01)); + r += mul(s2_5, M4(-1.150e-01, -2.017e-01, 6.345e-02, -4.715e-02, -5.644e-02, -3.207e-02, 5.612e-02, 7.632e-02, 2.011e-02, 2.242e-01, -1.096e-01, 7.068e-02, 1.181e-01, 1.197e-01, 2.674e-02, -4.620e-02)); + r += mul(s2_6, M4(-9.551e-02, -9.498e-02, 2.679e-02, -8.821e-02, 2.767e-02, 7.976e-03, 5.204e-02, 1.872e-02, -1.089e-01, -4.498e-02, -6.061e-02, 8.602e-02, -9.359e-02, -4.350e-03, 3.876e-02, -8.969e-03)); + r += mul(s2_7, M4(-8.954e-02, -2.433e-01, 1.061e-01, -1.242e-01, -6.749e-02, 1.916e-02, -3.863e-03, 4.032e-02, -3.083e-02, -1.311e-01, -8.384e-02, 4.916e-02, 2.500e-01, 2.014e-02, 1.214e-01, 1.388e-01)); + r += mul(s2_8, M4(4.107e-03, 9.941e-02, 3.767e-02, 7.627e-02, -5.683e-02, -6.008e-04, -7.914e-03, -3.822e-02, -5.795e-02, 4.685e-02, -4.567e-02, -1.056e-02, -4.484e-02, -3.449e-02, 1.140e-01, 3.265e-02)); + r += mul(s3_0, M4(-2.306e-02, 2.921e-02, -3.826e-02, 8.888e-02, -7.899e-02, -2.019e-02, -6.082e-02, -1.194e-01, -7.656e-02, -1.032e-02, -1.433e-02, 1.198e-01, 3.798e-02, -3.611e-02, 1.199e-01, -9.537e-02)); + r += mul(s3_1, M4(2.121e-02, -9.145e-02, 8.246e-02, 9.169e-03, -4.139e-01, 6.092e-02, -8.756e-02, 8.627e-03, 1.045e-01, -3.856e-02, 5.856e-02, -1.957e-01, 7.316e-02, -6.812e-02, 3.636e-03, 6.997e-03)); + r += mul(s3_2, M4(2.658e-02, 7.785e-02, -3.263e-02, -1.520e-02, 1.612e-01, 4.608e-02, -7.045e-02, -7.303e-03, -1.109e-02, 1.272e-02, -3.647e-02, -3.375e-02, -7.386e-02, -6.704e-02, 1.301e-02, -2.946e-03)); + r += mul(s3_3, M4(-1.009e-01, 1.465e-01, -2.605e-02, 9.497e-02, -1.340e-01, -1.414e-01, -3.507e-02, 1.428e-01, -2.289e-01, -1.389e-02, 5.820e-02, -1.047e-01, -1.330e-01, 1.576e-02, 7.398e-02, -6.534e-02)); + r += mul(s3_4, M4(-4.357e-01, 7.855e-02, -2.403e-01, 1.323e-01, -4.297e-01, 4.858e-02, -2.305e-01, 1.827e-01, -1.741e-01, 1.311e-01, -7.600e-02, -2.465e-02, -8.542e-02, 8.355e-02, -2.918e-01, -6.781e-02)); + r += mul(s3_5, M4(8.516e-02, 5.179e-02, -4.071e-02, 2.149e-01, 3.137e-02, 1.405e-01, -1.702e-01, 1.147e-01, -1.077e-02, 2.508e-01, -9.565e-02, -2.340e-02, -5.770e-03, -2.109e-02, -2.620e-02, -2.459e-02)); + r += mul(s3_6, M4(1.820e-01, 5.519e-02, -4.102e-02, -2.981e-02, -9.297e-02, 4.135e-02, -1.152e-01, 1.431e-01, 1.658e-01, 1.139e-03, 8.223e-02, -3.856e-02, 3.631e-02, -3.451e-02, 7.224e-02, 9.099e-02)); + r += mul(s3_7, M4(2.301e-01, -1.471e-02, 3.288e-02, -7.237e-03, 2.109e-01, 2.026e-01, -2.288e-01, -2.980e-02, 9.537e-02, -4.301e-02, 1.508e-01, -4.254e-02, 6.804e-02, -3.899e-02, 4.478e-02, -1.037e-01)); + r += mul(s3_8, M4(-4.881e-02, 1.157e-01, 3.404e-02, -3.252e-03, 6.786e-02, -5.432e-02, -9.315e-02, -6.633e-02, -3.822e-02, 1.650e-02, 4.145e-02, 5.647e-02, -1.303e-01, -1.228e-01, 9.147e-02, 1.600e-01)); + r += mul(s4_0, M4(-1.691e-01, 2.079e-02, -7.759e-02, 4.724e-02, -2.213e-02, 5.189e-02, 9.549e-04, 5.798e-03, 8.639e-02, -4.559e-03, 6.095e-02, 4.818e-02, -1.305e-01, -5.503e-02, -1.809e-02, 9.957e-03)); + r += mul(s4_1, M4(1.043e-01, 6.596e-02, -2.271e-01, -1.330e-01, -2.238e-02, 6.202e-02, 2.146e-02, -2.418e-03, -2.807e-01, 6.046e-02, 1.510e-01, 8.035e-02, -1.384e-01, 2.720e-02, -5.025e-02, -7.221e-02)); + r += mul(s4_2, M4(2.902e-02, 5.965e-02, -8.962e-02, -1.041e-01, -3.013e-02, 7.582e-03, -5.418e-02, 1.194e-02, -2.878e-02, 1.109e-02, 6.175e-02, 2.218e-01, -3.740e-02, 7.279e-02, 6.343e-02, -1.504e-01)); + r += mul(s4_3, M4(2.594e-03, 6.859e-02, -8.585e-02, -1.093e-01, 1.127e-01, 2.987e-02, -4.764e-03, -7.266e-02, -2.309e-01, -8.483e-02, 2.689e-02, 9.467e-02, -1.932e-01, 3.025e-02, -1.774e-01, 2.257e-02)); + r += mul(s4_4, M4(-3.380e-02, -2.715e-01, 2.109e-01, 1.939e-01, 3.544e-01, 1.760e-01, 1.256e-01, 3.389e-01, -1.171e-01, 8.500e-02, -7.548e-03, -6.249e-03, 1.652e-01, 2.683e-01, 1.176e-01, 1.076e-01)); + r += mul(s4_5, M4(3.852e-02, 5.116e-02, 7.302e-02, 2.183e-02, -6.533e-02, -1.307e-01, -3.048e-02, -5.867e-02, 4.960e-02, -1.511e-01, 1.733e-01, 9.017e-02, -5.388e-02, -9.929e-02, 8.055e-02, 7.235e-03)); + r += mul(s4_6, M4(1.582e-02, 1.934e-02, -1.586e-02, 5.434e-02, 5.866e-02, 6.706e-02, -7.785e-02, -9.925e-03, -1.298e-01, -3.682e-02, 1.045e-02, -2.375e-02, 5.247e-02, 6.268e-02, 3.628e-02, 1.363e-01)); + r += mul(s4_7, M4(6.417e-02, 9.830e-02, -5.222e-02, -1.481e-01, 4.089e-02, -2.354e-02, -1.246e-01, -1.849e-01, 7.210e-02, -1.505e-01, 4.560e-02, -3.750e-02, 9.564e-02, 1.137e-01, 6.895e-02, -3.109e-02)); + r += mul(s4_8, M4(-8.126e-03, -1.664e-02, 4.428e-02, 3.837e-02, -6.828e-02, 6.690e-02, -5.074e-02, 3.574e-02, 4.772e-02, -3.342e-03, -2.924e-02, -1.893e-03, 4.866e-03, -4.318e-02, 1.736e-03, -3.455e-02)); + r += mul(s5_0, M4(-8.940e-02, 7.315e-02, -5.067e-02, 3.852e-02, 6.637e-02, 6.184e-02, -5.849e-02, 4.301e-02, -5.232e-02, 6.418e-03, 2.258e-02, 5.604e-02, -4.454e-02, -1.157e-03, 1.682e-03, 9.476e-03)); + r += mul(s5_1, M4(8.366e-02, 6.140e-03, -6.720e-02, -1.008e-01, -8.472e-02, 1.509e-02, -1.952e-02, -1.084e-02, 1.948e-02, 8.458e-02, -1.669e-03, 4.498e-03, -2.013e-01, -1.214e-01, -7.837e-03, -7.837e-02)); + r += mul(s5_2, M4(-7.940e-02, 2.387e-02, -6.337e-02, 5.181e-02, -1.316e-01, 3.389e-02, -5.279e-02, 2.279e-02, -1.102e-01, -7.101e-02, -9.703e-03, 2.051e-02, 2.353e-02, -4.424e-02, 1.273e-02, -9.692e-02)); + r += mul(s5_3, M4(5.557e-02, 7.451e-02, 3.178e-03, -4.212e-02, 3.122e-02, -2.396e-02, -8.966e-02, -9.927e-04, 2.508e-02, -5.133e-03, 8.334e-03, -2.729e-02, -5.904e-02, 3.528e-02, -9.926e-02, -1.284e-01)); + r += mul(s5_4, M4(1.171e-01, -1.991e-02, 3.233e-02, -1.152e-01, -2.104e-02, 8.669e-02, -2.160e-01, -1.384e-02, -3.869e-02, -8.916e-02, -4.776e-02, -5.731e-02, -1.426e-02, -1.452e-01, -9.362e-02, 5.315e-03)); + r += mul(s5_5, M4(-9.686e-02, 2.843e-02, -1.125e-03, 2.183e-02, -9.590e-02, -1.502e-01, 4.370e-02, -1.739e-01, -6.316e-02, -1.170e-01, 1.243e-01, -1.580e-01, 1.111e-01, -1.091e-01, 2.264e-02, -1.214e-02)); + r += mul(s5_6, M4(-5.885e-02, -3.099e-02, 1.093e-03, 5.912e-02, -4.486e-02, 3.087e-02, -2.398e-02, -6.617e-02, 1.619e-03, -1.174e-02, 1.940e-02, -6.470e-02, 1.710e-01, 3.624e-02, 4.390e-02, 5.356e-02)); + r += mul(s5_7, M4(-7.138e-02, 6.516e-02, -3.867e-02, 2.541e-02, 1.851e-01, -7.945e-02, 6.494e-02, -2.329e-01, 3.373e-02, -5.117e-02, 4.693e-02, -1.827e-02, -7.217e-02, -7.580e-02, 7.111e-02, 1.205e-01)); + r += mul(s5_8, M4(-4.836e-02, 7.135e-03, 8.069e-03, 2.399e-02, -7.394e-03, -3.601e-02, 1.617e-01, -7.325e-02, 1.779e-02, 1.871e-02, -6.577e-03, 5.262e-02, 3.870e-02, -1.992e-02, 4.046e-03, 8.874e-02)); + r += mul(s6_0, M4(-9.499e-02, 1.140e-02, -2.421e-02, 2.122e-02, -2.021e-01, -3.334e-02, 3.182e-02, -1.274e-01, -8.233e-03, -2.705e-02, -5.592e-03, 3.303e-02, 4.097e-02, -5.783e-02, 1.346e-01, -3.961e-02)); + r += mul(s6_1, M4(6.091e-02, 6.245e-02, -4.442e-02, 1.453e-02, 2.683e-01, 5.106e-02, -4.170e-02, 8.964e-02, -5.980e-02, -1.027e-01, 2.440e-02, -1.843e-01, -6.987e-02, 1.362e-01, 2.607e-02, 1.640e-01)); + r += mul(s6_2, M4(-1.758e-02, 4.428e-02, -2.778e-02, 3.710e-02, -3.928e-02, -1.444e-01, 8.485e-02, -2.627e-01, -8.773e-03, -4.307e-02, 3.662e-02, -4.266e-02, -1.248e-01, -4.775e-02, 1.386e-01, -4.849e-02)); + r += mul(s6_3, M4(2.991e-02, 1.300e-02, -3.722e-02, -1.127e-02, -6.081e-02, -6.664e-02, 2.307e-02, -1.537e-01, -9.816e-02, 6.137e-02, -1.776e-01, -7.971e-02, 1.737e-01, 1.321e-01, 1.894e-02, 6.328e-02)); + r += mul(s6_4, M4(2.797e-01, -4.712e-02, 9.233e-02, 1.622e-02, -3.759e-01, -3.643e-01, -3.666e-01, -2.763e-01, -1.820e-01, -9.981e-02, -1.633e-01, 5.873e-02, 3.666e-01, 1.277e-02, 2.019e-01, 7.803e-02)); + r += mul(s6_5, M4(2.367e-02, -8.355e-02, -4.754e-03, -4.127e-02, -2.992e-02, -2.973e-02, -2.183e-01, -1.935e-01, 4.919e-02, 1.440e-01, -1.552e-01, 1.123e-02, 3.556e-02, -2.278e-01, 7.747e-02, -2.039e-01)); + r += mul(s6_6, M4(2.708e-02, -4.988e-02, 1.906e-02, 6.498e-02, -6.744e-02, -6.364e-02, -6.158e-02, -1.413e-01, 5.636e-02, 2.833e-02, -2.499e-02, -5.730e-02, 2.125e-02, 4.344e-02, -3.250e-02, -1.461e-03)); + r += mul(s6_7, M4(2.917e-02, 5.699e-02, -9.029e-03, 5.299e-03, -7.207e-03, -3.742e-04, -2.350e-01, -5.041e-01, -5.733e-02, -1.208e-01, -1.018e-01, -8.049e-02, 6.673e-02, 1.619e-02, 5.462e-02, -9.444e-02)); + r += mul(s6_8, M4(-2.370e-02, 4.235e-02, -9.635e-03, 7.599e-02, -5.283e-02, 1.118e-01, 8.985e-04, -2.380e-01, 5.308e-02, -4.938e-02, -2.485e-02, -4.421e-02, -1.214e-01, -1.494e-01, 1.557e-01, 1.011e-01)); + r += mul(s7_0, M4(8.055e-03, -1.224e-01, 8.803e-02, -1.356e-01, -2.769e-02, -8.317e-02, 5.839e-02, 8.470e-03, 4.342e-02, -1.724e-02, 2.101e-02, -9.978e-02, 1.580e-02, 7.303e-03, -6.736e-03, -2.369e-02)); + r += mul(s7_1, M4(2.547e-01, 3.471e-01, 1.057e-01, 2.483e-02, 5.170e-02, 7.626e-02, 3.029e-02, 1.112e-01, -1.420e-01, 6.397e-03, 8.291e-02, 2.148e-02, 4.163e-02, 3.154e-02, 3.481e-04, -2.553e-02)); + r += mul(s7_2, M4(-3.976e-02, 1.646e-01, 1.366e-02, -6.070e-02, 3.627e-02, -4.193e-02, 3.261e-02, -1.633e-02, 7.845e-02, 1.841e-02, 4.332e-02, 1.388e-01, -9.223e-02, -5.002e-02, 7.201e-02, -1.203e-01)); + r += mul(s7_3, M4(-2.471e-01, -1.349e-01, -1.073e-01, -1.309e-01, -6.461e-02, 1.575e-02, -5.407e-03, -9.095e-04, 7.147e-02, -5.513e-02, -9.230e-02, -9.799e-02, 1.026e-01, 3.824e-02, -5.407e-02, 3.357e-02)); + r += mul(s7_4, M4(2.224e-01, 3.955e-01, 6.146e-01, -3.382e-01, -6.338e-04, 4.467e-02, 1.799e-02, 1.858e-01, -6.463e-02, -2.434e-02, -5.017e-02, -6.841e-02, 8.690e-02, 7.333e-02, -5.250e-02, -1.024e-01)); + r += mul(s7_5, M4(-5.744e-03, -7.747e-02, -1.165e-01, 6.425e-02, 7.534e-04, 2.417e-02, 3.699e-02, -1.184e-03, 1.170e-01, 1.713e-01, -7.106e-02, -7.859e-02, -5.088e-02, 1.855e-02, 8.254e-03, 1.640e-02)); + r += mul(s7_6, M4(2.489e-01, -1.301e-02, 8.608e-02, -8.025e-03, 1.432e-01, -1.112e-02, 3.130e-02, 4.804e-02, 4.789e-02, 3.900e-02, 5.997e-02, -6.963e-02, -1.209e-01, -2.880e-02, -5.815e-02, -1.188e-02)); + r += mul(s7_7, M4(6.111e-02, 1.857e-01, -4.093e-02, -2.237e-01, -1.180e-01, -3.436e-03, -5.388e-02, 3.630e-02, -9.795e-02, -5.991e-02, 1.480e-01, -4.211e-02, -5.772e-02, -7.684e-03, -8.719e-02, -9.107e-02)); + r += mul(s7_8, M4(1.557e-01, -1.302e-02, 3.695e-02, -1.460e-01, 7.050e-02, 6.253e-02, 2.880e-02, 2.843e-02, 4.670e-04, -1.595e-01, 8.835e-02, -6.949e-02, 1.607e-02, 1.309e-03, -1.750e-02, -3.881e-02)); + r += V4(7.646e-03, -3.306e-02, 1.535e-02, 6.065e-03); + return r; +} + +void Pass4(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = Rmp8x8(tid.x) + blockStart; + uint2 size = GetInputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = (gxy + 0.5) * pt; + + V4 s0_0 = l0(-1.0, -1.0); + V4 s0_1 = l0(0.0, -1.0); + V4 s0_2 = l0(1.0, -1.0); + V4 s0_3 = l0(-1.0, 0.0); + V4 s0_4 = l0(0.0, 0.0); + V4 s0_5 = l0(1.0, 0.0); + V4 s0_6 = l0(-1.0, 1.0); + V4 s0_7 = l0(0.0, 1.0); + V4 s0_8 = l0(1.0, 1.0); + V4 s1_0 = -max(-s0_0, 0.0); + V4 s1_1 = -max(-s0_1, 0.0); + V4 s1_2 = -max(-s0_2, 0.0); + V4 s1_3 = -max(-s0_3, 0.0); + V4 s1_4 = -max(-s0_4, 0.0); + V4 s1_5 = -max(-s0_5, 0.0); + V4 s1_6 = -max(-s0_6, 0.0); + V4 s1_7 = -max(-s0_7, 0.0); + V4 s1_8 = -max(-s0_8, 0.0); + s0_0 = max(s0_0, 0.0); + s0_1 = max(s0_1, 0.0); + s0_2 = max(s0_2, 0.0); + s0_3 = max(s0_3, 0.0); + s0_4 = max(s0_4, 0.0); + s0_5 = max(s0_5, 0.0); + s0_6 = max(s0_6, 0.0); + s0_7 = max(s0_7, 0.0); + s0_8 = max(s0_8, 0.0); + + V4 s2_0 = l1(-1.0, -1.0); + V4 s2_1 = l1(0.0, -1.0); + V4 s2_2 = l1(1.0, -1.0); + V4 s2_3 = l1(-1.0, 0.0); + V4 s2_4 = l1(0.0, 0.0); + V4 s2_5 = l1(1.0, 0.0); + V4 s2_6 = l1(-1.0, 1.0); + V4 s2_7 = l1(0.0, 1.0); + V4 s2_8 = l1(1.0, 1.0); + V4 s3_0 = -max(-s2_0, 0.0); + V4 s3_1 = -max(-s2_1, 0.0); + V4 s3_2 = -max(-s2_2, 0.0); + V4 s3_3 = -max(-s2_3, 0.0); + V4 s3_4 = -max(-s2_4, 0.0); + V4 s3_5 = -max(-s2_5, 0.0); + V4 s3_6 = -max(-s2_6, 0.0); + V4 s3_7 = -max(-s2_7, 0.0); + V4 s3_8 = -max(-s2_8, 0.0); + s2_0 = max(s2_0, 0.0); + s2_1 = max(s2_1, 0.0); + s2_2 = max(s2_2, 0.0); + s2_3 = max(s2_3, 0.0); + s2_4 = max(s2_4, 0.0); + s2_5 = max(s2_5, 0.0); + s2_6 = max(s2_6, 0.0); + s2_7 = max(s2_7, 0.0); + s2_8 = max(s2_8, 0.0); + + V4 s4_0 = l2(-1.0, -1.0); + V4 s4_1 = l2(0.0, -1.0); + V4 s4_2 = l2(1.0, -1.0); + V4 s4_3 = l2(-1.0, 0.0); + V4 s4_4 = l2(0.0, 0.0); + V4 s4_5 = l2(1.0, 0.0); + V4 s4_6 = l2(-1.0, 1.0); + V4 s4_7 = l2(0.0, 1.0); + V4 s4_8 = l2(1.0, 1.0); + V4 s5_0 = -max(-s4_0, 0.0); + V4 s5_1 = -max(-s4_1, 0.0); + V4 s5_2 = -max(-s4_2, 0.0); + V4 s5_3 = -max(-s4_3, 0.0); + V4 s5_4 = -max(-s4_4, 0.0); + V4 s5_5 = -max(-s4_5, 0.0); + V4 s5_6 = -max(-s4_6, 0.0); + V4 s5_7 = -max(-s4_7, 0.0); + V4 s5_8 = -max(-s4_8, 0.0); + s4_0 = max(s4_0, 0.0); + s4_1 = max(s4_1, 0.0); + s4_2 = max(s4_2, 0.0); + s4_3 = max(s4_3, 0.0); + s4_4 = max(s4_4, 0.0); + s4_5 = max(s4_5, 0.0); + s4_6 = max(s4_6, 0.0); + s4_7 = max(s4_7, 0.0); + s4_8 = max(s4_8, 0.0); + + V4 s6_0 = l3(-1.0, -1.0); + V4 s6_1 = l3(0.0, -1.0); + V4 s6_2 = l3(1.0, -1.0); + V4 s6_3 = l3(-1.0, 0.0); + V4 s6_4 = l3(0.0, 0.0); + V4 s6_5 = l3(1.0, 0.0); + V4 s6_6 = l3(-1.0, 1.0); + V4 s6_7 = l3(0.0, 1.0); + V4 s6_8 = l3(1.0, 1.0); + V4 s7_0 = -max(-s6_0, 0.0); + V4 s7_1 = -max(-s6_1, 0.0); + V4 s7_2 = -max(-s6_2, 0.0); + V4 s7_3 = -max(-s6_3, 0.0); + V4 s7_4 = -max(-s6_4, 0.0); + V4 s7_5 = -max(-s6_5, 0.0); + V4 s7_6 = -max(-s6_6, 0.0); + V4 s7_7 = -max(-s6_7, 0.0); + V4 s7_8 = -max(-s6_8, 0.0); + s6_0 = max(s6_0, 0.0); + s6_1 = max(s6_1, 0.0); + s6_2 = max(s6_2, 0.0); + s6_3 = max(s6_3, 0.0); + s6_4 = max(s6_4, 0.0); + s6_5 = max(s6_5, 0.0); + s6_6 = max(s6_6, 0.0); + s6_7 = max(s6_7, 0.0); + s6_8 = max(s6_8, 0.0); + + t4[gxy] = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t5[gxy] = f1(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t6[gxy] = f2(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t7[gxy] = f3(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); +} + +//!PASS 5 +//!DESC conv4 +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 +//!IN t4, t5, t6, t7 +//!OUT t0, t1, t2, t3 + +#define l0(x, y) V4(O(t4, float2(x, y))) +#define l1(x, y) V4(O(t5, float2(x, y))) +#define l2(x, y) V4(O(t6, float2(x, y))) +#define l3(x, y) V4(O(t7, float2(x, y))) + +V4 f0(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(3.218e-02, -9.156e-03, 1.697e-02, -3.071e-02, 1.779e-03, 2.556e-02, -3.235e-02, -4.232e-02, 1.762e-02, -3.808e-02, 1.125e-02, 1.392e-02, 4.069e-03, 2.945e-03, -7.095e-03, -1.031e-02)); + r += mul(s0_1, M4(-6.904e-03, -7.007e-02, -8.971e-03, 4.521e-02, 2.397e-02, -3.704e-02, -1.335e-02, -4.669e-02, -2.479e-02, 1.644e-02, 6.426e-02, 3.375e-02, -1.541e-03, -6.073e-02, 1.416e-02, -3.269e-02)); + r += mul(s0_2, M4(-2.058e-02, 7.011e-02, -5.697e-02, 4.020e-02, 7.338e-03, -2.103e-03, 2.206e-02, 6.535e-03, -3.231e-02, 3.870e-02, -3.860e-03, -3.670e-02, 2.495e-02, -2.574e-02, 1.926e-02, -4.973e-02)); + r += mul(s0_3, M4(-4.293e-02, -3.056e-02, -1.686e-01, 1.441e-02, -1.059e-01, -1.344e-01, 2.379e-02, -4.777e-02, -3.675e-02, 1.265e-01, -5.420e-02, -3.269e-02, -3.922e-03, 5.347e-02, -2.844e-02, -1.718e-02)); + r += mul(s0_4, M4(-8.574e-02, -9.176e-02, -1.966e-01, 1.048e-01, -8.294e-03, 1.117e-01, 9.178e-02, 1.257e-01, -4.588e-02, -5.564e-02, -1.730e-01, 1.361e-02, 6.663e-02, 1.381e-01, -1.630e-02, -4.021e-02)); + r += mul(s0_5, M4(4.136e-03, -7.935e-02, -8.286e-02, -1.222e-01, 4.729e-02, 5.418e-02, 8.974e-02, 1.665e-02, -2.416e-02, -6.075e-02, -1.305e-01, 3.602e-02, -3.502e-02, 1.021e-02, -2.809e-02, 2.753e-02)); + r += mul(s0_6, M4(3.777e-02, 2.017e-02, 3.033e-02, -4.287e-03, 2.545e-02, 1.474e-02, 4.763e-02, -3.844e-02, -8.892e-03, 1.642e-02, 8.656e-02, -8.221e-03, 2.291e-03, -2.849e-02, -1.719e-02, -5.023e-03)); + r += mul(s0_7, M4(6.786e-02, -3.284e-03, 6.808e-02, -7.077e-04, 3.924e-02, 3.459e-02, 3.492e-02, -3.447e-02, -1.055e-01, -1.112e-01, 2.040e-01, -5.955e-02, 5.243e-03, -4.751e-02, -1.151e-02, 1.004e-01)); + r += mul(s0_8, M4(-4.098e-02, 7.437e-03, -2.620e-02, -3.189e-02, -1.628e-02, 8.777e-03, 8.764e-03, -7.779e-03, 1.184e-01, 9.020e-03, 7.741e-02, -8.047e-02, 2.824e-02, 5.073e-03, -4.022e-02, 6.762e-02)); + r += mul(s1_0, M4(4.494e-02, -6.119e-02, 4.058e-02, 5.218e-03, 1.067e-02, 2.838e-02, 2.448e-02, 4.347e-02, -6.863e-03, 1.615e-02, 2.493e-02, -2.700e-02, 4.393e-03, 9.190e-03, -2.479e-02, -2.607e-02)); + r += mul(s1_1, M4(-1.614e-02, -2.665e-02, 5.162e-02, 4.714e-02, -2.552e-02, 3.422e-02, -2.133e-02, -2.968e-02, 8.076e-03, -1.551e-02, -2.935e-02, -3.791e-03, 5.501e-02, -7.794e-04, 1.778e-02, 3.403e-02)); + r += mul(s1_2, M4(4.270e-02, -1.920e-02, 1.891e-02, 1.107e-01, -5.436e-03, -2.268e-02, 1.225e-03, 6.840e-03, 5.458e-03, -3.349e-03, 1.522e-02, -4.326e-04, 3.125e-02, -3.705e-02, 9.931e-03, -2.976e-03)); + r += mul(s1_3, M4(-6.230e-03, 7.126e-02, -8.891e-02, 5.800e-02, 4.454e-02, 9.799e-02, -4.127e-02, 3.676e-02, -1.231e-02, 1.625e-01, -5.166e-02, -3.153e-02, -4.016e-01, -1.090e-03, 2.476e-01, -4.948e-03)); + r += mul(s1_4, M4(-1.130e-02, 2.329e-01, -2.248e-01, -2.242e-02, 3.017e-02, -7.676e-02, -8.103e-02, -1.202e-01, 6.177e-02, -8.543e-03, 4.122e-02, -1.608e-02, -5.273e-02, -4.625e-02, 5.280e-01, -1.035e-01)); + r += mul(s1_5, M4(1.048e-01, -4.992e-02, -4.728e-02, -8.256e-02, -1.446e-02, -1.091e-01, -3.986e-03, 3.267e-01, -5.484e-03, -4.397e-02, 1.283e-02, -1.320e-02, -1.774e-02, 2.067e-02, 7.630e-02, -9.716e-02)); + r += mul(s1_6, M4(-7.980e-02, 4.070e-03, 1.274e-02, 2.572e-02, 5.635e-02, -3.270e-02, 5.764e-02, -9.156e-02, -1.360e-02, -4.462e-03, -1.850e-02, 6.472e-03, -6.115e-02, -5.032e-02, -2.241e-02, -2.497e-02)); + r += mul(s1_7, M4(-2.255e-02, -4.712e-02, 1.017e-01, 2.487e-02, 1.273e-02, -1.527e-02, -9.580e-02, 1.803e-01, -4.787e-02, 5.310e-03, -8.233e-02, -6.115e-02, -2.104e-01, 2.682e-02, 3.220e-02, -8.610e-02)); + r += mul(s1_8, M4(9.152e-03, -5.382e-02, -2.372e-02, 3.469e-02, 1.743e-02, 1.022e-02, -1.876e-03, -1.372e-01, 3.201e-02, 8.503e-03, -1.625e-02, 3.147e-02, 3.708e-02, 1.029e-02, -1.535e-02, -1.202e-01)); + r += mul(s2_0, M4(-3.319e-02, 1.736e-02, 4.131e-03, -1.563e-02, -3.905e-02, 5.418e-02, -6.206e-02, -2.935e-03, 2.800e-02, -2.023e-02, -2.784e-02, 3.006e-03, -6.059e-03, 6.524e-02, -2.346e-02, -1.736e-02)); + r += mul(s2_1, M4(-4.049e-02, 6.725e-03, -1.085e-02, 4.035e-03, -1.821e-02, 1.768e-01, -8.133e-02, -3.072e-02, 4.867e-02, -6.692e-02, -7.153e-02, -2.925e-02, -2.937e-02, 4.958e-02, 2.931e-02, 2.594e-02)); + r += mul(s2_2, M4(1.404e-02, 1.566e-02, -2.191e-02, 1.534e-02, 4.273e-02, 1.018e-02, 3.499e-02, -5.138e-02, 3.985e-02, -1.176e-01, -1.058e-01, 1.436e-02, -2.559e-02, 1.130e-02, -2.797e-02, 3.066e-02)); + r += mul(s2_3, M4(3.445e-02, 1.171e-02, -3.006e-02, 3.256e-03, -3.482e-02, 4.140e-02, -4.909e-02, -6.044e-02, 1.321e-01, -1.897e-01, -8.159e-02, -2.112e-02, 1.763e-02, -1.096e-02, 5.685e-02, 4.375e-02)); + r += mul(s2_4, M4(-4.789e-02, -4.563e-03, -4.865e-02, -5.439e-02, 5.289e-02, -4.466e-01, -3.885e-01, -7.680e-03, 1.108e-01, 3.201e-02, -1.204e-01, 8.638e-02, -1.449e-02, 3.291e-01, -6.534e-02, 1.375e-01)); + r += mul(s2_5, M4(-7.094e-02, -9.337e-02, -2.026e-02, -4.696e-02, -9.318e-02, -1.711e-01, 1.475e-03, 2.454e-01, 3.542e-02, -1.756e-01, 3.723e-02, 2.257e-01, 1.025e-01, -1.602e-01, -1.003e-01, -9.612e-02)); + r += mul(s2_6, M4(6.853e-02, -7.465e-02, -5.793e-02, -1.559e-02, 1.170e-01, -4.489e-02, -1.518e-02, -1.635e-01, 1.255e-01, -6.608e-02, -1.771e-02, -2.516e-02, -2.612e-05, 5.702e-02, -4.380e-02, -1.893e-02)); + r += mul(s2_7, M4(7.728e-02, 7.197e-02, 4.858e-02, -9.770e-02, 1.490e-02, -9.032e-03, -8.429e-02, 1.293e-02, 1.367e-01, -2.023e-02, 8.069e-02, 1.568e-01, 1.764e-01, 2.864e-02, 3.665e-02, -1.475e-01)); + r += mul(s2_8, M4(1.070e-02, -7.340e-03, 2.201e-02, -4.505e-02, 1.376e-02, 3.961e-02, -5.880e-02, -2.605e-01, 1.372e-01, -3.956e-02, 3.714e-02, 1.820e-02, -2.554e-02, -1.309e-01, -9.963e-03, -1.017e-01)); + r += mul(s3_0, M4(-8.436e-02, 7.121e-02, -5.202e-02, -2.004e-03, -2.206e-02, 4.483e-02, 5.284e-02, -1.632e-02, -1.945e-02, 4.127e-02, -3.915e-02, -3.035e-02, -1.770e-02, 2.422e-02, -4.709e-03, -1.520e-02)); + r += mul(s3_1, M4(-5.321e-02, 1.762e-01, -2.945e-02, 7.592e-02, -1.644e-02, 1.135e-01, -7.430e-03, -3.749e-02, -5.811e-03, 1.906e-02, 2.663e-02, 3.511e-02, 3.281e-03, -1.015e-01, -3.120e-02, -6.097e-02)); + r += mul(s3_2, M4(-1.092e-03, 3.153e-02, -5.503e-03, -1.146e-02, 5.314e-02, -2.881e-03, -3.640e-02, -9.900e-02, 4.377e-03, 5.991e-02, -2.789e-02, -3.115e-02, -2.704e-03, -1.549e-02, 2.186e-02, 1.206e-02)); + r += mul(s3_3, M4(-7.141e-02, -1.261e-01, 1.962e-01, 6.488e-02, 2.605e-02, -2.440e-02, -8.179e-02, -3.468e-03, -4.819e-02, -3.724e-02, 7.258e-02, -3.404e-04, 3.014e-02, 3.029e-02, -1.218e-02, -3.531e-02)); + r += mul(s3_4, M4(-1.182e-01, -6.580e-02, -1.255e-02, 9.880e-02, -3.174e-02, -9.890e-02, -7.282e-03, -9.129e-02, -4.213e-02, 4.028e-02, 9.673e-03, 6.345e-02, -3.783e-03, -1.110e-01, 2.652e-02, 5.203e-02)); + r += mul(s3_5, M4(-2.349e-02, -8.691e-02, 4.553e-03, -8.088e-02, -6.252e-02, -7.572e-02, 6.911e-02, -1.130e-01, -4.595e-02, -1.190e-01, 6.714e-02, 1.355e-02, -1.892e-02, 1.295e-01, -1.577e-01, -1.358e-02)); + r += mul(s3_6, M4(2.027e-01, 1.257e-01, -3.358e-02, -4.551e-03, 6.611e-02, 2.388e-02, 1.469e-02, -6.323e-02, -1.892e-02, 2.749e-02, 2.641e-02, 1.404e-03, 2.111e-02, -1.817e-02, -2.992e-02, -2.689e-02)); + r += mul(s3_7, M4(-1.821e-01, -9.000e-02, 3.136e-02, -4.891e-04, 1.247e-01, 4.818e-02, 1.421e-01, -1.236e-01, -1.147e-02, 6.238e-02, 5.303e-02, 1.022e-02, 2.910e-02, -1.084e-02, 3.081e-02, 5.174e-02)); + r += mul(s3_8, M4(-1.797e-02, -5.589e-03, -1.555e-02, -6.042e-02, 1.961e-02, 6.395e-02, 1.150e-01, -2.035e-03, 3.739e-02, 4.287e-02, 5.316e-02, -9.278e-02, -1.505e-02, 1.129e-01, 1.067e-01, 1.242e-01)); + r += mul(s4_0, M4(3.162e-02, -9.156e-02, 4.139e-02, -5.570e-03, 2.892e-02, 2.495e-02, -2.536e-02, 5.830e-04, -1.000e-02, -8.313e-02, -1.337e-01, -1.601e-01, -4.115e-02, 3.800e-02, 2.641e-02, 1.219e-02)); + r += mul(s4_1, M4(-5.936e-03, -7.623e-02, 3.342e-02, 8.082e-02, -1.409e-02, 7.734e-03, -4.970e-02, -2.206e-02, -8.357e-02, 9.654e-02, -6.065e-02, 8.079e-03, 7.353e-02, -1.206e-01, -5.928e-03, 1.667e-02)); + r += mul(s4_2, M4(7.881e-04, 6.908e-02, -6.028e-03, -1.618e-02, 4.818e-04, 3.488e-02, 1.759e-03, 2.699e-02, 2.713e-02, 3.136e-02, -2.399e-02, -1.504e-03, -6.237e-03, -4.065e-02, 5.615e-02, -3.163e-03)); + r += mul(s4_3, M4(-2.860e-02, 1.294e-01, -2.332e-02, 1.808e-02, -1.743e-02, -5.386e-02, -3.762e-02, -4.321e-02, -2.588e-01, 1.398e-01, 1.353e-01, -8.920e-02, 2.448e-02, 4.920e-02, -1.224e-02, -1.614e-02)); + r += mul(s4_4, M4(1.204e-01, -8.509e-02, -4.924e-02, 6.064e-03, 3.034e-02, 1.574e-02, 4.869e-02, 2.665e-02, 6.871e-02, -6.866e-02, 1.735e-02, 1.449e-01, -1.354e-01, 7.863e-02, 6.953e-02, -1.963e-03)); + r += mul(s4_5, M4(1.099e-01, 5.797e-02, -1.392e-01, -4.072e-02, 5.068e-02, -4.678e-02, 3.621e-04, -6.722e-02, -7.565e-03, -6.160e-02, 2.661e-02, -3.352e-02, -1.439e-02, 1.805e-02, -3.017e-02, 2.053e-02)); + r += mul(s4_6, M4(-6.244e-02, -2.477e-04, 1.592e-02, 8.183e-02, 4.341e-02, -3.616e-02, -3.582e-02, -7.649e-03, 1.282e-01, -2.958e-02, 6.122e-02, 4.400e-02, -8.084e-02, 2.607e-02, -1.274e-02, -3.702e-02)); + r += mul(s4_7, M4(4.572e-02, -7.332e-02, -1.435e-02, -1.354e-03, -7.438e-03, 3.358e-02, -1.565e-02, 2.219e-02, -2.104e-01, 1.387e-01, -1.787e-01, 9.578e-03, -3.047e-02, 8.672e-03, 1.326e-02, 7.549e-02)); + r += mul(s4_8, M4(2.942e-02, 5.386e-02, 7.478e-02, -1.506e-02, -3.262e-02, 5.324e-02, 1.510e-02, -7.526e-03, -9.404e-02, -2.948e-02, -1.159e-01, 5.612e-02, 1.017e-02, -2.557e-02, 4.533e-02, -7.814e-03)); + r += mul(s5_0, M4(1.273e-02, -2.335e-02, 4.686e-04, -6.832e-02, -5.006e-03, 1.206e-01, 2.255e-02, 2.793e-02, 2.599e-02, -2.800e-02, -6.195e-02, -1.542e-02, 2.949e-02, 2.249e-02, -1.452e-02, -3.281e-02)); + r += mul(s5_1, M4(-2.655e-02, -7.515e-02, 5.225e-02, 2.554e-02, -3.540e-03, 1.848e-01, -4.751e-02, 6.319e-02, -1.683e-02, -8.168e-02, -3.264e-04, 1.614e-02, -8.596e-02, 1.572e-01, -7.540e-02, -3.979e-02)); + r += mul(s5_2, M4(2.264e-02, 2.874e-02, 1.692e-02, -2.441e-02, 8.897e-03, 2.086e-01, -2.564e-02, -6.567e-02, -2.882e-02, 2.852e-03, -1.204e-02, 2.980e-02, 9.673e-02, -8.394e-02, -1.061e-02, -5.353e-02)); + r += mul(s5_3, M4(-4.644e-02, 2.119e-01, -4.925e-02, 4.407e-02, -2.709e-02, 3.256e-02, 1.203e-01, 7.638e-02, -8.119e-02, -3.423e-02, 5.092e-02, 4.114e-02, -3.080e-02, -4.722e-02, 3.639e-02, 3.353e-02)); + r += mul(s5_4, M4(1.231e-02, -2.017e-01, 2.356e-01, 4.422e-02, -1.923e-01, 2.277e-01, 2.554e-01, -1.027e-01, 7.785e-02, 1.668e-01, 2.965e-02, 7.079e-02, 1.176e-01, -3.389e-01, -8.714e-02, 7.058e-02)); + r += mul(s5_5, M4(-9.489e-03, 2.903e-02, -3.210e-02, -1.888e-01, 7.274e-02, -1.247e-01, -3.767e-02, -4.563e-01, 4.031e-02, -6.312e-02, 5.967e-02, -1.956e-02, -1.023e-01, 1.412e-01, -4.549e-02, 7.961e-02)); + r += mul(s5_6, M4(-1.957e-02, 2.566e-02, -1.645e-02, -4.895e-02, -7.324e-02, 5.104e-02, 1.960e-02, 1.259e-03, -8.464e-02, 1.944e-02, 3.265e-02, 3.044e-02, 6.595e-02, -2.463e-02, 8.220e-02, -3.774e-02)); + r += mul(s5_7, M4(2.361e-02, 4.172e-02, -2.336e-01, -1.671e-02, -2.482e-01, 1.362e-01, -5.941e-02, -2.531e-01, -1.605e-01, 5.645e-02, -1.127e-02, -2.137e-04, -1.616e-02, -5.168e-03, 5.329e-02, -4.315e-02)); + r += mul(s5_8, M4(-3.904e-02, 3.886e-02, -4.339e-02, -1.119e-02, 1.983e-02, -1.485e-02, -4.235e-02, -2.184e-01, 5.063e-03, -2.330e-02, -1.304e-02, -2.295e-02, 5.199e-02, -2.578e-03, 1.972e-02, 1.030e-02)); + r += mul(s6_0, M4(-2.338e-02, 5.055e-02, 1.732e-03, -9.885e-03, -2.915e-02, 8.990e-02, 2.518e-02, 2.124e-02, -1.774e-02, -3.234e-02, 6.783e-02, -1.173e-02, 9.443e-03, -2.168e-02, -1.047e-02, -3.308e-02)); + r += mul(s6_1, M4(-3.121e-02, 5.847e-02, -1.311e-02, 9.991e-03, 7.540e-02, 3.953e-02, 1.283e-02, -1.149e-01, -2.369e-02, 1.301e-01, 1.979e-03, -1.296e-03, -2.955e-02, -1.485e-02, -8.727e-02, -1.772e-02)); + r += mul(s6_2, M4(3.338e-02, -2.252e-03, -2.092e-02, 1.192e-03, 9.133e-04, -2.904e-02, 6.185e-03, -6.905e-02, -2.519e-02, 7.629e-02, 4.223e-02, -9.257e-02, 8.333e-03, -3.317e-02, 3.203e-02, 6.154e-02)); + r += mul(s6_3, M4(1.712e-02, 2.045e-02, -5.793e-02, -2.341e-03, 8.039e-02, -8.269e-02, 2.075e-02, -4.721e-02, 9.015e-02, -3.655e-02, 6.540e-02, 3.960e-02, 1.583e-02, -7.436e-02, -1.300e-02, 1.814e-02)); + r += mul(s6_4, M4(2.184e-02, -1.733e-02, -1.068e-01, 2.435e-02, -8.370e-02, -5.671e-01, -2.107e-02, 4.727e-02, -4.600e-02, 4.284e-02, -7.898e-02, -1.697e-01, 1.979e-02, -5.546e-02, 1.361e-01, 9.164e-02)); + r += mul(s6_5, M4(1.320e-02, -1.454e-01, 2.815e-02, -5.059e-02, -1.163e-03, -1.499e-01, 3.430e-02, -2.612e-02, 1.303e-03, 9.012e-03, -9.780e-02, 1.160e-01, -4.786e-02, 1.464e-02, -1.254e-02, -6.177e-02)); + r += mul(s6_6, M4(1.925e-02, -3.924e-04, -5.408e-02, 8.060e-03, -1.343e-01, -7.555e-02, 8.500e-02, 7.564e-03, -8.056e-03, 9.773e-02, -6.052e-02, 4.965e-02, -2.164e-02, 6.185e-02, -1.131e-01, -2.691e-02)); + r += mul(s6_7, M4(1.581e-02, 1.541e-02, -9.285e-02, -6.290e-02, 2.561e-02, -2.064e-01, 1.334e-01, -4.603e-02, 3.075e-01, 1.706e-02, -5.560e-02, 1.086e-01, 1.394e-01, -2.809e-02, -8.801e-02, -3.920e-02)); + r += mul(s6_8, M4(-2.864e-02, 3.645e-03, -3.122e-02, -4.279e-02, 6.721e-03, -5.037e-02, 5.367e-02, -5.210e-02, 1.086e-02, 8.553e-02, -2.049e-02, 1.921e-01, -1.198e-03, 5.278e-02, 3.162e-03, 5.703e-02)); + r += mul(s7_0, M4(8.237e-04, 7.565e-02, -3.261e-02, 1.459e-02, -3.049e-02, -6.221e-02, -3.988e-02, -2.718e-02, 1.579e-02, -6.823e-02, 9.483e-03, 3.391e-03, -1.150e-02, 2.973e-02, 4.140e-02, 1.146e-02)); + r += mul(s7_1, M4(-6.292e-02, -3.017e-02, -2.304e-02, -4.184e-02, 6.524e-03, -9.847e-02, 4.331e-03, -2.763e-03, 2.436e-02, 7.249e-02, -4.674e-02, 6.134e-02, 3.011e-02, 3.430e-01, 7.222e-02, 1.344e-01)); + r += mul(s7_2, M4(3.360e-02, -5.552e-02, -4.943e-02, 3.161e-02, -1.759e-02, 2.561e-02, -1.584e-02, 1.067e-02, -6.018e-03, -2.191e-02, 1.001e-01, -5.162e-02, 4.172e-02, -7.222e-02, -4.320e-02, -1.671e-01)); + r += mul(s7_3, M4(-1.997e-02, 6.211e-02, 2.093e-02, 2.590e-02, 4.681e-02, -1.864e-01, 2.634e-02, -2.768e-02, -1.375e-03, 5.001e-03, 5.199e-02, 7.349e-02, 2.499e-02, 9.689e-02, -5.260e-02, -4.920e-02)); + r += mul(s7_4, M4(-2.316e-02, 2.798e-02, -2.930e-03, 2.767e-02, 7.590e-02, -3.101e-01, 1.334e-01, 1.037e-01, -1.135e-02, 4.434e-02, -1.875e-01, -1.480e-01, -3.558e-01, -2.322e-02, 1.764e-02, -3.115e-01)); + r += mul(s7_5, M4(3.913e-02, -3.022e-02, -8.960e-02, -1.972e-01, 1.655e-02, -2.856e-02, -1.324e-02, 1.702e-03, 3.825e-02, -5.577e-02, -9.738e-02, 2.391e-02, -8.171e-02, 8.100e-02, -3.003e-02, 3.654e-02)); + r += mul(s7_6, M4(5.264e-02, 4.476e-03, -1.157e-01, -1.648e-02, 1.046e-02, -1.651e-02, -8.078e-02, 3.162e-02, 1.550e-02, 1.141e-02, -9.502e-02, -9.920e-03, -9.480e-02, -5.184e-02, -9.785e-02, -1.331e-02)); + r += mul(s7_7, M4(7.429e-02, 1.379e-01, 5.235e-02, -1.123e-01, -9.043e-02, -7.733e-02, -6.002e-02, -1.955e-02, 4.030e-02, -1.113e-01, 9.796e-02, -8.453e-03, -2.674e-01, 3.664e-02, -6.066e-02, -1.008e-01)); + r += mul(s7_8, M4(-8.165e-02, 1.089e-02, 1.097e-01, 2.733e-01, 4.780e-03, -6.589e-03, -3.362e-02, 3.750e-02, -4.349e-02, -2.515e-02, -6.238e-02, -3.233e-02, -2.766e-03, -4.207e-03, -1.958e-02, -1.892e-01)); + r += V4(1.089e-02, -2.045e-02, 7.370e-03, 9.968e-03); + return r; +} + +V4 f1(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-2.852e-02, 1.417e-02, -5.760e-02, 1.306e-02, -4.786e-02, 1.171e-01, -9.699e-02, -3.414e-02, 2.571e-02, 3.132e-03, -3.758e-02, 4.471e-02, 1.401e-02, 3.463e-02, -1.304e-02, 2.016e-02)); + r += mul(s0_1, M4(-5.553e-02, 3.789e-02, 4.053e-02, -4.282e-02, 3.149e-02, -2.488e-02, 2.642e-02, 4.853e-03, -2.545e-02, -7.643e-02, -1.664e-02, -2.488e-02, 6.374e-02, -3.734e-02, 3.373e-02, 4.745e-02)); + r += mul(s0_2, M4(4.395e-02, 5.040e-02, -5.552e-02, 2.688e-02, 4.750e-02, -1.505e-02, -1.916e-03, 1.541e-04, -5.306e-02, 5.310e-02, 2.434e-02, 2.006e-02, -9.437e-02, 5.815e-03, -3.701e-03, -2.521e-02)); + r += mul(s0_3, M4(2.083e-02, 7.140e-02, -2.608e-02, 2.495e-02, 4.434e-02, -5.999e-02, -6.960e-02, -6.558e-02, -1.061e-01, 4.193e-02, -1.131e-01, -3.521e-02, 8.448e-03, -2.716e-02, -3.281e-02, 4.599e-02)); + r += mul(s0_4, M4(-3.234e-02, 6.022e-03, -4.811e-02, -1.240e-01, 4.969e-02, -7.316e-02, -2.026e-01, 9.092e-02, 6.015e-02, 2.843e-01, 2.905e-03, -4.195e-02, -5.940e-02, 4.388e-02, 1.342e-02, -2.337e-02)); + r += mul(s0_5, M4(-2.380e-03, 4.119e-02, -1.256e-02, 2.114e-02, 7.213e-02, 2.175e-02, 3.727e-02, -7.079e-02, 6.056e-02, -9.221e-02, -2.669e-03, -8.523e-02, -2.162e-02, -1.026e-02, 2.079e-03, 1.027e-02)); + r += mul(s0_6, M4(1.307e-03, -3.766e-03, 5.204e-02, 4.266e-02, -5.200e-02, -5.702e-02, -1.953e-02, -2.081e-03, -2.318e-03, 1.303e-01, 6.440e-02, 9.118e-03, -1.671e-02, 7.427e-02, -6.194e-03, 4.608e-03)); + r += mul(s0_7, M4(-1.086e-02, -4.986e-02, -5.484e-02, -6.225e-02, 5.482e-02, -4.452e-02, -4.073e-03, -2.407e-02, -3.900e-01, -2.193e-01, -4.044e-02, -1.590e-01, -1.257e-02, 1.443e-02, 2.293e-02, -2.049e-02)); + r += mul(s0_8, M4(1.868e-02, 2.597e-02, -4.738e-03, 4.515e-03, -7.239e-03, 8.633e-02, -2.154e-02, -2.209e-02, -7.547e-02, -8.588e-03, -2.511e-03, -1.880e-02, 1.668e-02, 1.148e-02, -2.489e-02, -2.564e-04)); + r += mul(s1_0, M4(-9.664e-03, 6.720e-03, -3.616e-02, -1.741e-02, 2.702e-02, 1.912e-02, -8.431e-02, 1.800e-02, 7.762e-03, -5.716e-03, -3.505e-02, 3.793e-02, -5.187e-02, -8.724e-03, 1.210e-04, 1.115e-02)); + r += mul(s1_1, M4(3.598e-02, 1.044e-01, -1.339e-02, 5.163e-02, -9.806e-02, -6.674e-02, -1.240e-01, -9.032e-02, 2.787e-02, -3.783e-03, 1.077e-02, -2.244e-02, 2.076e-01, -1.668e-01, 2.460e-01, 1.348e-01)); + r += mul(s1_2, M4(3.081e-02, -6.488e-02, 4.064e-02, 2.232e-02, -3.069e-02, -2.755e-02, -1.444e-02, -4.403e-02, -3.164e-02, 1.650e-03, -5.957e-04, -1.117e-02, 1.618e-01, 4.197e-02, 4.412e-02, 8.392e-02)); + r += mul(s1_3, M4(-7.096e-02, -1.122e-02, 7.644e-02, -3.528e-02, 8.855e-02, -4.147e-02, -1.767e-01, -1.084e-02, -2.915e-02, 7.801e-02, -9.706e-02, 1.738e-02, -5.857e-02, -7.020e-02, 1.048e-02, -8.851e-02)); + r += mul(s1_4, M4(1.548e-01, 2.916e-02, -4.715e-02, 1.714e-01, -4.154e-01, 3.114e-01, -4.738e-02, -2.979e-01, -3.507e-02, -4.455e-02, -2.859e-02, -6.443e-02, 1.712e-01, 1.228e-01, 1.159e-01, 5.612e-01)); + r += mul(s1_5, M4(-3.328e-02, -7.147e-02, -1.732e-02, -1.046e-01, 3.714e-02, 1.004e-02, 1.801e-02, 4.052e-02, -2.488e-02, -8.034e-02, 2.109e-02, -1.397e-02, -3.360e-02, 1.254e-01, 7.808e-02, 2.022e-01)); + r += mul(s1_6, M4(1.909e-02, 1.367e-03, -6.469e-02, -1.298e-02, -1.989e-02, -4.991e-02, -5.581e-02, 6.140e-02, -3.023e-02, 2.203e-02, -3.642e-02, -1.523e-02, -2.428e-02, 2.404e-02, -1.127e-03, -1.336e-01)); + r += mul(s1_7, M4(1.024e-02, -1.469e-01, 8.200e-02, 4.504e-03, -8.006e-02, -6.594e-02, -5.790e-02, -1.692e-01, -8.631e-03, 9.204e-02, -2.329e-02, -1.009e-02, 3.536e-03, 1.820e-01, -2.303e-02, 1.502e-01)); + r += mul(s1_8, M4(-5.898e-02, -6.566e-02, -7.726e-02, -3.458e-02, -4.422e-02, 1.652e-01, 1.264e-02, 4.795e-02, -4.558e-03, -4.430e-02, -5.889e-03, -2.927e-02, 1.604e-02, 2.417e-01, -2.948e-02, -2.499e-02)); + r += mul(s2_0, M4(-3.273e-02, 2.925e-03, -1.014e-01, -1.018e-02, -6.325e-02, 4.441e-02, -1.262e-01, 3.454e-02, 2.184e-02, -5.589e-02, 2.767e-02, -1.997e-03, -3.547e-02, 3.166e-02, -3.762e-02, -4.284e-02)); + r += mul(s2_1, M4(4.734e-02, -1.519e-02, 4.751e-02, -1.437e-02, 1.469e-01, 3.827e-02, -7.801e-02, -4.105e-02, -9.743e-02, -2.653e-02, -1.080e-01, -6.721e-02, 7.721e-02, 1.992e-02, -1.360e-01, 1.240e-03)); + r += mul(s2_2, M4(-1.485e-02, -4.148e-03, -9.333e-03, -2.213e-02, -1.235e-01, -3.868e-02, -2.507e-02, -2.216e-02, -9.666e-02, -7.740e-02, -3.893e-02, -1.239e-01, 1.794e-02, 1.602e-01, 2.262e-02, -2.582e-02)); + r += mul(s2_3, M4(8.309e-03, 1.107e-01, -2.482e-01, -5.239e-02, 1.168e-01, -7.872e-02, 1.419e-01, -4.649e-02, -1.291e-03, -1.392e-01, 1.145e-02, -1.387e-02, 2.985e-02, -2.689e-02, 3.944e-02, -7.916e-03)); + r += mul(s2_4, M4(-8.015e-02, 5.834e-02, 3.784e-02, -1.896e-01, -5.955e-01, 2.887e-01, -2.022e-01, 9.331e-02, -1.495e-01, -4.096e-02, -1.243e-01, -1.639e-01, 2.726e-02, -1.548e-01, 1.335e-01, 1.273e-01)); + r += mul(s2_5, M4(2.455e-02, 3.565e-02, -3.254e-03, 5.547e-02, 9.475e-02, -3.398e-02, 3.236e-02, -1.890e-01, 9.742e-02, 6.328e-03, -1.349e-04, -1.412e-01, 1.845e-01, 5.447e-01, 1.569e-01, 1.644e-01)); + r += mul(s2_6, M4(1.251e-02, -1.017e-01, -5.491e-02, -1.858e-02, 5.391e-02, 1.969e-02, 1.018e-02, 5.492e-02, -1.187e-02, -1.082e-01, -2.789e-02, 2.796e-03, 2.415e-02, 1.100e-02, 2.746e-02, 5.840e-03)); + r += mul(s2_7, M4(-1.939e-02, -1.814e-02, 4.260e-02, -1.620e-02, -9.263e-02, 8.165e-02, -1.502e-01, -8.349e-02, 1.599e-02, 1.467e-01, -5.246e-02, -2.023e-01, 7.758e-02, 2.664e-01, 9.279e-02, 8.311e-02)); + r += mul(s2_8, M4(-1.522e-02, -3.585e-02, 9.057e-03, 5.160e-02, -8.552e-02, 1.032e-01, 1.580e-02, 7.069e-02, -2.397e-02, -1.317e-02, 5.901e-03, -6.085e-05, 4.503e-02, -1.911e-02, 3.011e-02, -4.191e-03)); + r += mul(s3_0, M4(-1.978e-01, 1.193e-02, -4.782e-03, -1.304e-01, 2.629e-02, 4.897e-02, -7.251e-02, 1.659e-02, -4.481e-02, 1.271e-04, 9.208e-02, -1.513e-02, 2.725e-02, -2.319e-02, 3.292e-02, 2.903e-02)); + r += mul(s3_1, M4(1.598e-01, 1.196e-01, 6.364e-03, 7.658e-02, 1.132e-02, -1.454e-02, 2.569e-03, 1.864e-02, 4.843e-02, 6.323e-02, 1.658e-02, 1.019e-01, -5.539e-02, -2.201e-02, -2.732e-02, -2.322e-02)); + r += mul(s3_2, M4(7.839e-03, 2.614e-02, 4.543e-03, 1.929e-02, 6.896e-02, -5.200e-03, -3.588e-03, -2.290e-02, 5.938e-02, 1.207e-02, -1.416e-02, -7.921e-04, -8.801e-03, 2.962e-02, 1.712e-02, 5.104e-03)); + r += mul(s3_3, M4(6.813e-02, -6.967e-02, -2.467e-01, -3.398e-02, 6.877e-02, -7.348e-02, 9.109e-02, 2.261e-02, -4.072e-03, -2.712e-02, 1.256e-01, -1.947e-02, -3.744e-03, 8.099e-02, -8.439e-02, 3.376e-02)); + r += mul(s3_4, M4(1.077e-01, -1.501e-01, 2.260e-01, 9.637e-02, 9.239e-02, -9.979e-02, -6.790e-02, 1.135e-01, 5.774e-02, 8.720e-02, -1.809e-02, 7.099e-02, -1.255e-01, -1.150e-01, -2.787e-01, -1.439e-01)); + r += mul(s3_5, M4(-2.963e-02, 6.668e-03, -3.052e-02, -7.320e-02, 6.541e-02, -6.276e-02, 7.650e-02, -2.627e-02, 2.684e-02, -5.495e-02, 2.097e-02, -3.237e-02, -1.115e-01, -9.660e-02, -1.034e-01, -3.057e-01)); + r += mul(s3_6, M4(-8.964e-02, 1.108e-01, 5.358e-02, -8.675e-02, -1.298e-03, 3.944e-02, 4.797e-02, 3.419e-02, 2.338e-02, 1.032e-01, 3.897e-02, -5.207e-03, 2.477e-02, -3.808e-02, 3.602e-02, -7.691e-03)); + r += mul(s3_7, M4(-2.280e-02, -2.297e-01, -2.656e-02, 4.335e-03, 2.757e-02, -4.156e-02, 1.953e-02, 8.705e-02, 2.555e-02, 1.782e-01, -1.626e-02, 7.317e-02, 3.277e-02, -1.371e-01, 2.527e-02, 1.452e-02)); + r += mul(s3_8, M4(-2.977e-03, -6.503e-03, 1.028e-02, 1.623e-01, -2.416e-02, 2.116e-02, 1.747e-02, -3.146e-02, 9.452e-03, 9.436e-03, 4.173e-02, 3.043e-02, 2.906e-02, 4.177e-02, -7.579e-02, -7.208e-02)); + r += mul(s4_0, M4(-3.654e-02, 2.371e-02, -4.703e-02, -3.417e-02, 1.690e-02, 5.024e-02, 6.902e-03, 6.806e-03, -6.909e-02, 1.855e-01, 2.151e-02, -4.070e-02, 2.795e-02, 1.880e-02, 3.047e-02, -8.102e-03)); + r += mul(s4_1, M4(5.194e-02, -3.014e-02, -8.487e-03, 2.008e-02, 2.216e-02, -5.617e-03, -1.076e-02, -1.327e-02, 9.989e-02, 2.196e-01, 1.202e-02, 9.436e-02, -4.214e-02, -1.455e-02, 2.944e-02, 4.371e-03)); + r += mul(s4_2, M4(-1.887e-02, 4.668e-02, 5.779e-03, -1.966e-02, 2.824e-02, 3.541e-02, 3.188e-03, 1.323e-02, 3.842e-02, 6.945e-03, -2.692e-02, -6.403e-02, 5.748e-02, -4.583e-02, 5.327e-03, 1.260e-02)); + r += mul(s4_3, M4(-1.078e-01, 1.597e-02, -6.295e-02, -1.910e-02, -1.310e-02, -5.021e-02, -1.010e-01, -3.924e-02, 8.872e-03, -1.098e-01, 8.058e-02, 1.212e-02, 1.831e-02, 1.778e-02, 5.973e-02, 1.841e-02)); + r += mul(s4_4, M4(1.154e-01, -6.212e-02, -9.262e-02, -3.601e-02, -8.978e-03, -9.383e-02, 6.147e-02, 1.060e-02, 2.360e-01, -2.783e-01, 1.116e-01, 1.979e-01, -3.989e-02, -1.178e-01, -6.627e-03, -3.447e-02)); + r += mul(s4_5, M4(4.532e-02, -1.230e-01, 4.558e-02, -2.350e-02, -3.753e-02, 6.548e-02, -1.758e-02, -5.187e-02, -1.046e-01, -1.463e-02, -4.373e-02, -1.568e-01, 2.144e-02, -8.064e-02, -4.304e-02, 3.818e-02)); + r += mul(s4_6, M4(6.579e-02, 1.296e-01, -6.474e-02, -6.651e-02, -2.080e-02, -7.649e-02, 3.104e-03, -5.876e-03, 3.586e-02, 6.342e-02, -1.736e-02, 2.302e-02, 1.731e-02, 4.072e-02, 1.752e-02, 1.068e-02)); + r += mul(s4_7, M4(-1.406e-02, -2.128e-01, 1.429e-03, 6.866e-02, -1.158e-02, 1.064e-01, -7.743e-03, -3.322e-02, 2.194e-03, 2.286e-01, 4.062e-02, -7.815e-02, 1.619e-02, 3.628e-02, 2.618e-03, 5.319e-03)); + r += mul(s4_8, M4(-4.473e-02, -4.662e-02, -3.070e-02, -3.530e-02, -1.360e-02, 1.564e-02, 2.604e-02, -1.164e-02, -3.569e-02, 7.896e-02, -5.832e-02, 2.687e-02, 2.879e-02, 9.026e-03, 2.841e-03, 1.433e-02)); + r += mul(s5_0, M4(-1.709e-02, 6.835e-02, -5.300e-02, 2.365e-02, 1.208e-02, -5.065e-02, 7.121e-02, 4.341e-03, -2.329e-03, 8.360e-02, 3.878e-02, 1.105e-02, -9.525e-02, 1.938e-02, -7.229e-02, -8.657e-02)); + r += mul(s5_1, M4(-5.753e-02, -2.475e-02, -8.615e-03, -6.791e-02, 2.518e-01, -1.107e-03, 3.793e-02, 1.224e-01, -8.810e-02, -2.332e-02, -2.174e-02, -8.714e-02, 1.592e-02, 9.309e-02, -1.568e-01, -3.244e-02)); + r += mul(s5_2, M4(3.602e-02, 5.059e-03, 1.107e-02, 2.958e-02, 2.779e-02, 5.966e-02, -1.819e-03, -2.871e-02, 6.199e-02, -1.606e-02, 1.334e-02, 4.840e-02, -4.332e-02, -1.755e-01, -1.225e-02, -1.465e-01)); + r += mul(s5_3, M4(1.342e-02, -2.938e-03, -1.333e-01, 4.088e-02, 5.255e-02, 2.106e-02, 1.246e-01, 5.430e-03, 2.071e-02, -1.101e-01, -1.422e-02, -5.257e-02, 4.171e-02, 2.614e-02, -5.425e-02, -5.484e-02)); + r += mul(s5_4, M4(-3.738e-02, -2.543e-01, -1.355e-01, -2.047e-01, 6.045e-01, 6.712e-04, 2.806e-01, 4.430e-01, 1.019e-01, -5.017e-02, -8.394e-03, 4.678e-04, 4.016e-02, -6.143e-01, -6.335e-02, 9.052e-02)); + r += mul(s5_5, M4(-1.454e-02, -4.759e-02, 3.359e-02, 1.241e-01, 1.558e-02, -1.056e-01, -2.818e-02, 2.574e-01, 1.429e-02, 2.406e-02, 5.111e-02, 3.146e-02, -5.400e-02, -1.546e-01, -5.701e-02, -1.978e-01)); + r += mul(s5_6, M4(-1.559e-02, 1.226e-01, -4.477e-02, 2.875e-03, 3.966e-02, -4.744e-02, 5.312e-02, 2.740e-02, -1.497e-02, -1.681e-03, -7.210e-02, -7.023e-02, 1.059e-02, 4.577e-03, 3.884e-02, 1.989e-03)); + r += mul(s5_7, M4(2.155e-03, 5.351e-02, -5.339e-02, -1.507e-02, 1.282e-03, 1.122e-01, 3.821e-02, 1.328e-01, 1.675e-02, 1.377e-02, -3.465e-02, -3.002e-02, 3.591e-02, 7.138e-02, 6.867e-03, 3.803e-02)); + r += mul(s5_8, M4(-2.054e-02, -2.482e-03, -4.547e-02, -3.309e-02, -2.872e-02, -5.235e-02, 3.979e-02, 6.017e-02, -1.569e-02, -2.154e-02, -1.878e-02, 3.573e-03, -3.146e-02, 6.997e-02, -3.866e-02, -4.409e-02)); + r += mul(s6_0, M4(-2.632e-02, 1.644e-02, -5.125e-02, -1.923e-02, 4.263e-02, -8.466e-02, -4.567e-02, 7.356e-02, 1.789e-02, -1.403e-02, 2.957e-02, 2.201e-02, -2.127e-02, 2.052e-02, 4.376e-02, -3.482e-03)); + r += mul(s6_1, M4(-2.532e-02, 1.704e-02, -5.390e-02, -1.703e-02, 8.306e-02, -5.652e-02, 1.410e-02, 1.581e-02, 1.172e-01, 1.514e-03, 7.870e-04, 1.082e-01, -1.701e-02, -2.203e-02, -3.648e-02, -5.616e-03)); + r += mul(s6_2, M4(2.110e-02, -6.930e-02, -1.405e-02, -2.682e-02, -3.148e-02, -2.610e-02, 4.580e-02, -1.302e-02, -8.942e-02, 6.348e-02, 3.620e-02, 5.638e-02, 6.823e-02, -9.127e-03, 2.566e-02, -1.982e-02)); + r += mul(s6_3, M4(2.426e-02, 4.841e-02, -2.629e-02, 1.539e-03, -3.696e-02, -2.072e-02, 5.157e-03, -8.802e-03, 3.766e-02, 5.942e-02, -7.291e-02, 3.623e-02, 2.300e-02, -1.450e-01, 1.207e-01, 3.822e-03)); + r += mul(s6_4, M4(-6.935e-02, -1.371e-02, 1.685e-03, -9.513e-02, -3.332e-02, -3.843e-01, 4.060e-02, 8.189e-03, -2.561e-01, 3.931e-01, 2.969e-02, -3.895e-02, 7.095e-02, -9.008e-03, 4.266e-02, 1.025e-01)); + r += mul(s6_5, M4(-1.056e-02, -6.190e-02, 4.329e-02, 5.268e-02, 3.018e-02, -1.134e-01, -1.945e-02, 1.213e-02, -1.794e-01, -9.701e-02, -5.967e-02, -7.068e-02, -5.236e-02, -8.995e-02, 1.906e-02, 3.944e-02)); + r += mul(s6_6, M4(7.527e-03, 1.485e-03, 1.679e-02, -5.276e-03, 3.644e-02, -2.594e-01, 5.044e-03, 3.530e-02, -5.528e-02, -1.169e-02, -1.202e-02, 1.599e-02, 1.861e-02, 5.332e-02, 1.572e-02, 3.334e-02)); + r += mul(s6_7, M4(2.066e-02, 6.183e-02, 6.742e-03, 4.145e-02, -2.724e-03, -4.688e-01, 2.701e-02, 1.142e-01, -1.106e-02, -2.290e-01, 2.774e-02, -5.572e-02, -4.977e-03, 7.180e-02, -7.132e-03, 1.043e-01)); + r += mul(s6_8, M4(1.379e-02, 2.942e-02, 3.097e-02, -1.588e-02, -9.760e-03, -1.506e-01, -1.631e-02, -1.675e-02, -1.553e-02, -1.675e-01, -1.927e-02, -5.148e-02, -6.721e-03, 4.411e-02, -1.285e-02, -7.492e-02)); + r += mul(s7_0, M4(-3.382e-02, 4.013e-02, -5.116e-02, -4.171e-02, 1.667e-02, 1.291e-02, -6.363e-02, 1.707e-02, -1.358e-02, -3.281e-02, -6.209e-03, -1.720e-02, -4.898e-02, -3.425e-02, 6.959e-02, 9.825e-03)); + r += mul(s7_1, M4(-5.809e-03, 6.135e-02, -4.941e-02, -4.388e-02, -1.574e-02, -3.333e-02, 3.341e-02, -1.193e-02, 1.603e-01, -7.629e-03, -1.384e-02, 5.651e-02, 2.039e-01, -8.853e-02, -4.779e-02, -3.405e-02)); + r += mul(s7_2, M4(-5.094e-02, 1.089e-02, -4.568e-02, -4.278e-02, -4.847e-02, 5.021e-02, -9.973e-03, 4.309e-02, -1.239e-01, -5.720e-02, 4.405e-02, 1.561e-02, -3.265e-02, -1.596e-02, 4.407e-02, -7.645e-02)); + r += mul(s7_3, M4(-7.759e-02, 2.397e-02, -1.377e-01, -4.577e-02, -7.223e-02, -3.973e-02, -6.573e-02, -3.493e-02, 9.430e-02, -7.609e-02, -6.839e-02, 9.491e-03, -3.487e-02, 2.174e-02, 1.111e-01, -1.857e-02)); + r += mul(s7_4, M4(-3.929e-02, -2.153e-01, -2.263e-02, -1.158e-01, 1.643e-01, -8.632e-02, 1.678e-01, 3.190e-02, -1.678e-01, -1.560e-01, 4.112e-02, 2.362e-02, 4.460e-01, 1.385e-01, 2.484e-01, 2.283e-01)); + r += mul(s7_5, M4(-1.422e-02, -1.066e-01, 3.035e-02, -1.148e-01, -7.523e-02, 7.633e-02, -7.322e-03, 3.361e-02, 2.663e-02, 7.289e-02, -1.969e-02, 5.205e-02, 7.212e-04, 6.407e-02, 3.565e-02, 2.164e-01)); + r += mul(s7_6, M4(-3.088e-02, 1.356e-02, -5.746e-03, -8.216e-02, 1.131e-03, -5.902e-02, -4.959e-02, -1.055e-02, -6.029e-02, -2.294e-02, -8.764e-02, 2.750e-02, 7.840e-02, -6.970e-02, -7.362e-05, -7.489e-02)); + r += mul(s7_7, M4(-6.526e-02, 9.753e-02, 7.053e-02, 3.520e-02, -8.953e-02, -2.164e-01, 9.827e-03, -1.388e-02, 2.596e-02, -2.515e-01, 8.294e-02, -8.363e-02, 4.801e-02, 1.176e-01, 7.288e-02, 1.821e-01)); + r += mul(s7_8, M4(2.840e-02, 2.860e-02, 4.192e-02, -4.194e-02, 4.181e-03, -2.567e-02, -9.064e-03, 1.524e-02, -2.387e-02, 1.684e-02, -1.586e-02, 8.428e-02, 7.378e-03, 9.452e-02, 1.910e-02, 3.319e-02)); + r += V4(-8.471e-03, -1.471e-02, -1.078e-02, -1.292e-02); + return r; +} + +V4 f2(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(5.564e-02, -2.568e-02, 9.599e-03, -2.108e-02, 4.250e-02, 4.686e-02, -5.431e-02, -2.406e-01, -1.053e-01, -6.775e-02, -4.199e-02, 8.179e-02, -5.315e-04, 4.287e-02, 5.107e-02, 7.491e-02)); + r += mul(s0_1, M4(-4.795e-02, -5.934e-03, -5.950e-02, 7.670e-02, 1.012e-01, -1.948e-03, -3.097e-03, 2.226e-02, -6.913e-02, -8.117e-03, 7.958e-02, -4.828e-02, 8.114e-02, 2.249e-02, 1.629e-02, 7.050e-02)); + r += mul(s0_2, M4(-6.514e-02, -1.138e-02, 3.485e-03, 7.612e-03, -6.234e-03, 1.859e-03, 5.234e-02, 2.880e-02, -5.665e-02, 1.437e-02, -1.102e-01, 1.712e-02, 3.604e-02, 1.462e-02, 3.754e-02, 1.502e-02)); + r += mul(s0_3, M4(-1.039e-01, -5.124e-02, -8.815e-02, 3.959e-02, 5.831e-02, -5.496e-02, 2.485e-02, 1.652e-01, 3.139e-01, -8.668e-02, 6.456e-02, -1.771e-02, 7.739e-02, -4.782e-04, -1.474e-02, 2.205e-02)); + r += mul(s0_4, M4(3.960e-02, 1.269e-01, 1.638e-01, -2.935e-02, -6.888e-02, 2.781e-02, -2.099e-02, -4.190e-02, 2.912e-01, 1.422e-01, -2.274e-01, 2.599e-02, 1.336e-01, -8.425e-02, -6.435e-03, 2.277e-02)); + r += mul(s0_5, M4(-5.320e-02, 1.616e-01, -9.022e-02, -4.923e-02, -5.044e-03, 4.681e-02, -8.809e-03, 2.334e-02, 2.030e-01, 4.037e-02, 2.446e-01, 6.085e-02, 1.287e-02, -5.437e-02, 6.038e-02, 2.147e-02)); + r += mul(s0_6, M4(8.658e-02, 2.401e-03, -1.006e-02, -1.908e-02, -8.866e-02, -1.222e-02, 5.580e-02, -3.716e-02, -2.095e-01, 1.739e-01, -1.304e-01, 1.341e-01, -5.495e-02, -4.232e-02, -1.343e-02, 2.139e-04)); + r += mul(s0_7, M4(2.428e-02, -7.374e-03, -1.641e-02, -1.115e-05, -1.166e-01, -1.747e-01, -4.897e-02, 2.178e-02, -3.975e-01, 2.204e-01, 1.356e-01, -7.871e-02, -3.107e-02, -3.150e-02, 9.228e-03, -2.140e-02)); + r += mul(s0_8, M4(9.544e-02, -9.344e-02, 2.867e-02, -9.081e-03, 3.649e-02, 1.379e-02, 1.854e-02, -3.414e-02, -2.156e-01, 4.895e-02, -2.182e-01, -8.193e-02, 9.780e-03, 1.209e-02, -3.988e-02, -9.680e-03)); + r += mul(s1_0, M4(7.363e-02, -6.508e-03, -2.946e-02, 3.452e-02, -4.840e-02, 5.347e-02, 1.271e-02, 1.585e-01, 2.045e-02, -3.410e-02, 3.161e-02, 1.609e-02, -1.150e-01, 2.777e-03, -3.012e-01, -8.839e-02)); + r += mul(s1_1, M4(-6.948e-02, 1.041e-02, 1.361e-01, -6.431e-02, -2.487e-02, -1.073e-02, 8.229e-02, 3.936e-02, 5.405e-02, -1.490e-02, -3.526e-02, 4.847e-02, -2.115e-01, -1.143e-01, -2.937e-02, -2.322e-01)); + r += mul(s1_2, M4(-1.079e-01, -2.854e-02, -6.011e-02, 5.054e-02, -5.800e-02, 2.570e-02, -1.312e-02, 2.525e-02, -8.760e-03, -1.410e-02, 6.679e-02, 1.628e-03, 3.924e-02, 2.187e-02, -3.925e-02, 5.869e-02)); + r += mul(s1_3, M4(8.716e-02, -2.256e-02, -1.715e-03, -7.717e-02, 2.653e-01, 6.507e-02, -8.374e-02, 1.413e-01, -2.495e-03, 1.303e-02, 6.540e-04, 2.399e-02, -2.225e-01, 9.055e-02, -4.018e-02, -6.299e-02)); + r += mul(s1_4, M4(2.131e-01, -2.639e-02, -1.449e-01, -7.339e-02, 2.747e-01, -5.850e-02, -4.813e-04, 1.108e-01, 7.560e-03, -4.137e-02, 1.204e-02, 8.980e-03, -2.765e-01, 1.510e-01, -1.933e-01, 3.426e-02)); + r += mul(s1_5, M4(-1.979e-02, 4.280e-02, 1.420e-01, 5.255e-02, 5.800e-02, -4.042e-02, -4.368e-02, -3.771e-02, -2.228e-02, -4.709e-02, -1.652e-02, -1.663e-04, -9.305e-02, 4.241e-02, -6.751e-02, 1.683e-02)); + r += mul(s1_6, M4(-4.216e-02, 4.015e-02, -2.219e-03, 6.089e-03, -1.194e-01, -1.567e-01, 5.761e-02, 2.711e-02, -8.200e-02, 2.148e-02, -4.152e-02, 7.995e-02, -1.315e-01, -7.088e-03, -1.967e-02, -4.194e-02)); + r += mul(s1_7, M4(1.017e-02, -3.080e-02, 1.067e-01, -1.596e-02, -1.468e-01, 5.528e-02, -4.388e-02, -2.552e-02, -8.031e-02, 1.102e-01, 2.575e-02, -5.867e-02, -1.491e-01, -8.697e-02, -1.588e-01, 1.828e-02)); + r += mul(s1_8, M4(7.462e-03, 2.122e-03, -1.188e-01, 1.442e-02, 5.623e-02, 8.783e-02, -3.208e-02, -3.765e-02, 5.568e-02, -5.648e-03, -2.887e-02, 2.546e-02, -1.080e-02, 1.306e-01, -5.768e-02, -4.871e-02)); + r += mul(s2_0, M4(6.899e-03, -2.458e-02, 3.732e-02, 2.687e-02, 1.890e-01, 3.174e-02, 6.358e-03, -1.116e-01, 8.355e-02, -2.709e-02, 1.097e-01, 1.508e-01, 3.515e-02, 1.664e-02, 3.033e-03, -1.267e-01)); + r += mul(s2_1, M4(-1.644e-02, 1.609e-02, -8.031e-02, 3.372e-02, 3.681e-02, -1.157e-01, -1.050e-01, 9.057e-02, 1.149e-01, -4.600e-02, 1.532e-02, 3.066e-02, 5.304e-03, -1.317e-02, 4.920e-02, 5.047e-02)); + r += mul(s2_2, M4(-1.031e-01, -2.233e-03, -3.758e-02, -4.363e-02, -1.708e-01, -5.747e-02, -4.124e-02, 1.331e-02, 1.331e-01, -1.784e-02, 1.647e-01, -4.233e-02, 8.356e-02, 5.630e-03, 5.010e-02, -4.132e-02)); + r += mul(s2_3, M4(5.442e-02, 2.208e-02, 5.676e-02, 3.522e-02, 4.321e-02, 1.724e-02, 4.825e-02, 3.068e-02, 3.098e-01, -8.694e-02, -9.975e-03, 7.839e-02, -3.647e-02, -1.175e-02, -8.793e-03, -7.234e-02)); + r += mul(s2_4, M4(1.310e-01, 1.019e-01, 2.457e-01, -5.249e-02, 4.429e-01, 1.160e-01, 2.001e-01, 2.508e-01, 2.921e-01, -5.226e-01, 2.153e-01, -2.860e-02, -1.546e-01, 1.213e-01, -1.770e-02, -2.842e-01)); + r += mul(s2_5, M4(1.565e-01, 2.226e-02, -1.299e-02, 2.889e-02, 2.147e-01, 4.120e-02, 1.104e-01, -7.634e-02, 1.461e-01, -1.129e-01, 7.282e-02, 3.477e-02, 1.359e-02, 3.209e-02, 1.097e-02, -7.702e-02)); + r += mul(s2_6, M4(-2.648e-02, -3.652e-02, -4.807e-02, 8.143e-02, 1.982e-02, -2.093e-01, -8.276e-02, 5.334e-02, 5.568e-02, -2.253e-01, 7.336e-02, 1.876e-02, 1.413e-02, -5.480e-03, 3.730e-02, 1.190e-02)); + r += mul(s2_7, M4(-2.826e-02, -1.869e-02, 2.409e-02, -1.078e-02, -8.085e-02, -1.092e-01, -1.236e-01, -1.195e-01, -3.388e-02, -3.166e-01, -1.016e-01, 2.367e-02, 2.484e-02, -2.032e-03, 2.010e-03, 9.625e-02)); + r += mul(s2_8, M4(2.494e-03, -1.099e-01, 1.929e-02, -6.145e-03, 3.189e-03, 1.209e-01, 3.996e-02, -1.905e-02, -1.075e-01, 2.687e-02, 2.764e-02, 1.283e-02, 2.492e-02, -2.514e-02, 2.399e-03, 2.090e-02)); + r += mul(s3_0, M4(-5.188e-02, -5.302e-04, -4.649e-02, -7.301e-02, -2.265e-02, 5.858e-02, 4.601e-02, 3.600e-02, -1.778e-02, -7.573e-03, 1.024e-02, -1.120e-01, 2.020e-02, 8.781e-03, 1.753e-02, 1.242e-01)); + r += mul(s3_1, M4(-9.918e-02, 1.148e-02, -1.616e-02, 1.531e-02, -9.831e-03, 2.570e-02, 1.128e-01, -9.396e-04, -8.930e-02, 3.763e-03, -5.709e-02, -1.298e-01, 3.632e-02, 3.189e-02, -8.941e-02, 4.325e-02)); + r += mul(s3_2, M4(-5.675e-02, -9.192e-04, -1.271e-01, -6.402e-03, 3.858e-02, 1.883e-02, -5.269e-02, -3.356e-02, -8.538e-02, -1.160e-03, -6.894e-02, -1.370e-02, -3.186e-02, 1.357e-02, 5.788e-02, -2.196e-02)); + r += mul(s3_3, M4(2.708e-02, -4.281e-02, 4.847e-02, 8.453e-02, -3.591e-02, -6.288e-03, 1.320e-02, 8.700e-04, 3.477e-02, -5.825e-02, 1.362e-02, -8.986e-02, 2.621e-02, -1.296e-02, 6.036e-03, -8.892e-02)); + r += mul(s3_4, M4(1.101e-01, 2.002e-01, 4.733e-02, 6.113e-02, -1.253e-01, 1.351e-02, -5.160e-02, 7.784e-03, 1.009e-01, -1.159e-01, -7.248e-03, 6.105e-02, 3.384e-02, -7.175e-02, -7.411e-03, -2.225e-01)); + r += mul(s3_5, M4(9.257e-02, 1.273e-01, 1.194e-01, 3.997e-02, 6.216e-02, 4.575e-02, 5.219e-02, 1.013e-03, 1.138e-01, -5.140e-02, 4.693e-03, 2.465e-02, -6.723e-02, -2.648e-02, 4.385e-02, -8.677e-02)); + r += mul(s3_6, M4(-3.210e-02, 3.838e-02, 7.788e-02, 9.044e-02, 3.106e-02, -4.789e-02, 2.401e-02, 3.500e-02, 5.927e-02, 1.184e-02, -1.481e-02, 1.091e-02, -5.906e-02, -4.968e-02, -1.467e-02, 3.172e-02)); + r += mul(s3_7, M4(4.558e-02, -8.335e-02, -5.322e-02, -2.910e-02, -1.990e-02, -8.604e-02, -4.847e-03, -4.192e-02, 3.607e-02, 3.262e-02, -7.834e-03, -3.046e-02, 9.790e-03, 4.237e-02, -3.386e-02, 5.023e-02)); + r += mul(s3_8, M4(-6.291e-02, 4.206e-02, 3.200e-02, 2.044e-02, -9.929e-02, 5.190e-02, 3.410e-02, 1.033e-02, -3.491e-02, 3.895e-02, -2.048e-03, 1.777e-02, 1.251e-01, -6.249e-02, -9.290e-02, 3.368e-02)); + r += mul(s4_0, M4(7.315e-02, 4.151e-03, -2.859e-02, 5.017e-02, 4.525e-02, 6.032e-03, 5.704e-03, -4.161e-02, 2.248e-01, 1.231e-01, -1.596e-01, -1.029e-01, -1.354e-01, 6.874e-02, -5.986e-02, 2.122e-02)); + r += mul(s4_1, M4(5.375e-02, -8.616e-02, 6.589e-02, -9.744e-02, 2.313e-02, 5.684e-03, 3.187e-02, 1.480e-02, -8.559e-02, 1.176e-01, -7.169e-02, 1.836e-02, 5.834e-02, 3.290e-02, -1.134e-01, -8.451e-02)); + r += mul(s4_2, M4(7.774e-02, -4.352e-02, 1.077e-01, 2.943e-02, 3.852e-02, -3.905e-02, -1.682e-02, 7.009e-02, -1.695e-02, 2.796e-02, -7.754e-02, -2.108e-02, 1.772e-02, -3.573e-02, 5.487e-02, 3.715e-03)); + r += mul(s4_3, M4(-1.166e-01, 7.483e-02, 8.287e-02, -2.406e-01, -2.707e-02, -1.932e-02, 2.245e-03, 1.747e-01, -1.694e-01, -8.341e-02, 1.334e-01, -1.510e-01, 1.329e-01, -5.959e-02, -7.460e-03, -7.832e-02)); + r += mul(s4_4, M4(1.055e-01, 2.643e-02, -2.022e-01, 9.058e-02, -1.638e-01, 4.163e-03, 3.108e-02, -3.503e-02, 7.427e-02, -1.404e-01, -2.431e-01, -3.152e-02, 2.168e-02, -1.821e-01, 5.341e-03, -4.026e-02)); + r += mul(s4_5, M4(-1.392e-01, -8.403e-02, 6.099e-02, -5.146e-02, -6.017e-02, 1.218e-01, -2.153e-02, -1.807e-02, 1.186e-01, -4.060e-02, -2.946e-02, 1.951e-02, -6.394e-02, -1.915e-02, -1.332e-01, 1.149e-02)); + r += mul(s4_6, M4(-1.588e-01, 1.224e-01, -6.327e-02, 4.951e-02, 9.498e-02, -8.888e-02, 2.724e-02, -7.547e-03, 8.303e-02, -8.869e-02, -3.263e-02, -8.616e-02, -6.354e-02, 1.949e-02, -2.067e-04, -4.272e-02)); + r += mul(s4_7, M4(-1.390e-02, 1.797e-01, 1.093e-01, -2.220e-02, 5.163e-02, 1.969e-02, -2.223e-02, 2.175e-03, 2.056e-01, -1.871e-01, 1.528e-01, -2.037e-02, -1.613e-02, 6.063e-02, -5.701e-02, 6.490e-03)); + r += mul(s4_8, M4(-8.356e-02, 9.201e-02, -6.660e-02, 5.225e-02, 5.527e-02, -5.178e-02, 4.180e-03, -1.556e-02, 4.026e-02, 2.421e-02, -1.164e-01, 2.126e-02, -4.531e-03, 5.718e-02, 6.483e-02, 1.105e-02)); + r += mul(s5_0, M4(1.185e-01, 5.196e-03, 3.141e-02, -4.355e-02, 1.014e-01, -6.355e-02, -1.440e-02, -3.068e-01, -3.370e-02, 6.441e-02, -1.696e-02, -1.651e-01, 1.775e-01, 3.987e-02, 1.402e-02, -2.260e-01)); + r += mul(s5_1, M4(8.821e-02, 4.918e-03, -1.254e-01, -3.305e-02, 9.728e-02, -1.233e-01, -4.204e-01, -1.657e-01, 1.364e-02, 5.103e-02, -4.482e-02, 3.125e-02, 8.831e-02, 1.491e-01, 8.666e-02, -9.823e-02)); + r += mul(s5_2, M4(4.780e-03, 3.399e-03, 1.170e-01, 1.614e-02, 5.032e-02, -1.143e-01, 9.699e-02, 3.955e-02, 6.252e-02, 1.201e-02, 1.065e-03, 8.514e-03, 1.375e-01, 7.129e-02, -1.061e-02, -5.335e-03)); + r += mul(s5_3, M4(-1.229e-01, 1.690e-02, -5.375e-02, -1.088e-01, -2.155e-01, 9.302e-02, 3.596e-02, -1.506e-01, 4.357e-02, -2.802e-02, 4.347e-02, -1.340e-02, -2.441e-01, 4.218e-03, -5.089e-02, 3.196e-02)); + r += mul(s5_4, M4(-9.945e-02, -8.537e-02, 1.498e-01, 5.485e-02, -3.567e-01, 2.777e-01, 3.483e-02, 5.400e-02, 6.884e-02, -4.037e-02, -6.517e-02, -7.915e-03, -2.116e-01, -6.909e-02, 1.464e-01, -1.226e-01)); + r += mul(s5_5, M4(3.022e-03, -4.202e-03, -1.367e-01, -3.061e-02, 8.022e-02, 1.031e-01, -2.493e-01, 5.077e-02, -4.849e-02, -5.362e-02, 3.291e-02, -2.919e-02, -7.381e-02, -1.435e-01, -3.912e-02, 1.071e-02)); + r += mul(s5_6, M4(-3.188e-02, -1.425e-03, -8.109e-03, -6.234e-03, 7.547e-02, 3.376e-02, 3.357e-02, 2.933e-02, -5.036e-02, 7.092e-02, -1.196e-02, -2.627e-02, 6.140e-04, -1.185e-02, 1.312e-02, 3.290e-02)); + r += mul(s5_7, M4(-6.365e-02, 4.057e-03, -1.303e-02, -3.592e-02, -4.351e-02, 1.689e-01, -2.047e-02, -1.170e-02, 2.940e-02, -7.746e-02, 1.809e-02, -8.583e-03, -2.782e-02, 3.031e-02, -6.050e-02, 2.208e-02)); + r += mul(s5_8, M4(2.310e-02, -3.416e-02, 4.306e-02, 1.533e-02, 9.334e-02, -8.918e-02, -5.069e-02, -7.945e-03, 7.296e-02, -1.590e-02, 1.189e-02, -4.936e-04, -1.224e-02, 8.756e-02, 5.734e-02, -6.707e-03)); + r += mul(s6_0, M4(6.112e-02, -4.774e-03, -6.005e-03, 2.364e-02, -2.329e-02, -2.986e-02, 1.616e-02, -6.983e-02, -1.663e-01, 2.243e-02, -3.605e-02, 3.315e-01, 9.484e-03, 3.748e-02, -9.987e-03, 9.160e-03)); + r += mul(s6_1, M4(2.533e-02, 1.706e-02, 1.712e-02, 1.156e-01, -3.681e-02, 2.597e-03, 7.530e-02, 1.275e-02, -1.541e-01, 4.503e-02, 1.143e-01, 1.588e-01, 1.915e-01, -1.275e-02, 3.138e-02, 1.509e-02)); + r += mul(s6_2, M4(-6.694e-02, -1.834e-02, 8.816e-02, -1.622e-02, -1.021e-01, 1.299e-02, 1.748e-02, -5.791e-02, -5.930e-02, 6.122e-02, 8.327e-04, 3.157e-02, 1.111e-01, -1.483e-02, -1.748e-03, -2.191e-02)); + r += mul(s6_3, M4(-2.837e-02, 1.398e-02, -2.785e-02, 2.663e-03, 4.867e-02, 4.068e-02, -1.933e-02, 2.442e-02, -3.858e-02, 7.174e-02, 1.585e-02, 1.077e-01, 1.722e-02, -5.831e-02, 5.412e-02, -1.175e-02)); + r += mul(s6_4, M4(-7.951e-02, 5.032e-02, 8.040e-02, -2.639e-02, 2.334e-01, -4.099e-02, -2.540e-01, 9.531e-02, 4.706e-01, 1.059e-01, 2.458e-01, -4.419e-02, 1.768e-02, -1.573e-01, -3.025e-02, 8.663e-02)); + r += mul(s6_5, M4(-6.631e-02, 7.565e-03, -1.313e-01, -2.789e-02, 4.157e-02, 6.711e-02, 1.025e-01, 5.542e-04, -3.761e-02, 6.066e-02, 1.626e-01, 2.160e-02, -5.487e-02, -7.425e-02, -1.634e-02, -2.391e-02)); + r += mul(s6_6, M4(1.005e-02, 3.554e-03, -6.610e-03, -2.522e-02, -6.029e-02, -1.488e-02, 8.100e-02, 3.640e-02, -2.426e-02, 9.615e-02, -2.740e-02, -2.791e-02, 7.064e-02, -6.777e-03, -2.041e-02, 2.271e-02)); + r += mul(s6_7, M4(7.635e-02, -4.346e-02, -4.108e-02, 6.087e-02, -1.638e-01, 1.368e-01, 5.916e-02, 8.663e-03, 9.976e-02, -5.511e-02, -2.765e-02, -1.956e-02, 3.657e-02, -6.695e-02, 5.414e-02, -2.143e-03)); + r += mul(s6_8, M4(1.062e-01, -6.264e-02, 5.932e-02, -6.501e-03, -2.462e-02, 1.685e-02, -6.453e-02, 1.135e-02, 2.601e-03, -1.934e-01, 8.357e-03, -9.472e-04, -1.883e-02, 8.681e-03, 4.172e-02, 1.029e-02)); + r += mul(s7_0, M4(8.194e-02, 1.504e-02, 2.109e-02, -7.019e-02, -6.763e-02, -1.386e-02, 5.007e-05, 4.384e-02, 4.691e-02, 3.245e-03, -4.615e-02, -1.523e-01, 6.344e-02, -9.443e-03, 4.452e-02, 1.401e-01)); + r += mul(s7_1, M4(5.713e-02, 4.575e-03, -2.760e-02, 1.835e-01, -4.168e-02, 7.856e-02, 1.071e-01, 6.429e-02, 4.507e-02, -6.009e-02, -7.034e-03, 1.460e-01, -6.400e-02, -1.837e-01, -2.117e-01, -4.930e-01)); + r += mul(s7_2, M4(5.604e-02, 4.955e-02, 2.635e-02, -3.725e-02, -9.501e-02, 3.427e-02, 4.963e-02, -3.468e-02, -6.375e-04, -2.081e-02, 6.959e-02, -1.102e-02, 5.659e-02, 1.112e-01, -6.842e-02, 1.090e-01)); + r += mul(s7_3, M4(9.068e-02, 1.051e-02, -3.817e-02, 1.735e-01, -2.777e-02, 3.623e-02, 4.151e-02, 3.167e-02, -1.217e-02, 8.726e-03, 4.313e-02, 2.150e-01, 2.386e-01, -2.212e-02, 6.009e-02, -2.260e-01)); + r += mul(s7_4, M4(1.871e-01, -1.482e-01, 3.274e-02, -3.016e-01, -6.794e-02, -7.395e-02, -2.008e-01, 4.266e-02, 8.102e-02, 2.207e-01, -1.172e-01, -2.571e-02, -1.292e-01, -1.271e-01, -1.939e-01, 3.910e-02)); + r += mul(s7_5, M4(2.271e-02, -5.943e-02, -4.335e-02, 8.813e-02, 4.214e-02, 2.775e-02, -6.806e-03, -6.327e-03, 3.212e-02, 4.120e-02, 8.407e-03, 2.191e-02, -4.026e-02, -1.536e-01, -1.916e-01, -4.750e-03)); + r += mul(s7_6, M4(4.624e-02, 2.899e-02, 4.689e-02, -5.187e-02, -2.949e-03, -9.181e-03, -2.542e-02, 3.311e-02, -4.676e-02, -3.951e-02, -7.407e-03, 8.856e-04, 3.157e-02, -7.219e-02, 3.976e-02, -6.937e-02)); + r += mul(s7_7, M4(6.242e-02, -7.255e-02, -8.852e-02, 6.086e-02, 1.416e-02, 9.508e-02, 6.196e-02, -3.596e-02, -9.707e-02, -6.330e-02, 7.787e-02, 5.456e-02, 1.479e-01, 1.658e-01, 2.335e-02, 6.382e-03)); + r += mul(s7_8, M4(4.285e-03, 1.385e-02, -1.282e-02, 1.915e-02, -3.214e-02, 1.144e-02, -1.831e-02, -1.096e-02, -8.330e-03, -2.045e-02, -4.096e-02, -5.822e-02, -9.821e-03, 7.185e-02, -3.122e-02, -1.760e-02)); + r += V4(-7.389e-03, 1.176e-03, 1.090e-02, 3.142e-03); + return r; +} + +V4 f3(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(9.318e-03, 1.971e-02, -4.711e-02, -1.441e-02, 2.845e-02, 1.500e-02, -7.066e-02, 4.036e-02, 1.277e-01, -2.572e-02, -2.008e-02, -1.923e-02, -2.453e-02, -5.953e-03, -3.675e-03, -3.523e-03)); + r += mul(s0_1, M4(4.747e-02, -9.007e-02, 3.769e-02, 2.768e-02, -1.276e-02, 7.454e-02, 1.610e-02, -7.106e-03, 1.486e-03, -6.065e-02, 5.470e-02, -2.325e-02, -2.186e-02, 2.483e-02, 2.275e-02, -9.590e-02)); + r += mul(s0_2, M4(1.496e-01, -2.921e-02, -3.473e-03, -2.540e-02, -1.334e-01, 3.500e-02, -3.829e-02, -1.840e-02, 1.008e-01, -2.292e-02, 3.331e-02, 1.530e-02, 3.491e-03, 1.641e-03, 2.776e-02, 7.546e-02)); + r += mul(s0_3, M4(7.560e-02, -3.680e-02, -1.262e-02, -2.280e-02, -3.754e-02, -9.010e-02, 7.737e-02, 6.975e-02, -2.890e-01, -1.377e-01, 6.193e-02, 1.340e-01, 1.297e-02, -2.207e-02, -2.043e-02, -4.829e-02)); + r += mul(s0_4, M4(2.365e-01, -2.331e-01, 1.118e-01, 1.209e-01, 1.117e-02, -9.303e-02, -9.648e-05, -1.518e-01, -3.367e-01, 8.023e-02, -1.159e-01, -8.597e-02, 1.433e-01, -1.751e-02, 1.518e-03, 3.134e-02)); + r += mul(s0_5, M4(-4.400e-02, -6.611e-02, -1.059e-01, -2.305e-02, 6.234e-03, -3.756e-02, -4.826e-03, -4.008e-02, -1.677e-01, -1.284e-01, 1.431e-01, 4.148e-02, 1.298e-01, -3.273e-02, 5.965e-03, 5.432e-02)); + r += mul(s0_6, M4(-6.353e-02, 8.337e-02, -3.857e-02, -2.829e-02, -3.215e-03, -1.428e-01, 3.896e-02, -1.339e-02, 1.479e-02, 7.588e-02, -1.057e-01, 4.416e-02, 6.222e-02, -4.782e-02, -2.898e-02, -3.526e-02)); + r += mul(s0_7, M4(-1.113e-01, 6.889e-02, 1.222e-01, 5.193e-02, -7.594e-02, 4.964e-02, 8.847e-03, 2.485e-02, 3.323e-01, -2.066e-01, -9.174e-02, 1.259e-01, 8.803e-02, -7.918e-02, 4.065e-02, 1.561e-02)); + r += mul(s0_8, M4(-4.717e-03, 3.938e-02, -5.724e-02, -1.059e-02, -1.039e-01, 3.829e-02, -6.498e-02, 1.782e-02, 1.593e-01, -5.529e-02, -5.608e-02, 1.020e-01, -3.413e-03, 1.366e-02, 1.714e-02, 5.552e-03)); + r += mul(s1_0, M4(7.586e-02, 3.628e-02, 3.292e-03, -1.218e-02, -2.084e-02, -7.520e-03, -9.144e-03, -2.570e-02, -4.835e-03, -1.008e-02, -3.211e-02, -2.545e-02, 1.710e-02, -7.760e-02, 7.692e-02, 9.374e-02)); + r += mul(s1_1, M4(9.785e-02, 8.141e-03, -6.459e-02, -5.718e-02, 8.235e-02, 4.175e-02, -1.180e-01, 1.333e-01, -1.943e-02, 3.633e-02, 4.322e-02, -3.006e-03, 7.250e-02, -1.302e-01, 6.711e-02, -2.551e-01)); + r += mul(s1_2, M4(1.206e-01, 4.771e-02, 1.311e-01, -1.836e-02, -3.410e-02, 1.290e-02, -6.934e-02, -4.725e-03, -7.862e-02, 3.476e-03, -1.437e-02, 1.828e-02, -1.412e-01, 6.391e-02, 4.649e-03, -9.304e-02)); + r += mul(s1_3, M4(-5.228e-02, -5.781e-02, -1.174e-02, 3.145e-02, 5.907e-02, 8.617e-02, 6.714e-02, -3.907e-02, 5.771e-02, -7.103e-02, -1.651e-02, 2.482e-02, -3.957e-02, -2.212e-01, 1.794e-01, 7.303e-02)); + r += mul(s1_4, M4(-1.779e-01, 8.501e-02, 3.207e-02, -1.450e-01, 1.176e-01, 1.274e-01, -4.872e-02, 4.053e-01, 3.342e-02, -4.093e-02, -7.129e-03, -1.106e-02, -2.820e-01, -1.113e-01, 2.251e-01, -7.125e-01)); + r += mul(s1_5, M4(-1.010e-02, -4.005e-02, 1.107e-01, 8.682e-02, -2.968e-02, 5.384e-02, -1.008e-01, -9.560e-02, 3.131e-02, 1.392e-03, 5.557e-03, 9.966e-03, 1.275e-01, -4.041e-02, 5.097e-02, -1.446e-01)); + r += mul(s1_6, M4(5.897e-02, -4.893e-02, 1.086e-02, 5.963e-02, 2.258e-02, -9.672e-02, -3.724e-02, -1.315e-01, -1.192e-02, -7.347e-02, 1.482e-02, 3.289e-02, 4.438e-02, -1.143e-01, 1.857e-01, 1.824e-01)); + r += mul(s1_7, M4(8.749e-02, -5.186e-02, -4.175e-02, -1.028e-01, 5.872e-02, -5.764e-02, 4.637e-02, 2.059e-01, 1.254e-01, -1.173e-01, -2.757e-02, 2.218e-03, -1.354e-01, -1.943e-01, -8.947e-02, -1.984e-01)); + r += mul(s1_8, M4(3.318e-03, 3.692e-02, 8.340e-02, 1.072e-01, -4.176e-02, 5.210e-02, -3.261e-04, 2.130e-02, -5.689e-03, 3.972e-03, 2.435e-02, 1.099e-02, 7.078e-03, -2.827e-03, 7.182e-02, 8.673e-02)); + r += mul(s2_0, M4(1.291e-02, -3.830e-02, -4.018e-02, 8.030e-03, 9.176e-02, 3.323e-03, -8.411e-02, -2.544e-02, 8.492e-02, 8.521e-02, -2.509e-02, -5.748e-03, -3.107e-02, -1.200e-02, 1.204e-02, 5.356e-02)); + r += mul(s2_1, M4(-2.296e-02, -6.058e-03, 7.210e-03, -2.304e-02, -3.666e-02, 9.114e-02, -1.274e-01, 7.791e-02, -1.240e-05, 9.711e-02, -8.943e-02, 9.498e-02, -1.958e-02, -2.426e-02, 5.381e-02, -3.134e-02)); + r += mul(s2_2, M4(5.071e-02, -2.808e-02, 2.896e-02, 2.517e-02, -1.061e-01, -9.929e-02, 3.763e-02, -6.403e-03, 1.436e-01, 1.704e-02, 2.727e-02, 1.008e-01, 2.704e-02, -5.297e-03, 1.933e-02, -3.730e-02)); + r += mul(s2_3, M4(2.860e-03, 5.863e-02, -1.089e-01, 5.943e-02, 2.059e-01, 1.105e-01, -3.185e-02, 1.028e-01, 1.689e-01, 2.686e-01, -1.146e-01, -4.051e-03, 4.745e-02, 3.347e-02, 4.123e-02, -3.907e-03)); + r += mul(s2_4, M4(1.016e-01, -8.799e-02, 1.260e-01, 1.206e-01, 2.857e-01, 1.680e-01, -4.300e-02, 2.488e-01, 1.589e-01, 3.359e-01, -1.774e-01, 2.562e-01, 1.264e-01, 3.470e-03, 1.608e-01, -1.381e-01)); + r += mul(s2_5, M4(-7.841e-02, 3.849e-02, -4.457e-02, -2.774e-02, -8.847e-02, 5.292e-02, -2.125e-01, -7.150e-02, -1.219e-01, 1.448e-01, 6.493e-02, 5.641e-02, 5.238e-02, 4.933e-02, 1.830e-01, -1.423e-01)); + r += mul(s2_6, M4(1.342e-02, 2.656e-02, -5.992e-02, 4.271e-02, 4.075e-03, 1.125e-02, 1.313e-02, -1.325e-01, 2.797e-02, -6.779e-02, -7.360e-02, -1.585e-03, -2.407e-03, 4.910e-03, -2.452e-02, 1.567e-02)); + r += mul(s2_7, M4(9.773e-02, 4.043e-02, 1.555e-02, -1.071e-02, 8.971e-02, 1.628e-01, 1.131e-02, 4.467e-01, 3.060e-02, 6.077e-02, -5.876e-02, 2.018e-01, -3.268e-02, 1.232e-01, 8.955e-02, -1.261e-01)); + r += mul(s2_8, M4(-1.874e-02, 2.312e-02, -1.151e-01, -3.373e-04, -6.412e-03, 3.135e-02, -4.381e-02, -1.055e-02, 3.871e-03, 4.973e-02, -7.849e-02, 3.332e-03, 1.271e-01, -9.244e-02, 3.887e-02, -5.154e-02)); + r += mul(s3_0, M4(1.036e-03, -8.569e-02, 1.218e-01, 2.093e-01, -4.657e-02, -3.873e-03, 1.242e-02, -2.976e-02, -2.957e-02, -4.404e-02, 4.678e-02, 4.112e-02, 3.632e-02, -1.145e-02, 1.252e-02, -2.102e-02)); + r += mul(s3_1, M4(1.155e-01, -1.149e-01, -1.369e-01, -1.560e-01, -1.744e-02, -3.161e-02, 5.220e-03, -2.918e-02, -1.461e-01, -4.223e-02, -2.358e-02, -8.501e-02, 6.100e-02, 4.602e-02, 1.639e-02, 2.726e-02)); + r += mul(s3_2, M4(3.795e-02, -1.800e-02, 5.280e-02, 1.153e-02, -9.406e-02, 6.172e-03, 5.216e-02, -1.007e-02, -3.424e-02, -3.728e-02, 2.888e-02, -1.508e-02, -9.406e-04, -4.032e-02, -6.712e-02, -2.512e-02)); + r += mul(s3_3, M4(4.153e-02, 9.395e-02, -9.089e-04, 1.137e-01, 1.831e-01, 5.065e-02, 6.709e-02, -9.444e-03, 1.631e-02, 2.292e-02, 2.117e-02, 4.207e-02, -3.171e-02, 3.065e-02, -1.305e-01, -4.601e-02)); + r += mul(s3_4, M4(-3.116e-01, -5.851e-02, -2.218e-01, -5.380e-01, 5.661e-02, -7.224e-02, 7.720e-02, -1.200e-01, 1.318e-02, 1.099e-01, -2.581e-02, 3.823e-02, -1.119e-01, -6.392e-03, 6.803e-02, 1.336e-01)); + r += mul(s3_5, M4(-2.828e-01, -9.250e-02, -7.496e-03, 3.760e-02, -9.597e-02, -1.174e-02, -6.336e-03, -6.538e-02, -9.218e-02, 7.557e-02, -3.513e-03, -5.946e-03, 1.581e-01, -3.998e-02, 7.530e-02, 2.452e-01)); + r += mul(s3_6, M4(-1.943e-01, 4.789e-02, -6.449e-02, 3.238e-02, -6.507e-02, -3.958e-02, 1.756e-02, -7.005e-02, -3.224e-03, 1.235e-02, 3.941e-02, -9.004e-03, 4.120e-02, 1.704e-02, -6.094e-02, -3.104e-03)); + r += mul(s3_7, M4(3.313e-02, 1.373e-02, -4.096e-02, -7.572e-03, -1.006e-01, 2.217e-01, -4.270e-02, 6.028e-05, -1.352e-02, -2.511e-02, -1.181e-02, -5.750e-02, 6.419e-02, 3.716e-02, 6.893e-02, -7.033e-03)); + r += mul(s3_8, M4(2.463e-02, -2.423e-02, 4.314e-02, 2.715e-03, -9.067e-02, 7.964e-03, -1.740e-02, -1.417e-02, -2.412e-03, 8.601e-03, -5.609e-02, -4.326e-02, -2.185e-01, 3.743e-02, 2.167e-03, 3.162e-02)); + r += mul(s4_0, M4(-3.291e-02, 2.270e-02, 4.077e-02, 2.796e-02, 7.450e-02, -2.478e-03, -3.507e-02, -1.515e-02, -6.977e-02, 3.246e-02, 8.137e-02, 7.233e-02, 6.702e-03, -3.982e-03, 5.725e-02, 2.816e-04)); + r += mul(s4_1, M4(-3.446e-02, 1.092e-01, -6.071e-02, -8.485e-02, 4.414e-02, -1.326e-02, 2.453e-02, 2.279e-02, 7.401e-02, -1.150e-01, -3.160e-02, -8.228e-02, 4.281e-02, 7.600e-02, 8.618e-02, 1.720e-02)); + r += mul(s4_2, M4(6.556e-02, 8.818e-02, -2.382e-02, 7.144e-02, -2.628e-02, 3.018e-02, -4.495e-02, -1.798e-02, 4.115e-02, -7.469e-02, -1.743e-02, -2.103e-02, -5.742e-02, 5.787e-02, -6.095e-02, -1.175e-02)); + r += mul(s4_3, M4(-8.912e-02, -1.611e-01, 6.763e-02, 6.021e-02, 2.892e-02, -1.182e-02, -2.709e-02, 7.934e-02, 4.207e-02, -1.868e-01, -1.718e-01, 3.170e-02, -6.664e-02, 1.254e-02, -1.698e-02, -5.976e-02)); + r += mul(s4_4, M4(8.374e-02, 9.909e-02, 6.506e-02, -1.439e-02, -6.977e-02, 4.786e-03, -1.697e-01, -9.840e-02, 2.172e-01, -9.600e-03, -1.772e-01, -2.745e-01, -3.708e-02, 2.665e-02, -3.142e-02, 8.629e-02)); + r += mul(s4_5, M4(2.115e-01, -4.760e-03, -1.529e-01, -4.313e-02, -7.121e-02, -2.899e-02, -4.600e-02, 5.944e-02, -8.202e-02, 7.803e-03, 5.726e-02, 1.435e-01, -2.347e-03, 1.732e-02, 3.681e-02, -4.667e-02)); + r += mul(s4_6, M4(-2.713e-02, -3.046e-02, 3.364e-02, 6.123e-02, -1.136e-02, 5.839e-02, -6.758e-02, 2.464e-02, -1.570e-02, 1.000e-01, -9.065e-02, -9.243e-02, 4.498e-02, -3.277e-02, -5.533e-03, -1.995e-02)); + r += mul(s4_7, M4(2.923e-02, -9.440e-02, 6.992e-03, -1.119e-01, 1.441e-03, -1.225e-03, 2.778e-02, 4.411e-02, -9.295e-02, -1.301e-01, 5.208e-02, -2.434e-03, -1.158e-02, -6.665e-03, 1.270e-02, 3.487e-03)); + r += mul(s4_8, M4(-1.583e-01, -1.284e-02, 1.077e-01, 1.784e-02, 1.477e-02, 1.177e-02, -1.049e-01, 3.212e-02, 1.332e-01, -9.264e-03, 1.031e-01, 1.339e-01, -3.333e-02, -1.368e-02, 8.314e-02, -3.010e-02)); + r += mul(s5_0, M4(-7.179e-02, 5.272e-02, -1.243e-01, -9.554e-03, -6.960e-02, -8.464e-02, 7.857e-02, -8.299e-03, 9.177e-02, 2.644e-02, -7.346e-02, -3.273e-02, -1.278e-01, 2.899e-02, 1.952e-01, 1.239e-01)); + r += mul(s5_1, M4(-1.492e-01, 5.505e-02, 6.646e-02, 4.484e-02, -8.677e-02, 1.566e-03, 1.786e-01, -8.437e-02, 3.549e-02, 1.309e-02, 1.116e-01, 1.697e-01, 1.790e-02, 1.489e-01, -3.890e-01, -1.688e-04)); + r += mul(s5_2, M4(-3.552e-02, 1.203e-02, 4.686e-03, -6.220e-02, 7.194e-02, -1.916e-03, -1.341e-01, 2.712e-02, -2.318e-02, 4.155e-02, -1.011e-01, -8.134e-02, 3.656e-02, -2.726e-02, 2.495e-01, 7.981e-02)); + r += mul(s5_3, M4(1.123e-01, -1.111e-01, -5.847e-02, -2.608e-02, -1.121e-01, 3.707e-02, 6.862e-02, -3.574e-02, -1.159e-01, -1.770e-01, 2.562e-02, 8.975e-04, 3.038e-02, 4.613e-02, 9.902e-02, 2.753e-02)); + r += mul(s5_4, M4(2.135e-01, -1.309e-01, 6.215e-02, 1.244e-01, -6.001e-01, -3.448e-01, 6.351e-01, -6.863e-01, -1.117e-01, 1.596e-02, 1.419e-01, 1.092e-02, 2.283e-01, 5.573e-02, -2.652e-01, -3.967e-02)); + r += mul(s5_5, M4(1.827e-01, 7.803e-03, -3.927e-02, -3.662e-02, -1.242e-01, 7.477e-02, -6.226e-02, 2.110e-03, 2.340e-02, 2.710e-02, -5.058e-02, -2.235e-02, 1.579e-01, -2.095e-02, 1.359e-01, 5.965e-02)); + r += mul(s5_6, M4(-3.795e-02, -2.222e-02, -5.652e-02, 1.478e-02, 3.860e-02, 2.259e-02, 1.439e-02, 1.043e-02, 2.601e-02, -7.573e-02, 8.292e-02, 7.048e-02, -8.373e-02, 4.477e-02, 4.754e-02, -4.149e-03)); + r += mul(s5_7, M4(1.704e-01, -9.205e-03, -2.108e-02, 1.881e-02, 1.268e-01, -6.519e-02, 3.233e-02, -1.141e-01, -1.000e-02, -3.744e-02, -2.276e-02, -1.411e-02, -1.528e-01, 3.616e-02, -8.978e-02, -7.246e-02)); + r += mul(s5_8, M4(1.876e-02, -2.578e-02, 3.945e-02, 6.642e-03, 1.662e-01, 9.105e-02, -1.487e-01, 6.059e-02, -8.806e-03, 2.749e-02, -1.692e-02, 1.774e-02, -1.055e-01, 2.088e-02, 8.990e-02, 5.275e-02)); + r += mul(s6_0, M4(1.573e-02, -6.888e-03, -4.979e-02, 1.519e-02, 2.973e-02, -5.261e-02, 3.624e-02, -7.583e-02, -3.794e-02, -1.598e-01, 8.630e-02, -2.981e-02, -2.372e-02, 5.984e-02, -2.515e-02, -5.868e-03)); + r += mul(s6_1, M4(2.470e-02, -4.338e-02, -3.948e-02, 1.234e-02, -1.575e-01, 4.389e-02, -5.306e-02, -6.776e-02, 2.467e-01, -1.589e-01, -1.711e-02, -2.030e-01, -6.872e-03, 1.258e-02, 1.350e-01, 5.095e-02)); + r += mul(s6_2, M4(-1.180e-02, -3.677e-02, 2.121e-02, -9.657e-03, -2.715e-03, -5.844e-02, 1.344e-01, 3.278e-02, 7.357e-02, -7.242e-02, 3.892e-02, 2.501e-02, -7.762e-02, 3.119e-02, -1.051e-01, -5.809e-02)); + r += mul(s6_3, M4(1.091e-01, 1.278e-02, -3.599e-02, 5.367e-03, 3.677e-02, -1.054e-01, 1.821e-01, 5.286e-02, -1.328e-01, 6.282e-02, 6.553e-02, -8.289e-03, 1.058e-01, 7.081e-03, 3.306e-02, 1.479e-02)); + r += mul(s6_4, M4(1.046e-01, -3.988e-02, 4.995e-02, 1.470e-01, 2.933e-01, 1.105e-01, -2.948e-01, -8.135e-02, 4.229e-01, 7.307e-02, -3.227e-01, 1.825e-01, -1.001e-02, 1.679e-01, 7.475e-02, -1.002e-01)); + r += mul(s6_5, M4(-1.456e-02, 1.389e-02, 2.569e-02, -7.156e-02, -6.755e-02, 3.306e-02, 4.274e-04, -1.295e-02, 9.901e-02, -7.322e-02, 4.438e-02, 5.605e-02, 1.685e-02, -1.109e-02, -8.532e-03, -3.867e-02)); + r += mul(s6_6, M4(-3.475e-02, 3.209e-02, 1.362e-02, 6.563e-03, -9.628e-02, -2.524e-03, 3.816e-02, 2.843e-02, 4.535e-02, 3.333e-02, -1.107e-01, -2.981e-02, 8.319e-03, 7.799e-04, 2.900e-04, -2.311e-02)); + r += mul(s6_7, M4(2.919e-02, 1.059e-02, 7.065e-03, -3.345e-02, 2.468e-02, 1.444e-03, -4.799e-02, -7.159e-02, -1.106e-01, 1.015e-01, -6.719e-02, 6.121e-02, 2.030e-01, 9.782e-02, 7.160e-03, -8.295e-02)); + r += mul(s6_8, M4(-7.268e-03, 4.832e-02, -6.109e-02, 4.652e-02, -6.329e-02, -5.492e-03, 4.236e-02, -9.245e-03, -9.686e-02, 4.322e-02, 2.277e-02, 7.572e-02, 7.280e-02, -2.059e-02, 6.613e-02, 1.643e-02)); + r += mul(s7_0, M4(-2.119e-02, 3.030e-02, -4.405e-02, 6.537e-02, 2.802e-02, 6.263e-03, -9.705e-03, -4.797e-02, -4.451e-04, 1.365e-02, 2.454e-02, -1.171e-03, -3.285e-03, -9.244e-02, -8.995e-03, 3.439e-02)); + r += mul(s7_1, M4(-4.763e-02, 8.042e-02, -1.512e-01, 5.042e-03, -1.447e-02, 5.979e-02, 1.804e-02, -3.810e-02, 4.092e-02, 9.670e-02, 7.289e-02, -7.576e-02, 5.053e-02, -1.740e-01, 1.056e-02, 1.016e-02)); + r += mul(s7_2, M4(-4.215e-02, 9.243e-03, 4.547e-02, 5.101e-02, 1.471e-02, -4.845e-02, 8.137e-02, 6.904e-03, 3.433e-03, 2.506e-03, 4.958e-02, 1.959e-02, 6.461e-02, -8.735e-03, -9.370e-02, 3.753e-02)); + r += mul(s7_3, M4(2.423e-01, -1.513e-02, -1.648e-01, 7.641e-02, -3.378e-02, 1.648e-02, 2.892e-02, 8.187e-02, -4.073e-02, 4.538e-02, 1.119e-01, -1.919e-02, 7.811e-02, -4.842e-02, -1.180e-01, -1.526e-02)); + r += mul(s7_4, M4(3.740e-01, 1.261e-01, -3.589e-01, -8.046e-03, -1.334e-01, -6.983e-02, 1.186e-01, -1.908e-01, 2.490e-01, 4.919e-02, 4.566e-02, -1.406e-01, -2.601e-01, 1.413e-03, 6.755e-01, -1.009e-01)); + r += mul(s7_5, M4(1.648e-01, -9.394e-02, 1.533e-01, 9.692e-02, -3.313e-02, 7.436e-02, 1.267e-02, 6.690e-02, 7.949e-02, -2.163e-02, 5.379e-02, -3.235e-02, 1.076e-01, -6.953e-02, -2.222e-01, -2.015e-01)); + r += mul(s7_6, M4(-5.087e-03, -3.670e-02, 8.675e-02, 1.666e-01, -9.506e-04, 1.749e-02, -8.476e-02, 1.666e-02, 4.410e-03, 5.603e-03, -8.273e-02, -4.501e-02, 1.623e-01, -1.785e-02, 1.753e-02, 1.361e-01)); + r += mul(s7_7, M4(-1.254e-01, 1.228e-01, -2.234e-01, 2.425e-02, 2.744e-02, 2.496e-02, -6.378e-02, -3.784e-02, 1.057e-02, -2.370e-02, 1.629e-01, 4.549e-02, -3.170e-02, -3.826e-02, 3.585e-02, -1.727e-01)); + r += mul(s7_8, M4(1.884e-02, -5.068e-02, -6.821e-02, -7.822e-02, -1.579e-02, -3.825e-02, 3.887e-02, -3.989e-03, 2.832e-02, 2.644e-02, -7.321e-02, -1.082e-02, -1.362e-02, -1.826e-02, -7.490e-03, 2.499e-02)); + r += V4(-7.589e-03, 2.995e-04, -9.737e-05, 7.202e-03); + return r; +} + +void Pass5(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = Rmp8x8(tid.x) + blockStart; + uint2 size = GetInputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = (gxy + 0.5) * pt; + + V4 s0_0 = l0(-1.0, -1.0); + V4 s0_1 = l0(0.0, -1.0); + V4 s0_2 = l0(1.0, -1.0); + V4 s0_3 = l0(-1.0, 0.0); + V4 s0_4 = l0(0.0, 0.0); + V4 s0_5 = l0(1.0, 0.0); + V4 s0_6 = l0(-1.0, 1.0); + V4 s0_7 = l0(0.0, 1.0); + V4 s0_8 = l0(1.0, 1.0); + V4 s1_0 = -max(-s0_0, 0.0); + V4 s1_1 = -max(-s0_1, 0.0); + V4 s1_2 = -max(-s0_2, 0.0); + V4 s1_3 = -max(-s0_3, 0.0); + V4 s1_4 = -max(-s0_4, 0.0); + V4 s1_5 = -max(-s0_5, 0.0); + V4 s1_6 = -max(-s0_6, 0.0); + V4 s1_7 = -max(-s0_7, 0.0); + V4 s1_8 = -max(-s0_8, 0.0); + s0_0 = max(s0_0, 0.0); + s0_1 = max(s0_1, 0.0); + s0_2 = max(s0_2, 0.0); + s0_3 = max(s0_3, 0.0); + s0_4 = max(s0_4, 0.0); + s0_5 = max(s0_5, 0.0); + s0_6 = max(s0_6, 0.0); + s0_7 = max(s0_7, 0.0); + s0_8 = max(s0_8, 0.0); + + V4 s2_0 = l1(-1.0, -1.0); + V4 s2_1 = l1(0.0, -1.0); + V4 s2_2 = l1(1.0, -1.0); + V4 s2_3 = l1(-1.0, 0.0); + V4 s2_4 = l1(0.0, 0.0); + V4 s2_5 = l1(1.0, 0.0); + V4 s2_6 = l1(-1.0, 1.0); + V4 s2_7 = l1(0.0, 1.0); + V4 s2_8 = l1(1.0, 1.0); + V4 s3_0 = -max(-s2_0, 0.0); + V4 s3_1 = -max(-s2_1, 0.0); + V4 s3_2 = -max(-s2_2, 0.0); + V4 s3_3 = -max(-s2_3, 0.0); + V4 s3_4 = -max(-s2_4, 0.0); + V4 s3_5 = -max(-s2_5, 0.0); + V4 s3_6 = -max(-s2_6, 0.0); + V4 s3_7 = -max(-s2_7, 0.0); + V4 s3_8 = -max(-s2_8, 0.0); + s2_0 = max(s2_0, 0.0); + s2_1 = max(s2_1, 0.0); + s2_2 = max(s2_2, 0.0); + s2_3 = max(s2_3, 0.0); + s2_4 = max(s2_4, 0.0); + s2_5 = max(s2_5, 0.0); + s2_6 = max(s2_6, 0.0); + s2_7 = max(s2_7, 0.0); + s2_8 = max(s2_8, 0.0); + + V4 s4_0 = l2(-1.0, -1.0); + V4 s4_1 = l2(0.0, -1.0); + V4 s4_2 = l2(1.0, -1.0); + V4 s4_3 = l2(-1.0, 0.0); + V4 s4_4 = l2(0.0, 0.0); + V4 s4_5 = l2(1.0, 0.0); + V4 s4_6 = l2(-1.0, 1.0); + V4 s4_7 = l2(0.0, 1.0); + V4 s4_8 = l2(1.0, 1.0); + V4 s5_0 = -max(-s4_0, 0.0); + V4 s5_1 = -max(-s4_1, 0.0); + V4 s5_2 = -max(-s4_2, 0.0); + V4 s5_3 = -max(-s4_3, 0.0); + V4 s5_4 = -max(-s4_4, 0.0); + V4 s5_5 = -max(-s4_5, 0.0); + V4 s5_6 = -max(-s4_6, 0.0); + V4 s5_7 = -max(-s4_7, 0.0); + V4 s5_8 = -max(-s4_8, 0.0); + s4_0 = max(s4_0, 0.0); + s4_1 = max(s4_1, 0.0); + s4_2 = max(s4_2, 0.0); + s4_3 = max(s4_3, 0.0); + s4_4 = max(s4_4, 0.0); + s4_5 = max(s4_5, 0.0); + s4_6 = max(s4_6, 0.0); + s4_7 = max(s4_7, 0.0); + s4_8 = max(s4_8, 0.0); + + V4 s6_0 = l3(-1.0, -1.0); + V4 s6_1 = l3(0.0, -1.0); + V4 s6_2 = l3(1.0, -1.0); + V4 s6_3 = l3(-1.0, 0.0); + V4 s6_4 = l3(0.0, 0.0); + V4 s6_5 = l3(1.0, 0.0); + V4 s6_6 = l3(-1.0, 1.0); + V4 s6_7 = l3(0.0, 1.0); + V4 s6_8 = l3(1.0, 1.0); + V4 s7_0 = -max(-s6_0, 0.0); + V4 s7_1 = -max(-s6_1, 0.0); + V4 s7_2 = -max(-s6_2, 0.0); + V4 s7_3 = -max(-s6_3, 0.0); + V4 s7_4 = -max(-s6_4, 0.0); + V4 s7_5 = -max(-s6_5, 0.0); + V4 s7_6 = -max(-s6_6, 0.0); + V4 s7_7 = -max(-s6_7, 0.0); + V4 s7_8 = -max(-s6_8, 0.0); + s6_0 = max(s6_0, 0.0); + s6_1 = max(s6_1, 0.0); + s6_2 = max(s6_2, 0.0); + s6_3 = max(s6_3, 0.0); + s6_4 = max(s6_4, 0.0); + s6_5 = max(s6_5, 0.0); + s6_6 = max(s6_6, 0.0); + s6_7 = max(s6_7, 0.0); + s6_8 = max(s6_8, 0.0); + + t0[gxy] = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t1[gxy] = f1(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t2[gxy] = f2(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t3[gxy] = f3(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); +} + +//!PASS 6 +//!DESC out-shuffle +//!BLOCK_SIZE 16 +//!NUM_THREADS 64 +//!IN INPUT, t0, t1, t2, t3 +//!OUT OUTPUT + +#define l0(x, y) V4(O(t0, float2(x, y))) +#define l1(x, y) V4(O(t1, float2(x, y))) +#define l2(x, y) V4(O(t2, float2(x, y))) +#define l3(x, y) V4(O(t3, float2(x, y))) + +V4 f0(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(6.706e-03, 2.738e-02, 1.982e-02, 3.446e-02, 1.264e-02, 1.304e-02, 7.763e-03, 1.023e-02, 6.302e-02, -1.182e-02, 2.278e-03, -1.232e-02, -3.429e-02, -2.040e-02, -1.168e-02, -1.181e-04)); + r += mul(s0_1, M4(1.620e-02, -1.199e-02, 4.502e-04, -2.397e-02, 1.938e-02, 2.430e-02, -2.373e-02, -1.482e-02, 2.732e-01, 2.037e-01, 1.514e-02, -4.439e-03, 1.380e-02, -2.781e-02, -1.160e-02, -5.282e-03)); + r += mul(s0_2, M4(-2.373e-02, -3.357e-02, -1.911e-02, -2.116e-02, 3.150e-03, -1.397e-02, 6.662e-03, 2.505e-03, -6.251e-03, 1.411e-01, -6.574e-03, 2.131e-02, -7.093e-03, -2.413e-03, 4.677e-03, -6.331e-03)); + r += mul(s0_3, M4(-8.154e-03, -2.709e-02, -4.627e-02, 1.616e-02, -1.821e-02, -1.728e-03, 1.458e-02, 3.793e-03, 7.761e-04, 1.175e-02, 4.766e-02, 4.329e-02, 7.208e-02, 2.035e-02, 3.456e-02, 7.867e-03)); + r += mul(s0_4, M4(3.753e-02, 8.269e-02, 4.995e-02, -7.103e-02, 2.705e-01, 1.385e-01, 1.998e-01, 1.450e-01, 3.745e-02, -3.325e-02, -5.085e-01, -2.738e-01, -3.485e-02, 8.088e-03, 1.705e-02, -1.057e-02)); + r += mul(s0_5, M4(-2.050e-02, -2.972e-02, -2.553e-02, 5.540e-03, -3.511e-03, 1.057e-01, 3.660e-04, 5.968e-02, -1.991e-03, 4.205e-02, 2.424e-02, -1.986e-01, -5.259e-03, 1.820e-02, -1.526e-02, 2.478e-02)); + r += mul(s0_6, M4(9.996e-04, 3.596e-03, 1.001e-02, 1.456e-02, -4.555e-03, 7.179e-03, -2.682e-02, -6.408e-03, 3.120e-03, 1.067e-02, 3.258e-03, -3.356e-03, 1.815e-03, -1.414e-02, 5.043e-03, -3.697e-03)); + r += mul(s0_7, M4(-3.559e-03, -8.496e-03, 3.859e-02, 9.324e-03, 9.646e-03, 8.992e-04, 9.910e-02, 2.640e-02, -1.351e-02, -3.127e-02, 9.650e-03, 8.386e-03, 1.654e-02, 6.433e-03, -2.265e-02, -1.257e-02)); + r += mul(s0_8, M4(-1.199e-04, -1.512e-03, -1.954e-03, 2.475e-02, -1.249e-03, 9.731e-03, 5.393e-04, 4.577e-02, -2.155e-03, 5.138e-03, 6.896e-03, 1.335e-02, 3.760e-03, 3.140e-03, 5.814e-03, 9.744e-03)); + r += mul(s1_0, M4(-8.659e-02, 3.889e-02, -2.871e-02, 3.276e-02, -8.269e-03, -5.772e-03, -7.633e-03, -3.066e-04, 3.702e-02, 6.132e-03, -2.208e-03, -6.681e-03, 2.615e-01, -3.704e-03, 3.935e-02, -1.550e-02)); + r += mul(s1_1, M4(5.674e-01, -3.038e-01, -7.032e-02, 2.502e-01, -1.740e-02, -8.063e-03, -3.653e-02, -3.674e-02, -1.522e-02, 3.629e-02, 3.234e-02, 1.025e-03, -5.206e-02, -1.642e-01, -3.535e-03, 1.201e-01)); + r += mul(s1_2, M4(-6.240e-02, -6.285e-03, -3.948e-03, -9.802e-02, -1.037e-02, -2.798e-02, -4.192e-03, -9.613e-03, 9.687e-03, 1.919e-04, 3.353e-03, 3.614e-02, -1.174e-02, -4.330e-02, -4.163e-03, -3.807e-02)); + r += mul(s1_3, M4(4.163e-02, -9.872e-03, 2.819e-02, 2.463e-02, -6.409e-02, -1.859e-02, -2.710e-02, -2.217e-02, 7.472e-03, 1.579e-02, 5.426e-02, 2.485e-02, -1.173e-01, 4.078e-03, -3.701e-02, 2.325e-01)); + r += mul(s1_4, M4(-2.448e-02, 1.968e-01, -1.342e-01, -2.612e-01, 2.046e-01, 7.601e-02, 1.447e-01, 1.028e-01, -3.414e-02, -6.663e-02, -8.081e-02, -2.704e-02, 5.723e-04, -3.118e-02, 3.543e-03, -3.026e-01)); + r += mul(s1_5, M4(-4.390e-02, -7.740e-02, -1.474e-02, 2.634e-01, -2.341e-02, 5.932e-02, -2.056e-02, 2.264e-02, -1.905e-02, -6.032e-03, 2.378e-03, -1.867e-02, 7.279e-04, 2.674e-02, -1.385e-02, 3.487e-02)); + r += mul(s1_6, M4(3.921e-03, 3.367e-03, 1.907e-02, 1.209e-02, -1.719e-02, -1.690e-03, -5.189e-02, -9.493e-03, 3.343e-03, 9.647e-03, 2.207e-03, 2.075e-03, -3.259e-03, -7.067e-03, -3.279e-02, -2.717e-02)); + r += mul(s1_7, M4(-2.856e-03, -4.601e-05, 6.812e-02, 4.533e-02, -1.426e-02, -2.584e-02, 5.481e-02, -1.690e-02, -6.950e-03, -2.264e-02, -1.304e-02, -1.176e-04, 2.057e-02, 7.382e-03, -1.340e-02, -5.682e-03)); + r += mul(s1_8, M4(2.008e-02, -3.867e-05, 4.696e-03, 4.263e-02, -1.265e-03, -7.850e-03, -5.589e-03, 1.498e-02, 1.009e-03, 5.427e-03, -9.848e-03, -2.229e-02, 4.909e-03, 1.174e-02, 1.151e-02, 1.605e-02)); + r += mul(s2_0, M4(1.550e-02, 7.876e-03, 1.935e-02, -2.579e-02, 3.936e-02, -1.027e-02, -4.275e-03, -4.746e-04, 6.157e-04, 1.466e-03, -8.017e-03, -7.368e-03, -2.300e-01, 6.241e-02, 2.634e-03, 2.035e-02)); + r += mul(s2_1, M4(-1.844e-02, 6.846e-02, 5.139e-02, 6.380e-02, 1.223e-03, 8.304e-02, 1.181e-02, 1.088e-03, 1.064e-01, -6.148e-03, -5.413e-03, -4.218e-03, -6.852e-03, -7.436e-02, -1.611e-02, 7.466e-03)); + r += mul(s2_2, M4(-2.136e-03, -2.562e-02, 1.898e-02, 3.205e-02, -6.119e-03, -2.026e-02, -4.648e-03, -2.375e-04, 1.091e-02, 6.421e-02, 6.904e-03, -1.513e-02, 4.585e-03, 1.058e-02, 6.842e-03, 5.545e-03)); + r += mul(s2_3, M4(1.061e-01, -4.794e-03, 1.037e-01, 3.058e-02, 4.968e-02, 2.590e-02, 9.155e-02, 1.009e-02, -3.137e-02, 1.630e-02, -6.220e-03, 2.111e-02, -9.500e-02, 1.714e-01, -4.057e-01, 1.782e-01)); + r += mul(s2_4, M4(2.339e-01, -5.819e-01, -2.723e-01, 6.472e-03, -1.238e-01, -1.127e-02, -6.174e-02, 6.429e-02, -1.267e-01, -3.096e-01, 1.014e-01, -2.204e-01, 2.052e-02, 1.475e-01, 6.066e-02, 9.589e-02)); + r += mul(s2_5, M4(-2.304e-02, 2.318e-02, 2.866e-02, -4.408e-02, 1.489e-02, -5.801e-02, -1.756e-03, -3.577e-02, 5.791e-02, 2.144e-01, 9.753e-03, 1.912e-01, -3.009e-02, 5.106e-03, -1.229e-02, 1.420e-02)); + r += mul(s2_6, M4(4.358e-02, 3.502e-02, -6.798e-02, 5.187e-02, -4.211e-04, 1.322e-03, 5.382e-03, 2.963e-03, -2.588e-03, -7.874e-03, -2.179e-02, -1.582e-03, -2.461e-02, -6.470e-02, -3.839e-03, 2.191e-02)); + r += mul(s2_7, M4(-6.287e-03, 2.149e-02, 7.913e-02, -5.061e-02, 1.243e-02, -7.702e-03, -4.872e-02, -1.086e-02, 1.832e-02, 9.044e-02, -5.083e-02, -6.268e-02, 1.514e-02, 1.465e-03, -1.091e-02, 6.273e-03)); + r += mul(s2_8, M4(1.213e-02, 1.402e-02, -1.088e-02, 1.310e-02, -2.250e-03, 1.604e-02, 6.334e-03, -2.184e-02, -3.757e-04, -3.529e-02, 4.777e-02, 5.153e-02, 8.795e-03, 5.222e-03, -6.544e-03, 9.581e-03)); + r += mul(s3_0, M4(-1.079e-02, 1.253e-04, 4.458e-03, -1.254e-02, 9.123e-02, 4.150e-03, 1.458e-02, 1.127e-02, 1.968e-02, 4.168e-03, -3.046e-03, -1.191e-02, -2.692e-03, -8.615e-03, -9.278e-03, 2.227e-02)); + r += mul(s3_1, M4(1.472e-03, -2.004e-02, 2.582e-02, 4.490e-02, 5.903e-02, 1.377e-01, 4.830e-02, 4.055e-02, -5.469e-03, 2.753e-02, -5.264e-03, -7.181e-03, -1.594e-02, -1.295e-01, -6.401e-03, -6.162e-03)); + r += mul(s3_2, M4(-2.532e-03, 1.243e-02, 2.114e-03, 1.702e-02, 4.265e-03, 1.309e-02, 7.171e-03, 1.492e-02, -1.846e-03, 1.942e-02, 1.357e-02, -1.592e-04, 3.933e-03, 9.982e-03, 6.534e-03, -2.432e-03)); + r += mul(s3_3, M4(7.380e-03, -2.116e-02, -1.380e-02, 2.664e-02, 7.186e-02, 4.053e-02, 1.256e-01, 2.894e-02, -1.920e-02, 1.135e-02, 3.353e-02, 2.217e-02, 8.643e-02, 4.063e-02, 1.027e-01, -2.016e-02)); + r += mul(s3_4, M4(-1.645e-02, 3.861e-02, -3.602e-02, -6.018e-02, -1.166e-01, -1.456e-02, -3.626e-02, 9.418e-02, -3.214e-02, -6.153e-02, -5.345e-02, 2.475e-02, -2.590e-02, 6.906e-02, -9.229e-03, -5.921e-02)); + r += mul(s3_5, M4(-1.950e-02, -1.801e-02, 1.145e-02, -5.417e-03, 1.553e-02, -4.899e-02, 3.746e-03, -2.643e-02, 1.086e-02, -1.598e-02, -2.667e-02, -1.705e-02, -2.110e-02, 2.587e-02, -7.802e-03, 4.066e-02)); + r += mul(s3_6, M4(2.483e-02, 2.045e-02, 2.890e-02, 2.709e-02, 1.065e-02, 3.481e-03, 2.060e-02, 1.064e-02, -1.112e-02, -1.077e-02, -3.564e-02, -7.229e-03, -2.201e-02, -7.123e-02, -3.014e-02, -9.062e-03)); + r += mul(s3_7, M4(-1.130e-02, -8.691e-03, -2.022e-02, -1.872e-03, 1.187e-02, -1.794e-03, -5.008e-02, -8.469e-03, 1.349e-02, 7.055e-02, 2.765e-02, -1.753e-02, 2.082e-02, 8.165e-03, -3.951e-04, 5.765e-03)); + r += mul(s3_8, M4(1.337e-02, -3.658e-03, -1.502e-02, -2.274e-02, -9.337e-04, 1.728e-02, 8.759e-03, -2.078e-02, 4.858e-03, -2.704e-02, 2.696e-02, 5.332e-03, 8.513e-03, -1.582e-03, -4.886e-03, 5.885e-03)); + r += mul(s4_0, M4(3.610e-03, 1.743e-04, 7.204e-04, -4.711e-03, -1.319e-01, -1.839e-02, -9.755e-03, -9.129e-03, -7.165e-04, -1.347e-02, 6.162e-03, 1.950e-03, 1.229e-03, 3.174e-03, 4.744e-04, 1.910e-03)); + r += mul(s4_1, M4(1.342e-02, 5.925e-03, 1.500e-02, 1.613e-02, -1.814e-01, -2.920e-01, -1.278e-02, 4.213e-03, -1.575e-02, 5.395e-03, -2.002e-03, -4.321e-03, 1.622e-03, 3.033e-03, -7.231e-03, -6.567e-03)); + r += mul(s4_2, M4(1.099e-03, 2.215e-03, -5.874e-03, -4.530e-04, 6.192e-03, -6.228e-03, -3.858e-03, -1.363e-02, 3.433e-03, -9.166e-03, 3.268e-03, 4.154e-03, -4.996e-04, -3.292e-04, -7.646e-03, -9.518e-03)); + r += mul(s4_3, M4(1.052e-02, 1.420e-02, 4.065e-03, 1.323e-02, 3.106e-02, 2.095e-02, 2.641e-02, -2.029e-02, 3.237e-02, -9.146e-03, -1.105e-02, -3.650e-02, -1.699e-02, -5.951e-03, -1.118e-02, -1.966e-02)); + r += mul(s4_4, M4(-2.217e-04, -3.200e-02, -3.792e-02, -5.471e-02, 2.181e-02, -1.362e-02, 3.526e-01, 2.753e-01, -1.813e-03, 3.984e-02, 7.449e-03, 5.883e-02, -1.606e-02, 2.281e-02, 5.425e-02, 3.770e-02)); + r += mul(s4_5, M4(1.261e-03, 1.474e-02, 7.484e-03, 1.939e-03, -2.267e-02, 2.509e-02, -2.069e-02, 9.510e-02, -7.844e-03, 4.294e-04, -6.696e-03, -1.740e-02, 3.167e-02, -2.329e-02, 1.160e-02, 5.096e-02)); + r += mul(s4_6, M4(2.120e-03, 9.430e-03, 1.219e-02, 7.862e-03, 3.047e-03, 1.150e-02, 4.749e-02, 2.562e-02, -9.188e-03, 2.203e-02, 3.607e-02, 3.083e-03, -2.106e-03, 2.432e-03, 1.199e-03, -4.127e-03)); + r += mul(s4_7, M4(-1.028e-02, -1.226e-02, 3.231e-02, 1.802e-02, 3.789e-03, -6.684e-03, -1.964e-02, 9.650e-03, 3.068e-03, -3.723e-02, -3.946e-02, 1.179e-02, -7.176e-03, -1.497e-02, -7.633e-02, 2.594e-02)); + r += mul(s4_8, M4(-3.920e-03, -8.312e-03, -9.664e-03, 8.452e-03, 2.961e-03, -2.312e-03, -1.455e-02, -1.813e-02, 2.082e-03, -2.123e-04, 8.967e-04, -1.630e-02, 1.116e-02, 9.301e-03, 3.381e-02, -7.034e-02)); + r += mul(s5_0, M4(1.728e-02, -1.585e-05, -9.193e-03, -6.659e-03, -1.837e-02, -1.407e-02, 1.653e-03, -5.910e-03, -1.014e-01, -1.989e-02, 1.128e-04, 7.965e-03, 6.667e-03, 5.024e-03, 7.592e-03, 3.754e-03)); + r += mul(s5_1, M4(3.763e-02, 1.312e-02, -1.504e-02, -1.373e-02, -6.919e-03, -4.613e-02, -1.367e-02, -1.003e-02, 2.991e-02, -9.302e-02, 2.019e-02, 1.075e-02, 2.194e-02, 2.247e-02, 3.750e-03, 2.476e-03)); + r += mul(s5_2, M4(9.883e-03, 2.720e-02, -1.846e-02, -2.238e-02, -1.193e-02, 5.010e-03, -9.641e-03, -5.314e-03, 5.198e-03, 6.518e-04, 4.161e-03, 6.686e-03, -2.658e-02, -7.220e-03, -7.024e-03, -1.111e-03)); + r += mul(s5_3, M4(-1.562e-02, 9.244e-03, 6.323e-02, 1.166e-02, 9.164e-03, 6.390e-03, -4.895e-02, 2.439e-03, -3.811e-02, -9.895e-02, 2.417e-01, -6.693e-02, 1.474e-02, -9.886e-05, 7.191e-03, -1.361e-02)); + r += mul(s5_4, M4(-4.278e-01, -2.293e-01, 3.549e-01, 1.887e-01, 5.394e-02, 2.415e-03, 4.315e-02, -6.372e-02, -2.050e-01, 6.035e-01, -1.450e-01, -2.261e-01, -2.389e-01, 5.383e-02, 8.571e-02, 9.038e-02)); + r += mul(s5_5, M4(-6.487e-02, -2.900e-01, 3.513e-02, 2.660e-01, -2.179e-02, 4.067e-02, -1.280e-02, 3.715e-02, -1.417e-02, -6.856e-02, -1.100e-03, 1.504e-02, 2.764e-01, -1.850e-01, -7.299e-02, -4.783e-02)); + r += mul(s5_6, M4(1.426e-02, 7.731e-03, -1.884e-03, 3.143e-03, 6.810e-03, 1.151e-02, 5.335e-02, 1.234e-02, 1.521e-02, 6.843e-03, -6.522e-02, 2.987e-02, -4.732e-03, -1.716e-03, 1.397e-02, 5.751e-03)); + r += mul(s5_7, M4(1.255e-02, 1.881e-02, 1.056e-02, -1.908e-02, -1.926e-03, -5.265e-03, -2.304e-03, 3.788e-02, -1.586e-02, -7.495e-02, 1.929e-01, -4.114e-02, 2.569e-01, -9.647e-02, -1.509e-01, -1.543e-01)); + r += mul(s5_8, M4(2.466e-02, 1.450e-02, -3.034e-02, -1.328e-02, 6.704e-03, -1.769e-03, -3.458e-03, 3.007e-03, 2.685e-02, -3.713e-02, -1.753e-02, -4.535e-03, 1.058e-02, -5.708e-02, 5.038e-02, 2.939e-01)); + r += mul(s6_0, M4(-4.531e-03, -8.348e-03, -5.183e-03, -1.459e-03, 5.203e-03, -1.217e-04, -5.029e-03, 7.963e-03, 2.546e-02, -3.475e-02, 8.723e-03, -1.175e-02, 3.405e-03, 6.611e-03, 1.978e-03, 2.428e-03)); + r += mul(s6_1, M4(-2.185e-03, -2.680e-03, 4.320e-03, -7.711e-03, -5.130e-02, -1.818e-02, -4.918e-02, -6.470e-02, -1.355e-01, 1.808e-01, -1.148e-02, 9.756e-04, 2.852e-03, -7.537e-02, 2.680e-02, 4.285e-02)); + r += mul(s6_2, M4(-1.070e-02, 4.954e-03, 2.978e-03, 9.844e-03, 1.107e-02, -9.837e-03, 1.935e-02, 2.246e-02, 2.193e-02, -4.628e-02, 9.669e-03, -8.352e-03, -4.623e-03, 3.010e-02, 1.293e-02, 9.552e-03)); + r += mul(s6_3, M4(7.925e-03, -5.744e-03, 3.464e-03, 1.769e-04, -1.121e-02, -1.561e-02, 1.824e-02, -3.989e-02, 2.250e-02, -3.043e-02, 3.715e-02, -6.117e-02, 3.335e-02, -1.336e-02, 5.664e-02, 1.929e-02)); + r += mul(s6_4, M4(6.696e-03, 4.596e-03, -2.174e-02, -2.013e-02, 5.530e-02, 3.743e-02, 5.506e-02, 1.587e-01, -3.331e-01, 3.474e-01, -3.669e-01, 5.025e-01, -4.944e-02, 3.737e-02, -4.266e-02, -1.045e-01)); + r += mul(s6_5, M4(-1.437e-02, 2.715e-03, -1.708e-03, 7.397e-03, -1.268e-02, 2.074e-02, -1.405e-02, -4.529e-02, 2.829e-03, 1.265e-03, 1.605e-02, -7.341e-02, -5.201e-03, 1.521e-02, -9.495e-03, 4.242e-02)); + r += mul(s6_6, M4(2.535e-04, 1.031e-02, 7.683e-03, 7.707e-04, -1.282e-02, -5.099e-03, -1.141e-02, -1.839e-02, -1.007e-02, -2.516e-02, -4.471e-03, -1.873e-02, -6.821e-03, -2.326e-02, -2.518e-02, -1.273e-02)); + r += mul(s6_7, M4(3.362e-03, -2.606e-02, 1.189e-02, 1.764e-02, 2.339e-02, -1.431e-02, -2.236e-02, 1.224e-03, 2.395e-03, 1.231e-02, -6.983e-02, 5.847e-02, 6.893e-03, 9.406e-03, -1.467e-02, 6.487e-03)); + r += mul(s6_8, M4(1.385e-03, 1.439e-02, -1.064e-02, -7.657e-03, 8.523e-05, 2.189e-02, 3.952e-03, -4.479e-03, 3.323e-03, -1.651e-02, 1.816e-03, -1.029e-03, 1.190e-02, -1.157e-02, 9.120e-03, -1.558e-02)); + r += mul(s7_0, M4(-4.056e-02, -2.108e-02, 1.828e-02, 1.432e-02, -3.539e-03, 1.663e-02, -9.396e-03, 4.822e-03, 8.786e-03, -8.241e-05, 4.654e-03, 8.757e-03, -8.862e-02, 2.074e-02, 2.974e-02, -1.814e-02)); + r += mul(s7_1, M4(-5.678e-02, -5.286e-02, 3.109e-02, 1.401e-02, 1.048e-01, 7.690e-02, -3.782e-02, -4.993e-02, -2.728e-02, 1.580e-02, 3.322e-03, -1.647e-02, -1.076e-01, 1.363e-01, -1.095e-02, 5.280e-02)); + r += mul(s7_2, M4(-1.123e-02, -2.316e-02, 6.307e-03, 2.675e-02, -3.419e-03, 3.929e-02, 9.452e-03, 1.004e-02, -1.637e-03, -1.911e-02, 5.418e-03, 1.204e-02, 1.972e-02, 1.721e-02, 2.992e-02, 8.433e-03)); + r += mul(s7_3, M4(1.490e-01, -9.791e-03, -1.428e-01, -1.558e-02, -6.523e-02, -1.196e-02, -6.402e-02, -3.144e-02, 5.498e-03, 1.826e-02, 2.666e-02, -1.873e-02, -3.081e-02, 2.688e-02, -1.907e-01, 8.472e-02)); + r += mul(s7_4, M4(3.719e-01, 4.177e-01, -3.323e-01, -3.875e-01, -6.588e-02, -1.706e-01, 2.773e-01, 1.075e-01, 2.692e-02, -9.144e-03, -3.408e-02, 8.546e-02, -2.251e-01, 7.381e-02, -4.385e-01, 4.693e-01)); + r += mul(s7_5, M4(-1.497e-02, 1.150e-01, -7.533e-03, -7.972e-02, -7.560e-03, 3.861e-02, -1.411e-02, 9.379e-02, -3.411e-03, -1.342e-03, -1.345e-03, -6.180e-02, 1.408e-02, 4.882e-02, 2.710e-02, 4.628e-02)); + r += mul(s7_6, M4(-1.653e-02, 4.965e-03, 3.135e-02, 1.568e-02, -9.323e-04, 9.862e-03, -1.727e-02, -1.187e-02, -1.217e-02, -1.441e-02, -2.301e-02, 8.357e-03, 5.023e-03, -1.157e-02, -4.895e-02, -4.306e-05)); + r += mul(s7_7, M4(-3.122e-02, -5.748e-02, 1.710e-02, 3.771e-02, 1.876e-02, -1.052e-02, -1.102e-01, -6.328e-02, 4.230e-03, 1.399e-02, 3.042e-02, -3.180e-02, -1.349e-02, 3.137e-02, -6.765e-02, 2.530e-02)); + r += mul(s7_8, M4(1.825e-03, -4.076e-04, 2.666e-03, 1.097e-03, -7.524e-03, 2.039e-02, -3.127e-02, -6.067e-02, -6.952e-03, -8.859e-03, -8.515e-03, 9.646e-03, 2.047e-02, -1.944e-02, 2.644e-02, -2.179e-02)); + r += V4(1.512e-04, -2.611e-04, 1.538e-04, -1.644e-04); + return tanh(r); +} + +void Pass6(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = (Rmp8x8(tid.x) << 1) + blockStart; + uint2 size = GetOutputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = ((gxy >> 1) + 0.5) * pt; + + V4 s0_0 = l0(-1.0, -1.0); + V4 s0_1 = l0(0.0, -1.0); + V4 s0_2 = l0(1.0, -1.0); + V4 s0_3 = l0(-1.0, 0.0); + V4 s0_4 = l0(0.0, 0.0); + V4 s0_5 = l0(1.0, 0.0); + V4 s0_6 = l0(-1.0, 1.0); + V4 s0_7 = l0(0.0, 1.0); + V4 s0_8 = l0(1.0, 1.0); + V4 s1_0 = -max(-s0_0, 0.0); + V4 s1_1 = -max(-s0_1, 0.0); + V4 s1_2 = -max(-s0_2, 0.0); + V4 s1_3 = -max(-s0_3, 0.0); + V4 s1_4 = -max(-s0_4, 0.0); + V4 s1_5 = -max(-s0_5, 0.0); + V4 s1_6 = -max(-s0_6, 0.0); + V4 s1_7 = -max(-s0_7, 0.0); + V4 s1_8 = -max(-s0_8, 0.0); + s0_0 = max(s0_0, 0.0); + s0_1 = max(s0_1, 0.0); + s0_2 = max(s0_2, 0.0); + s0_3 = max(s0_3, 0.0); + s0_4 = max(s0_4, 0.0); + s0_5 = max(s0_5, 0.0); + s0_6 = max(s0_6, 0.0); + s0_7 = max(s0_7, 0.0); + s0_8 = max(s0_8, 0.0); + + V4 s2_0 = l1(-1.0, -1.0); + V4 s2_1 = l1(0.0, -1.0); + V4 s2_2 = l1(1.0, -1.0); + V4 s2_3 = l1(-1.0, 0.0); + V4 s2_4 = l1(0.0, 0.0); + V4 s2_5 = l1(1.0, 0.0); + V4 s2_6 = l1(-1.0, 1.0); + V4 s2_7 = l1(0.0, 1.0); + V4 s2_8 = l1(1.0, 1.0); + V4 s3_0 = -max(-s2_0, 0.0); + V4 s3_1 = -max(-s2_1, 0.0); + V4 s3_2 = -max(-s2_2, 0.0); + V4 s3_3 = -max(-s2_3, 0.0); + V4 s3_4 = -max(-s2_4, 0.0); + V4 s3_5 = -max(-s2_5, 0.0); + V4 s3_6 = -max(-s2_6, 0.0); + V4 s3_7 = -max(-s2_7, 0.0); + V4 s3_8 = -max(-s2_8, 0.0); + s2_0 = max(s2_0, 0.0); + s2_1 = max(s2_1, 0.0); + s2_2 = max(s2_2, 0.0); + s2_3 = max(s2_3, 0.0); + s2_4 = max(s2_4, 0.0); + s2_5 = max(s2_5, 0.0); + s2_6 = max(s2_6, 0.0); + s2_7 = max(s2_7, 0.0); + s2_8 = max(s2_8, 0.0); + + V4 s4_0 = l2(-1.0, -1.0); + V4 s4_1 = l2(0.0, -1.0); + V4 s4_2 = l2(1.0, -1.0); + V4 s4_3 = l2(-1.0, 0.0); + V4 s4_4 = l2(0.0, 0.0); + V4 s4_5 = l2(1.0, 0.0); + V4 s4_6 = l2(-1.0, 1.0); + V4 s4_7 = l2(0.0, 1.0); + V4 s4_8 = l2(1.0, 1.0); + V4 s5_0 = -max(-s4_0, 0.0); + V4 s5_1 = -max(-s4_1, 0.0); + V4 s5_2 = -max(-s4_2, 0.0); + V4 s5_3 = -max(-s4_3, 0.0); + V4 s5_4 = -max(-s4_4, 0.0); + V4 s5_5 = -max(-s4_5, 0.0); + V4 s5_6 = -max(-s4_6, 0.0); + V4 s5_7 = -max(-s4_7, 0.0); + V4 s5_8 = -max(-s4_8, 0.0); + s4_0 = max(s4_0, 0.0); + s4_1 = max(s4_1, 0.0); + s4_2 = max(s4_2, 0.0); + s4_3 = max(s4_3, 0.0); + s4_4 = max(s4_4, 0.0); + s4_5 = max(s4_5, 0.0); + s4_6 = max(s4_6, 0.0); + s4_7 = max(s4_7, 0.0); + s4_8 = max(s4_8, 0.0); + + V4 s6_0 = l3(-1.0, -1.0); + V4 s6_1 = l3(0.0, -1.0); + V4 s6_2 = l3(1.0, -1.0); + V4 s6_3 = l3(-1.0, 0.0); + V4 s6_4 = l3(0.0, 0.0); + V4 s6_5 = l3(1.0, 0.0); + V4 s6_6 = l3(-1.0, 1.0); + V4 s6_7 = l3(0.0, 1.0); + V4 s6_8 = l3(1.0, 1.0); + V4 s7_0 = -max(-s6_0, 0.0); + V4 s7_1 = -max(-s6_1, 0.0); + V4 s7_2 = -max(-s6_2, 0.0); + V4 s7_3 = -max(-s6_3, 0.0); + V4 s7_4 = -max(-s6_4, 0.0); + V4 s7_5 = -max(-s6_5, 0.0); + V4 s7_6 = -max(-s6_6, 0.0); + V4 s7_7 = -max(-s6_7, 0.0); + V4 s7_8 = -max(-s6_8, 0.0); + s6_0 = max(s6_0, 0.0); + s6_1 = max(s6_1, 0.0); + s6_2 = max(s6_2, 0.0); + s6_3 = max(s6_3, 0.0); + s6_4 = max(s6_4, 0.0); + s6_5 = max(s6_5, 0.0); + s6_6 = max(s6_6, 0.0); + s6_7 = max(s6_7, 0.0); + s6_8 = max(s6_8, 0.0); + + V4 r = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + + static const float3x3 rgb2yuv = {0.299, 0.587, 0.114, -0.169, -0.331, 0.5, 0.5, -0.419, -0.081}; + static const float3x3 yuv2rgb = {1, -0.00093, 1.401687, 1, -0.3437, -0.71417, 1, 1.77216, 0.00099}; + float2 opt = float2(GetOutputPt()); + + pos -= 0.5f * opt; + float3 yuv = mul(rgb2yuv, INPUT.SampleLevel(SL, pos, 0).rgb); + OUTPUT[gxy] = float4(mul(yuv2rgb, float3(saturate(yuv.r + r.x), yuv.yz)), 1); + + ++gxy.x; + pos.x += opt.x; + yuv = mul(rgb2yuv, INPUT.SampleLevel(SL, pos, 0).rgb); + OUTPUT[gxy] = float4(mul(yuv2rgb, float3(saturate(yuv.r + r.y), yuv.yz)), 1); + + ++gxy.y; + pos.y += opt.y; + yuv = mul(rgb2yuv, INPUT.SampleLevel(SL, pos, 0).rgb); + OUTPUT[gxy] = float4(mul(yuv2rgb, float3(saturate(yuv.r + r.w), yuv.yz)), 1); + + --gxy.x; + pos.x -= opt.x; + yuv = mul(rgb2yuv, INPUT.SampleLevel(SL, pos, 0).rgb); + OUTPUT[gxy] = float4(mul(yuv2rgb, float3(saturate(yuv.r + r.z), yuv.yz)), 1); +} diff --git a/src/Effects/CuNNy/CuNNy-4x16C-NVL.hlsl b/src/Effects/CuNNy/CuNNy-4x16C-NVL.hlsl new file mode 100644 index 000000000..1dfab5ed6 --- /dev/null +++ b/src/Effects/CuNNy/CuNNy-4x16C-NVL.hlsl @@ -0,0 +1,2223 @@ +// CuNNy 4x16C BILINEAR RGB NVL - https://github.com/cunnyplapper/CuNNy + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +//!MAGPIE EFFECT +//!VERSION 4 +//!SORT_NAME CuNNy-D16N04 + +//!TEXTURE +Texture2D INPUT; + +//!TEXTURE +//!WIDTH INPUT_WIDTH * 2 +//!HEIGHT INPUT_HEIGHT * 2 +Texture2D OUTPUT; + +//!SAMPLER +//!FILTER POINT +SamplerState SP; + +//!SAMPLER +//!FILTER LINEAR +SamplerState SL; + +//!COMMON +#define O(t, p) t.SampleLevel(SP, pos + p * pt, 0) +#define V4 min16float4 +#define M4 min16float4x4 + +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +//!FORMAT R8G8B8A8_SNORM +Texture2D t0; + +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +//!FORMAT R8G8B8A8_SNORM +Texture2D t1; + +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +//!FORMAT R8G8B8A8_SNORM +Texture2D t2; + +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +//!FORMAT R8G8B8A8_SNORM +Texture2D t3; + +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +//!FORMAT R8G8B8A8_SNORM +Texture2D t4; + +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +//!FORMAT R8G8B8A8_SNORM +Texture2D t5; + +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +//!FORMAT R8G8B8A8_SNORM +Texture2D t6; + +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +//!FORMAT R8G8B8A8_SNORM +Texture2D t7; + +//!PASS 1 +//!DESC in +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 +//!IN INPUT +//!OUT t0, t1, t2, t3 + +#define l0(x, y) min16float((dot(float3(1.870e-01, 3.591e-01, 7.602e-02), O(INPUT, float2(x, y)).rgb) + -4.087e-01)) + +V4 f0(min16float s0_0, min16float s0_1, min16float s0_2, min16float s0_3, min16float s0_4, min16float s0_5, min16float s0_6, min16float s0_7, min16float s0_8) { + V4 r = 0.0; + r += V4(8.371e-02, -3.545e-01, -3.840e-02, -6.216e-03) * s0_0; + r += V4(-3.142e-01, 3.579e-01, -1.140e-01, 3.073e-02) * s0_1; + r += V4(1.333e-01, -7.066e-03, 1.714e-01, 3.818e-01) * s0_2; + r += V4(-7.350e-02, 4.033e-01, 1.318e-01, -1.724e-03) * s0_3; + r += V4(-4.259e-02, -3.955e-01, -3.838e-01, -1.100e-01) * s0_4; + r += V4(1.791e-01, -2.211e-03, -1.344e-01, -2.725e-01) * s0_5; + r += V4(9.662e-03, -4.290e-02, 2.646e-01, 6.740e-03) * s0_6; + r += V4(5.519e-02, 3.918e-02, 1.461e-01, -2.911e-02) * s0_7; + r += V4(-4.700e-02, 5.593e-03, -4.187e-02, -2.506e-03) * s0_8; + r += V4(-1.070e-02, -1.340e-03, -2.419e-04, 5.535e-03); + return r; +} + +V4 f1(min16float s0_0, min16float s0_1, min16float s0_2, min16float s0_3, min16float s0_4, min16float s0_5, min16float s0_6, min16float s0_7, min16float s0_8) { + V4 r = 0.0; + r += V4(-2.701e-02, 8.362e-02, -1.470e-01, -2.450e-03) * s0_0; + r += V4(7.854e-02, -6.238e-02, 2.998e-01, -2.166e-02) * s0_1; + r += V4(-3.843e-02, -1.087e-03, 8.015e-03, -8.253e-03) * s0_2; + r += V4(8.528e-02, -4.219e-02, -3.129e-02, -7.154e-02) * s0_3; + r += V4(1.907e-01, -3.604e-01, -1.470e-01, -1.043e-01) * s0_4; + r += V4(-2.596e-01, 1.101e-01, -1.610e-01, 3.564e-01) * s0_5; + r += V4(-3.794e-02, -1.201e-02, -4.534e-02, -2.067e-03) * s0_6; + r += V4(-2.723e-01, -7.101e-03, 2.920e-01, -4.703e-02) * s0_7; + r += V4(2.764e-01, 2.903e-01, -6.617e-02, -1.000e-01) * s0_8; + r += V4(-6.139e-03, 1.469e-03, -2.491e-05, -8.164e-03); + return r; +} + +V4 f2(min16float s0_0, min16float s0_1, min16float s0_2, min16float s0_3, min16float s0_4, min16float s0_5, min16float s0_6, min16float s0_7, min16float s0_8) { + V4 r = 0.0; + r += V4(-1.344e-02, -6.919e-03, -1.467e-02, -1.242e-02) * s0_0; + r += V4(-4.248e-01, 2.286e-01, 5.847e-02, 5.995e-03) * s0_1; + r += V4(-2.976e-02, 1.412e-01, 3.197e-02, -1.810e-02) * s0_2; + r += V4(1.150e-02, 3.446e-02, 1.025e-01, -2.692e-02) * s0_3; + r += V4(3.936e-01, -2.788e-01, 2.418e-01, 2.693e-01) * s0_4; + r += V4(3.597e-02, 1.973e-01, 5.150e-02, -2.774e-02) * s0_5; + r += V4(1.056e-02, -1.251e-02, 2.856e-02, 1.177e-02) * s0_6; + r += V4(1.555e-02, -2.186e-03, -4.072e-01, -4.419e-02) * s0_7; + r += V4(1.607e-03, 5.487e-03, -1.008e-01, 5.047e-03) * s0_8; + r += V4(5.744e-03, -5.855e-02, 3.652e-03, 6.364e-02); + return r; +} + +V4 f3(min16float s0_0, min16float s0_1, min16float s0_2, min16float s0_3, min16float s0_4, min16float s0_5, min16float s0_6, min16float s0_7, min16float s0_8) { + V4 r = 0.0; + r += V4(-1.162e-02, 2.393e-02, 3.063e-01, 1.225e-01) * s0_0; + r += V4(2.079e-02, -6.710e-02, -4.221e-02, 1.147e-01) * s0_1; + r += V4(-1.939e-02, 4.827e-03, -1.670e-01, -1.281e-02) * s0_2; + r += V4(3.828e-02, 6.747e-02, 1.639e-01, -4.572e-01) * s0_3; + r += V4(-2.201e-02, 1.626e-01, -2.213e-01, 2.021e-03) * s0_4; + r += V4(3.526e-02, -2.339e-01, -7.593e-02, -7.410e-04) * s0_5; + r += V4(-3.178e-01, -9.888e-02, 8.550e-03, 2.823e-01) * s0_6; + r += V4(2.998e-01, 3.429e-01, -1.879e-03, -6.281e-02) * s0_7; + r += V4(-1.127e-02, -2.026e-01, 2.804e-02, 1.138e-02) * s0_8; + r += V4(9.305e-03, 1.342e-03, 1.386e-03, -1.248e-03); + return r; +} + +void Pass1(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = Rmp8x8(tid.x) + blockStart; + uint2 size = GetInputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = (gxy + 0.5) * pt; + + min16float s0_0 = l0(-1.0, -1.0); + min16float s0_1 = l0(0.0, -1.0); + min16float s0_2 = l0(1.0, -1.0); + min16float s0_3 = l0(-1.0, 0.0); + min16float s0_4 = l0(0.0, 0.0); + min16float s0_5 = l0(1.0, 0.0); + min16float s0_6 = l0(-1.0, 1.0); + min16float s0_7 = l0(0.0, 1.0); + min16float s0_8 = l0(1.0, 1.0); + + t0[gxy] = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8); + t1[gxy] = f1(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8); + t2[gxy] = f2(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8); + t3[gxy] = f3(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8); +} + +//!PASS 2 +//!DESC conv1 +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 +//!IN t0, t1, t2, t3 +//!OUT t4, t5, t6, t7 + +#define l0(x, y) V4(O(t0, float2(x, y))) +#define l1(x, y) V4(O(t1, float2(x, y))) +#define l2(x, y) V4(O(t2, float2(x, y))) +#define l3(x, y) V4(O(t3, float2(x, y))) + +V4 f0(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(1.915e-01, 8.617e-02, 2.783e-01, -2.880e-01, 5.170e-02, 2.674e-01, -1.035e-01, -4.085e-02, -4.754e-02, 2.783e-01, 3.582e-03, 3.390e-02, 7.482e-02, 1.070e-01, -4.532e-02, -1.152e-01)); + r += mul(s0_1, M4(1.452e-01, -8.931e-02, 9.665e-02, -2.959e-01, 1.034e-01, 8.728e-02, -7.314e-02, -3.113e-01, 7.188e-03, 5.407e-01, 9.069e-02, 1.456e-01, -5.582e-03, -4.387e-02, -3.720e-02, -1.689e-01)); + r += mul(s0_2, M4(-1.109e-01, -2.353e-01, -1.249e-01, -2.881e-02, 1.277e-02, -2.393e-01, -9.998e-02, 8.359e-02, 8.465e-02, 3.467e-01, -4.426e-01, 1.844e-01, -9.682e-03, 1.228e-02, 2.420e-01, -2.956e-03)); + r += mul(s0_3, M4(-2.872e-01, -2.808e-01, 1.123e-01, -3.129e-01, -1.782e-01, 1.057e-01, -7.654e-02, -6.484e-02, -9.183e-02, 2.257e-01, -4.162e-02, -3.929e-02, 1.257e-01, -1.185e-01, 1.132e-01, 2.286e-02)); + r += mul(s0_4, M4(-6.034e-01, -2.698e-01, 2.346e-01, 3.800e-01, 1.354e-01, -2.793e-01, -2.765e-01, 4.368e-01, 2.433e-01, 1.016e-01, -2.549e-01, 1.175e-01, -5.999e-02, 1.617e-01, 2.720e-01, 2.399e-02)); + r += mul(s0_5, M4(2.778e-01, 2.151e-01, -1.113e-01, 5.907e-02, 2.666e-02, -2.804e-01, -2.523e-01, -1.033e-01, -3.724e-01, 4.970e-02, -6.201e-02, 1.650e-01, 3.048e-02, -3.321e-02, -8.487e-02, 5.839e-02)); + r += mul(s0_6, M4(-1.577e-01, -5.794e-01, 1.435e-03, -9.709e-02, -2.404e-02, 5.901e-02, 7.698e-02, 3.494e-02, 9.943e-02, -2.683e-03, 3.986e-02, 1.381e-01, -1.134e-01, -7.731e-03, -3.773e-01, -7.648e-02)); + r += mul(s0_7, M4(-6.406e-01, 2.884e-01, 1.041e-01, -2.176e-01, 3.817e-02, -6.199e-01, -1.545e-01, 2.707e-01, 2.183e-01, -4.624e-02, -1.211e-01, -1.331e-01, 8.447e-02, -5.417e-02, -1.235e-01, -5.106e-02)); + r += mul(s0_8, M4(1.502e-01, 5.535e-01, -4.493e-01, 5.334e-02, 2.547e-01, -3.920e-01, -1.611e-01, 3.136e-01, -2.486e-01, -1.901e-01, 1.735e-01, 1.422e-01, -1.382e-01, 1.335e-01, -6.865e-02, 5.767e-02)); + r += mul(s1_0, M4(-1.072e-01, 6.178e-02, -8.950e-02, -4.395e-02, 2.797e-02, 1.097e-01, -1.335e-02, 2.105e-01, -5.711e-02, -7.394e-02, 6.051e-02, -1.298e-01, 8.520e-02, 1.592e-01, -1.618e-02, 2.063e-01)); + r += mul(s1_1, M4(-9.313e-02, 1.554e-01, 2.962e-01, 2.182e-01, -2.366e-02, -1.189e-01, 1.419e-02, -3.432e-03, -2.118e-01, -1.505e-01, 1.335e-01, -3.626e-01, -1.272e-01, -2.990e-01, -1.156e-01, 2.206e-01)); + r += mul(s1_2, M4(2.653e-02, 6.007e-03, -9.481e-02, 2.164e-03, -6.669e-02, 1.896e-02, -2.685e-01, 1.459e-02, 1.478e-01, -1.619e-01, 9.891e-02, 4.510e-02, -6.737e-02, 8.488e-02, 2.175e-01, 1.367e-01)); + r += mul(s1_3, M4(8.973e-02, 1.315e-01, -9.112e-02, -2.657e-02, 4.734e-02, -1.120e-01, 1.049e-01, 8.353e-02, -3.940e-02, -1.524e-02, -4.120e-02, -4.177e-02, -1.102e-01, 4.304e-01, -1.386e-01, 5.626e-02)); + r += mul(s1_4, M4(1.491e-01, 1.458e-01, 9.985e-02, -3.261e-02, 1.666e-01, -3.331e-01, 1.899e-02, 7.565e-02, 4.484e-03, -2.159e-01, 3.560e-03, 4.046e-02, 2.046e-01, -3.285e-01, -3.512e-01, -1.651e-01)); + r += mul(s1_5, M4(-3.374e-01, -4.701e-02, -5.227e-02, -5.245e-02, -3.441e-01, 1.487e-01, 1.912e-01, -1.615e-01, -1.529e-01, -1.536e-02, 1.713e-01, -2.163e-01, -2.387e-03, 6.917e-02, 2.498e-01, 9.538e-02)); + r += mul(s1_6, M4(2.198e-02, 2.846e-02, -7.364e-02, -9.207e-02, 1.338e-01, -1.202e-01, 1.576e-01, 1.028e-01, 4.717e-02, -3.245e-02, -1.692e-02, 1.459e-01, 3.656e-01, -1.545e-01, 4.262e-01, 2.335e-02)); + r += mul(s1_7, M4(2.171e-01, -1.561e-01, 8.276e-02, 2.344e-02, -1.918e-01, 2.082e-01, -2.113e-01, -2.870e-01, -4.678e-02, -7.053e-02, -3.567e-03, -7.122e-02, -5.404e-01, 1.409e-02, 6.304e-01, -2.495e-02)); + r += mul(s1_8, M4(-2.908e-02, -3.121e-01, 2.461e-03, 1.053e-02, 6.840e-02, 2.736e-01, 5.635e-01, -1.502e-01, -2.910e-02, 1.594e-02, 1.646e-01, -9.596e-02, -1.050e-01, -1.280e-01, 1.544e-01, 1.133e-01)); + r += mul(s2_0, M4(-1.709e-01, 4.813e-02, -1.308e-01, -3.929e-01, -2.671e-01, 1.794e-01, -3.473e-02, -1.082e-01, 1.704e-01, -9.371e-02, 1.177e-01, 1.082e-01, -1.074e-01, -1.489e-01, -6.564e-02, 2.592e-01)); + r += mul(s2_1, M4(-3.982e-01, 1.608e-01, 2.630e-01, 2.781e-01, 9.405e-02, 3.370e-01, 1.315e-01, -2.692e-01, 6.091e-02, -8.330e-02, 1.807e-01, 1.158e-01, 1.087e-01, -4.806e-01, -1.911e-02, 4.111e-01)); + r += mul(s2_2, M4(7.164e-04, 1.734e-01, 1.819e-01, 6.334e-02, -2.757e-01, -2.027e-02, 2.200e-02, -5.364e-02, 1.775e-01, 9.564e-02, 1.428e-01, 1.097e-01, 2.450e-01, 3.822e-02, -1.977e-01, 1.627e-01)); + r += mul(s2_3, M4(1.574e-02, 1.611e-01, -2.701e-01, 2.160e-01, 1.052e-01, 1.880e-01, 1.925e-01, 1.191e-01, 2.600e-01, -8.277e-02, 2.963e-02, 1.030e-01, 2.238e-01, -5.039e-02, 2.048e-01, -1.014e-01)); + r += mul(s2_4, M4(-3.232e-01, 1.614e-01, 3.728e-01, 1.739e-02, 2.750e-01, 9.738e-02, -1.019e-01, -2.264e-01, 2.518e-02, -2.377e-01, 1.322e-01, 8.435e-02, 4.010e-01, 2.758e-01, -4.264e-01, 7.319e-02)); + r += mul(s2_5, M4(-6.737e-02, 2.770e-01, -3.094e-01, 1.656e-01, -1.544e-01, -2.708e-01, 1.999e-01, -7.944e-02, 1.547e-01, 8.519e-02, 1.132e-01, 2.361e-01, 2.004e-01, -3.373e-01, -1.710e-01, -7.043e-02)); + r += mul(s2_6, M4(1.828e-01, 1.317e-01, -8.375e-02, -2.125e-01, -7.807e-02, -1.727e-01, 3.817e-02, 4.709e-02, -5.390e-02, -5.449e-02, -4.993e-02, 1.147e-01, -1.161e-01, 4.468e-01, 8.868e-02, -8.974e-02)); + r += mul(s2_7, M4(9.288e-02, -3.211e-02, 2.103e-01, -1.412e-01, -2.230e-02, -3.565e-01, -1.209e-01, -5.526e-02, 9.967e-02, 9.655e-02, 5.062e-02, -1.023e-01, 5.712e-02, -6.176e-02, -3.075e-02, 2.405e-02)); + r += mul(s2_8, M4(3.821e-02, -6.003e-02, -1.239e-01, -2.513e-01, -8.277e-02, -1.232e-01, 6.995e-02, -1.091e-01, 2.963e-01, 9.518e-02, 1.699e-01, 9.288e-02, 1.102e-01, -8.510e-02, 2.233e-01, 8.911e-03)); + r += mul(s3_0, M4(1.078e-01, -6.877e-02, 4.785e-02, 4.049e-03, 2.763e-01, 2.047e-01, -1.208e-01, -3.427e-02, -5.237e-02, -7.717e-02, 1.456e-01, -2.029e-01, -5.558e-02, -3.988e-03, -5.646e-02, -6.426e-02)); + r += mul(s3_1, M4(2.635e-01, 5.426e-02, -3.762e-01, -8.153e-02, -2.918e-01, 2.323e-01, -4.968e-02, 2.672e-01, -1.023e-01, 2.621e-02, -9.011e-02, -2.466e-01, -9.320e-02, 8.727e-02, 6.309e-02, 3.082e-02)); + r += mul(s3_2, M4(-7.310e-02, 3.103e-02, 3.669e-01, -1.146e-01, 2.471e-01, 8.364e-02, -2.383e-02, 2.244e-01, -1.019e-02, 1.156e-02, 1.421e-02, -1.744e-02, 6.525e-02, -6.749e-02, -1.353e-01, -4.656e-02)); + r += mul(s3_3, M4(5.752e-02, -2.742e-01, 2.097e-01, 1.157e-01, 5.903e-02, 7.109e-02, 1.085e-01, -1.613e-01, -1.231e-01, -1.270e-02, -9.659e-02, -1.619e-01, -1.958e-01, 2.087e-01, -9.484e-02, -7.992e-02)); + r += mul(s3_4, M4(-6.251e-02, -2.237e-01, -2.261e-01, -1.846e-03, 2.110e-01, -2.218e-01, -2.144e-01, 2.588e-01, -2.198e-01, 1.925e-01, -1.086e-01, -1.815e-02, 5.868e-02, 1.777e-01, 1.376e-01, 1.380e-01)); + r += mul(s3_5, M4(6.631e-02, 8.099e-02, 2.929e-01, 1.477e-01, 1.644e-02, 2.053e-01, -1.695e-01, 9.151e-02, -2.903e-02, 1.207e-01, -1.663e-01, -9.041e-02, 2.284e-02, 4.472e-02, -2.491e-02, 9.218e-02)); + r += mul(s3_6, M4(-1.521e-01, 1.273e-01, -3.648e-02, 2.055e-02, 3.445e-03, 9.287e-03, 6.272e-03, 1.347e-01, 8.115e-02, 1.683e-01, -8.573e-03, -8.772e-02, 1.265e-01, -1.132e-01, 7.200e-02, 7.849e-02)); + r += mul(s3_7, M4(-1.989e-01, 1.623e-01, -3.536e-02, 1.904e-01, 1.371e-01, 1.042e-02, -7.387e-02, 2.075e-01, -2.366e-01, 4.228e-02, -1.673e-01, -2.606e-02, 2.563e-02, -1.812e-01, -2.389e-02, -1.613e-01)); + r += mul(s3_8, M4(4.839e-02, 1.181e-02, -1.900e-01, -1.261e-01, -1.134e-02, 7.055e-02, -4.342e-03, 2.042e-01, -1.193e-01, 1.091e-02, -1.185e-01, -1.153e-01, -5.787e-02, -5.799e-02, 3.598e-02, -1.043e-02)); + r += mul(s4_0, M4(4.490e-03, -6.261e-02, 1.111e-01, -2.427e-02, -1.759e-01, 1.041e-01, -3.451e-02, -6.152e-02, -2.537e-01, 5.739e-02, -2.566e-02, 3.164e-02, 5.651e-03, 7.279e-02, 7.798e-02, 8.355e-02)); + r += mul(s4_1, M4(1.033e-01, 1.069e-01, 6.319e-02, -3.446e-02, 1.358e-01, 1.130e-01, 3.079e-01, -1.337e-01, 1.295e-01, -4.400e-01, -2.262e-01, -2.545e-02, 4.901e-02, -5.701e-02, -9.943e-02, -1.870e-02)); + r += mul(s4_2, M4(-1.782e-01, -5.946e-02, -5.404e-02, 1.318e-01, -9.018e-02, -1.477e-01, -3.033e-01, -1.501e-01, 5.032e-02, -2.488e-01, -1.183e-01, -4.715e-03, -9.155e-04, 1.007e-03, 3.462e-02, -7.236e-02)); + r += mul(s4_3, M4(2.654e-02, -1.238e-01, -8.066e-02, -5.186e-02, -6.032e-01, 3.248e-01, 6.459e-02, -2.177e-01, -5.860e-02, -9.400e-02, 2.884e-02, 5.215e-02, -8.824e-02, -2.220e-03, 2.254e-02, 6.366e-02)); + r += mul(s4_4, M4(-3.236e-01, 5.681e-01, 1.250e-01, 1.640e-03, 4.444e-01, -2.916e-02, -3.283e-01, 6.014e-01, 8.423e-02, -1.713e-01, -9.128e-02, 2.059e-02, 8.158e-02, -7.455e-02, -5.478e-02, -6.427e-02)); + r += mul(s4_5, M4(2.456e-01, -2.188e-01, -4.943e-01, 1.680e-01, 1.525e-03, -2.317e-01, -6.046e-02, -8.908e-02, -1.479e-02, 1.991e-01, 2.361e-01, -1.998e-02, -2.287e-02, 1.821e-02, -8.832e-02, 3.747e-02)); + r += mul(s4_6, M4(-1.173e-01, 3.572e-02, 5.401e-02, 9.243e-02, -3.274e-01, -2.456e-02, 2.820e-02, -7.847e-01, -4.977e-02, 9.341e-03, 4.813e-03, 1.187e-01, -7.300e-02, 4.657e-02, 3.412e-02, 7.358e-02)); + r += mul(s4_7, M4(1.495e-01, 8.350e-03, 2.992e-01, 2.885e-01, 3.542e-01, 8.891e-02, -4.413e-01, -3.464e-01, 5.170e-02, -7.054e-03, -1.080e-01, -1.595e-01, 2.983e-02, 7.148e-03, -7.949e-02, -1.909e-02)); + r += mul(s4_8, M4(1.172e-03, 4.500e-02, -2.422e-01, 1.899e-02, 1.485e-01, -6.020e-02, 7.405e-02, 2.323e-02, 4.174e-02, 4.857e-02, 9.561e-02, 3.943e-02, 4.867e-02, 4.024e-02, 1.465e-01, 1.642e-02)); + r += mul(s5_0, M4(1.130e-01, 5.549e-02, 1.454e-01, -8.837e-02, -4.060e-02, -1.125e-02, -5.483e-02, -8.110e-02, 1.469e-01, -2.157e-01, 1.990e-02, -5.508e-02, 4.400e-01, 6.614e-01, -2.171e-01, 1.001e+00)); + r += mul(s5_1, M4(-5.725e-02, -2.493e-01, -3.369e-01, -1.876e-01, 3.814e-02, -1.004e-02, 1.808e-01, -2.036e-02, 4.590e-02, -8.456e-02, 4.353e-01, 1.158e-01, 2.519e-01, -6.799e-02, 1.615e-01, -4.632e-01)); + r += mul(s5_2, M4(1.155e-01, 1.853e-01, 1.455e-01, 2.910e-02, -4.775e-02, -8.169e-03, -1.597e-01, -2.954e-02, -1.888e-01, 7.739e-02, -2.427e-01, 1.965e-01, -5.393e-01, -6.719e-01, 3.822e-01, -5.405e-01)); + r += mul(s5_3, M4(-1.053e-01, -2.010e-01, 4.452e-02, 1.220e-01, -1.387e-01, -1.663e-02, 6.420e-02, 5.683e-02, 1.482e-02, -1.238e-01, -5.976e-02, 9.798e-02, 1.887e-01, 2.244e-01, -1.055e-01, 8.778e-01)); + r += mul(s5_4, M4(2.642e-01, -2.471e-01, 1.213e-01, -4.243e-03, 2.136e-01, -1.197e-01, -1.370e-01, 1.747e-01, -1.902e-01, 4.095e-01, 2.239e-01, -1.064e-01, -1.516e+00, -5.901e-01, -7.535e-01, -9.025e-01)); + r += mul(s5_5, M4(1.336e-01, -1.581e-01, 4.231e-01, -5.318e-03, -6.304e-02, 1.581e-02, 1.323e-01, -1.488e-02, -4.654e-02, -1.028e-01, -2.243e-01, -6.142e-03, -4.791e-02, 8.956e-01, 8.111e-01, -6.925e-01)); + r += mul(s5_6, M4(7.804e-02, -9.557e-03, 4.499e-02, 4.405e-02, -6.914e-02, 4.490e-02, 9.597e-02, -1.751e-01, -6.983e-02, -1.291e-01, 1.312e-02, 1.856e-01, 4.377e-01, 3.248e-01, 5.635e-01, 3.066e-02)); + r += mul(s5_7, M4(-3.601e-02, -4.945e-02, -3.836e-01, -1.191e-01, -4.540e-03, 1.375e-02, -6.256e-02, -6.577e-02, -1.628e-01, -2.256e-02, 2.093e-01, 2.254e-01, 2.224e-01, 2.670e-01, 4.099e-01, 5.051e-02)); + r += mul(s5_8, M4(-1.848e-02, 1.601e-01, 2.141e-01, -5.077e-02, 6.266e-02, 3.822e-02, -3.642e-02, -1.121e-02, -6.476e-02, -1.910e-01, -1.888e-02, -1.003e-01, 2.444e-01, 4.690e-01, -2.952e-01, 7.102e-02)); + r += mul(s6_0, M4(7.241e-02, -4.093e-02, 2.419e-02, 2.711e-02, 2.755e-01, -1.572e-01, -8.057e-02, -7.000e-03, 1.500e-02, 3.219e-02, 2.177e-03, -1.652e-02, -1.219e-02, 3.024e-01, 1.092e-01, -9.745e-03)); + r += mul(s6_1, M4(-1.114e-01, 1.200e-02, 3.204e-04, -2.240e-02, -2.077e-01, 9.453e-02, 1.596e-02, -4.109e-02, -1.172e-02, 1.225e-01, -3.765e-02, -1.096e-02, 3.648e-02, 2.852e-01, -7.502e-02, -1.534e-01)); + r += mul(s6_2, M4(1.341e-01, 2.011e-01, -2.868e-02, 1.322e-01, -5.997e-02, 8.211e-02, 1.455e-03, -1.164e-01, -1.329e-01, -3.898e-02, -8.764e-02, 2.576e-02, -3.821e-03, -4.150e-01, -4.675e-01, 2.473e-01)); + r += mul(s6_3, M4(-3.463e-03, 7.775e-02, 6.833e-02, 2.438e-02, 1.574e-01, -1.770e-01, -9.328e-02, 1.130e-03, 1.146e-01, 4.248e-02, 6.905e-03, -1.858e-01, -6.367e-02, -6.603e-02, 4.715e-02, -5.800e-02)); + r += mul(s6_4, M4(-2.588e-02, 5.901e-02, -3.184e-02, 1.589e-02, -1.631e-01, 8.692e-02, 1.868e-01, 1.412e-01, 3.177e-01, -3.267e-01, -1.985e-02, -3.030e-01, 3.703e-02, -2.103e-01, 1.394e-03, -8.820e-02)); + r += mul(s6_5, M4(7.007e-02, 1.945e-02, -1.305e-01, -8.563e-02, 9.467e-02, -2.749e-03, -2.522e-01, 4.262e-02, -3.563e-01, -2.511e-01, 2.137e-01, -1.280e-01, 1.020e-01, 1.425e-01, 4.868e-03, 8.239e-02)); + r += mul(s6_6, M4(5.757e-02, 1.342e-02, 1.885e-02, -1.555e-02, 2.024e-01, 1.458e-02, 5.292e-02, -2.133e-01, -1.199e-02, 6.484e-02, 6.354e-02, -1.145e-01, -7.400e-02, 5.425e-02, 1.474e-02, -5.936e-02)); + r += mul(s6_7, M4(-4.723e-02, -3.575e-02, -2.449e-02, 4.364e-02, 4.840e-02, 1.412e-01, 5.925e-02, 2.112e-01, -1.469e-01, -1.052e-01, 1.318e-01, -9.390e-02, -1.663e-01, 4.892e-02, 6.059e-02, 1.907e-02)); + r += mul(s6_8, M4(1.405e-01, -8.783e-02, 2.731e-02, -2.606e-02, -1.139e-01, 1.528e-01, -1.996e-01, -3.131e-02, -1.743e-01, -1.660e-01, -1.564e-02, -6.395e-02, -2.327e-01, 1.027e-01, 1.346e-01, 2.954e-01)); + r += mul(s7_0, M4(-2.209e-01, 3.902e-01, -1.621e-01, 6.093e-02, -1.620e-01, -3.094e-01, 2.904e-01, 8.403e-02, 3.714e-02, 1.173e-01, 2.281e-03, 1.580e-01, -1.034e-01, 1.150e-01, 5.607e-02, 5.691e-02)); + r += mul(s7_1, M4(5.886e-01, -3.046e-01, 3.721e-01, -1.162e-01, 6.265e-02, -1.670e-01, 7.349e-02, -3.569e-02, 7.806e-02, 2.046e-03, -6.049e-03, -2.090e-01, 3.608e-02, -1.603e-01, 8.953e-02, -1.140e-01)); + r += mul(s7_2, M4(-2.383e-01, -3.387e-01, -9.132e-04, -5.473e-01, -3.308e-03, -2.049e-01, 9.447e-03, -3.845e-02, -5.569e-02, -2.745e-01, -6.863e-02, 2.397e-01, 2.584e-01, 3.671e-01, 4.496e-01, -1.728e-01)); + r += mul(s7_3, M4(9.881e-02, 4.344e-01, 1.883e-01, 1.685e-02, -2.303e-01, -7.714e-02, -1.158e-01, 7.909e-03, -3.606e-02, 2.296e-02, 2.534e-02, 1.496e-01, -7.556e-03, -9.981e-03, 6.978e-02, 6.716e-02)); + r += mul(s7_4, M4(3.535e-01, -2.261e-01, -3.110e-01, -1.825e-01, 1.536e-01, 7.248e-02, -1.235e-02, -1.980e-01, -6.042e-02, -1.250e-01, -5.143e-02, 2.953e-01, -1.616e-01, 9.051e-02, 1.251e-01, 2.020e-02)); + r += mul(s7_5, M4(-3.339e-01, -1.343e-01, 1.744e-01, 2.897e-01, 6.002e-02, -4.475e-02, 5.910e-02, -1.401e-01, -7.893e-02, 1.294e-01, -7.917e-02, -3.911e-02, 2.927e-02, -2.521e-01, 1.366e-01, 2.207e-01)); + r += mul(s7_6, M4(8.209e-02, -5.761e-02, 5.538e-02, 1.485e-01, -4.020e-02, 2.563e-01, 7.761e-02, -2.641e-02, 1.096e-01, 6.517e-02, 7.305e-02, 6.710e-02, 2.998e-02, -8.325e-02, -5.355e-02, -3.583e-03)); + r += mul(s7_7, M4(1.182e-01, -6.605e-02, -1.125e-01, -2.782e-01, 1.988e-01, 6.287e-02, 1.677e-01, 7.684e-02, 9.364e-02, 1.821e-01, -1.918e-01, 1.370e-01, -2.287e-01, 4.243e-02, 3.614e-02, -1.039e-01)); + r += mul(s7_8, M4(-7.800e-02, -1.585e-02, 7.305e-02, -1.289e-01, 2.250e-03, -1.136e-02, -1.836e-01, -3.147e-02, 1.269e-01, -3.905e-02, -7.012e-02, 2.610e-01, 1.584e-01, -3.807e-02, -1.562e-01, -3.618e-01)); + r += V4(-5.962e-03, -3.537e-03, 1.371e-03, -3.011e-02); + return r; +} + +V4 f1(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(1.493e-01, -1.360e-03, 1.121e-02, -2.183e-01, 1.482e-01, 1.005e-01, 2.226e-04, 2.673e-02, -6.415e-02, 1.177e-01, 1.227e-01, -7.412e-03, -6.499e-02, 9.640e-02, -6.468e-02, -7.867e-02)); + r += mul(s0_1, M4(5.620e-02, 1.236e-01, 2.228e-01, -1.802e-01, -5.798e-02, 4.350e-02, 2.388e-01, 3.069e-02, -2.787e-01, 3.844e-01, 8.522e-02, 1.007e-01, -2.076e-02, 8.274e-02, 1.084e-01, -5.538e-02)); + r += mul(s0_2, M4(-1.091e-01, 1.605e-01, -3.383e-02, -2.930e-02, 5.375e-02, -1.329e-02, 2.408e-01, -8.769e-02, -1.789e-02, 2.825e-01, -2.359e-02, -4.484e-02, -9.254e-02, 1.488e-02, 4.321e-03, 7.121e-02)); + r += mul(s0_3, M4(-1.047e-01, -3.072e-01, -1.337e-01, -2.016e-01, -8.555e-02, 8.769e-02, -2.449e-02, -2.339e-01, -6.242e-02, 2.778e-01, 3.091e-02, 2.197e-01, 2.342e-01, -2.435e-01, 4.551e-02, -2.338e-02)); + r += mul(s0_4, M4(3.583e-01, 2.164e-01, 3.505e-02, 1.225e-01, 7.236e-03, -8.012e-02, 4.456e-01, -7.709e-01, 7.706e-02, 1.436e-01, 3.503e-01, -2.874e-01, -8.961e-02, 1.931e-01, -7.575e-02, 3.137e-02)); + r += mul(s0_5, M4(2.393e-01, 4.598e-01, -4.286e-01, -1.308e-01, -2.729e-01, 2.429e-02, 1.458e-01, -2.588e-01, -4.170e-01, 6.320e-01, -2.866e-01, 2.631e-01, 1.276e-01, 5.969e-02, -1.602e-01, -5.755e-02)); + r += mul(s0_6, M4(-3.896e-01, -2.052e-01, 4.924e-02, -3.981e-02, 9.718e-02, 6.549e-02, -8.761e-02, -3.933e-01, -4.399e-02, -4.761e-03, 9.525e-02, -1.152e-01, -1.571e-01, 2.094e-02, -6.634e-02, 4.642e-02)); + r += mul(s0_7, M4(1.463e-03, 6.666e-02, 4.664e-01, -2.558e-01, -2.090e-01, -1.326e-01, -3.289e-01, -2.566e-01, -2.533e-01, 2.534e-01, 1.027e-01, 2.202e-01, -2.342e-01, -8.858e-03, -1.037e-01, 1.784e-01)); + r += mul(s0_8, M4(1.968e-01, -1.747e-02, 3.331e-01, 1.073e-01, -1.047e-01, 2.814e-03, -6.119e-02, -8.912e-02, -1.593e-01, 2.664e-01, 1.753e-01, 9.957e-02, -1.679e-02, 1.427e-01, 1.291e-01, 6.444e-02)); + r += mul(s1_0, M4(9.660e-02, 3.016e-02, 4.277e-02, -4.001e-02, 8.294e-02, -5.211e-02, 1.711e-03, -3.301e-02, 2.325e-01, -5.042e-02, -1.068e-01, 1.108e-01, 1.222e-03, -1.030e-01, 1.842e-01, -1.213e-01)); + r += mul(s1_1, M4(3.118e-02, -1.874e-02, -1.168e-02, 3.724e-02, -5.922e-02, -3.813e-02, 6.865e-02, 9.811e-02, 3.009e-01, -1.214e-01, -1.653e-01, -1.361e-02, -9.460e-02, -4.843e-01, -1.923e-01, -4.082e-02)); + r += mul(s1_2, M4(-4.070e-02, -6.820e-02, -4.630e-02, 3.216e-02, 1.371e-02, 1.069e-01, 7.885e-02, -1.577e-02, -2.718e-02, -4.756e-01, -4.672e-03, -2.539e-01, 1.984e-02, 3.908e-02, -6.613e-02, 8.673e-02)); + r += mul(s1_3, M4(-3.718e-02, 6.549e-02, 1.625e-02, 2.071e-01, -6.907e-02, 6.928e-02, -1.844e-01, -1.591e-02, 1.394e-01, -1.004e-02, 1.170e-01, 3.020e-01, 5.181e-02, -5.939e-02, -5.880e-02, 7.376e-02)); + r += mul(s1_4, M4(1.063e-01, -1.026e-01, 1.934e-01, -2.595e-02, 1.901e-01, -1.462e-01, -5.239e-01, 8.369e-02, 1.658e-01, -2.750e-01, 1.504e-02, -1.351e-01, 4.891e-04, -1.481e-01, 5.045e-02, 1.154e-01)); + r += mul(s1_5, M4(-1.030e-01, -1.654e-01, 1.218e-01, 2.341e-02, 9.236e-02, 3.391e-01, -3.344e-01, 7.693e-02, -3.664e-02, -1.771e-01, -3.157e-01, -1.499e-01, 3.311e-02, -1.792e-01, 2.381e-01, 1.076e-01)); + r += mul(s1_6, M4(7.149e-02, -4.252e-02, -1.031e-01, -1.888e-01, -1.277e-01, -5.187e-03, 2.521e-01, -8.569e-02, 2.787e-02, -1.504e-01, -4.477e-02, -1.184e-01, 4.185e-01, -4.126e-02, 2.010e-01, -4.618e-02)); + r += mul(s1_7, M4(-6.966e-03, -5.100e-02, -1.230e-01, -2.367e-01, 4.423e-02, 3.513e-02, 2.033e-01, 3.137e-01, -6.549e-02, -1.007e-01, -1.392e-01, 9.041e-02, -1.890e-01, -2.362e-01, 3.349e-01, 2.219e-01)); + r += mul(s1_8, M4(4.125e-02, 1.474e-01, -1.518e-01, 1.076e-01, 4.368e-02, -2.465e-01, 1.384e-01, -1.506e-01, 1.370e-01, 1.435e-02, -2.052e-01, -7.013e-03, -2.786e-01, -1.330e-01, -2.805e-01, -1.722e-01)); + r += mul(s2_0, M4(2.952e-01, 4.441e-02, -4.741e-01, 4.375e-01, 2.978e-01, -7.597e-02, 1.013e-01, 4.516e-02, -2.158e-01, -1.479e-01, 1.699e-01, -9.469e-02, 1.567e-01, 6.033e-02, -4.819e-02, 2.453e-02)); + r += mul(s2_1, M4(4.749e-01, 2.013e-01, 1.305e-01, -4.380e-02, 2.683e-01, -1.753e-01, -7.340e-02, -1.215e-01, -2.864e-01, -2.927e-01, -6.246e-02, 1.608e-01, -2.835e-01, 8.082e-03, 5.970e-02, 2.425e-01)); + r += mul(s2_2, M4(1.911e-01, -3.841e-02, 1.451e-02, -1.175e-01, 4.068e-02, -1.027e-01, 5.235e-02, 3.985e-02, 2.603e-02, -3.411e-03, -4.188e-03, -3.843e-02, -4.186e-02, -3.254e-01, 1.096e-01, -8.038e-03)); + r += mul(s2_3, M4(2.730e-01, 8.854e-02, 3.190e-01, 3.133e-01, 1.826e-02, 6.850e-02, -3.333e-02, 1.059e-01, 6.928e-02, -1.145e-02, 2.283e-01, -8.865e-02, 2.391e-01, -1.820e-01, -3.573e-02, -1.730e-01)); + r += mul(s2_4, M4(4.755e-01, -1.270e-01, 4.131e-01, 2.268e-01, 2.208e-01, -3.773e-01, 1.155e-01, -1.669e-01, 2.618e-01, -6.293e-02, -4.787e-02, -1.925e-01, 6.307e-01, 2.681e-01, -2.374e-01, -8.996e-02)); + r += mul(s2_5, M4(2.443e-01, -2.722e-01, 8.635e-02, -1.306e-01, 3.156e-02, 1.101e-01, -3.838e-01, 8.736e-02, 1.960e-02, -1.844e-01, 3.986e-04, -1.759e-01, -7.092e-03, -3.461e-01, -2.356e-01, 1.175e-01)); + r += mul(s2_6, M4(-2.070e-02, 1.906e-01, -3.961e-01, 5.045e-02, -1.113e-01, -3.115e-02, -2.427e-01, 8.359e-02, 6.035e-02, -2.168e-02, -7.367e-02, 1.275e-01, 1.385e-01, -4.470e-02, -8.486e-03, 2.152e-01)); + r += mul(s2_7, M4(1.535e-01, 1.293e-01, 3.150e-03, 1.369e-01, -3.304e-02, 7.236e-03, -1.207e-02, 3.864e-02, 1.884e-02, -3.147e-01, 5.685e-02, 1.124e-01, 1.616e-01, 6.865e-02, -2.169e-02, 1.214e-01)); + r += mul(s2_8, M4(-2.751e-02, 1.530e-02, -2.166e-01, 1.189e-01, 1.530e-01, -4.993e-02, -2.652e-02, -3.569e-02, -5.124e-02, -2.675e-01, -1.650e-01, -1.609e-02, -9.086e-02, 3.321e-02, 7.116e-03, 8.445e-02)); + r += mul(s3_0, M4(-1.433e-01, 2.111e-02, 8.117e-02, -2.792e-01, -4.618e-01, 2.032e-01, -8.773e-02, -1.422e-01, 1.648e-02, 2.203e-03, 2.217e-02, 1.057e-01, 1.814e-01, -3.271e-02, 5.886e-02, 1.601e-01)); + r += mul(s3_1, M4(3.798e-02, -9.214e-02, 1.001e-01, -5.864e-02, -2.529e-01, 1.986e-01, 1.937e-01, 1.154e-01, -8.759e-02, 2.373e-01, -1.875e-01, -5.515e-02, -1.158e-02, 3.020e-01, -1.429e-01, 6.739e-03)); + r += mul(s3_2, M4(-2.931e-02, 1.164e-01, 1.347e-01, 4.203e-02, -5.261e-02, 1.060e-01, 9.737e-02, -8.234e-02, -1.152e-01, 5.234e-02, 5.639e-02, 2.082e-02, 7.628e-02, 4.062e-02, -1.446e-01, -1.245e-01)); + r += mul(s3_3, M4(3.235e-02, -1.423e-01, -2.326e-01, -1.616e-01, -6.639e-02, 1.896e-01, 1.743e-01, 7.735e-02, -1.749e-02, -6.962e-02, 1.095e-01, 2.082e-01, -1.188e-01, 6.600e-02, -3.677e-02, 2.052e-01)); + r += mul(s3_4, M4(-2.059e-01, 1.696e-01, -4.044e-01, 1.401e-01, -1.428e-01, 4.176e-01, -2.219e-03, 6.759e-02, 1.705e-01, 1.514e-01, 3.040e-01, -2.451e-01, -8.452e-02, -2.797e-01, 2.688e-01, 4.933e-02)); + r += mul(s3_5, M4(1.261e-01, 1.920e-02, -1.831e-01, -7.127e-02, -2.744e-01, 1.421e-01, 1.497e-01, 1.165e-01, -9.432e-02, 8.987e-02, -6.732e-01, 1.422e-01, 7.804e-02, -7.633e-03, 2.764e-01, 1.964e-02)); + r += mul(s3_6, M4(-1.383e-02, 5.891e-02, 1.599e-01, -7.055e-02, -1.188e-01, 1.840e-02, 1.678e-01, -2.558e-02, 1.142e-01, 9.206e-02, -7.608e-02, 1.032e-01, 3.337e-02, -3.068e-02, -8.554e-02, -1.006e-01)); + r += mul(s3_7, M4(5.861e-02, 4.090e-02, 2.595e-01, 1.175e-01, -3.135e-01, -4.337e-02, -4.331e-02, -2.942e-02, -1.244e-01, 2.569e-01, 9.823e-02, 1.764e-01, -8.771e-02, -1.305e-01, -1.500e-01, -3.085e-01)); + r += mul(s3_8, M4(2.161e-02, -6.209e-02, 1.138e-01, 6.710e-02, -9.868e-02, 5.677e-02, 1.302e-01, -4.357e-02, 4.976e-03, 1.871e-01, 1.746e-01, 1.241e-02, -4.849e-02, 5.190e-02, -2.857e-02, -6.322e-02)); + r += mul(s4_0, M4(-4.927e-02, -4.089e-02, 8.644e-03, 5.684e-02, -5.871e-02, -5.351e-02, 2.254e-02, -3.264e-02, 1.201e-01, -1.862e-01, -2.446e-02, -3.252e-02, -2.362e-02, 4.419e-02, 3.543e-02, 2.515e-02)); + r += mul(s4_1, M4(8.533e-02, 9.602e-02, -4.276e-02, 2.019e-02, 6.095e-02, 2.188e-01, 5.990e-02, 1.652e-01, 1.754e-01, -5.736e-02, 6.605e-02, -1.228e-01, -9.409e-02, 1.920e-02, 3.324e-02, 2.614e-02)); + r += mul(s4_2, M4(-1.835e-02, -3.571e-02, -5.266e-02, 4.572e-02, 1.883e-01, -1.398e-01, -2.163e-01, 1.244e-02, 1.965e-01, 2.415e-01, -2.188e-01, -4.871e-03, -5.044e-03, -1.593e-02, 1.016e-02, -8.609e-02)); + r += mul(s4_3, M4(-7.819e-03, 1.220e-01, -2.014e-01, 1.773e-01, -5.222e-01, -5.908e-01, 2.559e-02, -1.676e-01, 1.346e-02, 1.334e-01, -3.624e-01, -9.509e-02, 2.341e-02, 2.038e-02, -7.312e-03, -5.461e-03)); + r += mul(s4_4, M4(1.769e-01, 1.743e-01, 7.910e-02, 2.040e-01, -2.588e-01, 2.454e-01, 2.247e-01, -3.087e-01, -7.547e-02, -4.226e-02, -2.001e-01, 5.399e-01, -1.347e-02, -3.727e-02, 8.474e-02, 3.298e-02)); + r += mul(s4_5, M4(-1.075e-02, -2.296e-01, 1.972e-01, 4.847e-02, -9.768e-02, -9.002e-02, -1.535e-01, -9.385e-02, 1.167e-01, 3.740e-02, 4.510e-01, -3.662e-02, 2.415e-01, 2.915e-02, 8.082e-02, -4.644e-02)); + r += mul(s4_6, M4(4.066e-02, 1.286e-02, 7.837e-02, -3.065e-01, -3.700e-01, -5.469e-01, 2.814e-01, 3.348e-01, 2.184e-03, -2.622e-02, -7.294e-02, -7.004e-02, 5.945e-02, -4.840e-02, -5.578e-02, -4.259e-02)); + r += mul(s4_7, M4(4.334e-01, -9.103e-02, -3.913e-02, -7.487e-01, -4.837e-02, -2.505e-01, -4.386e-01, -7.301e-02, -1.304e-01, 1.597e-01, 1.349e-01, -1.269e-01, -3.156e-02, -8.233e-02, -8.439e-02, 6.437e-02)); + r += mul(s4_8, M4(-4.428e-02, -1.736e-01, 4.854e-02, 1.284e-02, -3.662e-01, 2.678e-02, 5.405e-01, 2.903e-01, -5.651e-02, 9.120e-02, -1.013e-01, 1.912e-01, -4.199e-02, -8.293e-02, -6.620e-02, 2.943e-02)); + r += mul(s5_0, M4(-1.987e-01, -1.547e-01, -5.561e-02, -8.342e-02, 1.514e-02, 5.663e-02, 2.794e-02, 1.212e-02, -2.875e-01, 6.254e-02, 7.387e-02, -1.633e-01, 8.085e-01, 3.431e-01, 3.014e-01, 2.745e-01)); + r += mul(s5_1, M4(-2.051e-01, -6.087e-02, 5.766e-02, -7.692e-02, -1.024e-01, -4.273e-02, -1.372e-01, 4.320e-02, -1.518e-01, 1.360e-01, 8.103e-02, -1.821e-01, -2.056e-01, -2.549e-01, 2.046e-01, 5.617e-01)); + r += mul(s5_2, M4(-1.728e-01, 4.100e-02, 9.013e-02, -1.124e-01, 3.265e-02, 2.598e-02, 9.202e-02, 1.273e-02, -2.965e-01, 1.821e-01, 6.122e-02, -8.528e-02, 2.803e-01, -1.811e-01, 1.370e-01, 2.149e-01)); + r += mul(s5_3, M4(-1.312e-01, -3.662e-01, 8.119e-02, -2.271e-01, -4.113e-02, 2.732e-02, -1.767e-03, -2.948e-03, -9.039e-02, -7.144e-02, -1.613e-01, -8.596e-02, 8.690e-01, 4.897e-01, -1.207e+00, 9.880e-02)); + r += mul(s5_4, M4(-2.735e-01, -1.183e-01, -4.351e-02, -3.761e-01, 1.948e-01, -1.191e-01, 1.629e-01, -1.778e-01, -3.398e-01, 2.488e-01, -1.947e-02, -1.321e-01, 6.902e-01, 5.633e-01, -1.232e-01, 4.927e-01)); + r += mul(s5_5, M4(2.976e-01, 2.988e-01, -6.464e-02, -9.545e-02, -6.653e-02, 9.741e-02, -4.290e-02, 4.555e-02, -2.893e-02, 1.308e-01, 5.605e-02, -6.064e-02, -3.114e-01, -8.178e-01, 3.104e-01, 2.635e-02)); + r += mul(s5_6, M4(-8.242e-02, -1.583e-01, -1.901e-01, 1.168e-01, -2.350e-02, 6.218e-03, 4.620e-02, 6.105e-02, -1.188e-01, 4.919e-02, 1.486e-01, 1.242e-01, 7.847e-01, 3.252e-02, -5.260e-01, -1.583e-01)); + r += mul(s5_7, M4(-4.103e-01, -1.964e-01, 2.185e-01, 8.644e-02, -3.499e-02, 2.093e-01, -1.213e-01, 1.163e-01, -3.420e-01, 2.604e-02, 6.462e-02, 1.924e-01, -4.559e-01, 1.323e-01, 5.912e-01, -1.579e+00)); + r += mul(s5_8, M4(-2.548e-02, -4.858e-02, -3.874e-02, -1.303e-01, -3.209e-02, -1.387e-01, -5.796e-02, -1.124e-01, 2.226e-02, 2.233e-02, -6.212e-02, 1.973e-01, -2.222e-01, 2.089e-01, -9.420e-01, -9.306e-01)); + r += mul(s6_0, M4(-1.511e-02, 4.097e-03, -4.216e-02, 7.326e-03, -2.635e-01, 1.710e-01, 1.514e-01, -5.487e-02, 4.944e-02, 2.235e-02, -5.493e-02, 1.125e-02, 1.411e-02, -8.220e-02, 1.317e-01, 9.543e-02)); + r += mul(s6_1, M4(-1.996e-01, 4.866e-02, -8.690e-02, 7.167e-02, -5.474e-01, 4.555e-01, 1.259e-01, -1.487e-01, 5.495e-02, 5.494e-02, 1.018e-02, 3.303e-02, -3.038e-01, -1.981e-01, 2.573e-02, -1.666e-01)); + r += mul(s6_2, M4(-1.510e-01, -1.444e-01, 1.912e-01, 2.293e-02, -5.680e-02, -1.020e-02, 2.478e-03, 8.278e-02, -4.629e-02, 1.199e-01, -1.316e-02, 1.723e-02, 1.025e-01, -3.087e-01, -1.497e-01, -2.983e-01)); + r += mul(s6_3, M4(7.026e-02, 8.863e-02, -7.994e-03, 7.872e-02, -1.736e-01, 3.692e-02, 1.725e-01, 2.365e-01, 2.483e-02, 5.723e-02, 7.511e-02, 2.707e-02, -1.319e-01, -1.479e-01, 1.642e-01, -1.211e-02)); + r += mul(s6_4, M4(1.314e-01, -1.694e-01, 1.535e-01, -9.212e-02, -5.466e-02, -2.357e-03, 1.302e-01, 8.194e-02, 1.791e-01, -8.864e-02, -1.744e-01, -3.018e-01, -4.210e-01, -1.349e-01, 1.893e-02, -4.113e-01)); + r += mul(s6_5, M4(4.086e-02, 4.316e-02, -2.262e-01, -5.058e-02, -2.932e-01, 4.587e-02, -3.250e-02, -4.383e-02, -2.157e-01, 2.700e-01, -2.430e-01, 7.205e-02, -5.680e-01, -3.811e-01, 2.149e-01, -2.573e-01)); + r += mul(s6_6, M4(1.078e-02, -3.045e-02, 2.199e-02, -4.741e-03, 1.188e-01, 5.412e-02, -7.901e-02, -3.999e-02, 8.803e-02, -3.155e-02, 4.958e-02, 2.134e-02, -7.579e-02, -8.130e-02, -5.317e-02, -5.295e-02)); + r += mul(s6_7, M4(-1.196e-01, -1.957e-01, -7.800e-02, 9.788e-04, 2.797e-02, 9.152e-02, 1.106e-01, -8.070e-02, -2.925e-02, -5.609e-02, -2.472e-01, 1.509e-01, -2.631e-01, 7.884e-02, 1.909e-02, 1.659e-02)); + r += mul(s6_8, M4(1.074e-01, 6.685e-02, 8.382e-02, 1.438e-03, -1.291e-02, 8.508e-02, 8.563e-02, -3.086e-03, 2.686e-01, 7.002e-02, 2.222e-01, -3.415e-02, -1.489e-01, -1.043e-01, 1.182e-02, 2.139e-01)); + r += mul(s7_0, M4(-1.145e-01, 2.744e-01, -2.056e-01, 1.062e-02, 3.849e-01, -1.757e-01, -4.004e-01, 1.634e-01, -9.739e-02, -2.396e-02, 4.497e-02, -1.056e-01, 1.486e-03, 4.912e-02, -1.418e-02, 2.096e-01)); + r += mul(s7_1, M4(1.714e-01, -4.460e-03, -1.904e-01, 5.127e-02, 4.457e-01, -2.005e-01, -2.399e-01, 2.293e-01, 6.236e-03, -7.333e-02, -1.223e-01, -8.620e-02, 1.111e-03, -1.813e-03, -7.598e-02, 4.735e-02)); + r += mul(s7_2, M4(-2.502e-02, -3.663e-01, -8.110e-01, 3.594e-01, 2.693e-01, -1.316e-01, -1.044e-01, 5.490e-02, -7.955e-03, 4.426e-02, 6.322e-02, -3.838e-02, 7.466e-02, 1.846e-01, 1.519e-01, 8.454e-03)); + r += mul(s7_3, M4(-7.352e-03, 2.623e-01, 3.130e-01, -3.261e-01, 3.505e-01, -1.179e-01, -2.721e-01, 8.523e-02, -6.879e-02, -1.767e-02, 5.651e-02, -8.914e-03, 2.447e-01, -1.083e-01, 4.430e-02, 7.107e-02)); + r += mul(s7_4, M4(-1.929e-02, 3.448e-01, 2.304e-01, 2.651e-02, 2.087e-01, 1.053e-01, 1.363e-01, -3.634e-01, -1.015e-01, -2.363e-01, 2.921e-01, -2.386e-01, 2.457e-01, 3.764e-01, 3.237e-02, 5.597e-01)); + r += mul(s7_5, M4(-1.553e-01, -1.074e-01, 5.874e-01, -2.274e-01, 2.114e-01, -6.435e-02, -2.172e-01, -2.761e-02, -3.907e-01, 3.560e-01, -2.775e-01, 6.104e-02, 3.689e-01, -1.453e-02, -1.728e-01, 7.566e-03)); + r += mul(s7_6, M4(-7.675e-02, -1.726e-01, -6.876e-02, 4.848e-03, 5.463e-02, -1.048e-01, -6.406e-02, -2.276e-01, -1.039e-01, -2.836e-02, -5.157e-02, 5.531e-02, -3.366e-02, -7.267e-02, 1.411e-02, 1.252e-01)); + r += mul(s7_7, M4(-1.270e-01, -4.631e-02, 1.328e-02, 2.479e-02, 3.272e-01, -2.270e-01, 5.842e-02, -3.250e-01, -2.514e-01, 2.098e-02, 3.925e-02, 4.051e-01, 1.776e-03, 1.506e-01, -1.081e-01, 6.672e-02)); + r += mul(s7_8, M4(-5.914e-02, 3.369e-02, -3.859e-01, 5.139e-02, 1.176e-02, -2.484e-01, -2.014e-01, -9.925e-02, 8.024e-02, 2.293e-01, 1.120e-01, 3.000e-01, -1.269e-02, 1.858e-01, 3.387e-02, 7.079e-02)); + r += V4(-3.553e-03, 1.851e-02, -1.475e-03, -2.046e-03); + return r; +} + +V4 f2(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-1.301e-01, 1.852e-01, 5.814e-02, 1.602e-01, -7.324e-02, -9.636e-03, -3.789e-02, 6.091e-02, 2.139e-02, 1.489e-01, -5.092e-02, -2.141e-01, 1.817e-02, -5.365e-02, -8.297e-03, -1.622e-01)); + r += mul(s0_1, M4(-2.478e-01, 3.316e-02, 8.461e-02, 1.211e-01, -1.180e-01, 1.206e-02, 1.610e-02, -2.749e-01, 1.140e-01, 7.598e-03, -3.519e-02, -1.408e-01, -1.648e-02, -1.656e-02, -4.414e-02, 2.070e-02)); + r += mul(s0_2, M4(-2.335e-02, 1.978e-01, -1.556e-02, 3.378e-02, -2.163e-01, 3.364e-01, 1.228e-01, 1.547e-02, -6.270e-02, -3.193e-02, 1.627e-01, 2.969e-02, 2.034e-02, 2.136e-02, 6.094e-02, -2.019e-02)); + r += mul(s0_3, M4(1.285e-02, -2.024e-01, -9.700e-02, -1.794e-01, -9.623e-02, -9.618e-02, -9.907e-02, -9.705e-02, -2.150e-02, 1.495e-01, -4.000e-02, 1.222e-01, 2.313e-02, -6.182e-02, -2.520e-01, -3.130e-02)); + r += mul(s0_4, M4(4.752e-01, 3.734e-01, 1.631e-01, 4.730e-01, -6.413e-02, -1.026e-01, -3.961e-01, -3.547e-01, -3.024e-03, -3.711e-02, -2.455e-01, -6.002e-02, -1.056e-01, -5.290e-02, 9.390e-02, -9.400e-02)); + r += mul(s0_5, M4(-2.050e-01, 1.889e-01, 5.210e-02, -1.519e-01, -4.424e-01, 4.170e-01, 3.336e-01, 6.601e-02, -4.192e-02, 1.582e-01, 7.213e-01, -6.145e-02, 2.067e-02, 1.119e-01, 8.269e-02, 2.498e-02)); + r += mul(s0_6, M4(6.317e-02, -2.393e-01, 2.097e-01, -3.241e-01, -5.513e-02, -2.993e-01, -3.327e-02, 1.146e-01, 6.658e-02, 2.526e-01, -6.466e-02, -1.299e-01, 1.189e-01, 1.805e-01, -1.025e-01, 4.052e-01)); + r += mul(s0_7, M4(-1.485e-01, -3.282e-01, 2.939e-01, -1.965e-01, 1.870e-01, -8.957e-02, -1.142e-01, -3.095e-01, -1.417e-02, 1.559e-01, 4.212e-03, 1.039e-03, 2.103e-01, 1.226e-01, -1.062e-02, 3.177e-03)); + r += mul(s0_8, M4(-4.186e-02, -2.353e-01, -3.995e-01, -3.152e-01, -1.573e-01, -1.809e-01, 5.544e-02, 1.379e-01, -8.439e-02, 4.880e-02, 2.083e-01, -2.285e-02, 3.872e-02, 2.384e-02, 1.582e-01, 3.685e-02)); + r += mul(s1_0, M4(-2.870e-02, -2.180e-01, -3.956e-03, -6.426e-02, -7.369e-02, -5.972e-02, -5.140e-02, 5.628e-03, -5.322e-03, -5.234e-03, -6.372e-02, 7.234e-02, 1.971e-01, -4.791e-02, -1.424e-02, 1.053e-01)); + r += mul(s1_1, M4(6.124e-02, -2.243e-03, 7.789e-02, -7.308e-02, 6.888e-02, -9.903e-02, -2.497e-03, -2.062e-01, 6.845e-02, 2.470e-01, 2.999e-02, -1.223e-01, 1.429e-01, -1.507e-01, -1.256e-01, 2.482e-02)); + r += mul(s1_2, M4(2.098e-03, 2.680e-02, 1.280e-03, -4.057e-02, -9.606e-02, 1.380e-01, 6.146e-02, 1.155e-01, -2.300e-01, -4.105e-02, 6.834e-02, 8.465e-02, 9.438e-02, -4.055e-02, 6.837e-02, -7.285e-02)); + r += mul(s1_3, M4(-1.040e-02, 1.511e-01, -4.298e-02, 1.217e-01, -3.000e-02, 8.181e-02, -8.391e-02, 1.223e-01, 2.920e-02, -1.869e-01, -3.919e-02, 6.057e-02, 1.891e-01, -3.193e-01, -2.273e-01, -5.798e-04)); + r += mul(s1_4, M4(1.959e-01, -1.577e-01, -2.195e-01, -1.640e-01, 1.440e-01, -2.885e-01, -2.857e-01, 1.112e-01, 1.304e-01, -2.717e-01, -2.614e-01, 1.832e-01, 1.940e-02, 4.701e-02, 2.184e-01, -6.236e-02)); + r += mul(s1_5, M4(-8.599e-02, 6.717e-02, -1.220e-02, 1.836e-01, 1.421e-01, -1.275e-01, 5.431e-01, -4.815e-02, -1.114e-01, -1.473e-01, 8.673e-01, 7.798e-03, 1.355e-01, 2.496e-02, 4.905e-02, 3.218e-03)); + r += mul(s1_6, M4(4.089e-02, 3.901e-02, 5.964e-02, 1.996e-01, -7.805e-02, 8.634e-02, 1.071e-02, -2.466e-01, 2.620e-02, -1.834e-01, 1.571e-02, -4.377e-04, 1.694e-03, -3.362e-01, -9.583e-02, -2.825e-01)); + r += mul(s1_7, M4(-8.871e-03, 1.092e-01, -1.994e-02, 1.509e-01, -7.954e-02, -3.180e-02, 6.564e-02, 2.146e-01, -3.940e-02, 9.707e-02, -5.112e-02, 1.443e-01, -1.240e-01, -1.050e-01, 3.472e-02, -1.069e-01)); + r += mul(s1_8, M4(-1.782e-01, 6.332e-02, 1.005e-01, 6.335e-02, -3.707e-04, 2.747e-01, -1.506e-01, 1.424e-01, -1.282e-02, -3.532e-02, 1.548e-01, 1.675e-01, 2.869e-02, 5.486e-02, 2.176e-01, -6.712e-02)); + r += mul(s2_0, M4(-1.412e-01, -3.098e-01, -7.445e-02, 2.157e-01, 5.311e-02, -1.558e-01, -8.965e-02, 4.372e-01, -9.685e-02, 1.470e-01, 1.126e-02, -2.712e-01, -6.178e-03, 2.177e-01, 9.057e-02, -3.586e-01)); + r += mul(s2_1, M4(-2.887e-02, 3.857e-01, 1.478e-01, -3.073e-01, -4.715e-02, -3.539e-02, -3.963e-02, -5.781e-02, -6.861e-02, 2.639e-02, 6.041e-02, -1.550e-01, 2.678e-03, 2.058e-01, 1.584e-01, 2.845e-02)); + r += mul(s2_2, M4(-5.053e-02, 2.012e-01, 7.816e-02, 1.918e-01, 3.118e-02, 4.426e-02, 8.575e-02, -7.318e-03, 7.795e-02, 1.365e-01, -3.814e-02, 4.892e-02, 1.396e-01, -2.441e-02, -1.398e-01, 1.301e-01)); + r += mul(s2_3, M4(-3.261e-01, -5.362e-01, -6.300e-03, 3.624e-01, 5.769e-02, -8.803e-02, -1.381e-01, 1.369e-01, -1.077e-01, 1.248e-01, -1.380e-01, -1.420e-01, -1.239e-01, 1.671e-01, 9.395e-02, -7.019e-01)); + r += mul(s2_4, M4(-3.974e-01, 2.763e-01, -1.879e-01, 4.564e-01, 1.173e-01, -1.006e-01, -3.845e-01, 2.435e-01, -2.412e-02, 2.398e-01, 1.796e-01, 1.459e-02, 4.543e-01, 1.174e-02, -2.342e-01, -9.092e-02)); + r += mul(s2_5, M4(-2.089e-02, 1.043e-01, -1.193e-01, 2.741e-01, 3.587e-03, 1.636e-01, 2.701e-01, 1.616e-01, -6.077e-03, 6.642e-03, -1.240e-01, -2.768e-01, 1.194e-01, -2.036e-01, -3.423e-02, 1.648e-02)); + r += mul(s2_6, M4(1.165e-01, -3.786e-01, 1.182e-01, 1.605e-01, 7.495e-02, -6.525e-02, -4.634e-02, -4.205e-02, 2.304e-03, -2.042e-01, -6.347e-02, -1.020e-01, 1.175e-01, 1.265e-01, -8.620e-02, 5.688e-03)); + r += mul(s2_7, M4(-7.384e-03, -1.116e-01, -8.951e-02, 2.036e-01, -6.836e-02, -1.773e-01, 1.245e-01, 7.999e-02, 6.993e-02, 1.821e-01, 5.845e-02, -1.998e-01, 1.521e-01, 9.793e-02, 7.695e-02, 1.262e-01)); + r += mul(s2_8, M4(-8.152e-02, 3.856e-02, -6.092e-02, 2.426e-01, 8.689e-02, -7.674e-04, 1.209e-01, -1.583e-01, -2.678e-02, 1.684e-01, -1.711e-01, -7.350e-03, 2.231e-01, -2.241e-01, 7.775e-02, -1.196e-02)); + r += mul(s3_0, M4(-1.452e-02, 4.054e-02, -4.633e-02, -8.515e-02, 5.561e-02, 8.761e-02, -1.812e-01, -3.232e-01, 1.194e-01, 2.698e-01, 2.884e-02, -8.514e-02, 6.478e-02, -2.661e-01, -1.670e-03, 8.681e-02)); + r += mul(s3_1, M4(9.767e-02, -8.863e-02, -3.921e-02, 6.901e-02, 6.170e-02, -1.756e-01, 1.710e-01, -1.548e-01, 6.032e-02, 7.535e-02, 5.940e-02, 7.616e-02, -1.238e-01, 4.833e-02, 1.955e-01, 8.794e-02)); + r += mul(s3_2, M4(2.524e-02, 2.662e-02, 8.459e-02, -6.155e-03, 3.935e-02, 1.891e-02, 9.259e-03, -1.071e-01, 1.772e-01, -1.131e-01, -5.408e-02, 1.043e-01, -1.338e-01, -1.317e-02, -1.410e-01, 2.864e-02)); + r += mul(s3_3, M4(-8.616e-03, -2.835e-02, -1.107e-01, -1.689e-01, 5.178e-02, 6.897e-01, -1.391e-01, 8.983e-02, 4.867e-02, -2.122e-01, -1.802e-01, -1.015e-02, -2.706e-03, 1.483e-01, 1.323e-01, 3.286e-01)); + r += mul(s3_4, M4(-6.784e-02, -7.027e-03, 2.647e-01, -1.590e-02, 1.041e-01, -1.383e-01, -1.478e-01, -1.713e-01, 2.543e-02, -2.550e-01, -8.248e-03, -7.414e-03, 5.348e-02, 1.681e-02, -4.007e-01, -3.284e-02)); + r += mul(s3_5, M4(-1.803e-02, 7.886e-03, -6.364e-02, -2.430e-02, 8.611e-02, 5.071e-02, 1.808e-01, -1.886e-01, 1.901e-01, -2.587e-01, -7.593e-02, -1.351e-02, 8.406e-02, -7.927e-02, -7.538e-02, -1.249e-01)); + r += mul(s3_6, M4(-7.358e-02, 8.325e-02, 1.090e-01, -3.392e-02, -5.795e-02, 2.896e-01, -4.952e-02, 1.028e-01, -4.203e-02, -2.732e-02, 8.058e-03, 1.598e-01, -1.319e-02, -8.781e-02, 2.060e-02, 2.139e-02)); + r += mul(s3_7, M4(-2.411e-02, -4.139e-02, -8.324e-02, 6.797e-02, -8.778e-02, 8.484e-02, 2.128e-02, 6.571e-02, 4.007e-02, -3.879e-02, 9.627e-03, 1.774e-01, 1.298e-02, 1.097e-01, 1.314e-01, -4.692e-02)); + r += mul(s3_8, M4(-5.470e-02, 4.771e-02, -9.790e-02, -2.405e-04, 7.797e-02, 1.121e-01, 6.055e-02, -8.066e-02, 5.387e-02, 9.211e-03, -1.203e-01, 5.955e-02, 3.587e-02, 3.225e-03, 4.431e-03, -2.250e-02)); + r += mul(s4_0, M4(-2.785e-02, 7.038e-02, 1.777e-02, -6.899e-02, -1.786e-01, 5.678e-01, 3.086e-01, -6.197e-02, -2.101e-01, -4.708e-01, 7.508e-03, 1.944e-01, 6.144e-02, -1.105e-01, 3.901e-02, 5.978e-02)); + r += mul(s4_1, M4(2.066e-02, -1.288e-01, 4.087e-02, 1.860e-01, 3.306e-01, 1.913e-01, -1.289e-01, 2.461e-01, -3.596e-02, 5.661e-02, -9.447e-02, -2.039e-02, -7.522e-02, 1.154e-01, 5.388e-03, -5.283e-02)); + r += mul(s4_2, M4(8.102e-02, -7.280e-02, -1.040e-01, -2.783e-02, 1.147e-01, 9.859e-02, -9.925e-02, 1.961e-01, 9.113e-03, 1.240e-01, 1.797e-01, -1.161e-02, -5.068e-02, -6.592e-03, -7.103e-02, -1.090e-02)); + r += mul(s4_3, M4(8.255e-02, -3.384e-02, 1.756e-01, -7.400e-02, -6.854e-01, 2.786e-01, 1.294e-01, -1.433e-01, 1.169e-01, 4.389e-02, 8.293e-02, 2.403e-01, -4.694e-02, 6.013e-02, 1.809e-01, -1.189e-03)); + r += mul(s4_4, M4(6.230e-02, 2.329e-01, 1.511e-01, -1.491e-01, -6.517e-01, -3.116e-01, -7.005e-01, 3.086e-01, 1.032e-01, -8.114e-02, 1.042e-01, -1.800e-02, -1.441e-01, -2.906e-02, -4.734e-02, -4.410e-02)); + r += mul(s4_5, M4(1.066e-01, -1.437e-01, -3.467e-01, 9.725e-02, -3.574e-01, 1.397e-02, 4.027e-01, -9.219e-02, -1.345e-01, -3.592e-02, 5.481e-02, 2.041e-02, -3.619e-02, -4.025e-02, -8.226e-02, 8.882e-03)); + r += mul(s4_6, M4(-1.570e-01, 1.786e-01, 1.084e-01, -3.860e-02, -9.958e-01, 5.107e-01, 2.791e-01, -6.198e-01, 8.632e-03, 4.455e-02, 3.793e-02, 1.799e-01, -1.521e-02, -2.071e-03, 1.500e-01, -5.810e-02)); + r += mul(s4_7, M4(2.058e-02, -5.472e-02, 2.999e-02, -3.534e-01, -5.280e-01, 1.283e-01, 1.379e-02, -2.095e-01, -7.465e-02, -1.780e-02, 5.720e-02, 1.105e-01, -2.299e-02, -8.545e-02, 1.220e-02, -9.390e-02)); + r += mul(s4_8, M4(-7.549e-02, 2.686e-02, -3.224e-02, -1.891e-01, -2.563e-01, -2.980e-02, -2.683e-01, 4.311e-02, -5.702e-02, 9.769e-02, -3.178e-02, 7.403e-02, -3.932e-02, 9.627e-02, -1.382e-01, -3.233e-02)); + r += mul(s5_0, M4(-7.157e-02, 1.218e-01, 4.895e-02, -2.697e-02, -2.247e-01, -3.837e-02, 1.527e-01, 4.106e-02, 1.022e-02, 5.294e-02, -1.417e-02, -1.746e-01, -5.884e-02, -8.050e-01, -1.704e-01, -2.815e-01)); + r += mul(s5_1, M4(-1.708e-01, 4.261e-03, 4.935e-02, -2.315e-01, -7.595e-02, 7.886e-02, -9.628e-02, -1.124e-01, 1.992e-01, 4.148e-02, 1.165e-02, 2.824e-01, 3.617e-01, 1.361e-01, -2.831e-01, -5.913e-01)); + r += mul(s5_2, M4(-9.310e-02, 3.631e-02, -6.965e-02, -5.447e-02, -1.125e-01, -1.207e-02, -8.180e-02, 6.154e-02, -9.411e-02, -8.497e-02, 1.995e-02, -8.788e-03, -3.000e-03, -6.742e-01, -5.002e-02, 7.143e-01)); + r += mul(s5_3, M4(-9.140e-02, -3.208e-02, 1.647e-01, -1.924e-01, -3.634e-02, 5.920e-02, 1.146e-01, 5.098e-02, -5.068e-02, -2.226e-01, 1.232e-01, -6.575e-02, -3.223e-01, -7.135e-02, 4.797e-01, -3.695e-01)); + r += mul(s5_4, M4(2.570e-02, -2.095e-01, 1.539e-01, 1.723e-02, 5.085e-02, -1.300e-01, -2.396e-01, -3.175e-02, -1.770e-01, 2.109e-01, 3.226e-02, 5.015e-02, -1.094e+00, 9.919e-01, 4.163e-01, 3.218e-01)); + r += mul(s5_5, M4(-2.830e-01, 4.161e-02, -2.056e-01, -8.113e-02, 3.432e-02, 1.171e-01, 1.716e-01, -2.918e-03, -1.261e-02, 1.227e-02, 6.649e-02, -2.405e-01, -3.997e-02, -2.948e-01, -2.825e-01, 8.032e-01)); + r += mul(s5_6, M4(-6.231e-02, -1.346e-01, 1.226e-01, 1.050e-01, -1.370e-01, -1.499e-01, 1.062e-01, 8.043e-02, 2.492e-02, 1.732e-03, 9.060e-02, -2.609e-01, -3.209e-01, 1.015e+00, -2.472e-01, 3.568e-01)); + r += mul(s5_7, M4(3.223e-01, 4.831e-02, 1.083e-01, 4.442e-01, -1.101e-01, 1.498e-01, 5.688e-02, 2.313e-02, -4.522e-03, 6.388e-02, 3.195e-02, -1.484e-01, -2.437e-01, 7.016e-01, 1.396e-02, 1.372e-01)); + r += mul(s5_8, M4(2.243e-01, 1.056e-01, -1.796e-01, 7.784e-02, -2.328e-01, -5.866e-02, -1.860e-01, 4.648e-02, -4.558e-03, 6.233e-02, 3.451e-02, -5.534e-02, 7.662e-02, -2.773e-01, -2.279e-01, -9.295e-02)); + r += mul(s6_0, M4(-3.374e-02, -2.356e-02, 3.986e-02, -1.112e-01, -1.095e-01, -1.457e-01, -8.422e-02, -3.487e-01, -2.405e-02, -9.978e-02, -3.585e-02, -3.358e-02, -3.417e-02, 2.651e-01, 6.467e-02, 6.501e-02)); + r += mul(s6_1, M4(9.522e-02, -2.185e-01, 5.612e-02, -2.141e-01, 1.499e-01, -6.949e-02, 2.295e-01, -1.708e-01, 4.647e-02, 5.918e-02, -8.221e-02, -3.715e-02, 6.330e-02, 1.352e-01, -6.976e-02, 2.410e-02)); + r += mul(s6_2, M4(8.852e-02, -2.405e-02, -1.594e-01, 1.164e-02, -6.867e-02, -2.369e-02, -1.449e-01, 8.873e-02, -2.884e-02, 1.480e-02, 1.827e-01, 4.061e-02, -1.097e-01, -9.323e-03, 3.740e-02, -6.737e-02)); + r += mul(s6_3, M4(2.529e-03, 2.041e-03, 7.147e-02, -1.587e-01, 5.348e-02, -2.473e-01, 1.089e-01, -4.750e-01, -9.232e-02, 7.928e-03, 2.191e-02, 1.704e-01, -7.646e-03, 1.259e-01, -1.162e-02, -4.419e-02)); + r += mul(s6_4, M4(4.559e-02, -1.482e-02, -5.774e-02, 4.264e-02, -1.135e-01, 3.957e-02, 3.339e-01, -8.331e-02, 6.278e-02, 7.753e-02, -1.133e-01, 6.567e-02, -1.869e-01, -3.601e-01, 2.568e-01, 5.296e-02)); + r += mul(s6_5, M4(3.472e-02, 1.764e-02, -6.853e-02, -3.703e-02, -4.294e-03, 6.097e-02, -7.461e-02, -6.429e-02, -1.063e-01, 1.582e-01, 7.603e-01, -1.219e-01, -1.339e-01, -4.161e-01, -3.681e-01, -1.219e-01)); + r += mul(s6_6, M4(5.539e-02, 5.962e-02, -3.619e-02, 1.538e-01, 1.036e-01, -2.077e-01, 2.501e-02, -4.524e-02, -4.840e-02, -1.428e-01, -1.573e-03, 2.170e-02, 2.106e-02, 3.732e-02, -4.521e-02, 5.403e-02)); + r += mul(s6_7, M4(-1.762e-02, 8.959e-02, -7.463e-02, -3.898e-03, 3.685e-02, 1.724e-01, -2.027e-01, -7.210e-02, -4.951e-02, -4.845e-02, -6.237e-02, 1.247e-01, 4.155e-02, -1.484e-01, 2.090e-01, 1.118e-01)); + r += mul(s6_8, M4(1.777e-01, -2.414e-02, -3.344e-02, 5.355e-02, 2.664e-02, 5.144e-02, -3.208e-02, 1.029e-01, -5.298e-02, -1.654e-01, 3.050e-01, -8.195e-02, -2.546e-01, 3.789e-02, -1.125e-01, -9.267e-02)); + r += mul(s7_0, M4(-1.020e-01, -9.980e-02, -3.541e-02, -6.894e-02, 9.931e-03, 4.217e-01, 5.043e-02, 2.429e-01, -6.606e-02, 4.922e-02, -4.476e-02, -1.333e-01, -3.997e-02, -1.578e-02, 6.067e-02, -2.050e-01)); + r += mul(s7_1, M4(-1.406e-01, -6.426e-02, -4.408e-02, 2.217e-01, -4.419e-01, -2.667e-02, 4.985e-02, 4.093e-01, 3.958e-02, -5.435e-03, -4.548e-02, -5.027e-02, 1.826e-02, 2.531e-01, -1.185e-01, -1.326e-01)); + r += mul(s7_2, M4(-5.890e-02, 2.680e-01, 5.605e-01, -1.489e-01, -6.722e-02, 2.036e-01, -5.221e-02, -7.006e-02, -1.348e-01, -4.079e-02, 2.412e-01, 5.350e-02, 1.568e-01, -4.918e-01, 1.060e-01, 6.523e-02)); + r += mul(s7_3, M4(-9.169e-02, 2.759e-01, 3.524e-03, 3.174e-02, -1.553e-01, 4.311e-02, 1.794e-01, 9.289e-03, 4.978e-02, 2.541e-02, 6.696e-02, -2.903e-01, 2.529e-02, 1.400e-01, -7.264e-02, 7.721e-02)); + r += mul(s7_4, M4(-4.292e-02, 1.501e-01, -1.926e-01, -3.703e-01, -6.892e-02, -6.903e-02, 8.106e-02, 2.570e-03, 2.991e-02, -3.356e-02, -8.382e-02, -2.773e-01, -3.668e-02, 6.332e-01, 2.201e-01, 1.223e-01)); + r += mul(s7_5, M4(-3.877e-01, -1.253e-02, 1.201e-01, -6.158e-02, -3.971e-02, -8.619e-02, -1.808e-01, -4.551e-02, -2.302e-01, 2.303e-01, 7.661e-01, -1.921e-01, 2.226e-01, -3.984e-02, -5.196e-01, 1.682e-01)); + r += mul(s7_6, M4(6.983e-02, 1.725e-01, -1.283e-01, -9.891e-02, -9.465e-03, -1.510e-02, 1.482e-02, -8.322e-02, 6.130e-02, 2.546e-01, -1.395e-02, -2.814e-01, 3.947e-02, 7.462e-02, -3.519e-02, -5.704e-02)); + r += mul(s7_7, M4(1.587e-01, -1.040e-01, -2.058e-02, -2.364e-01, 1.647e-01, -2.598e-02, -1.130e-01, -6.468e-02, -1.939e-02, 7.214e-02, 6.094e-02, -1.198e-01, 7.880e-02, 5.938e-02, 6.658e-02, 1.664e-01)); + r += mul(s7_8, M4(1.303e-01, 1.111e-01, -8.631e-02, -1.597e-01, 5.681e-02, 5.566e-02, 1.534e-02, -7.725e-02, -9.031e-02, -1.759e-02, 8.732e-02, -8.315e-02, 5.717e-03, -2.107e-01, -5.688e-02, -4.731e-02)); + r += V4(3.098e-02, 3.454e-03, -5.766e-03, 4.181e-02); + return r; +} + +V4 f3(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(5.935e-02, -3.880e-02, -2.790e-02, -1.735e-01, 1.160e-01, -6.289e-02, -2.058e-03, -9.196e-02, -1.447e-02, -1.849e-01, -4.009e-02, 1.732e-01, 1.334e-03, 2.341e-02, -1.479e-01, -1.151e-01)); + r += mul(s0_1, M4(-1.772e-01, -9.737e-02, -4.854e-02, 2.510e-02, 1.265e-01, -1.552e-01, -2.271e-01, -1.100e-01, 3.124e-04, -1.101e-01, -6.041e-01, 1.344e-01, 1.428e-01, -4.656e-02, -2.475e-03, -9.346e-02)); + r += mul(s0_2, M4(3.122e-02, -1.688e-01, 9.462e-03, 1.356e-01, -7.914e-02, -8.563e-02, 3.218e-02, -2.323e-03, 1.664e-01, -4.178e-02, -1.479e-01, 4.674e-02, -7.378e-02, 1.561e-02, -3.414e-02, 1.088e-01)); + r += mul(s0_3, M4(1.459e-01, -4.136e-02, 7.610e-02, 6.052e-02, -1.811e-02, -1.102e-01, 4.487e-02, -6.445e-02, -2.153e-01, -1.092e-01, -2.133e-02, -7.086e-03, 5.998e-02, -1.157e-01, 2.759e-01, -1.350e-02)); + r += mul(s0_4, M4(-2.649e-01, -2.284e-01, 1.643e-01, -2.664e-01, 9.469e-02, -2.300e-01, 2.886e-01, -3.613e-01, 2.813e-01, 3.831e-02, 1.587e-01, -2.142e-01, 1.235e-01, -6.098e-02, 4.062e-02, 4.105e-02)); + r += mul(s0_5, M4(2.236e-01, 9.460e-02, 3.632e-02, -4.123e-01, -1.973e-01, -1.740e-01, -7.194e-02, 3.953e-02, 1.288e-01, 3.952e-03, -1.424e-01, 1.233e-01, 4.519e-02, 8.368e-02, -9.193e-02, 1.482e-01)); + r += mul(s0_6, M4(3.798e-01, -7.213e-03, 5.432e-02, -7.467e-02, 6.516e-02, -9.290e-02, 1.106e-01, 9.044e-02, -1.529e-01, -7.000e-02, 3.770e-02, -1.429e-02, -5.189e-01, -2.602e-02, 5.561e-02, -5.095e-01)); + r += mul(s0_7, M4(-1.523e-01, 5.008e-01, -1.562e-01, -7.291e-02, 3.043e-01, -1.469e-01, -1.206e-01, 3.775e-02, -2.512e-02, -2.162e-01, 1.028e-01, 1.379e-01, -4.190e-02, -2.226e-01, 8.129e-02, 6.048e-02)); + r += mul(s0_8, M4(6.118e-02, 2.485e-01, 1.206e-01, -6.543e-03, -1.393e-01, -1.410e-01, 6.509e-02, 2.388e-03, 1.684e-01, 8.039e-02, 9.741e-02, 2.378e-01, 2.011e-02, -2.027e-01, 3.670e-02, 7.855e-03)); + r += mul(s1_0, M4(-2.440e-02, 1.029e-01, -4.293e-02, -1.076e-02, -2.178e-03, 7.526e-02, -3.960e-02, -2.570e-02, -5.119e-02, 5.620e-02, -4.994e-02, 6.796e-02, -1.239e-01, 5.108e-02, -4.895e-02, 1.677e-01)); + r += mul(s1_1, M4(-1.277e-02, 1.926e-01, -2.228e-01, 5.436e-02, 2.798e-02, 9.485e-02, -2.055e-01, 5.804e-02, 5.623e-02, 1.654e-01, -7.012e-01, 2.912e-02, -1.199e-01, 3.823e-01, 1.260e-01, 1.435e-02)); + r += mul(s1_2, M4(1.549e-02, 4.324e-02, -3.260e-02, 8.202e-02, 4.305e-02, 3.250e-02, 4.104e-02, 3.048e-02, 2.463e-02, 1.867e-01, -9.088e-02, -1.244e-02, -6.285e-02, -5.562e-02, -2.877e-02, 3.847e-02)); + r += mul(s1_3, M4(-1.821e-01, -2.045e-01, 2.250e-02, -3.304e-02, -5.895e-02, 6.221e-02, 3.330e-02, 5.408e-02, -1.284e-01, 8.601e-04, -4.206e-02, 2.415e-02, -1.203e-01, 1.027e-01, -6.372e-01, 1.800e-03)); + r += mul(s1_4, M4(5.460e-02, 1.171e-01, -1.551e-01, 3.550e-02, 3.756e-01, 1.625e-01, 4.267e-01, -3.865e-02, 2.818e-01, 1.405e-01, 2.300e-01, -3.230e-01, -2.077e-01, 4.363e-01, -3.084e-01, -8.473e-02)); + r += mul(s1_5, M4(-7.994e-02, -1.892e-01, 1.632e-01, -9.721e-02, 1.368e-01, 1.737e-01, -2.244e-01, -3.117e-02, -2.395e-01, 2.234e-01, -2.775e-01, 1.149e-01, -2.063e-03, -1.582e-02, -7.830e-02, 6.865e-02)); + r += mul(s1_6, M4(-6.998e-02, -6.605e-03, 2.792e-02, 2.266e-01, -6.332e-02, 3.743e-02, 5.763e-02, 2.327e-03, -1.112e-01, 1.532e-02, 5.560e-03, -1.085e-01, 4.812e-01, -1.153e-01, 3.079e-01, 4.507e-01)); + r += mul(s1_7, M4(7.519e-02, 3.813e-02, 1.490e-01, -1.141e-02, -2.822e-01, -1.736e-01, -5.976e-02, 1.584e-02, -9.721e-02, -1.107e-01, 6.983e-02, 8.767e-03, -4.832e-01, -6.800e-02, 1.575e-01, 1.001e-01)); + r += mul(s1_8, M4(1.033e-01, -4.228e-02, -2.677e-02, -5.970e-02, -7.797e-02, -5.242e-02, -1.062e-02, -5.887e-02, -2.408e-02, 2.243e-01, 4.478e-02, 1.706e-01, -1.517e-01, -1.129e-01, 5.236e-02, -8.809e-03)); + r += mul(s2_0, M4(2.329e-01, 8.285e-02, 1.670e-01, -1.654e-02, -2.183e-01, -1.100e-02, -1.346e-01, -1.262e-01, -1.249e-01, -8.720e-02, -3.215e-02, 7.218e-03, -2.670e-03, 5.960e-03, 6.482e-04, 7.179e-02)); + r += mul(s2_1, M4(1.630e-01, 4.832e-01, -1.151e-01, -3.790e-02, 1.828e-02, 1.931e-01, -5.413e-01, -1.107e-02, -5.487e-02, -1.571e-01, -2.764e-01, -9.029e-02, -9.916e-02, 2.014e-01, 1.388e-01, -1.145e-01)); + r += mul(s2_2, M4(6.762e-03, 2.226e-01, 1.987e-02, -5.423e-02, -1.619e-02, 9.245e-02, -1.441e-01, 9.986e-02, 9.010e-02, -4.430e-02, -8.324e-02, -8.687e-02, -1.810e-01, -1.421e-01, 1.816e-02, -1.274e-01)); + r += mul(s2_3, M4(-6.187e-02, -2.608e-01, 1.371e-01, -7.463e-02, -1.247e-01, -1.769e-01, 1.860e-02, 1.903e-01, 1.004e-01, 1.098e-01, 6.763e-02, -6.562e-02, -1.488e-01, -7.447e-02, -1.223e-01, -1.545e-01)); + r += mul(s2_4, M4(-3.720e-01, -2.576e-02, -5.008e-02, -1.121e-01, -2.110e-02, -1.102e-03, 2.392e-01, -4.548e-02, 2.275e-01, 1.186e-01, 4.092e-01, 1.159e-03, -5.391e-02, 1.189e-01, -2.803e-01, -6.989e-02)); + r += mul(s2_5, M4(-2.357e-01, -2.881e-02, -1.628e-02, -5.717e-02, -5.192e-02, 8.166e-02, 5.828e-02, 1.137e-01, -2.024e-01, -2.246e-01, -1.492e-01, -1.331e-01, -2.242e-01, 2.840e-01, -6.200e-02, -1.559e-02)); + r += mul(s2_6, M4(3.271e-01, -2.728e-01, -2.201e-02, 1.165e-01, 4.544e-02, -6.330e-02, 9.576e-02, -8.706e-02, 6.837e-02, -9.075e-02, -6.291e-02, -6.290e-02, -2.278e-01, -2.028e-02, 2.094e-02, -1.649e-01)); + r += mul(s2_7, M4(2.697e-01, -1.229e-01, 2.684e-02, 2.014e-02, -1.793e-01, 7.902e-02, 2.036e-01, 1.403e-02, -1.683e-01, -1.475e-01, -9.334e-02, -9.973e-02, 1.661e-02, 1.149e-01, 8.812e-02, -9.418e-02)); + r += mul(s2_8, M4(1.436e-02, 5.699e-02, 2.813e-04, -2.904e-02, -4.214e-02, -9.986e-02, 3.843e-02, 3.767e-02, -7.750e-02, -1.411e-01, -7.223e-02, -9.483e-03, 2.011e-01, -1.208e-01, 1.293e-02, -1.869e-01)); + r += mul(s3_0, M4(1.751e-01, -1.945e-01, -2.919e-02, -1.608e-01, 2.052e-01, -2.025e-01, 3.285e-03, 2.567e-02, 1.568e-02, 6.525e-02, 1.727e-02, 1.762e-01, -7.644e-02, 1.772e-01, -2.706e-03, -9.601e-03)); + r += mul(s3_1, M4(-8.242e-03, -8.551e-02, 2.167e-01, 9.846e-02, 4.345e-02, -1.528e-01, -6.191e-01, -1.605e-02, -1.175e-01, -1.736e-01, -2.902e-01, -5.365e-02, -2.956e-02, 1.581e-02, 1.141e-01, -7.861e-02)); + r += mul(s3_2, M4(-8.168e-02, 9.317e-02, 1.080e-03, 7.253e-02, -4.799e-02, 1.806e-01, -2.751e-01, 4.717e-02, 1.430e-01, -1.340e-01, -2.213e-02, 1.214e-01, 1.308e-04, 8.701e-02, 3.179e-03, 9.169e-02)); + r += mul(s3_3, M4(4.130e-02, 1.459e-01, 8.394e-02, -1.792e-02, -2.212e-02, -1.066e-01, 1.071e-01, 7.341e-02, 1.160e-01, 8.097e-02, 5.112e-02, -7.335e-03, -9.636e-02, -1.319e-01, -4.296e-02, 6.101e-02)); + r += mul(s3_4, M4(-7.374e-02, -2.285e-02, 3.085e-02, 6.584e-02, 3.442e-01, -9.557e-03, 3.653e-02, -2.316e-01, -4.737e-02, 1.919e-01, 3.546e-01, -6.006e-02, 7.363e-02, 6.111e-02, 1.844e-02, -1.562e-01)); + r += mul(s3_5, M4(-5.292e-02, -1.842e-01, -5.210e-02, -1.087e-01, -9.492e-02, -1.672e-01, 8.528e-02, 3.359e-02, 7.379e-02, 1.750e-01, -1.559e-01, 5.677e-02, -1.406e-02, -1.478e-01, 2.558e-02, -2.936e-02)); + r += mul(s3_6, M4(6.805e-03, 9.529e-02, -1.310e-01, 3.838e-02, -3.827e-01, 6.978e-02, 1.043e-01, 4.919e-02, -1.805e-01, 4.051e-02, 1.205e-02, 1.159e-01, 9.640e-02, -1.350e-01, -8.444e-03, 1.027e-01)); + r += mul(s3_7, M4(3.617e-02, 7.544e-02, -3.033e-02, -1.630e-02, -8.538e-02, 1.023e-01, 1.871e-01, -9.201e-02, 6.537e-02, -1.245e-01, -1.172e-01, -3.826e-02, 4.586e-02, 3.039e-02, 8.042e-02, 1.039e-01)); + r += mul(s3_8, M4(5.207e-02, -1.440e-01, -7.737e-04, 2.142e-02, -5.843e-02, 1.186e-02, 3.869e-02, 1.482e-02, -1.587e-01, 5.633e-02, -3.806e-02, 1.101e-01, 6.918e-02, 4.886e-02, 8.826e-03, 1.185e-01)); + r += mul(s4_0, M4(4.134e-02, -5.948e-02, 5.677e-02, 1.336e-01, 6.300e-02, 1.927e-01, 2.735e-01, 2.763e-01, 1.347e-01, 1.102e-01, 2.558e-01, 1.069e-02, -1.023e-01, -2.797e-02, -2.972e-02, 6.513e-02)); + r += mul(s4_1, M4(-2.106e-02, 4.948e-02, 4.398e-02, 1.727e-01, 7.379e-02, -2.729e-01, -1.749e-01, 2.668e-01, -1.237e-01, 5.604e-02, 8.591e-01, -1.229e-01, 2.704e-01, -1.718e-01, 1.959e-01, -3.976e-02)); + r += mul(s4_2, M4(1.325e-02, 4.691e-02, 5.585e-02, 6.508e-02, 1.005e-01, -2.067e-01, 1.859e-01, -4.363e-02, 7.888e-02, -3.773e-02, 2.071e-01, -1.816e-01, 6.120e-02, -2.286e-02, 7.740e-02, 5.250e-02)); + r += mul(s4_3, M4(5.538e-02, 1.723e-01, 5.215e-02, 5.218e-02, -1.293e-01, -2.408e-02, 1.046e-01, 1.966e-01, 1.912e-01, 3.076e-02, -5.604e-03, 2.458e-02, 6.852e-03, 3.539e-02, 7.286e-02, -7.049e-03)); + r += mul(s4_4, M4(-6.083e-02, 1.961e-01, -7.071e-01, 7.913e-02, 3.160e-01, -5.599e-01, 5.716e-01, -1.436e-01, -1.422e-01, -3.896e-02, 3.694e-02, 6.415e-02, -3.721e-02, 8.450e-02, -2.492e-02, 4.170e-02)); + r += mul(s4_5, M4(-4.336e-02, -5.783e-02, 1.582e-01, 7.864e-03, -2.993e-01, 5.704e-01, -3.629e-02, 1.938e-02, -3.487e-02, 2.981e-01, -1.278e-01, -1.120e-01, -3.010e-02, 8.082e-02, 8.272e-03, -5.287e-02)); + r += mul(s4_6, M4(5.917e-01, 2.954e-01, 6.211e-02, 4.851e-02, 1.850e-01, -1.119e-01, -2.654e-01, 4.469e-01, -2.616e-01, 1.536e-01, 5.430e-02, 5.105e-02, -4.489e-02, -1.715e-02, -7.015e-02, -3.212e-02)); + r += mul(s4_7, M4(3.557e-01, 6.459e-02, -8.283e-02, 9.279e-02, -1.481e-01, -6.049e-01, -2.963e-01, 6.103e-01, -2.518e-01, -1.455e-01, -3.510e-02, 1.284e-01, -6.814e-02, -5.309e-03, -2.072e-01, -2.491e-02)); + r += mul(s4_8, M4(-9.047e-02, 1.771e-01, -3.731e-02, 8.465e-02, -1.685e-01, 7.672e-01, -3.389e-01, 7.383e-02, -4.803e-02, -1.344e-03, 9.633e-02, 3.742e-02, -2.154e-02, 5.721e-02, -1.354e-01, -2.491e-02)); + r += mul(s5_0, M4(4.403e-02, -1.212e-01, 3.089e-02, 5.049e-02, 7.390e-02, 1.838e-03, 6.242e-02, 1.249e-01, -8.862e-02, -6.818e-02, 3.279e-01, -5.009e-02, -4.138e-01, 2.611e-01, -3.124e-01, 5.053e-01)); + r += mul(s5_1, M4(-3.701e-02, -1.304e-01, -5.969e-02, -7.970e-02, 3.802e-02, -1.047e-01, -4.551e-02, 1.588e-01, 1.413e-01, 2.751e-02, 8.287e-01, -5.949e-03, 2.463e-01, -2.822e-01, 8.598e-01, 3.485e-01)); + r += mul(s5_2, M4(1.565e-01, -1.857e-01, -7.390e-02, -1.039e-01, -2.352e-02, -6.304e-02, 1.453e-01, -5.807e-02, -3.799e-02, 5.020e-02, 2.783e-01, -4.422e-03, 1.387e-01, -5.167e-01, -2.931e-01, 9.587e-02)); + r += mul(s5_3, M4(8.589e-02, 1.289e-01, -6.683e-02, 4.814e-02, -8.548e-02, 2.677e-02, 6.868e-02, 5.201e-02, 7.186e-02, -1.416e-01, -1.007e-01, -8.311e-02, 3.191e-01, 4.675e-01, 5.159e-01, 7.636e-01)); + r += mul(s5_4, M4(-6.463e-02, -1.631e-01, 5.215e-01, 3.350e-01, 8.587e-02, 4.618e-02, 4.037e-01, -8.477e-02, -1.770e-01, -1.140e-01, -1.549e-01, -1.450e-01, 1.364e-01, -9.146e-01, -5.524e-01, 1.825e+00)); + r += mul(s5_5, M4(1.068e-01, -6.471e-02, 2.219e-01, -2.326e-01, -1.201e-01, 7.923e-02, -1.147e-01, 9.964e-02, 1.038e-01, -1.205e-01, -2.941e-02, 1.203e-01, -1.237e-01, -1.006e+00, 3.622e-01, 8.427e-01)); + r += mul(s5_6, M4(-2.385e-01, -8.214e-02, 4.111e-02, -1.813e-01, 2.792e-03, -1.395e-02, -1.086e-01, 1.065e-01, -2.391e-02, -3.052e-01, 1.056e-01, -3.421e-02, 9.469e-02, 8.340e-01, 2.849e-01, 2.031e-01)); + r += mul(s5_7, M4(9.971e-02, 5.047e-01, -2.979e-01, -1.733e-01, -8.788e-02, 1.026e-01, -1.817e-01, 4.214e-03, 3.298e-02, -7.605e-02, 1.429e-02, -4.575e-02, -1.267e-01, -5.742e-01, -7.175e-01, 2.723e-01)); + r += mul(s5_8, M4(9.887e-02, -4.113e-01, -1.008e-01, -1.136e-01, 1.018e-01, -8.625e-02, -1.318e-01, -4.740e-03, -2.426e-02, -1.553e-01, 1.172e-01, 1.149e-01, -2.133e-01, 6.096e-01, 1.745e-02, 3.555e-01)); + r += mul(s6_0, M4(3.467e-03, 4.382e-02, -1.133e-02, 1.122e-01, -3.510e-01, 7.850e-02, 8.999e-02, 4.331e-02, 7.696e-02, 1.111e-01, 1.802e-02, 4.615e-02, 1.111e-01, -8.898e-02, -4.695e-02, 2.049e-02)); + r += mul(s6_1, M4(-1.653e-01, 6.621e-02, -9.456e-02, 4.057e-02, -1.378e-01, -2.176e-01, -1.620e-01, 5.770e-02, -6.695e-02, 1.311e-02, -1.634e-01, -6.544e-02, 5.784e-02, -1.495e-01, -2.370e-02, -3.395e-02)); + r += mul(s6_2, M4(-2.519e-01, -1.395e-01, -1.221e-02, -6.786e-03, -8.544e-02, -1.050e-01, -6.063e-02, 1.284e-01, -6.179e-02, 1.278e-01, -5.883e-02, 6.400e-02, -7.423e-02, -1.831e-01, -2.137e-02, -2.193e-01)); + r += mul(s6_3, M4(-9.478e-02, 1.650e-01, -1.248e-03, -3.417e-02, 7.054e-01, 2.271e-01, -5.585e-02, 6.382e-02, -7.301e-02, -3.995e-02, -1.089e-01, -7.827e-03, 2.849e-02, -2.844e-02, -1.083e-01, -6.346e-02)); + r += mul(s6_4, M4(3.468e-01, -2.994e-03, 1.476e-01, -2.409e-01, 7.781e-02, 2.649e-01, -2.783e-01, 1.083e-01, 1.441e-01, 6.688e-02, 2.519e-01, -9.673e-02, -2.108e-01, 1.019e-01, 1.226e-01, 4.383e-02)); + r += mul(s6_5, M4(2.953e-01, -9.021e-02, -1.069e-01, 8.069e-02, 1.225e-02, -2.118e-01, 8.543e-02, 3.792e-02, -6.041e-02, 3.033e-01, 3.664e-03, 3.392e-01, -1.063e-01, -2.672e-01, -2.135e-01, -2.742e-01)); + r += mul(s6_6, M4(-9.368e-02, -1.528e-01, 4.258e-02, -3.731e-02, 3.532e-01, 5.316e-02, 1.216e-03, 7.313e-02, -5.776e-02, -6.265e-02, 7.818e-02, 7.796e-02, -9.342e-02, -1.789e-01, -5.186e-03, -3.357e-02)); + r += mul(s6_7, M4(-1.119e-01, 1.409e-02, -8.511e-02, -8.581e-02, 4.249e-01, -3.115e-02, 1.212e-02, 4.140e-02, -8.697e-02, -3.781e-02, 2.415e-02, 1.004e-01, 2.033e-01, -2.625e-01, -1.195e-01, -1.446e-01)); + r += mul(s6_8, M4(-3.751e-02, 9.377e-02, 5.160e-02, -1.203e-01, -2.743e-02, 6.405e-02, -3.684e-02, -5.488e-02, 4.787e-02, 9.193e-02, 2.991e-02, -7.666e-02, 1.946e-01, -2.017e-01, -3.872e-02, -1.146e-01)); + r += mul(s7_0, M4(5.174e-02, -1.932e-01, -5.817e-03, 3.660e-02, 1.551e-01, -7.090e-02, 1.983e-01, 4.514e-02, 2.454e-02, 2.151e-02, 2.254e-02, 2.139e-02, 8.666e-02, -8.359e-02, -6.452e-02, 3.204e-03)); + r += mul(s7_1, M4(6.476e-01, -2.439e-01, -3.170e-02, 1.879e-01, -1.950e-01, -9.900e-02, 3.069e-02, -1.771e-02, -3.367e-02, -1.146e-01, -2.026e-01, -1.267e-01, -6.860e-02, -5.204e-02, -9.675e-03, -2.931e-02)); + r += mul(s7_2, M4(3.228e-01, -1.253e-02, 1.359e-01, 3.780e-01, -7.254e-02, -2.202e-01, -1.502e-02, 1.158e-02, -7.370e-02, 7.129e-02, 2.702e-02, 8.427e-02, 3.789e-01, 2.073e-02, -1.668e-02, 2.945e-02)); + r += mul(s7_3, M4(-5.933e-02, -1.988e-01, 5.261e-02, 1.353e-01, -1.531e-01, -1.078e-01, -7.204e-02, -2.297e-01, 3.892e-02, -6.414e-02, -1.413e-01, -6.568e-02, -4.182e-02, -6.158e-02, -7.575e-02, -1.336e-02)); + r += mul(s7_4, M4(-5.649e-01, 3.911e-01, 1.717e-01, 1.238e-01, -8.583e-02, -9.941e-02, -2.325e-01, -1.359e-02, 1.744e-01, -3.874e-02, 3.085e-01, -1.988e-01, -1.290e-01, -1.004e-02, 1.707e-01, 1.001e-01)); + r += mul(s7_5, M4(-3.325e-01, 2.026e-01, -8.293e-02, 2.123e-01, -3.594e-02, 4.981e-02, 1.057e-01, -7.827e-02, -1.563e-01, 1.890e-01, -9.641e-02, 6.924e-02, 7.589e-02, 1.252e-01, 1.572e-01, 4.694e-02)); + r += mul(s7_6, M4(-3.188e-01, -8.384e-02, 1.629e-02, -1.835e-02, 6.289e-02, 2.915e-02, -2.368e-02, -1.087e-01, -1.791e-02, 4.458e-02, 7.646e-02, 2.115e-03, -1.045e-01, 1.727e-02, 2.779e-03, 4.634e-02)); + r += mul(s7_7, M4(1.319e-01, -2.771e-01, -6.121e-02, 1.152e-01, -5.918e-02, 1.664e-01, 3.653e-02, -1.324e-01, -3.359e-01, -7.423e-02, 2.660e-02, -8.684e-02, -5.081e-01, -1.056e-01, -1.695e-01, 5.068e-02)); + r += mul(s7_8, M4(2.551e-01, -2.393e-02, 2.413e-02, 1.231e-01, 6.143e-02, -1.052e-01, -7.441e-03, -8.615e-02, 2.186e-01, 5.253e-02, 5.781e-02, -1.213e-01, -2.231e-01, 5.117e-02, -5.953e-02, -5.153e-02)); + r += V4(-9.954e-04, -3.246e-03, 1.139e-02, 8.716e-02); + return r; +} + +void Pass2(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = Rmp8x8(tid.x) + blockStart; + uint2 size = GetInputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = (gxy + 0.5) * pt; + + V4 s0_0 = l0(-1.0, -1.0); + V4 s0_1 = l0(0.0, -1.0); + V4 s0_2 = l0(1.0, -1.0); + V4 s0_3 = l0(-1.0, 0.0); + V4 s0_4 = l0(0.0, 0.0); + V4 s0_5 = l0(1.0, 0.0); + V4 s0_6 = l0(-1.0, 1.0); + V4 s0_7 = l0(0.0, 1.0); + V4 s0_8 = l0(1.0, 1.0); + V4 s1_0 = -max(-s0_0, 0.0); + V4 s1_1 = -max(-s0_1, 0.0); + V4 s1_2 = -max(-s0_2, 0.0); + V4 s1_3 = -max(-s0_3, 0.0); + V4 s1_4 = -max(-s0_4, 0.0); + V4 s1_5 = -max(-s0_5, 0.0); + V4 s1_6 = -max(-s0_6, 0.0); + V4 s1_7 = -max(-s0_7, 0.0); + V4 s1_8 = -max(-s0_8, 0.0); + s0_0 = max(s0_0, 0.0); + s0_1 = max(s0_1, 0.0); + s0_2 = max(s0_2, 0.0); + s0_3 = max(s0_3, 0.0); + s0_4 = max(s0_4, 0.0); + s0_5 = max(s0_5, 0.0); + s0_6 = max(s0_6, 0.0); + s0_7 = max(s0_7, 0.0); + s0_8 = max(s0_8, 0.0); + + V4 s2_0 = l1(-1.0, -1.0); + V4 s2_1 = l1(0.0, -1.0); + V4 s2_2 = l1(1.0, -1.0); + V4 s2_3 = l1(-1.0, 0.0); + V4 s2_4 = l1(0.0, 0.0); + V4 s2_5 = l1(1.0, 0.0); + V4 s2_6 = l1(-1.0, 1.0); + V4 s2_7 = l1(0.0, 1.0); + V4 s2_8 = l1(1.0, 1.0); + V4 s3_0 = -max(-s2_0, 0.0); + V4 s3_1 = -max(-s2_1, 0.0); + V4 s3_2 = -max(-s2_2, 0.0); + V4 s3_3 = -max(-s2_3, 0.0); + V4 s3_4 = -max(-s2_4, 0.0); + V4 s3_5 = -max(-s2_5, 0.0); + V4 s3_6 = -max(-s2_6, 0.0); + V4 s3_7 = -max(-s2_7, 0.0); + V4 s3_8 = -max(-s2_8, 0.0); + s2_0 = max(s2_0, 0.0); + s2_1 = max(s2_1, 0.0); + s2_2 = max(s2_2, 0.0); + s2_3 = max(s2_3, 0.0); + s2_4 = max(s2_4, 0.0); + s2_5 = max(s2_5, 0.0); + s2_6 = max(s2_6, 0.0); + s2_7 = max(s2_7, 0.0); + s2_8 = max(s2_8, 0.0); + + V4 s4_0 = l2(-1.0, -1.0); + V4 s4_1 = l2(0.0, -1.0); + V4 s4_2 = l2(1.0, -1.0); + V4 s4_3 = l2(-1.0, 0.0); + V4 s4_4 = l2(0.0, 0.0); + V4 s4_5 = l2(1.0, 0.0); + V4 s4_6 = l2(-1.0, 1.0); + V4 s4_7 = l2(0.0, 1.0); + V4 s4_8 = l2(1.0, 1.0); + V4 s5_0 = -max(-s4_0, 0.0); + V4 s5_1 = -max(-s4_1, 0.0); + V4 s5_2 = -max(-s4_2, 0.0); + V4 s5_3 = -max(-s4_3, 0.0); + V4 s5_4 = -max(-s4_4, 0.0); + V4 s5_5 = -max(-s4_5, 0.0); + V4 s5_6 = -max(-s4_6, 0.0); + V4 s5_7 = -max(-s4_7, 0.0); + V4 s5_8 = -max(-s4_8, 0.0); + s4_0 = max(s4_0, 0.0); + s4_1 = max(s4_1, 0.0); + s4_2 = max(s4_2, 0.0); + s4_3 = max(s4_3, 0.0); + s4_4 = max(s4_4, 0.0); + s4_5 = max(s4_5, 0.0); + s4_6 = max(s4_6, 0.0); + s4_7 = max(s4_7, 0.0); + s4_8 = max(s4_8, 0.0); + + V4 s6_0 = l3(-1.0, -1.0); + V4 s6_1 = l3(0.0, -1.0); + V4 s6_2 = l3(1.0, -1.0); + V4 s6_3 = l3(-1.0, 0.0); + V4 s6_4 = l3(0.0, 0.0); + V4 s6_5 = l3(1.0, 0.0); + V4 s6_6 = l3(-1.0, 1.0); + V4 s6_7 = l3(0.0, 1.0); + V4 s6_8 = l3(1.0, 1.0); + V4 s7_0 = -max(-s6_0, 0.0); + V4 s7_1 = -max(-s6_1, 0.0); + V4 s7_2 = -max(-s6_2, 0.0); + V4 s7_3 = -max(-s6_3, 0.0); + V4 s7_4 = -max(-s6_4, 0.0); + V4 s7_5 = -max(-s6_5, 0.0); + V4 s7_6 = -max(-s6_6, 0.0); + V4 s7_7 = -max(-s6_7, 0.0); + V4 s7_8 = -max(-s6_8, 0.0); + s6_0 = max(s6_0, 0.0); + s6_1 = max(s6_1, 0.0); + s6_2 = max(s6_2, 0.0); + s6_3 = max(s6_3, 0.0); + s6_4 = max(s6_4, 0.0); + s6_5 = max(s6_5, 0.0); + s6_6 = max(s6_6, 0.0); + s6_7 = max(s6_7, 0.0); + s6_8 = max(s6_8, 0.0); + + t4[gxy] = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t5[gxy] = f1(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t6[gxy] = f2(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t7[gxy] = f3(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); +} + +//!PASS 3 +//!DESC conv2 +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 +//!IN t4, t5, t6, t7 +//!OUT t0, t1, t2, t3 + +#define l0(x, y) V4(O(t4, float2(x, y))) +#define l1(x, y) V4(O(t5, float2(x, y))) +#define l2(x, y) V4(O(t6, float2(x, y))) +#define l3(x, y) V4(O(t7, float2(x, y))) + +V4 f0(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(8.550e-02, 1.482e-01, -6.323e-02, 3.364e-03, 2.080e-02, 2.463e-02, -8.141e-02, 5.245e-02, 8.640e-03, -1.637e-01, -3.179e-01, -5.465e-02, -2.549e-02, 3.515e-02, -4.925e-02, -1.317e-01)); + r += mul(s0_1, M4(1.858e-02, 9.248e-02, -8.656e-02, 5.550e-02, 1.817e-02, 8.032e-02, -5.676e-02, 5.070e-02, -1.802e-02, -7.254e-02, -2.202e-02, -1.170e-01, 9.502e-02, -2.105e-01, 2.068e-01, 2.038e-02)); + r += mul(s0_2, M4(7.407e-03, -1.247e-02, -1.068e-02, 6.370e-02, -3.783e-02, -3.181e-02, -8.697e-03, 6.734e-02, 5.835e-02, 3.542e-02, -7.918e-02, -2.409e-02, -6.659e-02, -9.377e-03, -8.609e-02, -1.181e-02)); + r += mul(s0_3, M4(-7.379e-02, -2.101e-01, 2.361e-02, 5.116e-03, -9.090e-02, -2.460e-02, -8.051e-03, 2.844e-03, -2.771e-01, 1.732e-01, 1.808e-01, 1.874e-02, -2.907e-02, -1.239e-01, 2.501e-01, -1.563e-01)); + r += mul(s0_4, M4(-4.727e-02, -3.771e-01, -4.637e-02, 2.019e-01, 1.333e-02, -9.634e-02, 6.812e-02, 1.205e-01, 1.588e-01, -7.420e-02, -1.483e-01, -9.922e-02, 2.153e-01, -5.827e-02, 1.769e-01, -3.377e-01)); + r += mul(s0_5, M4(-7.824e-02, 1.683e-01, 7.693e-02, 4.683e-02, 2.437e-02, 8.481e-02, -1.120e-01, -2.411e-02, -8.791e-02, 9.666e-02, -1.889e-02, -5.651e-02, 3.954e-02, 1.329e-01, -1.240e-01, -4.657e-02)); + r += mul(s0_6, M4(-3.418e-02, 1.678e-01, -1.421e-01, 2.776e-02, 9.744e-02, -2.309e-01, 1.045e-01, 8.956e-03, 4.882e-02, 9.200e-02, 1.934e-02, -1.460e-01, -1.651e-02, 1.741e-02, -5.017e-02, -8.097e-02)); + r += mul(s0_7, M4(7.096e-02, -1.308e-02, 1.686e-01, 1.322e-01, 3.749e-02, 3.528e-03, -1.659e-01, -1.403e-02, -3.273e-02, -6.009e-02, 2.140e-01, -1.632e-01, 7.239e-02, -1.206e-01, -1.586e-01, -3.078e-01)); + r += mul(s0_8, M4(1.512e-03, -7.403e-02, 2.947e-02, -4.233e-02, 1.530e-02, -9.816e-02, -2.201e-02, 7.873e-02, 3.993e-02, -5.018e-02, -1.193e-01, -8.346e-02, 1.808e-02, 4.632e-02, -1.430e-01, -6.569e-02)); + r += mul(s1_0, M4(3.089e-02, -1.530e-01, -5.461e-02, -1.197e-01, -4.821e-02, -1.186e-02, -2.666e-02, -7.656e-02, 7.529e-02, -8.186e-02, -4.492e-02, 9.174e-02, 2.188e-03, -1.622e-02, 1.487e-02, 9.233e-03)); + r += mul(s1_1, M4(-7.001e-02, 7.108e-02, -7.005e-02, 4.512e-02, -6.238e-02, 2.113e-01, -2.022e-02, -6.211e-02, -8.457e-02, -7.076e-02, 1.031e-01, 7.805e-02, -8.044e-02, 3.066e-02, -9.706e-02, 6.739e-02)); + r += mul(s1_2, M4(2.233e-03, 5.735e-02, -1.050e-01, 3.267e-05, 2.600e-02, -1.462e-01, 1.228e-01, 4.476e-02, -5.821e-02, 1.009e-02, -4.157e-02, 5.004e-02, 1.489e-03, -5.188e-02, -1.130e-01, 7.655e-03)); + r += mul(s1_3, M4(1.187e-01, -1.361e-01, -3.887e-02, -1.879e-01, -1.532e-01, 1.675e-01, 9.292e-02, 1.058e-01, -1.031e-01, 1.873e-01, -1.012e-01, -6.570e-03, -1.088e-01, 6.697e-02, -2.098e-01, -2.466e-02)); + r += mul(s1_4, M4(-3.238e-02, 2.032e-01, -2.280e-01, -8.513e-02, -7.811e-02, 1.825e-01, 8.879e-02, 5.777e-02, 6.934e-02, 1.430e-01, -1.761e-01, -4.238e-02, -9.137e-02, 2.031e-01, -6.119e-02, -2.051e-01)); + r += mul(s1_5, M4(-1.427e-01, 1.108e-01, 7.984e-02, 1.138e-01, -6.363e-02, 2.572e-01, -9.833e-02, 4.010e-03, 1.009e-02, -5.946e-02, -2.506e-02, 1.648e-02, -1.293e-02, 3.644e-02, -3.313e-02, -6.616e-02)); + r += mul(s1_6, M4(5.543e-02, -2.084e-01, 1.536e-01, 1.478e-02, 5.205e-02, 1.060e-01, 2.033e-01, 8.088e-02, 1.063e-03, 1.169e-02, 8.632e-02, 7.281e-03, 5.383e-02, 1.271e-02, 1.117e-01, 9.029e-02)); + r += mul(s1_7, M4(-1.349e-02, -7.237e-02, 2.589e-01, 5.118e-03, -6.311e-02, 1.450e-02, -6.996e-02, -1.008e-01, -3.551e-02, -5.876e-02, 3.745e-02, -4.988e-02, 8.911e-02, -1.860e-01, 3.110e-01, -1.417e-01)); + r += mul(s1_8, M4(1.646e-01, -1.234e-01, 1.665e-01, -9.602e-02, -6.306e-02, 1.731e-01, 8.883e-03, -2.104e-02, -3.799e-02, 2.678e-02, 3.067e-02, -4.282e-02, 3.751e-02, 1.611e-02, -3.500e-02, -3.051e-02)); + r += mul(s2_0, M4(5.755e-02, -9.998e-03, 1.024e-01, 2.299e-02, 1.365e-01, -9.806e-02, 9.162e-02, -1.494e-01, 8.121e-02, -1.116e-01, -5.291e-02, -1.021e-01, -2.382e-03, -8.515e-02, -1.747e-01, -1.377e-01)); + r += mul(s2_1, M4(-7.788e-02, 6.038e-02, 9.375e-02, -1.776e-02, 5.052e-03, -3.421e-02, -3.974e-02, -3.626e-02, 1.030e-01, 9.294e-03, -9.927e-02, 6.549e-02, 1.685e-02, -1.361e-01, 4.110e-04, 2.135e-01)); + r += mul(s2_2, M4(2.658e-02, 7.140e-02, -5.212e-02, -6.860e-02, 4.382e-02, 4.198e-02, 3.386e-02, 1.893e-02, 4.225e-03, 1.905e-02, -6.424e-03, -7.844e-02, 6.918e-02, 1.072e-01, -1.525e-01, 9.003e-02)); + r += mul(s2_3, M4(9.057e-02, -1.498e-01, 4.421e-02, -1.056e-01, -8.476e-02, 1.583e-01, -1.531e-02, -1.883e-01, 5.109e-02, -2.248e-01, -9.583e-02, 4.146e-02, 3.877e-02, -6.171e-02, -1.498e-01, 7.983e-02)); + r += mul(s2_4, M4(9.063e-02, -1.617e-01, -1.447e-01, -9.241e-02, 3.600e-02, 5.373e-03, -1.078e-01, -1.163e-01, 6.829e-02, -5.413e-02, 8.948e-02, -1.109e-01, 5.275e-02, -3.897e-01, 1.237e-01, 9.982e-02)); + r += mul(s2_5, M4(4.084e-02, 4.763e-03, -3.784e-02, -4.274e-02, -5.362e-03, -1.529e-02, 7.842e-03, 5.604e-04, 7.714e-02, -1.559e-01, 7.681e-02, -7.394e-02, -8.979e-02, 2.113e-01, 2.168e-01, 4.097e-02)); + r += mul(s2_6, M4(-8.091e-02, -1.115e-01, 2.361e-01, -1.733e-01, 7.247e-03, -1.287e-01, 1.563e-01, -8.712e-02, -3.140e-03, 9.098e-02, -1.299e-01, 6.030e-03, 4.423e-02, -7.119e-02, -2.863e-01, 6.274e-02)); + r += mul(s2_7, M4(6.526e-02, -7.356e-02, -2.948e-02, -9.011e-02, 1.460e-02, -6.172e-02, 3.199e-03, 2.079e-02, -5.142e-02, 8.263e-02, 7.087e-02, -1.835e-02, 1.853e-02, 4.476e-02, 5.705e-02, 8.962e-02)); + r += mul(s2_8, M4(2.256e-02, -3.066e-02, -1.381e-01, -8.295e-02, -2.385e-02, -5.564e-02, -1.301e-01, -1.046e-01, 5.761e-02, -5.741e-02, 8.829e-02, -1.901e-02, 7.150e-02, -4.324e-02, -4.973e-02, 1.143e-01)); + r += mul(s3_0, M4(3.401e-04, -5.849e-04, 6.542e-02, -1.244e-02, -9.909e-02, 1.931e-01, -7.912e-02, 4.238e-02, 1.492e-02, -2.218e-03, 1.655e-01, -2.451e-02, -3.112e-02, 3.901e-02, 1.196e-01, -4.961e-02)); + r += mul(s3_1, M4(1.788e-02, -4.814e-02, -7.687e-02, -1.610e-02, -1.226e-01, 3.760e-01, 1.033e-02, 1.085e-01, -1.322e-01, 6.261e-02, 1.646e-01, 1.469e-01, 5.817e-02, -8.755e-02, 2.057e-01, 1.778e-02)); + r += mul(s3_2, M4(5.219e-02, 1.550e-01, 4.151e-02, -9.940e-02, -1.919e-02, -4.969e-02, 6.124e-02, 3.869e-02, -1.602e-01, 2.288e-01, -7.836e-03, -2.868e-02, -8.724e-02, -5.142e-02, 1.497e-01, 6.299e-03)); + r += mul(s3_3, M4(1.154e-01, -2.413e-01, -1.159e-01, 3.445e-02, -3.170e-02, -3.682e-02, 4.749e-02, -2.001e-01, -3.168e-02, 2.549e-01, -3.563e-01, 8.866e-02, -4.008e-02, 8.638e-02, 1.173e-01, -1.110e-03)); + r += mul(s3_4, M4(-2.685e-01, 3.041e-02, -2.903e-01, -4.052e-02, -2.745e-01, 5.754e-01, -3.479e-02, 1.664e-01, -6.268e-02, 5.738e-02, 2.118e-01, -1.481e-01, -1.829e-01, 1.945e-01, -4.317e-02, -2.469e-02)); + r += mul(s3_5, M4(6.148e-02, -1.607e-01, -3.468e-03, 8.311e-03, -4.307e-02, 1.277e-01, 1.087e-01, -1.532e-02, 2.988e-02, -8.367e-02, 4.991e-02, -5.328e-02, -4.701e-02, 6.573e-02, -2.594e-02, -8.493e-02)); + r += mul(s3_6, M4(-1.161e-02, 7.270e-02, 1.249e-01, -8.621e-02, 8.553e-02, 2.959e-01, 3.113e-01, 2.873e-03, -1.351e-01, -2.965e-02, -7.862e-02, -5.562e-02, -1.062e-02, 9.243e-02, -5.759e-02, 1.790e-02)); + r += mul(s3_7, M4(2.188e-01, -5.976e-02, -7.703e-02, 1.416e-02, 1.885e-02, -2.569e-01, 1.704e-01, 1.260e-01, -1.121e-01, 6.791e-02, 1.233e-01, -4.520e-02, -1.194e-01, 1.583e-01, 1.293e-02, 1.602e-02)); + r += mul(s3_8, M4(-3.095e-03, -2.183e-02, 9.775e-02, 1.380e-02, -4.415e-02, 1.140e-01, -1.133e-01, 4.689e-02, -4.382e-02, -5.442e-02, 2.616e-02, -7.310e-03, 5.992e-02, -5.769e-02, 8.517e-03, 5.975e-02)); + r += mul(s4_0, M4(-2.874e-02, -3.209e-02, 7.440e-02, -5.051e-02, 3.173e-02, -4.283e-03, 2.989e-02, -8.500e-02, -2.492e-01, 1.640e-01, 2.135e-03, 1.260e-01, 2.995e-02, -4.737e-02, -7.130e-03, -8.467e-03)); + r += mul(s4_1, M4(-5.790e-02, 1.738e-02, -8.117e-02, -1.148e-01, 8.217e-02, -3.495e-02, 4.301e-02, 3.421e-02, -3.894e-02, 9.015e-03, -6.426e-02, 7.283e-02, 2.620e-02, -8.512e-02, -7.089e-02, -7.352e-02)); + r += mul(s4_2, M4(-2.312e-02, 3.598e-02, 1.935e-02, 2.357e-02, 2.581e-02, -1.139e-01, 2.659e-02, 3.450e-02, -1.109e-02, -1.854e-02, -7.685e-02, -2.472e-02, 8.593e-02, 1.155e-02, -7.321e-03, 6.701e-02)); + r += mul(s4_3, M4(7.399e-02, -5.969e-02, 1.448e-01, -1.209e-01, 4.066e-02, 2.562e-02, 1.040e-01, -1.381e-02, -7.872e-01, 4.618e-01, 2.801e-02, 1.128e-01, -1.565e-02, 6.946e-02, -5.437e-02, -2.053e-02)); + r += mul(s4_4, M4(2.776e-01, -2.267e-01, 2.452e-01, 3.041e-01, 1.735e-03, -6.368e-02, -2.212e-02, 1.169e-01, -6.648e-02, 4.323e-01, -1.261e-01, 2.998e-02, -1.491e-01, -6.740e-02, 4.344e-02, -2.343e-01)); + r += mul(s4_5, M4(-1.965e-02, 4.745e-02, 3.125e-02, 1.700e-02, -4.554e-02, 2.626e-01, 1.867e-02, 6.873e-02, -5.527e-03, 4.543e-02, 1.086e-01, -2.145e-03, 8.956e-03, -2.003e-02, -4.228e-02, -8.769e-02)); + r += mul(s4_6, M4(-3.365e-02, 1.210e-01, -6.053e-02, -1.365e-01, -7.537e-02, 4.398e-02, -2.364e-02, -5.594e-02, -1.008e-01, -1.719e-01, 1.680e-01, 9.306e-02, 2.551e-02, 9.705e-02, -1.017e-01, 1.386e-01)); + r += mul(s4_7, M4(-2.247e-01, -5.840e-02, -1.633e-01, 1.787e-01, -1.938e-02, 6.637e-02, -9.436e-02, -5.768e-02, -2.798e-02, 7.276e-03, 1.510e-01, 2.070e-02, 8.682e-03, -8.152e-02, 1.585e-01, -1.970e-01)); + r += mul(s4_8, M4(2.726e-02, 1.013e-01, -9.009e-02, 2.377e-02, 4.192e-02, -5.158e-03, 1.333e-01, 5.335e-02, 5.155e-02, 7.597e-03, 1.612e-01, 4.137e-02, 2.126e-02, 2.504e-02, 4.211e-02, 2.331e-02)); + r += mul(s5_0, M4(7.914e-03, 5.196e-02, 1.528e-01, -1.733e-01, -4.303e-02, -8.394e-02, -6.856e-02, -1.815e-03, 1.145e-01, -6.718e-02, 2.572e-01, -7.499e-02, 5.476e-02, 5.707e-02, -3.430e-02, -2.263e-02)); + r += mul(s5_1, M4(2.027e-01, -9.534e-02, -4.479e-02, -2.295e-01, -1.571e-04, 1.039e-01, -1.418e-02, -9.583e-03, 1.155e-01, -1.823e-01, 7.095e-02, -8.661e-02, -8.197e-02, -5.617e-02, -2.881e-01, 1.652e-02)); + r += mul(s5_2, M4(7.570e-02, -5.338e-03, -1.236e-02, -8.058e-02, 1.990e-02, -5.564e-02, -1.548e-01, 9.153e-02, -4.377e-02, 3.944e-02, -3.167e-03, -5.789e-03, 2.200e-02, -7.143e-02, -6.064e-02, 7.612e-02)); + r += mul(s5_3, M4(2.007e-01, -1.894e-01, 1.677e-02, -1.159e-01, 3.995e-02, -1.170e-01, 2.050e-01, 1.138e-02, 1.128e-02, 3.693e-02, 2.784e-01, -2.002e-01, -4.578e-04, -1.568e-01, 3.455e-02, 1.001e-02)); + r += mul(s5_4, M4(-1.635e-01, -1.109e-02, 6.541e-02, -3.544e-01, 7.378e-02, 1.112e-01, -5.674e-02, 1.863e-01, 7.911e-01, -2.734e-01, -1.205e-01, 1.684e-01, -1.814e-01, 1.269e-01, 1.220e-01, 7.336e-03)); + r += mul(s5_5, M4(-4.375e-02, 8.044e-02, 1.655e-01, -2.669e-01, 7.938e-02, 8.039e-02, -2.610e-02, 1.606e-01, 4.477e-02, -1.701e-03, 7.304e-03, -4.718e-02, 2.108e-02, 2.270e-01, 2.392e-01, 4.445e-02)); + r += mul(s5_6, M4(4.577e-02, -6.396e-03, -9.791e-02, -1.781e-01, -2.233e-02, 1.123e-01, 6.753e-02, -1.246e-01, -6.603e-03, 9.639e-03, 3.877e-02, -3.097e-02, -3.699e-02, -8.160e-02, -1.579e-01, -4.564e-02)); + r += mul(s5_7, M4(-1.952e-01, 3.921e-04, 2.565e-01, -4.736e-01, -9.141e-02, 3.384e-02, -3.370e-01, -1.511e-02, 1.161e-01, -3.249e-02, -2.568e-01, -2.537e-02, -1.069e-01, -3.597e-02, -4.000e-02, 2.052e-01)); + r += mul(s5_8, M4(2.847e-02, -7.864e-02, -1.253e-02, -2.447e-01, -9.473e-02, 1.263e-01, -6.200e-02, 3.020e-02, 2.729e-02, 3.150e-02, 4.010e-02, -2.741e-02, 8.655e-02, 1.347e-02, 1.495e-01, -6.498e-04)); + r += mul(s6_0, M4(7.169e-02, -6.749e-02, 9.479e-02, 3.264e-03, 1.453e-02, -5.768e-02, -7.251e-02, -1.236e-01, 3.857e-03, -2.619e-02, -2.213e-02, -3.012e-03, -6.991e-02, 3.919e-02, -8.657e-03, -3.474e-02)); + r += mul(s6_1, M4(3.885e-02, 2.170e-02, 6.984e-02, 6.616e-02, 7.536e-02, 1.188e-01, -1.020e-01, 1.248e-02, -6.022e-02, 6.860e-02, 2.724e-02, -1.921e-02, -7.704e-02, 2.208e-02, 1.482e-01, 1.781e-01)); + r += mul(s6_2, M4(-5.202e-02, -7.019e-02, 2.054e-02, -5.957e-02, 2.252e-02, -9.743e-02, 6.670e-02, 4.199e-02, 3.750e-02, -1.800e-02, 2.483e-02, 8.751e-02, 6.627e-02, 1.258e-01, -4.092e-02, 4.300e-02)); + r += mul(s6_3, M4(2.245e-02, -1.616e-02, 3.853e-02, -1.251e-01, 1.342e-01, -2.051e-01, 3.328e-01, -2.076e-02, -1.401e-01, -3.579e-02, -1.392e-01, -1.270e-01, 1.674e-02, 3.339e-02, 2.546e-01, 1.754e-01)); + r += mul(s6_4, M4(-1.724e-01, 2.212e-01, 1.627e-01, -1.674e-01, 9.932e-03, 1.412e-01, 2.723e-01, 7.141e-02, -7.426e-01, 1.770e-01, 2.432e-01, -6.203e-02, 2.387e-01, -9.877e-02, -4.044e-02, 3.033e-01)); + r += mul(s6_5, M4(1.734e-01, -8.957e-03, 1.074e-01, 1.615e-02, 2.509e-03, -3.180e-02, 1.738e-02, 1.614e-03, -2.015e-01, -5.618e-03, -1.549e-02, -6.552e-02, -1.216e-01, -9.633e-02, -1.392e-01, 6.371e-03)); + r += mul(s6_6, M4(9.966e-03, -5.015e-02, 1.106e-03, 2.051e-02, -3.092e-02, 8.487e-02, -8.627e-02, 3.511e-02, -4.166e-02, -4.374e-02, -8.720e-02, -2.525e-02, 5.230e-02, -3.937e-02, -3.387e-02, 3.305e-02)); + r += mul(s6_7, M4(7.256e-02, 8.201e-02, 1.425e-01, 3.578e-02, 4.288e-02, 2.544e-01, -7.146e-02, 1.259e-01, -5.159e-02, 5.622e-02, 8.943e-02, -1.483e-02, -1.130e-01, 1.102e-02, 5.953e-02, 2.999e-02)); + r += mul(s6_8, M4(-1.649e-02, -6.988e-02, 1.654e-01, 8.961e-02, -5.890e-02, -7.814e-02, -3.838e-02, 5.917e-02, -2.741e-03, 1.389e-01, -7.250e-02, 2.338e-02, -3.435e-02, -1.182e-01, -1.089e-02, -8.475e-02)); + r += mul(s7_0, M4(1.302e-01, -2.233e-02, -1.353e-01, -9.712e-02, -8.077e-02, -1.417e-01, -6.761e-02, -1.097e-01, -1.623e-02, 2.213e-02, -2.955e-03, 2.299e-02, -2.731e-02, -6.499e-02, 8.680e-02, -2.647e-01)); + r += mul(s7_1, M4(1.919e-01, 2.093e-01, -3.153e-01, -1.151e-01, 3.468e-02, 7.060e-02, -2.447e-01, 7.122e-02, 8.064e-03, 8.447e-02, 9.937e-02, -6.254e-02, -1.451e-01, -4.861e-02, 2.636e-01, 9.170e-02)); + r += mul(s7_2, M4(1.963e-02, -4.898e-02, -5.656e-01, -1.833e-02, 1.456e-02, -2.585e-02, 3.618e-02, -1.040e-01, 8.570e-03, -4.964e-03, -2.392e-02, 5.105e-02, 9.810e-02, 1.419e-01, -1.011e-02, -6.824e-02)); + r += mul(s7_3, M4(-2.838e-02, -3.018e-01, -1.827e-01, -2.484e-02, -2.072e-01, 1.908e-01, -1.321e-01, 2.737e-02, 3.042e-02, -1.350e-01, 5.893e-02, -1.916e-02, 1.234e-01, 1.333e-01, -1.184e-01, 1.806e-01)); + r += mul(s7_4, M4(1.446e-01, 5.919e-01, -2.780e-01, -9.927e-02, -8.727e-02, 2.295e-01, 8.388e-02, 5.303e-02, 2.302e-01, -2.994e-01, 1.563e-01, -9.238e-02, -2.779e-01, 7.911e-01, -9.902e-01, 1.192e+00)); + r += mul(s7_5, M4(-1.373e-02, -1.054e-02, -3.860e-01, -7.999e-02, 1.305e-01, -4.235e-02, -1.591e-01, 7.167e-02, -7.756e-02, -1.028e-02, -8.130e-02, -7.158e-02, -1.240e-02, -9.955e-02, -2.537e-01, 1.257e-02)); + r += mul(s7_6, M4(2.098e-02, -1.965e-01, -2.843e-04, 9.224e-02, -4.041e-02, -6.028e-02, -1.702e-02, 1.063e-01, 5.851e-02, -6.682e-03, 1.789e-01, -9.654e-02, 8.077e-02, -2.780e-01, -2.409e-01, -2.038e-01)); + r += mul(s7_7, M4(9.059e-02, 2.376e-02, -2.666e-01, 1.010e-01, -2.099e-02, 1.413e-01, -1.796e-01, 1.615e-01, 3.644e-01, -6.318e-01, -2.343e-01, -2.385e-02, 2.060e-01, -1.687e-01, -8.451e-03, -9.400e-02)); + r += mul(s7_8, M4(1.305e-02, 2.460e-02, -7.354e-02, 8.471e-02, -9.206e-02, -3.224e-02, -4.200e-02, 1.797e-02, 3.352e-02, -4.818e-02, 6.038e-02, 7.224e-03, 2.233e-02, 8.301e-02, -1.024e-01, -1.395e-01)); + r += V4(5.086e-03, 1.201e-02, -1.446e-02, -1.059e-01); + return r; +} + +V4 f1(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-1.149e-01, 8.911e-02, 2.520e-01, -2.292e-03, 5.639e-02, -4.318e-02, 1.845e-02, -7.860e-02, 6.697e-03, -1.714e-01, -3.535e-02, -2.981e-01, 5.744e-02, 8.686e-02, 1.889e-02, 2.883e-02)); + r += mul(s0_1, M4(-4.305e-02, 1.415e-01, 5.839e-03, -1.340e-01, 4.330e-02, -7.875e-02, -1.012e-01, 3.681e-02, -4.121e-01, -4.761e-03, -1.401e-01, -1.585e-01, -2.174e-01, 2.217e-02, 2.682e-01, 6.936e-02)); + r += mul(s0_2, M4(6.654e-02, 3.023e-02, -1.800e-01, 1.687e-01, 2.321e-02, 7.973e-03, -2.736e-02, -1.150e-01, -5.164e-02, 2.459e-01, 8.378e-02, 7.680e-02, 1.271e-01, -4.691e-02, 1.622e-02, -2.721e-02)); + r += mul(s0_3, M4(5.899e-02, -9.233e-02, -1.391e-01, -7.216e-02, -7.611e-02, 8.228e-02, 2.076e-01, 3.763e-02, -5.480e-01, 8.615e-02, 3.822e-01, -2.952e-02, -2.619e-01, -5.971e-02, -9.140e-02, 2.824e-01)); + r += mul(s0_4, M4(-1.667e-01, -2.103e-01, -1.571e-01, -5.567e-02, 1.152e-02, 5.381e-03, -7.040e-02, -3.720e-02, -5.531e-01, 5.504e-02, -5.912e-02, -8.021e-02, 1.411e-01, 8.420e-02, 2.038e-01, 1.034e-01)); + r += mul(s0_5, M4(2.704e-01, 8.585e-02, -5.662e-02, 4.992e-02, -6.336e-02, 3.235e-01, 2.407e-01, -1.285e-02, -1.531e-01, 2.347e-01, 4.188e-02, -7.345e-03, 6.674e-02, 3.855e-03, 7.364e-02, -1.997e-01)); + r += mul(s0_6, M4(-1.012e-01, -5.227e-03, 1.766e-01, -9.700e-02, 5.514e-02, -4.035e-02, 7.468e-02, -4.129e-02, -5.134e-01, -1.258e-01, 4.091e-01, 5.850e-02, -8.517e-03, -2.508e-01, -3.440e-01, -8.356e-02)); + r += mul(s0_7, M4(-2.280e-02, 6.713e-02, 9.325e-02, 4.812e-02, 2.527e-01, -3.502e-02, 1.417e-01, -2.768e-01, -2.534e-01, 3.620e-01, -1.574e-01, 2.076e-02, 2.430e-01, -2.213e-01, 1.102e-01, -1.316e-01)); + r += mul(s0_8, M4(1.387e-01, -5.009e-03, -5.013e-02, -3.373e-02, -1.025e-01, -1.323e-01, 6.666e-02, -8.504e-02, 1.629e-01, -1.330e-01, -1.634e-01, -2.773e-01, 7.168e-02, 4.939e-03, -6.583e-02, -1.095e-01)); + r += mul(s1_0, M4(1.867e-01, 1.141e-01, 1.059e-01, 5.602e-03, 3.579e-03, 2.358e-02, -1.528e-01, 2.542e-02, 1.274e-01, -4.719e-02, 5.717e-02, -7.865e-02, 3.376e-02, -1.231e-01, -6.044e-02, 3.892e-02)); + r += mul(s1_1, M4(9.617e-02, -7.401e-02, -5.730e-02, -3.455e-01, 6.837e-02, 2.837e-02, -1.304e-01, -8.394e-02, 1.283e-01, -6.171e-02, 3.258e-02, 1.780e-02, -1.206e-01, -1.125e-01, 8.222e-04, -3.074e-02)); + r += mul(s1_2, M4(-1.065e-01, -1.395e-01, -2.066e-01, 1.635e-02, -2.101e-01, -5.436e-03, 8.472e-02, 4.570e-02, 5.396e-02, 1.469e-02, 1.089e-03, -1.631e-02, -3.540e-02, -1.250e-01, -1.126e-01, -1.950e-02)); + r += mul(s1_3, M4(2.203e-01, -2.307e-03, 5.877e-02, -1.447e-02, -1.733e-01, 5.954e-02, -6.173e-03, -1.295e-02, 1.613e-01, 1.474e-01, 1.018e-01, -3.808e-03, -4.718e-02, -6.116e-02, -3.219e-02, 8.776e-04)); + r += mul(s1_4, M4(-9.098e-02, -2.021e-01, 1.750e-01, 3.967e-02, -2.998e-01, 1.723e-01, -3.029e-01, -3.594e-02, 2.998e-02, -8.915e-03, 2.087e-01, -8.583e-02, -9.560e-02, -7.081e-02, 9.754e-02, 1.962e-01)); + r += mul(s1_5, M4(-8.326e-02, 6.852e-03, -1.690e-01, 9.679e-02, -1.238e-01, -4.300e-02, -3.576e-02, 2.092e-01, -1.946e-01, 8.110e-03, 6.578e-02, -6.703e-03, 1.955e-01, 1.397e-01, 1.084e-01, -7.745e-02)); + r += mul(s1_6, M4(2.939e-01, 1.634e-01, -1.056e-01, 6.142e-02, -2.635e-02, -2.484e-02, -3.410e-01, 1.010e-01, 2.867e-02, -2.709e-02, -3.079e-03, 1.117e-01, -2.867e-02, 1.411e-01, -1.167e-01, 6.789e-02)); + r += mul(s1_7, M4(-3.754e-02, 1.528e-01, -4.843e-02, 1.548e-01, -8.606e-02, 1.717e-01, -3.897e-01, 1.396e-01, 9.584e-03, 1.372e-01, -1.273e-01, 2.555e-02, 3.264e-02, 1.434e-01, -2.085e-02, 1.285e-01)); + r += mul(s1_8, M4(-2.823e-01, 4.009e-02, -8.112e-03, -7.967e-02, 5.913e-02, -3.484e-02, -1.382e-01, 1.537e-01, -3.762e-02, -5.813e-02, 5.067e-02, 4.077e-02, -7.708e-02, 1.750e-01, -8.353e-02, -6.431e-02)); + r += mul(s2_0, M4(-4.761e-02, -3.946e-02, -1.049e-01, 1.499e-02, 6.860e-02, 8.789e-02, 4.937e-02, 1.417e-02, 1.655e-02, -1.264e-01, -4.095e-02, -5.697e-02, 2.133e-02, 4.595e-02, -8.380e-02, -3.804e-02)); + r += mul(s2_1, M4(-7.046e-04, 1.721e-01, 2.778e-01, -8.966e-02, -5.113e-02, 2.596e-02, 1.490e-01, -9.792e-02, -7.188e-02, -2.215e-02, -6.325e-02, -6.428e-02, 5.408e-02, -2.526e-01, 2.887e-01, -3.238e-02)); + r += mul(s2_2, M4(2.108e-02, -9.977e-02, -5.268e-02, 9.567e-02, -4.931e-03, 7.264e-03, -4.562e-02, -1.025e-02, 6.414e-02, -3.967e-02, 7.990e-03, 3.237e-03, -6.207e-02, -1.327e-02, -3.273e-01, -4.403e-02)); + r += mul(s2_3, M4(4.363e-02, 7.571e-02, 1.539e-02, 1.079e-02, 1.036e-02, -3.000e-02, -1.272e-01, -3.467e-02, 4.469e-02, 1.152e-01, 2.394e-01, -9.794e-02, -6.073e-02, 1.029e-01, 5.621e-02, -1.406e-01)); + r += mul(s2_4, M4(-3.829e-01, -8.430e-02, 3.327e-01, -4.212e-02, 5.647e-02, 5.437e-02, 6.288e-02, 1.051e-01, 6.112e-02, 1.456e-02, 6.431e-02, -7.205e-02, -2.087e-01, 4.363e-01, 1.342e-01, -2.842e-01)); + r += mul(s2_5, M4(2.446e-01, 3.877e-02, 1.068e-01, 3.048e-02, 5.673e-02, 5.352e-02, 1.736e-01, 1.529e-02, -7.917e-03, -8.124e-03, -8.913e-02, -3.513e-02, 4.064e-02, 2.757e-01, -2.200e-01, -7.200e-02)); + r += mul(s2_6, M4(1.532e-01, -6.366e-02, -3.245e-01, 1.011e-01, 7.095e-02, -5.889e-02, -7.494e-02, 2.072e-02, -2.135e-02, 2.221e-03, -5.211e-03, -5.587e-02, -4.618e-02, -3.320e-02, 2.060e-01, -1.612e-01)); + r += mul(s2_7, M4(1.381e-01, -1.927e-01, -2.183e-01, 3.981e-02, 1.200e-02, 2.706e-02, -1.832e-01, 3.230e-02, -1.780e-01, 2.596e-02, -2.166e-03, -5.568e-04, 5.992e-02, -7.717e-02, 4.973e-01, -1.275e-01)); + r += mul(s2_8, M4(-1.990e-02, 8.939e-02, 2.998e-02, -3.216e-02, -8.370e-02, -2.356e-02, -9.606e-02, -6.189e-02, -1.653e-02, 3.231e-02, -5.651e-02, -3.294e-02, -1.618e-02, 1.377e-01, 1.816e-01, -9.103e-02)); + r += mul(s3_0, M4(-2.448e-02, 1.816e-02, -6.946e-02, -5.889e-02, 3.135e-02, 3.722e-04, -3.753e-02, -5.770e-02, 1.193e-01, -8.895e-02, -2.573e-01, 1.528e-02, -5.268e-04, 6.228e-02, -4.613e-02, 8.812e-02)); + r += mul(s3_1, M4(1.488e-01, -1.580e-01, -1.913e-02, -1.196e-01, -8.225e-02, -1.431e-01, -6.842e-02, -4.574e-02, 3.027e-02, 1.272e-01, 9.118e-02, -5.961e-02, 3.162e-02, 2.013e-01, 2.842e-01, 1.782e-01)); + r += mul(s3_2, M4(-1.842e-01, -1.236e-01, 4.733e-03, 4.541e-02, -2.843e-01, 1.886e-02, -5.482e-02, 1.554e-02, -3.282e-04, 1.603e-01, 2.066e-01, 8.032e-02, -1.252e-01, 9.479e-02, 6.652e-02, -3.031e-02)); + r += mul(s3_3, M4(1.332e-01, 6.801e-02, 8.690e-02, -1.644e-01, -1.712e-01, 1.379e-03, 5.773e-02, 1.829e-01, -1.392e-01, -3.067e-02, -1.159e-01, -2.234e-01, 6.363e-02, 2.278e-02, -8.508e-02, 1.793e-01)); + r += mul(s3_4, M4(-1.939e-01, -2.012e-01, -2.093e-02, -2.581e-01, 6.079e-02, 2.150e-01, -1.328e-01, 2.465e-01, -1.639e-01, -1.367e-01, 5.548e-02, -6.148e-02, -8.833e-02, -2.174e-01, -1.782e-01, 6.176e-02)); + r += mul(s3_5, M4(1.715e-01, -4.351e-02, -5.803e-02, -3.304e-02, 2.949e-01, -8.398e-02, -6.903e-02, 3.449e-01, -3.465e-01, -6.238e-02, 6.393e-03, 5.881e-02, 8.145e-02, 3.321e-02, 3.255e-01, 9.732e-02)); + r += mul(s3_6, M4(-9.109e-02, 2.088e-02, -2.294e-02, -2.026e-02, 3.452e-02, -1.362e-01, -2.975e-01, 1.434e-01, 2.172e-02, 4.001e-02, 4.512e-02, 9.264e-02, -1.299e-03, -1.395e-02, 5.402e-02, 3.233e-02)); + r += mul(s3_7, M4(5.424e-02, 1.469e-03, 1.920e-01, 7.914e-02, 8.262e-02, 2.975e-01, 1.553e-01, 1.052e-01, 7.508e-02, -9.778e-02, 1.060e-02, 9.677e-02, 1.410e-01, -1.261e-01, -1.352e-01, 4.144e-02)); + r += mul(s3_8, M4(-7.174e-02, 1.715e-01, 5.468e-02, -6.194e-02, 3.492e-01, -1.378e-01, -1.953e-01, 1.411e-01, 1.519e-01, -8.186e-02, 6.761e-02, 2.683e-02, -5.830e-02, -4.595e-02, -5.331e-02, -8.498e-02)); + r += mul(s4_0, M4(-5.072e-02, -3.540e-03, 8.559e-02, 1.311e-01, -1.522e-02, -9.324e-02, -1.275e-01, 4.831e-02, -4.644e-02, -1.001e-01, -1.506e-01, -1.311e-01, 1.272e-02, -7.014e-02, 2.022e-02, 6.296e-02)); + r += mul(s4_1, M4(-2.854e-02, 1.655e-01, 8.404e-02, -5.780e-02, 3.009e-02, -6.629e-02, -5.704e-02, -6.469e-02, 5.247e-02, -1.604e-01, -9.047e-02, -2.845e-01, 9.670e-02, -1.796e-01, -1.380e-01, -3.574e-03)); + r += mul(s4_2, M4(-2.697e-03, -4.975e-03, -7.660e-03, 7.743e-02, 3.247e-02, -1.067e-01, -1.018e-01, -1.520e-01, -8.117e-02, -2.336e-02, -1.463e-02, 5.555e-02, 4.583e-03, 1.768e-01, 4.816e-02, -3.692e-02)); + r += mul(s4_3, M4(1.620e-01, 8.388e-02, -1.169e-01, -3.581e-02, -4.106e-02, -3.627e-02, 1.430e-01, 5.196e-02, -1.702e-01, -3.480e-02, 4.717e-01, -3.194e-02, -3.970e-03, 2.198e-02, -8.772e-02, 5.059e-02)); + r += mul(s4_4, M4(9.552e-02, 8.912e-02, 1.907e-01, 1.027e-01, -1.978e-02, 7.419e-02, 1.448e-02, 8.088e-02, -1.997e-02, -2.794e-02, -1.128e-01, 2.479e-01, 1.915e-01, 1.131e-01, 1.333e-01, 1.439e-01)); + r += mul(s4_5, M4(-2.261e-02, 1.215e-01, 2.526e-02, -1.030e-01, 2.554e-02, -5.495e-02, -2.359e-01, 7.267e-02, -6.545e-02, 5.010e-02, -1.986e-01, 1.409e-02, 3.694e-02, 2.374e-02, -1.637e-01, -1.430e-01)); + r += mul(s4_6, M4(-9.275e-03, -3.836e-02, -2.318e-01, -1.291e-02, 1.239e-02, 2.026e-02, -6.110e-02, 1.283e-01, -2.133e-02, 1.175e-01, -8.486e-02, 1.390e-01, -5.388e-02, 6.180e-03, 5.454e-02, -4.336e-02)); + r += mul(s4_7, M4(2.686e-03, -2.226e-01, -1.882e-01, -3.096e-02, -1.566e-01, 4.253e-02, 1.095e-01, 6.164e-02, 2.204e-01, 1.283e-01, 1.472e-03, 4.472e-03, -1.886e-02, -7.630e-02, -6.029e-03, 2.414e-02)); + r += mul(s4_8, M4(-1.006e-02, -1.550e-01, 1.131e-01, 8.689e-02, 1.551e-01, 4.256e-02, 1.496e-02, 1.045e-01, -5.234e-02, 6.156e-02, 8.616e-02, -1.477e-02, 7.000e-02, 4.368e-02, -6.712e-02, -8.073e-03)); + r += mul(s5_0, M4(-1.165e-02, 3.834e-02, 1.929e-01, 2.580e-01, 3.527e-02, -3.028e-02, 1.145e-01, -4.400e-02, -3.880e-02, 1.096e-01, 3.407e-02, 9.251e-02, -8.576e-03, -4.400e-02, -5.589e-02, -4.480e-02)); + r += mul(s5_1, M4(-5.521e-02, 1.958e-01, 9.908e-03, -3.048e-02, -1.328e-01, -1.558e-01, -1.928e-01, -3.044e-02, 9.158e-02, 2.361e-01, 1.509e-01, -1.519e-01, -1.864e-01, -2.131e-01, -1.853e-01, -9.660e-02)); + r += mul(s5_2, M4(8.105e-02, 5.143e-02, 8.310e-02, -3.027e-02, 2.522e-02, -3.523e-02, 6.113e-02, -4.142e-02, 5.358e-02, 2.218e-02, -4.899e-02, 6.927e-02, -1.362e-02, -4.119e-02, -4.594e-02, -8.481e-02)); + r += mul(s5_3, M4(1.161e-01, -2.525e-02, -3.580e-01, -1.583e-01, 8.566e-02, 1.360e-01, -2.126e-02, 1.256e-01, 8.959e-02, -2.142e-01, -4.432e-01, -2.091e-02, -1.128e-01, -6.440e-02, -9.157e-02, -7.419e-02)); + r += mul(s5_4, M4(1.432e-01, 9.207e-02, 1.216e-01, 1.868e-01, 4.710e-03, 6.143e-02, 2.036e-02, 2.773e-02, 3.342e-01, -3.121e-02, 1.280e-01, -4.769e-01, -1.556e-01, 1.409e-01, 7.212e-02, 2.450e-01)); + r += mul(s5_5, M4(-4.965e-02, -2.193e-01, 4.564e-02, -1.510e-02, -1.967e-01, 2.075e-01, -7.082e-02, -1.474e-01, -1.644e-01, -1.231e-02, 1.465e-03, -8.072e-02, 5.559e-02, -2.192e-02, -8.904e-02, 8.271e-02)); + r += mul(s5_6, M4(2.420e-02, -7.204e-02, -1.764e-01, -1.620e-01, 3.617e-02, -6.037e-02, -7.868e-02, -4.807e-02, -1.401e-01, -1.517e-02, -7.456e-03, -1.255e-01, -4.744e-02, 7.887e-02, 2.760e-01, -8.194e-02)); + r += mul(s5_7, M4(-1.462e-01, -5.964e-02, -1.076e-01, 1.317e-01, 1.432e-01, -1.444e-01, 1.604e-01, -1.333e-01, 9.255e-02, -3.494e-01, -1.301e-01, -1.314e-01, -1.797e-01, -9.114e-02, 2.844e-01, 8.951e-02)); + r += mul(s5_8, M4(9.544e-02, -2.597e-01, -5.053e-02, 7.503e-02, -3.005e-02, -1.006e-01, -2.448e-02, -5.392e-03, -3.139e-03, 1.526e-02, 6.304e-02, -3.833e-02, 3.146e-01, 2.355e-01, 1.633e-01, 3.961e-02)); + r += mul(s6_0, M4(4.636e-02, 4.262e-02, 3.864e-02, 9.925e-03, 1.837e-01, -1.999e-02, -6.969e-02, 1.142e-01, 2.331e-03, 1.973e-02, -1.066e-02, 3.883e-03, 8.835e-02, 4.475e-02, 7.398e-02, 1.614e-01)); + r += mul(s6_1, M4(-5.366e-03, 9.651e-03, -1.386e-01, 7.966e-02, -5.665e-02, 2.822e-01, 7.414e-02, 9.816e-02, 9.970e-02, -1.057e-01, -1.293e-01, -2.524e-02, -1.975e-01, 8.194e-04, 7.563e-02, 7.114e-02)); + r += mul(s6_2, M4(-9.110e-02, 3.338e-02, 5.020e-02, 3.362e-02, -5.810e-02, 3.438e-02, -3.802e-02, 4.279e-02, 3.974e-02, -9.508e-02, -2.217e-02, -2.416e-02, 4.781e-02, 5.796e-02, -2.198e-02, -7.349e-02)); + r += mul(s6_3, M4(3.351e-02, -1.827e-02, 4.784e-02, 6.976e-03, -1.206e-01, -1.366e-01, -1.192e-01, 6.868e-02, 1.499e-01, 1.403e-02, 3.193e-01, -9.053e-02, 2.399e-02, 5.364e-02, -1.321e-01, 5.013e-02)); + r += mul(s6_4, M4(-1.453e-02, -1.141e-01, -7.246e-02, 1.635e-01, 1.065e-01, 2.452e-02, -3.737e-02, -1.136e-01, -1.491e-01, -3.948e-01, 8.181e-02, 1.890e-02, 2.061e-01, 4.008e-02, 8.056e-02, 7.170e-02)); + r += mul(s6_5, M4(1.725e-01, -6.943e-02, -1.250e-01, -2.471e-02, -5.219e-02, -1.457e-02, 7.348e-02, 1.527e-02, 1.720e-01, -2.917e-01, 8.404e-02, 1.338e-02, 1.483e-02, -7.198e-03, 1.363e-01, 5.711e-02)); + r += mul(s6_6, M4(-1.382e-02, 3.408e-02, 2.277e-02, -6.609e-03, -1.179e-02, -1.054e-01, 1.119e-01, 9.839e-02, 2.587e-02, 1.137e-01, 1.036e-01, -1.115e-02, 4.407e-02, -4.043e-02, -3.306e-01, -6.428e-02)); + r += mul(s6_7, M4(-9.106e-03, 1.359e-01, 1.737e-01, 1.440e-01, 1.975e-01, -1.186e-01, -2.003e-01, 1.971e-02, -1.398e-01, 1.812e-01, 3.037e-01, 1.114e-01, 1.335e-03, -5.942e-02, -1.107e-01, 5.152e-02)); + r += mul(s6_8, M4(1.070e-02, 1.372e-01, 2.074e-02, 1.492e-02, -1.984e-02, -3.483e-02, 1.191e-02, 2.197e-02, 2.504e-01, 7.123e-02, 5.291e-02, 1.117e-01, 4.101e-02, -6.315e-04, -6.324e-03, 7.728e-02)); + r += mul(s7_0, M4(-3.974e-02, 2.985e-02, -1.092e-02, 1.240e-01, 1.882e-01, -3.639e-02, 1.109e-01, -1.198e-01, -1.671e-02, 1.336e-02, -5.847e-04, 1.193e-03, 2.677e-01, -5.223e-03, -4.448e-02, 1.367e-01)); + r += mul(s7_1, M4(-3.101e-01, 2.589e-01, 3.798e-01, -1.355e-01, 8.195e-02, 5.822e-02, -7.400e-02, -1.067e-01, -7.814e-02, 1.383e-01, 5.114e-02, 1.185e-01, 1.133e-01, -2.103e-01, -2.439e-01, -1.480e-01)); + r += mul(s7_2, M4(-1.113e-01, 3.120e-01, 1.693e-01, -5.996e-01, 2.809e-02, -4.451e-02, 7.395e-02, -6.342e-02, -3.381e-02, 4.870e-02, -1.399e-03, -6.268e-02, 1.393e-01, 6.764e-02, 3.476e-01, -1.854e-01)); + r += mul(s7_3, M4(4.503e-02, 1.243e-01, -1.130e-01, 2.658e-02, 1.479e-01, 4.798e-02, 1.252e-01, -1.806e-02, -7.891e-02, 1.534e-02, -3.566e-03, 2.627e-02, 5.887e-02, -1.256e-01, -5.538e-01, -2.069e-01)); + r += mul(s7_4, M4(-2.137e-01, -1.263e-01, -6.078e-02, -1.987e-01, -1.223e-01, -1.493e-01, 8.156e-02, 8.118e-02, -1.225e-01, 3.500e-02, 1.243e-01, 5.459e-03, -1.236e-01, 6.559e-01, 2.614e-01, -1.698e-01)); + r += mul(s7_5, M4(-3.382e-01, 5.502e-02, 1.169e-01, -3.525e-01, 7.489e-03, -2.617e-02, -8.019e-02, -1.182e-01, -3.470e-02, 2.337e-02, 1.442e-02, -5.355e-02, 3.594e-01, 3.674e-01, 1.463e-01, 3.906e-02)); + r += mul(s7_6, M4(-1.151e-02, -2.260e-02, -3.088e-02, -6.555e-02, 7.364e-04, -3.801e-02, 6.501e-03, 3.616e-02, 6.097e-02, -6.920e-02, -7.986e-02, -6.582e-02, 2.156e-02, -1.616e-01, -4.479e-01, -1.592e-01)); + r += mul(s7_7, M4(-6.885e-02, -1.099e-02, -9.592e-02, -9.008e-02, 5.067e-02, -7.398e-02, -5.587e-02, -5.412e-02, 1.803e-01, -7.075e-02, -5.241e-01, -1.093e+00, 1.650e-02, 9.611e-02, 2.075e-01, -4.235e-02)); + r += mul(s7_8, M4(1.153e-01, 1.718e-02, 8.889e-02, -8.588e-02, -2.290e-01, 1.386e-02, 6.186e-03, 4.417e-02, -2.398e-01, -8.062e-02, -8.487e-02, -2.124e-01, -4.520e-02, 1.713e-01, -1.170e-01, 1.027e-01)); + r += V4(-2.069e-02, -2.987e-03, 1.740e-02, -2.946e-02); + return r; +} + +V4 f2(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-3.484e-02, 1.363e-01, 1.128e-02, 2.731e-02, 2.148e-01, 2.105e-02, 5.216e-02, 5.292e-02, -1.420e-01, -1.113e-01, 7.175e-02, 2.105e-01, -1.338e-01, -1.191e-01, -5.884e-02, -1.030e-01)); + r += mul(s0_1, M4(-1.851e-01, -1.903e-02, 8.249e-02, 2.198e-02, -2.887e-02, -1.088e-01, -4.141e-03, 6.071e-02, -5.344e-01, 5.386e-02, 2.128e-01, 3.875e-01, 2.583e-01, -2.893e-02, 6.592e-02, -7.484e-03)); + r += mul(s0_2, M4(1.078e-01, 1.461e-01, -1.388e-02, 1.416e-01, 9.463e-02, -7.817e-02, 2.688e-02, 3.827e-02, 1.508e-01, 1.824e-01, -4.168e-02, 2.600e-01, 4.083e-02, -2.807e-02, -1.836e-02, -8.304e-03)); + r += mul(s0_3, M4(-1.126e-01, -1.466e-01, -3.001e-02, 1.208e-01, 4.733e-02, -1.028e-01, 5.886e-03, -5.126e-03, -1.510e-01, 3.632e-01, -2.124e-01, 2.895e-01, -1.412e-01, 9.587e-02, -7.396e-02, 8.584e-02)); + r += mul(s0_4, M4(-7.479e-02, -7.598e-03, 1.048e-01, -1.165e-02, -2.234e-01, -1.819e-01, -6.609e-05, 2.110e-01, -2.571e-02, 2.342e-02, -1.309e-01, -7.539e-03, -1.236e-01, 1.297e-01, -1.038e-01, 1.552e-01)); + r += mul(s0_5, M4(6.023e-02, 8.846e-02, -1.023e-01, -1.589e-02, -9.358e-03, -3.013e-02, -4.546e-02, 7.737e-02, -3.049e-02, 9.323e-02, -1.501e-01, 1.910e-01, 2.322e-01, -1.065e-01, 4.293e-02, -7.179e-03)); + r += mul(s0_6, M4(1.627e-02, -1.165e-02, 6.617e-02, -1.753e-01, -5.665e-02, -9.799e-02, -9.912e-03, 2.379e-01, 1.711e-01, 1.360e-01, 1.661e-01, 3.947e-01, 6.462e-03, -1.389e-01, 1.025e-01, 1.542e-01)); + r += mul(s0_7, M4(1.922e-01, -1.436e-02, 5.552e-02, -7.602e-04, -1.403e-01, -6.904e-02, 1.033e-01, -1.636e-01, 3.080e-01, -1.015e-04, 4.191e-02, 4.467e-01, -2.803e-02, 9.106e-02, 1.607e-01, 1.954e-02)); + r += mul(s0_8, M4(-3.284e-02, -6.743e-02, 8.716e-03, 2.141e-02, -9.278e-03, -1.025e-01, -4.230e-03, -3.253e-02, -2.380e-01, -1.509e-01, 3.078e-01, -1.802e-02, 1.304e-01, 8.580e-02, -6.820e-04, -1.603e-02)); + r += mul(s1_0, M4(9.042e-02, -1.366e-01, 1.458e-01, 1.153e-04, -2.110e-02, -9.788e-02, 5.997e-03, 7.205e-02, 1.532e-01, 1.358e-01, 7.913e-03, -3.246e-03, 4.556e-03, 5.523e-02, -7.687e-02, -9.071e-02)); + r += mul(s1_1, M4(-9.420e-03, -9.019e-02, -8.659e-02, -8.480e-02, -3.355e-01, 3.096e-01, -7.870e-02, -1.325e-01, 1.520e-01, -5.675e-02, -4.352e-04, -4.262e-02, 9.278e-02, 1.046e-01, 1.015e-02, -6.058e-03)); + r += mul(s1_2, M4(-1.024e-01, -4.386e-02, 4.412e-02, -2.980e-02, 1.547e-01, 2.227e-01, -1.597e-01, -8.375e-02, 6.362e-02, -5.846e-02, 3.936e-02, -4.481e-02, 9.786e-02, -3.618e-02, 1.203e-01, -1.681e-02)); + r += mul(s1_3, M4(-8.245e-02, 3.859e-02, -9.779e-02, 4.944e-02, -1.470e-01, 3.137e-01, -2.276e-02, -1.920e-01, -1.117e-01, -1.752e-01, 7.393e-02, -1.024e-01, 4.972e-03, -6.864e-02, 1.742e-02, -8.623e-03)); + r += mul(s1_4, M4(9.116e-02, 3.166e-01, 9.215e-03, -2.985e-01, -4.718e-01, 3.885e-01, -1.375e-01, -3.841e-01, -2.298e-01, 3.961e-02, -1.559e-01, 3.777e-03, 3.737e-01, -4.798e-02, 1.972e-01, -9.030e-02)); + r += mul(s1_5, M4(1.063e-01, 5.654e-02, 9.905e-02, -4.074e-02, 1.597e-01, 2.864e-01, -1.859e-01, 3.723e-02, 1.923e-02, -6.971e-02, 5.062e-02, -6.205e-03, 2.413e-01, -4.901e-02, -9.816e-02, -1.688e-01)); + r += mul(s1_6, M4(-5.862e-02, -2.331e-01, 1.486e-02, -5.033e-02, 8.738e-02, 3.527e-01, -1.055e-01, 8.905e-02, -8.721e-02, 3.613e-02, 9.311e-02, -8.565e-02, 1.348e-01, 9.023e-02, -5.384e-02, 2.078e-02)); + r += mul(s1_7, M4(-7.510e-02, -2.392e-01, -4.755e-01, 8.797e-02, 1.964e-02, 4.879e-01, -1.827e-01, -2.588e-01, -3.040e-02, -1.410e-01, -5.313e-02, 1.515e-02, -1.777e-01, 3.547e-02, -1.833e-01, -4.035e-02)); + r += mul(s1_8, M4(-3.043e-02, -6.401e-02, 1.010e-02, -1.899e-01, 2.236e-02, 1.968e-01, -8.204e-02, -6.947e-03, 3.201e-02, 1.249e-03, 1.314e-02, -6.879e-02, -2.536e-02, -9.149e-03, -6.333e-02, 3.822e-02)); + r += mul(s2_0, M4(5.347e-02, 7.325e-03, -4.429e-02, -4.327e-02, -1.392e-01, -3.509e-02, -5.283e-02, 1.858e-02, 7.683e-02, 8.472e-02, -1.160e-01, 3.134e-02, -9.732e-02, -3.585e-01, 4.247e-02, 2.477e-02)); + r += mul(s2_1, M4(-1.586e-01, -1.442e-01, 1.286e-01, -7.904e-02, 2.603e-02, 1.464e-01, 7.698e-02, -1.023e-01, -1.926e-01, -8.076e-02, 6.816e-02, -2.236e-03, 3.057e-01, 1.784e-01, -8.541e-02, 1.268e-01)); + r += mul(s2_2, M4(2.412e-01, 1.712e-01, 1.838e-02, 9.514e-02, -7.224e-02, -2.570e-02, -3.206e-02, 7.936e-02, 2.439e-02, -1.086e-01, 2.443e-02, -5.714e-02, 8.040e-02, 1.994e-02, 7.100e-02, -1.015e-01)); + r += mul(s2_3, M4(9.619e-02, 2.899e-02, -6.595e-02, 2.943e-01, -6.384e-02, -1.141e-02, 2.826e-02, 9.702e-02, 5.752e-02, -8.619e-02, -4.905e-02, -7.927e-02, -1.452e-02, 2.305e-01, -9.046e-02, -6.537e-04)); + r += mul(s2_4, M4(-2.045e-01, -2.654e-02, 2.702e-01, -9.460e-02, 2.665e-02, -6.689e-02, -1.427e-01, 1.653e-01, 1.390e-01, -1.241e-01, 1.771e-01, -6.290e-02, -2.333e-01, -2.707e-01, 9.625e-03, -5.905e-02)); + r += mul(s2_5, M4(8.847e-02, -7.852e-02, -1.493e-01, -9.243e-02, -2.261e-01, 7.904e-03, -7.501e-02, -2.753e-02, -6.426e-02, -9.592e-02, 5.333e-02, 2.715e-02, 3.946e-01, -4.773e-02, 5.602e-02, 8.862e-02)); + r += mul(s2_6, M4(-1.205e-01, -6.520e-02, -5.556e-02, 3.410e-02, -6.862e-02, 5.047e-02, 9.071e-02, -1.081e-01, 3.530e-02, 1.150e-02, -1.697e-02, -4.909e-02, 2.646e-02, -1.374e-01, 4.384e-02, -5.705e-02)); + r += mul(s2_7, M4(-1.264e-01, 1.952e-02, -1.369e-01, 1.110e-01, 5.948e-02, -1.002e-01, -3.700e-01, 2.251e-01, 1.225e-01, 7.785e-02, 1.945e-02, 3.239e-02, 2.355e-02, 2.343e-02, 2.768e-01, 4.173e-03)); + r += mul(s2_8, M4(9.095e-02, -9.903e-02, -7.958e-04, 8.852e-02, -1.572e-01, -8.326e-03, 7.338e-02, 9.836e-02, -6.421e-02, 6.471e-02, -2.983e-02, -6.093e-03, 1.107e-01, -9.398e-02, -6.380e-02, 4.922e-02)); + r += mul(s3_0, M4(-4.309e-02, -1.197e-01, 4.255e-02, -1.473e-02, -1.998e-01, -6.516e-02, -8.865e-02, -1.683e-01, -3.871e-02, 1.745e-01, -1.008e-01, 5.839e-02, 6.387e-02, 4.789e-02, 2.588e-02, 8.918e-02)); + r += mul(s3_1, M4(1.241e-01, -3.877e-01, 2.505e-02, 9.344e-03, -8.102e-02, 4.774e-01, 1.097e-01, -1.704e-01, -2.908e-01, -2.172e-01, 5.179e-02, 7.486e-02, -3.017e-02, -5.884e-02, -1.501e-01, 1.206e-01)); + r += mul(s3_2, M4(-7.797e-02, -1.143e-01, 2.076e-01, 1.485e-01, 7.942e-02, 2.727e-01, -2.411e-02, -2.504e-02, -6.716e-02, 1.004e-01, 8.960e-02, 2.700e-01, 9.010e-02, 1.735e-01, 6.447e-02, -1.233e-01)); + r += mul(s3_3, M4(1.893e-01, -3.796e-03, 3.319e-02, 6.583e-02, -1.925e-01, 3.439e-01, -5.220e-02, -3.126e-02, 4.169e-03, 1.043e-02, 2.200e-01, 5.113e-01, -9.720e-02, 1.513e-01, -5.826e-02, 2.044e-01)); + r += mul(s3_4, M4(1.065e-01, -3.098e-01, 5.500e-02, -1.968e-01, 2.995e-01, 1.819e-01, 1.623e-01, -4.408e-01, 1.195e-01, 4.975e-02, 3.792e-01, 7.896e-02, -5.645e-02, 1.141e-01, -2.436e-01, 1.889e-01)); + r += mul(s3_5, M4(2.662e-01, -1.622e-01, 3.682e-01, -1.006e-02, 1.401e-01, 2.683e-01, -2.091e-01, -1.592e-01, -8.872e-02, -3.401e-02, -1.889e-03, 1.025e-01, -5.749e-02, 4.696e-02, 3.135e-01, -9.817e-02)); + r += mul(s3_6, M4(2.941e-02, -7.613e-02, -6.551e-03, -1.035e-01, -7.753e-02, 4.135e-01, 6.004e-02, -1.295e-01, 2.653e-02, -1.741e-02, -1.511e-01, 2.690e-02, -6.961e-02, -3.361e-02, 1.144e-02, -8.718e-02)); + r += mul(s3_7, M4(-4.181e-02, -1.020e-01, 2.157e-01, -9.168e-02, 1.548e-02, 2.957e-01, -2.600e-02, -2.993e-01, 4.842e-02, -7.354e-02, 2.110e-01, 1.405e-01, 1.667e-01, 1.008e-01, -6.331e-02, 6.662e-02)); + r += mul(s3_8, M4(3.903e-03, -1.583e-01, -4.185e-02, -3.656e-02, -4.145e-03, 6.326e-03, -1.888e-01, 1.221e-02, -6.146e-02, -2.519e-02, 6.748e-02, 8.828e-02, -6.787e-02, -5.366e-02, 1.493e-02, 1.099e-02)); + r += mul(s4_0, M4(-5.212e-02, -2.718e-02, -6.386e-02, 7.415e-02, 1.907e-03, 1.751e-01, -1.435e-02, -1.995e-02, -1.429e-01, -3.443e-02, 1.670e-01, 7.753e-02, -2.640e-03, 2.735e-02, 2.744e-02, 5.876e-02)); + r += mul(s4_1, M4(6.529e-02, -9.429e-02, 4.892e-02, -1.701e-02, 1.001e-01, 7.521e-02, -5.676e-02, 4.098e-02, 1.464e-02, -3.263e-03, -1.239e-02, 1.567e-01, -1.362e-01, 4.094e-03, -1.228e-01, -4.357e-03)); + r += mul(s4_2, M4(1.608e-02, 1.142e-01, -6.012e-02, -5.642e-03, -1.307e-02, 1.401e-01, -6.375e-03, -6.159e-02, 3.472e-02, -4.362e-02, 5.201e-02, -1.493e-02, -3.256e-02, 4.176e-03, -4.099e-02, 3.087e-03)); + r += mul(s4_3, M4(-3.638e-02, 1.756e-01, -1.242e-02, 3.948e-02, 1.582e-01, 1.562e-01, 1.811e-02, -3.975e-02, 3.561e-01, -7.619e-03, 2.069e-01, -2.175e-01, 9.041e-03, -1.801e-01, 1.094e-01, -1.363e-01)); + r += mul(s4_4, M4(-3.071e-01, -2.576e-01, 5.100e-02, -9.115e-02, 1.922e-01, 9.628e-02, -8.975e-02, 4.941e-02, 2.380e-01, -3.636e-03, -7.834e-03, -4.376e-01, 1.751e-01, -1.537e-01, 4.383e-02, -1.223e-01)); + r += mul(s4_5, M4(5.033e-02, -5.616e-03, -6.727e-03, -6.098e-02, 7.306e-02, 1.751e-01, 2.450e-01, 3.670e-02, 1.730e-01, -8.718e-02, 3.038e-03, 1.224e-02, -1.678e-02, 9.115e-03, -3.014e-02, 1.537e-01)); + r += mul(s4_6, M4(-1.150e-01, 2.567e-02, -2.899e-02, -6.135e-02, 3.416e-02, 8.015e-02, -1.608e-01, 1.962e-02, -4.545e-02, -1.634e-01, 3.203e-03, 7.314e-02, 5.206e-02, 4.898e-02, -9.349e-02, 7.265e-02)); + r += mul(s4_7, M4(6.312e-02, 1.064e-01, -1.538e-01, 8.327e-02, -2.634e-02, 1.686e-02, -4.496e-02, -1.649e-02, -3.866e-02, 1.477e-02, -5.656e-02, 3.023e-02, -2.998e-01, 1.067e-01, 8.864e-02, 1.002e-01)); + r += mul(s4_8, M4(3.159e-02, 6.080e-03, 4.017e-02, 9.761e-02, 7.659e-02, -2.756e-03, 7.293e-02, -1.748e-01, 5.821e-03, 4.578e-02, -6.616e-02, -1.362e-01, 2.252e-02, -4.367e-02, -7.143e-02, -7.386e-03)); + r += mul(s5_0, M4(-5.706e-02, 8.028e-02, -4.827e-02, 7.617e-02, 3.856e-03, -5.172e-02, 6.074e-03, -3.814e-02, 3.856e-02, 1.129e-01, -2.847e-03, 5.457e-03, 1.055e-01, -3.678e-02, 2.637e-02, 7.666e-02)); + r += mul(s5_1, M4(-1.340e-01, 2.221e-02, -1.840e-02, 1.375e-01, 6.071e-03, -4.839e-02, -6.450e-02, -2.356e-03, 1.429e-01, -1.235e-01, -1.162e-01, -3.469e-02, -6.388e-02, -1.347e-03, -1.941e-02, 3.643e-02)); + r += mul(s5_2, M4(-2.089e-02, 2.257e-01, -3.685e-02, -2.035e-02, 2.204e-01, -1.359e-01, 5.952e-02, -7.981e-02, 7.158e-02, 3.472e-02, -3.589e-02, -5.763e-02, 2.305e-01, 1.726e-01, 1.183e-01, 1.133e-01)); + r += mul(s5_3, M4(1.358e-01, -5.186e-02, -7.769e-02, 2.976e-01, -4.275e-02, -2.520e-02, 6.198e-03, -7.618e-02, -2.241e-01, -8.704e-02, -1.312e-01, 2.994e-02, 1.104e-01, -7.620e-02, 8.333e-02, -1.020e-01)); + r += mul(s5_4, M4(-9.760e-02, 8.211e-02, 2.833e-01, 1.034e-01, -1.214e-01, -7.752e-02, 7.067e-02, -3.664e-02, -4.609e-01, -1.316e-01, -4.471e-01, 7.434e-02, 4.300e-01, -5.906e-02, 2.448e-01, -2.251e-01)); + r += mul(s5_5, M4(2.167e-01, -1.186e-01, -4.355e-02, -1.010e-01, -2.587e-02, 1.355e-02, 1.408e-01, 1.098e-01, -9.257e-03, -1.341e-01, 1.755e-02, 1.099e-01, -1.095e-01, 9.256e-02, 7.816e-02, -4.387e-02)); + r += mul(s5_6, M4(-6.477e-02, -7.389e-02, 7.819e-02, 2.130e-03, -1.563e-01, 1.246e-03, -9.797e-03, 1.048e-01, 8.510e-02, 1.086e-01, -1.951e-01, 3.935e-02, 8.755e-02, -2.165e-01, 6.726e-02, -9.942e-02)); + r += mul(s5_7, M4(-9.343e-02, 3.212e-01, -1.502e-01, -2.067e-01, -1.848e-01, 2.423e-02, 6.901e-02, -1.206e-02, 3.628e-02, 4.616e-02, -1.154e-01, 3.674e-02, 1.506e-01, -7.028e-02, 2.274e-01, 1.040e-01)); + r += mul(s5_8, M4(-1.124e-01, 7.508e-02, 9.292e-03, -2.175e-01, 2.326e-02, -1.198e-03, -1.011e-02, 9.965e-02, -9.725e-03, 8.435e-02, 8.129e-02, -3.936e-02, -1.041e-01, -8.395e-02, 3.440e-02, -1.548e-01)); + r += mul(s6_0, M4(4.309e-02, 1.069e-02, 5.830e-02, 8.488e-02, 3.710e-02, -1.017e-01, -2.255e-02, 8.133e-02, 8.677e-02, -2.632e-02, -2.362e-03, 6.089e-02, -4.658e-02, -7.388e-02, -6.218e-03, 1.440e-02)); + r += mul(s6_1, M4(-1.503e-01, -9.422e-02, -2.333e-02, -1.174e-01, -1.932e-01, -8.729e-02, -1.528e-01, 9.658e-02, -2.449e-02, 7.951e-02, 1.074e-02, -1.482e-01, -1.562e-02, 9.610e-02, -1.884e-02, -2.390e-03)); + r += mul(s6_2, M4(-4.995e-02, 1.221e-01, 7.090e-02, -3.020e-02, 1.030e-01, 7.577e-02, -1.035e-01, -4.602e-02, -7.354e-03, 6.743e-02, -2.907e-02, 8.861e-02, -1.696e-01, 5.770e-02, 1.089e-02, -1.339e-02)); + r += mul(s6_3, M4(-5.793e-02, -3.234e-02, -1.031e-02, -5.240e-02, -2.342e-01, 2.934e-01, -8.607e-03, -3.140e-02, -1.454e-01, -2.016e-01, -2.977e-02, -1.380e-01, -1.277e-02, 4.317e-02, -8.529e-02, -4.209e-02)); + r += mul(s6_4, M4(1.006e-01, 7.887e-02, 2.682e-01, -1.783e-01, -3.231e-02, 2.358e-01, -3.659e-02, -9.102e-02, 3.925e-01, 3.797e-01, 3.037e-01, -4.256e-01, -1.432e-01, -4.200e-02, -2.229e-01, 1.447e-01)); + r += mul(s6_5, M4(-3.216e-02, -7.773e-02, 6.950e-02, -6.786e-02, -5.007e-02, 5.464e-03, -4.387e-02, -1.906e-02, -5.423e-02, 9.449e-02, -1.166e-01, -4.415e-01, 1.884e-02, -1.511e-02, -3.674e-02, -3.145e-02)); + r += mul(s6_6, M4(2.022e-03, -5.738e-02, -2.423e-02, -2.368e-02, 1.396e-01, -4.719e-02, 6.353e-02, 1.798e-02, -1.106e-01, -6.147e-02, 1.454e-02, -1.188e-01, 3.093e-02, 1.150e-01, -2.183e-02, 5.553e-02)); + r += mul(s6_7, M4(-4.065e-02, 9.399e-02, 6.671e-02, -5.721e-03, 5.936e-03, 1.269e-01, -7.222e-02, -2.388e-02, 2.619e-01, -2.158e-02, -8.924e-02, 1.281e-01, -1.135e-01, -3.007e-03, -9.746e-02, 1.963e-02)); + r += mul(s6_8, M4(-5.138e-02, -1.870e-02, -1.453e-01, 6.832e-02, 4.452e-04, -1.008e-02, -4.934e-02, 3.627e-02, -1.170e-01, -7.439e-02, -1.414e-01, 5.688e-02, 8.207e-04, -6.678e-02, -2.995e-02, -1.367e-02)); + r += mul(s7_0, M4(-6.817e-02, 2.469e-01, -1.395e-01, 8.505e-02, 6.080e-02, -1.734e-01, 1.795e-01, -7.193e-02, 3.754e-02, -5.872e-02, 2.572e-02, 3.828e-02, 1.476e-01, -3.651e-01, 7.070e-03, 1.340e-01)); + r += mul(s7_1, M4(-6.316e-03, -1.203e-01, 9.622e-02, 3.262e-02, 1.129e-01, 6.123e-02, -3.000e-02, 2.447e-01, -1.079e-01, -2.132e-03, -2.900e-02, 3.731e-02, 3.870e-01, 3.113e-01, -1.099e-01, 4.130e-01)); + r += mul(s7_2, M4(-1.462e-01, -1.103e-01, -1.563e-01, 3.878e-02, -1.411e-01, 5.459e-02, 6.373e-02, -3.447e-02, -3.014e-02, -4.506e-02, -2.200e-02, -1.378e-02, -4.950e-01, 5.802e-02, -2.420e-02, 2.306e-01)); + r += mul(s7_3, M4(-4.910e-02, -1.139e-01, -1.849e-01, 8.177e-03, -1.325e-01, -4.014e-01, 1.496e-01, -1.073e-01, 9.380e-02, -4.773e-02, -4.225e-03, 2.243e-01, 1.393e-01, 5.335e-01, -2.668e-01, -2.251e-01)); + r += mul(s7_4, M4(-1.134e-01, 1.663e-01, 1.440e-01, 1.847e-01, 3.020e-01, -1.341e-01, 1.602e-01, 1.243e-01, 1.085e-01, 2.234e-02, 6.035e-02, 2.298e-01, 9.849e-01, -1.289e-01, 2.030e-01, -2.575e-01)); + r += mul(s7_5, M4(2.986e-01, -1.106e-01, -5.721e-01, 3.473e-01, -7.268e-02, -1.940e-01, 9.358e-02, 5.481e-02, -8.842e-02, -7.366e-02, -1.714e-01, -4.578e-02, -2.949e-03, 1.634e-02, -4.188e-02, 5.497e-02)); + r += mul(s7_6, M4(1.568e-02, 3.107e-03, -4.870e-02, 1.169e-01, -9.966e-03, 2.597e-02, 8.971e-02, -9.648e-02, -1.299e-02, 1.173e-01, 8.042e-02, 9.655e-02, 1.278e-02, -4.929e-02, 3.850e-02, 4.322e-02)); + r += mul(s7_7, M4(-1.831e-02, -1.859e-02, -9.896e-04, 6.425e-02, 2.686e-02, -5.379e-02, 9.713e-02, 4.660e-02, -2.112e-01, -8.350e-02, -5.293e-01, 2.979e-01, -1.496e-01, -2.814e-01, 1.535e-01, 3.757e-01)); + r += mul(s7_8, M4(-5.505e-04, 1.637e-01, -5.255e-02, 1.151e-01, -3.981e-02, 1.988e-02, -3.469e-02, 9.384e-04, 6.732e-02, -1.318e-01, -3.960e-02, 2.956e-01, -5.225e-02, -8.783e-03, -2.130e-01, 6.466e-02)); + r += V4(4.700e-02, -8.415e-04, 3.618e-02, -1.033e-02); + return r; +} + +V4 f3(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(5.775e-03, -1.915e-02, 1.380e-01, -2.432e-01, -1.598e-03, -6.168e-02, 1.550e-02, 1.500e-02, -4.176e-02, -1.250e-01, 2.926e-01, -5.989e-01, -1.535e-02, -8.070e-03, 4.714e-02, -1.803e-02)); + r += mul(s0_1, M4(-1.209e-01, -9.318e-02, -2.872e-02, 4.523e-03, -5.891e-02, 8.063e-02, 1.018e-02, -7.905e-02, 2.183e-01, -9.264e-02, -2.915e-01, -3.450e-01, 2.925e-02, 3.904e-02, -9.594e-02, 3.135e-01)); + r += mul(s0_2, M4(-6.871e-03, 3.522e-02, 7.605e-02, 1.022e-01, -7.157e-02, -1.163e-02, -9.893e-02, -1.464e-01, -1.112e-01, 5.742e-02, 5.764e-03, 3.180e-03, -1.463e-01, 9.152e-02, 5.833e-02, -1.950e-01)); + r += mul(s0_3, M4(-4.064e-02, 2.833e-02, -2.051e-02, 8.984e-02, -9.573e-03, -2.246e-02, -1.190e-01, -1.258e-01, -7.168e-01, -1.872e-01, 4.114e-01, 1.773e-01, 8.321e-02, -2.403e-02, -2.976e-02, 8.150e-02)); + r += mul(s0_4, M4(-1.311e-02, 6.584e-02, 1.059e-01, 5.435e-02, 1.123e-01, -7.403e-02, -1.220e-02, -5.464e-02, -3.922e-01, -2.240e-01, 2.893e-01, -1.939e-01, 4.861e-02, -1.121e-01, 2.521e-02, -4.980e-02)); + r += mul(s0_5, M4(1.092e-01, -5.111e-02, -5.624e-02, -2.115e-01, -3.735e-02, 3.550e-02, 6.980e-02, 1.099e-01, -1.519e-01, 1.773e-01, -2.026e-02, -4.360e-02, -1.731e-01, -6.923e-02, -5.706e-02, 7.600e-02)); + r += mul(s0_6, M4(8.325e-02, 3.091e-02, 5.629e-02, 1.093e-01, 7.900e-02, 1.461e-03, -6.437e-02, 1.671e-02, -1.752e-01, 2.031e-02, 2.250e-01, 4.330e-02, 1.337e-01, 9.253e-02, -9.684e-02, -9.401e-02)); + r += mul(s0_7, M4(-4.894e-02, 1.022e-02, -1.280e-01, -2.706e-01, 4.335e-02, -2.013e-02, -2.357e-01, -1.417e-01, -1.250e-01, 5.286e-02, -5.300e-03, 1.706e-01, 8.294e-02, 1.679e-01, -1.052e-01, -7.337e-02)); + r += mul(s0_8, M4(-5.247e-02, 2.057e-01, 1.361e-01, 1.726e-01, 1.140e-02, -1.476e-02, 1.134e-01, -2.014e-01, 2.536e-02, 6.699e-02, 4.528e-02, -1.776e-01, -7.202e-02, -7.618e-02, -1.158e-02, 1.702e-01)); + r += mul(s1_0, M4(-1.952e-03, -6.681e-03, -1.451e-01, 1.533e-01, 1.081e-02, 1.271e-02, 7.490e-02, 1.208e-01, -3.395e-02, -1.497e-02, -2.631e-02, 4.242e-02, 6.987e-02, -2.747e-02, 4.741e-02, 8.648e-02)); + r += mul(s1_1, M4(3.855e-02, -3.548e-01, -2.914e-01, 3.399e-01, -1.315e-02, 1.092e-01, 2.029e-02, 3.275e-01, 2.009e-02, -5.757e-02, 3.717e-03, 4.731e-02, -2.055e-03, -1.584e-01, -1.442e-01, -1.122e-02)); + r += mul(s1_2, M4(4.168e-02, -2.889e-01, -8.142e-03, 1.570e-01, 2.149e-02, -1.116e-01, 1.079e-01, 1.796e-01, -8.895e-02, -1.314e-02, -1.826e-02, -2.545e-02, 1.139e-01, -5.690e-02, 1.901e-02, -8.866e-02)); + r += mul(s1_3, M4(4.450e-02, 5.745e-02, -2.083e-01, 3.231e-01, 6.007e-02, -1.125e-01, -1.766e-01, 1.204e-01, 1.214e-01, -5.118e-02, -2.882e-01, -2.368e-01, 1.062e-01, 3.331e-03, 2.207e-03, 1.383e-01)); + r += mul(s1_4, M4(6.997e-02, -2.012e-01, 1.352e-01, 4.280e-01, 6.532e-03, -8.004e-02, 1.141e-01, 2.356e-02, -1.539e-02, -5.730e-02, -1.123e-01, 2.892e-02, -6.529e-02, -8.186e-02, 5.215e-02, 1.579e-01)); + r += mul(s1_5, M4(-1.647e-02, -5.560e-02, 1.827e-01, -4.019e-02, -2.140e-01, -5.621e-02, 9.606e-02, 6.940e-01, 1.692e-01, -4.055e-02, -9.464e-02, 1.215e-01, -2.381e-01, -1.810e-03, -2.217e-02, 9.709e-03)); + r += mul(s1_6, M4(1.115e-01, -6.232e-02, -1.842e-02, 1.088e-01, 1.617e-02, 1.216e-02, -4.391e-02, -6.813e-02, -1.200e-02, -6.210e-02, -1.142e-01, -1.091e-03, 4.177e-02, -2.947e-03, 8.917e-02, -6.753e-02)); + r += mul(s1_7, M4(9.709e-02, -1.644e-01, -1.105e-01, 8.448e-01, -3.137e-01, -1.223e-03, 2.051e-01, 2.591e-01, 6.120e-02, -5.587e-02, 5.817e-02, 2.077e-02, -6.603e-02, 1.237e-01, -1.174e-01, 2.430e-01)); + r += mul(s1_8, M4(1.362e-02, 4.226e-03, 9.381e-02, 3.483e-01, -2.034e-01, -1.091e-01, 8.972e-02, 2.797e-01, -8.692e-02, 9.477e-03, -4.873e-03, 5.114e-02, 6.086e-02, 6.953e-02, -1.248e-01, 1.996e-01)); + r += mul(s2_0, M4(4.099e-02, -2.409e-02, -1.468e-01, 8.254e-02, -2.475e-02, 3.390e-02, -6.001e-02, -4.829e-05, 1.152e-01, -3.965e-02, -2.303e-02, -4.546e-02, 2.851e-02, 2.591e-02, -1.313e-01, -1.955e-01)); + r += mul(s2_1, M4(1.176e-01, 8.189e-02, 1.254e-01, 4.143e-02, 1.287e-02, -8.469e-02, 5.808e-02, 6.216e-02, 2.254e-02, 4.490e-02, -1.897e-01, -5.535e-02, -7.591e-02, 6.961e-02, -2.051e-01, 1.174e-01)); + r += mul(s2_2, M4(-4.913e-02, -3.644e-02, 8.416e-02, -2.713e-01, -2.499e-03, -8.316e-02, -8.719e-02, -2.012e-02, 1.115e-01, -7.469e-02, -2.734e-02, -8.379e-02, 8.680e-02, -1.107e-01, 1.119e-01, -2.290e-02)); + r += mul(s2_3, M4(3.903e-02, 1.035e-01, 2.128e-02, 6.264e-02, 7.463e-02, -8.552e-02, 6.475e-02, -1.452e-01, -3.157e-02, -7.142e-02, 2.747e-02, 3.922e-01, -5.046e-02, -2.033e-01, -1.181e-01, -7.762e-02)); + r += mul(s2_4, M4(2.228e-01, 4.668e-02, 4.773e-02, -2.063e-02, -1.213e-01, 7.994e-02, 1.636e-01, -1.763e-01, -5.805e-03, 3.983e-02, -5.585e-02, 7.100e-02, -8.525e-03, -4.250e-01, 8.265e-02, -1.339e-01)); + r += mul(s2_5, M4(-5.280e-02, -3.438e-02, 3.967e-02, -1.133e-01, 6.352e-03, 1.601e-01, 5.818e-02, 1.326e-01, 1.388e-01, 7.722e-02, 1.132e-01, -3.909e-02, 2.519e-04, -1.723e-01, -1.168e-01, 1.490e-01)); + r += mul(s2_6, M4(6.596e-03, -7.169e-02, 7.047e-02, -2.775e-01, -3.024e-03, 4.072e-02, 3.099e-03, -6.798e-02, 1.090e-02, 1.233e-03, -1.005e-02, 1.251e-01, 2.488e-02, -2.424e-02, 2.031e-02, 1.340e-02)); + r += mul(s2_7, M4(1.544e-01, 4.432e-02, -1.298e-01, 1.629e-01, -6.938e-02, -2.137e-02, -1.190e-01, 1.030e-01, -2.966e-02, 2.679e-02, 6.637e-02, -3.573e-02, 4.394e-02, 5.055e-03, -8.268e-02, -1.051e-01)); + r += mul(s2_8, M4(-4.681e-02, -4.377e-02, 8.927e-02, 5.233e-02, -6.401e-02, -1.798e-02, 8.584e-02, -1.031e-01, 1.057e-01, 3.010e-03, -4.292e-02, -6.953e-02, -3.872e-03, -2.862e-02, -2.269e-02, -7.101e-02)); + r += mul(s3_0, M4(-2.470e-03, -6.987e-02, -6.901e-02, -1.364e-01, -5.554e-02, -1.329e-01, 2.559e-01, 9.696e-03, -9.911e-02, -2.221e-02, -2.538e-01, 1.265e-01, 4.683e-02, -6.980e-02, -1.954e-01, -8.603e-02)); + r += mul(s3_1, M4(1.254e-01, 2.579e-01, -6.602e-02, 8.325e-02, 5.961e-02, -2.167e-01, 5.840e-01, -1.367e-01, -2.569e-01, -2.328e-03, -5.283e-03, -1.728e-01, -2.137e-02, 2.465e-01, 5.074e-01, 7.129e-02)); + r += mul(s3_2, M4(-2.218e-02, -1.554e-01, 3.234e-02, -4.435e-02, 9.366e-02, -5.878e-03, -7.086e-02, 1.741e-01, -2.773e-01, 9.823e-02, 6.571e-02, -1.128e-02, -2.979e-02, 1.190e-01, 1.796e-01, 8.459e-02)); + r += mul(s3_3, M4(-8.935e-02, 1.110e-01, 9.640e-02, 2.515e-01, -1.905e-01, 1.623e-01, 2.097e-01, 1.553e-01, -1.017e-01, -1.275e-01, 9.053e-02, -1.946e-01, -1.909e-01, -7.685e-02, -2.068e-02, -1.055e-02)); + r += mul(s3_4, M4(2.260e-01, 1.087e-01, -3.768e-01, -3.065e-03, -2.213e-01, -2.439e-01, 1.779e-01, 6.739e-02, -1.644e-01, -8.631e-02, 4.835e-01, 3.453e-02, 1.473e-01, -6.266e-02, -3.585e-02, 6.705e-02)); + r += mul(s3_5, M4(-9.208e-03, 9.673e-03, 2.043e-01, -2.582e-01, 1.772e-01, -3.914e-02, 1.438e-02, 4.101e-01, -5.037e-02, -6.065e-02, 2.835e-01, -1.345e-01, 3.581e-02, 1.024e-03, -8.780e-03, 3.375e-03)); + r += mul(s3_6, M4(1.456e-01, -6.021e-02, 1.159e-01, -1.113e-01, -2.387e-02, 3.019e-01, -1.355e-01, -5.563e-02, -3.382e-01, -1.946e-01, 1.994e-01, 1.954e-01, -7.471e-02, -2.324e-02, -9.937e-03, 3.020e-02)); + r += mul(s3_7, M4(1.250e-01, 5.734e-02, -3.092e-02, 4.361e-02, -1.033e-01, 4.429e-02, -6.119e-02, -1.869e-01, -9.072e-02, -2.381e-02, 1.206e-01, -1.160e-03, 3.010e-02, 8.222e-02, -1.184e-01, 4.834e-02)); + r += mul(s3_8, M4(-5.493e-02, 6.257e-03, -1.606e-01, 6.701e-02, 1.589e-02, 6.510e-02, 1.324e-02, 5.111e-02, -1.510e-02, -1.567e-02, 7.450e-02, -1.451e-01, -1.068e-02, 1.092e-02, 4.474e-03, 3.111e-02)); + r += mul(s4_0, M4(5.026e-03, 1.825e-02, 2.259e-02, -4.380e-03, -5.178e-02, -2.513e-02, -5.339e-02, 1.241e-01, -5.429e-02, 3.186e-02, -2.382e-01, -4.040e-02, 7.159e-02, 1.341e-02, 1.121e-01, -3.143e-03)); + r += mul(s4_1, M4(-8.335e-02, 5.689e-02, -6.871e-02, -6.070e-03, -2.638e-02, 2.636e-01, -1.103e-01, 9.037e-02, 1.066e-01, -1.255e-01, -6.273e-02, -4.147e-02, -1.496e-01, -3.183e-02, -3.861e-02, -6.475e-02)); + r += mul(s4_2, M4(-1.181e-03, 5.513e-03, 1.929e-02, -8.892e-03, 9.030e-02, 5.711e-02, -9.029e-02, 5.996e-02, 3.188e-02, -1.179e-01, -3.602e-02, -1.647e-02, -9.029e-02, 3.394e-03, 4.245e-02, 2.177e-01)); + r += mul(s4_3, M4(-3.745e-02, -1.071e-01, -7.763e-03, 7.312e-02, -1.244e-02, -3.923e-02, 1.577e-01, 7.876e-02, -3.967e-01, -2.705e-01, 1.242e-01, -1.339e-01, 9.164e-02, -8.832e-02, -5.150e-02, 9.188e-04)); + r += mul(s4_4, M4(3.188e-01, 2.089e-01, 1.191e-01, -1.741e-01, -9.131e-02, -1.280e-01, -8.498e-02, -1.474e-02, -7.363e-01, -6.461e-01, -1.540e-01, -3.043e-01, -8.331e-02, -3.601e-02, -1.337e-01, -3.212e-03)); + r += mul(s4_5, M4(-1.324e-01, -7.492e-02, -2.765e-02, 1.714e-01, 1.525e-01, -1.808e-01, -5.317e-03, 2.487e-01, -5.368e-02, -1.320e-01, 1.646e-01, -1.221e-01, 1.742e-01, 7.191e-02, 1.264e-01, -1.884e-02)); + r += mul(s4_6, M4(-5.439e-02, -1.459e-01, -9.954e-02, -1.495e-01, -3.570e-02, 6.260e-02, 1.202e-01, 8.844e-02, -2.543e-02, 6.869e-02, 5.723e-02, -8.969e-02, 4.016e-02, -5.638e-02, -1.861e-02, -2.536e-02)); + r += mul(s4_7, M4(-2.141e-02, 1.867e-01, 9.165e-02, 3.497e-03, -8.593e-03, 1.722e-02, -9.671e-02, 2.116e-01, -1.176e-01, 9.203e-02, -3.250e-03, 2.352e-01, 4.347e-02, -1.797e-02, 1.628e-02, -1.260e-01)); + r += mul(s4_8, M4(8.824e-03, -1.198e-01, 1.086e-01, -4.312e-02, 5.914e-02, -6.638e-02, -2.196e-01, -6.658e-02, -1.844e-02, 4.803e-02, -3.338e-02, 2.232e-01, 1.276e-02, 4.370e-02, -1.566e-01, -6.510e-02)); + r += mul(s5_0, M4(-7.742e-02, -5.564e-03, -1.219e-01, 8.266e-02, -2.908e-02, -5.622e-02, -6.020e-02, 1.122e-01, 3.347e-02, 1.352e-01, 5.121e-02, 1.043e-01, 9.550e-02, 7.644e-02, 1.249e-01, 1.721e-02)); + r += mul(s5_1, M4(6.050e-02, -5.223e-02, -1.074e-02, -9.829e-02, 1.650e-02, -8.694e-02, -2.254e-01, 1.426e-02, -1.388e-01, 7.306e-02, 5.138e-02, 2.509e-01, -1.576e-02, -4.962e-02, -1.111e-01, 1.685e-02)); + r += mul(s5_2, M4(6.816e-03, 5.468e-02, -4.772e-02, -4.338e-02, 1.247e-01, 9.513e-02, 8.595e-03, -1.408e-01, -8.185e-02, -3.862e-02, 1.914e-02, -6.964e-02, 5.147e-02, -2.923e-01, -1.373e-01, 5.155e-02)); + r += mul(s5_3, M4(-5.775e-02, 1.676e-01, 9.105e-02, 8.077e-02, -5.880e-02, 9.001e-03, 5.488e-02, -3.103e-02, 4.378e-01, 5.467e-01, 5.087e-02, 1.015e-02, 1.360e-01, -1.773e-01, 1.621e-01, 9.090e-02)); + r += mul(s5_4, M4(1.843e-01, -3.777e-02, 2.242e-01, -8.750e-02, 8.410e-02, -1.868e-01, -1.184e-01, -1.742e-01, 2.463e-01, 2.272e-01, 2.064e-02, 1.751e-01, -3.371e-01, -4.247e-01, 1.850e-01, -1.210e-01)); + r += mul(s5_5, M4(-2.420e-01, 8.496e-02, 3.214e-01, 8.231e-02, 1.791e-01, 8.399e-02, 2.479e-02, -1.334e-01, 7.132e-02, -7.497e-02, -1.178e-02, 1.141e-01, 2.510e-01, -3.215e-01, -2.085e-01, -1.628e-01)); + r += mul(s5_6, M4(2.309e-02, 1.314e-02, -1.278e-01, -1.081e-01, 4.483e-02, -3.659e-02, -7.600e-02, -9.992e-02, 1.486e-01, -1.862e-01, -6.407e-02, -3.771e-02, 1.169e-02, 7.518e-02, 1.239e-01, 1.198e-01)); + r += mul(s5_7, M4(1.076e-04, -1.035e-01, 8.117e-02, 2.222e-01, 1.414e-01, -8.499e-04, 7.303e-02, -2.033e-01, 1.418e-01, 7.929e-05, -3.849e-02, -2.114e-01, -1.265e-01, 1.412e-01, 2.669e-01, 2.386e-02)); + r += mul(s5_8, M4(1.398e-01, 1.127e-02, -2.013e-01, -1.141e-01, 3.554e-02, -1.411e-01, 8.951e-03, -6.957e-02, -6.525e-02, 1.170e-02, 3.001e-02, -5.121e-03, -1.427e-01, 1.769e-01, -1.797e-01, 7.330e-02)); + r += mul(s6_0, M4(-6.830e-02, 2.586e-02, 6.957e-02, 3.344e-03, -8.251e-02, -1.024e-01, 1.401e-02, -8.155e-02, 3.130e-02, 1.567e-02, 9.907e-02, 8.775e-02, 1.828e-02, -6.401e-02, -1.254e-01, -3.486e-03)); + r += mul(s6_1, M4(-7.500e-02, 1.524e-01, 1.332e-01, -2.362e-03, -2.281e-01, -1.344e-01, -1.993e-02, 3.437e-02, -4.016e-02, 8.094e-03, -1.552e-01, -9.684e-03, -2.945e-02, 1.827e-01, 1.631e-01, -1.402e-01)); + r += mul(s6_2, M4(1.283e-01, 1.022e-01, -4.673e-02, -1.206e-01, 6.208e-02, -7.104e-03, -1.880e-03, 9.911e-02, 7.525e-02, -2.320e-02, 1.065e-01, 5.128e-02, -1.031e-01, -5.443e-02, 8.565e-02, 1.749e-02)); + r += mul(s6_3, M4(-7.235e-02, -4.825e-04, 1.150e-01, -2.535e-02, 2.054e-02, -1.127e-01, -2.437e-01, -2.327e-01, -4.160e-02, -1.421e-02, -1.598e-01, 8.317e-02, 1.066e-01, 9.147e-02, 2.876e-02, -1.104e-01)); + r += mul(s6_4, M4(-8.142e-02, -1.204e-01, -4.673e-02, 2.870e-02, 1.121e-01, 8.413e-02, 3.548e-01, -8.794e-02, 7.436e-02, -5.747e-01, -3.031e-01, 1.076e-01, -9.881e-02, -4.884e-02, -2.669e-02, 9.961e-02)); + r += mul(s6_5, M4(4.019e-02, 3.443e-02, 6.175e-02, -1.364e-01, -4.113e-02, 3.754e-02, 9.865e-03, -2.927e-02, 8.488e-02, 5.757e-02, -2.555e-01, 4.841e-02, 1.484e-01, -4.510e-02, 1.274e-01, -3.619e-02)); + r += mul(s6_6, M4(2.464e-02, 8.601e-02, 7.057e-02, -5.465e-03, -4.709e-02, 1.541e-02, -1.009e-01, 2.418e-01, 1.212e-02, -1.384e-01, -5.690e-03, 7.989e-02, 1.026e-02, 4.835e-03, 1.245e-01, -4.626e-02)); + r += mul(s6_7, M4(-8.064e-02, -5.022e-02, 6.276e-03, 3.697e-02, -1.358e-01, -2.119e-02, -3.152e-02, 8.134e-03, 4.175e-03, -6.934e-01, 2.208e-02, 1.098e-02, 2.263e-02, 4.586e-02, -8.756e-02, -5.983e-03)); + r += mul(s6_8, M4(1.869e-02, 6.459e-02, 3.638e-03, 8.153e-04, -2.581e-02, -2.617e-02, 1.255e-01, -8.043e-02, 8.142e-02, -6.911e-02, -1.027e-01, 1.238e-01, -6.244e-02, -3.995e-02, 3.448e-02, 6.247e-02)); + r += mul(s7_0, M4(6.368e-03, -2.268e-01, -5.136e-02, 2.237e-01, -6.148e-02, -2.566e-02, -1.429e-01, 1.650e-01, -1.630e-02, -3.195e-03, 3.669e-02, -2.326e-02, 1.549e-01, -2.640e-01, 1.995e-01, -1.645e-01)); + r += mul(s7_1, M4(-1.511e-01, 1.334e-02, 1.126e-01, -9.383e-02, -1.275e-01, -1.259e-01, -1.455e-01, -3.768e-02, -1.533e-02, 8.384e-02, 8.307e-02, -1.146e-01, -5.860e-02, -2.392e-02, 4.100e-04, 2.633e-01)); + r += mul(s7_2, M4(3.066e-01, -1.423e-03, -4.397e-01, -7.083e-02, 9.075e-02, 7.438e-02, -1.084e-01, -4.088e-02, 2.111e-03, 6.951e-02, 1.201e-02, -7.343e-02, 1.864e-01, -1.239e-01, 9.225e-02, 3.681e-02)); + r += mul(s7_3, M4(3.698e-02, -2.120e-01, 3.324e-02, 2.238e-01, -3.819e-02, -3.993e-02, 1.447e-01, -1.123e-01, -8.550e-02, 1.485e-01, -1.165e-01, -1.284e-01, 1.179e-01, 2.494e-01, 2.122e-02, -7.347e-02)); + r += mul(s7_4, M4(2.141e-01, -2.257e-01, -2.297e-01, -1.144e-01, -6.907e-02, 5.844e-02, -3.309e-01, 1.606e-01, 1.254e-01, 6.750e-01, 3.546e-01, 7.465e-02, -1.612e-01, -1.870e-01, -1.952e-01, 5.436e-01)); + r += mul(s7_5, M4(3.007e-01, -4.092e-01, -2.155e-01, -2.010e-01, 1.396e-01, -4.618e-03, 1.402e-02, -4.520e-02, -1.665e-01, 1.031e-02, 2.096e-01, -5.751e-02, 9.736e-02, 5.130e-02, 2.232e-01, -1.639e-01)); + r += mul(s7_6, M4(5.731e-02, -6.303e-02, -8.612e-03, 8.817e-02, -7.004e-02, -2.376e-02, 5.575e-02, -7.091e-03, -6.420e-02, -1.200e-01, -1.599e-01, -5.591e-02, -5.707e-02, 4.149e-02, 5.281e-02, -1.419e-01)); + r += mul(s7_7, M4(-1.024e-01, -1.073e-01, -1.133e-02, -9.733e-02, -5.793e-02, -1.041e-02, -2.091e-01, -5.623e-02, 2.134e-01, 8.509e-02, 3.772e-01, -2.028e-01, -2.103e-01, -5.787e-02, 1.942e-01, -1.438e-01)); + r += mul(s7_8, M4(3.537e-02, -9.345e-02, 1.828e-01, 8.816e-02, -6.724e-02, -5.321e-02, 7.143e-02, -3.994e-02, -1.362e-01, -6.127e-02, 3.408e-01, -1.016e-01, 1.485e-02, -2.559e-01, -2.418e-02, 6.540e-02)); + r += V4(-1.024e-03, -4.227e-03, -3.308e-02, 2.423e-02); + return r; +} + +void Pass3(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = Rmp8x8(tid.x) + blockStart; + uint2 size = GetInputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = (gxy + 0.5) * pt; + + V4 s0_0 = l0(-1.0, -1.0); + V4 s0_1 = l0(0.0, -1.0); + V4 s0_2 = l0(1.0, -1.0); + V4 s0_3 = l0(-1.0, 0.0); + V4 s0_4 = l0(0.0, 0.0); + V4 s0_5 = l0(1.0, 0.0); + V4 s0_6 = l0(-1.0, 1.0); + V4 s0_7 = l0(0.0, 1.0); + V4 s0_8 = l0(1.0, 1.0); + V4 s1_0 = -max(-s0_0, 0.0); + V4 s1_1 = -max(-s0_1, 0.0); + V4 s1_2 = -max(-s0_2, 0.0); + V4 s1_3 = -max(-s0_3, 0.0); + V4 s1_4 = -max(-s0_4, 0.0); + V4 s1_5 = -max(-s0_5, 0.0); + V4 s1_6 = -max(-s0_6, 0.0); + V4 s1_7 = -max(-s0_7, 0.0); + V4 s1_8 = -max(-s0_8, 0.0); + s0_0 = max(s0_0, 0.0); + s0_1 = max(s0_1, 0.0); + s0_2 = max(s0_2, 0.0); + s0_3 = max(s0_3, 0.0); + s0_4 = max(s0_4, 0.0); + s0_5 = max(s0_5, 0.0); + s0_6 = max(s0_6, 0.0); + s0_7 = max(s0_7, 0.0); + s0_8 = max(s0_8, 0.0); + + V4 s2_0 = l1(-1.0, -1.0); + V4 s2_1 = l1(0.0, -1.0); + V4 s2_2 = l1(1.0, -1.0); + V4 s2_3 = l1(-1.0, 0.0); + V4 s2_4 = l1(0.0, 0.0); + V4 s2_5 = l1(1.0, 0.0); + V4 s2_6 = l1(-1.0, 1.0); + V4 s2_7 = l1(0.0, 1.0); + V4 s2_8 = l1(1.0, 1.0); + V4 s3_0 = -max(-s2_0, 0.0); + V4 s3_1 = -max(-s2_1, 0.0); + V4 s3_2 = -max(-s2_2, 0.0); + V4 s3_3 = -max(-s2_3, 0.0); + V4 s3_4 = -max(-s2_4, 0.0); + V4 s3_5 = -max(-s2_5, 0.0); + V4 s3_6 = -max(-s2_6, 0.0); + V4 s3_7 = -max(-s2_7, 0.0); + V4 s3_8 = -max(-s2_8, 0.0); + s2_0 = max(s2_0, 0.0); + s2_1 = max(s2_1, 0.0); + s2_2 = max(s2_2, 0.0); + s2_3 = max(s2_3, 0.0); + s2_4 = max(s2_4, 0.0); + s2_5 = max(s2_5, 0.0); + s2_6 = max(s2_6, 0.0); + s2_7 = max(s2_7, 0.0); + s2_8 = max(s2_8, 0.0); + + V4 s4_0 = l2(-1.0, -1.0); + V4 s4_1 = l2(0.0, -1.0); + V4 s4_2 = l2(1.0, -1.0); + V4 s4_3 = l2(-1.0, 0.0); + V4 s4_4 = l2(0.0, 0.0); + V4 s4_5 = l2(1.0, 0.0); + V4 s4_6 = l2(-1.0, 1.0); + V4 s4_7 = l2(0.0, 1.0); + V4 s4_8 = l2(1.0, 1.0); + V4 s5_0 = -max(-s4_0, 0.0); + V4 s5_1 = -max(-s4_1, 0.0); + V4 s5_2 = -max(-s4_2, 0.0); + V4 s5_3 = -max(-s4_3, 0.0); + V4 s5_4 = -max(-s4_4, 0.0); + V4 s5_5 = -max(-s4_5, 0.0); + V4 s5_6 = -max(-s4_6, 0.0); + V4 s5_7 = -max(-s4_7, 0.0); + V4 s5_8 = -max(-s4_8, 0.0); + s4_0 = max(s4_0, 0.0); + s4_1 = max(s4_1, 0.0); + s4_2 = max(s4_2, 0.0); + s4_3 = max(s4_3, 0.0); + s4_4 = max(s4_4, 0.0); + s4_5 = max(s4_5, 0.0); + s4_6 = max(s4_6, 0.0); + s4_7 = max(s4_7, 0.0); + s4_8 = max(s4_8, 0.0); + + V4 s6_0 = l3(-1.0, -1.0); + V4 s6_1 = l3(0.0, -1.0); + V4 s6_2 = l3(1.0, -1.0); + V4 s6_3 = l3(-1.0, 0.0); + V4 s6_4 = l3(0.0, 0.0); + V4 s6_5 = l3(1.0, 0.0); + V4 s6_6 = l3(-1.0, 1.0); + V4 s6_7 = l3(0.0, 1.0); + V4 s6_8 = l3(1.0, 1.0); + V4 s7_0 = -max(-s6_0, 0.0); + V4 s7_1 = -max(-s6_1, 0.0); + V4 s7_2 = -max(-s6_2, 0.0); + V4 s7_3 = -max(-s6_3, 0.0); + V4 s7_4 = -max(-s6_4, 0.0); + V4 s7_5 = -max(-s6_5, 0.0); + V4 s7_6 = -max(-s6_6, 0.0); + V4 s7_7 = -max(-s6_7, 0.0); + V4 s7_8 = -max(-s6_8, 0.0); + s6_0 = max(s6_0, 0.0); + s6_1 = max(s6_1, 0.0); + s6_2 = max(s6_2, 0.0); + s6_3 = max(s6_3, 0.0); + s6_4 = max(s6_4, 0.0); + s6_5 = max(s6_5, 0.0); + s6_6 = max(s6_6, 0.0); + s6_7 = max(s6_7, 0.0); + s6_8 = max(s6_8, 0.0); + + t0[gxy] = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t1[gxy] = f1(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t2[gxy] = f2(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t3[gxy] = f3(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); +} + +//!PASS 4 +//!DESC conv3 +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 +//!IN t0, t1, t2, t3 +//!OUT t4, t5, t6, t7 + +#define l0(x, y) V4(O(t0, float2(x, y))) +#define l1(x, y) V4(O(t1, float2(x, y))) +#define l2(x, y) V4(O(t2, float2(x, y))) +#define l3(x, y) V4(O(t3, float2(x, y))) + +V4 f0(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(2.687e-01, 8.166e-02, -1.199e-01, -1.438e-01, -1.553e-01, 1.877e-02, -1.204e-02, 1.459e-02, -1.317e-01, 1.964e-02, 3.228e-02, 3.404e-02, -1.089e-01, -6.737e-03, -1.876e-01, 1.835e-02)); + r += mul(s0_1, M4(-1.304e-01, 1.646e-01, 1.825e-02, -1.453e-01, -7.232e-04, 8.586e-02, 1.332e-01, -6.766e-02, -2.069e-02, 8.783e-02, -6.577e-03, 8.726e-03, -2.289e-01, -5.098e-02, 4.306e-01, -2.771e-01)); + r += mul(s0_2, M4(9.318e-02, 8.611e-03, -1.182e-01, -2.625e-01, -1.586e-01, 3.613e-02, -1.326e-01, -3.240e-02, -2.252e-03, -2.125e-02, 1.131e-01, 8.956e-02, -1.659e-01, -3.769e-01, 3.006e-01, 1.306e-01)); + r += mul(s0_3, M4(2.156e-02, -1.255e-01, 2.045e-01, 4.720e-01, 3.673e-02, 1.511e-01, -4.359e-02, 8.447e-02, 9.906e-03, 2.171e-02, -3.553e-02, 8.704e-02, -2.092e-01, -5.608e-02, -1.380e-01, -1.604e-02)); + r += mul(s0_4, M4(2.147e-01, 3.794e-01, -5.221e-02, 2.407e-01, -8.350e-02, 2.791e-01, 3.463e-01, -1.276e-01, -4.068e-04, 2.771e-02, 8.716e-02, 1.195e-01, 4.733e-01, 1.988e-01, -1.505e-01, -3.883e-01)); + r += mul(s0_5, M4(8.607e-02, 1.514e-01, -3.988e-01, -3.330e-01, -6.680e-02, -2.056e-01, 2.278e-01, 1.257e-02, -8.822e-02, -1.234e-01, 5.052e-02, 8.519e-02, -2.473e-01, -3.413e-01, 4.017e-01, 8.034e-02)); + r += mul(s0_6, M4(-8.551e-02, -1.403e-01, 2.125e-01, 7.841e-03, 5.549e-03, -5.862e-02, 9.476e-04, 1.900e-02, -3.914e-02, -3.345e-02, 5.222e-02, -9.521e-03, 2.778e-02, 1.449e-01, -2.182e-01, -2.048e-01)); + r += mul(s0_7, M4(1.332e-02, -1.636e-01, -1.366e-01, 4.173e-01, 1.212e-01, 3.106e-02, -9.726e-02, -1.551e-01, 5.765e-03, 1.214e-02, -1.040e-01, -1.715e-01, 5.105e-02, -1.803e-02, 2.323e-01, -1.403e-01)); + r += mul(s0_8, M4(3.398e-02, 6.988e-02, -2.143e-01, -1.702e-01, -2.889e-02, 5.287e-02, -5.093e-02, -5.457e-03, -4.596e-02, -1.432e-02, 4.034e-02, 1.615e-01, -4.963e-02, -1.742e-01, 1.176e-01, 1.721e-01)); + r += mul(s1_0, M4(-1.326e-01, -2.362e-02, 1.268e-01, 1.417e-01, -2.640e-02, -6.551e-02, -1.278e-02, 6.166e-02, -7.067e-02, 6.927e-02, 1.225e-01, 6.188e-02, -1.689e-02, 1.018e-03, 1.171e-05, 4.638e-02)); + r += mul(s1_1, M4(5.420e-02, 3.479e-03, 6.777e-02, -1.539e-02, 1.453e-03, 1.949e-01, -1.092e-01, 3.312e-02, 1.668e-02, -2.749e-02, -7.548e-02, 1.983e-02, 3.772e-02, 9.288e-02, 3.287e-02, -1.036e-01)); + r += mul(s1_2, M4(4.808e-02, -7.779e-03, -8.201e-02, -1.903e-02, -8.753e-02, 9.981e-02, -1.936e-01, 1.469e-01, 2.946e-01, -6.026e-02, 1.247e-01, 1.665e-01, 1.790e-02, -2.399e-02, 1.201e-01, 2.750e-02)); + r += mul(s1_3, M4(6.217e-02, 9.400e-02, -4.512e-02, 8.812e-02, -2.566e-02, -4.474e-02, 4.474e-02, 1.304e-01, 3.143e-02, -1.294e-02, 2.472e-01, 8.708e-02, 8.283e-03, 6.958e-02, 4.408e-02, 5.403e-02)); + r += mul(s1_4, M4(1.630e-02, 1.362e-01, -1.194e-01, -3.578e-01, -9.621e-02, -2.325e-02, -6.584e-02, 3.462e-02, -3.388e-01, -3.103e-01, 1.561e-01, -4.855e-01, 1.372e-02, 1.174e-01, -1.389e-01, -1.157e-01)); + r += mul(s1_5, M4(1.248e-01, -1.963e-02, -1.700e-02, 1.012e-01, 1.012e-01, 1.299e-01, -4.928e-01, 5.774e-02, -4.600e-02, 3.790e-01, 4.851e-01, -2.039e-02, -9.516e-02, -1.836e-01, 1.571e-01, 1.615e-01)); + r += mul(s1_6, M4(-4.777e-02, -2.571e-02, -1.059e-01, -7.602e-02, 3.390e-04, -3.210e-02, 9.651e-03, -3.705e-02, -4.980e-02, -6.590e-02, 1.129e-01, 1.401e-01, 2.812e-02, 2.992e-02, -1.999e-02, -5.651e-02)); + r += mul(s1_7, M4(1.004e-01, 2.057e-02, -2.537e-02, 2.206e-02, -6.160e-02, -1.883e-02, -9.290e-03, 4.182e-02, -8.648e-02, -7.383e-03, -8.947e-02, 2.048e-01, 6.374e-02, -3.761e-02, -5.065e-02, -3.502e-02)); + r += mul(s1_8, M4(-8.064e-02, 5.522e-02, 4.249e-02, 1.068e-01, -1.652e-02, -2.258e-02, -1.323e-01, 1.204e-01, -9.693e-02, -6.873e-02, 2.582e-01, 2.303e-01, -4.725e-02, -3.186e-02, 9.203e-02, 5.410e-02)); + r += mul(s2_0, M4(3.263e-02, -9.901e-02, 4.089e-02, 3.456e-02, 3.123e-02, -1.064e-02, -1.264e-01, -1.284e-01, -6.946e-02, -2.256e-02, 5.680e-02, 7.784e-02, 3.726e-02, -1.081e-01, -6.456e-02, 1.050e-01)); + r += mul(s2_1, M4(2.190e-02, 4.159e-02, -1.148e-01, 8.853e-02, -1.967e-01, 4.572e-02, 1.118e-01, 3.464e-02, 5.631e-02, 8.991e-02, -1.654e-02, 1.463e-02, 1.619e-01, 4.864e-02, -5.587e-02, -5.653e-02)); + r += mul(s2_2, M4(-5.594e-02, -3.155e-02, 8.088e-02, 5.277e-02, -7.377e-02, -1.008e-02, 5.421e-02, 2.860e-02, 8.171e-02, 2.243e-01, -5.323e-02, -1.391e-01, -2.219e-02, 2.425e-02, 1.050e-01, -7.410e-02)); + r += mul(s2_3, M4(-1.869e-02, -8.442e-02, 3.266e-01, 1.762e-01, 6.582e-02, 2.504e-02, -1.160e-01, 9.119e-02, 5.249e-02, 6.679e-02, -6.709e-03, -5.891e-02, -4.800e-02, 7.017e-03, 6.847e-03, -6.442e-02)); + r += mul(s2_4, M4(3.592e-03, 1.994e-01, -1.673e-01, 7.164e-02, 1.105e-01, 1.378e-01, -2.136e-01, -2.875e-01, -2.423e-02, 2.685e-02, 9.026e-02, 3.959e-02, -7.615e-02, 2.090e-03, -4.808e-02, 9.262e-02)); + r += mul(s2_5, M4(-3.896e-03, -7.554e-02, 6.684e-02, 7.698e-02, -9.906e-02, 6.621e-05, 1.286e-01, 1.069e-01, -1.022e-01, 2.141e-02, -4.026e-02, -1.684e-02, 3.187e-02, -3.626e-02, -2.315e-02, -1.050e-01)); + r += mul(s2_6, M4(4.210e-03, -1.220e-02, 1.567e-01, 6.979e-02, 2.187e-03, -2.065e-03, 1.274e-01, 3.273e-03, -3.667e-02, 9.996e-02, -5.206e-03, -9.575e-02, 4.773e-03, 4.623e-02, -1.341e-02, -1.804e-02)); + r += mul(s2_7, M4(-6.208e-03, -1.973e-02, 4.654e-02, 3.823e-04, -1.456e-01, -5.811e-03, 2.883e-02, -1.811e-02, 2.366e-02, 5.063e-02, 8.785e-03, -1.582e-01, -1.013e-01, -7.017e-02, 1.187e-01, 8.433e-02)); + r += mul(s2_8, M4(-2.073e-02, -2.841e-02, 7.324e-02, -1.301e-02, -3.501e-02, -4.349e-02, 4.727e-02, 5.348e-02, -6.533e-02, 3.860e-02, -5.548e-02, -7.562e-02, -7.104e-02, -2.708e-02, -2.633e-02, 1.581e-02)); + r += mul(s3_0, M4(1.952e-01, -4.406e-02, 2.251e-01, 1.730e-02, 1.321e-01, 2.949e-02, -1.146e-01, -9.297e-02, 3.493e-03, 3.876e-02, 3.592e-02, 1.943e-02, 6.047e-02, 7.362e-02, 3.877e-02, 4.716e-02)); + r += mul(s3_1, M4(-1.067e-01, 3.903e-01, 1.590e-01, 7.771e-02, 1.419e-01, -4.469e-02, -2.373e-02, 1.276e-01, 1.104e-01, -7.168e-02, -1.678e-02, -8.715e-02, 1.352e-01, 5.306e-02, -2.815e-02, -2.683e-01)); + r += mul(s3_2, M4(7.782e-02, 1.057e-01, 3.814e-02, -1.432e-01, -3.761e-02, -6.796e-02, 1.127e-01, 1.391e-02, 1.189e-01, 7.453e-02, -7.495e-02, -1.539e-01, 3.333e-01, -3.008e-01, 2.307e-01, 1.726e-01)); + r += mul(s3_3, M4(2.905e-01, -1.213e-01, 4.333e-02, 3.070e-02, -1.941e-01, 2.148e-02, -4.467e-02, -2.192e-01, 4.357e-02, 1.709e-01, 1.875e-02, -1.411e-02, 2.852e-01, 4.772e-03, 6.625e-02, -3.587e-01)); + r += mul(s3_4, M4(-1.116e-01, 4.040e-01, -1.487e-01, -1.316e-01, -1.446e-01, -2.333e-01, -1.028e-01, 6.341e-02, -2.364e-01, -2.721e-02, 1.083e-01, -2.123e-01, 4.096e-01, -2.602e-01, 3.234e-01, -2.992e-01)); + r += mul(s3_5, M4(-8.916e-02, 5.935e-02, 2.286e-02, 3.991e-02, 3.674e-02, 2.909e-02, 2.075e-01, 1.902e-02, 2.073e-01, -3.102e-01, -1.087e-01, 2.351e-01, -1.173e-01, 3.481e-02, 1.374e-01, 1.690e-01)); + r += mul(s3_6, M4(-2.447e-03, -1.310e-01, 1.115e-01, 7.939e-02, -8.932e-02, -2.751e-02, 6.472e-02, 1.440e-01, -2.778e-01, -7.787e-02, 1.362e-01, 1.740e-01, -2.580e-01, -7.293e-02, -1.313e-01, -4.858e-01)); + r += mul(s3_7, M4(6.532e-02, 5.795e-02, 1.133e-01, -9.871e-03, -2.339e-01, -1.562e-01, 1.458e-02, -1.546e-01, -1.127e-01, -7.856e-04, -1.915e-01, -3.379e-01, -9.314e-02, -8.137e-02, 2.881e-01, 2.245e-01)); + r += mul(s3_8, M4(-3.721e-02, -5.194e-02, 1.918e-01, -7.738e-02, -1.546e-02, 5.603e-02, 7.840e-02, 3.734e-02, -1.114e-01, 1.450e-01, -1.754e-01, -2.606e-01, -9.938e-02, 1.193e-01, 1.560e-01, -2.439e-01)); + r += mul(s4_0, M4(-9.219e-03, 3.068e-02, -6.399e-02, -5.676e-02, 2.555e-01, 3.642e-02, 7.457e-02, -2.328e-02, 5.980e-02, -6.396e-03, 1.706e-01, -5.731e-03, -2.385e-01, -7.905e-02, -4.412e-02, -3.759e-02)); + r += mul(s4_1, M4(7.442e-02, 2.789e-02, -5.155e-02, 6.180e-02, -4.061e-02, -6.683e-02, 1.053e-01, 3.698e-02, -1.689e-01, -2.763e-01, 1.186e-01, 7.406e-02, -3.383e-01, -2.349e-02, -2.192e-02, -2.980e-02)); + r += mul(s4_2, M4(1.363e-02, -1.910e-02, 5.765e-03, -8.381e-02, -8.163e-02, -9.549e-03, -7.204e-03, -8.317e-03, 6.825e-02, -7.917e-02, -9.160e-02, 2.864e-02, 4.084e-03, -1.179e-01, -5.971e-02, 1.859e-02)); + r += mul(s4_3, M4(1.251e-01, 6.503e-02, -2.114e-01, -1.335e-01, 5.915e-02, 2.959e-02, 5.515e-03, -1.260e-01, -1.847e-01, 4.622e-02, 1.991e-01, 1.137e-01, 1.777e-01, 8.480e-02, -1.747e-01, -8.698e-02)); + r += mul(s4_4, M4(1.291e-01, -3.333e-01, -2.523e-02, 6.282e-02, -2.010e-01, -1.878e-01, 7.108e-02, 1.376e-01, -3.144e-01, -2.832e-01, 1.041e-01, -2.659e-01, -5.124e-02, 2.179e-01, -2.510e-01, 8.983e-02)); + r += mul(s4_5, M4(1.359e-01, -2.681e-01, 6.136e-02, 1.128e-01, 4.392e-02, -7.634e-02, 1.562e-02, 1.960e-02, -1.059e-01, -8.959e-02, 9.625e-02, 1.929e-01, -1.112e-01, -2.043e-01, 3.311e-02, 7.884e-02)); + r += mul(s4_6, M4(-5.216e-02, 1.000e-01, -2.716e-01, -1.806e-01, -1.624e-02, -3.480e-02, 6.681e-02, 3.609e-02, 8.244e-02, -6.571e-02, -4.160e-02, 1.384e-02, 9.817e-02, -6.976e-02, -1.353e-01, -8.585e-02)); + r += mul(s4_7, M4(-1.156e-01, 7.337e-02, 8.131e-02, 3.727e-02, 1.808e-01, 8.877e-02, -7.023e-02, -2.808e-01, 6.601e-02, 5.052e-02, -1.602e-01, 3.795e-02, -7.324e-02, -2.153e-02, -7.231e-02, 4.927e-02)); + r += mul(s4_8, M4(-1.597e-01, 9.291e-02, 1.072e-01, -9.688e-02, 1.202e-01, -9.313e-02, 2.052e-03, -6.283e-02, 1.234e-02, -4.641e-02, 1.124e-01, 7.310e-02, 5.806e-02, -1.393e-02, -7.467e-02, -1.365e-02)); + r += mul(s5_0, M4(1.908e-02, 4.101e-02, 7.300e-03, -1.589e-03, 1.602e-02, -8.488e-03, 5.971e-02, 7.128e-03, -1.286e-01, -1.413e-02, 4.143e-02, 4.473e-02, 3.487e-03, 2.195e-02, -3.393e-02, 2.150e-02)); + r += mul(s5_1, M4(6.465e-02, 1.069e-01, 4.920e-03, -1.181e-02, 2.109e-01, -6.762e-02, 9.279e-02, -8.565e-03, 6.348e-02, 1.019e-01, 3.998e-02, 3.639e-02, -1.348e-01, 2.041e-01, -5.174e-02, -1.375e-01)); + r += mul(s5_2, M4(-1.421e-02, 4.131e-02, -2.263e-02, -6.063e-02, 3.799e-02, -8.022e-02, 2.392e-02, -9.560e-03, 8.589e-03, -1.635e-02, -1.595e-02, -2.145e-02, 1.137e-02, 3.846e-02, -5.293e-02, 8.807e-02)); + r += mul(s5_3, M4(1.300e-01, 5.945e-02, 1.313e-02, 4.673e-02, -7.139e-02, 6.130e-02, -8.234e-02, -2.109e-01, 1.234e-01, -1.599e-02, 3.811e-02, -1.684e-01, -1.032e-01, -1.729e-01, 1.180e-01, 1.451e-01)); + r += mul(s5_4, M4(-2.139e-01, -1.261e-01, 5.155e-02, -3.438e-02, -9.973e-02, 5.261e-02, 1.968e-01, -2.858e-02, -1.402e-01, -7.740e-02, 2.029e-01, -1.669e-02, 9.150e-02, 1.662e-02, -7.390e-02, -1.764e-01)); + r += mul(s5_5, M4(-1.639e-02, 2.398e-02, 5.206e-02, -4.966e-02, -3.472e-02, -7.197e-02, 1.725e-01, -3.140e-02, 1.676e-02, -1.381e-01, 1.557e-01, 1.213e-01, -7.629e-02, -1.392e-01, 4.410e-02, 4.050e-02)); + r += mul(s5_6, M4(-1.096e-01, -7.978e-02, 3.590e-02, 8.377e-02, 1.031e-01, 1.100e-01, -5.918e-02, -7.414e-02, 8.954e-02, -1.134e-01, -5.441e-02, -3.733e-02, 8.487e-02, 1.935e-02, 3.119e-02, -7.440e-02)); + r += mul(s5_7, M4(1.882e-02, 2.669e-02, 7.765e-02, -6.490e-04, -1.474e-02, 1.028e-01, 1.065e-01, -6.083e-02, 1.412e-03, 1.229e-02, 9.548e-03, -1.022e-02, -3.959e-02, 3.008e-02, -8.053e-02, 2.315e-02)); + r += mul(s5_8, M4(-1.005e-01, -5.850e-02, 1.339e-01, -3.531e-03, -4.871e-02, 8.862e-03, -5.255e-03, -8.616e-02, 2.939e-02, -3.063e-02, 6.904e-02, 8.195e-02, -4.837e-02, -6.718e-02, 1.523e-01, 7.304e-02)); + r += mul(s6_0, M4(2.511e-01, -2.700e-02, -2.241e-01, -8.827e-02, 1.578e-03, -1.330e-01, -1.169e-01, 1.971e-01, 1.208e-02, -2.703e-02, 8.641e-02, 1.194e-02, 1.682e-02, 1.062e-01, 3.456e-02, -1.125e-01)); + r += mul(s6_1, M4(-1.913e-01, 2.695e-02, 1.756e-02, 6.275e-02, 9.474e-02, 2.234e-01, -2.228e-01, -1.051e-02, -5.410e-01, 1.036e-01, 5.839e-02, -1.927e-01, 5.608e-01, 7.018e-02, -5.304e-02, -3.249e-01)); + r += mul(s6_2, M4(6.880e-02, 5.915e-02, -1.394e-01, 7.292e-02, 7.694e-03, 1.793e-01, -3.022e-02, 4.487e-03, 1.501e-01, -6.532e-02, -4.614e-02, 3.067e-02, 2.152e-01, -3.339e-02, 1.689e-01, 5.163e-02)); + r += mul(s6_3, M4(2.106e-02, 1.292e-01, -5.325e-01, 1.742e-01, 1.928e-01, -1.107e-01, -1.024e-01, 1.384e-01, -3.115e-02, -1.027e-01, 1.363e-01, 6.820e-02, -1.583e-01, 6.273e-02, -1.063e-01, -2.276e-01)); + r += mul(s6_4, M4(-2.076e-01, 9.245e-02, -1.537e-01, 2.041e-01, -3.218e-01, -9.736e-03, 4.585e-02, 3.374e-01, -2.229e-01, 2.515e-01, -2.451e-01, -3.592e-01, 6.475e-01, 2.927e-01, 1.947e-02, -5.491e-01)); + r += mul(s6_5, M4(1.881e-01, 9.823e-02, -5.798e-01, 2.706e-01, -7.773e-03, 4.207e-01, -2.544e-01, -6.409e-02, 8.943e-02, 1.581e-01, -3.087e-02, 3.644e-02, 4.059e-01, 1.233e-01, 1.340e-01, -1.729e-02)); + r += mul(s6_6, M4(1.272e-01, -7.512e-02, -4.167e-01, 1.740e-01, 1.082e-01, -8.696e-05, 6.458e-02, 8.547e-02, -2.630e-02, 6.979e-02, 3.380e-02, 9.220e-02, 2.841e-01, -2.527e-02, 1.248e-01, -7.761e-03)); + r += mul(s6_7, M4(2.636e-01, 1.016e-01, -5.834e-02, 3.598e-02, 1.360e-01, -6.870e-02, 4.744e-03, 8.948e-02, -2.987e-01, 6.511e-02, -9.257e-02, -4.916e-02, -1.611e-01, -1.630e-01, 2.508e-01, 3.155e-01)); + r += mul(s6_8, M4(-2.714e-02, -4.710e-02, -7.061e-02, 1.471e-01, 1.043e-01, 3.127e-02, -1.498e-01, 1.127e-01, -7.893e-02, 4.654e-02, -2.941e-02, -5.514e-02, -1.395e-01, 1.096e-01, -1.843e-02, -1.769e-01)); + r += mul(s7_0, M4(-7.351e-02, -9.425e-03, -2.481e-02, -1.941e-02, 1.248e-01, -3.381e-02, -1.058e-01, -6.811e-02, 5.354e-03, -3.077e-02, 7.082e-02, -1.596e-03, -1.241e-01, -5.744e-02, 9.882e-02, 6.528e-02)); + r += mul(s7_1, M4(2.069e-01, 1.091e-01, 6.860e-02, -1.470e-01, 2.973e-02, -2.553e-02, -1.002e-01, 8.685e-02, -4.484e-02, -1.102e-01, 1.163e-01, -4.555e-02, -1.942e-02, -1.147e-02, -1.121e-01, -4.226e-02)); + r += mul(s7_2, M4(-8.667e-02, -6.287e-02, 7.794e-02, 3.801e-02, 2.144e-02, -3.184e-03, -7.759e-02, -3.430e-02, -6.115e-02, 8.789e-04, 4.944e-02, 6.660e-04, -5.836e-04, 2.528e-02, -8.120e-02, -7.806e-03)); + r += mul(s7_3, M4(1.657e-01, -3.697e-02, -7.059e-02, -4.885e-02, 7.071e-02, -4.343e-03, -2.486e-02, 1.618e-02, -4.309e-02, 7.969e-02, 5.391e-02, 6.220e-02, -1.250e-02, -3.509e-02, 7.260e-02, 8.836e-02)); + r += mul(s7_4, M4(-1.635e-01, 8.655e-03, 2.083e-01, 2.367e-01, 2.724e-02, 4.316e-02, -3.500e-02, 1.175e-01, -1.324e-01, 8.391e-02, 1.303e-01, 3.996e-02, 2.966e-02, 3.837e-02, 3.528e-02, -3.091e-02)); + r += mul(s7_5, M4(1.302e-02, 1.612e-01, -9.924e-02, -1.282e-01, 3.968e-02, 2.190e-01, -2.045e-01, -2.511e-01, 1.372e-02, 2.535e-02, 2.012e-02, 7.447e-02, 7.591e-03, 1.943e-02, 5.198e-02, 5.475e-02)); + r += mul(s7_6, M4(-1.832e-02, -2.806e-02, 3.148e-02, 3.680e-02, -2.261e-02, 9.937e-02, 2.641e-02, -8.156e-02, -6.391e-02, 1.383e-02, -1.494e-02, -3.854e-02, 9.237e-03, 1.985e-02, -6.267e-02, -2.064e-02)); + r += mul(s7_7, M4(-1.015e-02, -1.696e-03, -3.062e-02, -7.102e-02, 1.778e-02, 1.163e-02, 2.630e-03, -1.040e-01, -1.397e-02, 2.023e-03, -1.445e-01, -9.735e-02, 2.512e-02, 5.539e-03, -4.223e-02, -3.399e-02)); + r += mul(s7_8, M4(-5.911e-02, -5.396e-02, 3.260e-03, 1.271e-02, -4.968e-02, -5.689e-02, 1.541e-02, -1.444e-02, -2.694e-02, -2.971e-03, -7.396e-02, 7.005e-02, 4.195e-02, 1.648e-02, 2.096e-02, -1.043e-02)); + r += V4(-9.620e-03, -3.005e-03, 1.671e-02, 3.678e-03); + return r; +} + +V4 f1(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-1.851e-01, -4.425e-02, -1.296e-02, -1.750e-01, 5.089e-02, -6.421e-02, 1.176e-01, 8.044e-02, 2.377e-02, 6.474e-02, 9.873e-03, 9.184e-03, -7.470e-02, -1.489e-01, 1.416e-01, -1.896e-02)); + r += mul(s0_1, M4(-1.199e-01, 2.641e-01, 1.930e-01, 4.907e-01, -7.344e-02, -5.004e-02, -8.055e-02, -1.078e-02, 7.095e-02, -6.252e-02, -2.632e-02, -3.368e-02, 6.609e-03, 1.314e-01, 5.713e-02, 3.680e-01)); + r += mul(s0_2, M4(1.390e-01, -1.533e-02, -2.715e-01, -3.167e-02, 2.957e-02, -6.323e-02, -1.147e-02, -9.545e-02, -7.786e-02, -5.598e-02, -1.246e-02, -2.553e-02, -2.138e-01, 2.817e-01, 2.373e-01, -4.542e-02)); + r += mul(s0_3, M4(3.335e-01, 2.806e-01, -3.541e-01, -8.990e-01, -1.782e-02, -2.947e-02, 1.060e-01, 5.400e-02, -1.187e-01, 8.051e-02, 2.860e-02, 3.945e-02, -5.752e-02, 2.183e-01, 1.091e-01, 3.010e-01)); + r += mul(s0_4, M4(2.118e-01, -9.166e-01, 2.769e-01, -9.884e-01, -7.564e-03, 6.236e-02, -5.832e-02, -1.010e-01, -1.217e-02, 3.905e-02, -2.208e-01, -4.258e-02, 2.551e-01, 2.034e-01, 3.851e-01, -1.103e+00)); + r += mul(s0_5, M4(3.171e-01, -5.767e-01, -6.511e-01, 3.612e-01, -2.524e-02, -1.359e-01, -5.570e-02, -5.619e-03, -9.918e-02, 1.493e-01, 2.648e-01, 6.511e-02, 1.727e-01, -1.207e-01, -3.091e-01, 4.578e-01)); + r += mul(s0_6, M4(-1.468e-01, -6.237e-02, -1.201e-01, 1.999e-01, -7.051e-02, 1.615e-03, -2.254e-02, -2.706e-02, 8.809e-03, -3.437e-02, -6.647e-02, -6.118e-02, 4.269e-01, 1.911e-03, 3.764e-01, 2.219e-01)); + r += mul(s0_7, M4(-3.013e-01, -2.085e-01, 1.862e-01, -2.243e-01, 1.371e-01, 1.049e-01, 3.014e-02, 2.320e-01, 8.462e-02, -4.937e-04, 1.677e-01, 2.084e-01, 4.763e-01, 1.236e-01, 1.038e-01, 1.427e-01)); + r += mul(s0_8, M4(-8.250e-02, 1.199e-01, -1.917e-01, 1.713e-01, -2.901e-01, -2.251e-02, 2.543e-02, 7.192e-02, 7.725e-02, -6.247e-02, 1.014e-01, -8.146e-03, 2.485e-01, 9.060e-02, 1.734e-01, -4.235e-02)); + r += mul(s1_0, M4(1.510e-02, 8.534e-02, -1.256e-01, 2.189e-03, 9.642e-03, -3.459e-02, 6.241e-02, -9.895e-02, -9.687e-02, 6.979e-02, -1.456e-01, -8.158e-02, -8.378e-02, 7.961e-02, -3.521e-02, -2.195e-02)); + r += mul(s1_1, M4(2.153e-02, -1.841e-03, -7.239e-02, 1.259e-01, 4.431e-03, -6.453e-02, -9.590e-02, -2.068e-01, 9.783e-02, 2.137e-02, -6.300e-02, 1.256e-01, -5.519e-02, -1.348e-01, -1.007e-01, 2.611e-02)); + r += mul(s1_2, M4(-2.289e-02, 1.505e-02, -9.565e-02, -9.444e-02, 1.853e-02, -4.434e-03, 4.014e-02, -1.921e-01, -9.101e-02, 4.097e-02, 2.745e-01, -4.392e-02, -1.296e-01, 4.348e-02, 2.198e-02, 7.045e-02)); + r += mul(s1_3, M4(-2.575e-01, 6.324e-02, -8.278e-03, 4.785e-02, -3.651e-02, 3.326e-03, -4.598e-02, -5.095e-02, -2.492e-01, 1.092e-01, -1.840e-01, 2.782e-02, -1.246e-03, -4.282e-02, -6.877e-02, -2.206e-02)); + r += mul(s1_4, M4(1.184e-01, 2.659e-02, 1.701e-01, -2.271e-02, 2.266e-01, 2.369e-01, 1.755e-01, -1.267e-01, 2.627e-01, 3.871e-01, 1.716e-01, 8.503e-01, 5.393e-02, 1.675e-01, 3.168e-02, -3.640e-02)); + r += mul(s1_5, M4(-3.522e-01, 1.113e-01, 1.264e-01, -5.386e-02, -1.754e-01, 1.181e-01, 1.734e-01, -1.911e-01, -4.819e-01, -1.085e-01, 2.815e-01, 1.453e-01, 5.816e-02, -5.647e-03, 7.420e-02, -4.151e-02)); + r += mul(s1_6, M4(-1.874e-02, -8.346e-02, 3.685e-02, -7.575e-02, -4.982e-02, -3.935e-02, -2.556e-03, 1.423e-01, -2.015e-01, -2.308e-02, 5.985e-02, -1.632e-01, -5.075e-02, 1.870e-02, -8.252e-04, 2.759e-02)); + r += mul(s1_7, M4(-8.994e-02, -1.059e-01, -5.740e-03, -6.832e-02, 7.141e-02, -4.124e-02, 5.578e-02, 1.743e-02, 4.363e-02, -2.104e-01, 1.439e-01, -1.920e-01, 6.467e-02, -6.073e-02, -4.433e-02, 5.301e-02)); + r += mul(s1_8, M4(-4.437e-02, -1.887e-02, 5.984e-02, 4.283e-02, -1.120e-01, 2.971e-02, 2.586e-02, -1.201e-01, -1.510e-01, 5.116e-02, 5.325e-02, -2.019e-01, 2.296e-02, 3.367e-02, 6.640e-02, -2.484e-02)); + r += mul(s2_0, M4(-1.154e-01, -3.727e-02, 4.962e-02, -2.989e-01, 1.860e-02, -6.695e-02, 1.899e-01, 8.573e-03, -1.383e-03, 2.706e-02, -3.739e-02, -1.134e-01, -2.095e-02, 3.718e-02, 7.743e-02, -5.088e-02)); + r += mul(s2_1, M4(-3.608e-02, 7.123e-02, 1.076e-01, -7.700e-02, -3.791e-02, -1.535e-02, -1.460e-01, -9.970e-02, 4.157e-02, -6.670e-02, -2.439e-02, -1.401e-01, -2.776e-02, -8.079e-02, -1.439e-02, -5.680e-03)); + r += mul(s2_2, M4(3.343e-02, -3.126e-02, -4.215e-02, 3.148e-02, -1.017e-01, 6.599e-02, 8.057e-02, 8.994e-02, 8.925e-02, -1.281e-01, -1.496e-01, -2.940e-02, -2.018e-02, -5.284e-03, -2.517e-02, 1.505e-01)); + r += mul(s2_3, M4(5.484e-02, 1.543e-01, -9.173e-02, -1.284e-01, 2.570e-02, 3.504e-02, 1.456e-01, -8.890e-02, 4.839e-04, 5.335e-02, 3.747e-03, 1.087e-01, 1.775e-01, 4.767e-02, 7.708e-02, -3.248e-02)); + r += mul(s2_4, M4(-2.317e-01, 7.581e-02, 1.210e-01, -4.226e-03, -2.791e-02, -8.750e-02, -1.933e-01, 1.012e-01, -4.911e-02, 8.685e-03, -2.032e-02, -3.417e-02, 4.964e-03, -1.350e-01, 2.001e-02, -7.469e-03)); + r += mul(s2_5, M4(-1.299e-02, 4.379e-02, -5.396e-02, 4.428e-03, -1.233e-02, 4.362e-02, 2.401e-01, 7.475e-02, -1.050e-01, -3.944e-02, -1.340e-01, -1.165e-01, -6.201e-02, -6.557e-02, -1.916e-01, -5.014e-02)); + r += mul(s2_6, M4(-1.015e-01, -1.525e-01, -8.618e-02, -2.857e-03, -4.288e-03, 2.047e-02, -4.102e-02, 8.515e-02, 3.796e-02, 1.793e-02, -1.177e-02, 3.954e-02, -4.504e-02, -4.991e-02, 2.301e-02, 7.153e-02)); + r += mul(s2_7, M4(-3.917e-02, -1.842e-02, -6.262e-02, 1.534e-02, 2.883e-02, -1.888e-01, -5.097e-02, -4.846e-02, 1.489e-01, 1.533e-01, 4.138e-02, 1.724e-01, -1.702e-01, -5.663e-02, -1.019e-01, -1.328e-01)); + r += mul(s2_8, M4(1.018e-01, -5.588e-02, -1.930e-03, 8.572e-02, -6.390e-02, 1.678e-03, 3.503e-02, -4.689e-02, -9.708e-03, 8.473e-02, 2.030e-02, -3.910e-02, -6.516e-02, 7.146e-02, 2.815e-02, 2.361e-02)); + r += mul(s3_0, M4(-1.943e-01, 2.283e-03, 2.672e-02, -2.011e-01, 1.774e-02, -2.625e-02, 5.873e-02, 6.881e-02, 8.473e-03, -5.936e-02, -1.474e-01, -1.988e-03, -1.413e-01, -1.813e-03, 5.192e-02, 6.340e-02)); + r += mul(s3_1, M4(1.403e-02, 4.498e-02, -6.944e-02, 1.105e-01, 9.061e-02, -4.487e-02, 1.236e-01, -6.802e-02, 1.823e-02, 1.081e-01, 2.219e-02, 8.465e-02, 5.791e-02, -1.179e-01, -1.434e-01, 2.652e-01)); + r += mul(s3_2, M4(5.514e-02, 6.423e-02, -9.896e-02, 1.110e-01, -6.340e-03, 5.026e-03, -2.387e-02, 5.807e-02, 2.515e-02, -4.631e-04, -4.919e-02, -3.969e-02, -2.147e-01, 2.110e-01, 3.099e-01, 4.742e-02)); + r += mul(s3_3, M4(8.744e-02, 1.767e-01, -7.535e-05, -2.209e-02, 8.828e-02, 9.865e-02, -5.802e-02, -8.668e-02, -3.398e-02, 3.748e-02, -1.399e-01, -5.093e-02, 3.669e-01, 3.469e-02, -1.172e-01, 3.117e-01)); + r += mul(s3_4, M4(-2.595e-01, -1.440e-01, -1.141e-01, -2.532e-01, -1.192e-01, 2.156e-01, 4.248e-01, 3.467e-01, 3.341e-01, 3.922e-01, 8.266e-03, 2.721e-01, 3.318e-01, -8.631e-02, -3.512e-02, 6.408e-01)); + r += mul(s3_5, M4(-2.619e-02, -2.449e-04, -2.637e-02, -4.795e-02, -1.172e-01, -2.330e-02, 1.458e-01, 2.066e-03, -3.113e-02, 1.527e-01, -8.270e-02, 1.190e-01, -2.479e-01, -7.839e-02, 3.707e-02, -6.188e-04)); + r += mul(s3_6, M4(7.165e-02, 7.162e-02, -3.879e-02, 4.270e-02, 1.367e-01, 6.812e-02, 9.305e-02, 5.848e-02, -2.524e-01, 2.116e-01, -5.745e-02, -9.440e-02, 2.686e-01, 1.744e-01, 1.037e-01, 2.787e-01)); + r += mul(s3_7, M4(-7.360e-02, 5.454e-03, -2.180e-02, 1.877e-02, 2.010e-01, -2.632e-01, -2.253e-01, -2.037e-01, 3.199e-01, 2.561e-01, -7.339e-03, 2.001e-01, 2.209e-01, -9.087e-02, 2.985e-01, 1.805e-01)); + r += mul(s3_8, M4(-2.490e-02, 5.573e-02, -1.460e-02, -4.931e-02, 1.280e-02, -1.876e-02, 6.681e-02, -9.540e-02, -3.020e-02, 4.041e-01, 3.484e-01, 2.859e-01, -6.750e-02, -3.162e-02, -6.087e-02, 1.181e-01)); + r += mul(s4_0, M4(4.114e-02, 2.156e-02, 3.484e-02, 1.157e-01, -6.806e-02, -1.986e-01, 3.319e-02, -2.484e-02, -1.519e-01, 6.665e-02, -2.368e-01, 6.504e-02, -4.751e-02, 1.172e-01, 1.072e-01, 1.416e-01)); + r += mul(s4_1, M4(-3.483e-02, -8.210e-03, -5.584e-02, -2.905e-02, 3.782e-04, 2.407e-02, 6.459e-02, -5.554e-04, 7.566e-02, 6.572e-02, 1.876e-01, 1.694e-01, 1.467e-02, 2.151e-01, -3.089e-02, -3.616e-02)); + r += mul(s4_2, M4(-1.297e-02, 3.713e-03, 4.972e-02, -5.496e-02, 9.963e-02, 1.992e-02, 4.349e-02, -1.380e-01, -1.116e-01, 1.538e-01, 8.035e-02, -7.731e-02, -6.989e-02, 5.333e-02, 1.544e-01, -1.858e-01)); + r += mul(s4_3, M4(-9.309e-03, 1.125e-02, 4.129e-03, 7.425e-02, 5.974e-02, -1.624e-01, 2.433e-02, 5.115e-02, -4.260e-02, -2.221e-02, -9.451e-02, -1.544e-02, 2.424e-01, -2.633e-01, 1.835e-01, 8.455e-02)); + r += mul(s4_4, M4(2.690e-02, 3.714e-01, 1.985e-01, 2.515e-01, 5.585e-02, -1.168e-01, 1.335e-02, 3.549e-02, 1.684e-02, -1.506e-01, -6.873e-02, 2.926e-02, 1.050e-01, 1.381e-01, -9.192e-02, -1.441e-01)); + r += mul(s4_5, M4(3.613e-02, 2.025e-01, 2.172e-01, 1.357e-01, -8.527e-02, 6.962e-03, -9.127e-02, 6.487e-02, -9.093e-02, 1.070e-01, 3.577e-01, -1.280e-01, 1.199e-01, -1.240e-01, -2.633e-02, 1.482e-01)); + r += mul(s4_6, M4(1.900e-01, -1.009e-01, 8.051e-02, 1.877e-02, -4.018e-02, 5.551e-02, -6.814e-03, 1.446e-02, -1.889e-02, 1.077e-01, 6.959e-02, 6.740e-02, 2.197e-01, -2.703e-02, 1.179e-01, -1.687e-03)); + r += mul(s4_7, M4(1.679e-01, -1.207e-02, 2.712e-01, -1.008e-01, 6.575e-03, 9.142e-02, -1.550e-01, 3.974e-01, -1.676e-03, 1.305e-01, 8.865e-02, 7.105e-02, -1.234e-01, -1.420e-01, -8.748e-02, -7.283e-02)); + r += mul(s4_8, M4(2.725e-01, -6.153e-02, 4.981e-02, 1.774e-01, -9.073e-02, 6.040e-02, 9.336e-02, -7.679e-02, 1.834e-02, -1.102e-01, -1.968e-02, -3.985e-02, -4.841e-02, 3.740e-02, 3.600e-02, 6.039e-03)); + r += mul(s5_0, M4(1.158e-02, 2.884e-02, 4.734e-02, -4.314e-02, 2.771e-02, -9.670e-03, -4.776e-02, 4.941e-02, -2.571e-02, 1.174e-03, 1.968e-01, -8.499e-02, 6.964e-03, -1.313e-01, 8.917e-02, -1.986e-01)); + r += mul(s5_1, M4(4.028e-02, -1.396e-01, -9.028e-02, -1.018e-01, 2.001e-02, -2.781e-02, -3.648e-02, -3.024e-02, 1.685e-01, -9.134e-02, -2.649e-02, -7.201e-02, 5.048e-02, -5.481e-02, 2.729e-02, -2.042e-01)); + r += mul(s5_2, M4(3.310e-02, -8.450e-02, -2.617e-02, -2.513e-02, 4.769e-02, -1.087e-02, 2.853e-02, -7.859e-02, 5.306e-02, -5.234e-03, -6.802e-02, -9.789e-03, -1.707e-03, -4.896e-02, 6.068e-02, -3.022e-02)); + r += mul(s5_3, M4(-3.122e-02, 9.881e-02, -8.278e-02, -1.581e-01, -1.089e-02, -1.052e-01, 1.229e-01, 1.970e-01, -2.099e-01, -4.803e-01, -6.948e-02, 3.955e-02, 1.303e-01, -8.005e-02, -4.979e-02, -3.878e-02)); + r += mul(s5_4, M4(-9.817e-03, 2.285e-01, 1.675e-01, 3.270e-01, 3.366e-03, 1.700e-02, -2.087e-01, 1.093e-01, -2.263e-01, -1.546e-01, -4.074e-01, 3.933e-01, 1.169e-01, -1.683e-01, -1.159e-01, -1.172e-01)); + r += mul(s5_5, M4(-6.034e-02, 1.517e-01, 1.172e-01, 6.405e-03, -1.346e-01, -8.563e-02, 2.563e-03, 1.381e-01, -3.129e-02, 1.142e-02, 9.090e-02, -1.378e-03, 3.933e-02, 2.873e-02, -2.354e-02, 5.006e-02)); + r += mul(s5_6, M4(3.680e-02, -5.471e-02, -6.054e-02, -3.135e-01, 1.337e-01, 9.144e-03, 3.424e-02, 1.716e-01, 1.616e-01, 8.375e-02, 1.528e-01, 1.229e-01, -3.529e-02, 5.043e-02, 6.950e-02, 2.310e-01)); + r += mul(s5_7, M4(1.190e-01, 2.114e-01, 1.784e-01, 3.127e-01, 2.863e-02, -8.856e-03, -2.116e-01, 8.963e-02, 1.096e-01, -1.033e-01, -1.181e-01, -3.442e-02, -4.559e-02, 3.785e-02, -4.856e-02, 9.249e-02)); + r += mul(s5_8, M4(1.512e-01, -3.018e-01, 1.104e-01, 5.374e-02, 1.420e-01, -5.410e-02, -2.156e-02, 2.549e-02, -1.304e-01, 7.199e-02, -1.647e-02, -1.655e-02, -1.562e-02, -9.125e-03, 4.871e-02, 8.061e-02)); + r += mul(s6_0, M4(-1.661e-01, -7.401e-02, 2.991e-01, 3.378e-02, 8.224e-03, 2.133e-01, 1.556e-01, -8.104e-02, -3.602e-02, 1.171e-01, -1.558e-01, -2.589e-01, 5.025e-02, -3.294e-01, 8.721e-02, -9.232e-02)); + r += mul(s6_1, M4(-4.399e-02, -9.049e-02, -1.463e-01, 1.184e-03, -1.211e-02, -4.100e-01, -1.794e-01, -5.316e-01, -3.010e-02, -1.254e-01, -4.003e-02, 2.558e-01, 1.006e-01, -3.878e-01, 5.315e-02, -4.302e-01)); + r += mul(s6_2, M4(-6.827e-02, -7.814e-02, -1.883e-02, -7.352e-02, 5.799e-02, -2.375e-01, -1.946e-01, 2.344e-01, -3.900e-02, 1.998e-01, 3.617e-02, 3.397e-01, -3.544e-03, -1.710e-01, -2.681e-01, 3.032e-01)); + r += mul(s6_3, M4(-1.239e-02, -3.642e-01, 5.169e-01, 1.102e-01, -1.929e-01, -2.757e-01, 2.194e-01, 1.241e-02, 1.100e-02, 5.933e-02, -3.584e-02, 4.883e-02, 8.225e-02, -3.258e-01, -3.024e-01, -7.706e-02)); + r += mul(s6_4, M4(-1.048e-01, -2.233e-01, -4.194e-01, -1.971e-01, 3.057e-02, -5.247e-01, -3.971e-01, -7.568e-01, 4.288e-01, -4.538e-01, -1.061e-01, -4.279e-03, 3.848e-01, 6.533e-02, 1.332e-01, 6.273e-01)); + r += mul(s6_5, M4(-3.299e-01, 4.182e-01, 5.688e-02, -3.792e-01, 1.344e-01, -1.587e-01, -3.395e-01, -4.844e-01, -9.787e-02, 2.398e-01, 1.441e-01, -2.164e-01, -2.454e-01, -3.969e-01, 5.676e-02, 1.053e-01)); + r += mul(s6_6, M4(7.717e-02, 1.401e-01, 5.452e-02, 8.239e-02, -2.146e-01, -7.424e-02, -4.493e-02, 1.239e-01, -1.574e-01, -6.523e-02, 2.124e-02, 3.047e-02, -2.604e-02, -2.442e-01, 1.042e-01, 2.765e-01)); + r += mul(s6_7, M4(-2.414e-01, 3.261e-01, 4.907e-02, 1.913e-01, -1.530e-01, -2.334e-01, -2.100e-01, -3.092e-01, -3.491e-01, 8.934e-02, -1.828e-01, -2.946e-01, -2.928e-01, -3.750e-01, -1.567e-01, -5.165e-01)); + r += mul(s6_8, M4(-2.566e-01, 7.944e-03, -3.867e-02, 4.289e-02, -1.935e-01, 2.399e-01, -7.992e-02, -3.480e-01, 2.756e-01, -3.004e-01, -1.980e-01, 8.063e-02, 1.975e-01, -5.120e-01, -7.178e-01, -1.576e-01)); + r += mul(s7_0, M4(-5.313e-02, -9.675e-02, 8.447e-02, -1.015e-03, 4.811e-02, -5.155e-02, 1.174e-01, -3.531e-02, -5.847e-02, 2.552e-02, -3.431e-02, 9.081e-02, -1.513e-02, 4.855e-02, -5.698e-02, -1.104e-01)); + r += mul(s7_1, M4(2.220e-02, -2.069e-01, -3.894e-02, -1.384e-01, -3.986e-02, 6.346e-02, 5.772e-03, -5.374e-02, -6.286e-02, 4.130e-02, 7.041e-02, 5.773e-02, -6.073e-02, -4.835e-02, 6.096e-02, -5.045e-02)); + r += mul(s7_2, M4(-5.409e-02, -2.186e-02, -2.865e-02, 5.458e-02, 6.856e-02, -6.888e-02, -4.426e-02, -1.850e-02, -3.532e-02, 9.458e-02, 4.661e-02, 5.473e-02, -6.527e-03, 2.349e-02, 1.594e-02, 3.684e-02)); + r += mul(s7_3, M4(7.641e-02, 1.499e-01, 1.137e-01, 9.937e-02, 1.111e-01, -4.915e-02, 6.421e-02, -5.531e-02, -7.104e-02, -7.343e-02, 6.893e-03, 3.452e-02, 7.411e-04, 1.072e-03, -1.191e-02, 1.098e-01)); + r += mul(s7_4, M4(-1.380e-01, 1.221e-01, -2.653e-01, 1.543e-01, -7.499e-03, -1.484e-01, -6.812e-02, -1.438e-01, 1.563e-01, -9.350e-02, -5.984e-02, -1.608e-02, -1.048e-03, -3.701e-03, 1.823e-03, 1.252e-02)); + r += mul(s7_5, M4(-5.844e-02, 6.552e-02, -2.884e-04, -1.433e-01, 1.590e-01, 2.454e-02, -1.529e-02, 1.079e-01, -1.876e-02, -7.553e-02, -5.341e-02, 5.856e-02, 5.801e-02, -5.251e-02, -9.596e-02, -1.300e-02)); + r += mul(s7_6, M4(-3.389e-02, -4.335e-03, 6.620e-02, 1.189e-01, 5.442e-02, 6.087e-02, -7.007e-02, -6.704e-03, 4.338e-02, 6.597e-02, 5.637e-02, -3.489e-02, 1.003e-01, -1.031e-04, 1.344e-02, -2.442e-03)); + r += mul(s7_7, M4(3.731e-04, 2.007e-03, -2.524e-02, 2.764e-02, 1.374e-01, 9.564e-02, 2.084e-02, 2.440e-01, -7.477e-02, 1.743e-01, 1.243e-01, 5.556e-02, 9.613e-02, 4.185e-02, -2.427e-02, -5.286e-02)); + r += mul(s7_8, M4(1.166e-01, -1.165e-01, 4.113e-02, -1.206e-02, 3.121e-02, 2.477e-02, 3.920e-02, -3.340e-02, -7.050e-02, 9.544e-03, -1.030e-02, -1.385e-01, -4.626e-02, 1.883e-02, -3.286e-02, 6.743e-02)); + r += V4(-1.360e-02, 3.650e-03, -6.944e-03, -3.785e-03); + return r; +} + +V4 f2(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(1.154e-01, -1.985e-01, 1.499e-01, -3.340e-02, -1.705e-01, 1.114e-01, -9.974e-02, 3.990e-02, -6.327e-02, 9.178e-02, -5.247e-02, -4.332e-02, 1.879e-01, 6.154e-02, 1.950e-01, -1.546e-02)); + r += mul(s0_1, M4(-3.251e-01, 1.854e-01, -1.207e-01, 8.930e-03, 1.084e-01, 4.698e-02, -2.006e-01, -1.060e-01, -2.855e-02, -5.228e-02, 4.426e-02, -7.995e-02, 2.124e-01, 1.694e-01, -4.630e-02, -2.907e-01)); + r += mul(s0_2, M4(1.770e-01, -2.177e-02, -3.960e-02, -4.858e-03, 2.929e-02, -9.233e-02, -2.425e-02, -3.472e-02, -3.113e-02, 2.401e-02, 5.923e-02, -1.336e-02, -1.948e-02, 2.982e-01, 2.401e-01, -6.072e-02)); + r += mul(s0_3, M4(2.466e-01, -1.719e-01, -2.502e-01, -2.076e-01, 5.577e-02, 8.098e-02, 2.537e-02, 3.755e-02, 1.009e-01, 5.775e-02, -6.156e-02, 1.435e-01, 1.549e-01, 7.111e-02, 7.965e-02, 3.535e-02)); + r += mul(s0_4, M4(-3.845e-01, -4.311e-01, -9.531e-02, 1.549e-01, 1.925e-01, 1.959e-01, -4.525e-02, -1.145e-01, -1.287e-01, 3.548e-02, -2.069e-01, -3.321e-02, -5.058e-01, -5.712e-01, 2.665e-01, -1.251e-01)); + r += mul(s0_5, M4(-2.107e-01, -2.416e-01, 2.315e-01, 1.819e-01, -1.505e-01, -1.737e-01, -1.769e-01, 2.376e-01, 3.709e-02, -4.289e-03, -1.603e-01, 1.601e-01, 6.685e-02, -1.035e-02, 2.208e-01, 4.211e-01)); + r += mul(s0_6, M4(1.504e-02, 2.069e-01, -4.744e-02, -4.930e-02, 1.714e-02, -2.204e-02, -3.344e-02, 8.667e-02, -8.427e-02, -1.567e-02, 7.016e-03, 2.903e-02, -2.768e-01, 8.307e-02, 1.835e-01, 3.246e-02)); + r += mul(s0_7, M4(2.362e-01, 1.497e-01, -2.478e-02, 2.906e-01, -5.144e-02, -3.948e-02, -8.055e-02, 8.972e-02, -3.795e-02, -7.829e-02, 1.327e-01, -2.375e-02, 1.843e-01, 1.676e-02, 7.430e-02, -4.663e-02)); + r += mul(s0_8, M4(-4.038e-01, -8.562e-02, -2.718e-02, 6.020e-03, -2.424e-03, -8.278e-02, 9.951e-03, 2.370e-01, 1.352e-01, -5.401e-02, 2.332e-02, 9.735e-02, 2.579e-02, -2.907e-02, -1.644e-01, 5.503e-01)); + r += mul(s1_0, M4(-7.736e-02, 1.452e-02, -1.477e-01, 1.563e-02, -1.381e-01, -3.512e-02, -9.591e-03, 1.146e-01, 1.125e-01, 4.748e-02, -1.161e-01, 2.147e-02, 2.703e-03, 2.926e-02, 8.666e-03, -1.114e-01)); + r += mul(s1_1, M4(9.165e-02, 1.007e-01, 9.648e-03, -2.103e-01, 9.773e-02, -1.104e-01, 1.274e-01, 6.616e-02, 1.256e-01, -4.704e-03, -5.183e-02, 7.561e-03, -1.578e-02, -1.429e-01, -8.847e-03, -1.296e-01)); + r += mul(s1_2, M4(-6.068e-02, -1.243e-01, -1.991e-02, 9.462e-02, -1.522e-01, 6.658e-02, 7.342e-02, -8.660e-03, -5.382e-02, -5.284e-02, 1.034e-01, -2.342e-02, 1.933e-02, -1.654e-02, -5.903e-03, -5.457e-02)); + r += mul(s1_3, M4(-6.515e-02, 1.092e-01, 5.110e-02, -1.597e-01, 1.952e-02, 1.197e-02, -1.445e-01, 1.139e-01, -2.891e-02, -4.518e-02, -8.023e-02, 2.761e-02, 6.582e-02, 6.526e-03, -4.022e-02, 4.173e-02)); + r += mul(s1_4, M4(-3.641e-02, 2.065e-01, 2.426e-01, -1.669e-01, 1.970e-01, -9.693e-02, 1.057e-01, 8.536e-02, -1.529e-01, -7.039e-02, -6.987e-02, -2.977e-01, -1.966e-01, -7.779e-02, 5.828e-02, 2.423e-02)); + r += mul(s1_5, M4(-2.706e-02, 9.218e-02, -1.989e-02, -7.584e-02, -2.667e-01, -2.042e-01, -8.444e-02, 8.047e-02, 2.194e-01, -2.141e-03, -2.280e-01, -1.609e-01, 9.254e-02, 1.471e-03, -2.530e-02, 7.227e-03)); + r += mul(s1_6, M4(3.705e-02, 2.614e-02, 5.001e-02, 1.458e-01, -7.003e-02, 2.803e-03, 3.010e-02, 3.675e-02, -1.411e-01, -7.202e-02, 9.695e-02, -5.535e-02, 6.720e-03, 1.328e-01, -1.939e-02, 3.309e-02)); + r += mul(s1_7, M4(-8.033e-02, 3.550e-02, 4.386e-02, 7.473e-02, 4.803e-03, 5.806e-02, 6.359e-02, -4.416e-02, 1.404e-01, 2.763e-01, 2.265e-01, -7.626e-02, 8.332e-03, -1.466e-01, 1.343e-02, -1.013e-01)); + r += mul(s1_8, M4(1.662e-02, -4.509e-02, 2.532e-02, 6.410e-02, -1.172e-01, -4.649e-02, 6.102e-02, 5.086e-02, 1.754e-01, 6.016e-02, 5.396e-02, -1.824e-01, 1.560e-02, 8.324e-02, 3.164e-02, 7.181e-02)); + r += mul(s2_0, M4(-6.640e-02, -1.426e-01, 1.137e-01, 5.428e-03, -2.069e-01, 4.937e-02, 1.724e-01, 2.726e-02, -1.155e-02, -4.132e-02, -8.424e-02, 1.730e-03, -1.123e-02, 3.346e-02, 6.771e-02, -8.231e-03)); + r += mul(s2_1, M4(-1.062e-01, 3.203e-02, 8.230e-02, 7.972e-02, 7.404e-03, 1.401e-01, -1.138e-01, 1.447e-01, -1.044e-01, -1.311e-03, 7.789e-02, 7.804e-02, -3.355e-02, 1.654e-02, 7.310e-02, 6.201e-02)); + r += mul(s2_2, M4(-3.019e-02, -3.596e-02, 2.255e-02, -2.297e-02, 3.052e-03, 8.359e-02, -6.949e-02, -5.776e-02, 8.718e-02, 1.232e-01, 4.465e-02, 8.701e-04, 7.185e-02, -5.816e-02, -8.228e-02, 7.398e-02)); + r += mul(s2_3, M4(5.284e-02, -1.955e-01, -2.261e-01, -8.229e-02, -1.307e-02, -1.169e-02, 1.719e-02, 1.146e-03, -4.732e-02, 1.624e-02, 3.803e-03, -2.993e-02, -3.137e-02, -4.827e-02, -2.871e-02, 8.863e-02)); + r += mul(s2_4, M4(1.399e-02, -2.412e-02, -1.161e-01, -7.799e-02, 1.447e-01, 3.550e-02, 1.973e-01, 7.966e-02, -3.834e-02, 5.803e-02, 1.882e-02, -1.382e-01, -6.053e-02, -3.725e-02, 3.926e-02, -1.539e-01)); + r += mul(s2_5, M4(-5.312e-02, 4.702e-02, 4.705e-02, -1.199e-01, -4.658e-03, -1.364e-02, -8.581e-03, 7.523e-02, -9.700e-02, 4.502e-02, -3.235e-02, -5.661e-02, -3.437e-02, -9.407e-04, 6.316e-02, -8.778e-03)); + r += mul(s2_6, M4(-6.892e-02, 3.391e-02, 2.239e-02, 8.307e-02, -7.027e-02, -1.052e-01, -2.128e-02, 3.202e-02, 4.993e-02, 2.987e-02, 4.555e-02, -1.847e-02, 1.443e-02, 9.374e-02, 2.856e-02, 4.332e-02)); + r += mul(s2_7, M4(1.564e-03, 6.275e-02, 6.931e-02, 5.604e-02, 1.268e-01, 1.958e-01, 2.448e-02, -5.129e-03, -4.479e-03, -5.916e-02, 1.685e-02, 2.788e-02, 4.907e-02, 5.102e-02, -6.232e-02, -1.471e-01)); + r += mul(s2_8, M4(-4.005e-02, 3.995e-02, -5.486e-03, -7.590e-03, -5.829e-02, 8.440e-03, -2.257e-02, 5.725e-02, 7.811e-02, -3.087e-02, 1.459e-02, 7.373e-02, -8.110e-02, -4.362e-02, 9.073e-02, -1.205e-03)); + r += mul(s3_0, M4(5.996e-02, 2.559e-02, -4.335e-02, -1.921e-02, 3.060e-02, 4.734e-02, 3.138e-02, 4.786e-02, -5.547e-02, -1.006e-01, 6.969e-02, 2.517e-02, 1.450e-01, -1.965e-01, -2.166e-02, 5.454e-02)); + r += mul(s3_1, M4(-9.509e-02, 2.396e-01, -1.223e-01, 1.525e-01, 1.781e-02, 4.113e-02, 8.034e-02, 4.791e-02, -5.124e-02, 3.655e-02, 5.606e-02, -1.326e-01, 2.362e-01, -2.856e-01, 9.949e-02, -2.503e-03)); + r += mul(s3_2, M4(-2.826e-02, -4.316e-02, -6.645e-03, -9.037e-02, 2.881e-02, 1.849e-02, -2.980e-02, 6.783e-02, -3.966e-02, -1.189e-01, 2.440e-02, 1.622e-01, 1.795e-01, -2.550e-02, -1.020e-01, -2.077e-01)); + r += mul(s3_3, M4(2.792e-01, -1.974e-01, 7.530e-02, 1.101e-01, 1.597e-01, -8.238e-03, 1.060e-01, -1.239e-01, -3.282e-02, 2.198e-01, 2.315e-01, 1.032e-01, 3.121e-01, 1.830e-01, 1.565e-01, -1.057e-01)); + r += mul(s3_4, M4(-1.694e-01, 7.644e-02, 8.391e-02, 1.463e-01, -1.367e-01, 5.560e-02, 2.217e-01, -9.963e-02, 3.859e-01, 5.398e-01, 2.109e-01, -3.869e-01, 2.685e-01, 5.993e-01, 8.275e-01, -4.697e-01)); + r += mul(s3_5, M4(-1.178e-02, -1.160e-01, 6.509e-02, -3.215e-01, 8.458e-02, -3.025e-02, -2.700e-02, 1.391e-01, -9.935e-02, 1.111e-01, 2.960e-01, -1.086e-01, 1.861e-01, 1.874e-01, -1.004e-01, -1.994e-01)); + r += mul(s3_6, M4(-1.525e-01, -7.228e-02, 2.043e-02, -8.608e-02, -1.859e-01, 1.840e-01, -1.472e-02, -8.037e-02, 4.645e-02, -3.003e-02, -1.340e-01, 7.466e-03, 3.184e-01, 2.931e-01, 8.777e-03, -3.022e-01)); + r += mul(s3_7, M4(-2.205e-02, -6.896e-03, 8.011e-02, -1.185e-01, 3.310e-01, 1.849e-01, -1.434e-01, 3.598e-01, -1.459e-01, 1.145e-02, 4.120e-02, 5.183e-02, 2.295e-01, -3.073e-01, -1.620e-01, 5.568e-02)); + r += mul(s3_8, M4(-6.493e-02, 5.277e-02, 8.076e-02, -2.153e-01, -7.712e-03, 3.392e-02, -8.628e-02, -4.286e-02, 8.173e-02, 1.005e-01, -1.663e-02, 1.694e-01, -8.667e-02, 2.390e-02, -9.287e-02, 4.230e-01)); + r += mul(s4_0, M4(-2.535e-02, 7.364e-02, -3.215e-02, 4.371e-02, 1.397e-01, -6.697e-02, 2.961e-02, 2.035e-02, 2.170e-01, -6.461e-02, -2.757e-02, -6.409e-02, 6.608e-02, 1.919e-01, 9.635e-03, 1.185e-01)); + r += mul(s4_1, M4(-9.423e-03, -1.002e-01, -4.713e-02, -5.427e-02, 4.230e-02, 6.388e-02, 6.406e-02, 5.379e-02, 1.912e-01, -2.114e-02, 3.427e-02, -1.870e-01, -9.313e-02, 2.295e-01, -2.073e-02, -5.200e-02)); + r += mul(s4_2, M4(2.578e-03, -1.141e-01, 6.690e-03, 2.978e-02, -4.502e-03, -8.770e-04, -3.174e-02, 2.535e-02, -1.870e-01, -8.949e-02, 2.078e-02, -9.413e-02, -8.965e-02, 1.744e-02, -4.550e-02, -4.648e-02)); + r += mul(s4_3, M4(-9.328e-02, 1.079e-01, 1.978e-02, -1.923e-01, 1.085e-01, -6.612e-02, 4.103e-02, -3.044e-02, 3.967e-02, 1.013e-01, 1.862e-01, -1.381e-01, -1.094e-02, 5.844e-02, 3.528e-02, 1.830e-01)); + r += mul(s4_4, M4(6.287e-02, 1.220e-01, 1.360e-01, -1.083e-01, -1.495e-01, 2.206e-01, -2.363e-01, 2.418e-01, -8.528e-02, 3.689e-01, 1.967e-01, 9.816e-02, -2.394e-01, -3.554e-01, -6.090e-02, 1.320e-01)); + r += mul(s4_5, M4(-2.292e-02, -7.498e-02, 6.930e-02, -1.607e-03, 1.009e-01, -5.481e-02, 9.314e-02, -7.166e-02, -9.101e-03, 9.149e-03, 4.943e-02, -5.215e-02, -8.129e-02, 1.033e-01, 1.182e-02, 1.077e-01)); + r += mul(s4_6, M4(-5.504e-02, 9.136e-02, 1.641e-01, 4.553e-02, 6.292e-02, -6.497e-02, -1.033e-01, -4.378e-02, -6.554e-02, -1.832e-01, 2.845e-02, 1.938e-02, -3.586e-02, 1.955e-01, 2.876e-02, -3.387e-02)); + r += mul(s4_7, M4(3.816e-02, 1.257e-01, 1.176e-01, 1.315e-02, -6.209e-02, -7.614e-03, -2.597e-02, 1.052e-01, -3.444e-02, -8.019e-02, 1.353e-01, 6.694e-02, 1.535e-01, -4.052e-02, -3.827e-02, -1.347e-01)); + r += mul(s4_8, M4(9.157e-02, 6.265e-02, -1.309e-01, 4.060e-01, 1.959e-01, -2.986e-02, -1.577e-01, -3.929e-01, 1.190e-02, 4.277e-02, 1.645e-02, 1.027e-02, -1.224e-01, -6.421e-02, -3.139e-02, 1.453e-01)); + r += mul(s5_0, M4(-1.302e-01, 3.300e-02, 6.960e-03, 3.966e-02, 8.696e-02, -6.568e-03, 1.117e-02, -5.805e-02, -1.110e-01, -5.196e-03, -2.877e-02, 1.780e-01, 6.423e-02, -9.575e-03, 7.860e-02, 1.108e-01)); + r += mul(s5_1, M4(-9.273e-03, 2.335e-02, 4.001e-02, -4.611e-02, 1.594e-01, -8.232e-02, 8.274e-02, 3.317e-02, 1.149e-01, -1.097e-01, -2.183e-03, -5.485e-04, -1.422e-02, 2.953e-02, -2.611e-02, 2.156e-02)); + r += mul(s5_2, M4(1.851e-02, -1.381e-02, 1.401e-02, 3.595e-02, 1.079e-01, -1.405e-01, 3.376e-02, 4.824e-03, -4.003e-02, -2.315e-02, 3.456e-02, -4.590e-02, -7.153e-02, -5.812e-02, 5.591e-02, -7.371e-02)); + r += mul(s5_3, M4(6.266e-02, -6.022e-02, 1.909e-02, -9.669e-02, -1.710e-01, 1.155e-01, 1.624e-01, -3.687e-02, 3.599e-02, -9.302e-02, 5.482e-02, -1.785e-02, 1.419e-01, -6.523e-02, -2.334e-01, 2.313e-01)); + r += mul(s5_4, M4(1.499e-02, 2.946e-01, 3.317e-02, -1.004e-02, 1.402e-01, -5.913e-02, -3.612e-01, 6.792e-02, 7.166e-02, 1.300e-01, 4.334e-02, 2.055e-02, -5.005e-02, -3.802e-01, -1.309e-01, 2.824e-01)); + r += mul(s5_5, M4(-3.209e-02, 1.013e-01, -3.733e-02, 6.260e-02, 1.285e-01, -2.924e-02, 5.652e-02, -1.114e-01, 4.553e-02, -9.548e-05, -4.586e-02, -1.267e-01, -5.062e-02, -7.563e-02, 3.300e-02, 1.982e-03)); + r += mul(s5_6, M4(-3.837e-02, 1.041e-02, -8.579e-02, 3.184e-02, 1.004e-01, -5.789e-03, 5.265e-02, 1.051e-01, 9.106e-02, -1.191e-01, -5.411e-02, -6.687e-02, -4.547e-03, -1.372e-01, -2.608e-02, -1.647e-02)); + r += mul(s5_7, M4(-6.538e-02, -2.211e-01, -2.886e-02, 3.342e-01, 2.763e-01, -1.112e-03, -3.350e-02, -5.897e-02, 9.749e-02, 5.000e-02, -1.087e-01, -1.115e-01, 1.179e-01, -2.407e-01, 2.304e-02, -5.334e-02)); + r += mul(s5_8, M4(1.509e-01, 3.522e-02, -4.966e-02, 1.525e-01, -9.950e-03, 5.831e-02, -2.597e-02, 5.006e-02, 1.811e-01, 6.085e-02, -2.301e-02, -1.797e-01, 3.146e-02, -3.496e-02, 5.519e-02, -4.698e-02)); + r += mul(s6_0, M4(-3.889e-01, 8.472e-02, 3.466e-01, -2.317e-02, -3.272e-01, -8.978e-03, 2.403e-01, -8.252e-02, 8.031e-02, 5.331e-02, -1.362e-01, 4.599e-02, -7.745e-01, 5.237e-03, -3.595e-02, 1.151e-02)); + r += mul(s6_1, M4(-4.438e-02, 1.434e-01, -2.854e-01, 8.344e-02, -2.194e-01, -1.053e-01, 3.440e-01, -1.755e-01, 1.965e-01, 2.596e-01, -2.437e-01, 2.639e-02, 8.182e-02, -6.142e-01, 5.269e-01, 1.076e-01)); + r += mul(s6_2, M4(4.176e-02, -1.379e-02, -2.602e-02, -1.157e-01, 1.066e-01, 1.188e-01, 1.506e-01, -1.939e-01, -6.532e-02, 1.515e-01, -6.209e-02, -5.568e-02, -2.508e-01, 7.956e-02, -6.839e-03, -7.680e-02)); + r += mul(s6_3, M4(-5.274e-01, 1.574e-01, 2.322e-02, 1.974e-01, -2.015e-01, -4.006e-02, -4.281e-02, 6.102e-02, -8.254e-02, 2.448e-02, -1.601e-01, 6.131e-02, 6.199e-02, 4.952e-02, -3.097e-01, 4.143e-01)); + r += mul(s6_4, M4(-1.786e-01, 2.494e-01, 1.251e-01, 9.363e-02, -1.613e-01, 1.808e-01, -6.279e-01, 5.140e-01, -2.397e-01, -3.454e-02, -1.753e-01, 3.366e-01, -4.295e-01, -8.298e-02, -3.088e-01, -2.506e-01)); + r += mul(s6_5, M4(-5.745e-01, -2.340e-03, 4.310e-02, 1.359e-01, -9.361e-02, 1.619e-01, -1.893e-01, 2.686e-01, 2.511e-01, 3.182e-02, 2.292e-02, -1.272e-01, 1.148e-01, 3.345e-01, -5.757e-01, -2.783e-01)); + r += mul(s6_6, M4(2.996e-01, -1.552e-01, 1.382e-01, 3.307e-01, 9.571e-02, -1.282e-02, -7.687e-02, -2.027e-02, -1.476e-02, 3.399e-02, -1.134e-01, -2.647e-02, -1.429e-01, -7.036e-02, -1.513e-02, 3.024e-02)); + r += mul(s6_7, M4(-6.036e-01, -1.425e-01, 1.056e-01, -4.375e-01, -3.845e-01, 1.217e-01, -2.882e-01, 3.131e-01, 1.087e-01, -1.809e-01, -4.599e-02, -1.999e-02, 1.257e-01, 2.246e-01, -1.548e-01, -1.252e-01)); + r += mul(s6_8, M4(-9.834e-02, 9.684e-02, 7.735e-02, 6.983e-02, 1.036e-01, 1.324e-01, 1.711e-01, -3.028e-01, -2.124e-02, -3.839e-02, 6.275e-02, -6.320e-02, -1.567e-01, 1.782e-01, -1.595e-01, 5.094e-01)); + r += mul(s7_0, M4(-6.443e-02, -5.409e-02, -9.004e-02, 8.554e-02, 1.222e-02, 6.177e-02, 9.452e-02, -1.811e-03, 2.774e-03, -8.285e-03, -4.119e-02, -2.120e-02, 4.556e-02, 2.671e-02, -7.488e-02, 3.807e-02)); + r += mul(s7_1, M4(7.269e-02, -9.661e-02, 7.214e-03, 1.116e-01, -6.318e-02, -7.593e-02, -7.289e-03, 1.131e-01, 1.499e-01, 9.402e-02, -4.967e-02, -1.259e-02, -5.367e-02, -7.372e-02, 8.031e-02, -3.618e-02)); + r += mul(s7_2, M4(6.442e-03, -3.003e-02, -1.879e-02, 6.275e-02, 8.840e-02, 5.896e-02, 6.386e-02, -2.205e-02, -4.846e-02, 6.194e-02, -7.356e-02, -3.447e-03, -1.864e-02, -4.320e-02, -1.732e-02, -4.979e-02)); + r += mul(s7_3, M4(2.765e-02, 4.141e-02, 2.696e-02, -5.018e-02, 3.907e-02, -7.082e-02, 9.419e-02, -8.741e-03, 1.573e-01, 9.473e-02, 4.708e-02, -1.652e-02, 1.502e-02, 8.182e-02, -1.322e-02, 3.526e-02)); + r += mul(s7_4, M4(-1.474e-01, -3.990e-02, -1.310e-01, -5.310e-02, 1.340e-01, -1.109e-02, -1.248e-01, 8.321e-02, -1.425e-01, -5.966e-02, -1.426e-01, -1.162e-03, 5.641e-02, 2.371e-03, 1.682e-02, -4.745e-03)); + r += mul(s7_5, M4(-3.767e-03, 1.891e-02, 2.372e-03, -1.110e-01, 1.951e-02, -4.606e-02, -1.608e-01, 2.397e-01, -7.490e-02, -3.436e-02, 2.068e-02, -1.087e-01, -1.346e-01, 4.235e-02, 1.825e-02, 6.811e-02)); + r += mul(s7_6, M4(-2.091e-02, 1.196e-02, -2.033e-02, 8.187e-02, 6.749e-02, -3.418e-02, -3.065e-04, -8.559e-02, -6.455e-02, 8.523e-02, 7.157e-02, 2.214e-02, -1.851e-02, -2.486e-04, 3.343e-02, 5.581e-02)); + r += mul(s7_7, M4(-5.703e-03, 5.631e-02, -2.922e-02, 1.219e-01, 2.548e-02, -1.005e-01, -1.114e-01, -9.546e-02, -2.900e-02, 5.282e-02, 1.550e-01, -1.171e-02, -3.671e-03, 2.578e-02, 1.132e-02, -1.251e-03)); + r += mul(s7_8, M4(-2.153e-02, 3.114e-02, -2.612e-02, 1.743e-01, 3.585e-02, -2.815e-02, 2.412e-02, -4.767e-02, -1.490e-01, 2.185e-02, 8.061e-02, 8.901e-02, 2.930e-02, -3.864e-03, -4.137e-05, -8.294e-02)); + r += V4(-3.055e-03, 8.217e-04, 1.986e-04, -1.878e-02); + return r; +} + +V4 f3(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-1.929e-02, 1.394e-02, -1.029e-01, 2.892e-01, 4.374e-02, 6.804e-02, -1.009e-02, 3.317e-02, 6.233e-02, -6.770e-02, 6.294e-02, 9.080e-02, 1.315e-01, 2.016e-02, 1.460e-01, -2.511e-01)); + r += mul(s0_1, M4(1.536e-01, 7.006e-02, 1.478e-01, -1.093e-01, -6.266e-02, 1.507e-02, 5.591e-02, 4.596e-02, 1.262e-02, -6.441e-02, 7.968e-03, -7.319e-02, -4.285e-01, 4.255e-01, 6.450e-02, -2.665e-01)); + r += mul(s0_2, M4(-3.394e-01, 2.370e-02, -1.853e-01, 4.372e-02, -6.294e-02, 6.183e-02, 1.800e-02, 1.802e-03, 2.202e-02, -3.171e-02, -1.361e-02, 8.976e-03, -9.553e-02, 4.330e-02, 1.193e-01, -2.788e-02)); + r += mul(s0_3, M4(-6.521e-01, 1.263e-01, -2.676e-01, 6.885e-01, -7.121e-02, 7.531e-02, -2.154e-02, -4.210e-02, 5.622e-02, -4.680e-02, 1.068e-01, 3.298e-02, -1.073e-01, 1.729e-01, -6.696e-02, 4.533e-01)); + r += mul(s0_4, M4(1.685e-01, 2.405e-01, -1.513e-01, -2.889e-01, -5.371e-01, -4.868e-01, -3.566e-01, -9.242e-02, 2.206e-01, -1.275e-01, 2.622e-01, 1.606e-01, -4.582e-01, 1.417e+00, -7.227e-01, -1.538e-01)); + r += mul(s0_5, M4(1.065e-01, 6.979e-02, 1.696e-02, 5.949e-02, -7.888e-02, 1.250e-01, -1.149e-02, 5.212e-03, -5.860e-02, 1.635e-04, -1.013e-01, 2.759e-02, -2.364e-01, 2.244e-01, -3.560e-01, 2.910e-01)); + r += mul(s0_6, M4(-4.975e-02, -9.110e-02, -2.293e-01, 3.099e-01, -6.053e-03, -1.695e-03, 1.976e-02, 2.727e-02, -5.408e-02, -1.152e-02, 7.005e-02, 3.262e-03, 1.176e-01, 1.129e-01, 2.885e-01, -6.376e-02)); + r += mul(s0_7, M4(3.176e-02, -1.691e-02, -2.270e-01, -1.639e-01, 1.829e-02, 1.531e-02, 1.670e-01, -2.879e-02, -7.558e-02, 1.134e-02, -7.440e-02, 1.989e-02, -6.936e-01, 2.447e-01, -4.170e-01, -1.200e-01)); + r += mul(s0_8, M4(-9.140e-02, 9.945e-02, -1.102e-01, 1.411e-01, -4.055e-03, 4.229e-02, 8.477e-02, -4.669e-03, -9.157e-02, 1.788e-02, -1.170e-01, -1.028e-04, -1.183e-01, 7.345e-02, -2.036e-01, 1.127e-01)); + r += mul(s1_0, M4(6.494e-03, -8.688e-02, 7.673e-02, 5.917e-02, 1.075e-01, -4.407e-02, -1.117e-01, 1.813e-01, 1.302e-01, -7.901e-02, 1.289e-01, 2.643e-01, -9.625e-02, 2.704e-02, 7.501e-03, 3.876e-02)); + r += mul(s1_1, M4(7.495e-02, -4.704e-02, -2.103e-03, -2.250e-02, 3.552e-02, 5.431e-02, 1.374e-01, -1.099e-01, 1.235e-01, 8.284e-02, 1.965e-01, -3.252e-01, -5.457e-02, 4.518e-02, 2.164e-02, -2.932e-02)); + r += mul(s1_2, M4(3.765e-02, 3.760e-02, 2.836e-02, -1.903e-02, 2.096e-01, 5.725e-02, 9.411e-02, -6.930e-02, 1.475e-01, -8.083e-02, -2.270e-02, -1.851e-02, -1.210e-02, -5.534e-02, 3.330e-02, -2.178e-02)); + r += mul(s1_3, M4(-5.579e-02, -1.761e-01, 1.940e-01, -1.588e-03, -1.796e-02, -1.910e-02, -2.752e-02, 3.096e-01, -2.540e-02, -1.123e-01, 1.989e-01, -1.469e-01, 1.753e-01, 9.378e-03, -3.200e-02, -4.680e-02)); + r += mul(s1_4, M4(-1.698e-01, 6.087e-02, -1.699e-01, 4.775e-02, -1.398e-01, 4.084e-02, 1.978e-01, 2.140e-02, -3.981e-01, -4.084e-01, 7.406e-01, 3.177e-02, 3.568e-02, 1.043e-02, 7.653e-02, -6.814e-02)); + r += mul(s1_5, M4(-6.348e-02, -1.269e-01, -4.933e-02, -6.444e-02, -4.170e-02, 8.089e-02, -7.447e-02, -2.348e-01, 1.053e-01, -8.449e-02, 7.375e-02, 3.311e-02, -3.556e-03, -1.869e-02, -1.145e-01, 7.772e-02)); + r += mul(s1_6, M4(1.427e-01, -5.258e-02, 1.594e-01, -6.412e-02, -3.988e-03, -6.896e-02, 3.285e-02, 2.957e-02, -8.045e-02, -8.518e-02, -3.740e-02, 1.324e-02, -5.752e-02, -2.155e-02, 8.845e-02, -2.719e-02)); + r += mul(s1_7, M4(6.319e-02, -1.372e-01, 5.411e-02, -1.137e-02, -1.919e-03, 3.565e-03, 6.239e-02, 2.035e-02, 1.491e-01, -3.921e-02, -2.202e-01, 1.100e-01, 6.417e-02, 3.860e-02, -9.892e-02, 4.096e-02)); + r += mul(s1_8, M4(-1.877e-02, -8.548e-03, -9.893e-03, 8.239e-02, -1.252e-01, 6.837e-02, -4.214e-02, -1.122e-01, -1.549e-01, -8.251e-02, -1.850e-02, 6.051e-02, -1.606e-02, -4.278e-02, 7.242e-03, 3.119e-02)); + r += mul(s2_0, M4(2.938e-02, 6.311e-03, -1.603e-02, 1.864e-01, 2.389e-02, -7.010e-02, -1.969e-02, 1.665e-01, -8.765e-03, 3.094e-02, -7.212e-02, 9.473e-02, -9.279e-02, 4.196e-02, -6.420e-02, -1.139e-02)); + r += mul(s2_1, M4(-6.522e-02, 3.284e-02, 6.400e-03, -6.888e-02, 1.214e-01, 4.339e-02, -4.605e-02, -1.347e-02, -5.231e-02, -4.723e-02, 5.547e-02, 4.327e-04, 3.641e-02, 1.037e-01, -3.036e-02, -5.208e-02)); + r += mul(s2_2, M4(5.624e-02, -4.202e-02, -7.348e-03, 8.454e-02, -1.246e-02, -3.614e-02, -4.076e-02, 3.926e-02, 7.292e-02, -1.052e-02, 1.421e-01, -1.122e-01, 5.749e-02, 7.618e-03, 7.279e-02, 3.060e-02)); + r += mul(s2_3, M4(-3.719e-02, 8.886e-02, -2.164e-01, 1.742e-01, 1.479e-01, 8.478e-02, -2.363e-01, 2.324e-01, -7.640e-02, 3.614e-02, -1.143e-02, -4.378e-02, 7.800e-02, 1.697e-02, 2.702e-02, -6.870e-02)); + r += mul(s2_4, M4(7.121e-03, 5.612e-02, -1.539e-02, -1.779e-01, -2.794e-01, 5.596e-02, -6.104e-03, -4.248e-01, 4.653e-02, -5.111e-02, 4.138e-02, -5.634e-02, 2.431e-02, -1.374e-01, 1.631e-01, 8.579e-02)); + r += mul(s2_5, M4(-7.348e-02, -2.786e-02, -5.249e-02, 8.804e-02, 1.323e-02, -8.938e-03, -5.376e-02, 1.981e-02, 7.637e-02, -1.045e-02, 4.240e-02, -3.250e-02, 3.613e-02, -7.318e-02, 1.206e-01, 5.736e-02)); + r += mul(s2_6, M4(-1.362e-01, -4.425e-03, -6.220e-02, -1.334e-02, -1.092e-01, -4.584e-02, -1.233e-01, -6.446e-02, 1.995e-02, 1.654e-02, 9.213e-02, -4.404e-02, 4.236e-02, -2.820e-02, 2.746e-02, -2.553e-02)); + r += mul(s2_7, M4(-6.418e-02, 4.919e-03, 1.203e-02, -1.571e-01, 1.260e-01, -1.607e-02, 2.401e-01, -8.348e-02, 2.950e-02, -2.530e-02, -4.351e-03, 2.585e-02, -1.479e-01, -2.062e-02, -5.796e-02, 1.788e-02)); + r += mul(s2_8, M4(6.063e-02, -8.423e-03, -2.582e-02, 1.009e-01, -2.646e-02, -2.565e-02, -3.990e-03, 7.251e-02, 7.221e-02, -1.586e-02, 3.092e-02, -5.658e-02, 8.470e-02, -9.544e-02, 6.901e-02, 3.920e-02)); + r += mul(s3_0, M4(2.115e-02, -8.124e-03, -2.608e-02, -7.437e-02, -1.013e-01, -1.921e-03, -2.710e-02, 4.266e-02, -1.688e-02, 7.936e-02, 1.422e-01, -1.240e-01, -2.660e-01, 2.149e-01, -1.288e-01, -8.502e-02)); + r += mul(s3_1, M4(3.215e-01, -2.627e-02, 1.900e-01, -6.555e-02, 5.407e-02, 2.532e-02, -8.633e-02, -6.194e-02, -1.221e-01, 5.269e-03, 4.452e-02, -1.678e-02, -1.882e-01, 7.496e-02, 9.751e-02, -1.519e-02)); + r += mul(s3_2, M4(7.334e-03, -3.815e-02, 3.329e-02, -4.134e-02, 6.074e-02, -1.149e-02, -1.718e-02, 1.138e-01, 2.585e-02, 3.471e-03, 3.192e-02, -5.751e-02, -2.387e-01, -6.247e-02, -1.428e-01, 1.758e-01)); + r += mul(s3_3, M4(-8.371e-02, 1.729e-01, -4.040e-02, 7.848e-03, 3.826e-02, 1.037e-01, 3.446e-01, -1.630e-01, 1.937e-01, -2.246e-02, 2.290e-01, -3.674e-01, -3.557e-01, -9.400e-02, 8.883e-02, -2.473e-01)); + r += mul(s3_4, M4(4.022e-02, 9.074e-02, 3.186e-01, -2.781e-01, -2.178e-01, 1.871e-01, 2.181e-01, -1.682e-01, -2.982e-01, -1.465e-01, 1.422e-01, -2.944e-01, -4.263e-01, -3.463e-01, -1.279e-01, 5.540e-02)); + r += mul(s3_5, M4(5.062e-03, 2.637e-02, -6.406e-02, 2.344e-02, -2.716e-02, 4.376e-02, -1.275e-02, 1.372e-01, -9.199e-02, -6.601e-02, -1.921e-01, 1.098e-01, -2.245e-01, 4.797e-02, -3.830e-02, -9.858e-02)); + r += mul(s3_6, M4(-7.698e-02, -1.355e-02, -6.104e-03, -5.110e-02, -1.172e-01, 2.314e-02, -1.717e-01, 4.721e-02, -4.435e-02, -9.955e-03, -7.747e-03, 1.264e-02, 8.600e-02, -8.934e-02, 3.089e-01, -2.826e-01)); + r += mul(s3_7, M4(2.209e-01, -2.247e-02, 1.127e-01, -1.381e-01, -1.893e-02, -1.863e-02, -1.433e-01, -1.005e-01, 3.568e-01, 1.667e-01, 6.082e-01, -2.027e-01, -4.644e-02, 7.690e-02, -2.035e-01, 7.185e-02)); + r += mul(s3_8, M4(3.511e-02, -4.453e-02, 5.640e-02, 6.786e-03, -9.863e-02, 3.650e-02, 1.515e-03, 9.665e-02, 3.349e-03, 5.730e-02, 2.440e-01, 5.529e-02, -9.132e-03, 1.216e-01, 1.038e-01, 1.600e-01)); + r += mul(s4_0, M4(1.456e-02, 1.803e-02, -3.595e-02, 7.360e-02, -3.576e-02, 1.153e-02, 1.893e-02, -6.975e-02, -2.245e-02, -4.034e-03, 1.824e-01, -1.271e-01, 1.824e-01, 6.083e-02, -1.168e-02, 6.473e-02)); + r += mul(s4_1, M4(2.423e-02, 1.714e-02, -2.532e-02, -2.726e-03, 1.654e-01, -1.382e-02, -9.903e-03, 3.748e-02, 1.648e-02, 1.015e-01, 3.709e-02, -6.161e-02, 1.033e-02, 5.414e-02, 7.422e-02, 7.323e-02)); + r += mul(s4_2, M4(-1.186e-02, 6.384e-02, 2.749e-02, 4.222e-02, -3.260e-02, -1.220e-02, 1.434e-02, -5.661e-02, -9.468e-02, -3.613e-02, -1.145e-01, 2.334e-02, 9.387e-02, -5.652e-02, -1.897e-02, 2.035e-02)); + r += mul(s4_3, M4(-8.724e-02, 4.730e-02, 1.411e-01, -2.486e-01, -9.238e-03, 1.033e-01, -2.847e-02, 1.085e-03, -6.764e-02, -7.273e-02, 1.216e-01, -1.953e-01, 2.037e-01, 1.383e-01, -1.154e-01, -9.102e-03)); + r += mul(s4_4, M4(-3.881e-01, -8.371e-02, 5.415e-02, -5.053e-02, 6.264e-02, 5.022e-02, -1.208e-01, 1.725e-01, 1.402e-01, -1.852e-01, 1.642e-01, 1.540e-01, -6.915e-03, 3.961e-02, -7.876e-02, -1.696e-01)); + r += mul(s4_5, M4(-4.428e-02, -2.901e-02, -1.489e-01, 1.314e-01, -8.217e-02, -3.771e-02, 2.933e-02, -1.317e-01, -9.995e-02, -1.362e-01, -1.978e-01, -4.783e-02, 4.732e-02, -7.175e-02, -1.323e-02, 2.203e-01)); + r += mul(s4_6, M4(2.074e-01, 5.412e-02, 2.316e-01, -1.630e-01, -1.077e-01, 7.548e-02, -1.094e-01, 3.166e-02, 1.419e-02, 3.955e-02, -5.825e-03, -3.774e-02, -8.126e-02, 3.387e-03, -3.478e-02, 6.284e-02)); + r += mul(s4_7, M4(-1.209e-01, -4.387e-03, -2.495e-01, -2.842e-02, 2.790e-01, 4.301e-03, 2.841e-01, -5.945e-02, 2.642e-01, -4.255e-04, 8.720e-02, -1.297e-01, -2.182e-01, 2.956e-03, -1.868e-01, 1.557e-03)); + r += mul(s4_8, M4(-5.167e-02, 2.543e-02, -3.688e-02, 2.518e-01, -1.135e-01, -4.912e-02, -1.333e-01, -8.341e-02, -8.503e-02, 1.235e-02, -1.045e-01, 5.429e-02, -1.481e-02, -2.261e-02, -5.317e-02, 8.046e-04)); + r += mul(s5_0, M4(-4.787e-02, 2.142e-02, -3.906e-02, 1.847e-02, -8.494e-02, 6.585e-03, -1.889e-02, -2.740e-02, 3.385e-02, 7.995e-03, 1.826e-02, -1.367e-01, 1.279e-01, 5.466e-02, -3.254e-02, -4.132e-03)); + r += mul(s5_1, M4(-1.343e-02, 2.381e-03, 6.909e-02, -5.667e-02, -6.099e-02, -5.946e-02, -9.307e-02, 3.245e-02, -6.459e-02, 7.934e-02, -1.250e-02, -2.810e-02, -4.333e-02, -6.090e-05, 8.321e-02, -5.979e-02)); + r += mul(s5_2, M4(6.584e-02, 4.673e-02, 4.752e-02, -2.226e-02, -1.202e-02, -6.762e-02, -1.710e-02, -4.154e-02, -4.673e-02, -3.560e-02, -3.847e-03, 8.072e-02, -1.030e-02, 1.828e-02, 3.360e-02, -5.665e-02)); + r += mul(s5_3, M4(9.618e-02, -6.697e-02, 5.786e-02, -1.769e-02, 6.292e-02, 6.496e-02, -5.166e-02, -1.268e-01, 1.838e-01, -5.380e-02, -1.049e-01, -2.942e-01, -8.008e-02, 1.163e-01, -2.147e-01, 8.550e-02)); + r += mul(s5_4, M4(1.806e-01, -2.214e-02, 1.480e-01, -4.695e-03, -2.015e-01, 4.037e-02, -2.033e-01, 9.411e-02, -1.514e-01, -1.609e-02, 1.584e-01, 9.198e-02, 3.643e-01, 1.669e-01, 5.255e-02, -5.626e-02)); + r += mul(s5_5, M4(-3.640e-02, -7.449e-02, 4.916e-02, -3.708e-02, 3.561e-02, -6.471e-02, 6.061e-02, 1.204e-01, -7.679e-03, -4.449e-02, -1.074e-01, 5.020e-02, -1.304e-02, 1.463e-02, -1.400e-02, 7.025e-02)); + r += mul(s5_6, M4(-6.186e-02, 2.234e-02, -2.843e-02, 9.581e-02, 2.966e-02, 7.306e-02, -7.263e-02, 2.891e-02, -4.971e-02, 4.807e-02, -7.351e-02, -2.457e-02, -6.424e-03, 4.141e-02, -2.535e-02, -8.942e-03)); + r += mul(s5_7, M4(-1.253e-01, 3.679e-02, -4.725e-02, -4.554e-02, -1.710e-02, 5.232e-02, -4.381e-04, -1.350e-01, -2.596e-03, 2.879e-02, -8.824e-02, -1.344e-02, -1.887e-02, -1.858e-02, 1.976e-02, -9.516e-02)); + r += mul(s5_8, M4(-1.535e-02, 4.001e-02, 2.514e-02, 1.360e-01, 3.558e-02, -1.636e-02, 3.687e-03, 1.382e-01, -7.037e-02, -6.769e-03, -4.821e-02, -9.504e-03, -1.632e-02, -4.082e-02, -4.551e-02, 8.719e-02)); + r += mul(s6_0, M4(3.314e-01, -1.421e-01, -1.206e-02, 1.993e-01, -1.283e-01, -1.398e-01, -6.857e-02, -4.534e-03, 1.774e-01, 3.379e-03, 1.985e-03, 8.964e-03, -3.737e-01, 4.491e-02, -8.822e-02, -8.766e-02)); + r += mul(s6_1, M4(1.706e-01, 1.010e-01, 6.570e-02, 3.344e-01, -2.310e-01, -2.290e-01, 1.214e-02, 1.429e-01, 6.835e-02, 1.687e-01, 3.769e-02, 8.285e-02, -5.040e-01, -8.710e-02, -2.200e-01, -2.363e-01)); + r += mul(s6_2, M4(1.107e-01, 4.987e-02, 6.279e-02, 6.233e-02, -7.785e-02, -8.975e-02, 9.166e-02, -1.674e-01, 4.368e-02, -1.147e-01, -9.301e-02, 2.696e-03, 1.017e-01, 7.177e-02, 1.267e-01, 7.352e-02)); + r += mul(s6_3, M4(8.419e-01, 1.557e-01, -1.064e-01, 3.449e-01, 1.228e-01, -6.586e-02, -3.389e-01, 4.428e-01, 3.516e-02, 9.812e-04, -1.527e-01, 3.165e-01, 2.210e-01, 1.391e-01, 2.527e-01, 7.654e-01)); + r += mul(s6_4, M4(-7.380e-02, 2.066e-02, 1.157e-01, 3.417e-01, 6.235e-01, 2.678e-01, -4.457e-03, 7.970e-01, 4.932e-01, 1.805e-01, 1.979e-01, -1.145e-01, 8.089e-01, 1.208e-01, 6.427e-01, 4.596e-01)); + r += mul(s6_5, M4(1.512e-01, 4.153e-02, -1.349e-02, -3.943e-01, 1.621e-01, 2.125e-01, 3.478e-01, -2.117e-01, -4.187e-01, -1.377e-01, -2.767e-01, -3.075e-01, -3.716e-01, 1.678e-02, -7.506e-02, -7.046e-02)); + r += mul(s6_6, M4(-5.645e-04, 8.539e-02, 1.192e-02, 1.301e-01, -5.319e-02, 1.275e-02, -1.687e-01, 2.101e-01, 1.096e-01, -2.104e-04, -1.130e-01, -1.952e-03, 1.334e-02, -4.353e-02, -8.794e-02, 3.036e-02)); + r += mul(s6_7, M4(2.405e-01, -1.602e-02, 1.442e-01, -2.301e-01, 5.157e-01, -2.357e-03, 1.410e-02, 2.979e-01, -4.966e-02, 1.288e-01, 7.233e-02, -1.980e-01, -1.339e-01, 9.085e-02, -2.666e-01, 5.901e-02)); + r += mul(s6_8, M4(-1.635e-01, -1.742e-02, -7.872e-04, -3.437e-02, -5.201e-02, -7.742e-02, 1.519e-01, -3.565e-01, 1.847e-01, 7.361e-02, 2.874e-02, 5.474e-02, -1.476e-01, 1.268e-01, 1.097e-01, 1.250e-01)); + r += mul(s7_0, M4(-2.977e-02, 1.180e-01, -1.144e-01, -2.712e-02, 2.344e-02, 3.005e-02, -5.376e-02, 2.245e-02, -1.964e-02, -3.806e-02, 5.948e-02, -3.850e-02, 8.518e-02, 2.359e-02, 3.988e-02, 3.925e-02)); + r += mul(s7_1, M4(-7.016e-02, 5.264e-02, -1.546e-02, 1.149e-02, -7.637e-02, 5.961e-02, -1.217e-01, 8.794e-02, 4.621e-02, -2.797e-02, -8.991e-05, 1.274e-01, -3.130e-02, 9.594e-02, 9.378e-02, -2.204e-02)); + r += mul(s7_2, M4(6.668e-02, 1.219e-02, 2.202e-02, 2.572e-02, 3.076e-02, 3.448e-02, -1.584e-02, 7.644e-03, -5.237e-02, 1.070e-02, 8.137e-03, 4.005e-02, -7.023e-02, -3.941e-03, -7.663e-02, 1.537e-02)); + r += mul(s7_3, M4(8.858e-02, 5.080e-02, -2.043e-01, 6.574e-02, -5.817e-02, 9.694e-02, -1.094e-01, -1.146e-01, -4.703e-02, 7.113e-02, -2.575e-02, 5.163e-03, -4.438e-02, 2.622e-02, -2.860e-02, 1.962e-02)); + r += mul(s7_4, M4(1.332e-01, -1.357e-01, 1.993e-01, 1.685e-01, 5.237e-02, 3.852e-02, -1.314e-01, 1.839e-01, 1.229e-02, 5.550e-03, -2.378e-02, -4.422e-02, 3.551e-02, -4.724e-02, -2.718e-02, -6.719e-02)); + r += mul(s7_5, M4(-1.227e-01, -1.223e-02, 3.191e-02, -1.237e-01, -4.575e-02, 8.884e-02, 8.201e-02, -4.919e-02, 6.765e-02, -1.065e-02, -4.379e-02, 3.344e-02, 1.195e-02, 1.224e-02, -4.593e-02, 1.547e-02)); + r += mul(s7_6, M4(-2.574e-02, 7.691e-03, -9.264e-02, 7.526e-02, -1.241e-02, 3.506e-02, 8.149e-03, -8.028e-02, 9.684e-02, -4.999e-03, 1.119e-01, -1.116e-01, -7.561e-03, 3.837e-02, 5.530e-02, -5.594e-02)); + r += mul(s7_7, M4(-2.481e-02, 5.517e-02, -8.307e-02, -1.765e-02, 1.868e-02, 1.927e-02, 4.930e-02, 3.460e-02, 2.957e-02, 3.232e-02, -4.537e-02, -8.795e-02, -4.719e-02, 1.410e-02, -2.081e-02, -8.162e-02)); + r += mul(s7_8, M4(7.341e-03, 6.469e-02, 2.905e-02, -1.249e-02, 7.263e-03, -2.017e-02, 8.103e-04, -4.192e-02, -3.527e-02, -8.213e-03, 2.403e-02, -6.824e-02, 6.086e-02, -2.941e-02, 3.362e-03, 1.645e-02)); + r += V4(9.541e-03, -6.427e-03, 9.772e-03, -2.560e-03); + return r; +} + +void Pass4(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = Rmp8x8(tid.x) + blockStart; + uint2 size = GetInputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = (gxy + 0.5) * pt; + + V4 s0_0 = l0(-1.0, -1.0); + V4 s0_1 = l0(0.0, -1.0); + V4 s0_2 = l0(1.0, -1.0); + V4 s0_3 = l0(-1.0, 0.0); + V4 s0_4 = l0(0.0, 0.0); + V4 s0_5 = l0(1.0, 0.0); + V4 s0_6 = l0(-1.0, 1.0); + V4 s0_7 = l0(0.0, 1.0); + V4 s0_8 = l0(1.0, 1.0); + V4 s1_0 = -max(-s0_0, 0.0); + V4 s1_1 = -max(-s0_1, 0.0); + V4 s1_2 = -max(-s0_2, 0.0); + V4 s1_3 = -max(-s0_3, 0.0); + V4 s1_4 = -max(-s0_4, 0.0); + V4 s1_5 = -max(-s0_5, 0.0); + V4 s1_6 = -max(-s0_6, 0.0); + V4 s1_7 = -max(-s0_7, 0.0); + V4 s1_8 = -max(-s0_8, 0.0); + s0_0 = max(s0_0, 0.0); + s0_1 = max(s0_1, 0.0); + s0_2 = max(s0_2, 0.0); + s0_3 = max(s0_3, 0.0); + s0_4 = max(s0_4, 0.0); + s0_5 = max(s0_5, 0.0); + s0_6 = max(s0_6, 0.0); + s0_7 = max(s0_7, 0.0); + s0_8 = max(s0_8, 0.0); + + V4 s2_0 = l1(-1.0, -1.0); + V4 s2_1 = l1(0.0, -1.0); + V4 s2_2 = l1(1.0, -1.0); + V4 s2_3 = l1(-1.0, 0.0); + V4 s2_4 = l1(0.0, 0.0); + V4 s2_5 = l1(1.0, 0.0); + V4 s2_6 = l1(-1.0, 1.0); + V4 s2_7 = l1(0.0, 1.0); + V4 s2_8 = l1(1.0, 1.0); + V4 s3_0 = -max(-s2_0, 0.0); + V4 s3_1 = -max(-s2_1, 0.0); + V4 s3_2 = -max(-s2_2, 0.0); + V4 s3_3 = -max(-s2_3, 0.0); + V4 s3_4 = -max(-s2_4, 0.0); + V4 s3_5 = -max(-s2_5, 0.0); + V4 s3_6 = -max(-s2_6, 0.0); + V4 s3_7 = -max(-s2_7, 0.0); + V4 s3_8 = -max(-s2_8, 0.0); + s2_0 = max(s2_0, 0.0); + s2_1 = max(s2_1, 0.0); + s2_2 = max(s2_2, 0.0); + s2_3 = max(s2_3, 0.0); + s2_4 = max(s2_4, 0.0); + s2_5 = max(s2_5, 0.0); + s2_6 = max(s2_6, 0.0); + s2_7 = max(s2_7, 0.0); + s2_8 = max(s2_8, 0.0); + + V4 s4_0 = l2(-1.0, -1.0); + V4 s4_1 = l2(0.0, -1.0); + V4 s4_2 = l2(1.0, -1.0); + V4 s4_3 = l2(-1.0, 0.0); + V4 s4_4 = l2(0.0, 0.0); + V4 s4_5 = l2(1.0, 0.0); + V4 s4_6 = l2(-1.0, 1.0); + V4 s4_7 = l2(0.0, 1.0); + V4 s4_8 = l2(1.0, 1.0); + V4 s5_0 = -max(-s4_0, 0.0); + V4 s5_1 = -max(-s4_1, 0.0); + V4 s5_2 = -max(-s4_2, 0.0); + V4 s5_3 = -max(-s4_3, 0.0); + V4 s5_4 = -max(-s4_4, 0.0); + V4 s5_5 = -max(-s4_5, 0.0); + V4 s5_6 = -max(-s4_6, 0.0); + V4 s5_7 = -max(-s4_7, 0.0); + V4 s5_8 = -max(-s4_8, 0.0); + s4_0 = max(s4_0, 0.0); + s4_1 = max(s4_1, 0.0); + s4_2 = max(s4_2, 0.0); + s4_3 = max(s4_3, 0.0); + s4_4 = max(s4_4, 0.0); + s4_5 = max(s4_5, 0.0); + s4_6 = max(s4_6, 0.0); + s4_7 = max(s4_7, 0.0); + s4_8 = max(s4_8, 0.0); + + V4 s6_0 = l3(-1.0, -1.0); + V4 s6_1 = l3(0.0, -1.0); + V4 s6_2 = l3(1.0, -1.0); + V4 s6_3 = l3(-1.0, 0.0); + V4 s6_4 = l3(0.0, 0.0); + V4 s6_5 = l3(1.0, 0.0); + V4 s6_6 = l3(-1.0, 1.0); + V4 s6_7 = l3(0.0, 1.0); + V4 s6_8 = l3(1.0, 1.0); + V4 s7_0 = -max(-s6_0, 0.0); + V4 s7_1 = -max(-s6_1, 0.0); + V4 s7_2 = -max(-s6_2, 0.0); + V4 s7_3 = -max(-s6_3, 0.0); + V4 s7_4 = -max(-s6_4, 0.0); + V4 s7_5 = -max(-s6_5, 0.0); + V4 s7_6 = -max(-s6_6, 0.0); + V4 s7_7 = -max(-s6_7, 0.0); + V4 s7_8 = -max(-s6_8, 0.0); + s6_0 = max(s6_0, 0.0); + s6_1 = max(s6_1, 0.0); + s6_2 = max(s6_2, 0.0); + s6_3 = max(s6_3, 0.0); + s6_4 = max(s6_4, 0.0); + s6_5 = max(s6_5, 0.0); + s6_6 = max(s6_6, 0.0); + s6_7 = max(s6_7, 0.0); + s6_8 = max(s6_8, 0.0); + + t4[gxy] = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t5[gxy] = f1(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t6[gxy] = f2(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t7[gxy] = f3(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); +} + +//!PASS 5 +//!DESC conv4 +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 +//!IN t4, t5, t6, t7 +//!OUT t0, t1, t2, t3 + +#define l0(x, y) V4(O(t4, float2(x, y))) +#define l1(x, y) V4(O(t5, float2(x, y))) +#define l2(x, y) V4(O(t6, float2(x, y))) +#define l3(x, y) V4(O(t7, float2(x, y))) + +V4 f0(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(1.035e-01, -3.131e-02, -1.683e-02, 6.132e-02, 7.106e-02, 8.530e-02, 3.712e-02, 2.200e-02, 5.484e-02, -2.405e-02, 3.609e-03, 2.484e-02, -1.239e-02, 3.143e-02, -1.143e-03, 5.853e-02)); + r += mul(s0_1, M4(-6.852e-03, -5.276e-02, -1.574e-02, -7.396e-03, -5.895e-03, 2.645e-01, 6.641e-02, 8.550e-02, 8.407e-02, -5.343e-02, -2.788e-02, -2.786e-02, -5.168e-02, 4.419e-03, 8.365e-02, -2.581e-02)); + r += mul(s0_2, M4(4.320e-03, 4.378e-02, 6.773e-02, 4.165e-02, 6.133e-04, 3.012e-02, -1.258e-02, 9.748e-02, -2.418e-02, 4.472e-02, 5.103e-02, 1.214e-02, 1.352e-02, -2.460e-02, -4.003e-03, -1.377e-02)); + r += mul(s0_3, M4(2.667e-01, 9.762e-02, 5.992e-02, -3.087e-02, 3.817e-02, -3.431e-02, 2.540e-02, -1.875e-03, 9.802e-02, 6.589e-02, 5.863e-02, -1.504e-02, 9.547e-02, 9.985e-02, -3.192e-02, -4.271e-03)); + r += mul(s0_4, M4(-1.698e-01, 2.632e-01, -5.454e-03, -7.862e-02, 1.375e-01, -3.125e-01, 9.081e-03, 9.557e-02, 8.478e-02, 2.898e-02, -1.091e-01, -8.330e-02, 6.596e-02, 2.710e-02, 1.680e-01, 1.788e-01)); + r += mul(s0_5, M4(-9.017e-03, 6.888e-02, 6.141e-02, 1.776e-02, -1.655e-02, -6.601e-03, 3.162e-01, 1.655e-01, 8.691e-03, -6.128e-02, 3.331e-02, 9.702e-03, 1.413e-02, -7.276e-02, 5.032e-02, -1.593e-01)); + r += mul(s0_6, M4(1.046e-01, -5.227e-02, 5.895e-02, -3.235e-02, 6.427e-02, 3.331e-02, 5.590e-02, 2.335e-02, -1.632e-02, -1.411e-01, 1.116e-01, 3.695e-02, -2.561e-02, -1.120e-02, 5.754e-02, -1.682e-03)); + r += mul(s0_7, M4(8.318e-02, -7.579e-02, 8.523e-02, 1.695e-01, 1.272e-01, 3.044e-01, 9.789e-02, 2.895e-02, 8.045e-02, -1.118e-01, 1.189e-01, 4.772e-02, 3.643e-02, 1.177e-02, 9.985e-02, -5.121e-02)); + r += mul(s0_8, M4(-5.202e-02, -6.098e-02, 1.816e-01, -1.054e-01, -1.061e-02, 7.545e-02, 1.807e-01, 1.109e-01, 2.225e-02, 4.505e-02, -1.468e-02, -1.591e-02, 4.481e-02, 8.765e-02, 7.746e-02, 1.284e-01)); + r += mul(s1_0, M4(-2.938e-02, 5.927e-02, -1.109e-03, -6.546e-04, -4.689e-03, 5.730e-02, -1.717e-02, 1.489e-02, 4.013e-02, 1.947e-02, 2.004e-02, -3.337e-02, -7.947e-02, 1.191e-01, -3.596e-03, 1.463e-02)); + r += mul(s1_1, M4(5.920e-02, 4.055e-02, -1.927e-02, 5.889e-02, -2.832e-02, 1.920e-02, 8.304e-03, -1.604e-02, 5.066e-02, 2.033e-02, -4.666e-02, 1.436e-01, -4.947e-02, 2.174e-01, -1.265e-03, -7.555e-03)); + r += mul(s1_2, M4(-2.522e-02, 8.095e-03, -1.292e-02, -4.297e-02, -2.803e-03, 2.694e-03, 9.495e-03, 4.633e-03, -5.493e-03, 2.904e-02, -5.570e-02, -5.671e-02, 1.625e-02, 3.008e-03, -7.597e-02, 4.828e-02)); + r += mul(s1_3, M4(-2.861e-02, -7.359e-02, -3.017e-02, -6.939e-03, -9.235e-02, -4.895e-02, 3.907e-02, -1.481e-02, -3.577e-02, -1.057e-01, -1.420e-02, -3.991e-02, -3.386e-02, 8.669e-02, 1.668e-02, -6.214e-03)); + r += mul(s1_4, M4(4.040e-02, -2.914e-02, 4.031e-02, -1.132e-01, -2.109e-02, 3.115e-02, -1.246e-01, -2.000e-02, 1.326e-02, 1.058e-01, -8.576e-02, -1.588e-01, -4.464e-01, -2.079e-01, 2.685e-01, 1.333e-01)); + r += mul(s1_5, M4(-2.591e-02, 3.814e-02, -3.386e-02, -9.743e-02, 4.114e-02, -3.478e-02, 6.425e-02, -3.640e-02, -8.821e-03, -3.544e-02, -5.167e-02, -2.047e-04, -2.015e-03, -1.694e-02, -1.662e-02, -3.549e-01)); + r += mul(s1_6, M4(4.528e-02, -1.449e-01, 9.702e-03, 1.420e-03, -3.255e-02, -1.604e-02, -3.173e-02, 1.473e-02, -2.362e-03, -1.247e-01, 3.800e-02, -4.005e-03, -4.589e-02, -4.932e-03, -6.621e-02, -5.870e-03)); + r += mul(s1_7, M4(2.555e-02, 4.944e-02, -1.997e-02, -3.789e-02, -6.467e-02, -7.647e-02, 2.485e-01, 2.307e-02, 9.054e-02, -1.921e-01, -1.510e-02, 1.256e-01, -6.435e-02, -3.311e-01, -1.668e-01, -8.547e-03)); + r += mul(s1_8, M4(-5.899e-03, -9.739e-02, -9.003e-03, -1.285e-01, 3.565e-02, 5.708e-02, 5.470e-03, 6.773e-02, -3.124e-02, -1.481e-02, 6.026e-02, -6.631e-02, 5.404e-02, 2.347e-01, -7.943e-02, 5.130e-02)); + r += mul(s2_0, M4(4.027e-02, 6.051e-02, -1.822e-02, 1.411e-01, -4.953e-02, -2.818e-02, 1.410e-02, 1.730e-02, -1.016e-01, -5.901e-02, -4.021e-02, -6.473e-02, 2.396e-02, -3.431e-02, 3.567e-02, -5.546e-02)); + r += mul(s2_1, M4(-1.226e-01, 6.911e-02, 2.438e-02, 3.790e-01, 2.273e-02, -9.692e-02, -6.908e-02, -6.222e-02, -2.884e-02, 4.129e-02, 3.012e-02, -2.219e-02, -4.559e-02, 4.080e-02, -1.208e-02, -1.721e-01)); + r += mul(s2_2, M4(1.698e-02, -5.581e-02, -1.028e-01, -2.648e-01, -2.852e-02, -4.793e-02, 3.531e-02, 4.713e-02, 6.749e-03, -2.892e-02, 1.004e-03, -8.385e-02, 3.496e-03, 7.913e-03, 3.682e-02, 4.875e-02)); + r += mul(s2_3, M4(-8.191e-02, -2.076e-02, -3.883e-03, -6.020e-03, -4.486e-02, 1.603e-01, -5.054e-02, 1.925e-02, -1.880e-01, -1.032e-01, 9.008e-02, 1.290e-01, -1.580e-01, -1.112e-02, 2.247e-02, 4.732e-02)); + r += mul(s2_4, M4(-1.828e-02, -1.797e-01, 1.553e-01, 1.716e-01, 1.113e-01, 2.362e-01, -2.680e-01, -3.383e-03, -1.252e-01, 6.608e-02, -2.373e-01, -7.700e-02, -2.883e-01, 9.044e-02, 4.293e-01, 9.977e-02)); + r += mul(s2_5, M4(-8.041e-03, 2.502e-02, 6.603e-02, 1.422e-01, -5.744e-02, 2.975e-03, -3.393e-02, 2.418e-01, 3.547e-02, 1.473e-03, -5.479e-03, 2.087e-01, 9.054e-02, -5.279e-02, -2.166e-01, -3.318e-01)); + r += mul(s2_6, M4(-5.745e-02, 5.943e-02, 3.035e-02, 9.155e-03, -2.198e-02, 1.365e-02, 4.023e-04, -9.323e-03, -5.497e-02, -1.600e-02, -3.127e-02, -2.707e-02, -4.076e-02, -6.445e-02, -1.111e-01, -2.571e-02)); + r += mul(s2_7, M4(-3.950e-02, -7.730e-02, 1.813e-02, -4.415e-02, 5.548e-02, -9.475e-02, -8.720e-02, 5.763e-02, -8.685e-02, 2.206e-01, 2.090e-01, 2.510e-02, -3.670e-02, -2.902e-01, 3.033e-01, 4.140e-02)); + r += mul(s2_8, M4(4.482e-02, 8.381e-02, 2.472e-01, 6.329e-02, 1.484e-02, -3.689e-02, -1.033e-01, -1.513e-01, -4.236e-03, -1.259e-02, -3.677e-02, -4.812e-02, 4.726e-02, -3.249e-02, -2.763e-02, -1.101e-01)); + r += mul(s3_0, M4(-3.101e-02, 4.627e-02, 1.449e-02, -3.616e-03, -5.091e-02, 6.408e-02, 1.786e-02, -1.482e-02, -3.041e-02, 3.234e-02, -1.162e-02, -2.272e-02, 7.108e-03, -9.229e-03, 2.850e-02, 1.415e-02)); + r += mul(s3_1, M4(-5.226e-02, 1.188e-01, 5.643e-02, 6.820e-02, 6.848e-03, 8.559e-02, 4.529e-02, 9.235e-02, -2.974e-03, -2.439e-02, 1.520e-02, 9.824e-03, -5.821e-02, 2.097e-02, 8.484e-03, 5.340e-03)); + r += mul(s3_2, M4(1.145e-02, -3.415e-02, -3.814e-02, -1.144e-01, 2.474e-03, 2.845e-02, 5.365e-02, 2.777e-02, -7.355e-03, 4.104e-03, -4.118e-02, -3.890e-02, 1.295e-02, -1.091e-02, 1.410e-02, -5.293e-02)); + r += mul(s3_3, M4(-5.924e-02, -2.347e-03, 4.579e-02, 3.097e-02, -8.237e-03, -3.171e-02, 1.003e-01, -3.099e-02, 8.427e-02, -1.607e-01, -2.136e-02, 5.186e-02, 5.234e-02, 8.716e-02, -2.204e-02, -8.407e-03)); + r += mul(s3_4, M4(-3.137e-02, -6.165e-02, -4.790e-02, -2.918e-03, -5.244e-02, -7.952e-02, -2.419e-01, -9.282e-02, 1.111e-01, 1.613e-02, -6.698e-02, -9.656e-02, -6.602e-03, 1.187e-01, 9.135e-02, 1.027e-01)); + r += mul(s3_5, M4(1.183e-02, 4.164e-02, -1.076e-02, -1.707e-02, 1.665e-02, -1.242e-02, 6.418e-02, 1.193e-02, -7.299e-02, 1.017e-01, 1.254e-01, 1.039e-01, -2.898e-02, -1.810e-02, 2.075e-02, -3.683e-03)); + r += mul(s3_6, M4(-2.723e-02, -6.785e-02, -6.557e-02, -1.114e-02, 7.214e-02, 1.238e-02, 1.335e-03, 2.707e-02, 5.311e-02, 5.707e-02, -1.330e-02, 9.797e-03, -5.754e-02, -1.093e-02, 8.026e-02, -9.979e-03)); + r += mul(s3_7, M4(-2.533e-03, -1.139e-01, 2.439e-02, -1.492e-02, -6.427e-02, 3.910e-03, 3.283e-02, 5.846e-02, 4.403e-02, -2.133e-03, 3.179e-02, 1.806e-03, 1.629e-02, -6.802e-02, 9.503e-03, -2.512e-02)); + r += mul(s3_8, M4(2.353e-02, -2.638e-02, 4.675e-02, 2.404e-02, 4.130e-02, 1.884e-02, 1.145e-01, 3.410e-02, -3.601e-02, -9.180e-02, -7.135e-02, -9.899e-02, -9.522e-03, 3.465e-02, 4.162e-02, 7.758e-03)); + r += mul(s4_0, M4(-1.596e-01, 7.351e-04, -5.917e-02, 9.830e-02, -2.920e-02, -2.196e-02, -2.547e-02, -6.508e-03, -5.261e-03, 2.840e-02, 2.271e-02, 4.707e-03, 3.022e-01, 7.367e-02, 9.815e-02, -4.388e-02)); + r += mul(s4_1, M4(-5.155e-03, 2.948e-02, 1.522e-02, -2.238e-02, 1.755e-02, -2.385e-02, -1.528e-02, -7.690e-02, 2.317e-02, 9.707e-02, 3.772e-02, 4.510e-02, 7.763e-02, -1.526e-01, -3.017e-02, 2.790e-01)); + r += mul(s4_2, M4(8.279e-03, -8.619e-02, 4.243e-02, 3.116e-02, -3.015e-02, -1.552e-02, 1.076e-02, -3.931e-02, 1.595e-02, 4.532e-02, -7.481e-03, 4.177e-02, 3.674e-02, 1.605e-03, 5.683e-02, 8.314e-02)); + r += mul(s4_3, M4(1.502e-01, 4.229e-01, 1.655e-01, -8.824e-02, 1.440e-02, 1.396e-02, 1.824e-02, 5.334e-02, -4.940e-02, 3.722e-02, 1.545e-02, -5.093e-02, 8.613e-02, 1.342e-01, -8.895e-03, -5.035e-02)); + r += mul(s4_4, M4(2.528e-01, -9.416e-03, 1.601e-01, 4.679e-01, 3.810e-02, 7.959e-03, -1.754e-03, 1.858e-02, -4.325e-02, -1.131e-01, -4.183e-02, -1.017e-01, -4.375e-02, 3.145e-02, -1.272e-01, 8.395e-02)); + r += mul(s4_5, M4(-2.072e-01, 1.731e-01, 2.855e-01, 2.574e-01, -4.553e-02, 8.366e-02, 6.631e-02, -5.029e-02, 3.748e-02, 2.669e-03, 1.499e-03, -1.058e-01, 2.305e-02, -1.007e-02, 5.451e-02, 3.447e-02)); + r += mul(s4_6, M4(-1.253e-02, -1.557e-02, 2.680e-01, -4.947e-02, 9.106e-03, -4.863e-02, 3.862e-02, 2.887e-03, 5.714e-02, 1.407e-02, -5.319e-04, 3.290e-02, 9.566e-02, 1.003e-01, 2.218e-02, -2.021e-02)); + r += mul(s4_7, M4(-1.862e-01, 7.949e-01, -4.100e-02, -1.616e-01, 1.377e-02, -7.986e-02, 3.415e-04, 4.065e-04, -2.645e-02, -1.855e-01, 1.605e-02, 4.846e-02, -6.506e-03, 5.088e-03, 4.173e-02, 2.327e-02)); + r += mul(s4_8, M4(-1.919e-01, -9.826e-03, 2.859e-01, 3.247e-02, 1.377e-02, -1.271e-01, 5.140e-02, -1.924e-02, 3.601e-02, 7.237e-02, 3.313e-02, 1.073e-01, 2.213e-02, 1.931e-02, -3.036e-02, -1.857e-02)); + r += mul(s5_0, M4(2.811e-02, -3.688e-02, -1.893e-02, -1.153e-02, 4.608e-02, 7.400e-04, 9.096e-05, 8.831e-03, 4.843e-02, -3.175e-02, 2.007e-03, 3.164e-03, -2.815e-02, -3.291e-02, 6.942e-03, -7.922e-03)); + r += mul(s5_1, M4(-6.265e-02, -3.621e-02, -1.263e-02, 1.924e-02, 5.043e-02, -8.130e-02, -2.655e-02, -3.845e-02, -2.888e-02, -3.681e-02, -3.308e-02, -6.232e-02, 9.469e-03, -1.419e-01, -6.398e-02, 2.439e-03)); + r += mul(s5_2, M4(7.006e-03, -8.489e-03, 1.088e-02, -1.893e-02, -1.850e-02, 1.441e-02, 8.278e-03, 1.588e-02, -1.311e-02, 2.058e-02, 1.626e-02, 2.249e-02, 1.278e-02, -1.710e-02, -1.824e-02, -4.346e-02)); + r += mul(s5_3, M4(-1.600e-02, 4.441e-02, -2.673e-02, 5.737e-02, 1.657e-02, -7.720e-02, -2.863e-02, 3.338e-02, -6.272e-02, -4.107e-02, -3.531e-02, -6.193e-02, -2.302e-01, -8.016e-02, -1.737e-02, -7.314e-02)); + r += mul(s5_4, M4(-5.253e-02, 6.372e-02, 1.257e-01, 2.593e-02, 1.450e-02, -3.240e-02, 2.255e-02, -5.535e-02, 1.490e-01, -6.299e-02, -9.303e-02, 5.202e-02, -6.767e-04, -6.085e-02, -8.085e-02, -4.924e-02)); + r += mul(s5_5, M4(2.291e-02, 1.323e-02, 8.572e-02, -3.387e-02, -3.431e-04, 1.920e-02, 6.956e-03, -9.327e-02, -6.671e-02, -6.480e-02, 1.405e-02, 1.114e-01, -6.012e-03, -1.361e-01, -3.791e-02, 4.829e-02)); + r += mul(s5_6, M4(8.799e-03, 3.142e-02, 8.483e-03, -3.836e-02, 1.978e-01, -1.646e-02, 2.252e-02, -6.048e-02, 4.975e-02, 1.991e-02, 3.369e-02, -2.007e-02, -2.957e-02, -2.680e-03, -2.970e-02, -4.281e-03)); + r += mul(s5_7, M4(-2.848e-02, 3.081e-02, -8.394e-02, -4.064e-03, 2.752e-02, 3.067e-01, -1.155e-01, 9.175e-02, -2.368e-02, -1.767e-01, 7.387e-02, -4.105e-03, -1.972e-02, 2.154e-02, -3.299e-02, 3.965e-02)); + r += mul(s5_8, M4(2.673e-04, 2.480e-02, -3.968e-02, 2.957e-02, -1.786e-02, -1.226e-01, -9.062e-02, 4.356e-02, 1.271e-02, 4.314e-02, -1.928e-01, -1.119e-01, 1.780e-02, 4.065e-03, 8.221e-03, -3.530e-02)); + r += mul(s6_0, M4(2.098e-02, -1.053e-02, 7.348e-03, -2.663e-02, -3.212e-02, 3.080e-02, -4.537e-03, -2.740e-02, 3.162e-02, -2.540e-03, -8.751e-03, -1.148e-02, -4.170e-03, -2.416e-02, -3.985e-03, 5.122e-03)); + r += mul(s6_1, M4(4.269e-02, -1.696e-02, -1.119e-02, 5.508e-02, 5.475e-02, 3.714e-02, -4.380e-02, 1.362e-02, 4.667e-02, -2.880e-02, -1.132e-02, -3.636e-02, -3.802e-02, -3.298e-03, 4.957e-02, -4.383e-02)); + r += mul(s6_2, M4(-2.587e-02, 1.347e-02, -8.682e-03, -7.210e-02, -4.046e-02, 1.120e-02, -4.019e-02, -3.884e-02, 6.137e-02, -7.922e-02, -7.046e-03, 1.565e-01, 1.043e-03, 9.036e-03, 1.292e-02, 8.501e-03)); + r += mul(s6_3, M4(5.580e-02, -2.963e-03, 1.947e-03, -2.473e-03, 1.265e-01, -1.265e-01, 3.623e-02, -7.397e-02, 3.229e-02, 4.138e-02, 4.128e-02, -1.169e-02, 2.586e-02, 2.790e-02, 4.328e-02, -3.918e-02)); + r += mul(s6_4, M4(6.678e-02, 1.508e-01, -3.867e-02, 5.655e-02, 4.361e-01, -1.392e-01, -3.821e-02, 1.118e-01, -2.316e-01, 1.216e-02, 1.708e-01, -6.198e-02, -2.788e-02, 2.630e-02, -7.593e-02, 4.442e-02)); + r += mul(s6_5, M4(-2.494e-02, 7.203e-02, 9.884e-02, 4.679e-02, -1.412e-01, 1.266e-01, 1.616e-01, 5.192e-01, 7.496e-02, -6.297e-02, -7.291e-02, -2.761e-03, 2.747e-03, 2.842e-02, -1.438e-02, 8.791e-02)); + r += mul(s6_6, M4(-6.034e-03, -1.988e-02, 9.423e-03, -8.018e-03, 5.482e-02, 4.266e-02, 2.008e-02, 2.532e-02, 4.935e-02, -4.054e-02, -1.212e-02, -2.818e-03, -1.251e-02, -7.254e-02, 5.047e-02, -1.091e-02)); + r += mul(s6_7, M4(-4.368e-03, -2.020e-02, 1.459e-02, -2.116e-02, 1.027e-02, 3.926e-01, 3.189e-01, -3.561e-02, -5.842e-02, 5.650e-02, -1.034e-01, -3.434e-02, -7.243e-02, -1.526e-02, 5.262e-03, -1.506e-02)); + r += mul(s6_8, M4(-4.331e-02, -1.012e-02, -5.957e-02, 2.021e-02, -2.783e-02, -4.619e-02, -1.793e-01, -1.121e-01, 5.735e-02, 3.291e-02, 1.028e-02, 3.021e-02, 1.916e-02, -5.925e-02, 9.729e-02, -3.139e-02)); + r += mul(s7_0, M4(8.811e-02, -3.230e-02, -2.340e-02, 1.007e-02, 2.262e-02, 1.299e-02, 1.861e-02, 3.002e-03, -4.389e-02, 2.304e-02, 1.989e-02, 4.361e-02, 1.100e-02, 2.912e-02, -6.940e-04, -3.995e-03)); + r += mul(s7_1, M4(-2.878e-02, -1.447e-02, -8.574e-02, 8.482e-02, 7.547e-02, -5.559e-02, -2.542e-02, -1.200e-02, -9.488e-02, 2.377e-02, 7.290e-02, -1.909e-01, 4.442e-02, -6.422e-02, -1.878e-02, 2.297e-02)); + r += mul(s7_2, M4(-1.161e-02, 3.624e-02, 2.303e-02, 4.236e-02, -4.980e-02, 1.092e-02, 2.231e-02, -3.462e-02, 2.148e-02, -7.254e-02, -9.069e-02, 5.621e-02, 2.326e-02, 2.044e-02, 1.256e-03, -3.556e-02)); + r += mul(s7_3, M4(1.694e-01, -6.393e-04, 2.174e-02, 5.228e-02, -7.491e-02, 3.133e-02, 7.240e-02, -1.048e-02, 1.087e-01, -9.066e-02, 1.845e-02, 1.804e-03, -5.398e-03, -6.133e-02, 4.277e-02, -2.896e-02)); + r += mul(s7_4, M4(4.209e-02, 1.779e-01, -1.103e-02, 8.013e-03, 2.688e-01, -3.924e-02, 2.387e-02, 1.478e-02, -3.389e-01, 5.841e-02, -6.463e-02, 1.170e-01, -2.725e-01, 1.440e-01, -1.064e-02, -5.789e-02)); + r += mul(s7_5, M4(5.661e-02, -1.287e-02, -1.040e-01, 2.762e-01, -8.414e-02, -2.199e-02, 7.695e-02, 1.284e-01, 2.643e-02, -1.841e-02, -3.880e-03, -2.730e-01, 3.362e-02, 1.292e-03, -6.430e-02, 1.298e-01)); + r += mul(s7_6, M4(5.765e-02, 1.471e-01, -6.371e-02, 6.783e-03, -2.742e-02, -9.306e-02, 4.691e-02, 2.644e-02, 4.329e-02, -1.373e-01, 3.846e-02, -4.862e-03, 8.690e-03, 1.078e-02, -4.893e-02, 2.456e-02)); + r += mul(s7_7, M4(-1.123e-02, -3.080e-02, 1.587e-01, 7.075e-02, 4.285e-02, 1.250e-01, 4.928e-02, -4.179e-02, -1.304e-01, -2.597e-01, -1.338e-01, -7.231e-02, -3.581e-03, -2.680e-02, 1.008e-01, -1.061e-02)); + r += mul(s7_8, M4(-1.404e-02, -6.516e-02, -1.755e-02, -1.282e-01, 4.673e-03, 5.937e-03, -4.064e-02, 2.759e-02, 2.023e-02, -7.021e-02, -1.563e-02, 2.361e-02, 1.991e-02, -1.549e-01, 1.831e-01, 2.950e-02)); + r += V4(-4.202e-04, 6.301e-03, 6.510e-03, 1.881e-03); + return r; +} + +V4 f1(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(1.076e-01, 9.459e-02, 5.018e-02, 6.361e-02, -1.552e-03, -1.362e-02, -5.013e-03, 2.647e-02, 4.040e-02, -2.398e-02, 3.036e-02, 6.250e-02, 6.878e-02, 1.299e-02, 2.376e-03, -5.089e-02)); + r += mul(s0_1, M4(-3.186e-02, -1.003e-01, 8.043e-03, -1.930e-02, 9.658e-02, 1.229e-01, 1.399e-02, 4.080e-02, -6.420e-02, 2.529e-02, 6.975e-02, 9.162e-02, -1.342e-01, -7.190e-03, 6.387e-02, -3.481e-02)); + r += mul(s0_2, M4(1.963e-02, 3.109e-02, -7.229e-02, 4.592e-03, -1.123e-01, 2.408e-02, -3.028e-02, 3.707e-02, 8.276e-02, 3.451e-02, -9.454e-03, -3.834e-02, 1.974e-02, -2.533e-02, 5.984e-03, 8.251e-02)); + r += mul(s0_3, M4(-1.385e-01, 1.865e-01, 7.740e-02, 1.387e-01, 4.463e-02, 1.012e-01, 7.993e-02, 2.930e-02, -5.065e-02, 6.022e-03, -8.449e-02, 9.553e-02, 7.640e-02, 6.897e-02, -7.650e-02, 6.023e-02)); + r += mul(s0_4, M4(7.506e-02, 4.216e-01, 1.997e-01, -6.951e-02, 4.671e-01, -1.686e-01, 2.571e-01, -2.584e-01, 1.607e-01, 3.681e-02, 4.867e-03, -3.146e-01, 1.337e-01, 1.016e-01, 4.053e-01, 8.276e-02)); + r += mul(s0_5, M4(2.423e-02, 1.422e-01, -1.150e-03, -3.969e-03, 5.352e-02, -4.009e-03, -3.000e-02, 1.944e-02, -8.228e-02, 1.139e-01, 1.020e-01, 1.204e-01, -7.730e-02, -9.062e-02, 6.823e-02, -6.768e-02)); + r += mul(s0_6, M4(-2.356e-02, -1.025e-01, 9.710e-02, -3.185e-02, 5.413e-02, 9.684e-02, 1.312e-01, 1.200e-01, 3.235e-02, -5.876e-02, 1.181e-01, -2.789e-02, -1.420e-02, -1.891e-02, -4.461e-02, -4.793e-03)); + r += mul(s0_7, M4(1.376e-01, -1.486e-01, 1.329e-01, 2.389e-01, 5.239e-02, 1.317e-01, 2.417e-01, -2.170e-02, 9.953e-03, -9.714e-02, 1.253e-01, 1.715e-01, -2.740e-02, -3.472e-02, -2.705e-02, 4.845e-02)); + r += mul(s0_8, M4(-1.929e-01, -1.534e-01, -1.140e-01, 6.699e-02, 1.044e-01, 6.899e-02, 2.676e-02, 1.343e-01, 1.196e-02, -4.285e-02, 2.777e-02, -1.889e-02, 1.189e-01, 1.513e-03, 7.006e-02, -4.608e-02)); + r += mul(s1_0, M4(4.727e-02, 4.907e-02, -4.865e-02, 4.088e-02, 7.322e-02, 4.079e-02, -1.010e-02, 1.619e-02, -4.750e-03, 5.155e-02, 2.044e-02, 6.424e-02, 5.315e-02, 2.716e-02, -4.774e-02, -1.353e-02)); + r += mul(s1_1, M4(7.921e-02, 7.939e-02, 5.319e-02, -5.682e-02, -6.991e-02, 1.192e-01, 6.963e-02, -4.258e-02, 1.701e-01, 6.614e-02, -8.819e-02, -8.870e-03, -5.026e-02, 1.030e-01, 1.329e-02, -1.035e-01)); + r += mul(s1_2, M4(-3.164e-02, -3.713e-02, -2.748e-02, -7.602e-03, 6.976e-02, 2.410e-02, -3.311e-02, -1.760e-02, -8.627e-02, 4.056e-02, 1.148e-01, -1.721e-02, 6.658e-03, -5.652e-02, -1.008e-01, 6.403e-02)); + r += mul(s1_3, M4(-2.600e-02, -9.065e-02, -1.888e-02, 5.124e-02, -1.238e-01, -1.830e-01, -2.969e-02, 5.243e-02, -1.284e-01, -7.646e-02, 4.992e-02, 2.685e-03, 3.629e-02, 4.630e-02, -1.430e-01, 3.552e-02)); + r += mul(s1_4, M4(-2.979e-01, 3.411e-02, 1.029e-01, 3.688e-02, 1.793e-01, -2.283e-01, 1.243e-01, 2.995e-02, -2.282e-01, -1.471e-01, -4.377e-01, 8.713e-02, 8.873e-02, 4.323e-02, -1.517e-01, 1.898e-01)); + r += mul(s1_5, M4(-1.356e-02, -4.639e-02, -5.458e-03, -1.772e-02, -7.631e-02, -1.901e-02, 7.485e-02, 1.410e-03, 9.795e-02, 8.527e-03, 5.029e-02, -4.242e-02, -8.664e-02, -2.813e-02, -1.742e-01, 1.645e-01)); + r += mul(s1_6, M4(-2.665e-02, -1.223e-01, 8.783e-02, -6.537e-03, 2.250e-03, -7.386e-03, 3.235e-04, 8.568e-02, 9.910e-02, -9.138e-02, 4.718e-03, -6.234e-02, -6.278e-03, 6.142e-03, -4.212e-02, 2.019e-02)); + r += mul(s1_7, M4(-2.058e-01, -1.362e-01, -5.059e-03, 2.211e-02, 1.474e-02, -5.797e-03, 1.787e-02, -4.932e-02, 5.892e-02, -1.100e-02, 2.070e-01, 6.475e-02, -8.533e-02, -1.685e-01, -1.017e-01, 2.089e-02)); + r += mul(s1_8, M4(-1.094e-01, -3.021e-02, -4.875e-02, 4.281e-02, 6.425e-02, 3.246e-02, 5.784e-02, -1.173e-01, -9.465e-02, -8.862e-02, -5.373e-02, 3.057e-02, 8.867e-02, -5.970e-02, 4.623e-02, 8.439e-02)); + r += mul(s2_0, M4(1.587e-01, -1.166e-01, 7.347e-02, 5.028e-02, -2.301e-02, -1.425e-02, -4.434e-02, -3.650e-02, -5.876e-02, 5.358e-03, -6.112e-02, -3.876e-02, -9.871e-02, -9.629e-02, 2.887e-02, -5.464e-02)); + r += mul(s2_1, M4(2.192e-01, -8.572e-02, -1.725e-01, -2.315e-01, -4.065e-02, -1.574e-02, -4.730e-02, 4.133e-02, -1.877e-03, -1.450e-02, -4.131e-02, 5.251e-02, -7.241e-02, -2.118e-01, -1.658e-01, -1.554e-02)); + r += mul(s2_2, M4(-2.951e-02, -6.779e-02, 3.084e-02, -2.750e-01, -1.586e-02, -4.853e-02, 1.521e-02, 1.087e-02, -3.765e-02, 8.129e-03, 4.653e-02, -2.222e-02, 7.725e-03, -7.037e-04, -2.007e-02, -8.173e-03)); + r += mul(s2_3, M4(1.025e-01, 2.878e-01, 4.804e-02, 1.290e-01, -4.854e-02, 3.440e-02, -5.406e-02, 4.039e-02, 4.142e-02, -1.714e-01, 1.287e-02, -4.413e-02, 9.058e-03, -1.193e-01, 9.933e-02, -1.257e-02)); + r += mul(s2_4, M4(-6.006e-02, 1.470e-01, -1.725e-01, 8.381e-02, 1.430e-01, -2.764e-01, 2.258e-01, -3.232e-02, -5.532e-02, -3.717e-02, -4.678e-01, 2.989e-01, 2.234e-02, 3.625e-03, -4.473e-01, -1.063e-03)); + r += mul(s2_5, M4(5.328e-02, 9.418e-03, 4.552e-02, -9.636e-02, 1.165e-01, -5.062e-02, -3.916e-02, 1.290e-01, 6.573e-02, 8.872e-03, 3.454e-02, -7.966e-02, -5.075e-02, -2.213e-02, 1.388e-01, 1.829e-01)); + r += mul(s2_6, M4(3.882e-02, 2.023e-02, 2.501e-02, 9.446e-02, -2.924e-03, -4.121e-02, -8.625e-02, 4.996e-03, -3.805e-02, 3.746e-02, 1.038e-01, 3.066e-04, 1.063e-03, 6.865e-02, -6.979e-02, 3.771e-02)); + r += mul(s2_7, M4(5.676e-03, 2.452e-02, -8.635e-02, -7.576e-02, -1.391e-01, 1.490e-01, 2.582e-02, -2.445e-01, -1.249e-01, -2.115e-02, -1.512e-01, 3.049e-01, -6.295e-02, -6.138e-02, -2.572e-01, -3.793e-01)); + r += mul(s2_8, M4(-1.268e-03, 2.520e-02, -3.155e-02, -9.465e-02, 3.650e-02, 1.035e-02, 3.947e-02, 1.959e-01, -7.596e-02, -2.304e-02, 5.939e-03, -4.067e-02, -7.969e-02, -6.106e-02, 3.986e-02, -4.797e-02)); + r += mul(s3_0, M4(3.360e-02, 9.741e-02, -3.713e-02, 2.114e-02, 7.099e-04, 7.903e-02, -3.197e-02, 1.065e-02, -2.551e-02, -1.802e-02, -2.769e-02, -1.930e-02, 1.047e-02, 3.540e-02, 1.322e-02, -1.556e-04)); + r += mul(s3_1, M4(4.761e-02, 1.757e-01, 4.040e-02, -7.825e-02, 7.368e-02, 1.965e-01, 1.090e-02, 3.098e-02, 1.595e-02, 1.373e-02, 1.417e-02, -7.205e-02, -1.419e-02, 4.930e-02, 8.902e-02, 3.248e-04)); + r += mul(s3_2, M4(-7.793e-02, -5.996e-04, -2.884e-02, 7.126e-02, 4.825e-02, 5.384e-02, 1.636e-02, -2.258e-02, -4.520e-02, -5.878e-02, -4.555e-02, 6.671e-02, -2.214e-02, -1.812e-02, -3.157e-02, 1.006e-02)); + r += mul(s3_3, M4(4.366e-02, 5.893e-03, -4.569e-02, 8.509e-03, -2.388e-02, -4.327e-02, 8.083e-03, -2.875e-02, 6.482e-03, -2.898e-02, 1.219e-01, 3.075e-02, 4.515e-02, 1.265e-02, -1.177e-02, 1.695e-02)); + r += mul(s3_4, M4(-4.587e-02, -4.540e-02, -4.528e-02, -3.017e-02, -9.578e-02, -1.165e-01, 6.568e-03, 7.609e-02, -5.974e-02, -1.383e-01, 6.412e-03, -1.829e-02, -3.406e-02, -8.001e-02, -5.122e-02, 1.077e-01)); + r += mul(s3_5, M4(3.416e-02, -3.407e-02, 8.393e-02, -1.160e-01, -9.369e-03, 3.058e-02, 4.454e-02, -9.247e-02, 9.737e-02, -6.020e-02, -1.013e-01, -2.782e-02, 8.023e-02, -7.069e-02, -1.847e-03, -5.169e-02)); + r += mul(s3_6, M4(7.537e-03, -6.927e-02, -8.231e-02, 7.270e-02, 4.258e-02, -4.721e-02, 3.532e-02, 2.222e-02, -3.422e-02, 4.518e-02, 9.489e-02, 5.504e-02, 7.420e-03, -1.408e-02, -7.131e-02, -3.159e-02)); + r += mul(s3_7, M4(-6.396e-03, -1.854e-02, 8.382e-02, -6.459e-02, 5.731e-02, -9.457e-02, -2.301e-02, -4.219e-02, -3.609e-02, 7.196e-02, 9.962e-02, -1.094e-01, 2.650e-02, 6.392e-03, 1.478e-02, 9.639e-02)); + r += mul(s3_8, M4(4.995e-02, -1.478e-02, -2.014e-02, -2.019e-02, 7.100e-02, -6.871e-04, 5.266e-02, -1.085e-01, -7.515e-02, 2.356e-02, -4.473e-02, 2.427e-01, -5.491e-03, 2.872e-02, 3.165e-02, 5.489e-02)); + r += mul(s4_0, M4(-3.458e-02, -1.959e-01, -1.213e-01, -2.589e-01, -3.968e-02, -5.974e-02, -1.907e-02, -7.278e-03, 1.537e-02, 4.771e-02, 2.328e-02, 2.913e-02, 1.330e-01, -4.545e-02, 5.589e-03, 1.417e-02)); + r += mul(s4_1, M4(3.301e-01, 1.127e-01, -2.534e-02, -3.332e-02, -4.439e-02, -8.422e-02, -6.904e-02, -2.112e-02, 5.374e-02, 1.986e-01, -4.109e-02, 3.611e-02, 3.623e-01, 1.059e-02, 3.093e-01, 3.962e-02)); + r += mul(s4_2, M4(-1.211e-01, -9.423e-02, 9.185e-02, -3.221e-02, -6.293e-02, -6.185e-02, -2.286e-03, 5.499e-03, 9.204e-02, 9.981e-02, 7.664e-02, -2.940e-02, 6.183e-02, 3.852e-02, -5.530e-02, 4.065e-02)); + r += mul(s4_3, M4(1.963e-03, 1.767e-01, -2.015e-01, -7.453e-02, 3.252e-02, 1.308e-02, 8.874e-02, 5.307e-02, -8.716e-02, -6.464e-02, 1.080e-02, -2.419e-02, 9.475e-02, 2.395e-01, 8.134e-02, -4.515e-02)); + r += mul(s4_4, M4(-1.869e-02, 4.839e-02, 5.578e-01, -2.113e-01, -1.419e-01, -1.454e-04, -5.902e-02, -1.506e-02, -2.261e-01, -3.061e-01, -2.529e-01, 4.105e-02, 1.003e-01, 1.875e-01, 2.203e-01, 7.133e-02)); + r += mul(s4_5, M4(5.376e-01, -4.584e-02, 4.556e-02, -4.455e-01, 5.528e-02, -1.674e-02, -8.416e-02, 3.166e-02, -1.333e-01, 2.677e-02, 1.385e-01, 7.247e-02, -3.433e-02, 6.367e-02, 7.385e-03, -4.556e-02)); + r += mul(s4_6, M4(-1.279e-02, -9.193e-02, 1.330e-01, -3.062e-01, -1.544e-02, -2.016e-02, 6.331e-02, -3.779e-02, 6.792e-02, -9.991e-03, 5.801e-02, 4.266e-03, -3.719e-02, -3.649e-02, 5.247e-02, 8.472e-02)); + r += mul(s4_7, M4(4.007e-01, 4.785e-02, 1.757e-01, -2.749e-01, -1.780e-02, -9.400e-02, -1.440e-01, -1.256e-03, 1.011e-01, -1.379e-01, -6.547e-02, 2.229e-02, -2.131e-02, -7.870e-02, -1.186e-02, -6.191e-02)); + r += mul(s4_8, M4(-2.379e-01, 2.552e-02, -3.286e-01, 9.823e-01, -8.046e-03, 5.090e-03, 1.685e-02, 1.315e-01, 4.574e-02, 6.229e-02, 8.783e-02, -1.363e-01, -4.713e-03, -1.715e-02, 2.698e-02, 9.398e-03)); + r += mul(s5_0, M4(-1.468e-02, -2.028e-02, 1.466e-02, -4.579e-02, 1.535e-02, 3.095e-03, 8.097e-02, 3.445e-02, -4.863e-02, -1.563e-02, 2.629e-02, -3.146e-02, 1.701e-02, -4.191e-03, -3.601e-02, -1.665e-02)); + r += mul(s5_1, M4(-3.403e-02, -9.204e-02, -5.272e-02, -8.214e-03, 4.176e-02, -4.487e-02, 3.617e-02, -2.815e-02, -1.425e-01, -3.422e-02, -5.875e-02, 3.796e-02, -6.358e-02, -2.590e-01, -9.751e-03, -2.323e-02)); + r += mul(s5_2, M4(3.660e-03, -1.702e-02, -9.442e-04, 2.394e-02, -2.582e-02, -2.589e-02, -5.776e-02, -1.213e-02, 7.397e-02, 2.383e-02, 2.967e-02, -3.611e-02, -4.360e-02, -4.814e-02, 6.573e-02, 2.316e-02)); + r += mul(s5_3, M4(1.052e-01, 6.102e-02, -1.410e-03, -2.740e-02, 2.966e-02, 1.002e-03, 1.699e-01, 3.489e-02, -4.189e-02, -7.594e-02, -9.216e-02, -4.146e-02, -5.124e-02, -8.469e-02, -1.911e-01, -3.356e-02)); + r += mul(s5_4, M4(1.532e-02, 1.675e-01, -6.142e-02, 5.359e-03, -3.161e-01, -1.008e-02, -6.061e-02, -6.506e-02, 1.185e-01, -1.872e-01, -1.266e-01, 2.179e-02, -1.714e-02, 5.675e-02, -1.877e-02, -2.057e-02)); + r += mul(s5_5, M4(3.497e-02, 9.410e-02, -4.845e-02, -1.955e-02, -9.722e-02, -9.591e-03, -9.701e-03, 6.356e-02, -8.054e-03, 4.357e-02, -8.791e-02, 8.673e-02, -2.616e-03, -1.464e-02, 3.709e-02, -4.116e-02)); + r += mul(s5_6, M4(-8.170e-02, 1.745e-02, 4.576e-03, -1.441e-02, -1.709e-02, -5.536e-02, 2.046e-01, 4.309e-02, 3.489e-02, 3.760e-02, -1.835e-02, -2.928e-02, 3.855e-02, -2.936e-02, -5.064e-04, 4.572e-03)); + r += mul(s5_7, M4(-1.266e-02, -2.220e-02, -4.455e-02, 1.910e-02, 2.502e-01, 1.983e-01, -2.494e-02, -8.154e-02, -1.582e-01, -1.609e-02, 2.153e-02, -5.182e-02, -4.083e-03, -1.843e-02, -7.066e-02, -1.014e-01)); + r += mul(s5_8, M4(9.087e-03, 1.330e-03, -3.767e-04, -4.360e-02, 3.942e-02, -4.327e-02, 7.721e-02, 6.839e-02, -3.861e-02, 3.624e-02, 1.080e-02, 1.728e-01, -3.517e-02, 1.390e-02, 2.920e-02, 2.377e-02)); + r += mul(s6_0, M4(-1.396e-02, 4.944e-02, -1.320e-02, 1.199e-02, -3.217e-02, -3.029e-02, -9.161e-02, 1.708e-04, -7.892e-03, -4.578e-02, 9.429e-03, -3.443e-02, -2.402e-02, -2.350e-02, -6.804e-02, 1.150e-02)); + r += mul(s6_1, M4(-8.674e-03, 5.924e-02, 4.191e-02, 3.338e-02, 4.583e-02, 2.542e-02, 6.378e-02, 4.860e-02, 3.023e-02, -1.641e-01, 1.021e-01, -7.298e-03, 1.726e-02, 3.585e-02, -2.231e-02, -7.084e-02)); + r += mul(s6_2, M4(3.300e-02, -8.408e-03, -5.822e-02, -9.899e-02, -5.071e-02, -4.682e-02, -1.381e-02, 4.860e-02, 7.645e-02, -1.057e-01, 3.290e-02, 4.256e-02, -3.318e-02, 4.675e-02, -4.134e-02, 1.627e-02)); + r += mul(s6_3, M4(7.606e-03, -5.919e-02, -7.668e-03, -1.690e-03, -5.880e-02, -2.051e-01, 4.579e-02, -7.223e-02, -1.077e-02, -4.231e-02, -4.106e-02, 4.490e-02, -7.850e-02, -3.918e-03, -5.043e-02, -3.242e-02)); + r += mul(s6_4, M4(8.115e-02, 1.467e-01, 4.984e-02, 2.527e-01, 9.786e-01, -1.904e-01, 6.230e-01, 3.002e-01, -9.438e-02, 1.898e-01, -1.968e-02, -1.330e-01, 7.036e-02, -6.077e-02, 1.128e-01, -2.748e-03)); + r += mul(s6_5, M4(7.808e-02, 1.051e-01, -1.295e-01, 5.095e-03, 1.513e-01, -1.094e-01, -9.200e-02, -1.044e-01, 7.178e-02, 3.189e-02, 1.993e-01, -1.136e-01, 5.804e-02, -6.015e-02, -3.642e-02, -9.688e-02)); + r += mul(s6_6, M4(-2.588e-02, 1.746e-02, -2.700e-02, 1.074e-02, 6.922e-02, -2.008e-02, 2.125e-02, -8.833e-02, -3.047e-02, -1.309e-02, 1.033e-01, -5.231e-02, 1.709e-02, -1.158e-02, -2.972e-02, -7.904e-02)); + r += mul(s6_7, M4(2.365e-02, -5.650e-02, -7.233e-02, 1.694e-01, -2.315e-01, -3.880e-02, 4.061e-02, 1.881e-01, -2.348e-03, 1.333e-01, 3.504e-02, 7.788e-02, -4.871e-02, -4.378e-02, 2.568e-03, -1.388e-02)); + r += mul(s6_8, M4(-9.590e-03, -3.210e-02, 4.876e-02, 1.297e-03, -7.297e-02, -1.207e-02, -5.161e-02, 1.450e-01, 4.795e-02, 8.561e-02, -5.993e-02, -9.444e-02, 7.645e-03, 6.642e-02, 3.855e-02, -3.747e-03)); + r += mul(s7_0, M4(1.993e-02, -5.599e-02, 1.307e-02, 5.126e-02, 2.252e-03, -5.554e-02, -4.524e-02, 2.811e-02, -2.211e-02, 2.689e-02, 9.672e-03, -7.220e-02, 4.916e-03, -4.126e-02, -3.318e-02, 3.250e-03)); + r += mul(s7_1, M4(-1.198e-01, 2.290e-02, -9.118e-02, 1.422e-01, -4.106e-02, 9.354e-03, 6.920e-02, 1.073e-02, -1.082e-01, -1.340e-01, -1.270e-01, -7.924e-02, -5.469e-02, 2.681e-02, 8.133e-02, 8.518e-03)); + r += mul(s7_2, M4(3.376e-02, -1.809e-02, -2.202e-02, -2.870e-02, 4.718e-03, -1.995e-02, -2.811e-02, -1.792e-02, 1.182e-02, -5.890e-02, 2.217e-02, 4.638e-02, -8.611e-02, 8.245e-02, 8.950e-02, -2.750e-03)); + r += mul(s7_3, M4(9.746e-02, 4.480e-02, 1.120e-01, 5.923e-02, -1.928e-02, -1.379e-01, -4.855e-02, -3.636e-02, -5.096e-02, -9.697e-02, -1.329e-02, 8.373e-03, -7.251e-02, -8.911e-02, 5.372e-02, -4.751e-02)); + r += mul(s7_4, M4(4.912e-01, 1.320e-01, -2.570e-01, 1.634e-02, 1.529e-02, -1.948e-01, -1.609e-02, 1.018e-01, -1.592e-01, -9.952e-02, -3.147e-01, -2.723e-01, -6.472e-02, 9.893e-02, -9.035e-02, 1.362e-01)); + r += mul(s7_5, M4(9.074e-02, 4.720e-02, 5.895e-03, 6.767e-02, 7.657e-02, -7.854e-02, -1.175e-01, -2.531e-02, -7.094e-02, 2.834e-03, 9.916e-02, -1.150e-01, 1.608e-01, -1.808e-01, 1.651e-01, -4.608e-02)); + r += mul(s7_6, M4(-2.852e-02, 9.908e-02, 5.067e-02, 1.720e-01, 9.137e-03, -2.604e-02, 6.387e-02, -1.178e-01, -4.066e-02, -3.658e-02, 6.847e-02, -8.960e-02, 4.407e-02, -3.909e-02, 6.733e-02, 1.338e-02)); + r += mul(s7_7, M4(-7.476e-02, 6.065e-03, -4.672e-02, 1.024e-02, -3.047e-02, 2.018e-01, -9.026e-02, 2.397e-02, -1.401e-01, -1.550e-01, -6.817e-02, 1.072e-01, 7.496e-02, -3.902e-02, 4.703e-02, 1.025e-01)); + r += mul(s7_8, M4(-7.574e-02, 8.433e-03, 1.116e-01, -2.104e-01, 4.504e-02, 7.003e-02, -3.852e-02, 7.617e-02, -9.383e-03, -1.871e-02, -5.760e-02, -8.031e-02, -1.150e-02, -3.233e-03, 1.605e-01, -5.731e-02)); + r += V4(2.115e-03, 4.044e-03, 5.828e-03, 3.265e-03); + return r; +} + +V4 f2(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-1.188e-02, -3.332e-02, 8.720e-02, 1.829e-03, -6.758e-02, -5.979e-02, 9.119e-02, 1.884e-02, -6.329e-02, -5.896e-02, 3.922e-02, 1.329e-02, 3.359e-03, -4.119e-02, 1.304e-01, -3.453e-02)); + r += mul(s0_1, M4(4.524e-03, 1.038e-02, -7.542e-02, -2.815e-03, -1.062e-01, 1.727e-02, 1.155e-01, 3.582e-01, 1.361e-02, 2.549e-02, -1.253e-02, -8.946e-02, -2.741e-02, -6.133e-02, 1.343e-03, 1.056e-01)); + r += mul(s0_2, M4(1.166e-02, 7.431e-02, 7.213e-02, 7.082e-02, 2.824e-02, -6.961e-02, 1.072e-01, -1.137e-01, -9.178e-03, 2.803e-02, 1.748e-02, 2.367e-02, -3.033e-02, 3.265e-03, 2.166e-02, -6.877e-03)); + r += mul(s0_3, M4(-9.045e-02, -3.842e-02, 8.165e-02, -9.603e-02, -1.656e-01, -1.603e-01, 5.166e-03, 5.611e-02, -2.426e-01, -3.644e-02, 5.843e-02, 2.447e-02, -9.501e-02, 1.309e-01, -3.283e-02, 3.567e-02)); + r += mul(s0_4, M4(-2.686e-01, -2.336e-02, 1.422e-01, 4.370e-02, 3.774e-01, -3.523e-02, 5.176e-01, -2.106e-02, 7.873e-02, -1.034e-01, 1.042e-01, -1.486e-02, 2.457e-02, 5.041e-02, 1.460e-01, -1.445e-01)); + r += mul(s0_5, M4(3.611e-02, -1.113e-01, 3.064e-02, -3.519e-02, -9.354e-02, 1.515e-01, -9.649e-02, 3.154e-01, -2.846e-02, -2.897e-02, 2.011e-02, -9.511e-02, 6.145e-02, 8.183e-02, 1.010e-01, -4.757e-02)); + r += mul(s0_6, M4(4.124e-02, 3.306e-02, -4.793e-02, -4.706e-03, -1.112e-01, 4.022e-02, 6.962e-02, 3.748e-02, 3.347e-02, 2.291e-02, 5.088e-03, 1.170e-02, 9.311e-02, -1.557e-01, 3.237e-02, -2.680e-02)); + r += mul(s0_7, M4(2.484e-03, 8.932e-02, 1.036e-01, 3.142e-01, 1.771e-03, -1.162e-01, -8.698e-02, 5.788e-02, 3.005e-02, -1.686e-01, -1.090e-02, 7.850e-02, -1.064e-01, 2.479e-02, -2.199e-02, 2.138e-02)); + r += mul(s0_8, M4(-2.168e-02, -2.943e-02, -3.124e-02, -1.104e-01, -5.848e-02, -2.798e-01, 8.619e-02, -1.055e-02, 7.123e-03, -5.557e-02, 1.454e-03, -1.419e-02, 6.118e-02, 1.648e-02, -2.522e-02, 8.671e-02)); + r += mul(s1_0, M4(-2.472e-02, 2.191e-02, -4.262e-02, -4.035e-03, 9.183e-03, -2.177e-02, -6.007e-02, 6.140e-02, -2.719e-03, -4.530e-03, -6.548e-02, 3.801e-02, -2.606e-02, -4.633e-02, 6.039e-02, -4.108e-04)); + r += mul(s1_1, M4(7.687e-02, -2.714e-02, 5.675e-02, -8.649e-02, 3.078e-02, -3.505e-02, 5.217e-02, -9.711e-02, 2.458e-02, 2.113e-02, -1.036e-01, -1.770e-01, 4.180e-02, -1.399e-01, 9.692e-02, 1.941e-01)); + r += mul(s1_2, M4(-2.535e-02, -3.846e-03, -4.850e-02, -4.418e-03, 1.452e-02, -2.092e-02, 9.281e-03, -5.721e-02, -4.805e-02, -8.908e-02, 6.999e-03, 4.991e-02, 1.403e-02, -7.863e-03, 7.527e-03, -1.596e-01)); + r += mul(s1_3, M4(-4.035e-02, 3.764e-02, 1.273e-02, -2.216e-02, 6.812e-02, -1.512e-02, 6.997e-02, -5.809e-02, 1.579e-02, -6.077e-02, 3.481e-02, -1.458e-03, -7.933e-03, 6.306e-02, -1.131e-01, -8.109e-02)); + r += mul(s1_4, M4(-1.046e-01, 1.092e-01, -1.678e-01, -2.851e-01, 4.912e-02, -3.760e-03, 5.742e-02, 5.613e-02, -6.450e-02, 2.752e-01, 4.494e-02, -3.994e-02, 2.077e-01, 1.700e-01, -7.376e-02, -7.578e-02)); + r += mul(s1_5, M4(-2.043e-02, 6.183e-02, 2.938e-02, -2.012e-03, 1.725e-02, 4.365e-02, 1.063e-01, -7.568e-03, 5.594e-02, -3.278e-02, 4.597e-02, 2.987e-02, -1.881e-02, 5.059e-01, 5.104e-02, -1.365e-01)); + r += mul(s1_6, M4(6.789e-02, -7.871e-03, -4.167e-02, 2.075e-03, -1.833e-02, 1.941e-01, 1.266e-02, 5.510e-02, 3.110e-02, -1.049e-02, -3.576e-02, -7.252e-03, -6.012e-02, 5.847e-02, 2.815e-02, 2.331e-02)); + r += mul(s1_7, M4(-9.442e-02, 6.906e-02, -8.851e-02, -2.485e-02, 5.090e-02, -6.309e-02, 3.697e-02, -1.238e-02, 6.781e-02, -8.338e-02, -3.093e-02, 1.085e-01, 9.117e-02, 3.855e-01, 4.742e-02, -1.132e-02)); + r += mul(s1_8, M4(-1.800e-03, 1.546e-01, -1.963e-02, -7.079e-02, 3.692e-02, 2.564e-02, -1.822e-02, 8.978e-02, -3.236e-02, 1.218e-01, -1.214e-02, -8.239e-02, 5.708e-02, 2.057e-01, 6.424e-02, 8.472e-02)); + r += mul(s2_0, M4(-5.481e-02, -1.404e-01, 8.220e-02, 1.072e-01, 9.481e-03, 2.446e-02, 2.734e-02, -8.670e-02, 1.175e-01, 1.414e-02, 1.080e-02, 1.073e-01, 5.968e-02, -2.128e-03, 1.044e-01, 7.510e-03)); + r += mul(s2_1, M4(3.686e-03, -1.669e-01, -1.364e-01, 1.046e-01, 2.527e-04, -1.904e-02, -2.032e-01, 4.817e-02, 3.698e-02, 9.219e-03, -1.743e-02, -2.651e-01, 1.376e-02, 3.408e-02, -3.703e-02, -2.350e-01)); + r += mul(s2_2, M4(4.511e-02, -6.042e-02, 1.397e-01, -5.209e-02, -3.447e-02, 3.691e-02, -6.187e-03, -5.817e-02, 1.027e-02, -1.841e-02, 1.670e-02, 2.625e-02, 1.474e-02, 6.275e-02, 1.233e-02, 1.266e-01)); + r += mul(s2_3, M4(-1.833e-01, 3.643e-01, 1.313e-01, 8.859e-02, -2.271e-01, 4.529e-02, -2.425e-01, -2.007e-02, 1.616e-01, -9.640e-02, -8.167e-02, -9.877e-02, 1.014e-01, -2.368e-02, 1.173e-01, -4.600e-02)); + r += mul(s2_4, M4(-1.047e-01, 5.489e-01, 2.875e-01, -6.239e-02, -1.576e-01, -8.642e-02, 1.690e-01, -1.704e-01, -8.154e-02, -3.884e-02, -1.718e-01, 2.920e-01, -4.465e-01, -1.001e-01, -5.537e-02, 1.294e-01)); + r += mul(s2_5, M4(3.794e-02, 2.799e-01, 3.400e-02, 2.627e-02, -5.562e-02, -2.795e-02, -7.195e-02, 2.062e-01, 4.760e-02, -1.185e-02, 3.430e-02, 2.486e-02, -1.905e-02, -7.942e-03, 6.469e-02, -2.473e-01)); + r += mul(s2_6, M4(-3.862e-02, -2.716e-01, -1.779e-02, 1.971e-02, -9.843e-02, 1.211e-01, 1.658e-02, 1.460e-02, -2.303e-03, 5.473e-02, 7.051e-04, -1.557e-02, -1.441e-01, 1.367e-01, 9.302e-02, 1.536e-02)); + r += mul(s2_7, M4(5.274e-02, -2.609e-01, 6.992e-02, 1.837e-03, 3.149e-02, 2.595e-01, -1.588e-01, -3.238e-02, -9.817e-02, -3.578e-02, -2.076e-02, -7.313e-02, 1.019e-01, 3.797e-01, 3.405e-02, -1.473e-01)); + r += mul(s2_8, M4(3.928e-03, 7.927e-02, 2.124e-02, -2.093e-02, -7.487e-02, 1.220e-01, 6.759e-02, -9.136e-03, -1.540e-02, -6.047e-02, -4.920e-02, 1.421e-02, 6.404e-02, 2.256e-01, -2.249e-02, 5.230e-03)); + r += mul(s3_0, M4(-2.836e-02, -6.272e-02, 5.909e-03, 5.849e-03, -1.289e-02, 5.955e-03, -5.245e-02, 5.188e-02, -5.392e-03, -4.093e-02, -7.894e-02, 3.270e-02, -9.103e-03, 1.188e-02, 3.357e-02, -2.240e-02)); + r += mul(s3_1, M4(4.517e-02, -3.684e-02, -5.974e-02, -4.620e-02, 5.921e-02, 2.377e-02, -3.287e-02, 1.555e-02, 3.179e-02, -5.626e-02, 2.167e-02, -1.737e-02, -4.715e-03, -6.318e-02, 9.200e-03, 8.010e-02)); + r += mul(s3_2, M4(1.023e-02, -2.900e-03, 1.975e-02, -1.037e-01, 7.047e-03, 2.345e-02, 8.585e-03, 2.902e-02, -3.185e-02, -5.850e-02, 1.260e-02, -7.110e-02, 1.932e-02, -2.763e-02, 2.815e-02, -4.028e-02)); + r += mul(s3_3, M4(2.569e-02, -3.794e-02, -1.767e-01, 4.292e-02, 6.767e-02, 1.558e-02, 3.336e-02, -2.264e-02, 9.934e-02, 7.835e-02, 7.838e-02, -2.692e-02, -3.773e-02, 2.213e-02, 3.180e-02, 3.728e-02)); + r += mul(s3_4, M4(-1.067e-02, -4.388e-02, 8.321e-02, -1.344e-01, -7.525e-04, -2.050e-02, 7.072e-02, 8.138e-02, 1.190e-01, 7.250e-02, 9.039e-02, -1.053e-01, 5.307e-02, 3.833e-02, 3.821e-02, -3.772e-02)); + r += mul(s3_5, M4(7.423e-02, 4.272e-03, -8.332e-03, 2.138e-02, 7.411e-02, 9.967e-02, 2.008e-02, 3.070e-02, -9.977e-02, -3.803e-02, -5.478e-02, 6.565e-02, 1.025e-02, 9.232e-02, 7.907e-04, 3.556e-02)); + r += mul(s3_6, M4(-1.878e-02, -1.041e-02, 6.881e-02, -7.144e-03, 4.166e-02, 2.246e-02, -3.086e-02, 2.266e-02, -6.732e-02, -1.242e-02, -2.006e-02, 2.065e-02, 9.135e-03, -2.940e-02, 2.761e-02, -2.484e-02)); + r += mul(s3_7, M4(4.517e-02, 9.055e-02, -4.538e-03, 1.247e-03, 5.470e-02, -2.161e-02, 4.771e-02, 3.237e-02, 5.565e-03, 1.050e-01, -1.003e-01, -2.731e-04, -3.393e-02, 3.448e-02, 3.846e-02, -4.142e-05)); + r += mul(s3_8, M4(1.010e-02, 5.598e-02, 4.990e-02, 2.106e-03, 6.861e-02, 2.441e-02, 1.923e-02, 2.508e-02, -1.440e-01, 2.018e-02, 7.907e-03, -5.819e-02, -2.897e-02, 2.882e-02, -2.872e-02, -1.642e-02)); + r += mul(s4_0, M4(-1.741e-02, 1.603e-01, 1.289e-01, 5.191e-02, 2.557e-03, -4.322e-02, -2.579e-02, -5.512e-02, 3.220e-03, -2.343e-02, -6.169e-02, 6.911e-02, 4.653e-02, -2.211e-02, 2.116e-01, 1.909e-01)); + r += mul(s4_1, M4(4.580e-02, 2.516e-02, -1.149e-01, 7.143e-01, 5.640e-02, 8.803e-02, 1.368e-02, -5.165e-02, -1.294e-02, -3.442e-02, 4.503e-02, -7.777e-02, -4.877e-02, -1.414e-02, 1.643e-01, 5.026e-01)); + r += mul(s4_2, M4(6.897e-02, 2.236e-02, 3.488e-03, -7.202e-02, -1.974e-02, -4.583e-03, -4.172e-03, -3.397e-02, -1.087e-02, -6.656e-02, -9.977e-03, 4.895e-02, 7.498e-03, 8.218e-03, -6.155e-03, 2.803e-02)); + r += mul(s4_3, M4(-4.639e-01, 2.028e-01, -1.113e-01, 1.884e-01, -4.210e-02, 5.013e-02, 1.792e-01, 3.296e-02, -4.909e-03, -2.323e-02, 5.133e-02, -1.792e-02, -1.214e-02, 2.493e-02, 1.672e-01, -1.013e-01)); + r += mul(s4_4, M4(3.603e-01, 9.485e-02, 3.685e-01, -5.827e-01, 7.797e-02, -4.314e-03, -1.100e-01, -3.284e-02, 1.190e-01, 9.011e-02, -1.382e-01, 2.920e-01, -1.540e-02, -2.027e-01, -1.193e-01, 1.663e-01)); + r += mul(s4_5, M4(1.756e-01, -5.404e-03, -1.063e-01, 2.605e-01, -8.981e-02, 6.862e-02, -2.303e-02, -2.865e-03, -4.260e-02, 1.051e-01, 1.012e-01, -8.179e-02, 4.335e-03, -6.002e-02, 1.632e-02, -8.527e-04)); + r += mul(s4_6, M4(1.823e-01, -7.957e-02, -6.844e-02, -1.092e-01, 2.816e-02, -7.993e-03, -1.047e-01, -2.782e-04, 8.214e-02, -3.725e-02, 6.411e-02, 4.630e-02, 3.495e-02, -1.434e-02, -1.415e-02, 1.406e-02)); + r += mul(s4_7, M4(4.341e-01, 1.546e-02, 1.486e-01, 6.923e-01, 2.763e-02, 8.329e-02, 7.277e-02, 3.213e-02, -4.289e-02, -1.067e-02, 5.603e-02, 4.448e-02, -1.503e-02, -7.192e-02, -2.421e-02, 2.587e-02)); + r += mul(s4_8, M4(-4.639e-01, -1.631e-01, -5.696e-03, -3.638e-01, -6.436e-02, 9.907e-02, 2.130e-02, -3.039e-02, 8.544e-02, -1.465e-02, 8.856e-03, 3.908e-02, -1.725e-03, 1.072e-02, 5.467e-03, 1.618e-02)); + r += mul(s5_0, M4(3.606e-03, 1.553e-02, 2.554e-03, 2.442e-02, 2.776e-02, -4.318e-03, -4.577e-02, 1.408e-03, 1.245e-02, -3.113e-02, 2.087e-02, 1.057e-02, 8.364e-03, -1.414e-02, -1.301e-01, 6.560e-02)); + r += mul(s5_1, M4(-2.726e-02, -2.469e-02, 9.038e-02, -2.211e-02, 3.204e-02, 6.069e-02, 1.048e-01, -7.627e-02, -3.532e-02, 1.767e-02, -5.957e-03, -3.333e-02, 7.942e-03, -1.149e-02, -4.773e-02, -1.110e-01)); + r += mul(s5_2, M4(5.837e-03, 4.688e-02, -1.546e-02, 5.968e-03, 9.293e-03, 1.956e-02, -4.029e-02, -2.396e-02, 1.236e-02, -5.458e-02, -1.188e-03, 3.742e-02, -2.838e-02, 5.513e-02, -2.169e-02, 7.259e-02)); + r += mul(s5_3, M4(6.263e-02, 2.280e-02, 4.589e-02, 3.006e-02, -9.011e-04, 3.325e-02, 2.086e-01, 7.638e-02, -1.186e-01, 3.649e-02, -1.092e-01, 3.803e-03, 8.423e-02, 7.991e-03, -1.693e-02, -1.075e-01)); + r += mul(s5_4, M4(2.400e-02, -1.483e-01, -8.745e-02, -3.013e-02, 5.574e-02, 7.154e-02, -2.962e-01, -1.161e-01, 6.972e-03, 5.588e-02, 1.938e-01, 1.804e-01, 6.647e-02, 3.031e-01, -4.253e-02, 9.602e-03)); + r += mul(s5_5, M4(1.932e-02, -4.527e-02, 1.921e-02, -7.693e-03, -6.628e-02, 7.647e-02, 4.823e-02, 5.237e-02, -2.770e-02, 5.194e-02, -2.895e-02, 1.791e-02, 5.963e-03, 8.029e-02, 2.304e-02, 1.151e-02)); + r += mul(s5_6, M4(-4.450e-02, 5.960e-02, -2.029e-02, -1.440e-02, 2.494e-02, 7.894e-02, -2.103e-01, 3.868e-02, -1.304e-02, -4.871e-02, 1.784e-01, -3.489e-02, -1.003e-02, -5.506e-02, 3.736e-02, 2.121e-02)); + r += mul(s5_7, M4(1.365e-02, -2.573e-03, 3.244e-03, 3.968e-02, -1.743e-01, -1.541e-01, 2.862e-01, 1.174e-01, -6.948e-02, 2.940e-01, -1.918e-01, -3.279e-02, 4.482e-02, -5.136e-02, -4.504e-02, 1.486e-02)); + r += mul(s5_8, M4(3.427e-02, 4.197e-04, 1.681e-03, 4.410e-02, -3.634e-02, -2.480e-02, -1.041e-01, -5.174e-02, -5.241e-02, -1.550e-01, 4.137e-02, -2.072e-02, -1.327e-02, 4.156e-02, -1.612e-02, -2.276e-02)); + r += mul(s6_0, M4(-4.266e-03, 3.320e-02, 1.134e-02, 1.656e-03, 3.672e-03, 4.921e-02, -5.757e-02, -4.775e-02, 1.112e-02, -9.419e-03, -2.463e-02, -4.559e-02, 6.722e-03, 1.077e-02, 6.055e-02, -4.903e-02)); + r += mul(s6_1, M4(-7.871e-03, -3.928e-02, 4.258e-02, -6.994e-02, 3.260e-02, -7.975e-03, 1.626e-01, 1.292e-02, -1.299e-02, -1.378e-02, 9.619e-02, 1.042e-01, 2.211e-02, -3.767e-02, -4.459e-02, 4.980e-02)); + r += mul(s6_2, M4(1.567e-02, -3.108e-02, 4.549e-02, -2.211e-02, -9.127e-03, 8.663e-03, -3.361e-02, -6.962e-02, -1.247e-02, -6.681e-02, -7.330e-02, 1.146e-01, 2.686e-02, 1.850e-02, -8.339e-02, -3.501e-02)); + r += mul(s6_3, M4(1.518e-02, 7.592e-04, -3.129e-02, 2.893e-02, 1.521e-01, 3.939e-02, 1.852e-01, -1.160e-01, -1.022e-01, 7.489e-02, 9.395e-02, -5.603e-02, -9.725e-02, 7.591e-02, -1.499e-01, 3.280e-02)); + r += mul(s6_4, M4(-2.125e-01, -5.828e-02, -2.803e-02, 9.889e-02, -3.857e-01, 1.435e-01, 4.770e-01, 5.873e-01, -3.387e-01, 5.346e-02, -1.896e-01, -1.812e-01, 7.526e-02, -4.860e-02, 1.626e-01, 1.091e-01)); + r += mul(s6_5, M4(4.983e-02, 5.614e-02, -8.512e-02, -6.024e-02, 1.184e-01, 1.253e-01, -5.679e-02, -1.284e-01, 1.984e-02, -6.673e-02, 4.165e-02, 1.339e-02, 2.025e-02, -5.299e-02, 1.479e-01, 1.989e-01)); + r += mul(s6_6, M4(1.706e-02, 7.105e-02, 1.356e-02, -3.985e-03, 1.652e-02, 1.051e-01, -4.720e-02, 3.490e-02, 9.166e-03, -1.493e-02, -5.726e-02, 1.760e-03, -5.532e-03, 5.947e-03, 6.036e-02, -3.430e-02)); + r += mul(s6_7, M4(-1.490e-02, -1.024e-01, 6.941e-02, -5.101e-02, -1.117e-01, -6.986e-01, -1.208e-01, -5.732e-02, -9.263e-02, 2.819e-02, -2.642e-02, -4.355e-03, -4.265e-02, 8.176e-02, -1.318e-02, -3.722e-02)); + r += mul(s6_8, M4(-1.656e-02, -4.463e-02, -1.614e-02, 2.373e-02, -8.426e-02, -2.565e-01, -1.981e-02, -3.502e-02, 5.466e-02, -1.358e-01, 2.843e-02, -5.444e-03, 3.367e-03, 2.317e-02, 1.843e-02, -1.724e-02)); + r += mul(s7_0, M4(-2.948e-02, 4.966e-02, -6.441e-02, 1.678e-01, -2.802e-02, 2.056e-02, 5.476e-02, -5.943e-02, 1.840e-02, -6.474e-02, 9.075e-02, -5.608e-02, 2.460e-02, 1.304e-02, -3.671e-02, 3.320e-02)); + r += mul(s7_1, M4(-1.210e-01, -5.928e-03, -9.505e-02, -1.144e-01, 4.999e-02, 4.006e-02, 7.867e-02, -9.689e-02, 2.531e-02, -2.388e-02, -1.326e-01, -4.300e-03, -4.730e-03, -1.709e-02, 9.504e-02, -1.560e-01)); + r += mul(s7_2, M4(2.368e-02, 1.598e-02, 1.939e-02, 2.229e-02, -8.901e-03, 3.264e-02, -5.201e-02, 2.975e-02, -1.862e-02, -1.274e-02, -5.630e-02, 9.691e-02, -2.017e-02, 1.436e-02, -5.703e-02, -1.329e-01)); + r += mul(s7_3, M4(6.468e-02, -5.168e-02, -4.589e-02, -1.296e-01, -3.748e-02, 6.205e-02, 1.169e-01, 1.290e-02, -3.376e-02, 1.150e-01, -5.875e-02, 3.723e-02, 5.062e-02, -2.485e-02, 1.010e-01, -3.626e-02)); + r += mul(s7_4, M4(-3.859e-01, -1.543e-01, 3.731e-02, 2.154e-01, -1.875e-01, -2.323e-02, -6.666e-02, 2.167e-01, 2.360e-01, -5.187e-02, -2.250e-01, -1.269e-01, -1.053e-01, 4.447e-02, 8.836e-02, 3.553e-01)); + r += mul(s7_5, M4(1.962e-03, -2.099e-02, -3.995e-02, -6.632e-02, 5.703e-02, -2.154e-02, 4.528e-02, -9.169e-02, -3.296e-03, -3.898e-02, 9.495e-02, -7.648e-02, -6.956e-02, -3.532e-02, 1.037e-01, 1.246e-01)); + r += mul(s7_6, M4(-9.365e-02, 1.239e-01, 3.454e-02, 3.758e-02, 6.988e-02, -4.852e-02, -1.090e-01, -3.746e-02, 2.325e-02, -6.496e-02, -5.741e-02, -3.494e-02, 5.050e-02, 1.425e-02, 1.124e-02, 3.424e-02)); + r += mul(s7_7, M4(-1.265e-01, 6.155e-02, -1.387e-02, -7.290e-02, -5.033e-02, -4.871e-02, 3.574e-02, -1.409e-02, -8.228e-02, 4.601e-01, 6.758e-04, -3.336e-02, -1.582e-01, -1.377e-01, 5.354e-02, -2.447e-02)); + r += mul(s7_8, M4(-2.962e-03, 1.799e-01, -1.983e-02, 4.959e-02, -1.261e-02, -1.327e-01, -1.250e-02, -1.425e-02, 8.955e-02, 1.298e-01, -1.716e-02, 1.260e-02, -6.916e-03, 3.633e-02, 1.023e-02, -6.955e-02)); + r += V4(-9.683e-04, -2.415e-03, 4.691e-03, 2.899e-03); + return r; +} + +V4 f3(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-5.844e-03, 1.554e-01, -9.987e-02, 1.321e-01, -7.304e-02, 9.423e-02, 3.915e-02, -4.898e-02, -5.754e-02, 1.577e-01, -3.256e-02, 1.626e-01, -3.055e-02, -9.402e-03, -1.852e-02, -1.834e-02)); + r += mul(s0_1, M4(-6.417e-02, 7.474e-02, 4.864e-02, -4.934e-02, -7.196e-02, 1.810e-01, -1.471e-01, -1.831e-02, 6.508e-02, 1.228e-02, -1.634e-02, -9.918e-02, 2.784e-03, 1.068e-02, 9.356e-02, -1.270e-01)); + r += mul(s0_2, M4(-7.413e-03, 3.390e-02, -1.188e-01, -1.457e-02, -9.838e-03, 1.611e-02, -4.288e-02, -4.426e-02, -6.105e-02, 5.614e-02, 5.299e-02, 7.541e-02, -7.666e-02, -1.571e-02, -6.267e-02, -8.539e-03)); + r += mul(s0_3, M4(-7.046e-02, -9.099e-02, -7.332e-02, -4.078e-02, -1.651e-01, 2.003e-01, 3.956e-03, 8.217e-03, -1.464e-01, -4.877e-02, -1.386e-01, 1.315e-01, 4.155e-02, 2.929e-02, -3.655e-02, -3.612e-02)); + r += mul(s0_4, M4(-3.723e-01, -1.761e-01, -2.862e-01, 8.008e-04, -5.477e-02, 1.588e-01, -1.080e-01, 3.813e-01, -7.015e-02, -2.961e-02, -2.635e-02, 2.571e-01, 3.292e-02, -7.038e-02, 5.401e-03, -9.336e-03)); + r += mul(s0_5, M4(-5.563e-02, -2.680e-02, -1.954e-02, 1.323e-01, -2.530e-01, 1.074e-01, -4.652e-01, 7.981e-02, -2.483e-02, -2.423e-02, -3.723e-02, -8.706e-02, -5.204e-02, -5.312e-02, 2.606e-02, -3.335e-03)); + r += mul(s0_6, M4(-9.645e-02, 6.358e-02, 4.216e-02, 1.131e-01, 2.108e-02, 2.098e-02, 6.549e-03, -5.148e-02, -9.235e-02, 6.919e-02, 1.248e-02, -4.267e-03, 1.063e-01, -1.325e-02, -2.634e-03, -2.397e-02)); + r += mul(s0_7, M4(3.359e-02, 1.352e-01, -2.312e-01, -9.207e-02, -7.667e-02, -4.678e-02, -1.027e-01, -7.593e-02, -4.580e-02, 6.862e-03, 5.972e-04, 2.609e-02, -1.291e-01, 4.462e-02, -5.702e-02, 5.811e-02)); + r += mul(s0_8, M4(1.752e-02, -1.779e-02, 6.688e-03, -1.062e-01, -9.378e-02, 2.514e-02, -2.137e-01, 9.271e-02, -5.857e-02, 3.197e-03, -7.593e-02, 6.963e-02, -5.174e-02, 5.168e-02, 6.475e-02, 5.364e-03)); + r += mul(s1_0, M4(-2.804e-02, 3.615e-03, -1.209e-02, -2.437e-02, 1.378e-02, -4.057e-02, 3.856e-02, -1.013e-02, 5.417e-02, 1.450e-01, 6.627e-02, -3.019e-02, -5.221e-02, -3.153e-02, 6.608e-02, 1.319e-03)); + r += mul(s1_1, M4(6.063e-02, 2.107e-02, 4.786e-02, 7.006e-02, -8.505e-03, 3.895e-02, -6.218e-02, -9.748e-02, -9.074e-02, -4.568e-03, -1.059e-01, -4.216e-02, 1.567e-01, 2.320e-02, 3.330e-01, -1.519e-01)); + r += mul(s1_2, M4(1.058e-03, -2.897e-02, -2.634e-02, -3.948e-02, -3.213e-02, -7.246e-03, 1.435e-02, 1.586e-02, 4.976e-02, 4.865e-02, -1.550e-02, -8.290e-03, -8.188e-02, -8.424e-02, 1.040e-02, 6.041e-02)); + r += mul(s1_3, M4(-4.196e-02, -1.958e-01, -2.251e-02, -1.413e-01, 6.275e-02, 4.110e-02, 9.982e-02, 5.650e-02, 9.648e-02, -9.338e-02, 3.261e-02, -5.427e-03, 2.020e-02, -4.565e-02, 1.015e-02, -1.362e-01)); + r += mul(s1_4, M4(-9.324e-02, -1.733e-01, -5.316e-02, -2.774e-01, -5.793e-02, 1.081e-02, -2.404e-01, 1.028e-01, 2.578e-02, 2.004e-02, 8.182e-02, 1.598e-02, 7.152e-01, -1.617e-01, -1.103e-02, -8.309e-02)); + r += mul(s1_5, M4(4.133e-03, -2.312e-02, 2.066e-02, 7.804e-02, 3.571e-02, -3.780e-03, 9.405e-02, -7.585e-05, 4.132e-02, -9.038e-02, 1.091e-01, 7.613e-02, -1.828e-01, 2.568e-02, -1.351e-01, -9.911e-02)); + r += mul(s1_6, M4(9.771e-02, 1.240e-02, 2.540e-02, -1.478e-02, 1.216e-01, 4.834e-02, 1.506e-02, -4.087e-02, -1.564e-01, 2.364e-02, -1.977e-03, 1.286e-01, 8.045e-03, 7.522e-03, -1.324e-02, -4.959e-02)); + r += mul(s1_7, M4(-2.213e-01, -1.216e-02, -7.938e-02, -1.294e-01, 3.202e-02, 3.705e-02, -4.118e-02, -4.715e-02, 8.480e-02, 3.195e-02, -1.020e-01, -8.519e-02, 2.847e-01, 6.033e-02, 5.722e-02, -2.313e-02)); + r += mul(s1_8, M4(8.365e-02, -1.676e-02, 3.341e-02, -6.065e-02, -9.992e-03, 3.877e-02, 2.455e-02, 2.107e-02, 4.355e-03, -4.409e-02, -4.814e-02, -8.902e-02, -1.522e-02, 2.618e-02, -3.471e-03, 1.016e-02)); + r += mul(s2_0, M4(2.073e-03, 1.905e-01, 5.916e-02, 8.437e-02, -4.019e-02, 1.317e-02, -6.072e-02, 1.908e-02, 1.679e-01, 6.164e-02, 7.262e-02, -9.583e-03, 6.088e-02, -7.323e-03, 1.460e-01, -1.744e-02)); + r += mul(s2_1, M4(2.516e-02, 2.239e-01, -2.767e-01, 1.073e-02, 1.391e-01, -7.229e-02, 3.888e-02, -2.419e-02, -3.716e-02, 8.999e-03, 6.149e-02, 2.671e-02, -1.305e-01, -2.019e-01, 1.115e-01, -1.616e-01)); + r += mul(s2_2, M4(-1.651e-02, 7.084e-02, -1.182e-03, 2.399e-01, -1.086e-01, -6.664e-03, -7.713e-02, -9.798e-02, 7.428e-02, 2.596e-02, -9.965e-03, -2.995e-02, 5.164e-02, -1.678e-03, -1.451e-01, -8.076e-02)); + r += mul(s2_3, M4(1.190e-01, 3.007e-02, 4.784e-03, -7.826e-02, -2.599e-01, -1.379e-01, -2.805e-02, -1.294e-01, 1.990e-01, -1.185e-01, 5.226e-02, 5.370e-02, 1.508e-01, -9.447e-02, 1.116e-01, 9.319e-02)); + r += mul(s2_4, M4(1.826e-01, 7.537e-02, -3.623e-02, -3.881e-02, 2.956e-01, -2.971e-01, 1.199e-01, 1.082e-01, 2.164e-02, 5.639e-02, 8.989e-02, -3.416e-03, 7.939e-03, -3.193e-01, -1.613e-01, 1.073e-01)); + r += mul(s2_5, M4(6.423e-02, 8.481e-02, -1.448e-02, -6.871e-02, -1.065e-01, 1.465e-02, -6.037e-02, 4.801e-03, 6.445e-02, 3.601e-02, -2.203e-03, 8.718e-02, 1.127e-01, -4.716e-02, 9.620e-02, 7.383e-02)); + r += mul(s2_6, M4(-3.053e-02, -3.952e-02, -6.666e-02, 7.401e-03, -1.246e-01, 5.702e-02, 2.252e-02, -1.665e-01, 5.571e-02, -6.662e-02, 2.469e-02, -1.780e-01, 9.934e-02, -1.687e-02, -1.031e-02, -2.773e-01)); + r += mul(s2_7, M4(1.636e-01, 1.405e-02, -5.639e-02, -7.883e-02, 6.668e-02, 1.294e-01, 4.010e-03, -7.690e-02, -8.254e-02, -3.036e-02, 2.605e-02, -6.489e-02, -1.315e-03, 5.165e-02, 7.594e-02, -1.500e-01)); + r += mul(s2_8, M4(-2.363e-02, 5.973e-03, 9.222e-02, 5.499e-02, -6.881e-03, 3.373e-02, -3.033e-02, 8.101e-02, 3.046e-02, -5.542e-02, 1.137e-03, -4.601e-02, 9.911e-02, 3.916e-02, 3.760e-02, -9.976e-02)); + r += mul(s3_0, M4(-7.036e-03, 2.348e-02, -2.668e-02, -1.673e-02, -1.081e-02, 5.490e-02, 3.197e-02, -1.238e-01, 7.411e-02, -1.263e-03, 5.113e-02, -3.649e-02, -3.940e-02, 1.214e-03, -4.966e-02, 3.034e-03)); + r += mul(s3_1, M4(9.343e-02, 7.414e-02, 1.265e-01, -1.021e-01, 3.649e-02, 1.131e-01, 2.501e-02, -3.036e-02, -3.411e-02, -2.742e-02, -2.141e-02, 5.247e-02, 1.422e-03, 2.364e-03, 2.285e-02, -4.067e-02)); + r += mul(s3_2, M4(-2.294e-02, -7.549e-03, 4.819e-02, 2.262e-02, -5.783e-02, 5.869e-02, -1.805e-02, 3.606e-02, -1.720e-02, -4.628e-02, -6.133e-03, 1.211e-02, 1.473e-02, 4.633e-04, 6.455e-02, 1.707e-02)); + r += mul(s3_3, M4(4.179e-02, 4.599e-02, 8.031e-03, -3.261e-02, -7.724e-02, -2.398e-02, 8.735e-04, 4.392e-02, 1.509e-01, -1.521e-03, -1.172e-02, 7.285e-02, -1.587e-02, -1.100e-02, 6.007e-03, -6.076e-02)); + r += mul(s3_4, M4(1.015e-01, -9.532e-02, 2.807e-02, 9.613e-02, 1.001e-01, -8.175e-02, -1.064e-01, -2.877e-02, 3.196e-01, -2.984e-02, 2.316e-02, 1.708e-02, 1.076e-01, 1.969e-02, 5.984e-02, -1.004e-01)); + r += mul(s3_5, M4(5.147e-02, -7.400e-03, 4.185e-02, -1.841e-02, 1.928e-02, -6.324e-02, -7.078e-03, -1.564e-02, -1.146e-01, 8.080e-02, -7.694e-02, 1.290e-02, -8.033e-02, 5.211e-02, -2.262e-03, -2.603e-02)); + r += mul(s3_6, M4(1.547e-02, 2.161e-02, -1.655e-02, 3.602e-02, -1.989e-02, 8.062e-03, -7.888e-03, 2.668e-02, -2.696e-02, -1.124e-02, 8.936e-03, -7.228e-02, -6.847e-02, -2.122e-02, -1.353e-02, 2.351e-02)); + r += mul(s3_7, M4(1.200e-01, 4.431e-03, 3.703e-02, -6.798e-02, -4.969e-02, 1.252e-02, -5.912e-02, -6.205e-02, -5.068e-02, 7.159e-03, -4.983e-02, -2.351e-02, 3.609e-02, -2.077e-02, 4.927e-02, 6.275e-02)); + r += mul(s3_8, M4(-1.623e-02, 2.697e-04, 1.456e-02, 6.648e-02, -3.145e-02, 1.694e-02, 3.269e-02, 5.426e-02, 2.234e-02, -3.981e-03, -4.205e-02, 1.487e-02, -1.922e-02, -2.691e-02, 3.359e-02, -4.451e-02)); + r += mul(s4_0, M4(-3.743e-01, -2.256e-02, -2.008e-01, 2.801e-01, -1.807e-02, -3.615e-02, 3.172e-02, -1.966e-02, -3.453e-02, 1.082e-01, 4.911e-02, -4.706e-02, -4.231e-02, 8.145e-01, 2.666e-03, 4.914e-01)); + r += mul(s4_1, M4(1.266e-01, 4.054e-01, 2.968e-01, 4.639e-01, 1.063e-01, -4.573e-02, 4.886e-02, -1.962e-02, -3.122e-02, -1.772e-02, -1.607e-01, -5.203e-02, -2.388e-01, 3.515e-01, -2.278e-01, 3.669e-01)); + r += mul(s4_2, M4(5.112e-02, -2.854e-02, 2.998e-01, -9.501e-02, 6.029e-03, -3.608e-02, 2.662e-02, -1.232e-01, 2.802e-03, 3.074e-02, 3.239e-02, 9.839e-02, -4.825e-02, 5.658e-02, -8.847e-02, 1.115e-01)); + r += mul(s4_3, M4(-2.824e-01, 1.812e-01, -1.479e-02, -4.548e-02, -2.106e-02, -1.398e-02, 1.541e-02, -5.793e-02, 2.479e-02, -1.207e-01, 6.618e-02, -1.195e-01, -1.081e-01, 3.893e-03, -3.853e-02, 3.672e-01)); + r += mul(s4_4, M4(-1.810e-01, -7.004e-02, 2.545e-01, 3.877e-01, 2.124e-01, 2.176e-02, -5.939e-02, -1.713e-01, -9.402e-02, -2.104e-01, -1.047e-01, -2.873e-01, 1.080e-01, -9.161e-03, -1.703e-01, -1.753e-01)); + r += mul(s4_5, M4(-3.937e-01, 1.740e-01, 2.346e-02, -2.843e-01, -9.724e-02, 1.133e-02, 4.398e-02, 7.771e-02, 4.686e-02, 3.870e-02, 4.896e-02, -1.328e-01, 7.552e-03, 4.673e-02, -2.957e-02, 6.534e-02)); + r += mul(s4_6, M4(-6.416e-02, -1.017e-01, 1.154e-01, 1.133e-01, -3.764e-02, -3.613e-03, -7.828e-04, 4.870e-02, -1.794e-02, 9.768e-02, -4.049e-02, 1.990e-01, 9.667e-02, 4.579e-02, 2.897e-02, -5.383e-02)); + r += mul(s4_7, M4(2.810e-01, 2.579e-01, -2.749e-02, -4.264e-01, -7.708e-02, 8.357e-03, 2.550e-02, 4.187e-02, -8.995e-02, -8.624e-02, 2.607e-02, -8.133e-03, -1.030e-01, 2.847e-02, -9.830e-02, -3.134e-02)); + r += mul(s4_8, M4(-3.575e-01, -2.686e-02, -1.088e-01, -8.145e-02, -4.100e-03, -1.068e-02, 4.221e-03, 1.113e-02, -9.216e-04, 3.555e-02, 1.371e-02, -5.217e-02, -9.224e-04, 1.972e-02, -3.992e-02, -1.156e-02)); + r += mul(s5_0, M4(5.843e-02, 5.810e-03, 1.973e-02, -4.943e-02, 2.861e-02, 3.491e-02, 2.447e-02, 3.334e-03, 4.134e-02, 6.052e-02, -1.442e-02, 4.824e-03, -6.182e-02, 4.679e-02, -1.181e-02, 5.764e-02)); + r += mul(s5_1, M4(-1.254e-01, -3.464e-02, -1.534e-02, 1.099e-01, -7.255e-02, 3.052e-02, -1.206e-01, 1.915e-02, 5.714e-02, -1.211e-02, -4.535e-03, -1.104e-01, -1.319e-01, -4.419e-02, 6.282e-02, 1.092e-01)); + r += mul(s5_2, M4(4.543e-02, -3.484e-02, 5.793e-02, -4.426e-02, 4.397e-02, -4.703e-02, 1.392e-02, -8.030e-02, -1.836e-02, 3.873e-02, 9.299e-02, 2.857e-02, 2.991e-02, -1.835e-02, -5.184e-02, -2.837e-02)); + r += mul(s5_3, M4(4.986e-02, -2.258e-04, -8.686e-03, 3.482e-02, 8.419e-03, 5.851e-02, -1.684e-02, -5.232e-02, -7.397e-02, -4.820e-02, -3.955e-02, 4.374e-02, 2.606e-02, -1.474e-02, 5.834e-02, 4.784e-02)); + r += mul(s5_4, M4(-3.278e-04, -4.129e-03, 2.977e-02, -4.259e-02, -7.836e-02, -1.768e-01, -6.157e-02, -4.212e-01, 1.305e-01, 5.900e-03, 3.175e-02, 1.393e-01, 1.560e-01, 1.311e-02, 1.226e-01, -1.183e-01)); + r += mul(s5_5, M4(-5.974e-02, 6.514e-02, -2.588e-02, 5.216e-02, 5.597e-02, 2.416e-02, 7.330e-02, -2.582e-03, -7.243e-03, 6.378e-03, 3.404e-02, -7.524e-02, 4.381e-02, 1.811e-02, 2.229e-02, 3.689e-02)); + r += mul(s5_6, M4(2.569e-04, 5.830e-03, 4.810e-03, -3.864e-02, 1.194e-02, 6.163e-02, 2.504e-02, 1.396e-01, -9.142e-03, 2.301e-02, -2.321e-02, -5.109e-02, -4.148e-02, 3.869e-02, 8.283e-04, -3.578e-02)); + r += mul(s5_7, M4(2.535e-03, 6.239e-02, 4.885e-03, -4.034e-02, -2.369e-01, 3.504e-02, -2.052e-01, 2.957e-01, -6.562e-02, 2.255e-02, -7.893e-03, -1.276e-01, -4.230e-02, 2.348e-02, 5.599e-03, -6.273e-02)); + r += mul(s5_8, M4(-9.187e-03, 5.527e-02, 9.465e-03, 1.230e-02, -9.693e-02, 2.337e-02, -5.018e-02, 6.008e-03, 1.378e-02, -4.946e-03, 5.239e-02, 2.652e-02, 3.399e-02, -8.836e-04, 1.851e-02, -2.626e-02)); + r += mul(s6_0, M4(3.379e-02, -2.399e-02, -4.265e-02, -8.043e-02, 2.099e-02, -9.810e-02, 4.898e-02, -5.211e-02, -2.842e-03, -3.843e-02, 3.951e-02, 6.667e-03, 2.649e-02, 1.701e-02, -3.060e-02, 4.041e-02)); + r += mul(s6_1, M4(-9.006e-03, 1.676e-01, -1.003e-02, 5.151e-02, 3.163e-02, 4.564e-02, -6.965e-02, 2.953e-02, -1.655e-01, -1.426e-01, -1.307e-01, 2.165e-01, 3.455e-02, -3.141e-02, 7.936e-02, -2.925e-02)); + r += mul(s6_2, M4(-3.907e-02, 1.847e-03, 6.902e-02, 6.066e-02, 2.182e-03, -8.721e-02, 7.738e-02, -6.377e-02, -6.177e-02, 1.658e-02, -1.375e-01, 8.056e-02, 4.474e-02, -4.473e-03, -3.670e-02, -1.195e-01)); + r += mul(s6_3, M4(2.058e-02, 2.677e-02, -4.589e-04, -2.547e-02, 1.198e-01, -6.429e-02, 1.756e-02, 3.844e-01, -9.013e-02, -5.836e-02, -4.381e-03, -7.382e-02, -5.788e-02, -1.925e-02, -4.363e-02, -9.881e-02)); + r += mul(s6_4, M4(-1.774e-01, 1.101e-01, -4.123e-02, -2.167e-03, -4.139e-01, -1.634e-01, -4.823e-01, 4.205e-01, -1.990e-01, -5.623e-03, -1.491e-03, 2.477e-03, 8.383e-02, 6.132e-02, 8.338e-02, 8.971e-02)); + r += mul(s6_5, M4(-1.043e-01, 2.256e-02, 1.143e-01, -6.616e-02, -1.464e-01, -7.427e-02, 3.555e-02, -1.852e-01, 4.454e-02, 1.994e-02, -5.957e-02, 5.819e-02, 5.707e-02, 4.078e-02, -2.942e-02, 1.648e-01)); + r += mul(s6_6, M4(1.917e-02, 2.395e-02, 1.240e-03, 7.490e-02, 2.125e-02, -5.508e-02, 4.957e-02, -1.780e-01, -4.028e-02, -2.978e-03, 1.606e-02, 8.035e-03, -5.799e-02, -2.113e-03, -3.876e-02, -1.504e-02)); + r += mul(s6_7, M4(2.720e-02, -2.151e-02, 4.837e-02, 8.041e-02, -3.779e-01, 1.368e-01, 4.470e-02, 1.481e-03, -4.211e-02, 8.353e-03, -8.142e-02, -3.991e-02, -1.079e-01, -7.464e-02, 3.982e-03, -1.240e-01)); + r += mul(s6_8, M4(9.181e-03, -1.923e-04, 9.953e-03, -6.180e-02, 1.241e-02, 5.246e-03, 4.752e-02, -2.098e-02, 1.469e-02, 5.371e-02, 3.001e-02, 9.175e-02, 3.327e-02, 1.569e-03, 6.034e-02, 1.628e-02)); + r += mul(s7_0, M4(4.657e-02, 1.687e-01, 3.505e-02, -6.694e-02, -1.819e-02, -4.057e-02, -1.262e-02, -5.044e-02, 8.183e-02, -2.083e-01, -7.118e-02, -1.669e-02, 3.043e-02, 2.407e-02, 3.859e-02, 1.313e-02)); + r += mul(s7_1, M4(-1.862e-02, -9.117e-02, -2.167e-01, -8.257e-02, 7.039e-02, 1.596e-01, -3.436e-02, -3.428e-02, -4.240e-02, -7.341e-02, 2.769e-01, 5.086e-02, -1.324e-02, -4.328e-02, -1.447e-01, 4.743e-04)); + r += mul(s7_2, M4(1.579e-02, -1.775e-02, 9.142e-02, -9.606e-03, -1.254e-02, -8.763e-03, 6.363e-02, -6.381e-02, -3.024e-02, 6.262e-02, -1.323e-01, 3.912e-02, 6.531e-02, -7.883e-02, -1.101e-01, -1.480e-01)); + r += mul(s7_3, M4(4.739e-02, -1.739e-02, 6.063e-02, 1.364e-01, -9.051e-02, -1.215e-01, -7.398e-02, 2.284e-02, 9.971e-02, -1.589e-02, -8.920e-02, -1.952e-01, 7.063e-03, -8.791e-02, 4.235e-02, -3.058e-02)); + r += mul(s7_4, M4(-2.864e-01, 2.797e-01, -2.977e-01, 2.923e-01, 1.144e-01, -3.507e-01, -7.560e-02, 3.456e-02, 4.366e-01, 9.177e-02, 9.463e-02, -2.082e-01, -2.926e-01, 1.083e-01, -2.552e-01, 6.352e-02)); + r += mul(s7_5, M4(-2.574e-03, 4.174e-02, 2.754e-02, 5.446e-02, -6.982e-02, -3.854e-02, 3.453e-02, -6.915e-02, 1.067e-01, -2.521e-02, 9.016e-03, 7.085e-02, -3.043e-02, -1.628e-01, -3.251e-01, -1.362e-01)); + r += mul(s7_6, M4(9.595e-02, 4.518e-02, 3.763e-02, -1.439e-01, -1.223e-01, -4.048e-02, 1.560e-02, 8.571e-02, -7.292e-02, -6.801e-02, -2.210e-02, -3.341e-02, -6.534e-03, -4.839e-03, 2.293e-02, 5.185e-02)); + r += mul(s7_7, M4(-1.496e-01, 1.637e-01, -1.085e-02, 2.865e-02, -1.082e-01, -4.290e-02, -8.978e-03, 8.324e-02, 4.995e-02, -2.644e-02, 2.657e-03, -1.422e-01, -2.690e-01, -1.773e-01, -1.007e-02, -2.957e-02)); + r += mul(s7_8, M4(1.455e-02, 5.432e-02, -4.916e-02, -7.562e-02, -2.951e-02, 5.760e-02, 2.528e-02, 4.951e-02, 4.740e-02, -1.737e-03, 6.007e-02, -7.422e-04, -7.052e-02, -3.010e-02, 3.249e-02, -8.888e-02)); + r += V4(-2.811e-03, 2.195e-03, -5.315e-03, 3.496e-03); + return r; +} + +void Pass5(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = Rmp8x8(tid.x) + blockStart; + uint2 size = GetInputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = (gxy + 0.5) * pt; + + V4 s0_0 = l0(-1.0, -1.0); + V4 s0_1 = l0(0.0, -1.0); + V4 s0_2 = l0(1.0, -1.0); + V4 s0_3 = l0(-1.0, 0.0); + V4 s0_4 = l0(0.0, 0.0); + V4 s0_5 = l0(1.0, 0.0); + V4 s0_6 = l0(-1.0, 1.0); + V4 s0_7 = l0(0.0, 1.0); + V4 s0_8 = l0(1.0, 1.0); + V4 s1_0 = -max(-s0_0, 0.0); + V4 s1_1 = -max(-s0_1, 0.0); + V4 s1_2 = -max(-s0_2, 0.0); + V4 s1_3 = -max(-s0_3, 0.0); + V4 s1_4 = -max(-s0_4, 0.0); + V4 s1_5 = -max(-s0_5, 0.0); + V4 s1_6 = -max(-s0_6, 0.0); + V4 s1_7 = -max(-s0_7, 0.0); + V4 s1_8 = -max(-s0_8, 0.0); + s0_0 = max(s0_0, 0.0); + s0_1 = max(s0_1, 0.0); + s0_2 = max(s0_2, 0.0); + s0_3 = max(s0_3, 0.0); + s0_4 = max(s0_4, 0.0); + s0_5 = max(s0_5, 0.0); + s0_6 = max(s0_6, 0.0); + s0_7 = max(s0_7, 0.0); + s0_8 = max(s0_8, 0.0); + + V4 s2_0 = l1(-1.0, -1.0); + V4 s2_1 = l1(0.0, -1.0); + V4 s2_2 = l1(1.0, -1.0); + V4 s2_3 = l1(-1.0, 0.0); + V4 s2_4 = l1(0.0, 0.0); + V4 s2_5 = l1(1.0, 0.0); + V4 s2_6 = l1(-1.0, 1.0); + V4 s2_7 = l1(0.0, 1.0); + V4 s2_8 = l1(1.0, 1.0); + V4 s3_0 = -max(-s2_0, 0.0); + V4 s3_1 = -max(-s2_1, 0.0); + V4 s3_2 = -max(-s2_2, 0.0); + V4 s3_3 = -max(-s2_3, 0.0); + V4 s3_4 = -max(-s2_4, 0.0); + V4 s3_5 = -max(-s2_5, 0.0); + V4 s3_6 = -max(-s2_6, 0.0); + V4 s3_7 = -max(-s2_7, 0.0); + V4 s3_8 = -max(-s2_8, 0.0); + s2_0 = max(s2_0, 0.0); + s2_1 = max(s2_1, 0.0); + s2_2 = max(s2_2, 0.0); + s2_3 = max(s2_3, 0.0); + s2_4 = max(s2_4, 0.0); + s2_5 = max(s2_5, 0.0); + s2_6 = max(s2_6, 0.0); + s2_7 = max(s2_7, 0.0); + s2_8 = max(s2_8, 0.0); + + V4 s4_0 = l2(-1.0, -1.0); + V4 s4_1 = l2(0.0, -1.0); + V4 s4_2 = l2(1.0, -1.0); + V4 s4_3 = l2(-1.0, 0.0); + V4 s4_4 = l2(0.0, 0.0); + V4 s4_5 = l2(1.0, 0.0); + V4 s4_6 = l2(-1.0, 1.0); + V4 s4_7 = l2(0.0, 1.0); + V4 s4_8 = l2(1.0, 1.0); + V4 s5_0 = -max(-s4_0, 0.0); + V4 s5_1 = -max(-s4_1, 0.0); + V4 s5_2 = -max(-s4_2, 0.0); + V4 s5_3 = -max(-s4_3, 0.0); + V4 s5_4 = -max(-s4_4, 0.0); + V4 s5_5 = -max(-s4_5, 0.0); + V4 s5_6 = -max(-s4_6, 0.0); + V4 s5_7 = -max(-s4_7, 0.0); + V4 s5_8 = -max(-s4_8, 0.0); + s4_0 = max(s4_0, 0.0); + s4_1 = max(s4_1, 0.0); + s4_2 = max(s4_2, 0.0); + s4_3 = max(s4_3, 0.0); + s4_4 = max(s4_4, 0.0); + s4_5 = max(s4_5, 0.0); + s4_6 = max(s4_6, 0.0); + s4_7 = max(s4_7, 0.0); + s4_8 = max(s4_8, 0.0); + + V4 s6_0 = l3(-1.0, -1.0); + V4 s6_1 = l3(0.0, -1.0); + V4 s6_2 = l3(1.0, -1.0); + V4 s6_3 = l3(-1.0, 0.0); + V4 s6_4 = l3(0.0, 0.0); + V4 s6_5 = l3(1.0, 0.0); + V4 s6_6 = l3(-1.0, 1.0); + V4 s6_7 = l3(0.0, 1.0); + V4 s6_8 = l3(1.0, 1.0); + V4 s7_0 = -max(-s6_0, 0.0); + V4 s7_1 = -max(-s6_1, 0.0); + V4 s7_2 = -max(-s6_2, 0.0); + V4 s7_3 = -max(-s6_3, 0.0); + V4 s7_4 = -max(-s6_4, 0.0); + V4 s7_5 = -max(-s6_5, 0.0); + V4 s7_6 = -max(-s6_6, 0.0); + V4 s7_7 = -max(-s6_7, 0.0); + V4 s7_8 = -max(-s6_8, 0.0); + s6_0 = max(s6_0, 0.0); + s6_1 = max(s6_1, 0.0); + s6_2 = max(s6_2, 0.0); + s6_3 = max(s6_3, 0.0); + s6_4 = max(s6_4, 0.0); + s6_5 = max(s6_5, 0.0); + s6_6 = max(s6_6, 0.0); + s6_7 = max(s6_7, 0.0); + s6_8 = max(s6_8, 0.0); + + t0[gxy] = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t1[gxy] = f1(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t2[gxy] = f2(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t3[gxy] = f3(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); +} + +//!PASS 6 +//!DESC out-shuffle +//!BLOCK_SIZE 16 +//!NUM_THREADS 64 +//!IN INPUT, t0, t1, t2, t3 +//!OUT OUTPUT + +#define l0(x, y) V4(O(t0, float2(x, y))) +#define l1(x, y) V4(O(t1, float2(x, y))) +#define l2(x, y) V4(O(t2, float2(x, y))) +#define l3(x, y) V4(O(t3, float2(x, y))) + +V4 f0(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(1.888e-02, -3.403e-03, 5.631e-03, -8.622e-03, -1.458e-05, -2.226e-02, 2.582e-02, -5.644e-03, -3.952e-02, 9.939e-03, -2.528e-02, -5.767e-03, 1.976e-02, 2.383e-04, -1.765e-02, -2.412e-02)); + r += mul(s0_1, M4(-4.944e-02, 8.011e-02, -6.296e-02, 1.099e-02, 1.841e-02, 4.527e-02, -9.701e-03, 9.380e-03, -1.764e-02, -8.276e-02, 5.824e-03, -2.972e-02, -2.729e-02, 5.527e-02, -9.236e-03, -8.955e-03)); + r += mul(s0_2, M4(1.764e-02, -6.812e-02, 3.431e-03, -2.123e-02, -1.605e-02, 1.850e-03, -3.013e-03, 8.246e-03, -6.503e-03, 2.533e-02, -8.876e-03, -9.591e-04, 2.255e-03, -1.201e-02, 1.540e-03, -2.920e-03)); + r += mul(s0_3, M4(2.650e-02, -5.410e-03, 3.586e-02, -3.986e-04, -4.626e-02, -1.262e-02, -6.323e-02, -1.873e-02, 2.632e-02, -6.002e-03, 1.960e-02, 1.260e-02, -3.853e-02, -6.770e-03, 5.896e-02, -1.443e-03)); + r += mul(s0_4, M4(1.233e-01, 3.216e-02, 1.401e-01, 1.211e-01, 2.484e-02, 1.150e-02, 1.584e-02, -1.874e-02, 3.018e-02, 8.186e-02, -8.657e-03, 2.788e-03, 3.894e-02, -1.638e-02, -8.682e-03, 2.488e-02)); + r += mul(s0_5, M4(-8.753e-02, 2.810e-02, -3.129e-02, -5.065e-02, 1.391e-02, -2.717e-03, 4.407e-03, 1.924e-02, -1.319e-02, -2.091e-02, -1.679e-03, 7.680e-03, 9.123e-03, 1.159e-02, 1.399e-03, -1.071e-02)); + r += mul(s0_6, M4(-4.298e-03, 3.027e-03, 4.670e-03, 3.987e-03, 1.077e-02, 1.056e-03, -2.411e-03, -7.530e-03, 1.200e-03, 6.779e-04, 7.780e-03, 4.998e-03, 6.117e-03, -1.134e-02, -2.398e-02, 6.210e-03)); + r += mul(s0_7, M4(-1.655e-02, 8.511e-03, -5.150e-03, -1.515e-03, -3.137e-03, 5.990e-03, 3.137e-02, 3.198e-02, -2.858e-03, -2.917e-03, 1.657e-02, 2.253e-02, -6.815e-03, 1.640e-02, 1.105e-02, 2.986e-02)); + r += mul(s0_8, M4(3.787e-03, -2.778e-02, -3.509e-02, -9.779e-03, 2.890e-03, 4.340e-03, -3.797e-03, -4.003e-03, 2.937e-03, 2.451e-03, -1.992e-03, -4.934e-03, 3.575e-03, 1.287e-03, 7.888e-03, 1.431e-02)); + r += mul(s1_0, M4(8.311e-04, 3.358e-03, -4.527e-04, -8.006e-03, -2.292e-02, -9.604e-03, 2.427e-02, 1.118e-02, -4.610e-02, -5.515e-02, -8.618e-02, 1.304e-02, -5.202e-02, -8.690e-02, 2.107e-02, -3.049e-02)); + r += mul(s1_1, M4(1.753e-02, 2.576e-02, -7.201e-02, 4.915e-03, -2.588e-01, -1.619e-01, 2.213e-01, 1.254e-01, -1.919e-01, 2.244e-01, 1.117e-01, -8.585e-02, -1.778e-02, 6.616e-02, 1.959e-03, 3.946e-03)); + r += mul(s1_2, M4(3.591e-02, -8.080e-02, 4.239e-03, -2.942e-02, 6.586e-04, -4.860e-02, -4.173e-02, 6.332e-02, 7.348e-03, -1.984e-02, 1.691e-02, -4.066e-02, -3.536e-03, -5.051e-03, 9.376e-04, -1.307e-03)); + r += mul(s1_3, M4(2.056e-03, 8.929e-03, 1.033e-02, 2.423e-02, -2.230e-02, -8.957e-03, -4.406e-02, -9.152e-03, 1.344e-02, -1.218e-02, 2.665e-01, -9.596e-02, 3.645e-01, -4.531e-02, -2.095e-01, 1.210e-01)); + r += mul(s1_4, M4(3.958e-01, -7.946e-02, 3.844e-01, -8.027e-03, 7.845e-02, 4.609e-02, -2.085e-02, 2.660e-02, 9.713e-02, 1.818e-02, -1.598e-01, 1.207e-02, 1.814e-02, -9.009e-02, -4.132e-03, -8.960e-02)); + r += mul(s1_5, M4(-5.529e-02, -1.450e-01, 1.146e-02, -1.788e-01, 3.910e-02, 5.140e-02, 2.975e-02, -2.628e-02, -9.157e-03, 3.761e-03, 1.054e-02, 1.309e-02, 1.474e-02, 2.617e-02, -3.821e-03, -9.823e-03)); + r += mul(s1_6, M4(-4.906e-03, 8.074e-03, -1.045e-02, 6.266e-03, 8.151e-03, 2.609e-03, 2.665e-03, -2.719e-03, 2.041e-04, 1.069e-02, -8.650e-03, -2.215e-03, -3.139e-02, 1.281e-03, -1.727e-02, -7.010e-03)); + r += mul(s1_7, M4(-1.916e-02, 1.448e-03, 6.456e-02, -4.235e-02, -6.792e-03, 9.169e-04, 3.381e-02, 2.972e-02, -3.892e-03, -2.675e-03, 3.504e-02, 2.591e-02, -2.620e-02, -4.219e-02, -2.688e-04, 1.606e-01)); + r += mul(s1_8, M4(-7.694e-03, -1.994e-02, -3.518e-02, -5.359e-02, 2.410e-03, -2.129e-04, -5.800e-03, 6.700e-03, -1.502e-03, 1.191e-03, -7.976e-03, -5.875e-03, 8.394e-04, -5.713e-03, 1.298e-02, 2.316e-03)); + r += mul(s2_0, M4(-4.358e-02, 1.205e-02, -1.150e-02, 1.204e-02, 2.057e-02, 2.434e-03, -7.853e-03, 2.368e-03, -7.508e-03, -1.951e-03, 6.640e-03, 1.790e-03, -1.187e-02, -6.954e-03, -1.163e-02, 6.363e-03)); + r += mul(s2_1, M4(6.230e-03, -9.421e-02, 2.283e-02, 5.563e-03, -1.273e-02, 3.673e-02, -1.731e-03, 5.327e-03, 1.650e-02, -2.073e-02, 4.072e-03, -1.494e-02, 5.910e-02, -9.066e-03, 1.432e-02, -9.310e-03)); + r += mul(s2_2, M4(1.872e-03, 4.321e-03, -6.060e-03, 1.506e-03, -1.147e-03, -3.120e-02, 5.099e-03, -8.089e-03, -1.281e-03, 3.518e-02, 2.337e-03, 1.787e-02, -2.022e-03, 2.472e-02, -2.785e-03, 1.791e-03)); + r += mul(s2_3, M4(8.936e-03, 2.829e-02, -3.183e-02, 2.790e-02, 3.410e-02, 2.374e-02, 4.922e-02, 1.864e-02, -6.471e-02, 6.844e-04, -6.425e-02, -1.419e-03, 2.599e-02, 1.764e-02, -6.465e-03, -1.644e-02)); + r += mul(s2_4, M4(7.059e-02, 8.303e-03, -6.271e-03, -9.405e-02, -1.386e-01, -9.546e-02, -6.011e-02, -9.171e-03, -2.279e-03, -5.129e-02, 2.251e-02, -5.562e-02, -5.187e-02, -2.396e-02, 4.020e-02, 3.432e-02)); + r += mul(s2_5, M4(-3.111e-02, 2.546e-02, -1.325e-03, 2.816e-02, 1.775e-02, -1.269e-02, 1.138e-02, -1.000e-02, 1.697e-02, 3.864e-03, 2.087e-03, 3.344e-02, -8.484e-04, -2.693e-02, 3.090e-03, 2.142e-02)); + r += mul(s2_6, M4(6.730e-03, 3.269e-04, 2.920e-02, 1.163e-02, -1.127e-02, 1.981e-03, 1.961e-03, 1.407e-02, 7.273e-03, -5.854e-03, -7.461e-03, -5.651e-03, -3.546e-04, 4.019e-03, 2.618e-02, 2.367e-02)); + r += mul(s2_7, M4(2.107e-02, 2.829e-02, 8.396e-02, 4.000e-02, 1.222e-02, -1.084e-02, -7.531e-02, -6.661e-02, -1.950e-03, 3.465e-03, -1.228e-02, 1.770e-05, 4.522e-03, -5.513e-03, -3.509e-02, -4.016e-02)); + r += mul(s2_8, M4(-3.927e-03, -9.815e-04, -1.947e-02, 6.041e-03, -7.065e-03, -2.652e-03, 5.390e-04, -2.048e-02, 5.926e-03, 7.797e-03, 1.450e-02, 1.169e-02, -1.547e-03, 2.840e-04, -5.163e-03, -1.303e-02)); + r += mul(s3_0, M4(-5.409e-02, 9.184e-03, -4.422e-03, 1.524e-02, 2.248e-02, -3.864e-03, -6.101e-03, -3.069e-03, -2.527e-02, 6.830e-03, -1.349e-03, 8.878e-03, 1.036e-02, -4.895e-02, 3.211e-02, -2.753e-02)); + r += mul(s3_1, M4(1.371e-02, -6.961e-02, 3.120e-02, 3.138e-02, 1.296e-01, 1.191e-01, -1.508e-02, 1.052e-02, 1.901e-01, -1.728e-01, 1.270e-02, -7.327e-03, -3.998e-02, 2.193e-01, -1.273e-02, 1.802e-02)); + r += mul(s3_2, M4(4.931e-03, -2.124e-03, -8.819e-03, 3.987e-03, -9.392e-03, 1.330e-02, 1.135e-03, -2.080e-02, -2.240e-02, 3.794e-02, -8.390e-03, 3.292e-02, 8.262e-03, -5.288e-03, 8.888e-05, -1.230e-03)); + r += mul(s3_3, M4(6.616e-02, 4.391e-02, -7.932e-02, 3.235e-02, 4.285e-02, 2.983e-02, 3.588e-02, -7.229e-03, -6.323e-02, 2.271e-02, -6.090e-02, 1.291e-02, 1.438e-02, 1.232e-02, -1.788e-02, -3.406e-02)); + r += mul(s3_4, M4(1.351e-01, 4.053e-01, -1.401e-01, -4.350e-01, -3.408e-02, -3.919e-02, -3.148e-01, -1.567e-01, 2.798e-01, -3.152e-01, 4.335e-01, -4.720e-01, -4.453e-03, -3.111e-02, 5.432e-02, 1.661e-01)); + r += mul(s3_5, M4(-1.449e-02, 3.672e-02, 3.008e-03, 3.696e-02, 2.229e-02, 4.568e-02, 8.036e-03, -1.061e-01, -8.701e-03, 2.603e-02, -1.476e-02, -8.277e-03, 1.253e-03, -4.533e-02, 1.677e-02, -4.820e-02)); + r += mul(s3_6, M4(-1.351e-03, -1.201e-03, 2.428e-02, -1.435e-03, -1.643e-02, 3.242e-03, 7.810e-03, 1.274e-02, -9.967e-04, -1.764e-03, -2.105e-02, 1.409e-02, 3.607e-03, 4.228e-03, 2.109e-02, 2.833e-02)); + r += mul(s3_7, M4(-8.967e-04, 4.304e-04, 1.274e-01, 4.554e-03, -3.403e-03, -2.228e-02, -5.090e-02, -5.075e-02, 1.022e-02, -1.074e-02, 3.729e-02, -4.013e-02, 1.206e-03, 3.008e-03, -3.285e-02, -3.790e-02)); + r += mul(s3_8, M4(-8.135e-03, -6.612e-03, -1.430e-02, 1.443e-02, -9.392e-03, -8.874e-03, 2.189e-03, -4.325e-03, 3.305e-03, 7.361e-03, -3.845e-03, 4.320e-02, 5.838e-05, -5.906e-03, -9.746e-03, -6.372e-03)); + r += mul(s4_0, M4(-6.619e-02, 3.386e-03, -1.440e-02, -2.684e-03, 1.861e-01, 6.708e-03, -2.086e-01, -2.792e-02, 5.085e-03, -1.371e-03, 7.496e-04, 5.475e-04, 3.164e-02, -2.828e-03, 7.371e-03, -3.730e-03)); + r += mul(s4_1, M4(2.662e-01, 9.839e-02, -1.261e-03, 1.859e-02, 1.929e-01, 4.174e-01, -1.989e-01, -4.026e-01, 1.022e-02, 3.651e-03, 1.549e-02, 9.997e-03, 1.631e-02, 5.879e-02, -1.085e-02, 5.666e-03)); + r += mul(s4_2, M4(-4.957e-03, 5.830e-02, 1.930e-03, 1.448e-02, -1.145e-02, -1.217e-03, -2.842e-02, -1.898e-02, -3.649e-03, -1.017e-02, -6.273e-03, -9.116e-03, -5.015e-04, -1.688e-02, 3.775e-03, -1.721e-04)); + r += mul(s4_3, M4(2.389e-03, 2.408e-02, -5.210e-02, 6.875e-03, -3.646e-02, -1.013e-02, 4.480e-02, 4.505e-02, 2.366e-03, 3.030e-03, 1.549e-03, -1.001e-03, 9.867e-02, -2.665e-02, 9.044e-02, -1.874e-02)); + r += mul(s4_4, M4(-3.643e-02, -2.222e-01, 4.160e-01, -8.814e-02, -3.183e-03, -2.813e-02, -2.998e-02, 3.857e-03, 1.168e-02, -2.557e-03, -3.460e-03, 3.700e-02, -5.386e-02, 1.318e-01, 2.204e-02, 1.646e-01)); + r += mul(s4_5, M4(-1.667e-02, 1.179e-02, -1.704e-02, 1.701e-02, 1.466e-02, 6.225e-03, 1.316e-02, 6.819e-03, 1.538e-02, 1.750e-02, 1.290e-02, -9.130e-03, -9.388e-04, -2.310e-02, 1.012e-03, -2.192e-02)); + r += mul(s4_6, M4(-4.788e-03, -1.788e-04, 1.942e-03, 2.068e-02, 8.190e-03, 2.922e-03, 8.121e-03, 8.156e-03, -6.692e-04, 4.287e-03, -1.235e-03, -3.182e-04, -3.056e-02, 8.216e-03, -1.327e-02, -1.535e-02)); + r += mul(s4_7, M4(4.394e-03, -1.151e-02, -1.421e-01, -8.570e-02, -3.001e-04, -3.082e-03, -9.208e-03, -5.047e-03, -2.155e-02, -8.398e-03, -3.852e-02, -2.369e-02, -2.241e-02, -5.901e-02, -6.197e-02, -4.610e-02)); + r += mul(s4_8, M4(-2.005e-03, -7.680e-03, -7.675e-03, 1.350e-03, 2.217e-03, 5.842e-03, 6.929e-03, 4.388e-03, 2.925e-03, -1.936e-02, 2.993e-03, -6.092e-03, -5.771e-03, -1.297e-02, -8.820e-03, -4.081e-02)); + r += mul(s5_0, M4(-8.093e-03, -2.108e-02, -5.065e-03, -9.804e-03, 8.706e-03, -2.703e-03, 8.560e-03, -1.145e-03, 1.271e-02, 3.374e-04, -2.669e-03, 3.678e-04, 3.406e-02, -1.116e-03, -4.666e-03, -3.086e-03)); + r += mul(s5_1, M4(1.444e-01, 8.691e-02, -3.666e-03, -1.186e-02, -2.945e-02, 1.773e-02, -3.385e-03, 9.432e-03, -8.320e-02, 3.048e-02, 4.784e-02, 1.887e-02, 2.853e-02, 4.528e-02, -1.537e-02, 1.443e-02)); + r += mul(s5_2, M4(1.261e-03, 8.035e-02, 2.059e-03, 1.571e-02, -3.960e-03, -7.533e-03, 1.761e-03, 3.228e-04, 4.202e-02, -6.871e-02, -1.490e-02, -1.569e-02, -1.648e-03, -2.460e-02, 4.012e-03, 1.774e-03)); + r += mul(s5_3, M4(-1.331e-02, 2.152e-02, -2.614e-02, -9.924e-03, -1.947e-02, 1.059e-02, -1.041e-02, -1.621e-03, -2.572e-02, 2.033e-02, 2.865e-02, 5.849e-03, 5.318e-02, -5.221e-02, 1.551e-01, -2.830e-02)); + r += mul(s5_4, M4(-1.323e-01, -9.644e-02, 1.592e-01, 1.171e-01, 4.554e-03, -1.978e-02, 7.734e-04, 5.202e-03, 4.516e-01, -1.821e-01, -2.188e-01, -6.628e-02, -1.213e-01, 3.488e-01, 3.650e-02, 1.072e-01)); + r += mul(s5_5, M4(9.571e-03, -5.795e-02, 1.968e-03, 5.286e-02, 8.690e-03, 4.884e-03, -2.144e-03, 2.432e-03, -6.079e-02, -1.205e-01, -5.606e-02, 2.910e-01, 3.558e-03, -4.736e-02, 1.097e-03, -2.437e-02)); + r += mul(s5_6, M4(-2.386e-03, 3.239e-03, 1.889e-03, 2.179e-02, 5.114e-03, 2.074e-03, 7.194e-03, 7.554e-03, 2.152e-03, 2.239e-02, -2.804e-02, 7.534e-03, -9.674e-03, 8.039e-03, -5.096e-02, 7.962e-03)); + r += mul(s5_7, M4(9.905e-03, -1.465e-02, -1.165e-01, -1.121e-01, -1.333e-04, -2.307e-04, -1.100e-02, -1.205e-02, -8.494e-02, -1.837e-02, -8.022e-02, 1.404e-01, -7.194e-02, -5.811e-02, 4.097e-02, -2.056e-01)); + r += mul(s5_8, M4(-5.079e-04, 1.061e-02, 2.578e-03, -1.954e-02, 1.028e-03, 4.906e-03, 7.644e-03, 5.385e-03, 1.110e-02, 5.051e-03, 3.922e-02, -8.392e-02, -4.674e-03, -2.416e-02, -2.396e-02, -2.507e-02)); + r += mul(s6_0, M4(-5.674e-03, 1.696e-02, -3.176e-02, 2.557e-02, -6.480e-03, 4.567e-03, -1.663e-03, 1.376e-04, 1.050e-03, 2.005e-02, -7.700e-03, -4.650e-03, 5.174e-03, 2.959e-04, 5.847e-04, 6.868e-03)); + r += mul(s6_1, M4(1.993e-01, -3.446e-01, 5.166e-02, -6.301e-02, -2.130e-02, -2.832e-02, 1.387e-02, 6.658e-03, -1.506e-02, 1.915e-02, 1.594e-03, -1.395e-02, -3.983e-03, -5.809e-03, -4.394e-03, -2.282e-02)); + r += mul(s6_2, M4(-3.163e-02, 6.764e-02, -2.420e-02, 4.381e-02, -7.289e-04, -9.938e-03, 1.256e-04, -1.360e-04, -6.267e-03, -2.814e-02, -2.084e-04, -6.295e-03, 1.764e-03, 3.965e-02, 2.172e-03, 1.004e-02)); + r += mul(s6_3, M4(-3.805e-02, 6.931e-03, 5.346e-02, 1.400e-02, -5.747e-02, 6.911e-03, -4.360e-02, -2.992e-03, 1.962e-01, -5.279e-03, 1.268e-01, 1.710e-02, 3.139e-02, -9.558e-03, 2.899e-02, -3.663e-03)); + r += mul(s6_4, M4(3.873e-01, -1.973e-01, 4.189e-01, -5.647e-01, -6.008e-03, -7.391e-02, -5.739e-02, -7.744e-02, 8.159e-02, -3.188e-01, 1.655e-02, -5.484e-02, -3.178e-02, 4.290e-02, -2.692e-02, 9.210e-04)); + r += mul(s6_5, M4(-2.935e-02, -2.705e-02, -1.973e-02, 3.284e-02, 4.812e-03, -1.630e-03, -6.547e-03, -2.704e-02, 3.867e-03, 2.585e-02, -1.039e-02, -2.115e-02, 2.652e-02, -4.987e-03, 9.940e-03, 3.099e-02)); + r += mul(s6_6, M4(-1.325e-02, 1.862e-02, -6.437e-02, 3.401e-02, 8.708e-03, -9.918e-03, -1.084e-02, -6.120e-03, 9.072e-03, -9.683e-03, 9.543e-02, -1.780e-02, -1.107e-03, 1.807e-03, 8.317e-03, -4.227e-03)); + r += mul(s6_7, M4(-1.322e-03, -2.431e-02, 1.236e-01, 3.596e-02, 1.617e-02, 3.369e-02, 3.577e-02, 2.416e-02, 2.259e-02, 4.767e-04, 6.982e-02, -2.046e-01, 2.224e-03, -1.279e-02, -3.976e-03, 2.405e-02)); + r += mul(s6_8, M4(1.170e-02, 1.031e-02, -1.128e-02, -3.595e-03, -2.951e-03, -1.011e-03, 4.208e-03, 8.020e-03, -9.252e-03, 4.930e-03, -4.802e-03, 2.488e-02, 7.594e-03, 1.785e-02, 2.293e-02, 1.881e-02)); + r += mul(s7_0, M4(-3.035e-02, 1.103e-02, -1.247e-02, 8.212e-03, -3.649e-03, 7.823e-04, -4.061e-03, -5.997e-03, 6.184e-03, 8.128e-03, -1.791e-02, -3.658e-03, 9.366e-03, -1.359e-03, 6.250e-03, 7.013e-03)); + r += mul(s7_1, M4(-1.474e-02, -9.790e-02, 2.877e-02, -5.354e-03, 1.812e-03, -1.444e-02, -8.681e-04, -4.601e-03, -1.857e-02, 1.924e-02, -4.324e-03, -6.665e-04, -2.237e-02, -1.259e-02, 2.804e-02, -1.132e-02)); + r += mul(s7_2, M4(4.229e-03, 3.503e-02, -9.494e-03, 3.929e-03, 1.529e-03, 1.047e-02, -1.211e-03, -1.295e-03, -6.108e-03, -3.601e-02, 1.257e-03, -5.264e-03, -3.022e-02, -9.369e-03, 2.472e-02, 4.690e-02)); + r += mul(s7_3, M4(1.319e-02, -1.454e-02, -5.079e-03, 7.460e-03, -5.480e-02, 5.655e-03, -3.895e-02, -3.164e-03, 4.913e-02, 1.430e-02, 8.021e-02, 1.776e-02, 4.046e-02, 4.571e-03, -2.042e-03, -4.160e-03)); + r += mul(s7_4, M4(6.519e-02, 8.739e-02, -5.626e-02, -8.788e-02, -3.206e-01, -2.325e-01, 3.845e-02, 7.201e-03, -5.066e-02, -1.198e-02, -4.289e-02, 1.265e-02, 3.552e-01, 1.004e-01, -3.917e-01, -1.470e-01)); + r += mul(s7_5, M4(-2.531e-02, -1.486e-02, 4.528e-03, 2.192e-02, 7.700e-03, -1.460e-01, 5.769e-03, 8.122e-03, 1.705e-02, 1.979e-02, -6.251e-04, -3.190e-02, 6.387e-02, 2.744e-01, 1.321e-02, -1.953e-01)); + r += mul(s7_6, M4(1.643e-03, -1.660e-03, 4.977e-03, -1.102e-02, 1.609e-02, -5.231e-03, -9.750e-03, 3.558e-03, -1.151e-02, -5.640e-03, -1.219e-02, 3.597e-03, -2.938e-02, -1.077e-02, 6.192e-02, -1.080e-02)); + r += mul(s7_7, M4(-8.093e-03, 1.761e-03, 6.421e-02, 7.350e-02, 8.811e-03, 2.184e-02, 2.007e-01, 1.038e-01, 1.103e-02, -7.409e-03, -1.095e-02, -1.284e-03, -1.262e-02, -5.736e-02, -5.778e-03, 1.275e-01)); + r += mul(s7_8, M4(7.431e-03, 4.067e-03, -1.131e-02, -1.269e-04, -4.994e-03, -3.172e-03, 5.994e-04, 8.132e-02, -1.893e-03, -5.842e-03, 1.233e-02, 1.106e-02, 1.308e-02, 1.715e-02, -7.352e-03, -1.630e-02)); + r += V4(4.937e-06, -9.679e-05, 1.474e-04, 7.536e-05); + return tanh(r); +} + +void Pass6(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = (Rmp8x8(tid.x) << 1) + blockStart; + uint2 size = GetOutputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = ((gxy >> 1) + 0.5) * pt; + + V4 s0_0 = l0(-1.0, -1.0); + V4 s0_1 = l0(0.0, -1.0); + V4 s0_2 = l0(1.0, -1.0); + V4 s0_3 = l0(-1.0, 0.0); + V4 s0_4 = l0(0.0, 0.0); + V4 s0_5 = l0(1.0, 0.0); + V4 s0_6 = l0(-1.0, 1.0); + V4 s0_7 = l0(0.0, 1.0); + V4 s0_8 = l0(1.0, 1.0); + V4 s1_0 = -max(-s0_0, 0.0); + V4 s1_1 = -max(-s0_1, 0.0); + V4 s1_2 = -max(-s0_2, 0.0); + V4 s1_3 = -max(-s0_3, 0.0); + V4 s1_4 = -max(-s0_4, 0.0); + V4 s1_5 = -max(-s0_5, 0.0); + V4 s1_6 = -max(-s0_6, 0.0); + V4 s1_7 = -max(-s0_7, 0.0); + V4 s1_8 = -max(-s0_8, 0.0); + s0_0 = max(s0_0, 0.0); + s0_1 = max(s0_1, 0.0); + s0_2 = max(s0_2, 0.0); + s0_3 = max(s0_3, 0.0); + s0_4 = max(s0_4, 0.0); + s0_5 = max(s0_5, 0.0); + s0_6 = max(s0_6, 0.0); + s0_7 = max(s0_7, 0.0); + s0_8 = max(s0_8, 0.0); + + V4 s2_0 = l1(-1.0, -1.0); + V4 s2_1 = l1(0.0, -1.0); + V4 s2_2 = l1(1.0, -1.0); + V4 s2_3 = l1(-1.0, 0.0); + V4 s2_4 = l1(0.0, 0.0); + V4 s2_5 = l1(1.0, 0.0); + V4 s2_6 = l1(-1.0, 1.0); + V4 s2_7 = l1(0.0, 1.0); + V4 s2_8 = l1(1.0, 1.0); + V4 s3_0 = -max(-s2_0, 0.0); + V4 s3_1 = -max(-s2_1, 0.0); + V4 s3_2 = -max(-s2_2, 0.0); + V4 s3_3 = -max(-s2_3, 0.0); + V4 s3_4 = -max(-s2_4, 0.0); + V4 s3_5 = -max(-s2_5, 0.0); + V4 s3_6 = -max(-s2_6, 0.0); + V4 s3_7 = -max(-s2_7, 0.0); + V4 s3_8 = -max(-s2_8, 0.0); + s2_0 = max(s2_0, 0.0); + s2_1 = max(s2_1, 0.0); + s2_2 = max(s2_2, 0.0); + s2_3 = max(s2_3, 0.0); + s2_4 = max(s2_4, 0.0); + s2_5 = max(s2_5, 0.0); + s2_6 = max(s2_6, 0.0); + s2_7 = max(s2_7, 0.0); + s2_8 = max(s2_8, 0.0); + + V4 s4_0 = l2(-1.0, -1.0); + V4 s4_1 = l2(0.0, -1.0); + V4 s4_2 = l2(1.0, -1.0); + V4 s4_3 = l2(-1.0, 0.0); + V4 s4_4 = l2(0.0, 0.0); + V4 s4_5 = l2(1.0, 0.0); + V4 s4_6 = l2(-1.0, 1.0); + V4 s4_7 = l2(0.0, 1.0); + V4 s4_8 = l2(1.0, 1.0); + V4 s5_0 = -max(-s4_0, 0.0); + V4 s5_1 = -max(-s4_1, 0.0); + V4 s5_2 = -max(-s4_2, 0.0); + V4 s5_3 = -max(-s4_3, 0.0); + V4 s5_4 = -max(-s4_4, 0.0); + V4 s5_5 = -max(-s4_5, 0.0); + V4 s5_6 = -max(-s4_6, 0.0); + V4 s5_7 = -max(-s4_7, 0.0); + V4 s5_8 = -max(-s4_8, 0.0); + s4_0 = max(s4_0, 0.0); + s4_1 = max(s4_1, 0.0); + s4_2 = max(s4_2, 0.0); + s4_3 = max(s4_3, 0.0); + s4_4 = max(s4_4, 0.0); + s4_5 = max(s4_5, 0.0); + s4_6 = max(s4_6, 0.0); + s4_7 = max(s4_7, 0.0); + s4_8 = max(s4_8, 0.0); + + V4 s6_0 = l3(-1.0, -1.0); + V4 s6_1 = l3(0.0, -1.0); + V4 s6_2 = l3(1.0, -1.0); + V4 s6_3 = l3(-1.0, 0.0); + V4 s6_4 = l3(0.0, 0.0); + V4 s6_5 = l3(1.0, 0.0); + V4 s6_6 = l3(-1.0, 1.0); + V4 s6_7 = l3(0.0, 1.0); + V4 s6_8 = l3(1.0, 1.0); + V4 s7_0 = -max(-s6_0, 0.0); + V4 s7_1 = -max(-s6_1, 0.0); + V4 s7_2 = -max(-s6_2, 0.0); + V4 s7_3 = -max(-s6_3, 0.0); + V4 s7_4 = -max(-s6_4, 0.0); + V4 s7_5 = -max(-s6_5, 0.0); + V4 s7_6 = -max(-s6_6, 0.0); + V4 s7_7 = -max(-s6_7, 0.0); + V4 s7_8 = -max(-s6_8, 0.0); + s6_0 = max(s6_0, 0.0); + s6_1 = max(s6_1, 0.0); + s6_2 = max(s6_2, 0.0); + s6_3 = max(s6_3, 0.0); + s6_4 = max(s6_4, 0.0); + s6_5 = max(s6_5, 0.0); + s6_6 = max(s6_6, 0.0); + s6_7 = max(s6_7, 0.0); + s6_8 = max(s6_8, 0.0); + + V4 r = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + + static const float3x3 rgb2yuv = {0.299, 0.587, 0.114, -0.169, -0.331, 0.5, 0.5, -0.419, -0.081}; + static const float3x3 yuv2rgb = {1, -0.00093, 1.401687, 1, -0.3437, -0.71417, 1, 1.77216, 0.00099}; + float2 opt = float2(GetOutputPt()); + + pos -= 0.5f * opt; + float3 yuv = mul(rgb2yuv, INPUT.SampleLevel(SL, pos, 0).rgb); + OUTPUT[gxy] = float4(mul(yuv2rgb, float3(saturate(yuv.r + r.x), yuv.yz)), 1); + + ++gxy.x; + pos.x += opt.x; + yuv = mul(rgb2yuv, INPUT.SampleLevel(SL, pos, 0).rgb); + OUTPUT[gxy] = float4(mul(yuv2rgb, float3(saturate(yuv.r + r.y), yuv.yz)), 1); + + ++gxy.y; + pos.y += opt.y; + yuv = mul(rgb2yuv, INPUT.SampleLevel(SL, pos, 0).rgb); + OUTPUT[gxy] = float4(mul(yuv2rgb, float3(saturate(yuv.r + r.w), yuv.yz)), 1); + + --gxy.x; + pos.x -= opt.x; + yuv = mul(rgb2yuv, INPUT.SampleLevel(SL, pos, 0).rgb); + OUTPUT[gxy] = float4(mul(yuv2rgb, float3(saturate(yuv.r + r.z), yuv.yz)), 1); +} diff --git a/src/Effects/CuNNy/CuNNy-4x4C-NVL-DN.hlsl b/src/Effects/CuNNy/CuNNy-4x4C-NVL-DN.hlsl new file mode 100644 index 000000000..ff13858f7 --- /dev/null +++ b/src/Effects/CuNNy/CuNNy-4x4C-NVL-DN.hlsl @@ -0,0 +1,486 @@ +// CuNNy 4x4C BILINEAR RGB NVL DN - https://github.com/cunnyplapper/CuNNy + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +//!MAGPIE EFFECT +//!VERSION 4 +//!SORT_NAME CuNNy-DN-D04N04 + +//!TEXTURE +Texture2D INPUT; + +//!TEXTURE +//!WIDTH INPUT_WIDTH * 2 +//!HEIGHT INPUT_HEIGHT * 2 +Texture2D OUTPUT; + +//!SAMPLER +//!FILTER POINT +SamplerState SP; + +//!SAMPLER +//!FILTER LINEAR +SamplerState SL; + +//!COMMON +#define O(t, p) t.SampleLevel(SP, pos + p * pt, 0) +#define V4 min16float4 +#define M4 min16float4x4 + +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +//!FORMAT R8G8B8A8_SNORM +Texture2D t0; + +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +//!FORMAT R8G8B8A8_SNORM +Texture2D t1; + +//!PASS 1 +//!DESC in +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 +//!IN INPUT +//!OUT t0 + +#define l0(x, y) min16float((dot(float3(2.428e-01, 4.714e-01, 1.229e-01), O(INPUT, float2(x, y)).rgb) + -7.696e-02)) + +V4 f0(min16float s0_0, min16float s0_1, min16float s0_2, min16float s0_3, min16float s0_4, min16float s0_5, min16float s0_6, min16float s0_7, min16float s0_8) { + V4 r = 0.0; + r += V4(9.154e-02, 3.758e-01, 2.353e-02, -5.798e-02) * s0_0; + r += V4(-5.382e-01, 1.688e-01, -1.190e-01, 4.082e-02) * s0_1; + r += V4(2.460e-02, -5.810e-02, 7.788e-02, 3.018e-02) * s0_2; + r += V4(1.211e-01, -1.552e-01, -9.990e-02, 3.963e-02) * s0_3; + r += V4(-2.611e-01, -4.835e-01, -6.965e-01, -4.893e-01) * s0_4; + r += V4(-3.017e-01, -4.435e-02, 1.836e-01, 4.600e-01) * s0_5; + r += V4(1.275e-01, 2.485e-01, 7.354e-02, -4.648e-02) * s0_6; + r += V4(2.527e-01, 1.279e-01, 3.053e-01, 3.957e-02) * s0_7; + r += V4(1.003e-02, 1.193e-01, 2.476e-01, -2.051e-02) * s0_8; + r += V4(1.690e-02, 8.856e-03, -9.136e-04, 2.267e-02); + return r; +} + +void Pass1(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = Rmp8x8(tid.x) + blockStart; + uint2 size = GetInputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = (gxy + 0.5) * pt; + + min16float s0_0 = l0(-1.0, -1.0); + min16float s0_1 = l0(0.0, -1.0); + min16float s0_2 = l0(1.0, -1.0); + min16float s0_3 = l0(-1.0, 0.0); + min16float s0_4 = l0(0.0, 0.0); + min16float s0_5 = l0(1.0, 0.0); + min16float s0_6 = l0(-1.0, 1.0); + min16float s0_7 = l0(0.0, 1.0); + min16float s0_8 = l0(1.0, 1.0); + + t0[gxy] = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8); +} + +//!PASS 2 +//!DESC conv1 +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 +//!IN t0 +//!OUT t1 + +#define l0(x, y) V4(O(t0, float2(x, y))) + +V4 f0(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-4.540e-03, -2.499e-01, 4.202e-02, 1.132e-02, 2.910e-02, -3.788e-02, 3.330e-02, -2.254e-02, -1.953e-01, 1.226e-01, -1.907e-01, -1.378e-01, 9.555e-02, -2.443e-01, 6.124e-02, -7.256e-03)); + r += mul(s0_1, M4(-1.225e-01, -1.812e-01, -1.238e-02, 4.088e-01, -9.977e-02, 4.395e-02, -2.394e-02, -5.584e-03, 2.939e-01, 4.102e-01, 6.228e-02, 3.822e-01, 8.618e-02, -1.109e-01, 1.776e-01, -7.505e-02)); + r += mul(s0_2, M4(2.047e-01, -6.853e-02, 1.880e-02, -9.030e-03, 1.505e-01, 7.782e-02, 1.347e-02, 5.566e-01, -6.951e-02, -1.352e-01, 1.941e-03, 3.975e-02, 1.637e-01, 6.708e-02, 1.501e-02, 1.373e-01)); + r += mul(s0_3, M4(-1.974e-01, 1.068e-01, -1.102e-01, 5.909e-02, 2.355e-03, 1.275e-01, -5.986e-02, -5.288e-02, 8.785e-04, -1.440e-01, -3.369e-01, -9.128e-02, 2.030e-01, 4.937e-01, -1.637e-01, 4.814e-02)); + r += mul(s0_4, M4(-3.954e-01, 4.772e-01, -5.841e-01, -8.070e-02, -2.056e-01, -2.335e-01, -2.091e-01, 1.223e-01, -2.686e-01, 1.240e+00, 7.095e-02, 6.502e-01, 1.044e-01, -3.071e-01, -2.892e-01, 4.861e-01)); + r += mul(s0_5, M4(5.943e-02, 2.245e-01, 4.014e-01, -1.063e-01, -1.869e-01, 1.384e-01, 2.996e-01, -1.928e-01, 1.212e-01, 2.849e-01, 2.093e-01, -3.821e-01, -8.705e-02, 1.976e-01, 5.176e-01, -7.461e-02)); + r += mul(s0_6, M4(1.048e-01, 2.374e-02, 2.730e-01, 1.446e-01, -5.406e-02, -1.587e-02, -2.014e-01, -3.422e-02, -2.114e-01, -5.198e-01, 2.674e-02, -6.078e-02, -2.293e-01, -9.914e-02, -2.110e-01, 7.008e-02)); + r += mul(s0_7, M4(5.799e-02, 4.932e-01, 4.559e-01, -3.118e-02, 4.706e-02, -2.242e-01, -3.165e-01, -9.912e-02, 4.041e-01, 7.241e-01, -1.696e-01, 1.990e-01, 4.697e-01, 9.965e-03, -1.141e-02, -1.365e-02)); + r += mul(s0_8, M4(-1.744e-01, -7.119e-02, 3.632e-01, -2.802e-01, -3.155e-01, 4.455e-01, -1.866e-02, -2.667e-02, 1.255e-01, -5.762e-01, -2.226e-02, 2.812e-02, -2.349e-01, 1.552e-01, -6.424e-03, 7.450e-02)); + r += mul(s1_0, M4(6.159e-02, -4.426e-02, 2.277e-02, 1.040e-01, -6.306e-04, -1.704e-01, 3.807e-02, -8.670e-02, -1.403e-01, 1.644e-01, -9.679e-02, -1.055e-01, 2.394e-01, -5.504e-02, 8.006e-02, 6.312e-02)); + r += mul(s1_1, M4(-1.134e-01, -1.030e-01, -2.777e-02, 2.955e-01, -1.225e-01, -4.096e-02, -2.748e-02, 9.404e-02, 2.890e-01, -2.441e-01, 1.560e-01, 1.694e-01, 1.853e-01, 3.311e-01, 3.408e-01, -8.678e-02)); + r += mul(s1_2, M4(1.821e-01, 3.898e-02, -2.560e-02, 1.160e-01, 2.382e-01, -1.638e-01, -1.345e-01, 3.193e-01, -1.839e-01, -2.638e-01, 5.265e-02, 2.415e-01, 2.803e-01, 1.919e-01, -7.340e-02, 1.762e-02)); + r += mul(s1_3, M4(-2.606e-01, -1.263e-01, -3.067e-02, -1.695e-02, 4.665e-03, 2.947e-02, -1.965e-02, -2.658e-02, -7.935e-02, -1.566e-01, -3.246e-01, -1.075e-03, 1.896e-01, -2.937e-01, -1.020e-01, -1.513e-01)); + r += mul(s1_4, M4(-3.696e-01, 8.901e-02, -1.890e-01, -2.804e-02, -2.998e-01, -6.597e-02, -2.613e-01, 3.877e-01, -1.032e+00, -2.328e-01, 7.941e-02, 5.733e-01, 8.618e-02, 4.213e-02, -1.242e+00, 5.861e-01)); + r += mul(s1_5, M4(1.919e-02, -5.609e-02, 3.295e-01, -2.364e-01, -4.238e-01, -6.041e-01, 3.389e-01, -4.460e-01, 4.482e-02, 1.077e-03, 8.990e-02, -2.725e-01, -4.829e-02, 1.184e-01, 1.941e-01, -3.646e-01)); + r += mul(s1_6, M4(2.968e-01, 2.018e-01, 2.695e-01, 8.891e-02, -5.857e-02, 6.005e-02, -2.440e-01, -1.349e-02, -7.572e-02, -3.213e-01, 6.274e-02, -1.229e-02, -7.589e-01, -2.313e-01, -1.627e-01, 2.538e-01)); + r += mul(s1_7, M4(-5.728e-02, 1.333e-01, 2.492e-01, -3.609e-02, 1.936e-01, -1.276e-01, -3.034e-01, -1.091e-01, 1.390e-01, 3.356e-01, -1.183e-01, 2.047e-01, 3.779e-01, -3.353e-01, 2.019e-01, 4.337e-02)); + r += mul(s1_8, M4(-1.386e-01, 1.179e-01, 2.340e-01, -1.604e-01, -4.890e-01, -5.407e-01, -1.546e-01, -1.826e-01, 1.596e-01, -1.784e-01, 5.777e-02, 3.961e-02, -2.290e-01, 2.752e-01, -4.260e-02, 9.649e-02)); + r += V4(-4.697e-03, -2.213e-02, 3.898e-01, -1.481e-02); + return r; +} + +void Pass2(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = Rmp8x8(tid.x) + blockStart; + uint2 size = GetInputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = (gxy + 0.5) * pt; + + V4 s0_0 = l0(-1.0, -1.0); + V4 s0_1 = l0(0.0, -1.0); + V4 s0_2 = l0(1.0, -1.0); + V4 s0_3 = l0(-1.0, 0.0); + V4 s0_4 = l0(0.0, 0.0); + V4 s0_5 = l0(1.0, 0.0); + V4 s0_6 = l0(-1.0, 1.0); + V4 s0_7 = l0(0.0, 1.0); + V4 s0_8 = l0(1.0, 1.0); + V4 s1_0 = -max(-s0_0, 0.0); + V4 s1_1 = -max(-s0_1, 0.0); + V4 s1_2 = -max(-s0_2, 0.0); + V4 s1_3 = -max(-s0_3, 0.0); + V4 s1_4 = -max(-s0_4, 0.0); + V4 s1_5 = -max(-s0_5, 0.0); + V4 s1_6 = -max(-s0_6, 0.0); + V4 s1_7 = -max(-s0_7, 0.0); + V4 s1_8 = -max(-s0_8, 0.0); + s0_0 = max(s0_0, 0.0); + s0_1 = max(s0_1, 0.0); + s0_2 = max(s0_2, 0.0); + s0_3 = max(s0_3, 0.0); + s0_4 = max(s0_4, 0.0); + s0_5 = max(s0_5, 0.0); + s0_6 = max(s0_6, 0.0); + s0_7 = max(s0_7, 0.0); + s0_8 = max(s0_8, 0.0); + + t1[gxy] = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8); +} + +//!PASS 3 +//!DESC conv2 +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 +//!IN t1 +//!OUT t0 + +#define l0(x, y) V4(O(t1, float2(x, y))) + +V4 f0(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-1.362e-01, -5.847e-02, 2.766e-02, 2.969e-02, 9.796e-02, 6.555e-02, -3.067e-02, -5.139e-02, 1.512e-01, 1.401e-01, -3.820e-03, 2.649e-02, -1.802e-01, -2.099e-02, -6.604e-02, 4.042e-02)); + r += mul(s0_1, M4(-2.144e-01, -1.437e-01, 4.670e-02, -2.348e-01, 9.990e-02, -5.186e-02, 1.658e-01, 9.557e-02, -1.353e-01, -1.146e-01, -9.837e-02, -8.956e-02, 1.229e-01, 2.354e-01, -2.342e-01, -1.343e-01)); + r += mul(s0_2, M4(5.918e-01, 2.130e-02, 5.753e-01, -6.941e-02, -3.156e-02, -4.438e-02, -6.348e-02, 2.682e-02, -1.078e-02, 9.727e-03, 8.472e-02, 1.460e-01, -1.921e-01, 1.872e-01, 6.067e-02, 3.762e-02)); + r += mul(s0_3, M4(1.341e-01, 1.082e-01, -4.460e-02, -1.008e-02, -1.262e-01, -7.942e-02, 5.610e-02, 4.418e-02, -1.725e-01, -1.158e-01, 6.377e-03, -1.171e-01, -3.447e-02, 4.459e-02, 2.822e-04, -7.623e-02)); + r += mul(s0_4, M4(1.994e-01, -2.251e-01, -2.432e-01, 2.467e-02, 3.717e-02, 3.275e-01, 2.005e-01, 1.427e-01, 1.122e-01, 2.864e-01, 1.478e-01, 3.701e-01, 3.111e-01, -1.704e-01, -1.410e-01, -7.490e-01)); + r += mul(s0_5, M4(-1.392e-01, -2.284e-02, 2.819e-01, -5.560e-02, -2.624e-01, 7.282e-02, -2.417e-01, -5.534e-02, -6.351e-03, -1.714e-01, -1.505e-01, -3.035e-01, -3.580e-02, 4.429e-02, 1.628e-01, -1.101e-01)); + r += mul(s0_6, M4(8.306e-04, 3.258e-02, -2.746e-02, -3.143e-02, -1.301e-02, -5.828e-02, 2.411e-03, 1.395e-02, 3.728e-02, -8.319e-02, 3.326e-02, 1.294e-01, -6.226e-02, 5.103e-02, -1.218e-02, 2.411e-01)); + r += mul(s0_7, M4(-6.323e-02, -1.343e-02, 3.400e-02, -1.727e-02, 3.683e-02, 6.325e-02, 4.834e-04, 3.849e-02, 9.424e-03, -2.010e-02, -3.447e-02, -1.330e-01, -4.107e-01, -7.682e-02, 4.138e-01, 5.994e-02)); + r += mul(s0_8, M4(7.556e-02, 1.846e-02, 1.847e-02, 1.057e-01, -1.140e-01, -2.834e-02, -3.141e-02, -1.045e-01, -2.025e-02, 4.729e-02, -2.822e-02, -4.072e-02, 3.368e-01, 6.871e-02, 1.184e-01, 1.536e-01)); + r += mul(s1_0, M4(-6.688e-02, 2.483e-02, 1.598e-01, -4.834e-02, 2.141e-01, -4.911e-02, -4.452e-02, -4.879e-02, -9.473e-01, 6.527e-01, -6.118e-01, -2.436e-01, -3.017e-02, -3.402e-01, 1.343e-01, 9.397e-02)); + r += mul(s1_1, M4(-1.330e-01, 2.557e-01, 6.838e-02, -3.936e-01, 4.806e-01, 1.828e-01, 5.073e-01, 4.502e-01, -1.404e+00, -2.954e-01, -6.745e-02, 5.594e-02, 2.640e-01, 2.330e-02, 1.331e-02, -2.700e-02)); + r += mul(s1_2, M4(2.695e-01, -1.004e-01, 9.104e-02, -4.919e-01, 3.357e-01, 4.895e-02, 4.062e-01, -3.494e-02, -4.352e-01, -1.232e-01, 8.889e-03, 3.472e-01, -1.174e-01, 7.690e-02, 6.341e-02, 9.255e-02)); + r += mul(s1_3, M4(1.805e-01, 2.494e-01, 3.474e-02, 3.930e-02, 2.671e-02, -1.438e-02, 7.294e-02, 4.854e-02, -2.864e+00, -5.832e-01, 4.350e-01, -4.265e-01, -2.643e-02, -6.234e-01, 1.283e-01, 5.168e-02)); + r += mul(s1_4, M4(-2.192e-01, 2.982e-01, -2.860e-01, -4.050e-01, 8.612e-02, 5.008e-02, 5.366e-01, 5.256e-01, -6.222e-01, 1.169e+00, 1.897e+00, 3.009e+00, 9.105e-02, -2.369e-01, -4.718e-01, -2.725e-01)); + r += mul(s1_5, M4(-7.441e-01, -1.820e-01, -5.828e-02, -6.348e-01, 5.721e-01, 1.143e-01, 2.871e-01, 3.254e-01, -1.446e-01, 1.446e-01, -8.526e-02, 7.228e-01, -9.749e-02, -1.665e-01, -1.116e-01, -2.705e-01)); + r += mul(s1_6, M4(-6.357e-02, -2.576e-02, 1.277e-02, -3.956e-02, 2.724e-02, -2.141e-02, 9.778e-02, 7.199e-03, -1.153e+00, -6.945e-01, -4.788e-01, -1.246e+00, 1.909e-01, 1.315e-01, 4.454e-02, 2.678e-01)); + r += mul(s1_7, M4(-1.022e-01, 1.572e-01, 9.404e-02, 6.768e-02, 2.191e-01, -3.163e-02, 1.257e-01, 1.058e-01, -6.394e-01, 7.223e-03, -6.930e-01, -2.963e-01, -2.666e-01, 3.461e-03, 2.203e-01, -1.212e-01)); + r += mul(s1_8, M4(-1.179e-01, 7.311e-02, 1.371e-01, -4.039e-02, 2.171e-01, 3.131e-02, 2.219e-01, 1.564e-02, -4.895e-01, -5.067e-03, -4.528e-01, 5.694e-02, 6.858e-02, 6.808e-03, -1.017e-01, 6.675e-03)); + r += V4(-8.341e-03, 1.434e-02, 5.791e-03, -1.033e-02); + return r; +} + +void Pass3(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = Rmp8x8(tid.x) + blockStart; + uint2 size = GetInputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = (gxy + 0.5) * pt; + + V4 s0_0 = l0(-1.0, -1.0); + V4 s0_1 = l0(0.0, -1.0); + V4 s0_2 = l0(1.0, -1.0); + V4 s0_3 = l0(-1.0, 0.0); + V4 s0_4 = l0(0.0, 0.0); + V4 s0_5 = l0(1.0, 0.0); + V4 s0_6 = l0(-1.0, 1.0); + V4 s0_7 = l0(0.0, 1.0); + V4 s0_8 = l0(1.0, 1.0); + V4 s1_0 = -max(-s0_0, 0.0); + V4 s1_1 = -max(-s0_1, 0.0); + V4 s1_2 = -max(-s0_2, 0.0); + V4 s1_3 = -max(-s0_3, 0.0); + V4 s1_4 = -max(-s0_4, 0.0); + V4 s1_5 = -max(-s0_5, 0.0); + V4 s1_6 = -max(-s0_6, 0.0); + V4 s1_7 = -max(-s0_7, 0.0); + V4 s1_8 = -max(-s0_8, 0.0); + s0_0 = max(s0_0, 0.0); + s0_1 = max(s0_1, 0.0); + s0_2 = max(s0_2, 0.0); + s0_3 = max(s0_3, 0.0); + s0_4 = max(s0_4, 0.0); + s0_5 = max(s0_5, 0.0); + s0_6 = max(s0_6, 0.0); + s0_7 = max(s0_7, 0.0); + s0_8 = max(s0_8, 0.0); + + t0[gxy] = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8); +} + +//!PASS 4 +//!DESC conv3 +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 +//!IN t0 +//!OUT t1 + +#define l0(x, y) V4(O(t0, float2(x, y))) + +V4 f0(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-6.123e-02, 9.666e-03, 4.969e-02, 3.030e-02, 1.714e-02, -3.117e-02, -9.470e-02, 2.078e-03, 4.109e-02, -5.560e-02, 3.757e-02, -3.667e-03, -3.500e-02, -8.151e-02, 1.104e-01, -1.219e-01)); + r += mul(s0_1, M4(9.596e-02, -6.361e-02, 1.162e-02, -3.138e-02, -1.277e-02, -4.005e-02, 1.805e-02, -1.459e-02, -7.903e-03, 1.138e-02, 1.542e-02, -2.357e-02, -1.421e-01, -2.953e-01, 1.322e-01, 6.480e-03)); + r += mul(s0_2, M4(1.571e-01, -1.081e-01, 1.345e-01, -5.616e-02, -1.211e-02, 4.515e-02, 1.797e-02, 6.143e-02, -9.605e-02, 7.782e-02, -1.421e-01, 3.195e-02, 1.841e-01, -7.735e-02, 1.082e-01, 1.785e-02)); + r += mul(s0_3, M4(1.739e-03, -4.187e-02, 1.093e-01, 1.042e-01, -6.538e-03, 5.025e-02, -7.052e-03, -1.033e-01, -1.394e-01, -4.638e-01, 4.354e-02, -1.188e-02, 7.809e-04, 2.484e-01, -8.330e-01, -2.787e-01)); + r += mul(s0_4, M4(-6.489e-03, -6.309e-01, 7.169e-01, 1.557e-01, 1.478e-01, 2.977e-01, -2.818e-01, 5.129e-02, 7.598e-01, 8.124e-01, -1.262e-02, -1.325e-01, -2.764e-01, 3.485e-01, 4.717e-01, -2.467e-01)); + r += mul(s0_5, M4(2.022e-02, -1.396e-01, 1.865e-01, 1.568e-02, 3.924e-01, -2.466e-01, 4.990e-01, 3.971e-02, -1.176e-01, 1.792e-01, -2.861e-01, 3.555e-02, -1.428e-01, 2.528e-01, -2.085e-01, -1.311e-01)); + r += mul(s0_6, M4(3.340e-02, -1.203e-01, 1.014e-01, 1.154e-01, -9.031e-03, -5.586e-02, -5.700e-03, 2.391e-02, -3.509e-01, 6.729e-02, 1.004e-01, -3.277e-01, 1.026e-01, 3.286e-03, -6.603e-02, -3.238e-03)); + r += mul(s0_7, M4(-6.854e-01, 1.013e-01, -6.298e-02, -5.464e-01, 2.486e-01, -2.186e-01, 3.986e-02, 3.800e-01, -1.267e-01, 1.037e-01, 1.538e-01, -2.069e-01, 9.431e-02, 5.337e-02, -8.507e-02, 2.015e-01)); + r += mul(s0_8, M4(-5.009e-03, 1.493e-01, -3.010e-02, -2.429e-02, -3.137e-01, -2.276e-01, 1.556e-01, 1.452e-02, 2.063e-01, 3.699e-02, -1.675e-03, 8.221e-02, -6.732e-02, 8.296e-02, -8.474e-02, -1.458e-01)); + r += mul(s1_0, M4(-3.003e-02, -9.777e-03, 1.239e-02, -3.907e-02, 1.841e-01, -8.959e-02, 9.257e-02, 1.333e-01, 5.703e-04, -1.367e-01, -1.026e-01, 6.398e-02, 1.262e-02, 1.101e-02, 4.291e-02, -4.238e-02)); + r += mul(s1_1, M4(5.516e-02, 9.884e-04, -5.383e-02, -1.048e-02, 2.529e-01, 9.819e-02, 1.255e-01, 3.149e-02, -8.249e-02, -1.386e-02, 6.214e-02, 2.957e-02, 1.001e-01, 1.590e-01, 1.159e-02, 5.273e-02)); + r += mul(s1_2, M4(4.571e-02, -6.277e-03, 1.496e-01, -4.044e-02, 4.089e-02, -3.801e-02, -3.690e-02, -1.037e-01, -6.031e-02, 2.117e-03, -9.644e-02, 6.392e-02, 5.093e-02, -2.512e-02, 1.131e-01, 1.304e-01)); + r += mul(s1_3, M4(-3.118e-02, 2.185e-02, 1.763e-01, 8.327e-02, 6.337e-02, 8.724e-02, 6.808e-02, -4.070e-01, -6.922e-02, -2.417e-01, -1.175e-01, -1.845e-01, -3.773e-03, -1.869e-01, -9.345e-02, -2.340e-01)); + r += mul(s1_4, M4(-1.159e-01, -4.476e-01, 2.989e-01, 2.794e-01, 5.756e-01, -4.803e-01, -5.979e-02, -1.959e-01, 5.261e-02, -2.399e-01, -6.616e-02, -9.243e-01, 4.622e-01, 1.139e-01, 2.482e-01, 2.254e-01)); + r += mul(s1_5, M4(1.064e-01, -1.989e-02, 8.581e-02, 3.218e-02, 3.344e-01, -5.684e-01, 4.009e-01, 4.482e-01, 7.737e-02, 8.716e-02, -1.382e-01, -7.145e-02, -1.225e-01, 1.471e-01, -1.866e-01, 3.674e-02)); + r += mul(s1_6, M4(5.376e-02, -6.192e-03, -1.760e-01, 7.590e-02, -3.279e-02, -1.888e-01, 2.057e-01, 2.114e-01, -3.941e-01, 5.584e-03, 9.400e-03, -4.289e-01, -2.289e-01, 1.880e-01, 3.184e-02, -4.442e-01)); + r += mul(s1_7, M4(-4.174e-01, -1.344e-01, 3.866e-02, 4.521e-02, -4.215e-01, 1.479e-01, 2.476e-01, -7.051e-01, -4.153e-01, 3.373e-01, 8.098e-02, -6.680e-01, 3.920e-01, -1.023e-01, -2.166e-02, 3.816e-01)); + r += mul(s1_8, M4(-3.441e-02, 3.404e-03, -4.958e-02, 9.652e-03, -1.930e-02, -2.470e-01, 1.610e-01, 1.112e-01, 2.574e-02, 2.310e-01, 3.643e-02, -5.044e-02, 7.788e-02, 1.923e-03, -7.115e-02, -6.575e-03)); + r += V4(1.370e-02, 1.151e-02, 2.567e-03, -1.881e-03); + return r; +} + +void Pass4(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = Rmp8x8(tid.x) + blockStart; + uint2 size = GetInputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = (gxy + 0.5) * pt; + + V4 s0_0 = l0(-1.0, -1.0); + V4 s0_1 = l0(0.0, -1.0); + V4 s0_2 = l0(1.0, -1.0); + V4 s0_3 = l0(-1.0, 0.0); + V4 s0_4 = l0(0.0, 0.0); + V4 s0_5 = l0(1.0, 0.0); + V4 s0_6 = l0(-1.0, 1.0); + V4 s0_7 = l0(0.0, 1.0); + V4 s0_8 = l0(1.0, 1.0); + V4 s1_0 = -max(-s0_0, 0.0); + V4 s1_1 = -max(-s0_1, 0.0); + V4 s1_2 = -max(-s0_2, 0.0); + V4 s1_3 = -max(-s0_3, 0.0); + V4 s1_4 = -max(-s0_4, 0.0); + V4 s1_5 = -max(-s0_5, 0.0); + V4 s1_6 = -max(-s0_6, 0.0); + V4 s1_7 = -max(-s0_7, 0.0); + V4 s1_8 = -max(-s0_8, 0.0); + s0_0 = max(s0_0, 0.0); + s0_1 = max(s0_1, 0.0); + s0_2 = max(s0_2, 0.0); + s0_3 = max(s0_3, 0.0); + s0_4 = max(s0_4, 0.0); + s0_5 = max(s0_5, 0.0); + s0_6 = max(s0_6, 0.0); + s0_7 = max(s0_7, 0.0); + s0_8 = max(s0_8, 0.0); + + t1[gxy] = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8); +} + +//!PASS 5 +//!DESC conv4 +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 +//!IN t1 +//!OUT t0 + +#define l0(x, y) V4(O(t1, float2(x, y))) + +V4 f0(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8) { + V4 r = 0.0; + r += mul(s0_0, M4(2.376e-02, 2.931e-02, 7.304e-02, -5.238e-02, -6.500e-03, -3.887e-02, 2.506e-02, 5.201e-03, 5.599e-02, -1.951e-01, -3.847e-01, 8.685e-02, -1.106e-01, -3.954e-02, 1.571e-01, 2.293e-02)); + r += mul(s0_1, M4(-2.738e-02, 1.554e-01, 1.120e-01, 1.856e-02, 9.513e-03, -2.222e-01, -2.174e-01, -1.065e-02, 3.001e-02, 7.638e-02, -7.497e-02, -2.727e-02, -1.521e-02, 1.843e-01, 3.547e-01, -1.642e-02)); + r += mul(s0_2, M4(-2.533e-02, -1.959e-02, -6.274e-02, 8.121e-03, -8.703e-03, 5.091e-02, 6.548e-02, 1.988e-02, 4.089e-02, -4.827e-02, -4.089e-02, -4.361e-02, -1.112e-02, -1.101e-02, 2.968e-02, -2.196e-03)); + r += mul(s0_3, M4(1.813e-02, -2.087e-01, -2.474e-01, -1.066e-01, 2.549e-01, 6.466e-01, 3.169e-01, -1.109e-01, -1.551e-02, -3.119e-01, -3.959e-01, 2.141e-01, 1.121e-01, 3.268e-01, 1.038e-01, -5.818e-02)); + r += mul(s0_4, M4(-3.147e-01, 2.716e-01, 1.304e-01, 3.887e-01, 9.396e-02, -9.787e-02, -1.596e-01, -7.138e-02, -2.462e-01, -3.027e-01, 6.980e-01, -1.546e-01, 3.730e-02, -7.502e-02, -4.408e-02, 3.814e-02)); + r += mul(s0_5, M4(-4.177e-02, -1.326e-02, -7.497e-02, 1.168e-03, 5.595e-03, 3.603e-02, 2.589e-02, -2.179e-02, 1.998e-02, -3.544e-03, 1.125e-01, 2.648e-03, -2.417e-02, -1.876e-02, 4.009e-02, 5.481e-02)); + r += mul(s0_6, M4(-7.181e-02, -2.968e-02, -3.169e-02, -1.899e-02, -3.692e-02, -2.156e-02, 9.595e-02, 1.055e-01, -1.274e-01, -2.576e-02, 8.706e-02, 1.895e-01, 6.316e-04, -4.574e-02, 2.201e-02, 1.199e-01)); + r += mul(s0_7, M4(-2.193e-01, 1.563e-02, 1.287e-01, 2.403e-01, 2.222e-01, -1.748e-02, 1.486e-02, -7.685e-02, 4.971e-01, 2.920e-01, -2.253e-01, -8.145e-01, 3.018e-01, -4.559e-02, -1.509e-01, -3.003e-01)); + r += mul(s0_8, M4(1.685e-02, -1.082e-02, 3.539e-03, -2.765e-02, -5.968e-03, -4.628e-03, 3.847e-02, 6.426e-02, -6.284e-02, 5.455e-02, -3.291e-02, 1.636e-01, 5.828e-02, -5.613e-02, -4.404e-02, -1.715e-02)); + r += mul(s1_0, M4(1.875e-02, 7.150e-02, 3.015e-02, -4.917e-02, 9.333e-03, -1.519e-01, -1.153e-01, 4.344e-02, -1.603e-02, -4.775e-02, -4.484e-02, 6.567e-02, -6.714e-02, 2.569e-01, 4.638e-01, 3.038e-02)); + r += mul(s1_1, M4(-4.046e-02, 1.372e-01, 2.476e-01, 6.565e-02, 6.481e-04, -1.529e-02, 1.376e-02, 1.367e-02, 2.941e-04, 1.423e-01, 2.311e-01, 7.538e-03, -6.762e-02, -3.992e-01, -1.160e-02, 3.123e-02)); + r += mul(s1_2, M4(-3.926e-02, 1.709e-04, -4.761e-02, -8.731e-03, 5.123e-03, 7.039e-02, 1.061e-01, -1.322e-03, 4.069e-02, -1.182e-01, -3.698e-04, -7.746e-02, -3.827e-02, 9.957e-02, 9.991e-02, 5.215e-02)); + r += mul(s1_3, M4(-1.865e-01, -9.784e-01, -5.871e-01, 1.384e-01, 2.097e-01, -1.229e-01, -4.912e-01, -4.254e-02, 3.395e-04, -8.968e-02, -6.923e-02, -4.916e-02, 2.424e-01, 7.730e-01, 2.573e-01, -2.380e-01)); + r += mul(s1_4, M4(-9.293e-01, 6.176e-01, 1.970e-01, 3.467e-01, 4.341e-01, 9.866e-01, 3.035e-01, -1.062e-01, -1.501e-01, 2.709e-01, 1.991e-01, -2.164e-01, 2.881e-01, -1.696e-01, -4.141e-01, -1.004e+00)); + r += mul(s1_5, M4(-8.323e-02, -1.285e-02, -3.468e-02, 1.551e-01, 1.330e-01, -1.238e-01, -1.675e-03, 5.588e-02, 2.128e-01, -2.327e-01, -2.891e-02, 1.567e-01, -1.448e-01, 8.781e-02, 3.254e-02, 7.142e-02)); + r += mul(s1_6, M4(1.231e-01, 5.139e-02, -9.426e-02, -2.822e-01, 1.761e-03, 6.853e-03, 1.165e-01, 7.861e-02, -9.715e-03, 5.489e-03, -1.066e-02, -8.332e-03, -9.111e-02, 3.911e-02, 1.757e-01, 2.222e-01)); + r += mul(s1_7, M4(2.275e-02, 1.199e-01, 5.904e-02, -2.051e-01, 6.950e-01, 1.592e-02, -9.888e-02, -6.701e-01, -9.096e-02, 3.203e-02, 1.204e-01, 2.153e-01, 1.448e-01, -5.225e-03, 6.786e-02, 2.005e-02)); + r += mul(s1_8, M4(-3.290e-02, -3.758e-02, -3.158e-02, 8.713e-02, 3.917e-02, 4.275e-02, -2.450e-02, 3.970e-02, 1.928e-01, 5.498e-02, -5.673e-02, -3.743e-01, 4.981e-02, -1.785e-02, 1.958e-02, 3.487e-02)); + r += V4(7.249e-03, 2.949e-03, 5.297e-03, 3.693e-03); + return r; +} + +void Pass5(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = Rmp8x8(tid.x) + blockStart; + uint2 size = GetInputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = (gxy + 0.5) * pt; + + V4 s0_0 = l0(-1.0, -1.0); + V4 s0_1 = l0(0.0, -1.0); + V4 s0_2 = l0(1.0, -1.0); + V4 s0_3 = l0(-1.0, 0.0); + V4 s0_4 = l0(0.0, 0.0); + V4 s0_5 = l0(1.0, 0.0); + V4 s0_6 = l0(-1.0, 1.0); + V4 s0_7 = l0(0.0, 1.0); + V4 s0_8 = l0(1.0, 1.0); + V4 s1_0 = -max(-s0_0, 0.0); + V4 s1_1 = -max(-s0_1, 0.0); + V4 s1_2 = -max(-s0_2, 0.0); + V4 s1_3 = -max(-s0_3, 0.0); + V4 s1_4 = -max(-s0_4, 0.0); + V4 s1_5 = -max(-s0_5, 0.0); + V4 s1_6 = -max(-s0_6, 0.0); + V4 s1_7 = -max(-s0_7, 0.0); + V4 s1_8 = -max(-s0_8, 0.0); + s0_0 = max(s0_0, 0.0); + s0_1 = max(s0_1, 0.0); + s0_2 = max(s0_2, 0.0); + s0_3 = max(s0_3, 0.0); + s0_4 = max(s0_4, 0.0); + s0_5 = max(s0_5, 0.0); + s0_6 = max(s0_6, 0.0); + s0_7 = max(s0_7, 0.0); + s0_8 = max(s0_8, 0.0); + + t0[gxy] = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8); +} + +//!PASS 6 +//!DESC out-shuffle +//!BLOCK_SIZE 16 +//!NUM_THREADS 64 +//!IN INPUT, t0 +//!OUT OUTPUT + +#define l0(x, y) V4(O(t0, float2(x, y))) + +V4 f0(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8) { + V4 r = 0.0; + r += mul(s0_0, M4(2.340e-02, 8.171e-02, -1.124e-01, -5.065e-02, -5.505e-02, -5.540e-02, -3.000e-03, -1.346e-02, 3.800e-02, 4.944e-02, -2.084e-02, 6.388e-03, 8.566e-02, 2.480e-02, 1.184e-01, -1.075e-04)); + r += mul(s0_1, M4(-2.188e-02, -2.056e-01, 1.480e-02, -7.451e-02, 5.240e-02, 4.098e-02, -4.668e-03, 1.810e-02, -2.533e-02, -6.403e-02, 1.984e-02, -5.716e-02, -3.356e-03, -2.173e-01, 1.218e-01, 1.179e-01)); + r += mul(s0_2, M4(7.330e-03, 2.521e-02, 1.372e-02, 3.411e-02, -1.438e-02, -1.009e-02, 7.676e-03, -1.712e-02, 5.980e-03, 2.040e-02, -8.766e-03, 3.442e-02, -1.623e-02, -2.557e-02, -6.086e-03, 5.413e-04)); + r += mul(s0_3, M4(1.754e-01, 6.364e-02, 2.842e-01, 2.378e-01, -1.684e-01, -1.911e-02, -3.838e-01, -2.622e-02, 2.065e-01, 3.951e-02, 4.217e-01, 4.374e-02, -1.028e-02, 2.417e-02, -1.595e-02, 6.305e-02)); + r += mul(s0_4, M4(-5.620e-02, -8.609e-02, -1.256e-01, -3.166e-01, -1.712e-01, -1.602e-01, -1.577e-01, -4.901e-01, -5.012e-02, 1.082e-01, -7.271e-02, 4.072e-01, -7.789e-02, -1.725e-01, -1.397e-01, -4.507e-01)); + r += mul(s0_5, M4(1.401e-02, 4.716e-02, 1.486e-02, 4.642e-02, 1.131e-02, 3.865e-02, -9.865e-03, 9.301e-02, 3.441e-03, -8.098e-03, -6.012e-03, -1.549e-01, 1.486e-02, 1.872e-02, -2.469e-03, 1.294e-02)); + r += mul(s0_6, M4(-3.894e-02, -4.136e-05, -3.022e-02, 1.045e-03, -3.730e-02, -1.838e-02, -5.573e-02, -2.760e-02, 3.516e-02, 1.602e-02, 6.358e-02, 3.111e-02, -3.045e-02, -7.728e-03, -4.189e-02, -1.102e-02)); + r += mul(s0_7, M4(-1.184e-02, 1.728e-02, 7.925e-03, 6.763e-02, 2.590e-03, -9.456e-03, -4.407e-02, -2.044e-02, 4.472e-02, 2.228e-02, 7.233e-02, 4.863e-02, -1.814e-02, -2.034e-03, -4.994e-02, -2.460e-02)); + r += mul(s0_8, M4(-3.292e-03, -9.015e-03, -3.171e-03, -2.504e-02, 2.120e-03, 3.064e-02, 2.108e-02, 4.592e-02, 2.258e-03, -2.192e-04, -3.576e-03, 3.733e-02, -1.931e-03, -5.083e-03, 5.877e-03, -1.764e-02)); + r += mul(s1_0, M4(4.321e-02, -8.135e-02, -1.567e-01, -6.888e-03, -6.542e-02, -1.656e-02, 1.236e-02, -7.563e-03, 4.657e-02, 9.222e-03, -6.696e-03, -3.545e-03, -6.401e-01, 1.189e-01, 1.509e-01, 2.417e-01)); + r += mul(s1_1, M4(-2.058e-02, 1.174e-01, -2.482e-02, -8.423e-02, -1.692e-02, -1.094e-02, 3.530e-02, 1.780e-02, -9.937e-02, -9.030e-02, 2.304e-02, 1.294e-02, 7.976e-02, -3.096e-01, 1.382e-01, 2.456e-01)); + r += mul(s1_2, M4(4.491e-02, -1.336e-02, 3.593e-02, -3.503e-02, -8.630e-03, -4.295e-03, -1.356e-02, 3.843e-02, 9.887e-03, 1.913e-03, 2.247e-03, 1.113e-02, -7.234e-04, -3.058e-02, 2.833e-03, -1.707e-02)); + r += mul(s1_3, M4(2.007e-01, 6.756e-02, 9.393e-01, 9.057e-02, -3.701e-01, -1.729e-02, -4.136e-01, 2.233e-02, 2.783e-01, 3.590e-02, 3.564e-01, 8.342e-03, 1.333e-01, 7.944e-02, -2.312e-01, 8.354e-02)); + r += mul(s1_4, M4(-3.334e-01, -2.705e-01, -4.072e-01, 3.946e-01, 5.159e-03, -5.860e-01, 1.578e-01, -3.614e-01, 5.366e-01, 4.699e-01, -3.700e-01, 9.463e-02, -4.090e-02, -9.767e-02, -7.999e-02, -4.859e-01)); + r += mul(s1_5, M4(5.700e-02, 6.092e-02, 4.114e-02, -1.564e-02, -1.345e-02, 9.692e-02, 1.456e-03, 9.371e-02, -3.845e-02, -4.751e-02, -2.509e-02, -2.842e-01, 2.938e-03, 2.387e-02, -6.191e-04, -3.120e-04)); + r += mul(s1_6, M4(3.888e-02, 4.969e-02, -1.851e-01, -9.866e-03, -3.527e-02, -1.377e-02, -7.594e-02, -2.619e-02, 3.259e-02, 9.636e-03, 8.622e-03, 1.788e-02, -3.505e-02, -1.048e-03, -1.329e-02, 1.425e-02)); + r += mul(s1_7, M4(6.891e-03, 8.118e-02, -6.443e-02, -1.487e-01, 2.183e-02, 1.106e-03, 6.656e-02, -9.506e-02, 7.418e-04, -6.015e-02, 3.594e-01, 1.039e-02, -3.600e-02, -7.771e-03, -3.406e-02, 2.935e-02)); + r += mul(s1_8, M4(-4.598e-03, -4.678e-03, 1.595e-02, -8.273e-03, 6.740e-03, 1.175e-02, -2.997e-02, -6.116e-03, -3.788e-02, -9.471e-02, -2.149e-02, 4.139e-02, -9.614e-03, -5.573e-03, -1.643e-02, -1.712e-02)); + r += V4(2.510e-03, 4.409e-03, 2.891e-03, 4.977e-03); + return tanh(r); +} + +void Pass6(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = (Rmp8x8(tid.x) << 1) + blockStart; + uint2 size = GetOutputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = ((gxy >> 1) + 0.5) * pt; + + V4 s0_0 = l0(-1.0, -1.0); + V4 s0_1 = l0(0.0, -1.0); + V4 s0_2 = l0(1.0, -1.0); + V4 s0_3 = l0(-1.0, 0.0); + V4 s0_4 = l0(0.0, 0.0); + V4 s0_5 = l0(1.0, 0.0); + V4 s0_6 = l0(-1.0, 1.0); + V4 s0_7 = l0(0.0, 1.0); + V4 s0_8 = l0(1.0, 1.0); + V4 s1_0 = -max(-s0_0, 0.0); + V4 s1_1 = -max(-s0_1, 0.0); + V4 s1_2 = -max(-s0_2, 0.0); + V4 s1_3 = -max(-s0_3, 0.0); + V4 s1_4 = -max(-s0_4, 0.0); + V4 s1_5 = -max(-s0_5, 0.0); + V4 s1_6 = -max(-s0_6, 0.0); + V4 s1_7 = -max(-s0_7, 0.0); + V4 s1_8 = -max(-s0_8, 0.0); + s0_0 = max(s0_0, 0.0); + s0_1 = max(s0_1, 0.0); + s0_2 = max(s0_2, 0.0); + s0_3 = max(s0_3, 0.0); + s0_4 = max(s0_4, 0.0); + s0_5 = max(s0_5, 0.0); + s0_6 = max(s0_6, 0.0); + s0_7 = max(s0_7, 0.0); + s0_8 = max(s0_8, 0.0); + + V4 r = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8); + + static const float3x3 rgb2yuv = {0.299, 0.587, 0.114, -0.169, -0.331, 0.5, 0.5, -0.419, -0.081}; + static const float3x3 yuv2rgb = {1, -0.00093, 1.401687, 1, -0.3437, -0.71417, 1, 1.77216, 0.00099}; + float2 opt = float2(GetOutputPt()); + + pos -= 0.5f * opt; + float3 yuv = mul(rgb2yuv, INPUT.SampleLevel(SL, pos, 0).rgb); + OUTPUT[gxy] = float4(mul(yuv2rgb, float3(saturate(yuv.r + r.x), yuv.yz)), 1); + + ++gxy.x; + pos.x += opt.x; + yuv = mul(rgb2yuv, INPUT.SampleLevel(SL, pos, 0).rgb); + OUTPUT[gxy] = float4(mul(yuv2rgb, float3(saturate(yuv.r + r.y), yuv.yz)), 1); + + ++gxy.y; + pos.y += opt.y; + yuv = mul(rgb2yuv, INPUT.SampleLevel(SL, pos, 0).rgb); + OUTPUT[gxy] = float4(mul(yuv2rgb, float3(saturate(yuv.r + r.w), yuv.yz)), 1); + + --gxy.x; + pos.x -= opt.x; + yuv = mul(rgb2yuv, INPUT.SampleLevel(SL, pos, 0).rgb); + OUTPUT[gxy] = float4(mul(yuv2rgb, float3(saturate(yuv.r + r.z), yuv.yz)), 1); +} diff --git a/src/Effects/CuNNy/CuNNy-4x4C-NVL.hlsl b/src/Effects/CuNNy/CuNNy-4x4C-NVL.hlsl new file mode 100644 index 000000000..d9235defd --- /dev/null +++ b/src/Effects/CuNNy/CuNNy-4x4C-NVL.hlsl @@ -0,0 +1,486 @@ +// CuNNy 4x4C BILINEAR RGB NVL - https://github.com/cunnyplapper/CuNNy + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +//!MAGPIE EFFECT +//!VERSION 4 +//!SORT_NAME CuNNy-D04N04 + +//!TEXTURE +Texture2D INPUT; + +//!TEXTURE +//!WIDTH INPUT_WIDTH * 2 +//!HEIGHT INPUT_HEIGHT * 2 +Texture2D OUTPUT; + +//!SAMPLER +//!FILTER POINT +SamplerState SP; + +//!SAMPLER +//!FILTER LINEAR +SamplerState SL; + +//!COMMON +#define O(t, p) t.SampleLevel(SP, pos + p * pt, 0) +#define V4 min16float4 +#define M4 min16float4x4 + +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +//!FORMAT R8G8B8A8_SNORM +Texture2D t0; + +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +//!FORMAT R8G8B8A8_SNORM +Texture2D t1; + +//!PASS 1 +//!DESC in +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 +//!IN INPUT +//!OUT t0 + +#define l0(x, y) min16float((dot(float3(-4.174e-01, -7.873e-01, -1.763e-01), O(INPUT, float2(x, y)).rgb) + 1.011e+00)) + +V4 f0(min16float s0_0, min16float s0_1, min16float s0_2, min16float s0_3, min16float s0_4, min16float s0_5, min16float s0_6, min16float s0_7, min16float s0_8) { + V4 r = 0.0; + r += V4(1.222e-01, 7.038e-03, 1.179e-01, 1.876e-01) * s0_0; + r += V4(1.025e-01, -2.993e-01, 3.154e-01, -1.050e-01) * s0_1; + r += V4(5.656e-02, -3.117e-03, -6.665e-02, -2.044e-01) * s0_2; + r += V4(-5.045e-01, -4.189e-01, -3.076e-01, -3.691e-01) * s0_3; + r += V4(1.365e-01, 6.699e-01, 3.389e-01, 4.561e-01) * s0_4; + r += V4(-7.690e-02, 2.655e-02, -1.044e-02, 7.271e-02) * s0_5; + r += V4(1.358e-02, 3.378e-03, -1.802e-01, -1.936e-01) * s0_6; + r += V4(8.227e-02, 1.550e-02, -1.820e-01, -1.670e-01) * s0_7; + r += V4(9.988e-03, 1.413e-03, -2.486e-02, 3.258e-01) * s0_8; + r += V4(3.566e-02, -1.308e-03, -5.595e-03, -5.246e-03); + return r; +} + +void Pass1(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = Rmp8x8(tid.x) + blockStart; + uint2 size = GetInputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = (gxy + 0.5) * pt; + + min16float s0_0 = l0(-1.0, -1.0); + min16float s0_1 = l0(0.0, -1.0); + min16float s0_2 = l0(1.0, -1.0); + min16float s0_3 = l0(-1.0, 0.0); + min16float s0_4 = l0(0.0, 0.0); + min16float s0_5 = l0(1.0, 0.0); + min16float s0_6 = l0(-1.0, 1.0); + min16float s0_7 = l0(0.0, 1.0); + min16float s0_8 = l0(1.0, 1.0); + + t0[gxy] = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8); +} + +//!PASS 2 +//!DESC conv1 +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 +//!IN t0 +//!OUT t1 + +#define l0(x, y) V4(O(t0, float2(x, y))) + +V4 f0(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8) { + V4 r = 0.0; + r += mul(s0_0, M4(1.282e-01, 1.199e-01, 1.156e-01, -4.091e-02, -1.771e-02, -1.431e-01, -1.478e-02, 4.041e-02, -1.559e-01, 1.231e-02, -8.571e-02, 2.159e-02, -6.484e-02, 3.819e-02, -3.386e-02, -3.344e-02)); + r += mul(s0_1, M4(6.131e-02, 1.493e-01, 1.954e-01, -2.565e-01, 1.570e-01, -3.852e-01, -2.313e-01, 9.262e-02, 1.038e-01, -4.169e-01, -2.446e-01, 9.953e-02, -1.830e-01, -9.774e-02, -1.498e-01, 8.626e-02)); + r += mul(s0_2, M4(9.908e-02, 1.372e-01, -1.254e-02, 4.486e-03, 1.023e-01, 6.484e-02, 1.645e-01, -4.932e-02, -4.221e-02, -1.919e-01, -2.135e-02, 6.955e-02, -1.406e-01, 8.082e-02, -7.935e-02, 3.010e-02)); + r += mul(s0_3, M4(-7.203e-02, -1.210e-01, 1.084e-01, -6.958e-03, 1.303e-01, 1.030e-01, -2.392e-01, -1.084e-01, 2.173e-01, -7.864e-02, -2.983e-01, -3.510e-01, -3.076e-01, 4.533e-02, 1.940e-01, 4.051e-01)); + r += mul(s0_4, M4(9.270e-02, -4.072e-01, 2.338e-01, 4.098e-01, -1.440e-01, 6.971e-01, 5.515e-01, 2.682e-01, -1.401e-01, 3.504e-02, 1.366e-01, 6.149e-01, -3.330e-01, 1.880e-01, -4.170e-01, 3.244e-01)); + r += mul(s0_5, M4(-5.380e-01, -7.843e-02, -1.293e-01, -9.225e-02, 1.393e-01, -2.588e-01, 4.618e-01, -2.264e-02, -5.369e-02, 1.321e-01, -3.029e-02, 7.983e-02, -1.048e-01, 3.279e-02, -5.969e-02, -3.766e-03)); + r += mul(s0_6, M4(3.432e-02, 1.518e-02, 1.940e-02, -1.086e-01, 1.052e-01, -5.430e-02, -3.343e-02, 1.824e-01, -9.831e-02, 1.097e-02, 6.281e-02, 1.194e-01, 3.253e-02, 4.046e-02, -2.183e-02, -1.328e-01)); + r += mul(s0_7, M4(1.538e-01, 6.796e-02, -4.870e-01, 7.139e-02, -2.497e-01, 2.916e-02, 6.191e-01, -2.650e-01, -4.194e-02, 1.782e-01, -3.431e-01, -9.707e-02, 2.173e-02, -1.150e-01, -8.162e-03, 4.551e-02)); + r += mul(s0_8, M4(5.804e-02, 5.436e-02, -1.604e-01, 8.077e-02, 2.685e-01, 4.741e-02, 1.225e-01, -1.033e-01, -4.358e-02, -1.091e-01, 8.815e-02, -3.121e-02, -2.569e-02, -1.093e-02, -2.550e-02, -1.571e-02)); + r += mul(s1_0, M4(8.760e-02, 1.254e-01, 9.299e-02, -1.140e-02, 4.179e-02, -1.333e-01, 3.048e-03, -3.111e-02, -6.091e-02, 6.563e-03, 4.609e-03, -4.717e-02, -6.470e-02, -5.791e-02, -5.529e-03, 8.697e-02)); + r += mul(s1_1, M4(6.935e-02, 9.805e-02, 1.851e-01, -2.726e-01, 1.731e-01, -2.863e-01, -2.267e-01, -3.813e-02, 1.104e-01, -3.193e-01, -1.958e-01, 9.567e-02, 1.819e-01, -2.054e-01, 1.228e-01, 3.906e-02)); + r += mul(s1_2, M4(-1.957e-01, 7.733e-02, -2.023e-01, 1.297e-01, -1.646e-01, 1.304e-01, -1.728e-02, -4.396e-02, 7.828e-02, -2.639e-01, 3.389e-02, 1.101e-01, 1.388e-01, -4.075e-03, 1.023e-01, -7.785e-03)); + r += mul(s1_3, M4(-2.828e-02, -7.018e-02, 4.269e-02, -1.386e-01, 2.143e-02, 2.504e-01, -2.134e-01, -2.483e-01, 1.075e-01, -2.671e-02, -2.588e-01, -3.271e-01, 1.173e-01, -6.103e-02, 5.539e-01, 5.341e-01)); + r += mul(s1_4, M4(-2.415e-01, -2.975e-01, -6.622e-02, 4.027e-01, -5.871e-01, 7.506e-01, 1.939e-02, -1.680e-01, 4.796e-01, -2.840e-01, 5.077e-01, 9.122e-02, 1.463e-01, 2.124e-01, 6.358e-02, 2.993e-01)); + r += mul(s1_5, M4(4.298e-01, -1.754e-01, 5.357e-01, -1.440e-01, -4.439e-01, -3.819e-01, -1.009e-01, 2.113e-02, -2.275e-02, -1.842e-02, 1.441e-01, 6.590e-03, 2.627e-02, 3.381e-02, 9.956e-02, -1.935e-02)); + r += mul(s1_6, M4(-5.557e-02, 3.378e-02, -2.451e-02, -1.718e-01, -2.037e-01, 1.631e-02, -2.822e-01, -7.724e-02, -6.657e-02, -2.282e-02, 2.673e-02, 8.716e-02, 1.291e-01, 9.472e-03, 3.810e-02, -1.134e-01)); + r += mul(s1_7, M4(1.441e-01, 4.331e-02, -4.741e-01, 2.165e-01, -5.974e-01, -2.669e-02, -4.949e-02, -3.179e-01, 1.007e-01, 1.512e-01, -4.138e-02, -7.470e-02, 8.828e-02, -1.400e-01, 5.797e-02, -4.988e-03)); + r += mul(s1_8, M4(-2.478e-01, 1.392e-01, -8.663e-02, -3.629e-02, 1.823e-01, 7.573e-03, -2.445e-01, -1.641e-02, -5.197e-02, -8.804e-02, 1.244e-01, 2.095e-02, 1.683e-02, -4.073e-02, -5.207e-03, -3.854e-03)); + r += V4(-4.317e-03, 2.687e-03, -1.530e-03, 4.681e-04); + return r; +} + +void Pass2(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = Rmp8x8(tid.x) + blockStart; + uint2 size = GetInputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = (gxy + 0.5) * pt; + + V4 s0_0 = l0(-1.0, -1.0); + V4 s0_1 = l0(0.0, -1.0); + V4 s0_2 = l0(1.0, -1.0); + V4 s0_3 = l0(-1.0, 0.0); + V4 s0_4 = l0(0.0, 0.0); + V4 s0_5 = l0(1.0, 0.0); + V4 s0_6 = l0(-1.0, 1.0); + V4 s0_7 = l0(0.0, 1.0); + V4 s0_8 = l0(1.0, 1.0); + V4 s1_0 = -max(-s0_0, 0.0); + V4 s1_1 = -max(-s0_1, 0.0); + V4 s1_2 = -max(-s0_2, 0.0); + V4 s1_3 = -max(-s0_3, 0.0); + V4 s1_4 = -max(-s0_4, 0.0); + V4 s1_5 = -max(-s0_5, 0.0); + V4 s1_6 = -max(-s0_6, 0.0); + V4 s1_7 = -max(-s0_7, 0.0); + V4 s1_8 = -max(-s0_8, 0.0); + s0_0 = max(s0_0, 0.0); + s0_1 = max(s0_1, 0.0); + s0_2 = max(s0_2, 0.0); + s0_3 = max(s0_3, 0.0); + s0_4 = max(s0_4, 0.0); + s0_5 = max(s0_5, 0.0); + s0_6 = max(s0_6, 0.0); + s0_7 = max(s0_7, 0.0); + s0_8 = max(s0_8, 0.0); + + t1[gxy] = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8); +} + +//!PASS 3 +//!DESC conv2 +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 +//!IN t1 +//!OUT t0 + +#define l0(x, y) V4(O(t1, float2(x, y))) + +V4 f0(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8) { + V4 r = 0.0; + r += mul(s0_0, M4(1.921e-01, -2.132e-02, -5.460e-03, -6.681e-02, 9.988e-02, -2.228e-02, 4.719e-02, 9.124e-03, -1.072e-01, 1.506e-01, 2.070e-02, -4.671e-02, 2.244e-01, -4.895e-02, -8.150e-03, -9.520e-02)); + r += mul(s0_1, M4(8.226e-02, 4.651e-02, -1.842e-01, -3.376e-02, 1.349e-01, 2.148e-02, -1.746e-01, 1.671e-02, 9.761e-02, 7.581e-02, 1.470e-01, -8.582e-02, -1.149e-01, 2.143e-02, -1.597e-01, 1.626e-01)); + r += mul(s0_2, M4(-5.810e-04, -3.566e-02, 4.708e-02, -3.068e-02, 1.578e-02, 5.503e-03, 3.081e-02, -4.174e-02, 3.394e-01, 7.398e-02, -9.467e-02, -1.127e-01, -1.314e-01, 1.511e-02, 1.538e-01, -5.695e-03)); + r += mul(s0_3, M4(2.959e-01, 3.316e-02, -5.716e-02, -2.233e-01, 5.020e-01, -1.416e-01, -6.082e-02, -3.393e-01, 3.292e-01, -6.813e-02, 9.009e-02, -1.638e-01, 1.190e-01, -2.728e-02, -6.042e-02, -1.360e-01)); + r += mul(s0_4, M4(5.902e-01, 3.040e-01, -2.870e-01, 2.228e-02, -1.646e-01, 2.078e-02, -1.480e-01, 2.083e-01, -4.397e-01, -2.549e-01, -1.168e-01, -4.199e-01, 2.199e-01, 2.596e-02, 2.598e-02, -1.313e-01)); + r += mul(s0_5, M4(1.043e-01, 1.050e-02, -5.654e-02, -1.265e-01, -1.978e-01, 3.772e-02, 2.474e-01, 1.395e-01, 2.041e-01, 6.617e-02, -2.602e-01, -1.601e-01, -5.577e-02, -1.591e-02, 2.096e-01, 2.594e-02)); + r += mul(s0_6, M4(7.245e-02, 6.156e-02, 5.317e-02, -3.912e-01, 1.871e-01, -2.079e-02, -2.552e-02, -6.961e-02, 2.686e-01, 8.518e-02, -1.026e-01, -4.040e-01, -6.324e-02, 7.999e-03, 1.317e-02, 1.619e-02)); + r += mul(s0_7, M4(1.240e-01, -8.349e-02, -1.258e-01, -3.269e-01, 6.624e-01, -1.357e-01, -6.738e-01, -5.998e-01, -8.375e-04, 2.226e-01, -1.880e-01, 5.678e-02, -8.383e-02, -3.455e-02, -1.399e-02, 4.540e-02)); + r += mul(s0_8, M4(-3.130e-02, 9.691e-02, 1.763e-01, -1.847e-02, -1.193e-01, -7.494e-03, 1.485e-02, 1.244e-02, 9.559e-02, 3.116e-02, 8.046e-03, -1.264e-01, -2.403e-01, 6.389e-02, 2.999e-01, 1.484e-01)); + r += mul(s1_0, M4(2.569e-01, -8.689e-03, -1.806e-02, -3.993e-02, 9.155e-02, -2.022e-02, 1.034e-02, -3.455e-02, -1.534e-01, 1.836e-02, -1.176e-03, 3.593e-03, 2.642e-01, -6.587e-02, -4.169e-02, -2.237e-01)); + r += mul(s1_1, M4(1.398e-01, 1.020e-02, -2.478e-01, 2.747e-02, 7.152e-02, 1.835e-02, -2.013e-01, 1.151e-02, -2.586e-01, -3.622e-02, 2.529e-01, 1.465e-01, -3.973e-01, 5.907e-02, -9.450e-02, 3.761e-02)); + r += mul(s1_2, M4(3.157e-02, 7.847e-03, 8.109e-03, -3.333e-02, -3.333e-02, -6.401e-03, -6.632e-03, 3.296e-02, -1.433e-02, 2.167e-02, 1.194e-01, -1.028e-01, -2.104e-01, 1.352e-02, -6.835e-02, 1.901e-01)); + r += mul(s1_3, M4(3.443e-01, -1.004e-01, -6.176e-02, -3.047e-01, 4.779e-01, -7.928e-02, -8.134e-02, -4.873e-01, -1.421e-01, 3.972e-02, 7.459e-02, 2.099e-01, 1.118e-01, -1.022e-02, -8.584e-02, -1.657e-01)); + r += mul(s1_4, M4(-1.721e-01, 2.625e-02, -7.292e-03, 2.646e-01, 2.505e-02, 1.479e-01, -3.357e-01, 1.088e-01, 1.016e-01, -1.902e-01, -1.622e-01, -6.326e-02, -4.305e-01, 4.763e-01, -1.357e-03, -5.685e-01)); + r += mul(s1_5, M4(3.324e-03, 1.692e-02, -5.726e-02, 2.853e-02, -3.135e-01, -4.534e-03, 2.549e-01, 1.183e-01, -1.277e-01, -5.030e-02, 9.190e-02, 1.145e-01, 3.445e-01, 6.425e-02, -2.707e-01, -1.701e-01)); + r += mul(s1_6, M4(2.164e-02, 1.998e-02, 1.667e-02, -6.126e-02, 2.400e-01, -9.253e-02, -4.525e-02, 8.615e-03, 5.148e-02, -1.803e-02, -7.495e-02, -7.102e-02, -2.646e-02, 6.819e-02, 1.465e-01, 1.904e-01)); + r += mul(s1_7, M4(-2.339e-02, 3.350e-02, -1.274e-01, 5.525e-02, 9.120e-01, -9.074e-01, -6.856e-01, -7.422e-02, 4.849e-02, -1.377e-02, -1.409e-01, -5.792e-02, -1.044e-01, 9.079e-02, 2.520e-01, 2.053e-01)); + r += mul(s1_8, M4(1.891e-02, -1.562e-02, -1.024e-02, -2.686e-02, -1.038e-01, -3.210e-02, 4.222e-01, -2.084e-01, -1.841e-01, 3.231e-02, 7.320e-02, 1.727e-01, 2.861e-01, 2.506e-02, -2.266e-01, -3.940e-01)); + r += V4(-1.043e-03, 3.601e-03, 5.622e-03, -7.848e-04); + return r; +} + +void Pass3(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = Rmp8x8(tid.x) + blockStart; + uint2 size = GetInputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = (gxy + 0.5) * pt; + + V4 s0_0 = l0(-1.0, -1.0); + V4 s0_1 = l0(0.0, -1.0); + V4 s0_2 = l0(1.0, -1.0); + V4 s0_3 = l0(-1.0, 0.0); + V4 s0_4 = l0(0.0, 0.0); + V4 s0_5 = l0(1.0, 0.0); + V4 s0_6 = l0(-1.0, 1.0); + V4 s0_7 = l0(0.0, 1.0); + V4 s0_8 = l0(1.0, 1.0); + V4 s1_0 = -max(-s0_0, 0.0); + V4 s1_1 = -max(-s0_1, 0.0); + V4 s1_2 = -max(-s0_2, 0.0); + V4 s1_3 = -max(-s0_3, 0.0); + V4 s1_4 = -max(-s0_4, 0.0); + V4 s1_5 = -max(-s0_5, 0.0); + V4 s1_6 = -max(-s0_6, 0.0); + V4 s1_7 = -max(-s0_7, 0.0); + V4 s1_8 = -max(-s0_8, 0.0); + s0_0 = max(s0_0, 0.0); + s0_1 = max(s0_1, 0.0); + s0_2 = max(s0_2, 0.0); + s0_3 = max(s0_3, 0.0); + s0_4 = max(s0_4, 0.0); + s0_5 = max(s0_5, 0.0); + s0_6 = max(s0_6, 0.0); + s0_7 = max(s0_7, 0.0); + s0_8 = max(s0_8, 0.0); + + t0[gxy] = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8); +} + +//!PASS 4 +//!DESC conv3 +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 +//!IN t0 +//!OUT t1 + +#define l0(x, y) V4(O(t0, float2(x, y))) + +V4 f0(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-7.801e-03, 7.517e-03, 5.348e-02, 7.686e-02, -8.770e-03, 1.144e-02, -2.398e-02, 1.355e-02, -4.642e-02, 5.880e-02, 3.263e-02, 1.860e-01, -4.443e-02, -2.732e-02, -2.133e-02, -1.166e-01)); + r += mul(s0_1, M4(-1.751e-02, -1.230e-02, -1.218e-01, -1.231e-01, 4.092e-03, -8.769e-03, -2.251e-03, 5.142e-02, 4.354e-03, -4.445e-02, -2.369e-01, -1.616e-01, 4.495e-03, -1.326e-01, -5.371e-01, -5.119e-01)); + r += mul(s0_2, M4(3.143e-02, 2.366e-02, 8.884e-02, -1.819e-02, 2.358e-03, 3.812e-04, -4.972e-02, -5.311e-02, 1.729e-02, 1.523e-02, 7.798e-02, -1.705e-05, -2.295e-02, 6.567e-02, 1.422e-01, 1.890e-01)); + r += mul(s0_3, M4(2.363e-02, 1.555e-02, -1.307e-01, -8.190e-02, 1.026e-02, 9.724e-03, 5.358e-02, -2.783e-01, 7.268e-03, 1.659e-01, -5.801e-02, 3.076e-01, -1.575e-01, -9.567e-02, 3.294e-02, -7.694e-01)); + r += mul(s0_4, M4(1.677e-02, -1.324e-01, 4.019e-01, -2.902e-01, -6.051e-02, -4.625e-02, 8.409e-01, 4.756e-01, -1.135e-01, -3.213e-01, 6.389e-02, -2.083e-01, -1.219e+00, 2.280e-01, 9.667e-01, -3.604e-01)); + r += mul(s0_5, M4(-5.948e-02, 1.567e-01, 3.883e-02, -4.843e-03, -2.153e-02, 3.439e-02, -1.160e-01, -1.325e-02, -5.312e-02, 1.136e-01, -5.260e-02, -3.524e-02, 7.315e-02, 3.527e-01, 6.186e-01, -7.505e-02)); + r += mul(s0_6, M4(-3.841e-02, 1.620e-03, 9.449e-02, -8.648e-02, -2.656e-02, -1.676e-03, 2.364e-03, -7.221e-02, -9.590e-02, 4.160e-02, -1.278e-02, -3.171e-02, 6.213e-02, 2.673e-02, -7.931e-02, 2.588e-01)); + r += mul(s0_7, M4(-3.636e-02, -1.558e-01, 2.151e-01, 1.188e-01, 1.275e-01, -8.114e-02, -8.376e-02, -3.690e-02, -1.968e-02, -1.038e-01, 8.994e-02, 3.846e-02, -1.499e-01, 6.457e-01, -8.201e-02, -3.935e-01)); + r += mul(s0_8, M4(-2.833e-03, 2.529e-01, -3.350e-03, -3.433e-02, 1.943e-02, -2.796e-02, 3.313e-02, 1.582e-02, 1.702e-02, 5.663e-02, -1.647e-02, -2.229e-02, -4.865e-01, 3.285e-01, -4.462e-01, -4.307e-01)); + r += mul(s1_0, M4(-6.004e-02, 4.898e-03, 3.591e-02, 1.900e-01, -3.816e-02, -3.269e-02, 1.459e-01, -3.464e-03, -1.235e-02, -3.737e-02, 1.569e-02, 2.559e-01, -3.173e-04, 1.268e-02, 8.886e-03, 2.960e-02)); + r += mul(s1_1, M4(-1.582e-02, -7.507e-02, -2.026e-01, 2.027e-01, -6.107e-02, 2.055e-02, -5.811e-02, 5.420e-03, 1.028e-02, -1.374e-02, -6.152e-01, -2.259e-01, -3.408e-03, -1.800e-02, 4.574e-02, -9.590e-02)); + r += mul(s1_2, M4(4.210e-02, 2.126e-02, 8.277e-02, 2.079e-02, -1.733e-01, -2.483e-02, 2.686e-01, 1.498e-01, 7.352e-02, -2.511e-02, 3.159e-02, 5.775e-02, 5.942e-02, 3.383e-02, 1.274e-01, -5.928e-02)); + r += mul(s1_3, M4(5.614e-02, 7.561e-02, -8.328e-02, 2.427e-01, 7.214e-02, -1.122e-01, 9.434e-02, -2.602e-01, -1.052e-02, -6.944e-02, -3.023e-02, -1.655e-01, 1.236e-03, 4.025e-03, -3.082e-02, -1.533e-01)); + r += mul(s1_4, M4(6.675e-01, -2.254e-01, 1.173e+00, -8.261e-02, 5.655e-01, -2.000e-01, 8.301e-01, 1.458e+00, -2.497e-01, -1.091e+00, -4.698e-01, -1.876e-01, -3.358e-02, -2.854e-01, 5.032e-01, -1.558e-01)); + r += mul(s1_5, M4(-1.444e-02, 1.502e-01, -4.221e-02, -4.864e-02, 3.236e-01, -2.572e-01, 1.344e-01, 8.562e-02, -1.030e-01, 2.690e-01, 1.238e-01, 3.309e-02, -3.849e-02, 1.860e-01, 6.528e-03, 2.840e-02)); + r += mul(s1_6, M4(-1.161e-01, 5.405e-02, -3.101e-02, -1.009e-01, -9.594e-02, -1.207e-02, -3.836e-02, -6.894e-02, -1.770e-02, -2.958e-02, 8.484e-02, -2.284e-02, 2.585e-04, -2.764e-02, 4.972e-02, -5.968e-02)); + r += mul(s1_7, M4(-4.113e-02, -1.948e-01, -2.728e-02, -3.142e-02, -2.894e-01, -1.111e-01, 7.492e-02, -2.892e-02, 9.054e-02, 4.350e-02, 2.183e-01, 1.489e-01, 1.167e-02, -6.678e-02, 3.696e-02, -1.315e-02)); + r += mul(s1_8, M4(2.532e-02, 4.585e-02, -3.694e-02, -6.244e-02, -1.673e-01, 6.180e-02, -4.475e-02, 1.028e-02, -1.658e-02, 8.923e-02, 1.711e-02, 3.037e-03, 4.651e-02, 1.652e-01, 7.863e-03, -3.387e-02)); + r += V4(-6.562e-04, 7.371e-04, -4.319e-03, -8.757e-04); + return r; +} + +void Pass4(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = Rmp8x8(tid.x) + blockStart; + uint2 size = GetInputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = (gxy + 0.5) * pt; + + V4 s0_0 = l0(-1.0, -1.0); + V4 s0_1 = l0(0.0, -1.0); + V4 s0_2 = l0(1.0, -1.0); + V4 s0_3 = l0(-1.0, 0.0); + V4 s0_4 = l0(0.0, 0.0); + V4 s0_5 = l0(1.0, 0.0); + V4 s0_6 = l0(-1.0, 1.0); + V4 s0_7 = l0(0.0, 1.0); + V4 s0_8 = l0(1.0, 1.0); + V4 s1_0 = -max(-s0_0, 0.0); + V4 s1_1 = -max(-s0_1, 0.0); + V4 s1_2 = -max(-s0_2, 0.0); + V4 s1_3 = -max(-s0_3, 0.0); + V4 s1_4 = -max(-s0_4, 0.0); + V4 s1_5 = -max(-s0_5, 0.0); + V4 s1_6 = -max(-s0_6, 0.0); + V4 s1_7 = -max(-s0_7, 0.0); + V4 s1_8 = -max(-s0_8, 0.0); + s0_0 = max(s0_0, 0.0); + s0_1 = max(s0_1, 0.0); + s0_2 = max(s0_2, 0.0); + s0_3 = max(s0_3, 0.0); + s0_4 = max(s0_4, 0.0); + s0_5 = max(s0_5, 0.0); + s0_6 = max(s0_6, 0.0); + s0_7 = max(s0_7, 0.0); + s0_8 = max(s0_8, 0.0); + + t1[gxy] = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8); +} + +//!PASS 5 +//!DESC conv4 +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 +//!IN t1 +//!OUT t0 + +#define l0(x, y) V4(O(t1, float2(x, y))) + +V4 f0(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-1.087e-01, -5.083e-02, 3.146e-01, -4.241e-02, 4.462e-02, -4.358e-02, -1.562e-01, -2.609e-03, 5.918e-02, -2.526e-02, -3.132e-02, -1.150e-02, -8.799e-03, 3.070e-02, -1.680e-02, -1.046e-02)); + r += mul(s0_1, M4(1.762e-01, 8.784e-01, -2.704e+00, -1.565e+00, -1.473e-01, -5.723e-01, 7.838e-02, -7.420e-03, -1.769e-01, -2.041e-01, -1.783e-03, -4.944e-03, 1.304e-02, 2.646e-01, -1.708e-01, 7.483e-03)); + r += mul(s0_2, M4(-1.907e-01, 1.514e-01, -3.657e-01, -5.840e-01, -4.943e-02, -1.014e-02, -2.869e-03, 6.488e-03, 2.266e-02, -3.850e-02, 6.125e-03, 1.899e-02, -3.541e-02, -2.011e-01, 1.567e-01, 1.008e-02)); + r += mul(s0_3, M4(-3.061e-01, -1.768e-01, 9.163e-02, -2.243e-01, 4.945e-02, 1.106e-01, -1.137e-01, 1.755e-02, 2.640e-01, -9.298e-02, -1.704e-01, 3.935e-02, 1.506e-01, -3.284e-02, 4.719e-02, 5.543e-02)); + r += mul(s0_4, M4(-4.579e-01, -6.198e-02, -9.889e-01, -4.446e-01, -1.612e-01, 1.518e-01, 2.588e-01, 1.075e-02, -1.527e+00, -7.923e-01, 8.120e-02, -1.116e-01, -2.079e-01, -1.206e-01, -4.422e-01, -1.951e-01)); + r += mul(s0_5, M4(1.064e-01, -1.684e-01, 2.316e-01, 4.211e-01, -9.153e-02, 9.155e-02, -7.649e-02, -1.385e-01, 9.422e-02, -1.631e-01, 8.278e-02, 3.318e-01, 7.284e-02, 3.489e-01, -2.303e-02, -6.554e-01)); + r += mul(s0_6, M4(-6.320e-02, -4.390e-02, 1.453e-02, 3.187e-02, 2.166e-02, 2.423e-03, 1.573e-03, -2.226e-02, 1.401e-01, 2.026e-01, -2.249e-01, 6.471e-02, 3.593e-02, -1.575e-02, -3.186e-02, 1.339e-02)); + r += mul(s0_7, M4(2.778e-02, 7.495e-02, -1.086e-01, 8.862e-02, -2.352e-02, 1.477e-02, 2.741e-02, 4.345e-02, -2.865e-01, 9.405e-02, 1.880e-01, -3.610e-01, -7.797e-02, -5.710e-03, 3.386e-02, 2.830e-02)); + r += mul(s0_8, M4(-3.734e-02, 3.357e-02, 5.657e-03, -1.596e-01, -7.661e-03, 1.603e-02, -3.137e-02, -7.023e-03, 6.522e-03, -2.715e-02, 2.765e-02, 4.724e-02, 1.922e-02, 3.944e-02, -8.276e-02, -1.915e-02)); + r += mul(s1_0, M4(-7.121e-02, -2.276e-02, 7.266e-02, -4.411e-03, -5.600e-01, 4.502e-01, -1.817e-01, -2.906e-01, -5.675e-02, 2.653e-02, 3.284e-02, -1.925e-03, -4.729e-03, -1.554e-03, -6.081e-03, -2.195e-02)); + r += mul(s1_1, M4(2.212e-01, 3.154e-01, -2.765e-01, 4.432e-02, 1.402e+00, 2.159e-01, 4.402e-01, 2.537e-01, 6.697e-02, 1.207e-01, -5.192e-02, 2.638e-02, 5.366e-02, 5.855e-02, -3.687e-02, 4.389e-03)); + r += mul(s1_2, M4(3.137e-02, -1.157e-01, 9.497e-02, -3.724e-02, 5.241e-02, 7.793e-02, 2.277e-04, -4.033e-01, 1.432e-02, 4.622e-02, -1.636e-02, -5.840e-03, -1.593e-02, -7.447e-02, 3.943e-02, -3.517e-03)); + r += mul(s1_3, M4(-1.209e-02, -1.350e-01, 3.018e-01, 1.233e-01, -1.262e-03, 2.194e-01, -2.919e-01, -8.031e-03, 4.620e-03, 5.318e-02, 1.247e-02, -4.260e-02, 7.155e-02, 3.256e-02, -9.839e-02, -6.741e-04)); + r += mul(s1_4, M4(3.291e-01, 2.397e-01, -2.820e-01, 5.703e-01, 7.831e-03, 5.816e-02, -1.696e-02, -1.957e-01, -1.851e-01, 3.696e-02, -2.611e-01, 7.039e-03, -1.562e-01, -7.676e-01, 9.080e-01, 7.823e-02)); + r += mul(s1_5, M4(9.918e-03, 6.364e-02, 3.364e-02, -3.291e-01, 1.393e-02, 3.139e-02, 1.701e-02, -5.675e-02, 5.085e-02, -2.050e-01, 1.160e-01, 4.875e-02, -1.189e-01, 2.310e-01, -1.353e-01, 2.046e-02)); + r += mul(s1_6, M4(-5.477e-03, -1.704e-02, 9.510e-03, -1.701e-02, 1.391e-02, -8.760e-03, -3.355e-02, -6.898e-03, -9.203e-03, -2.442e-02, 7.547e-03, 1.817e-02, 1.871e-02, -1.149e-02, 6.458e-02, 1.403e-02)); + r += mul(s1_7, M4(-5.073e-03, -5.454e-02, -2.710e-02, 1.292e-02, 2.458e-02, 1.739e-02, -2.319e-03, 3.865e-02, 5.399e-02, -1.176e-02, -1.315e-01, 1.489e-01, -7.903e-02, 8.120e-02, 4.749e-02, 1.961e-01)); + r += mul(s1_8, M4(4.163e-02, -1.603e-02, 8.659e-03, 1.023e-01, 5.233e-03, -2.900e-03, -5.293e-03, -5.829e-03, -1.453e-02, 2.467e-02, 7.198e-02, -2.407e-01, -4.023e-02, 1.009e-01, -1.560e-01, -1.567e-01)); + r += V4(-3.709e-04, 2.029e-04, -3.042e-03, -2.970e-04); + return r; +} + +void Pass5(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = Rmp8x8(tid.x) + blockStart; + uint2 size = GetInputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = (gxy + 0.5) * pt; + + V4 s0_0 = l0(-1.0, -1.0); + V4 s0_1 = l0(0.0, -1.0); + V4 s0_2 = l0(1.0, -1.0); + V4 s0_3 = l0(-1.0, 0.0); + V4 s0_4 = l0(0.0, 0.0); + V4 s0_5 = l0(1.0, 0.0); + V4 s0_6 = l0(-1.0, 1.0); + V4 s0_7 = l0(0.0, 1.0); + V4 s0_8 = l0(1.0, 1.0); + V4 s1_0 = -max(-s0_0, 0.0); + V4 s1_1 = -max(-s0_1, 0.0); + V4 s1_2 = -max(-s0_2, 0.0); + V4 s1_3 = -max(-s0_3, 0.0); + V4 s1_4 = -max(-s0_4, 0.0); + V4 s1_5 = -max(-s0_5, 0.0); + V4 s1_6 = -max(-s0_6, 0.0); + V4 s1_7 = -max(-s0_7, 0.0); + V4 s1_8 = -max(-s0_8, 0.0); + s0_0 = max(s0_0, 0.0); + s0_1 = max(s0_1, 0.0); + s0_2 = max(s0_2, 0.0); + s0_3 = max(s0_3, 0.0); + s0_4 = max(s0_4, 0.0); + s0_5 = max(s0_5, 0.0); + s0_6 = max(s0_6, 0.0); + s0_7 = max(s0_7, 0.0); + s0_8 = max(s0_8, 0.0); + + t0[gxy] = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8); +} + +//!PASS 6 +//!DESC out-shuffle +//!BLOCK_SIZE 16 +//!NUM_THREADS 64 +//!IN INPUT, t0 +//!OUT OUTPUT + +#define l0(x, y) V4(O(t0, float2(x, y))) + +V4 f0(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-6.857e-02, -6.042e-02, 3.293e-03, -2.389e-03, -1.606e-01, -1.556e-02, -5.115e-02, -4.602e-02, -3.762e-02, 1.994e-02, -2.370e-02, 3.558e-02, -7.142e-01, 8.184e-01, -1.361e-01, 1.228e-01)); + r += mul(s0_1, M4(-1.887e-01, -2.260e-01, 1.293e-02, -1.757e-02, 1.257e-01, 1.304e-01, -4.525e-02, 4.471e-02, 6.895e-01, -4.096e-01, 4.096e-02, 1.817e-02, -1.343e-01, -4.170e-01, 3.991e-03, 1.516e-03)); + r += mul(s0_2, M4(-2.667e-01, -8.692e-02, 1.481e-01, -1.466e-01, 6.142e-02, -2.084e-02, 1.942e-02, 6.700e-04, 3.942e-02, 3.109e-01, -1.323e-02, 2.240e-02, -2.306e-02, -4.749e-02, -1.155e-02, 1.843e-03)); + r += mul(s0_3, M4(-1.004e-01, -1.184e-02, -8.590e-02, -1.018e-01, 6.862e-02, -4.700e-02, -1.537e-01, -1.096e-01, -1.228e-01, 1.462e-02, -1.715e-01, 1.862e-02, 3.668e-01, -1.138e-01, 8.494e-04, 6.113e-01)); + r += mul(s0_4, M4(4.389e-01, -5.527e-01, -4.972e-01, -7.620e-01, 1.684e-01, 5.375e-02, 1.032e+00, 5.723e-01, 4.427e-02, -2.447e-01, 1.132e+00, -5.297e-01, 1.150e-01, 3.877e-01, 1.224e-01, 1.294e-01)); + r += mul(s0_5, M4(-1.023e+00, 1.567e+00, -9.747e-01, 1.051e+00, 1.537e-02, 1.993e-01, -1.679e-01, 1.139e-01, -7.358e-02, -1.782e-01, -1.938e-01, 4.419e-02, 2.001e-02, 5.881e-02, 8.971e-03, 3.368e-03)); + r += mul(s0_6, M4(-5.126e-03, 1.449e-02, -7.018e-02, 2.929e-02, 4.748e-02, -4.443e-03, -5.791e-02, -3.490e-02, 3.817e-02, 1.007e-02, -5.501e-02, -1.488e-02, -8.848e-03, 4.884e-02, -6.548e-02, 3.392e-02)); + r += mul(s0_7, M4(-4.449e-02, 7.313e-02, 3.311e-01, 3.138e-02, -6.466e-02, 5.666e-02, 1.929e-01, 8.274e-02, 3.994e-02, 2.105e-02, -1.821e-01, -1.539e-02, -9.333e-03, -4.728e-02, 6.975e-03, -3.292e-03)); + r += mul(s0_8, M4(2.038e-01, -2.356e-01, -1.987e-01, -3.746e-02, -1.499e-02, -7.007e-02, -9.546e-02, 1.905e-02, -9.802e-03, 1.990e-02, 2.140e-02, -8.164e-03, 5.109e-03, -2.081e-02, -2.386e-02, 1.183e-02)); + r += mul(s1_0, M4(-7.067e-02, -4.613e-02, -5.433e-04, -2.191e-02, -1.125e-01, -3.650e-02, -1.298e-02, -3.479e-02, -1.118e-01, -1.521e-02, -4.731e-03, -7.478e-03, 1.802e-01, 4.872e-02, -1.599e-03, -1.452e-02)); + r += mul(s1_1, M4(-2.920e-01, -1.831e-01, -1.305e-02, 4.031e-02, 1.989e-01, 3.120e-03, 2.025e-02, 5.432e-02, 2.607e-01, 2.403e-02, 1.863e-02, 8.423e-02, -3.372e-01, -1.327e-01, -1.248e-01, -1.247e-01)); + r += mul(s1_2, M4(-9.286e-02, -1.948e-01, -8.532e-03, 7.416e-03, 4.578e-02, 1.581e-01, 1.473e-03, -3.796e-02, 1.011e-01, 2.393e-01, 2.742e-02, -4.224e-02, -9.579e-03, -9.888e-02, -2.065e-03, 7.685e-03)); + r += mul(s1_3, M4(-2.056e-01, -3.479e-02, -2.666e-01, -5.344e-02, 1.579e-01, -6.091e-02, -1.655e-01, -1.575e-01, -8.230e-02, -4.748e-02, -1.304e-01, -7.186e-02, 2.953e-01, 6.950e-02, 1.865e-01, 7.567e-02)); + r += mul(s1_4, M4(3.408e-01, -1.054e-01, -2.613e-01, -6.084e-01, 3.193e-01, 6.366e-01, 4.251e-01, 4.066e-01, -3.742e-01, -8.521e-02, 5.906e-01, 1.870e-01, 2.044e-02, 2.495e-01, 1.046e-01, 3.018e-01)); + r += mul(s1_5, M4(4.748e-03, 2.086e-01, 4.231e-03, -7.764e-03, 3.933e-02, 3.446e-03, -3.431e-02, 8.415e-02, -3.798e-02, -3.428e-01, -7.206e-02, 2.392e-01, 2.157e-02, 2.692e-02, 3.313e-02, 1.841e-02)); + r += mul(s1_6, M4(1.813e-02, 2.306e-03, -3.402e-02, 1.009e-03, 4.408e-02, -2.307e-02, -3.394e-02, -3.912e-02, 3.822e-02, -1.051e-02, -1.023e-01, -4.626e-02, -4.871e-02, 6.250e-03, 1.367e-01, 3.674e-02)); + r += mul(s1_7, M4(-1.170e-02, 3.747e-02, 1.548e-01, 1.243e-01, -1.074e-01, -9.848e-03, 2.627e-01, 1.132e-01, 4.550e-02, 5.050e-02, -1.194e-01, -6.091e-02, -2.180e-02, -6.381e-02, -5.949e-02, 1.580e-02)); + r += mul(s1_8, M4(-1.146e-04, -1.852e-02, -1.515e-02, 2.488e-02, -1.877e-02, -7.739e-02, -6.812e-02, 7.656e-03, 2.688e-02, 5.650e-02, 4.285e-02, -3.270e-02, 1.163e-03, 8.328e-04, -1.998e-02, -2.282e-02)); + r += V4(-3.259e-04, -3.197e-04, 4.954e-04, 4.568e-04); + return tanh(r); +} + +void Pass6(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = (Rmp8x8(tid.x) << 1) + blockStart; + uint2 size = GetOutputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = ((gxy >> 1) + 0.5) * pt; + + V4 s0_0 = l0(-1.0, -1.0); + V4 s0_1 = l0(0.0, -1.0); + V4 s0_2 = l0(1.0, -1.0); + V4 s0_3 = l0(-1.0, 0.0); + V4 s0_4 = l0(0.0, 0.0); + V4 s0_5 = l0(1.0, 0.0); + V4 s0_6 = l0(-1.0, 1.0); + V4 s0_7 = l0(0.0, 1.0); + V4 s0_8 = l0(1.0, 1.0); + V4 s1_0 = -max(-s0_0, 0.0); + V4 s1_1 = -max(-s0_1, 0.0); + V4 s1_2 = -max(-s0_2, 0.0); + V4 s1_3 = -max(-s0_3, 0.0); + V4 s1_4 = -max(-s0_4, 0.0); + V4 s1_5 = -max(-s0_5, 0.0); + V4 s1_6 = -max(-s0_6, 0.0); + V4 s1_7 = -max(-s0_7, 0.0); + V4 s1_8 = -max(-s0_8, 0.0); + s0_0 = max(s0_0, 0.0); + s0_1 = max(s0_1, 0.0); + s0_2 = max(s0_2, 0.0); + s0_3 = max(s0_3, 0.0); + s0_4 = max(s0_4, 0.0); + s0_5 = max(s0_5, 0.0); + s0_6 = max(s0_6, 0.0); + s0_7 = max(s0_7, 0.0); + s0_8 = max(s0_8, 0.0); + + V4 r = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8); + + static const float3x3 rgb2yuv = {0.299, 0.587, 0.114, -0.169, -0.331, 0.5, 0.5, -0.419, -0.081}; + static const float3x3 yuv2rgb = {1, -0.00093, 1.401687, 1, -0.3437, -0.71417, 1, 1.77216, 0.00099}; + float2 opt = float2(GetOutputPt()); + + pos -= 0.5f * opt; + float3 yuv = mul(rgb2yuv, INPUT.SampleLevel(SL, pos, 0).rgb); + OUTPUT[gxy] = float4(mul(yuv2rgb, float3(saturate(yuv.r + r.x), yuv.yz)), 1); + + ++gxy.x; + pos.x += opt.x; + yuv = mul(rgb2yuv, INPUT.SampleLevel(SL, pos, 0).rgb); + OUTPUT[gxy] = float4(mul(yuv2rgb, float3(saturate(yuv.r + r.y), yuv.yz)), 1); + + ++gxy.y; + pos.y += opt.y; + yuv = mul(rgb2yuv, INPUT.SampleLevel(SL, pos, 0).rgb); + OUTPUT[gxy] = float4(mul(yuv2rgb, float3(saturate(yuv.r + r.w), yuv.yz)), 1); + + --gxy.x; + pos.x -= opt.x; + yuv = mul(rgb2yuv, INPUT.SampleLevel(SL, pos, 0).rgb); + OUTPUT[gxy] = float4(mul(yuv2rgb, float3(saturate(yuv.r + r.z), yuv.yz)), 1); +} diff --git a/src/Effects/CuNNy/CuNNy-4x8C-NVL-DN.hlsl b/src/Effects/CuNNy/CuNNy-4x8C-NVL-DN.hlsl new file mode 100644 index 000000000..6f6f7748f --- /dev/null +++ b/src/Effects/CuNNy/CuNNy-4x8C-NVL-DN.hlsl @@ -0,0 +1,921 @@ +// CuNNy 4x8C BILINEAR RGB NVL DN - https://github.com/cunnyplapper/CuNNy + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +//!MAGPIE EFFECT +//!VERSION 4 +//!SORT_NAME CuNNy-DN-D08N04 + +//!TEXTURE +Texture2D INPUT; + +//!TEXTURE +//!WIDTH INPUT_WIDTH * 2 +//!HEIGHT INPUT_HEIGHT * 2 +Texture2D OUTPUT; + +//!SAMPLER +//!FILTER POINT +SamplerState SP; + +//!SAMPLER +//!FILTER LINEAR +SamplerState SL; + +//!COMMON +#define O(t, p) t.SampleLevel(SP, pos + p * pt, 0) +#define V4 min16float4 +#define M4 min16float4x4 + +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +//!FORMAT R8G8B8A8_SNORM +Texture2D t0; + +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +//!FORMAT R8G8B8A8_SNORM +Texture2D t1; + +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +//!FORMAT R8G8B8A8_SNORM +Texture2D t2; + +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +//!FORMAT R8G8B8A8_SNORM +Texture2D t3; + +//!PASS 1 +//!DESC in +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 +//!IN INPUT +//!OUT t0, t1 + +#define l0(x, y) min16float((dot(float3(2.214e-01, 4.385e-01, 1.006e-01), O(INPUT, float2(x, y)).rgb) + -6.858e-01)) + +V4 f0(min16float s0_0, min16float s0_1, min16float s0_2, min16float s0_3, min16float s0_4, min16float s0_5, min16float s0_6, min16float s0_7, min16float s0_8) { + V4 r = 0.0; + r += V4(-2.401e-02, 1.817e-03, -1.218e-01, 2.796e-02) * s0_0; + r += V4(3.256e-02, 3.929e-03, -5.850e-02, -5.602e-02) * s0_1; + r += V4(4.497e-04, -1.812e-02, 5.241e-02, 3.698e-02) * s0_2; + r += V4(5.371e-01, -2.302e-01, -1.373e-01, -4.038e-03) * s0_3; + r += V4(1.565e-01, -6.067e-02, 3.397e-01, -3.741e-01) * s0_4; + r += V4(-2.095e-03, 4.044e-02, -3.770e-02, 5.665e-02) * s0_5; + r += V4(-1.993e-01, -2.645e-01, -8.892e-02, 1.948e-02) * s0_6; + r += V4(-4.865e-01, 5.400e-01, -1.396e-01, 1.270e-01) * s0_7; + r += V4(-1.667e-02, -9.433e-03, -1.324e-02, -1.803e-03) * s0_8; + r += V4(2.880e-04, 1.418e-02, 1.413e-02, -1.036e-01); + return r; +} + +V4 f1(min16float s0_0, min16float s0_1, min16float s0_2, min16float s0_3, min16float s0_4, min16float s0_5, min16float s0_6, min16float s0_7, min16float s0_8) { + V4 r = 0.0; + r += V4(-4.610e-02, -6.199e-01, 8.493e-03, -1.532e-02) * s0_0; + r += V4(-7.178e-02, 5.957e-01, 1.575e-03, 1.807e-02) * s0_1; + r += V4(1.106e-01, 3.625e-03, 3.713e-02, -4.124e-03) * s0_2; + r += V4(1.288e-01, -5.582e-02, 5.082e-02, 1.674e-02) * s0_3; + r += V4(-6.074e-01, 8.818e-02, -3.371e-01, -6.663e-01) * s0_4; + r += V4(-8.030e-02, -4.780e-03, -3.421e-01, 5.358e-02) * s0_5; + r += V4(4.990e-01, 7.623e-03, 1.778e-03, 2.401e-02) * s0_6; + r += V4(9.546e-02, -1.656e-02, 6.935e-04, 6.387e-01) * s0_7; + r += V4(-2.302e-02, 5.209e-03, 5.835e-02, -6.361e-02) * s0_8; + r += V4(-4.485e-04, -2.620e-04, 2.449e-02, -7.403e-04); + return r; +} + +void Pass1(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = Rmp8x8(tid.x) + blockStart; + uint2 size = GetInputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = (gxy + 0.5) * pt; + + min16float s0_0 = l0(-1.0, -1.0); + min16float s0_1 = l0(0.0, -1.0); + min16float s0_2 = l0(1.0, -1.0); + min16float s0_3 = l0(-1.0, 0.0); + min16float s0_4 = l0(0.0, 0.0); + min16float s0_5 = l0(1.0, 0.0); + min16float s0_6 = l0(-1.0, 1.0); + min16float s0_7 = l0(0.0, 1.0); + min16float s0_8 = l0(1.0, 1.0); + + t0[gxy] = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8); + t1[gxy] = f1(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8); +} + +//!PASS 2 +//!DESC conv1 +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 +//!IN t0, t1 +//!OUT t2, t3 + +#define l0(x, y) V4(O(t0, float2(x, y))) +#define l1(x, y) V4(O(t1, float2(x, y))) + +V4 f0(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8) { + V4 r = 0.0; + r += mul(s0_0, M4(7.103e-02, 1.495e-01, -1.731e-02, -9.952e-02, -1.539e-01, -1.103e-01, 7.099e-02, 2.023e-01, 2.681e-02, 5.202e-03, 1.954e-02, -6.822e-02, -1.650e-01, 3.710e-01, -6.020e-01, 4.879e-01)); + r += mul(s0_1, M4(-1.168e-02, 2.587e-01, -4.670e-01, -3.986e-02, -1.268e-01, 3.619e-02, 5.712e-02, 1.722e-01, 4.473e-02, -1.224e-01, 8.228e-02, -3.981e-02, 4.044e-01, -3.039e-01, -3.390e-01, 5.925e-02)); + r += mul(s0_2, M4(4.083e-02, 7.140e-02, -5.864e-01, 1.188e-01, 2.214e-01, -2.826e-01, 2.294e-01, -2.199e-01, -9.048e-02, 1.787e-01, -6.887e-02, -6.645e-02, -1.285e-01, -8.261e-02, -1.975e-01, 2.428e-01)); + r += mul(s0_3, M4(-5.801e-02, -3.381e-02, -2.285e-01, 9.377e-02, 1.878e-01, 9.285e-02, -1.001e-01, -5.059e-02, -2.155e-02, -9.098e-02, -1.279e-02, 9.801e-02, 1.178e-01, -1.967e-01, -4.792e-02, -1.106e-01)); + r += mul(s0_4, M4(3.048e-01, 2.731e-01, -2.351e-01, -1.516e-01, -1.382e-02, 1.296e-01, -9.530e-02, 2.975e-02, 2.411e-01, 2.343e-02, 1.731e-02, -2.331e-01, -2.161e-01, 4.114e-01, 4.417e-01, 1.225e+00)); + r += mul(s0_5, M4(3.337e-01, 2.844e-01, 1.065e-01, -2.391e-01, -1.265e-01, -3.625e-02, -7.062e-02, 3.529e-02, 2.208e-02, -8.459e-03, -1.366e-01, -1.563e-02, -1.648e-01, -5.919e-01, 4.061e-01, -4.975e-02)); + r += mul(s0_6, M4(6.213e-03, -2.020e-02, 2.520e-03, 2.167e-02, -2.361e-01, -1.421e-01, -4.579e-02, -1.353e-01, -2.883e-01, -5.900e-04, 2.720e-02, 1.591e-01, -5.120e-01, -4.253e-01, -3.397e-02, -4.633e-01)); + r += mul(s0_7, M4(2.456e-01, -6.978e-02, 5.668e-02, -9.795e-03, -1.925e-01, -4.841e-02, -1.273e-02, 1.282e-02, -1.223e-01, -4.080e-02, 2.975e-02, 1.595e-01, -3.345e-01, -1.504e-01, 1.080e-01, 8.549e-01)); + r += mul(s0_8, M4(8.700e-02, 1.611e-02, 8.589e-02, -3.284e-02, -1.637e-01, 2.627e-01, 1.851e-02, 2.843e-02, 1.224e-01, 6.163e-02, 4.991e-02, -1.510e-01, 1.885e-01, -5.951e-02, -3.463e-02, 2.172e-01)); + r += mul(s1_0, M4(1.856e-01, -1.041e-01, 1.900e-01, 8.420e-02, -3.223e-01, 6.258e-02, -9.766e-02, -6.517e-01, 3.066e-02, -7.562e-02, 1.015e-02, -1.139e-01, 1.569e-02, -3.684e-02, -2.813e-02, 8.835e-02)); + r += mul(s1_1, M4(-7.107e-02, -1.146e-01, 5.488e-01, -2.960e-01, 3.743e-01, -5.368e-01, -2.219e-01, -3.122e-01, 2.468e-02, -7.477e-01, 1.858e-01, 3.498e-01, 1.771e-03, 4.215e-03, 8.478e-02, 9.318e-02)); + r += mul(s1_2, M4(-2.350e-03, -3.382e-01, 5.964e-01, -2.321e-01, 2.011e-01, 1.890e-01, -2.062e-01, -3.725e-02, -1.003e-01, -1.464e-01, 1.040e-01, 9.994e-02, -7.113e-02, -3.827e-02, -1.258e-01, -1.584e-01)); + r += mul(s1_3, M4(-1.609e-01, -1.460e-01, -4.804e-03, 5.503e-02, 2.784e-01, -1.475e-02, 9.395e-02, -1.128e-01, 1.032e-02, -1.969e-01, 2.170e-01, 2.335e-01, -1.371e-01, 4.853e-02, 8.945e-03, -2.698e-01)); + r += mul(s1_4, M4(7.739e-02, -1.105e-01, 3.348e-01, 1.093e-01, -7.745e-02, -1.642e-01, -2.191e-01, -2.674e-02, 4.199e-01, -3.302e-01, 1.445e-01, -2.815e-01, -3.154e-01, 6.646e-02, 8.520e-02, -1.053e-01)); + r += mul(s1_5, M4(-4.165e-01, -8.545e-02, 2.291e-01, -1.042e-01, 3.791e-01, -7.209e-02, -6.332e-02, -3.174e-01, 1.038e-01, 8.122e-03, -9.715e-02, 6.808e-01, -9.362e-02, -4.634e-02, 5.184e-03, 1.295e-01)); + r += mul(s1_6, M4(-8.179e-02, -8.513e-02, 4.470e-02, -7.799e-02, -1.092e-01, -1.851e-01, -1.025e-01, -4.220e-02, -3.853e-01, 3.040e-02, -9.081e-02, 1.439e-01, -2.730e-02, -5.086e-02, 5.352e-03, -5.102e-03)); + r += mul(s1_7, M4(7.601e-02, -1.423e-01, 3.421e-01, 2.574e-03, 1.165e-01, 6.863e-03, 1.250e-02, -4.862e-02, -3.859e-01, -1.108e-01, 2.515e-02, 5.564e-01, 2.485e-01, 2.230e-01, -3.839e-02, 3.605e-02)); + r += mul(s1_8, M4(-9.424e-02, 1.248e-01, 1.980e-01, -1.671e-01, 1.098e-01, 6.555e-02, -7.194e-02, -1.626e-01, -1.439e-01, -2.086e-01, -1.925e-02, 1.520e-01, 2.139e-01, -7.764e-02, 6.469e-02, 7.875e-03)); + r += mul(s2_0, M4(4.572e-02, 3.661e-02, -3.845e-01, -1.383e-01, 1.729e-02, 1.780e-02, 3.664e-02, -6.961e-02, -9.001e-03, -1.853e-02, -6.735e-02, -1.864e-02, 1.695e-01, -1.420e-01, 2.679e-01, -1.525e-01)); + r += mul(s2_1, M4(9.967e-02, -2.869e-01, -2.251e-01, 8.470e-02, 3.178e-02, -9.701e-03, 9.260e-02, 4.087e-04, -8.081e-02, 1.341e-01, 5.882e-03, 1.043e-02, 8.559e-03, 6.534e-02, -4.619e-01, -3.010e-01)); + r += mul(s2_2, M4(-1.676e-02, -3.339e-01, 1.848e-01, -2.562e-01, -8.563e-02, 2.487e-02, 2.495e-01, 9.448e-02, 2.189e-02, -3.018e-02, 5.698e-02, 6.041e-02, -4.869e-02, -2.627e-02, 1.602e-01, 1.092e-01)); + r += mul(s2_3, M4(6.867e-02, -1.693e-01, -1.614e-01, -1.944e-01, 1.992e-01, 1.720e-01, 2.393e-01, 1.219e-02, 4.866e-02, -1.165e-01, -1.285e-01, 2.929e-01, 2.043e-01, -1.399e-02, 1.595e-02, -2.746e-01)); + r += mul(s2_4, M4(-4.477e-01, -5.696e-01, -1.760e-02, 1.362e-01, 1.472e-01, 3.113e-01, -2.419e-01, 8.650e-02, -8.358e-02, 1.081e-01, 3.881e-02, -1.400e-01, -2.071e-01, 3.977e-02, -3.149e-01, 2.525e-01)); + r += mul(s2_5, M4(5.496e-02, -9.963e-02, -1.227e-01, -1.892e-01, 4.361e-02, -3.776e-01, -6.576e-01, 2.628e-01, -8.215e-02, -8.123e-02, 2.248e-03, 1.261e-01, 1.193e-01, 2.608e-01, 2.567e-01, 8.120e-02)); + r += mul(s2_6, M4(-1.587e-01, -9.849e-02, 1.122e-01, -5.963e-02, -9.176e-02, 7.341e-03, 1.164e-03, -5.660e-02, 1.567e-01, -6.958e-02, -3.780e-02, 4.238e-04, -6.186e-02, 1.777e-01, 2.398e-01, 6.853e-03)); + r += mul(s2_7, M4(1.062e-01, -1.498e-01, 5.492e-02, 1.108e-01, -3.248e-01, -2.901e-01, -4.360e-01, 1.128e-01, 7.346e-02, 8.659e-02, 9.740e-02, -1.434e-01, 1.538e-01, 1.349e-01, 1.408e-01, -1.367e-01)); + r += mul(s2_8, M4(1.412e-01, -8.889e-02, 2.029e-02, -1.523e-01, 4.847e-01, -7.432e-01, -1.181e-01, 4.132e-01, 3.119e-02, -5.840e-02, -2.292e-02, -3.125e-02, 2.440e-02, 2.815e-02, 2.759e-01, -8.781e-02)); + r += mul(s3_0, M4(2.147e-02, 2.192e-01, 2.489e-01, -3.436e-02, 1.086e-02, -2.680e-02, -9.925e-02, 3.978e-02, 1.239e-01, 3.645e-02, 5.463e-01, 5.005e-01, 1.039e-01, -1.694e-01, -3.816e-02, 3.834e-01)); + r += mul(s3_1, M4(1.418e-01, 5.806e-02, 1.317e-01, 2.227e-01, 1.486e-02, -4.235e-03, -5.750e-02, -1.548e-01, -7.700e-01, 3.263e-01, -1.193e-02, 3.537e-01, -2.841e-01, 4.657e-01, -1.576e-01, -9.526e-02)); + r += mul(s3_2, M4(7.641e-02, 8.195e-01, 1.080e-01, 1.814e-01, -5.471e-02, 2.211e-02, -4.212e-02, -1.249e-02, 2.469e-02, 5.436e-01, 3.805e-01, -9.622e-02, -6.358e-02, -3.739e-01, -3.504e-01, -2.627e-01)); + r += mul(s3_3, M4(-9.359e-02, -1.830e-02, -7.015e-02, -7.774e-02, 2.286e-01, -6.321e-02, -5.124e-02, -2.799e-03, -5.063e-01, -1.835e-01, 3.716e-01, 1.130e+00, 3.259e-01, -2.045e-01, -1.792e-01, 4.892e-01)); + r += mul(s3_4, M4(-7.478e-01, -1.192e-01, 1.022e-01, 8.111e-01, 7.253e-02, 2.280e-01, -1.116e-01, -2.828e-01, -2.364e-01, -1.233e+00, -1.125e+00, 1.750e+00, -1.215e+00, 4.973e-02, 2.070e-01, 6.996e-01)); + r += mul(s3_5, M4(-4.115e-02, 3.613e-01, 2.694e-01, 4.126e-02, 7.046e-02, 6.242e-02, 9.300e-02, -1.965e-01, -3.211e-01, 8.504e-01, 2.518e-01, -5.622e-01, 5.663e-02, -1.139e-01, 1.150e-01, -1.954e-01)); + r += mul(s3_6, M4(-1.870e-01, -9.168e-02, -8.947e-02, 6.127e-03, 1.163e-02, 3.733e-04, -3.330e-01, 1.935e-01, 3.424e-01, 1.313e-01, -6.732e-01, 8.256e-02, 6.713e-02, 2.980e-02, -6.912e-02, 1.715e-01)); + r += mul(s3_7, M4(1.636e-01, 1.212e-01, 2.280e-02, 1.552e-01, -4.955e-01, 8.376e-01, 1.476e-01, 2.192e-01, 9.746e-01, -3.148e-01, 8.206e-01, -8.104e-01, -7.918e-02, -1.604e-01, 5.505e-02, 7.640e-02)); + r += mul(s3_8, M4(1.248e-01, 2.878e-01, -4.182e-02, -9.214e-02, -1.210e-01, 4.382e-01, 8.062e-02, -3.051e-01, -1.803e-01, -3.041e-01, 1.368e-01, -1.030e-01, 2.941e-02, -2.724e-01, 3.480e-02, 1.396e-02)); + r += V4(-3.046e-02, 3.515e-02, 4.880e-02, 4.740e-03); + return r; +} + +V4 f1(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8) { + V4 r = 0.0; + r += mul(s0_0, M4(1.574e-01, -6.104e-03, -2.288e-01, 5.024e-03, -2.149e-03, -8.674e-02, 1.209e-01, 7.107e-02, 1.242e-01, 2.312e-03, -5.300e-02, -2.285e-01, -8.824e-02, 7.402e-02, -4.447e-01, 1.117e+00)); + r += mul(s0_1, M4(-5.617e-02, 3.613e-01, -4.666e-01, 1.795e-01, 1.718e-01, -1.005e-01, -2.593e-01, 4.103e-01, 2.477e-01, 1.883e-01, 3.928e-02, -3.635e-01, -7.353e-01, 3.209e-01, 2.171e-01, 3.924e-01)); + r += mul(s0_2, M4(-3.304e-01, 6.332e-01, -3.898e-01, 2.704e-01, 4.110e-02, -2.786e-01, -2.513e-01, 1.800e-01, 9.402e-03, -1.975e-01, -4.040e-02, -2.047e-01, -3.239e-01, -1.623e-01, 1.001e-01, 3.053e-02)); + r += mul(s0_3, M4(3.935e-01, 5.218e-02, 4.630e-02, 2.202e-02, -2.172e-01, -1.530e-02, -1.782e-01, -9.327e-02, -6.425e-02, -2.402e-02, -2.919e-02, -4.034e-02, 6.589e-01, -4.900e-02, 7.783e-02, 6.334e-01)); + r += mul(s0_4, M4(-5.475e-02, 1.543e-01, -1.597e-01, -2.500e-01, 4.990e-02, 5.780e-02, 1.162e-01, 1.140e-01, -2.980e-01, -2.524e-02, -2.103e-01, 4.297e-01, 4.528e-01, -3.098e-01, -1.415e-01, 7.565e-01)); + r += mul(s0_5, M4(-1.097e-01, 3.376e-01, -5.685e-01, 1.347e-01, 1.155e-01, -1.396e-01, -2.840e-01, -1.373e-01, 1.442e-01, 8.711e-02, 1.357e-01, -1.110e-01, 2.095e-01, -2.901e-01, -1.007e-01, -2.473e-01)); + r += mul(s0_6, M4(-7.405e-02, 9.320e-02, -5.870e-02, -2.569e-01, 6.017e-03, -8.078e-02, -3.798e-02, 2.334e-01, 1.440e-01, -1.852e-01, -6.627e-03, 3.514e-03, -1.499e-02, -6.237e-02, 3.665e-01, 3.270e-01)); + r += mul(s0_7, M4(2.443e-01, 8.076e-02, -2.143e-01, 1.120e-01, 1.187e-01, 1.317e-01, 1.811e-01, 1.918e-01, -2.164e-02, -1.829e-01, 2.105e-01, 3.085e-01, 3.155e-01, 2.801e-01, -6.834e-01, 2.861e-01)); + r += mul(s0_8, M4(9.974e-03, 9.704e-02, -2.363e-01, 1.829e-01, 1.844e-02, 9.298e-02, -5.319e-02, -5.899e-02, -2.154e-01, 2.555e-02, -8.374e-02, 1.254e-01, -2.736e-01, -4.065e-02, 4.838e-02, 3.338e-02)); + r += mul(s1_0, M4(-1.239e-02, -1.316e-01, 8.694e-02, -8.443e-02, -1.143e-01, -6.018e-02, -9.054e-02, 7.381e-02, 2.722e-01, 1.030e-01, -8.583e-02, -4.433e-01, -1.339e-01, 1.264e-01, 8.581e-02, -1.947e-01)); + r += mul(s1_1, M4(3.030e-01, -3.527e-02, 4.665e-01, -3.372e-02, -2.301e-02, 7.308e-01, 5.938e-01, -5.901e-01, 4.766e-01, 1.081e-01, 8.809e-02, 3.482e-01, -1.938e-01, -8.091e-02, 3.649e-02, 9.321e-02)); + r += mul(s1_2, M4(1.376e-01, -4.460e-01, 4.298e-01, -4.809e-02, -3.819e-01, 5.216e-01, 2.687e-01, 1.359e-01, 2.936e-01, 1.222e-02, 3.706e-01, 2.481e-01, -4.716e-02, -1.798e-02, 2.731e-02, -7.140e-02)); + r += mul(s1_3, M4(1.657e-01, -3.624e-02, 1.541e-01, -5.006e-03, -4.051e-01, -9.782e-02, 3.008e-02, 1.962e-01, -6.146e-02, 1.866e-03, -3.052e-01, -2.202e-01, 1.057e-01, -1.151e-01, -6.310e-02, 3.914e-01)); + r += mul(s1_4, M4(-2.629e-01, 1.029e-01, 1.812e-02, -2.950e-01, -1.191e-01, 2.580e-01, -4.833e-01, 1.095e-01, 2.309e-02, 4.519e-02, 1.086e-01, 5.362e-01, -1.349e-01, -1.278e-01, 7.109e-02, -1.992e-01)); + r += mul(s1_5, M4(-1.815e-01, 2.898e-01, 3.446e-01, -1.587e-01, -6.360e-02, 1.662e-01, 5.187e-01, 1.701e-01, -2.770e-02, -5.932e-01, 2.467e-01, 3.940e-01, 1.022e-01, 1.033e-01, -5.084e-02, -6.520e-02)); + r += mul(s1_6, M4(-1.494e-01, 3.180e-02, 9.864e-02, -3.409e-01, 1.397e-02, 9.932e-03, -2.110e-01, 2.636e-01, 1.353e-01, -8.495e-02, -2.680e-03, -2.287e-01, 1.136e-01, -1.047e-01, 2.910e-02, 9.922e-02)); + r += mul(s1_7, M4(1.533e-01, 4.819e-04, 1.735e-01, 2.027e-01, 1.316e-01, 1.029e-01, 1.446e-01, 1.737e-01, 4.855e-02, 4.781e-02, 2.025e-01, 1.587e-01, 1.661e-01, 7.134e-02, 5.853e-02, -1.530e-01)); + r += mul(s1_8, M4(-1.476e-01, -4.916e-02, 1.989e-01, 1.159e-01, 4.753e-02, 1.694e-01, 4.343e-02, -6.974e-03, 3.382e-02, 2.275e-01, 3.466e-01, -7.178e-03, -1.104e-01, 2.059e-03, -7.101e-02, 8.934e-02)); + r += mul(s2_0, M4(-3.467e-01, 8.471e-04, 1.580e-01, 2.685e-01, -2.680e-02, -6.444e-02, 8.843e-02, 5.232e-03, 2.576e-02, -3.756e-02, -7.913e-03, -3.871e-02, -5.374e-02, -6.060e-02, -7.688e-02, 6.738e-01)); + r += mul(s2_1, M4(-3.963e-01, 1.295e-01, 2.623e-01, 2.565e-01, -1.831e-01, -6.054e-02, 1.817e-01, -8.944e-02, 1.974e-01, -2.800e-04, -3.964e-02, 1.232e-01, -3.477e-01, 3.791e-01, 1.438e-01, -7.862e-02)); + r += mul(s2_2, M4(2.540e-02, 1.123e-01, 6.461e-01, -3.856e-03, 3.373e-02, -5.719e-02, 1.556e-01, -1.100e-01, -3.499e-02, 9.146e-02, -4.624e-02, 9.774e-02, -1.148e-01, -2.280e-01, 4.977e-01, -1.568e-01)); + r += mul(s2_3, M4(5.352e-02, -1.293e-01, -6.991e-03, 4.190e-01, -2.334e-03, -4.433e-02, -8.470e-02, 1.162e-01, -1.045e-01, -7.444e-02, 8.951e-02, -1.124e-01, 4.295e-01, 1.086e-01, 1.336e-01, 2.645e-01)); + r += mul(s2_4, M4(-4.062e-01, -6.781e-02, 4.629e-01, -4.931e-01, -1.875e-01, 1.958e-01, -4.560e-01, -2.286e-02, -2.066e-01, 1.151e-01, -5.924e-02, 1.350e-01, -1.752e-01, 2.244e-01, -3.564e-02, -6.129e-01)); + r += mul(s2_5, M4(6.644e-02, 4.611e-01, 9.200e-02, 6.845e-03, -1.628e-02, 8.352e-02, -1.119e-01, -4.386e-02, -5.822e-02, -4.769e-02, -3.224e-02, -1.235e-01, -3.296e-01, 5.835e-03, 2.231e-01, 5.535e-02)); + r += mul(s2_6, M4(-2.961e-02, -5.230e-02, 5.124e-02, 6.542e-02, 2.004e-01, 1.189e-01, -1.797e-01, -1.535e-02, 6.469e-02, 1.134e-01, -1.204e-04, -7.606e-02, 2.436e-02, -1.630e-02, 1.841e-01, -2.529e-01)); + r += mul(s2_7, M4(-1.147e-02, 3.246e-02, 7.626e-02, -1.013e-01, 1.075e-01, 5.871e-01, -5.227e-01, -3.076e-01, 1.609e-01, 5.768e-02, -1.912e-02, 5.898e-02, -7.530e-02, -1.307e-01, 5.828e-02, -1.456e-02)); + r += mul(s2_8, M4(-7.053e-02, 8.728e-02, 1.211e-01, 1.410e-01, -2.160e-01, 9.970e-02, -5.345e-01, 1.141e-01, 8.112e-04, -4.348e-02, 9.858e-02, 2.780e-02, -1.116e-01, -2.331e-01, 1.545e-01, 7.984e-02)); + r += mul(s3_0, M4(-5.412e-02, 6.012e-03, -2.395e-01, -1.209e-02, -5.734e-02, 3.058e-02, -7.202e-02, -7.514e-02, 7.241e-03, -1.702e-01, 1.020e+00, 2.997e-01, -2.173e-01, 4.518e-02, -2.703e-02, -4.087e-02)); + r += mul(s3_1, M4(-5.670e-02, -9.713e-03, -2.091e-01, -1.621e-01, -5.370e-03, -5.579e-02, 1.042e-01, 2.220e-02, 4.788e-01, -6.623e-01, 5.548e-01, 8.186e-01, 2.462e-01, -7.624e-01, -9.065e-02, -1.105e-02)); + r += mul(s3_2, M4(4.043e-02, -1.577e-01, -3.166e-01, -1.256e-01, -9.515e-02, -8.852e-02, -4.960e-02, 1.129e-01, 1.690e-01, 2.314e-01, -5.134e-01, 9.584e-02, -3.085e-02, 2.399e-01, -3.381e-01, -7.233e-02)); + r += mul(s3_3, M4(1.750e-01, -9.450e-02, -2.230e-01, 4.190e-01, 8.900e-02, 2.306e-02, 2.783e-01, -3.295e-01, 2.697e+00, 8.855e-02, 5.728e-01, -8.682e-01, 6.085e-02, 5.010e-02, 1.343e-01, 1.137e-01)); + r += mul(s3_4, M4(9.857e-02, 3.310e-01, -3.584e-01, -5.586e-01, 5.751e-01, -4.023e-01, 3.838e-01, 1.240e-01, -1.482e-01, -1.233e-01, -5.953e-01, 1.534e+00, 3.390e-01, -2.022e-02, 1.619e-01, -2.959e-01)); + r += mul(s3_5, M4(1.528e-01, 1.593e-01, -1.886e-01, 2.281e-02, 2.174e-01, -8.846e-01, 5.726e-02, 7.369e-03, -1.490e-01, 3.377e-01, -4.669e-02, 1.206e-01, -1.251e-01, 2.600e-01, -2.439e-01, 2.067e-01)); + r += mul(s3_6, M4(4.090e-02, -2.118e-02, -9.012e-02, -8.624e-03, 1.464e-01, 6.929e-02, 1.492e-01, -4.039e-01, 6.123e-01, 2.679e-01, -2.284e-01, -3.609e-01, -6.598e-02, 1.341e-01, -2.371e-02, -2.899e-01)); + r += mul(s3_7, M4(5.189e-02, -3.928e-02, 1.670e-01, -1.536e-01, 5.066e-01, -3.768e-01, 6.577e-01, 1.140e-01, -1.537e-01, -1.941e-01, -9.152e-02, -3.571e-02, 1.068e-01, 4.803e-02, -3.180e-01, 4.361e-02)); + r += mul(s3_8, M4(-8.453e-02, -1.454e-02, 3.613e-02, 8.974e-03, -1.258e-01, -5.842e-01, 3.264e-01, 2.910e-01, 1.306e-01, 4.552e-01, 4.524e-01, 1.065e-02, -1.792e-02, 1.875e-02, -2.206e-01, 2.028e-01)); + r += V4(3.015e-03, -4.690e-02, 3.573e-02, -1.486e-02); + return r; +} + +void Pass2(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = Rmp8x8(tid.x) + blockStart; + uint2 size = GetInputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = (gxy + 0.5) * pt; + + V4 s0_0 = l0(-1.0, -1.0); + V4 s0_1 = l0(0.0, -1.0); + V4 s0_2 = l0(1.0, -1.0); + V4 s0_3 = l0(-1.0, 0.0); + V4 s0_4 = l0(0.0, 0.0); + V4 s0_5 = l0(1.0, 0.0); + V4 s0_6 = l0(-1.0, 1.0); + V4 s0_7 = l0(0.0, 1.0); + V4 s0_8 = l0(1.0, 1.0); + V4 s1_0 = -max(-s0_0, 0.0); + V4 s1_1 = -max(-s0_1, 0.0); + V4 s1_2 = -max(-s0_2, 0.0); + V4 s1_3 = -max(-s0_3, 0.0); + V4 s1_4 = -max(-s0_4, 0.0); + V4 s1_5 = -max(-s0_5, 0.0); + V4 s1_6 = -max(-s0_6, 0.0); + V4 s1_7 = -max(-s0_7, 0.0); + V4 s1_8 = -max(-s0_8, 0.0); + s0_0 = max(s0_0, 0.0); + s0_1 = max(s0_1, 0.0); + s0_2 = max(s0_2, 0.0); + s0_3 = max(s0_3, 0.0); + s0_4 = max(s0_4, 0.0); + s0_5 = max(s0_5, 0.0); + s0_6 = max(s0_6, 0.0); + s0_7 = max(s0_7, 0.0); + s0_8 = max(s0_8, 0.0); + + V4 s2_0 = l1(-1.0, -1.0); + V4 s2_1 = l1(0.0, -1.0); + V4 s2_2 = l1(1.0, -1.0); + V4 s2_3 = l1(-1.0, 0.0); + V4 s2_4 = l1(0.0, 0.0); + V4 s2_5 = l1(1.0, 0.0); + V4 s2_6 = l1(-1.0, 1.0); + V4 s2_7 = l1(0.0, 1.0); + V4 s2_8 = l1(1.0, 1.0); + V4 s3_0 = -max(-s2_0, 0.0); + V4 s3_1 = -max(-s2_1, 0.0); + V4 s3_2 = -max(-s2_2, 0.0); + V4 s3_3 = -max(-s2_3, 0.0); + V4 s3_4 = -max(-s2_4, 0.0); + V4 s3_5 = -max(-s2_5, 0.0); + V4 s3_6 = -max(-s2_6, 0.0); + V4 s3_7 = -max(-s2_7, 0.0); + V4 s3_8 = -max(-s2_8, 0.0); + s2_0 = max(s2_0, 0.0); + s2_1 = max(s2_1, 0.0); + s2_2 = max(s2_2, 0.0); + s2_3 = max(s2_3, 0.0); + s2_4 = max(s2_4, 0.0); + s2_5 = max(s2_5, 0.0); + s2_6 = max(s2_6, 0.0); + s2_7 = max(s2_7, 0.0); + s2_8 = max(s2_8, 0.0); + + t2[gxy] = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8); + t3[gxy] = f1(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8); +} + +//!PASS 3 +//!DESC conv2 +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 +//!IN t2, t3 +//!OUT t0, t1 + +#define l0(x, y) V4(O(t2, float2(x, y))) +#define l1(x, y) V4(O(t3, float2(x, y))) + +V4 f0(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8) { + V4 r = 0.0; + r += mul(s0_0, M4(8.130e-02, -1.243e-01, -7.648e-02, -2.424e-01, -4.742e-02, -5.420e-02, 4.117e-02, 1.568e-01, -3.621e-02, 2.032e-01, 4.484e-02, 1.249e-02, -1.505e-01, 7.294e-02, 4.943e-02, -6.336e-02)); + r += mul(s0_1, M4(-1.474e-01, -3.366e-01, -5.670e-01, 4.113e-02, -1.260e-01, -1.539e-01, -5.421e-02, 1.779e-01, -1.072e-01, 1.209e-01, 4.423e-02, 2.454e-01, -5.430e-02, -1.442e-01, -1.501e-02, -4.731e-02)); + r += mul(s0_2, M4(6.444e-02, 1.509e-01, 1.452e-01, -2.840e-02, 9.365e-02, 2.016e-01, 1.002e-01, -3.226e-02, -1.186e-01, 1.535e-01, -1.652e-01, -1.104e-02, 4.170e-02, -4.404e-02, 1.189e-01, 1.007e-02)); + r += mul(s0_3, M4(-4.618e-02, 1.024e-01, -1.723e-01, -1.354e-01, 1.981e-01, -1.992e-01, 1.670e-01, 3.857e-01, -6.927e-03, 9.087e-02, 1.176e-01, 3.314e-01, 9.860e-02, 4.009e-04, 1.061e-01, -6.930e-02)); + r += mul(s0_4, M4(4.923e-01, -9.248e-02, 8.616e-03, 4.541e-02, -1.148e-01, 3.990e-03, -3.218e-02, 8.942e-02, 3.219e-02, -9.786e-02, 6.813e-02, 2.492e-01, -3.165e-01, 6.925e-02, -9.826e-02, 4.518e-01)); + r += mul(s0_5, M4(2.222e-02, 1.046e-01, -2.327e-02, -7.823e-02, 3.540e-01, 3.363e-01, -4.089e-02, 1.292e-02, -2.530e-01, 4.606e-01, -6.191e-02, -3.673e-02, -2.764e-01, -1.360e-01, -2.947e-03, 2.534e-02)); + r += mul(s0_6, M4(-2.067e-02, -1.566e-01, -8.968e-02, 1.386e-03, -8.841e-02, -1.077e-01, 1.646e-01, 1.987e-01, -3.098e-01, 2.764e-01, 1.935e-01, 1.847e-01, 1.116e-01, -1.514e-01, -5.175e-02, 8.710e-02)); + r += mul(s0_7, M4(1.266e-02, -2.119e-01, -1.610e-01, -6.512e-02, -1.679e-01, 2.247e-01, -5.854e-02, 1.200e-02, -1.406e-01, 4.393e-01, -8.517e-02, 3.281e-02, -1.177e-01, -1.861e-01, -3.241e-01, -2.918e-02)); + r += mul(s0_8, M4(-3.015e-02, -1.605e-01, -1.001e-01, 7.795e-03, -5.873e-02, -7.686e-02, -1.448e-01, -1.851e-02, -2.172e-01, 1.977e-01, -1.333e-01, -8.894e-02, -8.939e-03, 1.675e-01, -7.976e-03, 4.020e-02)); + r += mul(s1_0, M4(1.165e-01, -4.833e-02, 4.750e-02, -4.032e-02, -2.287e-02, -4.825e-02, 9.058e-02, 2.136e-01, 1.009e-01, -2.133e-02, 4.162e-02, -6.816e-02, -9.863e-02, -4.160e-03, -2.467e-02, -9.096e-02)); + r += mul(s1_1, M4(8.597e-02, -2.205e-01, 1.515e-01, -2.918e-02, -1.099e-01, -4.171e-02, 3.893e-04, -5.273e-03, -2.046e-02, -3.905e-03, 7.793e-04, 5.930e-02, 2.653e-02, -2.546e-01, -8.456e-02, -6.554e-02)); + r += mul(s1_2, M4(-1.058e-01, 3.302e-01, 1.812e-01, 6.427e-02, -4.601e-02, -1.589e-02, 4.405e-02, -1.366e-02, -5.996e-03, -5.402e-04, 3.237e-02, -5.725e-02, -7.486e-02, 1.358e-01, 4.739e-02, -2.432e-02)); + r += mul(s1_3, M4(3.333e-02, 5.179e-01, -1.939e-03, 7.798e-02, 2.011e-02, -2.959e-01, 1.135e-01, 3.122e-01, 8.651e-02, -2.708e-02, 7.183e-03, 4.554e-02, -3.342e-02, 9.136e-03, -7.067e-02, -1.867e-01)); + r += mul(s1_4, M4(6.231e-01, 9.512e-01, 3.523e-01, 3.744e-01, 2.388e-01, -2.827e-01, 9.968e-02, -5.306e-02, -4.498e-02, -2.222e-01, -5.865e-02, 2.967e-02, -3.029e-01, -2.137e-01, -5.363e-01, 8.872e-02)); + r += mul(s1_5, M4(-4.862e-02, 7.326e-01, 1.354e-01, 5.607e-02, 1.667e-01, -1.184e-01, -1.304e-01, 6.817e-02, 3.287e-02, 3.310e-01, 1.521e-01, -3.212e-02, -8.947e-02, 4.250e-02, -9.770e-02, -8.344e-02)); + r += mul(s1_6, M4(-9.242e-04, 4.835e-03, 1.322e-01, 3.745e-02, 9.613e-02, -8.310e-03, 4.718e-02, 2.763e-02, -1.616e-02, 6.167e-02, -3.382e-02, 3.624e-02, 1.213e-02, -2.014e-01, -2.776e-03, 4.360e-02)); + r += mul(s1_7, M4(-6.861e-02, 4.772e-02, -3.779e-02, 7.567e-02, -8.548e-02, -1.028e-02, 1.881e-02, 2.421e-03, 1.378e-01, 1.305e-01, 2.177e-02, -1.118e-03, 5.861e-02, -1.416e-01, -3.140e-01, -9.031e-02)); + r += mul(s1_8, M4(-4.147e-02, 1.546e-01, 5.650e-02, 4.098e-02, -1.460e-01, -5.779e-02, -1.959e-02, -2.318e-02, 3.538e-02, -5.044e-02, 3.304e-02, -3.517e-03, -1.176e-01, -3.185e-01, -1.738e-01, -4.349e-02)); + r += mul(s2_0, M4(-3.428e-03, 6.059e-02, 7.024e-02, 2.739e-02, 1.313e-02, -5.748e-02, 9.005e-03, -7.139e-03, 1.165e-01, -1.541e-01, 1.493e-01, 2.725e-01, 3.254e-02, -2.934e-02, 1.115e-02, -2.844e-02)); + r += mul(s2_1, M4(-8.601e-03, -3.177e-03, 1.878e-01, 1.106e-01, 1.951e-02, 8.194e-02, 4.971e-02, 5.805e-02, 2.515e-02, -2.529e-01, -2.250e-01, 3.498e-02, 7.183e-02, -8.617e-02, -8.616e-02, 1.623e-01)); + r += mul(s2_2, M4(-8.072e-02, -1.234e-01, 3.482e-02, -2.873e-02, -4.049e-02, 4.828e-03, 1.940e-02, 3.828e-02, -5.156e-03, 4.585e-03, 2.326e-02, 2.346e-02, -8.908e-02, -1.384e-03, -2.366e-02, 1.290e-02)); + r += mul(s2_3, M4(4.921e-02, 1.726e-01, 3.832e-02, -2.490e-01, -1.152e-01, -1.722e-01, -1.705e-01, 4.228e-01, -8.215e-02, -1.478e-02, 1.554e-01, 3.701e-01, -8.863e-02, 1.068e-01, 8.890e-03, 6.324e-02)); + r += mul(s2_4, M4(1.307e-01, 2.312e-01, -1.734e-01, 2.083e-02, -1.966e-01, -3.991e-01, -8.681e-02, 1.976e-03, -3.177e-01, 1.528e-01, -2.329e-01, 2.569e-01, -6.230e-03, 6.020e-02, 4.969e-02, -2.039e-01)); + r += mul(s2_5, M4(1.660e-01, 1.642e-02, 7.203e-02, -1.613e-01, 6.225e-02, 6.470e-02, 3.305e-03, 2.230e-02, -2.455e-02, 6.599e-02, -1.740e-01, 7.887e-02, 3.463e-03, 1.003e-01, -1.850e-01, 7.885e-02)); + r += mul(s2_6, M4(-2.170e-02, 1.372e-01, 7.445e-02, -9.419e-02, -1.851e-01, 4.957e-02, -2.454e-01, 5.879e-02, -5.800e-02, -1.122e-01, 7.445e-02, 1.190e-01, 2.695e-02, -5.701e-02, -5.166e-02, -5.058e-02)); + r += mul(s2_7, M4(5.390e-01, 1.674e-01, 1.213e-01, -1.147e-01, -6.939e-02, -1.218e-01, -2.891e-01, 2.682e-02, -2.636e-01, -1.104e-01, -1.556e-01, 3.774e-02, -4.121e-02, -2.431e-01, -1.248e-01, 1.275e-01)); + r += mul(s2_8, M4(1.053e-01, 2.238e-01, -1.104e-01, 5.372e-02, 6.179e-02, -2.431e-03, -4.843e-02, 3.820e-02, -7.539e-02, 7.898e-02, 7.562e-03, 1.596e-02, 7.298e-02, -1.553e-01, -3.545e-01, 1.990e-02)); + r += mul(s3_0, M4(8.232e-02, -6.815e-02, -7.421e-02, -3.191e-02, -1.592e-01, 2.814e-01, 5.009e-02, 3.669e-02, -5.908e-02, -5.445e-02, 4.873e-02, 1.538e-01, 1.065e-01, -2.194e-01, -2.612e-02, -2.297e-02)); + r += mul(s3_1, M4(1.431e-02, -7.835e-02, -2.790e-03, 9.305e-02, -2.975e-01, 1.527e-01, 1.888e-01, -1.279e-02, -1.938e-02, -1.022e-01, -2.197e-02, -2.919e-02, 2.192e-01, -8.056e-02, 1.328e-03, 3.478e-02)); + r += mul(s3_2, M4(4.920e-03, -6.286e-02, -7.779e-02, 1.075e-01, -1.092e-01, 2.909e-01, 3.056e-01, -9.017e-02, -3.625e-02, 1.079e-01, 1.107e-01, 6.613e-02, 1.696e-01, -1.852e-01, -1.253e-01, -9.675e-02)); + r += mul(s3_3, M4(-6.350e-02, 1.137e-01, -3.559e-02, -1.684e-01, -2.044e-01, -9.368e-02, 2.283e-01, 8.052e-01, 4.476e-03, -1.599e-01, 2.594e-02, 1.582e-01, -2.483e-02, 9.216e-02, 5.719e-02, 2.237e-01)); + r += mul(s3_4, M4(-1.694e-01, 1.597e-01, -3.311e-01, 1.880e-01, 2.614e-01, -2.584e-01, 5.296e-02, 9.726e-02, -3.932e-02, -7.518e-02, -1.749e-01, 1.604e-01, 1.008e-01, 2.920e-01, 5.358e-01, -6.383e-01)); + r += mul(s3_5, M4(-2.706e-01, -2.716e-01, -4.196e-01, 1.023e-01, 2.201e-01, -1.412e-01, 1.003e-01, -6.972e-02, 3.727e-02, -8.424e-02, -7.870e-02, 2.294e-02, 2.836e-01, -4.165e-01, -2.974e-01, -3.567e-02)); + r += mul(s3_6, M4(-3.434e-02, 6.420e-02, -8.729e-02, -8.600e-02, -2.041e-01, 1.646e-02, 9.025e-02, 1.724e-01, -4.951e-02, -3.894e-02, -7.985e-02, 1.580e-02, 2.554e-01, -3.100e-01, -2.769e-01, 8.336e-05)); + r += mul(s3_7, M4(-6.557e-02, 3.865e-02, -3.263e-02, 4.621e-02, -2.077e-01, 2.705e-02, -3.354e-01, 1.480e-01, 4.155e-02, -2.143e-01, -2.626e-01, 1.091e-02, 1.382e-01, -1.706e-01, -1.355e-01, -7.700e-02)); + r += mul(s3_8, M4(-2.004e-01, 4.575e-01, -1.812e-01, 6.102e-02, 3.469e-01, -6.634e-02, 1.302e-01, -9.621e-02, 4.023e-02, 1.048e-01, -9.194e-02, 5.130e-03, 4.272e-01, -5.971e-01, -2.025e-01, -1.364e-01)); + r += V4(3.575e-03, 3.041e-03, 1.241e-02, -2.230e-03); + return r; +} + +V4 f1(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-1.437e-01, -9.784e-02, 2.649e-01, -8.638e-02, -1.746e-01, 2.031e-01, 1.203e-01, -8.812e-02, -2.317e-01, 2.311e-01, 3.171e-02, -3.619e-02, -7.798e-02, -2.507e-02, 1.902e-01, 5.780e-02)); + r += mul(s0_1, M4(2.504e-01, 1.577e-01, -5.397e-02, 4.599e-01, -1.392e-01, 2.560e-01, 1.018e-01, 7.968e-02, 2.247e-01, -2.962e-03, 1.421e-03, -1.201e-01, -3.622e-01, 1.378e-01, 1.392e-01, 1.641e-01)); + r += mul(s0_2, M4(-6.143e-02, -6.336e-02, 1.131e-01, 6.811e-02, -5.817e-02, 7.362e-02, 1.407e-01, 1.823e-02, 4.880e-01, -2.282e-01, -2.704e-01, -4.287e-01, -2.741e-01, 3.163e-02, 1.098e-01, 1.514e-01)); + r += mul(s0_3, M4(1.794e-01, 1.720e-01, -4.092e-01, 1.277e-01, -1.938e-01, 3.107e-01, 2.915e-01, 2.279e-01, 2.259e-01, 2.136e-01, 5.867e-02, 2.359e-01, -1.589e-01, 1.132e-01, 6.871e-02, 2.837e-01)); + r += mul(s0_4, M4(-3.070e-01, -4.494e-01, 5.817e-02, 5.153e-01, 5.215e-01, 5.410e-01, 1.286e-01, -5.596e-01, 4.287e-01, 1.821e-01, 1.542e-01, 3.755e-01, 3.820e-01, 2.953e-01, -2.768e-01, -6.977e-02)); + r += mul(s0_5, M4(-4.881e-02, 2.327e-02, 9.209e-02, -2.102e-02, -1.394e-01, -8.093e-03, 2.263e-01, -4.307e-01, 1.998e-01, -8.793e-02, -1.057e-01, -1.899e-01, 1.577e-01, 3.435e-01, 6.721e-02, 3.093e-01)); + r += mul(s0_6, M4(7.516e-02, -1.224e-01, 1.257e-02, -6.769e-02, -8.618e-02, 1.283e-01, 2.060e-01, -1.966e-01, 8.166e-02, -1.263e-01, -2.269e-01, -3.272e-01, -3.439e-02, -2.849e-01, 2.105e-01, -3.015e-03)); + r += mul(s0_7, M4(7.447e-02, -8.731e-02, 2.804e-02, -4.819e-02, -3.311e-01, 3.824e-01, 7.766e-02, 5.672e-02, 4.014e-01, -4.037e-03, 2.287e-01, 5.626e-02, 3.481e-01, -1.010e-01, -1.156e-01, -2.865e-01)); + r += mul(s0_8, M4(5.454e-02, -5.590e-02, 3.408e-02, 3.551e-03, 1.262e-02, 8.638e-02, 1.222e-01, 3.418e-01, -2.154e-01, 1.868e-01, 1.210e-01, -2.330e-01, -4.810e-02, -5.190e-02, -8.587e-02, -2.145e-01)); + r += mul(s1_0, M4(-3.063e-01, -1.830e-02, 5.167e-01, 4.813e-02, -7.310e-02, 1.443e-01, 1.654e-01, 1.158e-01, 4.789e-02, -3.030e-02, -1.358e-01, 2.986e-02, -4.855e-02, -7.736e-02, 4.514e-01, -1.797e-02)); + r += mul(s1_1, M4(4.322e-01, -1.369e-01, 9.431e-02, 3.921e-01, 2.708e-02, -1.218e-02, -9.091e-02, 1.871e-01, 3.763e-02, -9.213e-02, -1.209e-01, -1.587e-01, 3.014e-03, 1.816e-01, 3.099e-01, 3.210e-01)); + r += mul(s1_2, M4(-7.234e-02, 1.685e-02, 4.444e-01, -1.886e-01, -9.543e-03, 3.966e-02, 1.105e-01, 4.870e-02, 9.471e-02, -5.263e-02, -1.085e-01, 4.226e-02, -1.565e-01, -3.812e-02, 1.708e-01, 1.457e-01)); + r += mul(s1_3, M4(2.370e-01, -3.354e-02, -9.648e-02, 1.531e-01, -3.468e-01, -3.957e-02, 3.152e-01, 3.402e-02, 3.762e-02, 9.507e-02, 7.836e-02, 9.088e-03, -1.614e-01, 4.377e-02, 4.748e-02, 1.055e-01)); + r += mul(s1_4, M4(2.342e-01, -5.059e-01, 2.781e-01, 2.906e-01, 1.656e-01, 1.268e-01, 1.183e-01, -2.458e-02, 2.290e-01, 1.779e-01, -8.310e-02, 1.389e-01, 7.282e-02, 1.050e-01, -3.525e-01, 6.810e-02)); + r += mul(s1_5, M4(1.078e-01, -4.451e-02, 7.031e-02, -2.977e-01, 3.596e-02, 3.359e-02, 9.589e-03, 9.070e-02, -1.862e-01, -1.863e-01, -9.652e-02, -5.039e-02, 1.004e-01, 1.598e-01, 1.466e-01, 2.349e-01)); + r += mul(s1_6, M4(1.109e-02, -1.607e-01, 1.578e-02, -1.971e-01, 5.020e-02, -7.597e-02, 7.238e-02, 7.241e-02, 2.025e-02, -2.246e-02, 4.652e-02, -8.760e-02, -1.111e-02, 1.890e-02, 1.046e-01, -2.233e-03)); + r += mul(s1_7, M4(1.252e-01, -8.046e-02, -1.321e-01, -3.724e-01, -1.383e-01, 1.151e-01, 5.397e-02, -1.422e-01, 8.319e-02, 9.089e-02, -2.620e-02, 1.662e-01, 2.847e-02, -1.255e-01, 6.933e-02, -1.636e-01)); + r += mul(s1_8, M4(-1.517e-01, 3.661e-02, -3.135e-01, -3.395e-01, -1.139e-01, 1.973e-01, 8.547e-03, -3.118e-02, -8.869e-02, -1.209e-01, 1.867e-02, -4.531e-02, 1.016e-01, -6.909e-02, 1.436e-01, 1.663e-01)); + r += mul(s2_0, M4(-9.314e-02, 1.395e-02, -1.741e-02, -7.208e-02, -5.164e-02, -5.743e-02, 5.702e-02, 1.342e-01, 6.011e-03, 1.626e-01, 1.101e-01, -1.130e-01, 6.127e-02, -8.956e-03, -7.149e-02, -6.488e-03)); + r += mul(s2_1, M4(-2.534e-01, 1.086e-01, -1.007e-01, -3.067e-02, -1.074e-01, 7.219e-03, 6.768e-02, -1.012e-01, 2.019e-01, 4.263e-03, -7.411e-02, -1.173e-01, 1.961e-01, -5.619e-02, -2.390e-01, -1.323e-01)); + r += mul(s2_2, M4(-1.039e-01, -9.899e-02, -2.206e-01, -2.187e-01, -8.739e-03, 6.607e-02, 4.125e-02, 5.363e-02, -6.572e-03, 3.014e-02, 1.314e-01, -9.560e-02, 2.106e-01, 1.237e-02, -8.354e-02, -4.939e-03)); + r += mul(s2_3, M4(-4.682e-02, -1.357e-01, 3.481e-02, -2.187e-01, 1.113e-01, 8.812e-02, -1.211e-01, -2.011e-02, 1.567e-01, -2.216e-02, -4.920e-03, -2.458e-01, 2.263e-02, 6.741e-02, -1.234e-02, 2.338e-02)); + r += mul(s2_4, M4(5.105e-02, -3.845e-01, 1.812e-01, -1.927e-01, 2.840e-01, -2.094e-01, 5.673e-02, 4.405e-02, 5.957e-01, 1.734e-02, -1.158e-01, -6.956e-01, -2.077e-01, 5.130e-03, 4.744e-01, -1.540e-02)); + r += mul(s2_5, M4(1.601e-01, -2.680e-01, -1.678e-01, -1.207e-01, -4.648e-02, -6.454e-02, 1.122e-01, -6.567e-02, 1.638e-01, -1.259e-01, -2.470e-02, -3.547e-01, -1.333e-01, -1.219e-02, -7.710e-02, -3.881e-01)); + r += mul(s2_6, M4(-6.060e-02, 1.662e-01, -2.082e-01, 3.193e-01, -1.317e-01, 1.395e-04, 2.436e-01, -1.480e-01, 6.104e-03, -2.009e-01, -6.729e-02, -2.207e-01, -7.784e-02, -7.589e-02, 7.569e-02, 3.261e-03)); + r += mul(s2_7, M4(-2.951e-01, -2.050e-01, 2.827e-02, 3.739e-01, 1.947e-01, 5.411e-01, -2.262e-01, -8.808e-03, 2.262e-01, -9.010e-02, -1.476e-01, -3.582e-01, -1.718e-01, 2.844e-02, 7.832e-02, 1.414e-03)); + r += mul(s2_8, M4(3.534e-01, 1.695e-01, -1.247e-01, 4.750e-01, 4.171e-02, 2.338e-02, -4.525e-02, -4.955e-02, 2.934e-01, -3.865e-02, -1.125e-01, -2.127e-01, 1.326e-01, 5.967e-02, 6.215e-02, 1.048e-01)); + r += mul(s3_0, M4(4.186e-02, -5.378e-02, 7.641e-02, -3.524e-02, -2.447e-01, -5.374e-02, -1.380e-01, -4.221e-01, -3.797e-02, -7.623e-03, -4.826e-02, 1.791e-02, -1.390e-01, 1.115e-01, 2.252e-01, -9.103e-03)); + r += mul(s3_1, M4(1.339e-01, 3.093e-01, -3.615e-02, 8.684e-02, -4.098e-01, -1.216e-01, 2.372e-01, -1.247e-01, -5.358e-02, -1.660e-01, -8.435e-02, 3.871e-02, 2.722e-01, -1.145e-01, -3.944e-01, -5.003e-02)); + r += mul(s3_2, M4(-4.430e-02, -3.135e-02, 1.019e-01, -1.129e-01, -2.647e-01, -1.317e-01, 8.715e-02, -5.466e-02, -3.946e-02, 7.216e-02, 1.677e-01, 9.349e-02, 8.069e-02, -1.097e-01, -9.659e-03, -8.460e-02)); + r += mul(s3_3, M4(-5.036e-03, 4.992e-02, 1.086e-01, -1.339e-02, 2.792e-01, 3.294e-01, -1.578e-01, 4.592e-01, -7.749e-02, 4.384e-02, -4.212e-02, 2.287e-02, 1.456e-01, 4.774e-02, -1.264e-01, 7.437e-02)); + r += mul(s3_4, M4(3.022e-01, -2.197e-01, -4.347e-02, -2.198e-01, 3.922e-02, 8.609e-02, 8.862e-02, 3.418e-01, 8.117e-02, -2.026e-02, -3.236e-01, -2.539e-01, -6.030e-02, -2.409e-01, 7.879e-02, -8.457e-02)); + r += mul(s3_5, M4(3.525e-01, 2.622e-01, -4.994e-02, -1.932e-01, -1.508e-01, 1.229e-01, 1.359e-01, 1.613e-01, 1.830e-01, -4.473e-02, -5.438e-02, -1.041e-01, 4.534e-01, -4.660e-01, -7.405e-02, -1.001e-01)); + r += mul(s3_6, M4(-1.224e-02, -5.840e-03, 8.031e-02, -2.279e-02, -2.128e-01, 1.477e-01, -9.937e-03, 4.142e-02, -3.726e-02, -1.013e-01, -2.940e-03, -1.333e-01, 1.353e-01, -2.192e-01, -3.858e-01, -1.100e-01)); + r += mul(s3_7, M4(-8.882e-02, 1.341e-01, 2.707e-01, 2.212e-01, 2.628e-01, 3.454e-01, -3.703e-01, 4.902e-01, 1.527e-01, 8.567e-03, -1.742e-01, -1.884e-01, -7.710e-01, 1.028e-01, 3.233e-01, -3.897e-01)); + r += mul(s3_8, M4(3.715e-02, 2.936e-01, -1.195e-01, -1.295e-01, -1.313e-01, -1.222e-01, -2.876e-01, 5.694e-02, 6.813e-02, -1.738e-02, -1.154e-01, 1.649e-02, 1.755e-01, -1.639e-01, 3.212e-02, 3.504e-01)); + r += V4(-8.611e-03, -6.529e-03, -1.098e-03, 4.669e-03); + return r; +} + +void Pass3(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = Rmp8x8(tid.x) + blockStart; + uint2 size = GetInputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = (gxy + 0.5) * pt; + + V4 s0_0 = l0(-1.0, -1.0); + V4 s0_1 = l0(0.0, -1.0); + V4 s0_2 = l0(1.0, -1.0); + V4 s0_3 = l0(-1.0, 0.0); + V4 s0_4 = l0(0.0, 0.0); + V4 s0_5 = l0(1.0, 0.0); + V4 s0_6 = l0(-1.0, 1.0); + V4 s0_7 = l0(0.0, 1.0); + V4 s0_8 = l0(1.0, 1.0); + V4 s1_0 = -max(-s0_0, 0.0); + V4 s1_1 = -max(-s0_1, 0.0); + V4 s1_2 = -max(-s0_2, 0.0); + V4 s1_3 = -max(-s0_3, 0.0); + V4 s1_4 = -max(-s0_4, 0.0); + V4 s1_5 = -max(-s0_5, 0.0); + V4 s1_6 = -max(-s0_6, 0.0); + V4 s1_7 = -max(-s0_7, 0.0); + V4 s1_8 = -max(-s0_8, 0.0); + s0_0 = max(s0_0, 0.0); + s0_1 = max(s0_1, 0.0); + s0_2 = max(s0_2, 0.0); + s0_3 = max(s0_3, 0.0); + s0_4 = max(s0_4, 0.0); + s0_5 = max(s0_5, 0.0); + s0_6 = max(s0_6, 0.0); + s0_7 = max(s0_7, 0.0); + s0_8 = max(s0_8, 0.0); + + V4 s2_0 = l1(-1.0, -1.0); + V4 s2_1 = l1(0.0, -1.0); + V4 s2_2 = l1(1.0, -1.0); + V4 s2_3 = l1(-1.0, 0.0); + V4 s2_4 = l1(0.0, 0.0); + V4 s2_5 = l1(1.0, 0.0); + V4 s2_6 = l1(-1.0, 1.0); + V4 s2_7 = l1(0.0, 1.0); + V4 s2_8 = l1(1.0, 1.0); + V4 s3_0 = -max(-s2_0, 0.0); + V4 s3_1 = -max(-s2_1, 0.0); + V4 s3_2 = -max(-s2_2, 0.0); + V4 s3_3 = -max(-s2_3, 0.0); + V4 s3_4 = -max(-s2_4, 0.0); + V4 s3_5 = -max(-s2_5, 0.0); + V4 s3_6 = -max(-s2_6, 0.0); + V4 s3_7 = -max(-s2_7, 0.0); + V4 s3_8 = -max(-s2_8, 0.0); + s2_0 = max(s2_0, 0.0); + s2_1 = max(s2_1, 0.0); + s2_2 = max(s2_2, 0.0); + s2_3 = max(s2_3, 0.0); + s2_4 = max(s2_4, 0.0); + s2_5 = max(s2_5, 0.0); + s2_6 = max(s2_6, 0.0); + s2_7 = max(s2_7, 0.0); + s2_8 = max(s2_8, 0.0); + + t0[gxy] = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8); + t1[gxy] = f1(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8); +} + +//!PASS 4 +//!DESC conv3 +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 +//!IN t0, t1 +//!OUT t2, t3 + +#define l0(x, y) V4(O(t0, float2(x, y))) +#define l1(x, y) V4(O(t1, float2(x, y))) + +V4 f0(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8) { + V4 r = 0.0; + r += mul(s0_0, M4(7.356e-02, 8.402e-03, 1.287e-01, 6.762e-02, 2.134e-01, -6.620e-02, -2.788e-01, -5.744e-02, -3.896e-02, -3.993e-02, -7.161e-02, -1.982e-01, -6.734e-02, 8.804e-03, -4.739e-02, 6.502e-02)); + r += mul(s0_1, M4(2.249e-01, 4.958e-02, 1.138e-01, 3.152e-01, 2.008e-01, 1.703e-01, 5.817e-02, -9.482e-02, -2.371e-01, 3.975e-02, -1.755e-01, -2.666e-01, 2.819e-01, -2.640e-02, 1.405e-01, -6.009e-02)); + r += mul(s0_2, M4(2.065e-01, -3.027e-02, -3.447e-02, 3.226e-03, -1.252e-02, -7.589e-03, 2.344e-03, -1.704e-02, -8.894e-02, 3.136e-02, -1.517e-01, -2.176e-02, 8.920e-02, -5.322e-02, -9.529e-02, 8.355e-02)); + r += mul(s0_3, M4(1.136e-01, 1.015e-01, -2.730e-02, -2.144e-01, -9.526e-02, -2.857e-01, 2.711e-01, -1.991e-01, 2.596e-01, 1.602e-01, -2.169e-01, -1.097e-01, 3.353e-02, 6.231e-02, 8.753e-03, 3.707e-01)); + r += mul(s0_4, M4(-1.945e-01, 3.081e-01, -2.270e-01, -5.963e-02, -1.666e-01, -3.408e-01, 1.161e-01, -6.384e-02, -6.823e-01, -4.014e-01, -6.276e-01, -1.672e-01, 2.986e-03, -1.351e-01, 1.668e-01, -3.133e-01)); + r += mul(s0_5, M4(4.802e-02, -4.275e-02, 1.978e-03, -7.602e-02, -4.082e-03, 5.572e-02, -3.341e-02, 9.101e-03, -1.038e-01, 1.622e-01, 2.334e-02, 1.768e-01, 9.416e-03, -2.287e-01, 1.048e-01, -2.926e-01)); + r += mul(s0_6, M4(5.333e-04, 3.089e-02, 2.721e-02, -3.601e-02, -5.081e-02, -1.152e-01, 6.752e-02, 1.701e-01, -2.951e-02, 2.450e-01, -1.684e-01, -4.702e-02, -1.580e-02, 1.200e-02, -1.266e-02, 4.937e-02)); + r += mul(s0_7, M4(-1.351e-02, -6.248e-02, -3.060e-03, 4.140e-02, -2.090e-01, -6.831e-01, -8.857e-02, 2.536e-01, -2.333e-02, 1.521e-01, -8.033e-02, 2.124e-01, -6.615e-02, 1.317e-01, 1.847e-01, -2.150e-01)); + r += mul(s0_8, M4(4.605e-02, 1.013e-01, 6.834e-03, -6.411e-02, -1.476e-02, -2.845e-01, -4.312e-02, -1.171e-02, 6.985e-02, -6.859e-02, -2.785e-02, -3.226e-02, 5.186e-02, 1.102e-01, -2.071e-02, -1.250e-01)); + r += mul(s1_0, M4(1.952e-01, -3.342e-02, -3.770e-02, -2.026e-01, 4.850e-02, -3.174e-02, -1.987e-01, -2.886e-02, -1.298e-01, 1.994e-02, 1.131e-01, 2.950e-02, -1.791e-02, -4.533e-02, 4.695e-02, -6.907e-02)); + r += mul(s1_1, M4(2.401e-01, 1.809e-01, -5.151e-02, -6.271e-02, -1.409e-01, 9.215e-03, 1.176e-01, 2.717e-02, 1.130e-01, -3.228e-02, -9.086e-02, -1.202e-03, 1.642e-03, -7.943e-03, 1.097e-01, 1.842e-01)); + r += mul(s1_2, M4(8.774e-02, -1.486e-02, -4.808e-02, 4.089e-02, 6.244e-02, -7.645e-02, 5.614e-02, -5.706e-02, -2.386e-02, 4.407e-02, -1.378e-01, -5.880e-02, 2.936e-02, 2.285e-02, -3.924e-02, 5.724e-02)); + r += mul(s1_3, M4(2.603e-01, -1.455e-01, 1.429e-01, -2.992e-02, -6.288e-02, -5.216e-02, -1.802e-01, 1.060e-01, -2.473e-02, -6.795e-03, 2.843e-02, 7.745e-02, -4.868e-03, -9.998e-02, -7.961e-02, 5.068e-02)); + r += mul(s1_4, M4(2.018e-01, -1.293e-01, -5.291e-02, -4.763e-02, 3.484e-02, -1.648e-01, 8.786e-02, -6.101e-02, -1.083e-01, 5.522e-02, -1.814e-01, -2.392e-01, 6.427e-02, -1.908e-02, 2.643e-01, 1.294e-01)); + r += mul(s1_5, M4(-7.897e-02, -5.967e-02, -2.620e-01, 1.274e-02, -2.583e-02, 5.654e-02, -7.639e-02, -7.534e-03, -5.812e-02, -7.887e-02, -3.738e-03, 7.664e-02, 1.753e-02, -2.842e-01, -3.237e-01, 2.077e-02)); + r += mul(s1_6, M4(6.558e-02, -9.890e-02, 1.849e-02, 3.242e-04, 1.021e-02, 1.234e-01, 1.224e-02, -4.322e-02, -2.778e-02, 3.860e-02, -5.257e-02, -1.466e-02, -1.001e-02, -1.291e-03, 1.724e-01, -9.167e-02)); + r += mul(s1_7, M4(-5.291e-02, -2.764e-01, -6.402e-02, 4.327e-02, 1.921e-02, -1.484e-01, 3.286e-02, 4.051e-02, 1.636e-02, 3.932e-01, -5.432e-02, 4.540e-02, 3.947e-02, -1.385e-01, -1.065e-01, 1.569e-01)); + r += mul(s1_8, M4(-1.729e-02, 8.177e-02, -4.479e-02, -1.275e-01, -3.302e-03, -1.265e-01, -2.922e-02, 3.720e-02, 1.560e-02, 5.266e-02, -1.572e-02, -4.840e-02, 3.991e-03, 1.003e-01, -1.423e-01, 7.414e-02)); + r += mul(s2_0, M4(-1.207e-02, -2.418e-02, -7.769e-03, -1.401e-01, 1.660e-01, -6.347e-03, -1.092e-02, -1.830e-02, -1.252e-01, -5.217e-02, 9.898e-03, 1.461e-02, 2.654e-02, 1.219e-02, -3.769e-02, 1.897e-02)); + r += mul(s2_1, M4(-3.650e-02, 1.317e-01, 1.299e-02, -5.512e-02, -1.287e-01, 2.438e-02, -1.609e-03, 1.759e-01, 1.824e-02, 6.477e-03, 2.905e-02, -8.644e-02, 7.496e-02, -9.920e-02, 1.147e-02, 1.889e-01)); + r += mul(s2_2, M4(-7.005e-03, -4.482e-02, -1.853e-02, 3.441e-02, 1.251e-01, -3.162e-02, -1.701e-01, -5.231e-02, -1.647e-01, 2.261e-02, 8.255e-02, -3.730e-02, 1.811e-01, -9.052e-02, 1.728e-02, 1.911e-02)); + r += mul(s2_3, M4(2.359e-02, -1.334e-01, 2.761e-02, -1.251e-01, 1.455e-01, 4.076e-02, -3.260e-02, -1.782e-01, -3.575e-02, 1.411e-02, 1.322e-01, -9.592e-02, 5.423e-02, 7.989e-03, -1.460e-01, 8.895e-02)); + r += mul(s2_4, M4(1.304e-01, 1.296e-01, -7.250e-02, -6.647e-02, 8.382e-02, 1.111e-01, 8.976e-02, -5.914e-02, -2.228e-01, -4.772e-02, -1.931e-03, 8.499e-02, 4.483e-01, 1.327e-01, 5.086e-02, -4.795e-01)); + r += mul(s2_5, M4(4.674e-02, 7.104e-02, -5.312e-02, -7.730e-02, 2.647e-03, 8.893e-03, -8.889e-02, -5.714e-02, -4.546e-02, -4.002e-02, -1.514e-01, -2.989e-02, -8.669e-02, -5.441e-03, 1.460e-02, -2.327e-02)); + r += mul(s2_6, M4(1.146e-01, -1.154e-01, 8.289e-03, 7.655e-02, -2.194e-02, -3.908e-02, -2.191e-02, 2.363e-03, 4.527e-02, -7.852e-02, -4.728e-02, 1.066e-01, 4.023e-02, -5.192e-02, -4.180e-02, -3.879e-02)); + r += mul(s2_7, M4(2.446e-01, -2.295e-01, -5.819e-02, -2.646e-02, 8.106e-02, -8.799e-02, -3.455e-02, 6.900e-02, 5.579e-02, -1.551e-01, 1.609e-01, 9.954e-02, -1.499e-01, 8.628e-02, 1.114e-01, 1.313e-02)); + r += mul(s2_8, M4(1.028e-02, 9.150e-02, -6.161e-02, 5.124e-03, 3.822e-02, 1.533e-02, 2.329e-02, -1.106e-01, -1.541e-03, -1.818e-01, -9.577e-02, -3.402e-02, 1.784e-02, -1.152e-01, 6.896e-02, -1.111e-01)); + r += mul(s3_0, M4(-7.349e-02, -4.782e-02, 3.080e-02, -1.668e-01, 9.572e-02, 5.307e-02, 5.573e-03, 6.483e-02, 1.104e-01, -5.707e-02, -8.579e-02, -1.754e-02, 1.038e-01, 1.706e-02, -1.185e-01, 5.863e-02)); + r += mul(s3_1, M4(-1.639e-01, -6.808e-03, 1.836e-02, -1.482e-01, 1.032e-01, 2.612e-02, -1.751e-01, -1.527e-01, 3.169e-03, 5.272e-02, 7.983e-02, 5.066e-02, 1.191e-01, 3.658e-02, 3.275e-02, -1.122e-01)); + r += mul(s3_2, M4(-8.279e-02, -1.068e-02, 3.848e-02, -8.857e-03, -3.783e-02, 9.934e-02, -7.181e-02, 2.801e-02, -1.524e-01, -7.166e-02, 1.038e-01, -9.840e-04, -7.254e-03, -3.252e-02, -1.435e-02, 6.052e-03)); + r += mul(s3_3, M4(-3.534e-02, -2.891e-02, 3.778e-01, -2.472e-01, -4.015e-02, -5.651e-02, 2.006e-01, 1.249e-02, -8.408e-02, -1.160e-02, 2.881e-01, -6.805e-03, 1.340e-02, -1.237e-01, -1.617e-01, 1.894e-02)); + r += mul(s3_4, M4(-1.512e-02, 3.232e-01, -1.441e-01, -3.778e-01, -1.475e-01, -2.644e-03, -3.149e-01, 3.225e-02, 1.227e-01, -3.620e-02, -1.175e-01, -3.857e-01, 4.834e-02, -1.567e-01, 1.632e-01, -1.292e-01)); + r += mul(s3_5, M4(-1.592e-01, 3.426e-02, -1.506e-01, 1.215e-01, 1.314e-01, -7.432e-02, -8.767e-02, 1.685e-01, 6.875e-02, 2.804e-01, -3.279e-02, -1.870e-01, 1.049e-01, -9.061e-02, 8.573e-02, -9.407e-02)); + r += mul(s3_6, M4(5.310e-02, -1.089e-01, -1.496e-01, 2.134e-01, 5.599e-02, -1.565e-01, -6.842e-02, -1.362e-02, 6.861e-02, -2.548e-02, -1.614e-01, -3.698e-02, -2.731e-02, 1.138e-02, 1.288e-02, -1.789e-02)); + r += mul(s3_7, M4(-7.967e-02, -2.461e-01, -2.139e-01, 3.193e-01, 1.377e-01, -1.213e-01, 8.415e-02, 1.224e-02, 1.192e-01, 1.785e-01, 1.978e-01, 1.008e-01, 3.016e-02, 9.868e-02, 3.118e-03, -3.294e-02)); + r += mul(s3_8, M4(1.121e-01, -4.625e-02, 3.331e-02, -7.687e-02, 5.520e-02, 6.326e-02, 1.369e-02, 1.850e-02, 4.062e-02, -1.561e-01, -8.640e-02, 1.105e-01, 8.446e-03, -1.746e-03, 4.572e-02, -1.015e-01)); + r += V4(-1.057e-02, -1.114e-02, 1.597e-04, 1.132e-02); + return r; +} + +V4 f1(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8) { + V4 r = 0.0; + r += mul(s0_0, M4(2.399e-01, 1.190e-01, 9.941e-02, -5.908e-03, 2.176e-01, -3.861e-02, -4.997e-02, -3.036e-02, -6.079e-02, 2.294e-02, -1.260e-01, 6.001e-02, -7.690e-02, -4.805e-02, 6.117e-03, 4.358e-02)); + r += mul(s0_1, M4(-4.669e-02, -1.150e-01, 9.700e-03, 2.351e-02, 3.215e-01, -1.737e-03, 2.091e-01, -1.245e-01, -8.592e-02, 1.866e-01, 2.826e-01, -6.728e-01, 1.528e-01, 5.511e-02, -4.930e-02, -1.959e-02)); + r += mul(s0_2, M4(-2.182e-02, -4.512e-02, 6.864e-02, 8.299e-02, 8.483e-03, -4.855e-02, -1.500e-01, 1.325e-02, 6.098e-02, -1.867e-02, 1.276e-02, 1.721e-02, 5.918e-03, -1.130e-01, 7.066e-04, -1.824e-03)); + r += mul(s0_3, M4(4.594e-02, 1.518e-01, -2.067e-01, 1.546e-02, -1.548e-02, 1.126e-01, -4.502e-03, -2.014e-02, 2.417e-01, -1.530e-01, -1.095e-01, -4.966e-02, 2.291e-01, -4.598e-03, 2.836e-01, 5.562e-02)); + r += mul(s0_4, M4(5.432e-02, -3.003e-01, 7.389e-01, -1.497e-01, -2.439e-01, -3.298e-01, 4.081e-01, -2.105e-01, -4.267e-01, 3.913e-01, 5.470e-01, 5.594e-01, -1.221e-01, -5.444e-02, -4.180e-01, 1.515e-01)); + r += mul(s0_5, M4(2.205e-01, -5.813e-03, 7.451e-03, 8.130e-02, -3.312e-02, -9.387e-02, -9.824e-02, 4.493e-02, 8.187e-02, -2.042e-01, 1.644e-01, 1.562e-01, -8.427e-02, 2.057e-01, -1.668e-02, -2.356e-01)); + r += mul(s0_6, M4(1.150e-02, 1.442e-02, -1.973e-02, -4.599e-02, -9.680e-02, 3.962e-02, 1.731e-02, -2.402e-02, 3.936e-02, 6.512e-03, 2.103e-02, 2.025e-03, -1.308e-02, -5.259e-02, 5.631e-02, 3.037e-02)); + r += mul(s0_7, M4(-1.306e-02, -3.164e-02, 1.196e-01, 2.798e-02, -2.533e-01, -1.204e-01, 1.860e-01, 1.564e-01, -4.731e-02, -7.323e-02, 1.441e-03, -9.049e-02, -3.371e-02, -2.801e-04, 2.952e-02, -2.632e-02)); + r += mul(s0_8, M4(3.024e-02, -1.034e-02, -7.595e-02, -7.550e-02, 3.562e-02, -4.589e-02, -3.066e-02, 7.995e-02, -1.866e-02, 1.022e-01, -2.624e-02, -1.074e-01, 2.176e-02, 1.434e-01, -5.664e-02, -3.473e-02)); + r += mul(s1_0, M4(2.252e-01, 9.801e-02, -5.786e-02, -6.661e-02, 7.599e-02, -9.244e-02, 4.437e-02, -1.203e-01, -1.577e-01, -3.797e-02, -1.335e-02, 4.540e-02, -3.540e-03, -9.094e-03, -4.076e-02, -8.099e-02)); + r += mul(s1_1, M4(2.557e-01, -2.549e-01, 2.306e-01, -4.389e-02, -3.677e-02, 5.796e-02, 4.505e-02, -1.209e-01, -4.484e-02, 1.229e-01, -5.686e-02, 2.778e-02, 9.876e-02, -6.893e-04, 9.771e-02, 1.264e-01)); + r += mul(s1_2, M4(-5.324e-02, -9.632e-02, -1.092e-02, -1.426e-02, 3.082e-02, 9.196e-02, -1.381e-01, -1.013e-01, 7.758e-03, -3.290e-02, 1.630e-02, -4.979e-03, -7.297e-02, -7.534e-02, 2.040e-02, -1.983e-01)); + r += mul(s1_3, M4(1.951e-01, 3.566e-02, 4.220e-02, 8.086e-02, -5.114e-02, -5.626e-02, -6.912e-02, 1.462e-01, 2.268e-03, -2.592e-02, 3.527e-02, -3.832e-02, 4.756e-02, 1.234e-01, -5.494e-03, 4.695e-02)); + r += mul(s1_4, M4(4.147e-01, -2.431e-01, 2.372e-01, 2.574e-04, -4.485e-02, 5.014e-02, 3.928e-02, -2.817e-02, 3.512e-01, 2.983e-01, -1.260e-01, 4.326e-01, -2.366e-01, -6.912e-02, 2.259e-01, -4.534e-01)); + r += mul(s1_5, M4(1.323e-01, 5.260e-03, 2.693e-02, 1.841e-01, -1.105e-01, 6.002e-02, -1.233e-01, 1.012e-02, -9.410e-02, -1.260e-01, 1.264e-02, -3.910e-02, 3.656e-01, -1.103e-01, 5.059e-01, 4.280e-01)); + r += mul(s1_6, M4(-7.537e-02, -2.153e-02, -4.511e-02, -5.184e-02, -1.745e-02, -1.165e-02, 1.352e-02, -1.951e-02, -4.888e-02, 2.249e-02, -3.915e-02, -4.557e-03, -9.946e-03, -1.633e-04, -3.200e-02, -1.356e-02)); + r += mul(s1_7, M4(-1.509e-01, -2.227e-02, 1.640e-01, 2.693e-02, 4.846e-02, 3.303e-02, -5.390e-02, 3.607e-02, -2.818e-02, -7.170e-02, 3.311e-02, -9.203e-02, -1.946e-03, -8.577e-02, -2.925e-02, 1.238e-01)); + r += mul(s1_8, M4(-3.295e-02, 1.995e-02, -1.689e-01, -4.353e-02, -4.138e-02, -7.439e-03, -2.343e-02, 6.997e-02, 8.031e-02, 1.117e-01, 4.894e-02, -6.214e-02, -1.960e-01, -1.630e-01, 8.586e-02, -8.213e-02)); + r += mul(s2_0, M4(-9.883e-02, -1.168e-02, -1.110e-01, -2.148e-01, 1.452e-01, 3.417e-03, -4.513e-02, 8.845e-02, -7.791e-02, 2.326e-02, -4.188e-02, -3.659e-02, 3.105e-02, -1.318e-02, -4.552e-03, 7.109e-02)); + r += mul(s2_1, M4(1.958e-02, -6.995e-02, 2.588e-01, -6.431e-02, -2.211e-01, 5.281e-02, 5.399e-02, 8.884e-02, -5.135e-02, -4.768e-02, 1.363e-01, -2.064e-01, -1.391e-01, 1.106e-01, -2.611e-01, 2.038e-01)); + r += mul(s2_2, M4(-6.883e-02, -1.360e-03, -1.628e-01, 7.301e-02, 1.213e-01, -5.159e-03, 1.194e-01, -1.148e-02, -1.285e-01, -1.448e-01, 1.776e-02, -1.414e-01, -3.022e-02, 1.382e-01, 6.695e-02, -4.201e-02)); + r += mul(s2_3, M4(-1.194e-01, 1.524e-03, -1.945e-01, -1.496e-01, 1.413e-03, -8.697e-04, -1.542e-01, -1.798e-03, -4.991e-02, -7.944e-03, -1.094e-01, -5.578e-02, 1.526e-01, -6.170e-02, 1.598e-01, 1.306e-01)); + r += mul(s2_4, M4(3.583e-02, -1.213e-01, 2.087e-01, -4.616e-02, 2.125e-01, -1.242e-01, 2.776e-01, -8.100e-02, -1.733e-01, 1.016e-01, 2.949e-01, 1.489e-01, 5.059e-01, 3.526e-01, -4.764e-01, -1.105e-02)); + r += mul(s2_5, M4(7.240e-02, 1.034e-01, -1.103e-01, 2.351e-02, -2.711e-02, 1.506e-02, -1.534e-01, 1.093e-01, 5.065e-02, -2.686e-01, 1.423e-01, -4.993e-02, 7.167e-02, 1.084e-01, -8.139e-03, 4.460e-02)); + r += mul(s2_6, M4(1.243e-01, 1.281e-02, 7.048e-02, 1.117e-01, -1.145e-01, -1.703e-02, -1.470e-02, -3.647e-02, 3.796e-03, 2.441e-02, -8.422e-02, 1.955e-02, -2.861e-02, -6.963e-02, 6.894e-02, -4.071e-02)); + r += mul(s2_7, M4(2.315e-01, 7.446e-02, -7.632e-02, 1.319e-01, -2.392e-02, 2.525e-02, 4.687e-02, 7.645e-02, 4.250e-02, -4.733e-02, 2.179e-01, -3.843e-02, -3.526e-01, 9.675e-02, -1.837e-01, -1.563e-01)); + r += mul(s2_8, M4(5.933e-02, 1.490e-01, -5.844e-02, 9.363e-02, 7.616e-04, -1.075e-02, -1.365e-01, -6.094e-02, 7.094e-03, -1.218e-01, 7.021e-02, 3.101e-02, -4.184e-02, 3.989e-02, -7.167e-02, -1.179e-01)); + r += mul(s3_0, M4(-7.835e-02, 6.392e-02, -5.802e-02, -1.483e-01, 1.374e-01, 3.699e-02, 2.043e-03, 1.554e-01, -6.873e-02, -1.174e-02, -1.518e-01, -1.405e-02, 4.783e-03, -1.131e-01, 4.121e-02, -8.849e-02)); + r += mul(s3_1, M4(-1.463e-01, 5.240e-02, -1.651e-02, -2.410e-01, 1.092e-01, -3.146e-02, -1.629e-02, -2.974e-02, -7.838e-02, -7.374e-03, 2.745e-01, -1.408e-01, 1.335e-01, 8.634e-02, 1.073e-02, -1.407e-02)); + r += mul(s3_2, M4(-7.340e-02, 2.321e-02, 1.922e-02, -1.112e-01, 2.932e-02, -2.587e-02, 1.333e-01, 4.721e-02, -1.514e-01, -3.395e-02, -1.264e-01, 1.777e-02, -8.692e-02, 1.186e-02, -7.424e-02, -2.402e-02)); + r += mul(s3_3, M4(5.052e-02, 2.790e-03, 3.121e-02, -1.839e-01, 3.910e-02, 2.279e-02, 6.041e-02, -8.205e-03, -5.819e-02, 5.701e-04, 5.763e-02, -1.835e-02, -7.273e-02, -1.017e-01, -4.708e-02, 3.331e-02)); + r += mul(s3_4, M4(-4.521e-02, -3.700e-02, -1.199e-01, -3.863e-01, -4.641e-01, -2.451e-01, 1.512e-03, -3.424e-01, -1.194e-01, 1.119e-01, -1.183e-01, 1.918e-01, 8.865e-02, 1.866e-01, -4.503e-02, 2.355e-03)); + r += mul(s3_5, M4(5.461e-02, -1.461e-01, 2.827e-01, 2.041e-01, -8.786e-03, 1.079e-02, 1.593e-01, 2.173e-01, 4.916e-01, -1.773e-01, 2.149e-02, -1.461e-01, -5.435e-02, 1.909e-01, -2.171e-01, -7.547e-02)); + r += mul(s3_6, M4(2.543e-02, 5.455e-02, -6.107e-02, 5.194e-03, 9.984e-02, 8.664e-02, -7.757e-04, 3.957e-02, 1.432e-01, 3.805e-02, -1.005e-03, 7.600e-02, -4.304e-02, -6.326e-02, 3.996e-02, 3.872e-03)); + r += mul(s3_7, M4(-1.234e-01, -1.276e-01, 1.312e-01, 8.454e-02, 1.539e-01, 6.822e-02, -1.455e-02, 1.223e-01, -1.060e-01, -3.708e-02, -1.480e-01, -7.922e-02, 6.503e-02, 1.105e-01, -1.249e-01, -3.210e-02)); + r += mul(s3_8, M4(1.676e-01, -7.072e-03, 4.581e-02, -1.006e-01, -1.056e-02, -8.209e-02, -4.804e-02, 2.427e-02, -1.165e-01, -8.224e-02, 2.940e-01, -9.220e-03, 5.420e-02, 1.802e-01, -1.190e-01, 1.433e-02)); + r += V4(-4.712e-03, -1.187e-02, 1.287e-02, -6.625e-03); + return r; +} + +void Pass4(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = Rmp8x8(tid.x) + blockStart; + uint2 size = GetInputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = (gxy + 0.5) * pt; + + V4 s0_0 = l0(-1.0, -1.0); + V4 s0_1 = l0(0.0, -1.0); + V4 s0_2 = l0(1.0, -1.0); + V4 s0_3 = l0(-1.0, 0.0); + V4 s0_4 = l0(0.0, 0.0); + V4 s0_5 = l0(1.0, 0.0); + V4 s0_6 = l0(-1.0, 1.0); + V4 s0_7 = l0(0.0, 1.0); + V4 s0_8 = l0(1.0, 1.0); + V4 s1_0 = -max(-s0_0, 0.0); + V4 s1_1 = -max(-s0_1, 0.0); + V4 s1_2 = -max(-s0_2, 0.0); + V4 s1_3 = -max(-s0_3, 0.0); + V4 s1_4 = -max(-s0_4, 0.0); + V4 s1_5 = -max(-s0_5, 0.0); + V4 s1_6 = -max(-s0_6, 0.0); + V4 s1_7 = -max(-s0_7, 0.0); + V4 s1_8 = -max(-s0_8, 0.0); + s0_0 = max(s0_0, 0.0); + s0_1 = max(s0_1, 0.0); + s0_2 = max(s0_2, 0.0); + s0_3 = max(s0_3, 0.0); + s0_4 = max(s0_4, 0.0); + s0_5 = max(s0_5, 0.0); + s0_6 = max(s0_6, 0.0); + s0_7 = max(s0_7, 0.0); + s0_8 = max(s0_8, 0.0); + + V4 s2_0 = l1(-1.0, -1.0); + V4 s2_1 = l1(0.0, -1.0); + V4 s2_2 = l1(1.0, -1.0); + V4 s2_3 = l1(-1.0, 0.0); + V4 s2_4 = l1(0.0, 0.0); + V4 s2_5 = l1(1.0, 0.0); + V4 s2_6 = l1(-1.0, 1.0); + V4 s2_7 = l1(0.0, 1.0); + V4 s2_8 = l1(1.0, 1.0); + V4 s3_0 = -max(-s2_0, 0.0); + V4 s3_1 = -max(-s2_1, 0.0); + V4 s3_2 = -max(-s2_2, 0.0); + V4 s3_3 = -max(-s2_3, 0.0); + V4 s3_4 = -max(-s2_4, 0.0); + V4 s3_5 = -max(-s2_5, 0.0); + V4 s3_6 = -max(-s2_6, 0.0); + V4 s3_7 = -max(-s2_7, 0.0); + V4 s3_8 = -max(-s2_8, 0.0); + s2_0 = max(s2_0, 0.0); + s2_1 = max(s2_1, 0.0); + s2_2 = max(s2_2, 0.0); + s2_3 = max(s2_3, 0.0); + s2_4 = max(s2_4, 0.0); + s2_5 = max(s2_5, 0.0); + s2_6 = max(s2_6, 0.0); + s2_7 = max(s2_7, 0.0); + s2_8 = max(s2_8, 0.0); + + t2[gxy] = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8); + t3[gxy] = f1(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8); +} + +//!PASS 5 +//!DESC conv4 +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 +//!IN t2, t3 +//!OUT t0, t1 + +#define l0(x, y) V4(O(t2, float2(x, y))) +#define l1(x, y) V4(O(t3, float2(x, y))) + +V4 f0(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8) { + V4 r = 0.0; + r += mul(s0_0, M4(1.060e-02, 9.173e-03, 9.548e-04, -7.886e-02, -1.324e-02, 4.660e-02, -4.997e-02, -5.676e-02, -3.290e-02, 6.253e-02, -5.777e-02, 1.265e-02, 6.136e-03, 7.179e-02, 3.102e-02, 4.961e-02)); + r += mul(s0_1, M4(5.787e-03, -2.090e-03, -1.489e-01, 4.380e-02, 1.259e-01, 5.508e-01, 1.211e-01, 3.385e-01, 2.399e-02, -1.436e-01, 2.987e-03, -2.839e-02, -3.021e-02, -8.641e-03, 1.716e-01, -1.328e-02)); + r += mul(s0_2, M4(-3.284e-02, -5.196e-02, -2.983e-02, -2.858e-02, 1.729e-02, 7.665e-02, 1.387e-01, 1.037e-01, 4.289e-02, 1.274e-01, 3.348e-02, 1.911e-02, -1.786e-02, -4.888e-02, 6.323e-02, -2.989e-02)); + r += mul(s0_3, M4(2.473e-02, -6.550e-02, -1.373e-01, 3.680e-02, 1.575e-01, -8.270e-02, 3.186e-02, -3.836e-02, 4.508e-02, 4.254e-02, 5.656e-03, -9.132e-02, 1.334e-01, -5.076e-02, -2.445e-02, -4.735e-02)); + r += mul(s0_4, M4(-5.346e-01, 1.950e-01, 2.121e-01, -3.694e-01, 5.004e-02, 1.610e-02, 2.249e-01, -5.962e-02, -6.243e-02, -3.270e-01, 1.851e-01, 4.051e-02, -2.310e-01, -2.300e-01, -1.314e-01, 3.374e-01)); + r += mul(s0_5, M4(-4.686e-02, -3.968e-01, 2.772e-02, 2.495e-02, 4.541e-02, 8.724e-02, 4.401e-02, -1.515e-02, -6.453e-02, -7.210e-02, -1.250e-02, 4.044e-02, 3.057e-02, 2.485e-01, 2.228e-02, 6.774e-02)); + r += mul(s0_6, M4(-1.518e-01, -6.862e-02, -8.148e-02, -2.030e-01, -4.453e-02, -2.133e-03, -6.081e-02, -8.941e-02, -5.417e-02, 1.564e-02, -5.425e-02, 5.875e-02, -8.805e-02, -1.910e-02, 2.099e-02, -1.402e-02)); + r += mul(s0_7, M4(-1.730e-02, -6.152e-02, -2.764e-01, -8.728e-02, 9.519e-03, -2.799e-02, -5.662e-02, 3.249e-02, 8.716e-02, 2.809e-02, -7.241e-02, 3.046e-02, 1.368e-01, 2.723e-02, 1.130e-01, -4.615e-02)); + r += mul(s0_8, M4(-5.021e-02, -3.352e-02, 5.072e-02, -1.434e-02, 6.511e-02, 6.519e-02, -8.987e-02, 2.193e-02, 1.583e-04, 2.714e-02, -2.315e-02, -3.077e-02, 7.792e-03, 2.782e-02, 9.282e-02, 5.011e-02)); + r += mul(s1_0, M4(-2.541e-02, -9.530e-03, -2.089e-01, -2.421e-02, 1.340e-02, 1.228e-01, 8.861e-02, -1.063e-02, -7.461e-02, 5.226e-02, -7.276e-02, 3.544e-02, -1.591e-02, 1.851e-02, 9.562e-03, 4.559e-02)); + r += mul(s1_1, M4(2.747e-02, -7.982e-02, -1.475e-01, 4.885e-02, -1.175e-02, -9.209e-02, -9.273e-02, -7.428e-02, 3.696e-02, -2.012e-01, 4.627e-02, 3.609e-02, 1.096e-01, -5.087e-02, 2.170e-01, 5.311e-02)); + r += mul(s1_2, M4(2.410e-02, 6.970e-02, 2.315e-02, 2.908e-02, 2.961e-05, 1.661e-02, 8.374e-02, 5.064e-02, 2.637e-02, 1.330e-01, 5.175e-02, -5.518e-02, -4.871e-03, 1.162e-01, 8.451e-02, 1.741e-02)); + r += mul(s1_3, M4(4.863e-02, -7.095e-02, 3.927e-03, -9.085e-02, 2.639e-02, -8.297e-02, -1.865e-01, -9.647e-02, 6.967e-02, 1.376e-02, 1.222e-01, -2.819e-01, 1.563e-01, -1.399e-02, -4.367e-02, -5.187e-02)); + r += mul(s1_4, M4(9.322e-02, 9.848e-02, 1.680e-01, -2.298e-01, -6.183e-02, -4.167e-02, -1.103e-02, -9.856e-03, -2.983e-03, -3.805e-01, -3.115e-01, -4.107e-01, -1.341e-01, -3.703e-01, -3.661e-01, -4.633e-01)); + r += mul(s1_5, M4(-2.785e-03, -2.188e-02, -2.790e-03, -4.276e-04, 7.082e-02, 1.004e-01, -3.532e-03, 1.740e-03, 6.693e-03, -5.230e-01, 2.119e-01, 2.878e-02, 3.915e-03, 1.842e-01, -1.630e-02, -3.874e-02)); + r += mul(s1_6, M4(2.313e-02, -6.545e-02, 1.631e-02, -1.278e-01, -4.216e-02, -4.147e-02, 6.827e-02, -1.725e-02, -5.254e-02, -3.942e-02, -2.400e-02, -8.124e-02, -3.250e-02, -1.806e-03, -3.947e-02, -7.056e-02)); + r += mul(s1_7, M4(8.445e-03, 1.147e-01, -7.772e-02, 1.091e-01, 1.842e-02, -6.040e-03, -7.053e-02, 1.824e-02, 2.212e-01, -8.777e-02, -1.003e-01, 6.533e-03, 2.090e-01, 4.588e-02, 9.886e-02, 6.176e-02)); + r += mul(s1_8, M4(4.046e-02, 1.872e-02, -5.723e-02, -4.997e-02, 5.232e-03, 1.795e-02, -2.747e-02, -1.507e-02, -1.704e-01, 7.849e-02, -1.475e-01, -4.255e-02, 7.807e-02, 4.185e-02, 3.849e-02, 3.137e-02)); + r += mul(s2_0, M4(-8.062e-03, 6.677e-02, 6.217e-02, 1.833e-01, -1.475e-01, 2.782e-01, 3.524e-02, -6.275e-02, 4.315e-02, 1.484e-02, 3.820e-02, -3.304e-02, 1.659e-03, -9.567e-03, -3.360e-02, -2.623e-02)); + r += mul(s2_1, M4(9.928e-02, -2.526e-01, -2.613e-02, 2.043e-01, 1.710e-02, -1.137e-01, 1.798e-01, -1.427e-01, 4.676e-03, 1.728e-01, 8.082e-02, -5.413e-02, -1.710e-02, -3.169e-02, -6.860e-02, 1.496e-02)); + r += mul(s2_2, M4(1.785e-02, 1.092e-01, -7.685e-02, 7.691e-02, 5.271e-03, -5.168e-02, 3.395e-02, 1.726e-02, 2.936e-02, -1.321e-02, 5.364e-02, -6.785e-03, 2.429e-02, -4.442e-02, -6.348e-02, 3.035e-02)); + r += mul(s2_3, M4(2.676e-01, 4.022e-03, -5.435e-02, -2.723e-01, -1.412e-01, -6.091e-01, 1.576e-02, 6.829e-02, -1.410e-01, 5.578e-03, 3.833e-03, 1.863e-01, -2.274e-02, 6.034e-03, 1.518e-01, -5.434e-02)); + r += mul(s2_4, M4(7.884e-02, 5.377e-01, -4.655e-02, -3.752e-01, 1.490e-01, -4.235e-02, -5.390e-02, 2.610e-01, 1.979e-01, -5.718e-02, 1.773e-02, 5.727e-02, 1.703e-02, 7.533e-01, -3.023e-02, 5.456e-02)); + r += mul(s2_5, M4(-4.898e-02, 4.237e-02, 6.311e-02, -4.635e-02, 3.660e-03, 2.139e-01, -3.722e-02, -6.738e-02, -3.009e-02, -6.140e-02, 2.777e-02, 3.917e-02, -1.421e-01, -4.041e-01, -1.524e-01, -9.837e-02)); + r += mul(s2_6, M4(6.071e-02, 1.084e-01, -6.370e-02, 1.323e-01, -7.251e-02, -1.079e-01, 1.208e-01, -4.495e-02, -2.115e-03, -4.107e-02, 2.465e-02, -1.230e-01, -6.064e-02, -4.263e-02, -1.388e-01, 6.519e-02)); + r += mul(s2_7, M4(9.042e-02, -8.032e-02, 1.186e-01, -1.537e-02, -6.566e-03, -3.216e-02, 3.412e-02, -3.207e-02, -1.586e-01, -2.988e-03, -2.358e-03, 2.172e-02, 6.775e-02, -3.590e-01, -4.123e-01, -3.506e-01)); + r += mul(s2_8, M4(8.486e-02, 4.731e-02, 5.779e-02, 1.000e-01, 9.121e-03, -3.421e-02, 4.891e-02, 4.916e-02, 3.343e-03, 4.437e-03, -2.002e-02, -3.856e-02, -1.319e-01, -4.022e-02, -1.752e-01, -9.250e-02)); + r += mul(s3_0, M4(-6.652e-03, 6.416e-02, 9.292e-03, 6.520e-02, 1.213e-02, 4.177e-02, 7.038e-02, -3.160e-02, 2.146e-02, -9.523e-02, -1.436e-01, -8.325e-02, -1.234e-02, -1.222e-02, -3.877e-02, -4.175e-02)); + r += mul(s3_1, M4(-5.171e-02, 1.011e-01, 7.998e-02, -8.804e-02, 1.067e-02, 1.516e-01, 6.508e-02, -7.724e-02, 2.717e-02, -4.901e-02, -6.059e-03, 4.013e-02, -3.833e-02, 1.538e-01, 5.948e-02, -4.945e-02)); + r += mul(s3_2, M4(1.023e-02, -1.230e-01, -1.861e-02, -2.570e-02, 2.512e-02, -4.630e-02, 6.354e-02, 3.897e-02, -2.146e-02, 2.446e-01, 1.906e-03, -9.068e-03, 1.754e-02, -7.082e-02, 1.107e-04, -9.604e-03)); + r += mul(s3_3, M4(7.380e-02, 2.216e-02, -2.608e-02, -6.491e-02, 4.018e-02, -6.657e-02, 1.116e-01, 9.405e-02, -7.168e-02, -3.646e-01, 8.387e-02, 1.352e-02, -4.589e-02, 2.235e-02, 1.881e-01, 1.759e-01)); + r += mul(s3_4, M4(-7.735e-02, -8.574e-02, -6.380e-02, 1.221e-01, 5.556e-02, -1.281e-01, 1.461e-01, 2.757e-01, 8.144e-01, -1.075e-01, 3.165e-03, -2.036e-01, 1.814e-01, 1.744e-01, -1.745e-01, 3.724e-02)); + r += mul(s3_5, M4(-6.864e-02, 1.273e-02, 7.502e-02, 4.164e-02, 1.301e-02, 1.407e-01, -9.985e-02, -8.079e-02, 1.428e-01, 3.034e-01, -1.564e-02, 6.091e-02, -1.271e-02, -2.153e-01, -7.843e-02, -4.063e-02)); + r += mul(s3_6, M4(-5.115e-02, 6.016e-02, -2.719e-02, 4.668e-02, -3.214e-02, -2.274e-02, -6.954e-03, -9.099e-03, 4.861e-02, 1.007e-01, -2.150e-01, -1.607e-01, -3.578e-02, 1.230e-02, -5.095e-02, 1.622e-02)); + r += mul(s3_7, M4(9.498e-02, -6.763e-02, 1.451e-01, 3.408e-03, -3.253e-02, 1.145e-01, 8.122e-03, -9.192e-02, 5.071e-02, -6.317e-02, 1.097e-01, 5.913e-02, 8.494e-02, 2.731e-04, -3.736e-01, -6.110e-03)); + r += mul(s3_8, M4(1.881e-02, 1.750e-02, 5.956e-02, 4.179e-02, -4.554e-02, -9.824e-02, 8.917e-03, 3.348e-02, 4.160e-02, 6.525e-02, 1.484e-02, -2.331e-02, -8.092e-02, -2.834e-02, -1.284e-01, -7.521e-02)); + r += V4(-5.270e-03, 1.390e-02, 8.622e-03, 1.255e-02); + return r; +} + +V4 f1(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-4.868e-02, -7.333e-02, -1.029e-02, -7.011e-04, 2.404e-02, -9.301e-02, 1.457e-01, 2.242e-02, 6.850e-02, -1.328e-03, -2.557e-02, -4.854e-04, 1.071e-01, 3.788e-04, 1.408e-01, 5.354e-03)); + r += mul(s0_1, M4(7.892e-03, 5.832e-02, -1.077e-01, -6.140e-02, -1.003e-02, -4.887e-01, 8.263e-01, 2.416e-01, -3.434e-02, 1.089e-02, -1.984e-02, -3.615e-02, -5.692e-03, 1.615e-02, -5.680e-02, 2.041e-02)); + r += mul(s0_2, M4(2.136e-02, -2.731e-02, -1.742e-02, 2.592e-02, -4.319e-02, 6.426e-03, 2.110e-02, -6.338e-02, -6.921e-03, -1.288e-03, 4.579e-02, -2.155e-03, 3.041e-02, 1.946e-02, 1.238e-02, 6.906e-02)); + r += mul(s0_3, M4(-2.058e-02, 3.187e-02, -1.057e-01, 2.407e-01, -3.813e-02, -2.640e-02, 3.941e-02, 1.362e-01, 2.406e-02, 1.518e-02, -4.224e-02, 3.455e-02, 5.443e-02, -6.617e-02, -8.858e-02, -1.949e-02)); + r += mul(s0_4, M4(3.205e-01, -6.490e-01, -3.962e-01, -1.142e-01, -3.091e-02, 4.755e-01, -2.822e-01, -1.328e-01, -5.487e-01, 5.932e-02, -2.439e-02, -1.689e-01, -3.681e-02, -8.227e-02, 3.967e-02, -8.989e-02)); + r += mul(s0_5, M4(-5.668e-02, 3.658e-02, 1.227e-02, 8.117e-02, 1.161e-01, 9.350e-02, 9.971e-02, -1.220e-01, 7.876e-02, 5.186e-02, -4.261e-02, 1.436e-01, -2.114e-02, 6.113e-02, 2.251e-02, 2.534e-02)); + r += mul(s0_6, M4(-5.365e-02, -2.678e-02, -2.565e-02, 7.923e-02, -2.138e-02, -4.932e-02, -6.107e-03, 1.685e-02, 5.425e-02, -1.012e-02, -9.037e-03, 8.218e-04, -1.210e-02, 5.623e-02, -2.094e-02, -2.325e-02)); + r += mul(s0_7, M4(2.031e-02, -3.187e-02, 8.229e-02, 1.457e-01, 1.044e-01, -4.475e-02, 2.858e-02, -7.345e-02, -3.919e-02, -5.753e-02, 1.684e-02, -1.669e-01, 9.680e-03, 1.254e-01, 2.022e-03, -9.900e-02)); + r += mul(s0_8, M4(-1.164e-02, 5.171e-02, -5.704e-02, -1.643e-01, 2.554e-02, -9.988e-02, 3.699e-02, -3.752e-02, -8.076e-04, -2.527e-02, -2.081e-02, 3.110e-02, 1.484e-03, 4.064e-02, 2.481e-02, 2.225e-01)); + r += mul(s1_0, M4(4.384e-02, -1.401e-01, -4.071e-02, -1.137e-02, -4.979e-03, 6.159e-02, 1.275e-01, 6.544e-02, 1.288e-01, -4.421e-02, -4.471e-02, 2.682e-02, 5.621e-02, -4.062e-02, 1.034e-01, 6.606e-02)); + r += mul(s1_1, M4(2.799e-02, -1.333e-01, 1.521e-01, -5.025e-02, -1.895e-01, -7.913e-02, -2.321e-01, -6.526e-02, -1.330e-02, 1.499e-02, 1.620e-01, 6.936e-02, -6.816e-02, 1.353e-01, 1.107e-01, 5.514e-02)); + r += mul(s1_2, M4(5.826e-03, -5.941e-03, -2.338e-02, -2.826e-02, 9.265e-02, 3.608e-02, 1.114e-01, 1.274e-01, -1.291e-01, 1.284e-02, -7.540e-02, -3.458e-02, -1.006e-02, 2.083e-02, -8.393e-02, 8.186e-02)); + r += mul(s1_3, M4(-3.893e-02, -1.137e-02, 1.243e-01, 1.118e-01, 7.397e-02, -1.316e-01, -1.303e-01, -7.808e-05, 1.468e-02, -4.172e-03, -5.014e-02, -2.610e-02, 8.366e-02, -2.755e-02, 1.646e-04, -2.938e-02)); + r += mul(s1_4, M4(-1.114e-01, -2.017e-01, 2.898e-03, -7.984e-02, -8.403e-02, 2.626e-02, 1.563e-01, -1.397e-02, 2.724e-02, -6.698e-01, 2.358e-01, -6.466e-01, -9.650e-03, -6.742e-01, 1.411e-01, -3.343e-01)); + r += mul(s1_5, M4(7.380e-02, 6.420e-02, 7.990e-02, 6.014e-02, 5.950e-02, 6.212e-02, -7.881e-02, -2.782e-02, 1.087e-01, -3.347e-02, 3.819e-01, 1.988e-01, 5.813e-02, 2.239e-02, 3.012e-01, 1.275e-01)); + r += mul(s1_6, M4(-9.473e-02, -2.417e-02, -2.870e-02, 7.718e-02, -2.223e-02, 2.306e-02, 8.255e-03, -1.818e-02, -2.983e-02, -3.495e-02, 1.540e-02, 8.013e-02, 1.651e-02, -1.298e-02, 2.377e-02, 5.523e-02)); + r += mul(s1_7, M4(1.414e-01, 1.346e-01, 4.336e-03, -7.594e-02, -2.044e-02, -9.596e-03, -1.087e-03, 5.324e-02, -2.041e-02, -6.328e-02, 7.533e-02, -3.971e-01, 5.408e-04, 1.087e-01, 9.749e-03, -2.047e-01)); + r += mul(s1_8, M4(4.656e-02, -4.771e-02, -2.210e-02, -2.060e-02, -6.953e-03, -3.366e-02, -7.290e-03, -3.300e-02, -1.354e-01, -5.015e-02, -2.887e-02, 2.802e-01, 2.605e-02, -1.972e-02, 1.168e-03, 1.422e-01)); + r += mul(s2_0, M4(8.826e-02, -4.751e-02, 2.493e-01, 4.446e-02, 1.752e-01, 5.741e-03, -1.820e-01, 1.371e-02, -6.855e-02, 1.164e-02, -5.215e-02, -7.373e-04, -1.491e-02, 7.033e-03, -5.440e-02, -9.302e-05)); + r += mul(s2_1, M4(-6.871e-02, -9.419e-03, 3.276e-01, 2.826e-02, 5.675e-02, -3.974e-03, 1.104e-01, -2.975e-02, 3.281e-02, 8.429e-03, 1.129e-01, -4.830e-02, -4.374e-02, -6.905e-02, 8.143e-02, 3.180e-03)); + r += mul(s2_2, M4(-7.197e-02, -1.804e-02, -9.024e-02, -1.527e-03, 2.403e-02, 6.062e-02, 3.346e-02, 4.784e-02, -1.462e-02, 4.216e-02, 2.800e-02, 4.034e-04, -4.216e-02, -4.431e-03, -3.496e-02, -3.005e-02)); + r += mul(s2_3, M4(2.710e-02, -6.523e-02, 1.559e-01, -6.059e-02, 1.965e-01, -1.608e-01, -9.293e-03, -2.404e-01, -4.061e-02, 8.819e-02, 2.112e-02, 2.398e-01, -1.463e-01, 5.373e-02, -1.346e-02, 3.025e-02)); + r += mul(s2_4, M4(1.846e-02, 3.857e-01, -4.128e-01, -2.530e-01, -2.312e-01, 3.354e-02, -3.948e-01, -1.465e-01, 1.072e-01, -8.544e-02, -7.428e-02, 4.751e-02, 2.139e-01, 3.097e-01, -3.761e-01, 5.621e-02)); + r += mul(s2_5, M4(-1.203e-02, -9.598e-02, 4.101e-01, 1.578e-01, -5.394e-02, -6.714e-02, -6.320e-02, 8.249e-03, 5.620e-02, -3.219e-02, 9.398e-03, 6.809e-02, -7.400e-02, -1.431e-01, -1.425e-01, -2.358e-02)); + r += mul(s2_6, M4(4.035e-02, 5.655e-02, -3.307e-03, -3.497e-02, 6.522e-02, 1.103e-01, -9.802e-02, -2.655e-01, -5.802e-02, -4.359e-02, 3.459e-03, 1.592e-01, -2.566e-02, -1.156e-01, 2.646e-02, 3.806e-02)); + r += mul(s2_7, M4(-3.211e-02, -1.509e-01, 2.028e-03, -1.702e-01, 4.576e-02, -5.340e-02, 5.503e-02, 1.257e-02, -5.581e-02, 9.818e-02, -2.745e-02, 1.486e-01, 1.063e-01, -3.707e-01, 1.116e-01, -6.709e-02)); + r += mul(s2_8, M4(9.062e-04, -7.371e-03, 8.420e-02, 1.629e-01, -2.707e-02, -5.219e-03, 6.567e-02, 1.766e-01, 4.554e-04, 1.178e-02, -1.124e-02, 3.477e-02, -5.473e-02, -7.643e-02, 9.083e-03, -4.250e-02)); + r += mul(s3_0, M4(8.537e-02, 7.246e-02, 5.043e-02, 3.850e-02, -3.951e-02, 9.224e-03, 1.640e-02, 1.906e-02, -1.333e-01, -8.517e-02, -1.410e-01, 4.781e-02, -1.641e-02, 2.463e-03, -7.445e-02, -4.602e-02)); + r += mul(s3_1, M4(7.934e-02, 7.380e-03, -1.062e-01, -4.154e-03, -2.611e-02, -3.119e-02, 9.679e-02, -1.394e-02, -1.108e-01, 1.158e-02, 1.850e-01, -6.765e-02, 5.765e-02, 3.392e-02, -1.560e-02, -6.052e-02)); + r += mul(s3_2, M4(-3.056e-02, -8.450e-03, 1.524e-02, -1.007e-02, 1.030e-02, 4.032e-02, 9.837e-02, 9.371e-03, 4.740e-02, -4.795e-02, -3.356e-02, 8.602e-03, 2.484e-02, -9.889e-03, 6.734e-02, -2.287e-02)); + r += mul(s3_3, M4(6.303e-02, -7.328e-02, -5.082e-02, -5.070e-02, -8.129e-03, 7.948e-03, 7.351e-02, 5.601e-02, -4.169e-01, -8.219e-03, 3.373e-01, 1.781e-01, -5.139e-02, 1.471e-01, 3.415e-02, 7.690e-02)); + r += mul(s3_4, M4(1.455e-01, 6.664e-02, 5.792e-02, -1.276e-01, 2.360e-01, 5.978e-02, 5.147e-02, 2.707e-01, -7.581e-01, -2.740e-01, -3.000e-01, -2.017e-02, 2.005e-01, 6.934e-02, 2.996e-02, -3.036e-01)); + r += mul(s3_5, M4(-1.708e-01, -6.628e-02, 9.170e-02, 3.461e-02, -1.028e-01, -4.244e-02, -1.955e-01, -1.875e-01, 8.215e-02, 2.976e-02, -4.637e-03, 1.512e-01, -4.626e-02, 3.819e-03, -2.222e-01, -1.078e-01)); + r += mul(s3_6, M4(9.585e-02, 3.354e-02, -5.140e-03, -2.883e-02, -9.057e-02, 3.950e-02, -5.781e-02, -2.509e-02, -7.106e-02, -1.351e-01, -4.933e-02, 8.332e-02, -2.922e-02, -3.890e-02, 3.291e-03, 7.054e-02)); + r += mul(s3_7, M4(-8.208e-02, 1.377e-02, -2.475e-02, -1.353e-01, 9.728e-02, 7.136e-02, -3.984e-02, 1.374e-01, -1.160e-01, 4.362e-02, 6.714e-02, 5.038e-03, 1.866e-01, -2.349e-01, 8.599e-02, -1.510e-01)); + r += mul(s3_8, M4(-3.279e-02, 4.634e-02, 1.698e-02, 1.410e-01, -2.615e-02, 1.178e-02, 5.268e-02, 5.209e-02, 1.624e-02, 2.431e-02, -3.280e-02, 7.160e-02, -6.704e-02, -1.195e-01, -4.136e-02, -2.048e-01)); + r += V4(-7.279e-03, 1.016e-02, -7.400e-03, 4.979e-03); + return r; +} + +void Pass5(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = Rmp8x8(tid.x) + blockStart; + uint2 size = GetInputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = (gxy + 0.5) * pt; + + V4 s0_0 = l0(-1.0, -1.0); + V4 s0_1 = l0(0.0, -1.0); + V4 s0_2 = l0(1.0, -1.0); + V4 s0_3 = l0(-1.0, 0.0); + V4 s0_4 = l0(0.0, 0.0); + V4 s0_5 = l0(1.0, 0.0); + V4 s0_6 = l0(-1.0, 1.0); + V4 s0_7 = l0(0.0, 1.0); + V4 s0_8 = l0(1.0, 1.0); + V4 s1_0 = -max(-s0_0, 0.0); + V4 s1_1 = -max(-s0_1, 0.0); + V4 s1_2 = -max(-s0_2, 0.0); + V4 s1_3 = -max(-s0_3, 0.0); + V4 s1_4 = -max(-s0_4, 0.0); + V4 s1_5 = -max(-s0_5, 0.0); + V4 s1_6 = -max(-s0_6, 0.0); + V4 s1_7 = -max(-s0_7, 0.0); + V4 s1_8 = -max(-s0_8, 0.0); + s0_0 = max(s0_0, 0.0); + s0_1 = max(s0_1, 0.0); + s0_2 = max(s0_2, 0.0); + s0_3 = max(s0_3, 0.0); + s0_4 = max(s0_4, 0.0); + s0_5 = max(s0_5, 0.0); + s0_6 = max(s0_6, 0.0); + s0_7 = max(s0_7, 0.0); + s0_8 = max(s0_8, 0.0); + + V4 s2_0 = l1(-1.0, -1.0); + V4 s2_1 = l1(0.0, -1.0); + V4 s2_2 = l1(1.0, -1.0); + V4 s2_3 = l1(-1.0, 0.0); + V4 s2_4 = l1(0.0, 0.0); + V4 s2_5 = l1(1.0, 0.0); + V4 s2_6 = l1(-1.0, 1.0); + V4 s2_7 = l1(0.0, 1.0); + V4 s2_8 = l1(1.0, 1.0); + V4 s3_0 = -max(-s2_0, 0.0); + V4 s3_1 = -max(-s2_1, 0.0); + V4 s3_2 = -max(-s2_2, 0.0); + V4 s3_3 = -max(-s2_3, 0.0); + V4 s3_4 = -max(-s2_4, 0.0); + V4 s3_5 = -max(-s2_5, 0.0); + V4 s3_6 = -max(-s2_6, 0.0); + V4 s3_7 = -max(-s2_7, 0.0); + V4 s3_8 = -max(-s2_8, 0.0); + s2_0 = max(s2_0, 0.0); + s2_1 = max(s2_1, 0.0); + s2_2 = max(s2_2, 0.0); + s2_3 = max(s2_3, 0.0); + s2_4 = max(s2_4, 0.0); + s2_5 = max(s2_5, 0.0); + s2_6 = max(s2_6, 0.0); + s2_7 = max(s2_7, 0.0); + s2_8 = max(s2_8, 0.0); + + t0[gxy] = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8); + t1[gxy] = f1(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8); +} + +//!PASS 6 +//!DESC out-shuffle +//!BLOCK_SIZE 16 +//!NUM_THREADS 64 +//!IN INPUT, t0, t1 +//!OUT OUTPUT + +#define l0(x, y) V4(O(t0, float2(x, y))) +#define l1(x, y) V4(O(t1, float2(x, y))) + +V4 f0(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8) { + V4 r = 0.0; + r += mul(s0_0, M4(1.838e-01, -1.901e-02, 9.627e-03, -5.113e-02, -2.616e-02, -2.850e-02, -1.739e-02, 9.125e-03, 1.563e-02, -1.253e-02, 1.902e-02, -1.512e-02, 3.495e-03, -1.497e-02, 4.974e-03, -1.115e-02)); + r += mul(s0_1, M4(-4.288e-01, 2.549e-01, -1.017e-01, -1.945e-01, 4.749e-02, 5.258e-02, -8.284e-03, -2.265e-02, -7.010e-02, -1.542e-02, 6.889e-03, 4.028e-02, -1.355e-02, 4.321e-03, 3.330e-02, 8.256e-02)); + r += mul(s0_2, M4(-1.045e-03, -2.140e-01, -3.928e-02, 1.364e-02, 1.787e-03, -9.427e-03, 1.927e-03, -2.145e-03, -4.617e-03, 2.814e-02, 2.045e-02, 1.776e-02, 3.188e-02, 3.187e-02, -1.498e-02, -2.180e-02)); + r += mul(s0_3, M4(1.059e-02, -5.522e-02, 6.447e-02, -4.395e-02, -4.846e-02, -2.209e-02, 1.866e-02, -5.920e-02, -2.419e-02, 1.032e-02, 7.736e-04, 1.092e-03, 1.854e-02, -4.388e-03, 3.893e-02, 9.549e-03)); + r += mul(s0_4, M4(3.358e-02, 7.431e-03, 1.780e-01, 5.353e-01, 2.674e-01, 2.227e-01, 1.450e-01, 2.085e-01, -8.104e-03, -3.561e-02, -1.231e-01, -1.932e-01, -6.538e-02, 3.378e-02, -1.314e-01, -2.862e-02)); + r += mul(s0_5, M4(-7.887e-02, 4.783e-02, -1.380e-01, -3.877e-01, 3.436e-03, 4.712e-02, -1.250e-02, 2.247e-02, 2.920e-02, 7.190e-02, -2.005e-02, 6.169e-02, 5.594e-03, -4.630e-02, 9.661e-02, 3.625e-02)); + r += mul(s0_6, M4(1.963e-02, -1.873e-02, 1.489e-02, -1.253e-02, -9.356e-03, 1.334e-02, -3.747e-02, -1.115e-02, 7.741e-04, -6.463e-03, 3.707e-03, -3.598e-03, 1.783e-02, -5.539e-03, 9.899e-03, -9.354e-03)); + r += mul(s0_7, M4(-2.952e-03, 3.132e-02, -6.679e-02, 2.883e-02, -3.721e-02, -3.573e-02, 1.204e-01, -6.785e-02, -1.208e-02, -1.355e-04, 2.872e-02, 2.196e-02, -1.655e-02, 3.784e-02, -5.921e-03, 2.494e-02)); + r += mul(s0_8, M4(-1.215e-02, -2.947e-02, -2.454e-03, -6.326e-02, 2.248e-03, 2.302e-02, -2.863e-03, 5.834e-02, 2.187e-02, 9.973e-03, 2.158e-02, 4.902e-02, -2.207e-02, -3.485e-02, -5.118e-02, -6.696e-02)); + r += mul(s1_0, M4(8.377e-02, -3.093e-02, 2.280e-02, -2.664e-02, -4.333e-02, -3.292e-02, -8.109e-03, 1.105e-02, 1.507e-02, 9.138e-03, 2.597e-02, -1.926e-02, 4.537e-02, -9.080e-03, -1.629e-02, -1.180e-02)); + r += mul(s1_1, M4(-7.478e-02, 1.238e-01, -5.092e-02, -3.473e-02, 4.269e-02, 4.444e-02, 7.295e-03, 1.274e-04, -1.646e-01, -1.551e-03, 3.424e-02, 4.906e-02, -2.056e-01, -5.847e-02, 5.262e-02, 1.049e-01)); + r += mul(s1_2, M4(-6.323e-02, -1.179e-01, -1.982e-02, -4.065e-02, 3.089e-03, -9.469e-03, 2.850e-03, 3.314e-03, -1.819e-03, -1.065e-01, 1.882e-02, 9.349e-03, 1.624e-02, -2.906e-02, -2.029e-02, -5.020e-02)); + r += mul(s1_3, M4(1.101e-01, -3.490e-02, 1.327e-01, -2.853e-02, -5.027e-03, -5.703e-02, 6.484e-03, -6.473e-02, -4.310e-02, 3.882e-02, -3.100e-02, -7.837e-04, -5.501e-02, -1.261e-02, 7.285e-02, 4.648e-02)); + r += mul(s1_4, M4(-6.214e-02, 1.841e-01, -9.546e-02, 3.700e-01, 2.824e-01, 3.400e-01, 2.309e-01, 2.237e-01, 3.482e-01, -1.294e-01, -4.546e-01, -3.556e-01, -4.730e-01, -1.392e-01, 4.776e-01, 1.210e-01)); + r += mul(s1_5, M4(-5.408e-02, -1.286e-01, -6.571e-02, -1.230e-01, 9.991e-03, 6.421e-02, 4.305e-03, 1.780e-02, 2.254e-02, 3.661e-01, 6.275e-02, 8.004e-02, -1.834e-02, -3.465e-01, 9.274e-02, 3.935e-01)); + r += mul(s1_6, M4(-1.620e-03, -1.423e-02, 2.785e-02, -1.252e-02, -1.218e-02, 2.842e-03, -3.496e-02, -2.927e-02, -2.106e-02, -7.099e-03, 2.545e-02, 2.484e-02, 2.973e-02, 4.563e-04, 2.010e-04, -1.839e-02)); + r += mul(s1_7, M4(1.400e-04, 3.080e-02, -6.992e-03, 8.032e-02, -2.280e-02, -4.436e-02, 7.600e-02, 1.165e-02, -9.494e-02, -2.207e-02, 2.783e-01, 2.095e-01, 2.645e-02, 5.203e-02, -7.492e-02, -1.303e-02)); + r += mul(s1_8, M4(-5.360e-03, -2.277e-02, -2.252e-02, -6.191e-02, 1.263e-02, 1.540e-02, 9.566e-03, 3.637e-02, -1.265e-02, -3.092e-02, -1.298e-02, -1.187e-02, 1.286e-02, 1.181e-02, -5.675e-02, -5.487e-02)); + r += mul(s2_0, M4(6.275e-02, 3.332e-02, 2.458e-02, -1.910e-02, -1.764e-02, 2.292e-02, -3.220e-02, -1.127e-02, 4.114e-02, 4.303e-02, -3.355e-02, -8.882e-03, 1.881e-02, 1.788e-02, -3.354e-03, -1.345e-02)); + r += mul(s2_1, M4(-1.562e-01, -7.407e-02, -5.684e-02, -3.194e-03, 1.150e-01, -2.700e-02, -9.666e-03, -3.629e-02, 5.862e-02, 6.747e-02, -1.085e-02, -3.454e-02, 7.263e-05, 2.167e-02, 5.491e-03, -6.472e-02)); + r += mul(s2_2, M4(5.068e-03, 4.899e-02, 1.480e-02, -2.153e-02, 1.102e-02, 2.831e-02, -5.931e-03, 1.021e-02, -1.267e-02, -1.569e-02, 5.418e-04, 1.030e-02, -3.280e-02, -3.072e-02, -2.688e-02, -2.208e-02)); + r += mul(s2_3, M4(-7.105e-02, 1.664e-03, -3.108e-02, 6.985e-02, 3.176e-02, 2.312e-02, -3.835e-02, 3.884e-02, -1.038e-01, 6.660e-02, -1.372e-01, 2.432e-02, -2.888e-04, -2.049e-02, 2.271e-02, 9.383e-03)); + r += mul(s2_4, M4(4.697e-01, -3.721e-01, 1.705e-01, -2.767e-01, -1.791e-02, -7.276e-02, 2.503e-01, 1.040e-01, 1.180e-02, -5.212e-01, 4.014e-01, 1.946e-01, -2.547e-02, -1.567e-02, -5.652e-02, 9.687e-02)); + r += mul(s2_5, M4(3.024e-02, 1.618e-02, 2.619e-02, 8.868e-02, -5.217e-02, -7.642e-02, -3.704e-02, -2.374e-02, -4.639e-02, 5.743e-02, -3.967e-02, -2.450e-02, 2.091e-02, -1.108e-02, 6.949e-03, -1.502e-02)); + r += mul(s2_6, M4(5.298e-03, -6.810e-03, -1.982e-02, 1.960e-04, 3.645e-03, 5.483e-03, 3.357e-03, 3.697e-02, -1.339e-02, 3.253e-02, 3.649e-02, 4.492e-03, 2.076e-02, -9.046e-03, 2.043e-02, -7.803e-03)); + r += mul(s2_7, M4(-2.707e-02, 7.878e-02, 1.816e-01, -1.506e-03, 9.060e-03, -1.418e-02, -6.983e-02, -5.833e-02, 3.309e-02, -2.537e-02, -3.298e-01, -1.735e-01, -2.132e-03, 5.241e-02, 1.155e-02, 4.817e-02)); + r += mul(s2_8, M4(-1.781e-02, 1.652e-02, -7.188e-03, 2.114e-03, -1.105e-02, -1.137e-02, -9.037e-03, -5.600e-02, -1.220e-02, 8.292e-03, -3.404e-03, -4.211e-02, -1.018e-02, -1.004e-02, 1.505e-03, -4.591e-03)); + r += mul(s3_0, M4(7.349e-02, 2.926e-02, 2.398e-02, -1.821e-02, -1.290e-02, 1.201e-02, 5.000e-03, 1.316e-02, -1.567e-02, 2.025e-02, -2.171e-02, -3.941e-04, -7.948e-03, 6.116e-02, -9.445e-03, 1.911e-02)); + r += mul(s3_1, M4(-1.294e-01, -6.121e-02, -4.576e-02, 9.211e-03, 1.371e-02, -1.964e-02, -3.133e-03, 4.701e-03, 9.544e-02, 6.692e-03, 4.665e-04, -2.056e-02, 3.455e-01, -2.495e-01, 1.027e-02, -7.393e-02)); + r += mul(s3_2, M4(1.532e-02, 9.402e-03, 6.812e-04, -3.241e-02, 1.245e-03, 6.504e-03, 3.970e-03, 7.168e-03, 9.435e-03, 1.574e-02, -5.118e-03, 5.232e-03, -2.659e-02, -6.011e-02, -2.446e-02, 8.062e-04)); + r += mul(s3_3, M4(-6.714e-02, 3.454e-03, -1.486e-02, 5.921e-02, 5.177e-02, 3.766e-02, -1.473e-01, 4.371e-02, -7.118e-02, 2.462e-02, -1.810e-02, 3.430e-02, -5.552e-02, 3.047e-02, -5.066e-02, 5.769e-02)); + r += mul(s3_4, M4(3.191e-02, -1.387e-01, -5.992e-02, -1.554e-01, 4.660e-01, 3.655e-01, 2.406e-02, -3.902e-01, 3.973e-02, -1.333e-01, 1.792e-01, 8.854e-02, 2.477e-01, -3.115e-01, 6.035e-01, -4.717e-01)); + r += mul(s3_5, M4(7.241e-02, 1.273e-01, 6.810e-02, 1.118e-01, -5.454e-02, -1.728e-02, -1.007e-01, -2.265e-02, -4.534e-02, -5.171e-02, -2.524e-02, -3.337e-02, -2.366e-03, -1.723e-02, 2.300e-02, -9.889e-02)); + r += mul(s3_6, M4(3.383e-02, -7.898e-03, 1.681e-02, -5.131e-03, 3.687e-02, 1.929e-02, -7.695e-03, 2.145e-03, -2.814e-02, 3.366e-02, -8.788e-02, 3.614e-02, 2.951e-02, -6.964e-03, 2.272e-02, 1.581e-02)); + r += mul(s3_7, M4(7.020e-03, 6.046e-02, 2.975e-02, 5.663e-02, 2.155e-02, -1.786e-02, -2.588e-01, -1.310e-01, -6.372e-02, -1.218e-01, -7.160e-02, -3.058e-01, 2.297e-03, 3.050e-02, -2.346e-02, 4.674e-02)); + r += mul(s3_8, M4(-1.071e-02, -1.089e-02, 9.286e-03, 5.202e-02, -2.291e-02, -2.655e-02, 2.386e-02, -3.231e-02, 4.599e-03, 1.114e-02, -1.630e-02, -1.693e-02, -2.194e-03, 1.842e-02, -2.522e-02, 5.265e-02)); + r += V4(-1.667e-03, -2.914e-03, -1.783e-03, -1.113e-03); + return tanh(r); +} + +void Pass6(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = (Rmp8x8(tid.x) << 1) + blockStart; + uint2 size = GetOutputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = ((gxy >> 1) + 0.5) * pt; + + V4 s0_0 = l0(-1.0, -1.0); + V4 s0_1 = l0(0.0, -1.0); + V4 s0_2 = l0(1.0, -1.0); + V4 s0_3 = l0(-1.0, 0.0); + V4 s0_4 = l0(0.0, 0.0); + V4 s0_5 = l0(1.0, 0.0); + V4 s0_6 = l0(-1.0, 1.0); + V4 s0_7 = l0(0.0, 1.0); + V4 s0_8 = l0(1.0, 1.0); + V4 s1_0 = -max(-s0_0, 0.0); + V4 s1_1 = -max(-s0_1, 0.0); + V4 s1_2 = -max(-s0_2, 0.0); + V4 s1_3 = -max(-s0_3, 0.0); + V4 s1_4 = -max(-s0_4, 0.0); + V4 s1_5 = -max(-s0_5, 0.0); + V4 s1_6 = -max(-s0_6, 0.0); + V4 s1_7 = -max(-s0_7, 0.0); + V4 s1_8 = -max(-s0_8, 0.0); + s0_0 = max(s0_0, 0.0); + s0_1 = max(s0_1, 0.0); + s0_2 = max(s0_2, 0.0); + s0_3 = max(s0_3, 0.0); + s0_4 = max(s0_4, 0.0); + s0_5 = max(s0_5, 0.0); + s0_6 = max(s0_6, 0.0); + s0_7 = max(s0_7, 0.0); + s0_8 = max(s0_8, 0.0); + + V4 s2_0 = l1(-1.0, -1.0); + V4 s2_1 = l1(0.0, -1.0); + V4 s2_2 = l1(1.0, -1.0); + V4 s2_3 = l1(-1.0, 0.0); + V4 s2_4 = l1(0.0, 0.0); + V4 s2_5 = l1(1.0, 0.0); + V4 s2_6 = l1(-1.0, 1.0); + V4 s2_7 = l1(0.0, 1.0); + V4 s2_8 = l1(1.0, 1.0); + V4 s3_0 = -max(-s2_0, 0.0); + V4 s3_1 = -max(-s2_1, 0.0); + V4 s3_2 = -max(-s2_2, 0.0); + V4 s3_3 = -max(-s2_3, 0.0); + V4 s3_4 = -max(-s2_4, 0.0); + V4 s3_5 = -max(-s2_5, 0.0); + V4 s3_6 = -max(-s2_6, 0.0); + V4 s3_7 = -max(-s2_7, 0.0); + V4 s3_8 = -max(-s2_8, 0.0); + s2_0 = max(s2_0, 0.0); + s2_1 = max(s2_1, 0.0); + s2_2 = max(s2_2, 0.0); + s2_3 = max(s2_3, 0.0); + s2_4 = max(s2_4, 0.0); + s2_5 = max(s2_5, 0.0); + s2_6 = max(s2_6, 0.0); + s2_7 = max(s2_7, 0.0); + s2_8 = max(s2_8, 0.0); + + V4 r = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8); + + static const float3x3 rgb2yuv = {0.299, 0.587, 0.114, -0.169, -0.331, 0.5, 0.5, -0.419, -0.081}; + static const float3x3 yuv2rgb = {1, -0.00093, 1.401687, 1, -0.3437, -0.71417, 1, 1.77216, 0.00099}; + float2 opt = float2(GetOutputPt()); + + pos -= 0.5f * opt; + float3 yuv = mul(rgb2yuv, INPUT.SampleLevel(SL, pos, 0).rgb); + OUTPUT[gxy] = float4(mul(yuv2rgb, float3(saturate(yuv.r + r.x), yuv.yz)), 1); + + ++gxy.x; + pos.x += opt.x; + yuv = mul(rgb2yuv, INPUT.SampleLevel(SL, pos, 0).rgb); + OUTPUT[gxy] = float4(mul(yuv2rgb, float3(saturate(yuv.r + r.y), yuv.yz)), 1); + + ++gxy.y; + pos.y += opt.y; + yuv = mul(rgb2yuv, INPUT.SampleLevel(SL, pos, 0).rgb); + OUTPUT[gxy] = float4(mul(yuv2rgb, float3(saturate(yuv.r + r.w), yuv.yz)), 1); + + --gxy.x; + pos.x -= opt.x; + yuv = mul(rgb2yuv, INPUT.SampleLevel(SL, pos, 0).rgb); + OUTPUT[gxy] = float4(mul(yuv2rgb, float3(saturate(yuv.r + r.z), yuv.yz)), 1); +} diff --git a/src/Effects/CuNNy/CuNNy-4x8C-NVL.hlsl b/src/Effects/CuNNy/CuNNy-4x8C-NVL.hlsl new file mode 100644 index 000000000..8bc45dba2 --- /dev/null +++ b/src/Effects/CuNNy/CuNNy-4x8C-NVL.hlsl @@ -0,0 +1,921 @@ +// CuNNy 4x8C BILINEAR RGB NVL - https://github.com/cunnyplapper/CuNNy + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +//!MAGPIE EFFECT +//!VERSION 4 +//!SORT_NAME CuNNy-D08N04 + +//!TEXTURE +Texture2D INPUT; + +//!TEXTURE +//!WIDTH INPUT_WIDTH * 2 +//!HEIGHT INPUT_HEIGHT * 2 +Texture2D OUTPUT; + +//!SAMPLER +//!FILTER POINT +SamplerState SP; + +//!SAMPLER +//!FILTER LINEAR +SamplerState SL; + +//!COMMON +#define O(t, p) t.SampleLevel(SP, pos + p * pt, 0) +#define V4 min16float4 +#define M4 min16float4x4 + +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +//!FORMAT R8G8B8A8_SNORM +Texture2D t0; + +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +//!FORMAT R8G8B8A8_SNORM +Texture2D t1; + +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +//!FORMAT R8G8B8A8_SNORM +Texture2D t2; + +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +//!FORMAT R8G8B8A8_SNORM +Texture2D t3; + +//!PASS 1 +//!DESC in +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 +//!IN INPUT +//!OUT t0, t1 + +#define l0(x, y) min16float((dot(float3(2.329e-01, 4.438e-01, 9.598e-02), O(INPUT, float2(x, y)).rgb) + -5.664e-01)) + +V4 f0(min16float s0_0, min16float s0_1, min16float s0_2, min16float s0_3, min16float s0_4, min16float s0_5, min16float s0_6, min16float s0_7, min16float s0_8) { + V4 r = 0.0; + r += V4(-1.368e-01, -5.123e-02, -2.270e-01, -9.888e-02) * s0_0; + r += V4(3.682e-01, 4.625e-02, 1.372e-01, 3.834e-01) * s0_1; + r += V4(-9.245e-02, 7.555e-03, 3.923e-02, 1.252e-02) * s0_2; + r += V4(-2.312e-01, 2.012e-02, 1.660e-01, 4.386e-01) * s0_3; + r += V4(-3.965e-02, -4.834e-01, 3.729e-01, -7.207e-01) * s0_4; + r += V4(2.190e-01, -9.021e-02, -1.087e-01, -9.632e-03) * s0_5; + r += V4(4.088e-02, 1.183e-01, 8.976e-02, -1.710e-03) * s0_6; + r += V4(-5.188e-03, 5.274e-01, -8.856e-02, -6.446e-03) * s0_7; + r += V4(-7.160e-02, -9.349e-02, -3.823e-01, 1.947e-03) * s0_8; + r += V4(3.244e-02, 2.492e-04, 8.562e-04, 1.261e-04); + return r; +} + +V4 f1(min16float s0_0, min16float s0_1, min16float s0_2, min16float s0_3, min16float s0_4, min16float s0_5, min16float s0_6, min16float s0_7, min16float s0_8) { + V4 r = 0.0; + r += V4(2.403e-02, 8.569e-03, -8.618e-02, 2.022e-02) * s0_0; + r += V4(4.893e-01, 2.383e-02, 2.423e-02, -3.486e-01) * s0_1; + r += V4(-3.682e-02, 2.437e-03, 1.872e-01, 1.135e-01) * s0_2; + r += V4(-2.361e-02, 2.588e-02, 7.348e-02, -8.229e-03) * s0_3; + r += V4(-4.433e-01, -5.131e-01, -3.778e-01, 6.107e-02) * s0_4; + r += V4(-4.423e-02, 2.098e-02, 9.260e-03, 4.444e-02) * s0_5; + r += V4(-1.370e-02, 1.009e-02, 3.020e-01, 1.159e-02) * s0_6; + r += V4(-3.030e-03, 8.145e-03, -2.789e-02, -7.085e-03) * s0_7; + r += V4(2.648e-02, 4.731e-03, -1.067e-01, -4.477e-03) * s0_8; + r += V4(-1.971e-02, 8.202e-02, 4.706e-03, -6.665e-02); + return r; +} + +void Pass1(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = Rmp8x8(tid.x) + blockStart; + uint2 size = GetInputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = (gxy + 0.5) * pt; + + min16float s0_0 = l0(-1.0, -1.0); + min16float s0_1 = l0(0.0, -1.0); + min16float s0_2 = l0(1.0, -1.0); + min16float s0_3 = l0(-1.0, 0.0); + min16float s0_4 = l0(0.0, 0.0); + min16float s0_5 = l0(1.0, 0.0); + min16float s0_6 = l0(-1.0, 1.0); + min16float s0_7 = l0(0.0, 1.0); + min16float s0_8 = l0(1.0, 1.0); + + t0[gxy] = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8); + t1[gxy] = f1(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8); +} + +//!PASS 2 +//!DESC conv1 +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 +//!IN t0, t1 +//!OUT t2, t3 + +#define l0(x, y) V4(O(t0, float2(x, y))) +#define l1(x, y) V4(O(t1, float2(x, y))) + +V4 f0(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8) { + V4 r = 0.0; + r += mul(s0_0, M4(1.205e-01, 8.504e-02, -7.328e-02, 1.539e-01, -9.103e-03, -2.708e-02, -1.401e-01, -2.159e-01, -2.552e-01, 7.462e-02, 5.919e-02, 8.905e-02, 1.169e-01, -4.383e-03, -1.997e-01, -1.379e-01)); + r += mul(s0_1, M4(2.844e-02, 2.238e-02, 2.143e-01, -1.624e-01, 1.885e-01, 1.316e-01, -1.276e-01, -1.713e-01, 2.553e-03, -1.343e-01, 4.700e-02, 4.762e-01, -2.676e-01, 1.784e-01, -4.065e-02, 1.015e-01)); + r += mul(s0_2, M4(-4.442e-03, 3.253e-01, 2.650e-02, -2.907e-01, 2.749e-01, -3.510e-01, 8.545e-02, -2.446e-01, -1.579e-01, 9.398e-02, -4.544e-02, -9.123e-02, -2.529e-01, -2.538e-01, -2.686e-01, 2.607e-01)); + r += mul(s0_3, M4(1.518e-01, -1.515e-01, -1.597e-01, 2.163e-01, -6.933e-02, 7.220e-02, 2.114e-01, -2.227e-01, -3.743e-01, 9.056e-02, 2.612e-02, 3.036e-01, -1.583e-02, -8.293e-02, -1.068e-01, 6.201e-02)); + r += mul(s0_4, M4(-2.305e-02, 9.029e-02, -1.003e-01, -2.375e-01, -1.891e-01, 3.623e-01, -2.999e-01, -4.511e-01, 1.460e-01, -3.825e-01, 1.231e-01, 6.391e-01, -6.041e-01, 5.588e-01, -3.508e-01, -3.131e-01)); + r += mul(s0_5, M4(8.812e-02, 2.197e-01, -8.630e-03, 2.287e-02, -1.918e-01, -6.428e-01, 1.496e-01, 2.272e-01, 3.445e-02, -7.188e-03, -8.518e-02, 1.948e-01, 1.606e-01, -8.707e-01, 2.092e-02, -4.993e-01)); + r += mul(s0_6, M4(9.718e-03, 8.373e-03, 7.436e-02, -1.552e-01, 8.410e-02, -1.728e-02, -1.971e-01, 2.255e-02, -8.645e-02, 1.863e-02, -9.399e-02, -8.424e-02, -1.533e-03, 1.223e-01, 2.715e-01, -1.268e-01)); + r += mul(s0_7, M4(-4.246e-01, -1.034e-01, 3.236e-01, 5.680e-01, -1.213e-02, 1.577e-01, -9.408e-02, -7.294e-02, -6.410e-02, 4.264e-02, -8.392e-03, 2.192e-01, 1.656e-01, 4.681e-02, 9.146e-01, -6.311e-02)); + r += mul(s0_8, M4(-1.847e-01, -9.105e-02, -3.260e-02, 2.506e-01, -6.470e-02, 4.430e-02, -1.242e-02, -1.097e-01, 5.488e-02, 9.106e-02, 3.144e-02, -3.367e-05, 2.468e-01, -2.535e-01, 1.409e-01, -5.311e-01)); + r += mul(s1_0, M4(1.294e-01, 1.098e-01, 7.497e-03, 1.016e-01, 1.377e-02, -1.480e-02, -2.694e-02, -3.417e-02, -1.083e-01, -2.575e-03, 1.137e-01, -2.616e-01, -1.260e-01, -2.567e-02, -1.958e-01, 6.103e-02)); + r += mul(s1_1, M4(-1.355e-01, 1.168e-01, 2.368e-01, -2.379e-01, 8.556e-01, 1.401e-01, 3.238e-01, 2.737e-01, 8.041e-02, -1.662e-01, 9.181e-02, -3.488e-01, -1.586e-01, 1.407e-01, -1.126e-01, 1.825e-01)); + r += mul(s1_2, M4(-1.881e-02, 4.604e-01, -1.712e-02, 3.453e-02, 3.171e-01, -1.126e-01, 6.510e-02, 2.908e-01, -9.125e-02, 7.793e-02, -5.580e-02, -3.603e-01, 9.996e-02, -2.647e-01, -2.114e-01, 2.330e-01)); + r += mul(s1_3, M4(2.957e-01, -1.252e-01, -2.840e-01, 1.815e-01, -2.900e-01, 1.027e-01, 1.404e-01, -1.123e-01, -1.767e-01, 1.535e-03, -3.568e-03, -2.824e-01, 2.015e-01, -7.712e-02, -6.140e-02, 6.517e-02)); + r += mul(s1_4, M4(-2.439e-01, 7.096e-02, -2.116e-01, -1.980e-01, -3.221e-01, 2.007e-01, -4.243e-01, -5.013e-01, 1.181e-01, -3.735e-01, 1.812e-01, -5.095e-01, 3.646e-01, 4.013e-01, -8.028e-02, 1.287e-01)); + r += mul(s1_5, M4(-8.389e-02, -1.091e-01, 6.962e-02, 2.605e-01, -3.435e-03, -5.146e-01, 4.125e-01, 5.487e-01, -1.481e-01, 6.810e-02, -1.450e-01, -9.583e-02, 3.305e-01, -1.238e+00, 2.036e-01, 1.879e-01)); + r += mul(s1_6, M4(-8.033e-02, 5.944e-03, 2.453e-01, -2.971e-01, -5.652e-02, -1.251e-02, -1.449e-01, -5.344e-02, -1.377e-01, 9.383e-03, -1.862e-01, -2.528e-01, -3.825e-02, 7.296e-02, 2.373e-01, -1.935e-01)); + r += mul(s1_7, M4(-1.795e-01, 1.597e-01, 2.709e-01, -3.738e-01, 2.604e-02, 1.678e-01, -8.718e-02, -9.483e-03, -3.844e-02, 6.235e-02, -1.344e-01, 1.837e-02, -3.074e-02, 2.568e-02, 1.030e+00, 1.831e-01)); + r += mul(s1_8, M4(4.299e-02, 6.530e-03, -2.571e-02, 3.382e-01, -1.327e-01, 2.975e-02, -2.861e-02, 1.963e-01, 8.130e-04, 9.743e-02, -1.177e-02, -1.273e-01, -1.265e-01, -3.003e-01, 2.635e-01, 5.426e-02)); + r += mul(s2_0, M4(-1.538e-01, 1.580e-01, 1.392e-01, -1.077e-01, -1.228e-01, 1.853e-01, -1.010e-01, 3.144e-02, 2.203e-01, -3.309e-02, 6.819e-02, 2.708e-01, 1.720e-01, 2.635e-01, -1.290e-01, -2.932e-01)); + r += mul(s2_1, M4(1.615e-01, -1.424e-01, -2.346e-01, -1.008e-01, 1.386e-01, -2.281e-01, -1.313e-01, -5.902e-02, -3.376e-02, 1.925e-01, -1.172e-01, 7.865e-02, 2.112e-01, -7.280e-02, -1.953e-01, -1.198e-02)); + r += mul(s2_2, M4(1.280e-01, -1.353e-01, 1.251e-01, 3.212e-02, -1.144e-01, -1.492e-01, -1.499e-01, 2.211e-01, 1.307e-01, 1.336e-01, 1.977e-01, -1.429e-02, -5.395e-02, -2.772e-02, -3.214e-01, -1.907e-01)); + r += mul(s2_3, M4(-2.703e-01, 3.122e-01, 1.951e-01, -2.005e-01, 1.463e-01, 3.000e-01, 1.058e-01, 8.352e-02, 1.567e-01, -1.256e-01, -1.854e-01, -2.018e-01, 3.248e-01, 8.780e-02, 1.586e-01, -9.757e-03)); + r += mul(s2_4, M4(3.941e-02, -1.430e-01, 1.023e-01, 2.878e-01, 8.414e-02, 1.385e-01, 8.032e-02, -6.330e-02, -1.020e-01, 2.731e-01, -6.877e-02, -3.492e-01, 3.758e-01, -7.526e-02, 4.955e-01, -5.595e-01)); + r += mul(s2_5, M4(2.684e-01, -1.924e-02, -2.975e-02, 7.205e-01, 6.611e-02, -1.645e-01, 1.267e-01, 6.066e-02, 1.695e-01, -4.367e-01, -1.450e-01, -4.074e-02, 4.469e-01, -7.176e-03, 4.177e-01, -4.565e-01)); + r += mul(s2_6, M4(-1.843e-01, 2.522e-01, 3.324e-01, -1.821e-01, -1.327e-01, 1.182e-01, 1.158e-01, -2.494e-01, -6.459e-03, -6.606e-03, 1.333e-01, 2.229e-01, 2.481e-01, -2.018e-01, 2.456e-01, 2.351e-01)); + r += mul(s2_7, M4(-6.894e-03, -2.822e-01, -1.863e-01, -2.252e-01, 6.755e-02, -1.766e-01, 8.884e-02, -2.720e-03, -4.431e-02, -2.119e-02, 2.876e-01, -5.268e-01, -3.635e-01, -1.001e-01, -8.433e-01, 5.160e-01)); + r += mul(s2_8, M4(-1.786e-01, 2.208e-01, 4.289e-01, 1.663e-01, -2.341e-01, 8.148e-03, -7.557e-02, 7.817e-02, -1.340e-01, -2.341e-01, 3.123e-02, 1.120e-01, -7.753e-01, 2.056e-01, -2.926e-01, -1.222e-01)); + r += mul(s3_0, M4(-4.903e-02, 1.377e-01, 6.984e-02, -1.053e-02, -5.115e-01, 2.891e-01, -4.612e-01, -6.693e-01, 4.752e-02, -5.287e-02, -2.183e-02, 4.134e-01, 1.073e-02, 2.383e-01, -2.142e-01, 1.384e-01)); + r += mul(s3_1, M4(1.680e-01, -1.307e-01, -1.038e-01, -2.130e-02, -1.231e+00, -2.602e-01, -5.456e-01, 3.295e-01, -5.588e-02, 1.505e-01, -4.784e-02, -1.493e-01, 1.202e-01, -2.349e-01, -1.452e-01, -5.111e-02)); + r += mul(s3_2, M4(-8.858e-02, -1.293e-01, 9.441e-02, -1.295e-01, -3.373e-01, -1.841e-01, -1.818e-01, 1.570e+00, -8.336e-02, 2.012e-01, 1.362e-01, 1.830e-01, -6.053e-02, -1.725e-03, -2.011e-01, -1.021e-01)); + r += mul(s3_3, M4(-2.017e-01, 3.505e-01, 3.541e-02, 2.044e-01, -3.839e-01, 5.124e-01, 1.104e-01, 1.311e-01, 1.022e-01, -1.111e-01, -2.883e-01, 1.086e-01, 9.932e-02, 1.308e-01, 2.954e-01, -1.416e-02)); + r += mul(s3_4, M4(6.088e-02, -4.532e-02, -1.302e-01, -1.067e-01, -4.196e+00, 7.383e-01, -2.786e-01, -2.053e+00, -3.758e-01, 2.955e-01, -1.898e-01, 1.875e-01, 1.263e-01, 9.931e-03, 1.016e-01, 5.201e-02)); + r += mul(s3_5, M4(9.722e-03, -5.478e-02, -1.823e-01, -3.983e-02, -2.434e+00, -4.700e-01, 4.168e-01, 3.938e-01, 1.251e-01, -2.933e-01, -2.054e-02, 8.827e-02, 2.048e-02, 6.212e-02, 1.448e-01, 1.042e-01)); + r += mul(s3_6, M4(-1.605e-02, 1.851e-01, 2.427e-01, 4.894e-02, -6.032e-01, -3.413e-02, 4.158e-01, 6.903e-01, -1.865e-02, -1.318e-02, 1.003e-01, 3.193e-01, 4.503e-02, 1.880e-01, -4.608e-02, -3.137e-01)); + r += mul(s3_7, M4(-4.125e-02, -1.494e-01, 8.853e-01, -1.540e-01, -2.445e-01, 2.292e-01, 1.684e+00, 1.098e+00, 5.576e-02, -8.241e-02, 2.507e-01, -1.086e-01, 1.392e-01, -2.115e-01, -2.600e-01, 9.268e-02)); + r += mul(s3_8, M4(5.677e-02, 9.206e-02, 5.863e-02, 5.663e-02, -2.019e+00, -1.006e-01, -1.769e-01, -3.617e-01, 1.293e-02, -2.766e-01, 2.843e-02, 3.331e-01, -2.316e-01, -1.762e-01, -6.013e-03, -2.482e-02)); + r += V4(3.430e-02, -1.031e-02, -1.631e-02, -3.189e-02); + return r; +} + +V4 f1(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8) { + V4 r = 0.0; + r += mul(s0_0, M4(3.260e-02, 1.675e-01, 8.130e-02, -2.153e-01, -1.987e-01, -9.443e-02, 3.512e-01, 2.289e-02, 9.481e-02, -1.921e-01, -3.818e-01, 1.373e-01, -9.032e-02, 7.892e-02, 1.392e-01, -6.033e-02)); + r += mul(s0_1, M4(-8.203e-02, -1.015e-01, -1.313e-02, -5.337e-02, -2.948e-01, -2.678e-01, -2.321e-01, -5.995e-01, 1.364e-01, 1.030e-01, 1.546e-01, -1.179e-02, 1.996e-01, 2.244e-01, -2.304e-01, -1.304e-02)); + r += mul(s0_2, M4(-2.319e-02, -2.236e-02, 3.976e-02, 1.804e-01, 6.474e-02, 1.315e-01, -1.456e-02, -1.538e-01, 3.061e-02, -1.998e-02, -1.918e-02, -8.662e-02, -1.980e-01, -1.596e-01, -4.624e-01, -3.728e-01)); + r += mul(s0_3, M4(-3.171e-03, -2.887e-02, 3.107e-01, -8.532e-02, 1.489e-02, -2.798e-01, -2.458e-02, 2.922e-01, 5.196e-02, 2.333e-02, -4.100e-01, 3.851e-01, 8.566e-02, 1.655e-01, 3.680e-01, -3.572e-01)); + r += mul(s0_4, M4(4.618e-02, -3.100e-02, -1.849e-01, 2.228e-02, -2.182e-01, -5.806e-01, -6.298e-02, 2.421e-01, 4.266e-01, 7.738e-02, 4.856e-03, -1.191e-01, 3.469e-01, -8.683e-02, -2.397e-01, 6.512e-02)); + r += mul(s0_5, M4(8.363e-02, -9.745e-02, 2.398e-01, -1.335e-01, -1.585e-01, -1.161e-02, 2.482e-02, 1.319e-03, -4.696e-02, -6.675e-02, -7.519e-02, 1.125e-01, -1.199e-01, -9.094e-03, -2.590e-01, -8.812e-01)); + r += mul(s0_6, M4(7.745e-02, 3.414e-02, 6.378e-02, -8.388e-02, 4.456e-02, 1.354e-02, -1.138e-02, 1.131e-01, 2.361e-01, 1.828e-01, -2.135e-01, -1.100e-02, 1.683e-01, 2.134e-01, 1.832e-01, 8.420e-02)); + r += mul(s0_7, M4(-3.223e-01, -4.870e-02, -1.457e-01, 1.996e-01, -1.632e-01, -1.811e-01, -1.625e-01, 4.046e-02, -8.959e-02, 1.432e-01, -2.360e-02, -9.415e-02, -1.547e-01, 1.379e-01, 5.098e-01, -4.069e-01)); + r += mul(s0_8, M4(1.568e-01, -2.510e-02, -9.894e-02, 1.124e-01, -1.372e-01, 5.952e-03, 4.501e-02, 9.591e-03, 1.430e-01, 6.422e-02, -1.412e-03, 1.042e-02, 4.601e-02, -5.133e-02, -7.936e-02, -1.621e-01)); + r += mul(s1_0, M4(1.380e-01, 1.774e-01, 2.958e-01, -2.044e-01, -2.085e-01, 7.192e-03, -7.903e-02, 6.119e-02, -3.542e-02, -1.060e-01, -1.832e-01, 3.603e-01, -3.854e-02, 5.092e-02, -1.092e-01, -2.074e-01)); + r += mul(s1_1, M4(-5.638e-02, -1.659e-01, -1.006e-02, 5.355e-02, -2.243e-01, 3.533e-01, -2.130e-01, 6.480e-02, 4.462e-02, 1.065e-01, 1.598e-01, 5.025e-03, -3.810e-02, 1.012e-01, 2.123e-02, 2.124e-01)); + r += mul(s1_2, M4(5.207e-02, -1.428e-01, 1.745e-01, 2.563e-01, 4.058e-01, 5.320e-02, 3.527e-03, -4.664e-02, -1.641e-03, -2.830e-02, 1.453e-02, 1.169e-01, -5.840e-01, -1.545e-01, 3.880e-01, 1.250e-01)); + r += mul(s1_3, M4(-2.089e-01, 3.070e-02, 3.770e-01, -2.868e-01, -1.965e-01, -2.499e-01, -2.145e-01, 5.348e-02, -1.201e-01, -3.454e-01, -5.723e-01, 4.313e-01, -7.068e-02, -6.358e-02, -2.426e-02, -2.841e-01)); + r += mul(s1_4, M4(1.315e-01, 2.464e-01, -2.505e-01, -1.589e-01, 4.124e-01, 4.860e-01, -2.493e-01, 1.201e-01, -1.304e-01, -1.620e-01, 2.228e-01, 4.485e-02, 6.945e-02, -2.261e-01, -8.190e-04, 5.678e-01)); + r += mul(s1_5, M4(3.529e-01, 1.800e-02, -9.794e-02, -1.160e-01, 7.052e-01, 4.176e-01, 5.822e-02, -5.300e-02, -1.144e-01, -1.890e-01, 1.337e-01, 1.163e-01, -5.024e-01, 9.977e-01, 1.831e-01, 2.166e-02)); + r += mul(s1_6, M4(-1.239e-01, 1.465e-01, 3.700e-01, -1.638e-01, -1.022e-01, -3.216e-02, -2.412e-02, -2.505e-02, 5.450e-02, -1.325e-02, -2.760e-01, 5.219e-02, -5.604e-02, 3.602e-02, -1.026e-01, 4.063e-02)); + r += mul(s1_7, M4(1.669e-01, 2.580e-01, -2.923e-01, -2.497e-01, 1.135e-01, -1.599e-01, -2.419e-01, -1.202e-01, -3.903e-01, -2.141e-01, 9.642e-02, -6.096e-02, -6.762e-01, 5.614e-01, 3.076e-01, -4.187e-01)); + r += mul(s1_8, M4(5.456e-02, -6.641e-02, -3.839e-01, 8.629e-02, 1.149e-01, 1.204e-02, -2.509e-02, -1.413e-03, -1.329e-02, -5.670e-02, -6.186e-02, 5.108e-02, 3.592e-02, 4.563e-01, -7.450e-02, -2.259e-01)); + r += mul(s2_0, M4(1.013e-01, -2.126e-02, -1.260e-01, 8.480e-03, -3.292e-02, 6.069e-04, 4.154e-02, 5.578e-02, 1.586e-02, 8.252e-02, 1.237e-01, -1.312e-01, 1.489e-01, 2.561e-01, -9.917e-02, -1.060e-01)); + r += mul(s2_1, M4(-1.285e-01, -8.314e-02, 1.521e-02, 1.037e-01, -1.021e-02, 7.112e-02, -2.319e-02, 7.051e-04, -1.101e-01, -1.896e-01, -2.458e-01, -7.399e-02, -4.133e-02, 1.606e-01, -1.511e-01, -2.425e-01)); + r += mul(s2_2, M4(7.543e-02, 9.235e-02, 2.139e-01, 2.879e-01, 9.583e-02, 4.372e-02, -8.231e-02, 2.498e-01, 1.241e-01, 1.377e-02, 2.380e-01, 2.586e-02, -1.926e-01, -1.406e-01, -3.627e-01, -8.414e-02)); + r += mul(s2_3, M4(9.655e-03, -9.581e-02, -6.071e-02, 2.231e-01, -1.148e-01, -3.513e-02, -2.013e-02, -1.094e-01, -1.606e-01, 9.180e-02, 3.498e-01, -2.726e-01, -7.696e-03, -4.007e-01, -8.497e-02, -6.989e-01)); + r += mul(s2_4, M4(4.965e-03, -1.346e-01, -4.517e-02, 2.043e-01, -1.348e-01, 1.451e-01, 8.113e-02, -8.530e-02, -1.414e-01, 7.261e-02, -2.368e-01, 1.601e-01, -2.438e-02, -2.554e-01, 4.057e-01, -2.224e-01)); + r += mul(s2_5, M4(-8.716e-02, 1.496e-01, -4.429e-02, 6.451e-01, -9.547e-03, -3.189e-02, -1.096e-01, -5.416e-02, -5.032e-01, 1.331e-01, 2.389e-02, 1.028e-01, -3.186e-01, -2.524e-01, 2.663e-02, -9.995e-03)); + r += mul(s2_6, M4(-2.465e-01, 1.585e-01, 3.196e-01, -9.098e-02, 2.765e-02, -1.793e-01, 1.519e-01, -9.565e-04, -1.160e-01, -3.035e-02, -1.082e-01, 3.172e-02, 5.502e-01, -6.251e-01, -4.487e-01, 1.932e-01)); + r += mul(s2_7, M4(-5.017e-01, -5.180e-01, -2.682e-01, -4.715e-01, 1.958e-02, -7.007e-02, -3.332e-02, -8.389e-02, -1.135e-01, -2.956e-02, 1.994e-01, 2.315e-02, -2.553e-01, -3.153e-03, 4.275e-01, 1.669e+00)); + r += mul(s2_8, M4(1.400e-01, 6.775e-01, 5.287e-02, 2.007e-02, 1.213e-01, -1.460e-03, -2.313e-02, 1.282e-01, -8.355e-02, 2.399e-01, -5.277e-02, -1.499e-01, 7.246e-02, -2.553e-02, 2.185e-01, 8.662e-01)); + r += mul(s3_0, M4(3.069e-02, -3.668e-02, -3.646e-02, 1.140e-01, -7.882e-02, 2.759e-01, 9.170e-01, 2.779e-01, 1.459e-01, 3.766e-02, -1.214e-01, 5.718e-03, -3.323e-02, 9.705e-02, -1.282e-02, -1.401e-01)); + r += mul(s3_1, M4(-1.405e-02, 2.809e-02, 1.466e-01, -1.286e-01, 4.754e-01, 8.076e-01, 5.775e-02, -5.403e-01, 1.919e-01, -2.015e-01, -1.976e-01, -8.544e-02, -8.431e-02, 9.302e-02, 6.560e-02, 2.011e-02)); + r += mul(s3_2, M4(2.107e-01, 2.334e-02, -2.591e-01, -1.023e-01, 6.461e-01, 1.138e+00, 3.917e-01, 2.270e-01, 4.023e-01, 6.135e-02, 4.125e-02, -5.551e-02, 1.871e-02, -1.344e-01, -1.534e-01, 1.216e-01)); + r += mul(s3_3, M4(8.077e-02, -1.149e-01, 6.733e-02, -9.044e-03, -6.431e-02, -1.755e-02, 2.617e+00, 5.203e-01, 8.910e-02, 9.642e-02, 3.720e-01, -2.326e-01, -1.142e-01, -4.017e-02, 2.351e-01, -1.062e-01)); + r += mul(s3_4, M4(-2.427e-01, -4.425e-03, 4.260e-01, -6.273e-02, 4.224e+00, -2.047e+00, -1.911e+00, 2.329e+00, 2.987e-01, -3.286e-01, -1.115e-01, 2.053e-01, -5.309e-02, -8.751e-02, -1.275e-02, -2.105e-01)); + r += mul(s3_5, M4(-1.413e-02, -4.404e-01, -1.525e-01, -1.703e-01, -9.999e-01, 5.276e-01, 4.779e-01, -5.145e-01, 4.772e-01, 2.730e-02, -7.651e-02, -2.235e-01, -1.122e-01, -1.686e-01, 9.595e-02, -1.169e-01)); + r += mul(s3_6, M4(-1.162e-01, 3.109e-01, -2.686e-01, -1.492e-01, 2.122e-01, 6.911e-01, 7.412e-01, 3.675e-02, 1.420e-01, -3.979e-02, -3.526e-02, -1.170e-01, 2.192e-01, 6.369e-02, 2.568e-01, 1.606e-02)); + r += mul(s3_7, M4(-2.482e-02, 6.355e-01, 4.230e-01, -4.331e-01, -1.462e+00, -9.944e-01, 1.154e+00, 8.760e-01, 3.625e-01, 2.127e-01, 3.382e-01, 6.009e-02, 1.431e-01, 9.892e-02, -2.409e-01, 4.223e-02)); + r += mul(s3_8, M4(-1.832e-02, 7.811e-02, -1.928e-02, 1.448e-01, -1.288e+00, 1.805e-01, 6.324e-01, -2.704e-02, 6.456e-02, -6.364e-02, 4.971e-02, -6.535e-03, 1.766e-01, 5.142e-02, -1.375e-01, 2.532e-01)); + r += V4(8.007e-03, 2.570e-02, 2.487e-03, -2.496e-02); + return r; +} + +void Pass2(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = Rmp8x8(tid.x) + blockStart; + uint2 size = GetInputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = (gxy + 0.5) * pt; + + V4 s0_0 = l0(-1.0, -1.0); + V4 s0_1 = l0(0.0, -1.0); + V4 s0_2 = l0(1.0, -1.0); + V4 s0_3 = l0(-1.0, 0.0); + V4 s0_4 = l0(0.0, 0.0); + V4 s0_5 = l0(1.0, 0.0); + V4 s0_6 = l0(-1.0, 1.0); + V4 s0_7 = l0(0.0, 1.0); + V4 s0_8 = l0(1.0, 1.0); + V4 s1_0 = -max(-s0_0, 0.0); + V4 s1_1 = -max(-s0_1, 0.0); + V4 s1_2 = -max(-s0_2, 0.0); + V4 s1_3 = -max(-s0_3, 0.0); + V4 s1_4 = -max(-s0_4, 0.0); + V4 s1_5 = -max(-s0_5, 0.0); + V4 s1_6 = -max(-s0_6, 0.0); + V4 s1_7 = -max(-s0_7, 0.0); + V4 s1_8 = -max(-s0_8, 0.0); + s0_0 = max(s0_0, 0.0); + s0_1 = max(s0_1, 0.0); + s0_2 = max(s0_2, 0.0); + s0_3 = max(s0_3, 0.0); + s0_4 = max(s0_4, 0.0); + s0_5 = max(s0_5, 0.0); + s0_6 = max(s0_6, 0.0); + s0_7 = max(s0_7, 0.0); + s0_8 = max(s0_8, 0.0); + + V4 s2_0 = l1(-1.0, -1.0); + V4 s2_1 = l1(0.0, -1.0); + V4 s2_2 = l1(1.0, -1.0); + V4 s2_3 = l1(-1.0, 0.0); + V4 s2_4 = l1(0.0, 0.0); + V4 s2_5 = l1(1.0, 0.0); + V4 s2_6 = l1(-1.0, 1.0); + V4 s2_7 = l1(0.0, 1.0); + V4 s2_8 = l1(1.0, 1.0); + V4 s3_0 = -max(-s2_0, 0.0); + V4 s3_1 = -max(-s2_1, 0.0); + V4 s3_2 = -max(-s2_2, 0.0); + V4 s3_3 = -max(-s2_3, 0.0); + V4 s3_4 = -max(-s2_4, 0.0); + V4 s3_5 = -max(-s2_5, 0.0); + V4 s3_6 = -max(-s2_6, 0.0); + V4 s3_7 = -max(-s2_7, 0.0); + V4 s3_8 = -max(-s2_8, 0.0); + s2_0 = max(s2_0, 0.0); + s2_1 = max(s2_1, 0.0); + s2_2 = max(s2_2, 0.0); + s2_3 = max(s2_3, 0.0); + s2_4 = max(s2_4, 0.0); + s2_5 = max(s2_5, 0.0); + s2_6 = max(s2_6, 0.0); + s2_7 = max(s2_7, 0.0); + s2_8 = max(s2_8, 0.0); + + t2[gxy] = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8); + t3[gxy] = f1(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8); +} + +//!PASS 3 +//!DESC conv2 +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 +//!IN t2, t3 +//!OUT t0, t1 + +#define l0(x, y) V4(O(t2, float2(x, y))) +#define l1(x, y) V4(O(t3, float2(x, y))) + +V4 f0(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8) { + V4 r = 0.0; + r += mul(s0_0, M4(2.802e-01, -3.301e-02, -1.047e-01, 6.427e-02, 1.357e-02, -8.015e-02, 7.763e-02, -9.646e-02, 1.136e-01, -1.443e-01, -3.950e-02, 2.744e-01, 8.414e-03, -1.005e-01, -1.683e-01, -5.766e-02)); + r += mul(s0_1, M4(2.907e-01, 1.339e-01, -7.005e-02, 9.074e-02, -2.491e-03, 6.498e-02, 1.121e-01, -9.272e-02, 3.415e-01, 1.949e-01, -2.613e-01, -2.328e-01, 1.311e-01, 1.285e-01, 1.685e-02, -4.780e-02)); + r += mul(s0_2, M4(1.671e-01, -2.228e-02, -5.777e-02, -5.853e-02, 1.243e-02, -3.269e-02, 8.757e-03, -1.478e-01, -4.190e-02, 3.164e-02, 2.922e-01, -3.017e-01, -6.631e-02, 5.380e-02, -2.750e-02, -7.771e-02)); + r += mul(s0_3, M4(-2.454e-02, 2.148e-01, -1.116e-01, -1.125e-01, -1.792e-01, -7.021e-01, -2.183e-01, 2.920e-01, -1.698e-01, 1.827e-01, -6.779e-02, 9.333e-02, -2.153e-01, 2.441e-01, 9.794e-02, -2.729e-01)); + r += mul(s0_4, M4(-6.750e-02, 1.324e-01, -5.087e-02, 2.746e-01, 1.579e-01, -1.909e-01, -7.631e-01, -4.744e-01, -1.732e-01, -2.741e-01, 4.145e-02, -2.124e-01, 7.946e-02, -1.579e-01, 2.856e-01, 5.090e-02)); + r += mul(s0_5, M4(8.392e-02, -1.504e-01, 2.815e-01, -1.174e-01, 3.942e-02, 1.918e-02, 1.561e-01, -1.457e-01, -5.976e-02, 1.230e-01, -2.539e-01, -1.965e-01, 1.869e-01, -1.795e-01, -1.283e-01, -3.447e-02)); + r += mul(s0_6, M4(-3.547e-03, -6.576e-03, -5.087e-02, 3.466e-02, -3.130e-03, -3.176e-01, 8.737e-02, 4.018e-02, -6.489e-02, -1.580e-03, -8.784e-03, -4.500e-02, 2.343e-03, 5.945e-02, -5.201e-02, -3.127e-02)); + r += mul(s0_7, M4(-3.546e-02, 1.145e-01, -4.773e-02, 8.280e-02, 6.746e-03, -1.036e-01, -6.616e-02, -1.224e-01, 7.156e-02, -1.941e-01, 9.307e-02, -3.567e-02, -2.215e-01, 2.437e-01, -5.542e-04, 1.208e-01)); + r += mul(s0_8, M4(-1.115e-02, -4.687e-02, -3.210e-02, -1.470e-01, -4.609e-02, 4.657e-02, -6.476e-02, -1.372e-01, -4.956e-03, 1.024e-01, -2.349e-01, -8.472e-02, -2.757e-02, -1.707e-02, 2.065e-01, 1.863e-02)); + r += mul(s1_0, M4(3.728e-02, -7.100e-02, -4.937e-02, 6.239e-02, -7.377e-03, -3.033e-02, 1.675e-01, -1.863e-02, -2.631e-02, -9.633e-02, -1.130e-01, -1.201e-01, 1.414e-01, -1.737e-01, -8.031e-02, -6.951e-02)); + r += mul(s1_1, M4(-3.703e-02, 4.012e-02, -2.289e-02, 3.332e-02, 2.161e-02, 8.828e-02, 5.544e-02, 1.017e-01, 3.684e-01, 3.149e-01, 3.662e-01, 4.298e-02, 1.966e-01, -2.697e-02, 2.216e-02, 7.540e-02)); + r += mul(s1_2, M4(-4.974e-02, -3.826e-02, -2.810e-02, -8.318e-02, 3.356e-02, -7.605e-02, -1.087e-01, 1.987e-02, -1.153e-01, -1.039e-01, -5.868e-02, -3.313e-02, -1.750e-02, 3.884e-03, -9.170e-02, -1.011e-01)); + r += mul(s1_3, M4(2.119e-01, -1.340e-01, -3.650e-02, 2.219e-01, 3.634e-01, 3.474e-01, 2.302e-01, 7.494e-02, -2.253e-01, 1.239e-01, -6.032e-02, 1.293e-01, 9.583e-02, 4.424e-02, -3.920e-02, -1.870e-01)); + r += mul(s1_4, M4(-2.664e-01, 8.462e-02, -4.745e-01, 1.985e-01, 2.803e-01, 7.429e-02, 7.814e-01, 4.658e-01, 3.661e-01, -2.319e-02, 3.324e-01, 2.860e-01, 3.178e-01, 9.301e-02, 1.316e-01, 4.547e-02)); + r += mul(s1_5, M4(5.369e-02, 6.912e-02, 2.659e-01, -1.491e-01, 4.462e-02, -4.823e-02, 1.130e-01, 1.710e-02, -7.604e-02, -7.003e-02, 3.093e-01, 2.537e-01, 2.466e-01, -1.039e-01, 2.413e-02, -1.256e-01)); + r += mul(s1_6, M4(-1.188e-01, 1.026e-01, 4.215e-02, -9.677e-02, 2.443e-03, 1.957e-01, 2.961e-02, -5.553e-02, -3.488e-02, 2.515e-02, -4.840e-03, 1.814e-02, 9.644e-02, -8.802e-02, 3.516e-03, -2.940e-03)); + r += mul(s1_7, M4(-1.792e-01, 1.391e-01, 1.322e-02, -1.514e-02, -2.173e-01, 1.743e-01, 1.530e-01, 5.286e-02, -8.655e-02, 2.541e-01, 6.282e-02, 1.167e-01, 9.664e-02, 2.304e-01, -1.538e-01, -1.298e-01)); + r += mul(s1_8, M4(-1.720e-01, 4.693e-02, 2.790e-01, 2.187e-02, -4.386e-02, 7.714e-03, 9.800e-02, 6.484e-03, -5.497e-02, 1.216e-01, 3.924e-02, 5.162e-02, 1.403e-01, -5.364e-03, -6.795e-03, -6.163e-02)); + r += mul(s2_0, M4(2.905e-01, -3.799e-02, 1.332e-01, 2.496e-02, 7.202e-02, -3.659e-01, -2.940e-02, -1.028e-03, -1.221e-01, 1.147e-01, 3.613e-02, 9.125e-02, -8.760e-03, 1.489e-02, -9.652e-02, 4.452e-03)); + r += mul(s2_1, M4(4.027e-01, -2.178e-01, -8.478e-02, 2.903e-01, 2.463e-02, 9.527e-03, -2.835e-01, 2.066e-01, -6.698e-02, -2.653e-01, -6.667e-02, 4.320e-02, -2.610e-01, -1.351e-01, 7.826e-02, -5.429e-02)); + r += mul(s2_2, M4(-1.249e-01, 4.376e-02, -6.245e-02, 1.702e-01, -5.731e-02, 8.022e-02, -1.335e-01, 1.528e-01, -2.969e-02, 1.062e-01, -1.303e-01, 1.226e-01, 2.030e-02, 5.205e-02, -1.877e-01, 4.309e-02)); + r += mul(s2_3, M4(-6.329e-02, -1.286e-01, -7.222e-02, 5.592e-03, -3.023e-02, 9.502e-02, -4.077e-02, -2.299e-01, -1.038e-01, -5.742e-02, -5.106e-04, 5.143e-02, 3.098e-02, -1.235e-01, 1.987e-02, 1.477e-02)); + r += mul(s2_4, M4(1.113e-01, -1.761e-01, 5.038e-02, -1.304e-01, 3.668e-01, -3.430e-01, 2.169e-01, 3.877e-01, -3.750e-02, 2.473e-01, 3.416e-02, 2.184e-01, 5.168e-01, -7.132e-02, 3.818e-01, -1.508e-01)); + r += mul(s2_5, M4(1.479e-01, -8.656e-02, -1.700e-01, 3.874e-01, 2.286e-02, -8.854e-02, 3.305e-02, -4.668e-03, -1.481e-01, 5.115e-02, 2.686e-01, 4.113e-01, -3.740e-01, -2.013e-01, 9.838e-04, 3.008e-01)); + r += mul(s2_6, M4(3.428e-01, -3.200e-01, 7.593e-02, 1.911e-01, 1.219e-01, 1.211e-02, -5.694e-02, -5.767e-02, 3.119e-02, -7.609e-02, 6.471e-02, 1.215e-01, -2.793e-04, 1.650e-02, 7.190e-03, -4.468e-02)); + r += mul(s2_7, M4(3.970e-01, -3.192e-01, -5.639e-02, 8.182e-02, -2.831e-02, 4.036e-02, 7.004e-02, 1.095e-01, -3.655e-02, 2.443e-01, 5.606e-02, -4.974e-02, 9.825e-02, 1.158e-01, -5.104e-02, -2.986e-02)); + r += mul(s2_8, M4(1.440e-01, 5.504e-02, -2.020e-01, 2.618e-03, -1.098e-02, -3.678e-02, 7.661e-02, 5.652e-02, -7.426e-02, 5.461e-02, 4.239e-01, 2.093e-01, 9.316e-03, -3.679e-02, 6.108e-02, 2.036e-01)); + r += mul(s3_0, M4(1.806e-02, 2.233e-02, 5.056e-02, 1.758e-01, 3.566e-02, -1.383e-01, 5.349e-02, 1.066e-01, 3.314e-02, -1.258e-01, -2.885e-02, -6.648e-02, -6.860e-03, -2.283e-02, -1.052e-01, -1.623e-02)); + r += mul(s3_1, M4(7.369e-02, -3.141e-02, 3.877e-03, 8.113e-03, -1.773e-01, 5.122e-03, -3.198e-01, 9.005e-02, 7.291e-02, -1.519e-01, -1.501e-01, -8.202e-02, -4.729e-02, -2.877e-02, -4.056e-02, 7.599e-02)); + r += mul(s3_2, M4(1.282e-01, 2.477e-03, 6.185e-02, 3.967e-02, -1.343e-01, 8.884e-02, 5.299e-02, -7.324e-02, 1.842e-01, -3.053e-02, -1.335e-01, -6.790e-03, -8.128e-02, 6.665e-02, 1.583e-03, -5.358e-02)); + r += mul(s3_3, M4(1.135e-01, 9.360e-03, 1.646e-01, 1.844e-01, 1.104e-02, 7.072e-02, -9.632e-02, -1.169e-01, -1.458e-01, 2.540e-02, -5.132e-02, -1.627e-01, -1.066e-01, -4.819e-02, -4.340e-02, -5.074e-02)); + r += mul(s3_4, M4(-1.198e-01, -7.965e-02, -2.989e-01, -4.946e-01, -1.666e-02, -2.136e-01, -3.575e-02, 1.351e-01, -8.546e-02, 2.553e-02, -7.878e-02, -3.233e-01, -2.955e-01, -7.765e-02, 1.450e-01, -2.114e-01)); + r += mul(s3_5, M4(-7.593e-02, -1.849e-03, -1.688e-01, 3.626e-02, 4.408e-03, 4.014e-02, -1.401e-01, -2.239e-01, 9.538e-02, -2.310e-01, 2.831e-02, 5.065e-02, 1.135e-01, 2.542e-02, -4.365e-01, 4.393e-02)); + r += mul(s3_6, M4(-5.217e-02, -1.327e-02, -1.851e-02, 2.806e-02, 4.648e-02, -9.047e-04, 2.961e-02, -2.922e-02, 6.360e-02, -3.494e-02, 2.573e-02, 1.309e-02, -2.512e-03, -4.086e-02, -2.086e-03, -6.018e-02)); + r += mul(s3_7, M4(9.887e-02, -9.515e-03, 1.306e-01, 5.290e-02, 1.832e-01, -2.549e-01, -4.640e-02, -1.256e-01, 4.915e-02, -5.163e-02, 3.044e-02, -9.871e-02, 8.168e-03, -7.112e-02, -5.743e-02, 3.687e-02)); + r += mul(s3_8, M4(-6.440e-02, 2.530e-02, -2.166e-03, -4.680e-02, 8.009e-02, -6.634e-02, -1.390e-01, -2.524e-02, 6.524e-02, -1.120e-01, -4.252e-02, -8.413e-03, -2.017e-02, 1.444e-02, -4.483e-02, 4.690e-02)); + r += V4(3.009e-03, -1.445e-03, 8.191e-03, -7.852e-03); + return r; +} + +V4 f1(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-1.005e-01, -6.367e-02, 4.428e-02, 1.687e-02, -9.639e-02, -1.209e-01, -1.374e-02, 4.932e-02, -9.949e-02, -2.569e-01, 1.199e-01, 1.077e-02, 5.110e-02, -1.129e-01, 6.104e-02, -4.656e-03)); + r += mul(s0_1, M4(-2.156e-01, 8.505e-02, 4.815e-04, -1.042e-01, -2.724e-01, -1.870e-01, 3.876e-02, 7.840e-02, -4.018e-01, -8.239e-01, 2.611e-01, -3.623e-01, -6.999e-03, 1.848e-02, 6.095e-02, -2.318e-02)); + r += mul(s0_2, M4(-2.195e-01, -6.727e-02, 7.111e-02, 5.119e-02, 7.396e-02, 1.116e-02, -1.261e-02, 9.531e-02, -3.892e-01, 1.430e-01, -9.840e-02, -2.423e-01, 2.669e-01, 3.009e-02, -2.478e-02, 1.168e-01)); + r += mul(s0_3, M4(-4.344e-01, 8.202e-02, 9.272e-03, -8.384e-02, -8.136e-02, -4.359e-01, 2.361e-01, -2.183e-01, 4.609e-02, -2.144e-02, 9.525e-03, -7.197e-02, -9.339e-02, 1.927e-01, -1.687e-02, 3.193e-02)); + r += mul(s0_4, M4(4.702e-01, 1.415e-04, 1.097e-01, 2.415e-01, 1.899e-01, -7.324e-01, -4.745e-03, -1.237e-01, -2.043e-01, 2.674e-02, 6.899e-01, 8.700e-02, 5.083e-02, 2.271e-01, 4.884e-02, 3.767e-01)); + r += mul(s0_5, M4(6.758e-02, -4.638e-02, 9.477e-02, -8.290e-02, -1.994e-01, 1.090e-01, -5.148e-02, -1.470e-01, 7.433e-02, 3.404e-01, 1.020e-01, -8.353e-02, 1.793e-01, -1.368e-01, 6.375e-02, 5.993e-02)); + r += mul(s0_6, M4(1.596e-02, 3.589e-02, 1.177e-02, 1.541e-01, -1.159e-01, -1.621e-02, 2.451e-01, 2.767e-01, -3.754e-04, 4.995e-02, -6.760e-02, -9.945e-02, 4.017e-01, 4.413e-02, 2.189e-02, 4.126e-02)); + r += mul(s0_7, M4(1.635e-01, -1.853e-01, -1.823e-01, -1.003e-01, -4.884e-02, 1.686e-01, 7.826e-02, 5.419e-01, -1.017e-01, 7.007e-02, 2.084e-01, 2.030e-01, 5.150e-01, -1.861e-01, -3.037e-01, -3.846e-01)); + r += mul(s0_8, M4(1.162e-01, 9.675e-02, -9.807e-02, 7.794e-02, 1.154e-01, 7.680e-02, 7.823e-02, 1.665e-01, 1.414e-01, 4.509e-02, -1.327e-02, 1.752e-01, -2.721e-01, -9.636e-04, 2.198e-02, -9.405e-02)); + r += mul(s1_0, M4(-3.554e-02, 7.673e-02, -1.735e-02, 3.910e-02, -9.934e-02, 1.798e-01, -4.244e-02, -2.008e-02, -1.586e-01, 7.918e-02, 6.812e-02, 1.784e-01, -2.173e-01, 8.736e-02, -3.130e-02, -1.487e-02)); + r += mul(s1_1, M4(1.142e-01, 2.330e-02, -7.096e-03, 5.291e-02, -3.702e-01, 2.102e-01, 7.156e-02, -1.416e-01, 1.017e-01, 3.888e-01, -5.335e-02, 9.686e-02, -1.093e-01, -1.631e-02, -2.884e-03, -4.091e-02)); + r += mul(s1_2, M4(4.795e-02, 4.423e-03, 1.494e-02, 2.666e-02, 1.261e-01, -7.251e-02, 2.103e-02, 1.095e-01, 2.166e-01, -1.249e-01, 8.981e-03, 1.792e-01, -3.697e-02, 6.864e-03, -1.141e-02, 2.430e-02)); + r += mul(s1_3, M4(-1.206e-01, 1.584e-03, -1.789e-02, -1.335e-02, 2.398e-01, 8.681e-01, -1.241e-01, -4.454e-02, -7.396e-02, 1.759e-02, -9.138e-02, 1.573e-01, -2.025e-01, 8.569e-02, 2.132e-02, 9.791e-02)); + r += mul(s1_4, M4(-4.834e-02, -7.974e-01, 2.858e-01, -2.441e-01, 4.163e-01, -1.650e-01, -1.897e-01, 1.309e-01, 4.031e-02, -8.242e-02, 3.338e-01, 3.567e-01, -1.532e-01, 2.807e-01, -7.324e-02, 5.093e-03)); + r += mul(s1_5, M4(-1.538e-01, 9.244e-02, -7.570e-02, -4.333e-02, -1.407e-01, -4.201e-02, -4.186e-02, -1.603e-01, -2.031e-01, 6.309e-02, -8.191e-02, 9.121e-02, -8.138e-02, -4.037e-02, 3.793e-02, 4.240e-02)); + r += mul(s1_6, M4(1.780e-01, 1.059e-01, -5.233e-03, 1.087e-01, 1.808e-01, -1.409e-01, 1.162e-02, -1.312e-01, 6.866e-02, 1.401e-02, 6.420e-02, 5.614e-02, -6.830e-02, 1.731e-02, 5.889e-02, 2.257e-02)); + r += mul(s1_7, M4(2.057e-01, -2.093e-02, -1.741e-01, 9.891e-02, -3.673e-02, 3.314e-02, -2.223e-01, -3.177e-01, 2.374e-01, -5.871e-02, -5.086e-02, -9.418e-02, -1.935e-02, -1.902e-02, -1.255e-01, -2.744e-01)); + r += mul(s1_8, M4(1.654e-01, 7.328e-02, 2.874e-02, 1.256e-01, -2.608e-01, 1.926e-03, 4.500e-02, -7.882e-02, -1.035e-02, -3.478e-02, -1.061e-01, -8.474e-02, -2.438e-01, -6.889e-02, -7.579e-02, -1.871e-01)); + r += mul(s2_0, M4(6.493e-02, 1.357e-01, -6.197e-02, -5.055e-02, 2.568e-01, -5.699e-02, -1.266e-01, -1.411e-02, 2.936e-02, -5.234e-02, -5.882e-03, -8.014e-02, -5.334e-02, -8.555e-02, 5.632e-02, 8.296e-03)); + r += mul(s2_1, M4(-3.582e-01, 2.351e-01, -1.636e-01, 2.172e-01, -1.840e-01, 9.838e-02, -7.565e-02, 1.535e-01, 8.151e-02, 3.002e-02, 1.149e-01, 1.180e-01, 1.323e-01, -7.682e-03, 5.013e-02, -2.190e-02)); + r += mul(s2_2, M4(-1.957e-01, -5.823e-02, -1.131e-01, -7.025e-02, 3.355e-01, 1.378e-01, -2.046e-01, 2.575e-01, 1.663e-01, 2.567e-02, -3.703e-02, -9.489e-02, -6.431e-02, -6.700e-02, 9.598e-02, 4.460e-03)); + r += mul(s2_3, M4(-1.522e-01, 1.335e-01, -2.140e-01, 3.368e-02, -5.076e-02, 2.412e-01, 6.141e-03, 2.456e-02, -9.105e-03, 1.014e-02, -1.056e-02, 1.368e-01, 8.030e-02, -2.874e-02, -7.499e-02, -2.675e-02)); + r += mul(s2_4, M4(2.115e-02, -6.849e-02, -8.528e-02, -3.270e-01, 2.112e-02, 7.309e-02, -3.852e-02, 2.604e-01, 1.772e-01, 4.115e-01, -2.443e-01, 3.100e-01, 3.139e-01, 3.829e-01, -2.701e-01, 1.463e-01)); + r += mul(s2_5, M4(2.664e-03, 4.352e-02, -2.378e-01, 5.316e-02, -1.369e-01, -1.293e-01, 1.587e-01, 2.153e-01, 3.820e-01, -1.515e-01, -4.429e-02, 2.391e-01, -3.720e-01, -1.154e-01, -1.196e-01, 3.172e-01)); + r += mul(s2_6, M4(-3.174e-01, -2.340e-01, 1.286e-01, -1.076e-01, 5.834e-02, 6.138e-02, -6.854e-03, 5.658e-02, 5.314e-02, -1.751e-02, 9.115e-03, 8.328e-03, 8.394e-03, 2.608e-02, 1.125e-01, 1.593e-01)); + r += mul(s2_7, M4(-6.600e-01, 1.899e-01, 1.094e-01, 1.665e-02, 1.089e-01, -1.034e-01, -1.811e-01, -3.040e-01, 4.782e-01, 3.160e-02, -4.648e-02, 1.286e-01, 1.070e-01, -1.022e-01, 5.693e-02, -5.195e-02)); + r += mul(s2_8, M4(3.748e-03, -4.142e-02, -7.021e-02, -2.596e-01, -2.444e-01, -6.341e-05, 4.125e-02, -7.382e-02, 4.456e-02, 3.144e-02, -5.055e-02, -1.724e-01, -1.835e-01, 4.462e-02, -1.398e-01, -2.631e-02)); + r += mul(s3_0, M4(-1.892e-01, -2.298e-01, 7.045e-02, -6.423e-02, 7.789e-02, -9.540e-02, -3.161e-02, -5.171e-02, -3.656e-02, -6.148e-02, -1.413e-02, -8.995e-02, 2.536e-02, 1.995e-03, 3.317e-02, 1.918e-02)); + r += mul(s3_1, M4(1.245e-02, -4.971e-03, 1.026e-02, -7.525e-02, -2.233e-01, -4.502e-01, -4.530e-03, -1.802e-01, -1.799e-01, 1.915e-02, 1.043e-02, 4.008e-02, 1.524e-01, 1.881e-03, -7.387e-02, 1.566e-02)); + r += mul(s3_2, M4(-1.750e-01, 3.216e-03, -1.033e-03, -7.055e-02, -1.263e-01, 1.586e-01, 2.603e-02, -1.282e-01, 5.606e-02, -1.498e-02, -3.338e-02, -8.978e-03, -2.218e-02, -5.852e-02, -3.208e-03, -1.352e-02)); + r += mul(s3_3, M4(-9.577e-02, -8.859e-02, 7.921e-02, -1.569e-02, -7.962e-02, 2.890e-02, 4.107e-02, -5.870e-02, 2.510e-02, 1.765e-02, 4.458e-02, 1.891e-02, 7.541e-02, 3.492e-02, 3.160e-02, 1.201e-02)); + r += mul(s3_4, M4(-6.228e-02, 9.576e-02, -1.743e-01, -1.935e-01, 2.054e-01, 1.479e-01, 8.056e-04, 3.321e-02, -1.362e-01, 5.003e-01, 9.071e-02, 8.153e-02, 2.283e-01, -3.484e-01, 4.509e-02, -4.658e-01)); + r += mul(s3_5, M4(2.528e-01, -9.286e-04, -2.468e-02, 1.338e-01, 4.431e-02, 3.503e-02, 1.304e-01, 1.652e-01, 4.628e-01, -2.670e-01, 1.880e-01, 1.516e-01, -1.538e-01, 1.379e-01, -3.334e-02, 2.977e-02)); + r += mul(s3_6, M4(1.385e-01, -6.592e-02, -1.225e-01, -1.381e-01, -4.498e-02, -6.343e-03, 4.811e-02, 9.639e-02, 1.635e-02, -3.467e-02, 3.640e-03, -3.186e-02, 6.265e-02, 2.282e-01, 9.661e-02, 1.295e-01)); + r += mul(s3_7, M4(-3.053e-03, 7.999e-02, 2.407e-01, 2.655e-01, -3.969e-01, -9.502e-03, 1.900e-02, 9.557e-02, -6.199e-02, -3.574e-02, 8.350e-02, -7.837e-02, -1.442e-02, -5.281e-03, 4.503e-01, 4.026e-01)); + r += mul(s3_8, M4(-1.313e-01, 4.424e-02, -1.155e-02, 6.769e-02, 2.192e-02, 6.721e-02, 5.694e-03, 7.376e-02, -2.155e-01, -7.512e-02, 6.252e-03, -3.428e-01, 3.324e-01, 2.784e-03, -5.606e-02, 2.108e-01)); + r += V4(-6.039e-04, -3.875e-03, -3.020e-03, 2.282e-03); + return r; +} + +void Pass3(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = Rmp8x8(tid.x) + blockStart; + uint2 size = GetInputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = (gxy + 0.5) * pt; + + V4 s0_0 = l0(-1.0, -1.0); + V4 s0_1 = l0(0.0, -1.0); + V4 s0_2 = l0(1.0, -1.0); + V4 s0_3 = l0(-1.0, 0.0); + V4 s0_4 = l0(0.0, 0.0); + V4 s0_5 = l0(1.0, 0.0); + V4 s0_6 = l0(-1.0, 1.0); + V4 s0_7 = l0(0.0, 1.0); + V4 s0_8 = l0(1.0, 1.0); + V4 s1_0 = -max(-s0_0, 0.0); + V4 s1_1 = -max(-s0_1, 0.0); + V4 s1_2 = -max(-s0_2, 0.0); + V4 s1_3 = -max(-s0_3, 0.0); + V4 s1_4 = -max(-s0_4, 0.0); + V4 s1_5 = -max(-s0_5, 0.0); + V4 s1_6 = -max(-s0_6, 0.0); + V4 s1_7 = -max(-s0_7, 0.0); + V4 s1_8 = -max(-s0_8, 0.0); + s0_0 = max(s0_0, 0.0); + s0_1 = max(s0_1, 0.0); + s0_2 = max(s0_2, 0.0); + s0_3 = max(s0_3, 0.0); + s0_4 = max(s0_4, 0.0); + s0_5 = max(s0_5, 0.0); + s0_6 = max(s0_6, 0.0); + s0_7 = max(s0_7, 0.0); + s0_8 = max(s0_8, 0.0); + + V4 s2_0 = l1(-1.0, -1.0); + V4 s2_1 = l1(0.0, -1.0); + V4 s2_2 = l1(1.0, -1.0); + V4 s2_3 = l1(-1.0, 0.0); + V4 s2_4 = l1(0.0, 0.0); + V4 s2_5 = l1(1.0, 0.0); + V4 s2_6 = l1(-1.0, 1.0); + V4 s2_7 = l1(0.0, 1.0); + V4 s2_8 = l1(1.0, 1.0); + V4 s3_0 = -max(-s2_0, 0.0); + V4 s3_1 = -max(-s2_1, 0.0); + V4 s3_2 = -max(-s2_2, 0.0); + V4 s3_3 = -max(-s2_3, 0.0); + V4 s3_4 = -max(-s2_4, 0.0); + V4 s3_5 = -max(-s2_5, 0.0); + V4 s3_6 = -max(-s2_6, 0.0); + V4 s3_7 = -max(-s2_7, 0.0); + V4 s3_8 = -max(-s2_8, 0.0); + s2_0 = max(s2_0, 0.0); + s2_1 = max(s2_1, 0.0); + s2_2 = max(s2_2, 0.0); + s2_3 = max(s2_3, 0.0); + s2_4 = max(s2_4, 0.0); + s2_5 = max(s2_5, 0.0); + s2_6 = max(s2_6, 0.0); + s2_7 = max(s2_7, 0.0); + s2_8 = max(s2_8, 0.0); + + t0[gxy] = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8); + t1[gxy] = f1(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8); +} + +//!PASS 4 +//!DESC conv3 +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 +//!IN t0, t1 +//!OUT t2, t3 + +#define l0(x, y) V4(O(t0, float2(x, y))) +#define l1(x, y) V4(O(t1, float2(x, y))) + +V4 f0(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8) { + V4 r = 0.0; + r += mul(s0_0, M4(8.947e-02, -1.234e-01, -3.169e-02, -9.158e-02, -1.406e-01, 6.941e-02, -1.367e-02, -1.406e-02, 9.073e-02, 5.642e-01, -2.007e-02, 9.725e-02, 7.122e-03, -1.956e-03, 6.532e-03, -5.457e-02)); + r += mul(s0_1, M4(-1.130e-01, -4.645e-02, 3.624e-02, 3.391e-02, 3.882e-01, 2.453e-01, -2.237e-01, -2.271e-01, 2.803e-01, 1.718e-01, 3.255e-02, -2.046e-01, 1.441e-01, -1.880e-03, 2.335e-02, -1.232e-01)); + r += mul(s0_2, M4(2.016e-01, 1.243e-01, -3.895e-02, -1.135e-01, -2.167e-02, 1.465e-02, -7.776e-02, -1.213e-01, -7.195e-03, 4.404e-03, 6.598e-02, -5.135e-02, -2.062e-01, -3.725e-02, -8.296e-03, 8.739e-03)); + r += mul(s0_3, M4(-2.068e-02, -3.876e-02, 5.737e-02, 9.886e-02, -9.663e-02, -2.569e-01, 6.761e-02, -1.454e-01, 4.660e-02, 7.810e-01, -2.254e-01, 1.899e-01, -9.628e-02, 8.080e-02, -1.093e-02, 1.451e-02)); + r += mul(s0_4, M4(3.133e-01, 2.759e-01, -9.917e-02, -3.134e-01, 1.137e-01, -5.446e-01, -2.044e-03, -5.215e-01, -6.867e-02, 5.254e-01, -1.466e-01, -3.048e-01, 3.408e-01, 5.791e-01, -2.594e-01, -4.879e-04)); + r += mul(s0_5, M4(6.871e-02, -1.221e-01, -5.702e-02, -2.731e-02, 6.025e-01, 1.350e-01, -3.119e-01, -4.130e-01, 2.091e-01, 1.003e-01, 4.509e-02, -1.541e-01, 1.151e-01, -1.558e-01, 6.309e-03, -2.192e-01)); + r += mul(s0_6, M4(2.139e-02, 1.540e-02, -9.451e-02, 8.898e-02, 1.983e-02, -1.259e-01, 2.162e-01, -9.477e-02, -2.253e-01, -1.456e-01, -2.432e-02, 9.649e-02, 2.147e-02, -9.523e-02, 2.042e-02, -7.790e-02)); + r += mul(s0_7, M4(-3.105e-03, 1.944e-01, -1.808e-01, -3.058e-02, 4.007e-01, 5.645e-01, -2.452e-01, -7.366e-02, 1.279e-02, 3.212e-02, -1.573e-01, -1.267e-01, 1.613e-02, -1.976e-01, -1.519e-01, -2.687e-02)); + r += mul(s0_8, M4(-1.906e-04, 8.306e-02, 2.480e-02, 1.696e-02, 1.275e-01, 1.372e-01, 1.205e-01, 1.120e-02, 1.424e-02, -1.526e-01, -6.629e-02, -9.104e-02, 2.042e-02, -1.167e-01, 1.050e-01, 1.560e-02)); + r += mul(s1_0, M4(-2.398e-02, -1.009e-01, 2.671e-02, -8.841e-02, -7.277e-03, -4.411e-02, -1.240e-02, -5.367e-04, -1.223e-01, -7.251e-02, 4.941e-02, 7.545e-02, 6.688e-02, 1.727e-02, -1.144e-02, -7.713e-02)); + r += mul(s1_1, M4(-1.507e-01, -3.095e-01, 5.017e-02, -1.145e-01, 3.430e-02, -2.241e-01, -9.050e-02, -8.470e-02, -8.624e-02, -1.021e-02, -1.620e-02, 3.932e-03, 7.775e-02, -2.376e-02, 6.270e-02, -7.896e-02)); + r += mul(s1_2, M4(3.578e-02, -3.242e-02, 9.400e-03, -2.998e-02, -1.545e-02, -1.481e-01, -6.667e-02, 3.496e-02, 6.722e-02, 7.676e-04, -8.215e-04, 2.142e-03, 4.007e-02, 9.690e-02, -1.652e-03, 3.858e-02)); + r += mul(s1_3, M4(6.321e-02, -1.472e-01, 6.571e-02, -1.929e-01, -7.340e-02, -8.067e-02, 1.715e-02, 2.182e-02, -8.623e-02, -2.195e-01, -6.101e-02, 8.246e-02, -4.908e-02, -3.293e-02, -7.341e-02, -1.941e-01)); + r += mul(s1_4, M4(5.609e-01, 5.581e-01, -1.143e-01, -1.052e-01, 2.477e-01, 2.387e-01, 1.272e-01, 3.284e-03, -3.135e-01, 8.385e-02, -7.393e-02, -2.270e-01, 4.403e-01, -1.179e-01, -1.620e-01, 2.978e-01)); + r += mul(s1_5, M4(-3.015e-02, 1.055e-01, 1.072e-01, 1.177e-01, 3.838e-01, 3.206e-02, -4.556e-03, -5.072e-02, 4.250e-02, -1.665e-02, -1.759e-02, 2.822e-02, -2.408e-01, -2.204e-02, -3.440e-02, 6.520e-02)); + r += mul(s1_6, M4(9.180e-04, 3.395e-02, -1.211e-02, -5.605e-03, -7.356e-03, -2.439e-02, -2.498e-02, -6.361e-04, -5.167e-02, -1.009e-02, 7.202e-02, 3.652e-02, 3.036e-03, -7.672e-03, -2.822e-02, -9.942e-02)); + r += mul(s1_7, M4(-7.041e-02, -2.366e-01, -1.556e-01, 1.499e-01, -2.674e-02, 6.601e-03, -1.490e-01, 1.329e-02, -1.127e-01, 8.363e-03, -1.333e-01, 1.038e-02, -1.219e-02, -1.366e-01, 8.814e-02, 4.260e-03)); + r += mul(s1_8, M4(-1.397e-02, 2.863e-02, 5.459e-03, -1.166e-02, -1.201e-02, 1.346e-01, 5.461e-02, 1.584e-02, -8.155e-02, 8.451e-03, -3.444e-02, 3.920e-02, 2.082e-02, -4.174e-02, 6.205e-02, 5.646e-02)); + r += mul(s2_0, M4(5.465e-02, 7.303e-02, 1.200e-01, 8.938e-03, -8.960e-02, -2.248e-01, -1.073e-02, 6.882e-02, 4.637e-02, -1.215e-01, -2.319e-02, -2.049e-01, -8.235e-02, -2.689e-02, 8.521e-02, 2.612e-02)); + r += mul(s2_1, M4(-1.284e-01, -8.509e-02, 6.859e-02, 2.538e-02, -7.401e-02, 2.860e-01, -2.240e-01, 1.754e-01, -2.073e-01, -9.333e-02, -9.310e-02, -3.311e-01, 2.251e-01, 1.948e-01, -1.091e-01, 2.448e-02)); + r += mul(s2_2, M4(4.550e-03, 2.884e-02, -1.023e-02, -1.793e-02, 1.472e-01, 1.728e-02, -5.533e-02, -4.606e-02, -1.128e-01, 1.845e-01, -9.297e-02, 7.245e-02, 2.303e-02, -1.293e-01, -2.277e-02, -1.523e-02)); + r += mul(s2_3, M4(5.703e-02, 4.629e-03, -7.495e-02, -7.220e-02, -1.245e-01, 1.142e-01, -1.688e-03, -9.906e-03, 9.714e-02, -2.851e-02, 7.069e-03, -3.250e-01, -5.029e-03, -1.421e-01, -4.162e-02, 1.032e-01)); + r += mul(s2_4, M4(5.200e-02, -3.414e-02, -3.809e-02, -9.742e-02, 8.686e-01, 1.140e+00, 2.062e-01, 8.598e-02, 4.073e-01, -3.313e-01, 2.673e-01, 1.050e-01, -9.355e-02, 1.764e-01, 8.423e-02, 1.156e-01)); + r += mul(s2_5, M4(-5.260e-03, 8.804e-02, 3.636e-02, 3.074e-03, 1.724e-01, 2.433e-01, -1.126e-02, -2.652e-01, -1.229e-01, 3.135e-02, 1.187e-02, -6.661e-02, -1.872e-02, -6.508e-02, -7.109e-02, 1.141e-01)); + r += mul(s2_6, M4(6.180e-03, 2.059e-03, -1.768e-02, 4.877e-03, -7.838e-02, 1.366e-01, -7.231e-02, -2.826e-02, 6.251e-02, 7.375e-02, 2.531e-02, 2.038e-02, -4.462e-03, -4.896e-02, -4.376e-02, -7.998e-03)); + r += mul(s2_7, M4(1.011e-01, 8.753e-02, -5.554e-02, 6.949e-04, 4.137e-02, 2.710e-01, -3.203e-01, 6.752e-02, 9.720e-02, 3.447e-02, -5.777e-02, -1.723e-02, -9.154e-03, 5.461e-02, 1.248e-01, -3.906e-04)); + r += mul(s2_8, M4(4.126e-02, 3.442e-02, 9.763e-03, -4.560e-02, -4.233e-04, -1.519e-01, 2.421e-02, -4.043e-02, -1.281e-02, 1.166e-02, 2.489e-04, -3.061e-02, -4.476e-02, 4.493e-03, -4.164e-02, 9.694e-03)); + r += mul(s3_0, M4(-1.352e-01, -1.938e-01, 7.285e-02, -4.706e-02, 1.920e-02, 1.891e-02, 1.233e-02, 3.876e-02, 1.342e-02, 2.020e-01, 3.292e-02, 2.778e-02, -5.017e-02, 3.560e-02, 7.028e-02, 7.562e-03)); + r += mul(s3_1, M4(3.014e-01, 1.243e-01, -2.656e-02, -9.796e-02, 1.585e-01, 2.259e-01, -6.651e-02, 4.080e-02, 1.902e-01, 2.705e-01, -9.774e-02, -1.144e-02, -4.653e-01, -3.536e-01, 2.515e-02, 9.628e-02)); + r += mul(s3_2, M4(-7.724e-02, 1.181e-01, 2.182e-02, 1.999e-02, -7.114e-02, -4.414e-02, -5.748e-06, -8.931e-03, 4.985e-03, 6.360e-02, 4.422e-02, 6.005e-02, 1.335e-01, -8.144e-03, -3.979e-02, 6.952e-03)); + r += mul(s3_3, M4(-1.826e-03, 2.390e-02, 4.665e-03, -3.357e-02, 2.088e-02, 1.436e-01, -2.474e-02, 1.100e-02, 2.727e-02, -1.649e-02, -9.539e-02, -1.112e-01, -2.427e-02, 1.811e-01, -4.267e-02, 1.060e-01)); + r += mul(s3_4, M4(9.873e-02, -1.417e-01, -1.365e-01, -3.187e-01, -7.583e-03, 3.047e-01, -2.480e-02, 2.623e-01, -3.193e-01, -1.539e-01, -2.986e-01, 2.350e-01, 4.367e-01, 2.441e-01, -3.426e-01, -5.108e-02)); + r += mul(s3_5, M4(-8.384e-02, 1.343e-01, 1.653e-01, 7.978e-02, 6.329e-02, 7.040e-02, 2.203e-02, -2.280e-01, 2.531e-02, -9.408e-02, -5.137e-02, -1.717e-01, -1.577e-01, 4.030e-02, -2.802e-01, 1.155e-01)); + r += mul(s3_6, M4(1.895e-02, 1.436e-01, 3.568e-04, -6.075e-02, 3.213e-02, -3.462e-02, -2.821e-02, -8.374e-03, 3.451e-02, -2.349e-02, 9.517e-03, 2.092e-02, -8.229e-02, 6.530e-02, 6.116e-03, -2.414e-02)); + r += mul(s3_7, M4(1.530e-01, 2.073e-01, -7.258e-02, -6.975e-02, -6.610e-03, -3.885e-02, -5.636e-03, 1.227e-01, 8.913e-02, 4.336e-02, -1.931e-03, -3.869e-02, -2.019e-02, -1.340e-02, -1.506e-02, 1.591e-02)); + r += mul(s3_8, M4(2.536e-02, -3.220e-02, 6.413e-02, -1.835e-02, -9.124e-02, -8.098e-02, -5.479e-02, -1.361e-02, -3.146e-03, 1.204e-01, -4.020e-02, -6.924e-02, -1.030e-01, -1.301e-01, 1.634e-02, 1.029e-01)); + r += V4(8.385e-03, 1.035e-02, -6.465e-04, -6.502e-03); + return r; +} + +V4 f1(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-5.222e-02, -3.069e-02, 2.456e-03, -1.117e-02, 4.933e-02, 5.166e-02, -6.284e-03, -9.151e-02, 1.439e-02, 1.755e-02, -8.848e-02, -9.796e-02, -2.835e-02, 3.699e-02, 2.912e-02, 4.373e-02)); + r += mul(s0_1, M4(6.333e-03, -2.767e-02, -7.247e-02, 8.441e-02, -3.433e-02, -4.699e-02, -1.193e-02, -1.729e-01, 2.481e-02, -4.121e-02, -2.861e-01, -1.202e-02, 2.687e-02, -1.313e-01, 1.747e-02, -9.108e-02)); + r += mul(s0_2, M4(1.309e-02, -1.968e-02, -1.246e-01, -3.915e-02, -1.159e-01, -6.491e-03, 3.316e-01, -6.851e-02, -2.940e-02, -1.787e-02, -5.850e-03, -6.207e-02, 5.272e-02, 9.800e-02, 4.709e-02, 7.491e-02)); + r += mul(s0_3, M4(-1.127e-01, -3.748e-02, -1.091e-01, 1.788e-01, -7.982e-02, -7.528e-02, 1.898e-01, -1.355e-01, -1.568e-01, 9.648e-02, 2.337e-01, -9.666e-02, -7.316e-02, 2.915e-02, 2.259e-02, -1.310e-02)); + r += mul(s0_4, M4(1.689e-02, -1.028e-01, 1.304e-01, -6.012e-02, -8.030e-02, -1.823e-01, 4.179e-01, -3.553e-01, 9.095e-04, 9.972e-02, 3.227e-01, -4.967e-02, -2.329e-01, 1.272e-01, 4.332e-01, -8.456e-01)); + r += mul(s0_5, M4(1.815e-02, -5.743e-02, 7.236e-02, -8.782e-02, 1.161e-01, 2.258e-01, 7.053e-01, -2.993e-01, 6.605e-02, -2.666e-03, -4.733e-02, -1.087e-01, -1.101e-01, 1.554e-01, 1.656e-01, 2.530e-01)); + r += mul(s0_6, M4(-7.750e-02, -6.619e-02, 2.202e-02, 4.186e-02, -1.519e-01, -8.918e-03, -1.919e-01, -7.085e-02, -1.356e-01, -1.363e-01, 1.782e-01, -1.499e-02, 9.670e-02, 1.450e-03, 5.675e-02, -3.337e-02)); + r += mul(s0_7, M4(-9.267e-02, 1.661e-01, 1.306e-01, -2.387e-01, -2.261e-02, 2.870e-01, -2.711e-01, 6.281e-02, 2.181e-02, 1.010e-01, 2.979e-01, -9.254e-02, 1.307e-01, -2.024e-02, 2.013e-01, -1.862e-02)); + r += mul(s0_8, M4(-7.233e-02, 8.276e-02, 1.279e-02, -3.778e-02, -3.737e-01, -2.422e-01, -1.352e-01, -1.631e-01, 6.518e-02, 2.511e-01, 1.588e-01, -3.599e-02, 8.821e-02, 3.757e-02, -1.340e-01, 1.006e-01)); + r += mul(s1_0, M4(1.034e-02, 8.194e-02, 9.844e-02, -1.052e-01, 4.683e-03, 4.432e-03, 8.420e-03, 7.511e-03, 7.210e-02, -8.697e-03, -9.834e-02, 1.366e-01, 3.221e-04, 1.836e-02, 1.307e-02, -6.823e-02)); + r += mul(s1_1, M4(-7.232e-02, 1.103e-01, 2.975e-01, 4.747e-02, -1.075e-01, -6.863e-02, 2.378e-01, -2.994e-02, 6.426e-02, 2.459e-02, -1.361e-01, 4.394e-02, 4.558e-02, -5.684e-02, -3.386e-02, 8.075e-02)); + r += mul(s1_2, M4(-1.568e-02, 6.463e-02, 4.001e-02, 3.549e-02, -3.385e-02, -1.547e-02, 2.510e-01, 3.198e-02, 2.533e-02, -6.612e-02, -5.453e-02, 1.387e-03, 3.071e-02, -5.115e-03, -9.345e-02, 1.790e-02)); + r += mul(s1_3, M4(1.723e-01, 2.119e-02, -3.394e-01, -1.101e-01, 7.882e-03, -4.188e-02, -6.882e-02, 5.060e-02, 4.902e-02, 2.919e-02, 7.773e-02, 1.080e-01, 8.944e-02, -2.819e-02, -1.252e-02, -2.744e-01)); + r += mul(s1_4, M4(2.682e-01, 8.840e-03, -3.974e-01, 2.436e-01, 1.156e-02, 3.806e-04, -5.090e-01, -1.339e-02, 1.677e-02, -1.337e-01, -1.050e-01, 2.647e-01, -1.971e-01, -1.145e-02, 1.471e-01, -7.814e-02)); + r += mul(s1_5, M4(-5.376e-02, 2.321e-02, -1.908e-01, -1.538e-01, 5.032e-03, 2.979e-02, -3.934e-02, -1.754e-01, 3.674e-02, 8.713e-03, -7.429e-02, -2.768e-03, -1.878e-01, -1.382e-01, 1.114e-01, 4.843e-02)); + r += mul(s1_6, M4(4.390e-03, 1.082e-02, 6.300e-03, -2.220e-02, -1.578e-02, -3.883e-02, 6.290e-02, 5.752e-03, 9.478e-02, 5.108e-03, 6.174e-02, 8.270e-02, -5.128e-02, -3.664e-02, 3.095e-02, -1.575e-01)); + r += mul(s1_7, M4(2.131e-01, 8.669e-03, 8.288e-02, 1.767e-01, -8.764e-02, -6.440e-03, 1.179e-01, -9.407e-02, -1.114e-01, -1.384e-01, 7.349e-02, 2.379e-02, 6.264e-02, -6.347e-02, -1.973e-01, 3.150e-02)); + r += mul(s1_8, M4(6.920e-02, 2.737e-01, 5.444e-02, -1.065e-01, -8.435e-02, 1.268e-01, -7.219e-03, -4.022e-02, -3.687e-02, -3.873e-02, 5.773e-02, 1.171e-02, 5.552e-02, -2.870e-02, -4.903e-02, 2.162e-02)); + r += mul(s2_0, M4(-6.811e-02, 3.915e-02, -1.970e-02, 5.496e-02, -3.225e-02, -5.284e-02, -3.737e-03, -1.864e-03, -1.361e-01, -7.308e-02, -4.948e-02, -1.634e-01, 5.283e-02, 1.746e-02, -8.374e-02, 7.123e-02)); + r += mul(s2_1, M4(4.868e-03, 7.851e-02, 1.067e-01, 5.576e-02, 1.276e-01, -7.837e-02, -2.875e-01, 3.754e-02, -1.315e-01, -9.095e-02, 8.041e-02, -1.156e-01, 1.309e-02, 1.086e-01, -1.335e-01, 9.059e-02)); + r += mul(s2_2, M4(-1.092e-02, 1.501e-01, -3.542e-02, 2.500e-02, 1.500e-02, -1.832e-01, -3.447e-01, -2.562e-02, -1.110e-01, 1.362e-01, 1.634e-01, -5.146e-02, -1.184e-02, -1.154e-01, 4.862e-02, 1.344e-03)); + r += mul(s2_3, M4(3.103e-02, -2.009e-02, 2.266e-02, 5.094e-02, 5.909e-01, 1.844e-01, -3.418e-02, -1.460e-01, 1.218e-02, -3.631e-02, -2.582e-01, -2.230e-01, 9.666e-02, -6.432e-02, 7.267e-02, 7.577e-02)); + r += mul(s2_4, M4(8.062e-02, -3.981e-02, -3.232e-02, -1.032e-01, -9.859e-02, 6.539e-01, 5.533e-01, -1.046e-02, -5.348e-01, 1.009e-02, -3.879e-01, 1.190e-01, -1.151e-01, 1.835e-01, -7.797e-02, 1.418e-01)); + r += mul(s2_5, M4(-1.404e-02, -1.730e-01, -4.516e-02, -2.158e-02, 2.544e-01, 4.463e-01, 1.404e-01, -6.854e-02, -9.712e-02, -4.920e-01, -2.485e-02, -6.416e-02, 3.612e-02, 2.451e-01, 2.327e-02, -1.251e-03)); + r += mul(s2_6, M4(6.507e-02, -2.267e-02, -7.660e-02, 3.043e-02, 3.541e-01, 2.804e-01, 2.783e-01, -2.580e-01, -1.185e-01, 8.028e-02, -1.395e-01, -4.988e-03, 4.702e-02, -5.327e-02, 4.580e-02, 3.130e-03)); + r += mul(s2_7, M4(9.806e-02, 6.990e-02, -4.317e-02, -2.415e-02, -2.263e-01, -1.723e-01, 2.669e-02, -3.393e-01, 9.368e-02, -6.775e-02, -1.883e-01, -8.601e-02, -2.278e-01, 1.612e-01, 1.625e-01, 8.821e-02)); + r += mul(s2_8, M4(-1.921e-02, 1.119e-01, 3.717e-02, -2.554e-02, 2.852e-02, 8.987e-02, 1.246e-01, 6.463e-03, 2.548e-02, -2.950e-02, 7.289e-02, 1.802e-02, 2.576e-02, 5.798e-02, 6.021e-02, -5.030e-03)); + r += mul(s3_0, M4(-1.023e-01, -3.759e-02, -2.437e-02, 1.032e-01, -2.143e-02, -4.189e-02, -6.139e-02, 9.887e-02, -9.094e-03, 3.087e-02, -1.056e-01, 1.376e-01, 1.702e-02, 3.138e-02, -1.243e-01, -5.115e-02)); + r += mul(s3_1, M4(3.439e-02, -1.018e-01, -3.260e-01, 6.226e-02, 3.794e-02, -6.747e-02, -1.743e-01, -9.149e-02, 6.116e-02, -3.539e-02, -3.971e-01, -2.458e-02, -1.436e-01, 4.323e-02, 5.595e-01, 1.160e-01)); + r += mul(s3_2, M4(-7.596e-02, -9.502e-02, -1.112e-02, -7.256e-02, -1.625e-02, -1.013e-01, -7.450e-02, 2.969e-03, -1.481e-02, -1.199e-01, -8.230e-02, 2.952e-02, -3.199e-02, 8.852e-02, -1.541e-02, 1.722e-02)); + r += mul(s3_3, M4(2.768e-03, -9.600e-02, 1.333e-01, -1.174e-01, -7.190e-02, 1.265e-02, 8.135e-02, -6.909e-03, 9.249e-02, -2.800e-02, 2.029e-01, -1.212e-02, 9.955e-02, -2.791e-02, -1.172e-01, 2.079e-01)); + r += mul(s3_4, M4(-1.948e-01, -1.936e-01, 5.127e-01, -7.970e-02, -1.135e-01, 1.060e-01, 1.226e-01, -3.195e-01, -4.980e-01, -5.665e-03, 3.167e-01, -2.413e-01, 2.036e-01, 1.519e-01, 7.793e-04, -1.316e-01)); + r += mul(s3_5, M4(-8.284e-02, -1.590e-01, 5.041e-03, -2.936e-02, 1.485e-01, 8.341e-02, -3.804e-02, 3.576e-02, 1.499e-01, -8.989e-02, 7.085e-02, -4.898e-02, 1.070e-01, 5.825e-02, 1.863e-01, -9.850e-03)); + r += mul(s3_6, M4(-3.057e-01, 2.794e-02, -7.737e-02, -4.168e-02, 2.696e-02, 1.279e-02, 2.638e-02, 8.177e-02, 1.217e-01, 2.531e-02, -1.188e-01, 1.018e-01, -5.486e-02, -6.606e-03, 1.868e-01, -1.050e-01)); + r += mul(s3_7, M4(-3.018e-01, -1.795e-01, -1.578e-01, -1.809e-01, 1.241e-01, -4.960e-02, -1.067e-01, -1.004e-02, -8.835e-02, 6.620e-02, 1.309e-01, -1.399e-01, 4.651e-02, 4.837e-02, -9.106e-02, 1.670e-01)); + r += mul(s3_8, M4(1.081e-02, -9.947e-02, 1.643e-02, -2.769e-02, 9.803e-02, -8.389e-02, -2.782e-02, -2.689e-02, 3.693e-02, -3.436e-03, 1.229e-02, -2.929e-02, -1.751e-01, -5.859e-03, 1.543e-01, 8.225e-02)); + r += V4(-2.994e-04, -3.163e-05, 4.528e-03, -1.285e-02); + return r; +} + +void Pass4(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = Rmp8x8(tid.x) + blockStart; + uint2 size = GetInputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = (gxy + 0.5) * pt; + + V4 s0_0 = l0(-1.0, -1.0); + V4 s0_1 = l0(0.0, -1.0); + V4 s0_2 = l0(1.0, -1.0); + V4 s0_3 = l0(-1.0, 0.0); + V4 s0_4 = l0(0.0, 0.0); + V4 s0_5 = l0(1.0, 0.0); + V4 s0_6 = l0(-1.0, 1.0); + V4 s0_7 = l0(0.0, 1.0); + V4 s0_8 = l0(1.0, 1.0); + V4 s1_0 = -max(-s0_0, 0.0); + V4 s1_1 = -max(-s0_1, 0.0); + V4 s1_2 = -max(-s0_2, 0.0); + V4 s1_3 = -max(-s0_3, 0.0); + V4 s1_4 = -max(-s0_4, 0.0); + V4 s1_5 = -max(-s0_5, 0.0); + V4 s1_6 = -max(-s0_6, 0.0); + V4 s1_7 = -max(-s0_7, 0.0); + V4 s1_8 = -max(-s0_8, 0.0); + s0_0 = max(s0_0, 0.0); + s0_1 = max(s0_1, 0.0); + s0_2 = max(s0_2, 0.0); + s0_3 = max(s0_3, 0.0); + s0_4 = max(s0_4, 0.0); + s0_5 = max(s0_5, 0.0); + s0_6 = max(s0_6, 0.0); + s0_7 = max(s0_7, 0.0); + s0_8 = max(s0_8, 0.0); + + V4 s2_0 = l1(-1.0, -1.0); + V4 s2_1 = l1(0.0, -1.0); + V4 s2_2 = l1(1.0, -1.0); + V4 s2_3 = l1(-1.0, 0.0); + V4 s2_4 = l1(0.0, 0.0); + V4 s2_5 = l1(1.0, 0.0); + V4 s2_6 = l1(-1.0, 1.0); + V4 s2_7 = l1(0.0, 1.0); + V4 s2_8 = l1(1.0, 1.0); + V4 s3_0 = -max(-s2_0, 0.0); + V4 s3_1 = -max(-s2_1, 0.0); + V4 s3_2 = -max(-s2_2, 0.0); + V4 s3_3 = -max(-s2_3, 0.0); + V4 s3_4 = -max(-s2_4, 0.0); + V4 s3_5 = -max(-s2_5, 0.0); + V4 s3_6 = -max(-s2_6, 0.0); + V4 s3_7 = -max(-s2_7, 0.0); + V4 s3_8 = -max(-s2_8, 0.0); + s2_0 = max(s2_0, 0.0); + s2_1 = max(s2_1, 0.0); + s2_2 = max(s2_2, 0.0); + s2_3 = max(s2_3, 0.0); + s2_4 = max(s2_4, 0.0); + s2_5 = max(s2_5, 0.0); + s2_6 = max(s2_6, 0.0); + s2_7 = max(s2_7, 0.0); + s2_8 = max(s2_8, 0.0); + + t2[gxy] = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8); + t3[gxy] = f1(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8); +} + +//!PASS 5 +//!DESC conv4 +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 +//!IN t2, t3 +//!OUT t0, t1 + +#define l0(x, y) V4(O(t2, float2(x, y))) +#define l1(x, y) V4(O(t3, float2(x, y))) + +V4 f0(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8) { + V4 r = 0.0; + r += mul(s0_0, M4(5.681e-02, -7.933e-02, -1.161e-02, -3.257e-02, -1.507e-02, 2.248e-02, -1.351e-02, 2.789e-02, -1.713e-01, 9.482e-02, 2.715e-02, 9.506e-02, 1.714e-01, -1.090e-01, -7.237e-02, -1.563e-01)); + r += mul(s0_1, M4(-9.622e-03, -7.774e-04, -4.095e-02, 1.106e-02, -3.592e-02, -4.358e-02, 1.983e-02, -1.134e-02, -1.313e-02, -1.086e-01, 1.102e-01, -3.091e-01, 1.982e-01, 1.438e-01, -6.038e-02, 9.579e-02)); + r += mul(s0_2, M4(-3.893e-02, 1.554e-02, -7.763e-05, 1.610e-02, 3.470e-03, 9.915e-03, -9.881e-03, 5.331e-02, -9.152e-02, 6.899e-02, -3.615e-02, 1.558e-01, -3.300e-02, 4.493e-02, 2.148e-02, -3.677e-02)); + r += mul(s0_3, M4(1.939e-01, -7.700e-02, -1.449e-01, -1.942e-02, 9.649e-02, -3.580e-03, -1.767e-02, 2.394e-02, -1.299e-01, 1.160e-01, 8.000e-02, 9.737e-02, 2.751e-01, -4.435e-01, 1.013e-01, -1.782e-01)); + r += mul(s0_4, M4(-2.745e-01, 2.922e-01, -2.008e-01, 1.636e-01, -4.843e-02, 4.172e-01, 3.097e-02, 3.326e-01, -1.798e-02, -3.860e-01, 3.246e-02, 4.225e-01, -1.057e-01, 2.302e-01, -7.879e-02, 4.832e-02)); + r += mul(s0_5, M4(-6.834e-04, -3.372e-02, -9.351e-02, 1.547e-02, 5.621e-02, -1.195e-02, -9.402e-03, 6.439e-02, 8.787e-02, 1.499e-02, 1.928e-01, 6.693e-02, 6.516e-02, -1.145e-01, -6.610e-02, 3.986e-02)); + r += mul(s0_6, M4(7.682e-02, -9.222e-02, 1.566e-01, -1.438e-02, 5.080e-02, -2.762e-02, -3.121e-02, -1.242e-02, 2.046e-02, -1.131e-02, 4.555e-02, -3.006e-02, 1.125e-01, -7.883e-02, 1.063e-01, 3.027e-03)); + r += mul(s0_7, M4(-1.395e-01, 4.847e-02, 1.605e-01, 1.363e-01, 6.243e-02, -1.464e-02, 3.336e-02, -8.862e-02, 3.286e-02, -2.398e-02, -2.326e-02, -8.408e-02, 1.274e-01, -4.997e-02, 1.548e-01, -8.650e-02)); + r += mul(s0_8, M4(4.236e-02, 3.116e-02, 7.690e-02, 3.084e-02, 6.290e-03, 1.016e-02, 7.155e-02, -9.786e-02, -1.453e-02, -4.564e-04, -3.654e-02, 7.179e-03, -2.110e-02, -2.766e-02, 1.022e-01, -6.664e-02)); + r += mul(s1_0, M4(-2.814e-02, 6.473e-02, 5.209e-02, 6.202e-02, -1.898e-02, 6.061e-02, -1.557e-02, 3.561e-02, 2.137e-01, -1.913e-01, 2.387e-03, -1.470e-01, 4.553e-02, -3.358e-02, 1.936e-03, -4.798e-02)); + r += mul(s1_1, M4(4.947e-03, -8.431e-02, -3.362e-03, -1.057e-01, -6.735e-02, 8.463e-03, -4.622e-02, -2.022e-02, -1.450e-01, -1.687e-03, -1.541e-02, -1.116e-02, 4.447e-02, 5.088e-02, -7.198e-03, 3.279e-02)); + r += mul(s1_2, M4(1.202e-03, -2.591e-02, -5.357e-03, -3.844e-02, -7.403e-03, 3.771e-02, -6.171e-02, 8.820e-02, 6.744e-03, -4.156e-02, -1.377e-02, 9.398e-02, -2.643e-02, 4.991e-02, -2.000e-02, 1.056e-02)); + r += mul(s1_3, M4(3.923e-01, 3.525e-02, -1.294e-01, 1.478e-02, 9.667e-02, 1.289e-01, 8.960e-02, 1.946e-02, 3.128e-01, -3.315e-01, -3.019e-01, 1.021e-01, 2.095e-01, -1.488e-01, -9.439e-02, -9.635e-02)); + r += mul(s1_4, M4(-3.641e-01, -9.985e-02, -3.482e-01, -2.646e-01, -5.257e-01, 9.475e-01, 1.714e-01, 5.842e-01, -2.199e-01, -6.131e-02, -4.597e-01, 5.556e-01, 7.933e-02, -2.150e-01, -3.469e-01, -1.978e-01)); + r += mul(s1_5, M4(7.883e-05, -2.207e-02, -1.735e-02, 2.167e-02, 4.628e-02, 8.814e-02, -4.837e-02, 6.515e-02, 1.617e-01, -4.460e-02, -1.002e-01, 7.496e-02, -1.180e-01, 5.540e-02, -5.708e-02, 5.715e-02)); + r += mul(s1_6, M4(1.680e-01, -5.262e-02, 6.143e-02, -4.758e-02, -5.343e-02, 4.332e-02, 1.191e-01, 8.545e-03, 1.171e-01, -8.169e-02, 1.535e-02, -2.281e-01, 8.009e-02, -9.744e-02, 6.114e-02, 8.379e-03)); + r += mul(s1_7, M4(-9.744e-02, 2.573e-02, 6.125e-02, 1.265e-01, 9.253e-02, -1.227e-01, 3.224e-01, -2.402e-01, 1.083e-01, 1.607e-02, 1.155e-01, -4.014e-01, -2.347e-02, -3.821e-02, 2.379e-01, 2.605e-02)); + r += mul(s1_8, M4(5.428e-02, -5.434e-02, -2.345e-02, -2.189e-03, 1.274e-02, 7.503e-02, 1.442e-01, -8.839e-02, -3.480e-02, 1.444e-02, -3.859e-02, -1.089e-01, -3.183e-02, 9.172e-02, 1.092e-01, 6.688e-02)); + r += mul(s2_0, M4(2.283e-01, 3.872e-02, -5.533e-02, -1.704e-02, -1.533e-02, 1.459e-02, 3.842e-02, 6.367e-02, -4.041e-02, -6.411e-03, -5.052e-03, -8.331e-03, 2.786e-03, -5.502e-02, 6.695e-03, -1.982e-02)); + r += mul(s2_1, M4(-4.716e-01, 4.092e-01, -1.581e-01, 4.209e-01, 1.255e-01, -7.138e-02, 7.300e-02, -1.357e-01, -6.908e-02, -1.986e-02, 1.801e-02, -4.505e-02, -1.611e-01, -1.216e-01, -6.522e-02, -9.093e-02)); + r += mul(s2_2, M4(1.019e-01, -3.650e-02, 1.353e-02, 2.487e-01, -1.344e-04, 4.653e-02, 1.721e-02, 4.005e-02, 7.572e-03, -4.357e-02, -3.720e-02, 2.091e-02, 6.051e-03, -6.957e-02, -9.009e-02, -1.788e-02)); + r += mul(s2_3, M4(2.159e-02, -3.325e-02, 3.084e-02, 1.091e-01, -9.662e-02, 1.040e-01, 1.078e-01, -2.572e-02, 2.237e-04, -2.571e-02, -2.335e-02, -1.554e-02, 1.275e-01, -4.579e-02, -1.772e-02, 3.282e-02)); + r += mul(s2_4, M4(4.984e-02, 2.302e-01, 6.568e-02, 1.279e-01, 6.857e-02, -1.499e-01, -4.461e-02, -1.977e-01, -1.903e-01, 1.430e-01, 3.271e-02, 1.978e-01, 2.410e-01, 5.980e-01, -1.394e-01, 2.261e-01)); + r += mul(s2_5, M4(2.188e-02, -8.976e-03, 2.475e-02, 1.340e-02, -4.458e-02, 5.360e-02, 2.628e-02, -1.405e-02, 6.166e-02, -4.895e-02, 1.348e-03, 5.680e-02, -1.123e-01, 7.224e-02, -6.458e-02, 1.314e-01)); + r += mul(s2_6, M4(3.252e-02, -2.389e-02, -2.067e-02, -6.871e-02, -8.327e-02, 7.793e-02, 7.681e-03, 5.095e-02, -1.693e-02, -3.622e-02, 3.065e-02, -1.582e-02, -6.963e-03, 2.835e-02, 6.805e-02, -1.475e-02)); + r += mul(s2_7, M4(4.783e-02, -2.945e-02, 4.732e-02, -9.789e-04, -1.619e-02, -2.603e-02, -1.368e-01, 2.956e-02, 9.844e-02, -1.214e-01, 1.776e-01, -1.461e-01, -5.165e-02, -1.055e-02, 1.793e-01, -4.355e-02)); + r += mul(s2_8, M4(2.619e-03, 4.801e-02, 6.393e-02, -2.399e-02, -1.280e-03, -2.210e-02, -4.649e-02, 1.561e-03, -1.789e-02, 5.576e-02, 1.200e-01, 3.338e-03, 4.475e-02, -2.957e-02, 9.300e-02, -7.837e-02)); + r += mul(s3_0, M4(-1.536e-01, -3.593e-03, -1.064e-02, 1.740e-02, 9.197e-02, 2.772e-01, 5.258e-01, 5.745e-01, 2.331e-02, 8.995e-02, 2.611e-02, 5.463e-02, 4.872e-02, -8.230e-03, -1.742e-02, 3.405e-03)); + r += mul(s3_1, M4(4.799e-02, 1.088e-01, -7.562e-02, 5.926e-02, 4.190e-01, -4.922e-01, -1.822e-01, -2.309e-01, 1.776e-01, 1.799e-01, 1.213e-01, 3.198e-01, -1.565e-01, 2.118e-02, -5.914e-02, 1.048e-01)); + r += mul(s3_2, M4(-6.867e-02, -2.488e-02, 2.563e-02, -3.161e-02, -4.038e-02, 5.042e-02, 2.474e-02, 3.962e-03, -4.263e-02, 4.382e-02, -6.197e-03, 5.435e-02, 8.477e-02, -7.694e-02, -2.473e-02, -2.000e-02)); + r += mul(s3_3, M4(-6.567e-02, 7.271e-02, -2.275e-02, -4.345e-03, -4.825e-02, -7.541e-01, 5.163e-01, 9.170e-01, -1.040e-01, -9.911e-03, 3.569e-02, 2.347e-01, 2.350e-02, 6.202e-02, 7.421e-03, 2.377e-02)); + r += mul(s3_4, M4(-3.371e-02, -2.738e-02, 1.670e-01, 2.607e-01, -5.009e-02, 5.743e-03, -6.991e-01, -2.858e-02, -6.907e-02, -4.016e-01, 3.462e-01, 9.128e-01, -1.622e-01, 1.392e-01, 2.250e-01, 1.183e-01)); + r += mul(s3_5, M4(-8.330e-03, 1.029e-01, 1.045e-01, 2.013e-01, 2.609e-02, 7.939e-02, -1.054e-01, 6.487e-02, 1.165e-01, -6.250e-02, 1.274e-01, 2.396e-01, 2.390e-01, -2.468e-01, 1.178e-02, 6.794e-02)); + r += mul(s3_6, M4(5.411e-02, -5.669e-02, 2.831e-02, -3.762e-02, 1.186e-01, 1.750e-01, -2.862e-01, -9.876e-02, 5.851e-02, 2.750e-02, 7.348e-03, -2.151e-01, -3.151e-02, 5.225e-02, 3.178e-02, 1.438e-02)); + r += mul(s3_7, M4(-2.053e-03, 2.875e-02, -4.633e-02, -7.843e-02, -5.216e-02, -1.497e-04, -2.534e-01, -5.098e-01, 3.092e-02, -4.215e-02, -1.330e-01, -9.137e-02, 5.062e-02, 5.514e-02, -1.958e-01, 6.162e-03)); + r += mul(s3_8, M4(3.627e-02, 1.482e-02, 2.228e-02, -7.151e-02, -1.770e-02, 6.009e-02, 2.013e-01, 2.403e-02, 1.912e-03, -9.001e-03, 1.673e-02, -3.465e-02, 5.222e-02, -3.027e-02, -4.458e-03, -6.391e-02)); + r += V4(-3.261e-03, 1.350e-04, -6.605e-05, 1.307e-04); + return r; +} + +V4 f1(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-5.528e-02, 2.435e-02, -2.728e-02, 5.042e-02, -2.357e-02, 1.752e-02, 6.730e-02, -1.869e-02, 5.562e-02, 2.108e-03, -2.535e-02, -7.791e-02, -6.984e-02, 8.842e-02, 7.203e-02, 3.709e-02)); + r += mul(s0_1, M4(-6.164e-02, -1.824e-02, 8.179e-02, -3.238e-02, 5.338e-02, -5.506e-02, -1.020e-01, 1.520e-02, 1.953e-01, -2.850e-02, 8.323e-02, -8.899e-02, 5.112e-02, 6.369e-02, -5.510e-02, 1.997e-02)); + r += mul(s0_2, M4(6.117e-02, -1.311e-02, -9.258e-03, -1.479e-02, -2.710e-02, 2.958e-02, 2.946e-02, -9.472e-03, 4.257e-02, -7.053e-02, -5.896e-02, 5.475e-02, 6.131e-02, -1.827e-02, -2.909e-02, -6.470e-02)); + r += mul(s0_3, M4(-1.411e-01, 1.597e-01, 2.142e-01, 6.972e-02, 1.704e-02, 4.423e-02, -8.405e-02, 4.993e-02, 1.176e-02, -8.471e-02, 4.062e-02, -1.001e-01, -3.805e-02, 3.820e-02, -6.258e-01, 2.568e-01)); + r += mul(s0_4, M4(3.384e-01, -2.619e-01, 1.799e-01, -3.175e-01, 3.472e-03, -1.186e-01, 7.886e-02, -1.126e-01, 1.378e-01, -3.772e-02, -1.396e-02, 6.889e-02, -1.383e-01, 1.958e-01, 7.297e-02, -1.066e+00)); + r += mul(s0_5, M4(-4.115e-04, 8.733e-03, 3.432e-02, 5.650e-02, 9.203e-02, 6.899e-02, -9.987e-03, 5.139e-02, 2.075e-01, -1.229e-02, 5.912e-02, -2.866e-02, -1.602e-01, 1.654e-01, 6.957e-02, 5.472e-02)); + r += mul(s0_6, M4(-1.000e-01, 9.401e-02, -3.864e-02, 1.160e-01, 1.108e-03, 8.814e-02, 6.570e-04, 2.167e-02, 6.762e-05, -1.080e-02, -1.670e-02, -4.178e-03, -9.704e-03, 2.164e-01, 3.748e-02, -1.258e-02)); + r += mul(s0_7, M4(7.557e-02, -2.360e-01, -2.727e-02, -7.688e-02, -3.110e-02, 1.671e-02, -4.238e-02, 5.553e-02, 6.518e-02, 3.357e-02, -2.725e-02, -2.524e-02, -1.352e-01, -1.005e-01, -4.108e-02, 2.664e-01)); + r += mul(s0_8, M4(9.624e-02, 5.754e-03, 8.412e-02, -2.955e-02, 2.850e-02, 8.830e-03, -4.162e-02, -1.337e-02, -4.374e-02, -2.352e-02, -1.566e-02, 1.822e-02, 7.979e-02, -9.058e-02, -1.071e-01, -3.379e-03)); + r += mul(s1_0, M4(1.395e-02, 1.801e-02, 1.899e-03, -3.313e-02, 2.251e-02, -3.697e-03, 5.577e-02, -3.001e-02, -6.090e-02, 1.645e-01, -1.047e-01, 1.483e-01, -6.634e-03, 3.917e-04, -1.999e-02, 2.114e-02)); + r += mul(s1_1, M4(2.859e-03, 5.455e-02, 4.336e-02, -2.717e-02, 9.302e-02, -9.807e-02, 7.046e-02, -3.707e-02, -1.275e-01, -3.463e-02, -1.160e-01, -4.227e-02, 3.162e-02, 3.583e-02, 4.579e-02, -1.196e-02)); + r += mul(s1_2, M4(-7.086e-03, 2.542e-03, 1.500e-03, -6.273e-03, 5.711e-02, -5.317e-02, -5.455e-03, 4.847e-02, 8.830e-02, 5.991e-02, 3.356e-02, 1.214e-03, -5.272e-03, -5.211e-02, -2.142e-02, -1.246e-02)); + r += mul(s1_3, M4(-4.807e-02, 4.530e-02, 2.719e-01, -1.035e-02, 4.911e-02, -5.824e-03, -6.478e-02, -1.051e-03, -1.348e-02, 6.405e-01, -4.257e-01, 3.690e-01, -9.665e-02, 2.101e-01, 6.571e-02, 9.738e-02)); + r += mul(s1_4, M4(2.423e-01, -2.074e-01, -4.394e-01, -2.830e-02, 5.415e-02, -2.337e-01, 6.080e-01, -1.843e-01, -5.128e-01, 1.559e-01, -2.033e-01, -6.040e-02, -6.726e-02, 2.589e-01, 1.901e-01, -9.598e-02)); + r += mul(s1_5, M4(-1.456e-01, 6.484e-02, 1.125e-01, -1.183e-02, 2.186e-01, 2.930e-02, -4.285e-02, 6.272e-02, 1.500e-01, 1.033e-01, 2.173e-01, -3.328e-02, -6.785e-02, -7.882e-02, -1.450e-01, 7.182e-02)); + r += mul(s1_6, M4(-4.062e-02, 9.988e-02, -5.106e-02, 1.546e-01, 5.122e-02, -7.398e-02, -5.320e-03, -5.669e-02, -4.188e-02, 2.035e-01, -5.253e-02, -7.554e-03, -6.233e-02, 1.285e-01, 1.152e-02, 7.495e-02)); + r += mul(s1_7, M4(1.168e-01, -1.061e-01, -8.798e-02, -2.456e-01, -1.274e-01, -9.338e-02, 6.064e-04, 1.255e-01, 2.944e-02, -9.599e-02, -1.606e-01, 1.477e-01, -5.541e-02, -9.992e-02, -5.652e-02, 1.402e-02)); + r += mul(s1_8, M4(-8.447e-02, -2.272e-02, 3.291e-02, 1.141e-01, 2.835e-01, 2.747e-02, 9.338e-03, -1.271e-01, 1.118e-03, -3.543e-02, -3.201e-02, 5.803e-02, 1.793e-01, -6.889e-02, -3.139e-02, -1.000e-01)); + r += mul(s2_0, M4(3.477e-02, 8.152e-03, -8.100e-03, 3.869e-02, 4.675e-02, 8.080e-02, -4.909e-02, 6.764e-03, -2.946e-03, -7.021e-02, -1.191e-02, -1.660e-02, -5.967e-02, -1.872e-02, -3.485e-02, 3.391e-02)); + r += mul(s2_1, M4(1.685e-01, -2.681e-01, -2.340e-01, -1.748e-01, -1.593e-01, 7.496e-02, 3.748e-02, 1.562e-02, 5.150e-02, -3.648e-02, 3.739e-02, -4.384e-02, -1.521e-02, -1.061e-01, -1.381e-01, 1.733e-02)); + r += mul(s2_2, M4(1.573e-01, 1.415e-01, 1.714e-01, -5.175e-02, -2.442e-02, 1.054e-02, 3.047e-03, -5.944e-03, -6.027e-03, 1.034e-02, -3.381e-02, 4.299e-02, -9.763e-02, 4.729e-02, 9.642e-02, -1.450e-02)); + r += mul(s2_3, M4(8.191e-03, 1.353e-01, -6.018e-02, 5.677e-02, -1.725e-02, -1.324e-01, 1.646e-01, -1.154e-01, -9.796e-03, 3.066e-02, -5.975e-02, 2.878e-02, -1.381e-01, 1.550e-01, 3.556e-02, 8.926e-02)); + r += mul(s2_4, M4(1.715e-01, -2.115e-02, 8.179e-02, -2.066e-01, 1.275e-01, 1.599e-01, 2.325e-02, -9.637e-03, 6.565e-02, -1.901e-01, 7.185e-02, -1.559e-01, 1.106e-01, -6.210e-02, -3.672e-01, 6.248e-02)); + r += mul(s2_5, M4(-3.453e-03, 5.284e-02, -1.031e-01, 5.091e-02, 1.538e-02, -9.971e-02, -5.610e-02, -2.585e-02, 6.441e-02, 1.113e-01, 3.085e-02, 6.860e-02, -6.167e-02, -6.774e-02, -6.898e-02, -4.397e-03)); + r += mul(s2_6, M4(-1.561e-02, 5.106e-02, 2.999e-03, -7.663e-03, 6.665e-02, -1.217e-01, -9.529e-03, -2.096e-02, -2.825e-02, 4.854e-02, -2.196e-02, -7.191e-03, 2.274e-03, 1.698e-02, -1.727e-02, 1.967e-03)); + r += mul(s2_7, M4(3.534e-02, -1.077e-02, 1.607e-02, 4.542e-02, -7.989e-02, 1.294e-01, 4.920e-02, -6.332e-02, -9.402e-02, 2.028e-02, -6.305e-03, 9.061e-02, 2.225e-03, 2.352e-02, -4.032e-03, -4.985e-02)); + r += mul(s2_8, M4(7.112e-02, -1.427e-02, -2.352e-02, -2.989e-02, -5.633e-02, -6.039e-03, 3.496e-03, 2.535e-02, 1.265e-01, -4.541e-02, -5.393e-02, -5.355e-02, 1.498e-03, 2.057e-02, 1.278e-02, 5.662e-02)); + r += mul(s3_0, M4(9.523e-02, -7.183e-02, -2.740e-01, -1.569e-02, 1.008e-01, 3.065e+00, -2.003e-01, 1.938e-01, 7.503e-02, -1.096e-01, -3.177e-02, -4.074e-02, 1.090e-03, -2.250e-02, -4.727e-02, 2.528e-02)); + r += mul(s3_1, M4(-7.789e-02, 7.186e-03, 3.838e-01, -1.314e-01, -4.119e-01, 1.344e-01, 5.252e-02, -4.478e-02, -2.421e-01, 8.221e-02, 1.588e-01, 5.943e-02, -6.960e-02, -7.055e-02, -5.857e-02, -2.367e-02)); + r += mul(s3_2, M4(1.578e-01, -5.477e-02, -1.343e-01, 7.698e-02, 9.761e-02, -2.725e-02, -6.329e-02, -5.552e-02, -6.854e-02, 1.143e-02, -8.043e-02, 1.416e-02, 5.387e-02, 1.371e-01, 1.146e-01, -5.881e-04)); + r += mul(s3_3, M4(7.307e-03, -8.177e-02, 5.634e-02, -1.149e-01, -4.060e-01, 1.613e+00, -3.145e-01, 2.057e-02, -9.555e-02, 2.548e-01, 5.932e-02, 7.789e-02, 7.174e-03, -6.399e-03, -2.315e-02, 8.381e-03)); + r += mul(s3_4, M4(1.200e-01, 1.356e-01, 8.711e-03, 7.537e-02, -1.751e-01, 3.458e-02, 2.391e-01, -1.111e-01, 1.506e-01, -3.165e-01, -4.619e-01, -9.386e-02, -4.377e-02, -1.492e-01, -5.002e-01, 9.821e-02)); + r += mul(s3_5, M4(1.539e-01, 7.309e-02, 4.257e-03, -1.539e-01, -4.757e-01, 1.070e-01, 1.702e-02, 9.709e-02, -1.140e-01, 1.938e-01, 1.982e-01, -3.215e-02, -3.822e-01, 3.408e-01, 1.647e-01, 1.597e-01)); + r += mul(s3_6, M4(-3.320e-02, 4.854e-02, -1.957e-02, 3.353e-02, 1.823e-01, 8.532e-02, 3.236e-02, -1.874e-01, -1.073e-02, -6.598e-03, -2.954e-02, -2.175e-02, 1.184e-02, -3.856e-02, 2.166e-02, -2.608e-02)); + r += mul(s3_7, M4(2.038e-02, -4.606e-02, -3.841e-02, -4.008e-02, -2.542e-01, -1.076e-01, -2.891e-02, 1.837e-01, 3.842e-02, 1.753e-01, 3.043e-02, -3.298e-02, 2.990e-02, 1.215e-01, 9.583e-02, -5.860e-02)); + r += mul(s3_8, M4(6.138e-02, 3.405e-02, 3.364e-04, 6.037e-03, 1.811e-01, 9.691e-04, 3.497e-02, -1.810e-02, -3.940e-02, -1.159e-01, -7.007e-02, 1.170e-01, 1.829e-02, -2.216e-02, -1.689e-02, 1.150e-01)); + r += V4(-1.782e-04, -1.204e-03, 6.004e-04, -1.736e-03); + return r; +} + +void Pass5(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = Rmp8x8(tid.x) + blockStart; + uint2 size = GetInputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = (gxy + 0.5) * pt; + + V4 s0_0 = l0(-1.0, -1.0); + V4 s0_1 = l0(0.0, -1.0); + V4 s0_2 = l0(1.0, -1.0); + V4 s0_3 = l0(-1.0, 0.0); + V4 s0_4 = l0(0.0, 0.0); + V4 s0_5 = l0(1.0, 0.0); + V4 s0_6 = l0(-1.0, 1.0); + V4 s0_7 = l0(0.0, 1.0); + V4 s0_8 = l0(1.0, 1.0); + V4 s1_0 = -max(-s0_0, 0.0); + V4 s1_1 = -max(-s0_1, 0.0); + V4 s1_2 = -max(-s0_2, 0.0); + V4 s1_3 = -max(-s0_3, 0.0); + V4 s1_4 = -max(-s0_4, 0.0); + V4 s1_5 = -max(-s0_5, 0.0); + V4 s1_6 = -max(-s0_6, 0.0); + V4 s1_7 = -max(-s0_7, 0.0); + V4 s1_8 = -max(-s0_8, 0.0); + s0_0 = max(s0_0, 0.0); + s0_1 = max(s0_1, 0.0); + s0_2 = max(s0_2, 0.0); + s0_3 = max(s0_3, 0.0); + s0_4 = max(s0_4, 0.0); + s0_5 = max(s0_5, 0.0); + s0_6 = max(s0_6, 0.0); + s0_7 = max(s0_7, 0.0); + s0_8 = max(s0_8, 0.0); + + V4 s2_0 = l1(-1.0, -1.0); + V4 s2_1 = l1(0.0, -1.0); + V4 s2_2 = l1(1.0, -1.0); + V4 s2_3 = l1(-1.0, 0.0); + V4 s2_4 = l1(0.0, 0.0); + V4 s2_5 = l1(1.0, 0.0); + V4 s2_6 = l1(-1.0, 1.0); + V4 s2_7 = l1(0.0, 1.0); + V4 s2_8 = l1(1.0, 1.0); + V4 s3_0 = -max(-s2_0, 0.0); + V4 s3_1 = -max(-s2_1, 0.0); + V4 s3_2 = -max(-s2_2, 0.0); + V4 s3_3 = -max(-s2_3, 0.0); + V4 s3_4 = -max(-s2_4, 0.0); + V4 s3_5 = -max(-s2_5, 0.0); + V4 s3_6 = -max(-s2_6, 0.0); + V4 s3_7 = -max(-s2_7, 0.0); + V4 s3_8 = -max(-s2_8, 0.0); + s2_0 = max(s2_0, 0.0); + s2_1 = max(s2_1, 0.0); + s2_2 = max(s2_2, 0.0); + s2_3 = max(s2_3, 0.0); + s2_4 = max(s2_4, 0.0); + s2_5 = max(s2_5, 0.0); + s2_6 = max(s2_6, 0.0); + s2_7 = max(s2_7, 0.0); + s2_8 = max(s2_8, 0.0); + + t0[gxy] = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8); + t1[gxy] = f1(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8); +} + +//!PASS 6 +//!DESC out-shuffle +//!BLOCK_SIZE 16 +//!NUM_THREADS 64 +//!IN INPUT, t0, t1 +//!OUT OUTPUT + +#define l0(x, y) V4(O(t0, float2(x, y))) +#define l1(x, y) V4(O(t1, float2(x, y))) + +V4 f0(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-6.910e-02, 1.215e-03, -2.039e-03, -1.079e-04, 8.088e-02, -2.119e-02, -1.929e-02, 1.865e-02, -6.142e-02, 2.499e-02, -4.185e-03, 1.951e-03, -1.099e-02, 1.071e-02, 3.133e-03, -9.539e-03)); + r += mul(s0_1, M4(-2.129e-02, 6.812e-02, 2.738e-02, -2.965e-02, -1.569e-01, -7.369e-02, 6.714e-02, -2.416e-02, 6.421e-02, -3.329e-02, 4.397e-03, 1.902e-02, 1.426e-01, 7.469e-02, -3.306e-02, 1.260e-02)); + r += mul(s0_2, M4(-2.521e-02, -1.556e-02, -1.880e-02, 1.813e-02, -2.926e-03, -3.967e-02, -2.562e-02, 1.669e-02, 1.699e-03, 2.545e-02, 9.862e-03, 1.052e-02, -1.392e-02, 1.215e-02, 2.436e-02, 2.113e-04)); + r += mul(s0_3, M4(1.800e-02, -2.761e-02, 1.145e-02, -6.469e-02, 1.392e-01, 1.033e-02, 1.406e-01, -7.326e-03, -2.077e-02, 2.985e-03, -1.102e-01, 2.804e-02, -1.544e-02, 5.050e-02, 2.915e-02, 2.396e-02)); + r += mul(s0_4, M4(1.242e-01, -4.463e-01, -3.829e-01, 1.871e-01, -8.392e-02, 6.470e-02, -3.115e-01, -1.970e-01, -1.186e-01, -1.204e-01, -2.296e-02, -1.763e-01, -1.265e-01, -1.919e-01, 6.718e-02, 8.923e-02)); + r += mul(s0_5, M4(-2.493e-02, 3.014e-02, 2.446e-02, -1.488e-01, 1.299e-02, -5.759e-02, 2.138e-02, -9.211e-02, -8.051e-03, -4.216e-02, -1.327e-02, -9.724e-04, 3.675e-02, 7.968e-03, -3.353e-02, -4.044e-02)); + r += mul(s0_6, M4(2.027e-02, 3.813e-03, -2.557e-03, -2.670e-02, 2.068e-02, 1.886e-02, 6.014e-02, 3.191e-02, -1.917e-03, -2.659e-03, 1.273e-02, 3.109e-03, 9.881e-03, -4.410e-04, 7.569e-03, 1.276e-02)); + r += mul(s0_7, M4(-1.802e-03, 4.820e-02, 4.201e-02, 4.574e-02, 2.826e-02, 2.044e-02, 1.196e-01, 9.132e-02, 1.800e-02, 2.670e-02, -3.398e-03, 1.359e-02, 1.247e-02, 1.268e-02, 1.628e-03, -1.067e-02)); + r += mul(s0_8, M4(5.233e-03, 3.648e-02, 2.719e-02, 2.838e-02, 1.857e-03, -1.999e-03, 1.703e-02, 5.921e-02, 7.925e-03, -2.543e-03, 5.431e-03, -1.102e-02, -1.116e-02, -5.510e-03, -9.183e-03, -8.054e-03)); + r += mul(s1_0, M4(-6.423e-02, -5.758e-03, -8.948e-03, -2.227e-03, 5.802e-02, -2.252e-02, -8.134e-03, 1.448e-02, -3.642e-02, 4.476e-03, 7.865e-03, 3.269e-03, 1.053e-02, 1.269e-02, -1.530e-03, -9.628e-03)); + r += mul(s1_1, M4(-2.553e-02, 4.747e-02, 4.136e-02, -2.368e-02, -1.401e-01, -4.967e-02, 6.372e-02, -1.788e-04, 3.663e-01, 2.193e-01, -8.228e-02, -8.507e-02, 1.404e-01, 8.229e-02, -5.862e-02, -1.161e-02)); + r += mul(s1_2, M4(-2.216e-02, -7.521e-03, -2.522e-02, 2.337e-02, -2.651e-03, -3.786e-02, -9.854e-03, 2.033e-02, 9.696e-03, 1.237e-01, 6.173e-03, 2.898e-02, -1.335e-02, 2.948e-02, 9.778e-03, -1.243e-02)); + r += mul(s1_3, M4(-1.598e-02, -1.677e-02, -4.726e-02, -2.250e-02, 2.076e-01, -2.825e-02, 1.389e-01, -2.552e-02, 3.209e-02, -3.267e-03, -9.876e-02, 3.775e-02, -5.440e-02, 6.367e-02, 8.425e-02, 7.583e-03)); + r += mul(s1_4, M4(-2.339e-01, -8.617e-02, -3.313e-01, 1.470e-01, -1.249e-01, 3.994e-01, -7.191e-01, -2.121e-01, 2.521e-02, 4.601e-02, -3.584e-01, -4.014e-01, -4.299e-01, -4.828e-01, 4.034e-01, 3.633e-01)); + r += mul(s1_5, M4(3.413e-02, -4.685e-03, 4.308e-02, -1.211e-01, 3.722e-02, -1.000e-01, 5.938e-02, -1.900e-01, 3.286e-03, 6.076e-03, 2.628e-02, -1.190e-01, 3.968e-02, -3.583e-02, -4.724e-02, 5.713e-02)); + r += mul(s1_6, M4(3.008e-02, -2.083e-02, 7.970e-03, -2.011e-02, -8.809e-03, 9.741e-03, 7.228e-02, 1.875e-02, -8.374e-03, -2.245e-03, 1.642e-02, -9.996e-03, 2.093e-02, 6.393e-03, 6.227e-03, -6.775e-03)); + r += mul(s1_7, M4(1.113e-02, 5.783e-02, -1.430e-02, 2.826e-02, -1.250e-02, -3.106e-02, 1.754e-01, 2.001e-01, -1.431e-02, -1.368e-02, 4.329e-02, 4.832e-02, 4.089e-02, 3.702e-02, -5.774e-03, 8.701e-03)); + r += mul(s1_8, M4(1.395e-03, 3.747e-02, 2.706e-02, 4.675e-02, -1.191e-02, -2.163e-02, 3.137e-02, 7.056e-02, 4.929e-03, -6.465e-03, 1.083e-03, 1.816e-02, -3.896e-03, 1.081e-02, -1.507e-02, -1.412e-02)); + r += mul(s2_0, M4(5.551e-02, 3.061e-02, 2.172e-02, -4.435e-04, 7.341e-02, -4.254e-03, -3.710e-02, 2.005e-02, 3.528e-02, 1.764e-02, 4.547e-03, -6.460e-03, 1.949e-01, 2.466e-02, 7.886e-02, -2.722e-03)); + r += mul(s2_1, M4(-1.216e-03, 4.895e-02, -2.548e-02, 1.354e-02, 1.184e-01, -2.592e-01, 3.262e-02, 3.213e-02, -7.885e-02, -2.429e-02, -5.811e-02, 1.909e-02, 3.185e-02, -7.057e-02, -2.388e-02, 1.018e-01)); + r += mul(s2_2, M4(-4.325e-03, 8.278e-03, -7.126e-04, -3.013e-03, -2.277e-02, 6.470e-02, -3.258e-02, 6.558e-03, 2.954e-02, 9.175e-03, -1.066e-03, -1.931e-02, 3.523e-03, 1.347e-03, -1.837e-03, -3.765e-03)); + r += mul(s2_3, M4(-1.063e-01, 1.364e-02, -1.031e-01, 7.569e-02, -3.770e-02, 3.667e-02, 2.683e-02, 5.980e-02, -1.057e-01, -1.107e-02, -7.272e-02, 5.094e-02, 7.605e-02, 1.566e-02, 1.708e-01, 2.124e-01)); + r += mul(s2_4, M4(1.344e-02, -6.091e-02, 2.694e-02, -2.727e-02, 2.786e-01, 5.187e-02, 6.738e-01, -9.220e-01, 1.745e-01, -1.468e-02, 1.843e-01, -1.866e-01, -9.396e-02, -1.505e-01, 2.471e-01, -1.138e+00)); + r += mul(s2_5, M4(6.506e-03, 7.226e-03, 9.650e-03, 3.959e-03, -2.858e-02, -1.124e-01, -5.599e-02, 8.081e-02, -3.923e-02, 6.977e-02, 2.327e-03, 1.164e-01, 1.242e-02, -1.947e-02, -4.582e-02, 2.119e-02)); + r += mul(s2_6, M4(-1.730e-02, -2.202e-02, -2.408e-02, -6.448e-02, -3.767e-03, 2.506e-02, -4.165e-02, 4.527e-02, 1.431e-02, -2.421e-02, -1.170e-02, -6.665e-02, -1.236e-02, 5.709e-03, -6.345e-03, -3.440e-02)); + r += mul(s2_7, M4(-4.211e-02, -5.191e-02, -9.762e-02, -1.275e-01, 2.079e-02, -1.004e-01, 7.470e-02, 1.084e-02, -1.789e-02, 8.006e-02, 3.170e-02, 1.111e-01, -4.772e-02, -6.100e-02, 2.375e-02, 2.545e-03)); + r += mul(s2_8, M4(-7.109e-03, 1.968e-03, -9.159e-03, -1.523e-02, -1.024e-02, -5.787e-04, -4.581e-02, -1.496e-02, 2.302e-02, -1.568e-02, 2.850e-02, 9.731e-03, -1.219e-02, 1.316e-03, -1.859e-02, 8.662e-02)); + r += mul(s3_0, M4(2.241e-01, 1.599e-02, -3.007e-02, -8.278e-02, -2.343e-02, -1.323e-02, 6.153e-03, 8.030e-03, 1.988e-02, 1.870e-02, 7.620e-03, -1.035e-02, 2.443e-01, 4.061e-02, 3.123e-02, -4.152e-03)); + r += mul(s3_1, M4(-1.500e-02, -2.365e-02, -2.046e-02, 4.369e-02, 7.611e-03, -9.342e-03, 4.413e-03, -1.110e-03, -1.238e-01, -3.394e-02, -4.442e-02, 2.423e-02, -9.742e-02, -2.324e-02, -3.479e-02, 4.742e-02)); + r += mul(s3_2, M4(5.839e-03, 1.560e-02, -3.631e-03, 6.730e-03, -2.371e-03, -1.011e-02, -3.821e-03, 1.830e-03, 2.255e-02, 1.426e-02, -1.146e-02, -1.650e-02, 9.035e-03, 5.831e-03, 2.660e-03, -4.854e-03)); + r += mul(s3_3, M4(-1.694e-01, -2.771e-01, 6.449e-01, -2.979e-01, 9.108e-02, -2.277e-02, -5.309e-02, -3.552e-02, -1.626e-01, 2.544e-02, -7.033e-02, 7.145e-02, -1.334e-01, 1.008e-01, 1.121e-01, 1.733e-01)); + r += mul(s3_4, M4(-1.019e-01, 1.989e-01, -6.682e-02, -7.066e-02, -3.795e-02, 1.362e-01, 4.307e-02, -4.383e-02, 6.286e-01, -3.881e-01, 1.970e-01, -3.421e-01, -5.374e-03, -2.446e-01, -8.874e-02, -4.099e-01)); + r += mul(s3_5, M4(1.279e-02, -1.406e-02, 7.997e-03, 1.743e-02, 2.251e-02, -4.285e-02, -2.154e-03, -1.441e-02, -2.329e-02, 1.667e-02, 4.333e-02, 1.229e-01, -2.284e-03, -2.450e-02, -8.000e-03, -1.712e-02)); + r += mul(s3_6, M4(7.251e-02, 9.488e-03, -1.511e-01, -6.947e-02, -2.728e-02, 7.342e-03, 2.289e-02, 1.443e-02, 1.492e-02, -8.903e-03, -5.817e-02, -4.836e-02, -1.677e-03, 1.964e-02, -6.858e-03, -1.328e-02)); + r += mul(s3_7, M4(-8.618e-02, -5.596e-02, -1.276e-01, -1.230e-01, 4.851e-03, -5.676e-02, 2.939e-02, -4.192e-02, -2.508e-02, 4.430e-02, 1.352e-01, 2.072e-02, -8.584e-03, -3.983e-02, 1.177e-02, -4.721e-02)); + r += mul(s3_8, M4(6.050e-03, -3.781e-04, -3.124e-03, -1.667e-02, -1.291e-02, -1.315e-02, -2.106e-02, -5.240e-03, 1.412e-02, -2.504e-02, 3.138e-02, -2.989e-02, -6.363e-03, -1.480e-04, 1.157e-03, 1.933e-02)); + r += V4(-8.480e-04, -1.222e-04, -8.629e-04, -1.828e-04); + return tanh(r); +} + +void Pass6(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = (Rmp8x8(tid.x) << 1) + blockStart; + uint2 size = GetOutputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = ((gxy >> 1) + 0.5) * pt; + + V4 s0_0 = l0(-1.0, -1.0); + V4 s0_1 = l0(0.0, -1.0); + V4 s0_2 = l0(1.0, -1.0); + V4 s0_3 = l0(-1.0, 0.0); + V4 s0_4 = l0(0.0, 0.0); + V4 s0_5 = l0(1.0, 0.0); + V4 s0_6 = l0(-1.0, 1.0); + V4 s0_7 = l0(0.0, 1.0); + V4 s0_8 = l0(1.0, 1.0); + V4 s1_0 = -max(-s0_0, 0.0); + V4 s1_1 = -max(-s0_1, 0.0); + V4 s1_2 = -max(-s0_2, 0.0); + V4 s1_3 = -max(-s0_3, 0.0); + V4 s1_4 = -max(-s0_4, 0.0); + V4 s1_5 = -max(-s0_5, 0.0); + V4 s1_6 = -max(-s0_6, 0.0); + V4 s1_7 = -max(-s0_7, 0.0); + V4 s1_8 = -max(-s0_8, 0.0); + s0_0 = max(s0_0, 0.0); + s0_1 = max(s0_1, 0.0); + s0_2 = max(s0_2, 0.0); + s0_3 = max(s0_3, 0.0); + s0_4 = max(s0_4, 0.0); + s0_5 = max(s0_5, 0.0); + s0_6 = max(s0_6, 0.0); + s0_7 = max(s0_7, 0.0); + s0_8 = max(s0_8, 0.0); + + V4 s2_0 = l1(-1.0, -1.0); + V4 s2_1 = l1(0.0, -1.0); + V4 s2_2 = l1(1.0, -1.0); + V4 s2_3 = l1(-1.0, 0.0); + V4 s2_4 = l1(0.0, 0.0); + V4 s2_5 = l1(1.0, 0.0); + V4 s2_6 = l1(-1.0, 1.0); + V4 s2_7 = l1(0.0, 1.0); + V4 s2_8 = l1(1.0, 1.0); + V4 s3_0 = -max(-s2_0, 0.0); + V4 s3_1 = -max(-s2_1, 0.0); + V4 s3_2 = -max(-s2_2, 0.0); + V4 s3_3 = -max(-s2_3, 0.0); + V4 s3_4 = -max(-s2_4, 0.0); + V4 s3_5 = -max(-s2_5, 0.0); + V4 s3_6 = -max(-s2_6, 0.0); + V4 s3_7 = -max(-s2_7, 0.0); + V4 s3_8 = -max(-s2_8, 0.0); + s2_0 = max(s2_0, 0.0); + s2_1 = max(s2_1, 0.0); + s2_2 = max(s2_2, 0.0); + s2_3 = max(s2_3, 0.0); + s2_4 = max(s2_4, 0.0); + s2_5 = max(s2_5, 0.0); + s2_6 = max(s2_6, 0.0); + s2_7 = max(s2_7, 0.0); + s2_8 = max(s2_8, 0.0); + + V4 r = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8); + + static const float3x3 rgb2yuv = {0.299, 0.587, 0.114, -0.169, -0.331, 0.5, 0.5, -0.419, -0.081}; + static const float3x3 yuv2rgb = {1, -0.00093, 1.401687, 1, -0.3437, -0.71417, 1, 1.77216, 0.00099}; + float2 opt = float2(GetOutputPt()); + + pos -= 0.5f * opt; + float3 yuv = mul(rgb2yuv, INPUT.SampleLevel(SL, pos, 0).rgb); + OUTPUT[gxy] = float4(mul(yuv2rgb, float3(saturate(yuv.r + r.x), yuv.yz)), 1); + + ++gxy.x; + pos.x += opt.x; + yuv = mul(rgb2yuv, INPUT.SampleLevel(SL, pos, 0).rgb); + OUTPUT[gxy] = float4(mul(yuv2rgb, float3(saturate(yuv.r + r.y), yuv.yz)), 1); + + ++gxy.y; + pos.y += opt.y; + yuv = mul(rgb2yuv, INPUT.SampleLevel(SL, pos, 0).rgb); + OUTPUT[gxy] = float4(mul(yuv2rgb, float3(saturate(yuv.r + r.w), yuv.yz)), 1); + + --gxy.x; + pos.x -= opt.x; + yuv = mul(rgb2yuv, INPUT.SampleLevel(SL, pos, 0).rgb); + OUTPUT[gxy] = float4(mul(yuv2rgb, float3(saturate(yuv.r + r.z), yuv.yz)), 1); +} diff --git a/src/Effects/CuNNy/CuNNy-6x8C-NVL-DN.hlsl b/src/Effects/CuNNy/CuNNy-6x8C-NVL-DN.hlsl new file mode 100644 index 000000000..ce86c52a4 --- /dev/null +++ b/src/Effects/CuNNy/CuNNy-6x8C-NVL-DN.hlsl @@ -0,0 +1,1247 @@ +// CuNNy 6x8C BILINEAR RGB NVL DN - https://github.com/cunnyplapper/CuNNy + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +//!MAGPIE EFFECT +//!VERSION 4 +//!SORT_NAME CuNNy-DN-D08N06 + +//!TEXTURE +Texture2D INPUT; + +//!TEXTURE +//!WIDTH INPUT_WIDTH * 2 +//!HEIGHT INPUT_HEIGHT * 2 +Texture2D OUTPUT; + +//!SAMPLER +//!FILTER POINT +SamplerState SP; + +//!SAMPLER +//!FILTER LINEAR +SamplerState SL; + +//!COMMON +#define O(t, p) t.SampleLevel(SP, pos + p * pt, 0) +#define V4 min16float4 +#define M4 min16float4x4 + +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +//!FORMAT R8G8B8A8_SNORM +Texture2D t0; + +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +//!FORMAT R8G8B8A8_SNORM +Texture2D t1; + +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +//!FORMAT R8G8B8A8_SNORM +Texture2D t2; + +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +//!FORMAT R8G8B8A8_SNORM +Texture2D t3; + +//!PASS 1 +//!DESC in +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 +//!IN INPUT +//!OUT t0, t1 + +#define l0(x, y) min16float((dot(float3(-2.035e-01, -4.051e-01, -9.041e-02), O(INPUT, float2(x, y)).rgb) + 4.315e-01)) + +V4 f0(min16float s0_0, min16float s0_1, min16float s0_2, min16float s0_3, min16float s0_4, min16float s0_5, min16float s0_6, min16float s0_7, min16float s0_8) { + V4 r = 0.0; + r += V4(-5.333e-02, 1.506e-02, -4.863e-02, 5.352e-03) * s0_0; + r += V4(3.064e-02, -1.241e-03, 3.831e-02, 1.406e-01) * s0_1; + r += V4(-3.234e-03, 3.668e-03, -1.982e-02, -1.101e-01) * s0_2; + r += V4(-4.854e-01, 5.950e-01, -9.253e-02, -3.601e-01) * s0_3; + r += V4(-1.239e-01, 1.942e-01, 4.939e-01, 5.723e-01) * s0_4; + r += V4(-1.746e-02, 8.397e-04, 4.267e-02, -7.863e-02) * s0_5; + r += V4(5.387e-01, -5.918e-01, -5.641e-02, 2.018e-02) * s0_6; + r += V4(9.656e-02, -2.095e-01, -1.788e-01, -1.900e-01) * s0_7; + r += V4(1.780e-02, -3.460e-03, -1.204e-01, -1.629e-02) * s0_8; + r += V4(-8.698e-03, -1.051e-02, -2.456e-02, 8.033e-03); + return r; +} + +V4 f1(min16float s0_0, min16float s0_1, min16float s0_2, min16float s0_3, min16float s0_4, min16float s0_5, min16float s0_6, min16float s0_7, min16float s0_8) { + V4 r = 0.0; + r += V4(1.238e-02, 8.036e-03, 3.125e-01, 1.440e-01) * s0_0; + r += V4(-5.165e-02, -8.626e-03, -3.096e-01, 4.477e-02) * s0_1; + r += V4(3.169e-04, 1.974e-02, -2.705e-01, -5.500e-02) * s0_2; + r += V4(-2.838e-02, 3.386e-03, 1.727e-01, 4.413e-01) * s0_3; + r += V4(1.497e-01, 1.326e-02, 3.072e-01, -5.548e-01) * s0_4; + r += V4(1.428e-04, -3.819e-01, -2.438e-01, 5.685e-03) * s0_5; + r += V4(-3.416e-02, 2.989e-03, 2.969e-02, 2.118e-02) * s0_6; + r += V4(5.299e-01, 4.041e-03, -9.012e-02, -7.878e-02) * s0_7; + r += V4(-5.243e-02, 9.452e-03, 7.145e-02, 3.160e-02) * s0_8; + r += V4(1.285e-01, 1.293e-01, -1.923e-02, 1.313e-02); + return r; +} + +void Pass1(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = Rmp8x8(tid.x) + blockStart; + uint2 size = GetInputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = (gxy + 0.5) * pt; + + min16float s0_0 = l0(-1.0, -1.0); + min16float s0_1 = l0(0.0, -1.0); + min16float s0_2 = l0(1.0, -1.0); + min16float s0_3 = l0(-1.0, 0.0); + min16float s0_4 = l0(0.0, 0.0); + min16float s0_5 = l0(1.0, 0.0); + min16float s0_6 = l0(-1.0, 1.0); + min16float s0_7 = l0(0.0, 1.0); + min16float s0_8 = l0(1.0, 1.0); + + t0[gxy] = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8); + t1[gxy] = f1(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8); +} + +//!PASS 2 +//!DESC conv1 +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 +//!IN t0, t1 +//!OUT t2, t3 + +#define l0(x, y) V4(O(t0, float2(x, y))) +#define l1(x, y) V4(O(t1, float2(x, y))) + +V4 f0(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8) { + V4 r = 0.0; + r += mul(s0_0, M4(1.415e-01, -1.943e-02, -8.607e-02, 1.720e-02, -5.503e-02, -7.077e-02, 6.357e-02, 1.637e-01, -3.997e-04, 3.993e-01, 1.124e-02, -7.681e-02, 2.275e-01, 2.744e-01, 3.333e-02, -7.161e-02)); + r += mul(s0_1, M4(9.960e-02, 3.193e-01, 1.675e-01, -3.303e-01, 2.128e-01, -4.128e-01, -2.347e-01, 7.342e-01, 1.727e-01, 3.478e-02, -1.685e-01, 2.954e-01, 3.302e-01, -4.103e-01, -1.933e-01, 6.543e-01)); + r += mul(s0_2, M4(3.761e-01, -1.545e-01, -1.035e-01, 4.556e-01, 2.239e-01, 2.557e-01, -2.634e-01, -3.533e-01, 1.636e-01, -6.189e-02, 7.688e-02, 4.012e-01, 2.164e-01, -1.716e-01, -1.205e-01, 8.663e-02)); + r += mul(s0_3, M4(-1.181e-02, 1.876e-01, -6.568e-02, -5.398e-02, 1.158e-01, -1.222e-01, 5.085e-02, 2.418e-01, 1.176e-01, -3.773e-01, -2.300e-02, 1.588e-02, 3.060e-02, 6.070e-02, -7.153e-02, 1.807e-04)); + r += mul(s0_4, M4(2.148e-01, -3.282e-01, -1.202e-01, -5.740e-02, -8.745e-02, 4.563e-01, 1.371e-01, -2.197e-02, 1.796e-01, -8.210e-02, 4.639e-01, -2.013e-02, -1.657e-01, 1.274e-01, 1.544e-01, -3.108e-01)); + r += mul(s0_5, M4(5.544e-01, 1.682e-01, -5.642e-01, 2.636e-01, -5.510e-01, -1.371e-01, 1.450e-01, -4.443e-01, 1.705e-01, -1.304e-01, -2.385e-02, -7.088e-02, -3.489e-01, 6.447e-02, 6.309e-02, -1.137e-01)); + r += mul(s0_6, M4(-1.218e-01, -2.795e-02, -1.160e-01, 8.723e-02, -2.646e-02, -2.134e-01, 1.170e-02, 1.284e-01, -1.001e-02, 1.919e-01, -9.593e-02, -2.529e-01, -8.665e-02, 1.473e-01, 3.237e-01, -9.264e-02)); + r += mul(s0_7, M4(-2.280e-01, -1.011e-01, -1.681e-01, -1.644e-01, 7.984e-02, 4.135e-02, 9.764e-02, 1.405e-01, -3.485e-01, 2.078e-01, 8.260e-02, -6.538e-02, -1.472e-01, -2.301e-02, -1.911e-02, -6.720e-04)); + r += mul(s0_8, M4(-2.326e-01, -1.645e-01, -1.724e-01, -1.018e-01, 1.470e-01, 2.117e-01, 3.018e-01, -7.956e-02, -1.260e-01, -2.090e-01, -7.409e-02, 8.810e-03, 7.153e-02, 1.818e-02, 8.868e-03, -1.993e-03)); + r += mul(s1_0, M4(-4.601e-02, -1.224e-01, 1.492e-01, 1.063e-01, 1.004e-01, 3.807e-02, -7.326e-02, 3.358e-02, 2.690e-02, 3.908e-02, 7.352e-02, -1.512e-01, -1.342e-02, 3.690e-01, -2.220e-01, -9.966e-02)); + r += mul(s1_1, M4(-4.769e-01, 1.653e-01, -2.428e-01, 3.893e-02, 8.017e-01, -5.618e-01, 7.747e-02, 2.968e-01, 2.540e-01, -3.845e-01, -2.625e-01, 4.699e-01, 4.378e-01, -9.630e-01, -5.949e-02, 8.363e-01)); + r += mul(s1_2, M4(-4.463e-01, -1.382e-01, -3.918e-01, -4.812e-01, 3.207e-01, -2.003e-01, 1.050e-01, 1.800e-01, 2.242e-01, -1.199e-01, -4.862e-02, 1.616e-01, 1.341e-01, -4.310e-01, -1.937e-01, 2.326e-01)); + r += mul(s1_3, M4(2.147e-02, -2.783e-01, 8.845e-02, 2.262e-01, 1.024e-01, 2.714e-01, -4.063e-02, -7.636e-03, 1.980e-02, -1.420e-01, -2.109e-02, 3.946e-02, 8.302e-02, 5.234e-01, -2.883e-01, -1.296e-01)); + r += mul(s1_4, M4(-5.593e-02, 7.059e-02, -1.420e-01, 8.657e-02, 2.728e-01, -8.770e-02, 1.477e-01, -1.427e-01, -1.250e-01, 6.256e-02, -3.762e-01, -1.046e-01, -3.094e-01, 5.179e-01, -3.617e-02, -2.885e-01)); + r += mul(s1_5, M4(-1.382e-01, 2.495e-02, 3.461e-01, -5.939e-01, 3.019e-01, -8.266e-02, -3.544e-01, 2.824e-01, -1.029e-01, -3.089e-04, 1.307e-01, -6.184e-02, -1.293e-01, -4.540e-02, -3.406e-01, -1.988e-01)); + r += mul(s1_6, M4(-6.472e-02, -2.037e-01, -1.320e-02, 1.285e-01, -1.378e-01, -3.275e-02, -8.836e-02, 9.191e-02, 1.123e-01, 1.736e-01, -2.116e-01, 2.340e-02, -1.655e-01, 1.227e-01, 2.700e-01, -1.485e-01)); + r += mul(s1_7, M4(1.229e-01, 2.141e-02, 1.523e-01, 7.696e-02, -1.830e-01, -1.036e-01, -9.236e-02, -1.558e-01, -2.906e-01, -3.243e-02, -2.723e-02, -8.754e-02, -2.951e-01, 2.923e-02, -9.960e-02, -9.770e-03)); + r += mul(s1_8, M4(9.990e-02, 3.377e-01, 1.933e-01, -1.242e-01, -1.515e-01, -6.217e-02, 4.245e-02, -6.189e-02, -9.236e-02, -2.214e-01, -6.575e-02, 6.456e-03, 1.795e-02, 4.278e-02, -6.188e-02, 1.573e-02)); + r += mul(s2_0, M4(1.491e-01, -9.449e-02, -1.071e-01, 3.575e-02, -6.811e-04, -4.960e-02, -5.181e-04, 7.298e-02, 3.839e-02, -2.178e-02, -1.703e-02, 1.046e-01, -4.208e-02, 9.251e-03, 3.523e-02, -2.881e-01)); + r += mul(s2_1, M4(3.309e-02, 6.440e-02, 2.337e-01, 1.524e-01, -1.725e-02, 3.153e-02, 9.155e-03, -5.480e-02, 4.245e-02, -1.042e-01, -1.053e-01, 1.759e-01, -1.713e-01, -1.269e-01, -1.378e-02, -6.438e-02)); + r += mul(s2_2, M4(-1.648e-01, -6.306e-03, 8.299e-02, -1.812e-01, 6.679e-02, -6.670e-02, -8.122e-02, 1.284e-01, -7.879e-02, 9.292e-02, 7.607e-02, -2.007e-01, 2.088e-02, 5.058e-02, -1.943e-01, 1.150e-01)); + r += mul(s2_3, M4(9.643e-02, 2.546e-01, -5.823e-02, 6.665e-02, -6.931e-02, 1.891e-02, 1.862e-01, 1.711e-02, 1.426e-01, 2.191e-01, -2.335e-01, 2.214e-01, -5.269e-02, 2.464e-02, -9.016e-02, -7.974e-02)); + r += mul(s2_4, M4(3.501e-02, -1.022e-02, 1.990e-01, -7.641e-02, -1.492e-01, 1.836e-01, 8.877e-02, -2.226e-01, -2.686e-01, 1.809e-01, 2.979e-01, -2.644e-01, 1.681e-01, -3.821e-01, -1.366e-01, 7.164e-01)); + r += mul(s2_5, M4(2.277e-01, -1.757e-01, -1.340e-02, 1.040e-01, -7.691e-02, 1.556e-01, -1.029e-02, -9.558e-02, 2.705e-01, 4.410e-02, 1.649e-01, 6.361e-02, 1.790e-01, 2.952e-01, -5.692e-02, -3.225e-02)); + r += mul(s2_6, M4(-5.395e-02, 8.925e-02, 6.361e-02, -4.226e-02, -3.947e-02, -1.783e-01, -3.393e-02, 5.163e-02, 4.873e-02, 2.768e-01, -1.197e-01, -1.120e-01, -1.770e-02, 9.506e-02, 1.098e-01, -1.090e-01)); + r += mul(s2_7, M4(-2.177e-01, 7.495e-02, 8.441e-02, -1.043e-01, 2.036e-01, -1.763e-01, 1.748e-01, 1.660e-01, 1.121e-01, -2.253e-01, -1.790e-01, -1.439e-01, -1.083e-01, 5.504e-02, 2.336e-01, -9.936e-02)); + r += mul(s2_8, M4(-1.184e-01, -8.465e-02, 5.144e-02, 2.009e-02, 7.120e-02, 9.413e-02, 4.370e-02, -5.484e-02, -1.443e-01, -8.664e-02, -4.848e-02, 1.242e-01, 5.112e-02, 2.200e-01, -5.659e-03, 5.474e-02)); + r += mul(s3_0, M4(6.419e-01, -3.023e-01, 2.127e-01, 3.398e-01, -1.325e+00, -2.531e-01, -9.418e-01, -1.673e+00, -2.186e-02, -1.045e-01, -4.623e-02, 9.273e-02, 5.411e-02, 2.154e-01, 1.728e-01, -1.901e-01)); + r += mul(s3_1, M4(-1.247e-01, 2.308e-01, -5.479e-01, -4.446e-02, -2.334e-01, -7.716e-02, -1.220e-01, -3.670e-01, 2.478e-02, -4.998e-02, -7.881e-02, 1.175e-01, -6.152e-01, 8.178e-02, -8.520e-02, -2.934e-01)); + r += mul(s3_2, M4(-8.153e-01, 1.575e-01, 7.752e-01, 9.207e-01, 3.695e-02, -2.903e-01, -1.513e-01, 6.705e-03, -5.714e-02, 1.421e-01, 4.701e-02, -8.445e-02, 1.149e-01, -1.975e-01, -2.647e-01, 3.480e-01)); + r += mul(s3_3, M4(3.278e-02, 4.846e-01, -6.441e-01, -5.745e-02, 1.015e+00, -5.113e-01, -2.161e+00, 9.403e-01, 1.408e-01, 2.036e-01, -8.272e-02, 1.226e-01, -1.586e-01, -6.721e-02, -1.057e-01, -5.341e-02)); + r += mul(s3_4, M4(-1.353e+00, 7.765e-01, -7.567e-01, -9.945e-01, 4.103e-01, 1.065e-01, -1.313e-02, 2.815e-01, -3.549e-02, -1.802e-01, 3.446e-01, -3.407e-01, 3.526e-01, -3.278e-01, -2.182e-01, 7.167e-01)); + r += mul(s3_5, M4(2.939e-01, 1.015e+00, -1.901e-01, 7.339e-01, -1.241e-01, 8.653e-02, 3.034e-01, 4.420e-01, 1.446e-02, 3.259e-04, 1.860e-01, -1.794e-02, -1.243e-01, -7.423e-02, -1.561e-01, -3.792e-01)); + r += mul(s3_6, M4(-2.100e-02, 1.608e-01, 6.866e-02, 8.797e-02, 6.613e-01, -5.224e-01, -9.743e-01, 1.941e-01, -3.859e-02, 9.605e-02, -1.248e-02, -4.475e-03, 8.367e-02, 2.368e-01, 1.273e-01, -9.406e-02)); + r += mul(s3_7, M4(1.635e-01, 3.213e-01, -1.108e-01, 5.477e-01, 2.577e-01, -4.309e-01, 2.367e-01, 7.649e-02, -1.462e-02, -1.543e-01, -1.300e-01, -3.833e-02, -4.089e-02, -2.145e-02, 2.984e-01, 5.385e-02)); + r += mul(s3_8, M4(1.851e-01, -4.212e-01, -1.136e-01, -1.345e-01, -2.134e-01, -4.054e-01, -2.896e-01, -5.105e-02, -4.118e-02, -6.056e-02, 1.869e-02, 6.431e-02, 2.077e-02, -1.061e-01, -5.865e-02, 2.204e-01)); + r += V4(2.009e-02, -6.020e-02, -2.095e-01, -2.428e-04); + return r; +} + +V4 f1(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8) { + V4 r = 0.0; + r += mul(s0_0, M4(1.340e-01, -2.739e-02, -5.723e-01, 5.792e-02, -2.152e-01, 5.695e-02, 1.657e-01, 1.371e-01, -1.275e-01, 2.891e-01, -2.673e-01, 9.725e-02, -5.268e-02, 5.140e-02, -3.580e-01, 4.427e-01)); + r += mul(s0_1, M4(2.613e-01, 3.597e-01, -3.318e-01, -1.844e-02, -1.190e-02, -2.073e-01, -1.665e-01, -3.505e-01, 8.562e-02, -3.558e-01, 1.160e-01, 1.326e-03, -7.102e-02, -4.067e-01, 3.810e-01, 1.910e-01)); + r += mul(s0_2, M4(4.934e-02, -5.566e-01, 6.730e-01, -1.377e-01, 1.549e-02, 2.280e-01, -3.924e-01, 1.057e-01, 6.662e-03, -2.799e-01, 9.640e-02, -8.985e-02, 1.093e-02, -1.567e-01, 8.349e-02, -1.169e-01)); + r += mul(s0_3, M4(9.578e-02, -9.551e-02, 4.883e-02, 1.361e-01, -2.646e-01, 9.763e-02, -2.427e-01, 4.072e-01, -3.877e-01, 1.953e-01, 1.251e-01, 4.511e-02, 6.040e-02, 1.248e-02, -2.899e-02, 2.293e-01)); + r += mul(s0_4, M4(1.141e-01, -3.109e-01, -2.500e-01, -2.775e-01, -8.209e-02, 7.398e-02, 2.509e-01, 4.549e-02, 7.525e-02, 4.394e-01, 3.993e-01, 1.754e-01, 1.776e-01, 2.971e-01, -3.441e-01, -5.120e-01)); + r += mul(s0_5, M4(-6.703e-03, 5.090e-01, -1.500e-01, 2.635e-01, 1.989e-01, -6.816e-01, 4.591e-01, -3.330e-01, 4.645e-03, -1.490e-01, -1.983e-01, -1.401e-01, 1.173e-01, -1.492e-02, 3.411e-01, -3.166e-02)); + r += mul(s0_6, M4(-3.800e-02, -1.477e-01, 5.108e-02, 2.905e-01, -7.616e-03, -1.992e-01, -1.272e-01, 1.880e-01, -3.035e-02, 2.286e-01, 8.193e-02, 2.364e-01, -4.650e-02, 6.422e-03, 2.178e-01, -3.440e-01)); + r += mul(s0_7, M4(1.507e-02, -1.787e-01, 2.303e-01, -8.268e-02, -8.501e-02, -6.999e-02, -2.088e-01, 1.476e-01, 1.189e-01, 1.203e-01, -2.417e-01, -2.783e-01, 5.869e-02, 2.074e-01, -1.446e-01, 1.392e-01)); + r += mul(s0_8, M4(9.754e-02, 1.925e-01, -3.828e-03, -2.816e-01, -1.213e-01, -2.292e-02, 2.923e-01, -2.626e-01, -1.298e-01, -9.575e-02, 2.873e-02, -9.571e-02, 9.200e-02, -1.673e-01, -1.188e-01, 8.730e-02)); + r += mul(s1_0, M4(-2.350e-01, 1.587e-01, 3.174e-01, 1.542e-01, 1.652e-01, -9.002e-02, -4.229e-01, 9.736e-02, 5.939e-02, 3.149e-01, -1.059e-01, 1.857e-01, -3.531e-01, 2.776e-01, -2.455e-01, 4.585e-01)); + r += mul(s1_1, M4(-3.605e-01, -1.254e-01, -4.447e-01, -4.215e-01, 2.543e-01, -1.086e-02, 3.330e-01, 1.645e-01, 4.044e-02, -1.669e-01, 1.289e-01, -2.380e-02, -3.433e-01, -3.620e-01, 1.712e-01, 1.668e-01)); + r += mul(s1_2, M4(1.756e-02, -2.704e-03, -3.697e-01, 3.403e-01, -3.247e-02, -2.006e-01, -3.319e-02, -2.798e-01, -1.027e-01, -1.990e-01, -4.246e-01, 7.520e-02, 1.787e-01, -3.869e-01, 7.570e-02, -3.073e-01)); + r += mul(s1_3, M4(-8.614e-02, 6.455e-02, -1.730e-01, 5.939e-02, -1.393e-02, -2.230e-02, 1.723e-01, 4.100e-01, 1.529e-02, -1.270e-01, -1.502e-01, 3.934e-01, -3.637e-01, -6.028e-02, 1.548e-01, 3.118e-01)); + r += mul(s1_4, M4(-1.500e-01, -1.187e-01, 4.891e-01, 1.696e-01, 1.480e-01, 2.560e-01, -2.057e-01, -4.255e-01, 1.289e-01, -1.118e-02, -1.087e-02, -1.905e-01, 1.239e-01, 2.520e-02, -1.996e-02, -3.386e-01)); + r += mul(s1_5, M4(1.052e-01, -2.239e-02, 3.975e-01, -1.405e-01, -1.267e-02, 4.224e-01, -2.635e-01, 9.741e-02, 1.863e-02, -2.286e-01, 3.328e-01, -2.667e-01, -6.544e-02, -3.208e-01, -2.388e-01, 4.362e-02)); + r += mul(s1_6, M4(-5.319e-03, -1.865e-01, -4.191e-02, 2.387e-01, -2.874e-02, -1.661e-01, 1.281e-01, 2.304e-01, -2.066e-01, -1.021e-01, -1.088e-01, 2.609e-01, -1.502e-01, -1.255e-01, 1.263e-01, -4.176e-01)); + r += mul(s1_7, M4(-6.257e-02, -1.212e-01, -2.666e-01, 5.840e-03, 1.525e-01, 2.046e-01, 2.017e-01, 4.602e-02, 3.198e-02, 9.142e-02, 6.658e-02, -1.799e-01, 5.912e-02, 2.451e-01, 4.026e-01, 2.306e-02)); + r += mul(s1_8, M4(-3.453e-02, 1.717e-01, 1.058e-01, -2.543e-01, -8.375e-03, 1.824e-03, -1.615e-01, -2.510e-01, 4.237e-02, -7.161e-02, 1.259e-01, -9.696e-02, 3.739e-02, 2.963e-02, -3.003e-01, 5.154e-02)); + r += mul(s2_0, M4(-3.399e-02, 4.481e-02, -1.857e-01, 2.356e-01, -3.322e-02, -5.841e-02, 6.648e-02, -1.404e-01, -1.145e-02, -6.816e-02, -1.611e-02, 5.459e-02, -5.165e-03, 2.280e-01, -7.486e-02, -1.055e-01)); + r += mul(s2_1, M4(5.683e-02, -1.365e-01, -7.714e-03, 2.856e-02, 5.374e-02, -1.428e-01, 1.258e-01, -7.951e-02, 9.614e-02, -2.378e-01, 2.039e-01, -1.078e-01, -5.929e-02, 5.041e-02, -1.935e-01, -1.077e-01)); + r += mul(s2_2, M4(-7.949e-02, 3.859e-02, 1.619e-01, -1.051e-01, 8.312e-02, 2.784e-02, -1.049e-01, 9.604e-02, -9.492e-02, 1.578e-01, -4.464e-02, 1.584e-03, -2.066e-03, 5.707e-02, -2.157e-02, 8.817e-02)); + r += mul(s2_3, M4(1.038e-01, 8.953e-02, 5.480e-02, 2.716e-01, -7.691e-02, -3.918e-02, -9.394e-02, 9.078e-02, -1.943e-01, -7.785e-02, -2.547e-01, 8.458e-01, -1.954e-02, 1.182e-01, -1.381e-01, -3.832e-01)); + r += mul(s2_4, M4(-2.084e-01, 3.375e-02, -1.733e-01, -7.274e-02, -9.431e-02, 1.635e-01, -1.894e-01, -3.871e-02, 4.172e-02, 2.193e-01, -3.097e-01, -4.415e-01, -1.866e-01, -3.925e-01, 2.134e-01, 6.298e-01)); + r += mul(s2_5, M4(1.212e-01, -5.359e-02, -2.222e-02, -2.707e-01, -9.405e-02, 6.387e-02, 8.948e-03, 1.820e-01, -8.107e-02, 1.164e-01, -2.881e-01, -8.921e-02, -1.152e-01, 5.029e-01, -5.062e-01, 7.837e-02)); + r += mul(s2_6, M4(-5.824e-02, 9.913e-02, 9.971e-02, 1.557e-01, 7.915e-02, -8.769e-02, 7.980e-02, -3.432e-02, -1.692e-01, -9.786e-02, 1.282e-01, 1.709e-01, -1.265e-01, -6.808e-02, 7.225e-02, 1.675e-01)); + r += mul(s2_7, M4(-4.990e-02, -6.602e-03, -1.068e-01, -1.430e-02, 8.055e-02, -2.758e-02, -6.937e-02, -4.834e-02, -1.227e-02, 8.519e-02, 7.793e-01, -1.867e-01, -3.421e-01, -7.152e-02, -1.059e-01, 1.740e-01)); + r += mul(s2_8, M4(8.256e-02, -7.590e-03, 6.570e-02, -1.256e-01, -8.610e-02, 2.026e-01, -3.546e-02, 1.104e-01, 1.248e-01, -1.588e-01, 5.464e-01, -6.521e-02, 1.475e-01, -1.531e-01, 3.597e-01, -1.642e-01)); + r += mul(s3_0, M4(6.340e-01, 3.940e-01, 1.113e+00, 1.007e+00, -1.212e+00, 2.533e-01, -1.397e+00, 6.065e-01, -7.533e-02, -2.773e-02, -1.402e-02, 4.141e-02, 8.358e-02, 7.306e-02, 7.087e-03, -1.155e-01)); + r += mul(s3_1, M4(1.419e+00, 4.487e-01, -7.031e-01, -8.197e-01, 2.210e-01, -1.184e+00, 8.590e-01, -4.940e-01, 1.331e-01, -3.564e-01, 2.108e-01, -8.584e-02, -2.572e-01, -1.731e-02, 2.636e-01, -1.133e-01)); + r += mul(s3_2, M4(9.915e-01, -7.961e-01, 5.330e-01, -4.510e-01, -5.253e-01, 1.903e-01, -4.662e-01, 3.206e-01, 2.827e-02, 2.187e-02, -3.303e-02, 1.886e-02, -1.535e-02, -1.334e-02, 6.018e-03, 1.582e-01)); + r += mul(s3_3, M4(4.868e-02, 5.590e-01, 5.528e-02, 4.772e-01, 2.589e-01, -4.851e-01, 9.148e-01, 7.832e-01, -3.434e-01, -5.368e-02, -1.723e-01, 1.019e+00, 2.202e-01, 1.859e-01, 5.046e-03, -7.167e-01)); + r += mul(s3_4, M4(2.415e+00, 1.390e+00, 6.607e-01, -2.473e-01, 2.204e-01, -1.690e-01, -6.748e-01, -6.208e-01, 5.492e-02, 1.191e-01, -3.462e-01, -4.150e-01, 2.729e-01, -2.437e-01, 1.929e-01, 1.347e-01)); + r += mul(s3_5, M4(9.691e-01, -8.869e-01, 3.704e-01, -5.191e-02, -1.921e-02, 1.358e+00, -4.369e-01, 4.558e-01, -5.294e-02, 3.324e-02, -1.043e-01, -1.216e-01, 1.593e-01, 5.623e-01, -4.612e-01, -1.042e-01)); + r += mul(s3_6, M4(-1.293e-01, 4.959e-01, 1.363e-01, 5.027e-02, -5.043e-01, -4.472e-01, -6.873e-02, -6.303e-02, -2.425e-01, 1.265e-01, -1.273e-01, 2.420e-01, 6.472e-03, 5.157e-02, 1.899e-01, 6.324e-02)); + r += mul(s3_7, M4(-2.009e-01, 5.446e-01, -2.478e-01, -9.895e-03, 6.806e-02, -3.905e-01, -3.134e-01, -4.657e-01, -9.783e-02, -1.021e-01, 3.844e-01, -1.041e-01, -4.335e-03, 3.746e-01, -1.352e-01, 5.207e-02)); + r += mul(s3_8, M4(3.874e-01, 2.981e-02, 2.205e-01, -1.412e-01, 3.674e-01, 8.717e-01, -6.576e-01, 4.285e-01, -4.677e-02, 1.490e-02, 1.870e-01, -1.712e-02, 1.799e-01, 2.057e-01, -9.212e-02, -6.896e-02)); + r += V4(-1.228e-02, -4.362e-02, 4.248e-02, -2.610e-02); + return r; +} + +void Pass2(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = Rmp8x8(tid.x) + blockStart; + uint2 size = GetInputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = (gxy + 0.5) * pt; + + V4 s0_0 = l0(-1.0, -1.0); + V4 s0_1 = l0(0.0, -1.0); + V4 s0_2 = l0(1.0, -1.0); + V4 s0_3 = l0(-1.0, 0.0); + V4 s0_4 = l0(0.0, 0.0); + V4 s0_5 = l0(1.0, 0.0); + V4 s0_6 = l0(-1.0, 1.0); + V4 s0_7 = l0(0.0, 1.0); + V4 s0_8 = l0(1.0, 1.0); + V4 s1_0 = -max(-s0_0, 0.0); + V4 s1_1 = -max(-s0_1, 0.0); + V4 s1_2 = -max(-s0_2, 0.0); + V4 s1_3 = -max(-s0_3, 0.0); + V4 s1_4 = -max(-s0_4, 0.0); + V4 s1_5 = -max(-s0_5, 0.0); + V4 s1_6 = -max(-s0_6, 0.0); + V4 s1_7 = -max(-s0_7, 0.0); + V4 s1_8 = -max(-s0_8, 0.0); + s0_0 = max(s0_0, 0.0); + s0_1 = max(s0_1, 0.0); + s0_2 = max(s0_2, 0.0); + s0_3 = max(s0_3, 0.0); + s0_4 = max(s0_4, 0.0); + s0_5 = max(s0_5, 0.0); + s0_6 = max(s0_6, 0.0); + s0_7 = max(s0_7, 0.0); + s0_8 = max(s0_8, 0.0); + + V4 s2_0 = l1(-1.0, -1.0); + V4 s2_1 = l1(0.0, -1.0); + V4 s2_2 = l1(1.0, -1.0); + V4 s2_3 = l1(-1.0, 0.0); + V4 s2_4 = l1(0.0, 0.0); + V4 s2_5 = l1(1.0, 0.0); + V4 s2_6 = l1(-1.0, 1.0); + V4 s2_7 = l1(0.0, 1.0); + V4 s2_8 = l1(1.0, 1.0); + V4 s3_0 = -max(-s2_0, 0.0); + V4 s3_1 = -max(-s2_1, 0.0); + V4 s3_2 = -max(-s2_2, 0.0); + V4 s3_3 = -max(-s2_3, 0.0); + V4 s3_4 = -max(-s2_4, 0.0); + V4 s3_5 = -max(-s2_5, 0.0); + V4 s3_6 = -max(-s2_6, 0.0); + V4 s3_7 = -max(-s2_7, 0.0); + V4 s3_8 = -max(-s2_8, 0.0); + s2_0 = max(s2_0, 0.0); + s2_1 = max(s2_1, 0.0); + s2_2 = max(s2_2, 0.0); + s2_3 = max(s2_3, 0.0); + s2_4 = max(s2_4, 0.0); + s2_5 = max(s2_5, 0.0); + s2_6 = max(s2_6, 0.0); + s2_7 = max(s2_7, 0.0); + s2_8 = max(s2_8, 0.0); + + t2[gxy] = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8); + t3[gxy] = f1(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8); +} + +//!PASS 3 +//!DESC conv2 +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 +//!IN t2, t3 +//!OUT t0, t1 + +#define l0(x, y) V4(O(t2, float2(x, y))) +#define l1(x, y) V4(O(t3, float2(x, y))) + +V4 f0(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-1.867e-01, -2.287e-03, -1.191e-01, -1.249e-02, -8.376e-02, 2.333e-01, 3.011e-02, 8.727e-02, -1.528e-01, 4.522e-02, -1.092e-01, 1.235e-01, 1.179e-01, 1.085e-01, 2.075e-01, -4.524e-02)); + r += mul(s0_1, M4(-6.251e-02, 9.622e-02, -1.299e-01, -8.819e-02, 8.242e-02, -4.033e-01, -1.512e-01, -8.449e-02, -2.673e-01, 3.868e-01, 2.615e-02, 1.069e-01, 2.055e-01, -1.800e-01, 7.375e-03, 8.391e-03)); + r += mul(s0_2, M4(1.410e-01, -8.185e-02, 2.465e-02, 3.546e-02, -7.339e-02, -4.492e-02, -6.633e-02, -1.005e-02, 5.993e-02, 5.536e-02, -6.278e-03, -8.258e-02, -1.498e-01, 5.872e-02, 1.560e-01, -7.461e-02)); + r += mul(s0_3, M4(-2.116e-01, 2.332e-01, 2.930e-01, -1.691e-01, -9.505e-02, -8.336e-02, 1.302e-01, -8.985e-03, 1.795e-01, 4.858e-01, -5.144e-02, 1.663e-01, 2.647e-01, -3.083e-01, -1.612e-01, 9.123e-02)); + r += mul(s0_4, M4(2.233e-01, 3.415e-01, 2.541e-01, 1.521e-01, 2.939e-01, 5.545e-02, 2.474e-01, -1.522e-01, 1.945e-01, 1.302e-01, 6.035e-02, 1.204e-01, -5.938e-02, -1.101e-01, -9.751e-02, -2.144e-01)); + r += mul(s0_5, M4(-1.567e-01, 7.505e-02, 7.642e-02, -1.079e-01, 3.845e-02, -9.225e-02, 1.250e-02, -9.117e-02, 3.753e-01, -1.417e-01, -7.198e-02, 3.818e-01, -5.320e-02, -2.646e-01, 2.586e-03, 1.312e-01)); + r += mul(s0_6, M4(-9.201e-02, 1.449e-01, 2.745e-01, -2.933e-02, 8.872e-02, -7.589e-02, 1.074e-01, -1.002e-01, -8.457e-03, -3.762e-01, 5.415e-02, 1.822e-01, 2.688e-01, -2.326e-01, -5.302e-01, -6.336e-02)); + r += mul(s0_7, M4(1.119e-01, -1.561e-02, -6.547e-03, -9.972e-02, -1.073e-01, 9.063e-02, 3.843e-02, 6.815e-02, 3.779e-01, -1.196e-01, -1.353e-01, -2.813e-02, 1.060e-01, 2.387e-01, 1.267e-02, 1.083e-01)); + r += mul(s0_8, M4(-9.346e-02, 1.792e-02, -1.428e-01, 3.228e-02, -1.043e-01, -1.120e-01, -3.488e-03, -4.356e-02, -2.876e-01, -7.053e-02, -4.502e-02, -5.783e-02, -2.254e-01, 5.783e-02, 3.232e-01, 7.605e-04)); + r += mul(s1_0, M4(9.940e-02, 9.588e-03, -3.584e-01, 1.252e-01, -1.917e-01, 1.258e-01, 2.297e-01, 1.390e-01, 4.639e-02, -1.121e-01, -1.118e-01, -4.381e-02, -1.695e-01, 1.821e-01, 2.465e-01, -9.049e-02)); + r += mul(s1_1, M4(5.143e-02, 1.069e-02, -8.068e-02, -8.982e-02, -2.494e-02, -7.513e-02, 1.598e-02, 3.467e-02, -1.174e-01, 2.261e-01, -8.818e-02, -1.923e-02, -3.776e-02, -3.819e-01, -8.594e-02, 4.435e-03)); + r += mul(s1_2, M4(-3.623e-02, -5.439e-02, -9.351e-03, 1.235e-01, -9.703e-03, -1.335e-01, 1.036e-01, 2.097e-02, 1.458e-02, 3.203e-02, 1.967e-01, -1.818e-02, -9.724e-02, -7.890e-02, 3.670e-02, -4.865e-02)); + r += mul(s1_3, M4(-2.127e-01, -2.056e-02, 3.076e-01, 5.685e-02, 9.937e-02, -2.134e-01, 3.166e-02, -4.301e-02, 6.663e-02, -5.974e-02, 8.903e-02, 3.410e-02, 4.111e-02, 1.169e-01, 4.898e-02, 5.654e-02)); + r += mul(s1_4, M4(1.874e-01, 1.435e-01, -4.010e-01, 6.335e-05, 3.853e-01, -4.015e-01, -4.051e-01, -2.454e-01, -2.675e-02, 2.236e-01, 2.143e-01, -4.164e-02, -2.142e-01, -1.742e-01, 4.441e-01, -2.792e-01)); + r += mul(s1_5, M4(-1.686e-01, -3.803e-02, 1.583e-01, 9.059e-02, -1.233e-01, 7.512e-02, 1.737e-01, 6.937e-02, 1.250e-01, -9.459e-02, -2.433e-01, 2.107e-01, 8.135e-02, -1.054e-01, -1.870e-01, -1.011e-01)); + r += mul(s1_6, M4(1.078e-01, -1.143e-01, 2.303e-01, 1.447e-01, -6.396e-02, -1.863e-01, -1.454e-01, -1.476e-01, 2.346e-02, -1.712e-02, 3.948e-02, -2.445e-02, -7.822e-02, 5.100e-01, 1.676e-01, 5.526e-02)); + r += mul(s1_7, M4(2.939e-01, -3.193e-01, 1.130e-01, 1.019e-01, -2.836e-01, -3.252e-01, -1.221e-01, -1.886e-01, -1.541e-02, -3.348e-02, -1.192e-01, 5.553e-02, 2.747e-01, 3.810e-01, -1.083e-01, 8.926e-02)); + r += mul(s1_8, M4(-1.914e-01, -1.810e-01, 3.616e-01, 1.443e-01, -2.356e-01, 1.987e-02, 2.206e-01, -7.203e-03, -4.873e-02, 1.449e-02, 2.429e-03, 4.135e-03, 1.601e-01, 1.436e-02, -2.503e-01, -1.747e-01)); + r += mul(s2_0, M4(5.158e-02, -5.768e-01, 1.059e-01, 6.356e-02, 5.453e-02, 1.182e-01, 1.025e-01, -4.581e-03, -4.476e-02, -7.326e-02, 3.128e-02, -1.658e-02, 7.979e-02, -1.015e-01, -7.756e-03, 5.261e-02)); + r += mul(s2_1, M4(-9.209e-02, 5.020e-04, 1.687e-01, 2.337e-01, 5.893e-02, -1.190e-02, 2.134e-01, 2.056e-01, -8.468e-02, 1.393e-01, 2.666e-01, 8.482e-02, 9.005e-03, 1.830e-01, 1.487e-01, 1.541e-01)); + r += mul(s2_2, M4(-1.577e-02, 1.800e-01, -4.463e-02, 1.857e-01, -2.505e-02, -4.244e-02, 3.534e-02, 1.091e-02, 3.562e-02, -1.613e-02, 7.525e-02, -6.411e-02, -1.120e-01, 2.570e-01, 1.793e-01, 3.232e-01)); + r += mul(s2_3, M4(1.081e-01, -3.272e-01, 9.989e-02, -1.714e-01, 1.272e-02, -8.817e-02, -6.541e-01, 9.601e-03, 5.846e-03, -1.214e-01, 4.286e-02, -1.424e-04, 2.707e-02, -1.255e-01, -1.766e-01, 7.553e-02)); + r += mul(s2_4, M4(1.707e-01, 2.406e-02, 7.128e-01, 3.512e-01, 4.649e-01, -2.976e-02, -2.139e-01, -1.608e-01, 1.348e-01, -1.933e-01, -1.625e-01, -1.502e-01, 3.457e-02, -2.310e-01, -1.418e-01, -1.607e-01)); + r += mul(s2_5, M4(2.141e-01, -3.424e-01, -2.787e-01, 1.588e-01, -8.585e-03, 1.987e-01, 8.631e-02, -2.482e-02, -1.159e-01, 3.130e-02, 6.300e-02, -1.646e-01, 2.076e-01, 3.123e-01, 7.450e-02, 8.300e-01)); + r += mul(s2_6, M4(-1.156e-01, 5.885e-01, 2.790e-01, 1.944e-01, -2.609e-02, 1.192e-01, 1.064e-01, 2.452e-01, 6.769e-02, 7.500e-02, 1.444e-01, 1.657e-02, 1.032e-04, 6.885e-02, -3.119e-01, 1.838e-02)); + r += mul(s2_7, M4(2.686e-01, -3.624e-01, -3.820e-01, -1.910e-02, 2.541e-01, -3.535e-02, 3.461e-02, 6.867e-02, 1.792e-01, -4.944e-02, 9.518e-02, -9.353e-02, 1.577e-01, -2.950e-01, -5.366e-01, -9.244e-02)); + r += mul(s2_8, M4(-5.502e-02, -3.642e-02, 2.950e-01, 1.710e-02, 1.386e-03, -4.643e-03, -5.468e-02, 1.526e-01, -3.839e-02, 2.502e-02, 6.890e-02, -5.190e-02, -3.046e-01, -8.298e-02, -2.710e-01, -4.361e-02)); + r += mul(s3_0, M4(3.470e-02, -1.794e-01, 4.939e-03, 5.871e-02, -3.644e-02, 2.163e-01, 1.659e-01, 1.729e-02, -7.065e-02, -4.364e-02, -1.401e-01, -6.392e-02, 2.933e-02, -2.708e-01, -6.419e-02, 2.552e-02)); + r += mul(s3_1, M4(2.013e-01, 1.346e-01, 1.245e-01, 2.012e-01, 1.159e-01, 2.536e-02, 3.348e-01, 2.151e-01, -1.428e-01, 3.330e-02, 5.570e-02, 1.265e-01, -1.421e-01, -2.205e-01, -2.407e-02, -1.310e-02)); + r += mul(s3_2, M4(1.897e-01, 1.382e-01, 8.547e-02, 1.685e-02, 3.906e-02, -1.645e-02, 8.177e-02, -1.090e-01, 2.720e-02, -1.483e-01, -1.471e-01, -3.796e-02, -9.755e-02, 2.098e-01, -1.363e-01, 8.741e-04)); + r += mul(s3_3, M4(-8.746e-02, -2.411e-01, -5.564e-01, 1.288e-01, -1.560e-03, -1.454e-01, -3.086e-01, -1.364e-01, -6.448e-02, 2.139e-02, -6.920e-02, 1.125e-01, 2.256e-02, -1.337e-01, 2.318e-01, -9.337e-02)); + r += mul(s3_4, M4(1.330e-01, 7.059e-02, 2.570e-01, -3.958e-02, 2.678e-01, -1.782e-01, -4.249e-01, -7.859e-02, -7.410e-03, 4.629e-02, 1.869e-01, 6.028e-02, -2.636e-01, -8.746e-01, 4.294e-01, -7.591e-01)); + r += mul(s3_5, M4(6.538e-02, 3.535e-01, 3.381e-01, 1.665e-01, -1.464e-01, -4.395e-02, 6.332e-02, 6.707e-02, 4.085e-02, 3.123e-02, -8.943e-02, -1.124e-01, 7.129e-01, -2.572e-01, -3.428e-02, -3.166e-01)); + r += mul(s3_6, M4(3.447e-02, 1.964e-02, -1.246e-02, -4.894e-02, -3.053e-02, 6.215e-02, 1.432e-01, 4.347e-02, 9.639e-02, 2.140e-01, 1.791e-01, 1.898e-01, -5.042e-02, 2.674e-01, 1.714e-01, 8.155e-02)); + r += mul(s3_7, M4(3.324e-02, -2.281e-01, 8.075e-02, 8.469e-02, 7.409e-02, 4.094e-02, 1.500e-01, 7.922e-02, 1.632e-01, 3.876e-02, -1.316e-01, 1.200e-01, 3.408e-01, 1.752e-01, -1.315e-01, 1.251e-01)); + r += mul(s3_8, M4(-1.043e-01, -2.295e-01, -2.968e-01, -7.326e-02, 9.514e-02, 1.595e-02, -2.148e-02, -7.380e-02, -3.873e-02, 5.639e-02, 5.948e-02, 6.939e-02, 4.680e-01, 2.191e-01, -1.091e-01, -4.211e-02)); + r += V4(3.966e-02, 2.168e-04, 3.712e-03, 7.866e-03); + return r; +} + +V4 f1(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8) { + V4 r = 0.0; + r += mul(s0_0, M4(1.510e-01, 1.269e-02, -1.267e-01, 1.446e-01, 3.963e-02, 3.673e-02, -3.129e-02, 2.499e-02, 1.567e-02, 1.863e-01, -4.694e-03, -1.522e-01, -1.215e-01, 1.422e-01, 1.161e-01, -1.114e-01)); + r += mul(s0_1, M4(-2.120e-02, 1.988e-01, 1.436e-01, -1.165e-01, 1.754e-01, 6.868e-02, -1.784e-01, 1.453e-02, 1.257e-02, -3.559e-01, 6.345e-02, 7.528e-02, -1.168e-01, -3.730e-01, -1.436e-02, 2.597e-02)); + r += mul(s0_2, M4(-1.577e-01, 4.407e-03, -3.120e-02, -3.013e-03, -1.327e-01, -1.630e-01, -8.175e-02, -1.577e-02, -2.674e-01, -5.831e-02, 1.139e-01, -9.667e-02, 1.499e-01, -3.017e-02, -7.416e-02, 8.048e-02)); + r += mul(s0_3, M4(-3.099e-01, 1.730e-01, 4.941e-02, 3.643e-01, 5.996e-03, -1.379e-01, 3.862e-01, 1.959e-01, 3.855e-01, 2.959e-01, -1.075e-01, -3.195e-01, 5.520e-02, -2.633e-02, 6.609e-01, -2.863e-01)); + r += mul(s0_4, M4(-1.581e-01, 5.127e-01, 5.755e-01, -1.758e-02, 2.351e-02, -1.945e-01, -3.701e-01, -2.035e-01, 1.510e+00, -6.021e-01, 2.540e-01, 1.989e-03, -2.473e-01, 6.479e-01, -1.236e-01, -2.509e-02)); + r += mul(s0_5, M4(6.567e-02, 4.649e-02, 1.349e-01, 4.919e-02, 4.185e-02, -1.002e-02, 9.981e-02, -2.859e-02, -2.278e-01, 4.727e-01, 1.868e-01, -2.588e-01, 8.428e-02, 7.575e-03, -3.525e-01, 3.996e-03)); + r += mul(s0_6, M4(-1.744e-01, -9.151e-02, 1.860e-01, 2.731e-01, -6.986e-02, -3.020e-02, -1.869e-01, -1.327e-02, -1.042e-01, -2.540e-02, -2.241e-01, 3.422e-01, -1.022e-01, 1.238e-01, 2.314e-01, -3.349e-01)); + r += mul(s0_7, M4(-2.791e-02, 1.601e-01, 2.001e-01, -7.415e-02, 1.847e-01, -9.655e-02, -3.229e-02, 2.887e-02, -9.137e-02, -3.329e-02, 2.700e-01, 9.334e-02, 9.282e-02, -6.146e-02, 1.428e-01, 1.684e-01)); + r += mul(s0_8, M4(1.795e-01, -2.872e-02, 3.678e-02, 6.662e-02, -1.044e-01, -3.932e-02, 2.314e-02, -7.340e-02, 9.445e-02, 1.306e-01, -2.439e-01, 9.100e-02, 3.984e-02, -9.294e-02, -6.069e-02, -2.545e-02)); + r += mul(s1_0, M4(4.324e-01, 2.259e-01, -4.051e-02, 4.797e-03, -1.294e-01, 2.765e-02, 1.875e-01, 5.255e-02, -1.390e-02, 2.073e-01, 6.489e-02, -1.416e-01, -2.698e-01, 2.849e-02, 1.129e-01, 6.424e-02)); + r += mul(s1_1, M4(-1.527e-01, -3.081e-01, -2.367e-01, -1.744e-01, -1.040e-02, -1.817e-01, 1.216e-01, -5.997e-03, -1.056e-01, 1.047e-02, -9.173e-02, 6.123e-02, 1.587e-01, 3.438e-01, 8.663e-02, 1.487e-01)); + r += mul(s1_2, M4(-1.173e-01, -1.156e-01, -4.805e-02, 5.150e-02, -8.245e-02, 7.996e-02, -1.812e-01, 1.072e-01, -4.140e-02, -1.859e-01, 9.617e-03, 9.194e-02, 9.678e-03, 4.886e-02, -7.522e-02, 1.882e-02)); + r += mul(s1_3, M4(4.124e-02, -1.781e-01, -8.895e-01, 1.978e-02, -1.229e-01, -1.255e-01, 1.666e-01, 3.719e-01, -1.012e-01, -4.286e-02, 8.884e-02, -1.577e-01, -1.258e-01, 1.669e-01, 4.306e-01, 2.863e-01)); + r += mul(s1_4, M4(-3.640e-01, 7.624e-02, -5.308e-01, -3.999e-02, 6.426e-02, -2.244e-01, -2.932e-01, -2.347e-01, 3.475e-01, -1.236e-01, 1.469e-01, 8.772e-02, 9.278e-02, 5.106e-01, -7.446e-02, -5.061e-02)); + r += mul(s1_5, M4(2.733e-01, 2.298e-01, -4.516e-02, 1.068e-01, -6.146e-02, 1.248e-01, 1.512e-01, -1.409e-01, -2.574e-02, 1.303e-01, -6.689e-02, -1.138e-01, 3.539e-02, 3.450e-03, -3.933e-02, -2.456e-02)); + r += mul(s1_6, M4(-1.740e-01, 1.962e-01, -2.318e-01, 4.245e-02, 1.837e-01, 1.318e-02, 6.216e-02, -8.214e-02, 3.329e-02, 4.938e-02, -1.139e-01, 2.849e-02, 7.127e-02, -1.978e-01, -6.718e-02, 3.379e-01)); + r += mul(s1_7, M4(1.036e-01, -1.074e-01, 1.211e-01, -1.502e-01, 3.505e-01, 2.469e-02, 3.160e-02, 1.840e-01, -5.042e-02, 1.114e-02, 1.469e-02, -2.675e-02, -6.888e-02, -1.076e-01, -1.764e-01, -1.250e-03)); + r += mul(s1_8, M4(-1.227e-01, 3.169e-02, -1.346e-01, 2.663e-02, -3.523e-01, -4.952e-02, 2.526e-02, -3.065e-01, 1.105e-01, -1.705e-02, -2.442e-02, 4.761e-02, 2.978e-01, -1.184e-01, -2.559e-02, -1.439e-01)); + r += mul(s2_0, M4(-6.434e-02, -1.450e-01, 6.691e-02, -1.498e-02, -2.586e-01, -1.415e-01, 2.408e-02, 1.405e-02, -9.741e-02, -2.278e-02, -7.323e-03, 1.029e-01, 1.971e-01, -7.889e-02, 1.621e-01, -1.481e-01)); + r += mul(s2_1, M4(7.306e-02, 8.261e-03, -1.106e-01, -6.119e-02, 9.048e-02, 3.668e-01, -4.932e-02, 1.419e-01, -1.065e-01, 1.921e-01, -6.933e-03, 1.397e-01, 1.131e-01, -2.959e-01, 2.377e-01, -8.244e-02)); + r += mul(s2_2, M4(-6.484e-02, -8.438e-02, -8.452e-02, 7.652e-02, 1.060e-01, 2.751e-01, -4.448e-02, 6.228e-02, 2.452e-02, 1.715e-01, -2.210e-01, 1.880e-01, -1.089e-01, -4.575e-01, 1.402e-01, 2.589e-02)); + r += mul(s2_3, M4(5.019e-02, 1.179e-01, -3.322e-01, -1.521e-01, 1.682e-01, 5.881e-02, -4.209e-01, -8.599e-02, 1.338e-02, 1.764e-02, -1.383e-01, 7.389e-02, 3.577e-02, 7.338e-02, -2.762e-01, -9.510e-02)); + r += mul(s2_4, M4(-1.853e-01, -4.620e-01, -1.324e-01, -2.907e-01, 4.004e-01, 6.572e-02, -3.924e-01, 3.585e-02, 1.534e-02, 2.261e-01, -1.448e-01, 7.334e-02, -4.871e-01, 2.474e-01, 6.138e-01, 1.618e-01)); + r += mul(s2_5, M4(-3.986e-02, -5.998e-02, -1.165e-01, 2.199e-01, 1.416e-01, -2.026e-01, -1.034e-01, -8.049e-03, 2.830e-01, 1.312e-03, -1.952e-01, 1.926e-01, 1.404e-01, -1.712e-01, 2.704e-01, 5.702e-02)); + r += mul(s2_6, M4(1.954e-01, 1.098e-01, -4.060e-01, 6.263e-01, 9.565e-02, 3.321e-02, -9.177e-02, 1.727e-01, -3.629e-02, -3.498e-02, -1.498e-01, -1.020e-02, 7.289e-02, -1.008e-01, -6.138e-02, -7.229e-02)); + r += mul(s2_7, M4(4.694e-01, 4.689e-02, -2.026e-02, -1.420e-01, -1.815e-01, 1.337e-01, -3.029e-03, 8.901e-03, -7.604e-02, 6.520e-03, -9.244e-02, 1.180e-01, 1.924e-01, 4.576e-03, 9.215e-02, 1.393e-01)); + r += mul(s2_8, M4(-2.694e-01, -7.673e-02, -3.907e-02, 2.054e-01, -7.508e-02, 4.244e-02, 8.589e-03, -2.004e-02, 1.029e-01, -2.785e-04, -1.329e-01, 1.480e-01, 1.240e-01, 1.682e-01, 4.375e-02, 5.794e-02)); + r += mul(s3_0, M4(1.908e-01, -9.550e-02, -6.231e-02, -8.961e-02, -2.150e-01, -5.266e-02, -5.877e-02, 6.574e-02, 1.206e-01, -5.647e-02, 1.819e-01, 9.125e-03, -1.411e-02, -7.630e-02, 1.694e-01, -6.670e-02)); + r += mul(s3_1, M4(-7.247e-02, -1.664e-02, 3.111e-02, -8.914e-02, 1.373e-02, -7.042e-03, 2.124e-01, 8.056e-03, 1.248e-01, 1.013e-01, 1.053e-01, 8.886e-02, -3.534e-01, -5.092e-02, -8.903e-02, 1.120e-01)); + r += mul(s3_2, M4(-1.274e-01, 1.296e-01, 6.739e-02, -1.061e-01, 1.488e-02, 1.174e-01, -2.220e-02, 3.190e-02, -8.067e-03, 6.182e-03, 3.938e-02, -1.144e-02, 1.720e-02, 2.232e-02, -1.033e-01, 1.938e-01)); + r += mul(s3_3, M4(2.119e-01, -7.107e-03, -1.771e-01, 3.717e-03, -9.809e-02, -2.060e-01, -1.242e-01, 1.331e-01, 1.656e-01, -4.429e-02, 3.430e-01, -1.180e-01, -8.243e-02, 2.318e-01, -3.745e-01, 2.954e-02)); + r += mul(s3_4, M4(5.462e-02, 2.234e-01, 5.211e-02, 4.298e-02, 2.002e-01, -6.029e-02, 8.922e-02, -1.422e-01, 4.850e-03, 2.692e-02, 1.883e-03, -5.867e-02, -1.761e-01, -2.994e-01, -1.180e-01, 5.357e-01)); + r += mul(s3_5, M4(-1.020e-01, -9.731e-03, 4.965e-02, 1.040e-01, 3.933e-02, -7.445e-02, -8.691e-02, 2.101e-02, 1.135e-01, -4.423e-02, 7.911e-02, -7.177e-04, 7.153e-03, -2.231e-01, -2.036e-01, 2.961e-01)); + r += mul(s3_6, M4(-8.583e-02, -1.500e-01, -4.673e-02, -1.242e-01, 5.128e-02, 1.491e-03, 2.211e-01, 4.382e-03, -1.899e-01, -1.419e-02, 1.903e-01, -1.301e-01, 6.635e-02, -2.247e-02, -5.734e-02, 3.099e-01)); + r += mul(s3_7, M4(1.511e-01, -1.528e-01, 1.166e-01, 1.147e-01, -3.419e-01, 3.498e-02, 1.819e-02, -1.488e-01, -1.092e-01, -4.590e-02, 2.240e-01, -2.029e-01, 3.950e-02, 2.020e-02, 1.403e-02, 4.349e-01)); + r += mul(s3_8, M4(4.921e-02, 8.799e-02, -6.688e-03, 9.084e-02, 3.443e-02, 3.622e-02, 8.327e-02, -2.267e-02, -1.895e-02, -2.932e-02, 8.468e-02, -4.335e-02, -5.082e-02, 8.529e-02, 7.031e-02, 2.080e-01)); + r += V4(2.464e-02, -1.503e-02, -3.365e-02, 7.710e-03); + return r; +} + +void Pass3(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = Rmp8x8(tid.x) + blockStart; + uint2 size = GetInputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = (gxy + 0.5) * pt; + + V4 s0_0 = l0(-1.0, -1.0); + V4 s0_1 = l0(0.0, -1.0); + V4 s0_2 = l0(1.0, -1.0); + V4 s0_3 = l0(-1.0, 0.0); + V4 s0_4 = l0(0.0, 0.0); + V4 s0_5 = l0(1.0, 0.0); + V4 s0_6 = l0(-1.0, 1.0); + V4 s0_7 = l0(0.0, 1.0); + V4 s0_8 = l0(1.0, 1.0); + V4 s1_0 = -max(-s0_0, 0.0); + V4 s1_1 = -max(-s0_1, 0.0); + V4 s1_2 = -max(-s0_2, 0.0); + V4 s1_3 = -max(-s0_3, 0.0); + V4 s1_4 = -max(-s0_4, 0.0); + V4 s1_5 = -max(-s0_5, 0.0); + V4 s1_6 = -max(-s0_6, 0.0); + V4 s1_7 = -max(-s0_7, 0.0); + V4 s1_8 = -max(-s0_8, 0.0); + s0_0 = max(s0_0, 0.0); + s0_1 = max(s0_1, 0.0); + s0_2 = max(s0_2, 0.0); + s0_3 = max(s0_3, 0.0); + s0_4 = max(s0_4, 0.0); + s0_5 = max(s0_5, 0.0); + s0_6 = max(s0_6, 0.0); + s0_7 = max(s0_7, 0.0); + s0_8 = max(s0_8, 0.0); + + V4 s2_0 = l1(-1.0, -1.0); + V4 s2_1 = l1(0.0, -1.0); + V4 s2_2 = l1(1.0, -1.0); + V4 s2_3 = l1(-1.0, 0.0); + V4 s2_4 = l1(0.0, 0.0); + V4 s2_5 = l1(1.0, 0.0); + V4 s2_6 = l1(-1.0, 1.0); + V4 s2_7 = l1(0.0, 1.0); + V4 s2_8 = l1(1.0, 1.0); + V4 s3_0 = -max(-s2_0, 0.0); + V4 s3_1 = -max(-s2_1, 0.0); + V4 s3_2 = -max(-s2_2, 0.0); + V4 s3_3 = -max(-s2_3, 0.0); + V4 s3_4 = -max(-s2_4, 0.0); + V4 s3_5 = -max(-s2_5, 0.0); + V4 s3_6 = -max(-s2_6, 0.0); + V4 s3_7 = -max(-s2_7, 0.0); + V4 s3_8 = -max(-s2_8, 0.0); + s2_0 = max(s2_0, 0.0); + s2_1 = max(s2_1, 0.0); + s2_2 = max(s2_2, 0.0); + s2_3 = max(s2_3, 0.0); + s2_4 = max(s2_4, 0.0); + s2_5 = max(s2_5, 0.0); + s2_6 = max(s2_6, 0.0); + s2_7 = max(s2_7, 0.0); + s2_8 = max(s2_8, 0.0); + + t0[gxy] = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8); + t1[gxy] = f1(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8); +} + +//!PASS 4 +//!DESC conv3 +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 +//!IN t0, t1 +//!OUT t2, t3 + +#define l0(x, y) V4(O(t0, float2(x, y))) +#define l1(x, y) V4(O(t1, float2(x, y))) + +V4 f0(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-1.303e-01, -2.502e-01, 6.500e-03, 2.601e-01, -3.627e-02, 1.172e-02, -2.737e-02, 1.167e-02, -1.626e-01, -3.004e-02, 2.364e-02, -2.347e-02, -4.186e-02, 1.951e-01, 2.632e-02, 1.146e-01)); + r += mul(s0_1, M4(-1.030e-01, -1.744e-01, -7.392e-03, 1.713e-02, 7.134e-02, -2.497e-04, -1.421e-01, 1.345e-01, -1.077e-01, -2.417e-01, 7.019e-02, -3.896e-01, -7.303e-02, -4.439e-03, -4.887e-02, 9.957e-02)); + r += mul(s0_2, M4(-3.608e-02, 1.177e-02, 1.276e-01, -1.034e-01, 3.357e-02, 1.218e-01, -6.970e-02, 2.349e-02, -8.838e-03, -1.774e-01, -1.413e-01, -9.342e-02, -4.418e-02, -7.144e-02, 4.315e-02, 6.959e-02)); + r += mul(s0_3, M4(-2.867e-01, -2.233e-01, 4.131e-01, 6.114e-01, 7.602e-02, 1.683e-01, -1.640e-01, 5.004e-02, -1.479e-01, -1.302e-01, 1.253e-01, -5.586e-02, 1.083e-02, 2.092e-01, 4.253e-01, 5.892e-02)); + r += mul(s0_4, M4(2.991e-01, -2.867e-01, 3.591e-01, 1.815e-01, 1.301e-01, 2.781e-02, 6.110e-02, -7.526e-02, -2.236e-01, -2.383e-01, -1.365e-01, -1.511e-01, -3.541e-02, 2.105e-01, 1.880e-01, -2.169e-01)); + r += mul(s0_5, M4(1.310e-01, 6.178e-03, 6.162e-02, 8.473e-02, -4.512e-02, 2.741e-01, -2.587e-01, -1.368e-01, 1.448e-01, -2.241e-01, 1.788e-01, 1.691e-01, -7.749e-02, -6.264e-02, 4.554e-02, 6.527e-02)); + r += mul(s0_6, M4(9.763e-02, 4.812e-02, -1.276e-01, -2.642e-01, -2.232e-02, -2.877e-02, -1.684e-01, 1.152e-01, -9.840e-02, 1.224e-01, 3.182e-02, -6.762e-02, 8.287e-02, 3.558e-01, -4.662e-02, -2.938e-01)); + r += mul(s0_7, M4(1.670e-01, -1.360e-02, -9.542e-02, -1.691e-01, -1.819e-01, -9.168e-03, 9.087e-02, -7.566e-02, -9.845e-03, 1.043e-01, -1.144e-01, 2.102e-02, -7.557e-02, -2.903e-02, 2.711e-02, 4.163e-02)); + r += mul(s0_8, M4(3.748e-02, 7.026e-02, -5.355e-02, -2.032e-01, -1.054e-01, 7.008e-02, -3.887e-03, 9.327e-02, -5.416e-02, -4.324e-02, -8.562e-02, -2.246e-01, 4.115e-02, -5.455e-02, -5.699e-02, 9.352e-02)); + r += mul(s1_0, M4(-1.647e-01, -6.626e-02, -1.987e-01, 1.533e-01, -4.810e-02, -1.097e-02, -1.609e-01, -2.368e-01, 1.036e-02, 5.420e-02, 5.011e-02, 1.669e-01, -6.079e-02, -1.636e-01, -1.879e-03, -2.154e-01)); + r += mul(s1_1, M4(-2.303e-01, -1.604e-01, 5.711e-02, 1.264e-01, -3.227e-02, -3.792e-01, -1.013e-01, -1.919e-01, 2.945e-02, 1.079e-01, 2.416e-01, -1.813e-01, -8.157e-02, -2.102e-01, -1.462e-01, 1.594e-01)); + r += mul(s1_2, M4(-5.792e-02, -1.373e-02, 1.286e-01, 4.894e-02, -9.753e-02, -2.114e-01, -1.218e-02, -1.496e-01, 4.394e-02, 1.692e-02, -7.685e-02, -1.331e-01, 4.462e-03, -5.792e-02, 1.508e-01, 1.907e-01)); + r += mul(s1_3, M4(-3.344e-01, 2.221e-01, 3.409e-01, 2.959e-01, 2.695e-01, -5.308e-02, -2.027e-01, 1.681e-01, -7.817e-02, 1.927e-02, 1.200e-01, -1.694e-01, 4.014e-01, 2.818e-01, 1.119e-01, -2.400e-01)); + r += mul(s1_4, M4(-2.868e-02, -7.143e-02, 2.904e-01, 5.075e-02, -1.590e-01, -3.739e-01, 1.705e-01, -1.525e-01, -7.932e-02, -8.959e-02, -1.228e-01, 1.294e-01, 1.669e-01, -2.851e-01, 2.203e-02, -6.589e-01)); + r += mul(s1_5, M4(-1.570e-02, 2.385e-02, -1.108e-02, 9.343e-02, -2.494e-01, -3.927e-01, 4.257e-02, 2.139e-01, 1.506e-01, 1.220e-02, 1.834e-01, -9.939e-02, -1.581e-01, 6.915e-02, -1.147e-01, -2.094e-01)); + r += mul(s1_6, M4(7.238e-02, 2.064e-02, -8.644e-02, 1.141e-01, 9.264e-02, -1.623e-01, -5.621e-02, 2.077e-03, -1.771e-01, 6.011e-02, 1.249e-01, 2.444e-02, 1.023e-02, 2.457e-02, 1.956e-01, 1.182e-01)); + r += mul(s1_7, M4(-1.855e-02, 1.438e-01, -5.501e-02, -2.316e-01, -7.153e-02, -1.020e-02, -1.145e-01, -4.723e-01, 1.101e-01, -2.734e-02, -8.558e-03, 5.762e-01, 8.280e-02, -1.551e-01, 8.434e-02, 2.051e-01)); + r += mul(s1_8, M4(1.539e-02, 1.436e-02, 8.719e-03, -6.027e-02, -1.844e-01, -1.623e-01, 8.752e-02, 7.324e-02, 8.527e-02, 6.751e-03, -8.172e-02, 5.645e-02, -9.335e-02, 9.705e-03, -1.859e-03, 2.190e-01)); + r += mul(s2_0, M4(1.063e-02, -5.882e-02, 7.294e-02, 1.135e-01, 6.834e-03, 2.521e-01, 3.334e-02, -7.202e-02, 1.982e-02, 8.106e-04, 5.125e-02, -3.961e-02, 1.600e-02, -1.903e-01, 8.996e-02, 1.905e-01)); + r += mul(s2_1, M4(1.227e-01, 1.424e-01, 1.137e-01, 3.396e-02, -7.578e-02, 9.724e-02, -2.649e-02, -7.468e-02, 2.632e-02, -2.053e-01, -2.161e-02, -8.906e-02, -5.289e-02, -1.019e-02, -5.841e-02, -2.570e-02)); + r += mul(s2_2, M4(3.359e-02, 5.073e-02, 1.054e-01, -3.593e-03, -7.366e-02, 1.187e-02, 2.007e-03, 2.112e-02, 8.835e-02, 7.359e-02, 2.478e-02, 4.758e-02, -8.954e-02, -2.354e-02, -1.852e-01, 1.836e-01)); + r += mul(s2_3, M4(-2.403e-01, -3.137e-01, 4.761e-02, -1.840e-01, 1.012e-01, 5.392e-02, -1.457e-01, -6.425e-02, -6.436e-03, -2.480e-02, 9.199e-02, -8.296e-02, -2.894e-01, 1.054e-01, 1.282e-01, -7.266e-02)); + r += mul(s2_4, M4(3.247e-01, -1.603e-01, 6.251e-02, -1.106e-01, -4.083e-02, 2.252e-01, -2.616e-01, 1.397e-01, -1.153e-01, -4.065e-02, 5.923e-02, -4.491e-03, 6.616e-02, -2.146e-01, 6.314e-02, 5.401e-01)); + r += mul(s2_5, M4(7.356e-02, 3.269e-03, 1.710e-01, -2.914e-02, -7.138e-02, 2.294e-02, 1.634e-01, 1.120e-01, -7.388e-02, -1.768e-02, -3.813e-02, -3.019e-02, -4.569e-02, -1.257e-01, -1.341e-01, 4.040e-03)); + r += mul(s2_6, M4(-1.479e-01, 2.260e-02, 5.173e-02, 1.889e-01, -1.911e-01, -6.621e-02, 1.666e-01, 1.329e-01, -1.320e-01, 3.452e-02, 1.232e-01, -1.545e-02, 7.646e-02, 4.924e-02, -9.582e-02, -1.941e-01)); + r += mul(s2_7, M4(1.873e-01, -1.340e-02, -1.278e-01, 9.443e-02, 4.326e-02, 1.467e-01, 7.788e-02, 1.345e-01, 8.715e-02, -1.063e-01, -1.265e-01, 1.358e-01, 3.897e-02, -9.523e-03, -6.335e-02, 2.356e-02)); + r += mul(s2_8, M4(-1.881e-02, -5.854e-02, -1.554e-02, -1.388e-01, -5.206e-03, 4.616e-02, -4.462e-02, 8.522e-03, -4.023e-02, -1.133e-01, 8.830e-02, -7.407e-02, -1.715e-02, -3.550e-02, 2.474e-02, 9.114e-02)); + r += mul(s3_0, M4(7.529e-02, 2.230e-01, 1.972e-02, -1.296e-02, 1.146e-01, -6.835e-02, 4.912e-02, 1.397e-02, 1.189e-01, 6.960e-02, -4.406e-02, -7.066e-02, -1.058e-01, 6.757e-02, 1.539e-01, 1.892e-01)); + r += mul(s3_1, M4(-6.716e-02, 2.716e-01, 1.435e-01, -2.363e-01, 5.216e-02, -3.579e-02, 1.132e-01, -8.205e-03, 3.452e-01, 1.436e-01, -4.125e-02, 2.391e-01, -1.578e-01, 1.164e-02, 1.621e-01, -7.879e-02)); + r += mul(s3_2, M4(-1.167e-01, 1.343e-01, -1.091e-01, -1.064e-01, -1.269e-02, -8.151e-02, 7.006e-02, -3.599e-02, 1.215e-01, 2.535e-02, -8.567e-02, 7.653e-02, 1.470e-02, 1.479e-01, -6.068e-02, 8.576e-02)); + r += mul(s3_3, M4(-2.659e-01, 5.315e-02, 8.693e-02, 1.562e-01, 2.764e-01, -4.758e-01, -2.118e-02, -1.585e-01, 1.634e-01, 1.815e-01, 3.742e-02, 1.125e-01, -1.832e-01, 3.244e-01, 1.500e-01, 1.319e-01)); + r += mul(s3_4, M4(-7.748e-02, -1.417e-01, -2.502e-02, -5.102e-01, 5.740e-02, -1.569e-01, -1.604e-01, 1.076e-01, 9.692e-02, 1.335e-01, 1.066e-01, 2.489e-01, -1.600e-01, -2.911e-02, 9.011e-04, -1.260e-01)); + r += mul(s3_5, M4(-5.218e-02, 1.823e-01, 2.527e-02, 5.142e-02, 3.503e-02, -1.782e-01, 1.947e-01, 1.810e-01, 1.059e-01, 3.631e-02, -1.122e-01, -1.281e-01, -6.201e-02, 5.464e-02, -2.633e-01, -2.567e-01)); + r += mul(s3_6, M4(-3.602e-01, 8.443e-02, 3.335e-02, 2.454e-01, 2.898e-02, -5.114e-01, 1.577e-01, 1.251e-01, -6.350e-02, 4.388e-02, 4.373e-02, 3.042e-03, 4.010e-02, 4.499e-02, -8.740e-02, -1.123e-01)); + r += mul(s3_7, M4(-1.979e-01, 3.968e-02, -6.856e-02, 9.250e-02, 5.656e-02, -2.908e-01, 4.040e-01, 1.679e-01, 3.232e-01, 2.436e-01, -2.430e-01, 3.446e-01, -1.092e-01, 8.027e-02, 5.210e-03, -1.632e-01)); + r += mul(s3_8, M4(-8.864e-02, 5.409e-02, -7.792e-02, -6.164e-02, -3.213e-02, 5.911e-02, -3.344e-02, -1.642e-01, -3.467e-02, 1.005e-01, -4.552e-02, -5.140e-02, -3.020e-02, -5.049e-02, 5.460e-02, 2.551e-01)); + r += V4(1.554e-02, -1.502e-02, 3.403e-02, -3.054e-03); + return r; +} + +V4 f1(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8) { + V4 r = 0.0; + r += mul(s0_0, M4(2.210e-01, -8.771e-02, 8.433e-02, -1.834e-02, 4.487e-03, 1.229e-01, 9.812e-02, 1.122e-02, 6.535e-02, 2.964e-02, -5.238e-02, -8.784e-03, 1.608e-01, -3.298e-01, -7.243e-02, -2.594e-02)); + r += mul(s0_1, M4(1.251e-01, 2.624e-03, 1.901e-01, -4.362e-02, -2.175e-02, 6.931e-02, 8.964e-03, -1.462e-02, 4.903e-02, 4.953e-03, 4.655e-02, -7.294e-02, 1.417e-01, -8.032e-02, 3.567e-02, -2.951e-02)); + r += mul(s0_2, M4(6.153e-02, -1.150e-01, 1.440e-01, -5.493e-02, 4.033e-02, 1.981e-03, -2.974e-02, 2.702e-02, 5.450e-02, -7.033e-02, -2.222e-02, -7.965e-02, 1.456e-02, 2.782e-02, 2.746e-02, 1.040e-02)); + r += mul(s0_3, M4(2.015e-01, 3.217e-01, 7.861e-02, -8.683e-03, 3.937e-02, -4.713e-03, -3.380e-02, 2.001e-03, 1.475e-02, 4.002e-02, -1.472e-02, -6.966e-02, 1.221e-01, -1.903e-01, -2.130e-02, 2.612e-02)); + r += mul(s0_4, M4(-1.416e-01, 6.991e-02, 5.720e-02, 8.791e-02, 1.773e-01, -3.038e-01, -3.310e-01, -1.970e-01, -1.473e-01, 2.420e-01, 3.486e-02, -5.738e-02, -2.204e-01, -5.488e-02, -2.149e-01, 4.573e-01)); + r += mul(s0_5, M4(-4.676e-02, 6.991e-02, 8.723e-02, -4.131e-02, -3.696e-03, -9.530e-02, -2.305e-01, 7.145e-02, 1.770e-01, 1.801e-01, 7.689e-02, -2.927e-01, 2.088e-01, -6.714e-02, 6.918e-02, -8.667e-02)); + r += mul(s0_6, M4(2.136e-01, -2.888e-03, 6.237e-02, -2.379e-01, -1.859e-01, -4.943e-02, 9.806e-02, 3.477e-02, 1.773e-01, -1.017e-02, -8.464e-02, -4.892e-02, 1.725e-01, -2.379e-02, -1.774e-01, 6.270e-02)); + r += mul(s0_7, M4(9.334e-02, 4.811e-03, 1.178e-01, -8.021e-02, 3.474e-02, -4.447e-02, 2.635e-02, 3.954e-02, 6.511e-02, -1.431e-01, -3.595e-02, -2.550e-01, -1.586e-01, -2.793e-01, -5.439e-02, 1.146e-01)); + r += mul(s0_8, M4(-1.065e-02, -2.644e-02, 2.093e-02, 8.023e-02, 3.019e-02, 1.242e-02, -3.142e-02, -1.020e-01, 1.166e-01, -4.816e-02, -7.099e-02, -4.466e-02, 1.021e-01, 1.844e-02, -5.070e-02, 5.314e-02)); + r += mul(s1_0, M4(-4.590e-02, -2.057e-01, -1.242e-01, -3.319e-02, -2.894e-01, 3.706e-01, 1.807e-01, 4.483e-02, -3.240e-03, 6.281e-02, -1.038e-01, 1.921e-02, 2.339e-01, -3.037e-01, 1.067e-01, -7.859e-02)); + r += mul(s1_1, M4(-1.438e-01, 1.188e-02, 1.465e-01, -5.182e-02, -1.534e-01, 9.311e-02, 2.122e-01, -5.038e-03, -1.265e-01, -5.506e-03, -3.281e-02, -1.296e-02, -2.746e-02, -1.885e-02, 1.191e-01, -6.267e-03)); + r += mul(s1_2, M4(-8.901e-03, -1.093e-01, 8.306e-02, -6.763e-02, -8.580e-02, 1.989e-01, 2.396e-01, 9.082e-02, 6.451e-03, -9.354e-02, -7.606e-02, 4.595e-02, -6.431e-02, 2.274e-01, 2.200e-01, 8.497e-02)); + r += mul(s1_3, M4(-8.861e-02, 1.255e-01, 3.949e-02, -6.585e-02, -4.185e-02, 4.627e-01, -3.145e-02, 2.407e-02, -5.978e-02, -7.530e-02, -9.670e-03, -1.027e-02, -9.589e-02, 9.377e-02, 2.228e-01, 2.195e-02)); + r += mul(s1_4, M4(-3.904e-01, 3.109e-03, -1.475e-01, 3.837e-01, -1.894e-01, 6.479e-02, -6.395e-02, -1.995e-02, -2.757e-01, 8.815e-02, -7.492e-02, 1.081e-01, -3.250e-01, 2.217e-02, -2.679e-01, 2.825e-01)); + r += mul(s1_5, M4(-3.827e-02, -8.505e-02, -4.066e-02, -6.333e-02, -7.558e-02, 2.457e-01, 1.232e-01, -2.482e-01, 3.403e-02, 4.594e-02, -4.212e-03, -1.739e-01, -2.179e-01, -1.252e-01, 2.949e-02, 2.564e-01)); + r += mul(s1_6, M4(6.617e-02, -9.007e-02, 8.929e-02, -1.230e-01, -1.098e-01, -1.735e-02, 6.949e-02, -4.675e-02, -6.309e-02, -7.797e-02, -6.646e-02, -5.128e-03, 2.148e-01, 1.261e-01, -1.065e-01, 1.382e-01)); + r += mul(s1_7, M4(5.742e-02, -1.194e-01, 8.199e-02, -5.755e-02, -6.747e-03, 2.054e-01, 1.251e-01, 3.603e-02, -1.160e-01, -1.202e-01, -1.329e-01, -1.194e-02, -1.654e-01, -2.280e-02, -2.143e-01, 9.542e-02)); + r += mul(s1_8, M4(8.072e-02, -2.271e-02, -2.824e-02, -9.697e-03, -2.783e-01, -2.375e-02, 1.056e-01, -4.308e-02, -9.954e-02, -5.603e-02, 1.340e-02, 6.323e-02, -9.490e-02, 1.534e-01, -9.825e-02, 1.031e-01)); + r += mul(s2_0, M4(-6.657e-02, 1.213e-01, -4.044e-03, -1.773e-02, -1.002e-01, -9.754e-02, -8.548e-02, -7.991e-03, -1.089e-02, 2.650e-02, 7.231e-02, 1.553e-02, 1.862e-02, -4.304e-02, -2.659e-02, -9.413e-02)); + r += mul(s2_1, M4(-1.215e-01, 2.919e-01, -1.007e-01, 5.449e-02, -3.993e-02, -2.603e-01, -9.447e-02, 4.317e-02, 1.249e-02, 6.626e-03, 3.549e-02, 2.056e-02, -1.929e-01, 2.127e-01, 1.262e-01, 1.266e-01)); + r += mul(s2_2, M4(-1.348e-01, 9.263e-02, 4.868e-02, 3.141e-02, -3.260e-02, -5.119e-02, 1.882e-02, -2.687e-02, 1.175e-01, 7.400e-03, 5.936e-02, -3.558e-02, -1.845e-01, 1.852e-01, 1.900e-01, 3.633e-02)); + r += mul(s2_3, M4(-1.500e-01, 5.300e-01, 1.362e-01, 1.648e-02, -2.638e-01, -1.051e-01, -8.124e-02, 6.321e-02, 1.936e-02, -9.783e-03, -2.973e-03, -3.255e-02, -8.121e-03, 1.057e-01, 3.040e-02, 1.927e-03)); + r += mul(s2_4, M4(-3.394e-01, -9.811e-02, 1.051e-01, 7.235e-02, 7.202e-02, -4.507e-02, -3.230e-01, 7.066e-02, -9.951e-02, -3.135e-02, -3.983e-02, -1.663e-02, -1.988e-01, -1.760e-01, 7.408e-02, 7.511e-03)); + r += mul(s2_5, M4(-1.656e-01, -5.325e-02, 8.364e-02, -1.237e-01, -2.843e-02, -1.214e-01, 2.234e-02, -8.794e-02, -5.301e-02, -9.052e-02, -7.931e-03, 1.106e-01, -5.915e-02, 2.891e-01, 1.154e-02, 4.972e-01)); + r += mul(s2_6, M4(-1.144e-01, 1.519e-01, -1.635e-02, -4.138e-02, -2.222e-01, -2.007e-02, -9.045e-02, 7.578e-02, -1.112e-02, 7.288e-02, -6.133e-02, 4.914e-02, -3.029e-02, 6.290e-02, -3.176e-02, -5.098e-02)); + r += mul(s2_7, M4(9.470e-03, -3.087e-02, -4.088e-02, -1.636e-01, -1.954e-01, -3.066e-02, -6.252e-01, 3.643e-01, -8.264e-02, -9.051e-02, -4.227e-02, -1.096e-01, -1.828e-01, 9.511e-02, -1.038e-01, 1.368e-01)); + r += mul(s2_8, M4(-1.110e-01, 1.403e-02, 6.434e-02, 4.785e-02, -9.627e-02, -9.932e-02, -3.143e-02, 1.898e-01, 5.175e-02, 1.199e-01, 1.578e-01, 1.062e-02, -1.138e-01, 8.965e-02, 4.713e-03, 1.549e-01)); + r += mul(s3_0, M4(3.829e-02, -1.337e-01, -1.104e-03, -7.664e-03, 6.715e-02, 1.739e-01, 1.395e-02, 1.015e-02, -6.929e-02, -4.876e-02, -3.160e-02, 4.958e-03, 3.909e-02, -7.175e-02, 6.043e-02, -1.690e-03)); + r += mul(s3_1, M4(-4.348e-02, -3.422e-01, -1.035e-01, 5.749e-02, -2.770e-02, -6.681e-02, 9.643e-02, -3.363e-02, -1.086e-01, 1.263e-01, -3.565e-02, 1.481e-01, 2.105e-01, -1.008e-01, 2.541e-02, -1.773e-03)); + r += mul(s3_2, M4(-1.641e-01, -1.775e-01, -3.140e-02, -2.266e-02, 5.426e-02, 1.135e-01, 1.251e-01, -6.043e-02, -1.022e-01, 4.385e-01, 7.205e-03, 9.644e-02, 9.829e-02, -5.496e-02, -2.885e-02, -8.019e-02)); + r += mul(s3_3, M4(-1.623e-01, -4.012e-02, 4.193e-02, 5.826e-02, 7.017e-02, 3.917e-02, 1.997e-01, -8.713e-02, -2.845e-02, 8.698e-02, -1.084e-02, 3.293e-02, 3.392e-04, 6.589e-02, -7.126e-02, 2.960e-02)); + r += mul(s3_4, M4(-3.154e-01, -1.805e-01, -2.569e-01, 1.802e-02, 5.784e-01, 3.153e-02, 1.085e-01, -8.445e-02, -1.383e-01, 3.813e-01, -4.014e-01, 2.353e-01, 7.655e-02, -5.224e-01, -2.345e-01, -5.558e-02)); + r += mul(s3_5, M4(-7.284e-02, -4.643e-01, -1.979e-01, -2.940e-01, 3.934e-02, 1.468e-01, 2.169e-01, -1.865e-01, 3.773e-02, 1.863e-01, -2.202e-01, 3.661e-01, 2.442e-01, -6.375e-02, -1.982e-01, -2.276e-02)); + r += mul(s3_6, M4(-6.857e-02, -1.182e-01, -5.203e-02, -4.814e-02, 1.110e-01, 5.270e-02, 1.293e-01, -6.715e-02, -1.529e-01, 1.844e-01, -1.089e-01, 6.857e-02, 1.382e-01, 3.184e-02, 2.557e-02, -2.965e-02)); + r += mul(s3_7, M4(1.598e-01, -3.311e-01, -1.057e-01, -4.271e-01, 2.381e-01, -4.726e-02, 1.948e-01, -8.839e-02, -9.368e-02, 1.343e-01, -1.369e-01, 8.824e-02, 7.348e-02, 3.476e-02, -2.949e-02, 6.313e-03)); + r += mul(s3_8, M4(1.153e-01, -1.471e-01, -5.845e-02, -2.276e-01, 1.669e-01, -4.299e-02, 7.663e-02, -3.158e-02, -1.171e-01, 1.190e-01, -5.942e-02, 1.771e-01, 1.996e-03, 2.404e-02, -3.151e-02, -3.041e-02)); + r += V4(-1.519e-02, -1.626e-03, -6.363e-03, 2.015e-02); + return r; +} + +void Pass4(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = Rmp8x8(tid.x) + blockStart; + uint2 size = GetInputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = (gxy + 0.5) * pt; + + V4 s0_0 = l0(-1.0, -1.0); + V4 s0_1 = l0(0.0, -1.0); + V4 s0_2 = l0(1.0, -1.0); + V4 s0_3 = l0(-1.0, 0.0); + V4 s0_4 = l0(0.0, 0.0); + V4 s0_5 = l0(1.0, 0.0); + V4 s0_6 = l0(-1.0, 1.0); + V4 s0_7 = l0(0.0, 1.0); + V4 s0_8 = l0(1.0, 1.0); + V4 s1_0 = -max(-s0_0, 0.0); + V4 s1_1 = -max(-s0_1, 0.0); + V4 s1_2 = -max(-s0_2, 0.0); + V4 s1_3 = -max(-s0_3, 0.0); + V4 s1_4 = -max(-s0_4, 0.0); + V4 s1_5 = -max(-s0_5, 0.0); + V4 s1_6 = -max(-s0_6, 0.0); + V4 s1_7 = -max(-s0_7, 0.0); + V4 s1_8 = -max(-s0_8, 0.0); + s0_0 = max(s0_0, 0.0); + s0_1 = max(s0_1, 0.0); + s0_2 = max(s0_2, 0.0); + s0_3 = max(s0_3, 0.0); + s0_4 = max(s0_4, 0.0); + s0_5 = max(s0_5, 0.0); + s0_6 = max(s0_6, 0.0); + s0_7 = max(s0_7, 0.0); + s0_8 = max(s0_8, 0.0); + + V4 s2_0 = l1(-1.0, -1.0); + V4 s2_1 = l1(0.0, -1.0); + V4 s2_2 = l1(1.0, -1.0); + V4 s2_3 = l1(-1.0, 0.0); + V4 s2_4 = l1(0.0, 0.0); + V4 s2_5 = l1(1.0, 0.0); + V4 s2_6 = l1(-1.0, 1.0); + V4 s2_7 = l1(0.0, 1.0); + V4 s2_8 = l1(1.0, 1.0); + V4 s3_0 = -max(-s2_0, 0.0); + V4 s3_1 = -max(-s2_1, 0.0); + V4 s3_2 = -max(-s2_2, 0.0); + V4 s3_3 = -max(-s2_3, 0.0); + V4 s3_4 = -max(-s2_4, 0.0); + V4 s3_5 = -max(-s2_5, 0.0); + V4 s3_6 = -max(-s2_6, 0.0); + V4 s3_7 = -max(-s2_7, 0.0); + V4 s3_8 = -max(-s2_8, 0.0); + s2_0 = max(s2_0, 0.0); + s2_1 = max(s2_1, 0.0); + s2_2 = max(s2_2, 0.0); + s2_3 = max(s2_3, 0.0); + s2_4 = max(s2_4, 0.0); + s2_5 = max(s2_5, 0.0); + s2_6 = max(s2_6, 0.0); + s2_7 = max(s2_7, 0.0); + s2_8 = max(s2_8, 0.0); + + t2[gxy] = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8); + t3[gxy] = f1(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8); +} + +//!PASS 5 +//!DESC conv4 +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 +//!IN t2, t3 +//!OUT t0, t1 + +#define l0(x, y) V4(O(t2, float2(x, y))) +#define l1(x, y) V4(O(t3, float2(x, y))) + +V4 f0(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-4.603e-02, 1.457e-02, 4.018e-02, 1.284e-01, -2.497e-02, 1.041e-02, 8.365e-02, -2.611e-02, 2.223e-02, -8.476e-03, -1.068e-01, -1.092e-02, -2.023e-02, -6.393e-02, 3.540e-02, -3.517e-02)); + r += mul(s0_1, M4(4.999e-02, -3.245e-02, 3.582e-03, -1.362e-01, 5.032e-02, 2.189e-03, -1.182e-01, -5.752e-02, -3.133e-02, -4.474e-02, 6.192e-02, -5.508e-02, 2.607e-02, 3.363e-02, -4.378e-02, -6.372e-02)); + r += mul(s0_2, M4(-1.613e-01, -8.100e-02, -7.770e-03, 1.425e-02, -1.075e-02, 4.560e-02, -1.378e-02, 2.426e-02, 4.124e-02, 6.632e-02, 1.771e-01, 1.226e-01, -8.028e-02, 3.032e-02, 2.187e-02, -7.814e-03)); + r += mul(s0_3, M4(4.616e-02, 1.362e-01, -1.578e-01, -7.459e-02, -1.762e-01, 3.738e-02, -2.270e-02, -1.593e-01, -9.981e-02, 7.580e-02, 1.020e-01, -1.905e-02, -4.813e-02, -3.603e-02, -6.406e-02, 5.516e-02)); + r += mul(s0_4, M4(-3.955e-01, 4.862e-03, 4.408e-01, 3.431e-01, 1.827e-01, 4.348e-02, 1.825e-02, 3.428e-02, 9.285e-02, 2.980e-01, -1.655e-01, 1.925e-02, 1.656e-01, -7.685e-02, -2.193e-01, -6.239e-02)); + r += mul(s0_5, M4(1.214e-01, -1.069e-02, -2.443e-01, 4.160e-03, -2.923e-03, -3.846e-01, 1.242e-01, 1.638e-02, 1.392e-01, 2.218e-01, 8.119e-02, 6.071e-02, -3.691e-02, -2.882e-01, 1.464e-01, 7.349e-02)); + r += mul(s0_6, M4(-1.240e-01, 7.950e-03, 6.145e-02, -8.886e-02, 5.262e-02, 9.563e-02, -2.241e-02, -5.722e-02, -1.371e-02, 4.435e-02, 1.125e-01, 1.029e-01, -1.878e-02, -3.662e-03, 2.522e-02, -6.313e-02)); + r += mul(s0_7, M4(-2.502e-02, 1.062e-01, -2.685e-01, 4.436e-02, 2.446e-02, 7.840e-02, -6.193e-02, -7.416e-05, 2.145e-02, 2.132e-01, -1.304e-01, 1.844e-01, -3.718e-04, -8.233e-02, 1.137e-01, -1.111e-02)); + r += mul(s0_8, M4(6.311e-02, 1.239e-02, 3.474e-02, 6.830e-02, 7.880e-02, 1.460e-01, 1.436e-02, 5.359e-03, 1.001e-01, 1.663e-01, 3.111e-02, 1.435e-02, 1.698e-02, 1.415e-02, 6.806e-02, 2.488e-03)); + r += mul(s1_0, M4(1.176e-02, -4.177e-02, -5.899e-02, -8.043e-02, -5.556e-02, -5.232e-02, 1.104e-01, -1.912e-02, -1.999e-02, 3.132e-02, 3.493e-02, -4.262e-02, 8.312e-02, 9.728e-02, -4.373e-02, 9.260e-02)); + r += mul(s1_1, M4(-1.069e-01, 4.645e-02, 2.282e-01, -5.721e-02, -3.651e-02, -3.742e-03, -8.886e-03, -5.040e-02, -5.751e-02, 4.869e-02, 9.988e-03, 1.313e-02, -3.140e-02, 1.363e-01, -9.975e-02, -3.207e-02)); + r += mul(s1_2, M4(-1.288e-01, -2.886e-02, 9.747e-02, 2.324e-02, 1.364e-02, -8.983e-02, 5.610e-02, 2.811e-02, -2.433e-02, 2.233e-01, -1.660e-02, 7.249e-02, -4.680e-02, 2.193e-01, -2.173e-01, -8.384e-02)); + r += mul(s1_3, M4(-1.302e-03, -2.432e-02, 1.779e-01, 8.593e-02, -1.982e-01, 5.378e-02, -5.749e-03, -3.947e-02, -2.771e-02, 6.767e-02, -1.146e-01, -3.119e-02, 6.422e-02, 9.432e-02, -3.233e-01, 9.318e-02)); + r += mul(s1_4, M4(-2.855e-01, 1.026e-01, 2.524e-01, 2.993e-01, 2.177e-01, -1.882e-01, -5.235e-02, -6.145e-03, 2.709e-02, 2.778e-01, 2.826e-01, -2.878e-01, 3.057e-01, 1.621e-01, -2.407e-01, -3.343e-01)); + r += mul(s1_5, M4(-3.628e-02, 5.554e-03, 1.063e-01, 4.774e-02, 3.746e-02, -1.545e-01, -4.221e-02, 6.273e-02, 7.253e-02, 5.197e-01, -5.520e-02, -6.371e-02, 1.401e-01, 2.903e-02, -6.322e-02, -1.457e-01)); + r += mul(s1_6, M4(-3.768e-02, 8.166e-03, 3.330e-01, 9.689e-02, -3.890e-02, 1.159e-01, 6.738e-02, -8.253e-02, -7.114e-03, -1.422e-02, 1.549e-01, 6.271e-02, -1.100e-02, 2.598e-02, -2.596e-01, -8.673e-02)); + r += mul(s1_7, M4(-1.372e-01, 6.481e-02, -1.001e-01, 7.663e-02, 5.323e-02, 1.137e-01, 9.721e-02, 3.063e-01, 7.966e-02, 1.892e-01, -2.452e-01, 8.129e-02, 6.147e-02, -4.174e-02, -8.889e-02, -2.223e-01)); + r += mul(s1_8, M4(-7.513e-02, 1.446e-02, 1.697e-01, 7.281e-02, 2.272e-02, 1.891e-01, -2.171e-01, -8.146e-02, 4.419e-02, 9.160e-02, 3.967e-02, 3.398e-02, 1.016e-02, 1.109e-02, -1.280e-02, 6.043e-03)); + r += mul(s2_0, M4(-1.125e-02, -4.668e-02, 8.017e-03, -1.144e-01, -1.167e-01, 1.599e-02, 1.427e-01, -8.549e-02, -8.563e-02, -7.150e-03, 1.269e-01, -1.134e-02, -1.111e-02, -9.739e-02, 5.041e-02, -7.451e-02)); + r += mul(s2_1, M4(-4.166e-02, -2.516e-02, 9.528e-02, 5.857e-02, 9.985e-02, -1.021e-02, 1.122e-02, 1.325e-02, -3.881e-02, 5.275e-02, -1.425e-01, 2.573e-01, 3.958e-02, -1.059e-01, 1.155e-01, 4.783e-02)); + r += mul(s2_2, M4(-9.030e-03, -9.384e-03, 1.231e-01, -2.887e-02, 6.405e-02, -2.676e-02, -7.671e-03, 1.489e-02, -3.528e-02, -2.811e-01, 1.087e-01, 2.132e-02, -4.533e-02, 1.584e-02, 7.144e-02, 3.402e-02)); + r += mul(s2_3, M4(1.897e-01, 6.806e-03, -2.573e-01, 1.147e-02, -4.295e-02, 5.574e-02, -1.997e-01, -1.539e-01, 2.371e-01, 8.366e-02, -5.064e-02, 7.570e-02, 2.415e-01, -9.769e-02, 1.666e-02, 1.138e-01)); + r += mul(s2_4, M4(4.319e-01, -1.018e-02, -2.282e-01, -6.357e-02, -2.734e-02, -2.508e-01, 7.848e-02, 6.481e-02, 1.501e-01, 1.706e-01, -7.193e-02, -4.792e-01, -7.641e-02, -7.082e-02, -1.236e-01, -6.017e-02)); + r += mul(s2_5, M4(-7.273e-02, -2.068e-01, -9.371e-02, -2.801e-02, 1.659e-01, 5.531e-02, -1.428e-02, 2.927e-02, -1.047e-01, -2.108e-01, 1.224e-01, 1.807e-01, -5.600e-02, -1.184e-02, -8.557e-02, 2.045e-02)); + r += mul(s2_6, M4(6.962e-02, -9.497e-02, -1.894e-02, 7.397e-02, 4.261e-02, 1.095e-02, 1.084e-01, 8.961e-02, 1.426e-01, 5.959e-02, -2.532e-02, -7.401e-02, 9.025e-02, -2.152e-02, 5.712e-02, -7.736e-02)); + r += mul(s2_7, M4(1.248e-01, -1.912e-01, 2.197e-01, -3.152e-02, 1.601e-02, -5.634e-02, 1.397e-01, 3.612e-01, 5.845e-02, 1.990e-01, 1.667e-01, 1.460e-01, -1.803e-02, -1.255e-01, 2.606e-02, -3.095e-02)); + r += mul(s2_8, M4(-7.043e-02, -1.660e-01, -1.409e-02, 2.977e-02, 9.866e-02, 6.648e-02, -8.271e-02, -1.705e-02, -5.470e-02, -4.730e-02, -9.331e-02, -9.813e-02, -2.882e-02, -7.116e-02, 3.656e-02, 7.024e-02)); + r += mul(s3_0, M4(3.335e-02, -1.035e-01, -4.027e-02, -9.856e-02, 1.123e-02, -4.545e-02, -1.428e-02, -4.436e-02, -1.125e-02, 5.338e-02, 1.272e-01, 7.738e-02, 2.460e-01, 6.170e-02, -2.828e-01, -9.801e-02)); + r += mul(s3_1, M4(-1.291e-02, -9.460e-02, 1.647e-01, 3.956e-02, 6.269e-02, -1.042e-01, 1.587e-01, 1.304e-01, 8.502e-03, 3.894e-02, 4.633e-02, 1.400e-01, -1.945e-02, 3.277e-01, 1.464e-01, 1.050e-01)); + r += mul(s3_2, M4(-3.341e-02, -1.665e-02, 7.029e-02, 4.459e-02, 5.240e-02, -1.783e-01, 1.174e-01, 7.980e-02, -6.808e-04, 3.650e-02, -9.933e-02, -2.446e-02, -7.836e-02, 1.854e-01, 5.613e-02, -1.825e-02)); + r += mul(s3_3, M4(-2.069e-01, -4.267e-02, 2.725e-01, 5.264e-03, -4.267e-02, -9.650e-03, -3.641e-02, -5.011e-02, 1.346e-01, 1.087e-01, -1.854e-01, 1.758e-01, 4.033e-01, -1.891e-01, 1.411e-01, -1.705e-01)); + r += mul(s3_4, M4(3.056e-01, -5.330e-01, 5.010e-02, 2.460e-01, -2.118e-02, 1.479e-01, 1.269e-01, 2.600e-01, 9.058e-02, -2.206e-01, 2.627e-02, -2.579e-01, -5.702e-03, -2.285e-01, 2.033e-01, -1.174e-01)); + r += mul(s3_5, M4(6.399e-02, -1.645e-01, -1.331e-01, 5.684e-02, 4.928e-02, -2.339e-01, 2.013e-02, -4.284e-02, -2.017e-01, -4.847e-02, 2.648e-02, -1.329e-02, -1.203e-01, -1.062e-01, -7.317e-02, 7.343e-02)); + r += mul(s3_6, M4(1.753e-02, -9.153e-03, 9.648e-02, 1.480e-01, 2.131e-02, 6.322e-03, 1.606e-01, 2.550e-01, 1.438e-02, 9.530e-02, -1.749e-02, -3.708e-03, 1.606e-01, 6.072e-02, 1.209e-01, -1.087e-01)); + r += mul(s3_7, M4(4.474e-02, -1.546e-01, -1.312e-02, 4.897e-02, 9.376e-02, 8.851e-02, 8.660e-02, -7.482e-03, 1.519e-01, 8.864e-02, 5.592e-02, -1.059e-02, -1.083e-01, -1.601e-01, 2.599e-01, 6.959e-02)); + r += mul(s3_8, M4(-1.033e-01, -1.514e-01, 3.964e-02, 5.707e-02, -2.455e-02, -1.163e-01, 2.173e-01, 1.447e-01, -1.753e-02, -3.387e-02, 2.775e-02, -3.772e-02, -1.142e-01, 5.344e-02, -1.796e-01, -1.290e-01)); + r += V4(7.981e-03, 1.017e-02, -9.502e-03, -2.618e-02); + return r; +} + +V4 f1(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8) { + V4 r = 0.0; + r += mul(s0_0, M4(4.499e-03, -1.196e-02, -1.650e-02, 6.240e-02, -4.222e-02, -1.463e-02, -6.762e-02, -3.560e-02, 1.501e-01, -1.203e-01, 1.276e-01, 3.161e-02, 8.032e-02, -5.788e-02, 3.964e-02, -1.081e-01)); + r += mul(s0_1, M4(7.720e-02, -1.253e-01, 1.192e-01, 4.363e-02, 2.300e-03, 3.121e-02, -9.608e-02, -1.262e-01, -1.082e-02, -5.831e-02, 1.486e-01, 1.558e-01, 2.582e-02, -7.162e-02, -1.317e-01, -1.325e-01)); + r += mul(s0_2, M4(-3.036e-02, -1.122e-01, -2.954e-02, 4.476e-02, 5.942e-02, 1.889e-02, 2.699e-02, 3.370e-02, 7.309e-02, 7.204e-03, 8.554e-02, -3.684e-02, 2.101e-03, 5.032e-02, 4.602e-02, -4.234e-02)); + r += mul(s0_3, M4(1.287e-01, -6.731e-02, -1.535e-01, 6.860e-02, 1.347e-01, -6.583e-02, -2.647e-02, -7.921e-03, 1.514e-01, -4.460e-02, -5.672e-02, -1.412e-01, 2.153e-01, -8.017e-03, 3.155e-03, 9.885e-02)); + r += mul(s0_4, M4(1.192e-01, -1.237e-01, -1.446e-01, -2.197e-01, 5.265e-02, -1.721e-02, 1.762e-01, -1.570e-01, -2.728e-01, -9.284e-02, -1.318e-01, -2.472e-01, 2.642e-01, 3.686e-02, 2.810e-01, -7.129e-02)); + r += mul(s0_5, M4(1.372e-01, -3.096e-01, 1.258e-01, 1.579e-01, -1.576e-01, 3.233e-01, -7.987e-02, -1.414e-01, -6.258e-02, 8.063e-02, -9.703e-02, 1.087e-01, 2.968e-02, 3.011e-02, 3.135e-01, 5.113e-02)); + r += mul(s0_6, M4(-4.781e-02, -1.868e-02, -1.984e-02, 3.647e-02, -7.447e-02, -1.965e-02, -7.801e-02, -2.734e-02, 5.353e-02, 7.222e-02, -2.888e-02, -5.486e-02, 5.216e-02, -2.872e-02, -1.073e-02, 3.894e-02)); + r += mul(s0_7, M4(-8.822e-02, 2.075e-01, -9.096e-02, -5.276e-03, 3.016e-01, 9.170e-02, -3.208e-02, 1.088e-01, -1.142e-01, 3.082e-01, -1.133e-01, -2.093e-01, 2.744e-01, 2.188e-02, 2.380e-02, 9.535e-02)); + r += mul(s0_8, M4(-1.286e-02, -8.243e-02, 2.199e-02, 2.645e-01, 6.284e-02, 1.616e-02, -5.037e-02, 8.813e-02, -2.444e-02, -8.535e-02, 3.516e-02, 3.767e-02, -8.980e-02, 1.333e-01, 2.389e-02, 4.367e-02)); + r += mul(s1_0, M4(-1.972e-02, -4.719e-02, 4.859e-02, -8.123e-03, 7.200e-02, -2.635e-02, -1.962e-02, -6.082e-02, 7.614e-02, 6.818e-03, 6.225e-02, 7.733e-02, -2.530e-02, -2.384e-02, -1.177e-01, -4.357e-02)); + r += mul(s1_1, M4(1.055e-01, -8.694e-02, 4.911e-03, -5.235e-02, 2.067e-02, -7.520e-02, -1.095e-01, -2.507e-01, 4.948e-02, -5.254e-02, -7.734e-02, 3.959e-01, -5.456e-02, -8.501e-02, -2.084e-01, -7.064e-02)); + r += mul(s1_2, M4(-4.418e-02, -2.485e-03, -9.979e-02, -1.702e-02, -1.339e-01, 2.062e-02, -6.812e-02, -3.193e-01, -8.136e-02, 8.432e-02, -9.392e-02, -7.457e-02, -4.301e-02, -9.250e-02, -3.137e-01, -1.783e-01)); + r += mul(s1_3, M4(7.296e-02, 6.799e-03, -8.333e-04, 4.303e-02, 2.939e-01, -1.032e-01, 2.746e-02, 1.708e-02, 1.057e-01, -7.090e-02, -1.024e-01, 1.230e-03, 3.034e-02, -7.408e-02, -1.711e-01, 2.089e-01)); + r += mul(s1_4, M4(2.376e-01, -4.740e-01, -2.568e-01, 2.305e-01, 1.795e-01, 3.196e-03, 2.923e-01, -2.949e-01, -2.451e-01, -1.050e-01, 6.901e-03, -1.139e-01, 1.644e-01, -1.711e-03, -2.378e-02, 1.237e-01)); + r += mul(s1_5, M4(1.772e-01, -1.673e-01, 2.690e-01, -1.356e-03, 6.326e-03, 1.908e-01, 6.859e-02, -1.588e-02, 5.134e-02, 1.322e-01, -1.345e-01, 2.626e-01, 6.353e-02, -6.034e-03, -4.632e-03, 6.808e-02)); + r += mul(s1_6, M4(-1.538e-01, -2.396e-02, 9.343e-02, -9.545e-02, 2.179e-01, -6.521e-02, 3.206e-02, -1.402e-01, 8.921e-02, -1.290e-02, -8.212e-03, -3.336e-03, -1.101e-01, -7.274e-02, -1.222e-01, -3.584e-03)); + r += mul(s1_7, M4(-2.568e-01, 3.896e-01, -1.382e-01, -1.016e-01, 6.448e-01, 2.466e-02, -1.558e-01, -1.596e-01, 9.313e-03, 2.957e-01, -1.509e-01, -1.101e-03, 1.536e-01, -6.831e-02, -2.091e-02, -5.669e-03)); + r += mul(s1_8, M4(2.950e-02, -3.207e-02, 3.291e-02, 1.807e-02, 2.214e-01, -6.876e-02, -1.293e-01, 2.144e-01, -8.780e-02, -1.075e-01, 1.157e-02, 1.124e-01, -1.431e-01, 7.471e-02, 2.634e-02, -1.739e-01)); + r += mul(s2_0, M4(-3.641e-02, -1.460e-01, 3.591e-02, 7.587e-02, -1.678e-02, 3.743e-02, -9.497e-02, -4.368e-02, -7.434e-02, 6.365e-02, -5.406e-02, -1.009e-01, -4.776e-02, -1.209e-01, 1.313e-01, -1.629e-02)); + r += mul(s2_1, M4(-2.724e-02, -4.254e-02, -1.241e-02, -1.851e-01, -1.199e-01, 3.992e-02, -1.018e-01, -2.485e-01, 2.846e-02, 3.044e-02, -2.142e-01, -1.481e-01, 5.311e-02, -6.084e-02, 2.746e-02, 2.253e-01)); + r += mul(s2_2, M4(2.912e-02, -8.517e-02, 4.616e-02, 2.585e-02, -3.418e-02, 7.831e-02, -6.313e-02, -6.349e-02, -2.185e-01, 4.734e-03, -1.576e-01, -2.940e-01, 3.779e-02, -4.732e-02, -2.341e-02, 9.825e-02)); + r += mul(s2_3, M4(-1.595e-01, 1.192e-01, -1.748e-02, 1.593e-01, 2.061e-01, -1.857e-01, 1.617e-01, 1.555e-02, -1.745e-02, 4.421e-02, -4.839e-02, -1.656e-01, -1.701e-01, 2.096e-01, 2.222e-01, -1.145e-01)); + r += mul(s2_4, M4(-7.095e-02, 2.911e-01, 1.119e-01, 6.460e-01, -1.009e-01, 2.390e-01, 4.439e-01, -2.016e-01, 3.076e-01, 1.578e-01, -8.802e-02, 2.667e-01, -8.825e-02, -4.537e-01, -2.085e-01, -3.020e-01)); + r += mul(s2_5, M4(5.685e-02, -2.135e-01, 3.319e-02, -1.256e-03, 9.093e-03, 2.351e-01, 8.694e-02, 1.826e-02, 1.843e-02, 1.012e-01, 9.358e-02, -1.900e-01, -5.482e-02, -1.073e-01, 2.982e-02, 8.203e-02)); + r += mul(s2_6, M4(-2.368e-01, -9.192e-03, 2.210e-02, 1.076e-01, -9.849e-02, 3.512e-02, 1.548e-02, -3.966e-02, 3.754e-01, 1.172e-01, -6.346e-02, 1.927e-01, 1.465e-01, -1.343e-01, 1.473e-01, 1.476e-01)); + r += mul(s2_7, M4(-1.001e-01, -2.172e-01, 3.278e-01, 3.514e-01, -2.047e-01, 2.959e-01, -2.066e-01, -2.066e-01, 2.820e-01, 2.278e-01, 3.879e-02, -9.134e-02, 1.094e-01, 3.713e-02, 7.681e-02, 1.422e-01)); + r += mul(s2_8, M4(1.533e-01, -9.170e-02, -1.468e-02, -1.166e-01, -1.566e-02, 2.613e-02, -6.614e-02, 1.829e-01, 1.087e-02, 5.517e-02, 6.255e-02, 1.459e-01, 4.011e-02, -6.970e-02, 5.322e-02, -1.088e-02)); + r += mul(s3_0, M4(-1.905e-02, -1.010e-01, 1.092e-01, 4.898e-02, -2.340e-02, 3.379e-02, 9.514e-02, 5.005e-03, 3.866e-03, -3.382e-02, -3.593e-02, 2.363e-02, -1.810e-01, 1.544e-01, 6.000e-02, 4.837e-02)); + r += mul(s3_1, M4(-1.749e-02, -1.130e-01, 6.763e-02, -4.278e-02, -3.698e-02, 7.479e-02, 1.882e-01, -1.991e-02, 9.916e-02, -3.566e-02, -2.936e-02, -6.237e-03, 9.864e-02, -1.650e-02, 8.939e-02, 6.387e-01)); + r += mul(s3_2, M4(1.503e-03, -3.209e-02, 1.688e-02, 9.354e-02, -6.807e-02, 1.355e-01, 1.820e-01, -4.962e-02, 7.103e-02, -2.163e-02, -5.474e-03, 8.376e-02, -4.150e-03, -1.194e-01, -3.023e-02, 3.833e-02)); + r += mul(s3_3, M4(5.056e-02, 6.071e-02, 2.378e-01, -1.013e-01, -2.159e-02, 1.218e-01, 2.809e-02, -6.215e-02, -1.733e-01, -3.470e-04, -7.359e-02, 7.317e-03, -5.394e-01, 5.426e-01, 3.015e-01, -3.820e-01)); + r += mul(s3_4, M4(-6.020e-02, -2.055e-01, 3.680e-01, -1.910e-01, -8.192e-02, 2.159e-01, -3.798e-02, -2.656e-01, 5.141e-02, 2.568e-01, -3.443e-01, 2.042e-01, -3.336e-01, -6.124e-01, 2.211e-01, -2.492e-01)); + r += mul(s3_5, M4(-3.453e-02, -4.960e-02, 7.981e-02, 2.635e-01, -7.613e-02, 2.725e-01, 1.583e-02, -1.533e-01, -6.782e-02, -1.673e-01, -1.790e-01, -1.456e-01, 1.161e-01, -2.882e-01, -4.865e-02, -8.904e-02)); + r += mul(s3_6, M4(-6.294e-02, 3.362e-02, 5.988e-02, 2.554e-02, -2.094e-01, 6.535e-02, 6.381e-02, -7.398e-02, 1.185e-01, -8.304e-02, -2.793e-02, -1.274e-01, 6.660e-02, 1.347e-02, 3.585e-02, -4.377e-02)); + r += mul(s3_7, M4(5.355e-02, -1.068e-01, -2.474e-02, 2.486e-01, 2.395e-01, -1.376e-01, 5.042e-02, 1.474e-01, 1.529e-01, 8.491e-02, 7.636e-02, -8.829e-03, 1.284e-01, -1.563e-01, 2.101e-01, -1.310e-01)); + r += mul(s3_8, M4(4.926e-02, -1.433e-01, -2.143e-02, -6.901e-02, -9.212e-02, 2.929e-01, 2.215e-01, 8.423e-02, 5.067e-02, 5.809e-02, 1.200e-01, 8.764e-02, 9.560e-02, -2.676e-01, -2.228e-01, -9.947e-02)); + r += V4(-1.969e-02, 1.581e-02, -1.910e-02, -1.871e-02); + return r; +} + +void Pass5(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = Rmp8x8(tid.x) + blockStart; + uint2 size = GetInputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = (gxy + 0.5) * pt; + + V4 s0_0 = l0(-1.0, -1.0); + V4 s0_1 = l0(0.0, -1.0); + V4 s0_2 = l0(1.0, -1.0); + V4 s0_3 = l0(-1.0, 0.0); + V4 s0_4 = l0(0.0, 0.0); + V4 s0_5 = l0(1.0, 0.0); + V4 s0_6 = l0(-1.0, 1.0); + V4 s0_7 = l0(0.0, 1.0); + V4 s0_8 = l0(1.0, 1.0); + V4 s1_0 = -max(-s0_0, 0.0); + V4 s1_1 = -max(-s0_1, 0.0); + V4 s1_2 = -max(-s0_2, 0.0); + V4 s1_3 = -max(-s0_3, 0.0); + V4 s1_4 = -max(-s0_4, 0.0); + V4 s1_5 = -max(-s0_5, 0.0); + V4 s1_6 = -max(-s0_6, 0.0); + V4 s1_7 = -max(-s0_7, 0.0); + V4 s1_8 = -max(-s0_8, 0.0); + s0_0 = max(s0_0, 0.0); + s0_1 = max(s0_1, 0.0); + s0_2 = max(s0_2, 0.0); + s0_3 = max(s0_3, 0.0); + s0_4 = max(s0_4, 0.0); + s0_5 = max(s0_5, 0.0); + s0_6 = max(s0_6, 0.0); + s0_7 = max(s0_7, 0.0); + s0_8 = max(s0_8, 0.0); + + V4 s2_0 = l1(-1.0, -1.0); + V4 s2_1 = l1(0.0, -1.0); + V4 s2_2 = l1(1.0, -1.0); + V4 s2_3 = l1(-1.0, 0.0); + V4 s2_4 = l1(0.0, 0.0); + V4 s2_5 = l1(1.0, 0.0); + V4 s2_6 = l1(-1.0, 1.0); + V4 s2_7 = l1(0.0, 1.0); + V4 s2_8 = l1(1.0, 1.0); + V4 s3_0 = -max(-s2_0, 0.0); + V4 s3_1 = -max(-s2_1, 0.0); + V4 s3_2 = -max(-s2_2, 0.0); + V4 s3_3 = -max(-s2_3, 0.0); + V4 s3_4 = -max(-s2_4, 0.0); + V4 s3_5 = -max(-s2_5, 0.0); + V4 s3_6 = -max(-s2_6, 0.0); + V4 s3_7 = -max(-s2_7, 0.0); + V4 s3_8 = -max(-s2_8, 0.0); + s2_0 = max(s2_0, 0.0); + s2_1 = max(s2_1, 0.0); + s2_2 = max(s2_2, 0.0); + s2_3 = max(s2_3, 0.0); + s2_4 = max(s2_4, 0.0); + s2_5 = max(s2_5, 0.0); + s2_6 = max(s2_6, 0.0); + s2_7 = max(s2_7, 0.0); + s2_8 = max(s2_8, 0.0); + + t0[gxy] = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8); + t1[gxy] = f1(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8); +} + +//!PASS 6 +//!DESC conv5 +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 +//!IN t0, t1 +//!OUT t2, t3 + +#define l0(x, y) V4(O(t0, float2(x, y))) +#define l1(x, y) V4(O(t1, float2(x, y))) + +V4 f0(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-5.629e-02, -1.499e-02, 2.729e-02, 5.240e-02, -2.085e-02, 1.943e-02, 2.721e-01, 1.895e-02, 1.703e-05, -2.185e-03, 5.241e-02, 1.372e-01, 9.478e-02, -1.754e-01, -5.204e-02, -3.875e-02)); + r += mul(s0_1, M4(-1.752e-01, 8.544e-03, 2.009e-01, 1.081e-01, -6.113e-02, -1.264e-02, -1.099e-01, 7.721e-02, -8.883e-02, 6.624e-02, 1.543e-01, -1.470e-01, 7.084e-02, 2.041e-02, -1.353e-01, 5.514e-02)); + r += mul(s0_2, M4(-8.100e-02, 7.181e-02, 1.823e-02, 1.137e-01, -7.627e-03, 1.157e-02, 6.381e-03, -2.029e-02, -1.793e-01, 2.163e-01, 1.071e-01, 1.975e-01, 4.782e-03, -1.038e-01, -2.722e-02, -2.863e-02)); + r += mul(s0_3, M4(-1.987e-01, 2.234e-02, 1.629e-01, 1.411e-01, 1.686e-01, -1.169e-01, -1.153e-01, 5.303e-02, -1.401e-01, 7.446e-02, 1.651e-02, 1.049e-01, 6.766e-02, -4.508e-03, -4.739e-02, -1.971e-02)); + r += mul(s0_4, M4(-6.077e-01, -1.132e-01, 5.496e-02, -1.474e-01, -4.083e-02, -2.358e-02, 5.782e-02, -8.903e-03, -2.187e-01, -5.799e-01, -2.327e-01, 3.352e-01, 4.096e-01, 1.543e-01, 2.634e-01, 1.353e-02)); + r += mul(s0_5, M4(-1.090e-01, -1.697e-02, -6.169e-02, 8.472e-02, 3.849e-02, -4.439e-02, -2.872e-02, 2.331e-02, -2.056e-01, 2.056e-01, -6.852e-02, 2.337e-03, -6.904e-02, 9.751e-02, 2.718e-02, 2.761e-02)); + r += mul(s0_6, M4(-4.874e-02, 2.765e-02, -2.766e-02, 9.790e-02, -3.487e-02, 9.293e-02, 6.253e-02, 2.296e-02, -6.212e-02, 1.142e-01, 5.876e-02, 1.080e-01, -5.299e-02, -8.509e-04, -9.618e-02, -6.980e-03)); + r += mul(s0_7, M4(-2.509e-02, -1.062e-01, 4.788e-02, 9.037e-02, 6.434e-03, -4.993e-02, 1.378e-02, -2.191e-02, -2.489e-02, 1.125e-01, -3.071e-02, 1.494e-01, 1.074e-02, -1.213e-02, -6.753e-02, -1.152e-01)); + r += mul(s0_8, M4(-6.282e-02, 7.023e-03, -1.272e-02, 4.021e-02, -4.950e-02, 7.900e-02, -3.829e-03, 5.379e-02, -7.884e-02, 4.758e-02, -2.827e-02, 2.264e-02, 3.407e-02, -1.753e-01, 5.579e-03, 3.211e-02)); + r += mul(s1_0, M4(2.093e-02, -4.623e-02, -3.265e-02, 1.873e-02, 3.220e-02, -1.627e-01, 5.046e-02, -4.882e-02, -6.228e-02, 2.889e-02, 5.429e-03, 2.945e-02, -4.053e-02, -6.110e-02, -4.289e-02, 1.538e-02)); + r += mul(s1_1, M4(1.844e-02, -5.925e-02, -1.384e-01, -1.712e-01, 2.836e-02, -7.524e-02, -1.785e-01, -6.518e-02, -3.521e-02, -1.454e-02, 1.426e-01, -4.671e-02, 4.228e-02, 4.236e-02, -3.918e-02, 3.684e-02)); + r += mul(s1_2, M4(-5.506e-02, -1.322e-02, -8.521e-02, 2.606e-02, 2.439e-02, -3.190e-02, 8.334e-03, -1.499e-03, -5.366e-02, -1.778e-02, 5.984e-02, -5.725e-02, 2.785e-02, -3.899e-02, -4.964e-02, 5.202e-02)); + r += mul(s1_3, M4(-2.135e-02, 1.172e-02, -3.127e-03, 4.214e-02, -1.414e-01, -7.592e-02, -9.769e-01, 3.319e-01, -3.444e-02, 3.007e-02, -3.268e-02, 6.656e-03, 4.946e-02, 7.209e-02, 5.624e-03, 4.819e-02)); + r += mul(s1_4, M4(2.301e-02, -8.416e-03, -1.886e-01, -4.043e-01, 5.243e-02, 8.550e-02, -1.203e-01, -2.122e-01, -8.371e-03, -2.264e-01, -1.174e-01, -1.152e-01, -2.725e-02, 1.957e-01, 5.036e-02, 1.214e-01)); + r += mul(s1_5, M4(9.059e-02, -1.391e-01, -2.427e-01, -1.716e-03, 1.048e-01, -9.487e-02, -8.739e-02, 1.464e-02, -5.532e-02, -8.633e-02, -1.491e-01, 1.422e-01, -7.080e-02, 2.580e-01, -1.783e-02, 1.028e-01)); + r += mul(s1_6, M4(5.407e-02, -4.321e-02, -6.909e-02, -5.464e-04, 2.971e-02, 6.365e-02, -3.780e-02, 3.135e-04, -1.352e-02, 5.407e-02, -2.180e-02, 1.456e-02, -2.334e-02, -6.107e-03, 3.552e-02, 1.831e-02)); + r += mul(s1_7, M4(9.306e-02, -3.273e-01, 6.469e-02, -6.293e-02, 7.617e-02, -5.466e-02, 5.817e-04, -1.038e-01, -8.348e-03, -4.016e-02, 5.163e-02, 5.153e-02, -4.913e-02, -3.528e-02, -1.018e-02, -4.440e-02)); + r += mul(s1_8, M4(-1.901e-02, -1.003e-02, 4.926e-03, -5.469e-02, 4.712e-02, 6.210e-02, 6.828e-03, 8.601e-03, -4.973e-02, 1.034e-01, 8.064e-02, -4.831e-02, -8.915e-03, 1.338e-01, -2.552e-02, 1.284e-01)); + r += mul(s2_0, M4(1.099e-01, -3.907e-02, -5.627e-02, 3.726e-02, -4.089e-02, 3.905e-02, -7.333e-02, -5.201e-02, 1.199e-01, -3.077e-02, 7.080e-02, -6.518e-02, 5.478e-02, 3.929e-02, 3.922e-02, 5.502e-02)); + r += mul(s2_1, M4(-1.650e-01, 1.957e-02, -1.799e-01, 2.149e-01, 8.199e-02, -1.061e-01, -4.542e-02, -1.756e-01, -3.644e-02, -2.350e-02, -1.891e-01, -1.270e-01, 7.510e-02, 6.960e-02, 1.670e-01, -3.395e-01)); + r += mul(s2_2, M4(1.296e-01, -1.354e-02, -1.690e-01, 1.539e-01, 4.985e-02, -5.993e-02, 1.355e-03, 1.321e-02, 5.868e-02, -6.005e-03, 7.050e-03, -4.139e-02, 2.584e-02, -5.562e-02, 1.896e-03, -6.420e-02)); + r += mul(s2_3, M4(-3.750e-03, 9.356e-02, 8.346e-02, -9.586e-02, 5.356e-02, 1.038e-01, 6.120e-02, 7.898e-02, 2.210e-01, -5.833e-02, -2.771e-01, -6.909e-02, 1.841e-01, -2.505e-02, -1.723e-01, 6.775e-02)); + r += mul(s2_4, M4(-1.675e-01, 2.077e-01, 3.639e-01, 1.616e-01, -1.849e-02, -6.565e-02, 2.531e-01, -3.022e-01, -2.568e-01, 1.240e-01, -3.299e-01, 2.133e-01, 2.786e-01, -2.316e-01, -4.497e-02, -2.981e-01)); + r += mul(s2_5, M4(-1.918e-01, 1.659e-01, 1.114e-01, 1.974e-01, 3.208e-02, -2.558e-02, -1.265e-02, -2.035e-02, 2.564e-01, -3.624e-02, -6.179e-02, -1.233e-01, -3.454e-02, -7.588e-02, 2.185e-02, -5.032e-02)); + r += mul(s2_6, M4(1.514e-02, -9.920e-03, 3.117e-02, -5.511e-02, 4.066e-02, 3.938e-02, -5.380e-03, -5.667e-02, -1.978e-02, -4.687e-02, 1.253e-01, -1.195e-02, -7.667e-03, 5.952e-02, 2.288e-02, 3.814e-02)); + r += mul(s2_7, M4(-3.610e-02, -3.112e-02, 3.272e-02, 7.061e-02, 3.913e-02, -1.046e-01, -1.197e-03, 2.646e-02, 9.618e-03, 1.146e-01, 7.210e-02, -1.143e-01, -1.136e-03, 6.210e-02, -1.122e-02, -2.587e-02)); + r += mul(s2_8, M4(-7.697e-02, -9.952e-04, -7.539e-03, -1.513e-02, -9.029e-03, 1.408e-02, 2.055e-06, -1.059e-02, 7.768e-02, 3.124e-02, 3.368e-02, -1.155e-02, -1.546e-02, -2.931e-03, 2.106e-02, -3.257e-02)); + r += mul(s3_0, M4(7.144e-03, -1.322e-02, -1.944e-01, -1.612e-02, -4.237e-02, 1.456e-01, -5.996e-02, -2.145e-01, 4.330e-02, -3.849e-02, 8.443e-02, -4.098e-03, 1.960e-03, 5.152e-03, 9.973e-02, 8.078e-02)); + r += mul(s3_1, M4(1.113e-01, -3.005e-02, 1.199e-01, -4.029e-02, 9.934e-02, -1.540e-01, -3.818e-01, 3.199e-02, -3.314e-02, 3.015e-02, -8.632e-02, 7.195e-02, -8.405e-02, 1.511e-02, -1.364e-01, -4.779e-02)); + r += mul(s3_2, M4(-7.198e-02, -9.730e-03, -7.659e-02, -9.198e-02, -1.291e-02, -2.118e-02, -7.500e-02, 3.164e-03, -3.136e-02, 2.908e-02, 6.306e-02, -3.065e-03, 1.294e-04, -2.250e-02, 6.295e-02, 1.235e-02)); + r += mul(s3_3, M4(-3.799e-03, 3.301e-02, 1.588e-01, 2.691e-02, 1.612e-01, 2.476e-01, -6.205e-02, 2.352e-01, 9.168e-02, 7.156e-03, 2.315e-02, -2.909e-02, 3.882e-02, 3.297e-02, -1.062e-01, 9.778e-02)); + r += mul(s3_4, M4(-1.450e-01, 8.155e-02, 6.351e-02, -7.599e-02, -9.454e-04, -4.971e-01, 1.665e-01, -5.560e-01, -1.282e-01, 1.987e-01, 7.292e-02, 6.917e-02, 2.889e-02, 2.158e-01, 1.941e-01, -1.472e-01)); + r += mul(s3_5, M4(-6.303e-03, 4.578e-02, 5.086e-02, -1.684e-02, -5.308e-02, 2.573e-01, 6.806e-02, 2.070e-02, 1.006e-01, -1.195e-01, 9.802e-03, -1.123e-01, 1.097e-02, 6.926e-03, 7.695e-02, 1.168e-01)); + r += mul(s3_6, M4(3.211e-02, -1.982e-02, -2.188e-02, -4.794e-02, 2.477e-02, 3.063e-02, 7.311e-02, -9.376e-02, 6.516e-02, -1.927e-02, 4.276e-02, 7.122e-04, -4.200e-02, 2.947e-02, 8.275e-02, 3.763e-02)); + r += mul(s3_7, M4(-1.918e-02, -3.916e-03, -6.341e-03, 5.559e-02, 1.027e-01, -7.839e-02, -3.427e-02, 9.477e-03, 1.564e-03, -2.435e-02, -3.752e-02, -4.801e-02, 4.764e-02, -1.354e-01, 1.214e-02, -5.935e-02)); + r += mul(s3_8, M4(2.244e-02, -2.103e-02, 2.209e-02, -3.679e-02, -1.259e-02, 8.911e-02, -2.068e-02, -8.888e-03, 3.137e-02, -4.821e-02, -2.994e-03, -7.204e-03, -6.453e-02, -7.934e-02, 7.787e-03, -5.808e-03)); + r += V4(1.622e-02, 8.633e-03, 2.282e-02, -1.091e-02); + return r; +} + +V4 f1(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-1.176e-01, 4.590e-02, -1.097e-03, 9.562e-03, -9.896e-02, -4.315e-02, 5.445e-03, 5.506e-02, -1.072e-01, 2.441e-02, 1.076e-02, -7.966e-02, -1.692e-01, 3.632e-02, 4.413e-03, -4.337e-02)); + r += mul(s0_1, M4(-1.753e-01, 1.540e-01, 9.123e-02, 1.894e-01, 3.174e-02, 1.360e-01, -9.307e-02, 1.550e-01, -3.076e-01, -7.511e-02, -9.321e-03, 2.660e-01, 1.373e-01, 2.495e-02, 1.941e-01, 2.048e-02)); + r += mul(s0_2, M4(-7.759e-02, 7.841e-02, -7.251e-02, 2.212e-01, -2.399e-02, -1.360e-02, -1.016e-02, 2.063e-03, 9.256e-03, -1.288e-02, 8.587e-02, -2.566e-02, 9.888e-02, 8.241e-02, -4.956e-02, -1.440e-01)); + r += mul(s0_3, M4(-1.812e-01, 4.365e-02, 1.120e-01, -1.079e-01, -7.096e-02, 1.734e-01, 5.045e-02, -6.046e-02, 7.682e-02, 2.865e-02, -4.742e-03, -2.903e-02, 1.958e-01, 1.039e-02, -4.816e-02, -6.483e-03)); + r += mul(s0_4, M4(-2.251e-01, 5.948e-02, 2.301e-01, 3.526e-01, 1.676e-01, 3.284e-01, 7.006e-02, -4.188e-01, -1.429e-01, 4.799e-01, 4.885e-02, 1.954e-01, -1.919e-01, -3.617e-01, -1.317e-01, -1.693e-01)); + r += mul(s0_5, M4(5.904e-02, 1.668e-01, 2.446e-01, -6.086e-03, 2.400e-02, 6.791e-03, -1.382e-02, 4.357e-02, -6.655e-02, -2.124e-01, -1.177e-01, 7.355e-02, -5.483e-03, -3.423e-02, 2.298e-01, -8.469e-02)); + r += mul(s0_6, M4(2.939e-03, 4.728e-02, 1.274e-01, -9.988e-02, -6.243e-03, -8.422e-03, 1.984e-02, -1.120e-02, -3.664e-02, 1.984e-02, 5.726e-02, -1.255e-01, 1.866e-02, 3.333e-02, -4.936e-02, 4.108e-02)); + r += mul(s0_7, M4(-1.240e-02, 1.239e-01, 1.241e-01, 5.387e-02, -1.040e-01, -2.150e-04, -1.027e-02, 1.470e-01, -2.384e-02, -2.690e-02, 2.359e-01, 5.578e-02, 2.181e-02, -2.860e-02, -4.156e-02, 5.233e-03)); + r += mul(s0_8, M4(-1.985e-02, 1.875e-02, 2.490e-02, 4.427e-02, 1.119e-02, -1.343e-02, -1.967e-02, 2.461e-02, 1.923e-02, -1.645e-02, 8.968e-02, 1.569e-02, 6.168e-02, 8.987e-02, -7.952e-02, -2.058e-02)); + r += mul(s1_0, M4(-7.795e-02, -3.943e-02, -9.027e-02, 4.130e-02, -4.783e-02, 3.800e-02, -1.264e-01, 3.568e-02, -4.561e-02, -5.500e-03, -3.950e-03, 2.980e-02, 1.306e-02, 4.398e-02, -1.101e-01, 6.269e-02)); + r += mul(s1_1, M4(7.817e-03, -8.656e-02, -1.610e-01, 1.343e-01, 7.768e-03, 6.015e-02, -2.118e-01, 9.987e-02, -9.086e-02, 3.293e-02, -1.073e-02, 2.126e-02, 9.909e-02, 7.013e-02, -1.638e-02, 1.370e-02)); + r += mul(s1_2, M4(1.524e-02, 1.213e-01, -2.121e-01, -7.601e-03, -1.088e-03, -7.068e-03, -3.429e-02, -1.854e-02, -1.256e-01, -5.000e-02, -4.249e-03, 6.956e-02, 1.810e-01, 1.228e-01, -1.183e-01, -2.285e-02)); + r += mul(s1_3, M4(-3.223e-02, -3.501e-02, 5.832e-02, -1.608e-01, 3.728e-01, 5.507e-01, -3.432e-02, -1.058e-01, -5.823e-02, 5.583e-03, 4.258e-02, -4.061e-02, 5.032e-02, -1.031e-02, 6.090e-02, -6.812e-02)); + r += mul(s1_4, M4(-5.041e-02, -6.582e-01, 1.553e-01, 1.593e-01, 1.460e-01, 2.310e-02, 3.522e-02, -4.788e-01, -1.449e-01, -4.072e-02, 1.242e-01, -1.751e-02, 3.372e-02, -1.114e-01, -5.362e-02, -2.117e-02)); + r += mul(s1_5, M4(1.978e-01, 2.884e-01, 5.209e-02, -1.751e-01, 3.227e-02, 1.168e-02, -9.727e-03, 4.108e-02, 2.009e-02, 7.821e-02, 2.300e-01, 1.131e-01, 7.034e-02, 5.115e-02, -2.973e-01, 1.802e-01)); + r += mul(s1_6, M4(1.958e-02, 2.796e-02, 6.192e-02, -5.750e-02, -6.072e-02, 8.721e-02, 4.716e-02, 4.567e-02, -4.567e-02, -2.416e-02, 2.033e-02, -3.503e-02, 3.544e-03, 2.999e-02, -1.305e-02, 3.346e-02)); + r += mul(s1_7, M4(8.872e-03, 8.004e-02, -7.152e-02, 4.066e-02, -3.603e-02, -9.614e-02, 3.228e-02, 9.803e-03, -6.331e-02, -4.420e-02, 1.642e-01, -1.447e-02, 4.909e-02, 5.909e-02, -8.621e-02, 1.548e-01)); + r += mul(s1_8, M4(-1.711e-02, 5.139e-02, -7.837e-02, -7.919e-03, -1.636e-02, -4.681e-03, 2.828e-03, 2.137e-02, -1.023e-01, -7.483e-03, 7.474e-02, 1.323e-01, 1.304e-01, 2.446e-02, -9.139e-02, -9.162e-02)); + r += mul(s2_0, M4(7.268e-02, 3.978e-02, -1.480e-01, 1.105e-01, 1.312e-01, 1.599e-02, -4.579e-02, 9.830e-02, 5.525e-02, -7.153e-02, 4.305e-02, -3.304e-02, -4.484e-02, -7.667e-05, -1.446e-02, 3.995e-03)); + r += mul(s2_1, M4(1.060e-01, 7.116e-02, -2.697e-01, -2.968e-01, 7.944e-02, -1.363e-03, 7.398e-02, -3.584e-01, -2.039e-02, -3.787e-02, -2.126e-01, 3.468e-02, -3.340e-01, -2.642e-01, -1.053e-01, 4.584e-02)); + r += mul(s2_2, M4(8.515e-02, 7.926e-02, -1.782e-01, 3.409e-01, -4.535e-02, 6.948e-02, 4.167e-03, -8.690e-02, -1.100e-03, -1.622e-02, -2.110e-02, -4.446e-03, -2.315e-02, 1.463e-03, 4.195e-03, -7.673e-02)); + r += mul(s2_3, M4(7.574e-02, -6.551e-02, -7.931e-02, 1.847e-02, -1.222e-01, -2.567e-02, 1.781e-02, 6.826e-02, 1.751e-01, 6.480e-02, 9.014e-02, 5.389e-02, -6.614e-02, 1.289e-01, 3.795e-02, 7.552e-02)); + r += mul(s2_4, M4(1.655e-01, 1.347e-01, -4.840e-02, -4.500e-02, -2.469e-01, -1.613e-02, 9.173e-02, 2.510e-02, 6.241e-01, 9.625e-02, 3.608e-01, -9.156e-02, -3.869e-01, -2.592e-01, 3.916e-01, -2.647e-01)); + r += mul(s2_5, M4(3.298e-02, 2.479e-01, 9.145e-02, 1.734e-01, 1.213e-02, 3.894e-02, -4.250e-02, 1.374e-01, 1.559e-01, -3.204e-02, -1.421e-01, -2.360e-01, -1.211e-01, -1.204e-02, 1.006e-01, 1.015e-01)); + r += mul(s2_6, M4(-3.940e-02, -3.056e-02, 9.430e-03, -2.775e-03, -1.404e-03, -5.216e-02, 1.604e-02, -2.766e-02, 3.187e-02, 9.107e-02, -1.513e-01, 1.491e-01, 2.200e-02, -5.174e-03, -4.308e-02, -1.033e-02)); + r += mul(s2_7, M4(-4.013e-02, 3.924e-02, 3.782e-02, 2.474e-02, 6.905e-02, -1.493e-02, 7.994e-04, -1.260e-01, -3.816e-02, 8.267e-02, -2.321e-01, -4.363e-03, 5.037e-02, -9.344e-02, -3.923e-02, 2.305e-02)); + r += mul(s2_8, M4(-9.598e-02, 6.235e-02, -3.485e-02, 1.507e-01, 2.140e-02, -1.713e-02, -2.150e-02, 5.550e-03, -7.057e-02, -4.752e-02, -8.683e-02, 9.942e-02, 1.652e-02, -2.513e-03, 6.316e-03, -1.445e-02)); + r += mul(s3_0, M4(7.494e-03, 6.167e-02, -2.229e-02, 9.588e-02, 2.098e-01, -2.744e-01, -1.121e-01, -1.093e-01, -3.600e-02, 7.007e-03, 6.640e-02, -6.241e-02, -2.350e-02, -2.487e-02, -8.227e-03, -9.150e-02)); + r += mul(s3_1, M4(3.763e-02, 2.717e-02, 2.647e-01, -3.230e-01, 4.209e-01, 3.723e-01, -1.271e-01, -1.294e-01, -3.973e-02, -2.565e-02, -4.823e-02, 2.920e-01, -3.086e-02, 2.765e-02, -8.713e-02, 1.211e-01)); + r += mul(s3_2, M4(-8.572e-02, -2.810e-03, -4.112e-02, 1.389e-01, 1.504e-03, -1.636e-03, -4.064e-03, 7.007e-02, -6.103e-02, -9.792e-03, 6.503e-02, -2.098e-02, -1.478e-02, -1.370e-02, 5.957e-02, -2.460e-02)); + r += mul(s3_3, M4(-7.273e-02, -7.381e-02, -1.120e-02, 2.998e-02, -1.515e-01, 2.393e-02, 1.901e-01, -2.623e-02, 9.012e-02, 3.699e-02, -5.944e-02, 5.235e-02, -4.027e-02, 1.674e-01, -4.495e-03, 3.007e-02)); + r += mul(s3_4, M4(-1.656e-01, -2.356e-02, -1.028e-01, 1.295e-01, -4.564e-01, -2.254e-01, 2.951e-01, -1.610e-02, 1.831e-01, 2.144e-01, -1.461e-01, -4.598e-02, -2.185e-01, -2.248e-01, 5.653e-01, -4.681e-01)); + r += mul(s3_5, M4(-4.814e-02, 6.573e-02, 2.865e-02, 1.553e-01, -7.495e-02, -4.398e-02, -1.738e-01, 1.548e-01, -4.272e-03, 3.478e-02, -2.813e-02, -9.149e-02, -7.011e-02, -3.629e-03, 6.780e-02, 8.682e-02)); + r += mul(s3_6, M4(-4.552e-03, -7.880e-03, 3.240e-02, -4.527e-02, -4.243e-02, -3.649e-02, -3.803e-02, 6.218e-02, 4.543e-03, 1.675e-02, -1.154e-02, 3.727e-03, -6.186e-02, 3.390e-02, 2.030e-02, 3.279e-02)); + r += mul(s3_7, M4(3.833e-02, -3.550e-04, 4.441e-02, -7.695e-02, 1.958e-01, -5.135e-02, -1.626e-01, -1.099e-01, 7.221e-02, 3.797e-02, -8.113e-02, -1.506e-01, -1.960e-01, 7.023e-02, 4.237e-02, 1.152e-01)); + r += mul(s3_8, M4(-4.346e-02, -3.773e-03, 6.954e-02, 6.227e-03, 7.212e-02, -4.309e-02, -1.550e-02, -9.249e-02, -1.252e-02, -3.851e-03, -1.582e-02, -2.023e-02, -3.647e-02, 6.547e-02, 5.062e-02, 4.362e-02)); + r += V4(-6.201e-03, -2.350e-02, 4.995e-03, 5.325e-03); + return r; +} + +void Pass6(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = Rmp8x8(tid.x) + blockStart; + uint2 size = GetInputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = (gxy + 0.5) * pt; + + V4 s0_0 = l0(-1.0, -1.0); + V4 s0_1 = l0(0.0, -1.0); + V4 s0_2 = l0(1.0, -1.0); + V4 s0_3 = l0(-1.0, 0.0); + V4 s0_4 = l0(0.0, 0.0); + V4 s0_5 = l0(1.0, 0.0); + V4 s0_6 = l0(-1.0, 1.0); + V4 s0_7 = l0(0.0, 1.0); + V4 s0_8 = l0(1.0, 1.0); + V4 s1_0 = -max(-s0_0, 0.0); + V4 s1_1 = -max(-s0_1, 0.0); + V4 s1_2 = -max(-s0_2, 0.0); + V4 s1_3 = -max(-s0_3, 0.0); + V4 s1_4 = -max(-s0_4, 0.0); + V4 s1_5 = -max(-s0_5, 0.0); + V4 s1_6 = -max(-s0_6, 0.0); + V4 s1_7 = -max(-s0_7, 0.0); + V4 s1_8 = -max(-s0_8, 0.0); + s0_0 = max(s0_0, 0.0); + s0_1 = max(s0_1, 0.0); + s0_2 = max(s0_2, 0.0); + s0_3 = max(s0_3, 0.0); + s0_4 = max(s0_4, 0.0); + s0_5 = max(s0_5, 0.0); + s0_6 = max(s0_6, 0.0); + s0_7 = max(s0_7, 0.0); + s0_8 = max(s0_8, 0.0); + + V4 s2_0 = l1(-1.0, -1.0); + V4 s2_1 = l1(0.0, -1.0); + V4 s2_2 = l1(1.0, -1.0); + V4 s2_3 = l1(-1.0, 0.0); + V4 s2_4 = l1(0.0, 0.0); + V4 s2_5 = l1(1.0, 0.0); + V4 s2_6 = l1(-1.0, 1.0); + V4 s2_7 = l1(0.0, 1.0); + V4 s2_8 = l1(1.0, 1.0); + V4 s3_0 = -max(-s2_0, 0.0); + V4 s3_1 = -max(-s2_1, 0.0); + V4 s3_2 = -max(-s2_2, 0.0); + V4 s3_3 = -max(-s2_3, 0.0); + V4 s3_4 = -max(-s2_4, 0.0); + V4 s3_5 = -max(-s2_5, 0.0); + V4 s3_6 = -max(-s2_6, 0.0); + V4 s3_7 = -max(-s2_7, 0.0); + V4 s3_8 = -max(-s2_8, 0.0); + s2_0 = max(s2_0, 0.0); + s2_1 = max(s2_1, 0.0); + s2_2 = max(s2_2, 0.0); + s2_3 = max(s2_3, 0.0); + s2_4 = max(s2_4, 0.0); + s2_5 = max(s2_5, 0.0); + s2_6 = max(s2_6, 0.0); + s2_7 = max(s2_7, 0.0); + s2_8 = max(s2_8, 0.0); + + t2[gxy] = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8); + t3[gxy] = f1(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8); +} + +//!PASS 7 +//!DESC conv6 +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 +//!IN t2, t3 +//!OUT t0, t1 + +#define l0(x, y) V4(O(t2, float2(x, y))) +#define l1(x, y) V4(O(t3, float2(x, y))) + +V4 f0(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-1.952e-02, -2.301e-02, -3.736e-04, -1.581e-02, 7.341e-02, -3.569e-02, 5.963e-03, 1.284e-01, 6.945e-03, 1.208e-02, -2.852e-02, 1.210e-02, -5.234e-02, 3.450e-02, 1.034e-02, 9.300e-04)); + r += mul(s0_1, M4(-1.048e-01, 4.626e-02, 1.610e-02, -1.378e-02, -1.910e-01, 2.419e-02, 7.012e-01, -2.998e-01, -8.037e-02, -4.437e-02, -3.772e-02, -1.620e-02, -3.646e-01, -2.323e-02, 1.019e-02, 3.517e-02)); + r += mul(s0_2, M4(-9.399e-02, -3.329e-02, 1.219e-02, -8.421e-03, -3.055e-02, 3.756e-02, 3.237e-02, 1.406e-01, -1.392e-02, -1.962e-02, 1.136e-01, 2.379e-02, -6.186e-03, -4.576e-02, -4.557e-02, -1.548e-01)); + r += mul(s0_3, M4(1.638e-02, 8.104e-02, -3.369e-02, 2.663e-02, 4.984e-02, 2.547e-01, -3.319e-02, 1.098e-01, -8.594e-03, 4.489e-03, 9.319e-03, -1.642e-02, 3.309e-02, -2.018e-02, -4.158e-03, -2.341e-02)); + r += mul(s0_4, M4(4.271e-02, -2.245e-01, 5.310e-02, -1.032e-01, 2.033e-02, -5.645e-01, -1.033e-01, -1.308e-01, 1.039e-01, -5.559e-02, 2.827e-02, -1.009e-01, 3.317e-01, -1.548e-01, -6.898e-02, -2.608e-01)); + r += mul(s0_5, M4(5.093e-02, 1.337e-01, 2.877e-02, 1.042e-01, -1.935e-02, 5.340e-02, 3.398e-02, -1.656e-02, 1.024e-02, 2.018e-01, -5.609e-02, 2.052e-01, -1.878e-02, -1.618e-01, 3.110e-02, -1.025e-01)); + r += mul(s0_6, M4(-1.982e-03, -4.609e-02, 2.637e-02, -9.266e-03, 2.498e-04, 2.218e-02, -1.013e-02, 2.184e-02, 5.965e-03, 1.045e-02, 1.644e-03, 2.716e-02, 3.749e-03, -3.710e-02, -1.464e-02, -1.227e-02)); + r += mul(s0_7, M4(-1.146e-02, -3.264e-03, -1.180e-02, -2.658e-02, -2.606e-02, -3.221e-02, -1.237e-02, -2.961e-02, 9.372e-03, -4.673e-02, -5.785e-04, -4.285e-02, 1.433e-03, -7.620e-02, -2.407e-03, 2.959e-02)); + r += mul(s0_8, M4(-3.948e-04, 6.024e-02, 9.655e-04, 2.124e-02, -1.357e-02, -2.965e-02, -1.354e-03, -6.947e-03, 3.782e-02, 4.020e-02, -2.875e-02, 3.749e-02, -5.428e-03, -3.603e-02, -3.256e-02, -2.771e-02)); + r += mul(s1_0, M4(3.111e-03, -4.528e-02, 2.406e-02, -3.269e-02, 2.000e-02, -5.895e-02, 3.012e-02, -2.212e-02, 1.071e-01, 1.928e-02, -3.492e-02, 1.053e-01, -6.362e-02, 4.470e-02, 2.578e-02, -1.040e-02)); + r += mul(s1_1, M4(1.134e-01, 6.078e-02, -4.550e-03, -7.141e-03, -1.449e-01, 7.662e-02, 1.104e-01, -3.543e-02, 4.676e-01, 1.248e-02, -3.675e-01, -1.655e-01, 7.049e-02, 2.875e-02, -3.009e-02, 9.027e-02)); + r += mul(s1_2, M4(-5.208e-02, -3.105e-02, -3.721e-02, 1.006e-01, -3.864e-02, 2.810e-02, 1.604e-02, 8.082e-02, 8.273e-02, 7.069e-02, -2.601e-02, 8.756e-02, -2.213e-02, -3.431e-02, -3.394e-02, -4.138e-02)); + r += mul(s1_3, M4(6.901e-02, -1.813e-02, -6.033e-02, -5.048e-02, 1.642e-02, 6.266e-02, -4.282e-02, 2.908e-02, -5.339e-02, 2.241e-02, -7.009e-02, -2.048e-02, 5.016e-02, 1.243e-02, -2.653e-02, 8.097e-02)); + r += mul(s1_4, M4(-8.214e-03, -6.216e-02, 3.436e-02, 3.719e-02, 1.412e-01, -1.256e-01, -9.253e-02, 1.326e-01, 8.852e-01, -4.551e-02, -7.485e-01, -1.673e-01, -9.588e-03, -1.411e-01, -4.338e-02, -4.232e-01)); + r += mul(s1_5, M4(7.913e-02, 5.560e-01, 9.992e-02, 5.410e-01, -1.700e-03, -1.288e-02, -3.230e-02, -8.186e-02, 1.255e-01, 4.736e-02, -5.084e-01, 7.951e-02, 1.181e-01, -8.278e-02, 3.674e-02, -1.468e-01)); + r += mul(s1_6, M4(-6.616e-03, -4.503e-02, 2.533e-02, -1.964e-02, -8.381e-03, -6.342e-03, 6.659e-03, -1.064e-02, 4.090e-02, 7.180e-02, 5.233e-02, 5.864e-03, -1.308e-03, 5.536e-03, -2.743e-03, -1.219e-02)); + r += mul(s1_7, M4(2.071e-02, 7.370e-02, 2.681e-04, 9.920e-03, -2.067e-02, 1.362e-01, 1.855e-02, 5.200e-04, 3.511e-01, -2.001e-01, -1.940e-01, 9.383e-02, -3.934e-02, -1.915e-01, 2.669e-02, 1.094e-02)); + r += mul(s1_8, M4(-2.372e-02, 1.062e-01, -1.496e-02, 1.175e-02, -1.135e-02, 6.667e-03, 3.389e-03, 1.929e-02, -1.125e-02, 1.674e-01, -3.336e-02, -6.202e-02, 6.653e-03, 1.235e-02, -1.633e-02, 5.038e-02)); + r += mul(s2_0, M4(-3.964e-02, -3.119e-03, -9.673e-03, -6.366e-03, 8.531e-02, -3.670e-02, -5.924e-03, 1.261e-02, -6.665e-02, -1.278e-02, -1.696e-02, -2.727e-02, -3.882e-02, 1.510e-03, 2.840e-02, -1.340e-02)); + r += mul(s2_1, M4(-1.639e-01, -1.744e-02, -5.910e-03, -1.800e-02, 4.918e-02, 2.777e-02, 4.527e-02, -1.255e-01, -1.224e-01, -4.651e-02, 3.581e-02, -2.700e-03, -6.049e-02, 2.921e-02, 4.759e-02, -3.412e-03)); + r += mul(s2_2, M4(-1.017e-01, 3.087e-02, 4.443e-01, 7.643e-02, -5.113e-02, 3.162e-02, -2.544e-02, 1.116e-01, 2.750e-03, 6.519e-02, -1.121e-02, 5.005e-02, -6.372e-02, -2.334e-02, 6.144e-02, 6.538e-02)); + r += mul(s2_3, M4(2.036e-01, -2.519e-02, -1.132e-02, -6.775e-02, -1.205e-02, 2.868e-02, -1.777e-02, -1.051e-02, 7.531e-02, -8.572e-02, 5.924e-02, -8.820e-02, 1.963e-01, -4.408e-02, -4.202e-02, -4.132e-02)); + r += mul(s2_4, M4(-4.319e-01, 2.154e-02, 4.534e-01, 1.691e-02, -5.194e-02, 8.830e-03, 4.441e-02, 2.165e-01, -4.723e-02, 2.877e-01, 2.503e-02, 2.071e-01, 2.739e-01, 1.595e-01, -1.141e-01, 4.121e-01)); + r += mul(s2_5, M4(3.627e-01, 8.034e-02, 2.531e-01, 1.357e-01, -5.579e-03, -5.171e-02, 4.784e-02, -1.580e-01, -1.597e-03, -2.143e-02, 1.145e-02, -2.409e-02, 1.135e-01, 1.942e-02, -2.637e-02, -1.371e-01)); + r += mul(s2_6, M4(5.398e-02, 8.680e-03, 1.624e-02, -2.777e-02, -1.992e-02, 9.359e-03, 2.106e-02, 1.651e-02, -3.371e-02, -3.989e-02, 2.268e-02, -1.706e-02, 7.451e-03, -3.325e-02, -2.215e-02, -1.584e-02)); + r += mul(s2_7, M4(1.898e-02, -7.606e-02, -8.297e-02, 5.946e-03, -2.822e-02, 1.434e-02, 6.815e-03, -7.690e-02, -2.483e-02, 1.220e-02, 2.584e-02, -1.723e-02, -1.801e-02, 2.864e-01, 2.826e-02, -1.121e-02)); + r += mul(s2_8, M4(5.351e-02, 1.077e-01, -6.458e-02, 6.860e-02, -1.110e-02, 3.929e-02, 1.543e-02, 6.122e-02, -8.551e-03, 4.159e-02, 2.833e-03, 3.752e-02, 2.189e-02, 2.252e-04, -1.454e-02, 8.179e-02)); + r += mul(s3_0, M4(-1.542e-02, -7.969e-03, -1.764e-02, 1.333e-02, 1.272e-01, -2.018e-02, -1.554e-02, 1.398e-02, -6.583e-02, 4.630e-02, -5.456e-02, -5.594e-02, -1.606e-01, -2.573e-02, 4.592e-02, -4.465e-02)); + r += mul(s3_1, M4(-4.177e-02, -3.885e-02, -5.615e-02, -3.797e-02, -5.923e-02, -2.316e-02, 1.191e-02, -1.548e-01, -6.239e-01, -8.157e-02, 1.527e-01, 8.326e-02, -2.888e-01, -6.520e-02, 3.209e-02, 1.560e-02)); + r += mul(s3_2, M4(-2.764e-03, 2.741e-02, 5.627e-02, 1.597e-02, 1.443e-02, 4.968e-02, 1.132e-02, 9.153e-02, -5.382e-03, -1.644e-02, 5.247e-03, 3.311e-02, -4.528e-02, 2.605e-02, 4.794e-02, 7.640e-02)); + r += mul(s3_3, M4(2.045e-02, -1.614e-03, 2.289e-03, -4.305e-02, -1.017e-01, 5.861e-02, -1.314e-02, 2.477e-02, -1.999e-01, -1.155e-01, 1.294e-01, -2.392e-02, 1.875e-01, 2.845e-02, -3.870e-02, 5.380e-02)); + r += mul(s3_4, M4(5.933e-02, -1.103e-02, 7.176e-02, -3.689e-02, 5.613e-02, -3.270e-01, 3.240e-02, -2.858e-01, -1.259e+00, 2.597e-01, 3.525e-01, 1.430e-02, 1.284e-01, 8.753e-02, 7.569e-02, -5.311e-02)); + r += mul(s3_5, M4(2.279e-02, 1.895e-01, -6.586e-02, 1.515e-01, -2.923e-02, -1.046e-01, 7.716e-03, -1.229e-01, 2.289e-02, -7.755e-02, 1.265e-01, 8.574e-02, 1.189e-02, 6.164e-02, -7.733e-03, 5.218e-03)); + r += mul(s3_6, M4(-8.498e-03, -3.724e-02, 2.832e-02, -7.279e-03, -3.663e-02, 2.402e-02, 2.821e-02, 1.569e-02, 2.319e-02, 2.036e-02, 2.252e-02, -1.611e-02, 9.843e-03, -3.099e-02, 3.160e-03, -5.084e-02)); + r += mul(s3_7, M4(-2.465e-02, 1.290e-02, 2.281e-02, -5.200e-04, -6.553e-02, -1.768e-01, 9.698e-03, -6.422e-02, -1.386e-02, -1.391e-01, -5.888e-02, 5.580e-03, 2.841e-02, 2.990e-02, -5.399e-02, 5.650e-03)); + r += mul(s3_8, M4(-4.902e-03, 9.385e-03, -8.622e-03, 1.815e-02, -8.117e-03, 4.919e-02, 1.259e-02, 4.528e-02, 2.606e-02, 4.409e-02, -1.766e-02, 1.950e-02, -1.739e-02, 7.717e-03, -1.473e-02, -1.569e-02)); + r += V4(-3.105e-03, 3.230e-03, 4.884e-04, 1.938e-03); + return r; +} + +V4 f1(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-9.510e-02, 5.523e-03, -5.580e-02, -3.107e-02, 2.588e-02, -3.076e-02, 4.525e-02, 2.069e-02, 1.302e-01, 1.260e-02, 3.877e-02, -1.878e-02, -1.553e-01, -3.705e-02, 2.666e-02, -1.631e-02)); + r += mul(s0_1, M4(1.518e-01, 5.025e-04, 1.008e-01, 2.029e-02, -1.343e-01, 1.633e-01, 3.819e-01, 6.217e-03, -7.098e-02, 2.839e-02, 1.971e-02, -4.067e-02, -7.846e-02, -2.545e-01, 1.126e-01, 1.475e-02)); + r += mul(s0_2, M4(-6.206e-02, -4.029e-02, 2.049e-02, -1.331e-02, 4.682e-02, 3.132e-03, 1.294e-01, -3.039e-02, 5.065e-02, -2.711e-03, 7.522e-02, 1.499e-01, 1.383e-03, -2.086e-02, -5.117e-02, -8.129e-02)); + r += mul(s0_3, M4(-7.973e-02, 2.775e-02, -1.490e-02, -7.830e-02, 8.944e-02, -7.283e-02, 1.841e-01, -4.484e-02, -3.632e-02, 1.255e-02, 3.882e-02, -2.862e-02, -2.390e-01, -2.774e-02, 6.677e-02, 1.939e-02)); + r += mul(s0_4, M4(2.243e-01, 8.911e-02, -1.718e-01, 1.485e-01, 9.759e-02, 2.321e-01, -4.390e-01, 2.092e-01, 4.278e-02, 1.205e-01, -1.966e-01, 2.130e-02, -2.223e-01, 3.818e-01, -5.426e-01, -3.762e-01)); + r += mul(s0_5, M4(-2.560e-02, -7.789e-02, -1.339e-01, 4.073e-02, -4.376e-03, -1.462e-01, -2.860e-02, 1.660e-01, -3.137e-02, 2.393e-01, 2.252e-02, 5.165e-02, 6.906e-02, -1.712e-02, 3.349e-02, -3.350e-01)); + r += mul(s0_6, M4(3.665e-03, 8.648e-02, -5.364e-02, 3.068e-02, -2.822e-02, -7.398e-02, 5.950e-03, 6.154e-03, 1.010e-02, 1.587e-02, -7.437e-03, 1.494e-02, 6.585e-02, 4.852e-02, 1.699e-02, -2.453e-02)); + r += mul(s0_7, M4(-6.942e-02, -1.231e-01, 1.254e-01, -7.903e-03, 1.278e-02, -4.337e-02, 1.014e-01, -3.921e-02, 3.086e-02, 8.863e-02, 3.278e-03, -1.790e-02, -4.250e-02, -6.413e-02, 6.324e-02, 9.679e-02)); + r += mul(s0_8, M4(-4.634e-02, 3.222e-03, 3.770e-02, -6.919e-02, 6.432e-03, 3.093e-02, -1.804e-02, -3.677e-02, 1.142e-03, 5.227e-02, -1.075e-01, 1.375e-01, 1.826e-02, 1.763e-02, 4.677e-02, -2.110e-02)); + r += mul(s1_0, M4(-1.817e-02, 1.265e-02, -2.043e-02, 1.326e-02, -1.695e-01, 1.255e-01, -8.576e-02, 7.959e-03, 7.193e-02, 7.724e-02, -4.627e-02, -2.431e-02, -1.319e-01, -5.651e-02, 5.140e-02, 1.678e-02)); + r += mul(s1_1, M4(3.337e-02, 4.582e-02, -2.165e-02, 9.076e-03, -4.945e-02, -8.773e-03, 9.112e-02, 1.320e-01, 3.413e-02, 3.273e-01, -2.814e-01, 1.595e-02, 1.343e-01, -6.513e-02, 4.512e-02, -8.970e-02)); + r += mul(s1_2, M4(3.505e-02, 2.270e-02, 7.114e-02, 1.198e-01, 3.787e-02, 1.018e-02, 6.472e-02, -2.210e-02, 2.939e-02, 8.307e-02, 2.993e-03, 1.123e-01, -9.273e-02, 2.409e-02, -4.903e-02, -4.636e-02)); + r += mul(s1_3, M4(-4.843e-02, -6.013e-02, 2.715e-02, -9.149e-03, 1.452e-01, 3.518e-02, 7.180e-02, 3.286e-03, -2.588e-01, -1.638e-01, 1.521e-01, -1.203e-02, -2.689e-01, 4.285e-02, -1.837e-01, -5.794e-03)); + r += mul(s1_4, M4(2.749e-01, -3.031e-01, 1.152e-01, -7.245e-02, 9.716e-02, 8.837e-02, -3.117e-01, 5.664e-02, -1.557e-01, 3.682e-01, 1.259e-01, 3.908e-02, -8.916e-02, 2.177e-01, 1.254e-01, -2.862e-01)); + r += mul(s1_5, M4(3.740e-02, 1.899e-01, -9.864e-02, 6.740e-01, -8.316e-03, 1.469e-02, -4.439e-02, 2.380e-02, 1.310e-02, 2.651e-01, -3.290e-02, -4.670e-02, -3.505e-02, -1.649e-01, -2.098e-01, 1.243e-01)); + r += mul(s1_6, M4(-3.589e-02, 2.351e-02, -2.010e-02, 1.626e-02, -4.976e-02, -8.924e-02, -1.295e-03, 2.366e-02, -1.079e-02, 9.095e-02, -5.359e-02, -2.689e-02, 1.871e-02, -4.332e-03, -3.191e-02, -2.244e-02)); + r += mul(s1_7, M4(-4.806e-02, 1.472e-02, 6.391e-02, -5.629e-03, 3.986e-02, -8.815e-02, 1.416e-01, -6.209e-02, -2.343e-03, 3.541e-01, -7.232e-02, 1.099e-01, 2.329e-03, 7.972e-02, -7.797e-02, 1.009e-02)); + r += mul(s1_8, M4(-1.305e-02, -6.657e-02, 4.004e-02, 3.393e-03, 1.116e-02, 4.225e-03, -1.438e-02, -1.464e-02, 6.804e-02, -1.095e-02, -1.145e-01, 2.725e-01, -2.005e-02, 6.875e-02, 7.349e-02, 1.354e-02)); + r += mul(s2_0, M4(5.085e-02, 3.046e-02, -8.986e-03, -1.066e-02, -6.250e-02, 6.891e-02, -9.668e-02, 1.813e-02, 1.333e-01, -6.920e-02, 4.096e-02, -2.500e-02, -1.387e-01, -3.212e-02, -7.621e-03, 5.839e-03)); + r += mul(s2_1, M4(-6.667e-02, 1.181e-02, 7.953e-02, 7.288e-02, 2.128e-02, 2.170e-01, -3.280e-02, 5.377e-02, 6.852e-03, -7.527e-03, 9.964e-02, 7.642e-02, 3.760e-02, -4.753e-02, 7.111e-02, -1.569e-02)); + r += mul(s2_2, M4(2.790e-02, 3.059e-02, 2.660e-01, 1.046e-01, 2.424e-02, -2.548e-02, 3.858e-02, 2.470e-02, -1.736e-03, 1.112e-03, 6.293e-03, -3.455e-02, 5.024e-03, -3.655e-02, 7.447e-02, 3.024e-02)); + r += mul(s2_3, M4(-8.148e-02, 1.468e-01, -2.009e-02, 6.602e-02, 1.842e-02, -2.225e-01, 2.157e-01, -1.562e-02, -1.049e-01, 9.012e-02, -3.863e-02, 7.084e-02, -7.823e-02, 8.032e-03, 4.661e-02, 1.247e-01)); + r += mul(s2_4, M4(2.322e-01, 6.905e-02, -6.217e-01, -2.876e-01, 2.005e-01, -8.268e-01, 1.071e-02, -1.958e-01, 1.116e-01, 1.250e-01, -5.871e-02, -1.294e-01, 3.019e-01, 3.933e-01, 3.487e-01, -2.436e-01)); + r += mul(s2_5, M4(-9.753e-02, 6.593e-02, -2.563e-01, 2.381e-01, 4.691e-02, 1.796e-01, 1.375e-03, -3.460e-02, -3.481e-02, -2.220e-02, 3.476e-03, 9.687e-02, -4.415e-02, 1.811e-01, -1.381e-01, -6.685e-02)); + r += mul(s2_6, M4(-1.212e-03, 4.823e-02, -1.680e-03, 1.062e-02, -3.830e-02, -5.797e-02, 1.147e-02, 2.973e-02, 1.650e-02, -2.618e-02, 5.139e-02, 1.433e-02, -1.063e-01, -2.012e-01, 1.667e-01, 3.318e-02)); + r += mul(s2_7, M4(-2.061e-02, 5.721e-02, 4.963e-02, 3.164e-02, 1.512e-02, -4.045e-02, 1.890e-01, -3.224e-02, -2.952e-02, -1.150e-01, 3.362e-02, -3.598e-03, 2.868e-02, -2.058e-01, 2.494e-01, -1.499e-01)); + r += mul(s2_8, M4(-3.157e-02, -1.385e-01, 1.396e-02, 6.336e-02, -2.137e-02, -9.049e-02, 1.104e-02, -3.260e-03, 2.508e-03, -4.677e-02, -1.825e-02, -3.115e-03, -3.979e-02, -1.426e-01, 2.571e-02, 1.175e-01)); + r += mul(s3_0, M4(1.485e-01, -6.051e-03, 3.529e-02, -2.369e-02, -2.982e-01, 1.121e-01, -1.680e-01, -2.738e-02, 1.186e-01, -8.329e-02, 5.089e-02, -2.131e-02, 1.111e-01, -4.026e-02, 9.861e-02, -2.885e-02)); + r += mul(s3_1, M4(-1.694e-01, 2.375e-02, -3.937e-02, -3.478e-02, 2.193e-02, 7.665e-02, -5.437e-02, 4.724e-02, -6.213e-02, -4.031e-01, 1.861e-01, 9.586e-03, -4.383e-02, -1.106e-01, 1.108e-01, 4.909e-02)); + r += mul(s3_2, M4(6.812e-02, -2.311e-02, 5.210e-02, 9.546e-02, 2.433e-02, 3.416e-02, 2.978e-02, 2.772e-02, -5.155e-03, -2.713e-02, 2.212e-02, -6.056e-03, 5.356e-02, -5.571e-02, 7.526e-02, 6.467e-02)); + r += mul(s3_3, M4(-1.633e-01, -2.742e-02, -7.204e-03, -8.113e-03, -2.917e-01, -1.351e-01, 5.153e-02, -8.188e-02, -1.977e-01, -1.460e-01, -1.173e-01, -1.349e-02, 7.836e-02, 1.091e-01, -5.539e-02, 9.694e-02)); + r += mul(s3_4, M4(2.165e-01, 1.383e-01, -1.362e-01, 8.388e-02, 9.544e-02, -4.350e-01, -3.249e-01, 1.559e-01, 1.919e-01, -4.631e-01, -4.345e-01, -3.247e-01, 7.224e-02, 2.959e-01, -2.107e-01, -2.463e-01)); + r += mul(s3_5, M4(-4.089e-02, 2.202e-01, 6.955e-02, -1.248e-01, 1.140e-02, -7.158e-03, -3.404e-02, 1.370e-01, -4.043e-03, -7.008e-02, 7.084e-02, 8.809e-02, 1.570e-02, 6.716e-02, -9.100e-04, -1.166e-02)); + r += mul(s3_6, M4(2.194e-02, 6.765e-02, -9.062e-03, 1.480e-02, 1.792e-02, 4.489e-02, -1.333e-02, 3.524e-02, 3.035e-02, 1.197e-01, -5.057e-02, -2.569e-03, -5.396e-02, -3.068e-02, 3.150e-02, -3.015e-02)); + r += mul(s3_7, M4(-7.630e-02, -1.487e-01, 1.509e-01, -2.381e-02, 2.594e-02, -2.307e-02, 1.260e-01, -3.836e-02, -2.424e-02, 3.167e-02, 3.592e-03, 8.270e-02, -5.491e-02, -1.358e-01, 9.294e-02, 2.589e-02)); + r += mul(s3_8, M4(-4.926e-04, -1.151e-01, -4.633e-02, 5.883e-02, -5.406e-03, 1.852e-02, -2.089e-02, -5.929e-02, -1.291e-02, -2.909e-02, -1.351e-02, -1.849e-02, -1.130e-02, -7.846e-02, -9.407e-03, -1.708e-02)); + r += V4(4.076e-03, -1.858e-02, 9.260e-03, 6.390e-04); + return r; +} + +void Pass7(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = Rmp8x8(tid.x) + blockStart; + uint2 size = GetInputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = (gxy + 0.5) * pt; + + V4 s0_0 = l0(-1.0, -1.0); + V4 s0_1 = l0(0.0, -1.0); + V4 s0_2 = l0(1.0, -1.0); + V4 s0_3 = l0(-1.0, 0.0); + V4 s0_4 = l0(0.0, 0.0); + V4 s0_5 = l0(1.0, 0.0); + V4 s0_6 = l0(-1.0, 1.0); + V4 s0_7 = l0(0.0, 1.0); + V4 s0_8 = l0(1.0, 1.0); + V4 s1_0 = -max(-s0_0, 0.0); + V4 s1_1 = -max(-s0_1, 0.0); + V4 s1_2 = -max(-s0_2, 0.0); + V4 s1_3 = -max(-s0_3, 0.0); + V4 s1_4 = -max(-s0_4, 0.0); + V4 s1_5 = -max(-s0_5, 0.0); + V4 s1_6 = -max(-s0_6, 0.0); + V4 s1_7 = -max(-s0_7, 0.0); + V4 s1_8 = -max(-s0_8, 0.0); + s0_0 = max(s0_0, 0.0); + s0_1 = max(s0_1, 0.0); + s0_2 = max(s0_2, 0.0); + s0_3 = max(s0_3, 0.0); + s0_4 = max(s0_4, 0.0); + s0_5 = max(s0_5, 0.0); + s0_6 = max(s0_6, 0.0); + s0_7 = max(s0_7, 0.0); + s0_8 = max(s0_8, 0.0); + + V4 s2_0 = l1(-1.0, -1.0); + V4 s2_1 = l1(0.0, -1.0); + V4 s2_2 = l1(1.0, -1.0); + V4 s2_3 = l1(-1.0, 0.0); + V4 s2_4 = l1(0.0, 0.0); + V4 s2_5 = l1(1.0, 0.0); + V4 s2_6 = l1(-1.0, 1.0); + V4 s2_7 = l1(0.0, 1.0); + V4 s2_8 = l1(1.0, 1.0); + V4 s3_0 = -max(-s2_0, 0.0); + V4 s3_1 = -max(-s2_1, 0.0); + V4 s3_2 = -max(-s2_2, 0.0); + V4 s3_3 = -max(-s2_3, 0.0); + V4 s3_4 = -max(-s2_4, 0.0); + V4 s3_5 = -max(-s2_5, 0.0); + V4 s3_6 = -max(-s2_6, 0.0); + V4 s3_7 = -max(-s2_7, 0.0); + V4 s3_8 = -max(-s2_8, 0.0); + s2_0 = max(s2_0, 0.0); + s2_1 = max(s2_1, 0.0); + s2_2 = max(s2_2, 0.0); + s2_3 = max(s2_3, 0.0); + s2_4 = max(s2_4, 0.0); + s2_5 = max(s2_5, 0.0); + s2_6 = max(s2_6, 0.0); + s2_7 = max(s2_7, 0.0); + s2_8 = max(s2_8, 0.0); + + t0[gxy] = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8); + t1[gxy] = f1(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8); +} + +//!PASS 8 +//!DESC out-shuffle +//!BLOCK_SIZE 16 +//!NUM_THREADS 64 +//!IN INPUT, t0, t1 +//!OUT OUTPUT + +#define l0(x, y) V4(O(t0, float2(x, y))) +#define l1(x, y) V4(O(t1, float2(x, y))) + +V4 f0(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8) { + V4 r = 0.0; + r += mul(s0_0, M4(1.911e-02, 7.153e-03, -2.976e-04, -7.179e-03, -1.377e-02, -6.451e-03, 2.290e-02, -1.537e-02, 2.230e-02, 1.335e-02, -2.970e-03, -1.058e-02, 2.051e-02, 6.362e-03, -2.487e-02, -6.941e-04)); + r += mul(s0_1, M4(-2.149e-02, 8.997e-03, 5.809e-02, 4.138e-02, -3.275e-02, -2.813e-02, 1.701e-02, -8.705e-03, 2.320e-02, 9.248e-03, -3.233e-02, -6.138e-03, 4.763e-02, 2.689e-02, -5.537e-02, -2.760e-02)); + r += mul(s0_2, M4(-1.414e-02, -3.483e-02, -7.279e-03, 1.521e-02, -8.604e-03, -5.970e-02, -3.428e-02, -1.553e-02, 3.362e-03, 3.209e-02, 2.829e-03, -1.605e-02, 1.413e-02, 6.860e-02, 3.001e-02, -1.223e-03)); + r += mul(s0_3, M4(-6.645e-02, -8.320e-03, 4.523e-02, 5.457e-02, 1.400e-02, 3.198e-02, 1.427e-02, 1.483e-02, -1.421e-01, -2.657e-02, 4.797e-02, 7.217e-02, -3.955e-02, -3.721e-02, 2.393e-02, 2.795e-02)); + r += mul(s0_4, M4(-1.653e-02, -1.199e-01, -4.775e-01, -3.048e-01, 5.775e-02, -2.554e-02, 1.568e-01, 3.992e-02, -1.368e-01, -2.363e-01, -5.499e-02, -1.315e-01, -2.829e-02, 1.148e-02, -4.298e-02, -2.297e-02)); + r += mul(s0_5, M4(2.388e-02, 9.640e-02, -6.766e-04, -1.894e-01, -1.938e-02, -1.417e-02, -6.162e-03, 1.409e-02, 1.217e-02, -8.992e-03, 2.264e-02, 8.724e-02, 7.060e-03, 1.580e-02, 1.648e-02, 4.897e-02)); + r += mul(s0_6, M4(7.503e-03, -2.970e-03, -5.068e-03, -1.602e-02, 1.288e-02, 9.609e-03, -1.090e-02, 1.443e-03, -1.047e-02, 1.581e-02, -7.625e-03, -7.056e-02, -2.884e-02, -3.020e-02, -2.549e-02, -4.848e-02)); + r += mul(s0_7, M4(2.075e-02, 1.442e-02, 4.774e-02, 2.273e-02, 1.258e-02, 1.637e-02, -7.148e-02, -5.842e-02, 1.055e-02, -3.364e-02, 1.822e-01, 2.194e-01, -2.953e-02, -2.531e-02, 4.235e-02, 4.981e-02)); + r += mul(s0_8, M4(-6.428e-03, 9.970e-03, 1.333e-02, 5.654e-02, -9.648e-03, 2.059e-04, -1.464e-02, -3.448e-02, 3.807e-03, 1.338e-02, -2.262e-02, -1.434e-02, 6.271e-03, -9.572e-03, 6.071e-03, 1.341e-02)); + r += mul(s1_0, M4(1.419e-02, 5.825e-03, 3.581e-03, -2.137e-03, 2.863e-03, 7.173e-03, 4.501e-02, -2.820e-02, 3.248e-02, -7.079e-03, 1.837e-02, 2.565e-02, 1.775e-02, 1.246e-02, -3.047e-02, 1.125e-02)); + r += mul(s1_1, M4(-4.685e-02, 1.148e-03, 7.450e-02, 5.961e-02, -7.743e-02, -1.134e-02, -2.803e-02, -8.041e-03, 1.388e-01, 1.785e-01, -2.667e-02, -3.292e-02, 2.367e-02, 1.317e-02, -5.723e-02, 6.215e-03)); + r += mul(s1_2, M4(-9.482e-03, -5.237e-02, -5.906e-04, 2.193e-02, 2.896e-03, -6.707e-02, -9.075e-03, -1.458e-02, -4.769e-05, 2.592e-02, 1.115e-02, -9.638e-03, 2.494e-02, 7.106e-02, 2.839e-02, 5.956e-03)); + r += mul(s1_3, M4(-6.437e-02, -4.261e-03, 6.120e-02, 6.179e-02, 3.619e-02, 6.905e-02, -7.007e-02, -9.677e-02, 1.439e-02, -5.513e-02, -1.084e-01, 9.009e-02, -2.376e-01, -7.979e-02, -7.095e-03, 8.423e-02)); + r += mul(s1_4, M4(-3.465e-02, -1.174e-01, -4.971e-01, -2.725e-01, -1.110e-01, -2.241e-01, -1.919e-01, 1.115e+00, 1.600e-01, 1.870e-01, -3.286e-01, -5.513e-01, -4.899e-01, 9.921e-01, -1.312e-01, -2.666e-01)); + r += mul(s1_5, M4(6.483e-03, 4.674e-02, 1.070e-02, -2.163e-01, -4.141e-03, -2.429e-02, 4.874e-02, -1.576e-01, -3.007e-02, 2.606e-02, 4.476e-02, 6.729e-02, 5.863e-02, -6.616e-02, 7.878e-03, 9.787e-02)); + r += mul(s1_6, M4(2.207e-02, 5.671e-03, 2.283e-03, -1.648e-02, 5.681e-03, -1.943e-03, 1.594e-02, 2.148e-02, -3.016e-02, 3.046e-04, 4.328e-02, -4.072e-02, -1.499e-02, -6.713e-03, -8.285e-02, 1.440e-03)); + r += mul(s1_7, M4(-4.522e-02, -1.953e-02, 3.004e-01, 1.255e-01, 6.459e-03, 3.954e-02, -1.323e-01, -1.315e-01, -1.715e-02, -5.240e-02, 1.653e-01, 2.243e-01, -2.645e-02, -2.654e-02, 3.446e-02, 1.267e-02)); + r += mul(s1_8, M4(1.441e-02, 2.868e-03, 4.941e-02, 2.607e-01, -5.114e-03, -6.024e-03, 3.945e-03, -4.669e-02, 6.142e-03, 4.197e-03, -4.871e-03, 2.252e-04, 1.890e-02, 1.142e-02, -1.040e-02, 7.153e-02)); + r += mul(s2_0, M4(4.156e-03, 3.821e-03, -1.529e-03, 2.462e-03, -2.837e-02, -1.254e-02, -1.678e-02, -5.421e-03, -8.727e-03, -8.809e-03, -3.158e-02, -2.025e-02, -1.411e-02, 7.584e-03, 8.450e-02, 4.221e-02)); + r += mul(s2_1, M4(1.418e-02, -7.004e-03, -2.935e-02, -2.645e-02, -1.518e-02, -3.918e-02, -6.617e-02, -5.273e-02, -9.888e-02, -1.090e-02, 1.380e-01, 7.376e-02, -1.161e-02, -1.487e-02, 2.550e-02, 6.274e-02)); + r += mul(s2_2, M4(5.309e-03, 2.695e-02, 1.267e-02, -3.495e-03, 9.392e-03, 2.603e-02, 2.278e-02, 3.305e-03, -1.302e-02, -1.123e-01, -1.547e-02, 3.941e-02, 1.298e-03, -1.396e-02, 1.964e-03, 7.526e-03)); + r += mul(s2_3, M4(-1.822e-02, 8.636e-03, 8.368e-03, 1.102e-02, 6.230e-02, -2.289e-02, -1.296e-02, -1.681e-02, 4.747e-02, -1.882e-02, 9.110e-03, -1.084e-02, -2.726e-02, -2.000e-02, -1.814e-01, -7.070e-02)); + r += mul(s2_4, M4(-4.428e-02, -6.799e-02, -5.391e-03, -2.368e-02, 3.822e-01, 3.324e-01, 2.766e-01, 1.771e-01, 1.929e-01, 2.418e-01, -2.039e-01, 5.701e-03, 1.467e-01, 4.835e-02, 1.470e-01, -7.146e-02)); + r += mul(s2_5, M4(-9.316e-03, -2.872e-03, 7.287e-03, 5.032e-02, -2.617e-02, 9.548e-02, -3.550e-02, 9.550e-02, -4.338e-02, -2.402e-02, -4.187e-02, -2.445e-01, -5.388e-03, 3.789e-02, -2.563e-02, 2.686e-02)); + r += mul(s2_6, M4(9.817e-03, 4.676e-03, -6.399e-03, 7.844e-03, -1.019e-02, -8.003e-04, 5.167e-02, 1.419e-02, -9.988e-03, -2.480e-03, 2.983e-02, -6.955e-03, -4.089e-02, -1.849e-02, -3.747e-02, -2.679e-02)); + r += mul(s2_7, M4(3.122e-02, 1.641e-02, 5.238e-02, -1.886e-03, -1.368e-02, -1.047e-02, 4.063e-02, 8.081e-02, -2.436e-02, -1.314e-02, 7.406e-02, 1.255e-01, 1.328e-03, -1.480e-02, -2.203e-02, -6.794e-03)); + r += mul(s2_8, M4(-1.214e-02, 3.663e-02, -5.298e-02, 4.172e-02, -1.636e-03, -1.193e-02, 1.591e-02, 1.546e-02, -4.897e-03, -2.570e-02, 1.029e-02, -1.321e-02, 1.692e-03, -4.016e-03, 1.854e-02, -2.154e-02)); + r += mul(s3_0, M4(1.653e-02, 8.081e-04, -8.249e-04, -2.749e-03, -4.287e-02, -1.117e-02, -1.953e-02, -1.392e-02, -9.860e-03, -1.139e-02, -3.431e-02, -2.482e-02, 2.073e-03, 2.388e-02, 8.476e-02, 5.234e-02)); + r += mul(s3_1, M4(1.545e-02, 2.697e-03, -2.547e-02, -1.587e-02, 2.739e-02, -5.155e-02, -8.569e-02, -6.176e-02, -4.554e-02, -2.669e-02, 1.469e-01, 7.837e-02, -3.883e-02, -1.063e-02, 3.383e-02, 7.495e-02)); + r += mul(s3_2, M4(1.549e-02, -4.319e-03, 3.554e-02, -1.405e-02, 3.542e-03, 5.563e-02, 1.556e-02, -6.819e-03, -2.139e-02, -4.968e-02, -2.142e-02, 3.475e-02, -1.378e-02, -3.919e-02, -8.013e-03, -5.496e-03)); + r += mul(s3_3, M4(-3.531e-03, 9.257e-03, 1.262e-02, 4.105e-03, 4.193e-02, -2.331e-02, -2.424e-02, -2.262e-02, 5.437e-02, -3.147e-02, 2.348e-02, -2.547e-02, -1.490e-01, 2.063e-02, -1.968e-01, -2.503e-02)); + r += mul(s3_4, M4(-6.533e-02, -2.179e-02, 2.316e-02, -8.762e-03, 2.356e-01, 2.350e-01, 3.014e-01, 1.560e-01, 2.691e-01, 3.561e-01, -4.286e-01, -1.469e-01, 5.332e-01, -3.363e-01, 2.388e-01, -2.940e-01)); + r += mul(s3_5, M4(3.350e-01, -2.028e-01, -8.521e-02, -1.395e-02, -4.912e-02, 1.973e-02, -3.872e-02, 1.125e-01, -6.922e-02, -1.093e-01, -1.874e-02, -2.666e-01, -4.931e-02, 8.861e-02, -4.383e-02, 8.293e-03)); + r += mul(s3_6, M4(1.665e-02, -1.267e-03, 2.164e-03, 3.524e-03, -1.150e-02, -4.903e-03, 2.395e-02, 2.391e-03, -1.383e-02, 1.477e-03, 1.728e-02, -1.356e-02, 2.222e-03, 6.370e-03, -7.935e-02, -8.551e-03)); + r += mul(s3_7, M4(2.945e-02, 3.503e-02, 1.334e-02, 6.900e-02, -1.146e-02, -1.218e-02, 5.461e-02, 7.172e-02, -2.653e-02, -2.229e-02, 1.076e-01, 1.016e-01, -7.640e-03, -5.440e-03, 5.615e-02, -5.270e-02)); + r += mul(s3_8, M4(1.949e-02, -1.039e-01, 6.569e-01, -3.909e-01, -1.983e-03, -1.781e-02, -3.701e-03, -1.970e-02, -1.160e-02, -2.080e-02, -1.361e-02, 1.851e-03, -1.366e-02, -2.093e-02, -4.601e-03, -1.360e-02)); + r += V4(6.897e-04, 1.064e-03, 8.808e-04, 1.561e-03); + return tanh(r); +} + +void Pass8(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = (Rmp8x8(tid.x) << 1) + blockStart; + uint2 size = GetOutputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = ((gxy >> 1) + 0.5) * pt; + + V4 s0_0 = l0(-1.0, -1.0); + V4 s0_1 = l0(0.0, -1.0); + V4 s0_2 = l0(1.0, -1.0); + V4 s0_3 = l0(-1.0, 0.0); + V4 s0_4 = l0(0.0, 0.0); + V4 s0_5 = l0(1.0, 0.0); + V4 s0_6 = l0(-1.0, 1.0); + V4 s0_7 = l0(0.0, 1.0); + V4 s0_8 = l0(1.0, 1.0); + V4 s1_0 = -max(-s0_0, 0.0); + V4 s1_1 = -max(-s0_1, 0.0); + V4 s1_2 = -max(-s0_2, 0.0); + V4 s1_3 = -max(-s0_3, 0.0); + V4 s1_4 = -max(-s0_4, 0.0); + V4 s1_5 = -max(-s0_5, 0.0); + V4 s1_6 = -max(-s0_6, 0.0); + V4 s1_7 = -max(-s0_7, 0.0); + V4 s1_8 = -max(-s0_8, 0.0); + s0_0 = max(s0_0, 0.0); + s0_1 = max(s0_1, 0.0); + s0_2 = max(s0_2, 0.0); + s0_3 = max(s0_3, 0.0); + s0_4 = max(s0_4, 0.0); + s0_5 = max(s0_5, 0.0); + s0_6 = max(s0_6, 0.0); + s0_7 = max(s0_7, 0.0); + s0_8 = max(s0_8, 0.0); + + V4 s2_0 = l1(-1.0, -1.0); + V4 s2_1 = l1(0.0, -1.0); + V4 s2_2 = l1(1.0, -1.0); + V4 s2_3 = l1(-1.0, 0.0); + V4 s2_4 = l1(0.0, 0.0); + V4 s2_5 = l1(1.0, 0.0); + V4 s2_6 = l1(-1.0, 1.0); + V4 s2_7 = l1(0.0, 1.0); + V4 s2_8 = l1(1.0, 1.0); + V4 s3_0 = -max(-s2_0, 0.0); + V4 s3_1 = -max(-s2_1, 0.0); + V4 s3_2 = -max(-s2_2, 0.0); + V4 s3_3 = -max(-s2_3, 0.0); + V4 s3_4 = -max(-s2_4, 0.0); + V4 s3_5 = -max(-s2_5, 0.0); + V4 s3_6 = -max(-s2_6, 0.0); + V4 s3_7 = -max(-s2_7, 0.0); + V4 s3_8 = -max(-s2_8, 0.0); + s2_0 = max(s2_0, 0.0); + s2_1 = max(s2_1, 0.0); + s2_2 = max(s2_2, 0.0); + s2_3 = max(s2_3, 0.0); + s2_4 = max(s2_4, 0.0); + s2_5 = max(s2_5, 0.0); + s2_6 = max(s2_6, 0.0); + s2_7 = max(s2_7, 0.0); + s2_8 = max(s2_8, 0.0); + + V4 r = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8); + + static const float3x3 rgb2yuv = {0.299, 0.587, 0.114, -0.169, -0.331, 0.5, 0.5, -0.419, -0.081}; + static const float3x3 yuv2rgb = {1, -0.00093, 1.401687, 1, -0.3437, -0.71417, 1, 1.77216, 0.00099}; + float2 opt = float2(GetOutputPt()); + + pos -= 0.5f * opt; + float3 yuv = mul(rgb2yuv, INPUT.SampleLevel(SL, pos, 0).rgb); + OUTPUT[gxy] = float4(mul(yuv2rgb, float3(saturate(yuv.r + r.x), yuv.yz)), 1); + + ++gxy.x; + pos.x += opt.x; + yuv = mul(rgb2yuv, INPUT.SampleLevel(SL, pos, 0).rgb); + OUTPUT[gxy] = float4(mul(yuv2rgb, float3(saturate(yuv.r + r.y), yuv.yz)), 1); + + ++gxy.y; + pos.y += opt.y; + yuv = mul(rgb2yuv, INPUT.SampleLevel(SL, pos, 0).rgb); + OUTPUT[gxy] = float4(mul(yuv2rgb, float3(saturate(yuv.r + r.w), yuv.yz)), 1); + + --gxy.x; + pos.x -= opt.x; + yuv = mul(rgb2yuv, INPUT.SampleLevel(SL, pos, 0).rgb); + OUTPUT[gxy] = float4(mul(yuv2rgb, float3(saturate(yuv.r + r.z), yuv.yz)), 1); +} diff --git a/src/Effects/CuNNy/CuNNy-6x8C-NVL.hlsl b/src/Effects/CuNNy/CuNNy-6x8C-NVL.hlsl new file mode 100644 index 000000000..3b139d452 --- /dev/null +++ b/src/Effects/CuNNy/CuNNy-6x8C-NVL.hlsl @@ -0,0 +1,1247 @@ +// CuNNy 6x8C BILINEAR RGB NVL - https://github.com/cunnyplapper/CuNNy + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +//!MAGPIE EFFECT +//!VERSION 4 +//!SORT_NAME CuNNy-D08N06 + +//!TEXTURE +Texture2D INPUT; + +//!TEXTURE +//!WIDTH INPUT_WIDTH * 2 +//!HEIGHT INPUT_HEIGHT * 2 +Texture2D OUTPUT; + +//!SAMPLER +//!FILTER POINT +SamplerState SP; + +//!SAMPLER +//!FILTER LINEAR +SamplerState SL; + +//!COMMON +#define O(t, p) t.SampleLevel(SP, pos + p * pt, 0) +#define V4 min16float4 +#define M4 min16float4x4 + +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +//!FORMAT R8G8B8A8_SNORM +Texture2D t0; + +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +//!FORMAT R8G8B8A8_SNORM +Texture2D t1; + +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +//!FORMAT R8G8B8A8_SNORM +Texture2D t2; + +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +//!FORMAT R8G8B8A8_SNORM +Texture2D t3; + +//!PASS 1 +//!DESC in +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 +//!IN INPUT +//!OUT t0, t1 + +#define l0(x, y) min16float((dot(float3(2.668e-01, 5.128e-01, 1.094e-01), O(INPUT, float2(x, y)).rgb) + -8.262e-01)) + +V4 f0(min16float s0_0, min16float s0_1, min16float s0_2, min16float s0_3, min16float s0_4, min16float s0_5, min16float s0_6, min16float s0_7, min16float s0_8) { + V4 r = 0.0; + r += V4(3.453e-03, -2.009e-02, 1.029e-02, -4.229e-02) * s0_0; + r += V4(-1.162e-01, -3.046e-01, 3.944e-01, -3.426e-02) * s0_1; + r += V4(4.098e-02, 2.644e-01, 7.739e-03, 1.740e-02) * s0_2; + r += V4(-5.645e-01, 3.510e-01, -1.381e-01, 3.015e-01) * s0_3; + r += V4(5.692e-01, 2.277e-02, -1.002e-02, -2.280e-01) * s0_4; + r += V4(1.874e-02, -2.802e-01, -2.867e-02, -9.688e-02) * s0_5; + r += V4(3.162e-02, -3.273e-01, -1.823e-03, 2.738e-02) * s0_6; + r += V4(9.148e-02, 3.054e-01, 4.438e-02, 2.153e-01) * s0_7; + r += V4(-7.020e-02, -1.003e-02, 3.250e-03, -1.590e-01) * s0_8; + r += V4(2.110e-03, -3.283e-04, -1.730e-02, -4.942e-03); + return r; +} + +V4 f1(min16float s0_0, min16float s0_1, min16float s0_2, min16float s0_3, min16float s0_4, min16float s0_5, min16float s0_6, min16float s0_7, min16float s0_8) { + V4 r = 0.0; + r += V4(4.130e-03, -1.028e-02, -7.847e-02, -1.277e-01) * s0_0; + r += V4(1.850e-02, 1.097e-02, -1.303e-01, 1.772e-01) * s0_1; + r += V4(-3.426e-02, 3.168e-01, 9.948e-03, -4.789e-02) * s0_2; + r += V4(1.225e-03, 1.298e-02, 2.803e-01, -1.551e-02) * s0_3; + r += V4(-1.303e-02, -1.703e-02, 1.588e-01, 2.124e-01) * s0_4; + r += V4(5.410e-01, -2.998e-01, 2.618e-02, -1.909e-01) * s0_5; + r += V4(-1.382e-03, 4.087e-03, 1.879e-01, 4.719e-02) * s0_6; + r += V4(-3.849e-03, 1.123e-02, -2.463e-01, -5.789e-02) * s0_7; + r += V4(-5.129e-01, -2.681e-02, 3.530e-02, 7.564e-03) * s0_8; + r += V4(3.018e-03, 1.376e-02, -1.274e-02, 5.625e-03); + return r; +} + +void Pass1(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = Rmp8x8(tid.x) + blockStart; + uint2 size = GetInputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = (gxy + 0.5) * pt; + + min16float s0_0 = l0(-1.0, -1.0); + min16float s0_1 = l0(0.0, -1.0); + min16float s0_2 = l0(1.0, -1.0); + min16float s0_3 = l0(-1.0, 0.0); + min16float s0_4 = l0(0.0, 0.0); + min16float s0_5 = l0(1.0, 0.0); + min16float s0_6 = l0(-1.0, 1.0); + min16float s0_7 = l0(0.0, 1.0); + min16float s0_8 = l0(1.0, 1.0); + + t0[gxy] = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8); + t1[gxy] = f1(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8); +} + +//!PASS 2 +//!DESC conv1 +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 +//!IN t0, t1 +//!OUT t2, t3 + +#define l0(x, y) V4(O(t0, float2(x, y))) +#define l1(x, y) V4(O(t1, float2(x, y))) + +V4 f0(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8) { + V4 r = 0.0; + r += mul(s0_0, M4(1.042e-01, -4.946e-02, 6.554e-02, -8.392e-03, 1.283e-01, 1.651e-01, 3.683e-04, -1.051e-01, 4.040e-02, -6.936e-02, 1.557e-01, -1.129e-01, 2.308e-01, -4.099e-02, -5.587e-02, 5.584e-02)); + r += mul(s0_1, M4(-6.587e-02, -5.729e-02, 2.461e-01, -1.196e-02, -4.689e-02, 1.865e-01, 1.570e-02, 3.911e-03, -1.411e-01, -3.073e-02, 4.971e-02, -2.336e-01, 1.874e-01, -9.632e-02, 1.814e-01, -3.548e-01)); + r += mul(s0_2, M4(1.724e-01, 2.876e-01, 1.552e-01, -2.105e-01, 1.037e-01, 3.116e-01, 1.832e-01, -8.618e-02, 6.401e-02, 1.319e-01, 3.862e-02, 2.301e-01, -1.265e-02, -2.864e-01, -3.199e-02, 2.311e-01)); + r += mul(s0_3, M4(4.153e-02, -5.609e-02, -1.424e-01, 3.368e-02, 2.271e-01, -8.217e-02, -8.373e-02, -2.666e-01, -3.089e-01, -3.909e-02, -3.284e-02, -1.384e-01, 1.265e-02, 2.006e-01, -5.720e-02, 1.076e-01)); + r += mul(s0_4, M4(-4.261e-02, 1.184e-01, 3.302e-01, -2.949e-01, -3.369e-02, 3.576e-02, 1.019e-01, 3.097e-01, -4.891e-02, -2.452e-01, 5.598e-02, -2.664e-01, 6.785e-02, -1.832e-02, -6.347e-01, 2.930e-01)); + r += mul(s0_5, M4(5.791e-01, -1.328e-01, -2.570e-01, 2.606e-01, 8.937e-02, -2.239e-01, 6.957e-02, 1.786e-02, 2.350e-01, -4.333e-03, 9.579e-02, 2.193e-02, -2.945e-02, 1.651e-01, -8.800e-02, 3.369e-01)); + r += mul(s0_6, M4(-1.784e-01, -1.200e-01, -1.743e-01, 1.992e-01, -3.070e-02, -1.489e-01, -1.489e-01, 4.937e-03, -5.589e-01, -5.703e-01, 5.314e-01, -5.588e-01, -2.519e-02, 2.655e-03, -3.409e-02, 2.062e-01)); + r += mul(s0_7, M4(-4.764e-02, -2.769e-01, -8.199e-01, 6.832e-02, -1.419e-02, -5.326e-02, -2.143e-01, -6.217e-03, -2.033e-01, 9.656e-02, 1.715e-01, -2.919e-01, 1.069e-01, 2.729e-01, -8.952e-04, 1.155e-01)); + r += mul(s0_8, M4(1.953e-02, -3.145e-01, 1.220e-02, -1.279e-01, -1.510e-01, -1.802e-01, -9.842e-02, 1.264e-02, -2.215e-01, 2.586e-02, 4.424e-01, 6.816e-01, -7.124e-02, 1.132e-01, 4.702e-02, 4.041e-01)); + r += mul(s1_0, M4(9.269e-02, 1.047e-02, 5.079e-02, 5.864e-02, -3.747e-02, 1.270e-01, 1.255e-01, -1.602e-01, 7.921e-02, 5.447e-03, 1.268e-01, -4.616e-02, 2.253e-01, -9.203e-03, 6.893e-04, -8.571e-02)); + r += mul(s1_1, M4(-1.425e-01, 3.062e-02, 2.404e-01, -3.486e-01, -4.895e-01, -1.163e-01, 1.275e-01, -2.587e-01, -4.745e-02, 5.669e-02, 7.794e-02, -1.012e-01, 8.594e-02, -4.235e-01, 3.494e-01, -3.638e-01)); + r += mul(s1_2, M4(-2.751e-01, -4.543e-01, 2.819e-01, -3.893e-01, -8.049e-03, 2.251e-01, 1.453e-01, -2.370e-01, 3.627e-02, 2.143e-01, 1.543e-02, 1.223e-01, 6.544e-02, -2.368e-01, 9.235e-03, 2.656e-01)); + r += mul(s1_3, M4(1.210e-01, 9.555e-02, -5.417e-02, 1.165e-01, -1.068e-01, 6.166e-02, -2.891e-02, -8.389e-02, -1.224e-01, 5.482e-02, 2.476e-02, -8.222e-03, -1.536e-01, 6.750e-02, -1.824e-01, 1.234e-01)); + r += mul(s1_4, M4(-2.644e-02, 1.267e-01, 4.029e-01, 2.617e-01, -4.951e-01, 1.263e-01, 1.485e-01, 5.693e-01, -8.725e-03, 2.043e-01, -4.077e-03, -1.607e-01, -2.110e-01, -4.477e-02, -5.539e-01, 3.658e-01)); + r += mul(s1_5, M4(2.017e-01, 6.315e-01, -2.568e-01, -6.606e-01, 4.404e-01, -4.315e-01, -2.281e-02, -3.790e-01, 6.808e-02, -3.220e-02, -7.074e-02, -8.168e-02, -3.823e-01, 1.807e-01, 9.908e-02, -7.475e-02)); + r += mul(s1_6, M4(-1.382e-01, -2.290e-01, -1.867e-01, 2.769e-01, -6.167e-02, -1.228e-01, -1.397e-01, 1.529e-01, -1.591e-02, -4.457e-02, 2.053e-01, 2.664e-02, -9.287e-02, 3.469e-02, 8.066e-02, -5.675e-02)); + r += mul(s1_7, M4(3.744e-01, -3.467e-01, -9.004e-01, 5.327e-01, 5.426e-02, -6.985e-02, -3.799e-01, 4.876e-01, -6.079e-02, 2.228e-03, 2.478e-02, -2.092e-01, 2.800e-02, 2.458e-01, -1.370e-02, -1.551e-01)); + r += mul(s1_8, M4(2.552e-01, 1.097e-01, -1.182e-01, 1.627e-01, 2.166e-01, -4.759e-03, -1.014e-01, 2.126e-02, 6.229e-02, 2.329e-02, 9.464e-02, 4.757e-02, 3.131e-03, -2.587e-03, -2.741e-02, -4.537e-02)); + r += mul(s2_0, M4(1.745e-01, 4.940e-01, 2.727e-02, -8.500e-02, -2.356e-01, -1.500e-01, 9.724e-03, -2.077e-01, -5.020e-02, -1.467e-01, 1.685e-01, 3.359e-01, 2.094e-01, 1.175e-02, -6.380e-02, 4.710e-02)); + r += mul(s2_1, M4(-3.113e-02, 8.027e-01, -4.982e-03, -1.428e-01, 6.573e-02, 4.074e-04, 1.637e-01, 1.466e-01, 3.238e-01, 2.433e-01, -3.147e-01, -1.136e-02, -3.248e-02, -1.969e-01, 9.390e-02, -2.485e-01)); + r += mul(s2_2, M4(-1.045e-01, 2.494e-01, -3.734e-02, 4.765e-02, 5.332e-03, -2.832e-01, -2.026e-01, -1.339e-02, -4.321e-01, -7.626e-01, 1.908e-01, 3.502e-01, 3.451e-01, 1.199e-01, -7.371e-02, -6.362e-02)); + r += mul(s2_3, M4(-1.629e-01, -4.320e-01, 7.872e-01, -2.766e-01, -1.373e-01, 1.317e-02, -1.461e-01, 2.414e-02, -9.297e-02, 3.045e-02, -6.804e-02, 8.275e-02, -3.640e-01, -1.441e-01, -3.555e-02, 1.300e-01)); + r += mul(s2_4, M4(-3.256e-01, -5.021e-01, 1.595e-01, 4.114e-01, 7.795e-02, 1.064e-01, -9.154e-02, 1.568e-01, -2.319e-01, -8.268e-02, 3.692e-01, -9.510e-03, -1.566e-01, 1.517e-01, 2.046e-01, -5.032e-02)); + r += mul(s2_5, M4(-2.343e-01, -3.166e-01, -2.043e-04, -5.327e-02, -2.782e-02, -2.989e-01, -7.909e-02, 1.890e-01, -2.144e-01, 5.248e-01, -3.855e-02, 1.994e-01, -3.525e-01, -6.465e-02, -1.340e-02, 1.749e-01)); + r += mul(s2_6, M4(2.183e-02, 1.909e-03, 3.262e-02, 7.862e-02, -3.753e-01, 2.833e-01, 4.159e-01, -2.270e-01, 2.925e-02, -2.160e-01, -1.200e-01, -3.268e-02, -1.949e-01, -1.118e-01, 8.766e-02, 2.260e-02)); + r += mul(s2_7, M4(-1.560e-02, -3.559e-02, 3.894e-02, -7.496e-02, 1.947e-01, 4.921e-01, 2.227e-01, -2.002e-01, 3.045e-01, -1.339e-01, -5.773e-01, -2.032e-01, -2.834e-02, -1.129e-01, -2.371e-01, -6.408e-03)); + r += mul(s2_8, M4(1.109e-02, -4.708e-02, -3.267e-02, -6.323e-02, 2.935e-01, 2.542e-01, 1.224e-01, -9.832e-02, -1.134e-02, -7.131e-02, -5.557e-02, 5.606e-01, 2.551e-01, 2.313e-02, -8.756e-02, 8.658e-02)); + r += mul(s3_0, M4(-4.977e-01, 7.734e-02, 1.035e-01, -5.555e-01, -1.226e-01, -7.049e-02, -6.882e-02, -3.950e-02, -5.240e-03, -1.275e-01, 1.254e-01, 1.743e-01, 5.163e-02, 5.000e-03, -8.731e-02, -6.371e-02)); + r += mul(s3_1, M4(-3.240e-02, -1.207e-01, 1.163e-01, -1.555e-01, 1.009e-01, -1.052e-01, 2.058e-01, 2.205e-01, 6.038e-02, 1.410e-01, -1.091e-01, -2.054e-02, -3.050e-01, -6.117e-03, 1.110e-01, -1.869e-01)); + r += mul(s3_2, M4(1.899e-01, 9.263e-02, -4.842e-02, 2.578e-02, -1.349e-01, -1.889e-01, -1.932e-01, 2.278e-02, -1.531e-01, -1.199e-01, 2.886e-03, 3.222e-02, -2.776e-02, 1.405e-01, -6.920e-02, -5.137e-01)); + r += mul(s3_3, M4(-4.189e-01, 1.880e-01, -1.234e-01, 7.659e-01, 5.997e-01, -1.043e-01, -1.229e-01, 6.046e-01, -1.916e-01, 5.904e-02, 2.624e-02, 1.703e-02, -1.891e-02, 3.916e-02, 1.597e-01, -1.509e-01)); + r += mul(s3_4, M4(5.301e-01, -1.048e-01, -8.784e-02, -4.903e-01, 3.227e-01, -4.585e-01, -2.122e-01, 3.939e-01, -1.169e-01, -8.373e-03, 1.272e-01, 6.810e-02, 2.517e-01, 2.839e-01, 1.257e-01, -4.846e-01)); + r += mul(s3_5, M4(1.499e-01, -2.604e-01, -1.691e-01, -3.895e-01, -4.073e-01, 3.564e-02, 8.605e-02, -2.012e-01, 4.062e-02, 4.141e-02, 1.726e-02, -9.629e-02, 1.348e-01, -9.468e-02, 2.113e-03, -7.229e-02)); + r += mul(s3_6, M4(-5.457e-02, 1.150e-01, -1.297e-01, 2.096e-01, 4.355e-01, -6.530e-02, -6.438e-01, 6.335e-01, 5.057e-02, -2.750e-01, -2.055e-01, 8.634e-02, -5.581e-01, -1.185e-01, 2.945e-02, 1.703e-01)); + r += mul(s3_7, M4(-1.032e-02, -4.045e-02, 9.848e-02, -1.865e-01, -1.078e-01, -4.990e-01, 4.652e-01, -1.320e-01, 1.969e-01, -1.816e-01, -4.724e-01, 1.471e-01, 5.619e-01, 4.145e-02, -3.606e-02, 8.608e-01)); + r += mul(s3_8, M4(4.007e-02, -5.339e-02, -2.525e-04, 1.082e-01, -2.520e-01, 2.832e-01, 4.025e-01, 1.532e-01, 1.244e-01, -9.873e-02, -8.482e-02, 5.278e-02, 1.618e-01, -3.404e-02, 2.947e-02, 2.445e-01)); + r += V4(6.864e-03, -7.720e-03, -1.170e-02, 2.714e-03); + return r; +} + +V4 f1(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-5.307e-02, -6.220e-02, 7.854e-02, 3.023e-02, 1.780e-02, -4.660e-02, 5.384e-02, -3.152e-02, 1.070e-01, -8.460e-02, 1.359e-01, -8.144e-02, -1.251e-01, -7.183e-02, -5.920e-02, -1.442e-01)); + r += mul(s0_1, M4(-7.721e-02, 5.857e-02, 1.973e-01, 3.698e-02, -1.199e-01, -2.585e-02, 7.877e-02, -1.865e-01, -3.580e-01, 1.767e-01, -1.279e-02, -4.554e-02, -1.928e-01, 1.017e-01, 2.319e-01, -2.160e-01)); + r += mul(s0_2, M4(-9.376e-02, -1.128e-01, -6.333e-02, 3.354e-02, -1.542e-02, 7.209e-02, 2.742e-01, 2.597e-02, 5.620e-02, -6.394e-02, -7.670e-03, 4.574e-02, -7.222e-02, 6.187e-02, -1.593e-01, 3.579e-03)); + r += mul(s0_3, M4(5.476e-02, 8.972e-02, -2.571e-01, 2.037e-01, 7.994e-02, -7.436e-06, -1.929e-01, -8.885e-02, 2.996e-01, 3.133e-01, 1.697e-01, 2.396e-02, 2.580e-01, -8.171e-02, -5.660e-01, 1.743e-01)); + r += mul(s0_4, M4(-7.670e-01, 4.858e-01, 1.888e-01, -3.512e-01, 1.555e-01, 1.685e-01, 1.297e-01, -1.428e-01, -1.589e-01, 6.807e-02, 2.787e-01, -7.520e-01, -3.137e-02, -2.188e-01, 4.388e-01, 1.228e-01)); + r += mul(s0_5, M4(2.404e-01, -3.138e-01, 2.209e-01, 9.275e-02, 5.628e-02, 7.736e-02, -3.531e-01, -7.307e-02, 1.796e-01, -2.184e-01, 2.552e-01, 2.046e-01, -2.306e-01, 1.558e-01, -4.967e-02, -1.155e-01)); + r += mul(s0_6, M4(1.131e-01, -2.256e-02, 1.024e-01, 1.899e-01, 1.293e-01, 2.068e-02, -1.174e-01, 1.143e-01, -5.395e-02, 4.318e-02, -9.846e-02, 1.123e-01, 4.766e-02, -2.608e-01, -1.273e-01, -2.761e-01)); + r += mul(s0_7, M4(1.882e-01, -5.930e-02, -2.394e-01, 1.931e-01, 1.246e-01, -2.508e-02, -7.158e-02, -2.783e-02, -2.621e-01, 7.212e-01, -1.169e-01, -3.426e-01, -1.276e-01, 6.132e-02, 2.120e-01, -3.544e-01)); + r += mul(s0_8, M4(1.605e-02, 4.498e-02, 3.280e-01, -9.840e-02, 1.066e-01, -2.167e-02, 1.566e-01, -6.055e-02, -7.933e-02, 2.419e-01, -6.969e-01, -1.372e-01, 6.544e-02, -4.269e-02, -3.820e-04, 1.499e-01)); + r += mul(s1_0, M4(-8.681e-02, -1.087e-01, 9.044e-02, -1.616e-01, 5.700e-02, -1.112e-01, 7.944e-02, -1.029e-01, 2.576e-02, -8.748e-02, 1.241e-01, 7.166e-03, 2.636e-02, 2.446e-02, -4.103e-02, 1.675e-01)); + r += mul(s1_1, M4(1.572e-02, 3.793e-02, 2.414e-01, -2.281e-01, -8.712e-02, -6.538e-02, 1.419e-01, -2.081e-01, -9.182e-02, 2.571e-02, 1.355e-01, -1.110e-01, -2.355e-01, 2.339e-01, 1.910e-02, -1.032e-01)); + r += mul(s1_2, M4(1.797e-02, -6.616e-02, -1.663e-02, -1.947e-01, -3.057e-02, 5.054e-02, 1.722e-01, -1.862e-02, 7.327e-03, 2.610e-02, -3.037e-01, 1.290e-01, -5.838e-02, 2.218e-02, -5.471e-02, 6.622e-02)); + r += mul(s1_3, M4(7.168e-03, 8.656e-02, -1.933e-01, 1.346e-01, 8.983e-04, -7.273e-03, -1.299e-01, 4.448e-02, -1.194e-02, 1.806e-01, 2.176e-01, 9.534e-02, 2.997e-01, -4.100e-02, -6.068e-01, 3.835e-01)); + r += mul(s1_4, M4(-2.998e-01, 4.814e-01, 1.137e-01, -9.396e-01, -1.303e-01, 3.726e-02, 2.731e-01, 4.488e-01, -1.218e-01, 1.669e-01, 1.251e-01, -7.614e-02, 2.104e-01, -1.051e-01, 1.398e-01, 3.838e-01)); + r += mul(s1_5, M4(4.201e-01, -1.504e-01, 1.123e-01, 1.165e-01, 7.321e-03, 1.057e-01, -5.330e-01, -1.028e-01, 6.962e-02, 1.858e-01, 1.840e-01, -1.049e-01, 4.850e-02, 2.241e-01, -2.765e-01, 2.054e-02)); + r += mul(s1_6, M4(1.442e-01, -6.238e-02, 1.505e-01, -7.470e-02, 8.926e-02, -9.376e-03, 2.118e-02, 1.368e-01, 5.482e-02, 1.042e-01, -1.818e-01, 1.364e-01, 8.520e-02, -2.172e-01, -1.501e-01, -1.698e-01)); + r += mul(s1_7, M4(2.163e-01, -6.139e-02, -2.190e-01, -1.932e-01, -4.070e-02, -5.123e-02, -9.987e-02, 1.412e-01, -1.614e-01, 6.292e-01, -1.916e-01, -8.262e-02, -2.486e-01, 8.627e-03, 2.816e-01, -2.516e-02)); + r += mul(s1_8, M4(-4.631e-02, -2.598e-02, -8.044e-02, -1.965e-01, 9.235e-02, -2.282e-02, -9.376e-02, 1.773e-02, -9.385e-02, 2.837e-01, -5.315e-01, 1.079e-01, 3.615e-02, -3.025e-02, -8.471e-02, 1.044e-01)); + r += mul(s2_0, M4(1.066e-01, 7.468e-02, 1.383e-01, -2.494e-01, -5.715e-02, 1.462e-01, -4.641e-02, -6.538e-02, -3.077e-02, 6.170e-02, 2.492e-01, 1.307e-01, 1.527e-01, 4.648e-02, -1.311e-01, 1.123e-02)); + r += mul(s2_1, M4(-2.184e-02, -8.723e-02, -6.092e-02, 3.431e-03, 9.186e-02, 5.499e-03, 2.798e-01, -1.613e-02, 2.447e-01, 2.809e-02, -3.777e-02, 4.224e-02, 9.632e-02, -3.813e-02, -6.021e-02, -5.802e-02)); + r += mul(s2_2, M4(7.639e-02, 1.966e-02, 2.578e-01, 1.208e-01, 2.502e-02, -3.256e-02, -1.851e-01, -2.343e-02, -2.017e-01, -5.456e-02, -1.051e-01, -1.624e-01, 2.899e-02, -1.224e-03, 3.144e-01, 1.033e-01)); + r += mul(s2_3, M4(-1.768e-01, 1.433e-01, 1.390e-01, -1.494e-01, -3.681e-02, -1.480e-01, -3.328e-01, 4.138e-02, -1.058e-01, 2.190e-01, 3.278e-01, -2.495e-01, 8.836e-02, 1.228e-01, -3.728e-01, 3.534e-01)); + r += mul(s2_4, M4(5.058e-02, -9.077e-02, -7.532e-02, 9.344e-02, 1.096e-01, 5.318e-02, -2.979e-01, 1.779e-01, -1.682e-01, 3.371e-01, 1.964e-01, -2.526e-01, -3.013e-01, 5.184e-02, 3.613e-01, 5.832e-02)); + r += mul(s2_5, M4(-4.613e-02, 3.121e-02, 5.499e-02, 7.645e-02, -1.745e-01, -4.111e-02, 3.210e-01, -2.519e-02, -8.660e-02, 4.306e-01, 5.642e-01, -1.645e-01, -6.127e-02, 3.565e-02, 3.529e-02, 5.166e-02)); + r += mul(s2_6, M4(-1.482e-01, 3.199e-02, -1.302e-02, 7.168e-02, 2.378e-01, -7.776e-02, 2.090e-01, 1.870e-01, 1.820e-01, 8.673e-02, -9.481e-05, 2.911e-01, 6.907e-02, -4.005e-02, -1.265e-01, -1.030e-01)); + r += mul(s2_7, M4(1.354e-01, 2.906e-03, 6.018e-02, 8.451e-02, -1.123e-02, -1.011e-01, 7.115e-02, -8.680e-02, 2.088e-01, 2.977e-01, 8.741e-02, 2.908e-05, -2.357e-01, 3.996e-02, -1.434e-02, -1.192e-01)); + r += mul(s2_8, M4(2.121e-03, 2.972e-02, -5.123e-02, -5.465e-03, -1.124e-01, 7.063e-02, 1.180e-02, -1.732e-01, -1.739e-01, 8.947e-02, -8.452e-02, 4.847e-01, -5.393e-02, -4.491e-02, -3.357e-02, -5.699e-03)); + r += mul(s3_0, M4(4.013e-01, 1.153e-01, 5.353e-03, -2.882e-01, -5.749e-02, 5.224e-02, -2.923e-02, -3.499e-02, 2.801e-02, -1.767e-02, 9.020e-02, -8.928e-02, 9.319e-02, -3.256e-02, -4.600e-02, -2.629e-01)); + r += mul(s3_1, M4(1.098e-01, -1.177e-03, -2.211e-01, 1.097e-02, 3.512e-02, 1.884e-02, 2.745e-01, -1.055e-01, 3.093e-02, 7.905e-02, 5.369e-02, 1.962e-01, -8.069e-03, -1.057e-01, -5.889e-02, 6.130e-02)); + r += mul(s3_2, M4(1.107e-01, -2.817e-02, 8.050e-02, 6.254e-02, -1.035e-02, -7.545e-02, -1.390e-01, -8.220e-02, -7.958e-02, -1.110e-01, -2.425e-01, -8.612e-02, 8.152e-03, -1.041e-01, 2.705e-01, -2.947e-03)); + r += mul(s3_3, M4(-1.766e-01, 2.151e-01, 5.500e-01, 1.463e-01, -3.390e-01, -9.116e-02, -1.704e-01, 9.677e-02, -1.434e-01, 2.198e-01, 4.151e-01, -1.036e-01, 2.908e-01, 1.355e-01, -3.566e-01, -1.082e-01)); + r += mul(s3_4, M4(1.299e-01, -6.859e-02, -4.033e-01, 2.197e-01, -1.170e-01, 9.324e-03, -2.593e-01, 1.434e-01, -1.492e-01, 4.124e-01, 3.600e-01, -1.676e-01, 2.548e-02, -1.581e-02, 1.796e-01, -3.075e-01)); + r += mul(s3_5, M4(-5.624e-02, 1.779e-02, 5.036e-02, -1.849e-01, -1.064e-01, -1.738e-02, 3.161e-01, 5.391e-02, -5.693e-02, 3.279e-01, -6.516e-02, -3.823e-02, -1.512e-01, 9.958e-03, -4.383e-02, -1.996e-01)); + r += mul(s3_6, M4(-1.586e-01, -2.236e-03, -8.471e-02, -1.331e-01, -3.366e-02, -3.968e-01, -2.313e-01, -5.757e-01, 1.606e-01, 3.686e-02, 1.387e-02, 9.619e-02, -1.653e-01, -1.318e-01, -1.257e-01, -1.748e-01)); + r += mul(s3_7, M4(1.938e-01, 1.519e-02, 2.123e-02, 1.121e-01, 5.456e-02, -1.568e-01, 2.224e-01, -5.000e-01, -6.363e-02, 2.205e-01, -3.627e-02, 1.547e-01, 8.136e-03, 2.279e-02, 4.444e-01, -5.358e-02)); + r += mul(s3_8, M4(-5.716e-02, -5.222e-03, -1.156e-02, -6.042e-02, -1.024e-01, 7.483e-02, -2.342e-02, 1.065e-01, -5.690e-02, 6.041e-02, -1.489e-01, -5.921e-02, -1.887e-02, -2.115e-01, 6.895e-02, -7.626e-02)); + r += V4(-1.499e-01, -1.776e-03, -6.774e-03, 1.322e-02); + return r; +} + +void Pass2(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = Rmp8x8(tid.x) + blockStart; + uint2 size = GetInputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = (gxy + 0.5) * pt; + + V4 s0_0 = l0(-1.0, -1.0); + V4 s0_1 = l0(0.0, -1.0); + V4 s0_2 = l0(1.0, -1.0); + V4 s0_3 = l0(-1.0, 0.0); + V4 s0_4 = l0(0.0, 0.0); + V4 s0_5 = l0(1.0, 0.0); + V4 s0_6 = l0(-1.0, 1.0); + V4 s0_7 = l0(0.0, 1.0); + V4 s0_8 = l0(1.0, 1.0); + V4 s1_0 = -max(-s0_0, 0.0); + V4 s1_1 = -max(-s0_1, 0.0); + V4 s1_2 = -max(-s0_2, 0.0); + V4 s1_3 = -max(-s0_3, 0.0); + V4 s1_4 = -max(-s0_4, 0.0); + V4 s1_5 = -max(-s0_5, 0.0); + V4 s1_6 = -max(-s0_6, 0.0); + V4 s1_7 = -max(-s0_7, 0.0); + V4 s1_8 = -max(-s0_8, 0.0); + s0_0 = max(s0_0, 0.0); + s0_1 = max(s0_1, 0.0); + s0_2 = max(s0_2, 0.0); + s0_3 = max(s0_3, 0.0); + s0_4 = max(s0_4, 0.0); + s0_5 = max(s0_5, 0.0); + s0_6 = max(s0_6, 0.0); + s0_7 = max(s0_7, 0.0); + s0_8 = max(s0_8, 0.0); + + V4 s2_0 = l1(-1.0, -1.0); + V4 s2_1 = l1(0.0, -1.0); + V4 s2_2 = l1(1.0, -1.0); + V4 s2_3 = l1(-1.0, 0.0); + V4 s2_4 = l1(0.0, 0.0); + V4 s2_5 = l1(1.0, 0.0); + V4 s2_6 = l1(-1.0, 1.0); + V4 s2_7 = l1(0.0, 1.0); + V4 s2_8 = l1(1.0, 1.0); + V4 s3_0 = -max(-s2_0, 0.0); + V4 s3_1 = -max(-s2_1, 0.0); + V4 s3_2 = -max(-s2_2, 0.0); + V4 s3_3 = -max(-s2_3, 0.0); + V4 s3_4 = -max(-s2_4, 0.0); + V4 s3_5 = -max(-s2_5, 0.0); + V4 s3_6 = -max(-s2_6, 0.0); + V4 s3_7 = -max(-s2_7, 0.0); + V4 s3_8 = -max(-s2_8, 0.0); + s2_0 = max(s2_0, 0.0); + s2_1 = max(s2_1, 0.0); + s2_2 = max(s2_2, 0.0); + s2_3 = max(s2_3, 0.0); + s2_4 = max(s2_4, 0.0); + s2_5 = max(s2_5, 0.0); + s2_6 = max(s2_6, 0.0); + s2_7 = max(s2_7, 0.0); + s2_8 = max(s2_8, 0.0); + + t2[gxy] = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8); + t3[gxy] = f1(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8); +} + +//!PASS 3 +//!DESC conv2 +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 +//!IN t2, t3 +//!OUT t0, t1 + +#define l0(x, y) V4(O(t2, float2(x, y))) +#define l1(x, y) V4(O(t3, float2(x, y))) + +V4 f0(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-1.716e-02, -1.345e-01, 1.032e-01, 4.104e-02, 8.711e-02, 8.589e-02, 8.094e-02, -4.856e-02, 1.430e-01, 7.623e-02, -6.074e-02, 9.124e-02, 3.848e-03, -2.421e-02, -3.542e-02, 2.262e-02)); + r += mul(s0_1, M4(5.328e-02, -4.876e-02, 2.747e-01, -3.134e-01, 5.165e-02, -8.168e-02, -9.645e-02, 9.013e-02, 5.684e-01, 3.945e-01, -5.757e-02, 3.315e-01, 2.290e-01, -2.012e-01, -1.305e-01, 1.678e-01)); + r += mul(s0_2, M4(-5.859e-02, -1.364e-01, 1.517e-02, -2.630e-01, 2.100e-02, 1.196e-02, -6.509e-03, 3.381e-02, 1.752e-01, 1.950e-01, 3.989e-02, -3.574e-03, -1.470e-01, -2.938e-01, 9.845e-02, 8.800e-02)); + r += mul(s0_3, M4(-3.231e-02, -1.792e-01, 4.669e-01, 2.254e-01, -5.143e-03, -1.238e-01, -1.704e-01, -2.428e-01, -1.350e-01, -1.620e-01, -2.490e-01, 5.236e-02, -9.524e-02, -5.944e-02, -1.270e-01, 2.059e-01)); + r += mul(s0_4, M4(-6.691e-02, 8.980e-03, 1.013e-02, 1.386e-01, -8.353e-02, -1.772e-01, -6.338e-02, -3.381e-01, -6.478e-02, 2.335e-01, 6.344e-02, 2.214e-01, 1.850e-01, 2.665e-02, -1.302e-01, -3.592e-01)); + r += mul(s0_5, M4(-6.946e-02, -3.227e-03, 1.130e-01, -3.646e-01, 6.317e-02, -2.508e-01, 1.449e-02, 1.909e-01, 4.092e-02, -1.928e-01, 4.181e-02, 1.998e-01, -1.042e-01, -1.643e-01, 1.123e-01, -1.423e-01)); + r += mul(s0_6, M4(4.571e-04, -2.226e-01, 1.542e-01, -1.980e-01, 2.272e-01, 6.605e-02, -1.823e-01, -3.202e-01, -1.017e-02, 4.403e-02, -1.199e-01, -6.896e-02, -2.050e-02, -4.035e-03, -2.686e-02, 6.758e-02)); + r += mul(s0_7, M4(-2.184e-02, 2.620e-01, -1.598e-01, -1.310e-01, -1.282e-02, -6.247e-02, -5.500e-02, -1.549e-01, -1.201e-02, 2.664e-02, -1.159e-01, 2.574e-02, -4.379e-02, 4.502e-02, -1.428e-01, 2.220e-01)); + r += mul(s0_8, M4(8.156e-03, -1.909e-03, 1.260e-01, -8.108e-02, 8.324e-02, -1.054e-01, 3.860e-02, -5.290e-02, -1.608e-03, -3.940e-02, -1.942e-02, -8.427e-02, -5.776e-02, -1.097e-01, -1.933e-02, 1.763e-01)); + r += mul(s1_0, M4(-2.796e-02, -6.590e-02, -1.873e-01, 2.170e-01, -8.312e-02, -2.841e-02, 1.736e-01, -1.202e-01, 6.437e-02, 1.920e-03, 1.832e-01, -2.252e-01, 1.106e-01, 1.346e-01, 8.420e-03, -2.089e-01)); + r += mul(s1_1, M4(7.340e-02, 2.419e-02, 8.738e-03, 1.919e-01, -6.706e-02, -1.429e-02, -9.722e-02, -1.269e-01, -4.527e-02, -1.184e-01, -3.381e-03, -1.308e-01, 1.871e-01, 2.487e-01, -2.376e-02, -1.436e-01)); + r += mul(s1_2, M4(1.461e-01, 1.143e-01, -1.074e-01, 8.386e-02, -1.447e-01, -1.686e-01, 9.007e-02, -1.183e-01, 5.843e-02, -7.875e-02, -6.239e-02, 5.076e-02, -8.418e-02, -5.289e-02, 7.695e-02, -4.506e-02)); + r += mul(s1_3, M4(-1.277e-01, -9.044e-02, -2.494e-01, 2.466e-01, -3.309e-02, -1.805e-01, 2.197e-01, 9.758e-02, 2.339e-02, -2.082e-01, 2.091e-01, -3.370e-01, 1.096e-01, 1.691e-01, -1.687e-01, 1.317e-03)); + r += mul(s1_4, M4(7.503e-02, -9.570e-02, -3.911e-01, 3.020e-01, -3.351e-01, 3.397e-01, -1.038e-01, 4.915e-01, -2.002e-01, 2.340e-01, 1.700e-01, 1.536e-01, 2.331e-01, 3.055e-01, -7.175e-02, -2.936e-01)); + r += mul(s1_5, M4(1.693e-01, 6.752e-02, -6.320e-02, 1.731e-01, 5.053e-02, 1.589e-01, -3.209e-02, 2.180e-02, -2.516e-02, -3.550e-01, -6.057e-02, 1.766e-01, 6.070e-02, 2.377e-01, 1.420e-01, -1.750e-01)); + r += mul(s1_6, M4(5.968e-02, 1.878e-01, -7.204e-02, -1.839e-01, 9.632e-02, 4.321e-02, 1.055e-02, -5.708e-02, -5.873e-02, -3.095e-02, -2.059e-02, 1.277e-02, -1.520e-02, 1.516e-01, -2.994e-01, -7.694e-02)); + r += mul(s1_7, M4(-5.850e-02, 3.689e-02, -2.758e-01, -5.820e-02, -7.878e-02, 1.943e-01, 1.318e-01, -6.132e-03, 3.420e-02, 1.539e-01, -1.353e-01, 1.066e-01, -1.837e-02, 1.026e-01, -2.007e-01, 1.803e-02)); + r += mul(s1_8, M4(3.459e-02, -7.917e-02, -6.715e-02, -6.375e-02, 5.512e-02, -1.532e-01, -1.008e-02, 3.281e-02, 2.993e-02, 6.528e-02, 1.202e-02, -1.341e-01, 1.046e-01, 2.568e-01, -3.195e-02, -6.128e-03)); + r += mul(s2_0, M4(-1.676e-01, 6.091e-02, 1.021e-01, 1.900e-01, 6.284e-01, 3.015e-01, 1.076e-01, -4.315e-01, 9.855e-02, 7.527e-02, 1.173e-01, 1.454e-01, -1.936e-02, -7.795e-02, 4.561e-02, -1.009e-01)); + r += mul(s2_1, M4(-1.538e-01, 1.924e-01, -2.160e-01, 1.121e-02, 3.876e-01, 6.074e-01, 1.912e-01, 1.107e+00, -1.019e-01, 2.046e-02, 4.697e-01, 2.091e-02, -1.841e-01, -4.174e-02, 2.999e-01, 8.326e-02)); + r += mul(s2_2, M4(-9.220e-02, 1.825e-01, -1.562e-01, 3.358e-01, 5.226e-02, 6.678e-01, 3.058e-01, 2.938e-01, 1.706e-01, 8.658e-02, -6.464e-02, -3.511e-01, 4.983e-02, 1.655e-01, 6.151e-02, -2.758e-01)); + r += mul(s2_3, M4(-1.193e-01, -8.883e-03, -6.676e-02, -1.863e-01, 5.507e-01, 2.139e-01, -2.313e-01, -3.117e-01, 7.110e-03, -2.253e-02, 2.619e-02, -1.450e-01, 2.895e-02, 1.838e-02, 1.456e-02, -1.848e-02)); + r += mul(s2_4, M4(8.266e-01, 1.957e-01, -5.592e-01, -1.102e+00, -1.108e+00, -2.799e-01, 2.460e+00, -2.017e+00, -1.304e-01, 5.934e-02, 2.235e-01, -1.531e-01, 2.761e-01, -2.611e-02, -2.482e-01, -2.947e-02)); + r += mul(s2_5, M4(1.606e-01, 1.278e-02, -9.921e-02, 9.180e-02, 1.138e-01, -3.889e-02, 1.627e-01, 2.813e+00, 5.255e-02, -2.075e-02, -1.651e-01, -1.358e-01, -1.813e-01, 3.018e-01, 3.389e-04, -3.242e-01)); + r += mul(s2_6, M4(-1.029e-02, 1.966e-01, 9.284e-03, 3.095e-01, -1.677e-01, -5.509e-02, -1.289e+00, -3.562e-02, 2.497e-02, 1.040e-01, -1.576e-01, -1.242e-01, -6.614e-02, -2.606e-02, -2.151e-02, 9.371e-02)); + r += mul(s2_7, M4(2.008e-01, -2.042e-01, 3.626e-03, -8.524e-03, -3.760e-01, 3.521e-01, -4.482e-01, -7.956e-01, -1.076e-01, -2.298e-02, 1.228e-01, 2.675e-01, 8.843e-02, 2.774e-01, -1.114e-01, 6.773e-02)); + r += mul(s2_8, M4(7.028e-03, 2.032e-01, -2.760e-01, -5.645e-02, 7.888e-02, 4.420e-01, 1.608e-01, 7.254e-02, 8.015e-02, -1.828e-01, -1.142e-02, -2.063e-02, -1.091e-01, -3.137e-02, 2.670e-02, -1.370e-03)); + r += mul(s3_0, M4(3.985e-02, -4.648e-04, -6.229e-02, 1.024e-02, 2.510e-02, -1.833e-01, -2.537e-02, -5.906e-02, 1.551e-01, 1.097e+00, -9.003e-01, 9.391e-01, -1.978e-02, -5.407e-02, 2.358e-01, 1.039e-01)); + r += mul(s3_1, M4(-1.454e-02, 6.619e-02, -5.213e-03, -5.554e-02, 4.323e-02, 1.004e-01, 1.153e-01, 1.370e-01, 4.502e-01, 3.804e-01, 2.568e-01, 7.781e-01, -3.095e-02, 3.557e-02, 1.035e-01, -2.194e-02)); + r += mul(s3_2, M4(-3.902e-02, -1.607e-01, 5.826e-02, 1.034e-02, -2.753e-03, 1.175e-01, 3.703e-02, 1.375e-02, 7.297e-02, 2.820e-01, 5.462e-04, -5.188e-02, 2.212e-01, 1.518e-01, -1.325e-01, 9.074e-02)); + r += mul(s3_3, M4(-5.867e-02, -1.032e-01, -2.187e-02, 2.861e-02, 6.211e-02, 8.308e-02, -1.475e-01, 3.146e-02, -1.838e-01, -1.555e-01, -8.405e-01, -3.969e-01, -2.232e-02, -1.254e-01, 1.786e-01, -2.215e-01)); + r += mul(s3_4, M4(1.142e-01, -2.823e-01, -3.135e-01, 2.494e-01, -2.510e-01, 1.359e-01, 2.920e-01, 3.156e-03, -1.326e-01, -4.658e-01, 2.085e-01, -2.149e-01, 3.455e-01, 5.045e-01, -3.612e-01, 2.250e-01)); + r += mul(s3_5, M4(9.107e-03, -2.388e-01, 8.027e-02, -1.974e-01, 2.763e-01, -7.958e-02, 1.082e-01, 1.907e-01, 1.002e-01, -7.503e-02, 1.903e-02, 1.209e-01, -3.394e-01, -5.029e-03, -2.791e-01, -3.699e-02)); + r += mul(s3_6, M4(-1.739e-02, 6.326e-02, 8.739e-02, 6.420e-02, -3.866e-02, -9.341e-02, -2.571e-01, -1.428e-01, -4.662e-02, 8.787e-02, -2.799e-01, -2.134e-01, 1.020e-02, -2.975e-02, 7.063e-02, -1.584e-01)); + r += mul(s3_7, M4(1.056e-01, -1.006e-01, 1.313e-01, 1.137e-02, -9.836e-02, -4.874e-02, -2.130e-01, -1.634e-01, -5.612e-02, -1.760e-01, -1.908e-01, 1.199e-01, -1.486e-02, 1.704e-01, -7.049e-03, -1.845e-01)); + r += mul(s3_8, M4(-1.343e-01, -2.351e-02, -1.138e-01, 1.969e-02, -2.157e-02, -2.178e-01, 6.627e-02, 2.071e-02, -8.215e-02, -2.077e-01, 6.798e-02, 3.783e-02, -4.294e-02, 2.298e-01, 3.238e-01, -3.153e-01)); + r += V4(-2.216e-03, -1.314e-01, -1.773e-02, 2.580e-02); + return r; +} + +V4 f1(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8) { + V4 r = 0.0; + r += mul(s0_0, M4(1.193e-01, -1.140e-01, -1.286e-01, 1.857e-01, 1.764e-02, 2.680e-02, -2.096e-02, -2.392e-02, 1.995e-02, -1.275e-01, -1.179e-02, -9.041e-02, 2.080e-02, -2.054e-02, -6.917e-02, -3.731e-02)); + r += mul(s0_1, M4(5.910e-02, -3.300e-02, 2.187e-01, -4.265e-02, -1.050e-02, -3.859e-02, 7.390e-02, 1.629e-02, 4.529e-02, -1.788e-01, 4.091e-01, -6.928e-02, 1.657e-01, -4.254e-03, -3.151e-01, 2.919e-01)); + r += mul(s0_2, M4(-4.341e-02, 2.223e-02, -1.008e-01, 8.143e-02, -9.846e-03, 5.909e-02, -2.690e-02, 3.039e-02, 1.086e-01, -6.404e-02, -6.064e-02, -1.898e-01, 9.368e-02, 3.736e-03, -3.105e-02, 6.931e-02)); + r += mul(s0_3, M4(-3.157e-02, -1.135e-02, -4.165e-01, -1.928e-01, -7.721e-02, 1.880e-01, -1.479e-01, 1.343e-01, 1.394e-01, -1.888e-01, 4.132e-02, 3.282e-02, 1.008e-01, 3.034e-02, -1.672e-01, 2.711e-01)); + r += mul(s0_4, M4(5.348e-02, -7.725e-02, 1.096e-01, 1.428e-01, 2.230e-02, 4.346e-01, -1.861e-01, 2.064e-01, 9.964e-02, -1.543e-01, 2.040e-01, -2.667e-01, 2.274e-01, -4.279e-02, 2.191e-01, 1.740e-01)); + r += mul(s0_5, M4(-4.585e-02, 7.224e-02, 2.702e-02, -5.440e-02, -8.830e-02, 1.219e-01, -5.870e-02, -1.575e-02, -2.895e-01, 1.297e-01, -2.219e-01, -3.090e-01, 1.459e-02, 6.562e-02, 8.912e-02, 3.619e-02)); + r += mul(s0_6, M4(5.821e-02, -1.235e-01, 2.805e-01, 1.661e-02, -1.411e-01, 4.756e-01, 1.758e-02, 2.091e-01, -7.398e-02, -1.141e-02, 9.094e-03, 5.836e-02, -5.062e-02, -1.953e-02, 9.519e-03, 1.514e-01)); + r += mul(s0_7, M4(-2.608e-02, 5.385e-02, 2.445e-01, -2.328e-02, -1.261e-02, 3.237e-01, -1.273e-01, -9.910e-02, 6.702e-03, -9.507e-03, 1.413e-01, -8.367e-02, 6.338e-02, 7.485e-02, 1.797e-01, -7.493e-03)); + r += mul(s0_8, M4(-1.616e-01, 9.600e-02, 5.955e-02, -1.206e-01, -1.295e-02, -7.217e-03, -9.834e-02, 1.012e-02, -9.242e-02, -8.508e-03, -8.789e-02, -1.357e-01, 3.131e-02, 1.343e-02, -8.285e-02, 1.658e-02)); + r += mul(s1_0, M4(-1.426e-02, 1.560e-02, -2.351e-01, 1.411e-02, 6.414e-02, -1.062e-02, -6.187e-02, 3.851e-02, -1.255e-01, -2.124e-01, 5.334e-02, -1.702e-01, -1.592e-02, 8.683e-02, 3.298e-02, -1.396e-01)); + r += mul(s1_1, M4(2.771e-02, 1.236e-01, 3.715e-01, 3.765e-03, 1.343e-01, -8.645e-02, -2.129e-01, 2.529e-01, -3.053e-01, 6.211e-02, 6.285e-01, 6.935e-02, -1.150e-01, -1.477e-01, 1.362e-01, -7.007e-02)); + r += mul(s1_2, M4(-1.013e-01, 2.877e-02, -1.274e-01, 6.261e-02, 4.531e-02, -6.713e-02, -1.651e-02, -9.269e-02, -1.616e-01, -3.828e-03, -3.715e-01, 1.978e-03, 2.994e-02, 5.941e-02, -1.039e-01, -9.121e-02)); + r += mul(s1_3, M4(1.614e-01, 2.806e-01, -5.564e-01, 1.712e-01, 3.865e-02, -9.885e-02, 1.400e-01, -1.006e-01, 3.954e-02, -7.045e-02, 2.290e-01, 5.378e-03, -4.572e-02, 5.276e-02, 3.839e-02, 7.448e-02)); + r += mul(s1_4, M4(-2.672e-02, 2.006e-01, 2.841e-01, -1.999e-02, 1.419e-02, 8.672e-02, 2.153e-01, 2.087e-01, 1.046e-02, 9.963e-01, 6.317e-01, 7.537e-01, -2.202e-01, -7.516e-02, 3.076e-01, -1.556e-01)); + r += mul(s1_5, M4(-3.143e-01, 5.866e-02, -1.605e-01, -1.615e-01, -8.577e-02, 7.590e-03, 2.199e-01, 9.684e-03, -2.125e-02, -2.988e-02, -4.535e-01, 5.538e-02, -2.528e-01, 1.243e-01, 1.700e-01, -1.200e-01)); + r += mul(s1_6, M4(-1.574e-01, 6.763e-02, 4.039e-02, 1.469e-01, 2.257e-03, 1.424e-01, -1.655e-01, 8.329e-02, -7.065e-02, -2.476e-01, -9.983e-02, 1.232e-01, -7.377e-02, 1.521e-02, -3.496e-02, -1.429e-02)); + r += mul(s1_7, M4(-3.125e-04, -2.618e-03, -6.887e-02, -2.244e-01, -4.241e-02, -1.978e-01, 1.768e-01, -1.142e-01, 3.186e-02, -8.708e-02, 1.963e-01, 1.347e-01, -9.015e-02, -1.290e-01, 1.373e-01, -1.238e-01)); + r += mul(s1_8, M4(-2.192e-01, 5.605e-04, -1.505e-01, -2.801e-01, 1.144e-01, -1.020e-01, -5.691e-02, 1.329e-01, -4.557e-02, -5.067e-02, -5.847e-03, 1.539e-02, -2.222e-01, -1.948e-02, -7.628e-02, -1.468e-01)); + r += mul(s2_0, M4(1.248e-02, -6.067e-02, 6.221e-03, -2.587e-01, 1.340e-01, 9.183e-02, 1.780e-01, 1.129e-01, -5.239e-03, 7.200e-03, -8.953e-03, 1.245e-01, -5.878e-02, -5.848e-02, 4.972e-02, -1.553e-02)); + r += mul(s2_1, M4(5.369e-02, -1.389e-01, 2.474e-01, -9.388e-02, 1.382e-01, -2.378e-01, 1.034e+00, -4.127e-01, -5.765e-02, -2.028e-01, -5.532e-02, -6.872e-02, -1.059e-02, 7.206e-03, -2.455e-01, -4.938e-02)); + r += mul(s2_2, M4(1.712e-01, -7.478e-02, 2.833e-01, -1.819e-01, 3.654e-01, -1.324e-01, 2.584e-01, -3.937e-01, 1.282e-01, -7.266e-02, 7.739e-02, 1.304e-01, -4.748e-02, -1.578e-01, 4.012e-02, -3.365e-02)); + r += mul(s2_3, M4(-1.748e-01, -1.185e-01, 3.252e-01, 8.781e-02, 3.503e-01, -6.309e-01, 1.597e+00, 9.112e-02, -3.477e-01, -7.516e-02, -5.034e-02, -2.982e-01, 1.566e-01, -7.671e-03, -5.705e-02, 4.100e-02)); + r += mul(s2_4, M4(-7.281e-01, 7.474e-01, -7.460e-01, -5.525e-01, 6.676e-01, -2.384e+00, -2.085e+00, 2.139e+00, 5.178e-02, -2.687e-01, 4.824e-02, 4.211e-02, -4.863e-03, -2.555e-01, 1.548e-01, -5.389e-02)); + r += mul(s2_5, M4(2.294e-01, 4.563e-02, -1.082e-01, 1.918e-01, -4.791e-01, -3.667e-01, -9.200e-01, -7.338e-02, 2.055e-01, 1.443e-01, -1.102e-01, 3.247e-01, -1.077e-01, 1.510e-01, 9.772e-02, -9.652e-02)); + r += mul(s2_6, M4(-7.180e-02, -6.766e-02, 4.233e-02, 2.346e-01, 2.416e-01, -5.872e-01, -3.803e-01, 1.459e-01, 1.314e-01, 1.762e-01, 2.180e-01, -6.325e-02, -2.639e-02, -6.961e-02, -6.823e-02, 1.208e-01)); + r += mul(s2_7, M4(-1.771e-02, 8.693e-01, 6.895e-02, 1.746e-01, 7.339e-01, -2.318e+00, -9.599e-02, 6.005e-03, -2.361e-01, 4.397e-03, 4.241e-02, -3.560e-01, -2.276e-01, 2.720e-01, -2.148e-03, 1.158e-01)); + r += mul(s2_8, M4(1.415e-02, 4.584e-02, -3.553e-01, 5.112e-02, -6.470e-01, -1.005e+00, -4.282e-02, -9.747e-01, -4.664e-02, 1.182e-01, -1.638e-01, 3.781e-02, 9.961e-02, 6.290e-02, 1.452e-01, -2.967e-02)); + r += mul(s3_0, M4(-1.042e-02, 1.059e-02, 8.109e-02, -1.976e-02, 5.573e-02, 1.743e-01, 2.189e-03, 1.850e-01, -2.536e-01, 2.196e-01, 9.472e-01, -4.919e-01, 1.358e-02, -1.083e-02, -4.265e-01, -5.187e-02)); + r += mul(s3_1, M4(8.612e-02, -1.189e-01, -2.101e-01, 1.060e-01, 1.314e-01, -1.630e-02, -5.186e-02, 4.664e-02, -6.413e-01, -3.610e-01, 4.229e-01, -4.334e-01, 4.259e-02, -1.822e-02, 4.311e-01, -2.530e-01)); + r += mul(s3_2, M4(2.664e-02, 2.255e-02, 3.200e-02, -1.377e-01, -1.708e-01, -8.546e-02, 8.941e-02, -8.314e-02, -2.572e-01, -4.522e-03, 2.598e-02, -3.987e-02, -7.309e-02, -7.170e-02, 3.738e-01, -1.056e-01)); + r += mul(s3_3, M4(1.327e-03, -1.352e-01, -1.486e-01, -4.253e-03, 9.866e-02, 2.134e-01, 2.813e-01, 1.472e-01, 3.699e-01, -6.387e-01, 4.480e-01, -5.420e-01, 6.457e-02, -1.278e-01, 1.867e-01, -2.355e-01)); + r += mul(s3_4, M4(-1.330e-01, -1.691e-01, 3.231e-01, -2.959e-01, 2.198e-01, -1.739e-02, -6.569e-02, 3.037e-01, -2.062e-01, 9.855e-02, -5.762e-01, -1.501e-02, 4.521e-02, 2.517e-01, -3.916e-01, -3.841e-01)); + r += mul(s3_5, M4(2.251e-01, 2.664e-02, 3.331e-02, 2.836e-01, -2.527e-01, 4.076e-02, -1.331e-02, -3.068e-03, -4.003e-04, -3.312e-02, -4.418e-02, -7.245e-02, 1.807e-01, -5.017e-01, 6.191e-02, -6.283e-01)); + r += mul(s3_6, M4(-5.410e-02, 7.319e-02, -4.022e-02, -5.598e-02, 1.675e-01, -1.364e-02, 3.302e-02, 2.473e-03, 1.630e-01, -1.955e-02, 2.311e-02, -1.402e-01, -1.078e-02, -1.675e-01, 1.211e-01, -3.069e-03)); + r += mul(s3_7, M4(-3.596e-02, -1.378e-02, 1.912e-01, 1.530e-02, 1.993e-01, -2.688e-01, -6.555e-02, -2.267e-01, -9.549e-02, -1.909e-01, -1.314e-01, -1.145e-01, -3.460e-01, -2.630e-02, 3.692e-01, -1.209e-01)); + r += mul(s3_8, M4(2.329e-01, 4.865e-02, 1.411e-02, 1.037e-01, -3.701e-01, -9.056e-02, -1.421e-01, -3.640e-01, -2.971e-02, -8.960e-02, 4.366e-03, -1.232e-01, -5.654e-02, -6.378e-02, 2.785e-01, -1.645e-01)); + r += V4(5.906e-02, -2.826e-02, 3.865e-02, 1.167e-02); + return r; +} + +void Pass3(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = Rmp8x8(tid.x) + blockStart; + uint2 size = GetInputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = (gxy + 0.5) * pt; + + V4 s0_0 = l0(-1.0, -1.0); + V4 s0_1 = l0(0.0, -1.0); + V4 s0_2 = l0(1.0, -1.0); + V4 s0_3 = l0(-1.0, 0.0); + V4 s0_4 = l0(0.0, 0.0); + V4 s0_5 = l0(1.0, 0.0); + V4 s0_6 = l0(-1.0, 1.0); + V4 s0_7 = l0(0.0, 1.0); + V4 s0_8 = l0(1.0, 1.0); + V4 s1_0 = -max(-s0_0, 0.0); + V4 s1_1 = -max(-s0_1, 0.0); + V4 s1_2 = -max(-s0_2, 0.0); + V4 s1_3 = -max(-s0_3, 0.0); + V4 s1_4 = -max(-s0_4, 0.0); + V4 s1_5 = -max(-s0_5, 0.0); + V4 s1_6 = -max(-s0_6, 0.0); + V4 s1_7 = -max(-s0_7, 0.0); + V4 s1_8 = -max(-s0_8, 0.0); + s0_0 = max(s0_0, 0.0); + s0_1 = max(s0_1, 0.0); + s0_2 = max(s0_2, 0.0); + s0_3 = max(s0_3, 0.0); + s0_4 = max(s0_4, 0.0); + s0_5 = max(s0_5, 0.0); + s0_6 = max(s0_6, 0.0); + s0_7 = max(s0_7, 0.0); + s0_8 = max(s0_8, 0.0); + + V4 s2_0 = l1(-1.0, -1.0); + V4 s2_1 = l1(0.0, -1.0); + V4 s2_2 = l1(1.0, -1.0); + V4 s2_3 = l1(-1.0, 0.0); + V4 s2_4 = l1(0.0, 0.0); + V4 s2_5 = l1(1.0, 0.0); + V4 s2_6 = l1(-1.0, 1.0); + V4 s2_7 = l1(0.0, 1.0); + V4 s2_8 = l1(1.0, 1.0); + V4 s3_0 = -max(-s2_0, 0.0); + V4 s3_1 = -max(-s2_1, 0.0); + V4 s3_2 = -max(-s2_2, 0.0); + V4 s3_3 = -max(-s2_3, 0.0); + V4 s3_4 = -max(-s2_4, 0.0); + V4 s3_5 = -max(-s2_5, 0.0); + V4 s3_6 = -max(-s2_6, 0.0); + V4 s3_7 = -max(-s2_7, 0.0); + V4 s3_8 = -max(-s2_8, 0.0); + s2_0 = max(s2_0, 0.0); + s2_1 = max(s2_1, 0.0); + s2_2 = max(s2_2, 0.0); + s2_3 = max(s2_3, 0.0); + s2_4 = max(s2_4, 0.0); + s2_5 = max(s2_5, 0.0); + s2_6 = max(s2_6, 0.0); + s2_7 = max(s2_7, 0.0); + s2_8 = max(s2_8, 0.0); + + t0[gxy] = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8); + t1[gxy] = f1(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8); +} + +//!PASS 4 +//!DESC conv3 +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 +//!IN t0, t1 +//!OUT t2, t3 + +#define l0(x, y) V4(O(t0, float2(x, y))) +#define l1(x, y) V4(O(t1, float2(x, y))) + +V4 f0(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8) { + V4 r = 0.0; + r += mul(s0_0, M4(1.057e-01, 8.402e-02, -7.690e-02, -5.544e-02, -1.356e-02, -1.211e-01, -3.841e-02, 7.556e-02, -1.057e-01, -6.017e-02, -5.377e-03, -3.373e-02, 2.015e-02, -3.443e-01, 4.561e-03, -1.471e-01)); + r += mul(s0_1, M4(-9.330e-02, -3.572e-02, 1.283e-01, 1.837e-02, -1.698e-02, -7.926e-02, -3.830e-02, -6.985e-02, 1.791e-01, -1.764e-02, -2.987e-01, -2.914e-02, -1.109e-01, -2.236e-01, 1.116e-02, 1.155e-03)); + r += mul(s0_2, M4(-1.422e-02, -3.524e-02, 6.026e-02, 2.085e-03, 3.122e-02, -8.025e-02, -2.071e-01, 6.779e-03, 3.087e-02, -1.078e-01, -1.336e-01, 3.374e-02, 4.059e-02, -1.509e-01, -2.500e-02, 1.575e-02)); + r += mul(s0_3, M4(2.079e-01, 1.217e-01, -9.225e-02, -1.526e-01, 2.831e-01, -2.399e-01, -1.879e-01, 3.896e-02, -2.888e-02, 1.898e-01, 7.200e-03, 1.166e-01, 4.709e-01, -2.553e-01, -8.659e-02, -1.966e-01)); + r += mul(s0_4, M4(-2.466e-01, 1.668e-01, -3.000e-01, 1.331e-01, 1.691e-01, -8.165e-02, 1.461e-01, -2.816e-01, 4.627e-01, -5.020e-02, 4.608e-02, -4.259e-01, 1.733e-01, -2.493e-01, -2.859e-01, 1.255e-01)); + r += mul(s0_5, M4(-1.061e-01, -1.312e-02, 4.457e-03, 6.950e-02, -1.528e-02, -8.325e-03, 9.288e-03, 4.323e-04, -1.349e-01, -4.300e-02, -1.214e-01, -6.221e-02, 1.326e-01, 1.729e-02, -9.435e-03, -8.256e-02)); + r += mul(s0_6, M4(-2.764e-01, 2.277e-01, -6.479e-02, 9.793e-02, -1.252e-01, -2.225e-01, -3.927e-02, 9.069e-03, -3.082e-02, -9.839e-02, -1.432e-02, 4.213e-03, 1.038e-01, -1.336e-02, -8.449e-02, 9.390e-03)); + r += mul(s0_7, M4(1.321e-01, -1.783e-01, 3.953e-02, -4.840e-03, -8.847e-02, 3.953e-02, -2.180e-03, 3.542e-02, -1.772e-01, -9.279e-02, -1.972e-02, -1.933e-02, 9.595e-02, -7.297e-02, -2.008e-02, 2.667e-02)); + r += mul(s0_8, M4(-1.079e-02, -5.796e-02, 8.349e-02, 9.407e-03, -6.521e-02, 2.585e-02, 3.029e-02, -2.179e-02, 1.644e-02, 2.894e-02, 9.475e-02, 2.535e-02, -1.062e-01, 1.059e-01, 5.134e-02, -4.920e-02)); + r += mul(s1_0, M4(2.292e-02, -1.255e-01, 6.694e-03, -1.429e-02, 2.778e-02, 1.610e-02, -5.433e-02, -1.691e-02, -8.172e-02, 1.096e-01, -7.444e-02, -1.744e-02, -1.607e-02, -1.718e-02, 2.261e-02, -7.930e-02)); + r += mul(s1_1, M4(-1.606e-01, 2.755e-01, 2.518e-01, -8.121e-02, 8.844e-02, -9.943e-02, -1.479e-01, 2.317e-03, -1.857e-02, 3.330e-01, -2.844e-01, 5.172e-03, 4.147e-02, 8.858e-05, -3.684e-02, 2.822e-02)); + r += mul(s1_2, M4(1.972e-02, 1.372e-01, 8.050e-02, -3.001e-02, -2.199e-02, -1.105e-03, -6.767e-02, -1.520e-02, 2.293e-02, 4.982e-04, 1.077e-01, -4.043e-02, -3.146e-04, 1.341e-04, -2.927e-02, 1.540e-03)); + r += mul(s1_3, M4(6.177e-01, -2.128e-01, -1.951e-01, -2.603e-01, -2.382e-01, 4.451e-02, -6.117e-02, 2.986e-01, -1.350e-01, -3.939e-02, -2.575e-02, 6.810e-02, -5.279e-02, -4.608e-02, -8.021e-02, -7.411e-02)); + r += mul(s1_4, M4(-1.743e-01, 3.337e-01, -2.366e-01, 1.677e-01, 1.648e-01, -1.324e-01, 4.842e-02, -1.070e-01, 1.649e-01, 5.767e-01, 8.170e-02, -1.744e-01, 1.955e-01, 1.592e-01, -2.500e-01, -7.249e-02)); + r += mul(s1_5, M4(-1.271e-01, -1.008e-01, 7.718e-04, 6.185e-03, 2.051e-02, -1.960e-02, 5.900e-02, -7.462e-03, -9.429e-02, -6.792e-02, -1.796e-01, 7.379e-02, -3.235e-02, 4.667e-03, -8.281e-02, -1.639e-02)); + r += mul(s1_6, M4(2.655e-01, 4.646e-02, -7.062e-02, 1.656e-01, 1.325e-01, -1.897e-01, 5.944e-04, 4.675e-02, -5.384e-02, -9.959e-02, -6.261e-05, 2.482e-03, -1.603e-01, 1.532e-03, -6.567e-02, 5.924e-02)); + r += mul(s1_7, M4(3.912e-01, -2.348e-01, -1.125e-02, 6.278e-02, -8.276e-02, 1.717e-01, -2.386e-02, 5.405e-02, 1.651e-01, -7.568e-02, -2.812e-02, 1.120e-02, 7.600e-02, -3.569e-02, 8.237e-02, 3.588e-02)); + r += mul(s1_8, M4(-1.545e-01, -2.594e-01, 5.109e-02, -3.375e-02, -6.946e-02, 5.645e-04, -3.457e-02, -1.802e-02, -8.377e-02, 3.700e-02, -5.377e-02, 2.370e-03, -5.512e-02, 3.772e-02, -6.696e-03, -2.474e-02)); + r += mul(s2_0, M4(9.595e-02, -1.386e-01, 6.095e-02, 1.382e-01, -6.666e-02, 3.536e-02, 3.510e-02, 9.837e-02, -7.013e-02, 1.777e-02, -6.525e-02, 4.813e-03, 4.890e-02, 1.697e-01, 4.055e-02, 3.352e-03)); + r += mul(s2_1, M4(-9.534e-02, -1.931e-01, 7.936e-02, -5.563e-03, 1.180e-01, -1.126e-01, -4.561e-01, 1.382e-02, -5.442e-02, 1.826e-02, -1.906e-01, 2.481e-02, 1.479e-01, 6.991e-02, -4.527e-01, 4.636e-02)); + r += mul(s2_2, M4(2.077e-02, -1.935e-02, 2.863e-02, -1.457e-03, 8.646e-02, -3.495e-02, -1.110e-01, -5.121e-02, 1.296e-02, 1.610e-01, 1.111e-02, -5.463e-03, -6.310e-02, 9.282e-02, -1.124e-02, -5.502e-03)); + r += mul(s2_3, M4(-2.461e-01, 2.046e-01, 7.247e-02, 4.344e-01, -2.654e-03, -1.548e-01, 5.001e-02, -2.193e-02, -2.841e-02, 4.966e-02, -5.860e-02, -1.607e-02, -3.365e-01, 3.779e-01, -7.002e-02, 2.456e-01)); + r += mul(s2_4, M4(-3.244e-02, 4.290e-01, 8.561e-02, -8.759e-02, 5.843e-01, 2.402e-01, -7.254e-02, 1.672e-01, 9.564e-03, 6.555e-01, 1.018e-01, 2.472e-01, 3.227e-01, -2.279e-01, 2.948e-01, 1.007e-01)); + r += mul(s2_5, M4(7.899e-02, -3.829e-02, -6.897e-02, -6.274e-02, -1.648e-01, 1.819e-01, -3.680e-02, -2.700e-02, -1.223e-01, 3.068e-02, -9.879e-02, 9.617e-02, -1.048e-01, 8.574e-03, 1.253e-01, 1.451e-02)); + r += mul(s2_6, M4(6.709e-02, -2.087e-03, -3.317e-02, 9.660e-02, -4.432e-02, 1.087e-01, -3.855e-03, 3.000e-02, -1.565e-01, 1.285e-02, -1.122e-02, -2.268e-02, 2.213e-01, -5.280e-03, -1.048e-02, 1.095e-02)); + r += mul(s2_7, M4(3.409e-02, 1.319e-02, -3.860e-02, 1.186e-01, -1.729e-01, 6.734e-02, -4.122e-02, -1.425e-02, -1.333e-01, 3.082e-01, -5.667e-02, 1.330e-02, -7.902e-02, -2.279e-01, -2.277e-02, -7.345e-02)); + r += mul(s2_8, M4(-8.456e-02, 7.960e-03, -3.009e-02, 3.726e-02, -1.028e-01, 9.260e-02, -9.118e-03, -1.295e-02, 8.764e-02, 3.246e-03, -3.662e-02, 3.309e-02, -6.546e-02, -1.168e-01, 1.179e-02, -1.356e-02)); + r += mul(s3_0, M4(2.830e-01, -1.486e-01, -6.659e-02, 7.406e-02, 3.936e-02, 1.384e-01, -8.613e-02, 5.222e-02, -2.008e-02, -3.306e-02, 3.603e-03, 8.508e-03, 6.657e-02, 8.277e-03, -1.684e-02, -3.086e-02)); + r += mul(s3_1, M4(2.673e-02, -1.550e-01, -1.939e-01, 1.124e-01, 1.494e-01, 3.597e-01, -2.434e-01, -3.767e-02, 6.287e-02, -1.489e-02, -2.108e-01, 9.890e-02, -6.012e-02, -1.588e-01, 5.574e-02, 6.678e-02)); + r += mul(s3_2, M4(7.056e-02, -9.550e-02, 1.579e-02, 6.754e-02, 6.387e-02, 9.595e-02, -1.968e-01, -3.396e-02, -6.625e-03, 1.153e-01, -2.162e-02, -1.236e-02, -2.182e-02, 9.085e-02, -7.137e-02, 3.357e-02)); + r += mul(s3_3, M4(8.677e-02, -7.446e-02, 8.953e-02, 2.128e-01, 3.175e-01, 1.377e-02, 9.215e-02, 8.452e-02, -2.583e-01, 5.582e-03, 4.653e-02, 1.038e-01, -5.802e-01, -1.506e-01, -5.875e-02, -4.308e-02)); + r += mul(s3_4, M4(-5.314e-02, 5.278e-01, 5.725e-02, -3.945e-02, 3.018e-01, -3.613e-02, 1.135e-01, 6.378e-02, 1.129e-01, 3.251e-01, -2.298e-01, 2.272e-01, -2.859e-02, -1.997e-01, -1.289e-02, -9.605e-02)); + r += mul(s3_5, M4(-8.572e-03, 1.098e-01, 6.951e-02, -1.006e-01, 8.029e-02, -1.004e-02, 3.641e-03, 3.452e-02, -2.027e-01, -1.419e-01, 9.411e-02, 4.631e-03, -2.382e-02, -1.774e-01, 9.282e-02, 7.921e-02)); + r += mul(s3_6, M4(-5.645e-02, 5.717e-02, -8.271e-02, 1.460e-01, 1.135e-01, -2.347e-02, 3.011e-02, 6.505e-02, -1.186e-01, 6.520e-02, 2.698e-03, -4.274e-02, 3.661e-03, 1.253e-01, 1.867e-02, 3.871e-03)); + r += mul(s3_7, M4(9.708e-02, -1.020e-01, -1.182e-01, 1.458e-01, -1.234e-01, -1.871e-01, -2.362e-02, -5.212e-02, 2.773e-01, -6.513e-02, -4.346e-03, -4.354e-02, 3.573e-01, -2.655e-02, 4.325e-02, -2.378e-02)); + r += mul(s3_8, M4(-8.228e-02, -2.852e-02, -2.048e-02, 3.619e-02, 9.848e-03, 4.128e-02, -4.446e-03, -9.824e-03, -1.064e-01, -5.623e-02, 4.160e-03, -3.699e-02, -6.863e-03, -2.035e-02, 1.601e-03, -4.166e-02)); + r += V4(-9.721e-03, -6.824e-03, 1.589e-03, -2.346e-03); + return r; +} + +V4 f1(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-2.150e-02, 3.627e-02, 1.098e-01, -2.531e-02, 7.604e-03, 6.546e-02, -3.447e-01, 5.052e-03, -5.728e-02, 1.302e-02, 1.200e-01, -3.060e-02, 3.626e-02, 8.441e-03, -1.570e-01, 1.402e-02)); + r += mul(s0_1, M4(-3.360e-02, -1.269e-01, 1.234e-02, 9.393e-02, -1.762e-01, 2.675e-01, -1.063e-01, -8.648e-02, -1.491e-01, 1.604e-01, -1.693e-01, 5.005e-02, 1.166e-01, -1.870e-02, 8.843e-02, 1.417e-02)); + r += mul(s0_2, M4(6.443e-02, 2.579e-02, 5.084e-02, -2.141e-02, -4.518e-02, -6.926e-02, -7.947e-02, -5.832e-03, 7.140e-02, -1.427e-01, 1.275e-01, 7.012e-02, -1.982e-03, -6.910e-02, -2.167e-01, 1.330e-02)); + r += mul(s0_3, M4(-2.132e-02, 2.807e-02, 1.044e-01, 1.442e-02, 3.026e-01, 1.629e-01, 1.141e-01, 1.649e-01, 6.632e-02, 1.488e-02, -1.725e-01, 3.376e-02, -4.740e-01, 5.156e-03, -2.510e-01, 6.820e-02)); + r += mul(s0_4, M4(-7.393e-02, 1.460e-01, -2.561e-02, 2.588e-01, 2.248e-01, 1.511e-01, 2.192e-01, -1.222e-01, 4.382e-01, 3.200e-02, 3.125e-02, -3.612e-01, -1.890e-01, -2.971e-01, -1.180e-01, -1.741e-01)); + r += mul(s0_5, M4(-8.022e-03, 3.348e-03, -9.508e-02, -5.842e-03, 2.266e-02, -3.213e-02, -1.024e-01, -8.443e-02, 2.648e-03, -1.541e-01, 8.091e-02, -4.184e-02, -2.928e-02, 9.030e-02, -1.811e-01, -1.895e-02)); + r += mul(s0_6, M4(2.134e-01, 1.204e-02, 2.013e-02, -8.178e-02, 1.413e-02, 5.513e-02, 1.111e-01, 2.577e-01, 1.495e-03, -5.161e-02, 1.933e-02, 7.202e-02, -1.053e-01, -6.070e-03, -1.038e-01, -1.344e-01)); + r += mul(s0_7, M4(3.203e-01, -1.824e-01, -4.901e-02, -2.154e-01, 3.227e-02, 2.323e-02, 1.477e-02, 1.885e-02, 1.952e-01, -3.905e-02, 3.536e-02, 1.957e-01, 2.784e-01, -1.506e-01, -1.907e-01, 5.836e-02)); + r += mul(s0_8, M4(-7.886e-02, -1.750e-01, 4.233e-02, -2.816e-01, -1.097e-02, 5.733e-03, -2.752e-02, 3.943e-03, -6.800e-02, -1.612e-02, -5.243e-02, -1.074e-02, -8.493e-02, 9.050e-02, -7.421e-02, -1.520e-01)); + r += mul(s1_0, M4(1.024e-01, -3.071e-02, -7.767e-02, -1.160e-02, -1.668e-01, -7.681e-03, 7.039e-02, 4.690e-02, -4.672e-02, 3.627e-03, 2.337e-02, -1.154e-02, 2.441e-03, 1.719e-02, 3.137e-02, 2.789e-02)); + r += mul(s1_1, M4(1.128e-01, 4.853e-02, 3.627e-01, 5.215e-03, -4.474e-02, -3.383e-02, 5.492e-03, 1.021e-01, -3.035e-02, 7.184e-03, 9.787e-02, 6.902e-02, 2.559e-02, 6.446e-03, -1.559e-01, 1.046e-01)); + r += mul(s1_2, M4(5.861e-02, 8.621e-02, -4.399e-03, 1.267e-02, 1.553e-02, -1.611e-02, 5.352e-02, 2.444e-03, -3.847e-02, 1.450e-01, 2.706e-01, -1.122e-01, -2.804e-03, 1.538e-02, 6.326e-02, -8.110e-02)); + r += mul(s1_3, M4(-4.627e-01, -2.751e-02, 1.883e-02, 6.767e-02, 1.365e-03, -7.980e-02, -1.068e-01, -8.643e-02, -1.110e-01, -5.781e-02, 2.143e-01, 6.533e-02, 9.844e-02, -1.375e-01, 1.719e-01, 1.652e-02)); + r += mul(s1_4, M4(-3.445e-01, 1.223e-01, -5.479e-01, 1.608e-01, 2.282e-01, 4.579e-02, 2.864e-02, -2.323e-01, 3.533e-01, -1.573e-01, 5.705e-02, -1.202e-01, -3.604e-02, 7.107e-02, -7.818e-02, -1.104e-01)); + r += mul(s1_5, M4(9.595e-02, 2.793e-01, -1.118e-01, -7.789e-02, -5.870e-02, -9.267e-02, 1.003e-01, -7.460e-02, 3.747e-02, -4.606e-01, 1.714e-01, -7.485e-04, -1.787e-02, -2.575e-02, 8.273e-02, -3.576e-02)); + r += mul(s1_6, M4(8.346e-03, -1.200e-01, 1.913e-03, -5.262e-02, -3.471e-02, -3.522e-02, 4.409e-02, 7.695e-02, 4.910e-02, -5.825e-02, 1.350e-01, 3.096e-04, 3.797e-03, -9.389e-02, 5.738e-02, -1.094e-02)); + r += mul(s1_7, M4(3.179e-01, -2.333e-01, 7.353e-02, -4.401e-01, -1.195e-01, 6.711e-02, -2.217e-02, -1.906e-01, 1.201e-01, -8.349e-02, 4.145e-02, -2.381e-02, 6.768e-02, 1.101e-02, 2.261e-02, -2.036e-01)); + r += mul(s1_8, M4(-4.521e-02, -3.368e-01, 2.684e-01, -1.975e-01, -1.879e-02, 1.738e-02, 4.605e-02, 1.067e-01, -6.758e-02, -8.444e-02, 1.229e-01, -6.125e-02, -1.200e-02, -6.803e-03, -6.103e-03, 5.747e-02)); + r += mul(s2_0, M4(-1.677e-02, -7.385e-03, 7.314e-03, 6.695e-02, 5.321e-03, -7.504e-03, 1.785e-01, 8.061e-02, 6.187e-02, 2.549e-02, -4.809e-02, -3.195e-02, -1.591e-01, 8.312e-02, -6.793e-02, 3.581e-02)); + r += mul(s2_1, M4(3.261e-02, -7.202e-02, -1.190e-01, 1.516e-01, -5.670e-03, 1.967e-01, -4.255e-01, 4.834e-02, 4.823e-02, 4.959e-02, 2.604e-01, -9.989e-02, -4.437e-02, -6.331e-02, 5.512e-02, -4.163e-02)); + r += mul(s2_2, M4(4.071e-02, 7.433e-02, 7.196e-02, -3.118e-02, -4.637e-02, -3.775e-02, -2.451e-02, -1.277e-02, 4.582e-02, -4.385e-02, 3.060e-01, -1.481e-02, 3.523e-03, 1.282e-02, -1.091e-01, 6.814e-02)); + r += mul(s2_3, M4(2.584e-01, -1.657e-02, -1.307e-01, -1.203e-01, -5.162e-02, 6.113e-04, 6.253e-02, 1.557e-01, -1.242e-01, -5.452e-02, 3.666e-01, -9.119e-02, 5.750e-01, -4.420e-02, -2.222e-01, 3.541e-02)); + r += mul(s2_4, M4(-3.262e-02, 1.971e-01, -7.493e-02, -2.959e-01, 1.890e-02, -4.554e-02, -1.241e-01, -2.084e-01, -3.179e-01, -6.226e-02, -3.992e-01, -4.678e-02, 9.481e-02, -2.873e-01, -9.361e-02, -2.487e-01)); + r += mul(s2_5, M4(-9.744e-02, -3.792e-02, -1.262e-01, -1.641e-02, -9.649e-02, 2.342e-01, 7.814e-02, -1.527e-01, -2.606e-01, -1.009e-01, 1.738e-02, -1.352e-01, 4.687e-03, -4.251e-03, 8.552e-02, -1.215e-01)); + r += mul(s2_6, M4(4.338e-02, -6.728e-02, -2.316e-02, 1.704e-01, -4.922e-02, -2.497e-02, -3.437e-02, -2.233e-02, 8.673e-02, -8.427e-02, 3.012e-01, 1.868e-02, -5.820e-02, 2.842e-02, 1.574e-01, -5.813e-02)); + r += mul(s2_7, M4(7.404e-02, -4.425e-02, 8.098e-02, -7.744e-02, -2.555e-02, 7.253e-02, 8.971e-02, -4.607e-02, -1.052e-01, 7.666e-02, 3.011e-02, -3.467e-01, 5.327e-02, -4.348e-02, 2.473e-01, 1.847e-01)); + r += mul(s2_8, M4(-1.205e-02, -1.017e-01, 1.288e-02, -6.228e-02, -7.597e-03, 9.311e-03, 2.267e-02, 5.187e-04, 2.936e-02, -1.846e-01, 2.377e-02, 1.072e-01, 7.069e-02, -6.199e-02, 1.657e-01, 1.708e-01)); + r += mul(s3_0, M4(-2.337e-01, 2.411e-01, -5.654e-02, -6.128e-02, 1.441e-01, -7.801e-02, 8.768e-02, -1.401e-02, -7.979e-02, 2.938e-02, 3.423e-02, 2.258e-02, 3.470e-02, 1.049e-01, -9.900e-02, -3.849e-02)); + r += mul(s3_1, M4(1.636e-01, -5.372e-01, 7.445e-02, 4.422e-01, 2.717e-02, 4.842e-01, -3.236e-01, -1.247e-01, 9.917e-03, 2.162e-02, -1.777e-01, 3.460e-02, -1.702e-01, -4.158e-02, -6.269e-02, 3.410e-03)); + r += mul(s3_2, M4(-2.422e-03, -5.821e-02, -8.683e-02, -1.286e-02, 7.737e-02, 1.772e-01, 1.056e-01, -5.362e-02, 3.000e-02, 3.260e-02, -2.047e-02, -2.903e-02, 4.510e-02, 3.030e-02, 3.413e-02, 1.265e-01)); + r += mul(s3_3, M4(-3.559e-01, -4.824e-03, 2.601e-01, 5.725e-02, 1.480e-01, 9.340e-02, -6.162e-03, -1.121e-01, 3.200e-02, -2.580e-02, -1.105e-01, 3.647e-02, 1.558e-01, 3.367e-02, -3.009e-01, 2.425e-01)); + r += mul(s3_4, M4(-3.534e-01, 1.046e-01, -1.263e-02, -2.606e-01, 1.026e-01, 2.504e-01, -2.282e-01, -1.836e-01, 7.199e-02, -3.665e-02, -2.959e-01, -2.501e-01, 2.980e-02, -1.711e-01, 2.363e-01, -1.904e-01)); + r += mul(s3_5, M4(-1.381e-01, 9.220e-02, 1.082e-01, -1.717e-01, 5.453e-02, 1.216e-01, 6.893e-03, 4.137e-02, -3.005e-02, -2.100e-03, -5.898e-02, -3.922e-02, 1.715e-01, -1.886e-01, -2.510e-01, 2.493e-01)); + r += mul(s3_6, M4(5.587e-02, -5.724e-02, 4.462e-02, 1.133e-01, 2.672e-02, 1.392e-02, -1.762e-02, 8.027e-02, 1.795e-02, 4.128e-02, -1.986e-02, 1.847e-02, -1.562e-01, 6.650e-02, -1.597e-01, -8.866e-02)); + r += mul(s3_7, M4(5.177e-02, -1.843e-01, 6.256e-03, 3.103e-02, -8.057e-03, 1.538e-01, 8.820e-02, 9.421e-02, -1.280e-01, 3.670e-02, 2.720e-03, -7.796e-02, -5.717e-02, -1.237e-01, -1.806e-01, 9.065e-02)); + r += mul(s3_8, M4(-4.682e-02, -1.655e-01, 3.621e-02, 1.126e-02, 1.055e-01, 4.565e-02, -4.206e-02, 1.496e-01, 6.181e-02, 5.189e-02, 6.303e-02, -1.095e-01, -1.832e-02, 1.099e-01, 6.317e-03, -2.335e-01)); + r += V4(-2.548e-03, 2.631e-03, -1.796e-03, 6.472e-05); + return r; +} + +void Pass4(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = Rmp8x8(tid.x) + blockStart; + uint2 size = GetInputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = (gxy + 0.5) * pt; + + V4 s0_0 = l0(-1.0, -1.0); + V4 s0_1 = l0(0.0, -1.0); + V4 s0_2 = l0(1.0, -1.0); + V4 s0_3 = l0(-1.0, 0.0); + V4 s0_4 = l0(0.0, 0.0); + V4 s0_5 = l0(1.0, 0.0); + V4 s0_6 = l0(-1.0, 1.0); + V4 s0_7 = l0(0.0, 1.0); + V4 s0_8 = l0(1.0, 1.0); + V4 s1_0 = -max(-s0_0, 0.0); + V4 s1_1 = -max(-s0_1, 0.0); + V4 s1_2 = -max(-s0_2, 0.0); + V4 s1_3 = -max(-s0_3, 0.0); + V4 s1_4 = -max(-s0_4, 0.0); + V4 s1_5 = -max(-s0_5, 0.0); + V4 s1_6 = -max(-s0_6, 0.0); + V4 s1_7 = -max(-s0_7, 0.0); + V4 s1_8 = -max(-s0_8, 0.0); + s0_0 = max(s0_0, 0.0); + s0_1 = max(s0_1, 0.0); + s0_2 = max(s0_2, 0.0); + s0_3 = max(s0_3, 0.0); + s0_4 = max(s0_4, 0.0); + s0_5 = max(s0_5, 0.0); + s0_6 = max(s0_6, 0.0); + s0_7 = max(s0_7, 0.0); + s0_8 = max(s0_8, 0.0); + + V4 s2_0 = l1(-1.0, -1.0); + V4 s2_1 = l1(0.0, -1.0); + V4 s2_2 = l1(1.0, -1.0); + V4 s2_3 = l1(-1.0, 0.0); + V4 s2_4 = l1(0.0, 0.0); + V4 s2_5 = l1(1.0, 0.0); + V4 s2_6 = l1(-1.0, 1.0); + V4 s2_7 = l1(0.0, 1.0); + V4 s2_8 = l1(1.0, 1.0); + V4 s3_0 = -max(-s2_0, 0.0); + V4 s3_1 = -max(-s2_1, 0.0); + V4 s3_2 = -max(-s2_2, 0.0); + V4 s3_3 = -max(-s2_3, 0.0); + V4 s3_4 = -max(-s2_4, 0.0); + V4 s3_5 = -max(-s2_5, 0.0); + V4 s3_6 = -max(-s2_6, 0.0); + V4 s3_7 = -max(-s2_7, 0.0); + V4 s3_8 = -max(-s2_8, 0.0); + s2_0 = max(s2_0, 0.0); + s2_1 = max(s2_1, 0.0); + s2_2 = max(s2_2, 0.0); + s2_3 = max(s2_3, 0.0); + s2_4 = max(s2_4, 0.0); + s2_5 = max(s2_5, 0.0); + s2_6 = max(s2_6, 0.0); + s2_7 = max(s2_7, 0.0); + s2_8 = max(s2_8, 0.0); + + t2[gxy] = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8); + t3[gxy] = f1(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8); +} + +//!PASS 5 +//!DESC conv4 +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 +//!IN t2, t3 +//!OUT t0, t1 + +#define l0(x, y) V4(O(t2, float2(x, y))) +#define l1(x, y) V4(O(t3, float2(x, y))) + +V4 f0(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8) { + V4 r = 0.0; + r += mul(s0_0, M4(4.108e-02, 4.397e-02, 8.099e-02, 6.707e-02, -7.574e-03, -3.379e-02, -1.189e-01, 2.469e-02, 5.677e-02, 1.936e-01, -2.147e-01, 2.745e-02, -2.339e-02, 1.413e-01, 9.424e-03, -1.532e-02)); + r += mul(s0_1, M4(6.845e-02, 2.566e-01, -3.429e-01, 7.152e-02, 7.412e-03, -1.234e-01, 1.319e-01, -1.394e-01, -1.452e-01, 4.029e-02, -8.428e-02, -9.997e-02, 3.241e-01, 4.534e-01, 1.353e-01, -6.836e-02)); + r += mul(s0_2, M4(8.957e-02, 2.015e-01, -9.037e-02, 4.122e-02, -9.043e-02, -2.070e-01, 1.988e-01, -7.000e-02, -1.122e-02, 3.547e-02, 2.630e-03, -6.662e-03, 1.449e-01, 1.636e-01, -4.471e-02, 7.979e-02)); + r += mul(s0_3, M4(7.138e-02, 3.893e-02, 7.791e-02, 4.093e-02, -2.462e-01, 3.752e-02, 7.621e-03, -4.290e-02, -1.033e-01, 1.806e-01, -8.490e-03, -1.038e-01, 4.361e-02, 7.536e-02, 7.619e-02, -5.600e-02)); + r += mul(s0_4, M4(-2.419e-02, 1.601e-01, 1.182e-01, -6.286e-02, 4.891e-02, 4.624e-02, -9.374e-02, 1.644e-01, -1.319e-01, 3.175e-01, -5.865e-02, -8.696e-02, 5.228e-01, 3.163e-01, -2.053e-01, 1.315e-01)); + r += mul(s0_5, M4(2.643e-02, -1.714e-01, -2.308e-02, 2.050e-02, -1.852e-01, -5.479e-02, 6.061e-02, -1.538e-01, -7.382e-02, -4.387e-04, -5.849e-02, -5.184e-02, 1.197e-01, 5.114e-02, -3.098e-02, 1.580e-02)); + r += mul(s0_6, M4(3.068e-02, 4.721e-04, 3.968e-02, 3.974e-02, 1.701e-02, -2.658e-02, 4.949e-02, -7.216e-02, -1.259e-01, -6.904e-03, 7.295e-02, 1.948e-02, -3.177e-02, -3.845e-03, 2.910e-02, -6.175e-03)); + r += mul(s0_7, M4(3.500e-02, -6.070e-02, -3.675e-02, 5.680e-02, -8.178e-02, -1.257e-01, -1.144e-03, 1.419e-01, 1.017e-01, 6.111e-02, -9.663e-02, 3.145e-01, 1.886e-01, 1.274e-01, -6.735e-02, 1.646e-02)); + r += mul(s0_8, M4(1.100e-02, -1.008e-01, -2.527e-02, 9.051e-02, -2.122e-02, -3.495e-02, 2.186e-02, -3.673e-02, -5.042e-02, -4.490e-02, -6.696e-02, -1.370e-01, 8.272e-02, -1.107e-01, 3.828e-02, 2.405e-02)); + r += mul(s1_0, M4(4.308e-02, -1.587e-02, 5.034e-02, -1.256e-03, -3.630e-03, 9.342e-02, -1.246e-01, 1.407e-03, 2.283e-01, 7.103e-02, 1.496e-01, 1.529e-03, 7.748e-02, -4.744e-02, 1.267e-01, 8.372e-05)); + r += mul(s1_1, M4(-2.667e-01, 4.345e-03, -6.051e-02, 7.748e-04, 5.212e-02, 7.912e-02, -7.013e-02, -4.177e-02, -5.925e-03, 7.525e-03, 1.316e-01, 1.347e-02, -1.046e-01, -3.121e-01, 4.098e-01, -3.102e-02)); + r += mul(s1_2, M4(-7.060e-02, 2.314e-01, -9.224e-02, 2.077e-02, -4.781e-03, -7.540e-02, 7.904e-02, -2.268e-02, 4.577e-02, 1.067e-01, -1.948e-03, 4.846e-02, -2.153e-01, -1.920e-01, 7.195e-02, 5.041e-02)); + r += mul(s1_3, M4(1.662e-02, 3.623e-03, 9.545e-03, 5.119e-04, -1.384e-01, 9.941e-03, 4.085e-02, 1.023e-02, 8.623e-02, -1.836e-02, 1.508e-01, 2.565e-02, 1.250e-01, -6.873e-02, 1.039e-02, 3.096e-02)); + r += mul(s1_4, M4(-3.783e-01, 5.804e-02, 5.745e-02, -1.070e-01, 4.047e-01, 4.005e-01, -2.802e-01, 1.174e-01, -3.899e-01, -2.940e-01, 6.426e-01, -1.456e-01, -2.346e-01, -2.872e-01, 3.019e-02, 2.075e-01)); + r += mul(s1_5, M4(-1.279e-01, -5.204e-02, 1.008e-01, -7.402e-02, -1.272e-01, -2.809e-02, 4.025e-02, -4.037e-02, 1.705e-01, 1.347e-01, 4.935e-02, -5.119e-03, -3.623e-01, -2.111e-01, 2.074e-01, -4.637e-01)); + r += mul(s1_6, M4(3.894e-02, 1.740e-02, 1.167e-02, -8.472e-02, 2.890e-02, -2.453e-02, 4.209e-02, 1.043e-01, 8.521e-02, -9.523e-02, 6.200e-02, 1.241e-02, 3.387e-03, -2.783e-02, -2.927e-02, -2.315e-02)); + r += mul(s1_7, M4(-1.122e-01, -5.652e-02, -4.186e-02, -4.056e-02, 1.860e-02, 8.204e-03, -1.358e-02, 2.056e-01, -6.379e-02, -1.215e-02, 1.135e-01, -2.047e-01, -1.013e-02, 1.194e-02, -1.397e-01, -1.773e-01)); + r += mul(s1_8, M4(-2.283e-03, -1.172e-02, 2.030e-02, -3.740e-03, 6.208e-02, -1.690e-02, 7.899e-03, 1.212e-01, 1.094e-01, -4.111e-02, 4.576e-02, 7.825e-02, -6.665e-02, -9.950e-02, 6.104e-03, -1.272e-01)); + r += mul(s2_0, M4(5.802e-02, -8.129e-02, 7.649e-02, 8.207e-02, -7.115e-02, -9.510e-02, 2.679e-01, 5.415e-02, 3.331e-02, -5.390e-02, 2.535e-01, -6.838e-02, 1.007e-01, -8.470e-02, 1.052e-01, -4.556e-03)); + r += mul(s2_1, M4(-7.709e-02, -2.091e-01, 7.253e-02, 3.751e-02, -3.012e-02, 2.705e-01, 9.391e-02, 5.310e-02, -3.819e-02, -1.502e-01, 3.674e-01, 6.050e-02, 8.643e-02, -3.193e-02, 3.706e-01, -1.272e-01)); + r += mul(s2_2, M4(-8.654e-02, -1.264e-01, 9.612e-02, -5.250e-02, 1.367e-02, 2.760e-02, 3.644e-02, 5.628e-02, -2.305e-02, -3.072e-02, 7.435e-02, 1.310e-01, 1.349e-03, -8.390e-02, 8.076e-02, 9.622e-02)); + r += mul(s2_3, M4(2.535e-02, 3.247e-02, -3.928e-02, 1.713e-02, -1.630e-01, -4.284e-02, -8.256e-02, 2.143e-01, 1.523e-01, -1.190e-01, 1.579e-01, 1.972e-02, -1.024e-01, -3.809e-02, -1.194e-01, 1.843e-02)); + r += mul(s2_4, M4(-2.534e-01, 4.147e-03, 3.652e-02, -2.514e-01, -4.926e-02, 1.540e-01, -6.906e-02, -2.077e-01, -4.119e-02, 6.231e-01, -2.267e-01, -1.284e-01, -1.211e-01, 1.260e-01, -3.930e-02, 1.480e-01)); + r += mul(s2_5, M4(-1.185e-01, -1.450e-01, 5.094e-02, -1.236e-01, 5.897e-02, 3.769e-02, 4.215e-02, 4.909e-02, -1.146e-01, 1.742e-02, 2.068e-01, 1.393e-01, 7.795e-02, 1.028e-01, 4.501e-02, 1.306e-01)); + r += mul(s2_6, M4(7.121e-03, 1.788e-02, 8.609e-03, 4.098e-02, 9.014e-02, 4.066e-02, -4.107e-02, -5.454e-02, 8.660e-02, 3.154e-02, 1.323e-01, 2.997e-02, 1.011e-02, -7.761e-02, 8.035e-02, 1.981e-02)); + r += mul(s2_7, M4(-2.280e-02, -5.927e-02, -4.650e-02, -2.669e-02, 1.326e-02, -6.787e-02, -9.816e-02, -2.418e-01, -2.725e-02, -2.671e-02, 6.625e-02, 1.176e-01, -1.511e-01, -8.170e-02, 8.073e-02, -4.317e-02)); + r += mul(s2_8, M4(2.503e-02, -5.313e-02, -5.163e-02, -1.025e-01, 3.311e-03, 5.522e-02, -2.906e-02, 6.220e-02, -1.606e-01, -9.050e-02, 1.435e-01, -7.260e-02, -1.731e-03, -3.100e-02, 6.860e-02, 5.068e-02)); + r += mul(s3_0, M4(2.504e-01, 3.584e-02, 4.543e-02, 5.108e-03, 1.660e-01, 3.755e-02, 2.497e-02, 3.799e-02, 1.946e-01, 6.233e-02, 1.666e-02, 2.337e-02, 4.533e-01, -1.371e-01, -3.372e-01, 9.264e-02)); + r += mul(s3_1, M4(-2.139e-01, -3.254e-01, 2.315e-01, 1.407e-01, -4.157e-02, 1.958e-01, -6.251e-03, 2.082e-03, -3.687e-02, 7.719e-02, 8.827e-02, 1.692e-02, 2.429e-03, -4.380e-02, -1.665e-01, -4.293e-01)); + r += mul(s3_2, M4(2.632e-02, -4.644e-01, 3.778e-01, 1.915e-01, 1.765e-02, 9.826e-02, -5.215e-02, 6.615e-02, 4.066e-02, 8.500e-02, -6.289e-02, 1.127e-01, 4.373e-02, -2.529e-02, -3.463e-03, 1.561e-02)); + r += mul(s3_3, M4(1.812e-01, 3.307e-02, -1.222e-01, -1.056e-01, 3.178e-01, -6.752e-02, -4.926e-02, 9.877e-02, -1.413e-02, 2.520e-02, 2.318e-02, -5.239e-02, -1.853e-02, 1.247e-01, -2.800e-01, -4.267e-02)); + r += mul(s3_4, M4(-2.170e-01, 9.658e-02, -2.656e-02, -3.532e-01, -2.667e-01, -1.484e-01, 1.986e-01, 3.970e-01, -9.642e-02, 3.251e-01, -4.856e-02, -1.348e-01, -2.365e-01, -7.690e-02, -4.313e-02, -3.293e-01)); + r += mul(s3_5, M4(3.116e-01, 3.575e-01, -1.439e-01, -2.788e-01, 1.682e-01, 3.373e-02, 1.132e-03, -2.062e-02, 2.790e-02, 4.237e-02, 6.550e-02, -7.303e-02, 1.220e-01, 4.608e-02, 2.672e-02, -6.588e-02)); + r += mul(s3_6, M4(1.361e-01, 1.959e-02, -6.558e-02, -5.488e-02, 1.780e-01, 1.400e-02, -8.174e-02, 3.617e-02, 2.232e-02, 1.570e-02, 2.935e-02, 1.595e-02, 4.166e-02, 1.395e-02, -7.261e-02, 3.343e-02)); + r += mul(s3_7, M4(-6.674e-03, -7.837e-02, 2.041e-02, -7.274e-02, -1.975e-01, -1.022e-01, 3.521e-02, -2.381e-01, 4.452e-02, -4.855e-02, -2.357e-02, 4.965e-02, -2.079e-03, -5.777e-02, -4.211e-02, -1.147e-01)); + r += mul(s3_8, M4(1.852e-02, -4.532e-02, 3.780e-02, -2.960e-02, 4.216e-03, 7.749e-02, -2.922e-03, 9.211e-02, 1.465e-02, 1.361e-03, -5.097e-02, 2.529e-02, 6.341e-02, 1.534e-02, -2.929e-02, 6.519e-02)); + r += V4(-1.083e-02, 2.841e-03, 4.056e-03, -3.056e-03); + return r; +} + +V4 f1(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-6.130e-04, -7.656e-02, 1.752e-01, 1.022e-01, 5.050e-03, -7.227e-02, 4.673e-03, -1.316e-01, -8.276e-02, -2.565e-02, 1.057e-01, 4.770e-02, -6.372e-02, -9.303e-02, 3.416e-02, 2.778e-02)); + r += mul(s0_1, M4(-1.171e-01, 7.738e-02, 1.872e-01, 2.325e-02, 5.726e-02, 6.929e-02, -1.247e-01, -3.376e-02, -1.218e-01, 1.106e-01, -9.175e-02, 2.578e-02, -1.139e-01, -5.745e-02, -5.009e-03, 1.082e-01)); + r += mul(s0_2, M4(-1.007e-01, 7.851e-03, 2.006e-02, 1.214e-01, 8.999e-02, -2.452e-02, -6.921e-02, -1.470e-01, -2.441e-02, -6.812e-02, -3.163e-02, -3.730e-02, -9.304e-02, -6.580e-02, -3.085e-02, 4.557e-02)); + r += mul(s0_3, M4(2.147e-02, 2.392e-02, 6.809e-02, 5.823e-02, -5.266e-02, -6.499e-02, -1.937e-01, -1.774e-01, -7.026e-02, 5.565e-02, 2.104e-01, 9.940e-02, -6.656e-02, -5.599e-02, -9.527e-02, -2.195e-02)); + r += mul(s0_4, M4(-1.314e-01, -2.100e-02, -8.236e-02, -5.332e-03, -8.806e-02, -1.931e-02, -3.184e-02, 1.283e-01, -1.044e-01, -9.658e-02, -3.773e-02, 4.251e-01, -6.699e-01, -2.441e-01, 2.817e-01, 3.949e-02)); + r += mul(s0_5, M4(-6.834e-02, 1.218e-01, -6.189e-02, -1.587e-01, -9.935e-03, 4.393e-02, -2.135e-01, -2.161e-01, 5.552e-03, 5.016e-02, 3.099e-02, -1.251e-01, 2.489e-02, -4.931e-01, 5.038e-03, -8.030e-03)); + r += mul(s0_6, M4(3.225e-02, -2.105e-02, 3.418e-03, 1.529e-02, -3.405e-02, 3.200e-02, -1.592e-01, -9.388e-02, 6.723e-02, 3.172e-02, -4.816e-02, 1.309e-01, -1.431e-02, -7.290e-02, -9.302e-02, -8.654e-02)); + r += mul(s0_7, M4(4.884e-02, 1.260e-01, 6.116e-02, 8.572e-02, 1.022e-01, 2.291e-02, -7.667e-02, -1.023e-01, -1.076e-01, 2.182e-01, 1.787e-01, 4.600e-01, 4.603e-02, 4.013e-02, -1.248e-01, 1.515e-02)); + r += mul(s0_8, M4(2.182e-02, 1.733e-01, 1.738e-01, 1.317e-01, -3.960e-02, 1.821e-02, -6.237e-02, -3.957e-02, -8.466e-02, 3.118e-01, -1.109e-03, 6.180e-02, 1.087e-01, 1.219e-01, 1.164e-01, 7.167e-02)); + r += mul(s1_0, M4(-5.654e-03, -5.632e-02, -1.110e-01, -8.149e-02, -4.162e-02, -3.990e-02, 7.565e-02, -5.569e-02, 5.983e-02, 3.346e-02, 1.598e-02, 3.390e-02, 7.153e-02, 7.041e-03, -1.990e-02, 1.044e-01)); + r += mul(s1_1, M4(-1.193e-02, -1.392e-01, -6.353e-02, -5.281e-02, -3.663e-02, 4.147e-02, -1.629e-01, -1.972e-02, 4.507e-02, 6.254e-02, -2.663e-02, -2.552e-02, 2.680e-01, 6.236e-02, -5.901e-02, -1.626e-02)); + r += mul(s1_2, M4(-1.057e-01, -3.432e-02, 5.563e-02, 1.240e-01, 1.598e-02, -3.795e-02, -1.715e-02, -2.897e-03, 1.671e-02, 7.545e-04, 3.111e-02, 5.136e-02, 1.207e-01, -1.587e-02, 7.899e-02, 3.483e-02)); + r += mul(s1_3, M4(-1.056e-02, 8.004e-03, -1.297e-02, -2.314e-02, -4.324e-02, -1.453e-02, -3.458e-02, 7.711e-03, 9.450e-02, -7.279e-03, -1.025e-01, -2.236e-01, 5.674e-02, 6.152e-02, 7.612e-02, 8.618e-03)); + r += mul(s1_4, M4(-1.020e-01, -1.119e-01, -4.415e-01, -4.113e-01, -2.564e-01, -8.898e-02, 2.198e-01, 3.662e-01, 3.076e-01, -3.531e-01, -3.432e-02, 2.568e-01, -1.218e-01, 5.504e-02, 2.069e-01, -6.714e-01)); + r += mul(s1_5, M4(-5.354e-02, 5.475e-02, -3.443e-01, -2.398e-01, -2.952e-02, 1.826e-02, -3.823e-02, -9.658e-02, -1.836e-02, -7.218e-02, 5.875e-02, -1.017e-01, 2.128e-01, -2.690e-01, -1.918e-01, -2.150e-01)); + r += mul(s1_6, M4(9.334e-04, 1.622e-02, 3.458e-02, 6.131e-02, 2.779e-02, 4.021e-03, 4.950e-02, -1.843e-02, 7.233e-02, 2.085e-03, -1.719e-02, 2.032e-02, 4.844e-03, -5.081e-03, 2.610e-02, 1.633e-02)); + r += mul(s1_7, M4(-3.670e-02, 5.013e-02, -6.773e-02, -6.609e-02, 1.170e-01, 3.290e-02, -9.547e-02, -2.685e-02, -1.327e-01, -3.630e-03, -2.409e-01, -3.083e-01, 3.003e-02, 1.812e-01, 1.606e-01, 1.490e-01)); + r += mul(s1_8, M4(-4.339e-02, 3.640e-03, -4.089e-02, -2.330e-02, 2.747e-02, 1.597e-01, 6.442e-03, 1.263e-01, -1.345e-02, 7.396e-02, 1.475e-02, -2.817e-03, -3.443e-02, 1.270e-01, 8.616e-02, 2.625e-02)); + r += mul(s2_0, M4(5.066e-02, 8.901e-02, -5.357e-02, -3.008e-04, 6.639e-02, 4.513e-02, -7.859e-02, 1.288e-01, 1.788e-02, 3.146e-03, -1.870e-01, 8.331e-03, 8.237e-02, 1.556e-02, -4.060e-02, -3.354e-02)); + r += mul(s2_1, M4(1.211e-01, -1.958e-02, -1.821e-01, -2.678e-01, 5.985e-02, -3.434e-02, -1.473e-04, -4.211e-02, 9.400e-02, -1.979e-01, -1.631e-01, -1.431e-01, 1.288e-01, 1.301e-01, 7.110e-02, 1.196e-01)); + r += mul(s2_2, M4(9.777e-02, 7.517e-02, 5.213e-02, 2.601e-02, 6.137e-04, 2.892e-02, -3.826e-02, 3.445e-02, 2.244e-02, -2.289e-01, -2.827e-02, -1.499e-01, -1.293e-02, -1.242e-01, 7.029e-03, 3.803e-02)); + r += mul(s2_3, M4(-7.883e-03, 3.989e-02, 2.103e-01, 9.354e-02, -2.803e-02, -2.155e-02, 1.230e-01, -2.510e-01, -4.577e-02, -8.206e-02, -4.634e-02, -5.687e-02, -4.763e-02, 8.117e-04, 4.716e-02, -6.873e-02)); + r += mul(s2_4, M4(5.074e-02, -9.310e-02, -3.064e-01, -2.342e-01, -3.624e-01, 1.487e-01, -1.847e-01, -1.638e-01, -2.098e-01, -2.940e-01, -7.838e-02, -3.450e-01, -1.351e-01, 1.343e-01, -2.153e-01, -3.085e-01)); + r += mul(s2_5, M4(-9.094e-02, 1.096e-01, -1.252e-01, -1.611e-01, -1.475e-02, -1.251e-01, -3.660e-02, -9.706e-02, 8.987e-02, -2.422e-01, -1.290e-01, -8.441e-02, 1.325e-01, -1.979e-01, 1.195e-01, 1.066e-01)); + r += mul(s2_6, M4(3.450e-02, -1.976e-03, -2.692e-02, 2.470e-02, 4.134e-02, 1.106e-01, 5.587e-03, 1.203e-01, 3.348e-03, -1.976e-01, -6.304e-03, -9.345e-02, 4.034e-03, -2.611e-02, -2.223e-02, -4.153e-02)); + r += mul(s2_7, M4(-1.626e-02, 9.840e-02, -8.620e-03, -1.479e-02, -1.601e-01, -1.274e-01, -1.019e-01, -1.193e-01, 1.353e-01, -1.601e-01, -3.038e-01, -2.066e-01, 4.585e-02, -7.649e-02, -1.581e-01, -1.694e-01)); + r += mul(s2_8, M4(-6.049e-02, -7.053e-02, 6.931e-03, -1.654e-02, 1.932e-02, 2.112e-02, 6.621e-02, 7.266e-02, -5.272e-02, -5.286e-02, -2.885e-01, -2.012e-01, 5.525e-02, -1.721e-02, -4.575e-02, -9.210e-04)); + r += mul(s3_0, M4(-2.271e-02, 2.668e-02, -1.480e-01, -2.625e-02, 9.554e-03, 6.925e-02, -1.252e-01, 2.866e-02, 1.177e-02, -4.071e-02, -2.070e-02, -2.731e-02, 8.067e-02, 1.324e-01, 5.591e-02, 1.092e-01)); + r += mul(s3_1, M4(2.863e-01, -3.245e-02, -2.369e-01, -2.863e-01, -2.117e-03, -4.875e-02, 3.885e-02, -1.088e-01, 3.018e-02, -7.956e-02, 1.067e-01, 4.768e-03, 2.319e-01, 4.443e-01, 1.081e-01, -2.955e-01)); + r += mul(s3_2, M4(2.579e-01, -1.163e-01, -4.524e-02, 1.974e-01, -3.204e-02, 2.183e-02, -9.418e-03, 1.514e-03, -7.422e-02, -8.652e-02, -1.831e-02, 7.031e-02, 1.678e-02, -6.474e-02, 3.298e-03, 1.898e-01)); + r += mul(s3_3, M4(-1.287e-01, 6.977e-02, 2.034e-01, 1.203e-01, -1.577e-01, -1.159e-01, 5.411e-01, 1.079e-01, -5.869e-02, -9.771e-02, 4.457e-02, 1.618e-02, -1.096e-01, 7.700e-02, 1.746e-01, -4.051e-02)); + r += mul(s3_4, M4(-2.308e-01, -1.267e-01, -1.459e-01, 5.467e-03, -1.625e-01, 2.188e-01, -1.188e-01, -9.377e-03, -2.440e-01, -8.329e-02, -1.366e-01, 4.782e-02, -3.538e-01, 1.737e-01, -1.531e-01, -1.443e-01)); + r += mul(s3_5, M4(-4.365e-01, 5.178e-01, -2.166e-01, -2.063e-01, 3.981e-02, -1.054e-02, 5.701e-03, -4.639e-02, 4.680e-03, 2.433e-02, -3.099e-02, -1.344e-01, -4.936e-03, -2.510e-02, 9.593e-02, 6.336e-03)); + r += mul(s3_6, M4(-9.464e-03, 6.306e-02, 9.266e-02, 1.239e-01, 9.411e-02, -8.883e-03, 1.447e-02, 3.888e-02, 3.209e-03, -4.987e-02, -7.248e-02, -4.528e-02, 3.389e-02, 3.453e-02, 4.363e-02, -1.139e-02)); + r += mul(s3_7, M4(-1.101e-01, -7.831e-02, -6.882e-02, -4.597e-02, -2.022e-01, -1.681e-01, -8.124e-02, -1.088e-01, 7.872e-02, 5.759e-02, 6.814e-02, 9.876e-02, -3.474e-02, 5.673e-02, 1.178e-01, 1.018e-01)); + r += mul(s3_8, M4(-4.424e-02, -1.753e-01, -1.880e-01, -1.999e-01, 1.189e-02, 2.421e-02, 7.007e-03, -2.655e-02, -3.715e-02, 6.751e-02, -7.333e-02, -7.710e-02, 2.700e-02, 2.248e-02, 9.982e-02, 5.511e-02)); + r += V4(-5.051e-03, -7.374e-04, -9.013e-03, -1.041e-02); + return r; +} + +void Pass5(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = Rmp8x8(tid.x) + blockStart; + uint2 size = GetInputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = (gxy + 0.5) * pt; + + V4 s0_0 = l0(-1.0, -1.0); + V4 s0_1 = l0(0.0, -1.0); + V4 s0_2 = l0(1.0, -1.0); + V4 s0_3 = l0(-1.0, 0.0); + V4 s0_4 = l0(0.0, 0.0); + V4 s0_5 = l0(1.0, 0.0); + V4 s0_6 = l0(-1.0, 1.0); + V4 s0_7 = l0(0.0, 1.0); + V4 s0_8 = l0(1.0, 1.0); + V4 s1_0 = -max(-s0_0, 0.0); + V4 s1_1 = -max(-s0_1, 0.0); + V4 s1_2 = -max(-s0_2, 0.0); + V4 s1_3 = -max(-s0_3, 0.0); + V4 s1_4 = -max(-s0_4, 0.0); + V4 s1_5 = -max(-s0_5, 0.0); + V4 s1_6 = -max(-s0_6, 0.0); + V4 s1_7 = -max(-s0_7, 0.0); + V4 s1_8 = -max(-s0_8, 0.0); + s0_0 = max(s0_0, 0.0); + s0_1 = max(s0_1, 0.0); + s0_2 = max(s0_2, 0.0); + s0_3 = max(s0_3, 0.0); + s0_4 = max(s0_4, 0.0); + s0_5 = max(s0_5, 0.0); + s0_6 = max(s0_6, 0.0); + s0_7 = max(s0_7, 0.0); + s0_8 = max(s0_8, 0.0); + + V4 s2_0 = l1(-1.0, -1.0); + V4 s2_1 = l1(0.0, -1.0); + V4 s2_2 = l1(1.0, -1.0); + V4 s2_3 = l1(-1.0, 0.0); + V4 s2_4 = l1(0.0, 0.0); + V4 s2_5 = l1(1.0, 0.0); + V4 s2_6 = l1(-1.0, 1.0); + V4 s2_7 = l1(0.0, 1.0); + V4 s2_8 = l1(1.0, 1.0); + V4 s3_0 = -max(-s2_0, 0.0); + V4 s3_1 = -max(-s2_1, 0.0); + V4 s3_2 = -max(-s2_2, 0.0); + V4 s3_3 = -max(-s2_3, 0.0); + V4 s3_4 = -max(-s2_4, 0.0); + V4 s3_5 = -max(-s2_5, 0.0); + V4 s3_6 = -max(-s2_6, 0.0); + V4 s3_7 = -max(-s2_7, 0.0); + V4 s3_8 = -max(-s2_8, 0.0); + s2_0 = max(s2_0, 0.0); + s2_1 = max(s2_1, 0.0); + s2_2 = max(s2_2, 0.0); + s2_3 = max(s2_3, 0.0); + s2_4 = max(s2_4, 0.0); + s2_5 = max(s2_5, 0.0); + s2_6 = max(s2_6, 0.0); + s2_7 = max(s2_7, 0.0); + s2_8 = max(s2_8, 0.0); + + t0[gxy] = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8); + t1[gxy] = f1(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8); +} + +//!PASS 6 +//!DESC conv5 +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 +//!IN t0, t1 +//!OUT t2, t3 + +#define l0(x, y) V4(O(t0, float2(x, y))) +#define l1(x, y) V4(O(t1, float2(x, y))) + +V4 f0(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-3.543e-02, 7.950e-02, 4.966e-02, -1.433e-03, 8.905e-03, -6.500e-02, 3.529e-02, -6.468e-03, -9.021e-04, -2.890e-03, 2.941e-02, 1.722e-02, -9.993e-02, -4.554e-02, 1.116e-01, 4.605e-03)); + r += mul(s0_1, M4(-1.089e-01, -6.759e-02, 5.507e-02, 2.826e-02, 3.102e-02, 4.981e-03, -6.957e-03, -2.970e-02, 3.893e-02, -1.985e-02, 3.482e-03, -3.115e-03, 6.911e-02, -1.665e-01, -3.388e-02, -1.252e-02)); + r += mul(s0_2, M4(1.046e-01, 2.638e-02, -8.177e-02, -9.476e-02, -2.313e-02, 9.290e-03, -1.408e-03, 4.678e-02, -1.106e-01, 4.373e-02, 4.853e-02, 4.161e-02, 2.201e-02, -4.520e-02, 1.641e-02, 1.639e-03)); + r += mul(s0_3, M4(-3.788e-02, -1.936e-01, 4.114e-02, 1.067e-02, 2.481e-02, 1.257e-02, -2.408e-02, 9.182e-02, -1.143e-02, -2.779e-02, -5.009e-02, -3.573e-02, -4.170e-01, -3.232e-01, 1.870e-01, 1.240e-02)); + r += mul(s0_4, M4(-2.012e-01, 3.719e-03, 4.258e-01, 1.357e-01, 1.017e-01, -9.143e-02, 1.062e-01, -2.157e-01, 2.065e-01, -1.497e-01, 2.811e-01, -1.238e-01, 4.285e-01, -1.183e-03, -2.368e-01, 3.175e-01)); + r += mul(s0_5, M4(2.946e-01, 5.902e-02, 3.874e-02, -9.653e-02, -9.581e-02, 2.797e-02, -5.432e-02, -3.276e-03, -2.409e-01, 4.022e-02, 6.466e-03, -1.014e-01, 8.373e-02, 1.670e-02, 4.462e-02, 8.036e-02)); + r += mul(s0_6, M4(-8.663e-02, -2.484e-02, 3.960e-02, -4.742e-03, 5.179e-02, 8.916e-02, -2.668e-02, -2.848e-02, 9.887e-02, 1.283e-02, -2.283e-02, -8.960e-02, -1.223e-01, -1.672e-02, 6.586e-02, 2.669e-02)); + r += mul(s0_7, M4(-2.569e-01, 1.932e-03, 1.442e-01, -1.947e-04, 1.002e-01, 9.362e-02, 1.206e-01, 5.726e-02, -3.269e-02, 1.274e-01, 7.910e-02, -1.930e-01, 9.277e-02, 2.994e-02, -4.800e-02, 8.016e-02)); + r += mul(s0_8, M4(9.842e-02, 1.108e-01, -1.303e-01, -3.840e-01, -4.456e-02, -6.372e-02, -6.192e-02, 4.026e-02, -8.011e-02, -7.656e-02, -2.155e-02, 1.167e-02, 4.969e-02, -8.967e-03, -1.639e-02, 6.565e-02)); + r += mul(s1_0, M4(-3.505e-03, 5.798e-02, -1.063e-02, 1.098e-02, -5.275e-02, -1.071e-02, 9.760e-02, -4.337e-02, 2.637e-02, -4.918e-02, 1.090e-03, -1.405e-02, -6.812e-02, -5.049e-02, 1.111e-01, -3.104e-02)); + r += mul(s1_1, M4(-6.327e-02, 8.466e-03, 1.248e-01, 2.211e-03, 7.483e-03, 6.452e-02, -1.087e-01, 3.269e-02, 2.075e-02, -1.408e-01, 3.009e-02, -4.146e-02, 1.034e-01, 1.109e-01, -9.252e-02, -1.611e-02)); + r += mul(s1_2, M4(7.447e-02, 4.614e-02, -6.169e-02, -2.029e-02, -7.331e-02, -3.250e-02, 7.219e-02, 1.042e-02, -2.912e-02, 4.549e-02, -1.047e-02, 2.094e-03, -5.769e-02, -1.615e-02, 8.071e-03, 3.771e-02)); + r += mul(s1_3, M4(-4.766e-02, -1.712e-01, 8.735e-02, -5.360e-02, -1.975e-01, -2.133e-01, 8.035e-02, 5.819e-02, -7.093e-02, -2.900e-01, -3.236e-02, -2.934e-02, -3.232e-01, -1.972e-01, 2.268e-01, 1.010e-01)); + r += mul(s1_4, M4(-2.210e-01, -1.157e-01, 2.817e-01, 5.840e-02, 2.098e-01, -8.874e-02, 7.924e-02, -2.510e-01, 1.030e-01, 1.279e-01, 6.653e-02, 1.219e-01, 4.141e-01, 2.998e-01, -9.834e-02, 1.607e-01)); + r += mul(s1_5, M4(1.294e-01, -1.988e-02, -1.361e-01, 2.103e-01, -1.155e-01, -2.235e-02, 6.869e-02, -8.075e-02, -4.372e-03, 5.632e-02, -7.754e-02, 7.795e-02, -1.595e-01, -1.241e-01, -2.547e-03, 9.130e-02)); + r += mul(s1_6, M4(-4.901e-02, -4.760e-02, 1.173e-02, -6.623e-02, -2.803e-01, -1.136e-01, 2.054e-01, -7.351e-03, -1.322e-01, -2.660e-01, 3.918e-02, -8.464e-02, -1.010e-01, 3.265e-02, 6.085e-02, 7.092e-02)); + r += mul(s1_7, M4(-1.737e-01, 5.872e-02, 1.029e-01, -1.338e-01, 1.971e-02, -1.182e-03, 6.404e-02, 1.520e-01, 2.388e-01, -3.107e-02, -1.075e-01, -1.224e-01, 1.625e-01, -7.233e-03, -6.741e-02, 2.098e-01)); + r += mul(s1_8, M4(1.496e-01, 7.058e-02, -7.112e-02, -7.923e-03, -8.993e-02, -9.366e-02, -1.300e-02, 1.920e-01, 1.403e-01, 1.831e-01, 1.431e-01, -2.287e-01, 2.402e-02, 5.445e-03, 2.004e-02, 4.421e-02)); + r += mul(s2_0, M4(2.048e-02, -2.281e-01, -6.323e-03, -3.437e-02, -4.873e-03, -1.313e-01, 9.471e-02, -1.031e-01, 8.325e-02, 9.654e-02, -6.140e-02, 3.037e-02, -1.616e-01, -3.013e-02, 1.615e-01, 6.894e-03)); + r += mul(s2_1, M4(-1.950e-01, 3.048e-01, -1.785e-01, 1.902e-01, 9.630e-02, 2.068e-01, -1.684e-01, -1.342e-01, 4.692e-02, 6.126e-02, -7.899e-02, 9.330e-02, 3.255e-02, 3.098e-01, -2.201e-01, 4.671e-02)); + r += mul(s2_2, M4(1.306e-01, 5.318e-02, -5.240e-02, 2.361e-02, 2.423e-02, 2.361e-03, -1.695e-02, 1.569e-02, -7.172e-02, -3.968e-02, 1.209e-01, 7.186e-02, 5.879e-02, 1.591e-02, -1.891e-02, -2.890e-02)); + r += mul(s2_3, M4(2.569e-01, 4.588e-01, -2.766e-01, 7.439e-02, -2.793e-01, -1.519e-01, 7.798e-02, 2.029e-02, 2.249e-01, 2.073e-01, -2.353e-01, 3.969e-02, -3.564e-01, -1.221e-01, 2.605e-01, -1.442e-02)); + r += mul(s2_4, M4(-5.101e-01, -1.367e-01, 1.769e-02, -8.440e-01, 5.105e-02, 1.282e-01, 7.769e-02, 9.786e-02, -2.935e-02, 8.851e-02, 6.132e-01, 3.093e-01, -1.629e-01, -7.917e-02, -3.350e-01, 1.921e-01)); + r += mul(s2_5, M4(1.598e-01, 7.845e-02, 1.064e-01, 2.970e-03, 3.521e-02, 5.990e-02, 7.355e-03, 2.954e-02, -1.850e-01, 2.212e-01, -3.574e-02, -5.264e-01, 2.390e-01, 2.798e-01, 7.917e-03, -4.841e-02)); + r += mul(s2_6, M4(1.539e-01, 6.461e-02, -2.001e-02, 8.195e-03, -1.185e-01, -7.702e-02, 4.283e-02, -1.233e-01, 1.809e-01, 1.459e-02, -5.636e-02, -1.972e-02, -9.290e-02, 1.186e-01, 3.799e-02, 6.921e-02)); + r += mul(s2_7, M4(-1.350e-01, -1.079e-01, 3.874e-02, -2.217e-02, 7.493e-02, 1.194e-01, 3.591e-02, -1.228e-01, -4.547e-02, -2.423e-02, 6.285e-02, -9.256e-02, 6.649e-02, 6.761e-03, -1.018e-01, 1.880e-01)); + r += mul(s2_8, M4(1.154e-02, 5.337e-03, -8.154e-03, -4.658e-02, 5.640e-03, -1.535e-02, 3.469e-02, -3.478e-02, -1.819e-01, -1.338e-01, 2.321e-02, 2.736e-01, 1.002e-01, 5.359e-02, 5.718e-02, -6.956e-03)); + r += mul(s3_0, M4(6.467e-02, -1.265e-01, -5.698e-03, -7.443e-03, -1.703e-02, 4.604e-02, 2.747e-02, -1.545e-02, 1.014e-01, 2.919e-02, -5.269e-02, 4.818e-02, -8.014e-02, 5.749e-02, 3.776e-02, 7.501e-03)); + r += mul(s3_1, M4(-1.627e-01, -3.031e-02, 3.391e-02, 4.149e-05, 6.013e-02, 8.038e-02, 1.545e-02, 1.997e-02, -1.785e-02, -3.410e-01, 1.219e-01, 1.513e-02, -7.337e-02, -2.446e-02, -7.831e-03, 2.064e-02)); + r += mul(s3_2, M4(5.945e-02, -7.145e-02, -4.252e-03, -1.227e-02, -4.884e-02, -2.366e-02, 4.214e-04, 4.615e-02, -3.871e-02, 3.228e-02, -7.452e-03, 3.501e-02, 9.101e-02, 3.086e-02, -8.161e-02, 4.753e-02)); + r += mul(s3_3, M4(1.265e-01, 5.028e-02, -2.140e-02, 6.421e-02, -4.819e-03, -1.641e-01, -3.700e-02, -6.100e-02, 1.873e-01, 2.147e-01, -2.009e-01, 1.324e-03, -7.643e-02, -1.167e-01, 1.724e-01, 2.491e-02)); + r += mul(s3_4, M4(-4.396e-01, -8.640e-02, -1.586e-01, -1.634e-01, 2.135e-01, 2.594e-01, 3.525e-01, -4.384e-01, 1.224e-01, 1.559e-02, 9.960e-02, -4.443e-02, -2.066e-01, 5.257e-02, -1.255e-01, 1.136e-01)); + r += mul(s3_5, M4(1.476e-01, 1.642e-02, 8.563e-02, -2.731e-02, -9.205e-02, -8.172e-03, -9.883e-03, 4.732e-02, -1.877e-01, -4.119e-02, -3.235e-02, 1.874e-02, 1.632e-01, 3.157e-02, -7.976e-02, 6.713e-02)); + r += mul(s3_6, M4(5.719e-02, 2.829e-03, -3.028e-02, -3.731e-02, -1.195e-01, -2.658e-02, 7.224e-02, -6.579e-03, 7.836e-02, -5.193e-02, -2.216e-02, -3.423e-02, -7.006e-02, 1.208e-02, 9.662e-04, 3.652e-03)); + r += mul(s3_7, M4(-1.694e-01, 5.317e-02, 1.652e-01, -4.481e-02, 7.641e-04, 2.080e-02, 1.120e-02, 3.510e-02, 7.017e-03, -1.044e-01, 4.685e-03, 4.015e-02, 1.265e-01, 1.437e-01, -9.223e-02, -6.538e-02)); + r += mul(s3_8, M4(2.532e-02, -4.911e-02, -7.204e-02, -3.564e-02, 9.314e-03, 5.000e-02, 8.495e-02, -5.174e-02, -1.079e-01, -5.239e-02, -3.180e-02, 5.520e-02, 2.376e-02, 3.436e-02, 7.244e-02, -9.291e-02)); + r += V4(-8.722e-04, 4.321e-03, -2.282e-03, 5.775e-04); + return r; +} + +V4 f1(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8) { + V4 r = 0.0; + r += mul(s0_0, M4(7.753e-02, -5.337e-02, -2.432e-02, 3.644e-02, 1.594e-03, 2.936e-02, -2.457e-02, 9.446e-03, -1.292e-03, 1.233e-02, -3.333e-02, -1.896e-02, 2.404e-02, -8.731e-04, -1.313e-02, -5.993e-02)); + r += mul(s0_1, M4(-1.016e-03, 1.421e-01, -1.392e-01, -8.620e-02, 2.236e-02, -5.276e-02, -9.275e-03, 1.497e-01, 5.114e-02, 1.802e-01, 2.670e-02, 1.683e-02, -8.748e-04, -1.293e-01, 2.992e-01, 2.780e-01)); + r += mul(s0_2, M4(-7.056e-02, 2.695e-02, -1.473e-01, 3.070e-02, -3.678e-02, 5.208e-02, 2.452e-03, -5.092e-02, -8.107e-02, 1.028e-01, -9.323e-02, -1.948e-01, -1.106e-01, -1.169e-01, 6.257e-02, 4.575e-02)); + r += mul(s0_3, M4(-1.961e-01, 7.539e-02, -8.065e-02, -6.256e-02, -1.814e-01, 8.188e-02, -1.757e-02, -9.656e-02, -4.720e-02, -3.039e-02, 1.786e-03, -2.460e-02, 6.616e-02, 1.227e-02, -1.082e-01, 2.060e-01)); + r += mul(s0_4, M4(1.100e-02, 1.185e-01, -3.507e-01, 1.974e-01, 8.355e-03, -1.227e-01, 3.761e-01, 3.390e-01, 8.516e-04, -1.056e-01, 2.269e-01, -2.299e-01, -3.527e-01, -3.526e-01, -7.157e-02, 6.354e-02)); + r += mul(s0_5, M4(-9.008e-02, 4.770e-01, -9.990e-02, 9.218e-02, 7.512e-02, -1.304e-01, 9.839e-02, 9.985e-03, 1.453e-01, -3.162e-02, -4.388e-02, 7.887e-02, 3.180e-03, -9.248e-02, 1.566e-02, 5.009e-03)); + r += mul(s0_6, M4(3.981e-02, -3.872e-02, 6.997e-02, 2.283e-02, -3.285e-02, 5.390e-02, -2.957e-02, -8.100e-02, 1.132e-02, 6.093e-02, -5.962e-02, 2.166e-02, -3.606e-02, -1.190e-03, 4.312e-03, 4.615e-02)); + r += mul(s0_7, M4(-2.725e-01, 3.443e-02, 9.929e-02, -9.112e-03, 4.324e-02, 1.421e-01, 2.795e-02, 1.846e-03, 1.279e-01, -1.918e-02, -4.382e-02, 1.812e-01, -4.804e-02, 9.204e-04, -8.716e-02, 4.059e-02)); + r += mul(s0_8, M4(4.227e-02, -1.239e-01, -6.485e-02, 8.795e-02, 7.347e-02, 1.209e-01, 3.079e-03, -5.941e-02, -1.296e-01, 1.148e-01, -5.571e-02, -1.353e-01, -7.367e-02, -1.618e-02, 6.989e-03, -2.546e-02)); + r += mul(s1_0, M4(-6.146e-02, -4.772e-02, -9.417e-03, -4.165e-02, 2.001e-01, 4.540e-02, -4.097e-02, 3.659e-02, 2.014e-02, -6.690e-02, 4.933e-02, 8.231e-02, -9.543e-03, -3.356e-02, -2.012e-02, -5.326e-02)); + r += mul(s1_1, M4(1.254e-01, 1.032e-01, -7.584e-02, -1.386e-01, -1.665e-01, -4.887e-03, 3.620e-02, 6.679e-02, 3.288e-02, 3.521e-03, 4.558e-02, 1.208e-01, 5.012e-02, 4.727e-02, -2.972e-02, 1.239e-01)); + r += mul(s1_2, M4(1.979e-03, -9.131e-03, 1.800e-02, 3.867e-02, 2.082e-02, -2.502e-02, -9.056e-02, -9.712e-02, -8.861e-02, 4.792e-02, -2.188e-02, -5.227e-02, 4.840e-02, 7.105e-02, -7.533e-03, -1.297e-01)); + r += mul(s1_3, M4(1.216e-01, 8.527e-02, -2.377e-02, 4.553e-02, -3.099e-01, -8.314e-02, 9.121e-02, -1.404e-01, 3.008e-02, 2.271e-02, 2.118e-02, 1.255e-01, 6.427e-02, 1.129e-02, -8.356e-02, 1.902e-01)); + r += mul(s1_4, M4(-5.332e-01, 2.151e-01, -2.231e-01, -6.729e-02, 3.100e-01, -5.922e-01, 4.658e-01, 4.307e-01, -2.838e-01, 1.628e-01, -2.627e-02, -3.515e-01, -3.412e-01, -8.481e-01, -1.145e-01, 4.690e-01)); + r += mul(s1_5, M4(-4.161e-01, 2.098e-02, -1.141e-01, -1.561e-02, -5.537e-02, -3.509e-01, 1.350e-01, 2.163e-01, 2.016e-01, -1.842e-01, -4.780e-02, 2.205e-01, -8.208e-02, -1.956e-01, -4.500e-02, -2.913e-01)); + r += mul(s1_6, M4(-5.157e-03, -9.563e-03, 3.716e-02, 2.411e-02, 2.625e-01, 2.386e-02, 5.859e-02, 1.699e-01, 1.736e-01, -4.062e-02, 1.283e-01, 2.319e-01, 4.247e-02, 6.236e-02, -3.562e-02, -9.159e-02)); + r += mul(s1_7, M4(-1.881e-01, -8.441e-02, -4.476e-03, -2.962e-03, -1.410e-01, -1.377e-01, -1.603e-01, 2.566e-01, -1.171e-01, -2.909e-01, -7.991e-02, 3.955e-03, -1.577e-01, 8.067e-02, 3.065e-02, -7.451e-02)); + r += mul(s1_8, M4(3.017e-02, 5.592e-02, -1.845e-02, 8.121e-02, -1.605e-01, -1.450e-02, 6.103e-02, 5.926e-02, 1.401e-02, 7.801e-02, -1.884e-01, 1.805e-01, 1.250e-01, -4.373e-03, -2.044e-02, 7.077e-03)); + r += mul(s2_0, M4(-2.586e-02, -5.334e-02, -4.608e-02, 1.800e-01, 5.117e-02, 7.026e-02, -1.504e-01, 1.845e-01, 5.936e-02, -1.167e-01, 1.007e-01, 1.775e-02, 9.509e-02, 1.031e-01, -4.267e-02, -4.285e-02)); + r += mul(s2_1, M4(-2.268e-01, -3.782e-01, -1.416e-01, 1.976e-02, 7.927e-02, -3.233e-01, 4.022e-02, 1.397e-01, -1.285e-01, -2.301e-02, 2.178e-01, -3.169e-01, -1.043e-01, 1.333e-01, 6.284e-02, -2.571e-01)); + r += mul(s2_2, M4(1.330e-01, -2.228e-01, -2.477e-02, 1.212e-01, 1.048e-01, -3.967e-02, 6.519e-02, -3.451e-02, 2.996e-03, -8.184e-02, -3.909e-02, -4.447e-02, 1.670e-01, -4.006e-02, 5.001e-02, 7.491e-03)); + r += mul(s2_3, M4(-1.906e-01, 2.986e-02, -3.952e-02, -2.861e-01, 1.208e-01, 2.352e-01, 2.821e-02, -4.515e-02, 2.386e-02, -1.363e-01, 5.457e-02, 1.751e-02, 2.567e-01, 4.067e-02, -3.435e-02, 1.811e-01)); + r += mul(s2_4, M4(5.372e-01, 4.567e-01, 1.075e-02, -4.759e-02, 5.753e-02, 2.359e-01, -1.344e-01, -3.942e-01, 1.139e-01, 2.329e-01, 7.097e-03, -2.416e-01, -3.146e-01, -5.996e-01, -8.141e-05, 2.811e-01)); + r += mul(s2_5, M4(1.261e-02, 1.636e-01, -1.048e-01, 1.364e-02, 3.740e-03, 5.542e-02, -5.258e-02, -1.429e-01, 2.881e-01, -4.462e-01, 1.270e-02, -7.021e-03, -4.951e-02, -2.034e-03, 4.602e-02, 1.214e-01)); + r += mul(s2_6, M4(-6.033e-02, 1.222e-02, 3.018e-03, -1.194e-01, 1.189e-01, -4.994e-02, 6.138e-02, 6.122e-02, -2.687e-02, 2.007e-02, -7.344e-04, -3.446e-02, 6.520e-02, -1.479e-02, -3.500e-02, -2.706e-02)); + r += mul(s2_7, M4(1.186e-01, -6.526e-02, 1.112e-01, 3.259e-02, 4.759e-02, -1.519e-01, 6.760e-02, 2.415e-02, -2.772e-02, -9.989e-02, 3.411e-02, -2.095e-01, 8.407e-02, 2.159e-01, -4.676e-02, -1.920e-02)); + r += mul(s2_8, M4(8.961e-02, 5.177e-03, 2.837e-02, 8.839e-02, 5.019e-03, -2.271e-02, -2.850e-02, -6.803e-02, 8.845e-02, 1.518e-01, 1.899e-01, -3.774e-02, 3.282e-02, -5.420e-03, -3.044e-02, -8.935e-02)); + r += mul(s3_0, M4(-6.317e-02, -8.128e-02, 2.424e-02, 7.323e-02, 8.362e-02, 1.499e-01, -9.427e-02, -4.817e-02, -5.095e-02, -4.980e-02, 1.289e-02, 3.431e-02, 1.232e-01, 9.105e-02, -2.362e-03, -6.421e-02)); + r += mul(s3_1, M4(-3.092e-02, -2.956e-01, 1.516e-01, 4.510e-02, 9.056e-04, 8.930e-02, -6.518e-02, -9.671e-03, -3.079e-02, -1.072e-01, 1.636e-01, 8.242e-02, -1.800e-02, 9.257e-02, -2.550e-02, -7.577e-02)); + r += mul(s3_2, M4(2.229e-02, -1.460e-01, -6.113e-03, 1.165e-01, 2.291e-02, -2.013e-02, 5.773e-02, -8.558e-02, -1.616e-01, -2.072e-01, 1.440e-01, 6.408e-02, -4.857e-02, 2.835e-02, 1.128e-01, 1.248e-02)); + r += mul(s3_3, M4(-7.688e-02, -2.559e-02, 5.337e-02, -1.297e-01, -1.065e-01, 3.964e-03, 2.806e-02, -8.071e-03, -7.883e-02, -1.012e-01, 6.138e-02, -1.165e-01, -3.865e-02, 8.460e-02, -8.840e-02, 1.374e-02)); + r += mul(s3_4, M4(-6.546e-02, 3.511e-01, 2.069e-02, 5.183e-01, 3.118e-01, 4.113e-02, -2.531e-01, 1.565e-01, -7.322e-03, 1.533e-01, 7.628e-02, -2.852e-01, 8.712e-02, -2.433e-01, 7.957e-02, 4.118e-01)); + r += mul(s3_5, M4(-1.812e-01, -3.087e-02, -4.874e-02, -4.923e-02, -9.320e-03, -7.889e-02, -8.610e-02, -4.763e-02, 8.360e-02, -2.848e-02, -1.165e-02, -6.383e-02, -9.233e-02, 1.244e-01, -4.966e-02, -2.979e-02)); + r += mul(s3_6, M4(-2.472e-02, 4.788e-02, -2.114e-02, -1.386e-02, -7.752e-02, 6.096e-02, 3.628e-02, -6.224e-02, 6.418e-02, -5.069e-02, 1.566e-02, 5.723e-02, -1.027e-01, 7.279e-02, -7.078e-02, -3.996e-02)); + r += mul(s3_7, M4(1.666e-02, -1.710e-03, 6.469e-04, 6.369e-03, 2.621e-02, 2.647e-02, 1.027e-01, 7.724e-02, -1.024e-01, -8.304e-02, 1.842e-02, -5.779e-02, 1.711e-01, 8.228e-02, -1.305e-01, 8.329e-02)); + r += mul(s3_8, M4(-2.309e-02, 2.703e-02, -2.298e-02, -7.029e-03, 6.323e-02, 6.507e-02, -4.531e-02, -1.340e-02, -7.977e-02, -4.942e-02, 4.605e-02, 9.001e-02, 8.840e-02, 8.368e-02, -5.912e-02, -1.229e-01)); + r += V4(2.664e-03, 8.117e-03, -7.210e-03, -3.509e-03); + return r; +} + +void Pass6(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = Rmp8x8(tid.x) + blockStart; + uint2 size = GetInputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = (gxy + 0.5) * pt; + + V4 s0_0 = l0(-1.0, -1.0); + V4 s0_1 = l0(0.0, -1.0); + V4 s0_2 = l0(1.0, -1.0); + V4 s0_3 = l0(-1.0, 0.0); + V4 s0_4 = l0(0.0, 0.0); + V4 s0_5 = l0(1.0, 0.0); + V4 s0_6 = l0(-1.0, 1.0); + V4 s0_7 = l0(0.0, 1.0); + V4 s0_8 = l0(1.0, 1.0); + V4 s1_0 = -max(-s0_0, 0.0); + V4 s1_1 = -max(-s0_1, 0.0); + V4 s1_2 = -max(-s0_2, 0.0); + V4 s1_3 = -max(-s0_3, 0.0); + V4 s1_4 = -max(-s0_4, 0.0); + V4 s1_5 = -max(-s0_5, 0.0); + V4 s1_6 = -max(-s0_6, 0.0); + V4 s1_7 = -max(-s0_7, 0.0); + V4 s1_8 = -max(-s0_8, 0.0); + s0_0 = max(s0_0, 0.0); + s0_1 = max(s0_1, 0.0); + s0_2 = max(s0_2, 0.0); + s0_3 = max(s0_3, 0.0); + s0_4 = max(s0_4, 0.0); + s0_5 = max(s0_5, 0.0); + s0_6 = max(s0_6, 0.0); + s0_7 = max(s0_7, 0.0); + s0_8 = max(s0_8, 0.0); + + V4 s2_0 = l1(-1.0, -1.0); + V4 s2_1 = l1(0.0, -1.0); + V4 s2_2 = l1(1.0, -1.0); + V4 s2_3 = l1(-1.0, 0.0); + V4 s2_4 = l1(0.0, 0.0); + V4 s2_5 = l1(1.0, 0.0); + V4 s2_6 = l1(-1.0, 1.0); + V4 s2_7 = l1(0.0, 1.0); + V4 s2_8 = l1(1.0, 1.0); + V4 s3_0 = -max(-s2_0, 0.0); + V4 s3_1 = -max(-s2_1, 0.0); + V4 s3_2 = -max(-s2_2, 0.0); + V4 s3_3 = -max(-s2_3, 0.0); + V4 s3_4 = -max(-s2_4, 0.0); + V4 s3_5 = -max(-s2_5, 0.0); + V4 s3_6 = -max(-s2_6, 0.0); + V4 s3_7 = -max(-s2_7, 0.0); + V4 s3_8 = -max(-s2_8, 0.0); + s2_0 = max(s2_0, 0.0); + s2_1 = max(s2_1, 0.0); + s2_2 = max(s2_2, 0.0); + s2_3 = max(s2_3, 0.0); + s2_4 = max(s2_4, 0.0); + s2_5 = max(s2_5, 0.0); + s2_6 = max(s2_6, 0.0); + s2_7 = max(s2_7, 0.0); + s2_8 = max(s2_8, 0.0); + + t2[gxy] = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8); + t3[gxy] = f1(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8); +} + +//!PASS 7 +//!DESC conv6 +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 +//!IN t2, t3 +//!OUT t0, t1 + +#define l0(x, y) V4(O(t2, float2(x, y))) +#define l1(x, y) V4(O(t3, float2(x, y))) + +V4 f0(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-7.726e-02, -4.236e-02, 2.663e-02, 7.717e-02, 1.578e-02, -3.045e-02, 1.833e-03, 4.928e-03, 2.055e-02, 1.234e-03, 1.293e-02, 8.221e-03, -2.347e-02, 4.309e-02, 7.447e-02, 4.002e-03)); + r += mul(s0_1, M4(2.106e-02, 1.496e-01, 2.554e-02, 9.246e-02, -2.261e-01, 9.247e-02, 2.955e-02, 3.709e-02, -9.295e-02, 1.226e-02, -2.886e-02, -6.831e-04, -1.196e-01, 2.725e-01, -2.178e-01, -1.039e-01)); + r += mul(s0_2, M4(3.396e-02, -8.075e-03, -6.267e-02, -4.931e-02, 1.142e-02, -4.036e-02, 4.313e-02, 9.018e-02, 2.037e-02, 2.323e-03, 5.455e-02, 7.263e-02, 6.421e-02, -3.649e-02, 3.168e-01, 8.844e-02)); + r += mul(s0_3, M4(-5.285e-03, -4.309e-02, -7.397e-02, -5.091e-02, 1.711e-02, 9.498e-02, 1.229e-02, 3.768e-02, 3.743e-03, 2.677e-02, -1.260e-02, 3.233e-02, -1.630e-01, -2.482e-02, -3.347e-03, -6.632e-03)); + r += mul(s0_4, M4(-1.568e-01, -9.216e-02, -1.668e-02, -4.316e-03, -1.176e-02, 3.826e-02, -5.394e-02, 6.991e-02, 1.248e-01, 2.796e-02, -1.266e-01, -2.623e-02, -1.338e-01, -4.132e-01, 4.030e-02, 5.239e-02)); + r += mul(s0_5, M4(-8.780e-02, 5.905e-02, 3.941e-03, 7.738e-02, 1.064e-01, 1.930e-02, -9.021e-03, 3.723e-02, -1.666e-01, -1.172e-03, -3.216e-01, 6.315e-02, -5.310e-02, -3.348e-02, -7.481e-02, 4.842e-02)); + r += mul(s0_6, M4(-1.376e-02, 2.783e-02, 1.790e-02, 3.019e-02, -1.654e-02, 5.290e-03, -2.644e-02, 9.440e-03, -1.162e-02, -1.778e-02, -9.626e-03, -1.727e-02, 6.551e-03, 3.601e-02, -7.306e-03, 9.867e-03)); + r += mul(s0_7, M4(7.459e-03, -1.180e-01, -2.086e-02, 7.975e-03, 3.646e-02, 1.958e-01, 3.334e-02, 1.391e-02, -1.209e-01, 2.599e-03, 7.582e-02, 2.697e-03, 3.305e-02, 3.455e-02, -5.884e-02, 2.060e-02)); + r += mul(s0_8, M4(6.161e-02, -2.655e-02, 3.691e-02, -2.139e-02, -9.580e-02, -1.344e-02, -8.940e-04, 1.652e-02, 4.274e-02, 4.742e-02, 1.043e-01, 6.114e-03, -2.154e-02, 3.635e-03, -7.209e-02, 2.929e-03)); + r += mul(s1_0, M4(-5.330e-02, 2.271e-02, -2.661e-02, 5.278e-02, 1.092e-02, -1.082e-02, 4.099e-04, 4.704e-02, -1.445e-02, -1.413e-02, 3.703e-02, -4.442e-02, -6.642e-02, 4.103e-03, 5.965e-02, 4.796e-03)); + r += mul(s1_1, M4(-9.926e-04, 2.275e-01, 5.207e-03, 4.746e-02, -2.941e-01, -5.993e-02, 1.567e-02, 1.336e-01, -1.455e-01, 1.303e-01, -3.239e-02, -1.908e-03, 5.867e-02, 8.483e-02, -1.097e-01, -1.861e-01)); + r += mul(s1_2, M4(1.195e-02, 1.569e-02, 1.077e-01, -1.050e-03, 1.581e-01, 3.738e-03, -6.575e-02, -1.782e-01, -5.437e-04, -3.055e-04, 1.013e-01, 1.508e-01, 9.356e-03, -1.633e-02, 1.667e-01, 8.674e-02)); + r += mul(s1_3, M4(-1.561e-02, 5.396e-02, -1.401e-02, -3.718e-02, 8.327e-02, 8.406e-02, 3.457e-02, -3.943e-02, 5.426e-02, 4.467e-02, -1.367e-02, -1.917e-02, -1.209e-01, -6.920e-02, -7.704e-02, -9.114e-03)); + r += mul(s1_4, M4(-4.008e-02, -7.207e-01, -7.651e-03, -2.095e-01, -5.950e-03, 1.458e-02, -8.664e-02, 2.716e-01, 3.749e-01, -2.539e-01, -1.156e-01, -5.679e-02, 3.828e-02, -2.838e-01, -7.992e-02, 2.495e-01)); + r += mul(s1_5, M4(1.640e-02, 1.746e-01, 5.193e-02, -8.520e-02, -1.726e-01, 2.218e-02, 4.205e-01, 1.427e-01, 1.426e-02, -1.424e-02, -4.810e-02, -7.034e-02, -4.420e-02, 4.693e-02, -1.059e-01, 6.651e-02)); + r += mul(s1_6, M4(1.277e-02, 1.624e-02, 2.739e-02, 5.491e-03, -1.327e-01, -6.239e-02, -6.986e-02, 4.944e-02, -8.849e-02, 1.346e-02, -2.343e-02, 8.993e-03, 1.826e-02, 4.062e-02, 2.256e-02, -2.188e-02)); + r += mul(s1_7, M4(-3.195e-02, 5.322e-03, 2.795e-02, 4.747e-02, 5.449e-01, 8.519e-02, 2.450e-01, -1.700e-01, -8.635e-02, -1.283e-01, -3.413e-03, 3.388e-02, 1.035e-03, 3.489e-03, -4.357e-02, -8.121e-03)); + r += mul(s1_8, M4(8.044e-02, -4.392e-02, 2.967e-02, 1.582e-02, -2.407e-01, -5.252e-02, -1.646e-01, 1.136e-01, 5.603e-03, -1.985e-02, 2.054e-02, 7.259e-03, -1.430e-02, 4.313e-02, -1.538e-03, -1.881e-02)); + r += mul(s2_0, M4(2.887e-02, -3.079e-02, -2.064e-02, -1.707e-02, 1.619e-03, 9.501e-03, -3.989e-02, 6.850e-02, -1.874e-02, 4.451e-02, 1.375e-02, 3.694e-02, -5.088e-02, 2.351e-03, 1.058e-02, 1.304e-01)); + r += mul(s2_1, M4(3.288e-02, 3.849e-02, -1.623e-02, 1.541e-02, -4.641e-02, -5.803e-02, -5.059e-02, 7.932e-02, 3.378e-02, 4.757e-02, 1.197e-02, -1.701e-01, -2.045e-01, -1.753e-01, -6.869e-03, 4.030e-01)); + r += mul(s2_2, M4(1.061e-02, -1.051e-02, 1.275e-02, -7.823e-03, -2.037e-03, 1.164e-02, -3.866e-03, -1.300e-02, 3.747e-02, -1.642e-02, 2.196e-02, 2.024e-02, 5.399e-02, 1.077e-02, -8.838e-02, -3.091e-02)); + r += mul(s2_3, M4(-3.355e-03, -6.519e-02, 9.655e-03, -2.412e-02, -2.784e-01, 3.036e-01, -6.591e-02, 5.922e-02, 5.079e-02, 2.057e-01, -4.058e-02, -1.246e-01, 8.695e-02, 2.195e-01, 1.155e-02, -3.856e-02)); + r += mul(s2_4, M4(-1.359e-01, -6.361e-02, -2.067e-02, 6.341e-02, -4.197e-01, 2.943e-01, -6.616e-02, 2.731e-01, -9.448e-02, -2.046e-01, -1.120e-01, -4.872e-01, 5.110e-01, 5.573e-02, -2.966e-02, -2.035e-01)); + r += mul(s2_5, M4(-2.759e-02, 1.413e-02, -3.434e-02, 1.415e-02, 4.479e-02, -3.119e-02, -3.333e-02, 6.124e-02, -6.661e-03, 6.655e-02, 1.934e-03, 9.448e-04, 2.794e-02, -2.752e-02, 2.138e-01, -8.479e-03)); + r += mul(s2_6, M4(2.669e-04, 5.510e-03, 1.853e-02, 7.035e-03, -1.453e-01, -4.035e-02, -4.686e-02, 3.419e-02, 7.741e-02, -4.406e-02, -4.407e-02, -3.379e-02, -1.623e-02, 3.556e-02, -4.110e-03, 2.244e-03)); + r += mul(s2_7, M4(7.366e-02, 3.837e-02, -9.561e-04, -6.028e-02, 1.728e-04, 3.019e-02, -4.455e-02, 5.838e-02, 2.192e-01, 1.857e-01, -3.371e-02, 1.257e-02, -1.802e-01, -1.366e-02, -5.060e-02, 1.007e-01)); + r += mul(s2_8, M4(4.923e-03, 1.485e-02, 1.286e-02, -3.308e-02, -7.387e-03, 1.748e-02, -2.415e-02, 3.404e-02, 1.977e-02, -9.480e-02, -2.739e-02, -2.710e-02, -4.596e-03, 3.783e-03, -2.672e-02, 1.560e-03)); + r += mul(s3_0, M4(1.821e-01, -1.726e-02, 6.138e-02, -2.267e-01, 3.341e-03, 3.308e-02, 2.540e-02, 5.495e-02, -6.068e-02, 1.206e-02, 3.137e-02, 9.503e-02, -8.975e-03, 4.392e-03, 3.276e-03, 8.800e-02)); + r += mul(s3_1, M4(-8.920e-02, 2.005e-02, 2.098e-01, 2.013e-01, -6.256e-02, 5.254e-02, -7.322e-02, -6.087e-02, -1.509e-01, -6.047e-02, -1.060e-01, 1.994e-01, -3.721e-02, -6.304e-02, -7.775e-02, 1.860e-02)); + r += mul(s3_2, M4(3.821e-02, 2.521e-02, -2.931e-01, -6.716e-02, 6.188e-02, -1.317e-02, 1.047e-01, -1.675e-02, -6.626e-02, 1.678e-02, 3.259e-02, 9.227e-02, 3.036e-02, 1.550e-02, 8.623e-02, 3.820e-02)); + r += mul(s3_3, M4(-3.170e-01, 1.141e-01, -2.329e-01, -8.852e-03, -2.495e-01, 3.291e-01, -1.958e-02, -5.070e-02, 6.349e-02, 1.136e-01, 2.229e-02, -8.225e-02, -9.059e-02, 2.346e-01, 2.239e-02, 4.994e-02)); + r += mul(s3_4, M4(4.100e-01, -5.625e-01, -8.633e-02, -1.264e-01, -5.683e-01, 3.076e-01, 6.387e-01, 7.517e-02, 1.931e-01, 6.261e-02, 9.888e-02, -1.452e-01, -6.821e-03, 1.317e-01, -1.053e-01, -8.811e-02)); + r += mul(s3_5, M4(-9.594e-02, 8.279e-02, 1.886e-01, -4.391e-02, -2.549e-02, -3.722e-02, -5.847e-02, 1.530e-01, 1.440e-02, -1.658e-03, -5.252e-02, -3.569e-03, -8.633e-02, -3.385e-02, -6.311e-02, -2.457e-02)); + r += mul(s3_6, M4(1.305e-01, -1.413e-02, 2.234e-02, -3.575e-02, -2.280e-01, -1.338e-01, -7.509e-02, 5.110e-02, 1.254e-02, -9.590e-02, -6.164e-02, -8.308e-03, -2.046e-02, 2.761e-02, -2.675e-02, 3.092e-02)); + r += mul(s3_7, M4(2.543e-02, -3.494e-02, -5.345e-02, -2.582e-02, -1.284e-02, -2.036e-01, 1.160e-01, 7.207e-02, 4.682e-02, 1.265e-01, 4.585e-02, -1.319e-02, -6.320e-02, 9.944e-03, 3.594e-02, 5.627e-02)); + r += mul(s3_8, M4(-1.190e-02, -1.152e-02, -6.325e-02, -1.505e-02, -2.987e-02, -4.424e-03, -7.566e-03, 1.253e-02, -2.009e-02, -4.585e-02, 2.023e-02, 1.135e-02, 5.201e-02, 1.751e-02, -7.444e-03, 1.437e-02)); + r += V4(1.496e-03, 1.976e-03, -2.228e-03, 2.339e-03); + return r; +} + +V4 f1(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8) { + V4 r = 0.0; + r += mul(s0_0, M4(1.417e-02, 2.377e-02, 7.056e-02, -1.708e-01, -4.606e-04, 1.689e-02, 4.567e-02, -1.430e-02, 2.483e-02, 3.123e-02, 4.566e-02, 2.764e-02, -1.146e-01, -3.580e-02, -1.005e-01, 6.299e-02)); + r += mul(s0_1, M4(9.670e-02, -8.422e-02, 1.885e-02, 2.737e-01, -6.124e-02, -3.411e-02, 1.177e-02, -4.768e-02, 8.543e-02, -8.313e-02, 4.539e-02, -1.623e-02, 2.000e-01, -5.159e-02, -1.927e-01, 2.705e-01)); + r += mul(s0_2, M4(-6.511e-03, 2.374e-02, -3.419e-02, 5.751e-02, 3.509e-03, -5.322e-03, -2.503e-02, -5.954e-02, 7.219e-02, -3.067e-02, -1.468e-02, 2.907e-03, -1.977e-01, -3.698e-02, -8.116e-02, 1.209e-02)); + r += mul(s0_3, M4(-7.616e-03, 1.184e-01, -8.993e-02, 4.361e-02, 1.499e-02, -4.169e-03, -4.891e-02, 3.895e-02, 3.504e-02, -2.033e-02, -3.223e-02, -6.037e-02, -7.856e-02, -5.490e-02, 6.653e-02, 8.377e-02)); + r += mul(s0_4, M4(1.822e-01, -2.446e-01, -2.585e-01, 1.245e-01, -5.140e-02, 1.930e-01, 1.942e-02, 1.680e-02, -2.178e-01, 1.537e-01, -1.011e+00, -4.548e-01, 3.506e-01, 2.489e-01, 2.640e-01, 1.546e-01)); + r += mul(s0_5, M4(7.701e-02, -3.282e-02, -4.543e-02, -4.894e-02, 3.782e-03, -9.876e-04, 5.202e-02, -2.252e-02, 2.125e-01, 1.396e-01, -7.587e-02, -2.342e-01, -2.900e-01, 5.066e-02, 2.059e-01, -1.003e-01)); + r += mul(s0_6, M4(1.741e-02, -5.800e-02, -1.900e-02, -1.103e-01, -1.544e-02, 1.248e-02, -2.188e-02, 2.753e-02, -6.159e-03, 3.643e-02, 2.510e-02, -1.613e-02, -1.972e-02, -5.235e-02, -3.681e-02, 5.366e-02)); + r += mul(s0_7, M4(1.740e-02, 1.441e-01, 3.796e-02, 2.267e-02, -2.051e-02, -1.564e-01, -6.488e-02, -6.801e-02, 3.368e-02, -6.264e-02, 1.791e-02, -5.944e-02, -4.683e-02, -1.256e-02, -6.540e-02, 3.546e-02)); + r += mul(s0_8, M4(-6.253e-02, -2.709e-02, 3.707e-02, 1.718e-02, -3.430e-02, 3.417e-02, -5.257e-02, -3.959e-04, 2.007e-01, -7.594e-02, -3.454e-02, -2.327e-05, -2.480e-02, 5.655e-02, -4.720e-02, 3.006e-02)); + r += mul(s1_0, M4(3.999e-03, 1.203e-03, -9.676e-03, -2.231e-02, 3.772e-02, 2.693e-02, 2.818e-02, 2.641e-02, -3.407e-02, -1.765e-02, -9.486e-04, -5.857e-03, -8.413e-02, 6.513e-03, -2.523e-02, 2.071e-02)); + r += mul(s1_1, M4(6.666e-02, -5.555e-02, -1.008e-01, 2.823e-01, -4.945e-02, 3.166e-03, 1.133e-01, -3.291e-01, 1.761e-01, -1.626e-02, 6.843e-02, 2.767e-02, 2.024e-01, -9.546e-02, -1.752e-01, 6.617e-02)); + r += mul(s1_2, M4(-1.210e-01, -6.037e-02, 5.096e-02, 8.161e-02, 1.310e-01, -2.582e-02, -6.073e-02, 5.804e-02, 5.883e-02, -5.329e-02, -1.231e-02, -2.863e-02, -5.061e-02, -2.119e-02, -9.351e-02, -8.943e-02)); + r += mul(s1_3, M4(-3.971e-02, -1.009e-01, -6.313e-02, 1.450e-01, 6.074e-02, -6.618e-02, -6.086e-04, 1.100e-01, 7.771e-02, 9.246e-02, -8.459e-02, -7.042e-03, -1.138e-01, 1.398e-01, -5.286e-02, 6.421e-02)); + r += mul(s1_4, M4(-3.669e-01, -6.429e-02, 4.852e-02, -5.484e-01, -1.444e-01, 5.232e-01, -2.359e-02, -2.425e-01, 3.525e-01, 1.542e-01, -1.489e-01, 1.304e-01, 2.430e-01, 3.256e-01, 2.770e-01, 4.015e-02)); + r += mul(s1_5, M4(-1.860e-01, 9.205e-02, -6.804e-02, 2.132e-01, 3.018e-01, -1.301e-02, 2.932e-01, -4.531e-01, -1.165e-01, 1.096e-01, -5.766e-02, 2.676e-02, -8.117e-02, -4.090e-02, 7.593e-02, -1.031e-01)); + r += mul(s1_6, M4(2.984e-02, 5.976e-03, 2.771e-02, -1.520e-02, 9.423e-03, 7.899e-02, -3.400e-02, -1.421e-01, -1.602e-02, -1.316e-02, -1.356e-02, -1.758e-02, -3.187e-02, -8.554e-02, -6.954e-02, 6.126e-02)); + r += mul(s1_7, M4(3.484e-03, 5.750e-02, 4.953e-02, 1.427e-02, 5.264e-02, 1.119e-01, -1.563e-01, -1.832e-02, 7.184e-02, 1.238e-01, 1.384e-03, -2.950e-03, -2.796e-02, -1.510e-02, -5.581e-02, 5.907e-03)); + r += mul(s1_8, M4(-2.979e-02, -1.805e-01, 4.289e-02, 7.547e-02, 1.453e-01, 1.155e-01, -6.317e-02, 2.787e-03, 6.409e-02, -2.811e-02, 2.758e-02, 1.464e-02, -4.431e-02, 2.005e-03, -3.745e-02, 6.827e-03)); + r += mul(s2_0, M4(2.466e-02, 3.345e-02, 1.015e-02, 1.515e-02, 1.833e-02, 8.333e-03, -2.040e-03, 6.401e-02, 2.044e-02, -6.089e-02, -5.738e-02, 3.871e-02, -1.920e-02, 5.305e-02, 5.707e-02, 2.513e-02)); + r += mul(s2_1, M4(7.018e-02, -2.544e-02, -2.494e-02, 1.088e-01, -3.509e-02, -8.734e-03, -1.365e-02, -9.361e-02, -2.252e-03, -1.209e-02, -3.689e-02, 7.149e-02, -3.120e-02, 2.036e-02, 4.506e-02, -3.936e-01)); + r += mul(s2_2, M4(-8.268e-03, -1.327e-02, 2.513e-02, -4.868e-03, -2.935e-02, 8.804e-03, -5.610e-03, 2.269e-02, 6.841e-03, -6.307e-04, -6.629e-02, -4.883e-03, 2.400e-02, -7.430e-04, -8.010e-03, 7.980e-02)); + r += mul(s2_3, M4(-1.232e-02, -2.083e-02, -1.672e-02, -2.160e-02, 1.786e-02, -2.434e-01, -7.226e-02, 1.562e-01, 9.118e-02, -1.116e-01, -6.319e-02, 2.136e-01, -3.159e-03, -1.786e-01, -6.991e-02, 4.110e-01)); + r += mul(s2_4, M4(-2.275e-02, -2.278e-02, -1.567e-01, 9.989e-02, -1.908e-01, 5.677e-02, -1.271e-01, -2.123e-02, -1.454e-01, 2.650e-01, 2.278e-01, -1.885e-01, -9.669e-02, 1.841e-01, 7.851e-02, -6.762e-01)); + r += mul(s2_5, M4(-3.343e-02, 3.704e-02, -3.857e-02, 8.299e-03, 2.396e-02, -5.124e-02, -5.434e-02, 7.997e-02, 3.406e-02, -4.136e-02, 1.870e-02, 3.525e-02, -6.752e-02, -8.309e-02, 1.068e-01, 3.379e-03)); + r += mul(s2_6, M4(7.981e-03, -4.048e-02, 3.325e-02, -9.389e-03, -1.876e-02, 2.147e-02, -6.131e-02, 9.452e-02, 1.583e-02, 1.418e-01, -1.309e-02, 1.419e-02, -4.582e-03, -4.512e-03, -3.895e-02, 4.452e-02)); + r += mul(s2_7, M4(-3.083e-03, 3.093e-03, 2.493e-02, 3.899e-02, 4.875e-02, -1.968e-01, -1.069e-01, 6.543e-02, -1.266e-01, -2.185e-01, -9.342e-02, 9.424e-02, -5.126e-02, -1.718e-02, 9.158e-03, -3.601e-02)); + r += mul(s2_8, M4(-3.967e-02, -3.457e-02, 2.545e-02, 2.582e-02, 1.908e-03, 3.888e-02, -4.385e-02, -2.935e-02, 7.741e-02, 3.255e-02, -3.235e-02, 6.256e-02, 1.187e-02, -2.497e-02, -3.396e-02, 1.806e-02)); + r += mul(s3_0, M4(1.117e-02, -7.495e-02, -4.312e-02, 6.636e-05, -3.893e-02, -4.891e-02, -8.095e-02, 8.555e-02, -1.992e-02, 1.728e-03, -3.447e-02, -8.472e-02, -1.013e-02, 2.594e-02, 6.256e-02, 1.169e-01)); + r += mul(s3_1, M4(-1.737e-01, 9.502e-02, -3.787e-02, 1.131e-01, 4.237e-02, 1.059e-02, -8.165e-02, 9.365e-03, 1.581e-03, 1.907e-01, 1.439e-01, -2.903e-02, 9.400e-03, -4.874e-02, -1.740e-02, -9.145e-02)); + r += mul(s3_2, M4(2.043e-01, 1.205e-03, -3.967e-02, 5.084e-02, -3.772e-02, -1.594e-02, -2.356e-02, 4.866e-02, -3.912e-02, -1.182e-01, 1.228e-01, 2.044e-02, -2.094e-02, -6.302e-03, -8.608e-03, 4.632e-02)); + r += mul(s3_3, M4(1.028e-02, -2.428e-01, 4.209e-02, 2.619e-01, 8.150e-02, -2.480e-01, -3.820e-02, 9.968e-02, 4.816e-02, -4.436e-02, -3.762e-03, 6.175e-02, -3.872e-03, -2.305e-01, -1.069e-01, 1.947e-01)); + r += mul(s3_4, M4(-7.723e-01, 9.837e-02, 3.011e-02, 1.353e-01, -1.254e-01, 2.501e-01, 1.086e-02, -4.026e-01, -2.775e-02, -2.070e-01, -1.837e-01, -1.658e-01, 1.984e-02, 1.307e-01, 1.635e-01, -1.135e-01)); + r += mul(s3_5, M4(1.416e-02, -9.369e-02, 1.069e-01, -8.305e-02, 1.437e-01, -3.897e-02, -6.218e-02, 3.772e-02, 6.288e-02, 1.493e-01, -5.597e-02, 7.343e-02, -8.453e-02, 4.008e-02, -1.136e-02, 1.524e-02)); + r += mul(s3_6, M4(6.399e-02, 1.405e-01, -1.857e-03, 3.541e-02, -1.237e-02, 1.110e-01, -4.929e-02, 2.277e-02, 1.195e-02, 1.679e-01, 2.287e-02, 1.645e-02, 8.215e-03, -2.489e-04, -3.430e-02, -2.937e-02)); + r += mul(s3_7, M4(-5.599e-02, 3.509e-01, 7.784e-02, 3.488e-02, 5.222e-01, -1.892e-01, 1.668e-02, 1.938e-04, -8.913e-03, -3.322e-02, -6.398e-02, -2.276e-02, 5.969e-04, -1.078e-01, -5.033e-03, 6.744e-02)); + r += mul(s3_8, M4(-1.150e-02, -5.770e-02, -1.917e-02, 1.003e-01, 2.864e-02, -6.083e-04, -2.847e-02, -1.435e-02, 4.296e-02, -9.737e-04, -4.802e-02, 6.634e-02, 4.267e-02, -3.589e-02, 1.502e-02, 1.632e-02)); + r += V4(-1.351e-03, -1.537e-03, -2.278e-03, 6.430e-04); + return r; +} + +void Pass7(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = Rmp8x8(tid.x) + blockStart; + uint2 size = GetInputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = (gxy + 0.5) * pt; + + V4 s0_0 = l0(-1.0, -1.0); + V4 s0_1 = l0(0.0, -1.0); + V4 s0_2 = l0(1.0, -1.0); + V4 s0_3 = l0(-1.0, 0.0); + V4 s0_4 = l0(0.0, 0.0); + V4 s0_5 = l0(1.0, 0.0); + V4 s0_6 = l0(-1.0, 1.0); + V4 s0_7 = l0(0.0, 1.0); + V4 s0_8 = l0(1.0, 1.0); + V4 s1_0 = -max(-s0_0, 0.0); + V4 s1_1 = -max(-s0_1, 0.0); + V4 s1_2 = -max(-s0_2, 0.0); + V4 s1_3 = -max(-s0_3, 0.0); + V4 s1_4 = -max(-s0_4, 0.0); + V4 s1_5 = -max(-s0_5, 0.0); + V4 s1_6 = -max(-s0_6, 0.0); + V4 s1_7 = -max(-s0_7, 0.0); + V4 s1_8 = -max(-s0_8, 0.0); + s0_0 = max(s0_0, 0.0); + s0_1 = max(s0_1, 0.0); + s0_2 = max(s0_2, 0.0); + s0_3 = max(s0_3, 0.0); + s0_4 = max(s0_4, 0.0); + s0_5 = max(s0_5, 0.0); + s0_6 = max(s0_6, 0.0); + s0_7 = max(s0_7, 0.0); + s0_8 = max(s0_8, 0.0); + + V4 s2_0 = l1(-1.0, -1.0); + V4 s2_1 = l1(0.0, -1.0); + V4 s2_2 = l1(1.0, -1.0); + V4 s2_3 = l1(-1.0, 0.0); + V4 s2_4 = l1(0.0, 0.0); + V4 s2_5 = l1(1.0, 0.0); + V4 s2_6 = l1(-1.0, 1.0); + V4 s2_7 = l1(0.0, 1.0); + V4 s2_8 = l1(1.0, 1.0); + V4 s3_0 = -max(-s2_0, 0.0); + V4 s3_1 = -max(-s2_1, 0.0); + V4 s3_2 = -max(-s2_2, 0.0); + V4 s3_3 = -max(-s2_3, 0.0); + V4 s3_4 = -max(-s2_4, 0.0); + V4 s3_5 = -max(-s2_5, 0.0); + V4 s3_6 = -max(-s2_6, 0.0); + V4 s3_7 = -max(-s2_7, 0.0); + V4 s3_8 = -max(-s2_8, 0.0); + s2_0 = max(s2_0, 0.0); + s2_1 = max(s2_1, 0.0); + s2_2 = max(s2_2, 0.0); + s2_3 = max(s2_3, 0.0); + s2_4 = max(s2_4, 0.0); + s2_5 = max(s2_5, 0.0); + s2_6 = max(s2_6, 0.0); + s2_7 = max(s2_7, 0.0); + s2_8 = max(s2_8, 0.0); + + t0[gxy] = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8); + t1[gxy] = f1(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8); +} + +//!PASS 8 +//!DESC out-shuffle +//!BLOCK_SIZE 16 +//!NUM_THREADS 64 +//!IN INPUT, t0, t1 +//!OUT OUTPUT + +#define l0(x, y) V4(O(t0, float2(x, y))) +#define l1(x, y) V4(O(t1, float2(x, y))) + +V4 f0(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8) { + V4 r = 0.0; + r += mul(s0_0, M4(1.665e-02, -8.034e-03, -1.825e-02, 3.618e-03, -1.946e-03, -9.426e-03, -8.760e-03, 1.811e-02, 5.287e-02, -2.521e-02, 1.465e-02, -2.874e-02, -1.678e-04, -5.970e-03, -2.613e-03, -4.475e-03)); + r += mul(s0_1, M4(1.441e-01, 5.668e-02, 9.456e-03, -6.067e-02, 2.085e-01, 9.162e-02, 3.905e-02, -2.220e-02, -9.590e-02, -4.507e-02, -2.980e-02, 3.405e-02, 5.457e-02, 1.862e-02, 2.969e-02, -3.874e-03)); + r += mul(s0_2, M4(-3.635e-02, 4.605e-02, -2.088e-02, -1.038e-03, -5.091e-02, 3.757e-02, -2.177e-02, -3.267e-03, 3.186e-02, 3.149e-03, 7.400e-03, 3.707e-03, -2.361e-02, -4.816e-03, -1.245e-02, 1.252e-02)); + r += mul(s0_3, M4(-2.961e-02, -3.446e-03, 9.278e-03, -3.365e-02, 1.645e-03, -1.782e-02, -5.623e-03, -4.475e-02, 2.640e-02, -1.904e-02, -1.195e-01, 1.154e-01, -2.134e-02, 6.999e-03, -1.240e-02, -2.264e-02)); + r += mul(s0_4, M4(-4.989e-01, -3.369e-01, 5.449e-01, 3.551e-01, 2.530e-01, 1.923e-01, 4.218e-01, 2.627e-01, -4.863e-02, 1.521e-01, 6.711e-02, -2.250e-01, -8.437e-02, -2.255e-01, -1.239e-02, 7.682e-02)); + r += mul(s0_5, M4(-3.139e-02, -1.480e-01, -2.284e-02, 8.665e-02, -4.610e-02, 4.704e-02, -3.240e-02, 8.506e-02, 1.377e-03, 2.643e-02, 2.989e-03, 8.917e-03, -2.035e-02, 3.411e-02, 1.877e-02, -4.490e-02)); + r += mul(s0_6, M4(9.737e-03, 1.686e-02, -3.094e-02, 2.318e-02, -6.414e-03, -2.440e-03, 2.925e-03, -1.545e-03, 4.439e-02, 9.093e-04, 3.674e-01, -3.203e-01, 5.221e-02, 2.167e-02, 4.061e-02, 4.237e-02)); + r += mul(s0_7, M4(2.009e-02, -4.379e-03, 6.470e-02, -6.519e-02, -2.176e-02, -8.537e-03, 2.645e-02, 1.331e-02, 3.747e-02, 4.555e-02, 3.777e-02, -1.084e-02, 1.072e-01, 1.385e-01, 1.934e-02, -9.520e-02)); + r += mul(s0_8, M4(1.143e-02, 1.461e-02, -4.811e-02, 1.175e-02, -1.676e-02, -2.844e-02, -4.268e-02, -2.958e-02, -5.801e-03, 1.108e-03, -1.108e-02, 4.385e-02, -9.585e-03, -1.232e-02, -3.864e-02, 1.812e-02)); + r += mul(s1_0, M4(6.319e-04, -1.321e-02, -4.810e-03, 3.134e-03, 1.949e-02, 8.926e-04, 3.095e-04, 1.404e-02, 2.945e-02, -1.625e-02, -1.022e-03, -8.526e-03, 1.548e-02, -1.219e-02, -9.063e-03, -8.040e-03)); + r += mul(s1_1, M4(1.512e-01, 5.866e-02, 2.923e-02, -2.301e-02, 1.588e-01, 1.093e-01, 4.457e-02, -2.858e-02, -9.663e-02, -4.469e-02, -3.315e-02, 1.949e-02, 6.519e-02, 4.569e-02, 2.538e-02, -2.218e-02)); + r += mul(s1_2, M4(-4.665e-02, 2.594e-02, -1.993e-02, 1.175e-02, -3.333e-02, 2.913e-02, -9.827e-03, 3.326e-05, 3.552e-02, -3.633e-03, 8.832e-03, 9.121e-04, -2.972e-02, -8.319e-03, -1.437e-02, 1.409e-02)); + r += mul(s1_3, M4(-1.715e-02, 2.335e-02, -1.714e-02, -3.837e-02, -8.227e-02, 8.352e-04, 6.854e-04, -3.553e-02, 3.693e-02, -8.114e-02, -1.259e-02, 1.459e-02, -1.087e-01, 3.946e-04, 2.406e-02, -1.555e-02)); + r += mul(s1_4, M4(-4.320e-02, -1.420e-01, 1.501e-01, 1.979e-01, 4.555e-01, 5.655e-02, 4.005e-01, 4.561e-01, -6.498e-02, 1.753e-01, 7.693e-02, -2.573e-01, -1.655e-01, -3.975e-01, -6.450e-03, 1.195e-01)); + r += mul(s1_5, M4(-3.430e-02, -4.627e-02, -3.033e-02, 9.612e-03, -4.261e-02, 9.353e-02, -5.574e-02, 7.956e-02, -1.190e-03, 1.946e-02, 9.613e-03, 2.960e-02, -1.353e-02, 6.958e-02, 1.888e-02, -3.233e-02)); + r += mul(s1_6, M4(-3.424e-03, 8.490e-03, 4.527e-03, 2.695e-02, 9.218e-03, -3.838e-04, 5.782e-03, -1.419e-02, 6.274e-02, -1.145e-02, 4.382e-02, -1.952e-02, -1.567e-03, 1.579e-02, 1.813e-01, 3.017e-02)); + r += mul(s1_7, M4(3.557e-02, 1.086e-02, -6.621e-02, -9.656e-02, 4.175e-02, 5.237e-02, -1.381e-01, -1.110e-01, 3.749e-02, 5.361e-02, 3.329e-02, 8.597e-02, -9.733e-03, -8.791e-02, 1.724e-01, 3.238e-01)); + r += mul(s1_8, M4(1.282e-02, 7.556e-03, -2.733e-02, -1.689e-02, -3.745e-02, -4.170e-02, -3.300e-02, -4.508e-03, 3.246e-03, 5.182e-03, -1.597e-02, 3.762e-02, 3.515e-03, 8.707e-04, -2.837e-02, 2.238e-02)); + r += mul(s2_0, M4(2.606e-02, -4.157e-03, 1.889e-02, -1.571e-02, -1.264e-03, 1.164e-02, 3.781e-02, 2.570e-02, -1.546e-02, 5.382e-03, 3.603e-02, 2.516e-02, 6.918e-03, 1.161e-02, 3.155e-03, -1.756e-03)); + r += mul(s2_1, M4(-4.998e-02, -6.958e-02, -5.387e-02, 2.511e-02, -1.032e-02, -1.567e-01, 1.284e-01, 4.528e-02, -5.753e-02, 1.843e-02, 6.067e-02, 1.268e-02, -8.389e-02, -3.496e-02, -1.261e-02, 1.271e-02)); + r += mul(s2_2, M4(2.201e-02, 1.038e-02, 1.562e-03, 6.786e-03, 3.414e-02, 6.890e-02, -2.765e-02, 2.985e-02, 1.279e-02, -3.082e-02, 1.793e-03, 9.163e-03, 2.754e-02, -2.456e-02, 7.180e-03, 1.141e-03)); + r += mul(s2_3, M4(6.714e-02, 1.266e-02, 1.392e-03, 7.777e-02, 1.648e-02, -3.943e-02, 7.426e-02, -1.875e-02, 3.643e-01, 7.651e-02, -3.760e-01, -3.663e-02, -2.532e-02, -5.826e-03, 1.486e-02, 2.171e-02)); + r += mul(s2_4, M4(3.235e-01, -3.337e-01, 2.851e-01, -4.555e-01, 2.373e-01, 3.584e-01, -4.600e-01, 1.548e-01, 5.534e-01, 6.629e-01, 9.779e-03, -4.056e-01, 8.883e-02, -1.558e-01, -1.062e-01, -1.018e-01)); + r += mul(s2_5, M4(-4.431e-02, 1.741e-02, -2.464e-02, 4.318e-02, -1.063e-02, -9.543e-02, 9.203e-02, 3.816e-03, -8.191e-02, 3.298e-02, -3.944e-02, -1.789e-02, -3.580e-02, 9.644e-02, 2.248e-02, -5.676e-03)); + r += mul(s2_6, M4(-1.707e-02, -1.871e-03, 6.918e-03, -9.750e-03, 1.813e-02, 1.149e-02, 1.491e-02, -2.354e-03, -6.421e-02, -2.200e-03, 6.571e-02, 3.823e-02, 1.606e-02, 1.188e-02, -2.462e-04, -6.835e-03)); + r += mul(s2_7, M4(-1.709e-02, -3.317e-02, 7.031e-02, -7.599e-02, -3.559e-03, 5.356e-03, 1.223e-01, 5.016e-03, -3.943e-02, -5.634e-02, 6.522e-02, 1.959e-02, 2.838e-03, 3.219e-02, 8.960e-02, -2.077e-02)); + r += mul(s2_8, M4(-1.128e-02, -1.450e-02, -2.515e-02, -1.278e-02, 1.182e-02, -6.085e-03, -3.478e-02, -7.803e-05, 2.175e-03, -1.893e-02, -3.165e-02, 1.144e-02, -4.075e-03, -1.776e-02, -2.098e-02, 2.191e-02)); + r += mul(s3_0, M4(3.673e-02, -7.948e-03, 1.825e-02, -2.366e-02, -4.290e-03, 1.377e-02, 8.323e-03, 1.511e-02, -5.298e-03, 2.701e-03, 8.641e-03, 4.330e-03, 1.059e-03, 1.412e-02, -7.184e-03, 3.384e-04)); + r += mul(s3_1, M4(-1.180e-01, -1.494e-02, -2.777e-02, 3.327e-02, 2.241e-02, -4.968e-02, -2.362e-02, 6.181e-02, 3.152e-02, 5.492e-03, 1.043e-02, -2.723e-02, -6.920e-02, -5.721e-02, -2.918e-03, 9.618e-03)); + r += mul(s3_2, M4(4.164e-02, 4.799e-03, 7.672e-03, 6.442e-03, 2.289e-02, -5.849e-03, -1.497e-02, 3.935e-02, -9.540e-03, -5.052e-03, -6.008e-03, 3.086e-04, 1.775e-02, 5.478e-03, 6.428e-03, 3.996e-03)); + r += mul(s3_3, M4(-4.285e-02, 2.518e-02, -6.202e-02, 7.750e-02, 3.723e-02, -1.612e-02, 1.900e-03, 1.359e-02, 3.029e-03, 2.731e-03, -5.163e-03, -2.669e-02, -3.451e-03, 1.188e-02, 2.654e-02, 4.026e-02)); + r += mul(s3_4, M4(1.114e-01, 2.722e-02, 8.689e-02, -2.510e-01, 3.922e-02, 1.319e-01, 1.630e-01, -7.910e-02, 2.532e-01, 1.401e-01, 1.096e-01, 1.772e-01, 3.884e-01, -4.444e-01, 5.710e-02, -2.594e-01)); + r += mul(s3_5, M4(-3.528e-02, 1.519e-03, -1.285e-02, 2.613e-02, -5.286e-02, 3.211e-02, 1.899e-02, -8.061e-03, -6.238e-02, 7.851e-03, -1.807e-02, -3.191e-02, -3.676e-02, 5.701e-02, 6.615e-03, 1.207e-02)); + r += mul(s3_6, M4(-8.811e-03, -2.217e-03, -8.144e-03, -2.373e-02, 1.499e-02, 6.994e-03, 2.934e-02, -5.142e-03, -6.236e-03, 7.265e-04, -2.347e-03, 1.380e-02, 1.357e-02, 1.125e-02, 7.815e-03, 1.489e-03)); + r += mul(s3_7, M4(-2.411e-02, -3.528e-02, -1.130e-02, 2.333e-02, 1.379e-02, 2.206e-02, 9.893e-03, 3.702e-02, -2.773e-02, -7.861e-04, 9.765e-02, 7.302e-03, 3.641e-02, 2.749e-02, 2.540e-01, -1.831e-01)); + r += mul(s3_8, M4(-2.727e-03, -1.083e-02, -1.462e-02, -1.577e-02, -2.030e-03, -6.144e-03, -2.325e-02, 1.531e-02, 2.263e-04, -1.137e-02, -2.704e-02, -1.031e-02, -1.318e-02, -8.554e-03, -3.022e-02, 1.633e-02)); + r += V4(1.205e-04, 8.082e-04, 5.443e-04, -3.668e-04); + return tanh(r); +} + +void Pass8(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = (Rmp8x8(tid.x) << 1) + blockStart; + uint2 size = GetOutputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = ((gxy >> 1) + 0.5) * pt; + + V4 s0_0 = l0(-1.0, -1.0); + V4 s0_1 = l0(0.0, -1.0); + V4 s0_2 = l0(1.0, -1.0); + V4 s0_3 = l0(-1.0, 0.0); + V4 s0_4 = l0(0.0, 0.0); + V4 s0_5 = l0(1.0, 0.0); + V4 s0_6 = l0(-1.0, 1.0); + V4 s0_7 = l0(0.0, 1.0); + V4 s0_8 = l0(1.0, 1.0); + V4 s1_0 = -max(-s0_0, 0.0); + V4 s1_1 = -max(-s0_1, 0.0); + V4 s1_2 = -max(-s0_2, 0.0); + V4 s1_3 = -max(-s0_3, 0.0); + V4 s1_4 = -max(-s0_4, 0.0); + V4 s1_5 = -max(-s0_5, 0.0); + V4 s1_6 = -max(-s0_6, 0.0); + V4 s1_7 = -max(-s0_7, 0.0); + V4 s1_8 = -max(-s0_8, 0.0); + s0_0 = max(s0_0, 0.0); + s0_1 = max(s0_1, 0.0); + s0_2 = max(s0_2, 0.0); + s0_3 = max(s0_3, 0.0); + s0_4 = max(s0_4, 0.0); + s0_5 = max(s0_5, 0.0); + s0_6 = max(s0_6, 0.0); + s0_7 = max(s0_7, 0.0); + s0_8 = max(s0_8, 0.0); + + V4 s2_0 = l1(-1.0, -1.0); + V4 s2_1 = l1(0.0, -1.0); + V4 s2_2 = l1(1.0, -1.0); + V4 s2_3 = l1(-1.0, 0.0); + V4 s2_4 = l1(0.0, 0.0); + V4 s2_5 = l1(1.0, 0.0); + V4 s2_6 = l1(-1.0, 1.0); + V4 s2_7 = l1(0.0, 1.0); + V4 s2_8 = l1(1.0, 1.0); + V4 s3_0 = -max(-s2_0, 0.0); + V4 s3_1 = -max(-s2_1, 0.0); + V4 s3_2 = -max(-s2_2, 0.0); + V4 s3_3 = -max(-s2_3, 0.0); + V4 s3_4 = -max(-s2_4, 0.0); + V4 s3_5 = -max(-s2_5, 0.0); + V4 s3_6 = -max(-s2_6, 0.0); + V4 s3_7 = -max(-s2_7, 0.0); + V4 s3_8 = -max(-s2_8, 0.0); + s2_0 = max(s2_0, 0.0); + s2_1 = max(s2_1, 0.0); + s2_2 = max(s2_2, 0.0); + s2_3 = max(s2_3, 0.0); + s2_4 = max(s2_4, 0.0); + s2_5 = max(s2_5, 0.0); + s2_6 = max(s2_6, 0.0); + s2_7 = max(s2_7, 0.0); + s2_8 = max(s2_8, 0.0); + + V4 r = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8); + + static const float3x3 rgb2yuv = {0.299, 0.587, 0.114, -0.169, -0.331, 0.5, 0.5, -0.419, -0.081}; + static const float3x3 yuv2rgb = {1, -0.00093, 1.401687, 1, -0.3437, -0.71417, 1, 1.77216, 0.00099}; + float2 opt = float2(GetOutputPt()); + + pos -= 0.5f * opt; + float3 yuv = mul(rgb2yuv, INPUT.SampleLevel(SL, pos, 0).rgb); + OUTPUT[gxy] = float4(mul(yuv2rgb, float3(saturate(yuv.r + r.x), yuv.yz)), 1); + + ++gxy.x; + pos.x += opt.x; + yuv = mul(rgb2yuv, INPUT.SampleLevel(SL, pos, 0).rgb); + OUTPUT[gxy] = float4(mul(yuv2rgb, float3(saturate(yuv.r + r.y), yuv.yz)), 1); + + ++gxy.y; + pos.y += opt.y; + yuv = mul(rgb2yuv, INPUT.SampleLevel(SL, pos, 0).rgb); + OUTPUT[gxy] = float4(mul(yuv2rgb, float3(saturate(yuv.r + r.w), yuv.yz)), 1); + + --gxy.x; + pos.x -= opt.x; + yuv = mul(rgb2yuv, INPUT.SampleLevel(SL, pos, 0).rgb); + OUTPUT[gxy] = float4(mul(yuv2rgb, float3(saturate(yuv.r + r.z), yuv.yz)), 1); +} diff --git a/src/Effects/CuNNy/CuNNy-8x16C-NVL-DN.hlsl b/src/Effects/CuNNy/CuNNy-8x16C-NVL-DN.hlsl new file mode 100644 index 000000000..2ab594bec --- /dev/null +++ b/src/Effects/CuNNy/CuNNy-8x16C-NVL-DN.hlsl @@ -0,0 +1,4027 @@ +// CuNNy 8x16C BILINEAR RGB NVL DN - https://github.com/cunnyplapper/CuNNy + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +//!MAGPIE EFFECT +//!VERSION 4 +//!SORT_NAME CuNNy-DN-D16N08 + +//!TEXTURE +Texture2D INPUT; + +//!TEXTURE +//!WIDTH INPUT_WIDTH * 2 +//!HEIGHT INPUT_HEIGHT * 2 +Texture2D OUTPUT; + +//!SAMPLER +//!FILTER POINT +SamplerState SP; + +//!SAMPLER +//!FILTER LINEAR +SamplerState SL; + +//!COMMON +#define O(t, p) t.SampleLevel(SP, pos + p * pt, 0) +#define V4 min16float4 +#define M4 min16float4x4 + +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +//!FORMAT R8G8B8A8_SNORM +Texture2D t0; + +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +//!FORMAT R8G8B8A8_SNORM +Texture2D t1; + +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +//!FORMAT R8G8B8A8_SNORM +Texture2D t2; + +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +//!FORMAT R8G8B8A8_SNORM +Texture2D t3; + +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +//!FORMAT R8G8B8A8_SNORM +Texture2D t4; + +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +//!FORMAT R8G8B8A8_SNORM +Texture2D t5; + +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +//!FORMAT R8G8B8A8_SNORM +Texture2D t6; + +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +//!FORMAT R8G8B8A8_SNORM +Texture2D t7; + +//!PASS 1 +//!DESC in +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 +//!IN INPUT +//!OUT t0, t1, t2, t3 + +#define l0(x, y) min16float((dot(float3(-1.941e-01, -3.865e-01, -8.377e-02), O(INPUT, float2(x, y)).rgb) + 2.427e-01)) + +V4 f0(min16float s0_0, min16float s0_1, min16float s0_2, min16float s0_3, min16float s0_4, min16float s0_5, min16float s0_6, min16float s0_7, min16float s0_8) { + V4 r = 0.0; + r += V4(3.079e-02, -3.606e-03, 7.865e-02, -7.318e-03) * s0_0; + r += V4(-8.047e-03, 1.049e-02, -8.037e-02, 1.078e-02) * s0_1; + r += V4(2.018e-03, -5.329e-03, 8.914e-02, -2.185e-03) * s0_2; + r += V4(2.427e-01, -1.099e-01, -4.625e-02, -3.691e-01) * s0_3; + r += V4(-2.399e-01, 1.115e-01, -4.162e-02, 3.721e-01) * s0_4; + r += V4(-1.869e-02, -1.139e-02, 3.210e-02, 2.956e-04) * s0_5; + r += V4(1.169e-01, -2.234e-01, -1.335e-02, -1.347e-02) * s0_6; + r += V4(-1.421e-01, 2.203e-01, -5.437e-02, -6.029e-04) * s0_7; + r += V4(8.644e-03, 1.055e-02, -3.855e-04, 9.967e-03) * s0_8; + r += V4(8.018e-03, 1.569e-02, 1.090e-02, -7.794e-05); + return r; +} + +V4 f1(min16float s0_0, min16float s0_1, min16float s0_2, min16float s0_3, min16float s0_4, min16float s0_5, min16float s0_6, min16float s0_7, min16float s0_8) { + V4 r = 0.0; + r += V4(7.324e-02, 1.679e-02, -2.775e-02, -4.778e-02) * s0_0; + r += V4(2.549e-01, 4.843e-02, 5.584e-02, 7.739e-02) * s0_1; + r += V4(1.709e-02, -8.911e-02, -4.865e-02, -1.851e-02) * s0_2; + r += V4(-6.274e-02, -7.121e-02, 1.284e-01, 1.029e-01) * s0_3; + r += V4(-2.921e-01, -1.194e-01, -6.886e-02, 2.502e-01) * s0_4; + r += V4(-1.090e-02, -3.670e-02, 7.626e-02, 3.154e-02) * s0_5; + r += V4(9.342e-03, 4.821e-02, -1.915e-02, -6.984e-02) * s0_6; + r += V4(5.284e-03, 6.002e-02, -4.112e-02, 1.237e-01) * s0_7; + r += V4(-5.183e-03, 1.393e-01, 8.273e-03, -1.178e-02) * s0_8; + r += V4(1.318e-02, 1.522e-02, 4.021e-03, -8.088e-02); + return r; +} + +V4 f2(min16float s0_0, min16float s0_1, min16float s0_2, min16float s0_3, min16float s0_4, min16float s0_5, min16float s0_6, min16float s0_7, min16float s0_8) { + V4 r = 0.0; + r += V4(1.577e-01, 5.275e-03, -8.819e-02, -1.712e-02) * s0_0; + r += V4(-1.033e-01, 1.714e-01, -2.117e-01, -2.830e-02) * s0_1; + r += V4(-6.247e-02, -2.103e-02, -2.257e-03, 4.623e-02) * s0_2; + r += V4(-2.031e-02, 7.706e-02, -6.031e-02, -3.312e-01) * s0_3; + r += V4(-1.796e-01, 2.363e-01, 1.926e-02, 1.713e-01) * s0_4; + r += V4(9.624e-02, 8.355e-02, 1.085e-01, 1.431e-01) * s0_5; + r += V4(3.225e-04, -7.018e-02, 3.764e-02, -6.763e-02) * s0_6; + r += V4(5.291e-02, -4.092e-01, 1.667e-01, 9.630e-02) * s0_7; + r += V4(7.371e-03, -7.103e-02, 2.365e-02, -1.196e-02) * s0_8; + r += V4(1.425e-02, -3.870e-03, -1.067e-02, 7.370e-03); + return r; +} + +V4 f3(min16float s0_0, min16float s0_1, min16float s0_2, min16float s0_3, min16float s0_4, min16float s0_5, min16float s0_6, min16float s0_7, min16float s0_8) { + V4 r = 0.0; + r += V4(2.076e-03, 1.123e-02, 5.660e-02, -2.469e-02) * s0_0; + r += V4(8.450e-02, -8.344e-03, 3.408e-01, 1.068e-01) * s0_1; + r += V4(-8.521e-02, -8.863e-02, -8.628e-03, 4.745e-02) * s0_2; + r += V4(4.301e-02, 1.143e-02, -6.893e-02, -1.578e-01) * s0_3; + r += V4(8.960e-02, 3.037e-01, -3.176e-01, 4.196e-02) * s0_4; + r += V4(-1.172e-01, -2.426e-01, -8.905e-03, 2.253e-01) * s0_5; + r += V4(-4.505e-02, -7.804e-03, 1.783e-02, -8.501e-02) * s0_6; + r += V4(-1.606e-01, -1.452e-02, -1.241e-02, -1.597e-01) * s0_7; + r += V4(1.909e-01, 3.577e-02, 6.756e-03, 1.028e-02) * s0_8; + r += V4(-4.116e-03, 1.699e-02, -1.220e-02, -2.878e-03); + return r; +} + +void Pass1(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = Rmp8x8(tid.x) + blockStart; + uint2 size = GetInputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = (gxy + 0.5) * pt; + + min16float s0_0 = l0(-1.0, -1.0); + min16float s0_1 = l0(0.0, -1.0); + min16float s0_2 = l0(1.0, -1.0); + min16float s0_3 = l0(-1.0, 0.0); + min16float s0_4 = l0(0.0, 0.0); + min16float s0_5 = l0(1.0, 0.0); + min16float s0_6 = l0(-1.0, 1.0); + min16float s0_7 = l0(0.0, 1.0); + min16float s0_8 = l0(1.0, 1.0); + + t0[gxy] = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8); + t1[gxy] = f1(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8); + t2[gxy] = f2(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8); + t3[gxy] = f3(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8); +} + +//!PASS 2 +//!DESC conv1 +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 +//!IN t0, t1, t2, t3 +//!OUT t4, t5, t6, t7 + +#define l0(x, y) V4(O(t0, float2(x, y))) +#define l1(x, y) V4(O(t1, float2(x, y))) +#define l2(x, y) V4(O(t2, float2(x, y))) +#define l3(x, y) V4(O(t3, float2(x, y))) + +V4 f0(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(2.048e-02, -4.829e-03, 1.116e-01, 1.424e-01, 4.054e-02, -1.403e-02, -1.093e-02, -4.677e-02, 1.253e-01, 2.540e-02, 1.268e-02, 7.303e-02, 6.252e-02, 1.872e-01, -8.308e-02, -1.259e-01)); + r += mul(s0_1, M4(-4.819e-02, 9.732e-02, 2.710e-03, 4.293e-02, -4.048e-02, -7.517e-02, -1.502e-01, -9.363e-02, -1.166e-01, -4.531e-02, 1.796e-01, 2.567e-02, -2.013e-01, 1.364e-01, -4.303e-02, -2.691e-02)); + r += mul(s0_2, M4(1.476e-01, 3.921e-02, 1.519e-01, 5.807e-02, 3.850e-02, -2.336e-01, -2.001e-01, 6.151e-03, 5.383e-02, 6.078e-02, -1.792e-01, -1.423e-01, 8.391e-02, 2.738e-01, 1.784e-01, -7.098e-02)); + r += mul(s0_3, M4(4.426e-04, -1.720e-01, -5.887e-02, 1.816e-02, 1.950e-02, 2.097e-01, -5.867e-02, 1.822e-02, -4.042e-03, -1.147e-02, -6.860e-02, 3.117e-02, 8.652e-02, 1.681e-01, -6.179e-02, -8.912e-02)); + r += mul(s0_4, M4(-2.212e-01, 2.744e-01, -3.287e-02, 1.385e-02, -2.971e-03, 2.905e-02, 4.532e-02, 4.762e-02, -2.109e-02, 5.882e-02, -4.547e-02, -2.030e-02, 1.673e-01, 6.945e-02, -3.483e-01, -4.171e-01)); + r += mul(s0_5, M4(-4.755e-02, 2.782e-01, 8.658e-02, -3.461e-01, 2.831e-02, 7.165e-03, 5.473e-02, 9.912e-02, -5.727e-02, 4.351e-02, -1.463e-01, 1.089e-01, -7.061e-02, 3.919e-01, 1.370e-01, 6.642e-02)); + r += mul(s0_6, M4(1.101e-01, 5.662e-02, -7.494e-02, -5.565e-03, 1.182e-01, -4.261e-02, 5.721e-02, 2.424e-02, 1.077e-01, 1.178e-02, 3.188e-02, -1.370e-02, 2.044e-02, 8.463e-02, -9.320e-02, 1.874e-02)); + r += mul(s0_7, M4(1.014e-02, 1.127e-01, 3.595e-02, -2.266e-01, -9.668e-02, 3.770e-02, 1.041e-01, 2.042e-02, -9.701e-02, -2.058e-02, -4.635e-02, -1.055e-01, -2.100e-01, -1.200e-01, 1.076e-01, 5.583e-01)); + r += mul(s0_8, M4(1.595e-01, -1.046e-02, -1.695e-02, 2.403e-02, -3.490e-02, -1.954e-01, -1.325e-02, -1.459e-02, 1.135e-02, -1.278e-01, 3.800e-02, -4.423e-02, -8.423e-02, -4.600e-01, -3.075e-02, 2.350e-01)); + r += mul(s1_0, M4(1.528e-02, -1.405e-02, -6.905e-02, -5.089e-02, 1.860e-02, -1.111e-02, 8.663e-02, -5.265e-02, 7.609e-02, 6.255e-02, -1.408e-01, 1.661e-01, -5.898e-02, -2.493e-01, 5.922e-02, -4.831e-02)); + r += mul(s1_1, M4(2.318e-01, -1.965e-01, -1.191e-02, 9.833e-03, 1.083e-01, 4.304e-01, 1.066e-01, -1.447e-01, 1.249e-01, 7.425e-02, 4.746e-02, 2.711e-01, -5.051e-02, -1.087e-01, -2.176e-02, 2.572e-01)); + r += mul(s1_2, M4(7.448e-02, -1.738e-01, -1.739e-01, 8.456e-02, 2.159e-01, 4.333e-01, -1.027e-01, -3.007e-01, -4.220e-02, 2.373e-01, -1.648e-01, -5.700e-02, -4.307e-02, -2.232e-01, -7.669e-02, 1.161e-01)); + r += mul(s1_3, M4(2.425e-03, 7.625e-02, -5.265e-02, 6.556e-02, 7.800e-02, -5.827e-02, -7.143e-02, -1.148e-01, -8.064e-02, 1.301e-02, -1.257e-01, 1.360e-01, -5.066e-02, -1.077e-01, 1.705e-02, 5.452e-02)); + r += mul(s1_4, M4(2.348e-01, -1.722e-01, 7.330e-02, 5.327e-01, 1.861e-01, 1.807e-01, -3.935e-03, 9.360e-02, 6.946e-03, -2.022e-02, 1.355e-01, -1.639e-01, 4.145e-01, -1.285e-01, -1.717e-01, -5.645e-01)); + r += mul(s1_5, M4(1.669e-01, -3.700e-01, -2.197e-01, 2.970e-01, -3.760e-01, 8.613e-02, 1.677e-02, -1.083e-01, 6.986e-02, 2.914e-01, 1.835e-01, -3.219e-02, -3.564e-01, -4.215e-02, 1.380e-01, 2.394e-01)); + r += mul(s1_6, M4(6.843e-02, 5.395e-02, -3.803e-02, 1.370e-01, -1.090e-02, -1.215e-01, 1.153e-02, -4.736e-02, -6.143e-02, -1.871e-01, 2.793e-01, 1.721e-01, -8.387e-03, -7.740e-03, 1.398e-01, -3.166e-02)); + r += mul(s1_7, M4(-5.026e-02, -1.521e-02, -4.912e-02, -1.959e-01, 2.314e-02, -4.775e-02, -1.317e-01, 8.754e-02, 3.595e-02, 2.588e-01, -1.679e-01, -1.083e-01, -3.263e-02, 2.192e-03, 1.870e-01, 3.609e-01)); + r += mul(s1_8, M4(1.043e-01, 1.864e-01, -3.583e-01, 5.765e-02, -7.832e-02, -4.087e-02, -3.872e-02, 1.526e-01, -1.825e-01, -1.559e-01, -9.546e-02, 3.329e-01, 1.625e-01, -1.244e-03, -8.165e-02, -2.106e-01)); + r += mul(s2_0, M4(4.537e-02, 8.269e-02, -7.632e-02, -2.650e-02, -5.914e-02, -2.708e-02, -5.644e-02, -1.955e-02, 4.075e-01, 1.023e-01, 2.545e-01, -3.611e-02, -4.924e-01, 2.777e-01, 2.361e-01, 8.845e-02)); + r += mul(s2_1, M4(1.618e-02, -4.293e-02, -2.222e-01, 9.574e-02, 5.111e-02, -7.128e-02, -8.863e-02, -9.884e-02, 2.190e-01, 2.622e-01, 4.013e-01, -2.096e-03, -5.959e-01, -5.596e-01, 2.032e-01, -5.020e-01)); + r += mul(s2_2, M4(-2.909e-02, -4.977e-02, -1.716e-01, 7.754e-02, -3.726e-02, -6.215e-02, -2.769e-02, 4.118e-02, 3.981e-01, -9.391e-02, 3.138e-01, 6.588e-03, -5.657e-02, 3.557e-01, 5.208e-02, 1.875e-01)); + r += mul(s2_3, M4(-1.199e-02, 3.765e-02, 2.132e-01, 1.092e-01, 7.937e-02, 8.123e-02, 3.154e-02, 1.558e-01, -3.848e-01, 4.161e-02, -4.289e-01, 2.959e-01, -3.045e-01, -1.637e-01, -1.188e-01, -2.289e-01)); + r += mul(s2_4, M4(-1.106e-01, -6.425e-02, -2.421e-05, 2.504e-01, -5.712e-02, -4.485e-02, 9.015e-02, 1.155e-01, -4.607e-01, 4.294e-01, -8.332e-02, 8.106e-03, -5.400e-01, -5.825e-01, -4.254e-01, -6.588e-01)); + r += mul(s2_5, M4(-6.044e-02, -1.510e-02, -1.153e-01, 1.034e-01, -3.919e-02, 1.693e-01, -9.993e-02, 9.887e-02, -4.767e-01, -5.224e-01, -2.356e-01, -2.719e-01, 2.220e-01, -5.790e-02, -2.353e-01, 3.756e-01)); + r += mul(s2_6, M4(-3.249e-02, 1.989e-01, -9.129e-02, -2.266e-01, 9.810e-02, 1.517e-02, -6.743e-02, -7.139e-02, 5.856e-02, -1.223e-01, 1.849e-01, -2.400e-01, -6.638e-01, -1.431e-01, 7.543e-02, 7.866e-02)); + r += mul(s2_7, M4(1.129e-01, -2.504e-01, -1.268e-01, -4.894e-01, -2.064e-02, -6.057e-02, 1.197e-01, -2.185e-01, -9.475e-02, -5.783e-03, 1.411e-01, 1.097e-02, -6.736e-01, 2.996e-01, 2.517e-02, 5.610e-01)); + r += mul(s2_8, M4(7.648e-02, -8.256e-02, -1.898e-03, -6.823e-02, -3.014e-02, 2.219e-02, -1.916e-02, 9.177e-02, -1.586e-01, 6.034e-02, -1.241e-01, 8.531e-02, -9.582e-02, 1.067e+00, -1.194e-01, 4.834e-01)); + r += mul(s3_0, M4(2.375e-01, -4.091e-01, 1.832e-01, 1.283e-01, -6.383e-03, 7.594e-02, 2.752e-01, -1.586e-02, 3.441e-02, -5.528e-02, 6.215e-02, -5.897e-02, 6.831e-02, 1.216e-02, 4.011e-02, -3.186e-02)); + r += mul(s3_1, M4(6.683e-02, 2.236e-01, 3.607e-01, -7.426e-02, 2.785e-03, 1.162e-01, -2.118e-01, -1.945e-03, -1.978e-02, -3.249e-03, 1.293e-01, -1.713e-01, 1.218e-01, -1.215e-02, -1.414e-01, -6.262e-02)); + r += mul(s3_2, M4(-3.481e-02, 1.937e-01, 5.413e-02, -6.549e-02, -1.993e-02, -9.367e-02, -1.667e-01, -3.937e-02, 2.967e-02, -7.572e-02, -1.416e-01, 3.481e-02, 1.576e-01, 6.027e-02, -3.635e-03, -7.787e-02)); + r += mul(s3_3, M4(1.250e-01, -4.078e-01, 1.158e-01, -1.665e-02, -3.614e-03, -1.915e-01, 2.157e-01, -5.540e-01, -9.113e-02, 1.063e-01, 7.709e-02, 4.088e-02, 2.007e-01, -8.304e-02, -3.002e-02, -5.822e-02)); + r += mul(s3_4, M4(-4.140e-02, -8.432e-02, 2.778e-01, 2.684e-01, -2.473e-01, -6.407e-02, -1.096e-01, -1.436e-01, 7.597e-02, 3.470e-02, 1.170e-01, -8.363e-02, 1.282e-01, -5.355e-03, -3.813e-02, 2.595e-02)); + r += mul(s3_5, M4(8.598e-02, -1.880e-01, 1.063e-01, -3.625e-02, -1.067e-02, -1.114e-01, 4.480e-02, -7.637e-02, 1.680e-02, 1.438e-01, 8.682e-02, 5.675e-02, 1.712e-01, -1.034e-01, -5.088e-02, -3.905e-02)); + r += mul(s3_6, M4(1.316e-01, 2.414e-02, 1.710e-01, -1.727e-02, 8.122e-02, -1.222e-01, 1.751e-01, -1.420e-01, 2.528e-02, -6.473e-02, 1.683e-03, 4.588e-02, 8.350e-03, 1.496e-02, -4.137e-03, -2.057e-02)); + r += mul(s3_7, M4(2.034e-01, 5.782e-01, 3.159e-01, 3.472e-01, 1.365e-01, -2.080e-01, 3.101e-02, 1.994e-01, -5.950e-02, -1.722e-01, -6.752e-02, -7.090e-02, 4.903e-02, -3.817e-02, -5.804e-02, 7.004e-02)); + r += mul(s3_8, M4(8.316e-02, -5.188e-02, 2.791e-02, 2.633e-01, 8.128e-02, -6.263e-02, 4.355e-03, 1.811e-01, 1.124e-03, 1.370e-01, -1.033e-01, 9.403e-02, 4.089e-03, 1.682e-01, -1.840e-02, 1.889e-01)); + r += mul(s4_0, M4(6.883e-02, -3.365e-02, -7.749e-02, -1.125e-02, -5.791e-02, 8.547e-02, -1.313e-01, 8.004e-02, 1.737e-01, -1.435e-01, 5.896e-02, 3.570e-01, 6.774e-03, -9.935e-02, -7.111e-02, -2.184e-02)); + r += mul(s4_1, M4(2.542e-02, 4.588e-02, -2.912e-02, 7.918e-02, -1.258e-01, 1.255e-01, 2.762e-01, 8.645e-02, 1.868e-01, -4.082e-02, 1.071e-01, -8.159e-02, 1.061e-01, -7.220e-02, 7.972e-02, -1.144e-01)); + r += mul(s4_2, M4(-3.943e-02, -2.530e-03, -1.421e-01, 1.234e-02, -6.156e-02, -5.961e-02, 1.371e-01, -8.217e-02, -1.241e-02, 2.655e-02, 1.023e-01, 2.034e-02, -2.526e-02, -2.962e-01, -1.047e-01, -5.024e-02)); + r += mul(s4_3, M4(-3.914e-02, -3.351e-02, -9.769e-02, 3.761e-02, -4.687e-02, 5.776e-03, -1.007e-01, -1.576e-02, 2.036e-02, 8.528e-02, -1.367e-01, -3.148e-02, 3.450e-02, 5.910e-02, -1.594e-01, 6.574e-02)); + r += mul(s4_4, M4(-1.158e-01, 9.737e-02, 4.901e-02, 9.995e-02, 3.487e-01, 2.029e-01, -1.692e-01, -3.025e-01, 2.957e-02, 1.805e-01, 2.607e-01, -2.922e-01, -3.176e-02, 7.012e-04, -6.591e-02, 1.762e-01)); + r += mul(s4_5, M4(1.198e-02, 1.014e-01, -1.126e-01, -2.023e-02, -7.713e-03, -3.943e-01, -3.786e-02, 1.089e-02, -1.520e-02, -1.209e-02, 1.198e-01, -3.087e-01, -4.675e-02, -1.251e-01, -1.260e-02, 1.825e-01)); + r += mul(s4_6, M4(-2.353e-03, 1.799e-02, -1.054e-01, -7.154e-02, 5.610e-02, -1.107e-01, -1.445e-01, -9.241e-02, -3.225e-02, -1.135e-01, -1.337e-01, -9.913e-02, -3.790e-02, -8.893e-03, 3.147e-02, 7.881e-02)); + r += mul(s4_7, M4(4.549e-02, 3.463e-03, -1.602e-01, -1.657e-01, -4.810e-02, -6.075e-02, 1.189e-01, 2.263e-01, 4.268e-02, 3.193e-02, 5.690e-02, -8.275e-02, -3.675e-02, 2.772e-02, 1.014e-01, 1.266e-01)); + r += mul(s4_8, M4(-2.574e-02, -6.567e-02, 5.514e-02, -2.007e-02, -6.985e-02, -3.602e-02, 1.411e-01, 2.116e-01, 2.192e-02, 2.803e-01, -4.727e-02, -1.305e-01, 7.359e-02, -2.774e-01, 1.381e-02, 2.945e-02)); + r += mul(s5_0, M4(1.886e-01, -3.069e-01, 1.924e-01, 8.122e-05, 1.030e-01, 3.917e-01, 9.103e-02, 1.352e-02, -5.548e-03, -9.670e-02, -1.490e-01, 4.872e-02, 1.341e-01, 2.537e-01, 3.456e-02, 2.064e-01)); + r += mul(s5_1, M4(-7.483e-03, 1.570e-01, -3.750e-02, 7.532e-02, -1.204e-01, -7.274e-02, -1.715e-01, -6.946e-02, -8.478e-03, 2.234e-02, -6.538e-02, 8.187e-02, -4.276e-02, 3.250e-01, 7.092e-02, -1.634e-01)); + r += mul(s5_2, M4(-2.400e-01, -6.757e-02, -2.895e-01, -4.304e-02, -6.639e-02, 2.374e-01, 2.146e-02, -2.000e-01, -1.112e-01, 3.496e-02, 1.347e-01, -1.487e-02, -1.085e-01, 4.659e-01, 1.224e-01, -8.265e-02)); + r += mul(s5_3, M4(3.145e-01, 1.658e-02, -2.276e-02, -1.438e-01, -3.178e-02, 3.935e-02, -3.544e-02, -1.899e-01, -5.814e-02, -1.307e-01, -1.382e-01, -3.227e-02, 1.437e-02, 1.111e-01, -1.035e-01, -7.885e-02)); + r += mul(s5_4, M4(-3.229e-01, -9.307e-02, 3.023e-01, 6.295e-03, 2.145e-01, -1.877e-01, -1.613e-01, -6.503e-01, -8.287e-03, 1.163e-01, 9.040e-02, 3.824e-01, 7.898e-02, 3.488e-02, 5.911e-02, -2.907e-01)); + r += mul(s5_5, M4(1.529e-01, -3.209e-01, 4.762e-04, -1.543e-01, -1.263e-01, 1.533e-01, -8.658e-02, -1.062e-01, 1.029e-01, 1.971e-01, 3.683e-03, -6.256e-02, 3.022e-02, 3.967e-01, 3.126e-01, 1.873e-01)); + r += mul(s5_6, M4(2.686e-01, -4.941e-01, -1.025e-01, -1.662e-01, 1.417e-01, 1.175e-01, -1.813e-01, -2.293e-01, -1.127e-01, -6.958e-02, -9.037e-02, 1.713e-01, 1.146e-01, -1.494e-01, -1.107e-01, 9.983e-02)); + r += mul(s5_7, M4(-2.660e-01, 1.089e-02, 5.858e-02, 2.201e-01, -1.121e-02, -2.135e-01, -2.460e-02, -1.489e-01, -2.915e-02, 1.928e-01, 7.983e-02, 3.235e-01, -1.740e-01, -7.737e-02, 1.455e-03, -3.482e-02)); + r += mul(s5_8, M4(-1.029e-02, 3.737e-01, 1.250e-01, 3.295e-02, -7.525e-02, 3.134e-01, -1.192e-01, 1.571e-01, -4.867e-02, 7.209e-02, -2.612e-02, 4.915e-02, 1.351e-01, -4.645e-02, -9.808e-02, -3.062e-02)); + r += mul(s6_0, M4(7.136e-02, 3.892e-01, -2.039e-02, -9.361e-02, -3.301e-02, 2.963e-02, -1.642e-02, -4.920e-03, -1.372e-01, -1.734e-01, -4.992e-02, -3.279e-02, 2.520e-02, 1.099e-01, 8.215e-02, 8.987e-02)); + r += mul(s6_1, M4(-3.586e-02, 5.550e-01, -1.931e-02, 5.454e-02, -1.024e-01, -1.373e-03, -1.027e-01, -1.894e-02, 2.436e-02, -7.983e-02, 1.831e-01, -7.232e-02, -9.584e-02, 2.270e-01, 4.128e-01, -1.151e-01)); + r += mul(s6_2, M4(9.899e-03, -8.969e-02, -1.024e-01, -9.267e-02, -5.787e-02, -5.934e-03, 3.101e-02, -8.005e-03, 1.361e-02, 5.110e-02, 1.814e-01, 9.458e-03, -5.395e-02, -1.132e-01, 8.022e-02, -9.348e-02)); + r += mul(s6_3, M4(-1.691e-02, 1.228e-01, -4.414e-01, -4.493e-02, 6.157e-02, 1.725e-01, 1.978e-01, 9.639e-02, -2.200e-01, 1.519e-02, -6.653e-02, -1.240e-01, 1.104e-01, -2.867e-01, -1.772e-01, -1.694e-01)); + r += mul(s6_4, M4(4.175e-03, -3.042e-03, -4.069e-01, -1.799e-01, 7.398e-02, 1.979e-01, -2.934e-01, -3.110e-01, -2.453e-01, 3.449e-01, 2.932e-03, 4.631e-01, -5.239e-02, 4.868e-02, -1.146e-01, -3.701e-01)); + r += mul(s6_5, M4(-1.675e-02, -3.687e-01, 5.851e-02, -9.250e-02, 4.892e-02, -1.813e-01, 4.720e-03, 3.314e-02, -1.723e-01, -1.135e-01, 3.627e-02, 5.550e-02, 6.245e-02, 3.006e-01, 1.394e-01, 1.003e-01)); + r += mul(s6_6, M4(-3.407e-02, -2.386e-01, 5.349e-02, -2.292e-01, 9.524e-02, 4.638e-02, -7.525e-02, -2.798e-02, 1.035e-01, 1.299e-01, 3.415e-01, -1.354e-01, 7.460e-02, -1.440e-01, 1.353e-01, 3.060e-03)); + r += mul(s6_7, M4(-1.258e-01, 2.745e-02, 1.231e-01, 1.713e-01, -2.098e-02, 7.189e-02, -1.986e-01, 2.369e-01, 1.856e-01, 4.211e-01, 6.151e-03, 6.073e-01, -3.834e-02, -2.427e-01, 5.039e-02, 1.161e-02)); + r += mul(s6_8, M4(-1.989e-02, -4.339e-03, 2.842e-01, -1.031e-02, 1.369e-02, -1.014e-01, -6.263e-02, 1.122e-01, -1.563e-01, -6.126e-01, 1.238e-01, 5.685e-02, 4.562e-02, -1.745e-01, 1.086e-01, -1.466e-01)); + r += mul(s7_0, M4(-4.805e-02, -1.401e-01, 6.923e-02, 1.697e-01, -2.523e-01, 8.848e-02, 1.435e-01, -2.233e-01, -5.380e-02, -6.852e-02, -1.428e-01, 2.790e-03, -2.441e-02, -2.829e-02, -5.574e-02, 1.381e-01)); + r += mul(s7_1, M4(1.177e-01, -7.392e-02, 1.024e-02, -1.602e-01, 7.005e-02, -5.573e-02, 2.307e-01, -7.645e-02, -3.209e-02, -7.073e-02, -1.727e-01, -1.063e-02, 6.527e-02, -3.432e-01, -4.096e-02, 7.950e-03)); + r += mul(s7_2, M4(-8.284e-02, 1.449e-01, -1.798e-02, -3.799e-02, -1.531e-03, -2.513e-01, -9.600e-02, -4.397e-02, -2.352e-02, 7.292e-03, -6.193e-02, 7.588e-02, -8.963e-02, 9.885e-04, -1.486e-01, 5.317e-02)); + r += mul(s7_3, M4(-6.310e-02, -2.401e-01, 4.052e-02, 1.000e-01, -8.855e-02, -2.369e-01, 2.686e-01, -7.257e-02, 2.088e-02, -2.243e-01, 3.193e-03, 1.760e-01, -6.365e-02, 9.996e-02, 2.837e-03, -8.671e-02)); + r += mul(s7_4, M4(8.164e-02, -4.756e-02, 2.309e-02, -2.026e-01, 4.132e-01, 4.186e-01, -2.936e-01, -2.088e-01, 5.347e-02, -2.918e-01, 2.646e-01, 9.397e-02, 4.247e-02, -6.289e-02, 7.642e-02, -2.434e-01)); + r += mul(s7_5, M4(-3.417e-02, 3.304e-02, -2.885e-02, 1.089e-02, -1.627e-02, 1.389e-01, 1.373e-01, 2.479e-02, 3.377e-02, 1.498e-01, 7.101e-02, 4.019e-02, 7.393e-03, 2.319e-01, -2.269e-02, 1.284e-01)); + r += mul(s7_6, M4(1.941e-02, 8.722e-02, -2.539e-02, 4.058e-02, -8.321e-02, -1.395e-01, -1.337e-01, 6.340e-02, 1.466e-02, 2.007e-01, 4.412e-02, -9.243e-02, -1.015e-01, 1.885e-01, -4.207e-02, 1.015e-01)); + r += mul(s7_7, M4(3.785e-02, 4.694e-02, 7.932e-02, 2.261e-02, 1.802e-01, -3.702e-01, 2.005e-02, 4.594e-03, 8.157e-02, -9.254e-02, 8.060e-02, -4.165e-01, 6.297e-02, 5.093e-02, 4.032e-03, -2.049e-02)); + r += mul(s7_8, M4(9.597e-03, 1.507e-01, -4.030e-02, 1.059e-01, 4.280e-02, -1.442e-01, -7.376e-02, -1.243e-01, -7.370e-02, 1.650e-01, 1.268e-01, -2.555e-01, 3.424e-02, -5.523e-02, -6.058e-02, -1.255e-01)); + r += V4(2.168e-01, -7.048e-03, 9.668e-03, -7.673e-03); + return r; +} + +V4 f1(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(2.536e-02, -1.410e-02, 1.647e-02, 3.362e-02, -5.931e-02, 5.242e-02, 8.443e-02, 1.832e-02, -6.297e-02, 1.131e-02, 1.886e-03, 7.406e-02, 2.468e-01, 3.622e-02, 9.487e-02, -1.406e-01)); + r += mul(s0_1, M4(1.708e-02, 5.549e-02, 8.309e-02, -3.319e-01, -8.135e-02, -6.274e-02, 4.542e-02, -1.088e-02, -6.131e-05, -6.698e-02, 2.377e-01, 1.074e-02, 2.328e-01, -5.083e-02, 5.312e-02, 3.142e-02)); + r += mul(s0_2, M4(2.108e-01, -2.520e-01, -1.814e-01, -2.618e-01, 1.928e-01, 1.105e-01, 3.550e-01, 2.058e-01, 3.686e-02, -1.207e-01, -3.100e-02, -3.347e-03, -2.387e-02, 1.090e-01, -5.270e-02, -1.661e-01)); + r += mul(s0_3, M4(-1.782e-01, 9.148e-02, 1.673e-02, 1.584e-01, 9.863e-02, -6.084e-02, -1.283e-01, 4.255e-02, 3.218e-02, -1.173e-01, -2.996e-02, -7.470e-02, -1.136e-01, -6.690e-02, 1.829e-02, -2.640e-01)); + r += mul(s0_4, M4(-2.231e-01, -6.642e-02, -1.165e-01, 4.834e-01, 1.864e-01, 1.146e-01, 6.213e-02, -1.358e-01, -2.288e-02, -9.995e-02, -1.871e-02, -3.403e-02, 4.270e-02, -1.442e-01, 2.548e-01, -3.048e-01)); + r += mul(s0_5, M4(6.320e-02, 5.797e-02, 1.611e-01, -1.258e-01, 5.108e-02, -6.501e-02, -2.157e-01, -5.767e-02, -4.806e-03, 5.627e-02, 8.263e-02, 6.277e-02, 1.150e-01, 1.506e-01, 3.555e-02, -2.758e-01)); + r += mul(s0_6, M4(6.143e-02, -1.360e-01, 6.878e-02, 1.956e-02, 4.439e-02, -6.323e-02, -5.701e-02, -3.591e-02, -3.441e-02, 3.028e-02, -9.030e-02, -2.044e-01, -1.354e-01, -1.885e-01, 6.433e-02, -8.726e-02)); + r += mul(s0_7, M4(2.577e-02, 1.404e-01, -5.843e-02, 9.891e-02, 4.416e-02, -1.072e-01, -2.792e-03, -2.544e-02, 8.820e-02, 1.357e-01, -5.828e-02, 1.665e-01, 8.421e-02, 7.829e-02, -1.086e-02, 1.252e-01)); + r += mul(s0_8, M4(1.450e-01, 4.198e-02, -3.822e-03, 9.691e-02, 2.170e-02, 1.878e-01, -1.555e-01, 1.012e-01, -2.978e-02, 7.988e-02, -5.955e-02, 6.559e-02, -1.048e-01, -2.250e-01, 6.121e-02, -1.443e-01)); + r += mul(s1_0, M4(1.716e-01, 1.011e-01, 8.449e-02, -1.361e-01, 7.292e-02, -2.243e-01, 9.731e-02, -8.865e-02, -2.096e-01, -4.386e-01, -1.018e-01, -1.794e-01, -1.590e-02, 1.191e-01, -1.300e-01, 7.400e-02)); + r += mul(s1_1, M4(-2.492e-01, 1.453e-01, 2.022e-01, 4.891e-02, -7.163e-02, -1.665e-01, 2.042e-02, 5.348e-01, 3.951e-01, 4.514e-01, 1.276e-01, 1.216e-01, 3.184e-02, 6.502e-02, -2.052e-01, 1.890e-01)); + r += mul(s1_2, M4(3.835e-02, -5.284e-02, -2.494e-01, 2.411e-01, -5.676e-03, -1.005e-01, 2.276e-01, -7.575e-01, 1.925e-01, 4.742e-01, -4.667e-01, -1.748e-01, -4.170e-01, -1.441e-01, -3.124e-03, 3.889e-01)); + r += mul(s1_3, M4(1.985e-01, -1.217e-01, 6.853e-02, -6.425e-01, -1.093e-01, 3.058e-02, 1.008e-01, -1.000e-02, -4.686e-02, 3.577e-01, 5.252e-02, 2.789e-02, 1.321e-01, 2.989e-01, -7.806e-02, 1.051e-01)); + r += mul(s1_4, M4(2.250e-01, -4.267e-01, 7.196e-02, -8.018e-01, 1.341e-01, 1.303e-01, 1.809e-01, 6.113e-01, 1.488e-02, 8.244e-02, 9.509e-02, -6.869e-02, 3.005e-01, 2.894e-01, 1.626e-01, 5.481e-02)); + r += mul(s1_5, M4(3.079e-01, -2.656e-01, -4.390e-02, 1.123e-01, 3.129e-02, 2.423e-01, 1.855e-01, 6.808e-02, 1.320e-01, 2.064e-02, -2.904e-02, -1.324e-01, -8.232e-02, -1.363e-01, -5.007e-01, 3.797e-01)); + r += mul(s1_6, M4(5.187e-02, -1.303e-02, -1.266e-01, -1.807e-01, 1.205e-01, -7.534e-02, 2.407e-01, 3.149e-02, 8.110e-03, -3.276e-02, 8.138e-02, -5.819e-02, -6.869e-02, -1.575e-01, -4.518e-02, 4.960e-02)); + r += mul(s1_7, M4(7.838e-02, -1.572e-01, -8.077e-02, -5.178e-01, 1.536e-02, -1.072e-01, 1.329e-01, 3.574e-02, -1.702e-01, -2.425e-01, -1.537e-01, -3.181e-01, 1.056e-01, 3.161e-01, -1.665e-01, 6.447e-02)); + r += mul(s1_8, M4(-1.255e-01, -1.266e-01, -3.164e-02, -2.112e-01, -1.026e-01, 2.861e-01, 1.551e-02, -1.131e-02, 6.266e-02, -2.642e-01, -2.798e-01, 2.402e-01, -2.326e-01, 2.260e-01, -8.163e-02, 5.749e-02)); + r += mul(s2_0, M4(-8.472e-02, 3.525e-02, -3.044e-03, 8.102e-02, -1.510e-01, 2.814e-02, -2.020e-01, -2.593e-02, -1.469e-01, 2.096e-01, 1.935e-01, 1.393e-01, -3.591e-01, 4.131e-01, -7.662e-01, 2.411e-01)); + r += mul(s2_1, M4(3.957e-02, -6.504e-02, 3.046e-01, -8.791e-02, 2.511e-02, 1.664e-01, 2.942e-01, -9.583e-02, 1.185e-01, 6.388e-02, -1.285e-01, 2.930e-01, -3.716e-01, 9.728e-01, -2.521e-01, 5.220e-02)); + r += mul(s2_2, M4(7.598e-02, 9.158e-02, 2.824e-02, -6.247e-02, -1.126e-01, 8.460e-02, 5.086e-02, 1.760e-01, 3.303e-02, 2.893e-01, 3.190e-01, 6.632e-03, 6.721e-01, -1.753e-01, -2.229e-01, 2.627e-01)); + r += mul(s2_3, M4(1.787e-01, -1.077e-02, -5.198e-02, -7.528e-02, 1.769e-03, 1.579e-01, 1.184e-01, -8.013e-02, 6.146e-03, -2.568e-01, 7.215e-02, -1.016e-01, 3.469e-01, -3.423e-01, -6.154e-02, -1.618e-01)); + r += mul(s2_4, M4(1.202e-02, -1.281e-01, -1.330e-01, -1.741e-02, 9.794e-02, -1.963e-01, -8.935e-02, 8.661e-02, 3.888e-01, -8.260e-02, -1.119e-01, -1.267e-02, -1.810e-01, 7.144e-02, 5.592e-01, -2.022e-01)); + r += mul(s2_5, M4(-6.198e-02, -1.699e-03, 9.683e-02, -1.632e-02, 1.796e-03, 3.730e-02, -1.630e-01, -7.638e-04, 1.343e-01, -3.744e-02, -3.589e-01, -3.690e-02, 4.693e-01, -1.661e-01, -2.354e-01, -1.382e-03)); + r += mul(s2_6, M4(1.837e-02, -2.326e-02, -1.332e-01, -2.146e-02, 1.084e-01, -1.774e-01, 2.879e-03, 1.380e-02, 3.178e-02, 2.288e-01, 4.481e-02, 1.634e-01, -3.233e-01, -1.216e-01, 6.813e-02, 3.430e-02)); + r += mul(s2_7, M4(1.806e-01, -1.755e-01, 2.481e-02, 8.190e-02, -1.475e-02, -1.077e-01, 1.408e-02, -1.033e-02, 2.499e-02, -8.072e-02, -9.272e-02, -4.949e-02, -4.336e-01, 5.354e-01, 1.022e+00, -1.878e-01)); + r += mul(s2_8, M4(-3.080e-03, 6.252e-02, 4.382e-02, 1.736e-01, -1.568e-02, 1.294e-01, 1.588e-01, -3.209e-03, -5.668e-02, -2.989e-02, 2.673e-01, -1.652e-01, -1.984e-01, -2.244e-01, -1.289e-01, -2.206e-02)); + r += mul(s3_0, M4(-3.345e-02, -6.145e-02, 1.239e-01, 1.860e-01, 5.689e-01, 5.143e-02, -1.748e-01, -4.751e-01, -2.738e-01, -1.132e-01, -1.073e-01, -5.956e-02, 6.889e-02, 4.414e-02, -5.410e-02, 2.421e-02)); + r += mul(s3_1, M4(-4.755e-02, -3.658e-02, 1.941e-01, 1.070e-01, 6.188e-02, -4.438e-01, 6.193e-02, -8.983e-02, 8.250e-02, -3.456e-02, -3.287e-03, 1.277e-01, 8.643e-02, 3.769e-02, -1.689e-01, -5.630e-02)); + r += mul(s3_2, M4(4.335e-02, 1.358e-02, 5.347e-02, 1.566e-01, -4.897e-02, -1.998e-01, 2.272e-01, -7.817e-02, -1.532e-01, 3.866e-02, -4.835e-02, -8.465e-03, -1.622e-01, -8.045e-02, 8.395e-02, -1.099e-01)); + r += mul(s3_3, M4(-2.014e-01, 8.535e-02, -1.486e-01, 4.427e-01, 5.379e-01, -2.338e-02, -1.982e-01, -1.629e-01, -9.256e-03, 1.563e-01, -2.911e-02, -6.092e-02, -7.215e-02, 1.460e-01, -4.224e-03, 4.965e-02)); + r += mul(s3_4, M4(5.919e-02, 3.212e-01, -3.621e-02, -4.207e-01, 6.892e-02, 8.369e-02, 4.878e-02, -1.324e-01, -1.539e-01, 9.862e-03, -1.181e-01, 1.386e-01, 4.491e-02, 4.382e-02, 5.232e-02, 1.089e-01)); + r += mul(s3_5, M4(-4.122e-02, 1.981e-01, 3.009e-02, 1.198e-01, 6.533e-01, -1.429e-01, -4.168e-01, -8.503e-02, 3.888e-02, 3.679e-02, -1.368e-01, -3.706e-02, 4.718e-02, -1.036e-01, 6.045e-02, 2.219e-02)); + r += mul(s3_6, M4(-1.123e-01, -1.056e-01, -3.821e-02, -8.801e-02, -4.420e-02, 4.255e-03, -2.447e-01, 4.728e-03, 1.282e-01, 1.008e-01, 1.862e-01, -9.000e-03, -1.476e-02, -6.480e-02, 1.721e-02, 8.208e-02)); + r += mul(s3_7, M4(8.583e-02, -5.756e-02, -2.266e-01, -3.114e-01, -2.369e-01, 1.099e-01, -2.180e-01, -2.813e-01, -8.890e-02, -8.020e-02, 1.347e-01, -5.877e-02, 1.781e-01, 1.528e-02, 2.447e-02, -6.176e-02)); + r += mul(s3_8, M4(-5.824e-02, -2.396e-02, -1.056e-01, 2.120e-01, 7.797e-02, -7.151e-03, 9.115e-02, -1.450e-01, 7.011e-02, 2.717e-02, -1.055e-01, -8.077e-02, -1.130e-01, -1.042e-01, -6.020e-03, 5.198e-03)); + r += mul(s4_0, M4(5.166e-03, 1.304e-01, -4.617e-02, 2.465e-01, -1.138e-01, -8.594e-02, 2.374e-02, 2.387e-01, -1.221e-01, 3.200e-01, -4.661e-02, -2.573e-01, -1.490e-01, 8.570e-02, 1.173e-01, -8.304e-02)); + r += mul(s4_1, M4(-1.341e-01, -9.204e-02, 1.326e-01, -4.510e-02, 1.127e-01, -1.129e-01, -9.003e-02, 6.497e-02, -8.473e-02, 2.957e-01, -5.822e-02, 2.001e-01, -1.312e-01, 1.851e-01, 6.737e-02, 2.108e-01)); + r += mul(s4_2, M4(-1.810e-01, 5.466e-02, 1.819e-01, 1.517e-01, 7.883e-02, -2.586e-02, -1.670e-01, -7.121e-02, -2.213e-01, 2.562e-01, -1.028e-02, 1.537e-01, -2.064e-01, 1.528e-01, 2.646e-01, 8.116e-02)); + r += mul(s4_3, M4(1.251e-01, -1.643e-01, -1.100e-01, -1.026e-01, -1.469e-01, 1.956e-01, -1.132e-01, -2.920e-01, -1.660e-01, 4.833e-01, 7.354e-02, 3.729e-01, 2.297e-01, 1.096e-01, 1.608e-01, -9.050e-02)); + r += mul(s4_4, M4(-1.269e-01, -1.451e-01, -1.771e-01, -2.583e-02, 2.799e-01, -7.998e-02, -7.126e-02, -3.134e-01, -1.531e-01, 2.349e-01, -6.403e-02, 3.341e-01, 5.373e-01, 3.720e-01, 5.513e-02, -3.110e-02)); + r += mul(s4_5, M4(2.867e-01, -7.715e-02, -2.043e-02, -1.149e-01, -7.275e-02, 1.572e-01, 1.648e-02, -1.160e-03, -8.993e-02, -1.441e-02, -2.222e-01, 1.281e-01, 6.476e-02, 2.251e-01, -2.359e-01, -1.092e-01)); + r += mul(s4_6, M4(-1.415e-02, 1.372e-01, -1.024e-02, -1.359e-01, -1.174e-01, 1.206e-01, 3.089e-02, 9.655e-02, -7.835e-02, 2.261e-01, 8.681e-02, 3.623e-01, 1.141e-01, -1.457e-03, -1.088e-01, -1.918e-01)); + r += mul(s4_7, M4(-1.089e-01, -7.624e-02, -2.815e-02, -6.304e-02, -7.850e-02, 2.300e-01, 1.237e-02, -1.772e-01, -1.581e-01, 1.061e-01, 1.307e-02, 2.340e-02, -1.419e-01, -1.174e-01, -2.259e-01, -2.288e-01)); + r += mul(s4_8, M4(1.302e-01, -4.664e-03, -3.681e-02, 5.637e-02, -1.678e-01, 8.718e-02, -2.442e-02, -7.711e-02, 4.939e-02, 2.992e-01, 1.165e-01, -4.479e-02, -1.839e-01, 1.086e-01, -9.941e-02, -4.750e-02)); + r += mul(s5_0, M4(2.046e-01, 1.038e-01, -4.133e-01, -2.010e-01, 2.893e-02, -1.592e-01, 1.398e-01, -7.004e-02, 1.399e-01, -1.197e-01, 2.010e-02, -6.009e-02, 1.121e-01, -1.981e-01, -1.484e-01, -6.293e-02)); + r += mul(s5_1, M4(2.744e-02, -1.539e-01, -4.901e-01, -1.259e-01, 7.296e-03, 1.802e-03, -3.523e-02, 2.218e-02, -2.658e-02, -1.041e-01, 1.138e-02, 9.445e-02, 3.299e-02, -2.628e-01, -1.952e-01, -2.199e-01)); + r += mul(s5_2, M4(1.606e-02, 1.991e-01, 1.412e-01, 1.806e-03, -2.459e-01, -5.529e-02, -1.762e-01, 9.896e-02, 2.059e-01, -1.678e-01, 3.718e-02, 2.952e-02, 3.115e-01, -1.161e-01, -2.211e-01, -1.061e-01)); + r += mul(s5_3, M4(-3.352e-01, 1.077e-01, 2.678e-01, -4.436e-01, 1.087e-02, -1.374e-02, 2.687e-02, 6.731e-02, 5.617e-02, -9.116e-02, 1.330e-02, -9.804e-02, -1.134e-01, -2.236e-02, -1.948e-01, -7.179e-02)); + r += mul(s5_4, M4(2.647e-01, -2.525e-02, -2.016e-01, -1.311e-01, 3.206e-01, 2.642e-01, 9.656e-02, 5.895e-02, 5.513e-02, -2.987e-02, 8.391e-02, -1.445e-01, -2.961e-01, -5.127e-01, -1.732e-01, 3.098e-02)); + r += mul(s5_5, M4(-8.694e-02, 6.743e-01, 3.185e-01, 1.705e-01, -7.492e-02, 5.664e-02, -1.143e-01, 1.243e-01, 1.243e-01, -1.035e-01, 5.420e-02, -1.083e-01, -1.275e-01, -2.274e-01, -2.832e-01, -1.849e-02)); + r += mul(s5_6, M4(1.238e-01, 1.585e-01, 5.295e-01, 8.451e-02, 5.142e-02, -2.950e-02, 2.497e-02, 1.916e-01, -7.226e-02, -1.434e-01, 1.111e-01, -1.004e-01, 2.997e-02, -1.751e-02, -5.959e-02, -4.726e-02)); + r += mul(s5_7, M4(8.209e-01, 1.719e-01, 5.450e-01, -2.042e-02, 9.534e-02, 1.269e-01, 5.457e-02, -1.328e-02, -2.037e-01, 9.191e-02, -8.484e-02, 5.416e-03, 1.403e-02, -3.179e-02, 2.140e-01, -4.565e-02)); + r += mul(s5_8, M4(1.142e-01, 5.137e-01, 1.714e-01, 5.144e-01, -1.404e-02, -4.950e-02, 1.041e-01, 1.605e-01, -4.338e-02, 4.684e-02, -1.573e-02, -1.635e-02, 5.163e-02, -1.147e-01, 6.578e-02, 2.531e-01)); + r += mul(s6_0, M4(1.340e-01, -2.285e-01, -9.562e-02, 1.714e-01, 2.930e-01, 8.161e-02, -4.617e-02, -4.056e-02, -2.496e-03, 4.013e-03, -5.556e-02, 2.695e-02, 2.549e-01, -2.422e-01, -5.763e-03, -3.592e-01)); + r += mul(s6_1, M4(-2.073e-01, -2.901e-01, 2.882e-01, 1.224e-01, 2.254e-01, -6.127e-02, 1.563e-01, 1.424e-01, -1.351e-01, 1.496e-02, 2.001e-02, 2.628e-02, 8.940e-02, -3.824e-01, -2.008e-02, -2.165e-01)); + r += mul(s6_2, M4(1.411e-01, 7.237e-02, -7.323e-02, -6.832e-02, -2.638e-02, 2.173e-02, -5.183e-02, -2.793e-02, 1.588e-01, -3.605e-02, -1.937e-01, 2.666e-01, 3.727e-02, -1.306e-01, -1.939e-01, -2.043e-01)); + r += mul(s6_3, M4(-9.488e-02, -1.844e-01, 7.070e-02, -1.471e-01, -9.504e-03, -1.100e-01, 5.983e-02, -7.031e-03, 2.339e-01, 2.060e-01, -1.541e-01, -1.469e-01, -6.130e-02, -1.651e-01, 5.473e-03, -4.535e-01)); + r += mul(s6_4, M4(-9.408e-02, 1.051e-01, 5.935e-01, 2.440e-01, 4.207e-02, -1.485e-01, 2.241e-01, -1.543e-01, 4.195e-02, -1.073e-01, -3.652e-01, 7.859e-02, 2.443e-01, -3.602e-01, 7.919e-02, -3.963e-01)); + r += mul(s6_5, M4(-9.282e-02, -5.716e-03, 2.926e-01, 1.167e-02, 4.879e-02, 3.732e-02, -8.926e-02, 4.256e-02, -1.788e-01, 2.622e-01, 1.357e-01, 7.940e-02, 1.382e-01, 6.902e-02, -1.767e-01, -1.719e-01)); + r += mul(s6_6, M4(-1.696e-03, -1.124e-01, 1.223e-01, -2.895e-01, 1.031e-01, -7.886e-02, 3.023e-02, 7.795e-02, -4.661e-02, -9.979e-02, 6.993e-02, -7.016e-02, 4.502e-02, -7.555e-02, -6.096e-02, -3.440e-01)); + r += mul(s6_7, M4(-3.132e-02, -1.518e-01, 9.386e-02, 3.184e-02, -2.529e-02, 2.358e-01, -1.085e-01, 1.057e-01, 7.691e-03, -2.959e-01, 3.834e-03, 1.955e-01, 1.709e-01, -3.687e-02, 8.499e-02, 2.509e-02)); + r += mul(s6_8, M4(3.696e-02, 5.454e-02, -1.603e-01, 1.265e-01, -9.435e-02, 5.880e-02, -3.653e-02, 6.345e-02, -1.639e-02, -2.848e-01, -6.280e-02, 2.619e-01, 7.176e-02, -4.521e-02, 5.806e-02, 8.413e-02)); + r += mul(s7_0, M4(-8.326e-02, -6.503e-02, -2.698e-01, 1.909e-01, 2.131e-02, -2.712e-01, 7.258e-02, -5.686e-03, 2.315e-02, 1.176e-01, -3.460e-02, -2.184e-01, -1.923e-01, 4.375e-02, -3.431e-03, 1.264e-01)); + r += mul(s7_1, M4(1.767e-01, 1.411e-01, 5.236e-02, -2.954e-02, -5.819e-02, -1.108e-01, -1.118e-02, -9.685e-02, -2.081e-02, -7.350e-02, 5.443e-02, -1.465e-01, -1.765e-01, 1.862e-01, -3.695e-02, 2.506e-01)); + r += mul(s7_2, M4(9.326e-02, 6.618e-03, -7.719e-02, -1.290e-01, -3.512e-02, -8.315e-02, -3.536e-01, 8.163e-02, -8.239e-02, 1.151e-01, 7.672e-02, -5.276e-02, -2.285e-01, -2.168e-02, 1.083e-01, 1.704e-01)); + r += mul(s7_3, M4(2.332e-02, 1.445e-01, 1.241e-01, -6.039e-02, 8.266e-02, -1.892e-01, -5.408e-01, 8.206e-02, 2.250e-01, 2.425e-01, 6.192e-02, 5.134e-03, -5.053e-02, 2.632e-01, -7.094e-03, 9.883e-02)); + r += mul(s7_4, M4(-2.304e-02, -8.378e-02, -6.218e-02, -1.157e-01, -4.370e-02, 1.416e-01, 4.883e-01, 1.203e-01, -1.086e-01, 5.591e-02, -2.372e-01, 5.909e-02, -1.630e-01, 1.430e-01, 8.641e-02, -4.704e-03)); + r += mul(s7_5, M4(-1.545e-01, -6.740e-02, 1.799e-01, -4.104e-02, -3.570e-02, 2.898e-01, -1.500e-01, -2.319e-01, -1.425e-01, -4.409e-02, 2.314e-01, 2.013e-02, -1.138e-01, 1.329e-01, -1.275e-01, 9.538e-02)); + r += mul(s7_6, M4(6.026e-02, 2.461e-01, 6.967e-02, 1.197e-01, -7.590e-02, 7.220e-02, -6.694e-02, -6.113e-01, 6.629e-02, 8.935e-02, -1.509e-01, 1.458e-01, -3.097e-02, 8.744e-02, 5.177e-02, 1.485e-01)); + r += mul(s7_7, M4(-7.051e-02, -1.119e-01, -7.987e-02, 3.374e-02, -2.263e-01, 5.299e-02, -2.333e-01, -6.558e-01, 9.406e-02, -2.782e-01, 1.104e-01, -2.358e-01, -1.142e-01, -4.699e-02, -2.193e-01, -5.177e-02)); + r += mul(s7_8, M4(-1.533e-02, -4.159e-02, -9.005e-02, -2.094e-02, 4.571e-02, 8.586e-02, -7.003e-02, -1.314e-01, -2.340e-02, -3.771e-02, 9.190e-02, 1.260e-01, -1.660e-01, -9.283e-03, 8.861e-02, -9.932e-02)); + r += V4(-4.065e-02, 3.730e-03, 1.817e-03, 1.345e-02); + return r; +} + +V4 f2(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(9.513e-02, -1.023e-01, 1.587e-01, 1.025e-01, -6.720e-02, 1.538e-01, -3.814e-02, 2.291e-02, 8.159e-02, -5.872e-02, 8.317e-02, 1.526e-01, 1.371e-01, -4.979e-04, -1.534e-01, -3.054e-02)); + r += mul(s0_1, M4(-5.019e-03, 1.215e-01, -2.858e-01, 1.509e-01, -7.670e-02, -1.181e-01, -3.646e-02, -5.105e-02, 1.079e-01, 8.831e-02, -1.282e-02, -1.592e-01, 2.819e-01, -1.678e-01, 1.269e-01, 2.218e-02)); + r += mul(s0_2, M4(-2.377e-01, -3.966e-02, -4.808e-02, -1.515e-03, 2.682e-02, -1.740e-02, 1.949e-01, -2.585e-01, 1.936e-01, -2.997e-02, 6.483e-02, -1.305e-01, 8.261e-02, -1.004e-01, 7.083e-03, -8.298e-02)); + r += mul(s0_3, M4(-1.870e-02, -2.180e-02, 1.287e-01, -1.681e-02, 5.307e-02, -1.779e-02, -3.764e-02, -6.278e-03, -6.895e-02, -1.381e-01, 8.012e-02, 1.061e-02, -1.052e-02, 6.920e-02, -9.246e-02, -1.925e-01)); + r += mul(s0_4, M4(1.152e-01, 3.707e-01, -3.938e-01, -2.672e-02, -2.630e-02, -3.670e-01, 9.251e-02, 1.047e-01, 3.332e-02, 3.702e-02, 3.343e-02, -4.699e-02, 1.887e-01, -3.178e-01, 4.346e-01, -1.446e-01)); + r += mul(s0_5, M4(-1.992e-01, 2.275e-01, -1.044e-01, -1.716e-01, 8.659e-03, -1.067e-01, -5.529e-02, 1.015e-01, -2.028e-01, -6.617e-03, 3.986e-02, -1.639e-01, 6.785e-01, 1.518e-01, 1.681e-01, -1.835e-01)); + r += mul(s0_6, M4(-1.659e-01, -8.147e-02, 1.015e-01, 5.627e-02, -6.553e-02, 1.071e-01, -1.059e-01, -1.409e-01, 1.422e-02, -9.457e-02, -1.223e-01, 9.262e-02, 2.481e-01, 3.273e-01, -4.202e-02, -1.980e-01)); + r += mul(s0_7, M4(1.837e-01, 1.838e-01, 4.286e-02, -2.344e-02, 1.487e-01, 3.209e-02, -3.188e-02, 8.071e-02, 9.691e-03, 8.573e-02, 2.254e-01, -5.335e-02, 6.388e-02, 7.047e-02, -1.156e-01, -1.170e-01)); + r += mul(s0_8, M4(-2.658e-01, 1.008e-01, 3.286e-02, 2.389e-03, 7.517e-02, -2.851e-02, 6.483e-02, 7.479e-02, -1.277e-01, 7.402e-02, -1.648e-01, 6.628e-02, 1.634e-01, 1.439e-01, -2.544e-01, 4.385e-02)); + r += mul(s1_0, M4(-1.361e-02, -2.189e-02, -1.571e-01, 7.063e-02, 1.665e-01, 1.246e-01, 2.842e-01, -3.367e-02, -2.822e-01, -2.907e-01, -5.340e-01, -1.405e-01, -3.345e-02, -7.615e-02, 2.898e-02, 5.967e-02)); + r += mul(s1_1, M4(-4.387e-02, -4.236e-01, 4.281e-01, -1.953e-01, 7.487e-01, 7.529e-01, -5.215e-01, 1.123e-01, -1.363e-01, 1.408e-02, -1.552e-01, 3.233e-01, -2.761e-01, 8.336e-02, -7.412e-02, -9.009e-02)); + r += mul(s1_2, M4(-4.157e-02, -3.318e-02, 2.718e-01, 1.120e-01, 3.292e-01, 1.252e-01, -2.324e-01, -5.152e-03, -3.227e-01, -2.902e-02, -4.069e-01, 2.859e-01, 2.375e-01, -4.981e-02, -1.607e-01, -1.368e-02)); + r += mul(s1_3, M4(2.961e-02, -3.944e-01, 6.968e-02, 6.573e-02, 2.166e-02, 1.155e-01, 1.526e-01, 1.394e-01, 1.478e-01, 7.622e-02, 5.468e-02, 4.773e-02, -1.586e-02, -1.204e-02, 5.099e-02, 1.672e-01)); + r += mul(s1_4, M4(-4.088e-01, -1.786e-02, 3.435e-01, 1.761e-01, 4.563e-01, 7.573e-01, -3.591e-01, -1.546e-01, -2.650e-01, 8.012e-02, -3.056e-01, 1.255e-01, -1.513e-01, -2.147e-01, -8.252e-02, 2.772e-02)); + r += mul(s1_5, M4(-1.657e-01, -1.217e-01, 3.345e-01, -2.820e-01, 3.113e-03, 4.717e-01, 4.105e-02, 2.253e-01, 2.879e-01, 1.124e-01, 6.953e-02, 5.647e-01, -2.668e-01, -3.415e-01, -1.983e-02, 1.841e-01)); + r += mul(s1_6, M4(5.096e-02, -3.405e-02, 2.642e-01, -1.489e-01, -1.688e-02, -1.223e-01, 2.398e-01, 9.426e-02, -2.125e-01, -1.438e-01, 5.223e-02, -2.062e-01, -2.646e-01, 1.598e-01, 4.466e-02, 2.793e-01)); + r += mul(s1_7, M4(-1.469e-01, -2.421e-01, 3.448e-01, -4.945e-02, 2.766e-01, 1.970e-01, -2.203e-01, -6.525e-02, 2.432e-02, 4.168e-01, 4.742e-01, 2.581e-01, -1.645e-01, -4.138e-01, -1.509e-01, 1.089e-01)); + r += mul(s1_8, M4(2.470e-01, -1.231e-01, -1.178e-01, -6.888e-02, -5.987e-02, -3.821e-02, -1.473e-01, 1.678e-01, 5.462e-01, 9.235e-02, -7.806e-01, 3.665e-01, -1.915e-01, -1.793e-01, -9.810e-02, 2.176e-01)); + r += mul(s2_0, M4(2.157e-01, 2.611e-02, 2.140e-02, 7.000e-02, 1.860e-01, -1.012e-02, 5.828e-02, 1.636e-01, 1.133e-02, 5.581e-02, -1.959e-01, 9.071e-03, -3.571e-01, 1.393e-01, -2.630e-01, -4.527e-01)); + r += mul(s2_1, M4(-2.209e-02, -8.153e-02, -2.016e-01, -2.546e-02, -1.248e-01, 3.990e-02, -2.968e-02, -1.432e-01, -7.041e-02, -2.290e-01, -1.667e-01, 2.402e-01, -3.291e-01, -3.824e-02, 4.528e-01, -2.175e-01)); + r += mul(s2_2, M4(4.376e-01, 3.842e-02, 4.605e-02, 3.200e-02, 2.267e-01, -1.208e-02, -2.008e-01, -1.760e-01, -1.106e-01, -7.952e-02, -2.439e-02, -2.233e-02, 2.287e-01, 7.038e-02, -8.782e-02, 2.208e-01)); + r += mul(s2_3, M4(-2.928e-01, -1.633e-01, 2.021e-01, -1.321e-01, -1.699e-01, -1.313e-01, 2.450e-01, 9.154e-02, -1.370e-01, -1.742e-01, 3.649e-01, 1.948e-02, -1.845e-01, 5.658e-01, -3.862e-01, -5.922e-01)); + r += mul(s2_4, M4(-1.180e-01, 5.187e-02, -1.602e-01, 1.942e-01, -6.294e-02, 6.854e-02, -4.731e-02, -1.045e-01, 4.786e-01, 1.082e-01, -2.489e-01, -3.709e-01, 1.893e-01, -8.286e-02, 1.363e-01, -5.499e-01)); + r += mul(s2_5, M4(3.056e-02, 8.957e-02, -1.323e-01, -4.396e-02, 1.382e-01, 4.930e-02, 1.285e-01, -1.072e-01, -8.383e-02, 7.365e-02, -3.295e-02, -4.595e-02, 3.012e-01, -3.066e-01, 3.639e-01, 6.333e-03)); + r += mul(s2_6, M4(1.122e-01, -1.318e-01, 2.506e-02, 7.950e-02, -1.492e-01, -1.961e-02, 1.083e-01, 6.986e-02, -6.250e-02, 1.755e-01, 1.868e-01, -1.286e-01, -4.907e-01, 1.165e-01, 2.817e-01, -7.604e-01)); + r += mul(s2_7, M4(5.926e-02, -1.446e-02, 6.740e-02, -1.877e-01, 1.512e-01, 4.305e-02, -4.368e-02, -3.655e-02, 2.004e-01, 8.357e-02, -4.056e-01, -2.699e-01, 6.772e-02, -5.004e-01, 7.243e-01, -6.036e-01)); + r += mul(s2_8, M4(-1.636e-01, 3.726e-02, -7.612e-02, -3.775e-02, -3.209e-02, -6.485e-02, -1.036e-01, 3.863e-02, -2.952e-01, -1.468e-01, 5.695e-01, -3.171e-01, 2.957e-01, -2.874e-01, -7.122e-02, 2.408e-01)); + r += mul(s3_0, M4(-2.847e-01, -6.624e-02, 3.070e-01, 2.705e-01, -4.489e-01, -2.211e-02, 6.367e-02, -1.580e-01, -3.082e-02, 1.637e-02, -5.281e-02, -2.793e-01, 1.842e-03, 1.121e-01, -1.861e-01, -2.153e-02)); + r += mul(s3_1, M4(-1.506e-01, -8.362e-03, 2.448e-01, 2.311e-01, -1.994e-04, 1.714e-01, -5.810e-02, -3.037e-01, -1.406e-01, 1.158e-02, -9.110e-02, -1.218e-03, 7.478e-02, -2.950e-03, 1.240e-02, 4.613e-02)); + r += mul(s3_2, M4(-1.082e-01, 2.173e-01, 1.511e-01, -3.761e-01, -1.362e-01, -7.930e-02, -3.676e-01, 3.172e-02, -1.701e-01, -8.242e-02, 7.806e-03, -9.085e-02, 8.387e-02, -4.756e-02, 1.034e-01, 2.831e-02)); + r += mul(s3_3, M4(1.168e-01, -1.872e-01, 2.581e-02, 1.804e-01, 3.309e-01, 3.506e-02, -1.452e-01, -5.199e-01, 8.211e-02, 1.174e-02, -3.079e-02, -7.860e-03, 2.571e-02, 2.033e-01, -2.844e-03, -5.911e-03)); + r += mul(s3_4, M4(5.956e-01, 3.077e-01, -2.823e-01, 4.851e-01, 2.023e-01, 8.281e-02, -1.973e-02, 2.091e-01, 7.000e-02, 2.272e-01, 7.937e-02, 1.465e-02, -3.652e-02, -8.854e-02, 5.284e-02, 2.072e-02)); + r += mul(s3_5, M4(2.745e-01, 1.015e-01, 1.909e-01, 1.966e-02, 8.355e-02, 1.783e-01, 1.539e-01, 2.331e-01, -1.056e-01, -5.163e-02, 2.818e-03, 2.078e-02, -6.584e-02, 1.102e-02, 6.753e-02, 3.359e-03)); + r += mul(s3_6, M4(1.170e-01, 2.291e-01, 1.342e-01, -1.054e-01, -3.271e-01, 3.134e-01, 2.687e-01, 3.008e-02, -9.659e-02, -2.473e-02, -3.813e-03, 5.018e-03, 5.568e-02, 9.386e-03, -1.370e-01, -1.200e-01)); + r += mul(s3_7, M4(2.118e-01, -1.038e-01, 4.191e-01, 2.680e-01, -1.326e-01, -2.662e-01, -2.487e-01, -1.841e-01, 4.636e-02, 3.607e-02, -1.344e-01, 1.520e-01, -5.490e-02, -5.336e-02, -3.617e-02, 2.010e-03)); + r += mul(s3_8, M4(7.668e-03, -3.285e-03, 1.146e-01, -5.370e-03, -2.923e-01, 2.723e-02, -1.948e-01, 7.522e-02, 7.848e-02, -1.212e-01, 2.810e-01, 8.272e-02, -3.596e-02, -1.255e-01, 7.025e-02, 6.561e-02)); + r += mul(s4_0, M4(-5.750e-02, -2.343e-03, 1.155e-02, 1.263e-01, 2.045e-01, -1.364e-01, 4.942e-02, 2.860e-02, -2.458e-01, -1.640e-01, 2.016e-01, 6.267e-02, 9.234e-02, -6.066e-02, 3.070e-02, 6.094e-02)); + r += mul(s4_1, M4(-3.113e-02, 7.467e-02, 2.200e-02, -6.583e-02, 2.668e-01, -7.219e-02, 1.316e-01, -9.913e-02, -4.762e-02, 4.021e-02, -2.226e-01, -1.450e-01, 9.304e-02, -8.959e-02, 1.760e-01, 2.760e-02)); + r += mul(s4_2, M4(2.147e-01, -8.705e-03, 4.760e-03, -2.295e-01, 9.373e-02, -8.850e-02, -3.576e-02, 2.126e-01, -1.836e-01, -1.994e-02, 2.873e-02, -2.957e-03, 1.928e-01, 4.375e-02, 6.175e-02, -5.182e-02)); + r += mul(s4_3, M4(-5.723e-02, -1.145e-01, 2.409e-01, 1.399e-01, 3.128e-02, 4.703e-03, -1.700e-01, -5.630e-02, -7.253e-02, -1.281e-01, -4.285e-03, 4.734e-02, -8.377e-02, -3.062e-01, 2.587e-01, 1.099e-01)); + r += mul(s4_4, M4(-7.614e-02, -9.925e-03, -8.455e-03, -4.035e-02, 2.741e-01, 7.492e-02, 6.086e-01, 1.481e-01, -1.592e-02, -7.169e-02, 1.228e-01, 1.198e-01, -1.680e-01, -2.289e-01, 4.790e-01, 3.902e-02)); + r += mul(s4_5, M4(-1.123e-01, 8.752e-02, 1.686e-02, -1.039e-01, -1.253e-01, -1.933e-02, 1.212e-03, 1.023e-01, 7.552e-02, -9.984e-02, 3.426e-02, 6.780e-02, 2.702e-02, -6.068e-02, 1.967e-01, 8.629e-02)); + r += mul(s4_6, M4(5.797e-02, -1.353e-01, 1.033e-01, -1.719e-01, -1.335e-01, 6.762e-02, 7.013e-02, -7.472e-02, 3.723e-02, -3.790e-02, 9.515e-02, 8.516e-02, -7.411e-02, -2.409e-01, -2.353e-02, 2.940e-01)); + r += mul(s4_7, M4(2.548e-02, 2.544e-03, -1.350e-02, -2.464e-01, -2.018e-01, -1.882e-02, -2.318e-01, -1.809e-01, -1.304e-02, 1.333e-01, 9.827e-02, 9.163e-02, -4.668e-02, -4.071e-02, -8.042e-03, -2.185e-03)); + r += mul(s4_8, M4(3.587e-02, 1.501e-01, -5.163e-01, 1.042e-01, -6.538e-02, -1.005e-01, -4.472e-02, 4.179e-02, 1.050e-01, -4.198e-02, 2.039e-01, 2.244e-02, -1.004e-01, -1.028e-01, 2.824e-02, 8.763e-02)); + r += mul(s5_0, M4(7.821e-02, 7.323e-02, -3.199e-02, -1.595e-01, 3.097e-01, -3.831e-02, 1.785e-02, -2.153e-01, 1.812e-01, -4.676e-02, 1.000e-01, 2.932e-02, -9.241e-02, 9.792e-02, 7.440e-02, -3.885e-02)); + r += mul(s5_1, M4(-3.028e-01, -3.757e-02, -5.032e-02, 2.849e-01, -2.772e-01, 8.332e-02, -2.052e-01, 5.729e-02, 6.911e-02, -7.431e-02, 1.082e-01, 1.315e-01, 9.834e-02, 3.055e-02, -1.315e-01, 5.726e-03)); + r += mul(s5_2, M4(-1.636e-01, 1.645e-01, -4.554e-02, -2.774e-01, -2.691e-02, -5.220e-02, 9.571e-02, -3.884e-02, 4.966e-02, 2.502e-02, -9.109e-02, -2.851e-02, 6.685e-02, 3.636e-02, 5.882e-02, -1.581e-01)); + r += mul(s5_3, M4(-1.163e-01, 2.638e-02, -1.828e-01, -2.552e-01, 3.410e-03, -6.034e-03, 4.494e-02, 1.072e-01, 2.371e-01, -2.228e-01, -1.056e-02, -1.276e-02, 3.036e-02, 2.416e-01, -3.011e-01, -2.545e-01)); + r += mul(s5_4, M4(1.485e-01, 2.530e-01, -2.858e-01, 4.832e-01, -5.213e-02, -2.858e-01, -1.698e-01, -1.453e-01, -1.771e-01, 1.007e-01, -1.706e-01, -1.012e-01, 3.282e-02, 5.874e-02, -5.467e-01, 3.825e-02)); + r += mul(s5_5, M4(-3.837e-01, 3.641e-03, 5.814e-01, 4.933e-01, 3.131e-02, 8.307e-02, -3.989e-02, 5.503e-02, 6.367e-02, -4.050e-02, 7.006e-02, 2.848e-02, -4.190e-02, 1.647e-01, -9.264e-02, -3.662e-02)); + r += mul(s5_6, M4(-9.389e-02, -2.259e-01, 1.881e-01, -7.548e-02, 3.967e-02, 8.459e-02, 1.937e-01, 2.617e-02, -1.179e-01, -1.718e-01, 1.474e-01, 1.257e-01, 3.605e-02, -2.829e-02, 2.272e-02, -3.789e-01)); + r += mul(s5_7, M4(-2.656e-02, -1.844e-01, 3.402e-01, 4.901e-01, -5.836e-02, 3.312e-02, -2.004e-01, -4.783e-02, -2.746e-01, 1.515e-01, 3.878e-02, -7.158e-02, -1.820e-02, 3.105e-01, -1.832e-02, -1.099e-03)); + r += mul(s5_8, M4(4.523e-01, 1.502e-01, -2.123e-01, 2.320e-01, 2.085e-01, 5.715e-02, 3.191e-02, 7.901e-02, -8.453e-02, 5.544e-02, 4.279e-03, -1.328e-01, -9.691e-02, -2.488e-02, -4.719e-02, -1.008e-01)); + r += mul(s6_0, M4(4.345e-01, -8.277e-02, -7.012e-02, 8.223e-02, -1.071e-01, 1.610e-01, 1.502e-01, 4.634e-02, -1.456e-01, 2.283e-02, 1.598e-01, 9.160e-02, 1.612e-02, -2.086e-01, -7.139e-02, -2.495e-01)); + r += mul(s6_1, M4(3.248e-01, -1.401e-01, -2.566e-02, 1.442e-01, 1.050e-01, -5.083e-02, 1.393e-01, 3.161e-02, -1.916e-01, 2.434e-02, 2.304e-01, -1.068e-02, -1.549e-01, 2.850e-01, -3.977e-02, 1.540e-01)); + r += mul(s6_2, M4(1.457e-02, 2.612e-02, -2.899e-02, -2.297e-01, 4.891e-02, -6.237e-02, -3.175e-02, 2.566e-02, 1.602e-01, 1.467e-02, -8.463e-02, -1.173e-01, 3.783e-02, -3.369e-03, -5.365e-02, -1.653e-03)); + r += mul(s6_3, M4(-1.816e-01, -1.660e-02, 1.077e-01, -3.667e-01, 2.299e-01, 2.353e-01, -3.491e-01, -3.060e-02, 1.803e-01, -9.714e-02, 7.105e-02, 9.895e-02, 1.764e-01, 3.558e-02, 9.593e-02, 8.519e-02)); + r += mul(s6_4, M4(1.539e-01, 1.200e-01, -1.353e-01, 1.529e-01, -9.333e-02, -2.507e-01, 3.316e-01, -1.001e-01, 1.263e-01, 3.118e-02, -1.714e-01, 4.910e-01, 1.587e-01, -5.905e-02, -1.439e-01, -1.274e-01)); + r += mul(s6_5, M4(-1.838e-01, -2.972e-02, -9.090e-02, 1.057e-01, 1.846e-01, -7.972e-02, -9.290e-02, 1.015e-01, 2.065e-01, 4.804e-02, -1.697e-01, -3.964e-01, 5.007e-02, 5.312e-02, -3.128e-02, 9.884e-02)); + r += mul(s6_6, M4(-3.086e-02, -6.920e-02, -9.317e-02, 4.002e-02, -2.568e-01, 2.163e-01, -7.020e-02, -5.020e-02, 1.172e-01, -1.631e-01, -2.243e-01, -1.067e-01, 3.532e-02, -3.497e-01, 1.851e-01, -1.516e-01)); + r += mul(s6_7, M4(2.297e-01, 2.157e-01, 7.460e-02, -8.860e-02, 8.448e-02, -3.654e-02, -2.066e-01, 1.232e-01, -2.739e-01, 2.449e-01, -2.853e-01, -1.242e-01, -1.292e-01, 8.422e-02, -2.224e-01, -1.715e-02)); + r += mul(s6_8, M4(6.990e-02, 7.739e-02, 2.214e-01, 6.205e-03, 2.966e-02, -2.918e-02, -3.100e-01, -3.494e-02, -2.535e-01, -6.415e-02, -3.804e-02, 7.443e-02, 1.881e-01, -4.946e-02, -1.682e-02, 4.035e-02)); + r += mul(s7_0, M4(-3.276e-02, 5.851e-02, -7.947e-02, 1.102e-01, 1.314e-01, -2.101e-02, 4.667e-03, 1.552e-01, 1.391e-01, 9.108e-02, -5.034e-02, -1.252e-01, 1.662e-01, -2.567e-01, 2.469e-02, -2.212e-01)); + r += mul(s7_1, M4(-6.053e-02, -5.261e-02, -6.294e-02, -2.328e-01, 3.425e-01, 1.057e-01, 7.203e-02, -3.723e-01, 2.148e-02, 3.648e-02, -1.026e-01, 4.757e-02, 5.726e-02, 5.349e-02, 1.339e-01, -1.629e-01)); + r += mul(s7_2, M4(-3.005e-03, 8.149e-02, 1.175e-01, -6.981e-02, 7.763e-02, -7.641e-02, 2.218e-01, -1.141e-01, 7.203e-02, -5.508e-02, -8.120e-02, 8.905e-02, 1.130e-01, -1.605e-01, 1.333e-01, -4.009e-02)); + r += mul(s7_3, M4(8.709e-02, -1.158e-02, 6.767e-03, 4.893e-02, 3.468e-01, -1.774e-01, 2.457e-01, -2.309e-01, -2.759e-01, -1.656e-01, 5.379e-03, 5.537e-02, -2.075e-01, -3.874e-01, 9.547e-02, 1.176e-01)); + r += mul(s7_4, M4(1.664e-01, -6.784e-03, 1.283e-01, -5.551e-02, 5.972e-01, -1.779e-01, 7.139e-01, -3.232e-02, -1.695e-01, 1.692e-01, -1.356e-01, 5.937e-02, -1.303e-01, -5.354e-02, 1.923e-01, -6.313e-03)); + r += mul(s7_5, M4(1.809e-01, -5.603e-02, -1.256e-01, 1.202e-01, 2.529e-01, 4.616e-02, -5.929e-02, 5.680e-02, -2.929e-01, 7.123e-02, 1.358e-01, -3.910e-02, -2.787e-01, 2.232e-02, 5.208e-02, -1.017e-01)); + r += mul(s7_6, M4(-2.591e-01, -6.096e-02, 8.695e-02, 1.089e-01, 1.466e-01, -6.621e-01, 2.940e-01, 1.774e-01, 2.114e-01, 4.313e-02, 1.019e-01, -3.813e-02, 1.112e-02, -1.973e-01, 1.290e-01, -1.048e-02)); + r += mul(s7_7, M4(3.255e-02, -2.408e-02, -1.358e-01, -8.922e-02, 2.999e-01, -8.591e-02, -1.777e-01, 2.427e-01, 1.476e-01, -1.198e-01, 1.215e-01, -7.049e-02, -1.513e-01, 2.305e-02, 1.597e-01, 3.870e-02)); + r += mul(s7_8, M4(-1.616e-01, 6.090e-02, 7.322e-02, 3.689e-02, 1.026e-02, -5.670e-02, 5.745e-02, 1.727e-01, 9.462e-02, 6.318e-02, 1.639e-01, -1.412e-02, -2.783e-01, -1.519e-01, -1.171e-01, 1.104e-03)); + r += V4(-8.533e-04, -5.599e-03, -1.843e-02, 5.456e-02); + return r; +} + +V4 f3(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-2.560e-02, -7.087e-03, -1.410e-01, 9.884e-02, -3.941e-02, 4.886e-03, 9.250e-02, -1.153e-01, 1.099e-01, 1.787e-02, 7.890e-02, 7.949e-02, 4.733e-02, 4.525e-02, -1.421e-01, 1.549e-01)); + r += mul(s0_1, M4(-1.759e-02, 3.651e-02, -2.068e-01, -6.240e-02, -1.894e-01, -6.618e-02, -5.977e-02, 1.928e-01, 2.456e-02, -4.077e-02, 1.906e-02, 7.152e-02, 2.549e-01, 1.165e-01, 2.430e-01, 1.737e-01)); + r += mul(s0_2, M4(1.805e-03, -2.171e-03, -1.793e-01, -2.124e-01, 1.723e-01, 2.540e-02, -5.076e-03, 8.146e-02, 5.550e-03, 1.639e-02, -1.948e-01, 3.635e-03, -4.027e-02, -3.399e-02, 2.736e-01, 6.094e-02)); + r += mul(s0_3, M4(-2.643e-02, -3.043e-02, 1.180e-01, -8.517e-02, 2.385e-02, 4.729e-02, 3.137e-02, 9.062e-02, -1.664e-01, -3.938e-02, -2.115e-02, -4.653e-03, 2.821e-01, 9.189e-02, -2.044e-02, -2.310e-02)); + r += mul(s0_4, M4(5.197e-01, 1.222e-01, 6.437e-02, 1.062e-01, -3.377e-01, 4.647e-02, -9.965e-02, -7.055e-02, 1.566e-02, 5.988e-02, 2.100e-02, -5.248e-02, -3.215e-01, -1.829e-01, -1.951e-01, -8.805e-02)); + r += mul(s0_5, M4(-1.388e-01, 6.670e-02, 2.007e-01, -8.099e-02, 8.637e-02, -5.086e-02, 3.154e-02, -3.167e-03, 6.398e-02, -5.311e-03, 1.620e-01, -7.674e-02, -3.382e-01, -1.289e-01, 5.176e-01, -1.229e-01)); + r += mul(s0_6, M4(5.681e-02, -2.286e-02, 3.962e-02, -4.412e-02, -1.683e-01, 3.669e-02, 1.467e-01, -2.707e-03, -1.067e-01, -3.951e-03, -4.406e-02, 5.629e-02, -3.607e-02, -1.522e-02, -1.369e-01, -5.543e-02)); + r += mul(s0_7, M4(2.579e-01, 1.184e-01, 8.497e-02, 1.449e-01, -5.598e-02, 3.054e-02, -8.097e-02, -1.113e-01, 2.554e-01, -5.213e-02, -3.915e-02, -6.455e-02, -3.335e-01, 1.170e-01, -9.548e-02, 2.320e-02)); + r += mul(s0_8, M4(-2.914e-01, -1.802e-01, 2.361e-02, -7.381e-02, 1.470e-01, 5.039e-02, -7.519e-02, -4.570e-03, -1.217e-01, 1.500e-02, 6.749e-02, 7.562e-02, -3.426e-01, -1.080e-01, 6.514e-02, 6.881e-02)); + r += mul(s1_0, M4(1.618e-01, -3.931e-02, -2.383e-02, 1.431e-01, 5.090e-02, -1.330e-02, -1.028e-01, 6.260e-02, -2.058e-01, 7.500e-03, 1.932e-01, -7.916e-02, -1.371e-01, -8.696e-02, -4.685e-02, -2.273e-02)); + r += mul(s1_1, M4(-3.040e-01, -5.094e-02, 9.008e-02, -1.285e-01, 7.680e-01, -9.636e-02, -2.345e-02, -2.210e-01, 4.076e-02, 1.152e-01, 3.239e-01, -7.640e-01, 1.565e-02, -5.839e-02, 2.723e-01, 2.319e-01)); + r += mul(s1_2, M4(4.965e-03, 1.240e-01, 2.817e-01, 1.224e-01, 7.815e-02, 4.454e-02, -7.984e-03, -2.240e-01, -3.825e-01, 7.662e-02, -1.033e-01, -2.338e-01, 2.427e-02, 1.267e-01, 1.043e-01, 3.834e-01)); + r += mul(s1_3, M4(-8.741e-02, -2.785e-02, 1.292e-01, -9.184e-02, 7.198e-02, -5.808e-02, -1.383e-01, 4.611e-02, 8.833e-02, -2.850e-02, -1.079e-01, -6.543e-02, 2.152e-02, -8.040e-02, 4.714e-02, -1.107e-01)); + r += mul(s1_4, M4(-1.832e-01, 4.999e-02, 2.310e-01, 2.137e-01, 2.118e-01, -4.953e-02, -7.942e-04, -2.041e-02, 9.558e-02, -1.278e-02, -2.033e-01, 1.049e-01, -1.479e-01, -2.008e-01, -5.131e-02, -2.963e-01)); + r += mul(s1_5, M4(-6.279e-02, 2.429e-01, 4.757e-03, -1.206e-01, -1.910e-01, -1.530e-01, 6.063e-01, -2.034e-01, 1.171e-01, 6.146e-02, -3.540e-02, 2.388e-01, 4.859e-01, 1.376e-01, -6.543e-01, 1.784e-01)); + r += mul(s1_6, M4(-1.344e-01, 1.360e-02, 9.947e-02, 1.474e-03, 1.993e-02, 3.195e-03, 4.908e-02, -3.237e-02, 1.468e-01, 8.365e-02, 1.188e-01, -1.473e-01, -4.335e-02, 2.327e-02, -5.855e-02, -1.053e-01)); + r += mul(s1_7, M4(-4.558e-03, 1.134e-02, -5.775e-02, 8.397e-02, 1.323e-01, 3.408e-02, 1.067e-01, 1.505e-02, -1.862e-01, -2.054e-01, 1.248e-01, 1.360e-01, -1.162e-01, 5.213e-02, 5.240e-03, 8.693e-02)); + r += mul(s1_8, M4(1.518e-01, 2.164e-01, 8.775e-02, -5.471e-02, -8.322e-03, 8.992e-02, -5.009e-03, -9.936e-02, -8.858e-02, -1.484e-01, 1.137e-01, -4.466e-01, 3.340e-01, 6.147e-02, -1.144e-01, -8.945e-02)); + r += mul(s2_0, M4(-4.849e-02, -1.255e-02, -1.621e-01, -7.859e-02, -2.514e-01, -1.148e-02, -9.760e-02, -1.137e-01, 2.550e-01, 1.699e-02, -8.587e-02, 7.128e-02, 7.682e-02, -7.427e-02, -8.652e-02, 3.613e-01)); + r += mul(s2_1, M4(2.779e-02, 7.570e-03, -1.344e-01, 1.296e-02, -1.083e-02, 3.117e-02, -1.328e-01, -3.693e-02, 2.474e-01, 1.763e-01, 1.408e-02, 1.362e-01, -2.391e-02, -2.802e-01, -4.279e-02, 3.188e-01)); + r += mul(s2_2, M4(-1.033e-01, -3.043e-02, -7.807e-02, -5.715e-02, 1.855e-01, -1.128e-01, 1.395e-02, -9.351e-02, -2.720e-01, 2.711e-01, -4.261e-02, 6.892e-02, 1.308e-01, -1.577e-01, 1.907e-01, 4.823e-01)); + r += mul(s2_3, M4(-1.561e-01, -2.317e-02, 2.741e-02, -1.019e-01, -2.797e-02, 7.486e-02, -6.564e-02, 2.268e-02, 2.078e-01, -2.920e-01, -1.632e-01, -5.214e-02, -2.783e-01, -3.381e-01, 2.476e-01, -4.718e-01)); + r += mul(s2_4, M4(2.369e-01, 3.477e-02, 2.674e-01, 2.764e-01, 1.127e-02, 2.274e-02, 5.289e-02, 1.770e-01, -1.297e-03, 1.805e-02, 1.734e-01, 3.586e-03, 1.278e-01, -6.466e-01, -5.282e-03, -3.198e-01)); + r += mul(s2_5, M4(3.002e-02, 1.447e-01, 2.242e-01, 3.591e-02, 1.510e-02, 5.069e-02, 1.510e-01, 1.019e-01, 9.118e-02, -4.876e-02, -1.372e-01, 2.119e-01, 5.599e-01, -2.415e-01, -2.045e-01, -5.714e-01)); + r += mul(s2_6, M4(-6.998e-02, -3.651e-02, 2.052e-03, -1.139e-01, 5.134e-02, -6.756e-02, -6.024e-02, -1.392e-01, 1.954e-01, 9.353e-02, 1.594e-02, -2.237e-01, -1.781e-01, -1.366e-01, -2.123e-01, 2.311e-02)); + r += mul(s2_7, M4(1.693e-01, -9.344e-02, 1.462e-01, 1.420e-01, -8.540e-02, 4.959e-02, -4.992e-02, 1.013e-01, -5.185e-01, 9.739e-02, -5.330e-02, -1.208e-01, -1.194e-01, -2.685e-01, -2.982e-01, -1.289e-01)); + r += mul(s2_8, M4(1.141e-01, -5.735e-02, 8.146e-02, -2.221e-02, 9.828e-02, -5.525e-02, 6.784e-02, -9.348e-02, -1.546e-01, 3.030e-01, -2.793e-02, 1.449e-02, -3.587e-01, -1.617e-01, 1.805e-01, 2.176e-01)); + r += mul(s3_0, M4(-8.667e-03, -5.350e-02, -3.774e-02, 7.121e-02, 1.094e-01, 2.259e-02, 5.645e-01, 4.007e-02, 6.136e-03, 2.721e-02, 1.573e-02, -1.529e-02, 3.419e-02, -1.128e-01, 1.004e-01, 6.939e-02)); + r += mul(s3_1, M4(3.826e-02, -2.135e-02, -3.854e-01, -4.123e-01, 1.643e-01, 8.967e-02, 7.549e-02, -3.133e-01, -8.262e-02, -2.612e-02, 1.106e-01, 1.795e-01, -7.740e-02, -3.704e-02, 2.029e-01, 1.461e-02)); + r += mul(s3_2, M4(-6.023e-02, 6.654e-02, -1.361e-01, -1.431e-01, 7.496e-02, 1.351e-01, 1.292e-01, 1.911e-01, -6.692e-02, -3.242e-02, 3.928e-02, -8.824e-03, -1.226e-03, -4.044e-02, 1.344e-01, 1.214e-01)); + r += mul(s3_3, M4(-3.305e-02, -1.101e-01, -1.894e-01, -3.469e-01, -1.210e-01, -3.212e-02, 2.904e-01, -2.047e-01, -1.211e-03, -7.072e-02, -1.544e-02, -5.603e-02, 1.195e-01, -2.336e-01, -5.574e-02, -3.214e-02)); + r += mul(s3_4, M4(-2.567e-01, 1.577e-01, -2.711e-01, -1.814e-01, 2.629e-01, -1.322e-01, 4.110e-01, -2.530e-01, 1.157e-01, -6.624e-02, -6.523e-02, 9.403e-02, -3.037e-02, -1.903e-01, -4.489e-02, -6.323e-02)); + r += mul(s3_5, M4(3.183e-01, 1.222e-01, -1.796e-01, -6.899e-01, -3.581e-02, 7.077e-02, 1.821e-01, -2.122e-01, -3.829e-03, 3.924e-02, 4.984e-02, 3.319e-03, -1.210e-02, -1.916e-01, -6.451e-02, -5.390e-02)); + r += mul(s3_6, M4(9.451e-02, 1.416e-01, 2.363e-01, -2.431e-03, -4.550e-01, 9.670e-02, 4.511e-01, -2.440e-01, -1.039e-02, -7.438e-03, -5.394e-02, -1.583e-01, 5.988e-02, -1.223e-01, -6.949e-02, -7.947e-02)); + r += mul(s3_7, M4(-4.528e-01, 1.578e-01, -2.586e-01, 9.291e-02, -4.691e-02, 1.333e-01, 7.600e-02, -6.177e-03, 1.024e-02, -2.282e-02, -7.689e-02, -6.901e-02, -6.665e-02, -4.332e-02, -1.728e-01, -6.849e-02)); + r += mul(s3_8, M4(1.362e-01, 2.879e-02, -1.518e-01, -8.947e-02, -9.332e-02, 1.320e-01, 1.138e-01, -1.209e-01, -4.019e-02, 1.469e-01, 1.528e-03, -1.214e-01, -5.435e-02, -1.586e-01, -2.739e-02, 6.551e-02)); + r += mul(s4_0, M4(-1.033e-01, -6.952e-02, -1.560e-02, 1.402e-02, -3.370e-02, -7.858e-02, 2.946e-01, -9.622e-02, -4.151e-02, -3.780e-02, -1.132e-01, 1.453e-01, 1.965e-02, -3.571e-02, 9.255e-02, -1.576e-02)); + r += mul(s4_1, M4(-6.419e-02, 1.816e-02, -1.188e-01, -1.148e-01, -4.849e-02, 2.576e-03, 5.385e-01, 6.037e-03, 4.484e-02, -1.937e-02, -4.330e-01, -7.164e-02, -8.341e-02, 3.394e-02, -6.566e-02, 2.859e-01)); + r += mul(s4_2, M4(1.414e-01, 9.715e-03, -2.075e-02, 3.829e-02, -8.767e-02, -9.468e-02, 3.312e-01, -6.282e-03, 3.118e-02, 1.290e-02, -7.580e-03, 9.585e-02, 1.152e-01, -7.785e-02, 8.913e-02, 1.269e-01)); + r += mul(s4_3, M4(-1.300e-01, -8.615e-02, 2.134e-02, -2.515e-02, 4.651e-02, 2.008e-01, -6.371e-02, -1.236e-02, 2.614e-01, -1.788e-01, -1.925e-02, -1.645e-02, -1.069e-01, -6.968e-02, 6.480e-02, 3.090e-02)); + r += mul(s4_4, M4(1.352e-01, -1.886e-02, -1.145e-01, 4.115e-02, -3.652e-01, -8.227e-02, 5.339e-02, -2.728e-01, 1.191e-01, 2.115e-02, 2.001e-01, -1.219e-02, -5.189e-01, -9.690e-03, 9.258e-02, -7.153e-02)); + r += mul(s4_5, M4(-3.574e-02, 6.680e-02, -2.589e-02, -3.711e-02, -1.948e-01, 8.654e-02, 2.185e-01, -1.511e-01, -9.703e-02, 1.522e-01, -2.773e-01, 1.940e-01, -7.396e-02, 1.386e-01, 2.249e-01, -3.014e-02)); + r += mul(s4_6, M4(-1.586e-01, -3.006e-02, 4.357e-02, 3.494e-02, 1.060e-01, 6.097e-02, -4.613e-02, 1.076e-01, 1.332e-01, 1.145e-01, -5.582e-02, 1.621e-01, -1.310e-02, -2.543e-02, -1.657e-02, -2.863e-02)); + r += mul(s4_7, M4(1.932e-01, 6.256e-02, 1.217e-01, -8.493e-02, -4.115e-01, 1.171e-03, 1.135e-01, -7.224e-02, -1.774e-02, 9.645e-02, -1.115e-01, 6.669e-02, -5.159e-02, 6.090e-02, -4.863e-02, -1.897e-02)); + r += mul(s4_8, M4(-7.878e-02, -9.714e-02, 1.048e-01, 9.664e-03, 8.354e-02, 2.088e-02, 2.220e-02, 2.531e-02, -6.113e-02, 3.972e-02, -9.207e-02, 4.613e-02, 1.827e-01, 7.274e-02, -2.476e-01, -5.481e-02)); + r += mul(s5_0, M4(1.970e-01, 1.672e-01, 2.433e-01, -8.995e-02, 7.859e-02, -3.751e-02, -3.454e-02, 2.298e-01, -1.324e-01, -1.465e-02, -8.560e-02, -2.178e-01, -3.343e-02, 6.746e-02, 8.993e-02, -4.901e-02)); + r += mul(s5_1, M4(-6.850e-03, -1.971e-01, -5.692e-02, 7.432e-02, 3.548e-01, -1.108e-01, 3.175e-01, 1.081e+00, 5.009e-03, -4.461e-02, 2.832e-02, -2.137e-01, 2.470e-01, 5.725e-02, -1.697e-02, -1.859e-02)); + r += mul(s5_2, M4(5.239e-02, 6.549e-02, -2.298e-01, -1.966e-01, -9.228e-02, -1.393e-01, 1.912e-01, 4.543e-01, -1.425e-02, 9.029e-02, -9.371e-02, -2.144e-01, 7.205e-02, 2.581e-02, -1.731e-01, -2.638e-01)); + r += mul(s5_3, M4(9.616e-02, 1.156e-01, -4.901e-02, 3.704e-02, -1.969e-02, 3.668e-02, -7.894e-02, 4.214e-03, -1.831e-01, 2.568e-02, 1.322e-02, 4.639e-02, -7.497e-02, 6.491e-02, -5.406e-03, -1.238e-01)); + r += mul(s5_4, M4(-1.216e-01, 2.233e-01, -8.263e-02, -1.517e-01, 2.918e-01, -5.018e-02, -1.391e-01, 2.899e-02, -1.208e-01, -1.490e-01, -2.105e-01, -5.076e-02, -8.915e-03, 4.420e-03, -3.801e-01, -5.936e-03)); + r += mul(s5_5, M4(8.879e-02, 2.007e-01, -2.374e-02, 4.744e-01, -2.168e-01, 8.071e-02, 6.015e-03, 8.826e-02, 1.548e-01, -1.410e-01, 1.649e-01, -1.502e-01, 4.645e-03, 8.603e-02, 4.699e-02, 1.293e-02)); + r += mul(s5_6, M4(2.715e-01, 2.036e-01, -1.004e-01, 2.508e-01, 5.107e-02, 1.315e-01, 6.567e-02, 6.999e-02, 1.513e-02, -1.198e-01, -3.505e-02, 1.060e-01, 8.095e-02, -3.236e-03, 2.448e-01, 7.195e-03)); + r += mul(s5_7, M4(-7.150e-01, 2.499e-01, -3.129e-01, 2.092e-01, 2.434e-02, -6.082e-03, -5.837e-02, 2.251e-02, -1.022e-01, -2.280e-02, -2.848e-01, -1.327e-02, 4.425e-02, 6.298e-02, 1.132e-02, -9.445e-02)); + r += mul(s5_8, M4(-5.568e-02, -6.042e-02, 1.757e-01, -5.052e-02, -5.824e-02, 6.717e-03, -8.544e-02, -1.293e-02, -8.259e-02, 5.506e-02, 9.705e-02, 9.304e-02, -1.503e-01, -8.160e-02, 1.082e-01, -1.377e-01)); + r += mul(s6_0, M4(3.476e-01, 9.336e-02, 2.231e-02, 1.022e-02, -3.424e-02, -7.095e-02, 3.900e-02, 9.158e-02, -1.061e-01, -5.546e-02, -9.304e-02, -5.883e-02, 1.331e-01, 7.858e-02, 1.167e-01, 7.884e-02)); + r += mul(s6_1, M4(-1.835e-02, -1.974e-01, -1.369e-01, 2.903e-01, -1.457e-02, -2.445e-02, 1.877e-02, 1.939e-01, -9.732e-02, 3.776e-02, -1.752e-01, -2.629e-01, 2.034e-01, -6.453e-02, 2.623e-01, -2.109e-01)); + r += mul(s6_2, M4(-3.623e-02, 5.361e-02, -2.681e-01, 1.447e-01, -3.448e-02, 4.750e-02, 9.537e-02, 1.124e-03, 1.402e-01, 1.087e-01, -1.424e-01, -1.509e-01, 3.056e-02, -5.132e-02, -5.697e-03, -1.327e-02)); + r += mul(s6_3, M4(-4.655e-02, -4.782e-02, 2.343e-01, 8.769e-02, 1.124e-01, -2.491e-03, -2.597e-02, -6.833e-02, -1.243e-01, 4.811e-02, -3.578e-01, 2.454e-02, -1.434e-01, 5.503e-03, -6.405e-02, 2.061e-02)); + r += mul(s6_4, M4(-2.463e-01, -8.253e-02, 3.349e-01, -2.741e-01, -1.254e-02, 3.522e-02, -1.978e-01, 1.421e-03, -1.022e-02, 1.297e-02, -9.613e-02, -2.839e-01, 1.682e-01, 3.789e-02, -1.225e-01, -1.144e-01)); + r += mul(s6_5, M4(-1.381e-01, 1.578e-01, 1.174e-01, 9.555e-02, 1.071e-01, -1.781e-02, 4.394e-02, 3.225e-02, 1.769e-01, -1.736e-01, -3.724e-01, -4.223e-01, -1.162e-01, 3.163e-02, -5.523e-02, -9.306e-02)); + r += mul(s6_6, M4(5.363e-02, 2.286e-02, -1.182e-01, 2.210e-01, -7.831e-02, 3.203e-03, 7.760e-02, 3.020e-03, 2.411e-01, -5.532e-02, -2.875e-02, 1.754e-01, 1.305e-01, -2.458e-03, 1.417e-01, 6.157e-03)); + r += mul(s6_7, M4(-1.955e-01, -1.845e-01, 8.119e-02, -1.347e-01, -3.374e-02, 1.839e-02, 3.874e-03, -1.838e-01, -4.347e-01, -2.846e-01, -1.806e-01, 5.604e-02, 1.243e-01, -2.117e-02, -5.486e-02, 6.884e-03)); + r += mul(s6_8, M4(7.283e-02, -1.282e-01, -2.823e-01, 5.028e-02, -1.353e-01, 1.419e-01, -5.407e-02, -6.650e-03, 3.999e-01, -1.855e-01, -2.906e-01, -3.688e-02, -1.405e-01, 1.427e-02, -2.796e-02, -4.579e-02)); + r += mul(s7_0, M4(9.975e-02, 7.898e-02, 1.381e-01, 8.796e-02, 2.603e-01, -8.414e-02, -1.423e-01, -9.692e-03, -1.139e-01, 6.085e-02, -3.823e-03, -7.671e-02, 1.877e-02, -8.808e-03, 2.768e-02, 2.780e-01)); + r += mul(s7_1, M4(8.771e-02, 1.460e-02, 1.628e-02, 5.329e-03, 1.449e-01, -3.699e-01, 3.923e-01, 2.301e-02, -1.277e-01, -2.741e-02, -1.047e-01, 5.968e-02, -5.592e-02, 7.473e-02, 2.236e-01, 6.206e-01)); + r += mul(s7_2, M4(-1.469e-01, -7.466e-02, -5.950e-02, -1.130e-01, 2.839e-02, -2.606e-02, 1.334e-01, 1.732e-01, 3.303e-02, -9.745e-02, -1.245e-01, 6.786e-02, 1.955e-01, -5.324e-02, 2.093e-01, 1.236e-01)); + r += mul(s7_3, M4(-1.293e-01, -2.116e-02, -3.673e-02, -9.411e-02, -5.480e-01, 1.889e-01, 7.690e-02, 1.970e-01, -4.543e-02, 5.556e-02, -6.816e-02, 1.532e-02, -2.292e-03, -1.880e-02, 7.113e-02, 2.672e-02)); + r += mul(s7_4, M4(6.920e-02, -4.618e-02, -6.882e-02, 3.691e-02, -8.673e-02, -1.959e-01, -3.585e-01, -9.090e-02, 2.925e-01, 3.724e-02, 2.743e-01, 3.540e-01, -2.959e-01, -3.552e-02, -4.064e-02, -1.069e-01)); + r += mul(s7_5, M4(-3.202e-02, 2.347e-02, 7.362e-02, 2.157e-02, -7.213e-02, -1.073e-01, 2.008e-01, -2.052e-01, -1.134e-01, -2.505e-02, 1.241e-02, 1.802e-01, -1.081e-01, 5.897e-02, 1.798e-02, 7.188e-02)); + r += mul(s7_6, M4(-5.356e-04, 6.207e-02, 8.194e-02, 8.600e-03, -2.790e-01, 2.941e-01, -4.157e-02, -2.512e-01, 8.039e-02, -1.770e-02, -5.099e-02, 3.033e-02, -8.296e-02, -2.268e-02, -1.175e-01, 1.419e-02)); + r += mul(s7_7, M4(-4.728e-03, -4.249e-02, -9.443e-02, 2.155e-03, -1.180e-01, -1.111e-01, 5.674e-02, 1.564e-01, 3.111e-01, 4.206e-02, 1.174e-01, 2.935e-02, 5.181e-02, -9.064e-02, 8.466e-02, -9.002e-03)); + r += mul(s7_8, M4(1.323e-01, 8.600e-02, -3.627e-02, 3.855e-02, -5.842e-02, 3.473e-01, -2.465e-02, -1.118e-01, -6.674e-02, 4.149e-03, 6.115e-04, 4.737e-02, 1.022e-01, 4.757e-02, 2.210e-02, -5.416e-02)); + r += V4(-3.625e-03, -6.509e-02, -2.543e-02, 2.655e-02); + return r; +} + +void Pass2(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = Rmp8x8(tid.x) + blockStart; + uint2 size = GetInputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = (gxy + 0.5) * pt; + + V4 s0_0 = l0(-1.0, -1.0); + V4 s0_1 = l0(0.0, -1.0); + V4 s0_2 = l0(1.0, -1.0); + V4 s0_3 = l0(-1.0, 0.0); + V4 s0_4 = l0(0.0, 0.0); + V4 s0_5 = l0(1.0, 0.0); + V4 s0_6 = l0(-1.0, 1.0); + V4 s0_7 = l0(0.0, 1.0); + V4 s0_8 = l0(1.0, 1.0); + V4 s1_0 = -max(-s0_0, 0.0); + V4 s1_1 = -max(-s0_1, 0.0); + V4 s1_2 = -max(-s0_2, 0.0); + V4 s1_3 = -max(-s0_3, 0.0); + V4 s1_4 = -max(-s0_4, 0.0); + V4 s1_5 = -max(-s0_5, 0.0); + V4 s1_6 = -max(-s0_6, 0.0); + V4 s1_7 = -max(-s0_7, 0.0); + V4 s1_8 = -max(-s0_8, 0.0); + s0_0 = max(s0_0, 0.0); + s0_1 = max(s0_1, 0.0); + s0_2 = max(s0_2, 0.0); + s0_3 = max(s0_3, 0.0); + s0_4 = max(s0_4, 0.0); + s0_5 = max(s0_5, 0.0); + s0_6 = max(s0_6, 0.0); + s0_7 = max(s0_7, 0.0); + s0_8 = max(s0_8, 0.0); + + V4 s2_0 = l1(-1.0, -1.0); + V4 s2_1 = l1(0.0, -1.0); + V4 s2_2 = l1(1.0, -1.0); + V4 s2_3 = l1(-1.0, 0.0); + V4 s2_4 = l1(0.0, 0.0); + V4 s2_5 = l1(1.0, 0.0); + V4 s2_6 = l1(-1.0, 1.0); + V4 s2_7 = l1(0.0, 1.0); + V4 s2_8 = l1(1.0, 1.0); + V4 s3_0 = -max(-s2_0, 0.0); + V4 s3_1 = -max(-s2_1, 0.0); + V4 s3_2 = -max(-s2_2, 0.0); + V4 s3_3 = -max(-s2_3, 0.0); + V4 s3_4 = -max(-s2_4, 0.0); + V4 s3_5 = -max(-s2_5, 0.0); + V4 s3_6 = -max(-s2_6, 0.0); + V4 s3_7 = -max(-s2_7, 0.0); + V4 s3_8 = -max(-s2_8, 0.0); + s2_0 = max(s2_0, 0.0); + s2_1 = max(s2_1, 0.0); + s2_2 = max(s2_2, 0.0); + s2_3 = max(s2_3, 0.0); + s2_4 = max(s2_4, 0.0); + s2_5 = max(s2_5, 0.0); + s2_6 = max(s2_6, 0.0); + s2_7 = max(s2_7, 0.0); + s2_8 = max(s2_8, 0.0); + + V4 s4_0 = l2(-1.0, -1.0); + V4 s4_1 = l2(0.0, -1.0); + V4 s4_2 = l2(1.0, -1.0); + V4 s4_3 = l2(-1.0, 0.0); + V4 s4_4 = l2(0.0, 0.0); + V4 s4_5 = l2(1.0, 0.0); + V4 s4_6 = l2(-1.0, 1.0); + V4 s4_7 = l2(0.0, 1.0); + V4 s4_8 = l2(1.0, 1.0); + V4 s5_0 = -max(-s4_0, 0.0); + V4 s5_1 = -max(-s4_1, 0.0); + V4 s5_2 = -max(-s4_2, 0.0); + V4 s5_3 = -max(-s4_3, 0.0); + V4 s5_4 = -max(-s4_4, 0.0); + V4 s5_5 = -max(-s4_5, 0.0); + V4 s5_6 = -max(-s4_6, 0.0); + V4 s5_7 = -max(-s4_7, 0.0); + V4 s5_8 = -max(-s4_8, 0.0); + s4_0 = max(s4_0, 0.0); + s4_1 = max(s4_1, 0.0); + s4_2 = max(s4_2, 0.0); + s4_3 = max(s4_3, 0.0); + s4_4 = max(s4_4, 0.0); + s4_5 = max(s4_5, 0.0); + s4_6 = max(s4_6, 0.0); + s4_7 = max(s4_7, 0.0); + s4_8 = max(s4_8, 0.0); + + V4 s6_0 = l3(-1.0, -1.0); + V4 s6_1 = l3(0.0, -1.0); + V4 s6_2 = l3(1.0, -1.0); + V4 s6_3 = l3(-1.0, 0.0); + V4 s6_4 = l3(0.0, 0.0); + V4 s6_5 = l3(1.0, 0.0); + V4 s6_6 = l3(-1.0, 1.0); + V4 s6_7 = l3(0.0, 1.0); + V4 s6_8 = l3(1.0, 1.0); + V4 s7_0 = -max(-s6_0, 0.0); + V4 s7_1 = -max(-s6_1, 0.0); + V4 s7_2 = -max(-s6_2, 0.0); + V4 s7_3 = -max(-s6_3, 0.0); + V4 s7_4 = -max(-s6_4, 0.0); + V4 s7_5 = -max(-s6_5, 0.0); + V4 s7_6 = -max(-s6_6, 0.0); + V4 s7_7 = -max(-s6_7, 0.0); + V4 s7_8 = -max(-s6_8, 0.0); + s6_0 = max(s6_0, 0.0); + s6_1 = max(s6_1, 0.0); + s6_2 = max(s6_2, 0.0); + s6_3 = max(s6_3, 0.0); + s6_4 = max(s6_4, 0.0); + s6_5 = max(s6_5, 0.0); + s6_6 = max(s6_6, 0.0); + s6_7 = max(s6_7, 0.0); + s6_8 = max(s6_8, 0.0); + + t4[gxy] = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t5[gxy] = f1(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t6[gxy] = f2(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t7[gxy] = f3(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); +} + +//!PASS 3 +//!DESC conv2 +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 +//!IN t4, t5, t6, t7 +//!OUT t0, t1, t2, t3 + +#define l0(x, y) V4(O(t4, float2(x, y))) +#define l1(x, y) V4(O(t5, float2(x, y))) +#define l2(x, y) V4(O(t6, float2(x, y))) +#define l3(x, y) V4(O(t7, float2(x, y))) + +V4 f0(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(4.835e-02, -2.396e-02, 1.538e-01, -1.119e-02, -7.433e-03, 2.244e-02, -4.176e-01, 3.162e-02, 2.272e-02, 2.109e-02, 2.717e-02, 1.403e-01, 4.632e-01, 8.008e-02, -3.298e-01, -1.300e-01)); + r += mul(s0_1, M4(-7.625e-02, -1.928e-02, -3.921e-02, -5.083e-02, -1.915e-01, 1.015e-01, -4.724e-01, 5.635e-02, -1.024e-02, 9.931e-03, -8.880e-02, 4.998e-02, 6.319e-01, -1.827e-01, 1.566e-01, -3.693e-01)); + r += mul(s0_2, M4(-6.468e-02, -1.760e-01, -7.115e-02, -4.285e-02, -2.285e-01, 8.701e-02, -2.009e-01, -1.627e-01, -8.255e-02, -5.679e-02, 5.767e-03, 2.168e-01, 4.349e-02, 3.930e-02, 4.913e-02, -1.117e-01)); + r += mul(s0_3, M4(1.302e-01, 5.135e-02, 4.496e-02, -3.394e-02, -7.374e-02, -4.251e-02, -5.037e-02, -2.096e-02, 3.509e-02, -1.396e-01, 1.593e-01, 6.313e-02, 9.144e-03, 6.799e-02, -2.578e-01, 1.379e-02)); + r += mul(s0_4, M4(-4.673e-02, -3.859e-02, 7.260e-03, -1.913e-01, 9.779e-02, -1.876e-02, -1.807e-01, -1.189e-02, -4.810e-02, 1.021e-01, 6.610e-02, 5.553e-02, -3.128e-02, 3.649e-01, 2.145e-02, 1.857e-01)); + r += mul(s0_5, M4(-6.326e-02, -2.190e-02, -1.025e-01, 2.645e-01, 1.325e-01, -3.209e-02, 3.893e-03, 1.114e-01, -1.186e-01, -2.977e-02, -8.407e-02, -2.533e-01, 1.688e-01, -2.146e-02, 2.017e-01, -2.172e-01)); + r += mul(s0_6, M4(-2.134e-02, 2.436e-03, 7.637e-02, 1.031e-02, 1.962e-02, -2.824e-02, -1.031e-01, -1.505e-01, 4.045e-02, -3.927e-02, 4.998e-02, -1.292e-01, -7.246e-03, 1.795e-03, 7.585e-02, 4.875e-02)); + r += mul(s0_7, M4(-2.179e-02, -3.530e-02, -1.362e-01, -2.993e-02, 1.283e-01, 1.468e-02, 1.005e-01, 3.694e-01, 4.319e-02, 7.983e-02, 2.198e-02, -4.084e-02, -1.126e-02, 3.306e-02, 5.772e-02, -1.415e-01)); + r += mul(s0_8, M4(4.490e-02, -4.903e-02, 3.056e-02, 4.978e-02, -1.774e-02, -1.850e-02, 1.111e-01, -1.493e-02, 4.528e-02, 7.043e-02, 7.131e-02, 1.664e-01, 7.829e-02, -1.444e-02, 4.841e-02, -4.486e-02)); + r += mul(s1_0, M4(-3.755e-02, -4.232e-02, -5.924e-02, 6.035e-02, -1.205e-01, 1.010e-02, 2.912e-02, 1.513e-01, -8.444e-02, -4.351e-02, -5.507e-02, 9.106e-02, -2.273e-03, -5.590e-02, 8.234e-02, -8.793e-02)); + r += mul(s1_1, M4(1.390e-01, -5.847e-02, -1.205e-01, 3.187e-01, -2.568e-01, 3.647e-02, -4.785e-02, 1.482e-01, 8.543e-02, 1.616e-01, -1.851e-01, 5.716e-02, -4.927e-01, -1.209e-01, 3.762e-02, 1.529e-01)); + r += mul(s1_2, M4(-1.530e-01, -1.645e-01, -1.839e-02, 2.038e-01, 8.178e-02, 1.021e-02, 6.465e-02, 7.910e-02, 2.042e-02, -1.093e-01, 2.834e-03, -3.437e-02, -1.692e-01, -8.842e-02, 1.308e-01, 2.947e-01)); + r += mul(s1_3, M4(7.424e-02, -1.654e-01, -1.246e-01, 1.160e-01, 1.581e-01, -6.440e-03, -8.087e-03, 6.360e-02, 1.111e-01, 2.032e-02, 2.760e-02, 2.297e-01, -2.736e-02, 1.178e-02, 4.567e-02, 6.139e-02)); + r += mul(s1_4, M4(3.265e-01, -5.441e-01, 9.085e-02, -1.616e-01, -1.701e-02, -4.155e-02, 4.148e-02, -3.896e-01, 2.620e-01, 1.954e-01, 1.190e-01, -1.761e-01, -3.432e-01, 1.121e-01, -2.782e-01, 2.503e-01)); + r += mul(s1_5, M4(-3.005e-01, -3.291e-01, -2.238e-02, -3.021e-02, -1.015e-02, -7.567e-02, -1.607e-01, -5.375e-02, 1.436e-01, 1.396e-02, 9.834e-02, -1.777e-01, -1.109e-01, -9.568e-02, 4.459e-02, 2.166e-01)); + r += mul(s1_6, M4(-1.383e-02, -1.195e-01, -7.240e-02, -7.391e-02, 7.793e-02, -8.250e-04, 2.773e-02, -9.196e-02, 1.148e-01, 3.961e-02, 3.218e-02, -5.892e-02, -1.103e-02, 6.608e-02, -9.241e-03, 9.855e-02)); + r += mul(s1_7, M4(-2.428e-01, -2.303e-01, 2.808e-04, -2.284e-01, 1.944e-01, 7.671e-02, 1.247e-01, 2.123e-01, -6.229e-02, 3.342e-01, -4.740e-02, 1.074e-01, -9.819e-02, -3.941e-02, -3.164e-02, -4.836e-02)); + r += mul(s1_8, M4(1.763e-01, -1.885e-01, -5.378e-02, 2.569e-01, 5.091e-02, -2.026e-02, 1.619e-01, -4.407e-02, 5.194e-02, 5.987e-02, -6.887e-02, 2.649e-01, -8.527e-02, -2.827e-03, 2.306e-02, -5.023e-02)); + r += mul(s2_0, M4(-8.205e-03, 4.433e-03, -1.343e-01, 2.500e-02, 1.505e-01, 1.889e-02, -1.210e-01, -8.672e-02, 3.076e-02, 1.498e-02, -2.644e-01, 5.938e-02, -8.131e-02, -2.713e-02, 1.534e-01, -1.360e-01)); + r += mul(s2_1, M4(-2.952e-02, -1.140e-01, 3.189e-02, 2.388e-01, -1.578e-01, -7.641e-03, -5.162e-02, -2.394e-01, 2.268e-02, -4.927e-02, 8.503e-02, -1.354e-01, 1.159e-01, -3.340e-02, 4.248e-02, -1.120e-01)); + r += mul(s2_2, M4(-8.455e-02, -9.497e-02, 5.362e-03, 1.827e-01, 1.962e-02, 4.699e-02, 8.229e-03, 4.554e-02, -7.800e-02, -6.534e-03, -5.066e-02, 3.068e-02, -1.612e-01, -1.929e-02, -1.645e-01, 1.841e-01)); + r += mul(s2_3, M4(-1.360e-01, -1.711e-02, -6.952e-02, -1.146e-01, 6.530e-02, 3.795e-02, 1.130e-01, 9.324e-02, 1.226e-01, 6.978e-02, 9.599e-02, -7.250e-03, 2.414e-02, 2.477e-02, 9.773e-02, 1.837e-01)); + r += mul(s2_4, M4(2.329e-01, -6.908e-02, -3.555e-03, -2.507e-01, -7.980e-02, -1.374e-02, -2.531e-01, 2.446e-01, -1.155e-01, -1.329e-01, -1.561e-01, 1.295e-01, -8.048e-02, -9.703e-02, 1.904e-01, 2.686e-02)); + r += mul(s2_5, M4(-7.302e-02, -5.162e-02, -1.045e-01, -1.587e-01, 1.160e-01, -3.129e-02, -2.348e-02, -1.675e-01, 6.703e-02, 8.933e-02, -9.654e-02, -1.748e-02, -1.317e-01, -2.547e-02, 3.693e-03, -4.579e-01)); + r += mul(s2_6, M4(-2.708e-02, 2.805e-02, 1.276e-01, 6.081e-02, 1.260e-01, -1.918e-02, -1.428e-02, 4.839e-02, 1.033e-02, -1.845e-02, 4.060e-02, -1.122e-01, -2.161e-01, 7.566e-02, 8.280e-02, 5.468e-02)); + r += mul(s2_7, M4(-5.334e-02, -2.162e-01, 1.007e-01, 2.634e-01, -1.227e-01, -2.969e-02, -9.729e-03, 3.114e-02, 4.496e-03, 1.649e-02, 1.208e-01, 7.892e-02, -7.813e-02, -6.307e-02, -1.427e-01, -5.671e-02)); + r += mul(s2_8, M4(-1.008e-01, -3.837e-02, -3.730e-02, 6.125e-02, 3.003e-02, -2.922e-02, -1.998e-02, -1.995e-03, 1.952e-02, -1.100e-02, -1.260e-01, 1.306e-01, 1.291e-01, 3.207e-02, 5.305e-02, 1.342e-01)); + r += mul(s3_0, M4(3.873e-03, -1.372e-02, -1.029e-01, 1.221e-01, -4.917e-01, 4.365e-02, -1.042e-01, -2.129e-02, -2.043e-02, 4.700e-02, -2.792e-01, 7.757e-03, 7.957e-02, 1.361e-02, 1.071e-01, 7.693e-02)); + r += mul(s3_1, M4(9.662e-02, -2.932e-02, 1.941e-01, -3.194e-01, -1.324e-01, -1.779e-02, -1.697e-01, -2.333e-01, 6.349e-02, -1.091e-01, 1.962e-01, 9.707e-02, 4.680e-02, -2.846e-02, 2.182e-01, 6.872e-02)); + r += mul(s3_2, M4(4.693e-02, -3.250e-03, -4.054e-02, -2.195e-01, 5.278e-02, 1.146e-01, -3.060e-01, -1.790e-01, 4.953e-02, 2.110e-02, -5.913e-02, -2.237e-01, 4.825e-02, -1.640e-02, -1.017e-02, 2.968e-03)); + r += mul(s3_3, M4(-6.447e-02, 3.180e-02, 2.896e-02, 1.189e-01, 2.795e-01, 3.655e-03, -6.887e-02, 5.190e-02, -6.438e-02, 9.903e-04, 2.467e-01, -1.479e-01, 1.112e-01, -2.545e-02, 6.097e-02, -8.142e-02)); + r += mul(s3_4, M4(1.924e-01, 3.832e-02, -3.986e-01, 9.887e-02, 5.257e-01, -1.760e-01, -1.260e-01, 1.574e-01, 6.137e-01, -1.438e-01, -4.044e-01, -2.024e-01, 4.315e-02, -4.846e-02, 9.769e-02, 8.331e-02)); + r += mul(s3_5, M4(-2.651e-01, 4.248e-02, -2.012e-02, 5.405e-01, 8.924e-03, -5.811e-02, -1.290e-02, 4.415e-01, -2.601e-02, -2.126e-02, -1.961e-02, 3.511e-01, 4.215e-02, -2.716e-02, 1.296e-01, -2.416e-01)); + r += mul(s3_6, M4(-9.102e-02, 7.787e-02, 8.254e-02, 1.284e-01, 2.343e-02, 7.932e-02, 1.647e-01, 7.651e-02, 6.076e-02, 1.102e-01, -4.897e-02, 1.291e-02, -5.505e-02, 4.130e-02, 5.113e-04, -1.506e-02)); + r += mul(s3_7, M4(1.474e-01, -5.158e-02, 1.400e-01, -7.421e-02, 3.513e-02, 1.671e-03, 2.964e-01, 1.693e-01, -1.401e-01, 3.910e-01, 2.678e-03, -1.492e-01, 9.331e-02, 2.221e-02, -2.008e-02, -1.650e-01)); + r += mul(s3_8, M4(-5.802e-02, 4.015e-03, -7.727e-02, -1.935e-01, 7.799e-03, -2.203e-02, -6.666e-02, -1.774e-01, 4.786e-03, 1.240e-01, -1.484e-01, 4.574e-02, -1.314e-01, 3.668e-02, -3.512e-03, 2.067e-01)); + r += mul(s4_0, M4(-3.480e-02, -3.356e-02, -4.895e-02, -5.957e-03, -4.391e-02, 2.161e-02, -8.893e-02, 4.473e-03, -3.188e-01, 3.568e-02, -2.502e-02, 5.069e-02, -6.971e-02, 1.207e-02, -8.822e-02, -1.065e-02)); + r += mul(s4_1, M4(-4.001e-02, -1.151e-03, -1.282e-01, -1.111e-01, 7.041e-03, -5.520e-02, -2.813e-01, 2.801e-01, -2.163e-02, 1.550e-01, 2.525e-02, 9.990e-02, 1.432e-02, -8.062e-02, 1.754e-01, 7.733e-02)); + r += mul(s4_2, M4(1.065e-01, 4.473e-02, -1.780e-02, -1.057e-01, 2.457e-01, -6.964e-02, 2.837e-01, 5.544e-02, 1.114e-01, 1.061e-01, -4.014e-03, -7.439e-02, 6.132e-02, 2.903e-02, -2.439e-02, 3.338e-02)); + r += mul(s4_3, M4(2.458e-01, 2.098e-02, -1.032e-01, -5.928e-02, 1.101e-01, 6.145e-02, 3.779e-03, -5.586e-03, -1.783e-01, -1.598e-01, -1.364e-01, 1.479e-01, -8.708e-03, -2.184e-02, -7.759e-02, 1.388e-02)); + r += mul(s4_4, M4(-2.294e-02, -5.229e-02, 9.278e-02, 3.531e-02, -4.284e-02, 1.636e-01, 2.907e-02, -1.274e-01, 1.585e-01, -5.364e-02, 1.031e-01, -2.084e-01, -1.381e-01, 9.829e-02, 6.917e-02, 1.736e-01)); + r += mul(s4_5, M4(7.420e-02, 1.156e-01, 2.054e-02, -8.936e-02, 4.535e-02, -4.649e-02, -3.211e-02, 2.075e-01, 1.284e-01, 1.272e-03, 1.120e-01, 1.890e-01, -2.611e-03, 5.461e-02, 2.135e-02, 2.503e-02)); + r += mul(s4_6, M4(-1.240e-01, -1.611e-02, 5.571e-02, 1.172e-01, 7.590e-02, -1.411e-02, -8.898e-02, 1.471e-01, -5.932e-02, 2.798e-02, -7.635e-02, -3.789e-02, -1.260e-01, 2.772e-02, 1.101e-01, -8.736e-02)); + r += mul(s4_7, M4(-1.001e-01, 1.539e-02, 7.691e-02, 3.275e-03, -1.396e-01, -8.471e-02, 5.078e-02, -3.117e-03, -4.415e-02, 1.229e-01, 8.650e-02, 1.605e-01, 2.221e-01, -7.118e-02, -1.555e-01, 3.037e-02)); + r += mul(s4_8, M4(4.324e-02, -7.434e-02, 1.425e-01, 2.127e-02, -1.275e-01, 1.402e-02, 4.531e-02, -1.775e-01, 7.208e-03, 1.470e-01, -9.997e-02, 4.179e-02, 3.099e-02, 3.236e-03, 1.256e-02, -5.362e-02)); + r += mul(s5_0, M4(-5.499e-02, 1.089e-02, 1.966e-01, 1.265e-01, 1.598e-02, -8.382e-03, -5.048e-02, -1.358e-01, 1.039e-01, 5.560e-02, 5.535e-02, -5.814e-02, -2.833e-01, -8.683e-03, -1.797e-02, 2.128e-02)); + r += mul(s5_1, M4(-3.021e-01, -1.367e-01, -6.594e-02, -2.379e-01, -1.311e-01, -1.704e-02, 1.063e-01, -1.499e-01, -2.149e-02, 1.256e-01, 3.517e-02, -1.273e-01, 5.299e-02, 4.324e-02, -4.636e-02, -1.730e-01)); + r += mul(s5_2, M4(1.915e-01, -3.671e-02, 7.262e-02, 3.138e-01, 8.891e-02, -1.213e-02, 6.398e-02, -1.219e-01, -1.356e-01, -9.526e-03, -2.735e-02, -7.145e-02, -2.606e-01, 2.359e-02, 1.698e-01, 1.522e-01)); + r += mul(s5_3, M4(-2.451e-01, 1.785e-02, 3.102e-01, 3.007e-02, 1.073e-01, -4.354e-02, -4.559e-03, -3.315e-02, -6.856e-02, -7.520e-02, 1.284e-03, -6.251e-02, 8.424e-02, 1.095e-02, -3.088e-01, -9.742e-02)); + r += mul(s5_4, M4(-1.551e-01, -1.494e-01, 2.153e-01, 1.393e-02, -2.496e-01, 2.217e-01, 1.903e-01, 7.574e-02, 1.421e-01, -1.086e-01, -4.961e-02, 1.004e-01, 1.392e-01, 3.209e-01, 1.138e-01, -2.434e-01)); + r += mul(s5_5, M4(-4.235e-01, 2.616e-02, 1.230e-01, -8.260e-02, 6.940e-02, -8.190e-02, -6.281e-03, -2.808e-01, 3.210e-02, -7.540e-02, 1.612e-01, 2.514e-01, 3.180e-02, 1.199e-01, -9.426e-02, 2.046e-01)); + r += mul(s5_6, M4(-3.787e-01, 1.389e-01, 3.114e-01, 1.714e-01, 5.573e-02, 3.739e-02, -8.473e-02, -4.610e-02, 9.574e-02, 2.153e-03, -8.866e-03, -4.410e-02, -1.155e-02, -5.400e-02, 1.925e-02, 1.738e-01)); + r += mul(s5_7, M4(-8.150e-02, -2.090e-01, -1.538e-01, 4.760e-01, -1.717e-01, 1.913e-02, 9.299e-03, 1.178e-02, 8.386e-02, -2.141e-02, -4.802e-02, -2.068e-01, 1.744e-01, -4.770e-02, -1.123e-01, 1.521e-01)); + r += mul(s5_8, M4(1.337e-01, -5.348e-02, 1.427e-02, -1.795e-02, 2.848e-03, -1.898e-02, -4.698e-03, -4.581e-02, -1.794e-01, 5.208e-02, 2.183e-02, 8.358e-02, -2.178e-01, -3.258e-03, -1.373e-01, 1.160e-01)); + r += mul(s6_0, M4(-2.858e-02, -5.607e-02, 6.122e-02, 1.521e-02, 1.714e-02, 1.630e-01, -1.331e-01, 7.024e-02, -6.379e-02, -2.672e-02, 2.664e-02, -1.155e-01, -3.388e-02, 4.736e-02, -8.130e-02, 3.151e-01)); + r += mul(s6_1, M4(-2.304e-01, 4.245e-02, -3.877e-01, 4.955e-02, -4.519e-02, 4.113e-02, 5.945e-02, 4.988e-02, 6.812e-02, 1.708e-02, 5.513e-02, 2.077e-01, 5.672e-03, 3.768e-02, -1.364e-02, 9.538e-02)); + r += mul(s6_2, M4(3.777e-01, 2.776e-03, 4.238e-01, 2.226e-01, 4.303e-02, 1.494e-01, -6.361e-02, 2.114e-02, 3.915e-02, -5.454e-02, -1.746e-02, -8.090e-02, -4.120e-02, -5.266e-03, -3.846e-02, 1.031e-01)); + r += mul(s6_3, M4(-1.792e-01, 7.010e-02, -3.349e-01, 1.673e-01, -9.938e-02, 1.228e-01, 4.501e-02, -3.223e-02, -1.085e-01, -2.602e-02, 3.112e-01, 1.934e-02, -4.332e-02, -1.565e-02, 2.233e-01, 2.114e-01)); + r += mul(s6_4, M4(3.164e-02, 1.312e-01, 2.002e-01, -8.395e-04, -6.305e-02, 1.137e-01, -8.620e-03, -1.526e-02, -3.245e-02, 2.534e-02, 3.431e-01, 2.682e-01, 6.176e-02, 7.767e-02, -1.683e-02, -1.062e-01)); + r += mul(s6_5, M4(3.983e-01, -1.263e-01, 1.939e-01, -4.347e-01, 1.405e-02, 1.783e-01, -9.961e-02, 3.092e-02, -1.693e-01, -2.893e-02, 2.976e-02, 8.765e-02, -8.958e-02, 6.622e-03, -1.051e-01, -2.510e-01)); + r += mul(s6_6, M4(3.025e-02, 4.474e-02, 8.671e-02, -1.723e-01, -3.552e-02, 6.098e-02, 6.620e-02, -6.662e-02, -2.257e-01, -6.825e-02, -6.809e-02, 8.563e-02, -3.061e-02, -7.433e-03, 9.983e-02, 1.045e-01)); + r += mul(s6_7, M4(2.197e-02, 1.158e-01, 1.172e-01, -8.142e-02, 8.136e-03, 1.074e-01, 8.381e-03, -8.652e-02, 1.715e-01, -9.235e-02, -4.468e-03, 2.780e-01, 1.224e-01, -4.897e-02, -1.505e-01, -3.873e-01)); + r += mul(s6_8, M4(1.077e-01, 9.874e-02, 2.784e-01, 1.056e-02, 1.047e-01, 3.006e-02, 7.689e-02, -7.230e-02, -7.157e-02, 2.606e-02, 1.841e-02, 7.986e-02, 2.093e-01, -7.551e-02, 1.089e-01, -2.931e-01)); + r += mul(s7_0, M4(-7.262e-02, -2.929e-02, 1.450e-01, -1.313e-01, -2.737e-02, 2.686e-01, 1.031e-01, -1.140e-01, 6.014e-02, -1.711e-02, -1.712e-01, 2.743e-01, -3.961e-03, 5.349e-02, 3.779e-02, -1.480e-01)); + r += mul(s7_1, M4(-2.523e-01, -8.444e-02, -5.685e-02, 1.679e-01, 1.718e-01, 3.372e-02, -1.776e-01, 3.977e-01, -1.106e-01, 4.569e-02, -3.599e-02, -6.396e-02, -5.179e-02, 1.339e-02, 7.202e-02, 8.055e-02)); + r += mul(s7_2, M4(1.646e-02, -4.254e-02, -2.996e-02, 2.612e-01, 3.034e-01, 2.075e-01, 5.784e-02, 1.962e-01, -4.796e-02, -1.175e-02, 1.115e-02, -4.677e-02, 1.267e-01, -9.842e-02, 5.732e-02, 4.389e-02)); + r += mul(s7_3, M4(-1.339e-01, 4.460e-02, -1.090e-01, 4.402e-02, -6.307e-01, 2.004e-01, 1.306e-01, -1.242e-01, 3.439e-01, 5.751e-02, 1.782e-01, -4.005e-02, 1.038e-02, 3.962e-02, -7.156e-02, -5.698e-02)); + r += mul(s7_4, M4(-5.161e-02, 1.104e-01, 1.064e-01, -2.529e-01, 1.336e-01, -1.512e-01, 2.080e-02, -3.020e-01, 1.244e-01, 1.446e-01, 2.897e-01, -3.604e-01, 3.560e-02, 2.879e-01, -6.541e-02, 4.722e-02)); + r += mul(s7_5, M4(-1.565e-02, -8.385e-02, -1.309e-01, -2.954e-01, 5.100e-03, 3.356e-01, -2.372e-01, -1.208e-01, -7.546e-02, 2.556e-02, 2.936e-02, -2.685e-01, 1.546e-01, 4.975e-02, -7.203e-02, 3.938e-02)); + r += mul(s7_6, M4(-9.647e-02, -2.487e-03, 1.106e-01, -1.505e-02, -1.015e-01, 1.383e-01, 1.683e-01, -5.457e-02, -4.709e-02, 2.964e-02, 1.209e-01, -1.821e-01, 1.030e-01, 8.563e-02, -3.546e-01, 1.567e-02)); + r += mul(s7_7, M4(5.586e-03, 7.714e-04, -8.230e-02, -7.812e-02, -2.193e-02, -9.724e-02, -2.037e-01, -2.090e-02, 1.396e-01, 1.463e-02, 5.520e-02, -2.476e-01, 9.839e-02, 2.303e-02, -8.032e-02, 1.211e-02)); + r += mul(s7_8, M4(4.894e-02, -2.312e-02, -1.515e-01, -7.387e-02, 2.279e-01, 1.422e-01, 1.680e-02, -1.466e-02, 9.482e-02, -2.726e-02, -3.037e-02, 2.144e-01, 1.412e-01, 2.566e-02, 1.389e-02, 2.099e-01)); + r += V4(-7.067e-03, -2.480e-01, 1.181e-02, 1.629e-02); + return r; +} + +V4 f1(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-6.296e-02, 7.760e-03, 6.615e-03, -6.910e-02, -1.733e-01, -1.156e-01, -1.551e-01, -1.193e-01, 4.787e-02, 6.314e-03, -3.864e-02, -1.277e-01, -1.072e-01, -1.677e-01, -1.273e-01, -6.141e-01)); + r += mul(s0_1, M4(-1.401e-02, -7.855e-02, 7.498e-02, 1.439e-01, -1.983e-01, -1.254e-01, -6.861e-02, 2.587e-01, -1.967e-01, -4.699e-02, 1.141e-01, 1.117e-01, -1.657e-01, -1.043e-01, -1.024e-01, -3.792e-01)); + r += mul(s0_2, M4(-8.788e-02, 1.379e-02, 3.835e-02, -4.003e-02, 7.202e-02, -2.507e-02, -7.286e-03, 9.680e-02, 4.744e-02, 7.028e-02, 4.711e-02, 1.302e-01, 5.147e-02, -1.442e-01, -1.021e-01, -1.200e-01)); + r += mul(s0_3, M4(-1.092e-01, 3.675e-02, 1.100e-01, -1.764e-02, 1.332e-01, 3.322e-02, -1.338e-01, 3.050e-01, -1.125e-01, 1.422e-01, 3.435e-02, 5.083e-02, -1.082e-01, 3.614e-03, -1.721e-01, -2.248e-01)); + r += mul(s0_4, M4(-1.823e-01, -4.488e-02, 2.356e-01, 6.690e-03, 4.926e-02, -6.168e-02, -6.737e-02, 9.670e-02, 7.045e-02, -9.428e-02, -1.176e-01, 2.986e-01, -8.239e-03, -1.726e-01, -2.281e-01, 4.943e-02)); + r += mul(s0_5, M4(-2.979e-02, 1.098e-02, 1.388e-01, 1.658e-02, 8.264e-02, -1.971e-02, -7.715e-02, 3.450e-02, -7.950e-02, 4.570e-02, 4.495e-02, -3.240e-03, -2.056e-01, 8.439e-02, -1.198e-02, -8.534e-03)); + r += mul(s0_6, M4(2.039e-02, 1.046e-01, 1.343e-01, -1.218e-01, 1.207e-02, -9.623e-02, -7.417e-02, 9.335e-03, -3.468e-03, 9.762e-02, 9.744e-03, -4.961e-02, -7.627e-02, 9.029e-02, 1.106e-02, 4.004e-03)); + r += mul(s0_7, M4(8.910e-02, -1.111e-02, -9.261e-03, -1.198e-01, 5.008e-02, -1.737e-02, -2.231e-01, 9.532e-02, 1.245e-03, -3.073e-02, -5.711e-02, 6.196e-02, -1.358e-01, -1.777e-01, 1.823e-03, 6.634e-02)); + r += mul(s0_8, M4(2.888e-02, 1.446e-01, 1.182e-01, -2.587e-02, -7.939e-03, -6.873e-02, 9.312e-02, -7.450e-02, 1.244e-02, -1.426e-01, -1.923e-02, -9.536e-02, 1.318e-01, -4.630e-02, 1.188e-01, -5.019e-02)); + r += mul(s1_0, M4(8.971e-02, -9.082e-02, -7.461e-02, -2.907e-02, -1.107e-01, 1.039e-01, -8.184e-03, -1.111e-01, 2.382e-02, 1.451e-01, -4.172e-02, 1.012e-02, 2.358e-01, -1.155e-01, 3.239e-02, 7.585e-02)); + r += mul(s1_1, M4(2.872e-02, -2.363e-01, 7.393e-02, 2.592e-01, 2.485e-02, 4.569e-02, 8.531e-02, 1.181e-01, 2.343e-02, 1.434e-01, -1.593e-01, 5.882e-02, 3.096e-01, 4.042e-02, 6.920e-02, -3.214e-02)); + r += mul(s1_2, M4(-3.794e-02, -6.319e-03, 2.241e-01, 2.066e-02, -1.690e-01, 2.888e-02, -2.124e-02, 2.206e-02, 6.969e-02, 1.724e-01, -4.655e-02, 1.423e-01, 3.927e-02, 1.894e-02, 1.240e-01, 4.935e-02)); + r += mul(s1_3, M4(-4.410e-01, -4.775e-02, -2.330e-01, 2.230e-01, -2.839e-01, -6.997e-02, -1.015e-01, -1.054e-01, -2.014e-01, 2.071e-01, -1.688e-02, 1.301e-01, 2.427e-01, -4.421e-02, 8.016e-03, 4.136e-02)); + r += mul(s1_4, M4(-3.077e-01, -1.590e-01, -1.906e-01, 1.468e-01, 1.443e-02, -1.398e-01, -2.670e-02, -7.530e-02, 1.152e-01, 8.916e-02, -5.355e-02, 2.350e-01, 3.961e-01, 1.659e-01, -1.960e-01, 7.532e-02)); + r += mul(s1_5, M4(-2.561e-01, 1.781e-02, 1.265e-02, 1.338e-01, 8.716e-02, 2.390e-02, 9.098e-02, -8.604e-03, -2.280e-01, 2.041e-02, 1.755e-01, 1.053e-01, 9.669e-03, 2.135e-01, 1.511e-01, -3.904e-02)); + r += mul(s1_6, M4(1.296e-01, -1.541e-01, -2.282e-01, 1.621e-01, 1.033e-02, -6.657e-02, 1.396e-01, -7.432e-02, 2.574e-01, 2.337e-02, -9.461e-02, -5.584e-02, 6.284e-02, 1.940e-01, 1.195e-01, -1.045e-02)); + r += mul(s1_7, M4(2.040e-01, 1.778e-02, -3.518e-01, 3.646e-02, 4.260e-02, 2.341e-01, 1.879e-02, -6.436e-02, 1.185e-01, -2.253e-01, 7.939e-02, 1.112e-02, -5.558e-02, 1.451e-01, 4.042e-02, -7.908e-02)); + r += mul(s1_8, M4(-4.773e-02, 1.554e-01, -1.877e-01, -1.379e-01, -5.846e-02, -1.405e-02, 9.912e-02, -5.957e-02, 3.975e-01, -5.402e-02, -5.425e-02, 4.381e-02, -1.086e-01, 5.943e-02, 2.654e-02, 5.067e-02)); + r += mul(s2_0, M4(6.013e-03, -1.253e-01, 1.684e-01, 1.034e-02, 6.153e-03, -2.489e-02, 2.605e-02, -3.455e-02, -2.483e-02, -7.223e-02, -2.935e-02, -3.720e-02, -1.545e-01, 7.488e-02, 1.590e-01, -9.646e-02)); + r += mul(s2_1, M4(-1.124e-01, -2.540e-02, -1.007e-01, 3.891e-01, 9.111e-02, -6.169e-02, 4.814e-03, -2.303e-02, 1.628e-01, 4.082e-03, -1.690e-02, 3.356e-02, -2.616e-01, 3.774e-03, -2.280e-01, 2.459e-01)); + r += mul(s2_2, M4(3.480e-02, 6.542e-02, 3.395e-02, 1.568e-01, 1.253e-01, 1.658e-02, -1.394e-02, 9.313e-02, 1.123e-01, 3.798e-02, -7.904e-02, 5.355e-02, 1.717e-02, -7.496e-02, 1.604e-01, -1.738e-02)); + r += mul(s2_3, M4(-3.165e-03, -8.321e-02, -1.332e-01, -2.712e-02, 8.552e-02, -2.493e-01, -1.120e-01, 1.037e-03, 1.315e-01, -1.144e-01, -5.099e-02, 3.977e-02, 1.624e-01, -2.295e-01, 2.364e-01, 6.290e-02)); + r += mul(s2_4, M4(-9.325e-02, -1.038e-01, 1.666e-02, 1.585e-01, -7.056e-02, 1.631e-01, -3.784e-03, 1.019e-01, -1.726e-01, 3.181e-03, -9.122e-02, -7.055e-02, 5.812e-01, -2.316e-01, -3.565e-02, -7.114e-02)); + r += mul(s2_5, M4(-6.748e-02, -1.361e-01, -1.217e-01, -7.496e-02, 1.507e-03, -1.285e-01, 9.394e-02, 2.374e-02, -1.774e-01, -6.646e-02, 3.708e-02, -1.242e-02, 1.416e-01, -1.894e-01, -1.324e-01, 1.631e-01)); + r += mul(s2_6, M4(1.277e-01, 4.821e-02, 9.689e-02, 3.256e-02, -3.484e-02, -2.009e-02, -5.629e-02, -5.021e-02, 1.237e-01, -1.442e-02, -4.216e-03, 9.495e-02, -7.393e-02, 2.990e-02, 3.954e-01, 3.259e-02)); + r += mul(s2_7, M4(1.946e-01, 1.638e-01, 5.388e-02, -1.684e-02, 1.038e-01, 1.256e-02, 1.280e-01, -1.644e-04, 2.570e-01, -2.273e-01, 1.624e-01, -3.824e-02, 1.537e-01, -1.509e-01, -4.485e-02, -1.919e-02)); + r += mul(s2_8, M4(1.524e-02, 1.102e-01, 1.297e-01, -6.958e-02, 3.049e-02, -1.014e-01, -4.677e-03, 6.799e-02, 1.526e-01, -7.553e-02, 2.533e-03, 1.559e-01, -9.696e-03, -2.257e-01, 2.736e-01, -2.925e-01)); + r += mul(s3_0, M4(-5.678e-03, -9.975e-02, 5.608e-02, -1.878e-02, 1.492e-01, -1.788e-01, 6.868e-02, -3.736e-02, -9.419e-02, -1.721e-02, 1.413e-02, -1.774e-02, -7.584e-02, 6.618e-03, 2.523e-02, -6.888e-02)); + r += mul(s3_1, M4(9.743e-02, -5.011e-02, -1.033e-01, 1.148e-01, 7.509e-02, 1.483e-01, -2.218e-02, -2.814e-01, 2.120e-01, 6.953e-03, 7.592e-02, -2.436e-01, -1.137e-01, -2.710e-02, -8.729e-02, -4.858e-02)); + r += mul(s3_2, M4(5.880e-02, 2.609e-02, 4.146e-02, 2.087e-01, -1.517e-01, 9.844e-02, 5.635e-02, -2.144e-01, -8.840e-02, 1.367e-01, 2.265e-03, 1.798e-02, -8.372e-02, -1.541e-02, -8.325e-02, 6.236e-02)); + r += mul(s3_3, M4(1.284e-01, -5.165e-02, -1.073e-01, 1.566e-02, -8.156e-02, 9.434e-02, -1.572e-01, -2.248e-01, 1.289e-02, -2.447e-02, -1.321e-02, -1.364e-01, 1.252e-03, -2.467e-01, 9.000e-02, 1.592e-01)); + r += mul(s3_4, M4(3.242e-02, 8.790e-02, 6.500e-02, 1.169e-01, 1.310e-01, 5.295e-02, -3.770e-01, 2.659e-02, -1.715e-01, 7.007e-02, -3.154e-02, -1.503e-01, 1.687e-01, -1.812e-01, 1.072e-01, -5.560e-02)); + r += mul(s3_5, M4(5.164e-02, 2.774e-02, 3.806e-02, -1.682e-01, 2.807e-01, -1.499e-01, -1.471e-01, -1.294e-01, 3.739e-02, 1.806e-02, -3.975e-02, -7.185e-02, 1.505e-01, -7.103e-03, -1.306e-01, 1.362e-01)); + r += mul(s3_6, M4(1.583e-01, -2.523e-01, -9.988e-02, -4.831e-02, 1.392e-01, 2.817e-01, -2.417e-01, -1.503e-01, 2.149e-02, 4.919e-01, 7.501e-02, -4.918e-02, -3.924e-03, 2.290e-01, 5.465e-02, -3.692e-02)); + r += mul(s3_7, M4(-2.568e-01, 2.126e-01, -9.229e-02, -9.968e-02, 2.697e-01, -2.022e-01, 7.863e-02, -1.691e-01, -3.892e-01, 8.126e-02, 5.303e-01, -9.675e-02, -5.414e-02, -5.654e-02, -5.946e-02, -1.013e-01)); + r += mul(s3_8, M4(-4.412e-02, 8.399e-02, -2.984e-01, 1.498e-01, -1.460e-01, -1.423e-01, -2.728e-01, 7.422e-02, -1.358e-01, 5.904e-02, -9.015e-02, -2.758e-02, 5.924e-02, -1.556e-01, 5.550e-02, -4.398e-02)); + r += mul(s4_0, M4(-1.170e-01, -1.378e-01, -4.116e-02, 1.387e-01, 1.216e-01, 9.390e-02, 1.264e-01, -1.458e-01, 8.866e-02, -1.196e-01, 1.862e-01, 5.594e-01, 4.088e-02, -5.253e-03, -3.735e-02, 1.472e-01)); + r += mul(s4_1, M4(8.938e-03, -6.878e-03, -2.098e-02, -3.777e-02, 2.842e-01, 1.345e-01, 1.345e-02, -2.262e-02, -3.473e-02, -1.377e-02, -5.251e-02, -3.000e-01, 5.819e-02, 7.130e-03, 8.860e-02, -4.931e-02)); + r += mul(s4_2, M4(-7.974e-02, -1.470e-02, -1.071e-01, 6.803e-02, 2.739e-02, 1.840e-01, 1.857e-02, 1.595e-02, -9.594e-02, -2.005e-01, -1.699e-01, -6.428e-02, -1.115e-01, 2.762e-02, -1.109e-01, -5.929e-02)); + r += mul(s4_3, M4(-7.114e-02, 2.181e-02, -2.073e-01, -1.219e-02, 4.196e-02, 2.025e-01, 5.159e-02, 1.224e-01, -2.798e-01, -1.442e-01, 1.147e-02, 7.897e-02, -3.916e-03, 3.012e-02, -1.081e-01, 3.503e-03)); + r += mul(s4_4, M4(-3.617e-02, 1.201e-01, 5.453e-02, 1.035e-01, -2.327e-01, 1.920e-01, -6.373e-02, 2.633e-01, -1.994e-01, 1.184e-01, 1.997e-01, -8.347e-02, 6.505e-02, -1.572e-01, -3.503e-02, 1.064e-01)); + r += mul(s4_5, M4(-1.005e-01, -2.648e-02, -4.836e-02, 8.596e-02, 9.809e-02, 7.420e-02, 1.844e-01, -1.432e-01, 1.792e-01, -2.256e-01, -4.148e-01, 9.456e-02, 2.001e-02, -3.829e-02, -2.361e-01, -1.106e-01)); + r += mul(s4_6, M4(1.471e-02, 9.680e-02, 5.551e-02, -5.460e-02, 6.416e-02, 1.523e-02, -1.561e-01, -9.986e-02, 4.359e-02, -1.792e-01, 2.300e-01, 3.665e-02, -1.285e-02, -1.844e-01, -8.183e-02, -2.661e-02)); + r += mul(s4_7, M4(1.598e-02, -1.975e-02, 2.088e-01, -8.643e-02, 1.618e-01, 1.001e-01, -1.640e-01, -2.352e-02, 2.128e-01, -4.072e-04, -5.130e-01, 4.805e-04, -5.274e-02, 9.536e-02, -7.823e-02, 5.530e-02)); + r += mul(s4_8, M4(-2.983e-02, 4.106e-02, 4.312e-02, -8.918e-02, -1.063e-01, 2.148e-01, 1.454e-02, 7.327e-02, -2.582e-03, 2.259e-02, -3.194e-01, -1.971e-02, 2.798e-02, 5.562e-02, -1.398e-01, -6.819e-02)); + r += mul(s5_0, M4(4.513e-01, 4.676e-01, 5.226e-01, 1.764e-01, -9.800e-02, -7.946e-02, 2.521e-02, -4.449e-02, 6.989e-02, -8.352e-02, -4.870e-02, 3.570e-02, 4.503e-02, 2.162e-01, -9.362e-02, 3.516e-01)); + r += mul(s5_1, M4(-5.371e-02, 1.972e-01, -4.532e-02, 2.918e-01, -2.111e-01, -3.814e-02, 1.917e-01, -5.373e-03, 6.381e-02, 1.753e-02, 6.961e-02, 3.351e-02, 1.103e-01, -9.770e-02, -9.194e-02, -5.176e-02)); + r += mul(s5_2, M4(9.004e-02, -1.363e-02, -1.163e-02, -9.717e-02, -1.343e-01, -5.610e-02, -1.661e-01, 3.208e-02, 8.446e-02, -3.063e-02, 7.279e-02, -1.185e-01, 3.186e-01, 6.196e-02, 1.419e-01, 1.332e-01)); + r += mul(s5_3, M4(2.893e-01, -4.345e-02, 6.999e-02, -4.645e-02, 1.928e-01, -2.891e-01, -5.506e-02, -5.547e-02, 6.418e-02, 5.734e-02, 6.073e-03, 1.036e-01, 1.590e-01, -1.633e-01, -2.515e-02, -5.278e-02)); + r += mul(s5_4, M4(-1.224e-01, -2.496e-01, 4.529e-02, 3.488e-01, 1.504e-03, -4.240e-01, 2.477e-02, 4.511e-02, 5.403e-02, 1.711e-01, 1.764e-01, 3.557e-02, 1.015e-01, -3.583e-01, 3.328e-01, 7.640e-02)); + r += mul(s5_5, M4(-1.450e-01, -2.665e-01, -1.446e-01, 1.696e-01, -1.642e-01, -7.631e-02, -3.422e-03, -9.272e-02, -1.440e-02, 3.656e-02, 4.633e-02, 6.810e-02, 7.371e-02, 2.298e-01, 2.306e-01, -2.436e-01)); + r += mul(s5_6, M4(3.661e-01, 1.620e-01, 4.195e-01, -3.285e-01, 1.617e-02, -2.502e-01, 1.880e-02, 1.265e-01, -4.917e-02, 4.856e-02, 1.003e-01, -7.730e-02, -1.180e-01, -1.242e-01, 6.801e-03, 3.626e-03)); + r += mul(s5_7, M4(3.307e-01, -1.375e-01, -2.029e-01, 2.181e-01, 1.969e-01, -3.681e-01, 1.225e-01, -2.982e-02, 4.205e-02, 8.890e-02, -1.453e-01, -8.069e-02, 3.265e-01, -7.184e-02, 6.168e-02, -1.892e-01)); + r += mul(s5_8, M4(1.585e-01, 2.796e-01, 2.616e-01, 8.947e-02, 1.624e-01, -1.246e-01, -2.392e-01, 9.131e-02, -8.142e-02, -1.192e-02, 3.717e-02, -8.612e-02, 1.071e-01, -1.051e-01, 1.600e-01, 7.882e-02)); + r += mul(s6_0, M4(-5.474e-02, -1.008e-01, 1.636e-02, 1.844e-01, 1.248e-01, 3.317e-02, 1.378e-02, 3.465e-03, 7.883e-02, -1.977e-02, 1.255e-01, -1.549e-01, -7.282e-02, 1.778e-01, -5.500e-02, 9.860e-02)); + r += mul(s6_1, M4(2.543e-01, -2.954e-01, 4.462e-02, -9.544e-02, 1.528e-02, -9.023e-02, 1.001e-01, -1.330e-01, 6.335e-03, -2.947e-02, 5.462e-02, -1.493e-01, 4.117e-02, -6.603e-02, -5.900e-03, 3.771e-02)); + r += mul(s6_2, M4(6.381e-02, 2.838e-03, -3.115e-01, 9.896e-02, 9.216e-02, -2.670e-02, 6.396e-02, -2.471e-02, 3.709e-02, -6.857e-02, -3.678e-02, 4.962e-02, 8.385e-03, 1.931e-01, 1.366e-02, -1.669e-02)); + r += mul(s6_3, M4(8.992e-02, -8.330e-02, 2.828e-02, -1.335e-01, 4.957e-02, 7.820e-03, 7.989e-02, 6.431e-02, 1.280e-01, -2.863e-03, 1.777e-01, -1.335e-01, -5.924e-02, 1.229e-01, -7.804e-02, 1.636e-01)); + r += mul(s6_4, M4(-1.124e-01, -1.182e-01, 3.981e-02, 2.047e-01, -1.712e-02, -1.877e-02, 1.001e-01, -3.272e-02, -1.424e-01, -8.957e-02, -6.594e-02, -1.042e-02, -9.962e-02, 2.836e-02, 6.545e-02, 1.542e-01)); + r += mul(s6_5, M4(5.565e-03, 2.089e-01, -8.464e-02, 5.421e-02, -1.540e-01, -5.868e-02, 1.151e-01, -1.651e-01, -1.522e-03, 3.179e-02, -1.211e-02, 1.724e-02, 4.772e-02, -2.717e-01, -1.096e-03, -2.160e-01)); + r += mul(s6_6, M4(-1.562e-02, 1.106e-01, 3.543e-02, 7.591e-02, -3.997e-02, 6.842e-02, 1.129e-01, 1.381e-01, 1.876e-01, 4.092e-01, 1.209e-01, 6.818e-02, -1.437e-01, 1.191e-01, -1.169e-01, 8.674e-02)); + r += mul(s6_7, M4(-4.597e-02, -3.929e-02, -1.468e-02, 7.116e-02, -8.660e-02, 3.209e-02, 3.214e-02, -3.238e-02, -1.492e-01, 2.566e-02, 1.710e-01, -1.887e-01, -2.617e-01, 3.479e-01, -1.033e-01, 2.452e-01)); + r += mul(s6_8, M4(5.360e-01, -6.639e-02, 4.089e-02, -2.392e-02, -2.369e-01, 1.002e-01, 2.614e-02, -3.216e-02, -3.226e-02, 8.686e-02, 2.782e-02, 3.562e-02, 5.844e-02, 8.772e-02, 3.218e-01, -2.124e-03)); + r += mul(s7_0, M4(-4.048e-02, -9.997e-02, 8.137e-02, 2.078e-02, 1.268e-01, -1.598e-01, 3.866e-02, -1.074e-01, -2.593e-01, 9.528e-02, 9.960e-02, 5.756e-02, 1.358e-01, -5.139e-03, -1.316e-02, -1.092e-01)); + r += mul(s7_1, M4(-1.213e-01, 8.196e-02, -8.100e-02, 1.871e-01, 1.131e-01, 1.529e-01, -6.739e-03, -2.926e-01, 6.150e-02, -3.458e-02, 8.555e-02, -9.260e-02, 1.937e-02, -8.979e-02, 2.298e-02, 8.512e-02)); + r += mul(s7_2, M4(-8.931e-03, -3.090e-03, -1.055e-01, -9.030e-02, 8.746e-02, -9.688e-02, 9.056e-02, 8.719e-02, 1.805e-03, -6.690e-02, 3.257e-02, -1.213e-02, 1.109e-02, 2.994e-02, 2.223e-03, 1.758e-01)); + r += mul(s7_3, M4(-1.470e-01, -1.280e-02, 6.654e-02, 4.358e-02, 9.439e-02, 1.011e-01, 1.927e-01, 2.059e-01, -2.276e-01, 1.261e-01, -6.429e-02, -1.375e-02, 2.319e-01, -1.480e-01, -1.147e-01, -3.065e-01)); + r += mul(s7_4, M4(-3.930e-02, -2.527e-01, 2.501e-01, 8.167e-02, -1.693e-01, -1.588e-01, 2.412e-01, 4.158e-01, 1.166e-01, -1.097e-01, -1.071e-01, 1.972e-01, 2.167e-01, -5.103e-02, -2.525e-02, 4.689e-02)); + r += mul(s7_5, M4(-1.498e-01, 9.670e-02, -3.224e-02, -1.630e-01, -3.076e-01, 1.045e-02, 1.002e-01, -1.043e-01, 1.172e-01, 7.072e-04, -7.597e-02, 9.863e-03, -5.800e-02, -4.964e-02, -3.846e-02, -9.352e-04)); + r += mul(s7_6, M4(-1.372e-01, 1.598e-01, -1.029e-01, -7.709e-02, 4.725e-02, 5.317e-02, 4.150e-01, 7.688e-02, -2.923e-01, 2.772e-01, -3.063e-01, 7.638e-02, 1.667e-01, -1.784e-01, -5.216e-02, -2.791e-02)); + r += mul(s7_7, M4(-8.641e-02, 1.598e-01, 8.128e-02, -4.598e-02, 9.464e-02, 2.164e-01, 4.623e-01, 4.714e-02, -1.506e-01, 1.833e-01, -8.676e-02, 3.411e-01, -2.230e-02, -1.713e-01, 4.596e-02, -2.925e-02)); + r += mul(s7_8, M4(-9.475e-02, -3.959e-02, 7.701e-02, 4.111e-02, -4.562e-01, 2.156e-02, -2.381e-03, -2.020e-01, 8.663e-02, 5.398e-02, -1.718e-01, -3.074e-02, -5.906e-02, -4.721e-02, 2.176e-01, -8.696e-02)); + r += V4(7.251e-02, -4.031e-02, -3.769e-02, 6.364e-02); + return r; +} + +V4 f2(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-1.698e-02, -1.873e-01, -6.680e-02, 4.658e-02, -1.640e-02, -4.673e-02, 2.303e-02, -7.395e-02, 9.013e-02, -2.312e-02, 7.911e-02, -3.101e-02, 1.765e-01, -3.523e-01, 2.891e-01, -1.342e-01)); + r += mul(s0_1, M4(-5.807e-02, 1.886e-01, 3.353e-03, -1.506e-02, -2.154e-01, -5.218e-03, 2.449e-01, -1.151e-01, 6.348e-02, -1.934e-02, -3.096e-02, 1.163e-02, 5.664e-01, -1.311e-01, 3.078e-01, 8.386e-02)); + r += mul(s0_2, M4(-4.766e-02, -3.748e-02, 1.156e-01, -1.899e-02, 2.700e-02, 7.951e-02, -1.855e-02, -1.360e-01, -9.049e-02, 1.629e-01, 5.111e-02, 2.138e-02, -4.326e-02, -6.232e-02, 1.730e-01, 9.890e-02)); + r += mul(s0_3, M4(-9.821e-02, -8.497e-04, 3.265e-02, 3.157e-02, 3.790e-02, 2.119e-01, -2.147e-01, 7.346e-02, 1.442e-01, -5.694e-02, -6.352e-02, 1.299e-01, 2.590e-01, 3.356e-02, 2.009e-01, 3.760e-01)); + r += mul(s0_4, M4(1.312e-01, 2.749e-01, 3.881e-02, 2.240e-01, 1.452e-01, -5.652e-02, 1.002e-01, 3.697e-03, -2.693e-01, -4.560e-02, -5.198e-02, -1.121e-01, -5.385e-02, -2.180e-01, 2.357e-01, -4.682e-02)); + r += mul(s0_5, M4(1.037e-01, -4.922e-03, -1.589e-02, 1.669e-01, 6.173e-02, 8.454e-03, 3.746e-01, 1.235e-01, -8.087e-02, -1.984e-02, 3.124e-02, -1.156e-01, -1.325e-01, 2.218e-01, 1.087e-01, 1.539e-01)); + r += mul(s0_6, M4(-5.949e-03, -2.015e-01, 7.017e-02, -9.461e-02, -1.481e-01, 1.249e-01, -1.170e-01, -1.190e-01, 6.665e-02, -7.714e-02, -3.005e-02, -1.891e-01, 5.926e-02, 2.404e-02, -2.855e-02, 4.209e-02)); + r += mul(s0_7, M4(1.168e-01, 1.383e-01, 4.428e-02, -2.288e-01, 9.044e-02, 2.164e-01, -8.071e-02, 6.872e-02, 1.572e-02, -4.685e-02, 2.427e-01, -2.775e-02, -4.994e-02, 3.562e-02, 4.875e-02, 1.291e-01)); + r += mul(s0_8, M4(4.041e-03, 2.384e-02, -1.436e-01, 7.285e-02, -9.456e-02, -2.413e-02, 1.093e-01, 1.186e-01, -3.203e-02, 1.475e-02, -1.489e-02, 2.053e-01, 5.281e-02, 4.876e-02, -6.375e-02, 1.727e-02)); + r += mul(s1_0, M4(-2.273e-02, 1.106e-01, -2.805e-01, 4.683e-02, 4.003e-02, 1.739e-03, -9.869e-02, -6.333e-02, -7.502e-02, 2.742e-01, 6.364e-02, -8.908e-02, 1.085e-01, 3.470e-01, -3.442e-01, -9.594e-02)); + r += mul(s1_1, M4(-2.592e-01, -2.718e-02, 2.159e-01, 5.279e-02, -7.593e-02, -5.258e-02, 1.568e-01, 1.135e-01, 1.196e-01, 1.640e-01, 2.071e-01, -3.588e-01, -1.379e-01, 1.784e-01, 6.214e-03, -5.460e-02)); + r += mul(s1_2, M4(-1.736e-02, 2.079e-01, 4.595e-03, -1.123e-01, -2.302e-02, 6.572e-02, -1.167e-01, 1.474e-02, -1.697e-03, -2.812e-01, 1.269e-02, -3.907e-03, -6.566e-02, 1.811e-01, 1.914e-01, -3.899e-02)); + r += mul(s1_3, M4(-1.516e-01, -1.128e-02, -1.515e-01, -5.396e-02, 3.382e-02, -4.851e-02, 5.555e-02, 1.203e-01, 7.104e-02, 2.457e-01, 3.103e-02, 7.618e-02, -1.235e-02, -6.414e-02, -1.932e-01, 2.398e-01)); + r += mul(s1_4, M4(9.719e-02, -2.010e-01, 1.421e-01, -3.102e-03, 4.764e-02, 1.152e-01, -1.954e-03, -2.084e-01, 1.056e-01, -7.074e-02, -2.112e-02, -1.057e-01, -1.572e-01, -4.169e-02, -6.214e-02, -7.277e-01)); + r += mul(s1_5, M4(8.558e-02, -2.495e-01, -1.989e-01, 9.590e-02, 1.615e-01, -1.643e-01, -1.051e-02, -9.111e-02, -6.694e-02, 1.960e-01, 3.509e-01, 2.216e-02, -1.859e-01, -3.016e-01, -1.452e-01, 1.759e-01)); + r += mul(s1_6, M4(1.043e-01, -1.302e-01, 3.582e-02, -2.599e-01, 9.496e-02, -1.366e-01, 3.558e-02, -1.240e-01, -8.862e-02, 1.433e-01, -2.149e-02, -1.374e-02, 2.642e-02, -2.283e-02, -2.794e-02, -2.896e-02)); + r += mul(s1_7, M4(1.294e-01, -1.096e-01, -1.064e-01, -2.245e-01, 8.796e-02, 9.860e-02, 2.812e-02, 1.750e-02, 1.139e-01, -1.873e-01, 2.878e-02, 1.735e-01, 1.740e-02, 1.851e-02, -2.990e-02, -1.145e-01)); + r += mul(s1_8, M4(-1.369e-01, -6.807e-02, -5.180e-02, 1.313e-01, -3.927e-05, -1.128e-01, 4.890e-02, 3.989e-02, -2.035e-01, 2.148e-01, -2.251e-01, 1.421e-01, -7.962e-03, 1.509e-01, -1.495e-02, -1.019e-01)); + r += mul(s2_0, M4(-9.294e-02, -2.481e-02, 1.403e-01, -1.359e-01, -1.061e-01, -5.883e-02, -1.400e-01, 5.274e-02, -2.305e-02, 4.316e-02, -1.507e-01, 1.499e-02, 1.564e-02, -4.029e-01, 1.641e-01, -5.780e-02)); + r += mul(s2_1, M4(-1.752e-02, -4.913e-02, 1.778e-02, -1.957e-03, -1.179e-01, 8.784e-02, -1.297e-01, -1.210e-02, -4.552e-02, 7.796e-02, -1.006e-02, -8.141e-02, -2.534e-01, -5.645e-02, 5.620e-02, 7.241e-02)); + r += mul(s2_2, M4(-2.166e-01, -5.779e-02, 1.009e-02, 1.082e-01, 3.005e-02, -2.124e-01, 7.502e-02, 1.306e-02, -2.851e-02, 6.912e-02, 3.177e-02, 1.945e-02, -1.518e-01, -1.881e-01, -1.107e-01, 1.201e-02)); + r += mul(s2_3, M4(-4.604e-02, 9.225e-02, 1.064e-01, 6.817e-03, -1.436e-01, 1.484e-01, 8.814e-03, 1.094e-01, -2.963e-02, -1.773e-01, 4.952e-02, 3.703e-02, -1.068e-01, -4.995e-02, -1.110e-01, -2.143e-01)); + r += mul(s2_4, M4(-1.260e-01, 4.946e-01, 9.564e-02, -8.133e-02, 1.674e-01, -2.238e-01, 7.130e-02, -1.971e-02, 1.666e-01, 2.136e-02, -1.943e-02, 2.817e-02, 6.673e-02, 5.442e-02, -9.210e-02, -2.027e-01)); + r += mul(s2_5, M4(1.928e-02, 3.097e-01, 1.487e-01, -2.217e-01, 1.282e-01, -2.386e-02, 6.971e-03, 8.529e-02, -9.620e-03, -5.562e-02, -1.293e-01, -7.603e-02, 2.167e-02, 1.700e-01, 3.485e-02, -5.729e-02)); + r += mul(s2_6, M4(-8.671e-02, 1.699e-01, 1.681e-01, 5.908e-02, -4.252e-03, -3.336e-02, 1.989e-01, 3.247e-02, 4.496e-02, -6.578e-02, -1.127e-01, -1.141e-01, -1.770e-01, -1.885e-01, 3.977e-02, 7.611e-02)); + r += mul(s2_7, M4(-1.079e-01, -8.983e-02, -1.298e-01, 1.607e-01, -1.065e-01, 1.661e-02, -7.341e-02, -4.099e-02, 2.815e-02, 1.428e-01, 7.976e-02, -2.694e-02, 2.546e-01, -4.262e-02, 6.669e-02, 4.667e-02)); + r += mul(s2_8, M4(-7.842e-02, -1.926e-01, 1.274e-02, -1.604e-02, 1.094e-02, 6.732e-02, 3.969e-02, 7.989e-03, -4.900e-02, -1.781e-01, -2.337e-02, -1.487e-02, 1.947e-01, -2.330e-01, 1.304e-01, -1.592e-02)); + r += mul(s3_0, M4(-1.820e-01, -7.021e-02, -8.828e-02, 7.994e-02, 9.838e-02, -7.559e-02, -6.619e-02, 6.800e-02, -9.744e-03, -6.037e-02, 1.779e-02, -4.527e-02, 3.634e-02, 3.175e-01, 2.481e-03, -1.218e-01)); + r += mul(s3_1, M4(-3.103e-02, 3.963e-02, -7.307e-02, 4.523e-02, -1.794e-01, -3.067e-01, 1.376e-01, 1.912e-01, 9.885e-02, -5.196e-02, -8.585e-02, 9.436e-02, -1.400e-01, 8.002e-02, -5.219e-03, 5.146e-02)); + r += mul(s3_2, M4(1.009e-01, 1.692e-01, 1.049e-01, -9.813e-03, 8.228e-02, 7.716e-02, 3.513e-01, -1.930e-01, -8.766e-02, -7.978e-02, -2.276e-01, -7.862e-02, -1.635e-02, 1.706e-01, -1.281e-01, 5.733e-02)); + r += mul(s3_3, M4(-1.142e-01, -1.328e-01, -6.850e-02, -7.040e-02, -1.122e-01, 1.799e-01, 2.511e-01, 9.606e-02, -9.700e-02, -2.469e-01, 2.237e-01, -2.198e-01, 3.658e-02, -6.923e-02, 1.219e-01, 7.830e-02)); + r += mul(s3_4, M4(1.073e-01, -1.174e-01, 1.235e-02, 1.604e-01, 3.105e-01, -1.302e-02, 3.550e-01, -1.716e-01, 1.775e-01, 2.759e-02, 1.459e-02, 1.077e-01, 3.152e-03, -1.262e-01, -3.016e-02, -1.051e-01)); + r += mul(s3_5, M4(-4.056e-02, 3.065e-02, 9.051e-02, 1.969e-01, 1.910e-01, 2.110e-01, 5.586e-02, 7.756e-02, -1.644e-01, -1.751e-01, -6.551e-02, 4.693e-02, -8.392e-02, 1.207e-01, -9.491e-02, 9.841e-02)); + r += mul(s3_6, M4(4.175e-02, -1.885e-02, -3.087e-02, -3.164e-01, 7.055e-04, 1.036e-01, -1.606e-01, -6.494e-02, 2.920e-01, -4.953e-01, 1.364e-01, 2.848e-02, 2.253e-02, 7.942e-02, 1.192e-01, -3.001e-02)); + r += mul(s3_7, M4(3.773e-03, -4.945e-02, 5.913e-02, -1.400e-01, 1.157e-01, 9.907e-02, -5.604e-02, 8.307e-02, 1.586e-01, 9.916e-02, -1.486e-02, 3.248e-01, 1.851e-01, -7.099e-02, 8.477e-02, 4.372e-02)); + r += mul(s3_8, M4(-2.045e-02, -7.855e-02, -4.495e-02, 6.078e-02, -6.315e-02, -7.862e-02, -1.406e-01, 3.674e-02, -1.628e-01, 1.351e-01, -6.527e-02, -6.756e-03, 6.466e-02, 1.532e-02, 4.055e-02, -3.032e-02)); + r += mul(s4_0, M4(-1.499e-01, -7.250e-02, -6.480e-02, 1.274e-01, 2.127e-01, -3.638e-02, -1.541e-01, 1.998e-02, -1.626e-01, -1.542e-02, -2.297e-01, -4.711e-02, 1.672e-01, 1.783e-01, 1.519e-01, -2.619e-02)); + r += mul(s4_1, M4(-1.092e-01, -8.656e-02, 1.802e-01, -7.827e-02, -4.769e-02, -3.521e-01, -6.076e-02, -1.028e-01, 9.007e-02, 7.495e-02, 1.750e-01, -1.573e-02, -9.365e-02, -1.703e-01, -2.072e-01, -3.748e-02)); + r += mul(s4_2, M4(4.518e-02, -2.296e-02, -1.432e-01, 5.951e-02, 2.120e-01, -1.424e-01, 1.259e-01, 1.291e-01, 1.397e-01, 2.877e-01, 2.697e-01, -2.689e-02, 7.480e-03, 1.533e-01, -1.073e-01, 6.312e-02)); + r += mul(s4_3, M4(-3.880e-02, -4.093e-02, 4.001e-02, -8.178e-02, -6.328e-02, -7.422e-02, 9.309e-02, 2.872e-02, -2.817e-01, 2.359e-01, -1.395e-01, -2.873e-01, -8.667e-02, 1.968e-01, 7.938e-02, -1.771e-02)); + r += mul(s4_4, M4(-2.421e-02, -8.792e-02, 4.204e-02, 3.885e-02, -8.507e-02, -1.308e-01, -1.262e-01, -2.356e-01, 1.499e-01, 1.452e-01, 1.380e-01, 2.543e-01, 1.627e-02, -1.195e-01, 5.032e-02, -1.295e-02)); + r += mul(s4_5, M4(1.467e-02, 1.872e-01, 5.851e-02, -1.954e-02, 1.338e-01, -5.445e-02, -9.792e-02, -1.148e-01, -9.106e-02, 7.280e-02, 1.391e-02, -1.308e-01, -3.100e-02, 9.612e-02, 5.221e-02, 1.605e-02)); + r += mul(s4_6, M4(5.990e-02, -4.208e-02, -1.734e-01, -1.367e-01, -7.889e-02, 1.409e-01, -5.239e-02, -5.982e-02, 1.043e-01, 3.526e-03, 2.075e-03, -2.397e-01, 8.369e-02, 3.376e-02, 7.339e-02, 2.281e-01)); + r += mul(s4_7, M4(2.764e-01, -1.796e-01, 1.455e-01, -3.286e-02, -4.900e-02, -1.909e-02, -2.249e-02, -9.996e-02, -3.512e-02, -1.206e-01, 1.847e-02, 2.303e-02, -6.943e-02, -1.329e-01, -7.892e-02, -7.028e-02)); + r += mul(s4_8, M4(4.555e-02, 1.136e-01, 1.246e-02, -1.455e-01, -4.663e-02, -2.871e-02, -2.046e-01, -1.446e-01, -2.253e-01, 2.763e-02, -1.004e-01, 2.980e-03, 7.329e-02, -1.165e-01, -2.569e-02, -1.452e-01)); + r += mul(s5_0, M4(1.021e-01, -4.993e-01, -3.943e-01, -3.816e-02, -1.130e-01, -9.294e-02, -1.374e-01, -2.294e-02, 1.072e-01, 4.437e-02, -4.967e-02, 2.527e-03, -5.801e-02, 5.197e-01, -6.761e-02, -7.898e-02)); + r += mul(s5_1, M4(1.401e-01, -1.985e-02, -2.018e-01, -2.551e-01, -3.057e-01, -8.481e-02, 7.933e-02, -2.035e-01, 4.128e-02, -2.439e-01, 1.204e-01, -5.914e-02, -1.325e-01, 1.267e-01, 6.798e-02, 1.577e-01)); + r += mul(s5_2, M4(-5.245e-02, -9.068e-02, 4.098e-03, -1.682e-03, -2.397e-01, 3.945e-02, -2.103e-02, 6.739e-02, 9.228e-02, -1.101e-01, 3.726e-01, 7.907e-02, -1.078e-01, -1.618e-01, -8.862e-02, -2.620e-02)); + r += mul(s5_3, M4(-4.351e-01, -1.867e-01, -1.876e-01, -1.895e-01, 7.828e-03, -1.009e-01, 8.182e-02, 2.871e-03, 1.487e-01, 5.502e-02, -2.857e-02, -1.281e-01, 8.090e-02, 2.686e-01, 8.667e-02, 5.965e-02)); + r += mul(s5_4, M4(-1.018e-01, -1.264e-01, -3.769e-02, 4.907e-02, -2.531e-01, -1.157e-02, -2.996e-04, -1.775e-01, 6.139e-02, 1.082e-01, 5.053e-02, 1.333e-01, -3.971e-02, 5.975e-02, 6.767e-02, -1.828e-01)); + r += mul(s5_5, M4(1.820e-01, 1.515e-01, 1.530e-02, 1.505e-01, -9.685e-02, 4.150e-02, 2.998e-02, -1.715e-01, -5.765e-02, -2.729e-02, -5.637e-03, 9.204e-02, -2.588e-02, -4.561e-01, -4.315e-02, -8.377e-02)); + r += mul(s5_6, M4(8.928e-02, 1.850e-01, -1.260e-01, 1.848e-01, -4.262e-02, -5.891e-02, -6.487e-02, 9.753e-02, 5.160e-02, -6.055e-02, 1.049e-01, 9.045e-02, -9.491e-02, 5.606e-02, -1.062e-01, 2.199e-01)); + r += mul(s5_7, M4(1.982e-02, 1.538e-01, -1.591e-01, 3.782e-03, -7.732e-02, 2.261e-01, -9.981e-02, 9.836e-02, 3.086e-02, -1.224e-01, -7.203e-02, -4.307e-02, 9.526e-02, 5.374e-02, -8.144e-02, 1.073e-01)); + r += mul(s5_8, M4(-3.075e-01, -2.543e-02, 1.095e-01, -9.644e-02, -5.159e-02, 8.254e-03, -9.783e-02, 7.402e-02, -2.176e-01, -1.525e-02, 1.419e-02, 5.681e-02, 7.628e-03, -1.650e-01, 1.085e-01, -7.338e-03)); + r += mul(s6_0, M4(1.741e-02, 2.125e-01, 1.168e-01, -4.260e-02, 1.296e-01, 1.149e-01, -1.442e-01, -8.121e-03, -2.016e-02, -1.870e-02, 5.396e-02, 1.021e-01, -1.165e-02, 1.188e-01, -9.040e-03, -3.638e-02)); + r += mul(s6_1, M4(2.115e-01, 3.941e-01, 2.957e-02, 1.120e-01, 7.739e-02, 3.555e-02, -3.015e-02, -9.409e-02, -1.270e-01, 2.272e-01, 7.447e-02, 9.663e-03, -9.259e-02, -1.570e-01, 1.401e-01, -2.905e-02)); + r += mul(s6_2, M4(5.055e-02, -2.221e-01, 9.541e-02, 3.872e-01, -1.639e-01, -2.329e-02, 4.069e-02, 1.590e-02, -8.454e-02, -2.204e-03, -6.812e-02, 1.247e-01, 2.795e-02, 8.716e-02, 2.249e-01, -1.203e-01)); + r += mul(s6_3, M4(9.096e-02, 2.607e-01, 1.479e-02, -8.888e-05, 1.222e-01, 8.601e-02, -5.109e-02, 7.726e-02, 1.441e-01, -2.092e-01, 1.506e-01, 1.928e-02, -6.446e-02, 2.402e-01, -2.574e-01, -2.931e-02)); + r += mul(s6_4, M4(-1.233e-01, 1.028e-01, -4.458e-02, 4.378e-01, -3.634e-02, 1.858e-01, 2.470e-02, -2.198e-01, -2.388e-01, 5.963e-02, 5.429e-01, -1.237e-01, -1.648e-01, 3.738e-02, -3.718e-01, 3.435e-02)); + r += mul(s6_5, M4(1.562e-01, -3.674e-01, 1.336e-01, -2.522e-01, -4.597e-02, 6.303e-03, 9.126e-02, -2.470e-02, -9.233e-02, -6.120e-02, 1.047e-01, 8.981e-02, 1.036e-01, 1.669e-01, 2.349e-02, -2.290e-02)); + r += mul(s6_6, M4(-6.684e-03, -2.623e-01, -1.988e-01, 7.140e-02, 3.641e-02, 1.881e-02, -5.311e-02, 1.847e-01, -5.423e-02, 1.317e-01, -8.327e-02, -6.475e-02, -2.640e-02, -1.547e-01, 2.943e-01, 1.121e-01)); + r += mul(s6_7, M4(2.161e-01, -2.097e-01, 8.820e-02, 2.329e-01, -9.084e-03, -6.403e-02, 8.263e-02, 1.153e-01, -1.475e-01, -2.645e-02, -1.344e-01, 1.451e-01, -1.776e-01, -2.007e-01, 2.800e-02, 7.088e-01)); + r += mul(s6_8, M4(1.772e-01, -2.968e-01, -8.142e-02, -2.700e-01, -3.186e-02, -3.387e-02, 7.155e-02, 8.385e-02, -8.074e-02, -6.685e-02, -1.783e-01, 2.027e-01, -5.418e-02, 7.905e-03, 1.838e-01, -1.703e-02)); + r += mul(s7_0, M4(-8.795e-03, 8.697e-02, -1.522e-02, -4.836e-02, 2.736e-01, -3.156e-02, 2.585e-02, -7.371e-02, -8.043e-02, -9.909e-02, 1.712e-01, 9.713e-03, 1.880e-01, 2.281e-02, -4.252e-02, 3.635e-02)); + r += mul(s7_1, M4(-2.456e-01, -3.123e-02, -8.438e-02, 5.096e-02, 2.406e-02, 5.820e-02, 1.871e-01, 9.246e-02, -4.854e-02, -1.220e-02, 8.671e-02, -8.788e-02, 9.197e-02, -1.051e-02, -1.603e-02, 7.826e-03)); + r += mul(s7_2, M4(-1.740e-01, -1.295e-01, -7.792e-02, 3.404e-02, -1.469e-01, -7.475e-02, 5.725e-02, -2.245e-01, -5.151e-02, -2.124e-02, -8.004e-02, 7.175e-02, 1.452e-02, 1.684e-01, -1.166e-01, -4.261e-02)); + r += mul(s7_3, M4(-2.162e-02, 6.368e-02, 4.331e-02, 3.686e-02, 4.560e-01, 3.422e-02, -7.137e-02, -1.088e-01, 6.296e-02, -1.548e-01, 2.900e-01, 2.713e-02, 2.923e-01, -1.117e-01, 9.811e-02, -5.212e-02)); + r += mul(s7_4, M4(-1.214e-01, -1.009e-01, -1.105e-01, -1.741e-01, -3.244e-01, 2.416e-02, -1.582e-01, -2.779e-01, 3.225e-02, -1.660e-01, 7.940e-02, 1.323e-01, 1.905e-01, -4.041e-02, 6.546e-03, -9.449e-02)); + r += mul(s7_5, M4(-8.208e-02, -3.476e-02, -9.438e-02, -1.004e-01, -2.276e-02, 4.244e-01, -2.006e-02, -1.780e-01, -6.147e-02, 3.855e-02, 2.678e-02, -7.125e-02, 1.039e-01, -2.048e-02, -1.289e-01, -2.667e-02)); + r += mul(s7_6, M4(3.593e-02, -2.194e-02, -7.869e-02, -1.356e-01, -4.294e-02, -6.255e-02, 1.837e-01, 3.174e-01, -4.049e-02, 1.013e-02, 9.296e-02, 1.090e-01, 7.926e-02, -7.720e-02, -1.803e-01, 5.508e-02)); + r += mul(s7_7, M4(-2.289e-02, -5.673e-02, 2.362e-02, 2.427e-01, 7.482e-03, -3.263e-01, 3.090e-01, 3.126e-01, -5.159e-02, 1.584e-01, -1.165e-01, 3.172e-01, 2.170e-01, -7.058e-02, 8.322e-02, -4.230e-02)); + r += mul(s7_8, M4(-4.434e-02, 8.279e-02, -1.851e-01, 7.341e-02, -5.335e-02, 1.912e-01, 3.554e-01, 4.142e-02, 4.895e-02, 3.337e-03, 1.815e-01, -5.542e-02, -2.550e-02, -7.432e-02, -2.534e-02, -3.253e-02)); + r += V4(-5.796e-02, -9.994e-02, -4.215e-02, -3.212e-02); + return r; +} + +V4 f3(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-7.087e-02, 6.239e-02, 5.798e-02, 8.463e-02, 2.003e-01, 1.054e-01, -5.041e-02, -9.348e-02, -1.609e-01, 7.109e-02, 1.378e-01, -1.261e-01, -1.773e-01, -1.247e-01, -1.533e-01, -3.260e-02)); + r += mul(s0_1, M4(-5.111e-02, -8.474e-02, -1.873e-01, -1.267e-01, -8.925e-03, 5.333e-02, -2.662e-01, -1.796e-01, -1.243e-02, 2.119e-02, -1.518e-02, -6.461e-02, 5.907e-02, 3.671e-04, -4.520e-02, 4.513e-02)); + r += mul(s0_2, M4(6.582e-03, -1.185e-02, -4.998e-02, -3.709e-02, -2.846e-02, 4.560e-02, -1.383e-02, -1.422e-01, -5.102e-02, -7.843e-02, -4.691e-02, -1.638e-01, 1.126e-01, -1.427e-01, 7.998e-02, 6.866e-02)); + r += mul(s0_3, M4(1.005e-01, 9.193e-02, 1.235e-02, -2.497e-02, 8.452e-02, 7.020e-02, 1.421e-01, 8.788e-02, 8.692e-02, -8.267e-02, -6.585e-05, 1.645e-01, -4.443e-02, -9.324e-02, -2.148e-01, 1.671e-01)); + r += mul(s0_4, M4(4.984e-02, 1.531e-01, -8.617e-02, -2.485e-02, -1.843e-01, 7.348e-02, 6.349e-02, 2.055e-01, 2.145e-02, -5.108e-02, -4.078e-02, 9.661e-02, 8.807e-02, -5.728e-02, 6.109e-03, 2.942e-01)); + r += mul(s0_5, M4(-9.202e-02, -9.519e-02, 1.117e-01, -4.526e-02, -2.775e-01, 7.643e-02, 1.403e-02, 2.340e-02, -1.074e-02, -1.436e-01, 7.396e-03, 1.238e-03, 1.729e-01, 2.339e-02, 1.535e-01, -8.622e-02)); + r += mul(s0_6, M4(1.005e-02, -3.189e-02, 9.263e-02, 3.803e-02, 1.789e-01, -1.022e-01, 6.633e-02, -7.069e-03, -5.458e-02, 3.946e-02, -1.137e-01, -7.933e-02, -8.455e-02, 9.216e-02, 5.908e-03, -6.718e-02)); + r += mul(s0_7, M4(1.734e-01, -4.896e-02, 1.712e-01, 9.361e-03, 3.362e-02, 9.108e-02, 4.730e-01, 2.667e-01, -5.602e-02, -1.280e-01, 1.817e-01, -7.983e-02, 5.922e-03, -1.085e-02, -7.856e-02, 4.042e-02)); + r += mul(s0_8, M4(4.479e-02, -5.251e-02, 3.659e-03, -6.087e-02, -2.521e-02, -9.217e-02, 1.009e-01, 5.147e-02, 7.763e-02, 9.779e-02, -1.913e-02, -1.032e-02, -5.252e-02, -2.632e-02, 6.120e-02, -4.011e-02)); + r += mul(s1_0, M4(1.749e-01, 4.373e-02, 1.850e-01, -1.322e-03, 7.954e-02, 1.727e-02, -1.852e-01, 4.827e-02, 1.903e-01, -1.351e-01, 9.082e-02, -7.283e-02, -1.823e-01, 5.595e-02, -2.808e-02, -9.443e-03)); + r += mul(s1_1, M4(-1.981e-02, 8.999e-02, -2.314e-01, -1.194e-01, 1.176e-01, 2.058e-02, -1.970e-02, -6.448e-02, -1.178e-02, 1.526e-01, 9.951e-02, 2.790e-02, 3.800e-02, 2.846e-01, 1.088e-01, -9.929e-02)); + r += mul(s1_2, M4(-2.137e-03, -9.093e-02, -8.969e-02, -7.525e-02, 2.343e-01, -8.973e-02, -9.970e-02, 7.148e-02, 1.542e-01, 4.977e-02, -1.556e-01, 6.833e-02, -2.306e-02, 9.185e-02, -1.417e-01, 3.659e-02)); + r += mul(s1_3, M4(-9.093e-04, 8.085e-02, 1.412e-01, -2.497e-01, -1.439e-01, 9.891e-02, 2.928e-02, 1.516e-01, 4.379e-03, -4.236e-02, 2.203e-02, -8.157e-02, 7.379e-02, -1.329e-01, 2.084e-01, -7.908e-02)); + r += mul(s1_4, M4(-9.692e-02, 2.172e-01, -5.032e-03, -4.059e-01, -1.811e-01, -1.188e-01, -6.957e-02, 2.046e-01, 2.704e-01, -2.443e-01, 2.411e-01, -4.141e-02, -1.404e-01, -1.501e-01, 3.869e-02, 1.738e-01)); + r += mul(s1_5, M4(1.970e-01, -4.060e-01, -2.504e-01, 2.264e-01, 2.595e-02, -1.535e-01, 1.830e-01, 6.851e-02, -6.238e-02, -3.365e-01, -2.264e-01, -7.431e-03, -4.215e-02, 1.390e-01, -4.475e-01, -1.452e-01)); + r += mul(s1_6, M4(-2.510e-01, 1.528e-02, 4.968e-02, -2.842e-01, -3.769e-02, 9.383e-02, -8.688e-02, -1.122e-01, -1.430e-01, 5.863e-02, -5.752e-02, 1.801e-01, 1.882e-01, 6.842e-02, 2.072e-01, -2.585e-02)); + r += mul(s1_7, M4(-3.887e-02, -5.653e-02, 4.207e-02, -8.963e-02, -5.419e-02, 2.145e-02, 1.625e-01, 1.640e-02, -4.333e-03, 1.425e-02, 1.677e-01, 3.464e-01, 1.892e-01, 1.811e-02, 2.237e-02, -1.581e-02)); + r += mul(s1_8, M4(1.410e-01, -2.081e-01, -4.614e-02, 6.339e-02, 5.790e-02, 1.528e-02, -1.789e-01, -3.247e-02, 2.894e-01, -1.078e-01, 6.089e-02, 6.678e-02, 8.685e-02, 1.617e-02, -9.748e-02, -1.817e-02)); + r += mul(s2_0, M4(-2.281e-01, 1.145e-01, 1.690e-01, 3.860e-03, -2.416e-02, 3.134e-02, 3.746e-02, 9.753e-02, -1.249e-02, -2.384e-02, -6.270e-02, -1.023e-01, 9.561e-02, 1.324e-01, 2.370e-02, -1.242e-01)); + r += mul(s2_1, M4(2.798e-02, 2.944e-02, -1.391e-01, -2.065e-02, 1.531e-02, 8.454e-03, 5.738e-02, -8.349e-02, 1.830e-02, -4.295e-02, -1.300e-01, 3.290e-02, -7.138e-02, -6.105e-02, -1.993e-01, 1.054e-01)); + r += mul(s2_2, M4(1.498e-01, -2.510e-02, 6.616e-02, -8.944e-02, -3.445e-02, 1.348e-01, -5.942e-02, 9.708e-02, 1.031e-01, 2.463e-02, 5.985e-03, -7.200e-02, 3.105e-01, -1.207e-01, 3.550e-02, -1.467e-01)); + r += mul(s2_3, M4(2.385e-02, 1.033e-01, -4.184e-02, 1.449e-01, -1.506e-01, -1.277e-01, 2.225e-01, -1.859e-01, -1.908e-01, -1.564e-01, 7.764e-02, -1.052e-01, -1.490e-02, 1.196e-01, 3.107e-01, -2.853e-02)); + r += mul(s2_4, M4(-8.772e-02, -4.082e-02, -2.519e-01, 2.430e-01, 3.050e-01, -1.207e-01, 2.054e-02, -1.949e-01, 8.330e-02, 1.593e-01, -1.335e-01, -9.296e-02, -6.047e-01, 9.570e-02, -1.153e-01, 3.585e-01)); + r += mul(s2_5, M4(-1.555e-01, -9.061e-02, -1.124e-01, 1.400e-01, 5.122e-03, -4.839e-02, -4.809e-02, 5.546e-02, 1.789e-01, 4.024e-02, -8.952e-02, 4.942e-02, -1.059e-01, -8.778e-02, -2.437e-01, 5.702e-02)); + r += mul(s2_6, M4(9.926e-02, -9.385e-03, 1.125e-01, 9.954e-03, -7.612e-02, 8.703e-02, 5.513e-02, 2.757e-03, -7.221e-02, 4.016e-02, -5.296e-03, -1.003e-01, 5.334e-01, -3.056e-02, -3.064e-01, 7.117e-03)); + r += mul(s2_7, M4(-2.532e-01, -4.781e-02, 9.780e-02, -8.244e-02, 2.035e-02, 4.577e-03, -1.115e-01, -6.034e-02, -2.605e-01, -8.794e-02, 3.998e-01, 5.975e-02, -1.221e-01, -4.130e-03, -1.800e-01, -1.644e-01)); + r += mul(s2_8, M4(-5.837e-02, -1.843e-01, -2.463e-02, -2.233e-01, -1.517e-01, -5.376e-02, -1.700e-01, 5.567e-02, 6.757e-02, -1.117e-01, 4.710e-04, 1.177e-01, -1.470e-01, -1.264e-01, -3.143e-01, -1.695e-01)); + r += mul(s3_0, M4(1.737e-02, 1.084e-01, 1.796e-01, 3.595e-02, -1.737e-01, 8.785e-04, -2.436e-01, -4.031e-02, -1.042e-01, 4.849e-02, 1.806e-02, -9.414e-02, -2.708e-01, 9.794e-02, -1.460e-01, 3.161e-02)); + r += mul(s3_1, M4(1.500e-01, -1.101e-01, -2.117e-01, 1.373e-01, 2.621e-01, -8.611e-02, -1.486e-02, 4.369e-02, -3.867e-02, -6.837e-02, -4.205e-01, 2.570e-03, 4.208e-02, 1.402e-01, 2.627e-01, 7.434e-02)); + r += mul(s3_2, M4(5.101e-02, 4.293e-02, 1.221e-01, 2.186e-02, -1.894e-02, -1.332e-01, -2.449e-01, 3.077e-02, 1.728e-01, 8.873e-02, -1.142e-01, 3.216e-02, 9.510e-02, -2.458e-02, 9.526e-02, -4.923e-02)); + r += mul(s3_3, M4(-7.877e-02, -2.980e-02, 1.517e-01, -4.755e-02, 3.299e-02, -1.722e-02, 6.496e-04, 2.745e-01, -3.029e-01, 2.031e-02, 4.097e-02, 4.456e-02, 1.630e-01, -6.488e-02, 2.990e-01, -5.979e-02)); + r += mul(s3_4, M4(2.165e-01, -1.397e-01, -8.698e-02, 6.277e-02, -1.256e-01, 2.055e-01, 1.409e-01, 2.895e-01, 5.554e-01, 2.140e-01, -1.626e-01, 8.477e-02, -4.270e-01, 1.513e-01, -1.548e-01, -1.152e-01)); + r += mul(s3_5, M4(-6.026e-02, -1.783e-02, 1.314e-01, -6.727e-02, -2.205e-01, -1.427e-01, 2.454e-01, 3.660e-02, -8.011e-02, -6.024e-02, 2.695e-01, 2.440e-01, 2.838e-02, -5.347e-02, -4.060e-02, 8.471e-03)); + r += mul(s3_6, M4(-2.508e-01, 2.804e-01, 2.255e-02, -2.307e-01, 1.237e-02, 2.406e-02, 2.628e-01, 8.921e-02, -2.000e-01, 7.200e-02, 3.133e-01, -4.548e-01, 8.203e-02, -1.264e-01, -3.128e-03, 1.769e-01)); + r += mul(s3_7, M4(7.194e-02, 2.412e-02, -7.567e-02, 8.308e-02, -2.699e-01, 9.371e-02, 1.981e-01, 9.185e-02, 4.334e-02, -4.782e-02, -3.260e-01, -1.932e-01, 2.238e-01, 1.088e-01, -1.397e-02, 9.171e-02)); + r += mul(s3_8, M4(-5.989e-02, 2.174e-02, 1.074e-01, 7.843e-02, 2.823e-01, 2.629e-02, -2.285e-02, 1.446e-01, 1.295e-02, 1.623e-01, -4.525e-02, 1.443e-01, -1.739e-01, 1.968e-02, 1.531e-01, -1.264e-03)); + r += mul(s4_0, M4(3.647e-02, -1.538e-01, -2.943e-02, 1.765e-02, 3.218e-03, 8.694e-02, -1.315e-01, -6.913e-03, 3.649e-01, 1.162e-01, -1.007e-02, -7.707e-02, 5.933e-02, -7.162e-02, -1.167e-01, -4.503e-02)); + r += mul(s4_1, M4(-2.816e-02, -1.272e-03, 1.170e-01, -2.845e-02, 3.693e-01, -1.619e-01, -6.193e-02, -1.078e-01, -2.879e-01, -8.741e-02, 1.235e-02, 3.369e-01, -2.247e-01, 1.600e-01, 2.450e-01, 1.223e-01)); + r += mul(s4_2, M4(1.452e-01, -7.362e-02, -1.782e-01, 8.628e-03, -1.430e-01, 1.576e-01, -1.538e-01, 9.937e-02, -1.037e-03, 8.466e-02, -7.769e-03, 1.498e-01, -7.806e-02, -1.294e-01, -2.572e-02, 1.327e-01)); + r += mul(s4_3, M4(-5.415e-02, -1.741e-01, 5.747e-02, -2.019e-02, 1.861e-01, -6.486e-02, 1.126e-01, 2.221e-01, 1.252e-01, -3.269e-02, -1.470e-01, -1.061e-01, -3.489e-02, -4.614e-02, -4.317e-02, 2.373e-02)); + r += mul(s4_4, M4(-1.777e-01, 2.710e-02, -3.992e-02, -1.750e-01, -1.067e-01, -1.050e-01, -3.173e-01, 1.977e-01, 1.913e-01, 1.056e-01, 6.696e-02, -3.033e-01, 9.398e-02, -6.405e-03, -9.652e-03, 3.989e-02)); + r += mul(s4_5, M4(3.614e-02, -2.415e-02, -7.483e-02, 1.032e-01, -2.156e-01, 3.760e-01, -2.740e-01, -9.042e-02, -2.041e-01, 1.055e-01, 2.293e-01, -8.301e-02, -1.113e-01, 8.617e-03, -2.125e-02, -9.272e-02)); + r += mul(s4_6, M4(9.263e-02, -6.307e-02, 5.636e-02, -2.100e-02, -1.294e-01, -7.647e-03, -4.177e-02, -3.614e-02, -5.024e-01, -9.556e-02, -1.460e-01, -1.035e-01, -5.274e-02, -3.602e-02, 7.783e-02, 7.514e-02)); + r += mul(s4_7, M4(1.637e-01, 1.444e-01, 4.168e-02, -1.246e-01, 8.515e-02, -1.587e-01, -2.420e-01, -2.454e-01, 1.013e-01, 2.599e-01, 3.772e-01, 6.808e-02, -6.795e-02, 1.837e-01, 6.424e-02, -2.261e-02)); + r += mul(s4_8, M4(-9.780e-02, -2.525e-02, 1.251e-01, 1.286e-01, 2.938e-01, -4.910e-02, -6.868e-02, -4.813e-02, 1.199e-01, 1.295e-01, -3.079e-01, 8.940e-02, -3.757e-03, -1.445e-01, 9.543e-02, 1.553e-01)); + r += mul(s5_0, M4(1.186e-01, -2.205e-02, -3.427e-01, -3.424e-01, 1.843e-02, 6.114e-02, -1.087e-01, -7.415e-03, 3.993e-02, 2.651e-02, 1.467e-01, 6.105e-04, -1.080e-01, 1.258e-01, -1.729e-01, -7.216e-03)); + r += mul(s5_1, M4(-2.679e-01, 5.804e-02, -1.816e-01, 2.207e-01, -2.009e-01, -1.762e-02, 3.188e-02, -1.822e-01, 5.268e-02, -6.641e-02, 2.279e-01, 7.508e-02, 3.310e-02, 8.985e-02, -1.834e-01, -3.886e-02)); + r += mul(s5_2, M4(1.843e-02, 1.547e-01, -3.799e-01, 5.699e-02, 3.773e-01, 1.677e-01, -9.834e-02, 7.512e-02, -2.524e-01, 1.043e-01, -3.282e-02, 4.121e-02, 1.174e-01, 3.207e-03, -1.808e-01, -3.663e-02)); + r += mul(s5_3, M4(-5.561e-02, 4.176e-01, -2.231e-01, 1.208e-01, -2.510e-01, -8.773e-02, 9.459e-02, -5.313e-02, 1.463e-01, -1.630e-01, -4.437e-02, -8.088e-02, -4.934e-01, -6.573e-02, 8.557e-02, -4.096e-02)); + r += mul(s5_4, M4(8.186e-02, -1.844e-01, 1.705e-01, 7.483e-02, -2.746e-01, -6.372e-02, 6.459e-02, -1.048e-01, 2.139e-01, -1.889e-02, -2.934e-01, -2.557e-01, 2.013e-01, -1.773e-01, 1.988e-01, 1.563e-01)); + r += mul(s5_5, M4(-4.151e-03, 3.976e-02, 8.492e-02, -6.545e-02, 2.319e-01, 1.423e-01, -1.815e-02, 3.074e-02, -5.575e-02, 1.540e-02, -6.605e-02, -1.032e-03, 1.375e-01, 4.536e-02, 1.015e-01, -1.465e-01)); + r += mul(s5_6, M4(3.149e-02, -1.012e-01, -5.762e-01, 3.408e-01, 4.326e-02, 5.614e-03, 1.175e-01, 1.259e-02, 4.803e-02, -1.723e-01, -1.382e-01, 1.344e-01, 4.600e-01, -1.617e-01, -2.588e-01, 1.638e-01)); + r += mul(s5_7, M4(2.048e-01, 4.332e-02, 1.848e-01, -3.604e-01, -2.261e-01, -1.508e-01, -6.950e-03, 9.758e-02, -6.281e-02, -8.408e-02, 4.513e-02, -9.105e-02, -3.698e-01, 4.274e-02, -1.901e-01, -5.405e-03)); + r += mul(s5_8, M4(-1.685e-01, 4.163e-02, 3.980e-02, -1.844e-01, -4.091e-02, 7.826e-02, -1.567e-02, 1.459e-01, -2.282e-02, 7.285e-02, -3.953e-01, 1.006e-01, 7.857e-03, -3.035e-02, -1.264e-01, -4.881e-02)); + r += mul(s6_0, M4(4.902e-02, -1.445e-01, 2.465e-01, 3.400e-02, 2.473e-02, -1.400e-01, 1.087e-01, -7.253e-02, -1.108e-01, 1.126e-01, -3.531e-02, 1.471e-02, 5.746e-02, 2.257e-02, 1.677e-01, -1.217e-01)); + r += mul(s6_1, M4(-1.741e-01, 2.362e-01, 1.354e-01, 1.540e-01, -7.186e-02, -1.081e-01, 3.640e-02, -7.877e-02, -3.734e-02, 2.443e-02, -3.647e-01, -1.431e-01, -1.476e-01, 5.666e-02, 2.071e-01, 1.688e-01)); + r += mul(s6_2, M4(4.008e-01, 7.678e-02, 3.198e-01, -4.019e-02, 7.331e-02, 1.380e-01, -4.423e-02, -6.537e-02, 9.380e-02, -1.094e-02, 6.226e-02, 1.114e-01, -1.281e-01, -6.551e-02, 1.202e-01, -1.214e-01)); + r += mul(s6_3, M4(-2.556e-02, 1.131e-02, -2.070e-01, 1.448e-01, -2.169e-02, -6.685e-02, 1.419e-01, 2.091e-03, -1.227e-01, 3.769e-02, 5.021e-02, 5.427e-03, 1.610e-01, -9.560e-02, 5.762e-02, 3.525e-01)); + r += mul(s6_4, M4(4.889e-02, 1.146e-01, 4.403e-01, 1.301e-01, -7.739e-02, 2.461e-02, 3.249e-03, -4.671e-02, 7.585e-02, -2.600e-01, 1.391e-01, -1.733e-01, -2.416e-01, -2.492e-01, -3.474e-01, 3.281e-01)); + r += mul(s6_5, M4(1.752e-01, 1.489e-01, 4.170e-01, 2.319e-02, -6.171e-02, 2.129e-01, -5.746e-02, -2.849e-02, 1.139e-01, 1.991e-01, -2.380e-01, 1.588e-01, -1.587e-01, -1.974e-01, 1.952e-01, 1.432e-01)); + r += mul(s6_6, M4(-1.657e-02, 8.776e-02, 2.591e-02, -2.024e-01, 1.049e-01, -1.078e-01, 3.503e-02, -4.971e-02, -1.480e-01, -9.008e-02, -2.529e-01, 2.549e-01, 5.592e-01, -5.244e-02, 8.626e-02, 3.597e-02)); + r += mul(s6_7, M4(-3.532e-02, 8.905e-02, 1.791e-01, -9.458e-02, 6.780e-02, -5.794e-02, -1.292e-01, 1.035e-02, -2.125e-01, 1.398e-01, 1.009e-01, 2.977e-02, 2.564e-01, -2.495e-01, -6.772e-01, -4.445e-01)); + r += mul(s6_8, M4(-9.304e-02, 2.128e-01, 3.858e-01, 2.376e-02, 1.338e-01, 4.078e-02, -4.558e-02, 2.654e-02, 7.575e-02, -1.313e-01, 3.156e-02, -5.099e-02, -1.872e-01, 6.766e-02, -8.702e-02, -1.713e-01)); + r += mul(s7_0, M4(-5.595e-02, 6.183e-02, 2.464e-01, -1.414e-01, 7.124e-02, -6.475e-02, 2.529e-01, -1.904e-01, 3.912e-02, -9.186e-02, -1.179e-01, -1.466e-01, 9.174e-03, 1.061e-02, 5.436e-02, 9.571e-02)); + r += mul(s7_1, M4(-2.018e-01, -8.089e-03, -7.846e-02, -9.330e-02, -1.790e-02, 3.018e-02, 1.472e-01, -1.160e-01, -1.650e-01, -8.923e-02, -1.474e-01, -7.902e-02, 4.715e-02, 9.154e-02, 3.535e-02, 2.654e-02)); + r += mul(s7_2, M4(-1.588e-01, -8.289e-02, 2.280e-03, -7.578e-02, -1.446e-01, 3.556e-01, -1.940e-01, -2.261e-01, -4.402e-02, 7.329e-03, 2.272e-02, -4.111e-02, 4.818e-02, -6.474e-02, -8.609e-02, 3.821e-03)); + r += mul(s7_3, M4(1.366e-01, 2.409e-03, -5.919e-02, 5.778e-02, -2.203e-01, -1.450e-01, 5.869e-02, -1.753e-01, 9.278e-02, -3.186e-01, 1.456e-01, 2.001e-02, 1.284e-03, -3.633e-02, 6.268e-02, 3.140e-02)); + r += mul(s7_4, M4(-2.500e-01, 4.451e-02, -2.156e-01, -1.797e-01, -6.846e-02, -4.157e-01, 4.179e-01, -5.199e-02, -8.430e-02, -2.177e-01, 1.486e-01, 2.498e-01, -4.685e-02, -8.815e-02, 1.002e-01, 1.469e-01)); + r += mul(s7_5, M4(5.817e-02, 1.482e-01, -1.004e-01, 7.580e-02, 2.545e-01, 3.320e-01, -3.625e-01, -1.010e-01, -1.058e-01, -1.438e-02, 4.576e-02, 3.802e-02, 3.077e-01, 1.275e-01, -3.467e-01, 1.315e-01)); + r += mul(s7_6, M4(7.622e-02, -9.737e-03, -5.742e-02, -8.808e-02, 2.788e-01, -8.131e-02, 2.101e-02, 2.700e-02, 2.274e-01, -4.161e-02, 2.973e-01, -2.978e-02, -1.343e-01, 5.086e-04, 2.287e-02, 5.469e-02)); + r += mul(s7_7, M4(8.660e-02, -1.785e-01, -1.782e-01, 1.151e-01, -9.595e-02, -1.576e-01, -5.201e-02, 3.305e-01, -7.192e-02, 2.183e-01, 1.806e-02, -1.954e-01, -1.990e-01, 3.558e-01, 1.260e-01, 2.973e-01)); + r += mul(s7_8, M4(-1.830e-01, -1.268e-01, 2.358e-02, -1.262e-02, -1.297e-02, 2.289e-01, -4.859e-02, 1.057e-01, 5.627e-02, -1.755e-02, 8.560e-02, -1.372e-01, 1.458e-01, 2.299e-02, -2.603e-01, 4.789e-02)); + r += V4(-2.183e-02, 2.789e-02, -4.360e-02, 1.810e-03); + return r; +} + +void Pass3(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = Rmp8x8(tid.x) + blockStart; + uint2 size = GetInputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = (gxy + 0.5) * pt; + + V4 s0_0 = l0(-1.0, -1.0); + V4 s0_1 = l0(0.0, -1.0); + V4 s0_2 = l0(1.0, -1.0); + V4 s0_3 = l0(-1.0, 0.0); + V4 s0_4 = l0(0.0, 0.0); + V4 s0_5 = l0(1.0, 0.0); + V4 s0_6 = l0(-1.0, 1.0); + V4 s0_7 = l0(0.0, 1.0); + V4 s0_8 = l0(1.0, 1.0); + V4 s1_0 = -max(-s0_0, 0.0); + V4 s1_1 = -max(-s0_1, 0.0); + V4 s1_2 = -max(-s0_2, 0.0); + V4 s1_3 = -max(-s0_3, 0.0); + V4 s1_4 = -max(-s0_4, 0.0); + V4 s1_5 = -max(-s0_5, 0.0); + V4 s1_6 = -max(-s0_6, 0.0); + V4 s1_7 = -max(-s0_7, 0.0); + V4 s1_8 = -max(-s0_8, 0.0); + s0_0 = max(s0_0, 0.0); + s0_1 = max(s0_1, 0.0); + s0_2 = max(s0_2, 0.0); + s0_3 = max(s0_3, 0.0); + s0_4 = max(s0_4, 0.0); + s0_5 = max(s0_5, 0.0); + s0_6 = max(s0_6, 0.0); + s0_7 = max(s0_7, 0.0); + s0_8 = max(s0_8, 0.0); + + V4 s2_0 = l1(-1.0, -1.0); + V4 s2_1 = l1(0.0, -1.0); + V4 s2_2 = l1(1.0, -1.0); + V4 s2_3 = l1(-1.0, 0.0); + V4 s2_4 = l1(0.0, 0.0); + V4 s2_5 = l1(1.0, 0.0); + V4 s2_6 = l1(-1.0, 1.0); + V4 s2_7 = l1(0.0, 1.0); + V4 s2_8 = l1(1.0, 1.0); + V4 s3_0 = -max(-s2_0, 0.0); + V4 s3_1 = -max(-s2_1, 0.0); + V4 s3_2 = -max(-s2_2, 0.0); + V4 s3_3 = -max(-s2_3, 0.0); + V4 s3_4 = -max(-s2_4, 0.0); + V4 s3_5 = -max(-s2_5, 0.0); + V4 s3_6 = -max(-s2_6, 0.0); + V4 s3_7 = -max(-s2_7, 0.0); + V4 s3_8 = -max(-s2_8, 0.0); + s2_0 = max(s2_0, 0.0); + s2_1 = max(s2_1, 0.0); + s2_2 = max(s2_2, 0.0); + s2_3 = max(s2_3, 0.0); + s2_4 = max(s2_4, 0.0); + s2_5 = max(s2_5, 0.0); + s2_6 = max(s2_6, 0.0); + s2_7 = max(s2_7, 0.0); + s2_8 = max(s2_8, 0.0); + + V4 s4_0 = l2(-1.0, -1.0); + V4 s4_1 = l2(0.0, -1.0); + V4 s4_2 = l2(1.0, -1.0); + V4 s4_3 = l2(-1.0, 0.0); + V4 s4_4 = l2(0.0, 0.0); + V4 s4_5 = l2(1.0, 0.0); + V4 s4_6 = l2(-1.0, 1.0); + V4 s4_7 = l2(0.0, 1.0); + V4 s4_8 = l2(1.0, 1.0); + V4 s5_0 = -max(-s4_0, 0.0); + V4 s5_1 = -max(-s4_1, 0.0); + V4 s5_2 = -max(-s4_2, 0.0); + V4 s5_3 = -max(-s4_3, 0.0); + V4 s5_4 = -max(-s4_4, 0.0); + V4 s5_5 = -max(-s4_5, 0.0); + V4 s5_6 = -max(-s4_6, 0.0); + V4 s5_7 = -max(-s4_7, 0.0); + V4 s5_8 = -max(-s4_8, 0.0); + s4_0 = max(s4_0, 0.0); + s4_1 = max(s4_1, 0.0); + s4_2 = max(s4_2, 0.0); + s4_3 = max(s4_3, 0.0); + s4_4 = max(s4_4, 0.0); + s4_5 = max(s4_5, 0.0); + s4_6 = max(s4_6, 0.0); + s4_7 = max(s4_7, 0.0); + s4_8 = max(s4_8, 0.0); + + V4 s6_0 = l3(-1.0, -1.0); + V4 s6_1 = l3(0.0, -1.0); + V4 s6_2 = l3(1.0, -1.0); + V4 s6_3 = l3(-1.0, 0.0); + V4 s6_4 = l3(0.0, 0.0); + V4 s6_5 = l3(1.0, 0.0); + V4 s6_6 = l3(-1.0, 1.0); + V4 s6_7 = l3(0.0, 1.0); + V4 s6_8 = l3(1.0, 1.0); + V4 s7_0 = -max(-s6_0, 0.0); + V4 s7_1 = -max(-s6_1, 0.0); + V4 s7_2 = -max(-s6_2, 0.0); + V4 s7_3 = -max(-s6_3, 0.0); + V4 s7_4 = -max(-s6_4, 0.0); + V4 s7_5 = -max(-s6_5, 0.0); + V4 s7_6 = -max(-s6_6, 0.0); + V4 s7_7 = -max(-s6_7, 0.0); + V4 s7_8 = -max(-s6_8, 0.0); + s6_0 = max(s6_0, 0.0); + s6_1 = max(s6_1, 0.0); + s6_2 = max(s6_2, 0.0); + s6_3 = max(s6_3, 0.0); + s6_4 = max(s6_4, 0.0); + s6_5 = max(s6_5, 0.0); + s6_6 = max(s6_6, 0.0); + s6_7 = max(s6_7, 0.0); + s6_8 = max(s6_8, 0.0); + + t0[gxy] = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t1[gxy] = f1(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t2[gxy] = f2(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t3[gxy] = f3(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); +} + +//!PASS 4 +//!DESC conv3 +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 +//!IN t0, t1, t2, t3 +//!OUT t4, t5, t6, t7 + +#define l0(x, y) V4(O(t0, float2(x, y))) +#define l1(x, y) V4(O(t1, float2(x, y))) +#define l2(x, y) V4(O(t2, float2(x, y))) +#define l3(x, y) V4(O(t3, float2(x, y))) + +V4 f0(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(5.898e-02, 1.023e-01, 5.179e-02, 3.510e-02, -4.142e-01, -5.004e-01, -2.296e-01, 1.074e-02, 6.569e-02, -1.632e-02, -4.021e-02, 2.674e-02, -1.201e-01, 2.210e-03, 1.166e-01, -2.971e-02)); + r += mul(s0_1, M4(-1.003e-01, 1.235e-01, 6.209e-02, -1.355e-01, -2.316e-01, -1.078e-01, 2.680e-01, -4.341e-01, -3.042e-02, 1.843e-01, 1.914e-02, -3.570e-02, -5.369e-02, -1.635e-02, 6.805e-02, 3.052e-02)); + r += mul(s0_2, M4(-1.906e-02, 6.295e-02, 5.892e-02, -1.250e-01, 2.057e-01, 1.112e-01, 2.352e-01, -2.113e-01, 1.208e-01, -6.867e-03, 4.805e-02, 7.473e-02, -6.804e-03, -1.886e-02, -1.671e-02, 2.571e-02)); + r += mul(s0_3, M4(-1.429e-01, 1.016e-01, 1.189e-01, -1.123e-01, -5.401e-01, -1.508e-01, 1.473e-01, 2.299e-01, -2.651e-01, -2.545e-01, -9.793e-02, 1.652e-01, -1.913e-01, 2.026e-01, 3.793e-02, -1.470e-01)); + r += mul(s0_4, M4(8.107e-02, 1.051e-01, 2.518e-01, 8.745e-02, 6.514e-01, -3.956e-01, 1.570e-01, -4.313e-01, 1.011e-01, -2.761e-01, 1.706e-01, -7.386e-02, 8.301e-02, 1.543e-01, -7.868e-03, -2.640e-01)); + r += mul(s0_5, M4(4.034e-02, 1.852e-01, -8.966e-02, -7.864e-02, 5.985e-02, -3.990e-01, 4.423e-01, 3.717e-01, 2.115e-01, 7.712e-02, 1.040e-01, 7.704e-02, 5.719e-02, 3.220e-02, -4.211e-02, -3.406e-02)); + r += mul(s0_6, M4(-5.175e-02, -7.418e-02, 5.758e-03, 6.788e-02, -3.265e-01, -2.676e-01, -1.584e-02, 2.578e-01, -2.691e-02, -3.379e-02, -1.588e-02, -3.627e-03, -1.053e-01, -7.474e-02, 9.695e-02, 4.017e-02)); + r += mul(s0_7, M4(2.569e-02, -1.294e-01, -2.184e-01, -1.896e-01, 1.249e-01, -3.481e-01, 3.441e-01, -2.525e-01, -1.948e-02, 4.415e-02, -1.896e-01, -1.199e-01, -3.296e-02, 5.648e-04, 7.137e-02, -6.672e-02)); + r += mul(s0_8, M4(-1.059e-01, -1.555e-01, -4.792e-03, -2.355e-02, 8.325e-02, -1.706e-01, 2.737e-02, -3.699e-02, 5.793e-03, -3.858e-02, 7.466e-02, -2.144e-02, -1.472e-01, -8.354e-02, 9.293e-04, 7.899e-02)); + r += mul(s1_0, M4(1.214e-01, -3.888e-02, -7.692e-02, 7.518e-03, -1.114e-01, -6.412e-02, 3.779e-02, -3.651e-02, 6.508e-02, 4.873e-02, -8.752e-02, -2.748e-04, 1.274e-01, 2.137e-02, 3.784e-02, 1.540e-02)); + r += mul(s1_1, M4(9.708e-02, 5.635e-02, -8.596e-02, 9.531e-02, -2.201e-02, -6.158e-02, -9.603e-02, 4.481e-02, 1.933e-01, 5.793e-02, -8.643e-02, -1.559e-01, 1.082e-01, 9.472e-02, 1.581e-01, 2.260e-01)); + r += mul(s1_2, M4(-4.898e-02, -5.911e-03, 1.488e-02, 5.290e-02, 8.232e-02, -6.016e-03, 2.088e-02, -2.137e-03, -6.928e-02, 7.237e-02, 1.024e-01, 4.490e-02, 2.106e-01, 3.186e-02, 1.385e-01, 2.273e-01)); + r += mul(s1_3, M4(-2.274e-03, 1.202e-01, 8.561e-02, -2.359e-03, 9.927e-03, 6.843e-02, 3.887e-02, 6.791e-02, 2.428e-02, -5.698e-02, -5.294e-02, -1.431e-02, 1.391e-01, -1.181e-01, -8.015e-02, -1.303e-01)); + r += mul(s1_4, M4(1.543e-01, 2.311e-01, 5.523e-01, 4.505e-01, 1.687e-01, -1.044e-01, 2.146e-01, 7.037e-02, 3.646e-01, -8.474e-02, -2.911e-02, -3.091e-02, 1.659e-01, 1.867e-01, -1.452e-02, -9.702e-03)); + r += mul(s1_5, M4(-5.954e-02, 1.475e-01, -1.169e-01, -2.935e-02, -1.248e-02, -2.545e-02, 1.196e-01, 7.875e-02, -1.230e-01, -4.100e-02, -1.244e-01, 2.200e-02, -8.112e-02, 1.377e-02, 4.385e-02, 3.784e-01)); + r += mul(s1_6, M4(-6.024e-02, -1.752e-01, -4.626e-02, 1.655e-01, 1.731e-03, -7.482e-02, -1.530e-01, -7.325e-02, 5.236e-02, 1.229e-01, 3.696e-02, -4.321e-03, -1.850e-01, 2.204e-02, -2.633e-02, 3.600e-01)); + r += mul(s1_7, M4(2.696e-02, -1.389e-02, 4.563e-02, -7.437e-02, -3.164e-02, 3.326e-03, -5.309e-02, -3.683e-02, 1.613e-01, 1.284e-01, -2.614e-02, -8.940e-02, -1.848e-01, -4.281e-02, 6.911e-03, 1.952e-01)); + r += mul(s1_8, M4(6.517e-02, -1.205e-01, -1.575e-01, -2.235e-01, -3.822e-02, 8.424e-02, 3.246e-02, -2.478e-02, -7.266e-03, -6.509e-02, -1.253e-01, -4.156e-02, -1.074e-01, -9.996e-02, 6.088e-02, 2.346e-01)); + r += mul(s2_0, M4(7.127e-02, -1.396e-02, -6.454e-03, 2.312e-01, 2.245e-01, 1.260e-01, -5.369e-02, 6.271e-02, 5.813e-03, 1.763e-01, 5.081e-02, -1.903e-02, 9.205e-02, 3.677e-02, 1.465e-02, -3.572e-02)); + r += mul(s2_1, M4(-8.076e-02, 2.054e-01, -1.043e-01, 1.886e-02, 1.810e-01, 1.393e-01, 1.145e-01, 1.048e-01, 7.747e-02, 1.002e-01, 3.084e-02, -1.256e-01, 1.678e-01, -5.360e-02, 9.116e-03, -3.719e-02)); + r += mul(s2_2, M4(7.671e-02, -1.683e-01, 2.119e-02, -1.963e-01, 3.664e-02, -3.882e-02, -6.431e-02, 4.355e-02, 5.644e-03, -2.142e-02, 1.063e-02, -1.070e-02, -3.074e-03, 7.798e-02, 5.430e-02, -5.788e-02)); + r += mul(s2_3, M4(1.597e-01, 4.635e-03, -9.995e-02, -5.731e-02, 2.099e-01, -1.744e-01, -1.172e-01, -3.430e-02, 4.002e-02, -4.481e-02, -1.069e-01, 1.615e-03, -5.802e-03, 6.416e-02, -7.563e-03, -3.679e-03)); + r += mul(s2_4, M4(-7.730e-02, 8.141e-02, 2.194e-01, 3.742e-02, -5.233e-02, -1.086e-01, 2.415e-02, -2.193e-01, -4.474e-02, -4.683e-02, -5.579e-02, 8.826e-02, 3.113e-01, -9.740e-02, 2.551e-01, 4.137e-02)); + r += mul(s2_5, M4(-6.207e-02, 2.488e-02, 5.997e-02, -2.508e-01, 9.913e-02, 8.113e-02, 4.466e-02, 2.117e-01, -1.341e-02, 2.354e-02, 4.115e-02, 1.401e-02, -3.650e-02, -1.225e-01, -3.836e-02, 1.445e-01)); + r += mul(s2_6, M4(1.256e-01, -7.921e-02, 5.601e-02, 1.096e-01, -1.118e-01, 2.026e-02, -9.184e-02, 5.103e-02, -5.814e-02, -1.031e-01, -1.367e-01, -8.229e-02, -1.179e-01, 4.272e-02, -2.452e-03, 1.150e-01)); + r += mul(s2_7, M4(1.799e-01, 3.391e-02, 1.348e-01, 2.273e-01, 6.945e-02, 1.657e-01, 7.544e-02, -7.215e-02, -5.604e-02, -1.335e-02, 1.002e-01, 1.115e-01, 1.283e-01, 5.942e-02, -7.851e-02, 9.534e-02)); + r += mul(s2_8, M4(5.800e-02, -4.717e-03, -4.043e-02, -3.308e-01, 4.501e-02, -3.996e-02, -5.832e-02, -9.447e-02, -2.623e-03, 7.341e-03, 2.828e-02, 1.066e-02, -7.222e-03, -9.796e-02, -4.808e-02, 8.999e-03)); + r += mul(s3_0, M4(1.333e-01, 9.811e-02, 3.517e-02, 1.008e-02, 2.086e-01, -1.047e-01, -2.222e-02, 1.142e-01, 1.103e-01, 4.521e-02, 3.430e-01, 1.308e-01, -1.588e-02, 5.853e-02, -6.328e-02, -8.583e-02)); + r += mul(s3_1, M4(-1.590e-02, 5.338e-02, 1.783e-01, -3.995e-02, -2.121e-01, -2.104e-01, -8.402e-02, -6.910e-02, -2.198e-01, -1.369e-01, 4.857e-01, -3.527e-01, 5.229e-02, 4.553e-02, 3.975e-02, 1.113e-01)); + r += mul(s3_2, M4(1.378e-01, 5.009e-02, 1.147e-02, -4.811e-02, 1.995e-02, -4.220e-02, -1.434e-02, -1.682e-01, 1.375e-02, -2.277e-01, 4.034e-01, 1.324e-02, -1.265e-01, -4.825e-03, -5.124e-02, 4.928e-02)); + r += mul(s3_3, M4(3.023e-01, -1.505e-01, -1.060e-01, -2.507e-02, -1.052e-01, -4.072e-03, 9.374e-02, 1.291e-01, 2.717e-02, -2.332e-02, 1.779e-01, 2.247e-01, 4.461e-02, -3.617e-02, 1.135e-01, 1.578e-01)); + r += mul(s3_4, M4(6.922e-03, -7.092e-03, -7.514e-02, -1.999e-01, -7.352e-02, 9.282e-02, -4.062e-02, 4.427e-02, -2.842e-01, 5.538e-02, 1.728e-01, 6.405e-01, 5.666e-02, -1.584e-01, 2.390e-01, -1.563e-01)); + r += mul(s3_5, M4(-1.542e-01, 6.271e-02, -7.880e-02, -6.906e-02, 5.749e-02, 3.161e-01, -1.099e-01, -2.815e-01, -1.928e-01, 2.556e-02, 2.316e-01, 3.207e-01, -7.350e-02, -8.937e-02, -8.128e-02, -3.217e-02)); + r += mul(s3_6, M4(-1.054e-01, -6.319e-02, 1.393e-01, 1.755e-01, 1.463e-02, 4.238e-02, 1.288e-01, 2.410e-02, 6.348e-02, -9.399e-02, 5.054e-02, 1.567e-01, -9.147e-02, -9.821e-02, -5.046e-02, -9.996e-02)); + r += mul(s3_7, M4(4.389e-02, 1.437e-01, 1.209e-01, -1.093e-01, -3.484e-02, -9.388e-03, -1.517e-02, 2.933e-02, 2.747e-02, -2.815e-03, 2.313e-02, 4.478e-02, -2.331e-02, -2.325e-02, 4.810e-02, 3.544e-03)); + r += mul(s3_8, M4(1.622e-01, -7.435e-02, -2.240e-02, -1.503e-01, 9.484e-02, 7.273e-03, 1.479e-02, 5.303e-04, -3.781e-02, 1.331e-02, 2.239e-01, 6.487e-02, 3.113e-02, -1.109e-02, -7.214e-02, -5.213e-02)); + r += mul(s4_0, M4(-1.767e-01, -1.761e-02, 5.794e-02, -2.092e-01, -1.063e-01, -6.469e-02, -1.832e-01, -2.754e-01, 6.988e-02, 4.643e-02, -8.930e-04, 2.108e-02, -1.621e-01, 1.921e-03, 9.110e-03, 5.548e-02)); + r += mul(s4_1, M4(-3.711e-02, 4.007e-02, -2.122e-02, 1.410e-01, -4.001e-01, -2.502e-01, -3.357e-01, 1.560e-01, -6.828e-02, -2.182e-01, -2.920e-02, 7.451e-02, 2.454e-01, 5.595e-02, 1.532e-02, 2.326e-01)); + r += mul(s4_2, M4(-3.415e-02, 1.130e-01, 1.315e-01, 9.990e-02, 2.578e-01, 3.132e-02, -2.092e-02, -4.679e-02, 1.714e-01, -6.984e-02, -3.989e-02, 6.598e-03, 2.138e-02, 5.911e-02, -1.324e-01, 2.257e-02)); + r += mul(s4_3, M4(-3.899e-02, -2.317e-02, -5.292e-02, 1.811e-01, -1.660e-02, 3.567e-01, -3.313e-02, -1.344e-01, 3.119e-02, 1.979e-02, 1.413e-01, 2.558e-02, -2.075e-01, -5.004e-02, 1.268e-01, 4.136e-02)); + r += mul(s4_4, M4(-1.033e-01, 1.753e-01, -3.781e-02, -1.163e-02, -1.936e-02, -7.617e-02, -1.734e-01, 3.961e-01, 2.580e-02, 2.199e-02, 3.309e-02, -1.168e-04, -1.629e-01, 2.210e-01, -1.099e-01, -6.111e-02)); + r += mul(s4_5, M4(-1.314e-01, 1.596e-01, -4.496e-02, 3.517e-02, 3.716e-01, 1.264e-02, 1.556e-01, -1.134e-01, -4.923e-02, 8.925e-02, 5.157e-02, -1.111e-01, 1.235e-01, -5.074e-02, -9.965e-02, -2.354e-01)); + r += mul(s4_6, M4(-2.187e-01, -8.205e-02, -5.784e-02, -1.245e-01, -1.000e-01, 9.404e-02, 7.355e-02, -5.207e-01, 2.849e-02, 4.311e-02, -2.477e-03, -1.228e-01, -7.596e-02, 3.517e-02, 5.883e-02, 6.495e-02)); + r += mul(s4_7, M4(-1.546e-01, 1.033e-01, -8.544e-02, 1.434e-01, -2.261e-01, -1.058e-01, 7.453e-03, 2.644e-01, -1.821e-01, 3.247e-03, 1.335e-01, 1.569e-01, 1.079e-01, 1.831e-02, 7.809e-02, 7.146e-02)); + r += mul(s4_8, M4(-1.282e-01, 4.611e-02, 1.102e-01, 8.853e-02, -1.722e-01, -1.031e-01, 2.514e-01, -1.527e-01, -2.682e-03, 1.106e-01, -6.223e-03, -2.285e-02, 1.846e-01, 1.044e-02, -4.121e-02, -9.054e-02)); + r += mul(s5_0, M4(1.332e-01, -5.180e-02, 7.027e-03, 4.352e-02, -2.723e-02, -2.257e-02, -5.886e-02, -4.457e-02, -7.016e-02, 6.257e-02, 1.170e-02, 8.506e-02, -4.006e-02, -6.097e-02, 6.540e-02, 8.862e-02)); + r += mul(s5_1, M4(-4.496e-02, -5.056e-02, -1.407e-03, 1.206e-01, -4.892e-02, -8.885e-02, 6.538e-03, 4.501e-02, 4.362e-02, -8.527e-02, -1.946e-01, 1.466e-01, 1.045e-01, -1.014e-01, 1.647e-01, -2.132e-01)); + r += mul(s5_2, M4(1.616e-02, -1.825e-01, -2.892e-02, 3.381e-03, -2.863e-02, 4.838e-02, -1.173e-02, 5.060e-03, 1.067e-01, -1.108e-01, 1.812e-01, -3.503e-02, -1.645e-01, 6.200e-02, 4.331e-02, -1.618e-01)); + r += mul(s5_3, M4(-1.727e-01, -1.164e-01, -7.706e-02, 1.022e-02, -8.109e-02, 8.064e-02, 1.430e-01, -3.233e-02, -1.537e-01, 5.173e-03, -1.557e-01, 5.926e-02, -1.343e-01, -2.039e-03, -2.499e-02, -7.986e-02)); + r += mul(s5_4, M4(-2.449e-01, 8.561e-02, -5.706e-02, -2.523e-02, -7.240e-02, 4.196e-02, -1.457e-01, 1.570e-01, -7.590e-02, -5.256e-02, -1.481e-01, -2.097e-01, -2.887e-01, -5.940e-02, -2.843e-02, -4.960e-02)); + r += mul(s5_5, M4(-6.858e-02, 2.541e-02, -3.451e-02, -3.459e-01, 1.838e-02, -1.523e-03, 2.673e-02, -8.445e-02, 3.166e-04, 1.589e-02, -1.491e-01, -1.015e-01, -3.630e-01, -3.018e-01, 7.412e-02, 1.560e-01)); + r += mul(s5_6, M4(-1.742e-02, 1.457e-03, -1.061e-01, 1.826e-02, 6.549e-02, 1.906e-02, -3.508e-02, 2.989e-02, -4.677e-02, -1.683e-01, 2.756e-01, -2.025e-01, 1.932e-02, 1.945e-02, 2.062e-02, -2.864e-02)); + r += mul(s5_7, M4(1.323e-01, -1.310e-01, -4.512e-02, -4.500e-02, 1.232e-01, 1.050e-02, -1.799e-02, -1.608e-01, 1.488e-01, 1.833e-02, 3.364e-02, -1.157e-01, -8.935e-02, 6.832e-02, -2.770e-02, -4.232e-02)); + r += mul(s5_8, M4(8.221e-02, 8.575e-03, -4.399e-02, -2.292e-01, -4.005e-02, -7.331e-02, 7.642e-03, -1.209e-01, 6.489e-02, 1.665e-01, 5.812e-02, 1.639e-01, -1.728e-01, -4.343e-02, 1.431e-01, -1.113e-01)); + r += mul(s6_0, M4(-3.535e-02, 9.030e-02, -5.320e-02, 7.737e-02, -5.293e-03, -5.581e-03, -7.533e-02, -1.016e-01, 4.049e-02, 1.179e-01, 8.793e-02, 5.243e-02, -2.340e-01, -1.673e-01, -4.937e-02, -4.802e-02)); + r += mul(s6_1, M4(5.493e-02, -6.066e-02, -1.590e-01, 9.192e-02, -7.866e-02, -1.228e-01, -1.021e-01, 4.901e-02, -2.071e-02, 9.203e-02, 2.903e-01, 5.426e-02, 6.469e-02, 1.092e-01, 9.984e-02, -1.571e-01)); + r += mul(s6_2, M4(1.058e-01, 2.990e-02, 8.940e-03, 4.651e-02, 1.527e-01, -2.858e-02, 2.792e-02, 1.128e-01, -7.559e-02, -4.387e-02, 1.674e-01, 1.207e-01, -2.941e-02, 4.771e-03, -6.180e-02, -1.577e-01)); + r += mul(s6_3, M4(1.342e-01, 1.282e-01, 2.951e-02, -6.237e-02, 2.081e-01, 2.897e-02, 3.082e-01, 5.621e-02, -5.228e-02, -7.116e-03, -3.120e-02, 3.504e-02, -6.504e-02, 1.618e-01, 2.461e-02, -1.625e-01)); + r += mul(s6_4, M4(-1.675e-01, 2.803e-02, 3.666e-02, 2.285e-01, 4.541e-02, 1.696e-01, -3.614e-01, 6.305e-02, -1.967e-01, 1.952e-02, 1.416e-01, -1.762e-01, -7.810e-02, 1.376e-01, -7.025e-02, 1.066e-01)); + r += mul(s6_5, M4(1.353e-01, 1.662e-01, -4.207e-02, -2.346e-02, 3.252e-03, -4.560e-02, 1.697e-02, 2.627e-01, -1.936e-01, -9.696e-02, 2.661e-02, -7.479e-02, 1.646e-01, 1.714e-01, 1.544e-01, -3.598e-01)); + r += mul(s6_6, M4(1.437e-01, 3.831e-02, 6.898e-02, 2.046e-01, 7.234e-02, -1.429e-01, 1.993e-01, 1.094e-01, -4.150e-02, 2.519e-02, -7.068e-02, -8.525e-02, 2.540e-01, 6.760e-02, -1.217e-01, -2.109e-02)); + r += mul(s6_7, M4(1.491e-01, 1.031e-01, 1.842e-02, 7.649e-02, -1.016e-01, -1.476e-01, 1.011e-01, 3.578e-02, -1.648e-01, -4.999e-02, 1.983e-01, 1.706e-01, 1.083e-01, -4.382e-02, 3.283e-02, 2.631e-01)); + r += mul(s6_8, M4(1.966e-01, 3.838e-03, 3.439e-02, 5.648e-02, -5.775e-02, 4.761e-02, -2.427e-02, -6.857e-02, 9.181e-02, 4.807e-02, -4.314e-02, 1.334e-01, 1.542e-01, 1.521e-01, 7.161e-03, -1.978e-01)); + r += mul(s7_0, M4(1.146e-02, -6.005e-02, 5.545e-02, -9.761e-02, 1.503e-01, -2.184e-02, -2.481e-02, 7.512e-03, 1.664e-01, 1.335e-01, -1.812e-02, 7.166e-04, 1.337e-02, -2.437e-02, 1.074e-01, -1.082e-01)); + r += mul(s7_1, M4(-1.392e-01, -4.758e-02, -1.420e-01, -1.394e-01, 8.528e-02, 1.490e-01, -1.346e-02, -1.093e-02, -1.024e-02, -1.676e-01, 9.042e-02, -9.947e-02, -4.090e-02, -4.279e-03, 2.057e-01, 2.859e-02)); + r += mul(s7_2, M4(-1.675e-01, -2.194e-01, 5.117e-02, -1.949e-01, 1.652e-02, -9.819e-02, 5.137e-02, 4.510e-02, -1.041e-01, -8.313e-02, -8.920e-02, -1.221e-02, -8.391e-02, -7.470e-02, -3.483e-02, 2.702e-02)); + r += mul(s7_3, M4(1.624e-01, -1.387e-02, 1.789e-01, 4.982e-02, 2.285e-01, -1.281e-01, 1.582e-01, -1.199e-01, -1.904e-02, -2.422e-02, 1.750e-01, 1.218e-02, 8.004e-02, -1.072e-01, 3.704e-02, 1.066e-01)); + r += mul(s7_4, M4(-6.251e-03, -1.467e-02, 3.164e-02, 1.254e-01, -8.096e-02, 6.160e-02, -1.487e-01, -4.789e-03, 1.438e-01, -4.290e-02, 5.777e-02, -6.356e-02, 8.993e-02, -8.667e-02, -2.150e-01, 6.103e-02)); + r += mul(s7_5, M4(-1.233e-01, -1.353e-01, -8.816e-03, -1.068e-01, -3.542e-02, -6.869e-02, 1.217e-01, 2.516e-01, 1.305e-01, 1.769e-01, -3.911e-02, 3.566e-02, 4.754e-02, 1.708e-02, -5.803e-02, 1.294e-01)); + r += mul(s7_6, M4(-6.324e-02, -1.053e-01, 8.470e-02, 1.818e-02, 1.645e-02, -4.823e-02, 1.704e-01, -1.717e-02, -7.712e-02, 1.961e-02, -1.057e-01, -7.132e-02, 5.527e-02, -2.007e-02, 4.258e-02, -5.366e-02)); + r += mul(s7_7, M4(-7.590e-02, 1.014e-02, -4.700e-02, -8.332e-02, -2.349e-04, 8.786e-02, -9.277e-03, 8.736e-02, -2.654e-03, -1.076e-02, 6.248e-02, 1.686e-01, -2.289e-02, 8.949e-03, 3.939e-02, 2.480e-01)); + r += mul(s7_8, M4(-1.031e-01, -1.418e-01, -1.160e-02, -9.134e-02, -8.708e-02, -1.059e-02, 3.590e-02, 9.035e-02, 6.970e-02, 4.722e-02, -1.140e-01, -2.233e-02, 5.186e-02, -1.830e-03, 4.614e-02, -5.985e-02)); + r += V4(-6.233e-03, -4.512e-02, 8.188e-02, 1.874e-02); + return r; +} + +V4 f1(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(1.072e-02, 2.987e-02, -4.870e-02, -9.877e-02, -2.593e-01, 8.765e-02, -3.330e-01, 4.828e-02, 3.932e-02, 3.659e-04, 1.314e-01, -1.119e-01, 2.564e-02, 5.181e-02, 7.177e-02, -2.318e-02)); + r += mul(s0_1, M4(1.366e-01, 8.945e-02, 6.219e-02, 1.591e-01, 1.157e-01, 1.207e-01, -1.396e-01, 1.469e-01, -1.020e-01, -1.702e-02, -3.086e-02, -8.716e-02, 5.325e-02, -7.046e-02, -5.272e-02, 1.926e-01)); + r += mul(s0_2, M4(9.012e-02, -1.006e-02, 5.874e-03, 1.501e-01, -5.434e-02, 9.288e-02, -3.788e-02, -1.272e-01, -6.693e-03, 5.686e-03, -3.368e-02, -2.107e-02, -3.497e-02, 3.170e-02, 5.741e-02, 5.688e-02)); + r += mul(s0_3, M4(-8.879e-02, 1.134e-01, -2.091e-01, -2.618e-02, -1.441e-01, -1.830e-01, 1.010e-01, -2.361e-02, 7.942e-02, -9.917e-02, 7.310e-02, 1.108e-01, -4.764e-02, 9.027e-03, 1.707e-01, 6.562e-02)); + r += mul(s0_4, M4(-1.312e-01, 2.961e-02, 3.481e-02, 8.557e-02, 7.619e-01, -4.109e-01, -7.920e-02, -6.275e-01, -3.851e-02, 1.703e-02, -1.155e-01, -6.941e-02, 8.292e-02, -7.877e-02, -1.201e-01, 8.829e-02)); + r += mul(s0_5, M4(6.816e-02, -1.082e-01, -1.076e-01, -2.286e-01, -2.404e-01, 3.053e-01, -1.037e-01, 1.641e-01, 1.430e-01, 1.705e-01, 8.834e-03, 8.574e-02, -4.016e-02, -2.470e-02, 7.121e-02, 1.250e-03)); + r += mul(s0_6, M4(6.383e-02, 1.785e-02, 1.217e-01, -5.187e-02, -1.436e-01, -1.256e-01, -9.063e-02, 1.767e-01, -3.213e-02, -2.595e-01, -1.391e-01, 8.152e-03, -9.418e-02, -2.258e-01, 2.352e-02, -5.914e-02)); + r += mul(s0_7, M4(2.106e-02, -1.326e-01, -1.596e-01, 1.914e-02, -8.504e-02, 6.304e-01, 1.081e-01, 2.286e-01, -1.086e-01, -1.806e-01, 1.410e-01, -3.709e-02, -4.926e-02, -1.029e-01, -9.883e-02, -2.675e-02)); + r += mul(s0_8, M4(-7.430e-03, 2.211e-02, -1.627e-02, -3.563e-02, -1.603e-02, -1.272e-01, -7.611e-02, 1.647e-01, -2.259e-01, 5.723e-02, -1.199e-01, 9.717e-03, -1.614e-02, -3.597e-02, -2.514e-02, -1.460e-01)); + r += mul(s1_0, M4(1.850e-02, 7.559e-02, 2.411e-01, -5.024e-02, -2.092e-03, 8.279e-03, 1.779e-01, 7.559e-02, 3.466e-02, -1.003e-01, 6.475e-02, -6.812e-02, 7.454e-02, -1.681e-01, 8.178e-02, 5.003e-02)); + r += mul(s1_1, M4(-7.757e-02, 1.018e-01, -4.131e-02, -2.083e-01, 2.325e-02, 1.465e-02, -4.361e-02, 8.990e-02, -1.067e-01, -1.373e-01, 4.339e-02, 1.775e-01, -4.043e-02, -1.337e-01, 9.192e-03, 8.997e-02)); + r += mul(s1_2, M4(-1.574e-01, -1.295e-01, -6.844e-02, -9.125e-02, -8.375e-03, 6.014e-02, 2.392e-02, -4.710e-02, -2.392e-02, -1.597e-01, 2.631e-03, -3.381e-03, 1.888e-01, -2.238e-01, -3.792e-02, -1.087e-01)); + r += mul(s1_3, M4(-5.730e-02, 1.616e-01, -1.510e-01, 1.484e-01, 2.380e-03, -5.401e-02, 3.699e-02, -4.056e-02, 1.217e-01, 2.217e-02, -4.013e-02, 1.260e-01, -1.723e-02, -2.650e-01, 2.407e-01, -6.329e-02)); + r += mul(s1_4, M4(-3.091e-01, 2.740e-01, -1.965e-02, 2.077e-02, 1.116e-01, -9.509e-02, -2.301e-01, -7.686e-02, -5.567e-02, 6.194e-02, -2.114e-02, -5.373e-02, 1.820e-01, -3.116e-01, -2.269e-01, 7.808e-02)); + r += mul(s1_5, M4(2.357e-01, 3.560e-02, -6.030e-02, -2.233e-01, 1.096e-01, 5.193e-02, -2.080e-01, 2.401e-02, 7.055e-02, -2.879e-02, 4.936e-02, 1.033e-01, -9.082e-02, 1.456e-02, -1.203e-01, -9.185e-02)); + r += mul(s1_6, M4(-4.888e-03, -1.463e-02, -1.374e-01, -7.310e-02, -8.804e-02, -1.713e-03, 1.975e-01, -7.981e-02, 1.088e-01, -3.366e-02, -2.186e-01, 5.982e-03, -5.231e-02, -8.029e-02, 1.584e-01, 1.171e-02)); + r += mul(s1_7, M4(-2.043e-01, -2.478e-01, -1.684e-01, 7.396e-02, -5.522e-02, 1.367e-02, 2.299e-02, -6.665e-02, -7.718e-02, 7.285e-02, 1.271e-01, 8.786e-02, 1.472e-01, 7.952e-02, -2.088e-01, -7.105e-02)); + r += mul(s1_8, M4(-2.984e-02, -9.663e-02, -6.416e-03, 4.946e-02, -5.698e-02, 5.056e-02, 4.170e-02, 7.171e-03, 1.453e-01, 3.092e-02, -5.553e-02, -6.796e-03, 1.211e-01, 1.874e-02, -1.011e-01, -3.792e-02)); + r += mul(s2_0, M4(-1.008e-01, -5.194e-02, -2.756e-02, -6.745e-03, -1.505e-01, -1.320e-01, -1.929e-01, 4.847e-02, -1.121e-01, -2.102e-01, -1.006e-01, 1.444e-02, -8.762e-02, -8.098e-03, -7.473e-02, -1.624e-01)); + r += mul(s2_1, M4(1.426e-01, 1.293e-01, -1.464e-02, -1.140e-02, -2.014e-02, 4.292e-02, -2.943e-01, -1.110e-01, 1.252e-01, -5.200e-02, 1.308e-01, 6.224e-02, 7.254e-02, -2.254e-02, 7.862e-02, -2.198e-01)); + r += mul(s2_2, M4(4.654e-02, -2.551e-01, -2.251e-01, 2.466e-01, -1.344e-01, -4.730e-02, -1.331e-01, 8.710e-02, -2.163e-01, -1.685e-01, 2.531e-02, 4.731e-02, 3.408e-02, 1.302e-02, -4.481e-02, -7.309e-02)); + r += mul(s2_3, M4(-1.833e-01, 1.709e-01, 5.242e-02, -2.393e-02, 5.576e-02, 6.886e-02, 4.389e-01, -4.525e-02, 7.399e-02, 1.564e-01, 9.747e-03, -1.112e-01, -2.863e-02, 2.534e-01, 1.318e-01, 1.231e-01)); + r += mul(s2_4, M4(1.389e-02, -2.544e-01, 6.263e-02, 4.152e-02, -4.439e-02, 9.213e-02, 1.155e-01, -3.731e-02, 4.804e-02, 6.394e-02, 3.836e-02, -1.901e-02, 3.252e-01, -1.103e-01, 3.155e-01, -3.334e-01)); + r += mul(s2_5, M4(2.692e-02, 1.670e-03, -1.956e-01, -2.065e-01, 2.862e-02, 1.070e-01, -5.289e-04, 2.543e-01, 3.560e-03, 3.700e-02, 2.995e-02, -1.575e-01, -2.839e-02, -1.122e-02, -1.519e-01, -3.399e-01)); + r += mul(s2_6, M4(-3.126e-02, 6.623e-02, 1.242e-01, 1.889e-02, -4.032e-02, 8.464e-03, 1.190e-01, 4.678e-02, -1.823e-02, -1.588e-02, -2.659e-02, 6.273e-02, -7.421e-02, -1.694e-01, 1.068e-01, -7.284e-03)); + r += mul(s2_7, M4(1.102e-01, -1.866e-01, -1.061e-01, -2.824e-01, 1.737e-02, 1.007e-01, 5.043e-03, -1.614e-01, 3.293e-03, 1.382e-01, -1.468e-02, -1.901e-02, -3.788e-02, 9.288e-02, -1.407e-01, -2.130e-02)); + r += mul(s2_8, M4(2.724e-02, 6.120e-02, 1.856e-01, 1.509e-02, 1.522e-01, 4.458e-02, 1.284e-01, 1.431e-01, -1.399e-02, -4.098e-02, 6.481e-02, -6.521e-02, 1.377e-01, -2.937e-02, 2.207e-02, 3.419e-02)); + r += mul(s3_0, M4(1.091e-02, -8.703e-02, 2.567e-01, 3.758e-02, -1.626e-01, 9.900e-02, 9.897e-02, 1.972e-02, -1.741e-01, -3.328e-01, 9.653e-02, -7.223e-02, -7.728e-02, 1.670e-01, 1.268e-01, -1.022e-02)); + r += mul(s3_1, M4(8.696e-02, 4.460e-02, -1.843e-01, 5.664e-02, 2.322e-01, 2.416e-01, 4.537e-02, -8.637e-02, 2.466e-01, -3.734e-01, -1.130e-01, -4.065e-02, 6.738e-02, 1.748e-01, 5.445e-02, -1.321e-01)); + r += mul(s3_2, M4(4.309e-02, 1.146e-01, 1.336e-03, -1.639e-01, 8.132e-02, 1.614e-01, 4.700e-02, -3.760e-01, -2.383e-01, 1.015e-01, 1.638e-02, 3.249e-01, -3.819e-02, 4.556e-02, -5.602e-02, 2.362e-01)); + r += mul(s3_3, M4(-1.616e-01, 1.037e-01, 4.294e-01, -8.711e-02, 9.881e-02, -1.627e-01, -4.622e-02, -3.638e-02, -1.581e-01, -2.005e-01, -2.844e-01, -1.328e-01, -5.698e-02, 1.438e-02, 2.079e-01, 1.697e-02)); + r += mul(s3_4, M4(-4.821e-02, -3.568e-02, -1.423e-01, -7.904e-02, 1.332e-01, 7.288e-03, 8.952e-02, -5.698e-02, 5.983e-02, 2.679e-01, -9.634e-02, 6.227e-02, 2.570e-01, -2.033e-02, -3.207e-01, -4.696e-02)); + r += mul(s3_5, M4(2.321e-01, 1.473e-02, 4.822e-02, -1.961e-01, 3.712e-01, 1.017e-02, -1.449e-02, 9.831e-02, 8.188e-02, 2.311e-01, 1.631e-01, -5.482e-02, -5.875e-02, -2.277e-01, 2.308e-02, -5.562e-02)); + r += mul(s3_6, M4(3.540e-03, 1.396e-01, -7.204e-02, 3.212e-02, -5.876e-02, 5.417e-02, -1.013e-01, -1.313e-02, -1.003e-01, -3.366e-01, 9.102e-02, 4.483e-02, -1.129e-01, -8.134e-02, 1.506e-01, -4.069e-02)); + r += mul(s3_7, M4(-4.611e-02, 6.878e-03, -1.654e-02, 4.913e-02, -5.735e-02, 1.157e-01, -1.774e-02, -8.984e-02, 2.189e-02, 2.690e-01, 2.728e-02, -6.942e-03, 5.850e-02, -9.036e-02, -1.306e-01, -4.179e-03)); + r += mul(s3_8, M4(-8.081e-02, -5.007e-02, 5.750e-02, 5.247e-02, -2.169e-02, 1.248e-01, 1.077e-05, 1.078e-01, -1.131e-01, -3.974e-02, 2.086e-01, -1.031e-02, 9.351e-02, -1.307e-01, -2.288e-01, 4.383e-02)); + r += mul(s4_0, M4(3.424e-02, 7.999e-02, 7.685e-02, 4.790e-03, -6.946e-02, 3.152e-01, -1.126e-01, 2.237e-01, -2.916e-02, 4.300e-02, 3.158e-02, 2.072e-02, 1.954e-02, 1.402e-01, 1.155e-01, -5.400e-02)); + r += mul(s4_1, M4(4.558e-02, -1.627e-01, 1.460e-01, -1.519e-01, 1.269e-01, -1.166e-01, 7.981e-02, -1.032e-01, -1.566e-02, -7.502e-02, 1.240e-02, -6.222e-02, -1.907e-02, 1.501e-01, 1.784e-01, -2.211e-01)); + r += mul(s4_2, M4(1.578e-02, 2.068e-02, 1.515e-02, -2.311e-02, -2.813e-02, 1.740e-01, 1.060e-01, -7.887e-02, 2.634e-02, 7.770e-02, 2.411e-02, 5.767e-02, 9.125e-02, -2.644e-02, -2.305e-02, -9.402e-02)); + r += mul(s4_3, M4(1.087e-01, -2.020e-01, 1.134e-01, 2.271e-02, -7.384e-02, 1.375e-01, -3.297e-01, 6.567e-02, -2.486e-02, 1.378e-01, -2.338e-03, 1.319e-01, 6.882e-02, 1.297e-01, -6.683e-02, 1.000e-01)); + r += mul(s4_4, M4(-2.737e-01, 1.427e-01, -3.568e-01, 3.743e-02, 2.118e-01, -8.814e-03, 2.406e-01, 9.181e-02, -4.541e-02, 8.189e-03, 1.395e-01, 4.992e-02, -7.127e-02, 1.991e-01, 3.851e-01, 1.538e-01)); + r += mul(s4_5, M4(1.133e-01, -3.303e-02, 4.544e-02, -1.079e-02, -6.669e-02, -1.649e-01, 1.830e-01, 5.873e-02, -6.171e-02, 6.666e-02, 9.514e-02, -1.057e-01, 1.724e-01, 8.855e-02, 6.628e-02, -9.804e-02)); + r += mul(s4_6, M4(-1.156e-01, 4.579e-02, -1.436e-01, -1.500e-01, 1.156e-04, 1.470e-01, 2.128e-02, 1.526e-02, -2.010e-02, -4.426e-02, -2.241e-02, 1.347e-02, -3.333e-02, -8.785e-03, -1.368e-01, 3.007e-02)); + r += mul(s4_7, M4(3.182e-02, -3.640e-02, -2.042e-02, 6.383e-03, 1.342e-01, -1.910e-01, -2.039e-01, -2.644e-01, -5.062e-02, -6.343e-02, -1.043e-02, -7.188e-02, -1.742e-01, -5.018e-02, 3.093e-02, -2.548e-02)); + r += mul(s4_8, M4(2.927e-02, 8.337e-02, -4.069e-03, -4.532e-02, -1.445e-02, -1.190e-02, 5.480e-02, -2.169e-01, 6.353e-02, -2.374e-01, -1.116e-01, 2.739e-02, -9.849e-04, -9.187e-02, 2.816e-02, 1.036e-01)); + r += mul(s5_0, M4(-6.044e-02, 8.869e-02, 1.616e-03, -5.585e-02, 5.658e-02, 9.891e-03, -1.156e-02, 1.706e-02, 7.989e-03, 3.445e-01, -3.770e-02, 1.117e-01, -1.178e-01, -1.527e-01, -2.576e-01, -1.498e-01)); + r += mul(s5_1, M4(-6.545e-02, -9.450e-03, -6.159e-02, -4.696e-02, 8.623e-02, -7.169e-02, -5.838e-02, 1.784e-02, 1.132e-01, 1.126e-01, 1.970e-02, 1.624e-01, -4.806e-02, -2.634e-01, -1.809e-01, -3.138e-01)); + r += mul(s5_2, M4(1.511e-01, 9.117e-02, -5.241e-02, -6.197e-02, -6.328e-02, -1.878e-02, -2.180e-02, -4.510e-02, -1.126e-01, 1.166e-01, 1.270e-01, 1.281e-01, -8.226e-02, -7.153e-02, 3.331e-02, -1.265e-01)); + r += mul(s5_3, M4(7.965e-02, -1.161e-02, 1.187e-01, 9.454e-02, -2.232e-02, -1.270e-02, -4.553e-02, 4.193e-02, -1.702e-01, 6.725e-02, -2.090e-01, -3.786e-02, 1.777e-01, -1.197e-01, 2.123e-01, 9.745e-02)); + r += mul(s5_4, M4(2.837e-02, -3.252e-01, 3.035e-01, 1.311e-01, 5.649e-02, -2.523e-02, 3.847e-02, 1.933e-01, -1.843e-01, 8.062e-02, 2.911e-02, -1.414e-01, 1.123e-01, 1.763e-01, -1.875e-01, 1.437e-01)); + r += mul(s5_5, M4(1.268e-01, -1.762e-01, 3.054e-01, -1.945e-01, -8.692e-02, -5.161e-04, 7.561e-02, 3.989e-02, 1.580e-01, -2.259e-01, 1.818e-01, -2.756e-01, -2.821e-01, -5.012e-02, -1.082e-01, -2.341e-01)); + r += mul(s5_6, M4(-7.304e-02, 9.063e-03, -1.128e-01, -9.447e-02, 1.103e-01, -2.242e-01, -2.195e-01, -2.092e-02, -5.718e-02, -9.265e-03, -1.021e-02, 9.082e-02, 6.298e-02, 8.127e-02, 1.945e-01, 6.062e-02)); + r += mul(s5_7, M4(1.440e-01, -1.044e-01, -1.070e-01, -3.389e-02, -2.963e-02, 5.793e-02, -3.072e-02, -2.344e-03, -2.492e-02, -2.873e-01, -3.807e-01, 2.718e-01, -2.020e-02, 1.431e-01, -1.180e-01, -1.030e-01)); + r += mul(s5_8, M4(3.213e-01, 6.824e-03, -7.111e-02, 3.511e-01, -4.654e-02, -6.974e-02, 6.345e-02, 1.485e-02, 2.044e-01, -1.140e-01, -4.490e-02, 1.607e-01, -9.209e-02, 1.401e-01, -5.090e-02, -8.411e-03)); + r += mul(s6_0, M4(6.762e-02, 3.111e-02, 8.905e-02, -8.417e-02, 3.567e-02, 4.367e-02, 1.799e-01, -6.583e-02, 2.586e-01, -5.969e-02, 9.891e-02, -6.286e-02, 2.217e-01, 9.322e-02, 1.010e-02, 4.488e-03)); + r += mul(s6_1, M4(-6.680e-02, 3.286e-02, 3.087e-02, -4.619e-03, -1.036e-02, 7.282e-02, 1.468e-01, -5.122e-02, 2.252e-01, 1.292e-01, -7.800e-02, -1.970e-01, -9.419e-02, 9.136e-02, -4.977e-02, 2.149e-01)); + r += mul(s6_2, M4(-4.593e-03, 3.990e-02, 1.935e-01, 1.642e-01, -1.323e-01, -3.260e-02, 6.514e-03, 8.888e-02, 1.945e-01, -2.007e-01, -1.095e-01, 8.508e-02, 2.230e-01, 1.375e-01, 5.262e-01, 3.002e-02)); + r += mul(s6_3, M4(-1.067e-01, 1.100e-02, -9.022e-02, -8.760e-03, -1.470e-01, 4.327e-02, -4.423e-01, -9.102e-02, -7.296e-02, -5.397e-02, 3.183e-01, -9.107e-02, 7.823e-02, 1.340e-01, -3.831e-01, 3.284e-01)); + r += mul(s6_4, M4(-1.125e-01, -1.064e-01, 5.733e-02, 2.783e-01, 4.943e-02, 8.598e-02, -1.754e-01, 1.106e-01, 7.048e-03, -1.128e-01, -1.402e-01, 7.994e-02, 6.531e-02, -1.963e-01, -1.339e-01, -1.787e-01)); + r += mul(s6_5, M4(6.126e-02, -2.194e-01, -1.802e-02, -1.396e-01, -1.366e-01, 1.403e-03, -2.045e-02, -4.980e-03, 3.831e-03, -5.249e-02, -8.786e-02, -9.294e-02, 5.863e-02, 2.601e-01, 1.074e-01, 2.285e-01)); + r += mul(s6_6, M4(4.155e-02, -2.726e-02, -1.368e-01, -3.527e-02, -1.657e-03, 4.799e-02, -1.674e-01, -2.810e-02, 1.697e-01, -2.212e-01, -1.978e-01, -8.034e-02, -3.231e-02, -3.516e-01, 1.731e-01, -2.747e-02)); + r += mul(s6_7, M4(1.853e-01, 6.818e-02, 4.581e-02, 2.965e-02, 2.423e-01, -1.597e-01, 1.566e-01, 2.783e-01, 4.119e-02, -5.123e-02, 2.303e-01, -9.911e-02, -9.150e-02, -6.106e-02, 1.850e-02, 2.050e-01)); + r += mul(s6_8, M4(2.283e-01, -1.458e-01, 1.233e-01, 8.499e-02, 6.123e-02, 1.016e-01, -5.853e-03, -8.747e-02, 7.646e-02, -6.887e-02, -2.715e-02, -3.436e-02, -1.119e-01, -1.890e-01, 2.693e-01, 2.559e-03)); + r += mul(s7_0, M4(1.384e-02, -1.850e-01, 5.129e-02, -1.023e-01, 9.918e-02, -2.892e-02, 1.510e-01, -8.043e-02, -5.683e-02, 4.200e-02, -1.634e-01, 4.746e-02, 3.527e-02, -5.455e-02, -1.567e-01, -1.112e-01)); + r += mul(s7_1, M4(-1.209e-01, -2.167e-01, -9.072e-02, 6.864e-02, -1.791e-01, -7.372e-02, 7.429e-02, -2.261e-01, 5.672e-02, -8.587e-02, -1.480e-01, 8.569e-02, -4.476e-02, 4.380e-02, -2.727e-01, 2.679e-01)); + r += mul(s7_2, M4(-9.439e-02, -1.420e-01, -8.216e-02, 1.063e-01, -2.824e-02, -1.300e-01, 4.051e-02, -3.691e-02, -3.306e-02, -6.779e-02, -1.291e-02, 1.214e-01, -1.861e-02, -7.860e-02, 6.709e-02, -1.240e-01)); + r += mul(s7_3, M4(-4.692e-02, 4.636e-03, -3.419e-02, 3.887e-02, -9.496e-02, -5.115e-02, -1.757e-01, 8.311e-02, -8.690e-03, 5.378e-02, 2.403e-01, -1.772e-02, 8.144e-03, 1.039e-02, -1.007e-02, 2.934e-02)); + r += mul(s7_4, M4(-8.310e-02, -1.082e-01, 1.465e-01, 1.458e-01, -6.636e-02, 1.827e-01, -1.259e-01, 7.035e-02, 1.577e-01, 2.910e-02, 1.289e-01, 1.968e-01, 6.651e-02, -1.057e-01, 3.715e-02, -2.438e-01)); + r += mul(s7_5, M4(-2.911e-02, -9.885e-02, -2.341e-02, -2.019e-01, 2.090e-01, 8.860e-02, -1.892e-01, 1.353e-01, -5.556e-02, -7.870e-03, 5.824e-02, 5.973e-02, -3.291e-02, 7.454e-03, 3.751e-02, -1.121e-01)); + r += mul(s7_6, M4(7.551e-02, -3.335e-02, -1.762e-01, 5.832e-02, 5.756e-02, -1.613e-02, 1.464e-01, -9.083e-02, 1.369e-02, -1.940e-02, 2.754e-02, -5.272e-02, -4.991e-02, 1.147e-01, -2.800e-02, -5.788e-02)); + r += mul(s7_7, M4(-2.630e-02, 8.548e-02, -3.191e-02, 1.016e-01, 2.250e-01, 8.246e-02, 1.763e-01, 8.115e-03, -1.055e-01, 6.761e-02, 2.263e-02, -9.174e-02, 4.222e-02, 7.305e-02, 1.293e-01, -2.264e-03)); + r += mul(s7_8, M4(3.674e-02, -2.297e-02, -3.111e-02, 1.134e-02, -1.363e-01, 1.643e-01, 9.281e-02, -7.981e-02, 8.216e-02, -9.746e-02, -1.500e-02, 7.859e-02, -8.993e-02, -1.750e-02, 1.173e-01, 4.751e-03)); + r += V4(1.698e-03, 2.579e-02, -1.678e-02, 7.305e-03); + return r; +} + +V4 f2(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-6.186e-02, 7.644e-02, -1.504e-01, 6.998e-03, 3.227e-01, 5.705e-01, 1.276e-02, -9.864e-03, 2.392e-01, 1.188e-02, 2.665e-02, 4.136e-03, 1.107e-01, -1.087e-02, -3.264e-02, -1.099e-01)); + r += mul(s0_1, M4(5.791e-02, -8.280e-02, -2.316e-01, -1.607e-01, -4.218e-01, 6.681e-01, 1.097e-01, -7.250e-01, -1.247e-01, -1.116e-01, 6.560e-02, -9.282e-02, -3.846e-02, 4.643e-02, -2.071e-02, -2.146e-01)); + r += mul(s0_2, M4(3.270e-03, 3.178e-02, -1.218e-01, 5.875e-02, 2.629e-03, 2.297e-01, 4.372e-01, -2.591e-01, 2.010e-02, -6.648e-02, 2.203e-02, -3.337e-02, 5.933e-02, -9.940e-02, -8.647e-02, -3.455e-02)); + r += mul(s0_3, M4(-7.295e-02, 1.090e-01, -2.574e-01, -4.590e-02, 1.968e-01, 5.900e-01, 6.299e-02, -3.414e-02, 1.580e-01, -7.376e-02, 9.417e-02, -4.065e-02, 1.430e-03, -1.640e-02, 4.694e-02, -3.214e-05)); + r += mul(s0_4, M4(5.960e-02, -1.084e-01, -2.587e-01, 1.333e-01, -7.512e-02, 8.546e-01, -3.336e-01, 3.835e-01, 1.885e-01, 5.548e-02, -6.802e-02, 5.619e-03, -1.972e-02, 1.343e-01, 8.009e-02, -2.308e-01)); + r += mul(s0_5, M4(7.935e-02, -2.185e-02, 9.521e-03, 2.267e-02, 4.557e-02, 4.106e-01, -5.828e-02, 1.617e-01, -8.067e-02, 1.044e-01, -5.421e-02, 2.106e-01, 9.214e-02, -9.703e-03, -6.816e-03, 5.811e-02)); + r += mul(s0_6, M4(-8.258e-02, 5.813e-02, -3.165e-01, -4.061e-02, -2.125e-01, 3.517e-01, 1.852e-01, 3.948e-02, -3.181e-02, -9.381e-02, 3.857e-03, 1.596e-02, 1.605e-01, 1.763e-02, 6.127e-02, 5.993e-02)); + r += mul(s0_7, M4(-1.638e-01, 6.370e-02, -3.140e-02, -6.196e-02, -8.679e-02, 3.919e-01, -7.714e-02, 6.702e-01, 2.352e-01, 4.334e-02, 2.054e-01, -1.406e-01, -1.907e-02, -1.223e-02, 7.092e-02, 5.143e-02)); + r += mul(s0_8, M4(-2.864e-02, 2.101e-02, -5.985e-02, -3.778e-02, 1.740e-01, 4.349e-01, 3.508e-01, -8.256e-02, 1.417e-01, -2.963e-02, 5.655e-02, 5.685e-02, -3.032e-02, -7.560e-03, -3.227e-02, 1.275e-01)); + r += mul(s1_0, M4(-1.037e-01, -5.329e-02, -1.153e-03, 1.188e-03, 4.432e-02, 9.465e-02, 3.873e-02, -1.126e-02, 9.906e-02, -6.669e-03, -3.942e-02, -4.308e-02, 8.005e-03, 3.278e-02, -6.866e-02, -4.305e-02)); + r += mul(s1_1, M4(2.644e-01, 3.882e-02, 1.599e-01, 2.417e-01, -1.866e-01, -5.371e-02, -3.262e-02, -1.531e-01, -9.844e-02, -1.569e-02, -1.239e-02, -1.319e-02, -7.975e-02, 2.914e-02, 9.776e-02, 1.726e-01)); + r += mul(s1_2, M4(-7.199e-03, -9.698e-02, 5.974e-02, 2.839e-02, 1.722e-02, 1.038e-02, 4.286e-02, -1.109e-01, -1.882e-01, -5.766e-02, -1.242e-01, 6.661e-02, -9.155e-02, 9.355e-02, 4.687e-02, -7.348e-03)); + r += mul(s1_3, M4(-2.169e-01, 1.116e-01, -1.917e-01, -3.858e-03, 7.152e-02, -2.615e-02, -7.558e-02, -8.680e-02, -3.220e-02, 1.908e-01, 1.524e-02, 4.523e-03, 8.582e-02, 5.460e-02, 1.954e-01, 2.942e-01)); + r += mul(s1_4, M4(3.139e-02, -9.837e-02, 1.743e-02, 1.242e-01, 8.060e-02, 1.809e-01, -1.421e-01, 1.008e-01, -1.521e-01, 6.146e-02, -8.842e-02, 2.465e-01, -3.182e-01, -4.065e-02, 1.646e-01, -3.455e-01)); + r += mul(s1_5, M4(5.098e-02, -2.421e-02, 1.039e-01, 6.447e-02, -1.005e-01, 1.246e-02, -3.039e-03, 4.305e-02, -6.107e-02, 2.312e-02, -9.916e-02, 1.579e-01, 8.034e-03, 4.809e-02, 4.289e-02, -3.629e-02)); + r += mul(s1_6, M4(2.395e-01, -3.280e-02, -8.095e-02, -1.944e-02, 5.828e-02, 5.073e-02, -2.697e-02, 1.291e-02, -2.329e-01, 1.244e-01, -9.033e-02, 9.723e-02, 7.572e-03, 4.856e-02, -1.690e-01, 1.099e-01)); + r += mul(s1_7, M4(2.168e-02, 3.986e-02, 2.528e-01, -1.322e-01, 9.191e-02, -7.203e-02, -4.302e-02, 1.143e-01, -2.355e-02, 2.543e-03, -4.589e-03, -8.326e-02, -1.032e-01, -1.386e-01, -1.470e-01, 9.319e-02)); + r += mul(s1_8, M4(-4.893e-02, -1.262e-04, 1.475e-01, -7.349e-02, -1.439e-02, -1.244e-03, 7.020e-02, 1.256e-01, 1.024e-01, -4.272e-02, -5.351e-02, 2.883e-02, -6.076e-02, -1.863e-02, -1.155e-01, -1.205e-03)); + r += mul(s2_0, M4(1.458e-02, -5.736e-02, 1.231e-02, 1.840e-01, -1.126e-01, -4.911e-02, -1.182e-01, 1.364e-01, 1.724e-03, 7.908e-02, 6.441e-02, -1.983e-01, -8.041e-02, -3.410e-02, -9.758e-02, -3.682e-02)); + r += mul(s2_1, M4(-1.064e-01, 1.305e-02, 1.300e-02, -2.330e-01, 1.571e-01, -5.209e-02, -1.620e-01, -8.339e-02, -5.291e-02, 6.925e-02, -1.189e-02, 1.150e-01, 1.358e-04, -1.515e-01, 2.310e-02, 8.484e-02)); + r += mul(s2_2, M4(-1.471e-02, 8.768e-02, 1.317e-01, 6.032e-02, -2.307e-02, 4.888e-02, 4.469e-02, -2.151e-01, -1.492e-01, 1.163e-01, 7.104e-02, 8.186e-02, 8.922e-02, -5.862e-02, -9.091e-02, 2.635e-01)); + r += mul(s2_3, M4(7.698e-02, 4.197e-02, -4.196e-02, 1.545e-01, 1.266e-02, -1.129e-01, 1.528e-01, -5.952e-02, 3.781e-02, 8.110e-02, 1.030e-01, -2.405e-02, -5.800e-02, -1.409e-02, -6.333e-02, -2.070e-02)); + r += mul(s2_4, M4(-9.783e-02, 6.081e-02, -6.229e-02, 7.337e-02, -1.360e-01, 1.127e-03, 4.817e-02, -2.041e-01, 6.752e-02, -1.186e-02, -7.077e-02, -1.223e-01, 2.327e-02, 7.801e-03, 6.270e-02, 3.135e-01)); + r += mul(s2_5, M4(9.916e-02, -4.970e-02, 4.994e-02, -7.438e-02, 1.170e-01, 9.513e-02, -1.987e-01, 1.479e-01, -1.008e-01, 1.637e-02, -4.408e-02, 1.639e-01, 1.416e-02, 7.802e-02, 7.414e-02, 2.309e-01)); + r += mul(s2_6, M4(2.317e-02, -9.267e-03, 2.679e-03, -1.355e-02, 1.708e-01, 9.609e-02, 7.928e-02, -2.145e-03, 2.286e-01, 5.851e-02, 7.349e-02, -4.331e-02, 4.207e-02, 5.328e-03, -1.931e-01, 1.520e-02)); + r += mul(s2_7, M4(-4.572e-02, -5.036e-02, 4.120e-02, -2.082e-01, -1.949e-01, -9.669e-02, 4.695e-02, 2.991e-02, -6.106e-03, 6.338e-02, -1.248e-02, 3.833e-02, 1.196e-01, 3.891e-02, 1.696e-01, 3.910e-02)); + r += mul(s2_8, M4(1.415e-03, 5.763e-02, -1.149e-02, -2.407e-01, 1.740e-03, -8.224e-02, -1.945e-02, 1.355e-02, -4.428e-02, 1.613e-02, -3.505e-02, -4.122e-02, -2.886e-02, -6.491e-02, -5.194e-02, -8.513e-02)); + r += mul(s3_0, M4(-1.765e-01, -1.367e-01, -4.111e-02, 1.888e-02, -4.251e-03, 1.376e-02, -3.862e-02, -8.980e-03, 1.037e-01, -1.789e-01, 9.146e-02, 2.300e-01, -1.614e-01, 1.308e-01, -1.819e-01, 1.665e-01)); + r += mul(s3_1, M4(-2.059e-01, -5.625e-02, 2.864e-02, -7.048e-02, -1.706e-03, -1.770e-01, -4.874e-02, -2.786e-02, -1.275e-01, -5.649e-02, 3.366e-02, 1.795e-01, -1.223e-02, -2.242e-01, -1.622e-01, 1.141e-01)); + r += mul(s3_2, M4(1.345e-01, 6.934e-02, 6.283e-02, 1.327e-01, 6.862e-02, -2.143e-01, 8.570e-02, -3.989e-02, -4.377e-02, -1.398e-01, 2.988e-01, 1.374e-01, 1.468e-01, 8.299e-02, -4.532e-02, 2.113e-01)); + r += mul(s3_3, M4(3.431e-01, -9.639e-03, 2.325e-01, -5.670e-02, -1.314e-01, 3.757e-02, -6.452e-02, 6.469e-02, -5.444e-03, -1.508e-01, -4.739e-01, -1.679e-01, 1.373e-01, -6.124e-02, 7.933e-03, -1.489e-02)); + r += mul(s3_4, M4(-1.132e-01, 5.289e-02, 1.535e-02, -2.451e-01, 3.783e-03, 1.595e-01, 9.528e-02, 1.430e-01, 1.694e-01, -1.169e-01, -2.842e-01, -2.346e-01, 3.864e-01, -1.825e-01, -2.749e-01, -1.994e-01)); + r += mul(s3_5, M4(-7.642e-03, 8.555e-02, -1.200e-02, 1.146e-01, 1.802e-02, 1.937e-01, 1.797e-01, 5.593e-03, 4.507e-02, -1.199e-01, -2.198e-01, 1.812e-01, -5.173e-03, 1.568e-01, 9.984e-02, -2.659e-02)); + r += mul(s3_6, M4(6.704e-02, 4.698e-02, -1.374e-02, -9.021e-02, -1.707e-01, 4.764e-03, -9.841e-03, 5.072e-02, 1.605e-01, -2.053e-01, -3.838e-02, -1.444e-02, 2.384e-02, -1.151e-01, -1.005e-01, 4.233e-02)); + r += mul(s3_7, M4(-8.390e-02, 1.908e-02, -1.100e-01, -8.602e-02, 4.900e-02, 1.116e-02, 2.053e-01, -5.726e-02, -9.621e-02, -1.169e-01, 2.024e-01, 4.824e-02, -2.096e-02, 3.369e-02, 2.029e-01, -1.462e-01)); + r += mul(s3_8, M4(1.567e-01, -2.444e-02, 9.509e-02, -1.816e-02, -3.936e-02, -2.473e-02, -1.129e-01, 2.242e-02, -3.106e-03, -1.018e-01, -1.701e-01, 1.499e-01, -1.430e-01, -3.654e-02, 2.967e-02, 8.369e-02)); + r += mul(s4_0, M4(1.034e-01, -5.312e-04, -1.239e-01, -5.456e-02, 1.879e-02, -7.676e-02, -5.956e-02, -1.783e-01, -1.130e-01, -6.370e-02, 2.026e-01, 3.057e-02, -2.113e-01, 5.926e-02, -5.394e-02, 1.535e-01)); + r += mul(s4_1, M4(-6.531e-03, -1.431e-01, -1.812e-01, 1.802e-01, 8.262e-03, 7.741e-02, -6.223e-02, 9.611e-03, -9.345e-02, -8.801e-02, 3.407e-02, 1.188e-01, 1.595e-01, -4.748e-02, 1.459e-02, 2.855e-01)); + r += mul(s4_2, M4(1.810e-01, -4.054e-02, -3.277e-02, -1.111e-01, 6.464e-02, -2.245e-01, 1.261e-02, -2.225e-01, 1.451e-01, 1.198e-01, 2.836e-02, 3.377e-02, 1.767e-01, -4.248e-02, 8.389e-02, 2.485e-02)); + r += mul(s4_3, M4(-9.627e-02, 5.986e-02, 7.569e-03, -7.105e-02, 2.928e-01, -1.040e-01, -2.868e-01, -1.463e-01, -8.511e-03, -1.502e-02, -7.755e-02, 1.688e-01, 6.127e-02, 8.810e-02, 3.685e-02, 2.663e-02)); + r += mul(s4_4, M4(-6.368e-02, 5.359e-02, -3.643e-02, 1.399e-01, 3.936e-03, 2.547e-01, 2.957e-01, 2.191e-01, 2.612e-01, 3.846e-02, 3.046e-02, -7.856e-02, -3.086e-02, -6.937e-02, 5.934e-02, 7.798e-02)); + r += mul(s4_5, M4(-1.666e-01, 4.368e-02, -9.936e-02, 5.513e-02, 2.653e-01, -7.287e-02, -2.554e-01, 2.655e-01, -1.452e-01, 5.002e-02, -6.006e-02, 3.174e-02, -5.631e-03, 7.299e-02, 1.471e-01, 6.928e-03)); + r += mul(s4_6, M4(7.689e-02, -6.132e-02, -9.584e-02, 5.564e-02, 9.063e-02, 1.710e-01, -6.893e-02, -1.494e-01, -1.700e-01, -5.163e-02, -7.758e-02, -4.896e-02, -1.714e-02, 3.621e-02, 8.242e-02, 2.643e-02)); + r += mul(s4_7, M4(1.566e-02, -1.998e-02, -1.708e-01, 2.358e-01, 2.403e-02, 2.645e-01, 4.161e-01, -1.649e-01, 2.306e-01, -3.243e-02, 9.435e-02, -1.145e-01, 1.212e-01, 7.266e-02, 1.598e-01, -7.062e-02)); + r += mul(s4_8, M4(3.270e-02, -1.166e-01, -3.694e-02, 2.545e-01, -1.235e-01, 1.676e-01, 3.960e-03, -1.373e-01, -5.666e-03, -1.110e-01, -9.305e-03, 6.505e-02, -7.349e-03, -2.651e-02, 7.352e-02, -6.788e-03)); + r += mul(s5_0, M4(8.014e-02, 1.658e-02, -5.292e-02, 1.630e-02, -7.409e-02, 1.580e-02, 5.897e-02, -1.103e-02, 8.100e-02, -1.677e-01, -2.744e-01, 8.982e-02, 4.863e-02, -7.768e-02, 2.005e-01, -8.596e-03)); + r += mul(s5_1, M4(-1.216e-01, -7.057e-02, 4.285e-02, 6.371e-02, 5.647e-02, 6.204e-02, 4.051e-03, 1.280e-02, -5.409e-02, 2.483e-02, 4.165e-02, -1.142e-01, 2.118e-01, -2.997e-01, -9.129e-02, 3.454e-01)); + r += mul(s5_2, M4(5.001e-02, 8.768e-02, -7.564e-02, 7.259e-02, -2.339e-02, -4.598e-02, 3.337e-02, 6.158e-02, 2.909e-01, -1.490e-01, 1.540e-01, 6.356e-02, -6.790e-03, 3.766e-02, 2.135e-02, 1.071e-01)); + r += mul(s5_3, M4(3.641e-02, 7.143e-02, -1.138e-01, -2.032e-02, -1.992e-02, -7.735e-02, -5.734e-02, -4.763e-02, -8.787e-03, 3.215e-02, 3.169e-02, 6.289e-02, 3.540e-01, -7.365e-02, -8.671e-02, 9.639e-02)); + r += mul(s5_4, M4(1.139e-01, -1.842e-01, 2.704e-01, -1.627e-01, -4.522e-02, -3.535e-02, 9.351e-02, -2.893e-02, 1.861e-01, 2.077e-01, 1.372e-02, 4.970e-02, 1.317e-01, -3.054e-01, -8.803e-02, 1.714e-01)); + r += mul(s5_5, M4(2.900e-02, 3.563e-03, 1.104e-01, -2.544e-01, 1.542e-02, -6.940e-02, 3.600e-03, 5.139e-02, -3.194e-01, 2.563e-01, 2.459e-02, -3.874e-02, -6.024e-02, 2.414e-02, -1.001e-01, -1.498e-01)); + r += mul(s5_6, M4(-4.244e-02, -5.413e-02, -9.869e-02, 2.158e-02, 1.469e-02, 7.325e-02, 1.743e-01, 1.407e-02, -3.738e-01, -2.959e-02, 3.194e-02, -1.635e-01, 1.413e-01, -4.843e-02, -1.413e-03, -3.039e-02)); + r += mul(s5_7, M4(1.139e-01, -6.672e-03, 2.730e-01, -3.003e-02, 2.715e-02, -3.701e-02, 2.281e-01, -1.225e-01, 2.238e-01, -8.357e-02, -6.010e-03, -2.614e-01, 7.331e-02, -1.523e-02, -2.548e-01, -8.554e-02)); + r += mul(s5_8, M4(3.213e-02, 1.268e-01, 3.449e-02, -2.570e-01, -1.225e-01, 7.178e-02, 9.433e-02, 2.491e-02, 1.620e-01, 1.357e-02, -2.706e-02, 6.437e-03, 1.109e-01, -7.013e-02, -6.792e-02, -1.037e-01)); + r += mul(s6_0, M4(8.426e-02, 1.621e-01, -3.307e-02, 6.085e-02, -2.910e-01, 1.052e-01, -1.113e-01, 1.969e-01, -1.820e-02, -4.381e-02, 5.765e-02, 8.801e-03, -1.752e-01, -4.596e-02, 2.692e-03, -1.809e-02)); + r += mul(s6_1, M4(5.368e-02, 8.830e-03, 1.342e-01, -1.547e-01, 1.712e-01, -2.743e-02, 2.409e-02, 2.343e-01, 2.959e-01, -6.927e-02, 1.156e-01, -2.541e-02, 1.364e-01, 1.695e-01, 1.817e-02, 5.368e-02)); + r += mul(s6_2, M4(5.028e-02, 1.692e-01, 2.213e-02, -7.803e-02, -1.072e-01, 4.685e-02, -5.682e-03, 5.716e-02, 1.669e-01, 8.173e-03, 1.611e-01, 1.414e-01, -1.356e-01, -2.232e-01, -8.235e-02, 1.440e-01)); + r += mul(s6_3, M4(-5.098e-02, 1.137e-01, -9.407e-02, -6.296e-02, -1.385e-01, 1.617e-01, -1.909e-01, 1.068e-01, -6.835e-03, -5.320e-02, -2.809e-01, 4.434e-02, -1.940e-01, 1.189e-01, 6.201e-03, -1.800e-02)); + r += mul(s6_4, M4(-6.221e-02, 5.196e-02, -2.060e-02, 5.637e-02, 3.642e-01, 5.141e-02, 2.882e-02, -2.343e-01, 1.591e-01, -1.559e-02, -1.596e-01, 2.177e-02, 7.673e-02, 3.992e-01, -1.146e-01, 2.448e-01)); + r += mul(s6_5, M4(-5.695e-02, 7.100e-02, -2.178e-02, 1.582e-01, 2.372e-02, -2.224e-02, -4.140e-02, -8.826e-02, -4.937e-02, -1.031e-01, -1.706e-01, -4.947e-02, -1.536e-01, 1.721e-01, 6.676e-03, 8.255e-02)); + r += mul(s6_6, M4(-9.010e-02, 1.503e-01, 7.492e-02, -1.993e-03, -3.702e-01, 1.511e-01, -3.409e-02, -2.098e-02, -4.503e-01, -6.997e-02, -1.055e-01, -2.102e-02, -7.406e-02, 2.809e-02, 3.084e-01, 8.653e-02)); + r += mul(s6_7, M4(-1.697e-01, 1.711e-01, 1.144e-01, 2.860e-02, 2.195e-02, 1.660e-03, -7.057e-02, -1.680e-01, -1.430e-01, -3.346e-02, -5.121e-02, 2.135e-02, 1.318e-01, -1.161e-02, 1.916e-01, 1.212e-01)); + r += mul(s6_8, M4(-3.071e-02, 1.432e-01, 1.052e-01, 7.180e-02, -4.928e-02, 5.232e-02, -3.310e-03, -3.017e-05, 1.398e-01, -7.870e-02, -9.837e-02, 2.374e-02, 1.507e-01, -8.493e-02, -5.154e-02, 5.780e-02)); + r += mul(s7_0, M4(2.455e-01, -7.282e-02, 7.852e-02, 4.070e-02, -3.297e-02, 4.145e-02, -1.426e-01, 7.745e-02, -3.729e-02, 8.566e-03, 1.435e-01, -1.010e-01, 6.033e-02, -8.686e-03, -7.574e-02, -3.943e-02)); + r += mul(s7_1, M4(-5.348e-02, -1.035e-01, 1.114e-01, -1.529e-01, -6.293e-03, -3.968e-02, -6.971e-02, 1.515e-01, 7.013e-02, 1.038e-01, -3.970e-02, -1.193e-01, 1.365e-01, 6.677e-02, 2.004e-02, -1.010e-02)); + r += mul(s7_2, M4(1.277e-02, -3.852e-02, -6.031e-02, -1.067e-02, -1.349e-02, -5.066e-02, -9.634e-02, 1.096e-01, -4.221e-02, -2.845e-02, -6.615e-02, -1.064e-01, -5.977e-02, -1.288e-01, -1.142e-01, 3.774e-02)); + r += mul(s7_3, M4(1.835e-01, -1.255e-01, 6.001e-02, -9.365e-02, -8.400e-02, -2.954e-02, -1.218e-01, 2.082e-02, 9.881e-03, -6.183e-02, 7.922e-02, 4.288e-02, -8.498e-02, -7.827e-02, -1.268e-02, 5.906e-06)); + r += mul(s7_4, M4(-1.167e-02, -1.976e-01, 1.218e-01, 2.846e-02, 1.403e-01, -1.914e-02, -3.142e-02, -6.645e-03, 1.120e-01, 4.741e-02, -4.679e-02, 1.165e-01, 6.907e-02, 9.039e-02, -1.763e-01, 6.242e-02)); + r += mul(s7_5, M4(-6.373e-02, -4.400e-02, -3.731e-02, -3.382e-02, 7.034e-02, -4.918e-02, 8.839e-03, -4.738e-02, -1.555e-02, -2.111e-02, -1.032e-02, 7.233e-03, 8.502e-02, 9.928e-02, -1.683e-02, 1.288e-01)); + r += mul(s7_6, M4(1.680e-01, 1.016e-02, 6.608e-02, -4.082e-03, 3.294e-02, 4.425e-02, -1.113e-01, -6.943e-02, -3.064e-02, -1.889e-02, 9.421e-02, 2.824e-02, 6.753e-02, -7.434e-02, -5.314e-02, -2.174e-02)); + r += mul(s7_7, M4(-3.561e-02, -1.050e-01, -1.267e-01, -7.304e-02, 9.945e-02, -1.332e-01, -4.349e-02, -7.886e-02, -7.833e-02, 1.614e-01, 7.414e-02, 2.130e-03, 1.372e-01, 1.233e-02, -1.111e-01, 3.728e-02)); + r += mul(s7_8, M4(-1.044e-02, -5.582e-02, 1.359e-02, -1.386e-02, -3.630e-02, -1.954e-02, -1.212e-01, 1.234e-02, -2.190e-02, 1.427e-02, -3.315e-02, 1.844e-02, -1.252e-01, -5.419e-02, -3.355e-02, 2.707e-03)); + r += V4(3.455e-02, -5.682e-02, 3.028e-02, 8.647e-03); + return r; +} + +V4 f3(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-1.096e-01, -1.852e-02, -1.637e-02, 4.392e-02, -2.820e-02, 2.433e-02, -1.942e-01, -1.233e-01, 1.259e-01, -9.204e-02, 2.761e-02, 2.025e-02, -5.680e-02, 2.470e-02, 1.573e-01, 1.047e-01)); + r += mul(s0_1, M4(2.607e-01, -2.214e-02, 3.786e-02, 7.953e-02, 1.091e+00, -3.300e-01, -5.729e-02, 1.207e-01, -7.803e-02, -1.589e-01, 1.505e-02, -2.123e-02, 1.959e-01, 5.892e-02, -1.357e-02, 1.410e-01)); + r += mul(s0_2, M4(-5.059e-02, -7.549e-02, 4.878e-03, 7.983e-02, -1.802e-01, 1.381e-01, -7.327e-02, -1.975e-01, 1.452e-02, 1.400e-01, -1.519e-01, 1.185e-01, 2.760e-02, -8.449e-02, 3.833e-02, 1.663e-02)); + r += mul(s0_3, M4(-4.666e-02, -3.460e-04, 1.701e-02, -8.272e-02, -1.174e-01, -1.036e-01, 1.497e-03, 2.781e-01, 9.424e-02, 2.704e-02, -3.550e-02, -1.404e-01, 1.897e-01, 1.363e-01, 1.109e-01, 3.753e-02)); + r += mul(s0_4, M4(-1.341e-01, 3.821e-02, -3.010e-02, -1.671e-01, -1.511e-01, -6.140e-01, -1.095e-01, -3.052e-01, 2.433e-01, -3.002e-02, -2.312e-01, -8.997e-04, 1.391e-02, 1.397e-01, 1.878e-01, -2.238e-02)); + r += mul(s0_5, M4(1.033e-01, -8.012e-03, -6.417e-02, 9.283e-02, -1.379e-01, -4.926e-02, -2.075e-01, -1.917e-01, 4.786e-02, 2.361e-02, -5.584e-02, 9.578e-02, -5.804e-02, -4.844e-03, -1.844e-02, -1.057e-02)); + r += mul(s0_6, M4(-2.536e-02, -5.752e-02, 2.363e-02, 1.713e-01, -5.923e-01, 3.168e-01, 1.674e-01, 1.652e-01, -6.523e-02, -3.655e-03, -5.167e-02, 1.683e-02, -1.840e-01, 5.627e-02, -1.028e-01, 1.927e-01)); + r += mul(s0_7, M4(-1.704e-01, 1.462e-02, 3.242e-02, 7.732e-02, -6.424e-01, 1.905e-01, -8.243e-02, 7.533e-02, 2.171e-01, 6.840e-02, -9.205e-02, -6.206e-03, 5.733e-02, -1.789e-02, -9.110e-02, 5.664e-02)); + r += mul(s0_8, M4(-5.938e-03, -7.444e-02, 5.562e-02, -6.044e-02, -3.737e-01, 1.747e-01, 1.633e-01, 1.036e-01, 1.738e-02, -2.388e-02, -1.659e-01, -8.670e-02, 7.200e-02, -1.353e-01, -4.155e-04, -8.666e-02)); + r += mul(s1_0, M4(1.040e-01, 4.584e-04, 7.114e-02, -1.014e-01, -4.784e-02, 8.807e-02, -2.202e-02, -6.059e-02, -1.686e-02, -6.356e-02, 1.230e-01, 1.079e-01, -1.823e-02, 2.432e-01, -1.581e-01, -2.449e-01)); + r += mul(s1_1, M4(3.786e-02, -1.782e-01, -4.362e-02, 8.725e-02, 1.882e-03, -5.855e-02, 1.016e-01, 8.599e-02, -1.231e-01, 5.488e-02, 5.245e-02, -8.730e-02, -3.452e-01, 1.340e-01, -2.548e-02, -2.157e-01)); + r += mul(s1_2, M4(-1.819e-03, -1.625e-01, 2.959e-02, 1.547e-02, -6.048e-03, 1.479e-01, -1.464e-01, 7.402e-02, -1.513e-01, 3.002e-02, 6.133e-02, 5.366e-02, -1.184e-01, 3.590e-01, -1.053e-01, -1.425e-01)); + r += mul(s1_3, M4(1.404e-01, -9.241e-02, 1.825e-01, 2.719e-04, -5.835e-02, 6.595e-03, -9.739e-03, -1.057e-01, 1.661e-01, -1.151e-02, 6.201e-02, 1.203e-02, 3.053e-01, -8.240e-03, 6.581e-02, -1.970e-02)); + r += mul(s1_4, M4(-2.797e-01, 2.141e-02, 1.896e-01, 3.946e-02, -1.040e-01, -2.634e-01, 1.826e-01, -2.420e-01, -2.634e-01, -1.385e-01, 1.424e-01, -1.114e-01, 1.808e-01, -1.194e-01, 9.477e-02, -2.438e-01)); + r += mul(s1_5, M4(3.524e-01, -2.425e-02, -8.163e-02, 1.418e-02, 1.681e-01, 1.876e-02, -1.001e-01, 5.731e-02, -7.652e-02, -2.750e-02, 2.377e-01, -1.445e-01, -1.499e-01, -6.638e-02, 2.818e-02, -2.138e-01)); + r += mul(s1_6, M4(-3.080e-02, 1.693e-02, 5.671e-03, 1.528e-01, 5.871e-02, -2.643e-02, -5.709e-02, 4.359e-02, -2.522e-02, 1.197e-01, -9.253e-02, 4.255e-02, 1.676e-01, 2.026e-01, -2.956e-01, -2.714e-01)); + r += mul(s1_7, M4(-1.606e-01, 6.631e-02, -1.906e-01, -2.287e-01, -6.485e-02, -7.836e-02, 4.530e-02, 5.725e-02, 6.908e-02, 1.061e-01, 1.805e-01, 7.356e-02, 2.819e-01, 1.429e-01, -1.723e-01, -3.174e-02)); + r += mul(s1_8, M4(-8.581e-02, -2.105e-02, -5.922e-03, -3.853e-02, 4.403e-02, 7.008e-02, 2.021e-02, 8.475e-02, -4.575e-02, -1.065e-01, 5.490e-02, 8.552e-02, 1.052e-01, -5.821e-02, -3.439e-02, -1.344e-02)); + r += mul(s2_0, M4(-9.902e-02, -3.794e-02, 1.320e-01, 1.776e-02, -7.469e-02, -1.189e-02, -7.807e-02, -7.543e-02, 4.629e-02, 3.148e-02, -1.269e-01, -1.108e-01, -6.617e-02, 5.129e-02, -1.180e-01, 2.706e-03)); + r += mul(s2_1, M4(9.910e-02, -1.586e-01, 8.186e-02, 5.193e-01, 2.276e-01, 2.274e-02, -1.020e-01, -1.754e-03, 1.400e-01, -8.362e-02, 3.942e-02, 5.102e-02, -8.412e-02, 6.594e-02, -2.943e-02, -6.063e-02)); + r += mul(s2_2, M4(1.368e-02, 4.901e-02, -1.587e-01, -3.238e-02, 4.454e-02, -1.343e-01, -1.012e-01, -2.655e-01, -1.020e-01, 1.676e-01, 1.253e-01, -9.942e-02, 3.205e-02, -5.055e-02, -1.117e-01, -1.089e-01)); + r += mul(s2_3, M4(-5.653e-03, -1.945e-02, 1.854e-01, 7.696e-02, 1.377e-02, -1.351e-01, -2.388e-01, -1.644e-01, 1.011e-02, -5.458e-02, -7.235e-02, 2.097e-02, -1.990e-02, 1.203e-02, 9.880e-02, -1.743e-01)); + r += mul(s2_4, M4(-8.908e-02, 7.718e-03, 6.576e-02, 1.137e-03, 7.829e-02, 2.680e-01, -1.524e-01, -1.810e-01, -6.039e-02, 1.009e-02, -7.063e-02, 2.310e-01, -2.906e-01, -6.006e-02, 1.890e-01, -1.672e-01)); + r += mul(s2_5, M4(-2.529e-03, 8.173e-02, 3.242e-02, -5.432e-02, 3.282e-02, -1.262e-01, 1.755e-01, 9.609e-03, -7.836e-02, 9.272e-02, 3.969e-02, 1.379e-01, -1.428e-01, -2.265e-02, -1.399e-01, 9.609e-02)); + r += mul(s2_6, M4(8.486e-02, -3.489e-02, 7.254e-02, 2.976e-02, 4.917e-02, -7.064e-02, -7.310e-02, -1.542e-01, -1.208e-01, -1.891e-02, -2.144e-02, -1.589e-02, -3.039e-04, 1.014e-01, -1.183e-02, -1.660e-02)); + r += mul(s2_7, M4(1.340e-01, 1.040e-01, -7.289e-02, -3.622e-02, -4.446e-03, -6.201e-02, 1.615e-01, 1.755e-01, 7.300e-02, 8.229e-02, -8.150e-02, 4.328e-02, -5.828e-02, -5.730e-03, -1.219e-01, -1.250e-01)); + r += mul(s2_8, M4(-8.284e-02, -1.916e-02, 1.192e-01, -1.383e-01, 2.001e-02, -8.057e-03, 8.148e-02, -8.773e-04, 2.151e-02, 1.743e-04, -6.163e-04, -4.874e-02, 1.019e-01, -1.012e-02, -1.159e-02, -3.961e-02)); + r += mul(s3_0, M4(-9.251e-03, 1.791e-01, 6.008e-02, -1.205e-01, -1.015e-02, 7.059e-02, -9.721e-02, -1.524e-02, -1.661e-01, 1.372e-01, 4.558e-02, -1.628e-01, -1.264e-01, -3.679e-02, -3.447e-02, 2.277e-02)); + r += mul(s3_1, M4(-1.366e-01, 2.667e-01, -4.057e-02, 1.793e-02, -1.248e-01, 1.381e-01, 1.214e-01, 5.758e-02, 9.372e-02, -1.240e-01, 3.346e-01, -7.787e-02, 6.877e-02, -3.500e-01, 1.308e-01, 3.518e-02)); + r += mul(s3_2, M4(-3.532e-03, -1.039e-01, -1.171e-01, 6.105e-02, 2.353e-01, -1.094e-01, 1.156e-01, -2.502e-03, -2.945e-01, 1.159e-01, 2.745e-01, 7.918e-02, 6.662e-03, -6.117e-02, 3.318e-02, 6.362e-03)); + r += mul(s3_3, M4(5.691e-02, -8.692e-02, -8.899e-02, 1.076e-01, 8.120e-03, 1.426e-02, -1.447e-01, -3.731e-02, 7.444e-02, -1.054e-01, 1.010e-01, 1.529e-01, 4.061e-02, 1.064e-01, -1.352e-01, -1.880e-01)); + r += mul(s3_4, M4(-1.729e-01, 2.776e-02, -7.887e-03, -2.290e-01, -2.224e-01, 2.358e-03, -7.686e-02, -2.962e-02, 2.791e-01, -3.004e-01, 2.505e-02, -2.687e-01, 1.216e-01, 9.880e-02, 7.356e-02, -6.637e-02)); + r += mul(s3_5, M4(1.795e-01, -3.148e-02, -2.065e-01, -2.491e-01, -1.342e-01, -1.418e-01, 1.059e-01, -1.083e-01, -2.623e-02, 1.010e-01, 1.061e-01, 2.263e-01, 1.283e-02, 2.022e-01, 2.694e-02, 1.391e-01)); + r += mul(s3_6, M4(-2.450e-02, 1.307e-02, -8.529e-03, 3.717e-02, 4.865e-02, 1.302e-01, 4.016e-02, -4.964e-02, -1.244e-01, -5.523e-02, 1.237e-02, -4.402e-02, -1.660e-02, 4.089e-02, -9.886e-02, -9.060e-03)); + r += mul(s3_7, M4(-8.691e-02, -5.331e-02, 1.517e-01, 1.034e-01, -9.627e-02, 3.671e-02, 7.032e-02, 2.741e-02, 1.266e-01, 1.678e-02, -7.681e-02, -7.390e-02, -5.747e-02, 2.561e-01, -1.791e-02, 4.539e-02)); + r += mul(s3_8, M4(-7.839e-02, 6.835e-03, -3.815e-02, -6.703e-02, 1.276e-02, -4.495e-02, -8.536e-02, -5.965e-02, 7.876e-02, -7.166e-02, 1.930e-01, 1.739e-01, 2.574e-02, -6.235e-02, 1.674e-01, -2.943e-02)); + r += mul(s4_0, M4(3.382e-02, -5.765e-02, -1.294e-01, -1.117e-01, 7.191e-02, -1.291e-01, -1.010e-01, -6.787e-02, -9.919e-02, -1.310e-02, -5.468e-02, -8.673e-02, -4.614e-02, 2.058e-02, 1.568e-02, 6.677e-02)); + r += mul(s4_1, M4(9.792e-02, -1.954e-01, -1.295e-01, -9.406e-02, 7.871e-03, 2.065e-02, -1.771e-01, -1.587e-01, 1.736e-02, -7.412e-02, -1.920e-02, 6.103e-02, -1.134e-01, -7.384e-02, 2.419e-01, -2.548e-01)); + r += mul(s4_2, M4(-1.086e-01, -6.933e-02, -2.300e-02, -4.260e-02, 7.342e-02, 1.651e-01, -2.871e-01, -1.338e-01, 2.483e-02, 1.475e-02, 2.509e-02, 8.418e-02, 9.221e-02, 8.517e-02, -3.979e-02, 1.869e-02)); + r += mul(s4_3, M4(-1.124e-01, 1.399e-01, -2.047e-01, -1.929e-01, 6.006e-02, 3.435e-02, 2.235e-01, 4.982e-02, -1.128e-01, -2.094e-02, 3.461e-01, -9.115e-04, -7.437e-02, -2.786e-03, 9.743e-02, 1.126e-01)); + r += mul(s4_4, M4(-2.532e-01, -1.764e-02, -7.388e-02, 2.223e-01, 3.639e-01, 1.871e-01, 7.373e-02, 9.498e-02, 1.290e-01, 1.640e-02, 3.807e-02, 1.783e-01, -6.746e-02, 2.492e-02, -2.109e-01, -7.012e-02)); + r += mul(s4_5, M4(-2.031e-01, -1.759e-01, -4.291e-02, -1.635e-01, 1.516e-01, 1.822e-01, -8.788e-02, -9.115e-02, -3.340e-02, 1.875e-02, -1.274e-01, -1.669e-01, -4.712e-02, 2.403e-02, 2.677e-02, -9.679e-02)); + r += mul(s4_6, M4(-1.202e-01, -1.172e-01, 1.657e-01, 1.462e-01, 1.135e-01, -2.146e-02, 1.613e-01, -8.259e-02, -3.707e-02, 1.363e-01, 1.371e-01, -8.764e-02, 7.924e-02, 3.371e-02, 7.389e-02, 2.623e-02)); + r += mul(s4_7, M4(-4.097e-03, -6.457e-02, 3.019e-01, 9.493e-02, -1.907e-01, 2.051e-01, 1.891e-01, 1.184e-01, -6.448e-02, -3.581e-02, -9.772e-03, -1.005e-02, -9.187e-02, -5.031e-02, -7.213e-02, 4.266e-02)); + r += mul(s4_8, M4(4.281e-02, -5.041e-02, 1.101e-01, 9.184e-02, -2.280e-01, 6.764e-03, -1.061e-01, -2.754e-01, 2.351e-02, -4.372e-02, -4.200e-02, 1.559e-02, -1.357e-02, 3.516e-02, 4.607e-02, -1.332e-02)); + r += mul(s5_0, M4(-7.007e-02, 1.679e-01, -1.274e-02, 7.591e-02, 1.389e-02, 1.539e-02, -9.365e-02, 8.885e-02, -7.271e-02, 4.573e-02, 1.978e-01, 3.180e-02, 3.804e-02, -1.208e-01, -1.929e-01, 1.365e-01)); + r += mul(s5_1, M4(-3.422e-03, 9.937e-02, 2.542e-02, 1.253e-01, -7.473e-02, -1.020e-03, -1.301e-02, 5.780e-02, 1.960e-01, -7.564e-02, 8.091e-02, 4.205e-02, -3.428e-01, -1.536e-01, -1.327e-01, -1.579e-01)); + r += mul(s5_2, M4(9.969e-02, -1.642e-01, -5.405e-02, 1.528e-01, 3.682e-02, -1.369e-02, 1.060e-01, -5.419e-02, 9.039e-03, -3.165e-02, -8.450e-02, -8.017e-02, -8.518e-02, 2.551e-02, -1.087e-01, 1.125e-01)); + r += mul(s5_3, M4(-1.152e-01, 7.566e-02, 7.127e-02, -4.112e-02, 3.422e-02, -2.033e-01, 7.094e-02, -3.279e-03, 1.251e-01, -1.479e-01, 3.210e-01, 2.175e-02, 1.728e-01, -5.799e-02, -7.935e-03, 9.648e-02)); + r += mul(s5_4, M4(2.459e-01, 2.175e-01, 2.886e-02, -6.984e-02, 1.226e-01, 7.211e-03, 1.837e-02, 9.922e-02, 4.560e-01, -1.017e-01, 2.737e-02, 6.745e-02, 1.495e-03, 1.674e-01, -1.435e-01, -4.169e-02)); + r += mul(s5_5, M4(-7.349e-02, -5.326e-02, 1.862e-01, -1.118e-01, -6.708e-02, -1.111e-01, -3.200e-02, -1.652e-01, -3.148e-03, -4.066e-02, -7.074e-02, -5.107e-02, -3.497e-02, -1.160e-01, -1.724e-01, 5.532e-03)); + r += mul(s5_6, M4(4.559e-02, 8.109e-02, 8.744e-02, 8.321e-02, -8.380e-03, 8.471e-02, -9.455e-02, -8.131e-02, -2.126e-01, 1.962e-01, -1.948e-02, 7.930e-02, 1.526e-01, -1.633e-01, -6.995e-02, 8.871e-02)); + r += mul(s5_7, M4(-6.974e-02, 5.436e-02, 3.158e-02, 9.851e-02, -1.683e-02, 1.089e-01, -3.526e-02, -8.762e-02, -2.212e-01, -4.418e-02, -1.515e-01, 6.581e-02, 2.384e-01, -1.836e-02, -6.843e-02, -7.604e-02)); + r += mul(s5_8, M4(4.627e-03, 5.753e-02, -6.744e-02, -2.015e-01, -4.092e-02, 6.422e-02, 1.893e-02, -2.088e-01, -9.010e-02, 2.032e-02, -6.638e-02, -3.300e-03, 8.718e-02, -2.528e-02, 2.858e-02, 1.160e-01)); + r += mul(s6_0, M4(6.870e-02, 1.131e-02, 7.865e-02, -3.451e-02, 1.591e-02, -1.381e-01, -9.905e-02, -2.441e-01, -1.138e-01, 2.561e-01, -2.368e-02, -1.296e-01, 1.939e-01, -2.497e-01, -4.962e-02, -1.540e-01)); + r += mul(s6_1, M4(1.207e-01, 1.171e-01, -9.254e-02, -8.790e-03, -5.541e-02, -1.699e-01, -2.360e-02, -1.511e-01, 4.065e-02, -1.579e-01, -1.230e-01, 3.388e-02, -7.535e-02, -2.809e-04, -1.092e-01, 8.226e-02)); + r += mul(s6_2, M4(1.462e-01, 1.123e-02, -1.396e-01, 3.841e-02, -1.342e-01, 1.159e-01, 7.373e-03, -9.726e-02, 1.521e-01, 2.392e-01, -3.398e-02, -7.629e-02, 3.649e-02, 1.545e-01, 1.291e-01, -1.353e-01)); + r += mul(s6_3, M4(1.193e-01, 6.714e-02, -5.676e-02, -6.763e-02, 2.939e-01, -4.573e-02, -2.876e-02, 7.910e-02, 2.628e-01, -3.672e-02, 5.333e-02, -1.391e-01, -2.088e-02, 3.584e-01, 3.513e-02, 3.537e-02)); + r += mul(s6_4, M4(-3.668e-02, -4.670e-02, 7.637e-02, -3.769e-02, 3.771e-02, 1.010e-01, -2.853e-01, 1.099e-01, -1.628e-02, -2.058e-01, -5.978e-02, 2.668e-01, -2.075e-01, -2.548e-01, 2.696e-01, 1.503e-01)); + r += mul(s6_5, M4(-9.871e-02, 1.987e-01, -5.740e-02, 6.089e-02, -1.584e-01, 8.837e-02, -3.021e-02, 1.039e-01, -9.652e-02, -1.423e-01, -4.528e-02, 3.550e-02, 8.129e-02, 7.949e-02, -3.520e-02, 1.582e-01)); + r += mul(s6_6, M4(-9.904e-03, 5.141e-02, -4.732e-03, 2.337e-02, -3.112e-03, 1.407e-01, 6.291e-02, 5.261e-02, 1.129e-02, 1.724e-01, 1.948e-01, 1.209e-01, -3.328e-02, 6.157e-02, -1.265e-01, -1.565e-01)); + r += mul(s6_7, M4(1.120e-01, 1.573e-01, 7.552e-02, -1.189e-01, -1.018e-01, -5.837e-03, 1.956e-01, -1.450e-01, -1.985e-01, -2.056e-01, 1.990e-01, 2.739e-02, -7.748e-02, 2.858e-02, -1.676e-01, -2.205e-01)); + r += mul(s6_8, M4(3.343e-02, -1.598e-02, 8.243e-02, -1.057e-01, -9.837e-02, -1.382e-01, 4.827e-02, -2.322e-02, -6.006e-02, -1.225e-02, -8.345e-03, 3.788e-02, 7.137e-02, -8.822e-02, -1.240e-01, 1.587e-01)); + r += mul(s7_0, M4(4.197e-03, -9.150e-02, 2.243e-02, 1.510e-01, -4.178e-02, -4.519e-03, -2.065e-01, -1.866e-01, -6.665e-02, 6.482e-02, -3.272e-02, -1.524e-02, -5.689e-02, -8.562e-02, -1.224e-01, -5.034e-02)); + r += mul(s7_1, M4(-2.028e-01, 1.248e-02, -7.040e-02, 6.906e-02, -1.455e-01, -9.177e-02, -2.913e-02, -8.226e-02, 8.236e-02, 1.811e-01, -5.199e-02, 9.111e-02, 2.452e-01, -2.731e-03, -1.706e-02, 8.847e-02)); + r += mul(s7_2, M4(4.152e-02, -2.097e-02, -6.550e-02, 5.457e-02, -8.043e-02, 4.064e-02, 2.533e-02, 4.574e-02, -5.159e-02, -2.161e-02, -4.714e-02, -1.196e-01, 1.831e-02, -7.269e-02, -2.514e-02, -1.522e-01)); + r += mul(s7_3, M4(1.127e-01, -1.283e-01, -6.297e-02, 1.758e-02, 1.899e-01, 2.562e-02, -1.396e-01, -8.503e-02, -3.588e-02, 8.375e-02, -1.897e-01, 3.284e-02, -5.664e-02, 7.889e-02, -1.285e-01, -4.259e-02)); + r += mul(s7_4, M4(1.804e-01, -1.357e-01, -9.422e-02, 1.343e-01, 6.370e-02, -8.731e-02, -2.610e-01, 3.235e-02, 2.090e-02, 1.737e-02, 3.840e-02, 6.650e-02, -1.454e-01, -9.199e-02, 1.087e-01, -8.518e-02)); + r += mul(s7_5, M4(-7.470e-02, 1.550e-02, 5.159e-02, 1.604e-01, -2.909e-02, -3.405e-02, -4.281e-02, 1.604e-01, -7.784e-02, 9.256e-02, 1.461e-01, 1.052e-01, -6.975e-02, 2.712e-02, 9.854e-02, 6.271e-02)); + r += mul(s7_6, M4(5.877e-02, -1.074e-01, -1.386e-01, 5.543e-02, -6.297e-03, -4.513e-02, -5.606e-02, 8.423e-02, -9.024e-02, -8.228e-02, 5.863e-02, -1.366e-02, -6.564e-02, -4.470e-04, 1.867e-03, 1.007e-01)); + r += mul(s7_7, M4(5.408e-02, -1.122e-02, -1.600e-01, -2.141e-02, 2.848e-01, -3.632e-02, 5.869e-02, -1.663e-01, 1.365e-01, 8.206e-03, 6.789e-02, -3.498e-02, 3.298e-02, -9.073e-02, 4.929e-02, -3.582e-02)); + r += mul(s7_8, M4(6.673e-02, -8.083e-02, -5.151e-03, -4.743e-02, 3.548e-02, -1.058e-01, -6.822e-02, -2.533e-02, -2.161e-02, -8.336e-02, 1.863e-02, -4.424e-02, 8.914e-02, 1.755e-02, 6.385e-02, 3.120e-02)); + r += V4(-4.162e-03, -6.545e-02, 3.186e-02, -6.206e-02); + return r; +} + +void Pass4(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = Rmp8x8(tid.x) + blockStart; + uint2 size = GetInputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = (gxy + 0.5) * pt; + + V4 s0_0 = l0(-1.0, -1.0); + V4 s0_1 = l0(0.0, -1.0); + V4 s0_2 = l0(1.0, -1.0); + V4 s0_3 = l0(-1.0, 0.0); + V4 s0_4 = l0(0.0, 0.0); + V4 s0_5 = l0(1.0, 0.0); + V4 s0_6 = l0(-1.0, 1.0); + V4 s0_7 = l0(0.0, 1.0); + V4 s0_8 = l0(1.0, 1.0); + V4 s1_0 = -max(-s0_0, 0.0); + V4 s1_1 = -max(-s0_1, 0.0); + V4 s1_2 = -max(-s0_2, 0.0); + V4 s1_3 = -max(-s0_3, 0.0); + V4 s1_4 = -max(-s0_4, 0.0); + V4 s1_5 = -max(-s0_5, 0.0); + V4 s1_6 = -max(-s0_6, 0.0); + V4 s1_7 = -max(-s0_7, 0.0); + V4 s1_8 = -max(-s0_8, 0.0); + s0_0 = max(s0_0, 0.0); + s0_1 = max(s0_1, 0.0); + s0_2 = max(s0_2, 0.0); + s0_3 = max(s0_3, 0.0); + s0_4 = max(s0_4, 0.0); + s0_5 = max(s0_5, 0.0); + s0_6 = max(s0_6, 0.0); + s0_7 = max(s0_7, 0.0); + s0_8 = max(s0_8, 0.0); + + V4 s2_0 = l1(-1.0, -1.0); + V4 s2_1 = l1(0.0, -1.0); + V4 s2_2 = l1(1.0, -1.0); + V4 s2_3 = l1(-1.0, 0.0); + V4 s2_4 = l1(0.0, 0.0); + V4 s2_5 = l1(1.0, 0.0); + V4 s2_6 = l1(-1.0, 1.0); + V4 s2_7 = l1(0.0, 1.0); + V4 s2_8 = l1(1.0, 1.0); + V4 s3_0 = -max(-s2_0, 0.0); + V4 s3_1 = -max(-s2_1, 0.0); + V4 s3_2 = -max(-s2_2, 0.0); + V4 s3_3 = -max(-s2_3, 0.0); + V4 s3_4 = -max(-s2_4, 0.0); + V4 s3_5 = -max(-s2_5, 0.0); + V4 s3_6 = -max(-s2_6, 0.0); + V4 s3_7 = -max(-s2_7, 0.0); + V4 s3_8 = -max(-s2_8, 0.0); + s2_0 = max(s2_0, 0.0); + s2_1 = max(s2_1, 0.0); + s2_2 = max(s2_2, 0.0); + s2_3 = max(s2_3, 0.0); + s2_4 = max(s2_4, 0.0); + s2_5 = max(s2_5, 0.0); + s2_6 = max(s2_6, 0.0); + s2_7 = max(s2_7, 0.0); + s2_8 = max(s2_8, 0.0); + + V4 s4_0 = l2(-1.0, -1.0); + V4 s4_1 = l2(0.0, -1.0); + V4 s4_2 = l2(1.0, -1.0); + V4 s4_3 = l2(-1.0, 0.0); + V4 s4_4 = l2(0.0, 0.0); + V4 s4_5 = l2(1.0, 0.0); + V4 s4_6 = l2(-1.0, 1.0); + V4 s4_7 = l2(0.0, 1.0); + V4 s4_8 = l2(1.0, 1.0); + V4 s5_0 = -max(-s4_0, 0.0); + V4 s5_1 = -max(-s4_1, 0.0); + V4 s5_2 = -max(-s4_2, 0.0); + V4 s5_3 = -max(-s4_3, 0.0); + V4 s5_4 = -max(-s4_4, 0.0); + V4 s5_5 = -max(-s4_5, 0.0); + V4 s5_6 = -max(-s4_6, 0.0); + V4 s5_7 = -max(-s4_7, 0.0); + V4 s5_8 = -max(-s4_8, 0.0); + s4_0 = max(s4_0, 0.0); + s4_1 = max(s4_1, 0.0); + s4_2 = max(s4_2, 0.0); + s4_3 = max(s4_3, 0.0); + s4_4 = max(s4_4, 0.0); + s4_5 = max(s4_5, 0.0); + s4_6 = max(s4_6, 0.0); + s4_7 = max(s4_7, 0.0); + s4_8 = max(s4_8, 0.0); + + V4 s6_0 = l3(-1.0, -1.0); + V4 s6_1 = l3(0.0, -1.0); + V4 s6_2 = l3(1.0, -1.0); + V4 s6_3 = l3(-1.0, 0.0); + V4 s6_4 = l3(0.0, 0.0); + V4 s6_5 = l3(1.0, 0.0); + V4 s6_6 = l3(-1.0, 1.0); + V4 s6_7 = l3(0.0, 1.0); + V4 s6_8 = l3(1.0, 1.0); + V4 s7_0 = -max(-s6_0, 0.0); + V4 s7_1 = -max(-s6_1, 0.0); + V4 s7_2 = -max(-s6_2, 0.0); + V4 s7_3 = -max(-s6_3, 0.0); + V4 s7_4 = -max(-s6_4, 0.0); + V4 s7_5 = -max(-s6_5, 0.0); + V4 s7_6 = -max(-s6_6, 0.0); + V4 s7_7 = -max(-s6_7, 0.0); + V4 s7_8 = -max(-s6_8, 0.0); + s6_0 = max(s6_0, 0.0); + s6_1 = max(s6_1, 0.0); + s6_2 = max(s6_2, 0.0); + s6_3 = max(s6_3, 0.0); + s6_4 = max(s6_4, 0.0); + s6_5 = max(s6_5, 0.0); + s6_6 = max(s6_6, 0.0); + s6_7 = max(s6_7, 0.0); + s6_8 = max(s6_8, 0.0); + + t4[gxy] = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t5[gxy] = f1(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t6[gxy] = f2(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t7[gxy] = f3(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); +} + +//!PASS 5 +//!DESC conv4 +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 +//!IN t4, t5, t6, t7 +//!OUT t0, t1, t2, t3 + +#define l0(x, y) V4(O(t4, float2(x, y))) +#define l1(x, y) V4(O(t5, float2(x, y))) +#define l2(x, y) V4(O(t6, float2(x, y))) +#define l3(x, y) V4(O(t7, float2(x, y))) + +V4 f0(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(6.038e-02, -1.027e-01, 5.822e-02, -6.061e-02, -7.843e-02, 5.764e-02, -4.207e-02, -6.612e-02, 5.435e-02, -1.535e-02, -2.172e-02, 6.898e-02, -6.557e-02, 8.073e-02, 1.011e-02, -4.904e-02)); + r += mul(s0_1, M4(8.764e-04, 1.018e-01, 1.772e-01, 1.661e-01, 6.140e-02, -2.055e-02, -1.707e-01, -7.450e-02, 7.612e-02, -1.036e-01, 1.102e-01, -1.187e-01, -1.174e-02, -3.453e-02, -9.480e-02, -9.441e-02)); + r += mul(s0_2, M4(-5.569e-02, -1.362e-01, 1.829e-01, 1.028e-01, 2.850e-02, -2.040e-03, 5.163e-02, 3.880e-02, 5.329e-02, 5.051e-03, -2.657e-02, -4.745e-02, -5.201e-02, -1.034e-02, 3.430e-02, -7.121e-02)); + r += mul(s0_3, M4(-1.999e-01, 2.646e-01, -1.668e-02, -2.097e-02, -3.757e-02, 2.681e-03, 9.334e-02, -7.001e-03, 1.230e-01, -3.327e-02, 3.168e-03, 2.902e-02, 6.001e-02, 9.742e-02, -1.138e-04, 8.002e-02)); + r += mul(s0_4, M4(4.957e-02, 2.881e-01, -2.932e-01, 9.982e-02, -5.757e-02, -1.387e-01, 1.029e-01, -1.149e-01, -9.208e-02, 2.486e-01, 3.498e-02, 4.900e-02, 4.180e-02, 8.201e-03, 1.992e-01, -1.461e-02)); + r += mul(s0_5, M4(5.227e-02, -3.034e-02, -2.078e-02, 3.595e-02, -8.179e-02, 2.010e-02, 1.053e-01, 1.640e-02, -1.606e-01, 3.057e-02, -4.679e-02, 9.908e-02, 4.368e-02, -1.294e-02, -4.690e-02, 8.246e-02)); + r += mul(s0_6, M4(2.268e-02, 1.556e-01, -1.868e-02, 3.933e-02, 3.993e-02, -8.431e-02, -6.621e-02, 4.407e-02, -2.419e-02, 8.918e-02, -4.738e-02, -7.020e-02, 4.749e-02, -1.842e-02, -5.654e-02, -8.227e-03)); + r += mul(s0_7, M4(-5.760e-04, 1.471e-01, -1.820e-01, 6.890e-02, 1.373e-01, 9.203e-03, -2.028e-01, 9.876e-02, 1.083e-01, 5.770e-02, -3.253e-02, 2.297e-02, 1.292e-02, 1.122e-01, -1.429e-01, -8.835e-02)); + r += mul(s0_8, M4(-5.292e-02, 1.342e-01, -2.273e-03, 2.506e-01, 1.349e-02, 3.801e-03, -1.132e-01, -8.694e-02, 1.308e-01, 1.180e-02, -1.627e-01, 1.411e-01, 3.735e-02, -1.071e-01, 1.332e-02, -7.277e-02)); + r += mul(s1_0, M4(2.520e-01, 1.005e-02, -6.599e-02, -1.435e-02, -8.251e-02, 9.219e-02, 2.099e-01, 4.397e-02, 7.254e-02, 5.108e-02, -6.084e-02, 2.280e-01, -7.666e-02, 2.139e-01, -1.559e-01, 3.090e-02)); + r += mul(s1_1, M4(-1.438e-01, 1.429e-01, -1.312e-01, 2.296e-02, -1.380e-01, -1.234e-02, -9.997e-02, 1.424e-01, -1.930e-01, -2.154e-01, -5.713e-03, -1.436e-01, -1.227e-01, -6.206e-02, 1.316e-01, 1.183e-01)); + r += mul(s1_2, M4(-3.133e-02, -7.789e-03, 9.705e-02, -2.099e-01, 2.683e-01, 8.855e-02, -1.552e-01, -2.798e-01, -4.940e-02, 7.202e-02, 4.606e-02, -1.568e-01, -1.705e-01, -2.370e-02, 6.812e-02, 5.503e-02)); + r += mul(s1_3, M4(-2.010e-01, 7.593e-02, 1.140e-01, -1.111e-01, 3.125e-01, 1.057e-03, -2.343e-01, 2.188e-01, 1.613e-01, -5.725e-02, 2.443e-01, 1.606e-01, -1.111e-01, -3.890e-02, -1.082e-01, 2.268e-01)); + r += mul(s1_4, M4(-1.969e-02, 1.231e-01, -1.682e-01, -2.341e-01, -2.476e-01, -2.521e-02, 1.433e-01, 2.585e-01, -5.905e-01, -6.658e-03, 3.786e-01, 1.818e-02, -3.195e-01, -4.331e-02, 2.499e-01, 3.572e-01)); + r += mul(s1_5, M4(-2.933e-02, 6.255e-02, 5.270e-02, -6.322e-02, -6.288e-01, 3.056e-02, 2.344e-01, -5.509e-01, 4.417e-02, -1.143e-01, 1.720e-01, -3.562e-01, -1.757e-02, -7.980e-02, -5.221e-02, 1.142e-01)); + r += mul(s1_6, M4(4.704e-02, -7.956e-03, -4.388e-02, 8.044e-02, 1.961e-01, 3.794e-02, -3.145e-01, 4.592e-02, 7.526e-02, 5.595e-02, -8.909e-02, -8.451e-02, -3.933e-02, 7.445e-02, -4.443e-01, -4.812e-02)); + r += mul(s1_7, M4(-6.361e-03, -2.334e-02, 6.683e-02, 5.801e-02, 4.036e-01, 3.348e-01, -5.469e-01, -4.894e-01, 7.236e-02, -1.876e-02, 3.989e-02, -1.081e-01, 2.781e-02, -4.224e-02, 7.930e-02, 8.278e-02)); + r += mul(s1_8, M4(7.127e-03, -7.018e-02, -1.531e-02, -2.631e-02, 1.443e-01, -1.601e-01, -2.977e-01, -3.354e-01, 2.859e-02, 3.597e-02, -6.660e-02, -9.328e-02, -2.760e-03, -1.686e-01, 4.671e-03, -5.109e-02)); + r += mul(s2_0, M4(1.738e-01, 2.499e-01, 1.767e-01, -2.066e-01, -2.718e-02, 5.185e-02, 1.130e-01, 4.579e-02, -5.349e-02, -1.729e-02, 9.773e-03, 7.695e-02, -4.065e-02, -3.152e-02, -5.521e-02, -4.779e-02)); + r += mul(s2_1, M4(1.050e-01, -2.569e-02, 1.166e-01, -4.488e-02, 5.872e-03, -1.715e-01, -4.873e-02, -8.728e-02, -5.655e-02, -5.162e-02, -2.014e-02, 5.109e-02, -2.352e-01, -6.745e-02, -4.318e-02, -1.529e-01)); + r += mul(s2_2, M4(-5.747e-02, -1.001e-04, -1.659e-01, -1.151e-02, 1.184e-01, 1.088e-02, 9.885e-02, -4.186e-02, 2.511e-03, -4.830e-02, -9.706e-02, -2.413e-02, -1.844e-02, 3.858e-02, -7.717e-03, -6.948e-02)); + r += mul(s2_3, M4(7.010e-02, -1.670e-02, 2.139e-01, 7.957e-02, -1.501e-01, 1.199e-02, 9.177e-02, -1.012e-01, 8.116e-03, -3.847e-02, -8.662e-02, 3.384e-02, 2.598e-02, 1.091e-01, 1.689e-02, -1.996e-02)); + r += mul(s2_4, M4(5.851e-01, -4.156e-02, -2.361e-02, -1.495e-01, -4.768e-03, 2.125e-02, -5.071e-02, -2.313e-02, 1.628e-01, -1.056e-01, 4.753e-02, -5.418e-02, -1.305e-01, -1.263e-01, 3.208e-02, -7.109e-03)); + r += mul(s2_5, M4(2.752e-01, -4.555e-04, -3.288e-01, 9.494e-02, 6.333e-02, 2.145e-01, -5.950e-02, -4.529e-02, -1.564e-01, 4.102e-02, 1.456e-01, 1.577e-01, -2.017e-01, -1.197e-02, -1.137e-01, -4.620e-02)); + r += mul(s2_6, M4(3.852e-01, -3.149e-02, -2.738e-02, -1.856e-02, -2.038e-02, -1.391e-02, 1.545e-01, 4.244e-02, -7.351e-02, -1.266e-01, 6.077e-02, 2.922e-02, -1.241e-01, 5.051e-02, -1.331e-01, 1.044e-01)); + r += mul(s2_7, M4(-1.448e-01, 1.017e-01, 1.255e-01, -1.116e-01, 6.711e-02, -4.391e-02, 4.815e-03, 1.760e-01, -8.878e-02, 5.888e-03, -1.435e-01, -1.693e-01, -2.145e-01, -6.326e-02, 1.285e-02, -7.705e-02)); + r += mul(s2_8, M4(-9.547e-02, -1.173e-01, 1.793e-01, -7.501e-02, 7.400e-02, -6.034e-03, 3.186e-02, 1.514e-01, 2.215e-02, -4.265e-02, 6.466e-03, 2.240e-02, -1.609e-01, 7.133e-02, -3.133e-02, -7.962e-03)); + r += mul(s3_0, M4(1.172e-02, 2.080e-01, 1.168e-01, -5.939e-02, -6.782e-02, -4.500e-02, 9.755e-04, 3.416e-02, 2.640e-01, 9.256e-02, 3.313e-02, 6.642e-02, -5.530e-02, -4.369e-02, 9.257e-02, -6.417e-02)); + r += mul(s3_1, M4(7.388e-02, -9.949e-02, -7.112e-02, -6.696e-02, -1.935e-02, -5.532e-02, -3.353e-02, 8.160e-02, 9.737e-02, -5.728e-02, -2.573e-02, 2.480e-01, -2.191e-01, 1.059e-01, 2.171e-01, 2.034e-02)); + r += mul(s3_2, M4(7.582e-02, 1.122e-01, -1.356e-03, -2.247e-01, 8.112e-02, 5.689e-02, -1.266e-01, -1.438e-01, 1.457e-01, 3.666e-02, -3.664e-02, -9.318e-02, 3.935e-02, 1.949e-02, -7.842e-02, -3.551e-02)); + r += mul(s3_3, M4(-1.352e-01, -2.188e-01, -8.137e-02, 1.343e-01, -9.011e-02, 1.735e-01, -2.651e-01, -4.401e-02, -1.104e-01, -1.712e-02, -4.738e-02, 9.005e-02, 2.003e-01, 7.993e-02, 2.341e-02, -5.732e-02)); + r += mul(s3_4, M4(-3.021e-01, -1.628e-01, -9.939e-02, -5.101e-02, 1.852e-01, 4.853e-02, -2.408e-01, 1.685e-01, -1.590e-01, -1.416e-01, 2.550e-01, 8.751e-02, -1.338e-01, -7.205e-02, 7.076e-02, 1.652e-01)); + r += mul(s3_5, M4(1.865e-02, -1.665e-02, 2.272e-02, 3.661e-02, -1.933e-01, 2.391e-01, -4.422e-01, -2.826e-02, -9.839e-02, -3.878e-03, -1.376e-01, 8.164e-03, 2.325e-02, 5.991e-02, -1.257e-01, -1.250e-01)); + r += mul(s3_6, M4(2.248e-02, -1.574e-01, 1.337e-01, 2.721e-02, -7.530e-02, 6.672e-02, -1.552e-01, -3.174e-02, -6.926e-03, -8.575e-02, 6.217e-02, -7.909e-02, 3.127e-02, 2.158e-01, -1.689e-01, -8.679e-02)); + r += mul(s3_7, M4(-1.810e-02, 1.414e-01, -1.642e-01, 1.957e-01, 9.396e-02, 9.682e-02, 6.155e-02, -5.372e-02, 3.441e-03, 1.170e-01, -4.898e-04, 1.152e-01, 1.871e-01, -2.607e-01, -9.338e-02, 1.715e-01)); + r += mul(s3_8, M4(-3.406e-02, -5.075e-02, 7.496e-02, -1.226e-01, -1.136e-02, 6.224e-02, -2.319e-01, 2.711e-02, 1.313e-01, 8.848e-02, -3.355e-01, -2.899e-01, 3.552e-02, 4.240e-02, -1.280e-01, -1.896e-01)); + r += mul(s4_0, M4(2.978e-03, 4.338e-02, 2.667e-01, -3.428e-02, 4.550e-02, -5.447e-02, -3.128e-01, -5.822e-02, 7.073e-02, 9.923e-02, -1.416e-01, -8.767e-02, -6.636e-02, 1.224e-01, -4.772e-02, 2.206e-02)); + r += mul(s4_1, M4(5.822e-02, 4.371e-02, 5.661e-02, 9.083e-04, -1.675e-01, 4.282e-02, 9.959e-02, 2.148e-02, 6.614e-02, -6.577e-02, 9.507e-02, 1.344e-01, -2.506e-02, -6.194e-02, 5.761e-02, -1.130e-01)); + r += mul(s4_2, M4(-6.944e-02, -5.566e-02, 1.012e-01, -4.955e-02, -4.260e-02, 4.159e-02, -1.214e-01, -1.117e-01, -6.724e-03, -8.405e-02, -1.590e-01, 6.350e-02, 5.316e-02, -2.193e-03, -6.465e-02, 6.182e-02)); + r += mul(s4_3, M4(-7.619e-02, -6.501e-02, 2.396e-01, 2.766e-02, -9.113e-02, -2.040e-01, 1.268e-01, -5.021e-02, -5.359e-02, -3.492e-03, 9.936e-02, 1.327e-01, -1.176e-02, 1.324e-01, -6.895e-02, -1.033e-01)); + r += mul(s4_4, M4(-9.050e-02, -1.741e-01, 1.353e-01, -2.499e-02, 1.499e-01, 6.837e-02, 1.544e-01, -2.328e-01, -1.001e-01, -3.200e-01, 2.555e-02, 3.163e-02, 5.167e-03, 6.599e-02, 5.332e-02, -2.383e-02)); + r += mul(s4_5, M4(-1.380e-01, -6.767e-02, 7.205e-02, 7.794e-02, 3.260e-02, 8.421e-03, 9.155e-02, 2.219e-03, -2.114e-01, -5.606e-02, 9.497e-02, 1.809e-01, 3.274e-02, -3.988e-03, -9.138e-02, -8.120e-02)); + r += mul(s4_6, M4(-2.992e-02, -2.485e-03, 2.118e-02, 1.017e-02, 9.404e-02, -4.484e-02, -2.044e-01, 3.509e-02, -8.506e-02, -7.819e-02, -2.538e-02, -2.135e-02, 1.035e-01, 8.211e-02, -6.053e-02, 2.719e-02)); + r += mul(s4_7, M4(-1.954e-02, -1.303e-01, 2.458e-02, 1.259e-01, 6.521e-02, 7.827e-02, -2.962e-02, -1.487e-01, 1.335e-01, -1.090e-01, 5.524e-02, 1.814e-01, -1.546e-01, 1.165e-01, 4.443e-04, -1.573e-01)); + r += mul(s4_8, M4(-3.494e-03, 4.970e-02, 4.422e-02, 8.782e-02, -5.605e-02, 2.573e-01, -2.386e-01, -1.946e-01, 2.648e-02, -1.001e-01, -5.948e-02, 1.535e-01, 3.174e-02, 8.339e-02, -5.591e-02, 1.059e-02)); + r += mul(s5_0, M4(3.668e-02, 5.965e-02, -1.721e-02, -3.068e-02, 1.906e-02, -1.586e-01, -1.670e-01, 1.607e-01, -1.702e-01, -1.249e-01, -2.854e-01, 2.574e-02, -1.970e-01, -1.641e-02, -8.082e-02, -5.110e-02)); + r += mul(s5_1, M4(-1.574e-01, 1.272e-01, 1.492e-02, -7.330e-03, -2.324e-01, -6.950e-02, 1.762e-02, 2.972e-02, -3.110e-01, -6.619e-03, -3.372e-02, -9.828e-02, -1.360e-02, -9.453e-02, 9.109e-02, -6.697e-02)); + r += mul(s5_2, M4(3.255e-02, 1.122e-01, 3.934e-02, -1.884e-01, -2.090e-01, -6.767e-02, 6.147e-02, 1.271e-01, -9.991e-02, -8.133e-02, -9.660e-02, -4.156e-02, 2.997e-02, -9.234e-02, -6.113e-02, -1.478e-01)); + r += mul(s5_3, M4(-5.160e-02, -1.590e-02, -1.875e-01, -4.392e-02, -5.295e-02, -1.335e-01, -4.673e-02, 5.958e-02, -6.313e-02, -5.531e-02, 1.475e-01, 1.547e-02, 1.027e-01, -6.958e-02, 2.418e-02, 2.403e-02)); + r += mul(s5_4, M4(9.424e-02, -8.101e-02, -2.912e-01, -1.108e-01, 1.939e-01, 3.821e-02, -5.703e-02, 1.513e-02, 9.871e-02, 4.350e-02, 2.875e-02, -1.627e-01, -2.624e-02, -1.394e-01, 1.132e-01, -1.424e-02)); + r += mul(s5_5, M4(-6.870e-02, -6.601e-02, -1.372e-01, -1.179e-01, 1.986e-01, 5.603e-02, 1.706e-01, -9.338e-03, 1.029e-01, -5.792e-02, 6.861e-02, -7.211e-02, -4.139e-02, -2.509e-01, -1.461e-01, -1.405e-01)); + r += mul(s5_6, M4(7.451e-02, 2.164e-01, -2.009e-01, 2.788e-02, 1.175e-01, -9.648e-02, -1.430e-02, -7.214e-02, 9.366e-02, -6.314e-03, -1.510e-01, -6.284e-03, -1.500e-01, 2.851e-02, 5.196e-02, 1.170e-01)); + r += mul(s5_7, M4(-3.499e-04, 8.393e-02, -1.515e-01, 5.736e-02, 3.603e-02, 1.352e-02, 9.950e-02, -2.798e-02, 2.069e-01, 7.262e-02, 4.129e-02, -1.399e-01, -1.792e-01, -3.952e-01, 1.173e-01, -4.999e-02)); + r += mul(s5_8, M4(-4.190e-02, 1.134e-01, -2.901e-01, -8.789e-02, -1.495e-01, 2.644e-01, -9.540e-02, -3.225e-01, -7.771e-02, 1.823e-01, -2.192e-01, -1.170e-01, -4.472e-03, -1.040e-01, 1.290e-01, 1.096e-02)); + r += mul(s6_0, M4(-1.807e-01, -3.467e-02, -1.978e-01, 4.916e-03, 6.145e-02, 1.576e-02, 1.923e-02, -1.277e-02, 2.114e-02, -3.700e-02, -3.673e-02, -9.642e-02, 1.059e-01, 6.235e-02, 6.436e-02, 2.042e-02)); + r += mul(s6_1, M4(-9.068e-02, 5.704e-02, -8.745e-02, -6.303e-02, 2.124e-01, -1.943e-01, -1.370e-01, -1.624e-01, -1.096e-01, 4.166e-02, 6.197e-02, -1.716e-02, 1.131e-01, 4.626e-02, 8.055e-02, 6.132e-02)); + r += mul(s6_2, M4(7.138e-02, -5.989e-02, 1.507e-01, 5.818e-02, 1.495e-01, -2.149e-02, -7.632e-02, -1.873e-01, 7.602e-02, 1.672e-02, 1.305e-01, 5.485e-02, -1.106e-01, 9.418e-02, 2.097e-01, -1.107e-01)); + r += mul(s6_3, M4(-7.939e-02, -9.415e-02, -3.253e-01, 5.550e-02, -5.333e-02, -6.900e-02, 2.532e-01, -1.236e-02, 6.154e-02, 2.696e-03, -1.090e-01, 9.496e-02, -5.117e-02, 2.633e-01, 9.791e-02, -5.712e-02)); + r += mul(s6_4, M4(-1.092e-02, 5.562e-02, 2.001e-02, -8.640e-02, 2.022e-01, 1.713e-01, 7.558e-02, -2.621e-02, -2.034e-01, -7.972e-02, -9.542e-02, -7.372e-02, -2.119e-02, -9.791e-02, -4.815e-02, 1.717e-01)); + r += mul(s6_5, M4(-6.813e-02, -1.132e-01, 9.465e-02, -2.221e-02, 8.347e-02, -2.863e-02, 1.618e-02, 1.241e-01, -1.080e-01, -4.588e-02, -1.048e-02, 8.343e-02, 2.000e-02, -7.991e-03, 3.295e-01, -7.222e-02)); + r += mul(s6_6, M4(-1.257e-01, 2.813e-02, -5.140e-02, -1.422e-01, 1.255e-01, 1.617e-01, -9.818e-02, 9.477e-03, -1.898e-03, 8.431e-02, 1.631e-01, -2.976e-02, 2.819e-01, 6.733e-02, 4.286e-02, 8.241e-02)); + r += mul(s6_7, M4(-1.021e-01, -1.888e-01, -8.428e-02, 1.146e-01, 1.510e-01, -5.692e-02, -1.291e-01, 5.237e-02, 2.558e-02, -3.653e-02, 1.264e-01, 3.667e-02, -9.369e-02, 1.182e-01, -2.564e-01, -4.997e-02)); + r += mul(s6_8, M4(4.274e-02, 9.755e-02, -9.820e-02, -5.409e-03, 9.648e-03, -3.442e-02, -1.963e-01, -9.613e-02, 8.596e-02, -2.486e-02, -7.731e-02, 1.119e-01, 3.031e-03, 1.189e-02, 7.198e-02, -2.010e-02)); + r += mul(s7_0, M4(-8.593e-02, 4.410e-02, 5.916e-02, 5.405e-02, 1.801e-02, 3.804e-02, 8.731e-02, 4.344e-02, 2.200e-01, -2.394e-02, 1.496e-01, 6.278e-02, -7.431e-02, 1.860e-01, 7.845e-02, -9.594e-02)); + r += mul(s7_1, M4(-1.069e-01, -2.582e-02, 5.910e-02, -6.761e-02, -1.506e-01, -8.254e-02, 8.958e-02, -4.935e-02, -1.770e-01, -2.038e-01, 7.928e-02, 3.037e-01, -1.013e-01, 2.359e-02, -1.057e-01, -5.003e-02)); + r += mul(s7_2, M4(6.604e-02, -8.159e-02, 9.681e-02, -9.276e-03, 4.673e-02, -1.199e-02, -2.188e-01, 4.027e-02, 1.614e-01, 4.145e-02, 2.027e-01, 4.471e-02, -5.706e-02, 8.516e-03, -2.315e-02, -5.171e-02)); + r += mul(s7_3, M4(5.693e-02, -2.617e-03, 9.846e-02, 1.033e-01, -1.299e-01, -6.217e-03, 1.042e-01, -1.079e-01, -2.066e-01, -2.701e-01, 3.056e-01, 9.355e-02, 7.681e-02, 1.426e-01, -1.712e-01, 9.973e-02)); + r += mul(s7_4, M4(1.308e-01, 5.535e-02, 1.887e-01, -7.625e-02, 4.354e-02, 4.574e-02, -7.604e-03, -1.578e-02, -1.550e-01, 1.512e-01, -3.109e-01, -3.903e-01, -1.085e-01, -1.300e-01, 8.819e-02, 3.659e-02)); + r += mul(s7_5, M4(-5.433e-02, 1.856e-04, 1.124e-01, -1.339e-01, -1.416e-01, -1.226e-02, -7.421e-02, -3.983e-02, -1.132e-01, 1.275e-01, -4.816e-02, -1.477e-01, 1.074e-01, 7.671e-02, 1.985e-01, 1.291e-01)); + r += mul(s7_6, M4(-3.036e-02, -1.725e-02, -2.685e-02, -2.915e-03, 3.075e-02, 1.702e-01, -9.196e-02, -1.142e-01, 6.406e-02, 7.094e-03, -1.987e-02, 9.400e-02, 6.958e-02, 4.125e-02, -2.776e-02, 2.524e-02)); + r += mul(s7_7, M4(8.227e-02, -1.415e-01, 3.321e-02, 1.146e-03, -5.870e-02, -4.962e-02, 4.423e-02, -8.562e-03, -1.255e-01, -2.399e-02, -9.390e-02, 2.133e-01, 9.043e-02, -1.159e-02, -1.988e-01, 5.948e-03)); + r += mul(s7_8, M4(3.438e-02, 1.674e-01, -9.081e-02, 1.104e-01, -8.589e-02, -1.508e-01, -6.714e-03, -1.057e-02, -3.694e-02, 9.586e-02, -8.628e-03, 1.749e-01, 1.191e-02, -7.848e-02, -1.482e-01, -2.125e-01)); + r += V4(2.042e-02, -1.567e-02, 1.777e-02, 8.206e-03); + return r; +} + +V4 f1(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-1.871e-01, -2.821e-02, -2.131e-01, -2.105e-02, 1.113e-02, -8.090e-02, -6.108e-02, -1.710e-02, -2.215e-02, -1.474e-03, 1.704e-02, 3.001e-02, -5.379e-02, 4.545e-02, -1.134e-01, -2.035e-01)); + r += mul(s0_1, M4(-9.495e-04, -1.423e-01, -2.280e-02, -2.646e-02, -4.118e-02, 1.052e-01, -6.480e-02, -3.867e-02, -1.676e-02, -2.095e-02, 7.072e-02, 1.037e-01, 1.288e-01, -1.114e-02, 1.837e-02, -2.369e-02)); + r += mul(s0_2, M4(-1.243e-02, -1.434e-01, 8.768e-03, 2.108e-01, 1.194e-01, 5.633e-02, -1.265e-02, -9.167e-02, -2.684e-02, -1.275e-01, -3.768e-02, -5.514e-02, -4.753e-02, 3.975e-02, 1.264e-01, 3.772e-02)); + r += mul(s0_3, M4(-5.436e-02, 1.387e-01, -4.905e-02, 1.009e-02, 2.186e-04, -9.563e-02, -7.090e-02, -1.014e-01, 2.932e-03, 1.358e-01, -2.002e-02, 3.347e-02, 7.167e-02, 1.143e-01, 1.485e-01, -9.345e-02)); + r += mul(s0_4, M4(-1.239e-01, -6.966e-02, 1.447e-01, -1.225e-01, -6.644e-03, -6.150e-02, -1.980e-01, 2.807e-02, -3.973e-03, 1.241e-02, 1.473e-01, -2.119e-01, -5.985e-02, -1.174e-02, -1.191e-01, -1.458e-01)); + r += mul(s0_5, M4(-1.331e-01, -8.315e-02, -1.300e-01, -1.763e-01, -6.882e-02, -4.095e-03, -3.071e-02, -1.962e-01, -1.584e-03, -1.034e-01, -4.404e-02, -9.630e-02, -1.096e-02, -3.780e-02, -3.443e-02, 5.438e-02)); + r += mul(s0_6, M4(-7.963e-02, -3.774e-02, 2.984e-02, 7.809e-02, -5.955e-02, -3.516e-02, -2.589e-02, -6.405e-02, 1.241e-02, -4.356e-02, 2.731e-02, -4.592e-02, -1.681e-02, -2.013e-02, 1.026e-04, 6.043e-02)); + r += mul(s0_7, M4(6.424e-02, -1.309e-01, -1.238e-01, -4.344e-02, 1.308e-03, -1.141e-01, -5.711e-02, -1.666e-01, -3.539e-03, -1.410e-02, -6.655e-02, -2.380e-02, 1.941e-02, -7.815e-02, 1.136e-01, -3.781e-02)); + r += mul(s0_8, M4(-2.276e-02, -2.375e-01, -2.214e-02, 5.372e-03, 6.425e-03, -7.252e-02, 7.044e-02, -8.419e-03, -7.296e-02, -4.230e-02, 3.871e-03, 3.827e-02, -3.834e-02, 7.722e-02, 2.097e-03, -8.225e-02)); + r += mul(s1_0, M4(4.056e-02, -3.233e-02, -6.508e-02, -6.274e-02, -1.572e-01, -1.340e-01, 6.801e-02, 8.273e-02, 8.778e-02, 8.204e-02, 1.450e-01, 1.294e-01, 6.334e-02, -2.436e-01, -2.443e-01, 1.411e-01)); + r += mul(s1_1, M4(1.442e-01, 1.466e-03, -9.557e-02, -5.947e-02, 1.829e-01, 2.630e-01, -6.553e-02, 1.282e-02, 2.104e-01, 7.472e-03, 2.137e-01, -1.518e-02, 1.268e-01, -3.356e-01, -5.628e-02, -1.184e-01)); + r += mul(s1_2, M4(1.325e-01, -6.010e-02, -8.943e-03, 1.608e-02, -4.346e-02, 2.257e-02, 2.482e-02, -1.306e-01, 1.403e-01, 1.675e-01, -3.712e-02, -3.032e-02, -1.534e-01, -2.324e-01, 9.234e-02, 6.583e-02)); + r += mul(s1_3, M4(7.828e-02, -4.908e-02, -3.408e-02, 4.230e-02, 2.449e-02, 3.121e-01, -8.996e-02, -8.823e-02, -1.253e-01, 1.874e-01, 1.196e-01, 1.294e-01, -1.330e-01, 2.173e-01, 6.471e-02, 2.821e-02)); + r += mul(s1_4, M4(2.224e-02, -2.149e-02, 2.666e-01, -9.329e-02, 2.452e-01, -5.926e-01, -1.972e-01, 1.340e-02, 7.994e-03, -1.694e-01, 5.613e-01, -3.168e-01, -1.292e-01, 1.472e-02, -1.207e-01, -1.759e-01)); + r += mul(s1_5, M4(-2.011e-02, 4.120e-02, 8.215e-02, -2.399e-01, -2.318e-01, -8.668e-02, 1.445e-01, 1.350e-01, -1.501e-01, -1.454e-02, -8.517e-02, -1.553e-01, 3.227e-02, 1.248e-02, 5.942e-02, 1.594e-01)); + r += mul(s1_6, M4(7.560e-03, 4.543e-02, -6.540e-02, 4.231e-02, 2.725e-02, 1.371e-02, 2.006e-01, 1.437e-01, -4.834e-02, -1.133e-02, 8.049e-02, -2.226e-02, -8.326e-02, -8.656e-02, -7.931e-02, 4.502e-02)); + r += mul(s1_7, M4(-6.518e-02, 8.934e-02, -1.219e-01, -4.372e-02, 4.623e-02, -3.027e-01, -1.326e-01, -1.512e-01, -3.234e-02, -6.440e-02, 5.738e-02, -4.798e-03, 6.094e-02, 2.635e-02, 1.314e-01, -7.782e-02)); + r += mul(s1_8, M4(6.408e-02, 4.318e-02, -1.060e-02, -6.661e-02, -2.892e-01, -5.121e-01, 2.127e-01, -2.559e-01, -1.175e-01, -1.270e-01, 8.104e-03, -6.716e-02, -5.801e-02, 1.361e-01, -2.497e-02, -3.579e-02)); + r += mul(s2_0, M4(-2.161e-01, 1.363e-01, 8.227e-02, -6.284e-02, -5.903e-02, 5.772e-03, 2.087e-02, -1.065e-01, -1.529e-02, 1.757e-01, 6.662e-02, -2.364e-02, -6.565e-02, 7.983e-02, -7.751e-02, -7.226e-02)); + r += mul(s2_1, M4(-2.017e-02, 4.055e-02, 9.606e-02, -2.980e-02, -3.927e-02, 1.147e-01, 2.286e-02, 2.563e-01, 3.504e-02, 1.352e-01, 5.012e-02, -3.308e-04, -1.470e-01, -3.391e-02, 1.755e-01, 9.478e-02)); + r += mul(s2_2, M4(-1.474e-01, -1.028e-01, 7.540e-02, -1.023e-01, -7.313e-02, 1.066e-01, 5.016e-02, -1.897e-01, -5.914e-02, 7.808e-02, -4.346e-02, -2.776e-02, 2.904e-02, 8.417e-02, -4.232e-02, 1.674e-01)); + r += mul(s2_3, M4(2.335e-01, -2.842e-02, -5.739e-02, -1.221e-01, 2.011e-02, 3.406e-02, 1.656e-01, -1.083e-01, 3.551e-02, -9.249e-02, 5.859e-02, 3.906e-02, 7.709e-02, 1.910e-01, 2.195e-02, 7.340e-02)); + r += mul(s2_4, M4(7.809e-02, -1.515e-02, 1.817e-01, -7.771e-02, 9.634e-02, 1.301e-01, -3.744e-02, 1.008e-01, -4.234e-02, 2.875e-03, -9.835e-04, 3.331e-02, 2.310e-01, -2.396e-01, -2.066e-01, -7.600e-02)); + r += mul(s2_5, M4(2.134e-02, -4.246e-02, 7.435e-03, -9.941e-03, 2.696e-02, -1.199e-01, -6.648e-03, -6.885e-02, 6.191e-03, -4.447e-02, 1.650e-02, 9.745e-02, 1.988e-01, -1.938e-01, 2.823e-01, 1.705e-01)); + r += mul(s2_6, M4(1.660e-01, -2.599e-01, 4.331e-02, -1.877e-01, 6.713e-02, 1.880e-02, 7.058e-03, -4.739e-02, -1.476e-02, 2.851e-02, -2.477e-02, -2.204e-03, 1.588e-02, 7.779e-03, -1.553e-01, 3.717e-02)); + r += mul(s2_7, M4(1.023e-01, -1.597e-02, -6.167e-02, 6.849e-02, 4.146e-02, 7.833e-03, 4.950e-02, 1.834e-03, 2.423e-03, 1.970e-02, 2.839e-02, -5.577e-02, -1.964e-01, -1.136e-01, 7.158e-03, -4.833e-02)); + r += mul(s2_8, M4(-6.461e-02, 1.330e-01, -9.992e-03, 3.494e-02, 1.050e-02, 3.294e-02, -7.505e-02, 1.301e-03, 6.948e-02, -3.319e-03, 4.139e-02, -1.808e-02, 1.410e-01, -7.249e-02, -9.410e-02, -2.916e-03)); + r += mul(s3_0, M4(9.794e-02, -8.956e-02, 9.463e-03, -3.120e-02, -1.004e-01, -1.610e-01, -4.092e-02, -2.509e-01, -9.779e-03, -2.849e-01, 9.762e-02, 3.390e-02, -7.858e-02, -2.126e-02, -8.321e-02, -4.915e-02)); + r += mul(s3_1, M4(1.035e-03, -5.190e-02, 9.745e-02, 2.534e-01, -1.810e-01, 2.817e-01, -1.096e-01, 2.089e-01, -9.686e-02, -2.929e-01, 2.868e-02, 1.402e-01, -8.799e-02, -2.324e-02, 7.078e-02, -2.115e-03)); + r += mul(s3_2, M4(9.160e-02, 2.894e-02, -8.441e-03, -1.818e-01, -1.529e-01, 9.104e-02, 6.442e-02, -2.131e-01, -3.002e-01, -1.751e-01, -1.274e-01, 7.683e-02, 2.336e-02, 6.137e-02, -2.225e-02, 9.249e-02)); + r += mul(s3_3, M4(-9.086e-02, -1.176e-01, -2.192e-01, 2.074e-02, 9.874e-02, 7.857e-02, 5.903e-02, -1.617e-01, -1.056e-01, -2.939e-01, 1.331e-02, -2.528e-02, -9.598e-02, -1.886e-02, 1.347e-02, -2.747e-02)); + r += mul(s3_4, M4(3.116e-02, -1.008e-01, 1.747e-01, 2.508e-02, 1.102e-01, 8.567e-02, -1.714e-01, -3.481e-02, -2.085e-01, -3.166e-02, -9.038e-02, 1.993e-01, 1.475e-01, -1.922e-01, -9.841e-02, -2.740e-02)); + r += mul(s3_5, M4(-2.964e-02, 3.304e-02, -5.346e-02, -3.595e-02, -1.856e-02, -2.969e-01, -1.847e-01, -4.361e-02, -1.784e-01, 9.786e-02, 1.694e-01, 1.664e-01, 7.496e-02, 2.784e-02, 1.145e-01, -2.746e-02)); + r += mul(s3_6, M4(-4.400e-02, 2.339e-02, 6.149e-02, 1.891e-03, 1.015e-01, -3.804e-03, 1.096e-01, -7.637e-02, -7.288e-02, -9.137e-02, -7.551e-02, 8.777e-03, -6.516e-02, 1.604e-02, 4.501e-02, -5.608e-02)); + r += mul(s3_7, M4(3.896e-03, -7.334e-02, -3.673e-02, 2.116e-03, 1.060e-01, 2.827e-03, 5.156e-02, -1.699e-01, -3.804e-02, -1.013e-02, -2.048e-01, 1.115e-01, -5.598e-02, 1.942e-01, -3.608e-02, -9.662e-03)); + r += mul(s3_8, M4(-1.038e-01, 4.401e-02, 1.331e-02, -1.917e-02, 9.200e-02, 1.028e-01, 3.215e-02, -4.704e-02, -1.374e-01, -1.129e-01, -8.069e-02, -6.331e-02, -2.008e-02, 1.892e-02, 7.121e-03, 1.436e-02)); + r += mul(s4_0, M4(-7.756e-02, 2.062e-02, 4.399e-02, 1.107e-02, 6.661e-02, -5.046e-03, 1.393e-01, -6.560e-02, -1.426e-01, -1.762e-01, 8.760e-03, -1.763e-02, -5.790e-02, -5.544e-02, -7.877e-02, -5.698e-02)); + r += mul(s4_1, M4(-6.876e-02, -5.972e-02, 3.602e-02, 1.548e-01, -1.600e-01, 1.551e-01, -9.600e-02, -2.685e-01, -2.378e-02, -4.005e-02, -3.964e-02, 2.882e-01, -5.547e-02, 1.104e-01, 8.137e-02, 1.379e-01)); + r += mul(s4_2, M4(-9.239e-02, 7.299e-02, 4.045e-02, 5.511e-03, -1.197e-02, 2.754e-02, 2.256e-01, 1.320e-02, 2.351e-02, -1.223e-01, 5.086e-02, 7.153e-02, 5.949e-02, 2.832e-03, -5.051e-03, 1.528e-02)); + r += mul(s4_3, M4(-1.235e-01, 6.233e-02, -8.211e-02, -1.093e-01, -1.089e-01, 7.827e-03, 1.260e-01, 3.940e-02, -1.223e-01, 2.037e-02, -3.039e-03, -1.007e-02, -1.453e-01, 1.705e-01, 5.045e-02, -6.679e-02)); + r += mul(s4_4, M4(-1.850e-01, 1.124e-01, -2.744e-02, 4.633e-01, -1.888e-02, -1.497e-01, 2.819e-01, -9.535e-02, 4.777e-02, 9.229e-03, -1.721e-01, 1.564e-01, -2.240e-01, 8.776e-02, -1.616e-01, 2.031e-01)); + r += mul(s4_5, M4(2.790e-02, 6.465e-02, 1.183e-01, 6.803e-02, 2.085e-01, 8.519e-02, 5.526e-02, 1.918e-02, 9.109e-02, 1.322e-01, 1.707e-01, 9.906e-02, 6.375e-02, 1.046e-01, 4.839e-02, -7.507e-02)); + r += mul(s4_6, M4(-5.825e-02, 1.863e-02, -2.560e-02, -1.343e-01, -6.049e-02, -8.857e-02, 6.271e-02, -8.805e-02, 4.986e-02, 1.458e-01, 1.089e-01, -1.048e-02, -3.973e-02, -8.065e-02, 3.775e-02, -3.309e-02)); + r += mul(s4_7, M4(-9.327e-02, 4.840e-02, -1.265e-01, 1.491e-01, 7.817e-02, 4.162e-02, 1.440e-01, 1.603e-01, -5.780e-02, -1.189e-01, -7.263e-03, -1.101e-01, -1.226e-02, -3.063e-02, -3.353e-02, 2.052e-01)); + r += mul(s4_8, M4(1.751e-02, -1.135e-01, 1.571e-02, -2.205e-02, -3.998e-02, -1.429e-01, -2.788e-02, -7.556e-02, -7.037e-02, 1.664e-01, 9.417e-02, 4.116e-02, 1.210e-02, -6.077e-02, -3.109e-03, -9.682e-02)); + r += mul(s5_0, M4(4.328e-02, -2.640e-03, 1.726e-02, -6.619e-02, -7.153e-02, -5.347e-03, 1.232e-01, 1.862e-03, 1.355e-04, -5.360e-02, -9.326e-03, -1.251e-02, 2.813e-02, 5.841e-02, -3.303e-02, -1.476e-01)); + r += mul(s5_1, M4(-8.970e-03, -9.200e-02, -1.182e-01, 8.614e-02, 1.028e-02, -3.642e-02, -4.635e-02, -1.499e-01, -1.331e-01, 1.114e-01, -1.823e-01, -1.963e-01, -1.437e-01, -6.405e-02, 1.130e-01, -1.615e-02)); + r += mul(s5_2, M4(3.005e-03, 1.274e-01, 2.344e-02, 1.668e-02, -5.464e-02, 5.698e-02, 4.789e-02, -9.728e-02, 1.634e-01, -2.751e-01, 7.409e-03, -6.518e-02, 4.952e-02, 1.257e-02, 4.623e-03, -9.371e-02)); + r += mul(s5_3, M4(-9.059e-02, -1.951e-02, -3.413e-02, -8.996e-02, 5.690e-02, 4.996e-02, -9.201e-02, 1.690e-01, 1.255e-01, 6.144e-02, 6.561e-02, 4.638e-02, -4.952e-02, 1.578e-01, 2.006e-02, -1.715e-01)); + r += mul(s5_4, M4(7.592e-02, 7.317e-02, -1.401e-01, 9.003e-04, 1.105e-01, 6.094e-02, 6.376e-02, -5.125e-02, 1.325e-01, 3.113e-01, -9.730e-02, -1.553e-01, -2.130e-01, 2.451e-01, 4.230e-02, 1.606e-01)); + r += mul(s5_5, M4(5.599e-02, -2.547e-02, 3.313e-02, -7.994e-02, -5.691e-02, 9.699e-02, -7.989e-02, -1.939e-01, -2.585e-02, 1.913e-01, -4.057e-02, -7.749e-02, 1.399e-01, 2.816e-01, 9.736e-02, -1.271e-02)); + r += mul(s5_6, M4(-3.046e-02, -5.232e-02, 6.563e-02, 9.402e-03, -9.218e-02, 8.404e-03, -3.375e-02, -9.036e-02, 4.413e-02, 3.919e-02, -2.495e-02, -1.239e-03, -3.065e-02, -2.916e-02, 4.007e-03, -2.579e-01)); + r += mul(s5_7, M4(-7.098e-03, -1.860e-03, -1.707e-01, 5.445e-03, 1.281e-01, 1.628e-01, 1.225e-01, 7.790e-02, -1.567e-03, 7.209e-02, 1.182e-01, -9.290e-02, -1.202e-01, 2.262e-01, -2.065e-02, 1.571e-01)); + r += mul(s5_8, M4(9.056e-02, -1.256e-02, 5.825e-02, -7.197e-02, -5.779e-02, -1.845e-01, -1.186e-01, -1.548e-01, -1.480e-01, 1.068e-01, -1.482e-01, -5.204e-02, -2.760e-02, -8.757e-02, 1.002e-01, -1.388e-02)); + r += mul(s6_0, M4(7.393e-03, 1.422e-01, -4.407e-02, 2.375e-02, 7.300e-02, 7.536e-02, 4.936e-02, 8.964e-02, 3.491e-03, 1.315e-02, 4.104e-02, 7.586e-02, 5.862e-02, 9.637e-02, -8.634e-02, -1.815e-02)); + r += mul(s6_1, M4(5.447e-02, -4.146e-02, -1.955e-01, 3.767e-02, -8.846e-02, -2.408e-02, 7.166e-02, 9.727e-03, 8.169e-02, -2.903e-03, -8.014e-02, -2.011e-02, 7.493e-02, -1.732e-02, 1.244e-01, 5.136e-02)); + r += mul(s6_2, M4(8.524e-02, -2.271e-02, -4.364e-02, 3.690e-02, -9.154e-02, 6.250e-02, 4.295e-02, -2.384e-01, 8.008e-02, -7.720e-06, 1.023e-01, -9.540e-02, -2.173e-01, 5.006e-02, -5.404e-02, 1.215e-01)); + r += mul(s6_3, M4(5.341e-02, -1.380e-02, 4.311e-02, -6.630e-02, -3.448e-02, -6.397e-02, 2.076e-02, 1.184e-02, 2.474e-02, -1.257e-01, -7.047e-02, 6.348e-02, 1.586e-01, 1.115e-01, 3.230e-02, -1.733e-01)); + r += mul(s6_4, M4(4.991e-02, -1.141e-01, -1.378e-01, -6.951e-03, 1.873e-01, 4.493e-02, -4.137e-02, -4.430e-02, 1.579e-01, -3.852e-02, 1.640e-01, 9.429e-02, 1.355e-01, 1.617e-01, -5.072e-01, -6.408e-02)); + r += mul(s6_5, M4(6.064e-03, -6.852e-02, -1.470e-01, 8.329e-03, 7.775e-03, -9.763e-02, -5.572e-02, 1.070e-01, 9.256e-02, 1.398e-01, -9.383e-02, -1.502e-02, -6.022e-02, 1.013e-01, 1.429e-02, -1.039e-02)); + r += mul(s6_6, M4(-8.822e-02, 4.282e-03, -7.599e-02, 4.053e-02, -2.953e-02, 3.238e-02, 1.071e-01, 5.918e-03, -1.500e-02, 8.788e-03, -2.782e-02, 3.525e-02, 7.210e-02, -1.199e-01, 2.845e-02, -2.940e-01)); + r += mul(s6_7, M4(-8.471e-02, 1.662e-01, -6.165e-02, 3.814e-02, 7.629e-02, 2.466e-02, 7.141e-02, -1.585e-03, -1.659e-01, 4.623e-02, -9.034e-02, 3.881e-03, -2.486e-01, 1.006e-01, 3.395e-02, -1.782e-02)); + r += mul(s6_8, M4(-5.127e-03, -6.243e-03, -1.914e-01, 2.034e-02, 1.134e-01, -2.337e-01, 8.303e-02, 5.794e-02, 5.706e-02, 8.810e-02, -1.217e-02, -9.543e-02, -5.800e-02, 1.709e-02, -5.711e-02, -1.136e-02)); + r += mul(s7_0, M4(1.130e-01, 8.798e-02, 2.158e-02, -8.030e-02, 1.381e-01, 1.055e-02, -6.276e-03, -3.859e-02, 3.457e-02, -1.523e-01, 1.370e-01, 4.508e-02, -7.988e-02, 5.912e-02, -5.479e-02, -6.642e-02)); + r += mul(s7_1, M4(1.081e-01, -1.007e-03, 1.322e-02, -8.172e-02, -1.023e-02, 9.431e-02, 8.142e-02, 2.190e-02, 3.612e-01, -2.514e-01, -1.085e-01, 1.408e-01, 7.889e-02, -1.442e-02, 1.788e-01, -7.563e-03)); + r += mul(s7_2, M4(7.983e-02, 4.121e-02, 1.014e-01, 5.905e-02, 3.933e-02, -2.331e-02, 3.376e-02, -1.003e-01, -1.513e-01, -1.039e-01, -9.056e-02, -3.042e-01, 3.447e-02, -1.100e-01, -9.911e-02, -7.386e-02)); + r += mul(s7_3, M4(7.042e-02, 7.651e-03, 6.423e-02, -4.223e-02, -9.795e-02, 1.053e-01, -6.054e-02, -9.443e-02, -2.108e-01, 7.588e-02, -1.837e-01, 4.932e-02, 6.889e-02, -4.395e-02, 2.615e-02, 9.409e-03)); + r += mul(s7_4, M4(5.884e-02, -7.014e-03, 1.347e-02, -6.053e-02, 1.090e-01, 1.379e-01, -2.118e-01, -1.471e-01, -1.746e-02, 2.390e-01, 2.742e-01, 1.095e-02, 1.466e-01, 8.033e-02, -1.313e-01, -1.958e-01)); + r += mul(s7_5, M4(7.272e-03, 1.305e-02, -1.297e-01, -9.173e-02, -5.465e-02, 8.300e-02, 3.174e-02, 1.459e-01, 5.363e-02, 2.652e-01, 3.240e-02, -1.516e-01, -1.920e-02, 8.674e-02, -2.512e-02, 8.875e-02)); + r += mul(s7_6, M4(-9.080e-02, -9.108e-02, -2.072e-02, -7.774e-02, -1.248e-01, 6.572e-02, 1.437e-01, -1.314e-01, 2.497e-02, 2.202e-01, 1.100e-01, 2.945e-02, -2.824e-02, -5.907e-02, -4.124e-02, 9.261e-02)); + r += mul(s7_7, M4(-6.926e-02, 2.453e-01, 1.731e-01, -4.591e-03, -1.366e-01, -1.971e-02, -1.156e-01, -1.253e-03, -1.535e-01, 2.887e-02, -1.003e-01, 8.991e-02, -3.469e-02, 1.163e-01, 1.835e-01, -3.614e-02)); + r += mul(s7_8, M4(1.541e-02, -6.370e-02, -7.276e-02, 9.494e-03, -4.712e-02, 1.327e-02, 4.455e-02, -9.613e-02, 1.129e-01, -2.214e-01, -7.553e-02, 5.877e-03, -7.342e-02, 4.476e-02, 5.164e-02, -2.974e-02)); + r += V4(1.081e-02, 1.104e-03, 2.498e-03, 2.111e-03); + return r; +} + +V4 f2(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-9.523e-02, 7.526e-03, -2.074e-01, 4.818e-02, -5.945e-02, -3.677e-02, -1.007e-01, 2.116e-02, 1.844e-01, -2.631e-02, 4.416e-02, 1.048e-01, 4.360e-02, -7.908e-03, -4.849e-02, -6.085e-02)); + r += mul(s0_1, M4(1.516e-01, 5.656e-02, -8.160e-02, 1.651e-02, -1.158e-01, 3.780e-02, 1.881e-01, 2.673e-02, 1.120e-01, 3.675e-02, -8.565e-02, -3.982e-02, -7.177e-02, -9.332e-02, 8.668e-02, -1.560e-01)); + r += mul(s0_2, M4(1.006e-01, -7.895e-02, -1.341e-01, 5.189e-02, 4.895e-02, 4.167e-02, -1.296e-01, -6.457e-02, 2.716e-02, 7.833e-02, 8.289e-02, -1.103e-03, -9.103e-02, 1.081e-01, 2.987e-02, 6.692e-03)); + r += mul(s0_3, M4(3.345e-02, -6.734e-02, 2.309e-02, 5.627e-02, 8.582e-02, -2.582e-02, 4.288e-02, -4.792e-02, -5.124e-03, 1.531e-02, 2.494e-02, -3.836e-04, 1.338e-01, -4.618e-02, 8.606e-02, 8.540e-02)); + r += mul(s0_4, M4(-9.091e-02, -2.635e-01, 1.093e-01, 2.452e-01, -6.538e-02, 7.022e-02, 4.870e-02, -1.239e-01, 1.271e-02, 4.693e-03, 1.197e-01, 5.333e-02, -6.442e-02, 6.737e-02, 6.474e-02, -1.860e-01)); + r += mul(s0_5, M4(1.886e-01, 1.379e-01, 7.388e-02, 9.951e-02, 5.822e-02, 9.415e-03, 1.483e-01, 9.551e-02, -4.265e-02, 7.647e-02, -7.110e-02, 1.301e-01, -4.740e-02, 2.135e-02, -3.256e-02, 7.272e-02)); + r += mul(s0_6, M4(1.471e-02, -2.215e-02, 1.118e-02, -4.224e-03, -9.526e-03, 1.056e-01, 6.225e-02, 6.163e-03, -1.199e-02, 3.090e-02, 1.100e-01, 4.367e-02, -6.287e-02, 2.110e-03, 4.653e-02, 2.634e-03)); + r += mul(s0_7, M4(-9.156e-02, 6.332e-02, 8.221e-02, -2.532e-02, 9.286e-02, 1.789e-01, -7.587e-02, 3.588e-03, 1.320e-01, 3.023e-02, -7.919e-02, 9.182e-03, 4.106e-02, 1.427e-02, -1.481e-01, -3.329e-02)); + r += mul(s0_8, M4(-8.374e-02, 5.366e-02, -2.426e-01, 4.147e-03, 5.590e-02, -5.014e-02, -7.904e-03, -8.100e-02, -5.368e-02, 7.723e-03, -2.304e-02, 6.514e-02, 2.844e-03, 3.521e-02, -1.951e-02, 9.246e-03)); + r += mul(s1_0, M4(3.039e-02, -1.293e-03, 1.293e-01, -3.167e-02, -1.130e-01, -6.094e-02, -1.905e-01, 9.723e-02, 6.267e-02, 4.243e-06, 2.944e-01, -8.186e-02, 1.090e-01, 1.586e-02, 1.518e-01, -8.095e-02)); + r += mul(s1_1, M4(6.135e-02, 6.516e-02, -7.528e-02, -4.670e-02, -2.456e-01, -5.538e-02, 1.169e-01, -2.047e-01, 1.181e-02, 1.002e-02, 2.542e-01, -4.795e-01, 2.283e-01, -1.144e-01, -1.208e-01, 2.578e-02)); + r += mul(s1_2, M4(5.741e-02, 8.183e-02, -8.066e-02, 9.448e-02, 7.245e-02, 4.110e-02, 7.466e-02, 1.324e-01, 1.988e-01, -2.446e-01, 2.133e-01, -2.613e-02, -2.349e-02, -1.161e-01, 6.522e-02, 1.124e-01)); + r += mul(s1_3, M4(-9.236e-02, -9.255e-02, -1.040e-01, 4.370e-02, 7.208e-02, 1.923e-01, 1.063e-02, 7.156e-02, -6.318e-02, 2.311e-01, -1.186e-01, -5.819e-02, 1.928e-01, 1.622e-01, 1.470e-01, 1.048e-01)); + r += mul(s1_4, M4(-6.268e-02, -1.375e-01, 6.604e-03, 2.802e-02, -3.740e-02, -5.399e-02, -1.374e-01, 2.602e-01, -1.768e-02, 3.827e-01, 6.387e-01, 2.928e-02, 5.753e-02, 1.206e-01, 3.682e-03, 4.942e-02)); + r += mul(s1_5, M4(4.952e-02, 2.523e-01, 3.339e-02, 3.963e-02, -3.530e-01, -3.700e-01, -1.063e-01, -1.958e-01, 1.963e-01, -6.659e-02, 3.456e-01, -3.005e-02, -1.509e-01, -1.022e-01, 1.169e-01, -4.150e-02)); + r += mul(s1_6, M4(-1.231e-01, 1.060e-01, 1.328e-02, -8.564e-02, 3.125e-01, 2.742e-03, -7.321e-02, -5.935e-03, -5.441e-02, 2.168e-01, 2.433e-01, -1.589e-01, 1.178e-01, -1.255e-01, 8.176e-02, -8.035e-02)); + r += mul(s1_7, M4(-8.170e-02, 1.597e-01, 1.886e-01, -7.304e-02, 3.819e-01, 7.933e-02, 1.686e-01, -2.394e-02, -7.509e-02, -2.816e-02, 3.992e-02, -3.778e-02, 3.477e-02, -5.884e-02, -7.473e-02, -1.785e-03)); + r += mul(s1_8, M4(-7.482e-02, 1.184e-02, -3.933e-03, -4.874e-02, 6.113e-02, 3.012e-01, 3.709e-02, 1.862e-01, 5.347e-04, -1.135e-01, -8.545e-02, -7.592e-02, 1.704e-02, 1.547e-02, 1.187e-01, -1.872e-02)); + r += mul(s2_0, M4(-1.486e-01, 8.789e-02, 2.623e-02, 1.376e-01, -1.004e-03, 6.926e-02, 4.750e-02, -7.964e-03, 5.269e-02, -4.034e-02, 1.346e-01, 4.845e-03, -1.978e-02, -2.621e-02, -6.480e-02, -3.674e-02)); + r += mul(s2_1, M4(1.335e-01, 2.026e-01, -1.693e-01, -1.756e-01, -1.606e-01, 1.774e-01, -9.483e-03, -2.651e-02, -1.382e-01, -2.495e-01, 5.076e-03, -1.924e-02, -1.548e-02, 3.372e-02, 6.016e-02, -4.393e-02)); + r += mul(s2_2, M4(5.384e-02, -4.307e-02, 3.152e-02, 3.141e-02, 2.630e-01, 1.072e-02, 7.661e-02, -8.139e-03, -1.391e-01, 6.246e-02, -7.113e-02, -5.639e-02, -4.102e-02, 1.321e-02, -3.045e-02, -4.878e-02)); + r += mul(s2_3, M4(-5.485e-02, -5.021e-02, -9.393e-02, 2.505e-01, 6.772e-02, 3.911e-02, -1.625e-01, 6.379e-02, -7.047e-02, -1.624e-02, 8.427e-02, -9.974e-02, -2.270e-02, -3.061e-02, 2.650e-01, -1.225e-01)); + r += mul(s2_4, M4(1.345e-01, -3.003e-01, 8.125e-02, -7.746e-02, -8.684e-02, 1.411e-01, 9.097e-02, -1.195e-01, -7.510e-02, 1.460e-01, -2.291e-01, -1.175e-01, -4.250e-02, 1.536e-01, -3.261e-02, -4.076e-01)); + r += mul(s2_5, M4(-1.581e-01, 3.753e-02, -1.418e-02, -6.127e-02, 5.118e-02, 2.163e-02, -2.048e-02, -2.313e-02, -1.666e-01, 7.394e-02, -1.726e-01, -1.422e-01, -1.639e-01, 2.895e-01, -4.619e-02, -6.550e-02)); + r += mul(s2_6, M4(8.274e-02, -1.434e-01, 1.279e-02, -5.499e-02, 3.480e-02, -9.788e-02, -1.559e-02, -4.615e-02, -1.374e-02, 2.087e-02, 1.207e-02, 1.965e-02, -7.874e-02, 2.656e-02, -1.384e-01, 5.413e-03)); + r += mul(s2_7, M4(-1.188e-01, -1.006e-01, -3.870e-03, 1.726e-02, -4.400e-02, -4.391e-02, 1.943e-02, -7.128e-02, -2.829e-02, -7.835e-02, -1.709e-02, 1.198e-03, -9.185e-02, 1.434e-01, -4.201e-02, 1.719e-02)); + r += mul(s2_8, M4(-2.822e-02, -3.034e-02, 8.413e-03, 9.900e-03, -5.806e-02, 5.050e-03, -2.474e-02, 2.117e-04, -6.470e-02, 2.178e-02, -2.448e-02, -3.711e-02, -1.022e-01, 7.474e-02, -8.927e-02, 3.808e-03)); + r += mul(s3_0, M4(4.649e-02, 5.995e-02, 1.237e-01, -4.439e-02, -8.079e-02, 4.739e-02, -1.330e-01, -7.111e-02, 1.249e-01, -1.390e-02, -4.347e-02, 3.089e-02, -1.378e-02, -5.054e-02, -2.371e-01, 1.214e-01)); + r += mul(s3_1, M4(-4.147e-02, 1.312e-01, 8.521e-02, 4.791e-02, -2.893e-01, -8.516e-03, 3.991e-02, 4.734e-03, 4.495e-02, -1.611e-01, -2.962e-02, 7.655e-02, 3.432e-03, -8.433e-02, 4.505e-02, -6.860e-02)); + r += mul(s3_2, M4(1.496e-01, -7.197e-03, 1.138e-01, 2.208e-02, 1.407e-01, 8.353e-02, 2.982e-02, -5.375e-02, 1.311e-01, 1.746e-02, -9.200e-02, 1.702e-01, -1.306e-01, -2.512e-02, 4.415e-03, 2.814e-02)); + r += mul(s3_3, M4(-1.853e-02, 1.384e-02, -5.118e-02, -4.419e-02, 2.638e-02, -6.450e-02, 2.930e-02, 1.899e-02, 4.168e-02, -2.827e-02, 2.166e-01, 1.744e-02, 2.126e-01, -4.719e-02, 7.233e-02, 1.602e-01)); + r += mul(s3_4, M4(-2.018e-01, -1.064e-01, 2.128e-02, -2.395e-02, -7.627e-02, 1.624e-01, -1.261e-02, -7.677e-02, -1.227e-01, 1.087e-01, -1.174e-01, -1.210e-01, 6.392e-02, 2.524e-01, 1.421e-02, 5.939e-03)); + r += mul(s3_5, M4(4.596e-02, -1.440e-01, -8.835e-02, -4.192e-02, -7.037e-02, -5.660e-02, -2.150e-02, 5.382e-02, -6.105e-02, 2.803e-02, -7.108e-02, 7.229e-02, 3.941e-02, 1.201e-01, 3.529e-02, 1.408e-01)); + r += mul(s3_6, M4(-1.068e-01, -4.231e-02, -4.821e-02, -1.200e-02, -2.450e-02, -9.650e-03, -2.444e-02, 6.018e-02, -1.616e-02, -2.735e-02, 7.351e-03, 3.997e-02, 1.775e-01, -4.294e-03, 8.998e-02, 4.438e-02)); + r += mul(s3_7, M4(-6.566e-02, -3.504e-02, 5.708e-02, 1.989e-02, -1.345e-02, -1.144e-01, -3.381e-02, 3.762e-03, 5.950e-02, -5.932e-02, -1.283e-01, 1.091e-01, -6.164e-02, -7.551e-02, -1.460e-01, -1.032e-01)); + r += mul(s3_8, M4(-3.855e-02, 4.966e-02, -7.798e-02, -4.355e-02, -7.390e-02, 8.112e-02, 1.543e-02, 9.386e-03, 5.591e-02, 1.782e-02, 6.727e-02, 5.322e-02, 4.568e-02, 9.473e-02, 1.551e-01, 1.565e-01)); + r += mul(s4_0, M4(1.207e-02, -4.134e-02, -8.656e-02, 1.051e-01, 5.978e-02, -5.619e-02, 8.259e-02, -3.851e-02, 5.958e-02, 3.760e-02, 3.731e-03, 9.856e-02, -4.378e-02, -2.418e-02, -1.357e-01, 4.911e-02)); + r += mul(s4_1, M4(-6.349e-02, 5.498e-03, 1.302e-02, 4.400e-02, -1.769e-01, 1.710e-02, 5.431e-02, -1.440e-01, 8.952e-02, 7.151e-02, -3.314e-02, 6.503e-02, -4.302e-02, -1.076e-02, 5.917e-02, 1.234e-01)); + r += mul(s4_2, M4(-9.742e-03, 7.909e-02, 1.068e-01, -1.500e-01, -6.214e-02, 1.684e-01, -7.083e-03, 1.061e-01, 6.843e-02, -3.233e-02, 3.288e-03, 1.763e-01, 6.327e-02, -5.016e-02, -3.696e-02, -2.885e-02)); + r += mul(s4_3, M4(7.711e-02, -9.057e-02, -6.094e-02, -3.825e-02, -2.414e-01, -4.039e-02, -1.211e-01, 1.822e-01, -4.986e-02, 8.437e-02, 6.417e-02, -3.619e-02, 6.501e-02, 3.774e-02, -1.829e-02, 8.399e-02)); + r += mul(s4_4, M4(-2.235e-01, -4.193e-02, 6.100e-02, 9.313e-02, 5.158e-02, 1.821e-02, -2.817e-01, -2.336e-02, -2.633e-02, 1.295e-01, -1.070e-01, -6.050e-02, -1.249e-01, 4.648e-02, 5.849e-02, 7.926e-02)); + r += mul(s4_5, M4(-1.228e-01, 8.444e-02, 1.364e-02, 1.304e-02, 1.845e-02, 2.311e-01, -6.098e-02, 1.697e-01, -2.870e-02, 3.777e-02, 7.205e-02, -1.859e-01, -1.704e-02, 1.537e-02, -2.451e-02, -7.949e-02)); + r += mul(s4_6, M4(5.451e-02, -3.614e-02, -1.951e-02, -5.074e-03, 5.978e-02, -1.053e-01, 9.244e-02, -2.224e-02, -3.829e-02, -6.109e-02, 9.426e-02, -4.299e-02, 3.332e-02, 4.194e-02, -7.992e-02, 2.305e-02)); + r += mul(s4_7, M4(-7.507e-02, 3.732e-02, 9.090e-02, 2.122e-02, -3.735e-03, -1.434e-01, 1.082e-01, 4.114e-02, -5.953e-02, -7.751e-02, -1.033e-01, -2.877e-02, -1.485e-01, -4.885e-02, 8.432e-02, 4.760e-02)); + r += mul(s4_8, M4(-1.455e-03, -9.294e-03, -8.645e-02, -2.720e-02, 4.855e-02, 3.842e-02, -5.364e-02, -5.806e-02, -2.382e-02, -2.905e-02, 8.819e-02, -1.782e-02, 2.207e-02, -1.173e-02, -2.117e-02, 4.590e-02)); + r += mul(s5_0, M4(-8.125e-03, -1.201e-01, -3.500e-02, 1.288e-01, -1.329e-02, -4.118e-02, 1.373e-01, -7.228e-02, -4.887e-02, 3.610e-02, -2.157e-02, -9.036e-02, -9.072e-02, 6.122e-02, 1.467e-01, 5.007e-02)); + r += mul(s5_1, M4(-5.586e-02, -3.752e-02, -8.767e-02, 4.407e-02, -6.290e-02, 4.581e-02, -5.733e-02, -9.619e-02, -6.788e-02, -6.172e-02, -6.335e-03, 2.470e-02, 7.034e-02, 7.370e-02, 1.988e-01, 1.529e-01)); + r += mul(s5_2, M4(-6.664e-02, 2.605e-02, 1.183e-01, -1.122e-01, -1.632e-02, 4.579e-02, -4.336e-02, -2.472e-02, 1.734e-01, -2.186e-01, -4.677e-02, 1.248e-01, -3.843e-02, 9.578e-02, 1.781e-01, 1.108e-01)); + r += mul(s5_3, M4(1.859e-02, 2.767e-02, -3.291e-02, 8.182e-02, -1.983e-01, 2.496e-02, 7.179e-02, -1.044e-02, -5.468e-02, 1.339e-02, -6.350e-02, -2.690e-02, -1.548e-01, 5.006e-02, 4.520e-02, 5.536e-02)); + r += mul(s5_4, M4(4.791e-02, -2.237e-01, 3.843e-02, 2.922e-01, 4.297e-02, -5.274e-02, -1.429e-01, -1.418e-02, 1.950e-01, -1.983e-02, 6.589e-02, -4.016e-02, -2.981e-02, 1.265e-01, -5.908e-02, 3.204e-01)); + r += mul(s5_5, M4(-8.215e-02, -8.358e-03, 5.427e-02, 1.616e-01, 2.650e-01, 2.579e-01, 1.048e-01, 1.796e-01, 1.994e-01, -1.162e-01, 3.958e-02, -4.143e-02, -1.218e-02, -2.132e-01, 3.810e-02, -1.137e-01)); + r += mul(s5_6, M4(-8.306e-02, -1.655e-02, 9.988e-02, 4.427e-02, 5.594e-02, -1.272e-01, 4.672e-02, -2.217e-02, -9.166e-02, -7.092e-03, -6.258e-02, -3.021e-02, 2.103e-02, 9.653e-04, -2.749e-01, 1.407e-02)); + r += mul(s5_7, M4(-4.161e-02, -4.165e-02, 3.618e-02, -9.598e-03, -5.146e-02, -3.152e-02, -1.016e-01, -9.250e-03, -7.838e-02, -1.316e-01, -1.805e-01, -4.386e-02, -1.398e-01, -2.552e-01, 2.408e-01, 9.776e-02)); + r += mul(s5_8, M4(-4.489e-02, -4.643e-02, -6.028e-02, 6.739e-02, -6.689e-02, -1.980e-01, -1.361e-02, -2.730e-02, -8.366e-02, -2.995e-02, -7.422e-02, -8.726e-02, 9.930e-02, 9.294e-02, 2.463e-01, 1.307e-01)); + r += mul(s6_0, M4(-1.925e-02, -1.450e-01, 1.278e-01, -3.691e-02, 3.996e-02, 2.192e-02, 2.472e-02, 1.158e-01, -7.544e-02, -1.339e-02, -3.826e-02, -3.638e-02, 7.539e-02, -4.897e-03, 4.112e-03, 6.074e-02)); + r += mul(s6_1, M4(7.575e-02, -7.417e-02, -3.193e-02, -4.582e-03, -1.736e-01, 1.612e-01, 1.551e-01, 2.777e-01, 1.157e-01, 5.545e-02, -5.521e-02, -1.460e-01, 1.296e-01, 5.881e-02, 1.068e-02, 2.062e-01)); + r += mul(s6_2, M4(7.444e-02, -8.126e-02, -3.648e-02, 1.020e-01, 8.436e-02, -9.793e-02, 6.097e-02, 6.469e-02, 2.770e-03, 1.760e-02, 1.403e-01, -2.313e-02, -2.332e-02, 1.045e-01, 5.235e-02, 3.027e-02)); + r += mul(s6_3, M4(2.360e-02, 5.155e-03, 2.159e-01, -4.357e-02, -1.689e-01, 2.565e-02, -1.304e-01, 8.094e-02, -8.436e-02, -5.728e-04, -4.061e-02, -1.199e-02, 2.252e-01, -1.218e-01, -4.930e-02, 4.136e-02)); + r += mul(s6_4, M4(2.147e-01, -9.630e-02, -1.378e-01, -1.134e-02, 8.536e-02, 1.351e-02, -2.152e-01, 2.169e-01, -1.158e-01, -2.056e-01, 1.360e-01, -6.122e-02, 1.519e-01, -4.620e-02, 1.102e-01, -4.739e-02)); + r += mul(s6_5, M4(1.090e-01, -6.277e-02, -8.943e-02, 2.391e-01, -2.288e-01, -4.373e-01, -1.907e-01, -8.421e-02, 1.734e-02, -1.778e-01, 3.346e-02, 2.713e-02, 1.243e-01, 2.066e-01, -1.519e-01, -1.352e-01)); + r += mul(s6_6, M4(1.169e-02, 4.047e-03, -5.656e-02, 5.895e-02, 9.585e-02, 1.338e-02, -1.428e-01, 3.144e-02, -3.333e-02, -1.187e-01, 1.244e-01, 1.784e-02, 2.415e-01, -1.440e-01, 1.009e-01, -7.098e-02)); + r += mul(s6_7, M4(7.430e-02, 2.219e-03, -9.441e-03, -3.378e-02, 2.002e-01, -3.325e-02, 1.963e-02, -4.829e-02, -7.793e-02, 5.002e-02, -6.652e-02, -1.204e-02, -6.962e-02, 3.672e-02, -7.999e-02, -3.428e-02)); + r += mul(s6_8, M4(2.586e-02, -1.384e-01, 1.233e-01, 6.076e-03, -1.840e-02, 5.091e-02, 1.198e-01, 4.472e-02, -5.558e-02, 9.491e-02, 6.196e-03, -9.158e-02, 6.259e-02, 8.428e-02, -1.255e-01, 4.307e-02)); + r += mul(s7_0, M4(-3.222e-02, 3.138e-03, 1.957e-02, 1.499e-02, -4.444e-02, -2.183e-02, 1.365e-01, -8.917e-02, 2.109e-02, 8.503e-02, 1.513e-01, -1.106e-02, -5.235e-02, -2.710e-02, -7.498e-02, 4.757e-02)); + r += mul(s7_1, M4(5.725e-02, -2.067e-03, 3.363e-02, -6.695e-03, -4.120e-02, 1.073e-01, 7.809e-02, 1.221e-01, 1.075e-01, -4.413e-03, -2.130e-01, -6.235e-02, 1.317e-01, -5.886e-02, -1.093e-01, 1.391e-01)); + r += mul(s7_2, M4(1.989e-02, -1.940e-03, 1.291e-01, 2.503e-02, -1.334e-01, -1.339e-01, 1.157e-01, 2.046e-02, 1.673e-01, -1.449e-02, 5.462e-02, 1.793e-02, 3.130e-02, -2.726e-02, 2.497e-02, 1.924e-02)); + r += mul(s7_3, M4(-3.377e-02, 5.555e-02, 1.141e-01, -3.961e-02, -1.033e-01, 6.960e-02, -1.337e-02, 2.128e-02, -3.006e-01, 7.817e-02, -2.368e-01, -2.991e-02, -3.921e-02, 1.059e-01, 2.200e-01, -1.236e-01)); + r += mul(s7_4, M4(1.268e-01, 1.573e-01, -1.810e-01, 5.189e-02, 9.665e-02, 1.684e-01, -9.649e-02, 1.212e-01, -3.799e-01, -1.285e-01, 2.667e-01, -1.329e-01, 1.717e-01, 1.509e-01, -2.089e-01, 1.262e-02)); + r += mul(s7_5, M4(6.720e-02, 5.172e-02, -1.574e-02, 9.391e-02, -2.402e-01, -2.259e-01, -4.062e-02, -1.388e-01, -1.521e-01, -2.795e-02, -7.224e-03, 3.382e-02, -7.645e-04, 4.380e-02, 1.791e-02, 5.836e-03)); + r += mul(s7_6, M4(-5.870e-02, 1.127e-01, -2.018e-02, 1.996e-02, 2.143e-01, 6.391e-02, 2.659e-02, 5.426e-02, -4.221e-03, 2.226e-02, -2.242e-02, -6.617e-02, -1.122e-01, 9.153e-02, 5.476e-02, -9.256e-02)); + r += mul(s7_7, M4(-1.343e-01, 2.115e-02, -1.554e-01, -3.678e-02, 9.672e-02, -4.869e-02, -4.701e-02, 3.799e-02, -2.664e-01, 1.993e-01, -5.260e-02, -7.176e-02, 6.625e-02, 5.332e-03, -1.422e-01, -5.649e-02)); + r += mul(s7_8, M4(-7.533e-02, -2.946e-02, 1.724e-01, 8.496e-03, 2.760e-02, 1.191e-02, -7.346e-02, -2.989e-02, 1.546e-02, -3.697e-02, -4.831e-02, -5.810e-04, -4.130e-02, -7.427e-02, 1.663e-01, -1.218e-01)); + r += V4(2.410e-02, -9.396e-03, 1.051e-02, 5.262e-02); + return r; +} + +V4 f3(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-1.541e-01, 7.445e-02, -1.031e-01, -4.227e-02, 1.194e-01, 1.177e-01, 4.318e-03, 3.377e-02, -1.042e-01, -7.155e-02, 3.097e-02, 3.587e-03, 2.435e-02, 1.159e-01, 1.653e-02, 4.330e-02)); + r += mul(s0_1, M4(9.426e-02, 1.593e-02, -1.154e-02, 2.807e-01, -1.165e-01, -5.208e-02, 1.036e-01, -3.098e-02, 1.813e-02, 2.485e-02, -7.865e-02, -2.436e-01, -4.745e-02, 1.809e-01, 2.603e-02, -3.831e-02)); + r += mul(s0_2, M4(2.777e-02, -1.637e-02, -7.339e-03, 1.470e-01, 4.922e-02, 3.150e-02, 2.567e-02, 8.265e-03, 5.751e-02, 2.533e-02, -3.575e-02, 8.372e-02, 1.036e-01, 3.502e-02, -3.228e-04, -4.643e-02)); + r += mul(s0_3, M4(4.781e-02, 2.210e-01, -5.909e-04, -4.151e-03, 1.515e-01, -1.007e-01, 6.112e-02, -5.742e-02, -1.989e-01, -8.581e-02, -7.817e-02, 1.420e-02, -8.560e-03, 5.586e-02, -6.567e-02, -4.390e-02)); + r += mul(s0_4, M4(-5.837e-02, 3.538e-02, -5.611e-02, -8.464e-02, -8.826e-02, -9.334e-02, 1.638e-01, -9.774e-02, -4.502e-02, 2.860e-02, 4.700e-02, -4.664e-02, -1.113e-01, -1.132e-01, -6.476e-02, -2.240e-02)); + r += mul(s0_5, M4(-1.893e-02, 1.075e-01, -1.443e-01, 4.658e-02, -3.577e-02, -1.106e-01, -1.077e-01, -5.052e-02, -1.149e-02, -4.290e-02, 3.050e-02, 1.243e-01, -9.772e-02, -3.819e-02, -1.082e-01, -3.553e-02)); + r += mul(s0_6, M4(2.176e-02, -1.894e-01, -7.480e-02, 1.118e-01, 4.854e-02, 1.391e-02, 5.312e-02, -6.790e-02, -1.328e-02, -2.371e-02, -5.487e-02, -3.335e-02, -4.248e-02, 1.991e-02, -4.070e-02, 3.184e-02)); + r += mul(s0_7, M4(-4.676e-02, 1.857e-01, 1.548e-01, -8.722e-02, 2.913e-02, -2.723e-02, -7.639e-02, -3.793e-02, 1.133e-01, -1.049e-01, -6.420e-02, -5.949e-03, -1.141e-01, -1.956e-02, 5.989e-02, -1.345e-01)); + r += mul(s0_8, M4(3.326e-02, -1.111e-01, 1.462e-01, 8.195e-02, 6.368e-02, -1.687e-03, -1.765e-02, 4.541e-02, 1.443e-01, 1.527e-01, 2.521e-02, -6.235e-02, -7.915e-02, -4.487e-02, -5.134e-02, 3.652e-02)); + r += mul(s1_0, M4(3.368e-02, 8.714e-02, 6.110e-03, -1.981e-01, 2.033e-01, -8.898e-02, 8.475e-03, 1.873e-01, -1.498e-01, 4.971e-02, 1.536e-01, 3.002e-01, -2.681e-01, -3.378e-02, 1.997e-02, 4.818e-01)); + r += mul(s1_1, M4(1.055e-01, 1.301e-01, -2.522e-02, -7.098e-02, -1.269e-01, 2.670e-02, 1.136e-01, 7.816e-02, -1.890e-01, 2.785e-01, -2.470e-01, -8.519e-02, -2.315e-02, 1.341e-01, -9.506e-02, 1.278e-01)); + r += mul(s1_2, M4(1.948e-02, -3.190e-02, -3.223e-02, 3.931e-02, 3.433e-02, 1.312e-01, -1.393e-02, -1.037e-01, 8.951e-02, 1.129e-01, 6.835e-02, -9.325e-02, 1.195e-01, -3.151e-02, -1.330e-02, 5.604e-03)); + r += mul(s1_3, M4(9.086e-02, 1.209e-01, 6.033e-02, -1.874e-02, -1.190e-01, -1.473e-01, 8.160e-02, 5.619e-02, -3.533e-01, -1.393e-01, -2.688e-01, 1.894e-01, 3.564e-02, 2.016e-01, -1.385e-01, 4.488e-02)); + r += mul(s1_4, M4(-9.440e-03, -1.706e-02, -1.748e-02, 2.662e-02, 4.748e-02, 1.932e-02, 1.696e-01, 2.769e-01, -5.026e-01, 2.010e-01, 9.951e-02, 1.637e-01, 1.957e-01, -3.575e-01, -1.192e-01, 1.617e-01)); + r += mul(s1_5, M4(-3.517e-03, -4.071e-02, -8.419e-02, 1.006e-01, -1.733e-01, 2.983e-01, -1.682e-01, 5.680e-02, -5.220e-02, -1.610e-01, -2.310e-01, -1.312e-02, 1.825e-02, -3.759e-02, -1.022e-01, -5.093e-02)); + r += mul(s1_6, M4(-8.118e-02, -5.037e-03, 1.736e-03, -3.371e-02, -1.289e-02, 8.800e-03, 9.251e-02, -1.756e-01, -1.530e-02, 2.300e-01, 5.308e-02, -1.295e-01, 6.294e-02, 1.396e-01, -3.647e-02, 2.122e-03)); + r += mul(s1_7, M4(3.921e-02, 1.880e-04, 7.184e-02, -5.317e-03, -1.052e-01, 1.530e-01, -2.644e-01, -1.468e-02, 3.993e-02, -4.042e-03, 6.291e-02, -3.918e-02, -2.002e-01, -2.985e-02, -3.781e-02, 1.375e-02)); + r += mul(s1_8, M4(-8.215e-02, 9.509e-03, 2.562e-02, -2.062e-02, 1.324e-01, 1.454e-02, 3.688e-02, 1.111e-01, 2.343e-01, -4.873e-02, 1.626e-01, -6.006e-02, -1.030e-01, 7.297e-02, -2.219e-02, 9.851e-02)); + r += mul(s2_0, M4(5.611e-02, -3.181e-01, -4.837e-02, -6.922e-02, 2.914e-03, 5.952e-02, -4.679e-02, -2.544e-02, 2.193e-02, -1.003e-01, -9.020e-03, 2.205e-02, -1.759e-03, 3.894e-02, 1.423e-02, -8.472e-02)); + r += mul(s2_1, M4(-7.214e-02, 1.584e-02, -4.465e-02, 2.169e-01, -3.078e-02, 5.434e-02, -3.933e-02, 1.729e-03, -1.555e-02, 5.433e-02, 2.206e-02, 4.131e-02, -8.110e-02, -1.106e-01, -4.616e-02, -2.315e-02)); + r += mul(s2_2, M4(1.754e-01, -5.070e-02, -3.150e-02, 7.899e-02, 5.769e-02, -2.129e-01, -4.636e-02, 4.046e-02, -1.395e-01, 4.660e-02, 2.975e-02, 1.117e-02, -6.117e-02, -1.751e-02, -2.903e-02, 6.764e-02)); + r += mul(s2_3, M4(-6.471e-02, 2.146e-01, 5.085e-02, -5.202e-01, -1.359e-02, 5.058e-02, -7.127e-02, -1.601e-02, -6.091e-02, -1.459e-02, -7.134e-02, 1.549e-01, 1.276e-01, -9.287e-02, 1.771e-01, 1.394e-01)); + r += mul(s2_4, M4(1.596e-01, -1.380e-01, -2.423e-01, 2.340e-01, 1.000e-02, 2.824e-02, 1.236e-01, 3.541e-02, -1.289e-01, 2.382e-02, -6.086e-02, 2.541e-02, 5.685e-03, -3.143e-02, 5.591e-02, -1.216e-01)); + r += mul(s2_5, M4(-8.766e-02, -2.235e-02, -2.451e-02, 1.227e-02, 1.550e-01, -5.607e-02, 7.935e-02, 8.179e-02, -2.942e-01, 1.411e-01, -1.799e-02, -3.496e-02, -2.725e-02, 1.133e-01, 5.287e-02, 1.074e-01)); + r += mul(s2_6, M4(-1.036e-01, 1.293e-01, 5.427e-02, -3.299e-01, -6.639e-02, 2.028e-02, -6.833e-02, 4.915e-02, -4.676e-03, 4.487e-02, -5.957e-03, 7.035e-02, -7.784e-02, 5.093e-02, 1.658e-01, 1.278e-02)); + r += mul(s2_7, M4(3.254e-02, -6.731e-02, 6.136e-02, -6.006e-02, -4.211e-03, 1.189e-01, 7.107e-02, -5.250e-02, 1.580e-01, 1.173e-01, 7.031e-02, -2.363e-02, 4.882e-02, -6.122e-02, 3.727e-02, 1.939e-02)); + r += mul(s2_8, M4(2.800e-02, -2.528e-02, 4.430e-02, -3.989e-02, -3.861e-02, -7.836e-02, -5.991e-02, -1.907e-02, -1.333e-01, 3.260e-02, -6.408e-03, 5.615e-02, 2.487e-02, 3.189e-02, 7.691e-02, -1.030e-01)); + r += mul(s3_0, M4(-7.688e-02, 4.350e-02, -1.354e-01, -5.353e-02, 1.306e-01, 1.329e-01, -4.048e-02, -8.876e-02, 1.484e-02, -2.443e-01, 3.756e-03, 7.480e-02, -8.744e-02, 8.263e-02, -2.327e-02, 1.993e-02)); + r += mul(s3_1, M4(1.341e-02, -4.843e-02, 1.961e-02, 1.442e-01, 1.704e-01, 8.335e-02, -9.952e-02, 1.931e-02, -5.787e-02, -2.613e-01, 2.198e-02, 6.073e-02, -1.278e-02, -2.314e-01, 3.446e-02, 2.892e-02)); + r += mul(s3_2, M4(1.312e-02, -1.539e-02, -6.587e-02, 3.002e-02, 1.623e-01, -1.527e-01, -2.507e-02, 8.886e-02, -3.306e-03, 1.216e-01, -5.373e-02, -4.630e-02, 2.683e-02, 1.528e-03, 1.237e-01, -1.357e-01)); + r += mul(s3_3, M4(-3.629e-02, -1.790e-02, 8.143e-02, 3.422e-02, -7.654e-02, -1.413e-01, 1.523e-02, -1.196e-01, 5.257e-02, -1.080e-01, -3.571e-03, -1.339e-01, 1.751e-02, 4.219e-02, 9.139e-02, 1.905e-01)); + r += mul(s3_4, M4(-1.332e-01, 1.085e-01, -5.291e-02, 1.711e-02, -1.511e-01, -1.611e-02, 6.475e-02, -1.778e-01, 1.864e-02, 1.446e-03, -9.403e-03, -1.638e-01, -6.173e-02, -1.837e-01, -7.164e-02, 9.682e-02)); + r += mul(s3_5, M4(4.124e-02, -5.000e-02, -3.391e-02, -5.335e-02, 1.619e-01, 4.778e-02, 1.230e-01, -9.066e-02, 2.046e-01, 2.125e-02, -5.583e-02, -2.781e-01, 2.121e-01, 4.222e-02, 5.072e-02, -6.791e-02)); + r += mul(s3_6, M4(5.591e-02, -4.172e-02, 5.074e-03, 6.773e-02, 7.004e-02, 3.783e-03, 1.241e-02, -3.087e-02, 5.125e-02, -2.546e-02, -6.424e-02, -1.288e-01, -6.226e-02, -1.023e-01, -1.236e-01, -1.059e-01)); + r += mul(s3_7, M4(6.663e-02, 2.416e-02, -5.159e-02, -3.987e-02, -1.621e-02, 1.979e-02, 4.159e-02, -6.761e-02, -3.534e-02, -1.029e-01, -1.345e-02, -4.275e-02, -2.683e-01, 1.552e-01, -2.544e-01, 2.859e-04)); + r += mul(s3_8, M4(-1.992e-02, 5.768e-02, -5.584e-03, 6.441e-03, 1.317e-01, 3.139e-02, 6.948e-02, 1.451e-02, 1.074e-01, -7.998e-02, -8.032e-02, -6.475e-02, 1.482e-01, -9.720e-03, -5.256e-02, -1.479e-02)); + r += mul(s4_0, M4(-4.839e-02, 1.140e-03, -3.622e-02, 7.300e-02, 4.100e-02, -1.103e-01, 3.436e-02, -2.778e-02, -9.181e-02, -6.152e-02, -4.272e-02, 1.237e-01, 1.008e-02, 6.290e-02, -8.303e-03, 9.899e-03)); + r += mul(s4_1, M4(-6.312e-02, -8.452e-02, 7.491e-03, 9.689e-02, -6.351e-02, -1.581e-01, -5.564e-02, -7.967e-03, -3.090e-02, -3.347e-02, 9.113e-02, 1.925e-01, 4.861e-02, -2.838e-02, 4.783e-02, -1.699e-01)); + r += mul(s4_2, M4(-1.478e-01, 4.556e-02, -5.336e-02, -6.732e-03, -2.761e-03, -5.113e-02, -1.607e-03, 1.340e-01, 1.012e-01, 2.428e-02, 1.503e-02, -7.795e-02, 6.548e-02, -7.697e-02, 1.112e-02, 3.049e-03)); + r += mul(s4_3, M4(-2.407e-03, -2.252e-03, -4.581e-02, 5.584e-02, 5.979e-03, -4.358e-02, 6.233e-02, 1.063e-02, -2.296e-01, -1.326e-01, -4.987e-02, 1.989e-02, 1.359e-01, 2.509e-01, 1.292e-01, 7.777e-02)); + r += mul(s4_4, M4(-2.050e-01, 1.206e-01, 3.710e-02, 1.986e-01, -1.741e-01, 7.256e-02, -3.484e-02, -3.576e-01, 2.451e-01, -1.688e-01, -1.057e-01, 9.107e-02, 8.758e-02, -2.751e-01, 2.239e-01, 2.364e-02)); + r += mul(s4_5, M4(-5.809e-02, 1.454e-02, -3.366e-02, -2.671e-02, -9.982e-02, -1.511e-02, -1.628e-01, -1.030e-01, -6.869e-02, 1.522e-01, 1.662e-01, -3.735e-02, 1.431e-01, 3.946e-03, 1.875e-01, -6.482e-02)); + r += mul(s4_6, M4(3.218e-02, -7.122e-02, -1.460e-02, 7.275e-02, 8.113e-02, -3.292e-03, -5.182e-02, 1.175e-01, 1.257e-02, 5.358e-02, -3.594e-02, 5.446e-02, 7.923e-02, 3.842e-02, 2.085e-01, 7.095e-02)); + r += mul(s4_7, M4(1.590e-02, 1.359e-01, 3.769e-03, 4.688e-02, 4.924e-02, 1.446e-01, 1.228e-01, -2.817e-02, -1.074e-01, 1.347e-01, 2.297e-02, 2.567e-02, 5.231e-02, -3.432e-03, 3.995e-01, -2.672e-02)); + r += mul(s4_8, M4(-1.036e-01, -3.753e-02, 7.380e-02, -7.441e-03, 2.090e-04, 7.063e-02, 1.665e-01, 6.673e-03, 9.839e-02, 1.731e-02, -1.267e-01, 2.546e-02, 1.349e-01, -7.099e-02, 8.893e-03, -3.966e-02)); + r += mul(s5_0, M4(-3.046e-02, -1.849e-01, -1.706e-02, -1.224e-01, -5.873e-03, -1.910e-01, 5.894e-02, 1.852e-01, 8.535e-03, 8.984e-02, -5.644e-02, -1.735e-01, -2.286e-01, 1.058e-01, -3.983e-02, 2.355e-02)); + r += mul(s5_1, M4(2.592e-02, 6.491e-03, 1.929e-02, -7.618e-02, -1.963e-01, -1.009e-01, 6.043e-02, -1.961e-01, -1.542e-02, 5.331e-04, 8.130e-02, 1.849e-01, -2.411e-01, 1.440e-01, -7.786e-02, 3.432e-02)); + r += mul(s5_2, M4(-8.275e-03, 3.609e-03, 9.891e-03, -8.344e-02, 2.447e-02, 1.084e-01, 9.394e-02, -1.679e-02, -6.476e-02, 4.520e-02, 9.260e-02, 2.126e-01, -1.950e-01, 9.232e-02, -3.969e-02, 6.067e-02)); + r += mul(s5_3, M4(-7.232e-04, -6.282e-02, 5.756e-02, -3.110e-02, -1.114e-01, -7.194e-02, 4.142e-03, 1.695e-01, 7.497e-02, -2.395e-02, 6.252e-02, 1.579e-02, -1.255e-01, 2.525e-01, 5.575e-02, 6.153e-01)); + r += mul(s5_4, M4(-6.491e-02, 7.502e-02, 3.167e-03, -2.348e-02, -8.472e-02, 2.548e-01, -4.978e-02, -1.951e-02, -3.048e-02, -5.704e-02, 1.774e-01, -6.338e-03, -2.838e-01, -1.511e-01, -4.053e-02, 6.059e-01)); + r += mul(s5_5, M4(-2.412e-02, -1.205e-01, -6.613e-02, -5.165e-02, -8.040e-02, -4.929e-02, -1.725e-01, -3.018e-02, -1.233e-01, -9.717e-03, 5.918e-02, 1.565e-01, -1.531e-02, 5.785e-02, 1.118e-01, -3.537e-02)); + r += mul(s5_6, M4(3.586e-02, -4.831e-02, -1.700e-02, -1.002e-01, 5.432e-02, -1.102e-02, -2.840e-02, 1.737e-01, 3.152e-03, 1.527e-01, 4.713e-03, 7.891e-03, -1.070e-01, -7.131e-02, -3.445e-02, 7.807e-02)); + r += mul(s5_7, M4(-6.315e-02, 1.014e-01, 1.688e-01, -1.030e-01, 1.241e-01, 7.856e-02, 8.263e-02, 2.699e-02, -3.012e-02, 2.876e-02, 1.430e-01, -1.694e-01, -8.311e-02, -5.530e-02, -2.528e-01, 1.123e-01)); + r += mul(s5_8, M4(4.501e-02, 7.023e-02, 9.987e-02, 1.779e-02, 2.821e-02, -7.071e-02, 8.364e-02, -4.817e-02, 1.017e-01, -1.175e-01, 6.084e-02, -2.026e-02, -4.104e-02, 1.192e-01, -2.724e-01, -7.172e-02)); + r += mul(s6_0, M4(-2.403e-02, -1.430e-01, -4.463e-02, 2.115e-01, -3.311e-03, 1.294e-01, 2.786e-02, 6.036e-02, -3.302e-02, -3.810e-02, 1.050e-02, 9.657e-03, -6.527e-02, -3.026e-02, -1.425e-02, -2.182e-01)); + r += mul(s6_1, M4(-1.318e-01, 2.104e-02, -1.155e-01, 1.466e-01, -1.479e-01, 3.399e-01, 4.071e-02, -4.176e-02, -1.956e-02, -4.514e-02, -1.132e-03, -3.509e-04, 4.392e-02, -4.815e-03, -5.243e-02, -3.786e-02)); + r += mul(s6_2, M4(1.311e-02, -1.032e-02, -8.790e-03, 1.187e-01, -5.755e-02, -1.255e-01, -1.005e-01, -1.453e-02, -1.102e-02, -4.807e-02, 1.795e-02, -1.851e-01, -9.856e-02, 1.487e-01, -7.258e-02, -5.214e-03)); + r += mul(s6_3, M4(-4.654e-02, -3.135e-02, -1.684e-01, 3.834e-01, -2.876e-02, 1.784e-01, -1.386e-02, -4.142e-02, -8.756e-02, -2.283e-01, -9.441e-02, -4.160e-02, 2.263e-01, 2.885e-01, -3.452e-03, -2.400e-01)); + r += mul(s6_4, M4(7.687e-02, -6.810e-02, -1.320e-01, 2.525e-01, 1.797e-01, -2.430e-02, 1.885e-02, -6.292e-02, -3.197e-02, -7.428e-03, -2.033e-02, 1.679e-01, 6.859e-02, 7.989e-02, -7.397e-02, -2.282e-01)); + r += mul(s6_5, M4(4.482e-02, -7.678e-02, 1.278e-03, 2.601e-01, 4.335e-03, 1.209e-01, 3.467e-03, -2.305e-01, 1.498e-01, 8.959e-02, 3.266e-02, 1.003e-01, -1.326e-01, -3.894e-02, -6.801e-02, 5.746e-02)); + r += mul(s6_6, M4(5.336e-02, -9.724e-02, -1.431e-01, 2.915e-01, 1.202e-01, -1.028e-01, -8.011e-03, 1.251e-01, 4.663e-02, -5.798e-02, -8.256e-02, 2.405e-02, -5.388e-02, -8.614e-02, -7.355e-02, -3.901e-02)); + r += mul(s6_7, M4(-3.570e-02, 2.925e-01, -7.481e-02, 2.625e-02, 1.195e-01, 4.382e-02, -3.380e-02, 1.320e-02, -6.054e-02, 1.930e-01, 1.641e-01, -5.457e-02, -6.494e-02, 4.445e-02, 1.441e-01, 4.620e-02)); + r += mul(s6_8, M4(9.954e-02, 1.499e-01, 3.501e-02, 1.605e-02, -2.730e-01, 1.298e-01, -4.405e-02, -2.582e-02, -5.153e-03, -1.636e-02, -3.186e-02, -1.102e-01, 8.378e-02, -5.718e-02, 1.241e-02, 2.242e-02)); + r += mul(s7_0, M4(4.522e-03, 1.157e-01, 6.721e-02, -1.100e-01, -3.192e-02, 1.623e-02, -1.048e-02, 4.959e-02, -8.910e-02, -8.295e-02, 3.892e-03, 7.422e-02, 7.690e-02, 1.323e-02, 1.388e-01, 3.940e-02)); + r += mul(s7_1, M4(-6.403e-03, 9.173e-02, 7.153e-03, -1.033e-01, -6.463e-02, 6.393e-02, -4.339e-02, -6.190e-03, -1.071e-01, 7.056e-02, 5.481e-02, 6.483e-02, -6.428e-02, 2.973e-02, 1.292e-01, 1.169e-01)); + r += mul(s7_2, M4(5.770e-02, 5.588e-02, 6.031e-02, -1.759e-01, -3.895e-02, 2.467e-03, -2.560e-02, -1.027e-01, 2.629e-02, -1.205e-01, -9.231e-02, -2.143e-01, -2.209e-02, 7.736e-02, 1.911e-02, -6.816e-02)); + r += mul(s7_3, M4(1.705e-02, 5.705e-02, -4.597e-02, -7.820e-02, 8.144e-03, 6.708e-02, -3.695e-02, 2.001e-01, -1.255e-01, -1.630e-02, -2.811e-02, -5.311e-03, 1.111e-01, 6.014e-02, 1.773e-02, 8.124e-02)); + r += mul(s7_4, M4(1.531e-02, -1.537e-02, -9.494e-02, -6.804e-02, 1.393e-01, -6.602e-02, 4.988e-02, 2.267e-01, -3.947e-02, 8.325e-02, -8.862e-02, -6.870e-02, 1.717e-01, -2.222e-01, 4.594e-02, -1.655e-01)); + r += mul(s7_5, M4(1.169e-01, 1.878e-02, 4.611e-02, 2.927e-02, 7.513e-02, 4.478e-02, 8.064e-02, 2.155e-02, 2.792e-01, -1.029e-01, 9.900e-02, -3.829e-02, -1.461e-02, -5.504e-02, -6.803e-02, -1.202e-02)); + r += mul(s7_6, M4(3.775e-02, -4.092e-02, -9.230e-02, 3.931e-02, -2.544e-02, -5.744e-02, -1.008e-01, 8.357e-03, 4.594e-03, -5.746e-03, -1.147e-01, -3.240e-02, 2.209e-02, -7.544e-02, 8.800e-02, 3.604e-02)); + r += mul(s7_7, M4(7.549e-02, -3.910e-02, -5.900e-02, -2.941e-03, -8.728e-02, -4.351e-02, -7.503e-02, 1.369e-01, -4.670e-02, 2.395e-01, 2.080e-01, -6.757e-02, 1.841e-02, 7.237e-03, -4.694e-02, 1.169e-02)); + r += mul(s7_8, M4(7.998e-02, -1.301e-02, 8.638e-02, -2.254e-01, -1.370e-01, -5.376e-02, -3.425e-02, -2.080e-03, -1.539e-01, -1.300e-01, 4.326e-02, -3.162e-02, 3.087e-03, 1.125e-01, 8.557e-02, -6.775e-02)); + r += V4(-1.190e-02, 2.995e-03, -4.483e-02, 1.950e-02); + return r; +} + +void Pass5(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = Rmp8x8(tid.x) + blockStart; + uint2 size = GetInputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = (gxy + 0.5) * pt; + + V4 s0_0 = l0(-1.0, -1.0); + V4 s0_1 = l0(0.0, -1.0); + V4 s0_2 = l0(1.0, -1.0); + V4 s0_3 = l0(-1.0, 0.0); + V4 s0_4 = l0(0.0, 0.0); + V4 s0_5 = l0(1.0, 0.0); + V4 s0_6 = l0(-1.0, 1.0); + V4 s0_7 = l0(0.0, 1.0); + V4 s0_8 = l0(1.0, 1.0); + V4 s1_0 = -max(-s0_0, 0.0); + V4 s1_1 = -max(-s0_1, 0.0); + V4 s1_2 = -max(-s0_2, 0.0); + V4 s1_3 = -max(-s0_3, 0.0); + V4 s1_4 = -max(-s0_4, 0.0); + V4 s1_5 = -max(-s0_5, 0.0); + V4 s1_6 = -max(-s0_6, 0.0); + V4 s1_7 = -max(-s0_7, 0.0); + V4 s1_8 = -max(-s0_8, 0.0); + s0_0 = max(s0_0, 0.0); + s0_1 = max(s0_1, 0.0); + s0_2 = max(s0_2, 0.0); + s0_3 = max(s0_3, 0.0); + s0_4 = max(s0_4, 0.0); + s0_5 = max(s0_5, 0.0); + s0_6 = max(s0_6, 0.0); + s0_7 = max(s0_7, 0.0); + s0_8 = max(s0_8, 0.0); + + V4 s2_0 = l1(-1.0, -1.0); + V4 s2_1 = l1(0.0, -1.0); + V4 s2_2 = l1(1.0, -1.0); + V4 s2_3 = l1(-1.0, 0.0); + V4 s2_4 = l1(0.0, 0.0); + V4 s2_5 = l1(1.0, 0.0); + V4 s2_6 = l1(-1.0, 1.0); + V4 s2_7 = l1(0.0, 1.0); + V4 s2_8 = l1(1.0, 1.0); + V4 s3_0 = -max(-s2_0, 0.0); + V4 s3_1 = -max(-s2_1, 0.0); + V4 s3_2 = -max(-s2_2, 0.0); + V4 s3_3 = -max(-s2_3, 0.0); + V4 s3_4 = -max(-s2_4, 0.0); + V4 s3_5 = -max(-s2_5, 0.0); + V4 s3_6 = -max(-s2_6, 0.0); + V4 s3_7 = -max(-s2_7, 0.0); + V4 s3_8 = -max(-s2_8, 0.0); + s2_0 = max(s2_0, 0.0); + s2_1 = max(s2_1, 0.0); + s2_2 = max(s2_2, 0.0); + s2_3 = max(s2_3, 0.0); + s2_4 = max(s2_4, 0.0); + s2_5 = max(s2_5, 0.0); + s2_6 = max(s2_6, 0.0); + s2_7 = max(s2_7, 0.0); + s2_8 = max(s2_8, 0.0); + + V4 s4_0 = l2(-1.0, -1.0); + V4 s4_1 = l2(0.0, -1.0); + V4 s4_2 = l2(1.0, -1.0); + V4 s4_3 = l2(-1.0, 0.0); + V4 s4_4 = l2(0.0, 0.0); + V4 s4_5 = l2(1.0, 0.0); + V4 s4_6 = l2(-1.0, 1.0); + V4 s4_7 = l2(0.0, 1.0); + V4 s4_8 = l2(1.0, 1.0); + V4 s5_0 = -max(-s4_0, 0.0); + V4 s5_1 = -max(-s4_1, 0.0); + V4 s5_2 = -max(-s4_2, 0.0); + V4 s5_3 = -max(-s4_3, 0.0); + V4 s5_4 = -max(-s4_4, 0.0); + V4 s5_5 = -max(-s4_5, 0.0); + V4 s5_6 = -max(-s4_6, 0.0); + V4 s5_7 = -max(-s4_7, 0.0); + V4 s5_8 = -max(-s4_8, 0.0); + s4_0 = max(s4_0, 0.0); + s4_1 = max(s4_1, 0.0); + s4_2 = max(s4_2, 0.0); + s4_3 = max(s4_3, 0.0); + s4_4 = max(s4_4, 0.0); + s4_5 = max(s4_5, 0.0); + s4_6 = max(s4_6, 0.0); + s4_7 = max(s4_7, 0.0); + s4_8 = max(s4_8, 0.0); + + V4 s6_0 = l3(-1.0, -1.0); + V4 s6_1 = l3(0.0, -1.0); + V4 s6_2 = l3(1.0, -1.0); + V4 s6_3 = l3(-1.0, 0.0); + V4 s6_4 = l3(0.0, 0.0); + V4 s6_5 = l3(1.0, 0.0); + V4 s6_6 = l3(-1.0, 1.0); + V4 s6_7 = l3(0.0, 1.0); + V4 s6_8 = l3(1.0, 1.0); + V4 s7_0 = -max(-s6_0, 0.0); + V4 s7_1 = -max(-s6_1, 0.0); + V4 s7_2 = -max(-s6_2, 0.0); + V4 s7_3 = -max(-s6_3, 0.0); + V4 s7_4 = -max(-s6_4, 0.0); + V4 s7_5 = -max(-s6_5, 0.0); + V4 s7_6 = -max(-s6_6, 0.0); + V4 s7_7 = -max(-s6_7, 0.0); + V4 s7_8 = -max(-s6_8, 0.0); + s6_0 = max(s6_0, 0.0); + s6_1 = max(s6_1, 0.0); + s6_2 = max(s6_2, 0.0); + s6_3 = max(s6_3, 0.0); + s6_4 = max(s6_4, 0.0); + s6_5 = max(s6_5, 0.0); + s6_6 = max(s6_6, 0.0); + s6_7 = max(s6_7, 0.0); + s6_8 = max(s6_8, 0.0); + + t0[gxy] = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t1[gxy] = f1(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t2[gxy] = f2(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t3[gxy] = f3(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); +} + +//!PASS 6 +//!DESC conv5 +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 +//!IN t0, t1, t2, t3 +//!OUT t4, t5, t6, t7 + +#define l0(x, y) V4(O(t0, float2(x, y))) +#define l1(x, y) V4(O(t1, float2(x, y))) +#define l2(x, y) V4(O(t2, float2(x, y))) +#define l3(x, y) V4(O(t3, float2(x, y))) + +V4 f0(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-3.325e-02, 3.102e-02, -1.201e-02, 2.268e-02, 7.444e-03, 1.479e-01, -1.168e-01, -5.885e-03, 4.910e-03, -2.434e-02, 4.692e-02, -8.707e-03, 1.163e-01, -5.718e-02, 4.571e-02, -3.987e-03)); + r += mul(s0_1, M4(9.745e-02, 4.481e-02, -5.736e-03, 4.527e-02, -6.175e-02, -8.090e-02, -1.783e-01, -4.490e-02, -1.074e-01, 6.241e-03, 1.121e-01, 5.417e-02, -1.167e-01, -1.013e-01, -9.217e-03, -8.213e-02)); + r += mul(s0_2, M4(-1.143e-01, -2.914e-02, 1.086e-02, 5.355e-02, -5.619e-02, 7.229e-02, -3.712e-02, -2.005e-02, 1.814e-02, 3.906e-02, 9.007e-02, 4.586e-02, 4.925e-02, -4.990e-02, 3.002e-02, -5.329e-02)); + r += mul(s0_3, M4(-7.281e-02, -1.456e-01, 6.030e-02, -7.220e-03, 1.217e-02, 3.942e-02, 2.493e-03, -2.184e-02, -4.370e-02, -2.313e-02, -3.702e-03, -1.439e-02, 5.491e-02, -1.097e-01, -1.525e-02, 1.306e-02)); + r += mul(s0_4, M4(2.689e-02, 6.599e-02, 1.036e-01, -8.721e-02, -2.337e-01, 1.000e-01, 1.439e-02, 2.684e-01, 2.232e-02, 7.914e-03, -3.002e-02, 7.379e-02, -2.289e-02, -1.065e-02, -4.016e-02, -1.150e-01)); + r += mul(s0_5, M4(7.046e-02, -1.307e-03, -1.191e-02, 4.801e-02, -2.147e-02, 1.351e-01, 3.794e-02, -3.068e-02, 3.729e-02, 1.114e-02, -1.309e-02, 1.434e-02, -1.162e-01, 1.812e-02, -5.316e-02, -5.238e-02)); + r += mul(s0_6, M4(-1.274e-03, 3.140e-02, 1.683e-02, 3.169e-02, -2.787e-03, -9.452e-02, 1.432e-02, -2.380e-02, -3.839e-02, 1.362e-01, -8.840e-03, 2.950e-02, -9.202e-02, -4.772e-02, 2.859e-02, 3.891e-02)); + r += mul(s0_7, M4(5.686e-02, 2.562e-02, 3.277e-02, -3.834e-03, -4.117e-02, -1.190e-03, 8.718e-02, -3.681e-02, 2.798e-02, 1.672e-02, 8.348e-02, 1.928e-02, 2.370e-02, 6.126e-02, 5.123e-02, -7.158e-02)); + r += mul(s0_8, M4(6.307e-04, 2.505e-02, -2.436e-03, -2.344e-02, -6.344e-02, 2.815e-02, -3.121e-02, 5.070e-02, 2.422e-02, 8.561e-03, 2.690e-02, -8.370e-02, 9.301e-03, -2.347e-02, -4.862e-02, -4.908e-02)); + r += mul(s1_0, M4(-2.105e-01, 5.742e-02, 5.282e-02, 1.075e-01, 8.419e-02, -8.720e-03, 3.498e-02, 8.101e-03, -4.217e-02, -6.896e-02, 1.060e-01, 1.892e-02, 1.353e-01, -5.279e-02, 3.427e-02, -1.061e-01)); + r += mul(s1_1, M4(-5.899e-02, -8.880e-02, 4.749e-02, 5.689e-02, -1.243e-01, -1.050e-01, 1.305e-01, -1.822e-01, -1.794e-01, -2.956e-01, 2.878e-01, -5.563e-02, 1.107e-01, -9.594e-02, 1.681e-01, -4.173e-01)); + r += mul(s1_2, M4(2.088e-01, -1.263e-02, 8.239e-02, 1.372e-01, -1.523e-01, -4.600e-02, -6.727e-02, 1.620e-02, -1.129e-01, -1.329e-01, -2.328e-02, -8.638e-02, -8.206e-02, -5.865e-02, 7.702e-02, 8.697e-02)); + r += mul(s1_3, M4(1.856e-03, -1.151e-01, 1.269e-01, -1.246e-01, -2.480e-02, 1.943e-02, -7.583e-02, -7.204e-02, 2.768e-02, 6.190e-02, 8.628e-02, -1.388e-01, 3.124e-02, -8.930e-02, -1.392e-01, 3.038e-01)); + r += mul(s1_4, M4(1.273e-01, -4.104e-02, 5.600e-01, -1.033e-01, -2.556e-01, 8.996e-02, -2.634e-02, 1.067e-02, -2.025e-01, 1.187e-01, 3.098e-01, -1.177e-01, 2.340e-01, 9.085e-02, -7.989e-02, -3.875e-01)); + r += mul(s1_5, M4(-4.001e-01, -2.410e-01, -2.005e-01, 3.053e-01, -4.187e-02, -2.079e-02, 3.795e-02, -5.801e-01, 1.572e-01, -3.704e-02, 1.789e-01, 3.634e-02, -2.765e-03, 3.068e-01, 6.566e-02, 1.782e-01)); + r += mul(s1_6, M4(-5.601e-02, -2.663e-01, -5.452e-02, -3.342e-02, 2.845e-02, -5.523e-02, 3.937e-02, -1.254e-02, -9.803e-02, -4.092e-02, 1.070e-01, -1.884e-02, -8.056e-02, 5.957e-02, -2.268e-01, -2.883e-02)); + r += mul(s1_7, M4(3.602e-02, 3.605e-01, -1.058e-01, -1.025e-01, 7.327e-02, 1.212e-02, 3.897e-02, -1.530e-03, -2.248e-01, 2.349e-01, 7.325e-02, -6.040e-02, 2.359e-01, 5.645e-01, 1.694e-02, -4.593e-02)); + r += mul(s1_8, M4(-6.717e-02, -2.712e-01, -7.268e-02, 4.477e-02, 5.479e-02, 2.246e-02, 3.345e-02, -7.484e-02, 4.180e-02, -4.276e-02, 2.712e-02, 1.372e-02, 6.067e-02, -6.065e-02, -1.066e-01, -1.852e-02)); + r += mul(s2_0, M4(-9.897e-02, -1.366e-01, 3.089e-02, -4.977e-03, 6.995e-02, 2.994e-01, 8.808e-02, -3.481e-02, -5.962e-02, -5.574e-02, -5.478e-02, -2.862e-02, 3.514e-02, 9.242e-02, -1.727e-02, -1.140e-02)); + r += mul(s2_1, M4(-2.045e-01, 1.060e-01, 1.197e-01, -7.549e-02, 2.766e-01, -3.171e-02, 8.807e-02, -1.171e-02, 8.605e-02, -1.305e-01, -1.057e-01, -8.969e-02, -1.155e-01, 3.084e-02, -2.138e-02, -5.441e-03)); + r += mul(s2_2, M4(-5.702e-02, -1.392e-02, 2.288e-02, 9.423e-02, 1.703e-02, -8.309e-02, 8.809e-03, -1.677e-01, -1.509e-02, -4.547e-02, 4.150e-02, -3.334e-02, -1.208e-01, 9.868e-02, -8.768e-02, -1.492e-02)); + r += mul(s2_3, M4(-1.112e-02, 1.112e-01, -3.933e-02, 2.128e-02, -2.588e-03, 3.539e-01, 3.261e-02, -4.850e-02, 5.691e-02, -1.492e-01, 4.581e-02, 1.560e-02, 1.683e-01, -2.399e-02, 9.759e-02, -8.359e-02)); + r += mul(s2_4, M4(-9.395e-02, 3.051e-02, -2.703e-01, -5.509e-02, -7.402e-02, 1.713e-01, -1.217e-02, -1.481e-01, -1.499e-01, 9.432e-02, 1.353e-01, 1.110e-01, 7.470e-02, -1.484e-01, 2.865e-02, 1.123e-01)); + r += mul(s2_5, M4(-4.374e-02, 2.185e-01, -1.399e-02, -3.567e-02, 1.530e-01, 2.002e-01, 1.431e-02, -2.271e-01, -1.001e-01, -9.959e-03, -2.941e-02, -3.313e-02, 4.434e-02, -1.691e-02, 3.744e-02, 2.550e-01)); + r += mul(s2_6, M4(-7.543e-02, -1.643e-02, 3.870e-02, -2.994e-02, -9.913e-02, -4.311e-02, -7.535e-02, 7.141e-02, -1.986e-02, -3.983e-02, -1.601e-02, 1.515e-02, 5.399e-02, -1.822e-02, -1.145e-01, -1.189e-01)); + r += mul(s2_7, M4(5.299e-02, 5.771e-02, -1.905e-02, 4.469e-04, -8.914e-03, 1.371e-01, -3.636e-02, -1.195e-03, -3.347e-02, -3.162e-02, -3.516e-02, -1.002e-01, -1.821e-01, 1.202e-01, 8.073e-02, 1.828e-02)); + r += mul(s2_8, M4(-3.079e-02, 4.782e-02, 4.581e-02, 3.428e-02, 1.364e-02, 3.328e-02, 1.065e-01, -5.447e-02, 1.521e-02, 1.987e-03, -5.060e-02, -4.637e-02, -1.284e-01, 1.990e-02, -5.804e-02, 5.293e-02)); + r += mul(s3_0, M4(-3.279e-02, -1.138e-01, -7.613e-02, 5.656e-02, -2.444e-02, -4.692e-02, 2.756e-02, 3.238e-02, -5.189e-03, 6.887e-04, -2.633e-02, -4.697e-02, -7.190e-02, 1.854e-01, 1.255e-01, -5.488e-02)); + r += mul(s3_1, M4(8.669e-02, -3.164e-02, 8.179e-02, -2.261e-02, 9.947e-02, 7.810e-02, -2.032e-02, 9.205e-03, 1.738e-01, 2.339e-02, -3.427e-02, -4.536e-02, 2.671e-01, 1.905e-01, -1.258e-01, -1.761e-01)); + r += mul(s3_2, M4(9.081e-02, 2.051e-02, -6.132e-03, -2.126e-02, -1.383e-01, -1.578e-02, -2.328e-02, 3.190e-03, 1.567e-01, -6.032e-02, 8.671e-02, 1.130e-02, -1.476e-01, 1.344e-01, -1.120e-01, -5.130e-02)); + r += mul(s3_3, M4(-2.872e-02, 1.763e-02, -7.216e-02, -1.072e-01, -1.180e-01, -1.004e-01, -4.798e-02, -2.352e-02, 1.105e-01, -2.879e-02, 1.592e-02, 6.813e-03, -4.098e-01, -1.040e-01, -2.934e-01, 3.858e-02)); + r += mul(s3_4, M4(8.946e-02, 9.835e-02, -2.144e-01, 5.372e-02, -2.239e-01, -2.255e-02, -1.035e-01, -1.412e-01, -2.732e-01, 1.072e-01, 3.488e-02, 1.192e-01, 3.397e-01, 2.329e-01, 4.348e-02, -1.439e-01)); + r += mul(s3_5, M4(-1.008e-01, -5.632e-02, -7.657e-03, -2.069e-02, -1.341e-01, -2.471e-02, 7.401e-02, 4.367e-03, -1.240e-02, 1.633e-01, -1.791e-03, -1.558e-01, -1.800e-01, -2.511e-01, 1.134e-01, -1.670e-02)); + r += mul(s3_6, M4(-3.769e-02, 9.544e-03, 4.993e-02, 3.764e-03, 3.193e-02, -9.158e-02, -9.055e-02, 4.805e-02, 6.795e-02, 5.456e-02, -1.025e-01, 1.730e-02, 1.168e-02, 1.310e-01, -3.507e-02, 4.382e-02)); + r += mul(s3_7, M4(-5.501e-02, -3.820e-02, 5.317e-02, -6.017e-02, 1.382e-01, 1.471e-01, -1.624e-01, 2.640e-02, 2.001e-02, 1.615e-01, -6.277e-02, -9.653e-02, -2.665e-01, 2.116e-01, -1.292e-02, -5.260e-02)); + r += mul(s3_8, M4(4.992e-02, 9.520e-02, -3.869e-02, 7.041e-02, -1.096e-01, -7.984e-02, 6.372e-02, 4.116e-02, -5.481e-02, 6.716e-02, -7.373e-02, 3.300e-02, -1.699e-01, 1.113e-01, -5.838e-02, 2.048e-02)); + r += mul(s4_0, M4(3.478e-03, 1.604e-01, 1.143e-02, 3.950e-02, 2.978e-02, -2.053e-02, 1.382e-02, -3.209e-02, -4.983e-02, -1.550e-01, 1.172e-02, -1.038e-01, 5.117e-02, -4.133e-02, 1.129e-01, 1.274e-02)); + r += mul(s4_1, M4(1.712e-01, -3.888e-02, -1.187e-01, 6.333e-02, 2.066e-02, 1.027e-01, -6.894e-02, -9.356e-02, -1.740e-01, 4.635e-02, 1.101e-01, -9.743e-02, -1.694e-01, -3.618e-02, 1.157e-01, 9.724e-03)); + r += mul(s4_2, M4(1.616e-01, -8.447e-03, -3.057e-02, -5.442e-02, -1.433e-01, -5.447e-02, -4.839e-02, 3.747e-02, -2.974e-02, -2.371e-02, 8.349e-03, -7.386e-02, 2.599e-03, 1.992e-02, 5.651e-02, -9.889e-02)); + r += mul(s4_3, M4(-1.205e-01, 4.766e-02, -1.792e-01, -7.001e-03, -1.023e-01, 2.760e-03, -1.750e-01, 1.432e-02, 2.140e-02, -1.442e-02, -1.203e-02, 5.236e-03, 2.750e-02, 5.747e-02, 4.160e-02, 1.839e-02)); + r += mul(s4_4, M4(1.175e-01, -6.460e-02, -1.678e-01, -1.293e-01, 4.098e-02, -1.212e-01, -9.402e-02, -1.696e-01, -1.637e-01, -2.059e-02, -3.352e-02, 1.008e-01, -2.280e-01, -1.991e-02, 1.460e-01, -5.383e-02)); + r += mul(s4_5, M4(-5.260e-02, -6.286e-02, -7.651e-02, -3.258e-01, -8.880e-02, -6.865e-02, -2.491e-02, 5.650e-02, 3.969e-03, 4.130e-05, 7.006e-02, -8.126e-02, 3.293e-04, 1.805e-02, 1.934e-01, -4.173e-02)); + r += mul(s4_6, M4(2.222e-02, 5.658e-02, -1.776e-03, 3.331e-02, 2.624e-02, 4.201e-02, -1.271e-01, 1.976e-02, -7.570e-02, -5.879e-02, 1.233e-01, -4.147e-02, 5.968e-02, -1.057e-02, -4.891e-02, -6.360e-02)); + r += mul(s4_7, M4(7.232e-02, -1.316e-01, 8.325e-02, -3.296e-02, 1.187e-01, 2.971e-02, 8.751e-02, -3.254e-02, -1.432e-01, -2.923e-02, 1.748e-01, 7.771e-02, 1.595e-01, 1.106e-01, -1.131e-01, 1.774e-02)); + r += mul(s4_8, M4(-9.671e-02, -5.734e-02, -5.968e-02, -3.762e-02, 1.582e-02, 1.257e-02, 3.137e-02, -7.635e-04, -7.236e-02, -3.294e-02, -3.009e-02, -7.280e-02, -7.171e-02, -4.889e-03, -2.667e-02, -4.693e-03)); + r += mul(s5_0, M4(9.525e-03, 2.583e-01, 1.577e-01, -8.960e-02, -1.342e-01, 5.619e-02, 7.415e-02, -5.099e-02, 1.083e-02, -1.041e-02, 7.983e-02, 5.332e-02, -7.776e-03, -6.704e-02, 1.509e-01, 4.181e-02)); + r += mul(s5_1, M4(-2.083e-01, 1.158e-01, -2.234e-02, 7.118e-02, 5.266e-02, 4.810e-02, 9.202e-02, -1.003e-01, -1.734e-01, 4.296e-02, 1.714e-01, -2.401e-03, -1.137e-01, -1.756e-01, 6.021e-02, -2.741e-02)); + r += mul(s5_2, M4(6.815e-02, 5.817e-02, -6.170e-02, -4.732e-02, 3.478e-02, -4.199e-03, -1.851e-02, -3.221e-03, 8.744e-02, 5.604e-02, 5.947e-02, -1.328e-01, 1.943e-02, -8.131e-03, 1.900e-02, -7.607e-02)); + r += mul(s5_3, M4(2.857e-01, 1.539e-01, 1.038e-01, 1.132e-02, 1.329e-02, 2.174e-01, 1.244e-02, 8.200e-02, -4.505e-02, -5.227e-02, 4.619e-04, 6.776e-02, -5.088e-02, -3.256e-02, 6.318e-02, -4.579e-02)); + r += mul(s5_4, M4(-4.660e-02, -2.435e-01, -6.781e-03, -7.809e-02, 1.874e-01, -1.164e-01, -1.782e-01, -2.800e-01, 2.698e-02, 6.071e-02, -5.110e-02, 7.245e-02, 1.245e-02, 1.899e-01, 1.096e-01, -5.294e-02)); + r += mul(s5_5, M4(8.890e-02, 9.728e-02, 4.997e-02, -9.887e-02, 5.615e-02, 2.021e-02, -2.259e-02, -1.068e-01, -3.950e-02, -8.120e-02, -1.665e-02, -4.129e-02, -8.374e-02, -1.258e-01, 1.182e-01, -1.213e-02)); + r += mul(s5_6, M4(-8.262e-03, 1.664e-02, -7.024e-02, -3.985e-02, -2.808e-02, 1.221e-01, -1.890e-01, -1.087e-01, 1.692e-02, -1.162e-02, 2.958e-02, 2.775e-02, -6.859e-02, -1.296e-02, 1.193e-02, 4.396e-03)); + r += mul(s5_7, M4(8.172e-02, 1.117e-01, -1.482e-02, 5.308e-03, -5.901e-03, -5.041e-02, 4.588e-02, -1.821e-02, 8.305e-02, 1.224e-01, -6.272e-03, 1.969e-02, 4.009e-02, -3.353e-02, 6.791e-02, -1.372e-02)); + r += mul(s5_8, M4(-1.109e-01, -1.571e-02, -4.466e-02, 9.630e-02, 7.569e-03, 6.390e-02, 2.270e-02, 7.346e-03, 2.162e-02, 6.602e-02, -7.577e-02, 3.169e-02, 6.660e-03, -7.800e-02, -5.085e-03, 7.740e-02)); + r += mul(s6_0, M4(-1.017e-01, -4.034e-02, 6.708e-02, 7.748e-02, -7.052e-02, -6.251e-02, 6.019e-02, -4.987e-03, 1.404e-01, 1.748e-01, -1.077e-01, 8.488e-02, -5.884e-03, -4.451e-03, 2.979e-02, -3.478e-02)); + r += mul(s6_1, M4(-2.065e-02, 2.125e-01, 1.827e-01, -1.059e-01, 5.760e-02, 7.237e-02, 6.810e-02, 8.762e-03, -8.153e-02, 8.979e-02, -9.872e-03, 7.730e-02, 9.600e-02, -1.581e-01, 9.862e-02, -8.078e-02)); + r += mul(s6_2, M4(1.839e-02, 8.069e-02, -5.765e-02, -3.410e-02, -1.856e-01, 3.381e-02, -4.610e-02, -1.308e-02, 7.696e-02, -3.619e-02, 1.082e-01, -1.086e-01, 8.181e-02, -3.576e-02, 8.041e-03, -1.460e-01)); + r += mul(s6_3, M4(-1.003e-01, 6.476e-02, 4.396e-02, -1.430e-02, -1.837e-02, 1.834e-01, 1.998e-02, 6.159e-02, -9.878e-02, 1.229e-01, -9.909e-02, -8.428e-02, 2.370e-02, -1.355e-01, 1.162e-02, -9.837e-03)); + r += mul(s6_4, M4(1.037e-01, 1.753e-01, -1.921e-01, -6.578e-02, 6.742e-02, 3.040e-02, 1.255e-01, 6.624e-02, 8.632e-02, 1.224e-02, -7.217e-03, 9.856e-02, 1.402e-01, 1.209e-01, 1.964e-01, -2.759e-02)); + r += mul(s6_5, M4(3.978e-02, 2.199e-02, -2.567e-02, -1.525e-01, -1.993e-01, 9.225e-02, -8.903e-02, -1.027e-01, 1.432e-01, 7.147e-02, 3.857e-03, -6.097e-02, 1.333e-01, -4.337e-02, -7.006e-02, -2.442e-01)); + r += mul(s6_6, M4(-1.520e-01, -1.692e-02, 1.714e-02, 5.022e-02, -9.391e-02, 5.515e-03, 4.718e-02, -1.328e-02, -2.968e-02, -6.351e-02, -5.077e-02, 7.981e-02, 5.259e-02, -1.407e-02, 3.420e-02, -9.187e-02)); + r += mul(s6_7, M4(4.626e-03, 7.643e-03, 7.219e-02, -4.271e-02, 7.871e-02, 8.244e-03, 2.424e-01, 9.938e-02, 1.456e-01, -4.297e-03, -7.914e-02, -4.582e-02, 1.354e-01, -1.694e-02, -8.773e-02, 1.764e-02)); + r += mul(s6_8, M4(-4.360e-02, 6.883e-02, -3.494e-02, -3.672e-02, -1.503e-01, 5.198e-02, -1.430e-02, 2.389e-02, -7.594e-02, -1.904e-02, 5.872e-02, 3.285e-02, 1.975e-01, 1.726e-01, -9.447e-02, -9.414e-02)); + r += mul(s7_0, M4(3.853e-02, -1.717e-01, 2.571e-02, -4.859e-03, 4.389e-02, -1.690e-01, 1.320e-02, -3.390e-02, -1.307e-01, 5.201e-02, 2.112e-01, -5.495e-02, -3.004e-02, 5.965e-02, -5.489e-03, 4.998e-02)); + r += mul(s7_1, M4(-1.303e-03, 5.981e-03, 4.903e-02, 7.560e-03, 1.147e-01, -3.206e-02, -7.700e-02, -9.505e-02, 6.375e-02, 1.431e-01, 2.929e-01, -1.937e-01, -4.918e-02, 3.872e-02, 1.358e-01, 4.230e-02)); + r += mul(s7_2, M4(-1.391e-01, -6.461e-02, -4.030e-02, -3.580e-02, 1.159e-03, -8.988e-02, -1.543e-02, -1.233e-01, 1.509e-01, -5.529e-02, 1.104e-01, 1.352e-01, -5.030e-02, 5.567e-02, 1.109e-01, -2.720e-03)); + r += mul(s7_3, M4(-2.481e-02, -1.004e-01, 1.421e-02, -5.236e-03, -8.489e-03, -6.281e-02, -1.650e-02, 1.920e-02, 1.945e-02, -5.418e-02, -6.112e-02, -7.400e-02, -7.176e-02, 2.431e-02, -3.867e-02, -7.052e-03)); + r += mul(s7_4, M4(-4.605e-02, -1.893e-02, -2.272e-01, -6.262e-02, 1.103e-01, -2.067e-01, 9.526e-02, 1.047e-01, -1.670e-01, -1.132e-01, 1.711e-01, 7.622e-03, -7.388e-02, 1.010e-02, -1.279e-02, 4.707e-02)); + r += mul(s7_5, M4(3.021e-02, 8.185e-02, -1.230e-01, 2.231e-01, -3.762e-02, -2.493e-01, -2.623e-02, -2.778e-01, 6.918e-02, 1.902e-02, -9.916e-02, -2.807e-01, -4.177e-02, 3.213e-02, -5.395e-02, 5.346e-02)); + r += mul(s7_6, M4(-3.677e-02, 8.425e-03, 1.583e-02, -7.588e-03, 3.335e-02, 4.774e-02, -1.190e-02, 1.936e-02, -5.956e-02, -2.931e-02, -6.092e-02, 6.113e-02, 8.702e-03, -2.472e-02, -7.609e-03, -7.800e-02)); + r += mul(s7_7, M4(-1.198e-01, 6.918e-02, -2.854e-02, 2.875e-02, 8.723e-02, -1.937e-01, 2.986e-02, 1.310e-01, -6.265e-02, -1.409e-01, -1.194e-01, 2.090e-01, -1.643e-02, -1.501e-01, 4.103e-02, -1.420e-02)); + r += mul(s7_8, M4(2.341e-02, 8.679e-02, 1.332e-02, 7.991e-02, 1.440e-01, -8.666e-02, 5.631e-02, -8.778e-02, 1.794e-01, 4.280e-02, -1.685e-02, -1.721e-01, -4.744e-02, 4.625e-02, -3.583e-02, -2.333e-02)); + r += V4(2.939e-02, 1.703e-02, -4.544e-03, -7.752e-03); + return r; +} + +V4 f1(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(6.320e-02, -7.718e-02, 9.506e-02, 7.016e-03, -6.464e-02, 2.906e-03, -1.199e-01, 9.856e-02, -8.741e-02, 3.326e-02, 1.542e-02, -5.129e-02, 1.470e-01, -7.230e-02, -6.427e-02, 3.123e-02)); + r += mul(s0_1, M4(-8.588e-02, -2.614e-02, 8.184e-02, 7.694e-02, -5.604e-02, 5.216e-02, 1.357e-01, 2.437e-01, -1.033e-01, 7.084e-02, 4.441e-02, 4.397e-02, -3.856e-02, -7.256e-02, 2.395e-02, 4.535e-03)); + r += mul(s0_2, M4(-4.604e-02, 1.596e-02, 1.392e-01, 3.868e-02, 5.121e-02, 2.543e-01, 7.318e-02, 7.010e-02, 3.419e-02, 3.113e-02, -1.747e-02, -2.473e-02, -2.759e-02, -9.824e-02, -7.014e-02, -6.002e-02)); + r += mul(s0_3, M4(-3.614e-02, -1.616e-01, -5.425e-02, 8.711e-02, -7.508e-02, 1.317e-01, 3.801e-02, 3.961e-02, -2.620e-03, -1.130e-02, -2.620e-02, 5.976e-02, -7.145e-03, 1.283e-01, -7.578e-02, -7.914e-02)); + r += mul(s0_4, M4(4.839e-02, -1.199e-02, -3.252e-02, 5.731e-02, -1.909e-01, 1.175e-01, -1.192e-01, 1.086e-01, -9.094e-02, 1.143e-01, -3.654e-02, -3.028e-02, -8.647e-02, -6.826e-02, -1.610e-01, -3.038e-03)); + r += mul(s0_5, M4(-1.978e-02, -1.834e-02, -4.260e-02, -1.173e-01, 1.760e-01, 1.418e-01, 4.347e-02, -2.425e-01, 3.787e-02, -2.291e-02, 5.158e-02, 6.051e-03, 2.596e-02, 7.399e-02, 1.628e-02, 7.668e-02)); + r += mul(s0_6, M4(-1.158e-02, -3.459e-02, -7.090e-03, 6.518e-02, 1.804e-02, -4.394e-02, -1.789e-02, 5.996e-03, -6.698e-03, 4.131e-02, 1.149e-01, -8.381e-02, 7.473e-02, 1.978e-03, 9.873e-02, 8.531e-03)); + r += mul(s0_7, M4(3.496e-02, 8.744e-02, 4.371e-02, -1.088e-01, -3.036e-02, -5.697e-02, 1.940e-02, -6.022e-03, 6.581e-03, 3.124e-03, 1.142e-02, -8.218e-02, 3.751e-02, -1.171e-01, -7.349e-03, -1.270e-01)); + r += mul(s0_8, M4(4.895e-02, 2.241e-02, 5.956e-03, -3.883e-02, -7.192e-02, 1.757e-01, 4.466e-02, 4.012e-02, -3.673e-02, -1.307e-02, -2.441e-02, -9.896e-02, -2.868e-02, -1.131e-02, 4.646e-02, 9.386e-02)); + r += mul(s1_0, M4(-1.430e-03, 3.561e-02, -3.690e-01, 1.564e-01, 3.685e-02, 2.425e-03, -1.631e-01, -4.238e-02, -2.123e-01, -5.178e-02, 9.378e-02, -7.436e-02, 6.296e-02, -6.532e-02, -2.221e-01, 6.686e-01)); + r += mul(s1_1, M4(-9.776e-03, -4.756e-02, -5.781e-02, 2.344e-01, -4.454e-02, -1.328e-01, -4.029e-02, 1.455e-01, -2.053e-01, 1.001e-02, 1.591e-01, -2.491e-01, -2.265e-01, -2.036e-01, -3.604e-02, -6.287e-03)); + r += mul(s1_2, M4(1.567e-01, 1.016e-01, -1.516e-01, -7.148e-02, 2.769e-02, 5.141e-02, 2.809e-02, -5.084e-02, -1.296e-01, 3.819e-02, 3.261e-01, -2.187e-01, 1.355e-02, -2.216e-01, 4.251e-03, 2.603e-02)); + r += mul(s1_3, M4(-5.761e-02, 1.639e-01, 1.786e-01, -3.273e-01, 9.615e-02, 6.864e-02, 9.650e-02, -4.877e-02, -4.408e-02, 7.343e-03, 7.796e-02, -2.653e-01, 1.835e-01, 1.345e-01, 9.666e-02, 2.262e-01)); + r += mul(s1_4, M4(-3.391e-01, 4.119e-02, 2.529e-01, -2.811e-01, -2.786e-03, -1.297e-01, -8.726e-02, 7.554e-02, -3.214e-01, -4.229e-02, 6.652e-02, -3.961e-01, -5.312e-02, -1.620e-01, 1.159e-02, 2.044e-01)); + r += mul(s1_5, M4(-8.320e-02, 1.444e-01, 1.536e-01, -3.765e-01, 2.449e-02, -3.528e-02, -1.436e-01, -9.440e-02, -2.857e-01, -3.807e-01, 1.571e-01, -1.162e-01, 2.310e-02, 1.582e-01, 1.143e-01, -1.543e-02)); + r += mul(s1_6, M4(-5.282e-02, 1.744e-01, 4.193e-02, 2.067e-01, -1.906e-02, 6.041e-02, 4.649e-02, -4.463e-03, -6.232e-02, 4.702e-02, 1.993e-01, -3.678e-01, 2.422e-01, 1.648e-01, 1.056e-01, 3.540e-01)); + r += mul(s1_7, M4(-2.235e-01, 5.221e-01, 1.819e-01, 5.619e-02, -1.677e-02, -1.433e-01, 1.799e-02, 1.457e-02, -1.292e-01, 1.292e-01, 2.298e-01, -3.856e-01, 1.253e-01, -2.538e-01, -2.143e-01, -3.131e-01)); + r += mul(s1_8, M4(-1.091e-01, 6.784e-02, -2.271e-01, -5.712e-02, -8.358e-02, -2.816e-02, -1.511e-02, -9.424e-02, -4.637e-02, -1.751e-01, 1.128e-01, -1.316e-01, 3.199e-03, 3.003e-02, -2.507e-03, 3.708e-02)); + r += mul(s2_0, M4(7.022e-02, 9.826e-03, 1.264e-01, -6.655e-02, -9.567e-02, 7.824e-02, -1.140e-01, -6.869e-02, -4.578e-02, -4.380e-02, 8.145e-02, 1.228e-02, 2.101e-02, -2.336e-02, 4.873e-02, -4.936e-02)); + r += mul(s2_1, M4(9.575e-03, 5.262e-02, -9.150e-02, 4.189e-02, -7.853e-02, 2.990e-02, -4.065e-03, -1.226e-01, -3.636e-04, 1.089e-02, 9.353e-02, 1.230e-02, 6.342e-03, -4.481e-02, -3.678e-02, -3.514e-03)); + r += mul(s2_2, M4(1.176e-01, -1.579e-01, 4.680e-02, 2.423e-02, -1.349e-01, -2.077e-01, 3.620e-02, -1.201e-01, -2.024e-02, -6.755e-03, 2.079e-02, 4.859e-02, 1.734e-01, 8.149e-03, 1.137e-01, 2.593e-03)); + r += mul(s2_3, M4(1.332e-02, -1.541e-01, -5.517e-02, -2.061e-02, 7.641e-02, -4.840e-02, -1.162e-01, -3.291e-01, -1.245e-01, 3.492e-02, -2.600e-02, 1.613e-01, 9.448e-02, 1.412e-01, 2.535e-02, -1.406e-01)); + r += mul(s2_4, M4(2.151e-01, -1.365e-02, 1.180e-02, 2.581e-02, 6.572e-02, -1.372e-02, -1.722e-01, -1.926e-01, 4.826e-02, -1.078e-01, -1.183e-01, -7.610e-02, -7.766e-03, 4.998e-02, -1.190e-02, -1.360e-02)); + r += mul(s2_5, M4(2.103e-01, -1.463e-02, -1.856e-01, 2.490e-02, 2.971e-02, -1.128e-01, -2.542e-01, -1.356e-01, -8.917e-03, 6.293e-02, -1.829e-02, -5.433e-02, 8.434e-02, -1.365e-01, -2.178e-01, -9.137e-02)); + r += mul(s2_6, M4(3.370e-01, -2.690e-01, -1.512e-02, -1.231e-01, -5.368e-02, -6.936e-02, 5.311e-02, -3.567e-02, 7.326e-02, -7.379e-02, 3.780e-03, -4.926e-03, -5.118e-03, 4.603e-02, 1.331e-02, 7.783e-02)); + r += mul(s2_7, M4(1.102e-01, -4.355e-02, -1.842e-01, -4.951e-02, -2.790e-02, -2.210e-01, -4.385e-02, -1.147e-01, 3.262e-02, 2.523e-02, -3.362e-02, 5.086e-02, -7.375e-02, 5.865e-03, 7.601e-02, 1.326e-01)); + r += mul(s2_8, M4(2.669e-01, -2.111e-01, 7.244e-03, -7.698e-02, -2.844e-02, -4.207e-02, -3.568e-03, -6.819e-02, 3.351e-02, 2.784e-03, 2.415e-04, -2.362e-02, -2.661e-02, 2.854e-02, -2.674e-02, -6.056e-02)); + r += mul(s3_0, M4(3.955e-02, 2.142e-02, -2.566e-02, 1.080e-02, 4.278e-02, -7.498e-02, 3.332e-02, 1.456e-02, -3.917e-03, -3.820e-02, -1.247e-01, -6.262e-02, -2.027e-02, -1.745e-01, -1.151e-01, -1.639e-02)); + r += mul(s3_1, M4(5.990e-02, 4.835e-02, -1.038e-01, 7.007e-02, -2.788e-02, 2.322e-03, 1.116e-01, -9.015e-02, 4.873e-02, -7.391e-02, 1.696e-02, 4.602e-02, -2.696e-01, -1.999e-01, -1.103e-01, -1.714e-02)); + r += mul(s3_2, M4(3.210e-02, -8.543e-02, -8.054e-02, -1.211e-02, 1.079e-02, 3.980e-02, 6.774e-02, -3.586e-02, -5.813e-02, -9.956e-02, -1.907e-02, -8.042e-02, -1.100e-01, 1.353e-01, -4.048e-02, 2.285e-02)); + r += mul(s3_3, M4(-2.530e-02, -3.663e-02, 5.284e-02, -7.050e-02, -3.852e-02, 6.278e-03, -7.247e-02, -2.077e-02, 7.670e-04, 4.137e-02, 4.632e-02, 4.830e-02, 2.586e-01, 6.367e-02, -6.495e-02, -3.022e-02)); + r += mul(s3_4, M4(-2.026e-01, 1.004e-01, 2.051e-01, 1.364e-02, 1.316e-01, 9.292e-02, -5.945e-02, 1.091e-01, 1.033e-01, -1.929e-01, -1.421e-01, -5.142e-02, -1.676e-02, -2.549e-01, 2.412e-01, -3.018e-01)); + r += mul(s3_5, M4(-3.704e-02, -6.964e-02, 6.598e-03, 8.814e-02, 7.165e-02, -4.431e-02, -1.288e-01, -5.984e-02, 3.779e-02, -1.225e-01, -3.971e-03, 5.088e-02, -5.586e-02, -7.200e-02, 2.022e-02, -1.665e-01)); + r += mul(s3_6, M4(-1.237e-01, -1.838e-01, 1.462e-02, -7.791e-02, 1.130e-01, 6.404e-02, 5.346e-02, -4.299e-04, 1.870e-02, 4.440e-02, 3.492e-03, 1.038e-01, -6.858e-02, -2.071e-02, -2.566e-02, 4.679e-02)); + r += mul(s3_7, M4(-7.821e-02, 9.331e-02, -6.336e-02, 8.823e-02, -4.691e-03, -1.123e-02, -4.472e-02, 1.027e-01, -5.471e-02, 8.144e-02, 1.998e-02, 1.143e-01, -2.183e-01, 7.181e-02, -3.760e-02, -8.993e-02)); + r += mul(s3_8, M4(5.917e-02, -2.845e-02, -2.938e-02, -3.687e-02, -1.116e-01, -1.184e-01, 1.099e-01, 1.020e-01, 2.030e-03, 1.817e-03, -3.595e-02, 4.143e-04, -5.942e-02, 3.027e-02, -4.019e-02, 9.432e-02)); + r += mul(s4_0, M4(-4.261e-02, 1.766e-02, 9.293e-02, -5.081e-02, 9.748e-02, -6.530e-02, -1.216e-01, 1.010e-02, -2.167e-01, -7.010e-03, 2.974e-02, -4.901e-02, -2.646e-03, 1.033e-02, -6.713e-02, -1.442e-01)); + r += mul(s4_1, M4(7.373e-02, -6.465e-02, -7.503e-02, -7.127e-02, -1.255e-01, 1.340e-02, -1.245e-01, 3.496e-02, -1.546e-01, -3.533e-02, -5.367e-02, -8.579e-03, 1.241e-01, 1.731e-02, -1.479e-02, -2.206e-02)); + r += mul(s4_2, M4(5.265e-02, -7.941e-02, 5.017e-02, -2.362e-02, 2.740e-02, 6.718e-02, 1.580e-02, -4.146e-02, -5.366e-02, -3.145e-02, 1.035e-01, 2.084e-02, 1.680e-02, -9.646e-02, -1.065e-01, -1.834e-02)); + r += mul(s4_3, M4(8.164e-02, 7.382e-03, 5.676e-02, 7.940e-02, 8.327e-02, 7.134e-02, 1.251e-01, -1.103e-02, -1.549e-01, -6.383e-02, 1.144e-02, -7.174e-02, 3.976e-02, 8.730e-02, -1.003e-01, -5.632e-02)); + r += mul(s4_4, M4(1.269e-01, -1.364e-01, 2.985e-01, 4.161e-02, 3.140e-03, 9.006e-02, -1.225e-02, 2.627e-01, -3.744e-01, 4.081e-02, 9.455e-02, 3.477e-02, -9.757e-03, 8.997e-03, -2.210e-01, 2.177e-01)); + r += mul(s4_5, M4(2.005e-02, 7.934e-02, -8.341e-03, 5.906e-02, 4.050e-02, 8.305e-02, -6.599e-02, 4.685e-02, -3.776e-02, -1.510e-01, 3.013e-02, -1.222e-02, -1.127e-01, 1.073e-02, -1.633e-02, -1.180e-01)); + r += mul(s4_6, M4(-3.381e-02, -4.626e-02, 3.144e-02, -6.961e-02, 9.662e-02, -1.304e-02, -4.102e-02, 6.509e-02, -1.617e-01, -1.666e-02, 2.633e-02, 1.079e-01, 1.275e-01, 2.305e-01, 1.164e-01, 5.076e-02)); + r += mul(s4_7, M4(8.643e-02, -1.511e-01, -6.230e-02, -6.197e-02, -6.672e-02, 2.599e-02, -7.017e-02, 5.437e-02, -1.406e-01, 3.464e-02, -8.536e-02, -5.700e-02, -8.383e-02, 1.391e-01, 3.891e-01, 8.632e-02)); + r += mul(s4_8, M4(4.181e-02, -4.849e-02, -7.718e-02, 7.518e-02, 1.577e-03, -1.840e-02, -9.197e-03, -4.337e-02, -1.126e-01, 5.666e-02, 1.596e-03, -1.028e-01, -1.218e-01, 6.298e-02, 1.049e-01, 8.461e-02)); + r += mul(s5_0, M4(-1.387e-01, 4.819e-03, 3.064e-02, -1.743e-01, 1.076e-01, -4.823e-02, -4.510e-02, 4.724e-02, -9.852e-03, 2.309e-03, -2.033e-02, -1.944e-02, 2.860e-03, 2.271e-02, -4.729e-02, -9.371e-02)); + r += mul(s5_1, M4(-7.357e-02, -5.027e-02, -1.819e-01, -5.641e-02, 8.112e-02, -4.896e-02, -9.809e-02, 5.778e-03, 4.078e-02, -6.831e-02, -1.898e-01, -1.351e-02, 1.226e-01, 6.178e-02, -4.512e-02, -2.158e-02)); + r += mul(s5_2, M4(5.850e-02, -5.272e-02, 1.044e-01, -7.582e-02, 1.749e-02, 4.037e-02, 6.002e-02, -6.747e-03, 1.003e-01, -9.924e-02, -9.152e-02, 5.488e-03, -1.101e-02, -7.243e-02, -1.296e-01, 1.558e-02)); + r += mul(s5_3, M4(6.173e-02, 1.755e-01, -7.152e-02, -3.348e-01, 3.104e-01, -6.098e-02, 2.352e-01, -3.734e-01, 5.136e-02, 4.157e-02, 5.028e-02, -1.600e-01, -1.269e-01, 4.136e-02, -1.563e-02, -6.619e-02)); + r += mul(s5_4, M4(-1.144e-02, 2.076e-01, 6.527e-02, -1.160e-01, -1.525e-01, 8.878e-02, 2.254e-01, 1.486e-01, -1.173e-01, -2.311e-02, 3.828e-02, -3.514e-02, -1.886e-01, 1.043e-01, -1.510e-01, 7.074e-02)); + r += mul(s5_5, M4(2.749e-02, -6.254e-02, -1.639e-01, -2.591e-01, 7.234e-02, -1.603e-03, -9.239e-02, 4.716e-02, 2.100e-02, -1.405e-01, 1.463e-01, 8.715e-02, -1.764e-01, 1.204e-01, 3.718e-02, 3.813e-02)); + r += mul(s5_6, M4(2.766e-02, 1.623e-01, 1.378e-01, -1.562e-01, 1.616e-01, 8.169e-02, 5.208e-02, -1.288e-01, 6.320e-02, 9.176e-02, 1.180e-02, 1.137e-01, 8.061e-02, -1.175e-01, 6.469e-02, -1.322e-02)); + r += mul(s5_7, M4(-1.880e-01, 2.300e-02, 1.062e-01, 1.907e-02, -9.183e-02, -8.551e-02, 9.594e-02, 1.451e-01, 1.138e-01, 1.241e-01, -7.151e-02, 9.592e-02, 5.135e-02, -8.747e-02, -8.409e-02, -6.575e-02)); + r += mul(s5_8, M4(-2.020e-01, -1.719e-01, -6.394e-02, 1.819e-02, 8.297e-02, -9.173e-02, 5.302e-02, -9.164e-02, 1.000e-01, -1.038e-01, -8.130e-02, 1.412e-01, -1.411e-01, 1.092e-01, 2.095e-02, 9.288e-02)); + r += mul(s6_0, M4(-4.180e-02, -5.188e-02, 9.579e-02, -2.742e-02, -9.921e-04, 1.066e-02, 9.985e-02, -4.637e-02, 6.303e-02, -1.439e-02, 4.576e-02, -2.195e-02, 4.854e-02, -1.255e-01, -8.582e-03, 6.013e-02)); + r += mul(s6_1, M4(-3.422e-02, 2.045e-02, -4.093e-02, -1.336e-01, -8.530e-02, 5.189e-02, 1.427e-01, -1.012e-01, 1.486e-01, -1.828e-02, -9.215e-02, 2.158e-02, 1.942e-02, -1.541e-02, -1.068e-01, -3.169e-02)); + r += mul(s6_2, M4(-3.700e-02, -1.217e-01, 1.191e-01, -4.359e-03, -2.485e-02, 1.825e-02, 1.838e-01, -3.668e-02, 2.293e-02, 3.977e-02, -8.759e-02, 4.553e-03, -6.276e-02, -2.628e-02, -3.391e-02, 1.566e-04)); + r += mul(s6_3, M4(-1.024e-02, -2.777e-02, 4.128e-02, -6.782e-02, -3.726e-03, -5.963e-02, -9.420e-03, -9.402e-02, -8.151e-02, -9.414e-02, -3.991e-02, 7.724e-02, -7.746e-02, -7.503e-02, 7.464e-02, -8.905e-02)); + r += mul(s6_4, M4(-2.709e-01, 2.423e-01, 2.496e-01, 2.597e-03, -1.579e-01, 2.001e-01, -1.406e-01, -7.105e-02, 3.040e-01, -3.878e-02, -1.402e-01, -6.004e-02, -8.634e-02, -1.154e-01, 7.337e-02, -5.099e-02)); + r += mul(s6_5, M4(8.580e-02, -1.532e-01, 5.976e-02, 2.598e-01, -1.812e-02, 2.478e-01, -1.218e-02, 1.008e-01, -3.848e-02, -3.495e-02, 1.092e-03, -1.450e-01, -9.653e-02, -9.008e-02, 4.896e-02, 7.095e-02)); + r += mul(s6_6, M4(-1.837e-01, -1.233e-01, -1.180e-02, -1.169e-02, -1.061e-01, -2.287e-02, -8.552e-03, -5.326e-02, 7.852e-02, 7.589e-03, 2.108e-02, -4.405e-03, 3.078e-02, -9.147e-02, -1.023e-01, -1.030e-02)); + r += mul(s6_7, M4(1.237e-01, -2.445e-01, -2.362e-01, -2.529e-02, -7.137e-02, -5.691e-04, -7.231e-02, -1.206e-01, -5.707e-02, 8.429e-02, -2.818e-02, -5.455e-03, -1.368e-01, 1.412e-01, 1.685e-01, 1.579e-01)); + r += mul(s6_8, M4(8.906e-02, -7.479e-03, -4.303e-02, 4.799e-02, -8.465e-02, 7.594e-02, -1.030e-02, -1.335e-01, -8.414e-03, -4.142e-02, -7.459e-03, 3.904e-02, -1.490e-01, -8.325e-04, 6.042e-02, 1.324e-01)); + r += mul(s7_0, M4(4.533e-02, -5.916e-02, -9.127e-02, -4.446e-02, 8.467e-02, -1.642e-02, 9.352e-02, 3.970e-03, -1.636e-01, -1.423e-01, 4.556e-03, -1.125e-01, -4.726e-02, 8.311e-02, 5.499e-02, 3.963e-02)); + r += mul(s7_1, M4(4.547e-02, 3.472e-03, -8.499e-02, 6.881e-02, 8.495e-02, -8.364e-02, -4.263e-02, 1.058e-01, -9.016e-02, -7.198e-02, -1.056e-01, -6.057e-03, -4.490e-02, 1.829e-02, 4.157e-02, -8.081e-02)); + r += mul(s7_2, M4(-8.375e-02, -1.000e-02, -1.144e-02, 5.829e-02, 5.197e-02, -1.701e-01, -2.617e-02, -3.956e-02, 2.774e-03, -6.882e-02, -1.381e-01, -2.288e-01, -6.002e-02, 3.220e-02, -1.218e-03, 6.675e-02)); + r += mul(s7_3, M4(5.483e-02, -1.547e-02, -6.716e-03, -1.510e-01, 7.996e-02, -1.777e-02, 4.348e-02, 8.002e-02, 1.035e-01, -9.894e-03, -2.000e-02, 1.043e-01, -9.879e-02, -1.135e-01, -2.837e-02, 1.051e-01)); + r += mul(s7_4, M4(-2.424e-01, 2.243e-01, -3.853e-02, 2.895e-01, 2.039e-01, -1.486e-01, -3.057e-02, -6.787e-02, 1.795e-02, -1.118e-01, -2.165e-01, -4.785e-02, 5.191e-02, 1.092e-01, -1.205e-01, 1.643e-01)); + r += mul(s7_5, M4(2.205e-01, -2.171e-02, 4.996e-02, 9.916e-02, 5.749e-02, 3.081e-02, 8.032e-02, 1.415e-01, -2.332e-01, 1.230e-02, -1.489e-02, 2.408e-02, 4.951e-02, -7.304e-02, 3.857e-02, 3.996e-03)); + r += mul(s7_6, M4(-6.612e-02, 1.535e-02, -8.325e-02, 9.137e-02, 2.110e-02, 2.828e-02, -3.476e-02, -3.593e-02, 6.483e-03, -6.664e-02, 1.464e-01, 3.244e-03, -4.637e-02, -3.400e-02, 8.721e-03, -2.291e-02)); + r += mul(s7_7, M4(1.081e-01, -8.187e-03, -5.687e-02, 5.623e-02, 9.695e-02, 9.866e-03, -3.664e-02, -7.675e-03, 2.581e-02, 7.745e-02, 5.536e-02, -7.075e-02, -1.414e-01, -5.800e-02, -1.569e-02, 4.333e-02)); + r += mul(s7_8, M4(6.782e-02, 2.670e-02, -1.368e-02, -1.088e-01, -6.193e-02, -5.791e-02, 8.965e-02, -6.801e-03, 2.512e-02, -3.296e-02, 1.083e-01, 3.109e-02, 2.950e-02, 2.437e-02, -2.642e-02, 8.794e-03)); + r += V4(-1.256e-03, -1.254e-02, 2.979e-02, 1.394e-02); + return r; +} + +V4 f2(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(3.887e-02, 3.025e-02, 1.517e-03, -3.288e-02, -1.083e-01, -4.845e-02, 2.170e-02, 4.413e-02, 2.451e-02, -6.292e-02, -2.513e-02, 5.728e-02, 3.625e-02, 7.753e-02, 7.297e-02, -5.741e-02)); + r += mul(s0_1, M4(-1.728e-02, -5.232e-02, -8.858e-02, -2.687e-02, -1.604e-02, -6.041e-02, -1.106e-01, 7.307e-02, -3.834e-02, 1.996e-02, -1.364e-02, -1.310e-02, -1.076e-01, -1.056e-01, -1.804e-02, -1.684e-02)); + r += mul(s0_2, M4(1.105e-01, -2.900e-02, 5.276e-02, -5.441e-03, -7.289e-02, 1.312e-01, 1.417e-01, -7.838e-03, -9.457e-02, 3.891e-04, 6.369e-02, -1.775e-02, 9.250e-02, 1.866e-02, -9.643e-02, 4.267e-02)); + r += mul(s0_3, M4(-1.042e-01, 4.142e-02, -1.478e-01, -4.082e-02, -2.004e-01, -4.275e-02, 5.319e-02, 3.056e-02, -9.493e-03, 9.243e-03, -8.440e-02, -1.425e-02, -2.520e-02, -5.825e-02, 5.914e-02, -2.031e-02)); + r += mul(s0_4, M4(-1.251e-01, -1.828e-01, -3.615e-02, 9.177e-02, -2.178e-01, 1.441e-01, -1.189e-01, -4.995e-02, -6.180e-02, 2.246e-02, 2.158e-02, 2.159e-03, -1.302e-01, -7.711e-02, -1.093e-01, -1.144e-02)); + r += mul(s0_5, M4(1.565e-02, 2.006e-02, -2.840e-02, 4.644e-02, -1.280e-01, 7.514e-02, 6.596e-02, -1.821e-01, 3.658e-02, 8.469e-03, 5.564e-02, -5.136e-02, 2.397e-02, -1.296e-02, -4.520e-02, -1.471e-02)); + r += mul(s0_6, M4(-3.172e-02, 4.281e-02, 5.391e-04, -7.864e-02, -1.542e-02, 1.393e-02, 8.824e-02, -5.775e-02, -1.202e-02, 6.912e-02, 1.232e-02, 7.675e-03, -4.605e-03, 7.013e-03, -1.183e-02, -1.676e-02)); + r += mul(s0_7, M4(-1.415e-01, -5.271e-02, -5.525e-02, 6.507e-02, -3.757e-02, 3.016e-02, -1.386e-02, -4.343e-02, 1.544e-03, 1.466e-02, -1.114e-01, 7.776e-02, -2.544e-03, 1.628e-02, 1.985e-02, 5.872e-02)); + r += mul(s0_8, M4(3.167e-02, -7.367e-02, -4.462e-02, 3.674e-02, 5.715e-02, -3.717e-02, -5.898e-02, 2.154e-02, 1.026e-01, -8.293e-03, -4.104e-02, 9.261e-04, 2.202e-02, 2.020e-02, -7.776e-03, -8.210e-03)); + r += mul(s1_0, M4(-2.467e-01, -1.944e-02, 8.368e-02, 7.498e-02, 7.499e-02, 2.208e-03, 9.049e-02, -8.912e-02, -8.240e-02, 6.174e-02, 3.425e-02, -4.272e-02, -1.418e-01, 2.797e-01, 2.659e-01, -5.863e-02)); + r += mul(s1_1, M4(6.391e-02, -6.175e-02, -1.784e-02, -4.688e-03, 1.535e-01, -3.568e-02, 3.525e-02, 2.541e-02, -1.344e-01, 3.259e-01, -3.196e-02, -6.148e-02, -3.933e-02, 1.929e-01, -1.274e-02, -2.005e-01)); + r += mul(s1_2, M4(-7.743e-02, 1.428e-01, 1.349e-01, -5.239e-02, 1.095e-01, 4.970e-02, -1.311e-02, -1.640e-03, 1.850e-02, 1.172e-01, -2.602e-02, -4.640e-02, -1.370e-01, 8.976e-02, -8.676e-02, -7.201e-02)); + r += mul(s1_3, M4(-1.673e-01, 1.323e-01, 1.950e-02, -1.240e-02, 8.475e-02, 2.113e-02, 8.506e-02, -5.274e-02, 1.806e-01, 1.457e-01, 2.915e-01, -1.440e-01, -1.149e-01, -1.061e-01, -2.980e-02, 6.842e-02)); + r += mul(s1_4, M4(-2.799e-01, 2.112e-02, -2.612e-01, -1.700e-01, 3.217e-02, 1.276e-01, -9.203e-02, 2.761e-02, -2.181e-01, 5.061e-01, 3.991e-01, -1.106e-01, -2.741e-02, -2.481e-01, 2.170e-01, -2.852e-01)); + r += mul(s1_5, M4(3.487e-01, 7.214e-02, 4.494e-02, 5.371e-02, 8.193e-02, 9.480e-02, -1.073e-01, 2.985e-02, 1.997e-02, 7.729e-02, 9.772e-02, -7.332e-02, -2.498e-01, 6.762e-02, 2.293e-02, -2.888e-01)); + r += mul(s1_6, M4(4.480e-02, 1.056e-01, 1.198e-01, -1.012e-01, 1.828e-01, -7.560e-02, 3.066e-02, -6.429e-02, 8.751e-02, 3.170e-02, 7.807e-02, -3.122e-02, 9.162e-02, -1.106e-02, -1.311e-02, 9.599e-02)); + r += mul(s1_7, M4(3.818e-02, -1.433e-01, 3.782e-01, -2.188e-02, 3.919e-02, -8.324e-02, -3.761e-02, 1.588e-02, -1.014e-01, 1.850e-01, 2.286e-02, 3.918e-02, 1.407e-01, -6.814e-02, 1.631e-01, 1.562e-02)); + r += mul(s1_8, M4(-4.358e-04, -9.482e-02, 2.193e-01, -2.293e-01, 2.554e-01, -9.018e-02, -8.484e-02, 5.927e-02, 7.714e-02, 1.900e-01, 3.396e-02, 1.056e-02, -7.022e-02, 1.926e-02, 4.448e-02, 4.663e-02)); + r += mul(s2_0, M4(1.784e-02, -7.199e-02, -5.824e-02, 6.873e-02, -3.191e-04, -9.134e-02, 8.370e-02, -3.068e-02, -5.419e-02, -6.458e-02, 6.291e-03, 3.031e-02, -4.128e-02, 5.380e-02, 4.977e-02, -7.324e-03)); + r += mul(s2_1, M4(1.181e-02, -1.516e-01, -9.786e-02, 7.405e-02, 1.638e-01, -4.243e-02, 1.167e-01, 5.082e-02, 1.001e-01, 1.146e-01, -1.138e-01, 3.022e-02, -4.277e-02, 1.614e-02, 9.942e-02, -7.122e-03)); + r += mul(s2_2, M4(1.158e-01, -1.022e-01, -2.080e-02, -7.057e-02, 5.919e-02, -1.602e-01, -5.761e-02, 6.987e-02, 1.531e-01, -6.507e-02, -8.643e-02, 9.661e-02, -4.889e-02, -4.945e-03, -1.143e-02, -2.502e-02)); + r += mul(s2_3, M4(-1.857e-01, 1.340e-01, -2.733e-01, 1.031e-01, -4.808e-02, 1.324e-01, 4.173e-02, 3.009e-02, -1.060e-01, -2.040e-02, 9.355e-03, 6.253e-02, 5.537e-02, 8.865e-02, 1.822e-01, -1.006e-01)); + r += mul(s2_4, M4(-9.784e-02, 2.023e-02, -1.142e-01, -2.146e-01, -3.103e-02, 1.708e-02, 1.423e-01, 3.270e-02, -1.197e-01, 2.456e-01, -1.454e-01, 3.783e-01, 1.439e-02, -4.989e-03, 8.481e-02, 5.491e-03)); + r += mul(s2_5, M4(1.557e-01, -1.260e-02, 9.447e-02, 7.943e-02, 2.710e-02, 5.271e-02, 2.650e-02, 7.770e-02, 7.340e-02, -5.755e-02, -3.267e-03, 8.076e-02, -7.777e-02, 6.201e-02, 2.384e-02, -6.711e-03)); + r += mul(s2_6, M4(-1.337e-01, 2.017e-01, 1.967e-01, 8.228e-02, -1.399e-03, -1.107e-01, 1.128e-02, 8.017e-02, -2.114e-02, 2.236e-02, 3.746e-02, 1.154e-01, 7.151e-03, -4.103e-02, 2.060e-01, 3.782e-02)); + r += mul(s2_7, M4(1.582e-01, 4.512e-02, 1.201e-01, 3.814e-02, -8.135e-02, -5.291e-03, -5.477e-03, 9.017e-02, 1.552e-01, -3.701e-02, -7.238e-02, 1.975e-01, 4.302e-02, -3.722e-02, -7.104e-02, 1.231e-01)); + r += mul(s2_8, M4(-1.981e-02, 1.215e-01, -6.274e-02, 5.424e-02, 9.411e-02, 6.553e-02, -7.473e-02, 1.218e-01, 4.111e-03, 1.296e-02, -1.339e-02, 6.284e-02, -3.329e-02, 4.491e-03, -4.000e-02, 2.687e-02)); + r += mul(s3_0, M4(1.900e-02, 3.132e-02, -1.107e-02, 2.916e-02, -2.324e-02, -3.320e-02, -7.677e-02, -3.622e-03, -1.094e-01, 2.387e-02, 8.828e-03, 4.683e-03, 2.363e-01, 6.495e-02, 6.438e-02, -4.063e-03)); + r += mul(s3_1, M4(1.306e-02, -7.558e-03, 8.329e-04, 8.291e-02, 1.002e-01, 6.220e-02, 3.872e-02, 2.616e-02, -6.577e-02, 1.472e-01, -1.272e-01, 1.232e-02, 1.216e-01, 3.466e-02, -5.328e-02, 3.051e-02)); + r += mul(s3_2, M4(2.935e-02, -8.973e-02, 6.832e-02, -2.761e-02, 3.865e-02, 2.328e-02, -7.397e-02, -1.242e-02, 2.967e-02, 1.057e-01, -1.049e-01, 1.078e-01, -6.954e-02, 1.442e-02, 1.111e-01, -4.695e-02)); + r += mul(s3_3, M4(2.117e-02, 6.500e-02, -7.845e-02, 8.502e-04, -6.699e-02, 3.160e-02, -8.446e-02, -3.742e-02, -1.103e-01, 4.940e-02, 1.327e-01, 6.795e-02, 2.514e-01, 1.525e-02, 1.133e-01, -7.580e-02)); + r += mul(s3_4, M4(-1.365e-01, -1.377e-02, 2.066e-02, -3.622e-02, 1.422e-01, -1.854e-01, 1.101e-01, 9.160e-02, -2.666e-01, 2.378e-01, -2.834e-01, 2.074e-01, 6.809e-01, -6.729e-02, 1.868e-01, 2.246e-01)); + r += mul(s3_5, M4(7.356e-02, -9.508e-02, -1.172e-04, 5.422e-02, -1.893e-02, 6.854e-02, -1.892e-02, 6.860e-03, -2.202e-02, -9.934e-02, 2.023e-02, 1.135e-01, 8.935e-02, 1.218e-01, -6.803e-02, 5.408e-02)); + r += mul(s3_6, M4(1.426e-01, -9.283e-02, 2.520e-02, -5.103e-02, 1.056e-01, -1.709e-02, 9.450e-02, -2.310e-02, -1.719e-02, 6.322e-02, 2.448e-02, 8.671e-02, 9.691e-02, -1.051e-01, -2.729e-02, 2.363e-02)); + r += mul(s3_7, M4(-9.781e-02, -1.276e-01, -1.571e-01, 1.159e-02, -4.129e-03, -1.075e-01, 1.402e-01, -1.880e-02, 1.100e-01, -4.011e-02, -1.048e-02, 1.545e-01, 3.196e-01, -1.222e-01, 3.091e-02, 5.484e-02)); + r += mul(s3_8, M4(-2.461e-02, -1.011e-01, -2.695e-02, 2.886e-02, 4.451e-02, -5.603e-02, -7.350e-02, 1.154e-02, 6.965e-02, 1.972e-02, -5.793e-03, 5.401e-02, 6.273e-02, -1.393e-01, 6.810e-02, -1.290e-02)); + r += mul(s4_0, M4(-7.404e-02, 5.460e-02, -4.076e-02, -3.550e-02, 6.267e-02, 3.118e-02, 3.598e-02, -1.232e-02, 7.524e-02, -1.605e-02, -8.208e-02, 2.116e-02, 1.133e-01, -4.855e-02, -1.767e-02, 6.122e-03)); + r += mul(s4_1, M4(-2.916e-02, -3.449e-02, -1.089e-02, 8.319e-03, -4.846e-02, -1.997e-01, 2.053e-03, 5.580e-02, -6.975e-02, -8.495e-02, -4.238e-03, 4.718e-02, 3.513e-02, 6.665e-02, 6.092e-02, 5.555e-02)); + r += mul(s4_2, M4(1.128e-01, 4.959e-02, -3.970e-02, 2.896e-03, 1.092e-02, 2.103e-02, -3.434e-03, -3.586e-02, 1.436e-02, 4.328e-02, -4.943e-03, 2.167e-02, -1.454e-02, -1.050e-02, 3.731e-03, -1.429e-02)); + r += mul(s4_3, M4(5.178e-02, 2.050e-02, -1.067e-01, -1.003e-02, 1.600e-01, 1.565e-01, -1.674e-01, 1.675e-02, 1.097e-01, -8.281e-03, -4.795e-02, -6.924e-03, 1.339e-01, -7.568e-02, -8.288e-02, 9.900e-02)); + r += mul(s4_4, M4(-4.674e-02, -2.970e-02, -2.418e-01, -4.915e-04, 3.764e-03, -1.025e-01, -1.236e-01, -2.139e-01, -6.857e-02, 5.994e-03, -1.035e-01, -7.110e-02, -1.443e-01, -6.694e-02, 1.153e-01, -3.853e-02)); + r += mul(s4_5, M4(7.134e-02, 1.370e-02, -2.476e-02, 7.440e-02, 3.270e-02, -2.947e-02, 1.667e-02, 8.067e-03, 2.572e-02, 1.023e-01, -7.215e-02, -3.183e-03, -7.987e-02, -4.945e-02, -1.032e-04, 4.923e-02)); + r += mul(s4_6, M4(2.903e-02, -5.938e-03, -4.288e-02, -2.255e-02, 2.899e-02, 6.334e-03, 2.114e-02, 3.533e-02, 8.110e-03, -9.280e-02, -1.825e-02, -4.875e-02, 2.026e-01, -7.598e-02, -3.330e-03, -6.580e-02)); + r += mul(s4_7, M4(-1.462e-01, 3.489e-02, 3.617e-02, -1.989e-02, 5.885e-02, -2.127e-04, -1.736e-02, 8.010e-03, -7.144e-03, -6.051e-02, -9.249e-02, -8.694e-02, -6.210e-02, -1.074e-01, 2.473e-01, -5.482e-02)); + r += mul(s4_8, M4(1.274e-01, 4.183e-02, 2.901e-02, 3.209e-03, -8.022e-02, 1.969e-02, 2.072e-02, -2.608e-02, 5.421e-02, -1.053e-01, 2.146e-02, -5.179e-02, 7.973e-02, -5.988e-02, 1.210e-01, -4.631e-03)); + r += mul(s5_0, M4(2.636e-02, 8.165e-03, 1.182e-01, -6.995e-02, -6.976e-02, 2.215e-03, -5.314e-02, 8.933e-02, -4.300e-02, 2.515e-02, -8.037e-02, 6.770e-03, -9.013e-02, -1.090e-02, -1.293e-02, 7.325e-02)); + r += mul(s5_1, M4(2.783e-02, 1.057e-01, 1.285e-01, -4.333e-02, -2.084e-02, -1.239e-02, 1.368e-02, 1.511e-02, -1.975e-02, 9.784e-02, 7.017e-02, -2.711e-02, 5.978e-02, -2.261e-02, 2.617e-02, 2.476e-02)); + r += mul(s5_2, M4(5.491e-02, 9.302e-02, -6.994e-02, -3.273e-02, -7.603e-02, 5.919e-02, -2.470e-02, 5.787e-02, -1.126e-01, 1.712e-01, 9.627e-03, -2.791e-02, -6.110e-02, -5.188e-02, 3.332e-03, 6.078e-02)); + r += mul(s5_3, M4(2.370e-01, -4.704e-02, 2.878e-01, 1.572e-02, 8.702e-02, 2.085e-01, -1.493e-01, 4.833e-03, 2.878e-03, 9.338e-02, -9.101e-02, -4.112e-02, 1.460e-01, 3.081e-02, -1.515e-01, 8.386e-02)); + r += mul(s5_4, M4(7.837e-02, 8.659e-03, 1.307e-01, -1.490e-01, -1.352e-01, 1.181e-01, -7.400e-03, 1.975e-02, 1.048e-02, 7.512e-02, -7.127e-02, -3.951e-02, -1.431e-01, -1.643e-01, 1.383e-01, 7.349e-02)); + r += mul(s5_5, M4(-6.518e-02, -7.774e-03, 4.944e-02, -1.617e-02, -6.328e-02, -7.094e-02, 4.030e-02, 6.984e-02, 9.349e-02, -2.611e-02, -4.126e-02, -4.661e-02, -9.324e-02, -5.326e-02, -3.313e-02, 1.342e-01)); + r += mul(s5_6, M4(4.095e-02, 6.703e-02, 1.374e-01, 5.021e-02, -8.304e-02, 7.704e-02, 3.923e-02, 7.668e-02, -1.441e-01, 6.898e-02, 8.456e-04, -3.362e-02, -5.124e-02, -5.141e-02, -1.341e-01, 7.546e-02)); + r += mul(s5_7, M4(2.028e-01, -6.965e-02, 1.672e-01, 8.417e-02, 1.001e-01, -1.704e-02, -3.863e-02, 7.112e-02, -1.513e-02, 2.499e-02, 1.131e-01, -2.397e-02, -1.813e-01, -5.494e-02, -9.805e-04, -9.176e-02)); + r += mul(s5_8, M4(1.635e-01, 6.301e-02, 3.947e-02, -2.926e-02, -1.375e-01, 4.817e-02, -2.079e-02, 4.112e-02, 2.780e-02, 2.360e-03, 7.991e-03, 2.806e-02, -2.174e-02, -1.659e-01, 6.571e-02, 2.288e-02)); + r += mul(s6_0, M4(1.174e-02, 3.992e-02, -2.902e-02, -1.564e-02, -9.947e-03, 1.022e-01, -4.538e-02, 3.136e-02, -3.908e-02, 2.333e-02, -1.226e-02, -1.850e-02, 7.776e-02, 4.887e-02, -3.093e-02, -3.977e-02)); + r += mul(s6_1, M4(-5.709e-02, 2.241e-01, 7.495e-02, -8.553e-02, -1.715e-02, 7.678e-02, -8.276e-02, -1.398e-01, 6.393e-02, 2.037e-02, -3.649e-02, -4.055e-02, 1.133e-01, 1.523e-01, -2.925e-02, -1.990e-02)); + r += mul(s6_2, M4(-4.584e-02, 5.224e-02, -1.234e-01, -6.822e-02, 7.514e-02, -3.682e-02, -1.897e-02, -6.379e-02, 4.519e-02, 2.138e-02, -4.252e-02, 5.279e-02, 1.038e-01, 1.302e-01, -1.700e-02, 1.614e-05)); + r += mul(s6_3, M4(-1.100e-01, 6.973e-02, -5.033e-02, -4.205e-02, 1.030e-01, 9.182e-02, -5.071e-02, -1.013e-01, 9.751e-02, 4.474e-03, 3.944e-02, -2.502e-02, 4.318e-02, 3.176e-02, 7.114e-02, -9.254e-02)); + r += mul(s6_4, M4(-1.743e-02, -1.281e-01, 1.648e-01, -1.096e-01, -1.154e-01, -1.067e-01, -1.176e-01, -2.978e-02, -1.082e-01, -1.007e-01, 1.235e-01, -2.123e-01, -3.999e-02, 8.520e-02, 1.106e-01, -1.162e-01)); + r += mul(s6_5, M4(5.794e-02, -1.919e-01, 1.467e-01, -1.568e-01, -2.875e-02, -9.323e-02, 7.649e-02, -1.092e-01, 6.633e-02, 6.140e-02, 4.574e-02, 4.918e-02, 1.785e-01, 1.223e-01, 4.278e-03, -1.782e-01)); + r += mul(s6_6, M4(-7.013e-02, -4.507e-02, -7.393e-02, 2.513e-03, 1.189e-01, 1.257e-02, -4.197e-02, -3.805e-02, 7.862e-03, 7.478e-02, -1.991e-02, 1.965e-02, 1.314e-01, -1.430e-02, 2.908e-02, -6.047e-02)); + r += mul(s6_7, M4(-3.217e-02, 4.262e-02, -1.983e-01, 4.035e-02, -1.659e-02, -9.437e-02, -4.622e-02, -6.658e-02, -8.081e-02, 3.849e-02, 1.314e-01, -5.261e-02, 8.661e-02, -8.237e-03, 1.585e-01, -1.614e-01)); + r += mul(s6_8, M4(-5.737e-02, -3.302e-03, -6.742e-02, -9.583e-02, -3.381e-02, -2.261e-02, -1.857e-02, 2.350e-03, 1.091e-01, -6.425e-02, 1.871e-02, -6.960e-02, 1.333e-01, -2.407e-02, 2.956e-02, -2.104e-01)); + r += mul(s7_0, M4(-2.732e-02, -6.994e-02, -1.080e-01, 1.307e-02, 5.425e-03, 6.067e-02, 4.972e-03, 6.205e-02, 5.202e-02, 1.135e-02, -5.078e-02, -9.209e-02, -8.480e-02, -5.938e-02, -2.936e-02, 2.958e-02)); + r += mul(s7_1, M4(-9.352e-02, 4.578e-02, -1.038e-01, 4.931e-02, 2.834e-02, 2.557e-02, 1.260e-01, 8.063e-02, -4.916e-02, -2.708e-02, 1.820e-01, -6.008e-02, 5.311e-02, -2.096e-02, -6.459e-02, -2.527e-02)); + r += mul(s7_2, M4(-1.379e-02, -6.491e-02, -3.690e-02, 8.692e-03, 6.566e-02, -2.458e-02, 7.286e-02, 1.636e-03, 3.495e-02, 9.653e-02, 4.719e-02, 4.307e-04, 3.166e-02, -2.120e-02, 1.104e-03, 2.250e-02)); + r += mul(s7_3, M4(-2.417e-02, -3.347e-02, -5.044e-03, -2.641e-03, 7.385e-02, 5.451e-02, -3.506e-02, 3.922e-02, 1.964e-01, 7.353e-02, 5.081e-02, 5.929e-02, -1.945e-01, -9.979e-03, -2.426e-01, 5.309e-02)); + r += mul(s7_4, M4(1.228e-01, 3.044e-02, -4.675e-02, -6.772e-02, -1.994e-01, -7.171e-02, -1.114e-01, 2.572e-01, -2.172e-01, -1.079e-01, 9.681e-03, -6.967e-02, 1.219e-03, -4.686e-03, -7.765e-03, 8.815e-03)); + r += mul(s7_5, M4(-6.989e-02, -1.078e-01, 8.804e-02, -1.109e-01, 1.683e-01, -4.964e-02, -2.924e-02, 1.125e-02, 2.629e-01, 1.073e-01, -5.051e-02, 1.134e-01, 3.944e-02, -2.659e-02, -3.542e-02, 2.898e-02)); + r += mul(s7_6, M4(2.536e-02, -6.420e-02, -4.203e-02, -1.582e-02, 4.380e-02, -3.555e-02, -2.422e-02, -8.902e-03, -1.086e-01, 2.797e-02, -1.048e-01, 1.116e-01, -1.139e-02, 3.176e-02, 2.587e-02, 2.958e-02)); + r += mul(s7_7, M4(5.033e-02, 1.780e-02, -9.527e-02, 3.954e-02, -6.976e-02, -1.139e-02, 4.906e-02, 7.189e-02, -2.352e-02, 5.318e-02, 5.140e-02, 4.704e-02, -4.843e-02, -3.853e-02, -7.482e-02, -8.305e-02)); + r += mul(s7_8, M4(-1.397e-01, 2.179e-02, 2.338e-02, -1.016e-01, 1.103e-01, -6.863e-02, 1.780e-02, 2.561e-02, 1.304e-01, -1.720e-02, 2.107e-02, 4.751e-03, 4.767e-02, -1.159e-01, -1.885e-01, 1.317e-02)); + r += V4(3.299e-02, 3.575e-02, 4.653e-02, -5.926e-02); + return r; +} + +V4 f3(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-5.885e-03, -2.546e-02, 2.558e-02, -2.541e-02, 3.475e-02, 1.645e-01, -4.967e-02, 5.703e-02, -8.175e-03, 1.006e-02, -9.734e-03, 1.796e-02, 1.192e-01, -6.662e-02, 1.989e-02, 6.194e-02)); + r += mul(s0_1, M4(-1.198e-01, 3.162e-02, -3.272e-02, -3.826e-02, -3.700e-01, 1.482e-01, -2.114e-01, -1.351e-01, -8.899e-02, -4.971e-02, 1.209e-01, -8.257e-02, 1.265e-01, -1.939e-02, -6.032e-03, 1.074e-01)); + r += mul(s0_2, M4(1.562e-02, -8.563e-02, -6.263e-03, -9.005e-02, -1.248e-01, 1.228e-01, -6.548e-03, -2.062e-01, 8.436e-02, 6.663e-02, 9.394e-02, -9.600e-02, -6.184e-02, 4.953e-02, -1.026e-01, 3.131e-02)); + r += mul(s0_3, M4(-6.295e-02, -4.597e-02, 8.288e-02, 1.139e-01, -2.021e-01, 6.453e-02, 1.036e-02, -1.155e-01, 2.089e-02, -2.989e-02, -3.874e-02, 1.819e-02, -1.555e-02, -1.129e-01, 9.900e-03, -1.252e-01)); + r += mul(s0_4, M4(9.694e-02, 5.782e-02, 1.188e-02, -9.054e-02, -3.874e-01, 2.309e-01, -1.367e-01, -1.582e-01, -2.347e-01, 6.123e-03, -7.074e-02, -4.260e-02, 8.489e-02, -1.239e-01, 1.993e-02, -3.858e-02)); + r += mul(s0_5, M4(-4.685e-02, -1.415e-01, -1.177e-01, -4.488e-02, 1.536e-01, 2.300e-01, -7.466e-02, 9.373e-02, 1.940e-02, -6.754e-02, 8.615e-03, 4.944e-02, -5.749e-02, 1.053e-01, 3.029e-02, 7.247e-02)); + r += mul(s0_6, M4(-9.967e-02, -5.030e-02, 2.466e-03, 1.887e-02, -5.499e-02, 1.128e-03, -2.234e-03, 6.063e-03, 4.992e-02, -3.842e-02, -6.264e-03, 6.056e-04, -2.896e-02, -1.566e-02, -7.347e-02, -3.167e-02)); + r += mul(s0_7, M4(3.720e-03, -4.195e-02, -2.264e-02, 4.933e-02, 3.558e-02, 3.830e-02, -2.230e-02, 1.220e-02, 5.597e-02, -3.489e-02, -4.640e-02, 3.423e-03, -3.118e-02, -1.338e-02, -1.107e-01, -1.904e-02)); + r += mul(s0_8, M4(8.768e-02, 9.464e-02, -7.227e-02, -4.277e-03, -7.150e-02, 8.855e-02, -1.373e-02, -2.813e-02, 9.033e-03, 1.266e-02, 2.571e-02, 2.239e-02, 7.557e-02, -2.955e-02, 3.206e-02, -3.293e-02)); + r += mul(s1_0, M4(1.093e-01, 2.123e-01, 1.520e-01, -1.096e-02, 1.140e-01, -6.139e-04, 1.689e-01, 7.166e-02, 8.511e-02, -8.368e-02, -5.352e-02, -1.224e-01, 3.872e-01, -1.178e-01, 2.918e-01, 2.200e-01)); + r += mul(s1_1, M4(1.231e-01, 1.746e-01, 4.732e-02, -5.149e-02, 1.214e-01, -1.181e-01, 7.278e-02, 7.755e-02, -5.278e-02, -1.474e-01, 1.502e-02, -3.327e-02, -3.196e-03, 4.036e-01, 7.350e-01, 8.395e-02)); + r += mul(s1_2, M4(2.968e-02, 9.406e-02, -4.022e-02, -1.459e-01, -7.690e-02, -4.029e-03, -5.914e-02, -5.643e-02, -1.059e-01, -8.707e-03, 2.767e-02, -2.201e-01, -5.068e-02, 1.015e-01, 1.402e-01, 6.987e-03)); + r += mul(s1_3, M4(1.979e-02, 2.252e-01, -2.014e-01, -2.294e-01, 1.291e-01, -3.770e-02, 4.641e-02, -7.505e-02, 2.448e-01, -2.456e-01, 6.304e-02, -3.550e-02, 9.021e-02, -7.235e-02, 2.433e-01, -3.196e-02)); + r += mul(s1_4, M4(-1.443e-01, -4.827e-02, 5.127e-02, 1.965e-01, 1.573e-02, -8.680e-02, 9.137e-02, 6.669e-02, 3.524e-01, 3.636e-03, 1.260e-01, 2.576e-01, -1.165e-01, -3.268e-02, 2.371e-01, 1.671e-01)); + r += mul(s1_5, M4(1.851e-01, 3.140e-01, -3.121e-01, 2.096e-01, -1.471e-01, -6.644e-03, -7.641e-02, -4.940e-03, -1.964e-02, 4.312e-02, 1.531e-01, 5.525e-02, -7.958e-02, -4.680e-04, -3.540e-02, -1.654e-01)); + r += mul(s1_6, M4(1.756e-01, 8.053e-02, 8.184e-02, 1.962e-01, 6.900e-02, 2.487e-03, 2.113e-02, -4.635e-02, -1.309e-01, -1.730e-01, -1.307e-01, -1.163e-01, 1.018e-01, 3.996e-02, 9.020e-02, 6.544e-02)); + r += mul(s1_7, M4(-7.530e-02, 2.220e-01, 1.192e-01, -6.576e-02, 3.215e-02, -2.875e-02, 3.263e-02, 8.846e-03, 4.031e-02, -1.396e-01, -1.058e-01, -3.059e-02, -2.242e-01, 1.991e-01, -1.833e-02, -1.613e-02)); + r += mul(s1_8, M4(-2.439e-01, 9.792e-02, 6.240e-02, -9.079e-02, 2.016e-02, -3.977e-02, -5.885e-02, 2.288e-02, 2.199e-01, -9.182e-02, 4.601e-02, -3.255e-02, 1.085e-01, -1.052e-01, 3.403e-02, -8.799e-02)); + r += mul(s2_0, M4(-8.172e-02, -5.813e-02, -1.148e-01, -5.606e-02, 1.254e-01, -1.118e-02, 8.617e-02, 3.101e-02, -6.399e-02, 2.935e-02, -3.022e-02, -9.815e-02, 1.263e-01, 8.716e-02, 1.488e-03, 2.892e-02)); + r += mul(s2_1, M4(-2.403e-01, -6.756e-02, 3.861e-02, -1.272e-01, 1.012e-01, -9.013e-03, -3.556e-02, 4.456e-02, 3.567e-02, 8.643e-02, -6.859e-04, 7.789e-02, -9.175e-02, 8.167e-02, 9.014e-03, -3.291e-03)); + r += mul(s2_2, M4(-2.589e-02, -8.047e-02, 1.765e-02, -5.666e-02, 2.589e-02, -6.236e-02, 5.595e-02, 1.409e-01, -9.791e-02, -3.648e-02, 9.036e-03, -3.095e-02, -7.711e-02, -9.589e-02, 7.740e-02, -3.167e-02)); + r += mul(s2_3, M4(-4.075e-01, -2.607e-01, -1.351e-01, 8.469e-02, -4.617e-02, -6.523e-02, -6.272e-03, 1.454e-01, 7.918e-02, 4.549e-02, -1.289e-01, 4.559e-04, -1.578e-01, -3.195e-02, -1.310e-01, -1.988e-01)); + r += mul(s2_4, M4(-1.001e-01, 1.142e-01, -2.295e-01, -1.917e-01, 2.870e-01, -2.153e-01, 1.699e-01, 8.478e-02, 7.359e-02, -2.038e-01, 1.080e-01, 9.298e-02, 1.395e-03, -6.084e-02, 8.516e-03, 5.921e-02)); + r += mul(s2_5, M4(4.890e-02, -1.980e-01, 5.298e-02, -7.964e-02, -6.946e-02, -2.022e-01, -1.893e-03, -8.310e-02, -5.277e-02, -9.537e-03, 5.377e-02, 6.629e-02, 1.544e-02, 3.057e-03, -7.162e-02, -1.441e-01)); + r += mul(s2_6, M4(7.994e-02, -2.992e-02, -1.136e-01, 2.080e-03, -5.637e-02, 3.382e-02, 8.393e-03, -1.294e-02, 2.123e-02, 6.833e-03, 3.525e-02, 3.002e-02, 7.027e-02, 7.827e-02, 1.082e-01, 1.245e-02)); + r += mul(s2_7, M4(-2.703e-01, -1.811e-01, 1.082e-01, -1.525e-02, 1.525e-01, 9.581e-02, -4.152e-02, -1.611e-02, -1.248e-01, -1.078e-02, 1.731e-02, -4.998e-02, -1.774e-01, 5.634e-02, -1.451e-01, 6.042e-02)); + r += mul(s2_8, M4(7.234e-02, -7.818e-02, 4.948e-04, 4.252e-02, 1.517e-01, -6.549e-02, -9.122e-02, -1.192e-02, 4.772e-02, 4.773e-02, -2.814e-02, -4.270e-02, 2.777e-02, 7.317e-02, -1.038e-01, 2.099e-03)); + r += mul(s3_0, M4(-1.160e-03, -4.776e-02, 1.320e-01, -5.099e-02, -7.016e-02, -3.634e-02, 5.819e-03, -3.680e-02, 2.560e-02, 9.705e-03, -1.349e-01, 4.162e-02, 2.998e-01, 6.999e-02, -9.148e-02, 1.306e-01)); + r += mul(s3_1, M4(8.671e-02, -2.513e-04, 2.481e-01, -3.360e-02, 1.810e-02, 1.426e-02, -1.753e-01, -7.422e-02, -4.182e-04, 2.963e-02, -4.225e-02, 7.439e-02, -5.775e-02, 1.039e-01, -8.999e-02, 1.931e-01)); + r += mul(s3_2, M4(1.279e-01, 4.706e-02, 1.274e-01, 5.953e-02, -4.903e-02, -4.301e-02, -6.777e-02, 1.582e-02, -3.740e-02, -1.648e-03, -9.810e-05, 1.001e-01, 1.818e-01, -9.297e-02, 3.020e-04, -5.370e-02)); + r += mul(s3_3, M4(-9.060e-02, 1.185e-02, -1.783e-01, -4.235e-02, -1.380e-01, -2.946e-03, 1.148e-01, 1.939e-02, 1.450e-01, 2.229e-02, -2.045e-01, 3.980e-02, 2.243e-01, -7.762e-02, -9.742e-04, -8.569e-02)); + r += mul(s3_4, M4(-2.442e-02, 2.062e-01, -1.265e-01, 4.012e-02, 2.739e-01, 4.146e-03, 1.713e-01, 3.659e-02, 1.138e-01, -1.864e-01, -4.026e-02, 1.728e-01, -7.976e-02, 6.411e-02, 2.068e-02, 2.147e-01)); + r += mul(s3_5, M4(-1.294e-01, 2.487e-02, 1.467e-01, 8.779e-02, -1.647e-01, 4.106e-02, 3.740e-02, 1.564e-02, -1.010e-03, 2.372e-02, 3.233e-02, 1.864e-01, -1.230e-01, -7.062e-02, 4.219e-02, -1.362e-01)); + r += mul(s3_6, M4(1.222e-01, -5.516e-02, -8.402e-02, 1.478e-02, -4.594e-02, 2.981e-02, -3.904e-02, -8.650e-02, -1.487e-03, 1.269e-03, 4.843e-02, 2.894e-02, 5.032e-02, 6.047e-02, -1.473e-03, 3.292e-02)); + r += mul(s3_7, M4(9.554e-02, 2.187e-02, -1.455e-01, -8.992e-02, 1.309e-03, -3.460e-02, 1.417e-01, -3.960e-02, -1.057e-01, -3.014e-02, 1.360e-01, -6.093e-02, 2.066e-01, 2.765e-01, -1.451e-02, 2.153e-01)); + r += mul(s3_8, M4(6.974e-02, -8.067e-03, -1.227e-02, 2.595e-02, -8.348e-03, -6.840e-02, -1.754e-02, 3.177e-02, -3.672e-02, -3.918e-03, 9.301e-04, 6.000e-02, 4.009e-02, 1.286e-01, 1.005e-01, 4.752e-02)); + r += mul(s4_0, M4(-6.639e-03, 1.205e-02, -9.161e-02, 6.168e-02, 1.450e-01, -8.361e-02, 2.304e-01, 8.059e-02, -3.226e-03, -8.089e-02, 1.486e-01, 3.589e-02, 1.554e-04, -2.149e-02, -1.098e-01, 6.157e-03)); + r += mul(s4_1, M4(-7.550e-02, 2.784e-02, -1.346e-01, 3.855e-02, 1.488e-01, -8.323e-02, 1.272e-03, -1.955e-02, 7.526e-02, -4.654e-02, 1.138e-01, -2.886e-02, 1.533e-01, -5.429e-02, 1.491e-01, 1.911e-02)); + r += mul(s4_2, M4(2.749e-02, 2.167e-03, -2.995e-02, 1.297e-01, -3.067e-02, -1.002e-01, -1.171e-01, 5.089e-02, 7.106e-02, 2.617e-02, 7.060e-02, -1.464e-02, 1.128e-01, 1.469e-01, 1.755e-01, -1.565e-02)); + r += mul(s4_3, M4(-3.147e-02, -2.933e-02, 1.108e-01, -5.021e-03, 5.973e-02, -1.508e-01, 1.813e-01, 9.161e-02, -5.187e-02, 8.315e-02, -6.392e-02, 8.132e-02, -1.111e-01, 4.777e-02, 8.955e-02, -9.181e-02)); + r += mul(s4_4, M4(7.240e-02, 5.859e-02, -9.687e-03, 9.683e-02, -2.997e-01, 5.311e-02, -7.869e-02, 1.245e-01, 4.405e-01, 2.145e-04, 1.532e-02, -1.421e-01, 1.712e-02, -3.623e-02, 2.816e-01, -9.044e-02)); + r += mul(s4_5, M4(-1.773e-01, 8.718e-02, 1.580e-01, -6.844e-02, 1.122e-01, -3.360e-04, -5.619e-02, -8.491e-02, -1.605e-01, 1.087e-01, -6.330e-03, -5.711e-02, -1.025e-01, -2.467e-03, 6.342e-02, -3.439e-02)); + r += mul(s4_6, M4(2.071e-02, -5.719e-02, 4.813e-03, 4.429e-02, 9.461e-02, -2.034e-02, 1.234e-01, 1.544e-02, -4.892e-02, 2.310e-02, 6.791e-02, 4.307e-02, -2.855e-02, -4.628e-04, 1.339e-02, -5.448e-02)); + r += mul(s4_7, M4(3.531e-02, 7.981e-02, -2.148e-01, 2.049e-02, -1.053e-02, -3.160e-02, 1.023e-01, 2.071e-02, -8.098e-02, 9.493e-02, -5.892e-02, -1.295e-02, 1.871e-01, -4.189e-02, 9.112e-02, 8.300e-02)); + r += mul(s4_8, M4(-1.699e-02, -3.385e-02, -3.076e-02, -2.967e-02, 1.298e-02, -1.494e-02, 7.397e-03, 4.782e-02, 1.178e-01, 5.643e-02, 2.861e-02, -9.439e-03, -8.228e-02, 1.107e-01, -4.137e-03, -3.320e-02)); + r += mul(s5_0, M4(1.071e-01, 8.736e-02, -5.126e-02, -3.961e-02, 1.843e-01, -2.182e-01, 1.343e-01, 1.082e-01, -6.434e-02, -9.993e-02, -4.548e-02, -3.949e-02, 3.089e-02, -4.468e-02, -5.958e-03, -1.703e-02)); + r += mul(s5_1, M4(5.276e-02, 2.210e-01, -1.552e-01, 1.921e-01, 2.015e-01, -9.600e-02, 4.278e-02, -1.323e-01, -6.578e-03, -1.043e-01, 5.091e-02, 4.558e-02, 4.814e-02, -2.042e-01, 1.910e-01, 3.570e-02)); + r += mul(s5_2, M4(-7.656e-02, 1.000e-01, 6.224e-02, -2.822e-02, -6.178e-02, -1.274e-01, -8.665e-02, -3.369e-02, -7.111e-02, 3.011e-02, 3.098e-02, 1.618e-02, 7.771e-02, -2.006e-03, 1.463e-01, -4.340e-02)); + r += mul(s5_3, M4(1.671e-02, -2.406e-02, 3.675e-02, -6.527e-02, 1.862e-02, -2.094e-01, 1.246e-01, -3.006e-02, -2.290e-02, 2.513e-02, -5.528e-02, -3.249e-02, 1.135e-01, -1.494e-01, -7.521e-02, -3.806e-02)); + r += mul(s5_4, M4(2.826e-01, 1.471e-01, 2.434e-01, 6.211e-01, -1.110e-01, 5.876e-02, 2.357e-02, 1.291e-01, 1.158e-01, -6.958e-02, -4.165e-02, -1.199e-02, -1.858e-01, -2.900e-01, 2.511e-03, 2.313e-02)); + r += mul(s5_5, M4(2.556e-02, 3.107e-01, 6.381e-02, 1.181e-01, 1.081e-01, -1.219e-02, -2.541e-02, -7.888e-02, -1.273e-01, -9.006e-02, -1.173e-02, -1.212e-02, -8.626e-03, 1.553e-02, 4.044e-02, -5.263e-02)); + r += mul(s5_6, M4(7.118e-02, 1.130e-01, 9.119e-02, 8.911e-03, 1.276e-01, -6.608e-02, 5.927e-02, -4.754e-02, -1.168e-01, -1.445e-03, -4.022e-02, -3.406e-02, -3.202e-02, -1.565e-01, -1.082e-01, -6.669e-02)); + r += mul(s5_7, M4(-1.636e-01, -4.448e-02, 2.813e-02, 1.441e-01, -1.376e-02, 2.730e-02, 8.901e-04, -2.648e-02, -1.212e-01, 8.716e-02, 3.431e-02, -7.011e-02, 6.266e-02, -6.659e-03, -5.885e-02, 1.105e-02)); + r += mul(s5_8, M4(-1.766e-02, 1.021e-02, 3.733e-02, 7.508e-02, 2.418e-02, 2.041e-02, -1.344e-02, -1.642e-02, 6.738e-02, 1.122e-02, 4.157e-02, -2.922e-02, -1.743e-02, 9.020e-02, 1.103e-01, -7.592e-02)); + r += mul(s6_0, M4(1.134e-01, -3.963e-02, 1.128e-01, 3.215e-02, 3.800e-02, 3.478e-02, -9.269e-02, 8.044e-02, -2.934e-01, 1.042e-02, -1.862e-01, -9.349e-02, 7.495e-02, 6.232e-02, 1.725e-01, 1.731e-02)); + r += mul(s6_1, M4(1.909e-02, 4.707e-02, -1.050e-01, 2.469e-02, -3.667e-02, 1.034e-01, -5.543e-02, -5.119e-02, -2.366e-01, -1.433e-01, -1.732e-01, -2.134e-01, 5.333e-02, -6.928e-02, 7.900e-02, 8.672e-02)); + r += mul(s6_2, M4(-7.238e-02, 1.367e-02, -1.049e-01, 1.265e-01, -3.939e-03, 2.224e-02, -8.017e-04, -2.103e-02, -1.096e-01, -1.776e-03, 1.391e-01, 1.414e-01, 1.216e-01, 9.376e-02, 5.524e-02, 6.758e-02)); + r += mul(s6_3, M4(-1.067e-01, 1.998e-02, -2.571e-02, -5.100e-03, -1.376e-01, -5.383e-02, -1.193e-01, -7.877e-02, -2.767e-04, 2.886e-02, 2.653e-02, 1.714e-01, -1.229e-02, -7.802e-02, 3.130e-02, -2.958e-02)); + r += mul(s6_4, M4(-7.202e-02, -6.781e-02, 7.058e-02, 1.504e-02, 1.208e-01, 9.888e-02, -4.686e-03, -1.753e-02, 1.937e-01, 7.496e-02, -1.258e-01, 1.294e-01, -1.517e-02, -1.711e-03, 2.826e-01, 2.925e-01)); + r += mul(s6_5, M4(7.727e-02, -1.526e-01, 2.852e-01, 2.777e-01, -8.854e-02, 6.094e-02, -5.698e-03, -1.644e-01, -7.879e-02, 1.572e-02, 3.822e-02, 9.991e-02, -1.252e-01, 1.024e-01, 2.398e-01, 2.683e-01)); + r += mul(s6_6, M4(-2.504e-03, -7.172e-02, -1.091e-01, 1.194e-02, 7.060e-02, -4.136e-03, 2.395e-03, 5.092e-02, -2.992e-02, -2.311e-03, -4.920e-02, -1.680e-01, 4.731e-02, 3.985e-02, 1.189e-01, 8.127e-02)); + r += mul(s6_7, M4(7.482e-02, -5.409e-02, -7.627e-02, -3.000e-02, 4.041e-02, 9.987e-02, -1.435e-02, 1.451e-01, -2.708e-02, -7.973e-02, 1.030e-01, 8.814e-02, 3.109e-03, -7.251e-02, 1.606e-01, 3.079e-02)); + r += mul(s6_8, M4(-7.090e-02, -1.135e-01, 8.462e-02, -6.155e-02, -3.090e-02, 5.601e-02, 3.941e-02, 4.744e-03, 2.282e-02, 4.505e-02, 1.192e-02, 6.843e-02, 1.088e-01, -1.489e-01, 1.263e-01, 5.793e-02)); + r += mul(s7_0, M4(2.178e-02, 1.912e-02, 4.309e-02, 1.703e-02, 3.737e-02, -7.983e-03, 2.782e-02, 1.850e-02, 1.452e-01, -1.497e-01, 4.961e-02, 5.188e-02, 1.984e-02, -2.894e-02, 1.030e-01, -3.062e-04)); + r += mul(s7_1, M4(-2.136e-01, -4.810e-02, -9.977e-02, 1.103e-01, -3.734e-02, -1.038e-01, -3.264e-02, 1.932e-02, 3.639e-01, -6.706e-02, 4.201e-01, 1.576e-02, -4.993e-02, -1.537e-02, -5.964e-02, 4.097e-02)); + r += mul(s7_2, M4(2.272e-02, -2.516e-02, -1.510e-02, 5.791e-02, -7.611e-02, -2.916e-02, 1.016e-01, 1.075e-01, 1.209e-02, 7.300e-02, 6.268e-02, 9.154e-02, 8.169e-02, -7.432e-02, -2.736e-02, -2.039e-03)); + r += mul(s7_3, M4(-5.458e-02, -3.447e-02, -3.795e-03, -5.079e-02, -6.263e-02, -1.703e-01, 2.396e-02, -2.922e-02, 2.510e-01, 2.071e-02, -6.895e-02, 8.368e-02, -1.364e-01, 4.028e-02, -7.619e-02, -6.385e-02)); + r += mul(s7_4, M4(-1.184e-01, -7.357e-02, 2.109e-01, 9.892e-02, 1.238e-01, 3.710e-03, -6.457e-02, -9.826e-02, -3.336e-01, 2.071e-02, -2.630e-02, -4.478e-02, 6.411e-02, 4.174e-03, 9.080e-02, 4.497e-02)); + r += mul(s7_5, M4(1.538e-01, 7.003e-02, 6.026e-02, 3.331e-02, -1.284e-01, -8.834e-02, 1.376e-01, 8.211e-02, -1.947e-01, -1.464e-01, 3.603e-02, -8.266e-02, -1.739e-02, -6.261e-02, -1.003e-01, 4.533e-02)); + r += mul(s7_6, M4(-1.178e-01, -5.722e-02, 2.677e-02, -4.211e-03, -1.071e-01, -8.749e-02, 1.005e-01, 7.650e-02, -1.112e-01, 6.735e-02, -8.316e-02, -9.940e-02, 1.052e-01, -9.073e-02, -3.761e-02, 4.248e-02)); + r += mul(s7_7, M4(5.572e-02, -3.820e-02, -1.385e-01, 3.057e-02, 5.144e-02, -1.668e-02, 1.240e-01, 1.815e-01, -5.345e-02, 1.495e-01, -8.913e-02, 9.643e-02, -2.567e-03, -6.845e-02, 1.134e-01, 8.737e-02)); + r += mul(s7_8, M4(-8.663e-04, -8.466e-04, 6.296e-02, 7.255e-02, 9.676e-02, -7.858e-02, 1.671e-01, 8.251e-02, 2.800e-01, 1.228e-01, -1.019e-01, -5.512e-02, -4.996e-02, 5.146e-02, -9.201e-02, -2.324e-02)); + r += V4(1.173e-02, 1.947e-02, 2.270e-02, 7.192e-02); + return r; +} + +void Pass6(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = Rmp8x8(tid.x) + blockStart; + uint2 size = GetInputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = (gxy + 0.5) * pt; + + V4 s0_0 = l0(-1.0, -1.0); + V4 s0_1 = l0(0.0, -1.0); + V4 s0_2 = l0(1.0, -1.0); + V4 s0_3 = l0(-1.0, 0.0); + V4 s0_4 = l0(0.0, 0.0); + V4 s0_5 = l0(1.0, 0.0); + V4 s0_6 = l0(-1.0, 1.0); + V4 s0_7 = l0(0.0, 1.0); + V4 s0_8 = l0(1.0, 1.0); + V4 s1_0 = -max(-s0_0, 0.0); + V4 s1_1 = -max(-s0_1, 0.0); + V4 s1_2 = -max(-s0_2, 0.0); + V4 s1_3 = -max(-s0_3, 0.0); + V4 s1_4 = -max(-s0_4, 0.0); + V4 s1_5 = -max(-s0_5, 0.0); + V4 s1_6 = -max(-s0_6, 0.0); + V4 s1_7 = -max(-s0_7, 0.0); + V4 s1_8 = -max(-s0_8, 0.0); + s0_0 = max(s0_0, 0.0); + s0_1 = max(s0_1, 0.0); + s0_2 = max(s0_2, 0.0); + s0_3 = max(s0_3, 0.0); + s0_4 = max(s0_4, 0.0); + s0_5 = max(s0_5, 0.0); + s0_6 = max(s0_6, 0.0); + s0_7 = max(s0_7, 0.0); + s0_8 = max(s0_8, 0.0); + + V4 s2_0 = l1(-1.0, -1.0); + V4 s2_1 = l1(0.0, -1.0); + V4 s2_2 = l1(1.0, -1.0); + V4 s2_3 = l1(-1.0, 0.0); + V4 s2_4 = l1(0.0, 0.0); + V4 s2_5 = l1(1.0, 0.0); + V4 s2_6 = l1(-1.0, 1.0); + V4 s2_7 = l1(0.0, 1.0); + V4 s2_8 = l1(1.0, 1.0); + V4 s3_0 = -max(-s2_0, 0.0); + V4 s3_1 = -max(-s2_1, 0.0); + V4 s3_2 = -max(-s2_2, 0.0); + V4 s3_3 = -max(-s2_3, 0.0); + V4 s3_4 = -max(-s2_4, 0.0); + V4 s3_5 = -max(-s2_5, 0.0); + V4 s3_6 = -max(-s2_6, 0.0); + V4 s3_7 = -max(-s2_7, 0.0); + V4 s3_8 = -max(-s2_8, 0.0); + s2_0 = max(s2_0, 0.0); + s2_1 = max(s2_1, 0.0); + s2_2 = max(s2_2, 0.0); + s2_3 = max(s2_3, 0.0); + s2_4 = max(s2_4, 0.0); + s2_5 = max(s2_5, 0.0); + s2_6 = max(s2_6, 0.0); + s2_7 = max(s2_7, 0.0); + s2_8 = max(s2_8, 0.0); + + V4 s4_0 = l2(-1.0, -1.0); + V4 s4_1 = l2(0.0, -1.0); + V4 s4_2 = l2(1.0, -1.0); + V4 s4_3 = l2(-1.0, 0.0); + V4 s4_4 = l2(0.0, 0.0); + V4 s4_5 = l2(1.0, 0.0); + V4 s4_6 = l2(-1.0, 1.0); + V4 s4_7 = l2(0.0, 1.0); + V4 s4_8 = l2(1.0, 1.0); + V4 s5_0 = -max(-s4_0, 0.0); + V4 s5_1 = -max(-s4_1, 0.0); + V4 s5_2 = -max(-s4_2, 0.0); + V4 s5_3 = -max(-s4_3, 0.0); + V4 s5_4 = -max(-s4_4, 0.0); + V4 s5_5 = -max(-s4_5, 0.0); + V4 s5_6 = -max(-s4_6, 0.0); + V4 s5_7 = -max(-s4_7, 0.0); + V4 s5_8 = -max(-s4_8, 0.0); + s4_0 = max(s4_0, 0.0); + s4_1 = max(s4_1, 0.0); + s4_2 = max(s4_2, 0.0); + s4_3 = max(s4_3, 0.0); + s4_4 = max(s4_4, 0.0); + s4_5 = max(s4_5, 0.0); + s4_6 = max(s4_6, 0.0); + s4_7 = max(s4_7, 0.0); + s4_8 = max(s4_8, 0.0); + + V4 s6_0 = l3(-1.0, -1.0); + V4 s6_1 = l3(0.0, -1.0); + V4 s6_2 = l3(1.0, -1.0); + V4 s6_3 = l3(-1.0, 0.0); + V4 s6_4 = l3(0.0, 0.0); + V4 s6_5 = l3(1.0, 0.0); + V4 s6_6 = l3(-1.0, 1.0); + V4 s6_7 = l3(0.0, 1.0); + V4 s6_8 = l3(1.0, 1.0); + V4 s7_0 = -max(-s6_0, 0.0); + V4 s7_1 = -max(-s6_1, 0.0); + V4 s7_2 = -max(-s6_2, 0.0); + V4 s7_3 = -max(-s6_3, 0.0); + V4 s7_4 = -max(-s6_4, 0.0); + V4 s7_5 = -max(-s6_5, 0.0); + V4 s7_6 = -max(-s6_6, 0.0); + V4 s7_7 = -max(-s6_7, 0.0); + V4 s7_8 = -max(-s6_8, 0.0); + s6_0 = max(s6_0, 0.0); + s6_1 = max(s6_1, 0.0); + s6_2 = max(s6_2, 0.0); + s6_3 = max(s6_3, 0.0); + s6_4 = max(s6_4, 0.0); + s6_5 = max(s6_5, 0.0); + s6_6 = max(s6_6, 0.0); + s6_7 = max(s6_7, 0.0); + s6_8 = max(s6_8, 0.0); + + t4[gxy] = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t5[gxy] = f1(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t6[gxy] = f2(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t7[gxy] = f3(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); +} + +//!PASS 7 +//!DESC conv6 +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 +//!IN t4, t5, t6, t7 +//!OUT t0, t1, t2, t3 + +#define l0(x, y) V4(O(t4, float2(x, y))) +#define l1(x, y) V4(O(t5, float2(x, y))) +#define l2(x, y) V4(O(t6, float2(x, y))) +#define l3(x, y) V4(O(t7, float2(x, y))) + +V4 f0(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-4.959e-02, 2.300e-02, 6.317e-03, 1.703e-02, -2.688e-03, 1.642e-02, -2.200e-02, -2.420e-02, 2.363e-02, -1.022e-01, 6.023e-02, -2.609e-02, 9.291e-02, -1.160e-01, 2.052e-02, 2.354e-01)); + r += mul(s0_1, M4(-1.879e-02, -1.916e-02, -8.637e-03, 4.526e-02, 6.088e-02, -2.138e-03, -4.232e-02, -4.008e-02, -4.421e-02, 2.282e-01, 3.115e-02, -1.581e-02, -6.951e-03, -2.424e-02, 1.346e-01, -3.285e-02)); + r += mul(s0_2, M4(-4.787e-02, -1.360e-01, 5.257e-02, -4.066e-02, 2.153e-02, 2.471e-02, 3.004e-02, -7.448e-02, -1.941e-02, 1.677e-01, -1.904e-01, -2.967e-02, -7.226e-03, 8.123e-03, 1.559e-01, -1.188e-02)); + r += mul(s0_3, M4(-3.923e-02, -4.992e-02, 6.446e-02, 7.936e-02, -3.738e-02, -1.250e-02, 5.185e-02, 2.579e-02, 5.660e-02, -1.233e-01, 5.719e-02, 1.460e-02, 2.067e-01, -4.069e-02, 3.571e-02, 1.317e-01)); + r += mul(s0_4, M4(2.346e-02, -2.846e-01, -2.588e-02, 5.688e-02, -5.397e-03, -1.564e-02, -6.028e-02, 7.542e-02, -1.610e-01, 6.204e-02, 5.513e-02, 1.456e-02, -2.901e-01, 9.572e-02, 2.208e-02, -1.044e-01)); + r += mul(s0_5, M4(-9.583e-02, -2.630e-02, 4.636e-02, -1.747e-02, 5.710e-02, -3.728e-02, -9.599e-02, 2.775e-02, 9.363e-02, -1.286e-02, -6.437e-02, 8.923e-03, 5.191e-02, 2.725e-02, 5.111e-02, 5.944e-02)); + r += mul(s0_6, M4(3.916e-02, 1.242e-04, -2.263e-02, 1.843e-02, -2.212e-02, 1.383e-02, 4.635e-02, -8.325e-03, 8.122e-02, -1.123e-01, 1.783e-02, -7.211e-03, 5.749e-03, -1.679e-03, -5.085e-02, 6.039e-03)); + r += mul(s0_7, M4(-4.237e-02, 2.693e-02, 7.501e-03, -5.510e-02, 1.524e-02, -4.218e-02, -1.076e-02, -3.760e-02, 1.048e-01, -5.222e-02, 1.925e-02, -1.094e-02, 7.092e-03, -3.861e-02, 5.624e-02, 1.161e-02)); + r += mul(s0_8, M4(4.406e-03, 6.380e-02, 1.261e-02, -2.852e-02, 1.263e-02, -1.119e-02, -5.527e-02, -2.118e-02, 1.659e-02, 1.159e-01, -5.585e-02, -2.343e-02, 1.292e-02, -4.138e-02, 1.541e-02, 6.174e-02)); + r += mul(s1_0, M4(-1.596e-02, 1.235e-01, -1.475e-02, -1.215e-01, 4.439e-02, 2.252e-02, -1.036e-04, 2.227e-01, 2.471e-02, 1.859e-02, -1.305e-02, 2.673e-02, 1.234e-02, -7.778e-02, -6.012e-02, -3.814e-02)); + r += mul(s1_1, M4(-1.121e-01, 1.950e-01, 1.715e-01, 1.439e-02, 6.037e-02, -3.254e-01, -7.611e-02, -1.765e-01, 3.997e-02, 6.524e-02, 9.926e-02, 4.034e-02, -3.307e-02, -8.003e-02, -1.239e-02, 2.386e-02)); + r += mul(s1_2, M4(-6.216e-02, 1.513e-01, 1.518e-02, 1.468e-02, -5.238e-02, -1.184e-02, 9.673e-02, 8.954e-02, -3.878e-02, -3.462e-02, 1.696e-03, 4.314e-02, 3.306e-02, -2.129e-02, 3.722e-02, 9.545e-03)); + r += mul(s1_3, M4(-4.358e-02, 1.169e-01, -6.705e-02, 7.877e-02, 6.420e-02, 1.647e-02, -1.408e-01, -1.886e-02, -1.090e-02, -7.420e-02, 1.611e-02, -2.608e-02, 1.181e-02, 1.139e-02, -3.279e-02, -1.538e-01)); + r += mul(s1_4, M4(-7.269e-02, -9.624e-02, 2.104e-01, -3.678e-02, -8.138e-02, -7.530e-02, 1.403e-01, 1.101e-01, -2.562e-01, 1.725e-01, -2.215e-01, -1.774e-02, -9.527e-02, 2.512e-02, -1.014e-01, -6.340e-02)); + r += mul(s1_5, M4(9.204e-02, 1.466e-01, -8.662e-03, -7.309e-02, 1.940e-01, 1.822e-03, -1.982e-01, -4.872e-02, -9.534e-02, -3.194e-03, -2.147e-01, -5.603e-02, 4.305e-02, 4.031e-02, -1.879e-01, 1.564e-02)); + r += mul(s1_6, M4(-4.283e-02, 4.618e-02, -8.197e-02, -6.512e-02, -7.169e-02, -6.047e-02, 2.293e-02, 3.459e-02, -5.382e-02, -5.021e-02, 7.904e-02, -3.021e-02, 2.588e-03, -6.667e-02, 5.148e-02, 5.692e-02)); + r += mul(s1_7, M4(-8.603e-02, 1.255e-01, 2.339e-01, -3.309e-02, -5.634e-02, -1.763e-01, 9.410e-02, 1.203e-01, -3.287e-02, -4.261e-02, 1.248e-01, 7.539e-02, -5.734e-03, -3.458e-02, 8.259e-02, 8.584e-04)); + r += mul(s1_8, M4(9.075e-02, -4.847e-02, -4.681e-02, 1.470e-01, -1.874e-02, -1.161e-01, -1.934e-01, 3.652e-02, 4.413e-02, 4.896e-02, -1.374e-01, -6.084e-02, 8.472e-02, 6.868e-03, -5.092e-02, 2.943e-02)); + r += mul(s2_0, M4(-7.578e-02, 3.864e-02, 3.828e-02, 1.041e-01, -2.067e-02, -1.882e-02, 2.747e-03, 1.201e-02, 1.090e-02, 7.076e-04, 4.765e-03, -3.586e-02, 5.400e-02, -2.777e-02, 1.078e-02, 1.827e-02)); + r += mul(s2_1, M4(5.610e-02, -6.995e-03, 4.990e-03, 9.165e-02, -1.922e-02, 7.537e-02, 1.615e-02, -1.001e-01, -3.874e-02, -6.028e-03, 1.239e-01, 4.476e-02, -5.677e-02, 2.028e-01, 8.904e-02, -6.016e-02)); + r += mul(s2_2, M4(-3.735e-02, -1.418e-01, -7.564e-02, -2.437e-02, -1.181e-02, -3.410e-02, 7.301e-02, 8.895e-03, -3.613e-02, -3.974e-02, -3.959e-02, 1.515e-02, -1.539e-03, -2.772e-03, -3.304e-02, -3.478e-02)); + r += mul(s2_3, M4(-1.914e-02, -9.525e-02, 8.687e-02, 2.162e-02, -3.970e-02, -4.097e-02, -2.761e-02, -8.150e-02, 1.069e-02, 1.161e-02, 4.322e-02, 3.107e-02, -6.213e-02, 5.408e-04, -2.306e-03, -2.409e-02)); + r += mul(s2_4, M4(1.511e-01, 1.203e-01, -2.227e-01, -9.491e-02, -1.130e-01, 1.699e-01, -5.111e-02, 8.725e-02, 5.434e-02, -1.741e-01, 1.328e-02, 1.151e-01, 2.696e-02, 1.803e-01, 2.174e-02, 1.227e-01)); + r += mul(s2_5, M4(-1.622e-02, 2.244e-01, 2.659e-02, -2.045e-02, -5.316e-02, 2.989e-02, -3.311e-02, -1.226e-01, -3.029e-03, 6.464e-03, -1.315e-02, 2.236e-02, -6.947e-02, -5.856e-02, -7.343e-02, -1.114e-02)); + r += mul(s2_6, M4(-4.299e-02, 4.939e-03, 1.489e-01, 2.805e-02, 3.084e-02, 1.229e-02, -3.138e-02, 2.415e-02, 2.300e-02, -5.926e-02, 3.672e-02, -9.303e-02, -2.705e-02, -7.170e-02, 8.702e-02, 5.325e-02)); + r += mul(s2_7, M4(-1.679e-02, -1.060e-01, -6.970e-02, 6.048e-02, -1.964e-02, 2.604e-02, 1.357e-01, 2.298e-02, -1.148e-01, 5.353e-02, -8.100e-02, 2.667e-02, 1.939e-02, -3.578e-02, -1.812e-02, 3.766e-02)); + r += mul(s2_8, M4(-3.038e-04, -5.991e-03, -3.775e-02, -3.493e-02, 2.390e-02, -7.596e-02, 2.851e-02, 6.164e-02, 1.460e-02, -1.681e-03, 4.620e-02, -1.403e-02, 2.086e-02, 2.709e-02, -1.620e-02, 3.560e-02)); + r += mul(s3_0, M4(1.141e-04, 2.863e-02, 7.410e-02, 6.073e-02, -1.141e-01, 6.118e-02, -3.687e-03, 6.243e-02, -4.684e-03, 8.379e-02, 2.439e-02, -9.396e-02, 4.764e-04, -1.569e-02, 8.856e-02, 7.804e-03)); + r += mul(s3_1, M4(-2.494e-02, -2.837e-01, 5.573e-02, 1.198e-02, -4.818e-02, 2.223e-02, -9.465e-02, 5.685e-02, -2.476e-02, 2.298e-01, -5.739e-02, 1.791e-01, -4.102e-02, 9.728e-02, -5.806e-02, -3.767e-02)); + r += mul(s3_2, M4(9.027e-02, 2.405e-03, 1.261e-01, -1.430e-02, 6.552e-03, -5.556e-02, 1.538e-02, 1.255e-02, -5.140e-02, 1.569e-01, -1.936e-01, 1.306e-02, 4.347e-02, -1.850e-02, -1.557e-03, -1.791e-02)); + r += mul(s3_3, M4(9.246e-02, -1.177e-01, -7.298e-02, -1.532e-02, -1.054e-01, -5.527e-02, 5.620e-03, -8.630e-02, -1.256e-01, -7.708e-02, 6.246e-02, 2.278e-02, -1.151e-01, -2.338e-02, 4.332e-02, 4.785e-02)); + r += mul(s3_4, M4(5.673e-02, 6.712e-02, -1.401e-02, -1.203e-03, 3.747e-02, 4.443e-03, -4.435e-02, 5.732e-02, -1.563e-03, -7.244e-03, -1.148e-01, -1.453e-01, 1.674e-01, -9.521e-02, -3.138e-02, 1.018e-01)); + r += mul(s3_5, M4(-5.533e-02, 1.502e-01, 1.289e-01, -4.958e-02, -6.971e-02, -1.172e-01, 1.874e-01, 6.877e-03, 1.016e-02, 1.560e-01, -1.155e-01, 6.263e-03, -1.972e-02, 5.096e-03, 1.872e-01, -1.115e-01)); + r += mul(s3_6, M4(-2.659e-02, -4.438e-02, 3.411e-02, -4.316e-02, 2.489e-02, -5.362e-02, 6.324e-03, 2.250e-02, 6.458e-02, -1.310e-01, 1.392e-01, 5.710e-02, -2.336e-02, 3.723e-02, 2.933e-02, -9.192e-03)); + r += mul(s3_7, M4(-3.195e-02, 1.089e-02, 3.270e-02, 7.136e-02, 6.604e-03, -6.304e-02, 4.783e-02, 5.569e-02, -9.362e-02, -4.429e-02, -6.615e-02, 8.673e-02, 1.845e-01, -7.756e-03, -1.776e-01, -1.473e-02)); + r += mul(s3_8, M4(-1.581e-02, -5.631e-02, 1.651e-02, 3.415e-02, -7.547e-02, 5.109e-02, 2.791e-02, 8.264e-03, -2.090e-02, -1.188e-01, 5.602e-02, 8.052e-02, -2.345e-02, 6.393e-02, -1.052e-02, 5.089e-02)); + r += mul(s4_0, M4(2.126e-02, 6.163e-02, 5.698e-02, -4.189e-02, -1.033e-02, -8.728e-02, -5.533e-02, -3.495e-03, 9.104e-02, -4.146e-02, -3.394e-02, -3.003e-02, 9.144e-02, -2.309e-01, 1.130e-01, -1.458e-02)); + r += mul(s4_1, M4(1.959e-02, 1.240e-01, -2.060e-01, -8.081e-02, 7.705e-03, -2.860e-02, 6.000e-02, -5.123e-02, -3.581e-02, 1.002e-01, 8.903e-02, -5.170e-02, -2.747e-02, 9.524e-03, -5.792e-02, -6.941e-01)); + r += mul(s4_2, M4(4.583e-02, -6.945e-02, 8.239e-02, -9.996e-03, 9.288e-03, -2.209e-02, 3.012e-02, -2.720e-02, -6.338e-02, -1.081e-01, -1.522e-01, 1.295e-02, -4.195e-02, -1.774e-02, 9.414e-02, -1.140e-01)); + r += mul(s4_3, M4(-1.832e-02, 1.066e-01, 1.446e-01, 8.115e-02, -3.907e-02, -9.588e-03, 4.508e-02, -2.114e-02, 7.214e-03, 5.881e-02, -9.425e-03, 1.351e-02, -7.886e-03, -1.125e-02, 8.937e-02, -1.805e-01)); + r += mul(s4_4, M4(-1.545e-01, 3.279e-02, -7.314e-02, 3.145e-02, -2.324e-01, 2.880e-02, -4.514e-02, -7.526e-02, -3.248e-02, 1.011e-01, 1.070e-01, 9.826e-02, -6.378e-01, -1.113e-01, -5.476e-03, -6.405e-01)); + r += mul(s4_5, M4(4.225e-02, 4.995e-02, -5.151e-02, -6.658e-02, -3.270e-03, 2.154e-02, 4.740e-02, 3.039e-03, -1.839e-02, -1.744e-01, -1.593e-01, 6.823e-02, -1.242e-01, -1.483e-02, -1.341e-01, -2.339e-01)); + r += mul(s4_6, M4(1.194e-02, -7.981e-02, 6.914e-02, 3.322e-02, 5.713e-02, -4.931e-02, -3.948e-02, -2.579e-03, -4.410e-02, 6.070e-02, 1.195e-03, -3.376e-02, 1.641e-02, -5.587e-02, -4.053e-02, -1.630e-02)); + r += mul(s4_7, M4(4.789e-02, -4.548e-02, 3.627e-02, 7.645e-02, -4.072e-02, 1.233e-01, 2.409e-02, 2.719e-02, 1.063e-01, 6.620e-03, 5.710e-02, 2.887e-02, -1.481e-02, 1.618e-02, -4.501e-02, -7.504e-02)); + r += mul(s4_8, M4(3.256e-02, -6.711e-02, -7.155e-02, 1.077e-03, 1.179e-01, 1.927e-02, -7.517e-02, -5.050e-03, -1.652e-02, 2.988e-02, -6.473e-02, -2.233e-02, 1.078e-01, 1.606e-02, 1.051e-01, 1.858e-02)); + r += mul(s5_0, M4(1.185e-02, -8.303e-02, 7.525e-02, -3.948e-02, -2.980e-02, -5.279e-03, 1.521e-02, -3.329e-02, 3.512e-02, -4.894e-03, 1.869e-03, -9.467e-02, 4.547e-02, -1.113e-01, -4.921e-04, -3.650e-02)); + r += mul(s5_1, M4(-2.533e-02, -5.457e-02, 6.664e-02, -1.109e-01, 2.634e-03, -3.898e-02, -1.115e-01, -9.777e-02, 4.398e-03, 2.218e-01, -8.076e-02, -8.298e-03, -1.466e-03, 6.349e-02, -9.325e-02, -7.098e-02)); + r += mul(s5_2, M4(-1.490e-02, -1.382e-01, 6.412e-02, 4.542e-02, 2.084e-02, 3.895e-02, -1.326e-01, -2.134e-02, 5.695e-02, 1.803e-01, -6.086e-02, -8.669e-02, 3.222e-02, -8.005e-02, 6.315e-02, -7.551e-02)); + r += mul(s5_3, M4(-1.885e-03, 9.724e-02, -8.784e-02, 1.272e-02, -5.185e-02, -1.148e-02, -4.775e-02, 1.111e-02, -3.767e-02, -4.852e-02, 1.005e-01, 3.394e-02, -2.777e-02, 1.755e-02, 2.754e-02, -5.608e-02)); + r += mul(s5_4, M4(-8.003e-02, -3.442e-02, -1.281e-03, -5.182e-03, -3.213e-01, -1.581e-02, 6.228e-02, -1.903e-01, -1.459e-01, -1.218e-01, 2.070e-01, 4.157e-01, -1.788e-01, 1.294e-01, -6.393e-02, -4.187e-02)); + r += mul(s5_5, M4(-3.751e-02, 6.109e-02, 4.843e-02, -1.268e-02, -1.034e-01, -6.947e-02, -2.445e-02, -4.195e-02, -1.025e-01, -2.431e-01, -2.601e-01, 1.780e-01, -6.830e-02, -6.775e-02, -2.807e-02, -7.518e-02)); + r += mul(s5_6, M4(6.528e-03, -7.250e-02, 1.841e-02, 2.886e-02, 1.267e-02, 9.469e-03, -2.174e-01, -1.515e-02, -3.808e-02, 3.925e-02, -5.356e-02, -4.861e-02, 6.533e-03, 1.848e-02, 4.500e-04, -4.908e-02)); + r += mul(s5_7, M4(-4.713e-02, -4.756e-02, 3.375e-02, 4.234e-02, -2.338e-01, 1.421e-01, 4.348e-02, -1.375e-01, 7.462e-02, 7.048e-02, -7.856e-02, -1.155e-01, 3.095e-02, 4.129e-03, -2.738e-02, -2.082e-02)); + r += mul(s5_8, M4(1.326e-02, -8.204e-02, -7.037e-02, 5.335e-02, -5.314e-03, 7.717e-02, 2.884e-02, -8.406e-02, 9.963e-03, 1.188e-01, -2.833e-02, 1.061e-02, 1.649e-02, 6.136e-03, 2.692e-02, -6.118e-02)); + r += mul(s6_0, M4(-1.225e-01, -3.199e-02, -2.469e-02, -3.257e-01, 2.266e-03, 5.483e-02, -2.814e-02, 4.752e-02, 4.902e-02, 8.969e-02, -1.586e-02, 4.620e-02, 4.357e-03, 7.414e-02, -4.872e-02, -4.663e-02)); + r += mul(s6_1, M4(-4.936e-02, 1.609e-01, -1.327e-01, -1.711e-01, 2.718e-02, 8.757e-03, -4.149e-02, 4.596e-03, -2.391e-02, 1.315e-02, 1.624e-01, 1.233e-01, 1.183e-01, 1.777e-01, -2.123e-02, 4.965e-02)); + r += mul(s6_2, M4(-1.488e-02, 2.607e-02, -2.137e-01, -9.055e-02, 1.082e-01, -7.058e-03, -8.666e-02, 4.212e-02, -9.235e-03, -9.004e-02, 1.824e-01, 3.037e-02, 3.261e-02, 1.020e-01, -2.231e-02, -1.477e-02)); + r += mul(s6_3, M4(-1.582e-01, -7.736e-04, 1.119e-01, -2.861e-01, 1.220e-01, -1.340e-01, -6.330e-02, 6.531e-02, 1.245e-01, 5.890e-02, -6.131e-02, 5.569e-02, -1.808e-01, 6.471e-02, 2.407e-02, -9.163e-02)); + r += mul(s6_4, M4(5.294e-02, 2.264e-02, 9.260e-02, 2.702e-03, 6.289e-02, -1.609e-01, -1.517e-02, -9.012e-02, 9.663e-02, 8.651e-02, -7.378e-02, -2.462e-01, 7.932e-03, 5.327e-02, -6.168e-02, -2.111e-02)); + r += mul(s6_5, M4(-5.505e-02, 1.211e-01, 2.485e-02, 6.687e-05, 2.232e-02, 4.068e-02, -8.433e-02, -5.399e-02, 1.062e-01, 4.350e-02, 1.213e-01, -1.309e-03, 4.683e-02, 5.696e-02, -2.095e-01, 2.013e-02)); + r += mul(s6_6, M4(-6.952e-02, 8.277e-02, 6.191e-02, -1.102e-01, 6.552e-02, -1.717e-02, -4.441e-02, 3.744e-02, -1.211e-03, 2.891e-02, 2.197e-02, 3.364e-02, 7.535e-03, -6.770e-03, -6.397e-02, -1.047e-01)); + r += mul(s6_7, M4(-1.045e-02, 1.324e-01, -6.323e-03, -1.891e-01, -1.024e-01, 8.601e-03, -3.786e-02, -4.529e-02, -1.346e-01, -2.908e-02, -1.530e-03, -5.581e-02, -5.267e-02, 4.319e-02, 6.115e-04, -4.299e-02)); + r += mul(s6_8, M4(-1.878e-02, 2.048e-01, -4.330e-02, -4.895e-02, -1.007e-02, 1.237e-02, -2.172e-02, -8.858e-03, 1.403e-02, -6.982e-02, 1.142e-01, -2.795e-03, 6.235e-02, 2.970e-02, -8.211e-02, 3.042e-02)); + r += mul(s7_0, M4(-5.024e-02, -3.928e-02, 8.248e-03, 3.024e-02, 5.021e-02, -2.346e-02, 6.404e-02, 1.671e-01, 4.870e-02, 4.704e-03, -2.799e-02, -2.238e-02, 3.293e-02, -5.885e-02, 8.025e-02, 8.911e-03)); + r += mul(s7_1, M4(4.734e-02, -5.602e-02, -8.165e-02, 8.589e-02, -6.049e-02, -2.462e-01, 9.227e-03, -2.058e-01, -2.801e-02, 1.579e-01, 3.732e-02, -4.812e-02, 1.353e-01, -3.953e-02, -9.637e-02, 8.001e-02)); + r += mul(s7_2, M4(-3.973e-03, -1.591e-02, 1.366e-03, 4.087e-02, 5.343e-02, -5.346e-02, -5.055e-02, 2.863e-02, 5.103e-02, 1.944e-02, 6.019e-02, -8.776e-02, 3.405e-02, 2.922e-02, 1.362e-01, -7.645e-03)); + r += mul(s7_3, M4(-4.861e-04, -4.012e-02, 4.286e-02, -4.906e-03, 1.627e-01, -1.097e-01, -1.243e-01, -6.100e-02, 6.076e-02, -1.064e-02, 2.648e-02, 6.042e-02, -7.793e-02, -1.243e-02, 6.117e-02, -5.637e-02)); + r += mul(s7_4, M4(2.827e-02, 3.054e-02, 1.967e-02, 1.132e-01, 1.891e-01, -1.120e-01, 6.793e-02, 1.781e-01, -6.503e-02, 3.875e-02, -1.368e-01, -6.066e-02, 8.103e-02, 4.358e-02, -1.609e-01, 3.028e-02)); + r += mul(s7_5, M4(-2.243e-02, 6.646e-03, 4.602e-02, -8.031e-02, -2.034e-01, 2.752e-02, 8.253e-02, 5.569e-03, 1.200e-01, 1.976e-02, 1.460e-01, 1.773e-01, 5.920e-02, -8.765e-02, -3.917e-02, 2.605e-02)); + r += mul(s7_6, M4(3.516e-02, -1.987e-02, -3.543e-02, 5.867e-02, -3.802e-02, 5.770e-02, 1.447e-01, 2.270e-02, 1.202e-02, 6.453e-02, -6.165e-03, -1.177e-02, 9.626e-02, -5.555e-02, -9.464e-02, -6.232e-02)); + r += mul(s7_7, M4(-8.539e-04, -4.631e-02, 5.124e-02, 2.576e-02, -7.279e-02, 1.385e-01, -1.287e-01, -5.966e-02, -9.662e-03, 5.361e-02, -5.509e-03, -2.013e-02, 6.722e-02, -7.907e-02, -6.298e-02, -6.806e-02)); + r += mul(s7_8, M4(-1.113e-02, -1.198e-02, 6.223e-03, -3.262e-04, 2.197e-02, 1.376e-01, -2.326e-02, -9.016e-02, 2.050e-02, 3.226e-02, 3.427e-02, -4.716e-02, 7.373e-02, 5.725e-02, 5.104e-02, 5.237e-02)); + r += V4(2.325e-03, -1.910e-04, -2.453e-02, -3.947e-02); + return r; +} + +V4 f1(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(1.452e-02, -2.213e-02, 3.418e-02, -1.868e-03, 5.112e-02, 2.362e-02, 6.041e-02, 2.931e-02, 3.201e-02, -6.846e-02, 1.007e-02, -1.945e-02, -1.491e-01, -1.026e-01, -6.356e-02, 8.083e-03)); + r += mul(s0_1, M4(-3.302e-02, 1.039e-02, -7.105e-02, 4.512e-02, 1.699e-02, -4.399e-02, -1.129e-01, -3.180e-03, 4.396e-02, -2.110e-02, -2.890e-02, -1.940e-02, 1.083e-01, 1.618e-03, -4.433e-02, 2.564e-02)); + r += mul(s0_2, M4(-2.591e-02, 4.649e-03, -1.796e-04, -1.397e-04, 3.523e-03, 3.807e-03, -2.256e-02, -2.057e-02, 2.152e-02, -4.283e-02, -4.498e-03, 5.868e-02, 8.216e-02, -1.374e-02, -1.599e-02, 1.185e-01)); + r += mul(s0_3, M4(-2.138e-02, -2.510e-02, 3.635e-03, 5.926e-02, 1.948e-02, -1.106e-02, 2.721e-02, -6.293e-03, -1.257e-01, 3.189e-02, -2.102e-02, -1.052e-01, -1.488e-01, -2.395e-02, -1.034e-01, 4.175e-02)); + r += mul(s0_4, M4(3.801e-02, -5.686e-02, -2.110e-02, 8.493e-02, -4.898e-02, -1.377e-01, 2.817e-02, -1.992e-01, 2.107e-01, 2.706e-01, -6.196e-02, -1.218e-01, 1.192e-01, 1.155e-01, -1.004e-01, 1.263e-01)); + r += mul(s0_5, M4(6.634e-02, -6.558e-02, -5.310e-02, 8.774e-02, -1.082e-01, -1.092e-01, 9.039e-02, 4.413e-02, -1.282e-01, 4.255e-02, 2.607e-02, 3.934e-02, -3.736e-02, -3.743e-02, -7.450e-02, 5.096e-02)); + r += mul(s0_6, M4(-3.132e-02, 1.058e-01, 5.335e-02, 3.218e-02, -8.362e-03, -1.239e-02, 7.032e-02, -2.217e-02, -9.698e-02, -2.439e-02, -2.590e-02, -1.107e-01, -1.166e-02, 1.432e-03, -2.418e-02, -4.755e-02)); + r += mul(s0_7, M4(1.094e-02, -5.756e-02, -1.564e-02, -5.575e-02, -5.384e-02, 5.222e-03, -1.447e-02, 3.893e-02, -1.928e-01, 3.496e-02, 2.032e-01, 5.912e-02, 6.310e-02, 1.259e-02, -1.224e-02, 8.429e-02)); + r += mul(s0_8, M4(-6.143e-02, 8.296e-02, 3.608e-02, -6.786e-03, -8.912e-02, 7.147e-02, 3.735e-03, -1.193e-02, 6.371e-02, -1.715e-03, 6.778e-02, 4.096e-02, -2.178e-03, -2.116e-02, 3.634e-02, 2.353e-02)); + r += mul(s1_0, M4(3.726e-02, -2.700e-02, 5.479e-02, 2.802e-02, -4.521e-02, 6.023e-02, 1.441e-01, -3.327e-02, 7.922e-03, 9.608e-02, 6.132e-02, 6.058e-02, -1.181e-01, 1.375e-02, 3.535e-02, 1.659e-02)); + r += mul(s1_1, M4(9.419e-02, 4.554e-02, -1.226e-02, 3.050e-02, 1.130e-01, -5.704e-02, 4.752e-02, -1.253e-01, -5.118e-02, 4.104e-02, -6.749e-02, -5.343e-02, 5.244e-02, 6.944e-02, 1.140e-01, -9.239e-02)); + r += mul(s1_2, M4(-4.040e-02, 5.244e-02, 2.012e-02, 5.836e-02, 4.047e-02, 3.844e-02, 2.243e-01, -2.281e-02, 6.051e-02, -4.283e-02, 8.320e-02, 4.852e-02, -6.591e-03, 1.960e-02, 1.263e-01, -3.942e-02)); + r += mul(s1_3, M4(2.830e-02, 8.144e-02, -3.719e-02, -6.285e-02, -8.031e-02, -2.416e-02, -1.323e-01, -4.774e-02, 2.482e-03, 1.067e-01, 8.261e-02, 7.856e-02, -4.436e-02, 6.318e-02, -2.072e-02, 4.913e-03)); + r += mul(s1_4, M4(1.982e-02, 1.753e-01, -5.781e-02, 3.787e-01, -9.268e-02, -4.545e-01, 2.008e-01, -1.498e-02, 3.232e-02, -4.611e-02, -3.575e-01, -1.095e-01, 1.653e-02, -1.507e-02, -1.033e-03, -9.718e-02)); + r += mul(s1_5, M4(-2.268e-01, -9.784e-02, -1.059e-01, -3.203e-02, 5.056e-02, 1.258e-01, 4.908e-02, -2.078e-01, 9.348e-02, 1.395e-01, -1.733e-01, 7.156e-02, -1.265e-01, 8.872e-03, -9.426e-02, -9.058e-02)); + r += mul(s1_6, M4(-4.677e-02, -2.115e-02, -1.070e-02, 7.677e-02, 1.224e-02, -8.576e-02, 9.551e-02, -6.854e-02, 7.423e-02, 2.429e-02, 5.618e-02, -2.685e-02, -9.624e-02, -6.545e-02, 4.498e-02, -3.158e-02)); + r += mul(s1_7, M4(-1.134e-01, 8.718e-02, -1.208e-01, -1.686e-02, 1.400e-01, -3.213e-01, 9.984e-02, 1.925e-01, 9.047e-02, -7.602e-02, -1.353e-01, 3.362e-02, 3.519e-03, -7.485e-02, -4.753e-03, 3.789e-02)); + r += mul(s1_8, M4(-1.636e-01, -5.761e-02, 8.762e-02, 3.048e-02, 8.438e-02, 3.496e-02, 8.871e-02, -1.531e-01, 2.154e-02, 2.129e-02, -1.388e-01, -1.133e-02, -9.511e-02, -4.549e-02, -1.384e-02, -5.895e-02)); + r += mul(s2_0, M4(4.882e-03, 1.283e-01, -2.763e-02, 9.043e-02, -2.804e-03, -5.500e-03, 9.404e-02, 2.569e-02, 3.186e-02, 5.725e-02, -2.883e-02, -8.733e-02, -5.914e-02, 7.541e-02, -2.237e-03, 1.062e-02)); + r += mul(s2_1, M4(2.729e-02, 1.656e-02, 4.354e-02, 6.795e-02, -6.394e-02, 6.677e-04, -9.367e-02, -7.237e-03, 1.514e-03, -6.692e-02, 5.455e-02, -8.540e-03, 4.207e-02, 1.632e-01, 5.576e-02, -2.645e-02)); + r += mul(s2_2, M4(-1.607e-02, -2.096e-02, -1.031e-01, -1.291e-02, 7.235e-02, -3.595e-04, -1.461e-03, 1.701e-02, -1.732e-03, 8.503e-02, -1.746e-03, 1.168e-03, 8.124e-02, -3.384e-02, -1.580e-02, 9.406e-02)); + r += mul(s2_3, M4(-4.748e-02, 2.919e-02, 1.506e-01, 1.201e-01, 3.544e-03, 6.126e-02, 1.094e-01, 7.174e-02, -3.791e-02, 1.865e-01, -6.470e-02, -1.531e-01, 1.565e-02, 3.920e-02, 4.791e-02, 4.874e-02)); + r += mul(s2_4, M4(-6.980e-02, -3.444e-02, -7.843e-02, -7.325e-02, 1.878e-01, -9.045e-03, -8.041e-02, -2.307e-02, -5.940e-02, -3.866e-02, 6.295e-02, 1.268e-01, 1.971e-02, 1.880e-01, -7.046e-02, 7.267e-02)); + r += mul(s2_5, M4(1.551e-01, -1.490e-01, 4.663e-02, 2.092e-03, 4.003e-02, -9.856e-03, -1.524e-01, 8.802e-02, -6.113e-02, 1.032e-01, -5.811e-02, -1.167e-01, -1.040e-01, -1.417e-02, -7.664e-02, 6.155e-02)); + r += mul(s2_6, M4(9.057e-02, 1.014e-01, -9.122e-03, -1.784e-02, 3.977e-02, 4.477e-02, 4.628e-02, 2.379e-02, -1.242e-02, 6.113e-02, -9.431e-03, -5.879e-02, 2.596e-02, -2.014e-02, 3.798e-02, 2.791e-02)); + r += mul(s2_7, M4(1.446e-02, -1.929e-02, 2.062e-02, -5.054e-02, 8.961e-02, -2.919e-02, -3.591e-02, -4.359e-05, 8.416e-02, -9.472e-03, -6.747e-02, -4.886e-02, 4.601e-02, 2.285e-01, -4.229e-02, -1.883e-02)); + r += mul(s2_8, M4(2.301e-02, -8.001e-03, -3.776e-02, -4.969e-02, -6.737e-02, -7.542e-02, 9.241e-02, 4.902e-05, 1.421e-02, 1.136e-01, -1.230e-01, -2.179e-02, -9.226e-02, 1.140e-01, 5.157e-03, -4.170e-02)); + r += mul(s3_0, M4(5.915e-02, 1.352e-01, -6.930e-02, -3.117e-02, 6.114e-02, -1.653e-01, 1.082e-01, 8.015e-02, 3.380e-02, 3.502e-03, 4.469e-02, 1.862e-02, 6.960e-03, 9.355e-03, 5.013e-02, 9.937e-02)); + r += mul(s3_1, M4(-1.468e-01, 4.873e-02, 1.114e-01, -5.181e-03, 5.865e-02, -9.539e-02, -8.387e-02, 5.829e-02, 6.005e-02, -1.361e-01, -8.120e-02, -8.009e-02, 1.379e-01, -1.110e-01, -3.764e-02, 7.363e-02)); + r += mul(s3_2, M4(-1.323e-02, 1.469e-01, 4.694e-02, 1.735e-02, 3.762e-02, -9.231e-02, -7.239e-02, 1.063e-02, 4.043e-02, 4.433e-02, -5.364e-02, -3.767e-02, -3.601e-02, -6.791e-02, 7.434e-03, 8.255e-02)); + r += mul(s3_3, M4(-3.209e-02, 8.216e-02, 1.743e-01, -5.094e-02, 1.137e-01, -2.192e-01, -4.207e-02, 8.447e-03, -1.389e-02, 1.533e-01, 6.047e-03, -6.254e-03, -1.571e-02, 1.528e-02, 4.149e-02, 3.927e-02)); + r += mul(s3_4, M4(1.320e-01, -2.930e-02, -1.799e-02, 2.068e-01, 4.463e-02, -1.153e-03, -1.415e-02, -1.850e-01, 2.495e-01, 4.801e-02, -2.517e-01, 1.030e-01, -3.563e-01, 2.625e-01, 3.427e-02, 5.950e-02)); + r += mul(s3_5, M4(-7.095e-02, 5.167e-02, 1.356e-02, -5.700e-02, 1.530e-01, -1.915e-01, -1.541e-02, 1.587e-01, -3.247e-02, 1.876e-01, -2.764e-01, -2.076e-01, 3.612e-02, 1.690e-01, 8.827e-02, 6.959e-02)); + r += mul(s3_6, M4(-5.147e-02, 4.759e-02, 3.091e-02, 1.571e-02, -4.751e-02, 2.807e-02, -1.546e-02, -2.250e-02, -3.121e-03, 1.554e-02, -8.659e-02, -1.952e-01, 4.762e-04, -3.163e-02, -8.135e-02, 6.519e-02)); + r += mul(s3_7, M4(-2.127e-02, -1.332e-02, 2.117e-02, 1.499e-02, 4.184e-03, 6.348e-03, 4.794e-02, -4.764e-03, -1.938e-01, 3.070e-02, 5.067e-02, -1.063e-01, -7.583e-02, 9.846e-02, -5.883e-02, 1.245e-02)); + r += mul(s3_8, M4(-7.546e-02, -6.857e-02, 4.869e-02, 6.144e-04, 2.149e-02, -1.723e-01, 3.948e-02, 1.033e-01, -9.994e-02, -1.799e-02, -4.577e-02, 1.503e-02, 1.917e-02, 2.287e-02, -3.749e-02, 3.704e-03)); + r += mul(s4_0, M4(2.386e-02, -6.699e-02, 1.179e-01, 1.217e-01, -3.840e-03, -9.233e-02, -5.570e-02, -4.940e-02, -3.374e-02, 1.446e-02, -3.170e-02, -2.923e-02, 6.858e-03, 1.429e-02, -1.063e-01, 3.806e-02)); + r += mul(s4_1, M4(6.160e-02, 4.078e-02, -9.278e-02, 8.813e-03, 4.014e-02, 8.360e-02, 1.578e-01, 2.356e-02, 1.554e-02, -1.546e-02, 1.870e-01, -2.622e-02, 1.007e-01, -2.018e-02, 3.210e-02, -1.491e-01)); + r += mul(s4_2, M4(4.191e-02, 8.331e-02, 7.167e-02, -2.731e-02, 2.408e-03, -9.919e-03, -1.365e-03, -9.990e-03, -6.103e-02, -6.417e-02, -4.156e-02, 4.083e-02, 1.673e-01, 1.464e-02, -5.283e-02, -1.810e-02)); + r += mul(s4_3, M4(1.847e-01, -5.065e-02, 1.175e-01, 1.171e-01, 1.287e-02, -1.970e-01, 1.837e-02, 9.569e-02, -5.157e-02, 1.203e-01, 8.410e-02, -6.370e-02, 6.671e-02, 1.668e-01, 3.538e-02, 6.047e-02)); + r += mul(s4_4, M4(-1.742e-01, 1.513e-01, 1.198e-01, 3.599e-02, -5.566e-02, 9.012e-02, -1.984e-01, -2.470e-02, 1.116e-01, 3.129e-01, -8.667e-02, 1.346e-01, 1.939e-01, 2.393e-02, -9.264e-02, -2.492e-01)); + r += mul(s4_5, M4(4.079e-02, 7.863e-02, 3.043e-02, 8.451e-02, 7.184e-02, 9.325e-02, -3.495e-02, 6.198e-02, -8.641e-02, -2.968e-02, 1.519e-01, -1.383e-01, -5.764e-02, -1.684e-01, -7.344e-02, -1.298e-01)); + r += mul(s4_6, M4(2.949e-02, 5.492e-02, -6.664e-02, -1.867e-02, -2.591e-02, -2.480e-02, 2.903e-02, 1.387e-01, 5.483e-02, -1.129e-01, 1.877e-02, 7.596e-03, -1.058e-01, -1.558e-01, 9.410e-02, 6.218e-02)); + r += mul(s4_7, M4(7.291e-02, -9.164e-02, -2.596e-02, 1.246e-01, -1.701e-02, -1.238e-01, -8.126e-02, -1.795e-02, -6.595e-02, 1.063e-01, 2.183e-02, 5.273e-02, 1.348e-02, -5.259e-02, 1.109e-01, -1.108e-01)); + r += mul(s4_8, M4(-8.273e-02, -2.826e-02, 5.756e-02, -6.913e-02, -9.518e-02, 3.518e-02, -4.045e-02, -1.886e-03, -5.751e-03, 1.910e-02, 8.394e-03, -5.276e-02, 5.724e-02, 9.454e-04, 3.042e-02, 1.589e-03)); + r += mul(s5_0, M4(-4.081e-02, 2.613e-02, -1.001e-02, -7.691e-02, 6.423e-03, -7.491e-03, 7.306e-02, 5.021e-02, 5.762e-02, -7.077e-02, -6.219e-02, 1.087e-01, 4.356e-02, -1.110e-02, 2.045e-02, -4.486e-02)); + r += mul(s5_1, M4(-8.378e-02, 9.047e-02, 7.844e-02, -1.880e-01, 9.810e-02, 1.244e-01, 4.427e-02, 8.744e-02, 9.155e-02, 9.292e-02, 8.227e-02, 8.444e-02, -1.160e-02, 2.979e-02, 5.415e-02, -1.836e-02)); + r += mul(s5_2, M4(9.188e-02, 4.463e-02, 3.819e-02, 2.323e-02, -8.297e-03, -5.695e-02, -3.495e-02, -6.575e-03, -2.870e-02, 3.126e-02, -7.547e-02, 4.411e-02, 5.214e-03, 4.028e-02, -2.259e-02, 3.480e-02)); + r += mul(s5_3, M4(-3.300e-02, 4.670e-02, -6.394e-02, -7.687e-03, 8.160e-02, -1.323e-01, -3.512e-02, 6.628e-02, 5.705e-03, 2.856e-03, 9.416e-02, -2.114e-02, 2.401e-02, 9.146e-03, 7.629e-03, -6.669e-02)); + r += mul(s5_4, M4(-1.094e-01, 2.638e-01, 3.507e-02, 5.298e-03, -1.671e-01, 1.657e-01, 4.612e-02, -6.475e-02, 3.626e-01, -6.742e-02, 2.930e-01, 1.344e-01, -9.630e-02, -5.689e-02, -4.070e-02, -1.976e-01)); + r += mul(s5_5, M4(5.550e-02, 7.444e-02, 6.249e-02, 9.736e-02, -9.858e-02, -3.331e-02, -3.191e-02, -1.121e-02, -2.269e-01, -2.242e-01, -6.816e-04, -3.120e-01, -1.583e-02, 8.640e-03, -3.154e-02, -1.502e-01)); + r += mul(s5_6, M4(3.199e-02, 6.824e-02, -5.314e-02, 6.801e-03, -1.462e-01, 7.690e-02, 5.163e-02, 3.599e-02, 1.236e-02, -5.421e-02, 2.565e-02, -3.847e-03, -3.625e-02, 4.862e-02, -1.461e-02, 1.887e-02)); + r += mul(s5_7, M4(1.903e-02, 1.049e-01, -9.422e-02, 7.068e-03, 7.797e-02, -2.580e-02, -2.133e-02, -8.385e-02, 2.896e-01, -7.134e-02, -3.428e-02, 3.129e-02, -8.228e-02, 6.240e-02, 1.937e-02, -5.818e-02)); + r += mul(s5_8, M4(2.743e-02, -1.725e-02, 2.877e-02, 1.920e-02, -9.789e-02, -9.666e-02, -1.232e-02, -1.358e-01, -5.698e-02, -6.617e-02, -2.075e-01, -9.234e-02, 7.224e-02, 5.932e-02, 3.815e-02, 5.836e-03)); + r += mul(s6_0, M4(1.294e-01, -1.894e-01, 1.271e-02, -3.241e-02, 6.861e-02, 7.944e-03, -6.318e-02, 7.642e-02, -1.590e-03, 2.999e-02, -1.520e-01, -3.941e-02, 8.424e-02, 1.252e-01, 3.210e-02, 3.888e-02)); + r += mul(s6_1, M4(7.113e-03, -3.657e-01, -5.681e-02, -2.579e-02, 3.934e-03, -6.467e-02, -4.227e-02, -1.791e-02, -4.824e-02, -4.570e-02, 1.281e-01, -1.851e-01, -7.617e-02, -2.520e-02, 4.820e-02, -3.522e-02)); + r += mul(s6_2, M4(7.420e-02, -1.187e-01, 1.931e-02, -7.240e-02, 1.547e-02, 1.421e-02, -2.403e-02, 5.392e-02, -2.654e-02, -3.127e-02, 5.019e-02, -9.106e-03, -2.130e-03, 7.296e-02, -1.444e-02, 4.740e-02)); + r += mul(s6_3, M4(5.434e-02, -9.763e-02, -1.274e-01, 3.995e-02, -4.936e-03, -9.896e-02, -1.038e-01, -9.221e-03, 1.122e-02, 7.027e-02, -1.762e-01, 9.409e-03, -1.257e-02, -4.714e-02, 1.009e-01, -5.563e-02)); + r += mul(s6_4, M4(2.441e-01, -1.990e-01, 8.441e-02, 1.368e-01, 9.119e-02, 6.636e-03, -4.092e-02, 3.751e-02, 8.522e-02, 2.960e-02, -5.376e-02, -1.098e-01, 1.705e-01, -1.020e-01, -8.451e-02, 1.714e-01)); + r += mul(s6_5, M4(1.497e-01, -7.163e-02, -7.517e-02, 1.158e-01, -4.815e-02, 4.708e-02, -6.679e-03, -1.606e-02, 6.199e-02, -6.321e-02, -1.431e-02, -8.619e-02, -1.887e-01, 1.032e-01, -1.129e-01, -5.719e-02)); + r += mul(s6_6, M4(1.094e-01, -9.081e-02, -1.038e-01, -3.552e-02, -5.055e-03, -7.073e-02, -3.967e-02, 1.570e-02, -4.736e-02, -9.455e-02, 1.999e-02, 8.959e-03, 1.274e-02, 9.704e-02, 3.143e-02, -6.793e-03)); + r += mul(s6_7, M4(2.531e-01, -6.100e-02, -2.354e-01, -6.290e-02, -4.297e-02, 2.630e-03, 1.902e-02, -4.228e-02, -5.898e-02, 3.427e-02, 2.461e-02, -7.373e-02, 1.105e-01, -1.016e-01, 1.337e-02, -7.272e-02)); + r += mul(s6_8, M4(9.801e-02, -5.510e-02, -1.810e-01, -5.994e-02, 7.279e-02, -1.181e-02, 6.652e-02, 2.043e-03, 7.534e-02, -1.073e-01, 1.965e-02, -4.311e-02, -1.470e-01, 4.022e-02, 1.256e-02, -1.590e-01)); + r += mul(s7_0, M4(2.198e-03, 1.195e-02, 4.987e-02, 2.487e-02, -3.843e-02, 6.466e-02, 6.872e-03, -4.453e-02, -4.167e-02, 3.627e-02, 9.219e-03, -1.346e-02, 7.166e-02, 2.580e-02, -2.460e-03, 1.006e-01)); + r += mul(s7_1, M4(-1.733e-02, -1.171e-02, -9.107e-02, 7.854e-02, 5.693e-02, -1.864e-02, 1.852e-02, 5.034e-02, 7.212e-02, 3.279e-02, 7.340e-03, -1.160e-02, 1.476e-02, -1.143e-01, 5.309e-02, 8.046e-02)); + r += mul(s7_2, M4(1.709e-03, -9.215e-03, 3.640e-02, -2.015e-02, -7.813e-02, -2.006e-02, 5.107e-03, -3.323e-02, 3.283e-03, 1.799e-01, -6.751e-02, -3.501e-02, 5.822e-02, -1.271e-02, -1.269e-02, 3.323e-02)); + r += mul(s7_3, M4(-4.981e-02, 1.224e-01, 9.955e-03, 4.094e-02, -1.480e-01, -1.458e-01, -1.077e-01, 4.140e-02, 6.963e-02, -9.296e-03, -7.067e-02, 6.662e-02, -1.469e-01, -7.788e-02, 3.749e-02, -6.122e-02)); + r += mul(s7_4, M4(8.569e-02, -3.485e-03, 6.274e-02, 4.062e-02, -8.150e-02, -2.033e-02, -4.892e-02, -3.897e-02, -7.900e-02, 3.007e-02, -7.428e-02, -9.108e-02, 1.780e-01, -1.877e-01, -8.340e-02, 2.277e-01)); + r += mul(s7_5, M4(-2.498e-03, 4.742e-02, -1.618e-02, 5.209e-02, 7.432e-02, -5.888e-02, 5.732e-02, 2.196e-02, 2.111e-02, -1.725e-01, 5.155e-02, -7.693e-03, -1.316e-01, 6.684e-04, 3.329e-02, 4.710e-02)); + r += mul(s7_6, M4(-3.028e-03, -1.294e-02, 7.406e-03, 1.783e-02, 6.747e-03, 1.236e-02, 5.246e-02, 1.643e-01, -5.246e-02, 5.649e-03, -3.658e-02, -5.173e-02, -2.663e-02, -1.295e-01, 3.044e-02, -1.094e-03)); + r += mul(s7_7, M4(-1.570e-02, 1.167e-01, 2.844e-02, -6.654e-03, 1.367e-01, -2.043e-01, -9.955e-02, -1.525e-01, 6.153e-02, 7.433e-03, -1.944e-02, 1.738e-02, 6.937e-02, -2.045e-02, 1.065e-01, -1.348e-01)); + r += mul(s7_8, M4(-6.352e-03, 3.662e-02, 5.139e-02, 2.546e-02, 6.839e-02, -2.401e-02, -9.333e-02, -1.460e-01, 6.587e-02, 6.411e-02, -6.108e-02, -1.712e-02, -3.972e-02, -4.960e-02, 2.875e-02, 1.562e-02)); + r += V4(-2.817e-02, -3.278e-02, 5.487e-03, -3.455e-03); + return r; +} + +V4 f2(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(8.094e-04, 3.656e-02, 2.530e-02, 1.321e-02, 3.186e-02, 2.905e-02, -3.188e-02, 2.978e-03, 1.053e-01, -6.066e-02, 4.463e-02, -9.486e-02, -5.617e-02, 1.871e-01, 1.274e-01, -8.033e-02)); + r += mul(s0_1, M4(3.014e-02, 1.179e-01, -4.175e-03, -4.586e-02, -6.619e-02, -1.521e-02, -1.647e-02, 9.131e-04, 2.558e-02, 4.775e-02, -5.385e-02, 4.971e-02, -8.648e-02, 7.845e-02, -3.333e-02, -3.736e-02)); + r += mul(s0_2, M4(2.093e-02, 1.867e-03, -5.568e-02, 6.354e-03, -1.903e-02, -1.263e-02, -7.210e-03, -2.144e-03, -3.158e-03, -2.480e-02, 1.009e-01, 2.064e-02, -3.645e-02, -2.622e-02, -5.732e-02, -2.596e-02)); + r += mul(s0_3, M4(-7.684e-02, 1.370e-01, -3.305e-02, -5.904e-03, -4.982e-03, -1.551e-01, 5.245e-02, -2.731e-02, -3.460e-02, 2.563e-02, -1.279e-01, 1.652e-04, -3.821e-01, 1.504e-01, -1.377e-02, -6.622e-02)); + r += mul(s0_4, M4(-1.214e-01, -8.551e-02, -1.371e-01, 3.295e-02, 7.233e-02, 9.524e-02, 1.523e-01, -1.300e-02, -9.606e-03, 1.983e-01, 2.064e-01, -8.872e-02, 4.599e-02, 1.161e-01, 1.250e-01, -1.654e-01)); + r += mul(s0_5, M4(-4.586e-02, -6.165e-02, -6.160e-02, 1.361e-02, 2.826e-02, 4.357e-02, 3.549e-02, 3.897e-02, -5.086e-02, -1.082e-01, 1.085e-01, 1.877e-01, -4.027e-02, -2.616e-02, 4.383e-02, -8.405e-02)); + r += mul(s0_6, M4(-7.785e-02, 4.741e-02, -3.778e-02, -8.051e-02, 1.224e-01, -5.179e-02, -2.464e-02, 6.087e-02, -7.910e-02, 1.355e-01, -6.820e-02, 5.459e-02, -7.689e-02, 7.860e-02, 7.812e-02, -2.411e-02)); + r += mul(s0_7, M4(-1.077e-01, -6.815e-02, -5.486e-02, -2.057e-02, 5.878e-02, 1.066e-01, -5.390e-02, 4.218e-02, -1.593e-01, 6.220e-02, 2.660e-02, 3.090e-02, -1.283e-01, -1.931e-02, -6.371e-02, -2.323e-02)); + r += mul(s0_8, M4(3.539e-02, 2.408e-04, 1.936e-02, -3.251e-02, -1.620e-02, -8.020e-02, 1.042e-01, 6.912e-04, -6.654e-02, 1.033e-01, 2.011e-01, -8.273e-02, -3.157e-02, 2.211e-02, 4.827e-02, 3.244e-02)); + r += mul(s1_0, M4(-2.871e-02, -2.896e-02, -4.957e-02, 9.638e-03, -6.017e-02, 4.270e-01, 1.089e-01, -1.574e-01, 5.912e-02, -8.238e-03, 6.139e-02, -4.290e-02, -6.069e-02, 1.503e-01, 1.930e-02, 3.593e-02)); + r += mul(s1_1, M4(8.551e-02, -1.489e-01, -1.031e-02, -5.748e-02, -1.455e-02, 8.760e-02, -6.351e-02, 2.076e-01, -6.131e-02, 1.324e-02, 1.597e-02, -9.106e-03, -7.278e-02, 3.747e-04, 1.872e-02, 7.650e-02)); + r += mul(s1_2, M4(1.915e-02, -7.556e-02, 3.498e-02, 6.874e-02, 3.128e-02, 2.021e-01, 4.100e-02, 4.759e-02, 2.797e-03, 7.574e-02, -2.713e-02, -6.555e-02, 4.066e-02, 3.684e-03, -6.114e-02, 9.379e-05)); + r += mul(s1_3, M4(-1.447e-02, 2.614e-03, 1.120e-01, -5.897e-02, 5.813e-02, 2.165e-01, 2.444e-01, 8.125e-02, -1.264e-03, -3.225e-02, -1.145e-01, -8.569e-02, -1.534e-01, -1.499e-01, -1.726e-01, 2.016e-01)); + r += mul(s1_4, M4(3.678e-02, -2.782e-01, 1.807e-01, 1.374e-01, 1.275e-01, 1.405e-01, -1.047e-01, 4.539e-02, -1.196e-01, -2.815e-02, 5.395e-02, 3.457e-02, 1.847e-01, -1.763e-01, -9.819e-02, 2.932e-01)); + r += mul(s1_5, M4(-2.290e-02, 5.359e-02, 1.682e-01, -4.842e-02, -2.260e-01, 1.002e-01, 1.145e-02, -2.250e-01, 6.991e-03, 1.070e-01, 1.103e-01, -1.632e-02, 8.423e-02, 1.185e-01, 4.030e-02, 4.863e-03)); + r += mul(s1_6, M4(1.285e-01, 1.951e-01, 9.006e-02, -8.574e-02, 7.778e-02, 2.669e-01, 1.092e-01, -2.875e-02, 2.324e-02, 5.815e-02, -4.646e-02, 2.474e-02, 6.236e-03, -4.835e-02, 2.692e-02, -1.556e-02)); + r += mul(s1_7, M4(6.567e-02, -1.771e-01, 1.636e-01, 1.389e-01, 1.923e-02, -2.261e-02, -1.336e-01, 7.837e-02, 7.038e-02, 7.848e-02, 7.020e-02, -4.635e-02, 2.443e-02, -1.174e-01, -1.740e-02, 2.764e-02)); + r += mul(s1_8, M4(4.308e-02, -1.546e-02, -3.099e-02, 3.656e-02, 1.635e-01, 3.060e-01, 9.050e-02, 1.285e-01, -1.200e-01, -7.059e-02, 7.957e-03, 4.086e-02, 9.437e-02, 5.796e-02, -4.148e-03, 3.257e-02)); + r += mul(s2_0, M4(-2.373e-02, -4.504e-02, -1.705e-03, 5.850e-02, 4.369e-02, -2.675e-02, -1.464e-02, 1.841e-03, -2.994e-02, -8.266e-03, 1.376e-03, -7.074e-02, 5.712e-03, 6.283e-02, -1.036e-02, -4.803e-02)); + r += mul(s2_1, M4(1.495e-02, 1.791e-01, 4.742e-02, -1.452e-01, -1.541e-02, 1.155e-01, 5.500e-02, -1.145e-01, -9.387e-03, 1.789e-02, 3.983e-02, 6.136e-02, -1.055e-01, 1.866e-01, -4.713e-02, -5.747e-02)); + r += mul(s2_2, M4(-1.225e-01, 2.266e-02, 1.181e-02, -7.051e-03, -6.077e-02, 9.735e-02, -7.292e-02, -8.954e-02, 1.563e-02, -2.959e-03, 2.662e-02, -2.103e-02, 8.584e-03, -9.759e-02, -7.741e-02, 3.616e-02)); + r += mul(s2_3, M4(3.635e-02, -1.645e-01, -1.969e-02, 4.328e-03, 4.810e-02, 3.235e-02, -1.383e-01, -2.948e-02, 5.382e-02, -8.886e-02, 8.926e-03, -2.520e-02, 6.535e-02, -7.581e-02, -2.856e-02, 1.286e-02)); + r += mul(s2_4, M4(5.513e-02, 7.227e-02, 2.869e-02, 2.017e-02, 8.521e-02, 2.349e-02, 2.405e-01, -1.228e-01, 2.694e-02, 1.984e-02, 6.508e-02, -5.179e-02, 1.851e-02, 1.414e-01, 4.834e-01, -7.654e-02)); + r += mul(s2_5, M4(-4.136e-02, -6.083e-02, -4.117e-02, 4.112e-03, -6.040e-02, -1.106e-01, 3.498e-02, 4.838e-02, 4.583e-02, 5.135e-02, 3.665e-02, 1.567e-01, 7.413e-02, -1.082e-01, 2.292e-01, 1.199e-01)); + r += mul(s2_6, M4(-5.964e-03, -1.046e-01, 1.439e-01, -3.429e-02, -3.755e-02, 4.449e-02, 8.300e-02, 4.855e-02, 2.292e-02, -4.491e-02, -5.796e-02, 4.857e-02, 5.673e-03, -6.138e-02, 2.884e-02, -6.701e-04)); + r += mul(s2_7, M4(2.151e-02, 1.747e-01, -1.631e-01, 9.152e-02, 5.497e-02, -6.721e-02, -1.185e-02, 6.380e-02, 1.387e-02, 1.475e-01, -2.808e-02, -9.629e-02, 7.208e-02, 1.401e-01, -7.801e-02, 6.167e-02)); + r += mul(s2_8, M4(-4.352e-02, 1.319e-03, 8.084e-02, 3.737e-03, 6.664e-02, 1.447e-01, -1.793e-02, -4.077e-02, -1.716e-02, -6.143e-02, 4.823e-03, 5.037e-02, -9.153e-03, 5.060e-02, 1.001e-01, 4.966e-02)); + r += mul(s3_0, M4(5.649e-02, -3.891e-02, -2.430e-02, -2.174e-02, 1.105e-01, -3.841e-02, 4.498e-02, -5.182e-02, 9.689e-03, -9.495e-02, 5.334e-03, -6.659e-02, 3.015e-02, 4.723e-02, 1.369e-02, -1.516e-02)); + r += mul(s3_1, M4(1.232e-02, -6.351e-02, -1.843e-01, -8.472e-02, 1.921e-02, -6.587e-02, -1.244e-02, -3.887e-02, 2.925e-04, 1.065e-01, 3.573e-02, 4.122e-02, 6.901e-03, -7.812e-02, 7.476e-02, 4.080e-02)); + r += mul(s3_2, M4(-6.150e-03, 3.499e-02, -5.778e-02, -7.025e-02, 2.570e-02, -2.516e-02, -5.620e-02, -2.414e-02, -8.359e-03, -2.838e-02, 8.285e-02, 1.164e-01, -8.725e-03, 2.962e-02, 5.898e-02, -1.734e-02)); + r += mul(s3_3, M4(4.642e-02, 6.787e-02, -1.394e-01, -1.438e-03, 3.154e-02, 2.288e-02, -1.279e-02, 5.279e-02, 7.700e-02, 9.242e-02, 6.436e-02, -1.958e-02, 2.512e-02, -1.689e-01, 1.819e-01, -4.532e-02)); + r += mul(s3_4, M4(-3.873e-02, -1.275e-01, -2.041e-01, -3.506e-02, 2.099e-02, 3.069e-01, 1.333e-01, -2.164e-01, 3.009e-02, -2.383e-02, 1.660e-01, 7.033e-03, -1.980e-01, 1.627e-01, -3.039e-02, -1.680e-01)); + r += mul(s3_5, M4(-1.979e-02, -3.970e-02, 1.013e-01, 1.470e-02, -8.796e-03, -1.388e-01, -2.466e-01, -1.449e-02, -4.928e-02, -1.117e-01, 6.766e-03, 2.252e-01, -8.004e-02, -1.170e-01, 1.027e-02, -4.645e-02)); + r += mul(s3_6, M4(3.630e-02, 1.871e-02, -7.153e-02, -1.659e-02, -2.352e-02, 5.419e-02, 6.725e-02, 5.810e-03, -9.791e-02, -6.364e-03, 1.147e-01, 1.143e-01, 7.626e-02, 6.141e-02, 3.847e-03, 4.719e-02)); + r += mul(s3_7, M4(2.607e-02, 1.518e-02, 4.637e-02, 2.521e-02, -5.243e-02, 2.306e-02, -4.595e-02, -5.553e-02, 2.664e-02, 1.821e-01, 1.098e-01, -1.458e-01, -2.127e-01, -1.272e-02, 6.474e-02, 6.118e-02)); + r += mul(s3_8, M4(2.075e-02, 1.177e-02, -4.928e-02, 1.140e-02, -1.305e-01, -2.648e-03, 1.769e-02, -1.216e-01, 1.441e-01, 3.274e-02, 3.489e-02, -6.273e-02, -7.208e-02, 1.051e-01, 1.537e-01, -1.123e-01)); + r += mul(s4_0, M4(7.110e-02, 4.850e-02, -1.157e-02, 4.185e-02, 5.356e-02, 4.014e-02, 7.733e-02, -1.246e-02, -2.777e-02, -2.533e-02, 2.298e-02, -2.722e-02, -1.042e-01, 3.940e-02, 9.855e-02, -1.004e-01)); + r += mul(s4_1, M4(2.769e-02, 4.162e-02, -1.011e-01, 1.103e-01, -4.562e-02, -2.646e-02, -3.413e-02, 4.516e-02, -5.508e-02, 1.650e-01, 6.129e-02, 1.280e-01, -1.667e-01, 6.874e-02, -1.240e-01, 1.050e-01)); + r += mul(s4_2, M4(2.617e-02, 1.081e-02, 5.938e-02, -2.068e-02, 9.066e-02, 5.606e-02, 1.225e-02, 6.061e-03, -2.554e-03, -1.691e-02, 4.391e-02, 7.897e-03, -3.455e-02, 4.846e-02, -9.722e-02, -4.085e-02)); + r += mul(s4_3, M4(1.545e-01, -1.108e-01, 2.369e-01, 3.505e-02, -6.744e-02, 8.668e-02, -6.337e-02, -2.470e-03, 1.048e-01, 3.657e-03, 6.390e-03, -7.144e-02, -2.276e-02, -1.648e-01, -2.147e-01, -1.581e-03)); + r += mul(s4_4, M4(1.460e-01, 9.660e-03, -1.189e-01, 3.128e-02, 1.497e-01, 5.374e-02, 2.867e-02, 3.194e-02, -1.442e-01, -4.870e-02, 7.521e-04, 2.193e-01, 5.682e-01, -3.875e-01, 4.589e-01, 4.727e-01)); + r += mul(s4_5, M4(2.797e-02, -5.300e-02, -2.445e-01, -5.600e-02, -6.601e-02, -2.028e-02, -3.025e-02, -3.851e-02, 2.073e-02, -2.140e-02, -2.093e-01, 2.266e-01, 8.101e-02, 1.409e-01, 8.547e-02, -8.630e-02)); + r += mul(s4_6, M4(8.292e-02, -7.876e-02, -8.856e-02, 1.907e-02, -6.368e-02, -3.828e-02, -1.131e-01, 4.408e-02, 7.031e-03, -4.064e-02, 6.172e-02, -6.402e-02, -5.491e-02, -4.418e-02, -1.405e-01, -5.717e-02)); + r += mul(s4_7, M4(6.500e-02, -7.290e-03, 2.594e-02, 4.244e-02, 9.845e-02, -1.441e-01, 1.111e-01, -1.345e-02, -4.688e-02, -1.691e-01, 9.880e-02, 4.007e-02, -1.081e-01, 2.336e-01, 1.152e-01, -7.479e-02)); + r += mul(s4_8, M4(1.162e-01, -2.099e-02, 1.145e-01, 1.166e-01, -8.507e-02, 5.079e-02, 7.288e-02, -1.387e-01, 5.778e-02, 6.205e-02, -3.556e-02, 8.295e-02, -8.924e-02, -9.102e-02, -5.964e-02, 8.599e-02)); + r += mul(s5_0, M4(-1.462e-02, 8.082e-02, 4.455e-02, -4.356e-02, 7.335e-02, 4.376e-02, 8.118e-03, -4.540e-03, 1.430e-02, -9.267e-03, -4.582e-02, -8.926e-04, -5.143e-02, 1.560e-02, 2.137e-02, -2.697e-02)); + r += mul(s5_1, M4(-3.726e-02, 1.228e-01, -4.132e-02, 7.470e-02, 1.000e-02, 9.297e-02, 1.480e-01, -1.979e-04, 3.006e-02, -3.010e-02, -7.384e-02, 1.877e-01, 1.923e-02, 1.162e-01, -9.008e-02, 1.230e-01)); + r += mul(s5_2, M4(-2.161e-02, 1.287e-02, -6.257e-02, 1.472e-02, 5.709e-02, -4.043e-02, 1.515e-02, 1.690e-02, 2.494e-02, -1.136e-01, -9.791e-03, -5.449e-02, -3.664e-02, -4.210e-02, -1.805e-02, 4.579e-02)); + r += mul(s5_3, M4(-5.763e-02, 3.082e-02, -1.415e-02, -5.158e-04, -9.545e-02, 4.433e-02, 1.523e-03, -3.887e-03, 8.415e-02, -1.272e-01, 1.091e-01, 2.093e-02, -4.191e-02, -3.525e-02, -1.222e-01, -5.924e-03)); + r += mul(s5_4, M4(-3.762e-02, 1.749e-02, -2.028e-01, -4.117e-02, 1.383e-01, 9.640e-02, -3.933e-02, -1.313e-01, 2.118e-01, -9.010e-02, 2.746e-01, -3.513e-02, 2.214e-01, 5.478e-03, 9.056e-02, 2.379e-01)); + r += mul(s5_5, M4(-5.022e-02, 5.552e-02, -8.665e-03, -7.388e-02, 7.463e-03, -1.085e-01, 1.008e-01, 4.463e-02, 1.378e-01, 3.763e-02, 8.676e-02, 1.877e-01, -1.080e-02, 9.133e-02, 8.161e-02, -1.125e-01)); + r += mul(s5_6, M4(-3.119e-02, 1.863e-02, 1.994e-02, -3.058e-02, -5.287e-02, 1.133e-01, -2.383e-01, 8.179e-03, 6.562e-03, -7.171e-02, -7.081e-02, 3.105e-02, -6.101e-02, 9.925e-02, -8.762e-02, -8.117e-02)); + r += mul(s5_7, M4(3.108e-02, 5.279e-02, 2.264e-02, 6.178e-02, 1.021e-01, 5.481e-02, 1.419e-01, -7.912e-03, 1.020e-02, -2.002e-01, -1.818e-01, 9.782e-02, -5.765e-03, 9.245e-02, 8.338e-02, -8.818e-03)); + r += mul(s5_8, M4(-1.147e-02, -2.966e-02, 5.288e-03, -1.074e-03, 3.207e-02, -2.794e-02, -9.356e-03, -2.497e-02, 9.674e-02, 2.462e-02, -6.490e-02, 9.148e-02, -4.516e-02, -6.141e-02, -4.324e-02, 4.126e-02)); + r += mul(s6_0, M4(1.036e-01, -2.570e-01, -1.208e-01, 8.886e-02, 7.710e-02, -2.474e-02, 2.849e-03, 1.278e-02, -1.482e-02, -1.193e-01, -1.380e-02, 1.007e-02, 1.184e-01, -1.439e-01, -1.044e-01, 2.887e-02)); + r += mul(s6_1, M4(1.209e-01, -3.716e-01, 1.783e-01, 1.966e-01, 1.532e-02, -5.382e-02, -8.952e-02, 8.532e-02, -7.640e-02, 1.069e-01, 1.326e-01, -1.499e-01, -1.033e-02, -2.936e-02, 1.092e-01, 8.362e-02)); + r += mul(s6_2, M4(4.508e-02, -7.873e-02, -2.155e-02, 7.153e-02, 1.640e-02, 6.660e-02, 2.897e-03, 4.817e-03, -3.263e-02, 1.306e-02, -6.786e-02, 8.870e-02, 9.132e-03, 5.999e-02, -1.520e-02, 1.487e-02)); + r += mul(s6_3, M4(1.034e-01, -3.553e-01, 1.452e-01, 8.826e-02, 2.262e-02, 3.700e-02, 8.773e-03, 2.630e-02, -2.575e-02, 8.167e-02, -2.821e-02, -3.883e-02, 1.549e-01, -1.925e-02, 2.490e-01, -6.542e-02)); + r += mul(s6_4, M4(1.189e-01, -2.134e-01, 1.221e-01, 1.048e-01, -1.359e-01, -2.367e-02, -2.231e-01, -2.973e-02, 9.188e-02, -8.502e-02, -1.946e-02, 8.132e-02, 3.279e-01, -1.637e-01, 9.216e-02, 3.257e-02)); + r += mul(s6_5, M4(1.481e-01, -2.576e-01, -3.705e-03, 1.502e-01, 1.999e-02, 1.120e-01, 6.229e-02, -4.918e-02, -4.610e-03, 1.663e-01, -6.736e-02, -2.088e-01, 4.956e-02, 4.480e-02, 2.288e-01, 1.646e-01)); + r += mul(s6_6, M4(4.327e-02, -2.827e-01, 1.014e-01, 1.575e-01, -2.061e-03, 1.758e-01, -1.348e-01, -5.756e-02, -4.617e-02, -7.614e-02, 3.244e-02, -5.471e-02, 6.149e-02, 1.591e-01, -1.890e-01, 3.956e-03)); + r += mul(s6_7, M4(-1.924e-03, -2.328e-01, 7.678e-02, 1.188e-01, -3.185e-02, -1.139e-01, 1.001e-01, 3.155e-02, 1.520e-01, 1.029e-01, -4.720e-02, 8.691e-02, 5.704e-02, -7.140e-02, -2.305e-02, 9.784e-02)); + r += mul(s6_8, M4(3.108e-02, -1.951e-01, 8.722e-02, 7.469e-02, -2.963e-02, 2.462e-02, 3.282e-02, -9.392e-02, 8.362e-02, -9.343e-02, -8.554e-02, -7.126e-03, -6.007e-02, 7.685e-02, 3.067e-02, 7.109e-02)); + r += mul(s7_0, M4(-1.303e-02, 3.881e-02, -5.598e-02, 3.519e-02, -2.655e-02, 1.206e-01, 8.129e-02, -1.125e-01, 3.243e-02, 7.205e-02, 1.959e-02, 4.478e-02, -1.042e-02, -4.264e-03, 3.322e-02, 7.399e-03)); + r += mul(s7_1, M4(2.747e-02, 1.158e-02, -6.186e-02, -1.866e-02, -1.027e-02, -2.844e-02, -7.940e-02, -2.550e-04, 8.304e-03, -8.307e-02, 3.995e-04, 1.069e-02, -4.984e-03, 6.702e-02, 1.038e-01, 2.283e-02)); + r += mul(s7_2, M4(-2.234e-03, 1.159e-02, -5.776e-02, -2.739e-02, 6.097e-05, -3.496e-02, 4.195e-02, 2.330e-02, -2.140e-02, 1.020e-02, 3.447e-03, 1.336e-02, -5.864e-02, 2.480e-02, -2.061e-04, -5.578e-02)); + r += mul(s7_3, M4(-9.866e-03, -1.995e-02, -6.760e-02, 3.330e-02, -2.021e-01, 1.889e-01, -1.641e-01, 7.595e-02, -1.147e-02, -4.509e-02, 5.394e-02, -2.518e-02, 6.504e-02, -4.305e-02, 2.914e-02, -1.353e-01)); + r += mul(s7_4, M4(-2.741e-02, 1.660e-02, 3.526e-02, -1.491e-03, -2.191e-01, 2.912e-01, -4.188e-01, -1.748e-01, 1.531e-01, -1.138e-01, 2.163e-01, 2.023e-01, 8.601e-02, 1.334e-01, 5.447e-02, -6.781e-02)); + r += mul(s7_5, M4(-6.088e-03, -3.201e-02, 2.290e-02, -5.825e-02, -1.473e-02, -6.408e-02, -7.407e-02, 6.456e-02, 1.347e-02, 1.728e-02, 3.563e-02, -1.706e-01, 4.241e-02, 6.153e-02, 4.919e-02, -3.836e-03)); + r += mul(s7_6, M4(7.463e-03, 4.043e-02, 8.435e-02, 3.904e-02, -1.027e-01, -9.643e-02, -3.152e-02, 2.372e-02, 4.518e-02, 1.498e-02, 1.794e-02, -3.230e-02, -1.977e-02, 6.486e-02, -1.300e-01, 2.541e-03)); + r += mul(s7_7, M4(-2.846e-02, 3.876e-02, 6.175e-02, 4.732e-03, -3.786e-02, 9.850e-02, -7.317e-02, 1.009e-01, 8.281e-02, -3.916e-02, -1.173e-01, 4.051e-02, 2.851e-02, 7.268e-02, -1.119e-01, 5.271e-02)); + r += mul(s7_8, M4(-3.044e-02, 3.166e-02, 4.317e-03, -2.729e-03, -8.130e-02, -1.958e-01, 1.340e-01, -1.164e-02, -4.582e-03, -5.562e-02, 3.506e-02, -6.888e-02, -2.856e-02, -5.796e-02, -5.004e-02, -1.432e-02)); + r += V4(-3.570e-03, -4.291e-02, -1.299e-02, 1.425e-02); + return r; +} + +V4 f3(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-4.462e-02, -1.310e-02, 6.609e-03, 5.740e-02, -8.642e-03, 4.899e-02, -1.583e-02, 2.844e-02, 6.648e-02, 3.871e-03, -1.768e-02, -4.883e-04, -9.543e-02, -1.685e-02, 1.791e-02, -3.466e-02)); + r += mul(s0_1, M4(-6.833e-02, 5.737e-02, 8.637e-02, -7.064e-02, -2.990e-02, 3.789e-03, -1.489e-02, 3.995e-02, -2.039e-02, -6.969e-02, 1.027e-01, 1.380e-01, 7.285e-03, 2.917e-02, 7.228e-02, -1.042e-01)); + r += mul(s0_2, M4(-5.274e-02, 2.310e-02, -6.004e-02, 1.292e-02, -3.580e-02, -8.655e-02, -3.162e-02, 2.008e-02, 6.223e-02, -2.044e-01, -1.197e-01, -4.355e-02, 1.107e-02, -7.214e-02, -3.807e-02, -5.094e-02)); + r += mul(s0_3, M4(1.280e-02, -1.115e-02, 2.182e-04, -2.115e-02, -3.455e-02, -1.242e-02, 2.680e-03, -6.225e-02, -7.121e-02, 1.230e-02, 2.253e-02, -6.083e-02, 4.416e-03, 6.251e-03, -1.459e-01, -1.779e-01)); + r += mul(s0_4, M4(1.331e-01, -1.431e-01, 1.044e-01, 3.952e-02, -1.209e-01, 1.043e-02, -9.951e-02, -8.294e-02, -1.616e-01, 1.760e-01, 7.440e-02, -6.678e-02, -5.565e-02, -9.580e-02, -7.826e-02, -1.852e-01)); + r += mul(s0_5, M4(2.952e-03, 1.791e-03, -1.559e-02, -7.742e-02, -6.616e-03, -7.258e-02, -5.087e-02, -7.048e-03, -7.029e-02, 4.702e-02, 1.028e-02, -8.031e-02, 1.639e-02, 1.458e-02, 3.045e-02, -5.971e-02)); + r += mul(s0_6, M4(-4.983e-02, -3.599e-03, -8.925e-04, -3.772e-02, 1.299e-03, -2.566e-02, -6.971e-03, 9.303e-02, -5.120e-02, -4.997e-02, 1.306e-02, 6.740e-02, 3.890e-02, -1.435e-01, -9.920e-02, 4.651e-02)); + r += mul(s0_7, M4(-4.194e-02, -2.549e-02, 8.896e-03, -5.754e-02, 8.325e-03, 7.072e-02, 5.385e-02, -1.802e-02, 1.931e-02, 2.261e-01, -9.477e-02, -1.303e-01, -1.919e-02, -2.643e-02, 1.063e-01, -2.408e-02)); + r += mul(s0_8, M4(-7.756e-03, 7.950e-03, 1.119e-03, -5.365e-03, -6.542e-03, -2.240e-02, 4.740e-03, -5.067e-02, -8.639e-03, -5.217e-02, -1.758e-02, -5.323e-02, 3.224e-02, -1.480e-02, -4.384e-02, -3.711e-02)); + r += mul(s1_0, M4(-7.298e-02, 1.445e-02, -9.454e-03, -1.058e-02, -8.425e-02, 5.788e-02, 4.315e-02, -4.853e-02, 3.247e-02, 1.929e-02, 1.093e-02, 5.032e-02, -3.654e-02, -9.867e-02, 6.489e-02, -3.972e-03)); + r += mul(s1_1, M4(-1.560e-02, 9.919e-03, 1.003e-02, 7.083e-03, -2.534e-01, -2.473e-01, -4.555e-02, -4.074e-02, 7.089e-02, 1.078e-02, -9.212e-02, -1.034e-01, -6.360e-02, 3.824e-02, -1.433e-02, -7.397e-02)); + r += mul(s1_2, M4(6.288e-02, -1.428e-03, 2.118e-02, 2.259e-04, -2.058e-01, 6.832e-02, -6.487e-02, -8.280e-02, -2.492e-02, -3.735e-02, -7.691e-02, 4.195e-02, -5.090e-02, -2.049e-02, -2.962e-02, 2.124e-02)); + r += mul(s1_3, M4(4.037e-02, -1.183e-01, -3.306e-02, -2.481e-02, -8.280e-02, -1.402e-01, -1.123e-01, -1.309e-01, 1.840e-02, 5.922e-02, 6.474e-02, 9.333e-02, 1.322e-02, 1.328e-01, -7.711e-04, 1.101e-01)); + r += mul(s1_4, M4(2.431e-01, -1.526e-02, 3.973e-01, 6.055e-02, -2.158e-01, 1.573e-01, 1.153e-01, -2.713e-01, 1.282e-01, 1.626e-01, 2.550e-01, 9.282e-02, 1.051e-01, 1.085e-01, 7.336e-02, 2.281e-02)); + r += mul(s1_5, M4(-5.789e-02, -1.408e-01, 2.681e-01, 8.174e-02, -1.873e-01, -1.429e-01, 1.980e-02, -2.227e-02, 1.378e-01, -7.831e-02, -1.198e-01, -5.265e-02, 6.618e-02, 1.066e-01, 2.457e-02, 1.241e-02)); + r += mul(s1_6, M4(-1.809e-02, 3.453e-02, -2.993e-02, -4.992e-02, 3.207e-02, -4.045e-02, -1.958e-03, -3.240e-02, -3.410e-02, 3.105e-02, -1.371e-01, 1.361e-01, 3.359e-02, -2.561e-02, -5.956e-03, -1.423e-02)); + r += mul(s1_7, M4(-1.847e-02, 1.268e-01, 2.167e-01, -4.562e-04, 8.563e-02, -1.685e-01, -6.241e-02, -2.425e-01, 1.773e-01, 1.288e-02, 6.724e-02, 1.295e-01, -3.540e-02, -1.026e-01, 7.806e-02, 1.190e-01)); + r += mul(s1_8, M4(5.638e-02, 9.204e-02, 4.834e-02, -3.144e-02, 1.102e-01, -1.814e-02, 1.203e-01, 1.756e-02, 2.416e-03, -2.827e-02, 1.459e-01, 1.547e-01, 3.526e-02, 1.291e-02, 8.043e-02, 3.777e-02)); + r += mul(s2_0, M4(1.361e-01, 3.691e-02, 4.395e-02, 1.606e-01, 7.802e-03, -1.292e-01, -1.353e-01, 3.487e-02, 1.666e-02, 6.090e-03, 1.957e-02, 1.009e-02, -2.801e-02, 7.073e-03, -6.974e-03, -1.360e-01)); + r += mul(s2_1, M4(4.295e-02, 1.758e-02, -1.065e-01, 1.572e-01, 3.012e-02, 6.403e-02, -6.217e-02, -2.477e-02, 5.268e-02, -4.278e-02, -3.036e-02, 3.319e-02, -3.211e-02, 6.374e-02, -8.323e-02, -5.754e-02)); + r += mul(s2_2, M4(-3.358e-03, -2.677e-02, -5.062e-03, -8.726e-02, -1.376e-01, -3.560e-02, -6.401e-02, 6.773e-02, 2.704e-02, 3.601e-02, 1.257e-02, 3.423e-02, 1.469e-01, -1.546e-01, -1.254e-01, -1.696e-02)); + r += mul(s2_3, M4(5.545e-02, 4.398e-02, -2.672e-02, 1.246e-01, 3.295e-02, 8.615e-02, -4.438e-03, 1.501e-02, -4.680e-02, 2.229e-02, 1.763e-02, 5.402e-02, 5.715e-02, -5.796e-03, -3.928e-02, 7.037e-02)); + r += mul(s2_4, M4(2.797e-02, -1.276e-01, 1.149e-01, 4.661e-02, 1.573e-01, 1.898e-01, 2.875e-01, 2.349e-01, 1.526e-01, -1.870e-01, 4.934e-02, 2.432e-01, 6.115e-02, -2.159e-03, 5.827e-02, -1.524e-01)); + r += mul(s2_5, M4(6.111e-02, -2.927e-02, -1.449e-01, 7.417e-02, 4.468e-02, 2.148e-02, 4.834e-02, -7.180e-02, 6.146e-02, 5.945e-02, 2.432e-02, 2.849e-02, 1.800e-01, 8.602e-02, 1.058e-01, -1.170e-01)); + r += mul(s2_6, M4(5.160e-02, 7.842e-03, -3.424e-02, 8.373e-02, -4.979e-02, -1.220e-01, -1.123e-01, 4.353e-03, 4.925e-02, 6.592e-02, -6.178e-04, -1.969e-02, -1.097e-03, 3.600e-03, 3.540e-02, 4.032e-03)); + r += mul(s2_7, M4(4.263e-02, 5.162e-02, -4.264e-02, 1.454e-02, -4.603e-02, -2.586e-02, -4.238e-02, 7.478e-02, -3.296e-02, -2.916e-02, -3.310e-02, 8.334e-02, -1.462e-02, 2.845e-02, -1.949e-02, -8.869e-02)); + r += mul(s2_8, M4(7.671e-03, -1.960e-02, 8.305e-03, 3.879e-03, 1.967e-02, 2.672e-02, -1.089e-02, 1.420e-02, 7.171e-03, -2.250e-02, 5.168e-02, 1.100e-01, -6.511e-02, -1.224e-02, -1.919e-01, -5.954e-02)); + r += mul(s3_0, M4(-5.489e-02, -1.202e-01, -6.728e-02, -8.068e-02, 7.251e-02, 5.867e-02, -6.234e-02, 1.155e-01, 5.125e-02, -5.765e-02, -5.751e-02, -1.635e-02, 1.864e-02, 6.609e-02, -1.105e-03, -4.950e-02)); + r += mul(s3_1, M4(-1.404e-01, -4.070e-02, -2.387e-01, 6.615e-03, -4.551e-02, 1.071e-01, 5.698e-02, 9.160e-02, 8.717e-02, -7.866e-02, 3.544e-02, 1.517e-01, -2.900e-02, -1.239e-02, -5.162e-02, 1.900e-02)); + r += mul(s3_2, M4(-6.847e-02, -1.020e-01, -7.745e-02, 3.094e-02, -4.354e-02, -6.276e-02, -3.621e-02, -6.242e-02, 5.462e-02, -1.308e-01, -1.210e-01, -2.065e-02, -4.381e-02, -5.895e-02, 8.102e-02, -1.266e-01)); + r += mul(s3_3, M4(-1.059e-04, -1.497e-01, -1.039e-02, -4.629e-02, 2.626e-02, 1.801e-02, -9.512e-04, 6.084e-02, 4.065e-02, 9.308e-02, -2.085e-02, -2.430e-03, 1.454e-02, -5.680e-03, -1.196e-01, -5.078e-02)); + r += mul(s3_4, M4(-8.717e-02, -1.156e-01, -4.551e-02, -1.233e-01, -3.711e-02, -9.569e-02, 7.082e-02, -9.574e-02, 3.863e-01, 1.752e-02, 7.915e-02, 4.365e-01, -6.295e-02, -1.045e-02, 4.266e-02, -2.812e-01)); + r += mul(s3_5, M4(-1.277e-03, -8.856e-02, -1.335e-02, 8.308e-02, -1.264e-01, 8.471e-02, -9.759e-02, -7.361e-02, 1.505e-01, 2.235e-01, 1.617e-01, 1.516e-02, -2.184e-02, 3.152e-02, -2.481e-01, -1.529e-01)); + r += mul(s3_6, M4(-6.069e-02, 7.997e-02, -2.999e-02, 6.667e-02, -3.571e-02, -8.018e-02, -4.923e-02, -2.775e-02, 2.642e-02, -7.642e-02, -3.110e-02, -8.301e-02, 3.597e-02, -6.190e-02, 5.578e-02, 1.650e-02)); + r += mul(s3_7, M4(1.950e-03, -5.827e-02, -1.350e-01, -3.964e-02, 2.067e-02, 8.880e-02, -5.618e-02, -9.141e-02, 6.710e-02, 1.227e-02, -1.851e-01, -1.946e-01, 4.703e-02, -4.175e-03, 1.142e-01, -2.030e-01)); + r += mul(s3_8, M4(-4.808e-02, -8.059e-02, -1.219e-01, -1.497e-01, 5.362e-02, -6.077e-02, -7.402e-02, -9.153e-02, 1.003e-01, -4.803e-03, -7.885e-02, -2.247e-02, 1.434e-02, -4.348e-02, 6.374e-02, -1.095e-01)); + r += mul(s4_0, M4(8.929e-02, 1.477e-01, 1.770e-01, 1.408e-01, 6.920e-03, 5.607e-02, -1.516e-02, -5.035e-02, 2.399e-02, -4.023e-02, -4.029e-02, -6.642e-02, -2.567e-02, -4.240e-02, -4.215e-02, -3.904e-01)); + r += mul(s4_1, M4(2.250e-02, -3.173e-03, 1.788e-02, 1.658e-01, 5.531e-02, -4.699e-02, -2.140e-02, -1.022e-01, -1.031e-02, -2.320e-02, 6.078e-02, -1.768e-02, 4.480e-01, -3.266e-01, -6.451e-02, -1.013e-01)); + r += mul(s4_2, M4(5.465e-02, 8.356e-02, 2.870e-04, -4.076e-02, 6.278e-02, 7.096e-03, -2.026e-02, -2.613e-02, -4.095e-03, -8.923e-02, 1.429e-02, 1.257e-02, -2.308e-02, -4.313e-02, -8.777e-02, 2.147e-02)); + r += mul(s4_3, M4(1.128e-02, -8.824e-02, 3.743e-02, 1.121e-01, 3.255e-02, 6.373e-03, 3.494e-02, 5.817e-02, -5.255e-02, 6.612e-02, -2.657e-02, 9.935e-02, -5.839e-02, 1.502e-03, 1.674e-02, -2.483e-01)); + r += mul(s4_4, M4(-3.301e-03, 1.381e-03, 2.348e-01, -7.932e-02, 7.121e-02, 1.894e-02, 5.626e-02, 1.242e-01, 3.424e-02, 2.703e-01, 9.893e-02, 9.129e-02, 3.413e-02, 3.306e-01, -6.402e-02, 1.710e-01)); + r += mul(s4_5, M4(1.190e-03, -1.362e-01, 6.616e-02, 7.430e-02, -1.908e-02, -7.131e-02, -6.680e-02, -1.412e-02, -1.783e-03, 1.154e-01, -5.414e-02, -1.866e-01, -6.085e-02, -8.559e-02, 1.169e-01, -4.633e-02)); + r += mul(s4_6, M4(-4.513e-03, 3.699e-02, 9.614e-02, 6.584e-02, -4.287e-02, -9.917e-02, -2.837e-02, -1.147e-01, 5.015e-02, 8.579e-03, 4.115e-02, 9.666e-02, 4.970e-02, 3.432e-02, 1.172e-01, -1.503e-01)); + r += mul(s4_7, M4(4.660e-02, 5.717e-02, 1.118e-02, -1.337e-02, 1.256e-02, -4.309e-02, 8.529e-02, -4.747e-02, -5.440e-02, -1.774e-02, 1.103e-01, 4.132e-02, -3.581e-02, 9.867e-02, 2.425e-02, -1.120e-02)); + r += mul(s4_8, M4(5.126e-02, 3.103e-02, 1.489e-01, 8.006e-02, -3.423e-02, -6.998e-02, 6.039e-02, -2.939e-02, -1.505e-02, 7.190e-03, -4.863e-02, -2.403e-02, -6.097e-02, -8.975e-02, -3.179e-02, -8.617e-02)); + r += mul(s5_0, M4(-8.262e-02, 2.481e-02, 4.836e-03, -4.425e-02, -2.515e-02, 5.051e-02, -6.125e-03, -5.547e-02, 6.078e-02, 5.525e-02, 9.176e-02, 1.572e-02, -1.979e-02, 5.908e-02, 9.396e-02, 5.186e-02)); + r += mul(s5_1, M4(-4.726e-02, 3.977e-02, -1.014e-01, -1.503e-02, 3.785e-02, -1.439e-02, 1.512e-02, -3.868e-02, 5.295e-02, -8.620e-02, 8.191e-02, 6.278e-02, 1.169e-01, -1.905e-01, 7.085e-02, 1.050e-01)); + r += mul(s5_2, M4(-2.736e-02, 6.220e-02, -5.548e-02, 6.147e-02, 1.232e-01, 1.163e-02, 1.780e-02, -7.604e-02, 1.381e-01, 6.557e-03, 8.610e-03, 6.522e-03, 2.147e-02, 1.777e-02, 1.541e-02, 1.560e-02)); + r += mul(s5_3, M4(5.259e-02, -3.546e-02, 6.230e-02, 6.797e-02, 7.732e-02, 8.863e-03, -1.746e-02, -3.139e-02, -5.820e-02, 2.022e-02, -1.225e-01, -3.615e-02, -4.625e-02, -2.697e-02, -2.579e-02, 1.510e-01)); + r += mul(s5_4, M4(-2.816e-02, -9.628e-02, 7.526e-02, -5.355e-02, -1.576e-01, -2.085e-01, -3.468e-01, -2.840e-02, -1.601e-02, 1.563e-01, 4.990e-02, -7.243e-02, -1.961e-01, 1.467e-01, 7.937e-02, 4.030e-02)); + r += mul(s5_5, M4(-3.320e-03, -1.204e-01, -5.233e-02, -5.508e-02, 1.663e-01, 1.481e-01, 2.805e-02, -1.490e-01, 1.753e-01, 2.295e-01, 2.995e-01, -5.415e-02, -9.904e-02, -8.550e-02, -1.067e-01, 2.813e-02)); + r += mul(s5_6, M4(-1.444e-02, 1.265e-02, 3.572e-02, 9.024e-03, -5.852e-02, -7.202e-02, -1.086e-01, -1.721e-01, 3.204e-02, 8.423e-03, 4.847e-02, 3.032e-02, 7.523e-03, 2.191e-02, 8.512e-03, -5.825e-02)); + r += mul(s5_7, M4(4.656e-02, 4.840e-02, -3.721e-02, -5.674e-02, 3.699e-02, -7.553e-02, -2.514e-02, 3.656e-02, -3.952e-02, 4.498e-03, 1.271e-03, 2.396e-01, -2.891e-02, 3.648e-02, 3.780e-03, 8.656e-03)); + r += mul(s5_8, M4(5.193e-02, 5.043e-02, 3.167e-02, 1.211e-02, -4.968e-02, -7.751e-02, -5.472e-02, -1.230e-01, -8.041e-02, 7.367e-03, 3.397e-02, -6.051e-02, 1.718e-02, -1.775e-02, -3.377e-02, 2.839e-03)); + r += mul(s6_0, M4(2.356e-01, 2.417e-01, -7.312e-03, 2.296e-01, 1.123e-02, 2.061e-02, 1.249e-01, 1.465e-01, -8.119e-02, -8.273e-02, 2.396e-02, -5.723e-02, -1.368e-03, -8.216e-02, -7.126e-02, 1.767e-01)); + r += mul(s6_1, M4(3.064e-01, 1.425e-01, 1.339e-01, 1.613e-01, 5.711e-02, 1.105e-01, 3.318e-02, -1.383e-02, -1.848e-01, 7.377e-02, -1.934e-01, -1.845e-01, 2.550e-02, 9.450e-02, 4.248e-02, 1.391e-02)); + r += mul(s6_2, M4(2.085e-01, 1.108e-01, 1.701e-01, 2.713e-02, 4.024e-02, 1.521e-02, 7.399e-02, 4.808e-02, -6.747e-02, 5.166e-02, 5.017e-02, 6.361e-02, -2.552e-02, -6.003e-02, 4.130e-04, 5.567e-02)); + r += mul(s6_3, M4(2.763e-01, 2.114e-01, 4.282e-02, 1.008e-01, 2.514e-02, 6.967e-03, 7.642e-02, 7.630e-02, 2.342e-02, -5.306e-02, 1.487e-02, -1.732e-01, 3.900e-02, -1.407e-01, -1.259e-01, 1.265e-01)); + r += mul(s6_4, M4(1.623e-01, -1.235e-02, 2.044e-01, 5.010e-02, 2.684e-01, -5.874e-02, 4.729e-02, -2.150e-03, -8.674e-02, -2.515e-03, 1.375e-02, 1.261e-01, 1.919e-01, -1.287e-01, 2.525e-01, 4.040e-01)); + r += mul(s6_5, M4(1.842e-01, 1.762e-01, 1.343e-01, 1.453e-01, -4.476e-02, -1.114e-02, -2.291e-02, 2.730e-02, -1.311e-01, -1.116e-01, -1.276e-01, 1.305e-01, 6.493e-02, 8.502e-02, 9.360e-02, -1.174e-02)); + r += mul(s6_6, M4(1.881e-01, 9.549e-02, -2.598e-02, 1.182e-01, 2.119e-03, 4.513e-02, 3.322e-02, -5.448e-02, -6.380e-03, -1.790e-02, -1.076e-02, -7.405e-02, -4.231e-02, 1.375e-02, -2.372e-02, 9.198e-02)); + r += mul(s6_7, M4(8.190e-02, -4.095e-02, 3.436e-02, 2.693e-01, 9.724e-03, -8.337e-02, 4.002e-04, -1.853e-01, -4.698e-02, -4.704e-03, -1.762e-01, 1.410e-02, 5.535e-02, -4.814e-02, -2.937e-02, 1.699e-01)); + r += mul(s6_8, M4(7.594e-02, 2.500e-02, 2.054e-01, 1.359e-01, -6.950e-03, -3.872e-02, -8.553e-02, 3.117e-02, 8.458e-02, 1.037e-01, 9.023e-03, 6.317e-02, -5.330e-02, -1.181e-02, -1.154e-02, 1.801e-02)); + r += mul(s7_0, M4(3.500e-02, -1.354e-02, -6.275e-02, 2.530e-02, -1.126e-01, -2.442e-02, 6.522e-02, -4.946e-02, -3.849e-02, -1.052e-03, 7.946e-02, 8.609e-02, 8.536e-02, -8.888e-02, -1.648e-02, -9.296e-03)); + r += mul(s7_1, M4(1.536e-02, -1.095e-01, -9.734e-03, 1.057e-01, -3.581e-02, -1.352e-01, -6.353e-02, 6.288e-02, 7.990e-02, -1.541e-02, -2.616e-02, -2.092e-02, -1.386e-01, 3.706e-02, 9.455e-02, -8.811e-02)); + r += mul(s7_2, M4(-1.917e-02, 3.680e-03, -9.103e-02, 6.932e-03, 1.862e-02, 5.211e-02, 4.197e-02, -2.273e-02, -4.925e-03, 5.122e-02, 6.613e-02, 4.453e-02, -1.724e-02, -3.789e-02, -5.483e-03, -6.117e-02)); + r += mul(s7_3, M4(6.494e-02, 5.085e-02, -3.084e-02, -4.360e-02, -3.047e-04, 1.334e-01, 1.050e-01, -5.439e-02, 3.051e-02, 5.960e-02, 8.870e-02, -2.083e-02, 6.208e-02, -2.183e-02, -5.802e-02, 6.238e-02)); + r += mul(s7_4, M4(7.910e-02, 3.215e-02, -5.218e-02, -2.821e-02, 1.271e-01, -2.276e-01, -1.860e-01, -1.064e-01, 2.585e-02, 3.594e-02, 2.412e-01, 2.176e-01, 1.651e-01, -1.164e-01, 4.035e-01, -8.403e-02)); + r += mul(s7_5, M4(3.154e-02, -6.521e-02, -3.050e-02, 6.594e-02, 1.437e-01, 1.430e-02, -1.211e-01, -3.589e-02, 6.985e-02, 6.226e-02, 3.090e-02, 1.198e-01, -6.754e-03, -1.157e-02, -1.102e-01, -1.356e-01)); + r += mul(s7_6, M4(2.194e-02, -1.653e-02, -4.073e-02, -1.260e-02, 3.354e-02, 3.995e-02, -3.034e-02, -9.874e-02, -2.932e-02, 2.086e-02, -1.687e-02, 5.243e-02, 2.606e-02, 2.746e-02, -2.158e-02, -3.860e-02)); + r += mul(s7_7, M4(2.909e-02, -1.935e-02, -9.481e-02, -4.910e-02, -9.199e-02, 1.076e-02, 9.528e-03, 1.829e-01, 1.451e-03, 2.201e-03, -2.104e-02, 1.605e-01, -8.880e-02, -1.363e-01, -9.424e-02, -2.646e-02)); + r += mul(s7_8, M4(-1.473e-02, -5.392e-02, -7.442e-02, -2.511e-02, -1.129e-02, -6.392e-02, 1.128e-01, 6.659e-02, -1.281e-02, -1.358e-02, -2.367e-02, 7.697e-02, 2.667e-03, -4.043e-02, -8.640e-02, -6.715e-02)); + r += V4(-2.098e-02, 7.151e-03, -1.746e-02, -5.302e-02); + return r; +} + +void Pass7(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = Rmp8x8(tid.x) + blockStart; + uint2 size = GetInputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = (gxy + 0.5) * pt; + + V4 s0_0 = l0(-1.0, -1.0); + V4 s0_1 = l0(0.0, -1.0); + V4 s0_2 = l0(1.0, -1.0); + V4 s0_3 = l0(-1.0, 0.0); + V4 s0_4 = l0(0.0, 0.0); + V4 s0_5 = l0(1.0, 0.0); + V4 s0_6 = l0(-1.0, 1.0); + V4 s0_7 = l0(0.0, 1.0); + V4 s0_8 = l0(1.0, 1.0); + V4 s1_0 = -max(-s0_0, 0.0); + V4 s1_1 = -max(-s0_1, 0.0); + V4 s1_2 = -max(-s0_2, 0.0); + V4 s1_3 = -max(-s0_3, 0.0); + V4 s1_4 = -max(-s0_4, 0.0); + V4 s1_5 = -max(-s0_5, 0.0); + V4 s1_6 = -max(-s0_6, 0.0); + V4 s1_7 = -max(-s0_7, 0.0); + V4 s1_8 = -max(-s0_8, 0.0); + s0_0 = max(s0_0, 0.0); + s0_1 = max(s0_1, 0.0); + s0_2 = max(s0_2, 0.0); + s0_3 = max(s0_3, 0.0); + s0_4 = max(s0_4, 0.0); + s0_5 = max(s0_5, 0.0); + s0_6 = max(s0_6, 0.0); + s0_7 = max(s0_7, 0.0); + s0_8 = max(s0_8, 0.0); + + V4 s2_0 = l1(-1.0, -1.0); + V4 s2_1 = l1(0.0, -1.0); + V4 s2_2 = l1(1.0, -1.0); + V4 s2_3 = l1(-1.0, 0.0); + V4 s2_4 = l1(0.0, 0.0); + V4 s2_5 = l1(1.0, 0.0); + V4 s2_6 = l1(-1.0, 1.0); + V4 s2_7 = l1(0.0, 1.0); + V4 s2_8 = l1(1.0, 1.0); + V4 s3_0 = -max(-s2_0, 0.0); + V4 s3_1 = -max(-s2_1, 0.0); + V4 s3_2 = -max(-s2_2, 0.0); + V4 s3_3 = -max(-s2_3, 0.0); + V4 s3_4 = -max(-s2_4, 0.0); + V4 s3_5 = -max(-s2_5, 0.0); + V4 s3_6 = -max(-s2_6, 0.0); + V4 s3_7 = -max(-s2_7, 0.0); + V4 s3_8 = -max(-s2_8, 0.0); + s2_0 = max(s2_0, 0.0); + s2_1 = max(s2_1, 0.0); + s2_2 = max(s2_2, 0.0); + s2_3 = max(s2_3, 0.0); + s2_4 = max(s2_4, 0.0); + s2_5 = max(s2_5, 0.0); + s2_6 = max(s2_6, 0.0); + s2_7 = max(s2_7, 0.0); + s2_8 = max(s2_8, 0.0); + + V4 s4_0 = l2(-1.0, -1.0); + V4 s4_1 = l2(0.0, -1.0); + V4 s4_2 = l2(1.0, -1.0); + V4 s4_3 = l2(-1.0, 0.0); + V4 s4_4 = l2(0.0, 0.0); + V4 s4_5 = l2(1.0, 0.0); + V4 s4_6 = l2(-1.0, 1.0); + V4 s4_7 = l2(0.0, 1.0); + V4 s4_8 = l2(1.0, 1.0); + V4 s5_0 = -max(-s4_0, 0.0); + V4 s5_1 = -max(-s4_1, 0.0); + V4 s5_2 = -max(-s4_2, 0.0); + V4 s5_3 = -max(-s4_3, 0.0); + V4 s5_4 = -max(-s4_4, 0.0); + V4 s5_5 = -max(-s4_5, 0.0); + V4 s5_6 = -max(-s4_6, 0.0); + V4 s5_7 = -max(-s4_7, 0.0); + V4 s5_8 = -max(-s4_8, 0.0); + s4_0 = max(s4_0, 0.0); + s4_1 = max(s4_1, 0.0); + s4_2 = max(s4_2, 0.0); + s4_3 = max(s4_3, 0.0); + s4_4 = max(s4_4, 0.0); + s4_5 = max(s4_5, 0.0); + s4_6 = max(s4_6, 0.0); + s4_7 = max(s4_7, 0.0); + s4_8 = max(s4_8, 0.0); + + V4 s6_0 = l3(-1.0, -1.0); + V4 s6_1 = l3(0.0, -1.0); + V4 s6_2 = l3(1.0, -1.0); + V4 s6_3 = l3(-1.0, 0.0); + V4 s6_4 = l3(0.0, 0.0); + V4 s6_5 = l3(1.0, 0.0); + V4 s6_6 = l3(-1.0, 1.0); + V4 s6_7 = l3(0.0, 1.0); + V4 s6_8 = l3(1.0, 1.0); + V4 s7_0 = -max(-s6_0, 0.0); + V4 s7_1 = -max(-s6_1, 0.0); + V4 s7_2 = -max(-s6_2, 0.0); + V4 s7_3 = -max(-s6_3, 0.0); + V4 s7_4 = -max(-s6_4, 0.0); + V4 s7_5 = -max(-s6_5, 0.0); + V4 s7_6 = -max(-s6_6, 0.0); + V4 s7_7 = -max(-s6_7, 0.0); + V4 s7_8 = -max(-s6_8, 0.0); + s6_0 = max(s6_0, 0.0); + s6_1 = max(s6_1, 0.0); + s6_2 = max(s6_2, 0.0); + s6_3 = max(s6_3, 0.0); + s6_4 = max(s6_4, 0.0); + s6_5 = max(s6_5, 0.0); + s6_6 = max(s6_6, 0.0); + s6_7 = max(s6_7, 0.0); + s6_8 = max(s6_8, 0.0); + + t0[gxy] = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t1[gxy] = f1(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t2[gxy] = f2(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t3[gxy] = f3(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); +} + +//!PASS 8 +//!DESC conv7 +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 +//!IN t0, t1, t2, t3 +//!OUT t4, t5, t6, t7 + +#define l0(x, y) V4(O(t0, float2(x, y))) +#define l1(x, y) V4(O(t1, float2(x, y))) +#define l2(x, y) V4(O(t2, float2(x, y))) +#define l3(x, y) V4(O(t3, float2(x, y))) + +V4 f0(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(2.429e-02, -2.332e-02, 4.314e-02, 1.064e-02, 2.172e-03, -9.378e-03, -6.456e-02, 5.519e-02, -1.450e-01, 3.668e-02, 5.025e-02, 1.031e-01, 1.049e-02, 1.149e-02, -3.782e-02, -6.485e-02)); + r += mul(s0_1, M4(-1.216e-02, 1.289e-01, 4.855e-03, -5.725e-03, 5.489e-02, -1.701e-02, 9.362e-04, 2.121e-02, -4.344e-02, -1.216e-01, 7.830e-02, 1.137e-01, 2.323e-02, -2.009e-02, -4.112e-02, -6.864e-02)); + r += mul(s0_2, M4(-4.899e-02, -3.241e-02, -3.536e-03, 5.684e-02, -2.514e-02, -3.484e-02, -3.530e-02, 9.876e-03, 5.883e-02, 2.769e-02, 4.048e-02, -3.935e-02, -2.423e-02, -9.510e-03, 3.234e-02, 1.199e-02)); + r += mul(s0_3, M4(-1.349e-01, -1.353e-01, 6.827e-03, -5.336e-02, -6.016e-02, -1.109e-02, 9.085e-02, -5.200e-02, -1.802e-01, -2.713e-02, 4.700e-02, 4.469e-02, -7.109e-03, -5.905e-02, -7.286e-02, -1.176e-01)); + r += mul(s0_4, M4(-1.088e-01, 2.120e-01, -9.531e-02, -7.526e-02, -3.024e-02, -8.052e-02, 7.018e-02, -1.512e-01, -8.795e-02, -9.058e-02, 1.183e-02, 8.818e-02, -2.706e-01, 5.783e-02, -6.422e-02, -7.333e-02)); + r += mul(s0_5, M4(-1.192e-02, -8.800e-02, 2.284e-02, 4.938e-02, 2.447e-02, 1.127e-01, 2.742e-02, -1.041e-01, -6.344e-03, 5.594e-03, -1.393e-01, -1.855e-02, -1.230e-01, 2.002e-02, -9.026e-02, -7.525e-04)); + r += mul(s0_6, M4(-2.280e-02, -7.241e-02, 2.928e-02, 1.022e-02, -5.593e-02, 2.254e-02, 6.370e-02, 1.904e-02, -8.088e-02, -4.722e-02, 5.025e-02, 6.547e-02, 1.310e-01, -4.054e-02, 1.521e-02, 7.518e-04)); + r += mul(s0_7, M4(1.161e-01, -6.198e-03, 8.148e-02, 1.159e-02, 1.194e-01, -4.006e-04, 7.621e-02, 6.951e-03, 2.882e-03, -2.765e-02, 4.471e-02, 8.374e-02, -1.463e-01, 2.266e-01, -2.111e-01, 8.026e-03)); + r += mul(s0_8, M4(-5.146e-02, -5.043e-02, -4.174e-04, 8.790e-03, 7.446e-02, -3.545e-02, 1.583e-02, 9.433e-03, -5.614e-02, -2.652e-02, 1.538e-02, 6.623e-02, -2.130e-02, -1.283e-01, -1.310e-02, -3.202e-02)); + r += mul(s1_0, M4(-6.381e-02, 3.036e-02, 5.632e-02, 6.065e-03, -7.098e-02, -4.316e-02, 3.370e-02, -9.274e-02, 1.666e-03, -3.818e-03, 3.570e-02, 2.863e-02, -3.719e-03, 1.548e-02, 8.114e-04, -2.087e-02)); + r += mul(s1_1, M4(-1.125e-01, 2.095e-01, -5.373e-03, 5.728e-02, -1.684e-02, 5.683e-02, 6.455e-02, 8.118e-02, -2.147e-02, -6.171e-02, 5.331e-02, -2.312e-02, 5.723e-02, -7.003e-02, -5.061e-02, -6.937e-02)); + r += mul(s1_2, M4(-3.802e-02, -1.043e-02, 4.402e-02, 5.884e-03, -6.816e-02, 2.554e-02, -6.462e-02, 3.692e-02, 2.855e-02, -7.795e-02, -1.158e-01, 9.489e-03, -3.566e-02, -3.169e-02, 1.226e-02, -1.260e-02)); + r += mul(s1_3, M4(-7.747e-02, -1.154e-03, -1.686e-01, -6.604e-02, -6.979e-02, 1.844e-02, -1.876e-01, 1.099e-01, -1.142e-01, -2.556e-02, 4.666e-02, 5.026e-02, -1.906e-02, -4.265e-02, 4.301e-02, -8.881e-02)); + r += mul(s1_4, M4(1.986e-03, -3.458e-01, 3.094e-01, -1.274e-01, 2.375e-01, -7.486e-02, -1.912e-01, 4.443e-02, 6.306e-02, 8.115e-02, -5.890e-02, 2.617e-03, -3.320e-02, -8.362e-02, -1.985e-03, -1.438e-01)); + r += mul(s1_5, M4(2.581e-02, 1.221e-02, 2.112e-02, 5.072e-02, -6.900e-02, 4.629e-02, -5.685e-02, 7.048e-02, -4.532e-02, -3.919e-02, 9.927e-02, -3.342e-02, -3.581e-02, 5.119e-02, -1.537e-01, 1.891e-02)); + r += mul(s1_6, M4(5.745e-03, 4.427e-02, 5.853e-02, 3.445e-02, 1.085e-01, -1.109e-01, 5.323e-02, 1.128e-01, -5.432e-02, 7.260e-02, -1.084e-01, 8.378e-02, 8.080e-02, -6.499e-02, 1.355e-01, 4.337e-02)); + r += mul(s1_7, M4(8.341e-02, 3.424e-02, 3.290e-02, -1.363e-02, 1.580e-01, 3.006e-01, 2.149e-03, 2.191e-01, 8.049e-02, 1.118e-02, 8.779e-03, 6.471e-02, -1.069e-01, -2.980e-02, -4.201e-02, 1.076e-01)); + r += mul(s1_8, M4(-6.640e-02, -2.167e-03, -7.802e-02, -6.291e-04, -5.879e-02, -1.432e-01, -1.221e-02, 4.027e-02, 1.564e-02, 1.884e-02, -3.517e-02, 2.630e-02, 7.528e-03, -1.925e-02, 4.156e-02, -1.512e-02)); + r += mul(s2_0, M4(-5.786e-02, -3.811e-02, 7.465e-02, -1.153e-01, 9.855e-03, 1.133e-03, -9.657e-02, -5.820e-02, -4.431e-02, -3.342e-02, 3.839e-03, 1.346e-02, 3.735e-03, -6.809e-03, -1.971e-02, -7.439e-02)); + r += mul(s2_1, M4(-2.957e-02, 2.258e-02, 9.420e-02, -4.162e-02, -2.241e-02, 3.396e-02, -9.463e-03, 6.093e-02, 2.241e-02, 5.466e-03, -1.272e-02, 9.590e-02, -2.979e-02, 1.120e-01, 2.448e-02, -3.680e-02)); + r += mul(s2_2, M4(6.455e-04, 3.673e-02, 7.003e-02, -6.360e-03, 3.664e-02, -6.810e-03, 2.913e-02, 8.731e-03, 9.219e-03, 7.756e-02, -1.472e-01, 1.450e-02, -3.781e-03, 3.535e-03, -6.173e-02, 3.913e-02)); + r += mul(s2_3, M4(4.824e-03, 3.512e-02, -1.684e-01, -4.602e-02, 4.232e-02, -2.799e-02, 9.374e-02, 2.816e-02, 7.564e-02, 1.042e-01, -8.223e-02, 2.283e-02, -7.351e-02, 3.973e-02, -1.391e-01, 2.565e-03)); + r += mul(s2_4, M4(-2.335e-01, 2.684e-02, -3.716e-01, -1.481e-02, 5.490e-02, 1.224e-01, -2.276e-02, 6.176e-02, 3.403e-02, 1.614e-01, 1.994e-02, 2.240e-01, -4.081e-02, 1.772e-02, 5.466e-02, 9.059e-02)); + r += mul(s2_5, M4(5.616e-02, -2.055e-02, -1.607e-01, 2.489e-02, -7.941e-02, 1.590e-01, -2.552e-02, 2.637e-02, 3.266e-03, -1.990e-02, 1.649e-01, 1.237e-01, 1.191e-01, -6.178e-02, 2.103e-01, -2.459e-02)); + r += mul(s2_6, M4(-4.669e-02, -3.467e-02, 2.145e-01, 6.600e-03, 9.879e-03, 2.595e-02, 1.483e-02, -3.995e-02, 1.454e-03, -4.725e-03, 4.796e-02, 6.020e-02, 5.114e-02, 7.967e-03, -8.423e-02, -1.184e-02)); + r += mul(s2_7, M4(8.979e-02, 2.301e-01, 2.273e-01, -2.155e-02, 2.495e-03, -3.534e-02, 5.817e-02, -4.511e-03, -1.832e-02, 2.070e-01, 7.383e-02, 6.175e-02, 4.585e-02, -6.402e-03, 1.827e-02, 1.981e-02)); + r += mul(s2_8, M4(1.809e-02, -7.041e-02, 3.777e-03, -9.913e-04, -8.198e-04, 6.589e-02, -9.252e-02, 4.381e-02, -2.878e-02, -3.744e-02, 1.090e-02, -6.804e-02, 1.619e-02, 1.085e-01, -1.391e-02, -4.922e-02)); + r += mul(s3_0, M4(-3.984e-02, 5.420e-03, -4.550e-02, -1.233e-01, 4.322e-02, -5.213e-02, 1.335e-02, -5.276e-03, -1.693e-02, -7.303e-03, 6.252e-03, -4.690e-02, 3.173e-02, 3.850e-02, -8.569e-02, 5.811e-02)); + r += mul(s3_1, M4(2.930e-02, 2.401e-02, -8.850e-02, -1.446e-01, -5.032e-02, 1.690e-01, 7.153e-02, 6.679e-02, -9.158e-02, 7.794e-02, -3.869e-02, 3.164e-02, -7.438e-02, 2.832e-02, 9.705e-02, -6.236e-02)); + r += mul(s3_2, M4(3.107e-02, 4.798e-02, 2.440e-02, -5.775e-02, 1.245e-02, -1.367e-01, 1.987e-01, 5.487e-02, -7.530e-02, -2.864e-02, -6.313e-02, 2.412e-02, -4.335e-02, -1.480e-02, 3.736e-02, 7.179e-02)); + r += mul(s3_3, M4(1.861e-02, 3.280e-02, -1.080e-01, -1.617e-02, 6.373e-02, -7.300e-02, 1.517e-03, -1.489e-02, 2.597e-02, -7.612e-02, 5.984e-02, -4.236e-02, -6.426e-03, -7.361e-02, 5.293e-02, -2.767e-02)); + r += mul(s3_4, M4(-1.651e-01, -9.867e-02, -5.652e-02, -5.221e-02, 8.410e-02, 1.038e-01, -7.153e-02, -2.243e-02, -2.833e-02, -4.937e-02, 2.125e-01, -5.315e-02, 5.610e-02, -1.936e-01, 4.265e-01, 2.646e-01)); + r += mul(s3_5, M4(-5.804e-02, 2.708e-02, 3.219e-02, 6.301e-02, -9.947e-02, 6.365e-02, -1.993e-01, -2.109e-02, 7.368e-03, 8.566e-02, -1.474e-02, 4.023e-02, 6.955e-02, -3.642e-02, 7.850e-02, 1.153e-02)); + r += mul(s3_6, M4(2.621e-02, 1.533e-02, 8.712e-02, -6.340e-02, 1.455e-03, -5.999e-03, 2.176e-01, 4.310e-02, -2.057e-02, -5.172e-02, 7.316e-02, -7.311e-02, -3.093e-02, 6.763e-02, -1.499e-01, 1.656e-02)); + r += mul(s3_7, M4(6.913e-02, 4.051e-02, 6.953e-02, -6.580e-02, 7.922e-03, 4.726e-02, 1.577e-01, 2.761e-02, 4.748e-02, -6.473e-02, 7.108e-02, -1.199e-02, -1.576e-02, 4.525e-02, 9.625e-03, 6.197e-02)); + r += mul(s3_8, M4(2.181e-02, 5.856e-02, -2.680e-02, -4.358e-03, 2.145e-02, -5.667e-02, 1.037e-01, 7.757e-03, 2.428e-02, -3.369e-02, 2.964e-02, -4.941e-02, 3.692e-02, 7.243e-02, 3.112e-02, -2.451e-02)); + r += mul(s4_0, M4(5.122e-03, -1.978e-03, 7.659e-02, 8.961e-02, 3.828e-02, -4.181e-02, -7.118e-02, 1.168e-02, 7.047e-02, -3.212e-03, 1.733e-03, 5.195e-02, 4.263e-02, 3.222e-02, -7.399e-02, 1.099e-02)); + r += mul(s4_1, M4(-1.358e-03, -7.553e-02, 1.239e-01, 6.855e-02, -8.082e-02, 2.287e-02, 1.084e-01, -1.193e-01, -7.322e-02, 1.251e-01, 1.231e-02, -1.121e-02, -9.672e-02, 2.728e-02, -5.787e-02, 3.771e-02)); + r += mul(s4_2, M4(1.228e-01, -2.115e-02, -5.478e-02, -9.391e-02, -7.383e-02, -1.139e-01, -2.159e-02, 1.082e-01, -5.576e-02, -8.820e-02, 8.714e-02, -7.996e-03, -1.793e-02, 4.947e-03, -4.892e-03, 9.143e-02)); + r += mul(s4_3, M4(4.650e-02, -1.056e-01, -1.316e-01, -9.701e-03, 8.937e-02, -7.974e-02, -1.177e-02, 7.090e-02, -2.849e-02, -2.004e-02, 4.543e-02, -4.452e-02, 7.714e-02, -7.697e-02, 1.959e-02, 7.751e-02)); + r += mul(s4_4, M4(-1.665e-01, 1.863e-01, -8.215e-02, -5.029e-02, -1.530e-02, 2.796e-01, 1.253e-01, -1.444e-01, -1.062e-01, 2.850e-02, -6.918e-03, -7.752e-02, -8.895e-02, -4.825e-03, 7.103e-02, 7.231e-02)); + r += mul(s4_5, M4(1.011e-01, 8.921e-02, -8.754e-02, -8.981e-02, -3.880e-02, -2.067e-01, 8.463e-02, -8.275e-02, 7.571e-02, -1.195e-02, 1.401e-02, -8.276e-02, 2.977e-02, 7.257e-02, 1.761e-01, 9.600e-02)); + r += mul(s4_6, M4(3.094e-02, -6.186e-03, 7.496e-02, 2.487e-02, -3.221e-02, -6.985e-03, 1.212e-01, -3.637e-02, -1.775e-02, 1.375e-02, -3.809e-02, -2.806e-02, -1.726e-03, 4.752e-02, -9.841e-03, -2.093e-02)); + r += mul(s4_7, M4(-6.665e-02, 8.968e-02, -1.947e-03, 7.916e-03, 1.457e-01, 9.335e-02, -1.535e-01, 5.746e-02, -3.287e-02, -1.573e-02, 4.369e-02, -4.585e-03, 1.116e-01, 8.898e-03, -6.204e-02, 6.182e-02)); + r += mul(s4_8, M4(5.083e-02, -3.205e-02, 4.880e-02, -4.987e-04, -2.765e-02, -7.642e-02, 7.199e-02, -1.001e-02, -4.057e-02, 2.807e-02, -1.059e-02, 3.827e-03, -6.015e-02, -4.428e-02, -1.895e-02, -2.997e-02)); + r += mul(s5_0, M4(1.595e-02, -4.492e-02, -6.387e-02, -7.062e-02, 8.614e-03, -1.412e-02, 5.415e-02, -3.994e-02, 1.212e-02, 2.353e-02, -5.643e-02, -9.880e-02, -9.901e-02, 3.936e-02, 3.183e-02, 1.666e-02)); + r += mul(s5_1, M4(2.284e-02, 9.285e-02, -7.087e-02, 1.962e-02, 1.836e-02, -9.249e-02, 7.274e-02, -3.925e-02, -1.148e-01, -3.381e-02, -1.147e-01, 1.551e-02, -1.443e-01, -1.351e-02, 2.367e-02, 7.472e-02)); + r += mul(s5_2, M4(-6.567e-02, -6.534e-04, -2.999e-02, 3.788e-02, 5.928e-02, 2.940e-02, -3.614e-02, -8.431e-02, 6.493e-03, 9.792e-02, 8.166e-02, 8.121e-03, 3.733e-03, -6.000e-02, 1.023e-02, -2.708e-02)); + r += mul(s5_3, M4(4.225e-02, -3.035e-02, -3.136e-02, -7.348e-02, -1.554e-02, 3.912e-02, -2.285e-01, -4.692e-02, 1.047e-01, -8.994e-02, 1.769e-01, 1.248e-01, -6.176e-02, 1.573e-02, -8.333e-02, 3.275e-02)); + r += mul(s5_4, M4(7.160e-02, 2.975e-01, 1.284e-01, -4.519e-02, 1.370e-01, -7.781e-02, -8.876e-02, 1.955e-02, -1.218e-01, 3.048e-01, 1.675e-01, 1.339e-01, -1.556e-01, 5.754e-02, 3.948e-02, 8.600e-02)); + r += mul(s5_5, M4(-2.356e-01, 7.179e-02, -8.412e-02, 1.549e-02, 8.241e-02, -2.647e-02, 7.431e-02, -4.565e-02, 1.053e-01, -1.426e-01, 1.563e-01, 8.870e-02, 1.115e-01, -2.496e-02, 3.625e-02, -9.573e-03)); + r += mul(s5_6, M4(2.063e-02, -1.548e-02, 9.447e-02, -9.163e-03, 4.279e-03, 7.593e-03, 4.727e-02, -1.522e-02, -3.840e-02, 8.830e-02, -7.936e-02, 3.788e-03, -9.664e-02, 6.229e-02, -1.123e-02, -2.040e-02)); + r += mul(s5_7, M4(4.598e-02, 1.724e-01, -9.667e-02, -3.743e-02, 7.593e-02, 8.019e-03, 7.071e-02, 2.795e-02, -1.156e-01, -3.966e-02, -1.742e-01, -7.907e-02, -2.258e-03, -8.263e-02, 8.969e-02, 9.902e-02)); + r += mul(s5_8, M4(6.340e-02, 5.018e-02, -9.251e-02, 1.755e-02, 2.021e-02, -7.445e-02, -7.248e-03, 3.071e-03, -4.418e-02, 1.510e-01, -5.434e-02, -4.775e-02, 8.281e-03, -7.794e-02, 1.005e-01, 2.240e-02)); + r += mul(s6_0, M4(-8.541e-02, -7.668e-03, 8.428e-02, -5.870e-02, -2.830e-03, 2.378e-02, 3.209e-02, 4.221e-02, -1.416e-02, -7.413e-02, -2.234e-03, 9.183e-03, 4.123e-02, 3.226e-03, 5.348e-02, 7.047e-03)); + r += mul(s6_1, M4(4.549e-02, -2.740e-02, 4.882e-02, 1.613e-02, -2.580e-02, 1.114e-02, 6.591e-02, -1.712e-02, 4.918e-02, 1.411e-01, -6.373e-03, 4.880e-02, -1.052e-01, 7.112e-02, 1.284e-01, -2.216e-02)); + r += mul(s6_2, M4(-5.023e-02, 6.376e-03, 1.275e-02, 7.544e-02, -2.007e-02, -2.550e-02, 7.617e-03, 1.943e-03, -3.676e-02, -2.099e-02, -3.072e-02, 6.026e-02, -3.776e-02, -3.612e-02, 1.224e-02, -3.338e-02)); + r += mul(s6_3, M4(-6.905e-02, -9.304e-02, -1.556e-01, -4.700e-02, 7.271e-03, 3.053e-03, -1.253e-01, 3.238e-02, 7.153e-02, 1.051e-02, -3.062e-02, 2.274e-02, -8.820e-02, 7.336e-03, -1.870e-01, -3.185e-02)); + r += mul(s6_4, M4(2.769e-01, -5.243e-02, -1.432e-01, 8.889e-02, -2.395e-03, -1.144e-01, 1.223e-01, -4.498e-02, -1.315e-01, 1.572e-01, -1.973e-01, 1.578e-01, 3.022e-01, 5.166e-02, -1.834e-01, 1.442e-03)); + r += mul(s6_5, M4(-4.584e-02, -1.975e-03, -1.124e-02, 1.870e-02, -3.355e-02, -6.602e-03, 4.581e-02, -2.536e-02, -1.210e-01, 1.289e-02, -1.664e-01, 4.967e-02, 1.213e-01, 6.296e-02, -1.414e-01, -5.444e-04)); + r += mul(s6_6, M4(-1.273e-02, -5.103e-02, 7.597e-02, -5.106e-03, 1.498e-03, -6.909e-02, -3.966e-02, -4.536e-03, -1.409e-02, 3.820e-02, 4.236e-03, 2.091e-02, 8.105e-03, -8.909e-03, -4.405e-02, 5.760e-02)); + r += mul(s6_7, M4(-8.759e-02, -8.420e-02, -1.538e-01, 1.251e-01, 8.604e-02, 8.704e-02, 2.454e-02, -5.437e-02, 1.268e-01, 1.532e-02, 4.255e-02, 4.514e-02, -7.425e-02, 5.124e-02, -1.197e-02, 1.105e-02)); + r += mul(s6_8, M4(-9.679e-02, -3.635e-02, -1.599e-01, 2.217e-02, 1.157e-02, 7.903e-02, -1.282e-02, 2.517e-02, 3.072e-03, 1.212e-02, -5.068e-02, 1.219e-02, -5.048e-02, -4.789e-02, 6.014e-02, -1.834e-02)); + r += mul(s7_0, M4(-7.395e-02, 4.417e-02, -7.326e-02, 1.657e-04, -8.550e-02, 5.602e-03, -2.309e-02, 1.407e-02, 2.018e-02, -4.896e-02, 5.191e-02, -1.649e-02, 1.707e-02, -9.629e-03, 1.198e-01, 5.186e-02)); + r += mul(s7_1, M4(9.423e-02, -3.370e-02, -5.891e-02, -2.028e-03, -7.932e-02, -3.480e-02, 4.558e-02, 8.408e-02, 7.433e-02, 2.920e-02, -1.659e-02, -4.810e-03, -1.731e-01, 6.637e-03, 1.876e-01, -3.583e-02)); + r += mul(s7_2, M4(-3.342e-02, 5.117e-02, -6.354e-02, -2.572e-02, -8.278e-02, 4.129e-02, 3.478e-02, 5.152e-02, 1.427e-02, -4.283e-02, 3.041e-02, -3.038e-02, -5.652e-02, -1.183e-01, 3.366e-02, 4.271e-02)); + r += mul(s7_3, M4(-1.862e-01, 6.683e-02, -8.013e-02, -1.807e-01, -6.053e-02, -1.974e-02, -1.750e-01, -2.887e-02, -3.272e-03, -6.210e-02, 2.414e-02, -1.185e-02, -6.046e-02, -6.312e-02, -5.798e-02, -7.354e-03)); + r += mul(s7_4, M4(-1.143e-01, -9.726e-03, -8.392e-02, 2.117e-01, -5.687e-02, -1.317e-01, 8.600e-02, -1.780e-03, -2.099e-02, 8.315e-02, -2.715e-02, 5.463e-02, 1.539e-01, 1.487e-01, -2.683e-01, 5.775e-02)); + r += mul(s7_5, M4(-1.194e-01, -3.820e-02, 4.998e-02, -4.698e-02, -9.662e-02, 5.332e-02, 6.678e-03, 1.984e-02, -5.187e-02, 3.933e-02, -2.790e-02, 2.727e-02, -1.750e-02, -5.128e-02, 4.539e-02, 6.119e-02)); + r += mul(s7_6, M4(8.464e-02, -5.824e-02, 6.962e-02, -2.679e-02, 3.461e-03, -1.479e-02, -4.726e-02, 7.719e-02, 3.804e-02, -1.091e-02, 1.558e-01, 8.211e-03, -3.342e-02, -5.296e-02, -5.517e-02, 3.337e-02)); + r += mul(s7_7, M4(3.936e-02, -9.005e-02, -2.283e-01, 4.386e-02, 2.988e-02, -1.306e-01, 3.540e-02, -1.752e-02, 6.241e-02, -8.067e-03, 5.707e-02, 2.101e-02, -2.648e-02, -6.828e-02, 6.354e-02, 4.999e-02)); + r += mul(s7_8, M4(1.137e-01, 1.752e-02, -1.071e-01, 1.907e-02, -6.962e-02, 2.038e-02, -8.363e-02, 5.959e-02, 5.774e-02, 3.732e-03, 1.098e-01, -3.748e-03, -1.016e-01, -4.212e-02, 8.611e-02, -2.438e-03)); + r += V4(3.150e-02, 5.513e-03, -4.366e-02, 3.548e-03); + return r; +} + +V4 f1(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(7.776e-02, -8.490e-02, -2.067e-02, 5.440e-02, 1.813e-02, 1.135e-01, 2.268e-02, 3.435e-02, -4.555e-02, -1.398e-01, -8.772e-02, -3.666e-02, -7.805e-02, 5.617e-02, -8.735e-04, -8.572e-04)); + r += mul(s0_1, M4(-3.737e-02, -1.494e-01, -3.927e-04, 3.512e-02, -1.903e-02, 3.908e-02, 2.908e-02, 9.508e-02, -1.152e-02, -1.174e-01, -1.210e-02, -8.811e-02, 1.220e-02, 1.813e-01, 5.844e-03, -1.913e-03)); + r += mul(s0_2, M4(3.612e-02, -7.414e-02, -2.258e-02, 4.371e-02, 1.355e-02, -1.887e-02, -3.716e-03, 2.872e-02, -5.748e-02, -3.006e-02, 2.186e-02, 9.390e-02, 5.408e-04, 7.620e-02, 2.978e-02, -4.244e-02)); + r += mul(s0_3, M4(4.609e-02, 4.968e-02, -8.155e-02, -8.411e-02, 6.703e-02, -1.381e-01, -6.787e-02, 1.911e-02, -4.370e-02, 5.156e-03, -2.329e-02, -1.051e-01, 3.994e-02, -2.949e-02, -3.222e-02, -7.972e-02)); + r += mul(s0_4, M4(1.459e-01, 1.109e-01, -5.734e-02, 1.614e-01, -1.681e-01, 3.539e-03, -9.288e-02, -1.257e-01, -1.014e-01, 5.845e-02, -2.211e-01, -1.245e-02, 1.704e-01, -1.163e-01, -1.202e-01, -1.136e-01)); + r += mul(s0_5, M4(-5.593e-02, 8.014e-02, 4.557e-02, 1.334e-02, 5.387e-02, -2.346e-02, 4.065e-02, -3.965e-02, -3.307e-02, 1.917e-02, 4.113e-02, -3.794e-02, -4.636e-02, -6.311e-02, -6.138e-02, 1.189e-01)); + r += mul(s0_6, M4(-2.809e-02, 2.056e-02, 3.268e-02, -1.146e-01, 1.179e-01, 9.341e-02, -6.772e-02, -1.389e-01, -1.195e-01, 8.743e-02, 1.178e-01, -9.008e-02, -7.854e-02, 5.421e-02, -3.389e-02, 3.070e-02)); + r += mul(s0_7, M4(-6.888e-02, -3.600e-02, 9.016e-02, -3.882e-02, -1.024e-01, -4.963e-02, 6.431e-02, -2.895e-02, 6.086e-02, -1.285e-01, 1.493e-01, 9.648e-02, 2.547e-01, 1.457e-01, -1.138e-01, 5.216e-02)); + r += mul(s0_8, M4(1.205e-02, -1.702e-02, 5.149e-02, 7.429e-03, 8.371e-02, 4.814e-03, 2.502e-02, -9.301e-02, 3.953e-02, 2.052e-02, -1.253e-03, -1.018e-03, -1.161e-01, 1.265e-02, 4.431e-02, -8.109e-02)); + r += mul(s1_0, M4(1.480e-01, -1.260e-01, 4.616e-02, 4.163e-02, 4.978e-03, 1.068e-02, -1.285e-02, 2.300e-02, -1.355e-03, -2.255e-02, -6.099e-03, 5.602e-02, 1.958e-02, 4.921e-03, -2.415e-02, 5.545e-03)); + r += mul(s1_1, M4(-1.063e-01, 4.527e-02, -4.872e-02, 7.474e-02, 5.204e-02, 2.735e-02, -1.533e-02, -1.948e-02, -1.332e-01, -1.691e-02, -1.712e-03, -6.606e-02, -2.148e-02, -6.268e-02, -4.682e-02, -1.285e-02)); + r += mul(s1_2, M4(-4.936e-02, 8.319e-03, 2.232e-02, -4.762e-02, -5.726e-03, -1.410e-02, 3.006e-02, -5.014e-03, 2.384e-02, -1.393e-02, 1.334e-02, 1.541e-02, 2.470e-02, -1.395e-02, 1.095e-02, -3.093e-02)); + r += mul(s1_3, M4(9.590e-02, 7.083e-02, -1.208e-01, -4.706e-02, -1.534e-01, -5.825e-03, 2.298e-02, -1.212e-01, 6.187e-03, -4.588e-03, -8.587e-02, -3.169e-03, -1.830e-02, 1.651e-02, -1.949e-02, -1.584e-02)); + r += mul(s1_4, M4(-2.469e-01, 4.538e-02, -1.953e-01, -1.554e-01, -7.490e-02, -3.285e-01, 1.109e-01, -7.588e-03, 1.271e-01, 2.494e-03, 6.129e-02, 5.532e-02, -4.167e-02, 2.438e-01, -2.073e-01, -2.021e-01)); + r += mul(s1_5, M4(1.644e-02, 1.013e-02, 4.682e-02, 4.437e-02, 7.156e-02, -3.308e-02, -3.563e-02, 9.885e-02, -4.479e-02, 1.694e-02, -1.865e-02, -8.136e-03, 2.330e-02, 1.699e-02, -1.056e-01, 1.087e-01)); + r += mul(s1_6, M4(-6.609e-02, 2.807e-02, 3.110e-02, -8.848e-02, 2.765e-02, 8.620e-02, 3.319e-02, -5.906e-02, 8.444e-02, 2.822e-02, 1.107e-02, -3.552e-02, -9.031e-02, 1.956e-02, -5.127e-02, -5.593e-03)); + r += mul(s1_7, M4(1.399e-01, -4.111e-02, 2.611e-02, 4.028e-02, -1.003e-02, 1.235e-01, -1.821e-02, -1.066e-02, 3.003e-02, -9.736e-03, 1.179e-01, -3.768e-02, 4.234e-02, 5.035e-02, -2.162e-01, -4.588e-02)); + r += mul(s1_8, M4(1.795e-02, -3.291e-02, 6.307e-03, 5.110e-02, -1.168e-01, 7.285e-03, -6.830e-02, 3.189e-02, 6.169e-02, 7.242e-03, 2.605e-02, -2.164e-02, -1.964e-02, -3.577e-02, -4.418e-02, -3.246e-02)); + r += mul(s2_0, M4(-3.049e-02, 3.876e-02, 1.798e-02, 1.660e-02, 5.262e-03, -7.100e-03, -2.275e-04, -2.742e-02, -5.409e-02, 1.216e-01, 1.681e-02, -8.374e-02, 1.909e-01, -1.592e-02, -2.350e-02, 4.850e-02)); + r += mul(s2_1, M4(-3.809e-02, 7.727e-02, -1.538e-02, -7.747e-02, -1.638e-02, 3.303e-03, -4.032e-02, -1.914e-02, 6.667e-02, -1.473e-01, 9.159e-02, 2.177e-02, 7.800e-02, -2.749e-02, 2.020e-02, -7.160e-02)); + r += mul(s2_2, M4(3.598e-02, -6.197e-02, 1.842e-02, -8.793e-03, -1.018e-02, 5.654e-02, 5.311e-02, 2.156e-02, 6.909e-02, -4.899e-02, -7.643e-04, 5.588e-02, -2.846e-02, 1.155e-02, -6.372e-02, -4.291e-02)); + r += mul(s2_3, M4(3.729e-02, 1.007e-01, 2.525e-02, -1.302e-01, -1.402e-02, -3.402e-02, -2.153e-02, 9.281e-02, 1.373e-01, -5.732e-02, -3.573e-02, -3.186e-02, -4.562e-02, -1.542e-01, -2.256e-02, 2.462e-02)); + r += mul(s2_4, M4(1.297e-01, -8.224e-02, -2.092e-01, 2.684e-01, -2.339e-03, 2.797e-02, 3.087e-02, 1.398e-01, 9.239e-02, 7.381e-02, -8.860e-02, -5.791e-02, 6.191e-02, 5.237e-02, 7.781e-02, 2.119e-01)); + r += mul(s2_5, M4(-4.760e-02, 1.027e-02, 3.280e-02, -1.385e-02, 5.485e-02, 3.425e-02, -8.161e-02, 1.306e-01, -7.043e-04, -1.177e-02, 5.946e-02, -7.133e-02, -3.342e-02, -6.026e-02, 2.064e-02, -1.492e-02)); + r += mul(s2_6, M4(-9.405e-02, -4.250e-02, 1.683e-02, 7.080e-03, 2.519e-02, 1.549e-02, 3.318e-02, -1.970e-02, 8.231e-02, -8.037e-02, -7.925e-02, -6.067e-03, 3.509e-03, -4.632e-02, 5.849e-02, 7.958e-02)); + r += mul(s2_7, M4(1.424e-01, 5.223e-02, 3.317e-02, -2.217e-01, 5.145e-02, 1.991e-02, 3.337e-03, -8.977e-02, 6.504e-02, -5.637e-02, 1.894e-01, 6.373e-02, -8.009e-02, -2.898e-02, -2.254e-02, 5.607e-02)); + r += mul(s2_8, M4(4.897e-02, -2.811e-02, 4.906e-02, 4.026e-02, -1.230e-01, -5.932e-02, 4.591e-03, 4.566e-02, -9.466e-02, -2.565e-02, 3.836e-02, 5.090e-02, 2.224e-02, 4.254e-02, -7.822e-02, -1.107e-02)); + r += mul(s3_0, M4(-1.730e-02, -3.316e-02, 3.565e-02, -2.075e-02, -1.353e-02, 7.812e-03, 9.693e-03, -2.420e-02, -1.212e-02, -9.251e-03, -1.824e-02, -5.754e-02, 4.554e-02, 6.043e-02, 2.870e-02, 3.500e-02)); + r += mul(s3_1, M4(-7.212e-02, 2.119e-02, 3.419e-02, 8.373e-02, -3.011e-02, 1.856e-02, -1.155e-01, -2.185e-03, 7.813e-02, -2.907e-02, -3.720e-02, 3.578e-02, -1.057e-01, -8.175e-03, -5.053e-02, 2.420e-02)); + r += mul(s3_2, M4(9.529e-02, 1.016e-01, 3.172e-02, -2.386e-02, -8.391e-02, 6.843e-02, -9.736e-03, -9.194e-02, 1.399e-02, -8.978e-03, 2.900e-02, -6.146e-02, -6.319e-02, -1.560e-03, -9.177e-02, -6.033e-02)); + r += mul(s3_3, M4(2.028e-02, 1.315e-02, 5.543e-02, 7.761e-02, -8.352e-02, 6.295e-03, -6.043e-03, 9.804e-02, -3.626e-02, -5.410e-02, -2.883e-02, -1.200e-02, -2.720e-03, -3.627e-02, 6.209e-02, -1.272e-02)); + r += mul(s3_4, M4(1.698e-02, -1.959e-03, -1.426e-01, -7.658e-02, -5.019e-03, 7.411e-02, 1.118e-01, 1.282e-01, 8.223e-02, 2.384e-01, -8.747e-02, -1.974e-01, 2.444e-02, -6.515e-02, 5.985e-02, -2.092e-01)); + r += mul(s3_5, M4(-5.460e-03, -2.205e-02, 8.765e-02, -6.076e-02, -5.173e-02, -5.875e-02, -8.130e-02, 2.187e-01, 1.908e-02, -2.804e-02, -4.912e-03, -1.549e-02, 3.233e-03, -2.002e-02, 4.922e-02, 1.501e-01)); + r += mul(s3_6, M4(4.957e-02, -3.018e-02, 1.195e-02, -1.627e-02, -2.495e-02, 2.673e-02, 3.557e-02, -1.834e-02, -3.139e-02, 1.945e-01, -4.287e-02, -2.590e-01, 6.648e-02, -1.035e-01, 1.978e-02, 2.497e-01)); + r += mul(s3_7, M4(4.261e-02, -4.467e-03, 9.605e-02, -1.084e-01, -4.150e-02, 8.793e-03, -4.267e-02, -6.823e-02, -4.787e-02, -1.536e-01, 1.780e-01, 1.504e-02, -8.017e-02, 6.095e-02, -1.297e-01, 1.903e-01)); + r += mul(s3_8, M4(3.615e-02, -5.108e-02, 3.453e-02, 1.011e-01, -7.597e-02, -6.015e-03, 1.119e-02, -3.885e-02, 2.361e-02, 3.135e-02, -5.040e-02, -3.085e-02, 3.696e-02, 7.501e-02, -2.058e-02, -1.242e-01)); + r += mul(s4_0, M4(4.920e-02, -7.762e-02, -1.594e-02, 6.495e-02, -6.660e-03, 6.573e-02, 5.427e-02, -1.234e-01, 4.898e-02, 6.072e-03, 4.608e-02, 5.062e-02, 9.321e-02, -5.075e-03, -1.583e-02, 6.021e-03)); + r += mul(s4_1, M4(5.049e-02, 7.086e-02, -7.803e-02, -2.777e-03, 1.827e-01, -1.059e-01, -8.425e-02, 1.674e-01, 9.989e-03, -5.947e-02, 7.359e-03, 1.393e-01, -1.248e-01, 6.799e-02, -1.108e-01, -3.081e-02)); + r += mul(s4_2, M4(-9.983e-02, -3.100e-03, 5.232e-02, 3.045e-02, 7.090e-02, -1.493e-02, 3.596e-02, -6.723e-02, -3.310e-02, 3.425e-02, -6.720e-02, -7.788e-02, -2.674e-02, -1.370e-02, 6.114e-02, -7.593e-02)); + r += mul(s4_3, M4(-1.041e-01, 7.343e-02, 5.043e-02, -8.283e-03, -3.446e-02, -7.448e-02, 1.155e-01, 9.511e-02, -4.565e-03, -7.229e-03, -4.273e-02, 5.366e-02, -1.361e-01, -4.208e-02, 1.054e-01, 1.825e-01)); + r += mul(s4_4, M4(1.120e-01, 1.808e-02, -1.422e-01, 4.162e-02, 3.161e-01, 8.619e-02, 1.298e-01, -2.176e-01, 7.566e-02, -1.184e-01, -4.221e-02, -6.631e-03, -1.206e-02, 2.938e-02, -1.332e-01, 4.335e-02)); + r += mul(s4_5, M4(2.097e-01, 3.137e-02, 1.642e-01, -1.393e-01, -2.272e-01, -7.897e-02, -9.002e-02, 5.244e-02, -2.101e-02, -5.433e-02, 1.045e-01, -1.250e-02, 4.406e-02, 1.994e-02, -2.391e-02, 6.093e-02)); + r += mul(s4_6, M4(-6.634e-02, -6.862e-03, 8.092e-03, 3.152e-02, 9.126e-02, 3.181e-02, -2.699e-02, -2.576e-02, 2.686e-02, -5.285e-02, 1.551e-02, 1.751e-02, 1.191e-01, 8.773e-02, 1.456e-02, -1.665e-01)); + r += mul(s4_7, M4(-2.891e-02, -3.612e-02, -5.749e-02, 2.471e-02, 2.772e-01, -1.306e-01, 8.702e-02, 1.480e-01, -4.810e-02, 4.675e-02, -4.128e-03, -1.958e-02, 5.197e-02, -6.999e-02, 9.079e-02, 7.055e-02)); + r += mul(s4_8, M4(9.988e-02, 1.870e-02, 8.131e-02, -2.260e-02, -8.316e-02, 8.149e-03, 2.334e-02, -5.434e-03, 5.043e-02, 2.868e-02, -2.653e-02, 6.189e-02, -3.698e-02, 3.083e-02, -3.091e-02, 2.374e-03)); + r += mul(s5_0, M4(5.254e-02, -7.315e-02, -2.225e-02, 2.153e-02, 5.725e-02, -4.636e-02, 1.601e-03, 4.516e-02, 8.068e-02, 2.729e-02, -3.870e-02, -7.201e-02, 6.760e-02, 4.552e-03, 4.438e-02, 4.500e-02)); + r += mul(s5_1, M4(1.685e-01, 1.509e-01, 2.948e-03, 1.776e-02, 1.675e-02, 6.696e-02, -5.363e-02, -6.286e-03, 6.024e-02, 3.023e-03, -5.779e-02, 5.292e-03, -1.165e-01, 7.991e-02, -1.851e-02, 4.630e-04)); + r += mul(s5_2, M4(-7.170e-02, 1.589e-02, -1.884e-02, -3.883e-02, 7.200e-02, -1.746e-02, -2.195e-02, 9.030e-02, 1.058e-01, -8.948e-02, -1.143e-01, 6.897e-02, -6.149e-02, 1.574e-03, 4.231e-02, 1.363e-02)); + r += mul(s5_3, M4(3.745e-02, 1.247e-01, 2.019e-02, -3.741e-02, -3.449e-03, -4.847e-03, 1.767e-03, 5.781e-03, -7.935e-02, -2.522e-01, 3.269e-02, 1.529e-01, 3.102e-01, -1.893e-01, -6.841e-02, 3.808e-02)); + r += mul(s5_4, M4(1.921e-01, -7.191e-02, 1.048e-01, 6.779e-03, 6.828e-02, 2.094e-02, 4.389e-02, 5.065e-02, -1.595e-02, -2.677e-01, -7.935e-02, -1.236e-01, 1.635e-01, -4.481e-02, 4.704e-02, 1.869e-01)); + r += mul(s5_5, M4(6.662e-03, 6.683e-02, -9.824e-02, 1.703e-01, -2.904e-02, 5.726e-02, -3.509e-02, -1.256e-01, -1.423e-01, 9.473e-02, -1.299e-01, 1.175e-01, -3.071e-02, -2.751e-02, 4.384e-02, -8.192e-02)); + r += mul(s5_6, M4(-1.580e-02, -3.752e-02, 4.568e-02, 7.775e-03, 2.727e-02, 7.825e-03, -1.738e-02, -9.195e-03, -3.736e-02, -6.091e-02, 3.713e-02, 6.820e-02, 1.742e-02, 1.099e-02, -2.703e-02, -4.711e-02)); + r += mul(s5_7, M4(-2.568e-02, -3.585e-02, -8.110e-05, -1.047e-02, 1.640e-02, -2.770e-02, 2.889e-02, 3.152e-02, 8.110e-02, -1.274e-01, 6.282e-02, 1.401e-01, 1.375e-02, -5.635e-02, 4.940e-02, 5.975e-02)); + r += mul(s5_8, M4(4.971e-02, -3.187e-02, 5.470e-02, -5.790e-02, 2.007e-02, 1.442e-02, -5.515e-02, 8.206e-02, 9.185e-03, -2.850e-02, -4.617e-02, -2.761e-02, 7.174e-02, -2.299e-03, -8.726e-03, -4.167e-02)); + r += mul(s6_0, M4(-2.564e-02, -1.334e-03, 1.618e-02, -3.692e-02, 1.668e-02, -1.014e-02, 3.184e-02, -8.247e-05, -5.784e-02, -6.551e-02, -1.474e-02, -1.508e-02, 1.280e-02, 1.104e-02, 1.940e-02, -2.254e-02)); + r += mul(s6_1, M4(1.281e-02, 2.432e-02, -3.916e-02, -8.733e-02, 2.112e-02, -1.650e-02, -5.389e-02, 2.289e-02, 6.510e-02, -1.273e-01, 8.516e-02, -4.619e-02, 7.458e-02, -4.286e-02, -1.097e-01, -4.328e-02)); + r += mul(s6_2, M4(2.650e-02, -1.040e-02, 7.558e-03, -1.189e-02, -6.083e-03, -3.193e-03, -9.984e-03, -3.848e-02, -2.653e-02, -7.239e-02, 2.185e-02, 1.225e-02, -3.582e-02, -2.979e-02, -6.728e-02, -6.881e-02)); + r += mul(s6_3, M4(-3.437e-02, 6.707e-02, 3.284e-02, -1.281e-01, 2.801e-02, 2.978e-03, 2.879e-02, -7.024e-03, -5.116e-02, 3.863e-02, -5.467e-02, 8.941e-02, 5.295e-02, -1.732e-01, -1.607e-01, -6.141e-03)); + r += mul(s6_4, M4(-5.183e-02, 9.150e-02, 2.158e-01, 1.855e-01, -1.774e-01, 4.494e-02, -3.685e-02, -2.582e-02, 1.537e-01, -1.493e-02, -8.099e-02, 1.548e-01, 8.523e-02, -1.556e-02, 1.480e-01, 1.893e-01)); + r += mul(s6_5, M4(1.187e-01, 5.356e-02, -6.313e-02, 9.672e-02, 2.376e-03, 1.626e-02, 6.959e-03, -9.679e-02, 5.677e-03, -3.208e-02, -9.106e-02, 1.793e-01, 1.366e-02, -1.316e-02, 6.110e-02, -5.431e-02)); + r += mul(s6_6, M4(-3.338e-03, 8.092e-02, 6.916e-02, -1.039e-01, -6.471e-02, 8.988e-03, 5.310e-02, 7.353e-02, 1.128e-02, 3.089e-02, -2.249e-02, 1.239e-02, -6.665e-02, -3.720e-02, -2.291e-02, 5.894e-02)); + r += mul(s6_7, M4(1.134e-01, 1.221e-02, -6.070e-02, 2.300e-01, -8.134e-02, 3.754e-02, 9.095e-02, -3.804e-02, 7.501e-02, -1.004e-01, 1.162e-01, 5.006e-03, 4.744e-02, 1.739e-02, -1.323e-01, 8.227e-02)); + r += mul(s6_8, M4(-1.192e-01, -2.425e-02, -9.741e-03, 1.033e-02, 1.348e-02, 4.238e-03, 5.134e-02, 2.432e-02, -3.472e-02, 2.930e-02, -1.485e-02, -6.624e-03, 2.464e-02, -6.743e-03, -5.677e-02, -1.125e-02)); + r += mul(s7_0, M4(2.961e-04, 5.695e-02, 1.692e-02, 1.641e-02, 1.896e-02, 3.423e-02, 3.964e-02, -4.835e-02, -7.153e-02, -1.021e-02, -1.489e-02, -4.491e-02, 6.248e-03, 6.234e-02, 3.034e-02, -4.721e-02)); + r += mul(s7_1, M4(4.580e-02, -4.302e-03, 5.372e-02, 1.092e-01, 9.311e-02, 7.429e-02, -7.219e-02, 1.315e-02, -4.621e-02, -3.435e-02, 8.618e-02, 6.339e-04, -5.809e-02, -5.998e-02, -8.710e-02, -5.751e-02)); + r += mul(s7_2, M4(4.485e-02, 2.007e-02, 3.034e-02, 5.546e-02, -1.602e-02, -3.560e-02, -2.043e-02, 4.087e-02, 4.749e-02, -8.724e-04, 4.623e-02, 1.840e-02, -3.697e-02, 8.748e-03, -3.764e-03, -1.345e-01)); + r += mul(s7_3, M4(1.538e-01, -1.023e-01, -1.091e-01, -1.067e-01, 1.039e-01, 2.164e-03, -3.211e-02, 3.243e-02, -7.896e-02, 8.814e-02, -3.925e-02, -7.875e-02, 5.796e-03, -5.906e-02, -7.718e-02, 3.024e-02)); + r += mul(s7_4, M4(-1.636e-01, -7.883e-02, -2.044e-01, 3.189e-02, -2.025e-01, -3.092e-02, -2.128e-01, 3.520e-02, -5.502e-03, 7.618e-02, -1.111e-01, 4.137e-02, 2.036e-01, -2.299e-02, 2.865e-02, 1.354e-01)); + r += mul(s7_5, M4(1.363e-01, -4.054e-02, -2.335e-02, 2.584e-02, 3.570e-02, 8.628e-02, 1.420e-02, -1.352e-02, -3.313e-03, -4.462e-03, -1.690e-03, 3.997e-02, -1.273e-01, -3.589e-03, -4.635e-02, -2.387e-02)); + r += mul(s7_6, M4(8.699e-02, 7.315e-03, 4.443e-02, 1.327e-02, -7.019e-02, -1.051e-02, 4.505e-02, 4.059e-02, -5.563e-02, 3.547e-02, 8.318e-03, -7.002e-02, -3.911e-02, 1.473e-02, -2.082e-02, -4.584e-03)); + r += mul(s7_7, M4(2.100e-03, -4.188e-02, 1.642e-01, 2.146e-01, 5.512e-02, 1.341e-01, -6.786e-02, -2.989e-02, -6.685e-02, -7.217e-02, 1.433e-01, -1.345e-02, -5.557e-02, 2.869e-02, -8.787e-02, 5.125e-02)); + r += mul(s7_8, M4(9.447e-02, -1.057e-02, 9.580e-02, 3.739e-03, -6.323e-02, -3.503e-03, 1.983e-02, 7.549e-03, -5.925e-02, -3.357e-02, 2.204e-03, 2.899e-02, -6.129e-02, 1.970e-02, -2.830e-02, -5.696e-02)); + r += V4(2.020e-02, -4.553e-03, -2.459e-02, 1.937e-02); + return r; +} + +V4 f2(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(1.077e-01, 9.312e-02, -5.188e-02, 7.384e-02, -5.968e-02, 2.927e-03, -3.236e-02, -5.140e-02, -3.015e-02, -3.844e-02, 8.994e-02, -1.180e-01, -9.557e-02, -4.035e-02, 4.019e-02, -4.095e-02)); + r += mul(s0_1, M4(-6.296e-02, -4.241e-02, -6.281e-03, -6.678e-02, 9.068e-03, 3.762e-02, 1.032e-01, -4.027e-02, 2.218e-02, 6.294e-02, -1.689e-02, 1.324e-01, -1.670e-02, -7.119e-02, -5.797e-02, -4.215e-03)); + r += mul(s0_2, M4(-6.613e-02, -1.290e-02, 1.807e-02, 4.846e-04, 4.511e-02, 4.319e-02, -1.287e-02, 1.502e-02, -3.730e-02, -1.057e-02, 2.362e-02, -5.695e-02, -5.287e-03, 1.501e-02, -1.542e-02, -1.826e-02)); + r += mul(s0_3, M4(-3.606e-02, 1.462e-01, 2.109e-01, -2.420e-02, 1.386e-03, -5.487e-02, 5.800e-03, 4.513e-02, -1.422e-01, -8.521e-02, 2.863e-01, -2.422e-01, 2.749e-02, -1.105e-01, 1.328e-03, -2.261e-01)); + r += mul(s0_4, M4(1.142e-01, 4.361e-02, 4.532e-02, 2.146e-03, -1.481e-01, -1.284e-01, -3.127e-02, -9.069e-02, -1.411e-01, -2.611e-02, -2.912e-01, 2.501e-01, 1.544e-01, -3.091e-02, -1.803e-01, -5.694e-02)); + r += mul(s0_5, M4(-5.748e-02, -8.738e-02, -1.973e-02, 4.722e-02, -3.113e-02, -7.124e-03, 8.854e-03, -1.669e-02, 6.880e-02, 2.122e-02, -5.463e-02, 1.973e-03, -6.377e-02, -5.127e-03, -3.509e-02, 5.819e-02)); + r += mul(s0_6, M4(5.161e-02, 6.178e-02, -6.580e-03, 7.210e-02, 1.012e-01, 1.839e-02, 5.339e-02, 2.248e-02, 6.152e-02, 3.338e-02, 4.869e-03, -1.636e-01, -5.381e-02, -7.649e-02, 3.155e-02, -9.452e-02)); + r += mul(s0_7, M4(3.837e-02, -2.835e-03, 9.076e-02, -8.489e-04, 6.508e-02, 2.648e-02, -6.215e-02, 8.233e-02, 2.223e-02, -6.067e-02, 5.139e-02, -4.934e-02, -9.968e-02, 6.218e-02, 2.873e-03, -6.527e-02)); + r += mul(s0_8, M4(5.733e-02, 1.893e-02, -6.683e-02, 4.339e-02, -4.547e-02, 2.725e-02, 1.997e-02, -1.831e-02, 3.253e-02, 5.693e-02, -3.447e-02, 3.470e-02, 6.988e-02, -1.481e-01, 4.093e-02, 4.865e-02)); + r += mul(s1_0, M4(1.218e-01, 1.391e-01, -9.917e-02, 2.681e-01, -6.814e-03, -4.386e-02, -1.731e-02, -4.896e-02, -4.263e-03, 7.133e-03, -2.855e-02, 1.162e-01, -6.505e-02, -3.310e-02, 4.968e-02, -7.657e-02)); + r += mul(s1_1, M4(-1.714e-01, -3.825e-02, 1.989e-03, -8.984e-02, 4.135e-02, 3.992e-02, -8.609e-03, -6.335e-02, -3.296e-02, -3.458e-02, 4.691e-03, 1.030e-01, 2.207e-02, -1.372e-02, -2.782e-02, 7.251e-02)); + r += mul(s1_2, M4(1.158e-02, 2.207e-02, 1.008e-02, -1.122e-02, 5.151e-02, 3.024e-02, -4.144e-02, 5.029e-02, 6.255e-02, 6.074e-03, 3.316e-02, -3.334e-02, 9.460e-04, 3.999e-02, 4.258e-02, -1.319e-02)); + r += mul(s1_3, M4(-6.833e-03, 2.981e-01, 1.190e-01, 4.172e-01, -2.082e-01, -1.010e-01, 1.663e-01, 2.756e-02, 1.126e-02, 6.412e-02, 5.292e-02, 3.232e-02, 5.397e-02, -6.604e-02, -8.024e-02, -3.327e-02)); + r += mul(s1_4, M4(1.082e-01, -7.797e-02, 3.743e-01, -2.278e-02, 1.222e-01, 3.582e-02, 3.057e-01, -1.525e-01, 3.195e-02, 3.684e-03, 1.318e-01, -1.431e-02, -1.279e-01, -1.193e-01, -9.534e-02, 1.111e-02)); + r += mul(s1_5, M4(-7.195e-02, -8.329e-03, 2.136e-02, 1.546e-02, -3.515e-02, -3.558e-02, 3.955e-02, 8.360e-02, -1.101e-01, -1.174e-01, -3.039e-02, -2.660e-02, -1.078e-02, -1.269e-02, -1.314e-01, 7.183e-02)); + r += mul(s1_6, M4(5.152e-02, 5.627e-02, -4.271e-02, 1.356e-01, 1.291e-01, -1.450e-01, -1.893e-02, 1.868e-01, 6.525e-02, 5.429e-02, 1.105e-01, -9.555e-02, -7.097e-02, 1.332e-02, 3.753e-02, -4.533e-03)); + r += mul(s1_7, M4(3.159e-02, 5.370e-02, 1.118e-01, -2.614e-02, 1.104e-01, 4.714e-03, 8.088e-02, -1.254e-01, 5.789e-02, 1.972e-02, -2.895e-02, 1.946e-02, 5.596e-02, 1.046e-01, 3.249e-02, -6.347e-02)); + r += mul(s1_8, M4(4.930e-02, 2.392e-02, -3.323e-02, 3.137e-02, -1.039e-01, -1.100e-01, 1.549e-02, 1.914e-02, 5.477e-02, 1.615e-03, 6.294e-02, -3.471e-02, 6.569e-02, -4.273e-02, 1.651e-02, 9.589e-03)); + r += mul(s2_0, M4(3.221e-02, 7.105e-02, 2.089e-02, 2.255e-02, -6.648e-03, -2.093e-02, 6.522e-03, -2.318e-02, -8.746e-03, 5.476e-02, -3.258e-02, -1.102e-01, 1.749e-01, 2.147e-02, -2.678e-02, -5.268e-02)); + r += mul(s2_1, M4(-1.864e-02, -4.252e-04, -8.805e-02, -4.201e-02, -8.959e-02, -2.189e-02, 2.673e-02, 4.537e-02, 2.190e-01, 1.311e-01, 5.191e-03, 4.206e-02, -2.308e-02, -9.327e-02, -3.661e-02, -1.148e-01)); + r += mul(s2_2, M4(-2.992e-02, 3.498e-02, 5.053e-02, 1.144e-02, 3.595e-02, 1.984e-02, 1.643e-02, -2.382e-02, 3.988e-02, 4.426e-02, 1.589e-02, 3.642e-02, 6.817e-03, 9.914e-03, -7.543e-02, 4.210e-02)); + r += mul(s2_3, M4(-1.351e-01, 1.527e-01, 2.414e-03, -2.222e-01, 9.301e-03, -4.186e-04, -7.728e-03, -1.186e-01, 7.279e-04, 4.599e-02, 1.162e-02, -1.156e-01, -9.149e-03, 2.266e-02, 3.615e-02, -1.548e-01)); + r += mul(s2_4, M4(1.148e-01, 1.567e-01, -2.782e-01, 3.847e-03, -2.695e-02, -1.642e-03, -8.825e-02, -1.578e-02, 1.793e-01, 2.009e-01, -2.151e-01, -1.173e-01, -1.997e-02, -3.643e-02, 1.601e-02, 3.910e-02)); + r += mul(s2_5, M4(4.336e-02, 8.253e-02, 1.158e-02, -1.455e-02, -5.475e-02, -1.940e-02, -6.271e-02, 1.003e-02, -1.544e-02, 4.810e-03, 6.860e-02, -2.462e-02, -6.332e-02, -6.534e-02, 8.899e-02, 2.976e-02)); + r += mul(s2_6, M4(-3.050e-02, -1.263e-02, -1.012e-01, -3.166e-02, -7.449e-02, -2.503e-02, -5.525e-02, 3.306e-02, -3.886e-02, 5.543e-02, 5.382e-02, -3.963e-02, 3.195e-02, 3.792e-03, -2.265e-02, -2.995e-02)); + r += mul(s2_7, M4(-9.550e-02, 8.093e-03, -6.212e-02, 1.538e-02, -4.168e-04, 4.310e-03, -1.145e-04, 1.177e-01, -2.583e-02, 1.046e-01, -5.829e-03, 1.304e-01, 3.170e-02, -6.325e-02, 3.423e-02, 6.609e-03)); + r += mul(s2_8, M4(4.738e-02, 2.854e-02, -7.887e-02, 4.673e-02, 8.907e-03, 1.670e-02, 2.104e-02, -5.520e-02, 3.884e-02, 1.973e-02, 1.202e-01, 7.833e-02, -7.837e-02, -4.010e-02, 8.031e-02, -9.000e-02)); + r += mul(s3_0, M4(2.679e-02, 2.173e-02, -1.323e-02, -1.968e-03, 1.052e-02, 2.645e-02, -4.180e-02, 3.171e-02, -2.261e-02, -2.448e-02, -5.866e-02, -7.578e-02, 7.423e-02, 5.530e-02, -1.174e-02, 1.807e-02)); + r += mul(s3_1, M4(-5.659e-02, -4.152e-02, -6.892e-02, -7.556e-02, -1.425e-01, -7.938e-02, 3.291e-02, -3.197e-02, 6.805e-02, 8.159e-02, -9.808e-02, -1.154e-01, -5.595e-02, -8.041e-02, -1.891e-02, -1.454e-01)); + r += mul(s3_2, M4(-1.225e-03, -7.471e-03, 4.640e-03, -2.132e-02, -1.187e-01, -3.307e-02, -3.342e-02, 5.745e-02, -4.317e-03, 6.259e-02, -9.434e-03, 8.730e-02, -2.601e-02, -3.185e-02, -5.734e-02, 6.062e-02)); + r += mul(s3_3, M4(8.051e-03, 5.024e-02, -7.025e-02, 8.818e-02, -8.869e-02, -1.515e-02, 5.252e-03, -2.860e-02, -6.840e-02, -2.742e-03, 8.916e-02, 2.543e-02, 1.025e-01, -2.034e-02, -5.761e-03, 3.742e-01)); + r += mul(s3_4, M4(-4.240e-02, 7.146e-02, -4.326e-02, 8.698e-02, -1.976e-02, -1.082e-01, -2.198e-02, -1.269e-01, 6.265e-03, 7.006e-02, -1.549e-02, -1.263e-01, -1.393e-01, -1.977e-01, 4.258e-01, 8.264e-02)); + r += mul(s3_5, M4(-4.435e-02, 2.545e-02, 1.863e-02, 2.360e-02, -3.587e-02, -8.683e-02, 8.091e-02, 1.216e-02, -1.017e-02, 2.783e-02, -2.242e-02, -4.877e-02, 3.016e-02, -4.084e-02, 2.683e-02, 3.136e-02)); + r += mul(s3_6, M4(4.558e-02, -3.461e-02, 1.245e-02, 6.048e-02, -3.341e-03, -4.436e-02, 1.241e-02, 5.533e-02, 8.177e-03, -4.103e-03, 3.365e-02, 7.956e-02, -7.129e-02, 5.349e-02, -4.337e-02, -1.018e-01)); + r += mul(s3_7, M4(-3.148e-03, -2.321e-02, 3.585e-02, -1.823e-02, -1.738e-02, 3.308e-02, 9.017e-02, 3.342e-04, -5.252e-03, -2.761e-02, 1.347e-01, 2.909e-02, -3.061e-03, 2.617e-02, -1.475e-02, -3.956e-02)); + r += mul(s3_8, M4(9.334e-03, -1.697e-02, -5.276e-02, 2.803e-02, 3.719e-03, -2.596e-03, -3.970e-02, 2.540e-02, -1.326e-01, -3.069e-02, 4.041e-02, -2.985e-02, -5.079e-02, 6.418e-02, -2.325e-02, -7.249e-02)); + r += mul(s4_0, M4(3.710e-02, 3.287e-02, 4.836e-02, -9.585e-02, 1.885e-03, 5.685e-03, -5.507e-03, 4.869e-02, 8.140e-02, 2.910e-02, -7.700e-02, 8.265e-02, -8.802e-03, 7.170e-02, -8.877e-04, -2.661e-02)); + r += mul(s4_1, M4(-1.652e-02, 7.513e-04, 3.076e-02, 5.516e-02, -2.761e-02, 6.551e-03, 1.027e-01, -4.674e-02, -5.690e-03, 5.166e-03, -3.712e-02, -1.844e-02, -3.894e-02, -3.135e-02, -6.120e-02, 1.714e-02)); + r += mul(s4_2, M4(6.301e-02, -5.956e-03, -3.980e-03, -2.500e-02, 4.266e-02, 1.491e-01, -6.553e-02, 1.103e-01, -3.315e-02, -1.231e-02, -3.530e-02, -6.407e-03, 3.088e-02, 4.581e-02, 6.168e-02, 5.876e-02)); + r += mul(s4_3, M4(-1.942e-02, -8.815e-03, -6.423e-02, 1.349e-02, -9.786e-02, -5.757e-02, -2.002e-02, 1.992e-01, 3.463e-02, 5.042e-02, 2.547e-03, -2.162e-02, -7.019e-02, -1.184e-01, 6.112e-02, -1.267e-01)); + r += mul(s4_4, M4(2.089e-03, 1.035e-02, -1.179e-01, 6.884e-02, 1.921e-01, -1.789e-02, 1.577e-01, -2.155e-01, 3.626e-03, 1.062e-02, 1.924e-02, 9.510e-02, -9.622e-02, -1.313e-01, -3.070e-02, 1.933e-01)); + r += mul(s4_5, M4(7.287e-02, 1.362e-01, 3.051e-02, -7.536e-02, -8.768e-02, 6.265e-02, -8.248e-02, -5.200e-02, 2.649e-02, -7.968e-02, 1.080e-02, -6.782e-03, -6.966e-02, -3.352e-02, 2.188e-02, -3.046e-03)); + r += mul(s4_6, M4(-4.444e-03, -1.998e-02, -3.328e-02, 4.993e-02, 1.821e-02, -1.305e-02, -1.285e-02, 1.196e-01, -1.910e-02, 1.556e-02, -1.920e-02, 4.315e-03, 5.933e-02, 1.134e-03, 3.927e-03, -1.362e-02)); + r += mul(s4_7, M4(-3.740e-02, -4.676e-02, 6.161e-02, 7.081e-03, -1.382e-01, 1.377e-01, -5.139e-02, -1.040e-01, -7.295e-04, -2.772e-02, 2.037e-02, 3.765e-02, 2.740e-02, -3.209e-02, -1.239e-02, -3.002e-03)); + r += mul(s4_8, M4(-8.065e-02, 8.158e-03, -6.351e-02, 3.085e-02, 8.517e-02, -4.434e-02, -9.817e-02, -1.627e-03, 1.648e-02, 8.428e-03, 1.192e-02, -3.798e-02, 5.931e-02, -2.690e-02, 5.350e-02, 2.766e-02)); + r += mul(s5_0, M4(-1.622e-02, -4.403e-02, 1.023e-01, -1.139e-01, 5.014e-02, 2.008e-02, 2.745e-02, 2.676e-02, 7.143e-02, 2.604e-03, -1.732e-01, 2.093e-02, 7.864e-02, 5.946e-02, -5.021e-02, -2.883e-02)); + r += mul(s5_1, M4(3.377e-02, 3.455e-02, 1.131e-01, -1.224e-01, -1.474e-02, -1.274e-02, -7.299e-02, 2.685e-02, -1.012e-02, 8.374e-02, 1.117e-01, 1.403e-01, -2.833e-02, -1.101e-02, -1.028e-01, 1.124e-01)); + r += mul(s5_2, M4(-1.305e-01, -9.027e-02, -1.216e-01, 2.585e-02, 5.500e-02, 4.169e-02, 3.386e-02, -4.850e-03, 1.853e-02, -9.479e-03, 1.559e-01, -5.464e-02, -4.298e-02, -1.684e-02, 4.651e-02, 2.252e-02)); + r += mul(s5_3, M4(-2.488e-02, 1.727e-02, 3.289e-02, -1.119e-01, -7.352e-02, 6.214e-03, 5.950e-02, -5.322e-02, -2.526e-03, -2.031e-02, -1.997e-01, 2.193e-01, 1.698e-01, 9.388e-02, -1.760e-02, -2.799e-01)); + r += mul(s5_4, M4(-1.644e-01, -6.465e-02, -1.964e-01, -2.100e-01, -8.515e-03, 8.435e-04, 2.077e-02, 6.934e-02, -1.016e-02, 1.320e-01, -4.857e-01, -1.243e-01, 2.594e-02, 5.574e-02, -2.013e-01, -6.372e-02)); + r += mul(s5_5, M4(6.039e-02, 1.160e-02, -8.932e-02, -9.111e-03, -3.383e-02, 1.090e-02, 7.543e-02, -7.096e-02, -1.671e-01, -2.288e-01, -1.212e-01, 4.297e-02, -7.059e-02, 4.491e-02, 3.937e-02, 5.454e-02)); + r += mul(s5_6, M4(2.136e-02, -8.988e-03, -3.129e-02, 1.085e-02, 4.960e-02, -2.167e-03, 2.436e-03, -5.589e-02, -3.687e-02, 2.597e-02, 5.500e-02, 7.337e-02, -2.889e-02, 1.762e-01, 9.740e-02, -2.120e-01)); + r += mul(s5_7, M4(-5.648e-02, -9.203e-02, 1.907e-02, -7.378e-02, -1.303e-02, 3.863e-03, -1.161e-01, 2.245e-02, 6.718e-02, 4.304e-02, 2.344e-01, 2.262e-02, 8.896e-02, 6.554e-02, -2.300e-01, 7.788e-02)); + r += mul(s5_8, M4(-3.322e-02, 3.952e-02, -6.377e-02, 1.787e-02, 1.770e-02, -1.739e-03, 5.596e-03, 1.804e-03, 1.023e-01, 2.178e-02, -4.965e-02, -1.213e-02, 5.301e-02, -1.652e-02, 4.560e-02, 3.575e-02)); + r += mul(s6_0, M4(5.305e-02, 6.024e-03, -6.012e-03, -2.101e-02, 9.004e-04, 1.515e-02, -3.313e-02, 6.079e-02, -2.658e-02, -4.520e-02, -7.564e-03, -1.143e-01, 9.037e-02, 8.192e-03, -3.790e-02, 1.233e-01)); + r += mul(s6_1, M4(-4.037e-02, 2.179e-02, -7.962e-02, 9.745e-02, -5.554e-02, -3.406e-02, -3.068e-03, -5.949e-02, 6.269e-02, 5.716e-02, 5.162e-02, 3.283e-02, 3.814e-02, -1.724e-02, -1.610e-02, -3.306e-02)); + r += mul(s6_2, M4(2.850e-02, 1.388e-02, -1.091e-02, -1.767e-03, 4.596e-04, 7.681e-04, -4.901e-02, 3.987e-02, -6.414e-03, -2.162e-02, 2.892e-02, -6.097e-03, -2.390e-02, -3.975e-02, -3.758e-02, 3.565e-02)); + r += mul(s6_3, M4(-1.030e-01, 5.867e-02, 6.311e-02, 4.378e-02, -7.515e-02, 7.870e-04, 2.617e-02, 1.581e-02, 2.060e-02, -2.820e-02, -6.539e-03, -2.060e-01, 1.867e-02, 7.975e-02, 7.304e-02, -1.851e-01)); + r += mul(s6_4, M4(1.318e-01, 6.028e-02, 8.039e-02, -4.800e-02, -1.777e-01, -2.444e-01, 7.054e-02, -2.082e-02, 1.185e-01, 1.637e-01, -1.121e-01, -2.441e-02, 2.106e-01, 4.146e-02, -6.769e-02, 6.979e-02)); + r += mul(s6_5, M4(1.051e-02, 2.402e-02, 4.806e-02, -3.359e-02, -6.737e-02, -3.636e-02, 4.301e-02, 1.530e-03, 1.313e-01, 1.824e-02, -8.806e-02, -7.708e-02, 9.100e-02, 3.534e-02, 2.935e-02, 3.096e-02)); + r += mul(s6_6, M4(3.856e-02, -3.014e-03, 3.394e-02, 1.071e-01, -4.078e-02, -6.640e-02, -2.350e-02, 1.959e-02, 9.128e-03, -4.047e-02, -3.454e-02, -8.068e-02, -3.010e-02, 6.882e-02, 5.409e-02, -7.349e-02)); + r += mul(s6_7, M4(6.851e-02, 8.326e-02, 1.533e-01, -6.287e-02, 1.728e-02, -1.714e-01, -5.740e-02, 4.809e-03, 2.828e-02, 3.169e-02, -6.673e-02, 3.754e-02, -2.514e-02, 3.858e-02, 6.254e-02, -7.638e-02)); + r += mul(s6_8, M4(-5.590e-03, 5.953e-02, 7.725e-02, -2.560e-03, -1.225e-01, -2.320e-02, 4.039e-02, -3.092e-02, 3.539e-02, 9.669e-03, -8.232e-02, -3.003e-02, 1.670e-02, -2.627e-02, 1.353e-02, -1.655e-02)); + r += mul(s7_0, M4(-6.490e-02, 5.115e-03, -1.528e-02, -1.145e-01, 7.564e-02, 7.405e-02, -5.443e-02, 6.745e-03, -6.547e-02, -4.020e-02, -4.225e-02, 3.839e-02, 1.049e-01, 4.631e-02, -5.378e-02, 1.743e-01)); + r += mul(s7_1, M4(3.424e-04, 1.829e-02, 9.501e-03, 5.903e-02, 1.090e-01, 1.012e-01, -6.213e-03, -4.232e-02, -3.044e-02, -3.550e-03, 6.156e-02, -1.484e-03, 6.939e-03, -8.635e-03, 2.082e-03, -3.243e-02)); + r += mul(s7_2, M4(7.190e-02, 9.364e-02, 2.862e-02, -8.397e-02, 6.550e-02, 6.722e-02, -6.371e-02, -4.278e-03, 4.129e-02, 6.908e-03, -5.093e-02, 8.225e-04, -3.228e-02, 1.587e-02, 1.322e-02, 9.009e-02)); + r += mul(s7_3, M4(-1.729e-02, 7.476e-02, 6.151e-02, 3.103e-02, 8.877e-02, 6.905e-02, -2.906e-02, -9.292e-02, -1.081e-01, -6.498e-02, 8.411e-02, -3.789e-02, -2.383e-02, 5.354e-02, -1.833e-03, -4.389e-03)); + r += mul(s7_4, M4(8.625e-02, 5.764e-02, -2.618e-01, -3.980e-02, -6.684e-02, -1.350e-02, -2.388e-01, 1.900e-01, 6.187e-02, 2.144e-02, -3.389e-03, -9.097e-02, 1.580e-01, 1.538e-01, 2.038e-02, -6.656e-02)); + r += mul(s7_5, M4(-1.117e-01, 1.565e-02, -5.238e-02, -8.835e-02, 6.472e-03, 8.414e-02, 3.239e-02, -4.135e-02, 1.121e-02, -7.688e-03, -1.144e-01, 1.978e-02, 5.818e-02, 6.246e-02, -3.547e-02, 4.597e-02)); + r += mul(s7_6, M4(2.220e-02, 7.870e-03, 2.765e-02, 2.444e-03, -7.059e-02, 6.972e-02, -5.966e-02, 1.448e-01, 5.399e-02, -1.218e-01, -5.895e-02, 3.625e-02, -4.502e-02, 6.365e-02, 2.878e-02, 4.715e-02)); + r += mul(s7_7, M4(-7.888e-02, 1.038e-01, -3.999e-02, 2.142e-01, 7.834e-02, 1.839e-02, 9.709e-02, 2.613e-02, -3.665e-02, -1.361e-03, 3.381e-02, -3.310e-02, -3.747e-02, 6.834e-02, 3.315e-02, 8.918e-03)); + r += mul(s7_8, M4(-3.474e-02, 6.471e-02, 8.885e-02, -4.717e-02, 3.719e-02, 9.219e-02, -4.642e-02, -9.449e-03, -2.453e-02, -2.280e-02, -6.700e-02, -5.099e-03, -2.730e-02, 1.369e-02, 4.512e-02, 2.629e-02)); + r += V4(2.436e-02, 1.957e-02, -1.232e-02, -3.296e-02); + return r; +} + +V4 f3(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(1.208e-01, -1.226e-01, 4.139e-02, 1.672e-02, 3.747e-02, 1.641e-02, -1.400e-02, 2.603e-03, -9.280e-02, 1.165e-01, 6.712e-02, 5.747e-02, 5.795e-03, -1.884e-02, -5.806e-02, -2.103e-02)); + r += mul(s0_1, M4(-4.448e-02, -1.759e-01, 4.656e-02, -5.958e-02, -7.425e-02, 4.919e-02, -8.946e-02, 3.773e-02, 1.568e-01, 1.065e-01, -4.453e-02, -7.229e-02, 3.335e-03, -1.265e-02, -3.742e-02, -5.298e-02)); + r += mul(s0_2, M4(9.436e-03, -1.831e-02, 4.140e-03, 6.075e-02, 3.335e-02, 3.694e-02, -2.059e-02, 3.985e-02, -3.482e-02, -2.645e-02, -6.472e-02, -5.205e-03, -1.363e-02, -1.129e-01, 6.678e-03, 1.812e-02)); + r += mul(s0_3, M4(-1.682e-02, 3.792e-02, -9.146e-02, -8.048e-03, 1.158e-01, 6.700e-04, 2.752e-02, -5.915e-03, -6.619e-02, -2.281e-01, -1.466e-01, 1.194e-01, -7.796e-02, 2.379e-01, 4.111e-03, -6.715e-02)); + r += mul(s0_4, M4(-2.327e-01, 8.179e-02, -2.227e-01, -1.154e-01, -3.701e-02, 2.974e-02, 8.689e-02, -9.778e-02, 7.231e-02, -8.271e-02, -7.702e-02, -6.086e-02, -7.075e-02, 3.773e-02, 1.167e-01, 1.593e-02)); + r += mul(s0_5, M4(2.426e-02, 4.114e-02, -7.095e-02, 1.081e-01, 2.005e-03, 2.834e-02, -4.480e-02, -1.039e-03, -3.527e-02, 9.050e-02, 8.530e-02, -2.006e-02, 2.647e-02, 4.315e-02, 4.213e-02, 6.488e-02)); + r += mul(s0_6, M4(-3.340e-02, 4.409e-02, 2.409e-04, 3.593e-03, -1.914e-03, 5.568e-02, -1.601e-02, 6.657e-02, -3.951e-02, 1.302e-02, 8.837e-02, 6.599e-02, 5.774e-02, -9.646e-02, -4.925e-02, -7.544e-02)); + r += mul(s0_7, M4(-4.754e-02, 3.320e-02, -6.046e-02, -5.000e-02, 1.162e-01, -6.466e-03, 1.049e-01, -4.923e-02, 4.806e-02, -2.365e-03, 4.935e-02, -1.513e-02, 6.068e-02, -4.087e-02, -2.004e-02, 1.045e-01)); + r += mul(s0_8, M4(4.572e-02, 2.684e-02, 4.193e-02, -6.155e-03, -1.725e-02, 1.555e-02, 1.902e-02, -7.173e-02, 3.296e-02, -2.906e-02, -3.089e-02, 1.108e-01, -2.672e-02, -1.714e-03, -2.541e-02, 1.468e-02)); + r += mul(s1_0, M4(1.692e-01, -3.109e-01, 7.963e-02, 3.339e-02, 4.335e-02, -8.582e-03, 9.552e-03, -2.264e-02, -7.118e-02, 2.155e-02, 5.057e-02, 3.908e-03, -2.734e-02, 7.640e-03, -4.017e-02, 1.679e-02)); + r += mul(s1_1, M4(-4.408e-02, -2.848e-01, 9.724e-02, -6.205e-02, -6.897e-03, -1.005e-01, 7.328e-02, -2.755e-02, -3.623e-02, 8.837e-03, -1.560e-02, -7.135e-02, 1.371e-02, 1.046e-01, 1.830e-02, -2.500e-02)); + r += mul(s1_2, M4(-4.164e-02, -5.760e-02, -4.867e-03, -4.731e-02, -1.110e-02, -3.070e-02, 2.912e-02, 3.289e-02, 3.885e-02, -5.508e-04, -1.053e-02, 1.754e-02, 5.379e-03, -5.888e-02, 3.521e-02, -2.847e-02)); + r += mul(s1_3, M4(1.379e-02, 1.928e-01, -9.303e-03, 5.900e-02, -1.323e-01, 8.078e-02, -5.612e-02, -5.716e-02, 3.289e-02, -9.726e-02, -8.349e-02, 5.944e-02, -6.001e-02, 6.552e-03, 2.450e-03, -3.166e-02)); + r += mul(s1_4, M4(-1.411e-01, -1.940e-02, -3.377e-01, -9.430e-02, -2.508e-02, 1.420e-01, -2.662e-02, 1.240e-01, -9.893e-02, 1.008e-01, -1.202e-01, -4.663e-02, -8.621e-02, -6.152e-02, -1.013e-01, -4.004e-03)); + r += mul(s1_5, M4(1.475e-02, 5.437e-02, -1.313e-02, 8.481e-02, 6.013e-02, 1.428e-02, 2.697e-03, 7.665e-02, 2.210e-02, -4.551e-02, -6.520e-02, 3.908e-03, 2.881e-02, 2.892e-02, 9.411e-02, 1.113e-02)); + r += mul(s1_6, M4(1.295e-02, 2.119e-02, 3.595e-02, -1.883e-02, 5.922e-02, 1.354e-01, 1.468e-02, 1.992e-02, 8.332e-02, 2.735e-02, -5.336e-02, 7.069e-02, -2.745e-02, -4.790e-02, -7.620e-02, 2.050e-02)); + r += mul(s1_7, M4(-1.151e-01, 1.238e-02, -3.719e-03, -8.327e-03, -1.265e-01, 4.812e-02, 9.510e-03, 2.710e-02, 1.868e-02, -3.206e-02, -1.689e-02, 8.033e-02, 4.113e-02, 8.544e-02, -2.066e-03, 2.793e-02)); + r += mul(s1_8, M4(-2.543e-02, 2.565e-02, 5.130e-02, 3.102e-03, 5.037e-02, 4.359e-02, -5.993e-02, 1.153e-01, 4.809e-03, 4.918e-02, 3.962e-02, -4.677e-03, 1.491e-02, -5.397e-02, -2.091e-02, 1.154e-02)); + r += mul(s2_0, M4(-4.696e-02, -6.299e-02, -2.885e-02, -3.337e-02, 5.491e-02, -7.292e-02, -2.948e-02, -5.428e-02, -4.811e-02, 1.687e-01, 9.580e-03, -3.189e-02, 1.525e-01, -1.680e-03, 2.752e-02, -5.007e-04)); + r += mul(s2_1, M4(6.137e-02, 8.930e-02, 1.935e-02, -9.878e-02, 6.470e-03, -1.180e-03, 4.439e-02, -4.159e-02, 7.039e-02, 6.277e-02, -4.220e-02, -3.506e-02, -7.495e-02, -4.569e-02, 9.915e-02, -4.819e-02)); + r += mul(s2_2, M4(-6.690e-03, -4.709e-02, -8.617e-03, 1.128e-02, -1.234e-02, -5.296e-02, -1.959e-02, 8.562e-03, 2.983e-02, 6.469e-02, -8.118e-03, 9.698e-03, 1.594e-02, 1.233e-01, 7.226e-02, 4.709e-02)); + r += mul(s2_3, M4(1.362e-01, 9.432e-02, 6.378e-02, -2.612e-02, 4.053e-02, -3.164e-02, 2.733e-02, -2.000e-02, 1.917e-01, 3.272e-02, -4.118e-02, -2.870e-02, 1.899e-01, 1.436e-02, 6.496e-02, -2.292e-02)); + r += mul(s2_4, M4(-1.569e-02, 7.891e-03, 1.097e-01, -1.259e-01, 5.660e-03, -2.804e-02, -1.121e-01, 4.181e-02, 1.050e-01, -3.083e-02, -4.846e-02, -8.452e-02, 1.462e-02, -8.250e-02, -1.173e-01, -9.593e-03)); + r += mul(s2_5, M4(-1.959e-02, 4.876e-03, 6.666e-02, 2.711e-02, 5.521e-02, 2.238e-02, 2.469e-02, 1.929e-01, -3.808e-02, -1.214e-01, -4.719e-02, 1.663e-01, -5.399e-02, -1.247e-01, -1.763e-01, -4.044e-02)); + r += mul(s2_6, M4(1.661e-01, -7.206e-02, 4.163e-02, -7.267e-02, 3.635e-02, -3.221e-02, 3.350e-03, -6.100e-03, 2.232e-02, -4.944e-03, -3.431e-02, -1.230e-01, -5.037e-02, 7.514e-02, 2.936e-02, 3.774e-03)); + r += mul(s2_7, M4(-2.536e-03, -2.618e-02, -1.153e-02, -5.133e-02, -5.048e-02, -7.482e-03, -9.806e-03, -2.532e-02, -1.631e-02, 1.052e-03, 6.459e-02, 1.764e-02, -3.458e-03, 1.575e-02, 2.013e-02, 1.126e-01)); + r += mul(s2_8, M4(-1.950e-03, 1.616e-02, 4.400e-02, -2.765e-03, -2.407e-02, 2.714e-02, 6.637e-02, 5.078e-02, -2.704e-02, 6.811e-02, -6.171e-02, -6.063e-02, -3.555e-03, -7.526e-03, -1.073e-02, -6.472e-02)); + r += mul(s3_0, M4(-1.586e-02, -8.472e-02, 1.757e-02, -7.384e-04, 7.426e-03, -6.145e-02, 1.518e-02, -5.079e-02, 3.692e-02, -2.280e-02, 1.228e-02, 2.641e-02, -2.579e-02, -2.550e-02, -9.544e-03, 2.705e-03)); + r += mul(s3_1, M4(-3.033e-02, 1.983e-02, -6.241e-03, -6.516e-02, -4.897e-02, -1.499e-01, -2.616e-02, 5.815e-02, 7.285e-02, 1.058e-01, 8.509e-02, 5.656e-02, -7.548e-02, -1.785e-01, 3.110e-02, -1.290e-02)); + r += mul(s3_2, M4(-2.506e-03, -8.837e-02, -4.282e-02, -2.442e-02, -1.142e-02, -1.472e-01, 8.187e-02, -6.503e-03, 4.318e-03, 1.718e-02, 3.119e-02, 4.592e-02, 4.852e-02, 6.621e-02, 6.957e-02, 8.130e-02)); + r += mul(s3_3, M4(7.670e-03, 4.436e-02, 3.912e-02, -2.809e-02, 3.055e-02, -1.178e-01, -4.016e-02, -1.266e-02, 2.756e-02, -1.929e-02, -2.997e-02, -3.582e-02, -9.364e-02, -8.080e-02, 1.828e-02, 2.897e-02)); + r += mul(s3_4, M4(-8.633e-02, -6.935e-02, -7.481e-03, -1.387e-01, -4.836e-02, -1.039e-01, -5.183e-02, -1.802e-02, 4.349e-02, -1.398e-01, -1.713e-01, -7.101e-02, -4.267e-02, -3.547e-02, -2.141e-01, -3.583e-01)); + r += mul(s3_5, M4(-6.121e-03, 2.361e-02, -1.575e-02, 7.977e-02, 4.023e-02, 6.795e-02, -1.890e-02, 6.154e-02, 3.224e-03, -1.176e-02, 4.541e-02, 7.858e-02, -5.268e-02, -3.705e-02, -1.409e-01, 9.165e-02)); + r += mul(s3_6, M4(-2.116e-02, 4.334e-02, -2.392e-03, -3.574e-02, -6.518e-03, -3.482e-02, 6.002e-03, -2.301e-02, -7.438e-02, -2.872e-02, -6.940e-02, -2.751e-02, 1.971e-02, -1.097e-02, 6.442e-02, -5.565e-02)); + r += mul(s3_7, M4(-2.776e-02, -1.469e-03, -5.992e-02, -8.719e-02, -2.990e-02, 3.825e-02, 3.316e-03, -1.588e-02, -2.449e-04, 2.527e-02, -2.485e-02, -1.512e-01, 5.911e-02, 3.865e-02, 9.859e-03, 1.625e-01)); + r += mul(s3_8, M4(1.487e-02, -5.139e-03, 1.519e-02, 9.446e-03, -1.208e-02, -3.288e-02, 1.786e-03, 1.715e-02, 3.260e-02, -1.019e-01, -1.111e-01, -6.100e-02, -4.261e-02, -2.880e-02, 1.342e-02, -6.207e-02)); + r += mul(s4_0, M4(7.473e-02, -9.843e-02, 4.634e-02, 1.222e-02, -9.640e-02, 8.247e-02, -3.801e-02, -2.276e-02, 1.277e-02, 4.691e-03, 2.958e-02, -2.230e-02, 1.357e-02, 1.769e-02, -4.195e-02, -6.130e-02)); + r += mul(s4_1, M4(4.292e-02, 5.470e-02, 3.183e-03, 9.491e-02, -5.083e-02, -3.304e-02, -9.519e-02, 5.875e-02, -4.293e-03, -5.284e-02, 2.780e-02, 3.798e-02, 1.284e-02, -2.329e-03, 1.198e-02, -5.990e-02)); + r += mul(s4_2, M4(-6.650e-02, 5.448e-02, -4.260e-02, -2.709e-02, 8.678e-02, 3.785e-02, 7.341e-02, -4.835e-02, -1.063e-02, -7.336e-02, 2.946e-03, -6.587e-02, -3.151e-02, 3.142e-02, -3.179e-02, 3.592e-02)); + r += mul(s4_3, M4(1.646e-02, 1.071e-01, -8.085e-02, 9.750e-03, 2.637e-02, -5.760e-02, -2.088e-02, -1.460e-01, 7.848e-03, -5.850e-02, -1.927e-03, -1.073e-02, -7.960e-02, -1.548e-01, -2.802e-02, -8.254e-03)); + r += mul(s4_4, M4(1.430e-01, -1.003e-01, -1.136e-01, 1.973e-01, -2.317e-01, 9.932e-02, 6.234e-02, -1.388e-02, 6.027e-02, 7.720e-03, 2.609e-02, -2.970e-02, -5.399e-03, -3.966e-02, -8.715e-02, 8.388e-02)); + r += mul(s4_5, M4(-5.722e-02, 2.848e-02, 6.717e-02, -1.891e-01, 1.238e-01, 1.638e-02, -9.690e-02, 2.956e-02, 2.124e-02, -4.084e-02, 8.300e-03, -6.430e-02, -5.404e-02, -3.029e-03, -4.792e-02, 1.314e-01)); + r += mul(s4_6, M4(-5.015e-02, -9.406e-02, 2.852e-02, -5.992e-03, 8.162e-02, -4.082e-02, -1.592e-03, 4.615e-02, -7.159e-02, 2.490e-02, 1.560e-02, -4.330e-02, -4.604e-02, 6.942e-02, -1.232e-02, 1.700e-03)); + r += mul(s4_7, M4(6.375e-02, 6.614e-02, -1.595e-02, 5.002e-02, -5.885e-02, -6.411e-02, 7.694e-02, -2.888e-03, -4.576e-03, -6.373e-03, -5.908e-02, -6.341e-03, 7.994e-03, -2.970e-02, -2.836e-03, 1.464e-01)); + r += mul(s4_8, M4(-6.851e-02, -9.533e-02, 1.039e-02, -7.268e-02, 1.300e-01, -2.387e-02, -4.770e-02, 1.225e-02, 7.557e-04, 1.826e-02, 2.401e-02, 2.455e-03, 9.505e-03, 1.583e-02, -7.808e-03, -4.432e-02)); + r += mul(s5_0, M4(1.032e-02, -1.248e-01, -4.259e-02, -2.107e-02, -2.476e-02, -2.230e-02, 3.155e-03, -6.801e-03, -6.227e-02, 1.033e-01, 1.546e-02, -2.175e-03, -1.698e-02, 4.505e-02, 1.032e-01, -1.746e-02)); + r += mul(s5_1, M4(7.643e-02, 4.087e-02, -5.026e-02, 9.843e-02, 5.734e-02, -1.803e-02, -3.746e-02, -4.964e-02, 1.173e-01, 1.584e-02, -1.999e-01, -7.213e-02, 3.227e-03, -5.543e-02, -8.192e-02, -2.449e-02)); + r += mul(s5_2, M4(1.835e-02, 4.458e-03, 4.713e-02, 1.193e-02, -7.368e-03, -2.718e-02, -7.838e-02, 1.944e-02, -1.046e-02, 3.976e-02, -1.163e-01, -8.234e-02, -7.764e-02, -5.386e-03, -3.642e-02, -4.625e-03)); + r += mul(s5_3, M4(-4.249e-02, -4.110e-02, -9.450e-02, -3.841e-02, 4.038e-02, -5.472e-02, -4.634e-02, 5.570e-02, -2.153e-01, 1.431e-01, 1.478e-01, -1.139e-01, 6.344e-02, -6.702e-02, -6.537e-02, 4.383e-02)); + r += mul(s5_4, M4(2.586e-01, -1.978e-01, 2.032e-02, 4.913e-02, -8.419e-02, 4.377e-02, 3.250e-02, -5.745e-02, -1.402e-01, 5.409e-02, 2.995e-02, 1.815e-02, 5.592e-03, -2.316e-02, 1.624e-01, 2.534e-01)); + r += mul(s5_5, M4(-3.445e-02, -4.932e-02, -1.166e-02, 7.935e-02, -2.074e-02, 1.331e-02, -6.949e-02, -9.694e-02, 7.806e-02, -4.970e-02, 8.471e-02, -3.458e-03, -5.019e-02, 4.166e-03, -9.217e-02, -5.729e-02)); + r += mul(s5_6, M4(3.876e-02, 5.201e-04, 7.537e-02, -6.016e-02, 3.884e-02, 2.412e-02, 3.531e-02, -2.031e-02, -1.272e-01, -5.110e-02, -1.301e-01, -6.391e-03, -8.345e-03, 1.014e-01, 7.550e-02, -4.753e-03)); + r += mul(s5_7, M4(9.155e-02, 8.092e-02, -4.110e-02, 2.557e-02, 6.704e-02, -4.796e-02, 9.720e-03, 6.098e-02, -1.181e-01, -1.338e-02, 1.684e-02, -3.873e-02, -3.165e-02, 3.809e-02, -8.942e-02, 1.094e-01)); + r += mul(s5_8, M4(-1.930e-02, -1.798e-02, 5.993e-02, -3.256e-02, -2.257e-02, 5.359e-03, 7.253e-04, -4.748e-02, 9.689e-02, 2.043e-02, 1.876e-02, -7.769e-02, -1.006e-02, -1.476e-02, 1.630e-02, -3.216e-03)); + r += mul(s6_0, M4(-1.942e-02, -1.636e-02, -2.003e-03, -9.176e-03, 4.595e-02, -3.816e-02, -6.196e-03, 4.540e-02, 4.486e-02, -5.883e-02, 4.952e-02, -4.961e-02, -2.278e-02, 8.348e-02, 4.060e-02, 3.106e-02)); + r += mul(s6_1, M4(5.459e-02, -7.661e-03, 3.247e-02, -2.312e-02, 1.555e-03, 2.422e-03, 2.480e-02, 8.737e-03, 8.432e-03, 3.619e-02, 4.601e-02, 7.276e-02, 4.691e-02, -2.799e-02, -3.063e-02, -5.632e-02)); + r += mul(s6_2, M4(1.771e-02, -4.439e-02, 8.003e-03, 4.068e-02, 2.212e-02, 2.882e-02, 3.817e-02, 1.550e-02, 4.477e-02, 5.303e-03, 4.320e-02, 8.337e-02, -2.148e-02, -1.042e-02, -4.141e-02, -7.424e-03)); + r += mul(s6_3, M4(-1.046e-02, 1.348e-01, -7.347e-02, 3.864e-04, -2.987e-02, 1.721e-02, -1.031e-02, 1.365e-02, 1.127e-01, -1.271e-01, -2.893e-02, -2.252e-02, 7.782e-02, 6.553e-02, 1.611e-02, 7.165e-02)); + r += mul(s6_4, M4(-1.647e-01, 8.367e-03, -1.954e-01, 3.519e-02, -6.066e-02, -1.751e-01, 1.987e-02, 4.552e-02, -3.052e-02, 1.324e-01, 7.788e-02, 1.411e-01, 5.785e-02, 8.841e-03, 3.008e-02, -1.193e-02)); + r += mul(s6_5, M4(4.575e-02, 2.933e-02, -3.609e-02, -1.482e-02, -4.333e-02, -2.008e-02, -3.871e-02, -5.532e-02, 9.783e-02, 6.445e-02, 1.499e-01, 1.683e-01, -2.356e-02, 6.141e-02, 2.904e-03, 2.112e-02)); + r += mul(s6_6, M4(-3.586e-02, 7.513e-03, 2.905e-02, -2.824e-02, 2.945e-02, -4.356e-02, 8.347e-04, 1.698e-03, 8.889e-02, -3.999e-02, -4.600e-02, -8.680e-03, -9.044e-03, -5.725e-03, 2.258e-03, 3.439e-02)); + r += mul(s6_7, M4(-5.036e-02, 1.410e-01, 2.360e-03, -7.009e-02, 4.161e-02, -9.975e-02, -1.061e-01, -1.230e-02, -4.415e-02, -6.260e-02, 4.748e-02, 7.399e-02, 7.400e-02, 5.209e-02, 1.495e-02, 1.961e-02)); + r += mul(s6_8, M4(3.887e-02, 2.861e-02, -5.926e-02, 3.014e-02, -4.256e-02, -3.001e-02, -5.039e-03, 1.458e-04, 6.518e-02, -2.086e-02, 5.172e-02, 3.376e-02, -2.826e-02, -1.956e-02, -6.630e-02, 2.044e-02)); + r += mul(s7_0, M4(2.581e-02, -8.798e-02, -3.776e-02, 5.633e-02, -4.144e-02, 1.434e-01, 5.310e-02, 4.405e-02, 8.046e-04, -7.999e-02, 3.022e-02, -4.280e-02, -5.826e-02, 9.874e-02, 3.675e-02, 1.498e-02)); + r += mul(s7_1, M4(4.093e-02, 1.469e-01, 3.709e-02, -2.254e-02, 5.227e-02, 1.961e-02, 2.499e-02, 4.711e-02, -4.289e-02, -3.350e-02, -1.520e-02, -1.267e-02, 1.336e-02, -1.772e-01, -7.237e-03, -6.089e-02)); + r += mul(s7_2, M4(-3.291e-03, 4.629e-03, -2.715e-02, -4.765e-03, 4.204e-03, -7.442e-03, 1.517e-02, -3.461e-03, 6.636e-02, 6.446e-02, 5.237e-02, -1.822e-02, 1.204e-02, 9.596e-03, 2.026e-02, -4.059e-02)); + r += mul(s7_3, M4(1.446e-01, 1.120e-01, 1.445e-02, 4.715e-02, -9.855e-02, 1.332e-01, 7.686e-02, 3.075e-02, 1.389e-01, -2.450e-02, -1.558e-01, 2.449e-02, -1.939e-02, -2.909e-02, 2.642e-02, 1.386e-02)); + r += mul(s7_4, M4(-3.889e-02, 1.283e-01, 1.610e-01, -1.688e-01, 3.061e-02, -1.769e-01, 2.392e-01, 8.607e-02, -5.087e-02, 9.072e-02, 3.085e-02, -4.719e-02, 7.219e-02, 1.239e-01, 8.664e-02, -4.961e-02)); + r += mul(s7_5, M4(7.244e-02, -2.825e-02, 7.402e-02, 3.481e-03, -3.425e-02, 4.283e-02, 7.261e-02, -8.555e-02, 1.067e-01, -8.323e-03, 1.513e-02, 7.220e-02, -5.575e-02, 1.445e-02, -1.231e-02, 8.109e-02)); + r += mul(s7_6, M4(-1.548e-02, -1.125e-01, 7.741e-02, -2.596e-02, 3.716e-02, -4.756e-02, -3.039e-02, 3.515e-02, 1.175e-02, -5.446e-03, -3.847e-02, -9.783e-03, -3.526e-02, 6.083e-03, -2.624e-02, 3.069e-02)); + r += mul(s7_7, M4(1.090e-01, -8.652e-02, 1.857e-01, 4.552e-02, -1.905e-02, 4.213e-02, -4.890e-03, -1.129e-01, -5.078e-02, -1.977e-02, 8.947e-02, 2.143e-02, 8.086e-03, -2.149e-02, 1.718e-02, -1.472e-02)); + r += mul(s7_8, M4(-1.970e-02, -4.491e-03, -2.376e-02, -7.501e-02, -1.957e-03, 6.665e-02, 1.631e-02, -9.853e-03, 6.115e-02, 5.283e-03, -1.900e-02, -1.069e-02, -2.595e-02, -2.954e-02, -1.801e-02, 1.378e-02)); + r += V4(9.662e-03, 1.842e-02, 1.390e-02, 1.935e-02); + return r; +} + +void Pass8(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = Rmp8x8(tid.x) + blockStart; + uint2 size = GetInputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = (gxy + 0.5) * pt; + + V4 s0_0 = l0(-1.0, -1.0); + V4 s0_1 = l0(0.0, -1.0); + V4 s0_2 = l0(1.0, -1.0); + V4 s0_3 = l0(-1.0, 0.0); + V4 s0_4 = l0(0.0, 0.0); + V4 s0_5 = l0(1.0, 0.0); + V4 s0_6 = l0(-1.0, 1.0); + V4 s0_7 = l0(0.0, 1.0); + V4 s0_8 = l0(1.0, 1.0); + V4 s1_0 = -max(-s0_0, 0.0); + V4 s1_1 = -max(-s0_1, 0.0); + V4 s1_2 = -max(-s0_2, 0.0); + V4 s1_3 = -max(-s0_3, 0.0); + V4 s1_4 = -max(-s0_4, 0.0); + V4 s1_5 = -max(-s0_5, 0.0); + V4 s1_6 = -max(-s0_6, 0.0); + V4 s1_7 = -max(-s0_7, 0.0); + V4 s1_8 = -max(-s0_8, 0.0); + s0_0 = max(s0_0, 0.0); + s0_1 = max(s0_1, 0.0); + s0_2 = max(s0_2, 0.0); + s0_3 = max(s0_3, 0.0); + s0_4 = max(s0_4, 0.0); + s0_5 = max(s0_5, 0.0); + s0_6 = max(s0_6, 0.0); + s0_7 = max(s0_7, 0.0); + s0_8 = max(s0_8, 0.0); + + V4 s2_0 = l1(-1.0, -1.0); + V4 s2_1 = l1(0.0, -1.0); + V4 s2_2 = l1(1.0, -1.0); + V4 s2_3 = l1(-1.0, 0.0); + V4 s2_4 = l1(0.0, 0.0); + V4 s2_5 = l1(1.0, 0.0); + V4 s2_6 = l1(-1.0, 1.0); + V4 s2_7 = l1(0.0, 1.0); + V4 s2_8 = l1(1.0, 1.0); + V4 s3_0 = -max(-s2_0, 0.0); + V4 s3_1 = -max(-s2_1, 0.0); + V4 s3_2 = -max(-s2_2, 0.0); + V4 s3_3 = -max(-s2_3, 0.0); + V4 s3_4 = -max(-s2_4, 0.0); + V4 s3_5 = -max(-s2_5, 0.0); + V4 s3_6 = -max(-s2_6, 0.0); + V4 s3_7 = -max(-s2_7, 0.0); + V4 s3_8 = -max(-s2_8, 0.0); + s2_0 = max(s2_0, 0.0); + s2_1 = max(s2_1, 0.0); + s2_2 = max(s2_2, 0.0); + s2_3 = max(s2_3, 0.0); + s2_4 = max(s2_4, 0.0); + s2_5 = max(s2_5, 0.0); + s2_6 = max(s2_6, 0.0); + s2_7 = max(s2_7, 0.0); + s2_8 = max(s2_8, 0.0); + + V4 s4_0 = l2(-1.0, -1.0); + V4 s4_1 = l2(0.0, -1.0); + V4 s4_2 = l2(1.0, -1.0); + V4 s4_3 = l2(-1.0, 0.0); + V4 s4_4 = l2(0.0, 0.0); + V4 s4_5 = l2(1.0, 0.0); + V4 s4_6 = l2(-1.0, 1.0); + V4 s4_7 = l2(0.0, 1.0); + V4 s4_8 = l2(1.0, 1.0); + V4 s5_0 = -max(-s4_0, 0.0); + V4 s5_1 = -max(-s4_1, 0.0); + V4 s5_2 = -max(-s4_2, 0.0); + V4 s5_3 = -max(-s4_3, 0.0); + V4 s5_4 = -max(-s4_4, 0.0); + V4 s5_5 = -max(-s4_5, 0.0); + V4 s5_6 = -max(-s4_6, 0.0); + V4 s5_7 = -max(-s4_7, 0.0); + V4 s5_8 = -max(-s4_8, 0.0); + s4_0 = max(s4_0, 0.0); + s4_1 = max(s4_1, 0.0); + s4_2 = max(s4_2, 0.0); + s4_3 = max(s4_3, 0.0); + s4_4 = max(s4_4, 0.0); + s4_5 = max(s4_5, 0.0); + s4_6 = max(s4_6, 0.0); + s4_7 = max(s4_7, 0.0); + s4_8 = max(s4_8, 0.0); + + V4 s6_0 = l3(-1.0, -1.0); + V4 s6_1 = l3(0.0, -1.0); + V4 s6_2 = l3(1.0, -1.0); + V4 s6_3 = l3(-1.0, 0.0); + V4 s6_4 = l3(0.0, 0.0); + V4 s6_5 = l3(1.0, 0.0); + V4 s6_6 = l3(-1.0, 1.0); + V4 s6_7 = l3(0.0, 1.0); + V4 s6_8 = l3(1.0, 1.0); + V4 s7_0 = -max(-s6_0, 0.0); + V4 s7_1 = -max(-s6_1, 0.0); + V4 s7_2 = -max(-s6_2, 0.0); + V4 s7_3 = -max(-s6_3, 0.0); + V4 s7_4 = -max(-s6_4, 0.0); + V4 s7_5 = -max(-s6_5, 0.0); + V4 s7_6 = -max(-s6_6, 0.0); + V4 s7_7 = -max(-s6_7, 0.0); + V4 s7_8 = -max(-s6_8, 0.0); + s6_0 = max(s6_0, 0.0); + s6_1 = max(s6_1, 0.0); + s6_2 = max(s6_2, 0.0); + s6_3 = max(s6_3, 0.0); + s6_4 = max(s6_4, 0.0); + s6_5 = max(s6_5, 0.0); + s6_6 = max(s6_6, 0.0); + s6_7 = max(s6_7, 0.0); + s6_8 = max(s6_8, 0.0); + + t4[gxy] = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t5[gxy] = f1(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t6[gxy] = f2(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t7[gxy] = f3(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); +} + +//!PASS 9 +//!DESC conv8 +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 +//!IN t4, t5, t6, t7 +//!OUT t0, t1, t2, t3 + +#define l0(x, y) V4(O(t4, float2(x, y))) +#define l1(x, y) V4(O(t5, float2(x, y))) +#define l2(x, y) V4(O(t6, float2(x, y))) +#define l3(x, y) V4(O(t7, float2(x, y))) + +V4 f0(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(8.887e-02, 3.201e-02, 3.272e-03, 3.765e-02, 5.024e-02, 2.837e-02, 8.306e-03, 2.390e-02, -1.173e-01, -2.534e-02, -1.399e-01, 8.948e-02, -5.215e-03, -1.560e-02, 8.428e-03, -2.487e-02)); + r += mul(s0_1, M4(5.189e-02, -5.796e-02, -4.014e-02, 3.733e-02, 3.837e-02, 9.472e-02, -6.379e-03, 1.350e-02, -1.656e-01, 5.211e-02, 1.362e-01, -6.236e-02, -2.758e-02, -6.192e-02, -1.576e-02, -2.115e-02)); + r += mul(s0_2, M4(5.693e-02, 4.895e-02, -5.442e-02, -3.899e-03, -2.244e-02, -3.409e-02, 2.633e-02, 2.265e-02, -9.917e-02, -2.025e-01, 2.870e-02, -5.216e-02, 5.458e-02, 5.259e-02, 7.653e-03, -7.861e-03)); + r += mul(s0_3, M4(3.048e-02, -2.534e-03, 1.112e-02, -9.310e-02, -4.621e-02, -1.901e-02, 7.749e-02, 6.284e-02, -2.183e-01, 7.311e-03, 8.476e-02, -5.162e-02, 4.214e-02, -2.302e-02, -5.391e-02, 5.794e-02)); + r += mul(s0_4, M4(-9.152e-03, -1.432e-01, 2.792e-02, 8.631e-02, 5.127e-02, 6.313e-03, 5.178e-02, -2.321e-02, -4.154e-01, -2.910e-01, 5.044e-01, 1.183e-01, -3.116e-02, 8.087e-02, 5.677e-02, -3.368e-02)); + r += mul(s0_5, M4(1.282e-02, 2.131e-02, 5.910e-03, 3.835e-02, 4.310e-02, 6.678e-02, -3.528e-03, -5.441e-03, -1.461e-01, 2.870e-01, 8.298e-02, -1.276e-01, 1.755e-02, 4.309e-03, 2.989e-02, -2.564e-02)); + r += mul(s0_6, M4(7.705e-02, -1.516e-02, 2.567e-02, 1.081e-01, 2.617e-02, 2.163e-02, -4.291e-02, -9.064e-03, 8.263e-02, 2.934e-03, -3.025e-02, 1.798e-02, -9.562e-02, 2.937e-02, 3.906e-02, -2.487e-02)); + r += mul(s0_7, M4(9.005e-02, 3.765e-02, -3.861e-02, 1.184e-02, -2.468e-02, -2.764e-03, 6.975e-03, 3.962e-02, 1.575e-02, 2.822e-02, -2.852e-02, 1.132e-01, 2.799e-02, -4.942e-05, 6.324e-02, -4.779e-02)); + r += mul(s0_8, M4(-9.121e-03, -2.050e-02, -5.023e-03, 3.821e-02, -2.644e-02, 1.712e-02, 4.536e-02, -2.812e-02, 1.159e-01, -1.993e-02, -1.738e-01, -4.798e-02, 1.387e-03, -1.129e-02, -4.604e-02, 3.013e-02)); + r += mul(s1_0, M4(-2.237e-02, 5.579e-02, -2.246e-02, 3.570e-02, -2.149e-02, 8.068e-02, -1.792e-02, 3.440e-02, -1.433e-02, 1.115e-02, 1.515e-02, 2.813e-02, -1.558e-02, -3.391e-02, -1.400e-02, -4.613e-02)); + r += mul(s1_1, M4(-1.341e-02, 2.247e-02, 3.174e-02, -1.056e-02, 4.711e-02, 2.507e-01, 5.819e-02, -2.294e-02, 5.427e-03, 2.027e-02, 1.049e-03, -1.555e-02, -4.490e-02, -3.285e-02, -5.561e-02, 2.131e-02)); + r += mul(s1_2, M4(3.709e-02, -1.982e-02, 4.372e-03, -3.034e-03, 3.273e-02, 3.586e-02, -3.369e-02, 9.327e-04, -3.915e-02, -2.741e-02, 3.030e-03, -9.380e-05, -5.189e-02, 2.277e-02, 4.675e-02, 5.198e-03)); + r += mul(s1_3, M4(-7.693e-02, 8.631e-05, 2.404e-02, -5.598e-02, 1.511e-03, 4.933e-02, 5.708e-02, -8.107e-02, 3.209e-02, -1.408e-02, 3.269e-03, 2.666e-02, -1.425e-01, -1.133e-01, -1.107e-02, -1.065e-01)); + r += mul(s1_4, M4(-3.071e-02, -9.263e-02, -7.140e-03, -1.791e-03, -2.620e-01, 2.204e-01, 1.028e-01, -6.621e-02, -2.582e-02, -5.728e-02, 3.437e-02, -1.372e-02, 5.936e-03, -3.954e-01, -4.912e-02, -4.338e-02)); + r += mul(s1_5, M4(5.105e-03, -1.751e-02, 2.083e-02, -5.066e-02, 1.203e-01, -2.110e-02, 2.213e-02, -5.408e-02, 4.408e-02, 1.305e-02, 5.215e-04, -2.305e-02, -1.895e-02, 2.121e-01, 7.568e-03, -1.781e-02)); + r += mul(s1_6, M4(-1.679e-02, -4.701e-02, 3.984e-03, 1.883e-02, 1.751e-02, -8.799e-03, -5.917e-02, -7.541e-02, 3.519e-02, 1.518e-02, -2.381e-02, -4.177e-02, -6.473e-02, -2.278e-02, -1.700e-02, -2.191e-02)); + r += mul(s1_7, M4(2.106e-02, -4.757e-02, -1.853e-02, 2.467e-02, 4.212e-02, 5.024e-02, -9.230e-02, -3.573e-02, -4.607e-03, -2.600e-02, -1.520e-03, 8.444e-02, -9.903e-02, -2.004e-01, 2.285e-01, 1.495e-02)); + r += mul(s1_8, M4(-4.115e-02, -5.467e-02, -4.223e-03, -8.214e-03, -4.322e-03, 5.092e-02, 2.288e-02, -2.948e-03, 6.988e-03, 4.056e-02, 7.262e-03, -2.476e-02, -5.517e-02, 5.640e-02, -1.188e-02, -1.767e-02)); + r += mul(s2_0, M4(-1.913e-02, 2.134e-03, 1.936e-02, -2.429e-02, -5.421e-02, -2.326e-02, -5.509e-02, -3.796e-02, -3.348e-02, 3.749e-02, 1.311e-02, 2.045e-02, 3.166e-03, 1.811e-02, -1.005e-02, 1.696e-02)); + r += mul(s2_1, M4(-9.150e-02, -1.023e-01, 7.368e-03, 2.306e-02, 7.247e-02, -8.859e-02, -2.536e-02, -6.319e-03, -2.311e-02, -1.426e-04, 4.821e-02, -6.262e-02, -1.403e-03, -1.258e-02, 2.554e-02, -1.763e-02)); + r += mul(s2_2, M4(2.814e-02, 3.237e-02, -6.889e-03, 3.033e-02, 3.767e-02, 2.573e-02, -1.026e-01, -4.388e-02, -5.742e-03, -5.933e-02, 2.558e-02, -7.563e-03, -4.052e-02, -4.367e-02, 7.445e-03, -2.313e-02)); + r += mul(s2_3, M4(1.518e-03, 5.084e-02, -2.629e-02, -7.922e-04, -7.820e-02, -4.543e-02, -3.833e-02, -3.059e-02, 2.764e-02, 2.558e-02, -1.724e-02, 1.145e-01, -1.394e-02, -7.350e-03, 2.198e-02, -1.572e-02)); + r += mul(s2_4, M4(-4.070e-02, -2.989e-02, 8.852e-02, -3.323e-02, -1.839e-01, 2.319e-01, 1.441e-01, -6.286e-02, 4.204e-02, 1.371e-01, -7.721e-02, 3.164e-02, -3.207e-02, -1.033e-01, -1.103e-02, 1.647e-02)); + r += mul(s2_5, M4(-3.430e-02, -5.789e-02, 5.859e-02, 5.950e-02, -4.161e-03, -1.968e-01, -5.103e-02, -2.885e-02, -4.215e-02, -4.254e-02, -9.712e-03, -6.761e-03, 1.942e-02, -1.867e-02, -3.283e-02, 1.285e-02)); + r += mul(s2_6, M4(9.657e-03, -2.888e-02, -2.190e-02, 4.982e-02, 1.119e-01, -1.187e-02, 2.497e-03, -2.191e-02, -4.578e-02, -1.121e-02, -3.918e-02, -5.578e-02, 3.260e-02, 1.351e-02, -1.695e-02, -1.870e-02)); + r += mul(s2_7, M4(-6.146e-03, -5.304e-03, -2.515e-02, 6.409e-03, -1.061e-01, -6.602e-02, 1.038e-01, 7.992e-02, -1.125e-02, -1.140e-01, 2.139e-02, 1.562e-02, 3.380e-02, -4.087e-02, -3.406e-02, 2.572e-02)); + r += mul(s2_8, M4(-4.541e-03, -1.534e-02, -1.960e-02, 4.713e-03, 3.191e-02, 3.243e-02, -3.525e-03, 8.842e-02, 2.320e-02, -5.254e-02, 5.576e-03, -6.195e-04, -1.623e-02, 9.936e-03, 2.434e-02, -1.706e-02)); + r += mul(s3_0, M4(-6.865e-02, -2.470e-03, -7.014e-02, 9.169e-02, 8.304e-03, 1.561e-02, -3.308e-02, 6.586e-03, 5.683e-02, -3.107e-02, 1.599e-02, 1.966e-02, 8.197e-03, -8.098e-02, 3.804e-02, 2.126e-03)); + r += mul(s3_1, M4(2.214e-02, 1.383e-01, 1.963e-01, 5.929e-02, 1.310e-02, 3.765e-02, 5.032e-04, 1.223e-02, 5.856e-03, -6.911e-02, -1.580e-02, -4.967e-02, 7.396e-02, 8.123e-02, -2.005e-02, 2.053e-02)); + r += mul(s3_2, M4(2.141e-02, 4.417e-02, -2.593e-02, 1.296e-02, -4.732e-03, 2.229e-02, -1.534e-02, -8.790e-03, -6.795e-03, -3.142e-02, -1.915e-02, -3.137e-03, -8.709e-02, -1.506e-01, 1.318e-01, 3.611e-02)); + r += mul(s3_3, M4(-3.602e-02, 1.065e-02, 6.388e-02, 6.761e-02, -8.897e-02, 1.601e-02, 1.340e-02, -9.509e-03, 1.011e-01, -9.129e-03, 1.162e-02, 7.398e-02, 2.940e-01, -2.547e-01, -4.550e-02, -1.246e-02)); + r += mul(s3_4, M4(3.596e-02, 3.200e-01, -1.405e-01, -2.549e-01, -2.897e-02, 5.599e-02, 1.866e-02, -4.516e-02, 1.024e-02, 2.166e-03, -1.358e-02, 1.027e-01, 2.121e-01, 1.760e-01, -2.349e-01, 5.819e-02)); + r += mul(s3_5, M4(-9.025e-02, -1.524e-01, 2.781e-01, -3.188e-02, 1.139e-02, -1.866e-02, 1.844e-02, 2.610e-02, -4.711e-03, -3.051e-03, -5.856e-02, 2.500e-02, 6.084e-02, -1.612e-02, -6.092e-02, -4.106e-02)); + r += mul(s3_6, M4(-4.519e-02, 6.426e-02, -5.022e-02, -6.991e-02, -6.298e-03, 3.535e-02, 4.076e-02, -1.325e-02, 4.969e-02, 1.608e-02, -5.519e-03, -1.369e-02, -7.312e-02, 6.747e-02, 6.830e-02, 3.065e-03)); + r += mul(s3_7, M4(-4.999e-02, -1.162e-02, 1.204e-01, 2.076e-01, 8.110e-02, 4.946e-02, -5.974e-02, -8.557e-02, 1.209e-02, 2.526e-02, 3.859e-02, -5.364e-02, 1.788e-02, 5.056e-02, 2.686e-02, 7.050e-02)); + r += mul(s3_8, M4(7.296e-02, -7.147e-02, -1.277e-01, 1.150e-01, -4.047e-02, -2.960e-02, 3.931e-02, 1.868e-02, 5.949e-02, 3.640e-02, 8.097e-03, 1.534e-02, 2.215e-02, -2.979e-02, 3.785e-02, -4.045e-02)); + r += mul(s4_0, M4(2.419e-02, -3.334e-02, -6.239e-02, 1.849e-02, -1.288e-01, 3.855e-03, 8.238e-03, -3.097e-03, -2.360e-02, 3.227e-03, -2.656e-02, -7.296e-02, -2.975e-02, 1.910e-02, 3.925e-02, -1.792e-02)); + r += mul(s4_1, M4(-2.377e-02, 1.642e-02, -1.290e-02, 5.035e-02, -8.455e-03, -9.846e-02, 2.072e-02, -1.479e-01, 1.688e-01, 8.426e-02, 7.203e-02, 6.841e-02, -5.795e-02, 1.265e-01, 1.150e-02, 6.977e-02)); + r += mul(s4_2, M4(-1.809e-02, -9.698e-03, 1.761e-02, 1.454e-02, -8.195e-03, -6.953e-02, 4.992e-02, -4.566e-02, -7.422e-02, -1.824e-02, -4.712e-02, -5.545e-03, -2.661e-02, 4.049e-02, 2.054e-02, 3.071e-02)); + r += mul(s4_3, M4(1.207e-02, -4.860e-02, 1.842e-02, 4.550e-02, 1.145e-02, -3.759e-02, -5.589e-02, -1.074e-01, 9.698e-02, 7.776e-02, -1.022e-02, 1.271e-01, -4.734e-02, 2.670e-02, -3.132e-02, -2.664e-02)); + r += mul(s4_4, M4(5.663e-02, -4.446e-02, -6.395e-02, -6.242e-02, -6.249e-02, -1.642e-01, 2.852e-02, 1.742e-01, 1.478e-01, 3.719e-01, -7.803e-02, -3.928e-01, 1.613e-01, 2.810e-01, -6.044e-02, 3.681e-02)); + r += mul(s4_5, M4(1.708e-02, 2.751e-02, 6.601e-03, 3.119e-02, -7.969e-03, 1.282e-01, -3.515e-02, -1.187e-01, 6.335e-02, -1.502e-01, -4.561e-02, -2.970e-02, -1.501e-01, 5.000e-01, -2.194e-01, 4.952e-02)); + r += mul(s4_6, M4(8.606e-02, -5.005e-02, 2.406e-02, 1.606e-01, 4.853e-02, -2.827e-02, 6.015e-02, 9.987e-02, -1.819e-02, 4.406e-02, -9.072e-03, -8.452e-03, 4.792e-04, -1.547e-02, 2.470e-02, 3.105e-03)); + r += mul(s4_7, M4(8.391e-03, 9.081e-02, -9.720e-03, -1.825e-02, 8.768e-02, -1.014e-02, -1.528e-01, -1.106e-01, 7.172e-03, 1.264e-01, -2.313e-02, -3.496e-02, -2.137e-01, -3.030e-02, 9.430e-02, -1.309e-01)); + r += mul(s4_8, M4(-2.614e-02, 4.468e-02, 4.065e-02, -2.869e-02, -1.297e-02, -2.339e-02, -2.540e-03, 1.588e-02, -4.478e-02, 3.770e-02, 3.070e-02, 7.073e-03, -4.713e-02, 8.982e-02, 1.057e-01, -1.787e-01)); + r += mul(s5_0, M4(1.929e-01, -6.049e-02, 1.261e-02, -7.127e-02, -1.489e-01, 1.863e-02, 4.513e-02, -4.118e-03, -5.224e-03, -2.984e-02, -3.773e-02, 6.289e-03, 4.134e-02, 1.385e-02, 8.470e-03, 1.358e-02)); + r += mul(s5_1, M4(1.664e-02, -1.110e-03, -2.606e-01, 1.177e-01, 5.526e-03, 6.164e-02, 1.086e-01, -9.018e-02, -1.285e-01, -8.475e-02, -7.029e-03, -4.614e-02, -1.016e-02, 6.228e-03, -6.354e-03, -1.944e-02)); + r += mul(s5_2, M4(2.205e-02, 1.012e-01, -6.228e-02, -2.201e-02, -3.456e-02, -3.355e-02, 2.056e-02, -2.969e-03, -1.091e-01, -1.215e-01, 5.271e-02, 3.107e-02, -1.952e-02, -3.789e-02, -4.389e-03, 1.075e-02)); + r += mul(s5_3, M4(1.921e-01, 1.543e-01, -1.211e-01, 3.928e-01, 4.351e-02, -2.524e-02, -6.480e-02, 1.052e-01, -2.238e-02, 2.424e-02, -3.844e-02, 9.200e-03, 4.739e-03, -9.607e-03, -1.322e-02, 3.699e-02)); + r += mul(s5_4, M4(-2.783e-01, 7.867e-02, -2.074e-01, 2.666e-01, 5.335e-02, 1.131e-01, -2.982e-01, 2.570e-02, 3.721e-02, 2.780e-02, -1.026e-01, -1.936e-01, -2.599e-04, 4.792e-02, 2.084e-02, -4.745e-02)); + r += mul(s5_5, M4(1.033e-01, 7.341e-02, -2.279e-02, -5.819e-02, -8.561e-02, 8.010e-03, -3.334e-03, -2.201e-02, 2.485e-02, -2.677e-02, -7.876e-02, 4.692e-02, -1.914e-03, -2.119e-02, 2.180e-02, 5.092e-02)); + r += mul(s5_6, M4(7.233e-03, -1.247e-01, -1.209e-02, -8.267e-02, 1.057e-03, -1.752e-02, 7.966e-02, -6.080e-03, 3.715e-02, -1.670e-03, -3.067e-03, 1.106e-01, -2.165e-02, 7.407e-04, -8.410e-03, 1.055e-03)); + r += mul(s5_7, M4(-3.666e-02, 1.788e-02, 1.756e-02, 9.302e-02, 7.233e-03, -7.879e-03, -1.701e-02, 6.506e-03, 6.389e-03, -4.760e-06, -2.765e-02, -1.567e-02, -2.391e-02, -4.882e-02, -3.183e-02, -1.139e-02)); + r += mul(s5_8, M4(1.248e-01, -5.499e-02, -1.877e-01, 3.818e-02, -1.905e-02, 5.370e-03, -2.512e-02, -2.418e-03, -4.736e-02, 2.345e-02, 1.898e-02, -5.234e-02, -7.952e-02, -5.534e-03, 6.866e-02, -1.501e-02)); + r += mul(s6_0, M4(3.349e-02, 3.433e-02, 2.367e-03, 1.707e-02, 2.834e-04, 2.968e-02, -1.011e-02, 3.636e-02, 6.394e-02, -4.141e-02, -7.244e-02, -8.106e-03, 2.991e-02, 8.409e-03, -2.334e-02, 2.244e-02)); + r += mul(s6_1, M4(3.531e-02, 4.867e-02, 5.204e-03, -1.661e-02, 1.252e-02, 3.131e-02, 3.468e-02, -1.069e-02, 2.216e-02, -5.971e-02, -2.087e-01, -1.454e-03, -8.230e-02, 1.256e-02, 3.144e-02, -6.300e-03)); + r += mul(s6_2, M4(1.198e-02, -1.093e-01, 2.009e-03, 5.850e-03, 4.185e-02, -4.072e-04, 1.377e-02, -2.387e-03, -6.416e-02, -3.365e-02, -7.202e-02, -2.289e-02, -9.483e-03, -1.216e-02, -3.992e-02, 1.798e-02)); + r += mul(s6_3, M4(-2.601e-02, 4.478e-02, 3.726e-02, 8.723e-02, -3.169e-02, -5.242e-03, 2.795e-02, -9.956e-03, -2.930e-02, -1.820e-03, -1.177e-02, -1.033e-01, 2.332e-02, -3.233e-02, 7.997e-03, 7.938e-02)); + r += mul(s6_4, M4(1.140e-02, -2.316e-02, -3.004e-02, -2.630e-02, 8.140e-03, -1.012e-01, -2.611e-03, -5.549e-02, 1.747e-01, 8.882e-02, -1.212e-01, 3.937e-02, 5.680e-02, -1.092e-02, -5.874e-02, 1.098e-01)); + r += mul(s6_5, M4(4.590e-02, 3.616e-02, -1.270e-01, -9.277e-03, 2.422e-02, -9.688e-02, -1.732e-02, -3.310e-02, -3.165e-02, 2.455e-02, -8.957e-02, 1.277e-02, -9.996e-03, 2.412e-02, 3.442e-02, -1.002e-02)); + r += mul(s6_6, M4(-1.275e-02, 5.449e-03, -4.332e-03, -1.923e-02, 6.185e-02, 2.942e-02, -2.970e-02, 1.438e-02, -5.858e-02, 1.987e-02, 5.388e-02, 1.758e-02, 1.038e-02, -2.942e-02, -6.372e-02, -5.622e-02)); + r += mul(s6_7, M4(-4.430e-02, 3.630e-02, 8.744e-03, -5.341e-02, 1.083e-01, 3.413e-02, -1.207e-01, 1.866e-02, -1.196e-02, 6.106e-02, 1.101e-01, 1.858e-03, 1.266e-02, -1.900e-02, -2.594e-02, 1.300e-02)); + r += mul(s6_8, M4(-7.216e-02, -3.953e-03, 5.978e-02, 2.634e-02, -2.210e-02, -3.100e-02, -3.031e-02, 9.694e-03, -3.416e-02, 6.459e-03, 2.769e-02, -5.562e-02, -1.805e-02, -3.524e-02, 1.197e-02, -2.079e-03)); + r += mul(s7_0, M4(2.432e-02, -3.764e-02, 2.184e-06, -9.107e-03, -3.065e-02, -1.918e-02, -2.148e-02, -5.258e-02, -3.428e-02, 4.043e-02, -7.553e-02, -2.058e-02, 3.945e-02, 3.997e-02, 4.444e-02, -1.918e-02)); + r += mul(s7_1, M4(1.699e-02, -1.853e-02, -1.586e-02, -3.566e-02, 9.624e-02, 1.364e-01, -3.323e-03, 6.777e-02, 5.119e-02, -5.110e-02, 2.388e-02, -5.701e-03, -1.320e-01, -2.138e-01, 4.052e-02, -1.073e-02)); + r += mul(s7_2, M4(3.618e-02, 7.331e-02, -2.008e-02, -4.520e-02, -3.762e-02, -2.573e-02, -4.067e-02, -6.379e-03, -3.185e-02, -1.700e-02, -2.503e-02, -1.310e-02, 4.268e-02, 8.023e-02, -2.566e-02, 1.200e-02)); + r += mul(s7_3, M4(5.186e-02, -1.451e-01, 1.294e-03, -8.585e-02, 1.538e-01, -8.961e-02, 4.282e-02, 1.006e-01, 1.072e-01, -1.157e-01, -1.704e-02, 1.783e-02, 7.231e-02, 3.331e-03, 2.005e-02, -3.466e-02)); + r += mul(s7_4, M4(8.486e-02, -2.125e-01, 3.064e-02, 3.166e-01, 5.850e-02, 1.479e-01, -9.927e-02, -3.233e-01, 3.735e-01, 6.033e-03, -2.300e-01, -2.835e-01, 1.770e-02, 1.745e-01, -1.580e-01, -6.637e-02)); + r += mul(s7_5, M4(-2.507e-02, 2.838e-03, 6.493e-02, 4.726e-02, -1.672e-01, -2.349e-01, 1.630e-01, 8.437e-02, 6.116e-02, 3.310e-02, -5.197e-02, 2.226e-02, 4.672e-03, -1.372e-01, 8.634e-03, -1.429e-02)); + r += mul(s7_6, M4(-3.649e-02, -1.269e-02, -1.024e-02, 2.659e-02, -1.143e-02, 1.632e-02, -2.783e-02, -1.192e-01, 5.262e-02, 3.661e-03, -4.617e-02, -2.578e-02, 1.772e-02, -1.441e-01, -5.866e-02, -8.424e-02)); + r += mul(s7_7, M4(-8.299e-02, -9.926e-02, 5.071e-02, -3.511e-02, -2.202e-01, -2.311e-01, 2.417e-01, 3.174e-01, 6.560e-03, 3.771e-02, -6.069e-02, 8.530e-02, 3.150e-02, -1.810e-03, 1.121e-02, -3.748e-02)); + r += mul(s7_8, M4(-3.565e-02, 4.143e-02, 1.022e-02, -8.715e-02, 5.984e-02, 1.291e-01, -1.059e-02, -2.838e-01, 3.367e-02, 1.852e-02, 1.254e-02, -5.066e-02, 5.227e-03, -4.538e-03, -1.702e-02, 6.824e-03)); + r += V4(1.181e-03, 8.230e-03, -8.373e-04, -2.226e-04); + return r; +} + +V4 f1(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(3.735e-02, 7.321e-03, -9.063e-02, 2.655e-02, 5.782e-03, -1.955e-02, 4.747e-03, -1.940e-02, 4.638e-02, -4.222e-03, 1.020e-01, -2.915e-02, -6.362e-02, -1.949e-02, 8.342e-03, 1.491e-02)); + r += mul(s0_1, M4(-4.903e-02, 9.009e-02, -4.578e-02, 5.669e-02, 5.086e-02, 3.943e-02, -1.008e-01, -1.949e-03, -1.187e-01, 1.094e-01, -1.198e-01, 8.811e-02, -2.927e-02, 1.096e-02, 4.834e-02, 1.965e-02)); + r += mul(s0_2, M4(1.657e-02, 5.933e-03, -2.361e-02, 7.328e-02, 3.851e-02, -8.436e-04, 4.338e-03, 2.002e-04, -3.099e-03, -4.612e-03, 6.618e-02, -5.134e-02, 4.999e-02, -1.884e-02, -9.779e-03, 4.197e-02)); + r += mul(s0_3, M4(-2.789e-02, -1.824e-02, -3.909e-02, 4.040e-02, 1.013e-02, 8.704e-02, 1.274e-02, -3.519e-02, -2.138e-01, 2.234e-02, -2.230e-01, 5.964e-02, 1.265e-01, -1.117e-02, 3.896e-02, -2.179e-02)); + r += mul(s0_4, M4(-3.369e-02, 3.132e-02, -2.603e-02, -1.647e-01, -7.495e-02, -7.839e-02, -3.332e-02, -9.295e-02, -4.065e-02, -1.203e-01, -7.278e-03, -4.638e-01, -6.658e-02, 7.366e-04, 3.104e-02, -1.348e-01)); + r += mul(s0_5, M4(-2.310e-02, 3.044e-02, -2.977e-02, 6.350e-02, 1.043e-02, 4.835e-03, -1.005e-03, 1.369e-02, 2.835e-02, -4.378e-02, -1.284e-02, 1.836e-01, -1.514e-01, 2.900e-04, -4.419e-03, 3.467e-02)); + r += mul(s0_6, M4(-1.773e-02, 8.370e-02, -4.369e-02, 4.831e-03, 6.303e-03, -2.615e-02, -4.635e-02, 1.748e-02, 1.000e-01, 5.347e-02, -2.080e-02, 8.705e-02, -4.790e-02, -2.085e-02, 2.236e-02, -7.095e-02)); + r += mul(s0_7, M4(8.422e-03, 4.460e-02, -4.504e-02, -5.108e-02, 1.772e-02, 2.164e-02, -4.921e-02, 9.575e-02, 2.302e-01, 6.677e-02, 9.069e-02, -2.652e-02, -6.605e-03, 2.440e-02, -6.203e-02, 7.330e-03)); + r += mul(s0_8, M4(5.511e-02, 1.542e-02, -5.059e-03, 3.171e-02, -6.442e-02, -5.679e-03, 1.145e-02, 2.220e-05, 1.217e-01, -7.622e-03, 7.413e-03, 7.513e-02, 5.875e-02, -7.754e-03, -1.073e-02, 6.121e-02)); + r += mul(s1_0, M4(2.168e-02, -4.579e-02, 4.918e-02, -1.727e-02, 4.170e-02, -1.246e-01, 5.060e-02, 8.042e-03, 2.092e-02, -7.061e-03, 2.682e-02, -4.390e-03, -5.984e-03, 2.385e-02, 3.160e-02, -2.543e-02)); + r += mul(s1_1, M4(-7.658e-02, 5.386e-02, -7.724e-03, -5.315e-02, 6.599e-02, 1.275e-01, -2.768e-02, 6.249e-02, 3.247e-02, -3.022e-03, 1.086e-02, -3.709e-03, 3.864e-02, -4.664e-02, 6.696e-02, 8.100e-03)); + r += mul(s1_2, M4(-6.044e-02, -1.413e-02, -5.048e-03, -3.623e-02, 3.267e-02, -2.345e-03, -2.573e-02, 2.255e-02, 4.310e-02, 2.143e-03, 1.195e-02, -1.254e-03, 3.588e-02, 5.696e-04, 3.540e-02, -5.437e-02)); + r += mul(s1_3, M4(5.584e-02, 2.195e-02, 1.284e-01, -2.934e-02, -1.995e-02, 1.069e-01, 1.716e-02, 3.259e-02, 2.022e-02, 6.430e-02, 1.950e-02, -1.204e-03, -8.247e-03, -1.034e-01, 4.017e-02, -1.014e-01)); + r += mul(s1_4, M4(7.738e-02, -7.787e-02, -8.559e-02, -3.832e-01, -1.601e-01, 1.303e-02, 1.333e-01, -5.981e-01, 4.252e-02, -3.160e-02, 3.228e-02, -3.681e-03, -1.285e-01, 2.940e-01, 2.559e-01, 1.676e-02)); + r += mul(s1_5, M4(-1.728e-02, -9.817e-03, 2.978e-02, -1.828e-01, 1.827e-02, -1.183e-02, -3.527e-02, -8.733e-03, 5.358e-02, 2.633e-02, 1.640e-02, -2.296e-02, 2.498e-02, -5.456e-03, 4.117e-02, 1.054e-01)); + r += mul(s1_6, M4(1.625e-02, 3.119e-02, 2.967e-02, -4.471e-02, 3.823e-02, -6.555e-02, -2.538e-02, 8.332e-02, 2.353e-02, -3.428e-03, 2.937e-02, 1.472e-02, 1.979e-01, 1.279e-01, 2.702e-02, 4.688e-02)); + r += mul(s1_7, M4(-2.596e-02, 1.838e-02, -1.123e-02, -1.558e-01, 7.660e-02, -4.095e-02, -2.568e-03, 1.184e-01, 5.229e-02, 2.339e-02, -1.010e-02, 1.139e-02, -6.036e-02, -1.079e-01, -7.627e-02, -1.255e-01)); + r += mul(s1_8, M4(2.202e-02, -6.740e-03, 4.657e-02, -1.208e-01, 1.782e-03, 1.630e-02, 1.916e-02, -2.809e-02, 1.417e-02, -7.265e-04, -5.384e-04, 5.627e-03, -1.229e-03, 1.043e-02, -2.705e-02, 1.526e-01)); + r += mul(s2_0, M4(2.447e-02, 1.729e-02, -2.765e-02, 5.449e-02, -4.221e-02, -8.931e-02, 3.146e-02, -2.128e-02, -2.070e-02, 1.432e-03, -3.099e-02, -1.587e-02, 6.266e-03, -3.164e-02, -3.437e-02, 2.344e-02)); + r += mul(s2_1, M4(-9.059e-02, 5.509e-02, 3.072e-02, 1.440e-02, 9.820e-03, -1.885e-02, -5.084e-02, -7.885e-02, -2.189e-02, -1.145e-01, 3.476e-02, -5.418e-02, -1.010e-01, -1.096e-03, -3.446e-03, -1.668e-02)); + r += mul(s2_2, M4(-9.562e-02, 5.623e-03, -1.658e-02, 3.662e-02, -2.377e-02, -3.407e-02, -3.480e-02, 7.729e-02, -4.953e-02, 1.609e-02, 1.767e-02, -1.126e-01, -2.488e-02, -3.236e-02, -3.311e-03, -1.805e-02)); + r += mul(s2_3, M4(1.759e-02, -2.190e-02, -5.458e-02, 2.657e-02, 3.511e-02, -2.803e-01, 4.074e-02, -8.826e-02, 3.244e-02, 8.148e-02, 4.088e-02, 4.509e-02, -9.224e-02, -2.484e-04, -4.308e-02, -1.777e-03)); + r += mul(s2_4, M4(9.104e-04, 3.797e-02, -5.060e-02, 2.746e-03, 2.471e-01, 1.048e-01, 1.037e-01, 3.233e-01, 1.347e-01, 1.900e-03, 1.886e-02, -3.936e-01, -3.162e-02, 7.359e-02, 9.111e-02, -3.810e-02)); + r += mul(s2_5, M4(1.120e-02, 3.946e-02, 3.958e-03, 3.405e-02, -3.474e-02, -3.862e-02, -7.786e-03, 1.777e-01, 1.561e-02, 5.411e-03, 5.232e-02, -2.836e-01, 1.983e-02, 3.910e-03, 4.503e-02, -2.982e-02)); + r += mul(s2_6, M4(2.452e-02, 3.821e-02, -3.523e-02, 1.539e-02, -4.772e-02, 1.718e-02, -3.666e-02, -6.527e-02, 1.994e-02, -6.181e-03, 5.485e-02, -4.438e-03, 4.088e-02, 3.997e-02, 1.727e-02, 5.171e-02)); + r += mul(s2_7, M4(6.000e-02, 3.510e-02, 3.557e-02, -8.980e-02, -5.613e-02, -4.479e-02, -1.678e-01, 5.538e-02, 5.004e-02, 1.512e-02, 2.275e-02, -1.108e-01, 1.488e-01, 2.930e-03, -1.023e-02, 3.367e-02)); + r += mul(s2_8, M4(6.663e-03, -1.386e-03, -1.365e-02, -2.420e-02, -5.310e-02, 2.358e-02, -1.795e-02, -2.243e-02, 1.510e-02, 4.362e-03, 8.571e-05, -9.362e-02, 5.626e-03, -1.368e-02, -1.471e-03, 3.142e-02)); + r += mul(s3_0, M4(-3.950e-02, -4.733e-02, 9.475e-02, -4.892e-02, 9.380e-02, -1.509e-02, 1.450e-02, -2.095e-02, -3.504e-02, 2.453e-02, -5.969e-02, 2.178e-03, 6.615e-02, 7.004e-02, 8.001e-02, -6.070e-02)); + r += mul(s3_1, M4(-1.676e-02, -1.485e-02, 2.666e-01, 8.033e-02, -4.579e-03, -3.812e-02, 3.769e-03, 3.362e-03, -9.428e-02, -3.817e-02, -3.272e-02, 1.008e-01, -3.819e-02, 7.791e-02, -7.914e-02, 2.262e-02)); + r += mul(s3_2, M4(-2.685e-02, 2.254e-02, 3.175e-02, -7.497e-02, -5.441e-03, 3.000e-03, -3.112e-03, 2.195e-02, 5.569e-03, 1.282e-02, 2.887e-02, 1.238e-02, -1.596e-01, 1.621e-02, 1.791e-02, -1.396e-01)); + r += mul(s3_3, M4(9.641e-02, -1.211e-02, 1.318e-01, -2.892e-02, 9.309e-02, -1.012e-01, 5.106e-02, -2.608e-02, 3.708e-02, 8.899e-03, -7.867e-03, 6.110e-02, -2.357e-01, 2.636e-01, -1.759e-01, 3.462e-02)); + r += mul(s3_4, M4(1.184e-01, -6.208e-02, -7.662e-02, -1.109e-01, 1.660e-01, 2.238e-02, 2.532e-02, -2.775e-02, 6.642e-02, 1.673e-01, -1.187e-02, -1.796e-01, 3.810e-02, -1.789e-01, 3.771e-02, 5.403e-01)); + r += mul(s3_5, M4(-1.026e-03, 3.177e-02, -7.086e-02, 1.776e-01, 2.638e-02, 3.480e-02, 1.754e-02, 5.252e-02, 5.514e-03, 6.224e-03, 4.988e-04, 1.556e-03, 7.209e-02, 2.107e-02, 3.573e-02, -2.720e-01)); + r += mul(s3_6, M4(-7.826e-02, -2.392e-02, 7.209e-02, -7.598e-02, -1.960e-02, -9.385e-03, 3.182e-02, -2.384e-02, -3.284e-03, 2.330e-02, 2.146e-02, 3.374e-02, -3.855e-02, -2.250e-02, -2.083e-02, 2.701e-02)); + r += mul(s3_7, M4(-1.451e-01, 4.434e-02, -8.629e-02, 1.044e-02, 1.889e-01, 2.243e-02, 3.330e-03, -2.253e-02, 7.287e-03, -1.563e-02, 2.876e-03, -1.321e-02, -3.684e-02, 8.823e-02, 2.742e-02, 4.708e-02)); + r += mul(s3_8, M4(-6.824e-02, 2.854e-02, -6.687e-03, -9.146e-02, 6.651e-02, -1.166e-02, 1.677e-02, -5.796e-02, 7.355e-03, 8.139e-03, -2.706e-02, 5.048e-02, 3.256e-02, -7.823e-03, 3.660e-03, -1.004e-01)); + r += mul(s4_0, M4(-9.431e-03, 5.889e-02, -2.126e-02, -1.830e-02, 2.106e-02, -9.595e-02, 7.357e-02, -6.164e-02, -3.097e-03, -7.961e-02, 1.315e-01, 2.196e-02, 1.916e-02, 5.432e-02, 9.130e-03, 1.871e-02)); + r += mul(s4_1, M4(1.210e-01, 3.681e-02, 2.575e-02, 5.345e-02, -6.667e-02, 2.085e-02, -5.452e-02, -1.316e-01, 8.277e-02, 1.974e-02, -4.569e-03, 6.749e-02, 4.601e-02, -6.241e-03, 4.080e-01, 9.546e-02)); + r += mul(s4_2, M4(6.069e-02, 1.337e-02, 3.668e-03, 4.510e-02, 3.752e-02, -6.577e-02, 6.636e-02, -6.562e-02, -2.238e-02, 2.513e-03, -3.745e-02, 1.332e-01, -1.584e-01, -1.608e-02, 1.324e-01, -1.189e-01)); + r += mul(s4_3, M4(-1.071e-01, 2.279e-02, -3.308e-02, -1.314e-03, 4.047e-03, 5.535e-02, 5.889e-02, 1.296e-02, 9.058e-02, 4.993e-02, 7.142e-02, 3.842e-02, -3.450e-02, -1.056e-01, 3.612e-02, 1.292e-02)); + r += mul(s4_4, M4(1.172e-02, -9.352e-03, 5.152e-02, -5.238e-03, -3.401e-02, 9.417e-03, -2.763e-02, 5.862e-02, 2.160e-01, -1.091e-01, 2.705e-02, -1.936e-01, -5.915e-02, 1.654e-01, 5.814e-01, -7.901e-02)); + r += mul(s4_5, M4(1.396e-01, 3.896e-02, 1.335e-04, -3.864e-02, -5.279e-02, -4.169e-02, -2.619e-02, 7.096e-02, 9.102e-02, -3.263e-02, 7.145e-03, -5.895e-02, 5.079e-02, 2.301e-01, 2.891e-01, -8.593e-02)); + r += mul(s4_6, M4(1.144e-02, 2.328e-02, -7.695e-02, -1.343e-03, 5.186e-02, 6.368e-02, -2.607e-02, -2.692e-02, -5.042e-02, -4.400e-02, 1.485e-02, 2.958e-03, 4.236e-02, 5.249e-03, -1.026e-01, 2.812e-02)); + r += mul(s4_7, M4(5.092e-02, -3.809e-03, 4.445e-02, 2.612e-02, 1.142e-01, -7.595e-02, 5.381e-02, 1.712e-02, -1.065e-01, -7.024e-03, 2.167e-02, -9.190e-02, 6.058e-02, -9.443e-02, 1.459e-01, -4.769e-02)); + r += mul(s4_8, M4(3.684e-04, -1.860e-02, -1.058e-02, 1.948e-02, 2.465e-03, -5.119e-03, 2.769e-02, 1.458e-02, -2.639e-02, 8.080e-03, -1.704e-02, -2.213e-02, 5.268e-02, -5.988e-02, 3.712e-02, 1.254e-01)); + r += mul(s5_0, M4(-2.496e-02, 8.809e-02, -1.426e-01, 6.392e-02, 3.160e-02, -6.681e-02, 8.480e-02, -7.819e-02, -2.165e-02, 2.542e-02, -1.916e-02, 2.132e-02, -3.296e-02, 1.161e-02, -1.487e-02, 2.013e-02)); + r += mul(s5_1, M4(2.416e-01, 1.343e-02, 4.903e-02, 6.341e-02, -9.003e-02, -7.302e-02, -1.000e-01, -5.732e-03, -2.697e-02, 5.232e-02, -8.220e-02, -3.580e-02, 9.402e-03, -1.418e-03, -1.429e-02, 7.107e-03)); + r += mul(s5_2, M4(1.023e-01, 2.851e-02, -1.219e-02, 3.114e-02, 9.954e-03, -2.428e-02, 4.689e-02, 8.756e-03, -1.618e-02, 1.071e-02, -1.172e-02, -8.114e-03, -3.601e-02, 3.402e-02, -7.213e-03, -1.546e-02)); + r += mul(s5_3, M4(2.819e-02, 3.272e-01, -3.521e-02, -1.169e-01, 1.235e-01, 1.380e-01, 1.391e-01, -1.713e-02, -4.166e-02, -1.108e-01, -5.924e-02, 6.759e-02, -4.242e-02, 1.073e-02, -3.557e-02, -3.206e-02)); + r += mul(s5_4, M4(-1.297e-03, -7.965e-02, 2.005e-01, 3.798e-01, 1.215e-01, -3.609e-02, -8.034e-02, 6.808e-02, 4.566e-02, -1.028e-02, 1.626e-02, 2.790e-02, -6.773e-02, -5.215e-02, -1.234e-02, 1.084e-02)); + r += mul(s5_5, M4(1.163e-01, 6.928e-02, -7.286e-02, -7.548e-02, -7.859e-02, -3.504e-02, 1.962e-02, -1.861e-02, 6.673e-02, 5.095e-03, 4.188e-02, 3.247e-02, 5.449e-02, -3.710e-02, -4.225e-03, -6.734e-03)); + r += mul(s5_6, M4(-6.793e-02, -8.408e-02, -1.155e-01, 6.691e-02, -6.385e-03, -1.279e-02, 7.386e-02, -2.486e-02, 2.807e-02, 7.187e-02, -6.588e-02, 2.863e-02, 3.158e-02, 4.317e-03, -1.664e-02, -9.957e-03)); + r += mul(s5_7, M4(4.247e-02, 7.270e-02, 1.199e-02, -2.256e-01, 3.120e-02, 3.151e-03, -1.541e-02, -9.396e-02, 2.435e-02, 9.246e-03, 8.851e-04, -8.081e-02, 3.958e-02, 1.086e-02, -9.265e-04, -3.038e-02)); + r += mul(s5_8, M4(4.742e-02, 5.148e-02, -3.171e-02, -1.373e-01, 5.415e-02, -9.496e-03, 1.975e-02, 3.439e-03, -5.139e-02, -2.697e-02, 1.210e-02, -1.295e-02, -3.452e-02, -2.794e-03, 1.383e-02, 1.658e-02)); + r += mul(s6_0, M4(-2.507e-02, -7.946e-04, 1.110e-02, -4.932e-04, 2.526e-02, 9.996e-03, 2.226e-02, -1.076e-02, -6.662e-03, -3.381e-02, -2.353e-02, 5.043e-03, 3.321e-03, 2.826e-02, 4.069e-02, 5.503e-03)); + r += mul(s6_1, M4(3.050e-02, -2.427e-03, -1.249e-01, -4.679e-03, 3.654e-03, -4.095e-02, -3.797e-03, 5.638e-03, 4.113e-03, 3.107e-02, -3.934e-02, -6.310e-02, -3.349e-02, 7.328e-02, 3.905e-02, 5.081e-02)); + r += mul(s6_2, M4(2.691e-02, -3.391e-02, -1.199e-02, 4.570e-03, -6.239e-02, 2.360e-03, -3.945e-02, -6.586e-03, -2.278e-02, 2.032e-04, 7.616e-03, 2.224e-02, 1.718e-03, 1.473e-02, 1.707e-02, -1.987e-02)); + r += mul(s6_3, M4(-4.025e-03, 2.814e-02, 6.370e-02, -3.235e-02, -1.529e-02, 3.723e-02, -1.565e-03, 1.399e-02, 7.093e-02, -7.519e-02, 4.052e-02, 1.021e-02, 4.772e-02, 3.930e-02, -1.189e-01, -1.362e-02)); + r += mul(s6_4, M4(-3.540e-02, 8.062e-02, -1.039e-01, 1.217e-02, 3.187e-03, 1.265e-02, -4.382e-02, -2.559e-02, 1.570e-01, -7.089e-02, 8.914e-03, 7.153e-02, 1.327e-01, -9.643e-02, -5.999e-02, 7.664e-02)); + r += mul(s6_5, M4(-2.217e-02, 1.164e-02, -1.264e-02, 4.551e-02, -6.797e-02, 1.238e-03, 3.343e-02, 9.795e-03, 1.598e-01, 3.646e-02, 4.413e-02, -1.461e-02, 2.523e-03, -5.439e-04, -4.791e-02, 1.033e-03)); + r += mul(s6_6, M4(1.176e-02, 1.414e-02, -3.136e-03, -2.034e-03, 2.634e-02, 4.214e-02, 2.754e-02, 3.087e-02, -3.876e-02, -4.940e-02, -3.528e-02, -6.377e-03, -1.154e-02, -3.120e-02, 8.880e-02, 2.014e-02)); + r += mul(s6_7, M4(4.944e-02, 3.875e-03, 2.216e-02, -5.348e-02, 4.101e-02, 7.348e-02, -7.037e-02, 5.307e-02, -1.714e-01, 1.506e-02, -4.873e-02, -5.804e-02, -2.607e-02, 1.517e-02, 5.446e-02, -2.876e-02)); + r += mul(s6_8, M4(-7.465e-02, 7.315e-04, 9.037e-03, 1.764e-02, 3.369e-02, 5.548e-04, 5.357e-02, 2.939e-02, 4.354e-02, -1.601e-02, -3.103e-03, -7.247e-02, 5.881e-02, -7.223e-03, 2.963e-02, -1.031e-01)); + r += mul(s7_0, M4(-5.706e-02, -5.552e-03, -1.280e-01, -2.101e-02, -1.691e-02, -3.833e-02, 4.682e-02, -3.053e-03, -2.772e-02, -1.184e-01, 5.773e-02, -3.441e-02, 4.748e-02, -2.675e-02, -1.698e-01, 5.623e-02)); + r += mul(s7_1, M4(-1.115e-01, -5.093e-02, -2.015e-01, -1.037e-01, 7.328e-02, 4.829e-02, 6.089e-02, 5.624e-02, -1.812e-01, -6.170e-03, -6.281e-02, -6.716e-02, -8.051e-02, 3.991e-02, 7.369e-02, -7.423e-02)); + r += mul(s7_2, M4(8.941e-02, -1.362e-01, 4.570e-02, 5.541e-02, -1.336e-01, 3.946e-02, -1.285e-01, -6.767e-02, -3.703e-02, 2.243e-02, 1.189e-02, 2.213e-02, 7.284e-03, 1.078e-02, -3.074e-02, 6.708e-02)); + r += mul(s7_3, M4(-9.038e-02, -5.443e-02, -2.140e-01, 2.917e-02, -8.495e-02, 1.500e-01, -1.034e-01, -6.819e-03, 1.175e-01, -2.877e-02, 3.825e-02, 1.543e-02, -6.762e-02, 6.191e-02, -3.292e-02, 1.214e-01)); + r += mul(s7_4, M4(1.351e-01, 1.929e-01, -4.921e-01, 5.014e-02, -2.351e-01, -3.016e-01, -1.121e-01, 3.097e-01, -1.658e-01, -1.272e-01, 7.207e-02, -3.743e-01, 3.631e-01, -1.412e-01, -1.938e-01, -8.993e-02)); + r += mul(s7_5, M4(-4.301e-02, 7.487e-02, 2.500e-02, 1.069e-01, -1.016e-01, 4.391e-02, 1.315e-01, 5.845e-02, 4.127e-02, 1.446e-02, -1.786e-02, -8.449e-02, -4.528e-02, -1.804e-02, -2.909e-02, -8.959e-02)); + r += mul(s7_6, M4(3.403e-02, 5.445e-02, -8.672e-03, -5.562e-02, 1.259e-01, 7.118e-02, -1.102e-03, 6.377e-03, -6.440e-03, -3.774e-02, -1.121e-02, -4.780e-02, 2.907e-03, -6.161e-02, 4.809e-02, 6.793e-02)); + r += mul(s7_7, M4(3.418e-02, -1.906e-02, -4.124e-02, -6.526e-02, -1.621e-01, -3.490e-02, -4.261e-02, -1.441e-01, -1.343e-02, 3.143e-02, 8.302e-03, 1.160e-01, -4.174e-02, 7.590e-03, 1.030e-01, -2.129e-01)); + r += mul(s7_8, M4(6.975e-03, 1.297e-02, 3.317e-02, -8.614e-02, -1.193e-01, 6.797e-02, -2.014e-02, -6.614e-02, 9.511e-02, 1.817e-02, 6.716e-03, 2.764e-02, -4.762e-03, -4.361e-03, 1.822e-02, -7.534e-02)); + r += V4(-7.831e-03, -2.140e-04, -1.201e-04, 7.332e-03); + return r; +} + +V4 f2(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-6.422e-02, 1.680e-02, -4.666e-02, -4.495e-02, -2.339e-03, 8.326e-03, -1.462e-02, -4.952e-02, 5.134e-02, -1.934e-02, 4.511e-02, 1.334e-01, -4.618e-03, -8.103e-03, 3.456e-02, 1.580e-02)); + r += mul(s0_1, M4(-1.842e-03, -3.105e-02, -2.950e-03, 1.885e-02, -3.407e-02, -3.604e-03, -2.389e-03, -5.071e-02, -8.016e-02, -3.803e-02, -8.330e-02, 1.628e-01, 1.962e-02, 3.725e-02, 2.377e-02, 3.499e-02)); + r += mul(s0_2, M4(-7.064e-03, 6.164e-03, -4.705e-02, -8.524e-03, -5.537e-03, 3.894e-02, -2.029e-02, -2.486e-02, -9.182e-03, 1.519e-01, -1.817e-02, 6.079e-02, -9.486e-03, -2.110e-02, 3.287e-02, -2.019e-03)); + r += mul(s0_3, M4(-1.171e-01, -5.278e-02, 7.026e-02, 4.255e-02, 1.090e-02, -5.941e-02, -3.697e-02, -3.014e-02, -1.685e-01, 2.513e-02, -4.012e-02, 8.469e-03, 1.878e-02, -1.719e-02, -8.298e-03, 1.018e-01)); + r += mul(s0_4, M4(-6.699e-02, 5.956e-04, -9.047e-02, -1.346e-01, 2.411e-02, -4.314e-02, 3.185e-02, -9.635e-02, 2.837e-01, -3.088e-02, -2.452e-02, -1.238e-01, -9.648e-02, 4.971e-02, -4.276e-02, -8.128e-02)); + r += mul(s0_5, M4(3.128e-02, -6.913e-02, -1.041e-02, -7.746e-02, -4.009e-02, -8.374e-02, 4.016e-02, 8.426e-03, 4.522e-03, 1.049e-01, 9.970e-02, -3.086e-01, -6.120e-03, -1.388e-01, -1.063e-01, -5.434e-02)); + r += mul(s0_6, M4(-3.365e-02, -3.072e-02, -9.321e-02, -1.832e-02, -5.298e-03, 7.121e-04, 2.169e-03, 4.990e-02, -8.102e-02, 4.921e-02, -5.902e-02, -2.201e-02, 1.276e-02, 3.207e-02, 3.180e-02, -1.999e-02)); + r += mul(s0_7, M4(-9.262e-02, -1.065e-01, -6.215e-02, -9.939e-02, 7.738e-02, -1.434e-02, 9.368e-03, 8.076e-02, 8.899e-03, -1.052e-01, -1.082e-01, 4.778e-02, -1.707e-01, -5.856e-02, -6.962e-02, -1.961e-02)); + r += mul(s0_8, M4(3.140e-02, 1.377e-02, 1.593e-04, -2.125e-02, 9.562e-03, 3.623e-02, -4.402e-02, -2.442e-02, -8.968e-02, 1.988e-01, 1.410e-02, 5.882e-02, 7.932e-02, 9.126e-02, 6.180e-02, -4.356e-02)); + r += mul(s1_0, M4(-1.858e-02, -9.682e-04, 1.851e-02, -2.569e-02, -1.704e-02, -5.016e-03, 4.800e-02, -9.740e-02, -5.270e-03, -6.199e-03, -2.214e-02, -2.733e-02, 3.645e-03, 5.273e-03, -2.155e-02, 1.597e-02)); + r += mul(s1_1, M4(2.906e-02, 6.890e-03, -2.221e-02, 5.509e-02, -1.067e-01, 3.076e-01, -1.190e-01, -3.612e-04, -7.062e-03, -2.028e-02, 5.407e-03, 3.502e-02, 4.203e-02, -5.999e-03, 6.040e-02, -9.000e-03)); + r += mul(s1_2, M4(-1.598e-02, -2.484e-02, -1.963e-02, 9.807e-03, 2.597e-02, -8.287e-02, 1.311e-02, -6.579e-02, 1.673e-02, 2.149e-02, 5.862e-03, -2.455e-03, -7.638e-04, 9.753e-03, -1.168e-02, 3.686e-03)); + r += mul(s1_3, M4(-2.996e-02, 1.216e-02, 2.214e-02, 1.757e-02, -1.134e-02, 5.456e-02, -3.628e-02, 4.101e-02, -1.514e-02, -2.445e-02, 6.486e-03, -4.812e-02, 4.947e-02, 1.221e-02, 1.329e-02, 4.396e-02)); + r += mul(s1_4, M4(1.473e-02, 1.606e-01, -5.135e-02, -3.255e-02, -1.753e-01, -5.682e-01, 1.286e-01, -4.066e-02, 8.350e-02, 4.364e-02, 9.298e-03, 1.028e-01, -3.886e-02, 3.602e-02, -2.097e-01, 2.511e-03)); + r += mul(s1_5, M4(3.637e-02, -9.506e-03, 6.912e-02, -1.290e-02, -2.436e-03, 1.188e-01, 5.628e-02, 1.431e-02, -2.094e-02, -1.958e-02, -3.403e-02, 4.689e-02, -7.153e-03, -3.282e-02, -3.716e-02, 1.626e-01)); + r += mul(s1_6, M4(-2.461e-02, 5.353e-02, -3.433e-02, 3.605e-02, -6.121e-02, -3.178e-03, 5.595e-02, 1.794e-02, -6.023e-02, -3.588e-03, -3.785e-02, 3.699e-02, 1.142e-01, 2.821e-02, -5.308e-02, 6.403e-02)); + r += mul(s1_7, M4(5.947e-02, -7.719e-02, 4.145e-02, -7.409e-03, -1.055e-01, 1.610e-01, -4.151e-02, 1.995e-02, 6.130e-02, -2.186e-02, -1.589e-02, 1.102e-01, 1.114e-01, -4.216e-02, 1.647e-03, -1.100e-01)); + r += mul(s1_8, M4(7.085e-03, 2.188e-02, -6.992e-03, -2.332e-03, 1.478e-02, -6.092e-02, -4.126e-02, 3.169e-04, -1.958e-02, -4.985e-03, -1.923e-03, -3.218e-02, 1.927e-02, -8.432e-03, -4.363e-02, 1.668e-03)); + r += mul(s2_0, M4(-6.546e-03, 1.343e-02, 2.296e-02, 5.659e-02, 2.752e-02, -4.231e-02, 6.074e-02, -5.683e-03, -3.253e-02, -5.294e-02, 1.101e-02, 9.926e-03, -1.273e-02, 3.820e-04, 4.827e-02, -4.940e-04)); + r += mul(s2_1, M4(4.736e-02, 2.476e-02, -9.261e-03, 7.812e-02, -1.871e-02, 1.027e-02, -4.256e-02, 1.155e-02, 2.293e-02, 2.758e-02, -1.940e-02, -1.913e-02, 1.163e-02, -1.837e-02, -1.667e-02, 1.094e-02)); + r += mul(s2_2, M4(-1.668e-02, -5.029e-02, -1.440e-02, 4.319e-02, 1.579e-02, -1.302e-02, 5.899e-02, 2.061e-02, -6.245e-03, -1.449e-02, 3.008e-02, -1.664e-02, 2.230e-02, 9.839e-03, 5.975e-02, 1.928e-02)); + r += mul(s2_3, M4(-1.839e-02, -2.045e-02, -4.858e-02, 3.903e-02, 7.104e-03, 1.747e-02, -5.856e-02, -1.094e-01, 1.239e-02, 2.181e-02, -1.091e-01, -8.099e-02, -4.212e-02, 3.092e-03, 4.736e-02, -7.150e-02)); + r += mul(s2_4, M4(-7.680e-03, 2.967e-02, -2.112e-02, -1.317e-02, -2.971e-01, -2.871e-01, 3.943e-01, -2.758e-01, 8.246e-02, 1.079e-01, 4.440e-03, 1.274e-01, 1.480e-02, 1.701e-03, -8.268e-02, 1.860e-02)); + r += mul(s2_5, M4(1.855e-02, 4.260e-02, -4.680e-02, -1.964e-02, 4.660e-02, 2.995e-01, -8.861e-02, 3.235e-02, 2.948e-02, 2.388e-03, 3.504e-03, -2.162e-03, 1.332e-02, 1.133e-02, 3.025e-02, 1.443e-02)); + r += mul(s2_6, M4(7.442e-03, 8.911e-03, -6.702e-03, -4.585e-02, 1.291e-01, -4.421e-02, 1.339e-01, 3.993e-02, -1.566e-02, 2.829e-02, 3.262e-02, 1.285e-02, -7.299e-03, 2.724e-02, -3.766e-02, 1.047e-02)); + r += mul(s2_7, M4(-3.381e-02, -1.174e-02, -4.296e-02, 1.705e-03, -4.339e-03, 2.267e-01, 7.326e-02, -2.796e-03, 6.150e-02, 3.889e-02, -6.071e-04, 9.139e-02, -3.776e-02, 2.394e-02, -5.208e-02, 5.949e-02)); + r += mul(s2_8, M4(-3.450e-02, -3.383e-02, 7.836e-03, 1.100e-02, 1.184e-02, -1.977e-01, -2.924e-02, -4.890e-02, -3.583e-03, -4.512e-02, -1.497e-02, 4.827e-02, 2.246e-03, 2.053e-02, 2.313e-02, -4.874e-02)); + r += mul(s3_0, M4(5.694e-02, -5.528e-02, 5.212e-02, 2.986e-02, 1.836e-02, 3.805e-02, -2.986e-02, 5.002e-02, -2.912e-02, -2.534e-02, -3.611e-02, -2.406e-02, 6.479e-03, -5.702e-03, -1.243e-01, 3.241e-02)); + r += mul(s3_1, M4(2.800e-02, -1.076e-01, 4.683e-02, 2.143e-02, 1.158e-02, -3.525e-02, 1.007e-01, -1.794e-03, -9.832e-03, -2.611e-02, 5.176e-03, -5.500e-02, -3.821e-02, 1.060e-02, 4.090e-02, -4.569e-02)); + r += mul(s3_2, M4(1.089e-02, -1.146e-01, -1.153e-02, -5.991e-02, 1.177e-02, 3.417e-03, -2.044e-02, -1.345e-03, 1.305e-03, 1.239e-02, 1.726e-02, -3.599e-02, 1.674e-02, -5.590e-02, -8.140e-02, -4.265e-02)); + r += mul(s3_3, M4(2.527e-02, 8.669e-02, 4.049e-02, -9.185e-03, -2.413e-02, -1.824e-03, 1.046e-01, 2.065e-02, -3.119e-02, -7.965e-02, -4.623e-02, 2.911e-02, 7.088e-02, -1.067e-01, 1.576e-01, 3.075e-02)); + r += mul(s3_4, M4(-1.465e-01, 1.556e-01, 6.490e-02, 1.404e-01, -1.715e-02, 1.477e-01, 1.859e-02, 1.233e-01, 2.244e-02, 8.846e-02, 1.742e-02, 6.853e-02, 8.496e-02, 2.641e-01, -2.901e-01, 1.538e-01)); + r += mul(s3_5, M4(5.795e-02, -5.553e-02, -1.528e-01, 2.953e-02, 4.175e-03, 3.038e-02, -7.615e-02, -2.932e-02, -3.998e-03, 3.270e-04, -5.368e-02, 4.379e-03, -3.845e-02, -8.842e-02, 1.667e-01, -1.082e-01)); + r += mul(s3_6, M4(-4.638e-02, 7.122e-02, 4.453e-03, -1.115e-01, 4.361e-02, 8.474e-03, 1.944e-02, 2.350e-02, -1.112e-02, -5.496e-02, 6.062e-03, -4.375e-03, -4.352e-02, 7.870e-02, -1.025e-01, -1.199e-01)); + r += mul(s3_7, M4(-9.071e-02, -5.780e-02, 3.592e-02, 3.266e-02, -7.675e-02, 7.431e-02, -9.768e-02, 2.174e-01, -9.449e-02, 2.945e-02, -7.159e-02, -6.166e-02, 9.235e-02, -1.781e-01, -5.495e-02, 7.006e-02)); + r += mul(s3_8, M4(-1.563e-02, 6.241e-02, 3.845e-02, -4.126e-02, 5.171e-02, -7.622e-03, -1.806e-03, 1.221e-01, 1.445e-02, -3.859e-02, -2.371e-02, 2.360e-02, -3.919e-02, 5.525e-02, 7.753e-04, -4.543e-02)); + r += mul(s4_0, M4(-7.578e-03, 2.589e-02, -3.446e-02, 9.255e-04, 1.508e-02, -4.230e-02, -3.854e-02, -8.312e-02, 5.879e-02, 2.448e-02, 3.286e-02, -8.081e-02, 2.705e-02, 5.509e-02, 1.780e-03, 9.692e-03)); + r += mul(s4_1, M4(7.212e-04, -9.108e-03, 8.121e-03, -4.260e-02, -3.512e-02, 5.898e-02, 9.525e-03, 4.439e-02, -1.030e-02, -1.913e-02, 5.020e-02, -1.238e-01, 9.665e-02, -1.807e-02, 5.449e-02, 2.058e-01)); + r += mul(s4_2, M4(1.662e-02, 3.488e-05, -4.044e-02, -5.045e-02, -2.282e-02, 7.772e-02, 5.240e-02, 1.573e-01, 3.551e-02, -1.906e-02, -4.839e-02, 3.603e-02, -5.828e-03, 1.748e-02, -1.287e-01, 1.122e-01)); + r += mul(s4_3, M4(-4.855e-02, -6.473e-02, -3.205e-02, -1.106e-02, 6.551e-02, 1.172e-01, 3.972e-02, -1.110e-02, 1.708e-01, -7.197e-02, 5.240e-02, 6.689e-02, 4.516e-02, -6.609e-02, 1.406e-02, 7.274e-03)); + r += mul(s4_4, M4(-4.430e-02, -1.395e-01, -4.970e-02, 1.998e-02, 1.560e-01, -1.112e-01, 6.712e-02, -4.218e-04, -2.212e-01, 5.050e-03, -1.333e-01, 2.678e-01, 2.361e-01, -1.204e-01, -2.388e-01, -1.541e-01)); + r += mul(s4_5, M4(1.204e-02, -1.997e-02, -6.763e-02, 1.468e-01, -6.895e-02, 7.981e-02, 3.946e-02, -1.001e-01, -5.877e-03, 1.462e-01, 1.895e-02, 9.893e-02, -7.228e-03, -3.419e-01, 5.974e-02, -3.917e-01)); + r += mul(s4_6, M4(7.028e-03, -1.167e-01, -1.396e-02, 6.679e-02, -1.213e-01, -1.553e-01, -6.473e-02, 5.061e-02, -4.635e-02, 6.373e-02, -2.930e-02, 2.868e-02, 6.047e-02, 3.747e-03, -5.183e-03, 2.880e-02)); + r += mul(s4_7, M4(9.784e-02, 2.841e-02, -6.079e-02, 4.337e-02, 4.047e-02, 1.088e-01, 2.636e-02, 7.993e-02, 1.425e-01, -2.001e-02, 2.533e-02, -1.085e-02, 1.535e-02, 8.569e-02, 1.048e-01, 4.093e-02)); + r += mul(s4_8, M4(-2.997e-02, -2.626e-02, 5.060e-02, 2.708e-02, 1.564e-02, -4.655e-03, 1.835e-02, -4.612e-03, 1.653e-02, -6.783e-03, -4.532e-05, -8.021e-02, -1.153e-01, 1.970e-01, -1.619e-01, 1.018e-01)); + r += mul(s5_0, M4(-7.963e-02, 8.415e-02, -8.603e-02, -6.643e-02, 5.413e-02, 1.145e-02, 4.283e-03, 1.071e-02, 1.425e-02, 9.550e-03, -5.742e-03, 2.553e-03, 8.458e-03, -1.834e-03, 2.582e-02, 1.234e-02)); + r += mul(s5_1, M4(4.813e-02, -3.183e-02, -8.014e-02, -1.980e-02, -4.461e-02, 3.795e-02, 1.069e-01, -3.706e-02, -1.612e-03, 2.115e-02, 4.532e-02, 1.812e-02, 4.970e-03, -7.523e-03, 6.517e-03, 4.676e-02)); + r += mul(s5_2, M4(-3.456e-03, 8.783e-03, -3.684e-03, -3.165e-02, 5.899e-03, 4.142e-02, 4.836e-02, 8.154e-02, 2.633e-02, 5.588e-02, -6.064e-02, 5.039e-02, -1.274e-02, 5.913e-04, -7.067e-02, -3.322e-02)); + r += mul(s5_3, M4(9.003e-02, -8.612e-02, -1.561e-01, 3.709e-02, 5.988e-02, 8.174e-02, -2.205e-02, -2.136e-02, 2.638e-02, -1.036e-01, 6.140e-02, 3.036e-02, -4.891e-02, -2.581e-02, -4.581e-02, -4.246e-02)); + r += mul(s5_4, M4(9.493e-03, -3.479e-01, -7.998e-02, -9.455e-02, 3.910e-02, -1.593e-02, 4.751e-02, 6.188e-02, 9.840e-02, 1.341e-01, -5.374e-02, -2.259e-02, 1.011e-01, 2.673e-02, -9.297e-03, -1.089e-01)); + r += mul(s5_5, M4(-3.690e-02, -3.564e-03, -7.306e-02, 6.273e-03, 5.888e-03, 1.425e-02, 1.465e-02, -4.929e-02, -1.569e-02, -5.070e-03, 6.049e-02, 8.172e-02, 7.841e-03, -3.845e-03, 9.943e-02, 2.239e-02)); + r += mul(s5_6, M4(-2.568e-01, 7.435e-02, -2.228e-02, 7.944e-02, -5.772e-02, -6.852e-02, -2.834e-02, 8.123e-02, 1.470e-01, 1.859e-02, -2.704e-02, 9.363e-03, 3.166e-02, 2.803e-02, -1.214e-03, 1.293e-02)); + r += mul(s5_7, M4(-6.304e-02, -2.063e-01, -7.649e-02, -1.351e-01, 5.625e-02, 3.581e-02, 2.647e-02, 9.335e-03, 1.043e-01, 5.061e-03, -5.448e-03, -1.123e-01, 2.964e-02, -9.273e-03, 4.073e-02, 8.731e-03)); + r += mul(s5_8, M4(-6.478e-02, -6.498e-02, -5.031e-02, 2.011e-01, 6.402e-03, 4.651e-02, 1.568e-02, 8.174e-02, -4.208e-02, -2.012e-02, 7.375e-03, -2.978e-02, 3.769e-02, -5.344e-03, -1.052e-02, 4.279e-02)); + r += mul(s6_0, M4(-5.605e-03, -1.344e-02, 3.815e-02, 6.425e-02, -4.361e-04, -5.982e-03, -2.016e-03, -6.674e-03, 1.816e-03, -6.747e-03, 9.217e-03, 7.074e-02, 1.043e-02, -9.410e-03, -2.738e-02, 2.603e-02)); + r += mul(s6_1, M4(-3.818e-02, -4.530e-02, 1.982e-03, 1.438e-02, 2.250e-02, -7.125e-03, -7.718e-05, -1.763e-02, -1.533e-02, 3.678e-02, -2.880e-02, 6.018e-02, 3.396e-02, -3.313e-02, 3.760e-03, 5.717e-02)); + r += mul(s6_2, M4(1.833e-02, 4.613e-02, -8.530e-03, -2.255e-02, -7.005e-03, -1.823e-02, 6.326e-04, -1.960e-02, 1.857e-02, 4.009e-03, 1.863e-02, 1.340e-02, 7.106e-03, 1.505e-02, -3.722e-02, 9.284e-03)); + r += mul(s6_3, M4(-1.978e-02, -2.542e-02, -5.701e-02, -3.668e-02, -3.079e-02, 1.690e-02, -4.785e-04, -4.757e-02, 2.229e-02, 3.626e-02, 7.499e-02, 7.492e-02, -8.919e-02, -1.301e-02, 3.316e-02, -2.238e-02)); + r += mul(s6_4, M4(5.750e-02, 1.236e-01, -3.727e-02, -9.971e-02, 5.715e-02, 3.370e-02, -5.223e-03, 6.820e-02, -3.931e-02, -2.162e-02, 4.768e-02, -3.176e-01, 1.332e-01, 8.223e-03, -6.747e-02, 1.525e-02)); + r += mul(s6_5, M4(-5.534e-02, 2.196e-02, -3.586e-02, 4.086e-02, -3.519e-02, 5.550e-02, 7.686e-03, 1.698e-02, 4.426e-02, 4.819e-02, -3.056e-02, 4.639e-03, 8.257e-03, -5.203e-03, 4.029e-02, 1.317e-02)); + r += mul(s6_6, M4(-4.034e-02, 5.021e-02, -5.809e-03, 2.783e-02, -2.373e-02, -3.029e-02, -5.745e-02, -1.953e-02, 7.143e-02, 7.924e-02, 9.374e-03, -6.179e-03, -3.599e-02, 3.946e-02, 3.311e-02, 1.562e-02)); + r += mul(s6_7, M4(4.839e-02, -6.011e-02, -1.972e-02, 6.475e-02, -1.888e-02, -4.052e-02, -5.563e-02, -6.110e-02, 7.359e-02, -2.875e-02, 4.410e-02, -6.216e-02, 3.299e-02, -2.920e-02, 1.754e-02, 4.605e-02)); + r += mul(s6_8, M4(4.073e-02, -1.848e-02, -1.961e-02, -3.710e-02, 4.170e-02, 1.913e-02, -2.446e-02, -1.048e-01, -2.286e-02, -1.650e-02, -8.772e-03, 7.160e-02, -2.420e-02, -3.058e-02, 3.382e-02, 3.350e-02)); + r += mul(s7_0, M4(-2.956e-02, -5.428e-02, 3.595e-02, 2.180e-02, -2.980e-02, -1.348e-02, -4.355e-02, 6.596e-02, 3.844e-02, 7.667e-03, 2.615e-02, 4.893e-02, -7.366e-02, 3.688e-02, -3.084e-02, -2.588e-02)); + r += mul(s7_1, M4(5.338e-02, 4.289e-02, 3.982e-02, 6.554e-02, 2.097e-03, -3.347e-02, 4.455e-02, 2.917e-02, -6.689e-03, -3.879e-02, 8.891e-02, -9.196e-02, 7.563e-03, 1.112e-01, -1.969e-01, 8.919e-02)); + r += mul(s7_2, M4(6.999e-02, 1.312e-03, 1.772e-01, 2.577e-03, -3.489e-02, -1.944e-02, -9.796e-02, -2.732e-02, 4.999e-03, -6.560e-03, -4.190e-02, 6.350e-02, -2.773e-02, -2.716e-02, 6.816e-03, -4.187e-02)); + r += mul(s7_3, M4(-2.480e-02, 1.246e-01, -2.110e-04, -5.843e-02, 5.100e-02, -5.059e-02, -5.935e-02, -1.641e-01, 5.114e-02, -6.457e-02, -3.647e-02, -4.605e-02, -2.080e-01, -9.407e-02, -4.015e-02, 8.764e-02)); + r += mul(s7_4, M4(-2.201e-01, 4.873e-01, -1.571e-01, -8.180e-02, 7.717e-02, 2.528e-01, 1.153e-02, -3.846e-02, -1.282e-01, 3.397e-01, 1.587e-01, -2.980e-01, -1.068e-02, 8.088e-02, 3.736e-01, -1.061e-01)); + r += mul(s7_5, M4(2.394e-02, -6.763e-02, -1.783e-01, 3.603e-02, 4.565e-03, -1.765e-01, 1.102e-01, -2.667e-01, 1.554e-02, -6.939e-02, 1.764e-03, -3.768e-02, 2.578e-02, 9.643e-02, 3.601e-02, -2.208e-02)); + r += mul(s7_6, M4(2.830e-02, 8.147e-03, 6.145e-03, -4.349e-02, -1.741e-01, 2.157e-02, -1.054e-01, -1.158e-01, 4.637e-02, -1.196e-02, 1.201e-01, -8.628e-03, -2.468e-01, 3.790e-02, 5.359e-02, 2.575e-02)); + r += mul(s7_7, M4(-8.000e-02, 3.732e-02, 1.501e-02, -4.495e-03, 1.110e-01, 5.499e-02, 3.363e-02, -9.936e-02, 8.269e-02, 4.787e-02, -5.760e-02, 4.804e-03, -6.810e-02, -6.330e-02, -5.539e-02, 4.120e-02)); + r += mul(s7_8, M4(3.943e-02, 1.279e-02, -8.367e-04, 4.311e-02, -1.619e-01, 4.199e-01, -2.100e-03, -3.792e-01, -4.745e-02, -2.734e-03, -4.497e-02, -2.701e-02, -2.135e-02, -2.782e-02, 1.058e-02, 2.532e-02)); + r += V4(-7.390e-04, 1.816e-03, -2.728e-04, -1.866e-03); + return r; +} + +V4 f3(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(1.895e-02, -3.486e-03, -1.379e-02, -1.842e-02, -3.970e-02, 3.895e-02, -3.372e-03, -4.028e-02, -8.637e-02, 1.274e-01, -1.950e-02, -1.323e-01, 2.921e-02, -8.863e-03, -3.657e-02, -3.447e-02)); + r += mul(s0_1, M4(-1.112e-02, -1.559e-02, 1.731e-02, -9.551e-02, 4.760e-02, -4.934e-02, -2.834e-02, 2.646e-02, -7.670e-02, -6.197e-02, -1.755e-01, -2.571e-03, -8.377e-03, 2.422e-02, 3.033e-02, 1.416e-02)); + r += mul(s0_2, M4(-2.654e-03, -9.362e-02, 3.156e-02, -3.364e-02, 5.052e-03, 7.076e-02, -7.983e-03, 2.995e-03, 2.022e-02, 3.845e-02, 1.639e-02, 2.667e-02, 2.051e-02, -5.142e-02, 4.048e-03, 9.972e-03)); + r += mul(s0_3, M4(7.535e-02, -3.695e-02, -1.487e-03, 1.763e-02, 2.683e-02, 2.572e-02, -3.221e-03, 4.724e-02, 1.230e-01, -1.008e-02, -3.410e-01, -1.780e-02, -5.457e-02, 7.070e-02, 5.849e-02, 3.655e-02)); + r += mul(s0_4, M4(-1.365e-02, 6.174e-02, 3.209e-02, 1.707e-02, 2.051e-01, 3.121e-02, 1.777e-02, -5.450e-02, 8.808e-02, 2.535e-02, -3.146e-01, -9.044e-02, 4.733e-02, -1.513e-01, -4.178e-02, 1.460e-01)); + r += mul(s0_5, M4(5.314e-03, -9.108e-02, -1.646e-02, -6.978e-02, 4.098e-02, 4.081e-02, 3.569e-02, 3.792e-02, -5.984e-02, -5.551e-02, -2.214e-01, -4.605e-02, -6.742e-02, -4.717e-03, 3.778e-02, -4.409e-02)); + r += mul(s0_6, M4(-5.846e-02, 3.342e-02, 5.078e-02, -3.740e-02, 5.761e-02, -2.075e-02, 1.671e-02, -3.571e-02, -5.007e-02, -7.200e-02, 3.912e-02, -3.255e-02, 4.228e-02, -2.367e-02, -2.202e-02, 7.920e-03)); + r += mul(s0_7, M4(6.797e-02, -1.165e-01, 5.155e-02, -3.932e-02, 1.142e-02, 3.870e-02, -4.763e-04, -1.028e-02, -1.720e-01, 7.857e-02, -1.793e-02, -1.800e-02, 5.313e-02, -9.309e-02, 3.770e-02, -1.870e-02)); + r += mul(s0_8, M4(-1.552e-02, -1.472e-02, -4.440e-02, -1.742e-02, -9.677e-03, -2.365e-03, 8.017e-03, -3.447e-03, -4.267e-02, 9.093e-02, -5.832e-03, 1.950e-02, -4.456e-03, -1.277e-01, -9.661e-02, -3.767e-02)); + r += mul(s1_0, M4(1.220e-02, 2.545e-02, -2.427e-02, -2.919e-02, 1.376e-01, -4.778e-02, -5.280e-02, 3.424e-02, -1.951e-02, 5.586e-02, -2.064e-02, -1.663e-02, 5.072e-03, -1.511e-02, 2.885e-02, 3.522e-02)); + r += mul(s1_1, M4(-4.135e-03, -4.255e-02, 1.657e-02, 1.401e-02, 2.459e-01, -1.500e-01, -1.057e-01, 8.905e-02, 2.055e-02, -3.477e-02, -4.044e-02, -3.994e-02, 8.582e-03, 8.109e-02, -2.204e-03, -1.661e-02)); + r += mul(s1_2, M4(-5.406e-04, 1.480e-02, 2.395e-02, -2.375e-02, -4.139e-02, 7.214e-02, -6.710e-02, 1.183e-02, 6.631e-03, 4.481e-02, -2.836e-02, 1.352e-02, 1.651e-02, 1.306e-02, -4.984e-02, 8.676e-03)); + r += mul(s1_3, M4(-5.175e-03, 4.428e-02, -5.746e-02, 4.562e-02, 1.205e-02, -7.419e-02, 1.158e-02, 6.830e-02, 1.129e-02, -2.328e-02, 2.257e-02, 2.547e-02, 9.760e-03, 5.335e-02, -6.050e-02, 1.134e-01)); + r += mul(s1_4, M4(6.943e-04, 6.939e-02, 4.084e-03, -4.701e-02, 1.362e-01, -3.526e-01, -3.718e-02, 5.053e-02, -6.910e-02, 5.202e-02, -5.544e-02, -5.834e-02, -1.604e-02, 8.243e-02, 1.663e-01, -3.396e-02)); + r += mul(s1_5, M4(3.533e-03, -4.729e-02, -3.179e-02, 3.769e-02, 4.131e-02, -1.719e-01, -1.389e-02, 2.174e-02, 4.603e-03, -2.876e-02, 6.189e-02, 4.800e-02, 3.724e-02, 2.389e-02, -5.403e-02, 1.807e-02)); + r += mul(s1_6, M4(-1.131e-01, 8.189e-02, -1.971e-02, 1.542e-02, 9.368e-02, 6.963e-02, 3.110e-02, 1.709e-02, -1.058e-02, -2.140e-03, 2.814e-02, 1.187e-02, 8.828e-02, -1.966e-03, -1.097e-01, -3.622e-02)); + r += mul(s1_7, M4(8.828e-02, -1.550e-01, 2.141e-03, -2.533e-03, 2.275e-03, -9.305e-02, 2.913e-03, -2.725e-03, -3.023e-02, 7.153e-02, -2.468e-02, -1.383e-02, 9.642e-02, 1.112e-01, -2.530e-01, 5.328e-02)); + r += mul(s1_8, M4(-4.595e-02, 8.567e-02, -1.921e-02, 1.341e-02, -4.145e-03, -6.961e-02, -2.132e-03, -1.025e-02, 1.577e-02, -2.728e-02, 8.589e-03, -1.513e-02, -2.036e-03, 3.103e-02, 2.803e-02, -9.909e-03)); + r += mul(s2_0, M4(1.872e-02, -3.554e-02, -4.315e-02, 9.349e-03, 1.951e-02, 2.302e-02, -2.166e-02, 1.058e-02, 5.752e-02, -2.872e-02, 1.595e-03, -2.577e-02, 4.223e-02, 3.590e-02, -2.997e-02, -9.733e-03)); + r += mul(s2_1, M4(-6.303e-02, 8.675e-02, -4.988e-03, -4.818e-02, 6.319e-02, -9.892e-02, 8.761e-02, 5.963e-02, -3.507e-02, -1.705e-02, 6.934e-02, 4.970e-02, 2.267e-03, -4.190e-02, -2.179e-03, -3.351e-02)); + r += mul(s2_2, M4(2.213e-02, -3.701e-02, 3.497e-02, -5.799e-02, -3.614e-02, -2.253e-02, -4.799e-02, -4.115e-02, 8.547e-03, 7.009e-02, -1.611e-03, 3.784e-02, 1.500e-03, 5.809e-02, -2.469e-02, 2.074e-02)); + r += mul(s2_3, M4(-2.082e-02, 5.921e-02, -5.766e-03, -6.030e-02, 7.578e-03, 1.904e-02, -1.047e-01, 1.059e-01, -7.170e-02, 5.991e-02, 4.122e-02, -4.622e-02, 3.416e-03, 1.202e-03, 1.250e-02, 2.651e-02)); + r += mul(s2_4, M4(-5.199e-02, -8.660e-03, -9.264e-02, 4.332e-02, -2.770e-01, -9.477e-02, -1.739e-01, 3.310e-02, -5.992e-02, -2.027e-01, 1.018e-01, -6.506e-02, -1.506e-01, -3.280e-02, 7.540e-02, -2.998e-02)); + r += mul(s2_5, M4(-4.084e-02, -1.771e-02, 1.499e-02, -2.934e-02, -1.790e-02, -1.188e-01, 1.644e-01, -5.213e-02, -9.989e-03, 8.711e-02, -5.337e-02, -8.002e-03, -3.434e-02, 2.052e-02, 2.082e-02, 2.510e-02)); + r += mul(s2_6, M4(1.092e-02, 2.723e-02, 7.463e-03, -1.953e-02, -9.929e-02, -3.255e-02, 7.282e-02, -8.302e-02, 4.877e-02, -2.527e-02, 2.649e-04, 2.636e-02, -3.057e-02, -2.064e-02, 3.504e-02, 1.511e-02)); + r += mul(s2_7, M4(-2.356e-02, 1.447e-02, 3.365e-02, -6.376e-03, 1.848e-02, -4.435e-02, -1.451e-01, -1.324e-01, -1.865e-02, 2.552e-02, -5.798e-02, 8.032e-03, -4.240e-02, 6.194e-02, -7.205e-02, -7.899e-03)); + r += mul(s2_8, M4(5.712e-02, -8.752e-03, 3.965e-02, -1.018e-02, 5.286e-03, -3.574e-02, 7.631e-02, -1.518e-02, -1.465e-02, 1.768e-02, 2.405e-02, 8.130e-03, 2.138e-04, -6.461e-03, -2.955e-02, 3.826e-03)); + r += mul(s3_0, M4(-4.841e-02, 2.032e-01, -3.635e-02, -2.115e-01, 1.990e-02, 4.568e-03, 2.516e-03, -1.000e-02, 5.002e-02, -4.300e-02, 9.021e-03, -5.821e-02, -7.489e-02, 1.239e-02, 1.077e-01, 1.305e-01)); + r += mul(s3_1, M4(-4.201e-02, -1.989e-01, -3.334e-02, -6.472e-03, 1.388e-02, 2.082e-02, -4.926e-02, -1.762e-02, -5.040e-02, -2.869e-03, 2.892e-02, -4.308e-02, -2.206e-02, 1.446e-02, -7.367e-02, -6.763e-02)); + r += mul(s3_2, M4(2.386e-02, -9.420e-02, 1.363e-01, 1.211e-02, -6.687e-04, -3.608e-02, 7.732e-03, 1.757e-03, 2.526e-03, -1.860e-02, 4.211e-02, 2.851e-02, 4.414e-03, 6.763e-03, 8.533e-02, 3.429e-03)); + r += mul(s3_3, M4(-2.262e-01, 4.314e-02, -9.302e-02, 1.245e-01, 1.110e-01, 3.947e-02, -1.664e-02, 3.281e-02, -4.983e-02, 1.251e-02, 4.169e-02, -5.546e-02, 2.145e-01, -1.460e-01, 3.327e-01, -6.628e-02)); + r += mul(s3_4, M4(-2.728e-02, -4.408e-01, -9.411e-02, -2.079e-02, -1.833e-01, 6.247e-02, -7.999e-02, 7.305e-02, -7.140e-02, -5.381e-02, 2.619e-02, 4.561e-02, -1.321e-01, 1.948e-01, 5.573e-01, 6.632e-02)); + r += mul(s3_5, M4(-1.393e-01, -9.259e-02, -7.399e-02, -1.722e-01, -1.226e-02, -2.651e-02, 2.733e-02, -3.692e-02, -8.345e-03, 3.471e-02, 1.499e-02, -5.093e-02, 4.088e-03, 1.013e-02, 4.411e-02, 2.132e-02)); + r += mul(s3_6, M4(-1.362e-01, 1.633e-02, 3.048e-03, -2.313e-02, -1.697e-03, -5.715e-03, 2.150e-02, -1.245e-02, 6.827e-02, -7.725e-02, 5.958e-02, -2.006e-03, -8.098e-02, 1.432e-02, -1.368e-01, 2.472e-02)); + r += mul(s3_7, M4(-6.272e-02, -1.959e-01, 1.151e-01, -3.563e-02, -5.832e-02, -4.127e-02, -6.041e-04, 3.039e-02, 8.441e-03, 4.542e-02, -5.644e-02, -3.768e-03, -5.552e-03, -2.609e-02, 1.490e-01, -3.899e-02)); + r += mul(s3_8, M4(-2.868e-02, 1.260e-01, 2.419e-02, -7.906e-03, -1.357e-02, 6.577e-02, -3.260e-02, -1.060e-02, -9.049e-03, -8.496e-02, 1.345e-02, 1.437e-02, -4.895e-02, 5.249e-02, -3.312e-02, -1.726e-02)); + r += mul(s4_0, M4(1.845e-02, -1.428e-02, 3.025e-02, -3.601e-02, -7.456e-02, 4.700e-02, -5.271e-03, 8.968e-02, -3.187e-02, 8.715e-03, 1.572e-03, 7.963e-03, -2.486e-02, -3.948e-02, -4.365e-02, 1.295e-02)); + r += mul(s4_1, M4(5.060e-02, -3.672e-02, 4.173e-02, 5.038e-02, -1.104e-01, 4.492e-02, -6.302e-02, 2.167e-02, 1.372e-01, -3.682e-02, -3.740e-02, 2.062e-02, -6.461e-02, -5.470e-03, -8.412e-02, -1.235e-01)); + r += mul(s4_2, M4(-1.806e-02, 1.559e-02, -2.325e-02, -4.432e-02, 3.505e-02, -4.632e-03, 4.085e-02, 1.421e-01, -4.986e-03, 4.484e-03, 6.821e-03, 5.988e-03, 1.689e-01, -7.924e-02, 2.597e-02, -3.159e-02)); + r += mul(s4_3, M4(1.002e-01, -6.215e-02, -2.484e-02, -9.233e-02, 4.768e-02, -1.974e-01, -8.080e-03, 5.666e-03, -1.172e-02, 4.765e-03, -2.743e-03, -5.749e-02, -3.136e-02, -1.183e-02, 4.700e-02, 2.595e-02)); + r += mul(s4_4, M4(-3.767e-02, 2.888e-02, 1.105e-01, 1.856e-02, 9.276e-02, 7.851e-02, -5.774e-02, -1.489e-01, -7.548e-02, -7.316e-02, 6.093e-01, 3.221e-01, -5.959e-01, 9.822e-02, 8.992e-02, 1.061e-01)); + r += mul(s4_5, M4(-5.871e-03, 9.548e-03, -1.592e-02, 1.531e-02, 5.870e-02, -3.468e-03, 4.422e-02, 2.998e-02, 3.743e-03, -5.535e-02, 3.347e-02, 1.525e-02, 3.906e-02, 6.235e-02, -1.618e-02, 1.045e-01)); + r += mul(s4_6, M4(1.008e-03, 3.806e-03, 1.244e-02, -7.620e-02, 1.407e-02, 8.177e-03, 6.615e-02, -2.112e-02, -4.001e-02, -2.659e-02, 2.051e-03, -1.621e-02, 1.130e-01, -3.558e-02, -6.091e-02, -6.975e-03)); + r += mul(s4_7, M4(-1.033e-01, 5.164e-02, -8.706e-02, 5.892e-02, -2.319e-02, -6.319e-02, -1.004e-01, 6.903e-02, 3.794e-02, -1.284e-01, 5.790e-02, -3.345e-03, -1.194e-01, 1.352e-01, -8.862e-02, 9.251e-02)); + r += mul(s4_8, M4(6.850e-02, 2.214e-02, -2.984e-02, -6.584e-03, -6.177e-02, 1.027e-01, -1.062e-04, 1.554e-02, 2.624e-02, 2.446e-02, -2.709e-02, -6.687e-03, -8.656e-03, 6.004e-02, -8.694e-02, 2.832e-02)); + r += mul(s5_0, M4(6.199e-02, -1.131e-01, 6.170e-02, -7.534e-03, -4.255e-02, 4.538e-02, -3.063e-02, 4.212e-02, 2.331e-02, -1.634e-02, -6.050e-03, -4.349e-02, 2.814e-03, -1.989e-03, -1.116e-02, -2.933e-02)); + r += mul(s5_1, M4(-3.261e-02, 7.652e-02, 6.421e-02, -1.008e-01, 5.395e-02, 5.759e-02, -1.665e-01, 1.023e-01, 5.627e-02, -2.189e-02, 8.770e-03, 1.208e-01, -1.837e-02, -5.015e-02, 3.498e-02, 4.259e-02)); + r += mul(s5_2, M4(2.237e-02, 9.596e-03, -4.689e-02, 1.668e-02, -4.693e-02, 3.892e-02, -4.201e-02, 8.341e-03, 1.646e-02, 9.753e-02, 7.488e-04, -4.371e-02, -4.316e-02, 1.629e-02, 1.219e-02, -4.465e-02)); + r += mul(s5_3, M4(1.071e-01, 1.818e-01, 1.804e-01, -4.161e-01, -5.134e-02, -2.543e-03, 4.252e-02, -1.254e-01, 8.945e-02, -6.327e-02, -1.708e-02, -7.655e-02, -1.818e-02, 1.160e-02, 5.056e-02, -9.572e-03)); + r += mul(s5_4, M4(-7.047e-02, 5.558e-02, -2.566e-01, 2.293e-02, 1.344e-01, -5.759e-02, 1.336e-01, -1.365e-01, -1.018e-01, 1.131e-01, -2.599e-04, 5.203e-02, -4.006e-02, 5.433e-02, -1.179e-02, 4.684e-02)); + r += mul(s5_5, M4(9.100e-03, -5.963e-02, -4.189e-02, 2.374e-02, -1.049e-02, -1.697e-02, 3.455e-02, 7.721e-02, 4.418e-02, 9.174e-02, 1.238e-01, 6.190e-02, 7.101e-02, 7.415e-02, 8.181e-03, 5.949e-02)); + r += mul(s5_6, M4(-3.657e-02, 8.785e-02, -1.366e-01, 3.699e-02, -5.526e-02, 3.303e-02, -1.172e-02, 5.110e-02, 1.694e-02, -4.945e-02, -1.527e-02, -5.031e-02, 4.639e-03, -3.881e-03, -2.765e-02, -5.272e-03)); + r += mul(s5_7, M4(-1.075e-01, -3.386e-02, -4.008e-03, -2.277e-01, 2.691e-02, 5.804e-02, -7.960e-02, -1.331e-02, -1.555e-03, 2.882e-02, -2.749e-02, 1.986e-02, 4.661e-02, 5.051e-03, 2.789e-04, -1.044e-02)); + r += mul(s5_8, M4(3.584e-02, 5.666e-02, 2.708e-02, -7.064e-02, -1.714e-02, 3.086e-02, -6.665e-03, 1.561e-02, 3.868e-02, 1.260e-02, 3.594e-02, 1.405e-02, 4.834e-02, 1.432e-02, -1.207e-03, -3.702e-02)); + r += mul(s6_0, M4(-7.545e-03, 5.817e-03, -3.976e-03, -6.886e-02, 1.241e-03, 3.949e-02, -9.141e-03, -2.932e-02, 3.061e-02, -3.527e-03, 4.619e-02, -6.930e-03, 4.226e-03, -3.380e-02, -4.733e-03, -9.659e-02)); + r += mul(s6_1, M4(1.434e-02, -5.702e-02, 1.086e-02, 1.870e-02, -8.674e-04, -2.612e-03, -4.122e-02, -1.223e-02, 3.054e-02, 2.505e-02, 4.928e-02, -2.850e-02, -6.155e-02, -2.670e-02, -2.795e-02, -2.198e-02)); + r += mul(s6_2, M4(3.110e-02, 1.396e-02, 4.330e-02, -5.054e-03, -1.258e-03, 9.789e-04, 2.307e-03, 3.330e-03, 1.202e-02, -1.888e-03, -7.485e-03, -3.196e-02, 4.168e-03, 1.211e-02, 4.629e-02, -1.252e-02)); + r += mul(s6_3, M4(-5.995e-02, 2.188e-02, -2.808e-02, 1.556e-02, -1.819e-02, -5.827e-03, -2.431e-02, 4.258e-02, 6.412e-03, 2.012e-02, 1.066e-02, 8.169e-02, 4.143e-02, 2.179e-01, -3.265e-02, -8.631e-03)); + r += mul(s6_4, M4(1.035e-01, -1.406e-01, 1.473e-01, 7.944e-02, -3.233e-02, -1.322e-02, 1.975e-02, 4.355e-02, -6.917e-02, 6.086e-02, 1.008e-03, -5.061e-02, -1.441e-01, 6.546e-02, -2.602e-02, -1.753e-01)); + r += mul(s6_5, M4(8.260e-02, -4.606e-02, 1.443e-01, 9.276e-03, -6.593e-03, 3.684e-02, 3.764e-02, 1.085e-03, -1.626e-02, -5.051e-02, -1.110e-02, 7.292e-02, 3.659e-02, -2.852e-02, -3.503e-02, 2.781e-02)); + r += mul(s6_6, M4(-2.993e-02, 3.806e-02, 3.685e-03, -1.483e-02, -3.055e-02, -1.343e-02, 5.796e-02, -2.555e-02, -3.573e-03, 2.753e-02, -1.052e-01, 5.268e-03, -6.556e-02, 1.491e-02, 1.841e-02, 2.626e-02)); + r += mul(s6_7, M4(6.475e-02, -1.022e-01, -1.800e-02, -6.002e-03, 1.126e-01, -1.013e-01, 1.138e-01, -5.236e-02, 5.473e-02, -4.970e-02, 7.074e-02, -2.390e-02, -2.350e-02, -2.878e-02, 2.098e-02, 7.152e-02)); + r += mul(s6_8, M4(3.902e-02, -7.221e-03, 2.533e-02, -1.634e-02, -7.790e-02, 1.895e-02, 3.363e-02, 2.468e-02, 5.341e-02, 3.363e-02, -8.903e-03, 2.315e-03, 5.390e-03, 1.790e-02, -2.082e-02, -2.614e-04)); + r += mul(s7_0, M4(4.407e-02, -4.841e-02, 8.242e-02, 2.578e-02, -2.986e-02, -2.456e-02, -3.235e-02, 2.050e-02, 1.417e-02, 3.272e-02, -5.705e-03, -5.092e-02, 3.907e-02, -7.260e-02, -9.419e-02, 1.317e-02)); + r += mul(s7_1, M4(-6.845e-03, 2.661e-02, 7.769e-03, -6.435e-02, 7.383e-03, -1.629e-02, -4.591e-02, -7.700e-02, 6.616e-02, -9.670e-03, 1.328e-02, 7.153e-02, -4.024e-02, -2.898e-02, 4.793e-02, 7.884e-02)); + r += mul(s7_2, M4(-1.220e-02, -8.752e-02, -6.199e-02, 9.084e-03, 1.325e-02, -5.939e-02, 4.166e-02, 7.510e-03, -2.051e-02, -3.170e-02, 2.921e-02, -3.657e-02, -4.016e-02, 3.860e-02, -6.299e-02, -3.094e-02)); + r += mul(s7_3, M4(1.389e-01, 8.623e-05, 2.497e-03, 6.358e-02, 2.282e-02, 5.944e-03, 9.160e-02, 6.074e-02, -4.673e-02, 8.961e-02, 4.270e-02, 1.630e-01, 5.060e-01, 5.417e-03, 1.208e-01, 3.584e-02)); + r += mul(s7_4, M4(3.425e-02, 1.627e-01, 1.463e-01, -1.593e-01, 5.820e-02, -1.009e-01, -2.588e-01, 1.984e-01, -5.505e-02, -8.789e-02, -2.568e-02, -1.750e-01, 1.750e-01, -4.991e-01, -1.489e-01, -1.970e-02)); + r += mul(s7_5, M4(-9.526e-02, -5.354e-02, 4.962e-02, 1.750e-02, -8.023e-02, 2.113e-01, -1.938e-01, -2.143e-01, 1.331e-02, 1.890e-02, 8.502e-03, 1.317e-01, 3.780e-03, -1.992e-02, 1.165e-02, 5.067e-03)); + r += mul(s7_6, M4(8.740e-04, -1.707e-02, -5.092e-03, -2.246e-02, 3.230e-02, -2.677e-02, -4.519e-02, 1.569e-02, 2.273e-02, -7.644e-02, 5.968e-02, -5.865e-02, -7.115e-02, 2.750e-02, -2.825e-02, 5.514e-02)); + r += mul(s7_7, M4(1.093e-01, -4.552e-02, -2.246e-02, 5.209e-02, 1.481e-01, -4.852e-02, -7.095e-02, 1.554e-01, -5.972e-02, 4.680e-02, 4.096e-02, 7.233e-02, -2.237e-02, -1.442e-01, 4.287e-02, 4.532e-02)); + r += mul(s7_8, M4(1.076e-03, -9.680e-02, 6.785e-03, 3.552e-02, -9.446e-02, 1.963e-02, 1.414e-01, 1.773e-02, -2.142e-02, 3.047e-02, -3.103e-02, -2.439e-02, 1.599e-03, 8.774e-03, 1.240e-02, 2.460e-02)); + r += V4(8.583e-03, -6.438e-03, 6.338e-03, 1.485e-04); + return r; +} + +void Pass9(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = Rmp8x8(tid.x) + blockStart; + uint2 size = GetInputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = (gxy + 0.5) * pt; + + V4 s0_0 = l0(-1.0, -1.0); + V4 s0_1 = l0(0.0, -1.0); + V4 s0_2 = l0(1.0, -1.0); + V4 s0_3 = l0(-1.0, 0.0); + V4 s0_4 = l0(0.0, 0.0); + V4 s0_5 = l0(1.0, 0.0); + V4 s0_6 = l0(-1.0, 1.0); + V4 s0_7 = l0(0.0, 1.0); + V4 s0_8 = l0(1.0, 1.0); + V4 s1_0 = -max(-s0_0, 0.0); + V4 s1_1 = -max(-s0_1, 0.0); + V4 s1_2 = -max(-s0_2, 0.0); + V4 s1_3 = -max(-s0_3, 0.0); + V4 s1_4 = -max(-s0_4, 0.0); + V4 s1_5 = -max(-s0_5, 0.0); + V4 s1_6 = -max(-s0_6, 0.0); + V4 s1_7 = -max(-s0_7, 0.0); + V4 s1_8 = -max(-s0_8, 0.0); + s0_0 = max(s0_0, 0.0); + s0_1 = max(s0_1, 0.0); + s0_2 = max(s0_2, 0.0); + s0_3 = max(s0_3, 0.0); + s0_4 = max(s0_4, 0.0); + s0_5 = max(s0_5, 0.0); + s0_6 = max(s0_6, 0.0); + s0_7 = max(s0_7, 0.0); + s0_8 = max(s0_8, 0.0); + + V4 s2_0 = l1(-1.0, -1.0); + V4 s2_1 = l1(0.0, -1.0); + V4 s2_2 = l1(1.0, -1.0); + V4 s2_3 = l1(-1.0, 0.0); + V4 s2_4 = l1(0.0, 0.0); + V4 s2_5 = l1(1.0, 0.0); + V4 s2_6 = l1(-1.0, 1.0); + V4 s2_7 = l1(0.0, 1.0); + V4 s2_8 = l1(1.0, 1.0); + V4 s3_0 = -max(-s2_0, 0.0); + V4 s3_1 = -max(-s2_1, 0.0); + V4 s3_2 = -max(-s2_2, 0.0); + V4 s3_3 = -max(-s2_3, 0.0); + V4 s3_4 = -max(-s2_4, 0.0); + V4 s3_5 = -max(-s2_5, 0.0); + V4 s3_6 = -max(-s2_6, 0.0); + V4 s3_7 = -max(-s2_7, 0.0); + V4 s3_8 = -max(-s2_8, 0.0); + s2_0 = max(s2_0, 0.0); + s2_1 = max(s2_1, 0.0); + s2_2 = max(s2_2, 0.0); + s2_3 = max(s2_3, 0.0); + s2_4 = max(s2_4, 0.0); + s2_5 = max(s2_5, 0.0); + s2_6 = max(s2_6, 0.0); + s2_7 = max(s2_7, 0.0); + s2_8 = max(s2_8, 0.0); + + V4 s4_0 = l2(-1.0, -1.0); + V4 s4_1 = l2(0.0, -1.0); + V4 s4_2 = l2(1.0, -1.0); + V4 s4_3 = l2(-1.0, 0.0); + V4 s4_4 = l2(0.0, 0.0); + V4 s4_5 = l2(1.0, 0.0); + V4 s4_6 = l2(-1.0, 1.0); + V4 s4_7 = l2(0.0, 1.0); + V4 s4_8 = l2(1.0, 1.0); + V4 s5_0 = -max(-s4_0, 0.0); + V4 s5_1 = -max(-s4_1, 0.0); + V4 s5_2 = -max(-s4_2, 0.0); + V4 s5_3 = -max(-s4_3, 0.0); + V4 s5_4 = -max(-s4_4, 0.0); + V4 s5_5 = -max(-s4_5, 0.0); + V4 s5_6 = -max(-s4_6, 0.0); + V4 s5_7 = -max(-s4_7, 0.0); + V4 s5_8 = -max(-s4_8, 0.0); + s4_0 = max(s4_0, 0.0); + s4_1 = max(s4_1, 0.0); + s4_2 = max(s4_2, 0.0); + s4_3 = max(s4_3, 0.0); + s4_4 = max(s4_4, 0.0); + s4_5 = max(s4_5, 0.0); + s4_6 = max(s4_6, 0.0); + s4_7 = max(s4_7, 0.0); + s4_8 = max(s4_8, 0.0); + + V4 s6_0 = l3(-1.0, -1.0); + V4 s6_1 = l3(0.0, -1.0); + V4 s6_2 = l3(1.0, -1.0); + V4 s6_3 = l3(-1.0, 0.0); + V4 s6_4 = l3(0.0, 0.0); + V4 s6_5 = l3(1.0, 0.0); + V4 s6_6 = l3(-1.0, 1.0); + V4 s6_7 = l3(0.0, 1.0); + V4 s6_8 = l3(1.0, 1.0); + V4 s7_0 = -max(-s6_0, 0.0); + V4 s7_1 = -max(-s6_1, 0.0); + V4 s7_2 = -max(-s6_2, 0.0); + V4 s7_3 = -max(-s6_3, 0.0); + V4 s7_4 = -max(-s6_4, 0.0); + V4 s7_5 = -max(-s6_5, 0.0); + V4 s7_6 = -max(-s6_6, 0.0); + V4 s7_7 = -max(-s6_7, 0.0); + V4 s7_8 = -max(-s6_8, 0.0); + s6_0 = max(s6_0, 0.0); + s6_1 = max(s6_1, 0.0); + s6_2 = max(s6_2, 0.0); + s6_3 = max(s6_3, 0.0); + s6_4 = max(s6_4, 0.0); + s6_5 = max(s6_5, 0.0); + s6_6 = max(s6_6, 0.0); + s6_7 = max(s6_7, 0.0); + s6_8 = max(s6_8, 0.0); + + t0[gxy] = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t1[gxy] = f1(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t2[gxy] = f2(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t3[gxy] = f3(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); +} + +//!PASS 10 +//!DESC out-shuffle +//!BLOCK_SIZE 16 +//!NUM_THREADS 64 +//!IN INPUT, t0, t1, t2, t3 +//!OUT OUTPUT + +#define l0(x, y) V4(O(t0, float2(x, y))) +#define l1(x, y) V4(O(t1, float2(x, y))) +#define l2(x, y) V4(O(t2, float2(x, y))) +#define l3(x, y) V4(O(t3, float2(x, y))) + +V4 f0(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(8.288e-03, -1.321e-02, -2.106e-02, -1.756e-02, 3.676e-02, 1.095e-02, 1.181e-02, -2.697e-03, 4.596e-02, 2.905e-02, 1.476e-02, 2.231e-02, 2.701e-03, 3.902e-03, -3.031e-03, 8.976e-03)); + r += mul(s0_1, M4(3.357e-02, 4.993e-02, 2.113e-02, 2.618e-02, -5.839e-02, 4.692e-03, 2.007e-02, 1.737e-02, 1.132e-02, 4.016e-02, -2.122e-02, -2.512e-02, 2.428e-02, 2.614e-02, -5.047e-02, 1.221e-02)); + r += mul(s0_2, M4(1.581e-03, 2.179e-02, -2.680e-02, -2.460e-02, 1.697e-03, -3.966e-02, -2.177e-03, 2.177e-03, 3.197e-03, 2.340e-02, -2.558e-03, 1.068e-02, 2.225e-02, 4.831e-04, 2.057e-02, -3.325e-02)); + r += mul(s0_3, M4(-8.245e-03, 1.447e-02, 4.863e-02, 3.704e-02, 9.376e-03, -1.558e-02, 4.408e-02, 5.230e-02, -1.237e-01, 2.204e-02, -4.083e-02, -7.021e-02, -3.404e-02, 2.196e-02, -5.405e-02, 1.713e-02)); + r += mul(s0_4, M4(-1.691e-02, -5.413e-02, 1.412e-02, -4.122e-02, 3.281e-02, 1.344e-01, -9.106e-02, 5.237e-02, 7.495e-02, -2.874e-01, 1.509e-01, 9.939e-02, 6.605e-02, 1.485e-02, 2.092e-01, -3.814e-02)); + r += mul(s0_5, M4(3.302e-02, 9.497e-03, 5.188e-02, 7.025e-02, -3.038e-02, -4.289e-02, 8.231e-03, -6.615e-02, -3.845e-02, 6.910e-02, -1.664e-03, 1.457e-02, -3.180e-02, -7.829e-02, -7.862e-02, -4.652e-02)); + r += mul(s0_6, M4(9.334e-03, -2.657e-02, -6.000e-02, -5.408e-02, 3.188e-02, -1.277e-02, 1.829e-02, -6.218e-02, 1.772e-02, 7.507e-03, -1.788e-02, 9.071e-03, 8.863e-03, -9.756e-03, -8.313e-04, -1.364e-02)); + r += mul(s0_7, M4(-6.391e-02, 1.455e-02, -4.018e-03, -1.183e-02, -1.013e-01, -3.137e-02, -4.261e-02, 2.507e-02, -5.843e-03, 5.284e-02, -7.524e-02, -2.047e-02, -6.055e-02, 2.008e-02, 1.745e-02, 6.396e-02)); + r += mul(s0_8, M4(9.589e-03, -7.702e-03, -1.385e-02, -3.273e-03, 7.148e-03, -2.582e-02, -1.582e-02, -4.480e-02, 1.874e-02, 7.253e-03, -7.904e-03, -2.832e-02, 9.305e-03, -1.280e-02, -3.018e-02, 9.239e-03)); + r += mul(s1_0, M4(-2.402e-03, -1.702e-02, -1.430e-02, -1.437e-02, 3.541e-02, 1.098e-02, 1.285e-02, -4.486e-03, -3.848e-03, 1.516e-02, 1.246e-02, 2.232e-02, -1.736e-02, -6.417e-03, -5.782e-03, 1.797e-02)); + r += mul(s1_1, M4(2.029e-02, 3.807e-02, 3.010e-02, 3.850e-02, -6.865e-02, -1.083e-02, 2.365e-02, 1.968e-02, -1.490e-02, -2.014e-02, -8.668e-03, -2.748e-02, -3.469e-04, 9.138e-02, -1.043e-01, 2.116e-02)); + r += mul(s1_2, M4(-7.515e-03, 3.076e-03, -2.357e-02, -1.654e-02, -4.330e-03, -3.571e-02, -3.355e-03, 4.346e-04, 5.423e-03, 9.114e-03, 3.344e-03, 2.062e-02, 2.949e-02, -7.357e-02, 1.904e-02, -2.418e-02)); + r += mul(s1_3, M4(-3.964e-02, 1.319e-02, 1.290e-02, 1.144e-02, 3.125e-02, -1.283e-02, 5.506e-02, 5.888e-02, -7.126e-03, 2.046e-03, 2.282e-02, -3.216e-02, 1.672e-02, 9.030e-03, -5.734e-02, 3.116e-02)); + r += mul(s1_4, M4(3.315e-01, 5.508e-02, -1.405e-01, -1.298e-01, 3.390e-02, 1.265e-01, -1.198e-01, 1.523e-02, 1.206e-01, -1.592e-02, -1.558e-02, 4.463e-03, -5.783e-02, 1.140e-03, 6.348e-01, -2.935e-01)); + r += mul(s1_5, M4(2.099e-02, 1.821e-01, 5.430e-02, -2.893e-03, -2.511e-02, -3.087e-02, 6.097e-03, -5.772e-02, -1.947e-02, 1.794e-02, -3.531e-03, -2.538e-02, -1.085e-01, 1.207e-01, -1.402e-01, -1.096e-01)); + r += mul(s1_6, M4(3.216e-02, -2.144e-02, -6.793e-02, -5.081e-02, 4.411e-02, -7.452e-03, 3.820e-02, -4.924e-02, -2.191e-02, -3.942e-03, -6.666e-02, -3.475e-03, 1.302e-02, -1.511e-02, -1.236e-02, -1.293e-02)); + r += mul(s1_7, M4(5.775e-03, 6.997e-02, -2.382e-01, -1.491e-01, -8.038e-02, -1.730e-02, -1.200e-02, 4.096e-02, -4.595e-02, -1.271e-02, 6.949e-02, 5.294e-03, -5.210e-02, 3.667e-03, -6.985e-02, 7.442e-02)); + r += mul(s1_8, M4(2.313e-02, 2.815e-02, -3.577e-03, -8.620e-02, 8.754e-03, -1.742e-02, -1.739e-02, -2.487e-02, 4.649e-03, -1.378e-02, -1.452e-02, 2.420e-02, -6.308e-04, -1.359e-02, -5.233e-02, 1.669e-02)); + r += mul(s2_0, M4(-3.368e-02, -3.980e-03, -9.703e-04, 1.080e-02, 9.988e-03, -1.531e-02, -4.364e-03, -1.666e-02, 3.106e-03, -5.797e-03, -9.667e-03, -1.150e-02, -2.375e-02, 2.223e-02, 2.287e-02, 2.405e-02)); + r += mul(s2_1, M4(5.779e-03, -2.728e-02, -3.430e-03, -2.802e-02, 6.992e-03, 5.027e-03, -1.433e-02, -1.959e-02, -2.256e-02, 2.146e-02, -1.511e-03, 1.838e-02, -4.855e-03, -6.710e-02, 5.815e-03, -5.167e-03)); + r += mul(s2_2, M4(-1.631e-02, -4.753e-03, 6.240e-03, 2.216e-02, -7.764e-04, 2.601e-02, -1.759e-02, -1.272e-02, -9.234e-03, 1.193e-02, -1.557e-02, 9.221e-03, 3.824e-03, 1.605e-02, -1.521e-03, 4.219e-03)); + r += mul(s2_3, M4(5.929e-02, -1.351e-02, -3.640e-02, -7.495e-02, 2.995e-04, -5.310e-03, 9.308e-03, 5.831e-03, -3.071e-02, 3.279e-02, 2.226e-02, 2.718e-02, -7.876e-02, -1.108e-02, -1.091e-01, -3.100e-03)); + r += mul(s2_4, M4(2.597e-01, 2.576e-01, -1.353e-01, -3.268e-02, -1.675e-02, -1.212e-02, -1.013e-01, 7.113e-03, -1.483e-01, -6.736e-02, -1.158e-01, -5.368e-02, -2.017e-02, -1.257e-01, -7.094e-02, -2.066e-01)); + r += mul(s2_5, M4(-6.604e-03, 4.490e-02, -1.689e-02, -8.739e-02, -1.825e-02, 2.317e-02, -7.293e-03, 6.325e-02, -3.538e-02, 2.314e-01, -3.612e-03, 9.028e-02, 1.150e-02, 3.354e-02, 2.008e-02, 4.114e-02)); + r += mul(s2_6, M4(-6.085e-02, 8.006e-03, 5.597e-03, 4.375e-03, 5.102e-02, -7.769e-03, 5.785e-02, -3.648e-02, 2.499e-02, -1.236e-02, -2.100e-02, -9.887e-03, 1.139e-02, 1.272e-02, 9.081e-03, 2.087e-03)); + r += mul(s2_7, M4(-2.607e-02, -9.075e-02, 3.944e-02, 8.550e-02, 1.373e-02, 2.031e-02, 1.814e-02, -7.935e-02, -4.653e-02, 8.520e-02, -8.139e-02, 5.661e-02, 1.263e-02, 1.954e-02, 2.187e-02, 3.499e-02)); + r += mul(s2_8, M4(-1.408e-02, -2.322e-02, -2.956e-02, -5.237e-02, -3.299e-02, -6.760e-03, 3.166e-02, 9.487e-02, 4.560e-03, 5.893e-03, -5.681e-02, 1.580e-01, 1.593e-03, 1.052e-03, 5.417e-03, 1.003e-02)); + r += mul(s3_0, M4(-1.585e-02, -6.165e-03, -6.595e-03, 6.867e-03, 2.167e-02, -1.104e-02, -5.165e-03, -1.270e-02, -1.542e-03, -9.897e-04, -9.215e-03, -7.713e-03, -3.071e-02, 2.166e-02, 2.315e-02, 2.699e-02)); + r += mul(s3_1, M4(2.748e-02, -9.194e-03, -9.189e-03, -3.307e-02, 2.411e-02, 8.146e-03, -1.984e-02, -1.898e-02, -1.813e-02, 4.340e-03, 5.052e-03, 1.439e-02, -1.342e-02, -7.745e-02, 4.404e-03, -8.122e-03)); + r += mul(s3_2, M4(-9.177e-03, 1.751e-02, 4.400e-03, 2.236e-02, 4.106e-03, -8.324e-03, -2.258e-02, -2.498e-03, 4.850e-03, -1.186e-02, -1.428e-02, -8.462e-03, 1.590e-03, 1.123e-02, -6.362e-03, 1.537e-03)); + r += mul(s3_3, M4(1.300e-02, -2.392e-02, 1.641e-02, -5.358e-02, 2.303e-02, 9.964e-04, 2.607e-02, 1.629e-02, -4.236e-02, 3.306e-02, 1.082e-02, 3.368e-02, -9.061e-02, -1.555e-02, -1.254e-01, -9.231e-03)); + r += mul(s3_4, M4(1.093e-02, 6.117e-02, -2.334e-02, 7.731e-02, -1.889e-01, -4.521e-02, -1.381e-01, 4.990e-02, -3.273e-03, -1.392e-01, -5.917e-02, -1.084e-01, -4.124e-02, -1.464e-01, -8.814e-02, -2.305e-01)); + r += mul(s3_5, M4(2.954e-03, -2.640e-02, -1.878e-02, -4.553e-02, -1.245e-01, 3.719e-01, 7.327e-02, -8.666e-02, 7.281e-02, 6.134e-02, 6.567e-02, 7.487e-03, 7.990e-03, 2.353e-02, 1.700e-02, 3.026e-02)); + r += mul(s3_6, M4(-1.941e-02, 4.529e-03, -4.042e-02, 2.598e-03, 4.582e-02, -7.800e-03, 3.671e-02, -2.995e-02, 1.575e-02, -9.918e-03, -3.626e-02, -7.104e-03, 1.194e-02, 1.250e-02, 1.155e-03, -5.683e-04)); + r += mul(s3_7, M4(1.277e-02, -1.435e-02, 1.008e-01, 3.798e-02, -1.700e-03, 2.830e-02, 2.744e-01, -1.602e-01, -3.744e-02, 9.253e-02, 9.984e-03, 2.357e-02, 7.448e-03, 1.759e-02, 1.404e-02, 2.423e-02)); + r += mul(s3_8, M4(-2.164e-02, -2.065e-02, -2.798e-02, 4.532e-03, -2.055e-02, -4.854e-02, -2.606e-02, 1.503e-02, 2.083e-02, -1.722e-02, 1.066e-02, 5.132e-02, 3.575e-04, -2.594e-03, 2.816e-03, 5.034e-03)); + r += mul(s4_0, M4(-1.426e-02, 1.257e-02, 1.033e-02, 1.935e-02, -3.030e-02, 1.229e-02, -4.250e-03, 6.165e-03, -1.997e-03, -9.436e-03, -2.618e-02, -1.437e-02, -1.190e-02, -2.632e-02, 2.175e-02, 2.317e-02)); + r += mul(s4_1, M4(2.095e-01, -5.779e-02, 5.158e-02, 2.231e-03, -4.922e-02, -8.571e-02, -4.875e-02, 2.141e-02, 9.009e-02, -1.725e-02, -5.313e-02, -2.566e-02, 1.735e-02, 4.925e-02, 1.420e-02, 1.780e-02)); + r += mul(s4_2, M4(-9.185e-02, -5.607e-02, -8.766e-02, -1.148e-01, -3.548e-03, -2.415e-02, -2.607e-02, -2.083e-02, 1.337e-03, 5.432e-02, 6.464e-03, 3.675e-03, 5.501e-03, -3.110e-03, 1.074e-02, 2.205e-02)); + r += mul(s4_3, M4(3.402e-02, -2.865e-02, -1.933e-02, -3.812e-02, -4.599e-02, 3.587e-03, -5.386e-02, 4.163e-02, 6.190e-02, -1.407e-02, 1.190e-02, -6.332e-03, 1.268e-01, 7.919e-03, -1.616e-01, 9.103e-03)); + r += mul(s4_4, M4(-1.923e-02, 1.850e-02, 2.046e-01, -1.099e-01, 1.178e-01, 2.343e-01, 2.749e-01, -1.415e-01, -3.663e-01, 2.106e-01, 1.741e-01, 7.106e-02, 2.185e-01, 2.617e-01, -2.407e-01, -4.685e-01)); + r += mul(s4_5, M4(-7.289e-02, 1.753e-02, -6.698e-02, 1.516e-01, -2.065e-02, -4.328e-02, -4.114e-02, -1.211e-02, 4.070e-02, 5.314e-02, -3.458e-02, -2.126e-01, -3.308e-03, 6.276e-02, -2.422e-03, 5.390e-03)); + r += mul(s4_6, M4(-2.044e-02, 9.857e-03, -5.566e-03, 1.947e-02, -2.924e-03, -2.792e-02, -2.582e-02, -1.406e-02, 4.819e-02, -3.570e-02, 5.594e-02, -4.488e-02, 1.468e-02, -1.481e-02, 2.532e-02, 4.259e-03)); + r += mul(s4_7, M4(4.942e-02, -2.351e-02, 6.075e-03, -4.373e-03, -1.144e-02, 5.010e-03, -1.145e-03, 3.259e-02, -1.478e-03, -5.162e-03, 4.193e-03, -8.413e-02, -4.683e-02, 2.837e-03, -2.870e-02, -3.504e-02)); + r += mul(s4_8, M4(-9.462e-03, 3.463e-04, -3.184e-02, -2.237e-02, -5.753e-03, -8.946e-03, -1.983e-02, 1.403e-02, 3.208e-04, -6.783e-03, 2.986e-02, 9.583e-02, 9.652e-03, -1.106e-02, 2.724e-02, 4.058e-02)); + r += mul(s5_0, M4(-4.553e-03, 1.354e-02, 1.294e-02, 2.198e-02, -3.796e-02, 1.777e-03, -1.345e-02, -2.558e-03, 6.565e-03, -8.288e-03, -1.664e-02, -1.294e-02, -5.033e-03, -5.418e-03, 3.318e-03, 9.769e-03)); + r += mul(s5_1, M4(2.888e-03, -1.481e-02, 1.988e-02, -5.457e-03, -3.176e-02, -4.046e-02, -3.968e-02, -7.777e-03, 3.050e-03, 1.551e-02, -4.423e-02, -2.049e-02, -2.785e-03, 8.283e-03, 8.081e-03, 5.535e-03)); + r += mul(s5_2, M4(-7.639e-03, 5.054e-03, -6.512e-02, -4.601e-02, -1.182e-02, -4.087e-02, -1.517e-02, -3.973e-02, 1.923e-02, -3.636e-03, 2.031e-02, -7.553e-03, 6.687e-03, 1.134e-02, 6.916e-03, 1.592e-02)); + r += mul(s5_3, M4(5.164e-02, -3.007e-02, 6.146e-04, -4.163e-02, -2.801e-02, 7.026e-03, -2.300e-02, 1.935e-02, -3.085e-03, -6.896e-03, 2.654e-02, -5.054e-03, -1.381e-02, 3.617e-03, -2.664e-02, -2.407e-03)); + r += mul(s5_4, M4(-5.210e-02, 6.646e-02, -5.044e-02, -2.083e-02, 1.804e-01, 6.674e-02, 1.508e-01, 7.434e-03, 7.070e-02, 1.608e-02, -3.052e-02, 1.301e-03, 1.424e-02, -3.447e-02, 8.955e-03, -5.847e-02)); + r += mul(s5_5, M4(2.626e-03, -2.935e-02, 9.258e-02, 9.205e-02, -2.765e-02, 1.139e-03, -2.845e-02, -1.555e-02, -5.127e-02, 1.636e-02, -3.642e-02, 4.822e-02, -1.547e-02, 1.102e-02, -5.527e-03, 7.313e-03)); + r += mul(s5_6, M4(-2.205e-02, 7.127e-03, 3.632e-03, 1.646e-02, -1.045e-02, -9.007e-03, -3.836e-02, -2.190e-02, 2.273e-02, -3.534e-03, 1.640e-02, -4.160e-02, 1.927e-02, -9.104e-03, 3.589e-02, -3.850e-03)); + r += mul(s5_7, M4(3.426e-02, -1.793e-02, 2.421e-02, 1.227e-02, -1.653e-02, 1.187e-02, 2.618e-02, 1.769e-03, -5.266e-02, -9.613e-03, 7.193e-03, 8.483e-03, -1.251e-02, 1.625e-02, -4.461e-02, -3.639e-03)); + r += mul(s5_8, M4(-5.050e-03, 1.453e-02, -2.586e-02, -2.142e-02, -5.868e-03, -6.412e-03, -1.996e-02, 1.883e-02, -3.762e-04, -2.114e-02, 1.910e-02, 1.897e-02, 7.753e-03, -1.023e-03, 1.424e-02, 4.169e-03)); + r += mul(s6_0, M4(-3.845e-03, 1.689e-02, 5.021e-03, 1.254e-02, -1.487e-03, 3.818e-02, -1.402e-02, 2.054e-02, -3.812e-03, 2.115e-02, 2.435e-02, 2.093e-02, 1.783e-02, -4.674e-03, -3.655e-03, 3.153e-03)); + r += mul(s6_1, M4(5.142e-03, -6.075e-02, 1.070e-02, -2.858e-02, 7.935e-02, -9.109e-02, 4.375e-02, 1.193e-02, -9.096e-02, -7.053e-02, -1.485e-02, -7.337e-03, 1.038e-01, 3.523e-02, 1.287e-02, 3.620e-02)); + r += mul(s6_2, M4(-1.055e-02, 3.804e-02, -1.936e-02, 2.036e-02, -9.637e-03, 2.061e-02, -1.709e-02, 1.762e-02, 3.860e-03, -3.284e-02, 8.486e-03, 8.479e-03, 4.988e-03, 2.713e-02, -1.273e-02, -2.067e-02)); + r += mul(s6_3, M4(2.856e-03, 1.376e-02, 1.553e-02, 1.966e-02, 6.574e-02, 1.731e-02, 9.099e-02, 4.415e-02, 8.429e-04, -9.494e-03, -2.708e-03, -2.939e-03, 1.001e-01, -7.926e-03, 3.623e-02, 6.166e-02)); + r += mul(s6_4, M4(-5.182e-02, -8.474e-03, -7.333e-02, -3.194e-02, 2.440e-01, -3.135e-01, 1.841e-01, -3.585e-01, 1.917e-01, 1.126e-01, -7.704e-02, -6.519e-02, -4.877e-01, 1.928e-01, 4.962e-02, -2.862e-01)); + r += mul(s6_5, M4(7.056e-02, -4.759e-03, 7.693e-02, -1.180e-02, -1.746e-03, 7.848e-03, 2.640e-02, 1.388e-02, -4.918e-02, -9.407e-03, -1.582e-02, -4.991e-02, 2.390e-02, 1.084e-02, -5.813e-02, 9.644e-02)); + r += mul(s6_6, M4(1.613e-02, -9.781e-03, -1.865e-02, -4.360e-03, -8.337e-03, 5.040e-03, -1.687e-02, 4.597e-04, -3.722e-02, 1.425e-02, -1.447e-02, 2.435e-02, 1.344e-02, -1.216e-02, -3.054e-04, -3.275e-02)); + r += mul(s6_7, M4(-9.062e-03, 3.863e-02, 4.212e-02, -2.035e-04, -1.452e-02, 9.739e-03, 8.968e-02, -7.169e-02, 2.987e-02, -2.008e-02, 1.045e-01, 7.690e-02, 3.761e-02, -3.235e-02, 1.704e-01, 9.325e-02)); + r += mul(s6_8, M4(-1.967e-02, -2.017e-02, -4.216e-02, 7.447e-03, -5.092e-03, 2.067e-03, -2.545e-02, -7.547e-03, -1.169e-02, -9.225e-03, -1.654e-02, 1.105e-02, 1.381e-02, 1.372e-02, 1.354e-02, -1.234e-01)); + r += mul(s7_0, M4(-3.337e-03, 8.507e-03, -3.598e-03, 5.681e-03, 1.162e-02, 1.914e-02, -2.418e-03, 8.949e-03, -5.832e-03, 1.836e-02, 2.189e-02, 1.753e-02, 2.472e-02, -1.509e-03, -8.574e-03, -5.146e-03)); + r += mul(s7_1, M4(5.323e-02, -1.037e-02, 9.631e-03, -2.247e-02, -1.439e-02, -1.350e-02, 4.510e-02, -2.726e-03, -3.537e-02, -4.546e-02, -4.999e-03, -8.271e-03, 3.596e-02, 4.316e-02, 2.662e-02, 3.942e-02)); + r += mul(s7_2, M4(-7.218e-03, -6.411e-03, -1.728e-02, 3.503e-02, -3.096e-03, -4.575e-03, -5.780e-03, 6.029e-03, -1.083e-02, -5.370e-03, 1.031e-02, 1.510e-02, 2.472e-03, 9.614e-03, -2.293e-04, -1.862e-02)); + r += mul(s7_3, M4(3.626e-02, 9.689e-03, 4.372e-02, 9.929e-03, -1.615e-03, 1.196e-02, 3.210e-02, 4.786e-02, -9.144e-03, 6.885e-03, -1.638e-03, -5.414e-03, 1.300e-02, 1.148e-02, -4.992e-03, 5.277e-02)); + r += mul(s7_4, M4(-2.144e-01, 8.854e-02, -5.507e-02, 9.481e-02, 9.738e-03, -1.262e-02, -9.155e-02, -4.065e-02, 2.764e-01, 8.610e-02, -2.896e-01, -1.021e-01, -8.618e-02, -3.892e-02, -3.471e-02, -9.937e-02)); + r += mul(s7_5, M4(1.219e-01, -1.227e-01, 9.791e-02, -1.922e-01, 1.401e-02, 1.540e-02, 3.960e-02, 1.178e-02, -1.002e-02, 1.329e-01, -2.955e-02, -2.166e-01, 2.488e-03, -8.343e-04, -3.448e-02, -3.006e-03)); + r += mul(s7_6, M4(1.627e-02, -1.631e-02, -8.284e-03, -1.098e-02, 4.314e-03, -3.418e-03, -1.261e-02, -1.564e-02, -4.235e-02, 2.073e-02, 2.123e-02, 1.715e-02, 1.017e-02, -4.602e-04, 1.562e-02, -2.705e-02)); + r += mul(s7_7, M4(-1.332e-02, 3.030e-02, -7.299e-02, 2.072e-03, -2.778e-02, -2.832e-03, 8.620e-03, 4.325e-03, -7.304e-04, -4.965e-02, 1.513e-01, 1.655e-01, 6.935e-05, -3.351e-02, 8.485e-02, -4.985e-03)); + r += mul(s7_8, M4(-1.102e-02, -6.604e-03, -1.332e-02, 2.311e-02, -3.667e-03, -1.546e-02, -1.896e-02, -2.554e-02, -1.369e-02, -2.191e-02, -2.209e-02, -7.603e-03, -1.588e-02, -3.563e-03, -2.569e-02, 5.890e-02)); + r += V4(4.986e-04, 3.006e-04, 5.437e-04, 6.561e-04); + return tanh(r); +} + +void Pass10(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = (Rmp8x8(tid.x) << 1) + blockStart; + uint2 size = GetOutputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = ((gxy >> 1) + 0.5) * pt; + + V4 s0_0 = l0(-1.0, -1.0); + V4 s0_1 = l0(0.0, -1.0); + V4 s0_2 = l0(1.0, -1.0); + V4 s0_3 = l0(-1.0, 0.0); + V4 s0_4 = l0(0.0, 0.0); + V4 s0_5 = l0(1.0, 0.0); + V4 s0_6 = l0(-1.0, 1.0); + V4 s0_7 = l0(0.0, 1.0); + V4 s0_8 = l0(1.0, 1.0); + V4 s1_0 = -max(-s0_0, 0.0); + V4 s1_1 = -max(-s0_1, 0.0); + V4 s1_2 = -max(-s0_2, 0.0); + V4 s1_3 = -max(-s0_3, 0.0); + V4 s1_4 = -max(-s0_4, 0.0); + V4 s1_5 = -max(-s0_5, 0.0); + V4 s1_6 = -max(-s0_6, 0.0); + V4 s1_7 = -max(-s0_7, 0.0); + V4 s1_8 = -max(-s0_8, 0.0); + s0_0 = max(s0_0, 0.0); + s0_1 = max(s0_1, 0.0); + s0_2 = max(s0_2, 0.0); + s0_3 = max(s0_3, 0.0); + s0_4 = max(s0_4, 0.0); + s0_5 = max(s0_5, 0.0); + s0_6 = max(s0_6, 0.0); + s0_7 = max(s0_7, 0.0); + s0_8 = max(s0_8, 0.0); + + V4 s2_0 = l1(-1.0, -1.0); + V4 s2_1 = l1(0.0, -1.0); + V4 s2_2 = l1(1.0, -1.0); + V4 s2_3 = l1(-1.0, 0.0); + V4 s2_4 = l1(0.0, 0.0); + V4 s2_5 = l1(1.0, 0.0); + V4 s2_6 = l1(-1.0, 1.0); + V4 s2_7 = l1(0.0, 1.0); + V4 s2_8 = l1(1.0, 1.0); + V4 s3_0 = -max(-s2_0, 0.0); + V4 s3_1 = -max(-s2_1, 0.0); + V4 s3_2 = -max(-s2_2, 0.0); + V4 s3_3 = -max(-s2_3, 0.0); + V4 s3_4 = -max(-s2_4, 0.0); + V4 s3_5 = -max(-s2_5, 0.0); + V4 s3_6 = -max(-s2_6, 0.0); + V4 s3_7 = -max(-s2_7, 0.0); + V4 s3_8 = -max(-s2_8, 0.0); + s2_0 = max(s2_0, 0.0); + s2_1 = max(s2_1, 0.0); + s2_2 = max(s2_2, 0.0); + s2_3 = max(s2_3, 0.0); + s2_4 = max(s2_4, 0.0); + s2_5 = max(s2_5, 0.0); + s2_6 = max(s2_6, 0.0); + s2_7 = max(s2_7, 0.0); + s2_8 = max(s2_8, 0.0); + + V4 s4_0 = l2(-1.0, -1.0); + V4 s4_1 = l2(0.0, -1.0); + V4 s4_2 = l2(1.0, -1.0); + V4 s4_3 = l2(-1.0, 0.0); + V4 s4_4 = l2(0.0, 0.0); + V4 s4_5 = l2(1.0, 0.0); + V4 s4_6 = l2(-1.0, 1.0); + V4 s4_7 = l2(0.0, 1.0); + V4 s4_8 = l2(1.0, 1.0); + V4 s5_0 = -max(-s4_0, 0.0); + V4 s5_1 = -max(-s4_1, 0.0); + V4 s5_2 = -max(-s4_2, 0.0); + V4 s5_3 = -max(-s4_3, 0.0); + V4 s5_4 = -max(-s4_4, 0.0); + V4 s5_5 = -max(-s4_5, 0.0); + V4 s5_6 = -max(-s4_6, 0.0); + V4 s5_7 = -max(-s4_7, 0.0); + V4 s5_8 = -max(-s4_8, 0.0); + s4_0 = max(s4_0, 0.0); + s4_1 = max(s4_1, 0.0); + s4_2 = max(s4_2, 0.0); + s4_3 = max(s4_3, 0.0); + s4_4 = max(s4_4, 0.0); + s4_5 = max(s4_5, 0.0); + s4_6 = max(s4_6, 0.0); + s4_7 = max(s4_7, 0.0); + s4_8 = max(s4_8, 0.0); + + V4 s6_0 = l3(-1.0, -1.0); + V4 s6_1 = l3(0.0, -1.0); + V4 s6_2 = l3(1.0, -1.0); + V4 s6_3 = l3(-1.0, 0.0); + V4 s6_4 = l3(0.0, 0.0); + V4 s6_5 = l3(1.0, 0.0); + V4 s6_6 = l3(-1.0, 1.0); + V4 s6_7 = l3(0.0, 1.0); + V4 s6_8 = l3(1.0, 1.0); + V4 s7_0 = -max(-s6_0, 0.0); + V4 s7_1 = -max(-s6_1, 0.0); + V4 s7_2 = -max(-s6_2, 0.0); + V4 s7_3 = -max(-s6_3, 0.0); + V4 s7_4 = -max(-s6_4, 0.0); + V4 s7_5 = -max(-s6_5, 0.0); + V4 s7_6 = -max(-s6_6, 0.0); + V4 s7_7 = -max(-s6_7, 0.0); + V4 s7_8 = -max(-s6_8, 0.0); + s6_0 = max(s6_0, 0.0); + s6_1 = max(s6_1, 0.0); + s6_2 = max(s6_2, 0.0); + s6_3 = max(s6_3, 0.0); + s6_4 = max(s6_4, 0.0); + s6_5 = max(s6_5, 0.0); + s6_6 = max(s6_6, 0.0); + s6_7 = max(s6_7, 0.0); + s6_8 = max(s6_8, 0.0); + + V4 r = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + + static const float3x3 rgb2yuv = {0.299, 0.587, 0.114, -0.169, -0.331, 0.5, 0.5, -0.419, -0.081}; + static const float3x3 yuv2rgb = {1, -0.00093, 1.401687, 1, -0.3437, -0.71417, 1, 1.77216, 0.00099}; + float2 opt = float2(GetOutputPt()); + + pos -= 0.5f * opt; + float3 yuv = mul(rgb2yuv, INPUT.SampleLevel(SL, pos, 0).rgb); + OUTPUT[gxy] = float4(mul(yuv2rgb, float3(saturate(yuv.r + r.x), yuv.yz)), 1); + + ++gxy.x; + pos.x += opt.x; + yuv = mul(rgb2yuv, INPUT.SampleLevel(SL, pos, 0).rgb); + OUTPUT[gxy] = float4(mul(yuv2rgb, float3(saturate(yuv.r + r.y), yuv.yz)), 1); + + ++gxy.y; + pos.y += opt.y; + yuv = mul(rgb2yuv, INPUT.SampleLevel(SL, pos, 0).rgb); + OUTPUT[gxy] = float4(mul(yuv2rgb, float3(saturate(yuv.r + r.w), yuv.yz)), 1); + + --gxy.x; + pos.x -= opt.x; + yuv = mul(rgb2yuv, INPUT.SampleLevel(SL, pos, 0).rgb); + OUTPUT[gxy] = float4(mul(yuv2rgb, float3(saturate(yuv.r + r.z), yuv.yz)), 1); +} diff --git a/src/Effects/CuNNy/CuNNy-8x16C-NVL.hlsl b/src/Effects/CuNNy/CuNNy-8x16C-NVL.hlsl new file mode 100644 index 000000000..281154388 --- /dev/null +++ b/src/Effects/CuNNy/CuNNy-8x16C-NVL.hlsl @@ -0,0 +1,4027 @@ +// CuNNy 8x16C BILINEAR RGB NVL - https://github.com/cunnyplapper/CuNNy + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +//!MAGPIE EFFECT +//!VERSION 4 +//!SORT_NAME CuNNy-D16N08 + +//!TEXTURE +Texture2D INPUT; + +//!TEXTURE +//!WIDTH INPUT_WIDTH * 2 +//!HEIGHT INPUT_HEIGHT * 2 +Texture2D OUTPUT; + +//!SAMPLER +//!FILTER POINT +SamplerState SP; + +//!SAMPLER +//!FILTER LINEAR +SamplerState SL; + +//!COMMON +#define O(t, p) t.SampleLevel(SP, pos + p * pt, 0) +#define V4 min16float4 +#define M4 min16float4x4 + +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +//!FORMAT R8G8B8A8_SNORM +Texture2D t0; + +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +//!FORMAT R8G8B8A8_SNORM +Texture2D t1; + +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +//!FORMAT R8G8B8A8_SNORM +Texture2D t2; + +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +//!FORMAT R8G8B8A8_SNORM +Texture2D t3; + +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +//!FORMAT R8G8B8A8_SNORM +Texture2D t4; + +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +//!FORMAT R8G8B8A8_SNORM +Texture2D t5; + +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +//!FORMAT R8G8B8A8_SNORM +Texture2D t6; + +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +//!FORMAT R8G8B8A8_SNORM +Texture2D t7; + +//!PASS 1 +//!DESC in +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 +//!IN INPUT +//!OUT t0, t1, t2, t3 + +#define l0(x, y) min16float((dot(float3(2.271e-01, 4.365e-01, 9.234e-02), O(INPUT, float2(x, y)).rgb) + -4.932e-01)) + +V4 f0(min16float s0_0, min16float s0_1, min16float s0_2, min16float s0_3, min16float s0_4, min16float s0_5, min16float s0_6, min16float s0_7, min16float s0_8) { + V4 r = 0.0; + r += V4(-2.811e-02, 2.484e-02, 8.152e-03, -1.120e-01) * s0_0; + r += V4(-3.057e-02, 1.311e-02, 6.150e-04, -2.159e-03) * s0_1; + r += V4(-1.407e-02, -3.651e-02, -3.011e-02, 1.178e-03) * s0_2; + r += V4(2.646e-01, -6.081e-02, -3.473e-03, 8.330e-02) * s0_3; + r += V4(-1.848e-02, 1.380e-01, -2.730e-02, -8.572e-02) * s0_4; + r += V4(2.680e-02, -1.536e-02, 1.157e-01, 1.092e-01) * s0_5; + r += V4(-3.694e-02, -1.645e-01, 9.501e-03, -1.749e-02) * s0_6; + r += V4(-3.178e-02, 5.182e-02, 1.843e-02, 1.107e-01) * s0_7; + r += V4(-4.695e-03, 5.493e-02, 1.829e-02, -4.980e-02) * s0_8; + r += V4(5.208e-02, -8.290e-03, 2.168e-03, 1.841e-03); + return r; +} + +V4 f1(min16float s0_0, min16float s0_1, min16float s0_2, min16float s0_3, min16float s0_4, min16float s0_5, min16float s0_6, min16float s0_7, min16float s0_8) { + V4 r = 0.0; + r += V4(3.963e-04, -3.350e-01, -9.155e-02, -2.133e-02) * s0_0; + r += V4(1.792e-01, 3.877e-01, -1.398e-01, -8.170e-03) * s0_1; + r += V4(-1.861e-01, -6.714e-02, 7.203e-02, 3.912e-02) * s0_2; + r += V4(-4.146e-03, 1.344e-01, 1.741e-01, 7.374e-02) * s0_3; + r += V4(-2.301e-01, -1.333e-01, -2.999e-01, 8.431e-02) * s0_4; + r += V4(2.309e-01, 1.260e-02, -8.470e-02, -8.617e-02) * s0_5; + r += V4(-4.725e-03, 1.410e-02, 1.814e-01, -8.658e-02) * s0_6; + r += V4(3.358e-02, -1.292e-02, 2.253e-01, 1.051e-01) * s0_7; + r += V4(-2.100e-02, -3.521e-03, -3.845e-02, -2.268e-02) * s0_8; + r += V4(-3.218e-03, 2.366e-03, -5.615e-03, -1.653e-02); + return r; +} + +V4 f2(min16float s0_0, min16float s0_1, min16float s0_2, min16float s0_3, min16float s0_4, min16float s0_5, min16float s0_6, min16float s0_7, min16float s0_8) { + V4 r = 0.0; + r += V4(1.224e-01, 3.559e-03, 8.155e-03, -7.150e-02) * s0_0; + r += V4(-3.380e-02, 2.165e-01, 2.783e-01, -1.733e-01) * s0_1; + r += V4(2.199e-03, 8.188e-02, 5.409e-02, 5.578e-02) * s0_2; + r += V4(-5.406e-02, -1.757e-02, 1.233e-01, -2.783e-01) * s0_3; + r += V4(-2.804e-02, -2.474e-01, -4.381e-01, 2.157e-01) * s0_4; + r += V4(-9.010e-04, -5.054e-02, -4.162e-02, 6.518e-02) * s0_5; + r += V4(1.605e-02, -3.841e-03, -8.540e-03, 1.233e-01) * s0_6; + r += V4(5.971e-02, 5.600e-02, -6.272e-03, 8.912e-02) * s0_7; + r += V4(6.856e-03, -2.717e-02, 2.613e-02, -2.536e-02) * s0_8; + r += V4(1.307e-03, 1.096e-02, -1.139e-02, 4.148e-05); + return r; +} + +V4 f3(min16float s0_0, min16float s0_1, min16float s0_2, min16float s0_3, min16float s0_4, min16float s0_5, min16float s0_6, min16float s0_7, min16float s0_8) { + V4 r = 0.0; + r += V4(-4.770e-03, 2.395e-02, 5.034e-02, -9.936e-03) * s0_0; + r += V4(-1.666e-02, -1.328e-02, 1.166e-01, 2.045e-02) * s0_1; + r += V4(-2.423e-02, -7.371e-03, -1.666e-01, 2.468e-02) * s0_2; + r += V4(-2.045e-02, 1.276e-02, 5.554e-02, -1.668e-02) * s0_3; + r += V4(4.601e-01, -2.658e-01, 5.586e-02, -2.036e-01) * s0_4; + r += V4(6.315e-02, 1.528e-01, -1.345e-01, 1.167e-01) * s0_5; + r += V4(-2.105e-03, -5.846e-02, -7.890e-03, 1.110e-02) * s0_6; + r += V4(-2.450e-02, -8.582e-02, 2.247e-02, 1.425e-01) * s0_7; + r += V4(-2.825e-02, 2.409e-01, 8.078e-03, -7.072e-03) * s0_8; + r += V4(-9.510e-02, 6.547e-03, 7.733e-03, 2.232e-02); + return r; +} + +void Pass1(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = Rmp8x8(tid.x) + blockStart; + uint2 size = GetInputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = (gxy + 0.5) * pt; + + min16float s0_0 = l0(-1.0, -1.0); + min16float s0_1 = l0(0.0, -1.0); + min16float s0_2 = l0(1.0, -1.0); + min16float s0_3 = l0(-1.0, 0.0); + min16float s0_4 = l0(0.0, 0.0); + min16float s0_5 = l0(1.0, 0.0); + min16float s0_6 = l0(-1.0, 1.0); + min16float s0_7 = l0(0.0, 1.0); + min16float s0_8 = l0(1.0, 1.0); + + t0[gxy] = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8); + t1[gxy] = f1(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8); + t2[gxy] = f2(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8); + t3[gxy] = f3(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8); +} + +//!PASS 2 +//!DESC conv1 +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 +//!IN t0, t1, t2, t3 +//!OUT t4, t5, t6, t7 + +#define l0(x, y) V4(O(t0, float2(x, y))) +#define l1(x, y) V4(O(t1, float2(x, y))) +#define l2(x, y) V4(O(t2, float2(x, y))) +#define l3(x, y) V4(O(t3, float2(x, y))) + +V4 f0(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-2.485e-02, -7.793e-02, -1.391e-01, 1.353e-01, 1.305e-01, 2.742e-01, -1.513e-01, -7.074e-02, -2.830e-01, -1.284e-02, 7.441e-02, -2.870e-02, 3.071e-03, -2.819e-03, -7.844e-02, 6.126e-02)); + r += mul(s0_1, M4(2.001e-01, -3.732e-02, -5.838e-02, 1.521e-01, 2.003e-01, -2.565e-01, -2.830e-01, -8.331e-03, 1.059e-01, 1.106e-01, -9.151e-02, 1.678e-01, -6.968e-02, 1.177e-01, 7.009e-02, -2.027e-01)); + r += mul(s0_2, M4(2.422e-02, -7.541e-02, -1.327e-01, 1.145e-01, 2.656e-02, 7.576e-02, -1.218e-01, -2.693e-02, 4.026e-02, -2.779e-02, 2.237e-02, 7.016e-03, -1.143e-01, 1.814e-01, 1.175e-01, 2.384e-02)); + r += mul(s0_3, M4(2.299e-01, -1.172e-02, -1.626e-01, 2.057e-02, 1.941e-01, -2.038e-01, 1.522e-01, -1.223e-01, 4.546e-01, -1.078e-01, -7.791e-02, 9.659e-02, -1.704e-01, -4.998e-02, 4.930e-02, 5.194e-02)); + r += mul(s0_4, M4(5.608e-01, 4.285e-02, -2.509e-02, -1.151e-01, 5.909e-02, 4.300e-02, 1.090e-01, -1.141e-01, 3.319e-02, -5.049e-01, 1.955e-01, 4.758e-02, 2.172e-01, 1.379e-01, -6.424e-02, 5.035e-02)); + r += mul(s0_5, M4(7.594e-01, -6.796e-02, 1.366e-01, -1.236e-01, 2.804e-01, -4.411e-03, 2.242e-01, -6.970e-02, -9.327e-02, -2.049e-01, 1.850e-02, -6.979e-02, 6.384e-02, 5.082e-02, 1.190e-02, -1.455e-02)); + r += mul(s0_6, M4(-3.605e-02, -3.102e-02, 8.660e-02, -1.093e-01, 1.433e-01, 3.220e-03, 8.072e-02, -2.325e-02, -4.192e-01, -1.610e-01, -7.125e-02, -4.631e-02, -5.018e-02, 2.527e-02, 8.482e-02, -8.232e-02)); + r += mul(s0_7, M4(9.651e-02, -3.884e-02, 1.191e-01, -1.640e-01, -6.699e-02, -1.876e-02, 3.375e-01, -5.633e-02, -1.872e-01, 2.687e-01, 1.714e-01, -1.203e-01, -4.437e-02, 4.755e-02, -3.764e-02, -1.596e-01)); + r += mul(s0_8, M4(3.349e-02, -1.671e-03, 1.049e-01, -5.840e-03, -1.073e-01, -7.845e-02, 2.098e-01, -6.893e-02, -1.870e-01, 6.613e-02, 6.280e-02, -6.822e-02, -1.402e-01, -2.053e-02, -1.265e-02, -1.554e-02)); + r += mul(s1_0, M4(-2.111e-01, -9.747e-02, -1.930e-01, 9.786e-02, 1.359e-01, -4.889e-02, 6.019e-02, 1.145e-02, 5.121e-02, 2.447e-02, -5.930e-02, 2.061e-01, 8.178e-02, -1.531e-02, -5.044e-03, 1.083e-01)); + r += mul(s1_1, M4(-3.074e-03, -8.969e-02, 1.186e-01, -1.392e-03, -1.821e-01, 2.694e-02, 5.397e-02, 1.006e-01, -9.086e-02, -1.056e-01, -1.693e-01, 4.910e-02, -1.256e-01, -8.187e-02, -8.469e-02, -6.965e-02)); + r += mul(s1_2, M4(-4.244e-01, -2.091e-01, 2.887e-02, 2.439e-01, -1.329e-01, -7.817e-03, 9.411e-03, 1.358e-01, 1.921e-02, 5.657e-02, 6.304e-02, 4.841e-02, 6.155e-02, 8.668e-02, -6.354e-02, 1.539e-01)); + r += mul(s1_3, M4(1.953e-01, 3.159e-02, -3.004e-01, -1.409e-02, -9.977e-02, -2.672e-03, -8.568e-03, -5.583e-02, -3.060e-01, 1.161e-01, -7.316e-02, 2.468e-02, -9.539e-02, 1.675e-02, -1.193e-01, -9.390e-02)); + r += mul(s1_4, M4(-2.435e-01, 1.206e-02, -3.330e-01, 2.784e-01, -1.101e-01, -1.052e-01, -1.901e-01, -1.526e-01, -5.335e-02, 2.873e-01, -4.360e-02, -3.828e-02, -7.663e-02, -1.771e-01, 7.653e-02, 1.080e-01)); + r += mul(s1_5, M4(-4.594e-01, -1.617e-01, 1.607e-02, 2.628e-01, 5.469e-02, 4.403e-02, 1.393e-01, 8.063e-02, 9.056e-02, -1.311e-01, 6.889e-02, -1.527e-02, -1.205e-02, -5.024e-02, 3.551e-02, -1.588e-01)); + r += mul(s1_6, M4(-8.833e-02, -2.610e-01, 1.757e-01, -1.550e-01, 4.564e-02, 9.005e-02, -2.060e-01, 1.243e-01, 2.637e-01, 2.292e-01, -4.701e-02, -9.572e-02, 2.924e-01, 1.623e-01, 5.523e-02, 1.126e-02)); + r += mul(s1_7, M4(3.183e-01, -8.466e-02, 4.289e-01, -1.178e-01, 4.748e-02, -2.097e-01, 1.554e-01, -8.571e-02, -5.126e-02, -1.034e-01, 1.339e-02, -1.571e-01, 4.438e-02, -4.967e-02, 1.716e-02, 1.383e-02)); + r += mul(s1_8, M4(-3.187e-01, 2.494e-01, 2.216e-02, -6.215e-02, 2.288e-01, 2.446e-01, 9.322e-02, -3.364e-02, 5.613e-02, -6.874e-02, 9.164e-02, 7.186e-03, -9.362e-03, -5.247e-03, 3.488e-02, 2.015e-02)); + r += mul(s2_0, M4(8.030e-02, -1.244e-02, 7.993e-02, 2.598e-01, -2.316e-02, 5.534e-02, 5.730e-02, -5.297e-02, -1.069e-01, 7.793e-02, 2.488e-01, 1.935e-02, 2.498e-01, 1.815e-01, -1.495e-01, -7.393e-02)); + r += mul(s2_1, M4(-8.116e-02, 4.036e-02, 1.196e-01, -1.272e-01, 1.161e-01, 1.581e-01, -8.973e-02, 8.201e-02, -2.048e-01, 1.527e-01, 4.581e-01, -3.365e-01, 3.989e-01, 4.902e-01, -1.368e-01, 1.206e-01)); + r += mul(s2_2, M4(9.207e-02, 3.834e-01, 1.062e-01, -1.624e-01, 4.958e-02, -7.315e-02, 1.455e-02, 7.133e-04, -1.119e-01, 5.565e-02, 1.329e-01, -2.086e-01, -2.720e-01, 2.259e-02, -3.638e-02, 2.410e-01)); + r += mul(s2_3, M4(-2.493e-02, -2.591e-01, -2.875e-02, -1.175e-01, 1.286e-01, -1.532e-01, 9.002e-02, -1.420e-01, 6.273e-02, -1.023e-01, 7.325e-02, 1.587e-01, 1.253e-01, -6.595e-01, 6.359e-02, 1.891e-01)); + r += mul(s2_4, M4(1.595e-01, -1.435e-01, -1.631e-01, -7.877e-02, 1.582e-01, 1.051e-01, -7.296e-02, 2.245e-01, -1.422e-01, -4.053e-01, 1.393e-01, -2.186e-03, 5.780e-02, -6.208e-02, -1.152e-01, -4.898e-01)); + r += mul(s2_5, M4(5.204e-02, 5.165e-02, 9.230e-03, 2.811e-02, -3.048e-02, -9.137e-02, -7.371e-02, -1.152e-01, -6.553e-02, -1.954e-01, -6.013e-01, 3.103e-02, -2.552e-01, -5.532e-01, 4.900e-04, 7.283e-02)); + r += mul(s2_6, M4(-6.250e-02, -8.190e-02, -2.849e-01, -2.471e-02, 1.289e-01, -3.091e-01, 1.231e-01, 6.081e-02, 3.088e-02, 1.494e-01, -4.576e-02, -4.224e-02, -1.199e-01, 2.171e-01, 5.012e-02, -1.173e-01)); + r += mul(s2_7, M4(-5.584e-02, -1.592e-02, 5.392e-02, 2.378e-02, -2.354e-02, 1.150e-01, -3.141e-02, -1.676e-01, 7.981e-02, -2.169e-02, 1.075e-01, -5.479e-03, 2.861e-01, -2.411e-01, 2.733e-01, -2.672e-01)); + r += mul(s2_8, M4(-4.809e-02, -2.214e-01, -3.851e-02, -1.119e-01, -1.870e-01, -4.463e-02, -1.437e-02, 1.404e-02, -6.566e-03, -2.549e-01, -8.061e-02, -2.557e-02, -2.421e-01, 4.801e-01, -1.782e-01, 1.192e-01)); + r += mul(s3_0, M4(1.082e-01, -9.349e-02, -4.882e-03, -9.671e-02, -5.846e-02, 5.447e-02, -4.925e-02, 6.508e-02, -7.234e-03, 2.136e-01, 1.191e-01, -1.146e-01, -2.104e-02, 5.780e-02, -4.717e-02, -5.266e-02)); + r += mul(s3_1, M4(8.722e-02, -4.961e-02, -4.340e-02, -1.314e-01, 2.672e-02, -1.840e-02, -4.682e-02, 2.123e-01, 7.567e-04, 1.599e-01, 3.556e-01, -6.521e-01, -8.441e-02, -9.187e-02, -9.814e-02, 1.154e-01)); + r += mul(s3_2, M4(-1.778e-01, -7.969e-02, 6.154e-02, 3.048e-02, -3.972e-02, -1.056e-01, 6.651e-02, 1.559e-01, -3.278e-03, 9.446e-02, 6.509e-02, -1.627e-01, 8.409e-02, 5.832e-02, 1.216e-01, 8.892e-02)); + r += mul(s3_3, M4(-1.267e-02, 9.277e-02, 1.067e-01, -2.599e-02, -8.945e-02, 9.880e-02, -2.422e-02, -9.366e-03, 1.762e-01, -3.082e-02, -8.064e-02, 1.689e-01, -5.425e-02, -3.865e-03, 1.076e-02, -3.944e-02)); + r += mul(s3_4, M4(-3.883e-02, 8.021e-02, 6.377e-02, 3.235e-01, -1.697e-01, 3.375e-02, 7.622e-03, 3.170e-01, 8.253e-02, 4.422e-02, 8.716e-03, 9.710e-02, -1.294e-01, -8.479e-02, -2.092e-01, 9.940e-03)); + r += mul(s3_5, M4(-4.877e-02, -1.744e-01, -9.427e-02, 1.363e-01, -6.597e-02, -4.598e-02, 6.530e-02, -1.739e-01, -7.951e-02, 5.267e-01, -3.922e-01, -5.767e-02, 1.514e-01, 1.597e-01, 1.178e-01, 1.291e-02)); + r += mul(s3_6, M4(1.090e-01, 8.036e-02, 7.251e-02, -1.705e-01, 7.163e-02, 7.327e-02, 2.597e-02, 1.043e-01, 9.985e-02, -5.557e-02, -5.285e-02, -3.540e-02, -2.397e-02, 5.184e-02, -7.039e-02, 1.035e-03)); + r += mul(s3_7, M4(-7.628e-02, 8.150e-03, -1.005e-01, -1.243e-01, -2.891e-01, 1.770e-01, 7.126e-02, -1.134e-01, -7.591e-02, 4.806e-02, 9.831e-03, 1.433e-01, 1.231e-01, -1.298e-01, 1.780e-01, -1.115e-01)); + r += mul(s3_8, M4(1.036e-01, 1.694e-01, -5.191e-02, 1.982e-02, -1.932e-01, 5.030e-02, 1.057e-01, -3.385e-02, 2.534e-02, -2.275e-01, -9.040e-02, 2.515e-02, -1.305e-01, -2.527e-02, 5.679e-02, 5.587e-02)); + r += mul(s4_0, M4(8.688e-02, 2.072e-01, -8.062e-02, 9.266e-02, 6.784e-02, 2.153e-02, 6.418e-02, -2.933e-02, -9.443e-02, -4.865e-02, 1.375e-01, -1.764e-01, -2.457e-02, 9.365e-02, -7.196e-02, -6.391e-02)); + r += mul(s4_1, M4(2.333e-01, 3.864e-01, -1.380e-01, 9.062e-02, 1.107e-03, 1.837e-01, -5.382e-02, -4.475e-02, -3.119e-02, 1.173e-01, 1.274e-01, -1.866e-02, 1.037e-01, 2.066e-01, -7.300e-02, -1.161e-01)); + r += mul(s4_2, M4(-1.456e-01, 2.448e-01, 1.572e-01, 1.278e-01, -1.013e-02, -5.934e-02, -2.116e-02, -2.452e-02, -1.327e-01, 2.185e-02, -1.993e-02, -3.170e-02, -8.520e-02, 1.591e-01, 3.506e-02, -9.729e-02)); + r += mul(s4_3, M4(2.335e-01, -2.123e-01, 2.018e-02, -1.073e-02, -9.702e-02, -5.556e-02, 8.472e-02, 9.629e-02, 1.970e-01, -5.520e-02, 4.945e-02, 1.202e-01, 4.341e-02, 1.853e-01, -1.267e-01, 2.928e-02)); + r += mul(s4_4, M4(2.631e-01, -6.454e-02, -1.787e-01, 2.898e-02, 1.660e-01, -7.202e-03, -9.751e-02, 5.543e-01, 5.921e-02, 3.227e-01, 1.145e-01, 6.503e-01, 1.196e-01, -1.562e-03, 9.743e-02, 3.687e-02)); + r += mul(s4_5, M4(1.116e-01, 1.249e-01, -1.325e-01, 1.028e-01, -8.355e-03, 1.822e-01, 1.045e-01, 1.230e-01, -2.942e-01, -3.597e-02, -2.454e-01, 6.629e-02, 1.839e-02, 3.743e-01, 5.781e-02, 5.934e-02)); + r += mul(s4_6, M4(-3.997e-02, 1.346e-01, 9.830e-02, -2.274e-02, -1.619e-01, 1.750e-01, -6.734e-02, -1.691e-02, -1.965e-01, -7.976e-02, 6.646e-02, 8.609e-02, -2.992e-02, 6.498e-02, 7.941e-03, 9.300e-02)); + r += mul(s4_7, M4(1.906e-01, 6.598e-02, 1.268e-03, -6.979e-02, -2.120e-01, -1.267e-01, -1.558e-01, -1.895e-01, -1.123e-01, -2.401e-02, -2.582e-01, 1.998e-01, 3.098e-03, 1.005e-01, 1.134e-01, 1.317e-02)); + r += mul(s4_8, M4(2.842e-02, -9.225e-02, -1.068e-01, -2.368e-01, 8.938e-02, -9.841e-02, -4.640e-02, -2.911e-02, -2.735e-02, 4.138e-02, -3.043e-01, -3.354e-02, -1.169e-01, 6.541e-02, 7.405e-02, -5.760e-02)); + r += mul(s5_0, M4(-2.697e-02, -8.209e-02, -6.014e-02, 8.016e-02, -5.242e-02, 6.674e-02, -9.365e-02, -3.331e-02, 1.423e-01, 1.208e-01, 2.431e-01, -1.652e-01, -3.686e-02, -1.841e-01, -4.516e-02, -6.155e-02)); + r += mul(s5_1, M4(-4.963e-02, -2.090e-01, 8.904e-02, 1.540e-02, 6.672e-03, -8.529e-02, 2.023e-01, -3.174e-01, -8.613e-02, 8.896e-02, 1.635e-01, 2.409e-02, -8.966e-02, 1.215e-01, -1.935e-02, -2.705e-02)); + r += mul(s5_2, M4(6.732e-02, -1.502e-02, -9.210e-02, -1.770e-01, 1.581e-02, 4.328e-02, -9.155e-02, 9.680e-02, 3.393e-02, -1.307e-01, -6.939e-02, -6.385e-02, -9.215e-03, -1.056e-01, 1.467e-01, -1.616e-01)); + r += mul(s5_3, M4(-7.139e-02, 1.397e-01, -1.181e-01, -3.929e-02, 3.273e-01, 1.138e-01, 2.840e-01, -3.111e-01, 8.805e-02, -1.499e-02, 2.261e-01, -1.184e-01, -1.775e-01, -2.000e-01, -1.358e-01, 5.634e-03)); + r += mul(s5_4, M4(-1.534e-01, -1.025e-01, 1.112e-01, 2.105e-02, 5.764e-02, -8.380e-02, 1.161e-01, -4.252e-01, -4.067e-02, -1.210e-01, -1.053e-01, 2.702e-01, -1.395e-02, -1.419e-01, 1.070e-01, -1.636e-01)); + r += mul(s5_5, M4(-3.549e-02, 7.727e-02, 1.248e-02, 5.666e-02, -1.519e-01, 5.273e-02, -1.705e-01, -1.669e-01, 1.945e-01, 1.301e-01, -2.281e-01, -1.808e-01, -6.349e-02, -3.592e-01, 2.363e-01, 3.038e-02)); + r += mul(s5_6, M4(-1.288e-02, -1.269e-01, -3.312e-02, -6.917e-02, -1.319e-01, -1.544e-02, 1.783e-01, 6.150e-02, -2.866e-02, 6.708e-02, -7.747e-02, -4.994e-02, 1.626e-01, 7.398e-04, 8.980e-02, 3.971e-02)); + r += mul(s5_7, M4(-9.159e-02, -5.895e-04, 8.511e-02, -3.319e-02, 7.901e-02, -7.770e-02, -4.426e-02, -2.112e-01, -1.948e-01, 2.900e-01, -2.900e-01, -6.018e-03, 1.328e-01, -2.664e-01, 1.343e-01, -7.560e-02)); + r += mul(s5_8, M4(1.040e-01, 5.183e-02, 1.105e-01, 8.969e-02, -8.304e-02, -1.443e-01, -2.251e-01, -7.725e-02, -9.840e-02, -2.817e-01, -2.504e-01, -3.580e-02, 3.837e-03, 1.300e-01, 1.364e-01, -3.900e-02)); + r += mul(s6_0, M4(5.644e-01, 2.238e-02, -3.205e-01, 2.862e-01, -4.545e-02, 9.792e-03, 2.880e-01, -2.262e-01, -7.295e-02, -6.523e-02, -3.954e-02, -3.450e-02, 8.041e-02, 6.435e-02, -1.465e-01, 6.761e-02)); + r += mul(s6_1, M4(1.684e-01, 6.494e-02, -3.871e-02, 4.333e-01, -1.253e-01, -1.290e-02, -3.312e-02, 1.780e-02, -7.196e-02, 1.142e-01, 1.516e-01, -9.619e-02, 3.103e-02, -1.658e-01, 7.592e-02, -1.505e-01)); + r += mul(s6_2, M4(1.490e-01, 1.816e-01, -2.416e-01, 2.591e-01, -3.719e-02, -1.706e-01, 7.797e-02, -3.245e-02, -5.190e-03, 2.357e-02, -3.275e-02, -6.354e-02, 1.407e-01, 6.104e-02, -3.129e-02, 8.271e-02)); + r += mul(s6_3, M4(7.564e-01, 3.245e-01, -3.065e-01, -1.192e-01, 5.567e-02, -8.577e-02, -8.148e-02, 4.286e-02, -8.816e-02, -4.774e-02, -1.396e-01, -1.188e-01, 7.332e-03, 1.308e-02, -1.512e-02, -3.359e-02)); + r += mul(s6_4, M4(-5.122e-01, 4.765e-01, 2.806e-01, -3.779e-01, 3.113e-03, 1.925e-01, 1.279e-01, -5.210e-02, 2.445e-02, -6.378e-03, 5.360e-02, 1.194e-01, 6.073e-02, -8.251e-02, 1.349e-02, 1.866e-01)); + r += mul(s6_5, M4(-6.574e-01, -5.307e-01, 4.246e-01, -1.077e-01, 1.071e-01, 3.634e-01, -9.335e-02, 5.315e-03, -2.182e-01, 1.369e-01, -2.047e-01, -3.629e-02, 6.883e-03, -1.242e-02, 8.672e-02, 3.954e-03)); + r += mul(s6_6, M4(-1.734e-01, -2.474e-01, -9.461e-02, -2.095e-01, 4.038e-02, -1.877e-02, -1.431e-01, 6.783e-03, 2.776e-01, 5.036e-02, -1.359e-01, 1.062e-01, -3.608e-04, 2.903e-02, 5.130e-02, -3.758e-02)); + r += mul(s6_7, M4(-1.645e-01, -5.196e-01, 3.487e-02, 1.290e-01, 1.361e-01, 1.889e-02, -1.576e-01, 4.734e-02, 3.265e-02, -1.890e-01, 1.266e-01, 5.530e-02, -9.453e-02, 1.284e-02, -4.585e-02, -1.094e-01)); + r += mul(s6_8, M4(-8.783e-02, 1.852e-01, 7.476e-02, -1.801e-01, -5.164e-02, 8.656e-03, -2.029e-02, -2.596e-02, 2.435e-02, -9.673e-03, 3.363e-02, 4.865e-03, 1.859e-02, 5.536e-02, 1.141e-01, -1.484e-02)); + r += mul(s7_0, M4(-6.820e-02, -2.884e-02, -1.303e-01, 1.882e-01, 2.328e-01, 1.377e-01, 5.239e-02, -4.071e-02, -5.681e-02, -2.048e-01, -1.447e-01, 5.849e-02, -8.528e-02, -1.719e-01, -6.476e-02, -8.679e-02)); + r += mul(s7_1, M4(-5.278e-02, -1.000e-02, -1.634e-02, 2.524e-01, 2.194e-01, 2.207e-02, 1.995e-01, -1.895e-01, 6.924e-02, 2.295e-02, -6.099e-03, 1.654e-01, 3.084e-02, 4.470e-01, 1.683e-01, -4.328e-01)); + r += mul(s7_2, M4(-5.793e-02, 1.309e-01, 2.056e-02, 6.027e-02, -1.388e-01, 7.674e-02, -1.620e-01, 2.527e-03, 3.178e-02, 5.334e-02, -6.098e-02, -6.434e-02, 8.816e-02, 1.462e-01, -8.037e-02, -5.590e-02)); + r += mul(s7_3, M4(-2.568e-01, 1.857e-02, -1.087e-01, -8.671e-02, 1.852e-01, -4.477e-02, -8.057e-02, 1.461e-01, 1.091e-01, -1.958e-01, -6.820e-02, 1.089e-01, -2.141e-01, 1.391e-01, 1.000e-01, 1.991e-01)); + r += mul(s7_4, M4(-1.097e-01, -5.762e-02, -1.018e-01, -8.032e-02, 4.852e-02, -2.752e-01, -1.481e-01, 1.985e-01, -4.663e-03, 3.380e-01, 7.200e-02, 9.291e-03, 4.142e-01, 4.841e-03, 1.571e-01, 3.154e-01)); + r += mul(s7_5, M4(5.582e-03, -7.928e-02, 1.440e-01, -9.364e-02, -8.041e-02, -1.663e-01, -2.057e-01, 1.327e-01, -5.687e-02, 9.180e-02, -1.950e-01, 1.874e-01, -2.831e-02, -1.973e-01, -1.410e-01, 1.005e-01)); + r += mul(s7_6, M4(8.888e-02, -2.330e-02, 7.020e-02, -1.240e-01, -6.910e-02, 2.411e-02, 3.791e-03, 1.450e-01, -3.441e-01, -4.260e-01, 5.536e-02, -4.727e-02, -3.908e-01, 1.535e-01, -6.593e-02, 2.619e-02)); + r += mul(s7_7, M4(-9.912e-02, 8.917e-02, 1.139e-01, -3.587e-02, -1.437e-03, -1.247e-01, -7.667e-03, 1.110e-01, -1.200e-01, 9.394e-02, 2.830e-01, -1.033e-01, 1.121e-01, 2.775e-01, -1.737e-01, -7.406e-02)); + r += mul(s7_8, M4(-4.771e-02, 2.535e-02, -2.644e-03, -8.139e-02, -3.943e-02, -7.504e-02, -1.410e-01, -8.238e-03, 5.641e-02, 3.758e-02, 3.588e-01, -4.553e-02, -1.887e-01, -5.847e-01, 1.438e-01, -1.075e-02)); + r += V4(-1.968e-01, 2.644e-02, 3.143e-03, -1.147e-02); + return r; +} + +V4 f1(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-1.665e-01, 1.341e-01, -3.784e-02, -7.759e-02, -7.067e-02, -1.354e-02, -3.162e-01, 9.772e-02, -7.751e-03, 1.089e-01, -7.867e-02, 7.391e-02, 1.113e-01, 2.431e-02, -1.126e-02, -1.944e-02)); + r += mul(s0_1, M4(-7.397e-02, 1.614e-01, -9.000e-02, 6.037e-02, -2.921e-01, 2.061e-01, 5.314e-04, 2.018e-01, -9.617e-02, -1.867e-02, -2.428e-02, 1.273e-01, -1.373e-01, 2.826e-02, -6.593e-02, -2.146e-01)); + r += mul(s0_2, M4(3.230e-02, 1.260e-01, 1.749e-01, -2.806e-02, -3.382e-01, 1.529e-01, -7.863e-02, -1.249e-01, 1.769e-03, 9.832e-02, 1.502e-01, 1.163e-01, 7.971e-02, -4.328e-02, -9.819e-02, -3.709e-02)); + r += mul(s0_3, M4(-7.267e-02, 9.105e-03, -2.213e-01, -7.500e-02, -9.302e-02, 2.785e-02, 1.968e-01, -7.105e-02, -6.686e-02, 3.332e-02, 7.118e-02, -1.031e-01, 2.227e-02, -1.745e-01, -5.851e-02, -4.692e-02)); + r += mul(s0_4, M4(-4.300e-02, 5.561e-03, -1.691e-01, 1.734e-02, -2.447e-01, 1.481e-01, 4.838e-02, -2.720e-01, 3.631e-02, -1.309e-01, 4.375e-02, 3.994e-01, -6.899e-02, 1.035e-01, 1.422e-01, 6.815e-02)); + r += mul(s0_5, M4(-5.045e-03, 9.328e-03, 6.229e-02, -2.625e-01, 2.517e-01, 1.145e-01, 1.115e-02, 6.815e-02, 5.933e-02, 3.550e-02, 1.827e-01, -2.651e-01, 5.388e-02, -1.054e-01, -5.995e-02, 3.073e-01)); + r += mul(s0_6, M4(1.986e-02, -5.852e-02, -6.029e-02, 6.415e-02, -1.902e-01, 9.542e-02, 6.488e-02, 9.892e-02, -1.327e-02, -2.054e-02, -2.209e-01, -1.727e-01, -7.929e-02, 8.246e-02, -2.585e-02, -1.415e-02)); + r += mul(s0_7, M4(1.705e-01, -1.150e-01, 5.452e-02, 1.132e-01, -2.629e-01, 1.903e-03, -1.429e-01, 5.953e-02, 2.621e-02, -1.295e-01, 6.998e-02, 1.393e-01, 1.141e-02, -1.841e-02, 4.103e-02, -7.428e-02)); + r += mul(s0_8, M4(8.787e-02, -1.161e-01, 4.994e-02, 8.147e-02, 1.031e-01, 2.212e-02, 7.269e-02, 1.561e-01, 6.051e-02, 3.214e-02, -9.364e-02, -4.011e-01, -1.217e-01, 6.956e-02, 1.112e-01, 1.290e-01)); + r += mul(s1_0, M4(6.202e-02, 4.040e-02, -2.698e-01, -1.926e-01, -3.636e-02, 1.379e-02, 8.940e-02, -3.803e-02, -1.049e-02, -5.670e-02, -3.738e-02, -1.053e-01, 1.952e-03, -4.216e-02, 1.101e-01, -1.522e-01)); + r += mul(s1_1, M4(-9.631e-02, -8.827e-03, -3.405e-01, -5.959e-02, -2.423e-01, 2.353e-01, 9.648e-03, -5.868e-02, 5.729e-02, 7.017e-03, -4.890e-02, -1.569e-01, 1.440e-01, -4.340e-02, -2.159e-02, 8.336e-02)); + r += mul(s1_2, M4(2.106e-01, -6.010e-03, 1.479e-01, -3.243e-02, 1.049e-01, -2.281e-01, 2.060e-01, -4.001e-04, 1.115e-01, 2.111e-02, -8.208e-03, -4.814e-02, 4.377e-02, -7.831e-02, 6.725e-02, 1.976e-01)); + r += mul(s1_3, M4(-2.004e-01, -6.799e-02, -5.068e-02, 2.889e-01, 7.638e-02, -1.213e-01, -1.691e-01, 6.234e-03, -3.056e-02, -4.525e-02, -2.898e-01, 1.399e-01, -3.600e-01, 1.727e-01, -1.132e-02, 9.502e-02)); + r += mul(s1_4, M4(-5.388e-01, -7.512e-03, -8.975e-02, 8.544e-02, 1.271e-01, -7.689e-02, -1.746e-02, 1.128e-01, -4.000e-02, 2.901e-02, -1.270e-01, -2.532e-01, 1.449e-01, 6.640e-02, -2.687e-01, 8.076e-02)); + r += mul(s1_5, M4(8.166e-01, -1.339e-01, 6.942e-01, 9.886e-01, -4.053e-02, 1.141e-01, -1.294e-02, 6.103e-02, -7.290e-03, 5.853e-02, 1.198e-01, 4.576e-02, -2.898e-02, 4.735e-02, 4.603e-02, -3.222e-01)); + r += mul(s1_6, M4(-2.741e-01, -3.591e-02, 1.510e-01, 4.335e-02, 7.137e-02, 1.127e-02, 7.848e-02, 3.701e-02, -1.164e-01, 6.880e-02, 6.543e-03, 9.484e-02, 2.741e-01, 2.886e-02, 4.433e-02, 1.999e-01)); + r += mul(s1_7, M4(-1.289e-01, -5.624e-02, 6.800e-02, -1.822e-01, 8.965e-02, 2.975e-02, -1.535e-01, -1.449e-01, -5.375e-02, -2.592e-02, 1.103e-01, 6.022e-02, 1.662e-01, -1.462e-01, 1.722e-02, -3.086e-02)); + r += mul(s1_8, M4(-1.834e-01, 7.416e-02, 4.816e-01, 4.575e-01, -4.881e-02, -5.429e-03, 4.699e-02, 7.298e-02, 1.488e-01, -6.241e-02, 6.913e-02, 1.607e-01, -1.697e-01, -1.273e-01, -2.675e-04, -1.878e-01)); + r += mul(s2_0, M4(3.750e-02, -3.793e-02, 3.057e-01, 2.131e-02, -1.262e-01, 1.202e-01, 2.102e-02, 5.652e-02, -4.985e-02, -2.134e-01, 1.306e-01, -4.159e-04, -4.256e-01, 2.828e-01, 1.423e-01, 3.310e-01)); + r += mul(s2_1, M4(9.804e-02, -1.908e-01, 4.843e-02, -9.660e-02, -2.456e-01, 2.842e-03, 1.447e-03, 9.591e-02, 4.590e-02, -5.576e-01, 3.068e-01, 4.523e-02, -2.539e-01, 1.984e-01, 6.054e-02, -2.267e-01)); + r += mul(s2_2, M4(-1.325e-02, -1.171e-01, -6.820e-02, 6.680e-02, -4.834e-02, 8.046e-02, -1.157e-02, 1.409e-01, -1.438e-01, -3.252e-01, -2.903e-01, 3.376e-02, -8.853e-02, 8.772e-02, 2.176e-01, 4.031e-01)); + r += mul(s2_3, M4(2.235e-01, -1.113e-01, 2.688e-01, 2.116e-01, -1.617e-01, -1.286e-02, 2.732e-01, 6.103e-02, -1.480e-01, 4.627e-02, -1.872e-02, 6.235e-02, 4.024e-01, 8.464e-02, -4.365e-01, 8.703e-02)); + r += mul(s2_4, M4(-1.671e-01, 1.626e-01, -5.575e-02, -2.082e-02, -1.876e-01, 3.607e-01, -1.139e-01, -4.762e-02, -1.988e-02, 1.190e-01, -2.995e-01, 1.082e-01, 3.695e-01, 1.920e-02, -2.015e-01, -6.103e-01)); + r += mul(s2_5, M4(-1.472e-01, 7.181e-02, 5.143e-02, 1.519e-01, 7.109e-02, -6.342e-02, 1.723e-01, 2.540e-01, -5.503e-01, -1.194e-01, -1.900e-01, -2.061e-01, 1.004e-01, -1.319e-01, 3.679e-01, 1.158e-01)); + r += mul(s2_6, M4(-2.509e-02, 5.266e-02, 3.585e-01, -1.288e-01, 1.018e-01, 8.921e-02, 1.694e-01, -1.240e-01, -1.423e-01, 3.175e-02, -4.048e-02, 5.739e-02, -1.162e-01, 1.158e-01, -1.085e-01, 1.682e-01)); + r += mul(s2_7, M4(2.379e-01, -3.928e-02, 1.503e-01, 8.918e-02, 2.459e-01, -1.859e-01, 4.131e-01, 5.902e-02, -2.605e-01, -8.128e-03, 3.047e-02, -1.869e-01, 5.074e-02, -1.430e-01, 1.626e-01, -1.676e-02)); + r += mul(s2_8, M4(-6.399e-02, 9.947e-02, 7.501e-02, -1.298e-01, 3.091e-01, -1.130e-01, 1.293e-01, -1.407e-01, -2.135e-01, 6.533e-02, 1.802e-02, -1.939e-01, 1.320e-01, -1.771e-01, -3.453e-02, 1.703e-01)); + r += mul(s3_0, M4(-1.142e-01, 1.466e-01, 7.215e-03, -4.026e-02, 4.854e-02, -2.248e-02, 4.894e-02, -3.407e-02, 1.147e-01, -1.795e-01, 6.157e-02, 5.692e-02, 3.947e-02, 3.094e-02, -6.908e-02, 9.956e-02)); + r += mul(s3_1, M4(-1.148e-02, 6.514e-02, 3.684e-03, -1.459e-02, 2.465e-02, -2.901e-02, -8.985e-02, -1.146e-01, 4.421e-01, -4.375e-01, 2.371e-01, -1.641e-01, -2.372e-02, -1.411e-02, 6.435e-02, 9.437e-02)); + r += mul(s3_2, M4(5.557e-02, -2.242e-01, -3.345e-02, -2.953e-02, -1.091e-02, 2.882e-03, -1.566e-01, -3.146e-02, 6.489e-02, -2.984e-01, -9.024e-04, -4.651e-02, -4.070e-04, 5.174e-02, -5.263e-02, -1.400e-01)); + r += mul(s3_3, M4(-1.358e-01, 5.689e-02, -1.724e-01, -4.284e-02, 1.669e-01, -1.199e-01, -3.149e-01, -1.468e-01, -5.475e-03, 1.038e-01, 2.023e-01, -2.987e-02, -8.255e-02, 7.491e-02, -6.692e-02, -8.698e-02)); + r += mul(s3_4, M4(2.665e-01, 1.084e-01, 3.464e-02, 1.097e-01, -1.104e-01, 2.399e-01, -3.444e-01, 1.153e-01, 1.271e-01, 1.372e-01, -2.740e-01, 1.911e-01, 3.881e-03, -7.096e-02, -9.862e-02, -1.155e-02)); + r += mul(s3_5, M4(-1.003e-02, -8.276e-02, 1.139e-01, -9.830e-02, 5.847e-02, -2.887e-01, -3.093e-01, -1.283e-01, -1.310e-01, 1.559e-02, -1.089e-01, -1.444e-01, -6.158e-02, -1.244e-01, -1.105e-01, 1.040e-01)); + r += mul(s3_6, M4(-4.486e-02, -8.327e-02, -2.001e-01, 1.306e-01, -2.507e-01, -1.655e-01, -3.430e-01, -5.603e-02, -1.088e-02, -1.598e-02, 5.772e-02, -2.714e-02, -6.248e-02, 2.533e-02, -3.380e-02, -4.265e-02)); + r += mul(s3_7, M4(-2.085e-01, 1.207e-01, -3.720e-02, 3.187e-02, 8.328e-02, -1.478e-01, -3.583e-01, -8.352e-02, 1.044e-01, -1.021e-02, 1.267e-01, -8.480e-02, 1.596e-01, 1.340e-02, 9.415e-03, -8.058e-02)); + r += mul(s3_8, M4(9.541e-02, 2.103e-02, -3.731e-03, 2.217e-02, -2.704e-01, -6.955e-02, -2.359e-01, -3.753e-01, 5.169e-02, 3.572e-02, 2.793e-02, -8.367e-02, 2.345e-02, -2.282e-02, 3.577e-02, -1.130e-01)); + r += mul(s4_0, M4(-1.707e-01, 3.997e-02, -1.141e-01, 1.112e-01, 1.392e-02, -1.528e-01, 6.816e-02, 1.333e-02, 1.177e-03, -5.273e-02, 1.844e-02, 1.732e-02, 1.027e-01, 9.282e-02, -8.965e-02, -3.378e-02)); + r += mul(s4_1, M4(3.575e-02, -7.195e-02, -5.859e-02, 8.818e-02, -8.622e-02, -1.008e-01, 2.017e-02, -1.139e-02, 1.806e-02, -2.028e-01, 5.585e-02, 1.500e-01, 1.127e-01, -3.169e-02, 1.197e-01, 4.792e-02)); + r += mul(s4_2, M4(-2.604e-03, 1.051e-02, 1.412e-01, -5.863e-02, -4.217e-02, 3.996e-02, -9.017e-03, 2.003e-01, 3.660e-02, 4.378e-02, -4.152e-02, -1.036e-01, 1.732e-01, -3.565e-02, 7.231e-02, 1.261e-01)); + r += mul(s4_3, M4(2.970e-02, -4.589e-02, -1.678e-02, -1.266e-02, 1.554e-01, -8.091e-02, 1.432e-01, -2.513e-02, 6.188e-02, 3.822e-02, 1.232e-01, 8.549e-02, -7.653e-02, -1.183e-02, 5.302e-02, 1.202e-01)); + r += mul(s4_4, M4(2.794e-01, -4.722e-02, -3.501e-02, 3.923e-02, -3.495e-02, 2.474e-01, -1.880e-01, 4.487e-02, 4.384e-02, 2.064e-01, -3.922e-01, 1.410e-01, 1.671e-01, -3.333e-01, 2.001e-01, -1.453e-01)); + r += mul(s4_5, M4(8.181e-02, -1.581e-02, 1.478e-01, 1.558e-01, -6.474e-02, -1.127e-01, 4.454e-02, -1.335e-01, 1.221e-01, -2.658e-01, -2.024e-02, -2.517e-02, 7.345e-02, 5.997e-02, -1.399e-02, 1.402e-01)); + r += mul(s4_6, M4(-1.348e-01, -6.138e-02, -9.543e-03, -7.792e-03, -1.458e-02, -7.404e-03, -1.125e-01, 3.650e-02, 3.389e-02, 2.502e-02, 8.436e-02, 1.033e-02, 1.219e-01, -4.412e-02, -5.576e-02, -3.970e-03)); + r += mul(s4_7, M4(-3.417e-02, -1.380e-01, -1.627e-01, -1.374e-01, -1.803e-01, -4.939e-02, -7.251e-02, -2.915e-01, 1.441e-01, -1.316e-01, 2.778e-01, -8.583e-02, 3.703e-01, 6.378e-02, -1.088e-01, 1.179e-02)); + r += mul(s4_8, M4(-1.187e-02, 2.075e-01, -6.312e-02, -4.515e-01, 1.636e-01, 5.593e-03, -1.043e-02, 2.057e-02, -4.680e-01, -2.561e-02, -1.386e-01, -2.197e-01, 2.314e-01, -8.280e-02, -1.032e-01, -2.514e-01)); + r += mul(s5_0, M4(-9.275e-02, -6.584e-02, 8.687e-02, -1.240e-01, 1.077e-01, -3.266e-01, 3.930e-02, -1.755e-01, 1.417e-01, 9.351e-03, 6.679e-03, 4.820e-02, -2.202e-01, -1.487e-02, 2.234e-01, 5.928e-02)); + r += mul(s5_1, M4(4.244e-03, -8.613e-02, 7.380e-02, -5.880e-02, -1.364e-01, 1.651e-04, 1.180e-01, -4.176e-02, 2.033e-01, -1.228e-01, 3.606e-02, 1.587e-01, -2.911e-01, -1.252e-01, 2.768e-02, 2.469e-02)); + r += mul(s5_2, M4(-3.755e-02, 5.802e-02, 5.191e-02, -5.098e-02, 3.585e-01, -6.661e-02, 3.846e-02, -7.954e-02, -1.309e-01, 6.603e-02, 6.997e-02, 6.127e-03, -1.656e-01, -5.526e-02, -1.928e-01, 2.505e-01)); + r += mul(s5_3, M4(4.658e-02, -1.393e-02, -8.022e-03, -6.763e-02, 1.514e-02, -4.698e-02, 8.419e-02, -5.550e-02, 2.622e-01, 1.319e-01, 2.548e-01, 1.069e-02, -1.016e-01, -8.551e-03, 2.224e-01, 2.126e-02)); + r += mul(s5_4, M4(-7.520e-02, 4.847e-02, -5.405e-02, -3.974e-02, 5.266e-02, 2.176e-01, 9.205e-02, 1.811e-01, -3.110e-01, 5.955e-01, -2.327e-01, 9.697e-02, -9.345e-02, -1.508e-01, 1.331e-01, -1.117e-01)); + r += mul(s5_5, M4(-8.692e-03, 1.264e-01, -2.997e-02, -1.821e-01, 5.133e-02, 1.825e-01, 1.131e-01, 3.357e-02, -6.751e-02, 1.866e-02, -3.785e-02, -2.172e-01, -1.564e-01, 9.422e-02, -1.388e-01, 1.427e-01)); + r += mul(s5_6, M4(-1.623e-01, -3.759e-02, 6.117e-04, -2.766e-02, 1.206e-02, 5.389e-03, 3.726e-02, 5.531e-02, -9.318e-02, -3.451e-02, -1.199e-01, 6.547e-03, -1.887e-01, -5.438e-03, 1.026e-01, 4.290e-02)); + r += mul(s5_7, M4(-5.104e-02, -5.492e-03, 5.954e-02, 6.657e-02, 1.943e-01, 3.488e-02, 1.388e-01, 9.089e-02, -3.791e-01, -8.801e-02, 7.101e-03, -4.950e-02, 1.226e-01, 5.452e-02, -1.631e-01, -3.946e-03)); + r += mul(s5_8, M4(2.790e-01, -3.594e-02, 7.538e-03, 5.006e-01, -5.859e-02, 1.508e-01, 1.898e-02, -7.446e-02, 1.573e-01, -4.166e-02, -4.040e-02, -2.340e-01, -5.971e-02, -1.561e-01, 2.550e-02, 4.738e-01)); + r += mul(s6_0, M4(2.046e-01, -1.122e-04, 2.898e-01, 3.846e-01, 2.241e-01, -2.985e-02, -1.752e-01, -6.644e-02, -4.047e-02, 5.151e-02, 4.937e-02, -5.024e-02, -5.910e-02, -4.902e-02, -2.496e-02, -6.992e-03)); + r += mul(s6_1, M4(5.641e-02, 1.904e-01, 1.219e-01, 1.229e-01, 2.531e-01, -2.566e-01, 4.242e-02, 3.250e-02, 6.437e-02, -4.655e-02, 9.904e-02, -4.682e-02, -5.524e-02, -1.369e-01, 2.982e-02, -1.623e-01)); + r += mul(s6_2, M4(-2.628e-03, -2.270e-01, 1.512e-01, 3.369e-01, 1.355e-01, -6.808e-02, 3.351e-02, -1.966e-01, -5.281e-02, 4.194e-02, -9.085e-02, 1.204e-01, 1.040e-02, -4.112e-02, -3.086e-02, 8.178e-02)); + r += mul(s6_3, M4(1.006e-01, 2.417e-01, -8.287e-01, 4.077e-02, 3.227e-01, 7.162e-02, 2.490e-01, 1.280e-03, -2.438e-01, 8.278e-02, -1.428e-01, 6.916e-02, -6.346e-02, 9.989e-03, 1.231e-01, -1.119e-01)); + r += mul(s6_4, M4(-3.708e-01, -1.883e-01, 1.621e-01, -5.998e-01, -3.890e-02, 2.311e-01, 4.260e-02, 1.297e-01, -4.501e-02, -3.365e-02, -9.721e-02, -2.446e-01, -7.368e-02, 1.547e-01, -1.569e-01, 2.454e-01)); + r += mul(s6_5, M4(2.725e-01, 1.215e-01, 1.762e-01, 6.795e-01, -2.529e-01, -2.387e-02, -4.304e-02, -1.798e-01, -1.911e-01, -5.147e-02, -1.566e-01, -1.684e-02, 9.833e-02, 2.260e-02, 9.704e-02, -1.864e-01)); + r += mul(s6_6, M4(-5.371e-02, 7.565e-02, 2.204e-02, 7.461e-02, 1.265e-01, -8.627e-03, -3.540e-02, -1.881e-02, -2.202e-01, -6.486e-02, 2.303e-01, 5.538e-02, -4.212e-02, -4.130e-02, -5.136e-02, 6.881e-04)); + r += mul(s6_7, M4(3.574e-01, -3.207e-01, 3.057e-01, 2.824e-02, -1.310e-01, 4.847e-02, 1.734e-03, -1.464e-01, -8.705e-02, -1.006e-02, 6.186e-02, -7.267e-03, 8.074e-02, 7.032e-03, 3.469e-02, -8.714e-02)); + r += mul(s6_8, M4(-8.964e-02, -1.811e-02, 8.905e-02, 1.990e-01, 9.651e-03, 4.939e-02, -9.253e-02, -1.371e-01, 2.030e-01, -8.662e-02, 9.539e-02, 7.320e-02, 8.916e-02, -1.663e-04, 6.775e-02, 4.441e-02)); + r += mul(s7_0, M4(-1.150e-01, 1.302e-01, 2.498e-02, -1.342e-02, -1.705e-01, -9.536e-02, 1.426e-01, 8.821e-02, -3.133e-01, -1.155e-01, -2.864e-02, 3.672e-02, 1.816e-01, -1.225e-01, 2.499e-01, -2.514e-01)); + r += mul(s7_1, M4(-1.405e-01, 2.139e-01, -5.854e-02, 9.749e-02, -2.042e-01, -3.271e-01, -2.073e-01, -8.136e-02, 9.598e-03, -4.593e-02, 1.091e-01, -2.762e-02, -3.500e-01, -1.995e-01, 5.697e-02, -1.257e-01)); + r += mul(s7_2, M4(-3.587e-02, 8.100e-02, 2.962e-02, -7.049e-03, -9.572e-02, -1.407e-01, -9.330e-02, 3.043e-03, 1.304e-01, -1.072e-01, -1.646e-02, 4.262e-02, 1.474e-01, 3.215e-01, 1.387e-01, -1.788e-02)); + r += mul(s7_3, M4(-1.266e-01, -1.491e-02, -1.457e-01, 1.780e-03, -3.194e-01, -8.968e-02, 1.055e-01, 5.862e-02, 1.295e-01, -2.288e-02, -2.382e-01, -7.022e-02, 7.631e-02, -1.671e-01, -1.156e-01, 2.249e-01)); + r += mul(s7_4, M4(7.300e-02, -2.788e-01, 1.545e-01, 1.328e-02, -3.348e-02, 1.600e-01, -1.660e-01, 3.905e-01, 3.055e-01, 2.023e-01, -9.910e-02, 7.181e-02, 3.161e-01, 2.028e-01, 1.169e-02, 2.192e-02)); + r += mul(s7_5, M4(7.258e-02, -2.385e-02, 1.135e-01, 7.305e-02, 9.155e-02, -7.233e-02, -4.916e-03, -6.268e-02, 2.865e-01, -1.185e-01, 2.418e-01, 1.128e-01, 2.614e-01, 5.352e-03, 1.853e-01, 2.046e-01)); + r += mul(s7_6, M4(1.259e-01, 6.414e-02, -2.537e-02, 1.707e-02, -6.568e-02, -1.171e-01, 2.287e-01, 1.265e-01, 1.589e-01, -3.707e-02, -7.229e-02, -1.701e-01, -5.609e-02, -1.182e-01, -7.153e-02, 3.566e-01)); + r += mul(s7_7, M4(1.983e-01, -1.802e-01, -6.150e-02, 7.762e-02, -7.200e-02, -1.003e-01, 3.782e-02, 6.884e-02, 3.277e-01, -5.731e-02, 1.945e-01, 1.746e-01, -2.106e-01, -8.215e-02, -1.878e-01, 8.132e-02)); + r += mul(s7_8, M4(-2.486e-02, 9.845e-03, 1.111e-01, -6.140e-02, 8.605e-03, -6.981e-02, 2.888e-02, 1.531e-01, -1.288e-01, 8.149e-02, 1.744e-01, 2.852e-02, 1.347e-01, 9.315e-02, 5.734e-03, -1.109e-01)); + r += V4(-3.879e-03, 4.492e-03, 1.006e-02, 3.190e-02); + return r; +} + +V4 f2(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(6.655e-03, 5.556e-02, -8.105e-02, 1.458e-01, -8.150e-02, -1.538e-02, -1.082e-01, -1.079e-02, -1.527e-01, -4.165e-02, 1.901e-01, 2.564e-02, -1.333e-01, 1.045e-01, 4.315e-03, 4.170e-03)); + r += mul(s0_1, M4(-2.539e-02, 4.535e-02, 1.207e-02, 9.199e-03, 2.607e-01, 1.892e-01, -4.678e-01, -1.581e-01, -5.594e-02, -7.519e-02, -1.405e-01, -2.092e-02, -4.527e-02, 9.793e-02, -1.439e-01, 1.186e-01)); + r += mul(s0_2, M4(1.802e-02, -2.676e-03, -2.571e-02, 4.971e-02, 2.588e-01, -8.633e-02, -1.160e-01, -2.965e-03, -7.715e-02, 9.330e-02, -1.310e-01, 7.265e-02, 1.781e-01, -4.536e-02, -1.389e-01, -8.484e-02)); + r += mul(s0_3, M4(2.170e-02, 2.383e-02, -1.583e-02, -5.823e-02, 1.480e-02, 8.420e-02, -8.576e-02, -3.458e-02, -6.119e-01, 1.272e-02, 1.903e-01, 1.106e-01, 1.466e-01, -2.758e-04, 5.097e-02, 5.463e-02)); + r += mul(s0_4, M4(-7.211e-02, 6.139e-02, 9.620e-02, -5.765e-03, -3.925e-01, -2.522e-01, -5.260e-02, 1.453e-01, 7.604e-02, -7.873e-03, 1.661e-02, -3.368e-02, 7.994e-03, -1.523e-01, -1.285e-01, -9.694e-02)); + r += mul(s0_5, M4(-2.075e-01, -5.935e-02, 2.857e-01, -8.070e-03, 4.043e-02, -2.901e-02, 5.117e-02, -1.444e-01, -1.882e-01, 3.192e-01, -6.324e-02, -5.315e-02, 3.058e-01, 4.921e-02, 8.788e-02, 1.490e-02)); + r += mul(s0_6, M4(3.021e-02, -1.996e-02, -3.307e-03, 6.202e-03, 9.278e-02, -2.484e-01, 2.414e-02, 9.733e-02, 8.946e-02, -2.138e-01, 1.501e-01, 1.242e-01, -1.088e-01, -8.307e-02, -5.870e-02, 2.474e-02)); + r += mul(s0_7, M4(-5.499e-02, -3.792e-03, -8.923e-02, 5.841e-02, -3.779e-02, -2.041e-01, 7.140e-02, -4.398e-02, 2.706e-02, -7.244e-02, 5.549e-02, 8.587e-03, -6.630e-02, 1.648e-01, 4.909e-02, 1.227e-02)); + r += mul(s0_8, M4(-1.652e-02, 1.010e-02, 3.214e-02, 6.838e-02, 3.679e-02, -2.320e-01, -1.775e-02, -4.921e-02, 1.925e-02, 1.835e-01, 3.734e-02, 3.136e-02, -7.236e-04, -3.134e-01, 9.843e-02, -3.487e-02)); + r += mul(s1_0, M4(-1.105e-01, 1.907e-01, -1.500e-01, 1.024e-01, 2.619e-02, -6.697e-02, 6.286e-02, -5.147e-03, 1.463e-01, 7.406e-03, -1.897e-01, -5.971e-01, 7.540e-03, -5.692e-02, -5.279e-02, -8.061e-02)); + r += mul(s1_1, M4(-2.672e-01, -1.255e-01, 1.946e-01, -1.145e-02, -3.182e-02, -7.422e-02, 4.570e-02, 9.251e-02, -1.189e-02, 1.085e-01, -2.353e-02, -1.135e-02, 6.594e-02, 4.029e-03, -3.751e-02, 2.063e-02)); + r += mul(s1_2, M4(-8.084e-02, -1.826e-01, -1.234e-01, 4.054e-01, -9.095e-02, -1.165e-01, 1.121e-01, -2.741e-02, 7.305e-02, -3.217e-02, 9.786e-02, -6.659e-02, 1.157e-01, -4.444e-02, 2.270e-01, 1.763e-03)); + r += mul(s1_3, M4(1.931e-01, -3.257e-02, -4.842e-01, -8.259e-02, 1.276e-02, -3.639e-02, 1.284e-01, -4.754e-02, 3.171e-01, -1.167e-01, -2.868e-01, -1.150e+00, 2.319e-01, -1.294e-01, -1.171e-01, -3.551e-02)); + r += mul(s1_4, M4(-2.500e-01, -1.085e-01, 1.923e-02, 8.237e-02, 2.004e-01, 4.469e-02, 9.436e-02, 5.312e-02, -1.068e-01, -7.486e-02, -4.478e-02, 1.552e-01, -2.460e-01, 1.511e-02, 3.162e-01, 5.281e-02)); + r += mul(s1_5, M4(7.678e-01, -3.055e-02, -4.185e-01, -6.309e-02, -9.683e-02, 1.223e-01, 5.832e-02, 4.524e-02, 1.655e-02, -1.655e-01, -1.073e-01, -1.390e-01, -4.154e-01, 7.540e-02, -1.736e-01, 1.085e-01)); + r += mul(s1_6, M4(-3.131e-01, -1.286e-01, -1.378e-01, -5.605e-02, 1.242e-02, -6.596e-02, 1.168e-01, 6.750e-02, 5.484e-02, 9.939e-02, -2.480e-01, 2.647e-02, 4.495e-02, 1.346e-01, -4.221e-04, -7.027e-02)); + r += mul(s1_7, M4(-4.976e-01, -3.209e-01, 6.290e-01, -3.283e-02, -4.935e-02, 1.593e-01, -1.244e-01, 9.397e-03, -1.819e-01, 2.349e-01, 1.214e-01, 4.953e-02, -1.022e-01, 7.186e-02, -4.505e-02, 1.690e-02)); + r += mul(s1_8, M4(7.415e-02, -5.239e-01, -1.586e-02, 3.447e-01, -3.513e-02, 1.279e-01, -3.171e-02, -6.615e-02, -2.123e-01, -1.534e-01, 1.701e-02, 4.486e-03, 1.917e-01, 1.039e-01, 6.547e-02, 2.694e-02)); + r += mul(s2_0, M4(8.618e-02, -4.803e-02, -1.171e-01, -1.513e-02, 2.974e-02, -2.265e-02, 9.962e-02, -1.931e-02, 6.049e-02, -8.627e-02, 3.800e-02, 9.618e-02, 2.536e-01, -4.773e-01, 3.032e-02, -3.750e-02)); + r += mul(s2_1, M4(6.232e-02, 1.536e-01, 1.781e-02, -6.115e-02, -5.699e-04, -4.098e-02, 1.818e-01, 1.820e-02, -1.301e-01, -4.811e-01, 1.531e-01, 8.739e-02, 1.003e-01, -1.786e-01, 4.009e-01, 1.199e-01)); + r += mul(s2_2, M4(-1.296e-01, 6.706e-02, 3.536e-02, -5.269e-03, 9.650e-03, 6.253e-02, 9.542e-02, -2.238e-02, -8.852e-04, -2.723e-01, -1.343e-01, 6.277e-02, 2.481e-01, -3.909e-01, -2.848e-01, -2.311e-02)); + r += mul(s2_3, M4(-1.844e-01, 2.576e-01, 1.042e-01, -3.795e-02, -1.274e-02, -6.163e-02, 1.016e-02, 5.374e-02, 1.026e-01, -5.200e-02, -1.895e-01, 1.465e-02, -4.053e-01, 3.662e-01, 1.275e-01, -1.067e-01)); + r += mul(s2_4, M4(-7.130e-03, 2.468e-01, 1.063e-01, -8.518e-02, -2.571e-01, 1.458e-01, 1.766e-01, -8.033e-03, -2.254e-01, -3.894e-01, 3.050e-02, -2.920e-01, -6.229e-01, -2.740e-02, -4.316e-01, 2.365e-01)); + r += mul(s2_5, M4(1.404e-01, 1.765e-01, 3.307e-02, 4.062e-02, -5.348e-02, 1.879e-01, 1.456e-01, 1.174e-01, 2.685e-01, -1.430e-01, -8.005e-02, 1.036e-01, -1.043e-01, -1.460e-01, -1.615e-01, 3.867e-02)); + r += mul(s2_6, M4(5.364e-03, 2.301e-02, 9.842e-02, 7.951e-02, -2.416e-02, 1.013e-01, -5.920e-02, 1.695e-02, 2.026e-02, -2.394e-01, 8.882e-02, 3.650e-02, -1.144e-01, -3.474e-01, 3.686e-01, 1.380e-02)); + r += mul(s2_7, M4(-8.185e-02, 1.872e-01, 1.357e-01, 2.697e-02, -2.581e-01, 3.224e-01, -2.279e-02, 3.041e-03, 2.607e-02, -1.089e-01, -2.909e-02, -1.060e-01, 2.486e-01, -1.111e-01, 2.357e-01, 1.090e-02)); + r += mul(s2_8, M4(-2.989e-02, -1.133e-01, 2.163e-01, -9.537e-03, -8.489e-02, -2.383e-01, -1.081e-01, -1.091e-02, 1.138e-02, -4.123e-01, -4.767e-02, 4.099e-02, 2.298e-01, 1.293e-01, 1.773e-01, 7.660e-02)); + r += mul(s3_0, M4(3.896e-02, -3.133e-02, 3.217e-02, 4.139e-02, 5.093e-02, 2.823e-02, -8.577e-03, -3.780e-02, 2.861e-03, -1.689e-03, -7.514e-02, 6.305e-02, -2.362e-02, 4.346e-03, 4.735e-03, -1.194e-01)); + r += mul(s3_1, M4(6.590e-02, -2.471e-02, -7.886e-03, 9.714e-03, 1.811e-01, 5.951e-03, -8.243e-02, -6.037e-02, 1.833e-02, -7.481e-02, -1.821e-01, 8.750e-02, 1.107e-01, 1.240e-01, -9.746e-02, 5.775e-02)); + r += mul(s3_2, M4(-6.174e-02, -5.979e-02, -3.929e-03, 1.273e-03, 1.079e-01, 1.519e-01, 1.121e-01, -5.081e-02, -7.291e-03, 3.345e-02, -1.553e-02, -2.742e-02, 2.182e-02, -1.318e-01, 5.946e-02, -5.933e-02)); + r += mul(s3_3, M4(3.138e-02, -3.365e-01, -1.367e-02, 1.570e-01, 3.432e-02, -7.250e-02, -1.769e-01, -1.685e-02, -5.534e-02, 1.023e-01, -8.995e-02, 2.204e-02, 5.705e-03, 1.595e-01, 4.186e-02, 2.708e-02)); + r += mul(s3_4, M4(-1.008e-01, -8.172e-02, -1.077e-02, -4.102e-02, -1.583e-01, -2.770e-01, -6.289e-04, -1.642e-01, -2.202e-01, 1.332e-01, -4.903e-02, -1.783e-01, 2.032e-02, -6.282e-02, 1.980e-02, -2.676e-01)); + r += mul(s3_5, M4(1.053e-01, 1.076e-01, -3.948e-02, 4.915e-02, 2.136e-01, -2.357e-01, -1.255e-01, -1.459e-02, 9.773e-02, 1.624e-01, -2.384e-02, 2.292e-01, 1.363e-01, 5.480e-02, -6.351e-02, -1.213e-01)); + r += mul(s3_6, M4(8.917e-03, 4.804e-03, 3.635e-02, -7.499e-02, 2.543e-01, -1.210e-02, -8.202e-02, -9.351e-03, -1.585e-02, -5.763e-03, 8.240e-02, 5.701e-02, -4.596e-02, 4.842e-02, 1.877e-02, -1.446e-01)); + r += mul(s3_7, M4(-1.232e-01, -6.384e-02, -1.339e-01, -8.216e-02, 3.312e-01, 6.954e-02, 3.517e-02, 1.689e-01, -4.765e-02, 2.718e-01, -1.615e-01, -1.460e-01, -8.312e-02, 9.253e-02, -1.689e-01, -1.620e-01)); + r += mul(s3_8, M4(8.432e-02, 1.952e-01, -4.068e-02, -3.398e-03, 2.903e-01, -1.703e-01, -1.062e-01, 3.111e-02, -1.865e-01, 9.773e-02, -1.087e-01, 3.428e-02, -2.037e-02, -4.488e-02, 5.985e-02, -7.044e-02)); + r += mul(s4_0, M4(2.537e-01, -1.393e-01, 3.364e-02, 5.812e-02, 1.427e-01, -1.551e-02, 1.041e-01, 1.064e-01, 4.486e-02, -3.444e-02, -5.496e-02, 3.862e-02, 9.252e-02, -1.363e-02, 6.163e-03, 2.246e-02)); + r += mul(s4_1, M4(8.846e-03, 4.557e-02, -1.059e-02, 1.340e-01, 1.547e-01, -5.603e-02, 2.197e-02, 1.421e-01, -2.348e-01, -1.163e-01, 3.919e-03, -2.110e-01, 9.481e-02, 1.260e-02, 1.355e-02, 9.323e-02)); + r += mul(s4_2, M4(-7.205e-02, -1.342e-01, 4.100e-03, 7.338e-02, 7.469e-02, -3.581e-02, 9.859e-02, 1.051e-01, -1.580e-01, 3.044e-02, -1.745e-01, -2.835e-02, -5.595e-02, 4.080e-01, 6.298e-02, -5.029e-02)); + r += mul(s4_3, M4(2.531e-01, 5.550e-02, 4.475e-02, -1.046e-01, 8.019e-02, 6.507e-02, -1.792e-01, 2.618e-02, -5.059e-02, -2.618e-01, -3.367e-02, -1.395e-01, 2.896e-01, -2.934e-02, -5.490e-02, 9.300e-02)); + r += mul(s4_4, M4(7.890e-02, 3.029e-01, 2.133e-02, -5.126e-02, -3.385e-01, -1.758e-01, -6.291e-02, -3.150e-01, -4.135e-01, 2.422e-01, 1.068e-02, -1.341e-01, 3.631e-01, 1.772e-02, -7.548e-04, 4.115e-02)); + r += mul(s4_5, M4(1.689e-01, 1.690e-01, -9.701e-02, -1.115e-01, 9.889e-02, -4.711e-02, -1.317e-01, -8.123e-03, -9.076e-02, -8.810e-02, 2.362e-01, -3.804e-02, 2.086e-02, 2.328e-01, -1.051e-01, -1.188e-01)); + r += mul(s4_6, M4(8.424e-02, -3.195e-01, 9.356e-02, 7.451e-02, 4.294e-03, 4.530e-02, -4.655e-03, 1.649e-02, -2.645e-02, -4.658e-02, -1.554e-01, -1.458e-02, 7.289e-02, 1.307e-01, 6.133e-02, 1.640e-03)); + r += mul(s4_7, M4(-7.246e-02, 1.717e-02, -2.153e-01, 3.459e-02, -2.573e-01, 2.923e-01, 1.217e-01, 8.217e-02, 3.190e-01, 3.920e-01, 1.205e-01, 1.563e-02, 3.302e-02, 1.573e-01, -2.217e-01, -6.957e-02)); + r += mul(s4_8, M4(-5.015e-01, -3.158e-02, -6.849e-02, 9.000e-02, -3.464e-01, -3.587e-04, 2.693e-02, -3.674e-02, 1.743e-01, 1.260e-01, 5.700e-02, 1.168e-01, 1.287e-01, 4.054e-01, -1.939e-01, 9.138e-02)); + r += mul(s5_0, M4(-1.275e-01, 9.258e-02, -3.912e-02, -5.020e-02, -1.170e-01, 1.043e-01, 1.126e-01, 2.848e-02, 1.123e-02, -7.908e-02, -2.502e-02, 1.207e-01, -9.056e-02, 1.312e-01, 5.744e-02, -2.529e-03)); + r += mul(s5_1, M4(6.956e-02, 6.685e-02, 4.250e-02, 1.363e-01, -5.655e-02, 4.736e-01, 2.432e-02, 7.977e-03, 1.009e-01, -1.834e-01, 8.792e-03, -6.653e-02, -2.083e-01, 1.321e-02, 3.548e-02, 3.161e-02)); + r += mul(s5_2, M4(-1.823e-02, -9.938e-02, 1.187e-01, 1.367e-01, -5.580e-02, 1.312e-01, -1.650e-01, 5.498e-02, -1.319e-03, 4.431e-02, 1.802e-01, 1.547e-02, -6.616e-02, 1.764e-02, 2.344e-02, 4.526e-02)); + r += mul(s5_3, M4(-1.979e-01, 1.126e-02, 4.399e-02, -5.940e-02, -1.603e-01, -3.065e-01, 1.705e-01, -5.170e-02, -1.620e-02, 5.378e-03, -3.391e-02, -3.194e-02, -1.239e-01, 1.018e-01, 1.143e-02, -4.358e-03)); + r += mul(s5_4, M4(-1.316e-01, -1.408e-01, 3.692e-02, -6.235e-02, 9.756e-02, 1.965e-01, 1.613e-01, -1.826e-02, 1.529e-01, 2.658e-01, -1.722e-01, -2.159e-01, -9.866e-02, -4.192e-01, -7.198e-02, 1.045e-01)); + r += mul(s5_5, M4(-6.488e-02, -1.184e-01, -9.189e-02, 4.309e-02, -1.599e-01, -2.858e-01, 2.405e-01, 2.957e-02, 1.531e-01, -5.256e-02, -1.240e-01, 1.017e-01, -9.043e-02, -1.965e-01, 2.388e-01, -6.754e-02)); + r += mul(s5_6, M4(7.957e-02, 7.197e-02, -1.815e-01, 1.702e-01, 9.849e-02, -3.109e-01, -1.147e-01, 1.632e-01, 1.087e-01, 1.393e-02, 7.967e-02, -8.238e-02, -4.902e-02, -4.507e-02, 7.177e-03, -1.265e-02)); + r += mul(s5_7, M4(-7.930e-02, -3.751e-02, 2.822e-01, 1.702e-01, 4.284e-01, -4.733e-04, -1.522e-01, 4.036e-01, 1.503e-01, 1.747e-02, -2.079e-02, 2.941e-01, -1.312e-01, -1.859e-01, 4.046e-02, -4.338e-02)); + r += mul(s5_8, M4(2.182e-01, 1.775e-01, 4.035e-02, -1.053e-01, 2.385e-01, 1.134e-01, 2.134e-01, 6.980e-02, -1.202e-01, -2.052e-01, -1.275e-01, 6.549e-02, 3.340e-02, -2.139e-01, 1.350e-01, 1.552e-02)); + r += mul(s6_0, M4(2.772e-01, 7.592e-02, 2.153e-02, 2.310e-01, -7.911e-03, 3.401e-03, 1.073e-01, -4.014e-02, 1.460e-02, 8.533e-02, -4.139e-02, -6.476e-02, -2.862e-02, -1.944e-02, 3.860e-01, -4.332e-02)); + r += mul(s6_1, M4(4.812e-01, 1.803e-02, 3.650e-01, 4.224e-01, -1.578e-01, -1.214e-01, 8.779e-02, -7.715e-03, 1.075e-01, 2.096e-01, 6.006e-02, 8.946e-02, 3.282e-03, -4.351e-02, -7.451e-02, 1.163e-01)); + r += mul(s6_2, M4(3.159e-01, -1.897e-01, 2.192e-01, 1.379e-01, 6.565e-02, -1.496e-01, -6.414e-04, 1.160e-01, -4.805e-02, -7.635e-02, -5.523e-02, 5.868e-02, -5.129e-02, 5.904e-02, 1.374e-02, 5.361e-02)); + r += mul(s6_3, M4(4.315e-01, 1.023e-01, 1.276e-01, 4.328e-01, 9.514e-02, -8.882e-02, -1.540e-01, 6.534e-02, -1.634e-01, 7.222e-02, -6.178e-02, 1.048e-02, 4.497e-02, -1.487e-01, 2.292e-02, -2.380e-02)); + r += mul(s6_4, M4(-2.985e-01, -7.845e-02, 8.364e-01, 1.638e+00, -2.243e-01, 1.157e-01, -1.560e-02, -3.542e-01, 1.578e-01, -1.317e-02, -1.165e-01, -4.623e-02, -1.523e-01, -4.097e-02, 7.027e-02, -1.893e-01)); + r += mul(s6_5, M4(-4.130e-02, -6.393e-01, -6.269e-02, 2.810e-01, 6.838e-02, 2.387e-01, -3.504e-02, 4.013e-02, 3.874e-02, 6.386e-03, 5.781e-02, 5.188e-02, 1.292e-01, 1.734e-01, -4.389e-02, 8.661e-02)); + r += mul(s6_6, M4(-3.234e-01, -8.243e-02, 2.946e-01, -3.210e-02, -1.900e-03, 1.524e-01, 1.520e-01, 6.625e-02, 3.115e-02, -1.955e-01, -1.206e-01, 3.781e-02, -2.400e-02, -1.820e-01, 1.845e-01, 7.588e-02)); + r += mul(s6_7, M4(-4.346e-01, 1.289e-01, 7.611e-01, 4.578e-01, 6.179e-02, 7.028e-02, -1.120e-01, -3.356e-02, 2.095e-01, -2.202e-03, -2.747e-02, -7.018e-04, -4.247e-02, 2.166e-01, 1.138e-01, 7.714e-02)); + r += mul(s6_8, M4(1.182e-01, 4.479e-01, 1.944e-01, 2.369e-01, -9.513e-02, -3.546e-02, -1.288e-01, 5.557e-02, 4.410e-02, -8.010e-02, 1.142e-01, 2.252e-02, 5.250e-02, 5.762e-02, 9.484e-02, 1.049e-02)); + r += mul(s7_0, M4(2.362e-02, -7.456e-02, -8.570e-02, 1.749e-01, 7.050e-02, -1.714e-01, -2.974e-01, -1.436e-02, -1.732e-01, 1.164e-01, 2.513e-01, -5.570e-02, 1.232e-02, 4.972e-02, -3.535e-01, 1.783e-01)); + r += mul(s7_1, M4(1.016e-01, -5.980e-02, -9.087e-02, 1.968e-01, 5.459e-02, -2.606e-01, -3.196e-01, 4.241e-03, -7.105e-02, 7.151e-02, 2.115e-01, 1.034e-01, -1.907e-03, 9.728e-02, -1.425e-02, 3.176e-01)); + r += mul(s7_2, M4(6.123e-02, 1.818e-02, 6.712e-02, 8.668e-02, 8.312e-02, -1.384e-01, -2.917e-02, 7.580e-03, -3.688e-02, 2.069e-01, 3.602e-02, -1.538e-02, 2.226e-03, -1.482e-01, 5.510e-02, 9.440e-02)); + r += mul(s7_3, M4(-3.627e-02, 5.019e-02, -9.160e-02, 6.557e-02, 2.114e-01, -3.279e-01, -3.847e-02, 2.284e-01, 9.347e-03, 2.755e-01, 3.278e-01, -1.176e-01, 1.993e-01, 2.487e-01, -1.174e-01, 4.235e-01)); + r += mul(s7_4, M4(8.905e-02, -4.722e-02, -1.047e-01, -6.425e-01, 6.954e-02, -2.695e-02, 2.081e-01, -2.489e-01, -1.908e-01, -2.528e-02, 1.878e-01, 3.810e-02, -2.715e-01, -2.092e-01, -1.303e-01, -9.392e-02)); + r += mul(s7_5, M4(-5.402e-03, 2.137e-02, 8.297e-02, 5.125e-03, 1.445e-02, -1.290e-01, -9.459e-02, -1.349e-02, -3.473e-02, -1.413e-03, -3.585e-02, 8.633e-02, 8.299e-02, -9.031e-02, 1.890e-02, 8.582e-02)); + r += mul(s7_6, M4(-2.498e-02, -8.174e-02, 5.545e-02, 1.061e-01, 5.317e-02, -1.445e-01, -5.075e-02, -2.452e-02, -6.244e-02, 2.842e-01, 1.286e-01, 5.565e-02, -1.222e-01, -4.650e-03, -3.429e-01, 7.063e-02)); + r += mul(s7_7, M4(-4.282e-02, 4.579e-03, 8.260e-02, 4.414e-02, 7.506e-02, -3.467e-02, -1.103e-01, -2.087e-02, -3.690e-01, -2.446e-02, 4.477e-02, -5.426e-03, -7.949e-03, 1.122e-01, -2.450e-01, 1.310e-01)); + r += mul(s7_8, M4(5.690e-02, 3.884e-02, 1.819e-02, 1.769e-01, -3.959e-02, -2.336e-01, 8.080e-02, 3.858e-02, 5.694e-03, 1.613e-01, -1.850e-01, 1.164e-01, -2.013e-01, -1.304e-01, -9.271e-02, 2.405e-02)); + r += V4(6.665e-02, -2.861e-02, -7.364e-02, -7.743e-02); + return r; +} + +V4 f3(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-4.188e-02, 3.911e-02, -2.494e-03, -2.831e-02, -1.972e-01, 2.131e-01, 2.042e-04, -1.627e-02, 1.885e-01, 8.479e-02, 1.430e-01, -6.999e-02, -5.654e-02, 6.220e-02, 3.930e-02, -8.713e-02)); + r += mul(s0_1, M4(9.534e-04, -9.037e-02, -4.319e-02, 1.939e-01, -1.410e-01, -1.372e-01, -5.143e-01, 2.666e-03, 8.914e-02, 2.363e-01, -9.561e-02, 1.199e-01, 9.545e-02, 8.177e-02, -2.727e-02, 3.668e-02)); + r += mul(s0_2, M4(2.061e-01, 4.186e-02, 9.197e-02, 6.201e-02, 2.803e-01, 6.116e-02, 2.712e-01, 3.081e-01, 1.745e-01, -6.947e-02, 8.908e-02, -5.336e-03, -4.432e-02, 8.851e-02, 1.293e-01, 1.005e-01)); + r += mul(s0_3, M4(-1.996e-01, 4.379e-02, -1.397e-01, -1.841e-01, 1.023e-01, -2.295e-02, -1.174e-01, 3.601e-02, -2.838e-01, 9.978e-02, 1.481e-01, -1.023e-01, 3.961e-02, 6.618e-02, 9.490e-02, -2.691e-02)); + r += mul(s0_4, M4(3.418e-02, -1.448e-01, -1.010e-01, 2.336e-02, -1.532e-01, -7.991e-02, -1.969e-01, -1.017e-01, 5.245e-02, 2.387e-01, -2.388e-01, -1.195e-01, -1.677e-01, 6.502e-02, -2.937e-01, 1.324e-01)); + r += mul(s0_5, M4(1.576e-02, -4.273e-02, 8.894e-02, -5.236e-02, -2.616e-01, -1.620e-01, -5.406e-02, 3.255e-01, 3.261e-03, 1.246e-01, 1.157e-01, 1.764e-01, -1.268e-02, 3.138e-02, 1.725e-01, 5.102e-03)); + r += mul(s0_6, M4(-1.819e-01, 3.163e-02, -2.232e-01, -8.649e-02, 2.477e-01, 3.868e-02, -1.274e-01, -1.264e-01, -3.308e-02, -1.345e-01, -1.506e-01, -3.680e-02, 1.321e-01, 7.888e-03, 7.519e-02, -7.002e-02)); + r += mul(s0_7, M4(-3.134e-02, 8.152e-02, -1.868e-02, -6.641e-02, 1.172e-01, 1.674e-02, -1.663e-01, 9.303e-02, -7.864e-02, 3.147e-01, -5.638e-02, -7.548e-03, -1.552e-01, 1.281e-02, -6.565e-02, 1.074e-01)); + r += mul(s0_8, M4(1.213e-01, -6.248e-02, 7.482e-02, 9.157e-02, -8.935e-02, 1.599e-02, 1.405e-02, 1.277e-01, -2.177e-02, -5.653e-02, 1.523e-01, 1.668e-01, -1.860e-02, 7.483e-02, 6.869e-02, -1.209e-02)); + r += mul(s1_0, M4(2.365e-01, -2.096e-02, -1.695e-01, -8.783e-02, 1.421e-02, -1.485e-02, -8.857e-02, 9.697e-03, -8.778e-02, 8.530e-02, -1.804e-02, 5.474e-02, 1.052e-01, -1.055e-02, 9.641e-02, 1.474e-02)); + r += mul(s1_1, M4(4.347e-01, 2.115e-01, 1.887e-01, 2.844e-01, 5.543e-02, 1.159e-01, 2.477e-01, -9.212e-02, -1.935e-01, -5.802e-02, -1.655e-02, 4.781e-02, -6.906e-02, -1.315e-01, -5.511e-02, -1.924e-01)); + r += mul(s1_2, M4(-6.568e-02, -2.548e-01, 3.426e-02, 8.463e-02, 1.262e-02, -1.018e-01, -1.622e-01, -8.035e-03, 1.554e-01, -3.247e-02, 8.714e-02, -5.855e-02, -2.333e-01, -1.695e-01, -1.537e-02, 1.658e-01)); + r += mul(s1_3, M4(-1.008e-01, 2.533e-01, -9.077e-02, -7.201e-02, -9.625e-02, 1.257e-02, -3.490e-02, 6.242e-02, 1.221e-01, -2.578e-01, 4.224e-02, -3.465e-02, -2.070e-02, -1.371e-01, 1.174e-01, -5.439e-02)); + r += mul(s1_4, M4(-5.705e-01, 3.135e-01, -3.738e-01, 1.494e-01, 6.415e-02, -3.706e-03, 1.545e-01, -8.638e-02, -5.674e-02, -9.102e-02, -1.021e-01, 1.764e-01, 7.511e-02, 1.061e-01, 5.827e-03, 9.464e-02)); + r += mul(s1_5, M4(6.192e-01, -5.291e-02, 8.063e-02, -1.212e-01, 2.809e-01, 6.766e-02, 2.371e-02, 8.214e-02, 8.186e-02, -5.705e-02, -4.991e-02, 9.358e-02, 3.349e-01, -7.810e-02, 5.105e-03, -1.689e-02)); + r += mul(s1_6, M4(-8.209e-03, 1.708e-01, -6.446e-02, -5.466e-02, -5.550e-02, -7.580e-02, 1.763e-02, 7.632e-02, -2.885e-02, 1.813e-02, 3.694e-02, -1.628e-01, -1.729e-01, 1.523e-01, -4.755e-02, -1.874e-02)); + r += mul(s1_7, M4(-2.842e-02, -5.038e-01, -1.441e-01, -1.192e-01, -1.994e-01, 7.440e-02, -1.168e-01, -1.152e-01, -2.554e-02, 4.832e-02, -1.121e-03, -1.208e-01, -9.660e-02, 3.061e-02, -1.091e-01, -1.257e-01)); + r += mul(s1_8, M4(-1.060e-01, 1.430e-01, 6.638e-03, -8.655e-02, 5.032e-03, 6.352e-02, -1.219e-02, -1.721e-02, -2.960e-02, -9.753e-03, 1.217e-01, 6.606e-02, 1.146e-01, -2.372e-02, -1.066e-01, 1.112e-01)); + r += mul(s2_0, M4(1.512e-01, -1.360e-01, 1.003e-01, -2.228e-02, -1.981e-02, 5.680e-02, -2.351e-02, -2.149e-02, -3.795e-02, -6.851e-03, 6.286e-03, 5.634e-02, 3.187e-01, -7.946e-02, -1.691e-01, -3.474e-02)); + r += mul(s2_1, M4(1.811e-01, -2.832e-02, -3.044e-02, -2.047e-01, -6.424e-02, 7.703e-02, 6.279e-02, 5.720e-02, 2.866e-01, 1.931e-01, 6.403e-02, -3.005e-02, 5.048e-02, -1.983e-02, 2.380e-01, -4.797e-02)); + r += mul(s2_2, M4(-1.311e-01, -3.905e-02, -1.600e-02, -1.287e-01, 3.135e-02, -1.035e-01, 1.382e-02, 2.109e-01, -1.353e-01, 8.187e-02, -1.933e-02, -2.058e-01, -3.192e-01, 5.833e-03, 1.582e-01, 1.055e-01)); + r += mul(s2_3, M4(-7.578e-02, -1.802e-02, 1.142e-03, -6.449e-03, 1.890e-02, 8.185e-02, -1.360e-01, -1.382e-01, 2.346e-01, -1.593e-01, 1.064e-01, 8.349e-02, 8.157e-02, -7.758e-01, -4.485e-01, 1.432e-01)); + r += mul(s2_4, M4(-1.904e-01, -1.111e-02, 6.158e-02, 1.036e-03, -1.510e-01, 1.728e-01, -2.534e-01, 1.353e-01, 3.318e-02, 3.215e-01, -3.263e-01, 1.328e-01, -4.546e-01, 1.714e-01, 1.746e-01, 3.783e-01)); + r += mul(s2_5, M4(-1.312e-01, 5.085e-02, 3.116e-02, -8.743e-02, 2.796e-02, -8.472e-02, 7.036e-02, -8.341e-02, -2.516e-01, -5.612e-02, 8.958e-02, -1.229e-01, 2.736e-01, 1.007e-01, 1.740e-01, 2.939e-01)); + r += mul(s2_6, M4(6.271e-01, -6.375e-02, 3.872e-02, 1.205e-01, 1.454e-01, -1.306e-01, -2.290e-01, -1.096e-01, 5.513e-02, -1.251e-01, 7.400e-02, 4.007e-03, 2.942e-02, -1.990e-02, -4.658e-02, -2.138e-01)); + r += mul(s2_7, M4(1.030e-01, 2.035e-01, -9.021e-02, -2.600e-01, 9.415e-02, 1.905e-02, 1.688e-01, -3.456e-02, 2.280e-02, -4.347e-03, -9.776e-03, 1.257e-01, 4.754e-02, 7.155e-02, -7.335e-02, -1.227e-01)); + r += mul(s2_8, M4(4.734e-02, 8.976e-02, -7.800e-02, -4.560e-04, -9.280e-02, 8.119e-02, -4.994e-02, 2.394e-01, -9.923e-02, 1.476e-02, -3.865e-02, -5.304e-02, 4.677e-01, 2.234e-01, -2.916e-02, -7.769e-02)); + r += mul(s3_0, M4(8.064e-02, 1.291e-01, 7.727e-02, -1.999e-02, 1.549e-02, -4.633e-02, -3.663e-02, 1.059e-01, -6.190e-02, 1.411e-01, -6.361e-02, 9.450e-03, -1.625e-02, -1.700e-02, 1.808e-02, -1.312e-01)); + r += mul(s3_1, M4(3.164e-02, 8.257e-02, 9.946e-03, 5.608e-02, 2.040e-01, 1.026e-01, 4.893e-02, 4.471e-02, -2.647e-01, 5.232e-02, 8.367e-02, -4.396e-02, 1.204e-01, 2.318e-02, 2.416e-02, -5.404e-04)); + r += mul(s3_2, M4(-1.614e-01, -7.945e-02, -8.010e-02, 5.496e-03, 2.406e-01, 3.090e-01, 6.862e-02, 1.258e-01, -3.788e-02, 2.183e-01, 5.092e-02, -1.573e-01, 6.735e-02, -5.002e-02, 1.514e-01, 1.107e-01)); + r += mul(s3_3, M4(1.479e-01, 2.361e-02, 1.040e-01, 2.166e-02, -1.189e-01, 4.638e-03, 6.935e-02, -8.744e-03, 2.469e-01, -6.632e-02, 6.656e-02, 1.682e-01, -1.416e-01, 1.223e-01, -3.064e-01, 6.913e-03)); + r += mul(s3_4, M4(1.550e-01, 1.376e-01, -8.576e-02, 7.891e-02, 4.181e-02, -3.444e-04, -1.821e-01, 2.611e-01, -1.614e-01, 4.019e-02, -2.548e-01, 9.231e-02, -1.216e-01, -3.186e-02, -1.297e-01, -1.230e-01)); + r += mul(s3_5, M4(3.948e-02, 4.112e-02, -7.857e-03, -8.752e-02, 1.139e-01, 6.144e-02, 1.122e-01, 3.369e-02, -1.216e-01, -1.379e-01, 2.298e-01, -4.286e-01, -3.835e-02, -6.797e-02, 4.648e-02, 7.861e-02)); + r += mul(s3_6, M4(-2.087e-01, -1.544e-01, -9.079e-03, -1.595e-01, -1.079e-02, -1.745e-02, -8.393e-02, -5.607e-02, 2.371e-01, 2.013e-02, -3.454e-02, 3.150e-02, -8.327e-02, 2.099e-02, -2.286e-02, 5.170e-02)); + r += mul(s3_7, M4(-6.763e-02, -3.678e-02, 2.372e-02, 1.024e-01, -2.997e-01, 2.999e-01, 1.426e-01, -1.557e-01, 7.995e-02, -1.268e-02, -8.075e-02, 1.920e-01, 8.148e-03, -7.839e-03, -2.837e-02, 1.963e-02)); + r += mul(s3_8, M4(-5.668e-02, -1.421e-01, -5.679e-02, 1.756e-02, -7.119e-02, -2.055e-01, 9.936e-02, 1.253e-01, -1.029e-01, 2.465e-02, -4.078e-02, -2.501e-01, 7.316e-02, 1.241e-01, 1.499e-01, 6.111e-02)); + r += mul(s4_0, M4(-5.703e-02, 1.207e-01, 1.984e-02, -6.309e-02, -1.560e-02, -7.092e-02, -4.825e-02, -1.273e-01, 1.707e-02, -2.400e-02, 7.366e-02, 5.471e-03, 1.441e-01, 1.125e-01, 1.191e-01, -8.359e-02)); + r += mul(s4_1, M4(1.581e-01, 1.683e-01, 1.421e-02, 6.891e-02, 1.447e-02, 1.112e-01, -5.353e-02, 5.701e-02, -2.312e-01, -2.978e-02, -4.824e-03, 3.022e-01, -2.496e-01, 1.148e-01, -7.820e-02, -2.643e-01)); + r += mul(s4_2, M4(-1.181e-01, 2.555e-01, 2.130e-01, -3.359e-02, -1.143e-01, -8.525e-02, 2.284e-02, 1.125e-01, 3.372e-02, 4.638e-03, 6.635e-02, -2.298e-01, -2.304e-01, 2.675e-01, -3.765e-02, 1.185e-01)); + r += mul(s4_3, M4(-8.087e-02, -1.942e-01, -2.963e-01, -1.275e-01, 1.163e-01, -6.763e-02, 6.468e-02, 9.737e-02, 3.722e-01, -2.215e-01, 1.129e-01, 1.155e-01, -5.863e-02, -1.467e-02, -7.591e-03, 7.242e-02)); + r += mul(s4_4, M4(1.517e-01, -2.668e-02, -1.133e-01, 2.084e-02, 1.579e-01, -7.591e-02, -2.788e-01, -2.643e-02, -5.141e-01, 1.799e-01, -8.189e-03, 1.877e-01, 8.521e-02, -2.388e-01, 8.918e-02, -3.055e-01)); + r += mul(s4_5, M4(-4.801e-02, 1.488e-01, 4.658e-02, 1.361e-01, -3.208e-03, 7.001e-02, 9.136e-03, -9.821e-02, -4.169e-01, -1.277e-01, 7.576e-02, -2.144e-01, 1.671e-01, 3.049e-03, -1.878e-02, 3.510e-01)); + r += mul(s4_6, M4(-3.959e-02, -2.581e-01, 5.174e-02, -1.911e-01, 6.262e-02, 7.314e-03, 8.208e-02, -1.864e-02, -1.688e-01, -1.582e-01, 5.003e-02, -3.514e-02, 8.005e-02, 1.571e-01, 1.045e-01, -2.215e-02)); + r += mul(s4_7, M4(1.552e-01, -2.325e-01, -6.920e-02, 7.045e-02, 2.340e-02, -1.740e-01, 1.765e-01, 1.311e-01, 2.823e-01, 1.528e-01, 9.451e-02, -5.164e-02, -8.723e-02, 1.079e-01, -5.113e-02, -1.851e-01)); + r += mul(s4_8, M4(-2.172e-01, -2.458e-01, 1.762e-01, 6.071e-02, -4.242e-02, 4.728e-02, 5.004e-02, -3.509e-03, -6.302e-02, -1.150e-01, 1.248e-01, -1.306e-01, 3.278e-02, 5.849e-02, 6.113e-02, 6.530e-03)); + r += mul(s5_0, M4(2.186e-02, -8.463e-03, 2.938e-02, 2.110e-02, 1.763e-03, 4.754e-01, -1.752e-01, 4.844e-02, 1.616e-01, 8.694e-02, 1.584e-01, -5.774e-02, 4.046e-02, -1.407e-01, -1.444e-01, -6.617e-02)); + r += mul(s5_1, M4(3.854e-02, 1.206e-02, -2.397e-02, 1.277e-02, -3.590e-01, 3.185e-02, 1.971e-02, 4.395e-02, -2.453e-03, 5.720e-02, -6.919e-02, -1.315e-02, -1.392e-01, -2.179e-02, 5.873e-02, 1.179e-01)); + r += mul(s5_2, M4(1.175e-01, -1.706e-01, -5.034e-02, 1.384e-01, 3.400e-01, 4.653e-02, -3.204e-02, 2.707e-01, -2.241e-01, -6.196e-03, 1.705e-02, -2.575e-01, 2.917e-01, 3.558e-02, -4.881e-02, 2.312e-01)); + r += mul(s5_3, M4(-3.266e-02, 1.648e-01, -1.035e-01, -6.685e-02, -2.771e-01, 8.880e-02, 1.625e-01, 4.664e-02, 1.847e-01, 2.458e-01, 2.510e-01, -4.112e-02, 5.400e-02, -2.309e-02, -6.306e-02, 1.013e-01)); + r += mul(s5_4, M4(-1.191e-01, 7.659e-03, 1.893e-01, 8.074e-02, -4.872e-01, 2.676e-01, 6.461e-02, 1.923e-01, 2.383e-01, 1.264e-01, -4.948e-01, 1.789e-01, -4.451e-02, -1.557e-01, 3.381e-01, -4.749e-02)); + r += mul(s5_5, M4(9.079e-03, -2.406e-01, 1.096e-01, -7.782e-02, 2.432e-01, -8.577e-03, 2.335e-02, 5.146e-02, -3.574e-01, -1.064e-01, -1.162e-01, -3.525e-01, 2.478e-01, 2.060e-02, 6.505e-02, 3.386e-01)); + r += mul(s5_6, M4(4.418e-02, 2.185e-01, 1.616e-02, -4.339e-02, -1.643e-01, 2.276e-01, 2.055e-01, 1.004e-01, 1.394e-01, 2.683e-02, 1.894e-01, 1.381e-01, 2.891e-02, 3.274e-02, -1.072e-02, 4.000e-03)); + r += mul(s5_7, M4(-9.906e-02, 7.663e-02, -3.076e-02, -1.080e-02, 9.497e-03, 2.714e-01, -1.414e-01, -6.790e-02, 1.749e-01, 7.840e-02, 2.961e-01, 2.120e-01, -3.710e-01, -1.305e-03, -1.149e-01, -6.740e-02)); + r += mul(s5_8, M4(1.217e-01, 3.720e-01, -6.066e-02, -2.051e-02, 1.724e-01, 2.266e-01, 4.978e-03, 5.818e-02, -5.622e-02, -7.869e-02, 3.167e-02, 2.765e-02, -3.049e-02, -4.279e-02, 3.039e-02, 1.064e-01)); + r += mul(s6_0, M4(1.905e-01, -5.906e-01, -3.203e-01, -2.408e-01, 2.004e-01, 1.413e-01, 2.745e-01, 2.631e-02, -1.010e-01, 4.333e-02, -2.646e-01, 2.150e-02, -5.612e-02, -3.617e-03, 1.065e-01, 5.784e-02)); + r += mul(s6_1, M4(-6.313e-02, -4.270e-01, 1.188e-01, -8.757e-02, -8.934e-02, -4.415e-02, -1.320e-01, 5.785e-02, 2.906e-01, 9.523e-02, 1.325e-01, 3.187e-02, -3.050e-02, 2.539e-02, -9.284e-03, -2.695e-02)); + r += mul(s6_2, M4(3.490e-02, 6.192e-02, 7.606e-02, -6.606e-02, -6.879e-02, 6.426e-02, -2.263e-02, -2.917e-02, 5.522e-02, 9.662e-02, 9.221e-02, -3.130e-02, -6.562e-02, -8.454e-02, 4.558e-02, 3.649e-02)); + r += mul(s6_3, M4(-2.788e-01, -1.476e-01, -3.335e-01, -1.557e-01, 9.530e-02, -1.893e-01, 4.636e-01, -8.215e-02, -3.601e-01, 1.247e-01, -3.906e-01, 6.218e-02, 6.371e-02, 8.757e-02, 1.279e-01, -6.788e-02)); + r += mul(s6_4, M4(-3.870e-01, -3.416e-01, 6.768e-01, -1.327e-01, -4.949e-02, -2.135e-01, -3.057e-01, 5.377e-01, -1.211e-01, 1.121e-01, 7.310e-02, -5.575e-02, 1.120e-01, 9.291e-02, -3.408e-01, 1.694e-01)); + r += mul(s6_5, M4(4.870e-02, 2.610e-01, -7.851e-03, 2.329e-01, -6.136e-02, -1.045e-01, 7.367e-02, -9.340e-02, 2.040e-01, -6.531e-02, 1.480e-01, -4.656e-02, 1.423e-01, -9.352e-03, 1.209e-01, 7.090e-03)); + r += mul(s6_6, M4(-1.423e-01, -4.668e-01, -2.745e-01, -2.214e-02, -6.964e-02, -6.048e-02, 2.676e-01, -7.026e-03, -1.628e-01, 1.677e-01, -2.451e-01, -1.609e-02, -7.104e-02, 1.026e-01, 7.345e-02, -7.246e-02)); + r += mul(s6_7, M4(-2.397e-01, 5.067e-02, -2.079e-01, 2.579e-02, 2.359e-02, -3.813e-02, -3.910e-02, -2.711e-03, -4.485e-02, 6.503e-02, 1.338e-01, 1.947e-02, -5.614e-02, -1.120e-01, -6.167e-02, -7.495e-02)); + r += mul(s6_8, M4(-2.891e-02, 9.384e-02, 1.046e-01, 1.467e-01, 5.332e-02, -7.476e-03, 2.731e-02, -6.231e-02, -3.199e-02, 4.240e-02, -8.893e-04, 8.002e-02, 3.404e-02, -7.099e-03, -4.124e-02, 1.343e-01)); + r += mul(s7_0, M4(6.439e-03, -3.159e-02, -7.080e-02, -2.024e-02, -2.219e-01, -1.744e-01, -2.094e-01, 9.819e-02, -2.095e-01, 5.943e-02, -1.185e-01, 6.477e-02, 1.859e-01, 1.926e-01, 3.075e-02, -9.657e-02)); + r += mul(s7_1, M4(3.378e-02, -8.277e-02, 5.498e-03, 2.163e-02, -3.447e-01, 1.273e-02, 1.832e-01, -3.245e-01, 1.922e-01, -2.858e-01, -2.330e-02, 4.936e-02, -3.989e-02, 2.286e-01, -2.226e-01, -4.291e-02)); + r += mul(s7_2, M4(1.610e-01, -4.787e-02, 1.686e-01, -9.226e-03, -1.239e-02, 6.896e-02, 4.769e-02, -1.828e-01, -1.080e-01, 1.338e-01, 8.961e-04, -4.600e-03, 3.174e-01, 1.484e-01, 6.866e-02, 1.677e-01)); + r += mul(s7_3, M4(-2.186e-01, 1.113e-01, -1.255e-01, -1.763e-01, 5.137e-01, -2.105e-01, 3.290e-01, 5.426e-02, 3.304e-01, 1.222e-01, -3.562e-01, -4.745e-02, -2.218e-01, -1.034e-01, 3.933e-01, -2.037e-01)); + r += mul(s7_4, M4(1.024e-01, -1.234e-01, 8.316e-02, -1.358e-02, 2.174e-01, 2.707e-01, -1.130e-01, -2.329e-01, 6.534e-02, -2.604e-01, 4.130e-03, -9.019e-02, -4.505e-01, 2.406e-01, -3.111e-01, 6.225e-03)); + r += mul(s7_5, M4(5.314e-02, -7.235e-02, 5.180e-02, 2.898e-01, -4.080e-02, -2.012e-02, 5.062e-02, 1.625e-02, -5.302e-02, 6.459e-02, 5.811e-02, 8.758e-02, 6.558e-02, -3.686e-01, 3.314e-02, -4.048e-02)); + r += mul(s7_6, M4(-1.078e-01, -3.606e-03, -4.979e-02, -1.336e-01, 3.099e-01, -1.052e-02, 1.959e-01, 4.290e-02, 2.026e-01, -2.581e-02, 2.090e-02, -2.610e-01, 1.948e-01, 2.015e-02, 3.395e-02, -1.098e-01)); + r += mul(s7_7, M4(-5.818e-02, 6.125e-02, -8.358e-02, -9.321e-02, -9.888e-02, -3.231e-02, -1.697e-01, -1.265e-01, 3.775e-01, -1.196e-01, -3.976e-02, 3.943e-01, 2.197e-01, 2.273e-01, 6.525e-02, 1.704e-01)); + r += mul(s7_8, M4(5.946e-02, 1.244e-02, 7.324e-02, 6.264e-02, 6.809e-02, 1.185e-01, -4.188e-02, 9.021e-02, 6.260e-02, -1.134e-01, -2.057e-02, 1.018e-01, -2.984e-01, -5.999e-02, 7.880e-02, 2.304e-01)); + r += V4(3.921e-03, 1.878e-02, 2.174e-02, -2.472e-02); + return r; +} + +void Pass2(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = Rmp8x8(tid.x) + blockStart; + uint2 size = GetInputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = (gxy + 0.5) * pt; + + V4 s0_0 = l0(-1.0, -1.0); + V4 s0_1 = l0(0.0, -1.0); + V4 s0_2 = l0(1.0, -1.0); + V4 s0_3 = l0(-1.0, 0.0); + V4 s0_4 = l0(0.0, 0.0); + V4 s0_5 = l0(1.0, 0.0); + V4 s0_6 = l0(-1.0, 1.0); + V4 s0_7 = l0(0.0, 1.0); + V4 s0_8 = l0(1.0, 1.0); + V4 s1_0 = -max(-s0_0, 0.0); + V4 s1_1 = -max(-s0_1, 0.0); + V4 s1_2 = -max(-s0_2, 0.0); + V4 s1_3 = -max(-s0_3, 0.0); + V4 s1_4 = -max(-s0_4, 0.0); + V4 s1_5 = -max(-s0_5, 0.0); + V4 s1_6 = -max(-s0_6, 0.0); + V4 s1_7 = -max(-s0_7, 0.0); + V4 s1_8 = -max(-s0_8, 0.0); + s0_0 = max(s0_0, 0.0); + s0_1 = max(s0_1, 0.0); + s0_2 = max(s0_2, 0.0); + s0_3 = max(s0_3, 0.0); + s0_4 = max(s0_4, 0.0); + s0_5 = max(s0_5, 0.0); + s0_6 = max(s0_6, 0.0); + s0_7 = max(s0_7, 0.0); + s0_8 = max(s0_8, 0.0); + + V4 s2_0 = l1(-1.0, -1.0); + V4 s2_1 = l1(0.0, -1.0); + V4 s2_2 = l1(1.0, -1.0); + V4 s2_3 = l1(-1.0, 0.0); + V4 s2_4 = l1(0.0, 0.0); + V4 s2_5 = l1(1.0, 0.0); + V4 s2_6 = l1(-1.0, 1.0); + V4 s2_7 = l1(0.0, 1.0); + V4 s2_8 = l1(1.0, 1.0); + V4 s3_0 = -max(-s2_0, 0.0); + V4 s3_1 = -max(-s2_1, 0.0); + V4 s3_2 = -max(-s2_2, 0.0); + V4 s3_3 = -max(-s2_3, 0.0); + V4 s3_4 = -max(-s2_4, 0.0); + V4 s3_5 = -max(-s2_5, 0.0); + V4 s3_6 = -max(-s2_6, 0.0); + V4 s3_7 = -max(-s2_7, 0.0); + V4 s3_8 = -max(-s2_8, 0.0); + s2_0 = max(s2_0, 0.0); + s2_1 = max(s2_1, 0.0); + s2_2 = max(s2_2, 0.0); + s2_3 = max(s2_3, 0.0); + s2_4 = max(s2_4, 0.0); + s2_5 = max(s2_5, 0.0); + s2_6 = max(s2_6, 0.0); + s2_7 = max(s2_7, 0.0); + s2_8 = max(s2_8, 0.0); + + V4 s4_0 = l2(-1.0, -1.0); + V4 s4_1 = l2(0.0, -1.0); + V4 s4_2 = l2(1.0, -1.0); + V4 s4_3 = l2(-1.0, 0.0); + V4 s4_4 = l2(0.0, 0.0); + V4 s4_5 = l2(1.0, 0.0); + V4 s4_6 = l2(-1.0, 1.0); + V4 s4_7 = l2(0.0, 1.0); + V4 s4_8 = l2(1.0, 1.0); + V4 s5_0 = -max(-s4_0, 0.0); + V4 s5_1 = -max(-s4_1, 0.0); + V4 s5_2 = -max(-s4_2, 0.0); + V4 s5_3 = -max(-s4_3, 0.0); + V4 s5_4 = -max(-s4_4, 0.0); + V4 s5_5 = -max(-s4_5, 0.0); + V4 s5_6 = -max(-s4_6, 0.0); + V4 s5_7 = -max(-s4_7, 0.0); + V4 s5_8 = -max(-s4_8, 0.0); + s4_0 = max(s4_0, 0.0); + s4_1 = max(s4_1, 0.0); + s4_2 = max(s4_2, 0.0); + s4_3 = max(s4_3, 0.0); + s4_4 = max(s4_4, 0.0); + s4_5 = max(s4_5, 0.0); + s4_6 = max(s4_6, 0.0); + s4_7 = max(s4_7, 0.0); + s4_8 = max(s4_8, 0.0); + + V4 s6_0 = l3(-1.0, -1.0); + V4 s6_1 = l3(0.0, -1.0); + V4 s6_2 = l3(1.0, -1.0); + V4 s6_3 = l3(-1.0, 0.0); + V4 s6_4 = l3(0.0, 0.0); + V4 s6_5 = l3(1.0, 0.0); + V4 s6_6 = l3(-1.0, 1.0); + V4 s6_7 = l3(0.0, 1.0); + V4 s6_8 = l3(1.0, 1.0); + V4 s7_0 = -max(-s6_0, 0.0); + V4 s7_1 = -max(-s6_1, 0.0); + V4 s7_2 = -max(-s6_2, 0.0); + V4 s7_3 = -max(-s6_3, 0.0); + V4 s7_4 = -max(-s6_4, 0.0); + V4 s7_5 = -max(-s6_5, 0.0); + V4 s7_6 = -max(-s6_6, 0.0); + V4 s7_7 = -max(-s6_7, 0.0); + V4 s7_8 = -max(-s6_8, 0.0); + s6_0 = max(s6_0, 0.0); + s6_1 = max(s6_1, 0.0); + s6_2 = max(s6_2, 0.0); + s6_3 = max(s6_3, 0.0); + s6_4 = max(s6_4, 0.0); + s6_5 = max(s6_5, 0.0); + s6_6 = max(s6_6, 0.0); + s6_7 = max(s6_7, 0.0); + s6_8 = max(s6_8, 0.0); + + t4[gxy] = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t5[gxy] = f1(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t6[gxy] = f2(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t7[gxy] = f3(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); +} + +//!PASS 3 +//!DESC conv2 +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 +//!IN t4, t5, t6, t7 +//!OUT t0, t1, t2, t3 + +#define l0(x, y) V4(O(t4, float2(x, y))) +#define l1(x, y) V4(O(t5, float2(x, y))) +#define l2(x, y) V4(O(t6, float2(x, y))) +#define l3(x, y) V4(O(t7, float2(x, y))) + +V4 f0(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(2.212e-01, 2.454e-01, -1.446e-01, 1.203e-01, -4.809e-02, 4.895e-03, 2.550e-02, 3.495e-02, -3.779e-02, 2.177e-02, -5.566e-02, 6.897e-02, -4.681e-02, 6.815e-03, -6.666e-02, -4.678e-02)); + r += mul(s0_1, M4(-4.755e-01, 2.214e-01, -4.025e-02, -1.050e-01, 1.359e-01, -3.377e-03, -1.989e-02, 5.404e-02, -2.671e-03, -8.268e-02, 7.647e-02, 4.717e-02, -1.557e-02, -5.494e-02, 1.315e-01, -6.446e-03)); + r += mul(s0_2, M4(-2.166e-01, -3.459e-01, 1.548e-01, -1.338e-01, -1.053e-02, 2.242e-01, -8.194e-02, 9.585e-02, -6.271e-02, 1.752e-01, -8.877e-03, 9.082e-02, 1.508e-02, -1.941e-02, 1.588e-02, 3.329e-02)); + r += mul(s0_3, M4(2.467e-01, 2.249e-01, 1.149e-02, -7.518e-02, 3.673e-03, -9.865e-02, 4.413e-02, 1.193e-01, 1.032e-01, 1.033e-01, -8.545e-02, 2.160e-01, -5.246e-02, -1.470e-01, 1.206e-02, -1.987e-02)); + r += mul(s0_4, M4(6.004e-02, -8.828e-02, -1.406e-01, -4.759e-03, 8.425e-02, 6.162e-02, -6.374e-02, -3.446e-02, -6.185e-02, 1.739e-02, -9.953e-02, 1.651e-01, -3.235e-02, -7.202e-02, 6.607e-02, 4.503e-02)); + r += mul(s0_5, M4(-8.011e-02, -1.428e-02, 8.263e-01, 1.851e-02, -1.110e-01, -1.280e-01, -6.627e-02, 2.972e-02, 5.936e-04, 1.779e-02, -1.123e-01, 4.516e-02, 5.523e-02, 1.052e-01, -2.980e-02, -1.024e-01)); + r += mul(s0_6, M4(-1.973e-01, -3.293e-01, 4.685e-02, -4.712e-02, 3.160e-02, -1.253e-01, 8.609e-03, -1.802e-01, 6.503e-02, -3.227e-02, 6.668e-02, -3.067e-02, -2.189e-01, 2.032e-01, -1.786e-02, -1.548e-01)); + r += mul(s0_7, M4(-7.875e-03, -2.037e-01, -2.293e-01, -1.999e-01, 1.738e-02, -1.747e-01, 7.696e-02, 1.080e-01, -1.258e-01, -1.728e-02, 5.457e-02, 2.354e-01, 1.137e-01, 8.128e-02, -8.535e-02, -1.716e-01)); + r += mul(s0_8, M4(-1.705e-01, 1.495e-01, 1.148e-01, -3.005e-02, -1.323e-01, 2.338e-01, 1.695e-02, 7.834e-02, -1.096e-01, -2.646e-02, -9.663e-02, 1.223e-02, 3.244e-01, 2.172e-01, -6.180e-02, -1.141e-01)); + r += mul(s1_0, M4(2.153e-01, 2.090e-01, 7.578e-03, 8.058e-02, -3.850e-02, -4.181e-02, 3.850e-02, -5.033e-02, -4.772e-02, 1.897e-01, 1.058e-02, 1.598e-01, -4.700e-02, 2.071e-01, 7.882e-02, 9.560e-02)); + r += mul(s1_1, M4(-1.755e-01, 5.417e-02, -1.480e-03, 6.746e-02, 1.306e-01, 2.608e-02, 1.655e-01, -2.009e-01, -6.070e-03, 1.411e-01, 1.808e-03, -1.645e-01, 2.538e-02, 6.212e-03, 1.568e-02, -1.292e-01)); + r += mul(s1_2, M4(4.012e-02, -9.499e-02, 6.889e-02, 1.433e-03, -1.366e-02, -1.862e-02, -3.913e-03, -6.391e-02, -1.184e-01, -8.437e-02, -7.939e-02, 7.770e-02, -1.310e-01, -5.947e-02, -2.605e-02, 2.056e-01)); + r += mul(s1_3, M4(-5.553e-02, -8.364e-02, -4.346e-02, -6.295e-02, -2.389e-01, -1.519e-01, 3.629e-02, -1.357e-01, 1.861e-01, 4.494e-02, -7.831e-02, -1.440e-01, 8.470e-02, 2.375e-01, -5.131e-02, 8.162e-02)); + r += mul(s1_4, M4(-1.542e-02, -2.632e-01, 5.705e-04, -8.803e-03, 3.299e-01, 2.544e-01, 6.760e-02, 1.361e-01, -1.028e-01, 1.969e-01, -5.706e-02, -3.219e-02, -1.354e-01, -9.802e-02, 5.579e-03, -1.029e-01)); + r += mul(s1_5, M4(8.236e-03, 4.757e-02, -1.364e-01, 8.383e-02, -5.845e-02, 1.069e-02, 9.025e-02, -1.442e-01, 2.297e-01, -9.455e-03, 1.582e-01, -1.652e-01, -1.464e-01, 2.857e-02, -7.026e-03, 1.508e-02)); + r += mul(s1_6, M4(-5.483e-02, 1.512e-01, -6.832e-02, 2.700e-02, 9.996e-02, 7.300e-02, -7.276e-02, 6.971e-04, 2.286e-01, 7.757e-03, 1.104e-01, -4.327e-02, 2.467e-01, -1.336e-01, -1.043e-01, -2.068e-01)); + r += mul(s1_7, M4(1.299e-02, -4.620e-02, 5.300e-02, -7.250e-02, -1.643e-01, 6.016e-02, 3.074e-02, -1.602e-03, -1.272e-01, -1.616e-01, 3.392e-02, -1.739e-01, -1.736e-01, -3.615e-01, 9.518e-02, 3.172e-02)); + r += mul(s1_8, M4(1.366e-01, 2.474e-02, 1.869e-02, -7.502e-02, -1.707e-01, 6.866e-03, 1.730e-02, -3.564e-01, -1.743e-02, 2.640e-01, -7.773e-02, -1.156e-01, -1.503e-01, 2.721e-01, -5.628e-02, 7.231e-02)); + r += mul(s2_0, M4(5.409e-02, 2.008e-01, -1.055e-02, 2.275e-02, 5.160e-02, -3.948e-02, 8.856e-03, 6.052e-02, 1.490e-01, 1.651e-02, -5.934e-02, 1.815e-01, 2.453e-01, 6.284e-03, -7.930e-02, 1.752e-02)); + r += mul(s2_1, M4(-1.884e-01, 2.381e-01, 6.626e-02, 4.132e-02, 1.137e-01, 5.828e-02, -1.162e-01, -1.047e-01, 1.733e-01, 9.714e-02, 1.684e-02, -4.726e-03, -4.425e-02, 1.308e-01, -4.460e-02, -5.757e-02)); + r += mul(s2_2, M4(-1.542e-01, -3.185e-02, 9.634e-02, -1.251e-01, 1.490e-02, -2.816e-02, -1.006e-02, 4.482e-02, 2.626e-01, 2.221e-01, -1.039e-01, 2.020e-01, 2.064e-01, 8.088e-02, 9.808e-02, -2.205e-02)); + r += mul(s2_3, M4(-1.850e-01, -1.351e-01, -2.917e-02, -8.903e-02, 9.033e-02, 1.841e-01, -8.272e-02, 5.601e-02, 1.014e-01, -2.128e-02, 2.091e-03, 2.212e-01, 7.023e-02, 1.933e-01, -2.272e-01, -3.150e-01)); + r += mul(s2_4, M4(-1.211e-01, -2.385e-01, -6.887e-02, -6.697e-02, 7.170e-02, 1.047e-01, -2.363e-02, -9.154e-02, 9.584e-02, -3.987e-02, -2.447e-01, 1.670e-01, 4.113e-02, -2.052e-01, -4.104e-02, -4.027e-02)); + r += mul(s2_5, M4(-1.085e-01, -8.478e-02, 2.455e-02, -1.240e-01, 5.816e-02, -2.644e-01, 1.125e-01, 2.009e-02, -1.308e-01, -1.138e-01, -4.613e-02, -1.862e-01, -9.501e-02, -9.699e-02, 3.395e-01, 5.730e-02)); + r += mul(s2_6, M4(6.815e-02, -2.550e-01, 2.668e-02, 3.038e-01, -5.298e-02, -2.368e-01, -2.784e-02, 5.199e-02, -4.197e-02, 1.275e-01, -2.058e-02, -5.542e-02, 2.150e-01, -7.770e-02, -8.895e-03, 7.471e-02)); + r += mul(s2_7, M4(-4.084e-01, -4.059e-02, 1.784e-02, 2.544e-01, -1.274e-01, -3.351e-01, 1.204e-01, -1.889e-01, -1.438e-01, 1.072e-01, 5.287e-02, -2.757e-01, -5.043e-02, 2.986e-02, -1.980e-01, 7.566e-02)); + r += mul(s2_8, M4(-6.861e-03, 2.390e-01, 1.255e-01, 5.195e-02, -3.367e-01, -1.951e-01, -5.925e-02, 2.316e-01, -2.390e-01, 2.294e-01, -7.012e-02, -5.888e-02, -1.562e-01, -2.314e-02, 5.731e-02, 7.487e-02)); + r += mul(s3_0, M4(-4.302e-02, 2.332e-03, -8.797e-02, -7.757e-03, 6.083e-02, 2.518e-03, -1.708e-02, 4.168e-02, -8.930e-02, -1.290e-01, -1.024e-01, -5.323e-02, -2.374e-01, -8.708e-02, -8.992e-02, 6.791e-02)); + r += mul(s3_1, M4(1.011e-01, 4.688e-02, -4.851e-02, 5.773e-02, -2.069e-02, 3.742e-02, -2.873e-02, 5.670e-02, -4.502e-02, -1.294e-01, 4.502e-03, -2.117e-02, 3.284e-01, 1.058e-01, 5.544e-02, 1.677e-02)); + r += mul(s3_2, M4(-3.529e-02, 3.277e-02, 4.281e-02, -1.646e-01, -1.416e-01, 5.331e-02, 3.031e-02, -9.500e-02, -1.216e-01, -9.459e-02, 3.225e-02, 1.333e-01, 6.765e-02, 1.066e-01, -1.228e-01, 8.375e-02)); + r += mul(s3_3, M4(2.865e-02, 6.776e-02, -1.468e-01, 1.705e-02, 1.683e-01, 2.070e-01, -5.935e-03, 2.404e-01, 5.563e-03, -1.044e-01, -4.681e-02, -6.475e-02, 1.726e-01, -8.206e-02, -8.217e-02, 1.699e-01)); + r += mul(s3_4, M4(-1.561e-01, 1.354e-01, 1.323e-01, -1.370e-01, -1.199e-01, -1.138e-01, 8.551e-03, 7.738e-02, 2.900e-01, 2.553e-01, 1.056e-02, -3.161e-02, -2.244e-01, -8.941e-02, -3.090e-02, 1.149e-01)); + r += mul(s3_5, M4(1.853e-01, -1.157e-01, 3.784e-03, -1.762e-02, -2.290e-01, 2.807e-02, 4.872e-02, -1.992e-01, -2.161e-01, 2.253e-01, -1.192e-01, 1.535e-01, -9.834e-02, 1.402e-02, -2.921e-02, 1.029e-01)); + r += mul(s3_6, M4(-6.681e-02, -2.734e-02, -7.752e-02, 1.202e-01, -6.007e-02, 1.529e-01, -1.549e-02, 3.140e-01, 5.553e-02, 5.046e-02, -3.036e-02, 1.311e-02, 1.555e-01, 1.706e-01, 1.118e-02, -9.797e-02)); + r += mul(s3_7, M4(-1.464e-01, 1.390e-01, -1.009e-01, 1.939e-01, 8.315e-02, 7.123e-02, -1.456e-01, -3.606e-02, -1.194e-01, 2.929e-02, 1.934e-01, -4.639e-02, 1.440e-01, -9.890e-02, 1.106e-01, -2.761e-01)); + r += mul(s3_8, M4(1.840e-01, -1.987e-01, 3.754e-02, 1.706e-01, 2.631e-02, -1.048e-01, -7.390e-02, -2.744e-01, 3.353e-01, -3.437e-01, -2.453e-02, -1.555e-02, 2.551e-02, -1.634e-01, -3.265e-02, -4.991e-02)); + r += mul(s4_0, M4(-1.614e-01, 3.217e-02, 2.040e-02, -5.201e-02, 1.162e-01, 7.774e-02, 5.804e-02, 5.019e-02, -1.326e-01, -8.524e-02, 4.765e-03, -3.015e-01, -3.097e-01, 6.249e-01, -4.764e-01, -1.097e-01)); + r += mul(s4_1, M4(2.482e-01, -7.808e-02, 4.798e-02, -2.799e-02, 3.943e-02, 3.450e-01, 8.065e-02, 2.050e-01, -5.876e-02, -1.702e-01, -1.998e-01, -4.602e-01, -6.030e-01, -7.888e-01, -1.939e-01, -7.929e-01)); + r += mul(s4_2, M4(5.042e-02, 3.316e-02, 1.540e-01, 7.098e-02, 7.762e-02, -1.345e-02, -6.667e-02, 7.275e-02, -2.205e-01, 5.857e-02, -4.728e-02, -3.452e-02, -2.423e-02, -2.893e-01, -5.288e-01, 4.894e-01)); + r += mul(s4_3, M4(2.116e-02, -6.328e-02, -3.709e-02, 5.392e-02, 6.060e-02, 2.983e-02, -2.665e-02, -2.008e-01, 1.694e-02, -3.005e-01, 1.903e-01, 2.144e-02, -2.694e-02, -1.083e+00, 2.387e-01, -2.326e-01)); + r += mul(s4_4, M4(-4.878e-02, -1.432e-01, 9.417e-02, 3.703e-02, -2.023e-01, -2.737e-02, 4.717e-02, -1.997e-01, 1.266e-01, -1.233e-02, -1.508e-01, -1.969e-02, 5.024e-01, -1.841e-01, -1.062e+00, -1.704e-01)); + r += mul(s4_5, M4(8.148e-02, -3.165e-02, -4.487e-02, -1.383e-02, 1.128e-01, -1.619e-01, -2.010e-02, 2.163e-02, -2.844e-02, -7.585e-02, -7.373e-02, 2.590e-02, 1.708e-01, 2.063e-01, -9.584e-01, 2.464e-01)); + r += mul(s4_6, M4(-2.254e-01, 5.652e-02, 8.183e-02, 1.288e-01, -4.934e-02, -2.113e-01, 2.622e-02, -1.164e-01, -3.864e-01, -2.177e-02, -3.944e-03, 1.932e-01, -4.718e-01, 1.481e-01, -3.146e-01, -7.798e-01)); + r += mul(s4_7, M4(1.397e-01, 7.781e-04, -7.422e-02, -8.363e-04, -3.861e-02, 2.361e-01, -5.971e-02, -5.968e-02, 4.388e-01, 6.492e-02, -2.985e-02, -2.851e-01, 4.776e-01, -2.561e-01, -3.868e-01, -7.250e-01)); + r += mul(s4_8, M4(8.290e-02, 1.899e-01, 8.968e-02, -8.672e-02, 1.264e-01, -1.086e-01, 3.075e-02, 1.026e-01, -3.738e-01, -1.710e-02, -1.849e-01, 3.125e-01, 1.557e-02, 1.924e-01, -5.640e-01, 4.823e-01)); + r += mul(s5_0, M4(-2.199e-01, -2.204e-01, -3.381e-02, -8.068e-02, -7.093e-02, 3.299e-02, -3.280e-02, -2.355e-02, 6.614e-02, -2.524e-02, -6.671e-03, -2.634e-02, -4.228e-02, 8.667e-02, -1.000e-02, 2.644e-02)); + r += mul(s5_1, M4(4.993e-02, 8.674e-02, 1.256e-02, 3.661e-02, -5.597e-02, -3.691e-02, 1.224e-01, -1.100e-03, -2.995e-02, -5.264e-02, 2.138e-02, -5.663e-02, 7.679e-02, -3.386e-02, 2.181e-02, -7.541e-02)); + r += mul(s5_2, M4(2.458e-02, -5.279e-01, 6.858e-02, -6.139e-02, 2.203e-01, 1.888e-01, 5.875e-02, 2.987e-02, 5.732e-02, 1.023e-01, -8.229e-03, 4.815e-02, 5.105e-02, -4.501e-05, 3.425e-02, 2.668e-02)); + r += mul(s5_3, M4(8.183e-02, -2.298e-02, -4.129e-02, 9.875e-02, 4.211e-02, -1.205e-01, 8.649e-02, -2.774e-02, 1.283e-01, -7.503e-02, 1.555e-01, -4.780e-02, -1.808e-01, -5.178e-02, 9.190e-02, -9.965e-02)); + r += mul(s5_4, M4(-4.966e-01, -7.886e-02, 5.324e-02, -1.069e-01, -1.466e-01, -1.293e-01, -1.252e-01, 5.233e-02, 1.714e-01, -5.468e-02, 9.061e-02, 5.902e-02, -6.234e-02, -6.380e-02, -7.879e-02, -1.139e-01)); + r += mul(s5_5, M4(-4.539e-01, -1.093e-01, -3.171e-01, 8.606e-02, 3.207e-02, -3.530e-01, -3.926e-02, 1.447e-01, -1.871e-01, 1.184e-01, 1.986e-01, -1.303e-01, 9.940e-02, -1.997e-02, -7.409e-02, 1.339e-01)); + r += mul(s5_6, M4(6.859e-02, 1.065e-01, -6.674e-02, -7.343e-02, -2.186e-02, -1.898e-02, 8.683e-02, -2.241e-01, -1.526e-01, -1.297e-01, 1.090e-01, 1.081e-01, -1.008e-01, -2.101e-02, -2.802e-02, -5.817e-03)); + r += mul(s5_7, M4(-2.935e-01, 2.552e-01, -1.772e-01, -3.008e-02, 2.061e-02, 1.602e-01, -1.067e-01, -1.088e-01, -9.616e-02, -4.000e-03, -1.740e-01, 1.931e-02, 1.135e-01, -1.029e-02, -2.060e-01, 1.138e-01)); + r += mul(s5_8, M4(2.994e-01, -1.938e-01, -3.579e-02, -3.688e-01, 1.932e-01, 7.019e-02, -5.929e-02, 5.967e-02, -6.230e-02, 2.406e-01, -1.282e-01, 4.323e-02, 5.835e-02, -9.893e-02, -2.381e-02, 1.695e-02)); + r += mul(s6_0, M4(-1.354e-01, -3.961e-02, 6.492e-02, -8.158e-02, -4.522e-02, -1.466e-01, 1.229e-01, 1.025e-01, -1.393e-01, 1.328e-01, 5.425e-02, -9.843e-02, -6.086e-02, -9.741e-02, 8.276e-02, 1.117e-01)); + r += mul(s6_1, M4(2.726e-01, -1.876e-02, -7.329e-02, 6.114e-03, 1.353e-01, 6.079e-02, -1.053e-01, 9.964e-03, 6.344e-02, 1.528e-01, -4.556e-02, -2.029e-01, -7.652e-02, -7.684e-02, 2.392e-02, -8.908e-02)); + r += mul(s6_2, M4(1.107e-01, 1.692e-01, 8.991e-02, 6.804e-03, 1.382e-01, 1.504e-01, 6.543e-02, 1.005e-02, 1.183e-01, -6.809e-02, -6.099e-03, 8.215e-02, 1.307e-01, -4.720e-02, -4.203e-02, 8.069e-02)); + r += mul(s6_3, M4(-2.380e-01, -7.450e-02, 9.634e-02, -1.225e-01, -1.447e-01, 1.746e-03, -6.290e-02, 9.689e-02, 5.720e-03, -5.844e-02, 2.926e-02, -1.172e-02, -2.900e-01, -5.345e-02, 1.743e-02, -1.469e-01)); + r += mul(s6_4, M4(1.879e-01, 2.363e-01, 5.324e-02, 5.700e-03, -1.848e-01, 4.805e-02, -2.434e-01, -1.537e-01, 1.913e-01, 1.772e-01, -1.126e-01, -1.782e-01, -2.319e-01, -2.431e-01, 2.707e-01, -9.524e-02)); + r += mul(s6_5, M4(-1.009e-01, 2.484e-01, -1.493e-02, -2.903e-02, -2.510e-01, -2.396e-01, 1.763e-02, -2.132e-02, 1.837e-01, 1.076e-01, -1.937e-01, 2.437e-01, -1.143e-01, -1.318e-01, 1.889e-01, -4.204e-02)); + r += mul(s6_6, M4(5.626e-02, 5.041e-03, -5.609e-02, -3.812e-02, 7.537e-02, 1.685e-02, 2.526e-02, 4.571e-02, -1.270e-01, 2.408e-02, 6.618e-02, -1.684e-01, 1.652e-01, -2.247e-02, 3.996e-02, 1.444e-01)); + r += mul(s6_7, M4(-4.078e-02, 4.302e-03, 2.513e-02, -1.440e-01, 2.091e-01, -1.047e-01, 7.912e-02, -5.481e-02, 1.110e-02, -8.656e-02, -1.186e-01, 5.608e-02, 3.072e-01, 3.693e-02, 5.291e-03, -1.331e-01)); + r += mul(s6_8, M4(2.316e-01, -1.662e-01, -3.324e-02, 4.843e-02, 9.420e-02, 1.201e-01, 2.672e-01, -1.255e-01, -8.873e-02, -1.695e-01, -7.646e-02, 2.508e-01, 1.432e-02, 1.685e-01, 4.257e-03, 1.293e-02)); + r += mul(s7_0, M4(-1.156e-01, 2.078e-02, 7.249e-02, -4.292e-02, -2.089e-01, -3.016e-02, -5.166e-02, -2.298e-02, 1.414e-01, 5.890e-02, 2.651e-02, -6.890e-03, 6.678e-02, 1.153e-01, -2.381e-01, -1.701e-01)); + r += mul(s7_1, M4(-8.216e-02, -1.252e-01, -9.205e-02, -2.337e-02, 6.869e-02, 6.252e-02, 2.805e-03, 2.468e-03, -1.468e-01, -2.906e-01, 1.110e-01, 1.351e-01, -3.282e-01, -2.939e-02, -4.672e-02, 5.490e-02)); + r += mul(s7_2, M4(-3.332e-02, -5.059e-02, -6.004e-03, -1.088e-01, -1.242e-01, -1.408e-01, 1.822e-01, 7.609e-02, 1.225e-01, 5.925e-02, 6.622e-02, 1.194e-01, -4.135e-02, 2.762e-02, 2.292e-02, 3.052e-02)); + r += mul(s7_3, M4(1.758e-02, 1.008e-01, -2.348e-02, 8.004e-02, 2.981e-02, -2.197e-01, 1.005e-01, -1.421e-01, 8.495e-02, -1.553e-01, -1.481e-02, 6.916e-02, 3.988e-02, 2.724e-01, 1.441e-01, 1.326e-01)); + r += mul(s7_4, M4(1.742e-02, -7.544e-02, -3.567e-02, 1.585e-01, 3.817e-01, -6.355e-01, 7.750e-02, 6.887e-02, -1.694e-01, -7.131e-02, -2.473e-02, 2.996e-01, 1.122e-01, 2.002e-01, -1.043e-01, 1.335e-01)); + r += mul(s7_5, M4(-1.301e-01, 1.746e-01, 4.739e-02, 1.297e-01, 1.039e-01, -1.531e-01, -1.170e-03, -2.399e-01, -1.084e-01, 2.192e-02, 1.281e-01, 4.687e-01, -4.872e-02, 3.747e-02, 1.742e-02, -7.458e-02)); + r += mul(s7_6, M4(1.210e-02, 2.003e-03, 5.535e-02, -5.994e-02, -2.231e-02, 1.939e-01, 1.085e-01, -2.014e-01, -4.221e-02, 5.293e-02, 6.648e-02, 1.168e-01, 2.498e-01, 2.621e-03, -7.611e-02, 3.010e-01)); + r += mul(s7_7, M4(-1.793e-02, -1.727e-02, -9.524e-02, 1.842e-01, 8.004e-02, 6.735e-02, 2.665e-01, 6.073e-02, 1.393e-01, 2.396e-03, 7.789e-02, -6.060e-02, 6.975e-02, -2.149e-01, -6.495e-02, 2.075e-01)); + r += mul(s7_8, M4(1.462e-01, -1.483e-01, 5.319e-02, 1.039e-01, -3.684e-01, 5.993e-01, 4.945e-02, 2.637e-02, 1.762e-01, -2.052e-01, 1.416e-02, 3.124e-02, 4.168e-02, 3.415e-02, 2.557e-02, -1.337e-01)); + r += V4(-1.099e-03, -1.032e-02, 3.082e-02, 1.035e-02); + return r; +} + +V4 f1(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(1.907e-02, -1.632e-01, 2.621e-01, 4.495e-01, 2.450e-01, -7.969e-02, -9.695e-02, -5.663e-03, 3.399e-01, -1.211e-01, 2.122e-02, 1.645e-01, -2.607e-02, 3.828e-02, 4.675e-02, 7.656e-02)); + r += mul(s0_1, M4(-1.433e-01, 4.079e-02, -3.504e-02, 8.135e-03, -8.809e-02, 5.904e-02, -1.062e-01, -1.113e-01, 1.678e-01, 1.022e-01, 1.594e-02, 1.814e-02, -4.683e-02, -5.523e-02, -5.405e-04, 2.947e-03)); + r += mul(s0_2, M4(4.109e-01, 5.408e-01, -3.117e-02, -1.181e-01, 1.400e-02, 2.948e-02, 3.592e-02, -5.692e-02, -2.324e-02, 1.214e-01, 7.887e-02, 5.319e-02, -2.901e-02, -3.335e-02, 2.581e-02, -3.054e-02)); + r += mul(s0_3, M4(7.100e-02, 1.275e-01, -1.635e-01, 8.014e-02, -1.194e-01, 1.243e-01, -1.275e-01, 7.479e-02, 7.746e-02, 7.278e-02, -1.005e-01, 1.226e-01, 2.339e-01, -5.814e-02, 6.769e-03, 2.113e-01)); + r += mul(s0_4, M4(-1.694e-01, -4.253e-01, -8.214e-02, 4.835e-01, -2.095e-01, -6.991e-02, 2.059e-01, 3.859e-02, 7.947e-02, -3.136e-01, -2.686e-01, 2.411e-02, -1.857e-02, 1.003e-01, 1.938e-03, -7.732e-02)); + r += mul(s0_5, M4(-1.707e-01, 2.349e-02, -2.010e-01, -9.759e-02, -5.680e-02, 1.641e-02, 6.537e-02, 5.386e-02, -7.561e-02, 1.374e-01, 4.763e-02, 4.752e-02, -1.764e-02, 4.048e-02, -9.938e-02, -8.344e-02)); + r += mul(s0_6, M4(2.419e-01, -7.465e-01, 1.612e-01, -7.485e-02, -5.591e-03, -1.207e-01, 3.387e-02, -4.188e-02, -9.178e-02, -8.270e-02, -7.268e-02, 1.242e-01, 2.741e-01, 1.636e-01, -5.916e-02, 1.017e-01)); + r += mul(s0_7, M4(-1.365e-02, 1.412e-01, -2.887e-01, -7.540e-02, 7.596e-02, 4.870e-02, 3.877e-02, 6.815e-02, -1.386e-01, -2.262e-02, -2.122e-02, 7.128e-02, -1.927e-01, 3.095e-02, -1.590e-01, 1.062e-01)); + r += mul(s0_8, M4(1.916e-01, -2.455e-01, 7.014e-02, -1.270e-02, 5.769e-02, -2.310e-02, 7.511e-02, 7.148e-02, -4.717e-02, 5.066e-02, 1.695e-01, 7.793e-02, 1.294e-01, 1.100e-01, -1.557e-01, -4.429e-02)); + r += mul(s1_0, M4(1.231e-01, 1.075e-02, 5.984e-02, 1.041e-02, -3.679e-01, 7.167e-03, -3.533e-02, -1.685e-01, 8.681e-02, 7.785e-02, -2.864e-02, 1.379e-01, -2.166e-01, -1.711e-01, -7.297e-02, 5.376e-02)); + r += mul(s1_1, M4(-8.928e-02, 1.137e-02, 1.586e-02, 6.383e-02, 9.266e-03, 1.548e-01, -1.330e-01, -6.228e-02, 5.766e-02, 1.847e-01, -3.778e-02, 2.073e-01, 1.731e-01, 1.187e-01, 9.969e-02, -2.130e-01)); + r += mul(s1_2, M4(-3.809e-02, 7.181e-02, -1.175e-01, 7.879e-03, -5.394e-02, -3.892e-02, 7.642e-02, -1.793e-01, -5.986e-02, 4.414e-02, 4.186e-03, -4.312e-02, -1.446e-02, -2.616e-02, -9.201e-02, 6.201e-02)); + r += mul(s1_3, M4(-1.076e-02, 1.282e-01, -4.642e-02, 8.175e-02, 1.753e-01, 3.502e-02, -2.682e-01, 4.726e-03, 3.721e-01, -1.364e-02, -2.574e-02, 2.671e-01, -3.350e-01, -2.237e-01, -3.944e-02, -1.978e-01)); + r += mul(s1_4, M4(-7.233e-02, -1.170e-01, 9.592e-02, 1.430e-01, 1.253e-01, 1.406e-01, -2.460e-01, 2.717e-01, 4.557e-01, 9.758e-03, -9.454e-02, -8.419e-02, 7.404e-02, 9.134e-02, -7.464e-04, -1.799e-01)); + r += mul(s1_5, M4(-4.020e-02, -5.117e-02, -3.810e-02, -5.862e-03, 1.119e-01, -3.387e-04, 5.410e-02, 1.892e-01, -2.735e-02, -2.799e-02, -1.642e-01, -4.453e-02, 3.855e-02, 2.473e-01, 1.063e-02, 5.474e-02)); + r += mul(s1_6, M4(-1.402e-02, -1.952e-01, -9.704e-03, -2.762e-04, -3.107e-02, 6.896e-03, 1.085e-01, -6.318e-02, 8.645e-03, 9.242e-02, 8.004e-02, 1.478e-01, -4.364e-01, -4.608e-02, -2.816e-02, -4.576e-02)); + r += mul(s1_7, M4(1.324e-02, 1.314e-01, -2.591e-02, -1.382e-01, -9.404e-02, 1.415e-01, 6.301e-02, 2.456e-01, 1.937e-01, 1.006e-01, -2.163e-01, 2.670e-02, 4.946e-01, -8.813e-03, 3.136e-01, -4.913e-03)); + r += mul(s1_8, M4(3.963e-02, -3.145e-02, 8.015e-02, 8.454e-02, 7.263e-02, 1.905e-02, -2.074e-02, 1.540e-01, 3.261e-02, -1.254e-02, -3.647e-02, -1.329e-03, -5.681e-02, 8.675e-02, 2.288e-01, 9.746e-02)); + r += mul(s2_0, M4(-2.334e-01, -2.600e-01, -2.643e-02, -1.333e-01, -1.530e-01, -1.996e-03, -4.574e-02, -5.363e-02, 9.298e-02, 6.021e-02, 3.740e-02, -5.791e-03, 2.563e-01, -7.183e-02, 1.385e-01, 2.428e-01)); + r += mul(s2_1, M4(-1.647e-01, -1.176e-01, -7.941e-02, -8.957e-03, 4.862e-02, 1.564e-01, 2.620e-02, -1.008e-01, -6.024e-02, -2.132e-01, -3.268e-03, -1.069e-01, 1.208e-01, 8.403e-02, 1.108e-01, 1.906e-01)); + r += mul(s2_2, M4(-2.604e-02, 7.566e-04, -1.394e-01, 3.329e-03, 4.651e-03, 7.781e-02, -8.141e-02, 3.367e-02, -1.990e-01, -2.031e-01, 1.658e-02, -1.671e-02, 3.172e-02, 7.532e-02, -7.900e-02, -1.872e-01)); + r += mul(s2_3, M4(-3.348e-01, -8.474e-02, -2.502e-02, -4.599e-03, -1.662e-01, -6.901e-02, -5.174e-02, 1.332e-01, -3.291e-02, 7.699e-02, 1.718e-01, 6.653e-02, 3.260e-01, 1.176e-01, 1.030e-01, 8.394e-02)); + r += mul(s2_4, M4(-1.590e-01, 5.059e-02, -1.914e-01, 3.241e-01, -1.179e-01, -6.522e-02, -1.250e-01, -2.417e-01, -1.997e-01, 5.494e-02, 1.203e-01, 3.542e-01, -2.391e-01, 1.825e-01, -1.598e-01, -4.109e-02)); + r += mul(s2_5, M4(8.463e-02, 2.909e-02, 5.116e-02, 5.316e-02, 4.028e-02, 3.305e-02, -4.200e-02, 3.466e-02, -1.374e-01, 4.134e-02, 1.360e-01, -2.347e-02, -8.626e-02, 8.375e-03, -8.745e-02, -1.782e-01)); + r += mul(s2_6, M4(-4.684e-02, -2.580e-02, 6.509e-02, -3.403e-02, -3.545e-01, -9.629e-02, 1.430e-01, -1.666e-02, -1.962e-02, 1.495e-01, 5.942e-02, 5.085e-03, -5.955e-02, 1.693e-01, -3.783e-02, -2.697e-02)); + r += mul(s2_7, M4(8.830e-02, -1.563e-01, 1.951e-01, -8.618e-02, 2.719e-01, -1.812e-01, 3.895e-01, -1.152e-01, 4.660e-02, 1.743e-01, -5.543e-03, -4.107e-02, -1.726e-01, 4.877e-02, 9.327e-02, -2.110e-02)); + r += mul(s2_8, M4(2.213e-01, -7.418e-02, 3.567e-02, 5.040e-02, 3.594e-02, -3.393e-02, 5.708e-02, -5.244e-02, 1.290e-01, -4.411e-02, -1.165e-01, 7.365e-02, -4.063e-02, 2.345e-01, -2.177e-01, -9.990e-03)); + r += mul(s3_0, M4(-1.619e-01, -7.468e-02, 9.396e-03, 9.876e-03, 1.080e-01, 6.918e-02, 3.217e-02, 2.366e-02, 1.652e-01, 1.072e-01, -2.474e-02, 1.887e-02, -1.703e-01, 8.238e-02, -7.572e-02, -5.797e-03)); + r += mul(s3_1, M4(1.951e-01, 1.886e-01, 2.757e-02, 5.847e-02, -5.980e-02, -4.676e-02, -3.278e-02, 8.578e-02, -2.480e-01, -5.365e-02, -4.106e-02, -1.306e-01, 9.232e-02, -1.016e-01, 5.433e-02, -1.421e-01)); + r += mul(s3_2, M4(4.314e-02, 6.689e-02, -1.937e-01, 1.043e-01, 2.926e-02, 2.950e-02, 4.578e-02, -2.616e-02, 4.214e-02, -7.447e-02, 6.302e-02, -6.889e-02, 7.305e-03, -7.965e-02, 6.470e-02, 2.100e-02)); + r += mul(s3_3, M4(7.317e-02, 9.556e-02, 3.596e-02, -5.933e-02, 3.440e-01, 7.869e-02, 2.328e-02, 1.309e-02, 1.867e-01, 4.689e-02, -3.954e-02, -2.069e-01, -5.222e-02, -7.956e-02, 1.548e-01, 7.688e-02)); + r += mul(s3_4, M4(7.289e-02, 5.660e-03, 5.053e-02, -4.467e-02, -2.159e-01, 4.814e-02, -7.589e-02, -6.821e-02, 7.689e-02, 4.093e-02, 1.302e-02, 2.377e-01, 1.480e-01, 1.310e-01, -4.508e-02, -2.226e-01)); + r += mul(s3_5, M4(-9.152e-02, -7.684e-02, -2.148e-01, 9.026e-02, 9.941e-03, 6.244e-03, 1.108e-01, 1.261e-02, 5.612e-02, 1.847e-01, -2.409e-01, 3.319e-01, -6.235e-02, -7.327e-02, 7.389e-02, 4.743e-02)); + r += mul(s3_6, M4(2.987e-02, -1.183e-01, -6.748e-02, -2.711e-02, 2.086e-01, -6.959e-02, 1.568e-01, -5.467e-02, 5.666e-02, -1.374e-02, 1.058e-01, -1.353e-02, 4.040e-02, -4.324e-02, -1.479e-02, 1.396e-01)); + r += mul(s3_7, M4(-2.289e-01, 2.539e-01, -9.910e-02, 8.551e-02, -2.529e-01, 1.199e-01, 5.722e-01, 2.933e-01, -1.577e-01, -1.241e-01, 1.151e-01, 7.669e-02, -3.677e-02, 2.457e-02, 7.805e-02, 1.246e-01)); + r += mul(s3_8, M4(-2.348e-01, -7.462e-02, 3.307e-02, -1.614e-01, 1.204e-01, -1.886e-01, 6.438e-02, -1.010e-01, 4.648e-02, 1.065e-01, -5.959e-02, -4.188e-02, 2.160e-02, -7.793e-02, -7.079e-02, -1.110e-01)); + r += mul(s4_0, M4(-9.089e-02, -1.331e-02, 3.064e-02, -4.192e-02, 2.900e-01, 5.748e-02, 7.296e-02, 3.985e-02, 2.369e-01, -2.515e-01, -2.009e-01, -8.283e-02, -2.083e-01, 2.022e-01, 9.404e-02, 1.635e-01)); + r += mul(s4_1, M4(6.761e-02, 1.662e-01, -5.494e-02, 3.434e-02, -4.001e-02, -4.373e-02, 1.369e-01, -1.741e-01, 1.579e-01, -7.934e-03, 1.573e-02, -1.471e-01, -9.026e-01, -2.991e-01, 3.170e-02, -2.082e-01)); + r += mul(s4_2, M4(1.668e-01, 1.150e-01, 3.365e-02, 4.915e-02, 1.548e-01, -9.861e-02, -1.739e-03, -1.006e-01, 2.509e-01, 4.215e-02, -1.952e-01, -2.514e-01, 2.461e-01, -7.303e-01, 2.846e-01, -5.022e-02)); + r += mul(s4_3, M4(-1.248e-01, 1.479e-01, 5.223e-02, -7.043e-03, 1.892e-01, 9.435e-02, -9.993e-02, 2.667e-01, -1.804e-02, -1.080e-01, -1.120e-01, 1.346e-02, 1.712e-01, 5.516e-01, 1.766e-01, -3.375e-01)); + r += mul(s4_4, M4(2.485e-01, -2.547e-02, -1.379e-02, 1.010e-01, 2.497e-02, 5.752e-02, -3.676e-02, -1.949e-01, 2.648e-01, -2.184e-01, 1.004e-01, 3.635e-01, 2.710e-01, 4.792e-02, 1.356e+00, 7.392e-01)); + r += mul(s4_5, M4(-1.044e-01, -1.185e-01, -5.964e-02, 1.050e-01, -2.880e-01, -2.760e-01, -2.040e-02, -6.421e-02, -2.995e-01, 4.306e-01, -1.035e-01, 8.934e-03, -9.378e-02, -6.214e-01, -5.966e-02, -4.196e-01)); + r += mul(s4_6, M4(-6.191e-03, -1.208e-02, 1.564e-01, -1.394e-02, 1.507e-03, -8.000e-02, -8.325e-02, 9.059e-02, 2.129e-01, 2.970e-01, 1.032e-01, -9.473e-02, 6.199e-02, 4.550e-01, 1.335e-01, -1.861e-01)); + r += mul(s4_7, M4(-1.637e-01, -1.532e-01, 3.509e-02, -7.038e-02, -6.394e-02, -3.487e-01, -1.210e-01, 1.353e-01, -2.038e-01, -1.799e-01, -1.739e-01, 2.214e-02, -2.637e-01, -1.615e-01, -7.865e-01, 3.009e-01)); + r += mul(s4_8, M4(1.204e-02, -8.630e-02, 4.670e-02, 9.570e-03, -1.212e-01, -3.283e-02, 2.147e-02, -6.195e-02, -7.173e-02, 1.658e-01, 1.884e-01, -6.430e-02, -3.136e-01, -2.145e-01, -5.900e-01, -1.781e-01)); + r += mul(s5_0, M4(-1.602e-01, 7.305e-03, 1.013e-01, -4.396e-02, 2.237e-01, 9.667e-02, -2.031e-02, 6.526e-02, -6.753e-02, -2.687e-02, -2.583e-02, -4.206e-02, -7.052e-02, 5.000e-02, 3.210e-02, -2.945e-02)); + r += mul(s5_1, M4(-8.484e-02, -1.646e-01, -2.160e-01, 2.718e-02, -1.412e-01, 3.326e-03, -8.358e-02, 3.792e-02, -5.224e-02, -2.208e-02, 5.928e-02, -1.132e-01, 1.771e-01, -2.547e-02, 9.220e-02, -2.003e-02)); + r += mul(s5_2, M4(1.226e-01, -1.186e-01, -3.271e-02, 1.741e-01, -1.654e-01, 5.303e-02, 9.859e-02, -1.076e-01, -1.267e-01, -2.056e-02, 1.518e-02, -3.594e-02, 1.399e-01, 5.955e-02, 2.196e-02, 3.942e-03)); + r += mul(s5_3, M4(2.204e-01, -4.739e-02, 1.469e-02, 1.821e-01, -3.276e-02, 4.900e-02, -9.718e-02, 2.035e-01, 2.070e-02, 8.194e-02, -4.337e-02, -5.462e-02, -1.732e-01, -1.340e-01, 1.204e-01, 5.843e-02)); + r += mul(s5_4, M4(1.484e-01, 4.451e-01, 1.947e-02, -5.255e-03, -1.856e-01, -5.393e-02, 6.210e-03, -1.717e-01, 1.926e-02, -9.610e-02, -7.933e-02, 9.830e-02, -8.662e-02, -9.962e-03, 5.713e-02, 4.462e-02)); + r += mul(s5_5, M4(-1.955e-01, -5.243e-01, -6.282e-03, 1.982e-01, -1.204e-01, 7.155e-02, -1.225e-02, -1.338e-01, -3.579e-02, 1.574e-01, 7.702e-02, 3.390e-03, -6.295e-02, 3.460e-02, -1.409e-01, -2.541e-02)); + r += mul(s5_6, M4(-8.898e-02, 2.620e-01, 1.795e-01, -2.550e-02, -4.822e-02, 1.556e-01, -3.864e-02, -3.345e-02, 3.608e-02, -6.921e-02, 3.265e-02, 5.650e-02, -1.416e-02, 5.370e-02, -3.530e-02, -8.904e-03)); + r += mul(s5_7, M4(-8.129e-03, -1.428e-01, 2.235e-02, -8.305e-03, 1.021e-02, 3.031e-02, 5.251e-02, -6.861e-02, 6.833e-02, 5.761e-02, -5.271e-02, -4.588e-03, 1.608e-02, -1.631e-01, -5.513e-02, 6.018e-02)); + r += mul(s5_8, M4(-1.300e-01, -2.935e-01, -8.674e-02, 1.337e-01, -8.421e-02, 1.442e-01, -1.998e-01, 6.850e-03, 1.218e-01, -2.039e-01, 5.682e-02, -1.322e-02, -7.433e-04, -8.572e-03, 2.511e-02, -4.253e-02)); + r += mul(s6_0, M4(4.771e-01, -1.221e-02, -6.044e-02, 2.828e-02, -3.951e-02, -3.085e-02, -2.765e-02, 1.833e-02, -2.159e-01, -4.498e-02, -1.684e-02, 1.719e-02, 1.547e-01, 2.494e-02, 8.313e-04, 2.347e-01)); + r += mul(s6_1, M4(3.691e-01, -9.233e-02, 7.315e-02, -4.366e-02, 1.347e-01, 1.336e-01, -1.657e-03, 1.456e-02, -9.590e-02, -3.634e-02, 6.165e-02, 5.148e-02, 1.741e-01, -4.495e-02, 7.363e-02, -3.365e-02)); + r += mul(s6_2, M4(4.099e-02, 7.470e-02, 5.907e-02, -2.502e-02, 1.264e-01, -9.254e-02, -1.626e-02, 4.827e-02, -6.567e-02, -7.848e-02, -7.057e-02, 1.220e-01, 1.094e-01, 5.916e-02, -3.141e-02, -6.242e-03)); + r += mul(s6_3, M4(1.557e-01, -2.321e-01, -3.681e-02, 1.202e-01, -1.754e-01, 6.722e-03, 5.256e-02, -1.179e-01, 2.371e-01, 3.811e-02, -4.509e-02, -5.125e-03, -2.686e-01, 1.801e-01, -7.930e-02, 2.836e-01)); + r += mul(s6_4, M4(4.213e-01, 3.607e-02, -3.110e-02, 1.138e-01, -1.559e-01, -2.379e-01, 6.866e-02, -8.668e-02, 2.498e-01, 4.497e-02, 3.912e-01, 3.999e-02, 2.063e-01, -4.619e-02, 1.196e-01, -3.082e-02)); + r += mul(s6_5, M4(1.284e-01, 3.436e-03, -4.267e-02, 3.899e-02, 8.482e-02, -3.773e-02, 3.275e-03, -3.904e-02, -1.216e-01, -7.397e-02, -4.438e-01, -2.248e-02, -1.356e-01, -7.888e-02, 2.795e-02, -1.139e-02)); + r += mul(s6_6, M4(1.131e-01, -2.566e-02, 4.791e-03, -1.055e-01, -9.828e-02, 5.326e-02, -5.499e-02, -3.927e-02, 1.275e-01, 6.263e-02, -4.156e-02, 9.745e-02, 1.533e-01, -3.617e-02, -6.586e-02, 3.466e-02)); + r += mul(s6_7, M4(8.247e-02, -7.658e-02, 1.527e-01, 3.525e-02, 8.408e-02, -9.757e-02, -2.895e-02, 5.078e-02, -2.114e-01, -1.057e-01, -1.833e-01, -1.000e-01, 2.378e-01, 2.511e-01, -1.157e-01, -4.118e-02)); + r += mul(s6_8, M4(1.356e-02, -8.041e-02, 4.849e-02, -1.023e-01, 7.375e-03, 6.931e-02, -2.521e-02, 1.345e-01, -1.532e-01, -1.823e-02, -4.957e-02, -8.803e-02, 1.450e-01, 7.583e-02, -3.735e-03, -8.479e-02)); + r += mul(s7_0, M4(-1.693e-02, -4.398e-03, -5.467e-02, 1.243e-01, -3.660e-02, 1.610e-01, 1.077e-01, 1.909e-01, 8.232e-03, -1.508e-01, 1.603e-02, -8.618e-02, 3.586e-02, 1.234e-01, 7.491e-02, -1.224e-01)); + r += mul(s7_1, M4(-2.283e-01, 2.992e-01, -1.198e-01, -4.329e-03, 1.752e-01, -1.657e-01, 3.741e-02, -1.488e-01, 1.842e-01, -2.037e-01, 3.463e-02, -6.749e-02, -1.872e-01, -1.033e-01, -7.260e-02, 1.512e-01)); + r += mul(s7_2, M4(1.502e-02, -1.062e-01, -9.573e-03, -4.199e-02, -1.554e-01, -4.714e-02, 9.064e-02, 1.631e-02, 1.476e-01, -1.704e-01, -3.367e-02, 7.365e-02, 5.617e-02, 5.865e-02, -1.278e-02, -4.977e-02)); + r += mul(s7_3, M4(-1.026e-01, -1.229e-01, 4.286e-02, 1.130e-01, -2.324e-02, -4.465e-02, 4.590e-02, 6.720e-02, 8.055e-02, 2.163e-02, -4.712e-02, -1.149e-01, 1.638e-01, 5.185e-02, -6.191e-02, -2.353e-02)); + r += mul(s7_4, M4(-8.012e-02, 2.777e-01, -8.581e-02, 9.079e-03, -6.133e-03, 9.574e-02, -6.214e-02, -2.644e-01, 5.576e-02, 9.414e-02, 4.962e-02, 3.748e-01, -1.098e-01, -2.278e-01, -1.171e-01, 6.858e-02)); + r += mul(s7_5, M4(-2.794e-01, -1.326e-01, -6.401e-02, 2.166e-01, -9.729e-03, 1.545e-02, 1.940e-03, -9.707e-02, 3.446e-02, -2.200e-01, 1.705e-01, 5.518e-02, 1.778e-02, 5.802e-02, 7.104e-02, 8.698e-02)); + r += mul(s7_6, M4(-2.421e-01, 3.375e-02, -8.096e-02, 5.195e-02, -1.542e-02, -2.469e-02, 2.463e-02, -3.006e-02, 1.313e-01, -1.252e-02, -8.934e-02, 6.374e-02, -2.305e-01, 9.282e-02, -1.796e-01, 1.911e-02)); + r += mul(s7_7, M4(-1.725e-01, 1.027e-01, -7.768e-02, -5.955e-02, -3.257e-02, -2.853e-02, -3.702e-02, 2.073e-01, -3.216e-02, -3.304e-02, 5.860e-02, 1.499e-01, -5.883e-02, -1.523e-02, 3.860e-01, -9.647e-03)); + r += mul(s7_8, M4(-2.646e-02, 7.739e-02, 1.050e-01, -9.308e-02, 1.479e-01, -8.549e-02, 1.245e-01, -1.132e-01, -2.107e-01, 1.525e-02, -7.752e-02, 1.466e-01, -2.482e-02, 6.425e-02, -6.532e-02, -2.433e-02)); + r += V4(-1.497e-02, -1.151e-02, 1.197e-02, 4.981e-03); + return r; +} + +V4 f2(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(1.909e-01, -9.392e-02, -1.340e-01, -2.449e-01, 5.722e-02, 8.879e-02, 7.768e-02, -2.801e-02, 3.341e-02, 1.701e-01, -9.158e-02, 7.848e-02, -3.646e-02, 3.091e-02, 5.503e-02, -6.088e-02)); + r += mul(s0_1, M4(-3.235e-01, -1.921e-01, -7.293e-02, 2.558e-02, 5.880e-02, -1.773e-02, -4.682e-02, 5.679e-02, 1.830e-01, -9.583e-03, 7.674e-02, 2.682e-01, -2.694e-02, -4.065e-02, -6.315e-03, 4.434e-02)); + r += mul(s0_2, M4(-5.880e-02, -1.520e-02, -1.367e-01, -4.294e-02, 3.502e-02, 5.052e-02, 5.428e-02, -6.451e-02, 2.027e-01, -5.946e-03, 4.097e-02, -4.362e-04, -3.192e-03, -5.913e-03, 1.121e-02, 5.335e-02)); + r += mul(s0_3, M4(-2.988e-01, -1.461e-01, -1.896e-01, 1.015e-01, -9.158e-03, 9.632e-02, 1.427e-02, -1.338e-02, -1.538e-01, 1.926e-01, 1.612e-01, -1.565e-01, 1.402e-01, -1.831e-01, -1.946e-02, -1.303e-01)); + r += mul(s0_4, M4(-1.630e-01, -4.281e-01, -2.889e-01, -5.586e-01, -5.453e-03, 4.795e-02, -9.513e-03, 6.337e-02, 1.790e-02, -6.090e-02, 1.318e-01, -2.561e-01, -3.402e-02, 1.715e-01, 3.424e-01, -3.754e-02)); + r += mul(s0_5, M4(-1.246e-02, 2.287e-01, 1.475e-02, -1.082e-01, -1.570e-02, -1.497e-01, 6.988e-02, -2.614e-04, 8.724e-02, -2.052e-02, 1.028e-01, -1.492e-01, -1.553e-01, -9.396e-02, -2.078e-01, 4.730e-02)); + r += mul(s0_6, M4(-2.498e-01, -1.893e-01, 6.595e-02, -1.457e-01, -3.905e-02, -8.088e-02, 8.604e-02, -3.156e-02, 1.087e-01, 6.363e-02, -1.002e-01, -1.236e-01, 1.007e-01, -1.389e-01, -3.014e-01, 3.087e-03)); + r += mul(s0_7, M4(-1.523e-01, -6.811e-02, -1.732e-01, -1.112e-01, 8.779e-03, -2.401e-02, -2.397e-01, -9.294e-02, 2.584e-01, -4.145e-02, 1.146e-01, -1.261e-02, -8.641e-02, -3.330e-02, 3.006e-01, 2.466e-01)); + r += mul(s0_8, M4(2.154e-01, 7.314e-02, 5.351e-01, -2.390e-01, 1.053e-01, -5.376e-02, 8.874e-02, 2.467e-02, 1.434e-01, 1.391e-02, -1.465e-01, -3.703e-02, 4.802e-03, 6.735e-02, -1.079e-01, 1.807e-02)); + r += mul(s1_0, M4(4.027e-02, 4.182e-03, -3.632e-03, 2.185e-03, 1.107e-01, 7.939e-02, 8.598e-02, -3.633e-03, -1.802e-01, 1.115e-01, 1.924e-01, -2.745e-02, -2.830e-02, 3.712e-02, 3.799e-02, 6.096e-02)); + r += mul(s1_1, M4(1.654e-01, 7.838e-02, -7.628e-02, 1.194e-02, 7.754e-02, -6.591e-02, -5.081e-02, -2.008e-01, -2.290e-01, 1.068e-01, 9.374e-02, 8.226e-02, 9.247e-02, 8.664e-02, -2.329e-01, -1.179e-01)); + r += mul(s1_2, M4(-7.976e-02, -1.166e-02, 6.066e-02, -1.187e-02, 1.831e-02, 2.978e-02, -1.625e-01, -6.556e-02, 1.551e-02, -8.357e-03, -1.501e-02, 1.152e-01, 1.086e-01, 4.976e-02, -5.822e-02, 1.128e-01)); + r += mul(s1_3, M4(-7.695e-02, 5.394e-02, 2.071e-02, -2.995e-02, 1.951e-01, 3.876e-01, -6.261e-01, 1.248e-01, -3.093e-01, -1.460e-01, -9.240e-02, -1.225e-01, -2.002e-01, 7.938e-02, 2.530e-01, -4.350e-02)); + r += mul(s1_4, M4(1.746e-02, 1.007e-01, 1.308e-01, -5.175e-02, 2.391e-02, 2.728e-01, 5.621e-02, 2.392e-01, -2.932e-01, 2.731e-01, 1.057e-01, -1.151e-01, -9.188e-02, -5.725e-03, -1.019e-01, -3.376e-01)); + r += mul(s1_5, M4(-4.040e-02, -3.587e-02, 5.088e-03, 1.021e-01, 3.585e-02, -1.990e-02, -1.224e-01, -8.409e-04, -8.527e-02, -1.184e-01, -4.145e-02, 1.970e-01, 3.514e-02, 2.597e-02, 3.056e-01, 1.344e-01)); + r += mul(s1_6, M4(8.428e-03, 6.969e-02, -1.480e-01, -2.313e-02, -1.710e-01, 3.692e-03, -1.741e-01, 5.840e-02, -2.906e-01, -3.011e-02, -3.556e-01, 3.636e-02, -3.008e-02, -1.295e-01, 2.098e-01, 1.202e-02)); + r += mul(s1_7, M4(-5.380e-02, -5.372e-04, -1.522e-01, 4.360e-02, -1.928e-02, 9.617e-02, 9.124e-02, -2.028e-02, -8.165e-02, 1.276e-01, -2.829e-02, -2.586e-02, -3.088e-01, 4.260e-02, -5.864e-01, -1.700e-01)); + r += mul(s1_8, M4(1.006e-01, -5.047e-02, 2.980e-02, -9.510e-02, 4.533e-02, 1.175e-01, 1.323e-01, -1.472e-01, -7.008e-02, -1.289e-02, -1.284e-01, -2.242e-02, 2.611e-01, -7.120e-02, 2.681e-01, -9.496e-02)); + r += mul(s2_0, M4(-2.248e-02, -2.052e-01, 1.088e-01, -4.810e-04, 9.921e-02, -5.395e-02, -4.588e-02, 3.818e-02, 9.605e-02, -1.101e-01, -8.049e-03, -2.017e-02, 1.018e-01, 3.519e-02, -1.687e-01, -5.327e-02)); + r += mul(s2_1, M4(-9.805e-02, -8.320e-02, 4.706e-02, -2.388e-01, 1.018e-01, -1.821e-02, 7.596e-02, -8.032e-02, -1.246e-01, 5.725e-02, -9.168e-02, 6.510e-02, 1.830e-01, -8.114e-02, 3.057e-01, -1.710e-01)); + r += mul(s2_2, M4(-1.154e-01, -2.258e-02, -8.471e-02, -7.985e-02, 1.000e-01, 1.283e-02, -7.777e-02, -7.797e-02, 5.683e-02, 9.853e-02, -1.674e-02, -1.913e-01, -8.108e-02, -1.205e-01, -1.177e-01, 5.743e-02)); + r += mul(s2_3, M4(3.045e-02, 8.145e-02, 1.612e-01, -1.759e-02, -4.420e-02, -2.996e-03, -8.212e-04, -2.170e-02, 8.253e-03, -1.066e-02, -3.993e-02, -7.132e-02, 9.062e-02, 3.725e-01, 1.848e-01, -1.038e-01)); + r += mul(s2_4, M4(5.332e-01, -1.182e-01, 6.704e-02, 1.766e-01, 1.094e-01, -1.092e-01, -2.973e-01, -2.605e-01, -2.007e-01, 2.994e-02, -2.023e-02, 1.198e-01, 8.121e-03, -5.029e-02, -1.861e-01, 9.399e-02)); + r += mul(s2_5, M4(6.238e-02, 6.043e-02, -1.120e-01, 2.542e-01, 1.376e-01, 7.607e-02, 3.749e-02, -1.192e-01, -5.898e-02, -2.174e-02, -1.773e-01, 8.908e-02, -7.967e-02, 4.329e-02, -1.669e-01, 1.684e-01)); + r += mul(s2_6, M4(-4.076e-02, -2.539e-02, 1.274e-01, -3.387e-02, -1.354e-01, -4.052e-02, 4.505e-01, -7.179e-02, 1.687e-01, -7.329e-02, -3.303e-02, -9.880e-02, 9.480e-02, 9.589e-02, 1.248e-01, 1.260e-01)); + r += mul(s2_7, M4(2.201e-01, 2.431e-02, 1.420e-01, -4.548e-02, -2.243e-01, 9.200e-02, -4.429e-01, -1.139e-01, -3.171e-02, 2.493e-02, 2.451e-01, 1.560e-01, -2.732e-01, -5.226e-02, -3.352e-02, 3.464e-02)); + r += mul(s2_8, M4(1.893e-01, -3.349e-02, 3.033e-01, 1.017e-02, 5.704e-02, -1.901e-02, 1.118e-01, -8.800e-02, -7.282e-02, 4.033e-02, 1.738e-01, -1.165e-01, 6.738e-02, 7.975e-02, 2.274e-01, -7.196e-04)); + r += mul(s3_0, M4(9.206e-02, -1.831e-01, -6.781e-02, 2.038e-02, -2.567e-02, 5.166e-04, -1.552e-01, -4.678e-02, 9.775e-02, 3.774e-02, -8.049e-02, -9.916e-03, -1.460e-01, -1.929e-01, 4.039e-02, -2.443e-02)); + r += mul(s3_1, M4(1.030e-01, 6.380e-02, -3.697e-03, 6.689e-02, -5.646e-03, -5.289e-02, 1.262e-01, 2.126e-01, 3.095e-02, 9.231e-02, -7.421e-02, 2.347e-02, 6.161e-02, -1.098e-01, 2.264e-03, 1.615e-01)); + r += mul(s3_2, M4(-1.076e-01, -2.051e-02, -1.032e-01, 4.689e-02, -3.618e-02, -8.719e-03, -1.070e-02, 8.687e-02, 3.851e-01, -2.398e-02, 1.685e-01, -1.628e-01, 3.233e-02, -3.770e-02, -4.527e-02, -3.666e-02)); + r += mul(s3_3, M4(3.846e-02, 1.956e-01, -9.103e-02, -5.621e-02, -2.641e-02, -8.174e-03, -2.783e-01, 2.945e-02, -1.613e-01, 1.782e-01, 1.632e-02, 6.232e-02, -1.465e-01, 5.124e-02, -1.099e-02, 6.585e-02)); + r += mul(s3_4, M4(-3.682e-02, 2.582e-01, 2.437e-02, 4.205e-02, 4.762e-02, 4.686e-03, 4.395e-01, -6.323e-02, -1.190e-02, 1.435e-01, -1.645e-01, 1.554e-02, -7.464e-02, -1.012e-02, -5.116e-02, 9.937e-02)); + r += mul(s3_5, M4(-1.994e-01, 8.514e-02, -6.310e-03, -1.008e-01, 4.595e-02, 6.921e-02, -9.169e-02, 1.508e-01, 3.123e-02, -9.426e-02, 1.300e-01, -3.395e-01, 9.113e-02, 4.549e-02, 6.148e-02, -5.932e-02)); + r += mul(s3_6, M4(9.103e-02, -8.564e-04, -9.881e-02, -4.359e-02, -3.149e-02, -2.886e-02, -2.087e-01, -1.312e-01, 6.307e-02, 2.503e-02, -2.925e-01, -1.377e-02, 6.212e-02, 1.372e-01, 2.146e-02, 9.611e-03)); + r += mul(s3_7, M4(8.192e-02, -1.447e-01, 2.783e-01, -4.569e-02, 1.534e-01, 5.361e-02, 4.747e-01, 2.498e-02, -9.529e-02, -5.268e-02, 2.216e-01, 1.535e-01, 4.301e-02, 7.891e-02, -3.746e-02, -1.234e-01)); + r += mul(s3_8, M4(-1.645e-01, -5.479e-02, -1.110e-01, 1.579e-01, -3.121e-02, 6.516e-02, -2.857e-02, -1.048e-03, -2.337e-02, -1.801e-02, 9.869e-03, 5.126e-02, -1.556e-01, 5.252e-02, -1.183e-01, 3.949e-02)); + r += mul(s4_0, M4(-6.007e-02, 8.082e-02, 2.268e-01, 2.774e-02, -1.145e-01, 9.654e-02, 6.821e-02, -8.230e-02, -6.243e-02, 7.611e-03, -1.037e-01, 1.656e-02, 9.589e-02, -2.637e-01, 4.317e-01, 4.253e-03)); + r += mul(s4_1, M4(-8.680e-02, 1.404e-02, 7.664e-02, -2.373e-01, -2.451e-02, 4.017e-02, 2.163e-02, 2.062e-01, -4.538e-03, 4.677e-04, -6.182e-02, 8.661e-02, -6.298e-01, 3.219e-01, -2.024e-01, 1.064e-01)); + r += mul(s4_2, M4(9.728e-02, 2.038e-02, 1.630e-01, 7.928e-02, 9.660e-02, -1.617e-02, 1.229e-01, -1.092e-01, 3.430e-03, -6.904e-03, -3.568e-01, 2.237e-01, 1.376e-02, -2.085e-01, 8.966e-03, -1.802e-01)); + r += mul(s4_3, M4(-2.242e-02, -1.785e-02, 5.024e-02, 1.283e-02, -1.134e-01, -4.483e-02, 4.119e-02, 1.140e-02, -4.267e-01, -9.236e-02, 4.341e-02, 1.355e-01, 2.437e-01, -2.002e-03, -1.510e-01, -3.528e-02)); + r += mul(s4_4, M4(-8.638e-02, 3.394e-02, -2.240e-01, 1.461e-01, 8.683e-02, 4.206e-02, -1.933e-01, -2.008e-01, 8.629e-02, 3.030e-01, 2.997e-01, -4.533e-01, -7.390e-01, 7.208e-01, 5.560e-01, -1.510e-01)); + r += mul(s4_5, M4(-2.310e-02, -2.152e-02, 1.186e-01, -1.363e-01, 8.357e-02, -3.742e-02, -8.575e-02, -1.443e-01, -6.026e-02, -2.186e-01, -4.317e-01, 2.039e-02, 3.948e-02, 6.303e-01, -9.625e-02, 1.544e-01)); + r += mul(s4_6, M4(1.165e-01, 6.348e-02, -1.213e-01, -1.745e-02, 1.120e-01, -2.659e-02, 1.632e-01, -3.124e-02, -1.503e-03, 4.689e-03, -2.001e-01, 7.933e-02, -3.229e-01, 8.996e-02, -4.774e-01, -1.837e-01)); + r += mul(s4_7, M4(2.074e-02, 3.243e-02, 5.314e-02, 8.075e-02, 5.473e-02, -3.461e-02, 2.726e-04, -1.971e-02, 3.940e-01, -3.165e-02, 2.749e-01, -1.532e-01, 1.806e-01, -3.744e-01, 7.934e-01, 5.761e-01)); + r += mul(s4_8, M4(-8.621e-02, -2.195e-02, -3.822e-02, -1.355e-01, 1.395e-02, 1.608e-02, -1.285e-01, -8.663e-02, 5.349e-02, -1.050e-01, 4.588e-02, -1.015e-01, -9.686e-02, -7.499e-02, -2.442e-01, 5.441e-03)); + r += mul(s5_0, M4(3.871e-02, 2.105e-02, 5.524e-02, -1.114e-01, -9.998e-03, 1.988e-01, 1.913e-01, 5.834e-02, -4.073e-02, 1.370e-02, -7.718e-03, -6.434e-02, 1.075e-01, 9.595e-02, 2.916e-02, -1.640e-02)); + r += mul(s5_1, M4(-2.685e-01, 6.975e-02, -4.860e-03, -8.839e-02, -1.550e-01, -1.042e-01, 5.083e-02, -2.413e-02, -2.945e-02, 3.974e-02, 5.426e-02, 1.020e-02, -1.489e-01, -9.121e-02, -2.901e-02, -1.348e-01)); + r += mul(s5_2, M4(1.314e-01, 1.061e-01, -3.463e-02, 1.217e-01, 5.746e-02, -1.503e-02, -6.959e-02, 2.556e-02, 1.508e-01, 2.171e-02, 3.378e-02, -1.861e-02, 1.151e-01, -5.487e-02, -1.317e-02, 7.012e-02)); + r += mul(s5_3, M4(5.046e-02, 9.001e-02, 7.535e-02, 9.960e-02, -1.300e-01, -3.197e-02, 1.296e-01, -7.338e-02, -1.165e-01, -9.652e-02, -7.622e-03, 1.548e-01, 6.067e-02, -9.001e-02, 1.764e-02, -3.334e-02)); + r += mul(s5_4, M4(-2.184e-01, -3.564e-01, -2.250e-01, 2.224e-01, 1.726e-01, -1.349e-02, -1.225e-01, 4.080e-02, -5.255e-03, 4.612e-02, -1.111e-01, -7.368e-02, -2.174e-01, 3.929e-02, 5.635e-02, -7.094e-04)); + r += mul(s5_5, M4(1.605e-01, -8.327e-02, 2.503e-01, 1.224e-01, -4.251e-02, -1.025e-01, -1.459e-01, -5.656e-03, 1.767e-02, 4.757e-02, -3.971e-03, 4.450e-03, -8.019e-03, 1.259e-02, 3.239e-02, 1.144e-01)); + r += mul(s5_6, M4(9.060e-02, -3.711e-02, -2.303e-01, 1.852e-02, 1.322e-01, 1.307e-01, -6.601e-02, 2.163e-02, 6.238e-02, -1.110e-01, 2.882e-02, -5.058e-02, 9.467e-02, 4.748e-02, -7.884e-03, -1.830e-02)); + r += mul(s5_7, M4(1.264e-01, -5.228e-03, -1.240e-01, 3.818e-02, 5.384e-02, 4.479e-02, 3.874e-03, -1.177e-02, 4.849e-02, -2.571e-02, -5.829e-02, 1.062e-01, -1.312e-01, -3.904e-02, 1.222e-01, 3.495e-02)); + r += mul(s5_8, M4(2.607e-01, -9.389e-02, -3.262e-01, -1.223e-01, 1.637e-01, 1.665e-02, -1.061e-01, 4.082e-02, -6.843e-03, 5.625e-02, -6.985e-03, -3.316e-02, -1.778e-02, -5.197e-03, -1.276e-01, -4.753e-02)); + r += mul(s6_0, M4(1.556e-02, 4.461e-02, 1.887e-01, -5.260e-02, -1.009e-01, -4.502e-02, 1.875e-01, 5.034e-02, -6.320e-02, 4.153e-02, -7.159e-02, -6.840e-02, 3.229e-01, -1.182e-01, -8.201e-02, -1.455e-01)); + r += mul(s6_1, M4(-2.783e-01, -9.929e-02, -1.127e-01, -5.826e-02, -5.076e-02, 6.958e-03, -1.807e-01, -1.226e-01, 6.811e-02, 3.467e-01, -1.360e-01, -1.994e-01, 1.270e-01, 6.603e-02, -1.298e-01, -3.304e-02)); + r += mul(s6_2, M4(-2.217e-01, 5.182e-02, -6.665e-03, -3.633e-02, -4.371e-02, -4.715e-02, 3.733e-02, 1.725e-02, 6.393e-02, -1.111e-01, 3.107e-01, -2.297e-01, 7.185e-02, -6.411e-02, -5.181e-02, -8.180e-02)); + r += mul(s6_3, M4(-1.247e-01, 1.267e-01, -9.271e-03, 3.259e-02, -1.425e-01, 1.140e-01, 3.898e-02, 7.075e-02, 4.735e-02, -2.949e-02, 8.820e-02, 1.113e-01, -1.436e-01, 8.337e-02, 1.733e-02, 1.245e-01)); + r += mul(s6_4, M4(-2.865e-01, 1.341e-01, -2.989e-01, 2.276e-02, 8.616e-02, -1.108e-01, -2.146e-01, -8.174e-02, -3.244e-01, 8.870e-01, -1.164e-01, 1.193e-01, 1.702e-02, 5.640e-03, 2.127e-02, -2.143e-01)); + r += mul(s6_5, M4(-2.566e-01, -1.100e-01, -2.349e-01, 5.444e-02, 1.520e-01, 6.735e-02, -3.749e-02, 1.863e-01, -3.958e-01, 1.222e-01, -1.456e-01, -3.227e-01, -1.480e-01, -4.675e-02, 3.483e-03, 1.997e-01)); + r += mul(s6_6, M4(-3.229e-01, -1.253e-01, -6.043e-02, -1.934e-02, -3.176e-02, -3.484e-02, -3.086e-02, -6.326e-02, -3.011e-02, 1.207e-01, -2.762e-02, 2.276e-02, 1.165e-01, 7.742e-02, -1.514e-01, -1.235e-01)); + r += mul(s6_7, M4(-3.719e-01, -1.963e-01, 6.235e-02, -1.683e-01, -3.227e-02, -6.104e-03, -9.616e-03, -8.380e-03, -3.989e-02, 8.398e-03, 2.611e-01, 1.075e-01, 8.220e-03, 6.441e-02, -1.289e-01, -5.594e-02)); + r += mul(s6_8, M4(-1.177e-01, -1.073e-01, 3.336e-02, 1.620e-02, 8.025e-02, 4.244e-02, 8.190e-02, 4.761e-02, -1.916e-01, 1.267e-03, -1.027e-01, 1.053e-01, -3.592e-02, 7.911e-02, -3.845e-02, 4.658e-02)); + r += mul(s7_0, M4(1.107e-01, 1.350e-02, 3.278e-02, 8.089e-02, -1.457e-02, -1.257e-01, 7.460e-02, -1.540e-01, -1.525e-01, -5.342e-02, -9.262e-02, -3.793e-02, -1.195e-01, 3.176e-01, 6.309e-02, -6.491e-02)); + r += mul(s7_1, M4(7.589e-02, -1.908e-02, -1.394e-01, 4.513e-02, 1.998e-01, -3.807e-02, -2.032e-01, 9.955e-02, 2.990e-01, -1.441e-01, -2.311e-01, -3.531e-02, -1.162e-01, -7.590e-02, 2.470e-01, -2.878e-01)); + r += mul(s7_2, M4(2.050e-02, 1.155e-01, 1.018e-01, -1.042e-01, 7.442e-03, -7.654e-03, 1.812e-01, -6.073e-02, 4.555e-02, -4.195e-02, -1.939e-01, -8.081e-02, -2.205e-02, -2.936e-02, 2.581e-03, 7.297e-02)); + r += mul(s7_3, M4(1.223e-01, 6.592e-02, 5.053e-02, -4.009e-03, -1.685e-01, 1.338e-01, -5.836e-03, -2.778e-02, -8.277e-02, -1.650e-01, 1.238e-01, 4.748e-02, 8.084e-02, 6.089e-01, 8.423e-02, -6.395e-02)); + r += mul(s7_4, M4(1.704e-01, 1.564e-01, -1.928e-01, -6.911e-03, -1.700e-01, -2.909e-01, 4.752e-01, 1.944e-01, 1.536e-01, -1.364e-01, -1.005e-01, 1.071e-01, -1.150e-01, -1.112e-01, -3.265e-02, -4.512e-01)); + r += mul(s7_5, M4(3.312e-02, 7.618e-02, 3.051e-02, -2.499e-01, -4.351e-02, 1.448e-01, -5.512e-02, 6.151e-02, 3.365e-01, -3.036e-02, 6.411e-02, -2.202e-01, 7.528e-02, -4.650e-02, 1.802e-02, 1.700e-01)); + r += mul(s7_6, M4(8.020e-02, 1.847e-02, 5.864e-02, -1.005e-01, -2.217e-02, -7.133e-03, -3.747e-01, 5.838e-02, -1.770e-01, 2.267e-02, 4.268e-02, 2.468e-02, -1.118e-01, 1.149e-02, -6.731e-02, -7.425e-02)); + r += mul(s7_7, M4(-2.701e-02, -7.810e-02, 7.503e-02, 2.226e-02, 5.091e-01, 1.019e-01, 4.667e-01, -2.403e-02, 1.082e-01, -2.768e-02, 2.378e-01, -4.118e-02, -7.649e-02, -1.219e-01, -2.735e-01, -5.228e-02)); + r += mul(s7_8, M4(4.283e-02, 4.777e-02, 7.159e-02, -6.319e-03, -7.433e-02, -1.139e-01, -2.676e-01, 5.704e-03, 2.529e-02, 2.313e-02, 1.420e-01, -1.098e-01, 1.671e-02, 6.478e-02, 5.599e-03, 3.933e-02)); + r += V4(1.033e-02, -7.655e-03, -2.000e-03, -1.543e-02); + return r; +} + +V4 f3(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-3.758e-03, 7.617e-02, 6.912e-02, 2.377e-01, 7.070e-02, -5.379e-02, -7.769e-02, 2.329e-02, -1.681e-01, 5.942e-02, 5.860e-02, 6.472e-02, 8.355e-02, -5.434e-02, 5.401e-03, -3.641e-02)); + r += mul(s0_1, M4(-1.019e-01, 5.684e-01, 4.270e-02, 5.252e-02, 4.030e-02, 7.683e-02, 1.746e-02, -1.488e-01, -1.782e-01, -8.970e-02, 1.105e-01, -4.931e-02, -4.062e-02, 8.742e-02, 1.987e-02, -5.478e-02)); + r += mul(s0_2, M4(3.552e-02, 4.850e-01, -1.131e-02, 1.896e-01, 8.424e-02, -4.286e-02, -2.712e-03, 2.802e-02, 2.943e-02, 8.074e-02, 4.319e-03, -1.202e-01, -1.101e-01, -2.639e-02, -2.619e-02, 7.176e-02)); + r += mul(s0_3, M4(-1.692e-01, -1.949e-01, -3.303e-02, -1.001e-02, -3.108e-02, -5.779e-02, 6.328e-02, -1.635e-01, 3.118e-01, -8.366e-02, -2.326e-01, -3.063e-01, -1.434e-02, 6.857e-02, -5.738e-02, -5.841e-03)); + r += mul(s0_4, M4(-4.082e-01, -1.538e-01, -4.761e-02, -8.800e-02, 4.440e-02, -1.050e-01, 6.496e-02, 1.187e-01, 1.208e-01, 1.621e-01, 2.869e-01, -4.994e-02, 2.745e-02, 1.254e-01, -7.371e-02, 8.563e-02)); + r += mul(s0_5, M4(-3.001e-01, 2.473e-01, 2.051e-01, -1.431e-01, -3.970e-02, -8.972e-02, 2.985e-02, 3.882e-02, 5.168e-02, 2.137e-02, 1.726e-02, -3.367e-03, -2.589e-02, 5.863e-03, -4.580e-02, 8.751e-02)); + r += mul(s0_6, M4(3.715e-02, -1.473e-01, -5.820e-02, -1.097e-03, 5.256e-02, 1.142e-01, -9.848e-02, 7.447e-02, -6.206e-03, 3.195e-02, 7.233e-02, -1.535e-01, -1.121e-01, 1.395e-01, -2.690e-02, -8.704e-02)); + r += mul(s0_7, M4(-3.731e-01, -6.268e-01, -1.841e-01, 6.942e-02, -3.763e-02, 6.455e-02, 5.035e-02, -1.305e-01, 1.451e-01, 1.066e-01, 3.048e-01, 1.745e-02, 1.996e-02, -2.749e-02, 1.726e-01, -2.763e-01)); + r += mul(s0_8, M4(2.241e-01, -1.718e-01, 6.101e-03, 2.807e-01, 2.449e-03, 4.505e-02, -8.207e-02, -2.656e-02, 5.609e-03, 2.359e-01, -1.738e-02, 1.096e-01, 5.393e-02, -1.916e-02, -8.992e-02, -1.024e-01)); + r += mul(s1_0, M4(6.518e-02, 7.482e-02, 1.297e-02, -4.784e-02, -1.974e-01, -5.278e-02, 6.695e-02, -1.773e-01, -1.970e-01, -9.692e-02, 5.651e-02, -6.470e-02, -6.872e-02, -5.913e-02, -3.371e-02, -2.319e-02)); + r += mul(s1_1, M4(-6.429e-02, 1.404e-02, 7.580e-02, -1.190e-01, -1.332e-01, -9.807e-02, 5.872e-02, 6.732e-02, -2.426e-01, -2.158e-01, 1.174e-01, -2.639e-02, 2.155e-01, -2.171e-01, 4.090e-02, -4.613e-02)); + r += mul(s1_2, M4(5.646e-02, 6.236e-02, 4.568e-03, -3.600e-02, 6.474e-02, -6.144e-02, 2.782e-02, 1.139e-01, 7.254e-03, -7.956e-02, -2.111e-03, -7.433e-02, -5.684e-02, 1.990e-02, 4.432e-02, -1.449e-02)); + r += mul(s1_3, M4(-2.484e-01, -9.496e-02, -5.244e-03, 4.678e-03, 3.685e-01, -1.557e-01, 1.238e-01, 5.032e-01, 3.138e-02, -1.324e-01, -9.592e-02, 4.115e-02, 2.581e-01, -2.674e-02, -3.571e-03, -1.843e-01)); + r += mul(s1_4, M4(4.006e-02, 8.431e-02, 4.414e-02, 4.780e-02, -6.018e-02, -3.496e-01, 6.532e-02, 1.016e-01, -1.647e-01, 1.719e-01, 1.165e-01, 1.253e-01, 1.866e-01, -4.797e-02, 4.293e-02, -3.443e-01)); + r += mul(s1_5, M4(-9.642e-02, -3.151e-02, 5.090e-02, 4.500e-02, -1.058e-01, -3.040e-01, 7.838e-02, 1.731e-01, -4.494e-02, -3.210e-02, 4.687e-02, -7.305e-02, -1.455e-01, -2.310e-02, 1.105e-01, 6.461e-02)); + r += mul(s1_6, M4(6.516e-02, 2.049e-01, -7.350e-03, 1.887e-01, -2.249e-01, 4.453e-02, -1.392e-01, 3.856e-02, 3.693e-02, -1.981e-02, 2.009e-01, 2.242e-02, -6.250e-03, 1.109e-01, -1.288e-01, 4.991e-02)); + r += mul(s1_7, M4(1.644e-01, -1.369e-01, -1.025e-01, 8.022e-03, -4.350e-01, 5.228e-02, 5.725e-02, 4.300e-02, -3.344e-01, -4.307e-02, 4.145e-02, -2.767e-01, -1.284e-01, 3.278e-01, -7.789e-01, 9.142e-01)); + r += mul(s1_8, M4(-2.715e-02, -2.013e-02, -6.933e-02, 4.864e-02, 6.995e-02, 2.184e-01, 3.157e-02, 1.156e-01, 6.813e-02, 5.536e-02, 3.155e-02, 1.914e-02, 1.898e-02, -1.525e-01, -1.083e-01, 8.293e-02)); + r += mul(s2_0, M4(3.057e-01, 3.366e-02, -7.672e-02, -1.528e-01, -8.638e-02, 3.335e-02, 1.581e-02, 1.377e-02, 7.964e-02, -6.812e-02, 5.726e-03, 6.136e-02, -2.493e-01, 1.237e-01, 4.327e-02, 4.104e-02)); + r += mul(s2_1, M4(-4.913e-03, -6.517e-02, -7.917e-02, -1.400e-01, 6.403e-02, -4.813e-02, 7.681e-03, 6.456e-02, 1.468e-01, -1.053e-03, 3.867e-03, -1.601e-01, -8.750e-02, 2.363e-01, -4.503e-02, 1.427e-01)); + r += mul(s2_2, M4(1.049e-02, -2.269e-01, -5.767e-02, 1.123e-01, 4.629e-02, -7.771e-03, 1.951e-02, -1.070e-01, 3.297e-03, 1.909e-02, -6.388e-02, -1.872e-02, 1.106e-01, -1.076e-01, -4.868e-02, -4.004e-02)); + r += mul(s2_3, M4(9.685e-02, -1.747e-01, 5.253e-02, 2.288e-02, 2.158e-01, 4.820e-02, 1.199e-01, -1.479e-01, 1.971e-01, 5.220e-02, -1.107e-01, 1.755e-02, 2.448e-01, 2.043e-01, -5.064e-02, -1.467e-01)); + r += mul(s2_4, M4(1.483e-01, -9.338e-02, 3.053e-01, 3.674e-02, -4.789e-02, -6.824e-02, 2.009e-01, -2.110e-01, 9.896e-02, 3.739e-01, -3.624e-02, -6.419e-02, -1.496e-01, 2.263e-01, 2.480e-01, -3.066e-01)); + r += mul(s2_5, M4(4.285e-02, -1.865e-01, 1.919e-01, 1.222e-01, 2.484e-02, -1.035e-01, 5.325e-02, -1.774e-02, 8.416e-02, 8.750e-03, 1.072e-01, 1.335e-01, 1.340e-01, 1.472e-01, -2.104e-02, -1.035e-01)); + r += mul(s2_6, M4(5.401e-02, -1.072e-01, -2.533e-02, 9.819e-02, -1.101e-01, -6.547e-02, -2.413e-01, 1.610e-01, 1.089e-01, -4.599e-02, -9.606e-02, -2.390e-01, 3.399e-02, -1.979e-01, 5.705e-02, -5.747e-02)); + r += mul(s2_7, M4(-8.321e-02, 7.437e-02, -3.539e-01, -1.672e-02, -1.665e-02, 2.068e-01, -7.621e-01, 6.597e-01, -2.447e-01, 2.339e-02, 9.553e-02, 2.941e-02, -2.685e-01, 1.937e-01, -2.887e-01, 2.725e-01)); + r += mul(s2_8, M4(2.926e-02, -1.894e-01, 6.963e-03, 6.560e-02, -1.028e-01, -1.773e-01, -9.563e-02, 8.999e-02, -1.051e-01, -1.072e-01, -5.523e-02, 9.691e-02, -6.205e-02, 7.601e-03, 5.785e-03, 5.219e-02)); + r += mul(s3_0, M4(1.045e-01, 6.734e-02, 4.300e-02, 1.489e-01, 6.522e-02, -6.717e-02, -6.585e-03, -2.107e-02, 4.468e-02, -1.545e-01, 4.438e-02, 8.534e-02, 1.208e-01, 1.860e-02, 5.553e-02, -2.556e-02)); + r += mul(s3_1, M4(-7.592e-02, -5.138e-02, -7.580e-02, 1.265e-01, -1.954e-01, 8.033e-02, 2.697e-02, 7.622e-03, -1.312e-01, 8.863e-02, -2.099e-02, 5.640e-02, 2.769e-02, -5.627e-03, -1.252e-02, -1.444e-01)); + r += mul(s3_2, M4(-2.088e-02, 6.035e-02, 1.498e-02, 2.430e-02, -1.182e-02, -1.124e-01, -3.626e-02, 4.757e-02, 1.656e-01, -1.633e-01, -9.650e-02, 9.102e-02, 9.852e-04, -4.813e-02, 2.747e-02, -1.393e-01)); + r += mul(s3_3, M4(3.472e-01, 3.092e-02, -6.392e-02, 6.680e-02, 1.125e-01, 1.447e-03, -7.247e-02, -6.417e-02, -1.433e-02, 1.248e-01, 2.670e-02, 8.518e-02, -5.483e-02, 6.709e-03, -4.418e-02, 1.285e-01)); + r += mul(s3_4, M4(1.294e-01, 9.550e-02, 1.910e-01, -2.522e-01, -5.592e-03, -1.394e-01, 6.054e-02, 8.921e-02, 4.476e-01, 1.155e-01, -1.468e-01, 2.610e-01, -1.090e-01, -1.395e-02, 3.005e-02, 3.408e-03)); + r += mul(s3_5, M4(-1.316e-01, 1.761e-02, -3.773e-02, -7.906e-02, -5.174e-02, -6.989e-02, 1.748e-02, -2.507e-03, -2.583e-02, -3.823e-02, 1.149e-01, -7.926e-02, -2.495e-02, -3.870e-02, -4.058e-02, 1.254e-01)); + r += mul(s3_6, M4(7.346e-02, 4.658e-02, -1.027e-01, -9.269e-02, -1.354e-02, -3.943e-03, -2.036e-01, -1.463e-01, 5.179e-02, 1.687e-01, -5.164e-02, -2.656e-02, -5.462e-02, -5.923e-02, 1.995e-02, -6.361e-02)); + r += mul(s3_7, M4(1.919e-02, -3.371e-03, 2.938e-01, -1.992e-01, -2.979e-03, -1.093e-01, 1.858e-01, -4.176e-01, -8.299e-02, -6.490e-02, 3.646e-01, -2.355e-01, 1.422e-02, 5.154e-02, -3.259e-02, 1.654e-01)); + r += mul(s3_8, M4(-3.358e-02, 2.703e-03, -1.307e-01, -4.966e-02, -8.679e-02, 1.698e-01, -1.447e-01, 4.559e-02, -1.525e-01, 8.874e-02, -6.838e-02, -1.685e-01, 2.004e-02, -4.271e-02, -1.110e-02, 1.418e-02)); + r += mul(s4_0, M4(1.153e-01, 3.278e-02, -1.984e-02, 9.321e-03, -1.442e-01, 1.189e-01, -1.124e-02, 5.252e-02, 3.034e-01, -9.655e-02, -6.094e-02, 2.892e-01, -3.730e-03, 8.028e-01, -6.173e-02, -1.532e-01)); + r += mul(s4_1, M4(1.025e-01, -8.287e-02, 3.901e-02, -1.558e-01, -2.023e-01, -1.739e-01, 4.269e-02, 2.685e-02, -6.982e-02, -1.987e-01, -6.712e-02, 4.156e-02, 3.297e-01, 6.498e-01, 2.479e-01, -5.953e-01)); + r += mul(s4_2, M4(-1.068e-01, -2.891e-02, 8.870e-02, -1.661e-01, 1.573e-01, 5.167e-02, -7.041e-03, -8.596e-02, -2.175e-02, 2.233e-01, 1.118e-02, -7.196e-02, 4.037e-01, 4.387e-01, -1.536e-01, -4.341e-02)); + r += mul(s4_3, M4(-1.184e-01, -4.621e-02, 5.939e-02, -8.380e-02, 1.851e-01, -2.091e-01, -8.024e-04, 9.550e-02, -1.187e-01, -2.302e-01, 1.589e-01, 8.751e-02, -7.050e-01, -7.811e-01, 4.696e-01, 1.788e-01)); + r += mul(s4_4, M4(-2.695e-02, 4.550e-02, -1.792e-01, 1.519e-01, -1.141e-01, 2.095e-01, -8.601e-02, -9.451e-02, -4.056e-01, -3.000e-01, 2.386e-02, 1.290e-01, 2.230e-01, -3.472e-02, -9.723e-01, 2.486e-01)); + r += mul(s4_5, M4(2.915e-03, -7.673e-02, -1.262e-02, 1.916e-02, 1.816e-01, -3.453e-02, -2.695e-04, -1.356e-01, 3.496e-02, 5.267e-02, -8.667e-02, -3.235e-01, 3.861e-01, 5.660e-01, -1.828e-01, -1.704e-01)); + r += mul(s4_6, M4(1.632e-01, 2.510e-01, -9.598e-02, 3.087e-02, -5.671e-03, -1.048e-01, -4.369e-03, 1.901e-02, 2.465e-01, 8.645e-03, 1.715e-01, 2.438e-01, 5.865e-01, 4.047e-01, 5.474e-01, 6.404e-01)); + r += mul(s4_7, M4(-1.204e-01, 4.781e-02, 3.613e-02, -4.889e-02, -5.033e-03, -2.781e-01, -2.346e-02, 2.110e-02, 9.348e-02, -7.106e-02, -1.281e-01, 1.660e-01, 3.296e-01, -9.292e-01, 1.562e+00, -1.151e+00)); + r += mul(s4_8, M4(5.152e-03, 1.871e-02, -6.217e-03, 1.707e-01, 1.013e-01, 1.548e-01, 4.119e-02, -4.431e-02, -1.716e-02, 8.323e-02, -2.118e-02, -2.531e-01, 2.598e-01, 5.480e-02, -5.895e-01, -6.074e-01)); + r += mul(s5_0, M4(-1.151e-01, -8.785e-02, -7.595e-02, 2.556e-02, -1.627e-01, 9.401e-02, -6.269e-02, 5.041e-02, 3.075e-02, -1.058e-01, 2.416e-03, -8.175e-02, -2.533e-02, 1.259e-01, -1.033e-02, -1.544e-02)); + r += mul(s5_1, M4(2.719e-01, -5.704e-02, -4.706e-02, 1.435e-02, 1.781e-02, -8.804e-02, 6.679e-02, 3.407e-02, -8.725e-02, -1.454e-01, -3.964e-02, 1.686e-01, 3.078e-02, 1.527e-01, -2.336e-02, 8.638e-02)); + r += mul(s5_2, M4(-9.739e-02, -1.581e-01, 1.193e-01, -1.140e-01, 8.583e-02, 1.014e-01, -4.930e-02, -3.523e-02, -3.552e-02, 2.957e-02, 9.932e-02, -1.241e-01, 5.827e-04, 4.510e-03, 8.899e-02, 7.640e-03)); + r += mul(s5_3, M4(-7.002e-02, 1.106e-01, 7.769e-02, -3.625e-01, -2.617e-02, 6.854e-04, 1.240e-01, -2.399e-01, -1.245e-02, 1.096e-01, 7.265e-02, -5.656e-02, -1.526e-02, -4.186e-03, 4.619e-02, -1.449e-01)); + r += mul(s5_4, M4(2.417e-01, 1.537e-01, 4.630e-03, 5.479e-02, -1.961e-02, -5.185e-02, -1.879e-01, 1.597e-01, -5.192e-03, -1.293e-02, -6.857e-03, 4.178e-02, -1.144e-01, -1.014e-01, -1.105e-01, 2.070e-01)); + r += mul(s5_5, M4(1.026e-01, -2.085e-01, 9.310e-04, 6.208e-02, 5.632e-02, -3.012e-01, -1.693e-02, -1.228e-01, 3.079e-02, 6.654e-03, 2.042e-02, 3.115e-03, 2.767e-02, -3.941e-02, -1.027e-01, -1.193e-01)); + r += mul(s5_6, M4(-5.361e-02, 1.839e-01, -1.381e-02, -4.992e-02, 1.197e-01, -2.658e-02, 4.414e-02, 3.060e-01, 2.078e-01, -5.305e-02, -7.618e-02, -1.528e-01, 8.231e-02, 1.479e-02, -1.472e-02, -1.767e-02)); + r += mul(s5_7, M4(-1.962e-03, 1.135e-01, -8.852e-02, -1.797e-02, 2.641e-01, -1.138e-01, -1.912e-02, 2.951e-01, 6.433e-03, 7.263e-03, -6.725e-02, 1.238e-01, -1.916e-01, -1.174e-01, 3.328e-02, 1.476e-01)); + r += mul(s5_8, M4(-8.259e-02, 1.196e-01, 2.297e-02, 4.276e-02, 3.669e-02, -2.559e-02, 6.839e-02, 1.683e-01, -5.570e-02, 1.671e-01, -1.644e-02, -9.741e-02, 1.025e-01, -8.816e-02, 1.826e-02, -2.364e-02)); + r += mul(s6_0, M4(-2.535e-01, 1.111e-02, 1.390e-02, -1.202e-01, -5.318e-02, -4.885e-02, -4.511e-02, -4.861e-03, -1.718e-01, -5.259e-02, 2.545e-02, 2.374e-02, -1.528e-01, -6.412e-03, -1.480e-02, 1.350e-01)); + r += mul(s6_1, M4(-2.912e-01, -1.131e-02, 3.652e-02, -1.608e-02, 4.979e-03, -5.479e-02, 2.703e-02, -4.558e-02, -4.872e-02, 3.846e-02, 8.584e-02, 9.559e-02, 1.828e-01, -9.439e-04, -5.438e-02, 1.303e-01)); + r += mul(s6_2, M4(-5.778e-02, 5.187e-02, -2.630e-02, -7.704e-02, -3.566e-02, -5.934e-02, 1.820e-02, 5.576e-02, -2.745e-02, 3.232e-02, 8.394e-02, 3.470e-02, 5.279e-02, 4.295e-02, 5.794e-02, -4.407e-03)); + r += mul(s6_3, M4(-2.326e-02, -1.651e-02, 9.584e-02, 8.951e-02, -4.249e-02, 4.926e-02, 2.225e-02, 8.911e-02, -2.212e-01, 6.553e-03, 5.084e-02, 2.918e-02, 1.774e-02, -1.435e-01, 4.841e-02, 4.622e-02)); + r += mul(s6_4, M4(2.492e-01, 2.205e-02, 1.578e-02, -1.140e-01, -3.456e-02, 1.953e-01, 2.578e-02, 1.255e-01, 1.047e-01, 3.143e-02, -3.481e-01, 1.965e-01, -1.062e-01, -1.112e-01, 5.874e-02, 6.422e-02)); + r += mul(s6_5, M4(-1.986e-01, 1.203e-01, -6.987e-02, -9.607e-02, -1.267e-02, 1.618e-01, -5.594e-02, 2.820e-02, -1.304e-03, 2.070e-01, -1.037e-01, 2.567e-01, -9.442e-02, 9.773e-02, -6.431e-02, 4.221e-02)); + r += mul(s6_6, M4(6.672e-02, 5.162e-02, -4.157e-02, 4.170e-02, 2.030e-02, -5.778e-02, -8.677e-03, -7.128e-02, -5.729e-02, 2.775e-03, 1.171e-01, 9.867e-02, 3.169e-01, 2.530e-01, -2.410e-03, -3.967e-03)); + r += mul(s6_7, M4(2.745e-02, -9.191e-02, -4.763e-02, -7.475e-02, 2.111e-01, -1.829e-01, -5.249e-02, -6.307e-02, -1.656e-01, -4.147e-01, 2.770e-02, -1.667e-01, 1.274e-01, -2.991e-01, -9.795e-02, -2.018e-01)); + r += mul(s6_8, M4(6.462e-02, 8.191e-02, 1.501e-02, -3.084e-01, 3.494e-02, -1.754e-02, 2.011e-02, -1.587e-01, -1.362e-01, 1.886e-01, -1.740e-01, -1.429e-01, -7.398e-02, -7.677e-02, -1.702e-02, -5.762e-02)); + r += mul(s7_0, M4(1.334e-01, 1.942e-01, -1.171e-02, 8.299e-02, -8.526e-02, -2.180e-01, 5.514e-02, -1.436e-02, 5.323e-02, 3.455e-02, 2.642e-02, 1.681e-02, 9.616e-03, 1.213e-02, 7.231e-02, -1.113e-02)); + r += mul(s7_1, M4(-1.613e-01, 5.467e-02, 3.423e-02, 1.011e-02, 1.974e-01, 1.498e-01, 1.780e-02, -6.198e-02, 2.254e-01, -6.978e-04, -2.064e-02, 6.975e-03, -7.109e-02, -6.513e-02, -3.146e-02, -8.605e-02)); + r += mul(s7_2, M4(1.097e-01, 1.303e-01, -2.511e-02, 1.708e-02, -2.600e-02, 3.643e-02, 4.636e-02, -9.953e-04, 1.382e-01, 3.000e-01, -7.425e-02, 3.608e-02, -2.558e-02, 1.338e-01, 3.733e-02, 7.616e-02)); + r += mul(s7_3, M4(1.074e-01, 6.512e-02, -4.465e-02, 6.519e-02, -1.936e-02, -1.653e-01, 1.620e-03, -8.754e-04, -1.027e-01, -1.507e-01, -2.866e-02, 1.681e-01, 2.847e-01, 2.362e-01, -2.515e-01, -3.844e-01)); + r += mul(s7_4, M4(5.933e-02, -9.733e-02, -5.048e-02, 1.283e-01, -1.207e-01, 4.300e-01, -9.009e-02, 2.569e-01, 3.240e-01, -1.023e-01, -2.388e-01, -2.404e-01, 3.049e-02, 1.859e-01, -1.149e-02, 8.890e-02)); + r += mul(s7_5, M4(-4.837e-02, -4.022e-02, -9.985e-02, 2.189e-02, -1.578e-01, -4.311e-02, -2.034e-02, -1.535e-01, 1.856e-01, 8.270e-02, -7.737e-02, -1.922e-02, -4.536e-02, 4.765e-02, -1.193e-03, 7.205e-02)); + r += mul(s7_6, M4(1.942e-01, -1.707e-01, -4.945e-02, 7.447e-02, -4.521e-02, -4.525e-02, 5.924e-02, 1.494e-02, -1.148e-01, -2.395e-02, 9.159e-02, -1.781e-01, -8.017e-02, -1.350e-01, 1.942e-02, -1.520e-01)); + r += mul(s7_7, M4(1.286e-01, -5.202e-02, -8.071e-02, 2.529e-02, -2.521e-01, 4.532e-01, -2.095e-01, 2.114e-01, 7.191e-02, -4.856e-02, 3.030e-01, 2.091e-02, -8.676e-02, 7.358e-02, -1.278e-01, 2.998e-02)); + r += mul(s7_8, M4(9.250e-02, 2.525e-01, 2.439e-02, -7.490e-02, 8.973e-03, 2.871e-01, -1.946e-01, -3.327e-02, 2.057e-01, 3.037e-02, 3.450e-02, -1.399e-01, 3.158e-02, -4.555e-02, 4.175e-02, 1.327e-03)); + r += V4(2.171e-03, 1.231e-02, -3.483e-03, 2.026e-03); + return r; +} + +void Pass3(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = Rmp8x8(tid.x) + blockStart; + uint2 size = GetInputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = (gxy + 0.5) * pt; + + V4 s0_0 = l0(-1.0, -1.0); + V4 s0_1 = l0(0.0, -1.0); + V4 s0_2 = l0(1.0, -1.0); + V4 s0_3 = l0(-1.0, 0.0); + V4 s0_4 = l0(0.0, 0.0); + V4 s0_5 = l0(1.0, 0.0); + V4 s0_6 = l0(-1.0, 1.0); + V4 s0_7 = l0(0.0, 1.0); + V4 s0_8 = l0(1.0, 1.0); + V4 s1_0 = -max(-s0_0, 0.0); + V4 s1_1 = -max(-s0_1, 0.0); + V4 s1_2 = -max(-s0_2, 0.0); + V4 s1_3 = -max(-s0_3, 0.0); + V4 s1_4 = -max(-s0_4, 0.0); + V4 s1_5 = -max(-s0_5, 0.0); + V4 s1_6 = -max(-s0_6, 0.0); + V4 s1_7 = -max(-s0_7, 0.0); + V4 s1_8 = -max(-s0_8, 0.0); + s0_0 = max(s0_0, 0.0); + s0_1 = max(s0_1, 0.0); + s0_2 = max(s0_2, 0.0); + s0_3 = max(s0_3, 0.0); + s0_4 = max(s0_4, 0.0); + s0_5 = max(s0_5, 0.0); + s0_6 = max(s0_6, 0.0); + s0_7 = max(s0_7, 0.0); + s0_8 = max(s0_8, 0.0); + + V4 s2_0 = l1(-1.0, -1.0); + V4 s2_1 = l1(0.0, -1.0); + V4 s2_2 = l1(1.0, -1.0); + V4 s2_3 = l1(-1.0, 0.0); + V4 s2_4 = l1(0.0, 0.0); + V4 s2_5 = l1(1.0, 0.0); + V4 s2_6 = l1(-1.0, 1.0); + V4 s2_7 = l1(0.0, 1.0); + V4 s2_8 = l1(1.0, 1.0); + V4 s3_0 = -max(-s2_0, 0.0); + V4 s3_1 = -max(-s2_1, 0.0); + V4 s3_2 = -max(-s2_2, 0.0); + V4 s3_3 = -max(-s2_3, 0.0); + V4 s3_4 = -max(-s2_4, 0.0); + V4 s3_5 = -max(-s2_5, 0.0); + V4 s3_6 = -max(-s2_6, 0.0); + V4 s3_7 = -max(-s2_7, 0.0); + V4 s3_8 = -max(-s2_8, 0.0); + s2_0 = max(s2_0, 0.0); + s2_1 = max(s2_1, 0.0); + s2_2 = max(s2_2, 0.0); + s2_3 = max(s2_3, 0.0); + s2_4 = max(s2_4, 0.0); + s2_5 = max(s2_5, 0.0); + s2_6 = max(s2_6, 0.0); + s2_7 = max(s2_7, 0.0); + s2_8 = max(s2_8, 0.0); + + V4 s4_0 = l2(-1.0, -1.0); + V4 s4_1 = l2(0.0, -1.0); + V4 s4_2 = l2(1.0, -1.0); + V4 s4_3 = l2(-1.0, 0.0); + V4 s4_4 = l2(0.0, 0.0); + V4 s4_5 = l2(1.0, 0.0); + V4 s4_6 = l2(-1.0, 1.0); + V4 s4_7 = l2(0.0, 1.0); + V4 s4_8 = l2(1.0, 1.0); + V4 s5_0 = -max(-s4_0, 0.0); + V4 s5_1 = -max(-s4_1, 0.0); + V4 s5_2 = -max(-s4_2, 0.0); + V4 s5_3 = -max(-s4_3, 0.0); + V4 s5_4 = -max(-s4_4, 0.0); + V4 s5_5 = -max(-s4_5, 0.0); + V4 s5_6 = -max(-s4_6, 0.0); + V4 s5_7 = -max(-s4_7, 0.0); + V4 s5_8 = -max(-s4_8, 0.0); + s4_0 = max(s4_0, 0.0); + s4_1 = max(s4_1, 0.0); + s4_2 = max(s4_2, 0.0); + s4_3 = max(s4_3, 0.0); + s4_4 = max(s4_4, 0.0); + s4_5 = max(s4_5, 0.0); + s4_6 = max(s4_6, 0.0); + s4_7 = max(s4_7, 0.0); + s4_8 = max(s4_8, 0.0); + + V4 s6_0 = l3(-1.0, -1.0); + V4 s6_1 = l3(0.0, -1.0); + V4 s6_2 = l3(1.0, -1.0); + V4 s6_3 = l3(-1.0, 0.0); + V4 s6_4 = l3(0.0, 0.0); + V4 s6_5 = l3(1.0, 0.0); + V4 s6_6 = l3(-1.0, 1.0); + V4 s6_7 = l3(0.0, 1.0); + V4 s6_8 = l3(1.0, 1.0); + V4 s7_0 = -max(-s6_0, 0.0); + V4 s7_1 = -max(-s6_1, 0.0); + V4 s7_2 = -max(-s6_2, 0.0); + V4 s7_3 = -max(-s6_3, 0.0); + V4 s7_4 = -max(-s6_4, 0.0); + V4 s7_5 = -max(-s6_5, 0.0); + V4 s7_6 = -max(-s6_6, 0.0); + V4 s7_7 = -max(-s6_7, 0.0); + V4 s7_8 = -max(-s6_8, 0.0); + s6_0 = max(s6_0, 0.0); + s6_1 = max(s6_1, 0.0); + s6_2 = max(s6_2, 0.0); + s6_3 = max(s6_3, 0.0); + s6_4 = max(s6_4, 0.0); + s6_5 = max(s6_5, 0.0); + s6_6 = max(s6_6, 0.0); + s6_7 = max(s6_7, 0.0); + s6_8 = max(s6_8, 0.0); + + t0[gxy] = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t1[gxy] = f1(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t2[gxy] = f2(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t3[gxy] = f3(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); +} + +//!PASS 4 +//!DESC conv3 +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 +//!IN t0, t1, t2, t3 +//!OUT t4, t5, t6, t7 + +#define l0(x, y) V4(O(t0, float2(x, y))) +#define l1(x, y) V4(O(t1, float2(x, y))) +#define l2(x, y) V4(O(t2, float2(x, y))) +#define l3(x, y) V4(O(t3, float2(x, y))) + +V4 f0(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-1.148e-01, -8.185e-02, -1.411e-02, 5.234e-02, 1.760e-01, -2.862e-02, 2.125e-03, -9.211e-03, 1.019e-01, 3.912e-02, 3.709e-02, 1.898e-02, 9.759e-02, 1.289e-01, 1.633e-02, -1.400e-01)); + r += mul(s0_1, M4(-1.021e-01, -2.273e-02, 9.546e-02, 2.171e-02, -5.309e-02, -7.581e-03, -9.869e-03, 1.025e-01, -5.688e-02, -9.736e-03, -3.693e-02, -9.752e-02, 3.177e-01, 1.791e-03, -4.513e-03, -3.494e-02)); + r += mul(s0_2, M4(1.081e-02, -3.946e-02, -8.423e-02, -5.189e-03, 2.352e-02, 9.578e-02, -2.665e-02, 7.931e-02, 1.164e-01, -7.756e-02, -7.551e-02, 2.317e-02, -1.850e-02, 2.503e-02, 1.020e-02, 3.127e-02)); + r += mul(s0_3, M4(-1.711e-01, -5.064e-02, 5.811e-02, 9.636e-02, -9.589e-02, -1.298e-02, -4.247e-02, -2.036e-02, -1.126e-01, -6.640e-02, -6.445e-03, 1.700e-01, 7.660e-02, -6.665e-03, -4.980e-02, -2.623e-02)); + r += mul(s0_4, M4(1.482e-01, -1.146e-01, -1.488e-01, -1.059e-01, -1.714e-01, 8.280e-02, 4.026e-02, 1.548e-01, -5.075e-02, 1.049e-01, 3.046e-02, 6.307e-02, -2.167e-02, 5.749e-02, -2.166e-01, 2.334e-01)); + r += mul(s0_5, M4(-6.098e-02, 3.640e-02, -1.929e-02, -4.996e-02, -1.136e-02, 1.956e-01, 1.212e-02, 1.828e-01, 1.526e-02, 5.544e-02, 2.381e-02, -3.802e-02, -1.418e-01, 4.179e-02, -1.739e-01, 1.139e-01)); + r += mul(s0_6, M4(-7.260e-02, 7.911e-02, 5.132e-03, 2.420e-02, 1.140e-03, -1.315e-01, -3.142e-02, -4.042e-02, 4.358e-02, 6.544e-02, 6.622e-03, 3.360e-02, 1.223e-01, 5.543e-02, 3.080e-02, 1.314e-01)); + r += mul(s0_7, M4(-8.027e-03, 4.926e-02, -3.521e-03, -2.338e-02, -1.126e-01, 5.741e-03, 5.360e-02, 1.018e-01, 1.403e-01, 7.060e-02, -5.804e-02, 1.384e-01, -1.067e-01, -1.198e-01, -3.449e-02, 1.961e-01)); + r += mul(s0_8, M4(-3.738e-02, -1.306e-01, 1.107e-02, -7.607e-02, 1.243e-01, -1.010e-01, 1.212e-02, 2.539e-01, -8.092e-02, -7.852e-03, 1.825e-02, -2.749e-04, 9.700e-02, 7.530e-02, -4.116e-02, -5.427e-02)); + r += mul(s1_0, M4(1.050e-01, -1.468e-02, -7.091e-02, -8.371e-02, 1.020e-02, 9.543e-02, -2.195e-02, -1.574e-04, 2.162e-01, -3.034e-01, -3.787e-02, 2.131e-01, -1.148e-02, 1.077e-02, 9.198e-02, 1.001e-01)); + r += mul(s1_1, M4(-3.883e-02, -4.188e-02, 6.138e-02, -8.807e-02, -1.576e-01, 1.075e-01, 5.166e-02, -2.216e-02, 1.049e-01, -1.876e-02, -9.194e-02, -4.131e-02, -8.374e-02, -5.167e-02, -1.251e-01, 1.607e-01)); + r += mul(s1_2, M4(-4.730e-02, 1.121e-01, 7.568e-02, 5.447e-02, 8.668e-02, 5.584e-02, -9.957e-03, -3.589e-03, 2.666e-01, 6.166e-02, 2.291e-02, 1.741e-01, 5.895e-02, 4.918e-02, -8.752e-02, 1.369e-01)); + r += mul(s1_3, M4(-1.635e-01, -4.629e-02, 5.164e-02, 8.537e-03, -8.651e-02, -1.172e-01, 2.755e-04, 1.021e-01, -1.107e-01, 1.182e-01, 2.746e-02, 2.390e-01, 1.820e-02, 8.032e-02, -7.235e-02, 7.531e-02)); + r += mul(s1_4, M4(1.067e-01, -4.792e-03, -9.543e-02, 5.090e-03, 2.230e-02, -3.161e-01, -5.231e-02, 2.124e-01, 2.475e-01, 1.983e-01, 7.380e-03, 1.579e-01, -1.399e-02, -1.190e-01, -1.073e-01, -9.188e-02)); + r += mul(s1_5, M4(7.826e-02, 1.374e-01, -9.163e-02, -3.429e-02, 2.204e-01, -3.229e-02, 5.139e-02, -9.958e-02, 7.382e-02, 2.384e-01, -2.388e-01, 3.980e-02, -8.830e-02, -4.230e-02, -1.036e-01, 5.042e-02)); + r += mul(s1_6, M4(2.173e-03, -6.181e-02, 3.234e-02, 1.587e-01, 7.717e-02, -2.153e-02, -2.742e-02, -9.150e-02, 7.825e-02, -2.646e-01, 1.481e-02, 2.971e-01, 2.110e-02, 1.253e-01, -7.860e-03, -8.129e-02)); + r += mul(s1_7, M4(7.583e-02, 1.063e-01, -2.099e-02, -4.610e-04, 1.094e-01, -5.212e-02, -2.047e-02, -6.110e-02, -1.883e-01, -7.224e-02, -4.196e-02, 9.632e-02, -1.147e-01, 6.630e-02, 3.887e-03, 1.138e-02)); + r += mul(s1_8, M4(3.765e-02, 1.596e-01, 5.584e-02, 1.169e-01, 5.791e-02, -4.240e-02, 1.590e-02, 2.315e-02, -3.759e-02, 1.557e-01, -2.875e-02, 8.878e-02, 4.666e-02, -4.438e-02, 4.127e-02, 7.803e-02)); + r += mul(s2_0, M4(-2.433e-02, -2.140e-02, 3.534e-02, 8.763e-02, -6.537e-02, 2.888e-03, 1.781e-02, -9.516e-02, -4.959e-02, -7.305e-04, -3.082e-03, 1.726e-01, -1.093e-01, 4.877e-04, -3.107e-02, 1.510e-01)); + r += mul(s2_1, M4(4.781e-02, 2.146e-02, -7.985e-02, 1.144e-01, 6.127e-02, -1.343e-01, -4.452e-02, 1.627e-01, 3.195e-02, -1.323e-01, -6.793e-02, -8.531e-02, 9.914e-03, 1.234e-01, 5.605e-02, 7.464e-02)); + r += mul(s2_2, M4(2.733e-02, 6.205e-02, 2.271e-02, -3.695e-02, -7.404e-02, 6.556e-02, -9.502e-02, 3.729e-02, -1.791e-01, -2.851e-02, 7.849e-02, -7.159e-02, 5.587e-02, 1.027e-01, -1.121e-01, -5.296e-02)); + r += mul(s2_3, M4(4.445e-02, 4.192e-02, -6.881e-03, 1.003e-01, 6.648e-02, 1.018e-01, -4.082e-03, 1.489e-02, -5.513e-02, 5.094e-02, -1.898e-02, -1.538e-01, -4.049e-02, -7.602e-02, -4.031e-02, 2.744e-01)); + r += mul(s2_4, M4(-4.634e-02, 1.529e-01, 4.334e-02, -7.627e-03, -2.217e-01, -1.784e-02, 1.034e-02, 7.111e-02, 4.219e-01, 3.733e-01, 5.571e-01, -3.626e-01, 2.417e-01, 5.628e-02, 6.872e-03, 6.866e-02)); + r += mul(s2_5, M4(-3.169e-02, -7.973e-02, -2.056e-01, 8.751e-02, 1.181e-02, -8.371e-02, -1.162e-01, 3.191e-02, -3.315e-02, -1.636e-01, -1.206e-01, 3.676e-02, -1.169e-01, -1.986e-01, -1.931e-01, 6.134e-02)); + r += mul(s2_6, M4(-6.188e-02, -3.657e-02, 1.201e-03, -6.201e-03, 4.759e-02, -1.386e-01, 6.573e-02, -4.832e-01, 5.454e-02, -1.073e-01, 5.971e-03, 4.345e-02, -1.782e-01, 1.215e-01, 2.692e-02, 2.557e-01)); + r += mul(s2_7, M4(-7.797e-02, -1.084e-01, 5.175e-03, 9.329e-02, -2.287e-01, 1.999e-01, -6.601e-03, -9.554e-02, -3.143e-02, 1.081e-01, -6.461e-02, -6.680e-02, 3.113e-02, -1.750e-03, -5.845e-02, 2.402e-02)); + r += mul(s2_8, M4(2.924e-02, 1.331e-01, 7.454e-03, -3.124e-02, 1.476e-02, 2.380e-02, 9.213e-03, -7.625e-02, -5.502e-02, -2.179e-01, -3.804e-02, -4.410e-02, 4.534e-02, 1.053e-01, 5.307e-02, 5.106e-02)); + r += mul(s3_0, M4(1.826e-02, -6.125e-02, 5.636e-02, -6.383e-02, 1.119e-01, -5.472e-02, -1.497e-02, -4.192e-02, 2.173e-01, -4.268e-02, 8.650e-02, -4.834e-02, -7.294e-02, -3.110e-02, 7.425e-03, 8.361e-03)); + r += mul(s3_1, M4(-2.545e-02, -2.326e-01, -4.745e-02, 2.995e-01, -2.049e-02, -8.489e-02, 3.580e-02, 1.492e-02, 1.409e-01, -4.312e-02, -1.762e-01, -4.962e-02, 5.562e-03, 3.523e-02, 7.543e-02, -5.587e-02)); + r += mul(s3_2, M4(-4.105e-02, -2.489e-01, -6.214e-02, 8.548e-02, 2.323e-02, -2.092e-03, -8.933e-02, 6.399e-02, 4.277e-02, -7.947e-02, 1.034e-01, -2.830e-02, 7.203e-02, -1.177e-02, -5.893e-02, -1.309e-01)); + r += mul(s3_3, M4(1.762e-01, -1.742e-01, 6.785e-02, -1.550e-01, -2.695e-02, -8.647e-03, -2.921e-02, 2.048e-03, -1.097e-01, -6.132e-02, 4.258e-02, 1.509e-01, 8.423e-02, 3.367e-03, -2.041e-03, -1.195e-01)); + r += mul(s3_4, M4(1.996e-01, -1.168e-01, -9.302e-02, 3.043e-01, -3.837e-02, 2.810e-01, 5.145e-02, -1.396e-01, 3.323e-03, -9.145e-02, 1.519e-01, 3.587e-01, 2.582e-01, -3.045e-01, 5.168e-02, -1.023e-01)); + r += mul(s3_5, M4(2.237e-01, -1.517e-01, -2.061e-01, 1.276e-02, -3.531e-02, 1.714e-02, -2.996e-02, -2.775e-02, 7.813e-02, -6.512e-05, -6.621e-02, -4.317e-03, 1.628e-01, -1.701e-01, -3.663e-01, -2.800e-01)); + r += mul(s3_6, M4(-2.112e-01, -1.664e-01, -1.945e-02, -3.029e-01, 1.268e-01, 1.859e-02, 2.151e-02, 7.883e-02, -1.175e-01, -7.301e-02, -1.675e-02, 3.992e-02, 3.473e-03, 4.124e-02, -1.485e-02, -1.433e-01)); + r += mul(s3_7, M4(-1.850e-01, -6.911e-02, -5.602e-02, -9.484e-02, 4.773e-02, 5.576e-02, -1.829e-02, 6.391e-02, 5.080e-02, 1.449e-01, 7.632e-02, 1.613e-02, 4.483e-03, -2.650e-01, -3.473e-02, 1.705e-02)); + r += mul(s3_8, M4(-6.757e-02, -6.804e-03, 1.366e-02, -2.227e-01, 2.078e-02, -8.953e-02, -1.051e-02, 3.131e-02, 1.905e-02, -4.710e-02, -1.816e-02, 1.138e-01, -9.230e-02, -1.380e-01, -7.560e-02, -1.729e-01)); + r += mul(s4_0, M4(-7.715e-02, -4.226e-02, -1.726e-04, -3.048e-02, 1.289e-01, -1.014e-02, 6.840e-04, -3.068e-02, 1.129e-02, -2.180e-02, 2.234e-02, -3.127e-02, -4.607e-02, -2.965e-02, 4.736e-02, 1.610e-02)); + r += mul(s4_1, M4(-1.268e-02, -6.178e-02, 8.163e-02, 6.305e-02, 1.033e-01, -3.181e-02, -4.803e-02, 1.333e-02, 3.381e-03, -1.908e-02, 2.222e-02, 7.992e-02, -9.103e-02, 3.049e-02, 8.586e-02, -8.075e-02)); + r += mul(s4_2, M4(5.629e-02, 1.303e-01, 2.169e-02, -1.143e-01, -9.910e-02, 9.202e-02, -4.430e-02, -5.384e-02, 1.788e-02, 5.285e-02, -1.935e-02, 1.770e-01, 9.311e-03, 1.101e-01, 5.366e-02, 8.400e-02)); + r += mul(s4_3, M4(-1.919e-01, 4.128e-02, -6.310e-02, 1.233e-01, 5.438e-02, 4.894e-02, 3.223e-02, -1.526e-01, 9.431e-03, -1.171e-01, -2.802e-03, 4.199e-02, 3.082e-01, -2.440e-01, 8.263e-02, -4.082e-02)); + r += mul(s4_4, M4(1.600e-01, -1.433e-01, 8.529e-02, -1.535e-01, -4.229e-01, -3.177e-02, -1.559e-01, 9.507e-02, -4.231e-02, -1.538e-01, 2.965e-02, 1.360e-01, 2.269e-01, -3.023e-01, -1.756e-01, -7.350e-02)); + r += mul(s4_5, M4(-1.554e-01, 7.256e-02, 1.819e-01, -3.069e-02, -1.896e-01, 8.487e-03, 3.531e-02, 1.163e-02, 9.509e-02, 7.207e-02, 3.051e-02, 1.369e-01, -1.521e-02, -3.002e-02, -1.198e-01, 5.352e-02)); + r += mul(s4_6, M4(1.679e-01, 8.049e-03, 3.098e-02, -3.888e-03, 1.408e-01, -5.948e-02, -4.859e-02, -6.342e-02, 1.652e-01, -5.122e-02, 2.694e-02, -4.236e-03, -7.010e-02, -2.119e-01, -2.484e-02, -1.795e-01)); + r += mul(s4_7, M4(4.459e-02, 9.580e-02, -1.811e-02, 1.641e-01, 7.625e-02, -9.174e-02, -4.983e-02, -1.211e-01, -4.453e-02, -2.507e-03, -6.407e-02, 6.882e-03, -8.679e-03, -2.247e-01, 6.515e-02, 4.370e-03)); + r += mul(s4_8, M4(-4.617e-03, -9.140e-02, 5.284e-03, -5.855e-02, 1.690e-01, -2.470e-02, -2.958e-02, -8.857e-02, 4.823e-02, 1.163e-01, -5.515e-02, 7.202e-02, -3.170e-03, -2.632e-01, -3.346e-02, 2.844e-04)); + r += mul(s5_0, M4(-1.674e-02, 4.465e-02, -1.055e-02, 7.767e-02, -2.578e-04, -9.568e-03, 5.266e-02, -1.918e-02, -1.499e-01, 2.841e-02, 2.862e-02, -7.700e-02, -1.363e-01, 7.312e-02, -2.431e-02, -6.614e-02)); + r += mul(s5_1, M4(-1.206e-01, -1.045e-02, -1.220e-01, 3.041e-02, 1.275e-01, -9.547e-02, 2.891e-02, 1.913e-02, 1.539e-01, 1.372e-01, -3.102e-02, 6.877e-04, -1.430e-01, 1.275e-01, 3.678e-02, 3.973e-02)); + r += mul(s5_2, M4(-9.990e-02, 6.500e-02, 2.164e-02, -3.470e-02, -1.054e-02, 1.669e-02, 6.746e-02, -4.130e-03, -5.044e-02, 8.461e-02, 1.025e-01, -7.755e-02, 2.416e-02, 4.338e-02, 3.518e-02, 5.068e-02)); + r += mul(s5_3, M4(-4.167e-02, 8.291e-02, -2.738e-02, -8.643e-02, -3.288e-01, -9.592e-03, 5.701e-02, 1.109e-01, -7.073e-02, -1.127e-02, 9.348e-03, 1.247e-01, 7.212e-02, -2.192e-02, -1.036e-01, 2.019e-01)); + r += mul(s5_4, M4(1.178e-01, 3.756e-01, 2.588e-01, -1.759e-01, 1.811e-01, -1.029e-01, 2.225e-01, -9.112e-02, -2.861e-01, 3.868e-02, 2.409e-02, 1.286e-01, -4.091e-02, 8.834e-02, 5.362e-01, 1.704e-01)); + r += mul(s5_5, M4(8.134e-02, -8.084e-02, -1.983e-02, 5.903e-02, -7.677e-02, -1.245e-01, -7.246e-01, 2.680e-02, -6.540e-02, 1.478e-01, 6.562e-02, -8.869e-02, -1.622e-02, 8.597e-02, -1.023e-01, 9.386e-02)); + r += mul(s5_6, M4(-7.100e-02, 1.966e-02, 3.316e-03, 1.300e-02, -1.048e-02, 9.209e-02, 1.191e-02, 1.060e-02, -9.255e-02, -1.161e-02, -1.859e-02, 3.663e-02, 3.179e-02, -2.344e-02, -4.789e-02, 5.694e-02)); + r += mul(s5_7, M4(-1.197e-01, 8.330e-02, 7.398e-03, 7.946e-02, 3.528e-02, 3.732e-02, 1.538e-01, -7.668e-02, -2.119e-01, 7.178e-03, -4.201e-03, -7.287e-02, -1.259e-02, -7.504e-02, 1.869e-02, -1.209e-02)); + r += mul(s5_8, M4(-1.196e-01, 1.395e-01, 5.809e-02, 1.249e-01, 2.554e-01, 1.052e-01, -2.597e-01, 5.365e-02, 4.474e-02, 1.310e-01, -1.281e-02, -1.988e-01, -1.366e-03, 5.336e-02, -4.164e-02, -4.151e-02)); + r += mul(s6_0, M4(4.469e-03, 1.737e-02, -1.705e-02, 5.297e-03, 1.855e-01, -8.838e-02, 2.011e-02, -2.865e-02, 3.722e-01, 1.446e-02, 1.195e-01, -8.723e-02, 3.307e-01, 2.032e-01, 4.686e-02, -1.524e-01)); + r += mul(s6_1, M4(1.355e-01, -1.272e-01, -1.107e-02, -4.717e-02, 1.443e-01, -7.464e-02, -1.940e-01, 1.704e-01, 1.906e-01, 5.857e-02, -1.822e-01, 1.136e-01, -2.085e-01, 1.741e-01, 8.393e-02, -9.816e-02)); + r += mul(s6_2, M4(1.483e-01, 1.003e-02, -5.125e-02, 1.980e-01, -4.966e-02, 4.141e-02, 1.500e-01, -1.313e-01, -4.901e-02, 4.779e-02, 1.867e-01, -8.433e-02, -5.538e-02, 6.535e-02, -1.589e-02, 8.818e-02)); + r += mul(s6_3, M4(-2.199e-01, 1.984e-02, 5.543e-02, 2.550e-01, -6.954e-02, -1.127e-01, 1.846e-02, 1.339e-01, 3.304e-01, -7.356e-02, 8.280e-02, -2.870e-01, 1.830e-01, 1.442e-02, -6.192e-02, -4.446e-01)); + r += mul(s6_4, M4(1.546e-01, -1.441e-01, 6.545e-04, -1.750e-01, -6.359e-02, 6.407e-02, -1.872e-01, 1.754e-01, -6.559e-02, -3.563e-01, -2.623e-01, 4.802e-02, -7.486e-02, 2.299e-01, -1.259e-01, -2.384e-01)); + r += mul(s6_5, M4(-1.093e-01, -3.822e-02, -4.077e-01, 1.806e-01, 1.153e-01, -7.748e-02, 8.795e-02, -7.897e-02, -3.800e-01, 8.830e-02, 2.954e-01, 8.917e-02, 8.809e-02, 2.980e-02, 1.702e-01, 3.553e-02)); + r += mul(s6_6, M4(5.084e-02, 1.546e-01, 4.755e-02, -9.203e-02, -1.390e-03, 9.045e-02, 4.932e-02, 4.791e-02, -1.887e-02, 7.416e-03, -2.694e-02, -6.002e-02, 6.272e-02, 4.008e-02, -1.954e-02, -1.398e-01)); + r += mul(s6_7, M4(1.455e-01, 2.552e-01, 2.080e-02, -1.462e-01, 1.691e-01, -6.206e-02, -1.155e-02, -1.095e-01, 1.461e-02, -4.326e-02, 1.744e-02, -9.827e-02, -1.507e-01, 8.395e-02, 2.241e-02, -3.994e-02)); + r += mul(s6_8, M4(1.827e-01, 2.126e-01, -2.834e-02, 1.223e-01, 1.185e-01, -6.990e-02, -5.047e-02, 3.786e-02, -1.499e-01, -4.389e-02, -1.992e-02, 1.044e-01, 7.411e-02, 1.526e-01, 7.076e-02, -1.150e-01)); + r += mul(s7_0, M4(2.013e-02, 2.178e-02, 1.181e-03, -1.664e-02, -5.620e-02, 5.579e-02, 1.369e-02, -5.287e-02, -1.574e-01, 1.091e-01, 1.789e-02, 5.556e-02, 1.153e-01, -9.259e-02, -1.508e-02, 4.501e-02)); + r += mul(s7_1, M4(-5.281e-02, 1.956e-03, 6.077e-02, 1.593e-02, -6.373e-02, 1.553e-01, 1.510e-03, 1.487e-01, -4.906e-02, -3.564e-02, -1.032e-02, 2.023e-01, 1.741e-02, -3.038e-01, 7.891e-02, 3.233e-01)); + r += mul(s7_2, M4(-4.136e-02, 7.703e-02, 1.899e-02, 1.387e-03, -3.422e-03, 1.277e-01, -6.664e-02, -1.432e-02, 1.807e-01, -1.567e-01, -1.541e-02, -5.388e-02, 6.383e-02, 8.804e-03, 1.239e-02, 9.009e-02)); + r += mul(s7_3, M4(-3.707e-02, 1.029e-02, 2.850e-02, 3.530e-02, 9.392e-02, -1.465e-02, 4.523e-02, -1.691e-01, -1.945e-01, 3.733e-02, 1.005e-01, -1.274e-01, -1.351e-01, -1.047e-01, -9.687e-02, -1.313e-01)); + r += mul(s7_4, M4(1.389e-01, -7.439e-02, 1.753e-02, -8.637e-02, 2.850e-03, 2.085e-01, -8.887e-02, -7.542e-02, -4.613e-01, -3.791e-01, -3.039e-02, 7.370e-02, -2.159e-02, -2.957e-02, -1.411e-01, -4.683e-02)); + r += mul(s7_5, M4(1.765e-02, 9.105e-02, -2.574e-01, -9.403e-02, -5.962e-02, -1.298e-01, 2.107e-02, -8.077e-02, 1.534e-01, 4.160e-02, 1.538e-01, 1.304e-03, 8.285e-02, -5.715e-02, 1.655e-01, 1.594e-02)); + r += mul(s7_6, M4(6.028e-02, -1.492e-02, 2.226e-02, 7.234e-02, -1.236e-01, 4.281e-02, 4.460e-02, -3.847e-02, 8.586e-02, 4.478e-03, 3.610e-03, 1.477e-02, 5.615e-02, 1.035e-02, -3.046e-02, 1.156e-01)); + r += mul(s7_7, M4(-1.278e-01, -8.835e-02, -6.829e-03, 1.548e-02, -5.993e-02, -1.321e-01, 5.002e-02, -1.982e-01, -8.825e-02, -1.431e-01, -1.756e-02, -1.548e-01, -8.113e-02, -7.183e-02, 7.995e-03, 1.356e-01)); + r += mul(s7_8, M4(-2.751e-02, 6.631e-03, -1.008e-02, 5.478e-02, 5.620e-02, 6.144e-02, -2.082e-02, -2.847e-02, 9.692e-02, 7.541e-02, 2.322e-02, -7.078e-02, 4.336e-02, -9.761e-02, 1.265e-02, -1.849e-02)); + r += V4(-1.950e-03, -9.835e-03, -5.918e-03, -6.251e-03); + return r; +} + +V4 f1(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(6.175e-02, 7.904e-03, -3.665e-03, -7.399e-02, -7.346e-02, 3.634e-02, -1.192e-01, -1.515e-01, 1.484e-01, 8.720e-03, -1.163e-01, 5.150e-02, -1.065e-02, 1.991e-02, 1.009e-01, -4.675e-03)); + r += mul(s0_1, M4(-6.935e-02, -7.346e-02, 1.201e-02, -1.113e-01, 1.152e-01, 1.159e-01, 4.594e-02, -1.963e-02, -6.518e-02, -1.182e-01, -4.926e-02, 6.986e-02, -1.866e-01, -1.810e-01, -6.166e-02, -8.193e-02)); + r += mul(s0_2, M4(4.910e-02, 1.101e-01, -6.767e-02, 2.115e-02, 7.057e-02, -1.978e-01, 1.134e-01, -7.613e-02, 7.247e-02, 1.279e-01, -5.826e-03, -2.475e-02, -1.172e-01, -2.345e-02, -4.468e-02, -3.181e-02)); + r += mul(s0_3, M4(8.155e-02, 7.672e-02, 1.507e-02, 8.836e-02, -1.557e-01, 8.005e-02, 1.360e-01, -7.389e-03, 4.173e-02, -4.035e-02, -5.395e-02, 1.547e-01, -1.499e-01, -1.392e-01, -2.050e-01, 1.376e-01)); + r += mul(s0_4, M4(2.037e-01, 3.868e-02, -4.294e-01, -1.597e-01, 5.532e-02, 1.920e-01, -2.047e-01, -1.017e-01, 4.292e-02, -9.700e-02, 1.780e-01, -2.914e-01, -1.116e-01, -1.649e-01, -6.510e-02, 3.566e-01)); + r += mul(s0_5, M4(-9.637e-02, -4.248e-02, 5.101e-02, -3.660e-02, 5.758e-02, 1.896e-01, 2.192e-01, 1.228e-01, -9.211e-02, 7.804e-02, -3.575e-02, 7.258e-02, -2.384e-01, -2.825e-01, 8.578e-02, 5.352e-02)); + r += mul(s0_6, M4(5.512e-02, -6.419e-02, -1.067e-01, -5.827e-02, 4.080e-02, -1.957e-02, -1.244e-01, -1.166e-05, 5.461e-02, 3.495e-02, -3.948e-02, 4.974e-02, -7.014e-03, -1.700e-01, -9.444e-02, -3.135e-01)); + r += mul(s0_7, M4(-7.096e-02, 2.266e-01, 1.377e-02, -7.295e-02, -6.385e-02, 7.439e-02, -1.597e-02, -7.386e-02, -8.307e-02, -1.431e-02, -1.351e-02, -9.143e-02, -6.140e-02, -4.966e-02, -1.690e-02, -2.453e-01)); + r += mul(s0_8, M4(6.443e-02, 1.683e-02, -9.873e-02, -5.451e-02, 7.690e-02, 1.760e-01, -1.316e-03, -2.711e-02, -5.968e-02, -5.324e-05, 8.865e-03, -6.855e-02, 1.687e-02, 3.854e-03, 3.375e-02, -3.976e-02)); + r += mul(s1_0, M4(1.615e-01, 7.675e-02, 6.130e-02, -4.256e-03, 9.372e-03, 2.417e-02, -1.267e-02, 3.520e-02, 1.206e-01, 2.362e-01, -3.508e-02, -7.321e-02, -9.689e-03, 9.016e-02, -1.529e-01, 1.355e-01)); + r += mul(s1_1, M4(-1.988e-01, -1.015e-02, 2.393e-01, -1.601e-01, 4.967e-02, -5.905e-02, 1.260e-01, -4.496e-02, -1.891e-01, -3.653e-01, 2.536e-01, 9.012e-02, 1.276e-01, 7.789e-02, -1.061e-01, 5.498e-03)); + r += mul(s1_2, M4(-2.339e-03, 4.687e-02, 1.132e-01, 3.913e-02, -4.598e-02, 4.816e-02, 2.352e-01, 2.179e-03, -1.488e-01, 7.972e-03, 1.557e-01, -6.133e-02, -9.475e-03, 6.294e-03, -5.184e-02, -1.031e-01)); + r += mul(s1_3, M4(1.105e-02, -6.888e-02, 1.064e-01, 3.589e-01, -9.730e-02, -4.418e-02, 5.653e-02, 7.384e-02, 1.762e-01, -3.605e-01, 3.389e-02, 1.859e-01, -1.296e-02, -6.121e-02, -5.948e-02, -1.777e-01)); + r += mul(s1_4, M4(7.330e-02, -8.254e-03, -3.507e-01, 5.515e-02, -1.987e-02, -7.001e-02, -2.392e-01, -2.122e-02, 2.566e-01, -3.824e-01, 2.372e-01, -1.870e-01, 8.637e-02, -4.245e-02, -9.150e-02, 1.525e-01)); + r += mul(s1_5, M4(7.944e-03, -1.674e-01, 2.152e-01, 9.441e-02, -9.459e-02, -9.693e-02, 8.168e-03, 6.529e-02, -8.503e-02, 7.804e-02, -4.030e-02, 1.310e-01, -5.279e-02, -2.527e-01, 1.448e-01, 1.888e-02)); + r += mul(s1_6, M4(-1.401e-01, -5.401e-02, 5.864e-02, 1.263e-01, 1.251e-01, 5.264e-02, -7.004e-02, 2.028e-01, -2.203e-01, 2.476e-01, 2.297e-01, 6.445e-02, -1.481e-02, -9.286e-03, 4.134e-02, -6.499e-02)); + r += mul(s1_7, M4(-2.704e-01, 6.734e-03, 3.892e-02, -6.472e-02, 4.565e-02, -1.986e-01, 6.916e-02, -3.508e-02, -1.698e-01, -8.924e-02, -5.845e-02, -1.234e-01, 3.300e-02, 2.426e-01, -2.275e-02, 3.760e-02)); + r += mul(s1_8, M4(-1.011e-01, -6.674e-03, 6.852e-02, 3.372e-02, -1.279e-02, 1.429e-02, -1.103e-01, 5.372e-02, -4.091e-02, 2.646e-01, 6.331e-02, -2.434e-01, 2.344e-02, 1.366e-01, -1.057e-01, 3.504e-02)); + r += mul(s2_0, M4(-5.324e-02, -3.071e-02, 5.975e-02, -2.922e-02, 8.010e-02, 6.930e-02, 1.457e-01, -6.005e-02, -2.727e-01, 2.198e-03, 3.540e-02, 6.303e-04, -3.038e-02, 1.291e-01, 1.789e-01, -4.896e-02)); + r += mul(s2_1, M4(6.958e-02, 1.246e-01, -2.802e-01, -3.116e-02, 1.069e-01, 3.366e-02, -1.711e-01, -3.527e-02, 1.861e-02, 1.582e-01, -9.334e-02, -5.769e-02, -3.187e-03, -9.438e-04, 3.405e-02, -1.271e-01)); + r += mul(s2_2, M4(2.848e-02, -1.627e-01, 7.388e-02, -5.333e-03, -2.879e-02, -1.583e-01, -4.654e-02, -1.668e-02, -3.003e-02, 1.797e-04, -1.960e-01, -1.396e-01, -9.244e-02, -9.475e-02, 4.937e-02, -8.130e-02)); + r += mul(s2_3, M4(-1.044e-01, -3.147e-02, 3.702e-02, -1.435e-01, 1.565e-01, -2.193e-01, 8.940e-02, 1.489e-01, 7.603e-02, -2.348e-03, 1.507e-01, 2.641e-02, -2.228e-02, 2.442e-02, 1.193e-01, -9.107e-02)); + r += mul(s2_4, M4(-4.541e-02, -1.822e-02, 5.480e-02, 7.376e-02, -1.664e-02, 7.738e-02, 2.179e-01, -9.347e-02, -1.609e-01, -2.437e-01, -3.415e-02, 1.117e-01, -3.191e-01, 5.072e-02, -9.656e-02, -2.812e-01)); + r += mul(s2_5, M4(-7.991e-03, 1.267e-01, 8.988e-02, 7.728e-02, 1.820e-02, 2.832e-01, 1.555e-01, 1.880e-01, 5.675e-02, 1.278e-01, -9.058e-02, 3.068e-02, -1.569e-01, -3.377e-02, -5.649e-02, -2.665e-03)); + r += mul(s2_6, M4(-1.005e-01, 5.469e-02, -6.973e-03, -1.356e-02, -3.452e-02, -1.223e-01, -1.872e-01, 1.028e-01, -9.021e-02, -1.790e-01, -1.233e-01, 2.326e-01, -1.541e-03, 2.155e-01, 2.144e-02, 1.006e-02)); + r += mul(s2_7, M4(-9.650e-03, 6.253e-03, 5.875e-02, -6.425e-02, -9.983e-03, -3.266e-01, -2.351e-01, -7.764e-02, 6.405e-02, -2.074e-01, -4.355e-02, -2.418e-01, -8.434e-02, 2.632e-01, 3.880e-02, -1.288e-02)); + r += mul(s2_8, M4(-1.866e-02, -1.200e-01, 4.102e-02, -7.159e-02, -1.540e-01, -4.532e-02, 2.856e-02, 4.375e-02, 3.164e-02, -1.313e-01, 1.993e-03, -1.613e-01, -1.341e-02, 4.682e-02, -2.229e-02, 1.230e-01)); + r += mul(s3_0, M4(1.488e-02, 9.005e-02, -1.650e-01, 1.927e-01, 4.848e-03, 1.231e-01, 7.445e-02, 5.600e-02, 1.567e-01, -1.090e-02, -8.759e-02, 9.907e-02, 3.108e-02, -1.901e-02, 1.039e-03, 9.998e-02)); + r += mul(s3_1, M4(-3.929e-02, 2.184e-01, 1.619e-01, -9.356e-02, -6.699e-02, 7.045e-02, -4.070e-02, -8.299e-03, 6.922e-02, 1.851e-01, 8.325e-02, -8.713e-03, 2.463e-02, 6.725e-02, -1.198e-01, 8.346e-02)); + r += mul(s3_2, M4(2.297e-01, 4.461e-01, -8.689e-02, 8.217e-02, -3.398e-03, -1.322e-02, 8.756e-02, -1.440e-01, -2.319e-02, 1.481e-01, -1.330e-01, -7.913e-02, -8.133e-02, -1.326e-02, -8.318e-02, 1.419e-01)); + r += mul(s3_3, M4(3.549e-01, 1.413e-01, -1.879e-01, 4.910e-02, 1.367e-02, -1.706e-01, -6.252e-02, -5.629e-03, 2.197e-01, -1.161e-02, -5.096e-02, 1.135e-01, 1.198e-01, 3.848e-02, 7.361e-02, -4.333e-02)); + r += mul(s3_4, M4(3.386e-01, 2.337e-01, -1.768e-01, -1.808e-01, 7.786e-02, -7.506e-03, 8.529e-02, 5.867e-02, -8.106e-03, 1.265e-01, -2.229e-01, 2.138e-02, -2.045e-01, 1.796e-01, -1.054e-02, -8.061e-02)); + r += mul(s3_5, M4(-9.682e-02, 8.621e-03, -1.507e-01, -6.597e-02, -5.754e-02, 5.580e-02, -1.207e-02, 6.156e-02, 4.528e-02, 1.013e-01, 2.147e-02, -1.057e-01, -1.034e-01, -9.300e-03, -6.939e-02, 1.647e-01)); + r += mul(s3_6, M4(3.209e-02, 1.255e-01, -1.737e-02, 7.589e-03, -9.270e-02, 2.263e-02, -1.341e-02, -2.919e-02, -1.460e-02, -1.164e-01, -3.115e-02, -2.339e-01, 7.292e-02, 4.512e-02, -7.044e-03, 5.427e-02)); + r += mul(s3_7, M4(2.959e-01, 2.545e-01, -3.127e-01, -4.098e-02, 9.167e-02, 2.408e-02, -1.048e-01, 2.020e-01, 1.810e-02, 7.126e-02, -3.573e-02, 3.418e-02, 1.661e-01, -1.921e-01, 1.919e-02, 2.044e-01)); + r += mul(s3_8, M4(3.867e-02, 3.393e-02, -1.677e-01, 2.496e-01, -2.441e-04, 1.317e-02, -1.696e-02, -1.264e-01, 7.009e-02, 5.613e-02, -7.472e-02, 7.745e-02, -1.621e-02, -1.794e-01, -3.901e-01, 1.637e-01)); + r += mul(s4_0, M4(-1.428e-01, -1.089e-01, -3.830e-02, 1.444e-02, 1.623e-02, -9.268e-02, -1.500e-01, 4.216e-02, 3.939e-02, -4.109e-02, 1.220e-02, 4.494e-03, -6.716e-02, -8.483e-02, -1.629e-01, 5.165e-03)); + r += mul(s4_1, M4(-4.999e-02, 7.906e-02, -2.173e-01, 8.715e-02, -2.991e-02, -4.797e-02, 5.975e-02, 1.296e-01, 7.575e-02, -6.238e-02, 1.654e-02, 3.190e-02, -7.018e-02, -1.173e-01, 1.215e-04, 1.444e-02)); + r += mul(s4_2, M4(-9.951e-02, -2.135e-01, -6.087e-02, 6.044e-03, 1.522e-01, 7.643e-02, 2.089e-01, 7.293e-02, 6.425e-02, -3.798e-02, 1.156e-01, 8.501e-03, -1.260e-02, 2.014e-02, 3.734e-02, 5.496e-02)); + r += mul(s4_3, M4(3.064e-02, -4.301e-02, -5.276e-02, 9.839e-02, 1.045e-01, 1.096e-01, -1.898e-01, 2.660e-02, -1.665e-01, 1.566e-02, 1.201e-01, 7.686e-02, 2.139e-01, 2.064e-02, -1.203e-01, 1.569e-01)); + r += mul(s4_4, M4(1.121e-01, 2.903e-02, -4.011e-02, -6.393e-02, 5.334e-02, 1.105e-01, 3.123e-02, 2.782e-01, 1.157e-01, -8.022e-02, -8.132e-02, -2.135e-02, -2.199e-02, 2.053e-02, 9.230e-02, -1.862e-01)); + r += mul(s4_5, M4(-8.481e-02, -1.462e-01, -1.066e-01, 7.641e-02, 5.543e-02, 2.511e-02, 1.210e-01, 7.573e-02, 7.727e-02, 5.993e-02, 1.690e-01, -3.876e-02, -7.304e-02, -1.495e-01, -1.047e-01, -8.634e-02)); + r += mul(s4_6, M4(-1.278e-01, -2.702e-02, -1.215e-01, 5.285e-02, 1.277e-01, -7.058e-02, 4.249e-02, -5.602e-02, -5.366e-02, -8.487e-02, 7.268e-03, -3.483e-02, 2.169e-01, -1.059e-01, 5.655e-02, 1.155e-01)); + r += mul(s4_7, M4(-1.284e-01, -6.037e-02, 2.295e-01, -7.331e-02, -7.732e-02, -8.565e-02, 2.233e-01, 6.804e-02, 3.330e-02, 3.514e-02, 1.514e-01, 5.941e-02, 2.931e-02, 2.716e-02, -2.180e-01, 4.854e-01)); + r += mul(s4_8, M4(-7.057e-02, -8.788e-02, 5.648e-02, -1.189e-01, 9.679e-02, -3.120e-02, -5.615e-02, 1.174e-01, -1.002e-01, -2.512e-02, 1.596e-03, 1.479e-01, -4.285e-02, -1.325e-01, -5.417e-02, 1.184e-01)); + r += mul(s5_0, M4(-7.336e-02, 4.986e-02, -6.978e-02, -1.250e-01, 1.747e-02, -1.301e-01, 8.508e-04, -6.684e-03, 5.767e-02, -2.091e-01, -7.641e-02, 8.003e-03, 1.121e-02, 1.188e-01, 3.061e-02, 5.473e-02)); + r += mul(s5_1, M4(-4.532e-02, -8.673e-02, 1.559e-01, 4.620e-02, 4.773e-02, -1.382e-01, -2.404e-01, -3.637e-02, -1.933e-02, 1.359e-02, -4.025e-01, -5.301e-02, -5.870e-02, -1.347e-01, 9.181e-02, -6.606e-02)); + r += mul(s5_2, M4(8.472e-02, -1.045e-02, -3.147e-03, 1.595e-02, -2.099e-02, 2.361e-02, -1.277e-01, 6.447e-03, 1.178e-01, 2.549e-01, -1.025e-01, 6.712e-02, 3.116e-02, 2.829e-02, 6.850e-02, 4.284e-02)); + r += mul(s5_3, M4(1.353e-01, 1.083e-01, 7.092e-02, 8.925e-02, -1.226e-01, -1.477e-01, 1.308e-01, 7.759e-02, -8.527e-02, 8.495e-02, -3.606e-02, 7.682e-02, 1.057e-01, -4.422e-02, 1.012e-01, -3.112e-02)); + r += mul(s5_4, M4(5.194e-01, 1.127e-01, -1.789e-01, -2.902e-01, -8.033e-02, 2.070e-01, -1.377e-01, 1.797e-01, -9.848e-02, -2.584e-01, -3.094e-01, -3.850e-02, 6.486e-02, -2.379e-02, -7.151e-02, -1.400e-01)); + r += mul(s5_5, M4(1.470e-02, -5.933e-02, 3.310e-01, -2.670e-02, -6.346e-03, 3.447e-01, 6.178e-02, 1.894e-01, 2.137e-01, 4.231e-01, -1.992e-01, -7.742e-02, -1.112e-01, 5.088e-02, 7.837e-02, -1.893e-02)); + r += mul(s5_6, M4(-3.262e-02, -5.235e-02, 2.604e-02, -1.442e-03, -1.549e-01, 1.616e-01, 2.533e-02, 3.798e-02, 2.459e-02, -3.005e-02, -1.046e-01, -1.406e-01, -1.479e-01, 2.075e-01, 1.014e-02, -1.128e-01)); + r += mul(s5_7, M4(-2.366e-02, -9.877e-02, 2.663e-01, -5.407e-02, 3.387e-01, 9.756e-02, 1.765e-02, -8.855e-02, 8.803e-02, -7.577e-02, -7.924e-02, -1.757e-01, 2.251e-01, -8.353e-02, 1.433e-01, -8.220e-02)); + r += mul(s5_8, M4(-9.193e-02, 1.416e-01, -3.479e-02, -1.860e-01, 9.943e-03, -4.209e-01, 2.237e-01, -8.746e-02, 8.944e-03, -4.964e-02, 8.007e-02, -7.402e-02, 2.539e-02, -5.937e-02, -7.718e-02, 6.535e-02)); + r += mul(s6_0, M4(-1.149e-02, 1.336e-01, -2.739e-02, -3.410e-02, 2.509e-01, -5.544e-02, 4.526e-02, 2.260e-02, -9.964e-03, 1.702e-01, -2.814e-01, 1.477e-01, -9.708e-02, -1.924e-02, -1.130e-01, -9.316e-02)); + r += mul(s6_1, M4(1.282e-01, 1.518e-01, 7.988e-02, -2.483e-04, -3.388e-02, 6.106e-03, 8.260e-02, -1.189e-01, 2.677e-01, -1.093e-02, 2.075e-01, -6.567e-03, -2.249e-01, -4.893e-02, 1.156e-01, 5.537e-02)); + r += mul(s6_2, M4(-4.985e-02, 6.145e-03, -7.943e-02, -6.762e-02, 1.689e-03, 8.528e-03, 1.398e-01, 4.994e-02, 1.496e-01, 3.995e-02, -1.541e-01, -2.495e-01, -8.654e-02, 9.015e-02, -1.485e-01, -8.601e-02)); + r += mul(s6_3, M4(-4.579e-02, 1.257e-01, -1.238e-01, -1.227e-01, 1.272e-01, 5.987e-02, 4.823e-02, 1.464e-01, 9.932e-02, 3.692e-02, -1.035e-01, 1.131e-01, -2.758e-01, 9.812e-02, 1.047e-01, 2.907e-02)); + r += mul(s6_4, M4(-2.408e-02, 2.359e-01, 1.678e-01, -2.143e-01, -1.030e-01, 9.555e-02, 9.212e-02, 1.842e-01, 5.318e-01, -1.305e-01, 8.809e-02, -1.592e-01, 8.247e-02, 2.926e-02, -1.886e-01, -1.824e-02)); + r += mul(s6_5, M4(-1.915e-01, 2.335e-02, -2.525e-02, -1.063e-02, 9.678e-02, -6.154e-02, -7.538e-02, -9.964e-02, 1.441e-01, 6.867e-02, -2.635e-01, -3.383e-02, -9.144e-02, -1.622e-01, 1.558e-01, -2.456e-01)); + r += mul(s6_6, M4(-2.307e-01, -5.792e-03, -2.040e-02, -5.944e-02, 1.412e-02, -6.434e-02, 1.781e-01, -1.091e-01, -1.130e-02, -6.017e-02, 6.683e-03, -1.664e-01, -1.574e-01, -2.125e-02, -6.781e-02, -1.266e-01)); + r += mul(s6_7, M4(1.197e-01, 5.015e-01, 6.010e-02, 8.000e-02, 8.383e-02, -8.292e-02, 1.608e-01, -6.668e-02, -6.837e-02, 7.250e-02, -2.721e-01, 2.325e-01, -1.741e-02, 3.360e-02, 2.856e-03, 4.512e-02)); + r += mul(s6_8, M4(-3.674e-02, 2.187e-01, -1.116e-02, 4.427e-02, -1.097e-01, -1.043e-01, 1.155e-01, 4.850e-02, 8.935e-02, 4.684e-02, -8.794e-02, 1.239e-02, -8.093e-02, -2.943e-02, -5.811e-02, 9.012e-02)); + r += mul(s7_0, M4(3.852e-02, -1.208e-01, 5.057e-02, -6.356e-02, -1.381e-02, -9.910e-02, -6.690e-02, -2.560e-01, -1.577e-01, -9.102e-02, 1.005e-01, 4.090e-02, 1.631e-01, -9.212e-03, -1.694e-01, -4.077e-04)); + r += mul(s7_1, M4(5.392e-02, 2.484e-02, 6.332e-02, -7.669e-03, 7.114e-03, 1.714e-01, 2.427e-01, -1.117e-01, -8.476e-02, -2.812e-01, 1.370e-02, -1.133e-02, 3.609e-02, 2.885e-01, 9.425e-02, 1.530e-01)); + r += mul(s7_2, M4(-6.421e-02, -6.706e-02, -3.964e-02, -4.779e-02, -1.862e-02, 1.248e-01, -2.874e-01, -3.995e-02, 7.169e-02, 1.507e-01, 1.772e-01, -2.482e-02, 4.256e-02, -5.777e-02, 4.751e-02, -1.001e-01)); + r += mul(s7_3, M4(-5.318e-02, 3.495e-06, -8.124e-02, 1.093e-01, -1.059e-01, -1.241e-01, -6.011e-02, -5.487e-02, 2.842e-02, -1.128e-01, -7.228e-03, 1.620e-01, 1.305e-01, 7.061e-02, -1.104e-02, 3.548e-02)); + r += mul(s7_4, M4(-2.013e-01, 1.019e-01, 1.301e-01, 3.976e-02, -1.030e-01, 4.746e-02, -3.342e-02, 1.966e-02, -8.156e-02, -2.459e-01, 1.101e-01, -5.803e-01, 7.450e-02, 5.037e-02, -7.837e-02, 2.862e-03)); + r += mul(s7_5, M4(-3.368e-02, -4.640e-02, 1.928e-01, 6.733e-03, 1.056e-01, -1.108e-01, 1.836e-01, -1.951e-03, -9.614e-02, 1.760e-02, 4.410e-01, -1.877e-01, 6.688e-02, -1.423e-01, 1.370e-01, 6.039e-02)); + r += mul(s7_6, M4(1.508e-02, -8.418e-02, 5.578e-02, -3.385e-02, 7.789e-02, -2.398e-02, -9.028e-02, -2.499e-01, -7.129e-03, 1.097e-02, -3.166e-02, 1.110e-01, -4.634e-02, 1.620e-02, 8.152e-02, 2.475e-02)); + r += mul(s7_7, M4(-6.457e-02, -7.338e-02, -1.095e-02, -1.514e-01, 6.464e-02, -1.237e-01, 6.907e-03, -3.423e-01, -1.199e-01, -1.148e-01, -6.688e-02, -4.312e-04, 1.324e-01, -1.295e-01, 1.495e-01, 1.148e-02)); + r += mul(s7_8, M4(-3.264e-02, -8.084e-02, 1.435e-01, 2.666e-03, -9.529e-02, 9.988e-03, -8.879e-02, 6.709e-02, -2.555e-02, -1.776e-01, 2.287e-01, 1.296e-02, -1.190e-02, -7.646e-02, 9.769e-02, 4.489e-02)); + r += V4(-5.217e-03, 3.975e-03, 1.864e-03, 6.483e-03); + return r; +} + +V4 f2(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(8.175e-02, -1.694e-02, -8.569e-02, -5.949e-02, -6.620e-02, -1.900e-01, -1.319e-01, 4.160e-02, 4.001e-02, 3.895e-02, 2.037e-02, -1.075e-01, -8.762e-03, -1.409e-01, 1.355e-01, 5.291e-02)); + r += mul(s0_1, M4(6.718e-03, 3.007e-03, 3.151e-02, 2.068e-01, -8.581e-02, -1.870e-02, -9.235e-02, -4.185e-02, 6.026e-03, 2.650e-02, 7.126e-02, 1.114e-02, 1.412e-01, -1.346e-01, -7.167e-02, -6.741e-02)); + r += mul(s0_2, M4(-1.020e-01, 5.801e-02, -6.347e-02, 4.344e-02, 6.335e-02, -1.528e-01, -5.082e-02, -6.141e-02, -2.859e-02, -1.392e-01, 3.954e-02, -1.084e-01, 7.401e-02, 9.802e-02, 2.179e-01, -3.707e-02)); + r += mul(s0_3, M4(-5.845e-02, -6.849e-02, 1.452e-01, 1.408e-01, -7.707e-02, 1.754e-01, 1.260e-02, 1.368e-02, -7.258e-02, -7.262e-02, 1.172e-01, -9.114e-02, -2.357e-01, 2.814e-01, 3.940e-01, -6.121e-02)); + r += mul(s0_4, M4(-6.395e-02, 2.226e-01, -7.355e-02, 1.557e-01, -3.481e-03, 9.685e-02, -2.766e-01, -2.425e-01, 1.484e-01, 1.361e-01, 3.202e-02, 2.433e-03, 8.253e-03, -1.182e-01, 2.435e-01, 9.558e-02)); + r += mul(s0_5, M4(3.071e-02, -5.864e-02, -7.887e-02, 1.055e-01, -2.783e-01, -1.640e-01, -8.075e-02, -3.597e-02, 1.222e-02, -1.484e-01, -1.331e-01, 1.219e-01, 1.875e-01, -9.749e-02, 8.626e-02, 1.095e-01)); + r += mul(s0_6, M4(-5.163e-03, -1.028e-03, -8.240e-02, 4.871e-02, -8.953e-02, -9.021e-02, -1.815e-02, 1.325e-02, -1.685e-02, -9.949e-02, 7.342e-02, -1.037e-02, 2.025e-01, -9.399e-02, 2.651e-01, -8.776e-03)); + r += mul(s0_7, M4(3.271e-02, -8.339e-02, -7.430e-02, -8.341e-02, 2.406e-02, -1.733e-01, -1.173e-01, -2.147e-02, 8.118e-02, -5.234e-03, -2.090e-02, 1.759e-02, -5.028e-02, -4.672e-02, 2.634e-02, 2.789e-01)); + r += mul(s0_8, M4(-6.788e-02, 6.316e-02, 1.329e-01, 3.159e-02, 1.531e-01, -9.412e-02, 9.037e-02, 6.997e-02, 1.121e-01, 5.133e-03, 6.301e-02, 2.824e-02, 2.527e-02, 3.360e-01, 1.835e-01, -6.276e-02)); + r += mul(s1_0, M4(7.692e-04, -1.298e-01, -8.722e-02, -1.373e-01, -7.525e-02, 3.236e-03, -1.369e-02, -3.295e-02, 8.296e-02, -3.321e-01, 1.751e-01, -8.234e-02, -6.476e-02, -5.886e-02, -4.614e-02, 1.376e-01)); + r += mul(s1_1, M4(3.652e-02, 3.372e-02, 9.810e-02, 6.269e-03, 7.645e-02, 1.129e-01, 2.408e-02, -1.142e-02, 1.517e-01, -2.540e-01, 1.259e-01, -4.302e-02, -1.289e-01, -6.566e-02, -3.015e-01, -9.834e-02)); + r += mul(s1_2, M4(-5.508e-02, 1.215e-01, -1.047e-01, -7.241e-02, 2.695e-02, 8.539e-02, 1.089e-01, -1.456e-02, 1.320e-01, 8.422e-02, -1.003e-01, 4.924e-02, 2.336e-02, -1.863e-02, 2.462e-03, -5.588e-02)); + r += mul(s1_3, M4(-1.951e-01, -1.009e-01, 1.124e-01, -2.740e-02, 1.498e-01, -1.999e-02, 5.868e-03, -9.946e-02, 1.999e-01, -3.002e-01, 3.018e-01, -2.979e-01, -2.358e-02, 4.934e-03, -6.591e-02, -1.072e-01)); + r += mul(s1_4, M4(-3.023e-01, 2.393e-01, -6.489e-02, 1.939e-01, -5.500e-02, -8.528e-02, 4.696e-02, 9.167e-02, 1.327e-01, -2.103e-01, 3.693e-01, 2.747e-01, -4.635e-03, -9.574e-02, -1.332e-01, -2.372e-02)); + r += mul(s1_5, M4(-4.051e-02, -1.101e-01, -1.208e-02, -9.351e-02, 1.126e-01, -2.147e-01, 1.626e-01, -7.501e-02, 5.165e-02, 4.960e-02, -1.825e-01, 2.578e-01, -7.848e-03, -1.683e-02, -1.148e-01, 2.115e-01)); + r += mul(s1_6, M4(8.666e-02, -9.403e-02, 2.449e-02, -1.476e-02, -2.238e-02, 2.431e-01, 5.181e-02, -1.073e-01, 2.711e-01, 9.686e-04, 1.803e-01, -1.269e-02, 1.704e-02, -1.467e-02, 5.393e-02, 3.761e-03)); + r += mul(s1_7, M4(9.757e-02, -5.646e-02, 5.085e-02, -1.721e-01, 2.511e-02, 1.110e-01, -6.198e-02, -9.647e-03, 1.704e-01, -9.128e-02, 3.873e-01, -1.793e-01, -1.634e-02, 3.471e-02, -1.560e-01, -4.559e-02)); + r += mul(s1_8, M4(1.608e-02, -3.813e-02, 1.002e-01, -1.142e-01, 1.281e-02, 8.274e-02, 4.468e-02, 7.662e-02, 1.245e-01, 3.294e-01, 4.836e-02, 9.884e-02, -8.359e-02, -8.662e-02, 4.983e-02, 4.233e-02)); + r += mul(s2_0, M4(1.087e-01, -4.769e-02, 4.811e-02, 1.460e-02, 5.261e-02, -5.656e-02, -6.427e-02, 1.753e-02, -1.460e-02, 2.694e-02, 1.154e-01, 1.164e-02, 3.179e-02, -6.948e-02, -5.754e-02, -5.212e-02)); + r += mul(s2_1, M4(-1.007e-01, -7.738e-04, -2.879e-02, -1.565e-02, 2.736e-01, -1.106e-01, -3.022e-01, 1.108e-01, -1.894e-01, -1.313e-01, 8.509e-02, 5.408e-02, -5.045e-03, 1.082e-02, -3.259e-03, 3.258e-02)); + r += mul(s2_2, M4(1.436e-01, 3.734e-02, 7.259e-02, -2.224e-02, 9.575e-02, -1.723e-01, -5.512e-02, -6.942e-02, 8.918e-02, 1.282e-01, 1.010e-01, -4.529e-02, 2.712e-02, -8.669e-02, 8.110e-02, 4.198e-02)); + r += mul(s2_3, M4(5.501e-02, -8.083e-02, 4.484e-02, -5.572e-02, -2.468e-02, -1.174e-01, 1.079e-01, 9.341e-02, 1.402e-01, 8.040e-02, 5.163e-02, -2.897e-01, 1.123e-01, 7.672e-04, -1.428e-02, -1.394e-02)); + r += mul(s2_4, M4(5.681e-02, 9.800e-03, -2.085e-01, 5.270e-03, -8.993e-02, 1.132e-01, 8.583e-02, 1.973e-01, 3.957e-02, 4.412e-01, -1.045e-01, -5.221e-02, -3.447e-01, -7.384e-02, -1.200e-01, -3.953e-01)); + r += mul(s2_5, M4(-1.139e-02, -8.055e-02, 4.224e-02, 2.346e-02, -7.170e-02, 6.123e-02, -1.175e-01, 1.110e-01, 3.642e-02, -4.370e-01, -1.034e-01, -2.471e-02, 1.901e-01, -1.608e-01, 1.655e-01, 7.686e-02)); + r += mul(s2_6, M4(-1.402e-02, -7.039e-02, -2.052e-02, 7.504e-04, -2.909e-01, -2.023e-01, 3.094e-01, 1.406e-01, -9.770e-02, 6.719e-02, 1.718e-01, -5.942e-02, 5.432e-03, 3.151e-03, 8.278e-04, 2.630e-02)); + r += mul(s2_7, M4(7.474e-02, -8.459e-02, 1.493e-01, 4.954e-02, -1.415e-01, -1.227e-01, 1.662e-01, -1.843e-01, 9.970e-02, -1.265e-01, -6.688e-02, 7.964e-02, -1.391e-01, 7.834e-02, -8.791e-02, 5.538e-02)); + r += mul(s2_8, M4(5.384e-02, 2.338e-01, 1.137e-01, -6.666e-02, 1.326e-01, -2.095e-01, -8.753e-02, -6.168e-02, -7.500e-02, 1.145e-02, -1.898e-02, 6.601e-02, 9.443e-02, 1.106e-01, 2.410e-03, -6.149e-02)); + r += mul(s3_0, M4(1.665e-02, 1.127e-01, -1.350e-01, -1.032e-01, -8.179e-02, 9.332e-02, 1.726e-01, 4.077e-02, -1.100e-01, 3.697e-02, 5.525e-03, 6.523e-02, 2.083e-02, 4.354e-02, -6.635e-02, -4.197e-02)); + r += mul(s3_1, M4(-2.168e-01, -2.338e-01, 3.560e-01, 1.092e-01, -9.485e-03, -2.303e-02, 5.368e-02, 5.366e-02, 1.152e-01, -8.287e-02, 6.032e-02, 2.436e-02, 6.182e-02, 7.975e-02, 7.848e-02, 9.542e-02)); + r += mul(s3_2, M4(-1.242e-01, 3.587e-01, -1.079e-01, 7.291e-02, -5.030e-03, 7.853e-02, -1.000e-01, 1.934e-02, 9.251e-02, -9.404e-02, -1.389e-02, -2.388e-02, 3.480e-02, -3.708e-02, 1.649e-01, -6.239e-02)); + r += mul(s3_3, M4(3.882e-03, -1.262e-02, -3.503e-01, 1.038e-01, 4.361e-02, -1.343e-02, -1.585e-01, 1.887e-02, -6.785e-02, 1.701e-01, 3.468e-02, 1.744e-01, 6.101e-02, 8.358e-02, 1.072e-01, -6.852e-03)); + r += mul(s3_4, M4(3.522e-02, 8.764e-02, 2.818e-01, 4.541e-01, -2.372e-01, 4.611e-02, -1.067e-01, -1.908e-01, -3.359e-01, 2.583e-02, -2.675e-02, 2.571e-01, -2.065e-01, -1.061e-01, -1.042e-01, -9.321e-02)); + r += mul(s3_5, M4(2.322e-01, -1.438e-01, 1.788e-01, 3.579e-02, 6.962e-02, -2.912e-01, -6.591e-02, 5.557e-03, 1.749e-01, -1.945e-02, -6.441e-02, -1.344e-01, 2.166e-01, 2.930e-02, 7.383e-02, 1.014e-01)); + r += mul(s3_6, M4(-2.261e-01, 2.485e-02, -2.500e-01, 1.323e-01, 1.172e-02, -1.858e-01, 2.890e-02, 9.360e-02, 5.834e-02, 2.847e-02, 5.543e-02, 7.950e-02, -5.224e-02, -4.632e-02, -1.439e-01, 1.235e-02)); + r += mul(s3_7, M4(-1.517e-01, 1.218e-01, -1.181e-01, 1.744e-01, -2.539e-02, 7.465e-02, -5.315e-02, -4.634e-02, 1.238e-02, -6.372e-02, -1.333e-01, 3.696e-02, -1.387e-01, 8.102e-02, 1.716e-01, 5.472e-02)); + r += mul(s3_8, M4(-6.559e-02, 2.729e-03, -1.297e-02, -1.486e-01, 6.707e-02, -3.678e-02, -3.943e-02, 4.336e-02, -1.812e-02, 2.694e-01, -3.442e-02, 3.155e-02, 7.208e-02, 7.274e-02, 2.978e-01, -3.940e-02)); + r += mul(s4_0, M4(-3.465e-02, -3.034e-02, 7.630e-02, 1.403e-01, -1.252e-02, 7.796e-02, -5.032e-02, 8.881e-02, 5.965e-03, 1.355e-01, 2.053e-02, -9.148e-02, 8.013e-02, -3.946e-03, 1.344e-01, 8.953e-02)); + r += mul(s4_1, M4(1.583e-01, 3.370e-02, 8.927e-02, 7.169e-02, 2.966e-03, 3.740e-02, 1.197e-01, -1.622e-02, -9.327e-03, -4.305e-02, 6.365e-02, 5.527e-02, 8.257e-02, 1.567e-01, 5.987e-02, 1.150e-01)); + r += mul(s4_2, M4(2.552e-02, 5.595e-02, 1.547e-01, -3.538e-02, -1.693e-01, -6.647e-02, -1.526e-01, -5.070e-02, -1.726e-01, 6.701e-02, -3.221e-02, 1.440e-02, -1.106e-01, 1.239e-01, -3.553e-03, -2.591e-02)); + r += mul(s4_3, M4(-8.017e-02, 4.509e-02, 5.302e-03, -2.601e-03, -1.256e-01, -2.064e-02, 1.372e-01, 1.490e-01, 1.511e-02, -1.598e-01, 8.642e-02, 1.566e-02, 9.403e-02, 1.655e-01, 1.993e-01, -5.423e-03)); + r += mul(s4_4, M4(2.370e-01, -1.393e-02, 8.122e-02, -1.765e-01, -8.387e-03, 2.716e-02, -1.179e-01, 1.011e-03, -5.295e-02, -1.455e-01, -4.660e-02, 3.690e-02, -2.313e-01, 5.659e-03, -2.144e-01, -2.195e-01)); + r += mul(s4_5, M4(-7.810e-02, 1.379e-01, 7.611e-02, -4.972e-02, 7.791e-02, 2.354e-02, 1.488e-01, -5.709e-02, 1.128e-01, 1.971e-01, -3.833e-02, -5.006e-02, -8.859e-02, -1.341e-01, 5.348e-02, 1.773e-01)); + r += mul(s4_6, M4(1.223e-01, -6.146e-02, 4.563e-02, -4.953e-02, 2.958e-02, -3.501e-03, 7.077e-02, -1.045e-01, 8.601e-03, 8.685e-02, 8.424e-02, 9.376e-02, -1.085e-02, 1.768e-01, -1.373e-01, -1.582e-02)); + r += mul(s4_7, M4(1.227e-01, -2.950e-01, -1.184e-01, -4.928e-02, 1.532e-01, -1.195e-02, -1.455e-01, -9.216e-02, -2.379e-01, 3.406e-03, -3.235e-02, 1.262e-01, -1.763e-01, 1.022e-01, 1.341e-01, -1.310e-02)); + r += mul(s4_8, M4(1.543e-02, 6.190e-02, 2.085e-01, 5.636e-02, -1.432e-01, -8.273e-02, -1.181e-01, -1.172e-01, 5.136e-02, -1.107e-01, -2.913e-02, -2.501e-02, 4.145e-03, -1.520e-01, -4.142e-02, 2.424e-01)); + r += mul(s5_0, M4(-2.120e-01, -1.650e-01, 1.832e-03, 1.610e-01, 1.080e-01, -2.009e-02, 2.099e-02, -2.894e-02, 5.138e-02, 1.296e-01, -3.023e-02, -1.079e-01, -6.958e-03, -1.421e-01, -1.021e-01, 6.042e-02)); + r += mul(s5_1, M4(-2.127e-01, -1.592e-01, -1.114e-01, 1.150e-01, 1.399e-01, 1.044e-02, -2.055e-01, -2.212e-01, 3.304e-03, -2.082e-01, 2.292e-02, -3.990e-02, 8.811e-02, 8.488e-02, 2.211e-02, 6.205e-02)); + r += mul(s5_2, M4(-1.944e-01, 1.505e-02, -5.527e-02, -4.706e-02, 4.283e-02, 2.693e-01, 6.356e-02, -6.605e-02, -1.454e-01, 1.435e-01, -9.110e-02, -1.689e-01, -4.769e-02, 1.216e-02, -4.311e-02, -1.373e-01)); + r += mul(s5_3, M4(1.193e-01, 7.729e-02, -1.368e-01, -1.508e-01, -1.828e-02, 2.755e-02, 1.502e-01, -1.052e-01, 2.362e-02, -9.706e-02, 1.241e-01, 2.726e-02, 2.339e-01, 5.539e-02, -2.415e-01, -9.340e-02)); + r += mul(s5_4, M4(7.527e-02, 1.521e-01, 1.750e-01, -2.241e-01, -1.489e-01, -1.223e-01, -1.495e-02, 2.460e-01, 1.867e-01, 9.202e-02, 3.072e-01, -6.468e-02, -8.080e-02, 3.779e-01, -3.739e-02, -3.178e-01)); + r += mul(s5_5, M4(5.583e-02, -1.809e-01, 1.902e-03, 3.495e-02, -1.362e-01, -2.026e-01, -6.797e-02, 7.779e-02, -6.602e-03, -2.163e-01, -1.743e-01, -2.702e-01, 1.207e-01, -2.103e-02, 6.260e-02, 8.788e-02)); + r += mul(s5_6, M4(-5.838e-02, 1.205e-02, 2.150e-04, -7.729e-02, 1.545e-01, 1.068e-02, -1.927e-01, -1.463e-01, -1.943e-01, 3.998e-03, -3.427e-02, 2.359e-01, 1.087e-01, -1.524e-01, -2.440e-02, -7.714e-02)); + r += mul(s5_7, M4(7.689e-03, -1.592e-01, -1.664e-01, 3.732e-02, -1.136e-01, 1.350e-01, -1.804e-01, 1.284e-01, -1.086e-01, 8.763e-02, 2.806e-01, -3.983e-02, -7.330e-02, -6.553e-02, 1.183e-02, -1.207e-01)); + r += mul(s5_8, M4(-7.484e-02, 9.195e-02, 9.746e-02, 1.688e-01, 2.331e-01, 3.554e-01, 9.061e-02, -6.124e-02, 1.140e-01, -2.146e-01, -3.030e-04, -2.512e-01, 2.448e-02, 4.512e-02, 1.486e-02, -6.921e-03)); + r += mul(s6_0, M4(-1.454e-01, -1.499e-01, 9.947e-02, 4.342e-02, -7.904e-02, -1.603e-02, 5.748e-02, -1.114e-01, 6.683e-02, 1.973e-01, -4.840e-02, -9.544e-02, -1.170e-01, -1.969e-01, 1.633e-02, -1.046e-01)); + r += mul(s6_1, M4(6.078e-02, 3.313e-02, -3.110e-01, -8.444e-02, 4.440e-03, -6.000e-02, -1.246e-01, -8.377e-02, -1.621e-01, -2.073e-01, -2.110e-01, -2.681e-01, -2.036e-01, 4.124e-03, 7.424e-02, -8.063e-02)); + r += mul(s6_2, M4(1.763e-01, 1.183e-01, 1.006e-01, 3.332e-02, -1.681e-01, 2.043e-01, 1.328e-01, -3.412e-02, 1.243e-01, -1.779e-02, -9.896e-02, -4.547e-02, -6.308e-02, -2.888e-01, -3.873e-02, -6.873e-02)); + r += mul(s6_3, M4(1.491e-01, -1.762e-01, -3.981e-01, -7.978e-03, -7.435e-02, -5.581e-04, -5.818e-02, 1.080e-01, 6.340e-02, 1.617e-01, 1.582e-02, -9.899e-02, 4.189e-02, -2.024e-01, 5.597e-02, -1.077e-01)); + r += mul(s6_4, M4(-2.062e-01, -1.078e-01, -1.528e-01, -2.963e-01, 3.182e-02, -8.465e-02, -3.658e-01, 8.401e-02, -4.927e-02, -1.083e-01, -6.493e-02, -3.408e-01, 2.211e-01, 1.792e-01, 5.270e-02, -1.743e-01)); + r += mul(s6_5, M4(7.843e-02, -6.175e-02, -2.934e-01, 2.443e-01, -1.198e-01, -1.715e-01, -7.102e-03, 2.675e-02, 6.839e-02, 2.838e-01, -6.958e-02, 4.742e-02, 2.483e-01, -8.091e-03, -6.271e-02, 5.051e-03)); + r += mul(s6_6, M4(4.133e-02, -6.723e-02, -1.961e-02, 2.190e-02, 5.627e-03, -4.316e-02, -3.063e-02, 1.018e-01, -8.854e-02, 8.450e-02, 3.357e-02, 1.446e-01, -1.041e-01, -1.390e-01, 8.766e-02, 8.002e-02)); + r += mul(s6_7, M4(-1.550e-01, 1.802e-01, -3.769e-02, -2.384e-01, 2.138e-02, -1.589e-02, 6.241e-02, 1.630e-01, -4.882e-02, 1.133e-01, -1.028e-01, -4.794e-02, -1.160e-01, 2.888e-01, 1.580e-01, -9.242e-02)); + r += mul(s6_8, M4(8.358e-02, -1.748e-01, -1.645e-01, 2.587e-02, -1.026e-02, 1.733e-01, 1.958e-01, 1.793e-02, -4.920e-02, -6.777e-03, 3.666e-02, 3.048e-02, 1.459e-02, -1.088e-01, 7.087e-02, -1.663e-01)); + r += mul(s7_0, M4(5.895e-02, -4.794e-02, 1.086e-01, -7.724e-02, -5.413e-02, 3.616e-02, -2.307e-01, -4.889e-02, -1.410e-01, -2.301e-02, 8.944e-02, -5.812e-02, 4.765e-02, 2.087e-03, 3.673e-02, -8.790e-02)); + r += mul(s7_1, M4(9.140e-02, 1.553e-01, -7.140e-02, 7.401e-02, -2.839e-01, 2.154e-02, -1.562e-01, 1.315e-01, -1.543e-01, 8.124e-02, 1.522e-01, 4.624e-02, 9.527e-02, 1.319e-01, -1.317e-01, 2.476e-02)); + r += mul(s7_2, M4(7.932e-02, -3.181e-02, 7.362e-02, 5.767e-02, -9.275e-02, -1.133e-01, -8.605e-02, 5.333e-02, 7.329e-02, -1.955e-01, 4.367e-02, -6.820e-02, 4.126e-02, 3.145e-02, -4.424e-02, -4.117e-02)); + r += mul(s7_3, M4(-2.246e-01, -9.220e-02, -7.055e-02, 7.230e-02, 7.646e-04, 6.877e-02, 1.218e-01, 2.049e-01, -2.007e-01, -9.204e-02, -6.821e-03, 2.486e-03, -2.154e-01, 6.851e-02, 2.000e-01, -1.530e-01)); + r += mul(s7_4, M4(-1.474e-01, 1.235e-01, 1.286e-01, -8.364e-02, 3.537e-01, -2.301e-01, 7.560e-02, -1.851e-01, 2.242e-01, -1.849e-01, 2.154e-01, 2.809e-01, 1.367e-02, 1.298e-01, -1.446e-01, 2.667e-01)); + r += mul(s7_5, M4(-6.607e-04, 1.046e-01, -2.800e-02, 1.565e-01, 7.318e-02, -1.494e-01, -6.101e-02, -1.297e-01, 5.198e-02, 1.059e-01, 1.264e-01, -2.130e-02, -1.369e-01, -1.306e-01, 1.246e-02, 1.328e-01)); + r += mul(s7_6, M4(1.957e-02, 5.465e-02, 7.663e-02, 3.571e-02, 2.113e-02, 6.583e-02, 7.021e-03, 2.210e-01, -6.460e-02, -1.017e-01, 7.844e-02, -5.866e-02, 5.942e-02, -1.024e-01, -7.892e-02, -1.215e-02)); + r += mul(s7_7, M4(6.379e-02, 2.692e-02, 3.743e-02, 1.136e-01, 7.757e-02, 2.353e-02, 5.736e-02, 1.397e-01, 1.707e-02, -3.405e-02, 1.132e-02, -3.412e-02, 1.058e-01, -2.043e-02, -1.351e-01, 8.975e-02)); + r += mul(s7_8, M4(3.588e-02, 4.297e-02, 4.129e-02, -1.757e-02, 6.987e-02, -7.156e-02, -2.011e-02, -2.481e-02, -3.291e-03, -5.477e-02, 4.980e-02, -1.382e-01, 9.755e-02, 5.748e-02, 1.447e-01, -4.677e-02)); + r += V4(-5.067e-03, 2.460e-02, -2.325e-02, 1.200e-02); + return r; +} + +V4 f3(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(5.937e-02, -2.293e-02, 4.463e-02, 1.063e-01, 4.986e-02, -1.206e-01, 3.787e-02, -2.935e-02, -2.059e-02, -1.142e-01, 2.708e-02, 6.391e-02, -6.658e-02, 6.910e-02, 4.432e-02, -9.706e-03)); + r += mul(s0_1, M4(8.342e-02, 9.988e-02, -8.872e-02, -1.077e-01, 8.941e-02, -6.181e-02, 2.197e-01, -1.389e-01, -7.792e-02, 1.116e-02, 2.648e-02, 1.142e-01, -5.875e-02, 1.048e-01, -2.993e-01, 1.287e-01)); + r += mul(s0_2, M4(8.515e-03, -6.301e-02, -3.246e-02, -7.302e-02, -4.694e-02, -5.162e-02, 3.283e-02, 1.284e-01, 3.292e-02, 3.917e-03, 4.455e-04, 3.902e-02, 1.077e-01, 7.922e-02, 7.547e-02, 1.984e-01)); + r += mul(s0_3, M4(5.984e-02, -1.123e-01, 5.092e-03, 7.493e-02, 8.852e-03, 1.073e-01, -4.862e-04, -1.227e-01, 6.467e-02, 2.370e-01, 2.201e-02, 4.920e-02, 1.976e-02, 2.423e-01, 8.258e-02, -2.042e-01)); + r += mul(s0_4, M4(1.104e-01, -1.184e-02, 4.333e-02, 1.280e-01, -9.092e-02, 4.953e-03, 5.800e-02, -2.968e-02, 1.006e-01, 2.226e-01, 6.584e-02, -3.137e-01, 3.614e-02, -1.852e-01, 8.170e-02, -3.669e-02)); + r += mul(s0_5, M4(9.177e-03, 3.203e-02, 1.440e-01, -1.248e-01, 3.477e-02, -3.008e-03, -5.599e-02, 9.376e-02, -4.932e-02, -2.787e-02, 5.835e-02, -1.218e-01, 2.021e-02, -1.881e-01, -2.538e-02, -2.028e-01)); + r += mul(s0_6, M4(1.072e-01, 2.250e-01, 5.476e-02, 6.869e-02, -6.962e-02, 7.225e-02, 5.069e-02, 5.585e-04, -1.927e-02, -1.290e-01, -3.297e-03, 7.809e-02, 1.727e-01, -1.283e-01, 6.731e-03, 1.033e-01)); + r += mul(s0_7, M4(4.805e-02, 2.181e-02, 9.102e-02, -1.635e-01, -3.383e-02, 4.860e-02, -7.892e-02, 1.356e-02, -4.804e-02, 1.178e-01, 3.489e-02, 1.040e-02, 4.216e-02, 2.385e-02, 1.314e-02, -9.646e-02)); + r += mul(s0_8, M4(4.335e-02, -2.793e-04, 1.483e-02, 3.358e-02, 3.870e-03, -7.282e-02, -4.608e-02, 1.967e-01, -9.398e-02, -1.592e-03, 5.984e-02, -5.951e-02, -6.416e-02, 4.254e-02, -1.406e-02, -6.531e-02)); + r += mul(s1_0, M4(-6.368e-02, -5.346e-02, -1.291e-01, 6.706e-02, -6.380e-03, 5.830e-02, 1.084e-01, 1.159e-01, -4.290e-02, -2.932e-01, -1.320e-01, 3.104e-01, -5.508e-02, -5.885e-02, 1.250e-01, -6.253e-02)); + r += mul(s1_1, M4(-5.418e-02, 9.444e-02, -1.881e-01, -7.574e-02, 1.423e-02, -2.660e-02, 5.467e-02, -7.591e-02, -5.805e-02, 3.760e-01, 1.647e-01, -1.093e-02, -9.242e-02, -4.123e-02, 8.769e-02, -4.475e-02)); + r += mul(s1_2, M4(-4.797e-02, -4.127e-02, -7.547e-02, -8.719e-02, -6.771e-02, 3.789e-02, 3.921e-02, -1.768e-02, 3.238e-02, 1.440e-01, 6.898e-02, -7.619e-02, 2.587e-02, -2.627e-02, -8.274e-02, -7.502e-02)); + r += mul(s1_3, M4(-1.377e-01, 1.457e-02, -1.122e-03, 8.004e-03, 4.097e-02, -5.827e-02, -2.435e-02, -1.067e-01, -5.614e-02, 3.039e-01, -2.157e-01, 1.790e-02, -6.650e-02, 4.609e-02, -1.470e-02, 8.873e-02)); + r += mul(s1_4, M4(3.185e-02, -8.179e-02, -3.400e-03, 6.147e-02, -5.562e-02, -2.330e-02, -1.119e-01, 3.381e-02, 1.271e-01, 7.784e-01, 8.042e-02, -7.207e-01, -1.046e-02, -9.352e-02, -7.585e-02, 8.128e-02)); + r += mul(s1_5, M4(-1.194e-01, -3.287e-03, -3.034e-02, 9.041e-03, 3.797e-02, -4.496e-02, -5.645e-02, 1.959e-01, -7.990e-02, -1.278e-01, -1.153e-01, 3.814e-02, -4.159e-02, 1.539e-01, 9.543e-02, 4.509e-03)); + r += mul(s1_6, M4(-4.600e-02, 9.363e-02, 1.716e-02, -1.629e-02, -8.715e-02, 1.116e-01, 1.500e-02, -4.391e-02, 5.248e-02, -2.408e-01, 2.500e-02, -1.324e-01, 3.408e-02, -6.700e-02, -6.231e-02, 1.441e-01)); + r += mul(s1_7, M4(6.006e-02, -5.199e-02, 7.669e-02, -3.729e-02, 9.547e-02, -1.554e-01, -8.385e-02, 3.733e-02, -7.727e-02, 3.808e-03, 8.038e-02, 1.458e-01, -7.448e-02, 2.456e-01, 8.873e-02, 2.466e-02)); + r += mul(s1_8, M4(-6.046e-02, 5.374e-02, -4.915e-02, -1.280e-02, 4.251e-02, -2.449e-02, -1.484e-02, -6.294e-02, -1.233e-01, -1.737e-01, 1.045e-01, -7.113e-02, -4.748e-02, 9.857e-02, 3.051e-02, 7.290e-02)); + r += mul(s2_0, M4(3.988e-02, 1.215e-01, 2.073e-02, 8.147e-02, -1.999e-01, -9.151e-02, 7.208e-02, 7.089e-02, -1.319e-01, -9.644e-02, -6.533e-02, -2.290e-01, -1.754e-02, 1.557e-02, 1.087e-01, -3.825e-02)); + r += mul(s2_1, M4(3.377e-02, 8.423e-02, 1.295e-01, -5.479e-02, 3.646e-03, 9.721e-03, -9.836e-02, 3.895e-02, -1.662e-01, 5.533e-02, -4.808e-01, -6.657e-02, 2.083e-02, -4.455e-02, -3.605e-02, -5.959e-02)); + r += mul(s2_2, M4(2.542e-02, -1.808e-01, -9.664e-02, 2.839e-02, -1.618e-01, -1.337e-01, -1.843e-02, 1.430e-01, 2.806e-02, 1.548e-02, 9.068e-02, -7.111e-03, 1.574e-02, -5.401e-02, -1.237e-01, 1.971e-01)); + r += mul(s2_3, M4(5.944e-03, 2.828e-02, 4.389e-03, 1.235e-01, -8.884e-02, 1.212e-01, 2.049e-01, 1.114e-01, -6.525e-02, 1.918e-01, 2.489e-01, 2.571e-01, 2.687e-02, 1.020e-01, 1.152e-01, 6.966e-02)); + r += mul(s2_4, M4(4.975e-02, 9.571e-02, 6.714e-02, -5.031e-02, 5.163e-03, 1.960e-01, -2.494e-01, 2.110e-02, 1.925e-01, 8.133e-02, -1.473e-02, 2.836e-01, 1.063e-01, -3.164e-01, 8.172e-02, 1.662e-02)); + r += mul(s2_5, M4(-2.252e-02, -1.249e-01, -6.242e-02, 9.623e-02, -7.664e-03, -7.865e-02, -4.791e-02, 1.493e-02, -5.184e-02, -1.797e-01, -1.056e-01, 9.278e-03, 5.084e-02, 7.665e-03, -4.054e-02, 1.255e-01)); + r += mul(s2_6, M4(3.234e-02, -6.118e-02, -1.704e-02, -3.087e-02, 1.263e-01, 2.389e-01, 7.382e-02, 9.601e-02, 5.484e-02, -6.373e-02, -1.740e-02, -1.325e-01, -4.036e-02, -8.706e-02, -2.694e-02, -6.775e-03)); + r += mul(s2_7, M4(2.323e-02, -2.030e-01, 1.767e-02, -4.558e-02, -1.615e-01, 9.983e-02, 9.543e-02, 6.072e-03, 1.758e-01, -1.039e-01, -1.035e-01, 7.006e-02, -8.250e-02, -5.464e-02, 8.563e-02, -1.959e-01)); + r += mul(s2_8, M4(2.464e-02, 6.963e-02, 1.998e-02, -2.792e-02, 1.232e-02, -1.589e-01, 2.308e-01, -9.732e-02, 6.288e-02, -2.257e-01, 6.418e-02, -4.960e-02, -1.244e-01, -7.443e-03, -1.028e-01, 6.149e-02)); + r += mul(s3_0, M4(-6.824e-02, 6.319e-02, 2.871e-02, -1.192e-02, -6.657e-02, 8.899e-02, 7.591e-03, -9.148e-02, 7.225e-02, -1.377e-01, -1.220e-01, 4.634e-02, 2.185e-02, 5.536e-02, -4.606e-02, -5.407e-02)); + r += mul(s3_1, M4(-8.597e-02, 6.928e-02, 1.251e-01, 5.169e-03, 2.121e-02, 7.393e-02, -7.205e-03, -1.571e-01, -1.590e-01, -2.689e-02, 9.329e-02, 6.116e-03, -7.495e-02, -6.854e-02, -4.035e-02, -1.580e-03)); + r += mul(s3_2, M4(4.135e-02, 1.288e-01, -3.735e-01, -2.938e-01, 3.338e-03, -3.670e-02, 2.704e-02, -2.551e-02, -4.303e-03, -4.822e-02, 1.012e-01, -2.797e-02, -9.120e-03, 3.496e-02, -1.207e-01, 5.322e-02)); + r += mul(s3_3, M4(-2.273e-02, 7.031e-03, -2.290e-01, 5.618e-02, -3.347e-02, 7.457e-02, 1.635e-01, 7.182e-02, 2.456e-01, 1.405e-02, -1.609e-01, 4.749e-02, 4.866e-03, -6.041e-02, -5.774e-02, -3.683e-02)); + r += mul(s3_4, M4(4.012e-02, -2.310e-01, -1.690e-01, 1.429e-01, -1.200e-02, 5.024e-04, -9.359e-02, -1.916e-02, 1.757e-01, 1.968e-02, -1.216e-02, 1.541e-01, 8.348e-02, -4.863e-02, 3.573e-02, -2.066e-03)); + r += mul(s3_5, M4(-6.490e-02, 3.889e-01, 5.566e-02, 2.052e-01, 1.422e-02, -1.181e-01, -6.391e-02, 1.733e-01, -1.568e-02, 2.046e-01, -1.073e-02, -7.929e-03, 1.964e-02, -6.834e-02, 1.291e-01, -1.093e-01)); + r += mul(s3_6, M4(-7.826e-02, -6.393e-02, -4.312e-02, -5.907e-02, -1.805e-02, 3.583e-02, 4.076e-02, 4.257e-03, 1.829e-02, 4.131e-02, -4.771e-02, 4.777e-02, -1.655e-01, 4.371e-02, -2.452e-02, -3.887e-03)); + r += mul(s3_7, M4(9.980e-02, 4.313e-02, -6.232e-02, 1.371e-02, -6.087e-02, 5.576e-04, -3.771e-02, -1.848e-02, 1.194e-01, 5.277e-02, -7.765e-03, -1.474e-02, -1.705e-01, 6.577e-02, -4.634e-02, -8.420e-02)); + r += mul(s3_8, M4(7.784e-02, -4.871e-02, 3.519e-02, -1.021e-01, 9.847e-02, -7.194e-02, 7.018e-02, 2.838e-02, -1.022e-01, 7.930e-02, 9.779e-03, 9.524e-02, -5.524e-02, -1.703e-01, 1.328e-02, -4.709e-02)); + r += mul(s4_0, M4(6.635e-02, 1.713e-01, 6.315e-04, -5.086e-02, 1.460e-02, 6.128e-02, -4.817e-02, -1.842e-03, 3.093e-02, 6.817e-02, 1.114e-01, -6.893e-02, 4.283e-02, 1.032e-01, -5.799e-02, -1.508e-01)); + r += mul(s4_1, M4(3.042e-02, 1.621e-01, 2.273e-01, 1.352e-02, 2.633e-02, -1.172e-01, -1.457e-01, 5.422e-02, 6.442e-02, -2.030e-01, 2.280e-01, -7.099e-02, -1.303e-02, 7.623e-02, -2.583e-01, -1.344e-01)); + r += mul(s4_2, M4(-3.789e-02, -2.870e-02, 4.769e-02, -3.381e-02, -2.221e-02, -8.522e-02, -2.436e-01, -3.402e-02, 8.091e-02, 5.432e-02, -6.819e-02, 2.341e-02, -3.246e-02, 6.236e-02, 2.118e-02, -1.794e-01)); + r += mul(s4_3, M4(6.806e-02, -6.803e-02, -2.788e-02, 1.043e-01, 9.637e-02, -1.210e-01, -3.798e-02, -6.496e-02, -3.167e-02, 4.748e-02, 5.062e-02, 1.399e-01, 2.309e-02, -1.467e-02, -3.349e-01, -3.838e-01)); + r += mul(s4_4, M4(-8.276e-02, 3.518e-02, -2.816e-02, -1.163e-01, 1.189e-01, 2.213e-01, 2.881e-01, 8.944e-02, 1.077e-01, 5.187e-02, 6.710e-02, -2.642e-02, 4.845e-03, 2.246e-01, 1.476e-01, 1.532e-01)); + r += mul(s4_5, M4(3.816e-02, -9.649e-02, 7.975e-02, -1.843e-01, -5.197e-02, -6.506e-02, 6.936e-02, -1.033e-01, 1.675e-01, 5.399e-03, 8.398e-02, 6.698e-02, 2.103e-02, -1.023e-02, -2.291e-02, 6.593e-02)); + r += mul(s4_6, M4(-2.078e-02, 4.519e-02, -4.727e-02, -4.325e-02, 8.269e-02, -1.692e-01, -1.491e-03, -1.700e-02, 3.600e-02, -6.412e-02, 8.008e-03, -7.571e-02, -3.149e-02, -1.032e-01, 1.922e-02, -1.210e-01)); + r += mul(s4_7, M4(1.219e-01, -7.195e-02, 3.661e-02, 1.487e-01, -9.657e-02, 1.968e-01, -3.820e-02, 1.134e-01, 2.622e-02, -3.342e-03, 9.060e-02, 7.066e-02, -2.124e-02, 2.729e-01, 6.725e-02, -1.748e-01)); + r += mul(s4_8, M4(6.273e-02, -1.209e-01, 7.117e-02, 2.641e-02, 2.375e-01, 1.264e-01, 2.762e-01, -2.528e-01, 2.499e-02, 6.918e-02, 1.109e-01, -5.336e-02, -3.088e-02, -1.585e-01, -1.852e-03, 9.760e-02)); + r += mul(s5_0, M4(1.189e-01, -1.113e-01, 2.007e-01, -1.077e-01, -1.777e-04, 8.058e-02, 2.036e-02, 5.560e-02, 8.056e-04, 1.197e-01, 2.565e-02, 1.867e-01, 2.823e-02, 2.924e-02, 2.840e-01, 7.127e-02)); + r += mul(s5_1, M4(-2.611e-03, 1.372e-01, -2.056e-01, -9.923e-03, -4.385e-03, -1.626e-01, -8.826e-02, 3.440e-02, -7.744e-02, 4.044e-02, 1.851e-01, 2.742e-01, 1.524e-02, 4.314e-03, 2.586e-02, 4.220e-02)); + r += mul(s5_2, M4(-5.841e-02, -3.703e-02, -1.729e-01, -1.789e-01, 5.015e-02, 3.310e-02, -5.206e-02, 8.799e-02, -5.436e-02, -2.004e-01, 6.269e-02, -1.548e-01, 5.159e-03, -3.037e-02, 3.914e-03, 1.735e-02)); + r += mul(s5_3, M4(4.642e-02, 1.776e-02, 2.240e-02, 1.530e-01, -1.358e-02, -1.500e-01, -5.521e-02, -3.159e-02, -5.773e-02, -9.288e-02, -1.132e-01, 8.716e-02, 3.616e-02, 7.593e-02, 8.513e-02, 1.642e-01)); + r += mul(s5_4, M4(-3.231e-02, 9.385e-02, 3.161e-02, -9.241e-02, 1.490e-01, 5.756e-02, -6.718e-03, -1.243e-01, -5.694e-02, -3.817e-02, -1.343e-01, 4.011e-01, 6.475e-02, -8.970e-02, 2.720e-01, -8.860e-02)); + r += mul(s5_5, M4(9.055e-04, -1.747e-01, 7.801e-02, 3.477e-01, 7.295e-02, -7.419e-03, -2.549e-01, 2.997e-01, 2.373e-03, -1.371e-01, -1.807e-01, -1.003e-01, -6.018e-02, -8.462e-03, -3.585e-02, 8.651e-02)); + r += mul(s5_6, M4(-4.387e-02, -1.482e-01, 4.883e-02, -7.088e-02, -4.485e-02, 1.373e-01, 3.773e-02, -3.221e-02, -5.640e-02, -5.259e-02, 5.393e-03, -2.579e-03, -2.197e-01, -8.668e-02, -7.545e-03, 8.670e-02)); + r += mul(s5_7, M4(-4.584e-02, -3.105e-02, -4.795e-02, 7.210e-02, -5.926e-02, -2.145e-01, -8.820e-02, 7.103e-02, 7.993e-02, -1.930e-01, -1.305e-01, 8.054e-02, -1.110e-01, -1.978e-01, -8.814e-02, -4.387e-02)); + r += mul(s5_8, M4(1.532e-01, -6.750e-02, 2.989e-04, -2.344e-02, -9.692e-02, -6.528e-02, 2.085e-01, 1.146e-01, -1.238e-01, -8.914e-02, -7.088e-02, 7.841e-02, -2.884e-02, 1.230e-01, -4.543e-02, -1.687e-02)); + r += mul(s6_0, M4(3.081e-03, 2.668e-02, 3.257e-02, 9.723e-02, 5.252e-02, 2.582e-02, -5.727e-02, -9.103e-02, -7.886e-02, -1.317e-01, 4.829e-02, -5.289e-02, -7.629e-02, -3.883e-02, 9.692e-02, -2.103e-02)); + r += mul(s6_1, M4(2.955e-03, 6.440e-02, -2.578e-01, -1.746e-01, -4.254e-02, -1.108e-02, 1.443e-01, 1.771e-01, -1.395e-01, -3.343e-01, 6.528e-02, -1.191e-01, -9.412e-02, 1.384e-01, 8.339e-02, -1.644e-01)); + r += mul(s6_2, M4(2.409e-02, -8.311e-02, -1.283e-01, -3.643e-03, 5.327e-02, 1.244e-01, -8.937e-02, -1.428e-01, 1.809e-02, -3.257e-02, -2.078e-02, 1.377e-01, -1.504e-01, -6.163e-02, -1.606e-01, -1.277e-01)); + r += mul(s6_3, M4(-1.773e-01, -2.236e-01, 1.885e-01, 9.712e-03, -1.424e-01, 3.719e-02, -9.438e-02, -8.754e-02, -1.713e-01, -1.251e-01, -1.434e-01, 8.788e-02, -1.422e-01, -8.237e-02, 7.846e-02, -5.479e-02)); + r += mul(s6_4, M4(-3.731e-02, -1.801e-01, -1.077e-01, 1.602e-03, 3.596e-03, -1.675e-01, -1.324e-02, 1.178e-01, -7.492e-01, -5.005e-02, -1.284e-01, -2.411e-01, -1.177e-01, 4.184e-02, 1.022e-01, -1.371e-02)); + r += mul(s6_5, M4(-6.394e-02, 5.309e-02, -2.414e-02, 2.214e-01, -2.043e-02, 9.590e-04, -3.341e-03, -8.743e-02, -2.566e-02, 1.464e-01, -1.183e-01, 1.416e-01, -1.272e-01, -8.216e-02, 1.574e-01, 1.021e-01)); + r += mul(s6_6, M4(-2.556e-01, 4.513e-01, 1.047e-01, 1.659e-01, -5.061e-02, -3.856e-02, 9.099e-03, 1.066e-01, 9.161e-03, 2.961e-02, -4.449e-02, 2.394e-02, -7.822e-02, 3.447e-02, 5.728e-02, -7.670e-02)); + r += mul(s6_7, M4(7.941e-02, 7.430e-02, 2.056e-02, -2.944e-03, -1.515e-02, 2.618e-02, 5.338e-02, 9.276e-02, -9.431e-02, 2.459e-02, 4.625e-02, -5.752e-02, -2.353e-01, -4.392e-02, 1.227e-01, -1.196e-01)); + r += mul(s6_8, M4(-1.129e-01, 1.712e-01, -6.834e-02, 3.321e-01, 4.220e-02, 8.974e-02, -2.602e-03, -5.431e-02, -1.216e-02, 1.084e-02, -8.162e-02, 1.976e-01, -4.058e-02, 1.933e-01, 6.706e-02, -7.726e-02)); + r += mul(s7_0, M4(5.551e-02, -3.296e-02, -2.882e-02, 5.526e-02, 2.951e-02, -1.036e-01, -1.112e-01, -8.518e-02, 1.286e-01, 7.652e-02, 1.076e-01, -7.867e-02, 3.029e-02, -8.501e-02, 1.274e-01, -1.497e-02)); + r += mul(s7_1, M4(5.751e-02, -1.738e-02, -7.516e-02, 1.059e-01, -6.178e-02, -1.163e-01, 1.264e-01, -1.363e-01, 1.472e-01, 9.282e-02, 4.998e-01, 2.662e-01, 4.779e-02, 5.058e-02, -5.293e-01, -4.943e-02)); + r += mul(s7_2, M4(-1.004e-02, -2.006e-02, 3.513e-02, 8.537e-02, -3.947e-02, -2.097e-02, -1.330e-01, -1.661e-01, 6.878e-02, -1.212e-01, 1.790e-01, 1.831e-01, -5.628e-02, 1.959e-03, 2.541e-01, 2.014e-02)); + r += mul(s7_3, M4(1.014e-02, 8.258e-02, -5.835e-02, 2.635e-03, -8.298e-03, -8.856e-02, -3.623e-02, -1.395e-02, 1.996e-01, 1.699e-01, 4.473e-02, -2.008e-02, 8.142e-02, 1.458e-01, 9.426e-02, -1.071e-01)); + r += mul(s7_4, M4(-3.228e-02, -1.110e-01, 1.505e-02, -6.655e-02, 7.545e-02, -1.883e-01, -1.282e-01, -3.508e-03, -2.321e-02, -3.186e-02, 2.323e-01, -1.491e-01, 2.796e-01, 6.684e-02, 3.796e-02, 1.500e-01)); + r += mul(s7_5, M4(1.068e-02, -1.265e-01, -1.353e-01, -9.899e-02, 4.629e-02, -1.067e-01, 1.070e-01, 9.997e-02, -3.634e-02, -1.548e-01, 1.127e-01, -3.369e-01, -8.821e-02, 1.451e-02, -6.364e-02, -2.183e-01)); + r += mul(s7_6, M4(2.495e-03, -6.878e-02, -3.258e-02, -5.085e-02, 7.895e-02, -7.889e-02, -4.088e-02, 1.297e-01, 5.189e-02, 9.643e-02, -1.326e-02, -2.523e-02, -5.041e-03, -7.283e-02, 1.669e-02, 1.419e-02)); + r += mul(s7_7, M4(1.606e-01, -1.207e-01, 5.464e-02, 2.323e-02, 6.808e-02, 1.081e-01, 4.238e-02, -6.394e-02, 4.764e-02, -7.067e-02, 4.302e-02, -5.596e-02, -6.000e-02, -2.220e-01, -3.503e-02, 9.465e-02)); + r += mul(s7_8, M4(9.846e-03, 1.402e-01, -1.452e-02, -7.531e-02, 6.204e-02, 1.329e-01, 1.072e-02, -2.937e-02, 3.163e-02, 1.031e-01, -1.080e-03, -1.216e-01, -6.041e-03, -2.592e-02, -7.239e-03, -7.482e-02)); + r += V4(2.168e-02, -1.996e-02, -1.898e-02, 1.578e-02); + return r; +} + +void Pass4(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = Rmp8x8(tid.x) + blockStart; + uint2 size = GetInputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = (gxy + 0.5) * pt; + + V4 s0_0 = l0(-1.0, -1.0); + V4 s0_1 = l0(0.0, -1.0); + V4 s0_2 = l0(1.0, -1.0); + V4 s0_3 = l0(-1.0, 0.0); + V4 s0_4 = l0(0.0, 0.0); + V4 s0_5 = l0(1.0, 0.0); + V4 s0_6 = l0(-1.0, 1.0); + V4 s0_7 = l0(0.0, 1.0); + V4 s0_8 = l0(1.0, 1.0); + V4 s1_0 = -max(-s0_0, 0.0); + V4 s1_1 = -max(-s0_1, 0.0); + V4 s1_2 = -max(-s0_2, 0.0); + V4 s1_3 = -max(-s0_3, 0.0); + V4 s1_4 = -max(-s0_4, 0.0); + V4 s1_5 = -max(-s0_5, 0.0); + V4 s1_6 = -max(-s0_6, 0.0); + V4 s1_7 = -max(-s0_7, 0.0); + V4 s1_8 = -max(-s0_8, 0.0); + s0_0 = max(s0_0, 0.0); + s0_1 = max(s0_1, 0.0); + s0_2 = max(s0_2, 0.0); + s0_3 = max(s0_3, 0.0); + s0_4 = max(s0_4, 0.0); + s0_5 = max(s0_5, 0.0); + s0_6 = max(s0_6, 0.0); + s0_7 = max(s0_7, 0.0); + s0_8 = max(s0_8, 0.0); + + V4 s2_0 = l1(-1.0, -1.0); + V4 s2_1 = l1(0.0, -1.0); + V4 s2_2 = l1(1.0, -1.0); + V4 s2_3 = l1(-1.0, 0.0); + V4 s2_4 = l1(0.0, 0.0); + V4 s2_5 = l1(1.0, 0.0); + V4 s2_6 = l1(-1.0, 1.0); + V4 s2_7 = l1(0.0, 1.0); + V4 s2_8 = l1(1.0, 1.0); + V4 s3_0 = -max(-s2_0, 0.0); + V4 s3_1 = -max(-s2_1, 0.0); + V4 s3_2 = -max(-s2_2, 0.0); + V4 s3_3 = -max(-s2_3, 0.0); + V4 s3_4 = -max(-s2_4, 0.0); + V4 s3_5 = -max(-s2_5, 0.0); + V4 s3_6 = -max(-s2_6, 0.0); + V4 s3_7 = -max(-s2_7, 0.0); + V4 s3_8 = -max(-s2_8, 0.0); + s2_0 = max(s2_0, 0.0); + s2_1 = max(s2_1, 0.0); + s2_2 = max(s2_2, 0.0); + s2_3 = max(s2_3, 0.0); + s2_4 = max(s2_4, 0.0); + s2_5 = max(s2_5, 0.0); + s2_6 = max(s2_6, 0.0); + s2_7 = max(s2_7, 0.0); + s2_8 = max(s2_8, 0.0); + + V4 s4_0 = l2(-1.0, -1.0); + V4 s4_1 = l2(0.0, -1.0); + V4 s4_2 = l2(1.0, -1.0); + V4 s4_3 = l2(-1.0, 0.0); + V4 s4_4 = l2(0.0, 0.0); + V4 s4_5 = l2(1.0, 0.0); + V4 s4_6 = l2(-1.0, 1.0); + V4 s4_7 = l2(0.0, 1.0); + V4 s4_8 = l2(1.0, 1.0); + V4 s5_0 = -max(-s4_0, 0.0); + V4 s5_1 = -max(-s4_1, 0.0); + V4 s5_2 = -max(-s4_2, 0.0); + V4 s5_3 = -max(-s4_3, 0.0); + V4 s5_4 = -max(-s4_4, 0.0); + V4 s5_5 = -max(-s4_5, 0.0); + V4 s5_6 = -max(-s4_6, 0.0); + V4 s5_7 = -max(-s4_7, 0.0); + V4 s5_8 = -max(-s4_8, 0.0); + s4_0 = max(s4_0, 0.0); + s4_1 = max(s4_1, 0.0); + s4_2 = max(s4_2, 0.0); + s4_3 = max(s4_3, 0.0); + s4_4 = max(s4_4, 0.0); + s4_5 = max(s4_5, 0.0); + s4_6 = max(s4_6, 0.0); + s4_7 = max(s4_7, 0.0); + s4_8 = max(s4_8, 0.0); + + V4 s6_0 = l3(-1.0, -1.0); + V4 s6_1 = l3(0.0, -1.0); + V4 s6_2 = l3(1.0, -1.0); + V4 s6_3 = l3(-1.0, 0.0); + V4 s6_4 = l3(0.0, 0.0); + V4 s6_5 = l3(1.0, 0.0); + V4 s6_6 = l3(-1.0, 1.0); + V4 s6_7 = l3(0.0, 1.0); + V4 s6_8 = l3(1.0, 1.0); + V4 s7_0 = -max(-s6_0, 0.0); + V4 s7_1 = -max(-s6_1, 0.0); + V4 s7_2 = -max(-s6_2, 0.0); + V4 s7_3 = -max(-s6_3, 0.0); + V4 s7_4 = -max(-s6_4, 0.0); + V4 s7_5 = -max(-s6_5, 0.0); + V4 s7_6 = -max(-s6_6, 0.0); + V4 s7_7 = -max(-s6_7, 0.0); + V4 s7_8 = -max(-s6_8, 0.0); + s6_0 = max(s6_0, 0.0); + s6_1 = max(s6_1, 0.0); + s6_2 = max(s6_2, 0.0); + s6_3 = max(s6_3, 0.0); + s6_4 = max(s6_4, 0.0); + s6_5 = max(s6_5, 0.0); + s6_6 = max(s6_6, 0.0); + s6_7 = max(s6_7, 0.0); + s6_8 = max(s6_8, 0.0); + + t4[gxy] = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t5[gxy] = f1(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t6[gxy] = f2(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t7[gxy] = f3(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); +} + +//!PASS 5 +//!DESC conv4 +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 +//!IN t4, t5, t6, t7 +//!OUT t0, t1, t2, t3 + +#define l0(x, y) V4(O(t4, float2(x, y))) +#define l1(x, y) V4(O(t5, float2(x, y))) +#define l2(x, y) V4(O(t6, float2(x, y))) +#define l3(x, y) V4(O(t7, float2(x, y))) + +V4 f0(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(3.786e-02, -3.112e-02, 2.629e-02, 2.290e-02, 4.508e-02, -3.219e-02, -8.563e-02, -1.302e-01, -1.291e-02, 2.642e-02, 1.880e-01, 5.598e-02, -4.183e-02, 1.934e-02, 4.311e-02, -2.900e-02)); + r += mul(s0_1, M4(1.442e-02, 4.047e-02, -6.616e-02, 3.778e-02, -7.813e-02, -6.908e-02, -7.353e-02, -3.166e-02, -1.249e-01, 2.744e-02, -2.803e-02, 1.487e-02, 9.480e-02, -5.564e-02, -3.953e-02, -3.077e-01)); + r += mul(s0_2, M4(-1.819e-01, 4.849e-04, 8.099e-02, -8.160e-02, 2.268e-01, -5.019e-02, -2.439e-01, 1.967e-02, -1.063e-01, 9.971e-02, -2.644e-02, 6.571e-02, 1.156e-01, -1.429e-01, 1.537e-02, 1.328e-03)); + r += mul(s0_3, M4(1.714e-01, -1.112e-02, -3.325e-02, 1.182e-01, 1.532e-02, -4.505e-02, -5.494e-02, 1.101e-01, 4.073e-01, 3.473e-02, 9.761e-02, 3.505e-01, -8.731e-02, -7.174e-02, -2.050e-01, 1.128e-01)); + r += mul(s0_4, M4(4.445e-02, -3.808e-02, 5.439e-02, 3.406e-02, 5.838e-02, 3.611e-02, 6.767e-02, 7.023e-02, -4.706e-03, -3.040e-02, -1.740e-02, -6.775e-02, -2.607e-01, 6.729e-03, 8.469e-02, -1.808e-02)); + r += mul(s0_5, M4(1.413e-03, 4.123e-02, -4.701e-02, 9.418e-02, -3.279e-02, -2.479e-02, -2.107e-01, 1.633e-01, 9.501e-02, 8.430e-02, 4.720e-02, -1.022e-01, -1.958e-01, -1.459e-02, 2.013e-02, -5.798e-02)); + r += mul(s0_6, M4(3.062e-02, -7.145e-02, -7.975e-02, 6.689e-02, -2.102e-02, 4.818e-02, -3.446e-02, -2.829e-02, 1.792e-01, 7.161e-03, -1.020e-01, -6.972e-02, -6.039e-02, 7.220e-03, -5.098e-03, 4.861e-02)); + r += mul(s0_7, M4(6.546e-02, 1.474e-02, 9.940e-02, 3.281e-02, -4.283e-02, 7.346e-02, -3.103e-02, -1.691e-02, -5.183e-02, -1.116e-02, 1.681e-02, -1.291e-01, -4.107e-03, 6.317e-02, 1.915e-01, -2.165e-01)); + r += mul(s0_8, M4(-9.153e-02, -6.225e-02, 6.091e-02, 7.788e-03, 3.638e-03, -6.062e-04, -4.613e-02, 2.878e-02, 1.371e-02, 5.369e-02, 4.774e-02, 7.444e-03, -8.460e-02, 1.729e-02, 4.011e-02, 4.154e-03)); + r += mul(s1_0, M4(9.022e-02, -1.628e-02, 1.448e-01, -1.261e-02, 1.103e-01, -1.530e-02, 2.661e-01, 1.835e-01, -2.674e-02, 2.139e-02, 2.871e-02, 1.505e-01, -4.545e-02, 7.065e-04, -1.055e-01, -1.179e-01)); + r += mul(s1_1, M4(1.442e-01, -5.332e-02, -2.574e-01, 1.344e-02, 2.326e-01, -4.114e-02, -2.524e-01, 6.122e-02, 2.069e-01, -1.513e-01, -1.736e-01, -1.241e-02, -3.533e-03, 5.831e-02, 4.833e-03, 5.475e-02)); + r += mul(s1_2, M4(1.091e-01, -8.201e-02, 1.823e-02, -3.055e-02, -5.081e-02, -7.545e-02, -1.518e-01, 2.404e-02, 3.938e-02, -2.439e-02, -2.380e-02, 1.095e-01, -6.177e-02, 9.110e-02, 4.643e-02, 7.123e-02)); + r += mul(s1_3, M4(-1.171e-01, 5.602e-02, 1.115e-01, 4.051e-02, -6.017e-02, 9.896e-03, 6.392e-02, -2.940e-02, -3.572e-01, 7.977e-02, -8.511e-02, 9.054e-02, 7.819e-02, -8.478e-02, -6.579e-02, 8.911e-02)); + r += mul(s1_4, M4(9.697e-02, -1.022e-01, -2.703e-01, -1.566e-01, -1.255e-01, -1.421e-01, -3.423e-01, 9.287e-02, -2.351e-01, -5.762e-01, 5.198e-02, -2.300e-01, -2.060e-01, -5.823e-02, -1.229e-01, 1.165e-01)); + r += mul(s1_5, M4(1.825e-01, 7.774e-02, -1.016e-01, -2.725e-02, -7.310e-02, 6.078e-02, 2.814e-01, 1.973e-02, 9.262e-02, -1.498e-01, -2.977e-02, -1.005e-01, -4.163e-02, -6.892e-02, -4.553e-02, -1.923e-02)); + r += mul(s1_6, M4(-8.986e-02, -2.023e-02, -5.516e-03, 8.968e-02, 8.664e-02, -4.974e-02, -1.499e-01, 7.626e-02, 6.857e-02, -4.699e-02, 1.069e-01, -6.722e-02, 6.621e-02, -3.576e-02, -2.946e-02, 7.705e-02)); + r += mul(s1_7, M4(-1.015e-02, -2.559e-02, -8.076e-02, 1.014e-01, 5.824e-02, 1.264e-01, 8.622e-03, 7.740e-02, -1.513e-01, -1.809e-01, -2.511e-02, -1.863e-01, 9.051e-02, 5.982e-02, 1.576e-01, 2.685e-03)); + r += mul(s1_8, M4(8.626e-02, 2.226e-02, 1.986e-01, 1.037e-01, 1.898e-01, 2.340e-02, 1.760e-01, 4.621e-02, 3.388e-02, -3.321e-02, -1.556e-02, 1.179e-01, -7.777e-02, -1.524e-02, 9.254e-02, 6.025e-02)); + r += mul(s2_0, M4(3.083e-02, 3.455e-02, 7.274e-02, -3.024e-01, -9.245e-02, -1.497e-02, -2.403e-02, -1.094e-01, 6.849e-03, 2.399e-02, -6.319e-02, 1.405e-01, -5.364e-02, 6.548e-02, 6.240e-02, -2.531e-03)); + r += mul(s2_1, M4(-1.212e-01, 5.625e-04, -3.083e-01, -1.114e-01, -5.217e-03, 1.887e-02, 2.076e-01, -1.734e-02, -1.215e-01, 5.826e-02, -2.346e-02, 1.103e-01, -1.194e-01, -5.841e-02, -1.227e-02, -2.174e-02)); + r += mul(s2_2, M4(-3.621e-02, -7.684e-02, -9.088e-04, 1.813e-02, -1.315e-01, -2.461e-04, 1.060e-03, 3.393e-03, -7.380e-02, 1.814e-02, -2.801e-01, 1.468e-01, 1.288e-01, -4.260e-02, -1.871e-02, -5.461e-02)); + r += mul(s2_3, M4(5.318e-02, 6.631e-03, -9.817e-02, -2.529e-01, 2.421e-02, 2.086e-02, 3.605e-02, 8.178e-02, 4.743e-02, 9.302e-02, 4.339e-02, -7.637e-02, -2.042e-01, -9.427e-03, -4.775e-02, -1.017e-01)); + r += mul(s2_4, M4(-1.250e-01, -5.397e-02, -6.126e-02, -1.112e-01, 9.591e-02, 1.181e-01, -2.184e-01, 4.689e-02, 3.767e-01, -1.545e-01, -4.446e-02, 2.062e-01, -9.482e-02, 6.146e-03, -3.114e-01, -1.503e-01)); + r += mul(s2_5, M4(-2.206e-01, -5.046e-02, -4.007e-02, -4.498e-02, -1.744e-01, -3.015e-02, -4.830e-02, 1.551e-03, 1.089e-01, 4.379e-02, -4.175e-02, -5.496e-02, -1.987e-02, -4.003e-02, 2.631e-02, 1.678e-03)); + r += mul(s2_6, M4(5.501e-02, -2.809e-03, -3.428e-02, 1.954e-02, -1.177e-02, -1.439e-02, 1.093e-01, -1.743e-01, 1.530e-01, -1.372e-01, -3.701e-01, -1.271e-01, -1.260e-02, 4.581e-02, 4.199e-02, -2.764e-02)); + r += mul(s2_7, M4(-2.162e-02, -2.844e-04, 1.154e-01, -8.801e-02, -1.666e-01, -1.124e-01, -1.474e-01, -1.242e-02, 2.482e-01, 1.539e-01, -1.349e-02, -8.576e-02, 1.625e-03, 7.734e-02, -3.190e-02, -1.014e-01)); + r += mul(s2_8, M4(-8.863e-02, 6.740e-02, 2.618e-02, 6.910e-02, 8.198e-03, -6.465e-02, 8.453e-02, -1.630e-01, 1.622e-01, -3.858e-02, -3.013e-02, 7.943e-02, 5.486e-02, 1.231e-02, 5.551e-02, 1.091e-01)); + r += mul(s3_0, M4(-4.926e-02, -5.191e-03, 4.592e-03, 2.580e-03, -5.176e-02, 2.099e-02, -7.537e-02, -5.804e-04, 5.594e-03, 1.473e-02, 1.102e-01, -4.678e-02, 1.494e-01, -2.218e-02, 2.460e-02, -5.700e-02)); + r += mul(s3_1, M4(-8.926e-02, -5.994e-02, -9.126e-03, 5.391e-02, 1.378e-01, 1.110e-02, -3.565e-02, -1.239e-01, -8.361e-02, 7.913e-02, -1.435e-02, -7.187e-03, -1.193e-02, 1.499e-01, -4.087e-03, 1.375e-01)); + r += mul(s3_2, M4(-1.276e-01, 4.709e-02, 4.652e-02, -3.621e-02, 6.574e-02, -9.898e-02, -7.531e-02, 1.525e-02, -6.954e-02, -3.843e-02, 5.811e-02, 1.199e-02, 8.230e-02, 2.024e-01, 3.189e-02, -4.189e-03)); + r += mul(s3_3, M4(-8.962e-02, 2.121e-02, 6.877e-03, 4.628e-02, -6.696e-02, -1.758e-02, 6.365e-02, 1.147e-01, 1.634e-01, -8.616e-02, -1.130e-01, -3.855e-02, 1.976e-01, -4.414e-02, -2.729e-02, 1.943e-01)); + r += mul(s3_4, M4(1.419e-01, -1.145e-01, 7.334e-02, 3.357e-02, 1.087e-01, 6.161e-02, -4.461e-02, -8.577e-02, 1.379e-01, 5.960e-02, 7.210e-02, 9.497e-02, 9.145e-02, 2.237e-01, -2.762e-02, 1.797e-02)); + r += mul(s3_5, M4(-1.733e-01, -1.167e-01, 5.172e-02, -8.973e-02, -3.348e-02, 1.052e-01, -5.964e-03, -2.220e-02, -1.058e-01, 4.942e-02, 2.739e-02, 2.404e-02, 1.421e-01, 1.827e-01, 1.569e-01, -1.539e-01)); + r += mul(s3_6, M4(2.506e-02, 1.950e-02, 2.321e-03, -4.077e-02, 1.772e-01, -7.419e-02, 9.891e-02, 2.252e-01, -2.654e-02, 1.410e-02, 7.146e-02, -2.953e-02, 8.560e-02, 2.365e-02, -4.493e-03, -1.049e-01)); + r += mul(s3_7, M4(-6.964e-02, 7.567e-02, 1.144e-01, -1.584e-01, 9.097e-02, 1.047e-01, 2.855e-02, 1.349e-01, -1.304e-01, 4.699e-02, 8.094e-02, 2.085e-02, 2.096e-02, -2.421e-03, 8.454e-03, -9.203e-02)); + r += mul(s3_8, M4(-3.464e-02, -4.869e-02, 3.778e-03, 1.347e-01, 3.872e-02, -2.634e-02, -1.421e-01, -7.913e-02, -1.429e-03, -1.537e-02, -8.353e-03, 4.449e-02, -4.023e-03, 8.170e-02, 1.893e-01, 1.227e-01)); + r += mul(s4_0, M4(4.691e-02, 6.286e-02, 6.771e-02, -1.503e-01, -1.064e-02, 5.082e-03, 9.837e-02, -9.486e-02, 1.464e-02, -2.707e-02, -6.510e-02, -2.803e-03, 6.008e-02, 9.668e-03, 7.732e-02, -2.190e-01)); + r += mul(s4_1, M4(4.686e-02, -5.499e-02, 1.427e-02, 1.013e-01, -8.526e-02, 6.392e-02, -2.287e-02, 8.515e-03, -5.218e-02, -4.427e-02, 9.739e-02, -1.362e-01, -3.744e-03, -6.457e-02, -1.491e-01, -1.083e-01)); + r += mul(s4_2, M4(1.916e-02, -6.114e-02, 5.091e-02, 5.791e-02, -1.167e-01, 2.778e-02, 3.416e-02, 5.700e-02, 8.694e-02, -2.474e-02, -6.353e-02, -4.257e-02, 2.920e-02, -8.550e-02, -2.982e-02, -8.382e-03)); + r += mul(s4_3, M4(1.841e-02, -1.143e-02, -3.103e-03, -1.753e-01, 7.652e-02, 1.885e-02, -1.299e-02, 3.879e-02, 3.357e-02, -8.420e-04, -4.729e-02, 7.755e-02, 1.938e-02, 6.921e-02, 4.764e-02, -2.407e-01)); + r += mul(s4_4, M4(3.810e-03, 1.434e-01, -4.722e-02, 1.589e-01, -3.296e-02, -6.644e-02, -2.176e-02, 8.273e-02, -4.930e-02, 5.519e-04, 3.101e-02, -6.996e-03, -2.028e-01, 1.508e-01, -1.391e-01, -9.957e-02)); + r += mul(s4_5, M4(-8.341e-03, -1.784e-01, 6.608e-02, 1.683e-02, -3.243e-02, 2.721e-02, -2.764e-02, 1.793e-01, -1.665e-01, -4.042e-02, -1.725e-01, -4.332e-02, -2.139e-02, -3.609e-02, -1.666e-01, -8.603e-03)); + r += mul(s4_6, M4(8.658e-02, 3.472e-03, 1.808e-02, 4.573e-02, 3.757e-03, -2.061e-02, -2.943e-02, 7.366e-02, -2.444e-02, -4.287e-02, 7.998e-02, -1.348e-01, 1.004e-01, -3.994e-02, 1.171e-01, 7.248e-02)); + r += mul(s4_7, M4(1.384e-02, -4.799e-03, 6.849e-02, -4.029e-02, -5.857e-02, -4.379e-02, 7.338e-02, 1.482e-02, -2.001e-01, -2.230e-02, -6.334e-02, 2.028e-01, -6.983e-02, 6.961e-02, -1.304e-01, 9.270e-02)); + r += mul(s4_8, M4(-1.824e-02, -3.640e-02, -7.442e-02, 9.155e-02, 2.034e-02, -4.918e-03, -7.245e-02, 2.484e-02, 1.855e-01, -6.453e-03, -1.036e-01, -7.459e-02, 5.481e-02, -2.091e-02, 1.651e-01, 6.029e-02)); + r += mul(s5_0, M4(-8.622e-02, 3.879e-02, 3.278e-02, -9.564e-02, 1.094e-01, 5.871e-02, 8.887e-02, -1.808e-01, 2.255e-02, -3.330e-02, -3.161e-02, -5.811e-02, 1.091e-01, -5.190e-03, 1.022e-01, -8.137e-02)); + r += mul(s5_1, M4(7.586e-02, -6.875e-02, -6.969e-02, 2.362e-01, 2.035e-01, -8.574e-02, -1.608e-01, -2.036e-01, -1.019e-01, -4.419e-02, -4.203e-02, 7.364e-02, 2.055e-02, -2.850e-02, 1.823e-03, 3.981e-03)); + r += mul(s5_2, M4(1.079e-02, -1.865e-02, -1.433e-02, 8.257e-02, 1.680e-01, -5.562e-02, 8.500e-02, -1.274e-01, -2.049e-02, -4.915e-02, 6.383e-02, -6.182e-03, -1.959e-02, 2.753e-02, -1.664e-02, 4.208e-02)); + r += mul(s5_3, M4(-3.978e-02, -4.015e-02, -2.950e-02, -2.059e-01, 9.038e-02, 1.546e-02, -1.041e-01, -1.511e-02, 1.272e-02, 2.335e-02, -1.798e-02, 3.744e-02, 6.389e-02, 7.648e-02, -1.019e-01, -2.651e-02)); + r += mul(s5_4, M4(-6.980e-02, 2.744e-02, -4.570e-02, 1.148e-01, 1.342e-02, -4.770e-02, -8.229e-02, 6.089e-02, 3.118e-02, 2.920e-01, 3.167e-01, -1.521e-01, 5.399e-02, 1.020e-01, 1.149e-02, -8.619e-02)); + r += mul(s5_5, M4(3.253e-02, -2.127e-01, -3.972e-02, 3.569e-03, 4.084e-02, 6.521e-02, -9.020e-02, 2.094e-02, -9.394e-02, -1.544e-02, -4.392e-02, -1.579e-01, -8.755e-02, -5.974e-02, -4.310e-02, 7.993e-02)); + r += mul(s5_6, M4(-9.472e-02, 4.516e-02, -8.202e-02, -4.753e-02, 1.139e-01, -3.746e-02, 2.098e-03, -1.064e-01, 9.612e-02, -2.597e-02, 1.139e-01, 9.148e-03, 1.091e-01, -2.330e-02, -7.269e-02, 1.313e-01)); + r += mul(s5_7, M4(-1.524e-01, 3.063e-02, -1.198e-01, 1.550e-01, -3.171e-02, -5.483e-02, -4.361e-02, -6.489e-02, -1.526e-01, 6.543e-02, -6.782e-02, 1.009e-01, -1.401e-02, 1.156e-01, -2.638e-02, -2.473e-02)); + r += mul(s5_8, M4(1.049e-02, 6.141e-02, 7.195e-04, 5.764e-02, 3.226e-02, 1.319e-02, -1.031e-01, -1.945e-02, -7.885e-02, -3.438e-02, -9.568e-02, 5.990e-02, 1.148e-02, 5.140e-02, 2.240e-01, 6.594e-03)); + r += mul(s6_0, M4(1.406e-01, -2.602e-02, 1.205e-01, 2.176e-01, -1.926e-04, -5.914e-02, -5.769e-02, 1.209e-01, 6.493e-03, -3.487e-02, -3.463e-02, -7.879e-02, -2.138e-01, 1.331e-02, 4.086e-02, 4.241e-02)); + r += mul(s6_1, M4(2.871e-02, 3.683e-02, 7.109e-02, 1.031e-01, 5.881e-02, 6.017e-03, -2.555e-01, 6.659e-02, -4.397e-03, 8.779e-02, 2.377e-02, -9.669e-02, -1.420e-01, 1.134e-01, -1.499e-01, 1.266e-01)); + r += mul(s6_2, M4(1.369e-01, -1.154e-01, -1.666e-01, 5.584e-02, -1.002e-01, -6.546e-03, 1.571e-02, 1.530e-01, -1.969e-03, 2.545e-02, -6.619e-02, -6.586e-02, -1.282e-01, 7.008e-02, 9.567e-03, 1.252e-01)); + r += mul(s6_3, M4(-1.094e-01, 1.610e-02, 9.718e-02, 1.548e-01, 9.198e-02, -4.904e-02, -7.468e-04, 2.606e-01, 5.387e-03, 4.550e-02, 3.330e-02, -7.607e-02, 8.492e-02, -8.416e-02, -8.928e-02, 1.261e-01)); + r += mul(s6_4, M4(1.180e-01, 3.047e-02, -3.698e-01, -5.206e-02, 2.965e-02, 6.208e-02, -6.801e-02, 7.428e-02, 4.247e-02, -9.038e-03, 7.127e-03, -1.259e-01, -7.449e-02, -1.251e-01, -2.252e-01, -5.215e-02)); + r += mul(s6_5, M4(-1.766e-01, 1.002e-01, 2.354e-01, -1.658e-01, 1.370e-01, -4.224e-02, -6.316e-02, 2.053e-01, -1.863e-01, 7.560e-02, -1.606e-02, 8.289e-02, 2.111e-01, 8.929e-02, 1.141e-01, 1.075e-01)); + r += mul(s6_6, M4(6.023e-02, 5.537e-02, 8.805e-02, -1.834e-01, 8.324e-02, -9.879e-03, -3.770e-02, 1.114e-01, 2.186e-01, 3.151e-02, 2.377e-02, -9.786e-02, 5.232e-02, 2.238e-02, 1.318e-01, 4.875e-02)); + r += mul(s6_7, M4(8.652e-02, 2.481e-03, 2.506e-02, -5.165e-02, 8.771e-02, 9.404e-03, 4.192e-02, -5.653e-02, 3.218e-01, 1.354e-02, 8.510e-02, 8.392e-02, -6.334e-02, 7.593e-03, 1.150e-01, 4.606e-02)); + r += mul(s6_8, M4(-6.697e-02, -3.352e-02, -1.902e-02, -8.258e-02, -6.843e-02, -2.708e-02, 7.777e-02, 1.236e-01, 1.371e-02, 3.588e-02, -5.964e-02, 2.603e-04, 1.174e-01, 1.747e-02, -8.251e-02, 4.398e-02)); + r += mul(s7_0, M4(-2.168e-02, 7.199e-02, -5.631e-02, 1.383e-01, 1.324e-02, -4.067e-02, -1.283e-02, 6.363e-02, 2.488e-02, -6.017e-02, 3.009e-02, 1.336e-01, -2.399e-02, 5.897e-02, 8.480e-03, -4.747e-02)); + r += mul(s7_1, M4(1.093e-01, 7.825e-03, 3.643e-02, 4.922e-02, 7.785e-03, 7.618e-02, -4.316e-02, -1.097e-01, 6.528e-02, -7.597e-02, 1.538e-01, 3.378e-02, 1.036e-02, 1.740e-02, -1.892e-01, 2.236e-02)); + r += mul(s7_2, M4(2.499e-01, 1.734e-01, 1.939e-01, -1.016e-01, -2.700e-02, -1.218e-02, 1.330e-01, -4.832e-02, 7.202e-02, -3.737e-03, 7.867e-02, -1.434e-02, 1.819e-02, -1.655e-01, -1.782e-01, -3.900e-02)); + r += mul(s7_3, M4(5.788e-02, -1.806e-02, 4.414e-02, -6.338e-02, -4.268e-02, -3.505e-02, 5.591e-02, -2.530e-02, -4.892e-03, 2.751e-02, 1.689e-02, 1.906e-02, 2.026e-01, 5.643e-02, 1.002e-01, 1.098e-02)); + r += mul(s7_4, M4(-2.294e-02, -4.774e-02, 2.901e-01, 6.578e-02, -1.541e-01, 1.067e-01, 3.197e-01, -5.122e-02, 2.727e-02, -9.901e-02, -2.789e-02, -1.267e-01, -5.750e-02, 4.390e-02, -1.721e-01, -1.499e-01)); + r += mul(s7_5, M4(-9.402e-02, -2.030e-02, 5.222e-02, -1.743e-01, -4.580e-02, -3.926e-02, 2.109e-01, 5.317e-02, 8.321e-02, -3.145e-02, -1.214e-02, 1.857e-01, -3.654e-02, 2.986e-02, 2.944e-03, 8.246e-03)); + r += mul(s7_6, M4(-1.619e-01, 4.667e-02, -4.234e-02, -2.656e-02, -1.973e-02, 6.608e-02, 5.465e-02, -1.520e-01, 1.372e-02, -1.880e-03, 1.187e-01, 1.466e-01, 4.376e-02, 5.925e-03, 3.483e-02, -8.434e-02)); + r += mul(s7_7, M4(8.179e-02, -6.455e-02, 1.127e-01, -1.037e-01, -2.037e-01, 1.271e-01, 2.132e-01, -1.660e-01, -1.013e-01, 7.165e-03, 3.201e-03, -7.004e-02, -1.350e-01, -8.418e-02, -9.617e-04, -1.091e-02)); + r += mul(s7_8, M4(-1.502e-01, 2.698e-02, -2.027e-01, 2.748e-02, -1.763e-01, -6.399e-02, -4.648e-02, -1.599e-02, 4.186e-02, -3.419e-02, -1.255e-02, 1.214e-01, 6.660e-02, -2.269e-02, -3.588e-02, -2.921e-02)); + r += V4(-3.017e-03, -2.179e-03, -9.947e-04, -1.717e-02); + return r; +} + +V4 f1(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-3.068e-04, -1.204e-01, 4.292e-02, -2.322e-01, 7.263e-02, -6.732e-02, -2.801e-02, 9.964e-03, -6.590e-03, 2.334e-02, 6.538e-02, -3.565e-01, 2.108e-02, -1.036e-01, 6.134e-02, 1.382e-01)); + r += mul(s0_1, M4(-5.029e-02, -7.275e-02, 5.063e-02, -1.110e-02, 4.380e-02, 4.034e-02, -1.042e-01, -1.455e-02, 1.055e-02, 3.170e-02, -1.554e-02, -1.033e-01, 2.073e-01, 3.202e-03, -8.257e-03, 2.445e-01)); + r += mul(s0_2, M4(5.688e-02, -7.895e-02, 5.165e-02, 6.176e-03, 6.183e-02, -7.351e-02, 1.285e-02, 1.244e-01, 1.361e-02, 2.905e-02, -3.437e-02, -6.790e-02, -2.269e-03, -4.321e-02, 6.246e-02, 1.473e-01)); + r += mul(s0_3, M4(-2.291e-02, -1.502e-01, -7.603e-03, 1.355e-01, -5.305e-02, 1.134e-01, -1.282e-02, 1.570e-02, -2.111e-01, -3.812e-01, -3.447e-01, 1.578e-01, 2.417e-03, 5.896e-02, -5.163e-02, -5.294e-02)); + r += mul(s0_4, M4(1.900e-01, -2.398e-01, 1.170e-01, -1.547e-02, 4.756e-03, -1.449e-01, -5.318e-02, -1.763e-01, 2.585e-01, -2.209e-01, 6.118e-02, -1.008e-01, -2.421e-01, -4.606e-02, -1.322e-01, 1.209e-02)); + r += mul(s0_5, M4(-5.750e-03, -5.512e-02, -3.397e-04, -6.929e-02, 7.312e-03, 2.912e-02, 6.804e-02, -9.701e-02, 5.363e-02, -3.913e-02, 1.144e-02, -6.841e-02, 9.510e-02, -1.010e-02, -7.571e-02, 6.174e-02)); + r += mul(s0_6, M4(3.139e-03, 1.147e-02, -1.003e-02, 2.934e-03, 1.570e-02, 3.821e-02, 1.733e-03, 1.197e-01, 1.307e-01, 1.198e-01, 5.437e-02, -1.454e-01, 7.494e-02, 8.354e-02, 4.805e-02, 8.956e-02)); + r += mul(s0_7, M4(-1.305e-02, -9.896e-03, -2.490e-02, -7.780e-02, 3.909e-02, 2.933e-02, -1.095e-02, 1.387e-03, 7.792e-02, -3.871e-02, 1.720e-01, -1.900e-01, 1.288e-02, -1.080e-01, -1.026e-01, 7.740e-03)); + r += mul(s0_8, M4(4.990e-03, 2.552e-02, 1.105e-01, 9.851e-02, -2.520e-02, -8.242e-02, -9.196e-02, -2.433e-02, -1.909e-02, -9.932e-04, -2.983e-02, -3.875e-02, 1.385e-02, 3.129e-02, -4.664e-03, 2.485e-02)); + r += mul(s1_0, M4(5.915e-02, 6.590e-02, 1.312e-02, -1.948e-01, -6.246e-02, 1.216e-01, 8.398e-02, -3.320e-01, 7.135e-02, -2.850e-03, 6.330e-03, 1.095e-01, 4.058e-02, -1.627e-02, -6.460e-02, -5.208e-02)); + r += mul(s1_1, M4(-2.444e-01, 1.257e-01, -3.160e-02, 6.848e-02, -1.397e-01, 1.748e-01, -3.867e-02, 1.034e-01, -6.418e-02, -2.701e-02, -3.038e-02, 2.540e-01, 1.164e-01, -4.954e-02, -3.766e-02, 5.431e-02)); + r += mul(s1_2, M4(-7.726e-02, -5.139e-02, -9.235e-02, -1.074e-01, -2.585e-02, -1.357e-01, -3.064e-02, -2.004e-01, -2.334e-02, -4.123e-02, -2.273e-02, 1.205e-02, 6.541e-02, 8.848e-03, 7.449e-02, 1.229e-01)); + r += mul(s1_3, M4(1.603e-01, 1.097e-01, -8.866e-02, 2.797e-01, -3.778e-02, -7.621e-02, -7.649e-02, 2.947e-01, -2.127e-01, -1.054e-01, 2.025e-01, 6.307e-02, -8.014e-02, 5.530e-02, -4.694e-02, -7.250e-02)); + r += mul(s1_4, M4(1.233e-01, -1.892e-01, -1.193e-02, 2.636e-01, 4.172e-02, -2.724e-01, -2.380e-02, -1.760e-01, -2.191e-01, -2.573e-02, 5.340e-01, -1.145e-01, 2.839e-02, -4.719e-02, 6.835e-02, 3.499e-02)); + r += mul(s1_5, M4(9.120e-04, -9.661e-02, -2.830e-01, -3.171e-02, 8.802e-02, -1.440e-01, 1.313e-01, -1.072e-01, -1.169e-01, 4.815e-02, 4.976e-02, 1.967e-01, 2.588e-02, 1.345e-02, 2.592e-02, -5.276e-02)); + r += mul(s1_6, M4(1.288e-01, -7.539e-02, -1.382e-01, 1.609e-02, -4.723e-02, 3.042e-02, -8.309e-02, -1.198e-01, -1.033e-01, -1.751e-01, 4.485e-03, 1.238e-01, 9.003e-02, 8.127e-02, 1.875e-02, 1.353e-02)); + r += mul(s1_7, M4(-9.747e-02, 1.855e-01, -1.925e-01, -5.547e-02, -7.088e-02, -9.803e-02, 1.539e-01, -9.433e-02, -1.762e-01, -1.183e-01, 1.326e-01, 2.236e-01, 4.235e-02, 2.056e-02, -3.245e-02, 1.732e-02)); + r += mul(s1_8, M4(8.181e-02, -5.216e-03, -8.506e-02, 8.966e-02, -2.085e-03, 1.868e-01, -3.452e-02, 1.632e-01, 1.210e-02, -1.903e-02, -6.220e-02, 5.310e-02, 4.398e-02, -3.663e-02, 3.722e-02, -4.242e-02)); + r += mul(s2_0, M4(-1.206e-01, 9.558e-02, -4.620e-02, 3.062e-03, -4.847e-02, -1.453e-01, 4.601e-02, 3.178e-02, -9.780e-02, 1.438e-01, 1.179e-01, 1.688e-01, -3.957e-02, -1.288e-02, 1.401e-01, 5.510e-02)); + r += mul(s2_1, M4(-1.381e-01, 1.737e-01, 5.948e-02, -1.221e-01, 5.363e-02, -1.066e-01, -5.197e-03, -9.137e-02, 4.265e-03, 2.725e-01, 1.724e-01, 1.988e-01, 5.521e-03, -8.716e-02, 1.280e-01, 2.470e-02)); + r += mul(s2_2, M4(5.819e-02, -7.113e-02, 8.023e-02, -2.218e-01, 5.752e-03, -5.493e-02, 6.714e-04, 1.236e-01, 2.653e-02, 1.468e-01, 1.229e-02, -6.665e-02, -7.151e-02, 1.198e-02, 1.073e-01, 6.364e-02)); + r += mul(s2_3, M4(6.612e-02, 4.067e-02, -4.382e-02, -4.092e-01, -1.763e-01, -3.350e-02, 1.109e-01, -1.721e-01, -3.335e-01, -1.528e-01, -4.465e-02, -2.936e-01, -3.856e-02, -2.933e-02, 4.427e-02, 1.626e-01)); + r += mul(s2_4, M4(-1.707e-02, 1.707e-02, -3.251e-01, 1.643e-01, 1.466e-01, 3.248e-02, 1.353e-02, 1.580e-02, -8.672e-04, 2.900e-01, -6.717e-02, 2.236e-01, -8.835e-02, -7.532e-02, 3.308e-02, -1.505e-01)); + r += mul(s2_5, M4(-1.692e-02, 7.445e-02, 2.193e-01, 8.993e-02, 9.978e-02, -2.544e-02, 1.497e-01, -1.315e-01, -2.081e-02, -7.005e-02, 2.727e-01, 1.743e-01, -6.032e-02, -1.367e-01, -1.602e-03, -8.789e-02)); + r += mul(s2_6, M4(-1.569e-02, 7.364e-02, 2.221e-02, 1.627e-01, -7.248e-02, -1.373e-01, 5.594e-02, -8.769e-03, -1.682e-02, 1.029e-01, 1.361e-01, -3.526e-01, 1.620e-02, 4.748e-02, 2.704e-02, -1.062e-01)); + r += mul(s2_7, M4(-1.054e-01, -1.154e-02, -7.373e-02, -2.821e-01, 5.064e-02, -1.059e-03, 1.904e-01, 1.205e-01, 2.214e-01, -5.921e-04, 2.009e-01, -1.527e-01, -6.023e-02, -6.896e-02, -4.439e-02, 3.888e-02)); + r += mul(s2_8, M4(1.200e-01, 1.974e-02, -1.368e-01, -1.805e-01, -1.308e-01, -9.498e-02, 5.894e-02, -1.164e-01, -1.340e-01, 1.556e-01, -2.300e-02, 1.509e-01, 5.887e-02, 1.487e-02, 2.487e-02, 6.804e-02)); + r += mul(s3_0, M4(4.228e-02, -5.438e-02, -2.953e-02, 2.476e-02, -3.938e-03, 8.333e-02, -2.764e-02, -3.250e-02, -2.921e-02, -4.583e-02, -1.548e-02, -1.151e-02, -3.856e-03, -7.593e-02, 1.128e-02, 6.069e-02)); + r += mul(s3_1, M4(1.559e-01, -1.065e-01, -2.049e-02, 6.581e-02, -5.467e-02, 1.221e-02, 2.313e-02, 7.192e-03, -2.114e-02, 2.589e-02, -7.534e-03, -1.009e-02, 1.563e-02, 4.367e-02, -1.770e-01, 1.473e-01)); + r += mul(s3_2, M4(9.814e-02, -3.655e-02, 5.478e-02, 4.815e-02, -2.470e-02, -6.146e-02, -7.068e-02, -6.625e-03, 4.639e-02, 1.204e-02, -2.514e-02, 1.869e-02, -3.452e-02, 6.861e-02, -3.143e-02, -2.935e-02)); + r += mul(s3_3, M4(-4.938e-02, -7.948e-02, 1.161e-02, -1.234e-02, -2.432e-02, 4.279e-02, 3.968e-02, -6.227e-02, -6.645e-02, 8.690e-02, -1.461e-01, -5.690e-03, 3.831e-02, 2.937e-01, 4.653e-02, 4.828e-02)); + r += mul(s3_4, M4(-7.999e-02, 2.704e-01, -2.645e-01, 1.795e-01, -5.116e-02, -2.315e-01, -6.567e-02, -7.200e-02, -5.511e-02, -1.013e-01, -7.740e-02, 5.260e-02, -1.919e-03, 1.028e-01, 9.671e-02, -6.519e-02)); + r += mul(s3_5, M4(-6.789e-03, -3.671e-02, 1.186e-01, -3.797e-01, -8.049e-02, 7.739e-02, 6.670e-02, 1.133e-01, -7.665e-03, 6.210e-02, 1.060e-01, -2.092e-02, 1.680e-01, 1.804e-02, -2.171e-02, 8.897e-02)); + r += mul(s3_6, M4(-5.568e-02, -1.409e-01, 1.968e-02, -3.617e-02, -3.076e-02, -3.317e-02, 1.160e-01, -5.722e-03, 6.979e-03, 6.354e-02, 1.354e-02, 7.411e-02, -4.428e-03, 9.028e-02, -1.606e-02, 5.119e-02)); + r += mul(s3_7, M4(-8.462e-02, 6.714e-02, -5.238e-03, 6.400e-03, 1.121e-01, -2.286e-02, -2.020e-02, -7.229e-04, 5.897e-04, -4.113e-02, 1.337e-01, 8.621e-03, -2.099e-01, -2.948e-02, -1.520e-02, 1.098e-01)); + r += mul(s3_8, M4(4.036e-02, -1.405e-01, 5.163e-02, -7.905e-03, 1.593e-02, -2.116e-02, -7.974e-03, 5.984e-02, 4.096e-02, 4.600e-02, 4.659e-02, 5.924e-02, 1.334e-02, 4.451e-02, -7.178e-02, 6.131e-03)); + r += mul(s4_0, M4(3.154e-02, 3.548e-02, 1.730e-02, 3.346e-02, -4.024e-02, -3.264e-02, -1.470e-01, -1.200e-01, 1.690e-02, -2.265e-02, -4.149e-02, -2.140e-02, 1.119e-01, 2.084e-01, -1.121e-01, -1.373e-01)); + r += mul(s4_1, M4(-5.462e-02, 3.954e-02, -2.348e-02, 6.568e-02, -6.036e-02, 7.795e-02, -9.620e-02, 3.154e-01, 8.862e-02, -7.174e-02, -9.480e-02, -3.692e-02, -1.154e-01, 3.932e-02, 1.292e-01, -2.248e-01)); + r += mul(s4_2, M4(2.872e-02, -5.408e-02, 4.336e-02, -7.111e-02, 4.963e-02, 3.748e-02, -6.812e-02, 8.766e-02, 9.474e-03, 5.083e-02, -7.391e-02, 1.053e-01, 6.506e-02, -6.320e-02, 1.222e-01, 9.191e-03)); + r += mul(s4_3, M4(-6.555e-02, 4.505e-02, -4.655e-02, -9.145e-02, 6.602e-03, 1.364e-01, 8.412e-02, -4.747e-03, -2.966e-02, 6.929e-02, 9.440e-02, -1.133e-01, 1.360e-01, 3.425e-02, -2.808e-02, -1.973e-01)); + r += mul(s4_4, M4(-9.314e-02, 6.382e-03, -1.005e-01, 8.729e-02, 5.224e-02, -9.051e-02, 2.902e-01, 1.207e-01, -5.073e-02, 2.289e-01, 8.406e-02, 6.964e-02, 1.459e-02, -2.334e-01, 1.740e-01, 1.771e-01)); + r += mul(s4_5, M4(1.237e-01, 8.729e-02, 4.959e-02, -1.984e-02, 1.293e-02, 7.650e-04, 4.499e-02, 5.544e-02, -1.017e-01, -8.729e-02, 2.581e-02, -7.212e-02, 3.828e-02, -3.534e-02, 2.333e-01, -2.448e-01)); + r += mul(s4_6, M4(-2.343e-02, -4.688e-02, 2.338e-02, 3.721e-02, 2.008e-02, 1.627e-03, 5.451e-02, 2.319e-01, 6.909e-02, -7.454e-03, -4.210e-03, 3.158e-02, -1.099e-02, 9.028e-02, -4.876e-02, 1.138e-01)); + r += mul(s4_7, M4(-6.356e-02, -1.661e-01, 2.443e-02, -5.680e-02, 1.244e-01, -1.160e-01, 5.501e-02, -1.000e-01, -1.478e-01, -8.587e-02, 6.595e-02, -1.460e-01, -1.961e-01, -1.595e-01, -1.242e-01, -1.330e-01)); + r += mul(s4_8, M4(3.144e-02, 3.457e-02, 4.639e-02, 3.490e-03, 7.927e-02, 5.451e-02, 1.042e-01, 4.356e-02, 2.098e-02, -1.338e-02, -5.927e-02, 5.882e-02, -5.585e-02, -9.631e-03, -4.868e-02, 7.457e-02)); + r += mul(s5_0, M4(-3.288e-03, 6.522e-02, -3.526e-03, -1.352e-02, 1.039e-01, 1.087e-01, -1.976e-02, -1.398e-01, -1.507e-02, 2.050e-02, 2.135e-02, 7.472e-02, 2.467e-02, 1.739e-03, -2.406e-03, 3.458e-02)); + r += mul(s5_1, M4(1.557e-01, 4.224e-02, -3.892e-02, 1.267e-01, 2.728e-02, -3.507e-02, 6.106e-02, -2.876e-02, 6.176e-02, 1.852e-02, -1.066e-01, 1.126e-01, -2.912e-02, -7.657e-02, -1.089e-01, -2.211e-02)); + r += mul(s5_2, M4(8.400e-02, -3.667e-02, 8.771e-02, -2.185e-02, -1.031e-02, 2.948e-02, -2.570e-02, -5.338e-02, 1.059e-01, -1.223e-02, -1.557e-01, 8.655e-02, 2.410e-02, 4.648e-02, 1.769e-02, -7.573e-02)); + r += mul(s5_3, M4(8.675e-02, -6.990e-02, 2.511e-02, -9.416e-03, 9.809e-02, 1.254e-01, -5.303e-02, -8.618e-02, -8.457e-02, 9.567e-02, -9.494e-02, -1.148e-01, -1.560e-02, 6.806e-02, 9.405e-02, 4.098e-02)); + r += mul(s5_4, M4(5.280e-02, 6.067e-02, -1.976e-01, 9.863e-02, -8.271e-02, -1.365e-02, 1.193e-01, -1.790e-01, -6.840e-03, 1.895e-01, -9.188e-02, -1.218e-01, -3.719e-03, 6.033e-02, -2.169e-02, 2.204e-01)); + r += mul(s5_5, M4(2.242e-01, -2.921e-03, -3.570e-04, -3.935e-03, -1.253e-03, -6.734e-02, 7.546e-04, -2.474e-02, -1.686e-01, 5.612e-02, 1.091e-01, -4.316e-02, 1.036e-01, 2.184e-02, 9.947e-02, -1.900e-01)); + r += mul(s5_6, M4(2.334e-02, -3.774e-02, -6.603e-02, -1.323e-01, 3.283e-02, -4.643e-02, -6.959e-02, -3.146e-03, -7.513e-03, 1.399e-03, -5.232e-02, 4.053e-02, 9.091e-03, 3.483e-02, 6.393e-03, 1.083e-02)); + r += mul(s5_7, M4(6.783e-02, -2.924e-01, -2.529e-02, -4.163e-01, 4.052e-02, -6.870e-02, -4.707e-02, -9.593e-02, -2.101e-01, -1.228e-01, -4.197e-02, 1.293e-02, -5.435e-02, -2.645e-01, 7.583e-02, -1.708e-01)); + r += mul(s5_8, M4(8.686e-03, -1.299e-01, -5.771e-02, -1.496e-01, 1.606e-02, -1.679e-02, -3.246e-03, -1.859e-01, -4.083e-02, -1.148e-01, -7.817e-03, 4.128e-02, 6.493e-02, 2.126e-02, 4.033e-03, 1.422e-01)); + r += mul(s6_0, M4(-1.077e-01, 3.526e-02, 7.391e-02, -5.982e-02, 3.658e-02, 6.680e-02, 1.467e-02, -1.150e-03, 1.662e-02, -3.063e-03, -8.420e-02, -1.484e-01, -2.569e-03, -2.318e-02, 1.749e-03, 2.355e-01)); + r += mul(s6_1, M4(-1.208e-01, 1.325e-01, 1.647e-02, 9.317e-02, 1.960e-02, 3.862e-02, 3.310e-02, 7.721e-02, 4.446e-02, -4.653e-03, -1.381e-02, 6.921e-02, -1.951e-01, 2.847e-02, -2.456e-01, -3.425e-02)); + r += mul(s6_2, M4(-4.401e-02, 1.811e-02, 4.561e-02, 3.513e-01, 1.081e-02, -3.141e-02, 2.725e-02, -2.780e-02, -6.767e-02, -1.508e-02, 8.973e-03, -2.144e-02, 1.207e-03, -2.087e-02, -1.307e-01, -1.781e-01)); + r += mul(s6_3, M4(-3.827e-02, -3.661e-02, 1.011e-02, 1.545e-01, 1.581e-02, 6.656e-02, -4.645e-02, 8.442e-02, -2.433e-02, 6.781e-02, -1.275e-01, 8.078e-02, -8.402e-02, -1.286e-02, 1.922e-01, 1.349e-01)); + r += mul(s6_4, M4(1.241e-01, -6.509e-01, -5.271e-02, -2.358e-01, -8.803e-02, 1.740e-01, -2.688e-01, 1.401e-01, -5.751e-02, 2.101e-02, -9.749e-02, -1.048e-01, -6.910e-02, -4.104e-02, 3.521e-01, -1.025e-01)); + r += mul(s6_5, M4(8.778e-03, -5.586e-02, 7.706e-02, -4.578e-02, 1.213e-02, 9.870e-02, -4.086e-02, -8.745e-02, -6.358e-02, 2.182e-02, -1.452e-02, 2.654e-02, -3.300e-02, 5.861e-02, 7.919e-02, 1.088e-01)); + r += mul(s6_6, M4(-6.089e-02, -2.363e-02, -1.039e-02, -8.941e-02, 4.292e-02, -3.782e-03, 4.320e-02, 5.394e-03, -6.660e-02, 1.384e-02, -1.341e-01, -1.106e-01, -7.917e-02, 3.123e-02, 3.668e-02, 1.299e-01)); + r += mul(s6_7, M4(5.717e-02, 1.718e-01, 9.223e-02, 4.245e-01, -2.327e-03, -1.134e-01, -9.775e-03, 4.413e-02, -5.453e-02, 4.146e-01, -8.485e-02, 2.315e-01, 1.504e-03, 1.173e-01, -5.307e-02, 3.062e-02)); + r += mul(s6_8, M4(-1.238e-01, 4.796e-02, -8.737e-02, -1.498e-01, 8.415e-02, -2.357e-02, 1.694e-01, 8.595e-02, 1.155e-01, -2.768e-02, -9.003e-02, -1.101e-01, -8.561e-02, -1.678e-02, -6.089e-02, 3.184e-02)); + r += mul(s7_0, M4(-4.965e-02, -4.120e-02, 1.285e-01, 1.078e-02, -1.119e-02, -6.779e-03, -5.037e-02, 1.074e-01, 6.507e-03, -1.108e-01, 6.075e-02, -6.955e-04, 1.402e-01, 9.810e-02, -7.748e-03, 4.435e-02)); + r += mul(s7_1, M4(1.647e-02, 3.714e-02, -5.533e-02, 6.509e-03, -7.659e-02, -8.373e-02, 5.623e-02, -7.749e-03, -6.849e-02, -8.011e-02, 6.262e-02, 1.709e-01, 7.538e-02, 1.420e-01, 1.243e-01, -4.103e-02)); + r += mul(s7_2, M4(-8.281e-02, -6.420e-02, 1.808e-02, -1.000e-01, 3.493e-02, -5.424e-02, 5.403e-02, -2.961e-02, 6.306e-02, 3.705e-02, -3.130e-02, -4.529e-02, -4.749e-02, 6.859e-04, 5.235e-02, -2.872e-02)); + r += mul(s7_3, M4(1.268e-01, -1.369e-01, 8.872e-02, -1.221e-01, 1.602e-02, 5.109e-03, -1.217e-01, 1.610e-01, 1.709e-01, -7.700e-03, 1.607e-01, 9.319e-02, 2.199e-01, -1.097e-01, -3.539e-02, -1.032e-01)); + r += mul(s7_4, M4(-4.076e-01, 1.495e-01, 6.882e-02, -5.524e-02, -4.597e-01, 4.264e-02, -2.740e-01, 1.135e-01, -6.260e-02, 8.472e-03, 3.468e-01, -1.748e-01, -9.361e-02, 8.264e-03, 5.110e-01, -1.052e-01)); + r += mul(s7_5, M4(-9.600e-02, -2.135e-02, -2.585e-02, -4.248e-02, -2.243e-01, 1.290e-01, -1.017e-01, 4.722e-02, -1.032e-02, 2.541e-02, 9.565e-02, -8.045e-02, -7.933e-02, -5.089e-02, 1.153e-01, 9.537e-03)); + r += mul(s7_6, M4(-5.367e-02, -3.114e-02, -1.703e-02, 9.851e-03, -1.690e-01, -8.414e-02, -8.379e-02, -5.830e-04, 2.686e-01, 1.545e-01, 9.429e-02, 1.295e-01, 2.207e-01, -6.419e-02, 3.829e-02, 5.205e-02)); + r += mul(s7_7, M4(7.676e-02, 1.129e-01, 3.466e-02, -2.708e-02, -9.591e-02, -1.674e-01, -8.708e-02, 7.116e-02, -2.083e-01, -6.360e-02, 1.431e-01, -1.180e-01, -6.194e-02, 9.175e-02, 3.166e-02, 2.715e-02)); + r += mul(s7_8, M4(-7.521e-02, -4.163e-02, -7.575e-02, -1.588e-01, 2.143e-02, 3.748e-02, 1.099e-02, 1.665e-01, 6.809e-02, -5.992e-02, 1.567e-01, 1.218e-01, 1.592e-02, -3.885e-02, -2.286e-02, -8.052e-02)); + r += V4(3.256e-03, 5.569e-03, -5.325e-03, 5.488e-04); + return r; +} + +V4 f2(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-1.547e-01, -1.336e-02, -9.624e-02, -1.577e-03, 3.593e-02, 3.042e-02, -8.003e-02, 2.192e-02, -4.950e-02, 7.476e-02, -6.039e-02, 8.056e-02, -7.910e-02, -8.635e-02, -1.421e-01, 8.092e-02)); + r += mul(s0_1, M4(-1.913e-02, 4.725e-02, -1.637e-01, -1.348e-01, -9.849e-02, -1.759e-01, -4.068e-02, 2.364e-02, -1.270e-01, -1.379e-02, -1.358e-01, 1.061e-01, 1.210e-01, -3.639e-02, -8.988e-02, -1.070e-01)); + r += mul(s0_2, M4(1.796e-02, 3.540e-02, -7.519e-02, -5.215e-02, 4.199e-02, -5.199e-02, 1.456e-03, -3.571e-03, -3.944e-02, -6.634e-03, -4.133e-02, 4.924e-02, -1.425e-01, -1.294e-01, 1.045e-01, -2.157e-02)); + r += mul(s0_3, M4(-9.407e-02, 7.844e-02, -3.308e-02, 5.621e-02, 1.042e-01, -3.890e-02, 2.055e-01, -1.072e-01, 2.748e-02, 4.462e-01, -1.676e-01, 3.662e-01, 8.381e-03, 1.181e-02, 3.234e-02, 3.358e-02)); + r += mul(s0_4, M4(-1.005e-01, -2.126e-03, 5.502e-02, -6.089e-02, 2.273e-01, 4.151e-03, -1.460e-01, 1.359e-01, 9.257e-02, 2.512e-02, -1.959e-01, 3.031e-01, 1.875e-01, 9.293e-02, 4.954e-02, -9.439e-02)); + r += mul(s0_5, M4(8.254e-02, -3.787e-02, 8.115e-03, 1.379e-01, -6.686e-02, -5.386e-02, -1.296e-01, -5.086e-02, -4.210e-02, -4.231e-03, -4.891e-02, 9.751e-02, -9.846e-03, -7.811e-02, 3.148e-02, -8.734e-02)); + r += mul(s0_6, M4(-3.271e-02, 1.928e-02, 2.436e-03, -6.287e-02, -3.796e-02, 7.205e-02, -7.604e-03, -1.239e-02, -4.773e-02, 9.715e-02, -8.941e-03, 9.275e-02, -9.353e-02, 4.975e-02, -1.497e-01, -9.723e-02)); + r += mul(s0_7, M4(-6.321e-02, -3.796e-02, -5.824e-02, 1.675e-01, 1.885e-01, 4.765e-02, 1.688e-01, 1.402e-02, -2.094e-01, 7.993e-02, -6.426e-02, 3.454e-02, -1.092e-01, 4.996e-02, -7.640e-02, 6.195e-02)); + r += mul(s0_8, M4(-1.590e-02, 1.018e-02, -3.362e-02, -4.663e-02, 9.686e-02, -5.498e-03, 1.110e-01, -8.963e-02, 7.007e-02, 6.482e-02, -2.983e-03, 9.060e-02, -2.021e-02, 3.653e-02, -2.570e-02, -1.258e-01)); + r += mul(s1_0, M4(-3.619e-02, -1.744e-01, -4.347e-02, -4.267e-02, -4.923e-03, -9.286e-02, 2.422e-01, -4.670e-02, 1.320e-01, -1.984e-01, 2.182e-01, 1.958e-02, 4.612e-03, 8.703e-03, -5.831e-02, -7.535e-02)); + r += mul(s1_1, M4(-5.531e-03, -9.462e-02, 2.501e-02, 9.215e-02, -1.924e-02, -1.056e-01, 1.524e-01, -5.061e-02, 9.483e-02, -1.310e-01, 1.569e-01, 1.182e-01, 6.513e-02, 2.052e-02, -9.772e-02, 2.345e-02)); + r += mul(s1_2, M4(3.993e-02, 2.333e-02, 2.727e-01, -1.340e-02, 2.623e-02, 3.439e-02, 2.126e-02, 9.785e-02, 9.983e-02, -2.156e-03, 6.621e-02, 5.928e-02, 6.364e-02, -8.201e-02, -1.501e-02, -8.141e-02)); + r += mul(s1_3, M4(1.770e-02, -1.235e-02, -4.150e-04, 1.100e-01, 5.326e-02, 2.712e-02, -1.292e-01, 7.162e-02, -1.035e-01, 2.255e-01, 1.976e-02, -2.447e-01, 1.629e-02, -8.791e-02, -2.548e-02, -1.104e-01)); + r += mul(s1_4, M4(-9.864e-04, -1.118e-01, 1.131e-01, -2.565e-01, -9.560e-02, 1.174e-01, -2.686e-01, 9.302e-02, -1.345e-01, -2.369e-01, 4.699e-02, -1.489e-02, 1.831e-01, 1.548e-01, 5.183e-02, 1.790e-01)); + r += mul(s1_5, M4(1.439e-01, 4.397e-03, -3.498e-02, 1.244e-01, 1.418e-01, -2.472e-02, -2.413e-01, 1.052e-01, 1.606e-01, -8.201e-03, 6.680e-02, -8.102e-02, -2.082e-02, -3.969e-02, -7.201e-02, -4.495e-02)); + r += mul(s1_6, M4(6.272e-02, 4.990e-02, 8.887e-02, 3.249e-02, 3.269e-02, -8.323e-02, 1.116e-01, 2.040e-02, 1.995e-02, 1.057e-01, -6.512e-03, -3.846e-02, -2.073e-02, 8.689e-03, 2.337e-02, -8.896e-03)); + r += mul(s1_7, M4(-1.356e-01, 2.012e-02, 3.494e-02, -6.068e-02, 8.204e-02, -3.639e-02, 1.480e-01, 1.784e-01, -4.654e-03, -8.309e-03, 5.955e-02, -9.202e-02, 3.201e-02, 7.348e-02, 1.535e-01, 1.772e-01)); + r += mul(s1_8, M4(7.614e-02, 4.078e-03, 2.274e-01, 6.708e-02, 1.090e-01, -4.981e-03, 1.636e-01, 1.457e-01, 7.425e-02, -6.353e-02, 1.289e-02, -2.213e-02, 1.256e-02, -4.327e-02, 4.475e-02, -5.957e-02)); + r += mul(s2_0, M4(-3.046e-02, 1.478e-01, 4.846e-02, -1.134e-01, -9.139e-02, -3.482e-03, -8.726e-02, -8.179e-02, -9.263e-02, -9.555e-03, 1.925e-02, 1.085e-01, -1.840e-02, 2.115e-01, 5.158e-02, 5.294e-02)); + r += mul(s2_1, M4(1.175e-01, -7.622e-02, 1.346e-01, -2.636e-01, -8.279e-02, 2.601e-02, -1.111e-02, -1.346e-01, -1.376e-01, -1.053e-01, -4.803e-01, 1.282e-01, -1.441e-01, -6.537e-02, -1.831e-01, -7.560e-02)); + r += mul(s2_2, M4(-5.088e-02, 6.594e-02, 3.108e-02, 1.725e-02, 1.314e-01, -2.219e-02, -7.137e-02, 3.789e-02, 5.741e-02, -2.482e-02, -2.007e-01, 1.658e-02, -5.010e-02, -5.699e-02, 9.114e-02, -5.246e-02)); + r += mul(s2_3, M4(-8.034e-02, 3.582e-04, 4.709e-02, -1.542e-01, 1.968e-02, 5.846e-02, 1.434e-01, -5.554e-02, -3.457e-01, 8.977e-02, -3.070e-01, -8.939e-02, -9.490e-02, 1.739e-02, -1.325e-02, -6.021e-02)); + r += mul(s2_4, M4(3.695e-02, 4.282e-01, -4.779e-02, -2.542e-01, 4.170e-01, -4.199e-03, 2.635e-01, 9.272e-02, -1.018e-01, -3.018e-01, -1.229e-01, 5.847e-01, 5.349e-02, -9.264e-02, 1.590e-01, -8.636e-02)); + r += mul(s2_5, M4(2.304e-01, 8.633e-02, -8.647e-02, -1.178e-01, 6.404e-02, 2.085e-02, 5.816e-02, 6.002e-02, -2.182e-01, -6.899e-03, 1.213e-01, -2.377e-01, 1.045e-01, -6.460e-03, -6.306e-02, 9.807e-02)); + r += mul(s2_6, M4(4.065e-02, 4.113e-02, -1.966e-02, -1.033e-02, 6.379e-02, -9.661e-02, -7.923e-02, -3.830e-02, -1.658e-01, -1.424e-01, -1.789e-01, -2.376e-01, 3.041e-02, 2.283e-02, 8.950e-02, 3.774e-02)); + r += mul(s2_7, M4(4.361e-03, 4.963e-02, -4.400e-02, 3.623e-02, 5.359e-02, 3.067e-04, -6.885e-02, -1.999e-01, -1.801e-02, 3.282e-02, -1.433e-01, 4.356e-01, 1.168e-01, -9.429e-02, 7.713e-03, 2.926e-02)); + r += mul(s2_8, M4(1.808e-01, -1.784e-02, 1.194e-01, 9.667e-02, 5.927e-02, -2.430e-02, -3.530e-02, 3.124e-02, -1.911e-01, -8.520e-02, -1.675e-01, 3.291e-02, 3.590e-02, -5.538e-02, 8.543e-03, 2.209e-02)); + r += mul(s3_0, M4(-4.417e-03, 6.142e-02, 3.291e-03, 4.601e-06, 9.343e-03, 6.774e-03, 3.549e-02, 1.940e-02, -1.764e-02, 8.100e-02, 4.121e-02, 5.637e-03, 4.980e-02, -3.647e-02, 6.004e-05, 4.063e-02)); + r += mul(s3_1, M4(2.011e-02, -3.297e-02, -2.439e-01, 9.536e-02, -4.038e-02, -1.251e-02, 9.924e-02, -2.949e-02, 1.093e-01, 7.510e-02, -2.881e-02, -2.545e-02, 1.724e-01, 8.464e-02, -7.721e-02, 1.169e-01)); + r += mul(s3_2, M4(2.340e-02, 7.193e-04, -1.792e-01, -6.388e-02, 1.548e-01, 1.248e-01, 9.521e-02, 3.513e-02, 4.711e-02, 1.726e-02, -7.443e-02, 1.201e-02, 1.924e-02, -8.228e-02, -3.082e-02, 1.620e-01)); + r += mul(s3_3, M4(-4.869e-02, 5.506e-02, -1.423e-03, -8.865e-02, 4.620e-02, -3.023e-02, -6.991e-02, -5.063e-02, -5.804e-03, 9.471e-04, -1.476e-02, -7.117e-02, 2.921e-02, -8.528e-02, 9.544e-02, -6.845e-02)); + r += mul(s3_4, M4(-3.153e-02, 2.901e-01, 1.062e-01, -1.654e-01, 3.504e-02, -1.983e-01, 3.474e-02, 2.137e-01, 5.099e-02, 1.739e-02, 1.364e-01, 3.750e-02, -1.250e-02, -4.225e-02, -6.298e-02, 1.174e-01)); + r += mul(s3_5, M4(3.235e-02, 1.014e-01, -4.390e-02, 1.367e-02, -7.041e-02, -8.663e-02, 4.107e-02, -1.313e-01, -5.041e-02, -8.777e-03, 6.259e-02, 2.509e-02, 1.405e-01, 1.588e-01, 2.664e-02, 1.379e-01)); + r += mul(s3_6, M4(4.731e-02, 3.992e-02, 8.726e-02, 8.352e-02, -4.385e-02, 6.694e-04, 5.591e-02, -1.869e-02, 3.434e-02, -4.853e-02, -6.173e-02, -4.227e-02, 1.133e-02, 7.837e-02, -6.929e-02, 5.805e-02)); + r += mul(s3_7, M4(1.449e-01, 1.094e-02, -5.163e-02, 9.452e-02, 1.171e-01, 1.046e-03, 1.260e-01, 1.795e-01, 3.258e-03, 3.548e-03, 2.109e-02, 1.907e-02, 5.014e-02, 4.713e-02, 1.726e-02, -7.078e-02)); + r += mul(s3_8, M4(8.935e-02, -6.422e-02, 6.770e-02, -4.356e-02, -1.583e-02, -1.684e-02, -8.968e-02, 2.203e-02, -1.843e-02, -2.197e-02, -1.469e-02, 1.552e-02, 2.657e-02, -4.394e-03, 4.107e-02, -7.831e-03)); + r += mul(s4_0, M4(7.700e-02, 3.542e-02, 2.845e-02, -6.420e-02, 2.802e-02, 6.201e-02, 1.097e-01, -1.347e-01, 3.497e-02, 9.450e-02, -1.123e-02, 5.075e-02, 8.997e-02, -1.132e-01, -1.337e-02, 5.028e-02)); + r += mul(s4_1, M4(-7.537e-02, 5.639e-02, 1.085e-01, -1.155e-01, 2.222e-01, 6.309e-02, -3.337e-02, -8.426e-02, -4.272e-02, 1.215e-02, -1.528e-01, 6.993e-02, -2.884e-01, -2.062e-01, 2.984e-02, -1.550e-02)); + r += mul(s4_2, M4(4.233e-03, -1.193e-01, 4.585e-02, 1.372e-01, -3.937e-02, -6.613e-02, -4.116e-02, 2.296e-03, 7.788e-02, 3.592e-02, 1.762e-02, -2.034e-01, -8.970e-02, 2.347e-02, 2.314e-02, -5.101e-02)); + r += mul(s4_3, M4(5.040e-02, -6.901e-02, 7.410e-03, -5.935e-02, -1.089e-02, 1.786e-01, 1.902e-01, -3.943e-03, 2.349e-03, -6.481e-02, -4.593e-02, 3.733e-02, 6.607e-02, -1.105e-01, 1.234e-01, -6.116e-02)); + r += mul(s4_4, M4(-1.231e-01, 8.899e-02, 5.861e-02, 6.610e-02, -1.799e-02, -2.101e-02, -4.797e-03, 2.038e-01, -1.418e-01, -3.988e-02, 3.584e-02, -1.958e-01, -2.224e-01, -1.563e-01, -1.337e-02, -1.558e-01)); + r += mul(s4_5, M4(2.220e-01, -1.101e-02, 2.653e-03, 7.280e-02, -3.506e-02, 7.103e-04, 1.225e-01, 3.272e-04, -4.636e-02, 1.115e-01, 4.076e-02, -1.121e-01, 4.149e-02, -4.349e-02, -1.524e-01, 3.738e-02)); + r += mul(s4_6, M4(7.249e-02, -5.538e-03, 3.810e-02, 7.547e-02, -4.347e-02, 3.399e-02, 1.992e-02, -4.980e-02, 1.005e-02, 3.027e-02, -4.584e-02, -2.648e-02, 3.174e-02, 1.282e-01, 3.011e-02, -1.462e-01)); + r += mul(s4_7, M4(1.377e-01, -3.892e-02, 1.709e-02, 1.353e-01, 3.778e-02, -8.988e-02, 1.101e-01, 7.760e-02, 6.029e-02, -1.098e-01, 1.895e-01, -9.690e-02, 2.427e-01, -9.797e-02, -8.529e-02, -5.416e-02)); + r += mul(s4_8, M4(1.343e-01, -7.242e-02, 2.388e-02, 2.345e-02, -3.886e-02, 3.248e-02, 1.910e-02, -8.438e-03, 2.481e-02, -4.870e-02, -6.791e-03, 1.061e-01, 3.995e-02, -4.022e-03, -6.221e-03, -5.024e-02)); + r += mul(s5_0, M4(5.602e-02, -4.308e-02, 9.808e-02, 6.040e-04, 6.339e-02, 5.917e-02, -4.881e-02, -9.820e-02, -4.466e-02, 7.009e-03, 2.818e-02, -3.478e-02, 1.907e-02, -1.026e-01, -2.022e-02, -9.760e-02)); + r += mul(s5_1, M4(-1.070e-01, -1.691e-03, 9.849e-02, 1.522e-01, -7.722e-03, 2.113e-02, -9.818e-02, -5.139e-02, 1.086e-01, -3.740e-02, 5.049e-02, -2.643e-02, 9.843e-03, 4.505e-02, -6.481e-02, 2.022e-02)); + r += mul(s5_2, M4(-9.071e-02, -6.706e-02, -2.061e-02, 1.538e-01, -3.540e-02, 2.135e-02, 9.540e-04, 3.653e-02, 1.507e-01, 1.192e-01, 1.021e-01, -8.306e-03, -4.461e-02, -5.049e-02, -1.124e-01, 9.884e-03)); + r += mul(s5_3, M4(6.294e-02, -1.282e-01, 3.868e-02, -1.814e-01, 4.439e-02, 7.000e-02, -1.362e-01, 7.447e-02, 2.668e-02, 4.819e-02, -5.729e-02, 8.139e-03, -5.443e-02, 9.531e-02, 1.156e-01, 4.085e-02)); + r += mul(s5_4, M4(-8.484e-03, 6.197e-03, 6.633e-02, 1.655e-01, 6.602e-02, -7.951e-02, -1.966e-01, 1.283e-01, -1.011e-01, 4.280e-02, -5.414e-02, -2.545e-01, -1.495e-01, -6.738e-02, 1.571e-02, -1.941e-01)); + r += mul(s5_5, M4(2.349e-01, 9.500e-02, -1.113e-01, -2.583e-02, 2.032e-02, 5.190e-02, -1.364e-01, -4.065e-02, -1.637e-01, 1.754e-02, -2.211e-02, -5.600e-02, 2.849e-01, 5.747e-02, -2.978e-02, 5.666e-02)); + r += mul(s5_6, M4(-6.206e-02, 2.496e-02, 2.480e-02, 3.657e-02, -1.159e-01, 5.506e-02, -1.441e-01, -2.198e-02, 2.306e-03, 9.180e-02, 2.019e-02, -4.232e-04, 2.116e-02, -2.850e-02, -4.118e-02, -3.627e-02)); + r += mul(s5_7, M4(8.919e-02, -4.855e-02, 6.477e-02, 1.439e-01, -6.477e-02, 1.138e-01, -9.273e-02, -2.459e-02, 2.984e-02, -5.195e-02, 5.993e-02, 1.544e-02, 1.065e-01, 5.338e-02, 5.271e-02, 1.000e-01)); + r += mul(s5_8, M4(1.037e-01, -3.917e-02, 1.450e-02, -5.118e-02, -5.068e-02, 3.593e-02, -2.183e-01, -2.920e-02, -8.386e-02, -5.458e-02, 8.985e-02, 4.988e-02, 7.487e-02, 2.530e-02, 5.512e-02, -2.582e-02)); + r += mul(s6_0, M4(-1.468e-02, 3.283e-02, 2.486e-01, -2.172e-02, -3.365e-02, -7.289e-02, -1.009e-01, 3.873e-02, -5.674e-02, -2.549e-03, -4.322e-02, 7.819e-03, 4.291e-02, -9.667e-02, -7.909e-04, -1.967e-01)); + r += mul(s6_1, M4(-2.950e-02, -1.050e-01, 1.905e-01, 3.581e-01, 6.321e-02, -6.692e-02, -6.391e-03, -6.914e-04, 3.219e-02, -4.255e-02, -6.420e-02, -7.836e-02, 2.385e-01, 2.386e-02, 3.324e-02, 5.495e-02)); + r += mul(s6_2, M4(8.648e-02, 9.869e-02, 3.091e-01, -5.345e-02, 7.443e-02, 1.316e-02, -1.180e-02, 3.567e-02, -2.939e-02, 1.190e-02, -5.904e-02, -9.631e-03, 1.171e-01, 1.086e-01, -4.678e-02, 3.794e-02)); + r += mul(s6_3, M4(-4.051e-02, -8.971e-02, -3.028e-01, 1.302e-01, 4.434e-02, -2.039e-02, -9.829e-02, 1.112e-02, 1.413e-01, 2.567e-01, 3.658e-02, -6.832e-02, -1.298e-01, -1.938e-01, 7.153e-02, -1.650e-02)); + r += mul(s6_4, M4(-8.773e-02, -2.883e-01, -4.347e-01, 1.199e-01, -4.540e-02, 3.200e-02, 9.576e-02, 6.254e-03, -1.749e-01, 2.754e-01, -3.059e-01, -8.842e-02, -3.085e-01, -1.033e-01, -4.969e-02, -1.340e-01)); + r += mul(s6_5, M4(-7.059e-02, 3.359e-03, -2.079e-01, 4.492e-02, -7.667e-02, -1.844e-02, 1.917e-01, 1.008e-02, -9.998e-02, -9.386e-02, -1.054e-01, -4.729e-02, -2.093e-01, -9.179e-02, 1.722e-01, 3.993e-02)); + r += mul(s6_6, M4(-7.153e-02, 5.159e-02, 8.474e-02, 1.321e-01, 1.886e-02, -1.753e-02, -5.105e-02, 5.375e-02, 4.419e-02, 1.282e-01, 4.456e-02, 9.137e-02, -4.818e-02, -1.826e-02, -1.290e-01, -3.767e-02)); + r += mul(s6_7, M4(-9.777e-02, 1.020e-01, -1.329e-01, -1.994e-01, 4.367e-02, 2.940e-02, -1.080e-01, 9.001e-02, 3.387e-01, 1.146e-01, 2.638e-01, 9.648e-02, -1.823e-01, -3.080e-02, 1.478e-01, 2.614e-02)); + r += mul(s6_8, M4(-5.921e-02, -3.250e-02, 4.172e-02, -7.936e-02, -5.095e-02, 2.877e-02, -1.530e-01, -9.587e-02, 2.092e-02, 7.210e-02, 1.127e-01, 3.929e-02, -8.320e-02, -3.228e-03, 1.452e-01, 1.284e-01)); + r += mul(s7_0, M4(-5.253e-02, 2.278e-02, 6.018e-02, 9.507e-02, 3.973e-02, 6.387e-02, 6.711e-03, -4.682e-02, -1.063e-01, 4.267e-03, 2.971e-02, -4.539e-02, 1.165e-01, -7.157e-02, 4.141e-02, 1.145e-01)); + r += mul(s7_1, M4(-4.652e-02, 7.815e-02, -1.048e-01, -4.295e-02, 1.362e-01, 6.352e-02, -2.051e-04, 2.946e-02, -1.731e-01, 3.810e-02, -8.881e-02, -2.138e-02, 9.736e-02, -3.249e-02, 6.547e-02, 1.465e-02)); + r += mul(s7_2, M4(-1.197e-01, -2.140e-02, -1.381e-02, -1.613e-02, 9.536e-02, 2.392e-02, -1.832e-02, -4.791e-03, -4.896e-02, -5.699e-03, 9.083e-03, -6.092e-02, 2.628e-02, 6.739e-02, 3.363e-02, 7.787e-02)); + r += mul(s7_3, M4(2.299e-02, -1.116e-01, -1.895e-01, 6.158e-02, -2.903e-02, 1.976e-01, -5.169e-02, -6.359e-03, -1.108e-01, -2.721e-02, -4.755e-02, 1.108e-02, -5.540e-03, 5.188e-02, 4.148e-02, 2.312e-01)); + r += mul(s7_4, M4(5.459e-02, -1.114e-01, -2.955e-01, 2.604e-02, -7.562e-02, 3.799e-02, 7.620e-02, -8.782e-02, -4.982e-01, -4.289e-02, -1.030e-01, 5.294e-02, -5.541e-02, -6.984e-02, 1.854e-02, -2.165e-02)); + r += mul(s7_5, M4(-1.309e-01, 1.373e-01, 1.565e-02, -2.078e-02, -2.317e-02, 4.668e-03, 1.389e-01, -7.272e-02, -1.375e-01, 4.768e-02, 8.811e-02, -1.680e-04, 9.234e-03, -6.011e-04, 1.287e-02, 1.274e-01)); + r += mul(s7_6, M4(-3.351e-02, -1.516e-02, 1.227e-02, 1.531e-02, -3.170e-02, 1.613e-01, 6.721e-02, 6.211e-02, 2.716e-02, -1.389e-01, 3.411e-02, 1.396e-03, -9.898e-02, 6.533e-03, -3.053e-02, -7.764e-03)); + r += mul(s7_7, M4(-5.799e-02, -7.095e-03, -7.659e-02, 1.150e-01, -2.979e-02, 5.477e-02, -1.147e-01, 7.278e-02, -1.017e-01, -9.430e-02, -4.289e-02, 1.574e-01, -8.640e-02, -4.577e-02, -1.199e-01, -1.743e-01)); + r += mul(s7_8, M4(7.061e-02, -4.189e-02, -3.871e-03, -3.726e-02, -2.013e-02, 1.605e-02, -8.725e-02, -6.317e-02, -1.159e-01, -6.920e-02, -9.147e-02, -1.023e-02, 6.410e-03, 3.396e-02, -2.014e-02, 6.373e-02)); + r += V4(5.089e-03, 6.337e-03, -1.003e-03, -8.375e-03); + return r; +} + +V4 f3(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(3.675e-02, 5.997e-02, -3.650e-02, -9.469e-02, -1.309e-03, -1.026e-02, -4.568e-02, 1.177e-02, -2.319e-02, 3.435e-02, -4.605e-03, 8.751e-03, -1.265e-01, 7.075e-05, 1.598e-03, -7.128e-03)); + r += mul(s0_1, M4(-3.769e-02, 1.289e-01, 7.292e-02, 2.980e-02, -1.155e-01, -6.349e-02, 7.930e-02, -2.253e-02, -2.302e-02, -2.740e-02, 5.069e-03, 2.801e-02, -1.855e-01, -2.358e-01, -4.332e-02, 4.699e-02)); + r += mul(s0_2, M4(3.070e-02, 8.126e-02, -8.298e-02, 2.904e-03, 8.344e-02, -9.977e-02, -2.161e-01, -1.270e-02, 5.156e-02, -1.070e-01, 3.527e-02, -1.041e-02, -7.620e-02, -1.792e-01, -7.605e-02, -2.338e-02)); + r += mul(s0_3, M4(8.779e-02, 1.977e-02, 8.397e-03, -6.088e-02, -4.488e-02, 3.835e-03, -3.778e-02, 3.318e-04, 2.340e-01, 1.722e-01, -1.464e-01, 2.562e-02, 1.394e-01, -1.146e-01, 3.923e-02, -3.789e-02)); + r += mul(s0_4, M4(-1.314e-01, 4.759e-02, -1.111e-01, -8.904e-02, 2.705e-01, -1.703e-01, 2.401e-01, -3.214e-01, 3.357e-01, -3.734e-02, 1.988e-01, -1.702e-01, 6.567e-02, -3.786e-01, -6.481e-02, 7.642e-02)); + r += mul(s0_5, M4(-2.133e-02, 5.389e-02, -1.925e-02, 1.168e-02, -6.679e-02, -1.289e-01, 1.040e-02, -1.619e-01, 5.680e-02, 4.877e-02, 5.648e-02, 5.265e-02, 1.574e-01, -3.657e-01, -1.724e-01, 6.129e-02)); + r += mul(s0_6, M4(6.074e-03, -7.729e-02, -1.006e-01, -1.152e-02, 9.523e-02, -6.766e-02, -2.787e-03, 9.933e-03, 6.489e-02, -5.330e-02, -8.086e-04, -9.893e-02, 4.494e-02, -1.720e-01, 7.374e-02, 7.742e-02)); + r += mul(s0_7, M4(-1.204e-01, 7.328e-02, 7.396e-02, -1.209e-01, 9.194e-02, -1.228e-01, 4.137e-02, 4.043e-02, -1.156e-01, -2.074e-02, -5.843e-02, -4.110e-03, -2.273e-01, 8.433e-02, -1.024e-02, 3.197e-03)); + r += mul(s0_8, M4(-4.821e-02, -4.134e-02, -1.442e-01, -8.328e-02, 2.852e-02, 3.135e-02, 6.543e-03, 2.640e-02, 4.538e-02, 9.523e-02, 1.585e-02, -9.692e-02, -6.346e-02, -1.823e-01, -4.534e-02, 3.876e-02)); + r += mul(s1_0, M4(2.361e-02, -8.350e-02, 1.339e-01, -7.668e-02, -7.288e-02, 5.647e-02, 2.951e-02, -8.884e-02, -2.109e-02, 6.377e-02, 3.692e-01, -5.184e-02, 6.710e-02, -1.169e-01, 4.998e-02, -1.445e-02)); + r += mul(s1_1, M4(3.144e-02, -8.041e-02, 2.650e-01, 5.868e-02, 3.754e-02, 1.225e-01, -5.726e-02, 2.163e-01, 2.362e-02, 1.440e-01, 1.214e-01, 3.473e-04, -1.772e-01, 1.047e-01, -8.946e-02, 8.762e-02)); + r += mul(s1_2, M4(-1.873e-01, 3.456e-03, -3.806e-02, 9.440e-02, 7.302e-02, 1.553e-02, -4.385e-02, -2.931e-02, -5.164e-02, 1.311e-01, 3.349e-02, -1.530e-02, 1.267e-01, 3.255e-02, 1.438e-02, 2.959e-02)); + r += mul(s1_3, M4(1.597e-01, -1.768e-01, 1.526e-01, 5.055e-02, -5.962e-03, -1.644e-01, -8.546e-02, -4.917e-02, -1.387e-01, -6.411e-02, 4.689e-01, -1.519e-01, 2.620e-02, -2.779e-02, -7.039e-02, -4.236e-02)); + r += mul(s1_4, M4(2.026e-02, -4.697e-01, 9.243e-02, -2.950e-01, 5.595e-02, -1.964e-01, -1.564e-01, -4.191e-01, -3.245e-01, -4.436e-02, 1.247e-01, -2.702e-01, -3.343e-03, -9.253e-03, 1.241e-01, -5.372e-02)); + r += mul(s1_5, M4(-1.612e-01, -3.095e-01, -1.355e-02, 1.140e-01, -1.342e-01, 2.531e-01, 2.424e-01, -2.119e-02, -6.644e-02, -1.501e-02, -3.428e-02, 1.780e-02, -1.017e-01, 7.337e-02, -1.332e-02, 1.211e-01)); + r += mul(s1_6, M4(1.561e-01, -6.944e-02, 4.193e-02, 8.192e-02, 1.577e-01, 1.281e-02, -1.118e-01, -5.691e-02, -2.364e-02, 1.690e-02, 1.312e-01, 8.214e-02, 7.732e-02, 1.035e-01, 3.027e-02, -1.452e-02)); + r += mul(s1_7, M4(1.421e-01, -2.347e-01, 2.118e-02, 1.315e-01, 1.566e-01, 1.144e-01, 1.285e-01, 4.122e-02, -3.384e-02, 8.157e-02, -1.205e-01, 1.959e-02, -6.363e-02, 1.399e-01, 5.847e-02, 4.064e-02)); + r += mul(s1_8, M4(1.111e-02, -8.978e-02, -5.925e-02, -7.568e-02, 1.495e-01, 2.570e-01, -5.507e-04, 2.520e-02, -1.118e-02, -9.439e-02, -6.084e-02, -5.373e-02, -1.533e-03, 1.219e-01, -1.389e-02, -1.508e-01)); + r += mul(s2_0, M4(-4.162e-02, -4.071e-02, -5.766e-02, 5.628e-03, -6.182e-02, 4.116e-02, 1.410e-02, -1.759e-02, 2.086e-01, -1.512e-01, -1.230e-01, -1.002e-01, 4.260e-02, -2.905e-02, 8.458e-02, 1.022e-02)); + r += mul(s2_1, M4(3.019e-02, -1.456e-01, -1.264e-01, -4.691e-02, 7.353e-02, 5.608e-02, -1.380e-01, -4.886e-02, -7.036e-02, 1.277e-01, -1.796e-01, -2.979e-01, -3.455e-01, 1.449e-01, 7.792e-02, -7.989e-02)); + r += mul(s2_2, M4(8.347e-02, -4.100e-03, -3.079e-02, 1.025e-01, 8.068e-02, 1.296e-01, 8.245e-02, 1.703e-02, 1.256e-01, 2.133e-02, 1.571e-01, -8.556e-02, -1.067e-01, -1.455e-01, -2.035e-02, -6.335e-02)); + r += mul(s2_3, M4(-4.614e-02, 7.387e-02, 1.166e-01, -7.077e-02, -2.393e-02, 1.081e-01, -2.396e-01, 8.131e-02, -3.251e-03, -4.704e-02, -7.487e-02, 7.985e-03, -1.166e-01, -4.941e-02, 1.027e-02, 1.565e-01)); + r += mul(s2_4, M4(4.681e-02, -1.264e-02, 1.491e-01, 4.652e-02, -1.520e-03, 2.008e-01, -8.360e-02, -1.407e-01, -6.069e-02, 3.109e-01, -1.926e-02, -1.985e-02, -8.434e-02, -1.484e-02, 1.761e-01, -4.318e-02)); + r += mul(s2_5, M4(-3.128e-01, -4.635e-02, 1.431e-01, 1.348e-01, 1.183e-01, 4.978e-02, 1.522e-01, -9.026e-02, 1.138e-01, 1.307e-01, -4.564e-02, -1.154e-01, -3.911e-03, 8.876e-04, -1.357e-01, -1.134e-01)); + r += mul(s2_6, M4(-2.743e-02, 3.054e-02, 6.684e-02, 9.738e-04, -2.262e-01, 1.640e-01, -3.429e-02, -1.071e-02, -6.768e-02, -2.352e-02, -2.361e-01, -3.020e-01, 1.184e-02, 7.232e-02, 3.476e-02, -9.865e-03)); + r += mul(s2_7, M4(-2.802e-01, -2.529e-01, -1.229e-01, -1.349e-01, -5.267e-02, 1.006e-01, -2.282e-02, -3.943e-02, 3.723e-01, -2.812e-01, 3.149e-01, 1.970e-02, -3.297e-02, -1.841e-01, 9.541e-02, 1.027e-01)); + r += mul(s2_8, M4(1.147e-02, -8.793e-03, 1.588e-01, -1.293e-02, -1.458e-01, 1.161e-01, -2.741e-02, -6.339e-02, 3.385e-02, 6.893e-02, -6.859e-02, -1.301e-01, 4.266e-02, 4.091e-03, 9.147e-03, -6.810e-02)); + r += mul(s3_0, M4(5.698e-02, 8.608e-02, -7.571e-02, -1.704e-02, 7.851e-02, -7.372e-02, 4.605e-02, -3.019e-02, -3.718e-02, -2.448e-02, -3.068e-02, -5.345e-02, 1.398e-01, -1.581e-02, -1.463e-01, -8.957e-02)); + r += mul(s3_1, M4(3.903e-02, 1.542e-02, -1.304e-01, 2.455e-02, 6.567e-02, -2.254e-02, 1.981e-02, 8.340e-02, -8.381e-02, 8.334e-02, -1.282e-01, -6.353e-03, -3.466e-02, 9.503e-02, 2.178e-02, 2.268e-02)); + r += mul(s3_2, M4(7.165e-02, 6.839e-02, -1.454e-02, -2.518e-02, -3.534e-02, 6.600e-02, -3.333e-02, 1.099e-02, -5.149e-02, -5.962e-02, 3.705e-02, 8.507e-03, 1.171e-01, -5.122e-02, 1.308e-01, -7.599e-02)); + r += mul(s3_3, M4(-4.663e-02, -1.340e-02, -1.379e-01, 2.231e-03, -2.979e-02, 4.621e-02, -1.211e-01, -7.539e-02, -1.957e-02, 1.509e-01, -6.523e-03, -1.156e-01, 6.592e-02, -4.868e-02, 6.305e-03, -1.144e-01)); + r += mul(s3_4, M4(2.060e-01, 2.034e-03, -7.575e-03, 1.314e-01, -8.559e-02, -9.837e-02, 5.653e-02, -1.914e-01, 1.889e-02, 3.174e-02, -8.599e-02, 8.587e-02, 2.706e-01, -4.214e-02, 6.817e-02, -3.622e-01)); + r += mul(s3_5, M4(-5.971e-02, 1.780e-01, 1.817e-03, 1.477e-02, 2.373e-02, -2.837e-01, 2.382e-02, -9.675e-02, 1.090e-01, 1.249e-01, 1.647e-01, -2.997e-02, 2.477e-01, 1.275e-01, -6.222e-02, -1.336e-02)); + r += mul(s3_6, M4(-1.423e-02, 6.043e-02, 4.517e-02, -2.434e-02, -2.237e-03, 1.330e-01, -2.076e-02, 5.665e-02, -1.149e-01, -8.142e-02, 1.748e-02, 4.757e-02, 7.014e-02, -4.076e-03, 1.268e-02, 2.145e-02)); + r += mul(s3_7, M4(-1.785e-01, -7.156e-02, -2.492e-02, 4.320e-02, -1.728e-02, 1.034e-02, 5.533e-02, -5.906e-02, -1.259e-03, -1.854e-02, -5.582e-02, 3.797e-03, 3.889e-02, -7.529e-02, 2.445e-02, 8.897e-02)); + r += mul(s3_8, M4(-4.278e-02, 5.844e-02, 1.486e-02, -7.576e-03, -7.155e-03, -1.057e-01, -2.649e-02, -5.033e-03, 3.644e-02, 3.797e-02, 4.688e-02, 3.603e-02, 7.478e-02, 4.200e-02, 4.086e-02, 1.633e-02)); + r += mul(s4_0, M4(2.954e-02, 6.368e-02, 1.124e-02, 1.156e-02, -7.933e-02, 6.929e-02, 1.515e-02, 3.256e-02, -3.112e-02, 1.080e-01, -1.936e-01, -3.785e-02, -9.351e-02, -1.354e-01, 2.461e-01, -5.817e-02)); + r += mul(s4_1, M4(2.363e-02, -2.653e-02, -1.473e-01, 3.505e-02, 2.167e-02, -6.371e-02, 9.751e-02, -2.605e-02, -1.820e-01, -1.218e-01, 9.630e-02, -7.706e-02, -2.210e-01, -1.898e-01, 2.049e-01, -3.112e-02)); + r += mul(s4_2, M4(4.299e-02, 1.021e-01, 8.898e-02, 3.527e-02, -5.120e-02, -2.351e-01, 2.368e-02, 3.834e-02, -4.556e-02, -1.265e-01, -6.203e-02, -2.289e-02, 9.493e-02, -1.414e-02, 6.036e-03, -5.510e-02)); + r += mul(s4_3, M4(-3.797e-02, 3.851e-02, -9.470e-02, 5.490e-02, 6.167e-02, -1.562e-02, 1.131e-01, -9.297e-02, 1.683e-03, 1.295e-02, -6.105e-02, 1.045e-02, -1.353e-01, 1.796e-01, 1.789e-01, -1.213e-01)); + r += mul(s4_4, M4(-8.445e-02, 8.678e-02, -1.243e-01, -2.097e-02, -1.798e-01, 1.405e-01, 1.165e-01, 1.772e-01, 1.905e-01, 4.926e-02, 1.375e-01, -3.092e-02, 2.535e-01, 1.857e-02, -1.840e-01, -2.340e-01)); + r += mul(s4_5, M4(1.488e-01, 1.463e-01, 5.667e-02, -1.390e-02, 3.493e-02, 5.218e-03, 4.365e-02, 7.459e-02, -1.294e-01, -1.785e-01, -1.037e-01, -9.532e-02, -4.308e-02, -7.546e-02, 7.063e-02, -1.180e-02)); + r += mul(s4_6, M4(-5.328e-02, 1.059e-01, -4.184e-02, -2.673e-02, -1.184e-01, 7.588e-02, 7.261e-02, -9.560e-05, -1.074e-01, 3.232e-02, 2.400e-02, -6.284e-02, -1.591e-01, -5.297e-02, 1.021e-01, 1.491e-02)); + r += mul(s4_7, M4(-5.382e-02, -1.088e-01, -2.641e-03, -3.996e-03, -1.735e-01, 1.856e-01, 1.465e-01, -1.005e-01, -5.233e-02, -7.944e-03, 8.574e-02, 3.987e-02, -1.473e-01, -4.357e-01, -1.162e-02, 7.022e-02)); + r += mul(s4_8, M4(1.801e-01, 8.448e-02, 4.178e-02, -3.872e-02, 4.254e-02, -1.712e-01, 3.371e-03, -8.948e-02, 1.224e-02, -9.654e-02, -3.794e-02, 4.958e-02, 8.737e-02, 6.929e-02, -1.333e-01, -2.040e-02)); + r += mul(s5_0, M4(-4.158e-02, 2.599e-02, 7.901e-02, 8.321e-03, -1.736e-01, -6.602e-02, -6.660e-02, 8.860e-02, 1.724e-02, 1.033e-02, -8.451e-02, -2.804e-02, 3.716e-02, 3.139e-02, -1.055e-03, 2.071e-02)); + r += mul(s5_1, M4(2.268e-01, -1.047e-01, -1.858e-01, 5.456e-02, -1.151e-01, -2.588e-01, -3.722e-02, 3.701e-02, 6.879e-02, -8.261e-02, 2.911e-02, 6.549e-02, -2.712e-02, 4.789e-02, 1.068e-01, -1.197e-01)); + r += mul(s5_2, M4(-4.443e-02, -9.052e-02, -4.703e-02, 4.579e-03, -1.075e-01, -1.352e-01, -7.144e-02, -9.541e-03, 1.335e-01, -5.074e-03, 5.284e-02, 2.923e-02, 6.626e-02, 1.579e-03, 4.798e-02, -1.005e-01)); + r += mul(s5_3, M4(-1.143e-01, -1.722e-01, 2.441e-02, 1.310e-01, 3.420e-02, -5.373e-02, 7.689e-02, -4.045e-02, 1.203e-01, -9.565e-02, -7.908e-02, -2.734e-02, 1.031e-01, -3.036e-02, 9.257e-03, -9.268e-02)); + r += mul(s5_4, M4(-3.542e-02, -1.875e-01, 2.537e-02, -2.439e-02, -9.876e-02, -3.396e-02, 6.292e-02, 6.549e-02, 1.529e-01, -4.029e-02, 2.000e-01, 1.193e-01, -2.729e-02, -1.903e-02, -1.803e-01, -1.793e-02)); + r += mul(s5_5, M4(-6.030e-02, -1.222e-01, -1.170e-01, 2.348e-01, 6.808e-02, -3.617e-02, -7.631e-02, -2.720e-02, -2.292e-01, -3.099e-01, -8.020e-03, -1.038e-01, 6.242e-02, 5.190e-02, 8.095e-02, 9.514e-02)); + r += mul(s5_6, M4(6.978e-03, -6.634e-02, 4.558e-02, -5.632e-02, 3.886e-02, 1.042e-01, 6.360e-03, 1.132e-01, -5.098e-02, 8.961e-02, 9.910e-02, 8.475e-02, 8.224e-02, -4.271e-02, -7.546e-02, 2.300e-03)); + r += mul(s5_7, M4(6.222e-02, -3.369e-01, -6.016e-02, -2.080e-01, -1.476e-01, 1.600e-01, -9.421e-02, 1.922e-03, 6.097e-02, 1.039e-01, 6.280e-02, -4.231e-02, 3.617e-02, -2.071e-01, -2.099e-02, -7.936e-02)); + r += mul(s5_8, M4(1.362e-02, -2.364e-01, -2.881e-02, -1.893e-01, -4.383e-02, -5.227e-02, -6.600e-02, -2.155e-02, 1.962e-02, -4.751e-05, -1.398e-01, 9.889e-02, 1.032e-01, 2.337e-02, 2.391e-02, 4.492e-02)); + r += mul(s6_0, M4(3.002e-02, -2.149e-01, -5.255e-02, -1.344e-01, 5.155e-03, -4.274e-02, -1.978e-02, -2.494e-02, -7.873e-03, -4.412e-02, 2.502e-02, -4.448e-02, 2.398e-01, 1.624e-01, -9.287e-02, -6.755e-02)); + r += mul(s6_1, M4(-1.541e-02, 1.594e-01, 2.824e-02, 1.672e-01, 1.304e-01, -3.634e-02, -1.861e-02, 2.413e-02, 8.032e-02, 5.426e-02, 7.488e-02, -4.554e-02, 1.686e-01, 2.354e-01, 2.844e-01, -8.371e-02)); + r += mul(s6_2, M4(-2.267e-02, -7.544e-02, -8.038e-02, 1.154e-01, 1.699e-02, 8.058e-02, 7.575e-03, 4.182e-03, 2.275e-02, 8.964e-02, -7.309e-03, -7.329e-02, 7.492e-02, 1.014e-01, -4.596e-03, -2.045e-02)); + r += mul(s6_3, M4(2.319e-01, 3.723e-02, -1.344e-01, 1.486e-01, 4.493e-02, -4.327e-02, -8.266e-02, 3.615e-02, -1.576e-01, 2.074e-02, -5.127e-02, 3.548e-02, -5.083e-03, 2.821e-01, 1.122e-01, -7.263e-03)); + r += mul(s6_4, M4(-2.149e-03, -2.494e-01, -9.982e-02, -8.301e-01, 1.845e-01, -1.506e-01, -3.571e-03, -2.393e-02, -1.104e-01, -5.359e-02, -2.173e-02, 4.126e-02, 1.100e-01, -4.346e-02, 2.896e-01, 8.233e-03)); + r += mul(s6_5, M4(-8.545e-02, -7.732e-02, 7.867e-02, -2.736e-01, 1.708e-01, -1.131e-02, -3.363e-02, 3.079e-02, -1.554e-01, -4.239e-02, 5.462e-02, -1.106e-01, 4.246e-02, 9.369e-02, 1.026e-02, -2.496e-02)); + r += mul(s6_6, M4(-1.443e-01, 2.616e-02, 7.678e-02, -3.301e-02, -1.494e-04, -2.239e-02, -8.535e-02, 2.077e-02, -2.918e-01, 5.707e-02, 9.960e-02, 1.440e-02, 2.924e-02, 1.643e-02, -2.174e-02, 8.667e-03)); + r += mul(s6_7, M4(2.497e-01, 3.967e-02, -7.436e-02, 4.780e-01, 1.139e-01, 6.077e-02, 3.787e-02, 3.072e-02, 4.866e-02, -3.114e-02, 2.210e-01, 5.498e-01, 2.244e-03, 1.709e-01, 1.689e-01, 1.226e-01)); + r += mul(s6_8, M4(-9.497e-02, 1.582e-01, 9.806e-02, 2.241e-01, 1.024e-01, 1.254e-01, 9.498e-02, -7.761e-03, -1.223e-02, 6.641e-02, 1.096e-01, 6.125e-03, 3.307e-02, -2.369e-02, -4.217e-02, -1.282e-01)); + r += mul(s7_0, M4(-4.745e-02, 6.797e-02, -7.921e-02, -2.684e-02, -4.855e-02, -6.523e-02, 6.867e-02, -7.047e-02, 7.915e-02, 4.574e-02, -2.760e-02, -1.326e-02, 1.022e-02, -3.943e-02, 1.583e-01, -4.302e-02)); + r += mul(s7_1, M4(-1.258e-01, -6.023e-02, -3.607e-02, 3.000e-02, -4.323e-02, 1.399e-01, -3.115e-02, -7.780e-03, 1.587e-01, -1.995e-02, -1.057e-02, -3.390e-02, -1.875e-02, -7.517e-02, 8.273e-02, -1.273e-02)); + r += mul(s7_2, M4(-9.371e-02, 1.472e-01, 7.151e-02, -2.068e-02, -6.272e-02, 1.100e-01, -3.908e-03, -3.746e-02, 1.264e-01, -2.117e-03, -5.027e-03, 9.286e-03, 1.609e-03, -6.072e-02, 7.644e-05, -7.595e-02)); + r += mul(s7_3, M4(-8.126e-02, 1.954e-02, 1.255e-01, 1.604e-02, -4.537e-02, -1.292e-01, 8.680e-02, -1.509e-02, -3.346e-04, -5.120e-03, 2.588e-02, 1.256e-03, 1.354e-01, 9.971e-03, 3.504e-02, 1.009e-02)); + r += mul(s7_4, M4(-1.952e-04, -2.518e-01, -1.969e-01, 1.067e-01, -1.505e-01, 7.530e-02, 1.211e-01, -7.975e-02, -4.654e-02, -1.149e-01, -8.681e-02, 3.955e-02, 1.141e-01, -1.718e-01, 1.252e-01, -8.142e-02)); + r += mul(s7_5, M4(-6.035e-02, 5.333e-02, -4.389e-02, -9.822e-02, -7.485e-02, 7.244e-02, 7.671e-03, -4.813e-02, 1.363e-01, -3.805e-02, -1.642e-01, -1.544e-01, -3.469e-02, 6.749e-02, -5.906e-02, -1.140e-02)); + r += mul(s7_6, M4(6.610e-02, -1.710e-02, -3.299e-02, -7.538e-02, -1.988e-01, -1.846e-02, 8.273e-02, 1.009e-01, 1.600e-01, 1.211e-02, 5.993e-02, -5.980e-02, -9.680e-02, 9.439e-02, 1.498e-01, 1.416e-01)); + r += mul(s7_7, M4(2.026e-02, -7.128e-02, -1.125e-01, -6.044e-02, -1.754e-01, 7.820e-02, -4.586e-02, 1.090e-01, 1.076e-02, -9.473e-02, -1.519e-02, 7.060e-02, -1.306e-01, 2.420e-01, -4.872e-02, 1.552e-01)); + r += mul(s7_8, M4(-4.903e-02, -4.213e-02, 6.470e-02, -2.639e-02, -1.248e-01, -3.860e-02, 6.273e-02, 4.119e-03, 1.416e-01, 1.482e-01, -1.337e-01, -1.764e-01, -6.911e-02, 4.784e-02, 5.185e-02, 1.931e-02)); + r += V4(-1.894e-02, -4.402e-03, -8.438e-03, -1.903e-03); + return r; +} + +void Pass5(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = Rmp8x8(tid.x) + blockStart; + uint2 size = GetInputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = (gxy + 0.5) * pt; + + V4 s0_0 = l0(-1.0, -1.0); + V4 s0_1 = l0(0.0, -1.0); + V4 s0_2 = l0(1.0, -1.0); + V4 s0_3 = l0(-1.0, 0.0); + V4 s0_4 = l0(0.0, 0.0); + V4 s0_5 = l0(1.0, 0.0); + V4 s0_6 = l0(-1.0, 1.0); + V4 s0_7 = l0(0.0, 1.0); + V4 s0_8 = l0(1.0, 1.0); + V4 s1_0 = -max(-s0_0, 0.0); + V4 s1_1 = -max(-s0_1, 0.0); + V4 s1_2 = -max(-s0_2, 0.0); + V4 s1_3 = -max(-s0_3, 0.0); + V4 s1_4 = -max(-s0_4, 0.0); + V4 s1_5 = -max(-s0_5, 0.0); + V4 s1_6 = -max(-s0_6, 0.0); + V4 s1_7 = -max(-s0_7, 0.0); + V4 s1_8 = -max(-s0_8, 0.0); + s0_0 = max(s0_0, 0.0); + s0_1 = max(s0_1, 0.0); + s0_2 = max(s0_2, 0.0); + s0_3 = max(s0_3, 0.0); + s0_4 = max(s0_4, 0.0); + s0_5 = max(s0_5, 0.0); + s0_6 = max(s0_6, 0.0); + s0_7 = max(s0_7, 0.0); + s0_8 = max(s0_8, 0.0); + + V4 s2_0 = l1(-1.0, -1.0); + V4 s2_1 = l1(0.0, -1.0); + V4 s2_2 = l1(1.0, -1.0); + V4 s2_3 = l1(-1.0, 0.0); + V4 s2_4 = l1(0.0, 0.0); + V4 s2_5 = l1(1.0, 0.0); + V4 s2_6 = l1(-1.0, 1.0); + V4 s2_7 = l1(0.0, 1.0); + V4 s2_8 = l1(1.0, 1.0); + V4 s3_0 = -max(-s2_0, 0.0); + V4 s3_1 = -max(-s2_1, 0.0); + V4 s3_2 = -max(-s2_2, 0.0); + V4 s3_3 = -max(-s2_3, 0.0); + V4 s3_4 = -max(-s2_4, 0.0); + V4 s3_5 = -max(-s2_5, 0.0); + V4 s3_6 = -max(-s2_6, 0.0); + V4 s3_7 = -max(-s2_7, 0.0); + V4 s3_8 = -max(-s2_8, 0.0); + s2_0 = max(s2_0, 0.0); + s2_1 = max(s2_1, 0.0); + s2_2 = max(s2_2, 0.0); + s2_3 = max(s2_3, 0.0); + s2_4 = max(s2_4, 0.0); + s2_5 = max(s2_5, 0.0); + s2_6 = max(s2_6, 0.0); + s2_7 = max(s2_7, 0.0); + s2_8 = max(s2_8, 0.0); + + V4 s4_0 = l2(-1.0, -1.0); + V4 s4_1 = l2(0.0, -1.0); + V4 s4_2 = l2(1.0, -1.0); + V4 s4_3 = l2(-1.0, 0.0); + V4 s4_4 = l2(0.0, 0.0); + V4 s4_5 = l2(1.0, 0.0); + V4 s4_6 = l2(-1.0, 1.0); + V4 s4_7 = l2(0.0, 1.0); + V4 s4_8 = l2(1.0, 1.0); + V4 s5_0 = -max(-s4_0, 0.0); + V4 s5_1 = -max(-s4_1, 0.0); + V4 s5_2 = -max(-s4_2, 0.0); + V4 s5_3 = -max(-s4_3, 0.0); + V4 s5_4 = -max(-s4_4, 0.0); + V4 s5_5 = -max(-s4_5, 0.0); + V4 s5_6 = -max(-s4_6, 0.0); + V4 s5_7 = -max(-s4_7, 0.0); + V4 s5_8 = -max(-s4_8, 0.0); + s4_0 = max(s4_0, 0.0); + s4_1 = max(s4_1, 0.0); + s4_2 = max(s4_2, 0.0); + s4_3 = max(s4_3, 0.0); + s4_4 = max(s4_4, 0.0); + s4_5 = max(s4_5, 0.0); + s4_6 = max(s4_6, 0.0); + s4_7 = max(s4_7, 0.0); + s4_8 = max(s4_8, 0.0); + + V4 s6_0 = l3(-1.0, -1.0); + V4 s6_1 = l3(0.0, -1.0); + V4 s6_2 = l3(1.0, -1.0); + V4 s6_3 = l3(-1.0, 0.0); + V4 s6_4 = l3(0.0, 0.0); + V4 s6_5 = l3(1.0, 0.0); + V4 s6_6 = l3(-1.0, 1.0); + V4 s6_7 = l3(0.0, 1.0); + V4 s6_8 = l3(1.0, 1.0); + V4 s7_0 = -max(-s6_0, 0.0); + V4 s7_1 = -max(-s6_1, 0.0); + V4 s7_2 = -max(-s6_2, 0.0); + V4 s7_3 = -max(-s6_3, 0.0); + V4 s7_4 = -max(-s6_4, 0.0); + V4 s7_5 = -max(-s6_5, 0.0); + V4 s7_6 = -max(-s6_6, 0.0); + V4 s7_7 = -max(-s6_7, 0.0); + V4 s7_8 = -max(-s6_8, 0.0); + s6_0 = max(s6_0, 0.0); + s6_1 = max(s6_1, 0.0); + s6_2 = max(s6_2, 0.0); + s6_3 = max(s6_3, 0.0); + s6_4 = max(s6_4, 0.0); + s6_5 = max(s6_5, 0.0); + s6_6 = max(s6_6, 0.0); + s6_7 = max(s6_7, 0.0); + s6_8 = max(s6_8, 0.0); + + t0[gxy] = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t1[gxy] = f1(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t2[gxy] = f2(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t3[gxy] = f3(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); +} + +//!PASS 6 +//!DESC conv5 +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 +//!IN t0, t1, t2, t3 +//!OUT t4, t5, t6, t7 + +#define l0(x, y) V4(O(t0, float2(x, y))) +#define l1(x, y) V4(O(t1, float2(x, y))) +#define l2(x, y) V4(O(t2, float2(x, y))) +#define l3(x, y) V4(O(t3, float2(x, y))) + +V4 f0(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-2.983e-02, -2.355e-02, 1.340e-02, -1.287e-02, 2.803e-02, -2.711e-02, 3.019e-02, -3.417e-03, 2.946e-01, 2.738e-01, -8.508e-02, 2.910e-01, -6.676e-02, -9.997e-02, 2.409e-02, -7.472e-05)); + r += mul(s0_1, M4(-1.825e-02, 8.480e-02, 4.182e-02, -8.584e-02, -1.625e-02, -2.023e-02, -6.646e-03, -3.011e-02, -5.927e-02, 1.397e-01, -7.290e-02, 1.314e-01, -1.138e-01, -8.384e-02, -8.820e-02, 8.265e-02)); + r += mul(s0_2, M4(-2.600e-02, 2.241e-02, -5.769e-02, -8.343e-02, 1.166e-02, -2.480e-02, 3.902e-02, 5.080e-02, 7.858e-02, 5.016e-02, 5.021e-02, 9.969e-03, -1.482e-01, -4.674e-03, -1.362e-01, -3.118e-03)); + r += mul(s0_3, M4(-9.168e-02, 7.943e-02, -6.831e-03, -4.480e-02, 1.472e-01, -5.284e-02, -1.962e-01, 1.886e-01, 1.174e-01, -1.334e-01, 3.624e-04, 2.994e-01, 3.111e-03, -9.108e-02, 9.959e-02, 6.819e-02)); + r += mul(s0_4, M4(1.782e-01, -3.958e-02, 5.934e-02, 3.938e-02, 5.210e-02, -1.230e-02, 3.478e-01, -3.377e-02, -7.085e-01, 1.658e-01, -3.095e-03, -9.614e-02, 1.435e-01, -2.333e-01, -5.669e-02, 4.046e-02)); + r += mul(s0_5, M4(-1.679e-03, -3.512e-02, -1.010e-01, -2.660e-02, -2.707e-02, -3.091e-02, 9.248e-02, -6.013e-02, -2.270e-03, -4.490e-02, 2.436e-01, 1.211e-01, -1.776e-01, -3.132e-02, -9.672e-02, 2.008e-01)); + r += mul(s0_6, M4(-1.127e-01, -2.387e-02, -8.957e-02, -4.969e-02, 1.061e-01, 7.138e-02, -1.068e-01, -5.554e-02, 3.265e-01, 6.205e-03, -2.548e-01, -9.893e-02, -1.051e-01, -5.722e-03, -3.117e-02, -9.438e-02)); + r += mul(s0_7, M4(-3.578e-02, -2.550e-03, -2.800e-02, 9.891e-02, -1.086e-01, 1.480e-01, -7.757e-02, 4.708e-02, -1.695e-01, 3.290e-01, -5.393e-03, -1.031e-01, -1.637e-01, 1.105e-03, 8.458e-02, -6.238e-02)); + r += mul(s0_8, M4(-7.570e-02, -1.015e-02, 8.985e-02, 1.137e-01, 4.670e-02, 2.523e-02, -2.495e-02, 6.150e-02, 1.182e-01, -1.322e-01, 7.917e-02, -8.437e-02, -5.996e-02, -1.705e-01, -2.269e-02, 5.902e-02)); + r += mul(s1_0, M4(-3.108e-02, 2.095e-02, -5.984e-02, -3.504e-02, 6.117e-02, 5.307e-02, 6.236e-03, -9.603e-02, -2.684e-02, -2.362e-02, -2.378e-02, -2.466e-02, 1.570e-02, -3.570e-02, 1.274e-02, -6.502e-03)); + r += mul(s1_1, M4(-1.283e-03, 4.384e-02, 8.365e-02, 5.915e-02, -1.145e-02, 2.392e-02, 1.088e-01, -1.762e-03, 4.372e-02, -2.140e-02, 4.264e-02, 9.236e-03, -4.373e-03, -4.429e-02, 9.449e-02, -3.923e-02)); + r += mul(s1_2, M4(-1.221e-02, 9.479e-02, 4.346e-02, 2.486e-02, 4.054e-02, -4.108e-02, -2.336e-02, 2.922e-02, -1.015e-01, 4.149e-02, -9.165e-04, -1.976e-02, 2.947e-02, 3.191e-02, 1.560e-01, -1.711e-01)); + r += mul(s1_3, M4(6.241e-02, 6.151e-02, 1.526e-02, -1.081e-01, -7.364e-02, 9.332e-02, -1.636e-01, 2.652e-01, -4.666e-02, -4.395e-02, 2.264e-02, -4.261e-02, 2.372e-02, 2.705e-02, -1.008e-02, 7.214e-02)); + r += mul(s1_4, M4(5.696e-02, -7.886e-02, 7.643e-02, -8.079e-02, 1.814e-01, -8.703e-02, 1.432e-01, -6.011e-02, -5.641e-02, -1.646e-01, 3.240e-02, -5.445e-02, 5.017e-02, -2.545e-02, -2.747e-02, -2.010e-01)); + r += mul(s1_5, M4(1.828e-03, -6.594e-02, 1.822e-02, -4.988e-02, 7.417e-03, -6.251e-02, 4.977e-02, -7.883e-02, -3.799e-02, -6.548e-02, -9.739e-02, -6.066e-02, 7.457e-02, 7.262e-02, -1.766e-01, -8.015e-02)); + r += mul(s1_6, M4(9.728e-02, 8.458e-03, -1.198e-02, -7.956e-02, -1.125e-01, 8.212e-04, -3.966e-02, 1.108e-01, 1.952e-02, -1.352e-02, -1.405e-02, -1.585e-02, -2.641e-02, -2.669e-02, 4.201e-02, 3.363e-02)); + r += mul(s1_7, M4(6.647e-02, 3.102e-02, 1.156e-01, -3.595e-03, -3.543e-03, 6.918e-02, -1.841e-01, 2.141e-01, 3.876e-02, 1.731e-02, 8.944e-02, -6.585e-02, 1.066e-01, 4.440e-02, 1.549e-01, 1.150e-01)); + r += mul(s1_8, M4(1.277e-01, -6.115e-02, 1.196e-01, 1.267e-02, -1.131e-02, -1.013e-03, -7.094e-02, -6.453e-02, 9.931e-02, 4.298e-02, 3.554e-02, -2.879e-02, -2.796e-02, 1.079e-01, -6.519e-02, -7.899e-05)); + r += mul(s2_0, M4(3.688e-02, -1.057e-01, 6.859e-02, 7.128e-03, -9.767e-02, -2.339e-01, -1.277e-03, -6.880e-02, 2.195e-02, 5.017e-02, 3.168e-02, -3.514e-02, 5.195e-03, -1.414e-01, 6.491e-03, -9.037e-02)); + r += mul(s2_1, M4(6.062e-02, 6.298e-02, 1.971e-02, 1.479e-02, 2.941e-02, -1.413e-01, -9.835e-02, 1.221e-01, 1.035e-01, 1.188e-01, 9.886e-02, -2.821e-02, -9.335e-02, -1.124e-01, 1.724e-01, -2.172e-01)); + r += mul(s2_2, M4(9.788e-02, -1.209e-02, 1.114e-01, 5.620e-02, -5.509e-02, -5.775e-02, -2.744e-01, -6.316e-02, -4.517e-02, -8.469e-03, 9.252e-02, -7.269e-02, -4.882e-02, -1.046e-01, 3.074e-02, -1.737e-01)); + r += mul(s2_3, M4(1.225e-02, 8.615e-03, 1.241e-01, -3.521e-02, 1.214e-01, -1.194e-01, 2.046e-01, -1.198e-01, -1.477e-01, 1.091e-01, -8.267e-02, -1.965e-02, -4.767e-02, -4.121e-02, -1.680e-02, -1.344e-01)); + r += mul(s2_4, M4(1.174e-01, -4.352e-02, -6.449e-02, -4.885e-02, 2.678e-01, -4.427e-01, 3.447e-01, -2.581e-01, -4.840e-01, 4.853e-01, -1.646e-01, 1.738e-01, -1.628e-02, 4.239e-02, 1.317e-01, -3.075e-01)); + r += mul(s2_5, M4(3.840e-02, -1.366e-01, -2.506e-02, -6.418e-02, 1.866e-01, -1.816e-01, 1.662e-01, -6.389e-02, -8.916e-02, 9.377e-03, 5.231e-02, -1.304e-01, -5.023e-02, -7.681e-02, 1.138e-02, -1.651e-01)); + r += mul(s2_6, M4(4.548e-02, 2.773e-02, 6.133e-02, -8.995e-03, 2.604e-02, 3.399e-02, 4.119e-02, -5.129e-02, -7.591e-02, -7.953e-02, -6.499e-03, 9.256e-02, 8.176e-02, -7.033e-02, -2.963e-02, -1.108e-01)); + r += mul(s2_7, M4(5.637e-02, 2.460e-02, 4.969e-03, 1.028e-02, 9.972e-02, -8.314e-03, 1.056e-01, -8.911e-02, -2.204e-01, -2.369e-02, -1.037e-01, 1.372e-01, 1.047e-01, -6.154e-02, -3.977e-02, -1.519e-01)); + r += mul(s2_8, M4(6.608e-02, 2.095e-02, -7.517e-02, -6.470e-02, 1.252e-02, 3.683e-02, -9.879e-03, -7.856e-02, -1.072e-01, -7.476e-03, 4.455e-02, 3.734e-02, 6.658e-02, -1.017e-01, -1.125e-01, -1.040e-01)); + r += mul(s3_0, M4(5.096e-02, 2.713e-02, -2.334e-02, 6.541e-02, 2.906e-02, 6.274e-02, -8.113e-02, 1.571e-02, -5.359e-02, 2.073e-02, 3.527e-02, -3.818e-02, -3.931e-02, 6.263e-02, -5.998e-02, -1.589e-02)); + r += mul(s3_1, M4(6.973e-02, 1.830e-01, -7.406e-02, 1.496e-01, -3.793e-02, 1.698e-01, -7.125e-02, -6.870e-03, 1.689e-02, 2.680e-02, -1.572e-02, -3.051e-03, -2.107e-02, 3.672e-02, 5.379e-03, 9.172e-02)); + r += mul(s3_2, M4(-1.318e-01, 8.081e-02, -1.517e-01, -4.654e-02, -2.576e-02, 4.760e-02, -2.348e-02, 4.061e-02, -3.277e-02, -3.141e-02, 2.763e-02, -1.285e-01, -4.142e-02, -5.539e-02, -2.869e-02, -1.739e-02)); + r += mul(s3_3, M4(1.962e-02, -2.933e-02, -3.957e-02, 9.155e-02, -1.313e-02, 1.458e-01, 9.674e-02, 9.480e-02, -1.406e-01, -2.761e-02, 3.372e-02, -3.480e-02, -4.371e-02, 3.017e-02, -7.958e-02, 3.795e-02)); + r += mul(s3_4, M4(1.400e-01, 2.186e-01, -2.147e-01, 4.190e-02, -1.207e-01, -1.876e-02, 1.263e-01, -2.033e-01, -1.781e-01, 1.664e-01, -3.067e-01, 2.183e-01, -6.203e-02, -4.359e-03, 1.373e-01, 5.447e-02)); + r += mul(s3_5, M4(-1.102e-01, -2.220e-02, -2.002e-02, -4.875e-02, 8.470e-02, -4.010e-02, 2.741e-02, -4.627e-02, 3.194e-02, -4.281e-02, 3.218e-02, -6.617e-02, -2.043e-02, 4.356e-02, -9.002e-02, 7.398e-02)); + r += mul(s3_6, M4(-1.732e-02, -4.082e-02, -9.573e-03, -1.600e-02, -1.415e-02, -3.000e-02, -9.384e-04, 2.921e-02, -1.245e-01, -4.522e-02, 1.950e-02, -3.415e-02, -4.652e-02, -4.946e-02, -9.613e-02, -5.485e-02)); + r += mul(s3_7, M4(-1.953e-02, -1.297e-02, -7.540e-02, -5.647e-02, 7.540e-02, -1.910e-02, -1.929e-02, 7.800e-03, -7.194e-02, 2.666e-02, 1.040e-02, 5.431e-02, 1.307e-01, -7.904e-02, -9.697e-02, 3.888e-02)); + r += mul(s3_8, M4(-1.090e-02, 4.749e-02, -4.702e-02, 2.379e-02, 6.314e-02, 1.123e-01, 1.127e-02, -8.094e-03, 2.719e-02, 3.356e-02, 6.262e-02, 3.288e-02, -8.982e-02, -1.419e-02, -9.496e-02, -8.593e-03)); + r += mul(s4_0, M4(5.229e-03, -1.874e-02, -1.448e-02, -1.926e-02, -4.822e-02, 5.543e-02, -2.640e-02, -2.112e-02, -3.138e-02, 4.573e-02, -1.124e-01, -1.924e-02, 2.307e-02, 7.430e-02, -1.039e-01, -2.323e-02)); + r += mul(s4_1, M4(1.936e-02, -2.353e-02, -1.491e-02, -2.211e-02, 1.228e-02, 2.580e-02, 4.658e-02, 5.566e-02, 5.166e-02, 1.327e-01, -2.065e-01, 9.453e-02, -3.007e-02, -2.316e-01, -4.635e-02, -1.694e-01)); + r += mul(s4_2, M4(-1.102e-02, 7.086e-02, 5.652e-02, -1.799e-02, 7.982e-02, 7.910e-02, 6.309e-02, 6.261e-02, 4.725e-02, -6.972e-02, -9.501e-02, -6.557e-02, 5.831e-02, -1.474e-01, 1.304e-01, 3.218e-02)); + r += mul(s4_3, M4(-9.656e-02, -8.320e-02, 9.073e-02, -1.961e-01, -4.695e-02, -3.599e-02, 6.276e-02, -7.496e-02, 8.017e-02, -6.791e-02, -1.330e-01, 8.306e-02, 1.257e-01, 5.050e-02, 6.683e-02, 2.878e-01)); + r += mul(s4_4, M4(-4.799e-02, 1.671e-02, -2.723e-01, 3.626e-01, 1.262e-01, 9.708e-02, -3.368e-01, -2.745e-01, 2.264e-01, -9.542e-02, -3.528e-02, 8.713e-02, -1.441e-01, 2.150e-02, 1.147e-02, -1.302e-03)); + r += mul(s4_5, M4(-3.114e-02, 2.848e-02, -2.716e-02, 4.827e-02, -7.087e-03, 2.009e-01, -7.128e-03, 7.284e-02, 6.485e-02, -5.746e-02, 6.051e-02, -1.055e-01, 8.923e-02, -2.384e-01, 2.393e-01, -1.864e-02)); + r += mul(s4_6, M4(1.962e-02, 3.224e-02, 8.620e-02, 4.632e-02, -5.171e-02, 2.773e-02, 1.982e-02, -1.368e-02, 7.032e-02, 1.549e-02, 2.737e-03, -2.220e-02, 1.133e-01, -5.129e-02, -6.812e-02, 2.359e-02)); + r += mul(s4_7, M4(-4.866e-02, 6.495e-02, -2.213e-02, -5.636e-02, 4.421e-02, 2.423e-02, -2.990e-02, 1.080e-01, -8.973e-02, 6.921e-02, -1.620e-02, -9.782e-02, -1.811e-01, 7.043e-02, -3.606e-02, -2.599e-01)); + r += mul(s4_8, M4(3.589e-02, 4.545e-02, 7.728e-02, 3.590e-04, 2.634e-02, 9.737e-02, 1.026e-01, 9.209e-02, -1.511e-02, -6.577e-02, 3.313e-02, -1.148e-01, 1.270e-01, -2.888e-02, -7.045e-02, -1.277e-01)); + r += mul(s5_0, M4(-3.020e-02, -5.183e-03, 5.261e-02, -4.663e-02, -4.414e-03, 9.873e-02, -4.187e-02, -1.327e-02, 7.123e-03, -1.098e-02, -5.922e-04, 7.608e-02, -4.072e-02, -8.271e-02, 2.753e-02, 3.148e-02)); + r += mul(s5_1, M4(6.317e-03, -5.983e-02, 1.294e-01, 1.844e-02, 4.390e-02, 6.267e-02, -1.477e-02, 1.219e-01, 2.467e-01, -2.997e-02, -2.403e-02, -2.382e-02, 8.718e-02, -7.586e-02, 2.001e-02, 5.484e-03)); + r += mul(s5_2, M4(-5.760e-02, 6.528e-02, 1.958e-02, -5.853e-02, 8.200e-02, -2.746e-02, -8.542e-02, -1.933e-02, -1.067e-01, -2.666e-02, -7.423e-03, -4.112e-05, 1.513e-01, -8.296e-02, -4.183e-02, 6.055e-02)); + r += mul(s5_3, M4(-8.693e-02, -9.612e-02, -3.179e-02, -1.840e-01, 2.673e-03, -1.627e-01, 1.450e-01, 1.381e-02, -1.577e-02, -4.878e-02, -3.985e-02, 5.845e-02, -1.944e-02, 3.944e-02, 2.018e-02, -6.841e-02)); + r += mul(s5_4, M4(3.629e-02, 7.570e-02, -2.611e-01, 3.883e-01, 2.307e-02, -7.597e-02, 5.077e-02, -9.529e-02, 7.492e-02, 5.572e-02, 3.370e-02, 5.929e-02, -8.509e-03, 1.385e-01, -1.515e-01, 5.605e-02)); + r += mul(s5_5, M4(-1.791e-02, -6.816e-02, -3.925e-02, 1.986e-03, 8.331e-02, -9.256e-03, 7.505e-03, -6.509e-05, 4.694e-03, 1.398e-02, 6.624e-02, -6.567e-02, -1.356e-01, 4.696e-02, 4.942e-02, 1.464e-01)); + r += mul(s5_6, M4(5.126e-02, 2.097e-02, -5.698e-02, 4.155e-02, 1.072e-01, -1.438e-01, -4.168e-02, -3.538e-02, 8.435e-03, -1.050e-01, 5.704e-02, -9.189e-03, -5.236e-02, -5.514e-02, 9.633e-03, -5.798e-02)); + r += mul(s5_7, M4(-1.121e-01, 3.105e-02, -9.268e-02, -2.804e-02, -3.624e-04, -2.704e-02, 2.646e-02, 5.227e-03, 1.228e-01, -7.355e-02, -1.755e-01, -1.466e-01, -6.640e-02, -5.099e-02, 1.853e-02, -8.626e-02)); + r += mul(s5_8, M4(5.962e-02, 2.513e-02, 2.069e-03, 4.396e-03, -7.240e-02, 9.301e-02, -1.609e-02, -4.861e-02, 5.102e-02, -3.210e-02, 7.308e-02, -3.986e-02, -5.460e-02, -2.136e-02, -8.392e-02, -2.622e-02)); + r += mul(s6_0, M4(3.397e-02, 1.469e-01, 1.022e-02, 3.374e-02, -6.321e-02, -3.230e-02, -5.053e-02, 2.549e-02, 3.016e-02, 5.150e-02, 9.509e-02, 2.499e-02, 7.613e-02, 1.003e-01, 5.365e-02, 1.140e-01)); + r += mul(s6_1, M4(1.483e-02, 2.225e-02, -7.262e-02, -3.496e-02, 1.585e-02, 1.828e-01, -9.560e-02, 1.770e-01, -6.260e-02, 8.682e-03, -7.969e-03, -8.573e-02, -4.427e-03, 1.680e-02, -4.615e-02, -3.744e-02)); + r += mul(s6_2, M4(-1.174e-01, 4.881e-02, -1.090e-01, 3.989e-02, 7.840e-02, 5.978e-02, -7.178e-02, 9.298e-02, 3.747e-02, -8.806e-02, 3.627e-02, -6.363e-02, 1.044e-01, -1.821e-02, 1.555e-01, 1.578e-01)); + r += mul(s6_3, M4(-3.267e-02, -3.088e-02, 6.056e-02, 5.069e-02, -8.374e-03, -2.427e-03, -1.422e-01, -2.646e-02, -1.065e-01, -6.290e-03, -2.208e-02, -1.302e-02, 1.189e-01, 2.485e-01, -7.258e-02, 7.887e-02)); + r += mul(s6_4, M4(8.752e-02, -8.758e-02, 3.225e-02, 4.662e-03, -5.213e-02, 3.250e-02, -7.458e-02, 1.800e-02, -8.516e-02, 1.490e-01, -4.668e-02, 2.436e-02, -2.587e-01, 3.084e-01, -3.252e-01, -1.146e-01)); + r += mul(s6_5, M4(-1.196e-01, 5.511e-02, -9.120e-02, 5.974e-02, -8.223e-02, -7.963e-03, -7.138e-02, 7.335e-02, -5.691e-02, 2.994e-01, -1.789e-01, -1.437e-01, -2.558e-02, -1.812e-01, -3.163e-02, 7.934e-04)); + r += mul(s6_6, M4(-1.534e-02, 1.289e-02, 5.497e-02, -2.597e-02, -1.122e-03, 5.876e-02, -7.101e-02, 3.765e-02, -8.104e-02, 2.093e-02, 4.369e-02, -2.960e-03, 1.265e-01, -2.050e-02, 1.893e-02, 6.858e-02)); + r += mul(s6_7, M4(2.254e-01, 2.685e-02, 7.641e-02, 6.965e-02, -9.506e-02, -4.696e-03, -7.411e-02, 1.041e-01, 7.990e-02, 2.651e-03, 1.266e-01, 1.861e-01, 1.269e-01, -8.610e-02, -3.560e-02, 5.815e-02)); + r += mul(s6_8, M4(-9.611e-02, 1.951e-03, -2.302e-02, 4.085e-02, -8.276e-02, -2.860e-02, -5.000e-02, 7.451e-02, -1.413e-01, 1.717e-02, -6.044e-02, 5.176e-02, 9.992e-02, -4.323e-02, 2.536e-02, 3.481e-02)); + r += mul(s7_0, M4(1.046e-02, 1.490e-02, -8.906e-02, -2.217e-02, -9.614e-02, 3.381e-02, -2.320e-02, -5.408e-02, 5.732e-02, -2.322e-02, 6.762e-02, 2.361e-02, -1.171e-01, -2.232e-02, -7.652e-02, -5.135e-02)); + r += mul(s7_1, M4(-2.535e-03, -3.717e-02, -2.368e-02, 7.242e-02, 2.283e-02, 1.875e-02, -7.956e-02, 2.926e-02, -1.207e-02, -6.466e-02, -5.971e-02, -4.580e-02, 7.839e-02, 4.433e-02, -1.667e-02, -3.645e-02)); + r += mul(s7_2, M4(-4.826e-02, -1.186e-02, -1.457e-02, 7.339e-02, 7.090e-03, -1.427e-02, -5.455e-02, 1.983e-02, 6.506e-02, -6.326e-02, 3.217e-02, -3.848e-02, -5.468e-02, -2.149e-02, -8.942e-02, -1.877e-02)); + r += mul(s7_3, M4(-7.380e-02, -6.317e-02, 9.416e-02, 8.520e-02, -5.836e-03, -8.181e-03, 1.923e-02, -5.096e-02, -9.014e-02, 1.214e-02, 1.116e-02, -6.535e-02, -1.251e-01, 1.161e-01, 7.658e-02, -9.742e-02)); + r += mul(s7_4, M4(1.341e-02, -2.221e-02, 1.310e-01, 1.086e-01, 3.843e-02, -7.049e-03, 1.505e-01, -1.371e-01, -6.582e-02, -1.022e-01, 1.110e-01, -3.664e-02, -1.304e-01, 1.503e-02, -7.246e-02, -6.176e-02)); + r += mul(s7_5, M4(-9.001e-02, -4.611e-02, 8.131e-03, 1.494e-01, 4.858e-02, -4.241e-02, 7.965e-02, 5.774e-02, 1.301e-01, 8.733e-03, 1.785e-01, 4.300e-02, 5.781e-02, -8.571e-02, -4.702e-03, -9.600e-03)); + r += mul(s7_6, M4(2.557e-03, -5.550e-02, -4.600e-02, -2.987e-02, 2.553e-02, 4.577e-02, -1.413e-02, 7.015e-02, 7.875e-03, 4.624e-02, -3.063e-02, -1.460e-02, -9.625e-02, 4.864e-02, 7.717e-02, 1.122e-02)); + r += mul(s7_7, M4(2.427e-02, 1.764e-03, -8.690e-04, -3.449e-02, 1.256e-01, -5.344e-03, -6.869e-02, 3.021e-02, 4.185e-02, -2.832e-02, 1.056e-01, -2.813e-02, -7.792e-02, -1.077e-02, 1.005e-01, 3.086e-02)); + r += mul(s7_8, M4(-3.092e-03, -6.802e-02, 6.346e-02, -2.153e-02, -7.435e-03, 1.288e-02, -2.567e-02, 4.306e-02, -2.163e-02, 4.064e-02, 1.108e-01, -4.732e-02, -2.121e-03, -4.824e-02, 2.181e-02, 3.273e-02)); + r += V4(-8.272e-03, -2.557e-04, 6.658e-03, 1.107e-02); + return r; +} + +V4 f1(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(1.291e-03, -3.309e-02, -2.467e-01, -3.733e-02, -5.110e-02, 6.313e-02, -2.229e-02, 6.136e-03, 8.936e-02, 5.282e-03, 2.755e-01, 5.059e-01, -6.946e-02, 4.384e-02, -3.811e-02, -6.313e-02)); + r += mul(s0_1, M4(1.246e-02, -1.170e-02, 3.099e-03, -4.764e-02, -5.165e-02, -2.684e-02, -1.382e-01, 4.533e-02, -4.507e-02, -2.643e-02, -5.564e-01, 1.367e-01, 1.495e-02, 5.881e-02, -6.815e-02, 1.318e-02)); + r += mul(s0_2, M4(8.372e-02, -6.137e-03, 8.760e-02, 9.903e-02, 3.475e-02, 6.949e-02, -4.691e-02, -8.269e-02, 2.272e-01, -7.034e-02, -2.833e-01, 2.207e-02, -1.049e-01, 2.166e-02, 5.872e-02, -1.278e-01)); + r += mul(s0_3, M4(-1.501e-02, 1.160e-01, -1.171e-01, -9.724e-02, -3.094e-02, 3.841e-02, 1.923e-02, 2.305e-01, 6.338e-02, 6.327e-02, 3.315e-01, 3.623e-01, -5.208e-02, 9.519e-02, -2.070e-01, 2.181e-02)); + r += mul(s0_4, M4(-8.023e-02, 3.626e-02, -3.083e-02, 1.394e-01, -1.228e-01, -4.644e-01, -1.909e-01, -7.613e-02, -3.076e-02, -2.855e-01, 4.138e-02, -5.659e-01, -1.743e-01, 1.125e-01, -1.574e-01, 8.071e-02)); + r += mul(s0_5, M4(-3.689e-03, 5.895e-02, 1.111e-01, 2.136e-01, 5.732e-03, 8.751e-02, -7.304e-02, 1.102e-01, 4.004e-02, 1.096e-01, 2.202e-01, 1.658e-01, 8.041e-02, 9.342e-02, -2.770e-01, -8.961e-02)); + r += mul(s0_6, M4(3.158e-02, 2.862e-02, -7.400e-02, 7.428e-03, 7.282e-02, -2.117e-01, 1.888e-02, 4.067e-02, 6.130e-02, -7.229e-03, 1.495e-01, -1.791e-01, -6.976e-02, -1.617e-02, 1.593e-02, -6.792e-03)); + r += mul(s0_7, M4(6.011e-02, 1.272e-01, 9.626e-03, 3.926e-02, -1.353e-01, -2.315e-01, 4.421e-02, 7.008e-02, 9.128e-02, -4.335e-01, -2.076e-01, 3.413e-01, -5.586e-02, 6.942e-02, 1.589e-01, 2.176e-02)); + r += mul(s0_8, M4(-3.488e-02, 1.162e-01, -1.783e-01, -1.375e-01, -1.052e-02, 7.387e-03, -2.240e-02, 3.897e-02, -5.279e-02, -6.690e-02, 8.762e-03, 2.620e-01, -1.395e-02, -3.752e-02, -6.188e-03, -5.247e-03)); + r += mul(s1_0, M4(2.785e-02, 3.127e-02, 3.176e-04, -5.409e-03, -2.951e-02, -2.531e-02, -4.053e-02, 7.329e-02, 2.876e-02, -3.404e-02, 1.595e-02, -1.918e-02, -1.012e-02, -4.033e-02, 3.814e-02, 8.836e-02)); + r += mul(s1_1, M4(-4.760e-02, 9.454e-02, -1.390e-02, 7.537e-04, -2.286e-02, -9.383e-02, -7.304e-02, 3.868e-02, 6.908e-02, 4.284e-02, -6.230e-02, -1.251e-03, -4.050e-03, -2.775e-02, -4.178e-02, -7.595e-03)); + r += mul(s1_2, M4(5.763e-02, 6.505e-03, -2.169e-02, -3.739e-02, -1.116e-01, 6.552e-02, 1.033e-01, -7.501e-02, -2.211e-02, -3.400e-02, -2.577e-01, -5.478e-02, -3.244e-03, -2.211e-01, 1.557e-01, -5.314e-03)); + r += mul(s1_3, M4(4.992e-02, -7.075e-02, -3.430e-03, -1.137e-02, -1.171e-01, 3.794e-02, 5.846e-02, 2.164e-01, 2.679e-02, -1.327e-02, -1.268e-02, -5.339e-02, 1.704e-02, 3.727e-02, 6.319e-03, -2.865e-03)); + r += mul(s1_4, M4(-1.487e-01, -1.586e-01, -9.926e-02, 4.898e-03, -8.301e-02, 3.593e-01, 2.840e-03, 3.870e-01, 1.008e-01, -8.199e-02, 1.092e-01, -3.774e-02, 6.955e-02, 4.101e-02, 1.254e-01, -8.251e-02)); + r += mul(s1_5, M4(1.882e-02, -2.076e-02, 9.574e-02, 1.333e-03, -4.918e-03, -1.920e-01, 2.487e-02, -2.706e-01, 4.526e-02, 7.234e-02, -3.801e-02, 1.536e-01, 1.891e-02, 3.662e-02, -6.406e-03, 1.036e-01)); + r += mul(s1_6, M4(1.646e-01, -7.632e-02, 6.412e-02, -3.754e-02, -5.181e-02, -2.892e-01, 1.465e-01, -7.335e-02, 9.862e-03, 2.385e-02, -1.057e-01, 3.245e-02, 3.830e-02, -1.001e-01, 1.262e-01, -7.832e-02)); + r += mul(s1_7, M4(5.726e-02, -6.863e-02, -7.450e-02, -3.658e-02, -9.617e-02, -4.115e-02, 6.957e-02, 1.118e-01, 5.442e-02, 1.292e-01, 1.318e-01, 4.223e-02, -6.430e-03, -1.448e-02, 8.713e-02, 1.552e-01)); + r += mul(s1_8, M4(-8.153e-02, 7.037e-02, -2.301e-01, -1.310e-02, -1.227e-01, 4.840e-02, 6.444e-02, -2.853e-02, -1.863e-02, 1.027e-02, -2.087e-02, 7.927e-02, 1.077e-01, -9.496e-02, 6.346e-02, -9.540e-03)); + r += mul(s2_0, M4(-7.252e-03, 3.289e-02, -1.045e-02, -6.928e-02, -3.508e-02, 3.188e-02, 6.015e-02, -1.932e-01, -3.900e-02, -8.703e-02, -3.339e-02, 4.936e-02, 8.343e-02, -4.920e-02, -1.612e-02, 1.044e-01)); + r += mul(s2_1, M4(-6.517e-02, 4.847e-03, 2.091e-02, 5.731e-03, -3.055e-02, 9.127e-02, 1.281e-01, -3.861e-01, -1.372e-01, 5.403e-02, 1.831e-02, 1.047e-01, 2.894e-02, -2.678e-02, 3.758e-03, 1.354e-01)); + r += mul(s2_2, M4(9.071e-02, -8.716e-02, -1.136e-01, 3.664e-02, 5.630e-02, -9.930e-02, -1.636e-02, -1.948e-01, 9.435e-03, 1.274e-02, -6.383e-02, -1.053e-01, -1.528e-02, -7.607e-02, 4.260e-02, -2.555e-02)); + r += mul(s2_3, M4(1.587e-02, -1.370e-01, 2.455e-02, -1.010e-01, 9.949e-02, -8.042e-02, -1.017e-01, -1.325e-01, -9.916e-02, 3.663e-02, -1.898e-02, 5.855e-02, -3.613e-03, 1.490e-02, -8.589e-02, 1.047e-01)); + r += mul(s2_4, M4(-3.639e-02, 2.064e-01, 1.610e-01, 1.304e-01, -2.004e-01, -6.326e-02, 6.047e-03, -2.861e-02, 4.202e-02, -5.227e-02, 6.733e-01, 5.908e-02, 8.132e-02, 1.850e-01, -1.535e-01, 5.053e-02)); + r += mul(s2_5, M4(-2.291e-01, 3.613e-02, 5.034e-02, -6.692e-02, 7.868e-02, 9.361e-02, -2.765e-02, -1.248e-01, -2.660e-01, 6.824e-02, -7.938e-03, 1.081e-01, -6.854e-02, 1.499e-01, 2.329e-01, -1.853e-02)); + r += mul(s2_6, M4(-3.399e-02, -6.068e-02, 5.757e-02, 7.576e-03, 6.779e-03, 3.723e-02, 1.359e-01, 4.284e-02, -2.183e-02, -8.148e-02, 1.455e-01, 4.367e-02, 6.087e-02, -1.987e-02, -1.896e-03, 1.028e-01)); + r += mul(s2_7, M4(-3.554e-02, -1.274e-01, 7.710e-02, 1.122e-01, -9.602e-02, 1.558e-01, 2.125e-02, -1.126e-01, -3.836e-02, 1.923e-01, 1.389e-01, -1.328e-01, 9.033e-02, 8.393e-02, -7.585e-02, 1.295e-01)); + r += mul(s2_8, M4(8.556e-02, 3.137e-02, 4.851e-03, -1.591e-02, -2.889e-02, 4.844e-02, -1.649e-01, -2.942e-03, -2.426e-01, -2.373e-02, 3.365e-02, 8.732e-02, 9.597e-02, 1.103e-02, 1.947e-01, 1.305e-01)); + r += mul(s3_0, M4(-3.671e-02, 6.794e-02, 6.830e-02, 5.933e-02, 1.526e-02, -2.671e-02, 3.779e-02, 1.246e-01, 1.483e-03, -3.035e-02, 1.430e-02, -3.135e-02, -2.275e-02, 4.349e-03, -5.725e-02, -2.111e-02)); + r += mul(s3_1, M4(-2.024e-01, 5.901e-02, 5.708e-02, 1.054e-01, 2.930e-02, -2.702e-02, -3.093e-02, -1.245e-01, -3.232e-02, -2.342e-02, 3.634e-02, 7.495e-03, -9.151e-03, 1.306e-02, 1.040e-01, -8.540e-03)); + r += mul(s3_2, M4(-3.154e-01, -1.633e-02, -1.445e-01, 9.304e-02, -3.271e-02, -7.434e-04, -7.387e-02, 3.626e-02, 2.005e-02, 1.719e-02, 6.899e-02, -4.114e-02, -7.850e-02, 6.077e-02, 2.796e-02, 2.726e-02)); + r += mul(s3_3, M4(-3.014e-02, -1.029e-01, -3.616e-02, 2.436e-02, -1.202e-02, 5.488e-03, -1.213e-01, 7.005e-02, 5.867e-02, 1.751e-02, -2.769e-01, 1.044e-01, -8.570e-02, 2.694e-03, -1.806e-01, 2.735e-02)); + r += mul(s3_4, M4(4.306e-03, -1.465e-01, 1.886e-02, 1.922e-01, -6.173e-02, 1.205e-01, 7.775e-02, -1.166e-01, 5.807e-02, -1.333e-01, 8.454e-02, 9.130e-02, 1.484e-03, 1.367e-01, -1.749e-01, 8.416e-02)); + r += mul(s3_5, M4(-1.530e-01, 1.928e-01, -7.508e-02, 1.057e-01, 2.565e-02, -1.256e-01, -1.364e-01, 1.981e-01, -5.027e-02, 9.177e-02, -7.396e-02, 7.215e-02, -7.897e-02, -1.941e-03, -1.516e-01, -1.162e-01)); + r += mul(s3_6, M4(-4.693e-02, 4.573e-02, 7.748e-02, -6.776e-02, -7.843e-03, 2.080e-02, 1.602e-01, 3.083e-02, 5.916e-02, -3.198e-03, 8.122e-02, -2.043e-02, -2.682e-02, -7.973e-03, -9.084e-02, -1.076e-01)); + r += mul(s3_7, M4(-1.377e-01, -5.352e-02, 2.281e-01, 5.663e-02, 2.000e-02, 8.774e-02, 8.066e-02, -1.324e-01, 1.974e-02, 8.534e-02, -9.524e-02, -7.202e-02, 7.866e-02, -3.841e-02, -1.220e-01, 1.124e-01)); + r += mul(s3_8, M4(-2.706e-02, -4.287e-02, 5.619e-02, 5.859e-02, -1.406e-02, 1.458e-02, -9.863e-02, 4.974e-02, -2.573e-02, 1.474e-01, -1.410e-01, 3.558e-02, 9.707e-02, 4.624e-03, -4.750e-02, -6.996e-02)); + r += mul(s4_0, M4(-9.143e-03, -4.070e-02, 3.796e-02, -1.124e-01, 5.682e-03, -5.952e-03, -1.083e-02, 5.149e-02, -3.908e-02, 8.725e-02, 7.219e-02, 2.210e-01, 2.867e-02, -5.124e-02, 1.472e-01, -1.298e-02)); + r += mul(s4_1, M4(8.129e-02, -5.610e-02, -1.131e-01, -7.804e-02, -6.142e-02, 4.405e-02, -1.935e-02, -7.470e-02, 3.230e-02, -1.014e-01, 5.993e-02, -6.655e-02, 1.223e-01, 5.139e-02, 7.857e-02, -5.123e-02)); + r += mul(s4_2, M4(-1.356e-02, -3.369e-02, -6.812e-02, -3.916e-02, 1.548e-02, -5.267e-02, -7.823e-02, -5.235e-02, -1.383e-01, 1.316e-02, 2.379e-01, 1.717e-01, -1.081e-01, 2.928e-02, 9.720e-02, -1.537e-01)); + r += mul(s4_3, M4(2.175e-02, -2.189e-02, 6.430e-02, -3.381e-02, 1.401e-01, -1.494e-01, -2.787e-02, -1.198e-02, -4.582e-04, 7.047e-02, -1.555e-02, 1.178e-01, 8.088e-02, 3.321e-02, 2.701e-02, 4.858e-02)); + r += mul(s4_4, M4(5.293e-02, -1.604e-01, -1.621e-01, -9.211e-03, 2.066e-02, -1.176e-02, 6.895e-02, 2.245e-01, -1.504e-01, -1.978e-01, -1.014e-01, 2.641e-01, -1.521e-01, -7.876e-02, -1.239e-01, -2.509e-01)); + r += mul(s4_5, M4(1.149e-01, 7.713e-02, 5.451e-03, -1.498e-03, -5.268e-02, -4.282e-01, -1.254e-01, 4.745e-02, 3.676e-01, -4.390e-02, 6.719e-02, -1.942e-01, -2.018e-01, 1.954e-02, 3.925e-02, 2.230e-02)); + r += mul(s4_6, M4(1.009e-01, -8.919e-02, -1.311e-02, 1.212e-01, 5.160e-02, -5.236e-02, -1.207e-02, 3.179e-02, 5.818e-02, 3.536e-02, 5.943e-02, -1.230e-02, -9.296e-02, 1.911e-02, 3.187e-02, -6.943e-02)); + r += mul(s4_7, M4(5.399e-02, 1.614e-01, -1.053e-02, -1.500e-01, 4.298e-02, -1.918e-01, 6.961e-02, -3.480e-02, 8.393e-02, 2.346e-01, -1.064e-01, -3.027e-01, -1.800e-01, -9.699e-02, -3.132e-01, -1.252e-01)); + r += mul(s4_8, M4(-3.151e-02, -2.081e-02, 1.231e-01, 7.380e-02, 1.128e-01, -4.889e-01, 2.393e-02, 9.431e-02, -1.470e-01, 1.966e-01, 8.645e-02, 1.004e-01, -1.134e-01, -5.037e-02, -1.599e-02, 5.272e-02)); + r += mul(s5_0, M4(3.013e-03, -1.013e-01, -4.385e-02, 4.259e-02, -6.318e-03, -1.260e-02, -4.536e-02, -6.414e-03, 1.995e-02, 7.380e-02, -9.842e-02, -4.764e-03, -7.561e-03, 3.450e-02, -7.110e-02, -6.934e-02)); + r += mul(s5_1, M4(5.377e-02, -6.271e-03, -7.884e-03, -1.168e-01, -3.067e-02, 7.240e-03, 1.859e-02, -2.578e-02, 1.713e-02, -2.894e-02, 1.178e-01, 1.695e-01, -2.749e-03, 2.910e-02, 6.388e-02, 2.339e-02)); + r += mul(s5_2, M4(5.237e-02, -8.001e-02, -8.870e-02, -4.603e-02, -4.446e-02, 5.708e-02, 1.001e-01, 2.091e-01, -9.143e-02, 3.154e-02, -1.637e-01, 6.044e-02, 2.701e-02, -1.251e-02, 3.416e-02, -7.120e-02)); + r += mul(s5_3, M4(6.492e-02, 3.277e-02, -4.320e-02, -9.589e-02, 9.444e-02, -7.879e-02, 4.590e-02, -1.423e-01, -3.251e-02, -1.204e-01, -1.721e-02, -1.954e-02, -5.756e-02, 3.336e-02, 2.164e-02, -1.029e-02)); + r += mul(s5_4, M4(8.779e-02, -1.304e-01, 1.074e-01, 2.571e-01, -4.797e-02, 9.547e-02, 1.564e-01, -6.865e-02, 4.324e-02, 2.505e-01, 6.845e-02, -1.870e-01, 5.440e-02, -1.351e-01, -2.531e-02, 1.165e-01)); + r += mul(s5_5, M4(-1.558e-02, 1.486e-01, 1.116e-01, -1.995e-02, -4.122e-02, -3.351e-01, -7.674e-02, -1.872e-01, -1.542e-01, 8.164e-03, -1.037e-01, 5.730e-02, -8.803e-02, 3.506e-02, 1.483e-01, -8.270e-03)); + r += mul(s5_6, M4(4.533e-02, 1.590e-02, -2.368e-01, 1.415e-01, 1.681e-02, 1.097e-02, 5.881e-02, 1.226e-01, 4.352e-03, 2.580e-02, 1.681e-01, -1.145e-01, -6.715e-02, 3.188e-04, 1.465e-01, 2.430e-02)); + r += mul(s5_7, M4(-3.316e-02, -2.123e-01, -1.365e-01, 1.252e-02, 4.186e-02, 3.447e-02, 6.215e-02, -4.931e-03, -5.371e-02, -1.396e-01, -2.083e-02, 8.467e-03, -5.557e-02, 9.560e-02, 7.489e-02, 3.044e-02)); + r += mul(s5_8, M4(4.188e-02, -2.360e-02, -7.651e-04, -3.802e-02, 2.662e-02, 3.421e-02, -1.124e-01, -1.103e-01, 5.888e-02, 4.408e-02, 2.304e-02, -4.045e-02, -3.763e-02, -2.086e-01, 2.852e-02, 6.561e-02)); + r += mul(s6_0, M4(2.000e-03, -3.707e-02, 6.655e-02, -9.570e-02, -1.103e-01, 3.724e-02, 3.844e-02, -4.925e-02, -5.481e-02, -4.484e-02, -5.163e-02, -1.044e-02, 1.085e-03, -5.087e-02, 5.953e-02, -1.942e-02)); + r += mul(s6_1, M4(7.659e-02, -6.084e-02, 3.926e-02, 6.993e-02, -5.095e-02, 5.799e-02, -2.354e-01, -1.374e-02, -3.596e-02, 5.061e-02, -6.000e-02, -2.160e-02, 1.592e-02, -7.282e-02, -1.824e-02, -3.632e-02)); + r += mul(s6_2, M4(-1.971e-02, 9.811e-02, -5.877e-02, 3.986e-02, -2.436e-02, 2.289e-04, -4.199e-02, 6.084e-02, 4.541e-02, 4.178e-02, 1.270e-01, -6.550e-02, 7.945e-02, 4.713e-02, 4.875e-02, -8.960e-02)); + r += mul(s6_3, M4(7.449e-02, -1.146e-01, -3.359e-03, -1.997e-02, -2.627e-02, 5.933e-02, 1.181e-02, 3.691e-02, 7.721e-02, 1.114e-01, 1.744e-01, -2.290e-01, 1.149e-02, 1.007e-02, 2.065e-01, 1.243e-01)); + r += mul(s6_4, M4(1.933e-01, -1.209e-01, 3.074e-01, -1.103e-01, -1.163e-01, 1.550e-01, -3.422e-01, -4.443e-02, 2.270e-01, -8.393e-03, 6.525e-02, -2.852e-01, -6.272e-02, 5.415e-02, 4.149e-02, 1.192e-02)); + r += mul(s6_5, M4(8.516e-02, -1.365e-01, -1.232e-01, 1.896e-03, 5.019e-02, -1.542e-01, -2.283e-01, -1.782e-01, 1.130e-01, -4.613e-02, -1.606e-01, 2.634e-02, -2.544e-01, -6.516e-02, 1.625e-01, -1.134e-01)); + r += mul(s6_6, M4(-5.353e-02, -3.659e-03, -2.821e-02, 5.288e-02, 5.496e-02, 2.354e-02, -7.293e-02, 5.376e-02, -1.864e-02, -2.116e-02, 1.268e-01, 2.539e-02, 4.690e-02, -2.525e-02, -8.503e-02, -3.469e-02)); + r += mul(s6_7, M4(1.192e-01, 4.570e-02, 2.053e-01, 6.541e-02, -6.350e-02, -1.007e-01, -2.017e-01, -7.632e-02, 1.655e-01, 1.507e-01, -9.662e-03, 7.911e-02, 8.390e-02, -1.917e-01, 4.232e-02, 1.134e-01)); + r += mul(s6_8, M4(1.551e-02, 1.855e-01, -9.961e-02, -1.690e-01, 2.262e-02, -3.772e-02, -6.411e-02, -5.053e-02, 9.622e-02, -4.271e-02, 1.404e-01, 7.263e-02, 1.561e-01, 5.037e-03, -2.265e-02, -7.068e-02)); + r += mul(s7_0, M4(3.013e-02, 2.365e-02, 2.057e-01, -1.254e-02, 1.532e-03, 3.604e-02, -2.406e-03, -1.678e-02, 1.235e-02, -7.218e-03, 7.051e-02, -3.434e-02, -9.820e-03, -1.599e-05, -3.336e-02, -1.208e-01)); + r += mul(s7_1, M4(1.232e-03, 2.311e-02, 1.745e-02, -1.300e-01, 4.110e-02, 4.932e-02, 2.509e-02, 9.283e-02, -6.518e-02, -4.350e-02, 7.861e-02, 2.999e-02, -1.083e-02, 4.835e-02, -8.659e-02, 1.901e-02)); + r += mul(s7_2, M4(-1.039e-01, 5.171e-02, 9.599e-03, -5.878e-02, -5.113e-02, 4.864e-02, 9.085e-02, 4.473e-02, 8.764e-02, -6.118e-02, 1.407e-01, 1.097e-01, -4.434e-02, -4.787e-03, -1.495e-01, -2.378e-02)); + r += mul(s7_3, M4(-7.828e-02, 1.726e-02, -1.521e-01, 8.278e-02, -3.601e-02, 2.918e-03, 1.109e-01, -2.525e-02, -6.621e-02, 2.801e-02, -7.083e-02, -9.028e-02, 7.347e-03, -1.125e-02, -4.711e-02, 8.305e-02)); + r += mul(s7_4, M4(-2.757e-02, -2.611e-01, -2.337e-01, -1.758e-01, 2.819e-02, 1.947e-01, 1.002e-02, -1.656e-01, -1.142e-01, -1.469e-01, -1.394e-01, -1.329e-01, 2.162e-02, 2.422e-01, 1.128e-01, -2.176e-01)); + r += mul(s7_5, M4(4.132e-03, -8.471e-02, -2.148e-01, -1.064e-01, -5.095e-02, 2.288e-02, -1.660e-01, -1.214e-01, 1.449e-01, -2.335e-01, -4.872e-02, -6.141e-03, -1.364e-01, 1.272e-01, -4.421e-02, 1.197e-02)); + r += mul(s7_6, M4(-2.372e-02, 3.105e-02, 1.059e-01, 1.354e-02, 3.583e-02, -3.911e-02, -1.577e-01, 8.424e-02, 7.771e-02, 1.798e-02, -5.473e-02, 1.030e-01, -4.950e-02, 6.024e-02, -1.077e-01, 3.528e-02)); + r += mul(s7_7, M4(8.236e-02, -4.677e-02, -9.013e-02, 9.874e-03, 3.090e-02, -1.172e-01, -9.468e-03, 2.097e-02, 1.017e-01, -8.313e-02, -7.684e-02, 1.709e-01, -8.242e-02, -5.089e-03, 1.613e-02, -4.114e-02)); + r += mul(s7_8, M4(-1.382e-02, 6.332e-02, -8.293e-02, -8.057e-02, 5.590e-02, -1.382e-03, 1.901e-02, -2.149e-02, 6.884e-02, 4.025e-02, 9.417e-02, 4.098e-02, -6.400e-02, 4.939e-02, 2.244e-02, -2.732e-02)); + r += V4(7.346e-03, -4.905e-03, 3.653e-03, -1.770e-02); + return r; +} + +V4 f2(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-2.541e-02, 1.657e-01, 5.189e-02, 4.130e-02, -1.890e-02, -1.867e-01, 6.755e-03, 3.576e-02, -2.349e-01, -3.670e-01, 1.333e-01, 1.520e-01, 5.807e-02, -9.119e-02, -5.037e-02, 1.544e-02)); + r += mul(s0_1, M4(-2.454e-02, 5.878e-02, -1.489e-03, -2.959e-02, 7.611e-02, -6.616e-02, -7.461e-02, -7.549e-02, 1.804e-01, 1.865e-02, -2.235e-01, 1.794e-01, 4.243e-02, -6.137e-02, -1.085e-01, 7.175e-02)); + r += mul(s0_2, M4(2.578e-02, -2.126e-02, -2.135e-02, 3.540e-02, -1.959e-02, 9.802e-02, 3.496e-03, 5.008e-03, -1.620e-01, -9.267e-02, 4.342e-02, 1.210e-02, 1.633e-01, -5.267e-02, -3.548e-02, 5.545e-02)); + r += mul(s0_3, M4(1.066e-01, 1.287e-02, 1.572e-01, 1.008e-01, -2.488e-01, -3.298e-01, -3.237e-02, 4.881e-02, 1.514e-01, -6.376e-01, 1.029e-01, 5.323e-03, 1.547e-01, 3.549e-02, -1.129e-01, 8.727e-02)); + r += mul(s0_4, M4(6.195e-02, 5.402e-02, -7.368e-02, 3.011e-03, -5.653e-02, -6.636e-03, 1.059e-02, -1.094e-01, 3.677e-01, -2.147e-01, 7.097e-03, 6.449e-02, -1.228e-01, 1.789e-02, -8.807e-02, 1.331e-01)); + r += mul(s0_5, M4(1.190e-01, 1.595e-02, 5.008e-02, 1.302e-02, -8.819e-02, 5.241e-02, -1.451e-02, 2.478e-02, -2.438e-02, 2.972e-01, -1.010e-01, -1.309e-02, -4.738e-02, 3.030e-02, -4.334e-02, 1.129e-01)); + r += mul(s0_6, M4(-1.379e-01, -1.129e-01, -7.080e-02, 1.190e-01, -2.756e-03, -3.091e-02, -1.385e-01, 4.875e-02, 2.495e-01, 7.972e-02, -1.587e-01, -2.658e-02, 2.143e-01, 6.147e-02, -5.138e-02, 8.032e-02)); + r += mul(s0_7, M4(-6.998e-02, -2.174e-04, 9.370e-02, 5.419e-02, 1.114e-01, -4.153e-02, -6.582e-02, 1.344e-03, -2.531e-01, -3.355e-01, -3.122e-03, 4.636e-02, 4.160e-02, 6.323e-03, -9.927e-02, 7.349e-02)); + r += mul(s0_8, M4(1.713e-02, 3.632e-02, 3.580e-02, 6.532e-02, -7.740e-02, 6.009e-02, -7.090e-02, -6.667e-02, 2.703e-01, 3.117e-01, -3.105e-01, -1.004e-01, 1.942e-01, 7.943e-02, -5.937e-02, 1.907e-04)); + r += mul(s1_0, M4(-6.210e-02, -1.937e-01, 9.403e-03, 8.441e-03, 4.634e-02, 1.566e-01, 2.479e-03, 1.181e-01, -2.323e-02, -6.377e-02, 3.282e-02, -2.346e-02, -1.981e-02, -1.853e-02, -2.167e-02, -1.601e-02)); + r += mul(s1_1, M4(-1.900e-02, 4.846e-02, -1.145e-01, -3.643e-02, 9.235e-02, -7.407e-02, 3.720e-02, -3.503e-02, -8.768e-02, 4.017e-02, -1.982e-03, 3.914e-02, -1.236e-01, 1.869e-01, 8.603e-02, -2.607e-02)); + r += mul(s1_2, M4(-1.153e-02, -4.062e-02, -2.601e-02, 2.952e-02, 6.171e-02, 2.022e-02, 3.942e-03, -4.038e-02, 1.993e-02, -6.770e-02, -9.243e-03, -5.448e-03, 2.202e-02, -2.069e-02, -3.895e-02, 3.428e-02)); + r += mul(s1_3, M4(-3.642e-03, -3.672e-01, 8.635e-02, 4.287e-03, 1.548e-01, -1.348e-01, 4.053e-01, 9.992e-02, 1.639e-02, -1.043e-01, -1.408e-01, -8.160e-02, 1.151e-02, -6.836e-02, -1.649e-01, 9.633e-02)); + r += mul(s1_4, M4(8.913e-02, -1.053e-01, -2.394e-01, -5.300e-02, -2.605e-01, 1.961e-01, -2.876e-01, 9.147e-03, 5.131e-02, 4.177e-03, -1.395e-02, 1.537e-02, 1.370e-01, 2.980e-01, 5.745e-02, -4.793e-02)); + r += mul(s1_5, M4(3.644e-02, 3.103e-02, -6.005e-02, -6.355e-02, 1.551e-02, -1.944e-01, 7.983e-02, 4.173e-02, 1.034e-01, 1.462e-01, -7.341e-02, -7.670e-03, 7.584e-02, 8.634e-02, 8.598e-02, 4.030e-02)); + r += mul(s1_6, M4(-1.251e-01, -1.384e-01, -1.873e-01, 8.910e-02, 1.206e-01, 9.330e-02, 1.335e-01, 7.109e-02, -3.307e-02, -6.496e-02, -9.494e-02, -5.701e-03, 5.430e-02, 1.328e-02, 5.097e-02, 4.453e-02)); + r += mul(s1_7, M4(-6.189e-02, -5.578e-02, 1.039e-01, 2.118e-01, 2.626e-02, 9.107e-02, -8.293e-02, -1.334e-01, -5.788e-02, 2.230e-02, 8.005e-02, -9.271e-04, -1.776e-01, 1.208e-01, -1.381e-01, -2.869e-01)); + r += mul(s1_8, M4(1.049e-01, 9.033e-03, -9.022e-02, 8.736e-02, -5.168e-02, 1.815e-03, 2.325e-01, 3.552e-03, -5.869e-03, 1.311e-02, 5.271e-04, 8.746e-03, -1.477e-01, -1.359e-01, 1.665e-01, -1.557e-01)); + r += mul(s2_0, M4(6.086e-03, 2.242e-02, 1.090e-01, 7.514e-04, 1.319e-01, -1.659e-01, 9.627e-02, -1.201e-02, -3.408e-02, 9.862e-02, 5.550e-02, -3.620e-02, -4.180e-02, 8.080e-02, 4.050e-02, 1.541e-01)); + r += mul(s2_1, M4(-1.202e-01, -2.337e-02, 1.652e-02, 1.014e-01, 6.757e-02, -2.003e-01, -2.529e-01, 1.267e-01, -2.596e-02, 2.547e-02, -1.586e-01, -2.041e-02, -2.650e-02, 5.746e-02, -4.375e-02, 1.520e-01)); + r += mul(s2_2, M4(-1.836e-02, 3.823e-02, -2.390e-02, -1.450e-02, 2.732e-02, -1.365e-01, 2.013e-02, -3.332e-02, 4.141e-02, -4.937e-02, 5.944e-02, 3.866e-02, 8.445e-02, -8.183e-02, 4.818e-02, 1.139e-01)); + r += mul(s2_3, M4(1.174e-01, 6.777e-02, 1.279e-02, 3.960e-02, -2.694e-02, 1.882e-01, -1.899e-02, 3.758e-02, 7.822e-02, 4.007e-01, 1.465e-01, 1.781e-01, 3.478e-02, 5.389e-02, -6.454e-04, 1.149e-01)); + r += mul(s2_4, M4(-3.450e-03, -1.621e-01, -3.191e-02, 1.023e-01, -2.158e-01, -1.803e-03, 5.940e-02, 2.468e-01, 4.695e-01, -2.193e-01, 5.147e-02, -1.365e-01, -3.636e-02, -3.669e-02, -2.557e-01, 8.754e-02)); + r += mul(s2_5, M4(4.038e-02, 1.148e-01, -5.276e-02, 4.902e-02, -3.413e-02, 4.901e-02, -5.960e-02, 3.716e-02, 3.228e-02, 1.062e-02, 1.174e-01, -3.452e-02, 1.159e-01, -1.491e-02, -4.849e-02, 5.492e-02)); + r += mul(s2_6, M4(3.433e-02, -1.013e-03, -5.464e-02, -6.439e-02, -1.780e-02, -4.620e-03, 5.071e-02, 1.898e-02, -1.033e-02, 3.266e-02, 2.992e-02, -1.400e-01, 1.042e-01, 2.634e-02, -2.643e-02, 6.895e-02)); + r += mul(s2_7, M4(6.651e-04, 1.780e-03, 3.300e-02, -5.542e-02, 3.230e-02, -4.599e-02, 9.108e-02, 4.865e-02, 1.771e-01, 1.276e-02, 2.705e-01, 1.487e-01, 6.958e-02, 3.214e-02, -1.242e-01, -1.647e-02)); + r += mul(s2_8, M4(-2.757e-02, 4.429e-03, -1.220e-02, -1.905e-02, 2.517e-02, 3.895e-02, -5.111e-02, 1.087e-01, 3.492e-03, 4.499e-02, 5.900e-02, -1.582e-02, 1.012e-01, -3.097e-02, -1.988e-01, 3.916e-02)); + r += mul(s3_0, M4(-2.900e-04, -5.983e-02, 3.252e-03, 2.125e-02, -4.191e-02, 6.632e-02, -1.033e-01, -5.799e-02, -2.119e-02, -2.728e-02, -5.169e-02, 2.993e-02, -2.283e-02, 2.173e-02, -3.010e-02, 2.619e-02)); + r += mul(s3_1, M4(2.626e-02, 2.380e-02, 7.962e-02, 3.137e-02, 5.138e-02, -4.827e-02, 8.346e-02, -1.010e-01, 4.306e-02, -1.095e-01, -2.155e-02, -8.967e-02, 2.533e-02, -1.816e-02, 2.855e-02, 2.077e-02)); + r += mul(s3_2, M4(2.225e-02, 5.791e-02, 6.161e-02, 5.779e-03, -5.488e-02, -3.480e-02, -6.262e-03, 5.816e-02, 9.009e-03, -4.501e-04, 6.241e-02, 2.831e-03, 2.386e-02, 2.153e-02, 4.770e-02, -6.131e-03)); + r += mul(s3_3, M4(8.755e-02, -7.699e-02, -5.070e-02, 1.162e-01, -1.126e-01, 1.112e-01, 3.857e-02, 1.604e-02, -4.325e-02, 1.515e-01, -3.948e-02, 1.030e-01, -5.669e-02, -6.762e-02, -2.610e-02, -4.522e-02)); + r += mul(s3_4, M4(-1.948e-01, -6.880e-02, -6.947e-02, 1.657e-01, 7.452e-02, -6.016e-02, 1.256e-01, 1.398e-01, 5.748e-02, -1.528e-01, 3.831e-02, -8.106e-03, -1.903e-01, 1.807e-01, -1.225e-01, 1.406e-01)); + r += mul(s3_5, M4(-2.452e-02, 2.292e-01, 1.474e-01, 7.133e-02, -1.047e-01, 6.568e-02, -1.582e-02, -1.310e-01, -1.071e-01, 5.300e-02, -2.739e-03, -2.249e-02, 9.331e-02, -1.606e-01, 3.771e-02, -4.263e-02)); + r += mul(s3_6, M4(1.518e-01, 1.917e-02, 1.447e-01, 9.757e-02, 1.160e-02, 4.976e-02, 8.316e-02, -4.158e-02, 1.367e-03, -2.320e-02, -8.661e-02, 2.788e-02, 8.342e-02, -1.139e-02, -2.212e-02, 6.059e-02)); + r += mul(s3_7, M4(1.919e-01, 7.601e-02, 1.733e-01, 1.862e-01, 3.007e-02, -1.910e-02, 2.440e-03, -1.434e-01, 4.645e-02, -9.358e-02, 9.214e-03, 1.602e-01, -1.101e-01, 1.797e-02, -2.656e-01, -1.126e-01)); + r += mul(s3_8, M4(5.247e-02, -4.065e-02, 2.272e-02, -2.877e-02, -9.167e-02, -3.887e-02, 7.758e-03, -8.309e-02, 1.724e-02, 2.718e-02, -2.350e-02, 1.850e-02, -2.346e-02, -8.699e-03, -2.707e-02, -5.296e-04)); + r += mul(s4_0, M4(3.924e-03, 2.069e-02, -5.953e-02, -1.139e-02, -6.720e-02, -4.303e-02, 4.648e-02, 2.124e-02, -4.898e-02, -7.581e-02, -1.027e-01, 7.361e-02, 3.286e-02, -4.268e-02, 4.958e-02, 9.935e-03)); + r += mul(s4_1, M4(-5.555e-02, 2.395e-02, -9.125e-03, -1.445e-01, -9.143e-02, -3.216e-02, 1.013e-01, 5.860e-02, 1.781e-01, -1.297e-01, 1.468e-01, -9.593e-02, 1.366e-02, -2.647e-01, -1.196e-02, -9.786e-02)); + r += mul(s4_2, M4(2.921e-02, -6.674e-02, 7.710e-02, 1.678e-02, -6.434e-02, 7.683e-02, -4.142e-02, -4.854e-02, 4.405e-02, 1.401e-01, -2.295e-01, -2.968e-02, -1.859e-01, -2.424e-02, 1.021e-01, -7.019e-03)); + r += mul(s4_3, M4(1.175e-02, 2.339e-01, 1.141e-01, -6.781e-02, -6.412e-02, -4.740e-02, 8.388e-03, -9.825e-03, -6.027e-02, 1.537e-01, 4.414e-01, -3.699e-02, -3.760e-01, -3.269e-01, 5.088e-03, 3.482e-02)); + r += mul(s4_4, M4(-4.872e-02, -1.092e-01, -1.548e-01, -1.096e-01, -1.383e-01, 6.343e-02, -1.440e-01, 4.788e-02, -3.298e-01, -1.797e-03, 2.764e-01, -1.386e-01, 4.241e-02, 1.295e-01, -8.381e-02, 8.987e-02)); + r += mul(s4_5, M4(-8.056e-02, 4.051e-02, -3.443e-03, 9.557e-03, -6.056e-02, -6.300e-02, 5.039e-02, -3.456e-02, -1.464e-01, -1.846e-01, 4.648e-02, -1.561e-01, -2.740e-02, 2.142e-01, -1.022e-01, -2.809e-02)); + r += mul(s4_6, M4(-5.604e-02, -1.731e-03, -2.083e-02, 9.337e-03, 1.118e-02, 8.124e-03, -1.683e-01, 2.042e-02, 2.922e-03, 6.654e-03, 2.038e-02, 1.058e-01, 4.162e-02, -9.044e-02, 1.658e-01, -1.673e-02)); + r += mul(s4_7, M4(2.176e-01, 6.536e-02, 2.805e-02, 7.785e-02, -2.137e-01, -1.928e-01, -1.061e-01, 5.347e-02, 3.740e-01, -4.384e-02, 1.540e-01, -1.887e-02, 1.949e-01, 3.791e-02, 1.475e-01, 1.193e-01)); + r += mul(s4_8, M4(-7.921e-02, 3.755e-02, 8.097e-03, -3.115e-02, -1.875e-01, -7.991e-02, -5.474e-02, -1.879e-02, 9.336e-02, 1.441e-01, -2.849e-02, 3.442e-02, 8.304e-02, 1.779e-02, -1.017e-01, -8.835e-02)); + r += mul(s5_0, M4(-6.224e-02, -1.286e-01, -1.065e-01, -5.836e-02, -4.088e-02, 9.037e-02, 7.194e-02, 8.010e-03, 3.740e-02, 7.190e-02, 1.243e-01, 9.762e-02, 4.848e-02, 4.667e-03, 1.339e-01, 8.745e-02)); + r += mul(s5_1, M4(1.937e-02, 1.509e-01, -8.489e-02, -7.999e-02, 6.341e-03, -1.031e-01, -1.684e-03, 1.612e-01, -1.448e-02, -2.470e-02, -8.730e-02, -1.667e-02, -6.683e-03, 1.188e-03, 8.151e-03, 3.647e-02)); + r += mul(s5_2, M4(4.567e-02, -5.051e-02, 2.011e-02, 4.950e-02, 6.689e-03, -8.069e-02, 7.060e-02, -1.987e-01, 4.187e-02, -5.661e-02, 5.078e-02, -2.869e-02, 1.583e-02, -6.038e-02, 8.259e-02, 1.968e-02)); + r += mul(s5_3, M4(-5.837e-02, -3.722e-02, 9.666e-03, -4.201e-02, -1.323e-01, 1.443e-01, -5.002e-03, 4.363e-02, -1.992e-02, -1.277e-02, -3.254e-02, -1.540e-02, 3.748e-02, 2.348e-01, -4.119e-02, 7.178e-02)); + r += mul(s5_4, M4(-8.116e-02, 3.259e-04, -2.917e-03, -2.878e-02, 2.343e-01, 5.959e-01, -1.587e-02, 1.861e-01, 3.467e-02, -1.485e-01, 8.425e-02, 1.610e-02, -8.615e-02, -6.870e-02, -1.616e-01, 1.586e-02)); + r += mul(s5_5, M4(-3.545e-02, 7.843e-02, 6.399e-03, -1.176e-02, 2.016e-01, -2.844e-01, 1.951e-01, -1.060e-01, -4.997e-02, -7.652e-02, 1.541e-02, 6.366e-02, -1.896e-01, -2.584e-02, 2.438e-02, 1.348e-01)); + r += mul(s5_6, M4(-1.974e-01, -8.405e-03, -2.123e-01, -8.176e-02, 9.694e-02, 5.998e-02, 1.547e-02, -2.905e-03, 8.708e-02, 8.034e-03, 3.775e-02, 1.818e-01, 5.126e-02, 3.987e-02, 1.284e-01, -1.518e-03)); + r += mul(s5_7, M4(5.220e-02, 1.340e-02, -1.743e-01, 4.127e-02, -1.978e-02, 7.040e-02, -2.645e-02, -1.323e-02, 9.182e-02, -4.373e-02, -1.061e-01, -1.235e-02, -2.161e-02, -2.467e-02, -2.966e-02, 8.084e-02)); + r += mul(s5_8, M4(-6.631e-02, -5.012e-02, -4.244e-02, -3.246e-02, 4.081e-02, -8.937e-02, 2.919e-01, 1.024e-01, -1.422e-02, 1.074e-01, -9.297e-02, 5.605e-02, 6.896e-02, -4.789e-02, -1.934e-02, 1.737e-02)); + r += mul(s6_0, M4(-9.073e-03, -1.754e-02, 4.972e-02, -6.835e-02, -3.904e-02, -1.677e-01, 8.521e-02, 3.834e-02, 2.069e-02, 4.147e-02, 1.049e-01, 3.096e-02, -2.174e-02, -8.744e-02, -1.113e-02, -7.001e-02)); + r += mul(s6_1, M4(3.434e-02, -2.274e-02, 1.253e-01, -1.063e-01, -3.540e-02, -9.340e-02, 6.120e-02, 1.239e-01, 5.530e-02, 7.165e-02, -5.067e-03, 1.067e-01, -9.119e-02, -8.561e-02, -1.101e-01, 1.067e-01)); + r += mul(s6_2, M4(-4.281e-02, -2.995e-02, -1.066e-01, 6.098e-02, 8.980e-03, -7.168e-02, -4.666e-02, 2.937e-02, 3.310e-03, 3.018e-02, 2.480e-02, 7.947e-02, -1.268e-01, 7.243e-02, -1.587e-01, 2.873e-02)); + r += mul(s6_3, M4(2.600e-02, 5.897e-02, -1.263e-03, -6.894e-02, -6.384e-02, -1.612e-01, -5.427e-02, 6.186e-02, 1.760e-01, 2.669e-01, 3.821e-02, 3.010e-01, -1.674e-01, -7.476e-02, 8.858e-02, 1.153e-01)); + r += mul(s6_4, M4(1.203e-01, 1.557e-01, 1.469e-01, -9.516e-02, 1.520e-03, -1.370e-02, -1.449e-01, 2.500e-01, -4.001e-02, 1.999e-01, 2.881e-01, -1.819e-02, -3.389e-02, 6.567e-02, 8.503e-02, 1.733e-02)); + r += mul(s6_5, M4(3.438e-02, -1.250e-01, -6.958e-02, -4.063e-02, -5.483e-02, -6.863e-02, -1.213e-01, -2.927e-02, 1.284e-01, -6.142e-03, 1.957e-02, -1.307e-02, 1.251e-01, 1.507e-01, -2.603e-01, -1.227e-02)); + r += mul(s6_6, M4(2.157e-02, -1.465e-02, 1.523e-01, -6.046e-02, -8.609e-02, -4.715e-02, 1.801e-02, 9.497e-02, -1.116e-01, 2.122e-01, 1.647e-01, -4.762e-02, -1.156e-02, 1.387e-01, 1.673e-02, 4.068e-02)); + r += mul(s6_7, M4(-1.946e-01, 9.404e-02, -2.110e-02, 3.399e-02, 6.190e-02, 1.982e-02, -1.791e-01, -2.514e-02, -1.027e-01, 1.270e-01, 6.977e-02, -1.515e-01, -2.467e-01, 1.036e-02, -1.526e-01, 5.823e-02)); + r += mul(s6_8, M4(-1.138e-02, -1.343e-03, 1.883e-02, 4.750e-03, -1.078e-01, -6.960e-02, 2.031e-02, -9.450e-03, -1.573e-01, 5.856e-02, 8.049e-02, 1.523e-02, -7.131e-03, 2.186e-02, -1.193e-01, -4.367e-03)); + r += mul(s7_0, M4(6.713e-02, -1.520e-01, -6.436e-02, -6.020e-02, 2.039e-02, -1.286e-01, -5.889e-02, 5.892e-03, 5.342e-02, 2.392e-02, 1.846e-02, -4.619e-02, 8.635e-02, -3.852e-02, 1.285e-02, -7.964e-02)); + r += mul(s7_1, M4(6.131e-02, -4.675e-03, -2.128e-03, -2.768e-02, -1.824e-02, 1.480e-02, 7.807e-03, 2.532e-02, 3.629e-02, 3.362e-02, 8.573e-02, 5.274e-02, 6.908e-02, 4.769e-02, 1.208e-01, -1.841e-01)); + r += mul(s7_2, M4(1.717e-03, 5.158e-02, -3.611e-02, 2.600e-02, -1.293e-02, 1.304e-03, -3.547e-02, 2.271e-02, 3.415e-02, 7.292e-02, -1.885e-02, 8.324e-02, 2.077e-02, -6.252e-02, 4.631e-03, -1.112e-03)); + r += mul(s7_3, M4(-5.372e-02, 2.620e-02, 5.227e-02, -3.020e-03, -8.740e-02, -1.964e-02, -2.730e-02, -2.839e-02, 5.457e-02, 3.909e-02, 2.537e-02, 6.894e-02, 5.165e-02, 4.257e-02, -1.101e-01, 7.219e-02)); + r += mul(s7_4, M4(3.319e-02, -2.076e-02, 6.214e-02, -2.477e-02, -1.349e-01, -4.793e-02, 5.303e-02, 2.127e-01, -8.348e-02, 2.164e-01, 1.433e-01, -2.909e-02, 1.139e-01, 1.535e-01, 1.743e-01, 1.616e-01)); + r += mul(s7_5, M4(8.549e-02, 5.226e-02, -1.042e-01, 1.041e-02, 4.782e-03, 7.801e-02, -6.359e-02, -3.618e-02, -1.527e-02, 8.395e-02, -4.284e-02, -7.498e-03, 1.422e-01, 1.298e-01, -1.283e-01, 6.424e-02)); + r += mul(s7_6, M4(3.569e-02, -6.977e-02, -8.615e-02, 2.842e-02, 7.590e-03, -1.724e-02, -7.115e-04, -7.015e-03, -1.663e-01, -8.630e-03, -2.303e-03, -4.852e-02, -4.141e-02, 1.975e-02, 5.583e-03, -1.889e-03)); + r += mul(s7_7, M4(-8.110e-02, 2.969e-02, 7.912e-02, 1.544e-01, -3.533e-02, 8.551e-02, -4.045e-02, -3.620e-02, -2.196e-01, -4.689e-03, -7.544e-02, 9.318e-02, 1.025e-02, 5.217e-02, 1.583e-01, -1.998e-02)); + r += mul(s7_8, M4(5.941e-02, 5.430e-02, -4.319e-02, 1.788e-01, -1.098e-01, -3.786e-02, 4.683e-02, 1.391e-02, 7.806e-02, 6.420e-02, 6.208e-03, 1.265e-01, 3.927e-02, 6.978e-03, 7.370e-02, 3.876e-02)); + r += V4(1.144e-02, 3.230e-03, 4.037e-03, -8.587e-03); + return r; +} + +V4 f3(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(4.333e-02, 7.243e-02, -1.420e-02, -1.528e-02, 9.266e-04, -8.016e-02, 3.355e-03, 5.928e-02, 7.778e-03, 1.089e-01, -3.087e-01, -1.395e-02, -4.188e-02, 6.859e-02, -4.320e-03, 5.852e-02)); + r += mul(s0_1, M4(1.893e-03, -4.743e-02, -3.286e-03, 4.100e-02, 1.026e-01, -2.680e-02, 1.772e-02, 3.075e-02, 1.845e-01, 8.216e-02, -1.240e-01, -3.225e-02, -5.808e-02, 5.763e-02, 1.253e-02, 6.966e-02)); + r += mul(s0_2, M4(3.112e-02, 6.029e-03, 4.024e-02, 9.813e-02, -1.934e-02, -1.030e-01, -5.682e-03, -1.142e-01, 1.591e-01, -4.722e-02, -4.683e-02, -4.834e-02, 4.591e-02, 1.959e-01, 2.813e-02, 1.684e-02)); + r += mul(s0_3, M4(3.717e-03, 4.428e-02, -2.979e-02, -1.319e-01, -7.907e-02, -2.063e-01, 1.318e-01, 3.302e-01, 3.874e-01, -1.794e-01, -3.385e-01, 8.205e-02, -9.249e-02, 8.499e-02, 5.865e-02, 7.559e-02)); + r += mul(s0_4, M4(7.178e-02, -1.156e-01, 1.608e-01, -9.580e-03, 1.050e-01, -2.917e-01, -2.364e-02, -2.877e-01, -2.610e-02, 1.579e-01, -2.220e-01, 4.093e-01, -1.190e-03, -1.960e-02, 1.909e-01, 4.487e-02)); + r += mul(s0_5, M4(-3.653e-03, 1.197e-04, -5.824e-02, 4.286e-02, -4.729e-02, -5.418e-02, 3.518e-03, -2.898e-02, 1.607e-01, -2.224e-01, -5.801e-02, -1.593e-01, 4.829e-02, 4.995e-02, -3.266e-02, 2.814e-02)); + r += mul(s0_6, M4(6.767e-02, -2.756e-03, 6.101e-02, -5.580e-02, 3.613e-02, 1.924e-02, 3.047e-03, -1.283e-01, 3.231e-01, 1.304e-01, -9.342e-02, -4.034e-02, 4.553e-02, -7.184e-03, 1.890e-02, -1.038e-02)); + r += mul(s0_7, M4(1.376e-01, -8.569e-02, -3.427e-02, 5.919e-02, 1.711e-01, -1.167e-01, 4.846e-02, 8.636e-03, -5.423e-03, -2.490e-02, -2.068e-01, 2.383e-01, -2.875e-02, -7.850e-02, -9.597e-02, 7.667e-02)); + r += mul(s0_8, M4(1.119e-02, -3.089e-02, -1.391e-01, -5.112e-02, 7.785e-02, -1.214e-01, 6.563e-02, -2.149e-02, 2.425e-01, -3.175e-02, 8.154e-02, 5.956e-02, -1.279e-03, 4.092e-02, -4.260e-03, -1.078e-02)); + r += mul(s1_0, M4(-7.396e-02, 5.582e-02, -1.548e-02, 2.137e-02, 4.709e-02, -5.059e-02, -2.153e-02, 2.702e-03, 1.671e-02, -4.083e-03, 2.723e-02, -1.240e-02, -1.083e-01, -5.522e-02, -3.805e-02, -5.451e-03)); + r += mul(s1_1, M4(-5.498e-02, -8.589e-02, -3.719e-02, 3.869e-02, -6.313e-02, -1.802e-01, -3.138e-02, -1.590e-02, 8.387e-02, -3.262e-02, -2.200e-02, -1.219e-01, 7.055e-02, -3.643e-02, -3.876e-02, 2.919e-02)); + r += mul(s1_2, M4(-5.971e-02, -9.605e-02, 1.531e-02, 2.150e-02, -1.796e-02, 1.420e-01, -2.047e-02, -7.588e-02, -1.726e-02, -5.413e-02, 2.955e-02, -6.840e-03, 1.229e-01, -5.442e-02, 1.122e-02, 9.035e-02)); + r += mul(s1_3, M4(-2.981e-02, 4.970e-02, 1.666e-02, 3.094e-02, -7.380e-02, -6.886e-03, 9.964e-02, -1.509e-01, 4.556e-03, 3.679e-02, -1.705e-02, 2.600e-02, 2.041e-02, -1.858e-02, -9.259e-02, -6.156e-02)); + r += mul(s1_4, M4(-1.437e-01, -1.724e-01, 2.822e-01, 2.717e-01, 4.589e-02, -6.308e-01, 5.793e-02, -2.265e-02, 5.042e-02, 1.364e-01, -3.804e-02, 4.237e-03, 2.043e-01, 1.153e-02, 1.238e-01, 1.210e-02)); + r += mul(s1_5, M4(1.812e-02, -5.285e-02, 2.342e-02, 7.906e-02, -7.495e-02, 2.884e-01, 8.660e-02, 2.412e-02, 4.516e-02, -1.052e-01, -1.014e-03, -2.533e-02, 4.660e-02, 9.580e-02, -7.580e-02, -5.971e-02)); + r += mul(s1_6, M4(-9.260e-02, 6.785e-02, 1.371e-01, -1.164e-01, 1.498e-01, 1.070e-01, -6.899e-02, -1.077e-01, -5.263e-02, 1.199e-02, -1.819e-03, -3.347e-02, -1.207e-02, -5.150e-02, -7.479e-02, -8.583e-02)); + r += mul(s1_7, M4(-4.297e-02, -3.878e-02, 1.497e-01, 7.435e-02, 9.017e-02, -1.620e-02, 1.384e-01, 3.013e-02, 6.530e-02, 7.376e-02, -1.695e-02, 4.129e-02, -1.378e-01, -1.839e-01, 5.109e-02, -2.315e-02)); + r += mul(s1_8, M4(-9.330e-02, -6.025e-02, 1.083e-02, 6.513e-02, -6.527e-02, -8.349e-02, 3.801e-03, -5.190e-02, 4.935e-02, -1.226e-02, -1.807e-05, 2.047e-02, -1.693e-01, 4.893e-03, 4.495e-02, -8.611e-02)); + r += mul(s2_0, M4(-4.397e-03, -2.235e-03, 1.233e-02, 1.180e-02, -4.661e-02, 6.362e-02, 1.035e-01, 7.738e-02, -2.816e-02, 1.176e-01, -2.514e-02, 5.308e-02, 1.755e-01, 1.390e-01, -4.273e-03, 4.984e-02)); + r += mul(s2_1, M4(5.881e-02, -7.890e-02, -4.904e-02, -1.664e-01, -1.577e-01, -1.212e-01, 1.829e-01, 1.517e-01, 2.948e-02, -3.110e-02, -6.089e-02, 8.470e-02, 2.931e-01, 1.623e-02, -1.035e-02, 1.867e-02)); + r += mul(s2_2, M4(8.029e-03, -5.064e-02, 3.720e-02, 4.260e-02, -9.060e-03, 2.332e-01, 5.485e-02, -1.948e-01, -4.837e-02, -2.903e-02, -3.019e-02, -9.514e-04, 2.468e-01, -1.600e-02, 5.436e-02, 5.084e-02)); + r += mul(s2_3, M4(-1.575e-01, 2.353e-02, 3.893e-02, 5.288e-02, -1.999e-02, 1.489e-01, -6.922e-02, -9.150e-02, 1.382e-01, 6.813e-02, -3.534e-02, -6.858e-02, 1.107e-01, 9.316e-02, 1.947e-03, 1.004e-01)); + r += mul(s2_4, M4(-3.720e-01, -5.447e-02, 2.549e-02, 2.286e-01, 1.167e-01, -2.583e-02, -6.140e-02, 1.555e-01, -6.848e-03, 4.610e-01, -2.326e-02, -9.978e-02, -9.189e-02, 1.148e-02, 5.049e-02, 4.296e-02)); + r += mul(s2_5, M4(-9.210e-02, 1.150e-01, -1.262e-02, -3.182e-02, -6.583e-02, 3.653e-02, -1.123e-01, -3.868e-02, 4.312e-02, -2.195e-02, -2.840e-02, 9.926e-02, 1.779e-01, 4.119e-02, 7.840e-02, 1.152e-02)); + r += mul(s2_6, M4(-5.914e-02, -2.219e-02, -9.741e-02, -9.852e-03, -2.060e-01, -2.879e-02, -3.191e-02, -6.268e-03, 1.707e-01, -4.309e-02, -9.542e-02, 1.030e-02, 1.644e-01, 6.315e-02, 2.777e-02, -4.545e-02)); + r += mul(s2_7, M4(6.399e-02, 2.502e-03, -8.012e-04, 2.422e-02, 1.429e-02, -2.728e-02, -8.389e-02, 3.381e-02, 5.823e-02, 4.210e-03, -2.876e-01, 1.036e-01, 7.736e-02, 5.577e-02, 6.369e-02, -1.008e-01)); + r += mul(s2_8, M4(-5.091e-02, -5.603e-03, 2.450e-02, 3.630e-02, -2.032e-03, -2.386e-02, -7.338e-02, -9.917e-02, 8.712e-02, -2.359e-02, -1.168e-01, -4.326e-02, 1.907e-01, 9.281e-02, 8.805e-02, -1.709e-02)); + r += mul(s3_0, M4(-8.492e-03, -1.684e-01, -7.766e-02, -4.028e-02, -4.158e-02, -2.127e-02, -7.257e-03, 5.917e-03, 1.217e-02, 7.317e-02, -2.137e-02, 5.041e-02, -4.243e-02, -2.898e-02, 1.979e-02, 4.331e-02)); + r += mul(s3_1, M4(-6.358e-02, -1.387e-01, -6.814e-02, -1.817e-01, 4.827e-02, 5.557e-02, -5.562e-02, -2.517e-02, 7.520e-02, -5.369e-02, -2.957e-02, 6.842e-02, -4.920e-02, 9.637e-03, -9.558e-03, -5.943e-02)); + r += mul(s3_2, M4(-1.849e-01, -1.107e-01, 1.328e-02, 6.648e-02, -6.986e-03, -3.831e-02, 2.777e-02, -9.664e-02, -1.188e-02, -8.414e-02, -5.005e-03, -6.809e-02, -3.758e-03, 3.419e-02, 1.044e-02, 2.588e-02)); + r += mul(s3_3, M4(-3.455e-02, -6.447e-02, 4.304e-02, -3.681e-02, 1.114e-02, -2.089e-02, -1.545e-01, -1.155e-01, 7.848e-02, 3.047e-02, 7.575e-03, -1.164e-01, 4.672e-02, 7.194e-03, -8.710e-03, 1.492e-02)); + r += mul(s3_4, M4(-4.902e-01, -1.553e-01, 1.198e-02, 1.993e-01, 2.566e-01, -1.017e-02, -3.468e-01, -9.216e-02, 1.138e-01, 9.617e-02, 2.042e-01, 3.819e-02, 1.073e-02, -1.215e-01, -1.253e-01, 7.351e-02)); + r += mul(s3_5, M4(1.501e-01, 9.681e-03, -1.894e-01, 5.893e-02, 8.715e-02, 4.639e-02, -7.896e-02, -2.378e-02, -4.966e-03, -2.195e-02, 6.299e-02, 1.118e-01, -4.372e-02, 4.882e-02, 4.516e-02, -5.960e-02)); + r += mul(s3_6, M4(-2.788e-02, -5.976e-02, -1.486e-02, -6.390e-02, 1.490e-02, -5.229e-02, 9.739e-03, 1.628e-02, 1.290e-01, 1.911e-02, -9.108e-02, -1.047e-01, 5.630e-02, 5.946e-02, 2.895e-02, -7.990e-03)); + r += mul(s3_7, M4(1.312e-01, -7.650e-05, -8.691e-03, 2.166e-01, 6.408e-02, 2.675e-02, -5.012e-02, -1.038e-01, 2.693e-02, -5.429e-02, -5.977e-02, 2.153e-02, -2.628e-02, 7.319e-02, 1.860e-01, 1.051e-04)); + r += mul(s3_8, M4(-2.411e-02, 7.000e-03, 3.083e-02, 1.198e-01, 2.981e-02, 1.489e-03, -7.782e-03, 1.403e-02, 9.663e-02, -7.251e-02, -8.213e-02, -3.074e-02, 9.806e-04, -4.858e-03, 5.047e-02, -1.717e-02)); + r += mul(s4_0, M4(7.733e-02, -3.449e-02, 5.216e-04, 3.603e-02, 6.168e-02, -5.736e-02, 1.789e-02, 4.947e-02, 5.769e-02, -1.078e-01, 3.067e-02, 7.693e-02, -1.915e-02, -1.371e-01, -6.832e-03, -7.441e-02)); + r += mul(s4_1, M4(-2.435e-02, 6.718e-02, -2.504e-02, -1.398e-02, -4.522e-03, -1.198e-01, 8.722e-04, -6.143e-02, -1.031e-01, 1.309e-01, 8.645e-02, -1.824e-01, 9.033e-02, -6.244e-02, 6.688e-02, 8.934e-02)); + r += mul(s4_2, M4(9.768e-03, -6.388e-03, 2.846e-04, 2.673e-02, -7.163e-02, -1.729e-01, 4.732e-02, -6.461e-02, 5.416e-02, 7.461e-02, 6.755e-03, 7.088e-02, -1.494e-01, -1.939e-01, -2.334e-02, -6.639e-02)); + r += mul(s4_3, M4(4.916e-02, 7.842e-02, 8.636e-02, 4.896e-03, 2.077e-02, -7.260e-03, 6.933e-02, -1.500e-01, 3.326e-02, -6.514e-02, 4.309e-02, 5.474e-02, 2.360e-03, 3.087e-02, -1.838e-02, 3.402e-02)); + r += mul(s4_4, M4(8.343e-02, -7.392e-02, 2.044e-01, -2.791e-02, -3.864e-01, -3.340e-02, 7.701e-02, 2.842e-01, 1.702e-01, 4.962e-02, -1.480e-02, 1.600e-02, -3.186e-01, -2.030e-02, -4.357e-02, 3.020e-01)); + r += mul(s4_5, M4(-2.993e-02, -8.284e-02, -1.575e-02, 5.972e-02, 3.788e-02, -1.095e-01, 4.894e-03, -3.231e-02, 1.271e-01, 1.447e-01, -3.134e-02, 1.608e-01, 8.349e-02, -1.777e-01, -4.498e-02, 1.421e-02)); + r += mul(s4_6, M4(7.155e-02, 5.883e-04, 1.742e-02, -6.199e-02, 5.508e-03, -1.616e-02, -8.643e-02, -5.801e-02, 3.736e-02, 3.901e-03, -3.167e-02, -6.554e-03, 8.429e-02, 4.994e-03, 2.081e-02, 1.212e-01)); + r += mul(s4_7, M4(9.735e-02, -1.938e-03, -1.700e-02, -1.096e-03, 5.024e-02, 6.836e-02, 2.904e-02, -1.549e-01, -4.559e-02, 5.448e-02, -1.101e-01, -5.234e-02, -1.289e-01, -1.165e-03, -3.390e-01, 1.432e-01)); + r += mul(s4_8, M4(2.385e-02, -9.496e-02, 4.213e-02, 1.313e-01, 1.014e-01, -3.205e-02, -2.377e-03, 9.691e-02, 3.838e-02, 5.198e-02, -4.253e-02, -2.289e-02, 2.043e-01, 1.153e-01, 3.498e-02, 4.674e-02)); + r += mul(s5_0, M4(7.349e-02, -2.872e-02, 9.839e-03, 2.575e-02, 5.040e-02, -1.200e-02, 8.394e-03, 2.789e-02, 2.753e-02, -1.327e-02, 1.611e-02, -4.654e-02, 9.155e-02, 5.441e-03, 7.285e-03, -2.150e-02)); + r += mul(s5_1, M4(-3.458e-02, 6.279e-02, -9.407e-02, -4.962e-02, -2.365e-02, -3.668e-03, -5.242e-02, 4.234e-02, 1.004e-01, 8.471e-02, -7.121e-03, -3.339e-02, 1.435e-01, 1.598e-02, -9.651e-03, -9.784e-03)); + r += mul(s5_2, M4(5.242e-02, 4.609e-02, -5.016e-02, -8.921e-03, -3.206e-02, 9.631e-02, 2.813e-02, 1.163e-01, -7.121e-02, -2.991e-02, 4.636e-02, 1.120e-02, -9.152e-03, 1.125e-01, -2.285e-02, -2.552e-02)); + r += mul(s5_3, M4(5.592e-02, 1.196e-01, 1.682e-01, -2.464e-02, 9.764e-02, 1.534e-02, 2.007e-02, 1.612e-03, 1.054e-02, 3.811e-03, 3.054e-02, 7.187e-02, 3.507e-03, 5.375e-04, -3.795e-02, 9.252e-02)); + r += mul(s5_4, M4(3.448e-02, -1.545e-01, 2.232e-01, -1.527e-01, -2.125e-02, 2.051e-02, -1.904e-01, 2.173e-01, -9.658e-02, 1.783e-02, -1.125e-01, 5.383e-02, -2.253e-02, -2.935e-02, 7.137e-02, 2.442e-02)); + r += mul(s5_5, M4(-5.549e-02, 8.547e-04, 2.289e-02, -1.332e-02, 2.281e-02, 5.366e-01, -5.318e-02, 1.265e-01, 1.038e-01, 4.680e-02, -8.508e-03, -1.544e-03, -1.590e-01, -1.295e-01, -1.334e-02, -5.572e-02)); + r += mul(s5_6, M4(-6.454e-02, -7.916e-03, 2.528e-01, 8.998e-02, 4.818e-02, -5.405e-02, 2.007e-02, 5.993e-02, -4.428e-02, 5.162e-02, 3.843e-03, -2.584e-02, -5.946e-02, -1.401e-02, 6.041e-03, 3.848e-02)); + r += mul(s5_7, M4(1.182e-03, -9.651e-02, 9.935e-02, 4.947e-02, -1.461e-01, -5.850e-02, -9.432e-03, 1.211e-01, -9.445e-02, 1.133e-01, 1.787e-01, 4.793e-03, -8.293e-03, 5.160e-02, -2.377e-02, -5.676e-02)); + r += mul(s5_8, M4(-1.146e-02, -4.489e-02, 7.513e-02, 5.885e-04, -1.190e-01, -8.698e-03, -9.437e-02, -1.321e-01, 2.545e-02, -2.781e-02, 1.584e-02, -2.690e-02, 1.731e-01, 2.264e-02, 2.818e-02, 4.671e-02)); + r += mul(s6_0, M4(-5.553e-02, -3.049e-02, -2.810e-02, -1.063e-01, 1.536e-02, -2.471e-02, 1.935e-02, 4.999e-02, 6.846e-02, 1.009e-01, -2.470e-02, 1.182e-02, -1.138e-01, 9.476e-02, 5.192e-02, -6.661e-02)); + r += mul(s6_1, M4(-3.158e-02, 5.134e-02, -6.506e-03, 7.267e-02, -1.884e-02, -9.547e-02, 3.190e-02, -6.813e-02, -8.190e-03, -8.898e-02, -5.854e-03, 1.788e-02, -1.405e-01, -1.055e-01, 7.843e-02, 4.259e-02)); + r += mul(s6_2, M4(-4.024e-02, 1.837e-01, -9.659e-03, -9.674e-03, 8.621e-03, 2.509e-02, 5.523e-02, -4.426e-02, 4.017e-02, 5.583e-02, -2.628e-02, -3.894e-02, 1.962e-02, -1.237e-01, -2.311e-02, -9.066e-02)); + r += mul(s6_3, M4(-3.900e-02, -1.781e-02, -7.406e-02, 1.704e-02, -9.738e-02, -2.576e-02, 7.946e-02, 5.064e-02, 1.845e-01, 2.445e-02, -2.101e-03, -6.988e-02, -2.396e-01, -5.705e-02, 9.223e-02, 9.614e-03)); + r += mul(s6_4, M4(1.962e-01, 2.403e-01, -5.725e-02, -8.831e-02, -2.979e-01, -2.226e-01, 1.183e-02, 1.560e-02, -1.624e-01, 2.325e-01, 3.164e-02, 1.086e-01, -2.150e-01, -1.872e-02, -1.079e-03, 2.493e-01)); + r += mul(s6_5, M4(1.691e-04, -9.056e-02, 1.531e-01, -6.422e-02, -1.466e-01, 7.739e-02, 6.450e-02, -1.165e-01, 1.404e-04, 1.104e-01, 1.496e-02, -3.789e-02, -5.526e-02, 3.597e-02, 1.578e-01, -4.722e-02)); + r += mul(s6_6, M4(-9.485e-02, -2.619e-03, -2.968e-02, 2.768e-03, 9.337e-02, 1.958e-02, 2.719e-02, -8.179e-03, 7.328e-02, -2.161e-02, -4.146e-02, 5.023e-02, 1.997e-01, -3.878e-02, 4.260e-02, 1.436e-02)); + r += mul(s6_7, M4(8.732e-02, 9.822e-03, -1.201e-02, 1.027e-01, 8.020e-02, 1.386e-02, 9.703e-02, 9.239e-02, 1.340e-01, 5.484e-02, 9.953e-02, -7.304e-02, 3.625e-02, -4.690e-02, 9.176e-02, 6.110e-02)); + r += mul(s6_8, M4(-9.272e-02, 3.165e-02, -5.926e-02, -5.496e-02, -3.022e-02, 2.849e-02, 6.468e-02, 1.194e-02, -4.001e-02, -3.142e-02, -3.773e-02, -7.805e-02, -3.019e-02, -6.167e-02, 5.378e-02, 6.293e-02)); + r += mul(s7_0, M4(-6.682e-02, -3.100e-03, 4.288e-02, -4.757e-02, 1.168e-02, 4.485e-03, 1.499e-02, -4.155e-02, -5.604e-02, -3.052e-03, 4.053e-03, -9.959e-03, 2.347e-02, 1.329e-01, -7.440e-02, 1.943e-02)); + r += mul(s7_1, M4(-1.225e-01, 1.294e-01, -1.058e-02, -1.070e-02, -1.750e-02, 4.497e-03, 3.608e-02, 1.315e-02, -1.025e-01, -6.416e-02, 6.496e-02, 3.045e-03, 6.792e-02, 4.245e-02, -6.879e-02, 2.115e-01)); + r += mul(s7_2, M4(-4.218e-02, 5.811e-02, -4.552e-02, -4.372e-02, 1.682e-02, 3.276e-02, 1.525e-02, -1.266e-02, 6.467e-02, -6.312e-02, -2.242e-02, -2.783e-02, 2.884e-02, 6.089e-02, -2.662e-02, 2.866e-02)); + r += mul(s7_3, M4(-2.057e-02, -4.344e-02, 2.442e-02, 1.680e-01, -8.247e-02, 1.266e-02, -3.677e-02, 2.206e-02, 3.236e-02, -2.898e-02, -7.851e-02, 7.222e-02, -1.709e-02, 6.476e-02, -1.110e-01, -1.086e-01)); + r += mul(s7_4, M4(-7.845e-02, 1.909e-01, 3.045e-02, 8.544e-02, -7.163e-02, -1.065e-01, -1.011e-01, -1.703e-01, -1.102e-01, 1.369e-01, 2.257e-01, 3.306e-01, 1.614e-01, -4.870e-02, -1.226e-01, -2.679e-01)); + r += mul(s7_5, M4(9.959e-03, -9.835e-02, 2.715e-02, -6.583e-03, 4.776e-02, 2.997e-02, -1.947e-02, -4.679e-02, 2.217e-02, -4.622e-02, -7.050e-02, 1.626e-02, -2.419e-02, -7.395e-02, 1.233e-01, 6.038e-02)); + r += mul(s7_6, M4(-4.357e-02, -2.921e-03, 1.762e-02, 4.688e-03, -3.021e-02, 4.270e-03, 9.634e-02, -1.632e-02, 1.907e-02, 5.368e-02, 7.232e-02, -2.958e-02, 6.972e-02, 4.948e-02, -8.427e-02, -7.472e-03)); + r += mul(s7_7, M4(-4.863e-02, 2.256e-03, 1.555e-01, 9.200e-02, 5.525e-02, -7.310e-02, 7.447e-02, -4.961e-02, -9.250e-02, -2.349e-02, 1.928e-01, 2.023e-02, 4.853e-02, -3.875e-02, -2.442e-01, -7.941e-02)); + r += mul(s7_8, M4(-1.036e-02, -4.162e-03, -3.954e-02, 3.330e-02, -5.723e-02, -3.625e-02, 2.070e-02, 1.482e-03, 5.367e-03, -3.066e-02, -5.701e-02, -3.775e-02, 3.520e-02, 7.684e-02, -4.128e-02, -2.718e-02)); + r += V4(4.936e-03, 2.207e-02, -4.522e-03, -1.855e-03); + return r; +} + +void Pass6(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = Rmp8x8(tid.x) + blockStart; + uint2 size = GetInputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = (gxy + 0.5) * pt; + + V4 s0_0 = l0(-1.0, -1.0); + V4 s0_1 = l0(0.0, -1.0); + V4 s0_2 = l0(1.0, -1.0); + V4 s0_3 = l0(-1.0, 0.0); + V4 s0_4 = l0(0.0, 0.0); + V4 s0_5 = l0(1.0, 0.0); + V4 s0_6 = l0(-1.0, 1.0); + V4 s0_7 = l0(0.0, 1.0); + V4 s0_8 = l0(1.0, 1.0); + V4 s1_0 = -max(-s0_0, 0.0); + V4 s1_1 = -max(-s0_1, 0.0); + V4 s1_2 = -max(-s0_2, 0.0); + V4 s1_3 = -max(-s0_3, 0.0); + V4 s1_4 = -max(-s0_4, 0.0); + V4 s1_5 = -max(-s0_5, 0.0); + V4 s1_6 = -max(-s0_6, 0.0); + V4 s1_7 = -max(-s0_7, 0.0); + V4 s1_8 = -max(-s0_8, 0.0); + s0_0 = max(s0_0, 0.0); + s0_1 = max(s0_1, 0.0); + s0_2 = max(s0_2, 0.0); + s0_3 = max(s0_3, 0.0); + s0_4 = max(s0_4, 0.0); + s0_5 = max(s0_5, 0.0); + s0_6 = max(s0_6, 0.0); + s0_7 = max(s0_7, 0.0); + s0_8 = max(s0_8, 0.0); + + V4 s2_0 = l1(-1.0, -1.0); + V4 s2_1 = l1(0.0, -1.0); + V4 s2_2 = l1(1.0, -1.0); + V4 s2_3 = l1(-1.0, 0.0); + V4 s2_4 = l1(0.0, 0.0); + V4 s2_5 = l1(1.0, 0.0); + V4 s2_6 = l1(-1.0, 1.0); + V4 s2_7 = l1(0.0, 1.0); + V4 s2_8 = l1(1.0, 1.0); + V4 s3_0 = -max(-s2_0, 0.0); + V4 s3_1 = -max(-s2_1, 0.0); + V4 s3_2 = -max(-s2_2, 0.0); + V4 s3_3 = -max(-s2_3, 0.0); + V4 s3_4 = -max(-s2_4, 0.0); + V4 s3_5 = -max(-s2_5, 0.0); + V4 s3_6 = -max(-s2_6, 0.0); + V4 s3_7 = -max(-s2_7, 0.0); + V4 s3_8 = -max(-s2_8, 0.0); + s2_0 = max(s2_0, 0.0); + s2_1 = max(s2_1, 0.0); + s2_2 = max(s2_2, 0.0); + s2_3 = max(s2_3, 0.0); + s2_4 = max(s2_4, 0.0); + s2_5 = max(s2_5, 0.0); + s2_6 = max(s2_6, 0.0); + s2_7 = max(s2_7, 0.0); + s2_8 = max(s2_8, 0.0); + + V4 s4_0 = l2(-1.0, -1.0); + V4 s4_1 = l2(0.0, -1.0); + V4 s4_2 = l2(1.0, -1.0); + V4 s4_3 = l2(-1.0, 0.0); + V4 s4_4 = l2(0.0, 0.0); + V4 s4_5 = l2(1.0, 0.0); + V4 s4_6 = l2(-1.0, 1.0); + V4 s4_7 = l2(0.0, 1.0); + V4 s4_8 = l2(1.0, 1.0); + V4 s5_0 = -max(-s4_0, 0.0); + V4 s5_1 = -max(-s4_1, 0.0); + V4 s5_2 = -max(-s4_2, 0.0); + V4 s5_3 = -max(-s4_3, 0.0); + V4 s5_4 = -max(-s4_4, 0.0); + V4 s5_5 = -max(-s4_5, 0.0); + V4 s5_6 = -max(-s4_6, 0.0); + V4 s5_7 = -max(-s4_7, 0.0); + V4 s5_8 = -max(-s4_8, 0.0); + s4_0 = max(s4_0, 0.0); + s4_1 = max(s4_1, 0.0); + s4_2 = max(s4_2, 0.0); + s4_3 = max(s4_3, 0.0); + s4_4 = max(s4_4, 0.0); + s4_5 = max(s4_5, 0.0); + s4_6 = max(s4_6, 0.0); + s4_7 = max(s4_7, 0.0); + s4_8 = max(s4_8, 0.0); + + V4 s6_0 = l3(-1.0, -1.0); + V4 s6_1 = l3(0.0, -1.0); + V4 s6_2 = l3(1.0, -1.0); + V4 s6_3 = l3(-1.0, 0.0); + V4 s6_4 = l3(0.0, 0.0); + V4 s6_5 = l3(1.0, 0.0); + V4 s6_6 = l3(-1.0, 1.0); + V4 s6_7 = l3(0.0, 1.0); + V4 s6_8 = l3(1.0, 1.0); + V4 s7_0 = -max(-s6_0, 0.0); + V4 s7_1 = -max(-s6_1, 0.0); + V4 s7_2 = -max(-s6_2, 0.0); + V4 s7_3 = -max(-s6_3, 0.0); + V4 s7_4 = -max(-s6_4, 0.0); + V4 s7_5 = -max(-s6_5, 0.0); + V4 s7_6 = -max(-s6_6, 0.0); + V4 s7_7 = -max(-s6_7, 0.0); + V4 s7_8 = -max(-s6_8, 0.0); + s6_0 = max(s6_0, 0.0); + s6_1 = max(s6_1, 0.0); + s6_2 = max(s6_2, 0.0); + s6_3 = max(s6_3, 0.0); + s6_4 = max(s6_4, 0.0); + s6_5 = max(s6_5, 0.0); + s6_6 = max(s6_6, 0.0); + s6_7 = max(s6_7, 0.0); + s6_8 = max(s6_8, 0.0); + + t4[gxy] = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t5[gxy] = f1(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t6[gxy] = f2(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t7[gxy] = f3(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); +} + +//!PASS 7 +//!DESC conv6 +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 +//!IN t4, t5, t6, t7 +//!OUT t0, t1, t2, t3 + +#define l0(x, y) V4(O(t4, float2(x, y))) +#define l1(x, y) V4(O(t5, float2(x, y))) +#define l2(x, y) V4(O(t6, float2(x, y))) +#define l3(x, y) V4(O(t7, float2(x, y))) + +V4 f0(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(2.892e-02, 9.057e-04, -2.227e-02, 1.170e-01, 5.052e-02, -4.755e-02, -2.612e-02, 6.990e-02, -6.464e-02, -4.279e-02, 1.755e-02, -4.057e-02, -3.950e-02, 6.520e-03, -3.059e-02, -7.818e-03)); + r += mul(s0_1, M4(9.898e-03, 1.838e-02, -3.997e-02, 3.761e-02, -2.064e-02, -6.330e-02, 2.579e-02, -3.046e-02, -1.524e-02, 4.854e-02, -7.193e-02, -3.546e-03, 1.800e-02, 7.523e-04, -1.513e-02, 5.210e-03)); + r += mul(s0_2, M4(-5.011e-02, -7.229e-02, -1.374e-02, -5.250e-02, 5.590e-04, -1.762e-02, -3.047e-02, -5.688e-02, -5.930e-02, 2.584e-02, -1.109e-03, 8.703e-02, 1.787e-02, -1.783e-02, -4.701e-02, -2.684e-02)); + r += mul(s0_3, M4(-9.078e-02, -3.604e-03, 8.995e-02, 3.718e-02, 1.311e-01, -3.371e-02, -3.473e-02, -2.238e-01, 8.436e-02, 2.053e-02, 4.818e-02, -3.848e-02, 1.036e-01, 1.370e-01, -6.924e-02, -1.183e-01)); + r += mul(s0_4, M4(-1.547e-01, 9.445e-02, -6.589e-02, 1.662e-01, 1.747e-01, -1.342e-01, 5.341e-02, -3.193e-01, 2.132e-01, 2.009e-01, 5.479e-02, -1.624e-01, -9.093e-02, 1.332e-01, 2.477e-01, -3.623e-01)); + r += mul(s0_5, M4(2.956e-02, 5.554e-02, 2.417e-02, -5.816e-02, 1.005e-01, 8.073e-02, 2.686e-02, 3.986e-03, -1.567e-02, -4.538e-02, -7.194e-02, 8.519e-03, 5.708e-02, 7.690e-02, -5.197e-03, -7.138e-02)); + r += mul(s0_6, M4(-5.022e-02, 1.932e-02, 1.924e-03, -2.213e-02, 1.373e-02, -8.656e-02, -3.289e-03, -5.205e-02, -3.293e-02, -5.007e-02, 6.656e-02, 6.720e-03, 1.852e-01, 1.395e-01, -1.305e-01, 7.133e-02)); + r += mul(s0_7, M4(3.341e-02, 2.647e-02, -1.255e-01, 9.840e-02, 1.228e-01, 3.911e-02, -1.104e-01, 4.893e-02, 1.619e-01, -1.152e-02, 1.642e-01, -2.472e-01, 7.064e-02, 7.472e-02, -2.321e-02, 1.860e-01)); + r += mul(s0_8, M4(3.182e-03, -1.035e-02, -4.764e-03, -2.834e-02, -4.592e-02, -8.360e-02, -1.049e-01, 9.181e-02, -5.580e-03, -2.966e-02, 4.314e-02, -5.040e-02, 7.959e-03, -4.075e-02, -7.035e-02, 7.185e-03)); + r += mul(s1_0, M4(1.005e-02, 3.869e-02, -9.593e-02, -6.703e-02, -5.489e-03, -6.815e-02, -2.919e-02, 7.197e-02, -3.231e-02, -8.941e-02, -2.824e-03, -1.433e-01, -4.432e-02, 2.306e-02, 2.600e-02, 2.355e-02)); + r += mul(s1_1, M4(-1.337e-02, 6.519e-02, 6.904e-02, 2.077e-01, -7.160e-02, -6.044e-03, -9.011e-02, -4.576e-02, -6.759e-02, -3.018e-02, 2.219e-02, -2.280e-02, 3.455e-03, -8.716e-02, 2.434e-02, 2.113e-02)); + r += mul(s1_2, M4(-4.231e-03, 8.658e-02, -4.622e-04, -1.155e-01, -6.464e-02, -7.393e-03, 2.837e-02, -3.901e-03, -3.928e-02, -1.095e-01, -2.863e-02, -9.264e-02, -5.068e-02, -1.030e-01, -1.353e-02, -3.888e-02)); + r += mul(s1_3, M4(6.558e-02, -2.655e-02, 2.628e-02, 1.995e-02, 7.401e-02, -5.787e-02, 5.426e-02, -1.168e-01, -4.519e-02, -1.051e-01, 4.971e-02, -2.537e-01, -9.540e-02, 1.039e-01, -1.761e-02, 1.026e-02)); + r += mul(s1_4, M4(1.446e-02, 1.660e-01, -1.851e-01, 4.339e-01, 9.934e-02, -1.544e-01, -2.348e-01, 8.207e-02, -2.856e-02, 7.433e-02, 7.259e-02, -7.759e-02, -1.389e-01, -3.222e-02, 2.700e-01, -1.827e-01)); + r += mul(s1_5, M4(7.654e-02, 3.500e-02, -6.733e-02, 1.029e-01, -8.113e-03, -7.692e-02, -8.108e-02, 4.407e-02, -8.400e-02, -2.423e-01, -5.516e-02, -2.318e-01, 2.917e-02, 8.021e-02, 1.554e-01, -1.132e-01)); + r += mul(s1_6, M4(-5.160e-03, 1.790e-04, -3.341e-02, 1.601e-02, 7.012e-02, -6.386e-02, -9.156e-03, 5.564e-03, 6.886e-02, 2.401e-02, -2.487e-02, -9.339e-02, 6.921e-02, 1.156e-01, -1.217e-01, 8.888e-02)); + r += mul(s1_7, M4(-4.282e-02, 7.150e-02, 3.611e-02, 2.136e-02, -6.391e-03, 1.245e-01, 2.154e-03, 6.634e-02, 6.563e-02, 1.349e-01, 5.738e-02, -1.428e-02, 1.269e-01, 2.861e-02, -1.129e-01, -3.461e-02)); + r += mul(s1_8, M4(8.093e-02, 6.132e-02, -3.980e-02, 4.061e-03, -6.737e-03, -1.218e-01, -7.884e-02, 2.701e-02, -5.346e-02, -3.825e-02, -3.358e-03, -3.880e-02, 4.392e-02, 1.837e-02, -3.878e-02, 2.689e-02)); + r += mul(s2_0, M4(-1.140e-01, -1.977e-01, 8.833e-02, 3.602e-02, -8.492e-02, -4.644e-02, 7.422e-02, 4.735e-02, -6.120e-02, -2.640e-02, -9.553e-03, -4.967e-02, 2.549e-01, 6.415e-02, -2.526e-02, 5.049e-02)); + r += mul(s2_1, M4(1.352e-01, 4.401e-02, -6.839e-02, 5.522e-04, -5.163e-03, -1.764e-01, 1.450e-01, 2.832e-02, -1.245e-02, -1.053e-02, -7.027e-03, 2.384e-02, 1.973e-01, 3.105e-01, -1.400e-01, -3.123e-02)); + r += mul(s2_2, M4(-5.263e-02, -3.082e-02, 2.771e-02, 7.748e-02, 7.367e-02, 5.136e-02, 9.221e-03, -9.403e-02, -3.892e-02, 2.250e-02, 3.406e-02, -3.803e-03, 1.243e-01, 1.343e-01, 4.603e-02, 9.632e-02)); + r += mul(s2_3, M4(-2.570e-02, 9.713e-02, -3.603e-02, -1.741e-01, -3.212e-01, -1.177e-01, 5.072e-02, -6.159e-02, 1.046e-02, -8.851e-03, 1.964e-03, -2.628e-02, 5.741e-02, 1.188e-01, -5.907e-02, -9.158e-02)); + r += mul(s2_4, M4(4.535e-02, 1.107e-01, -8.172e-02, -9.792e-02, -6.629e-03, 1.336e-01, 3.079e-01, 1.386e-01, 3.253e-02, -6.700e-02, 4.914e-02, -2.250e-01, 2.649e-01, 9.882e-02, 5.684e-02, -1.145e-01)); + r += mul(s2_5, M4(8.656e-04, -1.921e-02, 4.709e-02, -2.374e-02, 1.168e-02, -1.003e-01, -7.816e-03, 2.747e-02, -1.393e-02, 4.043e-02, -1.118e-02, 4.130e-02, 5.784e-02, -2.393e-02, -1.445e-01, -2.710e-02)); + r += mul(s2_6, M4(-3.388e-03, -3.829e-02, 5.542e-02, -7.072e-02, 7.206e-02, -1.228e-01, 5.047e-02, 5.735e-02, -1.856e-02, -2.545e-02, -2.100e-02, 6.857e-03, -1.250e-02, -3.396e-02, 7.393e-02, -6.130e-02)); + r += mul(s2_7, M4(-8.575e-03, -4.300e-02, -1.490e-01, 2.881e-02, -2.819e-02, -9.092e-02, 2.132e-01, -1.420e-01, 2.622e-02, -5.709e-02, 5.645e-03, 2.712e-02, 8.451e-02, 4.578e-02, 8.928e-03, 9.006e-02)); + r += mul(s2_8, M4(4.345e-02, 2.069e-02, 1.854e-02, -1.189e-02, 4.093e-02, -2.959e-02, -1.770e-02, 7.986e-02, -1.470e-02, -2.281e-02, 6.168e-03, -5.472e-03, 1.018e-01, 5.524e-02, -1.023e-01, -3.456e-02)); + r += mul(s3_0, M4(-7.354e-02, 2.029e-02, 4.034e-02, 4.410e-02, 5.180e-02, 4.118e-02, 4.462e-02, 9.580e-02, -2.305e-01, -1.860e-01, -1.725e-01, -2.209e-01, -1.102e-01, -3.227e-02, 3.321e-02, -5.393e-02)); + r += mul(s3_1, M4(3.237e-02, -1.845e-02, 7.690e-03, 2.054e-01, 2.388e-03, 2.858e-02, 2.746e-03, 6.395e-02, -2.665e-01, -2.872e-01, 1.131e-01, -9.316e-02, 2.001e-02, 1.909e-02, 3.956e-02, 7.376e-02)); + r += mul(s3_2, M4(-3.274e-02, 4.116e-02, 9.165e-03, -6.812e-02, 1.102e-02, 5.621e-02, -3.189e-02, 6.348e-02, -2.511e-02, -6.700e-02, -3.697e-02, -1.694e-01, -5.214e-03, -2.888e-02, -4.806e-02, 6.745e-03)); + r += mul(s3_3, M4(-1.959e-01, -1.499e-01, -1.345e-01, 4.864e-02, -7.274e-02, -8.329e-02, -2.831e-03, 9.697e-02, 4.047e-01, 6.853e-02, -1.007e-01, -4.966e-02, -3.069e-02, -5.057e-02, -3.145e-02, 1.141e-01)); + r += mul(s3_4, M4(1.736e-02, 3.371e-02, -1.292e-02, 9.849e-03, -2.007e-02, 8.965e-03, 1.146e-01, 6.432e-02, -9.202e-02, 6.812e-02, 1.029e-01, -1.521e-01, -3.578e-02, 1.258e-01, 6.123e-02, -3.616e-02)); + r += mul(s3_5, M4(-1.039e-01, 2.152e-02, 5.538e-04, -1.052e-01, 2.065e-02, -6.045e-02, -4.725e-02, -7.233e-02, -2.188e-01, 1.499e-02, -1.378e-01, 6.032e-02, 2.544e-03, -2.566e-03, -8.906e-03, -4.056e-02)); + r += mul(s3_6, M4(-6.231e-02, 4.043e-02, -6.667e-02, 4.605e-02, 1.026e-01, -1.503e-02, -2.104e-02, 8.022e-02, 1.437e-01, -2.244e-01, 7.704e-02, -1.969e-01, -8.773e-02, -8.024e-02, 9.243e-03, 3.532e-02)); + r += mul(s3_7, M4(6.778e-02, 8.541e-03, -8.499e-02, 5.502e-02, -1.259e-02, -1.763e-02, 5.560e-02, -1.815e-02, -1.941e-01, -3.327e-02, 2.370e-01, -3.977e-03, 1.362e-02, 3.610e-02, -1.219e-01, 9.990e-02)); + r += mul(s3_8, M4(1.069e-01, 7.105e-02, -1.385e-02, -8.030e-03, 5.911e-02, -1.568e-02, -7.717e-03, -1.807e-02, 1.325e-01, 1.617e-03, 3.105e-02, -2.326e-01, 2.131e-02, 4.202e-02, 3.413e-03, -4.040e-02)); + r += mul(s4_0, M4(8.906e-02, 1.115e-03, 3.390e-02, -2.516e-03, 5.805e-02, -3.799e-02, 4.655e-02, 2.257e-02, 4.932e-02, 2.314e-02, -4.908e-02, 2.996e-02, 4.110e-02, -4.586e-02, -6.483e-04, -5.355e-02)); + r += mul(s4_1, M4(9.657e-02, 2.625e-02, 7.033e-02, -1.720e-02, 4.770e-02, -2.590e-02, -2.325e-02, -2.599e-02, -3.552e-02, 7.924e-02, 2.860e-02, 2.673e-02, 7.177e-02, 2.816e-02, -7.265e-03, -1.118e-01)); + r += mul(s4_2, M4(4.743e-02, -3.720e-02, 8.744e-02, -1.634e-02, -8.956e-02, 2.616e-02, 1.434e-02, 4.662e-03, 5.470e-02, 3.277e-02, -1.178e-03, -1.544e-02, -1.169e-01, -9.655e-02, 4.487e-02, -1.241e-02)); + r += mul(s4_3, M4(-1.359e-02, -5.988e-02, 2.693e-02, 2.846e-02, 9.406e-02, 5.142e-02, 5.821e-02, 3.332e-02, 1.010e-01, -4.253e-03, -5.963e-02, -1.029e-03, 4.573e-02, -6.321e-02, 3.603e-02, 3.449e-02)); + r += mul(s4_4, M4(1.066e-01, 7.866e-02, 1.535e-02, -1.959e-01, -1.472e-02, -1.645e-01, -4.944e-02, 8.975e-02, -5.317e-02, -7.101e-02, -1.510e-02, 3.471e-02, 1.469e-01, 4.420e-03, -2.352e-01, 2.438e-01)); + r += mul(s4_5, M4(3.382e-02, 6.457e-02, 1.342e-01, -6.023e-02, -7.056e-02, -1.374e-02, 3.042e-02, 8.520e-03, 1.263e-01, -7.204e-02, 1.232e-01, 1.482e-02, -8.120e-02, -1.545e-01, 5.136e-02, 5.783e-02)); + r += mul(s4_6, M4(-4.757e-02, 2.582e-02, -7.227e-03, -1.299e-02, -7.072e-02, 2.237e-02, 5.139e-02, 3.069e-02, -4.099e-02, -4.838e-02, -9.954e-03, 6.936e-03, -6.913e-02, -4.324e-03, 3.736e-02, 2.256e-02)); + r += mul(s4_7, M4(8.430e-02, 4.440e-02, -6.424e-02, 4.997e-02, 1.963e-02, 3.090e-02, -1.815e-02, 2.615e-02, 3.461e-02, 5.020e-02, -4.343e-02, 2.793e-02, 3.126e-03, 6.713e-03, -1.250e-02, 8.975e-02)); + r += mul(s4_8, M4(-4.362e-02, 2.579e-02, -8.012e-03, 5.232e-02, -7.003e-02, -4.135e-02, -7.833e-03, 8.398e-03, 3.151e-02, 7.675e-02, 2.003e-02, 1.107e-02, -1.208e-01, -7.307e-02, -2.827e-02, 1.377e-02)); + r += mul(s5_0, M4(-5.169e-02, 1.376e-02, 7.169e-02, 3.810e-02, 3.989e-04, 4.194e-02, -3.871e-02, -1.040e-02, 1.715e-01, -2.089e-02, -2.049e-02, -1.927e-02, -6.435e-03, -1.077e-01, -2.022e-02, -4.709e-02)); + r += mul(s5_1, M4(8.097e-02, 1.595e-01, 6.419e-02, 6.755e-02, 9.451e-03, 3.660e-03, -1.911e-03, -3.770e-02, 6.812e-02, -1.181e-02, 7.683e-02, 9.669e-02, -1.066e-02, 9.533e-03, -6.897e-02, -3.196e-02)); + r += mul(s5_2, M4(-1.290e-01, -1.846e-01, 3.082e-02, -3.248e-02, -9.121e-02, -5.633e-02, 1.155e-02, -7.674e-02, -4.658e-02, -1.558e-01, -7.535e-03, -6.349e-02, 5.137e-02, -1.630e-02, 3.026e-02, -3.777e-02)); + r += mul(s5_3, M4(-2.546e-02, -1.736e-02, 5.887e-02, 6.525e-02, 1.211e-01, 4.194e-02, -9.258e-02, 7.958e-02, 1.622e-02, -8.012e-02, 1.706e-02, -1.745e-01, 3.421e-02, -4.461e-02, 7.792e-02, -3.323e-02)); + r += mul(s5_4, M4(-1.058e-02, 5.965e-02, 3.412e-03, -7.582e-02, 1.101e-01, 1.057e-01, 5.295e-02, 1.138e-01, 1.188e-01, -1.380e-01, -3.663e-02, -1.563e-01, 1.298e-01, -7.933e-02, -2.861e-01, 1.125e-01)); + r += mul(s5_5, M4(-1.250e-01, 1.039e-01, 9.261e-02, -6.083e-02, -6.239e-02, -1.635e-01, 1.773e-02, -7.921e-02, 7.637e-02, -4.078e-02, 2.057e-01, -1.251e-01, -3.691e-02, -3.187e-02, 7.676e-02, 1.064e-01)); + r += mul(s5_6, M4(-1.186e-01, -9.549e-03, 4.969e-02, -3.553e-02, 3.041e-02, 4.041e-02, 2.331e-02, -1.049e-02, 9.832e-03, -3.467e-02, -3.237e-02, 5.767e-02, 3.448e-02, 3.118e-02, 1.128e-02, -2.170e-02)); + r += mul(s5_7, M4(8.589e-02, 1.011e-02, 6.850e-02, -1.698e-01, 4.856e-02, 7.526e-02, -1.202e-02, -1.346e-02, 2.155e-01, 3.896e-02, -3.379e-02, -6.320e-03, 8.241e-02, -5.493e-03, -2.139e-02, -4.874e-02)); + r += mul(s5_8, M4(8.309e-03, 1.014e-01, 1.912e-04, -1.443e-02, -9.996e-02, -5.747e-02, -1.427e-02, -3.418e-02, 1.229e-02, 4.351e-02, 3.041e-02, 4.928e-02, -2.213e-02, -3.990e-02, -1.135e-02, -3.189e-03)); + r += mul(s6_0, M4(-1.363e-03, 3.767e-02, 2.673e-02, 1.090e-01, -5.906e-02, -6.840e-02, -3.299e-03, 5.067e-02, -8.695e-02, -7.577e-03, -2.977e-02, -3.850e-02, -3.534e-02, -6.116e-02, 4.473e-02, -6.983e-02)); + r += mul(s6_1, M4(-6.196e-02, -2.664e-02, 1.405e-03, -6.275e-02, 1.508e-01, 8.178e-02, -3.065e-02, 4.872e-02, -4.752e-02, 1.714e-01, 6.112e-02, 8.994e-02, 6.323e-02, -7.808e-02, 1.595e-02, -1.112e-02)); + r += mul(s6_2, M4(7.586e-02, 5.583e-02, -2.494e-02, 6.153e-02, 5.347e-02, 3.702e-02, 3.865e-02, 8.649e-02, -1.919e-02, 2.277e-01, 4.381e-02, 9.435e-02, 7.158e-02, -8.172e-02, -3.918e-02, -1.481e-02)); + r += mul(s6_3, M4(6.842e-03, 4.130e-02, 2.458e-02, -1.275e-01, -1.430e-02, 5.328e-02, 2.890e-02, -7.957e-02, 1.503e-03, -8.867e-02, 3.256e-03, 2.632e-02, -5.296e-02, -3.447e-02, 5.496e-02, 2.323e-02)); + r += mul(s6_4, M4(-2.043e-01, -1.940e-02, 1.762e-01, -2.170e-01, -4.904e-02, 5.043e-02, -8.911e-02, -1.098e-01, 6.870e-02, -4.414e-01, -1.441e-01, 1.978e-01, -6.663e-02, -1.210e-01, -9.031e-02, 2.019e-02)); + r += mul(s6_5, M4(4.577e-02, -4.071e-02, -3.518e-03, -1.440e-01, 5.879e-03, -6.269e-02, -2.873e-02, 7.060e-02, -1.238e-01, -1.681e-01, 5.140e-02, 1.019e-01, 1.375e-01, 1.099e-01, 1.521e-02, -7.575e-02)); + r += mul(s6_6, M4(-1.973e-03, -5.379e-02, 5.083e-02, -2.667e-02, 2.298e-01, 5.915e-02, -1.261e-01, 5.676e-02, -5.795e-02, -9.618e-03, 3.732e-02, -7.761e-03, 4.008e-02, -1.175e-02, 2.934e-02, 4.812e-03)); + r += mul(s6_7, M4(-3.987e-03, 9.212e-03, 3.804e-02, -8.632e-02, 2.043e-02, 4.381e-02, -5.177e-02, 1.427e-01, 1.331e-02, 3.319e-02, 6.874e-02, -1.323e-01, -1.051e-01, -7.225e-02, 8.682e-02, -7.441e-02)); + r += mul(s6_8, M4(2.258e-02, 6.892e-03, 9.611e-02, -7.609e-02, 1.090e-01, -4.216e-03, -5.880e-02, -4.078e-02, -9.083e-02, 2.742e-02, 6.515e-02, 1.319e-02, 6.738e-02, 3.922e-02, 9.416e-03, -4.067e-02)); + r += mul(s7_0, M4(1.031e-01, 1.012e-01, -4.783e-03, 4.571e-02, -5.356e-02, -2.030e-02, 5.415e-02, 4.546e-02, -2.107e-02, -5.140e-02, 2.113e-02, 5.384e-02, 5.068e-02, 3.218e-04, -1.839e-02, 7.545e-02)); + r += mul(s7_1, M4(-4.294e-02, 7.765e-02, 3.601e-02, -3.077e-02, 6.524e-02, -1.347e-02, -5.919e-02, 1.791e-02, 2.274e-01, 6.908e-02, -7.778e-02, 1.627e-01, 6.772e-02, 1.251e-01, -6.367e-02, 6.658e-02)); + r += mul(s7_2, M4(5.673e-02, -1.761e-02, -3.663e-03, 1.791e-02, -2.510e-02, 2.097e-02, -2.502e-02, -7.294e-04, 4.252e-03, 7.918e-02, 4.567e-02, 1.122e-01, -6.216e-02, -3.072e-03, 7.834e-03, 2.619e-02)); + r += mul(s7_3, M4(1.263e-01, 4.895e-02, -4.581e-02, -1.277e-01, -1.994e-01, 2.217e-01, 5.047e-02, 5.175e-02, -3.767e-02, -2.373e-02, -3.259e-02, -1.706e-01, 1.840e-01, -1.054e-01, -3.272e-02, 4.739e-02)); + r += mul(s7_4, M4(-1.134e-02, -7.667e-03, 2.331e-01, -3.020e-01, 1.627e-01, -3.228e-01, 5.315e-02, -6.137e-02, 5.719e-02, -2.665e-02, 1.806e-01, -3.680e-01, 1.204e-01, -4.809e-02, -3.139e-01, 3.382e-01)); + r += mul(s7_5, M4(1.173e-01, -3.797e-02, -7.569e-02, -9.224e-02, 1.795e-01, -2.326e-02, -1.464e-02, 1.275e-01, 1.945e-02, -1.106e-01, 1.670e-01, -1.490e-01, 9.719e-02, 1.096e-01, -6.054e-02, 1.833e-01)); + r += mul(s7_6, M4(1.252e-01, -5.389e-03, 1.982e-02, -7.582e-02, 4.581e-02, 3.180e-02, -5.152e-02, 3.405e-02, -7.310e-03, -3.880e-02, -2.935e-02, -2.388e-02, -1.040e-01, 1.890e-02, 1.067e-01, -4.400e-02)); + r += mul(s7_7, M4(6.951e-02, 2.690e-02, -2.907e-02, 4.672e-03, 6.524e-02, 6.165e-02, 1.446e-02, 1.205e-01, 1.406e-01, 7.088e-02, 1.196e-03, 7.178e-02, -1.725e-01, -1.580e-01, 1.284e-01, -1.150e-01)); + r += mul(s7_8, M4(6.039e-02, 1.726e-03, 2.689e-02, 6.749e-02, 5.954e-03, -5.211e-02, 1.374e-03, 1.189e-01, -1.196e-02, 1.119e-02, 4.533e-03, 1.074e-01, -7.028e-02, -2.072e-02, -1.303e-01, -1.357e-01)); + r += V4(-1.936e-02, -1.244e-02, 5.264e-03, 1.250e-03); + return r; +} + +V4 f1(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-1.215e-02, -4.540e-02, -6.182e-02, 9.210e-02, -1.343e-01, -6.008e-02, 1.022e-02, 6.817e-03, 6.076e-02, -3.628e-02, 9.117e-02, -3.748e-02, 4.280e-02, 2.804e-02, 7.215e-02, -4.456e-02)); + r += mul(s0_1, M4(1.086e-01, -7.696e-02, 1.310e-01, 4.790e-02, -1.208e-02, 3.135e-02, -8.876e-04, 8.954e-02, -4.514e-02, -4.020e-02, -4.946e-02, 9.281e-03, -5.115e-02, -3.673e-02, -2.748e-02, 2.463e-03)); + r += mul(s0_2, M4(1.640e-02, 9.478e-02, 6.299e-02, -9.613e-03, -6.623e-02, -2.458e-02, -6.038e-03, -6.066e-02, 5.517e-02, -9.301e-02, -2.742e-02, -1.356e-02, 1.062e-02, -5.368e-02, -4.682e-02, 1.174e-02)); + r += mul(s0_3, M4(-1.294e-01, 6.481e-02, 6.688e-02, 4.674e-02, -2.854e-02, 2.854e-02, 1.117e-01, -6.279e-02, -2.460e-02, -6.481e-02, 3.189e-02, 1.215e-02, 2.836e-02, 3.841e-02, -3.548e-01, 1.343e-01)); + r += mul(s0_4, M4(1.699e-01, 3.216e-02, -2.921e-01, -1.732e-02, 2.208e-02, 1.366e-02, 5.443e-02, 4.008e-02, -1.648e-01, 2.962e-01, 1.915e-01, -1.546e-01, 5.420e-02, -1.610e-01, 1.169e-01, 2.131e-01)); + r += mul(s0_5, M4(-6.936e-02, 1.159e-01, 7.268e-02, -5.801e-02, 1.414e-02, 2.981e-02, 1.797e-01, 4.795e-02, 9.202e-02, -1.694e-01, -4.349e-02, -1.511e-02, 1.350e-02, -1.415e-02, -8.296e-02, 7.228e-02)); + r += mul(s0_6, M4(-3.815e-02, 5.744e-02, -6.128e-02, 7.184e-03, -2.640e-03, 2.213e-02, -9.551e-02, -2.212e-02, -2.726e-02, -1.189e-02, 2.630e-02, 6.464e-02, 1.301e-02, 3.157e-03, 6.255e-02, -7.935e-02)); + r += mul(s0_7, M4(-1.957e-01, -2.873e-02, 1.256e-01, -3.955e-03, -3.953e-02, 7.481e-02, 1.962e-01, -1.755e-01, 3.431e-01, 1.885e-02, -8.772e-02, 3.388e-02, -3.657e-01, 1.158e-01, 2.079e-01, -1.171e-01)); + r += mul(s0_8, M4(-2.954e-02, 7.288e-02, -2.538e-02, 4.632e-03, 5.899e-02, -4.524e-02, -7.829e-02, 1.084e-01, 4.310e-02, 3.622e-02, -4.349e-03, 5.737e-03, -2.865e-02, -5.213e-02, -5.996e-02, 1.157e-01)); + r += mul(s1_0, M4(-2.228e-02, 6.939e-03, -7.273e-02, -2.658e-02, -8.725e-02, -9.682e-02, -1.142e-02, 1.096e-02, -3.200e-03, 3.983e-02, 6.569e-02, -3.135e-02, 2.560e-02, -8.801e-04, 1.067e-01, -4.188e-02)); + r += mul(s1_1, M4(-1.916e-02, -5.042e-02, 5.203e-02, 1.398e-01, -5.274e-02, -1.499e-01, 4.090e-02, -1.336e-01, -1.097e-01, -2.390e-02, -5.167e-03, 3.541e-02, -1.152e-01, 1.872e-02, -6.303e-02, 4.480e-02)); + r += mul(s1_2, M4(-3.511e-02, 6.722e-02, -1.625e-02, -1.987e-01, -8.731e-03, 5.991e-02, -3.776e-03, -4.745e-02, 9.009e-02, -3.480e-02, -7.581e-02, 1.785e-02, -3.545e-02, -3.787e-02, 3.436e-02, -4.523e-02)); + r += mul(s1_3, M4(-7.645e-02, 5.618e-03, -6.662e-03, -5.060e-04, -1.354e-01, 2.537e-02, 1.650e-01, -9.984e-02, -1.982e-02, 2.930e-02, 1.762e-02, 1.023e-01, 4.403e-02, -4.789e-03, -2.220e-01, 2.075e-01)); + r += mul(s1_4, M4(1.497e-01, -5.995e-02, 4.478e-02, 1.940e-01, -1.135e-01, -3.094e-01, 1.325e-02, 3.125e-01, -1.059e-01, 1.516e-01, -2.374e-02, 1.221e-01, 1.473e-01, -3.604e-01, -2.142e-01, 2.015e-01)); + r += mul(s1_5, M4(-8.634e-02, -3.871e-03, 1.723e-02, 9.041e-02, 7.761e-03, 4.224e-02, 5.476e-03, 6.053e-02, 2.046e-03, -1.409e-01, -6.809e-02, 9.993e-02, -2.364e-02, 1.081e-01, 2.678e-02, -1.273e-02)); + r += mul(s1_6, M4(1.241e-02, 3.972e-02, -1.697e-02, -7.475e-03, 2.857e-02, 9.824e-03, -6.627e-02, -2.487e-02, 2.585e-02, -1.836e-02, -1.115e-01, -3.251e-02, -2.263e-02, 2.889e-02, 7.380e-02, -1.795e-02)); + r += mul(s1_7, M4(-6.224e-02, 9.404e-02, 1.472e-01, -9.855e-02, -2.213e-02, 7.542e-02, 1.146e-01, -1.254e-01, -2.543e-02, -7.808e-02, 1.043e-01, -1.256e-01, -1.819e-01, 8.211e-02, 1.043e-01, -3.737e-02)); + r += mul(s1_8, M4(-2.377e-03, -5.938e-03, -7.043e-02, 2.431e-02, 6.489e-02, -4.866e-02, -3.791e-02, 7.250e-02, 4.674e-02, 4.103e-02, -6.961e-03, 6.558e-02, -7.019e-02, 2.432e-02, -2.384e-02, 4.730e-02)); + r += mul(s2_0, M4(-1.052e-01, 1.714e-01, 1.920e-01, 8.695e-03, 1.192e-01, 2.749e-02, 6.753e-03, -7.678e-02, 5.081e-03, 1.391e-02, 5.604e-02, -1.924e-02, -1.572e-02, -2.414e-02, -5.768e-02, -1.455e-02)); + r += mul(s2_1, M4(-1.224e-01, -9.588e-02, -9.905e-02, 7.559e-03, -9.213e-02, 2.499e-01, 1.938e-01, 9.930e-02, -1.303e-02, -3.614e-02, -5.201e-02, -5.518e-02, 1.356e-02, -1.071e-01, 1.854e-01, -4.967e-02)); + r += mul(s2_2, M4(3.354e-02, -5.809e-03, -3.624e-02, 4.022e-02, -1.559e-01, -3.162e-02, -1.018e-01, -8.528e-02, 3.540e-02, -1.690e-02, 2.697e-03, 3.760e-02, 8.552e-02, 1.354e-03, 3.932e-02, 2.864e-02)); + r += mul(s2_3, M4(1.616e-02, 1.046e-01, 1.022e-02, -1.411e-01, -1.700e-02, 2.493e-01, 1.387e-01, -1.636e-02, 3.542e-02, -5.554e-02, -5.075e-02, -3.120e-02, -3.111e-02, 1.070e-01, 4.874e-02, -1.538e-02)); + r += mul(s2_4, M4(7.770e-02, 3.983e-02, 1.571e-01, -2.401e-02, -9.394e-03, 1.850e-01, 4.855e-01, -3.089e-01, -9.375e-03, 1.036e-02, 7.071e-02, -6.796e-02, 1.023e-01, 1.237e-03, 4.321e-01, -2.218e-01)); + r += mul(s2_5, M4(-8.584e-02, 4.444e-02, -1.155e-02, 4.413e-02, 2.076e-02, -1.746e-01, -2.055e-01, 1.220e-01, 3.257e-03, 9.627e-03, 1.818e-02, 1.360e-02, 7.268e-02, -2.056e-01, -2.268e-01, 1.396e-01)); + r += mul(s2_6, M4(1.675e-01, -1.478e-02, 4.312e-02, 8.251e-02, -8.362e-03, 2.056e-02, -5.405e-02, 1.599e-01, -3.400e-02, 1.371e-02, 3.787e-02, 1.585e-02, 8.075e-02, -9.411e-02, 1.153e-01, 9.444e-02)); + r += mul(s2_7, M4(-6.376e-02, -8.809e-02, 7.907e-03, 1.811e-02, 1.512e-02, 7.979e-02, -1.030e-01, 6.388e-02, -4.510e-02, 3.419e-02, 5.330e-03, 5.456e-02, -1.586e-01, -7.157e-02, 8.941e-02, 1.130e-01)); + r += mul(s2_8, M4(-2.671e-02, 3.746e-02, -7.254e-02, -2.724e-02, -1.712e-01, -3.450e-02, 2.189e-03, 1.064e-02, 5.478e-02, 6.619e-03, 2.169e-02, 1.149e-03, -1.430e-01, -6.315e-02, 1.675e-01, -8.328e-02)); + r += mul(s3_0, M4(-2.198e-02, 6.295e-02, -2.934e-02, -1.750e-02, -7.554e-03, 9.127e-03, -2.459e-02, -8.642e-02, -5.513e-02, 1.146e-01, -1.102e-01, 5.863e-02, 5.379e-02, 1.021e-02, 3.317e-02, -5.760e-02)); + r += mul(s3_1, M4(-1.049e-01, -8.519e-02, 7.863e-02, 1.037e-01, 4.839e-02, 4.829e-02, 6.753e-02, 1.505e-01, -2.484e-01, 2.085e-01, 4.480e-02, -2.862e-02, 4.703e-03, 1.778e-02, -2.094e-02, 1.421e-01)); + r += mul(s3_2, M4(-8.694e-03, -4.337e-02, 1.965e-03, 1.981e-03, -4.066e-02, -4.434e-02, 3.244e-02, 2.163e-02, -1.357e-01, -1.646e-01, -1.628e-01, 7.207e-02, 8.472e-03, -2.433e-02, 2.950e-02, 8.439e-02)); + r += mul(s3_3, M4(-5.182e-02, 4.552e-02, -8.238e-02, 1.243e-01, -3.660e-02, 5.286e-02, -4.190e-02, 7.928e-02, 7.770e-02, -8.976e-02, -3.774e-02, -2.373e-01, 3.765e-02, 5.051e-02, -2.150e-02, 1.144e-01)); + r += mul(s3_4, M4(-9.187e-02, 1.787e-01, 2.883e-01, -2.009e-01, -1.131e-01, 2.180e-01, 1.205e-01, -3.869e-02, -1.832e-01, 2.039e-01, 2.666e-01, -2.910e-01, 1.322e-01, 4.483e-02, 4.458e-02, -1.985e-01)); + r += mul(s3_5, M4(-3.202e-02, -2.526e-02, -1.951e-02, -1.423e-01, 5.709e-02, -4.307e-02, -4.011e-02, 2.025e-02, -5.903e-02, -7.382e-02, -2.092e-02, -2.200e-01, 8.407e-03, -1.098e-01, 4.387e-02, -9.421e-02)); + r += mul(s3_6, M4(-5.411e-02, 1.843e-03, 7.369e-02, -1.694e-01, -5.671e-02, -2.274e-02, -1.143e-02, -3.773e-02, 2.281e-01, 2.538e-01, -8.968e-02, 2.383e-01, -4.948e-02, -1.031e-02, -5.387e-03, 6.528e-02)); + r += mul(s3_7, M4(-1.095e-01, -7.263e-03, -1.382e-01, 1.252e-01, -5.913e-03, 4.645e-02, 5.962e-03, -7.470e-02, 1.801e-01, 2.301e-01, 1.172e-01, 2.978e-02, 3.583e-02, 1.851e-03, 7.472e-02, 7.639e-02)); + r += mul(s3_8, M4(-4.003e-02, 2.485e-02, -1.482e-02, 3.177e-02, -7.820e-02, 1.081e-02, 2.634e-03, 3.374e-02, 2.240e-01, 5.150e-02, -1.188e-01, 7.844e-02, 1.009e-01, 3.870e-02, 7.445e-02, 4.500e-02)); + r += mul(s4_0, M4(2.603e-02, 2.744e-02, 1.406e-01, -7.488e-02, 5.131e-02, 9.312e-03, 6.753e-02, -3.920e-02, 2.157e-02, -2.596e-02, -1.122e-01, -3.905e-02, -4.067e-03, -4.047e-02, 8.484e-02, -3.328e-03)); + r += mul(s4_1, M4(-5.090e-02, -7.445e-03, 1.373e-01, 4.901e-02, 6.356e-02, 5.066e-02, 4.342e-02, -3.282e-02, 6.329e-02, 7.936e-02, -2.880e-03, -7.725e-02, 5.561e-02, -1.732e-01, 3.595e-02, -9.497e-02)); + r += mul(s4_2, M4(-1.719e-01, 8.029e-02, 8.783e-02, 1.613e-02, 9.234e-02, 1.685e-02, -2.163e-03, 5.326e-03, 1.671e-02, -2.033e-02, 2.985e-02, -6.389e-02, 1.169e-01, -7.354e-02, -1.723e-01, -1.210e-01)); + r += mul(s4_3, M4(-3.432e-02, -1.843e-02, -9.934e-02, 1.439e-01, 5.726e-02, -4.894e-02, 1.138e-01, 1.118e-03, 1.394e-02, -2.013e-03, -8.812e-02, -1.739e-02, -6.373e-02, -8.443e-02, -1.352e-01, -2.226e-02)); + r += mul(s4_4, M4(1.253e-02, 7.655e-02, -4.875e-03, 1.001e-01, -9.879e-02, -1.880e-01, -1.733e-01, 2.513e-01, 8.727e-02, -7.056e-02, 7.586e-02, 2.894e-02, 7.644e-02, -2.775e-01, -2.627e-01, 3.969e-01)); + r += mul(s4_5, M4(2.915e-02, 6.822e-02, 6.869e-02, -3.122e-02, -8.106e-03, 4.366e-02, 4.509e-02, 5.110e-02, -9.694e-02, 2.586e-02, -5.651e-02, 2.758e-02, -4.959e-02, 6.587e-02, 2.136e-01, 8.082e-04)); + r += mul(s4_6, M4(1.144e-02, -4.841e-02, 4.750e-02, -2.561e-02, -9.700e-02, -4.014e-02, 7.104e-02, -7.030e-02, 4.325e-02, 6.899e-03, -7.420e-02, 1.027e-01, -3.142e-02, 7.203e-02, -2.908e-02, -6.599e-03)); + r += mul(s4_7, M4(-5.599e-02, -4.933e-02, 1.603e-01, -1.476e-01, 3.497e-02, 4.775e-02, -1.490e-03, 2.038e-02, -6.058e-02, -6.507e-02, -5.224e-02, -8.929e-02, -1.684e-01, -2.646e-02, 9.190e-02, -4.504e-02)); + r += mul(s4_8, M4(-1.992e-02, 3.383e-02, -5.947e-02, -2.892e-02, 8.796e-02, 3.969e-03, -2.367e-02, 2.041e-02, 7.427e-03, 3.707e-02, -5.194e-02, -5.459e-02, 1.220e-02, 8.075e-03, -1.319e-02, 9.306e-02)); + r += mul(s5_0, M4(-2.438e-02, 1.312e-02, -4.178e-03, 1.038e-01, -1.106e-02, 6.018e-02, 7.408e-02, -5.235e-02, 1.112e-02, -1.607e-02, -9.098e-02, -8.538e-02, -1.336e-01, 3.770e-02, -7.036e-02, 1.547e-01)); + r += mul(s5_1, M4(-2.156e-01, 1.579e-02, -1.175e-01, 3.351e-01, 9.171e-02, 5.327e-02, 1.050e-01, -1.305e-02, -6.839e-02, 1.260e-01, 5.867e-02, 5.210e-02, 1.380e-02, -6.424e-02, 1.335e-01, -1.469e-01)); + r += mul(s5_2, M4(-1.872e-02, -2.200e-02, -7.178e-02, 1.159e-01, 8.871e-03, 1.458e-02, -7.591e-02, 4.722e-02, -1.248e-02, -4.026e-02, -6.267e-02, 1.666e-02, -4.916e-02, -4.396e-03, -2.585e-02, -8.002e-02)); + r += mul(s5_3, M4(-5.758e-03, 2.092e-04, 6.852e-02, 4.371e-02, -1.390e-04, 2.203e-02, -8.133e-02, 5.463e-02, 8.813e-03, 2.453e-02, 4.666e-02, -1.089e-01, -1.602e-02, 3.621e-03, -6.850e-02, -1.048e-02)); + r += mul(s5_4, M4(-1.057e-01, -1.195e-01, 1.295e-03, -1.879e-01, 4.307e-02, -3.808e-02, 2.598e-01, 6.048e-02, -7.240e-02, 1.263e-01, 6.689e-02, -6.630e-02, -8.146e-02, -1.077e-01, 1.230e-02, 3.512e-02)); + r += mul(s5_5, M4(-2.763e-02, 1.045e-01, 9.368e-02, -2.891e-02, -1.262e-01, -2.279e-02, -9.170e-02, -5.480e-03, -6.894e-02, 2.340e-01, 1.316e-01, 9.275e-02, 7.497e-03, 8.773e-02, 1.450e-01, -4.171e-02)); + r += mul(s5_6, M4(2.338e-02, 2.649e-03, 1.191e-02, 1.114e-01, 8.369e-03, 2.264e-02, 5.923e-02, -8.366e-02, 2.113e-02, -1.026e-01, 4.153e-03, 1.457e-02, 8.502e-03, 8.433e-02, 1.364e-02, 9.216e-02)); + r += mul(s5_7, M4(2.501e-01, 4.072e-02, 4.366e-02, 1.529e-01, 7.336e-03, -1.041e-03, 6.438e-02, 4.095e-02, 1.695e-01, 4.772e-02, 3.436e-03, -7.710e-02, -1.302e-03, 6.680e-02, 1.340e-02, 7.820e-02)); + r += mul(s5_8, M4(1.079e-01, -2.753e-02, -8.011e-02, 5.671e-02, 2.691e-02, 1.961e-02, -5.833e-02, 7.675e-02, 4.570e-02, 1.346e-02, -1.609e-02, -1.391e-01, 1.159e-01, -2.085e-03, -4.314e-02, 1.949e-01)); + r += mul(s6_0, M4(1.760e-02, -5.478e-02, -1.305e-02, -2.815e-02, -5.564e-02, -2.450e-03, -3.298e-02, 1.908e-02, 1.709e-02, -5.423e-02, -7.570e-03, -9.201e-02, -2.826e-02, 6.207e-02, 1.535e-01, -7.470e-03)); + r += mul(s6_1, M4(-1.485e-02, 1.209e-01, 1.303e-01, -1.392e-01, 4.982e-02, -1.113e-01, -5.884e-02, 1.599e-02, 1.865e-01, 1.140e-01, 3.929e-02, 4.492e-02, -1.871e-01, -5.820e-02, -4.093e-03, -1.097e-01)); + r += mul(s6_2, M4(-6.840e-02, 6.539e-03, 7.601e-02, 1.108e-01, 6.659e-02, 1.486e-02, -7.902e-02, 3.357e-02, 2.116e-01, 2.026e-02, -7.777e-02, 1.355e-01, -9.171e-02, 1.374e-02, 4.920e-02, 3.573e-02)); + r += mul(s6_3, M4(-1.232e-02, -4.098e-02, 8.025e-02, -2.882e-02, 4.008e-03, 6.138e-02, -2.122e-01, 1.824e-01, 3.671e-02, -9.563e-02, 9.838e-02, -1.417e-02, 4.926e-02, -1.583e-02, -9.245e-02, 8.478e-02)); + r += mul(s6_4, M4(-4.521e-02, -2.417e-02, 3.265e-02, -2.099e-03, 6.462e-02, 9.975e-02, 1.865e-02, -3.928e-02, -2.705e-02, -2.945e-01, 1.402e-02, 2.707e-01, 2.218e-01, -1.392e-01, -4.710e-02, 3.750e-02)); + r += mul(s6_5, M4(8.548e-02, -3.462e-03, -4.457e-02, -8.958e-02, 6.745e-02, 3.801e-02, 3.625e-02, 2.756e-03, 3.118e-02, -7.609e-02, 1.555e-01, 7.602e-02, 1.309e-01, 1.372e-01, -4.452e-02, -1.374e-01)); + r += mul(s6_6, M4(-8.046e-02, 2.717e-02, -1.334e-01, 3.780e-03, -2.606e-02, -8.003e-02, 1.969e-02, -1.529e-01, -2.649e-02, 7.647e-02, -3.141e-03, 6.980e-02, 2.159e-02, -1.673e-02, -1.130e-01, -1.533e-02)); + r += mul(s6_7, M4(8.020e-02, -2.917e-02, -1.353e-01, -1.353e-02, -8.177e-02, -5.781e-02, -5.298e-02, 3.476e-02, -2.233e-02, 9.911e-02, -2.051e-02, -4.530e-02, -7.769e-02, 5.231e-02, -1.739e-02, 1.335e-02)); + r += mul(s6_8, M4(1.209e-01, 2.396e-02, -2.819e-02, 5.762e-02, 1.112e-01, 2.399e-02, 7.932e-02, 1.191e-01, 1.207e-01, 1.213e-02, -4.203e-02, 3.251e-02, -9.532e-02, -1.213e-02, 5.176e-02, 7.673e-03)); + r += mul(s7_0, M4(-9.347e-02, -2.286e-02, -8.569e-02, 5.922e-02, -1.050e-02, 1.615e-02, -6.755e-02, 8.917e-02, 5.177e-02, -8.341e-02, 8.778e-02, -1.525e-01, -8.610e-02, 8.524e-03, 3.540e-02, 2.440e-01)); + r += mul(s7_1, M4(-4.814e-02, 3.439e-02, 2.050e-01, -7.712e-02, -5.364e-02, -8.788e-02, -1.331e-01, 1.023e-01, -1.185e-01, -1.326e-01, -3.383e-01, 6.328e-02, -1.424e-01, -1.064e-01, -2.044e-01, -2.384e-02)); + r += mul(s7_2, M4(-7.306e-02, -9.739e-02, -7.158e-02, -6.684e-02, 1.426e-02, 1.303e-03, 1.836e-02, 4.949e-03, 9.151e-02, 7.248e-02, 7.497e-03, 2.724e-01, -6.642e-03, 6.167e-03, 3.202e-04, -1.025e-03)); + r += mul(s7_3, M4(-1.537e-02, -9.354e-02, 4.753e-02, 2.086e-02, 2.520e-02, 2.105e-03, -4.706e-02, -4.345e-02, -4.939e-02, 2.905e-02, 9.454e-02, 1.517e-02, 1.502e-02, 4.808e-02, -1.780e-01, 2.719e-01)); + r += mul(s7_4, M4(-9.833e-02, 3.796e-02, 2.619e-04, 8.518e-02, -8.701e-03, 9.340e-02, 4.374e-02, -1.319e-02, 1.728e-01, 8.227e-02, -1.186e-01, 4.184e-01, 2.972e-01, -3.795e-01, -4.548e-01, 7.204e-02)); + r += mul(s7_5, M4(-8.860e-02, -2.519e-02, -6.967e-02, -2.032e-02, 6.664e-03, 6.918e-02, 1.030e-01, 1.352e-01, 6.802e-02, -6.259e-04, 3.941e-02, -8.391e-02, 1.389e-01, 1.509e-01, -1.392e-01, 2.699e-01)); + r += mul(s7_6, M4(3.628e-02, -4.122e-02, -1.470e-01, 2.078e-02, -3.632e-02, -6.245e-02, -5.451e-02, 2.176e-01, 1.773e-03, 3.551e-03, -8.369e-02, -1.283e-03, 7.591e-02, 6.184e-02, 3.148e-02, 4.768e-02)); + r += mul(s7_7, M4(-1.721e-03, -8.997e-02, -1.011e-01, -2.121e-03, 1.935e-01, 2.244e-02, 3.641e-03, 2.111e-02, -2.126e-01, -1.150e-01, 2.173e-02, -2.666e-01, -2.086e-01, 6.622e-02, 6.155e-03, 1.749e-01)); + r += mul(s7_8, M4(6.197e-02, -3.724e-02, 5.872e-02, 3.360e-02, 7.349e-02, -1.592e-02, 5.272e-03, -2.045e-02, 9.958e-02, 1.306e-02, -4.321e-02, -2.412e-02, -1.620e-01, -1.109e-01, 2.305e-02, -9.959e-02)); + r += V4(1.116e-03, 1.909e-02, 1.793e-02, -7.700e-03); + return r; +} + +V4 f2(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(1.919e-02, -7.925e-02, 1.392e-03, 7.669e-02, 4.054e-02, -6.717e-02, -2.192e-02, 4.973e-02, -2.415e-02, 3.759e-02, -2.293e-03, 2.573e-02, -5.178e-02, -4.537e-02, -3.029e-03, 8.999e-02)); + r += mul(s0_1, M4(2.788e-02, 1.615e-01, -9.678e-02, 5.520e-02, 9.562e-02, -3.281e-02, 2.804e-02, -1.793e-03, -4.934e-02, -7.966e-02, 3.871e-02, 1.981e-02, 4.654e-03, -5.576e-02, -1.091e-01, 6.611e-02)); + r += mul(s0_2, M4(3.869e-02, 7.204e-02, -1.226e-02, 4.877e-02, -8.615e-02, -1.289e-02, -7.947e-03, 9.051e-02, -3.714e-02, 1.279e-02, 6.112e-02, -6.459e-02, -9.514e-03, 1.510e-02, 4.982e-02, -2.587e-02)); + r += mul(s0_3, M4(-2.231e-03, 2.710e-02, -4.442e-03, 3.404e-02, 1.433e-02, -3.752e-02, -4.109e-02, 1.475e-01, 6.381e-02, 2.638e-02, -1.825e-02, 6.887e-03, -8.052e-02, -2.248e-01, 7.873e-02, -7.883e-03)); + r += mul(s0_4, M4(3.477e-02, 1.055e-01, 4.676e-02, 4.323e-02, -1.675e-01, 3.107e-01, 1.456e-01, 9.397e-03, -2.638e-01, 2.122e-02, 1.550e-01, -1.148e-01, 1.629e-01, 2.266e-01, 4.130e-03, 1.362e-01)); + r += mul(s0_5, M4(5.124e-02, -7.977e-03, 2.135e-02, 4.652e-02, 1.013e-01, -4.334e-03, -4.985e-02, 2.150e-02, 1.560e-02, 1.660e-05, 6.906e-02, 8.347e-03, -4.262e-02, 8.572e-02, 8.665e-03, 1.076e-01)); + r += mul(s0_6, M4(-1.136e-02, 1.071e-02, 6.784e-02, 6.999e-02, -2.730e-02, -4.259e-02, 6.931e-03, 9.898e-02, -5.586e-02, -3.762e-02, -1.208e-01, -6.106e-02, -3.304e-02, -1.983e-02, 1.497e-01, -6.972e-02)); + r += mul(s0_7, M4(-4.612e-02, 1.210e-01, -1.136e-01, -1.952e-01, -1.998e-02, 1.264e-01, -1.409e-01, 1.728e-02, 9.948e-02, -2.794e-02, 2.301e-01, 6.005e-02, -9.681e-02, 2.339e-01, -1.852e-01, -3.059e-01)); + r += mul(s0_8, M4(-7.229e-03, 1.016e-02, 5.459e-02, 9.762e-02, -4.530e-02, 9.182e-02, 6.607e-02, 1.315e-01, 2.363e-02, -1.151e-02, 7.571e-03, -1.558e-01, -2.558e-02, -2.231e-02, 1.212e-01, 4.068e-03)); + r += mul(s1_0, M4(1.568e-03, -6.265e-02, -3.742e-02, 3.680e-02, 4.999e-02, 6.828e-02, 8.172e-03, 6.230e-02, -3.445e-02, 1.025e-02, 6.826e-04, 1.275e-01, -1.594e-02, 8.525e-03, -6.673e-02, 1.133e-01)); + r += mul(s1_1, M4(7.044e-02, 1.775e-01, 1.069e-01, 1.081e-01, 3.330e-02, -1.107e-01, -4.276e-02, -1.295e-01, 4.836e-02, -5.847e-02, 3.050e-02, 1.332e-01, -7.048e-02, -5.868e-02, 6.968e-02, 1.823e-02)); + r += mul(s1_2, M4(1.368e-02, 4.063e-02, 1.168e-01, 3.856e-02, 1.630e-03, 1.284e-02, 1.284e-02, 1.563e-03, -5.222e-02, 4.899e-02, -1.622e-02, -1.790e-03, -1.195e-02, 3.564e-02, 4.695e-04, 1.405e-02)); + r += mul(s1_3, M4(1.593e-03, -3.215e-02, 7.395e-02, -7.133e-02, 7.484e-03, 1.356e-01, -9.938e-02, 3.818e-02, -1.549e-02, 2.184e-02, -1.766e-01, 6.092e-02, -6.955e-02, -6.860e-02, 1.052e-02, 9.732e-02)); + r += mul(s1_4, M4(1.515e-01, 1.307e-01, -2.911e-01, 3.438e-02, -3.025e-02, -4.919e-02, 1.980e-01, -1.327e-01, -6.091e-02, -1.083e-01, -2.129e-01, -1.964e-01, 1.909e-01, 1.199e-01, 1.115e-01, 1.683e-01)); + r += mul(s1_5, M4(4.515e-02, 2.601e-02, -1.402e-02, 4.323e-03, 6.401e-02, -4.858e-02, 1.265e-01, -3.195e-03, 1.839e-03, -7.002e-02, -3.491e-02, 2.607e-01, -4.128e-02, -1.300e-02, -1.078e-01, 1.049e-01)); + r += mul(s1_6, M4(4.349e-03, 2.439e-02, 1.118e-01, -6.831e-02, 1.013e-01, -6.029e-02, -2.105e-02, 3.956e-02, -4.134e-02, -3.690e-02, 1.320e-02, 3.823e-02, -7.655e-02, 4.842e-02, 1.105e-01, 4.895e-02)); + r += mul(s1_7, M4(-8.619e-02, 1.346e-01, -1.204e-01, -2.886e-02, 8.199e-02, 1.387e-01, 1.203e-01, 2.969e-02, -6.761e-02, -5.815e-02, -8.640e-02, 8.694e-03, -2.326e-02, 1.259e-01, -1.610e-01, -5.322e-02)); + r += mul(s1_8, M4(-2.302e-02, -1.948e-02, 5.414e-02, 1.489e-01, -3.227e-03, 4.110e-02, 1.508e-01, -7.698e-02, -3.182e-02, 9.852e-02, 1.671e-03, -9.501e-03, -2.827e-02, -5.427e-02, 4.112e-02, 1.148e-01)); + r += mul(s2_0, M4(-2.653e-02, 1.115e-01, 8.772e-02, -7.303e-02, 7.044e-02, 1.019e-01, -1.103e-02, 4.589e-02, -9.427e-04, 5.866e-02, -1.047e-02, 3.651e-02, 8.821e-02, 3.674e-02, 1.745e-01, -2.124e-01)); + r += mul(s2_1, M4(-8.092e-03, -1.616e-01, -2.955e-02, -5.523e-02, 2.648e-02, 2.296e-01, 1.767e-01, -1.016e-01, -1.790e-02, -2.629e-02, 6.654e-03, 3.217e-03, -6.323e-02, -8.076e-02, 1.921e-02, -1.112e-01)); + r += mul(s2_2, M4(-1.211e-02, -2.244e-02, 3.096e-02, 1.203e-01, -2.039e-02, -1.193e-01, 2.880e-02, -3.508e-02, -2.365e-02, -1.497e-02, -4.153e-02, -4.644e-02, 8.814e-02, -7.433e-03, 9.270e-02, -9.398e-02)); + r += mul(s2_3, M4(-1.593e-01, -1.226e-01, 1.925e-01, -5.361e-02, -8.462e-02, 2.094e-01, 5.406e-02, -1.166e-01, -5.615e-03, 6.467e-02, -9.683e-02, 2.345e-02, -9.391e-02, -1.485e-01, 1.865e-01, -2.633e-02)); + r += mul(s2_4, M4(-1.018e-01, 1.159e-01, 1.366e-01, 1.475e-01, -1.902e-01, 5.375e-01, -1.445e-01, 1.699e-01, 5.062e-02, 3.539e-02, 5.849e-02, 2.295e-02, 4.430e-02, 5.493e-02, -2.390e-01, 3.035e-01)); + r += mul(s2_5, M4(2.495e-02, 2.272e-03, 3.160e-02, 3.626e-02, -1.549e-01, -3.333e-02, 2.068e-01, -7.810e-02, 3.562e-02, 2.132e-02, -5.171e-02, -2.567e-02, 3.387e-02, 6.526e-02, 3.167e-01, -5.440e-02)); + r += mul(s2_6, M4(1.138e-01, -5.602e-02, 1.855e-02, -3.468e-02, -3.070e-02, 6.960e-02, -5.956e-02, -7.770e-02, -4.455e-03, 2.730e-02, -1.527e-02, -3.028e-03, 6.344e-02, 4.287e-02, -1.154e-02, -9.056e-02)); + r += mul(s2_7, M4(2.557e-02, -7.715e-02, 1.273e-01, 2.954e-02, 8.715e-02, -7.615e-02, -6.236e-02, 1.199e-01, -5.666e-04, 3.760e-02, -1.870e-02, -5.789e-02, -4.855e-02, 1.091e-01, 8.060e-02, -2.648e-01)); + r += mul(s2_8, M4(-1.947e-02, 1.035e-02, -1.053e-01, -4.396e-02, 1.595e-02, 2.110e-03, 2.073e-02, -2.046e-01, -5.264e-04, -1.792e-03, 3.973e-02, 3.448e-02, 1.158e-01, -9.957e-02, 2.655e-01, -2.842e-01)); + r += mul(s3_0, M4(-2.472e-02, 1.291e-02, 7.998e-02, 1.255e-01, 1.699e-02, 7.149e-02, -4.039e-02, 8.269e-02, 2.302e-01, 2.576e-01, 7.557e-02, -1.364e-01, -2.455e-02, -2.370e-02, 5.928e-02, 1.647e-02)); + r += mul(s3_1, M4(9.621e-02, -7.109e-02, -2.288e-03, -9.891e-04, 4.067e-02, 1.103e-02, -7.506e-03, 2.783e-03, 1.373e-01, 1.752e-01, -7.984e-02, 1.528e-01, -4.504e-02, 4.944e-02, 9.320e-02, -2.287e-02)); + r += mul(s3_2, M4(3.217e-03, -6.484e-03, 7.505e-02, 6.081e-02, -9.189e-03, -1.712e-02, -3.935e-02, 1.990e-02, 4.870e-03, -2.051e-02, 5.300e-02, -8.601e-02, -2.530e-02, 1.760e-02, 3.964e-03, 4.869e-02)); + r += mul(s3_3, M4(1.133e-01, -4.615e-02, -6.186e-02, -1.925e-01, 5.439e-02, 4.079e-02, -4.954e-03, 7.498e-02, -1.841e-01, 1.061e-01, 1.851e-01, 2.452e-02, -1.568e-02, 1.887e-02, -7.677e-02, -2.606e-02)); + r += mul(s3_4, M4(-9.875e-02, 1.220e-01, 5.520e-03, -6.611e-03, -3.200e-02, 2.402e-01, -1.204e-01, 9.334e-02, -6.591e-02, 8.266e-02, -1.431e-01, -3.456e-02, -7.360e-03, 5.965e-02, 1.024e-01, 1.577e-01)); + r += mul(s3_5, M4(-2.872e-03, -1.813e-02, -1.353e-02, 4.279e-02, -2.792e-02, -1.463e-02, 4.871e-02, 4.340e-02, -1.887e-01, 2.890e-02, -6.791e-02, 3.276e-03, -1.405e-02, 2.299e-02, -1.046e-01, -2.743e-02)); + r += mul(s3_6, M4(-1.520e-02, 9.810e-03, 1.150e-01, -6.546e-02, 2.204e-02, 5.595e-04, -2.268e-02, -1.272e-01, 1.290e-01, -2.221e-02, 4.320e-02, 1.093e-01, -8.626e-02, -1.002e-02, -9.400e-02, -3.952e-02)); + r += mul(s3_7, M4(-5.020e-02, -4.450e-02, -1.630e-02, 6.843e-02, 9.166e-03, 3.361e-02, -1.517e-02, -5.835e-02, -1.530e-01, 1.442e-01, 8.440e-02, 2.064e-01, 3.143e-02, -2.700e-02, 9.761e-02, 9.864e-03)); + r += mul(s3_8, M4(5.993e-03, -6.822e-02, -2.974e-02, -1.074e-01, 2.007e-02, -6.954e-03, -1.659e-03, -5.546e-02, 3.050e-02, -7.359e-02, 1.188e-01, 1.087e-01, -9.732e-03, 4.313e-02, -1.093e-01, -1.936e-02)); + r += mul(s4_0, M4(4.651e-02, 5.734e-02, -4.370e-02, 1.303e-02, -3.990e-02, -5.264e-02, -5.082e-02, -4.679e-02, 2.346e-02, -1.208e-01, 9.092e-02, 4.726e-02, 1.249e-03, -4.455e-02, 6.476e-02, -6.071e-02)); + r += mul(s4_1, M4(1.019e-01, 7.586e-02, 1.363e-02, 6.434e-04, 4.875e-02, -8.355e-03, -4.770e-02, -4.833e-02, -2.720e-02, 2.546e-02, 6.016e-02, 1.284e-01, -4.937e-02, -2.311e-02, -7.206e-02, -7.221e-02)); + r += mul(s4_2, M4(7.047e-02, 3.157e-02, -4.150e-02, -1.577e-01, -2.810e-03, 5.189e-02, 3.640e-02, 1.522e-01, 4.752e-02, -5.240e-02, 2.253e-02, 4.064e-02, -1.003e-01, -2.042e-02, 1.207e-01, -7.717e-02)); + r += mul(s4_3, M4(-2.889e-02, -1.341e-02, -4.202e-02, -7.141e-02, 1.300e-01, 1.342e-01, -1.211e-01, -8.244e-02, 1.337e-02, -7.162e-02, 1.231e-02, -3.629e-02, 1.921e-02, -6.773e-02, -7.825e-02, 9.541e-03)); + r += mul(s4_4, M4(-7.117e-02, 1.538e-01, 1.473e-01, 1.600e-03, -2.881e-01, -2.482e-01, 1.880e-01, -1.685e-01, 1.229e-01, 1.265e-01, -4.801e-02, 4.958e-02, 1.078e-01, -7.656e-02, -1.398e-01, 7.078e-02)); + r += mul(s4_5, M4(8.922e-02, 2.713e-02, -1.388e-01, -2.041e-02, 2.752e-02, 1.451e-01, 2.079e-01, 9.657e-03, 7.133e-02, 6.334e-02, -1.286e-02, -1.663e-01, -1.750e-02, 9.428e-02, 3.086e-02, -3.345e-03)); + r += mul(s4_6, M4(-1.315e-02, 4.226e-03, 1.794e-02, -3.194e-02, 1.228e-02, 9.752e-02, -3.953e-02, -8.082e-02, 4.687e-02, -3.622e-02, 1.084e-02, 3.371e-02, -3.397e-02, -7.870e-03, 9.080e-02, 5.172e-02)); + r += mul(s4_7, M4(-5.259e-02, 1.199e-01, -3.419e-02, -7.587e-02, 4.479e-02, -1.376e-01, 2.607e-01, 1.360e-01, -3.254e-03, -3.870e-02, -8.618e-02, 3.234e-02, -1.817e-02, -3.851e-03, -1.145e-01, -1.043e-01)); + r += mul(s4_8, M4(-5.326e-02, 1.129e-02, 3.093e-03, -1.843e-02, 1.400e-02, 7.148e-02, 2.607e-03, -6.451e-02, 6.076e-03, 3.317e-03, -2.717e-02, 5.046e-02, -8.958e-03, 7.050e-03, 4.207e-02, 8.876e-02)); + r += mul(s5_0, M4(2.586e-02, -2.349e-02, 2.932e-02, -5.166e-02, -7.897e-03, -7.043e-03, 2.976e-02, 6.619e-02, 4.217e-02, -4.423e-02, -1.386e-02, -4.745e-02, -5.444e-02, -5.169e-02, 7.885e-02, -1.084e-01)); + r += mul(s5_1, M4(8.738e-03, 7.152e-02, 7.845e-02, -2.044e-01, -8.195e-03, 5.205e-02, -4.538e-02, 3.715e-02, 9.693e-02, 7.824e-02, 2.084e-02, -2.676e-02, -4.720e-03, 1.107e-02, -1.449e-01, 1.888e-01)); + r += mul(s5_2, M4(-5.442e-02, 4.418e-02, 1.137e-01, 1.856e-02, -1.403e-02, 1.813e-02, 9.986e-02, 7.905e-02, -5.202e-02, -2.849e-02, -1.480e-02, -6.858e-02, -3.246e-02, -1.286e-02, 8.856e-02, -1.391e-01)); + r += mul(s5_3, M4(-1.563e-02, -4.548e-02, 1.092e-01, 1.109e-01, -5.316e-02, -3.517e-02, 3.365e-02, -6.571e-02, 5.587e-02, 3.823e-02, -6.547e-02, -4.291e-02, -1.775e-02, -1.006e-01, -2.846e-02, -5.472e-02)); + r += mul(s5_4, M4(-3.610e-01, -9.005e-02, -6.767e-03, -4.964e-02, 4.135e-02, 5.995e-02, -4.848e-02, -2.138e-01, -8.977e-02, 1.354e-01, 9.247e-02, -9.705e-02, -4.618e-02, -1.068e-01, -2.381e-01, -7.140e-02)); + r += mul(s5_5, M4(-7.878e-02, 3.430e-02, -1.457e-01, -2.780e-02, 2.820e-02, 1.043e-01, 2.156e-01, 1.127e-03, 1.850e-01, 9.750e-02, 4.406e-02, -1.432e-02, -9.345e-02, 1.137e-01, -1.125e-01, 6.013e-03)); + r += mul(s5_6, M4(-4.722e-02, 3.935e-02, -6.742e-02, -3.255e-02, 2.962e-02, -2.233e-02, 7.806e-02, 3.130e-03, -2.012e-02, -1.018e-02, -1.552e-01, -7.894e-03, -4.820e-03, -4.500e-04, 1.913e-02, 5.634e-02)); + r += mul(s5_7, M4(4.246e-02, -4.113e-02, 1.959e-01, 1.608e-01, 2.533e-02, 7.140e-02, 3.818e-02, 2.888e-02, 1.182e-01, 3.901e-02, 5.552e-02, 5.373e-03, 3.537e-02, 3.370e-02, -6.001e-02, 6.745e-02)); + r += mul(s5_8, M4(-2.812e-02, -7.215e-02, -6.015e-02, -7.893e-02, -2.153e-02, 3.129e-02, 2.694e-02, 1.638e-02, -9.557e-03, 5.442e-02, -1.113e-01, -4.262e-02, 2.120e-02, 2.377e-02, 4.144e-02, 9.725e-02)); + r += mul(s6_0, M4(6.638e-02, 1.293e-01, -3.926e-02, -1.474e-02, -2.119e-02, -9.355e-02, 1.058e-02, 3.320e-02, 4.711e-03, 1.100e-02, -3.412e-02, 4.699e-02, 7.911e-03, 3.650e-02, 9.713e-03, 3.565e-03)); + r += mul(s6_1, M4(-1.812e-02, 1.561e-01, -2.708e-02, -6.048e-02, 3.477e-02, -1.129e-01, -8.815e-02, -1.316e-01, 6.414e-02, 1.344e-01, 1.704e-01, 1.308e-01, 1.101e-02, -2.568e-02, 5.194e-02, -1.636e-01)); + r += mul(s6_2, M4(2.318e-02, -1.935e-02, -8.109e-02, -1.403e-01, 6.967e-03, 6.255e-02, 8.782e-02, 4.827e-02, -4.230e-02, 4.459e-02, 1.309e-02, -1.259e-01, 1.007e-03, -9.404e-03, -3.368e-02, -5.957e-02)); + r += mul(s6_3, M4(1.722e-02, -3.367e-02, -3.620e-02, 5.109e-02, -4.373e-02, -6.842e-02, -5.616e-02, 8.769e-03, 3.662e-02, 1.232e-01, 1.555e-02, 8.083e-02, -3.390e-02, -6.567e-02, 3.499e-02, -3.386e-02)); + r += mul(s6_4, M4(3.609e-02, 2.455e-01, 1.008e-01, 1.145e-01, -2.302e-01, -8.653e-02, 1.462e-01, 2.283e-01, 8.103e-02, 2.725e-02, -1.431e-01, 1.184e-01, -1.233e-01, -1.137e-03, -4.487e-02, 8.764e-02)); + r += mul(s6_5, M4(-1.343e-01, -6.138e-02, -7.601e-02, 9.977e-02, -4.357e-02, 2.132e-01, 1.662e-02, -4.598e-03, 5.994e-02, 8.297e-02, 4.904e-03, -1.470e-01, 4.775e-02, 6.281e-02, -6.231e-02, 1.806e-02)); + r += mul(s6_6, M4(-3.251e-02, -1.148e-01, -4.861e-03, 5.381e-02, 1.793e-02, -6.575e-02, 2.040e-01, 8.277e-02, -4.758e-02, 2.284e-03, -3.811e-02, 9.341e-02, 2.977e-02, -6.401e-02, 6.955e-02, 5.232e-02)); + r += mul(s6_7, M4(2.862e-02, -7.521e-02, 1.306e-02, 7.799e-02, 5.028e-02, -7.196e-02, 8.181e-02, -2.600e-01, 9.961e-02, 2.078e-02, -1.647e-02, 1.198e-01, -4.754e-03, -4.463e-02, 1.081e-01, 8.039e-03)); + r += mul(s6_8, M4(3.599e-02, -5.464e-02, 2.697e-02, 3.897e-02, 3.239e-02, 8.551e-02, -2.349e-02, 8.737e-02, 3.774e-02, 2.686e-02, -3.910e-02, -4.101e-02, -4.239e-02, -5.345e-03, -1.815e-02, -1.052e-02)); + r += mul(s7_0, M4(6.361e-02, 1.666e-02, 6.952e-02, -7.429e-02, 2.763e-02, -3.904e-02, -4.123e-02, -4.483e-02, 4.661e-02, 1.431e-01, -1.064e-01, 2.846e-02, -1.981e-02, -7.592e-02, -8.377e-02, 2.062e-02)); + r += mul(s7_1, M4(1.801e-02, 4.869e-02, -1.355e-01, -8.545e-02, 3.710e-02, -1.189e-01, 2.334e-02, -1.174e-01, 2.970e-01, -2.013e-01, 2.017e-01, -2.807e-01, 6.321e-03, -1.310e-01, 6.355e-02, -3.919e-02)); + r += mul(s7_2, M4(-6.371e-02, -5.002e-02, -7.557e-02, -1.677e-01, -1.730e-02, 3.528e-02, -1.888e-02, 3.005e-02, -4.489e-02, 1.365e-01, -1.371e-01, -2.878e-03, -3.842e-02, -7.498e-03, 4.025e-02, 1.424e-01)); + r += mul(s7_3, M4(-2.998e-02, -1.091e-01, 4.644e-02, -7.317e-02, -3.092e-02, 5.669e-02, -5.759e-02, 2.531e-02, -2.543e-02, 1.224e-01, -3.314e-02, 7.981e-02, -3.281e-02, -2.382e-01, -6.380e-02, 5.425e-02)); + r += mul(s7_4, M4(9.577e-02, 1.862e-01, -8.069e-02, 3.945e-02, -3.530e-01, 1.752e-01, 1.975e-01, -9.724e-02, 1.410e-01, 1.204e-01, 1.678e-01, 3.374e-01, 5.233e-02, -1.467e-01, -1.658e-01, 1.150e-01)); + r += mul(s7_5, M4(-1.004e-03, -1.027e-01, 4.311e-02, -1.368e-01, 9.128e-02, 2.698e-02, -9.869e-03, -2.861e-01, 1.421e-01, 9.835e-02, 1.079e-01, -1.416e-01, 9.540e-02, 2.884e-02, 1.069e-02, 1.558e-01)); + r += mul(s7_6, M4(7.539e-02, -7.728e-02, 2.320e-02, -2.850e-02, -4.240e-02, 6.454e-02, 6.304e-02, -1.285e-01, 2.739e-04, -2.594e-02, 7.202e-02, -3.416e-02, -2.743e-02, -1.126e-01, -3.591e-02, 1.367e-01)); + r += mul(s7_7, M4(-7.965e-03, -6.042e-02, 1.168e-02, -1.293e-01, 2.336e-02, 2.117e-01, 7.645e-02, 2.310e-02, -9.815e-02, 1.744e-04, -1.813e-01, -3.124e-02, -1.347e-01, -1.265e-01, -1.931e-01, 1.153e-01)); + r += mul(s7_8, M4(2.452e-02, 3.323e-02, -4.251e-02, -1.928e-01, 1.504e-02, 2.942e-02, -2.489e-02, -1.146e-01, 4.450e-02, -2.973e-02, 9.084e-02, -1.068e-01, 3.174e-02, -7.544e-02, 1.781e-01, -6.189e-02)); + r += V4(-6.267e-03, 7.941e-03, 4.343e-03, 7.643e-03); + return r; +} + +V4 f3(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(3.242e-02, -3.043e-02, 1.724e-03, -2.338e-02, -1.597e-01, -2.985e-02, -1.658e-02, 1.889e-02, 3.976e-02, 2.116e-02, 7.945e-02, -3.781e-02, 7.506e-02, -4.380e-03, 3.268e-02, 2.745e-02)); + r += mul(s0_1, M4(-1.011e-01, 6.166e-02, -3.718e-02, 1.284e-02, 7.213e-02, -2.187e-02, 1.332e-02, 8.331e-02, 1.490e-01, -2.006e-02, 3.534e-02, 3.973e-02, -5.176e-02, -1.232e-02, 8.295e-03, -4.230e-02)); + r += mul(s0_2, M4(7.887e-03, -1.568e-02, -1.862e-02, -1.451e-02, -8.544e-02, -1.506e-02, 3.749e-02, 2.105e-02, 8.908e-04, 2.095e-02, 3.198e-02, -4.995e-02, -2.329e-02, 4.272e-02, -1.463e-02, 1.879e-02)); + r += mul(s0_3, M4(1.510e-01, 6.255e-02, 1.248e-02, -1.567e-02, 1.991e-02, 1.207e-01, 7.475e-02, -5.247e-02, -3.974e-02, 1.786e-02, 6.710e-02, -2.180e-02, 3.164e-01, -1.499e-01, 3.093e-02, 4.123e-02)); + r += mul(s0_4, M4(-5.023e-02, 7.105e-02, -2.487e-01, 9.555e-02, -1.562e-01, 2.903e-01, 1.295e-01, 1.401e-02, 1.188e-01, 1.839e-01, -1.013e-01, -1.282e-02, -1.435e-02, -1.721e-01, 2.703e-01, -1.190e-01)); + r += mul(s0_5, M4(3.173e-02, -1.025e-01, 4.968e-02, 3.047e-02, 7.803e-02, -3.848e-02, 6.896e-02, 5.594e-02, -2.399e-02, 1.367e-02, 1.396e-02, -6.260e-02, -1.713e-01, -2.355e-02, 2.674e-02, -1.170e-03)); + r += mul(s0_6, M4(-1.532e-02, -5.737e-02, 2.050e-02, 5.561e-02, -3.862e-02, -6.803e-02, -2.710e-03, -3.916e-02, 1.681e-01, -4.161e-02, 1.610e-02, 6.376e-02, -1.845e-01, 1.477e-01, -3.059e-02, -1.877e-01)); + r += mul(s0_7, M4(3.860e-03, 1.489e-01, -1.101e-01, 1.475e-02, -2.062e-02, 1.160e-01, -4.358e-02, 4.451e-02, -9.945e-02, -1.303e-01, 3.533e-02, -2.152e-01, 2.757e-01, 1.130e-01, 3.199e-03, 1.912e-01)); + r += mul(s0_8, M4(1.013e-02, -7.638e-02, 1.709e-02, 1.420e-02, -8.507e-02, -1.362e-01, -1.667e-01, 1.247e-01, -1.274e-02, -6.610e-03, 1.401e-02, -8.954e-03, -1.633e-01, 3.407e-02, -8.177e-03, -5.574e-02)); + r += mul(s1_0, M4(-1.150e-01, 2.966e-02, 4.007e-02, -7.870e-03, -1.109e-01, -1.495e-02, -2.973e-03, 4.372e-02, 6.264e-02, -1.931e-02, 5.305e-02, 3.212e-02, -1.566e-01, -8.504e-03, -3.634e-02, -9.955e-03)); + r += mul(s1_1, M4(-1.646e-01, -2.965e-02, 1.954e-02, -3.065e-03, 2.236e-02, 2.265e-02, 5.543e-02, 1.480e-01, 2.759e-02, -6.297e-02, 1.368e-02, -5.885e-03, 1.066e-02, -3.342e-02, -1.769e-01, 5.950e-02)); + r += mul(s1_2, M4(4.900e-03, -3.373e-02, -6.463e-02, 1.797e-02, 9.084e-02, -2.802e-02, 7.399e-03, -1.786e-02, -4.209e-02, 2.269e-02, 8.133e-02, 6.693e-02, -1.182e-01, -2.003e-02, -5.869e-02, 5.395e-03)); + r += mul(s1_3, M4(2.159e-01, 1.300e-01, -1.812e-02, 1.410e-02, -4.700e-02, 1.181e-01, 5.018e-02, -4.040e-02, -1.996e-02, 1.707e-02, 3.876e-02, -3.725e-02, 2.240e-01, -5.119e-02, 3.179e-02, -2.737e-02)); + r += mul(s1_4, M4(5.540e-02, -4.359e-02, -3.364e-01, 2.532e-01, 1.279e-01, 4.092e-01, 4.303e-02, -2.805e-02, -3.769e-02, -5.191e-02, -1.827e-01, -4.137e-03, -7.552e-02, 5.388e-02, 3.330e-01, -2.527e-01)); + r += mul(s1_5, M4(3.848e-02, -2.629e-02, -2.358e-01, 1.037e-01, 1.382e-01, 3.943e-02, 9.022e-02, -9.599e-02, -1.610e-01, -4.049e-02, 1.917e-02, 4.318e-02, -2.772e-02, -1.126e-01, 1.029e-01, -8.321e-02)); + r += mul(s1_6, M4(1.567e-02, 2.873e-02, -2.628e-02, -6.763e-02, 1.361e-01, -4.261e-02, -9.321e-03, 3.030e-02, -1.324e-01, -1.161e-02, 1.182e-02, -8.724e-02, -1.285e-01, 1.195e-01, 5.453e-03, -1.037e-01)); + r += mul(s1_7, M4(1.467e-01, -3.218e-02, 1.390e-02, 9.988e-02, -5.050e-02, 3.019e-01, -1.035e-02, 1.410e-01, -9.858e-02, -8.520e-02, 1.264e-01, -1.111e-01, 6.724e-02, -1.416e-02, -1.929e-01, 1.696e-01)); + r += mul(s1_8, M4(-4.329e-02, -1.751e-02, -2.354e-02, -5.241e-02, -8.490e-03, -6.171e-02, -3.452e-02, 2.030e-02, -8.949e-02, 6.865e-03, 1.079e-01, 1.670e-02, -1.447e-01, 7.597e-03, -3.787e-02, -1.937e-02)); + r += mul(s2_0, M4(-1.686e-01, -2.961e-02, -8.625e-02, 2.167e-02, -1.101e-01, -2.648e-02, 4.794e-03, -3.042e-02, -3.449e-02, 2.160e-02, -6.026e-03, 2.033e-02, 1.714e-01, 3.822e-02, -3.474e-02, 7.751e-02)); + r += mul(s2_1, M4(6.028e-03, -4.305e-02, 2.270e-03, 3.999e-02, 2.744e-02, 1.034e-02, 1.535e-02, 1.389e-01, -2.836e-02, -1.379e-02, 4.342e-02, -2.250e-02, 7.039e-02, 9.988e-02, 1.646e-01, -3.523e-02)); + r += mul(s2_2, M4(-9.132e-02, -1.591e-02, 4.453e-02, -3.060e-02, -9.097e-02, -4.457e-02, 2.598e-02, -3.109e-02, 6.325e-02, -2.730e-02, -1.516e-02, 4.366e-03, 1.352e-01, 8.085e-03, -3.540e-02, -2.945e-02)); + r += mul(s2_3, M4(1.619e-01, 4.548e-02, -1.683e-02, -1.876e-01, 1.306e-01, 1.099e-01, 1.160e-01, 3.330e-02, 2.466e-02, -2.324e-02, 3.287e-02, -2.988e-02, 2.974e-01, 6.584e-02, 8.339e-02, -3.905e-02)); + r += mul(s2_4, M4(1.930e-02, 6.519e-02, 6.865e-02, -7.566e-02, 6.272e-02, 2.777e-01, 2.815e-01, -1.267e-01, 2.525e-02, -1.705e-02, 9.735e-02, 1.840e-02, -6.507e-03, 2.442e-02, 1.873e-01, 4.203e-02)); + r += mul(s2_5, M4(-3.090e-02, 1.316e-02, 5.238e-02, -2.696e-02, -2.512e-01, 1.003e-02, -5.793e-02, 4.695e-02, -1.130e-02, -4.208e-03, -2.160e-02, -2.077e-02, -2.198e-01, 1.261e-01, 3.839e-02, 1.232e-01)); + r += mul(s2_6, M4(2.053e-03, -3.048e-02, -2.046e-02, -7.591e-03, 1.779e-01, 8.231e-04, 1.298e-02, 4.006e-02, -1.434e-02, 2.252e-02, -2.371e-03, -2.140e-02, -1.074e-01, 4.943e-02, 3.980e-02, 4.531e-02)); + r += mul(s2_7, M4(-1.625e-01, -5.116e-02, -1.598e-02, -7.413e-02, -5.324e-02, -1.362e-01, -1.930e-02, 3.562e-01, 5.185e-02, 2.173e-02, 1.555e-02, -1.232e-03, -4.592e-02, 1.353e-01, 6.000e-02, 1.579e-01)); + r += mul(s2_8, M4(5.657e-02, -4.500e-02, 7.839e-02, 2.178e-02, 7.723e-02, 1.228e-01, -1.940e-02, -1.431e-01, -1.076e-02, -3.345e-02, -3.213e-03, -3.475e-02, 4.939e-02, 1.538e-01, 3.908e-02, -1.416e-01)); + r += mul(s3_0, M4(-1.069e-01, -1.324e-01, 6.342e-02, 2.082e-04, 3.583e-02, -3.487e-02, 2.995e-02, -2.249e-02, -1.052e-01, -8.666e-02, -4.117e-01, 2.250e-01, -1.018e-02, 1.228e-02, 2.876e-02, -1.193e-02)); + r += mul(s3_1, M4(9.583e-03, -8.960e-02, -5.485e-02, 3.417e-02, -5.225e-02, 2.194e-02, 5.862e-02, 1.720e-02, -1.366e-01, -1.365e-01, -1.698e-01, -1.327e-01, 1.010e-01, -5.445e-03, -2.382e-02, 4.554e-03)); + r += mul(s3_2, M4(-1.024e-01, -6.450e-03, 4.188e-02, 2.180e-02, -1.434e-02, -2.351e-02, 1.839e-02, 1.035e-02, -7.543e-02, 4.912e-03, -2.013e-01, 1.131e-01, -3.632e-02, 3.108e-02, -2.070e-02, 1.023e-03)); + r += mul(s3_3, M4(-1.625e-01, -2.299e-01, -2.886e-01, 1.418e-01, -5.067e-02, 1.427e-02, -8.063e-02, -3.631e-02, 2.188e-04, 1.541e-01, -9.286e-02, -4.220e-02, 1.546e-01, -1.059e-01, 5.016e-02, 4.690e-02)); + r += mul(s3_4, M4(9.926e-02, -7.945e-02, 7.997e-02, -7.018e-02, -2.057e-02, 5.219e-02, -5.427e-02, 2.626e-03, 2.019e-01, -4.701e-02, 2.854e-01, -1.967e-01, -2.431e-01, 5.754e-02, 8.832e-02, -3.383e-02)); + r += mul(s3_5, M4(-7.371e-03, -3.424e-02, 1.090e-02, -6.494e-02, -5.179e-02, 1.272e-02, -5.241e-02, -2.506e-02, -3.050e-03, 5.860e-02, 4.395e-02, -1.695e-01, 4.741e-03, -6.107e-02, 1.171e-02, -5.669e-02)); + r += mul(s3_6, M4(2.198e-02, 7.570e-02, -3.538e-02, -1.042e-01, 8.800e-02, 4.772e-02, -1.502e-02, 2.290e-02, 2.151e-01, -1.611e-01, -1.154e-02, 8.626e-02, 7.106e-02, -1.341e-02, -1.330e-02, 5.211e-02)); + r += mul(s3_7, M4(-3.916e-02, -1.489e-01, 3.314e-02, -7.587e-03, -2.311e-02, -4.384e-02, -7.661e-03, 3.772e-02, 1.526e-01, -2.412e-01, 7.222e-02, 2.626e-01, -2.176e-02, 3.308e-02, -1.065e-01, 7.574e-02)); + r += mul(s3_8, M4(1.587e-01, 7.943e-03, 3.881e-02, -7.019e-02, -1.458e-02, -2.718e-03, 3.520e-02, -1.612e-02, 5.317e-02, 7.138e-03, -9.154e-03, -2.594e-02, 1.313e-02, -4.044e-02, 3.335e-02, 9.018e-02)); + r += mul(s4_0, M4(-9.390e-02, -2.957e-02, 3.991e-02, -1.721e-02, -4.073e-03, -5.301e-03, 3.996e-03, -2.481e-02, 3.193e-02, -2.475e-02, 4.997e-02, 1.875e-02, 1.144e-01, 2.920e-02, 2.555e-02, 1.171e-02)); + r += mul(s4_1, M4(-1.798e-01, -5.046e-02, -5.546e-02, 9.627e-02, 1.348e-01, -7.918e-03, 2.355e-02, 7.920e-03, -1.839e-02, -5.136e-03, 1.009e-01, -7.109e-02, 1.589e-02, 6.215e-02, 1.106e-01, -8.872e-03)); + r += mul(s4_2, M4(1.272e-01, -1.213e-01, -4.277e-03, 6.587e-02, -2.318e-02, -6.901e-03, 4.194e-02, -1.869e-02, -4.644e-02, -1.502e-02, -1.545e-02, 7.140e-03, -2.498e-02, 3.137e-02, 8.960e-02, -2.048e-02)); + r += mul(s4_3, M4(7.322e-02, -1.178e-01, -2.634e-02, 8.765e-02, -3.430e-01, -1.100e-03, -2.190e-03, 2.631e-02, 1.021e-01, -3.667e-02, 3.094e-03, 4.869e-03, 1.616e-01, -6.794e-02, -2.141e-02, 3.300e-02)); + r += mul(s4_4, M4(-7.055e-02, 1.225e-01, 1.412e-02, 1.065e-02, 2.057e-01, -8.213e-02, -4.030e-02, 9.385e-02, -1.705e-01, -2.334e-02, -8.216e-02, 7.482e-02, -1.352e-01, -2.363e-02, -6.218e-02, 2.513e-01)); + r += mul(s4_5, M4(1.639e-01, -1.603e-01, -3.466e-02, -8.816e-03, 4.738e-02, 2.710e-03, -1.057e-02, 1.490e-02, -2.733e-02, -6.313e-03, 4.574e-02, 2.334e-02, 1.030e-01, 1.220e-02, 1.563e-02, 1.519e-01)); + r += mul(s4_6, M4(-6.611e-02, 4.803e-02, -3.370e-02, -2.136e-02, 1.686e-01, 3.868e-02, -2.811e-02, 1.314e-01, -6.832e-02, -6.332e-02, 3.891e-03, 1.078e-03, 1.259e-02, 1.347e-02, -1.795e-02, -1.823e-02)); + r += mul(s4_7, M4(-4.383e-02, 3.919e-02, -1.702e-02, 6.133e-02, 2.650e-02, 1.528e-01, 1.077e-02, -1.136e-01, -3.415e-02, -4.393e-02, -1.535e-02, 5.751e-03, 7.887e-02, 8.357e-02, -1.169e-01, 9.759e-02)); + r += mul(s4_8, M4(5.286e-02, -1.319e-01, 2.557e-02, -6.891e-02, 8.569e-03, -1.494e-02, -8.862e-02, 6.980e-02, 2.563e-03, 3.462e-02, 9.554e-02, -3.793e-02, -5.212e-02, 1.955e-02, -3.071e-02, -3.454e-02)); + r += mul(s5_0, M4(-1.768e-01, 2.204e-02, 2.787e-02, -2.393e-02, -1.002e-02, 2.389e-02, 3.614e-02, -1.781e-02, -2.353e-02, -2.875e-02, 4.366e-03, 1.779e-03, 1.665e-01, -4.700e-02, -6.477e-02, 3.770e-02)); + r += mul(s5_1, M4(-2.880e-02, 1.783e-02, -4.043e-02, 6.825e-02, -1.876e-02, 5.088e-02, 1.608e-02, 1.315e-02, 3.018e-02, -1.662e-02, 4.605e-03, -5.020e-02, -1.377e-01, 5.353e-02, 8.571e-02, -1.120e-01)); + r += mul(s5_2, M4(4.789e-02, -5.843e-02, 3.200e-02, 4.193e-02, -6.985e-02, 1.890e-02, -4.449e-02, -1.330e-02, -2.758e-02, -2.345e-02, 3.961e-02, 6.886e-02, 5.490e-02, 4.636e-03, 4.952e-02, 1.662e-03)); + r += mul(s5_3, M4(2.187e-02, -7.181e-02, 7.356e-03, 3.356e-02, 4.571e-02, -4.116e-02, -4.134e-02, 3.689e-02, -5.024e-02, 2.879e-02, 4.638e-02, 1.015e-02, 2.537e-02, 4.648e-02, -8.458e-03, -4.430e-02)); + r += mul(s5_4, M4(-6.847e-02, 3.472e-01, 1.254e-01, 3.952e-02, 6.795e-02, 9.090e-02, -2.754e-02, -7.743e-02, -2.736e-02, 6.506e-02, 2.538e-02, 4.489e-02, -1.526e-02, 2.073e-02, -7.722e-02, 5.576e-02)); + r += mul(s5_5, M4(2.726e-01, -1.925e-01, 7.170e-02, -7.306e-02, -1.318e-01, 5.286e-02, -8.710e-03, -1.056e-01, 1.901e-01, -1.255e-01, 5.971e-02, -6.112e-02, 1.548e-01, -3.938e-02, 3.478e-02, 3.970e-02)); + r += mul(s5_6, M4(1.714e-01, 4.680e-03, 4.453e-02, 7.159e-02, 2.744e-02, 8.789e-02, -3.985e-03, -6.283e-02, -5.795e-02, -8.652e-02, 7.511e-03, 1.671e-02, 6.817e-02, 7.215e-02, 1.972e-02, -5.465e-03)); + r += mul(s5_7, M4(-7.153e-02, 3.829e-02, 6.513e-03, 5.031e-02, -4.022e-02, 1.541e-01, -1.352e-01, 8.070e-02, -8.733e-02, 3.275e-02, 1.219e-01, -9.393e-02, 6.974e-02, 1.334e-02, -5.241e-02, 9.083e-02)); + r += mul(s5_8, M4(7.991e-02, -1.213e-01, 2.898e-02, 2.543e-02, -1.676e-02, 8.872e-04, -1.376e-02, -1.789e-02, 5.687e-02, -1.101e-01, 1.071e-01, -1.883e-02, -4.311e-02, -2.708e-02, -3.975e-02, -3.926e-02)); + r += mul(s6_0, M4(-1.041e-01, -1.478e-02, 3.713e-02, -8.654e-03, -1.223e-02, -2.924e-02, -9.693e-03, 2.120e-02, 4.728e-02, -2.734e-02, 7.005e-02, 6.289e-03, -1.467e-01, -3.108e-02, 2.606e-03, 1.035e-02)); + r += mul(s6_1, M4(-8.825e-02, 6.671e-04, -2.186e-01, 4.616e-02, 7.066e-02, 2.789e-02, 7.979e-02, 5.889e-03, 1.313e-01, 7.202e-02, 1.629e-01, -1.344e-01, -8.374e-03, -5.702e-02, -6.884e-02, 9.055e-02)); + r += mul(s6_2, M4(2.092e-01, -4.789e-02, -2.173e-02, -4.804e-02, -1.003e-01, 3.567e-02, 1.570e-02, 1.596e-02, -4.941e-02, -2.362e-02, 1.388e-01, 4.125e-02, 2.788e-02, 3.079e-02, 1.342e-02, -2.604e-03)); + r += mul(s6_3, M4(-2.535e-02, 4.078e-03, 8.193e-02, 3.778e-03, 3.107e-01, 5.877e-02, -8.162e-02, -1.081e-02, -4.131e-02, -2.058e-02, -6.159e-02, -4.414e-02, 1.622e-01, -1.059e-01, 4.606e-02, -5.873e-02)); + r += mul(s6_4, M4(4.429e-02, 4.277e-02, 3.192e-02, -8.978e-02, -1.494e-01, 7.105e-02, 2.000e-02, 7.918e-02, -1.043e-01, -3.371e-01, -2.302e-01, 2.748e-01, -7.409e-02, 1.661e-02, 3.416e-02, -6.733e-02)); + r += mul(s6_5, M4(5.293e-03, -2.558e-02, 2.730e-02, -1.202e-02, 1.339e-02, 6.815e-02, 5.157e-02, 9.234e-03, 3.241e-02, -1.237e-02, -2.822e-01, 3.455e-02, 1.194e-01, 2.901e-02, 6.449e-02, -4.839e-02)); + r += mul(s6_6, M4(6.621e-02, -9.204e-02, 4.267e-02, -2.218e-02, -5.260e-02, 6.895e-02, 3.258e-02, -5.115e-02, 4.922e-02, -5.462e-03, -1.338e-02, -5.627e-02, 1.055e-02, -6.708e-02, 9.224e-03, 2.283e-02)); + r += mul(s6_7, M4(-6.565e-02, -3.862e-02, 1.656e-02, -1.221e-02, 1.148e-01, 3.873e-02, -4.293e-02, -7.591e-02, -5.572e-02, 2.340e-03, -1.108e-02, 1.175e-01, 1.409e-02, -7.847e-02, 1.175e-02, -4.514e-02)); + r += mul(s6_8, M4(-2.909e-03, 5.116e-02, 7.008e-02, -1.192e-01, -5.601e-02, 5.023e-02, -6.509e-02, 1.439e-01, 6.913e-03, -3.456e-03, 1.591e-02, -1.092e-01, 2.563e-03, -2.662e-03, -2.068e-02, -3.506e-02)); + r += mul(s7_0, M4(1.868e-01, -1.714e-02, -3.043e-02, 3.179e-02, 8.869e-02, -3.393e-02, -4.821e-02, -3.797e-02, -2.281e-01, 1.769e-02, -4.862e-02, 3.733e-03, -1.018e-01, -7.720e-02, 8.861e-03, 6.126e-02)); + r += mul(s7_1, M4(3.822e-02, 3.344e-02, -4.502e-02, 2.524e-02, 1.802e-01, 3.652e-02, -2.133e-02, 2.703e-02, 1.495e-01, -4.717e-02, -5.456e-02, 8.936e-02, -5.424e-02, -5.804e-02, -7.314e-02, 3.841e-02)); + r += mul(s7_2, M4(1.188e-01, -9.731e-03, -3.472e-03, -1.714e-02, 5.064e-02, 3.891e-02, -1.604e-02, -5.796e-02, 1.003e-01, -8.472e-02, -3.450e-02, 1.285e-02, -3.742e-02, 1.612e-03, -3.046e-02, -1.759e-02)); + r += mul(s7_3, M4(1.873e-01, 1.052e-01, 2.580e-02, -1.778e-02, -7.024e-02, 1.224e-01, 1.048e-01, -1.203e-01, 2.369e-01, 1.081e-01, 3.423e-02, 3.875e-02, 2.634e-02, -1.966e-01, -6.384e-02, -3.763e-02)); + r += mul(s7_4, M4(4.489e-02, -9.274e-02, 1.093e-01, 1.736e-02, -9.947e-02, 2.066e-02, -1.510e-02, 2.141e-02, -2.248e-01, -8.135e-02, 1.751e-01, 7.487e-02, -5.824e-02, -3.883e-02, -5.598e-02, -2.840e-03)); + r += mul(s7_5, M4(1.493e-01, 3.032e-02, 3.953e-02, -3.044e-02, 1.585e-01, 1.179e-03, -6.519e-02, -6.421e-02, 5.900e-02, -2.839e-02, -3.216e-02, -3.307e-02, -6.550e-02, 1.080e-01, 4.691e-02, 2.331e-02)); + r += mul(s7_6, M4(-6.866e-03, -3.810e-03, 3.708e-02, -2.128e-02, 1.840e-01, 3.419e-02, 7.918e-02, 3.062e-01, -8.909e-02, -7.120e-03, 4.227e-03, -1.091e-01, -3.904e-02, -3.161e-02, 7.149e-02, 2.966e-02)); + r += mul(s7_7, M4(4.679e-02, 2.399e-02, 7.689e-02, -9.124e-02, 2.010e-01, -1.263e-01, 1.106e-01, -4.843e-02, -3.990e-02, -4.025e-02, 7.679e-02, 4.350e-02, 8.031e-02, -1.385e-01, -2.760e-02, 1.475e-01)); + r += mul(s7_8, M4(1.304e-01, 1.269e-02, 5.142e-02, -1.304e-01, 1.175e-02, -7.449e-03, -9.245e-02, 1.372e-01, 3.384e-02, 7.022e-02, 8.292e-02, -4.169e-02, -9.016e-02, 1.304e-01, -1.643e-01, -2.188e-02)); + r += V4(-3.684e-03, 7.998e-03, -4.249e-03, -9.809e-03); + return r; +} + +void Pass7(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = Rmp8x8(tid.x) + blockStart; + uint2 size = GetInputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = (gxy + 0.5) * pt; + + V4 s0_0 = l0(-1.0, -1.0); + V4 s0_1 = l0(0.0, -1.0); + V4 s0_2 = l0(1.0, -1.0); + V4 s0_3 = l0(-1.0, 0.0); + V4 s0_4 = l0(0.0, 0.0); + V4 s0_5 = l0(1.0, 0.0); + V4 s0_6 = l0(-1.0, 1.0); + V4 s0_7 = l0(0.0, 1.0); + V4 s0_8 = l0(1.0, 1.0); + V4 s1_0 = -max(-s0_0, 0.0); + V4 s1_1 = -max(-s0_1, 0.0); + V4 s1_2 = -max(-s0_2, 0.0); + V4 s1_3 = -max(-s0_3, 0.0); + V4 s1_4 = -max(-s0_4, 0.0); + V4 s1_5 = -max(-s0_5, 0.0); + V4 s1_6 = -max(-s0_6, 0.0); + V4 s1_7 = -max(-s0_7, 0.0); + V4 s1_8 = -max(-s0_8, 0.0); + s0_0 = max(s0_0, 0.0); + s0_1 = max(s0_1, 0.0); + s0_2 = max(s0_2, 0.0); + s0_3 = max(s0_3, 0.0); + s0_4 = max(s0_4, 0.0); + s0_5 = max(s0_5, 0.0); + s0_6 = max(s0_6, 0.0); + s0_7 = max(s0_7, 0.0); + s0_8 = max(s0_8, 0.0); + + V4 s2_0 = l1(-1.0, -1.0); + V4 s2_1 = l1(0.0, -1.0); + V4 s2_2 = l1(1.0, -1.0); + V4 s2_3 = l1(-1.0, 0.0); + V4 s2_4 = l1(0.0, 0.0); + V4 s2_5 = l1(1.0, 0.0); + V4 s2_6 = l1(-1.0, 1.0); + V4 s2_7 = l1(0.0, 1.0); + V4 s2_8 = l1(1.0, 1.0); + V4 s3_0 = -max(-s2_0, 0.0); + V4 s3_1 = -max(-s2_1, 0.0); + V4 s3_2 = -max(-s2_2, 0.0); + V4 s3_3 = -max(-s2_3, 0.0); + V4 s3_4 = -max(-s2_4, 0.0); + V4 s3_5 = -max(-s2_5, 0.0); + V4 s3_6 = -max(-s2_6, 0.0); + V4 s3_7 = -max(-s2_7, 0.0); + V4 s3_8 = -max(-s2_8, 0.0); + s2_0 = max(s2_0, 0.0); + s2_1 = max(s2_1, 0.0); + s2_2 = max(s2_2, 0.0); + s2_3 = max(s2_3, 0.0); + s2_4 = max(s2_4, 0.0); + s2_5 = max(s2_5, 0.0); + s2_6 = max(s2_6, 0.0); + s2_7 = max(s2_7, 0.0); + s2_8 = max(s2_8, 0.0); + + V4 s4_0 = l2(-1.0, -1.0); + V4 s4_1 = l2(0.0, -1.0); + V4 s4_2 = l2(1.0, -1.0); + V4 s4_3 = l2(-1.0, 0.0); + V4 s4_4 = l2(0.0, 0.0); + V4 s4_5 = l2(1.0, 0.0); + V4 s4_6 = l2(-1.0, 1.0); + V4 s4_7 = l2(0.0, 1.0); + V4 s4_8 = l2(1.0, 1.0); + V4 s5_0 = -max(-s4_0, 0.0); + V4 s5_1 = -max(-s4_1, 0.0); + V4 s5_2 = -max(-s4_2, 0.0); + V4 s5_3 = -max(-s4_3, 0.0); + V4 s5_4 = -max(-s4_4, 0.0); + V4 s5_5 = -max(-s4_5, 0.0); + V4 s5_6 = -max(-s4_6, 0.0); + V4 s5_7 = -max(-s4_7, 0.0); + V4 s5_8 = -max(-s4_8, 0.0); + s4_0 = max(s4_0, 0.0); + s4_1 = max(s4_1, 0.0); + s4_2 = max(s4_2, 0.0); + s4_3 = max(s4_3, 0.0); + s4_4 = max(s4_4, 0.0); + s4_5 = max(s4_5, 0.0); + s4_6 = max(s4_6, 0.0); + s4_7 = max(s4_7, 0.0); + s4_8 = max(s4_8, 0.0); + + V4 s6_0 = l3(-1.0, -1.0); + V4 s6_1 = l3(0.0, -1.0); + V4 s6_2 = l3(1.0, -1.0); + V4 s6_3 = l3(-1.0, 0.0); + V4 s6_4 = l3(0.0, 0.0); + V4 s6_5 = l3(1.0, 0.0); + V4 s6_6 = l3(-1.0, 1.0); + V4 s6_7 = l3(0.0, 1.0); + V4 s6_8 = l3(1.0, 1.0); + V4 s7_0 = -max(-s6_0, 0.0); + V4 s7_1 = -max(-s6_1, 0.0); + V4 s7_2 = -max(-s6_2, 0.0); + V4 s7_3 = -max(-s6_3, 0.0); + V4 s7_4 = -max(-s6_4, 0.0); + V4 s7_5 = -max(-s6_5, 0.0); + V4 s7_6 = -max(-s6_6, 0.0); + V4 s7_7 = -max(-s6_7, 0.0); + V4 s7_8 = -max(-s6_8, 0.0); + s6_0 = max(s6_0, 0.0); + s6_1 = max(s6_1, 0.0); + s6_2 = max(s6_2, 0.0); + s6_3 = max(s6_3, 0.0); + s6_4 = max(s6_4, 0.0); + s6_5 = max(s6_5, 0.0); + s6_6 = max(s6_6, 0.0); + s6_7 = max(s6_7, 0.0); + s6_8 = max(s6_8, 0.0); + + t0[gxy] = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t1[gxy] = f1(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t2[gxy] = f2(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t3[gxy] = f3(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); +} + +//!PASS 8 +//!DESC conv7 +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 +//!IN t0, t1, t2, t3 +//!OUT t4, t5, t6, t7 + +#define l0(x, y) V4(O(t0, float2(x, y))) +#define l1(x, y) V4(O(t1, float2(x, y))) +#define l2(x, y) V4(O(t2, float2(x, y))) +#define l3(x, y) V4(O(t3, float2(x, y))) + +V4 f0(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(7.928e-02, 4.822e-02, 5.804e-04, -4.495e-02, -3.156e-02, -4.858e-02, 1.014e-01, 2.752e-02, 9.953e-02, 4.994e-02, -5.578e-02, -2.008e-02, 3.357e-02, 3.335e-02, 4.004e-03, 3.210e-02)); + r += mul(s0_1, M4(-5.454e-02, 1.172e-01, 5.500e-02, 3.605e-02, -4.624e-02, -1.258e-01, -5.372e-02, 5.674e-02, -1.013e-01, -3.818e-02, 3.052e-02, 5.311e-02, -1.847e-01, 1.806e-01, 4.878e-02, 2.028e-02)); + r += mul(s0_2, M4(1.427e-01, 3.897e-02, -3.087e-02, -2.563e-02, -5.991e-02, -5.467e-02, 2.661e-02, 5.379e-02, 9.090e-02, -7.985e-02, -4.141e-02, -1.746e-02, -1.910e-02, -1.430e-02, 3.502e-02, 2.449e-02)); + r += mul(s0_3, M4(9.980e-02, 2.403e-02, 1.376e-01, -3.144e-02, 5.065e-02, 2.243e-02, -6.782e-02, -1.758e-02, 6.117e-02, -6.080e-02, -2.983e-02, -5.149e-02, 4.535e-04, -3.357e-02, -9.829e-03, 4.028e-02)); + r += mul(s0_4, M4(7.933e-02, 1.366e-01, -1.287e-01, -1.279e-01, -1.537e-01, -3.683e-01, 3.433e-01, 2.802e-01, -3.495e-02, -4.771e-02, -1.293e-01, -1.279e-01, -3.095e-01, -6.632e-02, -9.007e-02, 5.759e-02)); + r += mul(s0_5, M4(7.745e-02, 1.275e-01, 8.537e-03, -1.231e-01, -2.843e-02, -6.560e-02, 1.503e-02, 4.679e-02, 7.496e-02, -1.226e-03, 6.703e-02, -3.926e-02, 7.192e-02, 4.207e-02, -4.325e-02, 2.096e-02)); + r += mul(s0_6, M4(-3.992e-02, 1.466e-02, -1.168e-02, 9.433e-03, -4.607e-03, -3.028e-02, 8.283e-02, 7.753e-03, -3.722e-02, -4.383e-02, -7.033e-03, 3.636e-02, -2.195e-02, -4.262e-02, 3.918e-02, 3.968e-02)); + r += mul(s0_7, M4(9.177e-02, 3.323e-02, 7.248e-02, 2.168e-02, -7.738e-02, -1.661e-01, -1.904e-01, 2.629e-03, -6.617e-02, -4.853e-02, -6.812e-02, 5.823e-02, -1.688e-01, 1.137e-01, -3.627e-02, -7.605e-02)); + r += mul(s0_8, M4(-2.016e-02, 4.008e-02, -4.592e-02, -3.231e-02, 5.997e-02, -3.119e-02, 7.739e-02, 8.729e-02, -1.062e-02, -1.966e-02, -3.977e-02, -9.933e-03, 3.076e-02, 3.503e-02, -5.243e-02, -5.442e-02)); + r += mul(s1_0, M4(6.632e-03, -2.218e-02, -8.032e-02, -2.854e-02, -8.480e-02, -5.885e-02, 2.241e-02, 7.530e-03, 1.836e-01, -4.341e-02, 6.516e-02, 4.234e-02, -4.015e-02, -1.274e-02, 2.232e-03, -4.298e-03)); + r += mul(s1_1, M4(-1.793e-01, 9.310e-02, 1.594e-02, 7.977e-04, -6.755e-02, -7.043e-02, -6.245e-02, -4.357e-02, -4.572e-02, -8.671e-02, -1.630e-01, -1.412e-01, 7.826e-02, -6.310e-02, -9.400e-02, -6.938e-02)); + r += mul(s1_2, M4(6.265e-02, -3.672e-02, 5.506e-03, 4.493e-03, -1.238e-01, -2.876e-02, 1.421e-02, 1.911e-02, -2.735e-02, 1.067e-01, -2.680e-02, -8.603e-02, 3.457e-02, 4.358e-02, -1.305e-02, 6.127e-03)); + r += mul(s1_3, M4(-5.895e-02, -3.985e-02, 8.656e-02, -3.214e-02, 1.907e-03, 5.553e-02, -1.673e-01, -4.178e-02, 2.555e-02, 5.746e-03, 9.090e-02, 2.383e-02, 3.308e-02, 2.390e-02, 2.692e-02, 1.934e-02)); + r += mul(s1_4, M4(1.077e-01, 8.866e-02, -1.509e-01, -7.764e-02, -3.423e-01, -1.899e-01, 2.406e-01, 9.025e-02, 1.675e-01, -8.327e-02, 9.804e-02, -4.304e-01, -1.195e-01, 6.765e-02, 1.466e-01, 2.829e-02)); + r += mul(s1_5, M4(2.812e-03, -4.669e-03, -6.641e-02, -2.064e-02, 1.053e-01, -1.186e-01, -2.315e-02, 5.758e-02, 5.627e-02, -8.880e-02, -1.077e-01, -6.856e-02, -7.529e-03, 3.375e-02, -1.046e-03, -5.482e-02)); + r += mul(s1_6, M4(-1.219e-01, 3.633e-03, -7.520e-02, 2.118e-02, -8.152e-02, -2.245e-02, -2.174e-02, -2.503e-02, -5.606e-02, 6.988e-03, -4.448e-02, 5.467e-02, 2.982e-02, -4.799e-02, -1.716e-02, 2.838e-02)); + r += mul(s1_7, M4(7.319e-02, 6.005e-03, 1.300e-02, 4.553e-02, -1.912e-01, -8.610e-02, -1.208e-01, 2.906e-02, -7.969e-02, -3.817e-02, 1.276e-01, 8.493e-02, -1.141e-01, 9.560e-03, -9.636e-02, 2.154e-02)); + r += mul(s1_8, M4(-3.762e-02, -5.653e-04, -5.481e-02, -1.965e-02, 2.146e-02, -5.393e-03, 3.041e-02, 6.961e-02, 1.217e-02, 5.822e-03, -2.191e-02, -4.545e-02, 3.931e-02, -1.587e-03, -1.719e-02, 1.047e-02)); + r += mul(s2_0, M4(2.373e-02, 2.247e-02, -6.849e-04, 1.556e-02, -7.684e-02, 2.018e-02, -9.347e-02, -4.673e-02, -3.720e-03, -9.546e-02, 5.003e-02, 8.953e-04, -3.589e-02, -2.696e-02, 3.924e-03, 2.185e-02)); + r += mul(s2_1, M4(1.047e-01, 7.446e-03, 2.984e-02, -2.656e-02, 1.127e-01, -1.081e-01, -9.928e-02, -5.862e-02, 1.805e-03, -3.810e-02, -4.034e-04, 4.211e-02, 4.344e-02, -1.064e-01, 4.765e-02, -9.679e-02)); + r += mul(s2_2, M4(6.379e-02, 5.960e-02, 3.886e-02, -2.070e-03, 2.553e-02, 2.428e-02, -5.641e-02, -1.192e-02, -3.963e-02, -4.780e-03, -2.298e-02, -2.753e-02, 1.223e-02, -2.535e-03, 4.660e-03, -6.159e-02)); + r += mul(s2_3, M4(1.149e-01, 2.259e-02, 2.713e-03, 3.219e-03, 2.691e-03, -5.508e-02, -1.100e-02, 3.262e-02, -1.204e-01, -2.375e-02, -2.582e-02, 2.569e-02, 1.195e-01, 4.853e-02, -2.514e-01, 6.026e-02)); + r += mul(s2_4, M4(-8.884e-02, -4.142e-02, 1.428e-01, 2.254e-01, 4.768e-02, -1.388e-01, 2.105e-01, 1.763e-01, 3.213e-02, 5.192e-02, -3.433e-02, -5.249e-03, -3.116e-02, 1.466e-01, -1.701e-03, 3.028e-01)); + r += mul(s2_5, M4(3.556e-02, 2.233e-02, 8.829e-03, -9.730e-03, 6.758e-03, 3.418e-02, -7.578e-03, 7.302e-04, -3.096e-02, -2.904e-02, -4.008e-02, -4.763e-02, -8.620e-02, -1.078e-01, 7.608e-02, 9.286e-02)); + r += mul(s2_6, M4(7.097e-03, -3.942e-03, 8.524e-03, -1.820e-02, 1.128e-02, -6.837e-04, -1.842e-02, -3.144e-02, -7.628e-02, -2.179e-02, 5.451e-03, 3.382e-02, 3.599e-01, -1.985e-02, 3.210e-01, -1.446e-01)); + r += mul(s2_7, M4(2.867e-02, 3.294e-02, -4.666e-03, 3.856e-02, 1.143e-01, 4.184e-02, 5.582e-02, 8.814e-03, -7.175e-02, 2.063e-02, 2.047e-02, 2.778e-02, 3.098e-01, 4.170e-02, 2.116e-01, -9.749e-02)); + r += mul(s2_8, M4(-2.635e-02, 4.096e-02, 3.253e-03, -3.084e-03, 3.638e-02, 8.699e-03, 1.527e-02, -1.289e-03, 6.092e-02, 9.191e-03, -3.761e-03, -2.226e-02, 4.413e-02, 4.219e-02, 3.322e-02, -1.974e-02)); + r += mul(s3_0, M4(-3.994e-02, 8.130e-02, -3.198e-02, -1.669e-02, -8.029e-03, -6.796e-02, -6.583e-02, -3.012e-02, 9.142e-03, -1.086e-01, 5.108e-02, 4.155e-02, 5.000e-02, -9.506e-03, 8.482e-03, 1.235e-02)); + r += mul(s3_1, M4(-1.659e-01, 2.043e-02, 4.550e-02, 5.520e-02, 1.052e-01, -5.562e-02, -7.151e-02, -9.228e-02, -1.309e-01, -1.847e-02, 4.913e-02, 4.541e-02, -8.032e-02, 3.619e-02, -2.746e-02, 1.785e-02)); + r += mul(s3_2, M4(7.671e-02, 2.484e-02, 6.241e-02, -1.613e-02, 6.753e-02, -1.390e-02, -6.519e-03, 3.430e-02, 5.440e-02, 2.179e-02, -5.459e-02, -3.557e-02, -5.773e-02, -1.613e-02, 1.931e-02, 1.466e-02)); + r += mul(s3_3, M4(6.151e-02, 8.306e-04, 8.367e-02, 2.388e-02, 9.813e-02, -5.005e-02, -6.053e-03, 8.916e-02, 5.964e-02, -1.682e-02, -2.338e-02, 1.274e-01, 7.861e-02, 3.454e-02, 1.468e-03, 5.767e-03)); + r += mul(s3_4, M4(9.943e-02, -9.606e-02, -6.648e-02, 1.613e-01, 1.685e-01, -2.279e-01, 1.675e-01, 2.100e-01, -3.538e-01, -2.136e-01, 1.959e-02, -2.794e-01, -1.435e-01, 1.942e-02, -3.614e-02, -7.109e-03)); + r += mul(s3_5, M4(-3.280e-02, 3.541e-02, -1.235e-02, -2.704e-02, -1.406e-01, 3.437e-02, 3.113e-02, 3.525e-02, 2.545e-01, -3.342e-02, -9.375e-02, -1.359e-01, 6.469e-03, -3.424e-02, 7.331e-03, 2.436e-02)); + r += mul(s3_6, M4(-4.128e-02, -9.223e-03, -3.515e-02, -3.574e-03, 8.755e-02, 1.804e-02, 5.316e-02, 4.868e-02, -2.996e-02, -6.481e-02, 1.053e-01, 5.608e-02, -5.896e-02, 8.228e-03, -9.137e-03, -1.011e-02)); + r += mul(s3_7, M4(3.142e-02, 3.920e-02, 5.861e-03, 7.950e-03, 1.942e-01, 1.906e-02, 2.305e-03, -1.533e-02, -5.578e-01, 4.189e-02, -2.218e-01, 1.115e-01, 5.651e-02, 2.233e-02, -1.435e-02, -2.548e-03)); + r += mul(s3_8, M4(-7.958e-02, 4.222e-02, -8.568e-03, -1.070e-02, -6.441e-03, 7.074e-03, 3.075e-03, 4.157e-02, 2.458e-01, 4.872e-02, 7.116e-02, -3.461e-02, 4.319e-02, -5.893e-03, 3.991e-02, 8.141e-03)); + r += mul(s4_0, M4(3.418e-02, -9.294e-02, -1.456e-01, -4.444e-02, 6.170e-02, 1.936e-02, 6.358e-02, 2.248e-02, 3.492e-02, -8.125e-02, 2.340e-02, 5.791e-02, 4.087e-02, 1.529e-02, -2.263e-02, 7.531e-03)); + r += mul(s4_1, M4(4.576e-02, -1.343e-01, -2.147e-01, -1.267e-01, -6.335e-02, 9.448e-02, 3.801e-02, 1.031e-02, 1.429e-02, -9.072e-04, 4.151e-03, -7.928e-03, -8.103e-02, 8.228e-02, 1.606e-02, -9.433e-03)); + r += mul(s4_2, M4(-9.938e-02, 2.235e-02, -2.479e-02, -5.497e-02, -5.530e-02, -5.077e-02, 9.537e-02, 7.495e-02, 3.749e-02, -6.759e-04, -7.712e-02, -3.873e-02, 5.519e-02, -1.195e-03, -4.125e-02, -9.629e-03)); + r += mul(s4_3, M4(-4.165e-02, 1.206e-02, -3.113e-01, 7.691e-02, 1.725e-01, 4.061e-02, 6.413e-02, -4.162e-02, 3.836e-02, -1.379e-02, 6.306e-02, 6.000e-02, 5.685e-02, 6.323e-02, 3.697e-02, -5.615e-02)); + r += mul(s4_4, M4(-3.059e-01, -1.780e-01, -2.509e-01, -6.061e-02, 1.590e-01, 8.690e-02, -8.801e-02, -1.086e-01, 2.244e-01, 1.915e-02, -1.168e-02, 3.451e-02, -1.122e-01, 8.629e-02, -2.466e-02, -1.351e-01)); + r += mul(s4_5, M4(8.602e-02, -9.071e-02, -8.880e-02, 1.006e-01, -1.470e-01, 2.896e-02, 8.073e-02, 5.723e-02, 5.191e-02, -3.617e-03, 4.879e-03, -3.711e-02, 9.028e-02, 3.305e-02, 1.294e-02, -3.785e-02)); + r += mul(s4_6, M4(6.079e-02, -2.926e-02, -3.995e-02, 4.857e-02, -1.966e-02, -8.598e-03, -4.296e-02, -2.273e-02, -1.563e-02, -3.625e-02, 2.455e-02, 5.626e-02, -5.617e-02, 1.546e-02, -5.664e-02, 7.118e-03)); + r += mul(s4_7, M4(6.910e-02, 5.679e-02, -1.621e-02, -1.419e-01, -4.303e-02, -3.255e-02, -3.813e-03, -1.900e-02, -1.566e-01, -1.576e-02, -3.888e-02, 1.545e-02, 1.173e-04, 1.922e-02, 1.461e-02, -3.308e-02)); + r += mul(s4_8, M4(3.567e-02, -3.772e-02, -8.326e-02, -3.235e-02, -5.440e-02, -5.952e-02, -1.039e-02, 2.460e-03, 2.784e-03, 3.484e-03, 3.995e-02, 4.645e-03, 5.301e-02, -4.191e-03, 8.651e-03, -4.718e-03)); + r += mul(s5_0, M4(7.415e-03, 7.788e-04, -5.342e-02, 1.154e-02, -9.967e-02, -9.571e-03, -2.785e-02, 1.109e-02, -1.993e-02, 5.363e-02, 3.610e-02, 4.299e-02, 4.654e-02, 5.421e-03, -5.148e-02, -1.616e-02)); + r += mul(s5_1, M4(-1.031e-01, 1.385e-02, 9.443e-02, -3.626e-02, 6.729e-02, -1.415e-02, 1.051e-01, -9.966e-03, 2.624e-01, -1.492e-02, -1.411e-01, -2.688e-02, -1.547e-03, 1.719e-02, -1.118e-01, -9.640e-02)); + r += mul(s5_2, M4(6.631e-02, -2.274e-02, -1.288e-02, 1.491e-03, 2.390e-02, -3.272e-02, -9.256e-03, -4.146e-02, -2.112e-01, 8.644e-02, 4.942e-02, -4.721e-03, -7.967e-02, -4.386e-04, -6.615e-02, -3.745e-02)); + r += mul(s5_3, M4(-3.943e-02, -2.252e-02, -8.333e-02, -1.378e-02, 8.017e-02, 2.037e-03, 8.727e-03, -2.196e-02, -1.023e-01, -3.603e-02, -2.292e-01, 1.195e-02, 7.777e-02, 8.270e-03, 1.038e-02, -4.713e-02)); + r += mul(s5_4, M4(-1.392e-01, -8.142e-03, -1.491e-01, -1.440e-01, 3.064e-01, -1.491e-01, -1.275e-01, -3.076e-01, 3.082e-01, 3.986e-01, 4.476e-02, 3.037e-01, -3.026e-01, 9.497e-02, 9.989e-02, -2.319e-01)); + r += mul(s5_5, M4(-2.376e-02, -3.715e-03, 6.960e-02, 2.098e-02, 1.130e-01, 3.826e-02, 3.829e-03, -2.412e-02, -2.564e-01, -4.456e-04, -5.662e-02, 4.287e-02, 4.126e-02, 3.119e-04, 3.600e-02, 6.596e-03)); + r += mul(s5_6, M4(1.803e-02, 1.501e-02, -4.666e-03, 9.316e-03, 2.560e-02, -2.137e-03, 2.721e-02, 2.083e-02, -9.668e-02, -1.302e-02, -2.248e-02, 1.082e-01, -1.994e-03, -2.949e-02, -7.086e-02, -4.480e-02)); + r += mul(s5_7, M4(-5.131e-03, -2.336e-02, -1.813e-02, -3.692e-02, 2.265e-02, -3.541e-02, 5.478e-02, -8.799e-02, -4.778e-03, 1.823e-02, 4.562e-02, 1.143e-01, -9.672e-02, -7.293e-03, -4.857e-02, -6.498e-02)); + r += mul(s5_8, M4(2.416e-02, -1.683e-02, -1.683e-02, -9.997e-03, -1.394e-02, -6.069e-02, -3.461e-02, -4.660e-02, -1.422e-01, 1.486e-02, -1.097e-02, -2.757e-03, -5.731e-04, -1.561e-02, -5.748e-02, -2.341e-02)); + r += mul(s6_0, M4(-1.249e-02, 3.845e-02, 5.718e-03, 1.434e-02, 6.750e-02, -5.721e-02, -8.473e-02, 5.111e-02, -5.758e-02, 1.557e-02, -3.896e-02, -1.285e-02, 1.352e-02, -5.283e-03, 2.060e-02, 4.702e-02)); + r += mul(s6_1, M4(2.872e-02, 7.152e-02, 1.209e-02, 3.583e-02, 7.593e-02, -7.288e-03, -1.075e-01, -9.605e-02, -1.324e-01, 4.844e-02, 2.521e-04, -4.092e-02, -8.412e-02, -3.797e-02, -1.491e-01, -1.859e-01)); + r += mul(s6_2, M4(-6.098e-03, -4.373e-02, -7.894e-03, 3.482e-02, -7.495e-02, -3.480e-02, 3.454e-02, 1.662e-02, 5.705e-02, -4.046e-02, 3.114e-02, 6.800e-02, 4.427e-02, 1.664e-02, -2.560e-02, 2.520e-02)); + r += mul(s6_3, M4(-7.703e-02, 1.120e-01, 1.198e-02, -1.646e-03, -1.605e-02, 1.075e-02, 5.630e-02, -7.171e-02, -5.739e-02, -1.108e-01, -3.192e-02, 3.843e-02, -2.070e-03, -1.209e-01, 7.992e-03, -6.664e-03)); + r += mul(s6_4, M4(-1.091e-01, 1.296e-02, -2.629e-02, -4.328e-02, 1.123e-01, 2.018e-02, 1.686e-01, -1.707e-01, 1.179e-01, 1.125e-01, -1.860e-01, -1.666e-01, 1.630e-01, 5.831e-03, -4.884e-02, 1.543e-02)); + r += mul(s6_5, M4(6.148e-02, -3.357e-02, 4.384e-02, 1.890e-02, -5.325e-02, -1.146e-02, 2.605e-02, 5.642e-02, 3.314e-02, -1.044e-03, 2.765e-02, 1.145e-01, -3.975e-02, -3.602e-02, 6.113e-02, 2.219e-02)); + r += mul(s6_6, M4(-4.629e-03, 6.955e-02, -3.905e-03, -2.236e-02, -2.049e-02, 4.068e-02, 1.674e-03, -1.239e-02, 7.260e-02, -3.747e-03, 1.437e-02, 3.210e-02, -2.625e-03, -5.696e-02, 1.303e-02, 4.426e-02)); + r += mul(s6_7, M4(4.351e-02, 3.086e-02, 2.064e-02, -2.015e-02, -5.198e-02, 4.068e-02, 5.444e-02, -1.383e-02, 2.095e-01, 3.082e-02, 9.118e-02, -5.258e-02, -1.734e-02, -2.578e-02, 3.836e-02, 5.330e-03)); + r += mul(s6_8, M4(-1.897e-02, 3.367e-03, -7.593e-02, 5.187e-02, -4.588e-02, 3.120e-04, -4.319e-03, -2.105e-02, -1.110e-01, 3.202e-02, -4.200e-03, -1.821e-02, -4.845e-02, 2.483e-02, 1.924e-02, -8.146e-03)); + r += mul(s7_0, M4(-5.626e-02, 6.364e-03, -1.765e-02, 1.029e-02, 1.255e-01, 7.597e-02, -4.705e-02, 2.156e-02, -1.286e-01, -8.622e-02, -5.481e-02, 6.097e-03, -5.013e-02, 2.833e-02, -9.929e-03, -1.467e-02)); + r += mul(s7_1, M4(5.623e-02, 2.189e-02, 2.068e-02, 2.171e-02, 1.321e-02, 2.415e-01, 2.451e-02, 1.200e-02, -2.508e-01, 5.658e-03, -5.360e-02, -2.568e-02, 1.899e-01, 4.632e-02, -2.182e-01, -1.004e-02)); + r += mul(s7_2, M4(-6.903e-02, 1.023e-02, -8.371e-03, 9.310e-03, -8.910e-02, -7.477e-02, -4.199e-03, -3.107e-02, 1.413e-01, -2.929e-02, -1.731e-02, 8.115e-02, -1.723e-01, 3.023e-02, 5.058e-02, 1.814e-02)); + r += mul(s7_3, M4(-9.143e-02, 3.089e-02, -3.683e-02, -3.701e-02, 5.979e-02, -5.476e-02, 7.731e-02, -3.719e-02, -8.051e-02, 4.463e-03, 1.348e-01, 6.575e-02, 4.512e-02, -1.238e-03, 1.535e-01, 1.107e-02)); + r += mul(s7_4, M4(2.022e-02, -5.338e-03, -3.378e-02, -5.679e-02, -6.939e-02, -2.564e-01, -2.188e-02, -1.236e-01, -3.304e-01, 2.622e-01, -3.185e-02, -4.603e-01, 3.060e-01, 2.514e-03, 7.321e-02, -4.819e-02)); + r += mul(s7_5, M4(4.261e-02, -3.187e-02, -5.567e-02, 9.319e-04, -5.670e-04, -2.831e-02, -9.990e-02, -1.360e-02, -1.421e-01, 7.289e-02, 1.848e-02, -1.327e-02, -1.597e-01, 2.097e-02, -1.113e-02, 3.342e-02)); + r += mul(s7_6, M4(-3.785e-02, 2.305e-02, -4.138e-02, -6.811e-03, 3.313e-03, 2.111e-02, -4.657e-02, 2.641e-02, 1.650e-02, 5.746e-03, -8.368e-03, 4.657e-03, 4.895e-02, -1.558e-02, 1.198e-02, 3.993e-02)); + r += mul(s7_7, M4(-3.501e-02, 4.877e-03, 5.460e-02, -6.116e-02, 1.592e-02, 1.768e-02, 5.892e-02, -1.304e-02, -1.658e-02, 4.944e-02, -3.337e-02, -3.778e-02, -4.636e-02, 2.160e-02, 6.470e-02, 1.165e-03)); + r += mul(s7_8, M4(1.307e-02, -2.179e-03, 3.846e-02, -1.762e-02, -5.784e-02, -3.612e-03, -4.913e-02, -1.284e-02, 1.709e-02, 4.493e-02, 3.720e-02, -4.552e-03, -8.815e-03, 4.349e-02, 3.794e-02, -3.816e-03)); + r += V4(-3.895e-03, -8.356e-03, 7.020e-03, 2.656e-03); + return r; +} + +V4 f1(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-1.111e-01, -3.175e-04, 1.594e-02, -2.178e-02, 6.486e-02, 3.492e-02, -5.328e-02, -8.276e-02, 8.186e-03, -2.455e-02, 3.569e-02, -3.164e-03, -6.172e-02, -3.503e-02, -1.473e-02, -3.031e-02)); + r += mul(s0_1, M4(8.157e-02, -1.452e-02, -6.915e-02, 1.309e-02, -6.614e-03, -5.674e-02, -1.737e-02, 2.184e-02, 1.774e-01, 4.415e-02, -1.119e-01, -9.674e-02, -8.765e-02, 1.167e-01, 4.151e-04, -4.010e-02)); + r += mul(s0_2, M4(-1.075e-01, 1.050e-01, 9.690e-02, 4.260e-02, 2.686e-02, 4.955e-02, 3.839e-02, -1.783e-02, 4.947e-02, 1.239e-01, 4.785e-02, 4.874e-02, 5.631e-02, 5.338e-02, 1.938e-02, 1.017e-02)); + r += mul(s0_3, M4(2.327e-04, 4.618e-02, -8.965e-02, -2.445e-02, 1.397e-02, 1.034e-01, 3.686e-02, 4.144e-02, 7.913e-02, -1.383e-01, 2.294e-02, 7.601e-02, -1.200e-01, -1.116e-01, -8.621e-02, 8.035e-02)); + r += mul(s0_4, M4(-2.977e-02, -5.948e-02, 2.419e-02, 9.913e-02, 1.271e-01, -1.856e-02, 1.742e-01, -6.541e-03, 8.201e-02, -4.481e-02, -3.520e-03, 1.960e-01, -3.483e-01, -1.156e-01, 2.198e-01, -2.455e-02)); + r += mul(s0_5, M4(1.596e-02, -9.178e-03, -5.511e-02, -5.448e-02, 6.330e-02, -5.342e-02, -3.141e-02, 3.838e-02, -1.185e-01, 2.116e-01, 4.580e-02, -4.053e-02, -1.246e-01, -1.606e-01, -1.765e-02, 4.382e-03)); + r += mul(s0_6, M4(4.333e-02, 3.341e-02, 1.798e-02, -2.895e-02, -3.774e-02, -1.775e-02, -1.273e-02, -4.692e-02, 3.420e-02, -7.636e-04, 3.939e-02, 1.415e-02, 4.825e-02, -2.230e-03, -1.590e-02, 8.207e-02)); + r += mul(s0_7, M4(2.826e-02, -2.563e-03, -6.100e-02, -7.286e-02, -3.553e-02, -1.938e-01, -3.848e-02, -5.982e-02, -8.330e-03, -1.613e-01, 1.356e-02, 1.181e-01, -5.626e-02, 2.223e-02, -4.682e-02, 2.161e-01)); + r += mul(s0_8, M4(-1.068e-02, 2.957e-02, -7.559e-02, -2.765e-03, -5.642e-02, -6.326e-02, -9.012e-02, -1.650e-01, -7.645e-02, 2.591e-02, 3.277e-02, 7.611e-02, 4.265e-02, -4.556e-02, 2.665e-02, -4.761e-03)); + r += mul(s1_0, M4(-8.369e-03, -7.104e-02, -4.053e-03, 2.696e-02, 6.111e-02, -1.225e-02, 7.894e-03, -5.733e-02, 6.659e-02, -7.197e-02, 8.736e-02, 7.836e-02, -3.087e-02, 5.446e-03, -5.538e-03, 2.015e-02)); + r += mul(s1_1, M4(8.236e-03, 3.515e-02, -7.031e-02, -4.893e-04, 7.165e-02, 2.122e-02, -6.245e-02, 5.521e-02, -2.507e-01, -7.431e-03, -6.972e-02, 1.014e-01, -9.786e-02, 4.074e-02, -1.138e-03, 1.096e-01)); + r += mul(s1_2, M4(-8.829e-02, -3.148e-02, -2.142e-02, 5.981e-02, 5.066e-03, -6.110e-02, 3.339e-03, 7.664e-03, -2.020e-02, 5.512e-03, -7.908e-02, -2.970e-03, 9.111e-03, 1.377e-02, 1.319e-02, 8.516e-03)); + r += mul(s1_3, M4(-5.001e-02, 2.919e-03, -5.871e-02, 1.821e-02, -7.493e-02, -4.757e-02, 2.643e-02, 1.199e-02, -2.783e-01, -1.154e-01, 1.419e-01, -7.777e-02, 3.460e-02, -2.820e-02, -4.490e-02, -4.171e-03)); + r += mul(s1_4, M4(-7.329e-02, -7.155e-03, -4.647e-02, 1.127e-01, 8.173e-02, 1.380e-01, 1.007e-01, -1.666e-01, 3.941e-01, 1.394e-01, -6.078e-02, -1.604e-01, -2.940e-01, 1.331e-01, -3.606e-02, -1.772e-01)); + r += mul(s1_5, M4(2.868e-02, -2.188e-01, -6.634e-02, -3.221e-02, 4.437e-02, -1.630e-01, 4.866e-03, 4.620e-02, -1.544e-02, -1.962e-02, -1.514e-03, 3.143e-02, 1.624e-02, 4.628e-02, 7.661e-03, 3.106e-02)); + r += mul(s1_6, M4(1.388e-02, 8.381e-04, 1.228e-02, 5.737e-02, 3.986e-02, -3.514e-02, -7.946e-02, 5.119e-02, 4.793e-02, -1.235e-02, 5.782e-02, -1.727e-02, 9.271e-02, 4.089e-03, 1.185e-02, 6.081e-02)); + r += mul(s1_7, M4(-2.851e-02, -6.290e-02, -9.474e-03, -6.267e-02, -8.284e-02, -5.416e-02, -1.131e-02, 2.230e-01, 9.527e-03, -1.781e-01, 8.715e-02, -1.448e-01, 9.062e-02, 9.679e-03, 2.458e-02, 9.532e-02)); + r += mul(s1_8, M4(-4.635e-02, -4.072e-02, -7.488e-02, 6.482e-02, -1.024e-01, 2.769e-02, -5.381e-02, -7.026e-02, -1.038e-01, -9.665e-03, 5.855e-02, 1.004e-01, -3.043e-03, -3.584e-02, 5.021e-02, -2.025e-02)); + r += mul(s2_0, M4(-3.691e-02, 4.343e-03, 1.944e-03, 5.121e-03, -6.205e-02, 1.779e-02, 1.133e-02, 8.393e-02, 6.189e-02, -5.052e-02, -1.885e-04, -2.769e-02, 8.502e-02, 6.285e-02, -1.575e-01, -9.110e-03)); + r += mul(s2_1, M4(-2.548e-02, 3.900e-02, -7.437e-02, 1.593e-02, -6.999e-02, -1.089e-01, -8.605e-02, 1.203e-01, 1.808e-02, 2.306e-02, 4.526e-02, 1.072e-02, -1.069e-01, -1.257e-01, -1.824e-01, 1.765e-01)); + r += mul(s2_2, M4(2.279e-02, 5.037e-03, 8.069e-02, -1.478e-03, -3.047e-02, -8.335e-02, -2.637e-02, 2.844e-02, -2.300e-03, -1.131e-02, -3.253e-02, -2.081e-02, -1.460e-01, -2.562e-02, -2.515e-02, -1.627e-02)); + r += mul(s2_3, M4(8.925e-02, -8.621e-05, 3.551e-02, 5.852e-02, 7.491e-02, -1.479e-01, -8.129e-02, -1.654e-01, 2.907e-02, 4.001e-03, 1.898e-02, 1.946e-02, 1.645e-01, 9.341e-02, -1.773e-02, -2.151e-01)); + r += mul(s2_4, M4(-1.025e-01, -6.147e-02, 1.116e-01, -2.732e-01, 4.592e-02, 9.316e-02, 2.190e-01, -1.172e-01, 8.032e-03, -3.184e-02, -3.324e-02, 4.468e-02, 3.894e-01, -4.911e-02, -2.667e-01, -6.591e-01)); + r += mul(s2_5, M4(3.605e-02, -1.431e-02, 1.066e-01, -1.271e-03, -8.170e-02, -5.271e-02, -1.263e-01, 7.878e-03, -2.190e-02, 3.071e-02, -2.802e-02, 2.736e-02, -2.978e-02, -5.201e-02, -1.224e-01, -3.254e-01)); + r += mul(s2_6, M4(-7.998e-02, -8.551e-03, -9.969e-03, -6.664e-02, 3.013e-02, -1.551e-02, -5.777e-03, 3.318e-02, 2.715e-02, 1.761e-03, 1.030e-02, 1.606e-02, -7.406e-03, 7.278e-03, -4.858e-02, 5.677e-02)); + r += mul(s2_7, M4(-4.434e-02, 3.694e-02, 2.225e-02, 5.404e-02, -5.965e-02, 1.155e-01, -1.446e-02, -1.431e-01, -1.449e-02, 3.707e-02, -8.811e-03, 2.222e-02, 3.625e-02, 4.348e-02, 1.404e-01, 1.871e-02)); + r += mul(s2_8, M4(7.695e-02, 5.765e-02, 1.118e-01, -2.032e-02, 6.812e-02, -1.101e-01, 1.491e-02, -8.794e-02, -4.007e-03, 8.639e-04, 9.093e-03, 2.268e-02, -8.533e-03, -1.890e-02, -8.417e-03, -2.010e-02)); + r += mul(s3_0, M4(-5.556e-02, 6.920e-02, 1.927e-02, -2.532e-02, -6.915e-02, -2.470e-02, -6.204e-02, 3.620e-02, 6.127e-02, -5.440e-02, -3.001e-02, -4.251e-02, 4.457e-02, -9.204e-03, 3.700e-03, -3.529e-02)); + r += mul(s3_1, M4(1.667e-01, 1.160e-01, -8.801e-02, -1.770e-01, -1.248e-01, 1.147e-02, -1.574e-01, 8.512e-02, 8.809e-02, -2.999e-03, 5.942e-02, 1.731e-02, 3.972e-02, -4.257e-02, -1.670e-02, -2.578e-02)); + r += mul(s3_2, M4(3.448e-02, 2.192e-02, -1.129e-02, -4.515e-02, -4.126e-02, -5.978e-02, -3.035e-02, 4.129e-02, -1.721e-02, 3.501e-02, 1.505e-02, 2.744e-02, 4.188e-02, -2.930e-02, 2.939e-02, -3.203e-02)); + r += mul(s3_3, M4(-2.527e-02, -6.208e-02, 2.997e-02, 8.396e-02, -1.245e-03, -1.697e-02, -9.905e-02, -9.929e-02, 1.386e-01, 5.462e-02, 1.256e-01, 1.261e-01, 4.739e-02, 2.547e-02, 1.957e-02, 2.484e-03)); + r += mul(s3_4, M4(-1.878e-01, -1.528e-01, 3.545e-02, 1.051e-02, 1.128e-02, 2.776e-01, 3.176e-01, -1.291e-01, -2.102e-01, -2.655e-01, -4.457e-02, 3.313e-01, 3.943e-02, -8.620e-02, -3.682e-02, 8.068e-02)); + r += mul(s3_5, M4(2.688e-02, -4.420e-02, -7.753e-03, 1.846e-02, -3.534e-02, -1.075e-01, -1.408e-01, -6.160e-02, -6.013e-02, -3.317e-02, -4.455e-02, 1.931e-01, -2.555e-02, -2.839e-02, 1.649e-02, 1.812e-02)); + r += mul(s3_6, M4(-2.297e-02, -5.681e-02, -5.738e-02, -5.830e-02, -3.678e-02, 3.950e-02, 3.693e-02, -4.448e-02, -1.573e-03, 8.136e-02, 1.578e-02, -1.116e-01, 6.074e-02, 2.165e-02, 2.547e-02, -1.440e-02)); + r += mul(s3_7, M4(-8.937e-03, 2.686e-02, -1.064e-01, 4.029e-03, -3.302e-02, 7.123e-02, 2.526e-02, -1.513e-02, 9.030e-02, 9.048e-02, 4.383e-02, -7.035e-03, -3.051e-02, -6.291e-02, 1.686e-03, 4.893e-02)); + r += mul(s3_8, M4(6.268e-02, -9.602e-03, 1.679e-02, -3.474e-02, 6.772e-02, -4.073e-02, -5.241e-02, -3.012e-02, 4.198e-03, -1.029e-02, 4.477e-02, -1.357e-01, 1.368e-02, -8.683e-03, -1.462e-02, -3.328e-02)); + r += mul(s4_0, M4(-1.728e-04, -4.062e-02, -5.267e-03, 9.502e-02, -6.827e-02, 3.119e-02, -3.602e-02, -3.598e-02, 7.886e-02, -4.163e-02, -2.511e-02, -5.339e-03, 2.045e-03, -4.370e-02, -3.567e-02, -6.170e-02)); + r += mul(s4_1, M4(-1.357e-01, -5.105e-03, -1.439e-01, 1.387e-01, 3.401e-02, 7.299e-02, 1.007e-01, -8.077e-02, -2.987e-02, 5.897e-02, -5.838e-02, 1.707e-02, 4.441e-02, 7.889e-02, 3.613e-02, -4.555e-02)); + r += mul(s4_2, M4(-9.628e-02, 7.116e-03, -1.357e-01, -5.248e-02, 9.198e-02, 5.426e-02, 4.230e-02, -4.582e-02, -4.610e-02, -2.197e-02, -3.523e-02, 3.964e-02, -4.567e-02, 2.019e-02, 1.297e-02, 3.994e-02)); + r += mul(s4_3, M4(1.021e-01, 8.482e-02, -9.234e-03, 1.916e-01, -2.604e-02, 5.640e-02, -4.721e-02, 2.153e-02, -4.347e-02, 2.935e-02, 1.933e-02, 8.553e-02, -1.625e-02, 3.943e-02, 7.231e-02, -3.787e-02)); + r += mul(s4_4, M4(2.682e-01, 2.765e-01, -2.186e-01, -3.614e-01, 1.081e-02, 2.499e-02, -4.153e-02, -2.146e-02, 6.579e-02, -2.080e-02, -8.323e-03, 6.411e-02, -1.551e-01, 1.018e-01, -1.316e-01, 5.251e-02)); + r += mul(s4_5, M4(4.870e-02, 9.739e-02, -1.611e-01, 5.916e-02, -9.009e-02, 1.231e-02, 3.923e-02, -5.300e-02, -5.035e-02, 1.460e-02, -1.402e-02, -2.836e-02, 5.409e-02, 6.433e-02, -2.114e-03, -3.348e-02)); + r += mul(s4_6, M4(4.469e-02, -1.401e-03, -8.021e-03, 7.605e-02, 1.365e-02, -2.579e-02, -6.499e-02, 2.021e-02, -1.392e-02, -4.463e-02, 3.883e-02, -8.082e-02, 5.414e-02, 3.849e-02, -3.084e-02, 5.126e-02)); + r += mul(s4_7, M4(-6.951e-02, 7.847e-02, 1.060e-01, 3.783e-01, 1.528e-03, -1.161e-03, -3.397e-02, 2.894e-02, 2.840e-02, 2.163e-02, 5.997e-02, -2.849e-02, 1.324e-02, -1.374e-02, 3.235e-02, 7.879e-02)); + r += mul(s4_8, M4(-6.662e-02, -5.941e-02, 2.370e-02, 1.409e-01, -3.225e-02, 4.043e-02, 5.481e-03, 1.394e-02, -6.735e-03, -1.254e-02, -2.157e-02, -1.412e-02, -3.787e-02, 7.276e-02, 1.049e-02, 2.077e-02)); + r += mul(s5_0, M4(4.753e-02, -4.741e-02, 4.268e-02, -2.750e-02, -1.499e-02, 4.141e-02, 4.314e-02, -2.799e-02, -4.858e-02, 4.180e-02, -5.937e-02, 7.599e-03, -1.086e-01, -3.846e-02, -4.511e-01, 2.891e-02)); + r += mul(s5_1, M4(-3.799e-02, 1.486e-02, 1.909e-02, -5.205e-02, 8.668e-03, 9.116e-02, 9.902e-02, -6.908e-05, -1.486e-01, -4.575e-02, 9.426e-02, 7.493e-02, -7.610e-02, 2.594e-02, -4.155e-01, 1.043e-01)); + r += mul(s5_2, M4(-1.578e-02, -2.317e-02, -1.873e-02, 6.506e-03, 5.834e-03, 6.624e-02, 5.604e-02, -4.697e-03, 5.603e-02, 1.003e-01, 3.492e-02, -4.066e-02, -8.498e-02, -3.709e-02, -4.663e-01, 4.506e-02)); + r += mul(s5_3, M4(1.530e-01, -1.419e-02, 4.457e-02, 1.735e-02, -1.507e-02, 1.339e-01, 8.650e-02, 4.461e-02, 7.934e-02, -6.799e-02, -8.232e-02, -8.079e-03, 2.353e-02, -1.112e-01, -3.234e-01, -1.513e-01)); + r += mul(s5_4, M4(-9.873e-02, 1.266e-02, -4.563e-02, -6.144e-02, 8.620e-03, -1.178e-01, -5.440e-02, 1.080e-01, -2.497e-01, 6.533e-02, -3.113e-02, 1.041e-01, -1.834e-01, 1.515e-01, -3.158e-01, -5.617e-02)); + r += mul(s5_5, M4(-1.181e-02, 1.017e-01, -2.301e-02, 4.789e-03, 6.093e-02, -7.036e-02, -5.387e-02, -3.476e-02, -8.936e-02, 2.091e-01, 1.606e-01, 9.772e-02, 6.605e-02, -5.859e-02, -5.548e-01, -5.306e-02)); + r += mul(s5_6, M4(3.997e-04, 2.750e-02, 1.809e-02, 6.481e-02, -1.627e-02, 5.154e-03, -6.532e-02, -1.683e-02, -5.241e-02, -6.942e-03, 4.336e-02, 5.270e-02, 2.331e-02, 1.883e-02, -4.827e-01, 7.747e-02)); + r += mul(s5_7, M4(2.166e-02, 2.180e-02, 5.002e-02, 8.731e-02, -1.527e-02, 4.645e-03, -1.913e-02, 3.873e-02, -4.044e-03, 1.239e-01, 7.787e-02, -2.459e-02, 8.016e-03, -2.391e-02, -5.045e-01, 1.226e-01)); + r += mul(s5_8, M4(-2.626e-02, 7.217e-02, 8.186e-02, 5.629e-02, -2.961e-02, 7.589e-02, 1.711e-02, 2.898e-02, 9.636e-02, 4.845e-02, -1.364e-02, 1.790e-03, -1.044e-01, 1.256e-02, -4.494e-01, -1.234e-02)); + r += mul(s6_0, M4(1.140e-02, 9.363e-03, 4.300e-01, -1.318e-02, 2.510e-01, -7.819e-02, 8.848e-02, -9.342e-03, -1.298e-02, 7.493e-02, 5.181e-02, 2.558e-02, 1.605e-03, -5.114e-02, 2.143e-02, -4.397e-02)); + r += mul(s6_1, M4(-9.611e-04, 7.419e-02, 4.901e-01, -4.664e-02, -8.663e-03, -1.639e-01, -1.429e-01, 3.733e-02, -1.649e-02, 3.757e-02, -1.612e-03, 1.383e-02, -3.144e-01, 1.175e-01, -2.074e-01, 7.000e-02)); + r += mul(s6_2, M4(-1.122e-02, -2.168e-02, 4.276e-01, 1.530e-02, -6.548e-02, 8.041e-02, 9.651e-03, -2.591e-02, 4.500e-02, -1.279e-01, 8.215e-02, -2.642e-02, 1.282e-03, -1.513e-01, -2.194e-01, 5.308e-03)); + r += mul(s6_3, M4(-5.915e-02, 6.068e-02, 3.973e-01, 5.852e-02, -5.017e-02, -3.912e-02, 3.955e-02, -1.229e-01, 2.079e-01, 5.003e-02, -7.709e-02, 2.521e-02, 4.375e-02, -3.964e-02, -3.442e-02, -9.235e-02)); + r += mul(s6_4, M4(-1.313e-01, -2.077e-02, 1.088e-01, 1.850e-02, -1.380e-01, -9.510e-02, -4.841e-02, -3.782e-02, 4.680e-02, 9.948e-02, -2.507e-01, 1.493e-02, 5.328e-03, 4.027e-02, -8.760e-02, 4.633e-02)); + r += mul(s6_5, M4(5.972e-02, 1.194e-02, 3.225e-01, -9.068e-02, 5.225e-02, -2.503e-02, 4.713e-02, 2.473e-02, -4.251e-02, 2.470e-02, 5.847e-02, -1.685e-03, 1.264e-01, -2.465e-02, -1.440e-01, -7.791e-02)); + r += mul(s6_6, M4(-9.400e-03, 3.380e-02, 3.979e-01, -2.205e-02, 2.998e-02, 2.225e-02, 3.898e-02, -9.355e-02, -1.261e-03, -3.366e-02, 9.228e-02, -2.655e-03, -1.726e-02, -5.696e-02, 6.734e-03, -7.790e-02)); + r += mul(s6_7, M4(6.232e-02, -2.392e-02, 3.940e-01, 2.002e-02, 6.472e-02, -4.588e-02, -2.079e-02, -6.893e-02, 6.273e-02, 1.513e-01, 7.043e-02, -1.354e-01, -2.504e-02, 6.867e-02, -1.033e-02, -1.156e-01)); + r += mul(s6_8, M4(1.024e-01, 1.242e-03, 3.614e-01, -7.435e-02, 3.118e-03, -8.220e-03, 2.923e-02, -1.808e-03, -2.953e-03, 1.355e-02, 3.267e-02, 1.208e-02, 9.185e-03, 4.535e-02, -5.062e-02, 3.119e-02)); + r += mul(s7_0, M4(-1.910e-02, -1.887e-02, -4.592e-02, -2.185e-02, 8.543e-03, -3.987e-02, 3.666e-02, 3.995e-02, 6.334e-02, -5.211e-02, -5.736e-02, 4.134e-02, -1.546e-01, -1.693e-02, 7.901e-02, 4.490e-02)); + r += mul(s7_1, M4(2.399e-02, 3.919e-02, 2.938e-02, -3.529e-02, 1.825e-02, 4.760e-02, -9.350e-03, -6.631e-02, 4.184e-02, 2.180e-02, 3.567e-02, 1.530e-03, -8.034e-02, 3.142e-02, -2.671e-02, 4.697e-02)); + r += mul(s7_2, M4(1.911e-02, 7.166e-03, 4.074e-02, -1.249e-03, -1.535e-01, 1.070e-01, 5.826e-02, -2.056e-02, 7.336e-02, -1.698e-01, -2.646e-02, 6.150e-02, 8.283e-03, 8.127e-02, -3.357e-02, -9.405e-02)); + r += mul(s7_3, M4(-4.339e-02, -4.750e-03, -5.452e-02, 3.019e-02, -2.252e-02, -1.077e-01, 1.085e-02, -3.993e-02, 1.242e-02, 3.231e-02, -3.038e-02, -1.896e-01, -6.426e-02, -8.185e-03, 1.091e-01, -4.529e-02)); + r += mul(s7_4, M4(-1.119e-01, 4.192e-02, -1.368e-01, 1.173e-01, -1.318e-01, -3.726e-01, 6.285e-02, 1.275e-01, -2.175e-01, 9.336e-02, -1.567e-01, 8.716e-03, -1.037e-01, 3.719e-02, 6.634e-02, -4.542e-02)); + r += mul(s7_5, M4(5.178e-02, 8.103e-03, -6.096e-02, 5.751e-02, 6.189e-02, 1.582e-01, 4.693e-02, 8.167e-03, -4.985e-02, -8.742e-02, 5.395e-02, 1.497e-03, 8.699e-02, -1.446e-02, -3.192e-03, 8.255e-02)); + r += mul(s7_6, M4(-2.826e-02, 3.149e-03, -7.046e-02, 3.496e-03, -1.670e-02, -5.437e-03, 3.555e-03, -3.939e-02, -2.075e-02, 1.419e-04, 1.303e-02, 6.702e-02, -1.347e-02, -2.402e-02, 6.611e-02, -9.259e-02)); + r += mul(s7_7, M4(-3.679e-02, 6.286e-02, -1.727e-03, 4.870e-02, 5.135e-03, -3.917e-02, -4.287e-03, -1.575e-03, 4.891e-02, 1.372e-01, -6.934e-02, -1.228e-03, 1.604e-02, 3.688e-02, 8.385e-02, -6.384e-02)); + r += mul(s7_8, M4(-5.084e-02, 6.363e-02, 1.538e-02, -4.257e-02, -1.282e-02, 5.665e-02, 4.601e-02, 8.042e-02, 2.497e-02, 5.432e-02, 2.507e-02, -5.704e-02, 3.731e-02, 9.438e-03, 8.206e-02, 1.792e-02)); + r += V4(4.997e-03, 6.270e-03, 8.008e-03, -5.621e-03); + return r; +} + +V4 f2(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-5.530e-02, -1.617e-02, 2.352e-02, -1.485e-02, 4.881e-02, -2.329e-02, -4.558e-03, 8.385e-03, -1.442e-01, -4.004e-02, 2.705e-02, -9.990e-03, -1.235e-01, -1.013e-01, -1.527e-02, 3.842e-02)); + r += mul(s0_1, M4(4.684e-03, 5.035e-04, -5.050e-02, -8.947e-03, 1.573e-02, -2.615e-02, 6.428e-02, -3.808e-03, -4.715e-02, -2.329e-02, 3.442e-02, 3.093e-02, -4.718e-02, 4.890e-02, -2.897e-02, 7.459e-02)); + r += mul(s0_2, M4(7.853e-02, -1.839e-03, -3.160e-02, -3.292e-02, -1.984e-02, 6.870e-02, -4.005e-02, 3.317e-02, -3.989e-03, 1.158e-01, -2.007e-02, 9.144e-03, -5.287e-02, -1.566e-03, -5.974e-02, 5.084e-03)); + r += mul(s0_3, M4(1.097e-01, 3.125e-02, -2.672e-02, 5.035e-02, -7.439e-02, -2.495e-02, -3.683e-02, -5.713e-03, 3.229e-02, 5.931e-02, -1.243e-02, 7.279e-03, 6.230e-02, -9.399e-02, 1.939e-02, -6.977e-02)); + r += mul(s0_4, M4(4.851e-02, -8.625e-02, -7.390e-03, -1.343e-01, -1.915e-01, 3.872e-02, -5.489e-02, -5.599e-02, -4.943e-02, -1.504e-01, 1.693e-01, 3.257e-03, 2.588e-01, 6.934e-02, -8.523e-02, 1.005e-01)); + r += mul(s0_5, M4(4.412e-02, -9.001e-02, 1.167e-01, -3.110e-02, -3.913e-02, -1.538e-01, -1.114e-01, 7.471e-03, -6.041e-02, 6.154e-02, -1.910e-01, -3.868e-02, 1.568e-02, -1.627e-01, 5.494e-02, -4.914e-02)); + r += mul(s0_6, M4(-1.899e-02, -5.654e-02, -3.378e-02, -1.689e-02, -3.330e-02, -6.734e-02, 5.689e-02, -2.113e-02, 9.719e-03, -2.733e-02, -4.758e-02, 2.752e-02, 1.083e-01, -3.866e-02, -2.688e-02, -1.729e-03)); + r += mul(s0_7, M4(-5.968e-02, -2.996e-02, 2.356e-02, -1.238e-02, 2.084e-01, 7.735e-03, -1.316e-01, -5.468e-03, 1.017e-01, 4.390e-02, 4.193e-02, -6.397e-02, 5.279e-02, -9.751e-02, -1.821e-02, -1.616e-01)); + r += mul(s0_8, M4(1.749e-02, 4.329e-03, -6.404e-02, -5.788e-02, 1.173e-02, -2.369e-02, 6.466e-03, 5.626e-03, 6.072e-02, -4.984e-02, 2.577e-03, 2.890e-03, 9.293e-02, -4.553e-02, -1.866e-02, -1.942e-02)); + r += mul(s1_0, M4(-5.736e-02, -4.241e-03, 4.091e-02, -9.481e-04, -3.571e-02, -2.591e-02, -3.441e-02, 1.974e-02, 2.702e-02, -6.178e-02, 3.701e-02, 4.750e-02, 3.939e-02, 2.841e-02, 1.887e-02, -1.122e-02)); + r += mul(s1_1, M4(5.769e-03, 7.284e-02, -9.693e-04, -1.688e-02, 5.025e-02, -3.396e-03, 3.851e-02, 3.025e-03, -1.075e-02, -1.265e-01, 1.086e-01, -1.664e-01, 6.975e-02, 2.271e-02, 2.500e-02, -4.588e-02)); + r += mul(s1_2, M4(9.697e-03, -2.097e-02, 5.419e-02, -3.256e-02, -4.287e-02, 3.847e-02, 2.259e-02, 1.297e-02, 9.146e-03, 1.455e-02, -1.044e-02, -2.461e-02, 2.637e-02, -1.331e-02, -1.739e-02, -1.716e-03)); + r += mul(s1_3, M4(7.006e-02, 9.059e-02, 1.133e-03, 1.094e-02, -7.047e-02, 5.636e-02, 4.308e-02, 3.544e-02, 1.890e-02, 1.031e-01, 1.460e-01, 9.134e-02, -1.043e-01, -6.854e-02, 2.331e-03, -5.222e-02)); + r += mul(s1_4, M4(7.126e-02, 4.843e-03, -2.516e-02, -5.130e-02, -1.754e-01, 7.127e-02, -1.121e-01, 7.451e-02, -3.895e-02, -3.175e-01, -3.025e-02, 2.512e-01, -1.846e-01, 1.422e-01, -8.243e-02, 7.740e-02)); + r += mul(s1_5, M4(1.101e-01, 5.575e-02, 1.701e-01, 1.255e-02, -3.568e-02, -2.743e-02, 8.043e-02, -1.039e-02, 9.320e-02, 1.439e-01, 1.610e-01, -1.980e-02, -4.803e-02, -4.626e-02, 3.953e-02, -2.514e-02)); + r += mul(s1_6, M4(-1.656e-02, -2.670e-03, 9.453e-03, 7.954e-03, 3.160e-03, -2.335e-02, -8.001e-02, -1.985e-02, -7.616e-03, -1.240e-01, -3.496e-03, -2.135e-02, 1.189e-01, 2.478e-02, -6.627e-02, 1.809e-02)); + r += mul(s1_7, M4(-3.664e-02, 6.085e-02, 6.035e-02, -2.396e-02, 1.023e-01, -3.293e-02, 8.034e-02, -1.698e-03, -1.236e-01, 5.066e-02, 6.293e-02, -3.673e-02, 1.275e-01, -1.213e-01, 1.118e-01, -7.451e-03)); + r += mul(s1_8, M4(-9.346e-03, 5.860e-02, 1.267e-02, -1.551e-02, 8.045e-03, 2.738e-02, -7.751e-02, 1.061e-02, -2.387e-02, -5.766e-02, 3.055e-03, -3.948e-02, 2.559e-02, 5.561e-02, -5.830e-02, -3.382e-02)); + r += mul(s2_0, M4(-6.069e-02, 2.108e-02, 9.496e-03, -1.872e-02, 1.233e-01, 5.139e-02, 9.632e-03, -2.231e-03, -1.803e-02, 1.978e-02, 5.600e-02, 3.702e-02, 2.384e-01, 3.441e-02, -8.479e-03, 1.096e-01)); + r += mul(s2_1, M4(3.898e-03, 2.343e-02, 7.591e-03, -3.634e-02, 9.175e-02, 1.232e-02, 9.339e-02, -1.427e-02, 1.635e-02, 3.624e-02, 5.380e-03, 3.340e-02, 5.886e-02, -6.395e-02, 3.795e-02, -1.333e-01)); + r += mul(s2_2, M4(-1.586e-02, 1.043e-02, -6.155e-03, -1.137e-02, 1.116e-02, -9.468e-03, 1.350e-02, -1.687e-02, 2.759e-02, 2.010e-02, 5.078e-02, 1.777e-02, -4.099e-02, -1.848e-02, -7.351e-03, -5.972e-02)); + r += mul(s2_3, M4(4.117e-02, -3.596e-02, -3.002e-02, 5.303e-02, -1.739e-01, -2.256e-01, 2.088e-02, -4.490e-02, 6.632e-02, -1.533e-02, -5.606e-03, -8.215e-03, -1.793e-01, -2.532e-01, -1.841e-01, 1.767e-01)); + r += mul(s2_4, M4(-9.474e-03, 1.164e-02, 1.225e-01, 8.000e-02, -2.243e-01, -1.921e-02, -1.794e-01, 1.990e-01, 2.374e-02, 2.428e-02, -6.996e-02, -3.162e-02, 3.179e-01, -3.472e-01, 1.488e-01, 1.717e-01)); + r += mul(s2_5, M4(2.778e-02, -1.627e-04, 3.268e-02, -3.187e-03, -2.008e-02, -8.358e-02, 9.114e-02, -5.115e-02, 2.025e-03, 1.126e-02, -1.056e-02, -3.162e-02, 5.090e-03, -1.149e-02, 2.072e-02, 2.220e-02)); + r += mul(s2_6, M4(-3.461e-02, 5.308e-02, 5.725e-02, -9.231e-03, -2.192e-02, 1.419e-01, -4.842e-02, 1.155e-01, -2.410e-02, -3.985e-02, 3.458e-02, -2.689e-02, 3.019e-02, 4.427e-02, 1.272e-01, 1.810e-01)); + r += mul(s2_7, M4(-8.477e-03, -6.933e-04, -1.920e-02, -2.858e-03, -2.798e-03, -1.307e-01, -2.007e-02, -5.314e-02, -1.314e-01, 7.247e-03, -1.472e-01, -5.190e-02, 1.460e-02, -1.797e-01, -3.916e-01, 1.581e-01)); + r += mul(s2_8, M4(-8.492e-03, -1.268e-02, -4.747e-02, -1.358e-02, -9.552e-03, 2.001e-02, 2.676e-02, -3.251e-03, -1.836e-02, 1.053e-02, -3.311e-02, -1.412e-02, -8.262e-04, -2.533e-01, 4.093e-02, 4.769e-02)); + r += mul(s3_0, M4(-1.965e-01, 1.753e-01, -2.753e-02, 5.399e-02, 1.293e-01, 4.383e-02, 9.391e-02, -4.703e-03, 1.665e-02, -1.957e-02, 3.671e-02, 5.154e-02, 1.635e-02, -5.094e-02, -6.182e-04, 1.959e-02)); + r += mul(s3_1, M4(-1.850e-03, 2.078e-01, 1.834e-02, 7.289e-02, 4.926e-02, 5.169e-03, 6.260e-03, -3.841e-02, -3.082e-02, 6.279e-02, -7.108e-02, 5.052e-02, -9.217e-03, 1.371e-02, 2.197e-03, 2.179e-02)); + r += mul(s3_2, M4(-5.101e-02, 4.943e-02, -7.672e-03, -5.337e-02, 1.374e-02, -4.443e-02, 6.857e-03, -1.739e-02, -1.378e-02, 1.933e-02, -6.228e-02, -6.243e-02, -6.422e-03, 5.847e-02, 1.756e-02, 4.110e-03)); + r += mul(s3_3, M4(8.184e-02, 2.246e-02, 3.377e-02, -3.316e-02, -9.441e-02, -1.048e-01, 6.579e-02, -2.111e-02, 3.701e-01, 6.567e-02, -2.069e-01, 1.831e-01, 7.971e-02, -6.782e-03, -1.376e-02, 5.703e-02)); + r += mul(s3_4, M4(4.998e-02, 2.069e-01, -4.661e-03, 1.201e-01, -1.860e-01, 4.666e-02, -2.778e-01, 5.755e-02, 6.265e-02, 1.730e-02, 1.673e-02, -1.287e-01, 5.509e-02, -5.944e-02, 6.826e-02, -7.650e-02)); + r += mul(s3_5, M4(3.328e-03, 4.624e-02, 7.487e-02, 1.406e-02, -3.831e-02, -8.897e-02, -6.237e-03, 1.329e-02, 7.446e-02, -6.956e-02, -4.222e-02, -1.347e-01, -2.057e-02, -6.899e-02, -4.685e-02, -5.832e-03)); + r += mul(s3_6, M4(-2.618e-02, 4.749e-02, 5.444e-02, -4.484e-04, -6.652e-02, -4.663e-02, 2.784e-02, 4.574e-03, -5.196e-02, -3.805e-02, -3.152e-02, -8.233e-02, 1.077e-02, -4.890e-02, -1.679e-02, -3.505e-02)); + r += mul(s3_7, M4(-4.617e-02, -7.254e-02, 3.598e-03, 2.800e-02, -1.499e-02, -9.795e-03, 2.029e-02, -7.912e-02, 2.532e-02, -1.790e-01, -3.266e-01, -4.014e-01, 8.254e-02, -1.687e-03, -4.668e-02, -1.094e-02)); + r += mul(s3_8, M4(1.320e-03, 4.325e-02, -5.827e-02, -4.300e-02, 4.556e-04, 2.221e-02, -2.681e-02, 7.054e-02, -2.948e-02, 2.460e-01, -2.830e-01, -1.085e-01, 4.318e-02, 3.407e-03, -3.434e-02, -1.976e-02)); + r += mul(s4_0, M4(1.460e-01, 4.754e-02, 1.399e-01, -1.620e-02, -3.993e-02, -3.515e-02, 2.831e-02, -1.404e-02, -3.676e-02, -2.850e-02, 1.493e-02, 2.536e-02, -5.705e-02, -7.211e-02, -2.649e-03, 5.163e-02)); + r += mul(s4_1, M4(6.518e-02, -6.099e-02, 4.237e-02, -8.836e-02, -7.260e-02, 2.330e-02, -1.394e-02, -1.646e-03, 3.951e-02, -1.861e-02, 6.994e-03, -2.942e-02, -5.052e-02, -3.522e-02, -8.298e-02, 3.180e-02)); + r += mul(s4_2, M4(2.823e-02, 3.593e-02, -3.280e-02, -5.109e-02, -2.827e-02, 1.401e-02, -6.206e-02, 4.539e-02, 1.991e-02, -1.716e-02, 2.243e-02, -2.297e-02, 2.695e-02, -1.056e-02, 3.035e-03, -2.991e-02)); + r += mul(s4_3, M4(2.547e-02, -5.687e-03, -2.042e-02, -9.337e-02, 3.524e-02, -1.397e-02, -3.742e-02, 1.454e-02, 7.672e-02, 3.066e-02, -3.199e-02, 2.233e-02, -5.170e-02, 5.818e-02, -2.007e-02, 4.057e-02)); + r += mul(s4_4, M4(-2.283e-01, 2.457e-01, -3.105e-01, -3.668e-02, 3.219e-02, -1.147e-01, -9.497e-02, -7.666e-02, 6.047e-02, -6.299e-03, 7.590e-02, -1.044e-01, -4.754e-04, -5.665e-02, -2.808e-02, -9.255e-02)); + r += mul(s4_5, M4(5.215e-02, 1.923e-01, 1.238e-01, -7.348e-02, -6.519e-02, -3.306e-02, -9.314e-02, 1.386e-01, 7.793e-03, 4.899e-02, 1.845e-02, -5.812e-02, 2.268e-02, -9.544e-03, -2.321e-02, -2.858e-02)); + r += mul(s4_6, M4(6.982e-03, -1.007e-01, 2.938e-02, -4.167e-02, 8.572e-02, 7.508e-03, -5.352e-02, -2.551e-02, 1.916e-02, -8.421e-02, -4.458e-03, -4.428e-02, 3.794e-02, -5.348e-02, -6.604e-02, -2.357e-02)); + r += mul(s4_7, M4(-3.960e-02, 1.965e-01, -1.140e-01, 2.182e-02, 1.082e-01, 6.102e-02, 6.258e-02, 5.545e-02, 1.849e-02, 9.835e-03, -1.410e-02, -2.211e-02, 3.209e-02, 2.958e-02, 6.653e-03, 3.695e-02)); + r += mul(s4_8, M4(-2.179e-02, -1.401e-03, 1.264e-02, 3.296e-02, 5.442e-03, -6.132e-02, 7.208e-02, 5.353e-02, -1.661e-02, 4.773e-02, -4.191e-02, 3.883e-03, -1.001e-02, -2.729e-02, -2.561e-02, -1.567e-03)); + r += mul(s5_0, M4(1.510e-02, -4.602e-02, 6.757e-02, 1.657e-02, -1.036e-01, 9.565e-02, -3.068e-03, 2.594e-02, 1.073e-02, 7.805e-03, -3.369e-02, -9.184e-03, 2.529e-02, -3.586e-02, 8.693e-02, 7.147e-04)); + r += mul(s5_1, M4(-6.905e-02, 2.315e-02, -3.566e-02, 1.506e-02, 2.833e-02, 6.089e-02, 1.761e-02, -1.660e-03, -8.523e-02, -5.831e-02, 3.955e-02, -1.125e-01, 3.922e-02, -1.963e-02, 3.167e-03, -9.310e-02)); + r += mul(s5_2, M4(1.307e-02, -4.174e-02, -2.938e-02, -2.647e-02, -3.047e-02, -7.772e-02, -2.001e-02, -3.471e-02, -6.911e-02, 7.078e-02, -1.451e-01, 2.392e-02, 6.754e-02, 1.151e-02, 1.840e-02, -2.239e-02)); + r += mul(s5_3, M4(-5.393e-03, -8.862e-02, 3.511e-02, -4.368e-02, 1.822e-01, -3.408e-02, -3.088e-02, 7.301e-02, 1.169e-02, -3.817e-02, 4.264e-03, -7.837e-02, -3.082e-02, 2.524e-02, 2.682e-02, -1.838e-02)); + r += mul(s5_4, M4(-2.514e-02, -2.609e-02, -7.041e-02, -9.363e-02, -4.125e-02, -8.346e-03, -2.117e-01, -7.318e-02, -1.934e-01, 2.920e-01, 3.854e-02, -2.982e-01, -1.804e-01, 2.558e-02, 1.561e-03, -4.694e-02)); + r += mul(s5_5, M4(-6.437e-02, 2.093e-01, -5.823e-02, 2.168e-02, 4.195e-02, 2.039e-01, 1.491e-01, -4.014e-02, 2.835e-03, -3.487e-02, -6.809e-02, -4.941e-02, -1.088e-02, -3.818e-02, 1.212e-03, 1.173e-02)); + r += mul(s5_6, M4(5.244e-02, 5.221e-02, -3.623e-02, 1.452e-02, -3.438e-02, 2.158e-02, 6.116e-02, 1.669e-02, -3.513e-03, -2.530e-02, -2.136e-02, -2.934e-02, 9.833e-02, 8.911e-02, -7.366e-02, 2.772e-02)); + r += mul(s5_7, M4(1.158e-02, -7.909e-02, 1.344e-02, 6.564e-03, 1.432e-01, 2.081e-01, -6.528e-02, -4.952e-03, -2.150e-02, 4.520e-02, -1.310e-01, -1.048e-01, 9.828e-02, -5.999e-03, 2.218e-02, 4.271e-02)); + r += mul(s5_8, M4(9.263e-03, -3.699e-02, -2.887e-02, 4.434e-02, 2.098e-02, -3.306e-02, 2.391e-02, 4.590e-04, -3.066e-02, 4.501e-02, 4.998e-02, -1.248e-02, 2.164e-02, 1.734e-02, -7.385e-02, -6.176e-02)); + r += mul(s6_0, M4(-1.200e-01, -6.541e-03, 1.621e-02, -2.429e-02, 1.346e-01, -4.731e-02, -6.673e-02, 8.000e-02, 3.600e-03, 2.747e-02, -4.569e-02, -1.495e-02, -3.311e-02, 2.682e-02, -1.057e-01, 1.090e-01)); + r += mul(s6_1, M4(-7.507e-02, 7.104e-02, 9.247e-03, -4.609e-02, -4.729e-03, -1.940e-01, 1.531e-01, -1.360e-01, 7.056e-02, 8.330e-02, -1.045e-02, -2.090e-03, -4.943e-02, -2.803e-02, 6.241e-02, -3.123e-02)); + r += mul(s6_2, M4(-4.705e-03, -4.333e-02, 6.813e-02, -3.971e-02, -3.500e-02, 5.215e-03, -1.209e-01, -4.852e-02, -2.663e-02, -5.876e-02, -3.687e-02, -2.737e-02, 9.777e-03, -6.370e-02, 7.566e-02, -9.757e-03)); + r += mul(s6_3, M4(-3.344e-02, 2.399e-02, -5.442e-02, -2.422e-03, -1.279e-01, 9.236e-02, 8.630e-02, -1.518e-02, 6.253e-02, -6.975e-02, -2.661e-04, -1.602e-02, 1.586e-02, 2.887e-02, 6.045e-02, 3.503e-02)); + r += mul(s6_4, M4(4.011e-02, 2.552e-02, -3.967e-02, -7.582e-02, -2.794e-01, 1.229e-02, -4.513e-01, 2.350e-02, 1.524e-02, -1.563e-01, 4.062e-02, -3.018e-01, 1.119e-01, 1.427e-01, 1.185e-01, 3.546e-01)); + r += mul(s6_5, M4(-4.893e-02, 2.692e-02, -3.284e-02, 1.005e-01, -4.720e-02, 3.716e-02, -6.935e-03, 1.084e-01, -7.848e-03, 5.418e-02, -3.424e-02, 2.442e-02, 1.865e-02, 1.802e-01, 2.675e-02, -8.322e-03)); + r += mul(s6_6, M4(-2.785e-02, -2.571e-02, -1.216e-02, -6.150e-03, -1.060e-01, 3.524e-02, -2.086e-02, 5.807e-02, -3.918e-02, 8.613e-03, 6.152e-04, -6.108e-02, -5.372e-02, 2.802e-02, 8.226e-02, 2.973e-02)); + r += mul(s6_7, M4(-4.775e-02, 5.714e-02, 3.044e-03, 3.925e-02, -1.426e-02, 4.745e-02, -3.258e-02, 7.909e-02, -9.992e-02, 3.526e-02, -1.658e-01, -9.226e-04, -1.165e-01, 5.208e-02, -6.919e-03, 5.177e-02)); + r += mul(s6_8, M4(-2.796e-02, -7.841e-03, -2.497e-02, -1.530e-02, 1.059e-02, -4.475e-02, -4.364e-02, -2.307e-02, -4.266e-03, -4.323e-02, -5.765e-02, 3.223e-02, -5.482e-02, 4.946e-02, 3.526e-02, 3.115e-03)); + r += mul(s7_0, M4(-2.466e-02, -1.719e-03, 3.801e-02, 1.752e-02, -3.110e-03, -4.578e-02, -4.427e-02, 1.854e-03, 1.912e-02, -5.210e-02, -8.798e-03, 1.338e-02, -5.674e-02, 4.983e-02, -1.342e-02, -2.986e-02)); + r += mul(s7_1, M4(-6.462e-02, -3.351e-02, -4.126e-02, -1.354e-02, 2.871e-02, -5.572e-02, 6.581e-02, -2.789e-02, -1.171e-02, 1.881e-01, -6.108e-02, 5.253e-02, 7.739e-02, 4.354e-04, 1.759e-02, 3.710e-02)); + r += mul(s7_2, M4(-2.664e-02, 9.902e-03, -1.423e-02, -2.955e-03, -2.286e-02, 7.444e-03, -4.907e-02, -1.944e-02, 1.294e-02, -6.049e-02, 4.284e-02, 3.838e-02, -2.826e-02, 2.839e-02, -1.008e-01, 1.964e-02)); + r += mul(s7_3, M4(-2.754e-02, 1.341e-02, -1.052e-02, 2.319e-03, -4.675e-02, 1.518e-02, 1.005e-01, -4.150e-02, 1.854e-02, -5.684e-02, -3.610e-02, -1.013e-02, -2.374e-02, 1.913e-02, 7.706e-02, 7.259e-04)); + r += mul(s7_4, M4(-1.687e-02, 2.132e-02, -9.203e-02, -1.918e-02, -1.380e-01, 1.196e-01, 8.180e-03, -4.208e-02, 2.657e-02, -2.285e-02, -8.182e-02, -2.380e-01, -2.184e-02, 7.319e-02, -1.213e-01, 6.137e-02)); + r += mul(s7_5, M4(4.043e-02, -1.381e-02, -6.284e-03, 3.607e-02, 5.081e-03, 2.861e-02, -6.638e-02, 5.004e-02, -3.729e-02, -6.326e-02, -2.281e-02, -1.070e-02, -1.072e-02, -2.321e-02, 1.644e-01, 7.287e-02)); + r += mul(s7_6, M4(3.375e-03, -2.589e-02, -2.995e-02, 1.989e-03, -5.787e-02, -1.684e-02, -4.837e-02, 1.978e-02, 1.767e-02, 4.527e-02, 1.354e-02, 7.828e-03, 5.698e-03, -2.555e-02, 1.943e-02, -8.800e-03)); + r += mul(s7_7, M4(-2.163e-02, -5.088e-05, -1.509e-03, 1.766e-02, -4.841e-02, 5.486e-02, -5.015e-02, 2.485e-02, -8.226e-02, -1.765e-01, 4.477e-04, -6.773e-02, -4.923e-02, 5.172e-02, 8.718e-03, 3.181e-02)); + r += mul(s7_8, M4(-6.163e-02, 3.111e-02, -1.483e-02, -6.322e-02, -3.006e-02, -6.286e-02, -1.226e-03, -1.081e-03, -4.795e-03, 1.847e-02, -5.359e-02, -3.331e-02, -1.364e-02, -1.835e-02, -2.644e-02, -3.180e-02)); + r += V4(-1.572e-03, -2.868e-03, -4.500e-03, -2.959e-03); + return r; +} + +V4 f3(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(7.549e-03, 5.841e-03, 3.577e-02, -6.203e-02, 1.483e-02, -1.774e-02, -3.494e-04, 1.253e-01, 5.410e-02, 3.787e-02, -8.517e-03, -1.559e-02, -2.618e-02, 1.766e-02, 7.876e-02, -1.753e-01)); + r += mul(s0_1, M4(-3.639e-03, -6.624e-02, -1.868e-02, -7.252e-02, 4.951e-03, -2.230e-02, 5.442e-02, 4.589e-02, 2.376e-01, -2.639e-02, -3.136e-02, 1.902e-01, 9.939e-02, 7.555e-02, -3.844e-02, -1.404e-01)); + r += mul(s0_2, M4(1.508e-02, 3.310e-02, -2.113e-02, 3.406e-02, -2.882e-02, -5.043e-02, -2.153e-02, 2.604e-02, -2.178e-02, 8.144e-02, 1.316e-01, 1.140e-01, 3.774e-02, 2.014e-02, 5.501e-02, 4.149e-03)); + r += mul(s0_3, M4(5.904e-02, -4.471e-02, -1.419e-03, 5.577e-02, 2.097e-02, 2.939e-02, 4.351e-02, 7.017e-03, -1.220e-01, -2.561e-02, -7.143e-02, -6.226e-02, -2.383e-02, -8.104e-03, 1.235e-01, -5.604e-02)); + r += mul(s0_4, M4(9.289e-02, 1.875e-02, -5.693e-02, 8.472e-02, 2.723e-02, -8.247e-02, 2.351e-02, -1.478e-01, 3.210e-01, -4.399e-03, -2.030e-01, -6.583e-02, -2.577e-01, 6.970e-02, -1.362e-01, -3.662e-01)); + r += mul(s0_5, M4(6.788e-02, 1.481e-01, 1.110e-01, 8.451e-02, 1.231e-01, -5.248e-02, 4.599e-02, -7.866e-02, 6.980e-02, 1.021e-01, -1.467e-02, -2.085e-01, -7.291e-02, -7.495e-02, -6.751e-02, -7.518e-02)); + r += mul(s0_6, M4(2.776e-02, -4.853e-03, 1.438e-02, -1.960e-02, 2.142e-02, 6.762e-03, -1.021e-02, 1.000e-02, 1.683e-02, 1.249e-01, 1.405e-02, 3.261e-02, 3.420e-02, 9.142e-03, 9.864e-02, 1.273e-01)); + r += mul(s0_7, M4(3.249e-03, 1.042e-02, -1.446e-01, 2.937e-02, 2.885e-02, -1.655e-01, -2.498e-01, 1.184e-01, -7.952e-02, -4.997e-02, -8.814e-02, 8.800e-02, -4.362e-02, -4.499e-02, 2.033e-01, -1.495e-02)); + r += mul(s0_8, M4(-3.336e-02, -9.648e-03, -3.515e-02, -2.298e-02, 1.141e-02, 6.649e-02, 6.324e-02, 1.812e-02, -7.799e-02, 3.529e-02, 2.367e-01, 7.042e-03, 4.538e-02, 1.188e-01, 2.026e-01, 3.327e-02)); + r += mul(s1_0, M4(6.094e-03, 3.831e-02, 2.601e-02, -5.651e-02, -1.984e-02, -8.521e-02, -3.315e-02, 2.927e-02, 9.320e-02, 3.414e-02, 1.526e-02, -6.515e-02, 1.464e-02, 5.190e-02, 1.250e-02, -2.450e-02)); + r += mul(s1_1, M4(-6.664e-02, 2.427e-02, -4.062e-02, -1.023e-01, 1.142e-03, 1.598e-02, 6.027e-02, 7.189e-02, 1.110e-01, -1.270e-01, -1.238e-01, -7.045e-03, -5.579e-02, -4.261e-02, -5.511e-02, 1.607e-01)); + r += mul(s1_2, M4(-4.784e-02, 4.332e-02, 4.622e-02, -1.832e-01, 2.271e-03, -2.586e-02, -4.214e-04, -2.251e-02, 1.093e-01, 2.737e-02, 5.186e-02, -2.277e-02, 4.190e-02, -3.350e-02, 7.191e-02, 5.261e-02)); + r += mul(s1_3, M4(-7.808e-02, 6.345e-03, 2.821e-02, -6.509e-02, -4.562e-02, -7.348e-02, -2.062e-02, -1.096e-01, -6.326e-02, 1.541e-02, 1.495e-01, -1.246e-01, 4.181e-02, -3.568e-02, -5.511e-02, -9.366e-02)); + r += mul(s1_4, M4(-4.934e-02, 9.367e-02, 3.998e-02, 1.580e-02, 7.092e-02, -2.118e-02, -5.418e-02, -2.437e-01, 3.455e-01, 3.027e-01, -1.929e-01, -7.602e-02, -2.531e-01, 1.413e-01, 3.251e-02, -3.941e-01)); + r += mul(s1_5, M4(8.890e-03, 8.483e-02, 2.803e-01, 6.689e-02, -1.312e-02, 6.201e-03, 6.569e-02, -4.399e-02, -2.803e-02, -6.854e-02, 4.189e-03, -1.196e-01, -2.446e-02, -1.737e-02, -1.135e-02, -8.770e-02)); + r += mul(s1_6, M4(-1.025e-02, 7.595e-02, -3.784e-02, -1.273e-03, 1.642e-03, -2.167e-02, 1.115e-01, 1.739e-02, 1.468e-02, 4.380e-02, -7.158e-03, 6.610e-02, -1.724e-02, 6.816e-02, -3.586e-02, 7.312e-02)); + r += mul(s1_7, M4(1.537e-02, 5.858e-02, -1.293e-02, 5.912e-03, 1.436e-02, -1.255e-01, -1.164e-01, 5.451e-02, -1.606e-02, 7.959e-02, -1.098e-01, 2.954e-02, 3.584e-02, 1.064e-01, 4.900e-02, 1.483e-01)); + r += mul(s1_8, M4(-4.516e-02, -1.848e-02, -4.929e-02, -5.298e-02, -1.838e-02, 5.770e-02, 2.665e-01, -1.645e-02, -1.324e-02, -3.306e-02, 2.753e-01, -6.406e-02, 1.989e-02, 6.731e-02, 4.207e-02, 5.124e-02)); + r += mul(s2_0, M4(8.669e-03, -4.284e-02, -5.007e-02, 1.656e-02, -5.270e-02, 3.006e-02, 6.241e-02, -6.480e-02, 4.663e-02, -2.888e-02, -5.864e-03, 2.422e-02, -5.882e-02, 4.813e-02, 4.304e-02, -8.405e-02)); + r += mul(s2_1, M4(2.559e-02, 1.371e-02, 7.386e-03, -1.152e-01, -4.218e-02, 2.676e-02, -1.053e-03, 2.170e-01, 5.879e-03, 2.691e-02, 2.323e-02, 2.206e-03, 4.784e-02, -1.199e-01, -4.400e-02, -2.469e-01)); + r += mul(s2_2, M4(1.379e-02, 4.408e-02, -5.730e-03, -5.580e-02, 2.329e-02, -1.601e-02, -9.255e-02, 9.784e-02, 3.808e-02, -2.988e-02, 1.248e-02, -1.850e-02, 1.154e-01, 1.170e-01, 4.576e-02, -1.395e-01)); + r += mul(s2_3, M4(8.206e-02, -3.295e-02, 2.331e-02, 7.162e-02, 1.918e-01, -1.477e-01, -1.075e-01, 7.347e-02, -1.932e-02, -5.538e-02, -2.213e-02, 1.610e-02, -4.277e-03, 8.670e-02, 1.180e-01, 1.101e-01)); + r += mul(s2_4, M4(-1.037e-01, 3.606e-02, -3.500e-03, -4.871e-02, 3.480e-02, 3.394e-01, 2.708e-01, -8.373e-02, 1.522e-02, -3.404e-02, 3.080e-02, -1.670e-02, 2.218e-01, 1.636e-01, 1.746e-01, 1.966e-01)); + r += mul(s2_5, M4(-5.810e-02, -1.016e-01, -1.705e-02, 4.430e-02, -1.122e-01, 4.012e-02, -7.739e-02, 1.988e-02, -7.404e-02, 1.663e-03, -4.575e-02, 6.022e-02, 2.325e-01, 2.560e-01, 1.496e-01, 1.737e-01)); + r += mul(s2_6, M4(-3.489e-02, -7.750e-03, 3.257e-02, -6.685e-02, -2.556e-02, -6.975e-02, -7.688e-02, -6.276e-02, 3.238e-02, -6.852e-03, 8.972e-04, 4.346e-02, -4.617e-02, -7.906e-02, -1.260e-01, -2.206e-01)); + r += mul(s2_7, M4(-7.169e-02, -1.108e-01, -7.025e-02, -4.756e-02, -1.275e-03, 5.717e-02, 1.381e-02, -4.280e-02, -7.935e-02, 8.469e-02, 2.669e-02, -4.783e-02, -6.415e-02, -7.410e-02, -5.996e-01, -7.421e-02)); + r += mul(s2_8, M4(5.732e-02, -2.094e-02, 4.487e-02, 1.684e-03, 3.583e-02, 6.555e-02, -9.093e-02, 2.819e-02, 3.207e-02, 2.379e-02, -7.058e-02, 3.650e-02, 7.129e-02, 8.081e-02, -2.055e-01, 2.068e-02)); + r += mul(s3_0, M4(-1.351e-01, 2.487e-02, 6.509e-02, -1.377e-01, -7.213e-02, 4.431e-02, 6.395e-02, -2.582e-02, 2.499e-02, 2.643e-02, -5.115e-02, -4.884e-02, 3.498e-02, -4.305e-02, -2.118e-02, 3.186e-02)); + r += mul(s3_1, M4(3.457e-02, 9.418e-02, -9.542e-02, 1.424e-02, -4.137e-02, 3.093e-02, -1.165e-01, 2.549e-01, 8.566e-02, -4.637e-02, -1.015e-01, -7.352e-02, 9.651e-02, -9.373e-03, -3.242e-02, -1.090e-01)); + r += mul(s3_2, M4(-3.211e-02, 6.423e-02, -3.871e-02, -1.077e-01, -2.926e-02, 4.379e-02, -1.110e-02, 3.742e-02, 4.095e-02, 2.133e-03, 5.670e-02, 6.495e-03, 2.460e-03, -1.015e-02, 1.909e-02, -2.733e-02)); + r += mul(s3_3, M4(1.325e-01, -4.033e-02, -7.704e-02, 1.749e-02, 3.448e-02, 8.126e-03, -1.382e-01, 7.792e-02, -1.686e-01, 1.118e-01, 9.789e-02, 8.128e-02, 1.519e-02, -3.246e-02, 3.822e-02, 1.307e-02)); + r += mul(s3_4, M4(-2.686e-01, -1.360e-01, -2.257e-01, -1.253e-01, 1.299e-01, 3.730e-01, 5.186e-03, 4.527e-02, 5.434e-02, -3.687e-01, -7.868e-02, -2.339e-01, -5.053e-02, -1.593e-02, -1.770e-02, 7.165e-03)); + r += mul(s3_5, M4(-1.215e-01, -4.649e-02, -7.364e-02, 9.947e-03, -6.909e-02, 5.499e-02, -5.504e-02, 3.746e-02, -1.890e-01, 3.576e-02, 8.347e-02, 8.117e-02, 6.363e-02, 8.396e-03, 2.059e-02, -4.964e-02)); + r += mul(s3_6, M4(-3.645e-02, -1.210e-02, 2.680e-02, -2.743e-02, 6.655e-02, -3.608e-02, -9.769e-02, -5.215e-02, -7.768e-02, 8.398e-02, 3.276e-01, 2.325e-02, 4.869e-02, 8.209e-03, -3.908e-02, 5.922e-02)); + r += mul(s3_7, M4(-1.293e-03, 2.624e-02, -1.241e-01, 4.513e-02, -6.860e-02, -1.391e-02, -1.504e-01, -9.386e-02, 6.850e-02, -1.116e-02, -2.939e-01, 1.790e-01, 2.221e-02, -3.076e-02, -1.267e-01, 3.525e-03)); + r += mul(s3_8, M4(5.885e-02, 4.716e-02, 1.394e-01, -9.032e-03, 9.534e-03, -2.841e-04, -2.279e-01, 5.041e-02, 9.390e-02, 1.978e-01, 2.290e-01, 6.311e-02, 1.709e-02, -2.264e-02, 6.404e-03, 5.286e-02)); + r += mul(s4_0, M4(-3.989e-02, 1.043e-01, 2.167e-02, -4.671e-02, 1.772e-02, 2.149e-02, -4.354e-02, 2.864e-02, 3.404e-02, 8.198e-03, -3.285e-02, 4.617e-02, 5.805e-02, -9.201e-02, -9.894e-02, 6.796e-02)); + r += mul(s4_1, M4(-1.147e-01, 2.413e-02, -4.551e-02, -4.119e-02, -5.651e-02, 3.723e-02, 8.087e-02, -8.765e-02, 6.067e-02, 3.875e-02, -3.697e-02, -2.072e-02, 8.575e-02, -5.648e-03, 2.253e-03, -1.111e-02)); + r += mul(s4_2, M4(2.399e-02, 1.158e-02, 8.217e-03, -8.103e-03, 4.760e-04, 2.772e-02, -5.089e-02, 1.294e-02, 2.670e-02, -7.396e-03, 3.874e-02, -1.791e-03, -1.335e-02, 3.958e-03, 6.292e-02, 3.807e-02)); + r += mul(s4_3, M4(-5.314e-02, 1.613e-01, -6.274e-02, 3.254e-02, -2.636e-02, 7.294e-02, 1.556e-01, -1.084e-01, -1.058e-01, 6.138e-02, -2.246e-02, -1.212e-01, 5.899e-02, -9.672e-02, -6.812e-03, -2.475e-02)); + r += mul(s4_4, M4(7.112e-02, -5.885e-02, 3.622e-02, 1.856e-01, 2.469e-01, -1.692e-01, -3.037e-01, 2.660e-02, -1.142e-01, 8.413e-02, -5.529e-02, -6.762e-02, -5.900e-02, -7.882e-02, -3.681e-02, -5.285e-02)); + r += mul(s4_5, M4(-1.528e-01, -6.756e-03, -1.334e-01, 1.072e-01, 1.372e-01, -7.455e-04, 8.798e-02, -1.432e-01, -4.227e-02, 4.008e-02, -3.368e-03, 1.463e-03, 7.924e-02, 5.418e-02, 1.207e-01, 4.361e-02)); + r += mul(s4_6, M4(9.618e-02, -3.959e-02, -1.578e-01, 1.450e-02, 1.987e-02, -7.605e-03, -2.451e-02, 3.678e-02, 7.314e-02, 2.967e-02, 7.232e-02, 8.189e-02, 1.972e-02, -1.425e-02, -6.249e-02, 2.753e-02)); + r += mul(s4_7, M4(-7.886e-02, -7.267e-03, -4.764e-02, -1.432e-01, -6.068e-02, -1.336e-02, -7.154e-02, 2.613e-02, 4.865e-02, 8.846e-02, -5.496e-02, 3.770e-02, 1.078e-02, -4.761e-02, 4.391e-02, -3.580e-03)); + r += mul(s4_8, M4(-5.023e-02, 1.002e-01, -1.076e-01, -9.511e-02, -4.760e-02, -1.926e-03, -1.515e-02, -3.226e-02, 1.395e-02, 1.796e-02, 3.720e-02, 7.361e-03, -9.088e-03, -3.335e-02, 8.838e-03, -3.721e-02)); + r += mul(s5_0, M4(3.031e-02, 3.363e-02, 3.030e-03, 9.107e-02, -1.014e-01, -7.719e-03, 5.239e-02, -1.150e-02, 7.454e-03, -4.267e-02, -1.852e-02, -7.081e-03, 6.605e-02, -5.212e-02, 3.289e-02, 3.480e-02)); + r += mul(s5_1, M4(-2.654e-02, 4.664e-02, -7.637e-03, -3.020e-02, -2.783e-02, 1.532e-02, -4.592e-02, -1.898e-01, -9.555e-02, -8.444e-02, -7.414e-03, -3.203e-01, 3.379e-02, -2.939e-02, 6.682e-04, -9.268e-02)); + r += mul(s5_2, M4(-1.157e-01, 1.323e-02, -4.952e-02, 3.422e-02, -9.972e-02, -1.913e-02, 3.900e-02, -1.708e-02, 1.075e-01, -8.384e-02, 7.815e-02, -5.829e-02, 5.690e-02, -8.337e-02, 7.177e-03, -2.996e-03)); + r += mul(s5_3, M4(4.825e-02, 2.533e-05, -9.939e-02, 2.553e-02, 7.429e-02, 2.843e-02, -4.936e-02, 7.694e-02, -3.963e-02, -2.134e-01, -9.395e-02, -1.557e-01, 8.082e-02, -2.030e-01, 2.238e-02, -4.166e-02)); + r += mul(s5_4, M4(1.793e-01, -1.955e-01, 4.245e-03, -3.467e-02, -1.411e-01, -8.908e-02, -2.465e-01, -1.062e-01, -1.475e-01, -1.815e-01, 2.231e-01, -2.141e-01, -8.714e-02, -1.863e-02, 8.106e-02, -1.652e-01)); + r += mul(s5_5, M4(-4.051e-02, 8.651e-02, 1.911e-02, -4.472e-02, -2.548e-02, 4.238e-03, 8.314e-02, 8.535e-04, -4.288e-02, 1.326e-02, -4.075e-02, -6.859e-02, -1.268e-02, -2.006e-03, 1.020e-01, -7.679e-03)); + r += mul(s5_6, M4(-2.600e-02, -5.874e-02, -6.383e-02, -4.344e-02, -7.475e-03, -8.672e-02, -2.676e-02, 1.682e-02, 1.675e-02, -8.346e-02, 2.572e-02, 4.356e-02, -8.300e-02, -7.561e-03, 1.339e-02, -1.199e-02)); + r += mul(s5_7, M4(-2.708e-02, -1.052e-02, 2.861e-01, 2.421e-02, -7.350e-02, 6.591e-02, -1.028e-01, 1.598e-02, -2.900e-03, -1.052e-01, 2.706e-01, 3.259e-02, -1.327e-02, 1.789e-02, -3.740e-02, 9.238e-03)); + r += mul(s5_8, M4(-4.033e-03, 5.990e-02, -4.944e-02, -1.359e-02, 3.455e-02, 4.470e-03, 8.746e-02, -2.432e-02, -4.091e-02, -7.442e-02, -4.041e-02, 4.723e-02, 3.592e-02, 3.698e-02, -1.842e-02, -6.572e-02)); + r += mul(s6_0, M4(6.685e-03, 7.485e-02, -1.710e-02, 1.088e-02, 3.259e-02, -4.319e-03, -7.286e-02, 1.912e-01, -6.803e-02, 5.241e-02, 1.160e-01, -2.947e-02, -3.404e-02, -7.214e-02, -9.967e-02, 5.521e-03)); + r += mul(s6_1, M4(-2.227e-02, 1.553e-01, 3.670e-02, -3.572e-02, 2.372e-01, -1.481e-01, -2.047e-01, 2.490e-01, -3.064e-03, -6.818e-03, -4.601e-03, -8.369e-03, 4.889e-02, 2.389e-02, 2.834e-02, 1.179e-01)); + r += mul(s6_2, M4(1.370e-03, 2.922e-02, -8.196e-02, 3.682e-02, -1.510e-02, 1.928e-02, 8.079e-02, 4.465e-02, 1.874e-03, -2.775e-02, -3.510e-02, 1.074e-02, 1.147e-02, -3.479e-02, -8.156e-02, 7.632e-02)); + r += mul(s6_3, M4(-2.052e-02, 5.468e-02, 8.972e-02, 1.748e-02, 1.062e-02, -5.604e-02, -2.104e-02, -1.168e-01, -2.826e-02, 8.708e-02, -3.005e-02, 4.044e-02, 2.717e-03, -8.515e-02, -2.545e-02, 1.748e-02)); + r += mul(s6_4, M4(-3.675e-02, -7.230e-02, -1.514e-01, -6.986e-02, -2.293e-01, 1.193e-01, -1.353e-01, 3.926e-02, 4.473e-02, -8.426e-02, -5.745e-02, 2.172e-01, -1.196e-01, 3.766e-02, -1.090e-01, 2.146e-02)); + r += mul(s6_5, M4(-1.926e-02, 3.526e-02, -8.507e-03, 8.632e-02, -1.409e-02, 4.581e-03, -4.015e-02, -5.444e-03, 2.476e-03, -3.332e-03, 1.063e-01, 1.064e-02, 1.944e-02, -1.168e-02, -3.969e-02, 7.619e-02)); + r += mul(s6_6, M4(7.458e-02, -8.309e-04, 5.156e-02, 3.045e-02, -2.027e-02, 4.268e-02, -9.577e-02, -2.027e-02, 1.083e-02, -2.694e-02, -9.081e-02, -3.254e-02, 1.457e-02, 2.705e-02, -4.239e-02, -1.168e-02)); + r += mul(s6_7, M4(-1.551e-02, 1.555e-02, 3.333e-02, 1.551e-02, -2.358e-02, -1.985e-02, 5.884e-02, -2.825e-02, 2.197e-02, 1.169e-01, -4.803e-02, 8.349e-03, 2.392e-03, -2.082e-02, -3.377e-02, -4.084e-02)); + r += mul(s6_8, M4(6.048e-02, -3.139e-02, -3.140e-02, 4.238e-02, -7.827e-03, -5.632e-02, -3.971e-02, -2.092e-02, -1.757e-02, 2.497e-02, 9.934e-03, -1.906e-02, -6.897e-02, -6.564e-02, 3.216e-02, -5.010e-02)); + r += mul(s7_0, M4(3.706e-02, -3.405e-02, -3.631e-02, 4.191e-02, 8.408e-02, -7.818e-02, -4.613e-02, 8.811e-02, -4.304e-02, 8.061e-03, 2.657e-03, -1.014e-01, 3.056e-02, -6.020e-02, -7.336e-02, -1.122e-02)); + r += mul(s7_1, M4(1.492e-02, 3.068e-02, 4.643e-02, -4.821e-02, 5.475e-02, -3.932e-02, -1.925e-02, 1.088e-01, 7.003e-02, 1.456e-01, 6.545e-02, 1.387e-02, -4.953e-02, 6.606e-02, 8.140e-02, 1.567e-01)); + r += mul(s7_2, M4(3.314e-02, 2.750e-02, 6.535e-02, 2.061e-02, 5.650e-03, 7.274e-02, 6.622e-02, -3.237e-02, -2.759e-02, -3.971e-02, -9.094e-02, 6.809e-02, 1.583e-01, -4.280e-02, -1.262e-02, 2.825e-02)); + r += mul(s7_3, M4(1.734e-02, -8.997e-02, 5.895e-03, -3.471e-02, 5.080e-02, -2.903e-02, 6.595e-02, -2.016e-02, 5.886e-03, 1.329e-01, 2.321e-02, -3.734e-02, 2.672e-02, -4.128e-02, 3.937e-02, -5.398e-02)); + r += mul(s7_4, M4(-5.764e-02, -8.530e-03, -5.284e-03, 1.995e-02, -1.535e-01, -7.842e-02, 2.841e-01, 5.771e-02, -4.518e-01, -9.468e-02, -1.945e-01, -1.713e-02, -9.584e-02, -1.448e-01, 9.651e-02, -2.114e-01)); + r += mul(s7_5, M4(4.921e-02, -2.335e-02, 6.736e-03, 9.647e-02, 4.729e-02, -1.626e-01, 1.514e-02, 2.695e-02, 1.966e-02, 2.227e-03, 4.152e-02, -5.731e-02, -4.104e-02, -2.117e-01, -1.313e-01, 3.599e-02)); + r += mul(s7_6, M4(-2.224e-03, -5.215e-02, 8.148e-03, -1.054e-02, -2.011e-02, -7.110e-03, -4.378e-02, -4.554e-02, 1.837e-02, 2.168e-02, 6.596e-02, -3.392e-03, 3.671e-02, -2.368e-02, 7.803e-02, 2.117e-02)); + r += mul(s7_7, M4(5.059e-02, 5.411e-02, 1.153e-01, -2.684e-02, 2.687e-02, 2.498e-02, 1.224e-01, -5.599e-02, 1.326e-01, 5.794e-02, 1.564e-01, 6.672e-03, -2.287e-02, 7.290e-04, -5.060e-02, -1.173e-02)); + r += mul(s7_8, M4(1.739e-02, 1.692e-02, 7.444e-02, -9.690e-02, 2.404e-02, -5.695e-02, -8.741e-03, -4.248e-02, -1.166e-02, 3.177e-02, 3.432e-02, -4.448e-03, -4.017e-02, -1.342e-02, 8.129e-02, -4.351e-03)); + r += V4(3.523e-03, -8.447e-03, 2.570e-03, 6.650e-04); + return r; +} + +void Pass8(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = Rmp8x8(tid.x) + blockStart; + uint2 size = GetInputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = (gxy + 0.5) * pt; + + V4 s0_0 = l0(-1.0, -1.0); + V4 s0_1 = l0(0.0, -1.0); + V4 s0_2 = l0(1.0, -1.0); + V4 s0_3 = l0(-1.0, 0.0); + V4 s0_4 = l0(0.0, 0.0); + V4 s0_5 = l0(1.0, 0.0); + V4 s0_6 = l0(-1.0, 1.0); + V4 s0_7 = l0(0.0, 1.0); + V4 s0_8 = l0(1.0, 1.0); + V4 s1_0 = -max(-s0_0, 0.0); + V4 s1_1 = -max(-s0_1, 0.0); + V4 s1_2 = -max(-s0_2, 0.0); + V4 s1_3 = -max(-s0_3, 0.0); + V4 s1_4 = -max(-s0_4, 0.0); + V4 s1_5 = -max(-s0_5, 0.0); + V4 s1_6 = -max(-s0_6, 0.0); + V4 s1_7 = -max(-s0_7, 0.0); + V4 s1_8 = -max(-s0_8, 0.0); + s0_0 = max(s0_0, 0.0); + s0_1 = max(s0_1, 0.0); + s0_2 = max(s0_2, 0.0); + s0_3 = max(s0_3, 0.0); + s0_4 = max(s0_4, 0.0); + s0_5 = max(s0_5, 0.0); + s0_6 = max(s0_6, 0.0); + s0_7 = max(s0_7, 0.0); + s0_8 = max(s0_8, 0.0); + + V4 s2_0 = l1(-1.0, -1.0); + V4 s2_1 = l1(0.0, -1.0); + V4 s2_2 = l1(1.0, -1.0); + V4 s2_3 = l1(-1.0, 0.0); + V4 s2_4 = l1(0.0, 0.0); + V4 s2_5 = l1(1.0, 0.0); + V4 s2_6 = l1(-1.0, 1.0); + V4 s2_7 = l1(0.0, 1.0); + V4 s2_8 = l1(1.0, 1.0); + V4 s3_0 = -max(-s2_0, 0.0); + V4 s3_1 = -max(-s2_1, 0.0); + V4 s3_2 = -max(-s2_2, 0.0); + V4 s3_3 = -max(-s2_3, 0.0); + V4 s3_4 = -max(-s2_4, 0.0); + V4 s3_5 = -max(-s2_5, 0.0); + V4 s3_6 = -max(-s2_6, 0.0); + V4 s3_7 = -max(-s2_7, 0.0); + V4 s3_8 = -max(-s2_8, 0.0); + s2_0 = max(s2_0, 0.0); + s2_1 = max(s2_1, 0.0); + s2_2 = max(s2_2, 0.0); + s2_3 = max(s2_3, 0.0); + s2_4 = max(s2_4, 0.0); + s2_5 = max(s2_5, 0.0); + s2_6 = max(s2_6, 0.0); + s2_7 = max(s2_7, 0.0); + s2_8 = max(s2_8, 0.0); + + V4 s4_0 = l2(-1.0, -1.0); + V4 s4_1 = l2(0.0, -1.0); + V4 s4_2 = l2(1.0, -1.0); + V4 s4_3 = l2(-1.0, 0.0); + V4 s4_4 = l2(0.0, 0.0); + V4 s4_5 = l2(1.0, 0.0); + V4 s4_6 = l2(-1.0, 1.0); + V4 s4_7 = l2(0.0, 1.0); + V4 s4_8 = l2(1.0, 1.0); + V4 s5_0 = -max(-s4_0, 0.0); + V4 s5_1 = -max(-s4_1, 0.0); + V4 s5_2 = -max(-s4_2, 0.0); + V4 s5_3 = -max(-s4_3, 0.0); + V4 s5_4 = -max(-s4_4, 0.0); + V4 s5_5 = -max(-s4_5, 0.0); + V4 s5_6 = -max(-s4_6, 0.0); + V4 s5_7 = -max(-s4_7, 0.0); + V4 s5_8 = -max(-s4_8, 0.0); + s4_0 = max(s4_0, 0.0); + s4_1 = max(s4_1, 0.0); + s4_2 = max(s4_2, 0.0); + s4_3 = max(s4_3, 0.0); + s4_4 = max(s4_4, 0.0); + s4_5 = max(s4_5, 0.0); + s4_6 = max(s4_6, 0.0); + s4_7 = max(s4_7, 0.0); + s4_8 = max(s4_8, 0.0); + + V4 s6_0 = l3(-1.0, -1.0); + V4 s6_1 = l3(0.0, -1.0); + V4 s6_2 = l3(1.0, -1.0); + V4 s6_3 = l3(-1.0, 0.0); + V4 s6_4 = l3(0.0, 0.0); + V4 s6_5 = l3(1.0, 0.0); + V4 s6_6 = l3(-1.0, 1.0); + V4 s6_7 = l3(0.0, 1.0); + V4 s6_8 = l3(1.0, 1.0); + V4 s7_0 = -max(-s6_0, 0.0); + V4 s7_1 = -max(-s6_1, 0.0); + V4 s7_2 = -max(-s6_2, 0.0); + V4 s7_3 = -max(-s6_3, 0.0); + V4 s7_4 = -max(-s6_4, 0.0); + V4 s7_5 = -max(-s6_5, 0.0); + V4 s7_6 = -max(-s6_6, 0.0); + V4 s7_7 = -max(-s6_7, 0.0); + V4 s7_8 = -max(-s6_8, 0.0); + s6_0 = max(s6_0, 0.0); + s6_1 = max(s6_1, 0.0); + s6_2 = max(s6_2, 0.0); + s6_3 = max(s6_3, 0.0); + s6_4 = max(s6_4, 0.0); + s6_5 = max(s6_5, 0.0); + s6_6 = max(s6_6, 0.0); + s6_7 = max(s6_7, 0.0); + s6_8 = max(s6_8, 0.0); + + t4[gxy] = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t5[gxy] = f1(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t6[gxy] = f2(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t7[gxy] = f3(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); +} + +//!PASS 9 +//!DESC conv8 +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 +//!IN t4, t5, t6, t7 +//!OUT t0, t1, t2, t3 + +#define l0(x, y) V4(O(t4, float2(x, y))) +#define l1(x, y) V4(O(t5, float2(x, y))) +#define l2(x, y) V4(O(t6, float2(x, y))) +#define l3(x, y) V4(O(t7, float2(x, y))) + +V4 f0(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-1.163e-03, 3.758e-02, -1.293e-02, -1.812e-03, 1.047e-02, -1.221e-02, 1.272e-02, 3.990e-02, -3.764e-03, -8.226e-02, 3.142e-03, 2.449e-03, 5.394e-02, 4.200e-02, 3.250e-02, 2.179e-02)); + r += mul(s0_1, M4(-4.977e-02, 1.285e-02, 6.215e-03, 1.122e-03, 1.038e-01, 2.604e-02, -1.625e-03, 8.618e-02, 6.954e-02, -5.197e-02, -1.722e-02, -5.276e-02, -2.537e-02, -5.418e-03, -3.673e-02, -1.730e-02)); + r += mul(s0_2, M4(2.432e-02, -6.323e-02, 6.821e-03, -4.970e-04, 4.663e-02, 1.828e-02, 5.051e-03, -2.768e-02, 5.109e-02, 1.437e-02, -5.003e-02, 2.399e-02, 2.915e-02, 4.627e-03, -1.239e-02, 2.087e-02)); + r += mul(s0_3, M4(1.510e-02, -4.971e-02, 5.598e-03, -3.265e-04, 2.438e-02, 5.457e-02, 1.265e-02, 1.988e-02, -1.251e-02, 1.782e-02, -1.172e-02, -4.812e-02, 4.248e-02, 2.189e-02, 4.387e-02, -4.777e-02)); + r += mul(s0_4, M4(-2.666e-02, 5.312e-02, 3.600e-02, 3.440e-02, -5.164e-02, 1.049e-01, -8.496e-02, -8.078e-02, 1.077e-02, -2.606e-02, -3.434e-02, 1.633e-02, 1.834e-02, 3.657e-01, 1.811e-02, -1.689e-02)); + r += mul(s0_5, M4(1.503e-01, 5.142e-02, 3.078e-02, -2.233e-03, -3.540e-02, -7.650e-02, -5.646e-02, 6.509e-02, -5.972e-02, 9.989e-02, -7.630e-02, -4.226e-02, -1.713e-01, 1.778e-02, 2.337e-02, 5.412e-03)); + r += mul(s0_6, M4(1.487e-02, 1.589e-02, 1.909e-02, 2.397e-03, 8.638e-03, -5.430e-03, 1.950e-02, -4.088e-02, -3.951e-02, 8.155e-02, -4.656e-02, -4.532e-02, 5.799e-03, -3.091e-03, 7.556e-02, -9.244e-03)); + r += mul(s0_7, M4(-3.682e-03, 2.624e-02, 1.519e-02, 1.910e-02, -4.077e-02, -3.815e-02, 2.944e-01, -1.562e-02, 5.634e-02, -1.586e-02, -8.042e-02, 5.548e-02, 2.209e-02, 5.010e-04, -1.945e-01, -7.837e-02)); + r += mul(s0_8, M4(-4.235e-03, 7.396e-03, 3.855e-02, 2.943e-02, 3.392e-04, 2.840e-02, 4.555e-02, 3.071e-02, -2.447e-02, -2.686e-02, -1.474e-01, -1.236e-01, -4.732e-02, 2.316e-02, -1.916e-02, -2.356e-02)); + r += mul(s1_0, M4(-5.662e-02, -1.745e-02, -5.033e-03, -1.262e-02, -1.416e-02, -2.888e-02, -5.133e-03, 2.311e-02, -2.334e-02, 2.234e-02, 3.550e-02, -3.701e-02, 9.749e-03, 1.249e-02, 8.601e-03, 2.353e-02)); + r += mul(s1_1, M4(7.913e-02, 6.084e-02, -4.344e-02, 6.112e-02, 2.960e-02, 3.782e-02, -2.122e-02, 3.911e-02, 1.010e-01, -3.291e-02, -1.743e-02, 9.940e-02, -8.126e-02, -1.161e-02, -5.808e-02, -3.259e-02)); + r += mul(s1_2, M4(-1.213e-02, 1.115e-03, -3.606e-02, 1.455e-02, 1.664e-02, 1.329e-02, -2.419e-03, 8.746e-03, 2.372e-02, 9.913e-02, 1.971e-02, -4.579e-02, 9.815e-03, 4.292e-02, -1.999e-02, -1.893e-02)); + r += mul(s1_3, M4(-1.179e-02, -4.023e-02, -6.974e-03, 2.424e-02, 3.545e-02, 5.325e-02, -1.323e-02, 2.684e-02, -7.408e-03, 1.760e-02, 1.047e-01, -5.806e-03, 6.792e-03, -4.425e-02, -5.191e-02, -3.494e-02)); + r += mul(s1_4, M4(1.662e-01, -1.880e-01, -1.949e-02, -1.400e-01, -2.261e-02, 6.909e-02, -8.400e-02, -3.382e-02, -4.781e-02, 7.937e-02, 1.563e-01, -1.889e-01, 1.464e-01, -5.023e-02, -9.010e-02, 1.950e-01)); + r += mul(s1_5, M4(1.639e-01, -1.646e-01, -4.730e-03, 4.396e-02, -8.718e-02, -1.147e-01, -7.944e-02, 1.089e-02, 8.579e-02, 1.786e-01, -1.294e-01, 4.159e-02, -4.083e-01, -1.187e-01, 1.349e-03, 9.304e-02)); + r += mul(s1_6, M4(3.600e-03, 3.908e-02, 1.479e-01, 2.928e-02, 2.900e-02, 1.703e-02, 2.995e-02, -1.953e-02, -1.578e-02, 3.095e-03, -4.326e-03, 2.029e-02, -7.464e-04, 1.157e-02, 4.377e-02, -1.657e-02)); + r += mul(s1_7, M4(-1.218e-02, 1.004e-01, -1.666e-02, 2.707e-01, -7.272e-02, -6.441e-02, 1.782e-01, -3.960e-02, 1.067e-02, 1.358e-02, -8.120e-02, -9.335e-02, 7.539e-02, -4.229e-02, -1.822e-01, 8.759e-02)); + r += mul(s1_8, M4(-1.353e-01, 6.616e-02, -1.582e-01, -1.910e-02, 5.130e-02, 5.146e-02, 2.419e-04, 5.632e-03, 4.300e-02, -9.703e-02, -1.843e-01, -8.131e-02, -2.054e-01, 5.484e-02, 4.258e-02, 8.032e-02)); + r += mul(s2_0, M4(-1.443e-03, 1.266e-02, -4.377e-03, 1.456e-02, 9.075e-03, 3.822e-02, 1.862e-02, -8.763e-02, 3.358e-02, 3.704e-02, 5.637e-02, -1.078e-02, -5.603e-03, -8.833e-03, 6.170e-02, -3.101e-02)); + r += mul(s2_1, M4(-8.875e-03, -4.255e-02, -8.639e-03, -3.144e-02, 5.338e-02, 1.993e-02, -2.897e-02, -2.618e-02, -2.192e-02, -1.938e-02, 6.725e-02, 1.013e-02, -8.374e-02, 1.854e-01, 1.681e-01, 1.666e-01)); + r += mul(s2_2, M4(-3.852e-02, -1.331e-02, -8.824e-03, 1.680e-02, -9.953e-03, 4.866e-02, -2.119e-02, -2.544e-02, 1.733e-02, 8.523e-03, 5.700e-02, -2.003e-02, 1.287e-01, 8.605e-02, 3.843e-03, -3.362e-02)); + r += mul(s2_3, M4(-1.649e-02, -5.156e-02, 2.322e-02, 2.621e-02, -4.374e-03, -4.031e-02, 1.849e-02, -2.824e-02, 1.557e-02, -2.727e-02, 6.803e-02, 1.272e-02, -3.532e-02, 2.136e-02, -1.791e-02, -3.532e-02)); + r += mul(s2_4, M4(-1.233e-01, 1.773e-01, -1.449e-02, -1.111e-01, 1.522e-01, 5.892e-02, -7.358e-02, -2.490e-03, -7.480e-02, -9.953e-02, 4.489e-02, 5.109e-02, 9.398e-03, 1.778e-01, 5.933e-02, -1.200e-01)); + r += mul(s2_5, M4(4.894e-02, 6.952e-02, 1.113e-03, -3.899e-02, 1.489e-01, 2.495e-02, -5.650e-02, -2.200e-02, 3.888e-02, -5.917e-02, 5.631e-02, -5.648e-03, 4.334e-02, -1.391e-01, -1.235e-01, 1.303e-01)); + r += mul(s2_6, M4(-2.882e-02, -9.277e-04, 2.776e-02, 4.659e-03, -6.010e-03, 8.332e-03, 1.627e-02, 6.162e-03, 1.398e-02, 6.050e-04, 8.861e-02, 8.111e-03, -2.020e-02, -2.625e-02, -2.498e-02, 3.772e-02)); + r += mul(s2_7, M4(-2.603e-02, -4.788e-02, 1.212e-01, 2.412e-02, 1.096e-01, 6.875e-02, -4.077e-02, -2.471e-02, 1.411e-02, 2.778e-02, 2.659e-02, -7.912e-03, 2.304e-02, 1.183e-02, -2.530e-01, -6.461e-02)); + r += mul(s2_8, M4(-1.540e-02, 1.168e-03, 1.128e-02, -1.633e-02, 2.524e-02, 3.186e-02, 5.005e-03, -7.069e-03, 5.819e-04, 8.252e-03, 1.526e-01, 1.689e-02, 3.763e-02, -1.503e-02, -6.911e-02, -1.912e-02)); + r += mul(s3_0, M4(-2.372e-03, 1.034e-02, 1.729e-03, 2.638e-02, 7.424e-03, 4.830e-02, 3.837e-02, -1.182e-01, -3.794e-02, 4.551e-02, 4.351e-02, -6.389e-02, -3.141e-02, -7.017e-02, -1.263e-02, -2.644e-02)); + r += mul(s3_1, M4(-2.983e-02, 4.225e-02, -1.368e-02, -1.883e-03, -3.442e-02, -1.005e-01, -2.421e-02, 6.129e-02, 1.177e-01, 1.918e-01, 1.059e-01, -4.087e-02, 5.202e-02, -1.259e-01, -1.377e-02, -2.708e-02)); + r += mul(s3_2, M4(2.647e-02, -7.393e-02, -2.562e-02, 2.553e-02, 1.038e-01, -2.515e-02, -1.384e-02, -5.238e-02, 3.187e-02, 4.110e-02, 4.839e-02, -3.347e-02, 4.652e-02, 2.220e-02, -2.716e-02, 2.800e-02)); + r += mul(s3_3, M4(5.081e-03, 5.175e-02, 5.579e-02, 2.651e-02, -6.240e-02, -8.506e-02, 1.635e-02, 7.569e-02, 3.674e-02, 7.343e-02, 9.829e-02, -8.204e-03, -1.582e-02, 6.919e-02, -8.234e-02, -3.219e-03)); + r += mul(s3_4, M4(-7.487e-02, 3.794e-01, 1.092e-01, 6.132e-02, -2.458e-01, 5.238e-02, -7.515e-02, 4.969e-02, 9.227e-02, 8.565e-02, 2.066e-01, -2.635e-01, 5.388e-02, 3.474e-02, -5.871e-02, 8.452e-02)); + r += mul(s3_5, M4(1.793e-01, 3.243e-01, 6.174e-02, 3.000e-02, -1.568e-01, -2.187e-02, -6.003e-02, 7.308e-02, -1.456e-01, 1.412e-01, 1.136e-01, 1.225e-02, -2.162e-02, -2.000e-02, -1.172e-01, -7.278e-02)); + r += mul(s3_6, M4(2.557e-05, -3.526e-03, 7.598e-02, 2.888e-02, -1.007e-02, -1.121e-02, 7.371e-02, -2.658e-03, -4.684e-03, 1.377e-01, 1.506e-01, -1.538e-01, -1.258e-02, -3.806e-03, -2.926e-02, -5.665e-03)); + r += mul(s3_7, M4(-7.977e-02, 7.167e-02, 1.215e-01, 1.001e-01, 1.639e-01, 5.450e-02, -3.106e-02, 2.305e-02, 2.065e-01, 1.043e-03, 4.629e-01, 7.788e-02, 1.561e-02, -1.805e-03, -7.499e-03, -5.985e-03)); + r += mul(s3_8, M4(-3.189e-01, 8.572e-02, 5.205e-02, -5.879e-03, 3.003e-02, -3.599e-02, -9.245e-03, 6.641e-02, 9.694e-02, 1.107e-01, 1.427e-01, -1.131e-01, -2.880e-02, -4.217e-04, -7.266e-02, -4.372e-02)); + r += mul(s4_0, M4(7.380e-03, 2.803e-02, -9.678e-03, 1.445e-02, -1.174e-01, -1.182e-01, -5.408e-02, 1.256e-01, 1.203e-02, 5.464e-02, 5.106e-02, -1.193e-01, 2.103e-02, 2.005e-02, 6.424e-03, -7.796e-03)); + r += mul(s4_1, M4(1.144e-01, 9.673e-02, 4.603e-02, -1.514e-02, 5.934e-02, 3.573e-01, -2.150e-02, 4.749e-02, -1.334e-01, -4.821e-02, 7.544e-02, -2.522e-02, -7.433e-02, -1.898e-02, -6.274e-02, 9.512e-03)); + r += mul(s4_2, M4(1.210e-01, -7.077e-02, 4.060e-02, -4.624e-02, 1.264e-01, 1.023e-01, 1.113e-02, -2.238e-02, -2.822e-02, 1.062e-02, -7.220e-04, 7.964e-03, 9.206e-02, -1.255e-01, -5.626e-03, 6.488e-03)); + r += mul(s4_3, M4(-2.819e-02, -5.091e-02, -2.555e-02, 5.825e-02, 2.027e-02, -1.595e-02, 7.369e-02, 1.607e-01, 7.973e-03, -9.789e-03, 6.486e-02, -5.431e-02, 1.557e-02, 2.131e-02, -6.740e-02, -3.800e-03)); + r += mul(s4_4, M4(2.899e-02, -1.963e-01, -4.447e-03, -1.937e-01, 1.544e-02, 5.877e-01, 1.209e-01, 2.231e-01, 5.151e-02, -1.451e-01, -1.265e-01, 3.621e-01, -4.030e-02, 1.096e-02, 1.394e-01, 1.566e-01)); + r += mul(s4_5, M4(-1.220e-01, -1.074e-01, -4.688e-02, 1.139e-01, -1.270e-01, -1.958e-01, -6.958e-02, 5.790e-02, -2.125e-01, 2.384e-02, -1.143e-01, -2.472e-02, -4.480e-02, 1.414e-01, 2.537e-02, -1.956e-02)); + r += mul(s4_6, M4(-2.249e-03, 4.939e-02, 2.547e-02, 6.518e-03, 1.783e-02, -4.854e-02, 9.588e-02, 1.246e-01, -5.187e-02, 1.011e-02, 6.236e-02, 7.764e-02, 5.926e-02, 1.052e-03, -9.210e-02, 1.820e-02)); + r += mul(s4_7, M4(1.112e-02, -1.005e-03, 5.627e-02, -4.650e-03, -1.019e-01, -2.774e-02, -4.797e-02, -9.489e-02, 1.611e-02, 2.311e-02, 4.969e-02, 2.918e-03, 9.366e-03, 2.128e-02, -2.667e-02, 8.454e-03)); + r += mul(s4_8, M4(7.954e-02, -1.162e-02, -3.825e-02, 3.051e-02, 5.782e-02, 1.317e-02, -2.331e-02, 1.714e-01, -5.622e-02, -4.566e-03, -1.264e-01, -4.613e-02, -3.620e-03, 2.095e-02, 1.811e-01, 4.435e-02)); + r += mul(s5_0, M4(1.911e-02, 4.114e-02, -2.698e-02, 7.956e-03, 4.051e-02, 1.081e-01, -2.460e-02, 3.704e-02, -2.240e-02, -7.579e-03, 2.443e-02, -3.274e-02, -5.654e-02, -1.421e-01, 9.256e-03, 2.626e-03)); + r += mul(s5_1, M4(5.279e-02, 1.891e-01, 2.931e-03, 6.000e-02, -5.619e-02, 9.849e-03, 7.842e-03, 4.068e-02, 7.803e-02, -7.617e-03, 2.789e-02, -1.069e-01, 8.581e-02, 2.530e-02, -5.946e-02, 4.150e-02)); + r += mul(s5_2, M4(-1.838e-02, -5.041e-03, -2.386e-02, -9.564e-03, 8.040e-03, -1.063e-01, -1.715e-02, 2.375e-02, -3.968e-02, 2.704e-02, 1.302e-02, -2.781e-02, -1.921e-02, 3.051e-02, 3.794e-03, 2.820e-03)); + r += mul(s5_3, M4(-1.307e-02, -3.145e-02, -1.016e-03, 8.268e-03, 3.836e-02, -9.889e-02, 2.164e-02, 2.833e-02, 4.851e-03, -3.649e-02, -4.677e-02, -1.289e-02, -4.046e-02, 1.519e-01, -5.701e-02, 1.659e-02)); + r += mul(s5_4, M4(1.599e-02, -1.972e-01, 5.258e-02, -9.934e-02, -6.811e-02, 5.773e-03, 2.508e-02, 3.029e-02, -4.904e-02, -2.255e-02, -4.280e-02, 1.142e-01, 1.684e-01, -2.098e-01, -3.852e-02, 1.056e-01)); + r += mul(s5_5, M4(-1.391e-01, 1.769e-01, 1.968e-02, 3.184e-02, 2.109e-02, 3.398e-02, -3.454e-02, 2.694e-02, -2.308e-02, -5.924e-02, -4.630e-02, 2.703e-03, -2.114e-01, -4.276e-02, -2.947e-02, 8.727e-02)); + r += mul(s5_6, M4(-2.128e-02, 1.915e-02, 1.806e-02, 8.424e-03, 4.411e-03, 3.856e-02, 4.922e-03, -1.195e-02, -1.828e-02, -2.112e-02, -1.254e-02, 7.101e-02, 1.845e-02, -1.504e-02, -2.836e-02, 9.746e-03)); + r += mul(s5_7, M4(2.673e-02, -7.386e-03, 5.003e-02, -5.457e-02, 9.805e-02, -1.111e-02, 1.450e-02, 5.296e-02, -1.907e-02, -3.562e-02, -5.054e-02, -4.874e-02, 1.863e-02, 1.324e-01, 3.033e-02, 1.632e-02)); + r += mul(s5_8, M4(6.026e-02, -5.803e-03, 3.790e-02, -1.785e-02, -6.598e-03, 6.772e-03, 2.008e-02, -7.773e-03, 3.404e-02, -5.681e-02, -4.015e-02, -1.481e-02, 3.457e-02, 8.365e-02, -1.311e-02, 2.835e-02)); + r += mul(s6_0, M4(1.874e-02, 2.963e-02, 8.589e-03, 9.893e-03, 1.142e-02, 5.424e-03, 9.955e-03, 9.789e-03, -4.377e-02, -2.456e-01, 6.007e-02, -3.494e-02, 9.568e-03, -1.820e-02, -1.093e-02, 1.087e-03)); + r += mul(s6_1, M4(-1.324e-01, 3.039e-02, -5.110e-03, -1.549e-03, 1.369e-02, 7.104e-02, -3.902e-03, -1.145e-02, 3.795e-01, -4.257e-01, 3.671e-02, 1.384e-02, 1.646e-02, -2.939e-02, 9.106e-03, 2.023e-02)); + r += mul(s6_2, M4(4.218e-02, -3.713e-02, -3.178e-02, 3.314e-02, 5.291e-03, 1.776e-02, 3.924e-04, -1.052e-02, -9.073e-02, -3.172e-01, -3.482e-02, -5.055e-02, -1.385e-02, 7.729e-02, 2.638e-03, -1.892e-04)); + r += mul(s6_3, M4(2.294e-02, -6.769e-02, 1.210e-02, 9.301e-03, -1.003e-02, 1.296e-02, -3.793e-02, 9.515e-03, 7.019e-03, 6.073e-02, 1.563e-01, -7.581e-03, 1.393e-02, 1.405e-02, -6.916e-02, 1.075e-02)); + r += mul(s6_4, M4(-8.817e-02, 2.766e-03, -5.930e-02, 1.035e-01, -6.339e-02, 2.813e-02, 9.339e-02, -1.344e-01, 1.301e-01, 2.397e-01, -4.362e-02, 2.980e-02, 1.294e-01, 7.722e-02, 1.689e-02, 5.884e-02)); + r += mul(s6_5, M4(1.634e-01, -1.067e-01, -3.926e-02, 1.696e-02, 2.136e-01, 1.045e-02, -8.671e-03, -6.394e-03, -2.086e-01, 6.436e-02, -8.610e-02, -3.077e-02, -1.447e-01, 1.470e-02, -2.206e-02, -8.833e-02)); + r += mul(s6_6, M4(4.121e-02, 3.653e-03, 9.934e-03, -6.902e-03, 3.086e-03, -1.948e-03, -3.164e-03, -6.264e-03, 1.644e-02, -4.309e-02, 1.099e-01, 1.237e-02, 4.810e-03, 3.916e-02, -9.033e-02, -1.602e-02)); + r += mul(s6_7, M4(4.115e-02, -7.165e-03, -2.393e-02, -1.639e-02, 2.697e-02, -2.052e-02, -5.419e-02, -4.974e-03, 6.181e-02, -9.166e-03, 3.334e-02, 2.322e-02, 1.120e-01, 8.432e-02, 6.979e-03, -1.082e-01)); + r += mul(s6_8, M4(1.035e-01, -2.271e-02, -2.727e-03, 1.913e-02, -3.115e-02, -2.378e-03, -1.533e-02, -3.342e-02, -1.665e-01, -3.854e-02, -7.222e-02, 4.908e-02, -1.622e-01, 2.703e-02, 1.628e-03, 2.494e-02)); + r += mul(s7_0, M4(2.206e-02, -7.713e-02, -1.060e-02, -7.856e-03, -8.739e-02, -8.483e-02, 1.705e-02, 2.507e-02, 1.730e-02, 1.474e-02, 1.893e-02, 1.194e-02, -2.405e-02, -5.729e-02, -1.529e-02, 2.111e-02)); + r += mul(s7_1, M4(4.148e-02, 4.829e-02, -9.404e-03, 2.608e-02, 6.859e-02, -8.264e-02, 4.951e-02, -2.350e-02, -4.359e-02, 2.061e-05, 4.833e-03, 4.083e-03, 2.436e-03, 3.365e-04, 1.053e-02, -4.982e-03)); + r += mul(s7_2, M4(2.788e-02, 5.720e-02, -1.417e-02, -1.855e-02, -1.366e-01, 1.563e-02, 1.777e-02, 2.607e-02, 9.303e-04, 1.798e-02, 6.918e-03, -1.112e-02, 1.452e-02, -3.567e-03, -1.566e-02, -2.902e-02)); + r += mul(s7_3, M4(4.434e-02, 1.092e-01, 6.465e-02, -1.144e-01, -1.169e-01, -7.731e-02, 4.387e-02, 4.264e-02, 1.655e-04, -1.567e-02, -3.360e-03, 2.005e-03, 7.195e-02, 1.235e-01, -5.993e-02, 6.344e-02)); + r += mul(s7_4, M4(-2.846e-01, 7.017e-01, 8.025e-02, 3.689e-01, 2.017e-01, 9.575e-02, 1.644e-01, 3.223e-02, 7.108e-02, 3.252e-02, 2.997e-02, 4.112e-02, 1.675e-01, 4.688e-01, 5.569e-02, 4.097e-01)); + r += mul(s7_5, M4(-8.491e-02, 5.125e-02, -4.314e-02, 4.776e-02, 4.496e-02, -1.387e-01, -2.997e-02, 5.575e-02, -1.348e-01, 2.937e-02, 5.464e-03, -4.188e-04, -5.936e-02, 9.907e-02, -2.264e-02, 4.540e-02)); + r += mul(s7_6, M4(4.639e-02, 2.088e-02, -5.529e-02, 5.430e-02, -2.772e-02, -9.927e-02, 7.334e-02, 5.674e-02, -5.370e-03, 1.712e-02, 1.511e-02, -9.812e-03, 7.644e-03, -4.335e-03, -9.858e-02, 1.102e-02)); + r += mul(s7_7, M4(-3.219e-02, 3.117e-02, -6.292e-02, -2.947e-01, -5.795e-02, -4.024e-02, -8.836e-03, -7.493e-02, -3.911e-03, 1.426e-02, 8.336e-02, 5.121e-03, 9.672e-02, 2.570e-01, 3.033e-03, -7.363e-02)); + r += mul(s7_8, M4(1.485e-01, -7.624e-02, 4.307e-02, 6.218e-02, 2.407e-02, 2.447e-02, 6.895e-03, 7.684e-02, 4.433e-02, -1.227e-02, 4.716e-02, 1.408e-02, -2.840e-01, 8.665e-02, 8.153e-02, 9.530e-02)); + r += V4(3.794e-03, -6.271e-04, 2.485e-03, 1.034e-03); + return r; +} + +V4 f1(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-1.688e-02, 1.620e-03, 2.600e-03, -1.661e-02, -1.969e-02, -4.045e-02, 2.004e-02, 1.275e-02, -2.568e-03, -1.516e-02, -1.471e-02, 3.537e-02, 1.000e-02, -4.602e-03, 3.973e-02, 4.770e-03)); + r += mul(s0_1, M4(-6.627e-02, -1.956e-03, -2.893e-02, -1.149e-02, 7.862e-02, -2.627e-02, 2.400e-02, 3.658e-02, -2.325e-02, -4.384e-02, -8.477e-03, -2.188e-02, -4.177e-02, -5.982e-03, 6.463e-03, 5.629e-04)); + r += mul(s0_2, M4(-5.602e-02, 2.109e-02, 1.306e-02, -2.271e-02, 2.987e-02, 2.223e-02, -1.418e-02, 7.313e-02, 3.753e-02, -4.956e-03, -2.664e-02, -3.003e-02, 3.356e-02, -3.528e-04, -6.530e-03, 9.253e-02)); + r += mul(s0_3, M4(-3.501e-02, 2.454e-02, 4.258e-02, -2.786e-03, -8.423e-03, -3.658e-03, 3.081e-02, -5.229e-02, -3.026e-03, -3.401e-03, -4.111e-02, 2.753e-02, 4.135e-02, -4.806e-02, -4.145e-02, -8.509e-03)); + r += mul(s0_4, M4(-6.815e-02, -1.008e-02, 9.775e-02, -1.491e-03, 3.135e-01, 1.355e-01, 4.295e-01, 1.489e-01, -8.228e-02, 1.565e-01, -4.864e-02, -1.931e-03, 1.782e-01, 1.140e-01, -5.738e-02, -1.471e-01)); + r += mul(s0_5, M4(-6.358e-02, -3.115e-02, 1.176e-02, -1.185e-01, -5.756e-02, -1.359e-03, 2.088e-02, 1.216e-02, 2.319e-01, 8.109e-03, -1.532e-02, 1.001e-01, -4.522e-02, -3.685e-02, 8.178e-02, 1.908e-01)); + r += mul(s0_6, M4(1.539e-03, -2.277e-02, -4.300e-02, -7.362e-03, 1.287e-02, -3.248e-02, 3.525e-02, 6.688e-04, 1.585e-02, -1.905e-02, 4.454e-02, 6.523e-04, 2.880e-02, 2.347e-02, 1.953e-02, -5.062e-03)); + r += mul(s0_7, M4(-3.124e-02, -3.693e-02, 1.489e-02, 1.767e-03, 1.441e-02, -1.741e-01, -1.433e-02, 7.572e-02, -1.182e-02, 6.519e-02, 7.046e-02, 1.714e-02, -4.300e-02, -2.017e-01, -2.466e-03, 2.791e-02)); + r += mul(s0_8, M4(-7.179e-03, 4.757e-02, 1.911e-02, 3.829e-02, -1.630e-02, -9.665e-03, 4.565e-02, -5.551e-02, -9.989e-03, -1.013e-01, -4.229e-02, -7.202e-02, 1.935e-02, -4.290e-03, -1.460e-02, -1.759e-04)); + r += mul(s1_0, M4(8.306e-03, -4.549e-02, 3.787e-02, 3.353e-02, -4.052e-02, 1.061e-02, 3.073e-02, -4.544e-03, 3.342e-02, -1.539e-02, 4.609e-02, 4.170e-02, 3.968e-03, -5.158e-03, 3.410e-02, -2.230e-02)); + r += mul(s1_1, M4(-8.669e-02, 8.401e-03, -8.128e-02, -1.108e-01, 2.188e-02, 5.959e-03, -6.349e-02, 3.816e-02, 4.950e-02, 1.902e-02, -4.972e-02, 6.662e-03, -5.517e-02, 1.307e-02, -1.023e-01, 1.569e-01)); + r += mul(s1_2, M4(-4.339e-03, -9.116e-03, 3.269e-02, 6.631e-03, 3.124e-02, 1.329e-02, 3.488e-02, 5.174e-02, -1.194e-01, -5.892e-03, 1.328e-01, -7.424e-02, 3.150e-02, 9.712e-03, -1.382e-01, 1.354e-01)); + r += mul(s1_3, M4(2.349e-02, -1.110e-01, 1.577e-01, 4.993e-02, -7.000e-02, 1.363e-02, -6.165e-02, -6.123e-02, 8.230e-03, -5.006e-03, 6.500e-02, -1.023e-03, -2.211e-04, -7.154e-03, -2.293e-02, 1.220e-03)); + r += mul(s1_4, M4(7.914e-03, -1.903e-02, 1.502e-02, -2.245e-01, 3.243e-01, 1.363e-01, 2.421e-01, 1.736e-01, -1.952e-01, 1.249e-01, -1.436e-01, 8.891e-02, 5.208e-02, 5.334e-01, -4.287e-01, 3.536e-02)); + r += mul(s1_5, M4(-6.245e-02, -2.399e-02, -5.681e-02, -1.695e-01, -7.771e-02, -4.787e-02, -2.778e-02, 7.013e-03, 3.291e-01, -5.536e-03, -1.948e-01, 1.189e-01, -1.030e-01, 7.201e-02, 6.521e-02, 3.350e-01)); + r += mul(s1_6, M4(9.517e-03, 2.329e-01, -1.247e-01, -1.798e-02, -2.311e-02, -5.092e-02, 6.913e-02, 2.517e-03, 3.602e-02, 2.896e-02, 3.974e-02, -1.510e-03, 6.330e-02, 1.061e-01, -1.001e-02, 5.840e-03)); + r += mul(s1_7, M4(-1.230e-01, -3.088e-02, 1.096e-01, -2.161e-02, 2.731e-02, -1.112e-01, -1.242e-01, 7.487e-02, 4.701e-03, 1.032e-01, 4.261e-02, -1.760e-03, -2.495e-02, -1.617e-01, 9.928e-03, 2.328e-02)); + r += mul(s1_8, M4(-7.188e-02, 3.817e-02, 4.786e-02, -4.014e-02, -7.561e-03, 1.417e-02, -6.037e-03, 9.124e-03, -2.451e-02, -7.406e-02, -5.443e-03, -5.927e-03, 3.337e-02, 6.084e-02, -3.750e-02, 1.238e-02)); + r += mul(s2_0, M4(1.813e-02, -1.772e-03, 5.043e-03, 2.941e-02, 2.342e-02, -6.805e-03, -5.400e-02, -1.601e-02, -1.271e-02, -2.814e-02, 6.646e-02, -3.602e-02, -2.938e-02, 3.830e-02, -5.756e-02, 3.625e-02)); + r += mul(s2_1, M4(-2.340e-02, 2.797e-02, -9.775e-02, -4.790e-03, -5.640e-02, -3.446e-02, 5.422e-02, -1.253e-01, 6.237e-02, 8.356e-04, -3.274e-02, 4.805e-02, -9.531e-02, 4.626e-04, 2.233e-03, 1.519e-01)); + r += mul(s2_2, M4(6.482e-03, 5.675e-03, 6.174e-02, -3.843e-02, 3.552e-02, -1.070e-02, 3.641e-02, 6.807e-02, -4.083e-02, -5.972e-03, 2.947e-02, -3.639e-02, -3.855e-02, 2.284e-02, -2.588e-02, -8.389e-02)); + r += mul(s2_3, M4(6.596e-02, 5.844e-02, -8.882e-02, 2.183e-02, 3.510e-02, -1.529e-01, 2.239e-02, 6.559e-02, -7.805e-03, 4.094e-02, -1.105e-02, 5.632e-03, 1.079e-01, -6.351e-03, 8.070e-02, 2.619e-02)); + r += mul(s2_4, M4(-1.392e-01, -3.877e-02, 1.309e-01, 6.513e-02, 3.357e-02, -3.087e-02, -4.398e-02, -1.856e-01, -3.010e-02, -7.998e-03, -1.716e-02, 4.991e-02, -2.211e-01, -2.140e-01, 3.126e-03, 4.484e-02)); + r += mul(s2_5, M4(1.858e-02, -7.505e-02, 4.180e-02, -3.502e-02, 8.565e-03, 2.029e-03, -4.294e-02, 5.614e-02, 1.200e-02, 5.652e-02, -3.376e-02, -2.676e-02, 6.660e-02, -1.177e-02, -4.299e-02, 3.267e-02)); + r += mul(s2_6, M4(2.860e-02, -3.219e-02, -5.538e-03, -2.631e-03, -5.422e-02, 5.290e-02, 1.585e-02, -1.692e-02, -1.521e-03, 5.627e-03, 3.952e-03, -9.985e-03, 9.533e-03, 2.745e-02, -1.362e-03, 1.560e-02)); + r += mul(s2_7, M4(-2.660e-03, 3.732e-02, 8.189e-02, 2.610e-02, -2.065e-02, -7.852e-02, 5.515e-02, -6.198e-02, 1.183e-02, 2.200e-02, -8.053e-03, -1.738e-03, -3.579e-02, -2.565e-02, 3.979e-02, 9.076e-03)); + r += mul(s2_8, M4(2.500e-02, 4.805e-03, -2.546e-02, 1.595e-02, -3.212e-02, 1.141e-03, 5.625e-02, -1.051e-02, -2.014e-02, -3.098e-02, 4.631e-02, -8.121e-03, 4.655e-02, 5.989e-02, -2.590e-02, -5.759e-02)); + r += mul(s3_0, M4(2.755e-02, 1.721e-02, -1.964e-02, 1.815e-02, 2.594e-02, 5.194e-02, -9.954e-02, 7.764e-03, -3.718e-02, -8.173e-03, -2.634e-02, -3.145e-02, -1.658e-02, -2.413e-03, 1.497e-02, 2.813e-02)); + r += mul(s3_1, M4(-4.818e-02, 9.187e-03, 1.082e-01, -9.618e-03, -1.078e-03, -5.924e-02, 5.767e-02, -1.573e-01, -6.210e-02, -1.068e-01, 1.610e-01, -1.717e-01, 2.399e-02, -2.177e-02, -1.816e-01, 7.457e-02)); + r += mul(s3_2, M4(3.239e-02, -3.052e-03, -5.994e-02, 7.106e-02, -4.328e-03, 1.696e-02, -4.923e-02, 5.518e-02, 1.881e-02, -8.143e-02, 1.245e-02, 1.153e-02, 3.943e-02, -2.338e-02, 4.641e-02, -1.856e-02)); + r += mul(s3_3, M4(5.081e-02, -7.570e-03, -1.399e-01, -5.766e-03, 1.056e-01, -3.001e-02, -4.437e-02, 1.799e-02, 3.704e-02, -2.498e-01, 9.868e-02, -1.144e-02, 1.197e-01, 5.018e-02, -3.259e-02, -2.079e-02)); + r += mul(s3_4, M4(1.858e-01, -2.154e-02, 1.039e-01, 1.476e-01, 3.315e-01, 1.923e-01, -9.577e-02, -2.388e-01, -3.060e-01, 2.650e-02, -4.730e-01, -4.012e-01, -1.727e-01, -5.333e-02, 1.566e-01, -2.474e-02)); + r += mul(s3_5, M4(1.022e-02, -8.711e-02, 7.465e-02, 2.158e-03, -1.724e-02, 4.548e-02, -9.675e-02, -2.598e-02, -1.019e-01, -5.639e-02, 2.441e-01, 1.528e-01, 1.307e-01, 3.058e-02, -6.324e-02, 8.229e-02)); + r += mul(s3_6, M4(2.247e-02, -4.279e-02, -7.730e-03, 2.664e-03, -5.508e-02, 1.184e-01, -2.194e-02, -2.835e-02, -6.838e-02, -1.008e-01, 1.036e-01, -3.276e-02, 4.933e-02, -3.893e-03, -1.141e-02, 3.247e-03)); + r += mul(s3_7, M4(6.500e-02, -2.505e-02, -1.286e-01, 6.264e-02, 2.435e-02, -1.039e-01, 2.001e-02, -5.567e-02, -3.446e-02, 2.310e-04, 1.615e-01, -5.778e-02, -1.667e-02, -2.477e-02, 5.057e-02, 3.336e-02)); + r += mul(s3_8, M4(-3.972e-02, 9.174e-02, 3.314e-03, 7.951e-02, -2.571e-02, 1.782e-02, 5.530e-02, 2.399e-02, 1.464e-02, -1.346e-01, -1.693e-02, -6.348e-02, 2.907e-02, -1.423e-02, -2.121e-02, -3.235e-04)); + r += mul(s4_0, M4(-1.179e-02, -4.655e-02, 9.348e-03, -9.519e-03, -2.300e-01, 1.102e-03, 7.401e-02, 2.538e-02, 5.815e-02, 1.980e-01, -2.843e-02, -2.603e-02, 4.451e-02, -9.192e-03, 5.257e-02, -2.093e-02)); + r += mul(s4_1, M4(-3.952e-02, -6.088e-02, 1.147e-01, 1.162e-03, -1.728e-01, 1.465e-03, -8.939e-02, -2.393e-02, 3.740e-01, 5.118e-03, -2.724e-01, -1.146e-01, 3.515e-02, -1.743e-02, -1.492e-01, 1.724e-01)); + r += mul(s4_2, M4(3.989e-02, 4.006e-02, -6.266e-02, -4.154e-02, -3.374e-02, 1.111e-02, 1.076e-01, -5.814e-02, -1.787e-01, 6.540e-02, -5.756e-02, -4.558e-02, -5.229e-02, -1.605e-02, -3.009e-02, -7.247e-02)); + r += mul(s4_3, M4(-6.962e-02, -1.067e-01, 8.455e-02, 2.799e-02, 3.317e-02, 2.349e-01, -5.347e-02, 3.982e-02, 9.300e-02, -7.524e-02, -2.305e-01, 1.330e-01, 7.355e-02, -3.701e-03, -8.832e-02, -6.464e-02)); + r += mul(s4_4, M4(-1.125e-02, 2.497e-01, -9.808e-02, -1.238e-01, 2.612e-01, -5.283e-02, 9.616e-02, -2.290e-01, 2.161e-01, 3.140e-01, 1.661e-01, 8.358e-02, -1.595e-02, 1.697e-01, -8.378e-02, 4.489e-02)); + r += mul(s4_5, M4(-7.592e-02, -6.611e-02, 3.207e-02, 6.973e-02, -9.163e-02, 2.582e-02, -4.628e-02, -7.371e-02, 6.590e-02, 1.204e-01, -5.078e-02, -3.495e-02, -4.221e-02, -6.323e-02, 5.784e-02, -1.189e-02)); + r += mul(s4_6, M4(1.349e-02, 5.168e-02, -9.459e-03, -9.435e-03, -1.527e-02, -7.353e-02, 5.567e-02, 1.555e-02, -5.917e-03, 1.431e-01, 7.490e-03, -1.136e-02, -1.985e-02, 3.699e-02, -6.590e-03, -5.483e-02)); + r += mul(s4_7, M4(-4.645e-02, -4.170e-02, 1.860e-02, -2.707e-02, -1.969e-02, 5.237e-02, -5.482e-02, -1.671e-02, 2.997e-02, 4.133e-02, 5.390e-02, 9.477e-03, -1.651e-02, -4.991e-02, -2.497e-02, -8.465e-03)); + r += mul(s4_8, M4(-1.339e-02, 6.872e-02, -1.390e-02, -1.499e-02, 3.492e-03, 6.004e-02, 5.847e-02, 2.786e-02, -1.177e-02, -6.444e-02, -4.751e-04, 5.780e-03, -4.505e-02, 2.415e-02, 2.309e-02, -1.891e-02)); + r += mul(s5_0, M4(-1.439e-02, 8.856e-03, -4.062e-03, -2.768e-02, 2.892e-03, 1.205e-02, 3.124e-02, -3.116e-02, 1.968e-02, -6.956e-02, 2.068e-02, 1.044e-02, 1.051e-01, 5.463e-03, -5.207e-02, 7.550e-02)); + r += mul(s5_1, M4(1.705e-02, -1.009e-02, 2.104e-01, 2.771e-02, -2.763e-02, -1.016e-02, 2.913e-02, 1.721e-03, 4.321e-02, 3.347e-02, -2.001e-01, 5.190e-02, 2.019e-02, 2.347e-02, 3.138e-03, -7.216e-03)); + r += mul(s5_2, M4(6.213e-02, 2.215e-04, -6.324e-02, 3.181e-03, -2.937e-02, 2.684e-02, -3.033e-02, -9.759e-03, 7.617e-03, 5.678e-03, 4.383e-02, 2.802e-02, -3.703e-02, -7.386e-02, -1.076e-01, -6.615e-02)); + r += mul(s5_3, M4(-1.044e-01, -5.583e-02, 4.299e-02, -4.094e-03, 4.665e-03, 9.436e-02, 3.332e-02, -2.490e-02, -5.877e-03, 1.073e-01, -1.052e-01, -7.205e-04, 1.204e-01, -1.462e-02, 4.291e-02, 4.412e-02)); + r += mul(s5_4, M4(-9.580e-03, 4.627e-02, -1.851e-01, -7.692e-03, 4.703e-02, 8.875e-02, -6.477e-02, -5.981e-02, 1.665e-01, 1.911e-01, 4.702e-02, 9.924e-02, -1.685e-01, 8.893e-02, 2.032e-02, -9.426e-02)); + r += mul(s5_5, M4(5.551e-02, -1.719e-02, 1.029e-01, 8.649e-02, 7.177e-03, 6.821e-02, -2.894e-02, 2.611e-03, 5.830e-02, -2.083e-02, -5.045e-02, 3.884e-02, -1.416e-02, 1.542e-01, 4.160e-02, 3.347e-02)); + r += mul(s5_6, M4(-4.073e-03, 3.413e-02, 2.664e-02, -1.858e-02, -9.691e-03, 8.637e-02, -3.548e-02, 1.617e-03, 7.458e-03, -3.505e-03, 2.383e-02, 1.316e-03, 5.534e-03, 2.217e-02, -4.426e-02, 2.022e-02)); + r += mul(s5_7, M4(-3.211e-02, -1.215e-01, 1.905e-02, -2.665e-02, -1.887e-02, 1.581e-02, 1.180e-02, -1.465e-02, -6.945e-03, -6.458e-02, 2.229e-02, 2.173e-03, 5.289e-03, 1.785e-01, -2.382e-02, -7.196e-02)); + r += mul(s5_8, M4(8.361e-03, -4.776e-02, -4.062e-02, -4.979e-03, -1.914e-02, -4.516e-02, 2.518e-02, -4.994e-02, -2.544e-02, 7.889e-03, 3.192e-02, 1.479e-02, 4.122e-02, -1.223e-01, -3.672e-02, 6.956e-02)); + r += mul(s6_0, M4(2.982e-02, -2.237e-03, 3.926e-02, -1.372e-02, -2.704e-02, 1.751e-03, 2.775e-02, 1.043e-02, 1.676e-01, -2.489e-01, 7.805e-02, 4.061e-02, -6.912e-03, 6.682e-03, -3.892e-02, -4.953e-03)); + r += mul(s6_1, M4(-6.340e-02, -1.980e-02, -7.033e-02, 9.388e-03, -3.794e-02, -2.723e-02, 1.208e-01, -4.089e-02, 6.312e-01, 5.578e-02, -1.312e-01, -5.149e-02, 7.622e-02, 1.538e-02, -2.418e-02, 2.198e-02)); + r += mul(s6_2, M4(-1.989e-03, 2.276e-02, -5.157e-03, 2.582e-03, 1.265e-01, -1.245e-04, -4.509e-02, 6.542e-02, 2.313e-02, 4.024e-02, -1.322e-01, -1.653e-01, -6.536e-03, -9.204e-03, 5.613e-02, -1.824e-02)); + r += mul(s6_3, M4(1.234e-01, -4.512e-03, -4.484e-02, -4.470e-03, -8.846e-03, -8.538e-02, -8.290e-03, -4.593e-02, -3.324e-02, -7.474e-02, 3.080e-02, -6.522e-02, -4.026e-02, 1.896e-02, 1.481e-02, -1.753e-03)); + r += mul(s6_4, M4(-4.701e-02, 1.293e-02, 3.089e-02, -1.295e-01, 1.708e-02, 2.212e-02, -7.435e-02, -8.472e-03, 2.279e-01, -3.650e-02, 2.674e-01, -2.877e-01, 2.375e-01, -4.478e-02, 1.948e-01, 5.877e-02)); + r += mul(s6_5, M4(7.374e-03, 5.838e-02, 1.708e-02, -2.078e-02, 4.462e-02, -5.084e-02, 2.283e-02, 4.827e-02, -1.656e-01, 6.517e-02, -5.528e-02, -2.095e-02, 2.431e-02, 1.133e-02, -1.470e-01, 2.211e-02)); + r += mul(s6_6, M4(3.417e-02, 2.976e-02, -1.042e-02, -2.068e-03, 2.498e-02, 7.744e-02, 1.088e-02, -7.598e-03, -5.186e-02, 2.792e-02, -1.575e-02, -6.310e-03, -4.620e-02, -2.011e-02, 3.923e-02, -9.526e-03)); + r += mul(s6_7, M4(4.330e-03, -4.339e-02, 6.602e-03, -3.648e-02, -4.646e-03, -1.361e-01, 5.384e-02, -2.349e-02, 1.334e-01, -1.469e-01, 2.850e-02, -4.574e-02, 6.043e-02, -5.685e-02, -5.057e-02, -4.692e-03)); + r += mul(s6_8, M4(2.838e-03, 3.079e-02, -1.281e-02, -6.331e-02, 4.269e-02, -2.337e-02, -4.065e-02, 5.503e-02, -1.305e-01, 1.135e-01, 1.826e-02, 1.203e-02, -2.164e-02, -3.076e-03, 2.937e-02, 4.005e-02)); + r += mul(s7_0, M4(6.965e-02, 4.338e-03, 1.194e-01, 2.811e-02, -2.574e-02, 1.949e-02, 3.243e-02, 4.437e-02, 7.250e-02, -2.422e-04, -1.091e-03, -1.469e-02, 7.245e-03, -7.447e-03, 2.299e-02, 4.998e-03)); + r += mul(s7_1, M4(-8.725e-05, -2.240e-02, -8.736e-02, -1.595e-02, 7.126e-02, 5.370e-02, -1.651e-01, 1.672e-02, 7.959e-02, 1.543e-02, -7.129e-02, 3.632e-02, 6.645e-03, -2.822e-02, -2.425e-03, 3.294e-02)); + r += mul(s7_2, M4(-2.685e-02, 3.116e-02, -1.898e-02, -4.718e-02, 5.786e-03, 1.592e-02, 8.082e-04, -1.662e-02, -2.474e-02, 1.294e-02, -5.428e-03, 1.814e-02, -3.227e-02, 3.449e-03, -7.038e-02, -3.596e-02)); + r += mul(s7_3, M4(3.813e-02, -2.099e-03, 3.946e-02, -4.075e-02, -4.265e-03, 5.593e-02, -8.187e-02, 4.551e-02, -7.894e-03, -2.068e-02, 2.511e-02, -6.803e-04, -1.260e-01, -8.680e-02, -1.011e-02, -4.539e-02)); + r += mul(s7_4, M4(-2.995e-01, 1.242e-01, 4.846e-02, 2.231e-02, 4.581e-02, 1.627e-01, -1.363e-02, -4.450e-02, -1.975e-02, -1.774e-02, 5.768e-02, -1.498e-02, 7.242e-01, 1.627e-01, 2.366e-02, 7.746e-01)); + r += mul(s7_5, M4(-2.051e-02, 9.773e-02, 1.240e-01, 8.467e-02, 3.193e-02, 3.783e-02, -7.459e-02, 3.517e-02, -1.552e-02, -2.133e-02, -2.022e-03, -1.416e-02, -1.032e-01, 2.212e-03, -8.253e-02, -2.403e-02)); + r += mul(s7_6, M4(6.575e-02, -1.535e-01, 6.263e-02, 1.718e-02, 2.965e-02, 1.927e-02, 7.256e-03, 5.714e-03, -1.267e-03, -2.908e-02, 1.035e-04, 2.608e-03, -2.016e-02, 4.315e-02, 1.622e-02, -3.870e-02)); + r += mul(s7_7, M4(-7.318e-03, -4.186e-02, -2.571e-02, -7.417e-03, 1.255e-02, -1.175e-01, -6.481e-02, 2.642e-02, -1.088e-02, 3.584e-02, 1.026e-02, 1.582e-02, 1.733e-01, -6.457e-02, -2.087e-01, 6.831e-03)); + r += mul(s7_8, M4(9.267e-02, -4.128e-02, -4.563e-02, -1.067e-01, 4.111e-02, 7.397e-02, -9.920e-03, 2.718e-02, 2.727e-03, -1.785e-02, -1.196e-03, -1.561e-03, -4.283e-03, 9.742e-02, 2.194e-02, 9.397e-02)); + r += V4(-1.575e-03, 9.477e-05, 3.103e-03, 2.705e-03); + return r; +} + +V4 f2(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-6.286e-02, -2.502e-04, -1.782e-02, -1.386e-02, -4.582e-03, 1.342e-02, -2.703e-02, -1.885e-02, -2.375e-02, -1.743e-02, -2.331e-02, -4.602e-02, 4.226e-02, 4.109e-03, 4.430e-03, -1.428e-02)); + r += mul(s0_1, M4(-3.584e-02, -5.431e-02, 2.948e-02, -1.796e-02, 3.327e-02, -7.598e-03, -2.264e-02, -5.021e-02, 2.741e-02, 1.018e-02, 2.019e-02, 1.274e-02, -3.174e-02, 3.511e-02, 7.139e-03, 1.037e-01)); + r += mul(s0_2, M4(-1.668e-02, 8.601e-03, -1.703e-02, 1.649e-02, -1.855e-02, -1.570e-02, -2.058e-03, -7.941e-03, 1.613e-02, 1.590e-02, 1.513e-02, 2.712e-02, 3.699e-02, -4.506e-02, -2.368e-03, -4.616e-02)); + r += mul(s0_3, M4(1.365e-01, 2.775e-02, 4.286e-02, 1.690e-02, -8.827e-02, 5.031e-02, -3.154e-02, 1.501e-02, 1.430e-02, -3.424e-02, -2.379e-02, 1.967e-02, 1.414e-02, 2.102e-02, 7.210e-02, 3.716e-02)); + r += mul(s0_4, M4(8.167e-02, 1.204e-01, -1.147e-01, 4.186e-02, 1.293e-02, 5.409e-02, 2.401e-02, 1.971e-01, 8.087e-02, -9.191e-02, -1.999e-02, 4.654e-02, -5.427e-02, 2.744e-01, 1.111e-01, -4.410e-02)); + r += mul(s0_5, M4(-4.244e-02, 4.083e-02, -2.514e-03, -6.810e-03, 7.438e-02, -7.925e-02, -3.725e-02, 3.084e-03, -1.768e-01, 1.198e-02, 3.945e-02, 1.902e-02, 5.694e-02, -1.233e-02, -5.633e-02, 3.284e-02)); + r += mul(s0_6, M4(-3.574e-02, -1.176e-02, -3.352e-02, -2.732e-02, 5.256e-02, -4.201e-02, 2.941e-02, 2.193e-02, -1.392e-01, 7.087e-03, 4.034e-02, 3.648e-02, 7.982e-02, -4.713e-02, -3.490e-02, 3.462e-02)); + r += mul(s0_7, M4(-1.267e-01, 4.749e-02, 9.924e-02, -4.168e-02, 1.007e-01, 1.167e-01, 6.051e-02, -8.266e-03, -1.707e-01, 7.560e-02, -6.771e-02, -2.184e-03, 8.028e-02, 1.047e-01, 5.680e-02, 4.491e-02)); + r += mul(s0_8, M4(4.774e-02, 3.688e-03, -1.564e-03, -8.394e-03, -8.898e-02, 6.652e-02, 1.923e-02, -2.762e-02, -4.141e-02, -3.580e-02, 2.316e-02, 6.226e-02, -1.643e-02, 5.038e-02, 4.202e-02, -8.634e-04)); + r += mul(s1_0, M4(-2.159e-02, 4.608e-02, 2.270e-02, 6.714e-02, 3.474e-02, 1.003e-02, -7.786e-03, 5.896e-03, 1.480e-02, -5.471e-02, -1.593e-03, 2.905e-02, -8.552e-03, 5.134e-02, 1.262e-02, -5.044e-02)); + r += mul(s1_1, M4(-8.847e-02, 1.202e-01, -3.535e-03, -9.698e-02, 2.149e-02, -2.206e-02, -2.659e-02, -4.115e-02, 3.202e-02, 3.496e-02, -5.574e-02, 4.296e-03, -4.881e-02, 5.946e-03, 2.066e-03, 5.490e-02)); + r += mul(s1_2, M4(-7.083e-02, -3.596e-02, -2.115e-02, 5.332e-02, 4.928e-03, -2.566e-02, -1.139e-03, 4.865e-03, 3.236e-02, 1.707e-02, 2.865e-02, 6.467e-02, 6.417e-02, -2.363e-02, -1.192e-02, -3.437e-02)); + r += mul(s1_3, M4(9.685e-02, -1.008e-01, -3.245e-02, -3.055e-02, -9.284e-02, 4.332e-02, -3.618e-02, 1.080e-02, 1.041e-02, -2.281e-02, -7.568e-02, -5.285e-02, -2.318e-02, 3.665e-02, 2.219e-02, -1.400e-02)); + r += mul(s1_4, M4(1.862e-01, 4.608e-01, -6.891e-02, 1.809e-01, -3.542e-02, 1.006e-01, 4.801e-02, 9.250e-02, 4.619e-01, 2.440e-02, 2.894e-01, 3.075e-02, -1.535e-01, -1.170e-01, 5.626e-03, -2.781e-01)); + r += mul(s1_5, M4(2.493e-02, 9.614e-02, 4.884e-02, -7.251e-02, 2.368e-02, -3.675e-02, -3.287e-02, 8.828e-03, 1.801e-01, -1.446e-01, -5.158e-02, 1.015e-01, 3.986e-02, -5.168e-02, -7.153e-02, 1.293e-02)); + r += mul(s1_6, M4(-5.589e-02, -8.774e-02, 3.786e-02, 3.986e-02, 3.144e-02, 4.375e-02, 6.141e-02, 3.453e-02, -8.236e-03, -2.857e-02, 3.869e-03, 4.619e-03, 5.677e-02, -1.208e-01, -6.910e-02, 2.016e-02)); + r += mul(s1_7, M4(-1.521e-01, 2.723e-01, 4.824e-02, -2.627e-01, 9.133e-02, 4.254e-02, 3.662e-02, -3.833e-02, 2.406e-01, -5.310e-02, -2.103e-01, 1.255e-01, 5.581e-01, 9.681e-02, -3.147e-02, -7.051e-02)); + r += mul(s1_8, M4(-1.136e-02, -2.118e-02, -9.550e-03, 3.598e-02, -8.392e-02, 4.512e-02, 4.338e-02, 1.109e-02, 1.403e-01, 1.283e-01, 4.961e-02, 4.027e-02, -1.252e-01, 5.900e-02, 8.668e-02, -6.595e-02)); + r += mul(s2_0, M4(-1.008e-02, -2.903e-02, -6.333e-03, -4.459e-02, 2.505e-03, 1.551e-02, 3.357e-02, 5.356e-02, -2.329e-02, 3.266e-02, -7.303e-03, 7.180e-03, 3.004e-02, -8.346e-03, -2.725e-02, 2.817e-02)); + r += mul(s2_1, M4(3.495e-03, -9.106e-03, 2.350e-02, 3.874e-02, 4.396e-03, 1.342e-01, 5.563e-02, 3.178e-02, -1.553e-03, -9.208e-02, 1.462e-02, -3.384e-02, 8.389e-02, -2.999e-01, 6.650e-02, -1.166e-01)); + r += mul(s2_2, M4(1.174e-02, -1.292e-02, -8.445e-03, 7.933e-04, 5.201e-02, -2.256e-02, -2.047e-02, 6.584e-03, -3.796e-02, 1.583e-02, 1.837e-02, 2.655e-02, 9.952e-02, 3.144e-02, -2.651e-02, 2.076e-01)); + r += mul(s2_3, M4(4.431e-02, -7.747e-02, -4.542e-02, -6.469e-02, 5.572e-02, 3.031e-03, 4.995e-02, -2.386e-02, 8.360e-03, -6.044e-02, -4.929e-03, -6.369e-02, 9.520e-02, -1.262e-01, -7.337e-03, 9.376e-03)); + r += mul(s2_4, M4(-7.080e-02, 1.169e-01, 1.829e-02, 7.257e-02, 2.309e-02, -2.177e-02, -3.192e-02, 3.540e-04, 4.603e-02, 3.443e-02, -4.078e-02, 5.128e-02, 3.726e-01, 5.696e-01, -8.425e-02, 7.807e-02)); + r += mul(s2_5, M4(-1.185e-01, 6.520e-02, 5.123e-02, -1.715e-02, -1.738e-02, 1.367e-02, 2.443e-02, 1.685e-02, 8.273e-02, 5.137e-03, 4.677e-03, -5.286e-02, 3.105e-01, -1.479e-01, 5.733e-02, -1.704e-01)); + r += mul(s2_6, M4(2.104e-02, -2.878e-02, -3.234e-02, -4.314e-02, -4.102e-02, 1.488e-02, -2.447e-02, 4.758e-02, 7.857e-03, 2.584e-02, 1.786e-03, 6.276e-03, 1.611e-02, -2.310e-02, -7.171e-03, -2.552e-02)); + r += mul(s2_7, M4(4.631e-02, 1.781e-02, 6.916e-03, 5.503e-02, -1.158e-01, 8.648e-02, 5.399e-02, -4.525e-03, -3.435e-02, -2.144e-02, -1.508e-02, -1.361e-02, 9.343e-02, 7.544e-02, -2.271e-02, 6.940e-02)); + r += mul(s2_8, M4(8.131e-02, 1.685e-02, 3.085e-02, -3.030e-02, -4.887e-02, 7.200e-03, 4.149e-02, 3.742e-02, -3.739e-02, -1.525e-02, -3.245e-02, -2.925e-03, -9.070e-02, -4.021e-02, -1.551e-02, -1.308e-02)); + r += mul(s3_0, M4(-2.061e-02, -4.966e-02, -2.100e-02, -6.209e-02, -2.488e-02, -5.143e-02, 2.484e-03, 1.816e-02, -1.113e-02, -2.592e-02, 6.455e-02, 8.904e-02, 6.529e-02, 4.113e-03, 2.603e-02, 2.897e-02)); + r += mul(s3_1, M4(-2.977e-02, 8.082e-02, -6.461e-03, 1.056e-01, -1.162e-02, 1.645e-02, 7.118e-02, 8.885e-04, -3.361e-02, 1.990e-01, 8.852e-03, 1.638e-01, 5.633e-02, -4.294e-02, -1.971e-02, -2.437e-02)); + r += mul(s3_2, M4(3.122e-02, -2.438e-02, -5.720e-03, -7.262e-02, 5.823e-02, -2.232e-02, -1.086e-02, 3.184e-03, 3.344e-02, 9.806e-02, 1.689e-02, 1.518e-03, 8.669e-03, -2.063e-02, 6.094e-03, 8.015e-03)); + r += mul(s3_3, M4(3.223e-02, -2.139e-02, -5.512e-02, -2.707e-02, 1.505e-01, 1.679e-02, 1.116e-01, -3.540e-02, -1.019e-01, 1.859e-01, 1.957e-02, 1.048e-02, -1.553e-01, -7.867e-02, -4.302e-02, 4.312e-03)); + r += mul(s3_4, M4(-2.339e-02, -2.018e-01, -4.587e-02, -5.147e-03, -1.460e-02, -1.873e-02, -1.039e-02, -1.318e-01, 7.216e-03, -1.232e-01, 2.339e-01, -5.143e-02, 1.457e-01, 2.479e-01, 4.917e-02, 9.243e-02)); + r += mul(s3_5, M4(-9.042e-02, -2.171e-03, 3.064e-02, -3.581e-02, -8.730e-02, -7.698e-03, -2.273e-02, -3.261e-02, -7.416e-02, 5.982e-02, 1.367e-02, 1.760e-01, 5.369e-02, -1.153e-01, -1.900e-02, -4.893e-03)); + r += mul(s3_6, M4(5.882e-02, 7.972e-03, -4.724e-02, -3.461e-02, -3.556e-02, -4.754e-02, -1.491e-01, 6.491e-02, -1.312e-01, 5.117e-02, 1.480e-01, 1.391e-01, 3.492e-02, -2.692e-02, 4.632e-03, -1.603e-02)); + r += mul(s3_7, M4(-1.485e-02, -1.118e-02, 1.468e-01, -1.223e-01, 1.117e-01, 1.987e-02, -1.356e-01, -1.361e-01, 1.004e-01, 1.534e-01, 4.730e-02, 1.054e-01, -1.001e-01, 7.442e-02, 8.265e-02, 1.123e-02)); + r += mul(s3_8, M4(-6.086e-02, 5.548e-03, -7.503e-02, 5.356e-02, 6.002e-02, 2.448e-02, -1.519e-02, -2.142e-02, 2.339e-02, 1.101e-01, 1.470e-01, 3.847e-02, -9.741e-02, -4.376e-03, -1.496e-02, 1.391e-02)); + r += mul(s4_0, M4(-3.301e-02, 2.267e-02, -4.043e-02, -2.886e-02, -5.309e-02, -6.401e-02, -4.860e-02, -1.382e-01, 4.547e-02, -1.195e-01, 2.847e-02, 1.183e-01, 1.525e-02, 6.961e-03, -8.481e-03, 2.313e-02)); + r += mul(s4_1, M4(-5.179e-02, 7.837e-02, 2.924e-02, -6.807e-02, 9.977e-02, -1.343e-01, 6.610e-02, -1.625e-01, 1.068e-01, -2.686e-01, 4.198e-02, 1.333e-01, 8.296e-02, -1.314e-01, 4.368e-02, -7.842e-02)); + r += mul(s4_2, M4(-1.260e-02, 3.823e-02, 6.907e-02, 3.324e-02, -3.521e-03, -7.009e-03, -9.421e-03, 1.509e-01, 1.365e-01, 1.235e-02, -1.439e-02, 4.430e-02, -6.141e-03, 9.008e-02, -3.424e-02, 2.807e-02)); + r += mul(s4_3, M4(1.348e-02, 3.553e-02, 2.777e-02, -4.292e-03, -3.161e-01, -5.409e-02, -2.340e-01, 5.708e-02, -2.639e-03, -9.781e-02, 7.296e-02, -1.164e-01, -8.418e-02, 4.056e-02, 9.247e-03, -1.973e-02)); + r += mul(s4_4, M4(1.374e-01, -1.948e-01, 3.840e-02, -3.181e-02, 3.337e-01, 5.918e-01, -4.292e-02, -4.522e-01, -1.993e-01, 1.913e-01, 5.210e-02, -2.841e-01, 1.024e-01, -1.802e-01, -2.334e-01, -6.746e-02)); + r += mul(s4_5, M4(-2.478e-02, -3.843e-03, 2.707e-02, 6.649e-02, 7.579e-02, -9.347e-02, 8.742e-02, -4.274e-02, 6.592e-02, 1.459e-02, -5.017e-02, -2.843e-02, -1.101e-01, 5.774e-02, 8.689e-02, -6.216e-03)); + r += mul(s4_6, M4(-7.471e-02, -3.950e-02, -2.088e-02, 2.672e-02, 8.373e-02, 6.904e-02, -4.597e-02, -1.743e-01, 2.439e-02, -9.662e-02, -3.455e-02, 1.243e-02, 7.625e-03, 3.214e-02, -1.285e-02, -9.281e-03)); + r += mul(s4_7, M4(2.173e-01, 8.858e-02, -1.822e-01, -2.232e-02, 6.016e-02, -1.324e-01, -4.636e-01, -6.116e-02, -1.560e-01, -8.520e-02, -2.715e-01, -2.290e-02, 1.059e-01, 2.833e-02, 1.261e-01, 2.703e-04)); + r += mul(s4_8, M4(6.084e-02, 1.447e-02, 1.216e-01, 3.908e-03, -1.112e-01, -1.095e-02, -3.872e-02, -1.106e-01, -8.092e-02, -2.069e-02, -2.778e-02, 2.449e-03, 3.380e-02, 1.123e-02, 5.228e-03, 1.590e-02)); + r += mul(s5_0, M4(9.058e-03, 1.953e-02, -3.575e-02, 2.096e-02, -8.534e-02, 7.803e-04, -3.327e-02, -7.176e-02, -5.335e-02, 1.376e-02, -1.116e-02, -3.823e-02, 6.955e-03, -5.436e-02, 4.908e-02, 3.213e-02)); + r += mul(s5_1, M4(-9.066e-02, 3.020e-02, -2.233e-02, -4.195e-02, 9.071e-02, -4.585e-03, 2.065e-02, 5.307e-02, 1.055e-02, 6.886e-03, 5.105e-02, -1.949e-04, 2.005e-02, 8.028e-02, 1.400e-02, -4.166e-02)); + r += mul(s5_2, M4(-7.524e-02, -3.158e-02, 5.335e-02, 1.800e-02, 5.551e-02, -4.970e-03, -8.957e-03, -1.808e-03, 3.732e-02, -2.736e-02, -1.708e-03, -5.193e-03, -7.433e-02, 1.694e-03, -5.927e-03, -5.865e-02)); + r += mul(s5_3, M4(1.841e-02, 4.228e-02, 1.305e-02, -1.773e-02, 1.443e-01, -3.841e-02, -6.603e-03, -1.000e-01, 5.555e-02, -9.809e-02, -4.187e-02, -3.300e-02, -1.449e-01, -7.725e-02, -1.307e-01, 3.371e-02)); + r += mul(s5_4, M4(2.110e-01, -1.452e-01, 8.378e-02, -6.101e-02, -1.204e-02, 3.459e-02, -1.857e-02, -5.599e-02, 1.034e-01, -7.572e-02, -1.066e-01, -2.685e-02, 1.186e-01, 1.014e-01, -7.138e-03, -1.229e-01)); + r += mul(s5_5, M4(5.220e-02, 1.147e-01, -8.863e-03, 1.597e-02, -1.671e-01, 6.502e-03, 5.946e-04, 6.353e-03, -5.116e-02, -5.064e-02, -2.231e-03, -2.255e-02, 8.614e-02, -1.615e-02, -3.855e-02, 8.267e-03)); + r += mul(s5_6, M4(-6.879e-03, -5.188e-02, -1.344e-02, 4.907e-02, -1.293e-01, -1.520e-02, -6.090e-02, 8.918e-06, -1.082e-01, -4.470e-03, -9.794e-03, -7.308e-02, 7.560e-02, -1.006e-02, -3.079e-03, -2.419e-02)); + r += mul(s5_7, M4(1.966e-01, 7.878e-02, -6.765e-03, 2.455e-02, -6.439e-03, -7.800e-03, -4.959e-04, -2.479e-02, -8.629e-03, -2.413e-02, -4.563e-02, -1.130e-02, -7.494e-02, 1.117e-02, -7.940e-02, 5.176e-02)); + r += mul(s5_8, M4(2.362e-01, -3.172e-02, 1.990e-03, 2.828e-02, -6.788e-04, 9.385e-03, 1.395e-03, 4.595e-03, 3.466e-02, -2.217e-02, -1.113e-02, 2.319e-02, 4.322e-03, 7.255e-02, 8.528e-03, -8.646e-02)); + r += mul(s6_0, M4(6.236e-04, -5.599e-03, 1.662e-03, -1.610e-02, -3.268e-02, 3.736e-02, 9.799e-03, 6.862e-02, 1.440e-01, -3.291e-02, -5.290e-02, 5.718e-02, -1.472e-02, 6.329e-03, 3.317e-04, 3.432e-03)); + r += mul(s6_1, M4(7.624e-03, -1.078e-01, 2.509e-02, -5.998e-02, 2.957e-02, 1.002e-01, 2.523e-02, -2.646e-02, 1.129e-01, 1.652e-01, 3.334e-02, 2.243e-01, 2.305e-02, -3.856e-02, -2.499e-02, -3.774e-02)); + r += mul(s6_2, M4(8.486e-03, -4.194e-02, -2.126e-03, -3.028e-03, -9.381e-03, -7.450e-05, -2.301e-03, -1.200e-02, 1.061e-01, 5.228e-02, -6.584e-02, -1.281e-01, -4.153e-03, 2.036e-02, -8.197e-03, 6.957e-04)); + r += mul(s6_3, M4(8.359e-02, -1.529e-02, 7.150e-02, 4.381e-02, 3.876e-02, 9.446e-02, 8.667e-02, 4.710e-02, -1.704e-01, 8.304e-02, 1.315e-01, 9.065e-02, -1.248e-02, 3.451e-02, -1.663e-02, -3.212e-02)); + r += mul(s6_4, M4(4.922e-02, 7.176e-02, -6.640e-02, -9.425e-02, -3.222e-02, -1.085e-01, -3.865e-02, 1.571e-01, -3.700e-01, 1.043e-01, -2.323e-02, -5.991e-02, -4.323e-02, 1.331e-02, -1.283e-02, 9.605e-02)); + r += mul(s6_5, M4(1.564e-01, -9.708e-02, -2.115e-02, 1.420e-02, 1.994e-02, -4.618e-02, 2.682e-02, 2.128e-02, -4.299e-01, 3.603e-02, -1.667e-02, 4.865e-02, 3.222e-02, -3.111e-02, 2.877e-02, 1.951e-02)); + r += mul(s6_6, M4(-5.226e-02, -3.439e-02, -1.115e-02, 1.559e-02, 1.080e-02, -4.797e-02, -5.588e-02, 3.681e-02, -1.168e-02, 8.262e-02, 3.484e-02, 3.941e-02, -3.204e-02, 5.511e-02, -2.526e-03, 2.378e-02)); + r += mul(s6_7, M4(-3.656e-02, 8.768e-03, -1.877e-02, 2.896e-02, -3.234e-02, 1.029e-01, 7.208e-02, -1.354e-02, 4.724e-02, -2.792e-02, -6.029e-02, -1.563e-01, -1.274e-01, -4.066e-02, 1.253e-01, -1.948e-03)); + r += mul(s6_8, M4(-8.171e-02, -1.723e-02, 1.593e-02, -2.655e-02, 2.431e-02, 3.102e-02, 2.482e-02, 6.723e-03, -2.363e-02, -4.291e-02, 6.611e-03, 6.381e-02, -1.239e-01, -2.593e-03, -9.796e-04, 2.874e-02)); + r += mul(s7_0, M4(1.176e-02, 5.270e-03, -1.059e-03, 1.153e-02, 3.849e-02, -5.237e-02, -1.249e-03, -3.835e-02, 5.869e-02, -2.144e-02, -2.259e-03, -4.426e-04, -8.524e-03, -1.560e-02, 6.030e-03, -2.879e-02)); + r += mul(s7_1, M4(3.799e-02, -5.750e-02, -4.045e-02, 2.964e-02, 2.058e-01, -7.604e-02, -6.212e-02, 3.370e-02, -1.373e-02, -1.059e-01, -9.752e-03, -3.277e-02, 3.861e-02, -4.689e-02, 2.058e-02, 3.350e-02)); + r += mul(s7_2, M4(-8.731e-04, 9.982e-03, 1.355e-02, 5.808e-03, 9.372e-03, -5.953e-02, 1.993e-02, -3.465e-02, 1.375e-02, -3.096e-02, 1.506e-02, 3.740e-02, -3.321e-03, 2.036e-02, 2.091e-03, -1.008e-02)); + r += mul(s7_3, M4(-8.942e-03, 2.918e-02, 1.244e-01, 3.212e-01, -2.777e-02, -3.158e-02, -3.150e-02, 8.206e-02, 2.294e-02, 7.014e-03, 1.237e-02, -1.788e-02, -6.398e-02, 1.291e-01, -1.265e-01, -1.873e-02)); + r += mul(s7_4, M4(-1.340e-02, -7.785e-02, 9.694e-02, -4.805e-01, -2.603e-01, 2.979e-01, 1.150e-01, -1.201e-03, 8.901e-02, 6.518e-02, -4.128e-02, -8.574e-03, -4.618e-02, -3.740e-01, 8.044e-03, -1.624e-01)); + r += mul(s7_5, M4(1.173e-01, -1.139e-01, -4.628e-02, 8.430e-02, 6.913e-02, -6.278e-02, -4.680e-02, -1.164e-01, -1.316e-02, 3.677e-02, 1.484e-02, -4.159e-03, -9.132e-02, 1.718e-02, 4.480e-02, 4.812e-03)); + r += mul(s7_6, M4(4.462e-02, 9.087e-03, -9.374e-02, -3.102e-03, 1.323e-01, -7.278e-02, -1.291e-02, -3.531e-02, -1.859e-02, 1.378e-02, -8.155e-03, -7.871e-03, -6.520e-02, 4.532e-02, -6.542e-03, 2.745e-02)); + r += mul(s7_7, M4(-1.086e-01, 3.684e-02, 1.988e-01, 2.470e-01, 2.397e-01, -2.523e-02, -1.419e-01, 4.321e-02, 1.231e-02, -1.233e-02, 2.661e-02, 7.225e-03, -8.916e-04, -2.241e-01, -9.885e-03, -6.903e-02)); + r += mul(s7_8, M4(7.242e-02, -3.178e-02, 3.298e-02, -8.243e-02, -5.032e-02, -3.423e-02, 1.194e-02, -3.255e-02, 6.636e-02, 1.658e-02, -5.523e-03, -2.126e-02, -8.023e-02, 4.985e-02, -5.195e-02, 3.102e-02)); + r += V4(2.176e-03, 6.722e-03, 4.071e-04, 1.471e-03); + return r; +} + +V4 f3(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(9.681e-03, -3.008e-02, -4.885e-02, -1.980e-02, -2.557e-02, 8.902e-03, 2.876e-02, 3.702e-02, -3.984e-03, -5.590e-02, 3.719e-02, -5.321e-02, 4.944e-03, 2.265e-02, -5.642e-02, -3.355e-02)); + r += mul(s0_1, M4(1.749e-02, 4.415e-02, -4.624e-02, -1.619e-02, -5.776e-02, -3.455e-03, 9.170e-03, -3.880e-02, -4.960e-02, -3.457e-02, 7.778e-02, 9.934e-02, 3.774e-02, 9.627e-02, -1.190e-01, -2.539e-02)); + r += mul(s0_2, M4(-2.970e-02, -1.385e-02, -1.654e-02, 1.286e-02, 1.187e-02, -1.049e-02, -5.015e-03, 3.357e-02, 9.840e-02, 3.333e-02, 3.595e-02, -6.867e-02, -1.029e-01, -9.563e-03, -3.838e-02, 1.842e-02)); + r += mul(s0_3, M4(2.468e-03, -3.105e-03, 3.139e-02, -3.924e-04, 4.153e-02, 4.857e-02, 2.048e-02, -3.807e-02, -9.976e-03, 3.462e-02, 3.193e-02, -9.280e-03, -8.785e-02, 3.561e-03, 5.118e-02, 1.315e-01)); + r += mul(s0_4, M4(1.860e-03, -2.834e-02, -3.496e-02, -1.925e-01, -1.548e-01, -2.941e-02, -1.305e-01, -1.316e-01, -3.740e-02, 2.467e-01, 2.256e-01, 5.527e-02, 2.511e-01, -1.136e-01, 3.445e-02, -2.657e-01)); + r += mul(s0_5, M4(-3.462e-02, 1.757e-02, -3.593e-03, -4.448e-03, -3.035e-02, 6.164e-02, 8.270e-03, 3.816e-02, -5.575e-02, -4.886e-02, 1.928e-02, 2.159e-02, -2.496e-01, 3.416e-02, -1.923e-02, -2.403e-02)); + r += mul(s0_6, M4(-9.527e-03, 1.884e-03, 3.132e-02, 3.839e-02, 1.489e-02, 5.617e-03, 4.702e-03, 2.492e-02, -3.944e-02, 8.726e-03, -3.927e-03, 3.775e-04, 1.182e-02, 4.459e-02, 1.514e-02, -1.748e-03)); + r += mul(s0_7, M4(-5.730e-02, -3.515e-03, 4.216e-02, 1.560e-02, -1.060e-01, 2.248e-02, 1.111e-02, 9.832e-03, 7.457e-02, 3.146e-03, -8.370e-02, -1.173e-01, -2.263e-03, -1.129e-02, 2.702e-02, -3.823e-02)); + r += mul(s0_8, M4(-7.514e-03, 1.146e-02, 3.054e-02, -1.619e-02, -1.817e-02, -6.031e-03, -3.696e-02, -2.777e-02, -4.793e-02, 1.139e-02, -1.696e-03, 6.132e-02, -2.482e-02, 9.432e-03, 3.504e-02, -2.315e-03)); + r += mul(s1_0, M4(1.862e-03, 3.773e-02, -8.036e-02, 1.519e-01, -3.710e-03, 2.376e-02, 3.439e-02, 2.167e-02, 2.711e-02, 5.150e-02, 3.869e-02, 2.169e-02, 1.250e-02, -1.996e-02, -1.736e-01, -8.277e-02)); + r += mul(s1_1, M4(-2.311e-02, -1.085e-01, -3.403e-02, -2.320e-01, -2.981e-02, -1.928e-02, 2.786e-02, -4.477e-02, 1.169e-01, -1.826e-01, 1.570e-01, -9.813e-02, 9.840e-02, 8.023e-02, -2.586e-01, 1.433e-01)); + r += mul(s1_2, M4(1.803e-03, 4.658e-02, -1.892e-02, 2.893e-02, -1.528e-02, 1.273e-02, 2.555e-03, 8.782e-03, -5.553e-03, 7.205e-02, 6.603e-02, 6.278e-02, -1.120e-01, -6.004e-02, -1.222e-01, 1.163e-02)); + r += mul(s1_3, M4(-1.018e-01, -4.000e-02, 2.640e-02, 2.042e-02, 5.657e-02, 4.927e-02, 3.377e-02, -2.825e-02, 1.425e-02, -2.015e-02, -8.182e-02, -2.919e-02, -7.378e-02, 2.429e-02, 1.319e-01, 7.956e-02)); + r += mul(s1_4, M4(1.068e-01, -9.681e-02, 1.092e-01, -5.858e-01, -1.574e-01, -1.582e-01, -2.159e-01, -1.526e-01, 9.058e-02, 9.935e-02, -2.312e-02, 5.522e-01, 3.799e-01, -2.598e-01, 1.344e-01, -1.568e-01)); + r += mul(s1_5, M4(-1.111e-02, -9.091e-02, -1.685e-02, -4.801e-02, -2.188e-02, 2.544e-03, -7.639e-02, 3.189e-02, -5.523e-02, 1.968e-01, 1.340e-01, -8.667e-02, -3.461e-01, 9.813e-03, 3.383e-02, 5.120e-02)); + r += mul(s1_6, M4(-3.401e-04, 4.871e-02, 1.394e-02, 8.957e-02, 2.540e-02, 3.912e-02, 3.234e-02, -1.502e-02, -1.504e-02, 5.820e-04, -1.122e-02, 7.805e-03, 4.213e-02, 1.403e-02, -7.371e-02, 5.537e-02)); + r += mul(s1_7, M4(5.145e-02, 1.466e-02, -1.231e-02, -2.232e-01, -9.556e-02, -4.633e-03, 4.627e-02, 3.679e-02, 6.171e-02, 7.696e-02, -2.454e-02, -6.367e-03, 2.456e-02, -2.865e-02, -3.183e-02, -2.806e-02)); + r += mul(s1_8, M4(-5.166e-02, 4.631e-02, 4.860e-02, 4.666e-02, 3.595e-04, -3.630e-03, 1.516e-02, -9.129e-03, -6.539e-02, -1.232e-02, -1.745e-02, -9.037e-02, -7.875e-02, -1.470e-02, -1.751e-02, -2.477e-02)); + r += mul(s2_0, M4(-2.081e-02, -2.560e-02, 7.354e-03, 1.161e-02, 6.217e-03, -2.986e-02, 1.154e-02, 2.615e-02, -2.085e-02, 9.902e-03, 2.071e-03, -5.216e-04, 5.957e-02, -7.398e-03, 2.064e-02, 1.406e-01)); + r += mul(s2_1, M4(3.722e-02, 5.744e-02, 1.443e-01, -2.925e-02, 1.370e-02, 1.174e-01, 1.074e-01, -3.303e-02, 8.991e-03, 3.061e-03, 3.371e-03, 1.175e-02, -5.190e-02, -6.181e-02, 1.753e-01, -1.287e-01)); + r += mul(s2_2, M4(-4.176e-02, -6.274e-04, 3.549e-02, -3.713e-02, -9.366e-02, 1.537e-02, 2.337e-02, -3.934e-02, 2.923e-02, 1.346e-02, 7.163e-03, 1.328e-02, 4.833e-03, 4.618e-02, -5.331e-02, -3.940e-02)); + r += mul(s2_3, M4(8.528e-03, -5.794e-02, 2.796e-02, 3.357e-02, -8.052e-02, -9.799e-02, -3.645e-02, 5.612e-02, -1.166e-02, -4.189e-02, -1.061e-02, 7.611e-03, 2.040e-02, 2.967e-02, -6.062e-02, 6.390e-02)); + r += mul(s2_4, M4(-4.279e-02, -5.724e-02, 4.008e-03, -5.154e-02, -1.041e-02, -1.733e-01, -1.431e-01, -3.059e-03, 1.470e-02, 2.059e-02, -5.137e-02, -9.846e-03, 4.126e-02, 2.147e-01, 2.649e-02, -1.278e-01)); + r += mul(s2_5, M4(-1.001e-01, -6.696e-02, 8.699e-03, -5.281e-02, -3.896e-02, -5.937e-02, -3.633e-02, -1.026e-02, 5.608e-02, -5.115e-02, 2.682e-03, -1.474e-02, -2.244e-01, -3.160e-02, 3.403e-02, 7.687e-02)); + r += mul(s2_6, M4(4.213e-03, -2.668e-02, -2.583e-02, 1.132e-02, 1.083e-02, 5.358e-02, 1.379e-02, -5.371e-02, -2.338e-02, 9.030e-03, 1.420e-02, -1.605e-02, 9.140e-03, -8.769e-03, -3.644e-02, -1.330e-02)); + r += mul(s2_7, M4(-4.586e-02, -4.933e-04, -9.498e-02, 1.749e-02, -1.759e-02, 4.007e-02, 6.127e-02, -5.414e-02, 9.016e-03, -2.079e-03, 3.343e-03, 1.004e-02, 7.801e-03, 1.966e-02, 4.390e-03, -2.055e-02)); + r += mul(s2_8, M4(7.917e-03, -7.674e-02, -3.768e-02, -2.986e-02, -3.577e-03, 6.074e-02, 2.197e-02, 1.776e-02, -1.944e-02, 3.794e-02, 1.098e-02, 4.473e-03, -7.910e-02, -9.479e-03, -2.516e-02, -4.335e-03)); + r += mul(s3_0, M4(-2.815e-02, -2.422e-03, 1.804e-02, -5.957e-03, 6.596e-02, -1.254e-01, 6.526e-02, 4.307e-02, -1.893e-02, 3.540e-02, 6.049e-02, -4.571e-02, -2.629e-03, 1.568e-02, -7.711e-03, 8.974e-03)); + r += mul(s3_1, M4(2.423e-02, 4.847e-02, 1.679e-02, -5.669e-04, -4.052e-03, 1.177e-01, 1.660e-01, 1.093e-02, -5.386e-02, -9.583e-03, -1.242e-01, 4.574e-02, -2.228e-02, -3.213e-02, 1.371e-01, 5.518e-03)); + r += mul(s3_2, M4(-8.338e-02, -1.656e-02, 2.950e-03, -3.721e-02, -3.461e-02, 3.840e-04, 4.377e-02, -1.068e-02, -4.114e-02, 4.027e-02, 4.902e-02, -7.158e-02, 2.055e-02, 6.079e-02, 3.644e-02, 4.520e-02)); + r += mul(s3_3, M4(-5.441e-03, -4.069e-02, 7.030e-02, -2.745e-02, 3.331e-02, -1.003e-01, -4.375e-01, 1.753e-01, -8.514e-02, -9.203e-04, 1.121e-01, -9.410e-02, -2.350e-02, 2.985e-02, 3.703e-02, 8.273e-02)); + r += mul(s3_4, M4(5.347e-02, -7.722e-01, 1.841e-01, -5.509e-02, 8.975e-02, -2.680e-01, -3.254e-01, -1.064e-01, 1.529e-01, -6.629e-02, 4.410e-01, 1.618e-01, 2.479e-02, 1.833e-01, 9.445e-02, -2.289e-01)); + r += mul(s3_5, M4(5.126e-02, 5.849e-02, -5.219e-03, 9.645e-02, 9.359e-02, -3.570e-02, -8.843e-02, 1.006e-02, -2.361e-01, 7.791e-02, 7.898e-02, -3.856e-02, -1.233e-01, -6.706e-04, 2.387e-02, 4.867e-02)); + r += mul(s3_6, M4(-1.548e-02, 3.366e-02, 7.603e-02, 5.374e-02, 9.097e-03, 5.063e-02, -8.491e-04, 7.755e-03, -6.799e-02, 5.193e-02, 3.761e-04, 1.009e-02, -1.239e-02, -1.220e-02, -4.171e-03, 1.343e-02)); + r += mul(s3_7, M4(2.320e-03, -9.519e-02, -4.596e-02, 3.958e-02, -2.254e-02, -3.177e-02, 7.613e-03, -5.295e-02, -3.478e-02, 5.697e-02, -7.504e-02, -1.152e-01, 5.974e-03, -3.027e-03, 6.663e-03, -1.355e-02)); + r += mul(s3_8, M4(2.738e-02, -6.541e-03, -1.734e-02, -3.262e-02, -4.650e-03, 1.989e-02, 2.403e-02, 7.109e-03, -7.896e-02, -3.010e-02, -3.856e-02, -4.335e-02, -4.571e-02, -2.111e-02, -3.043e-02, 1.725e-02)); + r += mul(s4_0, M4(-1.964e-02, -3.675e-02, 2.942e-02, -1.417e-02, -8.570e-02, 2.328e-02, -1.705e-01, -3.193e-04, 6.156e-02, -2.407e-02, -2.030e-02, -6.600e-02, 3.456e-02, -1.314e-02, 1.694e-02, -3.869e-02)); + r += mul(s4_1, M4(-2.846e-02, -1.182e-01, -1.167e-02, 9.350e-03, -2.006e-01, -7.553e-02, 5.109e-02, -2.008e-02, 9.335e-02, 2.042e-02, 2.823e-01, 2.446e-01, -1.102e-01, 9.506e-02, -1.160e-01, 2.432e-01)); + r += mul(s4_2, M4(4.094e-02, -2.665e-02, 1.606e-01, -5.195e-02, 9.016e-03, 6.199e-02, 5.034e-02, 2.114e-02, 1.492e-01, -3.953e-02, 3.046e-02, 1.560e-03, 4.637e-02, -3.696e-03, 2.390e-03, -1.347e-01)); + r += mul(s4_3, M4(-1.473e-02, -3.120e-02, 9.582e-02, -5.774e-02, -1.346e-02, -1.387e-01, -1.362e-01, -1.796e-01, -9.409e-02, -2.495e-01, 4.522e-02, 2.231e-01, -3.688e-02, 6.567e-02, 4.169e-02, 4.207e-02)); + r += mul(s4_4, M4(-1.090e-02, 3.370e-03, 2.411e-01, 8.764e-03, -6.157e-02, 1.821e-01, 8.114e-02, -4.756e-01, 1.711e-01, 2.427e-01, 7.778e-02, 7.863e-02, 9.319e-02, -1.679e-01, -1.381e-01, 6.603e-02)); + r += mul(s4_5, M4(-1.301e-01, 7.742e-02, 1.319e-01, 7.278e-02, -3.592e-02, 2.957e-02, 4.727e-02, 5.763e-02, 1.522e-01, -3.927e-02, -1.522e-02, -9.234e-02, -1.164e-01, -1.746e-02, -1.671e-02, 2.957e-02)); + r += mul(s4_6, M4(1.661e-02, -7.393e-03, -4.879e-02, 3.085e-03, 4.210e-02, -4.314e-02, -3.971e-02, -7.896e-02, 2.791e-02, 6.567e-02, -2.164e-02, -4.939e-03, 2.815e-02, 3.187e-02, 1.803e-02, -4.191e-03)); + r += mul(s4_7, M4(8.770e-03, -4.219e-02, -5.425e-02, -6.481e-02, -3.305e-02, 6.806e-02, 1.077e-01, 1.753e-01, -4.405e-02, 3.918e-02, -1.311e-02, -2.641e-03, 2.801e-02, 3.008e-02, 4.854e-02, -8.295e-03)); + r += mul(s4_8, M4(-9.797e-03, 1.242e-03, -2.370e-02, -2.221e-02, -6.149e-03, -1.874e-02, -1.991e-02, -2.733e-02, -3.855e-02, -2.105e-02, 2.489e-03, 2.475e-02, -5.248e-03, 4.986e-02, -4.264e-04, -2.850e-02)); + r += mul(s5_0, M4(7.117e-03, 2.173e-02, 3.156e-02, 5.267e-03, 8.027e-03, -4.454e-02, -7.556e-02, -3.434e-02, -3.034e-02, 4.286e-03, -1.329e-03, 9.390e-02, 2.082e-02, 4.265e-02, 2.317e-02, 9.256e-02)); + r += mul(s5_1, M4(-1.828e-02, -6.204e-02, -4.113e-02, -6.140e-02, -7.433e-03, -2.275e-02, -1.067e-01, -4.810e-02, 3.146e-02, 1.470e-02, 9.895e-02, 7.080e-02, 2.503e-02, -1.323e-01, -5.634e-02, -1.158e-01)); + r += mul(s5_2, M4(2.929e-02, 7.951e-02, 6.912e-02, 1.737e-02, 4.312e-02, 1.538e-03, -5.973e-03, 2.283e-02, -9.977e-03, -7.604e-03, 1.749e-02, -8.725e-03, 2.287e-02, 1.039e-02, -5.078e-02, 3.387e-02)); + r += mul(s5_3, M4(2.977e-02, -8.352e-03, -1.156e-02, 1.297e-02, -3.331e-02, -1.692e-03, 3.981e-02, -1.112e-02, 4.806e-03, -5.421e-02, 2.894e-02, 7.254e-02, -6.607e-03, 7.883e-03, -7.508e-02, -3.811e-02)); + r += mul(s5_4, M4(-3.712e-02, -2.705e-01, -8.473e-03, 4.084e-02, 2.750e-02, -2.059e-02, 5.705e-02, 5.270e-02, 1.364e-02, -4.693e-03, -8.906e-02, -3.422e-02, -9.573e-02, 1.385e-02, 1.578e-01, 2.145e-02)); + r += mul(s5_5, M4(-5.351e-02, -1.961e-02, 4.591e-03, -3.584e-02, -1.286e-02, -3.033e-02, -3.979e-02, -1.666e-02, 4.667e-02, -3.338e-02, -4.259e-02, 5.857e-02, 1.343e-01, 4.236e-02, 1.804e-02, -1.117e-01)); + r += mul(s5_6, M4(1.295e-02, 3.869e-02, 7.838e-04, 1.346e-02, 1.874e-02, -2.082e-02, -4.106e-02, -1.802e-02, 2.252e-02, -2.069e-02, -3.166e-02, -2.319e-02, 2.788e-02, -1.365e-02, -3.017e-03, 3.420e-02)); + r += mul(s5_7, M4(-2.580e-03, -6.460e-03, 2.103e-02, -5.888e-02, 1.605e-02, 1.482e-02, 1.040e-02, -3.538e-02, -7.412e-03, -4.952e-03, -2.650e-04, 3.137e-02, -4.772e-02, 4.511e-02, -1.680e-02, 1.280e-02)); + r += mul(s5_8, M4(3.699e-02, 4.401e-02, 2.479e-02, 2.072e-02, -3.227e-03, 1.561e-02, -1.124e-02, 4.791e-03, 1.048e-02, 6.933e-03, -5.328e-04, 3.336e-02, -1.840e-02, -4.067e-02, 6.226e-03, -5.353e-02)); + r += mul(s6_0, M4(1.188e-02, -4.641e-02, -1.262e-02, -1.655e-02, 3.987e-03, 3.772e-02, 1.940e-02, -3.615e-02, -2.383e-02, -2.400e-02, 2.002e-01, -2.954e-02, 1.634e-02, 6.644e-03, -4.035e-03, 4.184e-03)); + r += mul(s6_1, M4(2.277e-02, 4.263e-03, -4.491e-02, 4.744e-02, -7.567e-02, 2.924e-02, -1.726e-02, 5.299e-02, 1.664e-01, -1.233e-01, 2.356e-03, -2.703e-01, -5.187e-02, -3.551e-02, 3.325e-02, 6.128e-02)); + r += mul(s6_2, M4(1.989e-02, 6.053e-03, 1.846e-02, 6.184e-02, -2.607e-02, -2.363e-02, 4.897e-02, -4.577e-02, 3.373e-01, -9.162e-02, 4.499e-02, 8.682e-02, 4.547e-02, 4.030e-03, 7.774e-04, 1.701e-03)); + r += mul(s6_3, M4(-5.472e-02, -3.444e-03, 1.608e-02, 6.295e-02, 1.196e-02, 6.397e-02, 5.240e-04, -1.021e-02, -3.050e-02, 5.217e-02, -8.370e-02, -1.127e-01, 2.977e-02, 6.301e-02, -1.641e-02, -3.698e-02)); + r += mul(s6_4, M4(7.836e-02, -1.085e-02, 6.898e-02, -1.623e-01, 5.813e-02, -1.794e-02, -7.797e-03, -6.090e-02, 7.416e-02, 1.549e-01, 9.543e-03, -1.116e-01, -1.078e-01, 1.926e-01, -5.152e-02, 1.227e-01)); + r += mul(s6_5, M4(1.059e-02, 2.364e-02, 2.401e-02, 6.629e-02, -7.339e-02, -3.505e-02, -9.375e-02, 1.857e-02, 8.049e-02, -3.784e-02, -3.831e-03, -1.878e-02, 1.048e-01, -2.087e-02, -7.422e-03, -4.039e-03)); + r += mul(s6_6, M4(-2.365e-03, -9.990e-03, -5.154e-02, 2.194e-02, 3.747e-02, 2.086e-02, -3.379e-02, 3.596e-03, -2.596e-02, 2.081e-03, 3.514e-02, -5.221e-02, 1.538e-02, 5.609e-02, 5.790e-02, -4.784e-02)); + r += mul(s6_7, M4(-1.720e-02, -1.905e-02, -2.715e-02, -2.962e-02, -1.308e-02, -1.083e-02, 2.486e-02, -3.409e-03, 2.073e-02, -2.824e-02, 8.650e-03, 2.239e-02, -1.353e-02, 1.140e-01, 2.117e-01, 8.122e-02)); + r += mul(s6_8, M4(5.500e-03, -2.479e-02, -3.083e-02, 3.443e-06, 8.760e-03, -2.614e-02, -1.346e-02, 1.243e-02, 1.106e-01, 5.146e-02, 1.032e-03, 2.408e-02, 1.198e-02, 6.767e-02, 3.023e-02, 7.031e-03)); + r += mul(s7_0, M4(-7.089e-03, -4.844e-02, -1.208e-02, -3.648e-02, 1.701e-02, 4.478e-02, -1.072e-01, 6.097e-02, -1.165e-03, -3.233e-02, -6.162e-02, 1.612e-03, -6.546e-03, -1.170e-02, -9.039e-03, -6.963e-02)); + r += mul(s7_1, M4(5.550e-02, -1.003e-02, -1.168e-01, 8.157e-02, 2.255e-02, -3.154e-02, -1.085e-01, -3.478e-02, 4.729e-02, -3.235e-02, -7.653e-02, 7.446e-02, -3.744e-02, 1.918e-02, -3.136e-02, 9.058e-02)); + r += mul(s7_2, M4(2.581e-02, -1.672e-02, 2.845e-03, 2.215e-02, 3.825e-02, -1.008e-02, 6.349e-03, 7.030e-02, 6.275e-02, 1.736e-02, -2.221e-02, 2.294e-02, 5.530e-02, -1.884e-02, -8.266e-03, -6.339e-03)); + r += mul(s7_3, M4(4.480e-02, 4.562e-02, -1.532e-01, 2.755e-02, -7.727e-03, -7.523e-02, -9.262e-02, 6.129e-02, -9.996e-03, 1.562e-02, 2.900e-02, -8.342e-03, -5.049e-02, 1.154e-01, 1.553e-01, -4.222e-02)); + r += mul(s7_4, M4(-2.480e-01, -4.181e-02, 8.623e-02, 2.482e-02, 9.856e-02, -7.836e-02, -1.145e-01, -2.366e-01, -6.881e-03, 5.524e-02, 1.590e-02, -9.871e-03, -5.909e-02, -6.382e-02, 2.760e-01, 1.855e-01)); + r += mul(s7_5, M4(-2.085e-01, 6.150e-02, 4.880e-02, -1.906e-02, -1.101e-01, -9.671e-02, -3.984e-02, 3.062e-02, 1.820e-02, 8.405e-03, 2.241e-02, -4.043e-02, 2.095e-01, 8.533e-02, 4.196e-02, 4.850e-02)); + r += mul(s7_6, M4(-4.355e-02, -5.505e-02, -1.267e-01, -5.453e-02, 4.345e-02, 1.526e-02, -1.739e-02, 1.774e-02, -2.131e-02, 4.405e-03, 9.372e-03, 1.876e-02, -3.428e-02, 5.894e-02, 5.885e-02, -3.260e-02)); + r += mul(s7_7, M4(8.225e-04, 4.162e-02, 1.538e-01, -4.316e-03, -2.047e-02, -8.498e-03, 7.413e-03, 9.833e-02, -1.454e-02, 1.027e-02, 1.865e-03, 1.100e-02, 4.003e-02, 2.181e-02, 1.353e-01, 1.522e-01)); + r += mul(s7_8, M4(2.791e-02, 1.638e-02, -1.935e-02, 2.872e-03, -1.592e-02, 1.637e-02, 6.777e-03, 3.492e-03, -1.286e-02, -5.990e-03, 7.047e-03, -2.066e-02, 6.342e-03, 6.939e-02, 4.972e-02, -3.984e-02)); + r += V4(-4.684e-03, 6.890e-04, -5.830e-05, -5.559e-03); + return r; +} + +void Pass9(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = Rmp8x8(tid.x) + blockStart; + uint2 size = GetInputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = (gxy + 0.5) * pt; + + V4 s0_0 = l0(-1.0, -1.0); + V4 s0_1 = l0(0.0, -1.0); + V4 s0_2 = l0(1.0, -1.0); + V4 s0_3 = l0(-1.0, 0.0); + V4 s0_4 = l0(0.0, 0.0); + V4 s0_5 = l0(1.0, 0.0); + V4 s0_6 = l0(-1.0, 1.0); + V4 s0_7 = l0(0.0, 1.0); + V4 s0_8 = l0(1.0, 1.0); + V4 s1_0 = -max(-s0_0, 0.0); + V4 s1_1 = -max(-s0_1, 0.0); + V4 s1_2 = -max(-s0_2, 0.0); + V4 s1_3 = -max(-s0_3, 0.0); + V4 s1_4 = -max(-s0_4, 0.0); + V4 s1_5 = -max(-s0_5, 0.0); + V4 s1_6 = -max(-s0_6, 0.0); + V4 s1_7 = -max(-s0_7, 0.0); + V4 s1_8 = -max(-s0_8, 0.0); + s0_0 = max(s0_0, 0.0); + s0_1 = max(s0_1, 0.0); + s0_2 = max(s0_2, 0.0); + s0_3 = max(s0_3, 0.0); + s0_4 = max(s0_4, 0.0); + s0_5 = max(s0_5, 0.0); + s0_6 = max(s0_6, 0.0); + s0_7 = max(s0_7, 0.0); + s0_8 = max(s0_8, 0.0); + + V4 s2_0 = l1(-1.0, -1.0); + V4 s2_1 = l1(0.0, -1.0); + V4 s2_2 = l1(1.0, -1.0); + V4 s2_3 = l1(-1.0, 0.0); + V4 s2_4 = l1(0.0, 0.0); + V4 s2_5 = l1(1.0, 0.0); + V4 s2_6 = l1(-1.0, 1.0); + V4 s2_7 = l1(0.0, 1.0); + V4 s2_8 = l1(1.0, 1.0); + V4 s3_0 = -max(-s2_0, 0.0); + V4 s3_1 = -max(-s2_1, 0.0); + V4 s3_2 = -max(-s2_2, 0.0); + V4 s3_3 = -max(-s2_3, 0.0); + V4 s3_4 = -max(-s2_4, 0.0); + V4 s3_5 = -max(-s2_5, 0.0); + V4 s3_6 = -max(-s2_6, 0.0); + V4 s3_7 = -max(-s2_7, 0.0); + V4 s3_8 = -max(-s2_8, 0.0); + s2_0 = max(s2_0, 0.0); + s2_1 = max(s2_1, 0.0); + s2_2 = max(s2_2, 0.0); + s2_3 = max(s2_3, 0.0); + s2_4 = max(s2_4, 0.0); + s2_5 = max(s2_5, 0.0); + s2_6 = max(s2_6, 0.0); + s2_7 = max(s2_7, 0.0); + s2_8 = max(s2_8, 0.0); + + V4 s4_0 = l2(-1.0, -1.0); + V4 s4_1 = l2(0.0, -1.0); + V4 s4_2 = l2(1.0, -1.0); + V4 s4_3 = l2(-1.0, 0.0); + V4 s4_4 = l2(0.0, 0.0); + V4 s4_5 = l2(1.0, 0.0); + V4 s4_6 = l2(-1.0, 1.0); + V4 s4_7 = l2(0.0, 1.0); + V4 s4_8 = l2(1.0, 1.0); + V4 s5_0 = -max(-s4_0, 0.0); + V4 s5_1 = -max(-s4_1, 0.0); + V4 s5_2 = -max(-s4_2, 0.0); + V4 s5_3 = -max(-s4_3, 0.0); + V4 s5_4 = -max(-s4_4, 0.0); + V4 s5_5 = -max(-s4_5, 0.0); + V4 s5_6 = -max(-s4_6, 0.0); + V4 s5_7 = -max(-s4_7, 0.0); + V4 s5_8 = -max(-s4_8, 0.0); + s4_0 = max(s4_0, 0.0); + s4_1 = max(s4_1, 0.0); + s4_2 = max(s4_2, 0.0); + s4_3 = max(s4_3, 0.0); + s4_4 = max(s4_4, 0.0); + s4_5 = max(s4_5, 0.0); + s4_6 = max(s4_6, 0.0); + s4_7 = max(s4_7, 0.0); + s4_8 = max(s4_8, 0.0); + + V4 s6_0 = l3(-1.0, -1.0); + V4 s6_1 = l3(0.0, -1.0); + V4 s6_2 = l3(1.0, -1.0); + V4 s6_3 = l3(-1.0, 0.0); + V4 s6_4 = l3(0.0, 0.0); + V4 s6_5 = l3(1.0, 0.0); + V4 s6_6 = l3(-1.0, 1.0); + V4 s6_7 = l3(0.0, 1.0); + V4 s6_8 = l3(1.0, 1.0); + V4 s7_0 = -max(-s6_0, 0.0); + V4 s7_1 = -max(-s6_1, 0.0); + V4 s7_2 = -max(-s6_2, 0.0); + V4 s7_3 = -max(-s6_3, 0.0); + V4 s7_4 = -max(-s6_4, 0.0); + V4 s7_5 = -max(-s6_5, 0.0); + V4 s7_6 = -max(-s6_6, 0.0); + V4 s7_7 = -max(-s6_7, 0.0); + V4 s7_8 = -max(-s6_8, 0.0); + s6_0 = max(s6_0, 0.0); + s6_1 = max(s6_1, 0.0); + s6_2 = max(s6_2, 0.0); + s6_3 = max(s6_3, 0.0); + s6_4 = max(s6_4, 0.0); + s6_5 = max(s6_5, 0.0); + s6_6 = max(s6_6, 0.0); + s6_7 = max(s6_7, 0.0); + s6_8 = max(s6_8, 0.0); + + t0[gxy] = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t1[gxy] = f1(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t2[gxy] = f2(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + t3[gxy] = f3(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); +} + +//!PASS 10 +//!DESC out-shuffle +//!BLOCK_SIZE 16 +//!NUM_THREADS 64 +//!IN INPUT, t0, t1, t2, t3 +//!OUT OUTPUT + +#define l0(x, y) V4(O(t0, float2(x, y))) +#define l1(x, y) V4(O(t1, float2(x, y))) +#define l2(x, y) V4(O(t2, float2(x, y))) +#define l3(x, y) V4(O(t3, float2(x, y))) + +V4 f0(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8, V4 s4_0, V4 s4_1, V4 s4_2, V4 s4_3, V4 s4_4, V4 s4_5, V4 s4_6, V4 s4_7, V4 s4_8, V4 s5_0, V4 s5_1, V4 s5_2, V4 s5_3, V4 s5_4, V4 s5_5, V4 s5_6, V4 s5_7, V4 s5_8, V4 s6_0, V4 s6_1, V4 s6_2, V4 s6_3, V4 s6_4, V4 s6_5, V4 s6_6, V4 s6_7, V4 s6_8, V4 s7_0, V4 s7_1, V4 s7_2, V4 s7_3, V4 s7_4, V4 s7_5, V4 s7_6, V4 s7_7, V4 s7_8) { + V4 r = 0.0; + r += mul(s0_0, M4(6.033e-02, 3.884e-03, 4.972e-03, 1.856e-02, -2.252e-02, -6.567e-03, 1.834e-03, 1.889e-03, -3.430e-02, -5.868e-03, -2.753e-02, -9.852e-03, 1.149e-01, 5.219e-03, -9.645e-02, -1.800e-02)); + r += mul(s0_1, M4(-1.126e-02, 2.901e-02, 4.006e-03, -6.551e-03, 4.707e-03, -2.672e-02, -1.670e-03, 1.306e-02, 2.051e-02, -2.240e-02, 3.236e-02, 4.654e-03, 1.470e-01, -3.097e-01, 4.721e-02, 1.152e-01)); + r += mul(s0_2, M4(4.366e-03, -2.694e-03, 5.250e-03, 5.320e-03, 4.481e-03, 1.638e-02, 9.726e-03, 4.904e-03, -1.148e-03, 2.204e-02, -8.883e-03, 6.839e-05, -2.482e-02, 6.181e-02, 2.736e-03, -8.909e-03)); + r += mul(s0_3, M4(-7.610e-03, 7.788e-03, 1.847e-02, -2.180e-02, 2.830e-02, 6.135e-03, 8.182e-03, 1.302e-02, 2.205e-02, 2.265e-02, 1.210e-02, 1.428e-02, 4.035e-02, 3.488e-02, 2.405e-02, -6.122e-04)); + r += mul(s0_4, M4(1.537e-02, 1.506e-02, -7.631e-03, 4.580e-02, -5.733e-03, 5.314e-02, -1.093e-01, -1.055e-01, -3.086e-02, -3.601e-02, -5.565e-02, -3.967e-02, 7.196e-02, -4.304e-02, -1.039e-01, 2.038e-01)); + r += mul(s0_5, M4(9.955e-04, -1.193e-02, -6.331e-03, -1.254e-02, -1.031e-02, -3.337e-02, 4.839e-03, -1.563e-03, 8.448e-04, -4.703e-03, 1.218e-02, -3.763e-03, 1.555e-02, 6.467e-02, 4.887e-03, -1.659e-02)); + r += mul(s0_6, M4(-9.537e-03, -8.011e-04, -1.289e-02, -2.877e-03, -1.477e-03, 8.749e-04, 8.176e-03, -4.993e-03, -1.018e-03, 1.302e-03, 1.075e-03, 4.430e-03, -8.630e-03, -1.426e-02, 1.284e-03, -6.897e-03)); + r += mul(s0_7, M4(-9.303e-03, -1.874e-02, -7.506e-03, -3.287e-03, 1.361e-03, -8.719e-03, 1.358e-02, 3.613e-02, 1.732e-03, 3.429e-03, 5.717e-03, -5.605e-03, -2.391e-02, -5.230e-03, -4.358e-02, -1.130e-02)); + r += mul(s0_8, M4(-4.785e-03, -2.385e-03, -1.026e-03, -1.010e-02, -6.487e-04, 6.573e-03, -1.054e-03, -7.562e-03, 1.978e-03, 1.197e-03, 2.030e-03, 9.124e-03, -3.354e-03, 3.436e-03, 2.368e-02, -4.266e-02)); + r += mul(s1_0, M4(-1.529e-01, 2.039e-01, 8.447e-03, 3.038e-02, -1.505e-02, -1.508e-02, 7.441e-03, 6.314e-03, -3.746e-02, -3.202e-02, -2.150e-02, -3.430e-02, -1.702e-02, 5.759e-03, -3.104e-02, -2.623e-03)); + r += mul(s1_1, M4(-1.082e-03, 4.792e-02, 6.862e-03, -2.338e-02, 8.142e-03, 2.402e-03, 8.938e-03, 1.018e-02, 1.801e-01, 1.204e-01, 1.753e-01, 1.470e-01, 4.248e-02, -2.265e-02, 4.831e-02, -7.421e-03)); + r += mul(s1_2, M4(3.095e-03, -2.495e-03, 5.918e-03, 7.425e-03, 1.247e-03, 1.278e-02, 7.347e-03, 1.108e-02, -2.195e-02, 3.677e-02, -3.238e-02, 3.665e-03, -6.743e-03, 7.914e-03, 3.957e-03, -1.294e-03)); + r += mul(s1_3, M4(-6.194e-02, 9.325e-02, -2.823e-01, 2.610e-01, 1.242e-01, 1.063e-02, -9.538e-02, 1.163e-02, 6.713e-03, 1.593e-02, -1.142e-02, -7.270e-06, 4.482e-02, 2.000e-02, 5.476e-02, 1.686e-02)); + r += mul(s1_4, M4(3.596e-02, -2.554e-02, 9.773e-03, 7.261e-02, 1.376e-01, 2.608e-01, -2.402e-01, -3.362e-01, -6.171e-02, -6.656e-02, -5.303e-02, -5.042e-02, 8.435e-02, 4.511e-02, -6.856e-02, -1.688e-02)); + r += mul(s1_5, M4(-4.948e-03, -1.384e-02, -9.850e-03, -1.294e-02, -8.958e-03, -2.200e-02, 4.866e-03, -1.164e-02, -1.419e-02, -2.802e-02, 3.073e-04, -2.253e-02, 3.047e-03, 5.896e-02, 1.658e-03, 3.601e-02)); + r += mul(s1_6, M4(-1.752e-02, -1.393e-03, 1.343e-02, -6.912e-04, -1.211e-02, -1.511e-03, 1.580e-02, -5.149e-05, -6.598e-04, -1.994e-03, -3.715e-03, 1.939e-03, -8.240e-03, -1.204e-02, -1.863e-03, -5.386e-03)); + r += mul(s1_7, M4(-9.921e-03, -1.642e-02, -1.441e-04, -2.140e-02, -9.104e-03, -2.207e-02, 1.952e-02, 3.773e-02, 9.063e-03, 8.820e-03, 9.917e-03, -1.275e-03, -3.198e-02, -1.296e-02, -3.471e-02, -3.518e-04)); + r += mul(s1_8, M4(-1.870e-03, 1.285e-03, -2.583e-03, -6.924e-03, -1.586e-03, 1.603e-03, 4.076e-04, 3.254e-03, -5.009e-04, 1.443e-03, -5.724e-03, 8.396e-03, 4.439e-03, 1.328e-03, 2.810e-02, -4.291e-02)); + r += mul(s2_0, M4(-2.825e-02, 7.778e-03, 6.879e-03, 6.775e-04, 1.669e-03, -1.838e-02, -3.742e-02, -1.220e-02, 8.573e-03, -2.186e-05, 5.825e-03, 6.538e-03, -8.814e-02, 1.068e-03, -1.412e-02, -2.859e-03)); + r += mul(s2_1, M4(2.240e-02, -3.845e-02, -1.420e-02, 1.136e-02, -1.729e-01, 6.307e-03, 5.652e-02, 9.547e-02, -5.163e-02, -2.987e-02, -5.771e-03, 4.459e-03, 3.096e-03, 2.589e-02, 4.600e-03, -1.655e-02)); + r += mul(s2_2, M4(-1.673e-02, 4.319e-03, -7.842e-03, -1.910e-02, 3.317e-02, 1.533e-01, 4.235e-03, -4.861e-02, -2.429e-03, -2.997e-02, -1.245e-03, 6.226e-03, -7.891e-03, -1.584e-02, -1.856e-03, 7.774e-03)); + r += mul(s2_3, M4(-4.381e-02, 2.754e-02, -6.510e-02, 2.031e-02, -9.400e-02, -3.504e-02, -1.971e-02, 4.256e-03, -2.762e-02, -1.132e-02, 7.760e-03, -4.663e-03, -1.978e-01, 1.753e-02, -1.958e-01, 4.394e-02)); + r += mul(s2_4, M4(2.428e-01, -2.087e-01, 2.311e-01, -2.088e-01, 1.598e-01, 1.140e-01, 1.588e-01, -3.334e-01, 1.880e-01, 1.135e-01, 5.103e-02, 8.828e-02, -3.033e-02, 3.760e-01, -4.199e-02, 2.935e-01)); + r += mul(s2_5, M4(9.823e-03, 7.790e-02, 1.327e-02, 7.703e-02, -5.115e-02, -8.814e-02, -7.008e-02, 1.904e-01, 1.031e-02, 7.739e-02, 2.008e-02, 6.279e-03, 2.631e-02, -1.120e-02, 1.851e-02, -2.875e-02)); + r += mul(s2_6, M4(-4.129e-03, 6.841e-04, -1.334e-02, 8.805e-03, -1.776e-02, 5.161e-03, -1.021e-02, 1.459e-03, -1.630e-02, -1.006e-03, -1.680e-02, -1.178e-02, -1.506e-02, 4.431e-03, -9.363e-02, -3.570e-03)); + r += mul(s2_7, M4(-2.595e-02, -8.209e-03, 2.180e-02, -3.919e-02, 2.377e-03, -4.880e-03, 1.113e-02, 3.670e-02, 1.886e-02, 4.059e-03, 7.378e-02, 1.729e-02, -1.076e-02, -6.551e-02, -2.519e-02, 3.988e-02)); + r += mul(s2_8, M4(-2.461e-03, -7.184e-03, -6.953e-03, 2.376e-02, 4.969e-03, 7.072e-03, -6.686e-03, 1.143e-02, -7.839e-03, -5.919e-03, -1.470e-02, 4.468e-02, -8.697e-03, -2.448e-03, -1.257e-02, -1.114e-02)); + r += mul(s3_0, M4(-1.878e-02, -2.434e-03, 8.435e-03, -5.416e-04, -5.024e-02, -4.839e-03, -2.418e-02, -6.214e-03, 3.156e-02, -6.234e-03, 1.266e-02, -2.019e-03, -3.627e-02, -1.740e-02, -1.324e-02, -1.049e-02)); + r += mul(s3_1, M4(9.307e-03, -9.192e-03, -2.072e-02, 1.029e-02, 8.159e-02, -7.533e-02, 1.932e-02, 3.406e-03, -1.063e-01, -4.969e-02, 1.397e-03, 3.384e-02, 5.695e-03, -2.487e-04, -7.244e-03, -7.036e-03)); + r += mul(s3_2, M4(-9.433e-03, 1.165e-03, -9.516e-03, -1.801e-02, 8.395e-03, 9.396e-02, 1.441e-02, 1.786e-02, 1.334e-03, -3.240e-02, -1.211e-02, -9.708e-03, -2.537e-03, -5.786e-03, 1.472e-04, 1.409e-02)); + r += mul(s3_3, M4(-3.034e-02, 4.203e-03, -5.334e-02, -3.159e-03, -3.479e-02, -2.786e-02, -3.998e-02, -1.344e-02, -8.960e-02, -2.011e-02, -5.261e-02, 2.207e-02, 4.456e-03, -2.643e-02, -3.284e-02, -2.436e-02)); + r += mul(s3_4, M4(8.252e-02, -7.086e-02, 1.282e-01, -4.984e-02, 2.513e-02, 4.663e-02, 8.703e-02, -3.284e-02, 1.492e-01, 3.702e-01, 1.355e-01, -1.026e-01, 9.108e-02, 1.341e-01, 5.950e-02, 7.397e-02)); + r += mul(s3_5, M4(1.464e-02, 1.050e-01, 2.294e-02, 8.619e-02, -1.945e-02, -5.211e-02, -3.405e-02, 7.557e-02, 1.460e-02, 3.943e-02, 1.422e-02, 3.550e-02, 1.362e-02, 7.609e-03, 6.740e-03, -1.501e-02)); + r += mul(s3_6, M4(-9.561e-04, -4.434e-03, -3.246e-03, 1.240e-03, -9.618e-03, 5.566e-04, -1.053e-02, -9.058e-03, -2.425e-02, -2.365e-02, 2.156e-02, -2.252e-02, -2.594e-02, -4.650e-04, -3.137e-02, -1.236e-02)); + r += mul(s3_7, M4(-1.013e-02, -3.561e-03, -1.650e-02, -2.594e-02, 7.368e-03, -1.746e-03, 2.423e-02, 1.971e-02, 2.600e-02, -1.256e-02, 2.182e-02, 5.653e-02, -1.538e-02, -4.211e-02, -3.166e-03, -1.983e-02)); + r += mul(s3_8, M4(-1.749e-03, -1.131e-02, -1.036e-03, 2.914e-02, 1.159e-03, 4.383e-03, -5.259e-03, 8.035e-03, -2.202e-03, -8.608e-04, -7.083e-03, 4.011e-02, -1.159e-02, -3.661e-04, -1.470e-02, 3.702e-03)); + r += mul(s4_0, M4(1.241e-01, -2.722e-03, -1.522e-01, -2.910e-02, -7.858e-02, -1.887e-02, -1.970e-02, -8.743e-03, 3.292e-02, 1.835e-03, -1.332e-02, 1.231e-02, 1.371e-02, 1.383e-02, -1.290e-03, 2.727e-04)); + r += mul(s4_1, M4(2.705e-01, 3.412e-01, -2.322e-01, -3.342e-01, 1.073e-01, 2.674e-03, 2.774e-02, 3.236e-02, -2.611e-02, -2.326e-03, 4.171e-02, 1.519e-02, -2.056e-02, -1.122e-02, -1.940e-02, -5.084e-02)); + r += mul(s4_2, M4(1.196e-02, 4.752e-02, -2.241e-02, -7.073e-02, -9.354e-03, 2.420e-02, 2.362e-02, 2.388e-03, -9.792e-04, -6.070e-02, -1.017e-02, -1.761e-05, -2.084e-02, -2.422e-02, -2.179e-02, -3.296e-02)); + r += mul(s4_3, M4(-8.960e-03, -2.168e-02, 4.790e-03, 6.261e-03, -8.020e-02, -1.778e-02, -9.870e-02, -1.462e-02, 2.071e-02, -6.225e-03, 7.382e-03, 9.693e-03, -1.874e-02, 8.222e-03, 3.224e-02, -8.453e-03)); + r += mul(s4_4, M4(-3.010e-02, -2.755e-04, 1.521e-02, -9.902e-03, 1.081e-02, -1.996e-02, 9.496e-02, -7.462e-02, -4.012e-02, 2.716e-03, -1.808e-03, -7.398e-02, 9.465e-02, -6.016e-02, -5.529e-02, 4.329e-02)); + r += mul(s4_5, M4(7.685e-04, -1.718e-02, -2.018e-03, 2.241e-02, 1.576e-02, -2.413e-02, -2.552e-02, 1.115e-01, 2.040e-02, 2.674e-02, -2.387e-02, 2.060e-02, 1.030e-02, 1.147e-01, 1.819e-02, 6.421e-02)); + r += mul(s4_6, M4(3.099e-04, -7.753e-04, -4.291e-03, -2.896e-03, -2.850e-03, 2.901e-03, -2.640e-02, 2.571e-03, -1.092e-03, -7.156e-04, 5.573e-03, -1.358e-03, -9.563e-03, -7.458e-03, -8.650e-03, -2.034e-03)); + r += mul(s4_7, M4(8.655e-03, 5.108e-03, 8.159e-03, 1.230e-02, -6.498e-04, 5.563e-03, -8.667e-03, -2.757e-02, -1.389e-03, 7.668e-04, -7.603e-04, 9.307e-03, -2.008e-02, -4.393e-03, -9.184e-03, -3.818e-03)); + r += mul(s4_8, M4(4.210e-04, 4.429e-03, -2.299e-03, 3.601e-04, 9.826e-03, 9.722e-03, 4.011e-03, -2.770e-02, 2.060e-03, 1.865e-04, 2.297e-03, 1.553e-02, 1.851e-03, 3.818e-03, 3.571e-02, -2.679e-02)); + r += mul(s5_0, M4(-1.703e-02, -2.141e-02, 3.662e-03, -1.035e-02, -4.829e-02, -1.841e-02, -2.961e-02, -8.827e-03, 1.959e-02, 2.521e-02, -3.347e-02, 1.142e-02, 2.545e-02, 1.529e-02, 1.503e-02, -9.263e-03)); + r += mul(s5_1, M4(8.298e-03, 1.209e-02, 5.804e-03, 2.954e-02, 1.871e-01, -5.285e-02, 6.019e-03, 5.980e-02, 2.602e-01, -2.048e-01, -1.827e-01, 1.879e-01, -1.194e-01, 1.137e-01, -3.773e-02, -9.990e-02)); + r += mul(s5_2, M4(-3.284e-03, -1.084e-02, 1.225e-03, -1.040e-02, -9.596e-03, 3.377e-03, 1.911e-02, 1.322e-02, 5.204e-03, -1.390e-01, 1.931e-02, 2.311e-02, -1.113e-02, -4.676e-02, -1.083e-02, -1.427e-02)); + r += mul(s5_3, M4(-7.960e-04, -1.255e-02, -1.112e-02, -4.686e-03, -8.179e-02, -2.207e-02, -7.642e-02, -1.261e-02, 2.133e-02, -1.009e-02, 3.408e-02, -6.496e-04, -2.391e-03, 2.106e-02, -3.746e-02, 8.466e-03)); + r += mul(s5_4, M4(-8.877e-03, 1.617e-02, -2.680e-03, -3.528e-02, -4.871e-02, -3.554e-02, 3.489e-01, -2.440e-01, -4.708e-02, 3.845e-02, -3.043e-02, -7.832e-02, 7.207e-02, -2.007e-01, 1.665e-01, 6.463e-02)); + r += mul(s5_5, M4(-6.225e-04, -1.320e-02, -4.382e-03, 2.419e-02, 2.625e-02, 2.141e-02, -1.971e-02, 2.993e-02, 8.798e-03, 1.972e-02, -2.796e-02, 6.802e-02, 1.662e-02, 1.999e-01, 2.263e-03, -2.605e-02)); + r += mul(s5_6, M4(-1.662e-03, -9.862e-04, -1.924e-03, -1.690e-03, -5.530e-04, 9.113e-04, -2.399e-02, 1.501e-04, 4.862e-04, -4.257e-04, 8.270e-03, -4.402e-04, -7.361e-03, -8.730e-03, -9.817e-03, -3.118e-04)); + r += mul(s5_7, M4(5.400e-03, 2.631e-03, 9.178e-03, 1.119e-02, 1.026e-03, 1.547e-02, -3.413e-02, -1.751e-02, 9.076e-04, 1.486e-03, -9.140e-04, 1.067e-03, -6.821e-03, 8.481e-03, -3.967e-02, 5.920e-04)); + r += mul(s5_8, M4(1.815e-03, 4.437e-03, -2.263e-04, -7.537e-04, 1.101e-02, 8.392e-03, 3.906e-03, -1.950e-02, 3.161e-03, 1.800e-03, -1.970e-03, 1.948e-02, -6.366e-03, -4.956e-04, 2.726e-02, -1.865e-02)); + r += mul(s6_0, M4(7.153e-02, 1.432e-02, 5.029e-03, 1.068e-02, -2.239e-03, 5.988e-04, 3.456e-03, -1.638e-03, -1.509e-02, 3.740e-04, -6.526e-03, -8.932e-05, 1.896e-02, 7.404e-03, 5.672e-03, 8.338e-03)); + r += mul(s6_1, M4(2.280e-02, -1.824e-02, 2.243e-02, 4.961e-02, 1.042e-01, 4.623e-02, -1.059e-02, 4.627e-04, -1.596e-02, -2.779e-02, 2.384e-02, 1.553e-02, 2.837e-02, -5.811e-03, -1.298e-03, 3.311e-03)); + r += mul(s6_2, M4(-6.403e-03, -1.052e-02, -9.886e-03, 5.213e-03, 1.813e-02, 7.935e-02, 2.713e-02, 2.399e-02, 5.155e-03, 3.446e-03, 2.308e-03, 1.125e-03, -7.171e-03, -1.546e-02, 6.358e-03, -1.187e-02)); + r += mul(s6_3, M4(7.386e-02, 5.118e-02, 1.043e-01, 3.452e-02, 3.457e-02, -3.300e-03, -1.363e-02, -4.357e-03, -2.312e-02, 4.680e-03, -1.498e-02, -1.621e-03, -5.287e-03, -2.001e-02, 1.342e-02, -4.378e-03)); + r += mul(s6_4, M4(1.004e-01, -3.057e-01, 7.350e-03, -2.862e-01, -1.540e-01, -3.552e-02, 1.702e-01, 5.136e-02, 4.456e-02, -2.083e-02, -8.627e-02, -4.431e-02, -3.276e-01, 3.085e-01, -1.260e-01, 2.106e-01)); + r += mul(s6_5, M4(1.999e-03, 3.940e-02, 1.170e-02, -1.264e-02, 1.583e-02, -6.350e-02, -4.114e-02, 3.691e-02, -2.899e-02, 1.204e-03, 1.770e-02, -2.299e-02, 7.905e-03, -1.410e-02, 7.572e-03, 1.972e-02)); + r += mul(s6_6, M4(2.522e-03, 2.384e-03, 2.441e-02, 4.844e-04, 1.894e-02, 1.933e-03, -1.505e-03, 8.773e-03, -1.008e-02, -6.878e-03, 5.712e-03, -6.634e-03, -8.502e-03, -6.767e-03, -1.307e-02, -1.115e-02)); + r += mul(s6_7, M4(-1.665e-02, 2.475e-02, 2.821e-02, -7.399e-02, -3.618e-02, -1.538e-02, -1.023e-01, -8.032e-02, 2.562e-03, 1.034e-02, 7.017e-03, 2.552e-02, -1.381e-02, 4.178e-02, -6.669e-02, 3.070e-02)); + r += mul(s6_8, M4(-1.780e-03, -5.765e-03, -1.343e-02, 3.723e-02, -2.313e-03, -1.388e-02, -1.401e-02, -2.972e-02, 1.695e-02, 2.476e-03, 2.459e-02, 1.473e-02, 3.527e-02, 2.297e-02, 2.847e-02, -1.627e-02)); + r += mul(s7_0, M4(2.734e-02, 9.389e-03, 1.899e-02, 9.436e-03, 1.607e-02, -5.627e-03, -4.848e-03, -6.998e-03, -4.030e-03, -1.852e-03, -5.729e-03, -6.533e-08, 1.703e-02, 7.887e-03, 7.217e-03, 4.398e-03)); + r += mul(s7_1, M4(5.733e-03, 1.714e-02, 2.708e-02, 4.638e-02, 9.693e-02, 7.149e-02, -3.035e-02, -1.722e-02, 9.700e-03, -7.294e-03, -1.946e-02, -1.432e-02, 6.034e-03, -1.510e-02, 2.483e-02, 3.817e-03)); + r += mul(s7_2, M4(-2.516e-03, -1.529e-02, -7.591e-03, 7.588e-03, 3.502e-02, 8.863e-02, 1.774e-02, -8.667e-04, 9.195e-03, 2.465e-02, 1.436e-03, -1.286e-02, -1.302e-02, 8.339e-04, 1.971e-03, -1.640e-02)); + r += mul(s7_3, M4(-3.061e-02, 6.541e-02, -4.342e-02, 3.258e-02, 6.861e-02, -4.957e-03, -2.240e-02, -1.054e-02, -5.297e-02, 2.006e-02, 2.643e-04, -5.721e-03, -3.480e-02, -6.939e-04, 1.051e-02, 3.157e-03)); + r += mul(s7_4, M4(3.394e-03, -1.038e-01, -1.067e-01, -8.081e-02, -3.834e-01, -9.184e-02, 3.959e-01, 1.383e-01, -2.757e-01, -2.394e-01, 1.315e-01, 9.302e-02, 3.851e-02, 6.530e-02, -5.134e-02, 2.032e-02)); + r += mul(s7_5, M4(1.928e-02, 2.826e-02, 3.062e-02, -2.727e-02, 5.898e-02, -1.647e-01, -6.162e-02, 1.155e-01, -1.409e-02, -1.304e-01, 8.152e-03, 5.409e-02, -7.279e-03, -7.746e-02, 1.113e-02, 6.624e-02)); + r += mul(s7_6, M4(4.472e-03, -7.955e-04, 3.064e-03, 9.964e-03, 1.995e-02, -4.696e-04, -6.926e-03, 8.025e-03, 3.883e-03, 2.538e-03, 1.678e-02, -1.129e-02, -1.199e-02, -3.737e-03, -3.190e-02, -2.174e-03)); + r += mul(s7_7, M4(-1.147e-02, 1.181e-02, 1.281e-02, -3.577e-02, -1.517e-02, -4.086e-03, -1.170e-01, -1.094e-01, -4.812e-02, -2.669e-02, 1.685e-01, 1.296e-01, 1.777e-03, 1.122e-02, 2.007e-02, -1.995e-02)); + r += mul(s7_8, M4(-1.510e-04, -6.915e-03, -1.230e-02, 2.398e-02, -3.685e-03, -1.359e-03, -3.283e-02, -3.793e-02, 1.634e-02, -9.149e-03, 1.263e-02, 8.960e-02, 2.716e-02, 2.490e-02, 1.270e-02, -2.679e-02)); + r += V4(3.226e-04, 2.004e-04, 1.483e-04, 9.562e-05); + return tanh(r); +} + +void Pass10(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = (Rmp8x8(tid.x) << 1) + blockStart; + uint2 size = GetOutputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = ((gxy >> 1) + 0.5) * pt; + + V4 s0_0 = l0(-1.0, -1.0); + V4 s0_1 = l0(0.0, -1.0); + V4 s0_2 = l0(1.0, -1.0); + V4 s0_3 = l0(-1.0, 0.0); + V4 s0_4 = l0(0.0, 0.0); + V4 s0_5 = l0(1.0, 0.0); + V4 s0_6 = l0(-1.0, 1.0); + V4 s0_7 = l0(0.0, 1.0); + V4 s0_8 = l0(1.0, 1.0); + V4 s1_0 = -max(-s0_0, 0.0); + V4 s1_1 = -max(-s0_1, 0.0); + V4 s1_2 = -max(-s0_2, 0.0); + V4 s1_3 = -max(-s0_3, 0.0); + V4 s1_4 = -max(-s0_4, 0.0); + V4 s1_5 = -max(-s0_5, 0.0); + V4 s1_6 = -max(-s0_6, 0.0); + V4 s1_7 = -max(-s0_7, 0.0); + V4 s1_8 = -max(-s0_8, 0.0); + s0_0 = max(s0_0, 0.0); + s0_1 = max(s0_1, 0.0); + s0_2 = max(s0_2, 0.0); + s0_3 = max(s0_3, 0.0); + s0_4 = max(s0_4, 0.0); + s0_5 = max(s0_5, 0.0); + s0_6 = max(s0_6, 0.0); + s0_7 = max(s0_7, 0.0); + s0_8 = max(s0_8, 0.0); + + V4 s2_0 = l1(-1.0, -1.0); + V4 s2_1 = l1(0.0, -1.0); + V4 s2_2 = l1(1.0, -1.0); + V4 s2_3 = l1(-1.0, 0.0); + V4 s2_4 = l1(0.0, 0.0); + V4 s2_5 = l1(1.0, 0.0); + V4 s2_6 = l1(-1.0, 1.0); + V4 s2_7 = l1(0.0, 1.0); + V4 s2_8 = l1(1.0, 1.0); + V4 s3_0 = -max(-s2_0, 0.0); + V4 s3_1 = -max(-s2_1, 0.0); + V4 s3_2 = -max(-s2_2, 0.0); + V4 s3_3 = -max(-s2_3, 0.0); + V4 s3_4 = -max(-s2_4, 0.0); + V4 s3_5 = -max(-s2_5, 0.0); + V4 s3_6 = -max(-s2_6, 0.0); + V4 s3_7 = -max(-s2_7, 0.0); + V4 s3_8 = -max(-s2_8, 0.0); + s2_0 = max(s2_0, 0.0); + s2_1 = max(s2_1, 0.0); + s2_2 = max(s2_2, 0.0); + s2_3 = max(s2_3, 0.0); + s2_4 = max(s2_4, 0.0); + s2_5 = max(s2_5, 0.0); + s2_6 = max(s2_6, 0.0); + s2_7 = max(s2_7, 0.0); + s2_8 = max(s2_8, 0.0); + + V4 s4_0 = l2(-1.0, -1.0); + V4 s4_1 = l2(0.0, -1.0); + V4 s4_2 = l2(1.0, -1.0); + V4 s4_3 = l2(-1.0, 0.0); + V4 s4_4 = l2(0.0, 0.0); + V4 s4_5 = l2(1.0, 0.0); + V4 s4_6 = l2(-1.0, 1.0); + V4 s4_7 = l2(0.0, 1.0); + V4 s4_8 = l2(1.0, 1.0); + V4 s5_0 = -max(-s4_0, 0.0); + V4 s5_1 = -max(-s4_1, 0.0); + V4 s5_2 = -max(-s4_2, 0.0); + V4 s5_3 = -max(-s4_3, 0.0); + V4 s5_4 = -max(-s4_4, 0.0); + V4 s5_5 = -max(-s4_5, 0.0); + V4 s5_6 = -max(-s4_6, 0.0); + V4 s5_7 = -max(-s4_7, 0.0); + V4 s5_8 = -max(-s4_8, 0.0); + s4_0 = max(s4_0, 0.0); + s4_1 = max(s4_1, 0.0); + s4_2 = max(s4_2, 0.0); + s4_3 = max(s4_3, 0.0); + s4_4 = max(s4_4, 0.0); + s4_5 = max(s4_5, 0.0); + s4_6 = max(s4_6, 0.0); + s4_7 = max(s4_7, 0.0); + s4_8 = max(s4_8, 0.0); + + V4 s6_0 = l3(-1.0, -1.0); + V4 s6_1 = l3(0.0, -1.0); + V4 s6_2 = l3(1.0, -1.0); + V4 s6_3 = l3(-1.0, 0.0); + V4 s6_4 = l3(0.0, 0.0); + V4 s6_5 = l3(1.0, 0.0); + V4 s6_6 = l3(-1.0, 1.0); + V4 s6_7 = l3(0.0, 1.0); + V4 s6_8 = l3(1.0, 1.0); + V4 s7_0 = -max(-s6_0, 0.0); + V4 s7_1 = -max(-s6_1, 0.0); + V4 s7_2 = -max(-s6_2, 0.0); + V4 s7_3 = -max(-s6_3, 0.0); + V4 s7_4 = -max(-s6_4, 0.0); + V4 s7_5 = -max(-s6_5, 0.0); + V4 s7_6 = -max(-s6_6, 0.0); + V4 s7_7 = -max(-s6_7, 0.0); + V4 s7_8 = -max(-s6_8, 0.0); + s6_0 = max(s6_0, 0.0); + s6_1 = max(s6_1, 0.0); + s6_2 = max(s6_2, 0.0); + s6_3 = max(s6_3, 0.0); + s6_4 = max(s6_4, 0.0); + s6_5 = max(s6_5, 0.0); + s6_6 = max(s6_6, 0.0); + s6_7 = max(s6_7, 0.0); + s6_8 = max(s6_8, 0.0); + + V4 r = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8, s4_0, s4_1, s4_2, s4_3, s4_4, s4_5, s4_6, s4_7, s4_8, s5_0, s5_1, s5_2, s5_3, s5_4, s5_5, s5_6, s5_7, s5_8, s6_0, s6_1, s6_2, s6_3, s6_4, s6_5, s6_6, s6_7, s6_8, s7_0, s7_1, s7_2, s7_3, s7_4, s7_5, s7_6, s7_7, s7_8); + + static const float3x3 rgb2yuv = {0.299, 0.587, 0.114, -0.169, -0.331, 0.5, 0.5, -0.419, -0.081}; + static const float3x3 yuv2rgb = {1, -0.00093, 1.401687, 1, -0.3437, -0.71417, 1, 1.77216, 0.00099}; + float2 opt = float2(GetOutputPt()); + + pos -= 0.5f * opt; + float3 yuv = mul(rgb2yuv, INPUT.SampleLevel(SL, pos, 0).rgb); + OUTPUT[gxy] = float4(mul(yuv2rgb, float3(saturate(yuv.r + r.x), yuv.yz)), 1); + + ++gxy.x; + pos.x += opt.x; + yuv = mul(rgb2yuv, INPUT.SampleLevel(SL, pos, 0).rgb); + OUTPUT[gxy] = float4(mul(yuv2rgb, float3(saturate(yuv.r + r.y), yuv.yz)), 1); + + ++gxy.y; + pos.y += opt.y; + yuv = mul(rgb2yuv, INPUT.SampleLevel(SL, pos, 0).rgb); + OUTPUT[gxy] = float4(mul(yuv2rgb, float3(saturate(yuv.r + r.w), yuv.yz)), 1); + + --gxy.x; + pos.x -= opt.x; + yuv = mul(rgb2yuv, INPUT.SampleLevel(SL, pos, 0).rgb); + OUTPUT[gxy] = float4(mul(yuv2rgb, float3(saturate(yuv.r + r.z), yuv.yz)), 1); +} diff --git a/src/Effects/CuNNy/CuNNy-8x4C-NVL-DN.hlsl b/src/Effects/CuNNy/CuNNy-8x4C-NVL-DN.hlsl new file mode 100644 index 000000000..69bcd3894 --- /dev/null +++ b/src/Effects/CuNNy/CuNNy-8x4C-NVL-DN.hlsl @@ -0,0 +1,778 @@ +// CuNNy 8x4C BILINEAR RGB NVL DN - https://github.com/cunnyplapper/CuNNy + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +//!MAGPIE EFFECT +//!VERSION 4 +//!SORT_NAME CuNNy-DN-D04N08 + +//!TEXTURE +Texture2D INPUT; + +//!TEXTURE +//!WIDTH INPUT_WIDTH * 2 +//!HEIGHT INPUT_HEIGHT * 2 +Texture2D OUTPUT; + +//!SAMPLER +//!FILTER POINT +SamplerState SP; + +//!SAMPLER +//!FILTER LINEAR +SamplerState SL; + +//!COMMON +#define O(t, p) t.SampleLevel(SP, pos + p * pt, 0) +#define V4 min16float4 +#define M4 min16float4x4 + +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +//!FORMAT R8G8B8A8_SNORM +Texture2D t0; + +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +//!FORMAT R8G8B8A8_SNORM +Texture2D t1; + +//!PASS 1 +//!DESC in +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 +//!IN INPUT +//!OUT t0 + +#define l0(x, y) min16float((dot(float3(-1.880e-01, -3.696e-01, -8.936e-02), O(INPUT, float2(x, y)).rgb) + 5.137e-01)) + +V4 f0(min16float s0_0, min16float s0_1, min16float s0_2, min16float s0_3, min16float s0_4, min16float s0_5, min16float s0_6, min16float s0_7, min16float s0_8) { + V4 r = 0.0; + r += V4(6.049e-03, -3.524e-01, -1.308e-01, -6.691e-02) * s0_0; + r += V4(1.720e-02, -7.092e-02, -3.030e-01, 1.654e-01) * s0_1; + r += V4(-6.706e-03, 2.289e-01, 1.982e-03, -5.756e-02) * s0_2; + r += V4(-2.761e-02, 5.050e-01, -2.036e-01, 1.265e-01) * s0_3; + r += V4(-8.654e-01, -6.035e-01, -2.119e-01, 5.055e-01) * s0_4; + r += V4(-7.114e-03, 2.325e-02, 5.721e-02, 4.585e-02) * s0_5; + r += V4(2.796e-01, 1.680e-01, 1.353e-01, 1.286e-02) * s0_6; + r += V4(5.684e-01, 3.022e-01, 6.426e-01, 8.931e-02) * s0_7; + r += V4(3.723e-02, -2.036e-01, 2.732e-02, -4.101e-02) * s0_8; + r += V4(1.324e-02, -9.379e-05, 8.452e-03, 5.165e-02); + return r; +} + +void Pass1(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = Rmp8x8(tid.x) + blockStart; + uint2 size = GetInputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = (gxy + 0.5) * pt; + + min16float s0_0 = l0(-1.0, -1.0); + min16float s0_1 = l0(0.0, -1.0); + min16float s0_2 = l0(1.0, -1.0); + min16float s0_3 = l0(-1.0, 0.0); + min16float s0_4 = l0(0.0, 0.0); + min16float s0_5 = l0(1.0, 0.0); + min16float s0_6 = l0(-1.0, 1.0); + min16float s0_7 = l0(0.0, 1.0); + min16float s0_8 = l0(1.0, 1.0); + + t0[gxy] = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8); +} + +//!PASS 2 +//!DESC conv1 +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 +//!IN t0 +//!OUT t1 + +#define l0(x, y) V4(O(t0, float2(x, y))) + +V4 f0(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8) { + V4 r = 0.0; + r += mul(s0_0, M4(2.216e-02, 1.062e-01, -3.433e-03, -1.923e-01, 6.300e-02, -4.594e-01, 2.025e-01, 8.655e-03, -5.497e-02, 1.694e-01, -1.806e-01, 2.115e-01, -6.176e-02, 1.167e-02, -5.987e-02, 1.167e-01)); + r += mul(s0_1, M4(-1.646e-01, -5.524e-01, -1.352e-01, 1.704e-01, 3.398e-02, -2.598e-01, 1.616e-01, -1.772e-01, -5.648e-02, 2.755e-01, 2.638e-02, -2.657e-02, 3.774e-02, -6.833e-02, -1.141e-01, -2.438e-01)); + r += mul(s0_2, M4(-1.459e-01, 9.939e-02, -6.457e-04, 2.352e-02, 5.006e-02, -7.759e-01, -4.862e-02, -3.366e-02, 9.508e-02, 1.537e-01, -6.771e-02, -1.260e-01, 1.067e-01, -5.893e-02, -9.811e-02, -1.060e-02)); + r += mul(s0_3, M4(-2.901e-01, 2.907e-01, 2.178e-01, -3.877e-01, 9.034e-03, 8.718e-03, -1.213e-01, 9.252e-02, 3.286e-01, -8.247e-02, -5.573e-02, -3.852e-01, -1.371e-01, 1.877e-01, 2.337e-01, 5.324e-01)); + r += mul(s0_4, M4(-9.182e-01, 1.013e-01, 2.969e-01, 7.117e-01, -2.367e-01, -7.128e-02, 1.828e-01, 5.993e-01, -2.965e-01, 1.323e-01, 3.117e-02, -3.215e-01, -1.410e-01, 5.359e-02, -1.137e-01, -2.603e-01)); + r += mul(s0_5, M4(-1.071e-01, -8.801e-02, 9.524e-03, -2.937e-02, 7.723e-02, 1.195e-01, -9.056e-02, 6.161e-02, 1.962e-01, -2.740e-01, -9.418e-02, 1.141e-01, 6.203e-02, -1.084e-01, 2.402e-01, -2.066e-01)); + r += mul(s0_6, M4(2.226e-01, -2.259e-01, -2.499e-02, -9.184e-02, -1.499e-01, -3.737e-02, 1.576e-01, 1.084e-01, -2.221e-01, -1.080e-02, 2.643e-02, -1.023e-01, 1.068e-01, 1.193e-01, -2.781e-01, 3.396e-01)); + r += mul(s0_7, M4(7.520e-01, -1.043e-01, -4.535e-02, 2.775e-01, 1.577e-01, -1.526e-01, 1.796e-01, 1.085e-01, -1.012e+00, 4.333e-02, 1.270e-02, -1.692e-01, 1.127e-01, -2.847e-01, -1.784e-01, -3.956e-01)); + r += mul(s0_8, M4(2.206e-01, 1.370e-01, -7.453e-02, 1.050e-01, 8.412e-02, -1.396e-01, 1.707e-02, -1.654e-02, -2.116e-01, -7.944e-02, 1.244e-01, -6.709e-02, -5.577e-02, 1.619e-01, -2.818e-01, 1.460e-01)); + r += mul(s1_0, M4(1.180e-01, -2.345e-01, 5.406e-02, -1.102e-01, 1.559e-02, -3.865e-01, -1.077e-01, 1.442e-02, -1.405e-01, 1.578e-01, -3.338e-02, 1.157e-01, -1.676e-01, 4.656e-02, -1.507e-01, 2.590e-02)); + r += mul(s1_1, M4(-3.112e-02, -5.537e-01, -3.626e-01, -2.915e-01, 7.495e-02, 4.473e-01, -1.847e-01, -8.743e-02, -3.290e-02, 3.660e-02, 1.252e-01, 1.058e-02, 1.193e-01, 6.421e-02, -1.456e-01, -1.693e-01)); + r += mul(s1_2, M4(-1.047e-01, -4.306e-01, 6.486e-03, 1.137e-01, 2.935e-02, -3.608e-01, 5.242e-02, -2.374e-02, 1.130e-01, -4.864e-02, -7.302e-02, -2.205e-02, 8.227e-02, -8.403e-02, -9.468e-02, 8.095e-02)); + r += mul(s1_3, M4(-3.759e-02, 2.709e-01, 1.269e-01, -4.994e-01, -1.577e-02, 1.871e-01, -2.532e-01, 8.960e-02, 2.298e-01, -2.462e-01, -1.634e-02, -3.955e-01, 2.750e-02, -4.812e-02, -2.441e-01, 9.926e-01)); + r += mul(s1_4, M4(-7.288e-01, 5.644e-01, 1.042e+00, 6.160e-01, -4.271e-01, 4.419e-01, 1.437e-01, 3.840e-01, -1.220e-01, -8.627e-01, 6.664e-02, -1.220e-02, 5.260e-02, 1.505e-01, -2.182e-01, -6.116e-01)); + r += mul(s1_5, M4(1.659e-01, 2.566e-01, -5.954e-02, -9.187e-02, -8.251e-02, 1.091e-01, -1.506e-01, 1.370e-01, 3.056e-01, -3.512e-01, -4.956e-03, 7.008e-02, 1.320e-01, -3.995e-01, -8.603e-03, -3.542e-01)); + r += mul(s1_6, M4(2.549e-01, -7.946e-02, -1.755e-01, -2.902e-02, -1.912e-01, 2.349e-01, 6.770e-02, 9.683e-02, -2.690e-01, -1.715e-01, 5.692e-02, -1.064e-01, 2.998e-01, 7.619e-02, 8.040e-03, 2.706e-01)); + r += mul(s1_7, M4(7.320e-01, 1.397e-01, -5.600e-02, 9.609e-02, -1.267e-01, 6.841e-02, 2.429e-01, 3.167e-02, -6.816e-01, -3.313e-03, 5.622e-02, -4.727e-02, -3.420e-01, 4.283e-02, -3.250e-01, -4.118e-01)); + r += mul(s1_8, M4(1.607e-01, 1.581e-01, -6.049e-02, 9.118e-02, -1.583e-02, 2.918e-01, 1.703e-02, -1.206e-01, -2.114e-01, -1.248e-01, 6.689e-02, -2.131e-02, -7.779e-02, 1.069e-01, -1.181e-01, 2.230e-01)); + r += V4(1.959e-02, -5.807e-03, 9.415e-02, 7.247e-03); + return r; +} + +void Pass2(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = Rmp8x8(tid.x) + blockStart; + uint2 size = GetInputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = (gxy + 0.5) * pt; + + V4 s0_0 = l0(-1.0, -1.0); + V4 s0_1 = l0(0.0, -1.0); + V4 s0_2 = l0(1.0, -1.0); + V4 s0_3 = l0(-1.0, 0.0); + V4 s0_4 = l0(0.0, 0.0); + V4 s0_5 = l0(1.0, 0.0); + V4 s0_6 = l0(-1.0, 1.0); + V4 s0_7 = l0(0.0, 1.0); + V4 s0_8 = l0(1.0, 1.0); + V4 s1_0 = -max(-s0_0, 0.0); + V4 s1_1 = -max(-s0_1, 0.0); + V4 s1_2 = -max(-s0_2, 0.0); + V4 s1_3 = -max(-s0_3, 0.0); + V4 s1_4 = -max(-s0_4, 0.0); + V4 s1_5 = -max(-s0_5, 0.0); + V4 s1_6 = -max(-s0_6, 0.0); + V4 s1_7 = -max(-s0_7, 0.0); + V4 s1_8 = -max(-s0_8, 0.0); + s0_0 = max(s0_0, 0.0); + s0_1 = max(s0_1, 0.0); + s0_2 = max(s0_2, 0.0); + s0_3 = max(s0_3, 0.0); + s0_4 = max(s0_4, 0.0); + s0_5 = max(s0_5, 0.0); + s0_6 = max(s0_6, 0.0); + s0_7 = max(s0_7, 0.0); + s0_8 = max(s0_8, 0.0); + + t1[gxy] = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8); +} + +//!PASS 3 +//!DESC conv2 +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 +//!IN t1 +//!OUT t0 + +#define l0(x, y) V4(O(t1, float2(x, y))) + +V4 f0(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8) { + V4 r = 0.0; + r += mul(s0_0, M4(9.727e-02, 1.849e-01, 2.125e-02, 1.933e-01, 9.183e-02, 8.307e-03, -9.035e-02, 3.241e-02, 1.141e-01, 8.739e-02, -9.547e-02, 1.616e-01, 2.912e-02, -1.780e-02, 5.433e-02, 2.720e-02)); + r += mul(s0_1, M4(-1.524e-01, -9.138e-02, 8.798e-02, -1.691e-01, 8.519e-03, 3.597e-02, -1.784e-02, 3.049e-02, 3.078e-02, 1.823e-01, 1.051e-02, -5.317e-02, -1.977e-01, 1.013e-01, 1.215e-01, 4.261e-02)); + r += mul(s0_2, M4(-1.992e-02, -1.191e-01, -1.365e-03, 3.976e-02, 3.452e-03, 7.503e-03, 4.850e-03, 8.970e-03, -7.652e-03, 1.166e-01, 9.888e-02, 3.423e-03, -3.354e-01, -3.335e-01, -2.226e-02, -1.509e-01)); + r += mul(s0_3, M4(-7.994e-02, 1.374e-01, -1.701e-02, -2.530e-01, 2.153e-01, -6.957e-03, -1.405e-01, -6.175e-02, 7.274e-03, 1.734e-01, -9.107e-02, -1.303e-01, -1.265e-01, 1.669e-02, 3.494e-02, -8.377e-02)); + r += mul(s0_4, M4(-1.124e+00, 1.355e-02, -1.979e-01, -4.092e-01, -1.276e-01, -1.096e-01, 5.949e-02, 1.073e-01, -4.780e-02, 1.378e-01, 1.905e-01, -9.525e-02, -5.999e-01, 1.274e-01, 8.416e-01, 2.483e-01)); + r += mul(s0_5, M4(3.312e-01, 2.036e-01, -5.231e-02, 5.357e-02, 1.666e-03, -2.102e-03, -3.213e-03, 4.747e-02, 1.130e-01, 3.492e-01, -1.263e-01, 4.100e-01, -5.859e-01, 4.875e-02, 2.227e-01, 3.127e-01)); + r += mul(s0_6, M4(-3.699e-02, 6.066e-02, 3.448e-03, -4.158e-03, -4.048e-03, -3.619e-02, -8.830e-02, -8.917e-03, 2.990e-02, 6.919e-03, 9.803e-02, 2.188e-02, 5.674e-02, -3.122e-02, -6.793e-02, 8.573e-02)); + r += mul(s0_7, M4(-1.255e-01, 1.754e-01, -1.332e-01, -1.124e-01, -2.163e-01, 1.552e-02, -7.485e-04, 4.194e-02, -1.899e-01, 1.334e-01, -1.721e-01, -3.487e-01, 3.847e-01, -3.823e-02, 1.121e-02, -7.128e-02)); + r += mul(s0_8, M4(7.152e-02, -1.631e-02, 4.810e-02, 1.435e-01, 3.881e-02, -3.596e-02, -7.544e-03, -1.071e-01, -8.509e-02, 1.110e-01, 8.542e-02, 1.980e-02, -1.134e-01, -7.967e-02, -1.586e-01, 2.511e-01)); + r += mul(s1_0, M4(2.326e-01, 4.791e-02, -1.996e-01, 1.352e-02, -9.909e-03, 1.117e-01, 2.198e-02, -6.683e-02, 1.356e-01, 2.830e-01, -8.418e-02, 2.137e-01, -1.401e-02, -7.056e-02, 5.360e-02, 6.243e-02)); + r += mul(s1_1, M4(7.739e-01, -3.172e-01, -2.031e-01, 2.054e-01, -1.263e-01, -7.571e-03, 8.090e-02, -1.372e-01, 1.053e-01, 2.982e-01, -6.235e-02, 1.452e-02, 1.973e-01, 9.233e-02, -1.067e-01, 1.088e-01)); + r += mul(s1_2, M4(-1.136e-01, -1.332e-01, -7.369e-02, 2.046e-01, -9.302e-02, 2.722e-02, 9.461e-02, -1.895e-01, 1.216e-02, 2.595e-01, 1.028e-01, 8.413e-02, -1.339e-01, -2.259e-01, -1.047e-01, 5.994e-02)); + r += mul(s1_3, M4(1.224e-01, -3.713e-02, -2.383e-01, -1.743e-01, -1.876e-01, 1.155e-01, 2.212e-01, -1.375e-01, 1.618e-01, 2.628e-01, -1.161e-01, -1.826e-01, 8.003e-02, -1.961e-02, -6.278e-02, -5.710e-02)); + r += mul(s1_4, M4(-2.647e-01, -1.603e-01, -7.731e-01, 1.958e-01, -4.093e-01, -1.110e-01, 3.352e-01, -3.093e-02, -6.201e-01, 3.073e-01, 3.779e-01, -2.733e-01, 4.035e-01, 1.230e-01, -1.606e-01, 9.421e-02)); + r += mul(s1_5, M4(1.981e-01, -8.801e-03, -9.874e-03, -4.003e-02, 2.686e-03, -1.346e-01, -1.813e-02, -1.003e-01, 1.561e-01, 3.252e-01, -1.189e-01, 2.014e-01, 1.343e-01, 4.088e-02, -9.918e-02, 1.025e+00)); + r += mul(s1_6, M4(-2.323e-02, 3.284e-02, -5.099e-03, -3.025e-02, -1.458e-02, -1.640e-02, 1.268e-01, -3.787e-02, 5.078e-02, 4.529e-02, 1.050e-02, -8.079e-03, -1.530e-02, -6.509e-02, -1.620e-01, 6.662e-02)); + r += mul(s1_7, M4(3.972e-02, 8.570e-02, -8.723e-02, -3.746e-02, -1.902e-01, 5.121e-02, 1.161e-01, -4.624e-02, -6.268e-02, 1.852e-01, -1.535e-01, -2.023e-01, 2.476e-01, -2.211e-02, -1.590e-01, -3.109e-02)); + r += mul(s1_8, M4(-8.025e-03, -4.798e-02, 5.162e-02, 6.616e-02, -2.416e-02, -5.815e-02, -1.334e-02, -1.029e-01, 5.381e-02, 1.539e-01, 4.511e-02, 1.426e-01, -5.511e-02, -9.311e-02, -3.072e-02, 1.572e-01)); + r += V4(3.240e-02, -1.989e-01, -2.700e-02, 6.578e-03); + return r; +} + +void Pass3(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = Rmp8x8(tid.x) + blockStart; + uint2 size = GetInputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = (gxy + 0.5) * pt; + + V4 s0_0 = l0(-1.0, -1.0); + V4 s0_1 = l0(0.0, -1.0); + V4 s0_2 = l0(1.0, -1.0); + V4 s0_3 = l0(-1.0, 0.0); + V4 s0_4 = l0(0.0, 0.0); + V4 s0_5 = l0(1.0, 0.0); + V4 s0_6 = l0(-1.0, 1.0); + V4 s0_7 = l0(0.0, 1.0); + V4 s0_8 = l0(1.0, 1.0); + V4 s1_0 = -max(-s0_0, 0.0); + V4 s1_1 = -max(-s0_1, 0.0); + V4 s1_2 = -max(-s0_2, 0.0); + V4 s1_3 = -max(-s0_3, 0.0); + V4 s1_4 = -max(-s0_4, 0.0); + V4 s1_5 = -max(-s0_5, 0.0); + V4 s1_6 = -max(-s0_6, 0.0); + V4 s1_7 = -max(-s0_7, 0.0); + V4 s1_8 = -max(-s0_8, 0.0); + s0_0 = max(s0_0, 0.0); + s0_1 = max(s0_1, 0.0); + s0_2 = max(s0_2, 0.0); + s0_3 = max(s0_3, 0.0); + s0_4 = max(s0_4, 0.0); + s0_5 = max(s0_5, 0.0); + s0_6 = max(s0_6, 0.0); + s0_7 = max(s0_7, 0.0); + s0_8 = max(s0_8, 0.0); + + t0[gxy] = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8); +} + +//!PASS 4 +//!DESC conv3 +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 +//!IN t0 +//!OUT t1 + +#define l0(x, y) V4(O(t0, float2(x, y))) + +V4 f0(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8) { + V4 r = 0.0; + r += mul(s0_0, M4(9.384e-02, 1.183e-01, 5.136e-02, -4.583e-01, -1.060e-01, 6.124e-02, -1.479e-01, -2.457e-01, -5.881e-02, 4.756e-03, -2.540e-02, -5.047e-02, -1.897e-01, 4.062e-02, 1.226e-02, 1.465e-01)); + r += mul(s0_1, M4(-1.890e-01, -9.535e-02, 2.627e-01, 3.224e-01, 1.050e-01, -3.922e-02, -3.551e-01, -2.632e-01, -2.349e-01, -5.605e-02, -2.856e-01, 4.331e-01, -2.614e-02, -6.027e-02, -3.236e-02, 2.873e-01)); + r += mul(s0_2, M4(-1.702e-01, 7.462e-02, 2.168e-01, 4.212e-01, 8.150e-03, 6.671e-02, -2.781e-01, -1.322e-01, -3.933e-02, 2.698e-02, -3.420e-01, -1.116e-02, -1.788e-02, 8.701e-03, -1.044e-01, 1.264e-01)); + r += mul(s0_3, M4(3.573e-01, -4.592e-02, 4.539e-01, 2.854e-01, -6.463e-01, -1.763e-01, 6.236e-01, 7.125e-02, 4.126e-01, -1.621e-02, 1.685e-02, 2.328e-01, -5.456e-01, -2.113e-01, 1.424e-01, 1.414e-01)); + r += mul(s0_4, M4(3.838e-01, -1.008e+00, 4.023e-01, 1.302e+00, -1.503e-01, 4.245e-02, 1.496e+00, -3.479e-01, -3.763e-01, -7.877e-01, 4.081e-01, -2.192e-01, -2.853e-01, 2.123e-01, -3.407e-01, 2.423e-01)); + r += mul(s0_5, M4(5.073e-03, -2.123e-01, 1.851e-01, 1.482e-01, -2.814e-01, 1.262e-01, 6.890e-01, -2.317e-01, 6.427e-02, -5.801e-02, -3.684e-02, 7.526e-02, 1.309e-02, -2.125e-02, -7.760e-02, 4.795e-02)); + r += mul(s0_6, M4(1.409e-01, -1.062e-01, 1.665e-01, 5.277e-01, 6.676e-01, -1.872e-01, 1.251e+00, 1.165e-01, -2.287e-02, -5.235e-02, -2.028e-03, -3.305e-02, -1.968e-01, 1.898e-01, -9.538e-02, -1.418e-01)); + r += mul(s0_7, M4(7.353e-02, -3.073e-01, 1.789e-01, 2.137e-01, -6.435e-01, -6.052e-01, 2.259e+00, 2.884e-02, 7.105e-04, 1.247e-01, -7.393e-02, 2.539e-02, 1.194e-01, 1.870e-01, -1.126e-01, 2.444e-02)); + r += mul(s0_8, M4(3.853e-02, -2.242e-01, 1.470e-01, 1.701e-02, 4.586e-02, 2.027e-01, 7.448e-01, -4.414e-01, 9.096e-03, 1.277e-01, 4.010e-02, 1.064e-02, 2.401e-02, 1.901e-02, 1.956e-02, 8.744e-02)); + r += mul(s1_0, M4(-4.741e-02, 1.819e-03, -8.321e-02, -1.496e-01, -1.801e-02, 4.682e-02, -6.041e-02, -7.243e-02, -1.478e-01, 4.970e-02, 6.424e-02, -5.378e-02, -9.117e-02, 5.496e-02, -2.648e-02, -4.042e-02)); + r += mul(s1_1, M4(-8.815e-02, 5.938e-02, -2.433e-01, 1.737e-01, 1.095e-01, -5.108e-02, -5.729e-02, 8.334e-03, -2.763e-01, -6.431e-02, -2.454e-02, 4.055e-01, 2.113e-02, -1.298e-01, -3.908e-02, -1.780e-02)); + r += mul(s1_2, M4(-1.905e-02, 3.894e-02, -1.293e-01, 8.303e-03, -7.800e-03, -5.508e-03, 8.606e-02, -7.501e-02, 1.542e-02, 3.046e-02, -2.920e-01, -4.240e-02, -3.932e-02, -1.813e-02, -8.213e-02, 1.017e-01)); + r += mul(s1_3, M4(1.965e-01, 3.626e-02, 3.418e-02, 9.779e-02, -6.664e-02, -2.295e-02, -2.736e-02, 1.091e-01, 1.129e-01, -3.896e-02, 1.171e-02, -2.870e-02, -1.382e-01, -1.691e-01, 3.018e-01, -1.186e-01)); + r += mul(s1_4, M4(1.075e-01, -6.894e-01, 1.714e-01, 5.097e-01, 9.868e-03, 1.087e-01, 2.107e-01, -6.591e-02, -3.233e-01, -9.792e-01, -1.189e-01, -5.480e-01, -1.157e-01, 5.941e-02, -5.770e-01, -1.030e-01)); + r += mul(s1_5, M4(3.289e-02, 3.941e-02, 1.824e-01, 7.260e-04, -9.787e-03, 3.128e-02, -1.333e-01, 1.352e-01, 5.954e-03, -2.520e-01, -8.536e-02, -3.566e-01, 2.998e-02, -5.941e-02, -8.531e-02, -4.232e-02)); + r += mul(s1_6, M4(2.592e-02, -7.528e-02, -1.956e-02, 1.002e-01, 2.992e-02, -1.673e-01, 4.413e-02, 1.683e-01, 1.440e-02, -1.047e-02, 1.425e-02, -1.292e-01, -1.777e-01, 1.220e-01, -6.381e-02, 4.174e-02)); + r += mul(s1_7, M4(-3.107e-02, -8.612e-02, 1.248e-02, -8.544e-02, -1.161e-01, 7.718e-02, -1.150e-01, -1.699e-01, -1.392e-02, 7.590e-02, -5.195e-02, -3.599e-01, 4.872e-02, 1.381e-01, -1.143e-01, -1.473e-03)); + r += mul(s1_8, M4(1.277e-02, 3.020e-02, 4.658e-02, 8.071e-02, 6.867e-02, -2.693e-02, 7.897e-02, -1.264e-02, -1.035e-03, 1.509e-01, 4.169e-02, -1.716e-01, -4.694e-03, 1.627e-02, 7.171e-03, -4.496e-02)); + r += V4(4.014e-03, -2.020e-02, 1.560e-02, -2.352e-02); + return r; +} + +void Pass4(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = Rmp8x8(tid.x) + blockStart; + uint2 size = GetInputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = (gxy + 0.5) * pt; + + V4 s0_0 = l0(-1.0, -1.0); + V4 s0_1 = l0(0.0, -1.0); + V4 s0_2 = l0(1.0, -1.0); + V4 s0_3 = l0(-1.0, 0.0); + V4 s0_4 = l0(0.0, 0.0); + V4 s0_5 = l0(1.0, 0.0); + V4 s0_6 = l0(-1.0, 1.0); + V4 s0_7 = l0(0.0, 1.0); + V4 s0_8 = l0(1.0, 1.0); + V4 s1_0 = -max(-s0_0, 0.0); + V4 s1_1 = -max(-s0_1, 0.0); + V4 s1_2 = -max(-s0_2, 0.0); + V4 s1_3 = -max(-s0_3, 0.0); + V4 s1_4 = -max(-s0_4, 0.0); + V4 s1_5 = -max(-s0_5, 0.0); + V4 s1_6 = -max(-s0_6, 0.0); + V4 s1_7 = -max(-s0_7, 0.0); + V4 s1_8 = -max(-s0_8, 0.0); + s0_0 = max(s0_0, 0.0); + s0_1 = max(s0_1, 0.0); + s0_2 = max(s0_2, 0.0); + s0_3 = max(s0_3, 0.0); + s0_4 = max(s0_4, 0.0); + s0_5 = max(s0_5, 0.0); + s0_6 = max(s0_6, 0.0); + s0_7 = max(s0_7, 0.0); + s0_8 = max(s0_8, 0.0); + + t1[gxy] = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8); +} + +//!PASS 5 +//!DESC conv4 +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 +//!IN t1 +//!OUT t0 + +#define l0(x, y) V4(O(t1, float2(x, y))) + +V4 f0(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8) { + V4 r = 0.0; + r += mul(s0_0, M4(3.174e-02, -2.020e-01, -6.843e-03, 1.049e-01, 1.680e-01, -6.387e-01, -1.541e-01, -1.952e-01, -4.586e-02, -1.580e-01, -5.507e-02, 1.065e-01, -5.257e-03, -9.464e-02, -9.788e-02, 1.221e-01)); + r += mul(s0_1, M4(1.365e-01, -4.220e-02, -4.186e-02, -1.569e-01, -5.527e-01, -1.180e-01, -2.274e-01, -2.007e-01, 2.207e-02, 1.190e-02, 3.746e-02, -1.565e-01, -2.808e-02, 1.657e-02, -5.376e-02, -1.093e-02)); + r += mul(s0_2, M4(-7.935e-02, -3.809e-02, -3.727e-02, -4.730e-02, -8.556e-02, 3.451e-04, -8.191e-02, 8.086e-02, 2.051e-02, 7.072e-03, 2.537e-02, 2.793e-02, 9.384e-04, -3.624e-02, -2.171e-02, 7.103e-02)); + r += mul(s0_3, M4(-1.261e-02, 2.716e-01, 2.739e-01, -7.349e-02, -2.130e-02, -4.131e-01, -1.851e-01, 1.065e-01, -7.827e-02, 2.868e-01, -1.500e-01, -1.442e-01, -1.842e-02, -2.983e-01, -4.232e-02, 1.395e-01)); + r += mul(s0_4, M4(2.733e-01, 4.015e-01, 4.102e-01, -2.027e-01, 4.229e-01, 2.213e-01, 3.628e-01, -1.011e-01, -4.893e-01, 1.333e-01, -4.245e-02, -8.133e-02, -1.086e-02, -1.089e-01, -8.720e-02, 1.513e-01)); + r += mul(s0_5, M4(8.521e-02, 1.460e-01, 1.589e-01, -2.075e-01, -5.391e-02, 7.449e-03, -6.763e-02, -2.352e-01, 4.055e-02, -1.812e-02, -1.413e-02, 9.240e-02, -3.070e-02, -4.975e-03, -8.972e-02, -2.225e-02)); + r += mul(s0_6, M4(1.880e-01, -1.481e-01, 1.001e-01, 6.339e-02, -6.208e-02, -2.814e-02, -5.944e-03, 1.002e-01, -7.822e-02, 1.010e-01, -2.161e-02, 9.175e-02, 1.495e-02, 1.645e-02, 8.901e-03, -3.865e-02)); + r += mul(s0_7, M4(4.449e-01, -1.089e-01, -1.249e-01, -8.911e-01, 3.096e-02, 1.724e-01, 5.605e-02, -7.605e-02, -9.644e-02, -1.191e-01, -1.332e-01, 2.544e-02, 5.659e-02, -2.706e-04, -9.886e-02, 9.218e-02)); + r += mul(s0_8, M4(7.394e-02, -2.112e-01, 1.505e-02, -1.236e-01, -1.848e-02, -2.716e-02, -6.663e-02, 2.764e-02, -1.120e-02, 3.440e-03, -1.443e-02, 1.745e-02, -3.847e-02, -4.228e-03, -8.888e-02, 2.134e-02)); + r += mul(s1_0, M4(6.588e-03, -6.764e-02, -2.660e-02, -3.967e-02, 6.459e-02, -6.345e-01, -5.784e-01, 9.294e-02, 2.426e-02, -9.858e-02, -9.036e-02, -9.545e-02, 2.094e-02, -1.001e-01, -1.145e-01, -6.470e-02)); + r += mul(s1_1, M4(-2.633e-03, 5.849e-02, 3.154e-02, -7.386e-02, -6.412e-01, -4.405e-01, -5.885e-01, 1.657e-01, -1.757e-01, -1.882e-02, -1.023e-01, -1.713e-01, -1.047e-01, -1.558e-01, -1.509e-01, -2.815e-01)); + r += mul(s1_2, M4(1.880e-01, -3.790e-02, 1.112e-01, 1.672e-02, -1.713e-01, 2.611e-02, -9.008e-02, 9.359e-02, -6.567e-02, 9.399e-02, 3.743e-02, 3.662e-02, 3.190e-02, -1.466e-01, -1.154e-01, 1.692e-02)); + r += mul(s1_3, M4(-1.733e-02, 1.381e-01, 8.342e-02, -5.893e-02, -1.467e-02, -4.365e-01, -3.057e-01, 1.506e-01, 7.300e-02, 6.777e-01, -5.484e-03, -3.499e-01, 1.978e-01, -6.846e-01, -2.921e-01, -1.173e-01)); + r += mul(s1_4, M4(-1.829e-01, -4.506e-01, -5.685e-02, 8.260e-01, 3.056e-01, 1.803e-01, 1.908e-01, -2.029e-01, -1.578e-01, 5.039e-01, 3.016e-01, -4.971e-01, -4.977e-01, 4.537e-01, -4.268e-01, 7.878e-01)); + r += mul(s1_5, M4(-3.251e-01, -1.229e-01, -1.447e-01, 3.290e-01, -2.134e-01, -6.542e-03, -7.109e-02, -1.004e-01, 3.887e-02, -1.008e-01, -7.490e-02, 6.126e-02, 2.757e-01, -1.980e-01, -1.792e-01, 2.722e-01)); + r += mul(s1_6, M4(4.765e-02, -5.401e-02, 4.164e-02, 1.847e-03, -3.178e-02, -4.201e-02, -2.504e-02, 1.350e-02, -1.436e-01, 1.654e-01, -1.099e-02, -3.733e-02, 1.118e-01, -2.529e-01, -1.353e-01, -9.309e-02)); + r += mul(s1_7, M4(1.684e-01, -1.978e-01, 2.645e-02, -9.582e-02, 2.618e-02, 9.350e-02, -2.281e-02, -1.901e-01, 1.176e-02, -1.571e-01, 1.491e-02, -2.105e-01, -1.685e-01, -2.459e-01, -2.166e-01, 1.082e-01)); + r += mul(s1_8, M4(2.225e-02, 7.813e-02, -4.112e-02, 6.166e-02, -4.143e-02, -2.160e-02, -7.478e-02, -2.251e-02, -1.306e-02, -6.002e-02, -7.496e-02, -2.538e-03, 7.824e-02, 9.597e-02, -3.546e-03, -1.794e-01)); + r += V4(-5.942e-03, -2.718e-02, -1.234e-02, 3.307e-02); + return r; +} + +void Pass5(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = Rmp8x8(tid.x) + blockStart; + uint2 size = GetInputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = (gxy + 0.5) * pt; + + V4 s0_0 = l0(-1.0, -1.0); + V4 s0_1 = l0(0.0, -1.0); + V4 s0_2 = l0(1.0, -1.0); + V4 s0_3 = l0(-1.0, 0.0); + V4 s0_4 = l0(0.0, 0.0); + V4 s0_5 = l0(1.0, 0.0); + V4 s0_6 = l0(-1.0, 1.0); + V4 s0_7 = l0(0.0, 1.0); + V4 s0_8 = l0(1.0, 1.0); + V4 s1_0 = -max(-s0_0, 0.0); + V4 s1_1 = -max(-s0_1, 0.0); + V4 s1_2 = -max(-s0_2, 0.0); + V4 s1_3 = -max(-s0_3, 0.0); + V4 s1_4 = -max(-s0_4, 0.0); + V4 s1_5 = -max(-s0_5, 0.0); + V4 s1_6 = -max(-s0_6, 0.0); + V4 s1_7 = -max(-s0_7, 0.0); + V4 s1_8 = -max(-s0_8, 0.0); + s0_0 = max(s0_0, 0.0); + s0_1 = max(s0_1, 0.0); + s0_2 = max(s0_2, 0.0); + s0_3 = max(s0_3, 0.0); + s0_4 = max(s0_4, 0.0); + s0_5 = max(s0_5, 0.0); + s0_6 = max(s0_6, 0.0); + s0_7 = max(s0_7, 0.0); + s0_8 = max(s0_8, 0.0); + + t0[gxy] = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8); +} + +//!PASS 6 +//!DESC conv5 +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 +//!IN t0 +//!OUT t1 + +#define l0(x, y) V4(O(t0, float2(x, y))) + +V4 f0(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-1.069e-01, 1.009e-01, -5.972e-02, -1.732e-02, -9.217e-02, 9.177e-03, -3.127e-02, -5.872e-02, -1.364e-02, -9.990e-04, 1.518e-01, 5.861e-02, -9.835e-02, -1.155e-01, 6.714e-02, -5.142e-02)); + r += mul(s0_1, M4(1.404e-02, 1.372e-01, -2.759e-01, -4.361e-02, -1.407e-01, 1.570e-01, -1.216e-01, -7.289e-02, 3.088e-01, -1.285e-01, 1.107e-01, 1.651e-01, 1.596e-01, -1.569e-01, 1.437e-02, -1.455e-01)); + r += mul(s0_2, M4(-4.001e-02, 1.772e-01, -2.761e-01, 4.916e-02, -1.489e-01, 1.680e-01, -5.244e-02, 1.334e-01, 1.245e-01, -2.321e-01, 5.371e-01, -2.549e-01, -9.624e-02, -1.072e-01, 2.322e-01, -2.261e-01)); + r += mul(s0_3, M4(-2.291e-01, 7.774e-04, -1.015e-02, 6.036e-02, -1.133e-01, 7.554e-02, 1.081e-01, 1.704e-01, 2.123e-01, -2.065e-01, 4.928e-02, 2.352e-03, -2.488e-01, -1.765e-01, 2.044e-01, 1.302e-02)); + r += mul(s0_4, M4(3.195e-01, -5.410e-01, -4.771e-01, -1.713e-01, 2.778e-01, -1.028e-01, 8.603e-02, 2.162e-01, 1.466e-02, 2.633e-02, -3.299e-01, -5.183e-02, -3.598e-01, -4.015e-01, 5.674e-02, -1.429e-01)); + r += mul(s0_5, M4(-1.480e-01, 2.440e-01, -2.189e-01, 1.407e-01, -3.439e-01, 2.624e-01, 4.947e-01, 7.813e-01, 1.067e-01, -6.781e-02, -5.271e-02, -1.331e-02, -2.133e-01, -1.038e-01, 4.267e-01, -4.026e-01)); + r += mul(s0_6, M4(-1.086e-01, 2.607e-01, -1.897e-01, -1.710e-01, 6.096e-02, -1.121e-01, 8.797e-02, -8.204e-02, 4.825e-02, -9.364e-02, 8.472e-02, -1.923e-02, -1.755e-01, 1.086e-01, -3.987e-02, 1.737e-02)); + r += mul(s0_7, M4(5.606e-02, 4.516e-02, -7.352e-02, 7.654e-02, -6.706e-02, 2.674e-01, -2.388e-01, -1.997e-01, 9.871e-02, -9.055e-02, 1.274e-01, 1.854e-01, -1.765e-01, -1.779e-01, 1.114e-01, -1.882e-01)); + r += mul(s0_8, M4(-4.811e-02, 2.057e-01, -2.913e-01, 1.265e-01, 1.304e-01, 1.462e-01, -4.432e-03, 4.191e-01, 6.606e-02, -1.382e-01, 1.052e-01, -3.990e-01, 9.737e-02, -9.675e-02, 6.216e-02, -2.130e-01)); + r += mul(s1_0, M4(-1.183e-01, -5.696e-02, 9.372e-02, 3.074e-03, -2.694e-02, -2.272e-02, -3.489e-02, -2.667e-02, 1.635e-01, -5.761e-04, -1.677e-03, -1.076e-01, -5.411e-02, -1.100e-02, 1.742e-02, 6.403e-02)); + r += mul(s1_1, M4(-4.462e-03, 3.912e-02, -1.208e-01, -9.360e-02, -1.260e-01, 1.602e-02, -1.047e-01, -1.252e-01, 2.940e-01, 1.068e-01, -2.602e-01, 1.692e-01, 1.120e-01, -2.613e-02, -1.083e-02, 1.754e-02)); + r += mul(s1_2, M4(2.307e-02, 1.240e-01, -2.024e-01, 1.761e-01, -2.326e-01, 3.209e-02, 5.352e-02, 3.399e-02, 1.754e-01, -3.059e-01, 4.554e-01, -2.412e-01, 4.242e-03, 3.919e-02, 7.769e-02, -1.155e-01)); + r += mul(s1_3, M4(-1.946e-01, -9.445e-02, 1.698e-01, 1.165e-01, -1.571e-01, 1.700e-02, 5.682e-02, 4.628e-02, 4.425e-01, -1.872e-01, 3.713e-02, 8.537e-02, 4.211e-02, -6.178e-02, 1.398e-02, 5.929e-02)); + r += mul(s1_4, M4(5.957e-01, -6.855e-01, -3.668e-01, -2.565e-01, -4.383e-02, -8.094e-02, -2.101e-02, -2.446e-01, -7.781e-02, 5.879e-01, -5.272e-01, -1.786e-01, -2.396e-01, -4.148e-01, 5.226e-02, 9.011e-02)); + r += mul(s1_5, M4(-4.655e-02, 1.107e-01, -1.109e-01, 3.601e-01, -2.103e-01, 3.712e-01, 1.666e-01, 3.972e-01, -2.227e-02, -2.115e-02, -7.054e-02, -1.216e-01, 4.739e-03, 1.201e-01, 1.335e-01, -1.775e-01)); + r += mul(s1_6, M4(-7.542e-02, 9.157e-02, 1.143e-02, -7.961e-02, -3.812e-02, 1.722e-02, 1.396e-02, -3.920e-02, -6.220e-03, -6.723e-02, 9.364e-02, -4.804e-02, -8.885e-02, 1.313e-01, -7.872e-02, 2.733e-02)); + r += mul(s1_7, M4(-3.879e-01, -2.705e-01, 3.305e-01, -1.542e-01, -1.179e-01, 9.695e-02, -1.353e-01, -2.320e-01, 1.433e-02, -2.689e-01, 2.066e-01, 3.704e-01, -5.587e-02, -6.296e-02, 6.326e-02, 1.881e-02)); + r += mul(s1_8, M4(-4.722e-02, -5.909e-02, 4.089e-02, -8.851e-02, 2.017e-01, -2.652e-02, 9.432e-02, 3.252e-01, -2.219e-01, 2.142e-02, -4.496e-02, 5.456e-02, 2.364e-02, 1.081e-01, -9.898e-02, 9.928e-02)); + r += V4(1.102e-03, 4.481e-03, 3.096e-03, -9.818e-03); + return r; +} + +void Pass6(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = Rmp8x8(tid.x) + blockStart; + uint2 size = GetInputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = (gxy + 0.5) * pt; + + V4 s0_0 = l0(-1.0, -1.0); + V4 s0_1 = l0(0.0, -1.0); + V4 s0_2 = l0(1.0, -1.0); + V4 s0_3 = l0(-1.0, 0.0); + V4 s0_4 = l0(0.0, 0.0); + V4 s0_5 = l0(1.0, 0.0); + V4 s0_6 = l0(-1.0, 1.0); + V4 s0_7 = l0(0.0, 1.0); + V4 s0_8 = l0(1.0, 1.0); + V4 s1_0 = -max(-s0_0, 0.0); + V4 s1_1 = -max(-s0_1, 0.0); + V4 s1_2 = -max(-s0_2, 0.0); + V4 s1_3 = -max(-s0_3, 0.0); + V4 s1_4 = -max(-s0_4, 0.0); + V4 s1_5 = -max(-s0_5, 0.0); + V4 s1_6 = -max(-s0_6, 0.0); + V4 s1_7 = -max(-s0_7, 0.0); + V4 s1_8 = -max(-s0_8, 0.0); + s0_0 = max(s0_0, 0.0); + s0_1 = max(s0_1, 0.0); + s0_2 = max(s0_2, 0.0); + s0_3 = max(s0_3, 0.0); + s0_4 = max(s0_4, 0.0); + s0_5 = max(s0_5, 0.0); + s0_6 = max(s0_6, 0.0); + s0_7 = max(s0_7, 0.0); + s0_8 = max(s0_8, 0.0); + + t1[gxy] = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8); +} + +//!PASS 7 +//!DESC conv6 +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 +//!IN t1 +//!OUT t0 + +#define l0(x, y) V4(O(t1, float2(x, y))) + +V4 f0(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-3.488e-02, 3.507e-02, 3.848e-02, -5.906e-02, 9.669e-02, 3.121e-02, -2.182e-02, 1.691e-01, -1.132e-01, -7.602e-02, -5.000e-02, -6.017e-03, 3.962e-02, 1.086e-01, -3.343e-04, 9.002e-02)); + r += mul(s0_1, M4(9.453e-02, -1.793e-01, -6.074e-02, 5.317e-03, 1.056e-01, 3.460e-01, 5.291e-02, 7.825e-02, 5.510e-02, 4.818e-02, -1.119e-02, 3.913e-02, -8.177e-02, -1.060e-01, -9.989e-03, -9.245e-02)); + r += mul(s0_2, M4(-8.190e-02, 1.375e-01, -4.322e-02, -6.721e-02, 1.645e-02, -1.392e-01, 7.103e-02, -1.950e-02, 4.302e-03, -3.213e-02, -7.517e-03, -3.406e-03, -2.132e-02, 1.333e-01, -6.553e-02, 7.300e-02)); + r += mul(s0_3, M4(-1.102e-01, 3.005e-01, -8.521e-02, 3.002e-01, 1.866e-01, 1.089e-01, -2.968e-02, 1.271e-01, -3.566e-01, 1.224e-01, -7.462e-02, -2.765e-01, 5.175e-02, 1.567e-01, 1.450e-01, -1.948e-01)); + r += mul(s0_4, M4(1.558e-01, 3.780e-02, 9.697e-02, -2.485e-01, -3.560e-01, -3.667e-01, 1.396e-01, 1.020e+00, -2.319e-01, -2.878e-01, -2.849e-01, 5.648e-01, 2.094e-01, -5.684e-01, 1.482e-01, -6.172e-01)); + r += mul(s0_5, M4(-1.276e-01, -1.685e-01, 4.271e-01, -1.489e-01, 2.154e-01, 2.661e-01, -1.093e-01, -7.859e-02, 6.618e-02, 9.795e-02, 2.778e-02, -1.286e-01, -1.527e-01, -3.586e-01, 2.523e-01, 9.196e-02)); + r += mul(s0_6, M4(-1.354e-01, -6.680e-02, 5.541e-02, -5.314e-02, 1.639e-02, -1.639e-01, -1.856e-01, -1.863e-01, -1.519e-01, -5.459e-02, 1.027e-01, 6.492e-02, 3.482e-02, -9.074e-03, 1.861e-01, 1.393e-01)); + r += mul(s0_7, M4(1.907e-02, 1.189e-02, -5.038e-01, -8.478e-02, 3.643e-01, 1.086e-02, 3.067e-01, 1.071e-01, -6.552e-01, 1.505e-01, -7.394e-01, 1.155e-01, -1.815e-01, -1.739e-02, -2.723e-01, -1.607e-01)); + r += mul(s0_8, M4(-8.319e-02, -2.563e-02, -1.127e-01, -7.792e-02, 1.295e-01, 1.091e-01, 2.920e-02, -5.761e-02, -9.443e-02, 7.429e-03, -2.117e-01, -3.670e-02, -7.118e-02, -4.469e-02, -6.460e-02, -1.261e-02)); + r += mul(s1_0, M4(2.400e-02, -2.740e-02, -3.394e-02, 5.817e-02, -6.716e-02, -5.672e-02, -7.339e-02, -3.921e-02, -9.506e-02, -3.805e-02, -3.235e-02, -8.145e-02, 1.265e-02, 7.308e-02, -5.707e-02, 1.141e-01)); + r += mul(s1_1, M4(-1.565e-01, 1.052e-01, -8.934e-02, -6.945e-02, 3.804e-02, 2.091e-01, -1.102e-01, 2.394e-01, 6.041e-02, -9.942e-02, -6.054e-03, 4.857e-02, -7.265e-02, 1.596e-02, 9.135e-02, -8.397e-02)); + r += mul(s1_2, M4(-9.449e-02, 1.121e-01, -1.101e-01, -2.980e-02, 5.100e-02, -6.337e-02, 1.692e-01, -5.062e-02, -3.931e-02, 1.083e-01, 3.952e-03, 9.801e-04, -6.425e-02, 8.015e-02, -1.628e-01, 8.317e-02)); + r += mul(s1_3, M4(7.400e-02, 8.412e-02, 2.984e-02, 8.693e-02, -1.474e-01, -3.529e-02, -6.134e-02, -1.107e-01, -3.264e-01, 8.009e-02, -2.261e-01, -1.472e-01, -4.683e-02, -1.258e-01, 1.061e-01, -1.125e-01)); + r += mul(s1_4, M4(4.970e-01, -1.211e-01, 2.379e-01, 2.124e-01, -1.003e-01, -5.656e-01, 5.001e-02, 4.959e-01, 1.538e-01, -7.985e-01, -2.085e-01, 2.220e-01, 7.247e-02, 6.581e-02, -9.437e-02, -3.066e-01)); + r += mul(s1_5, M4(-8.611e-02, -9.199e-02, 2.518e-01, -7.482e-02, -1.208e-01, 1.015e-01, 3.428e-02, -1.354e-01, 1.038e-01, -4.497e-02, 2.744e-01, -4.281e-02, 4.090e-02, -2.726e-01, 1.839e-01, 1.138e-01)); + r += mul(s1_6, M4(-8.703e-02, -4.776e-02, -1.477e-01, -1.870e-02, -1.072e-01, 3.204e-02, -8.396e-03, 1.175e-01, 1.685e-01, -1.427e-01, 2.152e-01, -2.155e-01, 1.898e-03, 5.924e-02, -1.089e-02, 5.197e-02)); + r += mul(s1_7, M4(-9.679e-02, 1.961e-02, 1.636e-01, -6.049e-02, -7.071e-03, 1.519e-01, -6.303e-01, 4.739e-02, -3.331e-01, 8.291e-02, -5.944e-01, -7.677e-02, -1.164e-01, -4.580e-02, 1.419e-01, 6.839e-02)); + r += mul(s1_8, M4(6.174e-02, -4.004e-02, 1.256e-02, -4.981e-02, 4.659e-03, 8.371e-02, -1.664e-01, -2.897e-02, -1.253e-01, 2.381e-02, -1.147e-01, -8.724e-02, -3.736e-02, 1.140e-02, -1.550e-01, 6.350e-03)); + r += V4(-6.918e-03, -1.945e-03, -7.751e-03, 1.645e-02); + return r; +} + +void Pass7(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = Rmp8x8(tid.x) + blockStart; + uint2 size = GetInputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = (gxy + 0.5) * pt; + + V4 s0_0 = l0(-1.0, -1.0); + V4 s0_1 = l0(0.0, -1.0); + V4 s0_2 = l0(1.0, -1.0); + V4 s0_3 = l0(-1.0, 0.0); + V4 s0_4 = l0(0.0, 0.0); + V4 s0_5 = l0(1.0, 0.0); + V4 s0_6 = l0(-1.0, 1.0); + V4 s0_7 = l0(0.0, 1.0); + V4 s0_8 = l0(1.0, 1.0); + V4 s1_0 = -max(-s0_0, 0.0); + V4 s1_1 = -max(-s0_1, 0.0); + V4 s1_2 = -max(-s0_2, 0.0); + V4 s1_3 = -max(-s0_3, 0.0); + V4 s1_4 = -max(-s0_4, 0.0); + V4 s1_5 = -max(-s0_5, 0.0); + V4 s1_6 = -max(-s0_6, 0.0); + V4 s1_7 = -max(-s0_7, 0.0); + V4 s1_8 = -max(-s0_8, 0.0); + s0_0 = max(s0_0, 0.0); + s0_1 = max(s0_1, 0.0); + s0_2 = max(s0_2, 0.0); + s0_3 = max(s0_3, 0.0); + s0_4 = max(s0_4, 0.0); + s0_5 = max(s0_5, 0.0); + s0_6 = max(s0_6, 0.0); + s0_7 = max(s0_7, 0.0); + s0_8 = max(s0_8, 0.0); + + t0[gxy] = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8); +} + +//!PASS 8 +//!DESC conv7 +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 +//!IN t0 +//!OUT t1 + +#define l0(x, y) V4(O(t0, float2(x, y))) + +V4 f0(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-4.116e-02, -3.385e-02, -4.697e-02, 4.650e-02, -3.488e-02, 1.006e-01, -4.538e-03, 4.637e-02, 1.288e-01, 7.769e-03, 1.150e-01, -7.930e-03, 1.045e-02, 4.849e-02, 2.767e-02, 4.909e-02)); + r += mul(s0_1, M4(-5.332e-01, -5.254e-01, -3.541e-01, -3.525e-01, 1.117e-02, 2.929e-02, 6.817e-02, 9.115e-02, 1.055e+00, 6.141e-02, 3.976e-01, 4.649e-02, 2.561e-01, -1.191e-01, 1.230e-03, -1.047e-01)); + r += mul(s0_2, M4(-1.450e-01, -2.829e-01, -6.857e-01, -4.294e-01, 3.217e-02, 2.745e-02, 5.242e-02, 3.556e-02, 1.284e-01, 4.292e-01, 7.161e-01, 2.220e-01, -1.508e-02, 1.802e-01, 1.842e-01, 9.827e-02)); + r += mul(s0_3, M4(1.381e-01, 5.690e-02, 5.107e-02, 6.625e-02, -1.173e-01, -7.448e-02, -1.152e-01, -1.808e-01, -1.470e-01, -1.833e-01, -1.653e-01, -1.217e-01, 9.096e-02, 5.579e-02, 1.128e-02, 9.791e-02)); + r += mul(s0_4, M4(5.936e-01, -2.579e-01, 5.761e-01, -7.051e-01, -7.023e-01, 2.824e-01, 2.057e-01, 3.628e-01, 1.006e-02, 3.209e-01, 6.969e-02, -3.464e-01, 4.768e-01, -3.194e-01, -4.817e-02, 3.050e-02)); + r += mul(s0_5, M4(2.145e-01, -1.899e-01, 1.446e-01, 2.497e-02, -8.750e-02, -3.154e-01, -5.060e-01, -7.413e-02, -8.542e-02, -4.198e-02, -1.528e-01, -1.812e-01, -2.597e-01, 8.374e-02, -5.592e-01, -2.557e-01)); + r += mul(s0_6, M4(5.713e-02, -4.294e-03, 2.388e-02, -7.124e-02, -2.163e-02, -3.642e-03, 3.839e-02, -6.934e-02, -9.052e-02, -1.153e-02, 1.213e-02, 7.120e-02, -3.698e-02, 4.260e-02, -7.245e-02, 7.898e-02)); + r += mul(s0_7, M4(2.780e-02, 1.944e-02, 1.415e-01, 1.216e-01, 9.163e-02, -3.069e-02, -1.829e-02, -2.182e-01, 5.815e-02, -1.923e-02, -5.934e-02, -3.487e-02, -1.082e-01, 1.362e-01, 8.120e-02, 2.621e-01)); + r += mul(s0_8, M4(9.334e-03, -1.300e-02, 4.936e-02, 1.751e-01, -1.214e-01, 1.629e-02, -1.131e-01, 7.402e-02, 1.134e-02, 1.663e-03, -5.887e-03, -8.862e-02, 1.029e-01, -5.629e-02, 9.127e-02, -6.668e-02)); + r += mul(s1_0, M4(1.165e-02, 4.389e-02, 6.299e-03, 7.939e-02, -2.769e-02, 9.353e-02, 6.239e-02, 1.341e-02, 4.713e-02, -2.731e-03, 5.256e-02, -3.515e-02, -8.911e-02, -1.425e-01, -7.889e-02, -1.627e-01)); + r += mul(s1_1, M4(-2.869e-01, 2.838e-02, -2.541e-02, 5.216e-02, 2.660e-01, -2.095e-01, 1.375e-01, -2.562e-02, 2.715e-01, 1.694e-01, 9.471e-02, -7.292e-03, 3.257e-01, -2.247e-01, 7.698e-03, -2.076e-01)); + r += mul(s1_2, M4(1.832e-02, -1.860e-01, -4.951e-02, -1.392e-03, 9.307e-02, 7.671e-02, 1.043e-01, -3.675e-02, 1.433e-03, 1.219e-01, 1.978e-01, 5.960e-02, 9.624e-02, 1.448e-01, 3.561e-01, 3.054e-02)); + r += mul(s1_3, M4(-4.647e-02, 4.225e-03, 3.830e-02, -3.233e-02, -1.532e-01, -6.289e-01, -3.037e-01, -4.131e-01, -1.794e-01, -4.090e-02, -9.644e-02, -4.828e-02, 7.978e-02, 6.792e-03, 5.043e-02, 4.905e-02)); + r += mul(s1_4, M4(2.967e-01, -5.750e-02, 1.168e-01, -2.681e-02, 1.232e-01, -2.481e-03, 8.164e-01, 2.468e-01, -3.721e-01, -5.041e-02, -4.796e-01, -2.778e-02, 3.623e-01, -8.387e-01, -5.229e-01, -4.492e-01)); + r += mul(s1_5, M4(-1.507e-02, 1.343e-01, 8.567e-02, 8.923e-02, -2.766e-03, -1.548e-01, -2.588e-01, -1.295e-01, 1.777e-02, -9.243e-02, -4.495e-02, -5.528e-02, -1.071e-01, -1.284e-01, -4.142e-01, -1.800e-01)); + r += mul(s1_6, M4(-4.695e-03, -9.431e-04, -1.256e-02, -4.959e-03, 1.607e-01, -8.763e-02, 2.039e-01, -1.243e-01, 3.725e-02, -5.612e-02, -3.615e-03, -2.475e-02, 4.955e-02, 4.065e-02, -1.879e-02, -1.195e-01)); + r += mul(s1_7, M4(-1.039e-02, 5.631e-02, 2.655e-02, 7.419e-02, 1.286e-01, -6.430e-02, 4.800e-02, -4.480e-02, 5.067e-03, -4.197e-02, -3.342e-02, -7.461e-02, -3.225e-02, 6.062e-03, 5.391e-02, -7.135e-02)); + r += mul(s1_8, M4(5.195e-02, 3.799e-02, 1.130e-01, -8.811e-03, -4.285e-02, 1.609e-02, -8.972e-03, 3.530e-02, -6.932e-02, -3.013e-03, -5.208e-02, 5.823e-02, -4.561e-02, -1.068e-01, -1.458e-01, -5.739e-02)); + r += V4(1.569e-02, 1.505e-02, 2.765e-02, 1.258e-02); + return r; +} + +void Pass8(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = Rmp8x8(tid.x) + blockStart; + uint2 size = GetInputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = (gxy + 0.5) * pt; + + V4 s0_0 = l0(-1.0, -1.0); + V4 s0_1 = l0(0.0, -1.0); + V4 s0_2 = l0(1.0, -1.0); + V4 s0_3 = l0(-1.0, 0.0); + V4 s0_4 = l0(0.0, 0.0); + V4 s0_5 = l0(1.0, 0.0); + V4 s0_6 = l0(-1.0, 1.0); + V4 s0_7 = l0(0.0, 1.0); + V4 s0_8 = l0(1.0, 1.0); + V4 s1_0 = -max(-s0_0, 0.0); + V4 s1_1 = -max(-s0_1, 0.0); + V4 s1_2 = -max(-s0_2, 0.0); + V4 s1_3 = -max(-s0_3, 0.0); + V4 s1_4 = -max(-s0_4, 0.0); + V4 s1_5 = -max(-s0_5, 0.0); + V4 s1_6 = -max(-s0_6, 0.0); + V4 s1_7 = -max(-s0_7, 0.0); + V4 s1_8 = -max(-s0_8, 0.0); + s0_0 = max(s0_0, 0.0); + s0_1 = max(s0_1, 0.0); + s0_2 = max(s0_2, 0.0); + s0_3 = max(s0_3, 0.0); + s0_4 = max(s0_4, 0.0); + s0_5 = max(s0_5, 0.0); + s0_6 = max(s0_6, 0.0); + s0_7 = max(s0_7, 0.0); + s0_8 = max(s0_8, 0.0); + + t1[gxy] = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8); +} + +//!PASS 9 +//!DESC conv8 +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 +//!IN t1 +//!OUT t0 + +#define l0(x, y) V4(O(t1, float2(x, y))) + +V4 f0(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8) { + V4 r = 0.0; + r += mul(s0_0, M4(4.724e-03, 6.987e-03, -3.797e-03, 2.147e-02, -5.616e-03, 1.123e-02, -2.768e-02, 8.185e-03, -4.051e-03, 5.608e-05, -9.522e-02, 2.924e-02, -5.976e-03, 8.331e-03, 7.513e-02, -2.513e-02)); + r += mul(s0_1, M4(-2.224e-02, 1.093e-04, 5.901e-02, 2.350e-02, 1.167e-01, -7.837e-02, 1.939e-01, 1.987e-01, 5.530e-02, -4.759e-05, 1.221e-01, 4.764e-02, -8.813e-02, 7.695e-02, -4.577e-01, 1.671e-02)); + r += mul(s0_2, M4(-5.696e-02, 6.005e-03, -5.620e-02, -8.978e-02, 4.014e-02, -3.822e-02, 1.081e-01, -6.532e-03, 9.444e-03, 7.498e-03, -3.228e-02, 4.908e-02, -2.043e-02, 2.374e-02, 2.163e-02, -4.505e-02)); + r += mul(s0_3, M4(-8.098e-02, 1.943e-02, -5.744e-02, 3.824e-02, -2.071e-01, 1.036e-01, -6.926e-02, -2.348e-01, 2.378e-01, -1.069e-01, -5.307e-02, 1.161e-01, 1.881e-01, -5.785e-02, -6.570e-02, 2.227e-01)); + r += mul(s0_4, M4(7.577e-02, -4.125e-02, 1.714e-01, -6.934e-01, -2.448e-01, 1.146e-01, 2.354e-01, -4.935e-01, -2.321e-01, -8.273e-02, 5.890e-02, 5.704e-01, 4.833e-02, 2.875e-02, 1.163e-01, -1.802e-01)); + r += mul(s0_5, M4(2.287e-01, -3.461e-02, -2.542e-02, 2.882e-02, 7.142e-02, -1.556e-01, 4.055e-02, 1.534e-02, -1.647e-01, 3.087e-03, -6.811e-02, -3.896e-02, 1.334e-01, 1.188e-01, -1.847e-01, 4.293e-02)); + r += mul(s0_6, M4(-3.094e-02, 2.712e-03, 3.387e-03, 1.877e-02, 9.494e-02, -2.863e-02, -4.239e-02, -3.402e-02, 5.541e-03, -1.178e-02, 1.795e-02, -3.515e-02, -3.044e-02, -2.463e-02, -1.320e-02, 8.952e-02)); + r += mul(s0_7, M4(1.035e-01, -3.181e-02, 1.902e-02, 3.973e-03, 2.267e-01, -2.620e-01, 1.821e-01, 1.631e-01, 1.494e-02, 6.125e-02, -6.176e-02, -2.497e-02, -1.364e-02, 7.542e-02, -8.480e-02, -4.648e-02)); + r += mul(s0_8, M4(-1.466e-01, 3.028e-02, 2.798e-02, -7.887e-02, -4.370e-02, 1.408e-02, -6.161e-02, -3.034e-02, 6.567e-02, 2.071e-02, 3.126e-02, 6.993e-02, -5.556e-02, 1.507e-02, 2.991e-02, -4.924e-02)); + r += mul(s1_0, M4(1.637e-02, -2.767e-02, 8.568e-02, -4.254e-02, 3.215e-02, 1.987e-04, -3.697e-02, 3.787e-02, 2.236e-02, -6.576e-02, 7.400e-02, 1.093e-01, 3.271e-03, 1.809e-03, 1.011e-02, 1.509e-01)); + r += mul(s1_1, M4(5.538e-02, -5.865e-02, 4.351e-01, 2.494e-01, 1.101e-01, -1.484e-02, 5.176e-01, 3.999e-02, -4.782e-03, 1.155e-01, -2.099e-01, 5.012e-03, -1.919e-01, 2.292e-01, -5.378e-01, -1.223e-01)); + r += mul(s1_2, M4(-5.691e-02, 7.653e-02, -2.572e-01, -1.332e-01, -5.652e-02, -5.008e-02, 7.840e-02, -3.729e-02, 6.942e-02, 6.483e-04, -2.243e-05, 8.430e-02, -6.848e-02, -2.096e-02, -3.908e-02, -9.062e-02)); + r += mul(s1_3, M4(2.725e-01, -1.841e-01, -6.710e-03, 3.965e-01, -1.298e-01, -4.014e-03, 2.007e-01, -3.700e-01, 5.329e-01, -4.014e-01, 2.619e-02, 1.606e-01, 2.179e-01, -1.403e-01, 4.227e-02, 8.568e-02)); + r += mul(s1_4, M4(4.188e-01, -7.320e-01, -5.609e-01, -6.087e-01, -7.521e-01, 7.363e-01, -6.253e-01, -2.011e-01, -1.017e+00, 3.331e-02, -2.135e-02, 2.084e-01, 6.074e-01, -9.824e-01, 5.154e-01, 1.748e-01)); + r += mul(s1_5, M4(1.733e-01, 5.176e-01, -7.335e-02, 1.899e-02, 1.028e-01, -6.330e-02, -1.632e-01, 9.241e-05, -1.357e-01, -1.131e-01, 9.644e-02, -1.424e-02, -1.835e-02, 7.296e-01, -3.204e-01, -2.966e-02)); + r += mul(s1_6, M4(4.798e-02, -1.047e-01, 3.646e-02, 6.703e-02, 5.371e-02, 4.759e-02, -2.975e-02, -6.945e-02, 7.985e-02, -1.101e-01, 3.034e-02, -1.472e-02, -3.827e-02, 9.839e-03, -4.922e-03, 4.307e-03)); + r += mul(s1_7, M4(-8.950e-02, -1.253e-02, -1.730e-05, 3.862e-02, 2.692e-01, -4.645e-01, 2.399e-01, 2.744e-01, -4.503e-02, 1.724e-01, -7.935e-02, -5.200e-02, -2.132e-03, -1.926e-02, 2.926e-02, -2.288e-02)); + r += mul(s1_8, M4(-1.072e-01, -1.145e-02, 6.605e-03, -1.090e-01, -7.524e-03, 8.598e-02, -7.698e-02, -6.976e-02, 5.869e-02, -5.499e-02, 3.529e-02, 7.813e-02, -1.794e-01, 4.212e-02, -4.479e-03, -7.253e-02)); + r += V4(8.112e-05, 3.290e-03, -6.342e-04, 1.340e-02); + return r; +} + +void Pass9(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = Rmp8x8(tid.x) + blockStart; + uint2 size = GetInputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = (gxy + 0.5) * pt; + + V4 s0_0 = l0(-1.0, -1.0); + V4 s0_1 = l0(0.0, -1.0); + V4 s0_2 = l0(1.0, -1.0); + V4 s0_3 = l0(-1.0, 0.0); + V4 s0_4 = l0(0.0, 0.0); + V4 s0_5 = l0(1.0, 0.0); + V4 s0_6 = l0(-1.0, 1.0); + V4 s0_7 = l0(0.0, 1.0); + V4 s0_8 = l0(1.0, 1.0); + V4 s1_0 = -max(-s0_0, 0.0); + V4 s1_1 = -max(-s0_1, 0.0); + V4 s1_2 = -max(-s0_2, 0.0); + V4 s1_3 = -max(-s0_3, 0.0); + V4 s1_4 = -max(-s0_4, 0.0); + V4 s1_5 = -max(-s0_5, 0.0); + V4 s1_6 = -max(-s0_6, 0.0); + V4 s1_7 = -max(-s0_7, 0.0); + V4 s1_8 = -max(-s0_8, 0.0); + s0_0 = max(s0_0, 0.0); + s0_1 = max(s0_1, 0.0); + s0_2 = max(s0_2, 0.0); + s0_3 = max(s0_3, 0.0); + s0_4 = max(s0_4, 0.0); + s0_5 = max(s0_5, 0.0); + s0_6 = max(s0_6, 0.0); + s0_7 = max(s0_7, 0.0); + s0_8 = max(s0_8, 0.0); + + t0[gxy] = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8); +} + +//!PASS 10 +//!DESC out-shuffle +//!BLOCK_SIZE 16 +//!NUM_THREADS 64 +//!IN INPUT, t0 +//!OUT OUTPUT + +#define l0(x, y) V4(O(t0, float2(x, y))) + +V4 f0(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-1.348e-01, -9.107e-02, -4.849e-02, 4.484e-04, -3.384e-02, -6.768e-02, -9.628e-03, -1.766e-02, -9.939e-03, -2.182e-02, -1.288e-02, 8.518e-03, 2.218e-02, -1.184e-03, 1.240e-03, 1.065e-02)); + r += mul(s0_1, M4(7.301e-02, 1.014e-01, -1.363e-02, -4.850e-02, -2.842e-01, -3.060e-02, -4.154e-02, 4.057e-03, -3.458e-02, -6.335e-02, -2.660e-02, -1.335e-02, -7.944e-03, 8.560e-03, 4.588e-02, 7.580e-03)); + r += mul(s0_2, M4(-9.349e-05, -2.142e-02, -1.258e-04, -9.330e-03, -5.058e-03, 3.912e-02, -2.976e-02, 2.410e-02, -8.512e-03, 4.954e-02, -2.093e-02, -2.582e-03, 1.648e-02, 7.942e-03, 1.520e-02, 3.414e-02)); + r += mul(s0_3, M4(-1.021e-01, -1.140e-01, 2.412e-01, 1.289e-02, -1.192e-01, -1.140e-01, 2.395e-01, 6.930e-03, -2.027e-01, -4.824e-02, 1.243e-01, 3.820e-03, 9.280e-03, 2.866e-02, 2.106e-02, 3.644e-03)); + r += mul(s0_4, M4(8.727e-02, 8.162e-02, 1.478e-01, 5.348e-01, -3.115e-01, -2.605e-02, 1.510e-01, 7.249e-01, -8.110e-02, -6.698e-01, 1.080e-01, -8.090e-02, -3.492e-01, -1.891e-01, -1.877e-01, -1.319e-01)); + r += mul(s0_5, M4(-5.622e-03, 2.237e-02, -4.008e-03, -1.980e-02, -1.837e-02, -3.311e-02, 4.289e-02, 3.256e-02, -2.178e-02, 2.653e-02, -1.722e-03, 8.373e-02, -8.042e-02, -2.962e-01, -4.643e-03, -6.865e-02)); + r += mul(s0_6, M4(6.248e-03, -2.320e-02, 1.883e-03, -1.430e-02, 1.224e-02, 5.634e-03, -1.964e-02, -1.627e-02, 2.010e-02, 1.174e-02, -3.919e-02, 9.559e-04, 3.016e-02, -2.836e-03, 7.667e-02, 3.552e-02)); + r += mul(s0_7, M4(-6.141e-03, 1.380e-02, 1.024e-02, -1.210e-02, 4.548e-02, 3.626e-02, -9.142e-02, -7.666e-02, -3.241e-02, -2.296e-02, -3.244e-02, -2.870e-01, 4.427e-02, 8.899e-02, -1.327e-01, 4.920e-02)); + r += mul(s0_8, M4(-2.801e-03, -9.930e-04, -2.770e-03, 1.623e-02, 2.158e-03, -1.258e-02, -3.089e-02, 3.211e-02, -9.620e-03, 1.776e-02, -4.337e-03, 4.676e-02, 1.130e-02, -7.436e-03, -3.572e-02, -1.742e-01)); + r += mul(s1_0, M4(-4.306e-02, -6.039e-02, -1.642e-02, -1.966e-02, -5.996e-02, -1.743e-01, -3.128e-02, 1.714e-02, -4.357e-03, -7.720e-03, -4.532e-03, 4.571e-03, 3.988e-02, 2.067e-02, 1.548e-02, -2.964e-04)); + r += mul(s1_1, M4(-6.070e-02, -9.324e-02, 7.472e-03, 2.173e-02, -7.996e-02, -5.139e-02, -5.545e-02, -1.891e-02, -1.767e-02, -1.527e-02, -2.906e-02, 1.310e-02, 2.594e-02, 7.495e-02, -7.681e-03, -4.678e-03)); + r += mul(s1_2, M4(4.883e-02, -3.167e-02, 2.862e-02, 3.357e-02, -8.454e-03, 9.265e-03, -1.657e-02, -8.086e-03, -1.170e-02, -3.549e-02, 7.437e-03, 1.425e-02, 1.441e-02, -1.961e-02, 1.560e-02, -1.122e-02)); + r += mul(s1_3, M4(-6.156e-02, -6.763e-02, 1.987e-01, 2.459e-02, -5.710e-02, -2.009e-01, 4.581e-01, -1.181e-02, -9.054e-02, -5.658e-02, 3.432e-02, 2.004e-02, 6.965e-03, -1.655e-02, 5.178e-03, -1.236e-02)); + r += mul(s1_4, M4(-1.301e-01, -5.093e-02, 7.676e-01, 6.003e-01, -9.216e-02, -2.228e-03, 7.034e-02, 1.851e-01, -5.318e-01, -1.852e-01, -2.980e-02, 1.919e-02, -8.147e-01, -1.773e-01, -2.675e-01, 2.314e-02)); + r += mul(s1_5, M4(-9.962e-03, -1.888e-01, -1.877e-02, 1.190e-01, -2.283e-02, -1.241e-02, 2.969e-04, 3.894e-02, -5.077e-02, 2.300e-01, -6.192e-02, 1.793e-01, 5.384e-03, -4.378e-01, 2.970e-02, -1.125e-01)); + r += mul(s1_6, M4(1.376e-02, -2.891e-03, 9.292e-03, -1.288e-03, 2.615e-02, 2.656e-02, -8.111e-02, -1.779e-02, -7.512e-03, 9.174e-03, -4.553e-02, -1.139e-02, 2.259e-02, 4.351e-03, 4.963e-02, 2.002e-02)); + r += mul(s1_7, M4(9.993e-03, 1.250e-02, -2.090e-02, 6.839e-03, 3.502e-03, 2.070e-03, -5.530e-02, -2.855e-03, 1.144e-02, -4.191e-02, -8.395e-02, -2.056e-01, 6.909e-02, 7.425e-02, -2.374e-01, 8.636e-02)); + r += mul(s1_8, M4(-1.762e-02, -3.804e-04, 2.643e-02, 4.383e-02, 1.748e-03, -1.201e-02, -8.452e-03, -1.216e-02, -1.203e-02, -3.454e-02, -1.957e-02, 2.212e-01, -1.375e-02, -1.094e-02, -1.245e-02, -2.124e-01)); + r += V4(3.107e-03, 3.655e-03, 5.416e-04, 5.397e-04); + return tanh(r); +} + +void Pass10(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = (Rmp8x8(tid.x) << 1) + blockStart; + uint2 size = GetOutputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = ((gxy >> 1) + 0.5) * pt; + + V4 s0_0 = l0(-1.0, -1.0); + V4 s0_1 = l0(0.0, -1.0); + V4 s0_2 = l0(1.0, -1.0); + V4 s0_3 = l0(-1.0, 0.0); + V4 s0_4 = l0(0.0, 0.0); + V4 s0_5 = l0(1.0, 0.0); + V4 s0_6 = l0(-1.0, 1.0); + V4 s0_7 = l0(0.0, 1.0); + V4 s0_8 = l0(1.0, 1.0); + V4 s1_0 = -max(-s0_0, 0.0); + V4 s1_1 = -max(-s0_1, 0.0); + V4 s1_2 = -max(-s0_2, 0.0); + V4 s1_3 = -max(-s0_3, 0.0); + V4 s1_4 = -max(-s0_4, 0.0); + V4 s1_5 = -max(-s0_5, 0.0); + V4 s1_6 = -max(-s0_6, 0.0); + V4 s1_7 = -max(-s0_7, 0.0); + V4 s1_8 = -max(-s0_8, 0.0); + s0_0 = max(s0_0, 0.0); + s0_1 = max(s0_1, 0.0); + s0_2 = max(s0_2, 0.0); + s0_3 = max(s0_3, 0.0); + s0_4 = max(s0_4, 0.0); + s0_5 = max(s0_5, 0.0); + s0_6 = max(s0_6, 0.0); + s0_7 = max(s0_7, 0.0); + s0_8 = max(s0_8, 0.0); + + V4 r = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8); + + static const float3x3 rgb2yuv = {0.299, 0.587, 0.114, -0.169, -0.331, 0.5, 0.5, -0.419, -0.081}; + static const float3x3 yuv2rgb = {1, -0.00093, 1.401687, 1, -0.3437, -0.71417, 1, 1.77216, 0.00099}; + float2 opt = float2(GetOutputPt()); + + pos -= 0.5f * opt; + float3 yuv = mul(rgb2yuv, INPUT.SampleLevel(SL, pos, 0).rgb); + OUTPUT[gxy] = float4(mul(yuv2rgb, float3(saturate(yuv.r + r.x), yuv.yz)), 1); + + ++gxy.x; + pos.x += opt.x; + yuv = mul(rgb2yuv, INPUT.SampleLevel(SL, pos, 0).rgb); + OUTPUT[gxy] = float4(mul(yuv2rgb, float3(saturate(yuv.r + r.y), yuv.yz)), 1); + + ++gxy.y; + pos.y += opt.y; + yuv = mul(rgb2yuv, INPUT.SampleLevel(SL, pos, 0).rgb); + OUTPUT[gxy] = float4(mul(yuv2rgb, float3(saturate(yuv.r + r.w), yuv.yz)), 1); + + --gxy.x; + pos.x -= opt.x; + yuv = mul(rgb2yuv, INPUT.SampleLevel(SL, pos, 0).rgb); + OUTPUT[gxy] = float4(mul(yuv2rgb, float3(saturate(yuv.r + r.z), yuv.yz)), 1); +} diff --git a/src/Effects/CuNNy/CuNNy-8x4C-NVL.hlsl b/src/Effects/CuNNy/CuNNy-8x4C-NVL.hlsl new file mode 100644 index 000000000..cec1ad5a7 --- /dev/null +++ b/src/Effects/CuNNy/CuNNy-8x4C-NVL.hlsl @@ -0,0 +1,778 @@ +// CuNNy 8x4C BILINEAR RGB NVL - https://github.com/cunnyplapper/CuNNy + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +//!MAGPIE EFFECT +//!VERSION 4 +//!SORT_NAME CuNNy-D04N08 + +//!TEXTURE +Texture2D INPUT; + +//!TEXTURE +//!WIDTH INPUT_WIDTH * 2 +//!HEIGHT INPUT_HEIGHT * 2 +Texture2D OUTPUT; + +//!SAMPLER +//!FILTER POINT +SamplerState SP; + +//!SAMPLER +//!FILTER LINEAR +SamplerState SL; + +//!COMMON +#define O(t, p) t.SampleLevel(SP, pos + p * pt, 0) +#define V4 min16float4 +#define M4 min16float4x4 + +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +//!FORMAT R8G8B8A8_SNORM +Texture2D t0; + +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +//!FORMAT R8G8B8A8_SNORM +Texture2D t1; + +//!PASS 1 +//!DESC in +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 +//!IN INPUT +//!OUT t0 + +#define l0(x, y) min16float((dot(float3(2.666e-01, 5.050e-01, 1.135e-01), O(INPUT, float2(x, y)).rgb) + -8.258e-01)) + +V4 f0(min16float s0_0, min16float s0_1, min16float s0_2, min16float s0_3, min16float s0_4, min16float s0_5, min16float s0_6, min16float s0_7, min16float s0_8) { + V4 r = 0.0; + r += V4(-2.544e-02, -4.130e-01, -2.634e-01, 2.417e-02) * s0_0; + r += V4(1.256e-02, -8.013e-02, 9.539e-02, -7.111e-02) * s0_1; + r += V4(1.768e-02, -2.469e-01, -1.627e-01, 8.569e-02) * s0_2; + r += V4(-1.554e-01, 3.441e-02, -1.508e-01, 2.491e-02) * s0_3; + r += V4(1.628e-01, 8.679e-01, -1.960e-02, -5.810e-01) * s0_4; + r += V4(-1.237e-02, -1.704e-01, 2.915e-01, -5.922e-01) * s0_5; + r += V4(7.925e-01, 5.570e-03, 7.074e-02, 4.442e-04) * s0_6; + r += V4(-7.910e-01, -1.530e-02, -8.229e-02, 3.149e-03) * s0_7; + r += V4(-3.973e-03, 2.262e-02, -1.213e-01, 3.843e-02) * s0_8; + r += V4(-8.495e-04, -1.121e-04, 1.842e-02, 5.844e-02); + return r; +} + +void Pass1(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = Rmp8x8(tid.x) + blockStart; + uint2 size = GetInputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = (gxy + 0.5) * pt; + + min16float s0_0 = l0(-1.0, -1.0); + min16float s0_1 = l0(0.0, -1.0); + min16float s0_2 = l0(1.0, -1.0); + min16float s0_3 = l0(-1.0, 0.0); + min16float s0_4 = l0(0.0, 0.0); + min16float s0_5 = l0(1.0, 0.0); + min16float s0_6 = l0(-1.0, 1.0); + min16float s0_7 = l0(0.0, 1.0); + min16float s0_8 = l0(1.0, 1.0); + + t0[gxy] = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8); +} + +//!PASS 2 +//!DESC conv1 +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 +//!IN t0 +//!OUT t1 + +#define l0(x, y) V4(O(t0, float2(x, y))) + +V4 f0(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8) { + V4 r = 0.0; + r += mul(s0_0, M4(4.254e-02, 1.997e-01, 4.636e-02, -4.800e-02, 2.043e-01, -4.096e-02, -7.212e-02, 1.408e-02, -3.916e-01, 2.630e-03, 7.016e-02, 9.613e-02, 1.773e-01, -2.723e-01, -9.458e-02, -1.890e-01)); + r += mul(s0_1, M4(2.350e-01, -8.474e-01, -4.044e-01, -9.188e-01, 9.560e-03, 5.061e-02, 1.092e-02, 1.781e-01, -2.144e-01, 3.203e-02, 6.349e-02, -8.272e-02, -3.105e-01, -3.917e-02, -1.320e-02, -1.541e-01)); + r += mul(s0_2, M4(-8.130e-01, -1.003e-01, 8.195e-02, -7.597e-01, 5.207e-02, 3.470e-02, -8.823e-03, -1.131e-01, -4.029e-02, 7.571e-02, -2.010e-01, 2.487e-01, 1.677e-01, -5.118e-02, -1.070e-01, 7.606e-02)); + r += mul(s0_3, M4(-1.158e-02, 4.898e-02, 1.202e-02, 5.012e-01, -5.343e-02, 4.756e-02, -2.438e-01, 6.399e-02, 2.822e-01, -2.863e-02, 1.996e-01, -7.099e-02, -1.323e-01, -3.797e-01, 5.385e-02, -1.014e-01)); + r += mul(s0_4, M4(2.812e-01, 7.903e-01, -1.733e-01, 6.668e-01, 4.775e-01, 5.452e-01, 7.089e-01, -1.851e-01, -2.382e-01, -5.180e-02, -3.623e-01, -3.040e-01, -4.313e-01, -1.167e-02, 1.235e-01, 1.436e-01)); + r += mul(s0_5, M4(-1.291e-01, -3.022e-02, -4.083e-01, -5.939e-02, -4.249e-01, -1.750e-01, 1.094e-01, -1.176e-01, 1.374e-02, 1.342e-01, 2.086e-01, 2.841e-01, 2.347e-01, 1.450e-01, 7.604e-02, 2.176e-01)); + r += mul(s0_6, M4(8.130e-02, -7.215e-02, -5.249e-02, 9.518e-03, -1.979e-01, -4.441e-02, -1.857e-01, -4.227e-01, 2.149e-01, -1.610e-01, 1.655e-01, -8.841e-02, 1.409e-01, -1.059e-01, 2.037e-01, -2.744e-03)); + r += mul(s0_7, M4(-7.266e-02, 1.638e-02, -1.639e-01, 1.957e-02, -2.857e-01, 1.936e-01, -1.243e-01, -1.490e-01, 1.525e-01, -8.934e-02, 7.415e-02, -1.779e-01, 1.648e-02, -6.456e-02, 7.053e-02, -9.530e-02)); + r += mul(s0_8, M4(-6.960e-02, -8.960e-02, -1.757e-02, -1.370e-01, -5.137e-01, -1.179e-01, -4.053e-01, -1.987e-01, 7.100e-02, 2.928e-02, -9.682e-02, 2.403e-01, 1.814e-01, 2.131e-02, 5.579e-02, 5.457e-02)); + r += mul(s1_0, M4(-2.737e-02, 5.272e-02, -1.801e-02, -2.491e-01, 2.871e-01, -3.704e-02, -6.568e-02, 2.905e-02, 1.011e-01, -3.782e-01, -8.696e-02, 4.682e-01, 3.233e-01, -3.060e-01, -3.251e-02, 1.165e+00)); + r += mul(s1_1, M4(-4.994e-01, 3.049e-02, -8.802e-02, -6.179e-02, 7.133e-02, -1.957e-02, -4.465e-02, 1.130e-01, 7.255e-02, 6.956e-03, -1.204e-01, 3.699e-01, -8.844e-02, 4.624e-01, -9.881e-02, -2.512e-01)); + r += mul(s1_2, M4(-3.645e-01, 1.274e-01, 2.387e-01, -1.963e-01, -5.995e-02, -5.943e-02, 9.694e-02, -2.518e-01, -2.797e-01, 1.598e-01, -1.371e-02, 4.000e-01, 2.213e-01, 9.692e-02, -3.302e-01, 1.132e+00)); + r += mul(s1_3, M4(-8.539e-03, -6.535e-02, 5.575e-02, 1.928e-01, 1.156e-01, 5.227e-02, -3.039e-01, 4.794e-01, 1.441e-01, 1.929e-01, -4.689e-02, 2.023e-02, 1.330e-01, -1.358e+00, -5.393e-01, 7.907e-01)); + r += mul(s1_4, M4(1.701e-01, -3.479e-02, 5.404e-01, -2.491e-01, 4.564e-01, 6.659e-01, 7.009e-01, -2.288e-02, -7.696e-01, -4.959e-01, 2.881e-01, -4.322e-01, -9.013e-01, -4.765e-01, 5.556e-02, -1.805e-01)); + r += mul(s1_5, M4(-2.424e-01, 8.034e-03, -4.699e-02, -2.628e-01, -4.682e-01, 2.977e-02, 2.258e-01, -1.419e-01, 3.514e-01, 6.860e-03, 2.147e-01, 3.806e-01, 3.747e-01, 1.403e-01, 3.106e-01, 9.680e-01)); + r += mul(s1_6, M4(1.776e-01, -4.873e-02, -1.403e-01, -1.817e-02, -3.551e-01, 4.838e-04, -2.786e-01, -6.048e-01, 3.082e-01, -4.703e-01, 2.419e-01, -3.002e-01, -4.310e-01, -6.490e-01, 1.343e+00, -1.019e+00)); + r += mul(s1_7, M4(4.689e-02, -2.927e-02, -7.494e-02, -3.516e-02, -2.217e-01, -3.189e-01, 2.202e-01, -2.936e-01, 4.772e-02, -1.609e-01, 9.853e-02, -4.214e-01, 2.780e-01, -1.073e-01, 1.102e-01, -2.033e-01)); + r += mul(s1_8, M4(-9.468e-02, 4.428e-02, 1.269e-01, -1.086e-01, -1.106e-01, -1.367e-01, -3.356e-01, 4.656e-03, 4.648e-02, -1.743e-02, -2.074e-01, -3.745e-02, 1.281e-01, -3.233e-01, 6.533e-01, 3.705e-01)); + r += V4(1.016e-03, 5.583e-03, -1.608e-02, -1.996e-04); + return r; +} + +void Pass2(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = Rmp8x8(tid.x) + blockStart; + uint2 size = GetInputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = (gxy + 0.5) * pt; + + V4 s0_0 = l0(-1.0, -1.0); + V4 s0_1 = l0(0.0, -1.0); + V4 s0_2 = l0(1.0, -1.0); + V4 s0_3 = l0(-1.0, 0.0); + V4 s0_4 = l0(0.0, 0.0); + V4 s0_5 = l0(1.0, 0.0); + V4 s0_6 = l0(-1.0, 1.0); + V4 s0_7 = l0(0.0, 1.0); + V4 s0_8 = l0(1.0, 1.0); + V4 s1_0 = -max(-s0_0, 0.0); + V4 s1_1 = -max(-s0_1, 0.0); + V4 s1_2 = -max(-s0_2, 0.0); + V4 s1_3 = -max(-s0_3, 0.0); + V4 s1_4 = -max(-s0_4, 0.0); + V4 s1_5 = -max(-s0_5, 0.0); + V4 s1_6 = -max(-s0_6, 0.0); + V4 s1_7 = -max(-s0_7, 0.0); + V4 s1_8 = -max(-s0_8, 0.0); + s0_0 = max(s0_0, 0.0); + s0_1 = max(s0_1, 0.0); + s0_2 = max(s0_2, 0.0); + s0_3 = max(s0_3, 0.0); + s0_4 = max(s0_4, 0.0); + s0_5 = max(s0_5, 0.0); + s0_6 = max(s0_6, 0.0); + s0_7 = max(s0_7, 0.0); + s0_8 = max(s0_8, 0.0); + + t1[gxy] = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8); +} + +//!PASS 3 +//!DESC conv2 +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 +//!IN t1 +//!OUT t0 + +#define l0(x, y) V4(O(t1, float2(x, y))) + +V4 f0(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-4.810e-02, 2.379e-02, -8.471e-02, 1.305e-01, -5.897e-02, 1.263e-01, -9.639e-02, 9.150e-02, 9.002e-03, -1.763e-01, 8.275e-02, -2.357e-01, 7.181e-02, -7.360e-02, 4.629e-02, -8.259e-02)); + r += mul(s0_1, M4(6.774e-02, 9.108e-02, -3.750e-01, 8.014e-02, 2.890e-01, 9.986e-02, -1.262e-02, -1.285e-01, -2.789e-01, -1.145e-01, -4.982e-02, -1.101e-01, -2.051e-02, -2.271e-01, 1.343e-01, -8.643e-02)); + r += mul(s0_2, M4(-5.433e-02, 6.899e-02, -3.350e-01, -7.837e-02, -1.076e-01, 1.912e-02, -9.061e-02, 1.919e-01, 9.387e-02, -4.206e-02, 1.861e-01, -4.416e-03, -1.560e-01, -4.364e-02, 4.364e-01, 8.765e-02)); + r += mul(s0_3, M4(2.382e-01, 3.032e-01, -1.313e-01, -1.154e-01, 1.008e-01, 3.058e-01, -8.513e-02, 2.713e-01, -9.875e-02, 3.017e-01, 3.203e-02, 5.762e-01, -2.056e-03, -7.698e-02, 8.681e-02, 4.245e-02)); + r += mul(s0_4, M4(2.643e-01, 1.750e-01, 4.850e-02, 3.131e-03, 2.785e-01, 1.598e-01, 5.772e-01, -4.118e-04, -4.270e-01, -2.447e-01, 4.486e-01, 9.155e-02, -3.428e-01, -2.583e-01, -3.721e-02, 6.278e-02)); + r += mul(s0_5, M4(-1.080e-01, -5.514e-02, -3.648e-01, -2.319e-02, -2.100e-01, -4.065e-02, 1.126e-01, 3.970e-02, 9.824e-02, 1.377e-02, 1.295e-01, -2.512e-02, 1.115e-01, 7.094e-02, 3.413e-01, -5.245e-02)); + r += mul(s0_6, M4(1.991e-01, 4.710e-02, -9.305e-02, -1.471e-01, -8.221e-02, 1.134e-01, -1.718e-01, -2.606e-01, -8.167e-02, -1.462e-02, -1.094e-01, -1.569e-01, 2.133e-02, 3.374e-02, 4.583e-02, 1.228e-01)); + r += mul(s0_7, M4(-2.135e-01, 6.874e-02, -4.993e-02, 1.156e-02, -4.261e-01, 1.366e-01, 4.250e-02, -5.707e-02, -1.966e-01, -6.106e-02, 1.265e-01, -3.076e-03, 2.043e-03, -3.072e-02, 1.043e-01, 3.422e-01)); + r += mul(s0_8, M4(7.235e-02, -3.542e-04, -1.435e-02, -3.815e-02, -8.855e-02, 8.327e-02, 1.954e-01, 1.462e-01, 1.615e-01, -4.957e-02, 1.596e-02, -8.625e-02, 6.574e-02, -9.799e-02, 5.401e-03, 7.595e-02)); + r += mul(s1_0, M4(1.245e-01, -2.812e-03, 1.486e-02, 1.246e-01, -5.943e-02, 1.170e-01, -1.068e-01, 8.960e-02, 5.354e-03, -2.039e-01, 8.228e-02, -2.530e-01, -2.789e-03, -6.932e-02, -3.187e-02, -5.794e-02)); + r += mul(s1_1, M4(-2.539e-02, 4.598e-02, -1.205e-01, 1.597e-01, 2.391e-01, 1.269e-01, -1.116e-02, 1.498e-02, -2.388e-01, -1.548e-01, -7.389e-02, -1.083e-02, -1.181e-01, -7.069e-02, 9.383e-03, -2.018e-01)); + r += mul(s1_2, M4(-1.248e-02, 3.267e-02, -2.761e-01, -2.043e-02, -8.520e-02, 3.937e-02, -1.372e-01, 1.821e-02, 6.915e-02, -4.061e-02, 1.782e-01, -4.619e-02, 6.811e-02, -5.458e-04, 3.193e-01, 8.892e-03)); + r += mul(s1_3, M4(-1.580e-01, 7.536e-02, -6.680e-02, 1.891e-01, 1.196e-01, 3.476e-01, -6.321e-02, 1.972e-01, -9.851e-02, 4.483e-01, 9.326e-03, 5.272e-01, -1.478e-01, -4.009e-02, -3.561e-02, -2.549e-01)); + r += mul(s1_4, M4(-1.253e-01, 1.345e-01, 4.994e-01, 2.000e-01, 2.728e-01, 1.672e-01, 5.501e-01, -1.736e-02, -5.782e-01, -2.191e-01, 4.380e-01, 4.346e-02, -3.006e-01, -5.220e-02, -1.613e-01, 6.023e-02)); + r += mul(s1_5, M4(1.276e-01, -8.319e-02, -2.115e-01, 1.471e-01, -1.669e-01, -2.484e-02, 9.906e-02, 1.836e-02, 1.010e-01, 1.847e-02, 1.027e-01, -1.680e-02, -1.880e-01, 1.377e-01, 3.823e-02, -8.256e-02)); + r += mul(s1_6, M4(-3.200e-01, -7.023e-02, -1.243e-01, -2.003e-02, -7.863e-02, 6.650e-02, -1.264e-01, -1.862e-01, -9.119e-02, -4.374e-02, -1.195e-01, -6.902e-02, -1.360e-01, 3.356e-02, -3.667e-02, -1.815e-01)); + r += mul(s1_7, M4(1.462e-02, 1.001e-01, 2.453e-01, -1.298e-02, -4.372e-01, 1.509e-01, 8.011e-02, -1.323e-01, -1.980e-01, -4.785e-02, 1.733e-01, 1.100e-02, -2.153e-01, 6.711e-02, 2.595e-03, 1.213e-01)); + r += mul(s1_8, M4(-3.794e-03, 2.239e-02, -6.960e-02, 7.342e-02, -1.882e-01, 1.159e-01, 1.876e-01, 3.125e-02, 2.242e-01, -5.956e-02, 1.328e-02, -5.400e-02, 2.205e-02, -6.049e-02, -9.151e-02, -1.137e-01)); + r += V4(-1.437e-02, -2.276e-02, 2.275e-02, 6.547e-04); + return r; +} + +void Pass3(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = Rmp8x8(tid.x) + blockStart; + uint2 size = GetInputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = (gxy + 0.5) * pt; + + V4 s0_0 = l0(-1.0, -1.0); + V4 s0_1 = l0(0.0, -1.0); + V4 s0_2 = l0(1.0, -1.0); + V4 s0_3 = l0(-1.0, 0.0); + V4 s0_4 = l0(0.0, 0.0); + V4 s0_5 = l0(1.0, 0.0); + V4 s0_6 = l0(-1.0, 1.0); + V4 s0_7 = l0(0.0, 1.0); + V4 s0_8 = l0(1.0, 1.0); + V4 s1_0 = -max(-s0_0, 0.0); + V4 s1_1 = -max(-s0_1, 0.0); + V4 s1_2 = -max(-s0_2, 0.0); + V4 s1_3 = -max(-s0_3, 0.0); + V4 s1_4 = -max(-s0_4, 0.0); + V4 s1_5 = -max(-s0_5, 0.0); + V4 s1_6 = -max(-s0_6, 0.0); + V4 s1_7 = -max(-s0_7, 0.0); + V4 s1_8 = -max(-s0_8, 0.0); + s0_0 = max(s0_0, 0.0); + s0_1 = max(s0_1, 0.0); + s0_2 = max(s0_2, 0.0); + s0_3 = max(s0_3, 0.0); + s0_4 = max(s0_4, 0.0); + s0_5 = max(s0_5, 0.0); + s0_6 = max(s0_6, 0.0); + s0_7 = max(s0_7, 0.0); + s0_8 = max(s0_8, 0.0); + + t0[gxy] = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8); +} + +//!PASS 4 +//!DESC conv3 +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 +//!IN t0 +//!OUT t1 + +#define l0(x, y) V4(O(t0, float2(x, y))) + +V4 f0(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8) { + V4 r = 0.0; + r += mul(s0_0, M4(3.886e-03, -1.503e-01, -6.378e-01, 4.214e-02, -1.255e-01, 1.146e-01, -1.917e-01, -6.556e-02, -3.368e-02, 6.874e-02, 2.796e-01, -2.936e-02, -3.239e-02, 3.923e-02, -6.439e-02, 1.313e-02)); + r += mul(s0_1, M4(4.357e-01, -1.067e-01, 3.330e-01, -8.295e-02, -4.004e-01, 3.113e-01, -4.222e-02, 2.290e-01, -1.861e-01, 9.039e-02, -1.132e-01, 1.077e-01, -1.603e-02, 6.296e-02, 4.907e-01, 3.396e-02)); + r += mul(s0_2, M4(-3.290e-01, -1.073e-01, 1.064e-02, -2.792e-03, -4.366e-01, 3.239e-01, -1.383e-01, 1.918e-01, 3.058e-02, 1.006e-01, -6.898e-02, -1.451e-02, -1.882e-01, 2.248e-01, 1.744e-02, -3.155e-02)); + r += mul(s0_3, M4(2.403e-02, -1.353e-01, 1.895e-01, -2.285e-01, -1.211e-01, 1.771e-01, 2.135e-01, 1.900e-01, -4.204e-03, 3.719e-02, -4.772e-01, 2.006e-01, -2.532e-03, 5.872e-02, 2.901e-01, -9.450e-02)); + r += mul(s0_4, M4(8.054e-02, 1.389e-02, -2.060e-02, -3.042e-01, -2.476e-01, 9.905e-02, -9.248e-01, 3.372e-01, -5.254e-01, 4.455e-01, 5.707e-02, 1.057e-01, -3.525e-01, 3.349e-01, -3.414e-01, 7.090e-02)); + r += mul(s0_5, M4(-1.889e-01, -2.290e-01, -4.930e-02, -1.824e-01, -2.062e+00, 6.868e-02, 2.552e-01, 3.883e-01, 5.778e-02, 9.141e-02, 9.917e-02, -1.164e-01, 4.359e-02, 2.105e-01, -7.911e-02, -1.916e-01)); + r += mul(s0_6, M4(-2.267e-02, -6.231e-03, -9.718e-03, 3.770e-04, -6.982e-02, 4.184e-02, -2.296e-01, -9.542e-02, 5.236e-02, -5.412e-02, -1.757e-01, -1.054e-01, 1.414e-02, -7.772e-02, -1.338e-02, 3.928e-02)); + r += mul(s0_7, M4(5.776e-02, 4.703e-02, 3.914e-02, -1.617e-02, -3.606e-01, 3.037e-01, -3.096e-01, 3.562e-02, 3.108e-01, -3.684e-01, 3.725e-02, -2.050e-01, -1.494e-02, 8.741e-02, 5.992e-02, 2.655e-02)); + r += mul(s0_8, M4(3.614e-02, -1.212e-01, 2.507e-02, -5.858e-02, -1.121e-01, -3.433e-01, 6.613e-02, -6.943e-01, 2.233e-02, -5.467e-02, -6.900e-03, -2.566e-01, -1.106e-01, 2.016e-02, -3.700e-02, -2.886e-01)); + r += mul(s1_0, M4(-5.136e-02, -2.190e-01, -1.035e+00, -5.722e-02, 2.876e-02, 5.070e-02, 3.532e-01, -6.778e-03, 2.930e-04, -6.219e-02, 2.314e-01, -5.210e-02, 1.508e-02, -4.390e-02, -7.749e-02, -9.658e-03)); + r += mul(s1_1, M4(3.663e-01, -9.746e-02, -6.582e-01, -3.676e-01, -1.694e-01, 7.883e-02, -1.613e-01, 2.328e-02, 2.595e-04, -3.763e-02, -9.946e-02, -6.137e-02, 1.429e-01, -1.964e-01, 2.439e-01, 4.898e-02)); + r += mul(s1_2, M4(7.884e-02, 1.842e-01, -1.309e-01, 4.895e-02, 4.820e-02, 8.364e-02, 1.189e-02, -1.438e-02, -7.934e-02, 4.775e-02, -6.137e-02, -1.335e-02, -4.416e-02, 3.584e-02, 1.751e-04, -1.178e-02)); + r += mul(s1_3, M4(-9.861e-03, -1.277e-01, 2.389e-03, -3.232e-01, -2.782e-03, 1.115e-01, -6.485e-02, 2.093e-01, 2.056e-01, 2.527e-02, -1.772e-01, 1.863e-02, 5.983e-02, -8.103e-02, 3.076e-01, -2.027e-01)); + r += mul(s1_4, M4(1.001e-01, 3.476e-01, -1.305e-01, -1.653e-01, 8.890e-02, -4.170e-01, -1.530e-01, 7.048e-02, -5.605e-01, 1.093e-01, 2.038e-01, -2.320e-01, -1.287e-01, -2.173e-01, -1.630e-01, -9.691e-02)); + r += mul(s1_5, M4(-2.778e-01, 1.393e-01, -2.802e-02, -5.375e-02, -4.550e-01, -1.661e-01, 2.293e-03, -5.984e-02, -5.070e-02, -8.852e-02, 7.806e-02, 2.187e-02, 1.901e-01, -3.219e-01, -1.937e-01, -2.336e-01)); + r += mul(s1_6, M4(-8.489e-02, 1.968e-01, -7.760e-02, 1.388e-01, 4.713e-03, 1.527e-01, 8.535e-02, 1.643e-02, 1.429e-01, -1.558e-01, 2.339e-01, 2.762e-01, 1.694e-02, -4.245e-02, -2.793e-02, -3.332e-02)); + r += mul(s1_7, M4(-4.377e-02, 3.486e-01, -1.766e-01, -1.065e-01, -1.645e-01, -8.722e-04, -1.147e-01, 1.663e-01, 6.801e-02, -3.539e-01, 1.560e-02, -1.819e-01, 1.440e-02, -1.221e-02, 3.693e-02, 5.886e-03)); + r += mul(s1_8, M4(5.940e-02, 1.624e-01, 1.526e-02, 6.692e-02, 1.812e-01, -8.647e-02, 3.210e-02, -3.751e-04, 2.884e-02, -4.717e-02, 4.121e-03, 5.144e-02, -1.995e-02, -2.827e-01, 6.148e-03, 7.209e-02)); + r += V4(1.575e-02, -2.007e-01, -3.519e-03, -9.082e-03); + return r; +} + +void Pass4(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = Rmp8x8(tid.x) + blockStart; + uint2 size = GetInputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = (gxy + 0.5) * pt; + + V4 s0_0 = l0(-1.0, -1.0); + V4 s0_1 = l0(0.0, -1.0); + V4 s0_2 = l0(1.0, -1.0); + V4 s0_3 = l0(-1.0, 0.0); + V4 s0_4 = l0(0.0, 0.0); + V4 s0_5 = l0(1.0, 0.0); + V4 s0_6 = l0(-1.0, 1.0); + V4 s0_7 = l0(0.0, 1.0); + V4 s0_8 = l0(1.0, 1.0); + V4 s1_0 = -max(-s0_0, 0.0); + V4 s1_1 = -max(-s0_1, 0.0); + V4 s1_2 = -max(-s0_2, 0.0); + V4 s1_3 = -max(-s0_3, 0.0); + V4 s1_4 = -max(-s0_4, 0.0); + V4 s1_5 = -max(-s0_5, 0.0); + V4 s1_6 = -max(-s0_6, 0.0); + V4 s1_7 = -max(-s0_7, 0.0); + V4 s1_8 = -max(-s0_8, 0.0); + s0_0 = max(s0_0, 0.0); + s0_1 = max(s0_1, 0.0); + s0_2 = max(s0_2, 0.0); + s0_3 = max(s0_3, 0.0); + s0_4 = max(s0_4, 0.0); + s0_5 = max(s0_5, 0.0); + s0_6 = max(s0_6, 0.0); + s0_7 = max(s0_7, 0.0); + s0_8 = max(s0_8, 0.0); + + t1[gxy] = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8); +} + +//!PASS 5 +//!DESC conv4 +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 +//!IN t1 +//!OUT t0 + +#define l0(x, y) V4(O(t1, float2(x, y))) + +V4 f0(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-6.479e-02, -9.976e-02, -1.507e-01, -9.934e-02, -1.046e-02, -1.471e-01, -4.218e-02, -8.348e-04, -5.963e-02, 1.519e-03, 5.897e-03, 5.284e-02, -4.467e-01, 4.779e-01, -1.953e-02, 1.951e-01)); + r += mul(s0_1, M4(-5.276e-02, -1.201e-01, -1.160e-01, 6.076e-02, -4.798e-02, -3.491e-01, -3.055e-01, -1.607e-01, -8.989e-02, 1.221e-01, -1.561e-01, 6.227e-02, -1.598e-01, -6.666e-01, 6.029e-01, -5.466e-01)); + r += mul(s0_2, M4(-1.331e-01, -4.988e-02, -2.217e-02, 3.405e-02, 2.261e-02, 1.352e-01, 1.124e-02, 8.259e-02, -3.548e-02, 2.454e-01, 4.417e-02, 2.297e-01, 1.780e-01, -2.203e-01, 5.913e-02, -2.201e-01)); + r += mul(s0_3, M4(1.348e-01, 5.544e-01, -4.335e-01, -3.619e-01, 1.011e-01, 2.665e-01, -2.627e-01, -1.800e-01, -1.158e-01, -8.543e-02, -7.868e-03, 2.056e-01, 1.988e-01, 1.174e+00, -1.291e-01, 1.131e-01)); + r += mul(s0_4, M4(4.504e-01, 1.025e-01, -1.449e-01, -3.442e-02, -4.525e-01, -1.513e-01, -8.135e-02, -9.669e-02, -3.287e-01, 5.251e-01, -6.540e-01, 7.386e-02, 2.603e-01, -8.246e-01, -1.378e-01, 2.363e+00)); + r += mul(s0_5, M4(-7.102e-02, -5.554e-02, -3.489e-02, -6.688e-02, 2.877e-01, -6.258e-02, 8.515e-02, -2.109e-01, -2.723e-01, 1.543e-01, 1.285e-01, 9.366e-02, 3.135e-02, -3.700e-01, -4.111e-01, 1.822e+00)); + r += mul(s0_6, M4(-4.018e-02, -3.412e-01, 5.388e-02, 4.947e-01, -3.234e-02, -6.778e-02, 3.825e-02, 1.313e-01, -6.083e-02, 3.439e-02, -1.081e-01, 6.456e-02, 2.287e-02, -2.470e-01, 2.026e-02, -1.886e-02)); + r += mul(s0_7, M4(2.410e-01, 1.529e-01, -1.370e-01, -1.389e-01, 1.549e-01, 8.308e-03, 3.064e-02, 3.925e-02, -9.013e-02, 1.131e-01, -9.240e-02, 3.740e-01, -1.009e-01, -6.576e-02, -1.491e-01, -3.452e-02)); + r += mul(s0_8, M4(-1.628e-01, -2.480e-02, -6.569e-02, 3.873e-02, 1.604e-02, 1.651e-02, -4.681e-02, -1.647e-02, -1.648e-02, 1.541e-01, 2.284e-02, 6.545e-01, 1.799e-03, 1.193e-03, -1.215e-01, 5.919e-02)); + r += mul(s1_0, M4(-1.115e-02, -5.014e-02, -1.499e-01, -7.414e-04, -6.944e-02, -4.168e-02, -1.254e-01, -6.576e-02, 2.946e-04, -2.669e-02, 4.109e-02, 1.949e-02, 1.242e-01, 1.753e-01, 9.717e-02, 1.446e-01)); + r += mul(s1_1, M4(-1.327e-02, -1.462e-01, -8.510e-02, -1.228e-02, 1.772e-01, 1.009e-01, -4.342e-02, -8.827e-02, -6.663e-02, -1.245e-01, -4.625e-02, -4.285e-02, 7.586e-02, -1.208e-01, 2.705e-01, -1.558e-01)); + r += mul(s1_2, M4(-7.024e-02, -3.045e-02, -1.916e-02, 4.979e-02, -9.145e-02, 2.285e-01, 4.612e-02, 2.217e-01, 7.690e-02, -4.332e-02, 6.032e-03, -2.370e-02, 3.802e-01, -8.124e-02, 1.982e-02, -8.310e-02)); + r += mul(s1_3, M4(1.238e-01, 5.787e-01, -5.332e-01, -2.806e-01, 1.208e-01, 6.549e-02, -2.040e-01, -2.578e-02, -5.878e-02, -1.496e-01, 1.213e-01, 1.489e-02, 9.569e-02, 1.964e-01, 6.477e-02, -2.939e-01)); + r += mul(s1_4, M4(5.825e-01, 2.257e-01, -1.943e-01, 1.101e-01, -3.240e-01, -2.967e-01, -4.203e-02, -3.636e-01, -1.062e-01, -3.799e-02, -4.444e-01, -7.607e-02, -3.056e-01, -2.926e-01, -4.582e-02, 2.795e-01)); + r += mul(s1_5, M4(-9.076e-02, -5.130e-02, -3.718e-02, -6.163e-02, 1.831e-01, -1.199e-01, 9.176e-02, -2.456e-01, 2.362e-01, -1.854e-01, -1.394e-01, 3.560e-03, 2.070e-02, -6.903e-02, -5.061e-02, 3.068e-02)); + r += mul(s1_6, M4(-4.988e-02, -3.880e-01, 3.001e-02, 3.892e-01, -2.827e-02, -2.880e-02, 4.071e-02, 2.861e-01, -4.016e-02, -1.085e-01, 9.207e-03, -7.367e-02, 9.072e-03, 8.960e-02, 5.334e-03, -6.480e-02)); + r += mul(s1_7, M4(2.900e-01, 1.450e-01, -1.401e-01, -2.809e-01, 1.218e-01, -3.153e-03, -2.544e-02, 1.898e-01, -7.197e-02, -3.721e-01, 4.042e-02, 9.918e-02, -1.132e-01, 3.578e-02, 4.000e-02, 6.991e-02)); + r += mul(s1_8, M4(-1.493e-01, -2.310e-02, -6.133e-02, 5.322e-02, -4.879e-02, -5.139e-02, -8.058e-02, 4.140e-02, 2.511e-01, 3.669e-02, -1.003e-01, -1.457e-01, 1.528e-01, 1.177e-01, 6.665e-02, -3.084e-02)); + r += V4(2.513e-04, -2.994e-02, -5.133e-02, -8.977e-03); + return r; +} + +void Pass5(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = Rmp8x8(tid.x) + blockStart; + uint2 size = GetInputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = (gxy + 0.5) * pt; + + V4 s0_0 = l0(-1.0, -1.0); + V4 s0_1 = l0(0.0, -1.0); + V4 s0_2 = l0(1.0, -1.0); + V4 s0_3 = l0(-1.0, 0.0); + V4 s0_4 = l0(0.0, 0.0); + V4 s0_5 = l0(1.0, 0.0); + V4 s0_6 = l0(-1.0, 1.0); + V4 s0_7 = l0(0.0, 1.0); + V4 s0_8 = l0(1.0, 1.0); + V4 s1_0 = -max(-s0_0, 0.0); + V4 s1_1 = -max(-s0_1, 0.0); + V4 s1_2 = -max(-s0_2, 0.0); + V4 s1_3 = -max(-s0_3, 0.0); + V4 s1_4 = -max(-s0_4, 0.0); + V4 s1_5 = -max(-s0_5, 0.0); + V4 s1_6 = -max(-s0_6, 0.0); + V4 s1_7 = -max(-s0_7, 0.0); + V4 s1_8 = -max(-s0_8, 0.0); + s0_0 = max(s0_0, 0.0); + s0_1 = max(s0_1, 0.0); + s0_2 = max(s0_2, 0.0); + s0_3 = max(s0_3, 0.0); + s0_4 = max(s0_4, 0.0); + s0_5 = max(s0_5, 0.0); + s0_6 = max(s0_6, 0.0); + s0_7 = max(s0_7, 0.0); + s0_8 = max(s0_8, 0.0); + + t0[gxy] = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8); +} + +//!PASS 6 +//!DESC conv5 +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 +//!IN t0 +//!OUT t1 + +#define l0(x, y) V4(O(t0, float2(x, y))) + +V4 f0(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8) { + V4 r = 0.0; + r += mul(s0_0, M4(4.575e-01, 2.412e-01, 1.926e-01, 5.873e-02, 2.954e-02, -1.424e-01, 7.881e-03, 2.358e-04, -5.872e-02, -1.007e-01, -3.632e-02, 5.718e-02, 1.389e-01, -4.163e-02, -1.379e-01, 2.160e-03)); + r += mul(s0_1, M4(1.347e-01, -8.074e-01, -1.155e-01, 2.242e-01, -2.673e-01, 4.053e-01, 8.867e-02, -2.840e-02, 9.443e-02, 2.632e-01, 9.207e-02, -1.793e-02, 1.519e-01, 3.302e-03, 2.027e-01, 2.643e-02)); + r += mul(s0_2, M4(1.462e-02, -7.543e-02, -6.080e-02, 7.431e-02, -3.673e-02, -1.665e-01, -2.745e-01, -4.416e-02, -3.270e-01, 7.677e-01, 7.241e-01, -1.157e-01, -8.204e-03, 2.172e-02, 3.183e-01, 3.931e-02)); + r += mul(s0_3, M4(1.168e+00, -8.427e-01, -3.237e-03, 5.416e-02, 1.694e-02, -1.042e-01, -2.173e-01, -1.089e-01, -9.881e-02, -1.109e-01, -1.003e-01, -5.080e-02, -9.279e-02, -1.111e-01, -2.699e-02, -2.297e-02)); + r += mul(s0_4, M4(-4.884e-01, -4.472e-01, -9.701e-02, 8.789e-01, 1.962e-02, 5.041e-01, 3.221e-01, -4.622e-02, 9.039e-02, -2.531e-01, 6.228e-01, 1.590e-02, 1.804e-02, 7.795e-02, -8.005e-02, -6.310e-03)); + r += mul(s0_5, M4(-6.567e-02, -5.161e-02, 5.550e-02, 5.285e-02, -6.147e-02, -1.840e-01, 2.028e-01, 4.014e-01, 4.070e-01, -1.022e-01, 1.414e+00, -3.126e-01, 7.508e-03, 1.013e-01, -7.300e-02, -4.282e-01)); + r += mul(s0_6, M4(1.721e+00, 1.776e-01, -8.690e-02, -1.102e-01, -8.467e-02, -2.165e-02, 6.238e-02, 2.052e-02, 2.763e-01, -3.472e-02, -1.179e-01, 2.993e-02, -6.860e-02, 1.887e-02, 3.140e-02, -6.853e-02)); + r += mul(s0_7, M4(1.937e-01, 1.975e-01, -2.456e-01, -1.360e+00, 1.792e-01, -5.969e-02, -7.670e-02, 2.606e-01, 1.355e-01, -9.109e-03, 2.756e-01, 6.674e-02, 1.312e-02, -1.542e-02, 2.236e-02, 1.997e-01)); + r += mul(s0_8, M4(4.255e-02, -1.452e-02, -8.732e-02, -1.084e-01, 1.495e-02, 1.302e-02, -9.151e-02, -2.814e-01, 5.197e-02, 2.866e-02, 5.490e-01, 4.310e-01, 3.666e-02, -3.380e-03, -2.830e-02, -8.223e-02)); + r += mul(s1_0, M4(2.549e-02, 7.469e-02, -5.290e-02, -4.972e-02, -2.340e-01, -1.875e-01, 1.656e-01, 5.697e-02, -8.570e-02, -1.520e-01, -2.622e-02, 1.043e-02, -2.377e-01, -3.927e-02, 1.539e-01, 4.528e-02)); + r += mul(s1_1, M4(-1.188e-02, -9.781e-02, 1.606e-01, 5.138e-02, -4.165e-01, 8.262e-01, 1.709e-01, -1.063e-01, 8.393e-03, 7.300e-02, -9.347e-02, -6.226e-02, -3.633e-01, -4.453e-01, 2.190e-01, 2.415e-01)); + r += mul(s1_2, M4(-4.011e-02, 3.404e-02, 1.013e-01, 3.551e-02, 9.692e-02, -2.109e-01, 1.897e-01, -2.192e-01, -1.703e-01, 5.317e-01, 1.354e-01, -2.027e-01, -3.658e-01, -1.845e-01, -5.465e-01, 1.436e-01)); + r += mul(s1_3, M4(7.674e-01, 1.677e-01, -7.875e-02, 7.537e-03, -4.911e-01, -1.083e-01, 7.183e-03, -1.107e-01, -2.514e-02, -1.257e-01, -5.070e-02, -3.886e-02, 1.368e-01, -1.991e-02, -1.698e-01, -7.850e-03)); + r += mul(s1_4, M4(-5.096e-02, 7.912e-02, -2.105e-01, 1.149e-01, 9.798e-02, 2.243e-01, -3.434e-01, 3.492e-01, -1.265e-01, -1.839e-01, -1.337e-01, -6.909e-02, -8.552e-01, 1.334e-01, 8.652e-01, -3.408e-01)); + r += mul(s1_5, M4(-2.933e-02, 1.424e-01, 6.542e-02, -1.710e-01, -1.459e-01, -3.069e-02, -1.275e-01, -9.443e-02, 2.657e-01, -4.784e-04, -6.729e-03, -1.910e-01, -4.628e-01, 3.808e-02, -1.470e-01, 1.480e-01)); + r += mul(s1_6, M4(1.512e-01, -1.755e-02, -5.440e-02, 1.317e-02, -7.181e-02, -6.842e-03, -7.375e-02, -8.356e-02, 7.332e-02, -9.437e-02, -1.008e-01, -4.731e-02, -9.102e-02, -8.192e-03, 7.862e-04, 6.417e-02)); + r += mul(s1_7, M4(2.457e-01, -1.058e-01, -2.777e-02, -1.532e-03, 7.609e-02, 3.452e-02, 1.774e-01, 3.296e-01, 6.779e-02, -6.683e-02, 1.485e-01, 7.321e-02, -3.082e-02, -4.348e-02, 3.558e-03, 9.111e-03)); + r += mul(s1_8, M4(1.104e-01, 5.040e-03, 9.642e-03, -8.991e-02, -2.134e-01, 3.758e-02, -1.244e-01, -1.987e-01, -7.007e-02, 6.792e-03, 1.369e-01, 5.332e-01, -5.354e-02, -2.024e-02, -1.038e-01, -4.812e-02)); + r += V4(4.102e-03, 1.192e-03, -2.598e-03, -2.812e-03); + return r; +} + +void Pass6(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = Rmp8x8(tid.x) + blockStart; + uint2 size = GetInputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = (gxy + 0.5) * pt; + + V4 s0_0 = l0(-1.0, -1.0); + V4 s0_1 = l0(0.0, -1.0); + V4 s0_2 = l0(1.0, -1.0); + V4 s0_3 = l0(-1.0, 0.0); + V4 s0_4 = l0(0.0, 0.0); + V4 s0_5 = l0(1.0, 0.0); + V4 s0_6 = l0(-1.0, 1.0); + V4 s0_7 = l0(0.0, 1.0); + V4 s0_8 = l0(1.0, 1.0); + V4 s1_0 = -max(-s0_0, 0.0); + V4 s1_1 = -max(-s0_1, 0.0); + V4 s1_2 = -max(-s0_2, 0.0); + V4 s1_3 = -max(-s0_3, 0.0); + V4 s1_4 = -max(-s0_4, 0.0); + V4 s1_5 = -max(-s0_5, 0.0); + V4 s1_6 = -max(-s0_6, 0.0); + V4 s1_7 = -max(-s0_7, 0.0); + V4 s1_8 = -max(-s0_8, 0.0); + s0_0 = max(s0_0, 0.0); + s0_1 = max(s0_1, 0.0); + s0_2 = max(s0_2, 0.0); + s0_3 = max(s0_3, 0.0); + s0_4 = max(s0_4, 0.0); + s0_5 = max(s0_5, 0.0); + s0_6 = max(s0_6, 0.0); + s0_7 = max(s0_7, 0.0); + s0_8 = max(s0_8, 0.0); + + t1[gxy] = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8); +} + +//!PASS 7 +//!DESC conv6 +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 +//!IN t1 +//!OUT t0 + +#define l0(x, y) V4(O(t1, float2(x, y))) + +V4 f0(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8) { + V4 r = 0.0; + r += mul(s0_0, M4(6.200e-02, 5.385e-02, -5.478e-02, 3.955e-02, -1.722e-02, -1.194e-01, 8.331e-02, -9.296e-02, -2.161e-02, 8.716e-02, -5.918e-02, 1.032e-01, 4.954e-02, -3.822e-02, 8.472e-02, -2.191e-01)); + r += mul(s0_1, M4(2.503e-01, 5.635e-02, 7.355e-03, -2.025e-01, 7.104e-02, -1.324e-01, -3.051e-02, 2.246e-02, -4.480e-02, 6.693e-03, 4.467e-02, 3.388e-02, 4.262e-01, 1.488e-01, -8.809e-01, 5.350e-01)); + r += mul(s0_2, M4(-7.511e-03, 1.921e-01, -3.653e-01, 2.096e-02, 2.413e-02, 4.846e-02, -1.538e-01, 3.359e-02, 5.958e-03, -1.033e-02, 2.389e-02, 1.283e-02, -5.270e-02, 2.842e-01, 5.681e-02, -3.578e-02)); + r += mul(s0_3, M4(-2.198e-02, -1.674e-02, 3.330e-02, 3.249e-02, -4.430e-02, 9.217e-02, -3.348e-02, -3.546e-01, 1.228e-01, 3.875e-02, 7.220e-03, 6.719e-02, -8.768e-01, -1.165e-02, -3.862e-02, -2.045e-02)); + r += mul(s0_4, M4(-6.935e-01, -4.898e-01, 2.252e-01, -1.647e-01, -6.408e-02, 4.562e-01, -6.617e-01, 1.220e-01, 1.053e-02, -9.937e-02, -1.118e-02, 3.272e-01, -9.081e-02, 2.353e-02, 4.776e-01, -1.238e-01)); + r += mul(s0_5, M4(2.481e-01, -3.296e-01, -3.372e-02, -2.008e-02, 5.924e-03, 1.762e-02, 3.642e-01, -1.182e-01, -2.219e-02, -4.332e-02, -9.762e-02, 3.537e-02, 2.114e-02, -5.440e-02, 3.124e-01, 5.069e-02)); + r += mul(s0_6, M4(-5.465e-02, -5.352e-03, -3.419e-03, -6.733e-02, -8.079e-02, -6.569e-02, -1.494e-02, -3.462e-01, -8.125e-03, 2.572e-03, -3.894e-02, -3.246e-02, -1.566e-02, -3.004e-02, 1.145e-01, 6.794e-02)); + r += mul(s0_7, M4(4.788e-02, 7.675e-03, -7.030e-02, -2.384e-02, -3.070e-01, -7.080e-01, -2.017e-01, 9.579e-02, 1.259e-01, -1.004e-02, -1.287e-01, 3.334e-02, -9.642e-02, -8.073e-02, 2.546e-02, 5.204e-02)); + r += mul(s0_8, M4(-6.015e-02, 1.650e-01, -5.471e-02, -1.454e-01, -2.785e-02, -1.831e-01, 1.123e-01, 3.453e-02, -1.179e-02, 1.722e-02, -1.068e-02, -2.608e-02, 1.514e-04, -1.287e-02, -7.741e-03, -9.765e-03)); + r += mul(s1_0, M4(-4.922e-02, -5.675e-03, -2.161e-02, 3.164e-02, -2.003e-02, -3.890e-02, 5.198e-02, -1.811e-03, -3.385e-02, -1.510e-02, -2.289e-02, 1.009e-01, 4.427e-02, -1.763e-01, 1.255e-01, -5.073e-02)); + r += mul(s1_1, M4(1.057e-01, -8.124e-02, 1.131e-01, -1.361e-01, 4.740e-02, -6.425e-02, 8.930e-03, 5.318e-02, 5.266e-02, -6.003e-02, 1.320e-01, 4.163e-02, 1.277e-01, -2.404e-01, -1.696e-01, 2.204e-01)); + r += mul(s1_2, M4(2.723e-02, 1.918e-01, -2.822e-01, -1.877e-02, -4.599e-03, 7.591e-02, -1.128e-01, -6.519e-03, 2.311e-02, -1.684e-01, 2.293e-01, -1.042e-01, -1.882e-02, 4.970e-02, -1.309e-01, -8.894e-03)); + r += mul(s1_3, M4(4.883e-02, 2.819e-02, 4.318e-02, 3.186e-02, 7.782e-02, 1.741e-01, -8.927e-02, 4.005e-02, 5.888e-02, -1.057e-01, 9.692e-02, 8.032e-02, -1.086e-01, 6.323e-02, -8.520e-02, -1.273e-02)); + r += mul(s1_4, M4(-1.746e-01, -2.834e-02, -3.694e-02, 3.226e-01, -2.541e-01, 6.860e-01, -1.436e-01, 1.705e-01, 2.614e-01, -6.751e-02, 5.646e-02, 3.666e-01, -2.621e-02, 4.951e-01, -1.090e-01, -3.168e-01)); + r += mul(s1_5, M4(1.513e-01, 5.210e-02, 2.625e-01, -6.303e-02, -2.252e-02, -9.485e-02, 4.776e-01, -1.789e-01, -1.291e-01, -9.714e-02, -1.427e-01, -1.165e-01, 2.415e-02, 9.790e-02, 6.024e-02, -9.622e-02)); + r += mul(s1_6, M4(3.751e-02, -2.907e-02, -1.762e-02, -9.545e-02, 2.866e-01, -7.329e-02, -9.787e-03, 4.513e-03, -9.486e-02, -2.446e-02, -2.357e-02, -5.002e-02, 4.973e-02, 6.256e-02, -2.532e-02, -1.817e-02)); + r += mul(s1_7, M4(-6.855e-02, -6.762e-02, -6.269e-02, -6.947e-02, -1.389e-01, -1.915e-01, -4.806e-02, 1.870e-01, 1.298e-01, 6.268e-03, -5.985e-02, -5.396e-02, -3.048e-02, -5.396e-03, -9.720e-02, 3.289e-03)); + r += mul(s1_8, M4(-2.052e-02, -8.106e-02, -1.721e-02, 9.911e-03, -8.521e-02, 4.832e-02, -1.708e-01, -6.445e-02, -9.788e-02, 8.836e-02, -1.204e-01, -1.123e-01, 1.514e-02, 1.628e-02, -5.003e-02, -6.128e-03)); + r += V4(1.448e-03, -2.432e-03, -8.004e-04, 5.896e-05); + return r; +} + +void Pass7(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = Rmp8x8(tid.x) + blockStart; + uint2 size = GetInputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = (gxy + 0.5) * pt; + + V4 s0_0 = l0(-1.0, -1.0); + V4 s0_1 = l0(0.0, -1.0); + V4 s0_2 = l0(1.0, -1.0); + V4 s0_3 = l0(-1.0, 0.0); + V4 s0_4 = l0(0.0, 0.0); + V4 s0_5 = l0(1.0, 0.0); + V4 s0_6 = l0(-1.0, 1.0); + V4 s0_7 = l0(0.0, 1.0); + V4 s0_8 = l0(1.0, 1.0); + V4 s1_0 = -max(-s0_0, 0.0); + V4 s1_1 = -max(-s0_1, 0.0); + V4 s1_2 = -max(-s0_2, 0.0); + V4 s1_3 = -max(-s0_3, 0.0); + V4 s1_4 = -max(-s0_4, 0.0); + V4 s1_5 = -max(-s0_5, 0.0); + V4 s1_6 = -max(-s0_6, 0.0); + V4 s1_7 = -max(-s0_7, 0.0); + V4 s1_8 = -max(-s0_8, 0.0); + s0_0 = max(s0_0, 0.0); + s0_1 = max(s0_1, 0.0); + s0_2 = max(s0_2, 0.0); + s0_3 = max(s0_3, 0.0); + s0_4 = max(s0_4, 0.0); + s0_5 = max(s0_5, 0.0); + s0_6 = max(s0_6, 0.0); + s0_7 = max(s0_7, 0.0); + s0_8 = max(s0_8, 0.0); + + t0[gxy] = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8); +} + +//!PASS 8 +//!DESC conv7 +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 +//!IN t0 +//!OUT t1 + +#define l0(x, y) V4(O(t0, float2(x, y))) + +V4 f0(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8) { + V4 r = 0.0; + r += mul(s0_0, M4(5.901e-02, -1.033e-01, -1.441e-01, 4.291e-02, 2.355e-02, -1.199e-01, -1.741e-01, -5.263e-03, -6.030e-03, -4.043e-02, 1.910e-01, 8.326e-03, 2.913e-02, 1.969e-02, -1.380e-01, 9.492e-02)); + r += mul(s0_1, M4(-1.616e-01, 1.649e-01, -1.133e-02, -1.037e-01, -1.060e-02, 2.299e-01, -5.302e-02, -2.329e-01, -8.540e-02, 2.232e-01, 2.647e-01, 3.922e-01, 5.387e-02, 5.841e-01, -1.264e-01, -1.440e-01)); + r += mul(s0_2, M4(-1.944e-02, -7.262e-02, 9.583e-02, 3.448e-02, 4.402e-02, 5.319e-02, -2.384e-02, 4.652e-02, 6.280e-02, -4.195e-02, 1.573e-02, 7.059e-02, 1.029e-01, -1.784e-02, -3.735e-02, -4.952e-02)); + r += mul(s0_3, M4(7.393e-02, -1.825e-01, -2.983e-01, -5.798e-02, -2.475e-01, -4.958e-02, 6.660e-01, -2.202e-01, -9.158e-02, 4.280e-04, 2.472e-01, -2.979e-01, -9.887e-02, 6.188e-02, 2.163e-01, -9.358e-03)); + r += mul(s0_4, M4(-8.664e-01, 2.357e-01, 3.390e-01, -5.275e-01, -2.213e-01, -4.992e-01, 5.479e-01, 4.245e-01, -7.542e-02, 4.854e-01, -3.525e-01, 3.950e-01, 3.619e-01, -3.968e-01, -3.447e-01, 5.089e-01)); + r += mul(s0_5, M4(-9.239e-02, -6.370e-01, -7.252e-02, -3.435e-01, -1.057e-01, 1.616e-01, -4.413e-02, 1.824e-01, 2.001e-02, -1.343e-01, -5.730e-02, 7.302e-02, -2.361e-02, -9.044e-02, -1.041e-01, 2.971e-01)); + r += mul(s0_6, M4(-2.803e-02, -8.707e-02, -1.407e-01, -2.685e-02, 1.099e-01, 1.721e-01, 1.612e-01, 6.962e-02, -1.659e-02, 7.845e-02, 2.165e-01, -7.067e-02, 1.666e-02, 7.051e-02, 6.373e-02, 4.391e-02)); + r += mul(s0_7, M4(-1.560e-01, -2.698e-02, -5.684e-01, -1.184e-01, 7.742e-01, -1.023e-03, -8.177e-02, 2.857e-01, 2.253e-02, -1.400e-02, -6.523e-02, 7.644e-02, 1.789e-01, -8.433e-03, 1.041e-01, 7.009e-02)); + r += mul(s0_8, M4(-1.491e-01, -2.037e-01, -2.499e-01, -7.730e-02, 1.051e-01, -1.718e-02, -1.762e-01, 4.808e-02, -3.068e-03, 1.737e-02, -3.772e-04, 4.732e-02, 7.205e-02, 7.901e-02, -1.759e-02, 8.476e-02)); + r += mul(s1_0, M4(4.810e-02, -1.822e-02, -1.150e-01, -1.679e-02, -5.481e-02, -7.544e-02, 2.213e-01, 2.615e-02, -2.628e-03, -1.482e-01, -5.570e-02, 5.137e-02, -1.381e-02, -1.878e-03, -3.132e-02, -3.309e-02)); + r += mul(s1_1, M4(1.101e-01, 1.003e-01, -4.307e-01, -2.520e-02, 1.138e-02, -1.966e-01, 6.664e-02, 1.114e-01, -1.431e-01, 3.634e-01, 4.274e-02, -8.279e-02, -5.291e-02, 3.540e-01, 8.995e-02, -1.401e-01)); + r += mul(s1_2, M4(7.230e-02, 4.684e-01, -6.542e-02, -2.792e-01, 2.936e-02, 3.476e-03, -1.024e-02, 1.880e-01, 1.898e-02, 2.529e-02, 8.537e-03, -6.073e-03, 1.025e-01, -2.320e-01, -1.804e-02, 5.471e-02)); + r += mul(s1_3, M4(-9.258e-03, -7.731e-03, 4.285e-02, -4.725e-02, -3.878e-02, -1.749e-02, -1.681e-02, -1.020e-01, -3.975e-02, 1.609e-02, 8.299e-02, -1.824e-01, -2.500e-02, 3.516e-02, 8.591e-02, 1.714e-02)); + r += mul(s1_4, M4(-2.210e-01, 1.534e-01, 3.410e-01, -2.552e-01, -5.090e-02, 1.582e-02, 1.802e-01, -1.333e-01, -5.371e-01, 3.751e-01, -1.323e-01, 3.018e-01, 1.756e-01, -9.756e-02, -4.873e-01, 4.985e-01)); + r += mul(s1_5, M4(-1.073e-02, 2.919e-01, -2.025e-01, 3.240e-01, 4.318e-02, -1.972e-02, -1.612e-01, 3.528e-01, -6.472e-02, -6.212e-02, 3.146e-02, 6.391e-02, 4.950e-02, -6.270e-01, -1.985e-02, 4.680e-02)); + r += mul(s1_6, M4(-2.215e-02, 1.836e-02, 5.021e-02, -3.016e-02, -7.854e-03, 1.135e-02, 3.407e-02, -2.923e-02, -5.384e-03, 6.570e-02, 2.437e-01, -8.712e-02, 2.275e-02, -2.291e-03, -7.378e-02, 5.231e-02)); + r += mul(s1_7, M4(-4.186e-02, 6.944e-02, 8.353e-02, -1.927e-02, 3.937e-02, 2.105e-02, 7.152e-02, 5.635e-03, 1.114e-01, -3.772e-02, -1.853e-01, 6.636e-02, 4.654e-02, -1.008e-01, -1.625e-01, 7.888e-02)); + r += mul(s1_8, M4(5.288e-02, -5.516e-02, -4.014e-02, 8.854e-02, 2.434e-02, 9.192e-02, -1.203e-02, 6.813e-02, 4.626e-02, -4.892e-02, 4.700e-03, 7.578e-02, -5.040e-02, 3.497e-02, 3.176e-02, -9.741e-02)); + r += V4(2.671e-03, -5.536e-03, -4.013e-03, 4.378e-03); + return r; +} + +void Pass8(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = Rmp8x8(tid.x) + blockStart; + uint2 size = GetInputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = (gxy + 0.5) * pt; + + V4 s0_0 = l0(-1.0, -1.0); + V4 s0_1 = l0(0.0, -1.0); + V4 s0_2 = l0(1.0, -1.0); + V4 s0_3 = l0(-1.0, 0.0); + V4 s0_4 = l0(0.0, 0.0); + V4 s0_5 = l0(1.0, 0.0); + V4 s0_6 = l0(-1.0, 1.0); + V4 s0_7 = l0(0.0, 1.0); + V4 s0_8 = l0(1.0, 1.0); + V4 s1_0 = -max(-s0_0, 0.0); + V4 s1_1 = -max(-s0_1, 0.0); + V4 s1_2 = -max(-s0_2, 0.0); + V4 s1_3 = -max(-s0_3, 0.0); + V4 s1_4 = -max(-s0_4, 0.0); + V4 s1_5 = -max(-s0_5, 0.0); + V4 s1_6 = -max(-s0_6, 0.0); + V4 s1_7 = -max(-s0_7, 0.0); + V4 s1_8 = -max(-s0_8, 0.0); + s0_0 = max(s0_0, 0.0); + s0_1 = max(s0_1, 0.0); + s0_2 = max(s0_2, 0.0); + s0_3 = max(s0_3, 0.0); + s0_4 = max(s0_4, 0.0); + s0_5 = max(s0_5, 0.0); + s0_6 = max(s0_6, 0.0); + s0_7 = max(s0_7, 0.0); + s0_8 = max(s0_8, 0.0); + + t1[gxy] = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8); +} + +//!PASS 9 +//!DESC conv8 +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 +//!IN t1 +//!OUT t0 + +#define l0(x, y) V4(O(t1, float2(x, y))) + +V4 f0(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8) { + V4 r = 0.0; + r += mul(s0_0, M4(8.283e-02, 5.262e-02, 1.580e-02, 4.991e-02, 6.836e-02, -3.234e-02, 5.630e-02, 1.275e-01, 5.398e-03, 9.866e-04, -1.054e-02, 1.601e-02, 1.546e-02, -7.786e-02, -2.630e-02, -3.023e-02)); + r += mul(s0_1, M4(9.285e-02, 3.403e-01, -4.572e-02, 1.431e-01, 2.876e-01, -3.271e-01, -8.133e-04, 5.998e-01, 4.515e-02, 9.836e-02, 2.315e-02, 1.724e-01, -8.080e-02, -1.978e-01, -5.366e-02, -4.535e-02)); + r += mul(s0_2, M4(1.708e-02, -8.374e-02, -1.831e-02, 1.744e-02, 4.902e-02, -1.037e-02, -3.508e-02, 3.501e-02, 1.160e-01, 2.529e-01, 4.235e-02, 4.233e-02, -5.953e-03, -1.398e-01, -8.815e-03, 1.053e-02)); + r += mul(s0_3, M4(-2.836e-03, -2.496e-01, 2.703e-02, 9.490e-02, 3.985e-01, -9.458e-02, 1.355e-01, 5.917e-01, 5.597e-03, -8.963e-02, 5.238e-02, 4.360e-02, -1.070e-01, 7.593e-02, 6.376e-02, -1.498e-01)); + r += mul(s0_4, M4(3.214e-01, -8.045e-01, 6.621e-01, -1.261e-01, -1.487e+00, 1.086e+00, 3.779e-01, -1.762e+00, 2.721e-01, -3.815e-02, -1.450e-01, 4.063e-01, 2.804e-01, 3.876e-01, 2.607e-01, 2.174e-01)); + r += mul(s0_5, M4(-3.896e-01, 3.340e-01, -2.529e-01, -6.519e-02, -1.815e-01, 5.542e-02, -1.669e-01, 1.732e-02, 2.995e-01, 4.942e-02, 6.557e-02, -1.386e-01, -1.392e-01, 2.822e-01, 2.016e-02, -1.313e-01)); + r += mul(s0_6, M4(-2.130e-02, 4.137e-02, 7.324e-02, 4.834e-03, 9.333e-02, -2.998e-01, 4.229e-01, 9.535e-02, -2.595e-02, 2.955e-02, 7.491e-02, -3.028e-02, -2.850e-02, 1.582e-02, -1.076e-01, -3.159e-02)); + r += mul(s0_7, M4(-3.601e-02, 5.993e-02, -1.190e-02, -6.800e-02, 6.894e-03, -2.095e-01, -9.548e-02, -2.539e-02, -2.390e-02, 2.947e-02, 1.581e-01, -5.305e-03, 1.029e-01, -1.456e-01, -3.526e-02, 9.251e-02)); + r += mul(s0_8, M4(-7.206e-02, 9.690e-02, -4.464e-02, -6.999e-03, 3.140e-02, -4.201e-02, -6.364e-03, 5.280e-03, -1.412e-01, 1.696e-01, -1.274e-01, -9.546e-02, 5.285e-02, -1.072e-01, 5.994e-02, 1.293e-02)); + r += mul(s1_0, M4(-1.808e-02, 1.243e-01, -6.814e-02, -4.219e-03, 1.273e-02, 2.752e-02, 3.764e-02, 3.650e-02, 7.663e-04, 6.843e-03, 1.380e-02, -3.235e-02, 5.400e-02, -5.352e-02, 1.190e-02, -1.028e-01)); + r += mul(s1_1, M4(2.568e-01, 2.764e-01, 7.740e-02, 1.273e-01, 7.059e-02, 6.668e-02, 4.211e-02, 6.293e-02, -4.164e-02, 2.210e-01, -1.293e-02, 8.369e-02, 2.046e-01, 1.238e-01, 9.491e-02, 4.614e-02)); + r += mul(s1_2, M4(-2.387e-02, 3.174e-01, 8.165e-02, -6.680e-02, -1.516e-02, 1.482e-02, -1.342e-02, 1.692e-02, -2.288e-02, -6.891e-02, -5.559e-02, 4.771e-02, 3.290e-02, 1.234e-01, 4.334e-02, -5.106e-02)); + r += mul(s1_3, M4(6.216e-02, -2.114e-01, -1.616e-01, 1.664e-01, 3.796e-02, 6.036e-02, -1.106e-01, 1.398e-01, -3.139e-02, -6.274e-02, 4.988e-02, -6.274e-02, 2.296e-02, -5.131e-02, 5.052e-02, -8.866e-02)); + r += mul(s1_4, M4(2.647e-01, -7.858e-01, 1.597e-01, -8.262e-01, -3.213e-01, 2.427e-01, 1.686e-01, -4.251e-01, 1.505e-01, 3.244e-02, 1.023e-01, 1.962e-01, -1.116e-01, 3.525e-01, 8.848e-01, -1.945e-01)); + r += mul(s1_5, M4(-2.549e-01, -1.429e-01, -3.696e-02, 3.042e-01, -1.256e-01, 2.760e-02, -3.650e-02, 7.985e-02, -1.958e-01, 3.076e-01, -9.253e-02, -8.512e-02, -1.708e-01, -3.422e-04, -8.181e-02, 2.319e-01)); + r += mul(s1_6, M4(-3.382e-02, 6.627e-02, 1.158e-01, -3.044e-02, -7.983e-03, -7.855e-02, 1.729e-02, 3.219e-04, -1.764e-02, 4.065e-02, -1.400e-02, -2.387e-02, 2.673e-03, 5.460e-03, -4.992e-02, -1.573e-02)); + r += mul(s1_7, M4(-2.505e-02, 1.763e-01, -4.433e-01, -1.024e-01, 1.391e-01, -2.435e-01, -5.358e-02, 5.203e-02, 3.157e-02, 2.012e-02, 7.424e-03, 3.723e-02, -2.388e-02, 7.204e-02, -4.522e-01, -1.187e-02)); + r += mul(s1_8, M4(9.737e-02, 7.067e-02, 4.072e-02, 4.303e-02, 2.890e-02, -1.810e-02, 5.156e-03, -1.953e-02, -3.503e-02, 7.492e-02, 1.402e-02, -9.796e-03, 2.320e-01, -2.135e-01, 1.462e-01, 1.194e-01)); + r += V4(-5.006e-05, -2.252e-04, -1.752e-03, 4.586e-04); + return r; +} + +void Pass9(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = Rmp8x8(tid.x) + blockStart; + uint2 size = GetInputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = (gxy + 0.5) * pt; + + V4 s0_0 = l0(-1.0, -1.0); + V4 s0_1 = l0(0.0, -1.0); + V4 s0_2 = l0(1.0, -1.0); + V4 s0_3 = l0(-1.0, 0.0); + V4 s0_4 = l0(0.0, 0.0); + V4 s0_5 = l0(1.0, 0.0); + V4 s0_6 = l0(-1.0, 1.0); + V4 s0_7 = l0(0.0, 1.0); + V4 s0_8 = l0(1.0, 1.0); + V4 s1_0 = -max(-s0_0, 0.0); + V4 s1_1 = -max(-s0_1, 0.0); + V4 s1_2 = -max(-s0_2, 0.0); + V4 s1_3 = -max(-s0_3, 0.0); + V4 s1_4 = -max(-s0_4, 0.0); + V4 s1_5 = -max(-s0_5, 0.0); + V4 s1_6 = -max(-s0_6, 0.0); + V4 s1_7 = -max(-s0_7, 0.0); + V4 s1_8 = -max(-s0_8, 0.0); + s0_0 = max(s0_0, 0.0); + s0_1 = max(s0_1, 0.0); + s0_2 = max(s0_2, 0.0); + s0_3 = max(s0_3, 0.0); + s0_4 = max(s0_4, 0.0); + s0_5 = max(s0_5, 0.0); + s0_6 = max(s0_6, 0.0); + s0_7 = max(s0_7, 0.0); + s0_8 = max(s0_8, 0.0); + + t0[gxy] = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8); +} + +//!PASS 10 +//!DESC out-shuffle +//!BLOCK_SIZE 16 +//!NUM_THREADS 64 +//!IN INPUT, t0 +//!OUT OUTPUT + +#define l0(x, y) V4(O(t0, float2(x, y))) + +V4 f0(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8) { + V4 r = 0.0; + r += mul(s0_0, M4(2.670e-02, -1.964e-03, 2.191e-02, 3.109e-02, 1.911e-02, -2.017e-02, -2.948e-02, -2.237e-02, -3.845e-02, -7.954e-03, -3.472e-02, -2.253e-02, -1.571e-02, -6.613e-03, -1.489e-02, -2.647e-02)); + r += mul(s0_1, M4(-6.714e-02, -2.106e-02, 7.577e-03, 1.788e-02, 8.081e-02, 8.813e-02, -5.510e-02, -2.724e-02, 1.150e-01, 5.284e-02, -8.964e-02, -3.024e-02, 5.215e-02, 5.334e-02, -1.180e-02, 6.927e-03)); + r += mul(s0_2, M4(1.036e-02, 1.826e-02, -8.095e-03, -9.967e-03, 1.368e-03, 3.479e-02, -1.887e-03, -2.161e-02, -3.464e-02, -1.124e-01, -4.623e-03, -5.295e-03, -7.199e-03, -4.285e-02, 8.862e-03, -1.610e-02)); + r += mul(s0_3, M4(2.388e-01, -1.001e-03, 1.699e-01, -4.519e-02, -3.274e-01, 1.550e-01, 3.748e-02, 3.435e-02, -1.655e-01, 1.227e-02, -1.372e-01, 4.700e-02, -1.636e-01, 1.222e-02, -1.323e-01, 3.239e-02)); + r += mul(s0_4, M4(1.698e-01, 4.561e-01, -1.355e-01, 1.831e-01, -3.815e-01, -7.832e-01, 1.738e-01, 4.516e-02, 2.803e-01, -4.239e-01, 8.945e-01, -1.339e-02, -3.701e-01, -3.731e-01, 1.765e-01, -1.343e-01)); + r += mul(s0_5, M4(-4.653e-02, -8.470e-02, -1.076e-03, -7.153e-02, 1.022e-02, -2.560e-02, -1.154e-02, 2.252e-02, -1.053e-01, 4.014e-01, -1.479e-01, 3.667e-01, 9.425e-02, -8.079e-02, 5.594e-03, 4.870e-02)); + r += mul(s0_6, M4(-6.274e-02, -3.430e-02, -5.955e-02, 1.220e-02, -6.075e-02, 1.284e-02, -8.384e-02, 2.143e-01, -2.050e-02, -8.887e-03, -1.445e-02, 1.797e-02, 1.436e-01, -8.067e-04, 1.013e-01, 3.847e-03)); + r += mul(s0_7, M4(6.862e-02, -7.230e-02, -2.461e-01, -3.760e-01, 4.038e-02, -2.634e-02, -2.725e-01, -4.389e-01, 9.088e-03, -1.873e-02, -9.497e-02, -1.860e-01, -1.038e-01, 2.502e-01, -6.194e-01, 4.470e-02)); + r += mul(s0_8, M4(-1.984e-02, 4.173e-02, 5.328e-02, 5.554e-02, 1.241e-03, -2.290e-03, 5.972e-02, 4.381e-02, -3.320e-03, -1.434e-04, -5.754e-02, -6.072e-02, -6.854e-03, 6.781e-02, 1.208e-01, -5.469e-02)); + r += mul(s1_0, M4(7.050e-02, -3.676e-02, 7.009e-03, 1.431e-02, -1.258e-02, -6.854e-03, -9.803e-04, 5.955e-03, -3.077e-03, -2.372e-02, 8.060e-03, -5.992e-02, -7.957e-02, 2.905e-02, 3.914e-04, -1.408e-02)); + r += mul(s1_1, M4(-1.068e-01, 4.589e-02, -1.399e-02, -8.157e-03, 1.811e-02, 7.241e-03, 9.447e-03, 3.242e-03, 5.152e-02, 8.667e-02, -2.512e-02, -2.978e-02, 1.382e-01, 5.481e-02, -2.199e-02, -2.739e-02)); + r += mul(s1_2, M4(3.676e-02, 1.705e-02, -4.520e-03, -6.449e-03, 1.006e-02, 9.807e-03, -6.046e-03, -1.299e-03, -5.035e-02, -4.415e-02, 9.619e-03, -1.059e-02, -6.952e-03, -1.803e-02, -4.042e-03, -1.751e-02)); + r += mul(s1_3, M4(5.123e-02, 4.500e-02, 2.099e-01, -7.254e-03, -7.977e-02, 2.822e-02, -1.546e-01, -3.748e-02, -2.378e-01, -1.836e-02, -3.508e-02, -2.147e-03, 3.371e-02, -4.720e-02, -5.574e-02, -1.592e-02)); + r += mul(s1_4, M4(-5.764e-01, 5.998e-01, -2.288e-01, 7.223e-01, -1.855e-01, -3.467e-01, 5.173e-02, -8.967e-02, 3.308e-01, -8.987e-02, 2.397e-01, 3.701e-01, -7.970e-02, -9.046e-01, 2.397e-01, -1.626e-01)); + r += mul(s1_5, M4(1.177e-02, -1.538e-01, 4.138e-02, -5.198e-02, 3.165e-03, 3.827e-02, -5.913e-03, 8.727e-03, 7.885e-02, 2.979e-01, -6.160e-02, 1.198e-01, 1.186e-02, 9.421e-02, -4.101e-02, 4.185e-03)); + r += mul(s1_6, M4(-7.690e-02, -4.820e-03, -1.106e-01, 4.040e-02, -6.883e-02, -3.284e-02, 1.259e-02, 1.509e-01, 6.378e-03, -5.293e-04, -3.690e-02, 6.274e-02, 1.401e-01, -3.801e-03, 1.489e-01, -1.044e-02)); + r += mul(s1_7, M4(1.140e-01, -1.333e-01, -1.739e-01, -1.739e-01, 4.736e-02, -1.306e-02, -3.673e-01, -6.127e-01, -3.477e-02, -6.090e-02, 2.430e-02, -2.666e-01, -6.599e-02, 2.794e-01, -1.724e-01, -2.744e-01)); + r += mul(s1_8, M4(1.045e-02, 6.106e-02, 3.463e-02, 6.708e-02, -1.028e-02, -2.277e-02, 6.536e-02, 8.227e-02, -5.566e-02, -3.941e-02, -6.862e-03, -1.219e-02, -1.438e-02, -4.651e-02, 5.359e-02, 4.650e-02)); + r += V4(-1.731e-03, -2.098e-03, -1.131e-03, -1.644e-03); + return tanh(r); +} + +void Pass10(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = (Rmp8x8(tid.x) << 1) + blockStart; + uint2 size = GetOutputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = ((gxy >> 1) + 0.5) * pt; + + V4 s0_0 = l0(-1.0, -1.0); + V4 s0_1 = l0(0.0, -1.0); + V4 s0_2 = l0(1.0, -1.0); + V4 s0_3 = l0(-1.0, 0.0); + V4 s0_4 = l0(0.0, 0.0); + V4 s0_5 = l0(1.0, 0.0); + V4 s0_6 = l0(-1.0, 1.0); + V4 s0_7 = l0(0.0, 1.0); + V4 s0_8 = l0(1.0, 1.0); + V4 s1_0 = -max(-s0_0, 0.0); + V4 s1_1 = -max(-s0_1, 0.0); + V4 s1_2 = -max(-s0_2, 0.0); + V4 s1_3 = -max(-s0_3, 0.0); + V4 s1_4 = -max(-s0_4, 0.0); + V4 s1_5 = -max(-s0_5, 0.0); + V4 s1_6 = -max(-s0_6, 0.0); + V4 s1_7 = -max(-s0_7, 0.0); + V4 s1_8 = -max(-s0_8, 0.0); + s0_0 = max(s0_0, 0.0); + s0_1 = max(s0_1, 0.0); + s0_2 = max(s0_2, 0.0); + s0_3 = max(s0_3, 0.0); + s0_4 = max(s0_4, 0.0); + s0_5 = max(s0_5, 0.0); + s0_6 = max(s0_6, 0.0); + s0_7 = max(s0_7, 0.0); + s0_8 = max(s0_8, 0.0); + + V4 r = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8); + + static const float3x3 rgb2yuv = {0.299, 0.587, 0.114, -0.169, -0.331, 0.5, 0.5, -0.419, -0.081}; + static const float3x3 yuv2rgb = {1, -0.00093, 1.401687, 1, -0.3437, -0.71417, 1, 1.77216, 0.00099}; + float2 opt = float2(GetOutputPt()); + + pos -= 0.5f * opt; + float3 yuv = mul(rgb2yuv, INPUT.SampleLevel(SL, pos, 0).rgb); + OUTPUT[gxy] = float4(mul(yuv2rgb, float3(saturate(yuv.r + r.x), yuv.yz)), 1); + + ++gxy.x; + pos.x += opt.x; + yuv = mul(rgb2yuv, INPUT.SampleLevel(SL, pos, 0).rgb); + OUTPUT[gxy] = float4(mul(yuv2rgb, float3(saturate(yuv.r + r.y), yuv.yz)), 1); + + ++gxy.y; + pos.y += opt.y; + yuv = mul(rgb2yuv, INPUT.SampleLevel(SL, pos, 0).rgb); + OUTPUT[gxy] = float4(mul(yuv2rgb, float3(saturate(yuv.r + r.w), yuv.yz)), 1); + + --gxy.x; + pos.x -= opt.x; + yuv = mul(rgb2yuv, INPUT.SampleLevel(SL, pos, 0).rgb); + OUTPUT[gxy] = float4(mul(yuv2rgb, float3(saturate(yuv.r + r.z), yuv.yz)), 1); +} diff --git a/src/Effects/CuNNy/CuNNy-8x8C-NVL-DN.hlsl b/src/Effects/CuNNy/CuNNy-8x8C-NVL-DN.hlsl new file mode 100644 index 000000000..d55e1e9ba --- /dev/null +++ b/src/Effects/CuNNy/CuNNy-8x8C-NVL-DN.hlsl @@ -0,0 +1,1573 @@ +// CuNNy 8x8C BILINEAR RGB NVL DN - https://github.com/cunnyplapper/CuNNy + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +//!MAGPIE EFFECT +//!VERSION 4 +//!SORT_NAME CuNNy-DN-D08N08 + +//!TEXTURE +Texture2D INPUT; + +//!TEXTURE +//!WIDTH INPUT_WIDTH * 2 +//!HEIGHT INPUT_HEIGHT * 2 +Texture2D OUTPUT; + +//!SAMPLER +//!FILTER POINT +SamplerState SP; + +//!SAMPLER +//!FILTER LINEAR +SamplerState SL; + +//!COMMON +#define O(t, p) t.SampleLevel(SP, pos + p * pt, 0) +#define V4 min16float4 +#define M4 min16float4x4 + +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +//!FORMAT R8G8B8A8_SNORM +Texture2D t0; + +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +//!FORMAT R8G8B8A8_SNORM +Texture2D t1; + +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +//!FORMAT R8G8B8A8_SNORM +Texture2D t2; + +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +//!FORMAT R8G8B8A8_SNORM +Texture2D t3; + +//!PASS 1 +//!DESC in +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 +//!IN INPUT +//!OUT t0, t1 + +#define l0(x, y) min16float((dot(float3(1.925e-01, 3.819e-01, 8.369e-02), O(INPUT, float2(x, y)).rgb) + -5.387e-01)) + +V4 f0(min16float s0_0, min16float s0_1, min16float s0_2, min16float s0_3, min16float s0_4, min16float s0_5, min16float s0_6, min16float s0_7, min16float s0_8) { + V4 r = 0.0; + r += V4(2.639e-02, -1.701e-01, -3.774e-03, -1.132e-01) * s0_0; + r += V4(7.110e-02, 1.313e-01, -1.082e-02, 2.661e-02) * s0_1; + r += V4(-7.133e-02, 3.915e-02, 1.220e-02, -3.065e-02) * s0_2; + r += V4(-1.310e-01, -4.277e-01, 5.738e-01, -1.361e-01) * s0_3; + r += V4(8.785e-02, -3.337e-02, -2.604e-02, 5.665e-01) * s0_4; + r += V4(-1.597e-01, 4.606e-01, -4.603e-03, -5.048e-02) * s0_5; + r += V4(5.069e-02, 2.608e-02, -2.872e-02, -1.027e-01) * s0_6; + r += V4(1.334e-01, -3.456e-02, -1.744e-03, 7.886e-02) * s0_7; + r += V4(2.759e-02, 1.279e-02, -7.839e-03, -2.046e-01) * s0_8; + r += V4(4.846e-02, 9.244e-03, -3.897e-02, 9.766e-03); + return r; +} + +V4 f1(min16float s0_0, min16float s0_1, min16float s0_2, min16float s0_3, min16float s0_4, min16float s0_5, min16float s0_6, min16float s0_7, min16float s0_8) { + V4 r = 0.0; + r += V4(-2.867e-01, 2.141e-01, 4.437e-02, -5.342e-02) * s0_0; + r += V4(-4.092e-01, -1.685e-01, -3.220e-02, -2.083e-01) * s0_1; + r += V4(-4.212e-02, -3.446e-02, 3.496e-02, -6.681e-02) * s0_2; + r += V4(6.756e-02, 4.954e-01, -9.457e-02, 1.597e-01) * s0_3; + r += V4(7.022e-01, -4.053e-02, 3.086e-02, -3.529e-01) * s0_4; + r += V4(-1.718e-02, -4.736e-01, -1.362e-02, 2.655e-02) * s0_5; + r += V4(6.323e-02, 1.250e-02, -2.611e-01, 2.058e-02) * s0_6; + r += V4(-1.266e-01, -5.605e-03, -3.361e-01, 1.510e-01) * s0_7; + r += V4(4.938e-02, -7.117e-04, 2.257e-02, -7.702e-03) * s0_8; + r += V4(1.322e-02, 1.053e-02, 6.702e-02, 8.937e-03); + return r; +} + +void Pass1(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = Rmp8x8(tid.x) + blockStart; + uint2 size = GetInputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = (gxy + 0.5) * pt; + + min16float s0_0 = l0(-1.0, -1.0); + min16float s0_1 = l0(0.0, -1.0); + min16float s0_2 = l0(1.0, -1.0); + min16float s0_3 = l0(-1.0, 0.0); + min16float s0_4 = l0(0.0, 0.0); + min16float s0_5 = l0(1.0, 0.0); + min16float s0_6 = l0(-1.0, 1.0); + min16float s0_7 = l0(0.0, 1.0); + min16float s0_8 = l0(1.0, 1.0); + + t0[gxy] = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8); + t1[gxy] = f1(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8); +} + +//!PASS 2 +//!DESC conv1 +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 +//!IN t0, t1 +//!OUT t2, t3 + +#define l0(x, y) V4(O(t0, float2(x, y))) +#define l1(x, y) V4(O(t1, float2(x, y))) + +V4 f0(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-6.787e-02, 1.507e-01, 1.386e-01, 1.354e-01, -1.647e-02, 2.280e-01, -6.392e-02, -1.182e-01, -3.002e-01, 5.059e-02, -4.223e-02, 1.296e-01, 3.034e-01, 9.575e-02, 2.396e-01, 2.604e-01)); + r += mul(s0_1, M4(1.771e-01, 1.258e-01, 9.676e-02, -5.836e-02, 2.180e-01, 9.400e-02, -1.364e-01, 1.365e-01, -1.889e-01, 6.458e-02, 2.028e-01, 1.279e-01, -2.230e-01, 4.919e-02, 3.303e-01, 2.852e-02)); + r += mul(s0_2, M4(-2.253e-02, -3.429e-02, 1.720e-01, 3.019e-02, 1.779e-01, -1.289e-01, -1.485e-02, 2.294e-01, 6.777e-02, 2.094e-01, -8.003e-02, -2.814e-01, 5.090e-02, -1.822e-02, 4.285e-02, 9.212e-03)); + r += mul(s0_3, M4(4.345e-01, -1.625e-02, 2.947e-02, 5.848e-02, -6.072e-01, -1.842e-01, -2.682e-01, -8.853e-02, -4.014e-01, 1.387e-01, -1.617e-01, 2.580e-02, 5.142e-01, 7.146e-02, -7.968e-02, -5.864e-02)); + r += mul(s0_4, M4(-3.146e-01, -1.256e-02, -1.312e-01, 1.912e-02, -3.825e-01, -7.159e-02, -8.802e-02, -2.785e-01, 1.166e+00, 3.918e-01, 1.766e-01, -9.949e-01, -3.057e-01, 3.247e-01, -5.187e-02, -3.849e-01)); + r += mul(s0_5, M4(-1.266e-01, -3.163e-02, 5.540e-02, -1.063e-04, -3.565e-01, 2.094e-02, -7.364e-02, 4.674e-02, -3.207e-01, -4.732e-02, -3.064e-02, -7.816e-01, -2.368e-01, -1.159e-01, 4.110e-02, 1.199e-01)); + r += mul(s0_6, M4(-5.285e-02, 1.116e-01, -1.387e-01, 9.422e-02, -1.251e-02, -1.096e-02, 3.989e-01, 1.370e-02, 2.573e-03, -6.050e-02, 9.572e-02, -2.029e-01, 4.006e-02, 4.752e-02, -2.514e-01, -7.318e-02)); + r += mul(s0_7, M4(1.563e-01, -6.792e-02, 7.001e-02, 1.968e-02, 3.360e-01, -1.072e-01, 1.499e-01, -4.911e-02, -4.225e-01, -7.392e-02, -9.010e-01, -1.592e-01, -7.005e-03, -3.628e-01, -2.941e-01, 6.075e-02)); + r += mul(s0_8, M4(-6.457e-02, -1.010e-01, -1.549e-01, -8.569e-02, 2.008e-01, -3.078e-02, -1.027e-01, 1.431e-01, -1.821e-01, 4.419e-02, -1.641e-01, -1.295e-01, 2.477e-03, -1.839e-01, 7.758e-02, -4.918e-02)); + r += mul(s1_0, M4(8.745e-02, 4.435e-02, -1.817e-01, -6.904e-01, -5.046e-01, -6.161e-02, -2.511e-01, 1.648e-01, 5.188e-02, 7.367e-02, 2.228e-01, -8.911e-02, 3.976e-01, 1.385e-01, 3.897e-01, 2.256e-01)); + r += mul(s1_1, M4(-2.179e-02, 2.662e-01, -1.836e-01, 6.580e-01, -2.441e-02, 1.059e-01, 2.016e-01, -5.101e-02, 2.634e-02, 7.840e-02, 2.103e-02, 1.695e-01, -1.253e-01, -5.145e-02, 1.500e-01, 1.995e-01)); + r += mul(s1_2, M4(3.784e-02, -6.314e-02, 7.330e-02, -3.828e-01, -3.898e-03, 1.618e-01, 8.129e-02, 1.630e-01, 2.141e-02, 1.426e-01, -1.058e-02, 6.683e-02, -1.627e-02, 2.531e-03, 7.962e-02, 1.641e-01)); + r += mul(s1_3, M4(2.354e-01, -1.180e-02, 4.459e-02, -2.539e-01, -1.247e-02, 2.407e-01, 2.427e-01, -7.432e-02, -1.158e-01, 1.015e-02, -7.599e-02, -5.581e-02, 3.942e-01, -2.540e-02, -3.743e-01, 2.689e-01)); + r += mul(s1_4, M4(1.472e-01, -5.494e-01, 2.751e-02, -6.865e-01, 4.673e-01, 2.978e-01, -3.744e-01, 4.839e-02, 3.663e-01, 6.252e-03, 4.537e-02, -3.700e-02, -4.528e-01, 4.329e-01, 2.170e-01, -5.655e-02)); + r += mul(s1_5, M4(-3.136e-01, 3.527e-02, -9.977e-02, 1.680e-01, 1.746e-01, 2.170e-01, -1.577e-01, -3.133e-02, -2.571e-01, 4.381e-02, 5.043e-02, 4.327e-01, -2.274e-01, -2.338e-01, 1.237e-01, 9.396e-02)); + r += mul(s1_6, M4(-2.045e-01, -3.270e-01, 3.275e-01, 1.302e-01, 1.187e-01, -2.118e-02, 3.357e-01, 3.389e-02, 1.123e-01, 5.050e-03, -6.020e-03, 1.285e-02, 1.499e-01, 2.891e-01, -6.994e-01, 6.691e-02)); + r += mul(s1_7, M4(7.207e-02, 1.789e-01, 4.475e-01, 7.563e-02, 1.562e-01, 9.745e-02, 2.281e-01, 1.472e-01, -1.739e-01, 2.556e-02, -3.121e-01, 4.985e-02, -4.985e-02, -5.638e-01, -4.190e-01, 1.795e-01)); + r += mul(s1_8, M4(-3.225e-02, -5.762e-02, -2.681e-02, -3.269e-01, -1.883e-01, -1.365e-01, 8.040e-02, -2.820e-02, -4.708e-02, -1.241e-01, 2.407e-02, 5.468e-02, 8.962e-03, -5.522e-02, -5.487e-02, 5.633e-02)); + r += mul(s2_0, M4(-7.475e-02, 2.239e-02, 1.336e-02, -1.309e-02, -2.294e-01, 1.259e-02, -6.364e-02, 1.705e-01, -1.467e-01, 6.734e-02, -1.129e-01, 2.675e-01, -8.728e-02, -2.415e-01, -5.943e-02, 8.068e-02)); + r += mul(s2_1, M4(1.161e-01, 1.003e-01, -9.628e-03, -5.014e-02, -1.559e-01, -6.243e-02, 3.428e-01, -1.662e-01, 8.781e-02, -5.090e-02, -1.466e-01, 6.924e-02, -7.831e-02, -7.191e-02, -3.093e-01, -1.182e-01)); + r += mul(s2_2, M4(-1.187e-02, -1.124e-01, 1.241e-01, 3.818e-02, -3.489e-02, 1.072e-01, -3.086e-02, 8.455e-02, -3.857e-02, 1.693e-01, -1.791e-01, 1.621e-01, 5.023e-02, 6.312e-02, -1.419e-01, 3.264e-02)); + r += mul(s2_3, M4(6.541e-01, 1.355e-02, 6.582e-01, 4.098e-02, 5.969e-01, 1.744e-01, 1.758e-01, 1.798e-01, -2.511e-02, 6.407e-02, -4.659e-02, 1.100e-01, -3.252e-01, -2.088e-02, -3.156e-02, 2.349e-01)); + r += mul(s2_4, M4(-5.107e-01, 6.148e-01, -2.237e-01, -2.672e-01, 3.043e-01, 4.147e-01, -1.371e-02, -9.339e-02, -7.676e-02, -1.914e-02, 4.465e-02, -1.130e-01, 3.640e-01, -4.571e-01, 1.863e-02, 1.653e-01)); + r += mul(s2_5, M4(-1.206e-02, -6.812e-02, 1.585e-01, 1.884e-01, 2.366e-01, 3.310e-01, -1.584e-01, 4.540e-02, 6.728e-04, 3.926e-02, -1.147e-01, 1.093e-01, 2.546e-01, 1.105e-01, 1.950e-02, 1.075e-01)); + r += mul(s2_6, M4(1.302e-01, -1.658e-01, -4.834e-01, -2.295e-02, -1.106e-01, 2.600e-02, -2.262e-01, 8.762e-02, -5.511e-02, -1.613e-03, 1.347e-02, -2.278e-04, -9.678e-02, 7.248e-02, 1.184e-01, -1.321e-01)); + r += mul(s2_7, M4(-6.153e-02, -5.202e-01, -9.300e-01, 1.067e-01, 1.116e-01, -2.270e-01, 2.099e-02, 4.166e-02, 2.248e-02, 7.370e-02, 4.101e-01, 9.718e-02, 2.057e-01, -1.217e-01, 9.265e-02, -1.137e-01)); + r += mul(s2_8, M4(-1.353e-01, -2.862e-01, -6.823e-02, -2.380e-02, -6.254e-02, -8.065e-02, 1.598e-01, -1.998e-02, 5.988e-02, 1.871e-01, 8.992e-02, -7.480e-02, 2.728e-02, 1.082e-01, 3.140e-01, 1.540e-01)); + r += mul(s3_0, M4(-1.587e-01, 7.444e-02, -1.777e-02, 2.381e-02, 1.406e-01, 3.196e-01, -1.374e-03, 9.152e-02, -5.543e-01, -8.394e-03, 1.747e-01, 4.359e-01, -7.423e-02, -3.368e-01, -9.362e-02, 7.286e-02)); + r += mul(s3_1, M4(1.121e-01, 1.016e-01, 3.174e-02, -5.360e-02, -1.795e-02, 1.725e-02, -1.327e-02, 1.641e-01, -7.362e-01, -1.406e-01, -7.589e-01, 8.071e-01, -2.497e-01, -1.097e-01, -2.655e-01, -1.087e-01)); + r += mul(s3_2, M4(7.331e-03, -2.768e-02, 1.184e-01, 1.065e-01, 1.451e-01, -4.143e-02, -1.411e-01, 1.550e-01, 6.200e-01, 1.024e+00, -7.276e-02, 8.515e-01, 1.175e-01, 1.839e-01, -2.676e-01, -1.548e-02)); + r += mul(s3_3, M4(6.424e-01, 2.821e-02, 5.957e-01, 1.530e-01, 1.276e-01, -2.298e-01, -1.210e-01, 1.548e-01, 7.219e-01, 1.262e-01, 9.240e-01, 3.466e-01, -2.720e-01, -5.621e-02, -4.165e-02, 1.123e-01)); + r += mul(s3_4, M4(-4.418e-01, 5.566e-01, 6.313e-03, -4.863e-01, -4.189e-01, -1.606e-01, 2.613e-01, -4.014e-01, -4.206e-01, -4.682e-01, -3.779e-01, 5.871e-01, 2.516e-01, -5.022e-01, 2.759e-01, 1.313e-01)); + r += mul(s3_5, M4(-3.682e-02, -2.897e-01, 2.019e-01, 3.667e-03, -1.666e-01, 2.953e-02, -1.446e-01, -6.928e-02, -1.346e-01, -6.624e-02, -1.522e-02, 8.483e-01, 3.168e-01, 1.247e-01, -6.584e-02, -8.030e-02)); + r += mul(s3_6, M4(1.670e-01, -4.091e-02, 1.881e-01, 1.276e-01, -1.441e-01, 1.636e-01, -1.322e-01, 8.716e-02, 9.290e-02, 3.344e-01, 2.737e-01, -4.509e-01, -1.560e-01, 8.292e-02, -5.494e-02, 2.625e-02)); + r += mul(s3_7, M4(6.209e-02, -8.711e-01, -2.422e-02, -1.158e-02, 1.969e-01, -4.698e-01, -1.016e-01, -1.333e-01, 5.883e-01, -9.214e-02, 1.058e+00, 2.119e-01, 3.611e-01, 2.443e-01, 1.390e-01, 3.819e-01)); + r += mul(s3_8, M4(-1.502e-01, -5.064e-01, 8.467e-02, -2.262e-02, 2.649e-01, 1.169e-01, -5.726e-02, 1.341e-01, 2.349e-01, 7.791e-01, 6.799e-02, 7.027e-02, -5.221e-02, 1.357e-01, 1.382e-01, -3.748e-02)); + r += V4(-4.129e-03, -4.378e-02, 1.747e-02, 3.267e-02); + return r; +} + +V4 f1(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8) { + V4 r = 0.0; + r += mul(s0_0, M4(7.766e-02, 4.523e-03, -1.029e-01, 3.952e-02, 1.207e-01, -3.205e-02, -1.516e-01, -4.993e-02, -2.106e-01, 5.000e-01, 2.802e-01, -1.797e-01, 1.157e-02, 4.642e-01, -1.830e-01, 9.749e-03)); + r += mul(s0_1, M4(5.684e-02, -1.916e-01, 1.998e-02, 8.908e-02, -1.295e-01, 1.184e-01, 3.992e-02, -3.736e-01, 5.210e-01, -1.915e-01, -1.448e-02, -3.299e-01, 1.325e-01, 5.057e-01, 1.203e-01, 1.044e-01)); + r += mul(s0_2, M4(-7.759e-02, 1.978e-01, 2.185e-01, -1.370e-01, 5.627e-02, 3.739e-02, 1.866e-02, 4.120e-02, 1.212e-01, -2.967e-01, -4.022e-02, -1.058e-01, 9.193e-02, -6.720e-02, -8.270e-02, -3.294e-02)); + r += mul(s0_3, M4(-1.156e-01, -3.838e-01, -1.304e-01, 1.556e-01, 2.972e-01, -3.797e-02, -8.053e-02, 1.932e-01, -8.240e-01, 8.246e-01, 6.350e-01, -4.248e-01, 1.592e-03, -2.154e-01, 3.861e-01, -8.019e-02)); + r += mul(s0_4, M4(1.134e-01, 3.460e-01, -1.323e-01, 1.038e-01, 3.182e-01, 5.052e-02, -2.690e-01, 4.359e-01, -5.274e-01, -1.360e+00, 5.110e-01, -8.171e-01, -4.418e-02, 3.662e-01, -4.468e-01, -8.695e-02)); + r += mul(s0_5, M4(-5.947e-02, 6.545e-02, 7.860e-02, 1.032e-01, 3.691e-01, -1.867e-02, -6.669e-02, -1.166e-01, 4.599e-01, -6.066e-01, -1.696e+00, -7.313e-01, -2.449e-01, -8.068e-02, 1.883e-03, -1.603e-01)); + r += mul(s0_6, M4(1.844e-01, -8.927e-02, 2.002e-02, -4.609e-04, -2.650e-01, 7.654e-02, -1.074e-01, -6.939e-02, 3.150e-01, -2.191e-01, 4.955e-01, -1.906e-02, -1.020e-01, -4.901e-02, -1.017e-01, -2.561e-01)); + r += mul(s0_7, M4(-8.724e-02, -1.306e-01, 4.306e-02, -1.211e-01, -6.401e-02, -5.717e-02, 1.212e-01, 2.038e-01, -7.175e-02, -3.181e-01, 3.271e-01, 6.668e-02, -6.730e-02, 1.929e-01, 2.173e-01, 1.680e-01)); + r += mul(s0_8, M4(1.231e-02, 5.079e-02, 1.005e-01, 8.730e-02, 5.038e-02, 9.516e-02, 2.623e-01, 7.546e-02, -2.105e-02, 2.273e-02, -5.382e-02, 9.471e-02, 6.055e-02, 2.890e-02, 5.401e-02, 1.443e-02)); + r += mul(s1_0, M4(4.897e-01, 4.202e-01, -8.175e-01, 2.352e-01, -1.649e-01, 1.083e-01, 1.852e-01, 2.373e-02, 1.422e-02, -5.769e-02, -3.236e-02, -4.748e-02, 1.910e-01, -1.096e-01, 3.096e-02, 1.352e-01)); + r += mul(s1_1, M4(4.412e-01, -6.797e-01, -1.467e-01, -6.489e-01, -7.817e-03, 5.137e-03, 1.653e-01, 2.525e-01, 1.898e-01, -1.662e-02, -7.295e-03, 1.482e-01, 2.308e-01, -2.795e-01, -7.044e-02, -2.044e-01)); + r += mul(s1_2, M4(2.954e-01, 7.991e-03, -3.515e-02, 5.353e-01, 3.823e-01, 1.324e-01, -1.496e-01, 2.410e-01, 1.570e-01, -2.524e-02, -9.177e-02, 6.568e-02, 1.920e-01, 1.506e-02, -4.787e-02, -1.636e-01)); + r += mul(s1_3, M4(-2.704e-01, 3.949e-02, -1.541e-01, -3.039e-01, -5.590e-01, -4.014e-01, 3.342e-01, 6.506e-02, -1.872e-01, 1.954e-01, -1.813e-02, 5.556e-02, 8.577e-02, 1.206e-01, 9.298e-02, 4.025e-02)); + r += mul(s1_4, M4(-5.198e-01, 7.954e-01, -1.264e-01, -7.453e-01, -1.635e-01, -1.080e-01, 6.140e-01, -3.089e-01, -9.613e-02, -3.290e-01, 1.678e-01, -7.862e-02, 4.744e-02, -8.617e-02, -3.783e-01, -5.302e-02)); + r += mul(s1_5, M4(-3.316e-01, -9.648e-02, 3.075e-01, -8.622e-02, -2.702e-02, 2.573e-01, 4.803e-02, 2.886e-01, 1.101e-01, -5.590e-02, -2.187e-01, 4.012e-02, -6.776e-02, -2.531e-02, 1.187e-01, 1.914e-01)); + r += mul(s1_6, M4(1.292e-01, 7.338e-01, -1.035e+00, -3.613e-01, -1.081e-01, 5.978e-02, 1.108e-01, 1.432e-01, -7.837e-02, 7.895e-02, 1.205e-02, -5.820e-02, 9.230e-02, -2.629e-01, 1.338e-01, 1.457e-02)); + r += mul(s1_7, M4(1.799e-01, -2.778e-01, 2.910e-01, -3.160e-01, 1.320e-01, -2.639e-01, 1.126e-01, -4.365e-01, -1.801e-01, 4.184e-02, 1.418e-01, 1.234e-01, -1.337e-01, -8.716e-02, 6.319e-02, -4.482e-02)); + r += mul(s1_8, M4(-1.452e-01, 9.640e-02, 2.817e-01, 1.741e-01, -1.779e-01, 2.690e-02, 3.388e-02, 1.115e-02, -1.610e-01, -4.691e-02, -1.704e-01, -2.261e-01, 7.297e-02, 5.985e-02, 1.668e-01, 1.194e-02)); + r += mul(s2_0, M4(1.225e-01, -1.822e-01, -7.392e-02, 7.928e-02, -9.254e-02, 6.534e-03, 1.812e-01, 6.578e-02, 6.421e-02, -6.216e-02, -1.401e-01, -1.043e-01, -3.504e-01, -6.918e-02, 1.484e-01, 1.426e-01)); + r += mul(s2_1, M4(4.606e-02, -1.660e-02, -1.607e-01, -4.997e-02, 1.538e-01, 1.111e-02, 2.039e-01, -1.516e-02, -5.033e-02, -5.356e-02, 9.295e-02, -2.669e-01, -1.850e-01, 7.764e-02, 5.003e-02, -4.675e-02)); + r += mul(s2_2, M4(5.484e-02, 2.393e-02, 6.362e-03, 1.969e-01, 3.522e-01, -3.946e-02, -2.846e-01, 3.291e-01, 2.223e-01, 1.481e-01, -1.728e-03, 6.660e-02, -4.053e-02, -6.892e-02, 4.244e-02, 2.214e-01)); + r += mul(s2_3, M4(-3.490e-01, -9.302e-02, 2.349e-01, -2.202e-01, -4.376e-01, -1.789e-01, 1.899e-01, 5.442e-02, -1.084e-01, 3.997e-02, -1.352e-01, 1.549e-01, 8.160e-02, 2.716e-01, 2.301e-02, 1.718e-01)); + r += mul(s2_4, M4(3.561e-02, 5.771e-02, -6.185e-01, -7.735e-02, -4.608e-01, -4.666e-02, 6.230e-01, -1.867e-01, -4.888e-02, 1.459e-01, -2.126e-01, -1.254e-01, -3.141e-01, -7.960e-02, 2.873e-01, 2.510e-02)); + r += mul(s2_5, M4(1.481e-01, 1.674e-02, -1.207e-01, 2.081e-01, -1.548e-01, 1.376e-01, 4.633e-02, 2.706e-01, 2.653e-02, 8.545e-02, 1.186e-01, 1.113e-01, -5.347e-02, -7.582e-03, 1.496e-01, -1.793e-02)); + r += mul(s2_6, M4(-1.792e-01, 1.004e-01, 4.906e-02, -1.008e-01, 1.174e-01, -5.349e-02, 7.906e-02, 1.349e-01, -4.414e-02, -5.315e-02, -1.098e-03, 9.865e-02, 8.420e-02, -9.036e-02, -1.430e-01, -1.643e-01)); + r += mul(s2_7, M4(-4.867e-01, 1.544e-01, 4.995e-01, 8.678e-02, -1.243e-01, -9.942e-02, 3.613e-01, -2.650e-01, 8.803e-02, 6.569e-02, -1.275e-01, -6.514e-02, -2.140e-02, 2.578e-04, -6.209e-02, -1.538e-01)); + r += mul(s2_8, M4(-4.464e-01, 9.445e-02, -8.204e-02, -1.032e-01, 8.754e-04, 2.704e-02, 2.153e-02, 2.418e-02, 6.872e-02, -8.452e-02, -3.028e-02, 6.132e-02, 7.423e-02, -1.119e-01, -1.669e-02, 3.309e-02)); + r += mul(s3_0, M4(8.549e-02, 4.522e-02, 1.895e-02, -1.330e-01, 2.075e-01, -1.273e-01, -2.992e-02, -3.167e-02, -4.418e-01, -4.636e-01, -3.327e-01, 1.122e+00, -2.823e-01, -4.644e-01, 8.801e-02, 1.657e-01)); + r += mul(s3_1, M4(1.285e-01, -2.622e-02, -6.361e-02, -1.547e-01, 2.056e-01, 2.397e-01, -1.266e-03, -5.679e-01, 1.275e-01, -1.047e+00, 2.648e-01, 2.793e+00, -1.654e-01, 1.219e-01, 8.593e-02, -2.056e-01)); + r += mul(s3_2, M4(3.391e-02, 5.880e-02, -1.770e-03, 1.562e-01, -1.247e-04, 3.836e-03, -3.243e-02, -1.212e-01, -3.804e-01, -6.416e-01, 1.051e+00, 3.382e-01, -1.993e-01, 1.436e-01, 7.728e-02, -1.012e-01)); + r += mul(s3_3, M4(-1.693e-01, -2.344e-01, 1.774e-01, 8.301e-02, 1.180e-01, -2.529e-01, -1.157e-01, -1.074e-01, 4.684e-02, 1.431e-01, 3.555e-01, 9.063e-01, 3.541e-02, 1.555e-01, -2.294e-01, 3.541e-01)); + r += mul(s3_4, M4(6.790e-01, 2.978e-03, -5.333e-01, -7.826e-02, 4.578e-02, -7.635e-02, -6.772e-01, -2.766e-02, -5.894e-02, 4.245e-02, -7.763e-01, -1.412e+00, -1.240e-01, -3.159e-01, 4.795e-01, 2.910e-01)); + r += mul(s3_5, M4(1.609e-01, 4.055e-02, 1.846e-02, -3.977e-02, 2.659e-01, 1.511e-02, -2.099e-01, -4.121e-01, 4.071e-01, 4.634e-01, 2.884e-01, 9.777e-01, -1.012e-01, 5.495e-02, 1.572e-01, -3.293e-01)); + r += mul(s3_6, M4(-8.705e-02, -1.337e-01, -1.727e-01, -9.255e-02, 1.578e-02, -2.723e-02, -1.492e-01, -1.372e-01, -2.315e-01, 5.413e-01, 4.250e-01, 4.866e-01, -1.362e-01, -1.312e-01, -1.257e-01, 1.292e-01)); + r += mul(s3_7, M4(-1.415e-01, -5.995e-02, 1.151e-01, 1.606e-01, -3.936e-01, 2.124e-01, -9.745e-02, 3.440e-01, -5.216e-01, -3.266e-01, -5.189e-01, -7.262e-01, 1.290e-02, 9.216e-02, 1.121e-01, 1.337e-01)); + r += mul(s3_8, M4(2.335e-02, -4.137e-02, -2.396e-02, -4.996e-02, 2.455e-01, 8.565e-02, 2.153e-01, 6.100e-02, 6.328e-01, -8.356e-01, 1.118e-01, -2.496e-01, -3.962e-02, -7.803e-02, -1.017e-01, -1.817e-01)); + r += V4(-2.496e-02, -1.212e-01, -1.419e-02, 2.482e-02); + return r; +} + +void Pass2(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = Rmp8x8(tid.x) + blockStart; + uint2 size = GetInputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = (gxy + 0.5) * pt; + + V4 s0_0 = l0(-1.0, -1.0); + V4 s0_1 = l0(0.0, -1.0); + V4 s0_2 = l0(1.0, -1.0); + V4 s0_3 = l0(-1.0, 0.0); + V4 s0_4 = l0(0.0, 0.0); + V4 s0_5 = l0(1.0, 0.0); + V4 s0_6 = l0(-1.0, 1.0); + V4 s0_7 = l0(0.0, 1.0); + V4 s0_8 = l0(1.0, 1.0); + V4 s1_0 = -max(-s0_0, 0.0); + V4 s1_1 = -max(-s0_1, 0.0); + V4 s1_2 = -max(-s0_2, 0.0); + V4 s1_3 = -max(-s0_3, 0.0); + V4 s1_4 = -max(-s0_4, 0.0); + V4 s1_5 = -max(-s0_5, 0.0); + V4 s1_6 = -max(-s0_6, 0.0); + V4 s1_7 = -max(-s0_7, 0.0); + V4 s1_8 = -max(-s0_8, 0.0); + s0_0 = max(s0_0, 0.0); + s0_1 = max(s0_1, 0.0); + s0_2 = max(s0_2, 0.0); + s0_3 = max(s0_3, 0.0); + s0_4 = max(s0_4, 0.0); + s0_5 = max(s0_5, 0.0); + s0_6 = max(s0_6, 0.0); + s0_7 = max(s0_7, 0.0); + s0_8 = max(s0_8, 0.0); + + V4 s2_0 = l1(-1.0, -1.0); + V4 s2_1 = l1(0.0, -1.0); + V4 s2_2 = l1(1.0, -1.0); + V4 s2_3 = l1(-1.0, 0.0); + V4 s2_4 = l1(0.0, 0.0); + V4 s2_5 = l1(1.0, 0.0); + V4 s2_6 = l1(-1.0, 1.0); + V4 s2_7 = l1(0.0, 1.0); + V4 s2_8 = l1(1.0, 1.0); + V4 s3_0 = -max(-s2_0, 0.0); + V4 s3_1 = -max(-s2_1, 0.0); + V4 s3_2 = -max(-s2_2, 0.0); + V4 s3_3 = -max(-s2_3, 0.0); + V4 s3_4 = -max(-s2_4, 0.0); + V4 s3_5 = -max(-s2_5, 0.0); + V4 s3_6 = -max(-s2_6, 0.0); + V4 s3_7 = -max(-s2_7, 0.0); + V4 s3_8 = -max(-s2_8, 0.0); + s2_0 = max(s2_0, 0.0); + s2_1 = max(s2_1, 0.0); + s2_2 = max(s2_2, 0.0); + s2_3 = max(s2_3, 0.0); + s2_4 = max(s2_4, 0.0); + s2_5 = max(s2_5, 0.0); + s2_6 = max(s2_6, 0.0); + s2_7 = max(s2_7, 0.0); + s2_8 = max(s2_8, 0.0); + + t2[gxy] = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8); + t3[gxy] = f1(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8); +} + +//!PASS 3 +//!DESC conv2 +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 +//!IN t2, t3 +//!OUT t0, t1 + +#define l0(x, y) V4(O(t2, float2(x, y))) +#define l1(x, y) V4(O(t3, float2(x, y))) + +V4 f0(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8) { + V4 r = 0.0; + r += mul(s0_0, M4(3.773e-02, -4.916e-02, 1.204e-01, -2.493e-02, 6.937e-01, 2.135e-01, 1.818e-01, -3.537e-01, 1.529e-01, 6.021e-02, 1.170e-01, -1.189e-01, 1.189e-01, -9.206e-03, 1.108e-01, 3.896e-02)); + r += mul(s0_1, M4(-1.620e-01, -1.064e-01, -2.412e-01, -2.743e-01, 2.700e-01, 2.419e-01, -6.450e-02, -2.533e-01, -3.513e-01, -1.194e-01, -3.858e-01, -6.738e-01, -1.275e-03, 1.531e-02, -6.212e-02, 6.180e-02)); + r += mul(s0_2, M4(-1.407e-01, -2.679e-01, -1.344e-01, 6.411e-02, -1.541e-01, 1.592e-01, 7.251e-02, 2.381e-02, 2.503e-01, 1.899e-01, 1.577e-02, 1.255e-01, -6.473e-02, -1.242e-01, -2.175e-03, 4.059e-02)); + r += mul(s0_3, M4(-1.168e-01, 7.074e-03, -6.052e-02, -8.601e-02, -1.645e-01, 5.184e-02, 1.711e-01, 2.114e-01, 5.484e-02, -3.865e-02, 6.780e-02, 1.577e-02, -2.114e-02, 8.978e-02, 3.936e-02, 1.152e-01)); + r += mul(s0_4, M4(4.902e-01, 1.460e-01, 1.333e-01, 1.720e-01, -8.563e-02, -3.756e-01, -2.379e-01, 5.975e-02, 2.295e-01, -1.261e-01, 6.562e-02, -4.971e-01, 7.983e-02, 1.276e-01, -4.241e-02, -1.105e-01)); + r += mul(s0_5, M4(3.213e-01, -5.127e-01, -9.751e-02, -8.480e-02, 9.720e-02, 6.087e-02, 5.854e-02, -1.636e-01, -4.187e-02, 1.622e-01, 1.296e-01, 1.646e-01, -2.426e-01, -7.077e-02, -7.194e-02, -1.413e-02)); + r += mul(s0_6, M4(5.106e-02, 1.813e-02, -1.207e-01, 1.479e-01, 7.105e-02, -1.572e-02, 2.355e-01, 3.700e-02, -2.041e-01, 1.066e-01, -1.663e-02, 5.370e-02, -1.855e-01, 2.424e-03, -1.153e-02, 3.895e-02)); + r += mul(s0_7, M4(3.740e-02, 2.510e-01, 4.747e-02, -1.610e-02, -1.276e-01, 1.675e-02, -1.122e-01, -7.178e-02, -3.253e-01, -1.639e-01, -1.312e-01, 6.179e-02, 1.135e-01, 2.657e-02, -1.152e-01, -9.269e-02)); + r += mul(s0_8, M4(-3.307e-02, 1.119e-01, -1.452e-02, 1.724e-01, -5.484e-02, 2.508e-03, -3.591e-02, 6.865e-02, 1.889e-01, 1.723e-01, 1.635e-01, 1.258e-01, 1.857e-02, 1.273e-01, 1.566e-01, -1.652e-02)); + r += mul(s1_0, M4(-2.277e-01, -1.423e-01, 1.949e-01, 4.971e-02, -3.095e-01, -7.076e-02, -1.716e-01, -3.408e-01, 1.357e-01, 1.048e-01, -3.445e-02, -6.842e-02, 2.769e-01, 1.989e-02, 8.616e-02, 2.153e-01)); + r += mul(s1_1, M4(-2.882e-01, -3.427e-01, 9.095e-02, 7.691e-01, 1.701e-01, 3.928e-01, -3.796e-01, -4.772e-01, 2.376e-01, 1.403e-01, 1.900e-01, 4.017e-02, 1.762e-01, 7.482e-02, -3.929e-03, 2.218e-03)); + r += mul(s1_2, M4(-2.240e-01, -3.791e-01, 4.275e-02, 1.327e-01, -1.085e-01, 2.639e-02, 1.546e-01, -2.289e-02, -6.099e-01, -1.290e-01, -1.267e-01, 5.642e-02, -1.649e-01, -2.882e-01, 1.917e-02, 1.338e-01)); + r += mul(s1_3, M4(2.616e-01, 8.183e-03, -1.014e-02, -1.328e-01, 3.280e-01, 1.409e-01, -3.935e-01, -5.285e-02, -1.023e-02, -7.158e-02, 4.159e-03, -4.778e-02, -5.562e-01, 3.113e-02, 4.077e-02, -2.240e-01)); + r += mul(s1_4, M4(4.202e-02, 9.718e-02, -9.851e-02, -7.479e-01, 3.624e-02, -4.618e-01, -2.312e-01, 1.559e-01, -6.908e-01, 1.833e-01, -2.083e-01, 6.335e-02, -2.836e-02, 2.194e-01, 1.387e-01, -2.445e-01)); + r += mul(s1_5, M4(1.029e-01, -3.759e-01, 2.112e-02, -3.595e-02, 4.997e-03, -8.256e-02, 1.003e-01, -1.616e-01, 2.521e-01, 7.646e-02, -1.807e-01, 8.995e-02, -4.928e-01, -4.602e-02, -1.609e-01, 8.111e-02)); + r += mul(s1_6, M4(2.841e-01, 7.997e-02, -1.299e-01, -3.545e-02, -3.290e-02, 4.075e-04, 1.653e-01, 3.074e-02, 6.276e-02, 5.983e-02, -3.728e-02, -6.306e-02, -1.742e-01, -1.482e-01, -3.579e-01, 6.636e-02)); + r += mul(s1_7, M4(1.981e-01, 1.679e-01, -6.883e-02, -2.588e-01, -2.647e-01, 8.313e-02, -5.174e-02, 1.209e-01, -2.284e-01, -1.392e-01, -1.328e-01, 3.198e-02, 1.279e-01, -4.582e-02, -2.727e-01, 6.927e-02)); + r += mul(s1_8, M4(1.525e-01, -2.406e-01, 8.315e-02, 7.265e-03, -2.063e-03, -9.131e-02, 1.110e-03, 3.074e-02, 1.791e-01, 5.909e-02, -8.521e-02, -6.441e-02, 2.074e-01, 7.446e-02, 1.452e-01, 7.400e-02)); + r += mul(s2_0, M4(1.997e-02, 2.843e-01, 8.649e-02, 9.571e-02, -1.781e-01, -9.968e-03, -2.890e-02, -7.883e-02, 2.019e-02, -1.216e-02, 1.812e-01, 2.368e-01, 6.113e-02, 3.176e-02, 7.946e-02, 1.075e-01)); + r += mul(s2_1, M4(1.032e-01, -5.896e-01, 1.941e-01, 3.837e-01, 1.188e-01, 8.780e-02, 3.861e-02, -1.744e-01, 4.878e-02, -7.646e-02, 2.619e-01, 1.448e-01, 5.215e-02, 4.933e-02, -6.758e-02, 8.912e-02)); + r += mul(s2_2, M4(-2.291e-01, -1.530e-01, 1.102e-01, 5.480e-02, 4.077e-01, -8.378e-03, -7.649e-02, -6.372e-02, 2.670e-01, 1.017e-01, 2.667e-01, -8.936e-03, -1.644e-02, -4.544e-02, -6.324e-02, -5.411e-02)); + r += mul(s2_3, M4(-1.113e-01, 7.794e-02, -2.500e-01, 2.054e-01, 7.857e-02, 3.525e-02, -6.270e-02, 1.187e-01, 1.222e-01, 3.236e-02, -2.597e-01, -1.654e-01, 2.588e-02, -2.900e-01, -8.871e-02, -1.734e-02)); + r += mul(s2_4, M4(7.606e-01, -5.853e-01, 1.359e-01, -1.206e-01, -2.826e-01, 2.765e-01, 2.347e-01, 3.174e-01, -2.738e-01, -6.352e-02, 1.287e-01, -2.197e-01, -4.855e-01, -1.005e-02, -1.929e-01, -3.095e-02)); + r += mul(s2_5, M4(2.727e-01, -2.414e-01, 1.192e-01, -2.436e-01, 1.855e-01, -9.626e-02, -1.515e-01, 1.784e-01, -1.328e-02, 3.473e-03, 1.846e-01, -1.311e-01, 2.775e-01, 1.262e-01, 8.677e-03, 5.321e-02)); + r += mul(s2_6, M4(3.195e-01, 1.377e-02, -1.920e-01, -9.662e-02, 2.030e-01, 1.059e-02, -1.692e-01, -1.024e-02, -3.002e-02, -7.144e-03, -1.783e-01, -5.337e-02, 1.894e-01, 5.339e-02, 2.365e-02, -9.065e-02)); + r += mul(s2_7, M4(-3.501e-01, 1.304e-01, -3.536e-01, -7.251e-02, 3.473e-02, 9.994e-02, -2.137e-01, -1.372e-01, -1.165e-02, -6.450e-02, -3.175e-01, -6.435e-02, 1.299e-01, -1.793e-01, 1.847e-01, -5.373e-02)); + r += mul(s2_8, M4(2.007e-01, -2.978e-01, 2.092e-01, -1.322e-01, -6.292e-02, 3.227e-01, -3.444e-01, 7.335e-02, 4.040e-03, -5.816e-02, -1.870e-03, -2.017e-02, -1.157e-01, 1.134e-01, -3.315e-02, 4.837e-02)); + r += mul(s3_0, M4(5.560e-02, 2.772e-02, 8.952e-02, 7.943e-02, -1.587e-01, 1.216e-02, 3.493e-03, 3.803e-02, 2.253e-01, 1.839e-01, 4.247e-02, 1.694e-01, -4.995e-02, 3.428e-01, -1.507e-01, 3.553e-01)); + r += mul(s3_1, M4(1.367e-02, -1.897e-01, -9.217e-02, 8.214e-03, 1.802e-01, 7.154e-02, -6.387e-02, 1.552e-02, -3.173e-01, -1.991e-01, 2.504e-01, 5.033e-01, -3.434e-01, 2.710e-03, 7.297e-02, 5.751e-01)); + r += mul(s3_2, M4(-1.310e-02, 2.518e-01, -8.101e-03, -5.719e-02, 1.436e-01, -1.783e-01, -6.461e-02, -4.487e-02, 4.401e-02, -1.240e-02, 1.103e-01, 2.310e-01, 4.486e-02, 5.592e-02, -6.506e-02, -1.333e-01)); + r += mul(s3_3, M4(9.502e-02, 5.695e-02, -1.551e-01, 1.754e-02, 2.585e-02, 3.478e-02, -1.198e-01, 1.182e-01, -1.117e-01, 1.009e-01, -2.105e-01, 1.057e-01, 2.102e-01, 1.993e-01, -3.809e-02, -8.390e-02)); + r += mul(s3_4, M4(-3.507e-01, -2.784e-01, -2.989e-02, -2.785e-01, 4.284e-02, -1.155e-01, 1.934e-01, -1.492e-01, 5.998e-01, -1.442e-01, -9.265e-02, -1.053e-01, -2.690e-01, -2.468e-01, -2.995e-01, -3.690e-02)); + r += mul(s3_5, M4(5.049e-02, 1.616e-01, 1.367e-01, -2.065e-03, -9.968e-02, -1.378e-01, -1.028e-02, 1.187e-01, -6.145e-02, -3.774e-02, 8.126e-02, -3.003e-01, 4.898e-01, -1.995e-01, -1.431e-01, -2.276e-03)); + r += mul(s3_6, M4(4.055e-01, 1.422e-01, -1.436e-01, 3.012e-02, -6.197e-02, 7.033e-02, 4.149e-02, 8.287e-02, -1.137e-01, -1.588e-01, -5.402e-02, 2.393e-02, 2.222e-01, 1.236e-01, 4.226e-02, 2.098e-01)); + r += mul(s3_7, M4(2.309e-02, -9.689e-02, -8.908e-02, -2.339e-01, 1.829e-01, -8.781e-02, 1.132e-01, -3.135e-01, -2.134e-01, 9.304e-02, -2.253e-01, -9.650e-02, -2.415e-03, -1.840e-01, 1.981e-01, -1.488e-01)); + r += mul(s3_8, M4(-1.466e-01, 1.364e-01, 1.174e-01, 5.666e-02, -1.027e-01, 1.929e-01, 8.108e-02, 5.678e-02, -1.460e-01, 8.134e-02, -1.315e-01, 6.725e-02, 1.327e-01, 1.911e-01, -2.188e-01, 7.731e-02)); + r += V4(2.298e-02, -1.923e-02, -2.658e-02, 1.368e-03); + return r; +} + +V4 f1(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-1.130e-01, 1.214e-01, -1.108e-02, 1.352e-01, 6.377e-02, -1.713e-01, 1.967e-02, -1.919e-01, 1.150e-02, -9.545e-04, 1.293e-01, 6.316e-02, 1.290e-02, -8.948e-02, 6.572e-02, 1.822e-02)); + r += mul(s0_1, M4(2.092e-01, 2.239e-01, -8.298e-02, 2.838e-01, -2.186e-01, 2.432e-01, -1.698e-01, 1.926e-01, -4.677e-01, -1.034e-02, -1.518e-01, 1.623e-02, -1.795e-02, 5.413e-02, -5.460e-02, 2.335e-02)); + r += mul(s0_2, M4(2.608e-01, 1.430e-01, -1.394e-02, 7.100e-02, 6.597e-02, 8.825e-02, 7.601e-02, -1.882e-02, -1.082e-01, 7.205e-02, 1.003e-01, -1.760e-01, 2.237e-01, -9.588e-02, -1.699e-02, 4.950e-02)); + r += mul(s0_3, M4(-1.373e-01, -1.715e-01, -1.798e-01, 7.263e-02, 1.256e-02, -2.401e-01, -1.070e-01, -1.565e-01, 1.507e-01, 1.169e-01, 4.934e-02, 1.995e-02, -8.259e-02, 2.094e-01, -6.138e-02, -7.254e-02)); + r += mul(s0_4, M4(-2.767e-01, -4.899e-01, -7.727e-01, -1.497e-01, -3.017e-03, -3.284e-02, 2.596e-01, -4.209e-01, -1.953e-01, 1.452e-01, 7.560e-03, -3.027e-01, -1.194e-01, 1.329e-01, -1.687e-01, 1.195e-01)); + r += mul(s0_5, M4(-1.280e-01, -3.473e-01, -9.935e-02, -1.362e-01, 7.692e-02, 1.451e-01, 1.568e-02, 6.818e-02, 6.812e-02, -3.212e-01, -6.089e-03, -2.132e-01, -1.721e-01, -1.182e-01, -5.266e-02, -1.555e-01)); + r += mul(s0_6, M4(-3.717e-02, -4.738e-02, -2.076e-01, 4.773e-02, -8.280e-02, -9.293e-02, -6.792e-02, -8.102e-02, 7.954e-02, 2.675e-02, 1.215e-02, 3.023e-02, -7.328e-03, -7.478e-02, 7.216e-02, 2.117e-01)); + r += mul(s0_7, M4(-1.612e-01, -3.211e-01, -2.805e-01, -5.244e-01, -5.702e-02, -6.611e-03, -5.634e-02, 1.504e-01, 1.134e-01, -6.816e-02, -3.059e-02, 2.929e-02, 8.199e-02, -1.340e-01, -5.846e-02, -1.619e-01)); + r += mul(s0_8, M4(-6.973e-02, -5.321e-01, 1.599e-02, -6.657e-02, 5.820e-02, 3.689e-02, 3.444e-02, -6.053e-02, 2.894e-02, -9.890e-02, 9.278e-02, -1.179e-01, -5.478e-02, -1.127e-01, -8.066e-03, 9.613e-03)); + r += mul(s1_0, M4(-4.428e-02, 6.076e-02, -4.348e-02, 9.205e-02, -3.087e-02, -2.955e-02, -1.082e-01, -1.677e-01, 6.964e-02, -6.678e-02, 1.186e-02, 4.676e-02, 1.122e-01, 2.608e-02, -7.710e-02, 1.314e-02)); + r += mul(s1_1, M4(3.823e-02, 9.601e-02, -3.015e-02, 1.601e-01, -3.331e-01, 4.881e-02, 1.877e-01, 4.381e-02, -4.786e-02, -6.752e-02, -1.870e-01, -1.172e-01, 3.151e-01, -1.060e-01, -2.141e-01, 1.811e-02)); + r += mul(s1_2, M4(1.288e-01, 7.224e-02, 1.647e-01, 9.426e-02, -1.369e-01, -3.410e-02, 2.160e-02, -2.060e-02, 1.585e-01, 1.380e-01, -1.537e-01, 1.532e-01, 2.734e-01, 4.569e-03, -7.428e-02, 4.233e-02)); + r += mul(s1_3, M4(1.178e-01, -2.371e-02, 1.479e-01, -2.215e-01, 1.109e-01, -1.197e-01, -1.628e-01, -4.200e-01, -1.274e-01, -3.016e-02, -2.777e-02, -7.318e-02, 1.257e-01, 3.237e-01, 2.290e-01, 1.030e-01)); + r += mul(s1_4, M4(4.789e-01, 4.644e-02, -1.997e-01, -7.073e-01, 4.108e-02, -2.901e-01, 3.818e-01, -4.996e-01, -1.879e-01, 5.111e-02, -1.602e-01, 4.706e-02, -7.003e-01, -1.329e-01, -9.032e-01, 1.350e-01)); + r += mul(s1_5, M4(4.773e-01, 1.039e-01, 8.412e-02, 1.490e-01, 3.035e-02, 1.400e-01, -6.338e-02, 8.991e-02, 4.904e-01, 3.650e-01, -3.968e-02, 3.972e-01, -2.319e-01, -4.904e-02, -5.767e-01, -2.348e-02)); + r += mul(s1_6, M4(-7.230e-02, 6.087e-02, -2.064e-02, -6.899e-03, -1.217e-01, -1.687e-01, -1.857e-01, -1.239e-01, -6.371e-02, 6.974e-02, 1.337e-02, 8.767e-02, 2.289e-01, 4.729e-01, 9.679e-02, 1.118e-01)); + r += mul(s1_7, M4(-5.391e-02, 4.743e-02, -4.716e-02, 1.767e-01, -4.998e-02, -2.546e-01, 8.780e-02, 4.767e-02, -7.362e-03, -6.664e-02, 1.749e-01, 7.709e-02, -2.150e-01, -8.501e-02, -3.625e-01, -1.570e-01)); + r += mul(s1_8, M4(1.795e-01, -1.680e-01, 5.013e-02, 8.052e-02, 4.902e-02, 8.731e-03, 1.408e-02, 3.582e-02, -8.009e-02, 3.017e-02, -2.784e-02, 8.367e-02, 1.287e-01, 8.771e-02, -3.202e-02, 2.532e-02)); + r += mul(s2_0, M4(-1.419e-02, -1.381e-01, 1.070e-02, 1.267e-01, 5.872e-02, 8.846e-02, 1.327e-01, 3.797e-02, -9.500e-02, -4.932e-02, -1.433e-02, -5.332e-02, -9.478e-02, -4.424e-02, 1.445e-02, 1.336e-01)); + r += mul(s2_1, M4(-2.619e-01, 2.202e-01, 8.033e-02, 3.468e-01, 3.048e-01, -1.002e-02, -1.701e-01, -6.405e-02, 3.158e-02, -1.062e-01, 1.464e-01, 1.837e-01, 7.958e-02, 5.367e-03, -9.772e-02, 5.937e-02)); + r += mul(s2_2, M4(4.148e-01, -9.892e-02, -1.164e-01, 9.342e-02, -2.268e-01, 3.121e-02, -1.576e-01, -4.941e-02, -3.639e-01, -6.088e-02, -2.668e-02, -3.922e-02, 2.593e-02, 9.331e-02, 8.824e-02, 6.521e-03)); + r += mul(s2_3, M4(-2.006e-01, -6.678e-02, 3.283e-01, 4.849e-01, 1.016e-01, -1.125e-01, -1.296e-01, -1.680e-01, 2.772e-01, 1.909e-01, 3.458e-01, -1.367e-01, 5.993e-02, 2.428e-01, 1.871e-02, -1.480e-01)); + r += mul(s2_4, M4(-1.486e-02, 3.916e-01, 1.216e-01, -4.918e-01, -5.480e-02, 1.275e-01, -1.182e-01, 5.374e-01, -6.052e-02, 3.231e-01, 3.526e-02, -1.833e-01, -6.420e-02, -1.273e-03, -1.800e-01, 7.652e-02)); + r += mul(s2_5, M4(-2.349e-01, 7.653e-02, 8.108e-02, 1.898e-01, -1.317e-01, -2.513e-01, -2.790e-02, -3.601e-02, 2.290e-01, -1.461e-01, 8.279e-02, 1.899e-01, -4.883e-02, 8.442e-02, -5.347e-02, -4.900e-02)); + r += mul(s2_6, M4(-3.134e-01, 8.996e-02, 3.181e-02, -1.457e-01, -9.578e-02, 1.116e-01, -6.355e-02, -1.488e-01, -2.890e-02, 2.076e-02, 6.027e-02, 1.788e-02, 1.403e-01, 8.653e-02, 1.352e-01, -6.965e-02)); + r += mul(s2_7, M4(2.188e-01, 2.762e-01, 8.939e-02, 2.626e-01, 2.829e-01, 1.395e-02, -2.333e-02, -3.416e-02, 1.208e-02, 5.859e-02, 2.510e-01, 3.831e-01, -1.118e-01, -6.555e-03, -4.403e-02, -4.370e-02)); + r += mul(s2_8, M4(1.361e-02, 1.759e-01, -6.858e-02, 1.548e-01, -9.035e-03, -1.969e-01, -1.406e-01, 4.979e-02, 1.587e-02, -1.111e-01, -1.971e-02, 3.073e-02, 5.107e-02, 1.063e-02, -1.163e-02, 4.328e-02)); + r += mul(s3_0, M4(-3.105e-02, -3.297e-03, -1.346e-02, 3.279e-02, -6.446e-02, -8.300e-03, 1.195e-02, 1.704e-02, -2.825e-02, -7.198e-02, -1.241e-01, -5.453e-03, -1.010e-01, -2.661e-01, -1.093e-01, -4.753e-01)); + r += mul(s3_1, M4(6.416e-02, 3.290e-03, -6.664e-02, 3.536e-02, 1.340e-01, 6.209e-02, 1.751e-02, 3.663e-02, 1.215e-01, 2.067e-01, 2.157e-02, 2.474e-01, 8.811e-02, 3.345e-01, -1.319e-01, 4.883e-01)); + r += mul(s3_2, M4(-2.049e-01, 3.166e-02, 2.001e-02, 1.423e-04, 6.755e-02, 2.682e-02, -1.911e-02, 5.750e-02, 2.807e-02, -8.508e-02, 9.625e-03, -4.121e-02, 5.264e-01, -1.940e-01, 1.523e-02, 1.072e-01)); + r += mul(s3_3, M4(-3.709e-02, -2.069e-02, 2.408e-01, 2.808e-02, 3.065e-02, -1.316e-01, -4.231e-02, -9.350e-02, 8.105e-02, -1.048e-01, 1.708e-01, -8.174e-02, 3.743e-01, -3.742e-02, 2.901e-01, 7.091e-01)); + r += mul(s3_4, M4(-1.409e-01, -2.233e-02, 2.452e-02, -2.700e-01, -2.514e-01, 1.795e-01, 1.342e-01, 7.064e-01, -3.364e-01, 1.200e-01, -4.678e-01, -1.900e-01, -5.496e-01, 2.325e-01, -2.933e-02, 6.220e-01)); + r += mul(s3_5, M4(-1.505e-01, 1.194e-01, -1.962e-02, 8.578e-02, -1.999e-01, -1.274e-01, -1.435e-01, -2.373e-01, 3.485e-01, -1.336e-01, 2.627e-01, 1.902e-02, -4.103e-01, -2.210e-01, 4.443e-01, -5.294e-01)); + r += mul(s3_6, M4(1.998e-01, 6.277e-02, -3.951e-02, 5.659e-02, -1.930e-02, -4.212e-02, -5.306e-02, -1.381e-01, -1.701e-01, 1.967e-01, 1.383e-02, -2.463e-01, 2.810e-01, 2.186e-01, 2.522e-01, -5.045e-01)); + r += mul(s3_7, M4(2.436e-01, 1.870e-01, 8.677e-03, -4.233e-02, 4.271e-01, 2.146e-01, 8.672e-02, -2.921e-01, 1.262e-03, -2.255e-01, 9.194e-03, 1.431e-01, 4.044e-02, 4.419e-01, -1.759e-01, 1.003e-01)); + r += mul(s3_8, M4(-3.728e-02, -2.172e-01, -1.118e-01, 7.946e-02, -4.604e-02, 2.679e-02, 2.423e-02, -5.371e-03, 1.024e-01, -7.889e-02, -3.896e-02, -8.837e-03, 9.574e-02, -3.400e-01, 1.938e-01, -4.385e-01)); + r += V4(2.654e-02, 3.773e-02, -2.198e-02, -1.098e-02); + return r; +} + +void Pass3(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = Rmp8x8(tid.x) + blockStart; + uint2 size = GetInputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = (gxy + 0.5) * pt; + + V4 s0_0 = l0(-1.0, -1.0); + V4 s0_1 = l0(0.0, -1.0); + V4 s0_2 = l0(1.0, -1.0); + V4 s0_3 = l0(-1.0, 0.0); + V4 s0_4 = l0(0.0, 0.0); + V4 s0_5 = l0(1.0, 0.0); + V4 s0_6 = l0(-1.0, 1.0); + V4 s0_7 = l0(0.0, 1.0); + V4 s0_8 = l0(1.0, 1.0); + V4 s1_0 = -max(-s0_0, 0.0); + V4 s1_1 = -max(-s0_1, 0.0); + V4 s1_2 = -max(-s0_2, 0.0); + V4 s1_3 = -max(-s0_3, 0.0); + V4 s1_4 = -max(-s0_4, 0.0); + V4 s1_5 = -max(-s0_5, 0.0); + V4 s1_6 = -max(-s0_6, 0.0); + V4 s1_7 = -max(-s0_7, 0.0); + V4 s1_8 = -max(-s0_8, 0.0); + s0_0 = max(s0_0, 0.0); + s0_1 = max(s0_1, 0.0); + s0_2 = max(s0_2, 0.0); + s0_3 = max(s0_3, 0.0); + s0_4 = max(s0_4, 0.0); + s0_5 = max(s0_5, 0.0); + s0_6 = max(s0_6, 0.0); + s0_7 = max(s0_7, 0.0); + s0_8 = max(s0_8, 0.0); + + V4 s2_0 = l1(-1.0, -1.0); + V4 s2_1 = l1(0.0, -1.0); + V4 s2_2 = l1(1.0, -1.0); + V4 s2_3 = l1(-1.0, 0.0); + V4 s2_4 = l1(0.0, 0.0); + V4 s2_5 = l1(1.0, 0.0); + V4 s2_6 = l1(-1.0, 1.0); + V4 s2_7 = l1(0.0, 1.0); + V4 s2_8 = l1(1.0, 1.0); + V4 s3_0 = -max(-s2_0, 0.0); + V4 s3_1 = -max(-s2_1, 0.0); + V4 s3_2 = -max(-s2_2, 0.0); + V4 s3_3 = -max(-s2_3, 0.0); + V4 s3_4 = -max(-s2_4, 0.0); + V4 s3_5 = -max(-s2_5, 0.0); + V4 s3_6 = -max(-s2_6, 0.0); + V4 s3_7 = -max(-s2_7, 0.0); + V4 s3_8 = -max(-s2_8, 0.0); + s2_0 = max(s2_0, 0.0); + s2_1 = max(s2_1, 0.0); + s2_2 = max(s2_2, 0.0); + s2_3 = max(s2_3, 0.0); + s2_4 = max(s2_4, 0.0); + s2_5 = max(s2_5, 0.0); + s2_6 = max(s2_6, 0.0); + s2_7 = max(s2_7, 0.0); + s2_8 = max(s2_8, 0.0); + + t0[gxy] = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8); + t1[gxy] = f1(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8); +} + +//!PASS 4 +//!DESC conv3 +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 +//!IN t0, t1 +//!OUT t2, t3 + +#define l0(x, y) V4(O(t0, float2(x, y))) +#define l1(x, y) V4(O(t1, float2(x, y))) + +V4 f0(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-9.930e-02, -8.715e-02, -9.548e-02, -1.855e-02, 1.095e-01, 2.065e-01, 1.197e-01, -1.570e-02, 1.574e-01, 1.091e-01, -6.599e-02, 4.981e-03, -1.202e-02, -1.267e-02, -3.307e-02, -4.164e-02)); + r += mul(s0_1, M4(-5.548e-02, -8.579e-02, -1.219e-01, -2.839e-03, 8.177e-02, 3.298e-02, 2.258e-02, -9.106e-02, 1.195e-01, -8.941e-03, 2.294e-02, 3.104e-02, 5.574e-02, 9.188e-02, 3.466e-02, -3.615e-02)); + r += mul(s0_2, M4(-6.549e-02, -9.322e-02, 1.286e-02, -6.585e-03, -9.047e-02, -4.453e-02, -4.657e-02, 4.226e-02, 1.639e-01, 2.342e-01, -1.120e-02, -4.821e-02, -1.004e-01, -2.352e-03, -2.815e-02, 3.063e-02)); + r += mul(s0_3, M4(2.220e-02, 5.185e-03, 1.132e-01, 1.700e-01, 1.671e-01, -1.331e-03, -4.262e-02, -5.368e-01, -2.847e-01, -6.449e-02, -1.573e-01, -1.291e-01, 1.065e-01, -3.527e-02, 2.175e-02, -9.759e-02)); + r += mul(s0_4, M4(-6.274e-02, 5.046e-02, -7.344e-02, -1.713e-02, 3.599e-02, -1.940e-01, 4.244e-02, 5.161e-02, -2.285e-01, 2.347e-01, -1.516e-01, 4.668e-02, 5.899e-02, 4.766e-01, 2.878e-02, -1.491e-01)); + r += mul(s0_5, M4(1.430e-02, -1.483e-01, 1.337e-01, 5.809e-02, -1.794e-02, 3.310e-02, -6.586e-02, -2.245e-02, 4.123e-01, -5.310e-02, 2.135e-01, 1.468e-02, -2.746e-01, 6.546e-02, -2.512e-01, 6.142e-02)); + r += mul(s0_6, M4(4.337e-02, -2.250e-02, 1.685e-01, 5.046e-02, -4.996e-01, -8.999e-02, -3.918e-01, -1.998e-02, -5.723e-02, -1.890e-01, -7.521e-02, -1.420e-02, 2.147e-01, -7.020e-02, -1.031e-01, 7.691e-02)); + r += mul(s0_7, M4(6.315e-04, -9.858e-02, -1.540e-01, 2.171e-02, 3.620e-01, -1.191e-01, 1.217e-01, 8.591e-02, 2.791e-02, 9.235e-02, -2.327e-02, -9.034e-03, 2.280e-01, 4.347e-01, -3.150e-01, 8.650e-02)); + r += mul(s0_8, M4(-2.714e-02, -2.215e-01, 1.516e-01, -3.802e-02, -1.612e-02, -5.077e-02, -1.311e-01, 2.074e-02, 2.457e-02, 7.442e-02, 1.970e-03, 1.698e-02, -2.027e-01, 6.232e-02, -2.108e-01, -1.618e-02)); + r += mul(s1_0, M4(1.029e-01, 5.622e-02, -1.224e-01, 6.814e-02, 1.126e-01, 1.469e-01, 3.430e-02, -2.006e-02, 9.965e-03, 1.500e-01, 3.369e-01, 4.728e-02, -1.169e-01, 7.054e-02, -3.382e-02, 3.463e-02)); + r += mul(s1_1, M4(1.890e-04, 2.958e-01, -9.510e-02, 6.847e-02, 1.335e-01, 1.174e-01, -4.600e-02, -1.080e-01, 1.446e-01, 1.380e-01, -1.213e-03, 5.221e-02, -7.797e-03, -7.192e-02, -2.139e-02, -1.013e-01)); + r += mul(s1_2, M4(-1.966e-02, -7.701e-02, -1.022e-01, -2.180e-02, -1.363e-02, -4.144e-02, -1.094e-01, 1.956e-02, 4.011e-02, -1.149e-01, 9.707e-02, -5.067e-02, -1.240e-01, -4.850e-02, 5.535e-04, -7.421e-02)); + r += mul(s1_3, M4(-1.511e-01, 2.479e-01, -2.632e-02, 2.342e-01, 1.382e-01, 2.093e-01, -2.834e-01, -4.066e-01, -1.914e-01, 6.572e-02, 2.396e-03, -2.234e-01, 7.510e-02, 7.839e-02, -4.164e-02, 3.453e-02)); + r += mul(s1_4, M4(-2.032e-01, 4.775e-01, -3.155e-01, 4.759e-02, -3.128e-03, 7.992e-02, -1.580e-01, 1.370e-01, 7.606e-02, -2.428e-01, -3.431e-01, 8.765e-02, 1.948e-01, 3.910e-02, 1.793e-01, -2.253e-01)); + r += mul(s1_5, M4(-6.497e-02, 3.718e-01, -1.607e-01, 1.969e-01, 1.130e-01, 1.543e-01, -6.874e-02, 3.665e-02, -2.082e-02, -1.314e-01, 1.726e-01, -3.860e-02, -1.390e-01, -6.533e-02, 1.400e-02, -1.440e-02)); + r += mul(s1_6, M4(2.533e-02, 4.261e-01, -4.830e-02, -3.112e-02, -4.698e-01, 1.500e-01, -3.778e-01, -4.040e-02, 1.883e-01, -4.829e-02, -1.404e-01, 1.089e-01, -7.179e-02, -2.045e-01, -9.545e-02, 1.307e-01)); + r += mul(s1_7, M4(1.579e-01, 5.817e-01, -3.106e-01, 2.197e-01, 1.791e-01, -5.029e-02, -2.680e-01, 8.439e-02, -3.268e-02, 3.793e-01, 4.710e-02, -7.101e-02, -4.163e-01, -5.762e-01, 6.999e-02, -3.126e-02)); + r += mul(s1_8, M4(-2.019e-01, 2.995e-01, -1.985e-01, 3.372e-02, -1.814e-03, -8.885e-02, -1.580e-01, 5.131e-02, -3.058e-01, 1.882e-01, -1.935e-01, -9.108e-04, -1.722e-01, -1.703e-01, 2.751e-02, -1.436e-01)); + r += mul(s2_0, M4(-1.572e-01, 7.107e-02, 1.546e-01, 7.852e-02, 2.804e-01, 9.207e-02, 1.863e-01, -2.990e-02, 7.031e-02, 7.487e-03, -2.383e-01, 9.415e-02, -4.405e-02, -2.135e-01, 4.289e-02, -1.969e-02)); + r += mul(s2_1, M4(1.009e-01, 6.349e-02, -1.495e-03, 1.668e-02, -3.615e-02, -1.591e-01, -2.520e-01, 6.259e-03, 6.579e-02, -1.644e-01, -5.543e-02, -5.906e-02, -9.854e-02, 8.397e-02, 8.320e-02, -8.373e-02)); + r += mul(s2_2, M4(-3.516e-02, 1.545e-03, 3.351e-03, -3.178e-02, 1.191e-01, -9.185e-02, 2.679e-01, 3.951e-02, 1.385e-01, -8.283e-02, -4.421e-02, 6.449e-02, -1.340e-01, -8.220e-02, -1.149e-02, -3.884e-02)); + r += mul(s2_3, M4(-9.423e-02, -5.891e-02, 2.833e-01, 1.868e-01, 5.074e-02, 1.226e-01, -1.307e-01, -2.509e-01, -1.022e-01, 2.094e-02, 1.032e-01, 9.668e-02, 1.411e-01, -6.280e-02, 1.329e-02, 8.977e-02)); + r += mul(s2_4, M4(1.336e-01, -6.825e-02, 9.910e-02, 6.299e-03, -3.647e-01, -1.297e-01, -5.259e-02, -2.980e-01, 4.552e-01, 1.724e-01, 2.430e-01, -4.053e-01, 6.858e-02, 2.330e-01, -1.802e-01, -2.499e-01)); + r += mul(s2_5, M4(2.282e-01, -5.794e-03, 6.329e-02, -1.208e-01, 2.021e-01, -2.298e-02, 1.093e-01, 6.128e-02, -5.259e-02, 1.390e-01, -1.171e-01, 1.162e-01, -1.808e-01, 2.376e-01, -3.242e-01, -4.872e-03)); + r += mul(s2_6, M4(9.993e-03, 2.233e-01, 2.358e-01, 7.060e-02, -2.864e-02, -7.382e-02, -2.750e-01, 1.675e-01, -1.010e-01, 6.265e-02, 3.681e-02, -4.289e-02, -4.836e-03, 3.679e-02, -8.175e-02, -1.268e-02)); + r += mul(s2_7, M4(-4.403e-01, 1.954e-01, 1.783e-01, -2.415e-03, 2.802e-02, -1.300e-01, -1.612e-01, -1.006e-01, 3.618e-02, -1.846e-01, 2.350e-02, 1.274e-01, -6.638e-02, 9.782e-02, -6.339e-02, 2.921e-02)); + r += mul(s2_8, M4(-3.557e-02, 3.254e-02, -1.660e-02, -8.243e-02, 1.413e-01, 9.227e-02, -2.222e-02, 1.104e-01, 1.241e-01, 2.385e-01, -7.126e-02, 1.685e-01, -2.223e-02, 1.654e-01, -1.238e-01, 2.770e-02)); + r += mul(s3_0, M4(3.766e-02, -1.169e-01, -1.768e-01, 1.940e-02, -1.264e-01, 6.004e-02, 7.806e-02, -5.408e-02, -5.266e-02, 1.241e-01, 5.232e-02, 5.166e-02, -1.548e-01, -2.214e-02, -1.899e-02, 3.862e-02)); + r += mul(s3_1, M4(1.318e-01, -1.692e-02, -2.739e-02, 8.390e-02, -2.753e-01, 9.796e-02, -1.220e-01, 3.006e-02, 7.237e-02, -1.026e-01, -4.912e-02, -5.414e-02, 1.599e-02, 1.103e-02, 2.587e-01, -1.008e-01)); + r += mul(s3_2, M4(-2.140e-02, -1.934e-02, 2.338e-02, 3.088e-02, 3.095e-02, -1.189e-01, 1.848e-01, -1.983e-02, 1.788e-02, -8.243e-02, -4.502e-03, -3.665e-02, 5.258e-02, -9.368e-02, 8.604e-02, -6.375e-02)); + r += mul(s3_3, M4(3.559e-02, -4.663e-01, -1.866e-01, 9.592e-02, 1.656e-01, -2.107e-02, 1.781e-01, -1.324e-01, -1.047e-01, 4.386e-02, 3.693e-02, 6.419e-02, 3.781e-02, -1.108e-01, 3.440e-01, 1.116e-01)); + r += mul(s3_4, M4(9.007e-02, -1.986e-01, -2.803e-02, 1.300e-01, -2.704e-02, 4.319e-02, 3.338e-02, -9.694e-02, 3.277e-01, -2.424e-02, 3.779e-01, -5.205e-01, 1.618e-01, 1.366e-01, 8.522e-02, -2.863e-01)); + r += mul(s3_5, M4(1.929e-01, 3.554e-02, -8.457e-03, 6.138e-02, -1.672e-02, -1.217e-01, 1.997e-01, -8.514e-02, -6.749e-02, 5.450e-02, 7.215e-03, -7.587e-02, -3.529e-02, -1.021e-02, 5.863e-02, 2.202e-02)); + r += mul(s3_6, M4(1.631e-01, -1.250e-01, 7.616e-03, 1.028e-01, -1.353e-01, -3.640e-01, -1.947e-01, -9.438e-02, -5.227e-02, -1.033e-01, -1.453e-02, -1.795e-02, 1.948e-01, -7.952e-02, 1.281e-01, -1.553e-02)); + r += mul(s3_7, M4(-4.316e-01, 6.337e-02, -6.498e-02, 7.992e-04, 1.663e-01, -1.837e-01, 1.463e-01, -8.458e-02, -9.212e-02, -6.334e-02, -1.500e-01, 1.331e-01, -8.807e-02, 1.654e-01, 7.674e-03, -3.696e-03)); + r += mul(s3_8, M4(8.960e-02, 1.206e-02, -1.317e-01, 1.738e-02, -1.972e-02, 7.104e-02, 9.549e-03, 3.120e-04, -5.724e-02, -1.955e-02, -9.568e-02, 1.298e-01, -1.468e-01, 9.693e-02, 1.818e-02, -3.696e-02)); + r += V4(-5.503e-03, -1.971e-02, 4.307e-02, 2.403e-03); + return r; +} + +V4 f1(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-8.596e-02, -5.285e-02, 5.158e-02, 8.907e-02, 4.899e-02, -2.187e-02, -3.438e-02, -1.706e-01, -7.313e-02, -6.446e-03, -1.219e-01, 5.467e-02, 1.417e-02, 8.520e-02, 6.738e-02, -3.482e-02)); + r += mul(s0_1, M4(3.106e-02, -2.627e-03, 1.389e-02, 3.474e-02, 3.618e-02, -1.077e-01, -4.858e-02, -8.000e-02, 1.019e-01, -9.408e-02, -1.601e-01, 1.003e-01, -7.328e-03, 1.167e-01, 1.367e-01, -1.538e-01)); + r += mul(s0_2, M4(-1.290e-01, -7.244e-02, 4.047e-04, 5.332e-02, -5.096e-02, -6.015e-02, 4.490e-02, -4.033e-02, 1.587e-01, -6.248e-02, -2.208e-01, -5.304e-02, 5.434e-02, 1.597e-01, 3.131e-02, -3.238e-02)); + r += mul(s0_3, M4(-3.771e-02, -8.350e-02, -8.219e-02, 2.164e-02, -5.266e-02, 1.337e-01, 5.790e-02, -3.579e-02, 1.371e-01, 7.213e-02, 2.308e-01, 1.958e-01, -9.141e-02, 1.143e-01, 7.658e-02, -4.488e-02)); + r += mul(s0_4, M4(1.631e-02, -2.806e-02, 1.665e-01, -1.948e-02, -1.633e-01, -2.538e-03, -1.970e-01, 2.337e-02, 9.817e-02, 3.921e-01, -1.388e-01, 4.121e-02, 8.042e-03, -5.681e-02, 2.117e-01, -8.773e-02)); + r += mul(s0_5, M4(-1.510e-01, -7.396e-02, 1.387e-01, 1.461e-01, -1.826e-01, -2.693e-02, 9.142e-02, 9.284e-02, -1.825e-01, -9.509e-02, 6.374e-02, -1.388e-01, -8.189e-02, 1.223e-01, -1.750e-02, 1.406e-01)); + r += mul(s0_6, M4(1.135e-02, -9.048e-02, -1.223e-01, 2.888e-02, 1.880e-01, 1.797e-01, 4.345e-01, -8.939e-02, -1.525e-01, 5.877e-02, -9.220e-02, 6.612e-02, 2.258e-02, 1.177e-01, -8.183e-02, 8.373e-03)); + r += mul(s0_7, M4(1.696e-01, 1.752e-01, -6.929e-02, 1.645e-01, 8.546e-02, 9.341e-02, 1.696e-01, -3.056e-02, -7.792e-02, 8.699e-02, 1.695e-01, -3.911e-03, -2.366e-01, 8.806e-02, -4.111e-01, -1.648e-02)); + r += mul(s0_8, M4(5.684e-02, -8.478e-02, -1.300e-01, 9.553e-02, -1.272e-02, -9.817e-03, 5.397e-02, 8.448e-02, -1.665e-02, 1.940e-02, -1.479e-01, -1.231e-01, -1.558e-01, 4.587e-02, 9.477e-02, 1.733e-01)); + r += mul(s1_0, M4(4.928e-02, 1.630e-01, 3.530e-02, -2.609e-01, 2.080e-02, 2.517e-02, -5.341e-02, 2.393e-02, 2.070e-01, -7.999e-02, -5.407e-02, 9.927e-02, 1.005e-01, -1.452e-01, -1.293e-01, 1.179e-03)); + r += mul(s1_1, M4(4.045e-01, 1.635e-01, -7.885e-02, -2.496e-01, 8.646e-02, -9.838e-02, -6.499e-02, -5.604e-02, -1.479e-01, 8.245e-02, 2.084e-01, 3.130e-02, 3.350e-02, -1.592e-01, -3.301e-03, -1.571e-01)); + r += mul(s1_2, M4(1.435e-01, -1.269e-01, 4.380e-02, -9.012e-02, 5.184e-02, 3.579e-02, -8.166e-02, -2.591e-02, 2.181e-01, -2.666e-01, -1.091e-01, 1.673e-01, 6.085e-02, -2.818e-02, 2.975e-02, -1.134e-01)); + r += mul(s1_3, M4(4.309e-02, -3.624e-02, 3.632e-02, -1.492e-01, 1.492e-01, 1.318e-01, -3.694e-02, 2.850e-01, 2.685e-01, -6.430e-02, 1.423e-01, -1.073e-01, 7.645e-04, -1.715e-01, -2.463e-02, 6.346e-02)); + r += mul(s1_4, M4(7.196e-01, -1.132e-01, -4.236e-02, -4.937e-01, 1.175e-01, 4.154e-02, -3.213e-01, 1.145e-02, -2.131e-01, 2.879e-02, -2.353e-01, 1.775e-01, 4.716e-02, 4.443e-02, -1.883e-03, 1.204e-01)); + r += mul(s1_5, M4(4.435e-01, 3.854e-01, -1.692e-01, -1.702e-01, -6.404e-02, 1.060e-01, -2.896e-02, 2.275e-02, 9.162e-03, -2.673e-01, -1.698e-01, -1.770e-01, -1.354e-01, 9.096e-02, -1.099e-01, 3.785e-01)); + r += mul(s1_6, M4(2.284e-01, 1.976e-02, -1.113e-01, -2.744e-01, 1.518e-01, 8.682e-02, 3.085e-01, 1.258e-01, -3.514e-02, 9.450e-02, -4.096e-02, -2.853e-02, -8.595e-03, -3.154e-01, -3.680e-02, 2.172e-01)); + r += mul(s1_7, M4(1.785e-01, 1.978e-01, -1.906e-02, 2.771e-02, 1.501e-01, 2.575e-02, 2.389e-01, 3.010e-01, 1.457e-01, -4.462e-02, -2.300e-01, -1.614e-01, -2.747e-01, -7.497e-02, -4.463e-01, 2.659e-01)); + r += mul(s1_8, M4(3.257e-01, 1.932e-01, -5.289e-03, 3.878e-03, -1.571e-01, 4.645e-03, 7.888e-03, 1.243e-01, 5.842e-02, -2.256e-02, -6.602e-03, -3.731e-02, -7.605e-02, -3.408e-01, -1.688e-01, -5.470e-03)); + r += mul(s2_0, M4(-3.495e-02, -1.928e-02, 4.994e-02, 1.395e-01, -1.112e-01, 1.772e-01, -1.634e-01, -3.699e-02, 1.127e-01, 6.082e-03, -5.189e-02, -4.303e-02, -7.775e-02, -6.178e-02, -7.501e-02, 1.320e-01)); + r += mul(s2_1, M4(-4.850e-02, -1.289e-01, -9.325e-02, -1.643e-02, 2.239e-01, -9.011e-02, -2.566e-02, 5.301e-02, 1.855e-01, -9.348e-02, -1.585e-02, -2.001e-01, -5.371e-02, -5.272e-02, 1.356e-01, 1.703e-01)); + r += mul(s2_2, M4(1.056e-01, -6.602e-02, -3.005e-02, 9.795e-03, 5.049e-02, -9.108e-02, 3.054e-02, -1.752e-01, -1.561e-01, 3.075e-01, 8.300e-02, -8.430e-02, 1.265e-02, -2.776e-01, -5.878e-02, 1.144e-02)); + r += mul(s2_3, M4(1.382e-01, -2.842e-01, -2.699e-02, -2.153e-01, 2.187e-01, 2.651e-01, 1.307e-01, 1.926e-01, 5.445e-02, -2.797e-01, -8.728e-02, 7.571e-02, 6.814e-02, -1.233e-01, -3.357e-02, 1.947e-01)); + r += mul(s2_4, M4(-1.063e-02, 1.618e-01, -1.176e-01, 8.081e-02, -4.808e-02, 2.455e-02, -4.511e-02, -1.988e-01, 7.006e-02, -5.232e-01, 1.190e-01, 1.209e-01, 1.514e-03, -3.750e-02, -3.545e-01, -7.031e-02)); + r += mul(s2_5, M4(2.690e-01, 6.288e-02, -8.282e-02, -5.746e-02, 2.216e-02, 1.134e-01, -2.658e-01, 1.436e-01, -2.117e-01, 4.009e-03, -8.882e-02, -1.534e-02, 7.304e-02, -1.343e-01, 1.021e-01, 1.895e-01)); + r += mul(s2_6, M4(1.037e-03, -1.050e-01, -2.224e-01, -2.244e-01, 4.082e-02, 2.096e-01, 2.538e-01, 1.739e-01, -1.823e-02, 2.410e-02, 2.399e-01, -2.812e-01, 1.423e-01, -9.570e-02, -5.401e-02, -1.056e-02)); + r += mul(s2_7, M4(1.985e-01, -1.232e-02, -2.831e-01, -9.744e-02, -2.427e-01, -1.069e-01, -9.460e-02, 1.293e-01, -9.502e-02, -2.604e-01, 1.861e-01, -1.988e-01, -5.062e-02, -2.880e-02, 2.069e-01, 4.192e-02)); + r += mul(s2_8, M4(1.906e-01, -2.576e-02, -1.644e-01, -8.586e-02, -1.002e-01, 1.869e-02, 8.363e-02, -1.062e-01, -3.330e-01, 5.037e-02, 1.923e-01, -6.374e-02, -2.618e-02, -3.867e-02, 2.036e-01, 1.382e-01)); + r += mul(s3_0, M4(-1.223e-01, 4.404e-02, 7.597e-02, 1.037e-01, 5.300e-02, -3.714e-01, 8.780e-02, 1.064e-01, 4.379e-02, 5.496e-02, -5.741e-02, -8.834e-02, 4.607e-02, 2.440e-01, -3.621e-02, -1.449e-01)); + r += mul(s3_1, M4(1.114e-02, -3.579e-03, -1.118e-01, -7.019e-02, 1.253e-01, 1.410e-01, 1.507e-01, 1.204e-01, 4.912e-02, -2.110e-01, -1.393e-01, 1.398e-02, -3.292e-02, 2.104e-01, 1.470e-01, -4.723e-01)); + r += mul(s3_2, M4(-7.613e-02, -3.437e-02, 3.357e-02, 2.053e-02, 2.749e-02, -1.624e-02, 1.085e-01, 4.885e-02, -8.099e-02, -1.709e-01, 1.212e-01, -1.369e-01, 8.667e-03, -2.034e-01, 1.859e-02, -2.609e-01)); + r += mul(s3_3, M4(-2.751e-01, -6.155e-02, 3.194e-02, 2.257e-01, 2.247e-01, -1.563e-01, -2.388e-01, 4.747e-01, 8.550e-02, -2.046e-01, 5.261e-02, 1.302e-02, -2.718e-01, 8.046e-02, 6.971e-03, -4.401e-02)); + r += mul(s3_4, M4(-2.097e-01, 4.087e-02, 1.145e-01, 3.885e-01, -2.739e-01, 4.656e-01, 1.839e-01, -4.552e-02, 1.422e-01, -8.299e-02, 1.631e-01, 8.810e-02, -2.652e-01, 3.779e-01, -1.959e-01, -7.052e-01)); + r += mul(s3_5, M4(2.480e-03, 2.248e-01, 9.405e-02, 1.128e-01, 1.134e-01, -7.725e-02, -7.705e-02, 4.144e-02, 1.185e-02, -1.614e-01, -6.596e-02, 1.191e-01, 1.946e-01, 6.701e-02, 4.365e-02, -2.465e-01)); + r += mul(s3_6, M4(-2.183e-01, 6.265e-03, -2.004e-02, 1.360e-01, 9.385e-02, -6.143e-03, -3.924e-02, 2.857e-01, -1.091e-01, 5.286e-02, -2.204e-03, -4.854e-02, -2.588e-01, -8.500e-02, -7.099e-02, -3.542e-02)); + r += mul(s3_7, M4(-2.584e-01, -1.560e-01, 3.706e-02, 8.145e-03, -4.860e-02, -6.664e-02, -2.890e-01, 9.694e-02, 6.597e-02, -1.415e-01, -9.524e-02, 4.655e-03, -1.705e-01, 1.622e-01, 2.766e-01, -1.033e-01)); + r += mul(s3_8, M4(1.214e-02, 6.487e-02, -1.258e-03, 1.522e-01, 8.112e-02, -1.089e-02, -2.167e-02, -1.711e-01, -1.753e-01, -7.256e-02, 8.314e-02, 6.349e-02, 1.489e-01, 4.952e-02, 1.646e-01, -7.355e-02)); + r += V4(-1.384e-02, -2.911e-02, -8.125e-03, 2.809e-03); + return r; +} + +void Pass4(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = Rmp8x8(tid.x) + blockStart; + uint2 size = GetInputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = (gxy + 0.5) * pt; + + V4 s0_0 = l0(-1.0, -1.0); + V4 s0_1 = l0(0.0, -1.0); + V4 s0_2 = l0(1.0, -1.0); + V4 s0_3 = l0(-1.0, 0.0); + V4 s0_4 = l0(0.0, 0.0); + V4 s0_5 = l0(1.0, 0.0); + V4 s0_6 = l0(-1.0, 1.0); + V4 s0_7 = l0(0.0, 1.0); + V4 s0_8 = l0(1.0, 1.0); + V4 s1_0 = -max(-s0_0, 0.0); + V4 s1_1 = -max(-s0_1, 0.0); + V4 s1_2 = -max(-s0_2, 0.0); + V4 s1_3 = -max(-s0_3, 0.0); + V4 s1_4 = -max(-s0_4, 0.0); + V4 s1_5 = -max(-s0_5, 0.0); + V4 s1_6 = -max(-s0_6, 0.0); + V4 s1_7 = -max(-s0_7, 0.0); + V4 s1_8 = -max(-s0_8, 0.0); + s0_0 = max(s0_0, 0.0); + s0_1 = max(s0_1, 0.0); + s0_2 = max(s0_2, 0.0); + s0_3 = max(s0_3, 0.0); + s0_4 = max(s0_4, 0.0); + s0_5 = max(s0_5, 0.0); + s0_6 = max(s0_6, 0.0); + s0_7 = max(s0_7, 0.0); + s0_8 = max(s0_8, 0.0); + + V4 s2_0 = l1(-1.0, -1.0); + V4 s2_1 = l1(0.0, -1.0); + V4 s2_2 = l1(1.0, -1.0); + V4 s2_3 = l1(-1.0, 0.0); + V4 s2_4 = l1(0.0, 0.0); + V4 s2_5 = l1(1.0, 0.0); + V4 s2_6 = l1(-1.0, 1.0); + V4 s2_7 = l1(0.0, 1.0); + V4 s2_8 = l1(1.0, 1.0); + V4 s3_0 = -max(-s2_0, 0.0); + V4 s3_1 = -max(-s2_1, 0.0); + V4 s3_2 = -max(-s2_2, 0.0); + V4 s3_3 = -max(-s2_3, 0.0); + V4 s3_4 = -max(-s2_4, 0.0); + V4 s3_5 = -max(-s2_5, 0.0); + V4 s3_6 = -max(-s2_6, 0.0); + V4 s3_7 = -max(-s2_7, 0.0); + V4 s3_8 = -max(-s2_8, 0.0); + s2_0 = max(s2_0, 0.0); + s2_1 = max(s2_1, 0.0); + s2_2 = max(s2_2, 0.0); + s2_3 = max(s2_3, 0.0); + s2_4 = max(s2_4, 0.0); + s2_5 = max(s2_5, 0.0); + s2_6 = max(s2_6, 0.0); + s2_7 = max(s2_7, 0.0); + s2_8 = max(s2_8, 0.0); + + t2[gxy] = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8); + t3[gxy] = f1(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8); +} + +//!PASS 5 +//!DESC conv4 +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 +//!IN t2, t3 +//!OUT t0, t1 + +#define l0(x, y) V4(O(t2, float2(x, y))) +#define l1(x, y) V4(O(t3, float2(x, y))) + +V4 f0(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-9.839e-02, 3.062e-02, -3.104e-02, 1.230e-01, -3.336e-02, -6.990e-02, -5.725e-02, -1.051e-01, 5.154e-02, -1.304e-01, -2.518e-02, 3.975e-03, -2.458e-02, -4.391e-02, -1.022e-01, 1.249e-01)); + r += mul(s0_1, M4(1.530e-01, 1.379e-01, -4.847e-02, -8.142e-02, -1.899e-01, -9.819e-03, -2.943e-02, 8.787e-02, 8.270e-02, -7.839e-04, 4.236e-03, 2.756e-03, 1.612e-01, -1.871e-01, -1.973e-01, -8.765e-02)); + r += mul(s0_2, M4(1.230e-01, 7.002e-02, 2.676e-02, -2.607e-01, 3.729e-02, -1.075e-01, -5.825e-02, 9.552e-02, -6.701e-02, 5.642e-02, 5.425e-02, -1.487e-01, 6.427e-02, -1.606e-01, -2.290e-01, 2.280e-01)); + r += mul(s0_3, M4(-1.096e-01, 4.115e-02, -5.260e-02, 9.679e-02, 1.028e-01, -1.253e-01, -1.221e-01, -1.339e-02, 1.119e-01, -8.725e-02, 1.090e-01, -8.990e-02, 1.657e-01, -5.536e-02, 7.055e-02, -6.021e-03)); + r += mul(s0_4, M4(3.182e-01, -1.503e-01, -9.298e-02, 9.546e-02, 2.257e-01, -1.978e-01, -1.203e-01, -5.362e-02, -2.116e-02, -3.685e-02, 6.188e-02, 7.871e-02, 6.547e-01, 3.793e-01, -9.293e-03, -5.081e-01)); + r += mul(s0_5, M4(6.746e-02, -3.872e-02, -8.004e-02, 4.643e-02, -1.157e-01, -1.149e-01, -1.323e-01, -1.319e-02, -3.194e-02, -1.266e-02, -4.837e-02, -6.710e-02, 1.123e-01, -1.855e-01, -9.259e-03, -1.861e-01)); + r += mul(s0_6, M4(-7.725e-02, -4.151e-02, -7.387e-02, 1.089e-01, -5.642e-02, 7.030e-03, 7.847e-02, 1.234e-01, 9.461e-03, -4.967e-02, 1.502e-02, 3.836e-02, 1.171e-02, 3.758e-02, 3.336e-02, 5.168e-02)); + r += mul(s0_7, M4(2.541e-02, 1.428e-01, 2.426e-03, 2.451e-02, -1.436e-01, 5.267e-02, 2.402e-02, -4.748e-02, 2.185e-02, -5.397e-02, -4.221e-02, -4.758e-02, 1.504e-01, 1.818e-01, -3.334e-04, 1.985e-01)); + r += mul(s0_8, M4(5.651e-02, 1.104e-01, 1.186e-01, -4.816e-02, -1.772e-03, -3.797e-02, -1.169e-01, 9.888e-02, -7.066e-02, -2.928e-02, 1.300e-01, -9.514e-02, 8.911e-02, 1.399e-01, 8.996e-02, 7.361e-02)); + r += mul(s1_0, M4(-4.999e-02, 7.076e-02, 1.754e-01, 2.998e-01, -5.965e-02, 8.642e-02, 6.403e-02, 1.597e-02, -1.367e-02, -1.751e-01, -1.432e-01, -1.337e-01, -1.356e-01, -1.147e-02, 4.994e-02, 1.355e-01)); + r += mul(s1_1, M4(-1.462e-01, 2.612e-01, 1.009e-01, 6.179e-02, 1.171e-01, -2.310e-01, -1.324e-01, -1.989e-01, -7.842e-02, 2.017e-01, -2.558e-02, 1.725e-01, -1.879e-01, 2.705e-01, 9.276e-02, 2.009e-01)); + r += mul(s1_2, M4(-5.937e-02, 1.314e-02, 1.771e-01, -8.971e-02, 9.120e-02, -8.247e-03, 6.149e-02, -1.310e-02, 1.856e-01, -8.410e-02, 3.653e-02, 1.994e-02, 1.377e-02, -2.608e-02, 2.918e-02, 1.410e-01)); + r += mul(s1_3, M4(-1.270e-01, 2.306e-01, 1.223e-01, 5.712e-02, 6.862e-02, -1.441e-02, -1.116e-02, -1.195e-01, 4.816e-02, -9.698e-03, -1.642e-01, 2.214e-01, -1.748e-01, -1.574e-01, 7.939e-02, 4.879e-02)); + r += mul(s1_4, M4(-6.803e-02, -2.231e-01, -9.303e-02, 3.363e-01, 4.699e-01, -6.197e-01, -1.678e-01, 1.660e-02, -3.526e-01, -2.941e-01, 4.667e-01, -3.648e-01, -5.144e-01, 7.678e-01, 4.839e-01, -5.598e-01)); + r += mul(s1_5, M4(-7.123e-02, -2.319e-01, -3.813e-02, 1.547e-01, 2.632e-01, -2.001e-02, 4.992e-02, -1.581e-01, -4.053e-02, -2.970e-04, 5.472e-02, -6.788e-02, -2.869e-01, -9.887e-02, 4.475e-02, -1.027e-01)); + r += mul(s1_6, M4(7.336e-02, 1.784e-02, -1.559e-01, 7.106e-02, 9.975e-02, -6.405e-03, 7.519e-02, 7.405e-02, -9.000e-02, 8.590e-02, -2.557e-01, -1.597e-02, -4.081e-02, 7.353e-02, 3.324e-02, -5.861e-02)); + r += mul(s1_7, M4(2.380e-02, -1.385e-01, -1.038e-01, 2.752e-02, -4.866e-02, 6.411e-02, 3.531e-01, -1.330e-01, 2.261e-01, -7.266e-02, -5.772e-02, -6.657e-02, -1.588e-01, 1.268e-01, 1.618e-02, 9.695e-02)); + r += mul(s1_8, M4(1.300e-01, -1.683e-01, -1.481e-02, -1.442e-02, 2.942e-02, -4.528e-03, 3.715e-01, -2.056e-01, -1.070e-01, 7.589e-02, -1.326e-01, 9.583e-02, -1.052e-01, 4.535e-02, -5.072e-02, 1.023e-01)); + r += mul(s2_0, M4(4.804e-02, 4.605e-02, 1.479e-01, 2.794e-02, 1.518e-02, 1.881e-02, 5.332e-02, 6.881e-02, -9.226e-02, -1.212e-02, 5.999e-03, 4.409e-02, -2.364e-01, -4.576e-02, 4.537e-02, 1.615e-01)); + r += mul(s2_1, M4(-1.719e-02, 2.187e-01, 1.772e-01, 1.933e-02, -3.135e-02, 4.963e-02, 1.303e-02, -2.623e-02, -1.273e-01, 1.462e-02, 7.118e-02, -1.498e-01, 1.978e-01, 7.777e-02, -1.052e-01, 1.954e-01)); + r += mul(s2_2, M4(-2.936e-02, -1.679e-02, 1.548e-01, 2.521e-02, 4.974e-02, 5.132e-02, 1.145e-02, 4.237e-02, -2.103e-01, 3.828e-03, -3.888e-02, 1.429e-01, -2.964e-02, -1.423e-02, -2.417e-01, 3.932e-01)); + r += mul(s2_3, M4(-1.881e-01, -2.086e-02, 1.815e-04, 1.164e-01, -7.054e-02, 8.297e-02, 7.999e-02, 3.579e-02, -1.240e-02, 5.415e-02, -4.885e-02, -7.243e-02, -7.780e-02, -8.180e-02, 1.529e-01, 1.616e-01)); + r += mul(s2_4, M4(-1.410e-01, 9.917e-02, 2.589e-01, -2.888e-01, -1.248e-01, 2.510e-01, 3.366e-02, 1.437e-01, 3.793e-01, 5.004e-02, 3.701e-01, 3.111e-01, -3.195e-01, -3.731e-02, 1.132e-01, 1.961e-01)); + r += mul(s2_5, M4(-8.966e-02, -5.875e-02, -1.135e-01, 8.984e-02, 5.129e-02, 7.536e-02, 2.763e-01, 1.203e-02, -2.020e-01, 1.617e-01, -1.427e-02, 6.661e-02, -1.930e-01, -7.980e-03, 8.300e-02, 1.697e-01)); + r += mul(s2_6, M4(5.726e-02, -1.777e-02, -4.372e-02, 3.170e-03, 2.430e-02, -1.211e-02, -4.311e-02, -1.215e-01, -1.066e-01, 1.810e-02, 1.013e-01, -2.315e-02, -3.001e-01, -8.701e-02, -1.455e-01, 4.155e-02)); + r += mul(s2_7, M4(1.431e-01, 2.344e-03, 1.489e-02, 4.575e-02, 7.550e-02, 3.571e-02, -2.517e-01, -5.387e-03, 4.699e-02, 5.390e-02, 2.202e-01, -7.897e-02, 6.326e-02, -1.588e-01, -1.852e-01, -3.037e-02)); + r += mul(s2_8, M4(-3.479e-02, -8.214e-02, 6.944e-02, 5.269e-02, -7.719e-03, -7.718e-02, -8.393e-02, -8.959e-02, -2.111e-01, 1.286e-01, 1.948e-01, -8.095e-02, -2.335e-02, 9.535e-02, -1.144e-01, 3.688e-02)); + r += mul(s3_0, M4(8.765e-02, -6.740e-02, 1.200e-01, 6.992e-02, 1.884e-02, -1.592e-02, -9.304e-02, 1.706e-01, 6.023e-02, 1.494e-01, -1.165e-01, 3.848e-02, -2.808e-02, 4.820e-02, -4.830e-02, 9.253e-02)); + r += mul(s3_1, M4(-1.087e-01, 2.039e-01, -8.116e-02, 1.500e-01, 1.942e-01, -2.291e-02, -1.321e-02, 1.630e-02, 2.216e-01, 3.536e-02, -2.321e-01, 1.143e-01, 2.093e-01, -6.126e-02, -3.792e-02, 6.886e-02)); + r += mul(s3_2, M4(1.225e-01, -6.231e-02, -1.999e-01, 9.921e-02, -4.257e-02, -2.975e-02, -4.073e-02, 7.069e-02, -5.033e-02, 2.268e-03, -1.908e-01, 9.678e-02, -4.540e-02, 4.195e-02, -1.990e-02, -9.002e-02)); + r += mul(s3_3, M4(8.620e-02, 1.856e-02, 1.201e-01, 1.343e-01, 6.518e-03, 1.274e-01, 1.006e-01, -4.803e-02, 2.593e-02, 1.861e-01, -2.316e-01, -1.882e-01, 2.021e-02, -5.658e-02, -1.339e-02, -6.240e-02)); + r += mul(s3_4, M4(3.285e-01, -2.068e-02, 4.279e-01, -7.153e-02, 1.368e-02, 2.029e-01, 3.056e-01, -2.398e-02, -2.007e-02, -6.963e-02, 4.423e-01, 2.373e-01, -3.829e-03, -8.114e-02, 1.907e-01, 6.471e-02)); + r += mul(s3_5, M4(6.460e-02, -2.118e-01, -1.407e-01, 8.041e-02, 5.512e-02, 1.740e-01, 2.092e-01, 1.569e-02, 2.071e-02, -5.675e-02, -9.011e-02, 5.301e-02, 9.519e-02, -2.758e-02, -3.116e-02, -2.141e-02)); + r += mul(s3_6, M4(-2.575e-02, 1.869e-02, 7.810e-02, -7.650e-03, 2.013e-01, 2.214e-02, -8.345e-02, 2.879e-02, 1.492e-01, -4.496e-02, -1.297e-01, 2.238e-03, 7.626e-02, -7.449e-02, -5.789e-02, 5.411e-02)); + r += mul(s3_7, M4(5.731e-02, 8.709e-02, 8.776e-02, 1.547e-01, 9.076e-02, -1.621e-01, -3.538e-01, -3.413e-02, 1.609e-01, -6.938e-03, -5.128e-02, 7.688e-02, -5.171e-03, 9.220e-02, 2.424e-02, 1.621e-02)); + r += mul(s3_8, M4(6.538e-02, -3.415e-02, 5.399e-02, -8.863e-02, -7.563e-02, -1.511e-01, -2.978e-01, 7.569e-02, -1.429e-01, 3.110e-02, -2.972e-02, -8.001e-03, -8.429e-02, -1.092e-02, -4.655e-02, 3.067e-02)); + r += V4(-3.137e-02, 6.441e-03, -1.512e-02, 2.709e-02); + return r; +} + +V4 f1(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-3.334e-02, -7.793e-02, 7.471e-02, 4.792e-02, -9.991e-03, 1.358e-02, 7.063e-02, -7.185e-02, 1.122e-01, 1.016e-01, 1.666e-01, -4.230e-02, -2.916e-03, 1.093e-01, 3.944e-02, -6.470e-02)); + r += mul(s0_1, M4(-3.424e-02, -5.060e-03, -9.649e-03, 1.311e-01, 9.390e-02, -6.332e-03, 8.698e-02, -1.949e-03, 5.118e-02, 4.049e-02, 7.113e-02, 1.951e-01, 1.856e-01, 2.065e-01, -7.642e-02, -1.852e-02)); + r += mul(s0_2, M4(-6.507e-03, -1.195e-02, -1.476e-01, -4.432e-02, 1.839e-02, 2.119e-02, -3.374e-03, -7.739e-03, -4.710e-03, -6.300e-02, -3.058e-02, -1.966e-03, -4.888e-03, 6.550e-02, 3.826e-02, 4.369e-02)); + r += mul(s0_3, M4(-2.796e-03, 6.707e-02, 1.750e-01, 5.898e-02, -6.279e-02, 1.146e-01, 4.500e-02, -1.178e-01, 1.591e-02, 4.649e-03, 1.249e-01, 1.531e-02, 2.940e-02, -3.842e-02, 1.162e-02, 8.735e-02)); + r += mul(s0_4, M4(1.997e-01, 1.499e-01, -2.234e-01, 2.460e-01, -6.721e-02, 2.135e-01, -1.372e-01, -1.864e-01, 1.432e-01, 1.012e-01, -3.441e-02, 7.842e-02, -2.026e-01, 1.294e-01, 3.063e-01, 2.969e-01)); + r += mul(s0_5, M4(1.302e-02, -1.252e-01, -1.174e-01, 2.114e-01, -5.837e-02, -1.377e-01, 4.956e-03, -1.486e-01, -7.287e-03, -1.002e-01, 1.431e-01, -8.579e-02, -2.642e-02, -9.106e-02, -5.609e-02, 3.664e-02)); + r += mul(s0_6, M4(-3.524e-02, 6.427e-02, 5.395e-02, -6.112e-02, -3.246e-02, -3.689e-02, 5.133e-02, 6.382e-02, -7.140e-02, 8.407e-02, -1.051e-02, 1.865e-02, -1.559e-02, 8.857e-02, -5.051e-02, 1.129e-03)); + r += mul(s0_7, M4(-7.399e-02, -1.028e-01, -1.066e-01, 1.430e-01, -1.403e-01, 9.422e-02, -8.995e-02, -1.358e-02, -8.900e-02, 1.519e-01, -7.974e-02, -1.915e-01, 2.726e-02, 2.748e-01, -2.521e-02, 9.171e-02)); + r += mul(s0_8, M4(4.422e-02, -1.013e-01, -9.089e-02, 3.341e-02, -3.750e-02, 1.762e-01, 8.286e-02, -4.945e-02, -1.285e-01, 1.504e-02, -4.042e-02, -7.892e-02, 3.263e-02, -2.562e-02, -1.577e-01, 2.407e-02)); + r += mul(s1_0, M4(-9.014e-02, 9.935e-03, 4.158e-02, 6.269e-02, -3.854e-02, -6.123e-02, 5.101e-02, -1.229e-01, -5.554e-02, -4.848e-02, -5.602e-02, -2.115e-01, -5.692e-02, 9.588e-03, 8.485e-02, 7.810e-02)); + r += mul(s1_1, M4(-5.449e-02, -5.076e-02, 7.205e-02, -5.263e-02, -1.293e-01, 1.127e-01, -1.122e-01, -6.078e-02, 8.158e-02, -2.493e-01, 4.842e-02, 1.959e-01, 5.976e-02, -1.003e-01, -6.969e-02, 1.654e-01)); + r += mul(s1_2, M4(-2.894e-02, 1.048e-01, 3.925e-03, -1.321e-01, -4.509e-02, -1.643e-02, -1.334e-01, 9.845e-02, -1.127e-01, -1.049e-01, 1.350e-02, -1.013e-02, -1.599e-01, -6.552e-02, 3.246e-02, 3.401e-02)); + r += mul(s1_3, M4(1.324e-01, -7.379e-02, 6.628e-02, -1.243e-01, -9.905e-02, 1.141e-01, 5.375e-02, -1.293e-01, -2.330e-02, -3.277e-01, 5.023e-02, -1.837e-01, 6.815e-02, -4.447e-02, 1.480e-01, -2.077e-03)); + r += mul(s1_4, M4(3.168e-01, 3.120e-01, 4.723e-02, -1.814e-01, -4.271e-01, 3.554e-01, -2.607e-01, 3.691e-02, 1.565e-01, -4.785e-01, 1.167e-01, -4.891e-02, -1.643e-01, -2.565e-01, 6.425e-01, -9.561e-02)); + r += mul(s1_5, M4(-4.394e-02, 1.831e-01, 2.602e-02, 8.348e-02, -4.285e-01, -2.126e-01, -2.658e-01, 1.340e-01, -6.773e-02, -1.315e-01, 9.904e-02, -1.672e-01, 1.995e-01, 1.307e-01, 1.985e-01, -8.368e-02)); + r += mul(s1_6, M4(-8.468e-03, 2.030e-01, -8.770e-04, -1.421e-01, -5.327e-02, 1.042e-01, 7.595e-02, -7.467e-02, -2.326e-03, -1.496e-01, -3.598e-02, 1.430e-02, 6.833e-02, 1.257e-01, 5.333e-03, 1.382e-01)); + r += mul(s1_7, M4(-7.236e-02, 2.202e-01, 7.527e-03, -1.157e-01, -4.825e-01, -1.938e-01, -2.971e-01, -7.394e-02, -3.056e-02, 6.438e-02, -8.167e-02, -1.749e-01, 7.804e-02, 3.541e-01, 1.631e-01, 1.105e-01)); + r += mul(s1_8, M4(-3.117e-02, 1.456e-01, 1.217e-02, -9.099e-02, -2.173e-01, -5.803e-02, -1.068e-01, -6.206e-02, -1.187e-04, 9.938e-02, 4.721e-02, -3.500e-02, -7.154e-02, -4.535e-02, -1.900e-02, 6.525e-03)); + r += mul(s2_0, M4(3.437e-02, 3.957e-03, -1.536e-02, 2.984e-02, 8.057e-03, 1.446e-02, -2.851e-02, -1.680e-02, 9.630e-04, -3.550e-02, 4.249e-02, -5.379e-02, -2.274e-02, 3.657e-02, 6.309e-02, -1.412e-01)); + r += mul(s2_1, M4(-4.765e-02, -7.905e-02, -7.251e-02, -8.459e-02, -1.866e-02, 4.668e-02, -2.496e-02, -3.761e-02, 6.520e-02, 9.971e-02, -1.199e-02, -3.565e-02, -2.936e-02, -1.288e-02, -8.909e-03, 1.604e-01)); + r += mul(s2_2, M4(-2.684e-02, 3.571e-02, 2.920e-02, -1.400e-01, -8.129e-03, 2.701e-02, -1.237e-02, 6.292e-02, 3.752e-02, -3.476e-02, 7.166e-02, 2.922e-02, 2.153e-02, -2.079e-02, 2.298e-01, 2.646e-01)); + r += mul(s2_3, M4(5.891e-02, -3.401e-02, 1.310e-01, 1.284e-01, -3.706e-02, -6.929e-03, 5.705e-02, 2.617e-02, 1.908e-03, 1.155e-01, 4.786e-02, 1.471e-01, -8.026e-02, 6.384e-02, 3.177e-01, -6.423e-02)); + r += mul(s2_4, M4(1.941e-01, -1.938e-04, -4.664e-02, 3.134e-01, -7.269e-02, -2.396e-01, -5.068e-02, -3.354e-01, 2.428e-01, 2.566e-01, -3.293e-01, 3.857e-01, -1.129e-02, 1.540e-01, -9.700e-02, -1.510e-01)); + r += mul(s2_5, M4(4.818e-02, 1.620e-01, 1.519e-01, 2.711e-03, -1.559e-02, 1.144e-01, 7.668e-03, -1.534e-01, 3.862e-03, -4.583e-02, 5.226e-02, -6.465e-02, 6.788e-02, 5.557e-02, 6.880e-02, 9.542e-02)); + r += mul(s2_6, M4(1.471e-01, 3.141e-02, 1.711e-02, 3.585e-02, 7.758e-02, 3.487e-03, -4.199e-02, 1.119e-02, -9.641e-02, 7.175e-02, -6.454e-03, -8.769e-02, 4.452e-02, 3.013e-02, 2.107e-01, 1.447e-02)); + r += mul(s2_7, M4(1.941e-01, -1.489e-01, 1.093e-01, 1.092e-02, 1.309e-01, 1.173e-01, 3.414e-02, -1.350e-01, -2.374e-01, -1.292e-01, -1.259e-01, 1.377e-02, -5.705e-02, 1.641e-01, -3.345e-02, -1.443e-01)); + r += mul(s2_8, M4(5.172e-02, 8.306e-03, 6.669e-02, -2.207e-02, -2.737e-02, 7.314e-02, -5.039e-02, -6.565e-02, -1.124e-01, -1.920e-01, -8.356e-02, 2.342e-02, 8.945e-03, 2.739e-02, 8.816e-03, 7.638e-02)); + r += mul(s3_0, M4(-2.968e-02, 1.037e-01, -2.673e-02, 1.869e-02, 9.621e-02, -5.237e-02, 1.487e-03, -9.423e-02, 3.269e-02, -5.264e-02, -4.862e-02, 2.446e-02, 6.554e-02, -8.896e-02, 2.104e-02, -1.165e-01)); + r += mul(s3_1, M4(-9.417e-03, 6.345e-02, -7.850e-03, 2.754e-01, -2.751e-02, -1.201e-01, -5.333e-02, -1.217e-01, 8.778e-02, 1.394e-01, -1.787e-01, 1.017e-01, -3.779e-02, 6.921e-02, 2.664e-02, 1.665e-01)); + r += mul(s3_2, M4(3.141e-02, 7.360e-02, 9.011e-02, -1.109e-02, 1.985e-02, -4.239e-02, 1.468e-01, -2.676e-02, 1.225e-01, -5.115e-02, 3.496e-02, 8.530e-02, 1.594e-02, -2.731e-02, 3.492e-02, -4.212e-02)); + r += mul(s3_3, M4(7.578e-02, 3.966e-03, -7.774e-03, 4.263e-02, 3.758e-02, -1.590e-01, 1.144e-01, -1.083e-01, 9.865e-02, 3.237e-03, -1.194e-01, 3.048e-02, -1.231e-01, 5.687e-02, 3.601e-02, -2.234e-01)); + r += mul(s3_4, M4(3.291e-01, 2.283e-01, -2.254e-01, 1.114e-01, -3.019e-01, -1.677e-01, -1.735e-01, -5.636e-01, 4.295e-01, 1.206e-01, -1.169e-01, -9.182e-02, 2.546e-01, 2.820e-01, -9.122e-02, 1.703e-01)); + r += mul(s3_5, M4(1.178e-01, 1.875e-01, 7.948e-02, -1.907e-02, -9.888e-02, 8.592e-02, 8.759e-02, -2.194e-01, -4.479e-02, 1.983e-02, 1.738e-02, -1.237e-01, -9.644e-02, -6.784e-02, -1.594e-02, 5.128e-02)); + r += mul(s3_6, M4(7.520e-02, 6.732e-02, 1.898e-02, 3.384e-02, 1.156e-01, 7.703e-02, -9.079e-02, 2.659e-02, 2.860e-02, 2.034e-01, -4.492e-02, -5.377e-02, 4.771e-02, 1.099e-01, 2.032e-02, 4.955e-02)); + r += mul(s3_7, M4(-1.573e-02, 1.987e-01, -9.155e-02, 1.445e-01, 2.224e-01, 7.036e-02, 1.126e-01, -2.900e-01, -3.571e-02, 6.868e-02, -5.302e-02, -2.629e-02, -2.798e-01, 1.832e-01, -1.850e-01, -8.079e-02)); + r += mul(s3_8, M4(-1.843e-02, -2.045e-02, -2.602e-02, -6.202e-02, 1.303e-01, 1.797e-01, 1.169e-01, -2.712e-02, -5.147e-02, -5.439e-02, 2.103e-02, -6.035e-02, 4.517e-02, 3.473e-02, 6.015e-02, -9.014e-02)); + r += V4(1.952e-02, -1.174e-02, -1.100e-02, -1.307e-02); + return r; +} + +void Pass5(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = Rmp8x8(tid.x) + blockStart; + uint2 size = GetInputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = (gxy + 0.5) * pt; + + V4 s0_0 = l0(-1.0, -1.0); + V4 s0_1 = l0(0.0, -1.0); + V4 s0_2 = l0(1.0, -1.0); + V4 s0_3 = l0(-1.0, 0.0); + V4 s0_4 = l0(0.0, 0.0); + V4 s0_5 = l0(1.0, 0.0); + V4 s0_6 = l0(-1.0, 1.0); + V4 s0_7 = l0(0.0, 1.0); + V4 s0_8 = l0(1.0, 1.0); + V4 s1_0 = -max(-s0_0, 0.0); + V4 s1_1 = -max(-s0_1, 0.0); + V4 s1_2 = -max(-s0_2, 0.0); + V4 s1_3 = -max(-s0_3, 0.0); + V4 s1_4 = -max(-s0_4, 0.0); + V4 s1_5 = -max(-s0_5, 0.0); + V4 s1_6 = -max(-s0_6, 0.0); + V4 s1_7 = -max(-s0_7, 0.0); + V4 s1_8 = -max(-s0_8, 0.0); + s0_0 = max(s0_0, 0.0); + s0_1 = max(s0_1, 0.0); + s0_2 = max(s0_2, 0.0); + s0_3 = max(s0_3, 0.0); + s0_4 = max(s0_4, 0.0); + s0_5 = max(s0_5, 0.0); + s0_6 = max(s0_6, 0.0); + s0_7 = max(s0_7, 0.0); + s0_8 = max(s0_8, 0.0); + + V4 s2_0 = l1(-1.0, -1.0); + V4 s2_1 = l1(0.0, -1.0); + V4 s2_2 = l1(1.0, -1.0); + V4 s2_3 = l1(-1.0, 0.0); + V4 s2_4 = l1(0.0, 0.0); + V4 s2_5 = l1(1.0, 0.0); + V4 s2_6 = l1(-1.0, 1.0); + V4 s2_7 = l1(0.0, 1.0); + V4 s2_8 = l1(1.0, 1.0); + V4 s3_0 = -max(-s2_0, 0.0); + V4 s3_1 = -max(-s2_1, 0.0); + V4 s3_2 = -max(-s2_2, 0.0); + V4 s3_3 = -max(-s2_3, 0.0); + V4 s3_4 = -max(-s2_4, 0.0); + V4 s3_5 = -max(-s2_5, 0.0); + V4 s3_6 = -max(-s2_6, 0.0); + V4 s3_7 = -max(-s2_7, 0.0); + V4 s3_8 = -max(-s2_8, 0.0); + s2_0 = max(s2_0, 0.0); + s2_1 = max(s2_1, 0.0); + s2_2 = max(s2_2, 0.0); + s2_3 = max(s2_3, 0.0); + s2_4 = max(s2_4, 0.0); + s2_5 = max(s2_5, 0.0); + s2_6 = max(s2_6, 0.0); + s2_7 = max(s2_7, 0.0); + s2_8 = max(s2_8, 0.0); + + t0[gxy] = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8); + t1[gxy] = f1(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8); +} + +//!PASS 6 +//!DESC conv5 +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 +//!IN t0, t1 +//!OUT t2, t3 + +#define l0(x, y) V4(O(t0, float2(x, y))) +#define l1(x, y) V4(O(t1, float2(x, y))) + +V4 f0(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-6.394e-02, -8.671e-02, 1.570e-02, -4.415e-02, 1.044e-01, 1.031e-01, 2.257e-02, -1.991e-02, -6.187e-02, 6.388e-02, 9.901e-02, 1.943e-02, 3.702e-02, 5.943e-03, 1.052e-02, 5.888e-02)); + r += mul(s0_1, M4(8.377e-02, 1.451e-01, 1.580e-01, 3.663e-02, 1.333e-01, 3.462e-02, 2.649e-02, 7.588e-02, 2.175e-02, 1.744e-01, 1.048e-01, -1.644e-01, -5.844e-02, 1.648e-02, 1.306e-01, -5.721e-02)); + r += mul(s0_2, M4(-7.420e-02, 5.839e-02, -2.164e-02, 2.832e-03, 1.776e-02, -1.732e-01, 1.505e-02, -1.082e-02, -1.647e-02, 3.072e-01, 1.187e-01, -1.273e-02, -9.205e-02, 1.119e-01, -2.918e-02, 9.009e-02)); + r += mul(s0_3, M4(-4.099e-03, -5.330e-02, -6.372e-02, -4.979e-02, -5.943e-02, -3.211e-02, -1.558e-01, 1.997e-01, -5.598e-02, -1.344e-02, 8.655e-02, 1.490e-01, -3.303e-02, -3.863e-02, 1.987e-03, -3.842e-02)); + r += mul(s0_4, M4(9.400e-02, 1.535e-01, 8.863e-02, 1.286e-01, 4.315e-01, -1.199e-01, 1.476e-01, 2.280e-01, -3.763e-02, 1.189e-01, 2.648e-01, 1.310e-01, -2.201e-01, -6.282e-02, 2.480e-01, 3.236e-02)); + r += mul(s0_5, M4(3.101e-02, -7.681e-02, -6.753e-02, 3.084e-02, 8.940e-02, -1.872e-01, -2.982e-02, -8.335e-02, 7.990e-02, 1.128e-01, 2.703e-01, 2.021e-01, -9.396e-02, 4.201e-02, 6.420e-03, -4.602e-02)); + r += mul(s0_6, M4(4.940e-02, -6.328e-03, -1.384e-02, -5.572e-02, 3.489e-02, -3.705e-02, 8.067e-02, -4.078e-02, -7.071e-03, 2.446e-02, 1.633e-02, -1.022e-02, -4.371e-02, 2.045e-02, 5.237e-02, -1.685e-02)); + r += mul(s0_7, M4(2.613e-02, 3.379e-02, -5.088e-02, 6.559e-02, -7.908e-03, -7.828e-02, -1.304e-02, -3.928e-02, 3.253e-02, -8.783e-02, 7.669e-03, -1.617e-01, 2.507e-02, 1.387e-01, 1.676e-01, 6.068e-02)); + r += mul(s0_8, M4(-1.872e-02, 6.736e-03, -2.342e-02, 3.332e-03, 1.419e-02, -3.932e-02, -8.530e-02, -5.934e-02, 8.273e-03, 8.759e-03, 6.867e-02, -3.344e-02, 8.183e-02, 1.472e-01, 3.134e-02, 5.993e-02)); + r += mul(s1_0, M4(6.022e-02, -1.966e-02, -1.612e-02, -6.922e-02, 7.477e-02, 1.176e-01, 1.365e-03, 8.882e-02, -4.594e-02, 7.740e-02, 6.959e-02, 8.633e-02, 3.034e-02, -8.553e-02, -6.847e-02, 2.439e-02)); + r += mul(s1_1, M4(1.861e-01, 1.628e-01, 9.891e-02, 8.686e-02, 1.521e-01, 2.777e-02, -4.557e-02, -5.964e-02, -7.298e-02, 9.138e-02, 9.796e-02, 1.437e-02, -6.912e-02, -1.500e-01, 1.108e-02, 8.537e-02)); + r += mul(s1_2, M4(1.272e-01, 1.039e-01, -1.040e-02, 5.735e-02, -9.561e-03, -7.849e-02, 2.013e-02, 6.743e-02, -1.308e-01, 2.097e-01, -2.586e-02, -2.612e-02, -1.021e-01, -2.057e-01, -3.857e-02, 1.757e-02)); + r += mul(s1_3, M4(8.053e-02, -6.616e-02, -1.770e-02, -1.982e-01, -2.444e-02, 7.095e-02, -3.175e-02, 1.033e-01, -5.762e-02, 3.046e-02, 1.113e-01, -7.795e-02, 7.733e-02, -2.446e-01, -9.412e-02, -1.653e-01)); + r += mul(s1_4, M4(3.202e-01, 3.417e-01, 2.862e-01, 1.982e-01, 2.573e-01, 8.468e-02, 1.595e-01, 4.027e-01, -1.133e-01, 1.141e-01, 3.135e-01, 8.849e-02, -3.401e-01, -4.237e-01, -9.999e-03, 1.012e-01)); + r += mul(s1_5, M4(2.600e-01, 5.980e-02, 8.030e-02, -2.103e-02, -1.986e-02, -5.828e-02, -1.421e-01, -1.034e-01, 4.901e-02, 4.389e-02, 5.034e-02, 1.400e-01, 6.483e-02, -2.524e-01, -5.724e-02, 6.231e-02)); + r += mul(s1_6, M4(1.074e-01, 3.976e-02, 3.519e-02, -4.123e-02, 6.299e-02, 5.759e-02, 6.204e-02, 4.752e-02, 5.410e-02, -4.425e-05, 4.521e-02, -8.902e-02, -5.916e-02, -2.006e-01, -1.372e-01, -1.440e-01)); + r += mul(s1_7, M4(9.065e-02, 2.786e-03, -7.057e-02, -7.517e-03, -4.347e-02, 6.086e-02, -2.635e-02, 4.724e-03, 1.253e-02, 4.647e-03, 2.887e-02, -1.678e-02, -8.265e-02, -6.195e-02, 1.822e-02, 7.331e-02)); + r += mul(s1_8, M4(4.428e-02, 6.706e-02, -4.415e-02, -1.130e-02, -1.310e-02, 4.253e-02, -9.984e-02, -1.037e-02, 3.263e-02, 8.474e-02, 7.599e-02, -3.215e-02, 4.988e-02, -1.178e-01, -1.416e-02, -2.848e-02)); + r += mul(s2_0, M4(8.826e-02, 8.038e-02, 7.920e-02, 9.084e-02, 6.145e-02, 8.284e-03, -5.767e-02, 9.238e-03, -4.508e-03, -8.890e-02, -1.910e-02, -1.507e-01, -7.447e-02, 4.104e-02, -2.612e-02, -8.667e-02)); + r += mul(s2_1, M4(-5.439e-02, 3.984e-01, 5.645e-02, -1.242e-01, -8.338e-02, -1.595e-01, -6.036e-02, 5.165e-02, 2.823e-01, 1.645e-01, 5.408e-02, 1.663e-01, 2.206e-02, -1.240e-01, -7.492e-02, 5.293e-02)); + r += mul(s2_2, M4(1.161e-02, 1.763e-01, 3.373e-02, 7.828e-03, 1.142e-01, 1.688e-01, 1.343e-01, 7.300e-02, 8.175e-02, 1.114e-01, -6.659e-02, 4.685e-02, 2.217e-02, -3.111e-02, 1.022e-01, -5.566e-02)); + r += mul(s2_3, M4(1.668e-02, 1.160e-01, 1.852e-01, 2.139e-01, -5.002e-02, 4.529e-02, -2.762e-02, 1.528e-01, 1.020e-01, -4.068e-02, -5.659e-02, 6.207e-03, 2.146e-02, -7.677e-02, -1.098e-02, -1.738e-01)); + r += mul(s2_4, M4(-3.080e-01, -1.794e-01, 3.752e-01, -1.512e-02, 6.082e-02, -1.906e-01, 4.469e-02, -1.824e-01, 5.373e-01, 2.499e-01, -3.037e-02, 4.862e-01, 2.590e-01, 3.245e-01, 1.882e-01, -5.488e-01)); + r += mul(s2_5, M4(1.734e-01, 1.910e-01, 1.513e-02, 5.352e-02, -6.647e-02, 5.546e-02, 4.049e-02, 1.364e-01, -3.987e-02, -2.656e-01, -1.042e-01, 3.166e-01, -9.156e-02, -1.295e-01, 7.885e-02, 2.314e-02)); + r += mul(s2_6, M4(9.283e-03, 4.879e-02, 7.797e-02, 3.678e-02, 1.426e-02, -4.030e-02, -1.420e-02, 1.217e-03, 3.934e-02, 8.811e-03, -3.593e-03, -9.359e-02, -2.613e-02, -6.882e-02, -1.049e-01, -6.001e-02)); + r += mul(s2_7, M4(-1.466e-01, -2.775e-02, -5.452e-02, -3.920e-02, 3.784e-02, -2.177e-02, 1.765e-03, -5.121e-03, 7.044e-02, -2.550e-02, 4.265e-02, 1.714e-01, 1.928e-02, -1.084e-01, -1.362e-01, -6.649e-02)); + r += mul(s2_8, M4(1.515e-02, 2.673e-02, -6.883e-02, 2.487e-02, -2.320e-02, -8.358e-02, -1.656e-02, -7.216e-03, -4.509e-03, 8.023e-02, 5.342e-02, -6.369e-02, -2.025e-02, 1.406e-02, -5.119e-02, 3.383e-02)); + r += mul(s3_0, M4(-9.426e-02, 2.166e-02, -3.618e-02, 1.094e-01, 2.509e-01, -4.044e-02, 5.655e-02, -3.421e-01, 8.115e-03, -1.962e-01, -2.723e-02, -7.238e-02, -1.999e-02, 4.283e-03, 2.814e-02, -1.090e-02)); + r += mul(s3_1, M4(-1.476e-01, -9.419e-04, -2.845e-01, -3.093e-02, 7.671e-02, 1.561e-01, 2.363e-01, -1.520e-01, -4.572e-02, -7.799e-02, 1.145e-01, 7.141e-02, -1.601e-02, -1.268e-01, -5.096e-02, -1.117e-01)); + r += mul(s3_2, M4(1.561e-01, -1.141e-01, -4.663e-02, -4.326e-02, 9.767e-02, -8.240e-02, 1.372e-01, -3.313e-02, -2.856e-02, 2.021e-01, 4.114e-02, -1.512e-01, -4.197e-03, -1.235e-01, 5.185e-02, -9.070e-02)); + r += mul(s3_3, M4(6.872e-02, 3.742e-02, -2.118e-02, -2.090e-02, -1.240e-02, -2.806e-02, -8.335e-03, 2.746e-02, -8.620e-02, -4.219e-02, 2.922e-02, 3.157e-02, 1.153e-01, -9.716e-02, -4.720e-02, -1.023e-01)); + r += mul(s3_4, M4(-2.349e-01, -4.080e-01, -3.222e-01, -4.920e-01, 1.183e-01, -4.490e-02, 1.509e-01, -7.753e-02, -8.539e-02, 7.595e-02, -1.085e-01, 2.213e-01, 2.203e-01, 4.651e-02, 4.022e-02, -4.619e-01)); + r += mul(s3_5, M4(1.305e-01, -6.924e-02, -2.362e-02, -1.763e-01, -7.495e-02, -5.263e-02, -2.810e-03, 3.534e-03, -4.620e-02, 1.199e-03, 1.183e-01, 7.935e-02, 7.310e-03, -1.576e-01, 5.596e-02, 1.310e-01)); + r += mul(s3_6, M4(1.163e-02, 5.437e-02, 9.811e-02, 8.154e-02, 1.875e-02, -5.344e-02, 1.110e-03, -1.606e-02, 1.176e-02, 3.321e-02, 7.622e-02, -1.049e-01, -4.287e-02, -2.004e-01, -1.664e-01, -1.601e-01)); + r += mul(s3_7, M4(-5.847e-02, 3.982e-02, -9.274e-02, -3.528e-02, 1.357e-02, -8.811e-02, 2.798e-02, 1.610e-02, -8.094e-02, 1.221e-01, 1.545e-01, 1.393e-01, 1.614e-02, -6.596e-03, -9.230e-02, 7.828e-02)); + r += mul(s3_8, M4(1.433e-02, 2.302e-02, 1.756e-03, 4.419e-02, 2.216e-02, -1.352e-01, -2.377e-02, -7.755e-02, -1.540e-01, 6.615e-02, -9.143e-04, -1.092e-01, -5.908e-02, 8.977e-03, -1.693e-01, 1.599e-01)); + r += V4(1.103e-02, -1.627e-02, -1.286e-02, -1.415e-02); + return r; +} + +V4 f1(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-5.521e-03, -3.227e-02, -8.959e-02, -2.310e-02, -3.505e-02, -1.074e-01, 1.005e-01, -1.186e-02, -2.056e-03, -1.544e-02, 1.421e-01, -8.042e-02, 1.062e-02, -6.143e-02, -4.901e-03, -9.454e-02)); + r += mul(s0_1, M4(3.801e-02, -5.568e-02, 3.259e-02, 6.786e-02, -6.511e-02, 5.286e-02, 1.561e-02, -4.836e-02, -9.207e-02, -1.990e-01, 4.230e-01, 2.050e-02, 4.370e-02, 1.434e-01, -5.622e-02, 6.287e-02)); + r += mul(s0_2, M4(-7.980e-02, 5.040e-02, -2.226e-02, -2.332e-02, -1.077e-02, -1.836e-02, -2.621e-02, -1.471e-02, 2.554e-02, 4.099e-02, 1.355e-01, -1.841e-01, 8.085e-03, -3.333e-02, 8.552e-03, -2.047e-02)); + r += mul(s0_3, M4(6.407e-02, 1.156e-01, -1.245e-01, -4.790e-02, -1.968e-01, -5.708e-02, 5.560e-02, 3.975e-01, -3.533e-02, -1.222e-01, -1.292e-02, -6.471e-02, -4.069e-03, -4.856e-02, 2.772e-02, -2.131e-01)); + r += mul(s0_4, M4(5.784e-03, -4.214e-01, 9.652e-02, 2.624e-01, -4.463e-01, -3.606e-01, -3.593e-02, 2.150e-01, 1.693e-01, 1.568e-01, -4.593e-02, -3.257e-01, 7.479e-02, -8.113e-03, 3.176e-01, 2.823e-01)); + r += mul(s0_5, M4(-4.752e-02, 1.916e-01, -1.042e-01, -1.253e-02, -2.057e-02, -3.405e-02, -5.519e-02, -3.911e-02, 2.241e-01, -1.885e-02, 1.204e-01, 4.924e-02, 2.986e-02, 5.848e-02, -3.441e-02, -7.179e-02)); + r += mul(s0_6, M4(6.014e-02, 4.232e-02, -5.073e-02, -2.059e-02, -4.711e-02, -1.640e-01, 9.222e-02, 2.780e-01, -1.505e-03, -2.975e-02, 4.008e-02, -2.294e-02, 6.812e-02, 5.715e-03, -1.852e-01, -8.323e-02)); + r += mul(s0_7, M4(6.323e-02, -4.207e-02, 2.370e-02, 1.695e-01, -6.565e-02, 1.543e-01, -6.446e-02, -5.231e-02, 8.916e-03, -8.248e-03, 3.969e-02, 9.619e-02, 1.804e-01, -1.653e-01, 1.140e-01, 2.200e-01)); + r += mul(s0_8, M4(8.670e-03, -3.521e-02, -1.453e-01, -9.260e-02, 2.707e-02, 1.519e-01, -8.643e-02, -1.226e-01, 4.304e-02, 7.913e-03, 1.759e-02, 2.059e-01, 1.695e-02, -1.457e-02, 1.015e-01, -5.574e-02)); + r += mul(s1_0, M4(-9.047e-04, -7.526e-02, 3.870e-02, -3.091e-03, -3.185e-02, -3.210e-02, -5.562e-02, 1.604e-01, -4.968e-02, 3.186e-02, 1.647e-01, 4.125e-02, -5.160e-02, -1.243e-02, -4.020e-02, -8.829e-02)); + r += mul(s1_1, M4(2.446e-02, -1.086e-01, 1.076e-01, 1.603e-01, -1.886e-01, 6.601e-02, 2.700e-03, -1.031e-02, -1.411e-01, -1.737e-02, -1.220e-02, 1.722e-01, -9.362e-02, 8.900e-02, 3.836e-02, 2.557e-02)); + r += mul(s1_2, M4(5.523e-02, 1.215e-01, 2.999e-02, -7.301e-02, -1.061e-01, -2.018e-02, 1.581e-03, 3.590e-02, -7.798e-02, -2.899e-02, 8.488e-02, 6.095e-02, -5.692e-03, 4.157e-02, -4.302e-02, 8.434e-02)); + r += mul(s1_3, M4(4.727e-02, -1.131e-01, 1.154e-02, -3.369e-01, -2.170e-02, -8.931e-02, 1.535e-01, 8.759e-02, 4.050e-02, -1.016e-01, 8.183e-02, -1.638e-01, 3.286e-02, -2.050e-01, -9.847e-02, 8.546e-02)); + r += mul(s1_4, M4(8.860e-02, -4.114e-01, 3.215e-01, 3.164e-01, -3.487e-01, -4.634e-01, 1.398e-01, 3.320e-01, 1.261e-01, -1.121e-01, 5.128e-02, 2.666e-01, -4.104e-04, -4.406e-01, -1.674e-01, 2.686e-01)); + r += mul(s1_5, M4(1.196e-01, 7.047e-04, 1.721e-01, 1.966e-02, -3.580e-02, 1.681e-02, -8.139e-02, 1.200e-01, 2.414e-02, 8.583e-02, 5.284e-02, -8.748e-03, -1.313e-01, 8.085e-02, 2.055e-02, -4.308e-02)); + r += mul(s1_6, M4(2.875e-02, -6.798e-02, 3.081e-02, 9.796e-02, -8.332e-03, -1.172e-01, 6.169e-02, 2.643e-02, 7.465e-03, -9.946e-02, 6.580e-02, -9.836e-02, 5.662e-02, 1.801e-02, -8.294e-02, -1.172e-01)); + r += mul(s1_7, M4(5.495e-02, -9.538e-04, -3.587e-02, 1.118e-01, -4.600e-02, 2.166e-01, 6.635e-02, 2.927e-02, 5.700e-02, -5.216e-02, 4.287e-02, -3.235e-02, 2.396e-01, -2.299e-01, -1.761e-01, -9.716e-02)); + r += mul(s1_8, M4(5.748e-02, 2.837e-02, -5.760e-02, 4.236e-02, 2.148e-02, 7.319e-02, -7.836e-02, -1.546e-01, -1.942e-02, 2.458e-02, 1.181e-01, 7.293e-02, -2.915e-02, -2.068e-02, -3.460e-02, -1.232e-01)); + r += mul(s2_0, M4(3.632e-02, -1.866e-02, 2.030e-01, -4.521e-02, 8.081e-02, 8.579e-02, 3.637e-02, -7.211e-02, -7.259e-02, -9.637e-02, -3.099e-02, 8.137e-03, -5.767e-03, 1.281e-02, 2.569e-02, 1.671e-02)); + r += mul(s2_1, M4(1.033e-01, 1.037e-02, 3.472e-01, 3.228e-02, -1.171e-01, 2.538e-02, -5.485e-02, 2.071e-02, 4.456e-02, -1.482e-01, 4.948e-02, 1.478e-01, 1.292e-02, -3.387e-02, 1.172e-02, -5.736e-02)); + r += mul(s2_2, M4(-5.565e-03, 3.590e-02, 5.145e-02, -4.043e-02, -3.857e-02, -1.070e-01, 1.745e-01, 8.157e-02, -2.818e-02, 8.915e-02, 1.199e-01, 1.283e-03, 7.934e-02, -5.920e-02, -1.159e-02, -1.067e-01)); + r += mul(s2_3, M4(4.071e-02, -6.976e-02, 4.140e-02, 1.077e-01, 2.992e-02, 4.067e-02, -3.996e-02, 1.372e-01, 1.240e-02, -1.392e-01, 8.767e-02, -5.693e-02, -5.435e-02, -1.238e-01, 1.790e-02, -1.646e-01)); + r += mul(s2_4, M4(1.929e-01, 2.386e-01, -1.810e-01, 4.484e-01, -2.357e-02, -6.054e-02, -6.168e-02, -2.420e-01, -6.921e-02, -3.946e-01, -2.529e-01, 1.010e-01, 3.271e-01, -6.237e-02, -1.207e-02, -1.547e-01)); + r += mul(s2_5, M4(-1.669e-02, -7.439e-02, 1.247e-01, 8.483e-02, 1.398e-01, -2.795e-02, -8.120e-02, 6.695e-02, 9.151e-02, 3.799e-03, -2.224e-01, 2.380e-01, 9.462e-02, -1.340e-01, -1.219e-01, 4.606e-02)); + r += mul(s2_6, M4(-6.699e-03, 7.497e-02, 7.645e-02, 8.640e-02, -1.486e-02, -3.314e-02, 2.684e-02, -6.462e-02, 3.503e-03, -4.940e-02, 7.803e-02, -4.800e-02, -3.313e-03, -6.215e-02, -1.157e-02, 4.294e-02)); + r += mul(s2_7, M4(5.624e-02, 2.786e-01, -6.348e-02, -8.999e-02, -1.007e-01, 3.742e-03, 1.282e-02, -3.012e-02, 7.205e-02, -4.481e-03, 5.465e-02, -8.988e-02, 5.866e-02, 1.780e-01, -3.760e-01, -2.454e-01)); + r += mul(s2_8, M4(9.374e-03, -7.492e-03, -9.421e-02, -2.475e-02, -2.297e-03, 6.944e-02, 2.745e-02, 7.689e-02, 5.201e-03, 4.984e-02, 1.676e-01, 1.915e-02, 3.006e-03, -9.448e-02, 2.945e-02, 4.559e-02)); + r += mul(s3_0, M4(4.476e-02, 2.980e-01, -1.164e-01, -1.511e-01, 1.188e-01, -3.359e-01, 2.101e-01, -3.195e-01, -2.468e-03, 5.351e-02, -1.329e-01, -1.496e-01, -8.304e-02, 4.541e-02, -8.868e-03, 3.964e-03)); + r += mul(s3_1, M4(-1.505e-01, 2.723e-02, -9.004e-02, 2.151e-01, -3.771e-02, -1.941e-01, 3.681e-01, -2.844e-01, 1.730e-01, 2.429e-02, -2.395e-01, 1.791e-02, -9.777e-02, 5.106e-02, -6.921e-03, -9.913e-02)); + r += mul(s3_2, M4(4.079e-02, 7.965e-02, -1.219e-01, -1.476e-01, -8.922e-02, -1.848e-01, 9.943e-02, -6.997e-02, -6.066e-02, 1.087e-01, 2.364e-02, -1.383e-01, 3.358e-02, -1.140e-01, -1.239e-02, -1.002e-01)); + r += mul(s3_3, M4(-2.038e-02, -2.087e-01, -2.781e-02, 2.218e-01, -4.068e-03, -2.081e-01, -2.048e-01, -1.173e-01, 4.122e-02, 1.402e-01, -1.797e-03, 1.284e-01, -6.767e-02, -6.230e-02, -1.694e-01, 2.256e-02)); + r += mul(s3_4, M4(1.255e-01, 2.984e-01, -5.116e-01, 3.584e-01, -1.813e-01, -3.424e-01, 1.837e-01, -5.376e-03, -2.635e-01, -1.358e-01, -5.520e-01, -4.240e-02, 1.161e-01, -6.542e-02, -1.056e-01, -4.898e-02)); + r += mul(s3_5, M4(-1.399e-02, -5.929e-02, -3.799e-02, 5.016e-02, 6.597e-02, -7.250e-02, -9.893e-02, 1.723e-01, 2.748e-01, 2.064e-02, -1.016e-01, -1.385e-02, -2.072e-02, -2.790e-02, -6.064e-02, -2.727e-02)); + r += mul(s3_6, M4(-1.990e-02, -8.099e-02, 2.959e-02, -9.899e-02, -6.404e-02, -7.691e-02, 1.050e-01, 4.486e-02, 6.109e-02, -5.415e-02, 2.468e-02, -3.233e-02, -3.263e-02, 5.391e-02, -2.056e-01, -7.300e-02)); + r += mul(s3_7, M4(-6.814e-02, 1.238e-01, 3.873e-02, -2.108e-02, -1.586e-01, -2.624e-02, -1.219e-02, -1.521e-01, 1.786e-01, -8.109e-02, 2.714e-02, -8.674e-02, 2.940e-02, -4.832e-02, -1.425e-01, 4.084e-02)); + r += mul(s3_8, M4(2.428e-02, -4.195e-02, -6.436e-02, -1.113e-01, -9.072e-03, 1.545e-02, 4.824e-02, -1.465e-01, -4.214e-02, -1.313e-01, -6.468e-02, 2.691e-02, 2.508e-02, 1.355e-01, -1.529e-01, -2.560e-02)); + r += V4(3.107e-02, -3.014e-02, 6.615e-03, -1.582e-02); + return r; +} + +void Pass6(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = Rmp8x8(tid.x) + blockStart; + uint2 size = GetInputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = (gxy + 0.5) * pt; + + V4 s0_0 = l0(-1.0, -1.0); + V4 s0_1 = l0(0.0, -1.0); + V4 s0_2 = l0(1.0, -1.0); + V4 s0_3 = l0(-1.0, 0.0); + V4 s0_4 = l0(0.0, 0.0); + V4 s0_5 = l0(1.0, 0.0); + V4 s0_6 = l0(-1.0, 1.0); + V4 s0_7 = l0(0.0, 1.0); + V4 s0_8 = l0(1.0, 1.0); + V4 s1_0 = -max(-s0_0, 0.0); + V4 s1_1 = -max(-s0_1, 0.0); + V4 s1_2 = -max(-s0_2, 0.0); + V4 s1_3 = -max(-s0_3, 0.0); + V4 s1_4 = -max(-s0_4, 0.0); + V4 s1_5 = -max(-s0_5, 0.0); + V4 s1_6 = -max(-s0_6, 0.0); + V4 s1_7 = -max(-s0_7, 0.0); + V4 s1_8 = -max(-s0_8, 0.0); + s0_0 = max(s0_0, 0.0); + s0_1 = max(s0_1, 0.0); + s0_2 = max(s0_2, 0.0); + s0_3 = max(s0_3, 0.0); + s0_4 = max(s0_4, 0.0); + s0_5 = max(s0_5, 0.0); + s0_6 = max(s0_6, 0.0); + s0_7 = max(s0_7, 0.0); + s0_8 = max(s0_8, 0.0); + + V4 s2_0 = l1(-1.0, -1.0); + V4 s2_1 = l1(0.0, -1.0); + V4 s2_2 = l1(1.0, -1.0); + V4 s2_3 = l1(-1.0, 0.0); + V4 s2_4 = l1(0.0, 0.0); + V4 s2_5 = l1(1.0, 0.0); + V4 s2_6 = l1(-1.0, 1.0); + V4 s2_7 = l1(0.0, 1.0); + V4 s2_8 = l1(1.0, 1.0); + V4 s3_0 = -max(-s2_0, 0.0); + V4 s3_1 = -max(-s2_1, 0.0); + V4 s3_2 = -max(-s2_2, 0.0); + V4 s3_3 = -max(-s2_3, 0.0); + V4 s3_4 = -max(-s2_4, 0.0); + V4 s3_5 = -max(-s2_5, 0.0); + V4 s3_6 = -max(-s2_6, 0.0); + V4 s3_7 = -max(-s2_7, 0.0); + V4 s3_8 = -max(-s2_8, 0.0); + s2_0 = max(s2_0, 0.0); + s2_1 = max(s2_1, 0.0); + s2_2 = max(s2_2, 0.0); + s2_3 = max(s2_3, 0.0); + s2_4 = max(s2_4, 0.0); + s2_5 = max(s2_5, 0.0); + s2_6 = max(s2_6, 0.0); + s2_7 = max(s2_7, 0.0); + s2_8 = max(s2_8, 0.0); + + t2[gxy] = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8); + t3[gxy] = f1(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8); +} + +//!PASS 7 +//!DESC conv6 +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 +//!IN t2, t3 +//!OUT t0, t1 + +#define l0(x, y) V4(O(t2, float2(x, y))) +#define l1(x, y) V4(O(t3, float2(x, y))) + +V4 f0(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8) { + V4 r = 0.0; + r += mul(s0_0, M4(2.404e-02, 2.997e-02, -3.284e-02, -5.164e-02, -8.224e-02, 1.916e-02, -5.887e-02, -1.108e-01, 5.058e-02, -9.101e-02, -2.799e-02, -1.015e-01, -2.853e-03, -5.750e-02, -3.651e-02, 7.911e-02)); + r += mul(s0_1, M4(7.598e-02, -4.379e-03, -1.111e-01, 1.520e-01, 6.809e-02, 2.420e-02, -1.512e-02, -8.763e-02, -5.779e-02, 2.712e-03, 2.095e-01, -1.363e-02, 6.453e-03, -8.446e-02, -4.731e-02, 2.419e-02)); + r += mul(s0_2, M4(7.891e-02, -1.816e-02, 7.892e-02, 8.296e-02, -1.422e-02, 5.360e-02, 8.078e-02, -2.628e-02, -6.979e-03, -2.700e-02, -8.674e-02, 8.292e-02, -1.558e-02, -4.723e-02, -1.121e-01, 6.815e-02)); + r += mul(s0_3, M4(2.828e-02, -4.739e-02, -2.074e-01, -3.196e-01, -3.889e-02, 8.126e-02, 1.927e-01, 2.481e-01, 1.304e-01, -2.371e-02, -3.977e-02, -9.958e-02, -1.919e-03, 3.208e-02, 4.055e-02, -1.030e-01)); + r += mul(s0_4, M4(-1.040e-01, 1.768e-01, -8.376e-02, 4.783e-01, -2.102e-01, -2.036e-01, 2.606e-01, -5.867e-02, 1.840e-01, -9.110e-02, 9.612e-02, 2.183e-01, -1.455e-01, 1.636e-01, 2.425e-01, -2.316e-01)); + r += mul(s0_5, M4(1.393e-01, -7.825e-02, -6.535e-02, 6.115e-02, 7.806e-02, -7.575e-02, 2.447e-03, -1.255e-02, -8.062e-02, -1.768e-02, 1.831e-02, 1.318e-02, -1.194e-01, 1.821e-02, -6.475e-02, 9.178e-02)); + r += mul(s0_6, M4(2.158e-02, 5.031e-02, 5.894e-02, -2.206e-02, 1.642e-02, -4.703e-02, 7.177e-03, 4.832e-02, -6.795e-03, 1.200e-01, 7.350e-02, 4.357e-02, -1.374e-02, -2.273e-02, 5.343e-02, -3.053e-02)); + r += mul(s0_7, M4(-2.053e-03, 2.418e-01, -7.675e-02, 7.563e-02, 1.879e-01, -5.891e-02, 1.363e-02, -5.479e-02, -2.454e-01, 3.717e-02, -6.543e-02, -9.897e-02, 1.506e-01, -1.457e-02, 7.962e-02, 2.634e-02)); + r += mul(s0_8, M4(-4.787e-02, 7.421e-02, 4.307e-02, -1.165e-01, -1.552e-01, -2.697e-02, -9.967e-02, 3.872e-02, -6.328e-02, 1.037e-01, -3.953e-02, 8.554e-02, 4.862e-02, -2.809e-02, -2.267e-02, -1.011e-02)); + r += mul(s1_0, M4(6.553e-02, -3.868e-03, -3.811e-02, 6.105e-03, 8.599e-03, 4.356e-02, 7.104e-02, -1.001e-01, -8.656e-02, -2.863e-02, 4.224e-02, -4.758e-02, 8.669e-04, 2.007e-02, 4.083e-02, 7.794e-02)); + r += mul(s1_1, M4(-2.462e-02, -1.574e-02, -4.985e-03, 1.459e-01, 1.573e-03, 8.120e-02, -1.362e-01, -1.597e-01, -2.973e-02, -2.999e-01, 1.528e-03, 4.741e-01, 9.943e-02, 7.836e-02, 1.532e-02, -4.459e-02)); + r += mul(s1_2, M4(1.434e-02, -2.119e-02, -3.105e-02, -1.281e-02, -1.791e-01, -3.910e-02, 5.519e-02, 1.343e-01, -1.333e-01, -8.837e-02, -1.076e-01, 1.067e-01, -1.577e-02, 6.211e-02, 1.116e-02, -6.399e-02)); + r += mul(s1_3, M4(-1.004e-01, 2.091e-02, -5.478e-02, -1.756e-01, -9.005e-02, 9.037e-02, 1.250e-01, 8.268e-02, 1.398e-01, -1.338e-01, -1.158e-01, -6.447e-02, 4.636e-02, 8.153e-02, 3.763e-02, -5.705e-02)); + r += mul(s1_4, M4(3.115e-01, -3.808e-01, 1.332e-01, 8.542e-02, 1.126e-01, -1.795e-01, 2.202e-01, 1.600e-01, 1.475e-01, 1.186e-01, 1.995e-01, -1.733e-01, -4.463e-01, 5.858e-01, 7.088e-02, -4.531e-01)); + r += mul(s1_5, M4(-5.391e-02, 5.806e-02, 7.177e-02, 2.734e-01, -1.093e-01, -7.192e-02, -2.031e-03, -9.404e-02, -2.599e-02, -2.688e-03, 2.064e-02, 1.819e-01, 8.417e-02, -3.743e-02, -5.253e-02, -2.005e-01)); + r += mul(s1_6, M4(1.709e-02, 5.473e-02, 1.583e-02, -1.412e-01, 3.210e-02, -5.364e-02, -1.279e-02, -4.324e-02, -2.110e-01, 6.215e-02, -7.099e-02, 1.011e-01, -3.931e-03, -3.861e-03, 2.847e-02, 9.082e-02)); + r += mul(s1_7, M4(-2.610e-01, 1.499e-01, -5.311e-02, 1.480e-02, 1.285e-02, -1.043e-01, -1.002e-01, -3.947e-02, -1.508e-01, 1.144e-01, 1.443e-01, -3.456e-02, 1.332e-01, 1.841e-01, 2.120e-01, -6.647e-03)); + r += mul(s1_8, M4(-1.090e-02, -3.561e-02, 3.492e-02, -7.376e-02, -8.500e-02, -4.378e-02, -1.281e-02, 2.313e-02, -2.974e-01, -1.025e-01, -5.699e-02, 2.294e-02, -4.649e-02, 6.585e-02, 7.421e-02, -6.087e-02)); + r += mul(s2_0, M4(9.719e-02, -1.495e-02, 1.597e-01, 6.545e-03, 1.616e-02, -1.136e-03, 4.194e-02, -2.144e-02, -4.504e-02, -2.040e-02, 3.672e-02, 7.161e-02, 5.032e-02, 7.780e-02, 7.739e-02, 6.251e-02)); + r += mul(s2_1, M4(1.598e-01, 7.514e-02, -3.737e-02, -4.716e-02, -1.324e-01, 1.908e-02, -2.415e-02, -6.085e-02, 9.660e-02, 5.538e-02, -6.763e-02, -8.017e-03, 4.100e-02, -4.304e-03, 9.956e-02, 3.581e-02)); + r += mul(s2_2, M4(4.912e-02, -3.518e-02, -3.550e-02, 5.028e-02, 8.666e-02, 1.122e-01, -1.027e-02, -1.043e-01, 8.323e-02, 4.898e-03, -1.090e-02, -1.912e-02, 2.538e-02, -5.575e-03, 4.678e-02, -5.409e-02)); + r += mul(s2_3, M4(8.412e-03, 1.402e-01, 2.510e-01, -2.978e-02, 2.691e-02, -7.400e-02, -1.719e-01, -2.765e-02, 7.918e-02, -8.331e-03, -2.848e-02, 1.808e-01, -5.017e-02, -1.434e-02, -5.966e-02, 4.193e-04)); + r += mul(s2_4, M4(-7.351e-02, -2.898e-01, -3.926e-01, -2.116e-01, 1.478e-01, -9.418e-02, -1.530e-01, -2.963e-01, -1.190e-01, 4.534e-01, -2.833e-01, -2.530e-01, 2.825e-01, -2.388e-02, 7.258e-02, 4.468e-02)); + r += mul(s2_5, M4(-7.228e-02, 4.241e-02, -1.818e-02, -4.262e-02, -1.139e-01, -5.711e-02, -7.106e-02, -7.861e-02, -4.809e-02, 1.474e-01, -7.394e-03, -4.692e-02, 2.199e-02, 1.038e-01, -5.060e-02, 8.474e-02)); + r += mul(s2_6, M4(1.236e-01, -7.740e-02, 4.034e-02, 2.473e-02, -1.046e-05, 4.154e-02, -5.698e-03, 2.456e-02, -5.245e-02, -1.311e-02, -1.292e-01, -5.838e-02, -4.741e-02, -1.506e-02, -5.012e-02, 2.703e-03)); + r += mul(s2_7, M4(8.191e-02, 1.102e-01, 4.677e-02, -1.667e-02, -2.850e-01, 1.548e-01, -4.856e-03, 1.074e-03, 1.559e-02, 3.353e-02, 2.302e-02, -4.748e-02, -7.978e-02, -1.328e-02, -8.056e-02, 1.167e-02)); + r += mul(s2_8, M4(6.904e-02, -2.015e-02, 7.204e-02, -3.156e-02, -1.374e-01, 5.652e-02, 5.052e-02, -4.269e-02, 3.874e-02, 1.011e-02, 6.918e-02, -5.973e-02, 1.694e-01, 6.863e-02, 8.218e-02, 4.696e-02)); + r += mul(s3_0, M4(1.036e-02, -9.171e-02, 2.046e-01, 1.921e-02, 2.592e-03, -3.041e-02, -1.027e-01, -1.301e-01, -9.272e-03, 5.752e-02, 4.755e-02, -1.453e-02, -3.280e-03, -3.442e-02, -1.207e-02, -2.463e-02)); + r += mul(s3_1, M4(2.136e-01, -2.675e-02, -1.771e-01, 2.694e-02, 3.292e-02, 3.093e-02, 2.271e-01, 2.195e-01, -5.501e-02, 5.664e-03, -2.300e-01, 3.389e-02, -6.249e-02, 3.345e-02, -5.372e-02, -5.311e-02)); + r += mul(s3_2, M4(3.520e-02, -1.165e-01, -7.715e-02, 3.538e-02, 2.150e-01, 1.602e-01, 1.783e-01, -6.312e-02, 1.099e-01, 1.013e-01, -6.535e-02, -1.370e-01, 2.222e-02, 8.245e-02, 3.791e-02, -5.384e-02)); + r += mul(s3_3, M4(4.063e-03, -2.201e-01, 6.289e-02, 1.063e-01, 7.458e-02, -9.281e-02, -1.792e-01, -1.193e-01, -2.276e-02, -2.212e-02, -1.820e-01, -3.791e-02, 6.566e-02, 3.899e-02, 3.693e-02, 2.944e-02)); + r += mul(s3_4, M4(-5.110e-01, -3.091e-01, -7.583e-01, 2.226e-01, -4.668e-02, -4.517e-01, -8.393e-03, -3.556e-01, -6.915e-01, 1.907e-01, -5.686e-01, -5.042e-02, 5.118e-01, 1.140e-01, 3.401e-01, -2.682e-02)); + r += mul(s3_5, M4(-7.635e-03, -9.166e-02, -2.271e-02, -5.200e-02, 1.570e-02, -5.974e-03, 1.862e-01, 7.035e-02, -2.859e-01, 4.639e-02, 4.377e-02, -4.687e-03, 1.782e-01, 1.578e-01, 3.609e-02, -2.364e-02)); + r += mul(s3_6, M4(1.410e-02, -1.417e-01, -9.227e-02, 8.895e-03, 8.245e-02, 1.675e-03, 1.763e-02, -4.726e-02, -3.146e-02, -4.661e-02, -1.085e-01, 6.988e-02, 5.238e-02, 8.178e-02, 7.645e-02, -6.760e-02)); + r += mul(s3_7, M4(2.610e-01, 1.194e-02, -1.065e-02, -9.494e-03, -1.750e-02, 1.167e-02, 2.371e-02, 3.010e-02, 7.709e-02, 2.302e-02, 9.363e-02, 2.560e-02, -1.188e-01, -6.296e-02, -2.176e-02, -1.106e-01)); + r += mul(s3_8, M4(1.396e-01, -1.282e-01, 3.914e-02, -2.227e-02, -1.906e-02, 5.945e-02, -1.260e-02, -7.651e-02, 8.742e-02, 1.698e-02, 8.794e-02, -3.933e-02, 2.223e-02, -2.413e-03, -2.701e-02, -4.654e-02)); + r += V4(1.289e-02, -6.634e-03, 3.674e-02, 1.609e-03); + return r; +} + +V4 f1(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8) { + V4 r = 0.0; + r += mul(s0_0, M4(1.600e-02, -1.109e-01, 7.068e-02, -1.811e-01, 1.063e-02, -6.863e-02, -6.434e-02, 1.375e-02, 2.456e-01, -4.348e-02, 5.149e-02, 2.022e-02, -3.151e-02, 1.061e-02, 1.882e-02, 3.657e-02)); + r += mul(s0_1, M4(6.848e-02, 6.202e-02, 6.749e-02, 2.417e-01, 8.964e-02, 1.551e-01, 3.107e-03, 5.573e-02, -1.239e-01, -6.104e-02, 2.686e-01, -1.557e-01, -2.527e-02, 3.832e-02, -4.138e-02, 1.948e-01)); + r += mul(s0_2, M4(-2.463e-01, -3.228e-02, 5.194e-02, -1.168e-01, -8.813e-02, -2.266e-02, -8.269e-03, 8.535e-02, 2.962e-02, 4.934e-02, 1.222e-02, -2.672e-02, 8.425e-02, 7.315e-02, -1.661e-03, 6.929e-02)); + r += mul(s0_3, M4(4.423e-02, -5.269e-02, -8.159e-02, -4.065e-02, -1.822e-01, 1.176e-01, 5.985e-02, 1.526e-01, 6.602e-02, -1.554e-01, -9.981e-02, -5.084e-02, -2.635e-02, -1.488e-01, -3.293e-02, -1.259e-01)); + r += mul(s0_4, M4(5.130e-01, 1.827e-02, -8.425e-02, -1.359e-01, 6.076e-02, -3.010e-02, -3.517e-02, -1.604e-01, 6.842e-02, 4.031e-01, -4.483e-01, 1.444e-01, 7.936e-02, 2.010e-01, 1.000e-02, 8.051e-02)); + r += mul(s0_5, M4(1.784e-02, -5.340e-02, 8.986e-03, -8.302e-02, 1.744e-01, -5.748e-02, 3.942e-02, 1.104e-02, -1.938e-01, -5.557e-02, -6.293e-03, -1.411e-01, 7.521e-03, 9.413e-02, 2.034e-02, 1.249e-01)); + r += mul(s0_6, M4(2.540e-02, 2.131e-01, 4.611e-02, 9.382e-02, 5.992e-02, -6.154e-02, -3.255e-02, -4.284e-02, -1.709e-02, 3.054e-02, -7.711e-02, -3.413e-02, 2.668e-02, 7.784e-03, 1.578e-01, -3.615e-03)); + r += mul(s0_7, M4(-6.617e-02, -1.114e-01, 3.306e-02, 2.025e-02, -2.133e-01, -2.866e-01, 1.364e-01, 2.138e-02, 2.444e-02, -1.753e-02, 3.907e-02, 6.912e-03, -3.994e-02, -2.617e-02, 1.246e-02, -3.568e-02)); + r += mul(s0_8, M4(1.790e-02, -6.453e-02, 1.921e-02, -2.243e-02, 9.646e-02, 2.163e-01, -5.867e-02, 3.342e-02, 5.237e-02, 1.622e-01, -1.256e-01, 1.834e-02, 1.350e-01, 3.223e-02, -1.533e-02, 2.442e-02)); + r += mul(s1_0, M4(-6.017e-02, -1.388e-01, 9.635e-02, -5.857e-02, 4.819e-02, -8.395e-02, -2.810e-02, -5.550e-02, 1.881e-01, 4.630e-02, 5.251e-02, 1.190e-02, -5.155e-02, -4.143e-02, 4.654e-02, 1.323e-01)); + r += mul(s1_1, M4(-1.534e-01, 2.133e-01, 7.453e-03, 3.310e-01, 3.330e-01, -2.181e-01, 7.039e-03, -3.036e-01, 5.444e-02, 2.537e-02, 2.069e-01, -4.402e-01, -1.355e-01, 2.013e-01, -5.209e-02, 8.730e-02)); + r += mul(s1_2, M4(-1.847e-01, -1.391e-01, 1.870e-02, 1.309e-01, 2.844e-01, 3.281e-02, 8.661e-02, -1.124e-01, -2.647e-01, -1.385e-01, 4.175e-02, -2.057e-01, -2.192e-02, -4.144e-02, -1.024e-02, 1.893e-01)); + r += mul(s1_3, M4(6.497e-02, -1.624e-01, -1.987e-01, -9.848e-02, 2.015e-02, -1.708e-01, 1.357e-02, -7.956e-03, 6.654e-02, 1.122e-01, 5.543e-02, 1.017e-01, -9.423e-02, -6.570e-02, 2.641e-02, -1.932e-02)); + r += mul(s1_4, M4(5.957e-01, -3.290e-03, -2.924e-02, -1.725e-01, 3.083e-01, -2.819e-01, -3.768e-02, -1.529e-01, -1.565e-01, 1.963e-01, -3.850e-01, -1.976e-02, 1.505e-01, -6.149e-02, 1.786e-01, -7.251e-02)); + r += mul(s1_5, M4(4.111e-01, 2.475e-01, 3.496e-03, -1.918e-02, 3.022e-01, -3.534e-02, -1.221e-01, -1.536e-02, 2.677e-03, -5.321e-02, -4.602e-03, -3.425e-02, -9.627e-02, 1.600e-01, -1.031e-02, 1.667e-01)); + r += mul(s1_6, M4(-1.234e-01, -8.749e-03, 2.104e-01, 4.344e-02, 7.180e-03, -2.356e-01, -2.194e-01, -7.217e-02, 5.686e-02, 1.327e-01, -1.764e-01, 3.995e-02, -4.611e-02, 5.706e-02, 1.884e-01, 5.417e-02)); + r += mul(s1_7, M4(-2.653e-02, -8.258e-02, -1.446e-01, -1.117e-02, 7.767e-02, -2.549e-01, 3.667e-02, -1.282e-02, -6.408e-03, -1.133e-01, -3.932e-01, -2.699e-02, -8.717e-02, -6.648e-02, 6.511e-03, -5.576e-02)); + r += mul(s1_8, M4(-1.220e-01, -7.955e-02, -6.599e-02, 1.149e-02, 9.638e-02, 1.366e-01, -2.627e-02, 8.338e-03, 1.672e-01, 1.442e-01, -1.766e-01, -1.002e-03, 7.156e-02, -8.644e-02, 6.749e-02, 4.908e-02)); + r += mul(s2_0, M4(-7.895e-02, -4.986e-02, 9.949e-02, -6.798e-03, 6.860e-02, 9.700e-04, -2.217e-02, -3.504e-02, 3.005e-02, 3.853e-02, 9.426e-02, -1.053e-02, -9.779e-02, -5.977e-02, 1.559e-02, 1.355e-03)); + r += mul(s2_1, M4(-4.166e-02, 2.806e-02, 3.031e-02, -1.847e-01, 5.010e-02, -2.266e-01, 6.752e-02, -8.594e-02, -1.181e-01, -3.677e-02, -4.894e-02, -3.854e-01, -9.499e-02, 8.388e-02, 2.762e-02, -6.678e-02)); + r += mul(s2_2, M4(-5.632e-02, 1.572e-02, 1.683e-02, 7.935e-02, 9.419e-02, 1.391e-01, 7.486e-03, -9.942e-02, 4.651e-02, 6.332e-03, -9.859e-04, 3.178e-02, -1.804e-01, -1.141e-01, -1.244e-02, -2.914e-01)); + r += mul(s2_3, M4(-9.909e-02, -9.091e-02, -1.990e-01, -6.067e-02, 6.513e-02, 3.841e-02, -1.060e-01, 9.766e-03, -5.435e-02, 1.849e-01, -1.739e-01, 3.043e-02, 2.413e-02, -1.910e-02, -1.332e-02, 2.362e-02)); + r += mul(s2_4, M4(2.024e-02, -1.499e-01, -2.345e-01, 6.952e-02, 1.034e-01, 8.021e-03, 5.147e-02, 4.872e-02, -5.598e-02, -1.413e-01, 1.956e-01, -1.350e-02, -8.105e-02, -4.961e-03, -4.300e-03, 5.564e-02)); + r += mul(s2_5, M4(2.284e-02, 3.897e-02, -3.260e-02, -6.460e-02, -1.718e-01, -6.209e-02, 1.432e-02, -8.207e-02, 5.573e-03, 1.411e-01, -7.778e-02, 6.243e-02, -5.605e-02, -1.684e-01, 1.622e-02, -1.153e-01)); + r += mul(s2_6, M4(-1.053e-01, 4.113e-02, 1.887e-01, 5.750e-02, -5.854e-03, 8.616e-02, -1.401e-02, -3.050e-03, 2.563e-02, -1.300e-02, 4.781e-02, -8.556e-03, 2.668e-02, 1.663e-02, 1.541e-02, 1.076e-02)); + r += mul(s2_7, M4(3.180e-02, 1.162e-01, 1.821e-01, -1.556e-02, 2.421e-02, 9.821e-03, -3.662e-02, -1.845e-02, 1.169e-01, 1.404e-01, -7.214e-02, -7.006e-03, 4.773e-02, -8.450e-02, -1.174e-01, -1.970e-02)); + r += mul(s2_8, M4(-1.512e-02, -1.228e-01, 8.843e-02, -5.915e-03, 7.202e-02, 7.004e-02, -3.259e-02, -3.609e-02, 2.087e-02, -6.377e-02, 1.081e-01, -2.104e-02, -5.860e-02, -1.030e-01, -1.644e-02, 4.554e-03)); + r += mul(s3_0, M4(-1.026e-01, -2.673e-01, 2.419e-01, 1.951e-02, 4.828e-02, -1.120e-01, 9.974e-02, -1.526e-01, 9.792e-03, -1.194e-02, 2.884e-02, -3.913e-02, -4.019e-02, 1.306e-03, -9.133e-03, 2.829e-02)); + r += mul(s3_1, M4(5.099e-02, 1.166e-01, 9.745e-02, -6.132e-01, 9.886e-02, -1.197e-01, 1.625e-01, 4.334e-02, 1.472e-02, -2.947e-01, 7.289e-02, -4.089e-01, 5.513e-02, -2.122e-01, 1.863e-03, -1.450e-01)); + r += mul(s3_2, M4(-8.166e-02, 7.367e-02, 6.029e-03, 6.953e-02, -2.331e-01, -1.240e-01, 5.302e-02, -2.107e-01, 1.353e-01, 7.785e-02, -4.803e-02, -4.513e-02, 1.067e-01, -3.485e-02, -8.357e-03, -2.302e-01)); + r += mul(s3_3, M4(5.918e-02, 7.926e-02, -3.945e-01, 1.734e-01, 4.372e-02, 3.205e-02, -9.344e-02, -4.708e-02, -1.211e-01, 2.742e-02, 2.032e-02, 1.747e-02, -6.007e-02, 5.451e-02, -8.460e-02, -2.765e-02)); + r += mul(s3_4, M4(6.409e-01, -1.212e-01, -1.105e-01, 5.278e-02, 5.982e-01, -3.474e-01, -1.078e-01, 2.872e-02, -1.287e-03, -2.148e-01, -1.752e-01, -8.497e-02, -3.730e-01, 8.165e-03, -5.113e-02, 1.547e-01)); + r += mul(s3_5, M4(-8.520e-02, 1.228e-01, 6.252e-03, 1.262e-01, -2.339e-01, -1.996e-01, 1.169e-01, -1.452e-01, -1.209e-02, 1.329e-01, 1.228e-01, -1.087e-01, -1.669e-01, -2.158e-01, 9.188e-02, -4.751e-02)); + r += mul(s3_6, M4(-2.664e-02, -4.621e-02, 1.539e-01, 1.262e-02, 2.615e-02, 1.102e-01, -3.000e-02, 2.546e-02, 2.668e-02, 4.050e-02, -1.118e-01, 2.701e-02, 1.231e-02, 2.743e-02, 3.393e-02, -1.372e-02)); + r += mul(s3_7, M4(5.715e-02, -1.962e-02, 8.036e-02, -3.092e-02, 1.051e-01, -8.764e-02, -1.678e-02, 3.628e-02, -1.425e-01, -1.649e-03, -2.529e-01, 7.452e-02, 8.522e-02, -5.112e-02, 1.689e-01, -2.235e-02)); + r += mul(s3_8, M4(-8.426e-02, -1.070e-01, 1.473e-01, -5.678e-02, -4.167e-02, -8.678e-02, -9.901e-02, 1.746e-02, -1.020e-01, -1.905e-01, 6.511e-02, -1.759e-02, -6.187e-02, 5.960e-03, -9.606e-03, 3.401e-02)); + r += V4(-5.133e-03, 1.777e-02, 4.068e-03, 1.012e-02); + return r; +} + +void Pass7(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = Rmp8x8(tid.x) + blockStart; + uint2 size = GetInputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = (gxy + 0.5) * pt; + + V4 s0_0 = l0(-1.0, -1.0); + V4 s0_1 = l0(0.0, -1.0); + V4 s0_2 = l0(1.0, -1.0); + V4 s0_3 = l0(-1.0, 0.0); + V4 s0_4 = l0(0.0, 0.0); + V4 s0_5 = l0(1.0, 0.0); + V4 s0_6 = l0(-1.0, 1.0); + V4 s0_7 = l0(0.0, 1.0); + V4 s0_8 = l0(1.0, 1.0); + V4 s1_0 = -max(-s0_0, 0.0); + V4 s1_1 = -max(-s0_1, 0.0); + V4 s1_2 = -max(-s0_2, 0.0); + V4 s1_3 = -max(-s0_3, 0.0); + V4 s1_4 = -max(-s0_4, 0.0); + V4 s1_5 = -max(-s0_5, 0.0); + V4 s1_6 = -max(-s0_6, 0.0); + V4 s1_7 = -max(-s0_7, 0.0); + V4 s1_8 = -max(-s0_8, 0.0); + s0_0 = max(s0_0, 0.0); + s0_1 = max(s0_1, 0.0); + s0_2 = max(s0_2, 0.0); + s0_3 = max(s0_3, 0.0); + s0_4 = max(s0_4, 0.0); + s0_5 = max(s0_5, 0.0); + s0_6 = max(s0_6, 0.0); + s0_7 = max(s0_7, 0.0); + s0_8 = max(s0_8, 0.0); + + V4 s2_0 = l1(-1.0, -1.0); + V4 s2_1 = l1(0.0, -1.0); + V4 s2_2 = l1(1.0, -1.0); + V4 s2_3 = l1(-1.0, 0.0); + V4 s2_4 = l1(0.0, 0.0); + V4 s2_5 = l1(1.0, 0.0); + V4 s2_6 = l1(-1.0, 1.0); + V4 s2_7 = l1(0.0, 1.0); + V4 s2_8 = l1(1.0, 1.0); + V4 s3_0 = -max(-s2_0, 0.0); + V4 s3_1 = -max(-s2_1, 0.0); + V4 s3_2 = -max(-s2_2, 0.0); + V4 s3_3 = -max(-s2_3, 0.0); + V4 s3_4 = -max(-s2_4, 0.0); + V4 s3_5 = -max(-s2_5, 0.0); + V4 s3_6 = -max(-s2_6, 0.0); + V4 s3_7 = -max(-s2_7, 0.0); + V4 s3_8 = -max(-s2_8, 0.0); + s2_0 = max(s2_0, 0.0); + s2_1 = max(s2_1, 0.0); + s2_2 = max(s2_2, 0.0); + s2_3 = max(s2_3, 0.0); + s2_4 = max(s2_4, 0.0); + s2_5 = max(s2_5, 0.0); + s2_6 = max(s2_6, 0.0); + s2_7 = max(s2_7, 0.0); + s2_8 = max(s2_8, 0.0); + + t0[gxy] = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8); + t1[gxy] = f1(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8); +} + +//!PASS 8 +//!DESC conv7 +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 +//!IN t0, t1 +//!OUT t2, t3 + +#define l0(x, y) V4(O(t0, float2(x, y))) +#define l1(x, y) V4(O(t1, float2(x, y))) + +V4 f0(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8) { + V4 r = 0.0; + r += mul(s0_0, M4(1.631e-02, 3.701e-02, -2.434e-02, 8.471e-02, 4.263e-02, 5.692e-02, 5.410e-02, 4.454e-03, -5.624e-02, -7.308e-02, -8.138e-03, -1.520e-02, -5.507e-03, -4.765e-02, 3.131e-02, -6.383e-02)); + r += mul(s0_1, M4(1.588e-02, 1.464e-02, 2.917e-02, -3.454e-02, -1.494e-03, -1.481e-02, -9.514e-02, -4.334e-02, 3.919e-02, 3.710e-02, 4.232e-02, 1.561e-01, 2.753e-02, -9.642e-02, -2.388e-01, -4.597e-02)); + r += mul(s0_2, M4(5.193e-03, -9.561e-03, 5.468e-02, -6.118e-02, 3.707e-02, 5.846e-02, 7.340e-02, 2.255e-02, -3.022e-02, 5.151e-02, 2.252e-02, 7.787e-03, 2.760e-02, 3.242e-02, 9.113e-02, -4.307e-02)); + r += mul(s0_3, M4(-8.921e-03, -7.181e-02, -1.512e-01, 4.666e-02, -4.676e-02, -1.771e-02, 6.837e-02, 8.735e-02, 3.111e-02, 7.935e-02, -4.188e-03, -1.714e-01, 2.293e-02, 9.058e-02, -1.764e-01, 8.294e-03)); + r += mul(s0_4, M4(1.993e-01, 1.421e-01, 7.711e-02, 6.236e-02, -3.828e-02, -1.568e-01, -2.417e-01, -1.350e-01, -8.580e-02, -2.849e-01, -1.312e-01, -3.715e-01, -3.884e-02, -4.602e-01, -1.172e-01, 2.457e-01)); + r += mul(s0_5, M4(1.442e-01, 6.769e-02, 1.666e-01, -5.753e-02, -8.668e-02, -7.359e-02, 3.895e-03, 1.682e-03, 1.593e-02, 9.310e-02, -4.170e-03, 1.061e-01, 4.005e-02, 7.271e-02, -1.133e-02, -6.095e-02)); + r += mul(s0_6, M4(1.652e-02, -4.932e-02, -1.026e-01, -4.651e-03, 2.605e-02, 4.361e-02, -8.225e-02, -1.536e-02, -1.655e-02, 5.030e-03, 4.067e-02, 8.822e-02, -2.308e-02, 8.050e-02, -6.368e-02, 6.068e-03)); + r += mul(s0_7, M4(5.290e-02, -1.020e-02, 1.377e-02, -2.169e-02, 3.890e-02, -7.155e-02, 6.368e-02, -3.030e-02, -3.352e-02, -7.496e-02, -3.534e-02, 4.126e-02, -1.180e-02, -1.737e-01, -3.262e-02, -1.906e-01)); + r += mul(s0_8, M4(5.808e-02, 8.817e-02, 5.857e-02, -5.555e-04, 3.944e-02, -1.533e-03, -1.000e-02, -2.643e-02, 8.856e-03, -9.440e-02, -1.108e-01, -3.988e-03, -7.107e-02, -1.128e-01, -6.348e-02, -5.594e-02)); + r += mul(s1_0, M4(6.233e-02, 2.632e-03, -2.944e-02, -7.241e-03, 6.527e-02, 5.843e-02, 7.877e-02, -3.049e-03, -4.898e-02, -9.257e-02, -7.349e-02, 2.061e-02, 1.027e-02, -9.056e-03, 1.359e-02, 6.851e-03)); + r += mul(s1_1, M4(5.769e-02, -1.509e-01, -4.090e-01, -3.105e-02, 6.866e-02, 8.362e-03, -2.706e-01, -1.117e-01, -5.216e-03, 1.158e-01, 8.544e-02, 7.913e-03, -1.341e-02, -4.537e-02, -6.818e-02, -3.521e-02)); + r += mul(s1_2, M4(7.527e-02, 4.825e-02, 1.968e-01, 4.230e-02, -9.816e-03, 1.132e-01, 1.272e-01, 6.139e-02, -5.991e-02, 8.797e-02, 2.490e-02, 8.849e-02, 6.118e-03, 8.134e-02, 1.287e-01, 1.401e-02)); + r += mul(s1_3, M4(3.013e-02, -1.096e-01, -3.818e-01, -2.105e-01, -7.226e-02, 1.442e-01, 1.028e-01, 1.038e-01, 6.223e-02, 2.133e-03, 1.029e-01, 5.877e-02, 3.329e-02, -1.971e-02, -1.260e-01, -4.246e-02)); + r += mul(s1_4, M4(4.756e-01, 6.473e-02, 1.863e-01, 2.217e-01, -3.590e-01, -6.434e-01, -1.796e-01, -1.997e-02, -2.041e-01, 8.227e-02, 1.277e-01, -2.091e-01, 1.817e-02, -2.976e-01, -3.877e-01, 8.980e-02)); + r += mul(s1_5, M4(3.625e-01, -6.200e-02, -1.578e-02, -6.555e-02, -1.656e-01, 1.131e-02, 3.952e-02, -5.259e-02, 2.280e-01, 2.605e-01, -1.093e-01, 2.026e-01, -4.178e-02, 2.472e-02, 1.802e-01, 5.444e-02)); + r += mul(s1_6, M4(2.555e-02, -6.827e-02, -1.084e-01, 3.976e-02, 1.274e-02, 6.716e-02, -4.575e-02, -2.343e-02, 2.861e-02, -7.587e-04, 5.146e-02, 1.335e-01, -1.543e-02, -4.756e-02, -5.113e-02, 1.725e-02)); + r += mul(s1_7, M4(2.567e-03, -1.154e-01, 2.448e-02, 3.738e-03, 1.572e-01, -1.440e-01, 7.550e-02, -1.769e-02, 6.346e-02, 5.747e-02, 9.293e-03, -1.939e-01, 8.411e-03, -2.033e-01, -1.109e-01, -1.597e-01)); + r += mul(s1_8, M4(1.227e-02, 1.120e-01, 9.656e-02, 1.212e-02, 4.532e-02, -1.865e-02, 2.360e-02, -2.847e-02, -1.250e-01, -1.511e-02, -4.564e-02, -2.920e-02, -3.807e-02, -2.316e-02, 2.247e-02, 4.428e-02)); + r += mul(s2_0, M4(-1.919e-03, -4.392e-03, -1.503e-01, 2.610e-01, 3.634e-02, 1.206e-02, 3.478e-02, -7.205e-02, 4.359e-02, 5.512e-03, -2.062e-02, -7.692e-02, -5.576e-03, -1.764e-02, -8.326e-02, 1.027e-01)); + r += mul(s2_1, M4(4.291e-02, -1.704e-02, 3.850e-01, -2.389e-03, 1.603e-02, 1.502e-02, -6.005e-04, -1.089e-01, 2.820e-02, -1.144e-03, -1.296e-02, 3.798e-02, 1.740e-02, -4.183e-02, 4.017e-02, 1.070e-01)); + r += mul(s2_2, M4(-1.513e-02, -7.006e-02, -6.258e-02, -4.526e-02, 2.048e-02, 6.189e-02, -8.497e-03, 5.349e-02, 1.713e-02, -7.838e-02, -9.167e-02, 1.616e-01, 1.160e-02, -2.925e-03, 6.162e-03, 1.576e-02)); + r += mul(s2_3, M4(1.732e-02, -7.628e-03, -3.389e-01, 9.102e-02, -1.819e-02, 3.728e-02, 4.961e-02, 7.595e-02, 9.210e-03, -2.414e-02, -1.018e-01, -2.461e-02, -2.735e-02, -1.492e-01, -9.396e-02, -1.685e-01)); + r += mul(s2_4, M4(-3.447e-01, -1.770e-01, 3.567e-01, 3.690e-02, -4.678e-02, 1.335e-01, 9.902e-02, -4.134e-02, -1.305e-02, -2.474e-02, 5.640e-02, -4.424e-01, -2.472e-02, -5.142e-02, -1.626e-01, 7.690e-02)); + r += mul(s2_5, M4(9.079e-02, -2.009e-01, -1.323e-01, -3.918e-02, 9.400e-03, 8.146e-02, 5.737e-02, -1.784e-02, -1.499e-01, -5.093e-02, -1.098e-01, 3.289e-02, 1.768e-02, 1.473e-02, 6.505e-02, 3.706e-02)); + r += mul(s2_6, M4(3.560e-02, 5.268e-02, -1.088e-01, 2.118e-02, 2.692e-02, 1.300e-02, 3.629e-02, -1.314e-01, -3.040e-03, -2.379e-02, 4.084e-02, 2.610e-02, -5.023e-02, -4.076e-03, 8.663e-02, 5.673e-02)); + r += mul(s2_7, M4(6.639e-02, -1.538e-01, 1.271e-03, 9.794e-02, 2.727e-02, -4.575e-03, 1.234e-02, 3.835e-03, -1.786e-02, -2.353e-02, -8.215e-06, 3.503e-02, 1.446e-02, -8.232e-02, -9.569e-02, -2.136e-02)); + r += mul(s2_8, M4(-6.274e-02, 3.597e-02, -1.374e-02, 1.240e-01, -4.918e-03, 9.546e-02, 2.940e-02, 3.907e-02, -3.768e-02, -3.928e-04, -2.817e-02, -2.097e-03, -1.098e-01, -6.711e-02, -1.060e-02, -3.996e-02)); + r += mul(s3_0, M4(-8.705e-04, 6.913e-03, -8.508e-02, 9.533e-02, -5.128e-02, 1.287e-01, -1.359e-01, -1.808e-01, 3.749e-02, -5.344e-02, -1.595e-01, -1.543e-01, 3.085e-02, 5.201e-02, 3.952e-02, -3.127e-02)); + r += mul(s3_1, M4(4.285e-02, 1.749e-02, 4.436e-02, 1.969e-01, 7.142e-02, 4.295e-01, 2.308e-01, -2.510e-01, 6.257e-02, -1.732e-01, 8.754e-02, -1.097e-01, -4.325e-03, -7.495e-03, -3.973e-02, 5.667e-03)); + r += mul(s3_2, M4(3.658e-02, 5.831e-03, 5.057e-02, -4.212e-02, -3.096e-01, 1.765e-01, 5.637e-02, 2.513e-01, 2.164e-01, -5.145e-02, -1.441e-02, 1.741e-02, 1.152e-02, -3.634e-03, -5.337e-02, 4.853e-03)); + r += mul(s3_3, M4(-2.759e-02, -1.018e-01, -2.492e-01, -1.179e-02, 2.017e-02, 3.613e-01, 4.407e-01, 2.802e-01, 2.645e-02, -3.572e-02, -4.548e-02, 6.994e-02, -1.924e-02, -6.029e-02, -4.268e-02, -3.740e-01)); + r += mul(s3_4, M4(-2.998e-02, -1.127e-01, 4.528e-02, -2.201e-03, -1.362e-01, -1.173e-02, 2.897e-01, 1.886e-01, 4.796e-02, -9.274e-03, -4.043e-02, -1.611e-01, 1.040e-01, 1.789e-01, 7.764e-02, 5.576e-02)); + r += mul(s3_5, M4(2.363e-02, 9.824e-02, 6.683e-02, 4.886e-02, 1.781e-01, -2.578e-01, -2.830e-01, -2.291e-01, 2.046e-01, -7.397e-02, -9.421e-03, -1.329e-01, 4.403e-02, -5.740e-02, -8.843e-02, -1.077e-01)); + r += mul(s3_6, M4(-9.686e-03, -6.426e-02, -8.451e-02, -1.543e-02, 4.212e-02, -8.461e-02, -6.925e-02, 1.326e-01, -2.320e-02, 1.063e-02, 5.104e-03, 2.349e-02, -1.832e-02, 1.542e-01, 2.940e-01, 9.564e-02)); + r += mul(s3_7, M4(-4.924e-02, 2.808e-02, 6.840e-02, -2.073e-02, 1.797e-01, -1.848e-02, 1.170e-01, -3.062e-01, 2.053e-02, -2.797e-03, -1.919e-02, -8.586e-02, 6.958e-02, 2.482e-01, 1.206e-01, -2.592e-01)); + r += mul(s3_8, M4(-1.581e-03, 1.504e-02, -6.646e-03, -2.199e-02, -2.461e-01, 2.447e-01, 2.928e-02, 6.105e-03, 3.845e-02, -8.580e-03, 2.356e-02, -3.423e-02, -5.714e-02, -1.385e-01, -1.413e-01, -1.655e-01)); + r += V4(4.493e-03, 9.879e-03, 4.742e-03, 7.609e-03); + return r; +} + +V4 f1(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-7.606e-03, -1.450e-01, 7.048e-02, -5.560e-02, -2.107e-02, -8.767e-02, 4.197e-02, -3.903e-02, 2.785e-02, 4.231e-02, -8.629e-02, 7.399e-02, -4.145e-02, 2.668e-02, 4.936e-03, 2.811e-02)); + r += mul(s0_1, M4(-2.178e-02, -9.573e-02, 4.466e-02, -4.596e-02, 1.264e-01, -1.470e-02, -2.223e-02, -1.171e-01, 9.840e-02, 3.306e-02, -3.467e-02, 3.803e-02, -5.662e-02, 4.639e-03, -4.650e-02, -6.032e-02)); + r += mul(s0_2, M4(-2.858e-02, -5.296e-02, 3.520e-02, 8.093e-03, -5.357e-02, -3.564e-02, 1.554e-02, 1.925e-02, -1.468e-02, 6.853e-02, 5.027e-02, 2.541e-02, 6.782e-02, 8.630e-02, -1.517e-02, 7.121e-02)); + r += mul(s0_3, M4(3.350e-02, 7.664e-02, 1.083e-01, 4.846e-02, 1.295e-02, 2.439e-02, 6.116e-02, -6.071e-02, 6.696e-02, -6.066e-02, -1.552e-01, 1.984e-02, -1.023e-01, -1.433e-02, 2.393e-04, -3.211e-02)); + r += mul(s0_4, M4(-8.745e-02, -1.353e-01, -9.550e-02, -5.556e-02, 2.083e-01, -6.727e-02, 8.289e-02, 4.910e-01, -7.763e-02, 2.153e-01, 4.773e-01, -1.019e-01, -2.608e-01, -2.339e-01, -1.347e-01, 3.045e-02)); + r += mul(s0_5, M4(-4.816e-03, -5.705e-02, 5.751e-02, 6.914e-02, -2.323e-03, 1.954e-02, -6.234e-02, 2.904e-02, -1.618e-02, -5.947e-02, 8.672e-02, -9.847e-02, -1.798e-01, -3.539e-01, -1.188e-01, -1.909e-01)); + r += mul(s0_6, M4(-7.460e-02, -4.881e-02, 9.756e-02, 1.474e-02, -6.241e-02, -1.905e-02, 4.644e-02, 2.807e-04, 4.447e-02, 5.130e-02, -1.164e-01, -1.247e-03, -6.590e-02, -2.624e-02, -5.928e-02, -3.539e-02)); + r += mul(s0_7, M4(1.638e-01, 5.812e-02, -1.803e-01, -7.788e-02, -1.016e-01, -4.893e-02, -5.868e-02, -3.538e-03, -2.306e-01, -1.062e-01, 1.456e-01, 1.246e-01, -2.549e-01, 4.943e-02, 7.763e-02, 4.620e-02)); + r += mul(s0_8, M4(-3.654e-02, -7.453e-02, 1.955e-02, 4.617e-02, 4.147e-02, -1.313e-02, -4.974e-03, -3.849e-02, -6.676e-02, -2.096e-02, 2.696e-02, 4.776e-02, 2.142e-01, 3.247e-02, -5.714e-03, -8.951e-02)); + r += mul(s1_0, M4(-7.790e-02, -2.760e-01, 1.016e-01, -1.447e-01, -6.912e-02, -9.298e-02, 1.287e-02, -1.297e-02, -1.509e-02, 7.726e-02, -4.248e-02, 3.258e-02, 2.005e-02, -3.405e-03, -7.025e-03, 1.306e-02)); + r += mul(s1_1, M4(-3.396e-02, 2.075e-01, -3.389e-01, -1.892e-01, 7.255e-02, 1.213e-01, -1.733e-01, -1.080e-01, 5.638e-02, 1.893e-01, -1.445e-02, 1.323e-01, 6.380e-02, -1.103e-02, 6.004e-03, 3.340e-02)); + r += mul(s1_2, M4(9.550e-02, -7.969e-02, 1.467e-01, -1.510e-01, -6.064e-02, -1.011e-02, 9.627e-02, 5.701e-02, -1.502e-02, 5.514e-02, 1.194e-01, -8.703e-02, 1.962e-02, -2.335e-02, 1.273e-01, 3.821e-02)); + r += mul(s1_3, M4(5.118e-02, -4.244e-02, 3.218e-02, 2.105e-01, 2.683e-03, 1.639e-01, -7.032e-02, -6.492e-03, -6.695e-02, -1.580e-01, -3.038e-02, -1.280e-01, 5.194e-02, -4.606e-02, 7.701e-02, 4.344e-02)); + r += mul(s1_4, M4(-2.659e-01, -2.845e-01, -6.540e-02, 4.223e-02, -9.556e-02, 6.592e-01, -3.941e-01, 8.342e-01, 4.311e-01, -4.670e-01, 7.613e-01, 1.446e-02, -1.768e-01, 9.708e-02, -4.275e-02, -1.575e-01)); + r += mul(s1_5, M4(8.871e-02, -1.971e-01, 5.135e-02, 8.891e-02, -3.116e-01, 4.480e-02, 3.692e-02, 8.906e-02, 2.387e-01, -1.665e-01, 1.100e-01, -2.411e-01, -3.362e-01, 3.610e-03, -3.060e-02, 5.738e-02)); + r += mul(s1_6, M4(-8.271e-02, -1.283e-02, 5.737e-02, 2.650e-03, -3.927e-02, -7.014e-03, -8.666e-04, 6.659e-02, 3.380e-02, 7.843e-02, -5.220e-02, -4.679e-02, -5.453e-03, 1.609e-02, -4.788e-02, 2.133e-02)); + r += mul(s1_7, M4(2.159e-01, -8.350e-02, -1.979e-01, -4.520e-02, -1.429e-01, 4.874e-02, -9.640e-02, -6.331e-02, 1.226e-01, 1.200e-01, 2.666e-01, 3.174e-01, -2.204e-01, 1.731e-02, 3.981e-02, 5.188e-02)); + r += mul(s1_8, M4(-1.194e-01, -9.985e-02, 7.560e-02, 1.145e-01, -3.150e-04, 6.180e-02, -4.255e-02, -4.634e-02, -7.316e-02, 4.107e-02, 1.685e-02, -2.061e-03, 1.040e-01, 1.853e-02, -4.165e-02, -9.763e-02)); + r += mul(s2_0, M4(-1.972e-02, -1.625e-01, -3.716e-02, -6.495e-02, 3.466e-02, -3.497e-02, 4.673e-02, -1.410e-02, 1.877e-02, -7.723e-02, 2.751e-02, 1.365e-02, -8.140e-03, -1.770e-02, 1.922e-02, -1.498e-02)); + r += mul(s2_1, M4(-1.786e-02, -1.179e-01, 1.953e-01, 1.006e-01, 2.893e-02, 6.931e-03, -4.640e-03, -2.826e-02, 9.737e-02, -8.263e-02, 1.216e-01, -1.508e-01, -2.827e-03, -2.454e-02, -3.020e-02, -2.437e-02)); + r += mul(s2_2, M4(1.134e-02, -1.006e-02, 1.179e-02, 3.855e-02, 7.075e-02, -2.106e-02, 9.123e-02, -8.254e-02, 2.474e-02, 1.142e-02, -9.821e-02, 6.447e-05, -1.998e-02, -2.427e-02, -1.350e-02, 2.790e-02)); + r += mul(s2_3, M4(2.106e-01, 1.613e-01, -1.067e-01, -2.487e-02, -5.780e-02, -4.198e-03, -8.941e-02, -9.418e-03, 6.684e-02, 1.602e-02, -3.390e-02, 3.211e-02, -5.629e-02, 9.606e-02, 5.797e-02, -5.583e-03)); + r += mul(s2_4, M4(-1.209e-01, 5.758e-01, 1.261e-03, 1.741e-01, -2.419e-01, -1.311e-01, 5.495e-02, 1.059e-01, 1.174e-01, 1.139e-01, 7.558e-02, 3.146e-02, 3.048e-01, 1.029e-01, -4.014e-02, 5.124e-02)); + r += mul(s2_5, M4(2.601e-01, 1.167e-01, -1.328e-01, 6.108e-02, -2.140e-01, -1.833e-02, 7.347e-02, -1.673e-02, 8.485e-02, 7.450e-02, -4.355e-02, -2.229e-01, 2.606e-02, 5.274e-02, -3.851e-03, -4.787e-03)); + r += mul(s2_6, M4(-3.845e-02, 1.459e-02, -9.795e-04, -3.515e-03, 9.791e-02, -4.729e-03, 4.591e-02, 2.429e-02, -4.431e-02, 5.498e-04, -4.050e-02, 1.392e-02, -2.258e-01, -6.294e-02, -4.323e-02, -1.549e-02)); + r += mul(s2_7, M4(-1.184e-01, -2.039e-01, -1.069e-02, -2.209e-02, 1.933e-01, 4.867e-02, -1.127e-01, -1.196e-01, -9.386e-02, 2.226e-03, 1.569e-02, -4.063e-03, -5.044e-02, -1.930e-01, 7.287e-02, 1.237e-01)); + r += mul(s2_8, M4(-8.680e-02, -9.201e-02, 2.773e-02, -4.725e-02, 4.422e-02, -1.834e-02, 4.184e-02, 1.488e-02, -3.397e-02, 1.727e-04, 2.558e-02, 5.452e-02, -2.750e-02, 4.529e-02, -3.442e-02, 7.563e-02)); + r += mul(s3_0, M4(-7.896e-03, -1.086e-01, 5.701e-02, -3.965e-02, 8.469e-02, 1.352e-01, -6.528e-02, -1.477e-02, 2.109e-02, -8.591e-02, -4.694e-03, -3.514e-03, 5.960e-02, -4.514e-02, 1.488e-02, -3.246e-02)); + r += mul(s3_1, M4(5.433e-02, -5.217e-02, -1.891e-02, -3.308e-02, -1.775e-01, -3.605e-02, 1.126e-01, -2.166e-01, 4.270e-02, -4.366e-01, 1.504e-01, -2.861e-01, -1.690e-03, 1.295e-02, -9.738e-04, -6.364e-02)); + r += mul(s3_2, M4(2.461e-02, 3.878e-02, 2.036e-02, 5.172e-02, 1.882e-02, 1.194e-01, 2.614e-01, 4.576e-02, 1.069e-01, -1.662e-01, -9.787e-02, -4.312e-01, 6.190e-02, -4.314e-03, 8.764e-04, -1.972e-02)); + r += mul(s3_3, M4(1.434e-02, 1.003e-03, 1.437e-01, -4.020e-02, 1.354e-01, -1.095e-02, -4.405e-01, -2.827e-02, 4.254e-02, -1.466e-02, -3.134e-02, -3.096e-03, -8.806e-02, 5.043e-02, 4.063e-03, 5.549e-02)); + r += mul(s3_4, M4(-1.294e-01, 2.964e-02, 5.146e-02, 6.517e-02, -6.495e-01, -5.152e-02, 5.726e-01, 3.115e-01, 1.993e-01, -2.266e-01, -9.610e-02, 2.153e-01, 1.816e-02, -1.818e-01, 1.234e-01, -3.177e-01)); + r += mul(s3_5, M4(7.489e-02, -3.528e-02, 6.062e-03, -3.331e-02, 2.551e-01, 2.377e-01, -1.997e-01, -4.533e-02, -3.031e-01, -8.469e-02, 1.362e-01, 2.675e-01, -1.314e-01, -6.837e-03, -1.181e-01, -1.001e-02)); + r += mul(s3_6, M4(-6.568e-02, -2.240e-02, 4.283e-02, 1.558e-02, 6.800e-02, -5.739e-03, 6.958e-02, -2.239e-02, 2.790e-02, 5.060e-03, -7.806e-03, 2.765e-03, -1.731e-01, 1.712e-01, -3.499e-01, 6.484e-02)); + r += mul(s3_7, M4(1.238e-01, -8.504e-02, -4.829e-02, -1.088e-02, 7.962e-02, -1.782e-02, -9.934e-02, -5.628e-02, -4.412e-02, 4.612e-02, 1.926e-03, 7.206e-02, -7.886e-02, 5.169e-02, 2.761e-01, 4.394e-01)); + r += mul(s3_8, M4(-6.514e-02, -7.796e-02, -9.301e-03, 4.148e-02, 1.350e-01, -7.848e-02, 2.949e-02, -1.101e-01, 4.236e-02, 3.716e-02, 4.291e-02, 7.020e-02, 1.850e-01, -4.661e-03, -2.221e-01, -1.237e-01)); + r += V4(1.407e-02, -1.303e-02, 6.423e-03, -6.361e-03); + return r; +} + +void Pass8(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = Rmp8x8(tid.x) + blockStart; + uint2 size = GetInputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = (gxy + 0.5) * pt; + + V4 s0_0 = l0(-1.0, -1.0); + V4 s0_1 = l0(0.0, -1.0); + V4 s0_2 = l0(1.0, -1.0); + V4 s0_3 = l0(-1.0, 0.0); + V4 s0_4 = l0(0.0, 0.0); + V4 s0_5 = l0(1.0, 0.0); + V4 s0_6 = l0(-1.0, 1.0); + V4 s0_7 = l0(0.0, 1.0); + V4 s0_8 = l0(1.0, 1.0); + V4 s1_0 = -max(-s0_0, 0.0); + V4 s1_1 = -max(-s0_1, 0.0); + V4 s1_2 = -max(-s0_2, 0.0); + V4 s1_3 = -max(-s0_3, 0.0); + V4 s1_4 = -max(-s0_4, 0.0); + V4 s1_5 = -max(-s0_5, 0.0); + V4 s1_6 = -max(-s0_6, 0.0); + V4 s1_7 = -max(-s0_7, 0.0); + V4 s1_8 = -max(-s0_8, 0.0); + s0_0 = max(s0_0, 0.0); + s0_1 = max(s0_1, 0.0); + s0_2 = max(s0_2, 0.0); + s0_3 = max(s0_3, 0.0); + s0_4 = max(s0_4, 0.0); + s0_5 = max(s0_5, 0.0); + s0_6 = max(s0_6, 0.0); + s0_7 = max(s0_7, 0.0); + s0_8 = max(s0_8, 0.0); + + V4 s2_0 = l1(-1.0, -1.0); + V4 s2_1 = l1(0.0, -1.0); + V4 s2_2 = l1(1.0, -1.0); + V4 s2_3 = l1(-1.0, 0.0); + V4 s2_4 = l1(0.0, 0.0); + V4 s2_5 = l1(1.0, 0.0); + V4 s2_6 = l1(-1.0, 1.0); + V4 s2_7 = l1(0.0, 1.0); + V4 s2_8 = l1(1.0, 1.0); + V4 s3_0 = -max(-s2_0, 0.0); + V4 s3_1 = -max(-s2_1, 0.0); + V4 s3_2 = -max(-s2_2, 0.0); + V4 s3_3 = -max(-s2_3, 0.0); + V4 s3_4 = -max(-s2_4, 0.0); + V4 s3_5 = -max(-s2_5, 0.0); + V4 s3_6 = -max(-s2_6, 0.0); + V4 s3_7 = -max(-s2_7, 0.0); + V4 s3_8 = -max(-s2_8, 0.0); + s2_0 = max(s2_0, 0.0); + s2_1 = max(s2_1, 0.0); + s2_2 = max(s2_2, 0.0); + s2_3 = max(s2_3, 0.0); + s2_4 = max(s2_4, 0.0); + s2_5 = max(s2_5, 0.0); + s2_6 = max(s2_6, 0.0); + s2_7 = max(s2_7, 0.0); + s2_8 = max(s2_8, 0.0); + + t2[gxy] = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8); + t3[gxy] = f1(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8); +} + +//!PASS 9 +//!DESC conv8 +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 +//!IN t2, t3 +//!OUT t0, t1 + +#define l0(x, y) V4(O(t2, float2(x, y))) +#define l1(x, y) V4(O(t3, float2(x, y))) + +V4 f0(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8) { + V4 r = 0.0; + r += mul(s0_0, M4(8.716e-02, -2.891e-02, -2.183e-01, -7.676e-03, -1.552e-02, 1.494e-02, 2.825e-02, -3.651e-02, 4.604e-03, 5.645e-03, 8.134e-03, -1.298e-02, 2.144e-02, 1.195e-03, 1.450e-02, 1.619e-02)); + r += mul(s0_1, M4(-3.389e-02, -2.900e-01, -3.087e-01, -5.633e-02, 2.753e-02, 2.198e-02, -6.998e-02, -6.210e-02, 2.079e-02, 2.083e-02, 4.432e-02, -1.027e-02, 3.827e-02, 8.856e-04, 4.809e-03, -3.012e-02)); + r += mul(s0_2, M4(8.829e-03, -1.200e-02, -2.731e-02, 2.589e-02, -4.841e-03, -1.333e-01, -3.516e-02, -2.656e-02, -1.726e-03, -4.446e-03, -8.521e-02, -2.038e-02, 5.978e-02, 9.301e-02, 1.080e-02, 5.518e-02)); + r += mul(s0_3, M4(-8.477e-02, 6.865e-02, 1.804e-01, 1.239e-01, 2.939e-02, -5.360e-02, -1.714e-01, -4.654e-02, 5.288e-03, -1.770e-02, 1.804e-02, -1.039e-02, -1.376e-02, -4.660e-02, -1.135e-01, -8.134e-02)); + r += mul(s0_4, M4(4.002e-02, 2.814e-01, 3.318e-01, -2.789e-01, -1.151e-02, -6.062e-02, 1.340e-01, -2.157e-01, -1.594e-02, 3.660e-02, -2.938e-02, 2.064e-01, 5.313e-02, 9.726e-02, -1.831e-01, 1.773e-01)); + r += mul(s0_5, M4(1.286e-02, 5.915e-02, 9.298e-02, 7.291e-02, 2.413e-02, 1.863e-01, 4.568e-02, 1.337e-01, 1.420e-02, -1.661e-02, 8.140e-02, 2.640e-02, -4.800e-02, -3.460e-01, -3.232e-01, 8.426e-02)); + r += mul(s0_6, M4(-1.923e-02, -7.129e-02, 1.256e-01, 1.482e-02, 2.752e-02, 6.057e-02, -2.595e-02, 1.176e-02, -5.789e-03, 1.235e-02, 2.846e-02, -3.297e-02, 2.591e-02, 9.832e-03, -1.272e-02, -2.601e-02)); + r += mul(s0_7, M4(3.527e-02, 3.830e-01, 2.712e-01, 1.038e-01, 4.921e-02, -1.047e-01, -1.821e-01, 2.358e-02, -2.067e-02, 5.368e-02, 1.773e-01, -1.114e-02, -6.454e-02, -1.991e-02, -9.674e-02, -1.353e-01)); + r += mul(s0_8, M4(2.063e-02, -5.830e-02, -7.769e-03, -2.469e-02, -2.694e-03, -5.945e-02, 7.213e-02, 3.814e-02, -1.769e-02, 9.680e-02, -5.531e-03, -8.608e-02, 5.463e-02, 1.511e-01, 2.052e-01, 5.571e-02)); + r += mul(s1_0, M4(5.597e-02, -1.255e-01, -1.365e-01, -8.874e-02, -2.838e-02, 8.409e-03, 7.349e-02, 5.397e-03, 1.360e-02, -1.040e-02, -2.247e-02, 1.490e-02, -1.303e-02, 1.433e-02, 1.603e-02, 1.108e-02)); + r += mul(s1_1, M4(-6.497e-02, -1.599e-02, 2.908e-02, -2.089e-01, 5.060e-02, -7.639e-02, -1.720e-01, -1.082e-01, 1.348e-02, 2.165e-02, -1.413e-02, 9.410e-02, 4.757e-03, -1.502e-02, -9.644e-02, 2.782e-02)); + r += mul(s1_2, M4(1.597e-02, -7.105e-02, -3.690e-02, 3.880e-02, 2.393e-04, -3.600e-02, 7.562e-02, -9.162e-02, -4.744e-02, 5.457e-02, -5.874e-02, 2.780e-02, -9.128e-03, -4.318e-02, -6.162e-02, 9.923e-02)); + r += mul(s1_3, M4(-9.415e-02, 8.443e-02, 1.850e-01, 2.272e-01, 6.203e-02, -6.275e-02, -1.687e-01, -1.142e-01, -4.309e-02, 4.878e-03, 2.693e-02, 3.195e-02, 1.393e-02, -8.775e-03, -3.935e-02, -2.571e-02)); + r += mul(s1_4, M4(-8.029e-02, 9.122e-01, 1.307e-01, -3.950e-01, -2.208e-01, 1.042e-01, 1.690e-01, -9.825e-02, -5.692e-02, 7.496e-02, -1.333e-01, 4.595e-01, 8.206e-02, 5.508e-02, 1.307e-01, -1.802e-01)); + r += mul(s1_5, M4(4.041e-02, 7.446e-02, 1.326e-02, 4.840e-02, -3.398e-03, 8.501e-02, -1.043e-02, 2.989e-02, 9.050e-02, -6.651e-02, 3.538e-03, -2.544e-01, -1.664e-02, -1.277e-02, 7.405e-03, 1.360e-01)); + r += mul(s1_6, M4(4.049e-03, 2.225e-02, -1.467e-02, 4.199e-02, -1.629e-02, -2.449e-02, 9.364e-03, 3.742e-02, 1.461e-02, 1.914e-02, -1.475e-02, 2.694e-02, 1.939e-02, 1.508e-02, -2.493e-02, 2.145e-02)); + r += mul(s1_7, M4(-1.139e-02, -2.558e-02, 2.030e-02, -1.332e-02, 9.789e-02, -1.343e-01, -1.585e-01, -2.415e-02, -3.155e-02, 5.701e-02, 9.033e-02, 1.058e-02, -6.113e-02, 3.790e-02, 5.825e-02, 1.036e-01)); + r += mul(s1_8, M4(2.258e-03, 2.830e-04, 2.544e-03, 4.909e-02, -5.359e-02, -2.778e-02, 4.536e-02, 6.162e-03, -3.971e-03, 9.985e-02, -2.324e-02, -2.912e-02, 1.898e-02, 3.549e-02, 1.523e-02, -5.460e-02)); + r += mul(s2_0, M4(-2.683e-03, -2.313e-02, -9.765e-02, 6.443e-02, -1.147e-02, -4.148e-02, -6.236e-02, 3.064e-02, 1.535e-03, -4.514e-03, -1.590e-02, -6.948e-03, 2.944e-02, -1.097e-02, 4.388e-02, -6.514e-02)); + r += mul(s2_1, M4(-3.525e-02, 2.655e-02, 1.220e-01, 1.464e-02, 7.646e-02, -6.272e-02, -1.444e-01, -5.726e-02, -1.391e-02, -1.336e-02, -1.038e-01, 4.556e-02, 2.769e-02, 2.400e-02, 6.146e-02, -1.442e-01)); + r += mul(s2_2, M4(9.590e-03, -1.095e-02, -2.527e-02, -2.780e-02, -6.799e-03, -9.882e-02, -4.968e-02, -1.557e-02, -6.521e-03, 2.517e-02, 6.286e-03, 4.018e-02, 1.262e-02, 9.613e-03, 4.015e-02, -4.083e-02)); + r += mul(s2_3, M4(-3.107e-02, 2.050e-02, 2.190e-01, -5.231e-02, -1.644e-02, 1.728e-02, -9.647e-02, 2.000e-02, 6.885e-03, -3.772e-02, -1.800e-02, -1.167e-02, 3.840e-02, -8.962e-02, -1.389e-01, -9.490e-02)); + r += mul(s2_4, M4(5.263e-02, -1.751e-02, -9.476e-02, -5.722e-02, 1.043e+00, 2.111e-01, 1.155e-01, 2.278e-01, 2.259e-02, -1.039e-02, 7.633e-02, -5.180e-02, 2.861e-01, 2.293e-01, 2.457e-01, -1.031e+00)); + r += mul(s2_5, M4(-1.717e-02, 3.437e-02, 1.829e-02, 6.573e-02, 4.646e-02, 4.430e-01, 1.042e-01, -6.801e-02, 1.584e-02, 4.456e-02, 5.250e-02, -9.501e-02, -1.277e-02, -3.398e-02, 1.408e-02, 3.100e-02)); + r += mul(s2_6, M4(1.276e-02, -2.000e-02, -1.067e-01, 1.639e-02, -6.351e-03, -6.506e-04, 1.168e-03, -8.173e-03, -7.451e-03, 1.989e-02, 1.142e-02, -8.287e-03, 4.566e-02, 2.864e-02, -2.859e-02, 4.019e-02)); + r += mul(s2_7, M4(-3.441e-02, -1.582e-02, 3.287e-02, 7.107e-02, -4.680e-02, -8.453e-02, -8.472e-02, -1.265e-03, -9.706e-03, 4.809e-02, -3.750e-02, 9.239e-02, -3.768e-02, -1.209e-01, -1.171e-01, 2.288e-01)); + r += mul(s2_8, M4(-1.296e-03, 1.673e-02, -1.629e-02, -4.858e-02, 1.224e-02, -1.321e-01, -4.292e-02, 1.164e-01, 2.477e-02, 7.985e-02, -7.381e-02, 4.411e-02, 2.398e-02, -1.543e-02, 3.089e-02, -2.552e-02)); + r += mul(s3_0, M4(1.648e-02, 3.567e-03, -1.052e-01, 4.280e-02, -6.192e-04, -1.966e-02, -4.740e-02, -1.942e-03, -5.032e-03, 1.183e-02, -1.079e-02, 3.852e-03, 2.288e-02, 3.801e-03, 3.902e-02, -3.914e-02)); + r += mul(s3_1, M4(-5.489e-02, -1.027e-01, -1.111e-01, 1.519e-01, -1.327e-02, 1.596e-03, -1.675e-01, 5.952e-02, -6.748e-02, 2.754e-02, -5.609e-02, 6.575e-02, 2.188e-02, 9.031e-03, 4.638e-02, -1.094e-01)); + r += mul(s3_2, M4(3.213e-03, 4.675e-02, -2.631e-02, -1.086e-02, -1.903e-02, -1.028e-01, -1.084e-01, 2.649e-02, 9.822e-03, 7.725e-03, -1.691e-02, 3.222e-02, -9.035e-03, 2.980e-02, 5.749e-02, -3.044e-02)); + r += mul(s3_3, M4(-7.619e-02, -1.622e-03, 3.324e-01, 4.752e-02, -3.685e-02, -4.685e-02, -8.527e-02, 2.294e-02, -2.439e-02, -6.236e-03, -3.104e-02, 3.233e-02, 1.789e-02, -4.432e-02, -1.392e-01, -9.780e-02)); + r += mul(s3_4, M4(2.911e-01, 3.642e-01, 3.817e-01, -9.316e-02, 4.124e-02, -3.579e-02, 4.983e-02, 1.040e-01, 5.359e-02, -3.462e-01, 4.782e-02, -2.421e-01, 2.007e-02, -2.380e-01, -1.773e-01, -6.314e-01)); + r += mul(s3_5, M4(-3.313e-03, -1.201e-02, -1.415e-02, 8.734e-03, 3.021e-02, 9.567e-02, 2.296e-02, -6.178e-02, 5.850e-02, 6.168e-02, -6.368e-02, -5.051e-02, -2.251e-02, -3.667e-02, 3.398e-02, 2.872e-02)); + r += mul(s3_6, M4(4.334e-02, -4.642e-02, -2.431e-01, -3.343e-02, -2.479e-03, -5.827e-03, 3.528e-02, 3.433e-02, -4.470e-02, -2.127e-02, -7.138e-03, 3.796e-02, 1.379e-02, 4.208e-02, 4.114e-02, 2.813e-02)); + r += mul(s3_7, M4(-1.170e-02, -4.718e-02, 2.204e-02, 5.829e-02, -5.554e-03, -1.019e-01, -2.598e-01, -1.456e-01, 1.797e-02, 1.255e-01, -5.581e-02, 1.283e-01, -3.416e-02, -8.180e-02, -5.774e-02, 9.365e-02)); + r += mul(s3_8, M4(1.354e-02, 4.724e-02, 4.335e-02, 5.845e-02, -9.950e-03, -7.794e-02, -2.257e-02, 3.610e-03, 2.669e-02, -1.255e-01, -5.754e-02, 1.600e-01, -2.851e-03, 3.557e-02, 3.722e-02, 1.257e-02)); + r += V4(1.101e-03, 2.116e-04, -1.154e-03, -3.483e-03); + return r; +} + +V4 f1(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-8.139e-03, 4.801e-02, 1.603e-02, 3.358e-02, 4.412e-02, -3.926e-03, 1.599e-02, -2.674e-02, 1.052e-02, 3.787e-03, -7.897e-03, 6.304e-03, -5.446e-03, 4.456e-03, 3.906e-03, -3.014e-02)); + r += mul(s0_1, M4(-4.183e-02, -4.484e-02, -1.794e-02, 8.394e-02, 9.001e-03, 8.132e-03, -1.436e-02, 6.112e-02, -3.553e-02, 1.347e-02, 1.129e-02, -1.392e-02, -5.328e-02, 4.777e-03, -2.372e-02, 1.061e-02)); + r += mul(s0_2, M4(-9.735e-02, 5.944e-02, 2.399e-02, -2.746e-02, -3.898e-02, 3.360e-03, -6.036e-03, -3.314e-02, 4.432e-02, -1.326e-02, -1.406e-02, 3.821e-02, -3.058e-02, -5.659e-03, 4.182e-04, -4.163e-02)); + r += mul(s0_3, M4(-1.753e-01, 8.851e-03, 9.107e-02, 6.816e-02, 5.333e-02, 1.918e-02, -3.936e-02, 1.615e-02, 5.222e-03, -9.198e-03, 2.073e-03, -2.037e-02, -3.624e-02, 5.469e-03, 3.329e-02, 7.935e-02)); + r += mul(s0_4, M4(3.188e-01, -3.351e-02, 3.946e-02, -1.936e-01, -8.892e-02, -2.977e-02, 1.599e-02, -8.213e-02, -2.080e-02, -4.108e-02, 7.681e-02, 5.185e-02, 3.339e-01, -1.861e-01, 8.615e-02, -4.358e-02)); + r += mul(s0_5, M4(-1.339e-01, 2.904e-02, -6.564e-02, 1.283e-01, -2.102e-01, -9.994e-02, 6.066e-02, 8.217e-02, 1.274e-01, 4.664e-02, 1.387e-02, -1.304e-01, -4.338e-01, 1.438e-01, -8.452e-02, 9.942e-02)); + r += mul(s0_6, M4(-3.172e-03, 1.855e-02, -1.299e-01, -5.566e-02, 1.342e-02, -3.773e-02, 1.164e-01, -4.885e-02, 2.672e-02, 2.120e-03, 6.741e-03, -1.942e-02, 1.131e-02, 1.268e-02, -6.915e-03, -3.804e-02)); + r += mul(s0_7, M4(-3.183e-02, 1.248e-01, 2.723e-01, 4.886e-02, -5.783e-02, -3.498e-02, -7.778e-02, 7.155e-02, -4.697e-02, -1.291e-02, 1.091e-02, -5.571e-02, 4.493e-02, 2.837e-03, 1.022e-01, -5.141e-02)); + r += mul(s0_8, M4(-6.313e-03, -4.400e-02, 5.050e-04, 2.227e-02, -9.350e-02, -4.613e-03, -4.296e-02, 1.727e-03, 6.421e-02, 5.700e-02, 7.157e-03, 6.188e-02, -2.251e-01, -8.961e-03, -4.093e-02, 9.974e-02)); + r += mul(s1_0, M4(-1.039e-01, 1.880e-02, 8.841e-03, 7.631e-02, -4.356e-03, 1.133e-03, 1.746e-02, -4.062e-02, -1.458e-02, -1.400e-02, -4.845e-03, 7.824e-03, 3.870e-02, -1.011e-03, -5.752e-03, -3.031e-02)); + r += mul(s1_1, M4(6.233e-02, -2.081e-02, 2.657e-02, 9.817e-02, -5.733e-02, 5.913e-02, -4.861e-03, 5.648e-02, 1.835e-02, -1.568e-02, 6.182e-03, -1.379e-02, 6.751e-03, 4.911e-03, -1.231e-02, 3.740e-02)); + r += mul(s1_2, M4(-4.699e-02, 8.618e-02, 1.229e-02, -6.548e-03, 2.591e-02, -9.380e-02, 4.808e-02, 1.493e-03, 5.835e-02, -2.621e-03, -2.251e-02, 2.527e-03, -8.374e-02, 4.826e-03, -2.984e-03, -1.785e-02)); + r += mul(s1_3, M4(-9.938e-03, -4.651e-02, 1.316e-01, -1.821e-01, -4.344e-02, 1.548e-02, -5.539e-02, 1.124e-01, 6.993e-03, -5.261e-03, 2.396e-02, 7.078e-03, -3.761e-02, 1.679e-02, 6.152e-02, -6.838e-04)); + r += mul(s1_4, M4(-1.082e-01, 1.483e-01, -1.165e-01, -6.575e-01, 3.764e-01, -5.165e-02, 2.034e-01, -3.174e-01, 2.801e-01, -2.852e-02, -1.561e-02, 4.623e-02, 8.767e-03, -6.216e-02, 7.259e-02, -4.773e-02)); + r += mul(s1_5, M4(-4.327e-02, -5.334e-02, -1.740e-02, 8.949e-02, 2.073e-01, -9.327e-01, -5.263e-02, 8.325e-03, 2.765e-01, 7.962e-01, 6.864e-02, -1.538e-01, -1.516e-01, 2.461e-02, -7.246e-03, 5.921e-02)); + r += mul(s1_6, M4(-8.185e-03, -3.844e-02, 7.961e-02, -9.410e-03, 4.108e-04, -2.167e-03, -1.127e-01, 2.967e-02, 1.753e-03, 4.788e-03, 4.251e-02, -1.486e-02, 2.875e-02, -1.012e-02, 3.946e-02, -3.900e-02)); + r += mul(s1_7, M4(-8.943e-03, 2.983e-02, -5.527e-02, -2.334e-02, -6.379e-02, 3.683e-02, -3.037e-01, 1.132e-01, 1.233e-02, 2.120e-02, 2.496e-01, -1.707e-01, -4.890e-03, 4.398e-02, -4.966e-02, 3.483e-02)); + r += mul(s1_8, M4(-4.941e-03, 7.157e-03, -1.099e-02, 4.138e-02, -7.410e-02, -5.163e-02, 3.074e-02, -3.082e-02, -2.063e-02, 2.558e-01, -1.401e-01, 1.954e-01, 1.225e-02, -6.256e-02, 2.581e-02, -3.332e-02)); + r += mul(s2_0, M4(3.635e-02, 5.231e-03, -4.170e-02, 4.580e-02, -4.653e-03, 9.252e-03, -2.538e-02, 5.636e-03, 5.214e-02, 6.077e-03, -1.398e-02, -2.888e-02, -4.214e-02, 1.758e-02, 2.678e-02, -2.664e-02)); + r += mul(s2_1, M4(-4.114e-02, 5.198e-02, 9.590e-03, -2.777e-02, -6.989e-02, 5.447e-03, -1.375e-02, 1.284e-01, -9.811e-04, 2.238e-02, 4.914e-03, 3.380e-02, 6.931e-02, -1.843e-02, 1.917e-02, 1.045e-02)); + r += mul(s2_2, M4(8.599e-02, -1.864e-02, -7.699e-03, 1.346e-02, 6.046e-03, 3.235e-02, 1.948e-02, -2.311e-03, -2.597e-02, 3.028e-02, 3.122e-02, -1.293e-02, -1.139e-03, 9.886e-03, 1.895e-02, 1.435e-02)); + r += mul(s2_3, M4(-9.374e-02, -4.919e-02, 9.379e-02, -7.869e-02, -1.614e-03, -1.447e-02, -1.151e-02, 1.634e-02, -4.178e-02, -4.215e-03, 1.515e-02, 3.309e-02, 1.458e-02, 4.229e-02, 1.160e-03, 3.808e-02)); + r += mul(s2_4, M4(-2.479e-02, 2.123e-03, -1.670e-02, 1.710e-01, 1.476e-01, 1.105e-01, 8.431e-03, -6.465e-01, 1.034e-01, -2.353e-02, -4.223e-02, -4.599e-02, 2.390e-01, -8.565e-02, 1.056e-01, -1.849e-02)); + r += mul(s2_5, M4(7.623e-02, 2.227e-02, 2.566e-03, -8.814e-02, -1.420e-01, -4.561e-02, -8.096e-03, 6.678e-02, 1.813e-01, -4.586e-02, -2.824e-03, 4.914e-03, -5.548e-02, 2.289e-02, -3.724e-02, -4.919e-02)); + r += mul(s2_6, M4(1.146e-02, -9.689e-03, -4.242e-02, 5.383e-02, 3.955e-03, -2.442e-02, 7.879e-02, -3.362e-02, 2.215e-02, 2.008e-03, 5.887e-03, -1.880e-02, -2.466e-02, -2.656e-02, 1.069e-01, -5.091e-02)); + r += mul(s2_7, M4(-1.438e-02, 1.372e-02, 4.616e-03, -6.651e-02, 1.724e-03, -2.181e-02, -1.028e-02, 1.685e-01, -1.914e-04, -5.789e-02, 1.803e-01, -4.568e-02, -2.648e-03, 9.449e-02, 1.811e-03, 1.118e-01)); + r += mul(s2_8, M4(5.457e-02, 7.597e-03, 3.242e-02, -1.486e-02, 8.487e-02, -4.658e-03, -5.511e-02, -2.655e-02, 1.510e-01, -1.640e-02, 2.092e-01, -2.047e-01, -3.228e-02, -5.188e-02, -3.577e-02, 6.335e-02)); + r += mul(s3_0, M4(2.751e-02, 1.164e-02, -7.354e-03, 1.738e-02, 5.841e-02, 2.209e-02, -2.322e-02, -1.156e-02, 6.615e-02, 1.279e-02, -4.472e-03, -9.096e-03, -1.528e-02, 1.383e-02, 1.389e-02, -3.084e-02)); + r += mul(s3_1, M4(-2.044e-01, 3.340e-03, -3.237e-04, -3.528e-02, -4.652e-02, -1.142e-02, 2.224e-02, 8.739e-02, 8.402e-02, -1.391e-02, -6.910e-03, 5.285e-02, 1.661e-02, 1.119e-02, 8.985e-03, 1.291e-02)); + r += mul(s3_2, M4(1.460e-01, -8.168e-02, 3.896e-02, -1.981e-02, -5.708e-02, 4.458e-02, 5.119e-03, -2.267e-02, -6.497e-02, 7.691e-02, -1.412e-02, -1.887e-03, 3.175e-02, 4.805e-02, 5.430e-03, 1.617e-02)); + r += mul(s3_3, M4(-6.320e-02, -3.050e-02, -9.449e-02, -8.528e-02, -3.759e-02, -7.222e-03, -4.294e-03, 6.067e-02, -5.506e-03, 9.794e-03, 3.820e-02, 4.139e-02, -5.172e-02, 6.190e-02, 3.339e-02, 6.331e-02)); + r += mul(s3_4, M4(-3.370e-01, 3.061e-01, 1.962e-01, 1.538e-01, 1.176e-01, -2.454e-02, 1.303e-02, -1.997e-01, 3.462e-01, 2.586e-02, -1.343e-01, -3.291e-01, -8.535e-02, -1.103e-01, -4.880e-02, 2.446e-01)); + r += mul(s3_5, M4(1.265e-01, -1.734e-01, 2.422e-02, -1.558e-01, -2.041e-02, 4.496e-02, -1.906e-02, 8.517e-02, -3.115e-01, 2.843e-01, 2.961e-02, 7.657e-03, -2.348e-03, 6.712e-02, -4.156e-02, -5.768e-02)); + r += mul(s3_6, M4(1.086e-02, -2.221e-03, 8.270e-02, 3.185e-02, -1.962e-02, -1.782e-03, -2.368e-02, -3.431e-02, -2.859e-02, -1.832e-02, -4.540e-02, 2.570e-02, -2.138e-03, -1.952e-02, 2.247e-04, -4.177e-02)); + r += mul(s3_7, M4(-1.425e-01, 6.336e-02, -1.040e-01, 5.089e-02, -3.597e-02, 1.705e-02, -2.995e-02, 1.966e-01, 1.487e-01, -6.668e-02, 6.159e-01, -2.875e-01, -1.333e-02, 2.252e-02, -1.610e-01, 4.135e-02)); + r += mul(s3_8, M4(-5.173e-02, -2.024e-02, 7.865e-02, 1.027e-02, 3.283e-02, 1.865e-02, 2.220e-02, -6.929e-02, 8.660e-03, 3.481e-02, -3.540e-03, 2.775e-02, -7.171e-02, -2.940e-02, 2.794e-02, 3.405e-02)); + r += V4(7.644e-03, -3.720e-03, -2.028e-03, -1.031e-03); + return r; +} + +void Pass9(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = Rmp8x8(tid.x) + blockStart; + uint2 size = GetInputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = (gxy + 0.5) * pt; + + V4 s0_0 = l0(-1.0, -1.0); + V4 s0_1 = l0(0.0, -1.0); + V4 s0_2 = l0(1.0, -1.0); + V4 s0_3 = l0(-1.0, 0.0); + V4 s0_4 = l0(0.0, 0.0); + V4 s0_5 = l0(1.0, 0.0); + V4 s0_6 = l0(-1.0, 1.0); + V4 s0_7 = l0(0.0, 1.0); + V4 s0_8 = l0(1.0, 1.0); + V4 s1_0 = -max(-s0_0, 0.0); + V4 s1_1 = -max(-s0_1, 0.0); + V4 s1_2 = -max(-s0_2, 0.0); + V4 s1_3 = -max(-s0_3, 0.0); + V4 s1_4 = -max(-s0_4, 0.0); + V4 s1_5 = -max(-s0_5, 0.0); + V4 s1_6 = -max(-s0_6, 0.0); + V4 s1_7 = -max(-s0_7, 0.0); + V4 s1_8 = -max(-s0_8, 0.0); + s0_0 = max(s0_0, 0.0); + s0_1 = max(s0_1, 0.0); + s0_2 = max(s0_2, 0.0); + s0_3 = max(s0_3, 0.0); + s0_4 = max(s0_4, 0.0); + s0_5 = max(s0_5, 0.0); + s0_6 = max(s0_6, 0.0); + s0_7 = max(s0_7, 0.0); + s0_8 = max(s0_8, 0.0); + + V4 s2_0 = l1(-1.0, -1.0); + V4 s2_1 = l1(0.0, -1.0); + V4 s2_2 = l1(1.0, -1.0); + V4 s2_3 = l1(-1.0, 0.0); + V4 s2_4 = l1(0.0, 0.0); + V4 s2_5 = l1(1.0, 0.0); + V4 s2_6 = l1(-1.0, 1.0); + V4 s2_7 = l1(0.0, 1.0); + V4 s2_8 = l1(1.0, 1.0); + V4 s3_0 = -max(-s2_0, 0.0); + V4 s3_1 = -max(-s2_1, 0.0); + V4 s3_2 = -max(-s2_2, 0.0); + V4 s3_3 = -max(-s2_3, 0.0); + V4 s3_4 = -max(-s2_4, 0.0); + V4 s3_5 = -max(-s2_5, 0.0); + V4 s3_6 = -max(-s2_6, 0.0); + V4 s3_7 = -max(-s2_7, 0.0); + V4 s3_8 = -max(-s2_8, 0.0); + s2_0 = max(s2_0, 0.0); + s2_1 = max(s2_1, 0.0); + s2_2 = max(s2_2, 0.0); + s2_3 = max(s2_3, 0.0); + s2_4 = max(s2_4, 0.0); + s2_5 = max(s2_5, 0.0); + s2_6 = max(s2_6, 0.0); + s2_7 = max(s2_7, 0.0); + s2_8 = max(s2_8, 0.0); + + t0[gxy] = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8); + t1[gxy] = f1(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8); +} + +//!PASS 10 +//!DESC out-shuffle +//!BLOCK_SIZE 16 +//!NUM_THREADS 64 +//!IN INPUT, t0, t1 +//!OUT OUTPUT + +#define l0(x, y) V4(O(t0, float2(x, y))) +#define l1(x, y) V4(O(t1, float2(x, y))) + +V4 f0(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8) { + V4 r = 0.0; + r += mul(s0_0, M4(8.460e-03, 7.227e-04, -9.095e-03, -1.062e-03, 1.404e-03, -3.055e-03, 1.972e-02, -3.617e-03, -1.110e-02, -2.615e-03, -2.163e-02, 7.194e-03, 1.631e-02, 5.920e-03, -2.313e-02, 9.194e-03)); + r += mul(s0_1, M4(1.074e-01, 4.925e-02, 3.811e-03, -3.480e-03, -1.927e-02, -9.323e-02, 3.442e-02, -3.375e-03, 8.942e-02, 5.369e-02, 3.605e-03, -2.149e-02, 1.238e-01, 1.032e-01, -7.511e-03, -2.420e-02)); + r += mul(s0_2, M4(-4.397e-03, 6.268e-02, -1.117e-03, 5.248e-03, 6.173e-03, -4.652e-02, 2.153e-03, -1.332e-02, -2.124e-02, 6.323e-02, -6.680e-03, 2.414e-02, -2.336e-02, 3.126e-02, -1.137e-03, 8.318e-03)); + r += mul(s0_3, M4(-2.841e-02, 1.182e-02, 5.716e-03, 1.522e-02, 1.087e-01, -2.623e-03, 2.560e-02, -1.135e-03, -2.773e-02, 4.115e-02, -9.738e-03, -5.203e-03, -4.173e-02, -2.201e-02, 3.295e-02, -1.266e-02)); + r += mul(s0_4, M4(-4.117e-01, -2.906e-01, 1.740e-01, 7.056e-02, 2.449e-01, 2.290e-01, 2.660e-02, -1.887e-01, -1.606e-01, -2.341e-01, 2.386e-02, 9.567e-02, 2.140e-01, 5.510e-02, 3.705e-01, 3.566e-01)); + r += mul(s0_5, M4(9.640e-03, -1.480e-01, -1.321e-02, 9.225e-02, -4.257e-03, -3.511e-02, -7.280e-03, -7.580e-02, -1.273e-02, 7.344e-02, -1.140e-02, 8.228e-02, -6.665e-02, 2.214e-02, -2.575e-02, 5.468e-02)); + r += mul(s0_6, M4(2.629e-02, 3.221e-03, 1.147e-02, 1.322e-02, 1.657e-03, -8.292e-03, 2.597e-02, -3.207e-04, 4.843e-03, -2.782e-03, 6.102e-03, 1.200e-02, 7.469e-03, 1.380e-02, -1.182e-02, -1.349e-02)); + r += mul(s0_7, M4(-2.984e-02, 2.692e-02, -3.633e-02, -2.845e-02, -5.878e-02, -4.681e-02, 9.777e-02, 7.897e-03, 2.619e-02, 4.158e-02, -6.065e-02, -5.580e-02, -1.509e-03, -3.725e-03, 3.659e-02, 2.728e-02)); + r += mul(s0_8, M4(4.502e-03, 5.966e-03, -6.348e-03, -2.444e-02, -1.109e-02, -9.121e-03, 1.412e-02, -2.219e-02, 2.528e-02, 1.424e-02, -1.909e-02, 3.809e-02, 3.335e-03, -6.195e-03, -5.777e-03, -1.163e-02)); + r += mul(s1_0, M4(7.927e-02, -3.654e-02, -7.104e-02, -5.741e-03, -4.468e-02, -1.148e-02, 3.049e-02, -7.024e-03, 4.900e-02, -1.474e-02, -2.352e-02, -7.655e-03, -6.889e-03, -1.154e-04, -1.898e-02, -1.786e-03)); + r += mul(s1_1, M4(-1.474e-01, 4.527e-01, 9.350e-02, -1.063e-02, -1.159e-01, -1.820e-01, 2.065e-02, -2.246e-02, 8.028e-02, 1.627e-01, -5.292e-02, -5.642e-02, 9.400e-02, 6.621e-02, -1.423e-02, -2.229e-02)); + r += mul(s1_2, M4(-4.682e-02, 7.007e-02, 4.030e-03, -5.523e-02, -4.159e-03, -3.023e-02, 3.451e-04, -1.617e-02, 1.268e-02, 2.771e-02, -5.629e-03, 1.612e-02, -2.279e-02, 1.539e-02, -6.265e-03, 3.223e-03)); + r += mul(s1_3, M4(-2.588e-01, 5.084e-02, 2.529e-01, 3.827e-02, 2.549e-02, 6.341e-03, 9.548e-02, 2.094e-02, -2.024e-02, 2.899e-02, -3.879e-02, 7.127e-03, -3.527e-02, -2.582e-02, 3.312e-03, -1.217e-02)); + r += mul(s1_4, M4(8.045e-02, -5.762e-01, -2.616e-01, -9.298e-02, 2.315e-01, -1.745e-01, 2.468e-02, 5.254e-01, -5.182e-01, -4.752e-01, 4.877e-01, 1.722e-01, 1.480e-01, 4.491e-02, 2.757e-01, 2.529e-01)); + r += mul(s1_5, M4(1.792e-02, -1.146e-02, 2.996e-02, 1.509e-01, -2.630e-02, -1.523e-02, 2.457e-02, -5.773e-02, -2.553e-02, 3.057e-02, -3.759e-02, 1.110e-01, -6.776e-02, -6.445e-03, -3.691e-02, 4.384e-02)); + r += mul(s1_6, M4(-9.344e-03, 5.605e-02, 3.183e-02, -6.304e-03, -1.731e-02, 2.691e-03, 2.398e-02, -1.864e-02, 1.464e-02, 8.938e-04, -1.099e-02, -1.108e-03, -4.259e-03, 6.059e-03, -2.336e-02, -1.933e-02)); + r += mul(s1_7, M4(-4.542e-02, -1.644e-02, 5.247e-02, -2.091e-02, -7.788e-02, -3.454e-02, 8.288e-02, -1.948e-02, 7.775e-02, 7.495e-02, -1.214e-01, -8.277e-02, -2.031e-02, -2.472e-02, 2.223e-02, 2.040e-02)); + r += mul(s1_8, M4(4.182e-03, 1.227e-02, -3.306e-02, -2.026e-02, -1.007e-02, -4.687e-03, 8.388e-03, -1.988e-02, 4.379e-02, 2.888e-02, -3.609e-02, -8.212e-03, 9.212e-03, -1.536e-02, -1.724e-02, -2.522e-02)); + r += mul(s2_0, M4(1.291e-02, -7.279e-03, -1.884e-02, -1.385e-02, 5.309e-02, -1.217e-01, -5.973e-02, 3.029e-03, 4.425e-02, -1.353e-02, -1.157e-02, -2.189e-02, 2.732e-02, -1.622e-03, -2.147e-02, -6.696e-03)); + r += mul(s2_1, M4(1.174e-03, 4.834e-02, 1.280e-03, -1.357e-02, 1.357e-04, -2.637e-02, -8.604e-03, -1.080e-02, -9.358e-02, 7.446e-02, -8.482e-02, 4.900e-03, 1.160e-01, 8.796e-02, 4.314e-02, -7.086e-02)); + r += mul(s2_2, M4(-1.170e-02, -3.009e-02, -6.555e-03, 7.647e-03, -1.085e-04, -7.936e-03, 6.060e-04, -2.554e-03, 4.105e-02, -1.081e-02, 2.310e-02, -4.364e-02, -3.687e-02, -5.708e-03, 1.309e-02, 5.824e-03)); + r += mul(s2_3, M4(-8.081e-02, 4.155e-02, 4.842e-03, 1.172e-03, 3.383e-01, -2.309e-01, 4.094e-01, -3.521e-01, -2.314e-02, 4.370e-03, 3.993e-02, -1.701e-02, 6.141e-02, 2.521e-02, 7.447e-02, -2.860e-02)); + r += mul(s2_4, M4(9.761e-02, -2.114e-01, 6.705e-02, 8.186e-02, -7.398e-02, 1.014e-01, -1.438e-02, 7.350e-02, -6.589e-02, -1.153e-01, -6.204e-02, 1.552e-01, 6.467e-03, -3.129e-01, -4.580e-01, 3.175e-01)); + r += mul(s2_5, M4(-3.723e-02, 4.215e-02, -3.603e-03, -8.876e-03, -3.673e-03, 6.429e-03, -2.291e-03, 1.391e-03, 3.951e-02, 3.606e-02, 4.704e-02, -1.833e-02, 1.196e-01, -1.401e-02, 5.382e-02, -9.219e-02)); + r += mul(s2_6, M4(2.195e-02, -7.400e-03, -5.462e-03, -8.206e-05, -3.480e-02, 6.492e-03, 2.162e-02, -6.141e-02, -9.732e-03, 4.517e-04, 1.305e-02, -3.104e-03, 2.624e-03, -3.583e-03, 3.643e-02, -6.009e-04)); + r += mul(s2_7, M4(-3.295e-02, -3.172e-03, 3.492e-02, -4.382e-02, 3.715e-02, -6.948e-03, -4.113e-02, 2.448e-02, 2.546e-02, 1.106e-02, -3.410e-02, -3.827e-03, -6.474e-02, 1.733e-02, 6.169e-02, -5.725e-02)); + r += mul(s2_8, M4(5.160e-03, -9.184e-03, -8.453e-03, 1.735e-02, -9.055e-04, 2.434e-03, -2.602e-03, -6.082e-03, 2.434e-03, 1.192e-03, 4.964e-03, 1.187e-02, -1.960e-02, -1.187e-02, 4.503e-02, 4.133e-03)); + r += mul(s3_0, M4(-3.137e-02, 2.267e-03, -2.172e-02, -6.702e-03, -5.108e-02, -1.915e-02, -5.771e-02, -1.442e-03, -5.126e-02, -3.757e-03, -2.437e-03, -2.560e-02, 8.972e-03, 5.875e-03, -2.397e-02, 6.039e-03)); + r += mul(s3_1, M4(4.555e-02, 3.433e-02, 8.142e-03, -2.053e-02, 1.649e-03, 1.561e-02, -5.300e-03, -3.121e-02, 5.693e-01, -9.351e-02, -1.264e-01, -1.818e-01, 1.213e-01, -1.382e-02, 3.586e-02, -3.418e-02)); + r += mul(s3_2, M4(-1.550e-02, 7.598e-03, -5.015e-03, 1.551e-02, -4.808e-03, -9.668e-03, -1.379e-03, -2.895e-05, -5.092e-02, -1.590e-01, -3.258e-02, 1.031e-01, -2.058e-02, -1.988e-02, 1.329e-02, 6.773e-03)); + r += mul(s3_3, M4(-1.773e-02, 6.275e-02, -1.810e-02, 3.388e-02, 4.458e-02, -5.655e-02, 4.576e-02, -1.008e-01, 2.308e-02, 2.453e-03, -1.786e-02, -2.168e-02, 3.045e-02, 4.050e-02, 4.333e-02, -6.095e-03)); + r += mul(s3_4, M4(3.527e-01, -5.137e-01, 2.419e-01, -9.781e-02, -1.164e-01, 2.269e-01, -7.007e-02, 2.617e-01, -1.806e-01, -9.152e-02, -5.043e-02, 2.164e-01, -5.430e-02, -2.751e-01, 6.120e-02, 8.343e-02)); + r += mul(s3_5, M4(-4.383e-02, 5.480e-02, -6.708e-03, 1.620e-02, 6.208e-05, -5.279e-03, 4.534e-03, -2.042e-02, 7.568e-02, 5.119e-02, 2.790e-02, -2.173e-01, 5.097e-02, -1.295e-02, 5.325e-02, -1.220e-01)); + r += mul(s3_6, M4(-1.231e-02, 1.110e-03, -2.134e-02, 2.965e-03, -1.631e-02, 1.171e-02, -8.523e-04, -2.774e-02, -2.671e-03, -5.021e-03, 1.219e-03, -1.524e-03, 3.867e-03, -2.020e-02, 4.456e-02, 6.040e-03)); + r += mul(s3_7, M4(-3.383e-02, 1.125e-02, 9.401e-02, -1.240e-01, 4.461e-02, -2.716e-02, -9.338e-03, 1.624e-03, 1.596e-02, 1.825e-02, -1.462e-02, -2.676e-02, -1.739e-02, 8.447e-03, 2.961e-02, -1.786e-02)); + r += mul(s3_8, M4(9.271e-03, -5.721e-03, -1.180e-02, 4.245e-02, -2.551e-04, 7.369e-03, -1.046e-02, 5.688e-03, -1.398e-02, 9.160e-06, 2.457e-02, 8.210e-03, -1.589e-03, -4.574e-03, 3.357e-02, 2.664e-02)); + r += V4(3.001e-04, 1.819e-03, -1.517e-04, 1.301e-03); + return tanh(r); +} + +void Pass10(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = (Rmp8x8(tid.x) << 1) + blockStart; + uint2 size = GetOutputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = ((gxy >> 1) + 0.5) * pt; + + V4 s0_0 = l0(-1.0, -1.0); + V4 s0_1 = l0(0.0, -1.0); + V4 s0_2 = l0(1.0, -1.0); + V4 s0_3 = l0(-1.0, 0.0); + V4 s0_4 = l0(0.0, 0.0); + V4 s0_5 = l0(1.0, 0.0); + V4 s0_6 = l0(-1.0, 1.0); + V4 s0_7 = l0(0.0, 1.0); + V4 s0_8 = l0(1.0, 1.0); + V4 s1_0 = -max(-s0_0, 0.0); + V4 s1_1 = -max(-s0_1, 0.0); + V4 s1_2 = -max(-s0_2, 0.0); + V4 s1_3 = -max(-s0_3, 0.0); + V4 s1_4 = -max(-s0_4, 0.0); + V4 s1_5 = -max(-s0_5, 0.0); + V4 s1_6 = -max(-s0_6, 0.0); + V4 s1_7 = -max(-s0_7, 0.0); + V4 s1_8 = -max(-s0_8, 0.0); + s0_0 = max(s0_0, 0.0); + s0_1 = max(s0_1, 0.0); + s0_2 = max(s0_2, 0.0); + s0_3 = max(s0_3, 0.0); + s0_4 = max(s0_4, 0.0); + s0_5 = max(s0_5, 0.0); + s0_6 = max(s0_6, 0.0); + s0_7 = max(s0_7, 0.0); + s0_8 = max(s0_8, 0.0); + + V4 s2_0 = l1(-1.0, -1.0); + V4 s2_1 = l1(0.0, -1.0); + V4 s2_2 = l1(1.0, -1.0); + V4 s2_3 = l1(-1.0, 0.0); + V4 s2_4 = l1(0.0, 0.0); + V4 s2_5 = l1(1.0, 0.0); + V4 s2_6 = l1(-1.0, 1.0); + V4 s2_7 = l1(0.0, 1.0); + V4 s2_8 = l1(1.0, 1.0); + V4 s3_0 = -max(-s2_0, 0.0); + V4 s3_1 = -max(-s2_1, 0.0); + V4 s3_2 = -max(-s2_2, 0.0); + V4 s3_3 = -max(-s2_3, 0.0); + V4 s3_4 = -max(-s2_4, 0.0); + V4 s3_5 = -max(-s2_5, 0.0); + V4 s3_6 = -max(-s2_6, 0.0); + V4 s3_7 = -max(-s2_7, 0.0); + V4 s3_8 = -max(-s2_8, 0.0); + s2_0 = max(s2_0, 0.0); + s2_1 = max(s2_1, 0.0); + s2_2 = max(s2_2, 0.0); + s2_3 = max(s2_3, 0.0); + s2_4 = max(s2_4, 0.0); + s2_5 = max(s2_5, 0.0); + s2_6 = max(s2_6, 0.0); + s2_7 = max(s2_7, 0.0); + s2_8 = max(s2_8, 0.0); + + V4 r = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8); + + static const float3x3 rgb2yuv = {0.299, 0.587, 0.114, -0.169, -0.331, 0.5, 0.5, -0.419, -0.081}; + static const float3x3 yuv2rgb = {1, -0.00093, 1.401687, 1, -0.3437, -0.71417, 1, 1.77216, 0.00099}; + float2 opt = float2(GetOutputPt()); + + pos -= 0.5f * opt; + float3 yuv = mul(rgb2yuv, INPUT.SampleLevel(SL, pos, 0).rgb); + OUTPUT[gxy] = float4(mul(yuv2rgb, float3(saturate(yuv.r + r.x), yuv.yz)), 1); + + ++gxy.x; + pos.x += opt.x; + yuv = mul(rgb2yuv, INPUT.SampleLevel(SL, pos, 0).rgb); + OUTPUT[gxy] = float4(mul(yuv2rgb, float3(saturate(yuv.r + r.y), yuv.yz)), 1); + + ++gxy.y; + pos.y += opt.y; + yuv = mul(rgb2yuv, INPUT.SampleLevel(SL, pos, 0).rgb); + OUTPUT[gxy] = float4(mul(yuv2rgb, float3(saturate(yuv.r + r.w), yuv.yz)), 1); + + --gxy.x; + pos.x -= opt.x; + yuv = mul(rgb2yuv, INPUT.SampleLevel(SL, pos, 0).rgb); + OUTPUT[gxy] = float4(mul(yuv2rgb, float3(saturate(yuv.r + r.z), yuv.yz)), 1); +} diff --git a/src/Effects/CuNNy/CuNNy-8x8C-NVL.hlsl b/src/Effects/CuNNy/CuNNy-8x8C-NVL.hlsl new file mode 100644 index 000000000..4bf58285f --- /dev/null +++ b/src/Effects/CuNNy/CuNNy-8x8C-NVL.hlsl @@ -0,0 +1,1573 @@ +// CuNNy 8x8C BILINEAR RGB NVL - https://github.com/cunnyplapper/CuNNy + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +//!MAGPIE EFFECT +//!VERSION 4 +//!SORT_NAME CuNNy-D08N08 + +//!TEXTURE +Texture2D INPUT; + +//!TEXTURE +//!WIDTH INPUT_WIDTH * 2 +//!HEIGHT INPUT_HEIGHT * 2 +Texture2D OUTPUT; + +//!SAMPLER +//!FILTER POINT +SamplerState SP; + +//!SAMPLER +//!FILTER LINEAR +SamplerState SL; + +//!COMMON +#define O(t, p) t.SampleLevel(SP, pos + p * pt, 0) +#define V4 min16float4 +#define M4 min16float4x4 + +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +//!FORMAT R8G8B8A8_SNORM +Texture2D t0; + +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +//!FORMAT R8G8B8A8_SNORM +Texture2D t1; + +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +//!FORMAT R8G8B8A8_SNORM +Texture2D t2; + +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +//!FORMAT R8G8B8A8_SNORM +Texture2D t3; + +//!PASS 1 +//!DESC in +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 +//!IN INPUT +//!OUT t0, t1 + +#define l0(x, y) min16float((dot(float3(-2.295e-01, -4.396e-01, -9.400e-02), O(INPUT, float2(x, y)).rgb) + 4.020e-01)) + +V4 f0(min16float s0_0, min16float s0_1, min16float s0_2, min16float s0_3, min16float s0_4, min16float s0_5, min16float s0_6, min16float s0_7, min16float s0_8) { + V4 r = 0.0; + r += V4(-6.143e-02, 4.017e-02, -1.294e-02, -3.488e-02) * s0_0; + r += V4(4.633e-02, 1.525e-01, -6.941e-02, -8.333e-03) * s0_1; + r += V4(1.821e-02, -4.740e-02, 4.913e-03, 2.561e-02) * s0_2; + r += V4(2.997e-02, 7.561e-02, -1.418e-01, 1.597e-01) * s0_3; + r += V4(6.072e-01, -2.588e-01, 3.815e-01, -1.866e-02) * s0_4; + r += V4(-3.722e-01, 8.227e-02, -5.957e-02, -2.609e-01) * s0_5; + r += V4(3.887e-02, -2.027e-02, 2.253e-02, 1.248e-01) * s0_6; + r += V4(-1.460e-01, 4.258e-02, -4.664e-02, 2.242e-01) * s0_7; + r += V4(-1.609e-01, -3.864e-03, -3.072e-02, -2.202e-01) * s0_8; + r += V4(-5.020e-03, -2.675e-02, -3.797e-02, 7.620e-03); + return r; +} + +V4 f1(min16float s0_0, min16float s0_1, min16float s0_2, min16float s0_3, min16float s0_4, min16float s0_5, min16float s0_6, min16float s0_7, min16float s0_8) { + V4 r = 0.0; + r += V4(-1.903e-03, 1.630e-02, -2.729e-02, -8.977e-03) * s0_0; + r += V4(1.878e-02, -3.107e-01, -4.692e-01, 2.842e-01) * s0_1; + r += V4(-9.660e-03, -8.709e-02, -1.921e-01, 1.169e-01) * s0_2; + r += V4(-4.066e-03, 2.283e-02, 2.079e-02, -7.654e-02) * s0_3; + r += V4(-1.286e-02, 5.680e-01, 2.607e-01, -3.642e-01) * s0_4; + r += V4(1.919e-02, -2.319e-01, 3.279e-01, 8.074e-02) * s0_5; + r += V4(5.403e-02, -2.921e-02, 1.082e-02, 6.616e-02) * s0_6; + r += V4(-3.475e-01, 2.298e-02, 1.890e-01, -5.933e-02) * s0_7; + r += V4(9.621e-03, 3.558e-02, -1.195e-01, -2.875e-02) * s0_8; + r += V4(1.049e-01, -1.181e-02, -1.058e-02, -1.062e-02); + return r; +} + +void Pass1(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = Rmp8x8(tid.x) + blockStart; + uint2 size = GetInputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = (gxy + 0.5) * pt; + + min16float s0_0 = l0(-1.0, -1.0); + min16float s0_1 = l0(0.0, -1.0); + min16float s0_2 = l0(1.0, -1.0); + min16float s0_3 = l0(-1.0, 0.0); + min16float s0_4 = l0(0.0, 0.0); + min16float s0_5 = l0(1.0, 0.0); + min16float s0_6 = l0(-1.0, 1.0); + min16float s0_7 = l0(0.0, 1.0); + min16float s0_8 = l0(1.0, 1.0); + + t0[gxy] = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8); + t1[gxy] = f1(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8); +} + +//!PASS 2 +//!DESC conv1 +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 +//!IN t0, t1 +//!OUT t2, t3 + +#define l0(x, y) V4(O(t0, float2(x, y))) +#define l1(x, y) V4(O(t1, float2(x, y))) + +V4 f0(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-1.079e-01, -6.209e-03, -5.165e-02, 3.059e-01, -1.088e-01, 1.518e-02, -1.715e-01, -4.790e-01, 9.833e-03, 8.433e-03, -1.041e-01, -1.785e-01, 3.452e-02, -9.679e-03, 4.601e-02, -9.835e-02)); + r += mul(s0_1, M4(-3.255e-02, 1.189e-01, 2.081e-01, 4.694e-01, 8.376e-01, 7.644e-02, 4.126e-03, -2.069e-01, 3.555e-01, 7.616e-02, 6.639e-03, 1.045e-01, 2.174e-02, 1.988e-01, 8.994e-02, -1.614e-01)); + r += mul(s0_2, M4(-2.806e-01, -2.092e-01, 1.030e-01, -1.734e-01, 1.701e-01, 3.388e-02, -8.975e-02, -2.286e-01, 8.847e-01, 2.175e-01, -3.606e-01, -2.783e-01, 5.524e-02, 6.168e-02, -1.753e-01, 9.562e-03)); + r += mul(s0_3, M4(-5.390e-02, 1.193e-01, -2.307e-01, 7.918e-01, 1.093e-01, 1.514e-01, -1.198e-01, 1.970e-01, -6.404e-02, -3.627e-02, -3.039e-01, 3.989e-01, -4.519e-02, 2.935e-02, -7.276e-02, 1.666e-01)); + r += mul(s0_4, M4(-4.617e-01, 4.250e-01, -1.689e-01, 2.009e-01, 2.763e-01, -5.223e-01, 6.812e-02, 7.042e-01, 6.269e-01, 4.437e-01, -8.346e-01, 2.686e-01, -1.802e-02, -1.487e-01, -3.822e-02, 2.222e-01)); + r += mul(s0_5, M4(3.233e-01, -1.180e-03, -4.640e-02, 1.197e-01, 4.480e-01, -6.224e-01, -1.695e-01, -3.179e-02, 1.063e+00, -2.599e-01, -8.862e-02, -1.894e-01, -2.136e-01, 1.618e-01, 1.563e-01, 1.551e-01)); + r += mul(s0_6, M4(7.462e-02, -1.786e-01, 1.469e-01, 3.023e-01, 1.644e-01, -1.871e-01, 2.594e-01, -4.580e-01, 1.328e-01, -1.746e-01, -9.667e-02, -5.360e-02, 6.538e-02, 3.959e-02, 7.461e-02, -1.333e-01)); + r += mul(s0_7, M4(-5.538e-02, -4.836e-01, -6.220e-02, -4.814e-01, 1.075e+00, -2.161e-01, 2.104e-01, 3.135e-01, -8.273e-02, 9.291e-02, 7.861e-02, 1.998e-01, -2.965e-02, -1.596e-01, -6.912e-02, 2.828e-02)); + r += mul(s0_8, M4(3.116e-02, 2.568e-01, 1.662e-02, -1.116e-01, 9.998e-01, -5.913e-01, -1.385e-01, -6.196e-01, 1.286e-02, 2.039e-01, -1.960e-01, 4.033e-01, 1.547e-01, -9.270e-02, -2.751e-02, 1.296e-01)); + r += mul(s1_0, M4(-4.361e-02, -2.010e-02, 2.791e-02, 1.056e-02, -1.917e-01, 1.587e-02, -7.196e-02, 1.375e-01, -2.334e-03, 4.510e-02, 3.333e-02, -1.447e-02, 3.589e-02, -4.001e-02, 7.667e-02, 6.927e-02)); + r += mul(s1_1, M4(1.005e-01, 3.245e-01, 2.143e-01, -2.198e-02, 9.360e-02, -8.266e-02, 2.428e-02, 7.946e-02, -8.792e-02, -5.322e-02, 1.436e-02, 5.331e-03, 1.547e-01, 1.074e-01, 2.043e-02, 3.151e-01)); + r += mul(s1_2, M4(-1.417e-01, -1.429e-01, 9.010e-02, -2.719e-01, -2.314e-01, -1.211e-01, -5.093e-02, 1.336e-03, -5.519e-02, -4.103e-02, -1.465e-01, 4.377e-02, 1.625e-01, 9.260e-02, -1.132e-01, 1.579e-01)); + r += mul(s1_3, M4(-4.690e-02, 3.414e-02, -3.446e-01, 5.756e-01, 4.127e-02, 5.835e-02, -7.117e-02, -1.233e-01, -1.676e-01, -6.558e-02, -1.035e-01, 2.054e-01, 3.734e-02, 1.632e-02, -1.065e-01, 1.426e-01)); + r += mul(s1_4, M4(2.777e-03, 5.095e-02, 7.937e-03, -5.967e-02, 1.193e-01, 3.256e-02, 9.556e-02, 8.563e-02, -1.386e-01, 2.129e-01, 1.093e-01, -4.675e-02, 1.955e-02, -5.246e-02, -2.056e-01, 2.337e-01)); + r += mul(s1_5, M4(3.632e-01, -1.052e-01, -4.334e-02, 7.445e-02, -1.537e-01, -5.209e-02, -7.747e-02, 9.552e-02, -1.148e-01, -2.824e-01, 1.545e-03, -7.691e-02, -7.978e-02, 2.649e-01, 1.413e-01, 9.935e-02)); + r += mul(s1_6, M4(-5.139e-02, 1.473e-01, 1.323e-01, 1.844e-01, -1.223e-01, -9.135e-02, 3.014e-01, -1.103e-01, 4.372e-02, 9.732e-02, 1.080e-01, 1.003e-01, 3.050e-02, -2.316e-02, 6.663e-02, -4.809e-02)); + r += mul(s1_7, M4(1.893e-01, -4.030e-01, 4.219e-02, -2.791e-01, 2.341e-01, 2.789e-01, -4.978e-02, -1.129e-01, 7.288e-02, -1.657e-01, 5.783e-02, -2.239e-01, -4.618e-02, -1.246e-01, -4.753e-02, -2.995e-02)); + r += mul(s1_8, M4(1.227e-01, -3.217e-02, 4.234e-02, -1.821e-01, -2.965e-01, -1.050e-01, -7.545e-03, -7.288e-02, -8.445e-02, 1.968e-01, -3.038e-02, -1.015e-02, 1.080e-01, -3.768e-02, -2.808e-02, 1.682e-01)); + r += mul(s2_0, M4(4.262e-02, 5.784e-02, 1.454e-02, 3.577e-02, -1.138e-01, 1.886e-01, 1.264e-01, 1.255e-01, -9.393e-02, -8.500e-02, -9.118e-02, -9.240e-04, -4.070e-02, -6.934e-02, 9.588e-02, -2.368e-01)); + r += mul(s2_1, M4(-3.233e-01, -1.860e-01, -1.585e-01, 9.243e-02, -6.862e-02, -2.190e-01, -1.071e-01, -3.454e-01, 4.177e-02, 4.386e-02, 2.941e-02, 5.866e-02, 2.344e-01, 2.047e-01, -2.278e-01, 4.611e-02)); + r += mul(s2_2, M4(8.711e-02, 2.480e-02, -9.937e-02, -3.438e-02, 9.121e-03, 3.109e-01, 7.038e-03, 2.100e-01, 1.072e-01, -1.671e-01, -1.322e-01, -6.579e-02, 2.988e-01, -2.884e-01, -1.310e-01, -2.357e-02)); + r += mul(s2_3, M4(-7.846e-02, 7.704e-02, -2.691e-01, -3.412e-01, 6.088e-02, -1.093e-01, -1.281e-01, 5.138e-01, 1.810e-02, 9.831e-02, 2.666e-01, -2.339e-01, 7.093e-02, -1.529e-01, 4.167e-02, -1.516e-01)); + r += mul(s2_4, M4(5.444e-02, 2.909e-02, -2.713e-01, -5.557e-02, -1.632e-01, 2.026e-01, -1.414e-01, -1.113e-02, -1.238e-01, -1.247e-01, 2.065e-01, 2.474e-01, 4.052e-01, -2.307e-02, 7.400e-02, -2.563e-01)); + r += mul(s2_5, M4(-8.010e-02, -2.663e-01, -1.548e-01, 5.065e-02, 1.857e-01, -4.630e-01, -9.547e-02, -1.356e-01, -1.459e-01, -1.654e-01, -1.372e-01, -1.509e-01, -2.538e-01, 8.992e-02, 6.959e-02, -4.835e-02)); + r += mul(s2_6, M4(-6.965e-02, -1.484e-02, -1.520e-01, 8.388e-03, -6.074e-01, -3.065e-02, -1.481e-01, -5.162e-01, 2.566e-02, -6.327e-04, -2.711e-01, 1.572e-01, 7.159e-02, 2.031e-01, 5.821e-02, -1.886e-01)); + r += mul(s2_7, M4(8.521e-02, 1.798e-01, -1.517e-01, 1.224e-01, -3.837e-01, -1.884e-01, -1.653e-01, -1.620e-01, -1.856e-01, 3.767e-01, -8.799e-03, 1.930e-01, 1.777e-01, -6.695e-01, 5.634e-02, -1.042e-01)); + r += mul(s2_8, M4(2.738e-02, 7.023e-02, -6.588e-02, 4.945e-02, -2.180e-01, -4.060e-01, -1.982e-01, -2.085e-01, 9.355e-02, 6.833e-03, -8.415e-02, -3.284e-02, 1.634e-01, 6.600e-01, 2.179e-02, 3.345e-01)); + r += mul(s3_0, M4(-3.002e-01, -2.938e-01, -1.650e-01, -7.428e-01, -9.888e-02, 2.103e-02, 8.913e-02, -1.157e-01, 2.042e-02, -9.108e-03, -5.994e-02, 5.539e-03, -1.426e-01, 1.501e-01, 1.070e-01, 5.497e-02)); + r += mul(s3_1, M4(-1.402e+00, -8.043e-01, -6.448e-01, -4.208e-02, 4.390e-02, 3.385e-02, -4.404e-02, -3.245e-02, 1.901e-01, -9.100e-02, -3.288e-02, -5.554e-02, -1.932e-01, -2.189e-01, -2.138e-01, -1.562e-01)); + r += mul(s3_2, M4(-2.942e+00, -1.968e-01, -2.618e-01, -9.005e-02, -3.651e-02, -3.300e-02, 4.116e-02, 1.509e-01, 9.940e-02, -3.205e-02, -1.049e-01, -4.534e-02, 4.099e-01, 1.030e-01, -1.503e-01, 8.364e-02)); + r += mul(s3_3, M4(2.111e-01, 4.100e-01, -2.844e-01, -7.623e-01, 1.595e-02, -3.347e-01, -1.606e-01, 3.324e-01, 6.465e-02, 2.734e-01, 2.176e-01, 7.220e-03, -7.500e-03, -2.152e-01, 6.906e-02, 1.170e-02)); + r += mul(s3_4, M4(1.670e-01, 4.952e-01, -5.006e-01, 9.297e-01, -7.439e-02, 6.976e-01, 3.422e-01, 1.587e-01, 2.158e-01, -5.071e-01, 7.355e-02, -3.825e-01, -3.580e-02, -3.637e-01, 5.284e-02, -6.810e-02)); + r += mul(s3_5, M4(-5.111e-01, -2.216e-01, -1.097e-01, -6.024e-01, 7.385e-02, -1.143e-01, -3.750e-02, 2.547e-02, -4.781e-02, 3.365e-02, -1.393e-01, -7.232e-02, -3.006e-01, -8.865e-02, 9.295e-02, 1.912e-02)); + r += mul(s3_6, M4(4.437e-01, 4.625e-01, 5.880e-02, 1.085e-01, -1.008e-01, 1.997e-01, 1.448e-02, 1.818e-01, -5.865e-02, -1.208e-01, -3.001e-01, 5.187e-02, -3.114e-01, 2.439e-01, 3.744e-02, -3.896e-01)); + r += mul(s3_7, M4(2.651e-01, 3.014e-01, 3.736e-02, 8.684e-01, 1.542e-01, -5.957e-01, -1.418e-01, -4.727e-01, -3.251e-01, 1.105e-01, -8.376e-02, -2.022e-01, -3.469e-01, 5.911e-01, 4.129e-02, 2.129e-01)); + r += mul(s3_8, M4(-1.414e-01, -1.073e-01, 1.316e-01, -1.006e-01, 1.568e-01, 3.334e-01, -1.739e-01, 2.173e-02, 2.287e-01, 2.815e-01, -7.362e-02, -1.505e-02, -2.690e-02, -1.337e-01, -9.948e-04, 1.909e-01)); + r += V4(-1.907e-02, -5.779e-04, 2.647e-01, -6.629e-03); + return r; +} + +V4 f1(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-1.029e-02, -4.427e-02, -1.311e-02, -6.809e-02, -1.820e-01, 2.692e-02, -4.692e-01, 1.900e-01, -2.938e-01, -6.187e-02, 1.741e-01, -1.017e-01, 1.412e-01, 1.843e-02, 2.606e-02, 9.392e-02)); + r += mul(s0_1, M4(-4.781e-01, -1.942e-01, 1.552e-01, -3.645e-01, 1.029e-01, 1.159e-01, -8.964e-02, 9.631e-02, -3.120e-01, 2.637e-02, -1.032e-02, -1.627e-02, 1.046e-01, -3.700e-02, -3.136e-01, -1.138e-01)); + r += mul(s0_2, M4(-5.959e-01, 5.592e-02, -1.873e-01, -5.695e-02, 3.835e-01, 1.844e-01, 1.652e-02, 5.765e-01, -5.859e-01, 4.167e-02, -1.965e-01, -1.344e-01, 5.900e-01, 1.509e-02, 1.127e-01, -2.605e-02)); + r += mul(s0_3, M4(1.675e-01, 9.790e-02, 2.316e-01, -1.930e-01, -1.233e-01, 1.554e-01, 7.309e-01, -9.317e-02, 3.019e-01, 3.548e-02, 1.979e-01, 2.452e-01, -1.320e-01, -2.426e-03, -6.473e-02, 2.362e-01)); + r += mul(s0_4, M4(3.238e-01, -3.543e-01, 1.936e-02, -3.525e-01, 6.310e-02, 5.911e-01, 3.797e-01, -2.553e-01, 4.402e-01, -4.429e-02, 8.982e-01, 4.717e-01, -8.769e-02, 2.790e-01, -1.748e-01, 2.149e-01)); + r += mul(s0_5, M4(-1.619e-01, -8.726e-02, 9.183e-02, -2.527e-01, 2.260e-01, 3.167e-01, 1.057e-01, -6.114e-01, -1.583e-01, 1.678e-01, 2.295e-01, -3.196e-02, 4.209e-01, -6.903e-02, -1.373e-01, 2.212e-01)); + r += mul(s0_6, M4(6.322e-02, -5.028e-02, -5.582e-02, -8.759e-02, 1.828e-01, -7.608e-02, 3.712e-01, -2.018e-01, 7.812e-02, -1.612e-01, 3.925e-02, 2.454e-02, -3.222e-02, -5.491e-02, -4.835e-02, -8.672e-02)); + r += mul(s0_7, M4(2.302e-01, 3.311e-01, -1.024e-01, 1.689e-01, 1.384e-01, -6.313e-01, 2.495e-01, 1.109e+00, -1.373e-01, 4.860e-04, 3.466e-02, -4.459e-01, -8.015e-02, -1.001e-01, 1.988e-01, -7.793e-02)); + r += mul(s0_8, M4(-1.753e-01, 6.144e-02, 6.860e-03, -6.542e-02, 1.729e-01, 3.502e-02, -2.058e-01, 2.777e-01, 2.547e-01, -3.623e-01, -1.117e-01, -4.370e-01, 2.300e-01, -3.608e-02, 7.399e-02, -2.717e-02)); + r += mul(s1_0, M4(6.933e-02, 7.252e-03, -4.641e-01, 3.847e-01, -1.899e-01, -4.916e-02, -8.596e-02, 6.860e-02, -1.260e-02, -1.411e-02, -1.429e-01, -7.949e-02, 7.628e-02, -3.338e-02, 1.520e-01, -1.907e-01)); + r += mul(s1_1, M4(-1.096e-01, -1.356e-01, -5.957e-01, 1.985e-01, -1.362e-01, -3.702e-02, 5.611e-02, -1.867e-01, -1.512e-01, 7.857e-02, -5.154e-02, 5.215e-02, -8.526e-02, -7.589e-02, 4.015e-01, -3.616e-01)); + r += mul(s1_2, M4(-5.254e-01, 5.750e-02, -2.225e-01, 3.322e-01, -5.401e-02, 5.723e-02, -1.843e-01, 1.116e-01, -6.092e-02, -1.324e-02, 1.852e-01, 2.526e-01, 5.620e-01, -4.316e-02, 1.137e-01, -2.298e-01)); + r += mul(s1_3, M4(1.092e-01, 1.151e-01, -6.113e-01, 4.262e-01, -1.108e-02, 1.270e-01, 1.070e-01, 6.105e-02, -6.840e-02, 9.359e-03, 1.322e-02, 6.144e-02, -3.119e-02, -7.442e-02, -3.225e-02, 2.445e-01)); + r += mul(s1_4, M4(4.469e-01, -3.722e-01, 1.759e-02, 1.817e-02, -1.038e-01, 1.900e-01, -1.480e-02, -1.003e-01, 2.094e-02, -3.295e-01, 3.884e-02, -3.455e-01, -6.084e-02, 2.868e-01, -2.548e-01, 1.942e-01)); + r += mul(s1_5, M4(-2.857e-01, -4.954e-02, 1.537e-01, -3.915e-01, 1.973e-01, 1.338e-02, 1.035e-01, -5.796e-02, -3.144e-01, 9.483e-02, -1.388e-01, -1.597e-01, 2.885e-01, -5.359e-02, -1.151e-01, 2.880e-01)); + r += mul(s1_6, M4(-8.887e-03, 3.547e-03, -7.855e-02, -3.055e-01, 2.156e-01, 2.369e-02, -1.089e-01, 1.467e-02, 3.331e-02, 4.691e-02, -3.707e-02, -4.816e-02, 1.843e-02, -2.316e-02, -5.976e-02, -1.949e-01)); + r += mul(s1_7, M4(-1.638e-02, 2.342e-01, 1.319e-01, 1.744e-01, 1.130e-01, -3.627e-01, -1.653e-02, 5.432e-02, 1.635e-01, 3.669e-01, 2.821e-02, 7.278e-02, 4.355e-02, -3.466e-02, 1.538e-01, 1.175e-02)); + r += mul(s1_8, M4(-1.298e-01, 1.342e-01, 9.409e-03, -8.570e-02, 1.419e-01, -1.479e-01, -5.092e-02, 1.062e-01, -2.235e-03, -2.221e-01, -8.666e-02, 2.477e-01, 2.057e-01, -9.286e-02, 9.491e-03, 8.760e-02)); + r += mul(s2_0, M4(-3.941e-02, -5.823e-02, -8.454e-02, -6.757e-03, -4.737e-01, -2.306e-02, 6.786e-02, 1.628e-01, 3.545e-01, -1.548e-02, -4.186e-02, -1.596e-01, 3.441e-01, -5.585e-02, -1.227e-01, 4.865e-03)); + r += mul(s2_1, M4(-2.910e-02, 4.163e-02, -9.177e-02, 3.575e-02, -1.154e-01, 1.228e-01, -1.005e-01, 4.365e-01, 8.323e-02, -7.856e-04, 9.573e-02, -2.650e-01, 1.488e-01, -1.503e-02, 3.164e-02, 1.331e-01)); + r += mul(s2_2, M4(-7.101e-02, 3.065e-02, 4.069e-02, 8.709e-02, 1.813e-01, -7.222e-02, 4.975e-02, 2.198e-01, -1.686e-01, 7.047e-02, 9.845e-02, -2.971e-02, -1.017e-01, 3.237e-02, 8.955e-02, -4.723e-02)); + r += mul(s2_3, M4(-1.017e-01, 5.565e-02, 3.915e-02, -4.115e-02, -1.513e-01, 1.492e-02, -1.683e-01, 5.292e-01, -3.045e-01, 1.206e-02, -2.988e-02, -1.685e-01, -1.559e-01, -1.358e-02, -1.107e-02, 8.501e-02)); + r += mul(s2_4, M4(-1.248e-02, -3.360e-02, -1.182e-01, -9.052e-02, 4.120e-01, -2.568e-01, 1.347e-02, 2.203e-01, 5.053e-02, 7.868e-02, 1.555e-01, -5.636e-01, 1.146e-01, -5.034e-02, 3.738e-02, 1.086e-01)); + r += mul(s2_5, M4(-1.433e-02, 1.914e-02, 5.146e-02, 5.477e-02, -1.658e-01, 7.262e-03, -1.016e-01, 2.164e-01, -1.221e-02, 2.271e-01, 8.276e-02, -1.134e-01, -7.808e-02, 7.249e-02, -1.490e-01, 1.520e-01)); + r += mul(s2_6, M4(9.872e-02, 7.283e-02, 4.571e-03, 4.956e-03, 1.392e-01, 6.305e-02, 2.820e-01, 2.562e-01, 2.470e-01, 2.919e-01, -2.354e-01, 8.940e-02, -3.639e-01, 1.666e-02, -3.139e-01, 3.009e-01)); + r += mul(s2_7, M4(7.391e-02, -9.179e-03, 2.303e-02, -9.008e-02, -1.926e-01, 1.451e-01, -3.073e-02, 3.175e-01, 1.068e-01, 4.190e-01, -3.119e-01, -3.721e-01, 1.989e-01, 6.877e-02, -6.490e-02, 3.883e-01)); + r += mul(s2_8, M4(3.436e-02, -1.500e-01, 6.370e-02, 6.487e-02, -6.616e-02, 1.150e-01, -1.577e-02, -1.150e-02, 3.625e-02, 1.807e-01, 8.368e-02, -1.030e-01, 2.969e-01, -3.736e-01, -5.248e-01, -6.410e-02)); + r += mul(s3_0, M4(-1.904e-01, 3.793e-01, -4.094e-01, -3.506e-01, -3.057e-01, -5.702e-02, -1.412e-01, 1.145e-01, 3.071e-01, -1.208e-02, -2.916e-02, -1.679e-01, 2.943e-01, -3.413e-02, 1.985e-01, -1.143e-01)); + r += mul(s3_1, M4(-4.336e-01, 7.680e-01, -6.700e-01, -5.162e-01, 1.232e-01, 7.445e-02, -1.558e-01, 1.520e-01, 1.238e-01, -4.562e-02, 8.931e-02, 1.176e-01, -1.373e-01, 1.201e-01, 9.010e-02, 6.615e-02)); + r += mul(s3_2, M4(7.564e-02, 1.828e-02, -3.335e-01, 7.187e-01, -2.198e-01, -3.277e-02, 1.775e-01, -9.321e-02, -5.860e-02, 4.389e-02, -1.336e-02, -2.077e-03, 1.672e-01, 2.256e-02, 2.100e-01, 5.344e-02)); + r += mul(s3_3, M4(-6.569e-02, 1.159e-01, 7.211e-01, -2.791e-01, -1.254e-01, 9.532e-02, -1.811e-01, 3.237e-01, -4.603e-01, -7.759e-02, 9.809e-02, -5.216e-02, -3.020e-01, -5.589e-02, -8.145e-02, -1.713e-02)); + r += mul(s3_4, M4(-2.708e-01, -1.237e+00, 2.507e-01, -1.349e+00, 3.077e-01, -4.526e-01, 3.560e-01, -2.586e-01, 2.017e-01, 2.772e-01, 9.947e-02, 1.834e-01, -2.344e-01, 8.792e-02, 1.398e-01, 4.550e-02)); + r += mul(s3_5, M4(2.083e-01, 2.553e-01, 2.108e-01, 1.616e+00, 2.526e-01, 9.398e-03, -1.027e-01, -9.457e-03, 1.998e-02, 1.143e-01, 1.341e-01, 1.702e-03, -2.370e-01, 1.658e-01, -6.104e-02, 8.290e-02)); + r += mul(s3_6, M4(-8.079e-02, 1.286e-02, -2.603e-01, -3.768e-01, -1.689e-01, 1.810e-02, 4.330e-02, -1.769e-01, -3.120e-02, 3.590e-01, 2.761e-02, 1.187e-01, 1.727e-01, 7.357e-02, -1.063e-01, -2.804e-02)); + r += mul(s3_7, M4(1.037e-01, -5.252e-01, 3.481e-01, 3.128e-01, -8.170e-02, 7.354e-01, -5.280e-02, -1.332e-01, 2.176e-01, 6.305e-01, -1.500e-01, 3.806e-01, 3.882e-02, -3.656e-01, -3.983e-02, -2.263e-01)); + r += mul(s3_8, M4(-1.199e-02, 1.848e-01, -4.894e-01, -3.677e-01, 1.045e-01, -3.526e-02, -5.185e-02, 2.838e-02, 9.936e-02, 1.189e-01, -6.276e-03, 2.501e-01, 1.499e-01, -4.103e-01, -1.141e-01, 1.415e-01)); + r += V4(-1.419e-02, 1.370e-02, -1.518e-02, 1.616e-02); + return r; +} + +void Pass2(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = Rmp8x8(tid.x) + blockStart; + uint2 size = GetInputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = (gxy + 0.5) * pt; + + V4 s0_0 = l0(-1.0, -1.0); + V4 s0_1 = l0(0.0, -1.0); + V4 s0_2 = l0(1.0, -1.0); + V4 s0_3 = l0(-1.0, 0.0); + V4 s0_4 = l0(0.0, 0.0); + V4 s0_5 = l0(1.0, 0.0); + V4 s0_6 = l0(-1.0, 1.0); + V4 s0_7 = l0(0.0, 1.0); + V4 s0_8 = l0(1.0, 1.0); + V4 s1_0 = -max(-s0_0, 0.0); + V4 s1_1 = -max(-s0_1, 0.0); + V4 s1_2 = -max(-s0_2, 0.0); + V4 s1_3 = -max(-s0_3, 0.0); + V4 s1_4 = -max(-s0_4, 0.0); + V4 s1_5 = -max(-s0_5, 0.0); + V4 s1_6 = -max(-s0_6, 0.0); + V4 s1_7 = -max(-s0_7, 0.0); + V4 s1_8 = -max(-s0_8, 0.0); + s0_0 = max(s0_0, 0.0); + s0_1 = max(s0_1, 0.0); + s0_2 = max(s0_2, 0.0); + s0_3 = max(s0_3, 0.0); + s0_4 = max(s0_4, 0.0); + s0_5 = max(s0_5, 0.0); + s0_6 = max(s0_6, 0.0); + s0_7 = max(s0_7, 0.0); + s0_8 = max(s0_8, 0.0); + + V4 s2_0 = l1(-1.0, -1.0); + V4 s2_1 = l1(0.0, -1.0); + V4 s2_2 = l1(1.0, -1.0); + V4 s2_3 = l1(-1.0, 0.0); + V4 s2_4 = l1(0.0, 0.0); + V4 s2_5 = l1(1.0, 0.0); + V4 s2_6 = l1(-1.0, 1.0); + V4 s2_7 = l1(0.0, 1.0); + V4 s2_8 = l1(1.0, 1.0); + V4 s3_0 = -max(-s2_0, 0.0); + V4 s3_1 = -max(-s2_1, 0.0); + V4 s3_2 = -max(-s2_2, 0.0); + V4 s3_3 = -max(-s2_3, 0.0); + V4 s3_4 = -max(-s2_4, 0.0); + V4 s3_5 = -max(-s2_5, 0.0); + V4 s3_6 = -max(-s2_6, 0.0); + V4 s3_7 = -max(-s2_7, 0.0); + V4 s3_8 = -max(-s2_8, 0.0); + s2_0 = max(s2_0, 0.0); + s2_1 = max(s2_1, 0.0); + s2_2 = max(s2_2, 0.0); + s2_3 = max(s2_3, 0.0); + s2_4 = max(s2_4, 0.0); + s2_5 = max(s2_5, 0.0); + s2_6 = max(s2_6, 0.0); + s2_7 = max(s2_7, 0.0); + s2_8 = max(s2_8, 0.0); + + t2[gxy] = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8); + t3[gxy] = f1(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8); +} + +//!PASS 3 +//!DESC conv2 +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 +//!IN t2, t3 +//!OUT t0, t1 + +#define l0(x, y) V4(O(t2, float2(x, y))) +#define l1(x, y) V4(O(t3, float2(x, y))) + +V4 f0(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8) { + V4 r = 0.0; + r += mul(s0_0, M4(2.433e-01, -3.881e-01, 1.184e-01, -6.328e-02, 2.093e-01, -1.453e-01, -1.044e-01, -1.624e-03, -1.289e-01, 7.280e-02, -2.728e-02, -3.045e-02, -2.419e-02, -1.908e-02, -1.990e-03, 6.380e-02)); + r += mul(s0_1, M4(1.241e-01, 2.907e-01, -7.679e-02, 6.609e-02, 4.055e-01, 1.399e-01, 1.488e-01, -8.759e-02, 9.889e-02, -1.191e-02, -2.143e-02, -4.582e-02, 1.655e-02, -1.023e-01, -3.922e-02, 7.866e-02)); + r += mul(s0_2, M4(1.018e-01, 5.323e-02, -1.317e-01, 1.143e-02, 3.795e-01, 1.037e-01, -5.552e-02, 9.257e-03, -1.724e-01, -1.334e-01, -1.614e-02, -1.734e-02, 3.272e-01, -1.067e-01, 1.857e-01, 1.775e-02)); + r += mul(s0_3, M4(-9.351e-02, -8.100e-02, 1.528e-01, -6.036e-02, 5.321e-01, -2.519e-01, -1.133e-01, -1.084e-01, 9.980e-02, 6.664e-02, -4.920e-02, 5.423e-02, -3.489e-02, 6.527e-03, 4.906e-02, 3.445e-02)); + r += mul(s0_4, M4(-7.289e-01, -1.403e-01, -2.049e-01, -8.240e-03, -2.363e-01, 2.203e-01, 2.280e-01, -2.894e-01, 6.564e-03, -1.410e-01, 4.797e-02, -4.672e-02, 2.459e-01, 7.236e-02, 2.042e-01, 1.049e-01)); + r += mul(s0_5, M4(-1.679e-01, -1.223e-01, 5.324e-02, -2.159e-03, -1.943e-03, 1.791e-01, 1.407e-02, 6.576e-02, 1.712e-02, 2.206e-02, 1.580e-02, 5.191e-02, -2.160e-01, -4.008e-01, 1.662e-01, -1.676e-01)); + r += mul(s0_6, M4(2.380e-02, -1.506e-01, -1.850e-01, -7.010e-02, -7.339e-02, -1.088e-01, -1.633e-02, 8.762e-02, 4.002e-02, -9.515e-03, 1.053e-01, -1.318e-03, 3.687e-02, 1.289e-03, -8.238e-02, 3.815e-02)); + r += mul(s0_7, M4(1.500e-01, -2.010e-01, 7.452e-02, -9.216e-02, -9.507e-02, -9.233e-02, -1.655e-01, 9.834e-03, 9.053e-02, 1.116e-01, -6.831e-02, 1.544e-01, -1.290e-02, 2.871e-02, 4.676e-02, 6.820e-02)); + r += mul(s0_8, M4(1.485e-01, 1.043e-02, -1.230e-01, 7.149e-02, -2.033e-01, 3.896e-02, -1.704e-01, 2.718e-02, -8.099e-02, -1.492e-02, 2.033e-02, -1.470e-01, 3.724e-01, -6.581e-02, -8.568e-02, 1.446e-02)); + r += mul(s1_0, M4(2.111e-01, 7.064e-02, 1.062e-01, -3.356e-02, -1.960e-01, 7.451e-02, -4.637e-02, 4.996e-02, 3.633e-01, -2.194e-01, -1.977e-01, -4.877e-01, -4.173e-02, 7.349e-02, -8.448e-02, -2.853e-02)); + r += mul(s1_1, M4(-7.255e-02, 2.476e-01, -4.985e-02, -9.240e-03, -2.809e-01, 1.161e-01, -3.182e-02, -2.748e-02, -6.600e-02, -4.941e-03, -3.764e-01, -6.918e-01, -8.408e-02, 1.003e-01, -8.359e-02, -5.399e-02)); + r += mul(s1_2, M4(2.199e-01, -5.369e-03, -6.957e-02, -4.640e-02, 1.564e-01, -1.217e-01, -1.722e-02, -1.767e-02, -6.967e-01, -7.661e-01, -3.545e-01, 5.396e-01, 1.185e-01, -1.727e-01, -4.389e-02, -1.500e-01)); + r += mul(s1_3, M4(-1.075e-01, 1.627e-01, 1.380e-01, -1.190e-02, 9.164e-02, -1.048e-01, -1.901e-01, 3.976e-02, 1.650e-01, 6.450e-01, -3.591e-01, -2.435e-01, 1.574e-02, -1.217e-02, 3.572e-02, -4.591e-02)); + r += mul(s1_4, M4(-2.832e-02, -9.011e-02, -1.354e-01, -9.056e-02, -2.266e-01, 2.679e-01, 4.178e-01, 5.121e-02, -3.697e-01, 5.771e-01, -4.159e-01, -2.154e+00, 8.549e-02, -4.675e-02, 1.880e-01, 6.462e-04)); + r += mul(s1_5, M4(-2.837e-01, -1.020e-01, 1.500e-01, -6.129e-02, 8.551e-02, 6.597e-03, 1.699e-01, 3.306e-03, -1.656e-01, -7.203e-01, -3.878e-01, 6.471e-01, 1.882e-02, -5.250e-02, -6.837e-02, -2.959e-01)); + r += mul(s1_6, M4(8.637e-02, -1.856e-01, -1.333e-01, -8.966e-02, 7.885e-02, -4.568e-02, 5.150e-02, 7.534e-02, 2.183e-01, 5.912e-02, 3.611e-01, 1.868e-01, 7.463e-02, -6.546e-02, 8.653e-03, 2.389e-03)); + r += mul(s1_7, M4(-2.107e-01, -6.405e-02, 1.977e-01, -7.070e-02, 1.735e-01, -3.623e-02, 1.193e-01, -1.876e-02, -3.815e-01, 6.116e-01, -7.696e-01, 1.309e-02, -9.006e-02, 2.588e-01, 2.957e-02, 7.022e-02)); + r += mul(s1_8, M4(1.908e-01, 6.329e-02, -2.448e-01, 2.592e-02, -4.052e-02, -5.949e-02, 8.518e-02, 1.000e-02, -7.463e-01, -5.402e-02, 1.745e-01, 1.433e-01, 2.647e-01, -4.770e-02, 4.625e-02, 1.604e-02)); + r += mul(s2_0, M4(7.971e-02, -1.099e-01, -2.069e-02, -9.078e-02, -5.069e-02, -5.648e-02, 4.399e-02, 1.920e-01, 2.338e-02, -7.457e-02, -2.665e-02, -4.715e-02, 9.422e-02, -7.926e-02, 1.338e-02, -6.313e-02)); + r += mul(s2_1, M4(-1.406e-01, -1.581e-01, -1.626e-01, -2.596e-02, 5.828e-01, -2.151e-01, 1.535e-01, -6.966e-01, -5.149e-02, -8.108e-02, 1.054e-02, -4.783e-02, -1.567e-01, 2.909e-01, -6.311e-02, -2.142e-01)); + r += mul(s2_2, M4(-2.106e-02, -5.202e-02, 7.175e-02, -3.027e-02, 1.773e-02, 3.321e-01, 7.717e-02, -1.694e-01, -9.209e-02, -2.248e-02, 1.867e-02, -8.038e-02, 1.468e-01, -1.793e-01, -1.160e-01, -9.110e-02)); + r += mul(s2_3, M4(-4.802e-02, -2.944e-02, -9.839e-02, -1.450e-01, 8.564e-02, -7.952e-02, 4.528e-02, -2.834e-02, 6.636e-02, -2.842e-02, -8.696e-02, -1.222e-02, -3.515e-02, -7.263e-02, -1.196e-01, -6.308e-02)); + r += mul(s2_4, M4(5.217e-02, -1.035e-01, -3.715e-01, -5.292e-01, -1.049e-01, -2.436e-01, 5.207e-01, 9.208e-02, 5.585e-02, 9.715e-02, 4.273e-02, 2.886e-01, -2.044e-01, 8.106e-01, -3.056e-01, 1.353e-01)); + r += mul(s2_5, M4(-3.279e-01, 1.316e-01, -7.622e-02, -9.912e-02, -2.721e-01, -9.490e-02, 5.605e-01, -1.344e-01, -9.724e-02, -8.388e-02, -1.390e-01, 4.640e-01, -1.161e-01, -1.181e-01, -1.599e-01, -2.190e-01)); + r += mul(s2_6, M4(1.149e-01, 8.812e-02, -1.579e-01, -1.800e-01, 4.197e-02, -1.301e-01, 4.577e-02, 5.256e-02, 7.827e-02, 5.972e-02, 1.893e-02, -6.895e-03, -2.070e-04, 1.411e-01, 9.564e-03, 7.850e-02)); + r += mul(s2_7, M4(-1.247e-01, 1.674e-01, 1.048e-01, -6.845e-03, -1.308e-01, 9.539e-02, -1.721e-02, -1.677e-02, 4.760e-03, 1.023e-01, 1.821e-01, -3.942e-02, 2.139e-01, -1.663e-02, -9.827e-03, -6.087e-02)); + r += mul(s2_8, M4(3.102e-02, 1.901e-02, -2.138e-01, 5.284e-02, 3.217e-02, -3.770e-02, -3.509e-02, 2.685e-05, 9.077e-02, -2.235e-01, 3.352e-01, 1.639e-01, -1.189e-01, -1.500e-01, -1.289e-01, 1.001e-03)); + r += mul(s3_0, M4(-4.771e-02, -2.036e-01, 2.846e-02, 2.345e-03, -4.515e-02, 5.025e-02, -7.379e-02, -4.041e-02, -1.517e-02, 3.365e-02, -1.432e-01, -5.475e-03, 1.335e-02, -2.010e-01, -6.832e-03, -3.554e-02)); + r += mul(s3_1, M4(-1.906e-01, -5.119e-02, 1.121e-02, 3.558e-02, -3.803e-01, 2.685e-01, -1.029e-01, 4.900e-02, 2.261e-01, -1.602e-01, 1.923e-02, 1.846e-01, -6.525e-02, -3.315e-02, -1.742e-02, -1.288e-01)); + r += mul(s3_2, M4(-1.424e-01, -1.426e-01, 3.269e-03, 2.335e-04, 1.329e-02, -1.127e-01, -6.530e-02, -4.724e-02, 6.465e-02, 9.890e-02, 7.215e-02, -1.801e-01, -5.413e-02, -2.846e-01, -5.021e-02, -2.605e-02)); + r += mul(s3_3, M4(2.748e-02, -3.440e-01, 1.746e-01, 1.563e-01, 8.409e-02, -2.266e-01, -1.234e-01, -1.325e-01, 3.038e-02, 1.448e-01, -8.858e-02, -4.470e-02, 2.247e-01, -2.876e-01, -2.567e-02, -1.657e-01)); + r += mul(s3_4, M4(1.343e-01, -4.749e-01, 3.036e-02, 1.344e-01, -7.044e-01, 9.586e-01, 2.962e-02, 3.066e-01, 3.292e-01, -4.613e-02, 9.281e-02, -6.577e-02, 3.562e-02, 4.712e-01, -3.727e-02, -2.332e-02)); + r += mul(s3_5, M4(-6.552e-02, 1.718e-01, 1.372e-02, 1.942e-01, -3.202e-02, -2.690e-01, 7.061e-02, -2.143e-01, -4.725e-01, 2.260e-01, -1.108e-01, -2.049e-02, -1.247e-01, -3.232e-01, 1.640e-02, -1.974e-01)); + r += mul(s3_6, M4(5.384e-02, -4.926e-02, 8.471e-02, -5.508e-03, 3.127e-02, -1.024e-01, -6.807e-02, 1.355e-02, 8.709e-02, 3.431e-01, -2.891e-02, -1.667e-02, 5.495e-03, -8.979e-02, 1.211e-01, 8.106e-02)); + r += mul(s3_7, M4(-1.086e-01, 3.082e-01, 3.515e-01, 1.455e-01, -1.311e-01, 1.556e-01, -9.044e-02, -6.178e-02, 1.637e-01, 9.177e-02, -1.618e-01, -7.785e-02, 4.761e-02, -1.013e-01, -9.998e-02, -1.424e-02)); + r += mul(s3_8, M4(5.134e-01, 2.088e-01, 3.485e-01, 2.017e-01, 2.709e-01, 1.314e-01, -1.887e-01, 1.701e-02, -7.644e-02, -2.681e-01, 2.699e-01, 2.012e-02, -5.078e-02, -7.899e-02, 3.061e-02, -6.543e-02)); + r += V4(-6.188e-04, 6.040e-03, 8.696e-03, 2.214e-02); + return r; +} + +V4 f1(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-1.903e-02, -1.951e-01, 3.731e-02, 2.407e-01, -4.087e-02, -1.242e-01, 1.591e-01, 1.461e-01, 1.144e-03, 6.971e-02, 6.376e-02, -4.822e-02, -4.229e-03, -2.948e-02, -2.453e-02, 3.279e-02)); + r += mul(s0_1, M4(-1.397e-01, -2.025e-01, -1.174e-01, -2.333e-01, -6.637e-02, 1.611e-01, -2.374e-01, 1.920e-01, -8.692e-03, 1.128e-02, -7.000e-02, 1.043e-01, -1.646e-01, -7.105e-02, -5.099e-02, -7.850e-02)); + r += mul(s0_2, M4(-3.493e-02, 1.631e-01, -1.295e-01, -3.915e-02, -8.689e-03, 2.153e-01, -1.786e-01, 8.576e-02, 3.957e-02, -1.725e-02, 6.660e-03, -9.336e-02, -1.944e-01, -2.239e-01, -1.146e-01, 6.279e-02)); + r += mul(s0_3, M4(1.048e-01, -2.091e-01, 1.755e-01, 1.312e-01, -4.776e-02, 3.309e-02, -1.652e-01, 4.016e-02, -3.431e-02, -9.573e-02, 2.284e-03, 4.407e-02, -7.497e-03, 5.382e-02, 1.636e-02, -3.983e-02)); + r += mul(s0_4, M4(2.202e-01, -1.826e-01, 1.413e-01, -8.920e-01, 2.626e-02, -6.326e-02, 1.165e-02, 2.816e-01, -1.011e-01, 1.952e-02, 1.909e-02, -1.977e-03, 1.714e-02, -1.762e-01, 1.561e-02, 1.896e-02)); + r += mul(s0_5, M4(-8.408e-02, -8.961e-02, -7.309e-02, -9.936e-03, 1.714e-01, 3.017e-01, -3.199e-02, 3.944e-02, 5.782e-02, 4.041e-02, 1.135e-01, -1.899e-02, -6.783e-01, -7.227e-01, -5.489e-02, 3.710e-01)); + r += mul(s0_6, M4(4.481e-02, -1.328e-01, 3.195e-01, 2.234e-01, 3.281e-02, -1.410e-01, -2.458e-01, -3.179e-02, -9.318e-03, -5.619e-02, -4.831e-02, 9.783e-03, 6.137e-05, -3.615e-02, -4.932e-02, 4.382e-02)); + r += mul(s0_7, M4(8.583e-02, -3.896e-01, -2.696e-01, -1.379e-01, 8.896e-04, -4.113e-02, -1.003e-01, -2.234e-01, -2.070e-02, 6.911e-02, 5.273e-02, 5.350e-02, 1.194e-01, -2.388e-01, -7.249e-02, 1.641e-01)); + r += mul(s0_8, M4(3.917e-03, 4.653e-02, 4.208e-02, -2.972e-02, 7.932e-02, 7.600e-02, 1.999e-01, 1.265e-01, 1.091e-01, -4.210e-02, -1.266e-01, -6.501e-02, -1.778e-01, -2.900e-01, -1.907e-01, -1.097e-01)); + r += mul(s1_0, M4(-1.594e-02, -1.106e-01, -6.409e-02, -8.242e-02, -6.067e-02, -1.114e-02, 1.503e-01, -2.305e-02, 9.436e-02, 5.593e-02, -8.865e-02, -3.842e-01, -1.487e-02, 6.278e-02, -9.395e-02, 1.747e-02)); + r += mul(s1_1, M4(-9.406e-02, 1.059e-01, -5.180e-02, 8.490e-02, 2.999e-02, 7.354e-02, 9.773e-02, 6.806e-02, -1.499e-01, 3.132e-01, -1.413e-01, 3.941e-01, -1.043e-01, 8.054e-02, 7.889e-02, 6.038e-02)); + r += mul(s1_2, M4(-5.049e-02, 8.765e-02, -3.552e-02, 5.389e-02, 1.399e-02, 4.153e-02, -9.329e-02, 5.096e-02, -5.803e-03, -3.089e-02, -3.274e-01, 2.702e-01, -1.782e-01, -3.271e-02, 3.820e-02, 6.556e-02)); + r += mul(s1_3, M4(1.295e-01, -1.074e-01, 1.311e-01, 1.953e-02, -7.175e-02, -2.176e-01, -4.113e-02, -6.624e-02, -1.264e-01, -1.084e+00, -8.971e-02, -4.195e-01, -3.640e-02, 1.017e-01, 1.374e-02, -3.757e-02)); + r += mul(s1_4, M4(1.402e-01, 7.449e-02, 2.512e-01, -3.099e-01, -1.449e-01, -2.211e-01, 2.472e-01, -8.322e-02, -5.802e-01, -9.452e-01, -3.769e-01, -7.299e-01, 1.703e-02, 5.013e-02, 2.580e-02, 1.018e-01)); + r += mul(s1_5, M4(-1.122e-01, -3.917e-02, 1.255e-01, 1.104e-01, 1.611e-01, 1.474e-01, -6.121e-02, -2.863e-02, 6.412e-01, -4.582e-01, -9.288e-01, -1.703e+00, -8.581e-01, -1.186e-01, -1.852e-02, 1.764e-01)); + r += mul(s1_6, M4(-2.302e-02, -1.122e-01, -6.733e-04, 8.064e-02, 6.468e-02, -9.918e-02, 4.609e-02, -3.326e-02, -7.172e-02, -3.604e-01, 4.166e-01, 1.496e-02, 1.941e-02, -8.164e-03, -1.005e-01, 3.534e-03)); + r += mul(s1_7, M4(-4.566e-02, 1.576e-01, -8.564e-02, -1.512e-02, 2.097e-02, -1.125e-01, 2.043e-02, -3.300e-01, -1.351e-01, -6.389e-01, -3.509e-01, -1.141e-01, 9.899e-02, -7.529e-02, 1.057e-01, 2.057e-02)); + r += mul(s1_8, M4(5.309e-02, 7.249e-02, 3.752e-02, -4.934e-02, 5.045e-02, 9.157e-02, 3.824e-03, -2.342e-02, 3.056e-01, -2.377e-03, 4.013e-01, -8.652e-02, -1.557e-01, -6.980e-02, -3.395e-02, -1.831e-01)); + r += mul(s2_0, M4(-2.140e-02, 3.373e-02, -6.324e-02, 1.341e-02, -6.006e-02, -1.390e-01, 1.304e-01, -7.396e-02, 1.053e-02, 4.035e-02, -7.677e-02, 2.362e-02, 1.909e-02, 2.325e-01, 1.447e-01, 7.323e-02)); + r += mul(s2_1, M4(1.795e-02, -3.169e-04, 1.030e-01, 1.265e-01, -1.093e-01, -1.128e-01, -1.884e-02, 1.473e-01, 4.227e-02, 4.771e-02, -5.342e-03, 3.107e-02, 9.337e-02, 3.386e-01, 9.080e-02, -1.308e-01)); + r += mul(s2_2, M4(-3.594e-02, -3.244e-02, 9.089e-02, 6.626e-02, 8.157e-03, 1.997e-01, 3.726e-01, -1.223e-01, 7.486e-02, 9.483e-02, -7.558e-02, 3.820e-02, 3.465e-02, 9.637e-02, 1.463e-01, 1.243e-01)); + r += mul(s2_3, M4(-2.022e-02, 5.208e-02, 1.797e-01, 1.583e-02, -1.421e-01, -2.013e-01, 1.746e-01, -9.217e-02, -5.599e-02, 1.221e-01, -1.353e-01, 2.996e-03, -1.491e-02, 2.928e-02, 2.489e-02, 2.708e-02)); + r += mul(s2_4, M4(-2.417e-01, 2.697e-01, 1.544e-02, 3.408e-01, 5.464e-01, -1.619e-01, -1.491e-01, -2.986e-02, -9.208e-02, -4.481e-01, -1.674e-01, -8.227e-02, -1.887e-01, -3.818e-02, 1.558e-01, -5.454e-02)); + r += mul(s2_5, M4(2.332e-01, 1.534e-01, -1.023e-01, -1.223e-01, -4.520e-01, 2.117e-02, 4.059e-01, 1.739e-01, 9.972e-02, -3.460e-01, -2.232e-01, -9.188e-02, -3.011e-01, 9.661e-02, 2.294e-01, 4.967e-01)); + r += mul(s2_6, M4(-2.340e-02, 4.372e-01, 5.542e-02, -9.070e-02, 6.642e-03, -7.093e-02, 3.614e-02, -1.240e-02, -1.341e-03, -6.169e-02, -1.849e-01, -2.486e-02, 2.831e-02, -1.802e-01, -2.525e-02, -5.149e-02)); + r += mul(s2_7, M4(-7.215e-02, 6.276e-01, 2.174e-01, 2.019e-01, 1.082e-01, 5.354e-02, 1.379e-02, -1.519e-01, 3.392e-02, -2.885e-01, 6.024e-02, 1.196e-01, -1.217e-02, 4.156e-02, 7.591e-02, -7.825e-02)); + r += mul(s2_8, M4(4.152e-02, 3.043e-02, -9.412e-03, 1.857e-01, -5.486e-02, -1.094e-02, 1.109e-01, 3.213e-02, 9.758e-02, -3.680e-01, -8.002e-02, 1.475e-01, -1.528e-01, 2.880e-01, 3.799e-01, 7.434e-02)); + r += mul(s3_0, M4(-1.587e-02, -1.111e-01, -1.103e-01, -8.218e-03, -2.111e-02, -1.207e-03, -2.931e-02, -3.011e-02, -9.070e-03, 8.353e-02, -7.659e-02, 7.656e-03, 9.231e-03, 7.664e-02, -1.290e-02, 1.033e-01)); + r += mul(s3_1, M4(-1.663e-02, -2.158e-01, -2.743e-02, -3.814e-02, -7.382e-02, -3.598e-02, -2.445e-01, -2.235e-02, -5.268e-02, 1.668e-02, 5.700e-02, 1.989e-01, 2.021e-02, 1.277e-01, -3.154e-02, -2.325e-02)); + r += mul(s3_2, M4(2.185e-02, -7.522e-02, 9.069e-02, -6.605e-02, -7.998e-02, 3.981e-02, -5.009e-02, -1.897e-01, 1.052e-01, 2.140e-01, -1.733e-01, -5.374e-02, -1.005e-02, -3.066e-02, -2.403e-02, 1.075e-01)); + r += mul(s3_3, M4(-7.010e-02, -2.416e-01, -9.685e-02, -1.127e-02, -1.742e-01, 6.831e-04, -1.254e-02, -1.752e-02, -7.957e-02, 5.913e-02, 1.330e-01, -3.948e-02, -3.154e-02, 3.913e-02, -1.559e-01, -2.551e-03)); + r += mul(s3_4, M4(-3.353e-01, -1.453e-01, -4.606e-01, -9.453e-02, 5.683e-01, 5.758e-02, -6.855e-01, -2.280e-02, -1.119e-01, -3.075e-01, -1.257e-01, 1.525e-01, -1.558e-01, -3.928e-02, -1.199e-01, -2.134e-01)); + r += mul(s3_5, M4(1.197e-01, -2.141e-01, -5.354e-02, -2.723e-01, -4.297e-01, -1.564e-01, -3.910e-03, 4.950e-01, 5.365e-01, 4.068e-01, 8.903e-02, -1.515e-01, -1.595e-01, -9.696e-02, 4.988e-02, 3.443e-01)); + r += mul(s3_6, M4(-4.645e-02, -1.016e-01, -4.400e-02, -1.985e-02, -1.540e-02, -7.543e-02, -6.173e-02, -4.023e-03, -1.087e-02, 9.029e-02, -2.016e-02, -8.725e-02, 2.866e-02, -1.784e-01, -1.198e-01, -4.092e-02)); + r += mul(s3_7, M4(1.047e-01, -3.071e-01, 4.047e-02, 2.940e-02, 9.727e-02, 1.644e-02, -4.037e-04, 9.290e-04, -2.380e-02, 2.100e-01, -4.936e-02, 1.706e-01, 1.528e-02, -1.440e-01, -1.978e-01, -1.937e-01)); + r += mul(s3_8, M4(-3.675e-02, -2.837e-01, -2.650e-01, -1.265e-01, -8.426e-02, 8.075e-02, -1.650e-01, 1.255e-01, 4.193e-02, -1.812e-02, 2.658e-02, -1.294e-02, -1.497e-02, 5.846e-02, 5.440e-02, -5.090e-02)); + r += V4(-6.100e-03, -5.629e-03, -2.164e-03, -5.154e-03); + return r; +} + +void Pass3(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = Rmp8x8(tid.x) + blockStart; + uint2 size = GetInputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = (gxy + 0.5) * pt; + + V4 s0_0 = l0(-1.0, -1.0); + V4 s0_1 = l0(0.0, -1.0); + V4 s0_2 = l0(1.0, -1.0); + V4 s0_3 = l0(-1.0, 0.0); + V4 s0_4 = l0(0.0, 0.0); + V4 s0_5 = l0(1.0, 0.0); + V4 s0_6 = l0(-1.0, 1.0); + V4 s0_7 = l0(0.0, 1.0); + V4 s0_8 = l0(1.0, 1.0); + V4 s1_0 = -max(-s0_0, 0.0); + V4 s1_1 = -max(-s0_1, 0.0); + V4 s1_2 = -max(-s0_2, 0.0); + V4 s1_3 = -max(-s0_3, 0.0); + V4 s1_4 = -max(-s0_4, 0.0); + V4 s1_5 = -max(-s0_5, 0.0); + V4 s1_6 = -max(-s0_6, 0.0); + V4 s1_7 = -max(-s0_7, 0.0); + V4 s1_8 = -max(-s0_8, 0.0); + s0_0 = max(s0_0, 0.0); + s0_1 = max(s0_1, 0.0); + s0_2 = max(s0_2, 0.0); + s0_3 = max(s0_3, 0.0); + s0_4 = max(s0_4, 0.0); + s0_5 = max(s0_5, 0.0); + s0_6 = max(s0_6, 0.0); + s0_7 = max(s0_7, 0.0); + s0_8 = max(s0_8, 0.0); + + V4 s2_0 = l1(-1.0, -1.0); + V4 s2_1 = l1(0.0, -1.0); + V4 s2_2 = l1(1.0, -1.0); + V4 s2_3 = l1(-1.0, 0.0); + V4 s2_4 = l1(0.0, 0.0); + V4 s2_5 = l1(1.0, 0.0); + V4 s2_6 = l1(-1.0, 1.0); + V4 s2_7 = l1(0.0, 1.0); + V4 s2_8 = l1(1.0, 1.0); + V4 s3_0 = -max(-s2_0, 0.0); + V4 s3_1 = -max(-s2_1, 0.0); + V4 s3_2 = -max(-s2_2, 0.0); + V4 s3_3 = -max(-s2_3, 0.0); + V4 s3_4 = -max(-s2_4, 0.0); + V4 s3_5 = -max(-s2_5, 0.0); + V4 s3_6 = -max(-s2_6, 0.0); + V4 s3_7 = -max(-s2_7, 0.0); + V4 s3_8 = -max(-s2_8, 0.0); + s2_0 = max(s2_0, 0.0); + s2_1 = max(s2_1, 0.0); + s2_2 = max(s2_2, 0.0); + s2_3 = max(s2_3, 0.0); + s2_4 = max(s2_4, 0.0); + s2_5 = max(s2_5, 0.0); + s2_6 = max(s2_6, 0.0); + s2_7 = max(s2_7, 0.0); + s2_8 = max(s2_8, 0.0); + + t0[gxy] = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8); + t1[gxy] = f1(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8); +} + +//!PASS 4 +//!DESC conv3 +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 +//!IN t0, t1 +//!OUT t2, t3 + +#define l0(x, y) V4(O(t0, float2(x, y))) +#define l1(x, y) V4(O(t1, float2(x, y))) + +V4 f0(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8) { + V4 r = 0.0; + r += mul(s0_0, M4(1.460e-01, -2.503e-03, -2.140e-02, 2.070e-01, 1.642e-01, 3.938e-02, -3.263e-02, 2.015e-01, -4.626e-02, 3.951e-02, 1.449e-02, 2.009e-01, 5.058e-02, -4.454e-02, -1.328e-02, 1.673e-01)); + r += mul(s0_1, M4(6.362e-02, -5.345e-03, -1.315e-02, 2.544e-02, 1.481e-01, 1.702e-02, 4.910e-02, 7.624e-02, -1.192e-01, 7.445e-02, -6.032e-02, 5.518e-02, -1.580e-01, 1.302e-01, 9.593e-02, -3.273e-01)); + r += mul(s0_2, M4(8.558e-02, -7.543e-02, -6.527e-02, 2.885e-02, 1.973e-01, -1.098e-01, -3.435e-02, 9.459e-02, 5.094e-02, 7.949e-03, 1.923e-02, -1.689e-01, 3.913e-02, -9.038e-02, 3.628e-02, -2.234e-01)); + r += mul(s0_3, M4(1.441e-01, -9.906e-02, 2.901e-02, -8.990e-02, 9.260e-02, 1.779e-01, -5.753e-02, 1.198e-01, -4.089e-02, -2.679e-02, 2.567e-01, -2.316e-01, 2.826e-02, 3.657e-02, -5.245e-02, -1.481e-01)); + r += mul(s0_4, M4(-6.895e-02, 1.641e-01, -2.386e-01, -2.188e-01, 1.864e-01, -2.987e-03, -9.756e-02, -2.084e-01, -6.674e-02, 5.989e-02, 2.618e-01, -1.881e-01, -2.528e-01, -7.958e-02, -1.960e-01, -8.874e-02)); + r += mul(s0_5, M4(-2.057e-01, 2.163e-01, -1.032e-01, 2.606e-02, 2.536e-01, -1.757e-01, -3.088e-02, 9.971e-02, 3.508e-02, 6.749e-02, -7.082e-02, -5.879e-02, 4.556e-01, -2.563e-01, 3.354e-01, -1.140e-01)); + r += mul(s0_6, M4(4.626e-02, -3.616e-02, 3.660e-02, -6.943e-02, -2.409e-02, -7.460e-02, 3.468e-02, -1.478e-01, 3.061e-04, 3.629e-02, 3.037e-02, -4.552e-02, -1.420e-01, -4.576e-02, -2.385e-02, 6.238e-03)); + r += mul(s0_7, M4(2.317e-02, -4.572e-02, 1.373e-01, -4.412e-02, -2.654e-01, 1.417e-01, -2.566e-02, 7.823e-02, 5.192e-02, 1.253e-02, 2.714e-02, 4.986e-02, -6.517e-02, 1.725e-01, -3.147e-01, 1.810e-01)); + r += mul(s0_8, M4(-7.655e-02, 1.568e-02, 4.386e-02, -2.880e-02, 1.294e-01, -4.386e-02, -1.892e-01, 1.013e-01, -4.186e-02, -1.205e-02, -1.252e-02, 2.672e-02, 9.946e-02, -1.116e-01, -8.791e-02, -5.216e-02)); + r += mul(s1_0, M4(1.416e-01, -2.957e-02, 4.620e-02, 2.061e-01, -1.485e-03, 2.902e-02, 8.762e-02, -1.343e-02, -9.476e-02, -8.555e-02, -1.367e-01, -5.685e-01, 1.643e-02, 5.774e-02, -2.975e-02, -5.926e-02)); + r += mul(s1_1, M4(-1.076e-01, 1.057e-01, 8.230e-02, 2.622e-01, -3.980e-02, 9.033e-02, 4.219e-02, 2.085e-01, -3.702e-01, 3.284e-01, -1.205e-01, 4.759e-01, -9.593e-03, 6.312e-02, -3.021e-02, -1.414e-01)); + r += mul(s1_2, M4(-7.337e-02, 1.111e-02, 2.710e-03, 2.014e-02, 4.307e-03, 5.057e-02, -2.255e-02, 1.778e-01, 3.245e-02, 5.045e-02, -2.178e-02, -4.287e-01, -8.326e-02, -4.708e-02, 3.045e-02, 2.593e-02)); + r += mul(s1_3, M4(3.675e-02, -1.743e-01, -1.996e-02, -2.225e-02, 3.629e-02, -4.751e-02, 4.292e-02, -4.781e-02, 1.730e-01, 1.333e-01, 1.877e-01, 7.252e-02, 5.021e-02, 4.278e-03, -8.554e-02, -1.798e-01)); + r += mul(s1_4, M4(-2.651e-01, 7.933e-02, -1.525e-01, -4.634e-02, -4.800e-02, 4.021e-02, 9.500e-02, 3.373e-02, -4.455e-02, 1.410e-01, 7.064e-01, 1.166e-01, -2.249e-01, 1.612e-01, -1.835e-01, -1.426e-01)); + r += mul(s1_5, M4(-2.822e-01, 1.256e-01, -6.588e-02, 5.687e-02, -1.322e-01, 6.351e-02, -1.372e-01, -4.876e-02, 6.367e-02, 1.225e-02, -3.775e-03, -3.821e-01, -8.246e-02, 2.336e-02, 5.701e-02, -9.513e-02)); + r += mul(s1_6, M4(-4.435e-02, -2.383e-02, 2.873e-02, 1.033e-01, -3.893e-02, -4.387e-03, 1.064e-01, -1.552e-03, -3.830e-02, -8.205e-03, 6.505e-02, -1.395e-01, -2.812e-02, -1.357e-01, -4.313e-02, -1.492e-01)); + r += mul(s1_7, M4(-4.363e-02, -2.478e-02, 8.346e-03, -4.201e-02, -5.849e-02, -1.863e-02, 6.421e-02, -7.445e-02, 1.853e-02, -3.674e-02, 6.083e-02, -4.624e-02, -2.120e-01, 3.527e-01, -3.120e-01, 9.880e-02)); + r += mul(s1_8, M4(-9.998e-02, 1.131e-02, 3.393e-02, 8.990e-02, -5.088e-02, -1.396e-02, 6.092e-02, -2.058e-02, 1.320e-02, -3.463e-02, 4.451e-02, -6.250e-02, 2.477e-01, -9.122e-02, 4.647e-02, 5.444e-02)); + r += mul(s2_0, M4(1.738e-02, 5.692e-05, -3.280e-02, 1.116e-01, -4.025e-02, -6.378e-03, 6.333e-02, -2.169e-02, 1.159e-03, 5.745e-02, -1.892e-02, -5.304e-02, -8.005e-03, 6.982e-03, 1.781e-02, -1.290e-01)); + r += mul(s2_1, M4(2.053e-02, 1.001e-01, -5.542e-02, 1.997e-01, -1.069e-01, -1.316e-01, -9.407e-03, -2.496e-01, -1.271e-01, 5.652e-02, 9.357e-02, -5.321e-02, -1.236e-02, -3.268e-02, -1.057e-01, 3.677e-01)); + r += mul(s2_2, M4(-1.572e-01, 1.607e-01, -1.469e-02, -2.933e-02, 1.361e-01, -1.904e-01, -1.410e-02, -1.019e-01, -2.218e-02, -1.175e-01, 1.221e-02, -9.969e-02, -1.374e-02, 1.115e-01, 5.505e-02, -4.364e-02)); + r += mul(s2_3, M4(2.645e-02, -1.315e-01, 5.348e-02, -6.960e-02, -8.126e-02, 2.138e-02, 4.465e-02, -1.993e-03, -2.183e-02, -1.264e-01, -7.401e-02, -1.451e-01, 1.713e-01, -9.877e-02, 1.130e-01, -1.241e-01)); + r += mul(s2_4, M4(-8.051e-01, -4.633e-02, -1.499e-01, 4.505e-02, -1.396e-01, 1.184e-01, -3.166e-02, 2.424e-01, -3.324e-02, -4.050e-02, -2.288e-01, 2.254e-02, 1.225e-01, 2.109e-01, 4.975e-01, 2.566e-02)); + r += mul(s2_5, M4(-1.325e-01, 3.603e-01, -1.102e-01, 8.552e-02, 1.978e-01, -1.439e-01, 2.342e-02, -1.104e-01, -9.703e-02, 1.217e-03, 6.674e-02, -4.943e-03, 1.047e-01, 1.100e-01, -7.425e-02, -1.426e-01)); + r += mul(s2_6, M4(6.620e-02, -5.105e-03, 5.341e-02, 6.188e-02, 1.215e-01, -4.942e-02, -2.350e-02, -2.389e-03, 7.577e-03, -1.194e-02, 7.483e-02, 2.797e-02, 8.517e-02, -1.188e-01, -9.627e-03, -3.775e-02)); + r += mul(s2_7, M4(-7.349e-02, -8.638e-02, 1.668e-01, -1.634e-01, -2.610e-02, 5.929e-02, 1.200e-01, 1.551e-01, -6.725e-02, 2.538e-02, 3.603e-02, 6.823e-02, -9.709e-02, -5.752e-03, -5.046e-02, -1.508e-01)); + r += mul(s2_8, M4(-1.805e-01, 7.995e-02, -1.702e-02, 6.758e-02, -5.362e-02, -2.128e-02, 5.766e-02, -1.263e-01, 1.730e-02, -2.622e-02, 8.422e-02, -8.742e-03, 1.736e-02, 5.187e-02, -1.939e-02, -6.008e-02)); + r += mul(s3_0, M4(2.769e-02, -6.180e-02, -1.595e-02, -5.555e-02, 7.106e-02, 1.989e-02, -8.007e-03, 3.022e-02, 8.952e-02, -8.760e-02, 3.358e-03, 5.172e-01, -5.316e-02, -1.774e-02, -1.529e-02, 3.360e-02)); + r += mul(s3_1, M4(2.083e-01, -1.959e-01, -3.492e-02, -1.062e-01, -1.991e-01, 1.627e-01, 4.752e-02, 1.935e-01, -4.772e-02, -4.620e-01, 6.199e-01, -5.559e-01, 5.407e-02, -1.701e-02, -9.253e-02, -2.324e-01)); + r += mul(s3_2, M4(-2.318e-02, 4.885e-02, 4.424e-02, -1.622e-01, 3.683e-02, 8.032e-03, 4.170e-03, -2.176e-01, 1.676e-01, -5.978e-01, 1.706e-01, 5.688e-02, -3.584e-02, -3.374e-02, 9.832e-02, 8.184e-02)); + r += mul(s3_3, M4(7.349e-02, -1.023e-01, 3.799e-02, -7.277e-02, -6.203e-02, -2.119e-02, 3.634e-02, -6.658e-02, -3.352e-01, 6.581e-01, 4.496e-01, -4.329e-02, 1.106e-01, -1.827e-01, 1.568e-01, 5.295e-02)); + r += mul(s3_4, M4(1.424e-01, -9.230e-01, 4.605e-02, 1.233e-02, 3.738e-02, -2.959e-02, -9.470e-02, -1.115e-02, 3.737e-01, -2.685e-01, -1.735e-02, 1.542e-01, -3.248e-01, 3.305e-01, 1.752e-01, 2.610e-02)); + r += mul(s3_5, M4(4.717e-01, -2.105e-01, 3.212e-02, 1.470e-02, 6.355e-02, 3.502e-02, -6.022e-04, 7.889e-02, -9.257e-03, -6.054e-01, 5.161e-01, 6.461e-02, 2.712e-01, -2.589e-01, 8.823e-02, 8.179e-02)); + r += mul(s3_6, M4(6.777e-02, 4.699e-02, -9.605e-03, 7.196e-02, 3.270e-02, 2.843e-02, 6.386e-02, 2.463e-02, -6.469e-02, -1.302e-01, 3.400e-02, 6.313e-01, 1.639e-01, -1.763e-01, -8.542e-02, 1.369e-01)); + r += mul(s3_7, M4(-1.241e-02, -2.214e-03, 2.025e-01, -6.725e-02, 7.727e-02, -1.428e-02, -5.117e-02, 1.164e-01, 3.355e-02, 1.263e-01, 2.701e-01, 3.418e-01, -1.227e-01, 7.170e-02, 3.163e-02, 8.146e-02)); + r += mul(s3_8, M4(-5.885e-02, -2.514e-02, -1.081e-01, 3.977e-02, -9.304e-02, 1.579e-02, 5.317e-02, -7.459e-04, -1.390e-02, -3.147e-01, 6.463e-01, 3.237e-01, 3.543e-02, 2.026e-02, -4.326e-02, 8.351e-02)); + r += V4(4.531e-03, -8.111e-04, -4.559e-03, 1.344e-02); + return r; +} + +V4 f1(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8) { + V4 r = 0.0; + r += mul(s0_0, M4(5.109e-03, -1.013e-01, -4.476e-03, 2.371e-02, -1.188e-02, 2.613e-02, 4.354e-03, 5.263e-02, 2.261e-02, 1.565e-01, 1.185e-01, -7.047e-02, -5.470e-03, -6.023e-02, -5.102e-02, -4.978e-02)); + r += mul(s0_1, M4(3.411e-02, -6.323e-02, 2.892e-01, 5.630e-02, -9.362e-02, 2.923e-02, 3.466e-01, 1.604e-01, -1.297e-01, 9.643e-02, -8.275e-02, -6.924e-02, -6.175e-03, 7.658e-03, -1.293e-01, 2.992e-02)); + r += mul(s0_2, M4(-6.653e-02, 7.399e-02, -6.861e-02, 2.062e-02, -1.039e-01, -7.505e-02, 1.044e-03, 5.407e-02, -4.158e-02, 1.475e-02, 1.392e-02, 6.334e-02, 9.506e-02, 1.937e-02, -4.186e-02, -3.346e-02)); + r += mul(s0_3, M4(-7.411e-02, -9.890e-02, 2.862e-02, -1.133e-02, -6.961e-02, 1.554e-01, -3.630e-02, 4.619e-02, -5.479e-02, -8.802e-02, -3.359e-02, 1.322e-02, 4.674e-02, 6.430e-02, -1.762e-01, -9.326e-02)); + r += mul(s0_4, M4(3.798e-01, 3.569e-01, 3.303e-02, -3.879e-01, 1.660e-01, 3.253e-01, 5.718e-01, 4.811e-01, 2.049e-01, 2.783e-01, 1.532e-01, 2.310e-01, 1.625e-01, 2.305e-01, 1.518e-01, 1.102e-01)); + r += mul(s0_5, M4(-2.511e-02, 7.963e-02, 1.293e-01, -1.074e-01, -3.559e-01, -3.133e-02, -3.580e-01, 1.722e-01, -2.363e-01, -6.018e-02, 2.465e-02, -2.001e-02, -3.252e-01, -1.818e-01, 3.119e-01, 2.003e-01)); + r += mul(s0_6, M4(-6.486e-02, 7.469e-03, 1.003e-02, 1.480e-02, 6.965e-02, -1.185e-02, -4.961e-02, -3.236e-02, -8.740e-02, -5.041e-02, 1.229e-02, 5.909e-02, -6.895e-03, -9.904e-02, 8.634e-02, 4.633e-02)); + r += mul(s0_7, M4(6.900e-03, -1.665e-02, -1.701e-02, -9.881e-02, -7.354e-02, -1.694e-01, 1.642e-01, 9.754e-02, 6.378e-02, 1.202e-02, 1.083e-01, -2.660e-02, -3.433e-01, -3.428e-01, 4.544e-02, 4.121e-02)); + r += mul(s0_8, M4(1.150e-02, -9.370e-03, 3.042e-02, -6.306e-02, -1.127e-01, 1.582e-02, 1.082e-02, 1.499e-01, 3.286e-03, 9.324e-03, -7.105e-02, 2.163e-02, 2.231e-01, -2.537e-02, 2.663e-02, 1.020e-01)); + r += mul(s1_0, M4(-2.882e-02, -1.364e-01, -6.985e-02, -8.632e-02, -1.159e-02, 5.210e-02, -1.038e-01, -3.735e-02, 1.732e-01, 1.714e-01, 4.997e-03, -9.303e-02, -7.473e-02, 5.196e-02, -7.526e-02, -1.339e-02)); + r += mul(s1_1, M4(7.270e-02, -5.112e-02, 2.064e-01, -9.973e-02, 1.341e-01, -9.910e-02, 1.171e-01, -1.909e-02, 2.098e-01, 2.391e-01, 1.460e-01, -2.052e-01, -9.156e-02, 3.022e-03, -7.790e-02, -1.620e-02)); + r += mul(s1_2, M4(8.411e-02, 2.544e-02, -8.592e-02, -1.476e-01, -8.090e-02, 2.901e-02, 3.733e-03, 7.357e-02, 1.347e-01, 1.987e-02, 1.459e-01, -1.547e-02, 1.014e-01, -2.559e-02, 8.887e-02, 2.969e-02)); + r += mul(s1_3, M4(9.597e-02, -3.545e-01, -2.156e-02, -4.908e-02, -5.108e-02, -8.399e-02, 5.381e-02, 1.013e-01, 3.602e-02, 2.681e-01, 2.220e-02, 1.373e-01, 4.991e-02, 4.378e-02, -7.537e-02, -2.068e-01)); + r += mul(s1_4, M4(5.888e-01, 2.576e-01, -3.241e-01, -4.970e-01, 1.664e-01, 2.416e-01, 3.465e-01, 7.672e-02, 1.097e-01, 5.451e-01, 1.206e-01, 4.713e-01, -2.924e-03, 2.240e-01, 1.714e-01, -3.315e-04)); + r += mul(s1_5, M4(1.887e-01, 8.490e-02, -8.236e-02, -2.263e-01, -4.718e-02, 6.606e-02, -2.596e-01, -2.097e-01, -1.909e-01, -3.157e-01, 1.629e-01, 3.072e-02, 4.002e-01, 1.577e-01, 1.484e-01, 5.068e-02)); + r += mul(s1_6, M4(-9.601e-03, -5.944e-02, -6.170e-03, -5.131e-02, -6.913e-02, -1.295e-02, -2.661e-02, 8.608e-03, -1.877e-01, -9.093e-02, 4.880e-02, 7.809e-02, 2.246e-01, 1.962e-01, -1.578e-02, -1.218e-01)); + r += mul(s1_7, M4(1.245e-01, -6.743e-02, -7.707e-02, -2.127e-01, -2.682e-02, -5.999e-02, -2.738e-02, -2.108e-02, 7.802e-03, -2.028e-01, 1.086e-01, -8.522e-02, -3.510e-01, -1.243e-01, -7.196e-02, 5.012e-02)); + r += mul(s1_8, M4(1.554e-01, 1.041e-01, -8.905e-02, -1.498e-02, -2.704e-02, -4.771e-03, -8.702e-02, 6.094e-02, -7.724e-02, -1.039e-01, -4.334e-02, -6.489e-02, 1.061e-02, -1.715e-01, 3.398e-01, 1.436e-01)); + r += mul(s2_0, M4(1.898e-02, -6.796e-02, -9.681e-02, 5.317e-02, -6.710e-02, -2.401e-01, 8.957e-02, -1.326e-01, -1.285e-01, -4.354e-02, -4.742e-02, 5.456e-02, -3.094e-02, 9.700e-02, -1.397e-01, -1.736e-01)); + r += mul(s2_1, M4(-1.130e-01, -8.727e-02, -6.717e-02, 1.105e-01, 3.471e-01, 4.923e-02, 3.048e-02, 1.696e-01, -5.733e-02, -4.620e-02, 2.674e-02, 2.742e-02, 1.125e-01, -3.257e-02, -1.607e-01, 2.017e-01)); + r += mul(s2_2, M4(-1.016e-01, 8.385e-03, -1.411e-01, -2.757e-02, -7.714e-03, 6.335e-02, 8.580e-02, -8.000e-03, 9.101e-04, -8.858e-02, -4.917e-02, -2.892e-02, -6.813e-02, -1.086e-02, 6.338e-02, -1.416e-02)); + r += mul(s2_3, M4(9.098e-02, 1.957e-01, -9.551e-02, 1.372e-02, 5.547e-02, -5.539e-02, -7.710e-02, 4.348e-02, 6.994e-02, -9.307e-03, 4.403e-02, 4.120e-02, -4.607e-02, 1.169e-02, -1.930e-01, 2.159e-02)); + r += mul(s2_4, M4(4.111e-01, 8.301e-01, -3.466e-01, -9.503e-01, 6.933e-02, -1.913e-02, 2.897e-01, 6.002e-02, 1.656e-01, -2.074e-01, -2.278e-01, -2.744e-01, 1.898e-01, 3.807e-01, 1.588e-01, 1.337e-01)); + r += mul(s2_5, M4(3.547e-02, 9.913e-02, 2.290e-01, -1.001e-01, 2.844e-01, -5.348e-02, 3.102e-01, 2.668e-01, -2.307e-02, 1.603e-02, -1.343e-01, -1.940e-01, -6.855e-02, 7.183e-03, 2.743e-01, 1.129e-01)); + r += mul(s2_6, M4(-2.187e-02, -2.622e-02, -4.526e-02, -6.321e-03, -8.359e-02, -1.268e-01, 8.651e-02, -6.939e-03, 2.957e-02, 5.836e-03, -2.792e-02, -3.501e-02, 7.605e-02, 2.245e-02, 3.698e-02, -4.302e-02)); + r += mul(s2_7, M4(1.205e-01, -8.147e-02, -2.218e-01, -2.645e-01, 7.159e-02, 2.437e-01, -2.439e-02, 1.300e-01, -3.909e-02, -1.879e-02, -1.024e-01, 1.197e-02, 4.967e-02, 1.628e-01, -2.973e-02, -5.674e-02)); + r += mul(s2_8, M4(-4.114e-02, 2.495e-03, -6.669e-02, -1.126e-01, 1.185e-03, -2.611e-01, 4.307e-02, -4.078e-02, 1.727e-02, 3.137e-02, 4.402e-02, -9.532e-03, -1.445e-01, -2.802e-02, 8.805e-02, -3.620e-02)); + r += mul(s3_0, M4(5.592e-02, -5.986e-02, 4.212e-02, -1.351e-02, -1.183e-01, -7.062e-02, -2.884e-02, -9.861e-02, 2.923e-01, -3.872e-01, -7.561e-02, -2.126e-01, -1.087e-02, 2.638e-01, -1.060e-01, -2.521e-02)); + r += mul(s3_1, M4(-2.393e-03, 1.342e-02, -2.694e-01, -3.229e-02, 9.839e-02, 1.256e-01, 1.459e-01, 5.196e-02, 6.062e-01, -5.927e-01, 5.081e-01, -8.134e-01, -5.183e-01, -9.299e-02, -4.591e-01, 4.634e-01)); + r += mul(s3_2, M4(-1.243e-01, -1.546e-03, -2.050e-01, -9.618e-02, 1.164e-01, 3.858e-03, 2.954e-01, 2.534e-02, 2.224e-01, 3.648e-01, -4.268e-01, -7.856e-01, -1.146e-01, -5.429e-03, -3.244e-01, 4.515e-02)); + r += mul(s3_3, M4(1.545e-02, 1.267e-01, 1.834e-01, 1.085e-01, 8.707e-02, 3.956e-02, -6.194e-02, -8.369e-02, 1.215e-01, 1.556e-01, -5.293e-01, -1.505e-01, 1.939e-01, 1.340e-01, -4.531e-01, -2.169e-01)); + r += mul(s3_4, M4(-4.717e-01, 4.645e-01, 4.459e-01, -9.550e-02, 3.874e-01, 3.174e-01, -2.450e-01, 9.813e-02, 4.528e-01, -9.403e-01, 9.279e-01, -4.499e-01, 5.985e-02, -6.119e-01, 4.211e-01, -1.085e-01)); + r += mul(s3_5, M4(-2.976e-01, -2.410e-01, 1.306e-01, 1.568e-01, 2.322e-01, 1.803e-01, 3.317e-01, 1.716e-01, 6.972e-01, 1.567e-01, -3.980e-01, -6.066e-01, 1.686e-02, -8.061e-02, -1.006e-01, 1.342e-01)); + r += mul(s3_6, M4(-8.888e-02, -1.646e-01, 7.995e-02, -2.675e-02, -4.782e-02, -7.957e-02, -5.547e-02, -2.723e-04, 2.751e-01, -3.776e-01, 1.641e-01, 3.858e-01, 1.835e-01, 7.779e-02, -5.251e-02, -1.195e-01)); + r += mul(s3_7, M4(-9.921e-02, -8.667e-02, -1.878e-02, -1.259e-01, 8.537e-02, -4.571e-02, 2.510e-01, 3.064e-02, 1.216e-01, -1.229e-01, 1.490e-01, -2.311e-01, 1.152e-02, -6.642e-02, -7.519e-02, 1.796e-02)); + r += mul(s3_8, M4(-4.726e-02, 2.303e-02, -6.555e-02, -3.746e-02, 4.466e-02, -5.962e-02, -4.969e-02, -8.936e-02, 2.212e-01, -2.673e-02, -1.224e-01, 2.754e-02, -6.249e-02, -4.974e-02, 2.964e-02, 1.651e-02)); + r += V4(7.221e-03, -6.181e-03, -9.146e-03, -1.076e-02); + return r; +} + +void Pass4(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = Rmp8x8(tid.x) + blockStart; + uint2 size = GetInputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = (gxy + 0.5) * pt; + + V4 s0_0 = l0(-1.0, -1.0); + V4 s0_1 = l0(0.0, -1.0); + V4 s0_2 = l0(1.0, -1.0); + V4 s0_3 = l0(-1.0, 0.0); + V4 s0_4 = l0(0.0, 0.0); + V4 s0_5 = l0(1.0, 0.0); + V4 s0_6 = l0(-1.0, 1.0); + V4 s0_7 = l0(0.0, 1.0); + V4 s0_8 = l0(1.0, 1.0); + V4 s1_0 = -max(-s0_0, 0.0); + V4 s1_1 = -max(-s0_1, 0.0); + V4 s1_2 = -max(-s0_2, 0.0); + V4 s1_3 = -max(-s0_3, 0.0); + V4 s1_4 = -max(-s0_4, 0.0); + V4 s1_5 = -max(-s0_5, 0.0); + V4 s1_6 = -max(-s0_6, 0.0); + V4 s1_7 = -max(-s0_7, 0.0); + V4 s1_8 = -max(-s0_8, 0.0); + s0_0 = max(s0_0, 0.0); + s0_1 = max(s0_1, 0.0); + s0_2 = max(s0_2, 0.0); + s0_3 = max(s0_3, 0.0); + s0_4 = max(s0_4, 0.0); + s0_5 = max(s0_5, 0.0); + s0_6 = max(s0_6, 0.0); + s0_7 = max(s0_7, 0.0); + s0_8 = max(s0_8, 0.0); + + V4 s2_0 = l1(-1.0, -1.0); + V4 s2_1 = l1(0.0, -1.0); + V4 s2_2 = l1(1.0, -1.0); + V4 s2_3 = l1(-1.0, 0.0); + V4 s2_4 = l1(0.0, 0.0); + V4 s2_5 = l1(1.0, 0.0); + V4 s2_6 = l1(-1.0, 1.0); + V4 s2_7 = l1(0.0, 1.0); + V4 s2_8 = l1(1.0, 1.0); + V4 s3_0 = -max(-s2_0, 0.0); + V4 s3_1 = -max(-s2_1, 0.0); + V4 s3_2 = -max(-s2_2, 0.0); + V4 s3_3 = -max(-s2_3, 0.0); + V4 s3_4 = -max(-s2_4, 0.0); + V4 s3_5 = -max(-s2_5, 0.0); + V4 s3_6 = -max(-s2_6, 0.0); + V4 s3_7 = -max(-s2_7, 0.0); + V4 s3_8 = -max(-s2_8, 0.0); + s2_0 = max(s2_0, 0.0); + s2_1 = max(s2_1, 0.0); + s2_2 = max(s2_2, 0.0); + s2_3 = max(s2_3, 0.0); + s2_4 = max(s2_4, 0.0); + s2_5 = max(s2_5, 0.0); + s2_6 = max(s2_6, 0.0); + s2_7 = max(s2_7, 0.0); + s2_8 = max(s2_8, 0.0); + + t2[gxy] = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8); + t3[gxy] = f1(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8); +} + +//!PASS 5 +//!DESC conv4 +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 +//!IN t2, t3 +//!OUT t0, t1 + +#define l0(x, y) V4(O(t2, float2(x, y))) +#define l1(x, y) V4(O(t3, float2(x, y))) + +V4 f0(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8) { + V4 r = 0.0; + r += mul(s0_0, M4(2.358e-02, 7.106e-02, -1.223e-01, -1.570e-01, -4.561e-02, 2.621e-02, -6.238e-02, -2.642e-02, -1.613e-01, -1.018e-01, -1.182e-01, 9.290e-02, 1.166e-01, -4.284e-02, 3.173e-02, 6.253e-02)); + r += mul(s0_1, M4(-1.356e-01, -2.774e-01, 4.431e-02, -2.950e-01, -3.286e-02, -2.192e-01, 5.332e-02, -8.862e-02, -7.113e-02, 1.994e-01, -1.422e-01, 3.142e-01, 7.644e-02, -5.537e-02, -1.903e-01, 1.820e-01)); + r += mul(s0_2, M4(-8.536e-02, 1.536e-01, 2.164e-02, -8.691e-02, -7.817e-02, 1.158e-01, 3.551e-02, 9.690e-02, -2.058e-01, -2.366e-01, -2.024e-01, 3.949e-02, 9.990e-02, -1.155e-01, -4.381e-02, 5.952e-02)); + r += mul(s0_3, M4(4.764e-02, -2.284e-01, 2.608e-01, -3.773e-01, 6.969e-03, -1.371e-01, 3.378e-02, -1.982e-01, -1.499e-01, 1.022e-01, 2.773e-01, -1.993e-01, 1.287e-01, -1.990e-01, -1.213e-01, 4.326e-02)); + r += mul(s0_4, M4(4.182e-01, -4.292e-01, 2.890e-01, -7.257e-02, 5.904e-02, 5.257e-01, 8.142e-02, 4.462e-01, -3.900e-01, -4.610e-02, -3.785e-01, 1.900e-01, 1.028e-01, -7.148e-02, -1.026e-01, 1.641e-01)); + r += mul(s0_5, M4(-1.978e-02, 1.734e-01, -1.815e-01, -1.499e-01, 2.661e-03, -5.529e-02, -6.137e-02, -1.076e-02, -9.873e-02, 7.319e-02, -1.055e-01, -1.914e-02, 3.545e-01, -2.098e-01, 2.723e-02, -1.403e-02)); + r += mul(s0_6, M4(2.502e-02, 4.622e-02, 1.371e-02, -5.810e-02, 6.768e-02, 6.884e-02, 7.794e-02, 4.459e-02, 1.565e-02, -5.750e-02, -1.899e-01, -3.387e-02, -7.821e-02, -3.829e-01, -2.889e-02, -6.215e-02)); + r += mul(s0_7, M4(2.837e-01, 2.153e-01, 6.464e-01, -2.259e-02, 1.787e-01, 5.850e-02, -1.661e-01, 8.230e-02, -2.558e-03, -9.202e-02, -1.143e-01, 5.795e-02, 2.725e-01, -2.512e-01, -3.417e-01, 1.418e-01)); + r += mul(s0_8, M4(-7.240e-02, 7.377e-02, 1.601e-02, -5.421e-02, 5.224e-02, 2.011e-02, 3.942e-02, -2.078e-02, 6.665e-02, 5.385e-02, -7.067e-02, -3.002e-02, 6.076e-01, -1.559e-01, -1.351e-01, 3.973e-02)); + r += mul(s1_0, M4(5.739e-02, -2.130e-02, 6.867e-02, 8.138e-02, -8.371e-02, 7.208e-02, 9.522e-02, -1.247e-02, 3.673e-02, -1.020e-01, -1.157e-01, -4.893e-02, 4.489e-02, 6.052e-03, -1.856e-02, 1.512e-02)); + r += mul(s1_1, M4(-8.925e-02, -1.358e-02, -4.710e-02, -5.965e-02, -1.423e-01, -1.121e-01, 3.344e-01, -2.959e-01, 8.419e-02, -1.992e-01, -1.728e-01, 1.496e-01, 7.465e-02, -6.513e-02, -1.158e-01, 4.417e-02)); + r += mul(s1_2, M4(-1.561e-02, 1.173e-01, 6.393e-02, 7.635e-02, -2.358e-01, 4.513e-01, 1.043e-01, 5.412e-02, -1.062e-01, -2.702e-01, -1.967e-01, 2.292e-02, 4.481e-02, -6.181e-02, -7.755e-02, 1.785e-02)); + r += mul(s1_3, M4(-1.536e-02, 1.336e-01, -1.401e-01, 1.672e-01, -3.804e-02, 1.629e-01, 3.546e-02, -2.329e-01, -1.882e-01, -6.580e-02, 6.342e-02, -2.430e-01, -4.527e-02, 3.083e-02, -1.829e-02, 5.247e-02)); + r += mul(s1_4, M4(-2.110e-01, 9.668e-02, -5.724e-02, 2.095e-01, -2.346e-01, 8.267e-01, -2.799e-01, 3.349e-01, -1.565e-01, 6.647e-02, 1.817e-02, 1.019e-01, 3.862e-02, -1.680e-01, 1.549e-01, 7.007e-02)); + r += mul(s1_5, M4(-1.472e-01, 2.887e-02, -9.785e-02, 1.098e-01, 3.725e-02, 4.719e-01, 1.409e-01, -1.149e-01, -1.343e-01, 4.555e-03, -7.537e-02, -6.092e-02, 7.429e-02, 1.599e-01, -7.409e-02, 1.111e-01)); + r += mul(s1_6, M4(5.192e-02, 5.279e-02, 5.139e-02, 5.538e-03, 3.032e-02, 1.416e-01, -1.027e-01, -1.048e-01, -1.343e-01, -2.519e-02, 9.241e-02, -3.552e-02, -3.274e-02, -1.035e-01, -2.752e-02, -3.711e-02)); + r += mul(s1_7, M4(1.405e-01, 1.283e-01, -1.631e-01, 1.448e-01, -1.476e-01, 3.194e-01, 4.787e-02, 8.664e-02, -2.308e-02, -2.718e-02, 2.198e-01, 5.863e-02, 5.409e-02, -1.074e-01, -3.430e-01, 7.548e-02)); + r += mul(s1_8, M4(6.984e-02, 8.299e-02, -1.025e-02, 1.410e-02, -3.269e-01, 1.130e-01, -4.935e-02, -7.883e-02, 2.730e-02, 2.576e-02, 9.849e-02, -8.321e-03, 1.082e-01, 7.446e-02, -4.441e-02, 9.677e-03)); + r += mul(s2_0, M4(-3.258e-02, -1.473e-03, 1.278e-01, -6.312e-04, 9.059e-04, -1.729e-02, 8.754e-03, -7.737e-02, -5.027e-02, 8.639e-02, -1.170e-02, 7.257e-02, 8.412e-02, 2.112e-02, -2.565e-01, 7.677e-03)); + r += mul(s2_1, M4(-7.643e-04, -2.024e-02, 1.767e-01, -7.645e-03, 6.422e-02, 2.239e-01, 1.450e-02, 1.947e-01, -1.279e-02, -1.349e-02, -1.409e-01, -1.273e-01, -9.158e-02, -1.500e-01, 7.653e-02, 2.805e-01)); + r += mul(s2_2, M4(3.071e-02, 2.711e-02, 6.236e-02, 1.223e-02, 2.077e-02, 1.323e-01, 5.334e-03, -5.884e-02, 6.902e-03, 5.473e-03, -3.114e-02, -2.389e-02, 3.126e-03, -7.234e-02, 4.478e-02, -1.808e-02)); + r += mul(s2_3, M4(-5.518e-02, 1.332e-01, -2.462e-02, -1.615e-01, -3.965e-02, -2.004e-02, 1.268e-01, -1.470e-02, -1.397e-01, -6.340e-02, 9.022e-02, -1.625e-01, -1.426e-01, -3.068e-01, -3.755e-02, -1.816e-01)); + r += mul(s2_4, M4(-2.434e-01, -3.850e-02, -2.343e-01, -1.456e-01, -3.490e-01, 1.238e-01, 4.962e-03, -6.624e-02, 2.030e-01, -1.929e-01, 1.951e-01, -3.391e-01, -9.956e-02, 2.692e-01, -3.039e-01, 1.984e-01)); + r += mul(s2_5, M4(-2.289e-02, -9.088e-03, 1.582e-02, 6.333e-02, -4.110e-01, -2.279e-01, -4.103e-02, -4.303e-02, 1.533e-02, 1.511e-01, -6.972e-02, 1.555e-01, -1.127e-01, -1.785e-01, -5.199e-02, -1.169e-01)); + r += mul(s2_6, M4(-5.538e-02, -2.687e-03, 7.738e-02, -3.888e-02, -6.798e-03, 5.840e-03, 9.394e-02, -9.093e-02, -2.274e-02, 5.489e-02, -1.046e-01, -9.950e-02, -1.291e-01, -3.497e-02, -1.789e-02, -2.169e-02)); + r += mul(s2_7, M4(1.547e-01, -3.511e-02, 6.851e-03, 4.498e-02, -4.047e-02, 1.323e-01, 2.036e-01, -3.356e-02, 2.381e-02, -2.907e-02, -3.230e-01, -5.017e-02, 7.335e-02, 8.047e-02, 2.422e-01, -7.968e-03)); + r += mul(s2_8, M4(1.402e-01, -1.278e-01, 4.702e-02, -2.929e-03, -2.774e-03, 4.017e-02, 1.142e-01, -5.435e-02, 5.163e-02, -4.898e-02, -1.112e-01, -1.679e-02, -1.153e-01, -1.449e-01, 3.081e-02, -1.046e-01)); + r += mul(s3_0, M4(8.011e-02, -1.008e-01, -3.350e-02, -5.067e-02, 3.134e-02, 1.965e-02, -6.230e-02, 6.086e-02, 1.045e-01, 3.276e-02, -1.810e-01, 6.820e-02, -1.228e-01, -8.570e-02, 2.025e-01, -1.825e-01)); + r += mul(s3_1, M4(1.911e-03, 2.398e-02, -6.180e-02, 8.361e-02, 1.777e-01, 9.055e-02, -2.063e-01, 1.300e-01, 8.911e-02, -1.316e-02, -1.055e-01, -1.246e-01, -3.907e-02, 1.910e-01, 1.273e-01, 1.199e-01)); + r += mul(s3_2, M4(1.061e-01, 3.932e-02, 1.409e-02, 1.843e-02, 1.023e-01, -1.627e-01, -7.256e-02, 1.090e-02, 5.967e-02, 5.053e-02, -5.669e-02, -3.334e-02, 5.388e-02, 9.133e-02, 8.598e-02, -9.190e-02)); + r += mul(s3_3, M4(1.566e-02, -8.323e-03, -2.284e-01, -1.353e-01, -1.207e-01, 2.292e-02, 1.171e-01, 9.358e-02, -4.992e-02, -4.395e-02, 1.335e-01, -1.698e-01, 5.811e-02, -1.714e-01, -1.425e-02, -2.387e-01)); + r += mul(s3_4, M4(-5.546e-01, 2.770e-01, -2.630e-01, -2.027e-01, -5.485e-02, -1.584e-01, 4.579e-01, -7.056e-02, -2.309e-01, 1.690e-01, -1.575e-01, -3.097e-01, 1.883e-01, -9.219e-03, -2.047e-01, -3.564e-01)); + r += mul(s3_5, M4(5.198e-03, 1.196e-01, -8.158e-02, -4.777e-02, -2.359e-01, -3.586e-01, 2.130e-01, 2.051e-01, 1.191e-03, 7.352e-02, -2.873e-02, 8.438e-02, 9.639e-02, -2.764e-01, -3.439e-02, -1.704e-01)); + r += mul(s3_6, M4(-9.012e-02, 9.280e-02, 8.295e-02, 8.577e-03, -3.140e-03, 1.152e-02, 5.301e-02, -5.006e-03, -5.893e-03, 3.360e-02, 3.761e-02, -3.912e-02, -8.357e-02, 8.906e-03, 2.089e-02, 1.899e-02)); + r += mul(s3_7, M4(1.114e-03, 3.887e-02, -4.030e-02, -3.748e-02, 3.333e-02, -5.122e-02, -2.400e-01, -2.969e-03, 2.300e-02, -1.357e-01, -2.767e-01, -1.186e-02, -1.660e-01, 8.940e-02, 3.164e-01, -5.897e-02)); + r += mul(s3_8, M4(3.387e-02, -8.658e-02, -3.218e-02, -4.372e-02, -1.515e-01, 5.072e-02, -1.683e-01, 4.557e-02, 1.132e-01, -6.613e-03, -1.422e-01, 1.617e-02, -1.129e-01, -1.111e-01, 3.890e-02, -6.358e-02)); + r += V4(-2.990e-03, -3.480e-03, 7.394e-03, 1.290e-02); + return r; +} + +V4 f1(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8) { + V4 r = 0.0; + r += mul(s0_0, M4(3.519e-02, 4.799e-02, -2.984e-03, -1.240e-01, -6.249e-03, 2.523e-02, 1.077e-01, 4.787e-02, 2.420e-02, 7.819e-02, -1.956e-01, -7.709e-02, -5.882e-02, -3.366e-02, -1.714e-01, 1.200e-01)); + r += mul(s0_1, M4(-2.273e-01, 8.166e-02, 8.317e-02, 8.376e-02, -5.856e-02, 4.123e-03, -2.466e-01, -3.422e-02, -5.165e-02, 6.070e-02, 7.922e-02, -9.691e-02, 2.510e-01, -1.318e-02, -1.696e-01, 1.123e-01)); + r += mul(s0_2, M4(2.300e-01, -4.649e-02, -9.124e-02, -9.431e-02, 1.141e-01, -4.892e-03, 3.389e-02, -7.123e-02, -5.376e-02, 3.972e-02, 1.306e-01, 9.184e-02, 3.181e-02, -1.301e-02, 6.289e-02, -2.389e-02)); + r += mul(s0_3, M4(-3.802e-01, -2.023e-01, -2.227e-01, -9.450e-02, 2.842e-02, -1.421e-01, -1.397e-01, -9.477e-02, 8.360e-02, 5.211e-02, -4.870e-02, -2.897e-01, 3.206e-03, -1.743e-01, -3.055e-01, -4.716e-02)); + r += mul(s0_4, M4(3.208e-01, -4.644e-01, 8.642e-01, 7.726e-01, 2.570e-01, -3.573e-02, 5.571e-02, 4.619e-01, 1.200e-01, -1.772e-01, 1.733e-01, 3.480e-02, 1.119e-01, 7.200e-02, 5.641e-02, -1.770e-01)); + r += mul(s0_5, M4(-5.690e-01, 1.045e-02, 5.379e-01, -2.482e-01, -2.435e-01, 1.075e-02, -3.207e-02, 1.476e-01, 2.284e-02, 8.934e-02, 3.712e-02, 5.994e-02, -1.533e-01, -5.881e-02, 5.651e-02, -1.526e-02)); + r += mul(s0_6, M4(2.499e-02, 9.467e-03, 5.746e-02, -8.387e-02, -5.405e-02, -1.732e-02, 7.648e-02, 2.696e-02, -1.241e-01, 2.151e-02, -6.329e-02, -7.248e-02, -1.591e-01, -2.487e-02, -1.833e-01, 2.593e-03)); + r += mul(s0_7, M4(-2.208e-01, -3.703e-01, 2.619e-01, 5.898e-02, -1.777e-01, -7.585e-02, 6.970e-02, 4.988e-02, -4.151e-02, -7.482e-03, -1.184e-03, -1.444e-03, -1.106e-01, -1.452e-01, 2.712e-01, -5.314e-02)); + r += mul(s0_8, M4(3.481e-02, -3.760e-02, -1.266e-01, 2.756e-02, -1.371e-02, 5.496e-02, -1.166e-01, 4.062e-02, 6.351e-02, 2.666e-02, -1.949e-02, 4.756e-02, 3.367e-01, -3.686e-01, -2.675e-01, 1.228e-01)); + r += mul(s1_0, M4(2.598e-03, -6.811e-02, 4.981e-02, -1.319e-02, 1.206e-01, 2.461e-02, -3.766e-02, 2.058e-02, 8.023e-02, -1.693e-02, 3.585e-02, -9.837e-02, 8.781e-03, -1.964e-02, -4.176e-03, -4.753e-03)); + r += mul(s1_1, M4(1.442e-01, -8.370e-03, -7.432e-02, -3.089e-02, -1.981e-01, -4.136e-02, -1.909e-01, -1.179e-01, -1.917e-01, 9.283e-03, -6.196e-03, 7.644e-02, -3.266e-02, 2.654e-03, -3.667e-02, -3.045e-03)); + r += mul(s1_2, M4(1.606e-01, -5.138e-02, -6.107e-02, -9.435e-02, 1.106e-01, 3.374e-02, 4.798e-02, -1.686e-01, -9.666e-02, 1.708e-01, 1.023e-01, 8.971e-02, -4.152e-03, 3.151e-02, -8.008e-02, -8.659e-04)); + r += mul(s1_3, M4(2.334e-01, 1.165e-01, 1.431e-01, -6.154e-02, 2.323e-01, 5.190e-02, -3.558e-01, 5.900e-03, -1.352e-01, -6.950e-02, -1.556e-01, -8.683e-02, 2.186e-03, -3.382e-02, 9.595e-02, -1.367e-02)); + r += mul(s1_4, M4(-2.079e-01, 2.013e-01, -1.003e-01, 5.965e-01, 7.281e-01, -2.555e-02, -1.042e-01, 5.471e-01, -8.816e-03, -6.272e-01, 2.632e-01, -7.918e-03, -9.514e-02, -1.219e-01, -1.023e-01, -9.444e-02)); + r += mul(s1_5, M4(-2.075e-01, -2.995e-02, -3.489e-02, 1.102e-01, -2.727e-01, -5.656e-02, 1.026e-01, -2.174e-01, 5.193e-02, 9.603e-03, -8.547e-02, 2.008e-01, 3.839e-02, 2.151e-02, -2.244e-02, 7.860e-03)); + r += mul(s1_6, M4(-2.778e-01, -3.516e-02, 1.650e-01, -7.376e-02, -8.045e-02, -9.546e-02, -3.107e-02, -6.217e-02, 1.269e-01, 1.594e-01, 4.540e-03, 3.225e-03, -4.082e-02, 6.364e-03, -6.184e-02, 3.507e-02)); + r += mul(s1_7, M4(-1.143e-01, 1.010e-01, -5.168e-02, 1.587e-01, -1.409e-01, -7.917e-03, -8.995e-02, 1.142e-01, -1.148e-01, -5.357e-02, 7.352e-02, -1.038e-01, 1.130e-02, -5.021e-02, 7.683e-02, -4.051e-02)); + r += mul(s1_8, M4(3.006e-02, 1.525e-01, -1.064e-01, 9.476e-02, -1.579e-01, 1.593e-01, -1.578e-01, -1.912e-02, 5.637e-02, -9.418e-03, -5.185e-03, 4.674e-02, 1.222e-01, -7.692e-02, -7.098e-02, 2.074e-02)); + r += mul(s2_0, M4(-1.652e-02, 2.598e-02, -1.013e-01, 6.189e-02, 8.546e-03, 4.699e-02, -2.344e-03, 1.277e-02, 5.113e-02, -1.595e-02, 1.910e-01, -7.417e-02, 3.643e-02, 4.172e-02, -1.039e-01, -6.160e-02)); + r += mul(s2_1, M4(-3.874e-02, -3.482e-03, 7.300e-03, -1.355e-02, 2.448e-01, 4.666e-02, -9.449e-02, 2.339e-02, -1.203e-01, 3.261e-02, -3.038e-02, 9.335e-02, 4.708e-02, 9.716e-02, -4.104e-01, 1.606e-02)); + r += mul(s2_2, M4(2.614e-02, -7.252e-02, 9.566e-03, 3.402e-02, 6.985e-03, -2.278e-02, -1.924e-01, 5.004e-03, -2.337e-02, 3.580e-02, -4.597e-02, 2.932e-02, -1.673e-01, -8.288e-03, 2.899e-02, 3.634e-02)); + r += mul(s2_3, M4(3.155e-01, 9.085e-02, 4.781e-02, -6.959e-02, 3.001e-02, -2.332e-02, -1.132e-01, 1.024e-01, 4.363e-02, -4.525e-02, 6.052e-02, -2.970e-01, -2.196e-01, 2.141e-02, -3.035e-01, 9.429e-02)); + r += mul(s2_4, M4(-6.346e-02, 2.127e-01, -4.391e-02, 2.319e-01, -2.695e-01, -7.714e-03, -1.659e-01, -3.199e-01, 1.499e-01, -3.990e-01, 3.229e-02, -4.619e-01, 1.185e-01, 4.742e-02, 7.026e-01, -5.809e-02)); + r += mul(s2_5, M4(-7.044e-02, 8.127e-02, 2.569e-01, -8.552e-02, -1.192e-01, 9.709e-02, -3.134e-01, 1.632e-01, 2.647e-01, -5.529e-02, 2.336e-01, -1.118e-01, 4.060e-02, 5.644e-02, -7.560e-02, 1.106e-01)); + r += mul(s2_6, M4(-7.387e-02, -2.698e-03, -5.179e-02, 1.077e-03, -1.361e-01, -6.428e-02, -5.398e-02, -5.008e-03, -1.555e-01, 8.817e-02, 2.712e-02, -1.140e-01, 1.123e-01, 2.629e-01, 8.762e-04, 1.070e-01)); + r += mul(s2_7, M4(4.489e-02, 1.490e-01, 1.403e-01, 5.900e-02, -1.535e-02, 9.715e-02, -1.662e-01, 1.544e-02, -2.607e-01, 1.782e-01, 5.149e-02, -1.530e-01, 4.158e-02, -1.167e-01, 2.508e-01, -3.826e-02)); + r += mul(s2_8, M4(1.833e-02, -6.535e-02, -9.799e-04, 3.795e-02, -1.240e-01, 5.356e-02, -1.377e-01, 2.680e-02, -5.193e-02, 1.129e-01, -6.200e-02, 3.753e-02, -1.182e-01, -8.965e-02, -4.491e-02, 2.043e-02)); + r += mul(s3_0, M4(-1.485e-01, -4.827e-02, -6.587e-02, 4.206e-03, 1.429e-03, -7.075e-02, 1.010e-01, -1.434e-02, 1.431e-01, 9.461e-03, 1.974e-02, 6.288e-03, -1.066e-01, 3.071e-02, -5.972e-02, 6.134e-02)); + r += mul(s3_1, M4(1.832e-01, 9.780e-02, 6.492e-03, 7.153e-02, 4.468e-02, 4.766e-02, -2.764e-02, 1.125e-01, -6.547e-02, 4.916e-02, -2.809e-01, 2.147e-02, -4.627e-05, -1.787e-02, 1.779e-01, -7.133e-02)); + r += mul(s3_2, M4(9.684e-02, -1.149e-01, -7.433e-02, -3.439e-02, -9.873e-02, 6.903e-02, -5.451e-02, 1.204e-01, 2.747e-03, 6.107e-02, -1.211e-02, 1.021e-02, -1.020e-01, -2.111e-02, -3.111e-02, 7.253e-02)); + r += mul(s3_3, M4(8.451e-02, 1.777e-01, -6.733e-02, -3.111e-02, 5.124e-02, 6.421e-02, 2.028e-01, 3.174e-03, 5.908e-02, 3.863e-02, -1.465e-02, -3.614e-02, -2.398e-01, -1.425e-01, -1.372e-01, -5.310e-02)); + r += mul(s3_4, M4(-4.740e-02, 3.190e-01, -3.018e-01, 2.133e-01, -6.713e-02, -1.594e-01, -2.779e-01, -2.978e-01, 2.122e-01, -1.166e-01, -4.420e-01, -3.385e-01, -1.828e-01, -2.161e-01, 2.861e-01, 4.141e-02)); + r += mul(s3_5, M4(-1.008e-01, 1.219e-01, 1.655e-01, -7.892e-02, 1.575e-01, -1.729e-01, -3.729e-01, 2.347e-01, 1.649e-01, -8.625e-02, 1.831e-01, -1.423e-01, -2.275e-03, 1.461e-01, -6.245e-02, -9.654e-02)); + r += mul(s3_6, M4(4.563e-02, 1.920e-01, 1.096e-01, 1.130e-02, -4.992e-02, -2.560e-02, 9.352e-02, 4.260e-02, -1.082e-01, -1.228e-02, 4.508e-02, -5.029e-02, 2.940e-01, 7.883e-02, -1.268e-01, 9.003e-02)); + r += mul(s3_7, M4(-1.140e-01, 2.337e-01, 6.229e-02, 3.967e-02, -1.837e-02, 1.296e-01, -1.911e-01, -4.436e-02, -5.754e-02, 2.124e-01, -2.095e-02, -3.752e-02, 1.007e-01, -1.105e-01, 2.174e-01, 1.540e-02)); + r += mul(s3_8, M4(-5.357e-02, -1.439e-02, 7.558e-02, -2.317e-02, -1.318e-01, 2.876e-01, -1.304e-01, 6.115e-02, 5.664e-03, -1.197e-03, 3.258e-02, 2.902e-02, -5.115e-02, -1.880e-01, -2.181e-02, -9.175e-02)); + r += V4(-6.316e-03, -5.988e-03, -9.405e-03, -2.136e-03); + return r; +} + +void Pass5(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = Rmp8x8(tid.x) + blockStart; + uint2 size = GetInputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = (gxy + 0.5) * pt; + + V4 s0_0 = l0(-1.0, -1.0); + V4 s0_1 = l0(0.0, -1.0); + V4 s0_2 = l0(1.0, -1.0); + V4 s0_3 = l0(-1.0, 0.0); + V4 s0_4 = l0(0.0, 0.0); + V4 s0_5 = l0(1.0, 0.0); + V4 s0_6 = l0(-1.0, 1.0); + V4 s0_7 = l0(0.0, 1.0); + V4 s0_8 = l0(1.0, 1.0); + V4 s1_0 = -max(-s0_0, 0.0); + V4 s1_1 = -max(-s0_1, 0.0); + V4 s1_2 = -max(-s0_2, 0.0); + V4 s1_3 = -max(-s0_3, 0.0); + V4 s1_4 = -max(-s0_4, 0.0); + V4 s1_5 = -max(-s0_5, 0.0); + V4 s1_6 = -max(-s0_6, 0.0); + V4 s1_7 = -max(-s0_7, 0.0); + V4 s1_8 = -max(-s0_8, 0.0); + s0_0 = max(s0_0, 0.0); + s0_1 = max(s0_1, 0.0); + s0_2 = max(s0_2, 0.0); + s0_3 = max(s0_3, 0.0); + s0_4 = max(s0_4, 0.0); + s0_5 = max(s0_5, 0.0); + s0_6 = max(s0_6, 0.0); + s0_7 = max(s0_7, 0.0); + s0_8 = max(s0_8, 0.0); + + V4 s2_0 = l1(-1.0, -1.0); + V4 s2_1 = l1(0.0, -1.0); + V4 s2_2 = l1(1.0, -1.0); + V4 s2_3 = l1(-1.0, 0.0); + V4 s2_4 = l1(0.0, 0.0); + V4 s2_5 = l1(1.0, 0.0); + V4 s2_6 = l1(-1.0, 1.0); + V4 s2_7 = l1(0.0, 1.0); + V4 s2_8 = l1(1.0, 1.0); + V4 s3_0 = -max(-s2_0, 0.0); + V4 s3_1 = -max(-s2_1, 0.0); + V4 s3_2 = -max(-s2_2, 0.0); + V4 s3_3 = -max(-s2_3, 0.0); + V4 s3_4 = -max(-s2_4, 0.0); + V4 s3_5 = -max(-s2_5, 0.0); + V4 s3_6 = -max(-s2_6, 0.0); + V4 s3_7 = -max(-s2_7, 0.0); + V4 s3_8 = -max(-s2_8, 0.0); + s2_0 = max(s2_0, 0.0); + s2_1 = max(s2_1, 0.0); + s2_2 = max(s2_2, 0.0); + s2_3 = max(s2_3, 0.0); + s2_4 = max(s2_4, 0.0); + s2_5 = max(s2_5, 0.0); + s2_6 = max(s2_6, 0.0); + s2_7 = max(s2_7, 0.0); + s2_8 = max(s2_8, 0.0); + + t0[gxy] = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8); + t1[gxy] = f1(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8); +} + +//!PASS 6 +//!DESC conv5 +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 +//!IN t0, t1 +//!OUT t2, t3 + +#define l0(x, y) V4(O(t0, float2(x, y))) +#define l1(x, y) V4(O(t1, float2(x, y))) + +V4 f0(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-8.608e-02, 2.569e-01, 1.222e-02, -2.428e-01, 2.819e-02, -2.222e-01, 8.316e-02, 1.236e-01, 7.319e-02, -2.436e-02, -3.285e-02, -4.959e-02, -1.564e-02, -4.520e-03, -2.403e-02, 1.644e-02)); + r += mul(s0_1, M4(8.699e-02, -1.096e-01, 1.068e-01, -3.740e-01, -1.080e-01, -1.857e-02, 4.223e-02, -3.891e-03, -8.229e-02, -1.946e-01, -1.551e-03, -1.387e-01, -5.238e-02, 2.071e-02, 2.358e-02, 5.090e-02)); + r += mul(s0_2, M4(9.500e-02, 1.498e-02, 3.952e-02, -2.201e-01, -5.773e-03, -4.568e-02, -1.513e-02, 1.650e-02, -3.844e-02, -1.894e-02, -6.321e-03, -1.478e-01, 6.779e-04, -1.872e-02, 3.647e-02, -1.142e-01)); + r += mul(s0_3, M4(1.158e-01, 1.180e-01, -7.400e-02, -1.253e-01, -3.329e-02, -9.601e-02, -1.655e-01, 1.764e-01, 4.556e-02, -1.037e-01, 1.404e-02, 4.284e-02, 1.355e-02, -4.159e-02, 1.028e-02, 5.967e-02)); + r += mul(s0_4, M4(3.790e-01, -1.771e-01, 4.289e-01, 3.968e-01, -6.453e-01, -3.229e-02, 6.839e-02, 4.000e-01, 7.875e-02, 3.322e-01, -9.510e-02, 6.532e-02, -2.647e-01, -1.873e-01, 1.182e-01, 1.928e-01)); + r += mul(s0_5, M4(1.861e-02, 4.475e-02, -4.634e-02, 4.190e-02, 7.957e-02, -1.773e-01, 7.434e-02, -3.605e-02, -1.383e-02, 3.314e-02, 7.457e-02, -3.542e-02, -1.410e-01, 1.218e-02, -1.978e-01, 1.382e-01)); + r += mul(s0_6, M4(-1.159e-02, 7.661e-02, -1.156e-02, 4.680e-02, 5.359e-02, -1.324e-01, -1.436e-01, -9.472e-02, -7.470e-02, -1.685e-01, 4.434e-03, -2.265e-02, -1.045e-01, 1.346e-02, -4.403e-02, 2.895e-02)); + r += mul(s0_7, M4(-8.194e-02, 2.863e-03, 2.583e-02, -6.814e-02, 4.180e-02, 1.948e-02, -5.094e-02, -8.335e-02, 1.078e-02, -9.731e-02, -7.838e-02, -7.272e-02, -3.306e-03, 8.672e-02, -1.243e-01, -1.003e-01)); + r += mul(s0_8, M4(-7.363e-02, 1.894e-02, -4.111e-02, 9.806e-03, 4.223e-02, -5.568e-02, 7.757e-02, 5.330e-02, 2.111e-02, -3.335e-02, 7.667e-03, -2.582e-02, 1.289e-01, -5.085e-02, 1.158e-01, 3.725e-02)); + r += mul(s1_0, M4(1.335e-02, 1.003e-01, 6.199e-02, 3.112e-03, -8.718e-02, 2.489e-02, -2.486e-02, 1.969e-01, 6.352e-02, -2.251e-01, 9.885e-03, -1.690e-01, 3.148e-02, -2.993e-02, -1.857e-03, -1.052e-01)); + r += mul(s1_1, M4(-8.664e-03, -1.227e-01, -2.031e-02, -2.300e-01, 5.105e-02, 1.422e-02, 1.043e-01, -4.809e-02, -1.366e-01, 1.288e-01, -3.921e-01, -1.088e-01, -5.613e-03, 7.480e-02, 6.498e-02, 2.244e-02)); + r += mul(s1_2, M4(1.231e-01, 4.020e-02, 4.395e-03, -1.853e-01, 4.126e-02, 3.574e-02, 3.323e-04, -9.040e-02, -2.706e-01, 5.809e-02, -2.337e-01, -3.410e-02, 6.976e-03, -6.686e-02, 1.172e-01, -5.432e-02)); + r += mul(s1_3, M4(-2.134e-01, -1.519e-01, 2.647e-02, -8.512e-02, -1.382e-01, 1.372e-01, -2.530e-02, -4.801e-02, 7.539e-02, -8.842e-02, -5.976e-02, 1.708e-01, 2.436e-01, -1.239e-01, 9.767e-02, 2.307e-02)); + r += mul(s1_4, M4(-2.123e-01, 2.003e-02, 2.607e-01, 5.098e-01, 2.415e-01, -4.337e-01, 2.104e-01, 4.542e-02, -5.372e-01, 4.096e-01, -1.995e-01, 1.650e-01, -4.643e-01, 4.214e-01, -2.897e-01, 3.722e-01)); + r += mul(s1_5, M4(4.852e-02, -4.823e-02, -9.304e-03, 6.935e-02, 3.634e-02, 4.152e-02, -2.441e-04, 8.184e-02, -3.163e-01, -1.569e-01, -1.265e-01, 2.367e-01, -2.178e-01, 1.617e-02, -3.774e-01, 5.316e-02)); + r += mul(s1_6, M4(-6.727e-03, 1.153e-01, 1.338e-02, 1.193e-01, 1.504e-01, 1.519e-01, 9.715e-03, 9.078e-03, -8.618e-02, -1.465e-01, -2.277e-02, -4.322e-03, -2.011e-01, -1.293e-01, 1.793e-02, 2.710e-03)); + r += mul(s1_7, M4(-9.969e-03, 2.211e-01, -4.299e-03, -2.202e-02, -4.619e-02, -8.966e-04, 9.219e-02, 1.181e-01, -4.056e-01, -1.222e-01, -3.333e-01, -2.313e-01, -5.614e-02, -1.141e-01, -1.407e-01, -1.764e-01)); + r += mul(s1_8, M4(-9.313e-04, 1.319e-02, 7.414e-02, 6.145e-02, -6.932e-02, 3.310e-02, -6.980e-02, -2.850e-02, -1.856e-01, -1.571e-01, -1.655e-01, -1.211e-01, 4.781e-02, -1.536e-01, 1.794e-01, 6.533e-03)); + r += mul(s2_0, M4(2.814e-02, 6.999e-02, 1.721e-02, -6.695e-02, 7.155e-02, 1.598e-01, 4.115e-02, -2.464e-02, -6.175e-03, 5.353e-02, -4.210e-02, -6.383e-02, -5.254e-02, 3.658e-02, -6.324e-02, 4.018e-02)); + r += mul(s2_1, M4(-7.643e-02, -8.591e-02, -1.327e-01, 1.490e-01, -4.778e-02, -1.665e-03, 3.515e-02, 4.224e-02, 2.654e-02, -3.990e-03, 1.914e-02, -3.699e-02, -1.815e-01, 6.398e-02, -9.678e-02, -1.639e-01)); + r += mul(s2_2, M4(3.666e-02, 1.137e-02, -3.516e-03, -1.270e-01, -5.116e-02, -3.455e-02, -1.130e-02, -2.826e-02, -2.717e-02, 1.390e-02, 1.004e-02, 6.270e-02, 5.819e-03, 4.421e-02, 4.943e-02, -2.765e-01)); + r += mul(s2_3, M4(-1.111e-01, 2.642e-03, 2.653e-02, -1.920e-02, 1.284e-01, 6.685e-02, -6.475e-02, -2.750e-02, -8.811e-02, -3.021e-01, 1.387e-01, -8.707e-02, -9.734e-02, 3.683e-01, -6.483e-02, 1.673e-02)); + r += mul(s2_4, M4(-8.755e-02, -2.692e-01, -1.860e-01, 8.398e-02, -2.588e-01, 5.441e-01, -1.563e-02, 2.783e-02, 7.085e-02, 1.881e-01, 4.063e-02, -1.307e-01, 3.826e-01, 3.605e-02, 1.551e-01, -3.976e-02)); + r += mul(s2_5, M4(1.761e-01, 9.465e-02, 1.023e-01, 1.684e-01, 5.145e-02, -9.373e-02, 1.927e-01, -2.001e-01, -8.632e-02, 7.821e-02, 3.875e-02, -3.849e-03, -9.294e-02, 1.570e-01, -9.343e-02, 1.712e-02)); + r += mul(s2_6, M4(-6.383e-02, -5.647e-03, -2.071e-02, 3.716e-02, 7.636e-02, 2.504e-02, 4.806e-02, -1.517e-02, 8.862e-02, 8.993e-02, 2.257e-02, -1.228e-02, 1.534e-01, -1.728e-02, -3.967e-02, -3.449e-02)); + r += mul(s2_7, M4(-2.106e-01, -1.526e-01, 6.760e-02, -1.012e-02, 2.699e-02, 3.012e-03, -3.014e-02, -1.204e-02, -7.079e-03, -1.713e-01, 3.694e-02, 6.143e-02, -5.451e-02, -1.359e-01, -9.926e-02, -1.442e-01)); + r += mul(s2_8, M4(-9.338e-02, 1.171e-01, 9.731e-03, 7.911e-02, 2.203e-02, 5.235e-03, 3.585e-03, -2.420e-02, -3.234e-02, 1.790e-02, -6.909e-02, -2.004e-02, -1.564e-01, 1.182e-01, -1.297e-01, -5.639e-03)); + r += mul(s3_0, M4(-3.005e-02, -6.725e-02, 1.321e-02, 4.847e-03, 1.036e-01, 2.312e-01, -1.014e-01, -1.152e-01, 9.548e-02, -1.285e-01, 2.631e-02, 1.150e-01, -7.107e-02, -1.159e-01, -8.623e-02, 3.015e-03)); + r += mul(s3_1, M4(-1.199e-01, 1.896e-02, -1.750e-01, 5.793e-02, -1.067e-01, 3.761e-01, 4.887e-02, -3.395e-01, 6.265e-02, 3.455e-02, 5.806e-02, 1.456e-01, -6.617e-02, -1.070e-01, 2.967e-03, 8.557e-03)); + r += mul(s3_2, M4(-1.013e-01, -1.106e-02, -3.594e-02, 2.021e-02, 4.372e-02, -1.061e-01, 2.014e-02, -1.715e-01, -4.093e-02, -2.106e-02, -6.451e-02, 1.431e-01, 5.745e-02, -8.813e-03, 1.078e-02, -1.050e-01)); + r += mul(s3_3, M4(5.771e-03, 2.398e-01, 5.475e-03, -2.666e-02, 2.469e-01, 2.725e-01, -1.278e-01, 5.428e-02, -9.521e-02, -2.876e-01, 8.087e-02, -8.050e-02, -8.112e-02, -3.085e-02, -4.978e-02, 3.844e-02)); + r += mul(s3_4, M4(-2.283e-01, 1.275e-01, -1.267e-01, -1.878e-02, 8.566e-02, 7.676e-01, 4.032e-02, 5.152e-01, -3.872e-02, 5.059e-01, 2.330e-01, 1.399e-02, 5.226e-01, 3.846e-02, 5.762e-01, -1.439e-01)); + r += mul(s3_5, M4(-6.461e-04, 2.103e-01, 1.016e-01, 1.416e-01, 1.046e-01, 3.651e-03, 8.893e-02, -8.801e-02, 7.038e-02, -7.385e-02, 1.304e-01, -3.234e-02, -3.917e-02, -4.112e-02, 3.192e-02, -1.320e-01)); + r += mul(s3_6, M4(-5.442e-02, 1.120e-01, 1.744e-02, -4.865e-02, -1.390e-01, -2.964e-01, -7.290e-02, -1.213e-01, 9.644e-02, -8.644e-02, 4.706e-02, -1.755e-02, 6.284e-03, -7.466e-02, 5.034e-02, -1.122e-01)); + r += mul(s3_7, M4(-1.130e-01, -7.809e-02, 6.065e-03, 2.930e-03, -1.685e-01, -6.866e-02, -1.093e-01, -1.189e-01, 5.726e-02, -1.833e-01, 1.726e-02, -3.833e-02, -1.400e-01, -3.362e-01, 3.635e-02, -3.936e-02)); + r += mul(s3_8, M4(-1.190e-01, 7.088e-02, -6.045e-02, -6.491e-02, -8.954e-02, -7.689e-02, -6.903e-02, -1.069e-01, 6.519e-02, -7.405e-02, -6.924e-03, -4.911e-02, -3.081e-02, 6.495e-03, -9.590e-02, 6.956e-02)); + r += V4(-5.867e-03, 8.204e-04, 8.838e-06, -4.451e-03); + return r; +} + +V4 f1(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-1.613e-01, -4.226e-02, -1.004e-01, 2.744e-02, -5.920e-02, 2.726e-02, 5.529e-02, 1.777e-02, -2.057e-01, -4.471e-02, 4.853e-03, 1.897e-02, 6.077e-02, -8.693e-02, 2.211e-02, 2.221e-02)); + r += mul(s0_1, M4(-1.790e-02, -5.945e-02, 2.220e-01, 2.415e-02, -1.960e-02, 4.714e-02, -1.908e-01, 4.480e-02, 2.509e-01, -1.789e-02, 1.996e-01, -5.241e-02, -6.129e-02, 2.228e-02, -9.568e-03, 5.522e-02)); + r += mul(s0_2, M4(6.855e-02, -1.714e-01, 3.252e-03, -7.609e-02, -6.607e-03, -1.250e-01, -3.310e-02, 1.991e-02, -3.235e-02, -3.547e-02, -6.805e-03, 5.213e-02, 1.799e-03, -9.400e-02, -4.560e-02, -4.234e-02)); + r += mul(s0_3, M4(-3.910e-01, -1.046e-01, 2.434e-01, 7.156e-02, 5.429e-02, -6.191e-02, -1.441e-01, 2.060e-01, -1.385e-01, 1.037e-01, -4.380e-02, -8.286e-02, 1.389e-01, -1.694e-02, -6.093e-02, -5.890e-02)); + r += mul(s0_4, M4(-2.968e-02, -1.900e-01, -1.226e-01, -9.187e-02, -4.346e-01, 6.699e-01, 2.262e-01, 4.149e-01, -3.449e-01, -1.810e-01, 4.280e-02, 1.218e-01, 6.111e-02, -1.049e-01, 1.369e-01, 6.181e-02)); + r += mul(s0_5, M4(-9.205e-03, 4.332e-02, -1.318e-01, 7.155e-02, 1.343e-01, -9.519e-02, 1.417e-01, 1.615e-01, -1.237e-02, 1.310e-01, 6.284e-02, 4.459e-02, -8.180e-02, -2.356e-01, -7.968e-02, -1.569e-01)); + r += mul(s0_6, M4(1.620e-02, -5.617e-02, -5.471e-02, -1.506e-02, -1.750e-02, 2.921e-02, 2.788e-02, -3.191e-02, 6.364e-02, 3.667e-02, -4.515e-02, -2.747e-02, -4.842e-02, 2.758e-02, -9.440e-02, -2.075e-02)); + r += mul(s0_7, M4(8.817e-02, -5.475e-02, -2.476e-02, 5.598e-03, -3.989e-02, -7.869e-02, 2.001e-01, 3.282e-02, -2.619e-02, -8.282e-03, 1.138e-01, 4.952e-02, -4.746e-02, 9.597e-02, 1.639e-01, 9.382e-02)); + r += mul(s0_8, M4(-1.727e-02, -3.994e-02, 5.955e-03, 1.735e-02, 3.433e-02, 2.114e-01, 3.957e-02, -3.448e-03, 4.624e-02, 4.745e-02, 3.676e-02, 2.724e-02, 3.361e-02, -2.538e-03, 2.072e-02, -4.143e-02)); + r += mul(s1_0, M4(6.291e-02, 3.066e-02, -1.528e-01, -1.213e-01, -1.881e-01, 1.398e-01, 1.107e-02, 2.913e-02, -4.372e-02, -1.707e-01, -1.233e-01, 1.214e-02, -5.108e-02, -8.090e-02, 2.695e-03, -4.899e-03)); + r += mul(s1_1, M4(-1.290e-01, -3.723e-02, 5.548e-02, -5.796e-02, 7.544e-02, 2.218e-02, 7.075e-02, 8.778e-03, 1.830e-01, -1.635e-01, -1.380e-02, 1.337e-01, -1.343e-01, -7.167e-02, 8.180e-02, 3.701e-02)); + r += mul(s1_2, M4(3.819e-02, -2.796e-01, 7.484e-02, -6.969e-02, 3.958e-03, -3.990e-02, -4.936e-03, -1.871e-02, -8.227e-02, -2.647e-01, -5.353e-02, 2.802e-01, 5.236e-02, -1.095e-01, 3.037e-02, 1.371e-02)); + r += mul(s1_3, M4(-7.472e-02, 7.277e-02, -9.259e-02, -5.970e-02, 1.904e-01, -7.408e-02, 9.517e-03, 5.773e-02, -2.063e-01, 7.309e-02, -1.632e-01, 9.394e-02, 6.461e-02, -4.990e-02, -4.256e-02, -1.354e-01)); + r += mul(s1_4, M4(-1.989e-02, -5.893e-02, -2.870e-01, 3.377e-02, -5.899e-02, -1.292e-01, 2.142e-01, 6.521e-02, -3.446e-01, 7.705e-02, -1.953e-01, 3.493e-01, 8.550e-01, -2.645e-01, -5.125e-02, 3.279e-01)); + r += mul(s1_5, M4(-1.666e-02, 4.650e-03, -1.421e-01, 8.864e-02, 8.253e-03, -3.432e-02, -8.438e-02, -1.618e-02, -7.692e-02, 2.310e-01, 1.882e-01, 2.958e-01, -1.735e-01, -4.556e-01, -1.155e-01, -3.658e-01)); + r += mul(s1_6, M4(-9.666e-02, 1.958e-02, -3.755e-02, 1.890e-02, -1.861e-01, -2.990e-02, 5.561e-02, -2.582e-02, 7.456e-02, 9.553e-02, -1.765e-01, -1.025e-01, -6.244e-02, 1.110e-01, -1.733e-01, -1.265e-01)); + r += mul(s1_7, M4(-3.723e-03, -3.252e-02, -3.220e-02, 7.520e-02, 1.130e-01, 6.318e-02, -2.606e-01, -6.368e-02, 1.609e-01, 6.315e-02, -4.849e-02, 8.580e-02, -7.162e-02, -1.825e-01, 3.036e-01, 3.148e-02)); + r += mul(s1_8, M4(-2.751e-02, -1.125e-02, -4.807e-02, -3.768e-02, -3.989e-02, -6.228e-02, -2.268e-02, -5.394e-03, 3.481e-02, -5.196e-03, 4.520e-02, 2.328e-01, -8.159e-03, -1.147e-01, 1.142e-01, 2.181e-02)); + r += mul(s2_0, M4(-7.023e-03, -1.082e-01, -1.112e-01, 8.964e-03, 1.738e-02, 6.085e-03, 1.381e-01, -1.118e-01, -8.075e-03, -2.861e-02, 2.852e-02, 3.504e-02, 5.891e-02, 2.802e-02, -7.550e-02, 2.339e-02)); + r += mul(s2_1, M4(-6.810e-04, 1.146e-01, -5.968e-03, -6.577e-02, 2.726e-01, 1.593e-01, 7.966e-02, 2.335e-02, -2.240e-02, -1.089e-01, -1.357e-02, -1.583e-02, 4.088e-02, -1.074e-01, -5.411e-02, 3.467e-01)); + r += mul(s2_2, M4(5.432e-02, -8.088e-02, 4.341e-02, -1.622e-03, -1.120e-01, -1.209e-01, -9.585e-02, -2.620e-02, 9.254e-03, -1.146e-02, -1.566e-02, 3.510e-02, 8.974e-02, -1.070e-01, -3.833e-03, 8.178e-02)); + r += mul(s2_3, M4(-4.635e-02, -1.177e-02, -1.033e-01, 1.648e-02, -1.173e-01, 6.739e-02, 1.362e-01, -6.356e-02, 2.983e-02, 2.365e-02, -5.309e-02, -3.019e-02, 8.626e-02, 3.954e-02, 1.349e-01, 1.739e-01)); + r += mul(s2_4, M4(-6.323e-02, -1.185e-02, 7.697e-02, 1.531e-01, 1.064e-02, -2.665e-01, 4.370e-01, -2.230e-02, 1.482e-02, 4.515e-02, -5.242e-02, 2.613e-02, 4.812e-01, -2.269e-02, 1.252e-02, 3.916e-01)); + r += mul(s2_5, M4(8.870e-02, 2.979e-01, -1.148e-01, 3.591e-02, 8.996e-02, -1.399e-02, 4.609e-02, -7.584e-02, 1.080e-02, 1.990e-02, -1.944e-02, 2.932e-02, -9.051e-02, -2.288e-01, -3.643e-01, -1.566e-01)); + r += mul(s2_6, M4(-4.092e-02, -1.432e-02, 5.140e-02, 7.572e-02, 8.516e-02, 4.077e-03, 2.068e-03, -5.832e-02, -6.287e-03, 2.525e-02, 2.263e-02, -4.400e-03, -4.119e-02, -6.518e-02, 1.449e-01, 3.534e-02)); + r += mul(s2_7, M4(-2.346e-03, -1.100e-02, -1.841e-01, -4.504e-02, 4.907e-02, -5.487e-03, -1.495e-02, -1.159e-02, 6.396e-02, 1.176e-01, -1.291e-01, -1.254e-01, 2.271e-01, 4.009e-02, 7.242e-02, -1.274e-01)); + r += mul(s2_8, M4(-4.918e-02, -1.015e-02, -5.141e-02, 4.864e-02, -1.127e-01, -6.540e-02, 1.881e-02, -8.765e-03, -2.301e-02, -3.138e-02, -2.005e-02, -9.395e-05, 1.087e-02, -7.551e-02, 1.812e-02, -5.127e-02)); + r += mul(s3_0, M4(2.168e-01, -5.872e-02, -6.033e-02, 2.508e-03, -1.379e-01, -5.535e-02, 5.969e-02, 5.551e-02, 8.818e-02, 5.425e-02, 7.221e-02, -6.894e-02, -1.672e-02, 1.812e-02, -3.621e-02, 1.131e-02)); + r += mul(s3_1, M4(4.283e-02, -1.942e-04, -1.753e-01, -1.483e-02, 5.554e-02, 4.928e-02, 9.082e-02, 4.843e-02, -6.584e-02, -1.871e-01, -9.180e-02, -8.086e-02, 7.754e-02, -1.453e-02, 1.538e-01, 1.044e-01)); + r += mul(s3_2, M4(3.916e-02, 2.089e-02, -9.051e-02, 3.198e-02, -1.236e-02, -6.463e-02, 1.668e-01, 9.283e-02, 1.492e-02, 1.011e-01, 4.945e-02, 1.140e-01, 7.369e-02, -5.768e-02, 5.828e-02, 4.817e-02)); + r += mul(s3_3, M4(-1.767e-02, 1.883e-02, -1.172e-01, -4.119e-02, -2.420e-01, -7.944e-02, 2.076e-01, 1.885e-01, -2.633e-02, 9.848e-02, -7.233e-02, -1.787e-01, 5.510e-02, -6.444e-02, 1.024e-01, 8.318e-02)); + r += mul(s3_4, M4(-1.234e-02, 8.177e-02, -3.822e-02, 9.576e-02, -1.588e-01, 1.682e-01, -1.860e-01, -3.175e-02, -2.992e-01, -2.866e-02, 5.652e-02, -4.088e-02, 3.770e-01, -6.704e-02, 3.433e-01, 1.025e-01)); + r += mul(s3_5, M4(1.490e-01, 3.375e-01, -1.473e-01, 1.287e-01, -7.768e-03, 1.830e-01, -5.415e-02, 3.301e-02, 6.827e-02, 2.061e-01, 1.572e-01, 1.906e-01, -2.636e-02, -1.488e-01, 4.210e-02, -9.244e-02)); + r += mul(s3_6, M4(1.140e-03, -3.620e-02, -9.971e-03, 5.804e-02, 1.823e-01, -1.234e-02, 4.516e-02, -2.637e-02, -3.658e-02, -1.711e-02, 3.558e-02, 2.008e-02, 2.854e-02, -5.525e-02, 5.287e-02, -5.876e-02)); + r += mul(s3_7, M4(6.883e-02, 6.152e-03, -8.080e-02, 4.011e-02, 1.149e-01, -9.289e-02, 1.060e-01, 4.384e-02, -7.819e-02, 1.448e-02, 1.486e-01, -1.965e-02, 4.570e-02, -2.967e-02, -1.034e-01, -1.041e-01)); + r += mul(s3_8, M4(-3.056e-03, 2.109e-02, 2.237e-02, 9.022e-02, -5.609e-02, -8.009e-03, 8.356e-02, 3.819e-02, -1.670e-02, 4.753e-02, 9.900e-02, 2.052e-02, -7.434e-02, 1.339e-02, -1.596e-02, 3.147e-03)); + r += V4(-1.543e-03, -4.932e-03, 6.376e-03, 2.635e-03); + return r; +} + +void Pass6(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = Rmp8x8(tid.x) + blockStart; + uint2 size = GetInputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = (gxy + 0.5) * pt; + + V4 s0_0 = l0(-1.0, -1.0); + V4 s0_1 = l0(0.0, -1.0); + V4 s0_2 = l0(1.0, -1.0); + V4 s0_3 = l0(-1.0, 0.0); + V4 s0_4 = l0(0.0, 0.0); + V4 s0_5 = l0(1.0, 0.0); + V4 s0_6 = l0(-1.0, 1.0); + V4 s0_7 = l0(0.0, 1.0); + V4 s0_8 = l0(1.0, 1.0); + V4 s1_0 = -max(-s0_0, 0.0); + V4 s1_1 = -max(-s0_1, 0.0); + V4 s1_2 = -max(-s0_2, 0.0); + V4 s1_3 = -max(-s0_3, 0.0); + V4 s1_4 = -max(-s0_4, 0.0); + V4 s1_5 = -max(-s0_5, 0.0); + V4 s1_6 = -max(-s0_6, 0.0); + V4 s1_7 = -max(-s0_7, 0.0); + V4 s1_8 = -max(-s0_8, 0.0); + s0_0 = max(s0_0, 0.0); + s0_1 = max(s0_1, 0.0); + s0_2 = max(s0_2, 0.0); + s0_3 = max(s0_3, 0.0); + s0_4 = max(s0_4, 0.0); + s0_5 = max(s0_5, 0.0); + s0_6 = max(s0_6, 0.0); + s0_7 = max(s0_7, 0.0); + s0_8 = max(s0_8, 0.0); + + V4 s2_0 = l1(-1.0, -1.0); + V4 s2_1 = l1(0.0, -1.0); + V4 s2_2 = l1(1.0, -1.0); + V4 s2_3 = l1(-1.0, 0.0); + V4 s2_4 = l1(0.0, 0.0); + V4 s2_5 = l1(1.0, 0.0); + V4 s2_6 = l1(-1.0, 1.0); + V4 s2_7 = l1(0.0, 1.0); + V4 s2_8 = l1(1.0, 1.0); + V4 s3_0 = -max(-s2_0, 0.0); + V4 s3_1 = -max(-s2_1, 0.0); + V4 s3_2 = -max(-s2_2, 0.0); + V4 s3_3 = -max(-s2_3, 0.0); + V4 s3_4 = -max(-s2_4, 0.0); + V4 s3_5 = -max(-s2_5, 0.0); + V4 s3_6 = -max(-s2_6, 0.0); + V4 s3_7 = -max(-s2_7, 0.0); + V4 s3_8 = -max(-s2_8, 0.0); + s2_0 = max(s2_0, 0.0); + s2_1 = max(s2_1, 0.0); + s2_2 = max(s2_2, 0.0); + s2_3 = max(s2_3, 0.0); + s2_4 = max(s2_4, 0.0); + s2_5 = max(s2_5, 0.0); + s2_6 = max(s2_6, 0.0); + s2_7 = max(s2_7, 0.0); + s2_8 = max(s2_8, 0.0); + + t2[gxy] = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8); + t3[gxy] = f1(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8); +} + +//!PASS 7 +//!DESC conv6 +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 +//!IN t2, t3 +//!OUT t0, t1 + +#define l0(x, y) V4(O(t2, float2(x, y))) +#define l1(x, y) V4(O(t3, float2(x, y))) + +V4 f0(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-2.209e-01, -5.795e-02, -8.765e-02, -2.009e-02, 6.086e-03, -7.115e-02, 8.973e-03, -1.543e-01, -1.694e-01, -5.479e-02, 4.161e-02, 1.035e-02, 1.328e-02, 5.594e-02, 1.018e-05, 2.955e-02)); + r += mul(s0_1, M4(-3.967e-02, 1.680e-01, -2.233e-02, -8.411e-02, -1.698e-02, -2.763e-02, -1.059e-01, -2.100e-01, 3.937e-02, 3.267e-02, -8.229e-02, 3.501e-02, -2.628e-03, -4.292e-02, 2.431e-02, -3.400e-02)); + r += mul(s0_2, M4(1.509e-02, -3.018e-02, 5.379e-02, -6.856e-02, 2.673e-03, -4.967e-02, 2.877e-03, -1.595e-02, -1.026e-01, -5.521e-02, 1.200e-02, -4.588e-02, 2.993e-02, -1.958e-02, -2.616e-03, -2.579e-02)); + r += mul(s0_3, M4(4.993e-02, 1.236e-01, -1.067e-02, -5.176e-01, 2.549e-01, 4.287e-02, 7.064e-02, 1.690e-01, 9.888e-02, 1.328e-02, 4.869e-02, -5.790e-02, -1.404e-01, -6.974e-03, -4.548e-02, 2.544e-01)); + r += mul(s0_4, M4(1.472e-02, 3.096e-01, -3.115e-01, 2.413e-02, -7.457e-02, -1.535e-01, -3.765e-01, 6.845e-01, 1.154e-01, -1.489e-01, -2.606e-01, 6.946e-02, 7.796e-02, 3.208e-02, -1.062e-01, 2.085e-01)); + r += mul(s0_5, M4(1.892e-02, 7.663e-02, 7.539e-02, -1.873e-02, -8.866e-02, 4.203e-02, -3.389e-01, 1.615e-01, -7.032e-02, -1.146e-01, 9.530e-02, 6.399e-02, -5.494e-02, -8.184e-02, 1.078e-01, 2.335e-02)); + r += mul(s0_6, M4(-5.239e-03, 7.910e-02, 4.204e-03, 1.566e-02, -1.073e-01, -2.478e-02, -1.678e-02, -2.501e-02, 2.174e-02, -1.456e-02, 6.321e-02, 8.639e-02, -2.920e-02, -2.341e-01, 6.144e-02, -9.660e-02)); + r += mul(s0_7, M4(-6.268e-02, 2.019e-03, -7.203e-02, 1.529e-02, 1.932e-01, 8.225e-02, 5.777e-02, -2.183e-01, -8.861e-02, -1.371e-01, 2.163e-01, 1.881e-01, -4.031e-02, -2.713e-01, 3.510e-01, 1.920e-01)); + r += mul(s0_8, M4(-3.058e-02, 1.151e-01, -3.663e-02, -8.908e-03, 6.323e-02, 1.742e-01, -1.851e-01, -9.976e-02, -2.619e-02, -2.550e-02, 5.783e-02, 1.301e-02, 4.378e-02, -1.185e-01, -2.295e-02, -5.327e-02)); + r += mul(s1_0, M4(-2.656e-02, -8.664e-02, -1.887e-02, 3.009e-02, 5.418e-02, -1.342e-02, -6.789e-03, -1.552e-02, 2.416e-02, -1.698e-03, -2.975e-02, 1.135e-01, -3.067e-02, 4.174e-02, 2.610e-02, 2.015e-02)); + r += mul(s1_1, M4(7.872e-03, -4.486e-03, 9.428e-02, -1.019e-01, -8.668e-03, 3.952e-02, -1.387e-02, 4.557e-03, -6.755e-02, -1.692e-01, 3.735e-03, 1.189e-01, -3.229e-02, 3.917e-02, -9.192e-03, 2.140e-02)); + r += mul(s1_2, M4(5.343e-02, -4.132e-02, 7.494e-02, -5.720e-02, -5.339e-03, 4.912e-02, -3.645e-03, 1.655e-02, -8.378e-03, 1.803e-02, -1.056e-02, -6.085e-03, -2.281e-02, 2.981e-02, -9.818e-04, -3.084e-02)); + r += mul(s1_3, M4(7.573e-03, 4.110e-02, 3.253e-03, -1.924e-01, 3.217e-02, -9.499e-03, 2.526e-02, 6.588e-02, 6.349e-02, -3.005e-02, -3.070e-02, 1.590e-01, 6.700e-02, 4.547e-02, 2.119e-03, 9.841e-02)); + r += mul(s1_4, M4(-1.378e-01, 8.172e-02, -7.034e-02, 2.066e-01, 5.232e-03, -7.941e-02, -1.010e-01, 1.572e-01, 1.921e-01, 9.517e-02, -9.389e-01, -4.918e-02, 1.478e-01, -3.970e-01, 2.126e-01, -1.827e-02)); + r += mul(s1_5, M4(5.501e-02, -7.455e-02, 1.262e-01, 1.406e-02, -4.925e-02, -9.561e-02, 8.075e-02, 2.132e-02, -2.483e-02, 1.129e-01, -5.470e-02, 2.870e-02, -2.324e-02, -1.364e-01, 4.599e-02, 6.126e-03)); + r += mul(s1_6, M4(3.095e-02, 1.469e-02, 3.846e-02, 4.155e-03, -8.392e-03, -3.402e-02, 4.176e-02, 6.511e-03, 6.366e-02, -6.091e-02, 8.332e-02, 1.722e-02, 1.256e-01, -9.227e-03, -4.640e-02, -2.004e-02)); + r += mul(s1_7, M4(-1.292e-02, -9.372e-02, 6.924e-02, -7.925e-03, 6.668e-03, 7.838e-03, -5.530e-02, -2.253e-03, 1.959e-01, -1.509e-01, 1.427e-01, 1.159e-01, -7.810e-02, 7.828e-02, 1.069e-01, 1.240e-01)); + r += mul(s1_8, M4(-6.521e-03, 5.130e-02, -2.057e-02, -3.995e-02, 5.384e-02, 4.676e-02, -6.988e-02, -5.235e-02, 3.864e-02, -7.028e-02, 3.601e-02, 9.088e-03, -1.106e-02, -3.942e-02, 1.250e-04, -4.433e-02)); + r += mul(s2_0, M4(2.098e-02, -2.232e-02, -1.023e-01, -2.915e-03, 6.659e-03, -8.768e-02, 1.362e-03, 1.724e-02, -2.860e-02, -1.300e-02, 1.271e-03, -7.769e-02, -1.679e-02, -9.083e-04, -5.349e-02, 2.312e-02)); + r += mul(s2_1, M4(-1.207e-01, 4.680e-03, -1.289e-02, 3.844e-02, -2.073e-02, -4.596e-02, -7.886e-02, 2.531e-02, 3.798e-02, -1.523e-02, 1.300e-01, -3.368e-02, 1.875e-02, -1.294e-02, -7.884e-02, -5.748e-02)); + r += mul(s2_2, M4(-2.657e-02, 7.694e-02, -6.276e-02, -1.069e-03, 3.325e-02, -1.413e-02, 4.789e-02, 3.326e-02, 4.902e-02, -2.639e-02, 4.732e-03, 6.768e-02, 5.051e-02, -1.277e-01, 1.042e-01, -7.689e-02)); + r += mul(s2_3, M4(1.491e-01, 2.843e-02, -6.555e-02, -1.054e-01, -1.957e-01, 2.262e-01, -5.168e-02, -2.061e-01, 3.173e-01, 6.741e-02, -2.873e-02, 2.378e-01, 2.837e-02, 5.813e-03, -2.585e-02, -5.869e-02)); + r += mul(s2_4, M4(7.518e-01, -1.003e-01, 7.786e-02, -4.277e-01, -7.067e-02, 6.606e-01, -2.301e-01, -1.439e-02, 1.334e-01, -1.780e-01, 7.624e-03, 2.551e-01, -4.422e-01, -3.284e-02, -1.636e-01, 2.846e-01)); + r += mul(s2_5, M4(6.291e-02, -3.015e-01, 1.031e-01, 1.837e-02, -5.147e-02, 1.049e-01, -1.665e-01, -3.407e-02, -1.383e-01, -1.599e-01, 9.878e-03, 5.695e-02, -3.202e-02, -8.912e-02, 3.058e-01, 9.144e-02)); + r += mul(s2_6, M4(1.529e-01, 2.058e-02, 1.225e-02, 1.418e-02, 2.851e-02, -9.414e-02, 3.406e-02, -8.937e-02, 7.244e-02, -3.096e-02, 4.924e-03, 7.146e-02, -6.292e-02, -5.805e-02, 2.246e-02, -7.245e-02)); + r += mul(s2_7, M4(-9.794e-02, -3.174e-02, -3.934e-02, 1.694e-01, 1.580e-02, -1.106e-01, 1.071e-01, 9.675e-02, -1.938e-01, -9.670e-02, 1.396e-01, 1.392e-01, 1.158e-01, 1.606e-01, -7.912e-02, -4.225e-01)); + r += mul(s2_8, M4(4.833e-02, 8.418e-02, 4.940e-02, 7.383e-02, 3.532e-02, -4.740e-02, 4.360e-02, 3.728e-02, 1.727e-02, 1.183e-02, -3.121e-02, -1.380e-01, -5.586e-02, 1.812e-01, -7.809e-02, 2.813e-03)); + r += mul(s3_0, M4(-3.128e-02, -8.348e-03, -3.419e-02, 1.555e-02, 2.473e-02, -1.091e-01, -2.974e-02, -7.533e-04, -3.134e-02, 4.890e-02, 4.992e-02, 5.672e-03, -2.057e-01, -6.419e-02, -5.290e-03, -9.112e-02)); + r += mul(s3_1, M4(-1.988e-01, -6.346e-02, -2.376e-02, -1.026e-01, 3.478e-02, -1.038e-01, 8.392e-02, -4.286e-02, 8.850e-02, 5.137e-02, 3.114e-02, 3.773e-02, -5.500e-02, 5.521e-02, 3.891e-02, -7.728e-02)); + r += mul(s3_2, M4(1.495e-03, 1.989e-03, 8.935e-02, -3.143e-02, -2.298e-02, 3.887e-02, -4.775e-02, 2.035e-02, 2.637e-02, 4.364e-02, -3.181e-02, 5.997e-02, 3.970e-02, -4.506e-02, 4.399e-02, -7.875e-02)); + r += mul(s3_3, M4(1.929e-01, 6.065e-02, 1.131e-02, -6.712e-02, 2.405e-01, 8.786e-02, 2.701e-02, 3.849e-01, 6.113e-01, 1.128e-01, -5.000e-02, 4.534e-02, 1.853e-01, 1.202e-01, 7.714e-02, 2.600e-01)); + r += mul(s3_4, M4(4.894e-01, 7.720e-02, -2.085e-01, 1.759e-01, -8.599e-02, 2.499e-01, 2.671e-02, 3.832e-02, -7.451e-02, -4.900e-01, 2.272e-01, 3.038e-01, -1.101e-02, 1.394e-01, -2.065e-01, -2.118e-02)); + r += mul(s3_5, M4(1.279e-02, -1.004e-02, -1.078e-01, 5.152e-02, 4.421e-02, 9.399e-02, -1.011e-01, -2.129e-02, -4.416e-02, -9.283e-02, -7.153e-03, 8.909e-02, -9.666e-02, 3.185e-02, 1.265e-01, -9.346e-03)); + r += mul(s3_6, M4(-3.006e-02, -3.389e-03, -1.226e-02, -4.016e-03, -5.528e-02, -6.337e-02, 3.931e-02, 3.432e-02, -1.850e-01, -4.101e-03, -7.500e-02, 2.523e-01, -4.059e-02, 9.910e-03, 6.657e-02, 1.195e-01)); + r += mul(s3_7, M4(-3.706e-02, -4.632e-02, 1.353e-01, -1.655e-02, -1.189e-03, -1.299e-01, 1.459e-01, 7.592e-02, -8.454e-02, -4.301e-02, 1.108e-01, 2.686e-01, -1.628e-01, -9.140e-02, 7.202e-02, -4.312e-02)); + r += mul(s3_8, M4(2.611e-02, 4.438e-02, -1.065e-03, 8.827e-02, 5.581e-03, -1.020e-01, 5.709e-02, -1.106e-02, 6.134e-02, 5.575e-02, 5.738e-02, -1.392e-01, 1.741e-02, 1.431e-01, 7.709e-02, 4.472e-02)); + r += V4(2.856e-05, 8.552e-03, -8.514e-03, -8.667e-03); + return r; +} + +V4 f1(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-2.060e-02, -3.573e-02, 4.912e-02, 5.192e-02, -1.701e-02, -5.571e-02, 3.012e-02, -7.803e-02, 5.806e-02, -1.605e-02, -2.480e-02, 2.160e-03, 3.288e-02, -1.962e-03, -4.509e-02, 5.333e-03)); + r += mul(s0_1, M4(-7.057e-02, -1.169e-02, 8.115e-02, 3.020e-02, -2.626e-02, -1.616e-01, -1.885e-01, 1.023e-01, 8.520e-02, -9.444e-02, -1.475e-01, -9.016e-02, 6.451e-02, -2.741e-02, 5.301e-02, -8.370e-03)); + r += mul(s0_2, M4(3.020e-02, -9.219e-02, 8.349e-02, 9.079e-03, -1.881e-02, 4.455e-02, 1.154e-01, -2.889e-02, -1.542e-02, -7.914e-03, -5.572e-02, 3.873e-02, 1.079e-03, -4.719e-02, 2.548e-02, 3.440e-02)); + r += mul(s0_3, M4(1.301e-01, -8.388e-02, -5.687e-02, 2.733e-01, 3.401e-02, -1.413e-02, 4.602e-02, -2.813e-01, 4.540e-01, -5.388e-02, 7.387e-02, -6.504e-01, 1.325e-01, -2.873e-02, -2.975e-02, -2.031e-01)); + r += mul(s0_4, M4(7.265e-03, 3.294e-01, -4.150e-01, -4.157e-01, -6.122e-01, -2.782e-01, -2.743e-02, 2.658e-01, -2.096e-01, -1.486e-01, 1.571e-01, 3.423e-01, -1.726e-04, -4.478e-01, -7.431e-02, 1.408e-01)); + r += mul(s0_5, M4(-5.815e-03, -1.492e-01, 4.425e-02, -1.350e-02, 4.150e-02, 1.274e-01, -2.494e-01, -1.405e-02, 3.992e-02, -2.511e-03, -9.956e-03, 3.636e-02, 2.708e-02, 2.007e-01, 2.176e-01, -1.301e-02)); + r += mul(s0_6, M4(-2.974e-02, 3.332e-03, -4.831e-02, 3.652e-02, -2.911e-02, -1.271e-02, 3.832e-02, -2.472e-02, 3.249e-02, -1.190e-03, -4.770e-02, -8.276e-02, 1.235e-01, 8.707e-02, 1.179e-01, 1.313e-01)); + r += mul(s0_7, M4(1.030e-01, -1.146e-01, -6.309e-02, -1.055e-01, 3.441e-02, 3.396e-03, -1.176e-01, 1.386e-01, 1.495e-01, 2.413e-02, 1.509e-01, -5.060e-02, -1.727e-01, 7.154e-01, 1.993e-01, -3.198e-02)); + r += mul(s0_8, M4(-3.894e-02, 2.181e-02, 4.581e-02, 4.944e-02, -1.211e-01, 1.148e-01, -1.811e-01, -2.012e-02, 4.331e-02, 5.017e-02, -1.258e-02, 1.772e-02, 9.302e-02, -1.110e-02, 1.585e-02, -3.492e-02)); + r += mul(s1_0, M4(-1.173e-02, 9.897e-03, 7.565e-02, -8.842e-03, -1.854e-02, -7.564e-03, -2.706e-04, 1.776e-03, -9.569e-02, 2.963e-03, 4.260e-02, 2.437e-02, 1.912e-02, -1.021e-02, -5.637e-02, -2.496e-02)); + r += mul(s1_1, M4(-5.787e-02, -1.200e-02, 7.517e-02, 7.302e-02, 2.392e-02, 1.970e-02, -7.769e-02, 9.084e-03, 3.051e-02, 2.814e-02, -2.882e-03, -2.011e-02, 7.490e-02, 1.503e-02, 1.809e-02, -8.811e-02)); + r += mul(s1_2, M4(-1.795e-02, -1.067e-02, 1.235e-01, 5.245e-03, -6.887e-02, 4.047e-02, 3.475e-02, 6.296e-03, -3.501e-03, -3.751e-02, -9.597e-02, 2.536e-02, 1.646e-02, -2.891e-02, 1.570e-02, 1.715e-02)); + r += mul(s1_3, M4(8.565e-02, -6.574e-05, -5.121e-02, 5.086e-02, -7.024e-02, -5.662e-04, 2.205e-03, 4.116e-02, -4.728e-02, 4.219e-02, 4.900e-02, -1.208e-01, -2.718e-02, 3.903e-02, 2.372e-02, -3.676e-02)); + r += mul(s1_4, M4(-1.401e-01, 5.764e-01, -2.054e-01, -1.029e-01, -1.037e-01, -4.536e-02, 6.555e-02, 1.516e-02, -1.173e-01, 8.400e-02, 1.755e-01, 3.744e-01, -1.311e-01, -1.403e-01, 2.332e-01, 1.204e-01)); + r += mul(s1_5, M4(4.695e-02, -5.544e-02, 8.989e-02, -6.275e-02, 1.351e-01, -2.991e-02, -8.762e-03, -1.449e-02, -9.402e-03, 2.208e-02, -5.917e-02, -1.552e-02, 2.040e-02, -5.696e-04, 9.425e-02, 2.299e-02)); + r += mul(s1_6, M4(-4.948e-02, 7.441e-02, 2.896e-02, 2.147e-02, 2.291e-02, -2.075e-02, 3.712e-03, 2.035e-02, 2.247e-02, -3.774e-02, -4.785e-02, -1.356e-01, -5.951e-03, 5.747e-02, 8.200e-04, -2.847e-02)); + r += mul(s1_7, M4(1.020e-01, -2.641e-02, 1.961e-02, -1.182e-01, -8.813e-02, -1.600e-04, -1.931e-02, 1.197e-02, -3.958e-03, 1.959e-02, 4.974e-02, -1.126e-01, -1.102e-01, 1.223e-01, -4.062e-03, 6.450e-04)); + r += mul(s1_8, M4(-2.978e-02, 3.062e-02, 1.368e-02, 3.659e-03, -8.098e-02, -3.109e-02, 1.281e-02, 1.060e-03, -2.341e-02, -8.555e-03, -3.087e-02, -2.310e-02, 6.370e-02, -1.293e-02, 2.538e-02, -1.270e-03)); + r += mul(s2_0, M4(-7.273e-02, 2.366e-02, 4.031e-02, 6.153e-02, -7.381e-02, 2.800e-02, -1.501e-02, 1.604e-01, -5.307e-03, -4.300e-03, -7.255e-02, 1.191e-01, 2.080e-02, -2.249e-02, 2.204e-02, 5.714e-02)); + r += mul(s2_1, M4(-6.031e-02, -3.662e-02, -2.085e-01, 3.811e-02, -1.018e-01, -4.553e-03, -1.082e-01, -2.846e-03, 6.619e-02, 4.708e-02, -6.461e-02, -9.098e-02, -3.929e-03, 2.785e-02, -1.225e-03, -1.047e-01)); + r += mul(s2_2, M4(-6.829e-02, 6.371e-02, -8.082e-02, -2.556e-02, 1.878e-02, -2.257e-02, -9.831e-03, -5.339e-02, 6.919e-03, -8.110e-02, 3.922e-02, 1.624e-03, 3.858e-02, -6.258e-02, 1.776e-02, 2.512e-03)); + r += mul(s2_3, M4(-1.304e-01, -1.371e-02, -2.400e-02, 2.024e-01, 4.433e-01, -1.796e-01, -8.035e-02, -3.362e-01, 1.620e-01, 7.586e-03, -4.559e-02, 3.404e-02, 1.072e-01, -2.411e-02, 3.556e-02, -2.595e-01)); + r += mul(s2_4, M4(-9.545e-02, -6.805e-02, -6.113e-01, -3.604e-01, 1.015e-01, 1.480e-01, -5.419e-01, 7.857e-02, -1.547e-01, 9.204e-02, 1.295e-01, 2.123e-01, -6.725e-02, 1.549e-01, -5.152e-01, -1.548e-01)); + r += mul(s2_5, M4(-5.472e-03, 3.834e-02, 1.714e-01, -2.580e-03, -1.310e-02, 6.837e-02, -1.696e-01, 2.731e-02, 2.067e-02, 1.079e-01, 9.934e-02, -2.763e-02, -3.332e-02, -4.433e-02, 2.018e-01, -1.534e-02)); + r += mul(s2_6, M4(5.036e-02, 2.648e-02, -6.527e-03, -3.690e-02, -7.802e-02, 2.207e-02, 6.141e-02, 1.958e-01, -8.824e-03, 2.394e-02, -2.215e-02, 1.731e-02, 4.865e-02, -4.820e-02, 4.198e-02, -2.534e-01)); + r += mul(s2_7, M4(-5.007e-02, 4.344e-02, 4.250e-03, -4.466e-02, -4.042e-03, 1.976e-01, 1.295e-01, -7.906e-02, 1.381e-02, 4.920e-02, 1.303e-01, -1.579e-02, 3.775e-03, -1.275e-01, 7.502e-02, 2.351e-02)); + r += mul(s2_8, M4(-1.144e-01, 1.398e-01, 2.054e-01, -6.233e-02, -6.101e-02, -2.771e-02, 2.633e-02, -2.155e-02, -3.079e-02, -4.460e-02, -4.350e-03, 4.232e-02, 4.897e-02, 8.307e-02, -1.322e-01, -1.186e-02)); + r += mul(s3_0, M4(-2.531e-02, -1.739e-02, 2.189e-02, 6.500e-02, -8.803e-02, 3.329e-02, 1.011e-01, -7.934e-02, -1.538e-02, 8.243e-02, 8.416e-03, -5.044e-02, 3.723e-03, -5.774e-02, 1.004e-02, -1.064e-01)); + r += mul(s3_1, M4(-3.050e-02, 6.282e-03, 1.975e-02, -4.380e-02, -2.323e-02, -6.742e-02, -2.779e-02, 1.099e-01, 6.210e-02, -4.539e-02, -9.253e-02, -9.297e-02, 4.207e-02, -7.108e-02, -3.079e-02, -9.736e-04)); + r += mul(s3_2, M4(3.245e-02, -7.168e-02, -1.138e-01, -1.895e-02, 1.658e-02, 5.894e-02, -5.603e-02, -6.963e-03, -2.875e-02, 1.198e-02, 5.772e-02, -1.160e-02, 9.326e-03, -3.573e-02, 4.991e-03, 1.271e-02)); + r += mul(s3_3, M4(9.787e-02, -2.036e-02, 1.718e-02, -1.622e-02, 1.043e-01, -3.425e-02, -6.481e-02, -3.099e-01, 7.831e-02, 8.317e-02, 1.363e-03, -5.345e-02, 1.314e-01, 6.020e-02, -3.589e-02, -7.305e-01)); + r += mul(s3_4, M4(-1.829e-02, 4.974e-02, -2.094e-01, -2.861e-01, 1.128e-01, 1.619e-01, -2.358e-01, 2.109e-04, -4.152e-01, 2.425e-02, 2.893e-01, 1.625e-01, -2.212e-01, 9.801e-02, 8.805e-02, -1.555e-01)); + r += mul(s3_5, M4(-1.477e-01, 1.423e-01, -8.523e-02, 4.213e-02, 2.496e-02, 1.500e-03, -6.522e-02, -2.658e-02, 7.489e-02, 3.555e-02, -5.523e-03, -3.305e-02, -1.358e-01, -1.811e-02, 2.465e-02, -5.622e-03)); + r += mul(s3_6, M4(-5.342e-03, 3.661e-03, -1.275e-03, -7.544e-02, -2.144e-02, 1.679e-02, 3.667e-02, 9.079e-02, -1.567e-01, 2.069e-02, 4.591e-03, 8.125e-03, 8.032e-02, -3.126e-02, 3.645e-02, -2.959e-01)); + r += mul(s3_7, M4(8.163e-02, 2.339e-02, -9.055e-04, 3.790e-02, -2.948e-02, 4.977e-02, 7.393e-02, -8.920e-03, 2.544e-02, 3.568e-02, 1.493e-01, -1.212e-01, 1.065e-01, -1.628e-01, 1.593e-01, -8.379e-02)); + r += mul(s3_8, M4(1.707e-02, 8.862e-02, -3.193e-02, -8.568e-02, -1.546e-02, -4.577e-02, 8.805e-02, 1.346e-02, 1.543e-02, -5.755e-02, -3.642e-02, 2.221e-02, 1.673e-03, -2.868e-03, -6.763e-02, -6.137e-03)); + r += V4(5.044e-03, 1.567e-04, -1.145e-02, 6.927e-04); + return r; +} + +void Pass7(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = Rmp8x8(tid.x) + blockStart; + uint2 size = GetInputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = (gxy + 0.5) * pt; + + V4 s0_0 = l0(-1.0, -1.0); + V4 s0_1 = l0(0.0, -1.0); + V4 s0_2 = l0(1.0, -1.0); + V4 s0_3 = l0(-1.0, 0.0); + V4 s0_4 = l0(0.0, 0.0); + V4 s0_5 = l0(1.0, 0.0); + V4 s0_6 = l0(-1.0, 1.0); + V4 s0_7 = l0(0.0, 1.0); + V4 s0_8 = l0(1.0, 1.0); + V4 s1_0 = -max(-s0_0, 0.0); + V4 s1_1 = -max(-s0_1, 0.0); + V4 s1_2 = -max(-s0_2, 0.0); + V4 s1_3 = -max(-s0_3, 0.0); + V4 s1_4 = -max(-s0_4, 0.0); + V4 s1_5 = -max(-s0_5, 0.0); + V4 s1_6 = -max(-s0_6, 0.0); + V4 s1_7 = -max(-s0_7, 0.0); + V4 s1_8 = -max(-s0_8, 0.0); + s0_0 = max(s0_0, 0.0); + s0_1 = max(s0_1, 0.0); + s0_2 = max(s0_2, 0.0); + s0_3 = max(s0_3, 0.0); + s0_4 = max(s0_4, 0.0); + s0_5 = max(s0_5, 0.0); + s0_6 = max(s0_6, 0.0); + s0_7 = max(s0_7, 0.0); + s0_8 = max(s0_8, 0.0); + + V4 s2_0 = l1(-1.0, -1.0); + V4 s2_1 = l1(0.0, -1.0); + V4 s2_2 = l1(1.0, -1.0); + V4 s2_3 = l1(-1.0, 0.0); + V4 s2_4 = l1(0.0, 0.0); + V4 s2_5 = l1(1.0, 0.0); + V4 s2_6 = l1(-1.0, 1.0); + V4 s2_7 = l1(0.0, 1.0); + V4 s2_8 = l1(1.0, 1.0); + V4 s3_0 = -max(-s2_0, 0.0); + V4 s3_1 = -max(-s2_1, 0.0); + V4 s3_2 = -max(-s2_2, 0.0); + V4 s3_3 = -max(-s2_3, 0.0); + V4 s3_4 = -max(-s2_4, 0.0); + V4 s3_5 = -max(-s2_5, 0.0); + V4 s3_6 = -max(-s2_6, 0.0); + V4 s3_7 = -max(-s2_7, 0.0); + V4 s3_8 = -max(-s2_8, 0.0); + s2_0 = max(s2_0, 0.0); + s2_1 = max(s2_1, 0.0); + s2_2 = max(s2_2, 0.0); + s2_3 = max(s2_3, 0.0); + s2_4 = max(s2_4, 0.0); + s2_5 = max(s2_5, 0.0); + s2_6 = max(s2_6, 0.0); + s2_7 = max(s2_7, 0.0); + s2_8 = max(s2_8, 0.0); + + t0[gxy] = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8); + t1[gxy] = f1(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8); +} + +//!PASS 8 +//!DESC conv7 +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 +//!IN t0, t1 +//!OUT t2, t3 + +#define l0(x, y) V4(O(t0, float2(x, y))) +#define l1(x, y) V4(O(t1, float2(x, y))) + +V4 f0(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-8.064e-02, -3.833e-02, -3.181e-02, 1.054e-02, 9.509e-02, -6.553e-02, -5.670e-03, -3.696e-02, 2.583e-02, -1.569e-02, 1.094e-02, -2.399e-02, -3.234e-02, -1.243e-01, 5.270e-03, -6.099e-02)); + r += mul(s0_1, M4(-4.438e-02, -1.485e-01, -1.386e-02, 4.858e-02, -5.601e-02, 1.331e-01, 3.263e-02, -9.788e-02, -2.371e-02, 9.461e-02, -2.250e-02, 1.755e-01, -5.625e-02, 3.249e-01, 1.192e-01, 7.269e-03)); + r += mul(s0_2, M4(-6.456e-02, 1.150e-01, 3.409e-02, -1.190e-02, -2.178e-02, 1.632e-02, -2.622e-02, -3.145e-02, -5.530e-02, 6.932e-03, 2.125e-02, -1.092e-02, 7.237e-03, -1.095e-02, -9.447e-02, 1.069e-01)); + r += mul(s0_3, M4(3.359e-02, -7.934e-02, -1.498e-02, -1.134e-02, -1.444e-02, 1.000e-01, -3.456e-02, 9.253e-02, 4.219e-01, -1.332e-01, -2.880e-03, 3.749e-01, 8.414e-02, 5.580e-02, 7.691e-02, 9.379e-02)); + r += mul(s0_4, M4(1.168e+00, 3.189e-01, 1.974e-03, 6.336e-01, -2.977e-01, -1.237e-01, -7.846e-02, 1.225e-02, -5.781e-01, 1.313e-02, -8.957e-01, 9.973e-02, -3.968e-01, 4.271e-01, -1.687e-01, -4.163e-01)); + r += mul(s0_5, M4(2.994e-02, -3.345e-01, 5.888e-02, 3.474e-01, 1.451e-02, 5.160e-02, 1.694e-02, -1.601e-02, -6.726e-02, -8.100e-02, 3.170e-01, 1.724e-01, 5.414e-02, 5.215e-02, 1.187e-01, 6.467e-02)); + r += mul(s0_6, M4(-7.173e-02, -5.387e-02, 2.614e-03, -1.457e-02, -5.838e-02, 1.020e-02, -1.882e-02, 3.052e-02, -1.867e-01, -1.652e-02, -4.128e-02, -3.654e-02, 1.469e-02, 2.656e-02, 2.224e-02, -3.825e-02)); + r += mul(s0_7, M4(-2.378e-01, 7.857e-03, -3.584e-02, 4.349e-03, -9.461e-02, 4.763e-02, -6.449e-02, 7.229e-02, 9.332e-02, 3.774e-02, -1.346e-01, -1.196e-01, -2.878e-01, 9.030e-02, 1.203e-01, 3.148e-03)); + r += mul(s0_8, M4(9.453e-02, 1.255e-01, -1.324e-01, 6.370e-02, 2.242e-03, -1.721e-03, 6.953e-02, 3.019e-03, -5.313e-02, -1.384e-02, 4.697e-02, 4.914e-02, -9.657e-02, 1.233e-01, -1.883e-01, -8.477e-03)); + r += mul(s1_0, M4(-1.283e-02, 3.713e-02, 6.623e-03, 6.693e-03, -5.631e-02, 2.185e-02, -3.356e-02, 2.070e-03, 5.509e-02, -2.332e-01, 4.553e-03, -3.012e-02, -1.517e-02, 1.337e-03, -6.578e-03, -2.650e-02)); + r += mul(s1_1, M4(3.377e-02, 2.493e-03, -9.238e-03, -6.058e-02, -1.275e-01, 8.259e-02, 5.112e-02, 3.219e-02, -2.216e-02, 7.512e-02, 3.070e-02, 7.029e-02, -1.924e-02, 4.763e-02, -2.827e-02, 4.378e-03)); + r += mul(s1_2, M4(-9.929e-03, 1.398e-02, 1.972e-02, 1.740e-02, -9.611e-03, 5.041e-02, -4.188e-02, 5.115e-02, -1.306e-02, -1.754e-03, -4.642e-02, 1.170e-02, -2.771e-02, -3.207e-02, -2.397e-02, -4.773e-02)); + r += mul(s1_3, M4(-2.679e-02, -2.625e-03, 1.924e-02, 9.094e-03, -2.648e-01, -3.603e-02, 1.072e-02, -1.963e-01, 1.635e-01, -2.366e-02, 1.518e-02, 1.552e-01, 6.552e-02, -4.113e-03, 1.333e-02, -2.104e-02)); + r += mul(s1_4, M4(2.173e-01, 2.712e-01, 1.597e-02, 2.260e-01, -6.777e-01, 1.775e-01, 3.145e-01, 3.556e-02, -2.059e-01, -2.622e-02, -2.541e-01, -5.547e-03, -1.087e-01, -4.131e-02, 2.261e-02, -9.224e-02)); + r += mul(s1_5, M4(-3.171e-02, -5.821e-02, -6.229e-02, 1.392e-01, 2.494e-02, 9.668e-02, -5.215e-02, 1.746e-01, -5.280e-02, -3.489e-02, 7.232e-02, -3.858e-03, 2.566e-02, 4.005e-02, -5.404e-02, -8.660e-02)); + r += mul(s1_6, M4(7.131e-03, 2.685e-02, -2.403e-03, 1.059e-02, 1.469e-01, 1.232e-01, 5.431e-02, 1.890e-01, -1.081e-01, 3.885e-02, -3.539e-02, 5.289e-02, -1.438e-02, -3.979e-03, -6.192e-03, -2.331e-02)); + r += mul(s1_7, M4(-1.071e-01, 7.591e-04, -6.525e-02, 1.632e-02, -1.323e-01, 3.493e-02, -9.612e-02, 2.512e-02, -7.017e-02, 4.360e-02, -6.099e-02, 3.901e-04, -1.764e-02, -1.061e-02, -3.409e-02, -2.255e-02)); + r += mul(s1_8, M4(-4.386e-02, -1.254e-02, 2.400e-02, 1.194e-01, 5.802e-02, 8.040e-02, -3.854e-02, 5.653e-02, -1.702e-02, -2.335e-02, 1.121e-01, 2.440e-02, -3.404e-04, 7.401e-02, -5.980e-02, -3.817e-02)); + r += mul(s2_0, M4(-9.579e-02, 4.650e-02, 8.575e-03, -5.575e-02, -8.117e-02, -7.162e-02, 6.056e-03, -3.501e-02, 9.302e-02, -1.216e-01, -6.163e-02, 6.897e-02, -3.371e-02, 1.772e-02, 3.013e-03, -5.936e-03)); + r += mul(s2_1, M4(4.708e-02, 1.280e-01, 3.359e-02, 1.003e-01, 9.448e-02, 3.132e-02, 8.137e-02, 9.316e-02, -5.728e-02, 5.457e-02, 9.155e-02, -3.774e-02, -2.305e-02, -1.017e-01, 2.738e-02, -2.373e-02)); + r += mul(s2_2, M4(8.975e-03, 8.207e-02, -6.346e-02, 8.974e-02, -2.279e-02, -9.128e-03, -4.230e-02, -8.024e-03, 5.563e-02, 9.479e-02, -9.852e-02, 8.121e-02, -1.145e-02, 6.518e-02, -2.581e-02, 2.733e-02)); + r += mul(s2_3, M4(1.479e-01, -2.068e-02, 3.906e-02, 8.235e-02, -3.507e-02, 1.935e-01, 1.466e-02, 2.432e-01, 5.253e-01, -3.897e-02, -4.775e-02, -9.807e-02, 5.332e-02, 9.679e-02, -1.589e-02, 7.846e-02)); + r += mul(s2_4, M4(1.030e-01, 3.311e-01, 1.128e-01, -1.244e-01, -1.489e-01, 2.902e-01, 2.805e-01, -1.558e-01, -1.289e-01, 3.306e-01, -1.475e-01, -6.570e-02, 3.265e-02, -1.141e-01, 6.703e-02, -1.717e-01)); + r += mul(s2_5, M4(2.855e-02, 1.184e-01, -2.904e-01, 2.258e-02, -7.943e-02, -5.343e-02, -8.054e-02, 1.255e-01, -1.108e-02, 9.190e-02, -1.725e-01, -6.260e-02, -8.194e-03, 5.840e-02, -1.704e-01, 7.028e-03)); + r += mul(s2_6, M4(1.684e-02, 1.411e-02, 8.570e-03, -1.440e-02, 3.143e-02, 5.820e-03, 1.764e-02, 5.872e-02, 7.943e-02, -5.400e-02, 8.544e-02, -3.393e-02, -7.690e-02, -2.082e-02, 2.975e-03, -5.316e-02)); + r += mul(s2_7, M4(-2.681e-02, 7.370e-04, -5.250e-02, -3.652e-02, -7.367e-02, -2.542e-02, 1.165e-01, -5.653e-02, 3.500e-02, 1.781e-02, -7.241e-02, -1.056e-03, -9.338e-02, 2.896e-03, -3.257e-02, 1.238e-01)); + r += mul(s2_8, M4(-6.529e-03, 3.786e-04, -9.472e-02, 5.894e-02, -4.906e-02, 1.019e-02, -3.093e-03, 3.903e-02, 2.610e-02, 6.776e-02, -7.901e-02, -1.485e-03, -9.116e-02, 1.427e-01, -6.813e-02, -1.681e-02)); + r += mul(s3_0, M4(-6.420e-03, 1.512e-02, 2.670e-02, -1.570e-01, -6.513e-03, 5.949e-02, 1.094e-02, -6.247e-02, -1.649e-02, -6.791e-02, 1.733e-03, 2.568e-02, -5.164e-02, 2.694e-02, 8.787e-03, -4.768e-02)); + r += mul(s3_1, M4(1.001e-01, 2.465e-01, 9.252e-02, -2.858e-02, 1.702e-02, -3.235e-02, 1.258e-01, -3.779e-03, 1.607e-02, 1.508e-01, 3.810e-02, -1.863e-02, -1.536e-02, -2.347e-01, -1.849e-03, 5.462e-03)); + r += mul(s3_2, M4(9.057e-03, 1.345e-01, 2.663e-03, -4.507e-02, 2.303e-02, 2.462e-02, -6.214e-02, 7.788e-02, 4.236e-02, 5.039e-02, 2.335e-02, 2.963e-02, -4.921e-02, 4.596e-02, -1.201e-02, 1.782e-02)); + r += mul(s3_3, M4(5.325e-02, 2.420e-01, 4.483e-03, 2.510e-01, -7.061e-03, -1.147e-01, -9.773e-03, 1.426e-01, 3.031e-03, 4.003e-02, -1.434e-02, 6.091e-02, 9.825e-02, 8.520e-02, 2.736e-02, 1.416e-02)); + r += mul(s3_4, M4(7.373e-02, 4.379e-01, -7.470e-02, 2.506e-01, -2.329e-01, 2.474e-01, 2.903e-01, -4.874e-01, -7.010e-02, 1.753e-01, 6.191e-02, 1.025e-01, 8.968e-02, -1.998e-01, 4.465e-05, -5.672e-01)); + r += mul(s3_5, M4(1.284e-01, 1.790e-01, -1.679e-01, 2.744e-01, -3.069e-02, -4.589e-02, -2.251e-01, -1.779e-02, 3.338e-02, 5.997e-02, 1.126e-03, 3.696e-03, -1.154e-01, -5.846e-02, -1.024e-01, 3.392e-01)); + r += mul(s3_6, M4(-2.364e-02, -9.130e-03, -3.655e-02, -1.954e-02, -9.995e-02, 2.973e-02, 4.064e-03, -4.305e-02, -2.863e-03, -8.699e-03, -1.583e-02, 4.408e-03, -6.298e-02, 2.150e-02, 1.992e-02, -2.189e-02)); + r += mul(s3_7, M4(-4.068e-03, -5.225e-02, 3.381e-02, 8.963e-03, 2.640e-02, -2.133e-02, 1.803e-01, -9.592e-02, -1.579e-01, 1.786e-02, 6.515e-02, 2.114e-01, -2.167e-01, -1.371e-01, 2.144e-03, 2.155e-02)); + r += mul(s3_8, M4(-3.349e-03, 1.488e-01, 8.888e-03, 1.001e-01, -4.780e-02, -1.406e-02, -2.940e-02, 4.185e-02, 2.758e-03, 2.820e-02, 5.186e-02, 2.930e-02, 1.372e-01, 1.122e-01, -1.140e-01, 1.343e-01)); + r += V4(-1.743e-03, -5.471e-03, -9.889e-04, 8.561e-05); + return r; +} + +V4 f1(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-5.525e-02, -5.493e-02, -8.973e-04, 4.167e-02, -5.567e-03, 5.194e-03, -5.363e-02, 1.513e-01, 9.020e-02, -4.135e-02, -3.216e-02, 5.381e-02, 7.401e-03, 7.252e-02, -1.617e-02, -1.196e-01)); + r += mul(s0_1, M4(-5.790e-02, -1.934e-02, -1.790e-03, 5.390e-02, -6.975e-02, 4.877e-02, 1.578e-01, -6.377e-03, 1.284e-01, -4.775e-02, -6.735e-02, -9.064e-02, 1.184e-01, 9.055e-02, 9.935e-02, 2.014e-01)); + r += mul(s0_2, M4(-4.004e-02, 4.488e-02, -4.212e-02, -6.286e-02, 1.711e-02, 2.731e-02, -2.406e-02, 1.097e-02, -3.399e-02, 8.065e-03, 3.894e-02, 1.282e-02, 2.036e-01, 4.754e-02, -4.522e-02, 6.568e-03)); + r += mul(s0_3, M4(-2.372e-02, 6.962e-02, 3.557e-02, -8.888e-03, -6.028e-02, -3.183e-02, -1.608e-01, -3.044e-02, -1.429e-02, 3.901e-02, -6.904e-02, -5.157e-01, -1.547e-02, -1.362e-01, 4.108e-03, -1.772e-01)); + r += mul(s0_4, M4(2.381e-01, -3.453e-01, -2.427e-01, 7.987e-02, 1.617e-01, 1.046e-01, 6.711e-02, 4.241e-01, -5.566e-01, 2.310e-01, 1.982e-01, 1.211e-02, 4.338e-02, -1.123e+00, -2.644e-01, -5.025e-01)); + r += mul(s0_5, M4(-4.302e-01, -6.545e-02, -6.868e-03, 2.568e-01, 2.493e-02, 2.488e-02, -1.175e-01, -1.257e-02, 5.920e-02, -3.840e-03, -1.888e-01, 7.050e-02, 8.341e-02, -1.762e-01, -9.946e-02, -3.864e-02)); + r += mul(s0_6, M4(-6.090e-03, 5.118e-02, 5.784e-02, 1.236e-02, -2.339e-02, 1.262e-03, -6.952e-02, -5.645e-02, 7.682e-02, 8.910e-02, -6.863e-02, -1.345e-01, 1.935e-02, -1.587e-02, 2.932e-03, 2.945e-02)); + r += mul(s0_7, M4(1.043e-02, 3.625e-01, -1.154e-01, 7.974e-02, -1.517e-02, 1.574e-02, 8.566e-02, -8.753e-02, 8.905e-02, 1.145e-01, 7.292e-02, -9.528e-02, -6.925e-02, 4.815e-03, -4.870e-03, 1.570e-02)); + r += mul(s0_8, M4(2.513e-01, -1.567e-01, 3.452e-02, -2.177e-01, 4.435e-03, 2.229e-02, -5.694e-02, 3.564e-02, -9.355e-03, -3.216e-03, 3.984e-03, -2.533e-02, 5.015e-03, -4.419e-03, 5.343e-03, -5.821e-02)); + r += mul(s1_0, M4(1.183e-02, 2.180e-03, 3.312e-02, 1.897e-02, -9.420e-02, -1.052e-01, -7.984e-02, -8.329e-02, 1.925e-02, -1.752e-02, -6.860e-03, -1.326e-01, -3.338e-02, -2.484e-02, 5.283e-03, -2.789e-03)); + r += mul(s1_1, M4(-5.266e-02, -3.840e-03, -5.604e-02, 6.279e-02, 2.299e-01, 1.305e-01, 1.038e-01, -9.023e-02, -6.376e-02, 3.853e-02, 1.382e-01, -3.984e-02, 6.131e-02, 1.529e-03, -2.258e-02, 6.728e-02)); + r += mul(s1_2, M4(-2.498e-02, 1.543e-02, 6.288e-03, 1.517e-03, 3.486e-02, 3.774e-02, -2.774e-02, 7.099e-02, 2.514e-02, 9.266e-03, -7.521e-03, 6.476e-03, -6.458e-02, 9.736e-03, 1.127e-02, 7.742e-03)); + r += mul(s1_3, M4(-1.946e-02, 9.133e-04, 3.637e-02, -4.983e-02, 9.720e-02, -4.280e-01, -1.311e-01, 2.993e-02, 5.112e-02, -4.233e-02, -6.549e-02, -1.818e-01, 6.990e-03, 1.344e-02, -5.027e-02, 1.111e-01)); + r += mul(s1_4, M4(-3.156e-02, -8.842e-02, -2.152e-01, 5.452e-03, 1.343e-01, 4.848e-01, 2.658e-01, -8.968e-03, 4.181e-02, -3.102e-02, 4.729e-01, 2.922e-01, 1.338e-01, -1.812e-02, 1.293e-02, -2.395e-01)); + r += mul(s1_5, M4(8.511e-02, -2.497e-02, -6.139e-03, 6.542e-02, 2.345e-01, 4.880e-02, -1.407e-01, 5.752e-02, 5.268e-02, 1.468e-02, 1.387e-02, 3.528e-02, -1.074e-01, 1.000e-02, 8.326e-02, 6.166e-02)); + r += mul(s1_6, M4(-7.543e-03, -3.122e-02, 1.798e-02, 2.674e-02, -1.737e-02, -2.950e-01, -5.185e-02, 1.724e-01, -1.144e-02, -4.360e-02, -2.832e-02, -3.791e-02, 4.188e-03, -1.949e-02, 3.661e-03, 1.626e-02)); + r += mul(s1_7, M4(-2.500e-02, 3.936e-02, -7.625e-02, -1.774e-04, -1.588e-01, 2.302e-02, 8.201e-02, -5.263e-02, -1.705e-02, 3.713e-02, 1.013e-01, -9.792e-02, 1.231e-03, 3.596e-02, -5.049e-02, 4.461e-02)); + r += mul(s1_8, M4(-1.184e-02, -1.957e-02, -6.394e-02, -7.422e-03, 3.436e-02, -4.979e-02, -6.860e-02, 5.641e-02, -5.356e-02, -8.266e-03, 3.798e-02, 1.110e-03, 6.696e-02, 2.150e-02, 3.553e-03, -2.353e-02)); + r += mul(s2_0, M4(-2.568e-02, 5.060e-02, 4.885e-02, -6.251e-02, -1.792e-01, -4.927e-02, -3.191e-03, -7.133e-04, 2.122e-02, 2.619e-01, -4.819e-02, -1.790e-02, 4.136e-02, 5.090e-02, 6.009e-02, 6.033e-02)); + r += mul(s2_1, M4(6.606e-02, -3.492e-02, -6.592e-02, -7.088e-02, -4.980e-03, -1.418e-01, -1.253e-01, -1.462e-02, -1.838e-02, 1.042e-01, 9.550e-02, -1.567e-01, -3.643e-02, -4.484e-02, 3.174e-03, -1.487e-01)); + r += mul(s2_2, M4(9.162e-02, 1.759e-02, -8.418e-02, -1.465e-02, -2.496e-02, -1.225e-02, -2.968e-02, -2.787e-02, 4.041e-03, -4.790e-03, -6.679e-02, 7.165e-03, -3.727e-02, 3.796e-02, 3.822e-02, 8.043e-03)); + r += mul(s2_3, M4(1.837e-03, -1.714e-01, -6.961e-02, 1.382e-01, 5.682e-02, -4.873e-01, -3.312e-02, 5.158e-01, 1.352e-01, -1.975e-01, 1.597e-02, 6.544e-02, -3.329e-02, -3.234e-02, 5.270e-03, -1.502e-01)); + r += mul(s2_4, M4(-5.789e-02, -7.730e-02, 6.364e-02, 5.596e-03, -2.386e-01, -5.458e-02, 8.180e-02, 2.441e-02, 6.474e-02, 5.300e-01, -4.721e-01, -3.701e-02, 2.024e-01, 1.321e-02, -9.498e-02, 4.516e-01)); + r += mul(s2_5, M4(2.882e-02, -2.058e-02, -1.082e-01, -6.370e-02, 1.480e-01, 1.513e-02, -1.423e-01, 2.692e-02, 2.782e-02, 7.790e-02, -1.576e-02, -8.523e-02, 2.453e-01, 6.333e-04, 8.954e-02, 2.339e-01)); + r += mul(s2_6, M4(4.058e-03, 2.871e-02, 1.125e-02, 5.663e-03, 2.601e-02, 6.732e-02, 1.797e-02, -3.068e-02, -2.809e-02, -5.919e-03, 4.540e-02, 2.821e-03, -7.565e-03, 4.519e-02, 2.327e-02, -3.882e-02)); + r += mul(s2_7, M4(-2.998e-02, -6.281e-02, 2.913e-02, -2.864e-02, -6.257e-02, 7.332e-02, 5.505e-04, 1.016e-01, -1.131e-01, -6.519e-02, -1.234e-01, 8.235e-02, -2.776e-02, -4.644e-02, -6.901e-02, 1.809e-02)); + r += mul(s2_8, M4(-2.236e-02, -9.187e-03, -1.409e-01, 4.984e-02, 2.245e-02, 1.562e-02, -1.853e-02, -5.231e-02, 3.672e-02, -2.155e-02, -5.280e-02, 3.258e-03, 2.879e-02, 7.168e-02, 4.822e-02, -5.377e-02)); + r += mul(s3_0, M4(1.415e-02, 1.026e-01, 1.554e-01, 1.670e-02, 3.504e-02, 3.557e-02, 4.013e-02, 8.621e-02, -1.502e-02, 7.253e-03, -1.344e-02, -5.635e-02, 1.603e-02, 2.626e-02, 2.599e-02, 1.666e-03)); + r += mul(s3_1, M4(-3.214e-02, -1.573e-01, 1.001e-01, -1.588e-01, 5.839e-02, -4.139e-02, 3.952e-02, -1.764e-02, 1.964e-02, -1.310e-02, 6.175e-03, -4.100e-02, -1.181e-02, -7.760e-02, -3.020e-02, 7.317e-04)); + r += mul(s3_2, M4(-1.052e-01, -3.080e-02, 3.791e-04, -3.890e-02, 6.022e-02, -4.121e-03, -1.037e-01, -2.708e-02, 1.788e-02, -4.931e-03, -3.259e-02, -2.086e-02, -3.673e-02, 4.576e-02, 5.512e-02, 1.266e-02)); + r += mul(s3_3, M4(-1.639e-01, -2.842e-01, -8.190e-02, 3.341e-02, 4.371e-02, -3.729e-02, -1.062e-01, 5.776e-02, -9.976e-02, 1.355e-01, 3.865e-02, -2.485e-01, 3.205e-02, -9.464e-02, -3.115e-02, 7.982e-02)); + r += mul(s3_4, M4(2.411e-01, -1.693e-01, 7.569e-01, -3.759e-01, -5.648e-01, 1.042e-01, 4.819e-01, 3.628e-03, 5.672e-01, 2.590e-01, -2.252e-01, 1.947e-01, 1.242e-01, 1.440e-01, 8.207e-02, 3.523e-01)); + r += mul(s3_5, M4(3.972e-01, -5.478e-02, -2.617e-01, 1.363e-01, 6.289e-02, 8.769e-03, -1.476e-01, 3.871e-02, 1.088e-01, 2.484e-02, -4.114e-02, -4.563e-02, 1.680e-01, 8.067e-02, 1.434e-01, 3.357e-02)); + r += mul(s3_6, M4(-1.022e-02, -5.556e-02, -3.107e-02, 4.839e-02, 1.079e-02, 1.388e-01, 2.482e-02, -1.166e-01, -5.799e-02, -3.306e-02, 6.809e-02, -6.095e-02, -4.195e-03, 6.835e-03, -1.020e-03, 1.108e-01)); + r += mul(s3_7, M4(-1.105e-01, 2.145e-02, -4.958e-02, 1.012e-01, -3.125e-02, -2.931e-02, 3.629e-02, 1.651e-01, -6.673e-02, 1.906e-02, -6.683e-02, 6.445e-02, -4.213e-02, -2.649e-02, -3.545e-02, 1.384e-01)); + r += mul(s3_8, M4(-1.362e-02, -2.108e-02, -1.410e-01, 9.828e-02, -1.097e-02, 2.497e-02, -9.738e-02, 1.768e-02, 5.047e-02, 3.760e-02, -7.576e-02, 2.529e-03, 8.835e-02, -2.202e-01, -1.604e-02, 4.994e-03)); + r += V4(2.086e-03, 2.299e-03, -5.180e-03, 1.039e-03); + return r; +} + +void Pass8(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = Rmp8x8(tid.x) + blockStart; + uint2 size = GetInputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = (gxy + 0.5) * pt; + + V4 s0_0 = l0(-1.0, -1.0); + V4 s0_1 = l0(0.0, -1.0); + V4 s0_2 = l0(1.0, -1.0); + V4 s0_3 = l0(-1.0, 0.0); + V4 s0_4 = l0(0.0, 0.0); + V4 s0_5 = l0(1.0, 0.0); + V4 s0_6 = l0(-1.0, 1.0); + V4 s0_7 = l0(0.0, 1.0); + V4 s0_8 = l0(1.0, 1.0); + V4 s1_0 = -max(-s0_0, 0.0); + V4 s1_1 = -max(-s0_1, 0.0); + V4 s1_2 = -max(-s0_2, 0.0); + V4 s1_3 = -max(-s0_3, 0.0); + V4 s1_4 = -max(-s0_4, 0.0); + V4 s1_5 = -max(-s0_5, 0.0); + V4 s1_6 = -max(-s0_6, 0.0); + V4 s1_7 = -max(-s0_7, 0.0); + V4 s1_8 = -max(-s0_8, 0.0); + s0_0 = max(s0_0, 0.0); + s0_1 = max(s0_1, 0.0); + s0_2 = max(s0_2, 0.0); + s0_3 = max(s0_3, 0.0); + s0_4 = max(s0_4, 0.0); + s0_5 = max(s0_5, 0.0); + s0_6 = max(s0_6, 0.0); + s0_7 = max(s0_7, 0.0); + s0_8 = max(s0_8, 0.0); + + V4 s2_0 = l1(-1.0, -1.0); + V4 s2_1 = l1(0.0, -1.0); + V4 s2_2 = l1(1.0, -1.0); + V4 s2_3 = l1(-1.0, 0.0); + V4 s2_4 = l1(0.0, 0.0); + V4 s2_5 = l1(1.0, 0.0); + V4 s2_6 = l1(-1.0, 1.0); + V4 s2_7 = l1(0.0, 1.0); + V4 s2_8 = l1(1.0, 1.0); + V4 s3_0 = -max(-s2_0, 0.0); + V4 s3_1 = -max(-s2_1, 0.0); + V4 s3_2 = -max(-s2_2, 0.0); + V4 s3_3 = -max(-s2_3, 0.0); + V4 s3_4 = -max(-s2_4, 0.0); + V4 s3_5 = -max(-s2_5, 0.0); + V4 s3_6 = -max(-s2_6, 0.0); + V4 s3_7 = -max(-s2_7, 0.0); + V4 s3_8 = -max(-s2_8, 0.0); + s2_0 = max(s2_0, 0.0); + s2_1 = max(s2_1, 0.0); + s2_2 = max(s2_2, 0.0); + s2_3 = max(s2_3, 0.0); + s2_4 = max(s2_4, 0.0); + s2_5 = max(s2_5, 0.0); + s2_6 = max(s2_6, 0.0); + s2_7 = max(s2_7, 0.0); + s2_8 = max(s2_8, 0.0); + + t2[gxy] = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8); + t3[gxy] = f1(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8); +} + +//!PASS 9 +//!DESC conv8 +//!BLOCK_SIZE 8 +//!NUM_THREADS 64 +//!IN t2, t3 +//!OUT t0, t1 + +#define l0(x, y) V4(O(t2, float2(x, y))) +#define l1(x, y) V4(O(t3, float2(x, y))) + +V4 f0(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8) { + V4 r = 0.0; + r += mul(s0_0, M4(4.333e-02, -2.234e-02, 4.223e-03, -2.379e-02, 4.428e-02, -4.734e-03, -1.071e-03, 9.366e-03, -2.942e-01, 1.902e-01, -1.446e-01, -5.203e-02, -8.944e-02, -3.073e-02, -2.361e-02, 3.757e-02)); + r += mul(s0_1, M4(-9.616e-02, -6.887e-02, 1.052e-01, -4.074e-02, -1.591e-02, 5.493e-02, -2.139e-03, -3.894e-02, -1.097e-01, 4.568e-02, -7.025e-02, -2.882e-02, -6.000e-02, 2.235e-02, -5.432e-02, 5.809e-03)); + r += mul(s0_2, M4(-1.222e-02, 5.753e-02, 1.194e-01, -2.727e-02, -2.105e-02, 2.036e-02, -8.233e-02, -1.205e-02, -5.085e-02, -6.829e-03, -9.941e-03, -1.337e-02, 7.795e-02, -5.759e-02, 5.618e-02, -9.238e-03)); + r += mul(s0_3, M4(1.324e-01, -1.185e-01, 3.684e-03, 2.976e-02, 1.356e-01, -1.205e-01, -1.850e-02, -2.291e-02, -1.569e-01, 4.140e-01, 2.106e-01, -7.525e-01, 1.914e-02, 2.863e-02, -1.284e-02, -1.043e-01)); + r += mul(s0_4, M4(-1.022e-01, 2.592e-02, -1.560e-01, -6.939e-01, -1.890e-01, -3.180e-02, 8.099e-02, 8.758e-02, 5.179e-02, 1.440e-01, 1.557e-01, 6.581e-02, 6.784e-02, 2.236e-01, 7.923e-02, 1.808e-01)); + r += mul(s0_5, M4(-9.244e-02, -3.930e-02, 1.281e-01, 3.306e-02, -8.861e-02, 1.411e-01, 1.488e-01, 4.144e-02, 8.077e-03, 5.162e-02, 5.214e-02, 6.791e-03, 5.626e-02, -7.312e-02, -8.413e-02, 2.335e-02)); + r += mul(s0_6, M4(-3.044e-02, 1.477e-02, 1.234e-02, 1.927e-02, 4.953e-02, -7.250e-02, 4.041e-02, -3.293e-02, 1.257e-01, -6.445e-02, 5.049e-02, -1.587e-01, 6.960e-02, -1.008e-01, -1.715e-02, 1.055e-01)); + r += mul(s0_7, M4(1.099e-01, 4.099e-02, -4.497e-02, 1.613e-02, 1.081e-01, -5.289e-02, 7.797e-03, -8.610e-02, 1.004e-01, 2.457e-02, -9.614e-02, 2.222e-04, -1.304e-01, -6.372e-02, 1.048e-01, 7.533e-02)); + r += mul(s0_8, M4(-6.962e-02, -9.348e-03, 1.754e-03, -1.924e-03, -6.750e-02, 8.346e-02, -3.537e-02, 2.726e-02, -1.512e-02, 1.457e-03, 5.397e-04, 3.160e-03, 3.225e-03, -2.205e-02, 3.784e-03, -6.457e-02)); + r += mul(s1_0, M4(3.216e-03, -2.588e-02, -3.591e-03, 2.124e-02, 5.857e-02, -4.599e-02, 2.350e-02, -5.599e-03, -7.461e-02, 1.149e-02, -5.752e-03, -1.405e-02, -8.179e-02, -1.131e-02, -6.390e-04, -2.175e-02)); + r += mul(s1_1, M4(-4.224e-02, 1.465e-01, 2.090e-01, -7.787e-02, 3.813e-02, 6.197e-03, -2.953e-03, -5.295e-03, -1.369e-01, 1.265e-01, -8.472e-02, -1.717e-02, -8.354e-02, 6.081e-02, -1.704e-02, -2.941e-02)); + r += mul(s1_2, M4(5.532e-02, 4.211e-02, 1.382e-01, -1.554e-02, -3.309e-02, -1.236e-02, -5.637e-02, -9.740e-03, 3.499e-02, -1.187e-03, 2.183e-02, -4.328e-03, 3.071e-02, 6.290e-03, -3.430e-02, 1.809e-02)); + r += mul(s1_3, M4(3.097e-01, -9.147e-02, 5.491e-02, -2.231e-01, 3.357e-02, -1.675e-01, -3.862e-02, -3.948e-02, -9.614e-02, 2.037e-01, -8.482e-02, 1.575e-01, -2.503e-01, 4.100e-02, 4.688e-02, -5.487e-02)); + r += mul(s1_4, M4(-9.200e-01, 2.786e-01, -1.781e-01, -1.025e-01, -3.880e-01, 2.259e-01, -5.413e-02, 1.069e-01, -1.934e-01, 6.803e-02, 1.450e-01, 1.164e-02, -1.011e-01, 4.287e-01, 1.492e-02, 1.877e-01)); + r += mul(s1_5, M4(2.170e-03, -5.988e-02, 1.469e-01, 8.258e-02, 7.155e-02, 5.736e-02, 2.247e-02, 2.306e-02, -2.195e-02, 6.195e-02, -3.267e-02, 6.251e-02, 1.084e-01, -5.883e-02, 1.627e-02, -2.231e-04)); + r += mul(s1_6, M4(-2.249e-02, -2.655e-02, 5.447e-03, 1.252e-01, 2.021e-02, -3.117e-02, 1.387e-03, -3.282e-02, -3.373e-02, 1.007e-02, 8.572e-03, -4.438e-03, 3.576e-02, -2.237e-02, -8.820e-02, 7.987e-02)); + r += mul(s1_7, M4(5.065e-02, 2.282e-02, -9.641e-02, 6.878e-03, 6.660e-01, 2.497e-02, -1.353e-01, -1.281e-01, 1.927e-02, -6.053e-03, 4.760e-03, -1.569e-02, -8.824e-02, -1.988e-02, -5.204e-03, 9.302e-02)); + r += mul(s1_8, M4(-1.142e-01, -2.133e-02, -5.409e-02, -1.691e-02, -1.052e-01, 6.282e-02, -1.763e-01, 7.171e-03, -5.642e-04, 5.445e-03, -2.252e-02, -8.101e-03, -7.578e-02, -1.884e-02, 4.234e-02, -4.051e-02)); + r += mul(s2_0, M4(-3.340e-02, -9.286e-02, -2.409e-02, 5.065e-02, 1.146e-01, -3.051e-02, -5.897e-02, 1.339e-01, -1.820e-01, -8.258e-02, 7.841e-02, -4.576e-03, -2.235e-02, -2.630e-03, -2.450e-02, 1.445e-03)); + r += mul(s2_1, M4(3.666e-02, -1.334e-01, 1.470e-01, -2.621e-04, 1.844e-02, 2.054e-02, -1.071e-01, 1.125e-01, -9.043e-02, -3.179e-02, -1.576e-01, 4.819e-03, -1.119e-01, 3.672e-02, -1.960e-02, -2.050e-02)); + r += mul(s2_2, M4(-4.321e-02, 1.305e-03, -8.030e-03, 1.275e-02, -2.368e-02, -8.649e-02, 2.123e-01, -2.892e-02, -2.245e-02, -2.036e-02, 5.714e-02, -2.304e-02, 7.935e-02, 2.948e-02, 4.653e-02, 2.831e-02)); + r += mul(s2_3, M4(3.771e-02, 2.739e-02, -5.543e-02, -7.737e-02, 1.401e-01, -8.111e-02, -5.889e-02, -9.849e-02, 6.609e-02, -1.088e+00, -3.718e-01, 8.566e-01, -3.921e-02, -1.169e-02, 3.725e-02, 1.351e-02)); + r += mul(s2_4, M4(4.463e-02, -4.023e-01, 9.789e-02, -1.354e-02, -3.505e-01, 6.620e-02, 2.244e-01, -1.811e-01, 1.546e-01, 1.551e-01, 5.571e-01, -8.024e-02, 2.007e-01, -2.899e-02, 8.322e-02, 2.466e-02)); + r += mul(s2_5, M4(-8.966e-02, 9.537e-03, 1.072e-02, -2.888e-02, -9.071e-02, -2.265e-02, 1.060e-01, 2.784e-02, 2.326e-02, 2.158e-02, -1.252e-02, 4.109e-02, -9.991e-02, 2.266e-02, 1.081e-01, -3.239e-02)); + r += mul(s2_6, M4(7.485e-02, -5.121e-02, -7.197e-03, 2.364e-02, 2.601e-02, -3.873e-02, -3.163e-02, 6.095e-03, 1.731e-01, 1.597e-01, -2.013e-01, -1.612e-01, -3.529e-02, 4.730e-02, 3.587e-03, -4.909e-02)); + r += mul(s2_7, M4(-2.002e-01, -1.274e-01, 3.759e-02, -7.192e-02, 4.936e-02, 6.713e-03, -9.731e-02, -1.581e-02, 2.900e-01, 2.825e-03, -1.856e-03, 1.151e-01, 4.926e-02, -8.486e-02, 6.889e-02, -7.680e-02)); + r += mul(s2_8, M4(2.897e-02, 1.246e-02, 5.703e-02, 3.133e-02, -5.819e-02, 3.870e-02, 2.343e-02, 2.062e-02, -3.449e-02, -1.748e-03, -3.243e-03, 7.889e-03, -3.119e-02, 2.583e-02, 2.955e-02, 2.239e-02)); + r += mul(s3_0, M4(-6.212e-02, -2.815e-02, 3.233e-02, 1.243e-02, -7.495e-02, 5.928e-02, -1.435e-02, -3.235e-02, -4.753e-02, -8.307e-02, -6.735e-03, 2.073e-02, 3.210e-02, -1.466e-02, -3.795e-03, -7.752e-03)); + r += mul(s3_1, M4(8.327e-02, -6.238e-02, 8.281e-02, 1.640e-02, -2.766e-02, 1.126e-01, -1.703e-01, 5.964e-02, -6.483e-02, -1.239e-01, 9.791e-02, -5.774e-02, -4.405e-02, -1.194e-01, 1.150e-01, 8.248e-03)); + r += mul(s3_2, M4(-2.417e-02, -2.032e-03, -2.130e-02, 3.247e-03, 2.558e-02, 9.621e-03, 2.894e-03, 1.745e-02, -3.345e-03, 2.472e-02, 4.561e-02, 1.091e-04, -9.694e-02, 7.448e-02, 1.977e-02, -2.252e-02)); + r += mul(s3_3, M4(4.710e-02, 1.175e-01, -5.456e-02, 2.405e-02, -5.599e-02, 5.930e-02, 1.394e-02, -1.948e-01, 9.356e-02, 4.988e-03, -3.550e-02, 2.115e-02, 3.579e-02, 2.519e-03, 3.458e-02, 1.284e-02)); + r += mul(s3_4, M4(-1.539e-01, -2.812e-01, -1.729e-01, 3.786e-02, -7.088e-02, 9.694e-02, -3.798e-02, -2.858e-01, 2.162e-01, 2.841e-01, 6.325e-02, 8.461e-02, -1.131e-02, -4.421e-01, -7.511e-02, -1.567e-01)); + r += mul(s3_5, M4(-5.525e-02, 9.872e-03, 1.520e-02, -1.043e-02, -1.261e-01, 5.960e-02, -1.696e-01, 1.084e-02, 4.916e-04, -4.675e-02, 4.176e-02, -1.421e-02, -4.200e-03, 5.236e-02, 4.528e-01, -1.819e-02)); + r += mul(s3_6, M4(5.756e-02, -5.624e-02, -1.801e-02, 1.356e-01, -2.943e-02, -3.031e-03, 2.097e-02, -2.393e-02, -1.188e-02, 3.476e-02, -8.038e-02, -2.493e-02, -7.363e-02, 9.841e-02, 2.800e-02, -4.719e-02)); + r += mul(s3_7, M4(-1.646e-01, -1.462e-01, 4.622e-02, -1.341e-01, 7.500e-02, 9.408e-03, -3.332e-02, -9.753e-02, -1.242e-01, -5.388e-02, 8.329e-06, -8.211e-02, 2.022e-02, -1.792e-01, 2.668e-01, -1.639e-01)); + r += mul(s3_8, M4(-5.759e-02, 2.412e-02, -7.751e-03, 5.953e-02, -3.042e-03, 7.494e-02, -7.015e-02, 8.802e-03, 6.651e-02, 2.193e-02, 5.734e-03, 9.387e-04, 8.776e-03, -3.649e-02, -5.357e-02, 2.643e-02)); + r += V4(7.492e-03, 1.996e-03, 3.514e-04, -9.678e-04); + return r; +} + +V4 f1(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8) { + V4 r = 0.0; + r += mul(s0_0, M4(-4.857e-03, 1.681e-02, 1.594e-02, 1.186e-02, 9.703e-03, 1.481e-02, 2.224e-02, -1.211e-02, -3.463e-02, 2.229e-01, -4.089e-02, -2.937e-02, -3.930e-02, -4.065e-02, -5.603e-02, 4.334e-03)); + r += mul(s0_1, M4(1.133e-01, -8.282e-02, -1.479e-01, 2.685e-02, -5.441e-02, 5.083e-02, 1.999e-02, -9.091e-03, 1.051e-01, -2.878e-03, 3.581e-02, -1.914e-01, 6.339e-02, 4.883e-02, 8.196e-02, -1.849e-02)); + r += mul(s0_2, M4(-1.835e-02, 4.866e-03, -1.972e-02, -5.721e-02, 3.678e-02, 7.178e-03, 4.936e-02, 1.327e-02, 7.159e-03, 1.530e-02, 9.492e-03, -2.915e-02, -3.703e-02, 3.455e-02, 4.313e-02, -7.483e-03)); + r += mul(s0_3, M4(4.954e-02, -3.734e-02, 1.704e-01, -9.261e-02, 4.356e-02, 4.334e-02, 1.375e-01, -6.750e-02, 1.645e-01, 3.545e-01, -1.076e-01, -2.754e-01, -8.735e-03, 8.428e-02, -2.600e-02, 5.157e-02)); + r += mul(s0_4, M4(-1.529e-01, 6.132e-02, 5.269e-01, 2.303e-01, 3.777e-02, -3.362e-02, -1.288e-01, 3.253e-02, -2.453e-03, -1.311e-01, -1.811e-01, 5.146e-01, 1.360e-01, -1.568e-01, 3.541e-01, -4.269e-01)); + r += mul(s0_5, M4(1.203e-01, 2.272e-02, 4.602e-02, -4.652e-02, 4.838e-02, -1.423e-01, -4.015e-02, 2.329e-01, 2.563e-02, 4.549e-03, -6.325e-03, 1.033e-01, -1.185e-01, -1.229e-03, -1.781e-03, 4.882e-02)); + r += mul(s0_6, M4(-1.493e-03, -5.072e-04, -7.398e-02, -4.071e-03, 1.147e-02, 7.946e-02, 3.359e-02, -6.394e-02, 3.505e-02, 2.111e-01, 1.077e-01, -9.330e-02, 2.340e-02, 1.186e-02, 1.139e-01, -2.444e-03)); + r += mul(s0_7, M4(-5.860e-03, -1.587e-02, -7.634e-02, 6.287e-03, 7.103e-02, 1.223e-01, 1.770e-01, -6.041e-02, -3.422e-02, -8.480e-03, 6.146e-02, 5.680e-02, 6.599e-03, -6.543e-02, -6.087e-02, -1.182e-01)); + r += mul(s0_8, M4(-3.065e-03, -2.381e-02, 1.076e-03, 4.174e-02, -1.275e-02, -8.464e-02, -1.656e-02, 1.118e-01, -5.084e-03, -1.276e-02, 1.028e-02, -2.447e-02, 2.944e-02, 3.333e-02, 1.571e-02, -4.768e-02)); + r += mul(s1_0, M4(1.033e-02, -1.755e-02, -6.591e-02, -2.916e-03, 5.268e-02, -1.639e-02, 3.173e-02, -3.870e-02, -1.196e-02, -5.798e-02, -6.512e-02, 6.685e-02, 1.077e-01, -1.033e-01, -6.763e-02, 6.647e-03)); + r += mul(s1_1, M4(4.385e-01, -5.927e-02, -3.308e-01, 1.535e-01, -5.186e-02, 9.066e-02, 5.980e-02, -5.399e-02, -1.484e-03, 1.159e-01, 1.228e-01, -4.994e-02, 4.690e-02, -5.008e-02, -4.004e-02, -1.684e-02)); + r += mul(s1_2, M4(-4.728e-02, 1.658e-02, -5.943e-02, 2.234e-03, -3.209e-02, 4.928e-03, 3.253e-03, 4.860e-04, 1.285e-02, -1.914e-02, 2.240e-02, 1.305e-02, -5.554e-02, -5.859e-04, -3.260e-03, 8.161e-03)); + r += mul(s1_3, M4(1.111e-02, -1.017e-02, 3.942e-01, -2.339e-01, -5.259e-02, -1.509e-01, 9.273e-02, 4.821e-03, 4.431e-02, -2.321e-02, 8.765e-03, 1.174e-01, -1.620e-01, -1.094e-01, -1.112e-01, 1.092e-01)); + r += mul(s1_4, M4(-1.112e-01, -3.016e-01, 5.767e-01, 2.991e-01, -2.363e-01, 1.773e-01, 4.842e-02, 1.479e-02, 4.656e-02, -6.919e-02, -1.145e-01, 3.517e-01, 1.694e-01, -1.172e-01, 1.981e-01, -3.146e-01)); + r += mul(s1_5, M4(7.860e-02, 1.250e-02, 8.584e-02, 2.115e-02, 4.508e-02, -1.057e-01, 3.477e-02, 1.894e-01, 1.702e-04, -3.281e-02, -4.114e-02, 1.520e-01, -3.739e-02, -2.410e-02, 4.224e-02, 4.905e-02)); + r += mul(s1_6, M4(-1.856e-02, -3.141e-02, -1.581e-01, -4.136e-02, -5.412e-02, 2.173e-01, -8.472e-02, 2.157e-02, -1.841e-02, 4.442e-03, -6.516e-02, -2.259e-03, -8.614e-03, -2.194e-02, 4.293e-02, 6.910e-02)); + r += mul(s1_7, M4(-6.917e-02, -1.204e-01, -1.636e-01, 1.444e-02, -1.302e-01, 1.454e-01, -1.236e-01, -1.381e-01, -2.625e-02, -1.014e-02, 3.965e-02, 5.456e-02, 1.004e-02, -7.594e-02, -2.646e-02, -8.390e-03)); + r += mul(s1_8, M4(-1.214e-02, -1.182e-02, -1.654e-02, 5.613e-02, -4.494e-02, -6.883e-02, -6.759e-02, 1.401e-01, 5.809e-03, -7.901e-03, 2.477e-03, 2.240e-02, 2.892e-02, 2.365e-04, 1.916e-02, -4.855e-02)); + r += mul(s2_0, M4(1.165e-02, -3.547e-02, -3.269e-02, 3.278e-02, 1.517e-01, 3.076e-01, 1.321e-01, -7.305e-02, -9.144e-02, -1.188e-01, -8.574e-02, 3.771e-02, 5.090e-02, -3.828e-03, -2.782e-03, 9.980e-03)); + r += mul(s2_1, M4(4.990e-02, -1.158e-02, -8.473e-03, -7.378e-02, 2.320e-01, 4.317e-03, -1.275e-01, -7.346e-02, 1.375e-01, -5.503e-02, 2.691e-02, 7.374e-02, -9.075e-02, -9.443e-03, -3.406e-02, -8.131e-03)); + r += mul(s2_2, M4(-2.091e-02, 2.630e-02, -1.171e-02, -8.149e-03, -6.488e-02, 3.674e-02, -1.582e-02, 2.703e-02, 1.933e-02, 9.368e-04, -2.847e-03, -6.541e-02, -8.207e-03, -2.102e-03, 5.476e-03, 2.813e-02)); + r += mul(s2_3, M4(-7.157e-02, 3.019e-01, 4.938e-02, 1.148e-02, -1.928e-02, 5.004e-02, 1.490e-01, -4.090e-02, -6.051e-01, 1.305e-01, 5.432e-02, 3.124e-01, -4.909e-03, 4.734e-03, -4.112e-02, 2.852e-02)); + r += mul(s2_4, M4(-6.570e-02, -1.792e-01, -3.370e-01, -1.151e-01, -1.800e-01, -4.234e-01, 2.290e-01, -1.410e-01, -1.107e-01, -3.994e-01, -6.890e-02, 1.616e-01, 2.725e-01, -1.534e-01, 1.134e-02, -1.122e-01)); + r += mul(s2_5, M4(2.107e-02, 7.061e-02, -3.419e-02, -7.876e-02, 1.059e-01, 2.269e-02, 3.643e-02, -9.355e-02, 2.354e-02, -2.920e-02, -1.486e-02, 6.596e-02, 1.459e-01, -7.315e-02, 1.001e-02, -1.196e-01)); + r += mul(s2_6, M4(7.558e-03, -5.529e-02, 2.896e-02, -5.776e-02, 4.176e-03, 2.669e-02, 8.191e-03, -1.173e-02, -8.356e-04, 2.705e-01, 2.322e-02, 1.236e-01, -1.824e-03, -9.138e-03, 5.993e-03, 2.423e-02)); + r += mul(s2_7, M4(2.899e-03, 4.622e-02, 1.248e-01, 5.803e-02, 2.360e-03, 1.574e-02, 9.107e-03, 2.627e-02, 2.870e-03, 1.155e-01, 2.568e-01, 1.185e-01, -1.852e-02, 7.471e-02, 1.442e-01, 4.149e-03)); + r += mul(s2_8, M4(2.587e-02, 2.002e-02, 1.244e-02, -7.156e-02, -2.962e-03, -4.371e-02, 9.750e-05, 2.554e-02, 1.524e-02, -3.555e-02, 3.165e-02, -1.252e-01, 7.889e-03, -2.808e-02, -2.502e-02, -9.080e-02)); + r += mul(s3_0, M4(-5.464e-02, -9.380e-02, -9.031e-02, 6.067e-02, 1.637e-02, -4.678e-02, -6.354e-02, 2.757e-02, -3.534e-02, -7.544e-02, -4.711e-02, -1.170e-02, -2.121e-02, 6.766e-02, 1.143e-02, -1.352e-02)); + r += mul(s3_1, M4(6.666e-02, -3.601e-02, -1.621e-02, 1.027e-02, -7.539e-02, 6.818e-02, 9.687e-02, 8.166e-03, 1.209e-01, -7.593e-02, -6.114e-02, -1.871e-02, -4.486e-03, -4.191e-02, -3.624e-02, -6.917e-02)); + r += mul(s3_2, M4(1.685e-03, 1.879e-02, -1.085e-02, -1.463e-02, -2.649e-02, -2.843e-02, -5.443e-02, 1.182e-01, -4.538e-02, 1.604e-02, -1.214e-02, -3.780e-02, 7.448e-02, 4.743e-02, 1.960e-02, -2.091e-02)); + r += mul(s3_3, M4(1.581e-03, 4.307e-01, 2.725e-02, -6.223e-03, -1.649e-02, -9.806e-02, -4.996e-02, 5.188e-02, -1.004e-01, 3.665e-01, 6.566e-02, -1.778e-02, 6.244e-02, -8.677e-02, 6.811e-02, -7.358e-02)); + r += mul(s3_4, M4(-1.159e-01, -2.202e-01, -4.450e-01, -1.843e-01, -2.163e-01, -5.406e-01, -1.782e-02, 3.599e-02, 4.676e-02, -2.842e-01, 2.868e-02, -3.187e-02, 5.708e-01, -4.671e-01, 2.904e-01, 7.765e-02)); + r += mul(s3_5, M4(1.722e-02, 6.820e-02, -2.501e-02, 2.062e-02, 7.785e-02, 3.089e-02, -1.011e-01, 7.250e-02, 1.777e-02, 2.478e-02, 2.426e-02, -1.451e-03, -3.446e-02, -2.670e-02, 2.924e-02, -3.201e-02)); + r += mul(s3_6, M4(1.407e-02, -6.091e-02, 9.407e-03, -4.578e-02, -1.060e-02, 4.716e-03, 1.340e-02, 9.612e-03, -4.227e-02, -1.122e-01, -5.321e-02, 5.625e-02, 2.228e-02, 6.253e-03, -6.240e-02, -3.802e-03)); + r += mul(s3_7, M4(-1.704e-02, -4.713e-03, 7.542e-02, -7.843e-03, -3.427e-02, 6.325e-03, 1.225e-02, 1.093e-02, 1.470e-02, 8.228e-02, 7.090e-02, 4.060e-02, -1.906e-02, 5.804e-02, 1.348e-01, -7.307e-02)); + r += mul(s3_8, M4(1.539e-02, 2.190e-03, -2.100e-02, -2.839e-02, 4.166e-03, -1.752e-02, -2.224e-02, 4.517e-02, -2.712e-02, -1.329e-02, -2.822e-02, -1.040e-02, 2.914e-02, -1.207e-02, -4.796e-02, -6.910e-02)); + r += V4(1.021e-04, 2.892e-03, 4.075e-03, -4.598e-04); + return r; +} + +void Pass9(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = Rmp8x8(tid.x) + blockStart; + uint2 size = GetInputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = (gxy + 0.5) * pt; + + V4 s0_0 = l0(-1.0, -1.0); + V4 s0_1 = l0(0.0, -1.0); + V4 s0_2 = l0(1.0, -1.0); + V4 s0_3 = l0(-1.0, 0.0); + V4 s0_4 = l0(0.0, 0.0); + V4 s0_5 = l0(1.0, 0.0); + V4 s0_6 = l0(-1.0, 1.0); + V4 s0_7 = l0(0.0, 1.0); + V4 s0_8 = l0(1.0, 1.0); + V4 s1_0 = -max(-s0_0, 0.0); + V4 s1_1 = -max(-s0_1, 0.0); + V4 s1_2 = -max(-s0_2, 0.0); + V4 s1_3 = -max(-s0_3, 0.0); + V4 s1_4 = -max(-s0_4, 0.0); + V4 s1_5 = -max(-s0_5, 0.0); + V4 s1_6 = -max(-s0_6, 0.0); + V4 s1_7 = -max(-s0_7, 0.0); + V4 s1_8 = -max(-s0_8, 0.0); + s0_0 = max(s0_0, 0.0); + s0_1 = max(s0_1, 0.0); + s0_2 = max(s0_2, 0.0); + s0_3 = max(s0_3, 0.0); + s0_4 = max(s0_4, 0.0); + s0_5 = max(s0_5, 0.0); + s0_6 = max(s0_6, 0.0); + s0_7 = max(s0_7, 0.0); + s0_8 = max(s0_8, 0.0); + + V4 s2_0 = l1(-1.0, -1.0); + V4 s2_1 = l1(0.0, -1.0); + V4 s2_2 = l1(1.0, -1.0); + V4 s2_3 = l1(-1.0, 0.0); + V4 s2_4 = l1(0.0, 0.0); + V4 s2_5 = l1(1.0, 0.0); + V4 s2_6 = l1(-1.0, 1.0); + V4 s2_7 = l1(0.0, 1.0); + V4 s2_8 = l1(1.0, 1.0); + V4 s3_0 = -max(-s2_0, 0.0); + V4 s3_1 = -max(-s2_1, 0.0); + V4 s3_2 = -max(-s2_2, 0.0); + V4 s3_3 = -max(-s2_3, 0.0); + V4 s3_4 = -max(-s2_4, 0.0); + V4 s3_5 = -max(-s2_5, 0.0); + V4 s3_6 = -max(-s2_6, 0.0); + V4 s3_7 = -max(-s2_7, 0.0); + V4 s3_8 = -max(-s2_8, 0.0); + s2_0 = max(s2_0, 0.0); + s2_1 = max(s2_1, 0.0); + s2_2 = max(s2_2, 0.0); + s2_3 = max(s2_3, 0.0); + s2_4 = max(s2_4, 0.0); + s2_5 = max(s2_5, 0.0); + s2_6 = max(s2_6, 0.0); + s2_7 = max(s2_7, 0.0); + s2_8 = max(s2_8, 0.0); + + t0[gxy] = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8); + t1[gxy] = f1(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8); +} + +//!PASS 10 +//!DESC out-shuffle +//!BLOCK_SIZE 16 +//!NUM_THREADS 64 +//!IN INPUT, t0, t1 +//!OUT OUTPUT + +#define l0(x, y) V4(O(t0, float2(x, y))) +#define l1(x, y) V4(O(t1, float2(x, y))) + +V4 f0(V4 s0_0, V4 s0_1, V4 s0_2, V4 s0_3, V4 s0_4, V4 s0_5, V4 s0_6, V4 s0_7, V4 s0_8, V4 s1_0, V4 s1_1, V4 s1_2, V4 s1_3, V4 s1_4, V4 s1_5, V4 s1_6, V4 s1_7, V4 s1_8, V4 s2_0, V4 s2_1, V4 s2_2, V4 s2_3, V4 s2_4, V4 s2_5, V4 s2_6, V4 s2_7, V4 s2_8, V4 s3_0, V4 s3_1, V4 s3_2, V4 s3_3, V4 s3_4, V4 s3_5, V4 s3_6, V4 s3_7, V4 s3_8) { + V4 r = 0.0; + r += mul(s0_0, M4(2.098e-02, -9.305e-03, -8.033e-03, 3.455e-02, 1.747e-02, -3.697e-02, -1.424e-02, 1.170e-02, -2.027e-02, -5.643e-02, -2.869e-02, -3.308e-02, -1.154e-01, -2.864e-02, -3.009e-02, -1.849e-02)); + r += mul(s0_1, M4(-2.191e-02, 7.817e-02, -1.705e-02, -2.475e-03, -2.317e-01, -3.827e-02, -4.318e-04, -7.348e-02, -3.294e-02, -1.082e-01, 2.578e-02, -3.462e-02, -7.983e-02, -2.407e-01, -8.092e-03, -3.626e-02)); + r += mul(s0_2, M4(-1.301e-02, -3.897e-02, -6.300e-03, -1.383e-02, 2.743e-02, -4.224e-02, 5.535e-03, -1.838e-02, 9.344e-03, 1.156e-02, -5.436e-03, 1.041e-02, -7.606e-02, -2.449e-02, -2.023e-02, 2.329e-02)); + r += mul(s0_3, M4(2.784e-01, 9.384e-02, 1.126e-01, -1.144e-01, 1.104e-01, -3.075e-03, 2.114e-01, -4.576e-02, 2.271e-01, 5.360e-02, -2.026e-02, 2.571e-01, 1.023e-01, -2.406e-02, 3.613e-02, 2.313e-02)); + r += mul(s0_4, M4(1.481e-01, 1.487e-01, 3.646e-02, 1.608e-01, -5.368e-01, 7.939e-01, -8.009e-01, 7.326e-01, -8.184e-02, 7.780e-02, 2.823e-02, 1.723e-02, 3.261e-02, 7.264e-02, 4.906e-01, -7.881e-02)); + r += mul(s0_5, M4(1.893e-02, 2.051e-02, -1.583e-02, -1.434e-02, -3.022e-02, -5.953e-02, 4.948e-02, -6.243e-02, 1.064e-02, 9.555e-03, 9.215e-03, 2.395e-03, -1.879e-02, -5.293e-02, -6.218e-02, 1.880e-01)); + r += mul(s0_6, M4(-1.623e-02, -9.043e-03, 8.706e-02, -2.571e-02, 4.310e-03, 1.182e-02, 2.041e-02, 5.692e-02, -2.960e-02, -2.983e-03, 4.222e-02, -6.760e-02, -7.396e-03, 5.672e-03, -7.944e-03, 4.287e-02)); + r += mul(s0_7, M4(-2.240e-02, -1.813e-02, 5.106e-02, 3.940e-02, -2.053e-03, 4.609e-03, -7.422e-02, 1.510e-01, -1.863e-02, -1.240e-02, -4.103e-02, 4.553e-02, -1.829e-02, -7.566e-03, 1.359e-03, -3.670e-02)); + r += mul(s0_8, M4(-5.476e-03, -1.114e-02, -4.037e-03, -2.126e-03, 2.712e-02, 1.440e-02, 2.411e-02, 2.362e-02, -5.747e-03, -5.246e-03, 1.138e-02, -1.869e-02, 1.133e-03, -4.128e-03, -5.698e-03, 7.431e-04)); + r += mul(s1_0, M4(-2.053e-02, -5.708e-02, 1.294e-01, -1.091e-02, -5.203e-03, -1.339e-02, -2.457e-02, 9.190e-03, -1.666e-01, -1.923e-02, 2.214e-02, -2.020e-02, -8.115e-02, -3.013e-02, -4.038e-02, -3.056e-02)); + r += mul(s1_1, M4(-2.557e-01, 5.294e-01, -1.299e-01, -1.493e-01, -1.234e-01, -1.255e-01, 2.948e-03, -4.235e-02, 3.493e-02, -1.870e-01, -2.104e-03, -4.000e-02, -3.905e-02, -2.193e-01, -2.203e-02, -9.760e-03)); + r += mul(s1_2, M4(1.733e-02, -7.787e-02, -6.604e-03, 6.678e-03, 7.696e-03, -2.369e-02, -6.539e-04, -1.102e-02, -1.193e-03, 1.231e-02, -1.389e-03, -9.574e-03, -5.801e-02, -2.889e-02, -2.686e-03, 1.507e-02)); + r += mul(s1_3, M4(2.792e-01, 9.448e-02, 3.361e-02, -5.689e-02, 1.630e-01, 1.120e-02, 1.771e-01, -2.116e-02, 4.607e-01, -2.987e-02, -1.319e-01, 1.699e-01, 1.127e-01, -3.390e-03, 5.671e-02, 8.547e-03)); + r += mul(s1_4, M4(1.412e-01, 6.567e-02, 2.311e-01, 1.009e-01, -7.339e-02, 3.683e-01, -2.510e-01, 2.821e-01, -1.446e-01, -1.170e-01, -6.035e-02, 5.471e-01, 1.075e-01, 9.204e-02, 3.083e-01, -4.666e-02)); + r += mul(s1_5, M4(4.185e-02, 9.992e-03, -9.781e-03, -1.284e-01, -6.054e-02, -1.004e-01, 3.920e-03, -7.670e-02, 6.425e-03, 1.315e-02, 1.833e-02, -2.078e-02, -4.423e-03, 1.608e-02, -4.473e-02, 1.431e-01)); + r += mul(s1_6, M4(-2.035e-02, -1.490e-02, 7.858e-02, -1.677e-02, -1.529e-02, 1.617e-02, 1.892e-02, 6.421e-02, -5.163e-02, -3.004e-04, 4.796e-02, -6.612e-02, -7.339e-03, 3.612e-03, -3.793e-03, 3.967e-02)); + r += mul(s1_7, M4(-1.587e-02, 2.826e-03, 4.107e-02, 3.865e-02, 1.741e-03, -8.144e-03, 3.549e-02, 4.874e-02, -1.309e-02, 9.007e-03, -4.065e-02, 1.889e-02, -1.401e-02, -6.740e-03, -8.651e-03, -3.680e-02)); + r += mul(s1_8, M4(-3.425e-02, -1.581e-02, 2.079e-03, 9.678e-03, 1.536e-02, 1.254e-02, -6.491e-03, 1.337e-02, -6.457e-03, -4.502e-03, 7.601e-03, -2.523e-02, -8.848e-04, -4.491e-03, -1.150e-02, -1.041e-02)); + r += mul(s2_0, M4(-1.231e-02, 1.957e-02, -4.860e-03, -3.485e-02, 2.150e-02, 2.795e-02, -8.654e-03, -1.193e-02, -3.417e-03, 1.825e-02, 1.567e-02, -3.503e-02, 1.815e-01, 3.099e-02, -2.550e-02, -7.071e-02)); + r += mul(s2_1, M4(4.765e-03, 1.726e-02, -1.563e-02, -3.967e-02, 1.431e-01, 1.655e-01, 8.577e-03, -2.072e-02, -1.189e-01, -1.901e-01, 1.268e-02, -1.182e-02, 1.360e-01, -9.727e-02, 3.545e-02, -3.795e-02)); + r += mul(s2_2, M4(-1.629e-02, -2.886e-02, 6.265e-04, -4.466e-03, -9.620e-03, -6.831e-03, -1.007e-03, -1.137e-02, 1.575e-02, -1.520e-02, 3.770e-03, -1.629e-03, 9.599e-03, 1.072e-02, -8.331e-03, -2.625e-03)); + r += mul(s2_3, M4(-4.895e-02, -1.444e-02, -1.074e-02, 4.024e-02, -7.837e-02, 7.142e-03, -3.005e-02, 5.887e-02, 4.426e-02, -4.724e-02, 1.118e-01, 1.978e-01, 3.873e-01, -6.170e-02, 5.417e-01, 2.115e-01)); + r += mul(s2_4, M4(-4.664e-02, 5.652e-02, 1.062e-01, 7.868e-02, -4.444e-01, -2.378e-01, 2.168e-01, 2.783e-01, 2.544e-01, 2.526e-01, -2.176e-01, -3.524e-01, -1.380e-01, -4.658e-01, 7.754e-02, -5.062e-01)); + r += mul(s2_5, M4(3.824e-02, -7.471e-03, -3.021e-02, 2.526e-02, -9.479e-03, -8.237e-02, -1.161e-02, 7.648e-02, -1.067e-01, -1.000e-01, 2.901e-03, -3.454e-02, -2.220e-03, -3.343e-02, 4.048e-03, -1.751e-03)); + r += mul(s2_6, M4(1.680e-02, 1.039e-03, 5.104e-02, -1.713e-01, 2.749e-03, 4.469e-03, -4.546e-02, 1.381e-02, -6.014e-03, 1.247e-04, -6.902e-03, 6.958e-02, -5.066e-02, -6.274e-03, 2.876e-02, -1.837e-01)); + r += mul(s2_7, M4(1.057e-02, -2.665e-02, 8.209e-02, 2.316e-01, 3.331e-02, 3.507e-03, -1.734e-01, -1.194e-01, -9.633e-03, 4.334e-03, 4.570e-02, -3.032e-02, 1.151e-02, -4.714e-03, -8.234e-03, -2.184e-02)); + r += mul(s2_8, M4(2.067e-02, -3.817e-03, -2.124e-02, -3.790e-02, -1.628e-03, 1.466e-02, -1.040e-02, -4.732e-02, 8.216e-03, -3.982e-03, -2.452e-02, 3.031e-03, -3.218e-03, 5.065e-03, -2.036e-02, -4.540e-03)); + r += mul(s3_0, M4(-1.121e-02, 6.935e-03, 8.246e-03, -1.607e-02, 4.960e-03, 1.605e-02, 3.055e-03, -1.948e-02, -1.705e-02, 3.543e-02, 3.453e-02, -2.897e-03, 8.019e-02, 1.047e-01, 3.947e-03, -5.653e-02)); + r += mul(s3_1, M4(-1.800e-02, -1.445e-02, -1.291e-02, 4.545e-03, 1.890e-01, 1.792e-01, -1.108e-02, -3.760e-02, -5.770e-01, -4.943e-01, 5.098e-01, 2.238e-01, 7.838e-02, 3.965e-02, 2.951e-02, 7.738e-03)); + r += mul(s3_2, M4(-3.283e-03, -4.729e-02, -8.269e-03, 1.385e-03, -2.860e-02, -7.765e-02, 4.138e-02, 9.117e-04, -1.147e-02, -2.068e-01, -6.331e-03, 2.325e-01, 1.822e-02, 2.032e-02, -2.723e-03, -8.994e-04)); + r += mul(s3_3, M4(-6.536e-03, -3.618e-02, -7.814e-02, 6.080e-02, -6.788e-02, -5.059e-04, -2.543e-02, 5.836e-02, 7.723e-02, -2.090e-02, 1.357e-01, 1.821e-01, 2.609e-01, 1.207e-02, 2.234e-01, 2.822e-01)); + r += mul(s3_4, M4(-2.409e-01, 6.348e-01, 3.062e-01, -1.282e-01, -3.467e-01, -1.607e-01, -4.471e-03, 2.832e-01, 2.496e-01, 2.512e-01, -1.490e-01, -2.456e-01, -2.036e-01, -2.331e-01, -5.261e-02, -1.896e-01)); + r += mul(s3_5, M4(4.482e-02, -5.530e-02, -2.249e-02, 8.728e-03, 2.920e-01, -4.287e-01, -1.998e-01, 3.981e-01, -8.622e-02, -9.097e-02, -2.153e-02, -2.622e-02, 2.039e-03, -3.998e-02, 1.589e-02, -4.862e-03)); + r += mul(s3_6, M4(1.152e-02, -4.285e-02, 1.577e-01, -1.897e-01, -7.030e-03, 3.144e-03, -4.456e-02, 1.236e-02, -6.315e-03, 9.912e-04, -1.745e-02, 6.373e-02, -3.957e-02, -1.127e-02, 2.343e-02, -1.559e-01)); + r += mul(s3_7, M4(2.342e-02, -1.236e-02, -6.990e-02, 1.352e-01, 1.165e-02, 3.656e-03, -1.004e-01, -1.514e-01, -1.951e-02, -2.067e-04, 3.870e-02, -4.895e-02, 1.210e-02, -2.797e-03, -5.429e-02, 3.699e-02)); + r += mul(s3_8, M4(2.117e-02, 1.253e-02, -2.078e-02, -3.665e-03, -3.600e-02, 1.398e-02, -2.210e-02, -9.164e-02, 8.846e-04, 2.017e-04, -1.795e-02, 1.074e-02, -1.653e-03, 6.362e-03, -7.357e-03, -2.392e-02)); + r += V4(-1.409e-03, -1.878e-03, -5.303e-04, -8.141e-04); + return tanh(r); +} + +void Pass10(uint2 blockStart, uint3 tid) { + float2 pt = float2(GetInputPt()); + uint2 gxy = (Rmp8x8(tid.x) << 1) + blockStart; + uint2 size = GetOutputSize(); + if (gxy.x >= size.x || gxy.y >= size.y) { + return; + } + float2 pos = ((gxy >> 1) + 0.5) * pt; + + V4 s0_0 = l0(-1.0, -1.0); + V4 s0_1 = l0(0.0, -1.0); + V4 s0_2 = l0(1.0, -1.0); + V4 s0_3 = l0(-1.0, 0.0); + V4 s0_4 = l0(0.0, 0.0); + V4 s0_5 = l0(1.0, 0.0); + V4 s0_6 = l0(-1.0, 1.0); + V4 s0_7 = l0(0.0, 1.0); + V4 s0_8 = l0(1.0, 1.0); + V4 s1_0 = -max(-s0_0, 0.0); + V4 s1_1 = -max(-s0_1, 0.0); + V4 s1_2 = -max(-s0_2, 0.0); + V4 s1_3 = -max(-s0_3, 0.0); + V4 s1_4 = -max(-s0_4, 0.0); + V4 s1_5 = -max(-s0_5, 0.0); + V4 s1_6 = -max(-s0_6, 0.0); + V4 s1_7 = -max(-s0_7, 0.0); + V4 s1_8 = -max(-s0_8, 0.0); + s0_0 = max(s0_0, 0.0); + s0_1 = max(s0_1, 0.0); + s0_2 = max(s0_2, 0.0); + s0_3 = max(s0_3, 0.0); + s0_4 = max(s0_4, 0.0); + s0_5 = max(s0_5, 0.0); + s0_6 = max(s0_6, 0.0); + s0_7 = max(s0_7, 0.0); + s0_8 = max(s0_8, 0.0); + + V4 s2_0 = l1(-1.0, -1.0); + V4 s2_1 = l1(0.0, -1.0); + V4 s2_2 = l1(1.0, -1.0); + V4 s2_3 = l1(-1.0, 0.0); + V4 s2_4 = l1(0.0, 0.0); + V4 s2_5 = l1(1.0, 0.0); + V4 s2_6 = l1(-1.0, 1.0); + V4 s2_7 = l1(0.0, 1.0); + V4 s2_8 = l1(1.0, 1.0); + V4 s3_0 = -max(-s2_0, 0.0); + V4 s3_1 = -max(-s2_1, 0.0); + V4 s3_2 = -max(-s2_2, 0.0); + V4 s3_3 = -max(-s2_3, 0.0); + V4 s3_4 = -max(-s2_4, 0.0); + V4 s3_5 = -max(-s2_5, 0.0); + V4 s3_6 = -max(-s2_6, 0.0); + V4 s3_7 = -max(-s2_7, 0.0); + V4 s3_8 = -max(-s2_8, 0.0); + s2_0 = max(s2_0, 0.0); + s2_1 = max(s2_1, 0.0); + s2_2 = max(s2_2, 0.0); + s2_3 = max(s2_3, 0.0); + s2_4 = max(s2_4, 0.0); + s2_5 = max(s2_5, 0.0); + s2_6 = max(s2_6, 0.0); + s2_7 = max(s2_7, 0.0); + s2_8 = max(s2_8, 0.0); + + V4 r = f0(s0_0, s0_1, s0_2, s0_3, s0_4, s0_5, s0_6, s0_7, s0_8, s1_0, s1_1, s1_2, s1_3, s1_4, s1_5, s1_6, s1_7, s1_8, s2_0, s2_1, s2_2, s2_3, s2_4, s2_5, s2_6, s2_7, s2_8, s3_0, s3_1, s3_2, s3_3, s3_4, s3_5, s3_6, s3_7, s3_8); + + static const float3x3 rgb2yuv = {0.299, 0.587, 0.114, -0.169, -0.331, 0.5, 0.5, -0.419, -0.081}; + static const float3x3 yuv2rgb = {1, -0.00093, 1.401687, 1, -0.3437, -0.71417, 1, 1.77216, 0.00099}; + float2 opt = float2(GetOutputPt()); + + pos -= 0.5f * opt; + float3 yuv = mul(rgb2yuv, INPUT.SampleLevel(SL, pos, 0).rgb); + OUTPUT[gxy] = float4(mul(yuv2rgb, float3(saturate(yuv.r + r.x), yuv.yz)), 1); + + ++gxy.x; + pos.x += opt.x; + yuv = mul(rgb2yuv, INPUT.SampleLevel(SL, pos, 0).rgb); + OUTPUT[gxy] = float4(mul(yuv2rgb, float3(saturate(yuv.r + r.y), yuv.yz)), 1); + + ++gxy.y; + pos.y += opt.y; + yuv = mul(rgb2yuv, INPUT.SampleLevel(SL, pos, 0).rgb); + OUTPUT[gxy] = float4(mul(yuv2rgb, float3(saturate(yuv.r + r.w), yuv.yz)), 1); + + --gxy.x; + pos.x -= opt.x; + yuv = mul(rgb2yuv, INPUT.SampleLevel(SL, pos, 0).rgb); + OUTPUT[gxy] = float4(mul(yuv2rgb, float3(saturate(yuv.r + r.z), yuv.yz)), 1); +} diff --git a/src/Effects/Effects.vcxproj b/src/Effects/Effects.vcxproj index 7538cce38..f81632066 100644 --- a/src/Effects/Effects.vcxproj +++ b/src/Effects/Effects.vcxproj @@ -415,4 +415,66 @@ + + + Document + + + Document + + + Document + + + Document + + + Document + + + Document + + + Document + + + Document + + + Document + + + Document + + + Document + + + Document + + + Document + + + Document + + + Document + + + Document + + + Document + + + Document + + + Document + + + Document + + \ No newline at end of file diff --git a/src/Effects/Effects.vcxproj.filters b/src/Effects/Effects.vcxproj.filters index 9fb781e2c..927db00a6 100644 --- a/src/Effects/Effects.vcxproj.filters +++ b/src/Effects/Effects.vcxproj.filters @@ -360,6 +360,66 @@ Anime4K + + CuNNy + + + CuNNy + + + CuNNy + + + CuNNy + + + CuNNy + + + CuNNy + + + CuNNy + + + CuNNy + + + CuNNy + + + CuNNy + + + CuNNy + + + CuNNy + + + CuNNy + + + CuNNy + + + CuNNy + + + CuNNy + + + CuNNy + + + CuNNy + + + CuNNy + + + CuNNy + @@ -401,5 +461,8 @@ {0b58f073-84cb-4c38-919d-80176ae408bc} + + {9157745b-aa96-42ce-bdc6-1230dffa326b} + \ No newline at end of file From e4abc72d06c69210b76ce727d6a9a9b260521f87 Mon Sep 17 00:00:00 2001 From: Xu <34770031+Blinue@users.noreply.github.com> Date: Sun, 17 Mar 2024 15:21:06 +0800 Subject: [PATCH 112/155] =?UTF-8?q?perf:=20=E5=BB=B6=E8=BF=9F=E5=8A=A0?= =?UTF-8?q?=E8=BD=BD=20d3dcompiler=5F47.dll=20=E5=92=8C=20Magnification.dl?= =?UTF-8?q?l?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Magpie.App/Magpie.App.vcxproj | 3 ++- src/Magpie.App/Magpie.App.vcxproj.filters | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/Magpie.App/Magpie.App.vcxproj b/src/Magpie.App/Magpie.App.vcxproj index ef0b1f749..1c05525aa 100644 --- a/src/Magpie.App/Magpie.App.vcxproj +++ b/src/Magpie.App/Magpie.App.vcxproj @@ -61,6 +61,7 @@ Console kernel32.lib;ole32.lib;oleaut32.lib;user32.lib;gdi32.lib;$(OutDir).\Magpie.Core.lib;%(AdditionalDependencies) Magpie.App.def + d3dcompiler_47.dll;Magnification.dll;%(DelayLoadDLLs) @@ -648,4 +649,4 @@ - + \ No newline at end of file diff --git a/src/Magpie.App/Magpie.App.vcxproj.filters b/src/Magpie.App/Magpie.App.vcxproj.filters index 3e96dc7ee..7a285197c 100644 --- a/src/Magpie.App/Magpie.App.vcxproj.filters +++ b/src/Magpie.App/Magpie.App.vcxproj.filters @@ -222,6 +222,7 @@ Controls + From 835e3efd54c7068efbd9100ffb3cabfb68963d26 Mon Sep 17 00:00:00 2001 From: Xu <34770031+Blinue@users.noreply.github.com> Date: Sun, 17 Mar 2024 18:39:01 +0800 Subject: [PATCH 113/155] =?UTF-8?q?feat:=20=E8=B0=83=E8=AF=95=E6=A8=A1?= =?UTF-8?q?=E5=BC=8F=E4=B8=8D=E5=86=8D=E6=8D=95=E8=8E=B7=E5=85=89=E6=A0=87?= =?UTF-8?q?=EF=BC=8C=E4=B8=94=E7=BC=A9=E6=94=BE=E7=AA=97=E5=8F=A3=E5=8F=AF?= =?UTF-8?q?=E4=BB=A5=E6=8B=A6=E6=88=AA=E9=BC=A0=E6=A0=87=E7=82=B9=E5=87=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Magpie.Core/CursorManager.cpp | 79 +++++++++++++++++-------------- src/Magpie.Core/ScalingWindow.cpp | 11 +++-- 2 files changed, 51 insertions(+), 39 deletions(-) diff --git a/src/Magpie.Core/CursorManager.cpp b/src/Magpie.Core/CursorManager.cpp index 6b449c07f..105af306d 100644 --- a/src/Magpie.Core/CursorManager.cpp +++ b/src/Magpie.Core/CursorManager.cpp @@ -11,8 +11,9 @@ namespace Magpie::Core { -// 将源窗口的光标位置映射到缩放后的光标位置 -// 当光标位于源窗口之外,与源窗口的距离不会缩放 +// 将源窗口的光标位置映射到缩放后的光标位置。当光标位于源窗口之外,与源窗口的距离不会缩放。 +// 对于光标,第一个像素映射到第一个像素,最后一个像素映射到最后一个像素,因此光标区域的缩放 +// 倍率和窗口缩放倍率不同! static POINT SrcToScaling(POINT pt) noexcept { const Renderer& renderer = ScalingWindow::Get().Renderer(); const RECT& srcRect = renderer.SrcRect(); @@ -109,11 +110,12 @@ void CursorManager::Update() noexcept { _hCursor = NULL; _cursorPos = { std::numeric_limits::max(),std::numeric_limits::max() }; - if (!ScalingWindow::Get().Options().IsDrawCursor()) { + const ScalingOptions& options = ScalingWindow::Get().Options(); + if (!options.IsDrawCursor()) { return; } - if (!_isUnderCapture) { + if (!options.IsDebugMode() && !_isUnderCapture) { // 不处于捕获状态如果叠加层已开启也更新光标位置 if (!(_isOnScalingWindow && ScalingWindow::Get().Renderer().IsOverlayVisible())) { return; @@ -317,12 +319,25 @@ void CursorManager::_UpdateCursorClip() noexcept { const RECT& destRect = renderer.DestRect(); // 优先级: - // 1. 断点模式:不限制,捕获/取消捕获,支持 UI + // 1. 断点模式:不限制,不捕获,支持 UI // 2. 在 3D 游戏中限制光标:每帧都限制一次,不退出捕获,因此无法使用 UI,不支持多屏幕 // 3. 常规:根据多屏幕限制光标,捕获/取消捕获,支持 UI 和多屏幕 const ScalingOptions& options = ScalingWindow::Get().Options(); - if (!options.IsDebugMode() && options.Is3DGameMode()) { + if (options.IsDebugMode()) { + if (_isCapturedOnOverlay) { + // 光标被叠加层捕获时将光标限制在输出区域内 + _curClips = destRect; + ClipCursor(&destRect); + } else if (_curClips != RECT{}) { + _curClips = {}; + ClipCursor(nullptr); + } + + return; + } + + if (options.Is3DGameMode()) { // 开启“在 3D 游戏中限制光标”则每帧都限制一次光标 _curClips = srcRect; ClipCursor(&srcRect); @@ -421,7 +436,27 @@ void CursorManager::_UpdateCursorClip() noexcept { // 主窗口未被遮挡 POINT newCursorPos = ScalingToSrc(cursorPos); - if (!PtInRect(&srcRect, newCursorPos)) { + if (PtInRect(&srcRect, newCursorPos)) { + bool startCapture = !_isOnOverlay; + + if (startCapture) { + // 判断源窗口是否被遮挡 + hwndCur = WindowFromPoint(hwndScaling, scalingRect, newCursorPos, true); + startCapture = hwndCur == hwndSrc || ((IsChild(hwndSrc, hwndCur) && (GetWindowStyle(hwndCur) & WS_CHILD))); + } + + if (startCapture) { + if (!(style & WS_EX_TRANSPARENT)) { + SetWindowLongPtr(hwndScaling, GWL_EXSTYLE, style | WS_EX_TRANSPARENT); + } + + _StartCapture(cursorPos); + } else { + if (style | WS_EX_TRANSPARENT) { + SetWindowLongPtr(hwndScaling, GWL_EXSTYLE, style & ~WS_EX_TRANSPARENT); + } + } + } else { // 跳过黑边 if (_isOnOverlay) { // 从内部移到外部 @@ -449,7 +484,7 @@ void CursorManager::_UpdateCursorClip() noexcept { } } else { // 从外部移到内部 - const POINT clampedPos { + const POINT clampedPos{ std::clamp(cursorPos.x, destRect.left, destRect.right - 1), std::clamp(cursorPos.y, destRect.top, destRect.bottom - 1) }; @@ -467,34 +502,10 @@ void CursorManager::_UpdateCursorClip() noexcept { } } } - } else { - bool startCapture = !_isOnOverlay; - - if (startCapture) { - // 判断源窗口是否被遮挡 - hwndCur = WindowFromPoint(hwndScaling, scalingRect, newCursorPos, true); - startCapture = hwndCur == hwndSrc || ((IsChild(hwndSrc, hwndCur) && (GetWindowStyle(hwndCur) & WS_CHILD))); - } - - if (startCapture) { - if (!(style & WS_EX_TRANSPARENT)) { - SetWindowLongPtr(hwndScaling, GWL_EXSTYLE, style | WS_EX_TRANSPARENT); - } - - _StartCapture(cursorPos); - } else { - if (style | WS_EX_TRANSPARENT) { - SetWindowLongPtr(hwndScaling, GWL_EXSTYLE, style & ~WS_EX_TRANSPARENT); - } - } } } } - if (options.IsDebugMode()) { - return; - } - if (!_isUnderCapture && !_isOnOverlay) { return; } @@ -542,8 +553,6 @@ void CursorManager::_StartCapture(POINT cursorPos) noexcept { return; } - OutputDebugString(L"start"); - const Renderer& renderer = ScalingWindow::Get().Renderer(); const RECT& srcRect = renderer.SrcRect(); const RECT& destRect = renderer.DestRect(); @@ -585,8 +594,6 @@ void CursorManager::_StopCapture(POINT cursorPos, bool onDestroy) noexcept { return; } - OutputDebugString(L"stop"); - if (_curClips != RECT{}) { _curClips = {}; ClipCursor(nullptr); diff --git a/src/Magpie.Core/ScalingWindow.cpp b/src/Magpie.Core/ScalingWindow.cpp index ba5e54364..a73e719b5 100644 --- a/src/Magpie.Core/ScalingWindow.cpp +++ b/src/Magpie.Core/ScalingWindow.cpp @@ -116,7 +116,7 @@ bool ScalingWindow::Create(HINSTANCE hInstance, HWND hwndSrc, ScalingOptions&& o Logger::Get().Error("CalcWndRect 失败"); return false; } - + if (!_options.IsAllowScalingMaximized()) { // 源窗口和缩放窗口重合则不缩放,此时源窗口可能是无边框全屏窗口 RECT srcRect{}; @@ -145,8 +145,8 @@ bool ScalingWindow::Create(HINSTANCE hInstance, HWND hwndSrc, ScalingOptions&& o }(hInstance); CreateWindowEx( - (_options.IsDebugMode() ? 0 : WS_EX_TOPMOST) | WS_EX_NOACTIVATE - | WS_EX_LAYERED | WS_EX_NOREDIRECTIONBITMAP | WS_EX_TRANSPARENT | WS_EX_TOOLWINDOW, + (_options.IsDebugMode() ? 0 : WS_EX_TOPMOST | WS_EX_TRANSPARENT) | WS_EX_LAYERED | WS_EX_TOOLWINDOW | WS_EX_NOACTIVATE + | WS_EX_NOREDIRECTIONBITMAP, CommonSharedConstants::SCALING_WINDOW_CLASS_NAME, L"Magpie", WS_POPUP | (monitors == 1 ? WS_MAXIMIZE : 0), @@ -202,6 +202,11 @@ bool ScalingWindow::Create(HINSTANCE hInstance, HWND hwndSrc, ScalingOptions&& o SWP_SHOWWINDOW | SWP_NOCOPYBITS | SWP_NOREDRAW ); + // 为了方便调试,调试模式下使缩放窗口显示在源窗口下面 + if (_options.IsDebugMode()) { + BringWindowToTop(_hwndSrc); + } + return true; } From 3e2dc9681a2f8fbb42311d7f9c0c6b789a2ba03f Mon Sep 17 00:00:00 2001 From: Xu <34770031+Blinue@users.noreply.github.com> Date: Mon, 18 Mar 2024 21:01:31 +0800 Subject: [PATCH 114/155] =?UTF-8?q?feat:=20=E5=AE=9E=E7=8E=B0=203D=20?= =?UTF-8?q?=E6=B8=B8=E6=88=8F=E6=A8=A1=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Magpie.Core/CursorManager.cpp | 8 +++++++ src/Magpie.Core/OverlayDrawer.cpp | 40 +++++++++++++++++++++++++++---- src/Magpie.Core/OverlayDrawer.h | 6 ++--- src/Magpie.Core/ScalingWindow.cpp | 15 +++++++++--- 4 files changed, 57 insertions(+), 12 deletions(-) diff --git a/src/Magpie.Core/CursorManager.cpp b/src/Magpie.Core/CursorManager.cpp index 105af306d..6091e41e3 100644 --- a/src/Magpie.Core/CursorManager.cpp +++ b/src/Magpie.Core/CursorManager.cpp @@ -115,6 +115,14 @@ void CursorManager::Update() noexcept { return; } + if (options.Is3DGameMode()) { + // 3D 游戏模式下如果前台窗口不是源窗口或缩放窗口则不绘制光标 + HWND hwndFore = GetForegroundWindow(); + if (hwndFore != ScalingWindow::Get().Handle() && hwndFore != ScalingWindow::Get().HwndSrc()) { + return; + } + } + if (!options.IsDebugMode() && !_isUnderCapture) { // 不处于捕获状态如果叠加层已开启也更新光标位置 if (!(_isOnScalingWindow && ScalingWindow::Get().Renderer().IsOverlayVisible())) { diff --git a/src/Magpie.Core/OverlayDrawer.cpp b/src/Magpie.Core/OverlayDrawer.cpp index 826199b60..ec1674c8b 100644 --- a/src/Magpie.Core/OverlayDrawer.cpp +++ b/src/Magpie.Core/OverlayDrawer.cpp @@ -156,10 +156,22 @@ static SmallVector GenerateTimelineColors(const std::vector& effectTimings) noexcept { return needRedraw; } -void OverlayDrawer::_EnableSrcWnd(bool /*enable*/) noexcept { -} - const std::string& OverlayDrawer::_GetResourceString(const std::wstring_view& key) noexcept { static phmap::flat_hash_map cache; diff --git a/src/Magpie.Core/OverlayDrawer.h b/src/Magpie.Core/OverlayDrawer.h index ba8ff586b..b6eb079e9 100644 --- a/src/Magpie.Core/OverlayDrawer.h +++ b/src/Magpie.Core/OverlayDrawer.h @@ -13,6 +13,8 @@ class OverlayDrawer { OverlayDrawer(const OverlayDrawer&) = delete; OverlayDrawer(OverlayDrawer&&) = delete; + ~OverlayDrawer(); + bool Initialize(DeviceResources* deviceResources) noexcept; void Draw(uint32_t count, const SmallVector& effectTimings) noexcept; @@ -56,8 +58,6 @@ class OverlayDrawer { bool _DrawUI(const SmallVector& effectTimings) noexcept; - void _EnableSrcWnd(bool enable) noexcept; - const std::string& _GetResourceString(const std::wstring_view& key) noexcept; float _dpiScale = 1.0f; @@ -85,8 +85,6 @@ class OverlayDrawer { winrt::ResourceLoader _resourceLoader{ nullptr }; bool _isUIVisiable = false; - bool _isSrcMainWnd = false; - bool _isFirstFrame = true; }; diff --git a/src/Magpie.Core/ScalingWindow.cpp b/src/Magpie.Core/ScalingWindow.cpp index a73e719b5..1ab3baaed 100644 --- a/src/Magpie.Core/ScalingWindow.cpp +++ b/src/Magpie.Core/ScalingWindow.cpp @@ -215,7 +215,6 @@ void ScalingWindow::Render() noexcept { if (srcState != 0) { Logger::Get().Info("源窗口状态改变,退出全屏"); Destroy(); - //MagApp::Get().Stop(srcState == 2); return; } @@ -236,6 +235,10 @@ LRESULT ScalingWindow::_MessageHandler(UINT msg, WPARAM wParam, LPARAM lParam) n case WM_LBUTTONDOWN: case WM_RBUTTONDOWN: { + if (_options.Is3DGameMode()) { + break; + } + // 在以下情况下会收到光标消息: // 1、未捕获光标且缩放后的位置未被遮挡而缩放前的位置被遮挡 // 2、光标位于叠加层上 @@ -303,8 +306,14 @@ LRESULT ScalingWindow::_MessageHandler(UINT msg, WPARAM wParam, LPARAM lParam) n int ScalingWindow::_CheckSrcState() const noexcept { if (!_options.IsDebugMode()) { HWND hwndForeground = GetForegroundWindow(); - // 在 3D 游戏模式下打开游戏内叠加层则全屏窗口可以接收焦点 - if (!_options.Is3DGameMode() /*|| !IsUIVisible()*/|| hwndForeground != _hWnd) { + + // 3D 游戏模式下打开叠加层后如果源窗口意外回到前台应关闭叠加层 + if (_options.Is3DGameMode() && _renderer->IsOverlayVisible() && hwndForeground == _hwndSrc) { + _renderer->IsOverlayVisible(false); + } + + // 在 3D 游戏模式下打开叠加层则全屏窗口可以接收焦点 + if (!_options.Is3DGameMode() || !_renderer->IsOverlayVisible() || hwndForeground != _hWnd) { if (hwndForeground && hwndForeground != _hwndSrc && !_CheckForeground(hwndForeground)) { Logger::Get().Info("前台窗口已改变"); return 1; From 3b56159cc927aea327169ded20d0da7aa87770cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=97=AD?= Date: Tue, 19 Mar 2024 13:40:24 +0800 Subject: [PATCH 115/155] =?UTF-8?q?feat:=20=E5=88=9D=E6=AD=A5=E5=AE=9E?= =?UTF-8?q?=E7=8E=B0=20FPS=20=E6=98=BE=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Magpie.Core/OverlayDrawer.cpp | 102 ++++++++++++++++++++++++++++-- src/Magpie.Core/OverlayDrawer.h | 11 ++-- src/Magpie.Core/Renderer.cpp | 18 ++++-- src/Magpie.Core/StepTimer.cpp | 19 ++---- src/Magpie.Core/StepTimer.h | 9 ++- 5 files changed, 127 insertions(+), 32 deletions(-) diff --git a/src/Magpie.Core/OverlayDrawer.cpp b/src/Magpie.Core/OverlayDrawer.cpp index ec1674c8b..59c3a5d3d 100644 --- a/src/Magpie.Core/OverlayDrawer.cpp +++ b/src/Magpie.Core/OverlayDrawer.cpp @@ -15,6 +15,8 @@ #include "ImGuiFontsCacheManager.h" #include "ScalingWindow.h" +using namespace std::chrono; + namespace Magpie::Core { static const char* COLOR_INDICATOR = "■"; @@ -214,7 +216,11 @@ bool OverlayDrawer::Initialize(DeviceResources* deviceResources) noexcept { return true; } -void OverlayDrawer::Draw(uint32_t count, const SmallVector& effectTimings) noexcept { +void OverlayDrawer::Draw( + uint32_t count, + uint32_t fps, + const SmallVector& effectTimings +) noexcept { bool isShowFPS = ScalingWindow::Get().Options().IsShowFPS(); if (!_isUIVisiable && !isShowFPS) { @@ -222,9 +228,9 @@ void OverlayDrawer::Draw(uint32_t count, const SmallVector& effectTimings } if (_isFirstFrame) { - // 刚显示时需连续渲染三帧:第一帧不会显示,第二帧不会将窗口限制在视口内 + // 刚显示时需连续渲染两帧才能显示 _isFirstFrame = false; - count = 3; + ++count; } // 很多时候需要多次渲染避免呈现中间状态,但最多只渲染 10 次 @@ -232,7 +238,7 @@ void OverlayDrawer::Draw(uint32_t count, const SmallVector& effectTimings _imguiImpl.NewFrame(); if (isShowFPS) { - _DrawFPS(); + _DrawFPS(fps); } if (_isUIVisiable) { @@ -682,7 +688,89 @@ void OverlayDrawer::_DrawTimelineItem( } } -void OverlayDrawer::_DrawFPS() noexcept { +void OverlayDrawer::_DrawFPS(uint32_t fps) noexcept { + static float oldOpacity = 0.0f; + static float opacity = 0.0f; + static bool isLocked = false; + // 背景透明时绘制阴影 + const bool drawShadow = opacity < 1e-5f; + + static constexpr float PADDING_X = 5; + static constexpr float PADDING_Y = 1; + + ImGui::SetNextWindowPos(ImVec2(10, 10), ImGuiCond_FirstUseEver); + ImGui::SetNextWindowBgAlpha(opacity); + + ImGui::PushStyleVar(ImGuiStyleVar_WindowBorderSize, 0.0f); + ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, drawShadow ? ImVec2() : ImVec2(PADDING_X, PADDING_Y)); + if (!ImGui::Begin("FPS", nullptr, ImGuiWindowFlags_NoNav | ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoDecoration | ImGuiWindowFlags_NoFocusOnAppearing | (isLocked ? ImGuiWindowFlags_NoMove : 0) | (drawShadow ? ImGuiWindowFlags_NoBackground : 0))) { + // Early out if the window is collapsed, as an optimization. + ImGui::End(); + return; + } + + if (oldOpacity != opacity) { + // 透明时无边距,确保文字位置不变 + if (oldOpacity < 1e-5f) { + if (opacity >= 1e-5f) { + ImVec2 windowPos = ImGui::GetWindowPos(); + ImGui::SetWindowPos(ImVec2(windowPos.x - PADDING_X, windowPos.y - PADDING_Y)); + } + } else { + if (opacity < 1e-5f) { + ImVec2 windowPos = ImGui::GetWindowPos(); + ImGui::SetWindowPos(ImVec2(windowPos.x + PADDING_X, windowPos.y + PADDING_Y)); + } + } + oldOpacity = opacity; + } + + ImGui::PushFont(_fontFPS); + + ImVec2 cursorPos = ImGui::GetCursorPos(); + // 不知为何文字无法竖直居中,因此这里调整位置 + cursorPos.y -= 3; + ImGui::SetCursorPosY(cursorPos.y); + + std::string fpsStr = fmt::format("{} FPS", fps); + if (drawShadow) { + ImGui::SetCursorPos(ImVec2(cursorPos.x + 1.0f, cursorPos.y + 1.0f)); + ImGui::PushStyleColor(ImGuiCol_Text, ImVec4(0.0f, 0.0f, 0.0f, 0.8f)); + ImGui::TextUnformatted(fpsStr.c_str()); + ImGui::PopStyleColor(); + + ImGui::SetCursorPos(cursorPos); + ImGui::PushStyleColor(ImGuiCol_Text, ImVec4(0.0f, 0.0f, 0.0f, 0.6f)); + ImGui::TextUnformatted(fpsStr.c_str()); + ImGui::PopStyleColor(); + + ImGui::SetCursorPos(cursorPos); + } + ImGui::TextUnformatted(fpsStr.c_str()); + + ImGui::PopFont(); + + ImGui::PopStyleVar(); + + if (ImGui::BeginPopupContextWindow()) { + ImGui::PushItemWidth(150 * _dpiScale); + ImGui::PushFont(_fontMonoNumbers); + ImGui::SliderFloat("##FPS_Opacity", &opacity, 0.0f, 1.0f); + ImGui::PopFont(); + ImGui::SameLine(); + ImGui::TextUnformatted(_GetResourceString(L"Overlay_FPS_Opacity").c_str()); + ImGui::Separator(); + const std::string& lockStr = _GetResourceString(isLocked ? L"Overlay_FPS_Unlock" : L"Overlay_FPS_Lock"); + if (ImGui::MenuItem(lockStr.c_str(), nullptr, nullptr)) { + isLocked = !isLocked; + } + ImGui::PopItemWidth(); + + ImGui::EndPopup(); + } + + ImGui::End(); + ImGui::PopStyleVar(); } // 返回 true 表示应再渲染一次 @@ -696,7 +784,6 @@ bool OverlayDrawer::_DrawUI(const SmallVector& effectTimings) noexcept { // effectTimings 为空表示后端没有渲染新的帧 if (!effectTimings.empty()) { - using namespace std::chrono; steady_clock::time_point now = steady_clock::now(); if (_lastUpdateTime == steady_clock::time_point{}) { // 后端渲染的第一帧 @@ -766,8 +853,9 @@ bool OverlayDrawer::_DrawUI(const SmallVector& effectTimings) noexcept { ImGui::PopFont(); } ImGui::PopTextWrapPos(); - + ImGui::Spacing(); + // 效果渲染用时 const std::string& timingsStr = _GetResourceString(L"Overlay_Profiler_Timings"); if (ImGui::CollapsingHeader(timingsStr.c_str(), ImGuiTreeNodeFlags_DefaultOpen)) { const std::vector& effectInfos = renderer.EffectInfos(); diff --git a/src/Magpie.Core/OverlayDrawer.h b/src/Magpie.Core/OverlayDrawer.h index b6eb079e9..5f2579ccf 100644 --- a/src/Magpie.Core/OverlayDrawer.h +++ b/src/Magpie.Core/OverlayDrawer.h @@ -17,7 +17,11 @@ class OverlayDrawer { bool Initialize(DeviceResources* deviceResources) noexcept; - void Draw(uint32_t count, const SmallVector& effectTimings) noexcept; + void Draw( + uint32_t count, + uint32_t fps, + const SmallVector& effectTimings + ) noexcept; bool IsUIVisible() const noexcept { return _isUIVisiable; @@ -54,7 +58,7 @@ class OverlayDrawer { void _DrawTimelineItem(ImU32 color, float dpiScale, std::string_view name, float time, float effectsTotalTime, bool selected = false); - void _DrawFPS() noexcept; + void _DrawFPS(uint32_t fps) noexcept; bool _DrawUI(const SmallVector& effectTimings) noexcept; @@ -66,9 +70,6 @@ class OverlayDrawer { ImFont* _fontMonoNumbers = nullptr; // 普通 UI 文字,但数字部分是等宽的,只支持 ASCII ImFont* _fontFPS = nullptr; // FPS - std::deque _frameTimes; - uint32_t _validFrames = 0; - std::chrono::steady_clock::time_point _lastUpdateTime{}; // (总计时间, 帧数) SmallVector, 0> _effectTimingsStatistics; diff --git a/src/Magpie.Core/Renderer.cpp b/src/Magpie.Core/Renderer.cpp index b8b6759af..7f68a665e 100644 --- a/src/Magpie.Core/Renderer.cpp +++ b/src/Magpie.Core/Renderer.cpp @@ -257,8 +257,11 @@ void Renderer::_FrontendRender(uint32_t imguiFrames) noexcept { // 绘制叠加层 if (_overlayDrawer) { - SmallVector effectsTimings = _effectsProfiler.GetTimings(); - _overlayDrawer->Draw(imguiFrames, effectsTimings); + _overlayDrawer->Draw( + imguiFrames, + _stepTimer.FPS(), + _overlayDrawer->IsUIVisible() ? _effectsProfiler.GetTimings() : SmallVector() + ); } // 绘制光标 @@ -306,14 +309,19 @@ void Renderer::IsOverlayVisible(bool value) noexcept { } } + if (_overlayDrawer->IsUIVisible()) { + return; + } _overlayDrawer->SetUIVisibility(true); } else { if (_overlayDrawer) { + if (!_overlayDrawer->IsUIVisible()) { + return; + } _overlayDrawer->SetUIVisibility(false); } } - // 初始化 EffectsProfiler _backendThreadDispatcher.TryEnqueue([this, isVisible(_overlayDrawer->IsUIVisible())]() { if (isVisible) { uint32_t passCount = 0; @@ -326,8 +334,8 @@ void Renderer::IsOverlayVisible(bool value) noexcept { } }); - // 立即渲染一帧 - _FrontendRender(); + // 立即渲染一帧,但 ImGui 需渲染两次才能将窗口限制在视口内 + _FrontendRender(value ? 2 : 1); } bool Renderer::IsOverlayVisible() noexcept { diff --git a/src/Magpie.Core/StepTimer.cpp b/src/Magpie.Core/StepTimer.cpp index d36490daa..e5c2fe9ee 100644 --- a/src/Magpie.Core/StepTimer.cpp +++ b/src/Magpie.Core/StepTimer.cpp @@ -21,8 +21,10 @@ bool StepTimer::NewFrame(bool isDupFrame) noexcept { const nanoseconds rest = *_minInterval - delta; if (rest > 1ms) { // Sleep 精度太低,我们使用 WaitableTimer 睡眠 - LARGE_INTEGER liDueTime; - liDueTime.QuadPart = (rest - 1ms).count() / -100; + // 负值表示相对时间 + LARGE_INTEGER liDueTime{ + .QuadPart = (rest - 1ms).count() / -100 + }; SetWaitableTimerEx(_hTimer.get(), &liDueTime, 0, NULL, NULL, 0, 0); WaitForSingleObject(_hTimer.get(), INFINITE); } else { @@ -32,13 +34,8 @@ bool StepTimer::NewFrame(bool isDupFrame) noexcept { return false; } - - _elapsedTime = delta; - if (_minInterval) { - _lastFrameTime = now - delta % *_minInterval; - } else { - _lastFrameTime = now; - } + + _lastFrameTime = _minInterval ? now - delta % *_minInterval : now; // 更新当前帧率,不计重复帧 if (!isDupFrame) { @@ -48,11 +45,9 @@ bool StepTimer::NewFrame(bool isDupFrame) noexcept { _fpsCounter += delta; if (_fpsCounter >= 1s) { - _framesPerSecond = _framesThisSecond; + _framesPerSecond.store(_framesThisSecond, std::memory_order_relaxed); _framesThisSecond = 0; _fpsCounter %= 1s; - - OutputDebugString(fmt::format(L"fps: {}\n", _framesPerSecond).c_str()); } return true; diff --git a/src/Magpie.Core/StepTimer.h b/src/Magpie.Core/StepTimer.h index d0b692b4a..45b226690 100644 --- a/src/Magpie.Core/StepTimer.h +++ b/src/Magpie.Core/StepTimer.h @@ -18,15 +18,18 @@ class StepTimer { return _frameCount; } + // 从前端线程调用 + uint32_t FPS() const noexcept { + return _framesPerSecond.load(std::memory_order_relaxed); + } + private: std::optional _minInterval; std::chrono::time_point _lastFrameTime; - // 上一帧的渲染时间 - std::chrono::nanoseconds _elapsedTime{}; uint32_t _frameCount = 0; - uint32_t _framesPerSecond = 0; + std::atomic _framesPerSecond = 0; uint32_t _framesThisSecond = 0; std::chrono::nanoseconds _fpsCounter{}; From 9da3c6cc5e73406cf2cff556e6e93e2a13616777 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=97=AD?= Date: Tue, 19 Mar 2024 15:58:53 +0800 Subject: [PATCH 116/155] =?UTF-8?q?feat:=20=E4=BC=98=E5=8C=96=20FPS=20?= =?UTF-8?q?=E6=98=BE=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Magpie.Core/ImGuiImpl.cpp | 87 ----------------------------------- src/Magpie.Core/Renderer.cpp | 28 +++++++---- src/Magpie.Core/Renderer.h | 3 +- 3 files changed, 20 insertions(+), 98 deletions(-) diff --git a/src/Magpie.Core/ImGuiImpl.cpp b/src/Magpie.Core/ImGuiImpl.cpp index 33488bec5..8d2000311 100644 --- a/src/Magpie.Core/ImGuiImpl.cpp +++ b/src/Magpie.Core/ImGuiImpl.cpp @@ -14,66 +14,11 @@ namespace Magpie::Core { ImGuiImpl::~ImGuiImpl() noexcept { - /*MagApp::Get().UnregisterWndProcHandler(_handlerId); - - if (_hHookThread) { - PostThreadMessage(_hookThreadId, WM_QUIT, 0, 0); - WaitForSingleObject(_hHookThread, 1000); - }*/ - if (ImGui::GetCurrentContext()) { ImGui::DestroyContext(); } } -/* - -static LRESULT CALLBACK LowLevelMouseProc( - _In_ int nCode, - _In_ WPARAM wParam, - _In_ LPARAM lParam -) { - if (nCode != HC_ACTION || !ImGui::GetIO().WantCaptureMouse) { - return CallNextHookEx(NULL, nCode, wParam, lParam); - } - - if (wParam == WM_MOUSEWHEEL || wParam == WM_MOUSEHWHEEL) { - // 向主线程发送滚动数据 - // 使用 Windows 消息进行线程同步 - PostMessage(MagApp::Get().GetHwndHost(), (UINT)wParam, ((MSLLHOOKSTRUCT*)lParam)->mouseData, 0); - - // 阻断滚轮消息,防止传给源窗口 - return -1; - } else if (wParam >= WM_LBUTTONDOWN && wParam <= WM_RBUTTONUP) { - PostMessage(MagApp::Get().GetHwndHost(), (UINT)wParam, 0, 0); - - // 阻断点击消息,防止传给源窗口 - return -1; - } else { - return CallNextHookEx(NULL, nCode, wParam, lParam); - } -} - -static DWORD WINAPI ThreadProc(LPVOID lpThreadParameter) { - HHOOK hook = SetWindowsHookEx(WH_MOUSE_LL, LowLevelMouseProc, NULL, 0); - if (!hook) { - Logger::Get().Win32Error("注册鼠标钩子失败"); - return 1; - } - - Logger::Get().Info("已注册鼠标钩子"); - - // 鼠标钩子需要消息循环 - MSG msg; - while (GetMessage(&msg, NULL, 0, 0)) { - TranslateMessage(&msg); - DispatchMessage(&msg); - } - UnhookWindowsHookEx(hook); - Logger::Get().Info("已销毁鼠标钩子"); - return 0; -} -*/ bool ImGuiImpl::Initialize(DeviceResources* deviceResources) noexcept { #ifdef _DEBUG // 检查 ImGUI 版本是否匹配 @@ -96,16 +41,6 @@ bool ImGuiImpl::Initialize(DeviceResources* deviceResources) noexcept { return false; } - /*_handlerId = MagApp::Get().RegisterWndProcHandler(WndProcHandler); - - // 断点模式下不注册鼠标钩子,否则调试时鼠标无法使用 - if (!MagApp::Get().GetOptions().IsDebugMode() && !MagApp::Get().GetOptions().Is3DGameMode()) { - _hHookThread = CreateThread(nullptr, 0, ThreadProc, nullptr, 0, &_hookThreadId); - if (!_hHookThread) { - Logger::Get().Win32Error("创建线程失败"); - } - }*/ - return true; } @@ -205,28 +140,6 @@ void ImGuiImpl::Tooltip(const char* content, float maxWidth) noexcept { void ImGuiImpl::_UpdateMousePos() noexcept { ImGuiIO& io = ImGui::GetIO(); - /*if (ScalingWindow::Get().Options().Is3DGameMode() && !MagApp::Get().GetRenderer().IsUIVisible()) { - io.MousePos = ImVec2(-FLT_MAX, -FLT_MAX); - return; - } - - POINT pos; - CursorManager& cm = MagApp::Get().GetCursorManager(); - if (cm.HasCursor()) { - pos = *cm.GetCursorPos(); - } else { - GetCursorPos(&pos); - - if (WindowFromPoint(pos) != MagApp::Get().GetHwndHost()) { - io.MousePos = ImVec2(-FLT_MAX, -FLT_MAX); - return; - } - - const RECT& hostRect = MagApp::Get().GetHostWndRect(); - pos.x -= hostRect.left; - pos.y -= hostRect.top; - }*/ - const POINT cursorPos = ScalingWindow::Get().CursorManager().CursorPos(); if (cursorPos.x == std::numeric_limits::max()) { // 无光标 diff --git a/src/Magpie.Core/Renderer.cpp b/src/Magpie.Core/Renderer.cpp index 7f68a665e..c3003332d 100644 --- a/src/Magpie.Core/Renderer.cpp +++ b/src/Magpie.Core/Renderer.cpp @@ -124,10 +124,9 @@ void Renderer::MessageHandler(UINT msg, WPARAM wParam, LPARAM lParam) noexcept { _overlayDrawer->MessageHandler(msg, wParam, lParam); // 有些鼠标操作需要渲染 ImGui 多次,见 https://github.com/ocornut/imgui/issues/2268 - if (msg == WM_LBUTTONDOWN || msg == WM_RBUTTONDOWN || msg == WM_MOUSEWHEEL || msg == WM_MOUSEHWHEEL) { + if (msg == WM_LBUTTONDOWN || msg == WM_RBUTTONDOWN || msg == WM_MOUSEWHEEL || + msg == WM_MOUSEHWHEEL || msg == WM_LBUTTONUP || msg == WM_RBUTTONUP) { _FrontendRender(); - } else if (msg == WM_LBUTTONUP || msg == WM_RBUTTONUP) { - _FrontendRender(2); } } } @@ -206,8 +205,7 @@ bool Renderer::_CreateSwapChain() noexcept { return true; } -// 有些操作需要渲染 ImGui 多次 -void Renderer::_FrontendRender(uint32_t imguiFrames) noexcept { +void Renderer::_FrontendRender() noexcept { WaitForSingleObjectEx(_frameLatencyWaitableObject.get(), 1000, TRUE); ID3D11DeviceContext4* d3dDC = _frontendResources.GetD3DDC(); @@ -257,8 +255,9 @@ void Renderer::_FrontendRender(uint32_t imguiFrames) noexcept { // 绘制叠加层 if (_overlayDrawer) { + // ImGui 至少渲染两遍,否则经常有布局错误 _overlayDrawer->Draw( - imguiFrames, + 2, _stepTimer.FPS(), _overlayDrawer->IsUIVisible() ? _effectsProfiler.GetTimings() : SmallVector() ); @@ -278,6 +277,7 @@ void Renderer::Render() noexcept { const CursorManager& cursorManager = ScalingWindow::Get().CursorManager(); const HCURSOR hCursor = cursorManager.Cursor(); const POINT cursorPos = cursorManager.CursorPos(); + const uint32_t fps = _stepTimer.FPS(); // 有新帧或光标改变则渲染新的帧 if (_lastAccessMutexKey == _sharedTextureMutexKey) { @@ -286,14 +286,22 @@ void Renderer::Render() noexcept { return; } + // 检查光标是否移动 if (hCursor == _lastCursorHandle && cursorPos == _lastCursorPos) { - // 光标没有移动 - return; + if (IsOverlayVisible() || ScalingWindow::Get().Options().IsShowFPS()) { + // 检查 FPS 是否变化 + if (fps == _lastFPS) { + return; + } + } else { + return; + } } } _lastCursorHandle = hCursor; _lastCursorPos = cursorPos; + _lastFPS = fps; _FrontendRender(); } @@ -334,8 +342,8 @@ void Renderer::IsOverlayVisible(bool value) noexcept { } }); - // 立即渲染一帧,但 ImGui 需渲染两次才能将窗口限制在视口内 - _FrontendRender(value ? 2 : 1); + // 立即渲染一帧 + _FrontendRender(); } bool Renderer::IsOverlayVisible() noexcept { diff --git a/src/Magpie.Core/Renderer.h b/src/Magpie.Core/Renderer.h index 974cb75da..163a20f8d 100644 --- a/src/Magpie.Core/Renderer.h +++ b/src/Magpie.Core/Renderer.h @@ -54,7 +54,7 @@ class Renderer { private: bool _CreateSwapChain() noexcept; - void _FrontendRender(uint32_t imguiFrames = 1) noexcept; + void _FrontendRender() noexcept; void _BackendThreadProc() noexcept; @@ -83,6 +83,7 @@ class Renderer { HCURSOR _lastCursorHandle = NULL; POINT _lastCursorPos{ std::numeric_limits::max(), std::numeric_limits::max() }; + uint32_t _lastFPS = std::numeric_limits::max(); winrt::com_ptr _frontendSharedTexture; winrt::com_ptr _frontendSharedTextureMutex; From 30452b889fa6033387cce88022f4844c5cbf2093 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=97=AD?= Date: Tue, 19 Mar 2024 16:20:29 +0800 Subject: [PATCH 117/155] =?UTF-8?q?chore:=20=E5=88=A0=E9=99=A4=E4=B8=8D?= =?UTF-8?q?=E5=86=8D=E4=BD=BF=E7=94=A8=E7=9A=84=E5=AD=97=E7=AC=A6=E4=B8=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Magpie.App/Resources.language-de.resw | 9 --------- src/Magpie.App/Resources.language-en-US.resw | 9 --------- src/Magpie.App/Resources.language-es.resw | 9 --------- src/Magpie.App/Resources.language-fr.resw | 9 --------- src/Magpie.App/Resources.language-it.resw | 9 --------- src/Magpie.App/Resources.language-ja.resw | 9 --------- src/Magpie.App/Resources.language-ko.resw | 9 --------- src/Magpie.App/Resources.language-pt-BR.resw | 9 --------- src/Magpie.App/Resources.language-ru.resw | 9 --------- src/Magpie.App/Resources.language-tr.resw | 9 --------- src/Magpie.App/Resources.language-uk.resw | 9 --------- src/Magpie.App/Resources.language-vi.resw | 9 --------- src/Magpie.App/Resources.language-zh-Hans.resw | 9 --------- src/Magpie.App/Resources.language-zh-Hant.resw | 9 --------- 14 files changed, 126 deletions(-) diff --git a/src/Magpie.App/Resources.language-de.resw b/src/Magpie.App/Resources.language-de.resw index 8f7837781..346996b09 100644 --- a/src/Magpie.App/Resources.language-de.resw +++ b/src/Magpie.App/Resources.language-de.resw @@ -634,12 +634,6 @@ Deckkraft - - Bildstatistiken - - - Umschalten auf Bildraten - Zu Effekten wechseln @@ -755,9 +749,6 @@ Freischalten - - Umschalten auf frame timings - Timings diff --git a/src/Magpie.App/Resources.language-en-US.resw b/src/Magpie.App/Resources.language-en-US.resw index 9f37648de..e44e21d30 100644 --- a/src/Magpie.App/Resources.language-en-US.resw +++ b/src/Magpie.App/Resources.language-en-US.resw @@ -772,15 +772,6 @@ Unlock - - Frame statistics - - - Switch to frame rates - - - Switch to frame timings - Timings diff --git a/src/Magpie.App/Resources.language-es.resw b/src/Magpie.App/Resources.language-es.resw index 46cc4b519..7a876fd8c 100644 --- a/src/Magpie.App/Resources.language-es.resw +++ b/src/Magpie.App/Resources.language-es.resw @@ -772,15 +772,6 @@ Desbloquear - - Fotogramas - - - Cambiar a tasas de fotogramas - - - Cambiar a tiempos de fotograma - Tiempos diff --git a/src/Magpie.App/Resources.language-fr.resw b/src/Magpie.App/Resources.language-fr.resw index 1eee1396d..fa4066ce8 100644 --- a/src/Magpie.App/Resources.language-fr.resw +++ b/src/Magpie.App/Resources.language-fr.resw @@ -198,12 +198,6 @@ Déverrouiller - - Statistiques d'image - - - Basculer vers les fréquences d'images - Activation @@ -258,9 +252,6 @@ Ouvrez une nouvelle fenêtre pour créer un profil - - Passage à la synchronisation des trames - Nouveau profil diff --git a/src/Magpie.App/Resources.language-it.resw b/src/Magpie.App/Resources.language-it.resw index 6880a9ee1..073805bd2 100644 --- a/src/Magpie.App/Resources.language-it.resw +++ b/src/Magpie.App/Resources.language-it.resw @@ -577,15 +577,6 @@ Blocca - - Statistiche dei frame - - - Passa alla frequenza dei fotogrammi - - - Passa ai tempi dei fotogrammi - Tempi diff --git a/src/Magpie.App/Resources.language-ja.resw b/src/Magpie.App/Resources.language-ja.resw index 09d95a53e..5a9b02150 100644 --- a/src/Magpie.App/Resources.language-ja.resw +++ b/src/Magpie.App/Resources.language-ja.resw @@ -766,12 +766,6 @@ アンロック - - フレームレートに切替 - - - フレームタイミングに切替 - エフェクトに切替 @@ -784,9 +778,6 @@ ロック - - フレーム統計 - レンダリング時間 diff --git a/src/Magpie.App/Resources.language-ko.resw b/src/Magpie.App/Resources.language-ko.resw index aa31e2e2a..7e1939fb0 100644 --- a/src/Magpie.App/Resources.language-ko.resw +++ b/src/Magpie.App/Resources.language-ko.resw @@ -766,9 +766,6 @@ 스케일링 모드 내보내기 - - 프레임 레이트로 전환 - 스케일링 모드 가져오기 @@ -787,12 +784,6 @@ 잠금 해제 - - 프레임 타이밍으로 전환 - - - 프레임 통계 - 폰트 캐시 비활성화 diff --git a/src/Magpie.App/Resources.language-pt-BR.resw b/src/Magpie.App/Resources.language-pt-BR.resw index 90f4216c9..4fc3eaf9d 100644 --- a/src/Magpie.App/Resources.language-pt-BR.resw +++ b/src/Magpie.App/Resources.language-pt-BR.resw @@ -588,9 +588,6 @@ Desativar cache de fonte - - Alternar para taxas de quadros - Notificações e pop-ups de determinados aplicativos serão bloqueados @@ -651,12 +648,6 @@ Fixar - - Estatísticas de quadros - - - Alternar para tempos de quadros - Sem redimensionamento diff --git a/src/Magpie.App/Resources.language-ru.resw b/src/Magpie.App/Resources.language-ru.resw index 6b345bde5..a54440bcf 100644 --- a/src/Magpie.App/Resources.language-ru.resw +++ b/src/Magpie.App/Resources.language-ru.resw @@ -769,15 +769,6 @@ Заблокировать - - Статистика кадра - - - Переключиться на кадровую частоту - - - Переключиться на тайминги кадра - Тайминги diff --git a/src/Magpie.App/Resources.language-tr.resw b/src/Magpie.App/Resources.language-tr.resw index 9ceee3c27..99aef0b10 100644 --- a/src/Magpie.App/Resources.language-tr.resw +++ b/src/Magpie.App/Resources.language-tr.resw @@ -769,21 +769,12 @@ Kilitle - - Kare istatistikleri - Saydamlık Kilidi aç - - Kare hızlarını değiştir - - - Kare gecikmesini değiştir - Zamanlamalar diff --git a/src/Magpie.App/Resources.language-uk.resw b/src/Magpie.App/Resources.language-uk.resw index 12424c254..a7a7499da 100644 --- a/src/Magpie.App/Resources.language-uk.resw +++ b/src/Magpie.App/Resources.language-uk.resw @@ -763,9 +763,6 @@ Розблокувати - - Перемикання на частоту кадрів - Таймінги @@ -784,12 +781,6 @@ Заблокувати - - Статистика кадрів - - - Перемикання на таймінги кадрів - Переключитися на ефекти diff --git a/src/Magpie.App/Resources.language-vi.resw b/src/Magpie.App/Resources.language-vi.resw index 46e058685..5947499f7 100644 --- a/src/Magpie.App/Resources.language-vi.resw +++ b/src/Magpie.App/Resources.language-vi.resw @@ -370,15 +370,6 @@ Phương pháp lấy cửa sổ - - Thông tin khung hình - - - Chuyển sang tốc độ khung hình - - - Chuyển sang thời gian khung hình - Timing diff --git a/src/Magpie.App/Resources.language-zh-Hans.resw b/src/Magpie.App/Resources.language-zh-Hans.resw index ed50fbe59..8ab7e602d 100644 --- a/src/Magpie.App/Resources.language-zh-Hans.resw +++ b/src/Magpie.App/Resources.language-zh-Hans.resw @@ -766,15 +766,6 @@ 不透明度 - - 帧统计 - - - 切换到帧率 - - - 切换到帧时间 - 渲染用时 diff --git a/src/Magpie.App/Resources.language-zh-Hant.resw b/src/Magpie.App/Resources.language-zh-Hant.resw index 3c56ad113..6a0e32f70 100644 --- a/src/Magpie.App/Resources.language-zh-Hant.resw +++ b/src/Magpie.App/Resources.language-zh-Hant.resw @@ -787,9 +787,6 @@ 處理時間 - - 影格統計資料 - 提交 @@ -799,9 +796,6 @@ 更改啟動時的可執行檔案 - - 切換為影格速率 - 總共 @@ -814,7 +808,4 @@ 允許縮放已最大化或全螢幕的視窗 - - 切換為影格生成時間 - \ No newline at end of file From 0062c8dffcb0ea7b4a732322b7c7078f8fcf0a10 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=97=AD?= Date: Tue, 19 Mar 2024 17:13:13 +0800 Subject: [PATCH 118/155] =?UTF-8?q?feat:=20=E5=8F=A0=E5=8A=A0=E5=B1=82?= =?UTF-8?q?=E4=B8=8A=E6=98=BE=E7=A4=BA=E5=B8=A7=E7=8E=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Magpie.App/Resources.language-en-US.resw | 3 +++ src/Magpie.App/Resources.language-zh-Hans.resw | 3 +++ src/Magpie.Core/OverlayDrawer.cpp | 6 ++++-- src/Magpie.Core/OverlayDrawer.h | 2 +- 4 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/Magpie.App/Resources.language-en-US.resw b/src/Magpie.App/Resources.language-en-US.resw index e44e21d30..d47641efb 100644 --- a/src/Magpie.App/Resources.language-en-US.resw +++ b/src/Magpie.App/Resources.language-en-US.resw @@ -838,4 +838,7 @@ Dynamic detection + + Frame rate + \ No newline at end of file diff --git a/src/Magpie.App/Resources.language-zh-Hans.resw b/src/Magpie.App/Resources.language-zh-Hans.resw index 8ab7e602d..0761a2089 100644 --- a/src/Magpie.App/Resources.language-zh-Hans.resw +++ b/src/Magpie.App/Resources.language-zh-Hans.resw @@ -838,4 +838,7 @@ 动态检测 + + 帧率 + \ No newline at end of file diff --git a/src/Magpie.Core/OverlayDrawer.cpp b/src/Magpie.Core/OverlayDrawer.cpp index 59c3a5d3d..950f54882 100644 --- a/src/Magpie.Core/OverlayDrawer.cpp +++ b/src/Magpie.Core/OverlayDrawer.cpp @@ -242,7 +242,7 @@ void OverlayDrawer::Draw( } if (_isUIVisiable) { - if (_DrawUI(effectTimings)) { + if (_DrawUI(effectTimings, fps)) { ++count; } } @@ -774,7 +774,7 @@ void OverlayDrawer::_DrawFPS(uint32_t fps) noexcept { } // 返回 true 表示应再渲染一次 -bool OverlayDrawer::_DrawUI(const SmallVector& effectTimings) noexcept { +bool OverlayDrawer::_DrawUI(const SmallVector& effectTimings, uint32_t fps) noexcept { const ScalingOptions& options = ScalingWindow::Get().Options(); const Renderer& renderer = ScalingWindow::Get().Renderer(); @@ -852,6 +852,8 @@ bool OverlayDrawer::_DrawUI(const SmallVector& effectTimings) noexcept { statistics.second == 0 ? 0.0f : statistics.first * 100.0f / statistics.second).c_str()); ImGui::PopFont(); } + const std::string& frameRateStr = _GetResourceString(L"Overlay_Profiler_FrameRate"); + ImGui::TextUnformatted(fmt::format("{}: {} FPS", frameRateStr, fps).c_str()); ImGui::PopTextWrapPos(); ImGui::Spacing(); diff --git a/src/Magpie.Core/OverlayDrawer.h b/src/Magpie.Core/OverlayDrawer.h index 5f2579ccf..5ba7f9873 100644 --- a/src/Magpie.Core/OverlayDrawer.h +++ b/src/Magpie.Core/OverlayDrawer.h @@ -60,7 +60,7 @@ class OverlayDrawer { void _DrawFPS(uint32_t fps) noexcept; - bool _DrawUI(const SmallVector& effectTimings) noexcept; + bool _DrawUI(const SmallVector& effectTimings, uint32_t fps) noexcept; const std::string& _GetResourceString(const std::wstring_view& key) noexcept; From b119c5e9d26595aea0a77205a83386480084ed7b Mon Sep 17 00:00:00 2001 From: Xu <34770031+Blinue@users.noreply.github.com> Date: Tue, 19 Mar 2024 18:22:13 +0800 Subject: [PATCH 119/155] =?UTF-8?q?fix:=20=E9=81=BF=E5=85=8D=203D=20?= =?UTF-8?q?=E6=B8=B8=E6=88=8F=E6=A8=A1=E5=BC=8F=E4=B8=8B=E6=84=8F=E5=A4=96?= =?UTF-8?q?=E6=BF=80=E6=B4=BB=E6=BA=90=E7=AA=97=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Magpie.Core/ImGuiImpl.cpp | 2 +- src/Magpie.Core/OverlayDrawer.cpp | 27 ++++++++++++----------- src/Magpie.Core/OverlayDrawer.h | 2 +- src/Magpie.Core/Renderer.cpp | 36 +++++++++++++++---------------- src/Magpie.Core/Renderer.h | 3 ++- src/Magpie.Core/ScalingWindow.cpp | 6 ++++-- 6 files changed, 40 insertions(+), 36 deletions(-) diff --git a/src/Magpie.Core/ImGuiImpl.cpp b/src/Magpie.Core/ImGuiImpl.cpp index 8d2000311..cbb0b4d8c 100644 --- a/src/Magpie.Core/ImGuiImpl.cpp +++ b/src/Magpie.Core/ImGuiImpl.cpp @@ -182,7 +182,7 @@ void ImGuiImpl::MessageHandler(UINT msg, WPARAM wParam, LPARAM /*lParam*/) noexc if (!io.WantCaptureMouse) { // 3D 游戏模式下显示叠加层会使缩放窗口不透明,这时点击非叠加层区域应关闭叠加层 if (msg == WM_LBUTTONDOWN && ScalingWindow::Get().Options().Is3DGameMode()) { - ScalingWindow::Get().Renderer().IsOverlayVisible(false); + ScalingWindow::Get().Renderer().SetOverlayVisibility(false); } return; } diff --git a/src/Magpie.Core/OverlayDrawer.cpp b/src/Magpie.Core/OverlayDrawer.cpp index 950f54882..154184a33 100644 --- a/src/Magpie.Core/OverlayDrawer.cpp +++ b/src/Magpie.Core/OverlayDrawer.cpp @@ -158,18 +158,12 @@ static SmallVector GenerateTimelineColors(const std::vectorIsUIVisible(); +} + +void Renderer::SetOverlayVisibility(bool value, bool noSetForeground) noexcept { if (value) { if (!_overlayDrawer) { _overlayDrawer = std::make_unique(); @@ -316,40 +320,36 @@ void Renderer::IsOverlayVisible(bool value) noexcept { return; } } - + if (_overlayDrawer->IsUIVisible()) { return; } _overlayDrawer->SetUIVisibility(true); + + _backendThreadDispatcher.TryEnqueue([this]() { + uint32_t passCount = 0; + for (const EffectInfo& info : _effectInfos) { + passCount += (uint32_t)info.passNames.size(); + } + _effectsProfiler.Start(_backendResources.GetD3DDevice(), passCount); + }); } else { if (_overlayDrawer) { if (!_overlayDrawer->IsUIVisible()) { return; } - _overlayDrawer->SetUIVisibility(false); + _overlayDrawer->SetUIVisibility(false, noSetForeground); } - } - _backendThreadDispatcher.TryEnqueue([this, isVisible(_overlayDrawer->IsUIVisible())]() { - if (isVisible) { - uint32_t passCount = 0; - for (const EffectInfo& info : _effectInfos) { - passCount += (uint32_t)info.passNames.size(); - } - _effectsProfiler.Start(_backendResources.GetD3DDevice(), passCount); - } else { + _backendThreadDispatcher.TryEnqueue([this]() { _effectsProfiler.Stop(); - } - }); + }); + } // 立即渲染一帧 _FrontendRender(); } -bool Renderer::IsOverlayVisible() noexcept { - return _overlayDrawer && _overlayDrawer->IsUIVisible(); -} - bool Renderer::_InitFrameSource() noexcept { switch (ScalingWindow::Get().Options().captureMethod) { case CaptureMethod::GraphicsCapture: diff --git a/src/Magpie.Core/Renderer.h b/src/Magpie.Core/Renderer.h index 163a20f8d..ed3c2c765 100644 --- a/src/Magpie.Core/Renderer.h +++ b/src/Magpie.Core/Renderer.h @@ -23,9 +23,10 @@ class Renderer { void Render() noexcept; - void IsOverlayVisible(bool value) noexcept; bool IsOverlayVisible() noexcept; + void SetOverlayVisibility(bool value, bool noSetForeground = false) noexcept; + const RECT& SrcRect() const noexcept { return _srcRect; } diff --git a/src/Magpie.Core/ScalingWindow.cpp b/src/Magpie.Core/ScalingWindow.cpp index 1ab3baaed..667200b3c 100644 --- a/src/Magpie.Core/ScalingWindow.cpp +++ b/src/Magpie.Core/ScalingWindow.cpp @@ -214,6 +214,8 @@ void ScalingWindow::Render() noexcept { int srcState = _CheckSrcState(); if (srcState != 0) { Logger::Get().Info("源窗口状态改变,退出全屏"); + // 切换前台窗口导致停止缩放时不应激活源窗口 + _renderer->SetOverlayVisibility(false, true); Destroy(); return; } @@ -223,7 +225,7 @@ void ScalingWindow::Render() noexcept { } void ScalingWindow::ToggleOverlay() noexcept { - _renderer->IsOverlayVisible(!_renderer->IsOverlayVisible()); + _renderer->SetOverlayVisibility(!_renderer->IsOverlayVisible()); } LRESULT ScalingWindow::_MessageHandler(UINT msg, WPARAM wParam, LPARAM lParam) noexcept { @@ -309,7 +311,7 @@ int ScalingWindow::_CheckSrcState() const noexcept { // 3D 游戏模式下打开叠加层后如果源窗口意外回到前台应关闭叠加层 if (_options.Is3DGameMode() && _renderer->IsOverlayVisible() && hwndForeground == _hwndSrc) { - _renderer->IsOverlayVisible(false); + _renderer->SetOverlayVisibility(false, true); } // 在 3D 游戏模式下打开叠加层则全屏窗口可以接收焦点 From 6ae0a57a78db7a8e820ced30c55e19052dc4a2d8 Mon Sep 17 00:00:00 2001 From: Xu <34770031+Blinue@users.noreply.github.com> Date: Tue, 19 Mar 2024 18:54:33 +0800 Subject: [PATCH 120/155] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=20FPS=20?= =?UTF-8?q?=E6=97=A0=E6=B3=95=E6=8B=96=E5=8A=A8=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Magpie.Core/CursorManager.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Magpie.Core/CursorManager.cpp b/src/Magpie.Core/CursorManager.cpp index 6091e41e3..a160cb54d 100644 --- a/src/Magpie.Core/CursorManager.cpp +++ b/src/Magpie.Core/CursorManager.cpp @@ -124,8 +124,8 @@ void CursorManager::Update() noexcept { } if (!options.IsDebugMode() && !_isUnderCapture) { - // 不处于捕获状态如果叠加层已开启也更新光标位置 - if (!(_isOnScalingWindow && ScalingWindow::Get().Renderer().IsOverlayVisible())) { + // 不处于捕获状态如果叠加层或 FPS 已开启也更新光标位置 + if (!(_isOnScalingWindow && (options.IsShowFPS() || ScalingWindow::Get().Renderer().IsOverlayVisible()))) { return; } } From bcdef3dca7f3f551168ad5103e5e5625dff981a6 Mon Sep 17 00:00:00 2001 From: Xu <34770031+Blinue@users.noreply.github.com> Date: Tue, 19 Mar 2024 19:09:18 +0800 Subject: [PATCH 121/155] =?UTF-8?q?fix:=20=E5=88=A0=E9=99=A4=E4=B8=80?= =?UTF-8?q?=E4=B8=AA=E4=B8=8D=E5=86=8D=E9=9C=80=E8=A6=81=E7=9A=84=20hack?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Magpie.App/ScalingService.cpp | 12 ------------ src/Magpie.Core/FrameSourceBase.cpp | 25 ++++++++++--------------- 2 files changed, 10 insertions(+), 27 deletions(-) diff --git a/src/Magpie.App/ScalingService.cpp b/src/Magpie.App/ScalingService.cpp index 93bce4e1f..1c10a8873 100644 --- a/src/Magpie.App/ScalingService.cpp +++ b/src/Magpie.App/ScalingService.cpp @@ -215,18 +215,6 @@ fire_and_forget ScalingService::_ScalingRuntime_IsRunningChanged(bool isRunning) HWND curSrcWnd = _hwndCurSrc; _hwndCurSrc = NULL; - HWND hwndMain = (HWND)Application::Current().as().HwndMain(); - if (hwndMain == curSrcWnd) { - // 必须在主线程还原主窗口样式 - // 见 FrameSourceBase::~FrameSourceBase - LONG_PTR style = GetWindowLongPtr(hwndMain, GWL_STYLE); - if (!(style & WS_THICKFRAME)) { - SetWindowLongPtr(hwndMain, GWL_STYLE, style | WS_THICKFRAME); - SetWindowPos(hwndMain, 0, 0, 0, 0, 0, - SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED); - } - } - if (GetForegroundWindow() == curSrcWnd) { // 退出全屏后如果前台窗口不变视为通过热键退出 _hwndChecked = curSrcWnd; diff --git a/src/Magpie.Core/FrameSourceBase.cpp b/src/Magpie.Core/FrameSourceBase.cpp index 0b4cc65b0..d6630862f 100644 --- a/src/Magpie.Core/FrameSourceBase.cpp +++ b/src/Magpie.Core/FrameSourceBase.cpp @@ -3,7 +3,6 @@ #include "ScalingOptions.h" #include "Logger.h" #include "Win32Utils.h" -#include "CommonSharedConstants.h" #include "Utils.h" #include "SmallVector.h" #include "DirectXHelper.h" @@ -40,21 +39,17 @@ FrameSourceBase::~FrameSourceBase() noexcept { // 还原窗口大小调整 if (_windowResizingDisabled) { - // 缩放 Magpie 主窗口时会在 SetWindowLongPtr 中卡住,似乎是 Win11 的 bug - // 将在 MagService::_MagRuntime_IsRunningChanged 还原主窗口样式 - if (Win32Utils::GetWndClassName(hwndSrc) != CommonSharedConstants::MAIN_WINDOW_CLASS_NAME) { - LONG_PTR style = GetWindowLongPtr(hwndSrc, GWL_STYLE); - if (!(style & WS_THICKFRAME)) { - if (SetWindowLongPtr(hwndSrc, GWL_STYLE, style | WS_THICKFRAME)) { - if (!SetWindowPos(hwndSrc, 0, 0, 0, 0, 0, - SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED)) { - Logger::Get().Win32Error("SetWindowPos 失败"); - } - - Logger::Get().Info("已取消禁用窗口大小调整"); - } else { - Logger::Get().Win32Error("取消禁用窗口大小调整失败"); + LONG_PTR style = GetWindowLongPtr(hwndSrc, GWL_STYLE); + if (!(style & WS_THICKFRAME)) { + if (SetWindowLongPtr(hwndSrc, GWL_STYLE, style | WS_THICKFRAME)) { + if (!SetWindowPos(hwndSrc, 0, 0, 0, 0, 0, + SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED)) { + Logger::Get().Win32Error("SetWindowPos 失败"); } + + Logger::Get().Info("已取消禁用窗口大小调整"); + } else { + Logger::Get().Win32Error("取消禁用窗口大小调整失败"); } } } From 735f05b602c0ca40d30f1306106c252574a7073e Mon Sep 17 00:00:00 2001 From: Xu <34770031+Blinue@users.noreply.github.com> Date: Tue, 19 Mar 2024 19:57:39 +0800 Subject: [PATCH 122/155] =?UTF-8?q?feat:=20=E5=AE=9E=E7=8E=B0=E5=85=89?= =?UTF-8?q?=E6=A0=87=E7=BC=A9=E6=94=BE=E9=80=89=E9=A1=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Magpie.Core/CursorDrawer.cpp | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/src/Magpie.Core/CursorDrawer.cpp b/src/Magpie.Core/CursorDrawer.cpp index b00108934..83d3857e4 100644 --- a/src/Magpie.Core/CursorDrawer.cpp +++ b/src/Magpie.Core/CursorDrawer.cpp @@ -112,8 +112,19 @@ void CursorDrawer::Draw() noexcept { const POINT cursorPos = cursorManager.CursorPos(); - const float cursorScaling = ScalingWindow::Get().Options().cursorScaling; - const SIZE cursorSize{ lroundf(ci->size.cx * cursorScaling), lroundf(ci->size.cy * cursorScaling) }; + float cursorScaling = ScalingWindow::Get().Options().cursorScaling; + if (cursorScaling < 1e-5) { + // 光标缩放和源窗口相同 + const Renderer& renderer = ScalingWindow::Get().Renderer(); + const SIZE srcSize = Win32Utils::GetSizeOfRect(renderer.SrcRect()); + const SIZE destSize = Win32Utils::GetSizeOfRect(renderer.DestRect()); + cursorScaling = (((float)destSize.cx / srcSize.cx) + ((float)destSize.cy / srcSize.cy)) / 2; + } + + const SIZE cursorSize{ + lroundf(ci->size.cx * cursorScaling), + lroundf(ci->size.cy * cursorScaling) + }; RECT cursorRect{ .left = lroundf(cursorPos.x - ci->hotSpot.x * cursorScaling), .top = lroundf(cursorPos.y - ci->hotSpot.y * cursorScaling), From a80ad8136ca95b64c61c940b104e68218e8a4705 Mon Sep 17 00:00:00 2001 From: Xu <34770031+Blinue@users.noreply.github.com> Date: Tue, 19 Mar 2024 23:56:12 +0800 Subject: [PATCH 123/155] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E5=8F=A0?= =?UTF-8?q?=E5=8A=A0=E5=B1=82=E4=B8=8A=E5=87=BA=E7=8E=B0=E4=B8=A4=E4=B8=AA?= =?UTF-8?q?=E5=85=89=E6=A0=87=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Magpie.Core/CursorManager.cpp | 85 ++++++++++++++++--------------- src/Magpie.Core/CursorManager.h | 7 ++- 2 files changed, 50 insertions(+), 42 deletions(-) diff --git a/src/Magpie.Core/CursorManager.cpp b/src/Magpie.Core/CursorManager.cpp index a160cb54d..9074a61eb 100644 --- a/src/Magpie.Core/CursorManager.cpp +++ b/src/Magpie.Core/CursorManager.cpp @@ -79,6 +79,8 @@ CursorManager::~CursorManager() noexcept { ReleaseCapture(); } + _ShowSystemCursor(true); + if (_curClips != RECT{}) { ClipCursor(nullptr); } @@ -94,10 +96,17 @@ CursorManager::~CursorManager() noexcept { } bool CursorManager::Initialize() noexcept { - if (ScalingWindow::Get().Options().Is3DGameMode()) { + const ScalingOptions& options = ScalingWindow::Get().Options(); + if (options.IsDebugMode()) { + _shouldDrawCursor = true; + _isUnderCapture = true; + } else if (options.Is3DGameMode()) { POINT cursorPos; GetCursorPos(&cursorPos); _StartCapture(cursorPos); + + _shouldDrawCursor = true; + _ShowSystemCursor(false); } Logger::Get().Info("CursorManager 初始化完成"); @@ -111,25 +120,10 @@ void CursorManager::Update() noexcept { _cursorPos = { std::numeric_limits::max(),std::numeric_limits::max() }; const ScalingOptions& options = ScalingWindow::Get().Options(); - if (!options.IsDrawCursor()) { + if (!options.IsDrawCursor() || !_shouldDrawCursor) { return; } - if (options.Is3DGameMode()) { - // 3D 游戏模式下如果前台窗口不是源窗口或缩放窗口则不绘制光标 - HWND hwndFore = GetForegroundWindow(); - if (hwndFore != ScalingWindow::Get().Handle() && hwndFore != ScalingWindow::Get().HwndSrc()) { - return; - } - } - - if (!options.IsDebugMode() && !_isUnderCapture) { - // 不处于捕获状态如果叠加层或 FPS 已开启也更新光标位置 - if (!(_isOnScalingWindow && (options.IsShowFPS() || ScalingWindow::Get().Renderer().IsOverlayVisible()))) { - return; - } - } - CURSORINFO ci{ .cbSize = sizeof(CURSORINFO) }; if (!GetCursorInfo(&ci)) { Logger::Get().Win32Error("GetCursorPos 失败"); @@ -173,6 +167,10 @@ void CursorManager::IsCursorCapturedOnOverlay(bool value) noexcept { } void CursorManager::_ShowSystemCursor(bool show) { + if (_isSystemCursorShown == show) { + return; + } + static void (WINAPI* const showSystemCursor)(BOOL bShow) = []()->void(WINAPI*)(BOOL) { HMODULE lib = LoadLibrary(L"user32.dll"); if (!lib) { @@ -184,6 +182,7 @@ void CursorManager::_ShowSystemCursor(bool show) { if (showSystemCursor) { showSystemCursor((BOOL)show); + _isSystemCursorShown = show; } else { // 获取 ShowSystemCursor 失败则回落到 Magnification API static bool initialized = []() { @@ -197,6 +196,7 @@ void CursorManager::_ShowSystemCursor(bool show) { if (initialized) { MagShowSystemCursor(show); + _isSystemCursorShown = show; } } @@ -376,7 +376,7 @@ void CursorManager::_UpdateCursorClip() noexcept { // // 处于捕获状态 // -------------------------------------------------------- - // | 虚拟位置被遮挡 | 虚拟位置未被遮挡 + // | 缩放位置被遮挡 | 缩放位置未被遮挡 // -------------------------------------------------------- // 实际位置被遮挡 | 退出捕获 | 退出捕获,主窗口不透明 // -------------------------------------------------------- @@ -386,17 +386,10 @@ void CursorManager::_UpdateCursorClip() noexcept { /////////////////////////////////////////////////////////// HWND hwndCur = WindowFromPoint(hwndScaling, scalingRect, SrcToScaling(cursorPos), false); - _isOnScalingWindow = hwndCur == hwndScaling; + _shouldDrawCursor = hwndCur == hwndScaling; - if (!_isOnScalingWindow) { - // 缩放窗口被遮挡 - if (style | WS_EX_TRANSPARENT) { - SetWindowLongPtr(hwndScaling, GWL_EXSTYLE, style & ~WS_EX_TRANSPARENT); - } - - _StopCapture(cursorPos); - } else { - // 主窗口未被遮挡 + if (_shouldDrawCursor) { + // 缩放窗口未被遮挡 bool stopCapture = _isOnOverlay; if (!stopCapture) { @@ -410,6 +403,7 @@ void CursorManager::_UpdateCursorClip() noexcept { SetWindowLongPtr(hwndScaling, GWL_EXSTYLE, style & ~WS_EX_TRANSPARENT); } + // 源窗口被遮挡或者光标位于叠加层上,这时虽然停止捕获光标,但依然将光标隐藏 _StopCapture(cursorPos); } else { if (_isOnOverlay) { @@ -422,15 +416,24 @@ void CursorManager::_UpdateCursorClip() noexcept { } } } + } else { + // 缩放窗口被遮挡 + if (style | WS_EX_TRANSPARENT) { + SetWindowLongPtr(hwndScaling, GWL_EXSTYLE, style & ~WS_EX_TRANSPARENT); + } + + if (!_StopCapture(cursorPos)) { + _shouldDrawCursor = true; + } } } else { ///////////////////////////////////////////////////////// // // 未处于捕获状态 // ----------------------------------------------------- - // | 虚拟位置被遮挡 | 虚拟位置未被遮挡 + // | 缩放位置被遮挡 | 缩放位置未被遮挡 // ------------------------------------------------------ - // 实际位置被遮挡 | 无操作 | 主窗口不透明 + // 实际位置被遮挡 | 无操作 | 缩放窗口不透明 // ------------------------------------------------------ // 实际位置未被遮挡 | 无操作 | 开始捕获,主窗口透明 // ------------------------------------------------------ @@ -438,10 +441,10 @@ void CursorManager::_UpdateCursorClip() noexcept { ///////////////////////////////////////////////////////// HWND hwndCur = WindowFromPoint(hwndScaling, scalingRect, cursorPos, false); - _isOnScalingWindow = hwndCur == hwndScaling; + _shouldDrawCursor = hwndCur == hwndScaling; - if (_isOnScalingWindow) { - // 主窗口未被遮挡 + if (_shouldDrawCursor) { + // 缩放窗口未被遮挡 POINT newCursorPos = ScalingToSrc(cursorPos); if (PtInRect(&srcRect, newCursorPos)) { @@ -514,6 +517,10 @@ void CursorManager::_UpdateCursorClip() noexcept { } } + // 只要光标缩放后的位置在缩放窗口上,且该位置未被其他窗口遮挡,便可以隐藏光标。 + // 即使当前并未捕获光标也是如此。 + _ShowSystemCursor(!_shouldDrawCursor); + if (!_isUnderCapture && !_isOnOverlay) { return; } @@ -575,9 +582,6 @@ void CursorManager::_StartCapture(POINT cursorPos) noexcept { // // 在有黑边的情况下自动将光标调整到画面内 - // 全局隐藏光标 - _ShowSystemCursor(false); - SIZE srcFrameSize = Win32Utils::GetSizeOfRect(srcRect); SIZE outputSize = Win32Utils::GetSizeOfRect(destRect); @@ -597,9 +601,9 @@ void CursorManager::_StartCapture(POINT cursorPos) noexcept { _isUnderCapture = true; } -void CursorManager::_StopCapture(POINT cursorPos, bool onDestroy) noexcept { +bool CursorManager::_StopCapture(POINT cursorPos, bool onDestroy) noexcept { if (!_isUnderCapture) { - return; + return true; } if (_curClips != RECT{}) { @@ -626,9 +630,9 @@ void CursorManager::_StopCapture(POINT cursorPos, bool onDestroy) noexcept { if (ScalingWindow::Get().Options().IsAdjustCursorSpeed()) { SystemParametersInfo(SPI_SETMOUSESPEED, 0, (PVOID)(intptr_t)_originCursorSpeed, 0); } - - _ShowSystemCursor(true); + _isUnderCapture = false; + return true; } else { // 目标位置不存在屏幕,则将光标限制在源窗口内 const RECT& srcRect = ScalingWindow::Get().Renderer().SrcRect(); @@ -636,6 +640,7 @@ void CursorManager::_StopCapture(POINT cursorPos, bool onDestroy) noexcept { std::clamp(cursorPos.x, srcRect.left, srcRect.right - 1), std::clamp(cursorPos.y, srcRect.top, srcRect.bottom - 1) ); + return false; } } diff --git a/src/Magpie.Core/CursorManager.h b/src/Magpie.Core/CursorManager.h index ea67c41cf..dcf0bd7c8 100644 --- a/src/Magpie.Core/CursorManager.h +++ b/src/Magpie.Core/CursorManager.h @@ -42,7 +42,7 @@ class CursorManager { void _StartCapture(POINT cursorPos) noexcept; - void _StopCapture(POINT cursorPos, bool onDestroy = false) noexcept; + bool _StopCapture(POINT cursorPos, bool onDestroy = false) noexcept; HCURSOR _hCursor = NULL; POINT _cursorPos { std::numeric_limits::max(),std::numeric_limits::max() }; @@ -51,10 +51,13 @@ class CursorManager { int _originCursorSpeed = 0; bool _isUnderCapture = false; - bool _isOnScalingWindow = false; + // 当缩放后的光标位置在缩放窗口上且没有被其他窗口挡住时应绘制光标 + bool _shouldDrawCursor = false; bool _isOnOverlay = false; bool _isCapturedOnOverlay = false; + + bool _isSystemCursorShown = true; }; } From 21a15b45c1d69c8c8999954924e9800869c96062 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=97=AD?= Date: Wed, 20 Mar 2024 10:11:42 +0800 Subject: [PATCH 124/155] =?UTF-8?q?feat:=20=E5=B0=86=E5=87=A0=E4=B8=AA?= =?UTF-8?q?=E6=95=88=E6=9E=9C=E7=A7=BB=E6=A4=8D=E5=88=B0=20v4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Effects/Anime4K/Anime4K_Restore_S.hlsl | 17 +- .../Anime4K/Anime4K_Restore_Soft_S.hlsl | 17 +- src/Effects/NIS/NIS.hlsl | 18 +- src/Effects/NIS/NVSharpen.hlsl | 32 ++-- src/Effects/Pixel Art/MMPX.hlsl | 178 +++++++++--------- src/Effects/Pixel Art/Pixellate.hlsl | 6 +- src/Effects/Pixel Art/SharpBilinear.hlsl | 6 +- src/Effects/Sharpen/AdaptiveSharpen.hlsl | 23 ++- 8 files changed, 164 insertions(+), 133 deletions(-) diff --git a/src/Effects/Anime4K/Anime4K_Restore_S.hlsl b/src/Effects/Anime4K/Anime4K_Restore_S.hlsl index 6ab79dcdf..6d4eb7b71 100644 --- a/src/Effects/Anime4K/Anime4K_Restore_S.hlsl +++ b/src/Effects/Anime4K/Anime4K_Restore_S.hlsl @@ -2,15 +2,18 @@ // 移植自 https://github.com/bloc97/Anime4K/blob/master/glsl/Restore/Anime4K_Restore_CNN_S.glsl //!MAGPIE EFFECT -//!VERSION 3 -//!OUTPUT_WIDTH INPUT_WIDTH -//!OUTPUT_HEIGHT INPUT_HEIGHT +//!VERSION 4 //!SORT_NAME Anime4K_Restore_0 //!TEXTURE Texture2D INPUT; +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +Texture2D OUTPUT; + //!SAMPLER //!FILTER POINT SamplerState sam; @@ -246,13 +249,15 @@ void Pass3(uint2 blockStart, uint3 threadId) { //!PASS 4 //!DESC Conv-3x3x3x8 //!IN INPUT, tex1 +//!OUT OUTPUT //!BLOCK_SIZE 8 //!NUM_THREADS 64 void Pass4(uint2 blockStart, uint3 threadId) { uint2 gxy = Rmp8x8(threadId.x) + blockStart; - uint2 inputSize = GetInputSize(); - if (!CheckViewport(gxy)) { + + const uint2 outputSize = GetOutputSize(); + if (gxy.x >= outputSize.x || gxy.y >= outputSize.y) { return; } @@ -294,5 +299,5 @@ void Pass4(uint2 blockStart, uint3 threadId) { result += INPUT.SampleLevel(sam, pos, 0).rgb; - WriteToOutput(gxy, result); + OUTPUT[gxy] = float4(result, 1); } diff --git a/src/Effects/Anime4K/Anime4K_Restore_Soft_S.hlsl b/src/Effects/Anime4K/Anime4K_Restore_Soft_S.hlsl index d15dd696a..c16325488 100644 --- a/src/Effects/Anime4K/Anime4K_Restore_Soft_S.hlsl +++ b/src/Effects/Anime4K/Anime4K_Restore_Soft_S.hlsl @@ -2,15 +2,18 @@ // 移植自 https://github.com/bloc97/Anime4K/blob/master/glsl/Restore/Anime4K_Restore_CNN_Soft_S.glsl //!MAGPIE EFFECT -//!VERSION 3 -//!OUTPUT_WIDTH INPUT_WIDTH -//!OUTPUT_HEIGHT INPUT_HEIGHT +//!VERSION 4 //!SORT_NAME Anime4K_Restore_Soft_0 //!TEXTURE Texture2D INPUT; +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +Texture2D OUTPUT; + //!SAMPLER //!FILTER POINT SamplerState sam; @@ -246,13 +249,15 @@ void Pass3(uint2 blockStart, uint3 threadId) { //!PASS 4 //!DESC Conv-3x3x3x8 //!IN INPUT, tex1 +//!OUT OUTPUT //!BLOCK_SIZE 8 //!NUM_THREADS 64 void Pass4(uint2 blockStart, uint3 threadId) { uint2 gxy = Rmp8x8(threadId.x) + blockStart; - uint2 inputSize = GetInputSize(); - if (!CheckViewport(gxy)) { + + const uint2 outputSize = GetOutputSize(); + if (gxy.x >= outputSize.x || gxy.y >= outputSize.y) { return; } @@ -294,5 +299,5 @@ void Pass4(uint2 blockStart, uint3 threadId) { result += INPUT.SampleLevel(sam, pos, 0).rgb; - WriteToOutput(gxy, result); + OUTPUT[gxy] = float4(result, 1); } diff --git a/src/Effects/NIS/NIS.hlsl b/src/Effects/NIS/NIS.hlsl index 79ef03552..957e86857 100644 --- a/src/Effects/NIS/NIS.hlsl +++ b/src/Effects/NIS/NIS.hlsl @@ -1,7 +1,7 @@ // 移植自 https://github.com/NVIDIAGameWorks/NVIDIAImageScaling/blob/main/NIS/NIS_Scaler.h //!MAGPIE EFFECT -//!VERSION 3 +//!VERSION 4 //!PARAMETER @@ -15,6 +15,9 @@ float sharpness; //!TEXTURE Texture2D INPUT; +//!TEXTURE +Texture2D OUTPUT; + //!TEXTURE //!SOURCE Coef_Scale.dds //!FORMAT R16G16B16A16_FLOAT @@ -32,6 +35,7 @@ SamplerState samplerLinearClamp; //!PASS 1 //!IN INPUT, coef_scaler, coef_usm +//!OUT OUTPUT //!BLOCK_SIZE 32,32 //!NUM_THREADS 256 @@ -431,12 +435,18 @@ void Pass1(uint2 blockStart, uint3 threadId) { // discretized phase const int fx_int = int(fx * kPhaseCount); + const uint2 outputSize = GetOutputSize(); + if (dstX >= outputSize.x) { + return; + } + for (int k = 0; k < NIS_BLOCK_WIDTH * NIS_BLOCK_HEIGHT / NIS_THREAD_GROUP_SIZE; ++k) { // y coord inside the output image const int dstY = dstBlockY + pos.y + k * (NIS_THREAD_GROUP_SIZE / NIS_BLOCK_WIDTH); - if (!CheckViewport(int2(dstX, dstY))) { + if (dstY >= outputSize.y) { return; } + // y coord inside the input image const float srcY = (0.5f + dstY) * kScaleY - 0.5f; @@ -487,13 +497,13 @@ void Pass1(uint2 blockStart, uint3 threadId) { // do bilinear tap for chroma upscaling - float3 op = INPUT.SampleLevel(samplerLinearClamp, float2((srcX + 0.5f) * kSrcNormX, (srcY + 0.5f) * kSrcNormY), 0).rgb; + float4 op = INPUT.SampleLevel(samplerLinearClamp, float2((srcX + 0.5f) * kSrcNormX, (srcY + 0.5f) * kSrcNormY), 0); const float corr = opY * (1.0f / NIS_SCALE_FLOAT) - getY(float3(op.x, op.y, op.z)); op.x += corr; op.y += corr; op.z += corr; - WriteToOutput(uint2(dstX, dstY), op); + OUTPUT[uint2(dstX, dstY)] = op; } } diff --git a/src/Effects/NIS/NVSharpen.hlsl b/src/Effects/NIS/NVSharpen.hlsl index 8ed729fea..8abd4734a 100644 --- a/src/Effects/NIS/NVSharpen.hlsl +++ b/src/Effects/NIS/NVSharpen.hlsl @@ -1,18 +1,9 @@ // 移植自 https://github.com/NVIDIAGameWorks/NVIDIAImageScaling/blob/main/NIS/NIS_Scaler.h //!MAGPIE EFFECT -//!VERSION 3 -//!OUTPUT_WIDTH INPUT_WIDTH -//!OUTPUT_HEIGHT INPUT_HEIGHT +//!VERSION 4 -//!TEXTURE -Texture2D INPUT; - -//!SAMPLER -//!FILTER LINEAR -SamplerState samplerLinearClamp; - //!PARAMETER //!LABEL Sharpness //!DEFAULT 0.5 @@ -21,9 +12,22 @@ SamplerState samplerLinearClamp; //!STEP 0.01 float sharpness; +//!TEXTURE +Texture2D INPUT; + +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +Texture2D OUTPUT; + +//!SAMPLER +//!FILTER LINEAR +SamplerState samplerLinearClamp; + //!PASS 1 //!IN INPUT +//!OUT OUTPUT //!BLOCK_SIZE 32, 32 //!NUM_THREADS 256 @@ -208,6 +212,8 @@ void Pass1(uint2 blockStart, uint3 threadId) { GroupMemoryBarrierWithGroupSync(); + const int2 outputSize = (int2)GetOutputSize(); + for (int k = int(threadIdx); k < NIS_BLOCK_WIDTH * NIS_BLOCK_HEIGHT; k += NIS_THREAD_GROUP_SIZE) { const int2 pos = int2(uint(k) % uint(NIS_BLOCK_WIDTH), uint(k) / uint(NIS_BLOCK_WIDTH)); @@ -215,7 +221,7 @@ void Pass1(uint2 blockStart, uint3 threadId) { const int dstX = dstBlockX + pos.x; const int dstY = dstBlockY + pos.y; - if (!CheckViewport(int2(dstX, dstY))) { + if (dstX >= outputSize.x || dstY >= outputSize.y) { continue; } @@ -238,9 +244,9 @@ void Pass1(uint2 blockStart, uint3 threadId) { // final USM is a weighted sum filter outputs const float usmY = (dirUSM.x * w.x + dirUSM.y * w.y + dirUSM.z * w.z + dirUSM.w * w.w); - float3 op = INPUT.SampleLevel(samplerLinearClamp, float2((dstX + 0.5f) * kSrcNormX, (dstY + 0.5f) * kSrcNormY), 0).rgb; + float4 op = INPUT.SampleLevel(samplerLinearClamp, float2((dstX + 0.5f) * kSrcNormX, (dstY + 0.5f) * kSrcNormY), 0); op += usmY; - WriteToOutput(uint2(dstX, dstY), op); + OUTPUT[uint2(dstX, dstY)] = op; } } diff --git a/src/Effects/Pixel Art/MMPX.hlsl b/src/Effects/Pixel Art/MMPX.hlsl index 736045a42..6bce8b6df 100644 --- a/src/Effects/Pixel Art/MMPX.hlsl +++ b/src/Effects/Pixel Art/MMPX.hlsl @@ -2,14 +2,17 @@ // 移植自 https://casual-effects.com/research/McGuire2021PixelArt/index.html //!MAGPIE EFFECT -//!VERSION 3 -//!OUTPUT_WIDTH INPUT_WIDTH * 2 -//!OUTPUT_HEIGHT INPUT_HEIGHT * 2 +//!VERSION 4 //!TEXTURE Texture2D INPUT; +//!TEXTURE +//!WIDTH INPUT_WIDTH * 2 +//!HEIGHT INPUT_HEIGHT * 2 +Texture2D OUTPUT; + //!SAMPLER //!FILTER POINT SamplerState sam; @@ -17,118 +20,113 @@ SamplerState sam; //!PASS 1 //!IN INPUT +//!OUT OUTPUT //!BLOCK_SIZE 16 //!NUM_THREADS 64 - #define src(x, y) INPUT.SampleLevel(sam, float2(x, y) * GetInputPt(), 0).rgb float luma(float3 C) { - return C.r + C.g + C.b; + return C.r + C.g + C.b; } bool all_eq2(float3 B, float3 A0, float3 A1) { - return all(B == A0) && all(B == A1); + return all(B == A0) && all(B == A1); } bool all_eq3(float3 B, float3 A0, float3 A1, float3 A2) { - return all(B == A0) && all(B == A1) && all(B == A2); + return all(B == A0) && all(B == A1) && all(B == A2); } bool all_eq4(float3 B, float3 A0, float3 A1, float3 A2, float3 A3) { - return all(B == A0) && all(B == A1) && all(B == A2) && all(B == A3); + return all(B == A0) && all(B == A1) && all(B == A2) && all(B == A3); } bool any_eq3(float3 B, float3 A0, float3 A1, float3 A2) { - return all(B == A0) || all(B == A1) || all(B == A2); + return all(B == A0) || all(B == A1) || all(B == A2); } bool none_eq2(float3 B, float3 A0, float3 A1) { - return any(B != A0) && any(B != A1); + return any(B != A0) && any(B != A1); } bool none_eq4(float3 B, float3 A0, float3 A1, float3 A2, float3 A3) { - return any(B != A0) && any(B != A1) && any(B != A2) && any(B != A3); + return any(B != A0) && any(B != A1) && any(B != A2) && any(B != A3); } void Pass1(uint2 blockStart, uint3 threadId) { - uint2 gxy = (Rmp8x8(threadId.x) << 1) + blockStart; - - if (!CheckViewport(gxy)) { - return; - } - - float srcX = (gxy.x >> 1) + 0.5f; - float srcY = (gxy.y >> 1) + 0.5f; - - float3 A = src(srcX - 1, srcY - 1), B = src(srcX, srcY - 1), C = src(srcX + 1, srcY - 1); - float3 D = src(srcX - 1, srcY + 0), E = src(srcX, srcY + 0), F = src(srcX + 1, srcY + 0); - float3 G = src(srcX - 1, srcY + 1), H = src(srcX, srcY + 1), I = src(srcX + 1, srcY + 1); - - float3 J = E, K = E, L = E, M = E; - - if (any(A != E) || any(B != E) || any(C != E) || any(D != E) || any(F != E) || any(G != E) || any(H != E) || any(I != E)) { - float3 P = src(srcX, srcY - 2), S = src(srcX, srcY + 2); - float3 Q = src(srcX - 2, srcY), R = src(srcX + 2, srcY); - float Bl = luma(B), Dl = luma(D), El = luma(E), Fl = luma(F), Hl = luma(H); - - // 1:1 slope rules - if ((all(D == B) && any(D != H) && any(D != F)) && (El >= Dl || all(E == A)) && any_eq3(E, A, C, G) && ((El < Dl) || any(A != D) || any(E != P) || any(E != Q))) J = D; - if ((all(B == F) && any(B != D) && any(B != H)) && (El >= Bl || all(E == C)) && any_eq3(E, A, C, I) && ((El < Bl) || any(C != B) || any(E != P) || any(E != R))) K = B; - if ((all(H == D) && any(H != F) && any(H != B)) && (El >= Hl || all(E == G)) && any_eq3(E, A, G, I) && ((El < Hl) || any(G != H) || any(E != S) || any(E != Q))) L = H; - if ((all(F == H) && any(F != B) && any(F != D)) && (El >= Fl || all(E == I)) && any_eq3(E, C, G, I) && ((El < Fl) || any(I != H) || any(E != R) || any(E != S))) M = F; - - // Intersection rules - if ((any(E != F) && all_eq4(E, C, I, D, Q) && all_eq2(F, B, H)) && (any(F != src(srcX + 3, srcY)))) K = M = F; - if ((any(E != D) && all_eq4(E, A, G, F, R) && all_eq2(D, B, H)) && (any(D != src(srcX - 3, srcY)))) J = L = D; - if ((any(E != H) && all_eq4(E, G, I, B, P) && all_eq2(H, D, F)) && (any(H != src(srcX, srcY + 3)))) L = M = H; - if ((any(E != B) && all_eq4(E, A, C, H, S) && all_eq2(B, D, F)) && (any(B != src(srcX, srcY - 3)))) J = K = B; - if (Bl < El && all_eq4(E, G, H, I, S) && none_eq4(E, A, D, C, F)) J = K = B; - if (Hl < El && all_eq4(E, A, B, C, P) && none_eq4(E, D, G, I, F)) L = M = H; - if (Fl < El && all_eq4(E, A, D, G, Q) && none_eq4(E, B, C, I, H)) K = M = F; - if (Dl < El && all_eq4(E, C, F, I, R) && none_eq4(E, B, A, G, H)) J = L = D; - - // 2:1 slope rules - if (any(H != B)) { - if (any(H != A) && any(H != E) && any(H != C)) { - if (all_eq3(H, G, F, R) && none_eq2(H, D, src(srcX + 2, srcY - 1))) L = M; - if (all_eq3(H, I, D, Q) && none_eq2(H, F, src(srcX - 2, srcY - 1))) M = L; - } - - if (any(B != I) && any(B != G) && any(B != E)) { - if (all_eq3(B, A, F, R) && none_eq2(B, D, src(srcX + 2, srcY + 1))) J = K; - if (all_eq3(B, C, D, Q) && none_eq2(B, F, src(srcX - 2, srcY + 1))) K = J; - } - } // H !== B - - if (any(F != D)) { - if (any(D != I) && any(D != E) && any(D != C)) { - if (all_eq3(D, A, H, S) && none_eq2(D, B, src(srcX + 1, srcY + 2))) J = L; - if (all_eq3(D, G, B, P) && none_eq2(D, H, src(srcX + 1, srcY - 2))) L = J; - } - - if (any(F != E) && any(F != A) && any(F != G)) { - if (all_eq3(F, C, H, S) && none_eq2(F, B, src(srcX - 1, srcY + 2))) K = M; - if (all_eq3(F, I, B, P) && none_eq2(F, H, src(srcX - 1, srcY - 2))) M = K; - } - } // F !== D - } // not constant - - // Write four pixels at once - WriteToOutput(gxy, J); - - ++gxy.x; - if (CheckViewport(gxy)) { - WriteToOutput(gxy, K); - } - - ++gxy.y; - if (CheckViewport(gxy)) { - WriteToOutput(gxy, M); - } - - --gxy.x; - if (CheckViewport(gxy)) { - WriteToOutput(gxy, L); - } + uint2 gxy = (Rmp8x8(threadId.x) << 1) + blockStart; + + const uint2 outputSize = GetOutputSize(); + if (gxy.x >= outputSize.x || gxy.y >= outputSize.y) { + return; + } + + float srcX = (gxy.x >> 1) + 0.5f; + float srcY = (gxy.y >> 1) + 0.5f; + + float3 A = src(srcX - 1, srcY - 1), B = src(srcX, srcY - 1), C = src(srcX + 1, srcY - 1); + float3 D = src(srcX - 1, srcY + 0), E = src(srcX, srcY + 0), F = src(srcX + 1, srcY + 0); + float3 G = src(srcX - 1, srcY + 1), H = src(srcX, srcY + 1), I = src(srcX + 1, srcY + 1); + + float3 J = E, K = E, L = E, M = E; + + if (any(A != E) || any(B != E) || any(C != E) || any(D != E) || any(F != E) || any(G != E) || any(H != E) || any(I != E)) { + float3 P = src(srcX, srcY - 2), S = src(srcX, srcY + 2); + float3 Q = src(srcX - 2, srcY), R = src(srcX + 2, srcY); + float Bl = luma(B), Dl = luma(D), El = luma(E), Fl = luma(F), Hl = luma(H); + + // 1:1 slope rules + if ((all(D == B) && any(D != H) && any(D != F)) && (El >= Dl || all(E == A)) && any_eq3(E, A, C, G) && ((El < Dl) || any(A != D) || any(E != P) || any(E != Q))) J = D; + if ((all(B == F) && any(B != D) && any(B != H)) && (El >= Bl || all(E == C)) && any_eq3(E, A, C, I) && ((El < Bl) || any(C != B) || any(E != P) || any(E != R))) K = B; + if ((all(H == D) && any(H != F) && any(H != B)) && (El >= Hl || all(E == G)) && any_eq3(E, A, G, I) && ((El < Hl) || any(G != H) || any(E != S) || any(E != Q))) L = H; + if ((all(F == H) && any(F != B) && any(F != D)) && (El >= Fl || all(E == I)) && any_eq3(E, C, G, I) && ((El < Fl) || any(I != H) || any(E != R) || any(E != S))) M = F; + + // Intersection rules + if ((any(E != F) && all_eq4(E, C, I, D, Q) && all_eq2(F, B, H)) && (any(F != src(srcX + 3, srcY)))) K = M = F; + if ((any(E != D) && all_eq4(E, A, G, F, R) && all_eq2(D, B, H)) && (any(D != src(srcX - 3, srcY)))) J = L = D; + if ((any(E != H) && all_eq4(E, G, I, B, P) && all_eq2(H, D, F)) && (any(H != src(srcX, srcY + 3)))) L = M = H; + if ((any(E != B) && all_eq4(E, A, C, H, S) && all_eq2(B, D, F)) && (any(B != src(srcX, srcY - 3)))) J = K = B; + if (Bl < El && all_eq4(E, G, H, I, S) && none_eq4(E, A, D, C, F)) J = K = B; + if (Hl < El && all_eq4(E, A, B, C, P) && none_eq4(E, D, G, I, F)) L = M = H; + if (Fl < El && all_eq4(E, A, D, G, Q) && none_eq4(E, B, C, I, H)) K = M = F; + if (Dl < El && all_eq4(E, C, F, I, R) && none_eq4(E, B, A, G, H)) J = L = D; + + // 2:1 slope rules + if (any(H != B)) { + if (any(H != A) && any(H != E) && any(H != C)) { + if (all_eq3(H, G, F, R) && none_eq2(H, D, src(srcX + 2, srcY - 1))) L = M; + if (all_eq3(H, I, D, Q) && none_eq2(H, F, src(srcX - 2, srcY - 1))) M = L; + } + + if (any(B != I) && any(B != G) && any(B != E)) { + if (all_eq3(B, A, F, R) && none_eq2(B, D, src(srcX + 2, srcY + 1))) J = K; + if (all_eq3(B, C, D, Q) && none_eq2(B, F, src(srcX - 2, srcY + 1))) K = J; + } + } // H !== B + + if (any(F != D)) { + if (any(D != I) && any(D != E) && any(D != C)) { + if (all_eq3(D, A, H, S) && none_eq2(D, B, src(srcX + 1, srcY + 2))) J = L; + if (all_eq3(D, G, B, P) && none_eq2(D, H, src(srcX + 1, srcY - 2))) L = J; + } + + if (any(F != E) && any(F != A) && any(F != G)) { + if (all_eq3(F, C, H, S) && none_eq2(F, B, src(srcX - 1, srcY + 2))) K = M; + if (all_eq3(F, I, B, P) && none_eq2(F, H, src(srcX - 1, srcY - 2))) M = K; + } + } // F !== D + } // not constant + + // Write four pixels at once + OUTPUT[gxy] = float4(J, 1); + + ++gxy.x; + OUTPUT[gxy] = float4(K, 1); + + ++gxy.y; + OUTPUT[gxy] = float4(M, 1); + + --gxy.x; + OUTPUT[gxy] = float4(L, 1); } diff --git a/src/Effects/Pixel Art/Pixellate.hlsl b/src/Effects/Pixel Art/Pixellate.hlsl index fa972743e..ded35889c 100644 --- a/src/Effects/Pixel Art/Pixellate.hlsl +++ b/src/Effects/Pixel Art/Pixellate.hlsl @@ -1,12 +1,15 @@ // 移植自 https://github.com/libretro/common-shaders/blob/master/interpolation/shaders/pixellate.cg //!MAGPIE EFFECT -//!VERSION 3 +//!VERSION 4 //!TEXTURE Texture2D INPUT; +//!TEXTURE +Texture2D OUTPUT; + //!SAMPLER //!FILTER POINT SamplerState sam; @@ -15,6 +18,7 @@ SamplerState sam; //!PASS 1 //!STYLE PS //!IN INPUT +//!OUT OUTPUT float4 Pass1(float2 pos) { float2 texelSize = GetInputPt(); diff --git a/src/Effects/Pixel Art/SharpBilinear.hlsl b/src/Effects/Pixel Art/SharpBilinear.hlsl index 8e58060db..de3dd3ed4 100644 --- a/src/Effects/Pixel Art/SharpBilinear.hlsl +++ b/src/Effects/Pixel Art/SharpBilinear.hlsl @@ -1,12 +1,15 @@ // 移植自 https://github.com/libretro/common-shaders/blob/master/interpolation/shaders/sharp-bilinear.cg //!MAGPIE EFFECT -//!VERSION 3 +//!VERSION 4 //!TEXTURE Texture2D INPUT; +//!TEXTURE +Texture2D OUTPUT; + //!SAMPLER //!FILTER LINEAR @@ -17,6 +20,7 @@ SamplerState sam; //!PASS 1 //!STYLE PS //!IN INPUT +//!OUT OUTPUT float4 Pass1(float2 pos) { float2 inputPt = GetInputPt(); diff --git a/src/Effects/Sharpen/AdaptiveSharpen.hlsl b/src/Effects/Sharpen/AdaptiveSharpen.hlsl index d61ff07d3..62c1846f9 100644 --- a/src/Effects/Sharpen/AdaptiveSharpen.hlsl +++ b/src/Effects/Sharpen/AdaptiveSharpen.hlsl @@ -6,10 +6,7 @@ //!MAGPIE EFFECT -//!VERSION 3 -//!OUTPUT_WIDTH INPUT_WIDTH -//!OUTPUT_HEIGHT INPUT_HEIGHT - +//!VERSION 4 //!PARAMETER @@ -26,6 +23,11 @@ float curveHeight; //!TEXTURE Texture2D INPUT; +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +Texture2D OUTPUT; + //!SAMPLER //!FILTER POINT SamplerState sam; @@ -33,6 +35,7 @@ SamplerState sam; //!PASS 1 //!IN INPUT +//!OUT OUTPUT //!BLOCK_SIZE 16 //!NUM_THREADS 64 @@ -51,7 +54,9 @@ float CtG(float3 RGB) { return sqrt((1.0f / 3.0f) * ((RGB * RGB).r + (RGB * RGB void Pass1(uint2 blockStart, uint3 threadId) { uint2 gxy = (Rmp8x8(threadId.x) << 1) + blockStart; - if (!CheckViewport(gxy)) { + + const uint2 outputSize = GetOutputSize(); + if (gxy.x >= outputSize.x || gxy.y >= outputSize.y) { return; } @@ -92,12 +97,6 @@ void Pass1(uint2 blockStart, uint3 threadId) { for (j = 0; j <= 1; ++j) { const uint2 destPos = gxy + uint2(i, j); - if (i != 0 || j != 0) { - if (!CheckViewport(destPos)) { - continue; - } - } - float2 pos = (destPos + 0.5f) * inputPt; // Get points and saturate out of range values (BTB & WTW) @@ -208,7 +207,7 @@ void Pass1(uint2 blockStart, uint3 threadId) { sharpdiff = lerp((tanh((max(sharpdiff, 0.0)) * nmax_scale) / nmax_scale), (max(sharpdiff, 0.0)), L_comp_ratio) + lerp((tanh((min(sharpdiff, 0.0)) * nmin_scale) / nmin_scale), (min(sharpdiff, 0.0)), D_comp_ratio); - WriteToOutput(destPos, src[i + 3][j + 3].rgb + sharpdiff); + OUTPUT[destPos] = float4(src[i + 3][j + 3].rgb + sharpdiff, 1); } } } From d4fa4438470c423e2a1b04b167bed8e0b144ace6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=97=AD?= Date: Wed, 20 Mar 2024 13:41:50 +0800 Subject: [PATCH 125/155] =?UTF-8?q?feat:=20=E5=AE=8C=E6=88=90=E7=A7=BB?= =?UTF-8?q?=E6=A4=8D=E5=88=B0=20v4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Effects/SMAA/SMAA_High.hlsl | 10 +++++++--- src/Effects/SMAA/SMAA_Low.hlsl | 10 +++++++--- src/Effects/SMAA/SMAA_Medium.hlsl | 10 +++++++--- src/Effects/SMAA/SMAA_Ultra.hlsl | 10 +++++++--- src/Effects/Sharpen/FineSharp.hlsl | 22 +++++++++++----------- src/Effects/Sharpen/LCAS.hlsl | 24 ++++++++++++------------ src/Effects/Sharpen/LumaSharpen.hlsl | 10 +++++++--- src/Effects/xBRZ/xBRZ_2x.hlsl | 27 +++++++++++++-------------- src/Effects/xBRZ/xBRZ_3x.hlsl | 23 ++++++++++------------- src/Effects/xBRZ/xBRZ_4x.hlsl | 23 ++++++++++------------- src/Effects/xBRZ/xBRZ_5x.hlsl | 23 ++++++++++------------- src/Effects/xBRZ/xBRZ_6x.hlsl | 23 ++++++++++------------- src/Effects/xBRZ/xBRZ_Freescale.hlsl | 12 +++++++++--- 13 files changed, 120 insertions(+), 107 deletions(-) diff --git a/src/Effects/SMAA/SMAA_High.hlsl b/src/Effects/SMAA/SMAA_High.hlsl index 66abb0254..b6ea179b0 100644 --- a/src/Effects/SMAA/SMAA_High.hlsl +++ b/src/Effects/SMAA/SMAA_High.hlsl @@ -1,13 +1,16 @@ //!MAGPIE EFFECT -//!VERSION 3 -//!OUTPUT_WIDTH INPUT_WIDTH -//!OUTPUT_HEIGHT INPUT_HEIGHT +//!VERSION 4 //!SORT_NAME SMAA_2 //!TEXTURE Texture2D INPUT; +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +Texture2D OUTPUT; + //!TEXTURE //!WIDTH INPUT_WIDTH //!HEIGHT INPUT_HEIGHT @@ -71,6 +74,7 @@ float4 Pass2(float2 pos) { //!DESC Neighborhood Blending //!STYLE PS //!IN INPUT, blendTex +//!OUT OUTPUT float4 Pass3(float2 pos) { return SMAANeighborhoodBlendingPS(pos, INPUT, blendTex); diff --git a/src/Effects/SMAA/SMAA_Low.hlsl b/src/Effects/SMAA/SMAA_Low.hlsl index c83d4851b..f8ded0640 100644 --- a/src/Effects/SMAA/SMAA_Low.hlsl +++ b/src/Effects/SMAA/SMAA_Low.hlsl @@ -1,13 +1,16 @@ //!MAGPIE EFFECT -//!VERSION 3 -//!OUTPUT_WIDTH INPUT_WIDTH -//!OUTPUT_HEIGHT INPUT_HEIGHT +//!VERSION 4 //!SORT_NAME SMAA_0 //!TEXTURE Texture2D INPUT; +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +Texture2D OUTPUT; + //!TEXTURE //!WIDTH INPUT_WIDTH //!HEIGHT INPUT_HEIGHT @@ -71,6 +74,7 @@ float4 Pass2(float2 pos) { //!DESC Neighborhood Blending //!STYLE PS //!IN INPUT, blendTex +//!OUT OUTPUT float4 Pass3(float2 pos) { return SMAANeighborhoodBlendingPS(pos, INPUT, blendTex); diff --git a/src/Effects/SMAA/SMAA_Medium.hlsl b/src/Effects/SMAA/SMAA_Medium.hlsl index 1898e152e..e3af0f765 100644 --- a/src/Effects/SMAA/SMAA_Medium.hlsl +++ b/src/Effects/SMAA/SMAA_Medium.hlsl @@ -1,13 +1,16 @@ //!MAGPIE EFFECT -//!VERSION 3 -//!OUTPUT_WIDTH INPUT_WIDTH -//!OUTPUT_HEIGHT INPUT_HEIGHT +//!VERSION 4 //!SORT_NAME SMAA_1 //!TEXTURE Texture2D INPUT; +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +Texture2D OUTPUT; + //!TEXTURE //!WIDTH INPUT_WIDTH //!HEIGHT INPUT_HEIGHT @@ -71,6 +74,7 @@ float4 Pass2(float2 pos) { //!DESC Neighborhood Blending //!STYLE PS //!IN INPUT, blendTex +//!OUT OUTPUT float4 Pass3(float2 pos) { return SMAANeighborhoodBlendingPS(pos, INPUT, blendTex); diff --git a/src/Effects/SMAA/SMAA_Ultra.hlsl b/src/Effects/SMAA/SMAA_Ultra.hlsl index df0ab55d8..2d8b018be 100644 --- a/src/Effects/SMAA/SMAA_Ultra.hlsl +++ b/src/Effects/SMAA/SMAA_Ultra.hlsl @@ -1,13 +1,16 @@ //!MAGPIE EFFECT -//!VERSION 3 -//!OUTPUT_WIDTH INPUT_WIDTH -//!OUTPUT_HEIGHT INPUT_HEIGHT +//!VERSION 4 //!SORT_NAME SMAA_3 //!TEXTURE Texture2D INPUT; +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +Texture2D OUTPUT; + //!TEXTURE //!WIDTH INPUT_WIDTH //!HEIGHT INPUT_HEIGHT @@ -71,6 +74,7 @@ float4 Pass2(float2 pos) { //!DESC Neighborhood Blending //!STYLE PS //!IN INPUT, blendTex +//!OUT OUTPUT float4 Pass3(float2 pos) { return SMAANeighborhoodBlendingPS(pos, INPUT, blendTex); diff --git a/src/Effects/Sharpen/FineSharp.hlsl b/src/Effects/Sharpen/FineSharp.hlsl index 1bdd4212e..ed8cae4f0 100644 --- a/src/Effects/Sharpen/FineSharp.hlsl +++ b/src/Effects/Sharpen/FineSharp.hlsl @@ -6,9 +6,7 @@ // The sharpener makes no attempt to filter noise or source artefacts and will sharpen those too.So denoise / clean your source first if necessary.Probably won't work very well on a really old GPU, the weakest I have tried is a GTX 560 at 1080p 60fps with no problems. //!MAGPIE EFFECT -//!VERSION 3 -//!OUTPUT_WIDTH INPUT_WIDTH -//!OUTPUT_HEIGHT INPUT_HEIGHT +//!VERSION 4 //!PARAMETER @@ -51,6 +49,11 @@ float xrep; //!TEXTURE Texture2D INPUT; +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +Texture2D OUTPUT; + //!TEXTURE //!WIDTH OUTPUT_WIDTH //!HEIGHT OUTPUT_HEIGHT @@ -381,6 +384,7 @@ void Pass4(uint2 blockStart, uint3 threadId) { //!PASS 5 //!DESC Part C //!IN tex2 +//!OUT OUTPUT //!BLOCK_SIZE 16 //!NUM_THREADS 64 @@ -391,7 +395,9 @@ static const float3x3 YUVtoRGB = GetInputSize().y <= 576 ? YUVtoRGB(0.114, 0.299 void Pass5(uint2 blockStart, uint3 threadId) { uint2 gxy = (Rmp8x8(threadId.x) << 1) + blockStart; - if (!CheckViewport(gxy)) { + + const uint2 outputSize = GetOutputSize(); + if (gxy.x >= outputSize.x || gxy.y >= outputSize.y) { return; } @@ -429,19 +435,13 @@ void Pass5(uint2 blockStart, uint3 threadId) { [unroll] for (j = 1; j <= 2; ++j) { uint2 destPos = gxy + uint2(i - 1, j - 1); - - if (i != 1 || j != 1) { - if (!CheckViewport(destPos)) { - continue; - } - } float4 o = src[i][j]; float edge = abs(src[i][j - 1].x + src[i - 1][j].x + src[i + 1][j].x + src[i][j + 1].x - 4 * o.x); o.x = lerp(o.a, o.x, xstr * (1 - saturate(edge * xrep))); - WriteToOutput(destPos, mul(YUVtoRGB, o.xyz - float3(0.0, 0.5, 0.5))); + OUTPUT[destPos] = float4(mul(YUVtoRGB, o.xyz - float3(0.0, 0.5, 0.5)), 1); } } } diff --git a/src/Effects/Sharpen/LCAS.hlsl b/src/Effects/Sharpen/LCAS.hlsl index 431b69131..65e04782a 100644 --- a/src/Effects/Sharpen/LCAS.hlsl +++ b/src/Effects/Sharpen/LCAS.hlsl @@ -1,7 +1,7 @@ // This is a combination of linear interpolation and light version of cas //!MAGPIE EFFECT -//!VERSION 3 +//!VERSION 4 //!PARAMETER //!LABEL Sharpness @@ -14,12 +14,16 @@ float sharpness; //!TEXTURE Texture2D INPUT; +//!TEXTURE +Texture2D OUTPUT; + //!SAMPLER //!FILTER LINEAR SamplerState sam; //!PASS 1 //!IN INPUT +//!OUT OUTPUT //!BLOCK_SIZE 16 //!NUM_THREADS 64 @@ -71,26 +75,22 @@ float3 LCAS(uint2 ip, float peak) { void Pass1(uint2 blockStart, uint3 threadId) { uint2 gxy = blockStart + Rmp8x8(threadId.x); - if (!CheckViewport(gxy)) { + + const uint2 outputSize = GetOutputSize(); + if (gxy.x >= outputSize.x || gxy.y >= outputSize.y) { return; } const float peak = lerp(0, -0.1111111111111111, sharpness); - WriteToOutput(gxy, LCAS(gxy, peak)); + OUTPUT[gxy] = float4(LCAS(gxy, peak), 1); gxy.x += 8u; - if (CheckViewport(gxy)) { - WriteToOutput(gxy, LCAS(gxy, peak)); - } + OUTPUT[gxy] = float4(LCAS(gxy, peak), 1); gxy.y += 8u; - if (CheckViewport(gxy)) { - WriteToOutput(gxy, LCAS(gxy, peak)); - } + OUTPUT[gxy] = float4(LCAS(gxy, peak), 1); gxy.x -= 8u; - if (CheckViewport(gxy)) { - WriteToOutput(gxy, LCAS(gxy, peak)); - } + OUTPUT[gxy] = float4(LCAS(gxy, peak), 1); } diff --git a/src/Effects/Sharpen/LumaSharpen.hlsl b/src/Effects/Sharpen/LumaSharpen.hlsl index 9672ea218..1ffc8d6a9 100644 --- a/src/Effects/Sharpen/LumaSharpen.hlsl +++ b/src/Effects/Sharpen/LumaSharpen.hlsl @@ -13,9 +13,7 @@ */ //!MAGPIE EFFECT -//!VERSION 3 -//!OUTPUT_WIDTH INPUT_WIDTH -//!OUTPUT_HEIGHT INPUT_HEIGHT +//!VERSION 4 //!PARAMETER @@ -64,6 +62,11 @@ float offsetBias; //!TEXTURE Texture2D INPUT; +//!TEXTURE +//!WIDTH INPUT_WIDTH +//!HEIGHT INPUT_HEIGHT +Texture2D OUTPUT; + //!SAMPLER //!FILTER LINEAR SamplerState sam; @@ -72,6 +75,7 @@ SamplerState sam; //!PASS 1 //!STYLE PS //!IN INPUT +//!OUT OUTPUT /*-----------------------------------------------------------. / Developer settings / diff --git a/src/Effects/xBRZ/xBRZ_2x.hlsl b/src/Effects/xBRZ/xBRZ_2x.hlsl index 157b6f70a..b6a066709 100644 --- a/src/Effects/xBRZ/xBRZ_2x.hlsl +++ b/src/Effects/xBRZ/xBRZ_2x.hlsl @@ -1,14 +1,17 @@ // 移植自 https://github.com/libretro/common-shaders/blob/master/xbrz/shaders/2xbrz.cg //!MAGPIE EFFECT -//!VERSION 3 -//!OUTPUT_WIDTH INPUT_WIDTH * 2 -//!OUTPUT_HEIGHT INPUT_HEIGHT * 2 +//!VERSION 4 //!TEXTURE Texture2D INPUT; +//!TEXTURE +//!WIDTH INPUT_WIDTH * 2 +//!HEIGHT INPUT_HEIGHT * 2 +Texture2D OUTPUT; + //!SAMPLER //!FILTER POINT SamplerState sam; @@ -16,6 +19,7 @@ SamplerState sam; //!PASS 1 //!IN INPUT +//!OUT OUTPUT //!BLOCK_SIZE 16 //!NUM_THREADS 64 @@ -87,7 +91,8 @@ void ScalePixel(const int4 blend, const float3 k[9], inout float3 dst[4]) { void Pass1(uint2 blockStart, uint3 threadId) { uint2 gxy = (Rmp8x8(threadId.x) << 1) + blockStart; - if (!CheckViewport(gxy)) { + const uint2 outputSize = GetOutputSize(); + if (gxy.x >= outputSize.x || gxy.y >= outputSize.y) { return; } @@ -282,20 +287,14 @@ void Pass1(uint2 blockStart, uint3 threadId) { dst[0] = tempDst3; } - WriteToOutput(gxy, dst[0]); + OUTPUT[gxy] = float4(dst[0], 1); ++gxy.x; - if (CheckViewport(gxy)) { - WriteToOutput(gxy, dst[1]); - } + OUTPUT[gxy] = float4(dst[1], 1); ++gxy.y; - if (CheckViewport(gxy)) { - WriteToOutput(gxy, dst[2]); - } + OUTPUT[gxy] = float4(dst[2], 1); --gxy.x; - if (CheckViewport(gxy)) { - WriteToOutput(gxy, dst[3]); - } + OUTPUT[gxy] = float4(dst[3], 1); } diff --git a/src/Effects/xBRZ/xBRZ_3x.hlsl b/src/Effects/xBRZ/xBRZ_3x.hlsl index 26c184e84..52eb53560 100644 --- a/src/Effects/xBRZ/xBRZ_3x.hlsl +++ b/src/Effects/xBRZ/xBRZ_3x.hlsl @@ -1,14 +1,17 @@ // 移植自 https://github.com/libretro/common-shaders/blob/master/xbrz/shaders/3xbrz.cg //!MAGPIE EFFECT -//!VERSION 3 -//!OUTPUT_WIDTH INPUT_WIDTH * 3 -//!OUTPUT_HEIGHT INPUT_HEIGHT * 3 +//!VERSION 4 //!TEXTURE Texture2D INPUT; +//!TEXTURE +//!WIDTH INPUT_WIDTH * 3 +//!HEIGHT INPUT_HEIGHT * 3 +Texture2D OUTPUT; + //!SAMPLER //!FILTER POINT SamplerState sam; @@ -16,6 +19,7 @@ SamplerState sam; //!PASS 1 //!IN INPUT +//!OUT OUTPUT //!BLOCK_SIZE 24 //!NUM_THREADS 64 @@ -98,7 +102,8 @@ const static uint destIdx[3][3] = { void Pass1(uint2 blockStart, uint3 threadId) { const uint2 gxy = (Rmp8x8(threadId.x) * 3) + blockStart; - if (!CheckViewport(gxy)) { + const uint2 outputSize = GetOutputSize(); + if (gxy.x >= outputSize.x || gxy.y >= outputSize.y) { return; } @@ -323,15 +328,7 @@ void Pass1(uint2 blockStart, uint3 threadId) { for (uint i = 0; i < 3; ++i) { [unroll] for (uint j = 0; j < 3; ++j) { - const uint2 destPos = gxy + uint2(i, j); - - if (i != 0 || j != 0) { - if (!CheckViewport(destPos)) { - continue; - } - } - - WriteToOutput(destPos, dst[destIdx[j][i]]); + OUTPUT[gxy + uint2(i, j)] = float4(dst[destIdx[j][i]], 1); } } } diff --git a/src/Effects/xBRZ/xBRZ_4x.hlsl b/src/Effects/xBRZ/xBRZ_4x.hlsl index bca5853f4..79ab5377e 100644 --- a/src/Effects/xBRZ/xBRZ_4x.hlsl +++ b/src/Effects/xBRZ/xBRZ_4x.hlsl @@ -1,14 +1,17 @@ // 移植自 https://github.com/libretro/common-shaders/blob/master/xbrz/shaders/4xbrz.cg //!MAGPIE EFFECT -//!VERSION 3 -//!OUTPUT_WIDTH INPUT_WIDTH * 4 -//!OUTPUT_HEIGHT INPUT_HEIGHT * 4 +//!VERSION 4 //!TEXTURE Texture2D INPUT; +//!TEXTURE +//!WIDTH INPUT_WIDTH * 4 +//!HEIGHT INPUT_HEIGHT * 4 +Texture2D OUTPUT; + //!SAMPLER //!FILTER POINT SamplerState sam; @@ -16,6 +19,7 @@ SamplerState sam; //!PASS 1 //!IN INPUT +//!OUT OUTPUT //!BLOCK_SIZE 32 //!NUM_THREADS 64 @@ -72,7 +76,8 @@ const static uint destIdx[4][4] = { void Pass1(uint2 blockStart, uint3 threadId) { uint2 gxy = (Rmp8x8(threadId.x) << 2) + blockStart; - if (!CheckViewport(gxy)) { + const uint2 outputSize = GetOutputSize(); + if (gxy.x >= outputSize.x || gxy.y >= outputSize.y) { return; } @@ -307,15 +312,7 @@ void Pass1(uint2 blockStart, uint3 threadId) { for (uint i = 0; i < 4; ++i) { [unroll] for (uint j = 0; j < 4; ++j) { - const uint2 destPos = gxy + uint2(i, j); - - if (i != 0 || j != 0) { - if (!CheckViewport(destPos)) { - continue; - } - } - - WriteToOutput(destPos, dst[destIdx[j][i]]); + OUTPUT[gxy + uint2(i, j)] = float4(dst[destIdx[j][i]], 1); } } } diff --git a/src/Effects/xBRZ/xBRZ_5x.hlsl b/src/Effects/xBRZ/xBRZ_5x.hlsl index 9465d91f8..a52a31fca 100644 --- a/src/Effects/xBRZ/xBRZ_5x.hlsl +++ b/src/Effects/xBRZ/xBRZ_5x.hlsl @@ -1,14 +1,17 @@ // 移植自 https://github.com/libretro/common-shaders/blob/master/xbrz/shaders/5xbrz.cg //!MAGPIE EFFECT -//!VERSION 3 -//!OUTPUT_WIDTH INPUT_WIDTH * 5 -//!OUTPUT_HEIGHT INPUT_HEIGHT * 5 +//!VERSION 4 //!TEXTURE Texture2D INPUT; +//!TEXTURE +//!WIDTH INPUT_WIDTH * 5 +//!HEIGHT INPUT_HEIGHT * 5 +Texture2D OUTPUT; + //!SAMPLER //!FILTER POINT SamplerState sam; @@ -16,6 +19,7 @@ SamplerState sam; //!PASS 1 //!IN INPUT +//!OUT OUTPUT //!BLOCK_SIZE 40 //!NUM_THREADS 64 @@ -74,7 +78,8 @@ const static uint destIdx[5][5] = { void Pass1(uint2 blockStart, uint3 threadId) { uint2 gxy = (Rmp8x8(threadId.x) * 5) + blockStart; - if (!CheckViewport(gxy)) { + const uint2 outputSize = GetOutputSize(); + if (gxy.x >= outputSize.x || gxy.y >= outputSize.y) { return; } @@ -334,15 +339,7 @@ void Pass1(uint2 blockStart, uint3 threadId) { for (uint i = 0; i < 5; ++i) { [unroll] for (uint j = 0; j < 5; ++j) { - const uint2 destPos = gxy + uint2(i, j); - - if (i != 0 || j != 0) { - if (!CheckViewport(destPos)) { - continue; - } - } - - WriteToOutput(destPos, dst[destIdx[j][i]]); + OUTPUT[gxy + uint2(i, j)] = float4(dst[destIdx[j][i]], 1); } } } diff --git a/src/Effects/xBRZ/xBRZ_6x.hlsl b/src/Effects/xBRZ/xBRZ_6x.hlsl index 49ab9b80c..03f20dd1e 100644 --- a/src/Effects/xBRZ/xBRZ_6x.hlsl +++ b/src/Effects/xBRZ/xBRZ_6x.hlsl @@ -1,14 +1,17 @@ // 移植自 https://github.com/libretro/common-shaders/blob/master/xbrz/shaders/6xbrz.cg //!MAGPIE EFFECT -//!VERSION 3 -//!OUTPUT_WIDTH INPUT_WIDTH * 6 -//!OUTPUT_HEIGHT INPUT_HEIGHT * 6 +//!VERSION 4 //!TEXTURE Texture2D INPUT; +//!TEXTURE +//!WIDTH INPUT_WIDTH * 6 +//!HEIGHT INPUT_HEIGHT * 6 +Texture2D OUTPUT; + //!SAMPLER //!FILTER POINT SamplerState sam; @@ -16,6 +19,7 @@ SamplerState sam; //!PASS 1 //!IN INPUT +//!OUT OUTPUT //!BLOCK_SIZE 48 //!NUM_THREADS 64 @@ -80,7 +84,8 @@ const static uint destIdx[6][6] = { void Pass1(uint2 blockStart, uint3 threadId) { uint2 gxy = (Rmp8x8(threadId.x) * 6) + blockStart; - if (!CheckViewport(gxy)) { + const uint2 outputSize = GetOutputSize(); + if (gxy.x >= outputSize.x || gxy.y >= outputSize.y) { return; } @@ -366,15 +371,7 @@ void Pass1(uint2 blockStart, uint3 threadId) { for (uint i = 0; i < 6; ++i) { [unroll] for (uint j = 0; j < 6; ++j) { - const uint2 destPos = gxy + uint2(i, j); - - if (i != 0 || j != 0) { - if (!CheckViewport(destPos)) { - continue; - } - } - - WriteToOutput(destPos, dst[destIdx[j][i]]); + OUTPUT[gxy + uint2(i, j)] = float4(dst[destIdx[j][i]], 1); } } } diff --git a/src/Effects/xBRZ/xBRZ_Freescale.hlsl b/src/Effects/xBRZ/xBRZ_Freescale.hlsl index 27f70dbac..b0afe789c 100644 --- a/src/Effects/xBRZ/xBRZ_Freescale.hlsl +++ b/src/Effects/xBRZ/xBRZ_Freescale.hlsl @@ -1,12 +1,15 @@ // 移植自 https://github.com/libretro/common-shaders/tree/master/xbrz/shaders/xbrz-freescale-multipass //!MAGPIE EFFECT -//!VERSION 3 +//!VERSION 4 //!TEXTURE Texture2D INPUT; +//!TEXTURE +Texture2D OUTPUT; + //!TEXTURE //!WIDTH INPUT_WIDTH //!HEIGHT INPUT_HEIGHT @@ -272,6 +275,7 @@ void Pass1(uint2 blockStart, uint3 threadId) { //!PASS 2 //!IN INPUT, tex1 +//!OUT OUTPUT //!BLOCK_SIZE 8 //!NUM_THREADS 64 @@ -279,7 +283,9 @@ void Pass1(uint2 blockStart, uint3 threadId) { void Pass2(uint2 blockStart, uint3 threadId) { uint2 gxy = Rmp8x8(threadId.x) + blockStart; - if (!CheckViewport(gxy)) { + + const uint2 outputSize = GetOutputSize(); + if (gxy.x >= outputSize.x || gxy.y >= outputSize.y) { return; } @@ -379,5 +385,5 @@ void Pass2(uint2 blockStart, uint3 threadId) { res = lerp(res, blendPix, get_left_ratio(f, origin, direction, scale)); } - WriteToOutput(gxy, res); + OUTPUT[gxy] = float4(res, 1); } From c5542d881add7d486d72bd2156de0ad9463a243d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=97=AD?= Date: Wed, 20 Mar 2024 16:35:31 +0800 Subject: [PATCH 126/155] =?UTF-8?q?feat:=20=E5=AE=9E=E7=8E=B0=20DwmSharedS?= =?UTF-8?q?urface=20=E6=8D=95=E8=8E=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DwmSharedSurfaceFrameSource.cpp | 110 ++++++++++++++++++ src/Magpie.Core/DwmSharedSurfaceFrameSource.h | 35 ++++++ src/Magpie.Core/Magpie.Core.vcxproj | 2 + src/Magpie.Core/Magpie.Core.vcxproj.filters | 6 + src/Magpie.Core/Renderer.cpp | 7 +- 5 files changed, 157 insertions(+), 3 deletions(-) create mode 100644 src/Magpie.Core/DwmSharedSurfaceFrameSource.cpp create mode 100644 src/Magpie.Core/DwmSharedSurfaceFrameSource.h diff --git a/src/Magpie.Core/DwmSharedSurfaceFrameSource.cpp b/src/Magpie.Core/DwmSharedSurfaceFrameSource.cpp new file mode 100644 index 000000000..43fff1280 --- /dev/null +++ b/src/Magpie.Core/DwmSharedSurfaceFrameSource.cpp @@ -0,0 +1,110 @@ +#include "pch.h" +#include "DwmSharedSurfaceFrameSource.h" +#include "Logger.h" +#include "ScalingWindow.h" +#include "DirectXHelper.h" +#include "DeviceResources.h" + +namespace Magpie::Core { + +using DwmGetDxSharedSurfaceFunc = BOOL( + HWND hWnd, + HANDLE* phSurface, + LUID* pAdapterLuid, + ULONG* pFmtWindow, + ULONG* pPresentFlags, + ULONGLONG* pWin32KUpdateId +); + +static DwmGetDxSharedSurfaceFunc* dwmGetDxSharedSurface = nullptr; + +bool DwmSharedSurfaceFrameSource::_Initialize() noexcept { + if (!dwmGetDxSharedSurface) { + HMODULE hUser32 = GetModuleHandle(L"user32.dll"); + assert(hUser32); + dwmGetDxSharedSurface = (DwmGetDxSharedSurfaceFunc*)GetProcAddress(hUser32, "DwmGetDxSharedSurface"); + + if (!dwmGetDxSharedSurface) { + Logger::Get().Win32Error("获取函数 DwmGetDxSharedSurface 地址失败"); + return false; + } + } + + if (!_CalcSrcRect()) { + return false; + } + + HWND hwndSrc = ScalingWindow::Get().HwndSrc(); + + double a, bx, by; + if (!_GetMapToOriginDPI(hwndSrc, a, bx, by)) { + Logger::Get().Error("_GetMapToOriginDPI 失败"); + return false; + } + + Logger::Get().Info(fmt::format("源窗口 DPI 缩放为 {}", 1 / a)); + + RECT frameRect = { + std::lround(_srcRect.left * a + bx), + std::lround(_srcRect.top * a + by), + std::lround(_srcRect.right * a + bx), + std::lround(_srcRect.bottom * a + by) + }; + if (frameRect.left < 0 || frameRect.top < 0 || frameRect.right < 0 + || frameRect.bottom < 0 || frameRect.right - frameRect.left <= 0 + || frameRect.bottom - frameRect.top <= 0 + ) { + Logger::Get().Error("裁剪失败"); + return false; + } + + _frameInWnd = { + (UINT)frameRect.left, + (UINT)frameRect.top, + 0, + (UINT)frameRect.right, + (UINT)frameRect.bottom, + 1 + }; + + _output = DirectXHelper::CreateTexture2D( + _deviceResources->GetD3DDevice(), + DXGI_FORMAT_B8G8R8A8_UNORM, + frameRect.right - frameRect.left, + frameRect.bottom - frameRect.top, + D3D11_BIND_SHADER_RESOURCE + ); + if (!_output) { + Logger::Get().Error("CreateTexture2D 失败"); + return false; + } + + Logger::Get().Info("DwmSharedSurfaceFrameSource 初始化完成"); + return true; +} + +FrameSourceBase::UpdateState DwmSharedSurfaceFrameSource::_Update() noexcept { + HANDLE sharedTextureHandle = NULL; + if (!dwmGetDxSharedSurface(ScalingWindow::Get().HwndSrc(), + &sharedTextureHandle, nullptr, nullptr, nullptr, nullptr) + || !sharedTextureHandle + ) { + Logger::Get().Win32Error("DwmGetDxSharedSurface 失败"); + return UpdateState::Error; + } + + winrt::com_ptr sharedTexture; + HRESULT hr = _deviceResources->GetD3DDevice() + ->OpenSharedResource(sharedTextureHandle, IID_PPV_ARGS(&sharedTexture)); + if (FAILED(hr)) { + Logger::Get().ComError("OpenSharedResource 失败", hr); + return UpdateState::Error; + } + + _deviceResources->GetD3DDC()->CopySubresourceRegion( + _output.get(), 0, 0, 0, 0, sharedTexture.get(), 0, &_frameInWnd); + + return UpdateState::NewFrame; +} + +} diff --git a/src/Magpie.Core/DwmSharedSurfaceFrameSource.h b/src/Magpie.Core/DwmSharedSurfaceFrameSource.h new file mode 100644 index 000000000..cd2a11452 --- /dev/null +++ b/src/Magpie.Core/DwmSharedSurfaceFrameSource.h @@ -0,0 +1,35 @@ +#pragma once +#include "FrameSourceBase.h" + +namespace Magpie::Core { + +class DwmSharedSurfaceFrameSource : public FrameSourceBase { +public: + virtual ~DwmSharedSurfaceFrameSource() {} + + bool IsScreenCapture() const noexcept override { + return false; + } + + const char* Name() const noexcept override { + return "DwmSharedSurface"; + } + +protected: + bool _Initialize() noexcept override; + + UpdateState _Update() noexcept override; + + bool _HasRoundCornerInWin11() noexcept override { + return false; + } + + bool _CanCaptureTitleBar() noexcept override { + return false; + } + +private: + D3D11_BOX _frameInWnd{}; +}; + +} diff --git a/src/Magpie.Core/Magpie.Core.vcxproj b/src/Magpie.Core/Magpie.Core.vcxproj index bae8e4658..895bdbef3 100644 --- a/src/Magpie.Core/Magpie.Core.vcxproj +++ b/src/Magpie.Core/Magpie.Core.vcxproj @@ -50,6 +50,7 @@ + @@ -83,6 +84,7 @@ + diff --git a/src/Magpie.Core/Magpie.Core.vcxproj.filters b/src/Magpie.Core/Magpie.Core.vcxproj.filters index e8797d7e8..0f4d9bd2c 100644 --- a/src/Magpie.Core/Magpie.Core.vcxproj.filters +++ b/src/Magpie.Core/Magpie.Core.vcxproj.filters @@ -89,6 +89,9 @@ + + Capture + @@ -140,6 +143,9 @@ + + Capture + diff --git a/src/Magpie.Core/Renderer.cpp b/src/Magpie.Core/Renderer.cpp index 4580bbd38..71a0fdf45 100644 --- a/src/Magpie.Core/Renderer.cpp +++ b/src/Magpie.Core/Renderer.cpp @@ -10,6 +10,7 @@ #include "EffectCompiler.h" #include "GraphicsCaptureFrameSource.h" #include "GDIFrameSource.h" +#include "DwmSharedSurfaceFrameSource.h" #include "DirectXHelper.h" #include #include "ScalingWindow.h" @@ -361,9 +362,9 @@ bool Renderer::_InitFrameSource() noexcept { case CaptureMethod::GDI: _frameSource = std::make_unique(); break; - /*case CaptureMethod::DwmSharedSurface: - frameSource = std::make_unique(); - break;*/ + case CaptureMethod::DwmSharedSurface: + _frameSource = std::make_unique(); + break; default: Logger::Get().Error("未知的捕获模式"); return false; From fe3d29baa057a0841d28678b642b301c53d5d712 Mon Sep 17 00:00:00 2001 From: Xu <34770031+Blinue@users.noreply.github.com> Date: Wed, 20 Mar 2024 21:10:04 +0800 Subject: [PATCH 127/155] =?UTF-8?q?feat:=20=E5=AE=9E=E7=8E=B0=20DesktopDup?= =?UTF-8?q?lication=20=E6=8D=95=E8=8E=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DesktopDuplicationFrameSource.cpp | 353 ++++++++++++++++++ .../DesktopDuplicationFrameSource.h | 60 +++ .../DwmSharedSurfaceFrameSource.cpp | 1 + src/Magpie.Core/DwmSharedSurfaceFrameSource.h | 2 +- src/Magpie.Core/GDIFrameSource.h | 2 +- src/Magpie.Core/GraphicsCaptureFrameSource.h | 4 +- src/Magpie.Core/Magpie.Core.vcxproj | 2 + src/Magpie.Core/Magpie.Core.vcxproj.filters | 6 + src/Magpie.Core/Renderer.cpp | 7 +- 9 files changed, 430 insertions(+), 7 deletions(-) create mode 100644 src/Magpie.Core/DesktopDuplicationFrameSource.cpp create mode 100644 src/Magpie.Core/DesktopDuplicationFrameSource.h diff --git a/src/Magpie.Core/DesktopDuplicationFrameSource.cpp b/src/Magpie.Core/DesktopDuplicationFrameSource.cpp new file mode 100644 index 000000000..fb1ba16b8 --- /dev/null +++ b/src/Magpie.Core/DesktopDuplicationFrameSource.cpp @@ -0,0 +1,353 @@ +#include "pch.h" +#include "DesktopDuplicationFrameSource.h" +#include "Logger.h" +#include "Win32Utils.h" +#include "ScalingWindow.h" +#include "DeviceResources.h" +#include "DirectXHelper.h" +#include "SmallVector.h" + +namespace Magpie::Core { + +static winrt::com_ptr FindMonitor(IDXGIAdapter1* adapter, HMONITOR hMonitor) noexcept { + winrt::com_ptr output; + + for (UINT adapterIndex = 0; + SUCCEEDED(adapter->EnumOutputs(adapterIndex, output.put())); + ++adapterIndex + ) { + DXGI_OUTPUT_DESC desc; + HRESULT hr = output->GetDesc(&desc); + if (FAILED(hr)) { + Logger::Get().ComError("GetDesc 失败", hr); + continue; + } + + if (desc.Monitor == hMonitor) { + winrt::com_ptr output1 = output.try_as(); + if (!output1) { + Logger::Get().Error("从 IDXGIOutput 获取 IDXGIOutput1 失败"); + return nullptr; + } + + return output1; + } + } + + return nullptr; +} + +DesktopDuplicationFrameSource::~DesktopDuplicationFrameSource() { + _exiting.store(true, std::memory_order_release); + WaitForSingleObject(_hDDPThread, 1000); +} + +bool DesktopDuplicationFrameSource::_Initialize() noexcept { + // WDA_EXCLUDEFROMCAPTURE 只在 Win10 20H1 及更新版本中可用 + if (!Win32Utils::GetOSVersion().Is20H1OrNewer()) { + Logger::Get().Error("当前操作系统无法使用 Desktop Duplication"); + return false; + } + + const HWND hwndSrc = ScalingWindow::Get().HwndSrc(); + + HMONITOR hMonitor = MonitorFromWindow(hwndSrc, MONITOR_DEFAULTTONEAREST); + if (!hMonitor) { + Logger::Get().Win32Error("MonitorFromWindow 失败"); + return false; + } + + MONITORINFO mi{}; + mi.cbSize = sizeof(mi); + if (!GetMonitorInfo(hMonitor, &mi)) { + Logger::Get().Win32Error("GetMonitorInfo 失败"); + return false; + } + + if (!_CenterWindowIfNecessary(hwndSrc, mi.rcWork)) { + Logger::Get().Error("居中源窗口失败"); + return false; + } + + if (!_CalcSrcRect()) { + Logger::Get().Error("_CalcSrcRect 失败"); + return false; + } + + _output = DirectXHelper::CreateTexture2D( + _deviceResources->GetD3DDevice(), + DXGI_FORMAT_B8G8R8A8_UNORM, + _srcRect.right - _srcRect.left, + _srcRect.bottom - _srcRect.top, + D3D11_BIND_SHADER_RESOURCE + ); + if (!_output) { + Logger::Get().Error("CreateTexture2D 失败"); + return false; + } + + // 创建共享纹理 + _sharedTex = DirectXHelper::CreateTexture2D( + _deviceResources->GetD3DDevice(), + DXGI_FORMAT_B8G8R8A8_UNORM, + _srcRect.right - _srcRect.left, + _srcRect.bottom - _srcRect.top, + D3D11_BIND_SHADER_RESOURCE, + D3D11_USAGE_DEFAULT, + D3D11_RESOURCE_MISC_SHARED_KEYEDMUTEX + ); + if (!_sharedTex) { + Logger::Get().Error("CreateTexture2D 失败"); + return false; + } + + _sharedTexMutex = _sharedTex.try_as(); + if (!_sharedTexMutex) { + Logger::Get().Error("检索 IDXGIKeyedMutex 失败"); + return false; + } + + winrt::com_ptr sharedDxgiRes = _sharedTex.try_as(); + if (!sharedDxgiRes) { + Logger::Get().Error("检索 IDXGIResource 失败"); + return false; + } + + HANDLE hSharedTex = NULL; + HRESULT hr = sharedDxgiRes->GetSharedHandle(&hSharedTex); + if (FAILED(hr)) { + Logger::Get().Error("GetSharedHandle 失败"); + return false; + } + + if (!_InitializeDdpD3D(hSharedTex)) { + Logger::Get().Error("初始化 D3D 失败"); + return false; + } + + winrt::com_ptr output = FindMonitor( + _deviceResources->GetGraphicsAdapter(), hMonitor); + if (!output) { + Logger::Get().Error("无法找到 IDXGIOutput"); + return false; + } + + hr = output->DuplicateOutput(_ddpD3dDevice.get(), _outputDup.put()); + if (FAILED(hr)) { + Logger::Get().ComError("DuplicateOutput 失败", hr); + return false; + } + + // 计算源窗口客户区在该屏幕上的位置,用于计算新帧是否有更新 + _srcClientInMonitor = { + _srcRect.left - mi.rcMonitor.left, + _srcRect.top - mi.rcMonitor.top, + _srcRect.right - mi.rcMonitor.left, + _srcRect.bottom - mi.rcMonitor.top + }; + + _frameInMonitor = { + (UINT)_srcClientInMonitor.left, + (UINT)_srcClientInMonitor.top, + 0, + (UINT)_srcClientInMonitor.right, + (UINT)_srcClientInMonitor.bottom, + 1 + }; + + // 使全屏窗口无法被捕获到 + if (!SetWindowDisplayAffinity(ScalingWindow::Get().Handle(), WDA_EXCLUDEFROMCAPTURE)) { + Logger::Get().Win32Error("SetWindowDisplayAffinity 失败"); + return false; + } + + _hDDPThread = CreateThread(nullptr, 0, _DDPThreadProc, this, 0, nullptr); + if (!_hDDPThread) { + return false; + } + + Logger::Get().Info("DesktopDuplicationFrameSource 初始化完成"); + return true; +} + +FrameSourceBase::UpdateState DesktopDuplicationFrameSource::_Update() noexcept { + const UINT newFrameState = _newFrameState.load(std::memory_order_acquire); + if (newFrameState == 2) { + // 第一帧之前不渲染 + return UpdateState::Waiting; + } else if (newFrameState == 0) { + return UpdateState::NoChange; + } + + // 不必等待,当 newFrameState 变化时捕获线程已将锁释放 + HRESULT hr = _sharedTexMutex->AcquireSync(1, 0); + if (hr == static_cast(WAIT_TIMEOUT)) { + return UpdateState::Waiting; + } + + if (FAILED(hr)) { + Logger::Get().ComError("AcquireSync 失败", hr); + return UpdateState::Error; + } + + // 不需要对捕获线程可见 + _newFrameState.store(0, std::memory_order_relaxed); + + _deviceResources->GetD3DDC()->CopyResource(_output.get(), _sharedTex.get()); + + _sharedTexMutex->ReleaseSync(0); + + return UpdateState::NewFrame; +} + +bool DesktopDuplicationFrameSource::_InitializeDdpD3D(HANDLE hSharedTex) { + UINT createDeviceFlags = D3D11_CREATE_DEVICE_BGRA_SUPPORT; + if (DirectXHelper::IsDebugLayersAvailable()) { + // 在 DEBUG 配置启用调试层 + createDeviceFlags |= D3D11_CREATE_DEVICE_DEBUG; + } + + D3D_FEATURE_LEVEL featureLevels[] = { + D3D_FEATURE_LEVEL_11_1, + D3D_FEATURE_LEVEL_11_0 + }; + UINT nFeatureLevels = ARRAYSIZE(featureLevels); + + // 必须使用和 Renderer 相同的图形适配器。D3D11 不允许在不同显卡间共享纹理。 + HRESULT hr = D3D11CreateDevice( + _deviceResources->GetGraphicsAdapter(), + D3D_DRIVER_TYPE_UNKNOWN, + nullptr, + createDeviceFlags, + featureLevels, + nFeatureLevels, + D3D11_SDK_VERSION, + _ddpD3dDevice.put(), + nullptr, + _ddpD3dDC.put() + ); + + if (FAILED(hr)) { + Logger::Get().ComError("D3D11CreateDevice 失败", hr); + return false; + } + + // 获取共享纹理 + hr = _ddpD3dDevice->OpenSharedResource(hSharedTex, IID_PPV_ARGS(_ddpSharedTex.put())); + if (FAILED(hr)) { + Logger::Get().ComError("OpenSharedResource 失败", hr); + return false; + } + + _ddpSharedTexMutex = _ddpSharedTex.try_as(); + if (!_ddpSharedTexMutex) { + Logger::Get().Error("检索 IDXGIKeyedMutex 失败"); + return false; + } + + return true; +} + +DWORD WINAPI DesktopDuplicationFrameSource::_DDPThreadProc(LPVOID lpThreadParameter) { + DesktopDuplicationFrameSource& that = *(DesktopDuplicationFrameSource*)lpThreadParameter; + + DXGI_OUTDUPL_FRAME_INFO info{}; + winrt::com_ptr dxgiRes; + SmallVector dupMetaData; + + while (!that._exiting.load(std::memory_order_acquire)) { + if (dxgiRes) { + that._outputDup->ReleaseFrame(); + } + HRESULT hr = that._outputDup->AcquireNextFrame(500, &info, dxgiRes.put()); + if (hr == DXGI_ERROR_WAIT_TIMEOUT) { + continue; + } + + if (FAILED(hr)) { + Logger::Get().ComError("AcquireNextFrame 失败", hr); + continue; + } + + bool noUpdate = true; + + // 检索 move rects 和 dirty rects + // 这些区域如果和窗口客户区有重叠则表明画面有变化 + if (info.TotalMetadataBufferSize) { + if (info.TotalMetadataBufferSize > dupMetaData.size()) { + dupMetaData.resize(info.TotalMetadataBufferSize); + } + + UINT bufSize = info.TotalMetadataBufferSize; + + // move rects + hr = that._outputDup->GetFrameMoveRects(bufSize, (DXGI_OUTDUPL_MOVE_RECT*)dupMetaData.data(), &bufSize); + if (FAILED(hr)) { + Logger::Get().ComError("GetFrameMoveRects 失败", hr); + continue; + } + + UINT nRect = bufSize / sizeof(DXGI_OUTDUPL_MOVE_RECT); + for (UINT i = 0; i < nRect; ++i) { + const DXGI_OUTDUPL_MOVE_RECT& rect = ((DXGI_OUTDUPL_MOVE_RECT*)dupMetaData.data())[i]; + if (Win32Utils::CheckOverlap(that._srcClientInMonitor, rect.DestinationRect)) { + noUpdate = false; + break; + } + } + + if (noUpdate) { + bufSize = info.TotalMetadataBufferSize; + + // dirty rects + hr = that._outputDup->GetFrameDirtyRects(bufSize, (RECT*)dupMetaData.data(), &bufSize); + if (FAILED(hr)) { + Logger::Get().ComError("GetFrameDirtyRects 失败", hr); + continue; + } + + nRect = bufSize / sizeof(RECT); + for (UINT i = 0; i < nRect; ++i) { + const RECT& rect = ((RECT*)dupMetaData.data())[i]; + if (Win32Utils::CheckOverlap(that._srcClientInMonitor, rect)) { + noUpdate = false; + break; + } + } + } + } + + if (noUpdate) { + continue; + } + + winrt::com_ptr d3dRes = dxgiRes.try_as(); + if (!d3dRes) { + Logger::Get().Error("从 IDXGIResource 检索 ID3D11Resource 失败"); + continue; + } + + hr = that._ddpSharedTexMutex->AcquireSync(0, 100); + while (hr == static_cast(WAIT_TIMEOUT)) { + if (that._exiting.load(std::memory_order_acquire)) { + return 0; + } + + hr = that._ddpSharedTexMutex->AcquireSync(0, 100); + } + + if (FAILED(hr)) { + Logger::Get().ComError("AcquireSync 失败", hr); + continue; + } + + + that._ddpD3dDC->CopySubresourceRegion(that._ddpSharedTex.get(), 0, 0, 0, 0, d3dRes.get(), 0, &that._frameInMonitor); + that._ddpSharedTexMutex->ReleaseSync(1); + that._newFrameState.store(1, std::memory_order_release); + } + + return 0; +} + +} diff --git a/src/Magpie.Core/DesktopDuplicationFrameSource.h b/src/Magpie.Core/DesktopDuplicationFrameSource.h new file mode 100644 index 000000000..8b9ac53fd --- /dev/null +++ b/src/Magpie.Core/DesktopDuplicationFrameSource.h @@ -0,0 +1,60 @@ +#pragma once +#include "FrameSourceBase.h" + +namespace Magpie::Core { + +class DesktopDuplicationFrameSource final : public FrameSourceBase { +public: + virtual ~DesktopDuplicationFrameSource(); + + bool IsScreenCapture() const noexcept override { + return true; + } + + const char* Name() const noexcept override { + return "Desktop Duplication"; + } + +protected: + bool _HasRoundCornerInWin11() noexcept override { + return true; + } + + bool _CanCaptureTitleBar() noexcept override { + return true; + } + + bool _Initialize() noexcept override; + + UpdateState _Update() noexcept override; + +private: + bool _InitializeDdpD3D(HANDLE hSharedTex); + + static DWORD WINAPI _DDPThreadProc(LPVOID lpThreadParameter); + + winrt::com_ptr _outputDup; + + HANDLE _hDDPThread = NULL; + std::atomic _exiting = false; + // 0: 等待新帧 + // 1: 新帧到达 + // 2: 等待第一帧 + std::atomic _newFrameState = 2; + + // DDP 线程使用的 D3D 设备 + winrt::com_ptr _ddpD3dDevice; + winrt::com_ptr _ddpD3dDC; + + // 这些均指向同一个纹理 + // 用于在 D3D Device 间同步对该纹理的访问 + winrt::com_ptr _sharedTex; + winrt::com_ptr _sharedTexMutex; + winrt::com_ptr _ddpSharedTex; + winrt::com_ptr _ddpSharedTexMutex; + + RECT _srcClientInMonitor{}; + D3D11_BOX _frameInMonitor{}; +}; + +} diff --git a/src/Magpie.Core/DwmSharedSurfaceFrameSource.cpp b/src/Magpie.Core/DwmSharedSurfaceFrameSource.cpp index 43fff1280..f069b661a 100644 --- a/src/Magpie.Core/DwmSharedSurfaceFrameSource.cpp +++ b/src/Magpie.Core/DwmSharedSurfaceFrameSource.cpp @@ -31,6 +31,7 @@ bool DwmSharedSurfaceFrameSource::_Initialize() noexcept { } if (!_CalcSrcRect()) { + Logger::Get().Error("_CalcSrcRect 失败"); return false; } diff --git a/src/Magpie.Core/DwmSharedSurfaceFrameSource.h b/src/Magpie.Core/DwmSharedSurfaceFrameSource.h index cd2a11452..34ac926ab 100644 --- a/src/Magpie.Core/DwmSharedSurfaceFrameSource.h +++ b/src/Magpie.Core/DwmSharedSurfaceFrameSource.h @@ -3,7 +3,7 @@ namespace Magpie::Core { -class DwmSharedSurfaceFrameSource : public FrameSourceBase { +class DwmSharedSurfaceFrameSource final : public FrameSourceBase { public: virtual ~DwmSharedSurfaceFrameSource() {} diff --git a/src/Magpie.Core/GDIFrameSource.h b/src/Magpie.Core/GDIFrameSource.h index d3ba09353..9b39ca9aa 100644 --- a/src/Magpie.Core/GDIFrameSource.h +++ b/src/Magpie.Core/GDIFrameSource.h @@ -3,7 +3,7 @@ namespace Magpie::Core { -class GDIFrameSource : public FrameSourceBase { +class GDIFrameSource final : public FrameSourceBase { public: virtual ~GDIFrameSource() {} diff --git a/src/Magpie.Core/GraphicsCaptureFrameSource.h b/src/Magpie.Core/GraphicsCaptureFrameSource.h index ceeafb23e..528537ba1 100644 --- a/src/Magpie.Core/GraphicsCaptureFrameSource.h +++ b/src/Magpie.Core/GraphicsCaptureFrameSource.h @@ -7,7 +7,7 @@ namespace Magpie::Core { // 使用 Window Runtime 的 Windows.Graphics.Capture API 抓取窗口 // 见 https://docs.microsoft.com/en-us/windows/uwp/audio-video-camera/screen-capture -class GraphicsCaptureFrameSource : public FrameSourceBase { +class GraphicsCaptureFrameSource final : public FrameSourceBase { public: virtual ~GraphicsCaptureFrameSource(); @@ -30,11 +30,11 @@ class GraphicsCaptureFrameSource : public FrameSourceBase { return true; } -private: bool _Initialize() noexcept override; UpdateState _Update() noexcept override; +private: bool _StartCapture() noexcept; void _StopCapture() noexcept; diff --git a/src/Magpie.Core/Magpie.Core.vcxproj b/src/Magpie.Core/Magpie.Core.vcxproj index 895bdbef3..bc75937e2 100644 --- a/src/Magpie.Core/Magpie.Core.vcxproj +++ b/src/Magpie.Core/Magpie.Core.vcxproj @@ -48,6 +48,7 @@ + @@ -82,6 +83,7 @@ + diff --git a/src/Magpie.Core/Magpie.Core.vcxproj.filters b/src/Magpie.Core/Magpie.Core.vcxproj.filters index 0f4d9bd2c..a1ad08118 100644 --- a/src/Magpie.Core/Magpie.Core.vcxproj.filters +++ b/src/Magpie.Core/Magpie.Core.vcxproj.filters @@ -92,6 +92,9 @@ Capture + + Capture + @@ -146,6 +149,9 @@ Capture + + Capture + diff --git a/src/Magpie.Core/Renderer.cpp b/src/Magpie.Core/Renderer.cpp index 71a0fdf45..f631d027c 100644 --- a/src/Magpie.Core/Renderer.cpp +++ b/src/Magpie.Core/Renderer.cpp @@ -9,6 +9,7 @@ #include "Utils.h" #include "EffectCompiler.h" #include "GraphicsCaptureFrameSource.h" +#include "DesktopDuplicationFrameSource.h" #include "GDIFrameSource.h" #include "DwmSharedSurfaceFrameSource.h" #include "DirectXHelper.h" @@ -356,9 +357,9 @@ bool Renderer::_InitFrameSource() noexcept { case CaptureMethod::GraphicsCapture: _frameSource = std::make_unique(); break; - /*case CaptureMethod::DesktopDuplication: - frameSource = std::make_unique(); - break;*/ + case CaptureMethod::DesktopDuplication: + _frameSource = std::make_unique(); + break; case CaptureMethod::GDI: _frameSource = std::make_unique(); break; From fe66e8611168f6f5e37008e8ac0072cf49ad918b Mon Sep 17 00:00:00 2001 From: Xu <34770031+Blinue@users.noreply.github.com> Date: Wed, 20 Mar 2024 21:59:06 +0800 Subject: [PATCH 128/155] =?UTF-8?q?fix:=20=E6=8F=90=E9=AB=98=E6=97=B6?= =?UTF-8?q?=E9=92=9F=E7=B2=BE=E5=BA=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Magpie.Core/StepTimer.cpp | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/Magpie.Core/StepTimer.cpp b/src/Magpie.Core/StepTimer.cpp index e5c2fe9ee..dfc955a71 100644 --- a/src/Magpie.Core/StepTimer.cpp +++ b/src/Magpie.Core/StepTimer.cpp @@ -18,12 +18,11 @@ bool StepTimer::NewFrame(bool isDupFrame) noexcept { const nanoseconds delta = now - _lastFrameTime; if (_minInterval && delta < *_minInterval) { - const nanoseconds rest = *_minInterval - delta; - if (rest > 1ms) { - // Sleep 精度太低,我们使用 WaitableTimer 睡眠 + if (*_minInterval - delta > 1ms) { + // Sleep 精度太低,我们使用 WaitableTimer 睡眠。每次只睡眠 1ms,长时间睡眠会使精度下降 // 负值表示相对时间 LARGE_INTEGER liDueTime{ - .QuadPart = (rest - 1ms).count() / -100 + .QuadPart = -10000 }; SetWaitableTimerEx(_hTimer.get(), &liDueTime, 0, NULL, NULL, 0, 0); WaitForSingleObject(_hTimer.get(), INFINITE); From d4744a33e0d7564a41bdfef08f62be9e6b30f259 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=97=AD?= Date: Thu, 21 Mar 2024 12:12:26 +0800 Subject: [PATCH 129/155] =?UTF-8?q?feat:=20=E4=BC=98=E5=8C=96=20DesktopDup?= =?UTF-8?q?lication?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DesktopDuplicationFrameSource.cpp | 46 ++++++++----------- .../DesktopDuplicationFrameSource.h | 8 ++-- src/Magpie.Core/Renderer.cpp | 4 ++ src/Magpie.Core/ScalingRuntime.cpp | 4 ++ 4 files changed, 30 insertions(+), 32 deletions(-) diff --git a/src/Magpie.Core/DesktopDuplicationFrameSource.cpp b/src/Magpie.Core/DesktopDuplicationFrameSource.cpp index fb1ba16b8..05e1344f0 100644 --- a/src/Magpie.Core/DesktopDuplicationFrameSource.cpp +++ b/src/Magpie.Core/DesktopDuplicationFrameSource.cpp @@ -38,7 +38,7 @@ static winrt::com_ptr FindMonitor(IDXGIAdapter1* adapter, HMONITOR } DesktopDuplicationFrameSource::~DesktopDuplicationFrameSource() { - _exiting.store(true, std::memory_order_release); + _exiting.store(true, std::memory_order_relaxed); WaitForSingleObject(_hDDPThread, 1000); } @@ -161,6 +161,8 @@ bool DesktopDuplicationFrameSource::_Initialize() noexcept { return false; } + _backendThreadId = GetCurrentThreadId(); + _hDDPThread = CreateThread(nullptr, 0, _DDPThreadProc, this, 0, nullptr); if (!_hDDPThread) { return false; @@ -171,31 +173,21 @@ bool DesktopDuplicationFrameSource::_Initialize() noexcept { } FrameSourceBase::UpdateState DesktopDuplicationFrameSource::_Update() noexcept { - const UINT newFrameState = _newFrameState.load(std::memory_order_acquire); - if (newFrameState == 2) { - // 第一帧之前不渲染 + if (_lastAccessMutexKey == _sharedTextureMutexKey.load(std::memory_order_relaxed)) { return UpdateState::Waiting; - } else if (newFrameState == 0) { - return UpdateState::NoChange; } - // 不必等待,当 newFrameState 变化时捕获线程已将锁释放 - HRESULT hr = _sharedTexMutex->AcquireSync(1, 0); - if (hr == static_cast(WAIT_TIMEOUT)) { - return UpdateState::Waiting; - } + _lastAccessMutexKey = ++_sharedTextureMutexKey; + HRESULT hr = _sharedTexMutex->AcquireSync(_lastAccessMutexKey - 1, INFINITE); if (FAILED(hr)) { Logger::Get().ComError("AcquireSync 失败", hr); return UpdateState::Error; } - // 不需要对捕获线程可见 - _newFrameState.store(0, std::memory_order_relaxed); - _deviceResources->GetD3DDC()->CopyResource(_output.get(), _sharedTex.get()); - _sharedTexMutex->ReleaseSync(0); + _sharedTexMutex->ReleaseSync(_lastAccessMutexKey); return UpdateState::NewFrame; } @@ -249,13 +241,17 @@ bool DesktopDuplicationFrameSource::_InitializeDdpD3D(HANDLE hSharedTex) { } DWORD WINAPI DesktopDuplicationFrameSource::_DDPThreadProc(LPVOID lpThreadParameter) { +#ifdef _DEBUG + SetThreadDescription(GetCurrentThread(), L"Magpie DesktopDuplication 线程"); +#endif + DesktopDuplicationFrameSource& that = *(DesktopDuplicationFrameSource*)lpThreadParameter; DXGI_OUTDUPL_FRAME_INFO info{}; winrt::com_ptr dxgiRes; SmallVector dupMetaData; - while (!that._exiting.load(std::memory_order_acquire)) { + while (!that._exiting.load(std::memory_order_relaxed)) { if (dxgiRes) { that._outputDup->ReleaseFrame(); } @@ -327,24 +323,18 @@ DWORD WINAPI DesktopDuplicationFrameSource::_DDPThreadProc(LPVOID lpThreadParame continue; } - hr = that._ddpSharedTexMutex->AcquireSync(0, 100); - while (hr == static_cast(WAIT_TIMEOUT)) { - if (that._exiting.load(std::memory_order_acquire)) { - return 0; - } - - hr = that._ddpSharedTexMutex->AcquireSync(0, 100); - } - + const uint64_t key = ++that._sharedTextureMutexKey; + hr = that._ddpSharedTexMutex->AcquireSync(key - 1, INFINITE); if (FAILED(hr)) { Logger::Get().ComError("AcquireSync 失败", hr); continue; } - that._ddpD3dDC->CopySubresourceRegion(that._ddpSharedTex.get(), 0, 0, 0, 0, d3dRes.get(), 0, &that._frameInMonitor); - that._ddpSharedTexMutex->ReleaseSync(1); - that._newFrameState.store(1, std::memory_order_release); + that._ddpSharedTexMutex->ReleaseSync(key); + + // 通知后端线程新帧到达 + PostThreadMessage(that._backendThreadId, WM_NULL, 0, 0); } return 0; diff --git a/src/Magpie.Core/DesktopDuplicationFrameSource.h b/src/Magpie.Core/DesktopDuplicationFrameSource.h index 8b9ac53fd..af72d285c 100644 --- a/src/Magpie.Core/DesktopDuplicationFrameSource.h +++ b/src/Magpie.Core/DesktopDuplicationFrameSource.h @@ -35,12 +35,12 @@ class DesktopDuplicationFrameSource final : public FrameSourceBase { winrt::com_ptr _outputDup; + DWORD _backendThreadId = 0; HANDLE _hDDPThread = NULL; std::atomic _exiting = false; - // 0: 等待新帧 - // 1: 新帧到达 - // 2: 等待第一帧 - std::atomic _newFrameState = 2; + + uint64_t _lastAccessMutexKey = 0; + std::atomic _sharedTextureMutexKey = 0; // DDP 线程使用的 D3D 设备 winrt::com_ptr _ddpD3dDevice; diff --git a/src/Magpie.Core/Renderer.cpp b/src/Magpie.Core/Renderer.cpp index f631d027c..e6e40994a 100644 --- a/src/Magpie.Core/Renderer.cpp +++ b/src/Magpie.Core/Renderer.cpp @@ -585,6 +585,10 @@ HANDLE Renderer::_CreateSharedTexture(ID3D11Texture2D* effectsOutput) noexcept { } void Renderer::_BackendThreadProc() noexcept { +#ifdef _DEBUG + SetThreadDescription(GetCurrentThread(), L"Magpie 缩放后端线程"); +#endif + winrt::init_apartment(winrt::apartment_type::single_threaded); ID3D11Texture2D* outputTexture = _InitBackend(); diff --git a/src/Magpie.Core/ScalingRuntime.cpp b/src/Magpie.Core/ScalingRuntime.cpp index f156fd6b1..a6f740e78 100644 --- a/src/Magpie.Core/ScalingRuntime.cpp +++ b/src/Magpie.Core/ScalingRuntime.cpp @@ -58,6 +58,10 @@ void ScalingRuntime::Stop() { } void ScalingRuntime::_ScalingThreadProc() noexcept { +#ifdef _DEBUG + SetThreadDescription(GetCurrentThread(), L"Magpie 缩放线程"); +#endif + winrt::init_apartment(winrt::apartment_type::single_threaded); { From 3cdf2c2e68121476065a883ca371c314033e648d Mon Sep 17 00:00:00 2001 From: Xu <34770031+Blinue@users.noreply.github.com> Date: Sun, 24 Mar 2024 11:36:31 +0800 Subject: [PATCH 130/155] =?UTF-8?q?=E4=BC=98=E5=8C=96=E5=8F=8C=E7=BA=BF?= =?UTF-8?q?=E6=80=A7=E6=8F=92=E5=80=BC=E4=B8=8B=E5=8D=95=E8=89=B2=E5=85=89?= =?UTF-8?q?=E6=A0=87=E5=92=8C=E5=BD=A9=E8=89=B2=E6=8E=A9=E7=A0=81=E5=85=89?= =?UTF-8?q?=E6=A0=87=E7=9A=84=E6=B8=B2=E6=9F=93=E6=95=88=E6=9E=9C=20(#855)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: 优化双线性插值下的光标渲染 * fix: 修复错误 * feat: 兼容的光标转换为彩色光标,否则始终使用最近邻插值 * perf: 性能优化 * refactor: 简化逻辑 --- src/Magpie.Core/CursorDrawer.cpp | 204 +++++++++++------- src/Magpie.Core/shaders/MaskedCursorPS.hlsl | 8 +- .../shaders/MonochromeCursorPS.hlsl | 8 +- 3 files changed, 138 insertions(+), 82 deletions(-) diff --git a/src/Magpie.Core/CursorDrawer.cpp b/src/Magpie.Core/CursorDrawer.cpp index 83d3857e4..3d04ed460 100644 --- a/src/Magpie.Core/CursorDrawer.cpp +++ b/src/Magpie.Core/CursorDrawer.cpp @@ -14,6 +14,7 @@ #include "ScalingWindow.h" #include "Renderer.h" #include "CursorManager.h" +#include "StrUtils.h" using namespace DirectX; @@ -112,7 +113,8 @@ void CursorDrawer::Draw() noexcept { const POINT cursorPos = cursorManager.CursorPos(); - float cursorScaling = ScalingWindow::Get().Options().cursorScaling; + const ScalingOptions& options = ScalingWindow::Get().Options(); + float cursorScaling = options.cursorScaling; if (cursorScaling < 1e-5) { // 光标缩放和源窗口相同 const Renderer& renderer = ScalingWindow::Get().Renderer(); @@ -191,8 +193,6 @@ void CursorDrawer::Draw() noexcept { d3dDC->RSSetState(nullptr); } - CursorInterpolationMode interpolationMode = ScalingWindow::Get().Options().cursorInterpolationMode; - if (ci->type == _CursorType::Color) { // 配置像素着色器 if (!_simplePS) { @@ -208,11 +208,13 @@ void CursorDrawer::Draw() noexcept { d3dDC->PSSetConstantBuffers(0, 0, nullptr); ID3D11ShaderResourceView* cursorSrv = ci->textureSrv.get(); d3dDC->PSSetShaderResources(0, 1, &cursorSrv); + + const bool useBilinear = options.cursorInterpolationMode == CursorInterpolationMode::Bilinear && + std::abs(options.cursorScaling - 1.0f) > 1e-3; ID3D11SamplerState* cursorSampler = _deviceResources->GetSampler( - interpolationMode == CursorInterpolationMode::NearestNeighbor - ? D3D11_FILTER_MIN_MAG_MIP_POINT - : D3D11_FILTER_MIN_MAG_MIP_LINEAR, - D3D11_TEXTURE_ADDRESS_CLAMP); + useBilinear ? D3D11_FILTER_MIN_MAG_MIP_LINEAR : D3D11_FILTER_MIN_MAG_MIP_POINT, + D3D11_TEXTURE_ADDRESS_CLAMP + ); d3dDC->PSSetSamplers(0, 1, &cursorSampler); // 预乘 alpha @@ -291,19 +293,17 @@ void CursorDrawer::Draw() noexcept { d3dDC->PSSetConstantBuffers(0, 0, nullptr); - ID3D11ShaderResourceView* srvs[2]{ _tempCursorTextureRtv.get(), ci->textureSrv.get() }; - d3dDC->PSSetShaderResources(0, 2, srvs); - - ID3D11SamplerState* samplers[2]; - samplers[0] = _deviceResources->GetSampler( - D3D11_FILTER_MIN_MAG_MIP_POINT, D3D11_TEXTURE_ADDRESS_CLAMP); - if (interpolationMode == CursorInterpolationMode::NearestNeighbor) { - samplers[1] = samplers[0]; - } else { - samplers[1] = _deviceResources->GetSampler( - D3D11_FILTER_MIN_MAG_MIP_LINEAR, D3D11_TEXTURE_ADDRESS_CLAMP); + { + ID3D11ShaderResourceView* srvs[2]{ _tempCursorTextureRtv.get(), ci->textureSrv.get() }; + d3dDC->PSSetShaderResources(0, 2, srvs); + } + + { + // 支持双线性插值的单色光标和彩色掩码光标会转换为彩色光标,这里只需要最近邻插值 + ID3D11SamplerState* t = _deviceResources->GetSampler( + D3D11_FILTER_MIN_MAG_MIP_POINT, D3D11_TEXTURE_ADDRESS_CLAMP); + d3dDC->PSSetSamplers(0, 1, &t); } - d3dDC->PSSetSamplers(0, 2, samplers); } d3dDC->Draw(4, 0); @@ -350,7 +350,7 @@ const CursorDrawer::_CursorInfo* CursorDrawer::_ResolveCursor(HCURSOR hCursor) n HDC hdcScreen = GetDC(NULL); if (GetDIBits(hdcScreen, iconInfo.hbmColor ? iconInfo.hbmColor : iconInfo.hbmMask, 0, bmp.bmHeight, pixels.get(), &bi, DIB_RGB_COLORS) != bmp.bmHeight - ) { + ) { Logger::Get().Win32Error("GetDIBits 失败"); ReleaseDC(NULL, hdcScreen); return nullptr; @@ -370,7 +370,7 @@ const CursorDrawer::_CursorInfo* CursorDrawer::_ResolveCursor(HCURSOR hCursor) n // 若颜色掩码有 A 通道,则是彩色光标,否则是彩色掩码光标 bool hasAlpha = false; - for (DWORD i = 3; i < bi.bmiHeader.biSizeImage; i += 4) { + for (uint32_t i = 3; i < bi.bmiHeader.biSizeImage; i += 4) { if (pixels[i] != 0) { hasAlpha = true; break; @@ -381,96 +381,152 @@ const CursorDrawer::_CursorInfo* CursorDrawer::_ResolveCursor(HCURSOR hCursor) n // 彩色光标 cursorInfo.type = _CursorType::Color; - for (size_t i = 0; i < bi.bmiHeader.biSizeImage; i += 4) { + for (uint32_t i = 0; i < bi.bmiHeader.biSizeImage; i += 4) { // 预乘 Alpha 通道 - double alpha = pixels[i + 3] / 255.0f; + double alpha = pixels[size_t(i + 3)] / 255.0f; uint8_t b = (uint8_t)std::lround(pixels[i] * alpha); - pixels[i] = (uint8_t)std::lround(pixels[i + 2] * alpha); - pixels[i + 1] = (uint8_t)std::lround(pixels[i + 1] * alpha); - pixels[i + 2] = b; - pixels[i + 3] = 255 - pixels[i + 3]; + pixels[i] = (uint8_t)std::lround(pixels[size_t(i + 2)] * alpha); + pixels[size_t(i + 1)] = (uint8_t)std::lround(pixels[size_t(i + 1)] * alpha); + pixels[size_t(i + 2)] = b; + pixels[size_t(i + 3)] = 255 - pixels[size_t(i + 3)]; } } else { // 彩色掩码光标 - cursorInfo.type = _CursorType::MaskedColor; - std::unique_ptr maskPixels(std::make_unique(bi.bmiHeader.biSizeImage)); - if (GetDIBits(hdcScreen, iconInfo.hbmMask, 0, bmp.bmHeight, maskPixels.get(), &bi, DIB_RGB_COLORS) != bmp.bmHeight) { + if (GetDIBits(hdcScreen, iconInfo.hbmMask, 0, bmp.bmHeight, + maskPixels.get(), &bi, DIB_RGB_COLORS) != bmp.bmHeight + ) { Logger::Get().Win32Error("GetDIBits 失败"); ReleaseDC(NULL, hdcScreen); return nullptr; } - // 将 XOR 掩码复制到透明通道中 - for (size_t i = 0; i < bi.bmiHeader.biSizeImage; i += 4) { - std::swap(pixels[i], pixels[i + 2]); - pixels[i + 3] = maskPixels[i]; + // 计算此彩色掩码光标是否可以转换为彩色光标 + bool canConvertToColor = true; + for (uint32_t i = 0; i < bi.bmiHeader.biSizeImage; i += 4) { + if (maskPixels[i] != 0 && + (pixels[i] != 0 || pixels[size_t(i + 1)] != 0 || pixels[size_t(i + 2)] != 0) + ) { + // 掩码不为 0 则不能转换为彩色光标 + canConvertToColor = false; + break; + } } - } - const D3D11_SUBRESOURCE_DATA initData{ - .pSysMem = pixels.get(), - .SysMemPitch = UINT(bmp.bmWidth * 4) - }; + if (canConvertToColor) { + // 转换为彩色光标以获得更好的插值效果和渲染性能 + cursorInfo.type = _CursorType::Color; + + for (uint32_t i = 0; i < bi.bmiHeader.biSizeImage; i += 4) { + if (maskPixels[i] == 0) { + // 保留光标颜色 + // Alpha 通道已经是 0,无需设置 + std::swap(pixels[i], pixels[size_t(i + 2)]); + } else { + // 透明像素 + std::memset(&pixels[i], 0, 3); + pixels[size_t(i + 3)] = 255; + } + } + } else { + cursorInfo.type = _CursorType::MaskedColor; - cursorTexture = DirectXHelper::CreateTexture2D( - d3dDevice, - DXGI_FORMAT_R8G8B8A8_UNORM, - bmp.bmWidth, - bmp.bmHeight, - D3D11_BIND_SHADER_RESOURCE, - D3D11_USAGE_IMMUTABLE, - 0, - &initData - ); + // 将 XOR 掩码复制到透明通道中 + for (uint32_t i = 0; i < bi.bmiHeader.biSizeImage; i += 4) { + std::swap(pixels[i], pixels[size_t(i + 2)]); + pixels[size_t(i + 3)] = maskPixels[i]; + } + } + } } else { // 单色光标 - cursorInfo.type = _CursorType::Monochrome; - - // 红色通道是 AND 掩码,绿色通道是 XOR 掩码 - // 构造 DXGI_FORMAT_R8G8_UNORM 的初始数据 - const int halfSize = bi.bmiHeader.biSizeImage / 8; - uint8_t* upPtr = &pixels[0]; - uint8_t* downPtr = &pixels[(size_t)halfSize * 4]; - uint8_t* targetPtr = &pixels[0]; - for (int i = 0; i < halfSize; ++i) { - *targetPtr++ = *upPtr; - *targetPtr++ = *downPtr; - - upPtr += 4; - downPtr += 4; + const uint32_t halfSize = bi.bmiHeader.biSizeImage / 2; + + // 计算此单色光标是否可以转换为彩色光标 + bool canConvertToColor = true; + for (uint32_t i = 0; i < halfSize; i += 4) { + // 上半部分是 AND 掩码,下半部分是 XOR 掩码 + if (pixels[i] != 0 && pixels[size_t(i + halfSize)] != 0) { + // 存在反色像素则不能转换为彩色光标 + canConvertToColor = false; + break; + } + } + + if (canConvertToColor) { + // 转换为彩色光标以获得更好的插值效果和渲染性能 + cursorInfo.type = _CursorType::Color; + + for (uint32_t i = 0; i < halfSize; i += 4) { + // 上半部分是 AND 掩码,下半部分是 XOR 掩码 + // https://learn.microsoft.com/en-us/windows-hardware/drivers/display/drawing-monochrome-pointers + if (pixels[i] == 0) { + if (pixels[size_t(i + halfSize)] == 0) { + // 黑色 + std::memset(&pixels[i], 0, 4); + } else { + // 白色 + std::memset(&pixels[i], 255, 3); + pixels[size_t(i + 3)] = 0; + } + } else { + // 透明 + std::memset(&pixels[i], 0, 3); + pixels[size_t(i + 3)] = 255; + } + } + } else { + cursorInfo.type = _CursorType::Monochrome; + + // 红色通道是 AND 掩码,绿色通道是 XOR 掩码 + // 构造 DXGI_FORMAT_R8G8_UNORM 的初始数据 + uint8_t* upPtr = &pixels[0]; + uint8_t* downPtr = &pixels[halfSize]; + uint8_t* targetPtr = &pixels[0]; + for (uint32_t i = 0; i < halfSize; i += 4) { + *targetPtr++ = *upPtr; + *targetPtr++ = *downPtr; + + upPtr += 4; + downPtr += 4; + } } + } + + ReleaseDC(NULL, hdcScreen); + { + const bool isMonochrome = cursorInfo.type == _CursorType::Monochrome; const D3D11_SUBRESOURCE_DATA initData{ .pSysMem = pixels.get(), - .SysMemPitch = UINT(bmp.bmWidth * 2) + .SysMemPitch = UINT(bmp.bmWidth * (isMonochrome ? 2 : 4)) }; - cursorTexture = DirectXHelper::CreateTexture2D( d3dDevice, - DXGI_FORMAT_R8G8_UNORM, + isMonochrome ? DXGI_FORMAT_R8G8_UNORM : DXGI_FORMAT_R8G8B8A8_UNORM, bmp.bmWidth, - bmp.bmHeight / 2, + iconInfo.hbmColor ? bmp.bmHeight : bmp.bmHeight / 2, D3D11_BIND_SHADER_RESOURCE, D3D11_USAGE_IMMUTABLE, 0, &initData ); - } - - ReleaseDC(NULL, hdcScreen); - - if (!cursorTexture) { - Logger::Get().Error("创建光标纹理失败"); - return nullptr; + if (!cursorTexture) { + Logger::Get().Error("创建光标纹理失败"); + return nullptr; + } } HRESULT hr = d3dDevice->CreateShaderResourceView(cursorTexture.get(), nullptr, cursorInfo.textureSrv.put()); if (FAILED(hr)) { + Logger::Get().ComError("CreateShaderResourceView 失败", hr); return nullptr; } + const char* CURSOR_TYPES[] = { "彩色","彩色掩码","单色" }; + Logger::Get().Info(StrUtils::Concat("已解析", CURSOR_TYPES[(int)cursorInfo.type], "光标")); + return &_cursorInfos.emplace(hCursor, std::move(cursorInfo)).first->second; } diff --git a/src/Magpie.Core/shaders/MaskedCursorPS.hlsl b/src/Magpie.Core/shaders/MaskedCursorPS.hlsl index 4d2cd84d9..983cc59eb 100644 --- a/src/Magpie.Core/shaders/MaskedCursorPS.hlsl +++ b/src/Magpie.Core/shaders/MaskedCursorPS.hlsl @@ -1,15 +1,15 @@ Texture2D originTex : register(t0); Texture2D cursorTex : register(t1); -SamplerState originSampler : register(s0); -SamplerState cursorSampler : register(s1); + +SamplerState pointSampler : register(s0); float4 main(float2 coord : TEXCOORD) : SV_TARGET { - float4 mask = cursorTex.Sample(cursorSampler, coord); + float4 mask = cursorTex.Sample(pointSampler, coord); if (mask.a < 0.5f) { return float4(mask.rgb, 1); } else { - float3 origin = originTex.Sample(originSampler, coord).rgb; + float3 origin = originTex.Sample(pointSampler, coord).rgb; // 255.001953 的由来见 https://stackoverflow.com/questions/52103720/why-does-d3dcolortoubyte4-multiplies-components-by-255-001953f return float4((uint3(origin * 255.001953f) ^ uint3(mask.rgb * 255.001953f)) / 255.0f, 1); } diff --git a/src/Magpie.Core/shaders/MonochromeCursorPS.hlsl b/src/Magpie.Core/shaders/MonochromeCursorPS.hlsl index 20a3fecee..6c87dca55 100644 --- a/src/Magpie.Core/shaders/MonochromeCursorPS.hlsl +++ b/src/Magpie.Core/shaders/MonochromeCursorPS.hlsl @@ -1,13 +1,13 @@ Texture2D originTex : register(t0); Texture2D cursorTex : register(t1); -SamplerState originSampler : register(s0); -SamplerState cursorSampler : register(s1); + +SamplerState pointSampler : register(s0); float4 main(float2 coord : TEXCOORD) : SV_TARGET { - float2 mask = cursorTex.Sample(cursorSampler, coord); + float2 mask = cursorTex.Sample(pointSampler, coord); if (mask.x > 0.5f) { - float3 origin = originTex.Sample(originSampler, coord).rgb; + float3 origin = originTex.Sample(pointSampler, coord).rgb; if (mask.y > 0.5f) { return float4(1 - origin, 1); From 2c3216f9f64caf73b31e0bf4573843cca929217b Mon Sep 17 00:00:00 2001 From: Xu <34770031+Blinue@users.noreply.github.com> Date: Sun, 24 Mar 2024 19:34:33 +0800 Subject: [PATCH 131/155] =?UTF-8?q?fix:=20=E6=8F=90=E9=AB=98=E6=97=B6?= =?UTF-8?q?=E9=92=9F=E5=88=86=E8=BE=A8=E7=8E=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Magpie/main.cpp | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/Magpie/main.cpp b/src/Magpie/main.cpp index 782445414..3ddcbf85b 100644 --- a/src/Magpie/main.cpp +++ b/src/Magpie/main.cpp @@ -34,6 +34,24 @@ static void SetCurDir() noexcept { SetCurrentDirectory(curDir); } +static void IncreaseTimerResolution() noexcept { + // 我们需要尽可能高的时钟分辨率来提高渲染帧率。 + // 通常 Magpie 被 OS 认为是后台进程,下面的调用避免 OS 自动降低时钟分辨率。 + // 见 https://learn.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-setprocessinformation + PROCESS_POWER_THROTTLING_STATE powerThrottling{ + .Version = PROCESS_POWER_THROTTLING_CURRENT_VERSION, + .ControlMask = PROCESS_POWER_THROTTLING_EXECUTION_SPEED | + PROCESS_POWER_THROTTLING_IGNORE_TIMER_RESOLUTION, + .StateMask = 0 + }; + SetProcessInformation( + GetCurrentProcess(), + ProcessPowerThrottling, + &powerThrottling, + sizeof(powerThrottling) + ); +} + int APIENTRY wWinMain( _In_ HINSTANCE hInstance, _In_opt_ HINSTANCE /*hPrevInstance*/, @@ -47,6 +65,9 @@ int APIENTRY wWinMain( // 堆损坏时终止进程 HeapSetInformation(NULL, HeapEnableTerminationOnCorruption, nullptr, 0); + // 提高时钟分辨率 + IncreaseTimerResolution(); + // 程序结束时也不应调用 uninit_apartment // 见 https://kennykerr.ca/2018/03/24/cppwinrt-hosting-the-windows-runtime/ winrt::init_apartment(winrt::apartment_type::single_threaded); From 6f4eb759e958539afd2011e2c095ca889258390c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=97=AD?= Date: Mon, 25 Mar 2024 09:56:10 +0800 Subject: [PATCH 132/155] =?UTF-8?q?feat:=20=E4=B8=8D=E5=86=8D=E5=86=85?= =?UTF-8?q?=E7=BD=AE=20Bicubic?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BicubicEffect.h => Effects/Bicubic.hlsl} | 5 -- src/Effects/Effects.vcxproj | 53 ++----------------- src/Effects/Effects.vcxproj.filters | 1 + src/Magpie.App/EffectsService.cpp | 16 +----- src/Magpie.Core/EffectCompiler.cpp | 5 -- src/Magpie.Core/EffectCompiler.h | 3 -- src/Magpie.Core/Magpie.Core.vcxproj | 1 - 7 files changed, 7 insertions(+), 77 deletions(-) rename src/{Magpie.Core/BicubicEffect.h => Effects/Bicubic.hlsl} (97%) diff --git a/src/Magpie.Core/BicubicEffect.h b/src/Effects/Bicubic.hlsl similarity index 97% rename from src/Magpie.Core/BicubicEffect.h rename to src/Effects/Bicubic.hlsl index 48164df3a..b4f2ce710 100644 --- a/src/Magpie.Core/BicubicEffect.h +++ b/src/Effects/Bicubic.hlsl @@ -1,6 +1,3 @@ -#pragma once - -constexpr const char* BICUBIC_EFFECT_SOURCE = R"( // Bicubic 插值算法 // 移植自 https://github.com/ActualMandM/cemu_graphic_packs/blob/468d165cf27dae13a06e8bdc3d588d0af775ad91/Filters/Bicubic/output.glsl @@ -115,5 +112,3 @@ float4 Pass1(float2 pos) { return float4(total, 1); } - -)"; diff --git a/src/Effects/Effects.vcxproj b/src/Effects/Effects.vcxproj index f81632066..24f4929fe 100644 --- a/src/Effects/Effects.vcxproj +++ b/src/Effects/Effects.vcxproj @@ -38,18 +38,15 @@ Document - - + + Document + Document - - Document - - Document @@ -62,20 +59,14 @@ Document - - Document Document - - - - Document @@ -151,8 +142,6 @@ Document - - Document @@ -168,8 +157,6 @@ Document - - Document @@ -188,13 +175,9 @@ Document - - Document - - Document @@ -204,8 +187,6 @@ Document - - Document @@ -287,8 +268,6 @@ Document - - @@ -302,8 +281,6 @@ - - Document @@ -337,36 +314,26 @@ Document - - Document Document - - - - Document Document - - Document Document - - Document @@ -379,8 +346,6 @@ Document - - Document @@ -390,32 +355,21 @@ Document - - Document - - Document Document - - Document - - Document - - - Document @@ -477,4 +431,5 @@ Document + \ No newline at end of file diff --git a/src/Effects/Effects.vcxproj.filters b/src/Effects/Effects.vcxproj.filters index 927db00a6..fd851ffae 100644 --- a/src/Effects/Effects.vcxproj.filters +++ b/src/Effects/Effects.vcxproj.filters @@ -420,6 +420,7 @@ CuNNy + diff --git a/src/Magpie.App/EffectsService.cpp b/src/Magpie.App/EffectsService.cpp index 71ac50574..92da838df 100644 --- a/src/Magpie.App/EffectsService.cpp +++ b/src/Magpie.App/EffectsService.cpp @@ -39,12 +39,7 @@ static void ListEffects(std::vector& result, std::wstring_view pre continue; } - std::wstring effectName = StrUtils::Concat(prefix, fileName.substr(0, fileName.size() - 5)); - if (std::find(std::begin(EffectCompiler::BUILTIN_EFFECTS), std::end(EffectCompiler::BUILTIN_EFFECTS), - effectName) == std::end(EffectCompiler::BUILTIN_EFFECTS)) - { - result.emplace_back(std::move(effectName)); - } + result.emplace_back(StrUtils::Concat(prefix, fileName.substr(0, fileName.size() - 5))); } while (FindNextFile(hFind, &findData)); FindClose(hFind); @@ -59,14 +54,7 @@ fire_and_forget EffectsService::StartInitialize() { std::vector effectNames; ListEffects(effectNames); - // 内置效果 - effectNames.insert( - effectNames.end(), - std::begin(EffectCompiler::BUILTIN_EFFECTS), - std::end(EffectCompiler::BUILTIN_EFFECTS) - ); - - uint32_t nEffect = (uint32_t)effectNames.size(); + const uint32_t nEffect = (uint32_t)effectNames.size(); std::vector descs(nEffect); Win32Utils::RunParallel([&](uint32_t id) { diff --git a/src/Magpie.Core/EffectCompiler.cpp b/src/Magpie.Core/EffectCompiler.cpp index e14a894cb..ebb0cf34a 100644 --- a/src/Magpie.Core/EffectCompiler.cpp +++ b/src/Magpie.Core/EffectCompiler.cpp @@ -12,7 +12,6 @@ #include "EffectHelper.h" #include "Win32Utils.h" #include "EffectDesc.h" -#include "BicubicEffect.h" namespace Magpie::Core { @@ -1424,10 +1423,6 @@ static uint32_t CompilePasses( } static std::string ReadEffectSource(const std::wstring& effectName) noexcept { - if (effectName == EffectCompiler::BUILTIN_EFFECTS[0]) { - return BICUBIC_EFFECT_SOURCE; - } - std::wstring fileName = StrUtils::Concat(CommonSharedConstants::EFFECTS_DIR, effectName, L".hlsl"); std::string source; diff --git a/src/Magpie.Core/EffectCompiler.h b/src/Magpie.Core/EffectCompiler.h index c633158f2..d9490becd 100644 --- a/src/Magpie.Core/EffectCompiler.h +++ b/src/Magpie.Core/EffectCompiler.h @@ -18,9 +18,6 @@ struct EffectCompiler { uint32_t flags, // EffectCompilerFlags const phmap::flat_hash_map* inlineParams = nullptr ) noexcept; - - // 将这些效果内置防止没有默认降采样效果 - static constexpr const wchar_t* BUILTIN_EFFECTS[] = { L"Bicubic" }; }; } diff --git a/src/Magpie.Core/Magpie.Core.vcxproj b/src/Magpie.Core/Magpie.Core.vcxproj index bc75937e2..73d2a62d4 100644 --- a/src/Magpie.Core/Magpie.Core.vcxproj +++ b/src/Magpie.Core/Magpie.Core.vcxproj @@ -43,7 +43,6 @@ - From 1e69c916252dd822de78163a83d9b4a55bc48eda Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=97=AD?= Date: Mon, 25 Mar 2024 13:05:23 +0800 Subject: [PATCH 133/155] =?UTF-8?q?feat:=20=E5=AE=9E=E7=8E=B0=E5=85=B3?= =?UTF-8?q?=E9=97=AD=20DirectFlip?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Magpie.Core/Renderer.cpp | 9 +-- src/Magpie.Core/Renderer.h | 2 +- src/Magpie.Core/ScalingWindow.cpp | 91 +++++++++++++++++++++++++++--- src/Magpie.Core/ScalingWindow.h | 4 ++ src/Magpie/MainWindow.cpp | 1 - src/Shared/CommonSharedConstants.h | 1 + 6 files changed, 94 insertions(+), 14 deletions(-) diff --git a/src/Magpie.Core/Renderer.cpp b/src/Magpie.Core/Renderer.cpp index e6e40994a..13e59c988 100644 --- a/src/Magpie.Core/Renderer.cpp +++ b/src/Magpie.Core/Renderer.cpp @@ -275,7 +275,7 @@ void Renderer::_FrontendRender() noexcept { d3dDC->DiscardView(_backBufferRtv.get()); } -void Renderer::Render() noexcept { +bool Renderer::Render() noexcept { const CursorManager& cursorManager = ScalingWindow::Get().CursorManager(); const HCURSOR hCursor = cursorManager.Cursor(); const POINT cursorPos = cursorManager.CursorPos(); @@ -285,7 +285,7 @@ void Renderer::Render() noexcept { if (_lastAccessMutexKey == _sharedTextureMutexKey) { if (_lastAccessMutexKey == 0) { // 第一帧尚未完成 - return; + return false; } // 检查光标是否移动 @@ -293,10 +293,10 @@ void Renderer::Render() noexcept { if (IsOverlayVisible() || ScalingWindow::Get().Options().IsShowFPS()) { // 检查 FPS 是否变化 if (fps == _lastFPS) { - return; + return false; } } else { - return; + return false; } } } @@ -306,6 +306,7 @@ void Renderer::Render() noexcept { _lastFPS = fps; _FrontendRender(); + return true; } bool Renderer::IsOverlayVisible() noexcept { diff --git a/src/Magpie.Core/Renderer.h b/src/Magpie.Core/Renderer.h index ed3c2c765..4924e2129 100644 --- a/src/Magpie.Core/Renderer.h +++ b/src/Magpie.Core/Renderer.h @@ -21,7 +21,7 @@ class Renderer { bool Initialize() noexcept; - void Render() noexcept; + bool Render() noexcept; bool IsOverlayVisible() noexcept; diff --git a/src/Magpie.Core/ScalingWindow.cpp b/src/Magpie.Core/ScalingWindow.cpp index 667200b3c..9c14ef3f1 100644 --- a/src/Magpie.Core/ScalingWindow.cpp +++ b/src/Magpie.Core/ScalingWindow.cpp @@ -7,6 +7,7 @@ #include "WindowHelper.h" #include "CursorManager.h" #include +#include "FrameSourceBase.h" namespace Magpie::Core { @@ -133,12 +134,13 @@ bool ScalingWindow::Create(HINSTANCE hInstance, HWND hwndSrc, ScalingOptions&& o } static const int _ = [](HINSTANCE hInstance) { - WNDCLASSEXW wcex{}; - wcex.cbSize = sizeof(wcex); - wcex.lpfnWndProc = _WndProc; - wcex.hInstance = hInstance; - wcex.hCursor = LoadCursor(nullptr, IDC_ARROW); - wcex.lpszClassName = CommonSharedConstants::SCALING_WINDOW_CLASS_NAME; + WNDCLASSEXW wcex{ + .cbSize = sizeof(wcex), + .lpfnWndProc = _WndProc, + .hInstance = hInstance, + .hCursor = LoadCursor(nullptr, IDC_ARROW), + .lpszClassName = CommonSharedConstants::SCALING_WINDOW_CLASS_NAME + }; RegisterClassEx(&wcex); return 0; @@ -166,7 +168,7 @@ bool ScalingWindow::Create(HINSTANCE hInstance, HWND hwndSrc, ScalingOptions&& o // 设置窗口不透明 // 不完全透明时可关闭 DirectFlip - if (!SetLayeredWindowAttributes(_hWnd, 0, 255, LWA_ALPHA)) { + if (!SetLayeredWindowAttributes(_hWnd, 0, _options.IsDirectFlipDisabled() ? 254 : 255, LWA_ALPHA)) { Logger::Get().Win32Error("SetLayeredWindowAttributes 失败"); } @@ -190,6 +192,13 @@ bool ScalingWindow::Create(HINSTANCE hInstance, HWND hwndSrc, ScalingOptions&& o return false; } + if (_options.IsDirectFlipDisabled() && !_options.IsDebugMode()) { + // 在此处创建的 DDF 窗口不会立刻显示 + if (!_DisableDirectFlip(hInstance)) { + Logger::Get().Error("_DisableDirectFlip 失败"); + } + } + // 缩放窗口可能有 WS_MAXIMIZE 样式,因此使用 SetWindowsPos 而不是 ShowWindow // 以避免 OS 更改窗口尺寸和位置。 SetWindowPos( @@ -221,7 +230,13 @@ void ScalingWindow::Render() noexcept { } _cursorManager->Update(); - _renderer->Render(); + if (_renderer->Render()) { + // 为了避免用户看到 DDF 窗口,在渲染第一帧后显示 + if (_hwndDDF && !IsWindowVisible(_hwndDDF)) { + ShowWindow(_hwndDDF, SW_NORMAL); + SetWindowPos(_hwndDDF, Handle(), 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_NOREDRAW); + } + } } void ScalingWindow::ToggleOverlay() noexcept { @@ -288,6 +303,11 @@ LRESULT ScalingWindow::_MessageHandler(UINT msg, WPARAM wParam, LPARAM lParam) n } case WM_DESTROY: { + if (_hwndDDF) { + DestroyWindow(_hwndDDF); + _hwndDDF = NULL; + } + _cursorManager.reset(); _renderer.reset(); _options = {}; @@ -366,4 +386,59 @@ bool ScalingWindow::_CheckForeground(HWND hwndForeground) const noexcept { return rectForground.right - rectForground.left < 10 || rectForground.right - rectForground.top < 10; } +bool ScalingWindow::_DisableDirectFlip(HINSTANCE hInstance) noexcept { + // 没有显式关闭 DirectFlip 的方法 + // 将全屏窗口设为稍微透明,以灰色全屏窗口为背景 + + static const int _ = [](HINSTANCE hInstance) { + WNDCLASSEXW wcex{ + .cbSize = sizeof(wcex), + .lpfnWndProc = DefWindowProc, + .hInstance = hInstance, + .hCursor = LoadCursor(nullptr, IDC_ARROW), + .hbrBackground = (HBRUSH)GetStockObject(GRAY_BRUSH), + .lpszClassName = CommonSharedConstants::DDF_WINDOW_CLASS_NAME + }; + RegisterClassEx(&wcex); + + return 0; + }(hInstance); + + _hwndDDF = CreateWindowEx( + WS_EX_NOACTIVATE | WS_EX_LAYERED | WS_EX_TRANSPARENT, + CommonSharedConstants::DDF_WINDOW_CLASS_NAME, + NULL, + WS_POPUP, + _wndRect.left, + _wndRect.top, + _wndRect.right - _wndRect.left, + _wndRect.bottom - _wndRect.top, + NULL, + NULL, + hInstance, + NULL + ); + + if (!_hwndDDF) { + Logger::Get().Win32Error("创建 DDF 窗口失败"); + return false; + } + + // 设置窗口不透明 + if (!SetLayeredWindowAttributes(_hwndDDF, 0, 255, LWA_ALPHA)) { + Logger::Get().Win32Error("SetLayeredWindowAttributes 失败"); + } + + if (_renderer->FrameSource().IsScreenCapture()) { + if (Win32Utils::GetOSVersion().Is20H1OrNewer()) { + // 使 DDF 窗口无法被捕获到 + if (!SetWindowDisplayAffinity(_hwndDDF, WDA_EXCLUDEFROMCAPTURE)) { + Logger::Get().Win32Error("SetWindowDisplayAffinity 失败"); + } + } + } + + return true; +} + } diff --git a/src/Magpie.Core/ScalingWindow.h b/src/Magpie.Core/ScalingWindow.h index b2350ee87..63e1bbeca 100644 --- a/src/Magpie.Core/ScalingWindow.h +++ b/src/Magpie.Core/ScalingWindow.h @@ -52,6 +52,8 @@ class ScalingWindow : public WindowBase { bool _CheckForeground(HWND hwndForeground) const noexcept; + bool _DisableDirectFlip(HINSTANCE hInstance) noexcept; + RECT _wndRect{}; ScalingOptions _options; @@ -60,6 +62,8 @@ class ScalingWindow : public WindowBase { HWND _hwndSrc = NULL; RECT _srcWndRect{}; + + HWND _hwndDDF = NULL; }; } diff --git a/src/Magpie/MainWindow.cpp b/src/Magpie/MainWindow.cpp index 314bee3a6..c9fc7d455 100644 --- a/src/Magpie/MainWindow.cpp +++ b/src/Magpie/MainWindow.cpp @@ -400,7 +400,6 @@ LRESULT MainWindow::_TitleBarMessageHandler(UINT msg, WPARAM wParam, LPARAM lPar return HTCLOSE; } else if (cursorToRight < buttonWidthInPixels * 2) { // 支持 Win11 的贴靠布局 - // FIXME: 最大化时贴靠布局的位置不对,目前没有找到解决方案。似乎只适配了系统原生框架和 UWP return HTMAXBUTTON; } else if (cursorToRight < buttonWidthInPixels * 3) { return HTMINBUTTON; diff --git a/src/Shared/CommonSharedConstants.h b/src/Shared/CommonSharedConstants.h index d1d2c5691..82be53797 100644 --- a/src/Shared/CommonSharedConstants.h +++ b/src/Shared/CommonSharedConstants.h @@ -6,6 +6,7 @@ struct CommonSharedConstants { static constexpr const wchar_t* NOTIFY_ICON_WINDOW_CLASS_NAME = L"Magpie_NotifyIcon"; static constexpr const wchar_t* HOTKEY_WINDOW_CLASS_NAME = L"Magpie_Hotkey"; static constexpr const wchar_t* SCALING_WINDOW_CLASS_NAME = L"Window_Magpie_967EB565-6F73-4E94-AE53-00CC42592A22"; + static constexpr const wchar_t* DDF_WINDOW_CLASS_NAME = L"Window_Magpie_C322D752-C866-4630-91F5-32CB242A8930"; static constexpr const COLORREF LIGHT_TINT_COLOR = RGB(243, 243, 243); static constexpr const COLORREF DARK_TINT_COLOR = RGB(32, 32, 32); From c42576135c79a1e51542954241cef68719992f30 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=97=AD?= Date: Mon, 25 Mar 2024 13:41:57 +0800 Subject: [PATCH 134/155] =?UTF-8?q?chore:=20=E5=B0=86=20tray=20icon=20?= =?UTF-8?q?=E8=A1=A8=E8=BF=B0=E6=94=B9=E4=B8=BA=20notify=20icon=EF=BC=8C?= =?UTF-8?q?=E6=9B=B4=E6=96=B0=E8=AE=BE=E7=BD=AE=E6=96=87=E4=BB=B6=E7=89=88?= =?UTF-8?q?=E6=9C=AC=E5=8F=B7=20=E6=AD=A3=E5=BC=8F=E7=9A=84=E8=AF=B4?= =?UTF-8?q?=EF=BC=8C=E5=B0=86=E9=80=9A=E7=9F=A5=E5=8C=BA=E5=9F=9F=E7=A7=B0?= =?UTF-8?q?=E4=B8=BA=E2=80=9C=E7=B3=BB=E7=BB=9F=E6=89=98=E7=9B=98=E2=80=9D?= =?UTF-8?q?=E6=98=AF=E9=94=99=E8=AF=AF=E7=9A=84=EF=BC=8C=E8=A7=81=20https:?= =?UTF-8?q?//devblogs.microsoft.com/oldnewthing/20030910-00/=3Fp=3D42583?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Magpie.App/App.cpp | 12 +++++----- src/Magpie.App/App.h | 6 ++--- src/Magpie.App/App.idl | 4 ++-- src/Magpie.App/AppSettings.cpp | 21 +++++++++------- src/Magpie.App/AppSettings.h | 24 +++++++++---------- src/Magpie.App/Resources.language-de.resw | 8 +++---- src/Magpie.App/Resources.language-en-US.resw | 8 +++---- src/Magpie.App/Resources.language-es.resw | 8 +++---- src/Magpie.App/Resources.language-fr.resw | 8 +++---- src/Magpie.App/Resources.language-id.resw | 4 ++-- src/Magpie.App/Resources.language-it.resw | 8 +++---- src/Magpie.App/Resources.language-ja.resw | 8 +++---- src/Magpie.App/Resources.language-ko.resw | 8 +++---- src/Magpie.App/Resources.language-pt-BR.resw | 8 +++---- src/Magpie.App/Resources.language-ru.resw | 8 +++---- src/Magpie.App/Resources.language-tr.resw | 8 +++---- src/Magpie.App/Resources.language-uk.resw | 8 +++---- src/Magpie.App/Resources.language-vi.resw | 8 +++---- .../Resources.language-zh-Hans.resw | 8 +++---- .../Resources.language-zh-Hant.resw | 8 +++---- src/Magpie.App/SettingsPage.xaml | 4 ++-- src/Magpie.App/SettingsViewModel.cpp | 18 +++++++------- src/Magpie.App/SettingsViewModel.h | 4 ++-- src/Magpie.App/SettingsViewModel.idl | 2 +- src/Magpie/Magpie.vcxproj | 6 ++--- ...yIconService.cpp => NotifyIconService.cpp} | 18 +++++++------- ...{TrayIconService.h => NotifyIconService.h} | 12 +++++----- src/Magpie/XamlApp.cpp | 20 ++++++++-------- src/Shared/CommonSharedConstants.h | 2 +- 29 files changed, 136 insertions(+), 133 deletions(-) rename src/Magpie/{TrayIconService.cpp => NotifyIconService.cpp} (85%) rename src/Magpie/{TrayIconService.h => NotifyIconService.h} (55%) diff --git a/src/Magpie.App/App.cpp b/src/Magpie.App/App.cpp index a2a3af561..3c95a78d2 100644 --- a/src/Magpie.App/App.cpp +++ b/src/Magpie.App/App.cpp @@ -112,18 +112,18 @@ void App::Uninitialize() { ShortcutService::Get().Uninitialize(); } -bool App::IsShowTrayIcon() const noexcept { - return AppSettings::Get().IsShowTrayIcon(); +bool App::IsShowNotifyIcon() const noexcept { + return AppSettings::Get().IsShowNotifyIcon(); } -event_token App::IsShowTrayIconChanged(EventHandler const& handler) { - return AppSettings::Get().IsShowTrayIconChanged([handler(handler)](bool value) { +event_token App::IsShowNotifyIconChanged(EventHandler const& handler) { + return AppSettings::Get().IsShowNotifyIconChanged([handler(handler)](bool value) { handler(nullptr, value); }); } -void App::IsShowTrayIconChanged(event_token const& token) { - AppSettings::Get().IsShowTrayIconChanged(token); +void App::IsShowNotifyIconChanged(event_token const& token) { + AppSettings::Get().IsShowNotifyIconChanged(token); } void App::RootPage(Magpie::App::RootPage const& rootPage) noexcept { diff --git a/src/Magpie.App/App.h b/src/Magpie.App/App.h index ad4ae3685..16e744039 100644 --- a/src/Magpie.App/App.h +++ b/src/Magpie.App/App.h @@ -17,11 +17,11 @@ class App : public App_base { void Uninitialize(); - bool IsShowTrayIcon() const noexcept; + bool IsShowNotifyIcon() const noexcept; - event_token IsShowTrayIconChanged(EventHandler const& handler); + event_token IsShowNotifyIconChanged(EventHandler const& handler); - void IsShowTrayIconChanged(event_token const& token); + void IsShowNotifyIconChanged(event_token const& token); uint64_t HwndMain() const noexcept { return (uint64_t)_hwndMain; diff --git a/src/Magpie.App/App.idl b/src/Magpie.App/App.idl index bcf2d350a..9df1310f0 100644 --- a/src/Magpie.App/App.idl +++ b/src/Magpie.App/App.idl @@ -67,8 +67,8 @@ namespace Magpie.App { StartUpOptions Initialize(Int32 notUsed); void Uninitialize(); - Boolean IsShowTrayIcon { get; }; - event Windows.Foundation.EventHandler IsShowTrayIconChanged; + Boolean IsShowNotifyIcon { get; }; + event Windows.Foundation.EventHandler IsShowNotifyIconChanged; UInt64 HwndMain; diff --git a/src/Magpie.App/AppSettings.cpp b/src/Magpie.App/AppSettings.cpp index 6404070ba..08a01d896 100644 --- a/src/Magpie.App/AppSettings.cpp +++ b/src/Magpie.App/AppSettings.cpp @@ -21,7 +21,7 @@ using namespace ::Magpie::Core; namespace winrt::Magpie::App { -static constexpr uint32_t SETTINGS_VERSION = 1; +static constexpr uint32_t SETTINGS_VERSION = 2; _AppSettingsData::_AppSettingsData() {} @@ -433,19 +433,19 @@ void AppSettings::IsAlwaysRunAsAdmin(bool value) noexcept { std::wstring arguments; if (AutoStartHelper::IsAutoStartEnabled(arguments)) { // 更新启动任务 - AutoStartHelper::EnableAutoStart(value, _isShowTrayIcon ? arguments.c_str() : nullptr); + AutoStartHelper::EnableAutoStart(value, _isShowNotifyIcon ? arguments.c_str() : nullptr); } SaveAsync(); } -void AppSettings::IsShowTrayIcon(bool value) noexcept { - if (_isShowTrayIcon == value) { +void AppSettings::IsShowNotifyIcon(bool value) noexcept { + if (_isShowNotifyIcon == value) { return; } - _isShowTrayIcon = value; - _isShowTrayIconChangedEvent(value); + _isShowNotifyIcon = value; + _isShowNotifyIconChangedEvent(value); SaveAsync(); } @@ -544,8 +544,8 @@ bool AppSettings::_Save(const _AppSettingsData& data) noexcept { writer.Bool(data._isSimulateExclusiveFullscreen); writer.Key("alwaysRunAsAdmin"); writer.Bool(data._isAlwaysRunAsAdmin); - writer.Key("showTrayIcon"); - writer.Bool(data._isShowTrayIcon); + writer.Key("showNotifyIcon"); + writer.Bool(data._isShowNotifyIcon); writer.Key("inlineParams"); writer.Bool(data._isInlineParams); writer.Key("autoCheckForUpdates"); @@ -697,7 +697,10 @@ void AppSettings::_LoadSettings(const rapidjson::GenericObject const& handler) { - return _isShowTrayIconChangedEvent.add(handler); + event_token IsShowNotifyIconChanged(delegate const& handler) { + return _isShowNotifyIconChangedEvent.add(handler); } - WinRTUtils::EventRevoker IsShowTrayIconChanged(auto_revoke_t, delegate const& handler) { - event_token token = IsShowTrayIconChanged(handler); + WinRTUtils::EventRevoker IsShowNotifyIconChanged(auto_revoke_t, delegate const& handler) { + event_token token = IsShowNotifyIconChanged(handler); return WinRTUtils::EventRevoker([this, token]() { - IsShowTrayIconChanged(token); + IsShowNotifyIconChanged(token); }); } - void IsShowTrayIconChanged(event_token const& token) { - _isShowTrayIconChangedEvent.remove(token); + void IsShowNotifyIconChanged(event_token const& token) { + _isShowNotifyIconChangedEvent.remove(token); } bool IsInlineParams() const noexcept { @@ -400,7 +400,7 @@ class AppSettings : private _AppSettingsData { event> _shortcutChangedEvent; event> _isAutoRestoreChangedEvent; event> _countdownSecondsChangedEvent; - event> _isShowTrayIconChangedEvent; + event> _isShowNotifyIconChangedEvent; event> _isAutoCheckForUpdatesChangedEvent; }; diff --git a/src/Magpie.App/Resources.language-de.resw b/src/Magpie.App/Resources.language-de.resw index 346996b09..1c296ab7e 100644 --- a/src/Magpie.App/Resources.language-de.resw +++ b/src/Magpie.App/Resources.language-de.resw @@ -190,10 +190,10 @@ Sprache - + Magpie wird im Hintergrund weiterlaufen, nach dem das Fenster geschlossen wurde - + App in der Taskleiste anzeigen @@ -686,13 +686,13 @@ Konfigurationsdatei konnte nicht geparst werden - + Hauptfenster Konfigurationsdatei konnte nicht gelesen werden - + Schließen diff --git a/src/Magpie.App/Resources.language-en-US.resw b/src/Magpie.App/Resources.language-en-US.resw index d47641efb..85fc3db78 100644 --- a/src/Magpie.App/Resources.language-en-US.resw +++ b/src/Magpie.App/Resources.language-en-US.resw @@ -237,10 +237,10 @@ Run at startup - + Magpie will continue to run in the background after the main window is closed - + Display the app on the system tray @@ -721,10 +721,10 @@ Failed to read configuration file - + Exit - + Main window diff --git a/src/Magpie.App/Resources.language-es.resw b/src/Magpie.App/Resources.language-es.resw index 7a876fd8c..26b8746a4 100644 --- a/src/Magpie.App/Resources.language-es.resw +++ b/src/Magpie.App/Resources.language-es.resw @@ -222,10 +222,10 @@ Ejecutar en el arranque - + Magpie continuará ejecutándose en segundo plano después de cerrar la ventana principal - + Mostrar la aplicación en la bandeja del sistema @@ -522,10 +522,10 @@ Error al analizar el archivo de configuración - + Cerrar - + Ventana principal diff --git a/src/Magpie.App/Resources.language-fr.resw b/src/Magpie.App/Resources.language-fr.resw index fa4066ce8..87d05d7ad 100644 --- a/src/Magpie.App/Resources.language-fr.resw +++ b/src/Magpie.App/Resources.language-fr.resw @@ -165,7 +165,7 @@ Configuration de mise a l'échelle - + Afficher l'application sur la barre des taches @@ -273,7 +273,7 @@ Lancer au démarrage - + Magpie continuera à fonctionner en arrière-plan après la fermeture de la fenêtre principale @@ -355,10 +355,10 @@ Impossible d'analyser le fichier de configuration - + Quitter - + Fenêtre principale diff --git a/src/Magpie.App/Resources.language-id.resw b/src/Magpie.App/Resources.language-id.resw index 2c1b7dfbe..6c2c7b08b 100644 --- a/src/Magpie.App/Resources.language-id.resw +++ b/src/Magpie.App/Resources.language-id.resw @@ -189,10 +189,10 @@ Jalankan saat startup - + Magpie akan tetap berjalan di belakang saat window utama ditutup - + Munculkan app di system tray diff --git a/src/Magpie.App/Resources.language-it.resw b/src/Magpie.App/Resources.language-it.resw index 073805bd2..69c4d4fe4 100644 --- a/src/Magpie.App/Resources.language-it.resw +++ b/src/Magpie.App/Resources.language-it.resw @@ -210,7 +210,7 @@ Esegui all'avvio - + Mostra l'app nell'area di notifica @@ -541,10 +541,10 @@ Impossibile leggere il file di configurazione - + Esci - + Finestra principale @@ -643,7 +643,7 @@ Scorciatoie - + Magpie continuerà a funzionare in background dopo la chiusura della finestra principale diff --git a/src/Magpie.App/Resources.language-ja.resw b/src/Magpie.App/Resources.language-ja.resw index 5a9b02150..7f7d3212a 100644 --- a/src/Magpie.App/Resources.language-ja.resw +++ b/src/Magpie.App/Resources.language-ja.resw @@ -255,7 +255,7 @@ 作成 - + システムトレイにアプリを表示 @@ -559,7 +559,7 @@ 設定ファイルの読み取りに失敗しました - + 終了 @@ -607,7 +607,7 @@ グローバル設定ファイルは不明なバージョンのものであり、正しく解析されない可能性があります。 - + メインウィンドウを閉じた後も、Magpie は引き続きバックグラウンドで実行されます @@ -730,7 +730,7 @@ 未知の効果 - + メインウィンドウ diff --git a/src/Magpie.App/Resources.language-ko.resw b/src/Magpie.App/Resources.language-ko.resw index 7e1939fb0..7e477ce6d 100644 --- a/src/Magpie.App/Resources.language-ko.resw +++ b/src/Magpie.App/Resources.language-ko.resw @@ -258,10 +258,10 @@ 언어 - + 메인 창이 닫힌 후 Magpie가 백그라운드에서 계속 실행됩니다 - + 시스템 트레이에 앱 표시 @@ -745,13 +745,13 @@ 구성 파일 읽기에 실패했습니다 - + 끝내기 변경 사항을 적용하려면 다시 시작해야 합니다 - + 메인 창 diff --git a/src/Magpie.App/Resources.language-pt-BR.resw b/src/Magpie.App/Resources.language-pt-BR.resw index 4fc3eaf9d..af6f4441b 100644 --- a/src/Magpie.App/Resources.language-pt-BR.resw +++ b/src/Magpie.App/Resources.language-pt-BR.resw @@ -186,7 +186,7 @@ Executar na inicialização - + Exibir o aplicativo na área de notificação @@ -402,7 +402,7 @@ Redimensionar automaticamente quando a janela voltar ao primeiro plano - + O Magpie continuará em execução em segundo plano após o fechamento da janela principal @@ -693,7 +693,7 @@ Falha ao analisar o arquivo de configuração - + Janela principal @@ -772,7 +772,7 @@ Falha ao ler o arquivo de configuração - + Sair diff --git a/src/Magpie.App/Resources.language-ru.resw b/src/Magpie.App/Resources.language-ru.resw index a54440bcf..9ce31e493 100644 --- a/src/Magpie.App/Resources.language-ru.resw +++ b/src/Magpie.App/Resources.language-ru.resw @@ -165,10 +165,10 @@ Не удалось прочитать файл настроек - + Выйти - + Главное окно @@ -288,10 +288,10 @@ Запускать при включении системы - + Magpie продолжит работать в фоне после закрытия главного окна - + Отображение приложения на панели задач diff --git a/src/Magpie.App/Resources.language-tr.resw b/src/Magpie.App/Resources.language-tr.resw index 99aef0b10..905df3d99 100644 --- a/src/Magpie.App/Resources.language-tr.resw +++ b/src/Magpie.App/Resources.language-tr.resw @@ -270,7 +270,7 @@ Başlangıçta çalıştır - + Uygulamayı sistem tepsisinde görüntüle @@ -676,10 +676,10 @@ Yapılandırma dosyası okunamadı - + Çıkış - + Ana pencere @@ -718,7 +718,7 @@ Ölçek yapılandırması - + Magpie, ana pencere kapatıldıktan sonra arka planda çalışmaya devam edecek diff --git a/src/Magpie.App/Resources.language-uk.resw b/src/Magpie.App/Resources.language-uk.resw index a7a7499da..c2e25b91e 100644 --- a/src/Magpie.App/Resources.language-uk.resw +++ b/src/Magpie.App/Resources.language-uk.resw @@ -568,7 +568,7 @@ Файл конфігурації не є дійсним JSON - + Вихід @@ -613,10 +613,10 @@ Портативний режим - + Magpie продовжить працювати у фоновому режимі після закриття головного вікна - + Відображення застосунку в системному треї @@ -727,7 +727,7 @@ Режим налагодження - + Головне вікно diff --git a/src/Magpie.App/Resources.language-vi.resw b/src/Magpie.App/Resources.language-vi.resw index 5947499f7..ad90d9e44 100644 --- a/src/Magpie.App/Resources.language-vi.resw +++ b/src/Magpie.App/Resources.language-vi.resw @@ -736,10 +736,10 @@ Khởi động lại Magpie - + Magpie sẽ tiếp tục chạy kể cả khi cửa sổ chính bị đóng - + Hiển thị trên thanh tác vụ @@ -796,10 +796,10 @@ Bật - + Thoát - + Cửa sổ chính diff --git a/src/Magpie.App/Resources.language-zh-Hans.resw b/src/Magpie.App/Resources.language-zh-Hans.resw index 0761a2089..1b6186bb6 100644 --- a/src/Magpie.App/Resources.language-zh-Hans.resw +++ b/src/Magpie.App/Resources.language-zh-Hans.resw @@ -237,10 +237,10 @@ 开机启动 - + 主窗口被关闭后 Magpie 将在后台继续运行 - + 在系统托盘上显示应用程序 @@ -721,10 +721,10 @@ 读取配置文件失败 - + 退出 - + 主窗口 diff --git a/src/Magpie.App/Resources.language-zh-Hant.resw b/src/Magpie.App/Resources.language-zh-Hant.resw index 6a0e32f70..5d807096e 100644 --- a/src/Magpie.App/Resources.language-zh-Hant.resw +++ b/src/Magpie.App/Resources.language-zh-Hant.resw @@ -225,7 +225,7 @@ 開機啟動 - + 主視窗被關閉後 Magpie 將在背景繼續執行 @@ -273,7 +273,7 @@ 匯入舊版程式的 ScaleModels.json - + 退出 @@ -285,7 +285,7 @@ 開啟新視窗以新增設定檔 - + 工具列圖示 @@ -640,7 +640,7 @@ 讀取組態文件失敗 - + 主視窗 diff --git a/src/Magpie.App/SettingsPage.xaml b/src/Magpie.App/SettingsPage.xaml index 78ad77e8d..7f183786c 100644 --- a/src/Magpie.App/SettingsPage.xaml +++ b/src/Magpie.App/SettingsPage.xaml @@ -57,12 +57,12 @@ - + + IsOn="{x:Bind ViewModel.IsShowNotifyIcon, Mode=TwoWay}" /> diff --git a/src/Magpie.App/SettingsViewModel.cpp b/src/Magpie.App/SettingsViewModel.cpp index 2344a664b..1b9de3bec 100644 --- a/src/Magpie.App/SettingsViewModel.cpp +++ b/src/Magpie.App/SettingsViewModel.cpp @@ -94,7 +94,7 @@ void SettingsViewModel::IsRunAtStartup(bool value) { if (value) { AutoStartHelper::EnableAutoStart( AppSettings::Get().IsAlwaysRunAsAdmin(), - _isMinimizeAtStartup ? CommonSharedConstants::OPTION_MINIMIZE_TO_TRAY_AT_STARTUP : nullptr + _isMinimizeAtStartup ? CommonSharedConstants::OPTION_LAUNCH_WITHOUT_WINDOW : nullptr ); } else { AutoStartHelper::DisableAutoStart(); @@ -112,14 +112,14 @@ void SettingsViewModel::IsMinimizeAtStartup(bool value) { AutoStartHelper::EnableAutoStart( AppSettings::Get().IsAlwaysRunAsAdmin(), - value ? CommonSharedConstants::OPTION_MINIMIZE_TO_TRAY_AT_STARTUP : nullptr + value ? CommonSharedConstants::OPTION_LAUNCH_WITHOUT_WINDOW : nullptr ); _UpdateStartupOptions(); } bool SettingsViewModel::IsMinimizeAtStartupEnabled() const noexcept { - return IsRunAtStartup() && IsShowTrayIcon(); + return IsRunAtStartup() && IsShowNotifyIcon(); } bool SettingsViewModel::IsPortableMode() const noexcept { @@ -143,13 +143,13 @@ fire_and_forget SettingsViewModel::OpenConfigLocation() const noexcept { Win32Utils::OpenFolderAndSelectFile(configPath.c_str()); } -bool SettingsViewModel::IsShowTrayIcon() const noexcept { - return AppSettings::Get().IsShowTrayIcon(); +bool SettingsViewModel::IsShowNotifyIcon() const noexcept { + return AppSettings::Get().IsShowNotifyIcon(); } -void SettingsViewModel::IsShowTrayIcon(bool value) { - AppSettings::Get().IsShowTrayIcon(value); - _propertyChangedEvent(*this, PropertyChangedEventArgs(L"IsShowTrayIcon")); +void SettingsViewModel::IsShowNotifyIcon(bool value) { + AppSettings::Get().IsShowNotifyIcon(value); + _propertyChangedEvent(*this, PropertyChangedEventArgs(L"IsShowNotifyIcon")); if (_isRunAtStartup) { AutoStartHelper::EnableAutoStart(AppSettings::Get().IsAlwaysRunAsAdmin(), nullptr); @@ -353,7 +353,7 @@ void SettingsViewModel::_UpdateStartupOptions() { std::wstring arguments; _isRunAtStartup = AutoStartHelper::IsAutoStartEnabled(arguments); if (_isRunAtStartup) { - _isMinimizeAtStartup = arguments == CommonSharedConstants::OPTION_MINIMIZE_TO_TRAY_AT_STARTUP; + _isMinimizeAtStartup = arguments == CommonSharedConstants::OPTION_LAUNCH_WITHOUT_WINDOW; } else { _isMinimizeAtStartup = false; } diff --git a/src/Magpie.App/SettingsViewModel.h b/src/Magpie.App/SettingsViewModel.h index 1da996657..f3556f31a 100644 --- a/src/Magpie.App/SettingsViewModel.h +++ b/src/Magpie.App/SettingsViewModel.h @@ -36,8 +36,8 @@ struct SettingsViewModel : SettingsViewModelT { fire_and_forget OpenConfigLocation() const noexcept; - bool IsShowTrayIcon() const noexcept; - void IsShowTrayIcon(bool value); + bool IsShowNotifyIcon() const noexcept; + void IsShowNotifyIcon(bool value); bool IsProcessElevated() const noexcept; diff --git a/src/Magpie.App/SettingsViewModel.idl b/src/Magpie.App/SettingsViewModel.idl index 5d6d762d0..c3074daf3 100644 --- a/src/Magpie.App/SettingsViewModel.idl +++ b/src/Magpie.App/SettingsViewModel.idl @@ -13,7 +13,7 @@ namespace Magpie.App { Boolean IsMinimizeAtStartupEnabled { get; }; Boolean IsPortableMode; void OpenConfigLocation(); - Boolean IsShowTrayIcon; + Boolean IsShowNotifyIcon; Boolean IsProcessElevated { get; }; Boolean IsAlwaysRunAsAdmin; diff --git a/src/Magpie/Magpie.vcxproj b/src/Magpie/Magpie.vcxproj index 639458f61..cd621eb46 100644 --- a/src/Magpie/Magpie.vcxproj +++ b/src/Magpie/Magpie.vcxproj @@ -44,7 +44,7 @@ - + @@ -61,7 +61,7 @@ - + @@ -122,4 +122,4 @@ - + \ No newline at end of file diff --git a/src/Magpie/TrayIconService.cpp b/src/Magpie/NotifyIconService.cpp similarity index 85% rename from src/Magpie/TrayIconService.cpp rename to src/Magpie/NotifyIconService.cpp index eeed9367b..d5a6fa674 100644 --- a/src/Magpie/TrayIconService.cpp +++ b/src/Magpie/NotifyIconService.cpp @@ -1,5 +1,5 @@ #include "pch.h" -#include "TrayIconService.h" +#include "NotifyIconService.h" #include "CommonSharedConstants.h" #include "Logger.h" #include "resource.h" @@ -9,9 +9,9 @@ namespace Magpie { // 当任务栏被创建时会广播此消息。用于在资源管理器被重新启动时重新创建托盘图标 // https://learn.microsoft.com/en-us/windows/win32/shell/taskbar#taskbar-creation-notification -const UINT TrayIconService::_WM_TASKBARCREATED = RegisterWindowMessage(L"TaskbarCreated"); +const UINT NotifyIconService::_WM_TASKBARCREATED = RegisterWindowMessage(L"TaskbarCreated"); -void TrayIconService::Initialize() noexcept { +void NotifyIconService::Initialize() noexcept { _nid.cbSize = sizeof(_nid); _nid.uVersion = 0; // 不使用 NOTIFYICON_VERSION_4 _nid.uCallbackMessage = CommonSharedConstants::WM_NOTIFY_ICON; @@ -19,7 +19,7 @@ void TrayIconService::Initialize() noexcept { _nid.uID = 0; } -void TrayIconService::Uninitialize() noexcept { +void NotifyIconService::Uninitialize() noexcept { IsShow(false); if (_nid.hWnd) { @@ -30,7 +30,7 @@ void TrayIconService::Uninitialize() noexcept { } } -void TrayIconService::IsShow(bool value) noexcept { +void NotifyIconService::IsShow(bool value) noexcept { _shouldShow = value; if (value) { @@ -41,7 +41,7 @@ void TrayIconService::IsShow(bool value) noexcept { WNDCLASSEXW wcex{}; wcex.cbSize = sizeof(wcex); wcex.hInstance = hInst; - wcex.lpfnWndProc = _TrayIconWndProcStatic; + wcex.lpfnWndProc = _NotifyIconWndProcStatic; wcex.lpszClassName = CommonSharedConstants::NOTIFY_ICON_WINDOW_CLASS_NAME; RegisterClassEx(&wcex); @@ -85,7 +85,7 @@ void TrayIconService::IsShow(bool value) noexcept { } } -LRESULT TrayIconService::_TrayIconWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { +LRESULT NotifyIconService::_NotifyIconWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case CommonSharedConstants::WM_NOTIFY_ICON: { @@ -99,8 +99,8 @@ LRESULT TrayIconService::_TrayIconWndProc(HWND hWnd, UINT message, WPARAM wParam { winrt::ResourceLoader resourceLoader = winrt::ResourceLoader::GetForCurrentView(CommonSharedConstants::APP_RESOURCE_MAP_ID); - winrt::hstring mainWindowText = resourceLoader.GetString(L"TrayIcon_MainWindow"); - winrt::hstring exitText = resourceLoader.GetString(L"TrayIcon_Exit"); + winrt::hstring mainWindowText = resourceLoader.GetString(L"NotifyIcon_MainWindow"); + winrt::hstring exitText = resourceLoader.GetString(L"NotifyIcon_Exit"); HMENU hMenu = CreatePopupMenu(); AppendMenu(hMenu, MF_STRING, 1, mainWindowText.c_str()); diff --git a/src/Magpie/TrayIconService.h b/src/Magpie/NotifyIconService.h similarity index 55% rename from src/Magpie/TrayIconService.h rename to src/Magpie/NotifyIconService.h index 38bf0f5e2..4b844bf56 100644 --- a/src/Magpie/TrayIconService.h +++ b/src/Magpie/NotifyIconService.h @@ -2,10 +2,10 @@ namespace Magpie { -class TrayIconService { +class NotifyIconService { public: - static TrayIconService& Get() noexcept { - static TrayIconService instance; + static NotifyIconService& Get() noexcept { + static NotifyIconService instance; return instance; } @@ -19,10 +19,10 @@ class TrayIconService { } private: - static LRESULT _TrayIconWndProcStatic(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { - return Get()._TrayIconWndProc(hWnd, msg, wParam, lParam); + static LRESULT _NotifyIconWndProcStatic(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { + return Get()._NotifyIconWndProc(hWnd, msg, wParam, lParam); } - LRESULT _TrayIconWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam); + LRESULT _NotifyIconWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam); NOTIFYICONDATA _nid{}; bool _isShow = false; diff --git a/src/Magpie/XamlApp.cpp b/src/Magpie/XamlApp.cpp index abd01d266..f82ecba90 100644 --- a/src/Magpie/XamlApp.cpp +++ b/src/Magpie/XamlApp.cpp @@ -5,7 +5,7 @@ #include "CommonSharedConstants.h" #include #include "ThemeHelper.h" -#include "TrayIconService.h" +#include "NotifyIconService.h" namespace Magpie { @@ -60,17 +60,17 @@ bool XamlApp::Initialize(HINSTANCE hInstance, const wchar_t* arguments) { ThemeHelper::Initialize(); - TrayIconService& trayIconService = TrayIconService::Get(); - trayIconService.Initialize(); - trayIconService.IsShow(_uwpApp.IsShowTrayIcon()); - _uwpApp.IsShowTrayIconChanged([](winrt::IInspectable const&, bool value) { - TrayIconService::Get().IsShow(value); + NotifyIconService& notifyIconService = NotifyIconService::Get(); + notifyIconService.Initialize(); + notifyIconService.IsShow(_uwpApp.IsShowNotifyIcon()); + _uwpApp.IsShowNotifyIconChanged([](winrt::IInspectable const&, bool value) { + NotifyIconService::Get().IsShow(value); }); _mainWindow.Destroyed({ this, &XamlApp::_MainWindow_Destoryed }); // 不显示托盘图标时忽略 -t 参数 - if (!trayIconService.IsShow() || !arguments || arguments != L"-t"sv) { + if (!notifyIconService.IsShow() || !arguments || arguments != L"-t"sv) { if (!_CreateMainWindow()) { Quit(); return false; @@ -129,7 +129,7 @@ void XamlApp::Restart(bool asElevated, const wchar_t* arguments) noexcept { } void XamlApp::SaveSettings() { - if (_mainWindow && TrayIconService::Get().IsShow()) { + if (_mainWindow && NotifyIconService::Get().IsShow()) { WINDOWPLACEMENT wp{}; wp.length = sizeof(wp); if (GetWindowPlacement(_mainWindow.Handle(), &wp)) { @@ -234,7 +234,7 @@ void XamlApp::ShowMainWindow() noexcept { } void XamlApp::_QuitWithoutMainWindow() { - TrayIconService::Get().Uninitialize(); + NotifyIconService::Get().Uninitialize(); _uwpApp.Uninitialize(); // 不能调用 Close,否则切换页面时关闭主窗口会导致崩溃 @@ -250,7 +250,7 @@ void XamlApp::_MainWindow_Destoryed() { _uwpApp.HwndMain(0); _uwpApp.RootPage(nullptr); - if (!TrayIconService::Get().IsShow()) { + if (!NotifyIconService::Get().IsShow()) { _QuitWithoutMainWindow(); } } diff --git a/src/Shared/CommonSharedConstants.h b/src/Shared/CommonSharedConstants.h index 82be53797..24b950cae 100644 --- a/src/Shared/CommonSharedConstants.h +++ b/src/Shared/CommonSharedConstants.h @@ -20,7 +20,7 @@ struct CommonSharedConstants { static constexpr const wchar_t* CACHE_DIR = L"cache\\"; static constexpr const wchar_t* UPDATE_DIR = L"update\\"; - static constexpr const wchar_t* OPTION_MINIMIZE_TO_TRAY_AT_STARTUP = L"-t"; + static constexpr const wchar_t* OPTION_LAUNCH_WITHOUT_WINDOW = L"-t"; #ifndef IDI_APP // 来自 Magpie\resource.h From 849409ba1d035bd50a8f41acf0ad87d0a4d38483 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=97=AD?= Date: Mon, 25 Mar 2024 16:08:40 +0800 Subject: [PATCH 135/155] =?UTF-8?q?feat:=20=E5=AE=9E=E7=8E=B0=E6=88=AA?= =?UTF-8?q?=E5=B1=8F=E6=97=B6=E9=9A=90=E8=97=8F=E5=85=89=E6=A0=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Magpie.Core/CursorDrawer.cpp | 5 ++++ src/Magpie.Core/CursorDrawer.h | 10 ++++++++ src/Magpie.Core/EffectHelper.h | 4 ++++ src/Magpie.Core/Renderer.cpp | 39 ++++++++++++++++++++++++++++++++ src/Magpie.Core/Renderer.h | 4 ++++ 5 files changed, 62 insertions(+) diff --git a/src/Magpie.Core/CursorDrawer.cpp b/src/Magpie.Core/CursorDrawer.cpp index 3d04ed460..95b2bfab8 100644 --- a/src/Magpie.Core/CursorDrawer.cpp +++ b/src/Magpie.Core/CursorDrawer.cpp @@ -99,6 +99,11 @@ bool CursorDrawer::Initialize(DeviceResources& deviceResources, ID3D11Texture2D* } void CursorDrawer::Draw() noexcept { + if (!_isCursorVisible) { + // 截屏时暂时不渲染光标 + return; + } + const CursorManager& cursorManager = ScalingWindow::Get().CursorManager(); const HCURSOR hCursor = cursorManager.Cursor(); diff --git a/src/Magpie.Core/CursorDrawer.h b/src/Magpie.Core/CursorDrawer.h index 4a5cee7e7..c3737e762 100644 --- a/src/Magpie.Core/CursorDrawer.h +++ b/src/Magpie.Core/CursorDrawer.h @@ -16,6 +16,14 @@ class CursorDrawer { void Draw() noexcept; + void IsCursorVisible(bool value) noexcept { + _isCursorVisible = value; + } + + bool IsCursorVisible() const noexcept { + return _isCursorVisible; + } + private: enum class _CursorType { // 彩色光标,此时纹理中 RGB 通道已预乘 A 通道(premultiplied alpha),A 通道已预先取反 @@ -63,6 +71,8 @@ class CursorDrawer { winrt::com_ptr _tempCursorTexture; winrt::com_ptr _tempCursorTextureRtv; SIZE _tempCursorTextureSize{}; + + bool _isCursorVisible = true; }; } diff --git a/src/Magpie.Core/EffectHelper.h b/src/Magpie.Core/EffectHelper.h index 29d88aea3..a4a3d2a27 100644 --- a/src/Magpie.Core/EffectHelper.h +++ b/src/Magpie.Core/EffectHelper.h @@ -2,6 +2,8 @@ #include #include +namespace Magpie::Core { + struct EffectHelper { struct EffectIntermediateTextureFormatDesc { const char* name; @@ -41,3 +43,5 @@ struct EffectHelper { int intVal; }; }; + +} diff --git a/src/Magpie.Core/Renderer.cpp b/src/Magpie.Core/Renderer.cpp index 13e59c988..8b71f1a18 100644 --- a/src/Magpie.Core/Renderer.cpp +++ b/src/Magpie.Core/Renderer.cpp @@ -34,6 +34,40 @@ Renderer::~Renderer() noexcept { } } +// 监听 PrintScreen 实现截屏时隐藏光标 +LRESULT CALLBACK Renderer::_LowLevelKeyboardHook(int nCode, WPARAM wParam, LPARAM lParam) { + if (nCode != HC_ACTION || wParam != WM_KEYDOWN) { + return CallNextHookEx(NULL, nCode, wParam, lParam); + } + + KBDLLHOOKSTRUCT* info = (KBDLLHOOKSTRUCT*)lParam; + if (info->vkCode == VK_SNAPSHOT) { + // 为了缩短钩子处理时间,异步执行所有逻辑 + winrt::DispatcherQueue dispatcher = winrt::DispatcherQueue::GetForCurrentThread(); + dispatcher.TryEnqueue([dispatcher]() -> winrt::fire_and_forget { + // 暂时隐藏光标 + Renderer& renderer = ScalingWindow::Get().Renderer(); + renderer._cursorDrawer.IsCursorVisible(false); + renderer._FrontendRender(); + + const HWND hwndScaling = ScalingWindow::Get().Handle(); + + winrt::DispatcherQueue dispatcherBak = dispatcher; + co_await 200ms; + co_await dispatcherBak; + + if (ScalingWindow::Get().Handle() == hwndScaling && + !renderer._cursorDrawer.IsCursorVisible() + ) { + renderer._cursorDrawer.IsCursorVisible(true); + renderer._FrontendRender(); + } + }); + } + + return CallNextHookEx(NULL, nCode, wParam, lParam); +} + bool Renderer::Initialize() noexcept { _backendThread = std::thread(std::bind(&Renderer::_BackendThreadProc, this)); @@ -95,6 +129,11 @@ bool Renderer::Initialize() noexcept { } } + _hKeyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL, _LowLevelKeyboardHook, NULL, 0); + if (!_hKeyboardHook) { + Logger::Get().Win32Warn("SetWindowsHookEx 失败"); + } + return true; } diff --git a/src/Magpie.Core/Renderer.h b/src/Magpie.Core/Renderer.h index 4924e2129..036141c97 100644 --- a/src/Magpie.Core/Renderer.h +++ b/src/Magpie.Core/Renderer.h @@ -71,6 +71,8 @@ class Renderer { bool _UpdateDynamicConstants() const noexcept; + static LRESULT CALLBACK _LowLevelKeyboardHook(int nCode, WPARAM wParam, LPARAM lParam); + // 只能由前台线程访问 DeviceResources _frontendResources; winrt::com_ptr _swapChain; @@ -91,6 +93,8 @@ class Renderer { RECT _destRect{}; std::thread _backendThread; + + HHOOK _hKeyboardHook = NULL; // 只能由后台线程访问 DeviceResources _backendResources; From 40a8b2bce73f40da650fd9ecfa12b752a0c7aaaa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=97=AD?= Date: Mon, 25 Mar 2024 16:53:56 +0800 Subject: [PATCH 136/155] =?UTF-8?q?feat:=20=E5=AE=9E=E7=8E=B0=E6=A8=A1?= =?UTF-8?q?=E6=8B=9F=E7=8B=AC=E5=8D=A0=E5=85=A8=E5=B1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Magpie.Core/ExclModeHelper.cpp | 67 +++++++++++++++++++++++++++++ src/Magpie.Core/ExclModeHelper.h | 11 +++++ src/Magpie.Core/Magpie.Core.vcxproj | 2 + src/Magpie.Core/ScalingWindow.cpp | 26 +++++++++++ src/Magpie.Core/ScalingWindow.h | 2 + 5 files changed, 108 insertions(+) create mode 100644 src/Magpie.Core/ExclModeHelper.cpp create mode 100644 src/Magpie.Core/ExclModeHelper.h diff --git a/src/Magpie.Core/ExclModeHelper.cpp b/src/Magpie.Core/ExclModeHelper.cpp new file mode 100644 index 000000000..cf7e0f53a --- /dev/null +++ b/src/Magpie.Core/ExclModeHelper.cpp @@ -0,0 +1,67 @@ +#include "pch.h" +#include "ExclModeHelper.h" +#include "Logger.h" + +namespace Magpie::Core { + +// 模拟 D3D 独占全屏模式,以起到免打扰的效果 +// SHQueryUserNotificationState 通常被用来检测是否有 D3D 游戏独占全屏,以确定是否应该向用户推送通知/弹窗 +// 此函数内部使用名为 __DDrawExclMode__ 的 mutex 检测独占全屏,因此这里直接获取该 mutex 以模拟独占全屏 +// 感谢 @codehz 提供的思路 GH#245 +Win32Utils::ScopedHandle ExclModeHelper::EnterExclMode() noexcept { + Win32Utils::ScopedHandle exclModeMutex; + + QUERY_USER_NOTIFICATION_STATE state; + HRESULT hr = SHQueryUserNotificationState(&state); + if (FAILED(hr)) { + Logger::Get().ComError("SHQueryUserNotificationState 失败", hr); + return exclModeMutex; + } + + // 操作系统将 Magpie 的缩放窗口视为全屏应用程序,可能已经启用了“请勿打扰”,即 QUNS_BUSY。 + // 但我们想要的是 QUNS_RUNNING_D3D_FULL_SCREEN + if (state == QUNS_RUNNING_D3D_FULL_SCREEN) { + Logger::Get().Info("已处于免打扰状态"); + return exclModeMutex; + } + + exclModeMutex.reset(Win32Utils::SafeHandle( + OpenMutex(SYNCHRONIZE, FALSE, L"__DDrawExclMode__"))); + if (!exclModeMutex) { + Logger::Get().Win32Error("OpenMutex 失败"); + return exclModeMutex; + } + + DWORD result = WaitForSingleObject(exclModeMutex.get(), 0); + if (result != WAIT_OBJECT_0) { + Logger::Get().Error("获取 __DDrawExclMode__ 失败"); + exclModeMutex.reset(); + return exclModeMutex; + } + + hr = SHQueryUserNotificationState(&state); + if (FAILED(hr)) { + Logger::Get().ComError("SHQueryUserNotificationState 失败", hr); + ReleaseMutex(exclModeMutex.get()); + exclModeMutex.reset(); + return exclModeMutex; + } + if (state != QUNS_RUNNING_D3D_FULL_SCREEN) { + Logger::Get().Error("模拟独占全屏失败"); + ReleaseMutex(exclModeMutex.get()); + exclModeMutex.reset(); + return exclModeMutex; + } + + Logger::Get().Info("模拟独占全屏成功"); + return exclModeMutex; +} + +void ExclModeHelper::ExitExclMode(Win32Utils::ScopedHandle& mutex) noexcept { + if (mutex) { + ReleaseMutex(mutex.get()); + mutex.reset(); + } +} + +} diff --git a/src/Magpie.Core/ExclModeHelper.h b/src/Magpie.Core/ExclModeHelper.h new file mode 100644 index 000000000..40d5d1c94 --- /dev/null +++ b/src/Magpie.Core/ExclModeHelper.h @@ -0,0 +1,11 @@ +#pragma once +#include "Win32Utils.h" + +namespace Magpie::Core { + +struct ExclModeHelper { + static Win32Utils::ScopedHandle EnterExclMode() noexcept; + static void ExitExclMode(Win32Utils::ScopedHandle& mutex) noexcept; +}; + +} diff --git a/src/Magpie.Core/Magpie.Core.vcxproj b/src/Magpie.Core/Magpie.Core.vcxproj index 73d2a62d4..75d169128 100644 --- a/src/Magpie.Core/Magpie.Core.vcxproj +++ b/src/Magpie.Core/Magpie.Core.vcxproj @@ -57,6 +57,7 @@ + @@ -90,6 +91,7 @@ + diff --git a/src/Magpie.Core/ScalingWindow.cpp b/src/Magpie.Core/ScalingWindow.cpp index 9c14ef3f1..69b99af98 100644 --- a/src/Magpie.Core/ScalingWindow.cpp +++ b/src/Magpie.Core/ScalingWindow.cpp @@ -8,6 +8,7 @@ #include "CursorManager.h" #include #include "FrameSourceBase.h" +#include "ExclModeHelper.h" namespace Magpie::Core { @@ -216,6 +217,27 @@ bool ScalingWindow::Create(HINSTANCE hInstance, HWND hwndSrc, ScalingOptions&& o BringWindowToTop(_hwndSrc); } + // 模拟独占全屏 + if (_options.IsSimulateExclusiveFullscreen()) { + // 延迟 1s 以避免干扰游戏的初始化,见 #495 + ([]()->winrt::fire_and_forget { + ScalingWindow& that = ScalingWindow::Get(); + const HWND hwndScaling = that.Handle(); + winrt::DispatcherQueue dispatcher = winrt::DispatcherQueue::GetForCurrentThread(); + + co_await 1s; + co_await dispatcher; + + if (that.Handle() != hwndScaling) { + co_return; + } + + if (!that._exclModeMutex) { + that._exclModeMutex = ExclModeHelper::EnterExclMode(); + } + })(); + }; + return true; } @@ -303,6 +325,10 @@ LRESULT ScalingWindow::_MessageHandler(UINT msg, WPARAM wParam, LPARAM lParam) n } case WM_DESTROY: { + if (_exclModeMutex) { + ExclModeHelper::ExitExclMode(_exclModeMutex); + } + if (_hwndDDF) { DestroyWindow(_hwndDDF); _hwndDDF = NULL; diff --git a/src/Magpie.Core/ScalingWindow.h b/src/Magpie.Core/ScalingWindow.h index 63e1bbeca..8be84fcb7 100644 --- a/src/Magpie.Core/ScalingWindow.h +++ b/src/Magpie.Core/ScalingWindow.h @@ -1,6 +1,7 @@ #pragma once #include "WindowBase.h" #include "ScalingOptions.h" +#include "Win32Utils.h" namespace Magpie::Core { @@ -64,6 +65,7 @@ class ScalingWindow : public WindowBase { RECT _srcWndRect{}; HWND _hwndDDF = NULL; + Win32Utils::ScopedHandle _exclModeMutex; }; } From 0a7331b3161dfa4a8226328bb5a4106086264454 Mon Sep 17 00:00:00 2001 From: Xu <34770031+Blinue@users.noreply.github.com> Date: Mon, 25 Mar 2024 18:15:07 +0800 Subject: [PATCH 137/155] =?UTF-8?q?feat:=20=E4=BC=98=E5=8C=96=E5=AF=B9?= =?UTF-8?q?=E6=BA=90=E7=AA=97=E5=8F=A3=E7=9A=84=E6=A3=80=E6=B5=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Magpie.App/ScalingService.cpp | 18 ++++++++++++++---- src/Magpie.Core/ScalingWindow.cpp | 6 ++++++ src/Magpie.Core/include/Magpie.Core.h | 1 + 3 files changed, 21 insertions(+), 4 deletions(-) diff --git a/src/Magpie.App/ScalingService.cpp b/src/Magpie.App/ScalingService.cpp index 1c10a8873..b9d5bfc71 100644 --- a/src/Magpie.App/ScalingService.cpp +++ b/src/Magpie.App/ScalingService.cpp @@ -332,12 +332,22 @@ bool ScalingService::_CheckSrcWnd(HWND hWnd) noexcept { return false; } - UINT showCmd = Win32Utils::GetWindowShowCmd(hWnd); - if (showCmd == SW_NORMAL) { - return true; + if (!WindowHelper::IsValidSrcWindow(hWnd)) { + return false; + } + + // 不缩放最小化的窗口,是否缩放最大化的窗口由设置决定 + if (UINT showCmd = Win32Utils::GetWindowShowCmd(hWnd); showCmd != SW_NORMAL) { + if (showCmd != SW_MAXIMIZE || !AppSettings::Get().IsAllowScalingMaximized()) { + return false; + } } - return showCmd == SW_MAXIMIZE && AppSettings::Get().IsAllowScalingMaximized(); + // 不缩放过小的窗口 + RECT clientRect; + GetClientRect(hWnd, &clientRect); + const SIZE clientSize = Win32Utils::GetSizeOfRect(clientRect); + return clientSize.cx >= 32 && clientSize.cy >= 32; } } diff --git a/src/Magpie.Core/ScalingWindow.cpp b/src/Magpie.Core/ScalingWindow.cpp index 69b99af98..14510044f 100644 --- a/src/Magpie.Core/ScalingWindow.cpp +++ b/src/Magpie.Core/ScalingWindow.cpp @@ -9,6 +9,7 @@ #include #include "FrameSourceBase.h" #include "ExclModeHelper.h" +#include "StrUtils.h" namespace Magpie::Core { @@ -101,6 +102,11 @@ bool ScalingWindow::Create(HINSTANCE hInstance, HWND hwndSrc, ScalingOptions&& o return false; } +#if _DEBUG + OutputDebugString(fmt::format(L"可执行文件路径:{}\n窗口类:{}\n", + Win32Utils::GetPathOfWnd(hwndSrc), Win32Utils::GetWndClassName(hwndSrc)).c_str()); +#endif + _hwndSrc = hwndSrc; // 缩放结束后才失效 _options = std::move(options); diff --git a/src/Magpie.Core/include/Magpie.Core.h b/src/Magpie.Core/include/Magpie.Core.h index 7509f2881..f5a4d1ef7 100644 --- a/src/Magpie.Core/include/Magpie.Core.h +++ b/src/Magpie.Core/include/Magpie.Core.h @@ -4,3 +4,4 @@ #include "../LoggerHelper.h" #include "../EffectCompiler.h" #include "../EffectDesc.h" +#include "../WindowHelper.h" From c32148b1d677b00035fcbcb99797448b7e985010 Mon Sep 17 00:00:00 2001 From: Xu <34770031+Blinue@users.noreply.github.com> Date: Mon, 25 Mar 2024 21:40:33 +0800 Subject: [PATCH 138/155] =?UTF-8?q?feat:=20=E6=BA=90=E7=AA=97=E5=8F=A3?= =?UTF-8?q?=E7=A7=BB=E5=8A=A8=E6=88=96=E8=B0=83=E6=95=B4=E5=A4=A7=E5=B0=8F?= =?UTF-8?q?=E5=90=8E=E8=87=AA=E5=8A=A8=E9=87=8D=E6=96=B0=E7=BC=A9=E6=94=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Magpie.Core/Renderer.cpp | 7 ++-- src/Magpie.Core/ScalingRuntime.cpp | 53 ++++++++++++++++++++++++++++-- src/Magpie.Core/ScalingWindow.cpp | 35 +++++++++++++++++--- src/Magpie.Core/ScalingWindow.h | 22 ++++++++++++- 4 files changed, 105 insertions(+), 12 deletions(-) diff --git a/src/Magpie.Core/Renderer.cpp b/src/Magpie.Core/Renderer.cpp index 8b71f1a18..5a55f7b88 100644 --- a/src/Magpie.Core/Renderer.cpp +++ b/src/Magpie.Core/Renderer.cpp @@ -43,8 +43,7 @@ LRESULT CALLBACK Renderer::_LowLevelKeyboardHook(int nCode, WPARAM wParam, LPARA KBDLLHOOKSTRUCT* info = (KBDLLHOOKSTRUCT*)lParam; if (info->vkCode == VK_SNAPSHOT) { // 为了缩短钩子处理时间,异步执行所有逻辑 - winrt::DispatcherQueue dispatcher = winrt::DispatcherQueue::GetForCurrentThread(); - dispatcher.TryEnqueue([dispatcher]() -> winrt::fire_and_forget { + ScalingWindow::Get().Dispatcher().TryEnqueue([]() -> winrt::fire_and_forget { // 暂时隐藏光标 Renderer& renderer = ScalingWindow::Get().Renderer(); renderer._cursorDrawer.IsCursorVisible(false); @@ -52,9 +51,9 @@ LRESULT CALLBACK Renderer::_LowLevelKeyboardHook(int nCode, WPARAM wParam, LPARA const HWND hwndScaling = ScalingWindow::Get().Handle(); - winrt::DispatcherQueue dispatcherBak = dispatcher; + winrt::DispatcherQueue dispatcher = ScalingWindow::Get().Dispatcher(); co_await 200ms; - co_await dispatcherBak; + co_await dispatcher; if (ScalingWindow::Get().Handle() == hwndScaling && !renderer._cursorDrawer.IsCursorVisible() diff --git a/src/Magpie.Core/ScalingRuntime.cpp b/src/Magpie.Core/ScalingRuntime.cpp index a6f740e78..6c0c15f63 100644 --- a/src/Magpie.Core/ScalingRuntime.cpp +++ b/src/Magpie.Core/ScalingRuntime.cpp @@ -30,8 +30,8 @@ void ScalingRuntime::Start(HWND hwndSrc, ScalingOptions&& options) { _isRunningChangedEvent(true); - _Dispatcher().TryEnqueue([hwndSrc, options(std::move(options))]() mutable { - ScalingWindow::Get().Create(GetModuleHandle(nullptr), hwndSrc, std::move(options)); + _Dispatcher().TryEnqueue([dispatcher(_Dispatcher()), hwndSrc, options(std::move(options))]() mutable { + ScalingWindow::Get().Create(dispatcher, hwndSrc, std::move(options)); }); } @@ -53,10 +53,42 @@ void ScalingRuntime::Stop() { } _Dispatcher().TryEnqueue([]() { - ScalingWindow::Get().Destroy(); + ScalingWindow& scalingWindow = ScalingWindow::Get(); + if (scalingWindow.IsSrcRepositioning()) { + scalingWindow.CleanAfterSrcRepositioned(); + } else { + scalingWindow.Destroy(); + } }); } +// 返回值: +// -1: 应取消缩放 +// 0: 仍在调整中 +// 1: 调整完毕 +static int GetSrcRepositionState(HWND hwndSrc, bool allowScalingMaximized) noexcept { + if (!IsWindow(hwndSrc) || GetForegroundWindow() != hwndSrc) { + return -1; + } + + if (UINT showCmd = Win32Utils::GetWindowShowCmd(hwndSrc); showCmd != SW_NORMAL) { + if (showCmd != SW_SHOWMAXIMIZED || !allowScalingMaximized) { + return -1; + } + } + + // 检查源窗口是否正在调整大小或移动 + GUITHREADINFO guiThreadInfo{ + .cbSize = sizeof(GUITHREADINFO) + }; + if (!GetGUIThreadInfo(GetWindowThreadProcessId(hwndSrc, nullptr), &guiThreadInfo)) { + Logger::Get().Win32Error("GetGUIThreadInfo 失败"); + return -1; + } + + return (guiThreadInfo.flags & GUI_INMOVESIZE) ? 0 : 1; +} + void ScalingRuntime::_ScalingThreadProc() noexcept { #ifdef _DEBUG SetThreadDescription(GetCurrentThread(), L"Magpie 缩放线程"); @@ -105,6 +137,21 @@ void ScalingRuntime::_ScalingThreadProc() noexcept { if (scalingWindow) { scalingWindow.Render(); MsgWaitForMultipleObjectsEx(0, nullptr, 1, QS_ALLINPUT, MWMO_INPUTAVAILABLE); + } else if (scalingWindow.IsSrcRepositioning()) { + const int state = GetSrcRepositionState( + _hwndSrc.load(std::memory_order_relaxed), + scalingWindow.Options().IsAllowScalingMaximized() + ); + if (state == 0) { + // 等待调整完成 + MsgWaitForMultipleObjectsEx(0, nullptr, 10, QS_ALLINPUT, MWMO_INPUTAVAILABLE); + } else if (state == 1) { + // 重新缩放 + ScalingWindow::Get().RecreateAfterSrcRepositioned(); + } else { + // 取消缩放 + ScalingWindow::Get().CleanAfterSrcRepositioned(); + } } else { if (_hwndSrc.exchange(NULL, std::memory_order_relaxed)) { // 缩放失败或立即退出缩放 diff --git a/src/Magpie.Core/ScalingWindow.cpp b/src/Magpie.Core/ScalingWindow.cpp index 14510044f..aa44068cd 100644 --- a/src/Magpie.Core/ScalingWindow.cpp +++ b/src/Magpie.Core/ScalingWindow.cpp @@ -97,7 +97,11 @@ static uint32_t CalcWndRect(HWND hWnd, MultiMonitorUsage multiMonitorUsage, RECT } } -bool ScalingWindow::Create(HINSTANCE hInstance, HWND hwndSrc, ScalingOptions&& options) noexcept { +bool ScalingWindow::Create( + const winrt::DispatcherQueue& dispatcher, + HWND hwndSrc, + ScalingOptions&& options +) noexcept { if (_hWnd) { return false; } @@ -110,6 +114,9 @@ bool ScalingWindow::Create(HINSTANCE hInstance, HWND hwndSrc, ScalingOptions&& o _hwndSrc = hwndSrc; // 缩放结束后才失效 _options = std::move(options); + _dispatcher = dispatcher; + + _isSrcRepositioning = false; if (FindWindow(CommonSharedConstants::SCALING_WINDOW_CLASS_NAME, nullptr)) { Logger::Get().Error("已存在缩放窗口"); @@ -140,6 +147,8 @@ bool ScalingWindow::Create(HINSTANCE hInstance, HWND hwndSrc, ScalingOptions&& o } } + const HINSTANCE hInstance = GetModuleHandle(nullptr); + static const int _ = [](HINSTANCE hInstance) { WNDCLASSEXW wcex{ .cbSize = sizeof(wcex), @@ -229,7 +238,7 @@ bool ScalingWindow::Create(HINSTANCE hInstance, HWND hwndSrc, ScalingOptions&& o ([]()->winrt::fire_and_forget { ScalingWindow& that = ScalingWindow::Get(); const HWND hwndScaling = that.Handle(); - winrt::DispatcherQueue dispatcher = winrt::DispatcherQueue::GetForCurrentThread(); + winrt::DispatcherQueue dispatcher = that._dispatcher; co_await 1s; co_await dispatcher; @@ -253,6 +262,8 @@ void ScalingWindow::Render() noexcept { Logger::Get().Info("源窗口状态改变,退出全屏"); // 切换前台窗口导致停止缩放时不应激活源窗口 _renderer->SetOverlayVisibility(false, true); + + _isSrcRepositioning = srcState == 2; Destroy(); return; } @@ -271,6 +282,17 @@ void ScalingWindow::ToggleOverlay() noexcept { _renderer->SetOverlayVisibility(!_renderer->IsOverlayVisible()); } +void ScalingWindow::RecreateAfterSrcRepositioned() noexcept { + Create(_dispatcher, _hwndSrc, std::move(_options)); +} + +void ScalingWindow::CleanAfterSrcRepositioned() noexcept { + _options = {}; + _hwndSrc = NULL; + _dispatcher = nullptr; + _isSrcRepositioning = false; +} + LRESULT ScalingWindow::_MessageHandler(UINT msg, WPARAM wParam, LPARAM lParam) noexcept { if (_renderer) { _renderer->MessageHandler(msg, wParam, lParam); @@ -342,10 +364,15 @@ LRESULT ScalingWindow::_MessageHandler(UINT msg, WPARAM wParam, LPARAM lParam) n _cursorManager.reset(); _renderer.reset(); - _options = {}; - _hwndSrc = NULL; _srcWndRect = {}; + // 如果正在源窗口正在调整,暂时不清理这些成员 + if (!_isSrcRepositioning) { + _options = {}; + _hwndSrc = NULL; + _dispatcher = nullptr; + } + // 还原时钟精度 timeEndPeriod(1); break; diff --git a/src/Magpie.Core/ScalingWindow.h b/src/Magpie.Core/ScalingWindow.h index 8be84fcb7..716c0c2f9 100644 --- a/src/Magpie.Core/ScalingWindow.h +++ b/src/Magpie.Core/ScalingWindow.h @@ -16,7 +16,11 @@ class ScalingWindow : public WindowBase { return instance; } - bool Create(HINSTANCE hInstance, HWND hwndSrc, ScalingOptions&& options) noexcept; + bool Create( + const winrt::DispatcherQueue& dispatcher, + HWND hwndSrc, + ScalingOptions&& options + ) noexcept; void Render() noexcept; @@ -42,6 +46,18 @@ class ScalingWindow : public WindowBase { return *_cursorManager; } + const winrt::DispatcherQueue& Dispatcher() const noexcept { + return _dispatcher; + } + + bool IsSrcRepositioning() const noexcept { + return _isSrcRepositioning; + } + + void RecreateAfterSrcRepositioned() noexcept; + + void CleanAfterSrcRepositioned() noexcept; + protected: LRESULT _MessageHandler(UINT msg, WPARAM wParam, LPARAM lParam) noexcept; @@ -55,6 +71,8 @@ class ScalingWindow : public WindowBase { bool _DisableDirectFlip(HINSTANCE hInstance) noexcept; + winrt::DispatcherQueue _dispatcher{ nullptr }; + RECT _wndRect{}; ScalingOptions _options; @@ -66,6 +84,8 @@ class ScalingWindow : public WindowBase { HWND _hwndDDF = NULL; Win32Utils::ScopedHandle _exclModeMutex; + + bool _isSrcRepositioning = false; }; } From f919666f082348b4fff8900779e0010a5b91f442 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=97=AD?= Date: Tue, 26 Mar 2024 09:03:23 +0800 Subject: [PATCH 139/155] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E6=9C=89?= =?UTF-8?q?=E6=97=B6=E9=80=80=E5=87=BA=E7=BC=A9=E6=94=BE=E5=85=89=E6=A0=87?= =?UTF-8?q?=E4=B8=8D=E7=AB=8B=E5=88=BB=E6=98=BE=E7=A4=BA=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98=20=E4=B8=BB=E8=A6=81=E6=98=AF=E6=8B=96=E6=8B=BD?= =?UTF-8?q?=E7=AA=97=E5=8F=A3=E6=97=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Magpie.Core/CursorManager.cpp | 6 +++--- src/Magpie.Core/CursorManager.h | 2 +- src/Magpie.Core/FrameSourceBase.h | 2 +- src/Magpie.Core/GraphicsCaptureFrameSource.cpp | 8 ++++++-- src/Magpie.Core/GraphicsCaptureFrameSource.h | 2 +- src/Magpie.Core/Renderer.cpp | 6 +++--- src/Magpie.Core/Renderer.h | 2 +- 7 files changed, 16 insertions(+), 12 deletions(-) diff --git a/src/Magpie.Core/CursorManager.cpp b/src/Magpie.Core/CursorManager.cpp index 9074a61eb..af452fa55 100644 --- a/src/Magpie.Core/CursorManager.cpp +++ b/src/Magpie.Core/CursorManager.cpp @@ -79,7 +79,7 @@ CursorManager::~CursorManager() noexcept { ReleaseCapture(); } - _ShowSystemCursor(true); + _ShowSystemCursor(true, true); if (_curClips != RECT{}) { ClipCursor(nullptr); @@ -166,7 +166,7 @@ void CursorManager::IsCursorCapturedOnOverlay(bool value) noexcept { _UpdateCursorClip(); } -void CursorManager::_ShowSystemCursor(bool show) { +void CursorManager::_ShowSystemCursor(bool show, bool onDestory) { if (_isSystemCursorShown == show) { return; } @@ -200,7 +200,7 @@ void CursorManager::_ShowSystemCursor(bool show) { } } - ScalingWindow::Get().Renderer().OnCursorVisibilityChanged(show); + ScalingWindow::Get().Renderer().OnCursorVisibilityChanged(show, onDestory); } void CursorManager::_AdjustCursorSpeed() noexcept { diff --git a/src/Magpie.Core/CursorManager.h b/src/Magpie.Core/CursorManager.h index dcf0bd7c8..4c2f54245 100644 --- a/src/Magpie.Core/CursorManager.h +++ b/src/Magpie.Core/CursorManager.h @@ -34,7 +34,7 @@ class CursorManager { void IsCursorCapturedOnOverlay(bool value) noexcept; private: - void _ShowSystemCursor(bool show); + void _ShowSystemCursor(bool show, bool onDestory = false); void _AdjustCursorSpeed() noexcept; diff --git a/src/Magpie.Core/FrameSourceBase.h b/src/Magpie.Core/FrameSourceBase.h index 121161757..3df4b1998 100644 --- a/src/Magpie.Core/FrameSourceBase.h +++ b/src/Magpie.Core/FrameSourceBase.h @@ -40,7 +40,7 @@ class FrameSourceBase { virtual bool IsScreenCapture() const noexcept = 0; - virtual void OnCursorVisibilityChanged(bool /*isVisible*/) noexcept {}; + virtual void OnCursorVisibilityChanged(bool /*isVisible*/, bool /*onDestory*/) noexcept {}; protected: virtual bool _Initialize() noexcept = 0; diff --git a/src/Magpie.Core/GraphicsCaptureFrameSource.cpp b/src/Magpie.Core/GraphicsCaptureFrameSource.cpp index 4359d43ed..8c8e2ddd2 100644 --- a/src/Magpie.Core/GraphicsCaptureFrameSource.cpp +++ b/src/Magpie.Core/GraphicsCaptureFrameSource.cpp @@ -122,11 +122,15 @@ FrameSourceBase::UpdateState GraphicsCaptureFrameSource::_Update() noexcept { return UpdateState::NewFrame; } -void GraphicsCaptureFrameSource::OnCursorVisibilityChanged(bool isVisible) noexcept { +void GraphicsCaptureFrameSource::OnCursorVisibilityChanged(bool isVisible, bool onDestory) noexcept { // 显示光标时必须重启捕获 if (isVisible) { _StopCapture(); - _StartCapture(); + SystemParametersInfo(SPI_SETCURSORS, 0, nullptr, 0); + + if (!onDestory) { + _StartCapture(); + } } } diff --git a/src/Magpie.Core/GraphicsCaptureFrameSource.h b/src/Magpie.Core/GraphicsCaptureFrameSource.h index 528537ba1..1a9a7ab6c 100644 --- a/src/Magpie.Core/GraphicsCaptureFrameSource.h +++ b/src/Magpie.Core/GraphicsCaptureFrameSource.h @@ -19,7 +19,7 @@ class GraphicsCaptureFrameSource final : public FrameSourceBase { return "Graphics Capture"; } - void OnCursorVisibilityChanged(bool isVisible) noexcept override; + void OnCursorVisibilityChanged(bool isVisible, bool onDestory) noexcept override; protected: bool _HasRoundCornerInWin11() noexcept override { diff --git a/src/Magpie.Core/Renderer.cpp b/src/Magpie.Core/Renderer.cpp index 5a55f7b88..7c8944621 100644 --- a/src/Magpie.Core/Renderer.cpp +++ b/src/Magpie.Core/Renderer.cpp @@ -153,9 +153,9 @@ static bool CheckMultiplaneOverlaySupport(IDXGISwapChain4* swapChain) noexcept { return output2->SupportsOverlays(); } -void Renderer::OnCursorVisibilityChanged(bool isVisible) { - _backendThreadDispatcher.TryEnqueue([this, isVisible]() { - _frameSource->OnCursorVisibilityChanged(isVisible); +void Renderer::OnCursorVisibilityChanged(bool isVisible, bool onDestory) { + _backendThreadDispatcher.TryEnqueue([this, isVisible, onDestory]() { + _frameSource->OnCursorVisibilityChanged(isVisible, onDestory); }); } diff --git a/src/Magpie.Core/Renderer.h b/src/Magpie.Core/Renderer.h index 036141c97..4f757de3e 100644 --- a/src/Magpie.Core/Renderer.h +++ b/src/Magpie.Core/Renderer.h @@ -40,7 +40,7 @@ class Renderer { return *_frameSource; } - void OnCursorVisibilityChanged(bool isVisible); + void OnCursorVisibilityChanged(bool isVisible, bool onDestory); void MessageHandler(UINT msg, WPARAM wParam, LPARAM lParam) noexcept; From 1de35ab9da72c6f9bdb8e1a3f662dfe9919fa10e Mon Sep 17 00:00:00 2001 From: Xu <34770031+Blinue@users.noreply.github.com> Date: Tue, 26 Mar 2024 19:27:58 +0800 Subject: [PATCH 140/155] =?UTF-8?q?=E7=AE=80=E5=8C=96=20ScalingRuntime=20?= =?UTF-8?q?=E7=8A=B6=E6=80=81=20(#862)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * refactor: 简化 ScalingRuntime * fix: 修复特定情况下退出时死锁的问题 --- src/Magpie.App/ScalingService.cpp | 24 ++++------- src/Magpie.App/ScalingService.h | 2 +- src/Magpie.Core/ScalingRuntime.cpp | 68 ++++++++++++++++++++++-------- src/Magpie.Core/ScalingRuntime.h | 15 ++++--- src/Magpie.Core/ScalingWindow.cpp | 4 +- 5 files changed, 72 insertions(+), 41 deletions(-) diff --git a/src/Magpie.App/ScalingService.cpp b/src/Magpie.App/ScalingService.cpp index b9d5bfc71..a74297f66 100644 --- a/src/Magpie.App/ScalingService.cpp +++ b/src/Magpie.App/ScalingService.cpp @@ -190,12 +190,8 @@ fire_and_forget ScalingService::_CheckForegroundTimer_Tick(ThreadPoolTimer const _hwndChecked = hwndFore; } -void ScalingService::_Settings_IsAutoRestoreChanged(bool) { - if (AppSettings::Get().IsAutoRestore()) { - // 立即生效,即使正处于缩放状态 - _hwndCurSrc = _scalingRuntime->HwndSrc(); - } else { - _hwndCurSrc = NULL; +void ScalingService::_Settings_IsAutoRestoreChanged(bool value) { + if (!value) { _WndToRestore(NULL); } } @@ -209,21 +205,18 @@ fire_and_forget ScalingService::_ScalingRuntime_IsRunningChanged(bool isRunning) if (AppSettings::Get().IsAutoRestore()) { _WndToRestore(NULL); } - - _hwndCurSrc = _scalingRuntime->HwndSrc(); } else { - HWND curSrcWnd = _hwndCurSrc; - _hwndCurSrc = NULL; - - if (GetForegroundWindow() == curSrcWnd) { + if (GetForegroundWindow() == _hwndCurSrc) { // 退出全屏后如果前台窗口不变视为通过热键退出 - _hwndChecked = curSrcWnd; + _hwndChecked = _hwndCurSrc; } else if (!_isAutoScaling && AppSettings::Get().IsAutoRestore()) { - if (_CheckSrcWnd(curSrcWnd)) { - _WndToRestore(curSrcWnd); + if (_CheckSrcWnd(_hwndCurSrc)) { + _WndToRestore(_hwndCurSrc); } } + _hwndCurSrc = NULL; + // 立即检查前台窗口 _CheckForegroundTimer_Tick(nullptr); } @@ -314,6 +307,7 @@ bool ScalingService::_StartScale(HWND hWnd, const Profile& profile) { _isAutoScaling = profile.isAutoScale; _scalingRuntime->Start(hWnd, std::move(options)); + _hwndCurSrc = hWnd; return true; } diff --git a/src/Magpie.App/ScalingService.h b/src/Magpie.App/ScalingService.h index bc390719f..22078cfdc 100644 --- a/src/Magpie.App/ScalingService.h +++ b/src/Magpie.App/ScalingService.h @@ -120,7 +120,7 @@ class ScalingService { fire_and_forget _CheckForegroundTimer_Tick(Threading::ThreadPoolTimer const& timer); - void _Settings_IsAutoRestoreChanged(bool); + void _Settings_IsAutoRestoreChanged(bool value); fire_and_forget _ScalingRuntime_IsRunningChanged(bool isRunning); diff --git a/src/Magpie.Core/ScalingRuntime.cpp b/src/Magpie.Core/ScalingRuntime.cpp index 6c0c15f63..0e7f005d7 100644 --- a/src/Magpie.Core/ScalingRuntime.cpp +++ b/src/Magpie.Core/ScalingRuntime.cpp @@ -6,32 +6,62 @@ namespace Magpie::Core { -ScalingRuntime::ScalingRuntime() : _scalingThread(std::bind(&ScalingRuntime::_ScalingThreadProc, this)) { +ScalingRuntime::ScalingRuntime() : + _scalingThread(std::bind(&ScalingRuntime::_ScalingThreadProc, this)) { } ScalingRuntime::~ScalingRuntime() { Stop(); if (_scalingThread.joinable()) { - const DWORD magWndThreadId = GetThreadId(_scalingThread.native_handle()); - // 持续尝试直到 _scalingThread 创建了消息队列 - while (!PostThreadMessage(magWndThreadId, WM_QUIT, 0, 0)) { - Sleep(0); + const HANDLE hScalingThread = _scalingThread.native_handle(); + + { + const DWORD magWndThreadId = GetThreadId(hScalingThread); + // 持续尝试直到 _scalingThread 创建了消息队列 + while (!PostThreadMessage(magWndThreadId, WM_QUIT, 0, 0)) { + Sleep(0); + } + } + + // 等待缩放线程退出,在此期间必须处理消息队列,否则缩放线程调用 + // SetWindowLongPtr 会导致死锁 + while (true) { + MSG msg; + while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { + TranslateMessage(&msg); + DispatchMessage(&msg); + } + + if (MsgWaitForMultipleObjectsEx(1, &hScalingThread, + INFINITE, QS_ALLINPUT, MWMO_INPUTAVAILABLE) == WAIT_OBJECT_0) { + // WAIT_OBJECT_0 表示缩放线程已退出 + // WAIT_OBJECT_0 + 1 表示有新消息 + break; + } } + _scalingThread.join(); } } void ScalingRuntime::Start(HWND hwndSrc, ScalingOptions&& options) { - HWND expected = NULL; - if (!_hwndSrc.compare_exchange_strong(expected, hwndSrc, std::memory_order_relaxed)) { + _State expected = _State::Idle; + if (!_state.compare_exchange_strong( + expected, _State::Initializing, std::memory_order_relaxed)) { return; } _isRunningChangedEvent(true); - _Dispatcher().TryEnqueue([dispatcher(_Dispatcher()), hwndSrc, options(std::move(options))]() mutable { - ScalingWindow::Get().Create(dispatcher, hwndSrc, std::move(options)); + _Dispatcher().TryEnqueue([this, dispatcher(_Dispatcher()), hwndSrc, options(std::move(options))]() mutable { + if (ScalingWindow::Get().Create(dispatcher, hwndSrc, std::move(options))) { + _state.store(_State::Scaling, std::memory_order_relaxed); + } else { + // 缩放失败 + _state.store(_State::Idle, std::memory_order_relaxed); + _isRunningChangedEvent(false); + } }); } @@ -53,6 +83,7 @@ void ScalingRuntime::Stop() { } _Dispatcher().TryEnqueue([]() { + // 消息循环会更改 _state ScalingWindow& scalingWindow = ScalingWindow::Get(); if (scalingWindow.IsSrcRepositioning()) { scalingWindow.CleanAfterSrcRepositioned(); @@ -123,8 +154,8 @@ void ScalingRuntime::_ScalingThreadProc() noexcept { while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { if (msg.message == WM_QUIT) { scalingWindow.Destroy(); - - if (_hwndSrc.exchange(NULL, std::memory_order_relaxed)) { + + if (_state.exchange(_State::Idle, std::memory_order_relaxed) != _State::Idle) { _isRunningChangedEvent(false); } @@ -134,12 +165,17 @@ void ScalingRuntime::_ScalingThreadProc() noexcept { DispatchMessage(&msg); } + if (_state.load(std::memory_order_relaxed) != _State::Scaling) { + WaitMessage(); + continue; + } + if (scalingWindow) { scalingWindow.Render(); MsgWaitForMultipleObjectsEx(0, nullptr, 1, QS_ALLINPUT, MWMO_INPUTAVAILABLE); } else if (scalingWindow.IsSrcRepositioning()) { const int state = GetSrcRepositionState( - _hwndSrc.load(std::memory_order_relaxed), + scalingWindow.HwndSrc(), scalingWindow.Options().IsAllowScalingMaximized() ); if (state == 0) { @@ -153,11 +189,9 @@ void ScalingRuntime::_ScalingThreadProc() noexcept { ScalingWindow::Get().CleanAfterSrcRepositioned(); } } else { - if (_hwndSrc.exchange(NULL, std::memory_order_relaxed)) { - // 缩放失败或立即退出缩放 - _isRunningChangedEvent(false); - } - WaitMessage(); + // 缩放结束 + _state.store(_State::Idle, std::memory_order_relaxed); + _isRunningChangedEvent(false); } } } diff --git a/src/Magpie.Core/ScalingRuntime.h b/src/Magpie.Core/ScalingRuntime.h index 3384727d0..a8fa4a121 100644 --- a/src/Magpie.Core/ScalingRuntime.h +++ b/src/Magpie.Core/ScalingRuntime.h @@ -11,10 +11,6 @@ class ScalingRuntime { ScalingRuntime(); ~ScalingRuntime(); - HWND HwndSrc() const { - return _hwndSrc.load(std::memory_order_relaxed); - } - void Start(HWND hwndSrc, struct ScalingOptions&& options); void ToggleOverlay(); @@ -22,7 +18,7 @@ class ScalingRuntime { void Stop(); bool IsRunning() const noexcept { - return HwndSrc(); + return _state.load(std::memory_order_relaxed) != _State::Idle; } // 调用者应处理线程同步 @@ -47,8 +43,13 @@ class ScalingRuntime { // 确保 _dispatcher 完成初始化 const winrt::DispatcherQueue& _Dispatcher() noexcept; - // 主线程使用 DispatcherQueue 和缩放线程沟通,因此无需约束内存定序,只需确保原子性即可 - std::atomic _hwndSrc; + enum class _State { + Idle, + Initializing, + Scaling + }; + std::atomic<_State> _state{ _State::Idle }; + winrt::event> _isRunningChangedEvent; winrt::DispatcherQueue _dispatcher{ nullptr }; diff --git a/src/Magpie.Core/ScalingWindow.cpp b/src/Magpie.Core/ScalingWindow.cpp index aa44068cd..793e6072e 100644 --- a/src/Magpie.Core/ScalingWindow.cpp +++ b/src/Magpie.Core/ScalingWindow.cpp @@ -279,7 +279,9 @@ void ScalingWindow::Render() noexcept { } void ScalingWindow::ToggleOverlay() noexcept { - _renderer->SetOverlayVisibility(!_renderer->IsOverlayVisible()); + if (_renderer) { + _renderer->SetOverlayVisibility(!_renderer->IsOverlayVisible()); + } } void ScalingWindow::RecreateAfterSrcRepositioned() noexcept { From c24f6289b28757769bf055a64a74d37828abbcb1 Mon Sep 17 00:00:00 2001 From: Xu <34770031+Blinue@users.noreply.github.com> Date: Tue, 26 Mar 2024 20:44:08 +0800 Subject: [PATCH 141/155] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E5=BF=98?= =?UTF-8?q?=E8=AE=B0=E9=87=8A=E6=94=BE=E9=94=AE=E7=9B=98=E9=92=A9=E5=AD=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Magpie.Core/Renderer.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/Magpie.Core/Renderer.cpp b/src/Magpie.Core/Renderer.cpp index 7c8944621..e62d2d862 100644 --- a/src/Magpie.Core/Renderer.cpp +++ b/src/Magpie.Core/Renderer.cpp @@ -24,6 +24,10 @@ namespace Magpie::Core { Renderer::Renderer() noexcept {} Renderer::~Renderer() noexcept { + if (_hKeyboardHook) { + UnhookWindowsHookEx(_hKeyboardHook); + } + if (_backendThread.joinable()) { DWORD backendThreadId = GetThreadId(_backendThread.native_handle()); // 持续尝试直到 _backendThread 创建了消息队列 From b167cd1d092f8e60863e577a710c7abef6a8e552 Mon Sep 17 00:00:00 2001 From: Xu <34770031+Blinue@users.noreply.github.com> Date: Thu, 28 Mar 2024 20:59:44 +0800 Subject: [PATCH 142/155] =?UTF-8?q?=E4=BC=98=E5=8C=96=E7=AA=97=E5=8F=A3?= =?UTF-8?q?=E8=BE=B9=E6=A1=86=E7=9A=84=E8=A3=81=E5=89=AA=20(#864)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: 优化对最大化窗口的支持 * feat: 捕捉标题栏时去除边框 * feat: 非最大化的窗口自动裁剪上边框 * perf: 性能优化 * fix: 错误修复 * fix: 修复警告 * fix: 尝试修复 Graphics Capture 的捕获区域 * feat: 适配 Win11 的捕获区域 * fix: 添加检查 --- .../DesktopDuplicationFrameSource.cpp | 64 +++++---- src/Magpie.Core/FrameSourceBase.cpp | 129 +++++++++++++++--- .../GraphicsCaptureFrameSource.cpp | 105 ++++++++++---- src/Magpie.Core/ScalingWindow.cpp | 95 +++++++------ src/Magpie/XamlWindow.h | 35 +++-- src/Shared/Win32Utils.cpp | 36 ++++- src/Shared/Win32Utils.h | 14 +- 7 files changed, 338 insertions(+), 140 deletions(-) diff --git a/src/Magpie.Core/DesktopDuplicationFrameSource.cpp b/src/Magpie.Core/DesktopDuplicationFrameSource.cpp index 05e1344f0..67c8fdab7 100644 --- a/src/Magpie.Core/DesktopDuplicationFrameSource.cpp +++ b/src/Magpie.Core/DesktopDuplicationFrameSource.cpp @@ -57,23 +57,44 @@ bool DesktopDuplicationFrameSource::_Initialize() noexcept { return false; } - MONITORINFO mi{}; - mi.cbSize = sizeof(mi); - if (!GetMonitorInfo(hMonitor, &mi)) { - Logger::Get().Win32Error("GetMonitorInfo 失败"); - return false; - } + { + MONITORINFO mi{ .cbSize = sizeof(mi) }; + if (!GetMonitorInfo(hMonitor, &mi)) { + Logger::Get().Win32Error("GetMonitorInfo 失败"); + return false; + } - if (!_CenterWindowIfNecessary(hwndSrc, mi.rcWork)) { - Logger::Get().Error("居中源窗口失败"); - return false; - } + // 最大化的窗口无需调整位置 + if (Win32Utils::GetWindowShowCmd(hwndSrc) != SW_SHOWMAXIMIZED) { + if (!_CenterWindowIfNecessary(hwndSrc, mi.rcWork)) { + Logger::Get().Error("居中源窗口失败"); + return false; + } + } - if (!_CalcSrcRect()) { - Logger::Get().Error("_CalcSrcRect 失败"); - return false; + if (!_CalcSrcRect()) { + Logger::Get().Error("_CalcSrcRect 失败"); + return false; + } + + // 计算源窗口客户区在该屏幕上的位置,用于计算新帧是否有更新 + _srcClientInMonitor = { + _srcRect.left - mi.rcMonitor.left, + _srcRect.top - mi.rcMonitor.top, + _srcRect.right - mi.rcMonitor.left, + _srcRect.bottom - mi.rcMonitor.top + }; } + _frameInMonitor = { + (UINT)_srcClientInMonitor.left, + (UINT)_srcClientInMonitor.top, + 0, + (UINT)_srcClientInMonitor.right, + (UINT)_srcClientInMonitor.bottom, + 1 + }; + _output = DirectXHelper::CreateTexture2D( _deviceResources->GetD3DDevice(), DXGI_FORMAT_B8G8R8A8_UNORM, @@ -138,23 +159,6 @@ bool DesktopDuplicationFrameSource::_Initialize() noexcept { return false; } - // 计算源窗口客户区在该屏幕上的位置,用于计算新帧是否有更新 - _srcClientInMonitor = { - _srcRect.left - mi.rcMonitor.left, - _srcRect.top - mi.rcMonitor.top, - _srcRect.right - mi.rcMonitor.left, - _srcRect.bottom - mi.rcMonitor.top - }; - - _frameInMonitor = { - (UINT)_srcClientInMonitor.left, - (UINT)_srcClientInMonitor.top, - 0, - (UINT)_srcClientInMonitor.right, - (UINT)_srcClientInMonitor.bottom, - 1 - }; - // 使全屏窗口无法被捕获到 if (!SetWindowDisplayAffinity(ScalingWindow::Get().Handle(), WDA_EXCLUDEFROMCAPTURE)) { Logger::Get().Win32Error("SetWindowDisplayAffinity 失败"); diff --git a/src/Magpie.Core/FrameSourceBase.cpp b/src/Magpie.Core/FrameSourceBase.cpp index d6630862f..65ea0c349 100644 --- a/src/Magpie.Core/FrameSourceBase.cpp +++ b/src/Magpie.Core/FrameSourceBase.cpp @@ -228,7 +228,7 @@ static BOOL CALLBACK EnumChildProc( return TRUE; } -static HWND FindClientWindowOfUWP(HWND hwndSrc, const wchar_t* clientWndClassName) { +static HWND FindClientWindowOfUWP(HWND hwndSrc, const wchar_t* clientWndClassName) noexcept { // 查找所有窗口类名为 ApplicationFrameInputSinkWindow 的子窗口 // 该子窗口一般为客户区 EnumChildWndParam param{}; @@ -262,34 +262,121 @@ static HWND FindClientWindowOfUWP(HWND hwndSrc, const wchar_t* clientWndClassNam return param.childWindows[maxIdx]; } +static bool GetClientRectOfUWP(HWND hWnd, RECT& rect) noexcept { + std::wstring className = Win32Utils::GetWndClassName(hWnd); + if (className != L"ApplicationFrameWindow" && className != L"Windows.UI.Core.CoreWindow") { + return false; + } + + // 客户区窗口类名为 ApplicationFrameInputSinkWindow + HWND hwndClient = FindClientWindowOfUWP(hWnd, L"ApplicationFrameInputSinkWindow"); + if (!hwndClient) { + return false; + } + + if (!Win32Utils::GetClientScreenRect(hwndClient, rect)) { + Logger::Get().Win32Error("GetClientScreenRect 失败"); + return false; + } + + return true; +} + +// 获取窗口上边框高度,不适用于最大化的窗口 +static uint32_t GetTopBorderHeight(HWND hWnd, const RECT& clientRect, const RECT& windowRect) noexcept { + // 检查该窗口是否禁用了非客户区域的绘制 + BOOL hasBorder = TRUE; + HRESULT hr = DwmGetWindowAttribute(hWnd, DWMWA_NCRENDERING_ENABLED, &hasBorder, sizeof(hasBorder)); + if (FAILED(hr)) { + Logger::Get().ComError("DwmGetWindowAttribute 失败", hr); + return 0; + } + + if (!hasBorder) { + return 0; + } + + // 如果左右下三边均存在边框,那么应视为存在上边框: + // * Win10 中窗口很可能绘制了假的上边框,这是很常见的创建无边框窗口的方法 + // * Win11 中 DWM 会将上边框绘制到客户区 + if (windowRect.top == clientRect.top && (windowRect.left == clientRect.left || + windowRect.right == clientRect.right || windowRect.bottom == clientRect.bottom)) { + return 0; + } + + if (Win32Utils::GetOSVersion().IsWin11()) { + uint32_t borderThickness = 0; + hr = DwmGetWindowAttribute(hWnd, DWMWA_VISIBLE_FRAME_BORDER_THICKNESS, &borderThickness, sizeof(borderThickness)); + if (FAILED(hr)) { + Logger::Get().ComError("DwmGetWindowAttribute 失败", hr); + return 0; + } + + return borderThickness; + } else { + return 1; + } +} + bool FrameSourceBase::_CalcSrcRect() noexcept { const ScalingOptions& options = ScalingWindow::Get().Options(); const HWND hwndSrc = ScalingWindow::Get().HwndSrc(); if (options.IsCaptureTitleBar() && _CanCaptureTitleBar()) { - HRESULT hr = DwmGetWindowAttribute(hwndSrc, - DWMWA_EXTENDED_FRAME_BOUNDS, &_srcRect, sizeof(_srcRect)); - if (FAILED(hr)) { - Logger::Get().ComError("DwmGetWindowAttribute 失败", hr); + if (!Win32Utils::GetWindowFrameRect(hwndSrc, _srcRect)) { + Logger::Get().Error("GetWindowFrameRect 失败"); + return false; + } + + RECT clientRect; + if (!Win32Utils::GetClientScreenRect(hwndSrc, clientRect)) { + Logger::Get().Win32Error("GetClientScreenRect 失败"); + return false; + } + + // 左右下三边裁剪至客户区 + _srcRect.left = std::max(_srcRect.left, clientRect.left); + _srcRect.right = std::min(_srcRect.right, clientRect.right); + _srcRect.bottom = std::min(_srcRect.bottom, clientRect.bottom); + + if (Win32Utils::GetWindowShowCmd(hwndSrc) == SW_SHOWNORMAL) { + // 裁剪上边框 + RECT windowRect; + if (!GetWindowRect(hwndSrc, &windowRect)) { + Logger::Get().Win32Error("GetWindowRect 失败"); + return false; + } + _srcRect.top += GetTopBorderHeight(hwndSrc, clientRect, windowRect); } } else { - std::wstring className = Win32Utils::GetWndClassName(hwndSrc); - if (className == L"ApplicationFrameWindow" || className == L"Windows.UI.Core.CoreWindow") { - // "Modern App" - // 客户区窗口类名为 ApplicationFrameInputSinkWindow - HWND hwndClient = FindClientWindowOfUWP(hwndSrc, L"ApplicationFrameInputSinkWindow"); - if (hwndClient) { - if (!Win32Utils::GetClientScreenRect(hwndClient, _srcRect)) { - Logger::Get().Win32Error("GetClientScreenRect 失败"); - } + if (!GetClientRectOfUWP(hwndSrc, _srcRect)) { + if (!Win32Utils::GetClientScreenRect(hwndSrc, _srcRect)) { + Logger::Get().Error("GetClientScreenRect 失败"); + return false; } } - } + + if (Win32Utils::GetWindowShowCmd(hwndSrc) == SW_SHOWMAXIMIZED) { + // 最大化的窗口可能有一部分客户区在屏幕外面 + HMONITOR hMon = MonitorFromWindow(hwndSrc, MONITOR_DEFAULTTONEAREST); + MONITORINFO mi{ .cbSize = sizeof(mi) }; + if (!GetMonitorInfo(hMon, &mi)) { + Logger::Get().Win32Error("GetMonitorInfo 失败"); + return false; + } - if (_srcRect == RECT{}) { - if (!Win32Utils::GetClientScreenRect(hwndSrc, _srcRect)) { - Logger::Get().Win32Error("GetClientScreenRect 失败"); - return false; + IntersectRect(&_srcRect, &_srcRect, &mi.rcWork); + } else { + RECT windowRect; + if (!GetWindowRect(hwndSrc, &windowRect)) { + Logger::Get().Win32Error("GetWindowRect 失败"); + return false; + } + + // 如果上边框在客户区内,则裁剪上边框 + if (windowRect.top == _srcRect.top) { + _srcRect.top += GetTopBorderHeight(hwndSrc, _srcRect, windowRect); + } } } @@ -386,8 +473,8 @@ bool FrameSourceBase::_GetMapToOriginDPI(HWND hWnd, double& a, double& bx, doubl bool FrameSourceBase::_CenterWindowIfNecessary(HWND hWnd, const RECT& rcWork) noexcept { RECT srcRect; - if (!GetWindowRect(hWnd, &srcRect)) { - Logger::Get().Win32Error("GetWindowRect 失败"); + if (!Win32Utils::GetWindowFrameRect(hWnd, srcRect)) { + Logger::Get().Error("GetWindowFrameRect 失败"); return false; } diff --git a/src/Magpie.Core/GraphicsCaptureFrameSource.cpp b/src/Magpie.Core/GraphicsCaptureFrameSource.cpp index 8c8e2ddd2..8a66f2fb7 100644 --- a/src/Magpie.Core/GraphicsCaptureFrameSource.cpp +++ b/src/Magpie.Core/GraphicsCaptureFrameSource.cpp @@ -126,34 +126,90 @@ void GraphicsCaptureFrameSource::OnCursorVisibilityChanged(bool isVisible, bool // 显示光标时必须重启捕获 if (isVisible) { _StopCapture(); - SystemParametersInfo(SPI_SETCURSORS, 0, nullptr, 0); - - if (!onDestory) { + + if (onDestory) { + // FIXME: 这里尝试修复拖动窗口时光标不显示的问题,但有些环境下不起作用 + SystemParametersInfo(SPI_SETCURSORS, 0, nullptr, 0); + } else { _StartCapture(); } } } -bool GraphicsCaptureFrameSource::_CaptureWindow(IGraphicsCaptureItemInterop* interop) noexcept { - const HWND hwndSrc = ScalingWindow::Get().HwndSrc(); +// Graphics Capture 的捕获区域没有文档记录,这里的计算是我实验了多种窗口后得出的, +// 高度依赖实现细节,未来可能会失效 +static bool CalcWindowCapturedFrameBounds(HWND hWnd, RECT& rect) noexcept { + // Win10 中捕获区域为 extended frame bounds;Win11 中 DwmGetWindowAttribute + // 对最大化的窗口返回值和 Win10 不同,可能是 OS 的 bug,应进一步处理 + HRESULT hr = DwmGetWindowAttribute(hWnd, + DWMWA_EXTENDED_FRAME_BOUNDS, &rect, sizeof(rect)); + if (FAILED(hr)) { + Logger::Get().ComError("DwmGetWindowAttribute 失败", hr); + return false; + } + + if(!Win32Utils::GetOSVersion().IsWin11() || Win32Utils::GetWindowShowCmd(hWnd) != SW_SHOWMAXIMIZED) { + return true; + } - // 包含边框的窗口尺寸 - RECT srcFrameBounds{}; - HRESULT hr = DwmGetWindowAttribute(hwndSrc, - DWMWA_EXTENDED_FRAME_BOUNDS, &srcFrameBounds, sizeof(srcFrameBounds)); + // 如果窗口禁用了非客户区域绘制则捕获区域为 extended frame bounds + BOOL hasBorder = TRUE; + hr = DwmGetWindowAttribute(hWnd, DWMWA_NCRENDERING_ENABLED, &hasBorder, sizeof(hasBorder)); if (FAILED(hr)) { Logger::Get().ComError("DwmGetWindowAttribute 失败", hr); return false; } + if (!hasBorder) { + return true; + } + + RECT clientRect; + if (!Win32Utils::GetClientScreenRect(hWnd, clientRect)) { + Logger::Get().Error("GetClientScreenRect 失败"); + return false; + } + + // 有些窗口最大化后有部分客户区在屏幕外,如 UWP 和资源管理器,它们的捕获区域 + // 是整个客户区。否则捕获区域不会超出屏幕 + HMONITOR hMon = MonitorFromWindow(hWnd, MONITOR_DEFAULTTONEAREST); + MONITORINFO mi{ .cbSize = sizeof(mi) }; + if (!GetMonitorInfo(hMon, &mi)) { + Logger::Get().Win32Error("GetMonitorInfo 失败"); + return false; + } + + if (clientRect.top < mi.rcWork.top) { + rect = clientRect; + } else { + IntersectRect(&rect, &rect, &mi.rcWork); + } + + return true; +} + +bool GraphicsCaptureFrameSource::_CaptureWindow(IGraphicsCaptureItemInterop* interop) noexcept { + const HWND hwndSrc = ScalingWindow::Get().HwndSrc(); + + RECT frameBounds; + if (!CalcWindowCapturedFrameBounds(hwndSrc, frameBounds)) { + Logger::Get().Error("CalcWindowCapturedFrameBounds 失败"); + return false; + } + + if (_srcRect.left <= frameBounds.left || _srcRect.top <= frameBounds.top) { + Logger::Get().Error("裁剪边框错误"); + return false; + } + // 在源窗口存在 DPI 缩放时有时会有一像素的偏移(取决于窗口在屏幕上的位置) // 可能是 DwmGetWindowAttribute 的 bug _frameBox = { - UINT(_srcRect.left - srcFrameBounds.left), - UINT(_srcRect.top - srcFrameBounds.top), + UINT(_srcRect.left - frameBounds.left), + UINT(_srcRect.top - frameBounds.top), 0, - UINT(_srcRect.right - srcFrameBounds.left), - UINT(_srcRect.bottom - srcFrameBounds.top), + UINT(_srcRect.right - frameBounds.left), + UINT(_srcRect.bottom - frameBounds.top), 1 }; @@ -181,7 +237,7 @@ bool GraphicsCaptureFrameSource::_CaptureWindow(IGraphicsCaptureItemInterop* int // 如果窗口使用 ITaskbarList 隐藏了任务栏图标也不会出现在 Alt+Tab 列表。这种情况很罕见 _taskbarList = winrt::try_create_instance(CLSID_TaskbarList); if (_taskbarList && SUCCEEDED(_taskbarList->HrInit())) { - hr = _taskbarList->AddTab(hwndSrc); + HRESULT hr = _taskbarList->AddTab(hwndSrc); if (SUCCEEDED(hr)) { Logger::Get().Info("已添加任务栏图标"); @@ -301,16 +357,19 @@ bool GraphicsCaptureFrameSource::_CaptureMonitor(IGraphicsCaptureItemInterop* in return false; } - // 放在屏幕左上角而不是中间可以提高帧率,这里是为了和 DesktopDuplication 保持一致 - if (!_CenterWindowIfNecessary(hwndSrc, mi.rcWork)) { - Logger::Get().Error("居中源窗口失败"); - return false; - } + // 最大化的窗口无需调整位置 + if (Win32Utils::GetWindowShowCmd(hwndSrc) != SW_SHOWMAXIMIZED) { + // 放在屏幕左上角而不是中间可以提高帧率,这里是为了和 DesktopDuplication 保持一致 + if (!_CenterWindowIfNecessary(hwndSrc, mi.rcWork)) { + Logger::Get().Error("居中源窗口失败"); + return false; + } - // 重新计算捕获位置 - if (!_CalcSrcRect()) { - Logger::Get().Error("_CalcSrcRect 失败"); - return false; + // 重新计算捕获位置 + if (!_CalcSrcRect()) { + Logger::Get().Error("_CalcSrcRect 失败"); + return false; + } } _frameBox = { diff --git a/src/Magpie.Core/ScalingWindow.cpp b/src/Magpie.Core/ScalingWindow.cpp index 793e6072e..0998d541f 100644 --- a/src/Magpie.Core/ScalingWindow.cpp +++ b/src/Magpie.Core/ScalingWindow.cpp @@ -43,43 +43,54 @@ static uint32_t CalcWndRect(HWND hWnd, MultiMonitorUsage multiMonitorUsage, RECT { // 使用源窗口跨越的所有显示器 - // [0] 存储源窗口坐标,[1] 存储计算结果 - struct MonitorEnumParam { - RECT srcRect; - RECT destRect; - uint32_t monitorCount; - } param{}; - - HRESULT hr = DwmGetWindowAttribute(hWnd, - DWMWA_EXTENDED_FRAME_BOUNDS, ¶m.srcRect, sizeof(param.srcRect)); - if (FAILED(hr)) { - Logger::Get().ComError("DwmGetWindowAttribute 失败", hr); - return 0; - } - - MONITORENUMPROC monitorEnumProc = [](HMONITOR, HDC, LPRECT monitorRect, LPARAM data) { - MonitorEnumParam* param = (MonitorEnumParam*)data; + if (Win32Utils::GetWindowShowCmd(hWnd) == SW_SHOWMAXIMIZED) { + // 最大化的窗口不能跨越屏幕 + HMONITOR hMon = MonitorFromWindow(hWnd, MONITOR_DEFAULTTONEAREST); + MONITORINFO mi{ .cbSize = sizeof(mi) }; + if (!GetMonitorInfo(hMon, &mi)) { + Logger::Get().Win32Error("GetMonitorInfo 失败"); + return 0; + } - if (Win32Utils::CheckOverlap(param->srcRect, *monitorRect)) { - UnionRect(¶m->destRect, monitorRect, ¶m->destRect); - ++param->monitorCount; + result = mi.rcMonitor; + return 1; + } else { + // [0] 存储源窗口坐标,[1] 存储计算结果 + struct MonitorEnumParam { + RECT srcRect; + RECT destRect; + uint32_t monitorCount; + } param{}; + + if (!Win32Utils::GetWindowFrameRect(hWnd, param.srcRect)) { + Logger::Get().Error("GetWindowFrameRect 失败"); + return 0; } - return TRUE; - }; + MONITORENUMPROC monitorEnumProc = [](HMONITOR, HDC, LPRECT monitorRect, LPARAM data) { + MonitorEnumParam* param = (MonitorEnumParam*)data; - if (!EnumDisplayMonitors(NULL, NULL, monitorEnumProc, (LPARAM)¶m)) { - Logger::Get().Win32Error("EnumDisplayMonitors 失败"); - return 0; - } + if (Win32Utils::CheckOverlap(param->srcRect, *monitorRect)) { + UnionRect(¶m->destRect, monitorRect, ¶m->destRect); + ++param->monitorCount; + } - result = param.destRect; - if (result.right - result.left <= 0 || result.bottom - result.top <= 0) { - Logger::Get().Error("计算缩放窗口坐标失败"); - return 0; - } + return TRUE; + }; + + if (!EnumDisplayMonitors(NULL, NULL, monitorEnumProc, (LPARAM)¶m)) { + Logger::Get().Win32Error("EnumDisplayMonitors 失败"); + return 0; + } + + result = param.destRect; + if (result.right - result.left <= 0 || result.bottom - result.top <= 0) { + Logger::Get().Error("计算缩放窗口坐标失败"); + return 0; + } - return param.monitorCount; + return param.monitorCount; + } } case MultiMonitorUsage::All: { @@ -431,20 +442,20 @@ bool ScalingWindow::_CheckForeground(HWND hwndForeground) const noexcept { return true; } - RECT rectForground{}; - HRESULT hr = DwmGetWindowAttribute(hwndForeground, - DWMWA_EXTENDED_FRAME_BOUNDS, &rectForground, sizeof(rectForground)); - if (FAILED(hr)) { - Logger::Get().ComError("DwmGetWindowAttribute 失败", hr); + RECT rectForground; + if (!Win32Utils::GetWindowFrameRect(hwndForeground, rectForground)) { + Logger::Get().Error("DwmGetWindowAttribute 失败"); return false; } + + if (!IntersectRect(&rectForground, &rectForground, &_wndRect)) { + // 没有重叠 + return true; + } - RECT scalingWndRect; - GetWindowRect(_hWnd, &scalingWndRect); - IntersectRect(&rectForground, &scalingWndRect, &rectForground); - - // 允许稍微重叠,否则前台窗口最大化时会意外退出 - return rectForground.right - rectForground.left < 10 || rectForground.right - rectForground.top < 10; + // 允许稍微重叠,减少意外停止缩放的机率 + SIZE rectSize = Win32Utils::GetSizeOfRect(rectForground); + return rectSize.cx < 8 || rectSize.cy < 8; } bool ScalingWindow::_DisableDirectFlip(HINSTANCE hInstance) noexcept { diff --git a/src/Magpie/XamlWindow.h b/src/Magpie/XamlWindow.h index 0f0a0d4d9..d1db58fc9 100644 --- a/src/Magpie/XamlWindow.h +++ b/src/Magpie/XamlWindow.h @@ -5,6 +5,7 @@ #include "Win32Utils.h" #include "ThemeHelper.h" #include "CommonSharedConstants.h" +#include "Logger.h" #pragma comment(lib, "uxtheme.lib") @@ -152,7 +153,7 @@ class XamlWindowT { switch (msg) { case WM_CREATE: { - _currentDpi = GetDpiForWindow(_hWnd); + _UpdateDpi(GetDpiForWindow(_hWnd)); if (!Win32Utils::GetOSVersion().IsWin11()) { // 初始化双缓冲绘图 @@ -336,7 +337,7 @@ class XamlWindowT { } case WM_DPICHANGED: { - _currentDpi = HIWORD(wParam); + _UpdateDpi(HIWORD(wParam)); RECT* newRect = (RECT*)lParam; SetWindowPos(_hWnd, @@ -449,16 +450,7 @@ class XamlWindowT { uint32_t _GetTopBorderHeight() const noexcept { // 最大化时没有上边框 - if (_isMaximized) { - return 0; - } - - // Win10 中窗口边框始终只有一个像素宽,Win11 中的窗口边框宽度和 DPI 缩放有关 - if (Win32Utils::GetOSVersion().IsWin11()) { - return (_currentDpi + USER_DEFAULT_SCREEN_DPI / 2) / USER_DEFAULT_SCREEN_DPI; - } else { - return 1; - } + return _isMaximized ? 0 : _nativeTopBorderHeight; } int _GetResizeHandleHeight() const noexcept { @@ -533,6 +525,23 @@ class XamlWindowT { DwmExtendFrameIntoClientArea(_hWnd, &margins); } + void _UpdateDpi(uint32_t dpi) noexcept { + _currentDpi = dpi; + + // Win10 中窗口边框始终只有一个像素宽,Win11 中的窗口边框宽度和 DPI 缩放有关 + if (Win32Utils::GetOSVersion().IsWin11()) { + HRESULT hr = DwmGetWindowAttribute( + _hWnd, + DWMWA_VISIBLE_FRAME_BORDER_THICKNESS, + &_nativeTopBorderHeight, + sizeof(_nativeTopBorderHeight) + ); + if (FAILED(hr)) { + Logger::Get().ComError("DwmGetWindowAttribute 失败", hr); + } + } + } + winrt::event> _destroyedEvent; HWND _hWnd = NULL; @@ -543,6 +552,8 @@ class XamlWindowT { C _content{ nullptr }; uint32_t _currentDpi = USER_DEFAULT_SCREEN_DPI; + uint32_t _nativeTopBorderHeight = 1; + bool _isDarkTheme = false; bool _isWindowShown = false; bool _isMaximized = false; diff --git a/src/Shared/Win32Utils.cpp b/src/Shared/Win32Utils.cpp index 1049bbf75..e6e0c56f5 100644 --- a/src/Shared/Win32Utils.cpp +++ b/src/Shared/Win32Utils.cpp @@ -8,7 +8,7 @@ #include #include -std::wstring Win32Utils::GetWndClassName(HWND hWnd) { +std::wstring Win32Utils::GetWndClassName(HWND hWnd) noexcept { // 窗口类名最多 256 个字符 std::wstring className(256, 0); int num = GetClassName(hWnd, &className[0], (int)className.size() + 1); @@ -21,7 +21,7 @@ std::wstring Win32Utils::GetWndClassName(HWND hWnd) { return className; } -std::wstring Win32Utils::GetWndTitle(HWND hWnd) { +std::wstring Win32Utils::GetWndTitle(HWND hWnd) noexcept { int len = GetWindowTextLength(hWnd); if (len == 0) { return {}; @@ -33,7 +33,7 @@ std::wstring Win32Utils::GetWndTitle(HWND hWnd) { return title; } -std::wstring Win32Utils::GetPathOfWnd(HWND hWnd) { +std::wstring Win32Utils::GetPathOfWnd(HWND hWnd) noexcept { ScopedHandle hProc; DWORD dwProcId = 0; @@ -73,7 +73,7 @@ std::wstring Win32Utils::GetPathOfWnd(HWND hWnd) { return fileName; } -UINT Win32Utils::GetWindowShowCmd(HWND hWnd) { +UINT Win32Utils::GetWindowShowCmd(HWND hWnd) noexcept { assert(hWnd != NULL); WINDOWPLACEMENT wp{}; @@ -85,7 +85,7 @@ UINT Win32Utils::GetWindowShowCmd(HWND hWnd) { return wp.showCmd; } -bool Win32Utils::GetClientScreenRect(HWND hWnd, RECT& rect) { +bool Win32Utils::GetClientScreenRect(HWND hWnd, RECT& rect) noexcept { if (!GetClientRect(hWnd, &rect)) { Logger::Get().Win32Error("GetClientRect 出错"); return false; @@ -105,7 +105,31 @@ bool Win32Utils::GetClientScreenRect(HWND hWnd, RECT& rect) { return true; } -bool Win32Utils::ReadFile(const wchar_t* fileName, std::vector& result) { +bool Win32Utils::GetWindowFrameRect(HWND hWnd, RECT& rect) noexcept { + HRESULT hr = DwmGetWindowAttribute(hWnd, + DWMWA_EXTENDED_FRAME_BOUNDS, &rect, sizeof(rect)); + if (FAILED(hr)) { + Logger::Get().ComError("DwmGetWindowAttribute 失败", hr); + return false; + } + + // Win11 中最大化的窗口的 extended frame bounds 有一部分在屏幕外面, + // 不清楚 Win10 是否有这种情况 + if (GetWindowShowCmd(hWnd) == SW_SHOWMAXIMIZED) { + HMONITOR hMon = MonitorFromWindow(hWnd, MONITOR_DEFAULTTONEAREST); + MONITORINFO mi{ .cbSize = sizeof(mi) }; + if (!GetMonitorInfo(hMon, &mi)) { + Logger::Get().Win32Error("GetMonitorInfo 失败"); + return false; + } + + IntersectRect(&rect, &rect, &mi.rcWork); + } + + return true; +} + +bool Win32Utils::ReadFile(const wchar_t* fileName, std::vector& result) noexcept { Logger::Get().Info(StrUtils::Concat("读取文件:", StrUtils::UTF16ToUTF8(fileName))); CREATEFILE2_EXTENDED_PARAMETERS extendedParams = {}; diff --git a/src/Shared/Win32Utils.h b/src/Shared/Win32Utils.h index 72e423fa6..b45bbf263 100644 --- a/src/Shared/Win32Utils.h +++ b/src/Shared/Win32Utils.h @@ -10,17 +10,19 @@ struct Win32Utils { return r1.right > r2.left && r1.bottom > r2.top && r1.left < r2.right&& r1.top < r2.bottom; } - static std::wstring GetWndClassName(HWND hWnd); + static std::wstring GetWndClassName(HWND hWnd) noexcept; - static std::wstring GetWndTitle(HWND hWnd); + static std::wstring GetWndTitle(HWND hWnd) noexcept; - static std::wstring GetPathOfWnd(HWND hWnd); + static std::wstring GetPathOfWnd(HWND hWnd) noexcept; - static UINT GetWindowShowCmd(HWND hWnd); + static UINT GetWindowShowCmd(HWND hWnd) noexcept; - static bool GetClientScreenRect(HWND hWnd, RECT& rect); + static bool GetClientScreenRect(HWND hWnd, RECT& rect) noexcept; - static bool ReadFile(const wchar_t* fileName, std::vector& result); + static bool GetWindowFrameRect(HWND hWnd, RECT& rect) noexcept; + + static bool ReadFile(const wchar_t* fileName, std::vector& result) noexcept; static bool ReadTextFile(const wchar_t* fileName, std::string& result) noexcept; From 6f0e5ea33dbd2e835c9c3a530dd01831ae2b101a Mon Sep 17 00:00:00 2001 From: Xu <34770031+Blinue@users.noreply.github.com> Date: Thu, 28 Mar 2024 21:17:09 +0800 Subject: [PATCH 143/155] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E6=97=A0?= =?UTF-8?q?=E6=B3=95=E7=BC=A9=E6=94=BE=E5=85=A8=E5=B1=8F=E7=AA=97=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Magpie.Core/GraphicsCaptureFrameSource.cpp | 2 +- src/Magpie.Core/ScalingWindow.cpp | 14 +++++++++----- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/src/Magpie.Core/GraphicsCaptureFrameSource.cpp b/src/Magpie.Core/GraphicsCaptureFrameSource.cpp index 8a66f2fb7..bc0077f07 100644 --- a/src/Magpie.Core/GraphicsCaptureFrameSource.cpp +++ b/src/Magpie.Core/GraphicsCaptureFrameSource.cpp @@ -197,7 +197,7 @@ bool GraphicsCaptureFrameSource::_CaptureWindow(IGraphicsCaptureItemInterop* int return false; } - if (_srcRect.left <= frameBounds.left || _srcRect.top <= frameBounds.top) { + if (_srcRect.left < frameBounds.left || _srcRect.top < frameBounds.top) { Logger::Get().Error("裁剪边框错误"); return false; } diff --git a/src/Magpie.Core/ScalingWindow.cpp b/src/Magpie.Core/ScalingWindow.cpp index 0998d541f..7d4f17925 100644 --- a/src/Magpie.Core/ScalingWindow.cpp +++ b/src/Magpie.Core/ScalingWindow.cpp @@ -144,12 +144,16 @@ bool ScalingWindow::Create( } if (!_options.IsAllowScalingMaximized()) { + if (Win32Utils::GetWindowShowCmd(_hwndSrc) == SW_SHOWMAXIMIZED) { + Logger::Get().Info("源窗口已最大化"); + return false; + } + // 源窗口和缩放窗口重合则不缩放,此时源窗口可能是无边框全屏窗口 - RECT srcRect{}; - HRESULT hr = DwmGetWindowAttribute(_hwndSrc, - DWMWA_EXTENDED_FRAME_BOUNDS, &srcRect, sizeof(srcRect)); - if (FAILED(hr)) { - Win32Utils::GetClientScreenRect(_hwndSrc, srcRect); + RECT srcRect; + if (!Win32Utils::GetWindowFrameRect(_hwndSrc, srcRect)) { + Logger::Get().Error("GetWindowFrameRect 失败"); + return false; } if (srcRect == _wndRect) { From 197d80eb298c506fa0dd603fbe4af6cf18acdd35 Mon Sep 17 00:00:00 2001 From: Xu <34770031+Blinue@users.noreply.github.com> Date: Fri, 29 Mar 2024 22:44:56 +0800 Subject: [PATCH 144/155] =?UTF-8?q?=E6=94=AF=E6=8C=81=E9=9D=9E=E7=9F=A9?= =?UTF-8?q?=E5=BD=A2=E7=AA=97=E5=8F=A3=EF=BC=8C=E4=BB=A5=E5=8F=8A=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E9=BC=A0=E6=A0=87=E8=A1=8C=E4=B8=BA=20(#865)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: 支持自定义形状窗口,修复对原生标题栏的支持 * fix: 优化鼠标行为 * chore: 删除不必要的调用 * fix: 修复开始和退出缩放时光标位置变化 * chore: 微小调整 * chore: 添加注释 --- src/Magpie.App/NewProfileViewModel.cpp | 15 +- src/Magpie.Core/CursorManager.cpp | 181 +++++++++++++------------ src/Magpie.Core/CursorManager.h | 5 +- src/Shared/Win32Utils.cpp | 29 ++++ src/Shared/Win32Utils.h | 2 + 5 files changed, 130 insertions(+), 102 deletions(-) diff --git a/src/Magpie.App/NewProfileViewModel.cpp b/src/Magpie.App/NewProfileViewModel.cpp index 6b75eaec1..d4cf009dd 100644 --- a/src/Magpie.App/NewProfileViewModel.cpp +++ b/src/Magpie.App/NewProfileViewModel.cpp @@ -12,21 +12,8 @@ namespace winrt::Magpie::App::implementation { -// 检查窗口是否可见应查看整个所有者链 -static bool IsWindowAndOwnerVisible(HWND hWnd) noexcept { - do { - if (!IsWindowVisible(hWnd)) { - return false; - } - - hWnd = GetWindowOwner(hWnd); - } while (hWnd); - - return true; -} - static bool IsCandidateWindow(HWND hWnd) noexcept { - if (!IsWindowAndOwnerVisible(hWnd)) { + if (!Win32Utils::IsWindowVisible(hWnd)) { return false; } diff --git a/src/Magpie.Core/CursorManager.cpp b/src/Magpie.Core/CursorManager.cpp index af452fa55..50d0b5859 100644 --- a/src/Magpie.Core/CursorManager.cpp +++ b/src/Magpie.Core/CursorManager.cpp @@ -63,7 +63,7 @@ static POINT ScalingToSrc(POINT pt) noexcept { } if (pt.y >= destRect.bottom) { - result.y += srcSize.cx + pt.y - destRect.bottom; + result.y += srcSize.cy + pt.y - destRect.bottom; } else if (pt.y < destRect.top) { result.y += pt.y - destRect.top; } else { @@ -81,17 +81,16 @@ CursorManager::~CursorManager() noexcept { _ShowSystemCursor(true, true); - if (_curClips != RECT{}) { - ClipCursor(nullptr); - } + ClipCursor(nullptr); if (_isUnderCapture) { - POINT pt{}; - if (!GetCursorPos(&pt)) { + POINT cursorPos; + if (!GetCursorPos(&cursorPos)) { Logger::Get().Win32Error("GetCursorPos 失败"); } - _curClips = {}; - _StopCapture(pt, true); + + _StopCapture(cursorPos, true); + SetCursorPos(cursorPos.x, cursorPos.y); } } @@ -104,6 +103,7 @@ bool CursorManager::Initialize() noexcept { POINT cursorPos; GetCursorPos(&cursorPos); _StartCapture(cursorPos); + SetCursorPos(cursorPos.x, cursorPos.y); _shouldDrawCursor = true; _ShowSystemCursor(false); @@ -278,40 +278,62 @@ static HWND WindowFromPoint(HWND hwndScaling, const RECT& scalingWndRect, POINT } // 跳过不可见的窗口 - if (!(GetWindowLongPtr(hWnd, GWL_STYLE) & WS_VISIBLE)) { + if (!Win32Utils::IsWindowVisible(hWnd)) { return TRUE; } // 跳过透明窗口 - if (GetWindowLongPtr(hWnd, GWL_EXSTYLE) & WS_EX_TRANSPARENT) { + const LONG_PTR exStyle = GetWindowLongPtr(hWnd, GWL_EXSTYLE); + if (exStyle & WS_EX_TRANSPARENT) { return TRUE; } // 跳过被冻结的窗口 - UINT isCloaked{}; - DwmGetWindowAttribute(hWnd, DWMWA_CLOAKED, &isCloaked, sizeof(isCloaked)); - if (isCloaked != 0) { + { + UINT isCloaked = 0; + HRESULT hr = DwmGetWindowAttribute(hWnd, DWMWA_CLOAKED, &isCloaked, sizeof(isCloaked)); + if (SUCCEEDED(hr) && isCloaked) { + return TRUE; + } + } + + // 检查光标是否在窗口内 + RECT windowRect; + if (!GetWindowRect(hWnd, &windowRect) || !PtInRect(&windowRect, data.pt)) { return TRUE; } - // 对于分层窗口(Layered Window),没有公开的 API 可以检测某个像素是否透明。 - // ChildWindowFromPointEx 是一个替代方案,当命中透明像素时它将返回 NULL。 - // Windows 内部有 LayerHitTest (https://github.com/tongzx/nt5src/blob/daad8a087a4e75422ec96b7911f1df4669989611/Source/XPSP1/NT/windows/core/ntuser/kernel/winwhere.c#L21) 方法用于对分层窗口执行命中测试,虽然它没有被公开,但 ChildWindowFromPointEx 使用了它 - // 在比 Magpie 权限更高的窗口上使用会失败,失败则假设不是分层窗口 - POINT clientPt = data.pt; - ScreenToClient(hWnd, &clientPt); - SetLastError(0); - if (!ChildWindowFromPointEx(hWnd, clientPt, CWP_SKIPDISABLED | CWP_SKIPINVISIBLE | CWP_SKIPTRANSPARENT)) { - if (GetLastError() == 0) { - // 命中了透明像素 - return TRUE; + // 检查使用 SetWindowRgn 自定义形状的窗口 + { + static HRGN hRgn = CreateRectRgn(0, 0, 0, 0); + int regionType = GetWindowRgn(hWnd, hRgn); + if (regionType == SIMPLEREGION || regionType == COMPLEXREGION) { + if (!PtInRegion(hRgn, data.pt.x - windowRect.left, data.pt.y - windowRect.top)) { + return TRUE; + } } + } - // 源窗口的权限比 Magpie 更高,回落到 GetWindowRect - RECT windowRect{}; - if (!GetWindowRect(hWnd, &windowRect) || !PtInRect(&windowRect, data.pt)) { + // 检查分层窗口 (layered window) 的透明区域 + if (exStyle & WS_EX_LAYERED) { + RECT clientRect; + if (!Win32Utils::GetClientScreenRect(hWnd, clientRect)) { return TRUE; } + + // 分层窗口只有客户区允许透明区域 + if (PtInRect(&clientRect, data.pt)) { + // 没有公开的 API 可以检测分层窗口的某个像素是否透明。ChildWindowFromPointEx 是 + // 一个替代方案,当命中透明像素时它将返回 NULL。 + // Windows 内部有 LayerHitTest方法用于对分层窗口执行命中测试,虽然它没有被公开, + // 但 ChildWindowFromPointEx 使用了它。 + // 见 https://github.com/tongzx/nt5src/blob/daad8a087a4e75422ec96b7911f1df4669989611/Source/XPSP1/NT/windows/core/ntuser/kernel/winwhere.c#L21 + POINT clientPt{ data.pt.x - clientRect.left, data.pt.y - clientRect.top }; + if (!ChildWindowFromPointEx(hWnd, clientPt, CWP_SKIPINVISIBLE | CWP_SKIPTRANSPARENT)) { + // 命中了透明像素或失败 + return TRUE; + } + } } data.result = hWnd; @@ -335,10 +357,8 @@ void CursorManager::_UpdateCursorClip() noexcept { if (options.IsDebugMode()) { if (_isCapturedOnOverlay) { // 光标被叠加层捕获时将光标限制在输出区域内 - _curClips = destRect; ClipCursor(&destRect); - } else if (_curClips != RECT{}) { - _curClips = {}; + } else { ClipCursor(nullptr); } @@ -347,14 +367,12 @@ void CursorManager::_UpdateCursorClip() noexcept { if (options.Is3DGameMode()) { // 开启“在 3D 游戏中限制光标”则每帧都限制一次光标 - _curClips = srcRect; ClipCursor(&srcRect); return; } if (_isCapturedOnOverlay) { // 光标被叠加层捕获时将光标限制在输出区域内 - _curClips = destRect; ClipCursor(&destRect); return; } @@ -371,6 +389,8 @@ void CursorManager::_UpdateCursorClip() noexcept { return; } + const POINT originCursorPos = cursorPos; + if (_isUnderCapture) { /////////////////////////////////////////////////////////// // @@ -460,7 +480,7 @@ void CursorManager::_UpdateCursorClip() noexcept { if (!(style & WS_EX_TRANSPARENT)) { SetWindowLongPtr(hwndScaling, GWL_EXSTYLE, style | WS_EX_TRANSPARENT); } - + _StartCapture(cursorPos); } else { if (style | WS_EX_TRANSPARENT) { @@ -484,14 +504,10 @@ void CursorManager::_UpdateCursorClip() noexcept { cursorPos.y -= destRect.top - scalingRect.top; } - if (MonitorFromPoint(cursorPos, MONITOR_DEFAULTTONULL)) { - SetCursorPos(cursorPos.x, cursorPos.y); - } else { + if (!MonitorFromPoint(cursorPos, MONITOR_DEFAULTTONULL)) { // 目标位置不存在屏幕,则将光标限制在输出区域内 - SetCursorPos( - std::clamp(cursorPos.x, destRect.left, destRect.right - 1), - std::clamp(cursorPos.y, destRect.top, destRect.bottom - 1) - ); + cursorPos.x = std::clamp(cursorPos.x, destRect.left, destRect.right - 1); + cursorPos.y = std::clamp(cursorPos.y, destRect.top, destRect.bottom - 1); } } else { // 从外部移到内部 @@ -521,49 +537,50 @@ void CursorManager::_UpdateCursorClip() noexcept { // 即使当前并未捕获光标也是如此。 _ShowSystemCursor(!_shouldDrawCursor); - if (!_isUnderCapture && !_isOnOverlay) { - return; - } + if (_shouldDrawCursor) { + // 根据当前光标位置的四个方向有无屏幕来确定应该在哪些方向限制光标,但这无法 + // 处理屏幕之间存在间隙的情况。解决办法是 _StopCapture 只在目标位置存在屏幕时才取消捕获, + // 当光标试图移动到间隙中时将被挡住。如果光标的速度足以跨越间隙,则它依然可以在屏幕间移动。 + POINT hostPos = _isUnderCapture ? SrcToScaling(cursorPos) : cursorPos; - // 根据当前光标位置的四个方向有无屏幕来确定应该在哪些方向限制光标,但这无法 - // 处理屏幕之间存在间隙的情况。解决办法是 _StopCapture 只在目标位置存在屏幕时才取消捕获, - // 当光标试图移动到间隙中时将被挡住。如果光标的速度足以跨越间隙,则它依然可以在屏幕间移动。 - ::GetCursorPos(&cursorPos); - POINT hostPos = _isOnOverlay ? cursorPos : SrcToScaling(cursorPos); + RECT clips{ LONG_MIN, LONG_MIN, LONG_MAX, LONG_MAX }; - RECT clips{ LONG_MIN, LONG_MIN, LONG_MAX, LONG_MAX }; + // left + RECT rect{ LONG_MIN, hostPos.y, scalingRect.left, hostPos.y + 1 }; + if (!MonitorFromRect(&rect, MONITOR_DEFAULTTONULL)) { + clips.left = _isUnderCapture ? srcRect.left : destRect.left; + } - // left - RECT rect{ LONG_MIN, hostPos.y, scalingRect.left, hostPos.y + 1 }; - if (!MonitorFromRect(&rect, MONITOR_DEFAULTTONULL)) { - clips.left = _isOnOverlay ? destRect.left : srcRect.left; - } + // top + rect = { hostPos.x, LONG_MIN, hostPos.x + 1, scalingRect.top }; + if (!MonitorFromRect(&rect, MONITOR_DEFAULTTONULL)) { + clips.top = _isUnderCapture ? srcRect.top : destRect.top; + } - // top - rect = { hostPos.x, LONG_MIN, hostPos.x + 1,scalingRect.top }; - if (!MonitorFromRect(&rect, MONITOR_DEFAULTTONULL)) { - clips.top = _isOnOverlay ? destRect.top : srcRect.top; - } + // right + rect = { scalingRect.right, hostPos.y, LONG_MAX, hostPos.y + 1 }; + if (!MonitorFromRect(&rect, MONITOR_DEFAULTTONULL)) { + clips.right = _isUnderCapture ? srcRect.right : destRect.right; + } - // right - rect = { scalingRect.right, hostPos.y, LONG_MAX, hostPos.y + 1 }; - if (!MonitorFromRect(&rect, MONITOR_DEFAULTTONULL)) { - clips.right = _isOnOverlay ? destRect.right : srcRect.right; - } + // bottom + rect = { hostPos.x, scalingRect.bottom, hostPos.x + 1, LONG_MAX }; + if (!MonitorFromRect(&rect, MONITOR_DEFAULTTONULL)) { + clips.bottom = _isUnderCapture ? srcRect.bottom : destRect.bottom; + } - // bottom - rect = { hostPos.x, scalingRect.bottom, hostPos.x + 1, LONG_MAX }; - if (!MonitorFromRect(&rect, MONITOR_DEFAULTTONULL)) { - clips.bottom = _isOnOverlay ? destRect.bottom : srcRect.bottom; + ClipCursor(&clips); + } else { + ClipCursor(nullptr); } - if (clips != _curClips) { - _curClips = clips; - ClipCursor(&clips); + // SetCursorPos 应在 ClipCursor 之后,否则会受到上一次 ClipCursor 的影响 + if (cursorPos != originCursorPos) { + SetCursorPos(cursorPos.x, cursorPos.y); } } -void CursorManager::_StartCapture(POINT cursorPos) noexcept { +void CursorManager::_StartCapture(POINT& cursorPos) noexcept { if (_isUnderCapture) { return; } @@ -595,22 +612,16 @@ void CursorManager::_StartCapture(POINT cursorPos) noexcept { cursorPos.x = std::clamp(cursorPos.x, destRect.left, destRect.right - 1); cursorPos.y = std::clamp(cursorPos.y, destRect.top, destRect.bottom - 1); - POINT newCursorPos = ScalingToSrc(cursorPos); - SetCursorPos(newCursorPos.x, newCursorPos.y); + cursorPos = ScalingToSrc(cursorPos); _isUnderCapture = true; } -bool CursorManager::_StopCapture(POINT cursorPos, bool onDestroy) noexcept { +bool CursorManager::_StopCapture(POINT& cursorPos, bool onDestroy) noexcept { if (!_isUnderCapture) { return true; } - if (_curClips != RECT{}) { - _curClips = {}; - ClipCursor(nullptr); - } - // 在以下情况下离开捕获状态: // 1. 当前处于捕获状态 // 2. 光标离开源窗口客户区 @@ -625,7 +636,7 @@ bool CursorManager::_StopCapture(POINT cursorPos, bool onDestroy) noexcept { POINT newCursorPos = SrcToScaling(cursorPos); if (onDestroy || MonitorFromPoint(newCursorPos, MONITOR_DEFAULTTONULL)) { - SetCursorPos(newCursorPos.x, newCursorPos.y); + cursorPos = newCursorPos; if (ScalingWindow::Get().Options().IsAdjustCursorSpeed()) { SystemParametersInfo(SPI_SETMOUSESPEED, 0, (PVOID)(intptr_t)_originCursorSpeed, 0); @@ -636,10 +647,10 @@ bool CursorManager::_StopCapture(POINT cursorPos, bool onDestroy) noexcept { } else { // 目标位置不存在屏幕,则将光标限制在源窗口内 const RECT& srcRect = ScalingWindow::Get().Renderer().SrcRect(); - SetCursorPos( - std::clamp(cursorPos.x, srcRect.left, srcRect.right - 1), - std::clamp(cursorPos.y, srcRect.top, srcRect.bottom - 1) - ); + + cursorPos.x = std::clamp(cursorPos.x, srcRect.left, srcRect.right - 1); + cursorPos.y = std::clamp(cursorPos.y, srcRect.top, srcRect.bottom - 1); + return false; } } diff --git a/src/Magpie.Core/CursorManager.h b/src/Magpie.Core/CursorManager.h index 4c2f54245..f8b3b9dd0 100644 --- a/src/Magpie.Core/CursorManager.h +++ b/src/Magpie.Core/CursorManager.h @@ -40,14 +40,13 @@ class CursorManager { void _UpdateCursorClip() noexcept; - void _StartCapture(POINT cursorPos) noexcept; + void _StartCapture(POINT& cursorPos) noexcept; - bool _StopCapture(POINT cursorPos, bool onDestroy = false) noexcept; + bool _StopCapture(POINT& cursorPos, bool onDestroy = false) noexcept; HCURSOR _hCursor = NULL; POINT _cursorPos { std::numeric_limits::max(),std::numeric_limits::max() }; - RECT _curClips{}; int _originCursorSpeed = 0; bool _isUnderCapture = false; diff --git a/src/Shared/Win32Utils.cpp b/src/Shared/Win32Utils.cpp index e6e0c56f5..0c0fdf080 100644 --- a/src/Shared/Win32Utils.cpp +++ b/src/Shared/Win32Utils.cpp @@ -126,6 +126,35 @@ bool Win32Utils::GetWindowFrameRect(HWND hWnd, RECT& rect) noexcept { IntersectRect(&rect, &rect, &mi.rcWork); } + // 对于使用 SetWindowRgn 自定义形状的窗口,裁剪到最小矩形边框 + RECT rgnRect; + int regionType = GetWindowRgnBox(hWnd, &rgnRect); + if (regionType == SIMPLEREGION || regionType == COMPLEXREGION) { + RECT windowRect; + if (!GetWindowRect(hWnd, &windowRect)) { + Logger::Get().Win32Error("GetWindowRect 失败"); + return false; + } + + // 转换为屏幕坐标 + OffsetRect(&rgnRect, windowRect.left, windowRect.top); + + IntersectRect(&rect, &rect, &rgnRect); + } + + return true; +} + +bool Win32Utils::IsWindowVisible(HWND hWnd) noexcept { + // 检查窗口是否可见应查看整个所有者链 + do { + if (!::IsWindowVisible(hWnd)) { + return false; + } + + hWnd = GetWindowOwner(hWnd); + } while (hWnd); + return true; } diff --git a/src/Shared/Win32Utils.h b/src/Shared/Win32Utils.h index b45bbf263..451cba0d1 100644 --- a/src/Shared/Win32Utils.h +++ b/src/Shared/Win32Utils.h @@ -22,6 +22,8 @@ struct Win32Utils { static bool GetWindowFrameRect(HWND hWnd, RECT& rect) noexcept; + static bool IsWindowVisible(HWND hWnd) noexcept; + static bool ReadFile(const wchar_t* fileName, std::vector& result) noexcept; static bool ReadTextFile(const wchar_t* fileName, std::string& result) noexcept; From fc544230eca935004e346934fc58dbd2e7fa6418 Mon Sep 17 00:00:00 2001 From: Xu <34770031+Blinue@users.noreply.github.com> Date: Sat, 30 Mar 2024 19:52:10 +0800 Subject: [PATCH 145/155] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=85=89=E6=A0=87?= =?UTF-8?q?=E7=A7=BB=E5=8A=A8=E5=88=B0=E5=8F=A0=E5=8A=A0=E5=B1=82=E6=88=96?= =?UTF-8?q?=E5=85=B6=E4=BB=96=E7=AA=97=E5=8F=A3=E6=97=B6=E6=9C=89=E6=97=B6?= =?UTF-8?q?=E4=BC=9A=E8=B7=B3=E8=B7=83=E7=9A=84=E9=97=AE=E9=A2=98=20(#866)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix: 修复鼠标移动到叠加层或其他窗口时有时会跳跃的问题 * perf: 性能优化 --- src/Magpie.Core/CursorManager.cpp | 66 ++++++++++++++++++++++++++----- src/Magpie.Core/ScalingWindow.cpp | 4 +- src/Magpie.Core/ScalingWindow.h | 1 + 3 files changed, 60 insertions(+), 11 deletions(-) diff --git a/src/Magpie.Core/CursorManager.cpp b/src/Magpie.Core/CursorManager.cpp index 50d0b5859..71af3e2fb 100644 --- a/src/Magpie.Core/CursorManager.cpp +++ b/src/Magpie.Core/CursorManager.cpp @@ -74,6 +74,52 @@ static POINT ScalingToSrc(POINT pt) noexcept { return result; } +// SetCursorPos 无法可靠移动光标,虽然调用之后立刻查询光标位置没有问题,但经过一 +// 段时间后再次查询会发现光标位置又回到了设置之前。这可能是因为 OS 异步处理硬件输 +// 入队列,SetCursorPos 时队列中仍有旧事件尚未处理。 +// 这个函数使用 SendInput 将移动光标事件插入输入队列,然后等待系统处理到该事件, +// 避免了并发问题。如果设置不成功则多次尝试。这里旨在尽最大努力,我怀疑是否有完美 +// 的解决方案。 +static void ReliableSetCursorPos(POINT pos) noexcept { + const int screenWidth = GetSystemMetrics(SM_CXVIRTUALSCREEN); + const int screenHeight = GetSystemMetrics(SM_CYVIRTUALSCREEN); + + INPUT input{ + .type = INPUT_MOUSE, + .mi{ + .dx = (pos.x * 65535) / (screenWidth - 1), + .dy = (pos.y * 65535) / (screenHeight - 1), + .dwFlags = MOUSEEVENTF_MOVE | MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_VIRTUALDESK + } + }; + + // 如果设置不成功则多次尝试 + for (int i = 0; i < 10; ++i) { + if (!SendInput(1, &input, sizeof(input))) { + Logger::Get().Win32Error("SendInput 失败"); + break; + } + + // 等待系统处理 + Sleep(0); + + POINT curCursorPos; + if (!GetCursorPos(&curCursorPos)) { + Logger::Get().Win32Error("GetCursorPos 失败"); + break; + } + + if (curCursorPos == pos) { + // 已设置成功,但保险起见再设置一次 + SendInput(1, &input, sizeof(input)); + return; + } + } + + // 回落到 SetCursorPos + SetCursorPos(pos.x, pos.y); +} + CursorManager::~CursorManager() noexcept { if (_isCapturedOnOverlay) { ReleaseCapture(); @@ -90,7 +136,7 @@ CursorManager::~CursorManager() noexcept { } _StopCapture(cursorPos, true); - SetCursorPos(cursorPos.x, cursorPos.y); + ReliableSetCursorPos(cursorPos); } } @@ -103,7 +149,7 @@ bool CursorManager::Initialize() noexcept { POINT cursorPos; GetCursorPos(&cursorPos); _StartCapture(cursorPos); - SetCursorPos(cursorPos.x, cursorPos.y); + ReliableSetCursorPos(cursorPos); _shouldDrawCursor = true; _ShowSystemCursor(false); @@ -288,7 +334,13 @@ static HWND WindowFromPoint(HWND hwndScaling, const RECT& scalingWndRect, POINT return TRUE; } - // 跳过被冻结的窗口 + // 检查光标是否在窗口内 + RECT windowRect; + if (!GetWindowRect(hWnd, &windowRect) || !PtInRect(&windowRect, data.pt)) { + return TRUE; + } + + // 跳过被冻结的窗口。这个调用比较耗时,因此稍晚检查 { UINT isCloaked = 0; HRESULT hr = DwmGetWindowAttribute(hWnd, DWMWA_CLOAKED, &isCloaked, sizeof(isCloaked)); @@ -297,12 +349,6 @@ static HWND WindowFromPoint(HWND hwndScaling, const RECT& scalingWndRect, POINT } } - // 检查光标是否在窗口内 - RECT windowRect; - if (!GetWindowRect(hWnd, &windowRect) || !PtInRect(&windowRect, data.pt)) { - return TRUE; - } - // 检查使用 SetWindowRgn 自定义形状的窗口 { static HRGN hRgn = CreateRectRgn(0, 0, 0, 0); @@ -576,7 +622,7 @@ void CursorManager::_UpdateCursorClip() noexcept { // SetCursorPos 应在 ClipCursor 之后,否则会受到上一次 ClipCursor 的影响 if (cursorPos != originCursorPos) { - SetCursorPos(cursorPos.x, cursorPos.y); + ReliableSetCursorPos(cursorPos); } } diff --git a/src/Magpie.Core/ScalingWindow.cpp b/src/Magpie.Core/ScalingWindow.cpp index 7d4f17925..937f3ea62 100644 --- a/src/Magpie.Core/ScalingWindow.cpp +++ b/src/Magpie.Core/ScalingWindow.cpp @@ -286,9 +286,10 @@ void ScalingWindow::Render() noexcept { _cursorManager->Update(); if (_renderer->Render()) { // 为了避免用户看到 DDF 窗口,在渲染第一帧后显示 - if (_hwndDDF && !IsWindowVisible(_hwndDDF)) { + if (_hwndDDF && !_isDDFWindowShown) { ShowWindow(_hwndDDF, SW_NORMAL); SetWindowPos(_hwndDDF, Handle(), 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_NOREDRAW); + _isDDFWindowShown = true; } } } @@ -377,6 +378,7 @@ LRESULT ScalingWindow::_MessageHandler(UINT msg, WPARAM wParam, LPARAM lParam) n if (_hwndDDF) { DestroyWindow(_hwndDDF); _hwndDDF = NULL; + _isDDFWindowShown = false; } _cursorManager.reset(); diff --git a/src/Magpie.Core/ScalingWindow.h b/src/Magpie.Core/ScalingWindow.h index 716c0c2f9..5f0827d78 100644 --- a/src/Magpie.Core/ScalingWindow.h +++ b/src/Magpie.Core/ScalingWindow.h @@ -86,6 +86,7 @@ class ScalingWindow : public WindowBase { Win32Utils::ScopedHandle _exclModeMutex; bool _isSrcRepositioning = false; + bool _isDDFWindowShown = false; }; } From 4a3f2554e803e4a01a633acb828aa77bb55565f3 Mon Sep 17 00:00:00 2001 From: Xu <34770031+Blinue@users.noreply.github.com> Date: Sat, 30 Mar 2024 19:53:01 +0800 Subject: [PATCH 146/155] =?UTF-8?q?chore:=20=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Magpie.Core/CursorManager.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Magpie.Core/CursorManager.cpp b/src/Magpie.Core/CursorManager.cpp index 71af3e2fb..2d453deca 100644 --- a/src/Magpie.Core/CursorManager.cpp +++ b/src/Magpie.Core/CursorManager.cpp @@ -110,7 +110,7 @@ static void ReliableSetCursorPos(POINT pos) noexcept { } if (curCursorPos == pos) { - // 已设置成功,但保险起见再设置一次 + // 已成功,但保险起见再设置一次 SendInput(1, &input, sizeof(input)); return; } From 77a989e63dc04bda0c19738f92911cdb92756b98 Mon Sep 17 00:00:00 2001 From: Xu <34770031+Blinue@users.noreply.github.com> Date: Sun, 31 Mar 2024 09:35:54 +0800 Subject: [PATCH 147/155] =?UTF-8?q?[fx]=20feat:=20=E4=B8=8D=E6=94=AF?= =?UTF-8?q?=E6=8C=81=20OUTPUT=20=E4=BD=9C=E4=B8=BA=E8=BE=93=E5=85=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Magpie.Core/EffectCompiler.cpp | 12 ++++++------ src/Magpie.Core/EffectDrawer.cpp | 6 +++--- src/Magpie/Magpie.vcxproj.filters | 10 +++++----- 3 files changed, 14 insertions(+), 14 deletions(-) diff --git a/src/Magpie.Core/EffectCompiler.cpp b/src/Magpie.Core/EffectCompiler.cpp index ebb0cf34a..26f960c91 100644 --- a/src/Magpie.Core/EffectCompiler.cpp +++ b/src/Magpie.Core/EffectCompiler.cpp @@ -610,14 +610,14 @@ static uint32_t ResolveTexture(std::string_view block, EffectDesc& desc) { return 1; } - if (token == "INPUT") { + if (token == desc.textures[0].name) { if (processed.any()) { return 1; } // INPUT 已为第一个元素 desc.textures.pop_back(); - } else if (token == "OUTPUT") { + } else if (token == desc.textures[1].name) { if (processed[0] || processed[1]) { return 1; } @@ -857,8 +857,8 @@ static uint32_t ResolvePasses( StrUtils::Trim(input); auto it = texNames.find(input); - if (it == texNames.end()) { - // 未找到纹理名称 + if (it == texNames.end() || it->second == 1) { + // 不支持 OUTPUT 作为输入 return 1; } @@ -878,7 +878,7 @@ static uint32_t ResolvePasses( if (i == blocks.size() - 1) { // 最后一个通道的输出只能是 OUTPUT - if (outputsStr != "OUTPUT") { + if (outputsStr != desc.textures[1].name) { return 1; } @@ -1014,7 +1014,7 @@ static uint32_t ResolvePasses( } } - // 必须指定 INPUT 和 OUTPUT + // 必须指定 IN 和 OUT if (!processed[0] || !processed[1]) { return 1; } diff --git a/src/Magpie.Core/EffectDrawer.cpp b/src/Magpie.Core/EffectDrawer.cpp index 2ccc97e64..d05e8c4bd 100644 --- a/src/Magpie.Core/EffectDrawer.cpp +++ b/src/Magpie.Core/EffectDrawer.cpp @@ -132,10 +132,10 @@ bool EffectDrawer::Initialize( _textures.resize(desc.textures.size()); _textures[0].copy_from(*inOutTexture); - // 创建输出纹理 + // 创建输出纹理,格式始终是 DXGI_FORMAT_R8G8B8A8_UNORM _textures[1] = DirectXHelper::CreateTexture2D( deviceResources.GetD3DDevice(), - DXGI_FORMAT_R8G8B8A8_UNORM, + EffectHelper::FORMAT_DESCS[(uint32_t)desc.textures[1].format].dxgiFormat, outputSize.cx, outputSize.cy, D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_UNORDERED_ACCESS @@ -167,7 +167,7 @@ bool EffectDrawer::Initialize( // 检查纹理格式是否匹配 D3D11_TEXTURE2D_DESC srcDesc{}; _textures[i]->GetDesc(&srcDesc); - if (srcDesc.Format != EffectHelper::FORMAT_DESCS[(UINT)texDesc.format].dxgiFormat) { + if (srcDesc.Format != EffectHelper::FORMAT_DESCS[(uint32_t)texDesc.format].dxgiFormat) { Logger::Get().Error("SOURCE 纹理格式不匹配"); return false; } diff --git a/src/Magpie/Magpie.vcxproj.filters b/src/Magpie/Magpie.vcxproj.filters index d9c57a68d..c5badf4d9 100644 --- a/src/Magpie/Magpie.vcxproj.filters +++ b/src/Magpie/Magpie.vcxproj.filters @@ -19,11 +19,11 @@ - - Services - + + Services + @@ -38,10 +38,10 @@ - + + Services - From 496961c08fd057f54bacd986b293ab07162d9678 Mon Sep 17 00:00:00 2001 From: Xu <34770031+Blinue@users.noreply.github.com> Date: Sun, 31 Mar 2024 12:48:29 +0800 Subject: [PATCH 148/155] =?UTF-8?q?feat:=20=E7=A6=81=E6=AD=A2=E7=BC=A9?= =?UTF-8?q?=E6=94=BE=E5=AE=8C=E6=95=B4=E6=80=A7=E7=BA=A7=E5=88=AB=E6=9B=B4?= =?UTF-8?q?=E9=AB=98=E7=9A=84=E7=AA=97=E5=8F=A3=20(#867)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Magpie.App/ScalingService.cpp | 94 ++++++++++++++++++++++--------- src/Magpie.App/ScalingService.h | 2 +- src/Shared/Win32Utils.cpp | 25 ++++++++ src/Shared/Win32Utils.h | 2 + 4 files changed, 94 insertions(+), 29 deletions(-) diff --git a/src/Magpie.App/ScalingService.cpp b/src/Magpie.App/ScalingService.cpp index a74297f66..9be94f3b7 100644 --- a/src/Magpie.App/ScalingService.cpp +++ b/src/Magpie.App/ScalingService.cpp @@ -149,7 +149,7 @@ fire_and_forget ScalingService::_CheckForegroundTimer_Tick(ThreadPoolTimer const } HWND hwndFore = GetForegroundWindow(); - if (hwndFore == _hwndChecked) { + if (!hwndFore || hwndFore == _hwndChecked) { co_return; } _hwndChecked = NULL; @@ -161,28 +161,16 @@ fire_and_forget ScalingService::_CheckForegroundTimer_Tick(ThreadPoolTimer const const bool isAutoRestore = AppSettings::Get().IsAutoRestore(); - if (_CheckSrcWnd(hwndFore)) { - const Profile& profile = ProfileService::Get().GetProfileForWindow(hwndFore); - // 先检查自动恢复全屏 - if (profile.isAutoScale) { - if (_StartScale(hwndFore, profile)) { - // 触发自动缩放时清空记忆的窗口 - if (AppSettings::Get().IsAutoRestore()) { - _WndToRestore(NULL); - } - } - - co_return; - } - - // 恢复记忆的窗口 - if (isAutoRestore && _hwndToRestore == hwndFore) { - _StartScale(hwndFore, profile); - co_return; - } + const Profile& profile = ProfileService::Get().GetProfileForWindow(hwndFore); + // 自动恢复全屏或恢复记忆的窗口 + if ((profile.isAutoScale || (isAutoRestore && _hwndToRestore == hwndFore)) && + _CheckSrcWnd(hwndFore, _hwndToRestore != hwndFore) + ) { + _StartScale(hwndFore, profile); + co_return; } - if (isAutoRestore && !_CheckSrcWnd(_hwndToRestore)) { + if (isAutoRestore && !_CheckSrcWnd(_hwndToRestore, false)) { _WndToRestore(NULL); } @@ -210,7 +198,8 @@ fire_and_forget ScalingService::_ScalingRuntime_IsRunningChanged(bool isRunning) // 退出全屏后如果前台窗口不变视为通过热键退出 _hwndChecked = _hwndCurSrc; } else if (!_isAutoScaling && AppSettings::Get().IsAutoRestore()) { - if (_CheckSrcWnd(_hwndCurSrc)) { + // 无需再次检查完整性级别 + if (_CheckSrcWnd(_hwndCurSrc, false)) { _WndToRestore(_hwndCurSrc); } } @@ -313,7 +302,7 @@ bool ScalingService::_StartScale(HWND hWnd, const Profile& profile) { void ScalingService::_ScaleForegroundWindow() { HWND hWnd = GetForegroundWindow(); - if (!_CheckSrcWnd(hWnd)) { + if (!_CheckSrcWnd(hWnd, true)) { return; } @@ -321,7 +310,34 @@ void ScalingService::_ScaleForegroundWindow() { _StartScale(hWnd, profile); } -bool ScalingService::_CheckSrcWnd(HWND hWnd) noexcept { +static bool GetWindowIntegrityLevel(HWND hWnd, DWORD& integrityLevel) noexcept { + DWORD processId; + if (!GetWindowThreadProcessId(hWnd, &processId)) { + Logger::Get().Win32Error("GetWindowThreadProcessId 失败"); + return false; + } + + Win32Utils::ScopedHandle hProc(Win32Utils::SafeHandle( + OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, FALSE, processId))); + if (!hProc) { + Logger::Get().Win32Error("OpenProcess 失败"); + return false; + } + + Win32Utils::ScopedHandle hQueryToken; + { + HANDLE token; + if (!OpenProcessToken(hProc.get(), TOKEN_QUERY, &token)) { + Logger::Get().Win32Error("OpenProcessToken 失败"); + return false; + } + hQueryToken.reset(token); + } + + return Win32Utils::GetProcessIntegrityLevel(hQueryToken.get(), integrityLevel); +} + +bool ScalingService::_CheckSrcWnd(HWND hWnd, bool checkIL) noexcept { if (!hWnd || !IsWindow(hWnd)) { return false; } @@ -338,10 +354,32 @@ bool ScalingService::_CheckSrcWnd(HWND hWnd) noexcept { } // 不缩放过小的窗口 - RECT clientRect; - GetClientRect(hWnd, &clientRect); - const SIZE clientSize = Win32Utils::GetSizeOfRect(clientRect); - return clientSize.cx >= 32 && clientSize.cy >= 32; + { + RECT clientRect; + if (!GetClientRect(hWnd, &clientRect)) { + return false; + } + + const SIZE clientSize = Win32Utils::GetSizeOfRect(clientRect); + if (clientSize.cx < 32 && clientSize.cy < 32) { + return false; + } + } + + if (checkIL) { + // 禁止缩放完整性级别 (integrity level) 更高的窗口 + static DWORD thisIL = []() -> DWORD { + DWORD il; + return Win32Utils::GetProcessIntegrityLevel(NULL, il) ? il : 0; + }(); + + DWORD windowIL; + if (!GetWindowIntegrityLevel(hWnd, windowIL) || windowIL > thisIL) { + return false; + } + } + + return true; } } diff --git a/src/Magpie.App/ScalingService.h b/src/Magpie.App/ScalingService.h index 22078cfdc..5b533c116 100644 --- a/src/Magpie.App/ScalingService.h +++ b/src/Magpie.App/ScalingService.h @@ -128,7 +128,7 @@ class ScalingService { void _ScaleForegroundWindow(); - bool _CheckSrcWnd(HWND hWnd) noexcept; + bool _CheckSrcWnd(HWND hWnd, bool checkIL) noexcept; std::unique_ptr<::Magpie::Core::ScalingRuntime> _scalingRuntime; CoreDispatcher _dispatcher{ nullptr }; diff --git a/src/Shared/Win32Utils.cpp b/src/Shared/Win32Utils.cpp index 0c0fdf080..34a8df2e2 100644 --- a/src/Shared/Win32Utils.cpp +++ b/src/Shared/Win32Utils.cpp @@ -569,6 +569,31 @@ bool Win32Utils::IsProcessElevated() noexcept { return bool(result == 1); } +// 获取进程的完整性级别 +// https://devblogs.microsoft.com/oldnewthing/20221017-00/?p=107291 +bool Win32Utils::GetProcessIntegrityLevel(HANDLE hQueryToken, DWORD& integrityLevel) noexcept { + if (!hQueryToken) { + hQueryToken = GetCurrentProcessToken(); + } + + DWORD infoSize = 0; + GetTokenInformation(hQueryToken, TokenIntegrityLevel, nullptr, 0, &infoSize); + if (infoSize == 0) { + Logger::Get().Win32Error("GetTokenInformation 失败"); + return false; + } + + std::unique_ptr infoBuffer = std::make_unique(infoSize); + if (!GetTokenInformation(hQueryToken, TokenIntegrityLevel, infoBuffer.get(), infoSize, &infoSize)) { + Logger::Get().Win32Error("GetTokenInformation 失败"); + return false; + } + + PSID sid = ((TOKEN_MANDATORY_LABEL*)infoBuffer.get())->Label.Sid; + integrityLevel = *GetSidSubAuthority(sid, *GetSidSubAuthorityCount(sid) - 1); + return true; +} + static winrt::com_ptr FindDesktopFolderView() { winrt::com_ptr shellWindows = winrt::try_create_instance(CLSID_ShellWindows, CLSCTX_LOCAL_SERVER); diff --git a/src/Shared/Win32Utils.h b/src/Shared/Win32Utils.h index 451cba0d1..b16637827 100644 --- a/src/Shared/Win32Utils.h +++ b/src/Shared/Win32Utils.h @@ -159,6 +159,8 @@ struct Win32Utils { static bool IsProcessElevated() noexcept; + static bool GetProcessIntegrityLevel(HANDLE hQueryToken, DWORD& integrityLevel) noexcept; + // VARIANT 封装,自动管理生命周期 struct Variant : public VARIANT { Variant() noexcept { From 293b3e611ec2e421b94062d7b38c0043b7cdc207 Mon Sep 17 00:00:00 2001 From: Xu <34770031+Blinue@users.noreply.github.com> Date: Sun, 31 Mar 2024 23:04:24 +0800 Subject: [PATCH 149/155] =?UTF-8?q?feat:=20=E5=BD=93=E5=89=8D=E5=8F=B0?= =?UTF-8?q?=E7=AA=97=E5=8F=A3=E6=8D=95=E8=8E=B7=E4=BA=86=E5=85=89=E6=A0=87?= =?UTF-8?q?=EF=BC=8C=E9=81=BF=E5=85=8D=E9=80=A0=E6=88=90=E5=85=89=E6=A0=87?= =?UTF-8?q?=E8=B7=B3=E8=B7=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Magpie.Core/CursorManager.cpp | 33 +++++++++++++++++++++++-------- src/Magpie.Core/CursorManager.h | 6 ++++++ src/Magpie.Core/ImGuiImpl.cpp | 17 ++++++++++------ 3 files changed, 42 insertions(+), 14 deletions(-) diff --git a/src/Magpie.Core/CursorManager.cpp b/src/Magpie.Core/CursorManager.cpp index 2d453deca..c419b598e 100644 --- a/src/Magpie.Core/CursorManager.cpp +++ b/src/Magpie.Core/CursorManager.cpp @@ -203,12 +203,6 @@ void CursorManager::IsCursorCapturedOnOverlay(bool value) noexcept { } _isCapturedOnOverlay = value; - if (value) { - SetCapture(ScalingWindow::Get().Handle()); - } else { - ReleaseCapture(); - } - _UpdateCursorClip(); } @@ -395,10 +389,33 @@ void CursorManager::_UpdateCursorClip() noexcept { const RECT& destRect = renderer.DestRect(); // 优先级: - // 1. 断点模式:不限制,不捕获,支持 UI - // 2. 在 3D 游戏中限制光标:每帧都限制一次,不退出捕获,因此无法使用 UI,不支持多屏幕 + // 1. 调试模式:不限制,不捕获 + // 2. 3D 游戏模式:每帧都限制一次,不退出捕获,不支持多屏幕 // 3. 常规:根据多屏幕限制光标,捕获/取消捕获,支持 UI 和多屏幕 + // 如果前台窗口捕获了光标,应避免在光标移入/移出缩放窗口或叠加层时跳跃。为了解决 + // 前一个问题,此时则将光标限制在前台窗口内,因此不会移出缩放窗口。为了解决后一个 + // 问题,叠加层将不会试图捕获光标。 + GUITHREADINFO info{ .cbSize = sizeof(info) }; + if (GetGUIThreadInfo(NULL, &info)) { + if (info.hwndCapture) { + _isCapturedOnForeground = true; + + // 如果光标不在缩放窗口内不应限制光标 + if (_isUnderCapture) { + ClipCursor(&srcRect); + } + + // 当光标被前台窗口捕获时我们除了限制光标外什么也不做,即光标 + // 可以在缩放窗口上自由移动 + return; + } else { + _isCapturedOnForeground = false; + } + } else { + _isCapturedOnForeground = false; + } + const ScalingOptions& options = ScalingWindow::Get().Options(); if (options.IsDebugMode()) { if (_isCapturedOnOverlay) { diff --git a/src/Magpie.Core/CursorManager.h b/src/Magpie.Core/CursorManager.h index f8b3b9dd0..d5f16fdfe 100644 --- a/src/Magpie.Core/CursorManager.h +++ b/src/Magpie.Core/CursorManager.h @@ -23,6 +23,10 @@ class CursorManager { return _cursorPos; } + bool IsCursorCapturedOnForeground() const noexcept { + return _isCapturedOnForeground; + } + bool IsCursorOnOverlay() const noexcept { return _isOnOverlay; } @@ -53,6 +57,8 @@ class CursorManager { // 当缩放后的光标位置在缩放窗口上且没有被其他窗口挡住时应绘制光标 bool _shouldDrawCursor = false; + bool _isCapturedOnForeground = false; + bool _isOnOverlay = false; bool _isCapturedOnOverlay = false; diff --git a/src/Magpie.Core/ImGuiImpl.cpp b/src/Magpie.Core/ImGuiImpl.cpp index cbb0b4d8c..b6bffa8f9 100644 --- a/src/Magpie.Core/ImGuiImpl.cpp +++ b/src/Magpie.Core/ImGuiImpl.cpp @@ -139,21 +139,26 @@ void ImGuiImpl::Tooltip(const char* content, float maxWidth) noexcept { void ImGuiImpl::_UpdateMousePos() noexcept { ImGuiIO& io = ImGui::GetIO(); + io.MousePos = ImVec2(-FLT_MAX, -FLT_MAX); + + const CursorManager& cursorManager = ScalingWindow::Get().CursorManager(); + + if (cursorManager.IsCursorCapturedOnForeground()) { + // 光标被前台窗口捕获时应避免造成光标跳跃 + return; + } - const POINT cursorPos = ScalingWindow::Get().CursorManager().CursorPos(); + const POINT cursorPos = cursorManager.CursorPos(); if (cursorPos.x == std::numeric_limits::max()) { // 无光标 - io.MousePos = ImVec2(-FLT_MAX, -FLT_MAX); return; } const RECT& scalingRect = ScalingWindow::Get().WndRect(); const RECT& destRect = ScalingWindow::Get().Renderer().DestRect(); - io.MousePos = ImVec2( - float(cursorPos.x + scalingRect.left - destRect.left), - float(cursorPos.y + scalingRect.top - destRect.top) - ); + io.MousePos.x = float(cursorPos.x + scalingRect.left - destRect.left); + io.MousePos.y = float(cursorPos.y + scalingRect.top - destRect.top); } void ImGuiImpl::ClearStates() noexcept { From 307edb9ce49d1585436061e798353470019b0238 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=97=AD?= Date: Mon, 1 Apr 2024 14:15:50 +0800 Subject: [PATCH 150/155] =?UTF-8?q?feat:=20=E4=BC=98=E5=8C=96=E6=97=A5?= =?UTF-8?q?=E5=BF=97=E8=AE=B0=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Magpie.Core/DeviceResources.cpp | 15 +--- src/Magpie.Core/Magpie.Core.vcxproj | 1 + src/Magpie.Core/Magpie.Core.vcxproj.filters | 4 +- src/Magpie.Core/Renderer.cpp | 17 +++- src/Magpie.Core/ScalingOptions.cpp | 92 +++++++++++++++++++++ src/Magpie.Core/ScalingOptions.h | 2 + src/Magpie.Core/ScalingWindow.cpp | 6 ++ 7 files changed, 121 insertions(+), 16 deletions(-) create mode 100644 src/Magpie.Core/ScalingOptions.cpp diff --git a/src/Magpie.Core/DeviceResources.cpp b/src/Magpie.Core/DeviceResources.cpp index fb576bd41..2a6db8a66 100644 --- a/src/Magpie.Core/DeviceResources.cpp +++ b/src/Magpie.Core/DeviceResources.cpp @@ -65,11 +65,6 @@ ID3D11SamplerState* DeviceResources::GetSampler(D3D11_FILTER filterMode, D3D11_T return _samMap.emplace(key, std::move(sam)).first->second.get(); } -static void LogAdapter(const DXGI_ADAPTER_DESC1& adapterDesc) noexcept { - Logger::Get().Info(fmt::format("当前图形适配器:\n\tVendorId:{:#x}\n\tDeviceId:{:#x}\n\t描述:{}", - adapterDesc.VendorId, adapterDesc.DeviceId, StrUtils::UTF16ToUTF8(adapterDesc.Description))); -} - bool DeviceResources::_ObtainAdapterAndDevice(int adapterIdx) noexcept { winrt::com_ptr adapter; @@ -82,7 +77,6 @@ bool DeviceResources::_ObtainAdapterAndDevice(int adapterIdx) noexcept { if (desc.Flags & DXGI_ADAPTER_FLAG_SOFTWARE) { Logger::Get().Warn("用户指定的显示卡为 WARP,已忽略"); } else if (_TryCreateD3DDevice(adapter)) { - LogAdapter(desc); return true; } else { Logger::Get().Warn("用户指定的显示卡不支持 FL 11"); @@ -112,7 +106,6 @@ bool DeviceResources::_ObtainAdapterAndDevice(int adapterIdx) noexcept { } if (_TryCreateD3DDevice(adapter)) { - LogAdapter(desc); return true; } } @@ -130,12 +123,6 @@ bool DeviceResources::_ObtainAdapterAndDevice(int adapterIdx) noexcept { return false; } - DXGI_ADAPTER_DESC1 desc; - hr = adapter->GetDesc1(&desc); - if (SUCCEEDED(hr)) { - LogAdapter(desc); - } - return true; } @@ -185,7 +172,7 @@ bool DeviceResources::_TryCreateD3DDevice(const winrt::com_ptr& a fl = "未知"; break; } - Logger::Get().Info(fmt::format("已创建 D3D Device\n\t功能级别:{}", fl)); + Logger::Get().Info(fmt::format("已创建 D3D 设备\n\t功能级别:{}", fl)); _d3dDevice = d3dDevice.try_as(); if (!_d3dDevice) { diff --git a/src/Magpie.Core/Magpie.Core.vcxproj b/src/Magpie.Core/Magpie.Core.vcxproj index 75d169128..fd668ec3e 100644 --- a/src/Magpie.Core/Magpie.Core.vcxproj +++ b/src/Magpie.Core/Magpie.Core.vcxproj @@ -105,6 +105,7 @@ Create + diff --git a/src/Magpie.Core/Magpie.Core.vcxproj.filters b/src/Magpie.Core/Magpie.Core.vcxproj.filters index a1ad08118..93e7efad6 100644 --- a/src/Magpie.Core/Magpie.Core.vcxproj.filters +++ b/src/Magpie.Core/Magpie.Core.vcxproj.filters @@ -64,7 +64,6 @@ - @@ -95,6 +94,7 @@ Capture + @@ -152,6 +152,8 @@ Capture + + diff --git a/src/Magpie.Core/Renderer.cpp b/src/Magpie.Core/Renderer.cpp index e62d2d862..83e938123 100644 --- a/src/Magpie.Core/Renderer.cpp +++ b/src/Magpie.Core/Renderer.cpp @@ -71,6 +71,14 @@ LRESULT CALLBACK Renderer::_LowLevelKeyboardHook(int nCode, WPARAM wParam, LPARA return CallNextHookEx(NULL, nCode, wParam, lParam); } +static void LogAdapter(IDXGIAdapter4* adapter) noexcept { + DXGI_ADAPTER_DESC1 desc; + adapter->GetDesc1(&desc); + + Logger::Get().Info(fmt::format("当前图形适配器:\n\tVendorId:{:#x}\n\tDeviceId:{:#x}\n\tDescription:{}", + desc.VendorId, desc.DeviceId, StrUtils::UTF16ToUTF8(desc.Description))); +} + bool Renderer::Initialize() noexcept { _backendThread = std::thread(std::bind(&Renderer::_BackendThreadProc, this)); @@ -79,6 +87,8 @@ bool Renderer::Initialize() noexcept { return false; } + LogAdapter(_frontendResources.GetGraphicsAdapter()); + if (!_CreateSwapChain()) { Logger::Get().Error("_CreateSwapChain 失败"); return false; @@ -421,9 +431,14 @@ bool Renderer::_InitFrameSource() noexcept { return false; } + const RECT& srcRect = _frameSource->SrcRect(); + Logger::Get().Info(fmt::format("源窗口边界: {},{},{},{}", + srcRect.left, srcRect.top, srcRect.right, srcRect.bottom)); + + // 由于 DPI 缩放,捕获尺寸和边界矩形尺寸不一定相同 D3D11_TEXTURE2D_DESC desc; _frameSource->GetOutput()->GetDesc(&desc); - Logger::Get().Info(fmt::format("源窗口尺寸:{}x{}", desc.Width, desc.Height)); + Logger::Get().Info(fmt::format("捕获尺寸: {}x{}", desc.Width, desc.Height)); return true; } diff --git a/src/Magpie.Core/ScalingOptions.cpp b/src/Magpie.Core/ScalingOptions.cpp new file mode 100644 index 000000000..a35c5c0d8 --- /dev/null +++ b/src/Magpie.Core/ScalingOptions.cpp @@ -0,0 +1,92 @@ +#include "pch.h" +#include "ScalingOptions.h" +#include "Logger.h" +#include "StrUtils.h" + +namespace Magpie::Core { + +static std::string LogParameters(const phmap::flat_hash_map& params) noexcept { + std::string result; + + if (params.empty()) { + result = "无"; + } else { + for (const auto& pair : params) { + result.append(fmt::format("\n\t\t\t\t{}: {}", StrUtils::UTF16ToUTF8(pair.first), pair.second)); + } + } + + return result; +} + +static std::string LogEffects(const std::vector& effects) noexcept { + std::string result; + for (const EffectOption& effect : effects) { + result.append(fmt::format(R"( + {} + scalingType: {} + scale: {},{} + parameters: {})", + StrUtils::UTF16ToUTF8(effect.name), + (int)effect.scalingType, + effect.scale.first, effect.scale.second, + LogParameters(effect.parameters) + )); + } + return result; +} + +void ScalingOptions::Log() const noexcept { + Logger::Get().Info(fmt::format(R"(缩放选项 + IsWindowResizingDisabled: {} + IsDebugMode: {} + IsEffectCacheDisabled: {} + IsFontCacheDisabled: {} + IsSaveEffectSources: {} + IsWarningsAreErrors: {} + IsAllowScalingMaximized: {} + IsSimulateExclusiveFullscreen: {} + Is3DGameMode: {} + IsShowFPS: {} + IsCaptureTitleBar: {} + IsAdjustCursorSpeed: {} + IsDrawCursor: {} + IsDirectFlipDisabled: {} + IsStatisticsForDynamicDetectionEnabled: {} + cropping: {},{},{},{} + graphicsCard: {} + maxFrameRate: {} + cursorScaling: {} + captureMethod: {} + multiMonitorUsage: {} + cursorInterpolationMode: {} + duplicateFrameDetectionMode: {} + effects: {})", + IsWindowResizingDisabled(), + IsDebugMode(), + IsEffectCacheDisabled(), + IsFontCacheDisabled(), + IsSaveEffectSources(), + IsWarningsAreErrors(), + IsAllowScalingMaximized(), + IsSimulateExclusiveFullscreen(), + Is3DGameMode(), + IsShowFPS(), + IsCaptureTitleBar(), + IsAdjustCursorSpeed(), + IsDrawCursor(), + IsDirectFlipDisabled(), + IsStatisticsForDynamicDetectionEnabled(), + cropping.Left, cropping.Top, cropping.Right, cropping.Bottom, + graphicsCard, + maxFrameRate.has_value() ? *maxFrameRate : 0.0f, + cursorScaling, + (int)captureMethod, + (int)multiMonitorUsage, + (int)cursorInterpolationMode, + (int)duplicateFrameDetectionMode, + LogEffects(effects) + )); +} + +} diff --git a/src/Magpie.Core/ScalingOptions.h b/src/Magpie.Core/ScalingOptions.h index 2ae61ebe3..b2af73e6a 100644 --- a/src/Magpie.Core/ScalingOptions.h +++ b/src/Magpie.Core/ScalingOptions.h @@ -106,6 +106,8 @@ struct ScalingOptions { std::vector effects; DuplicateFrameDetectionMode duplicateFrameDetectionMode = DuplicateFrameDetectionMode::Dynamic; + + void Log() const noexcept; }; } diff --git a/src/Magpie.Core/ScalingWindow.cpp b/src/Magpie.Core/ScalingWindow.cpp index 937f3ea62..ca48003e9 100644 --- a/src/Magpie.Core/ScalingWindow.cpp +++ b/src/Magpie.Core/ScalingWindow.cpp @@ -134,6 +134,9 @@ bool ScalingWindow::Create( return false; } + // 记录缩放选项 + _options.Log(); + // 提高时钟精度,默认为 15.6ms timeBeginPeriod(1); @@ -142,6 +145,9 @@ bool ScalingWindow::Create( Logger::Get().Error("CalcWndRect 失败"); return false; } + + Logger::Get().Info(fmt::format("缩放窗口边界: {},{},{},{}", + _wndRect.left, _wndRect.top, _wndRect.right, _wndRect.bottom)); if (!_options.IsAllowScalingMaximized()) { if (Win32Utils::GetWindowShowCmd(_hwndSrc) == SW_SHOWMAXIMIZED) { From 85c489a189031a4c4e69f0ee26cfc485d6f9665b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=97=AD?= Date: Mon, 1 Apr 2024 15:33:52 +0800 Subject: [PATCH 151/155] =?UTF-8?q?feat:=20=E8=87=AA=E8=A1=8C=E5=AE=9E?= =?UTF-8?q?=E7=8E=B0=20SourceLocation=EF=BC=8C=E6=B2=A1=E6=9C=89=E5=86=97?= =?UTF-8?q?=E9=95=BF=E7=9A=84=E5=87=BD=E6=95=B0=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Shared/Logger.cpp | 6 ++--- src/Shared/Logger.h | 63 +++++++++++++++++++++++++++++++++---------- 2 files changed, 52 insertions(+), 17 deletions(-) diff --git a/src/Shared/Logger.cpp b/src/Shared/Logger.cpp index d702850a7..74fac01c6 100644 --- a/src/Shared/Logger.cpp +++ b/src/Shared/Logger.cpp @@ -9,7 +9,7 @@ bool Logger::Initialize(spdlog::level::level_enum logLevel, const char* logFileN try { _logger = spdlog::rotating_logger_mt(".", logFileName, logArchiveAboveSize, logMaxArchiveFiles); _logger->set_level(logLevel); - _logger->set_pattern("%Y-%m-%d %H:%M:%S.%e|%l|%s:%!|%v"); + _logger->set_pattern("%Y-%m-%d %H:%M:%S.%e|%l|%s:%#|%!|%v"); _logger->flush_on(spdlog::level::warn); spdlog::flush_every(5s); } catch (const spdlog::spdlog_ex&) { @@ -44,7 +44,7 @@ std::string Logger::_MakeComErrorMsg(std::string_view msg, HRESULT hr) { return fmt::sprintf("%s\n\tHRESULT:0x%X", msg, hr); } -void Logger::_Log(spdlog::level::level_enum logLevel, std::string_view msg, const std::source_location& location) { +void Logger::_Log(spdlog::level::level_enum logLevel, std::string_view msg, const SourceLocation& location) { assert(!msg.empty()); if (logLevel >= spdlog::level::warn) { @@ -57,7 +57,7 @@ void Logger::_Log(spdlog::level::level_enum logLevel, std::string_view msg, cons } _logger->log( - spdlog::source_loc{ location.file_name(), (int)location.line(), location.function_name() }, + spdlog::source_loc{ location.FileName(), (int)location.Line(), location.FunctionName() }, logLevel, msg ); diff --git a/src/Shared/Logger.h b/src/Shared/Logger.h index 313654ec6..c8bf83c39 100644 --- a/src/Shared/Logger.h +++ b/src/Shared/Logger.h @@ -1,7 +1,42 @@ #pragma once -#include #include +struct SourceLocation { + [[nodiscard]] static consteval SourceLocation current( + std::uint_least32_t line = __builtin_LINE(), + const char* file = __builtin_FILE(), + const char* function = __builtin_FUNCTION() + ) noexcept { + return SourceLocation{ line, file, function }; + } + + [[nodiscard]] constexpr SourceLocation() noexcept = default; + + [[nodiscard]] constexpr SourceLocation( + const std::uint_least32_t line, + const char* file, + const char* function + ) noexcept : _line(line), _file(file), _function(function) { + } + + [[nodiscard]] constexpr std::uint_least32_t Line() const noexcept { + return _line; + } + + [[nodiscard]] constexpr const char* FileName() const noexcept { + return _file; + } + + constexpr const char* FunctionName() const noexcept { + return _function; + } + +private: + const std::uint_least32_t _line = 0; + const char* _file = nullptr; + const char* _function = nullptr; +}; + class Logger { public: static Logger& Get() noexcept { @@ -20,51 +55,51 @@ class Logger { _logger->flush(); } - void Info(std::string_view msg, const std::source_location& location = std::source_location::current()) { + void Info(std::string_view msg, const SourceLocation& location = SourceLocation::current()) { _Log(spdlog::level::info, msg, location); } - void Win32Info(std::string_view msg, const std::source_location& location = std::source_location::current()) { + void Win32Info(std::string_view msg, const SourceLocation& location = SourceLocation::current()) { _Log(spdlog::level::info, _MakeWin32ErrorMsg(msg), location); } - void ComInfo(std::string_view msg, HRESULT hr, const std::source_location& location = std::source_location::current()) { + void ComInfo(std::string_view msg, HRESULT hr, const SourceLocation& location = SourceLocation::current()) { _Log(spdlog::level::info, _MakeComErrorMsg(msg, hr), location); } - void Warn(std::string_view msg, const std::source_location& location = std::source_location::current()) { + void Warn(std::string_view msg, const SourceLocation& location = SourceLocation::current()) { _Log(spdlog::level::warn, msg, location); } - void Win32Warn(std::string_view msg, const std::source_location& location = std::source_location::current()) { + void Win32Warn(std::string_view msg, const SourceLocation& location = SourceLocation::current()) { _Log(spdlog::level::warn, _MakeWin32ErrorMsg(msg), location); } - void ComWarn(std::string_view msg, HRESULT hr, const std::source_location& location = std::source_location::current()) { + void ComWarn(std::string_view msg, HRESULT hr, const SourceLocation& location = SourceLocation::current()) { _Log(spdlog::level::warn, _MakeComErrorMsg(msg, hr), location); } - void Error(std::string_view msg, const std::source_location& location = std::source_location::current()) { + void Error(std::string_view msg, const SourceLocation& location = SourceLocation::current()) { _Log(spdlog::level::err, msg, location); } - void Win32Error(std::string_view msg, const std::source_location& location = std::source_location::current()) { + void Win32Error(std::string_view msg, const SourceLocation& location = SourceLocation::current()) { _Log(spdlog::level::err, _MakeWin32ErrorMsg(msg), location); } - void ComError(std::string_view msg, HRESULT hr, const std::source_location& location = std::source_location::current()) { + void ComError(std::string_view msg, HRESULT hr, const SourceLocation& location = SourceLocation::current()) { _Log(spdlog::level::err, _MakeComErrorMsg(msg, hr), location); } - void Critical(std::string_view msg, const std::source_location& location = std::source_location::current()) { + void Critical(std::string_view msg, const SourceLocation& location = SourceLocation::current()) { _Log(spdlog::level::critical, msg, location); } - void Win32Critical(std::string_view msg, const std::source_location& location = std::source_location::current()) { + void Win32Critical(std::string_view msg, const SourceLocation& location = SourceLocation::current()) { _Log(spdlog::level::critical, _MakeWin32ErrorMsg(msg), location); } - void ComCritical(std::string_view msg, HRESULT hr, const std::source_location& location = std::source_location::current()) { + void ComCritical(std::string_view msg, HRESULT hr, const SourceLocation& location = SourceLocation::current()) { _Log(spdlog::level::critical, _MakeComErrorMsg(msg, hr), location); } @@ -73,7 +108,7 @@ class Logger { static std::string _MakeComErrorMsg(std::string_view msg, HRESULT hr); - void _Log(spdlog::level::level_enum logLevel, std::string_view msg, const std::source_location& location); + void _Log(spdlog::level::level_enum logLevel, std::string_view msg, const SourceLocation& location); std::shared_ptr _logger; }; From 72d46607accd294eb7aa3e10f2c50af46729ae58 Mon Sep 17 00:00:00 2001 From: Xu <34770031+Blinue@users.noreply.github.com> Date: Mon, 1 Apr 2024 18:20:00 +0800 Subject: [PATCH 152/155] =?UTF-8?q?chore:=20=E6=B7=BB=E5=8A=A0=E6=B3=A8?= =?UTF-8?q?=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Shared/Logger.cpp | 8 ++++++-- src/Shared/Logger.h | 2 ++ 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/Shared/Logger.cpp b/src/Shared/Logger.cpp index 74fac01c6..355dc2348 100644 --- a/src/Shared/Logger.cpp +++ b/src/Shared/Logger.cpp @@ -4,8 +4,12 @@ #include #include - -bool Logger::Initialize(spdlog::level::level_enum logLevel, const char* logFileName, int logArchiveAboveSize, int logMaxArchiveFiles) noexcept { +bool Logger::Initialize( + spdlog::level::level_enum logLevel, + const char* logFileName, + int logArchiveAboveSize, + int logMaxArchiveFiles +) noexcept { try { _logger = spdlog::rotating_logger_mt(".", logFileName, logArchiveAboveSize, logMaxArchiveFiles); _logger->set_level(logLevel); diff --git a/src/Shared/Logger.h b/src/Shared/Logger.h index c8bf83c39..33d92da1e 100644 --- a/src/Shared/Logger.h +++ b/src/Shared/Logger.h @@ -1,6 +1,8 @@ #pragma once #include +// std::source_location 中的函数名包含整个签名过于冗长,我们只需记录函数名, +// 因此创建自己的 SourceLocation struct SourceLocation { [[nodiscard]] static consteval SourceLocation current( std::uint_least32_t line = __builtin_LINE(), From 98e324fab666e2d4dc0b60e8a38ba6e86993578d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=97=AD?= Date: Wed, 3 Apr 2024 10:38:36 +0800 Subject: [PATCH 153/155] =?UTF-8?q?docs:=20=E6=9B=B4=E6=96=B0=E6=96=87?= =?UTF-8?q?=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/Comparison of capture methods.md | 6 +-- docs/MagpieFX (EN).md | 53 ++++++++----------- docs/MagpieFX.md | 2 +- docs/Performance optimization.md | 7 +-- ...30\345\214\226\345\273\272\350\256\256.md" | 4 +- ...71\345\274\217\345\257\271\346\257\224.md" | 6 +-- 6 files changed, 29 insertions(+), 49 deletions(-) diff --git a/docs/Comparison of capture methods.md b/docs/Comparison of capture methods.md index 52ed2c56a..496df19b7 100644 --- a/docs/Comparison of capture methods.md +++ b/docs/Comparison of capture methods.md @@ -1,4 +1,4 @@ -Magpie provides several capture methods. They have their pros and cons in different scenarios. +Magpie provides several capture methods. They have their pros and cons in different scenarios. For general purposes, it's recommended to use Graphics Capture, as it provides the best compatibility and smoothness. | | Graphics Capture | Desktop Duplication | GDI | DwmSharedSurface | | :---: | :---: | :---: | :---: |:---: | @@ -6,11 +6,9 @@ Magpie provides several capture methods. They have their pros and cons in differ | Supports recording/streaming | No under extreme conditions[1] | No | Yes | Yes | | Support the source window to span multiple screens | No under extreme conditions[1] | No | Yes | Yes | | Ignores DPI virtualization[2] | No | No | Yes| Yes | -| Notes | The most recommended capture method | Requires Win10 v2004, suitable for games with more static frames[3], could capture pop-ups | | Low VRAM usage | +| Notes | The most recommended capture method | Requires Win10 v2004 | | Low VRAM usage | [1]: (1) The source window does not support regular window capture. (2) The operating system is Windows 11. [2]: The system will perform bicubic interpolation upscaling to windows that do not support DPI scaling. The capture methods supporting this options captures the images before such scaling. - -[3]: The Desktop Duplication mode effectively reduces the power consumption if there are many static frames. diff --git a/docs/MagpieFX (EN).md b/docs/MagpieFX (EN).md index d0f404e89..624d447e7 100644 --- a/docs/MagpieFX (EN).md +++ b/docs/MagpieFX (EN).md @@ -2,23 +2,12 @@ MagpieFX is based on DirectX 11 compute shader ``` hlsl //!MAGPIE EFFECT -//!VERSION 3 -//!OUTPUT_WIDTH INPUT_WIDTH * 2 -//!OUTPUT_HEIGHT INPUT_HEIGHT * 2 -// Specify "USE_DYNAMIC" to use GetFrameCount or GetCursorPos. +//!VERSION 4 +// Specify "USE_DYNAMIC" to use GetFrameCount. //!USE_DYNAMIC -// Specifying "GENERIC_DOWNSCALER" indicates that this effect can be used as the "default downscaling effect". -//!GENERIC_DOWNSCALER // Use "SORT_NAME" to specify the name used for sorting, otherwise the files will be sorted by their file names. //!SORT_NAME test1 -// Not specifying "OUTPUT_WIDTH" and "OUTPUT_HEIGHT" indicates that this effect supports outputting to any size. -// You can use some pre-defined constants when calculating texture size. -// INPUT_WIDTH -// INPUT_HEIGHT -// OUTPUT_WIDTH -// OUTPUT_HEIGHT - // Definition of parameters //!PARAMETER @@ -33,13 +22,25 @@ float sharpness; // Definition of textures -// "INPUT" is a special keyword. -// "INPUT" cannot be used as the output of a pass. -// Defining INPUT is optional, but it is recommended to define it explicitly for the sake of semantic completeness. +// "INPUT" and "OUTPUT" are special keywords. +// "INPUT" cannot be used as the output of a pass; "OUTPUT" cannot be used as the input of a pass. +// Defining INPUT/OUTPUT is optional, but it is recommended to define them explicitly for the sake of semantic completeness. +// The size of the OUTPUT represents the output size of this effect. Not specifying it indicates support for output of any size. //!TEXTURE Texture2D INPUT; +//!TEXTURE +//!WIDTH INPUT_WIDTH * 2 +//!HEIGHT INPUT_HEIGHT * 2 +Texture2D OUTPUT; + +// You can use some pre-defined constants to calculate texture size. +// INPUT_WIDTH +// INPUT_HEIGHT +// OUTPUT_WIDTH +// OUTPUT_HEIGHT + // Supported texture formats: // R32G32B32A32_FLOAT // R16G16B16A16_FLOAT @@ -110,11 +111,10 @@ float4 Pass1(float2 pos) { return float4(1, 1, 1, 1); } -// The last pass does not support "OUT". -// If you are using the CS style, you must use "WriteToOutput" to output the result. - //!PASS 2 //!IN INPUT, tex1 +// The output of the last pass must be "OUTPUT". +//!OUT OUTPUT // "BLOACK_SIZE" specifies how large an area is processed in one dispatch. // "BLOACK_SIZE" can have only one dimension, meaning that length and height are specified at the same time. //!BLOCK_SIZE 16, 16 @@ -123,18 +123,13 @@ float4 Pass1(float2 pos) { //!NUM_THREADS 64, 1, 1 void Pass2(uint2 blockStart, uint3 threadId) { - // Render the cursor and then output. - // Available only in the last pass. - WriteToOutput(blockStart, float3(1,1,1)); + // Write to OUPUT + OUTPUT[blockStart] = float4(1,1,1,1); } ``` ### Predefined functions -**void WriteToOutput(uint2 pos, float3 color)**: Only available in the last pass and is used to write results to the output texture. - -**bool CheckViewport(uint2 pos)**: Only available in the last pass and is used to check whether the output coordinates are inside the viewport. - **uint2 GetInputSize()**: Retrieves the size of the input texture. **float2 GetInputPt()**: Retrieves the size of pixel in the input texture. @@ -147,8 +142,6 @@ void Pass2(uint2 blockStart, uint3 threadId) { **uint GetFrameCount()**: Retrieves the total number of frames rendered so far. When using this function, you must specify USE_DYNAMIC. -**uint2 GetCursorPos()**: Retrieves the current cursor position. When using this function, you must specify USE_DYNAMIC. - **uint2 Rmp8x8(uint id)**: Maps the values of 0 to 63 to coordinates in an 8x8 square in swizzle order, which can improve texture cache hit rate. @@ -164,10 +157,6 @@ void Pass2(uint2 blockStart, uint3 threadId) { **MP_DEBUG**: Whether the shader is being compiled in debug mode (when compiling shaders in debug mode, they are not optimized and contain debug information). -**MP_LAST_PASS**: Whether the current pass is the last pass of the effect. - -**MP_LAST_EFFECT**: Whether the effect is the last effect for the current scaling mode (the last effect needs to handle viewport and cursor rendering). - **MP_FP16**: Whether to use half-precision floating-point numbers (specifed by user). **MF、MF1、MF2、...、MF4x4**: Floating-point data types that conform to MP_FP16. When half-precision is not specified, they are aliases for float..., otherwise they are aliases for min16float... diff --git a/docs/MagpieFX.md b/docs/MagpieFX.md index a6c98b067..d14327332 100644 --- a/docs/MagpieFX.md +++ b/docs/MagpieFX.md @@ -23,7 +23,7 @@ float sharpness; // 纹理定义 // INPUT、OUTPUT 是特殊关键字 -// INPUT 不能作为通道的输出,但 OUTPUT 可以作为通道的输入 +// INPUT 不能作为通道的输出,OUTPUT 不能作为通道的输入 // 定义 INPUT 和 OUTPUT 是可选的,但为了保持语义的完整性,建议显式定义 // OUTPUT 的尺寸即为此效果的输出尺寸,不指定则表示支持任意尺寸的输出 diff --git a/docs/Performance optimization.md b/docs/Performance optimization.md index 86bd1bf2c..ad261116d 100644 --- a/docs/Performance optimization.md +++ b/docs/Performance optimization.md @@ -8,8 +8,6 @@ If you cannot run some effects with high computing power requirements (e.g. Anim 1. Change to the variants with lower requirements. For example, Anime4K_Upscale_S is much faster than Anime4K_Upscale_L. CAS is much faster than AdaptiveSharpen. They can effectively improve the smoothness of the effects at the cost of some quality degradation. 2. Change the capture mode. We recommend you to try each of them. -3. Set the frame rate to "unlimited." This will turn off Vsync. It usually increases the frame rate substantially, but may causes the screen to tear. -4. Turn on "allow additional latency to improve performance" when Vsync is on. This will not lead to screen tearing and it also raises the frame rate. However, it will cause an extra 1-frame latency. ## Intermittent lagging @@ -25,6 +23,5 @@ If your graphics card is powerful enough, but you are still experiencing lagging When you need to save electricity or reduce the heat generated, try the following: -1. Change the capture more. The Desktop Duplication capture mode effectively reduces the power consumption if there are a lot of static frames in the game. -2. Change the effects to their variants with lower requirements. -3. Limit the frame rate, which may cause screen tearing. +1. Limit the frame rate. +2. Opt for effects that require lower performance. diff --git "a/docs/\346\200\247\350\203\275\344\274\230\345\214\226\345\273\272\350\256\256.md" "b/docs/\346\200\247\350\203\275\344\274\230\345\214\226\345\273\272\350\256\256.md" index 1874b1a11..72143ac17 100644 --- "a/docs/\346\200\247\350\203\275\344\274\230\345\214\226\345\273\272\350\256\256.md" +++ "b/docs/\346\200\247\350\203\275\344\274\230\345\214\226\345\273\272\350\256\256.md" @@ -8,8 +8,6 @@ 1. 更换为性能需求更低的效果。如 Anime4K_Upscale_S 比 Anime4K_Upscale_L 快的多,CAS 比 AdaptiveSharpen 快的多,它们可以有效提高流畅度,代价是一定程度的画面质量损失。 2. 尝试更换捕获模式。建议你每种模式都尝试一下。 -3. 关闭垂直同步。这通常可以大幅提高帧率,但可能造成画面撕裂。 -4. 开启“垂直同步”并“允许额外的延迟以提高性能”。这个配置不会造成画面撕裂,同时也可以有效提高帧率。缺点是会引入一帧的延迟。 ## 间歇性卡顿 @@ -25,5 +23,5 @@ 在需要节省电量或降低发热时,请尝试下面的操作: -1. 更换捕获模式。如果游戏的静止画面较多,Desktop Duplication 捕获模式可以有效降低功耗。 +1. 限制帧率。 2. 更换为性能需求更低的效果。 diff --git "a/docs/\346\215\225\350\216\267\346\226\271\345\274\217\345\257\271\346\257\224.md" "b/docs/\346\215\225\350\216\267\346\226\271\345\274\217\345\257\271\346\257\224.md" index 6ac25d9c2..fe0be05cd 100644 --- "a/docs/\346\215\225\350\216\267\346\226\271\345\274\217\345\257\271\346\257\224.md" +++ "b/docs/\346\215\225\350\216\267\346\226\271\345\274\217\345\257\271\346\257\224.md" @@ -1,4 +1,4 @@ -Magpie 提供数种捕获方式,根据使用场景,它们各有优劣。 +Magpie 提供数种捕获方式,根据使用场景,它们各有优劣。无特殊需求应使用 Graphics Capture,它提供最好的兼容性和流畅度。 | | Graphics Capture | Desktop Duplication | GDI | DwmSharedSurface | | :---: | :---: | :---: | :---: |:---: | @@ -6,11 +6,9 @@ Magpie 提供数种捕获方式,根据使用场景,它们各有优劣。 | 支持录制/串流 | 特殊情况下不支持[1] | 否 | 是 | 是 | | 支持源窗口跨越多个屏幕 | 特殊情况下不支持[1] | 否 | 是 | 是 | | 无视 DPI 虚拟化[2] | 否 | 否 | 是| 是 | -| 备注 | 首选捕获方式 | 要求 Win10 v2004;适合静止帧较多的游戏[3];可以捕获到弹窗 | | 占用的显存较少 | +| 备注 | 首选捕获方式 | 要求 Win10 v2004 | | 占用的显存较少 | [1]: (1) 源窗口不支持常规的窗口捕获 (2) 操作系统为 Windows 11 [2]: 系统会对不支持 DPI 缩放的窗口进行双三次插值放大,支持此项的捕获方式可以捕获到放大前的图像 - -[3]: 如果窗口的静止帧较多,使用 Desktop Duplication 可以有效降低功耗 From db825166403a0f7e8e6a45b94e0b929b1601e69a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=97=AD?= Date: Wed, 3 Apr 2024 14:57:20 +0800 Subject: [PATCH 154/155] =?UTF-8?q?docs:=20=E6=9B=B4=E6=96=B0=E6=96=87?= =?UTF-8?q?=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/Built-in effects.md | 13 ++++++++----- ...\225\210\346\236\234\344\273\213\347\273\215.md" | 13 ++++++++----- 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/docs/Built-in effects.md b/docs/Built-in effects.md index 501957025..471cd69ef 100644 --- a/docs/Built-in effects.md +++ b/docs/Built-in effects.md @@ -18,7 +18,7 @@ Magpie ships with a handful of effects that can be used in combinations. Most of * Parameter: * Strength: Denoise magnitude -* Anime4K_Restore_S, Anime4K_Restore_M, Anime4K_Restore_L, Anime4K_Restore_VL, Anime4K_Restore_UL, Anime4K_Restore_Soft_S, Anime4K_Restore_Soft_M, Anime4K_Restore_Soft_L, Anime4K_Restore_Soft_VL, Anime4K_Restore_Soft_UL: Algorithms to restore the lines in animations. In increasing order of demand for computing power. The Soft variants are more conservative in sharpening. +* Anime4K_Restore family: Algorithms to restore the lines in animations. In increasing order of demand for computing power. The Soft variants are more conservative in sharpening. * Output size: the same as the input * Anime4K_Thin_HQ: Algorithm to clarify lines in animations provided by Anime4K. @@ -27,7 +27,7 @@ Magpie ships with a handful of effects that can be used in combinations. Most of * Strength: The strength in each iteration. * Iterations: The number of iterations. Decreasing strength and increasing iterations improves the quality of the images, but will lower the processing speed. -* Anime4K_Upscale_S, Anime4K_Upscale_L, Anime4K_Upscale_Denoise_S, Anime4K_Upscale_Denoise_L, and Anime4K_Upscale_GAN_x2_S: Anime-style scaling algorithms provided by Anime4K. The denoise variant includes denoise functionality. The GAN variant, which keeps more details, is still under experiment. +* Anime4K_Upscale family: Anime-style scaling algorithms provided by Anime4K. The denoise variant includes denoise functionality. The GAN variant, which keeps more details, is still under experiment. * Output size: twice that of the input * Bicubic: Interpolation algorithms. The lite variant is fast, but at the cost of quality degradation, Suitable for users will weak graphics cards. @@ -124,6 +124,9 @@ Magpie ships with a handful of effects that can be used in combinations. Most of * Bloom Amount * Filter Kernel Shape +* CuNNy family:Suitable for visual novel-style images. The DS variants offer a subtle denoise effect. Provided by [CuNNy](https://github.com/cunnyplapper/CuNNy) + * Output size: twice that of the input + * Deband * Output size: the same as the input * Parameters @@ -221,7 +224,7 @@ Magpie ships with a handful of effects that can be used in combinations. Most of * Sharpness * Note: Only supports upscaling. -* NNEDI3_nns16_win8x4 and NNEDI3_nns64_win8x6:These shaders originally designed for deinterlacing and are also high-quality interpolation algorithms. NNEDI3_nns64_win8x6 produces higher quality results, but slower. +* NNEDI3 family:These shaders originally designed for deinterlacing and are also high-quality interpolation algorithms. NNEDI3_nns64_win8x6 produces higher quality results, but slower. * Output size: twice that of the input * NVSharpen: Port of NVSharpen that was published along with NIS. @@ -232,10 +235,10 @@ Magpie ships with a handful of effects that can be used in combinations. Most of * Pixellate: Scale with the Pixellate algorithm. Suitable for upscaling pixel arts. * Output size: determined by scale configuration -* RAVU_Lite_R3: Port of ravu-lite-r3 +* RAVU family: Ported from https://github.com/bjin/mpv-prescalers * Output size: twice that of the input -* RAVU_Zoom_R3: Port of ravu-zoom-r3 +* RAVU_Zoom family: Ported from https://github.com/bjin/mpv-prescalers * Output size: determined by scale configuration * Note: Only supports upscaling. diff --git "a/docs/\345\206\205\347\275\256\346\225\210\346\236\234\344\273\213\347\273\215.md" "b/docs/\345\206\205\347\275\256\346\225\210\346\236\234\344\273\213\347\273\215.md" index 7724a5a19..dc4894efe 100644 --- "a/docs/\345\206\205\347\275\256\346\225\210\346\236\234\344\273\213\347\273\215.md" +++ "b/docs/\345\206\205\347\275\256\346\225\210\346\236\234\344\273\213\347\273\215.md" @@ -18,7 +18,7 @@ Magpie 内置了大量效果供组合使用,大部分提供了参数选项以 * 参数 * Strength:降噪强度 -* Anime4K_Restore_S、Anime4K_Restore_M、Anime4K_Restore_L、Anime4K_Restore_VL、Anime4K_Restore_UL、Anime4K_Restore_Soft_S、Anime4K_Restore_Soft_M、Anime4K_Restore_Soft_L、Anime4K_Restore_Soft_VL 和 Anime4K_Restore_Soft_UL:Anime4K 提供的用于还原动漫画面线条的算法,S->M->L->VL->UL 对性能的需求依次提高,Soft 变体效果稍弱 +* Anime4K_Restore 族:Anime4K 提供的用于还原动漫画面线条的算法,S->M->L->VL->UL 对性能的需求依次提高,Soft 变体效果稍弱 * 输出尺寸:和输入相同 * Anime4K_Thin_HQ:Anime4K 提供的用于细化动漫画面线条的算法 @@ -27,7 +27,7 @@ Magpie 内置了大量效果供组合使用,大部分提供了参数选项以 * Strength:每次迭代的强度 * Iterations:迭代次数。降低 Strength 并提高 Iterations 可以提高画面质量,但会降低速度。 -* Anime4K_Upscale_S、Anime4K_Upscale_L、Anime4K_Upscale_VL、Anime4K_Upscale_UL、Anime4K_Upscale_Denoise_S、Anime4K_Upscale_Denoise_L、Anime4K_Upscale_Denoise_VL、Anime4K_Upscale_Denoise_UL 和 Anime4K_Upscale_GAN_x2_S:Anime4K 提供的动画风格图像缩放算法。Denoise 变体包含降噪效果,GAN 变体处于实验阶段,可以保留更多细节。S、L、VL、UL 对性能的要求依次提高 +* Anime4K_Upscale 族:Anime4K 提供的动画风格图像缩放算法。Denoise 变体包含降噪效果,GAN 变体处于实验阶段,可以保留更多细节。S、L、VL、UL 对性能的要求依次提高 * 输出尺寸:输入的两倍 * Bicubic:双立方(双三次)插值算法 @@ -124,6 +124,9 @@ Magpie 内置了大量效果供组合使用,大部分提供了参数选项以 * Bloom Amount * Filter Kernel Shape +* CuNNy 族:适合视觉小说风格图像的缩放,由 [CuNNy](https://github.com/cunnyplapper/CuNNy) 提供。DS 变体有轻微降噪效果 + * 输出尺寸:输入的两倍 + * Deband:去除色带 * 输出尺寸:和输入相同 * 参数 @@ -221,7 +224,7 @@ Magpie 内置了大量效果供组合使用,大部分提供了参数选项以 * Sharpness:锐化强度 * 备注:只支持放大 -* NNEDI3_nns16_win8x4 和 NNEDI3_nns64_win8x6:原本用于去隔行,也是高质量的插值算法。NNEDI3_nns64_win8x6 质量更高,速度更慢 +* NNEDI3 族:原本用于去隔行,也是高质量的插值算法。移植自 https://github.com/bjin/mpv-prescalers * 输出尺寸:输入的两倍 * NVSharpen:随 NIS 发布的 NVSharpen 的移植 @@ -232,10 +235,10 @@ Magpie 内置了大量效果供组合使用,大部分提供了参数选项以 * Pixellate:使用 Pixellate 算法缩放输入。适合放大像素画 * 输出尺寸:取决于缩放选项 -* RAVU_Lite_R3:ravu-lite-r3的移植 +* RAVU 族:移植自 https://github.com/bjin/mpv-prescalers * 输出尺寸:输入的两倍 -* RAVU_Zoom_R3:ravu-zoom-r3的移植 +* RAVU-Zoom 族:移植自 https://github.com/bjin/mpv-prescalers * 输出尺寸:取决于缩放选项 * 备注:只支持放大 From ba421b5a062bb8445e8479c10e10a4bf3929b1cb Mon Sep 17 00:00:00 2001 From: Xu <34770031+Blinue@users.noreply.github.com> Date: Wed, 3 Apr 2024 19:24:43 +0800 Subject: [PATCH 155/155] =?UTF-8?q?=E5=A4=9A=E4=B8=AA=E6=80=A7=E8=83=BD?= =?UTF-8?q?=E4=BC=98=E5=8C=96=20(#871)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * test * perf: 优化流畅度 * chore: 修复编译警告 * test * perf: 简化状态 * perf: 稍微优化 Renderer 的同步性能 * fix: 优化计时器精度 * fix: 优化调试模式下光标行为 * test * chore * perf * fix: 错误处理 --- src/Magpie.Core/CursorManager.cpp | 54 ++-- .../DesktopDuplicationFrameSource.cpp | 248 +++++------------- .../DesktopDuplicationFrameSource.h | 32 +-- .../DwmSharedSurfaceFrameSource.cpp | 36 ++- src/Magpie.Core/DwmSharedSurfaceFrameSource.h | 4 + src/Magpie.Core/FrameSourceBase.cpp | 4 +- src/Magpie.Core/FrameSourceBase.h | 9 +- src/Magpie.Core/GDIFrameSource.h | 4 + .../GraphicsCaptureFrameSource.cpp | 1 - src/Magpie.Core/GraphicsCaptureFrameSource.h | 4 + src/Magpie.Core/Renderer.cpp | 182 ++++++------- src/Magpie.Core/Renderer.h | 7 +- src/Magpie.Core/StepTimer.cpp | 67 +++-- src/Magpie.Core/StepTimer.h | 10 +- 14 files changed, 275 insertions(+), 387 deletions(-) diff --git a/src/Magpie.Core/CursorManager.cpp b/src/Magpie.Core/CursorManager.cpp index c419b598e..d1a6603ed 100644 --- a/src/Magpie.Core/CursorManager.cpp +++ b/src/Magpie.Core/CursorManager.cpp @@ -121,15 +121,11 @@ static void ReliableSetCursorPos(POINT pos) noexcept { } CursorManager::~CursorManager() noexcept { - if (_isCapturedOnOverlay) { - ReleaseCapture(); - } - _ShowSystemCursor(true, true); ClipCursor(nullptr); - if (_isUnderCapture) { + if (_isUnderCapture && !ScalingWindow::Get().Options().IsDebugMode()) { POINT cursorPos; if (!GetCursorPos(&cursorPos)) { Logger::Get().Win32Error("GetCursorPos 失败"); @@ -384,6 +380,7 @@ static HWND WindowFromPoint(HWND hwndScaling, const RECT& scalingWndRect, POINT } void CursorManager::_UpdateCursorClip() noexcept { + const ScalingOptions& options = ScalingWindow::Get().Options(); const Renderer& renderer = ScalingWindow::Get().Renderer(); const RECT& srcRect = renderer.SrcRect(); const RECT& destRect = renderer.DestRect(); @@ -393,30 +390,6 @@ void CursorManager::_UpdateCursorClip() noexcept { // 2. 3D 游戏模式:每帧都限制一次,不退出捕获,不支持多屏幕 // 3. 常规:根据多屏幕限制光标,捕获/取消捕获,支持 UI 和多屏幕 - // 如果前台窗口捕获了光标,应避免在光标移入/移出缩放窗口或叠加层时跳跃。为了解决 - // 前一个问题,此时则将光标限制在前台窗口内,因此不会移出缩放窗口。为了解决后一个 - // 问题,叠加层将不会试图捕获光标。 - GUITHREADINFO info{ .cbSize = sizeof(info) }; - if (GetGUIThreadInfo(NULL, &info)) { - if (info.hwndCapture) { - _isCapturedOnForeground = true; - - // 如果光标不在缩放窗口内不应限制光标 - if (_isUnderCapture) { - ClipCursor(&srcRect); - } - - // 当光标被前台窗口捕获时我们除了限制光标外什么也不做,即光标 - // 可以在缩放窗口上自由移动 - return; - } else { - _isCapturedOnForeground = false; - } - } else { - _isCapturedOnForeground = false; - } - - const ScalingOptions& options = ScalingWindow::Get().Options(); if (options.IsDebugMode()) { if (_isCapturedOnOverlay) { // 光标被叠加层捕获时将光标限制在输出区域内 @@ -440,6 +413,29 @@ void CursorManager::_UpdateCursorClip() noexcept { return; } + // 如果前台窗口捕获了光标,应避免在光标移入/移出缩放窗口或叠加层时跳跃。为了解决 + // 前一个问题,此时则将光标限制在前台窗口内,因此不会移出缩放窗口。为了解决后一个 + // 问题,叠加层将不会试图捕获光标。 + GUITHREADINFO info{ .cbSize = sizeof(info) }; + if (GetGUIThreadInfo(NULL, &info)) { + if (info.hwndCapture) { + _isCapturedOnForeground = true; + + // 如果光标不在缩放窗口内不应限制光标 + if (_isUnderCapture) { + ClipCursor(&srcRect); + } + + // 当光标被前台窗口捕获时我们除了限制光标外什么也不做,即光标 + // 可以在缩放窗口上自由移动 + return; + } else { + _isCapturedOnForeground = false; + } + } else { + _isCapturedOnForeground = false; + } + const HWND hwndScaling = ScalingWindow::Get().Handle(); const RECT scalingRect = ScalingWindow::Get().WndRect(); const HWND hwndSrc = ScalingWindow::Get().HwndSrc(); diff --git a/src/Magpie.Core/DesktopDuplicationFrameSource.cpp b/src/Magpie.Core/DesktopDuplicationFrameSource.cpp index 67c8fdab7..9dbf00863 100644 --- a/src/Magpie.Core/DesktopDuplicationFrameSource.cpp +++ b/src/Magpie.Core/DesktopDuplicationFrameSource.cpp @@ -37,11 +37,6 @@ static winrt::com_ptr FindMonitor(IDXGIAdapter1* adapter, HMONITOR return nullptr; } -DesktopDuplicationFrameSource::~DesktopDuplicationFrameSource() { - _exiting.store(true, std::memory_order_relaxed); - WaitForSingleObject(_hDDPThread, 1000); -} - bool DesktopDuplicationFrameSource::_Initialize() noexcept { // WDA_EXCLUDEFROMCAPTURE 只在 Win10 20H1 及更新版本中可用 if (!Win32Utils::GetOSVersion().Is20H1OrNewer()) { @@ -107,45 +102,6 @@ bool DesktopDuplicationFrameSource::_Initialize() noexcept { return false; } - // 创建共享纹理 - _sharedTex = DirectXHelper::CreateTexture2D( - _deviceResources->GetD3DDevice(), - DXGI_FORMAT_B8G8R8A8_UNORM, - _srcRect.right - _srcRect.left, - _srcRect.bottom - _srcRect.top, - D3D11_BIND_SHADER_RESOURCE, - D3D11_USAGE_DEFAULT, - D3D11_RESOURCE_MISC_SHARED_KEYEDMUTEX - ); - if (!_sharedTex) { - Logger::Get().Error("CreateTexture2D 失败"); - return false; - } - - _sharedTexMutex = _sharedTex.try_as(); - if (!_sharedTexMutex) { - Logger::Get().Error("检索 IDXGIKeyedMutex 失败"); - return false; - } - - winrt::com_ptr sharedDxgiRes = _sharedTex.try_as(); - if (!sharedDxgiRes) { - Logger::Get().Error("检索 IDXGIResource 失败"); - return false; - } - - HANDLE hSharedTex = NULL; - HRESULT hr = sharedDxgiRes->GetSharedHandle(&hSharedTex); - if (FAILED(hr)) { - Logger::Get().Error("GetSharedHandle 失败"); - return false; - } - - if (!_InitializeDdpD3D(hSharedTex)) { - Logger::Get().Error("初始化 D3D 失败"); - return false; - } - winrt::com_ptr output = FindMonitor( _deviceResources->GetGraphicsAdapter(), hMonitor); if (!output) { @@ -153,7 +109,7 @@ bool DesktopDuplicationFrameSource::_Initialize() noexcept { return false; } - hr = output->DuplicateOutput(_ddpD3dDevice.get(), _outputDup.put()); + HRESULT hr = output->DuplicateOutput(_deviceResources->GetD3DDevice(), _outputDup.put()); if (FAILED(hr)) { Logger::Get().ComError("DuplicateOutput 失败", hr); return false; @@ -165,183 +121,99 @@ bool DesktopDuplicationFrameSource::_Initialize() noexcept { return false; } - _backendThreadId = GetCurrentThreadId(); - - _hDDPThread = CreateThread(nullptr, 0, _DDPThreadProc, this, 0, nullptr); - if (!_hDDPThread) { - return false; - } - Logger::Get().Info("DesktopDuplicationFrameSource 初始化完成"); return true; } FrameSourceBase::UpdateState DesktopDuplicationFrameSource::_Update() noexcept { - if (_lastAccessMutexKey == _sharedTextureMutexKey.load(std::memory_order_relaxed)) { - return UpdateState::Waiting; - } - - _lastAccessMutexKey = ++_sharedTextureMutexKey; - - HRESULT hr = _sharedTexMutex->AcquireSync(_lastAccessMutexKey - 1, INFINITE); - if (FAILED(hr)) { - Logger::Get().ComError("AcquireSync 失败", hr); - return UpdateState::Error; - } - - _deviceResources->GetD3DDC()->CopyResource(_output.get(), _sharedTex.get()); - - _sharedTexMutex->ReleaseSync(_lastAccessMutexKey); - - return UpdateState::NewFrame; -} + ID3D11DeviceContext4* d3dDC = _deviceResources->GetD3DDC(); -bool DesktopDuplicationFrameSource::_InitializeDdpD3D(HANDLE hSharedTex) { - UINT createDeviceFlags = D3D11_CREATE_DEVICE_BGRA_SUPPORT; - if (DirectXHelper::IsDebugLayersAvailable()) { - // 在 DEBUG 配置启用调试层 - createDeviceFlags |= D3D11_CREATE_DEVICE_DEBUG; + if (_isFrameAcquired) { + // 根据文档,释放后立刻获取下一帧可以提高性能 + _outputDup->ReleaseFrame(); + _isFrameAcquired = false; } - D3D_FEATURE_LEVEL featureLevels[] = { - D3D_FEATURE_LEVEL_11_1, - D3D_FEATURE_LEVEL_11_0 - }; - UINT nFeatureLevels = ARRAYSIZE(featureLevels); - - // 必须使用和 Renderer 相同的图形适配器。D3D11 不允许在不同显卡间共享纹理。 - HRESULT hr = D3D11CreateDevice( - _deviceResources->GetGraphicsAdapter(), - D3D_DRIVER_TYPE_UNKNOWN, - nullptr, - createDeviceFlags, - featureLevels, - nFeatureLevels, - D3D11_SDK_VERSION, - _ddpD3dDevice.put(), - nullptr, - _ddpD3dDC.put() - ); - - if (FAILED(hr)) { - Logger::Get().ComError("D3D11CreateDevice 失败", hr); - return false; + DXGI_OUTDUPL_FRAME_INFO info; + winrt::com_ptr dxgiRes; + // 等待 1ms + HRESULT hr = _outputDup->AcquireNextFrame(1, &info, dxgiRes.put()); + if (hr == DXGI_ERROR_WAIT_TIMEOUT) { + return UpdateState::Waiting; } - // 获取共享纹理 - hr = _ddpD3dDevice->OpenSharedResource(hSharedTex, IID_PPV_ARGS(_ddpSharedTex.put())); if (FAILED(hr)) { - Logger::Get().ComError("OpenSharedResource 失败", hr); - return false; - } - - _ddpSharedTexMutex = _ddpSharedTex.try_as(); - if (!_ddpSharedTexMutex) { - Logger::Get().Error("检索 IDXGIKeyedMutex 失败"); - return false; + Logger::Get().ComError("AcquireNextFrame 失败", hr); + return UpdateState::Error; } - return true; -} - -DWORD WINAPI DesktopDuplicationFrameSource::_DDPThreadProc(LPVOID lpThreadParameter) { -#ifdef _DEBUG - SetThreadDescription(GetCurrentThread(), L"Magpie DesktopDuplication 线程"); -#endif - - DesktopDuplicationFrameSource& that = *(DesktopDuplicationFrameSource*)lpThreadParameter; + _isFrameAcquired = true; - DXGI_OUTDUPL_FRAME_INFO info{}; - winrt::com_ptr dxgiRes; - SmallVector dupMetaData; + bool noUpdate = true; - while (!that._exiting.load(std::memory_order_relaxed)) { - if (dxgiRes) { - that._outputDup->ReleaseFrame(); - } - HRESULT hr = that._outputDup->AcquireNextFrame(500, &info, dxgiRes.put()); - if (hr == DXGI_ERROR_WAIT_TIMEOUT) { - continue; + // 检索 move rects 和 dirty rects + // 这些区域如果和窗口客户区有重叠则表明画面有变化 + if (info.TotalMetadataBufferSize) { + if (info.TotalMetadataBufferSize > _dupMetaData.size()) { + _dupMetaData.resize(info.TotalMetadataBufferSize); } + uint32_t bufSize = info.TotalMetadataBufferSize; + + // Move rects + hr = _outputDup->GetFrameMoveRects( + bufSize, (DXGI_OUTDUPL_MOVE_RECT*)_dupMetaData.data(), &bufSize); if (FAILED(hr)) { - Logger::Get().ComError("AcquireNextFrame 失败", hr); - continue; + Logger::Get().ComError("GetFrameMoveRects 失败", hr); + return UpdateState::Error; } - bool noUpdate = true; - - // 检索 move rects 和 dirty rects - // 这些区域如果和窗口客户区有重叠则表明画面有变化 - if (info.TotalMetadataBufferSize) { - if (info.TotalMetadataBufferSize > dupMetaData.size()) { - dupMetaData.resize(info.TotalMetadataBufferSize); + uint32_t nRect = bufSize / sizeof(DXGI_OUTDUPL_MOVE_RECT); + for (uint32_t i = 0; i < nRect; ++i) { + const DXGI_OUTDUPL_MOVE_RECT& rect = + ((DXGI_OUTDUPL_MOVE_RECT*)_dupMetaData.data())[i]; + if (Win32Utils::CheckOverlap(_srcClientInMonitor, rect.DestinationRect)) { + noUpdate = false; + break; } + } - UINT bufSize = info.TotalMetadataBufferSize; + if (noUpdate) { + bufSize = info.TotalMetadataBufferSize; - // move rects - hr = that._outputDup->GetFrameMoveRects(bufSize, (DXGI_OUTDUPL_MOVE_RECT*)dupMetaData.data(), &bufSize); + // Dirty rects + hr = _outputDup->GetFrameDirtyRects( + bufSize, (RECT*)_dupMetaData.data(), &bufSize); if (FAILED(hr)) { - Logger::Get().ComError("GetFrameMoveRects 失败", hr); - continue; + Logger::Get().ComError("GetFrameDirtyRects 失败", hr); + return UpdateState::Error; } - UINT nRect = bufSize / sizeof(DXGI_OUTDUPL_MOVE_RECT); - for (UINT i = 0; i < nRect; ++i) { - const DXGI_OUTDUPL_MOVE_RECT& rect = ((DXGI_OUTDUPL_MOVE_RECT*)dupMetaData.data())[i]; - if (Win32Utils::CheckOverlap(that._srcClientInMonitor, rect.DestinationRect)) { + nRect = bufSize / sizeof(RECT); + for (uint32_t i = 0; i < nRect; ++i) { + const RECT& rect = ((RECT*)_dupMetaData.data())[i]; + if (Win32Utils::CheckOverlap(_srcClientInMonitor, rect)) { noUpdate = false; break; } } - - if (noUpdate) { - bufSize = info.TotalMetadataBufferSize; - - // dirty rects - hr = that._outputDup->GetFrameDirtyRects(bufSize, (RECT*)dupMetaData.data(), &bufSize); - if (FAILED(hr)) { - Logger::Get().ComError("GetFrameDirtyRects 失败", hr); - continue; - } - - nRect = bufSize / sizeof(RECT); - for (UINT i = 0; i < nRect; ++i) { - const RECT& rect = ((RECT*)dupMetaData.data())[i]; - if (Win32Utils::CheckOverlap(that._srcClientInMonitor, rect)) { - noUpdate = false; - break; - } - } - } - } - - if (noUpdate) { - continue; - } - - winrt::com_ptr d3dRes = dxgiRes.try_as(); - if (!d3dRes) { - Logger::Get().Error("从 IDXGIResource 检索 ID3D11Resource 失败"); - continue; - } - - const uint64_t key = ++that._sharedTextureMutexKey; - hr = that._ddpSharedTexMutex->AcquireSync(key - 1, INFINITE); - if (FAILED(hr)) { - Logger::Get().ComError("AcquireSync 失败", hr); - continue; } + } - that._ddpD3dDC->CopySubresourceRegion(that._ddpSharedTex.get(), 0, 0, 0, 0, d3dRes.get(), 0, &that._frameInMonitor); - that._ddpSharedTexMutex->ReleaseSync(key); - - // 通知后端线程新帧到达 - PostThreadMessage(that._backendThreadId, WM_NULL, 0, 0); + if (noUpdate) { + return UpdateState::Waiting; + } + + winrt::com_ptr frameTexture = dxgiRes.try_as(); + if (!frameTexture) { + Logger::Get().Error("从 IDXGIResource 检索 ID3D11Resource 失败"); + return UpdateState::Error; } - return 0; + d3dDC->CopySubresourceRegion( + _output.get(), 0, 0, 0, 0, frameTexture.get(), 0, &_frameInMonitor); + + return UpdateState::NewFrame; } } diff --git a/src/Magpie.Core/DesktopDuplicationFrameSource.h b/src/Magpie.Core/DesktopDuplicationFrameSource.h index af72d285c..d230c9128 100644 --- a/src/Magpie.Core/DesktopDuplicationFrameSource.h +++ b/src/Magpie.Core/DesktopDuplicationFrameSource.h @@ -1,16 +1,20 @@ #pragma once #include "FrameSourceBase.h" +#include "Win32Utils.h" +#include "SmallVector.h" namespace Magpie::Core { class DesktopDuplicationFrameSource final : public FrameSourceBase { public: - virtual ~DesktopDuplicationFrameSource(); - bool IsScreenCapture() const noexcept override { return true; } + FrameSourceWaitType WaitType() const noexcept override { + return WaitForFrame; + } + const char* Name() const noexcept override { return "Desktop Duplication"; } @@ -29,32 +33,14 @@ class DesktopDuplicationFrameSource final : public FrameSourceBase { UpdateState _Update() noexcept override; private: - bool _InitializeDdpD3D(HANDLE hSharedTex); - - static DWORD WINAPI _DDPThreadProc(LPVOID lpThreadParameter); - winrt::com_ptr _outputDup; - DWORD _backendThreadId = 0; - HANDLE _hDDPThread = NULL; - std::atomic _exiting = false; - - uint64_t _lastAccessMutexKey = 0; - std::atomic _sharedTextureMutexKey = 0; - - // DDP 线程使用的 D3D 设备 - winrt::com_ptr _ddpD3dDevice; - winrt::com_ptr _ddpD3dDC; - - // 这些均指向同一个纹理 - // 用于在 D3D Device 间同步对该纹理的访问 - winrt::com_ptr _sharedTex; - winrt::com_ptr _sharedTexMutex; - winrt::com_ptr _ddpSharedTex; - winrt::com_ptr _ddpSharedTexMutex; + SmallVector _dupMetaData; RECT _srcClientInMonitor{}; D3D11_BOX _frameInMonitor{}; + + bool _isFrameAcquired = false; }; } diff --git a/src/Magpie.Core/DwmSharedSurfaceFrameSource.cpp b/src/Magpie.Core/DwmSharedSurfaceFrameSource.cpp index f069b661a..3982dbd93 100644 --- a/src/Magpie.Core/DwmSharedSurfaceFrameSource.cpp +++ b/src/Magpie.Core/DwmSharedSurfaceFrameSource.cpp @@ -37,20 +37,34 @@ bool DwmSharedSurfaceFrameSource::_Initialize() noexcept { HWND hwndSrc = ScalingWindow::Get().HwndSrc(); - double a, bx, by; - if (!_GetMapToOriginDPI(hwndSrc, a, bx, by)) { + RECT frameRect; + if (double a, bx, by; _GetMapToOriginDPI(hwndSrc, a, bx, by)) { + Logger::Get().Info(fmt::format("源窗口 DPI 缩放为 {}", 1 / a)); + + frameRect = RECT{ + std::lround(_srcRect.left * a + bx), + std::lround(_srcRect.top * a + by), + std::lround(_srcRect.right * a + bx), + std::lround(_srcRect.bottom * a + by) + }; + } else { Logger::Get().Error("_GetMapToOriginDPI 失败"); - return false; - } - Logger::Get().Info(fmt::format("源窗口 DPI 缩放为 {}", 1 / a)); + // _GetMapToOriginDPI 失败则假设 DPI 缩放为 1 + RECT srcWindowRect; + if (!GetWindowRect(hwndSrc, &srcWindowRect)) { + Logger::Get().Win32Error("GetWindowRect 失败"); + return false; + } - RECT frameRect = { - std::lround(_srcRect.left * a + bx), - std::lround(_srcRect.top * a + by), - std::lround(_srcRect.right * a + bx), - std::lround(_srcRect.bottom * a + by) - }; + frameRect = RECT{ + _srcRect.left - srcWindowRect.left, + _srcRect.top - srcWindowRect.top, + _srcRect.right - srcWindowRect.left, + _srcRect.bottom - srcWindowRect.top + }; + } + if (frameRect.left < 0 || frameRect.top < 0 || frameRect.right < 0 || frameRect.bottom < 0 || frameRect.right - frameRect.left <= 0 || frameRect.bottom - frameRect.top <= 0 diff --git a/src/Magpie.Core/DwmSharedSurfaceFrameSource.h b/src/Magpie.Core/DwmSharedSurfaceFrameSource.h index 34ac926ab..01dae48a3 100644 --- a/src/Magpie.Core/DwmSharedSurfaceFrameSource.h +++ b/src/Magpie.Core/DwmSharedSurfaceFrameSource.h @@ -11,6 +11,10 @@ class DwmSharedSurfaceFrameSource final : public FrameSourceBase { return false; } + FrameSourceWaitType WaitType() const noexcept override { + return NoWait; + } + const char* Name() const noexcept override { return "DwmSharedSurface"; } diff --git a/src/Magpie.Core/FrameSourceBase.cpp b/src/Magpie.Core/FrameSourceBase.cpp index 65ea0c349..80619344d 100644 --- a/src/Magpie.Core/FrameSourceBase.cpp +++ b/src/Magpie.Core/FrameSourceBase.cpp @@ -137,7 +137,7 @@ FrameSourceBase::UpdateState FrameSourceBase::Update() noexcept { if (duplicateFrameDetectionMode == DuplicateFrameDetectionMode::Always) { // 总是检查重复帧 if (_IsDuplicateFrame()) { - return UpdateState::NoChange; + return UpdateState::Waiting; } else { d3dDC->CopyResource(_prevFrame.get(), _output.get()); return UpdateState::NewFrame; @@ -166,7 +166,7 @@ FrameSourceBase::UpdateState FrameSourceBase::Update() noexcept { _isCheckingForDuplicateFrame = true; _framesLeft = INITIAL_CHECK_COUNT; _nextSkipCount = INITIAL_SKIP_COUNT; - return UpdateState::NoChange; + return UpdateState::Waiting; } else { if (_isCheckingForDuplicateFrame || isStatisticsEnabled) { d3dDC->CopyResource(_prevFrame.get(), _output.get()); diff --git a/src/Magpie.Core/FrameSourceBase.h b/src/Magpie.Core/FrameSourceBase.h index 3df4b1998..cc73f522d 100644 --- a/src/Magpie.Core/FrameSourceBase.h +++ b/src/Magpie.Core/FrameSourceBase.h @@ -19,7 +19,6 @@ class FrameSourceBase { enum class UpdateState { NewFrame, - NoChange, Waiting, Error }; @@ -40,6 +39,14 @@ class FrameSourceBase { virtual bool IsScreenCapture() const noexcept = 0; + enum FrameSourceWaitType { + NoWait, + WaitForMessage, + WaitForFrame + }; + + virtual FrameSourceWaitType WaitType() const noexcept = 0; + virtual void OnCursorVisibilityChanged(bool /*isVisible*/, bool /*onDestory*/) noexcept {}; protected: diff --git a/src/Magpie.Core/GDIFrameSource.h b/src/Magpie.Core/GDIFrameSource.h index 9b39ca9aa..c01bae8e5 100644 --- a/src/Magpie.Core/GDIFrameSource.h +++ b/src/Magpie.Core/GDIFrameSource.h @@ -11,6 +11,10 @@ class GDIFrameSource final : public FrameSourceBase { return false; } + FrameSourceWaitType WaitType() const noexcept override { + return NoWait; + } + const char* Name() const noexcept override { return "GDI"; } diff --git a/src/Magpie.Core/GraphicsCaptureFrameSource.cpp b/src/Magpie.Core/GraphicsCaptureFrameSource.cpp index bc0077f07..a632c4baa 100644 --- a/src/Magpie.Core/GraphicsCaptureFrameSource.cpp +++ b/src/Magpie.Core/GraphicsCaptureFrameSource.cpp @@ -118,7 +118,6 @@ FrameSourceBase::UpdateState GraphicsCaptureFrameSource::_Update() noexcept { _deviceResources->GetD3DDC()->CopySubresourceRegion(_output.get(), 0, 0, 0, 0, withFrame.get(), 0, &_frameBox); - frame.Close(); return UpdateState::NewFrame; } diff --git a/src/Magpie.Core/GraphicsCaptureFrameSource.h b/src/Magpie.Core/GraphicsCaptureFrameSource.h index 1a9a7ab6c..c8f19e544 100644 --- a/src/Magpie.Core/GraphicsCaptureFrameSource.h +++ b/src/Magpie.Core/GraphicsCaptureFrameSource.h @@ -15,6 +15,10 @@ class GraphicsCaptureFrameSource final : public FrameSourceBase { return _isScreenCapture; } + FrameSourceWaitType WaitType() const noexcept override { + return WaitForMessage; + } + const char* Name() const noexcept override { return "Graphics Capture"; } diff --git a/src/Magpie.Core/Renderer.cpp b/src/Magpie.Core/Renderer.cpp index 83e938123..ea8a67fe7 100644 --- a/src/Magpie.Core/Renderer.cpp +++ b/src/Magpie.Core/Renderer.cpp @@ -95,24 +95,16 @@ bool Renderer::Initialize() noexcept { } // 等待后端初始化完成 - while (true) { - { - std::scoped_lock lk(_mutex); - if (_sharedTextureHandle) { - if (_sharedTextureHandle == INVALID_HANDLE_VALUE) { - Logger::Get().Error("后端初始化失败"); - return false; - } - break; - } - } - // 将时间片让给后端线程 - Sleep(0); + _sharedTextureHandle.wait(NULL, std::memory_order_relaxed); + const HANDLE sharedTextureHandle = _sharedTextureHandle.load(std::memory_order_acquire); + if (sharedTextureHandle == INVALID_HANDLE_VALUE) { + Logger::Get().Error("后端初始化失败"); + return false; } // 获取共享纹理 HRESULT hr = _frontendResources.GetD3DDevice()->OpenSharedResource( - _sharedTextureHandle, IID_PPV_ARGS(_frontendSharedTexture.put())); + sharedTextureHandle, IID_PPV_ARGS(_frontendSharedTexture.put())); if (FAILED(hr)) { Logger::Get().ComError("OpenSharedResource 失败", hr); return false; @@ -169,7 +161,9 @@ static bool CheckMultiplaneOverlaySupport(IDXGISwapChain4* swapChain) noexcept { void Renderer::OnCursorVisibilityChanged(bool isVisible, bool onDestory) { _backendThreadDispatcher.TryEnqueue([this, isVisible, onDestory]() { - _frameSource->OnCursorVisibilityChanged(isVisible, onDestory); + if (_frameSource) { + _frameSource->OnCursorVisibilityChanged(isVisible, onDestory); + } }); } @@ -188,6 +182,10 @@ void Renderer::MessageHandler(UINT msg, WPARAM wParam, LPARAM lParam) noexcept { bool Renderer::_CreateSwapChain() noexcept { ID3D11Device5* d3dDevice = _frontendResources.GetD3DDevice(); + // 为了降低延迟,两个垂直同步之间允许渲染 BUFFER_COUNT - 1 帧 + // 如果这个值太小,用户移动光标可能造成画面卡顿 + static constexpr uint32_t BUFFER_COUNT = 4; + DXGI_SWAP_CHAIN_DESC1 sd{}; const RECT& scalingWndRect = ScalingWindow::Get().WndRect(); sd.Width = scalingWndRect.right - scalingWndRect.left; @@ -197,8 +195,7 @@ bool Renderer::_CreateSwapChain() noexcept { sd.SampleDesc.Count = 1; sd.Scaling = DXGI_SCALING_NONE; sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; - // 为了降低延迟,两个垂直同步之间允许渲染 3 帧 - sd.BufferCount = 4; + sd.BufferCount = BUFFER_COUNT; // 渲染每帧之前都会清空后缓冲区,因此无需 DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL sd.SwapEffect = DXGI_SWAP_EFFECT_FLIP_DISCARD; // 只要显卡支持始终启用 DXGI_SWAP_CHAIN_FLAG_ALLOW_TEARING 以支持可变刷新率 @@ -225,8 +222,8 @@ bool Renderer::_CreateSwapChain() noexcept { return false; } - // 允许提前渲染 3 帧 - _swapChain->SetMaximumFrameLatency(3); + // 允许提前渲染 BUFFER_COUNT - 1 帧 + _swapChain->SetMaximumFrameLatency(BUFFER_COUNT - 1); _frameLatencyWaitableObject.reset(_swapChain->GetFrameLatencyWaitableObject()); if (!_frameLatencyWaitableObject) { @@ -281,6 +278,7 @@ void Renderer::_FrontendRender() noexcept { _lastAccessMutexKey = ++_sharedTextureMutexKey; HRESULT hr = _frontendSharedTextureMutex->AcquireSync(_lastAccessMutexKey - 1, INFINITE); if (FAILED(hr)) { + Logger::Get().ComError("AcquireSync 失败", hr); return; } @@ -334,7 +332,7 @@ bool Renderer::Render() noexcept { const uint32_t fps = _stepTimer.FPS(); // 有新帧或光标改变则渲染新的帧 - if (_lastAccessMutexKey == _sharedTextureMutexKey) { + if (_lastAccessMutexKey == _sharedTextureMutexKey.load(std::memory_order_relaxed)) { if (_lastAccessMutexKey == 0) { // 第一帧尚未完成 return false; @@ -585,7 +583,7 @@ ID3D11Texture2D* Renderer::_BuildEffects() noexcept { // 初始化所有效果共用的动态常量缓冲区 for (uint32_t i = 0; i < effectDescs.size(); ++i) { - if(effectDescs[i].flags & EffectFlags::UseDynamic) { + if (effectDescs[i].flags & EffectFlags::UseDynamic) { _firstDynamicEffectIdx = i; break; } @@ -635,7 +633,7 @@ HANDLE Renderer::_CreateSharedTexture(ID3D11Texture2D* effectsOutput) noexcept { HANDLE sharedHandle = NULL; HRESULT hr = sharedDxgiRes->GetSharedHandle(&sharedHandle); if (FAILED(hr)) { - Logger::Get().Error("GetSharedHandle 失败"); + Logger::Get().ComError("GetSharedHandle 失败", hr); return NULL; } @@ -653,10 +651,8 @@ void Renderer::_BackendThreadProc() noexcept { if (!outputTexture) { _frameSource.reset(); // 通知前端初始化失败 - { - std::scoped_lock lk(_mutex); - _sharedTextureHandle = INVALID_HANDLE_VALUE; - } + _sharedTextureHandle.store(INVALID_HANDLE_VALUE, std::memory_order_release); + _sharedTextureHandle.notify_one(); // 即使失败也要创建消息循环,否则前端线程将一直等待 MSG msg; @@ -666,11 +662,7 @@ void Renderer::_BackendThreadProc() noexcept { return; } - enum { - WaitForStepTimer, - WaitForFrameSource, - DuplicateFrame - } renderState = WaitForStepTimer; + bool waitingForStepTimer = true; MSG msg; while (true) { @@ -684,36 +676,38 @@ void Renderer::_BackendThreadProc() noexcept { DispatchMessage(&msg); } - if (renderState != WaitForFrameSource) { - // 实际上向 StepTimer 汇报重复帧有一帧的滞后,不过无伤大雅 - if (!_stepTimer.NewFrame(renderState == DuplicateFrame)) { + if (waitingForStepTimer) { + if (!_stepTimer.WaitForNextFrame()) { + _stepTimer.UpdateFPS(false); continue; } - renderState = WaitForFrameSource; + waitingForStepTimer = false; } - switch (_frameSource->Update()) { + const FrameSourceBase::UpdateState state = _frameSource->Update(); + _stepTimer.UpdateFPS(state == FrameSourceBase::UpdateState::NewFrame); + + switch (state) { case FrameSourceBase::UpdateState::NewFrame: - _BackendRender(outputTexture, false); - renderState = WaitForStepTimer; - break; - case FrameSourceBase::UpdateState::NoChange: - // 源窗口内容不变,也没有动态效果则跳过渲染 - if (_dynamicCB) { - _BackendRender(outputTexture, true); - renderState = WaitForStepTimer; - } else { - renderState = DuplicateFrame; - } + { + _BackendRender(outputTexture); + waitingForStepTimer = true; break; + } case FrameSourceBase::UpdateState::Waiting: - // 等待新消息 - WaitMessage(); + { + if (_frameSource->WaitType() == FrameSourceBase::WaitForMessage) { + // 等待新消息 + WaitMessage(); + } break; + } default: - renderState = WaitForStepTimer; + { + waitingForStepTimer = true; break; } + } } } @@ -737,21 +731,34 @@ ID3D11Texture2D* Renderer::_InitBackend() noexcept { _backendThreadDispatcher = dqc.DispatcherQueue(); } + if (!_backendResources.Initialize()) { + return nullptr; + } + + ID3D11Device5* d3dDevice = _backendResources.GetD3DDevice(); + _backendDescriptorStore.Initialize(d3dDevice); + + if (!_InitFrameSource()) { + return nullptr; + } + { std::optional frameRateLimit; - // 渲染帧率最大为屏幕刷新率,这是某些捕获方法的要求,也可以提高 Graphics Capture 的流畅度 - const HWND hwndSrc = ScalingWindow::Get().HwndSrc(); - if (HMONITOR hMon = MonitorFromWindow(hwndSrc, MONITOR_DEFAULTTONEAREST)) { - MONITORINFOEX mi{ sizeof(MONITORINFOEX) }; - GetMonitorInfo(hMon, &mi); - - DEVMODE dm{}; - dm.dmSize = sizeof(DEVMODE); - EnumDisplaySettings(mi.szDevice, ENUM_CURRENT_SETTINGS, &dm); - - if (dm.dmDisplayFrequency > 0) { - Logger::Get().Info(fmt::format("屏幕刷新率:{}", dm.dmDisplayFrequency)); - frameRateLimit = (float)dm.dmDisplayFrequency; + if (_frameSource->WaitType() == FrameSourceBase::NoWait) { + // 某些捕获方式不会限制捕获帧率,因此将捕获帧率限制为屏幕刷新率 + const HWND hwndSrc = ScalingWindow::Get().HwndSrc(); + if (HMONITOR hMon = MonitorFromWindow(hwndSrc, MONITOR_DEFAULTTONEAREST)) { + MONITORINFOEX mi{ sizeof(MONITORINFOEX) }; + GetMonitorInfo(hMon, &mi); + + DEVMODE dm{}; + dm.dmSize = sizeof(DEVMODE); + EnumDisplaySettings(mi.szDevice, ENUM_CURRENT_SETTINGS, &dm); + + if (dm.dmDisplayFrequency > 0) { + Logger::Get().Info(fmt::format("屏幕刷新率:{}", dm.dmDisplayFrequency)); + frameRateLimit = float(dm.dmDisplayFrequency); + } } } @@ -765,17 +772,6 @@ ID3D11Texture2D* Renderer::_InitBackend() noexcept { _stepTimer.Initialize(frameRateLimit); } - if (!_backendResources.Initialize()) { - return nullptr; - } - - ID3D11Device5* d3dDevice = _backendResources.GetD3DDevice(); - _backendDescriptorStore.Initialize(d3dDevice); - - if (!_InitFrameSource()) { - return nullptr; - } - ID3D11Texture2D* outputTexture = _BuildEffects(); if (!outputTexture) { return nullptr; @@ -799,17 +795,15 @@ ID3D11Texture2D* Renderer::_InitBackend() noexcept { Logger::Get().Win32Error("_CreateSharedTexture 失败"); return nullptr; } - - { - std::scoped_lock lk(_mutex); - _sharedTextureHandle = sharedHandle; - _srcRect = _frameSource->SrcRect(); - } + + _srcRect = _frameSource->SrcRect(); + _sharedTextureHandle.store(sharedHandle, std::memory_order_release); + _sharedTextureHandle.notify_one(); return outputTexture; } -void Renderer::_BackendRender(ID3D11Texture2D* effectsOutput, bool noChange) noexcept { +void Renderer::_BackendRender(ID3D11Texture2D* effectsOutput) noexcept { ID3D11DeviceContext4* d3dDC = _backendResources.GetD3DDC(); d3dDC->ClearState(); @@ -820,32 +814,21 @@ void Renderer::_BackendRender(ID3D11Texture2D* effectsOutput, bool noChange) noe _effectsProfiler.OnBeginEffects(d3dDC); - if (noChange) { - // 源窗口内容不变则从第一个动态效果开始渲染 - for (uint32_t i = 0; i < _effectDrawers.size(); ++i) { - if (i >= _firstDynamicEffectIdx) { - _effectDrawers[i].Draw(_effectsProfiler); - } else { - uint32_t passCount = (uint32_t)_effectInfos[i].passNames.size(); - for (uint32_t j = 0; j < passCount; ++j) { - _effectsProfiler.OnEndPass(d3dDC); - } - } - } - } else { - for (const EffectDrawer& effectDrawer : _effectDrawers) { - effectDrawer.Draw(_effectsProfiler); - } + for (const EffectDrawer& effectDrawer : _effectDrawers) { + effectDrawer.Draw(_effectsProfiler); } _effectsProfiler.OnEndEffects(d3dDC); HRESULT hr = d3dDC->Signal(_d3dFence.get(), ++_fenceValue); if (FAILED(hr)) { + Logger::Get().ComError("Signal 失败", hr); return; } + hr = _d3dFence->SetEventOnCompletion(_fenceValue, _fenceEvent.get()); if (FAILED(hr)) { + Logger::Get().ComError("SetEventOnCompletion 失败", hr); return; } @@ -854,13 +837,14 @@ void Renderer::_BackendRender(ID3D11Texture2D* effectsOutput, bool noChange) noe // 等待渲染完成 WaitForSingleObject(_fenceEvent.get(), INFINITE); - // 渲染完成后查询效果的渲染时间 + // 查询效果的渲染时间 _effectsProfiler.QueryTimings(d3dDC); - // 渲染完成后再更新 _sharedTextureMutexKey,否则前端必须等待,会大幅降低帧率 + // 渲染完成后再更新 _sharedTextureMutexKey,否则前端必须等待,降低光标流畅度 const uint64_t key = ++_sharedTextureMutexKey; hr = _backendSharedTextureMutex->AcquireSync(key - 1, INFINITE); if (FAILED(hr)) { + Logger::Get().ComError("AcquireSync 失败", hr); return; } diff --git a/src/Magpie.Core/Renderer.h b/src/Magpie.Core/Renderer.h index 4f757de3e..755b8dafc 100644 --- a/src/Magpie.Core/Renderer.h +++ b/src/Magpie.Core/Renderer.h @@ -67,7 +67,7 @@ class Renderer { HANDLE _CreateSharedTexture(ID3D11Texture2D* effectsOutput) noexcept; - void _BackendRender(ID3D11Texture2D* effectsOutput, bool noChange) noexcept; + void _BackendRender(ID3D11Texture2D* effectsOutput) noexcept; bool _UpdateDynamicConstants() const noexcept; @@ -121,10 +121,9 @@ class Renderer { std::atomic _sharedTextureMutexKey = 0; // INVALID_HANDLE_VALUE 表示后端初始化失败 - HANDLE _sharedTextureHandle = NULL; + std::atomic _sharedTextureHandle{ NULL }; + // 初始化时由 _sharedTextureHandle 同步 RECT _srcRect{}; - // 用于在初始化时同步对 _sharedTextureHandle 和 _srcRect 的访问 - Win32Utils::SRWMutex _mutex; // 供游戏内叠加层使用 // 由于要跨线程访问,初始化之后不能更改 diff --git a/src/Magpie.Core/StepTimer.cpp b/src/Magpie.Core/StepTimer.cpp index dfc955a71..b135bf36d 100644 --- a/src/Magpie.Core/StepTimer.cpp +++ b/src/Magpie.Core/StepTimer.cpp @@ -13,43 +13,62 @@ void StepTimer::Initialize(std::optional maxFrameRate) noexcept { } } -bool StepTimer::NewFrame(bool isDupFrame) noexcept { - const auto now = high_resolution_clock::now(); +bool StepTimer::WaitForNextFrame() noexcept { + if (!_minInterval) { + return true; + } + + const time_point now = steady_clock::now(); const nanoseconds delta = now - _lastFrameTime; + if (delta >= *_minInterval) { + _lastFrameTime = now - delta % *_minInterval; + return true; + } + + const nanoseconds rest = *_minInterval - delta; + if (rest > 1ms) { + // Sleep 精度太低,我们使用 WaitableTimer 睡眠。负值表示相对时间 + LARGE_INTEGER liDueTime{ + .QuadPart = (rest - 1ms).count() / -100 + }; + SetWaitableTimerEx(_hTimer.get(), &liDueTime, 0, NULL, NULL, 0, 0); + WaitForSingleObject(_hTimer.get(), INFINITE); + } else { + // 剩余时间在 1ms 以内则“忙等待” + Sleep(0); + } - if (_minInterval && delta < *_minInterval) { - if (*_minInterval - delta > 1ms) { - // Sleep 精度太低,我们使用 WaitableTimer 睡眠。每次只睡眠 1ms,长时间睡眠会使精度下降 - // 负值表示相对时间 - LARGE_INTEGER liDueTime{ - .QuadPart = -10000 - }; - SetWaitableTimerEx(_hTimer.get(), &liDueTime, 0, NULL, NULL, 0, 0); - WaitForSingleObject(_hTimer.get(), INFINITE); - } else { - // 剩余时间在 1ms 以内则“忙等待” - Sleep(0); + return false; +} + +void StepTimer::UpdateFPS(bool newFrame) noexcept { + if (_lastSecondTime == time_point{}) { + // 第一帧 + if (!newFrame) { + // 在第一帧前不更新 FPS + return; } - return false; + _lastSecondTime = steady_clock::now(); + _framesPerSecond.store(1, std::memory_order_relaxed); + return; } - _lastFrameTime = _minInterval ? now - delta % *_minInterval : now; - - // 更新当前帧率,不计重复帧 - if (!isDupFrame) { + if (newFrame) { + // 更新帧数 ++_framesThisSecond; ++_frameCount; } - _fpsCounter += delta; - if (_fpsCounter >= 1s) { + const time_point now = steady_clock::now(); + const nanoseconds delta = now - _lastSecondTime; + if (delta >= 1s) { + _lastSecondTime = now - delta % 1s; + _framesPerSecond.store(_framesThisSecond, std::memory_order_relaxed); _framesThisSecond = 0; - _fpsCounter %= 1s; } - - return true; + } } diff --git a/src/Magpie.Core/StepTimer.h b/src/Magpie.Core/StepTimer.h index 45b226690..a53c52eb3 100644 --- a/src/Magpie.Core/StepTimer.h +++ b/src/Magpie.Core/StepTimer.h @@ -12,7 +12,9 @@ class StepTimer { void Initialize(std::optional maxFrameRate) noexcept; - bool NewFrame(bool isDupFrame) noexcept; + bool WaitForNextFrame() noexcept; + + void UpdateFPS(bool newFrame) noexcept; uint32_t FrameCount() const noexcept { return _frameCount; @@ -25,16 +27,14 @@ class StepTimer { private: std::optional _minInterval; + Win32Utils::ScopedHandle _hTimer; std::chrono::time_point _lastFrameTime; + std::chrono::time_point _lastSecondTime; uint32_t _frameCount = 0; std::atomic _framesPerSecond = 0; uint32_t _framesThisSecond = 0; - std::chrono::nanoseconds _fpsCounter{}; - - Win32Utils::ScopedHandle _hTimer; - }; }

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że!iFX#(Va%xECraHImf?q~&YtmAip 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